|
2 | 2 |
|
3 | 3 | ## Skill Auto-Load |
4 | 4 |
|
5 | | -`auto_load` is a plugin (`custom.skills.auto-load`): configure it with `{ "plugins": [{ "package": "custom.skills.auto-load", "options": { "skills": ["a", "b"] } }] }` to inject those skills into main-session system prompts and omit them from `available_skills`. |
| 5 | +The plugin `custom.skills.auto-load` adds named skills to the system prompts of main sessions. It removes those skills from `available_skills`. Configure it with `{ "plugins": [{ "package": "custom.skills.auto-load", "options": { "skills": ["a", "b"] } }] }`. |
6 | 6 |
|
7 | 7 | ## Builtin Plugin Options |
8 | 8 |
|
9 | | -A `plugins` config entry whose `package` is a builtin plugin id enables it and passes `options` to it. Wildcard entries (`custom.*`) pass no options. |
| 9 | +A `plugins` config entry enables a builtin plugin when its `package` is the plugin id. The entry passes `options` to the plugin. Wildcard entries (`custom.*`) pass no options. |
10 | 10 |
|
11 | 11 | ## Disabled Workflows |
12 | 12 |
|
13 | | -Only `ci` runs on this fork. After merging upstream, run `make disable-workflows` to disable the rest. |
| 13 | +Only `ci` runs on this fork. After you merge upstream, run `make disable-workflows`. It disables all other workflows. |
14 | 14 |
|
15 | 15 | ## Removed Upstream Custom Tools |
16 | 16 |
|
17 | | -Deleted `.opencode/tool/github-pr-search.ts` and `github-triage.ts`: v1-style tools (`import { tool } from "@opencode/plugin"`) that fail to load on v2 and break every prompt run in this repo. |
| 17 | +The fork removed `.opencode/tool/github-pr-search.ts` and `github-triage.ts`. These tools use the v1 style (`import { tool } from "@opencode/plugin"`). They fail to load on v2 and break every prompt run in this repo. |
18 | 18 |
|
19 | 19 | ## Fork CI Workflow |
20 | 20 |
|
21 | | -`ci.yml` is the fork's only workflow: it checks pull requests and pushes to `dev`, and on a push to `dev` builds the CLI and publishes a datever GitHub Release. |
| 21 | +`ci.yml` is the only workflow of the fork. It checks pull requests and pushes to `dev`. On a push to `dev`, it builds the CLI and publishes a datever GitHub Release. |
22 | 22 |
|
23 | 23 | ## Makefile |
24 | 24 |
|
25 | | -`make build-single` builds the single-file `opencode` binary, `make generate` regenerates the protocol, client, and docs, `make tests` runs the fork's tests, and `make git-setup` registers the merge drivers below. |
| 25 | +- `make build-single` builds the single-file `opencode` binary. |
| 26 | +- `make generate` regenerates the protocol, the client, and the docs. |
| 27 | +- `make tests` runs the tests of the fork. |
| 28 | +- `make git-setup` registers the merge drivers (see Migration Merge Drivers). |
26 | 29 |
|
27 | 30 | ## Migration Merge Drivers |
28 | 31 |
|
29 | | -Git merge drivers (`packages/core/script/merge-driver.ts`) resolve `migration.gen.ts` and `schema.json` when upstream adds a migration next to the fork's. Run `make git-setup` once per clone. |
| 32 | +The merge drivers in `packages/core/script/merge-driver.ts` resolve `migration.gen.ts` and `schema.json`. They apply when upstream adds a migration next to the migration of the fork. Run `make git-setup` one time in each clone. |
30 | 33 |
|
31 | 34 | ## Interrupt-and-Submit Keybind (`prompt_interrupt_submit`) |
32 | 35 |
|
33 | | -`ctrl+return` (`prompt_interrupt_submit`) aborts the active run and submits the prompt as a fresh run. It needs the kitty keyboard protocol, and it is no longer a newline key. |
| 36 | +`ctrl+return` (`prompt_interrupt_submit`) stops the active run and submits the prompt as a new run. It needs the kitty keyboard protocol. It no longer inserts a newline. |
34 | 37 |
|
35 | 38 | ## Click-to-Toggle MCPs in TUI Sidebar |
36 | 39 |
|
37 | | -Clicking an MCP in the sidebar enables or disables it. In-flight connections use status `pending` (upstream rename of `connecting`); the web UI still labels it "connecting". V1 servers that emit `connecting` are normalized to `pending` at the load boundary. |
| 40 | +Click an MCP in the sidebar to enable or disable it. A connection in progress has the status `pending` (upstream renamed `connecting` to `pending`). The web UI still shows "connecting". V1 servers that send `connecting` become `pending` when the config loads. |
38 | 41 |
|
39 | 42 | ## Prompt Stash Defaults |
40 | 43 |
|
41 | | -Default keybinds: `ctrl+s` to stash the current prompt, `ctrl+shift+s` to pop the last stashed prompt. |
| 44 | +`ctrl+s` stashes the current prompt. `ctrl+shift+s` restores the last stashed prompt. |
42 | 45 |
|
43 | 46 | ## Terminal Title Without `OC |` Prefix |
44 | 47 |
|
45 | | -Session and plugin terminal titles use the bare title/id (no `OC |` prefix). |
| 48 | +Terminal titles of sessions and plugins show the plain title or id. They have no `OC |` prefix. |
46 | 49 |
|
47 | 50 | ## Bash Tool Syntax Highlighting (TUI) |
48 | 51 |
|
49 | | -Bash/shell tool commands use tree-sitter bash highlighting. The `$ ` marker renders separately so the shell grammar only sees the command. |
| 52 | +The TUI highlights commands of the bash and shell tools with tree-sitter bash. The `$ ` marker renders separately, so the shell grammar sees only the command. |
50 | 53 |
|
51 | 54 | ## Provider Colorization (TUI) |
52 | 55 |
|
53 | | -Each provider gets a stable theme color in the model picker and prompt footer. |
| 56 | +Each provider has a stable theme color in the model picker and in the prompt footer. |
54 | 57 |
|
55 | 58 | ## Model Keyword Highlights (TUI) |
56 | 59 |
|
57 | | -`cli.json` `model_keywords` (case-insensitive regexes) colors matching text in model names in the picker and prompt footer. |
| 60 | +The `cli.json` setting `model_keywords` holds case-insensitive regexes. The TUI colors the matching text in model names in the model picker and in the prompt footer. |
58 | 61 |
|
59 | 62 | ## Free Badge for Zero-Cost Models (TUI) |
60 | 63 |
|
61 | | -Model picker shows a `Free` footer for any model with `cost.input === 0`, not only `opencode` provider models. |
| 64 | +The model picker shows a `Free` footer for each model with `cost.input === 0`. This applies to all providers, not only `opencode`. |
62 | 65 |
|
63 | 66 | ## Agent Cycle Tab Strip (TUI) |
64 | 67 |
|
65 | | -Tab and Shift+Tab cycle agents forward and back, briefly showing a colored list of agents; click one to select it. |
| 68 | +Tab selects the next agent. Shift+Tab selects the previous agent. A colored list of agents shows for a short time. Click an agent in the list to select it. |
66 | 69 |
|
67 | 70 | ## `/timeouts` Command |
68 | 71 |
|
69 | | -Plugin (`custom.shell.timeouts` + TUI `custom.timeouts`): foreground shell commands have no default timeout until `/timeouts` is toggled for the session. Explicit `timeout` on a call still applies; background calls are untouched. Contract in `packages/schema/src/custom-timeouts.ts`. |
| 72 | +The plugins `custom.shell.timeouts` and `custom.timeouts` (TUI) remove the default timeout of foreground shell commands. The default timeout returns only after you toggle `/timeouts` for the session. A `timeout` set on a call still applies. Background calls are not affected. The contract is in `packages/schema/src/custom-timeouts.ts`. |
70 | 73 |
|
71 | 74 | ## Task Tool Invalid `task_id` |
72 | 75 |
|
73 | | -Plugin (`custom.tool.subagent.resume`): a subagent `sessionID` that is not a child of the current session starts a new subagent instead of failing. |
| 76 | +The plugin `custom.tool.subagent.resume` starts a new subagent when the `sessionID` is not a child of the current session. Before, the call failed. |
74 | 77 |
|
75 | 78 | ## Vertical Tabs Default |
76 | 79 |
|
77 | | -Session tabs default to vertical in the TUI (`tabs.layout`) and desktop app (`appearance.tabLayout`). |
| 80 | +Session tabs are vertical by default in the TUI (`tabs.layout`) and in the desktop app (`appearance.tabLayout`). |
78 | 81 |
|
79 | 82 | ## Vertical Tab Title Wrapping (TUI) |
80 | 83 |
|
81 | | -Expanded vertical tab titles word-wrap onto as many rows as they need instead of cropping, and the tab grows to fit; the compact rail and project line still crop. |
| 84 | +In the expanded vertical rail, a long tab title wraps onto more rows, and the tab grows to fit. The compact rail and the project line crop the text. |
82 | 85 |
|
83 | 86 | ## Vertical Tab Close Mark (TUI) |
84 | 87 |
|
85 | | -In the expanded vertical rail, hovering an idle tab turns its `•` into `✕`; click it to close the tab. Horizontal tabs keep upstream's close button. |
| 88 | +In the expanded vertical rail, hover over an idle tab to change its `•` to `✕`. Click the `✕` to close the tab. Horizontal tabs keep the close button of upstream. |
86 | 89 |
|
87 | 90 | ## Vertical Tab Project Groups (TUI) |
88 | 91 |
|
89 | | -The expanded vertical rail groups tabs under project headers and nests child sessions under their parent tab; manual tab reordering is disabled while `tabs.layout` is vertical. |
| 92 | +The expanded vertical rail groups tabs under project headers. It nests child sessions under their parent tab. You cannot reorder tabs by hand while `tabs.layout` is vertical. |
90 | 93 |
|
91 | 94 | ## Vertical Tab Compact Layout (TUI) |
92 | 95 |
|
93 | | -In the expanded vertical rail, a tab shows a second line only when it has a worktree branch, tabs in one project group sit with no gap, and idle tabs show `•`. |
| 96 | +In the expanded vertical rail, a tab shows a second line only when it has a worktree branch. Tabs of one project group have no gap between them. Idle tabs show `•`. |
94 | 97 |
|
95 | 98 | ## Subagent List Order (TUI) |
96 | 99 |
|
97 | | -The vertical tab subtree lists unresolved children (running, pending, permission, or question), the child being viewed, and ancestors of those, oldest-first by `time.created`. The subagent picker lists children oldest-first by `time.created`. |
| 100 | +The vertical tab subtree lists these sessions, oldest first by `time.created`: |
| 101 | + |
| 102 | +- unresolved children (running, pending, permission, or question) |
| 103 | +- the child that you view |
| 104 | +- the ancestors of these sessions |
| 105 | + |
| 106 | +The subagent picker lists all children, oldest first by `time.created`. |
98 | 107 |
|
99 | 108 | ## Diff Line Comments (TUI) |
100 | 109 |
|
101 | | -Dragging down the line numbers of an in-chat edit, patch or write block picks lines, GitHub style, and sends a comment on them to the session as a prompt. |
| 110 | +Drag down the line numbers of an edit, patch, or write block in the chat to select lines, as on GitHub. The TUI sends a comment on the selected lines to the session as a prompt. |
102 | 111 |
|
103 | 112 | ## Message Actions Jump (TUI) |
104 | 113 |
|
105 | | -Clicking a message hides Jump to in Message Actions. The timeline still shows it. |
| 114 | +When you click a message, Message Actions does not show Jump to. The timeline still shows it. |
106 | 115 |
|
107 | 116 | ## Session List Preview (TUI) [NOT MIGRATED] |
108 | 117 |
|
109 | | -The session list (`<leader>l`) previews the highlighted session's latest messages on terminals 128 columns or wider. |
| 118 | +On terminals that are 128 columns or wider, the session list (`<leader>l`) previews the latest messages of the highlighted session. |
110 | 119 |
|
111 | 120 | ## Retitle After Compaction |
112 | 121 |
|
113 | | -Plugin (`custom.session.retitle`): regenerates a top-level session's title from the compaction summary after every compaction, unless the session was renamed by hand. |
| 122 | +The plugin `custom.session.retitle` writes a new title for a top-level session from the compaction summary. It runs after each compaction. It does not run when you renamed the session by hand. |
114 | 123 |
|
115 | 124 | ## Skill Mentions Use `/` |
116 | 125 |
|
117 | | -Skills are mentioned and autocompleted as `/skill-id` (leading `/` menu in the TUI and app composer) instead of `@skill-id`; `@` stays for files, agents, and references. |
| 126 | +Type `/skill-id` to mention a skill. The `/` menu in the TUI and in the app composer completes it. This replaces `@skill-id`. `@` still mentions files, agents, and references. |
118 | 127 |
|
119 | 128 | ## Directory Links Open in Sublime Merge (TUI) |
120 | 129 |
|
121 | | -Clicking a markdown link to a directory (trailing `/`, e.g. `[core](packages/core/)`) copies its absolute path and runs `smerge` on it; a missing path toasts an error. `make tests` runs the fork tests. |
| 130 | +Click a markdown link to a directory (the path ends with `/`, for example `[core](packages/core/)`). The TUI copies the absolute path and runs `smerge` on it. If the path does not exist, the TUI shows an error toast. |
122 | 131 |
|
123 | 132 | ## Context Sidebar |
124 | 133 |
|
125 | | -Plugin (`custom.context` + TUI `custom.sidebar.context`): the sidebar lists the session's loaded instruction files, loaded skills, and one collapsible node per session root. Clicking a root copies its path. |
| 134 | +The plugins `custom.context` and `custom.sidebar.context` (TUI) fill the sidebar. It lists the instruction files and skills that the session loaded. It also lists one collapsible node for each session root. Click a root to copy its path. |
126 | 135 |
|
127 | 136 | ## Pull Request Sidebar |
128 | 137 |
|
129 | | -Plugin (`custom.pull-requests` + TUI `custom.sidebar.pull-requests`): the sidebar lists pull requests linked in the chat as `owner/repo#n`; click to open. Add enterprise hosts with the `hosts` plugin option. |
| 138 | +The plugins `custom.pull-requests` and `custom.sidebar.pull-requests` (TUI) fill the sidebar. It lists the pull requests that the chat links, as `owner/repo#n`. Click an entry to open it. The plugin option `hosts` adds enterprise hosts. |
130 | 139 |
|
131 | 140 | ## Cancel Tool |
132 | 141 |
|
133 | | -`cancel` tool: agents cancel a background `shell` or `subagent` they started by passing the shell ID or subagent `sessionID` from its `background: true` result (which now names the id); jobs owned by another session are refused. |
| 142 | +The `cancel` tool stops a background `shell` or `subagent` that the agent started. The agent passes the shell ID or the `sessionID` from the result of the `background: true` call. The result names this id. The tool refuses jobs that belong to another session. |
134 | 143 |
|
135 | | -Plugin (`custom.tool.cancel-hints`): tells the model to use `cancel` in the shell tool's description and background results. |
| 144 | +The plugin `custom.tool.cancel-hints` tells the model to use `cancel`. It adds this to the shell tool description and to the background results. |
136 | 145 |
|
137 | 146 | ## Session Roots |
138 | 147 |
|
139 | | -A session has one working directory plus optional `roots`: extra directories that are in scope like it, with no `external_directory` approval. |
| 148 | +A session has one working directory. It can also have `roots`: extra directories that are in scope like the working directory. Access to a root needs no `external_directory` approval. |
140 | 149 |
|
141 | | -- Models add and remove roots with `session_root_add` / `session_root_remove` (plugin `custom.session.roots`); the API has `/api/session/:sessionID/root`. |
142 | | -- A root's instruction files and skills load into the session's context. |
143 | | -- Session move is upstream's and works with roots; `session.fork` also takes an optional `directory`. |
144 | | -- In the TUI workspaces dialog, `ctrl+m` moves the session and `ctrl+y` adds a root. |
| 150 | +- Models add and remove roots with `session_root_add` and `session_root_remove` (plugin `custom.session.roots`). The API path is `/api/session/:sessionID/root`. |
| 151 | +- The instruction files and skills of a root load into the context of the session. |
| 152 | +- Session move is the move of upstream. It works with roots. `session.fork` also accepts an optional `directory`. |
| 153 | +- In the TUI workspaces dialog, `ctrl+m` moves the session. `ctrl+y` adds a root. |
145 | 154 |
|
146 | 155 | ## Session Move Disabled for Models |
147 | 156 |
|
148 | | -Plugin (`custom.tool.session-move.disable`): hides the `session_move` tool from models. Users can still move sessions. |
| 157 | +The plugin `custom.tool.session-move.disable` hides the `session_move` tool from models. Users can still move sessions. |
149 | 158 |
|
150 | 159 | ## Instruction Filenames |
151 | 160 |
|
152 | | -Auto-loaded instruction filenames are `InstructionDiscovery.filenames` (`AGENTS.md`, `CLAUDE.local.md`, `AGENTS.local.md`, `PATCH.md`), shared by the startup walk and the read-time walk. |
| 161 | +`InstructionDiscovery.filenames` lists the instruction files that load automatically: `AGENTS.md`, `CLAUDE.local.md`, `AGENTS.local.md`, and `PATCH.md`. The walk at startup and the walk at read time use this list. |
0 commit comments