feat: add Behavior settings page for global AGENTS.md (#1079)

* feat: add Behavior settings page for global AGENTS.md

- Add new 'Behavior' settings page to manage global system prompt
- Sync global behavior prompt to ~/.config/opencode/AGENTS.md
- Add GET/PUT /api/behavior/agents-md endpoints with 1MB size limit
- Add AbortController guards and parallel fetches in BehaviorPage
- Add i18n translations for en, es, ko, pt-BR, uk, zh-CN
- Add globalBehaviorPrompt to DesktopSettings type and sanitizer
- Add /api/behavior to express.json() body-parser whitelist
- Ensure atomic save: AGENTS.md written before settings updated

* fix: address Greptile review feedback

- Rename misleading 'trimmed' variable to 'value' in settings-helpers.js
- Add Content-Length guard for /api/behavior before 50mb JSON parser
- Use express.json({ limit: '1mb' }) for behavior endpoints
- Add actual translations for es, ko, pt-BR, uk, zh-CN locales

* fix(vscode): support behavior settings endpoint

* fix(behavior): wait for settings persistence

* fix(behavior): end agents file with newline

* fix(behavior): avoid duplicate textarea resize handles

* fix(behavior): clarify global rules copy

* fix(behavior): move rules note into tooltip

---------

Co-authored-by: Bohdan Triapitsyn <artmore@protonmail.com>
This commit is contained in:
Shyamalan Kannan
2026-05-01 00:39:55 +03:00
committed by GitHub
co-authored by Bohdan Triapitsyn
parent d35ff8a2db
commit bcbf34b1d1
15 changed files with 361 additions and 1 deletions
+3
View File
@@ -158,6 +158,9 @@ export type DesktopSettings = {
skillCatalogs?: SkillCatalogConfig[];
// Opt-in to send anonymous usage reports for update checks (default: true)
reportUsage?: boolean;
// Global behavior prompt — synced to ~/.config/opencode/AGENTS.md
globalBehaviorPrompt?: string;
};
type TauriGlobal = {
@@ -337,6 +337,14 @@ export const settingsDict = {
'settings.agents.page.permissions.addCustomRule': 'Add Custom Rule',
'settings.agents.page.permissions.permissionPlaceholder': 'Permission...',
'settings.agents.page.permissions.patternPlaceholder': 'Pattern (e.g. *)',
'settings.page.behavior.title': 'Behavior',
'settings.behavior.page.title': 'Behavior',
'settings.behavior.page.warning.title': 'Global rules are combined with project rules',
'settings.behavior.page.warning.description': 'Changes made here update {path}. OpenCode also includes any project-level AGENTS.md rules when they exist.',
'settings.behavior.page.section.systemPrompt': 'Global AGENTS.md',
'settings.behavior.page.field.systemPromptPlaceholder': 'You are a helpful AI assistant...\n\nUse this space to define absolute rules for how the AI should behave across all sessions and providers.',
'settings.behavior.page.toast.saved': 'Behavior saved successfully',
'settings.behavior.page.toast.saveFailed': 'Failed to save behavior',
'settings.commands.sidebar.title': 'Commands',
'settings.commands.sidebar.total': 'Total {count}',
'settings.commands.sidebar.empty.title': 'No commands configured',
@@ -337,6 +337,14 @@ export const settingsDict = {
"settings.agents.page.permissions.addCustomRule": "Añadir regla personalizada",
"settings.agents.page.permissions.permissionPlaceholder": "Permiso...",
"settings.agents.page.permissions.patternPlaceholder": "Patrón (ej. *)",
"settings.page.behavior.title": "Comportamiento",
"settings.behavior.page.title": "Comportamiento",
"settings.behavior.page.warning.title": "Las reglas globales se combinan con las reglas del proyecto",
"settings.behavior.page.warning.description": "Los cambios realizados aquí actualizan {path}. OpenCode también incluye cualquier AGENTS.md a nivel de proyecto cuando existe.",
"settings.behavior.page.section.systemPrompt": "AGENTS.md global",
"settings.behavior.page.field.systemPromptPlaceholder": "Eres un asistente de IA útil...\n\nUsa este espacio para definir reglas absolutas sobre cómo la IA debe comportarse en todas las sesiones y proveedores.",
"settings.behavior.page.toast.saved": "Comportamiento guardado correctamente",
"settings.behavior.page.toast.saveFailed": "Error al guardar el comportamiento",
"settings.commands.sidebar.title": "Comandos",
"settings.commands.sidebar.total": "Total {count}",
"settings.commands.sidebar.empty.title": "No hay comandos configurados",
@@ -337,6 +337,14 @@ export const settingsDict = {
'settings.agents.page.permissions.addCustomRule': '사용자 정의 규칙 추가',
'settings.agents.page.permissions.permissionPlaceholder': '권한...',
'settings.agents.page.permissions.patternPlaceholder': '패턴(예: *)',
'settings.page.behavior.title': '동작',
'settings.behavior.page.title': '동작',
'settings.behavior.page.warning.title': '전역 규칙은 프로젝트 규칙과 함께 사용됩니다',
'settings.behavior.page.warning.description': '여기에서 변경한 내용은 {path}를 업데이트합니다. 프로젝트 수준의 AGENTS.md가 있으면 OpenCode도 함께 포함합니다.',
'settings.behavior.page.section.systemPrompt': '전역 AGENTS.md',
'settings.behavior.page.field.systemPromptPlaceholder': '당신은 유용한 AI 어시스턴트입니다...\n\n모든 세션과 공급자에서 AI가 어떻게 행동해야 하는지에 대한 절대적인 규칙을 정의할 수 있습니다.',
'settings.behavior.page.toast.saved': '동작이 성공적으로 저장되었습니다',
'settings.behavior.page.toast.saveFailed': '동작 저장에 실패했습니다',
'settings.commands.sidebar.title': '명령어',
'settings.commands.sidebar.total': '총 {count}개',
'settings.commands.sidebar.empty.title': '설정된 명령어가 없습니다',
@@ -337,6 +337,14 @@ export const settingsDict = {
"settings.agents.page.permissions.addCustomRule": "Adicionar regra personalizada",
"settings.agents.page.permissions.permissionPlaceholder": "Permissão...",
"settings.agents.page.permissions.patternPlaceholder": "Padrão (ex.: *)",
"settings.page.behavior.title": "Comportamento",
"settings.behavior.page.title": "Comportamento",
"settings.behavior.page.warning.title": "Regras globais são combinadas com regras do projeto",
"settings.behavior.page.warning.description": "As alterações feitas aqui atualizam {path}. O OpenCode também inclui qualquer AGENTS.md a nível de projeto quando existir.",
"settings.behavior.page.section.systemPrompt": "AGENTS.md global",
"settings.behavior.page.field.systemPromptPlaceholder": "Você é um assistente de IA útil...\n\nUse este espaço para definir regras absolutas sobre como a IA deve se comportar em todas as sessões e provedores.",
"settings.behavior.page.toast.saved": "Comportamento salvo com sucesso",
"settings.behavior.page.toast.saveFailed": "Falha ao salvar o comportamento",
"settings.commands.sidebar.title": "Comandos",
"settings.commands.sidebar.total": "Total {count}",
"settings.commands.sidebar.empty.title": "Não há comandos configurados",
@@ -337,6 +337,14 @@ export const settingsDict = {
"settings.agents.page.permissions.addCustomRule": "Додати спеціальне правило",
"settings.agents.page.permissions.permissionPlaceholder": "Дозвіл...",
"settings.agents.page.permissions.patternPlaceholder": "Шаблон (наприклад, *)",
"settings.page.behavior.title": "Поведінка",
"settings.behavior.page.title": "Поведінка",
"settings.behavior.page.warning.title": "Глобальні правила поєднуються з правилами проєкту",
"settings.behavior.page.warning.description": "Зміни тут оновлюють {path}. OpenCode також додає правила з AGENTS.md на рівні проєкту, якщо вони існують.",
"settings.behavior.page.section.systemPrompt": "Глобальний AGENTS.md",
"settings.behavior.page.field.systemPromptPlaceholder": "Ви — корисний AI-асистент...\n\nВикористовуйте цей простір для визначення абсолютних правил поведінки AI для всіх сесій та провайдерів.",
"settings.behavior.page.toast.saved": "Поведінку збережено",
"settings.behavior.page.toast.saveFailed": "Не вдалося зберегти поведінку",
"settings.commands.sidebar.title": "Команди",
"settings.commands.sidebar.total": "Усього {count}",
"settings.commands.sidebar.empty.title": "Команди не налаштовано",
@@ -337,6 +337,14 @@ export const settingsDict = {
'settings.agents.page.permissions.addCustomRule': '添加自定义规则',
'settings.agents.page.permissions.permissionPlaceholder': '权限...',
'settings.agents.page.permissions.patternPlaceholder': '模式(例如 *',
'settings.page.behavior.title': '行为',
'settings.behavior.page.title': '行为',
'settings.behavior.page.warning.title': '全局规则会与项目规则合并使用',
'settings.behavior.page.warning.description': '此处所做的更改会更新 {path}。当项目级 AGENTS.md 存在时,OpenCode 也会包含它。',
'settings.behavior.page.section.systemPrompt': '全局 AGENTS.md',
'settings.behavior.page.field.systemPromptPlaceholder': '你是一个有帮助的 AI 助手...\n\n使用此空间定义 AI 在所有会话和提供商中的绝对行为规则。',
'settings.behavior.page.toast.saved': '行为保存成功',
'settings.behavior.page.toast.saveFailed': '行为保存失败',
'settings.commands.sidebar.title': '命令',
'settings.commands.sidebar.total': '总计 {count}',
'settings.commands.sidebar.empty.title': '未配置命令',
+8
View File
@@ -7,6 +7,7 @@ export type SettingsPageSlug =
| 'providers'
| 'usage'
| 'agents'
| 'behavior'
| 'commands'
| 'mcp'
| 'skills.installed'
@@ -103,6 +104,13 @@ export const SETTINGS_PAGE_METADATA: readonly SettingsPageMeta[] = [
kind: 'split',
keywords: ['agent', 'agents', 'prompts', 'tools', 'permissions'],
},
{
slug: 'behavior',
title: 'Behavior',
group: 'opencode',
kind: 'single',
keywords: ['behavior', 'agents.md', 'system prompt', 'global rules', 'instructions', 'override'],
},
{
slug: 'commands',
title: 'Commands',