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 CHANGED
@@ -1,13 +1,27 @@
1
1
  # command-code
2
2
 
3
- ## 1.9.0
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 between dark and light themes |
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` | Share feedback or report bugs |
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 `light`) |
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.6-Max-Preview` | Qwen 3.6 Max Preview | | | $1.3/$7.8 | vibe coding & efficient agent execution |
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.8-Max` | Qwen 3.8 Max | 1M | low, medium, xhigh | $2/$6 | autonomous long-horizon coding & professional work |
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]: Share feedback or report bugs (optional 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]: Share feedback or report bugs (optional 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
- - The skill still appears in the `/` menu with a `[skill]` badge and a ` - shadowed by /<owner>` note, so you can see it exists and understand why `/<name>` runs the built-in command instead. Command Code prefers visibility with a marker over silently dropping the row.
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 so you can see it exists, while `/<name>` continues to route to the higher-precedence owner. See [Selection priority](#selection-priority) for the full order.
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 npm:@team/review-mod@1.2.0 # npm registry
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
- 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`.
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
- > **Not wired into the TUI yet.** `cmd.ui.setStatus`, `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** (no-op everywhere, interactive and headless alike). The contract below is the intended design; wire-up is pending. Build against it, but don't rely on anything appearing on screen today.
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 concatenate in load order. Headless: renders nowhere (no-op).
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` | no-op (wire-up pending) | no-op |
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 / widget** - `cmd.ui.setStatus` / `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 a footer segment or editor widget to appear yet; only verify the calls are safe.
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