catherd-cli 1.2.1 → 1.4.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.
Files changed (104) hide show
  1. package/README.md +146 -36
  2. package/catalog/models.json +148 -5
  3. package/catalog/scores.json +24 -0
  4. package/catalog/sources.json +12 -2
  5. package/package.json +3 -2
  6. package/plugin/.claude-plugin/plugin.json +1 -1
  7. package/plugin/.codex-plugin/plugin.json +11 -0
  8. package/plugin/.mcp-codex.json +10 -0
  9. package/plugin/bin/catherd-mcp +1 -1
  10. package/plugin/skills/catherd/SKILL.md +45 -39
  11. package/plugin/skills/catherd-setup/SKILL.md +24 -8
  12. package/src/adapters/access.ts +61 -18
  13. package/src/adapters/all.ts +6 -0
  14. package/src/adapters/antigravity/events.ts +131 -0
  15. package/src/adapters/antigravity/home.ts +46 -0
  16. package/src/adapters/antigravity/index.ts +320 -0
  17. package/src/adapters/antigravity/models.ts +37 -0
  18. package/src/adapters/backend.ts +34 -1
  19. package/src/adapters/claude-code/index.ts +2 -0
  20. package/src/adapters/cli.ts +1 -64
  21. package/src/adapters/codex/index.ts +2 -0
  22. package/src/adapters/cursor/events.ts +120 -0
  23. package/src/adapters/cursor/home.ts +79 -0
  24. package/src/adapters/cursor/index.ts +331 -0
  25. package/src/adapters/cursor/models.ts +30 -0
  26. package/src/adapters/discovery.ts +21 -0
  27. package/src/adapters/grok/events.ts +112 -0
  28. package/src/adapters/grok/home.ts +132 -0
  29. package/src/adapters/grok/index.ts +339 -0
  30. package/src/adapters/grok/models.ts +48 -0
  31. package/src/adapters/opencode/index.ts +2 -0
  32. package/src/cli.ts +49 -19
  33. package/src/domain/catalog.ts +10 -1
  34. package/src/domain/cost.ts +1 -0
  35. package/src/domain/errors.ts +1 -0
  36. package/src/domain/failover.ts +5 -2
  37. package/src/domain/host.ts +17 -0
  38. package/src/domain/ids.ts +2 -2
  39. package/src/domain/notice.ts +5 -2
  40. package/src/domain/profile-rules.ts +17 -0
  41. package/src/domain/profile.ts +89 -5
  42. package/src/domain/record.ts +3 -0
  43. package/src/domain/util.ts +3 -0
  44. package/src/entry/catalog-command.ts +4 -2
  45. package/src/entry/deps.ts +6 -3
  46. package/src/entry/doctor-command.ts +11 -2
  47. package/src/entry/host-arg.ts +28 -0
  48. package/src/entry/init-command.ts +18 -7
  49. package/src/entry/knowledge-command.ts +50 -0
  50. package/src/entry/lock-command.ts +7 -2
  51. package/src/entry/mcp/handshake.ts +3 -1
  52. package/src/entry/mcp/run-tools.ts +5 -2
  53. package/src/entry/mcp/server.ts +129 -40
  54. package/src/entry/mcp/setup-tools.ts +7 -2
  55. package/src/entry/profile-command.ts +108 -12
  56. package/src/entry/runs-command.ts +81 -5
  57. package/src/entry/tui/effects.ts +30 -10
  58. package/src/entry/tui/fixtures.ts +34 -10
  59. package/src/entry/tui/profile-tree.ts +10 -1
  60. package/src/entry/tui/run.tsx +10 -4
  61. package/src/entry/tui/state.ts +19 -6
  62. package/src/entry/tui/stories.ts +11 -4
  63. package/src/entry/tui/views/profile-actions.ts +4 -2
  64. package/src/entry/tui/views/profiles.tsx +16 -3
  65. package/src/entry/tui/views/save-dialog.tsx +2 -2
  66. package/src/infra/cli.ts +65 -0
  67. package/src/infra/codex-queue.ts +165 -0
  68. package/src/infra/delivery.ts +83 -0
  69. package/src/infra/dispatch-dir.ts +1 -0
  70. package/src/infra/env.ts +4 -1
  71. package/src/infra/host-context.ts +58 -0
  72. package/src/infra/paths.ts +3 -1
  73. package/src/infra/peer-inbox.ts +4 -1
  74. package/src/infra/supervisor.ts +3 -2
  75. package/src/services/admission.ts +34 -7
  76. package/src/services/agent-links.ts +30 -5
  77. package/src/services/backends.ts +49 -4
  78. package/src/services/capture.ts +112 -54
  79. package/src/services/catalog-refresh.ts +2 -1
  80. package/src/services/dispatch-service.ts +17 -7
  81. package/src/services/dispatches.ts +8 -1
  82. package/src/services/doctor-access.ts +14 -7
  83. package/src/services/doctor-backends.ts +39 -7
  84. package/src/services/doctor-checks.ts +43 -3
  85. package/src/services/doctor-push.ts +69 -90
  86. package/src/services/doctor.ts +107 -32
  87. package/src/services/finalize.ts +2 -1
  88. package/src/services/lane-service.ts +4 -10
  89. package/src/services/notifier.ts +322 -70
  90. package/src/services/peek.ts +46 -9
  91. package/src/services/ports.ts +8 -2
  92. package/src/services/profile-service.ts +117 -31
  93. package/src/services/profile-store.ts +126 -5
  94. package/src/services/routing-service.ts +6 -1
  95. package/src/services/run-debug.ts +98 -4
  96. package/src/services/run-service.ts +39 -4
  97. package/src/services/run-store.ts +21 -5
  98. package/src/services/runs-page.ts +3 -2
  99. package/src/services/session-view.ts +18 -13
  100. package/src/services/sessions.ts +32 -16
  101. package/src/services/setup.ts +31 -10
  102. package/src/services/source-derive.ts +32 -7
  103. package/src/services/summary.ts +40 -5
  104. package/src/services/treat-likes.ts +22 -9
package/README.md CHANGED
@@ -6,19 +6,18 @@
6
6
  (")(")
7
7
  ```
8
8
 
9
- Autopilot builds from your own Claude Code session. Claude plans and verifies, Codex, opencode or
10
- headless Claude Code workers write the code, and [Jev](https://typesafe.ai) picks the model and effort for each piece
9
+ Autopilot builds from your own Claude Code or native Codex session. Your profile routes the architect, verifier and workers to their backends; Codex, opencode, Cursor, Grok Build,
10
+ Antigravity or headless Claude Code processes write the code, and [Jev](https://typesafe.ai) picks the model and effort for each piece
11
11
  of work, climbing a ladder only when a cheaper rung falls short.
12
12
 
13
13
  - **Your harness, as you set it up.** Every role runs in its vendor's own CLI with your config,
14
14
  hooks, skills and `AGENTS.md`. Isolation is an opt-in toggle per profile and harness, for when
15
15
  you'd rather save the tokens your customizations cost.
16
- - **Claude roles stay native.** `claude:` rungs run as ordinary Claude Code subagents; Codex,
17
- opencode and headless `claude-code:` rungs run through catherd's MCP server.
16
+ - **Claude roles stay native on Claude Code.** `claude:` rungs require that host and run as ordinary Claude Code subagents; Codex,
17
+ opencode, Cursor, Grok Build, Antigravity and headless `claude-code:` rungs run through catherd's MCP server.
18
18
  - **Survives restarts.** Workers are detached processes writing straight to disk, so a dropped
19
19
  MCP server never loses a run.
20
- - **Results come to you.** Roles run side by side while you keep talking to Claude; each one that finishes
21
- arrives in the session as a message, like a native subagent's notice, and `peek` shows how a run stands.
20
+ - **Results come to you.** Roles run side by side while you keep talking. Claude Code uses its peer inbox; Codex uses queued next input through its existing native server. A busy Codex conversation processes it after the active turn. Queue acceptance and result collection are separate; `peek` shows how a run stands.
22
21
  - **A protocol the tools enforce.** Every lane is routed, every brief ends with the reply contract, and a
23
22
  milestone lands only after a reviewer and a verifier passed it. Workers can run their own checks (network,
24
23
  loopback, Docker, the lock dir); an owner question parks one milestone, not the run.
@@ -28,28 +27,100 @@ of work, climbing a ladder only when a cheaper rung falls short.
28
27
  ## Requirements
29
28
 
30
29
  - [Bun](https://bun.sh) ≥ 1.4
31
- - [Claude Code](https://claude.com/claude-code) (desktop app or CLI)
30
+ - An orchestration host: [Claude Code](https://claude.com/claude-code), or native [Codex](https://github.com/openai/codex) CLI/Desktop with plugin support and the existing native queue endpoint (installed CLI 0.159.2 verified for packaging; queue support is feature-detected)
32
31
  - At least one worker backend, logged in:
33
32
  - [Codex CLI](https://github.com/openai/codex) 0.157.0 or newer
34
33
  - [opencode](https://opencode.ai) **v2**, 2.0.16 or newer: `curl -fsSL https://opencode.ai/v2/install | bash`
35
34
  (the npm package `opencode-ai` is v1 and is not supported)
36
35
  - Claude Code's `claude` CLI 2.1.282 or newer, for headless `claude-code:` rungs
36
+ - Cursor's CLI, `cursor-agent` 2026.09.28 or newer: `curl https://cursor.com/install -fsS | bash`, then
37
+ `cursor-agent login` (below)
38
+ - Grok Build's `grok` 1.0.44 or newer: `curl -fsSL https://x.ai/cli/install.sh | bash`, then `grok login`
39
+ (below)
40
+ - Google's Antigravity CLI, `agy` 1.2.13 or newer: `brew install --cask antigravity-cli`, or
41
+ `curl -fsSL https://antigravity.google/cli/install.sh | bash` (with `~/.local/bin` on PATH), then run `agy` once
42
+ to sign in (below)
37
43
  - Optional: a TypeSafe API key for Jev, in `TYPESAFE_API_KEY` or saved by `catherd init`
38
44
  - Optional: a free [Artificial Analysis](https://artificialanalysis.ai) API key for more scores, in
39
45
  `ARTIFICIAL_ANALYSIS_API_KEY` or saved by `catherd init`; its numbers are read for you alone and never shipped
40
46
 
41
47
  `catherd doctor` checks each backend's version and login and prints the fix for anything missing. The default
42
48
  profile runs its workers on Codex; without Codex, doctor's fix also names how to move those roles to a backend
43
- you have (`/catherd-setup` in Claude Code, or `catherd profile set roles.<role>.rungs <rung>`).
49
+ you have (`/catherd-setup`, or `catherd profile set roles.<role>.rungs <rung> --host <codex|claude-code>`). Codex-only setup does not require or configure Claude; enabled selected roles and reachable failover decide optional dependencies. Doctor sends nothing by default; `--test-push` is an explicit smoke send from a validated host session.
50
+
51
+ ### Cursor
52
+
53
+ A Cursor rung names Cursor's own model slug, with the effort as the slug's suffix: `cursor:gpt-6-sol#xhigh` runs
54
+ `gpt-6-sol-xhigh`, and `#default` runs the bare slug (`cursor:composer-2.5#default`). `cursor-agent models` lists
55
+ what your account offers; `catherd catalog refresh` reads it. No profile uses Cursor until you put a rung on it.
56
+ Its Composer and Grok models bill from Cursor's own pool, the other models at API rates after your plan's included
57
+ usage, so a Cursor rung ranks as `metered`.
58
+
59
+ - **Native** (the default) runs with your login and your Cursor setup. It also loads your Claude Code hooks,
60
+ skills and plugins, which Cursor reads from `~/.claude`. `workspace-write` runs in Cursor's sandbox under your
61
+ `~/.cursor/sandbox.json`, which catherd never edits: `catherd doctor` shows which of a worker's checks (the lock
62
+ dir, temp, loopback, the network, Docker) it allows. `read-only` runs Cursor's ask mode, which asks the model not
63
+ to write but cannot stop it (`advisory`).
64
+ - **Isolated** (`catherd profile set harness.cursor.isolated true`) needs `CURSOR_API_KEY`, since a login cannot
65
+ move to another home. catherd runs Cursor under its own HOME with its own `sandbox.json`, which gives a worker
66
+ catherd's writable roots.
67
+
68
+ ### Grok Build
69
+
70
+ A Grok rung names grok's model and effort: `grok:grok-4.6#high` runs `grok -m grok-4.6 --effort high`, and
71
+ `#default` passes no effort. `grok models` lists your models but no efforts, so catherd offers Grok Build's `low`
72
+ to `xhigh`; `catherd catalog refresh` reads the list. No profile uses grok until you put a rung on it. A Grok login
73
+ (SuperGrok, X Premium+) bills your subscription and `XAI_API_KEY` bills per token: `catherd doctor` says when a
74
+ profile's `billing.grok` differs from your login. On a usage limit, a Grok rung fails over to the same model on
75
+ Cursor, and a Cursor Grok rung to grok, unless the profile names another stand-in.
76
+
77
+ - **Native** (the default) runs with your login and your grok setup. It also loads your Claude Code plugins,
78
+ agents, skills, hooks and permission rules, and your Cursor rules and MCP. `workspace-write` runs in grok's
79
+ sandbox under catherd's own profile, `catherd-ws`, which lets a worker write the lock dir, temp and the
80
+ toolchain caches: catherd adds its marked `[profiles.catherd-*]` tables to `~/.grok/sandbox.toml` and leaves the
81
+ rest of that file alone. `read-only` runs grok's kernel `read-only` profile. On a Mac whose
82
+ `/var/run/docker.sock` is a link (Docker Desktop, OrbStack, Colima) grok refuses that profile, so catherd gives
83
+ the role only the read tools instead (`advisory`); `catherd doctor` says which applies. On macOS no grok profile
84
+ controls the network.
85
+ - **Isolated** (`catherd profile set harness.grok.isolated true`) needs `XAI_API_KEY`: catherd never copies your
86
+ grok login, whose refresh token rotates. catherd runs grok under its own HOME with its own `sandbox.toml`.
87
+
88
+ grok keeps a session on the access it started with, so catherd refuses to resume one under another access.
89
+
90
+ ### Antigravity
91
+
92
+ An Antigravity rung names the model `agy models` lists, without an effort suffix; the effort is agy's `--effort`
93
+ (`low`, `medium`, `high` or `max`), and `#default` passes none: `antigravity:gemini-3.8-flash#low`. No profile uses
94
+ Antigravity until you put a rung on it. catherd never runs `agy -p` while agy is signed out, since agy would open a
95
+ browser and wait; `catherd doctor` says so, with the fix. A Google login draws on your plan's quota (doctor shows
96
+ what is left); `GEMINI_API_KEY` bills the Gemini API project. Gemini rungs fail over between Antigravity and Cursor
97
+ when either runs out, unless your profile names another stand-in.
98
+
99
+ - **Native** (the default) runs with your Google login and your `~/.gemini` settings, which the Antigravity desktop
100
+ app shares and catherd never edits. `workspace-write` runs shell commands in agy's sandbox, which reaches the
101
+ workspace, temp and build caches but no network unless your own `read_url` rules grant it; the file tools are not
102
+ confined (`advisory`). agy has no read-only mode, so a read-only role (the reviewer, the architect) cannot run on
103
+ native Antigravity: `profile validate` refuses it.
104
+ - **Isolated** (`catherd profile set harness.antigravity.isolated true`) needs `GEMINI_API_KEY`. catherd runs agy
105
+ under its own HOME, with its own settings: the Gemini API as the provider, write and command deny rules for
106
+ read-only roles, and catherd's writable roots and the network for `workspace-write`.
107
+
108
+ Whether Google's plan terms allow an orchestrator to drive `agy` on a consumer plan is not settled here. The API-key
109
+ route is the one meant for automation; check the terms before you rely on a plan login.
44
110
 
45
111
  ## Install
46
112
 
113
+ The published `v1.3.0` marketplace and global `catherd-cli@1.3.0` remain the stable Claude integration. The native Codex feature in this checkout is unreleased and held pending actual packaged CLI/Desktop/Claude acceptance. A matching version alone does not prove that the feature core ran. Use the [local packaged acceptance procedure](docs/dev/live-verification.md#14-native-codex-packaging-and-completion-acceptance) for this candidate; do not publish or update the remote tag to test it.
114
+
115
+ ### Claude Code
116
+
47
117
  ```sh
48
118
  bun add -g catherd-cli
49
- catherd init
119
+ catherd init --host claude-code
50
120
  ```
51
121
 
52
- The npm package is `catherd-cli`; the command it installs is `catherd`. `bunx catherd-cli init` works too: `init`
122
+ The npm package is `catherd-cli`; the command it installs is `catherd`. `bunx catherd-cli init --host claude-code`
123
+ works too (a terminal with no host evidence cannot pick the architect/verifier defaults, so name the host): `init`
53
124
  installs the global command at its own version (`--no-global` skips it) and says `installing catherd…` before
54
125
  it does, though the first `bunx` resolve itself prints nothing for up to half a minute. `init` asks for the
55
126
  optional Jev key and the optional Artificial Analysis key, syncs the public model sources, writes the default
@@ -65,40 +136,76 @@ claude plugin install catherd@catherd
65
136
  ```
66
137
 
67
138
  Start a new Claude Code session so the plugin, its MCP server and the agent files load, then check with
68
- `catherd doctor`. Run it once from inside that session too (ask Claude to run `catherd doctor`): its `push` row
69
- then checks that finished roles can reach the session.
139
+ `catherd doctor --host claude-code`. From inside that session, explicit `catherd doctor --test-push` sends a labeled smoke notice; inspect actual processing separately from transport acceptance.
140
+
141
+ ### Native Codex — after the feature release
142
+
143
+ These remote commands become feature installation guidance only after the held release is published:
144
+
145
+ ```sh
146
+ bun add -g catherd-cli
147
+ catherd init --host codex
148
+ codex plugin marketplace add 47vigen/catherd
149
+ codex plugin add catherd@catherd
150
+ codex mcp list --json
151
+ ```
152
+
153
+ Restart the Codex host to load the installed shared skills and server. Native CLI accepts `owner/repo[@ref]` and a local marketplace path. The supported marketplace uses `.claude-plugin/marketplace.json` with its plugin subdirectory; the native manifest is `plugin/.codex-plugin/plugin.json`, with `skills: "./skills/"` and `mcpServers: "./.mcp-codex.json"`. Installed native resolution supplies `command: "sh"`, `args: ["./bin/catherd-mcp"]`, `cwd: <installed plugin root>` and `CATHERD_ORCHESTRATION_HOST=codex`. No Claude root macro or synthetic session ID belongs in that declaration. The shared launcher/core remains versioned together with both manifests.
154
+
155
+ Pass the actual project `repo` to repository-aware MCP profile/setup/catalog calls, because the server cwd is the plugin root. `run_start(repo, ...)` already requires it. Terminal `init` and `doctor` accept `--host codex|claude-code|auto`; selecting a terminal host chooses setup checks without inventing a conversation owner.
70
156
 
71
157
  ## Use
72
158
 
73
- In Claude Code:
159
+ In either supported host, use the installed shared skills through that host's skill invocation and tool discovery:
74
160
 
75
161
  - `/catherd <task>` runs a task on autopilot; `/catherd` alone resumes the latest run. While it runs, keep
76
- talking: each finished role arrives as a message from catherd, and "how is it going?" gets a `peek`.
162
+ talking: completion arrives through the host's transport, and "how is it going?" gets a `peek`.
77
163
  - `/catherd-setup` tunes your profile in conversation: which models and efforts each role may
78
164
  use, cost or speed, isolation, budget and failover.
79
165
 
166
+ `route` chooses the backend for every role. Native `claude:` uses Claude Code's `Agent` and `record_agent_run` only on Claude Code; process backends, including Codex architect/verifier, use `dispatch` followed by `result`. Omitted Codex architect/verifier choices are exactly `codex:gpt-6.1-sol#high` / `codex:gpt-6.1-sol#low`; omitted Claude choices retain their existing native defaults. Verify that exact model ID against native catalog discovery and validation; if spelling differs, resolve the mismatch explicitly with the owner, never silently normalize or substitute, and retain high/low efforts. Explicit ladders and materialized profiles are preserved, without silently converting `claude:` to `claude-code:`. To opt into host defaults, review and save the narrow reset:
167
+
168
+ ```sh
169
+ catherd profile reset-host-defaults <profile> --host codex --preview --json > /tmp/catherd-host-defaults-review.json
170
+ # Review the diff, effective defaults, errors and warnings.
171
+ catherd profile reset-host-defaults <profile> --host codex --expect /tmp/catherd-host-defaults-review.json --json
172
+ ```
173
+
174
+ It removes only architect/verifier `rungs` and `defaultRung`; every other setting stays intact. Run profile CLI commands from the project directory and choose the actual profile name. Use `--host claude-code` for Claude defaults.
175
+
176
+ Completion never uses `await_results` or model polling. Codex sends through `codex queue --remote unix://` to the validated original thread: idle wake and ordered busy follow-up are the native semantics, without Claude's urgent tool-round priority. A receipt proves queue acceptance, not observed generation or collection; unloaded/interrupted hosts may retain input. Only `result` collects the actual stored record. Explicit `peek(run)` adopts the run for the current host/session; `status` and `result` do not. Unknown/conflicting identity never owns or pushes.
177
+
178
+ Recover unread work with `peek` and `result`. Accepted or ambiguous attempts are not automatically resent. When ambiguity needs a deliberate retry, run from the current owner's validated host session:
179
+
180
+ ```sh
181
+ catherd runs retry-push <run> <name> --event '<exact event ID from peek/status>' --acknowledge-possible-duplicate
182
+ ```
183
+
184
+ This acknowledges possible duplicate native input; an accepted receipt still suppresses a repeat for that owner/event. Without a supported history reconciliation API, retain ambiguity until an explicit decision. Notices preserve all event IDs, including coalesced events; repeated input means idempotent reads, never another dispatch or landing. Stored records and independent reviewer/verifier gates are authoritative. Profile notification moments use an available host facility, without inventing a Codex notification tool or scheduled wake.
185
+
80
186
  In a terminal:
81
187
 
82
- | Command | What it does |
83
- | ----------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------- |
84
- | `catherd` | The dashboard: Status, Profiles and Runs (below) |
85
- | `catherd init [--no-input] [--no-global] [--profile <p>]` | First-run setup; installs the global `catherd` at its own version unless `--no-global` |
86
- | `catherd doctor [--json]` | Readiness report, one row per check with its fix; exits 3 when not ready |
87
- | `catherd profile list\|show\|use [--repo]\|new [--from <p>]\|copy\|rm\|diff\|validate` | Profiles; `use --repo` binds one to the repo you are in |
88
- | `catherd profile use --repo --clear` | Unbinds the repo you are in; it runs on the active profile again |
89
- | `catherd profile set <path> <value> [--profile <p>]` | One field, e.g. `roles.verifier.access read-only`, `roles.worker.network false`, `budget.usd 20` |
90
- | `catherd status [run]`, `catherd watch [--once] [--interval <s>]` | Where runs stand, grouped by the Claude Code session that drove them |
91
- | `catherd runs list [--repo <path>]\|show <id> [--debug [--name <n>]]\|cancel <id> <name>` | Past runs, by session; `--debug` adds exit.json and the stderr and event tails, `--name` one role's |
92
- | `catherd catalog refresh\|list [--backend <b>] [--role <r>] [--text <t>] [--scored]` | The models catherd can place, filtered |
93
- | `catherd catalog sync [--force] [--unmatched]` | Fetches the public model facts and scores now (below); `--unmatched` lists ids no model matched |
94
- | `catherd catalog treat-like <rung> <like>` | Scores an unscored rung as a scored one |
95
- | `catherd catalog treat-like --suggest <rung>\|--clear <rung>\|--reset` | The three nearest stand-ins for a rung; removes one or every mapping of yours |
96
- | `catherd lock [--slots N] -- <cmd>` | Runs a heavy command behind the machine-wide semaphore, in its own session (no /dev/tty) |
97
- | `catherd mcp` | The MCP server on stdio; the plugin starts it, you never need to |
98
- | `catherd capture-fixtures [--backend <b>] [--out <dir>]` | Contributors: records sanitized test fixtures from real runs (see CONTRIBUTING.md) |
188
+ | Command | What it does |
189
+ | ------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------- |
190
+ | `catherd` | The dashboard: Status, Profiles and Runs (below) |
191
+ | `catherd init [--host codex\|claude-code\|auto] [--no-input] [--no-global] [--profile <p>]` | First-run setup; installs the global `catherd` at its own version unless `--no-global` |
192
+ | `catherd doctor [--host codex\|claude-code\|auto] [--test-push] [--json]` | Readiness and capability report; no send unless explicit smoke; exits 3 when not ready |
193
+ | `catherd profile list\|show\|use [--repo]\|new [--from <p>]\|copy\|rm\|diff\|validate` | Profiles; `use --repo` binds one to the repo you are in |
194
+ | `catherd profile use --repo --clear` | Unbinds the repo you are in; it runs on the active profile again |
195
+ | `catherd profile set <path> <value> [--profile <p>]` | One field, e.g. `roles.verifier.access read-only`, `roles.worker.network false`, `budget.usd 20` |
196
+ | `catherd status [run]`, `catherd watch [--once] [--interval <s>]` | Where runs stand, grouped by host and session; read-only ownership |
197
+ | `catherd runs list [--repo <path>]\|show <id> [--debug [--name <n>]]\|cancel <id> <name>` | Past runs, by session; `--debug` adds exit.json and the stderr and event tails, `--name` one role's |
198
+ | `catherd catalog refresh\|list [--backend <b>] [--role <r>] [--text <t>] [--scored]` | The models catherd can place, filtered |
199
+ | `catherd catalog sync [--force] [--unmatched]` | Fetches the public model facts and scores now (below); `--unmatched` lists ids no model matched |
200
+ | `catherd catalog treat-like <rung> <like>` | Scores an unscored rung as a scored one |
201
+ | `catherd catalog treat-like --suggest <rung>\|--clear <rung>\|--reset` | The three nearest stand-ins for a rung; removes one or every mapping of yours |
202
+ | `catherd knowledge show\|add "<line>"\|path [--repo <path>]` | The repo's knowledge.md, which new runs read; `add` appends a fact of yours, marked "by hand" |
203
+ | `catherd lock [--slots N] -- <cmd>` | Runs a heavy command behind the machine-wide semaphore, in its own session (no /dev/tty) |
204
+ | `catherd mcp` | The MCP server on stdio; the plugin starts it, you never need to |
205
+ | `catherd capture-fixtures [--backend <b>] [--out <dir>]` | Contributors: records sanitized test fixtures from real runs (see CONTRIBUTING.md) |
99
206
 
100
207
  A profile command without a profile name (`show`, `set`, `diff`, `validate`), like the MCP profile tools, acts
101
- on the profile the repo you are in runs on: the one bound to it, else the active one. Run them as
208
+ on the profile the repo you are in runs on: the one bound to it, else the active one. Pass `repo` explicitly to MCP tools; profile CLI commands accept `--host` for effective defaults. Run them as
102
209
  `bunx catherd-cli <command>` when catherd is not installed globally. Every read command takes `--json`; a bare `catherd runs` is `catherd runs list`. Exit codes: 0 ok, 1 error, 2 usage, 3 not ready, 130 interrupted; an error prints
103
210
  `error E_CODE: message` and a `fix:` line. `--verbose` (or `CATHERD_LOG=debug`) logs more to
104
211
  `~/.local/share/catherd/logs/`, kept for 7 days with secrets redacted. The dashboard takes `--plain` (ASCII, no colour)
@@ -106,7 +213,7 @@ and `--reduced-motion`; `doctor` and `init` take `--plain` for ASCII glyphs too.
106
213
 
107
214
  Model facts and scores also come from public sources: models.dev, OpenRouter, LiteLLM, Arena (LMArena), Vectara's
108
215
  hallucination leaderboard and Epoch AI, plus Artificial Analysis when you give `catherd init` a free key. The MCP
109
- server syncs them in the background when a Claude Code session starts (each source at most every 12 hours, never
216
+ server syncs them in the background when a host session starts (each source at most every 12 hours, never
110
217
  delaying the session), `init` syncs them, and `catherd catalog sync` (or the `catalog_sync` tool) does it on demand.
111
218
  Each answer is kept in `~/.local/share/catherd/sources/`; a source that fails keeps its last good answer, and with no
112
219
  network and no sync at all catherd routes on the scores it ships. Those are the keyless sources' values, refreshed
@@ -133,6 +240,9 @@ Run data lives in `~/.local/share/catherd/`, config in `~/.config/catherd/` (bot
133
240
  | `TYPESAFE_API_KEY` | The Jev key, instead of the one `catherd init` saves |
134
241
  | `ARTIFICIAL_ANALYSIS_API_KEY` | An Artificial Analysis key for `catalog sync`, instead of the one `catherd init` saves |
135
242
  | `CATHERD_NO_SYNC` | `1`: no automatic sync of the public sources (at MCP server start and in `init`); `catalog sync` still runs |
243
+ | `CURSOR_API_KEY` | Cursor's API key: logs `cursor-agent` in, and is what an isolated Cursor role runs on |
244
+ | `XAI_API_KEY` | xAI's API key: logs `grok` in when no Grok login is active, and is what an isolated grok role runs on |
245
+ | `GEMINI_API_KEY` | The Gemini API key an isolated Antigravity role runs on (agy reads it only with its Gemini API provider) |
136
246
  | `CATHERD_HOME` | Puts config and data under `$CATHERD_HOME/config` and `$CATHERD_HOME/data` instead of XDG |
137
247
  | `CATHERD_LOG` | Log level: `off`, `error`, `warn`, `info` (default) or `debug` (what `--verbose` sets) |
138
248
  | `CATHERD_LOCK_SLOTS` | `catherd lock`'s slot count when `--slots` is not given (before the profile's `lock.heavy`) |
@@ -148,7 +258,7 @@ tests (CONTRIBUTING.md has the rest).
148
258
 
149
259
  `catherd` opens three tabs: **1 Status** (every check with its fix; `y` copies the fix, `r` checks again),
150
260
  **2 Profiles** (one tree per profile: roles with their access, default rung, models and efforts, then routing,
151
- harness, budget, failover, timeouts and notify) and **3 Runs** (the Claude Code sessions that drove your runs, newest
261
+ harness, budget, failover, timeouts and notify) and **3 Runs** (the host sessions that drove your runs, newest
152
262
  first; a session opens on its runs, their milestones and every role with its rung, status, time and last event, live
153
263
  ones first; a milestone opens on its digest (what landed, lanes and climbs, reviewer and verifier, tokens); a role
154
264
  opens on its brief, reply and record; the open screen redraws as run files change; `esc` goes back,
@@ -207,8 +317,8 @@ Code session. The details are in [MIGRATION.md](MIGRATION.md).
207
317
 
208
318
  ## Contributing
209
319
 
210
- See [CONTRIBUTING.md](CONTRIBUTING.md). CI runs the checks on Linux and macOS, on Bun 1.4.0 and the latest Bun;
211
- what CI cannot run is in [`docs/dev/live-verification.md`](docs/dev/live-verification.md). Report security issues
320
+ See [CONTRIBUTING.md](CONTRIBUTING.md). This feature's checks and acceptance are local, with release held; do not request or re-enable CI for it. The documented historical CI matrix uses Linux/macOS and Bun 1.4.0/latest;
321
+ live verification is in [`docs/dev/live-verification.md`](docs/dev/live-verification.md). Report security issues
212
322
  privately, as [SECURITY.md](SECURITY.md) describes. Everyone taking part follows the
213
323
  [Code of Conduct](CODE_OF_CONDUCT.md).
214
324
 
@@ -1,10 +1,12 @@
1
1
  {
2
2
  "schema": 1,
3
- "version": "2026-09-25",
3
+ "version": "2026-10-01",
4
4
  "sources": {
5
5
  "claude": "https://platform.claude.com/docs/en/models/overview (2026-09-25); efforts https://platform.claude.com/docs/en/build-with-claude/effort; prices https://platform.claude.com/docs/en/about-claude/pricing",
6
- "codex": "codex debug models --bundled, Codex CLI 0.157.0 (2026-09-25); prices https://developers.openai.com/api/docs/pricing; plan weights https://learn.chatgpt.com/docs/pricing",
7
- "opencode": "opencode models <provider> --verbose on 1.18.32 and the v2 model.list (2026-09-25); https://opencode.ai/docs/zen, https://opencode.ai/docs/go"
6
+ "codex": "codex debug models --bundled, Codex CLI 0.157.0 (2026-09-25), gpt-6.1-sol from Codex CLI 0.159.2 (2026-10-01); prices https://developers.openai.com/api/docs/pricing; plan weights https://learn.chatgpt.com/docs/pricing",
7
+ "opencode": "opencode models <provider> --verbose on 1.18.32 and the v2 model.list (2026-09-25); https://opencode.ai/docs/zen, https://opencode.ai/docs/go",
8
+ "cursor": "cursor-agent models on 2026.09.28-64d2043 (research 2026-09-29 §2.4; ids to confirm in the live kit, docs/dev/live-verification.md §11); prices https://openrouter.ai/api/v1/models and https://models.dev/api.json (2026-09-28)",
9
+ "antigravity": "agy 1.2.13 docs (models, and slugs such as gemini-3.8-flash-high; research 2026-09-29 §4.5) and the Gemini API's thinking levels; ids and efforts to confirm in the live kit, docs/dev/live-verification.md §13"
8
10
  },
9
11
  "backends": {
10
12
  "codex": {
@@ -40,6 +42,24 @@
40
42
  "ultra": "maximum reasoning with automatic task delegation to parallel subagents; never in a default ladder"
41
43
  }
42
44
  },
45
+ {
46
+ "id": "gpt-6.1-sol",
47
+ "name": "GPT-6.1 Sol",
48
+ "vendor": "openai",
49
+ "releaseDate": "2026-09-29",
50
+ "capabilities": { "toolUse": true, "imageIn": true, "reasoning": true },
51
+ "price": { "input": 2, "cached": 0.1, "output": 10 },
52
+ "on": {
53
+ "codex": {
54
+ "id": "gpt-6.1-sol",
55
+ "efforts": ["low", "medium", "high", "xhigh", "max", "ultra"],
56
+ "context": 272000
57
+ }
58
+ },
59
+ "notes": {
60
+ "ultra": "maximum reasoning with automatic task delegation to parallel subagents; never in a default ladder"
61
+ }
62
+ },
43
63
  {
44
64
  "id": "gpt-6-sol",
45
65
  "name": "GPT-6 Sol",
@@ -58,7 +78,8 @@
58
78
  "id": "opencode/gpt-6-sol",
59
79
  "efforts": ["none", "low", "medium", "high", "xhigh", "max"],
60
80
  "context": 1050000
61
- }
81
+ },
82
+ "cursor": { "id": "gpt-6-sol", "efforts": ["low", "high", "xhigh"], "context": 200000 }
62
83
  },
63
84
  "notes": {
64
85
  "ultra": "maximum reasoning with automatic task delegation to parallel subagents; never in a default ladder"
@@ -87,7 +108,8 @@
87
108
  "id": "opencode-go/gpt-6-luna",
88
109
  "efforts": ["none", "low", "medium", "high", "xhigh", "max"],
89
110
  "context": 1050000
90
- }
111
+ },
112
+ "cursor": { "id": "gpt-6-luna", "efforts": ["high"], "context": 200000 }
91
113
  }
92
114
  },
93
115
  {
@@ -205,6 +227,11 @@
205
227
  "id": "opencode/claude-opus-5-5",
206
228
  "efforts": ["low", "medium", "high", "xhigh", "max"],
207
229
  "context": 1000000
230
+ },
231
+ "cursor": {
232
+ "id": "claude-opus-5-5",
233
+ "efforts": ["low", "medium", "high", "xhigh", "max"],
234
+ "context": 200000
208
235
  }
209
236
  },
210
237
  "notes": { "effort": "the API default effort is medium" }
@@ -261,6 +288,122 @@
261
288
  "opencode": { "id": "opencode/claude-haiku-4-5", "efforts": ["high", "max"], "context": 200000 }
262
289
  },
263
290
  "notes": { "effort": "no effort parameter in Claude Code: its only rung there is #default" }
291
+ },
292
+ {
293
+ "id": "grok-4-7",
294
+ "name": "Grok 4.7",
295
+ "vendor": "xai",
296
+ "releaseDate": "2026-09-21",
297
+ "capabilities": { "toolUse": true, "imageIn": true, "reasoning": true },
298
+ "price": { "input": 2, "cached": 0.5, "output": 6 },
299
+ "on": {
300
+ "grok": { "id": "grok-4.7", "efforts": ["low", "medium", "high", "xhigh"], "context": 500000 },
301
+ "cursor": { "id": "grok-4.7", "efforts": ["low", "medium", "high", "xhigh"], "context": 200000 }
302
+ },
303
+ "notes": {
304
+ "pool": "a Cursor Model in Cursor: billed from Cursor's own pool (research §2.4)",
305
+ "effort": "grok lists no efforts: Grok Build's effort names, low to xhigh (research §3.4, §5; live-verification §12)"
306
+ }
307
+ },
308
+ {
309
+ "id": "grok-4-6",
310
+ "name": "Grok 4.6",
311
+ "vendor": "xai",
312
+ "releaseDate": "2026-08-12",
313
+ "capabilities": { "toolUse": true, "imageIn": true, "reasoning": true },
314
+ "price": { "input": 2, "cached": 0.5, "output": 6 },
315
+ "on": {
316
+ "grok": { "id": "grok-4.6", "efforts": ["low", "medium", "high", "xhigh"], "context": 500000 },
317
+ "cursor": {
318
+ "id": "cursor-grok-4.6",
319
+ "efforts": ["low", "medium", "high", "xhigh"],
320
+ "context": 200000
321
+ }
322
+ },
323
+ "notes": {
324
+ "pool": "a Cursor Model in Cursor: billed from Cursor's own pool (research §2.4)",
325
+ "effort": "grok lists no efforts: Grok Build's effort names, low to xhigh (research §3.4, §5; live-verification §12)"
326
+ }
327
+ },
328
+ {
329
+ "id": "grok-4-5",
330
+ "name": "Grok 4.5",
331
+ "vendor": "xai",
332
+ "releaseDate": "2026-07-08",
333
+ "capabilities": { "toolUse": true, "imageIn": true, "reasoning": true },
334
+ "price": { "input": 2, "cached": 0.3, "output": 6 },
335
+ "on": {
336
+ "grok": { "id": "grok-4.5", "efforts": ["low", "medium", "high", "xhigh"], "context": 500000 },
337
+ "cursor": { "id": "cursor-grok-4.5", "efforts": ["low", "medium", "high"], "context": 200000 }
338
+ },
339
+ "notes": {
340
+ "pool": "a Cursor Model in Cursor: billed from Cursor's own pool (research §2.4)",
341
+ "effort": "grok lists no efforts: Grok Build's effort names, low to xhigh (research §3.4, §5; live-verification §12)"
342
+ }
343
+ },
344
+ {
345
+ "id": "composer-2-5",
346
+ "name": "Composer 2.5",
347
+ "vendor": "cursor",
348
+ "capabilities": { "toolUse": true, "imageIn": true, "reasoning": true },
349
+ "price": { "input": 2, "cached": 0.5, "output": 6 },
350
+ "on": { "cursor": { "id": "composer-2.5", "efforts": [], "context": 200000 } },
351
+ "notes": {
352
+ "price": "no keyless source prices Composer (research §5); Grok 4.7's, the same Cursor pool, stands in",
353
+ "effort": "no effort: its only rung is #default"
354
+ }
355
+ },
356
+ {
357
+ "id": "gemini-3-8-flash",
358
+ "name": "Gemini 3.8 Flash",
359
+ "vendor": "google",
360
+ "releaseDate": "2026-09-02",
361
+ "capabilities": { "toolUse": true, "imageIn": true, "reasoning": true },
362
+ "price": { "input": 0.75, "cached": 0.075, "output": 3.75 },
363
+ "on": {
364
+ "cursor": { "id": "gemini-3.8-flash", "efforts": ["low", "medium", "high"], "context": 200000 },
365
+ "antigravity": { "id": "gemini-3.8-flash", "efforts": ["low", "medium", "high"], "context": 1048576 }
366
+ }
367
+ },
368
+ {
369
+ "id": "gemini-3-7-flash",
370
+ "name": "Gemini 3.7 Flash",
371
+ "vendor": "google",
372
+ "releaseDate": "2026-08-13",
373
+ "capabilities": { "toolUse": true, "imageIn": true, "reasoning": true },
374
+ "price": { "input": 0.75, "cached": 0.075, "output": 3.75 },
375
+ "on": {
376
+ "cursor": { "id": "gemini-3.7-flash", "efforts": ["low", "medium", "high"], "context": 200000 },
377
+ "antigravity": { "id": "gemini-3.7-flash", "efforts": ["low", "medium", "high"], "context": 1048576 }
378
+ }
379
+ },
380
+ {
381
+ "id": "gemini-3-6-flash",
382
+ "name": "Gemini 3.6 Flash",
383
+ "vendor": "google",
384
+ "releaseDate": "2026-07-21",
385
+ "capabilities": { "toolUse": true, "imageIn": true, "reasoning": true },
386
+ "price": { "input": 0.75, "cached": 0.075, "output": 3.75 },
387
+ "on": {
388
+ "cursor": {
389
+ "id": "gemini-3.6-flash",
390
+ "efforts": ["minimal", "low", "medium", "high"],
391
+ "context": 200000
392
+ },
393
+ "antigravity": { "id": "gemini-3.6-flash", "efforts": ["low", "medium", "high"], "context": 1048576 }
394
+ }
395
+ },
396
+ {
397
+ "id": "gemini-3-1-pro",
398
+ "name": "Gemini 3.1 Pro",
399
+ "vendor": "google",
400
+ "releaseDate": "2026-02-19",
401
+ "capabilities": { "toolUse": true, "imageIn": true, "reasoning": true },
402
+ "price": { "input": 2, "cached": 0.2, "output": 12 },
403
+ "on": {
404
+ "cursor": { "id": "gemini-3.1-pro", "efforts": [], "context": 200000 },
405
+ "antigravity": { "id": "gemini-3.1-pro", "efforts": ["low", "high"], "context": 1048576 }
406
+ }
264
407
  }
265
408
  ]
266
409
  }
@@ -3053,6 +3053,30 @@
3053
3053
  "gpt-6-luna#max": {
3054
3054
  "like": "gpt-5.6-luna#max",
3055
3055
  "note": "no Arena agent score is published for GPT-6 Luna; GPT-5.6 Luna at the same effort stands in for agentic and steer (the nearest stand-in, spec 1.2 §6.3)"
3056
+ },
3057
+ "gpt-6.1-sol#low": {
3058
+ "like": "gpt-6-sol#low",
3059
+ "note": "no DeepSWE 1.1 or Arena score is published for GPT-6.1 Sol yet, and its only Terminal-Bench 4.0 value (vals.ai, 55.05 ± 1.82 at max) comes from a harness not comparable with GPT-6 Sol's Artificial Analysis one; the addendum's Broken Search Tool figure (2.08 % failure, https://deploymentsafety.openai.com/gpt-6-1-sol) is left out because a shipped honesty row would become the nearest honesty stand-in for unrelated sparse rungs; GPT-6 Sol at the same effort stands in for every dimension (the nearest stand-in, spec 1.2 §6.3)"
3060
+ },
3061
+ "gpt-6.1-sol#medium": {
3062
+ "like": "gpt-6-sol#medium",
3063
+ "note": "no DeepSWE 1.1 or Arena score is published for GPT-6.1 Sol yet, and its only Terminal-Bench 4.0 value (vals.ai, 55.05 ± 1.82 at max) comes from a harness not comparable with GPT-6 Sol's Artificial Analysis one; the addendum's Broken Search Tool figure (2.08 % failure, https://deploymentsafety.openai.com/gpt-6-1-sol) is left out because a shipped honesty row would become the nearest honesty stand-in for unrelated sparse rungs; GPT-6 Sol at the same effort stands in for every dimension (the nearest stand-in, spec 1.2 §6.3)"
3064
+ },
3065
+ "gpt-6.1-sol#high": {
3066
+ "like": "gpt-6-sol#high",
3067
+ "note": "no DeepSWE 1.1 or Arena score is published for GPT-6.1 Sol yet, and its only Terminal-Bench 4.0 value (vals.ai, 55.05 ± 1.82 at max) comes from a harness not comparable with GPT-6 Sol's Artificial Analysis one; the addendum's Broken Search Tool figure (2.08 % failure, https://deploymentsafety.openai.com/gpt-6-1-sol) is left out because a shipped honesty row would become the nearest honesty stand-in for unrelated sparse rungs; GPT-6 Sol at the same effort stands in for every dimension (the nearest stand-in, spec 1.2 §6.3)"
3068
+ },
3069
+ "gpt-6.1-sol#xhigh": {
3070
+ "like": "gpt-6-sol#xhigh",
3071
+ "note": "no DeepSWE 1.1 or Arena score is published for GPT-6.1 Sol yet, and its only Terminal-Bench 4.0 value (vals.ai, 55.05 ± 1.82 at max) comes from a harness not comparable with GPT-6 Sol's Artificial Analysis one; the addendum's Broken Search Tool figure (2.08 % failure, https://deploymentsafety.openai.com/gpt-6-1-sol) is left out because a shipped honesty row would become the nearest honesty stand-in for unrelated sparse rungs; GPT-6 Sol at the same effort stands in for every dimension (the nearest stand-in, spec 1.2 §6.3)"
3072
+ },
3073
+ "gpt-6.1-sol#max": {
3074
+ "like": "gpt-6-sol#max",
3075
+ "note": "no DeepSWE 1.1 or Arena score is published for GPT-6.1 Sol yet, and its only Terminal-Bench 4.0 value (vals.ai, 55.05 ± 1.82 at max) comes from a harness not comparable with GPT-6 Sol's Artificial Analysis one; the addendum's Broken Search Tool figure (2.08 % failure, https://deploymentsafety.openai.com/gpt-6-1-sol) is left out because a shipped honesty row would become the nearest honesty stand-in for unrelated sparse rungs; GPT-6 Sol at the same effort stands in for every dimension (the nearest stand-in, spec 1.2 §6.3)"
3076
+ },
3077
+ "gpt-6.1-sol#ultra": {
3078
+ "like": "gpt-6-sol#ultra",
3079
+ "note": "no DeepSWE 1.1 or Arena score is published for GPT-6.1 Sol yet, and its only Terminal-Bench 4.0 value (vals.ai, 55.05 ± 1.82 at max) comes from a harness not comparable with GPT-6 Sol's Artificial Analysis one; the addendum's Broken Search Tool figure (2.08 % failure, https://deploymentsafety.openai.com/gpt-6-1-sol) is left out because a shipped honesty row would become the nearest honesty stand-in for unrelated sparse rungs; GPT-6 Sol at the same effort stands in for every dimension (the nearest stand-in, spec 1.2 §6.3)"
3056
3080
  }
3057
3081
  },
3058
3082
  "bars": {
@@ -69,10 +69,12 @@
69
69
  ],
70
70
  "aliases": {
71
71
  "claude-4-5-haiku": "claude-haiku-4-5",
72
- "claude-haiku-4-5-20251001": "claude-haiku-4-5"
72
+ "claude-haiku-4-5-20251001": "claude-haiku-4-5",
73
+ "gemini-3.1-pro-preview": "gemini-3-1-pro"
73
74
  },
74
75
  "defaultEffort": {
75
76
  "gpt-6-astra": "medium",
77
+ "gpt-6.1-sol": "medium",
76
78
  "gpt-6-sol": "medium",
77
79
  "gpt-6-luna": "medium",
78
80
  "gpt-5.6-sol": "medium",
@@ -82,6 +84,14 @@
82
84
  "claude-opus-5-5": "high",
83
85
  "claude-sonnet-5-5": "high",
84
86
  "claude-sonnet-5": "high",
85
- "claude-haiku-4-5": "default"
87
+ "claude-haiku-4-5": "default",
88
+ "grok-4-7": "high",
89
+ "grok-4-6": "high",
90
+ "grok-4-5": "high",
91
+ "composer-2-5": "default",
92
+ "gemini-3-8-flash": "high",
93
+ "gemini-3-7-flash": "high",
94
+ "gemini-3-6-flash": "high",
95
+ "gemini-3-1-pro": "high"
86
96
  }
87
97
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "catherd-cli",
3
- "version": "1.2.1",
3
+ "version": "1.4.0",
4
4
  "description": "Herds coding agents: autopilot builds from your own Claude Code session.",
5
5
  "keywords": [
6
6
  "autopilot",
@@ -40,7 +40,8 @@
40
40
  "format": "oxfmt",
41
41
  "format:check": "oxfmt --check",
42
42
  "tui-frames": "CATHERD_WRITE_FRAMES=1 bun test test/entry/tui/frames.test.tsx",
43
- "version-packages": "changeset version && bun scripts/stamp-plugin-version.mjs"
43
+ "version-packages": "changeset version && bun scripts/stamp-plugin-version.mjs",
44
+ "release:publish": "npm view catherd-cli@$npm_package_version version >/dev/null 2>&1 || bun test/pack-smoke.ts && changeset publish"
44
45
  },
45
46
  "dependencies": {
46
47
  "@modelcontextprotocol/sdk": "^1.30.1",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "catherd",
3
- "version": "1.2.1",
3
+ "version": "1.4.0",
4
4
  "description": "Herds coding agents: Claude plans and verifies, Codex, opencode or headless Claude Code workers write the code, and Jev picks the model and effort for each piece.",
5
5
  "author": {
6
6
  "name": "47vigen",
@@ -0,0 +1,11 @@
1
+ {
2
+ "name": "catherd",
3
+ "version": "1.4.0",
4
+ "description": "Shared catherd orchestration, profiles and durable role results through the versioned MCP core.",
5
+ "author": { "name": "47vigen", "url": "https://github.com/47vigen" },
6
+ "homepage": "https://github.com/47vigen/catherd",
7
+ "repository": "https://github.com/47vigen/catherd",
8
+ "license": "MIT",
9
+ "skills": "./skills/",
10
+ "mcpServers": "./.mcp-codex.json"
11
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "mcpServers": {
3
+ "catherd": {
4
+ "command": "sh",
5
+ "args": ["./bin/catherd-mcp"],
6
+ "cwd": ".",
7
+ "env": { "CATHERD_ORCHESTRATION_HOST": "codex" }
8
+ }
9
+ }
10
+ }
@@ -1,7 +1,7 @@
1
1
  #!/bin/sh
2
2
  # catherd's MCP launcher (spec 1.1 §12): the plugin's .mcp.json runs it. The release stamps VERSION
3
3
  # (scripts/stamp-plugin-version.mjs), so the plugin always starts the server it was released with.
4
- VERSION="1.2.1"
4
+ VERSION="1.4.0"
5
5
 
6
6
  # a global catherd at this version (catherd init installs one): start it, no resolve at all
7
7
  if command -v catherd >/dev/null 2>&1 && [ "$(catherd --version 2>/dev/null)" = "$VERSION" ]; then