chore: update stale docs
This commit is contained in:
+37
-25
@@ -59,7 +59,7 @@ Key integration points:
|
||||
|
||||
User-level bases:
|
||||
|
||||
- `~/.omp/agent`
|
||||
- OMP native: `~/<PI_CONFIG_DIR>/agent` (normally `~/.omp/agent`; a named profile changes this as described below)
|
||||
- `~/.claude`
|
||||
- `~/.codex`
|
||||
- `~/.gemini`
|
||||
@@ -71,17 +71,19 @@ Project-level bases:
|
||||
- `<cwd>/.codex`
|
||||
- `<cwd>/.gemini`
|
||||
|
||||
`CONFIG_DIR_NAME` is `.omp` (`packages/utils/src/dirs.ts`).
|
||||
`CONFIG_DIR_NAME` is `.omp` (`packages/utils/src/dirs.ts`). `PI_CONFIG_DIR` changes the OMP user root used by the generic helpers. `PI_CODING_AGENT_DIR` is different: for the default profile it changes `getAgentDir()` consumers such as native discovery, settings, and runtime state, but it does **not** change the generic `getConfigDirs()` / `findConfigFile()` OMP base. Named profiles ignore `PI_CODING_AGENT_DIR`.
|
||||
|
||||
## Profiles
|
||||
|
||||
A named profile (`omp --profile <name>`, the `--alias` shortcut, or `OMP_PROFILE` / `PI_PROFILE`) relocates the OMP user base. When a profile is active, every OMP-native user-level path written here as `~/.omp/agent/...` resolves to `~/.omp/profiles/<name>/agent/...` instead.
|
||||
A named profile (`omp --profile <name>`, `OMP_PROFILE`, or the legacy fallback `PI_PROFILE`) relocates the OMP user base. `OMP_PROFILE` wins when it is defined, including when it is explicitly empty; `default`, empty, or whitespace selects the default profile. When a profile is active, every OMP-native user-level path written here as `~/.omp/agent/...` normally resolves to `~/.omp/profiles/<name>/agent/...`. `--alias <command>` does not select a profile by itself: paired with `--profile`, it creates a shell shortcut for that profile.
|
||||
|
||||
The relocation is uniform across the native provider (`builtin.ts`) and the generic `config.ts` helpers, so it covers slash commands, rules, prompts, instructions, hooks, tools, extensions, settings, skills, and MCP, plus the top-level `SYSTEM.md` / `RULES.md` / `AGENTS.md` files and runtime state (sessions, blobs, `agent.db`). A profile sees only its own OMP config, never the default profile's `~/.omp/agent`.
|
||||
The relocation is uniform across the native provider (`builtin.ts`) and the generic `config.ts` helpers, so it covers slash commands, rules, prompts, instructions, hooks, tools, extensions, settings, skills, and MCP, plus the top-level `SYSTEM.md` / `RULES.md` / `AGENTS.md` files and runtime state (sessions, blobs, `agent.db`). A profile sees only its own OMP config, never the default profile's agent config.
|
||||
|
||||
Keybindings are the one exception: a named profile merges the default profile's `~/.omp/agent/keybindings.*` under its own `~/.omp/profiles/<name>/agent/keybindings.*`, with the profile file overriding per binding ([#4867](https://github.com/can1357/oh-my-pi/issues/4867)). Keybindings describe the terminal/keyboard in front of the user, which doesn't change with the active profile, so user-level remaps keep working in every profile unless the profile explicitly overrides them. The inherited file is read-only for the profile process — legacy-format migration of the default profile's file only happens when the default profile itself runs.
|
||||
|
||||
The other source bases are not profile-scoped and load identically under every profile: the external-tool bases (`~/.claude`, `~/.codex`, `~/.gemini`) belong to those tools, and the project-level bases (`<cwd>/.omp`, `<cwd>/.claude`, ...) are keyed to the working directory. Throughout this document, read `~/.omp/agent` as shorthand for the active profile's agent directory.
|
||||
On macOS and Linux, an existing `$XDG_DATA_HOME/omp`, `$XDG_STATE_HOME/omp`, or `$XDG_CACHE_HOME/omp` can relocate the corresponding data, state, or cache paths. For a named profile, OMP uses an XDG category only when that category already contains `omp/profiles/<name>`; otherwise that category remains under `~/.omp/profiles/<name>`. Run `omp config init-xdg` before relying on XDG paths.
|
||||
|
||||
The other source bases are not profile-scoped and load identically under every profile: the external-tool bases (`~/.claude`, `~/.codex`, `~/.gemini`) belong to those tools, and the project-level bases (`<cwd>/.omp`, `<cwd>/.claude`, ...) are keyed to the working directory. Throughout this document, read `~/.omp/agent` as shorthand for the active profile's agent directory unless an environment override or XDG path is being discussed.
|
||||
|
||||
## Important constraint
|
||||
|
||||
@@ -147,27 +149,35 @@ Legacy migration still supported:
|
||||
|
||||
The runtime settings model is layered:
|
||||
|
||||
1. Global settings: `~/.omp/agent/config.yml`
|
||||
2. Project settings: discovered via settings capability (`settings.json` and `config.yml` from providers)
|
||||
3. CLI config overlays: `omp --config <path>` / repeated `--config` files, loaded as `config.yml`-style YAML for this process only
|
||||
1. Global settings: the first present file among `~/.omp/agent/config.yml` and `config.yaml`
|
||||
2. Project settings: discovered via the settings capability (`settings.json` and `config.yml` from providers)
|
||||
3. Config overlays: `PI_CONFIG_FILES` (platform path-list), followed by repeated `omp --config <path>` files; all are loaded as `config.yml`-style YAML for this process only
|
||||
4. Runtime overrides: in-memory, non-persistent
|
||||
5. Schema defaults: from `SETTINGS_SCHEMA`
|
||||
|
||||
Effective precedence:
|
||||
|
||||
`defaults <- global <- project <- CLI config overlays <- overrides`
|
||||
`defaults <- global <- project <- PI_CONFIG_FILES overlays <- --config overlays <- runtime overrides`
|
||||
|
||||
Within either overlay list, later files override earlier files. Overlay paths are resolved relative to the active project directory (after `~` expansion).
|
||||
|
||||
Write behavior:
|
||||
|
||||
- `settings.set(...)` writes to the **global** layer (`config.yml`) and queues background save.
|
||||
- Project settings are read-only from capability discovery.
|
||||
- `settings.set(...)` writes to the **global** layer (the global YAML file selected at startup) and queues a background save.
|
||||
- Project settings and config overlays are read-only from the settings API.
|
||||
|
||||
### Settings load failures
|
||||
|
||||
- Missing global/project YAML is treated as empty configuration.
|
||||
- Invalid global or native-project YAML is moved to a unique `.broken-<timestamp>-<pid>-<uuid>` sibling under a file lock, then startup fails with the original and backup paths. An unreadable file fails without being moved.
|
||||
- Every `PI_CONFIG_FILES` / `--config` overlay is strict: missing files, invalid YAML, and non-mapping document roots are hard errors. Overlay files are not quarantined.
|
||||
|
||||
## Migration behavior still active
|
||||
|
||||
On startup, if `config.yml` is missing:
|
||||
On startup, if neither global `config.yml` nor `config.yaml` exists:
|
||||
|
||||
1. Migrate from `~/.omp/agent/settings.json` (renamed to `.bak` on success)
|
||||
2. Merge with legacy DB settings from `agent.db`
|
||||
2. Merge with legacy DB settings from `agent.db` (DB values win conflicts)
|
||||
3. Write merged result to `config.yml`
|
||||
|
||||
Field-level migrations in `#migrateRawSettings`:
|
||||
@@ -227,15 +237,16 @@ Native provider (`id: native`) reads native config from:
|
||||
|
||||
### Directory admission rules
|
||||
|
||||
- Slash commands, rules, prompts, instructions, hooks, tools, extensions, extension modules, and settings use a project/user root only when the root directory exists and is non-empty.
|
||||
- Slash commands, directory rules, prompts, instructions, hooks, tools, extensions, extension modules, and settings use a project/user root only when the root directory exists and is non-empty.
|
||||
- Skills scan `<ancestor>/.omp/skills` for each ancestor from the current working directory up to the repo root/home boundary, plus `~/.omp/agent/skills`, without requiring the root `.omp` directory itself to be non-empty.
|
||||
- `SYSTEM.md` and `AGENTS.md` read user-level files directly and use nearest-ancestor project `.omp` lookup for project files, but the project `.omp` directory must be non-empty. See [`docs/system-prompt-customization.md`](./system-prompt-customization.md) for the full `SYSTEM.md` / `APPEND_SYSTEM.md` contract (replace vs. append, templating).
|
||||
- `SYSTEM.md`, `RULES.md`, and `.omp/AGENTS.md` read user-level files directly and use the nearest non-empty ancestor `.omp` directory for project files. `RULES.md` becomes an always-apply sticky rule. See [`docs/system-prompt-customization.md`](./system-prompt-customization.md) for the full `SYSTEM.md` / `APPEND_SYSTEM.md` contract.
|
||||
- MCP does not use the non-empty-root admission helper. It reads project `.omp/mcp.json` then `.omp/.mcp.json`, followed by user `mcp.json` then `.mcp.json`, directly.
|
||||
|
||||
### Scope-specific loading
|
||||
|
||||
- Skills: `<ancestor>/.omp/skills/*/SKILL.md` and `~/.omp/agent/skills/*/SKILL.md`
|
||||
- Slash commands: `commands/*.md`
|
||||
- Rules: `rules/*.{md,mdc}`
|
||||
- Rules: `rules/*.{md,mdc}` plus top-level `RULES.md`
|
||||
- Prompts: `prompts/*.md`
|
||||
- Instructions: `instructions/*.md`
|
||||
- Hooks: `hooks/pre/*`, `hooks/post/*`
|
||||
@@ -243,21 +254,22 @@ Native provider (`id: native`) reads native config from:
|
||||
- Extension modules: discovered under `extensions/` (+ legacy `settings.json.extensions` string array)
|
||||
- Extensions: `extensions/<name>/gemini-extension.json`
|
||||
- Settings capability: `settings.json`, then `config.yml`
|
||||
- Context files: `.omp/AGENTS.md`; standalone ancestor `AGENTS.md` files are loaded separately by the low-priority `agents-md` provider
|
||||
|
||||
### Nearest-project lookup nuance
|
||||
|
||||
## For `SYSTEM.md` and `AGENTS.md`, native provider uses nearest-ancestor project `.omp` directory search (walk-up) and still requires the project `.omp` dir to be non-empty.
|
||||
For `SYSTEM.md`, `RULES.md`, and `.omp/AGENTS.md`, the native provider walks upward to the nearest non-empty project `.omp` directory.
|
||||
|
||||
## 7) How major subsystems consume config
|
||||
|
||||
## Settings subsystem
|
||||
|
||||
- `Settings.init()` loads global `config.yml` + discovered project settings capability items.
|
||||
- Only capability items with `level === "project"` are merged into project layer.
|
||||
- `Settings.init()` loads the global YAML file, discovered project settings, `PI_CONFIG_FILES` / `--config` overlays, and runtime overrides in the precedence described above.
|
||||
- Only capability items with `level === "project"` are merged into the project layer.
|
||||
|
||||
### Session title prompt override
|
||||
|
||||
Create `TITLE_SYSTEM.md` in the same config locations as `SYSTEM.md` / `APPEND_SYSTEM.md`:
|
||||
Create `TITLE_SYSTEM.md` in any generic config base:
|
||||
|
||||
```text
|
||||
# ~/.omp/agent/TITLE_SYSTEM.md
|
||||
@@ -265,7 +277,7 @@ Generate a session name using lowercase `<type>:<primary-objective>`.
|
||||
```
|
||||
|
||||
- Missing `TITLE_SYSTEM.md` keeps the bundled title prompts.
|
||||
- Discovery uses the same project-then-user config directory pattern as `SYSTEM.md`: project `.omp/TITLE_SYSTEM.md` first, then user `~/.omp/agent/TITLE_SYSTEM.md` and the other supported config bases.
|
||||
- Discovery checks the current project directory bases first (`<cwd>/.omp`, `.claude`, `.codex`, `.gemini`), then the user bases in the generic helper order. Unlike native `SYSTEM.md`, project title discovery does **not** walk ancestor directories.
|
||||
- The override replaces only the automatic session-title generation system prompt; normal `SYSTEM.md` / `APPEND_SYSTEM.md` prompt customization is unaffected.
|
||||
- The online path asks the title model to wrap the title in `<title>...</title>` and parses it leniently from text (a plain sentence, a truncated/unclosed tag, or a stray `{"title": "..."}` JSON echo all still work). A `TITLE_SYSTEM.md` override gets the wrap-in-`<title>` instruction appended after it. The local tiny-title path keeps the `<title>...</title>` prefill/stop wrapper and uses this file as its system turn.
|
||||
|
||||
@@ -287,8 +299,8 @@ Generate a session name using lowercase `<type>:<primary-objective>`.
|
||||
|
||||
## Extensions subsystem
|
||||
|
||||
- `discoverAndLoadExtensions()` resolves extension modules from extension-module capability plus explicit paths.
|
||||
- Current implementation intentionally keeps only capability items with `_source.provider === "native"` before loading.
|
||||
- `discoverAndLoadExtensions()` loads native extension-module capability items, JS/TS hook factories, installed-plugin entry points, and explicit configured paths.
|
||||
- Ambient extension-module capability discovery is explicitly restricted to `provider: "native"`; foreign providers are not scanned for this step.
|
||||
|
||||
---
|
||||
|
||||
@@ -303,7 +315,7 @@ Use this mental model:
|
||||
|
||||
### Settings-specific caveat
|
||||
|
||||
Settings capability items are not deduplicated; `Settings.#loadProjectSettings()` deep-merges project items in returned order. Because merge applies later item values over earlier values, effective override behavior depends on provider emission order, not just capability key semantics.
|
||||
Settings capability items are not deduplicated; `Settings.#loadProjectSettings()` deep-merges project items in returned order, so later items override earlier ones. Providers are visited from highest to lowest priority, which means lower-priority provider settings can override higher-priority settings. Within the native provider, project `config.yml` follows and overrides `settings.json`. Native `.omp/config.yml` model roles are then reapplied as the authoritative project model-role layer.
|
||||
|
||||
---
|
||||
|
||||
@@ -311,7 +323,7 @@ Settings capability items are not deduplicated; `Settings.#loadProjectSettings()
|
||||
|
||||
- `ConfigFile` JSON -> YAML migration for YAML-targeted files.
|
||||
- Settings migration from `settings.json` and `agent.db` to `config.yml`.
|
||||
- Settings key migrations include `queueMode`, `ask.timeout`, flat `theme`, `task.isolation.enabled`, legacy `task.isolation.mode` values, removed edit modes, `statusLine.plan_mode`, `memories.enabled`, and hindsight scoping/name fields.
|
||||
- Field migrations cover renamed/removed settings and value-shape changes, including `queueMode`, changelog settings, `ask.timeout`, flat `theme`, `inspect_image.enabled`, task isolation/eager settings, removed edit and compaction modes, `inlineToolDescriptors`, status-line segments, provider/search settings, memories/hindsight settings, and nested-leaf renames. Consult `Settings.#migrateRawSettings()` for the current exhaustive list.
|
||||
- Legacy setting names `skills.enablePiUser` / `skills.enablePiProject` are still active gates for native skill source.
|
||||
|
||||
If these compatibility paths are removed in code, update this document immediately; several runtime behaviors still depend on them today.
|
||||
|
||||
Reference in New Issue
Block a user