|
|
@@ -1,6 +1,6 @@
|
|
|
# Project-local Customization
|
|
|
|
|
|
-This document describes how to configure and customize oh-my-opencode-slim on a per-project (repository-specific) basis. Project-local customization allows teams and repositories to define custom agents, override systemic prompts, restrict skills, and orchestrate MCP configurations without polluting global user configurations.
|
|
|
+This document describes how to configure and customize oh-my-opencode-slim on a per-project (repository-specific) basis. Project-local customization lets teams and repositories define custom agents, override systemic prompts, restrict skills, and set MCP configurations without affecting global user configurations.
|
|
|
|
|
|
## Security & Trust Boundary Warning
|
|
|
|
|
|
@@ -16,8 +16,8 @@ This document describes how to configure and customize oh-my-opencode-slim on a
|
|
|
|---|---|---|
|
|
|
| **Configuration file** | `.opencode/oh-my-opencode-slim.json[c]` | Project-level configuration file that overrides global user settings, merging presets, agent profiles, and multiplexer integration. |
|
|
|
| **Custom agents** | `agents` configuration block | Define new specialized agents by keying them under `agents.<custom-name>` with required `model`, custom system `prompt`, and optional routing guidance. |
|
|
|
-| **Built-in prompt overrides** | `.opencode/oh-my-opencode-slim/<agent>.md` | Completely override the built-in system prompt for any agent (e.g. `oracle.md`, `explorer.md`, `orchestrator.md`, or custom agents). |
|
|
|
-| **Append prompts** | `.opencode/oh-my-opencode-slim/<agent>_append.md` | Append additional rules or guidelines to the existing base (inline or default built-in) prompt without overriding it completely. |
|
|
|
+| **Built-in prompt overrides** | `.opencode/oh-my-opencode-slim/<agent>.md` | Override the built-in system prompt for any agent (e.g. `oracle.md`, `explorer.md`, `orchestrator.md`, or custom agents). Acts as the default when no inline `prompt` is set in config. |
|
|
|
+| **Append prompts** | `.opencode/oh-my-opencode-slim/<agent>_append.md` | Append additional rules or guidelines to the existing base (inline, file, or default built-in) prompt without overriding it completely. |
|
|
|
| **Per-agent skills** | `agents.<agent>.skills` | Explicitly restrict or authorize specific local codebase skills/scripts that this agent is allowed to execute. |
|
|
|
| **Per-agent MCPs** | `agents.<agent>.mcps` | Assign, restrict, or authorize specific Model Context Protocol (MCP) servers (like `context7` or `gh_grep`) to specific agents. |
|
|
|
| **Presets** | `presets` configuration block | Bundle named agent environments. User and project preset definitions deep-merge; the active preset then merges into `agents`. |
|
|
|
@@ -65,24 +65,38 @@ When looking up markdown prompt template files (such as `<agent>.md` or `<agent>
|
|
|
|
|
|
## Prompt Composition Rules
|
|
|
|
|
|
-For any agent, the final system prompt is computed dynamically using the following formula:
|
|
|
+For any agent, the final system prompt is computed dynamically. Precedence
|
|
|
+is **inline > file > built-in default**:
|
|
|
|
|
|
-1. **Calculate Base Prompt:**
|
|
|
+1. **Resolve the effective base prompt:**
|
|
|
```
|
|
|
- base = inlinePrompt ?? defaultBuiltInPrompt
|
|
|
+ effectiveBase = inlinePrompt ?? filePrompt ?? defaultBuiltInPrompt
|
|
|
```
|
|
|
- - For built-in agents, `defaultBuiltInPrompt` is their factory template.
|
|
|
- - For custom agents, `defaultBuiltInPrompt` defaults to `"You are the <name> specialist."`.
|
|
|
- - `inlinePrompt` is the inline `prompt` string configured directly inside the `agents.<agent>.prompt` object.
|
|
|
-
|
|
|
-2. **Calculate Effective Base:**
|
|
|
+ - `inlinePrompt` is the `prompt` string set directly in
|
|
|
+ `agents.<agent>.prompt` (config or preset).
|
|
|
+ - `filePrompt` is the content of the resolved `<agent>.md` replacement
|
|
|
+ file (located according to the Prompt Lookup Precedence).
|
|
|
+ - `defaultBuiltInPrompt` is the agent's factory template (built-in
|
|
|
+ agents) or `"You are the <name> specialist."` (custom agents).
|
|
|
+
|
|
|
+ An explicit inline `prompt` always wins over a prompt file. The file
|
|
|
+ acts as a shared default — useful for the "shared prompt, per-preset
|
|
|
+ model" pattern where the file holds the common base and each preset
|
|
|
+ only overrides `model` and `variant`.
|
|
|
+
|
|
|
+2. **Conflict warning:**
|
|
|
+ When both an inline `prompt` and a `<agent>.md` file exist, a
|
|
|
+ `console.warn` is emitted at agent construction:
|
|
|
```
|
|
|
- effectiveBase = filePrompt ?? base
|
|
|
+ [oh-my-opencode] Agent '<name>': inline prompt overrides prompt file
|
|
|
+ (<name>.md). Remove the inline prompt to use the file.
|
|
|
```
|
|
|
- - `filePrompt` is the content of the resolved `<agent>.md` replacement file (located according to the Prompt Lookup Precedence).
|
|
|
+ This is informational — the inline prompt takes effect as expected. The
|
|
|
+ warning surfaces the conflict so you know the file is being ignored.
|
|
|
|
|
|
-3. **Append Append Prompt:**
|
|
|
- - If an append file `<agent>_append.md` is resolved, it is appended to the `effectiveBase` separated by two newlines:
|
|
|
+3. **Append prompt:**
|
|
|
+ - If an append file `<agent>_append.md` is resolved, it is appended to
|
|
|
+ the `effectiveBase` separated by two newlines:
|
|
|
```
|
|
|
finalPrompt = effectiveBase + "\n\n" + appendPrompt
|
|
|
```
|
|
|
@@ -128,4 +142,8 @@ If you also place a file under `.opencode/oh-my-opencode-slim/backend-preset/ora
|
|
|
```
|
|
|
Your primary focus is auditing backend security and performance.
|
|
|
```
|
|
|
-According to prompt composition rules, the markdown file prompt overrides the inline preset prompt, so the effective base prompt becomes `"Your primary focus is auditing backend security and performance."`.
|
|
|
+The inline preset `prompt` takes precedence over the file, so the effective
|
|
|
+base prompt becomes `"You are the project senior backend oracle. Focus
|
|
|
+strictly on NestJS."`. A `console.warn` fires noting the file is being
|
|
|
+overridden. To use the file prompt instead, remove the inline `prompt` from
|
|
|
+the preset config.
|