feat(jcode): add jcode as a run mode

jcode (1jehuang/jcode) joins the CLI registry as the `jcode` run mode:
Run menu, phone overview, TUI, quick-start and POST /api/sessions
(`jcodeConfig: { model?, resumeSessionId? }`), local, SSH and Docker
(dedicated agent-image layer), plus codeman doctor and install.sh
through the generated catalogue. Measured on a live jcode 0.98.1 pane.

- Work detection reads jcode's braille status row and `<n>>` composer;
  alt screen with mouse strip and PageUp/PageDown paging like opencode.
- Every jcode TUI is a client of one shared per-user daemon whose tools
  run with the daemon's env, so no agent skill injection and no JCODE_*
  envOverrides prefix.
- New `capabilities.sharedDaemon`: a session kill spares descendants
  outside the pane's process group, so closing the tab that started the
  daemon no longer cuts every other jcode session off (measured).
- last-response answers an honest empty for an external CLI with no
  transcript reader that the pane segmenter cannot read (jcode alone).
- GET /api/jcode/status via the generic registry resolver.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Codeman maintainer committed 2026-11-09 02:52:13 +01:00
1 parent 86502b6904
commit 2a876731f6
66 files changed
+1304 -127

No files matched your search

+17
View File
@@ -1637,6 +1637,23 @@ Read and write the CLI registry (`docs/cli-registry.md`). Every **write** route
| `PUT` | `/api/clis/custom/:id` | `{ label, shortBadge, binaries, argv, enabled? }` | Replace an existing custom entry. An absent `enabled` keeps the entry's current state. `400` for a stock id, `404` for an unknown one. |
| `DELETE` | `/api/clis/:id` | none | Delete a custom entry. `400` for a stock id, `404` for an unknown one. |
### Per-CLI availability probes
Each agent CLI has a read-only probe, `GET /api/<mode>/status`, which answers
`{ available, path }` for the binary the server would launch (no session needed, not gated).
`pi`, `grok`, `omp`, `copilot` and `jcode` add `version`, since their binary names are short or shared
with unrelated programs and the resolver rejects a candidate whose `--version` has the wrong
shape; `deepseek` answers a wider shape (`runnable`, `profiles`, ...). `GET /api/jcode/status`
is answered by the generic registry resolver, the same one a jcode spawn uses, so it applies
the entry's `jcode v<semver>` version anchor.
A jcode session takes `jcodeConfig: { model?, resumeSessionId? }` on `POST /api/sessions`
and `POST /api/quick-start` (`--model`, `--resume`; the resume value is a jcode session id or
short name and must start with a letter or digit). jcode takes no `envOverrides` prefix, and
`GET /api/sessions/:id/last-response` answers an empty `text` (and `messages: []` with
`?context=full`) for it: read its screen with `GET /api/sessions/:id/terminal?tail=` instead.
See `docs/jcode-integration.md`.
## MCP server sync
Copies MCP servers between the agent CLIs' own user-level config files (`docs/cli-registry.md`, "MCP server sync"). **Opt-in:** both routes answer `403 FORBIDDEN` while the synced `mcpSyncEnabled` setting is off (the default), and for a non-admin in multi-user mode, because the routes write files in the server user's home. A second `POST` while one is running answers `409 CONFLICT`.