command-code 1.9.0 → 1.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +17 -3
- package/dist/bundled/command-code-knowledge/reference/custom-slash-commands.md +5 -3
- package/dist/bundled/command-code-knowledge/reference/headless.md +1 -1
- package/dist/bundled/command-code-knowledge/reference/models.md +3 -4
- package/dist/bundled/command-code-knowledge/reference/product-help.md +3 -3
- package/dist/bundled/command-code-knowledge/reference/skills.md +17 -3
- package/dist/bundled/mod-builder/reference/api.md +1 -1
- package/dist/bundled/mod-builder/reference/overview.md +1 -1
- package/dist/bundled/mod-builder/reference/packaging.md +23 -6
- package/dist/bundled/mod-builder/reference/ui.md +17 -3
- package/dist/bundled/mod-builder/reference/verify.md +2 -1
- package/dist/cli.mjs +5 -5
- package/package.json +5 -5
- package/vsix/commandcode-vscode.vsix +0 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,13 +1,27 @@
|
|
|
1
1
|
# command-code
|
|
2
2
|
|
|
3
|
-
## 1.
|
|
3
|
+
## 1.10.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- feat(mods): render `cmd.ui.setStatus` segments in the TUI footer
|
|
8
|
+
- feat(tui): make /feedback tell you what enter will do, and add /issue (#3316)
|
|
9
|
+
|
|
10
|
+
## 1.9.1
|
|
4
11
|
|
|
5
12
|
### Patch Changes
|
|
6
13
|
|
|
14
|
+
- fix(tui): /copy to copy the whole reply, not just its last block
|
|
15
|
+
- fix: Restore colorized Edit/Write diff view in the TUI
|
|
16
|
+
- fix: Render the Edit diff for legacy `oldValue`/`newValue` tool calls
|
|
17
|
+
|
|
18
|
+
## 1.9.0
|
|
19
|
+
|
|
20
|
+
### Minor Changes
|
|
21
|
+
|
|
7
22
|
- feat: Add Qwen 3.8 Max
|
|
23
|
+
- feat: add /theme config a new "auto" theme that follows the OS theme
|
|
8
24
|
- fix(cli): tell users to upgrade Node instead of crashing with a raw SyntaxError
|
|
9
|
-
- feat: improved /theme config and auto-theme
|
|
10
|
-
|
|
11
25
|
|
|
12
26
|
## 1.8.0
|
|
13
27
|
|
|
@@ -117,12 +117,12 @@ Every built-in command, grouped by area. Aliases are shown in parentheses on the
|
|
|
117
117
|
| `/help` | Show available shortcuts |
|
|
118
118
|
| `/hotkeys` | Show all keyboard shortcuts |
|
|
119
119
|
| `/config [query]` | Search and change settings |
|
|
120
|
-
| `/theme [dark\|light]` | Switch
|
|
120
|
+
| `/theme [dark\|light\|auto]` | Switch themes; `auto` matches your terminal background |
|
|
121
121
|
| `/status` | Show comprehensive environment status |
|
|
122
122
|
| `/changelog [all]` | See what's new in Command Code (`all` for the full history) |
|
|
123
123
|
| `/courses` | Open Command Code courses in your browser |
|
|
124
124
|
| `/update` | Update Command Code to the latest version |
|
|
125
|
-
| `/feedback`
|
|
125
|
+
| `/feedback [title]` (alias `/issue`) | Report a bug or share feedback — opens a prefilled GitHub issue |
|
|
126
126
|
| `/trace` | Copy the current trace id; required for support debugging |
|
|
127
127
|
| `/copy` | Copy the last response to the clipboard |
|
|
128
128
|
|
|
@@ -136,6 +136,8 @@ Every built-in command, grouped by area. Aliases are shown in parentheses on the
|
|
|
136
136
|
|
|
137
137
|
`/effort` only opens its selector when the current model supports reasoning effort levels; otherwise it prints a notice that effort isn't supported for that model.
|
|
138
138
|
|
|
139
|
+
`/theme` offers three values. `dark` and `light` pin a palette; `auto` — the default — automatically detects your terminal's background color at startup (OSC 11, falling back to `COLORFGBG`) and uses light or dark to match. A terminal that won't report its background falls back to dark.
|
|
140
|
+
|
|
139
141
|
### Commands with meaningful default actions when bare
|
|
140
142
|
|
|
141
143
|
Some optional-argument commands do something useful with no argument instead of opening a picker: bare `/share` creates a share link, bare `/import` imports from all detected sources, bare `/export` exports in the default format, bare `/goal` (or `/goal status`) shows the current goal, bare `/name` shows the current session name, and bare `/plan` enters plan mode without a task.
|
|
@@ -249,7 +251,7 @@ When multiple sources define the same name, dispatch resolves in this order - fi
|
|
|
249
251
|
3. **Custom** commands (`.commandcode/commands/`, `~/.commandcode/commands/`)
|
|
250
252
|
4. **Skills**
|
|
251
253
|
|
|
252
|
-
So a custom command can never override a built-in, and a skill shadowed by any of the above resolves to its owner. Shadowed skills still render in the menu with a `- shadowed by /<name>` note so you know they exist. Lookup is case-insensitive (`/Reload` resolves to `/reload`).
|
|
254
|
+
So a custom command can never override a built-in, and a skill shadowed by any of the above resolves to its owner. Shadowed skills still render in the menu with a `- shadowed by /<name>` note so you know they exist, and they run under the `skill:` namespace: `/skill:<name>` bypasses this whole ladder and only ever resolves to a skill. Lookup is case-insensitive (`/Reload` resolves to `/reload`).
|
|
253
255
|
|
|
254
256
|
### Skill invocation
|
|
255
257
|
|
|
@@ -244,7 +244,7 @@ Flags useful for headless and automated workflows:
|
|
|
244
244
|
| `--max-turns <number>` | Maximum conversation turns in print mode (default: `100`, no upper bound) |
|
|
245
245
|
| `-m, --model <model>` | Run on a specific model this session |
|
|
246
246
|
| `--effort <level>` | Set reasoning effort (`low`, `medium`, `high`, …) |
|
|
247
|
-
| `--theme <theme>` | Set the color theme (`dark` or `
|
|
247
|
+
| `--theme <theme>` | Set the color theme (`dark`, `light`, or `auto` to match the terminal background) |
|
|
248
248
|
| `--config <key=value>` | Set any setting headlessly (repeatable) - see below |
|
|
249
249
|
| `--yolo` | Allow file writes and shell commands |
|
|
250
250
|
| `--auto-accept` | Start in auto-accept mode (alias for `--permission-mode auto-accept`) |
|
|
@@ -24,12 +24,12 @@ The model catalog — every id `/model`, `--model`, `model:effort` shorthand, an
|
|
|
24
24
|
| `MiniMaxAI/MiniMax-M2.5` | MiniMax M2.5 | 200K | — | $0.3/$1.2 | cross-platform full-stack agentic dev |
|
|
25
25
|
| `xiaomi/mimo-v2.5-pro` | MiMo V2.5 Pro | 1M | — | $0.435/$0.87 | high-capability long-context agentic coding |
|
|
26
26
|
| `xiaomi/mimo-v2.5` | MiMo V2.5 | 1M | — | $0.14/$0.28 | efficient long-context agentic coding |
|
|
27
|
-
| `Qwen/Qwen3.
|
|
28
|
-
| `Qwen/Qwen3.6-Plus` | Qwen 3.6 Plus | — | — | $0.5/$3 | agentic coding & reasoning |
|
|
27
|
+
| `Qwen/Qwen3.8-Max` | Qwen 3.8 Max | 1M | low, medium, xhigh | $2/$6 | autonomous long-horizon coding & professional work |
|
|
29
28
|
| `Qwen/Qwen3.7-Max` | Qwen 3.7 Max | 1M | — | $2.5/$7.5 | frontier coding & long-horizon agent execution |
|
|
30
29
|
| `Qwen/Qwen3.7-Plus` | Qwen 3.7 Plus | 1M | — | $0.4/$1.6 | agentic coding & reasoning at lower cost |
|
|
31
30
|
| `Qwen/Qwen3.7-Flash` | Qwen 3.7 Flash | 1M | — | $0.03/$0.13 | fast low-cost agentic coding & reasoning |
|
|
32
|
-
| `Qwen/Qwen3.
|
|
31
|
+
| `Qwen/Qwen3.6-Max-Preview` | Qwen 3.6 Max Preview | — | — | $1.3/$7.8 | vibe coding & efficient agent execution |
|
|
32
|
+
| `Qwen/Qwen3.6-Plus` | Qwen 3.6 Plus | — | — | $0.5/$3 | agentic coding & reasoning |
|
|
33
33
|
| `stepfun/Step-3.7-Flash` | Step 3.7 Flash | 256K | — | $0.2/$1.15 | multimodal sparse-MoE reasoning |
|
|
34
34
|
| `stepfun/Step-3.5-Flash` | Step 3.5 Flash | 1M | — | $0.1/$0.3 | fast sparse-MoE agentic reasoning |
|
|
35
35
|
| `tencent/hy3-paid` | Tencent Hy3 | 262K | — | $0.14/$0.58 | sparse-MoE reasoning & agentic tool use |
|
|
@@ -37,7 +37,6 @@ The model catalog — every id `/model`, `--model`, `model:effort` shorthand, an
|
|
|
37
37
|
| `thinkingmachines/inkling` | Inkling | 256K | — | $1/$4.05 | multimodal MoE reasoning |
|
|
38
38
|
| `thinkingmachines/inkling-small` | Inkling Small | 1M | — | $0.5/$1.2 | lightweight MoE reasoning at lower cost and latency |
|
|
39
39
|
| `poolside/laguna-s-2.1-free` | Laguna S 2.1 | 256K | — | $0/$0 | open-weight agentic coding and long-horizon work |
|
|
40
|
-
| `inclusionai/ling-3.0-flash-free` | Ling 3.0 Flash | 256K | — | $0/$0 | fast lightweight-MoE coding & agentic work |
|
|
41
40
|
## Anthropic
|
|
42
41
|
|
|
43
42
|
| Id (use EXACTLY this) | Name | Context | Efforts | $/1M in/out | Best for |
|
|
@@ -46,7 +46,7 @@
|
|
|
46
46
|
- /login: Log in to Command Code
|
|
47
47
|
- /logout: Log out of Command Code
|
|
48
48
|
- /courses: Open Command Code courses in your browser
|
|
49
|
-
- /feedback [title]:
|
|
49
|
+
- /feedback [title]: Report a bug or share feedback — opens a prefilled GitHub issue (alias: /issue)
|
|
50
50
|
- /trace: Copy the current trace id; required for support debugging
|
|
51
51
|
- /session-file: Show the current session id and path to the on-disk session file
|
|
52
52
|
- /copy: Copy the last response to the clipboard
|
|
@@ -80,7 +80,7 @@
|
|
|
80
80
|
- cmd help: Display help information
|
|
81
81
|
- cmd whoami: Show current user
|
|
82
82
|
- cmd update: Update Command Code to the latest version
|
|
83
|
-
- cmd feedback [title]:
|
|
83
|
+
- cmd feedback [title]: Report a bug or share feedback — opens a GitHub issue (alias: cmd issue)
|
|
84
84
|
- cmd taste: Manage taste learning packages
|
|
85
85
|
- cmd taste learn <source>: Learn taste from a local repository or GitHub repo
|
|
86
86
|
- cmd learn-taste: Learn command structure from repositories
|
|
@@ -285,6 +285,7 @@ Valid model ids (the /model catalog — use these EXACT ids):
|
|
|
285
285
|
- Qwen/Qwen3.6-Plus
|
|
286
286
|
- Qwen/Qwen3.7-Max
|
|
287
287
|
- Qwen/Qwen3.7-Plus
|
|
288
|
+
- Qwen/Qwen3.8-Max
|
|
288
289
|
- Qwen/Qwen3.7-Flash
|
|
289
290
|
- stepfun/Step-3.7-Flash
|
|
290
291
|
- stepfun/Step-3.5-Flash
|
|
@@ -372,7 +373,6 @@ A: Join our Discord at https://commandcode.ai/discord, report issues on GitHub,
|
|
|
372
373
|
|
|
373
374
|
### Installation
|
|
374
375
|
- "command not found" after install: Ensure global npm bin directory is in PATH. Run npm config get prefix, add <prefix>/bin to PATH, restart terminal.
|
|
375
|
-
- Node too old: Command Code requires Node.js 22+ (current LTS). On older Node it exits with an upgrade message; older builds instead crashed with "SyntaxError: The requested module 'fs/promises' does not provide an export named 'glob'". Fix: install Node LTS with `npm install -g n && n lts` (or `nvm install --lts && nvm use --lts`, or download from https://nodejs.org), then `npm i -g command-code` so the bin relinks to the new Node. Every upgrade route (n, nvm, fnm, Volta, asdf, Homebrew, winget, NodeSource): https://commandcode.ai/docs/troubleshooting/common-issues#upgrading-node-js
|
|
376
376
|
|
|
377
377
|
### Authentication
|
|
378
378
|
- Login fails or session expired: Run cmd logout then cmd login. If still failing, delete ~/.commandcode/auth.json and retry.
|
|
@@ -213,7 +213,8 @@ When two locations provide the same skill name, the higher-precedence copy wins
|
|
|
213
213
|
**What happens on a collision.** When a skill name matches a built-in or a custom command:
|
|
214
214
|
|
|
215
215
|
- Typing `/<name>` always resolves to the higher-precedence owner - the skill is not invoked.
|
|
216
|
-
-
|
|
216
|
+
- Run the skill as `/skill:<name>` instead. The `skill:` namespace skips the precedence ladder entirely and can only ever resolve to a skill, so it works for every skill, shadowed or not. Typing `/skill:` on its own lists all of them.
|
|
217
|
+
- The skill still appears in the `/` menu with a `[skill]` badge and a ` - shadowed by /<owner>, runs as /skill:<name>` note, and selecting that row inserts the namespaced form. Command Code prefers visibility with a marker over silently dropping the row.
|
|
217
218
|
|
|
218
219
|
---
|
|
219
220
|
|
|
@@ -238,7 +239,7 @@ This opens an interactive menu showing:
|
|
|
238
239
|
|
|
239
240
|
Every installed skill is also surfaced as a first-class slash command in the `/` menu. If you install a skill named `pr-desc`, you will see `/pr-desc`, sorted after built-ins and any custom commands in the slash menu.
|
|
240
241
|
|
|
241
|
-
If a skill name collides with a built-in or a custom command, the skill still appears in the `/` menu with a `[skill]` badge and a ` - shadowed by /<owner>` note. Typing `/<name>` always resolves to the higher-precedence owner, not the skill. See [Selection priority](#selection-priority) above for the full order.
|
|
242
|
+
If a skill name collides with a built-in or a custom command, the skill still appears in the `/` menu with a `[skill]` badge and a ` - shadowed by /<owner>` note. Typing `/<name>` always resolves to the higher-precedence owner, not the skill - use `/skill:<name>` to run the skill itself. See [Selection priority](#selection-priority) above for the full order.
|
|
242
243
|
|
|
243
244
|
---
|
|
244
245
|
|
|
@@ -255,6 +256,19 @@ Type `/skill-name` at the start of your prompt to run that skill for the current
|
|
|
255
256
|
/pr-desc update the description based on new changes
|
|
256
257
|
```
|
|
257
258
|
|
|
259
|
+
Every skill also answers to the namespaced form `/skill:<name>`, which never
|
|
260
|
+
resolves to anything but a skill:
|
|
261
|
+
|
|
262
|
+
```bash
|
|
263
|
+
# In Command Code session
|
|
264
|
+
/skill:changelog # the changelog skill, not the built-in /changelog
|
|
265
|
+
/skill changelog # same thing, space instead of colon
|
|
266
|
+
/skill: # browse every skill in the menu
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
Reach for it when a skill's name is taken by a built-in or custom command - see
|
|
270
|
+
[What happens on a collision](#selection-priority).
|
|
271
|
+
|
|
258
272
|
### 2. Inline slash reference
|
|
259
273
|
|
|
260
274
|
Drop `/skill-name` anywhere inside a longer prompt to pin that skill without losing your natural phrasing. You can mix multiple skills in a single prompt:
|
|
@@ -790,7 +804,7 @@ cmd skills add https://github.com/remotion-dev/skills --skill remotion-best-prac
|
|
|
790
804
|
|
|
791
805
|
**Name collisions.** Skill names share the `/` menu with built-in commands (`/clear`, `/help`, `/share`, `/rewind`, …) and with the custom commands in `.commandcode/commands/`. Built-ins and custom commands take precedence - typing `/<name>` resolves to the owner, not to the skill.
|
|
792
806
|
|
|
793
|
-
If you install a skill whose name collides with one of those, `cmd skills add` still completes normally - nothing blocks the install. The skill then appears in the `/` menu with a `[skill]` badge and a `shadowed by /<owner>` note
|
|
807
|
+
If you install a skill whose name collides with one of those, `cmd skills add` still completes normally - nothing blocks the install. The skill then appears in the `/` menu with a `[skill]` badge and a `shadowed by /<owner>` note, and runs as `/skill:<name>`, while a plain `/<name>` continues to route to the higher-precedence owner. See [Selection priority](#selection-priority) for the full order.
|
|
794
808
|
|
|
795
809
|
### cmd skills list
|
|
796
810
|
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
| `cmd.cwd` | `string` | workspace root |
|
|
13
13
|
| `cmd.session` | `ModSessionApi \| undefined` | persistence seam; undefined until bound |
|
|
14
14
|
| `cmd.events` | `ModEventBus` | `emit(channel, data?)` / `on(channel, handler)` cross-mod bus |
|
|
15
|
-
| `cmd.ui` | `ModUi` | `notify` / `confirm` / `select` / `input` / `setStatus` / `widget` / `refreshWidgets` |
|
|
15
|
+
| `cmd.ui` | `ModUi` | `notify` / `confirm` / `select` / `input` / `setStatus` / `widget` / `refreshWidgets` / `capabilities` |
|
|
16
16
|
| `cmd.sessions` | `ModSessionControls` | `compact` / `tree` / `leafId` / `navigateTree` / `setLabel` |
|
|
17
17
|
|
|
18
18
|
## Registration (factory-time; each returns `Disposable`)
|
|
@@ -222,7 +222,7 @@ Ask for any of these by name or by what you want:
|
|
|
222
222
|
|
|
223
223
|
- **Hooks mutate, `on` observes.** Event handlers cannot block tools or rewrite context; that is what `cmd.hooks` is for.
|
|
224
224
|
- **Project mods are trust-gated** like project skills: they load only after the workspace trust prompt, because a mod is arbitrary code. User-scope and `--mod` mods always load. There is no sandbox - install packages you trust. Package installs run npm with `--ignore-scripts` (mods are jiti-loaded TypeScript; they need no build step, so lifecycle scripts are pure attack surface).
|
|
225
|
-
- **Print mode loads user-scope and `--mod` mods only**, with the ui bridge degraded to headless defaults (confirm → false, select/input → undefined - never auto-approved; `setStatus`/`widget` render nowhere). Project mods stay out of headless runs because print never shows a trust prompt; pass `--dangerously-skip-permissions` to opt a repo's own mods into a headless run (CI).
|
|
225
|
+
- **Print mode loads user-scope and `--mod` mods only**, with the ui bridge degraded to headless defaults (confirm → false, select/input → undefined - never auto-approved; `setStatus`/`widget` render nowhere, and `cmd.ui.capabilities.status` is false). Project mods stay out of headless runs because print never shows a trust prompt; pass `--dangerously-skip-permissions` to opt a repo's own mods into a headless run (CI).
|
|
226
226
|
- **Mod-queued messages don't echo in the feed** the way typed input does - they land in the transcript and steer the model, but the visible record is the model's response.
|
|
227
227
|
- **Rendering is line-based, not component-based.** `cmd.addRenderer` returns styled text lines the host prints as feed rows; mods do not mount React components into the TUI. That keeps renderers host-agnostic (the same mod renders in any future host) and a crashing renderer degrades to a warning notice, never a broken screen.
|
|
228
228
|
- **Reload is the `/reload` path.** Mods load once per process; `/reload` restarts the process, which re-discovers and re-imports every mod (jiti caches nothing between loads). There is no in-place hot swap.
|
|
@@ -4,19 +4,36 @@
|
|
|
4
4
|
|
|
5
5
|
A mod starts life as a loose file in `~/.commandcode/mods/`. When it should be shared - with a team, or the world - it becomes a **package**: an npm package, a git repo, or a local directory that `cmd mods add` installs and Command Code loads on every session.
|
|
6
6
|
|
|
7
|
-
## Install, remove, list, update
|
|
7
|
+
## Install, remove, list, update, open
|
|
8
8
|
|
|
9
9
|
```bash
|
|
10
|
-
cmd mods add
|
|
10
|
+
cmd mods add cmd-mod-hi # bare name = npm package
|
|
11
|
+
cmd mods add @team/review-mod@1.2.0 # scoped npm name, pinned (npm: prefix optional)
|
|
11
12
|
cmd mods add owner/repo@v1 # GitHub shorthand (any git host via git:<host>/…)
|
|
12
13
|
cmd mods add ./tools/local-mod # local path, referenced in place
|
|
13
14
|
cmd mods add -g owner/repo # user scope instead of project
|
|
14
|
-
cmd mods list
|
|
15
|
-
cmd mods update # reinstall missing, reconcile pinned refs
|
|
16
|
-
cmd mods remove owner/repo
|
|
15
|
+
cmd mods list # alias: cmd mods ls
|
|
16
|
+
cmd mods update # reinstall missing, reconcile pinned refs (alias: up)
|
|
17
|
+
cmd mods remove owner/repo # alias: cmd mods rm
|
|
18
|
+
cmd mods remove fun-stuff # by the name `mods list` prints
|
|
19
|
+
cmd mods open # open the mods dir (project); --user for ~
|
|
17
20
|
```
|
|
18
21
|
|
|
19
|
-
|
|
22
|
+
`cmd mods list` prints one line per mod - name, scope, origin - project mods first, then user, then package-provided:
|
|
23
|
+
|
|
24
|
+
```
|
|
25
|
+
Mods (2)
|
|
26
|
+
guard · project · .commandcode/mods/guard.ts
|
|
27
|
+
cmd-mod-hi · user · from npm:cmd-mod-hi
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
The origin is the file for a drop-in mod and `from <source>` for a package mod (whose file lives under `.registry/`, which you never edit by hand). Built-in mods are Command Code's own internals and are never listed. Configured package sources stay out of the output entirely unless one needs attention - not installed, or installed but contributing no mods.
|
|
31
|
+
|
|
32
|
+
`remove` (`rm`) takes **either** a source or the mod NAME `cmd mods list` prints, and removes whatever backs that name: a drop-in file or directory is deleted from the mods dir, a package-provided mod removes its source (and says which sibling mods went with it), a `mods.paths` mod drops its settings entry. Scope follows where the mod actually lives, so a user-scope mod does not need `-g`; a source that is configured in neither scope reports that instead of a silent success.
|
|
33
|
+
|
|
34
|
+
`cmd mods open` opens the drop-in mods directory - `<project>/.commandcode/mods` by default, `~/.commandcode/mods` with `--user` (`-g`) - creating it if it does not exist yet. `--path` prints the directory instead of opening it.
|
|
35
|
+
|
|
36
|
+
A source with no slash is an npm package name, and so is a `@scope/name` - git shorthand always carries an `owner/repo` slash, so `npm:` is optional (an explicit `git:` prefix always wins). Sources persist in the `mods.sources` settings key (project scope writes `.commandcode/settings.json`, `-g` writes `~/.commandcode/settings.json`). Identity is version/ref-agnostic - `owner/repo@v1` and `https://github.com/owner/repo` are the same package, and a project entry shadows the same identity at user scope. Installs land in `<scope>/.commandcode/mods/.registry/{npm,git}/…`; startup never runs npm/git on its own - a configured-but-missing package is a warning pointing at `cmd mods update`.
|
|
20
37
|
|
|
21
38
|
## What a package ships
|
|
22
39
|
|
|
@@ -11,9 +11,23 @@ Everything a mod can put on screen rides `cmd.ui`, `cmd.addRenderer`, and `cmd.s
|
|
|
11
11
|
|
|
12
12
|
## Footer status segments and editor widgets
|
|
13
13
|
|
|
14
|
-
> **
|
|
14
|
+
> **Widgets are not wired into the TUI yet.** `cmd.ui.widget` and `cmd.ui.refreshWidgets` exist on the surface and are safe to call - they never throw and return the documented `Disposable` - but they currently render **nowhere**. The contract below is the intended design; wire-up is pending. `cmd.ui.setStatus` **is** wired and renders today.
|
|
15
15
|
|
|
16
|
-
`cmd.ui.setStatus(text | null)` - a persistent per-mod segment in the TUI footer (under the input panel). One segment per mod: a new call replaces the text, `null` clears it, the returned `Disposable` clears it too. Segments from multiple mods
|
|
16
|
+
`cmd.ui.setStatus(text | null)` - a persistent per-mod segment in the TUI footer (under the input panel). One segment per mod: a new call replaces the text, `null` (or whitespace-only text) clears it, and the returned `Disposable` clears it too - but only while it still owns the segment, so a stale handle disposing late can't wipe a newer status. Segments from multiple mods render on one row in load order, and a call from async code repaints on its own. Text is printed verbatim (style it with ansi), collapsed to a single line: newlines and tabs become spaces. Headless: stored, rendered nowhere.
|
|
17
|
+
|
|
18
|
+
```ts
|
|
19
|
+
cmd.hooks({
|
|
20
|
+
onSessionStart: () => cmd.ui.setStatus('#channel ✓ connected'),
|
|
21
|
+
onSessionEnd: () => cmd.ui.setStatus(null),
|
|
22
|
+
});
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
`cmd.ui.capabilities.status` - whether this host renders footer segments (true in the interactive TUI, false headless). Use it to pick a surface instead of shipping a permanent fallback:
|
|
26
|
+
|
|
27
|
+
```ts
|
|
28
|
+
if (cmd.ui.capabilities.status) cmd.ui.setStatus(text);
|
|
29
|
+
else cmd.ui.notify(text);
|
|
30
|
+
```
|
|
17
31
|
|
|
18
32
|
`cmd.ui.widget({placement: 'above-editor' | 'below-editor', render: () => lines})` - a line-based widget the TUI renders around the input panel. Same verbatim-lines contract as `addRenderer` (style with ansi); `render` re-runs on every repaint, and `cmd.ui.refreshWidgets()` requests a repaint after your data changes. A throwing render is skipped (reported as a `mod_error`) so siblings keep rendering. Headless: no-op.
|
|
19
33
|
|
|
@@ -43,6 +57,6 @@ Rendering is deliberately **line-based, not component-based**: mods return style
|
|
|
43
57
|
| `notify` | notice feed row | printed notice |
|
|
44
58
|
| `confirm` | modal | resolves `false` |
|
|
45
59
|
| `select` / `input` | modal | resolves `undefined` |
|
|
46
|
-
| `setStatus` |
|
|
60
|
+
| `setStatus` | footer segment under the input | stored, rendered nowhere |
|
|
47
61
|
| `widget` | no-op (wire-up pending) | no-op |
|
|
48
62
|
| `showEntry` | rendered feed row | dropped |
|
|
@@ -26,7 +26,8 @@ Your mod must appear, with no load warnings. If it does not appear, the warning
|
|
|
26
26
|
- **Tool** - ask the model to use it by name ("call count_todos"). The tool call renders in the feed like any built-in.
|
|
27
27
|
- **Hook** - trigger the behavior it guards (for a `beforeToolCall` blocker, ask for the blocked action and watch the block reason land as the tool result).
|
|
28
28
|
- **Input interception** - type the pattern `transformInput` matches and confirm the rewrite/consume happened.
|
|
29
|
-
- **Status
|
|
29
|
+
- **Status** - `cmd.ui.setStatus('text')` must show up as a segment on the row under the input, replace itself on the next call, and disappear on `setStatus(null)`.
|
|
30
|
+
- **Widget** - `cmd.ui.widget` / `cmd.ui.refreshWidgets` must return without throwing and hand back a `Disposable`. They render **nothing** today (TUI wire-up pending - see the [UI surface](./ui.md#ui-surface) note), so don't expect an editor widget to appear yet; only verify the calls are safe.
|
|
30
31
|
- **Renderer** - `cmd.showEntry` rows render styled; an unregistered type pretty-prints as JSON.
|
|
31
32
|
|
|
32
33
|
### Test: block-dangerous-commands guards rm -rf
|