overlord-cli 0.2607280953.0 → 0.2607291136.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 (28) hide show
  1. package/dist/connectors/README.md +46 -0
  2. package/dist/connectors/VERSION +1 -1
  3. package/dist/connectors/adapters/antigravity/README.md +9 -1
  4. package/dist/connectors/adapters/antigravity/conformance-manifest.yaml +1 -1
  5. package/dist/connectors/adapters/antigravity/plugin.json +1 -1
  6. package/dist/connectors/adapters/claude/.claude-plugin/plugin.json +1 -1
  7. package/dist/connectors/adapters/claude/README.md +7 -0
  8. package/dist/connectors/adapters/claude/conformance-manifest.yaml +1 -1
  9. package/dist/connectors/adapters/codex/.codex-plugin/plugin.json +1 -1
  10. package/dist/connectors/adapters/codex/README.md +8 -1
  11. package/dist/connectors/adapters/codex/conformance-manifest.yaml +1 -1
  12. package/dist/connectors/adapters/cursor/.cursor-plugin/plugin.json +1 -1
  13. package/dist/connectors/adapters/cursor/README.md +8 -1
  14. package/dist/connectors/adapters/cursor/conformance-manifest.yaml +1 -1
  15. package/dist/connectors/adapters/pi/README.md +8 -0
  16. package/dist/connectors/adapters/pi/conformance-manifest.yaml +1 -1
  17. package/dist/connectors/core/README.md +17 -0
  18. package/dist/connectors/core/overlord-mission/SKILL.md +1 -0
  19. package/dist/connectors/core/overlord-mission/reference/context.md +7 -1
  20. package/dist/connectors/core/overlord-mission/reference/mcp.md +2 -1
  21. package/dist/connectors/{adapters/antigravity → core}/scripts/overlord-mcp.mjs +46 -2
  22. package/dist/connectors/docs/05-connectors-and-agent-plugins.md +19 -0
  23. package/dist/connectors/docs/agent-harness-configuration-architecture.md +1 -1
  24. package/dist/index.js +66 -7
  25. package/dist/index.js.map +2 -2
  26. package/package.json +1 -1
  27. package/dist/connectors/adapters/codex/scripts/overlord-mcp.mjs +0 -479
  28. package/dist/connectors/adapters/cursor/scripts/overlord-mcp.mjs +0 -479
@@ -13,6 +13,8 @@ OpenCode, Antigravity, and others). A connector is what lets an agent speak the
13
13
  - [For Developers](#for-developers)
14
14
  - [Contract Component](#contract-component)
15
15
  - [The four layers](#the-four-layers)
16
+ - [Adapter capability matrix](#adapter-capability-matrix)
17
+ - [Generated files](#generated-files)
16
18
  - [Documentation](#documentation)
17
19
 
18
20
  ## For Users
@@ -66,6 +68,50 @@ or the harness extension catalog (→ Extension System, see [Database module](..
66
68
  - **Plugin Adapters** — package plugins into a harness via its native plugin/connector manager (Claude, Codex, Cursor).
67
69
  - **Prompt Wrappers** — instructions + key data wrapping the user's prompt at LLM submission time.
68
70
 
71
+ ### Adapter capability matrix
72
+
73
+ Adapters deliberately differ. This table records what each one ships and, where a
74
+ mechanism is absent, whether the gap is a decision or simply unported work — so a
75
+ contributor adding an adapter can tell signal from neglect. Source of truth for the
76
+ "ships" columns is each adapter's `conformance-manifest.yaml`.
77
+
78
+ | Adapter | Commands | Hooks | Local MCP shim | MCP config | Rules | Native resume |
79
+ |---|---|---|---|---|---|---|
80
+ | `claude` | `commands/` | `hooks/hooks.json` (4 types) | — | — | — | — |
81
+ | `codex` | — | `.codex-plugin/hooks.json` + `scripts/*.sh` (2 types) | rendered | `.mcp.json` | — | yes |
82
+ | `cursor` | `commands/` | `hooks/*.sh` (4 types) | rendered | `mcp.json` | `rules/` | — |
83
+ | `antigravity` | `skills/*.md` | `hooks.json` + `scripts/*.sh` (2 types) | rendered | `mcp_config.json` | — | — |
84
+ | `pi` | — | `extensions/overlord.ts` (`input` event) | — | — | — | yes |
85
+
86
+ Intentional omissions:
87
+
88
+ - **`claude` ships no local MCP shim.** The Claude plugin reaches Overlord's hosted
89
+ MCP server, so a local stdio bridge would duplicate it.
90
+ - **`pi` ships no shim, hooks directory, or commands.** PI integrates through a
91
+ single TypeScript extension, and it has no native permission-request hook — its
92
+ `input` event carries follow-up capture only.
93
+ - **`antigravity` passes no model or effort flag.** Antigravity selects the model
94
+ internally; see [05 — Connectors and Agent Plugins](docs/05-connectors-and-agent-plugins.md#antigravity-connector).
95
+ - **`cursor` passes no effort/thinking flag.** Deferred, not declined — recorded in
96
+ the Cursor requirements as "no thinking/effort flag required initially".
97
+
98
+ Unconfirmed gaps — read these as unported rather than declined, and file feature
99
+ work as its own mission rather than folding it into a docs change:
100
+
101
+ - `codex` ships no `commands/` while `claude` and `cursor` do, and `antigravity`
102
+ achieves the same surface through `skills/*.md`. No harness constraint is recorded.
103
+ - `codex` and `antigravity` register no `PostToolUse` or `Stop` hooks; whether their
104
+ harnesses expose the equivalent events is not documented here.
105
+
106
+ ### Generated files
107
+
108
+ The local MCP shim (`scripts/overlord-mcp.mjs`) is **generated**, not committed per
109
+ adapter. One source — [`core/scripts/overlord-mcp.mjs`](core/scripts/overlord-mcp.mjs) —
110
+ is rendered per adapter at `ovld agent-setup` time, substituting the adapter key into
111
+ `DEFAULT_AGENT` and `serverInfo.name`. Edit the core file; there is no adapter copy to
112
+ edit. The rendered artifact stays a standalone runnable `.mjs`, since harnesses start it
113
+ directly from the install path.
114
+
69
115
  ### Documentation
70
116
 
71
117
  - [Connector Core](core/README.md): shared workflow instructions and protocol references consumed by connector plugins.
@@ -1 +1 @@
1
- 0.3.6
1
+ 0.3.10
@@ -73,12 +73,20 @@ This connector is intentionally reviewable against the four connector layers in
73
73
  - `skills/overlord-mission/SKILL.md` — Antigravity adapter template with a `<!-- @connector-core -->` marker; setup interpolates shared core content at install time.
74
74
  - `skills/attach.md`, `skills/connect.md`, `skills/load.md`, `skills/create.md`, `skills/prompt.md`, `skills/discuss-objective.md`, `skills/add-objectives.md`, `skills/record-work.md`, `skills/spawn.md` — one skill per protocol operation; Antigravity auto-registers each as a `/<name>` slash command.
75
75
  - `hooks.json` + `scripts/pre-invocation-hook.sh` + `scripts/pre-tool-use-hook.sh` — follow-up and permission activity capture through `ovld protocol` (see mapping notes below).
76
- - `mcp_config.json` + `scripts/overlord-mcp.mjs` — MCP bridge to common `ovld protocol` operations.
76
+ - `mcp_config.json` + `scripts/overlord-mcp.mjs` — MCP bridge to common `ovld protocol` operations. The shim is **generated**: it is rendered from `connectors/core/scripts/overlord-mcp.mjs` at setup time with the adapter key substituted, and there is no copy in this directory to edit.
77
77
  - `conformance-manifest.yaml` — connector conformance declaration for the Overlord contract.
78
78
  - `prompt-wrapper.md` — Antigravity launch guidance.
79
79
 
80
80
  The shared Connector Core source lives at `connectors/core/overlord-mission`. `ovld agent-setup antigravity` interpolates that core into the adapter skill template and installs core reference files so the runtime package is self-contained.
81
81
 
82
+ ### Omissions
83
+
84
+ - **No model or effort flag at launch.** Antigravity selects the model internally, so Overlord passes neither. Deliberate.
85
+ - **No `commands/` directory.** Antigravity auto-registers each `skills/*.md` as a `/<name>` slash command, so a separate commands surface would be redundant. Deliberate.
86
+ - **No `PostToolUse` or `Stop` hooks.** Only follow-up and permission capture are mapped; whether Antigravity exposes the equivalent events is not yet established. Treat as open work.
87
+
88
+ See the [adapter capability matrix](../../README.md#adapter-capability-matrix) for how this compares across adapters.
89
+
82
90
  ### Notes on the Antigravity hook mapping
83
91
 
84
92
  Antigravity's native hook events are `PreToolUse`, `PostToolUse`, `PreInvocation`, `PostInvocation`, and `Stop` — it has no event literally named `UserPromptSubmit` or `PermissionRequest` the way Claude Code and Codex do. This adapter maps Antigravity's native events onto Overlord's canonical hook-type vocabulary the same way the Cursor adapter maps `beforeSubmitPrompt` onto `UserPromptSubmit`:
@@ -1,4 +1,4 @@
1
- contractVersion: "0"
1
+ contractVersion: "37"
2
2
  componentType: connector
3
3
  componentKey: antigravity
4
4
  label: "Antigravity Connector"
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://antigravity.google/schemas/v1/plugin.json",
3
3
  "name": "overlord",
4
- "version": "0.3.6",
4
+ "version": "0.3.10",
5
5
  "description": "Chat-driven access to Overlord mission protocol workflows with hook-driven activity capture.",
6
6
  "author": {
7
7
  "name": "Cooperativ",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "overlord",
3
- "version": "0.3.6",
3
+ "version": "0.3.10",
4
4
  "description": "Overlord mission protocol workflow for Claude Code — attach/update/ask/deliver, slash commands, and hook-driven activity capture.",
5
5
  "author": {
6
6
  "name": "Cooperativ",
@@ -91,3 +91,10 @@ This connector is intentionally reviewable against the four connector layers in
91
91
  - `prompt-wrapper.md` — Claude launch context-file guidance.
92
92
 
93
93
  The shared Connector Core source lives at `connectors/core/overlord-mission`. `ovld agent-setup claude` interpolates that core into the adapter skill template and installs core reference files so the runtime package is self-contained.
94
+
95
+ ### Deliberate omissions
96
+
97
+ - **No local MCP shim.** The Claude plugin reaches Overlord's hosted MCP server, so the local stdio bridge that Codex, Cursor, and Antigravity install would only duplicate it.
98
+ - **No native resume flag.** Sessions are re-entered through the plugin's own surfaces rather than a `--session` launch flag.
99
+
100
+ See the [adapter capability matrix](../../README.md#adapter-capability-matrix) for how this compares across adapters.
@@ -1,4 +1,4 @@
1
- contractVersion: "35"
1
+ contractVersion: "37"
2
2
  componentType: connector
3
3
  componentKey: claude
4
4
  label: "Claude Code Connector"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "overlord",
3
- "version": "0.3.6",
3
+ "version": "0.3.10",
4
4
  "description": "Chat-driven access to Overlord mission protocol workflows with hook-driven activity capture.",
5
5
  "author": {
6
6
  "name": "Cooperativ",
@@ -70,9 +70,16 @@ This connector is intentionally reviewable against the four connector layers in
70
70
 
71
71
  - `skills/overlord-mission/SKILL.md` — Codex adapter template with a `<!-- @connector-core -->` marker; setup interpolates shared core content at install time.
72
72
  - `.codex-plugin/hooks.json` + `scripts/*.sh` — `UserPromptSubmit` follow-up capture and `PermissionRequest` notifications through `ovld protocol`.
73
- - `.mcp.json` + `scripts/overlord-mcp.mjs` — MCP bridge to common `ovld protocol` operations.
73
+ - `.mcp.json` + `scripts/overlord-mcp.mjs` — MCP bridge to common `ovld protocol` operations. The shim is **generated**: it is rendered from `connectors/core/scripts/overlord-mcp.mjs` at setup time with the adapter key substituted, and there is no copy in this directory to edit.
74
74
  - `assets/` — branded plugin assets for Codex install surfaces.
75
75
  - `conformance-manifest.yaml` — connector conformance declaration for the Overlord contract.
76
76
  - `prompt-wrapper.md` — Codex launch guidance.
77
77
 
78
78
  The shared Connector Core source lives at `connectors/core/overlord-mission`. `ovld agent-setup codex` interpolates that core into the adapter skill template and installs core reference files so the runtime package is self-contained.
79
+
80
+ ### Omissions
81
+
82
+ - **No `commands/` directory.** Codex reaches protocol operations through the MCP bridge and the mission skill. This is unported rather than declined — no Codex constraint is recorded against slash commands — so treat it as open work with its own mission, not as a settled decision.
83
+ - **No `PostToolUse` or `Stop` hooks.** Only `UserPromptSubmit` and `PermissionRequest` are registered; the equivalent Codex events are not yet mapped.
84
+
85
+ See the [adapter capability matrix](../../README.md#adapter-capability-matrix) for how this compares across adapters.
@@ -1,4 +1,4 @@
1
- contractVersion: "0"
1
+ contractVersion: "37"
2
2
  componentType: connector
3
3
  componentKey: codex
4
4
  label: "Codex Connector"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "overlord",
3
- "version": "0.3.6",
3
+ "version": "0.3.10",
4
4
  "description": "Overlord mission protocol workflow for Cursor — attach/update/ask/deliver, slash commands, MCP bridge, and follow-up capture.",
5
5
  "author": {
6
6
  "name": "Cooperativ",
@@ -80,10 +80,17 @@ This connector is intentionally reviewable against the four connector layers in
80
80
  - `hooks/overlord-post-tool-use.sh` — records `postToolUse` file edits and shell-mediated changes for exact per-session delivery attribution.
81
81
  - `hooks/overlord-stop.sh` — checks pending delivery through `ovld protocol hook-event`; when needed, it asks Cursor to continue once so the agent can finish delivery.
82
82
  - `rules/overlord-local.mdc` — always-on workflow rules for Cursor sessions.
83
- - `mcp.json` + `scripts/overlord-mcp.mjs` — MCP bridge to common `ovld protocol` operations.
83
+ - `mcp.json` + `scripts/overlord-mcp.mjs` — MCP bridge to common `ovld protocol` operations. The shim is **generated**: it is rendered from `connectors/core/scripts/overlord-mcp.mjs` at setup time with the adapter key substituted, and there is no copy in this directory to edit.
84
84
  - `conformance-manifest.yaml` — connector conformance declaration for the Overlord contract.
85
85
  - `prompt-wrapper.md` — Cursor launch guidance.
86
86
 
87
87
  The shared Connector Core source lives at `connectors/core/overlord-mission`. `ovld agent-setup cursor` interpolates that core into the adapter skill template and installs core reference files so the runtime package is self-contained.
88
88
 
89
+ ### Deliberate omissions
90
+
91
+ - **No effort/thinking flag.** Launch passes a model flag only; the Cursor requirements record no thinking/effort flag as needed initially. Deferred, not declined.
92
+ - **No native resume flag.** Cursor sessions are re-entered through the harness rather than an Overlord-passed session flag.
93
+
94
+ See the [adapter capability matrix](../../README.md#adapter-capability-matrix) for how this compares across adapters.
95
+
89
96
  Cursor's generic `preToolUse` hook is intentionally not used for permission capture. Cursor currently documents that `ask` is not enforced for `preToolUse`; the narrower shell and MCP hooks expose the native permission-decision schema without changing the user's policy. Cursor also documents hook execution as fail-open by default, so Overlord telemetry failures do not strand the agent.
@@ -1,4 +1,4 @@
1
- contractVersion: "35"
1
+ contractVersion: "37"
2
2
  componentType: connector
3
3
  componentKey: cursor
4
4
  label: "Cursor Connector"
@@ -40,3 +40,11 @@ When PI supplies a native session ID, Overlord's review UI can reopen it with:
40
40
  ```bash
41
41
  pi --session <session-id>
42
42
  ```
43
+
44
+ ## Deliberate omissions
45
+
46
+ - **No local MCP shim and no MCP config.** PI integrates through the single `extensions/overlord.ts` extension, which calls `ovld protocol` directly.
47
+ - **No permission hook.** PI exposes no native permission-request event, so there is nothing to observe.
48
+ - **No `commands/` directory or rules file.** Protocol operations are reached through the mission skill and the extension.
49
+
50
+ See the [adapter capability matrix](../../README.md#adapter-capability-matrix) for how this compares across adapters.
@@ -1,4 +1,4 @@
1
- contractVersion: "0"
1
+ contractVersion: "37"
2
2
  componentType: connector
3
3
  componentKey: pi
4
4
  label: "PI Connector"
@@ -46,7 +46,24 @@ When building a Connector Plugin, adapter skill templates include `<!-- @connect
46
46
  `connectors/core/overlord-mission/` into that marker and copies core reference files
47
47
  into the installable plugin package. Do not fork the core protocol rules into each adapter.
48
48
 
49
+ The same rendering path carries the local MCP shim. `scripts/overlord-mcp.mjs` is the
50
+ single source for the stdio MCP bridge that Codex, Cursor, and Antigravity install;
51
+ `ovld agent-setup <agent>` substitutes `__OVERLORD_ADAPTER_KEY__` with the adapter key
52
+ (`DEFAULT_AGENT` and `serverInfo.name`) and writes the result into the adapter's install
53
+ path. There are no adapter-local copies to keep in step. Two constraints hold when
54
+ editing it:
55
+
56
+ - It must stay a standalone runnable `.mjs`. The rendered file is copied into the
57
+ user's home and started directly by the harness, so it may not import anything
58
+ repo-local or require a build step.
59
+ - The tool list must stay in parity with the hosted MCP catalog; `backend/mcp.test.ts`
60
+ asserts this against `mcp/tool-catalog.ts`.
61
+
62
+ `connectors/VERSION` drives the reported `serverInfo.version`; patch it with
63
+ `yarn connectors:version:sync`, never by hand.
64
+
49
65
  ### Files
50
66
 
51
67
  - `overlord-mission/SKILL.md` — shared mission lifecycle workflow.
52
68
  - `overlord-mission/reference/` — shared protocol, context, device, MCP/API, and shell-escaping references.
69
+ - `scripts/overlord-mcp.mjs` — shared local MCP shim, rendered per adapter.
@@ -407,6 +407,7 @@ Field shape, inline vs stdin piping, and `record-change-rationales` syntax are i
407
407
  - The `summary` in deliver is what the PM reads first, so write it as a narrative, not a command list.
408
408
  - When a summary or question contains backticks, `$vars`, or other shell-special characters, always use `--summary-file -` (or `--question-file -`) with a single-quoted heredoc (`<<'EOF'`). Never retry by stripping or escaping content — pipe stdin instead. See [reference/shell-escaping.md](reference/shell-escaping.md).
409
409
  - Use `write-context` for facts a future agent session should know.
410
+ - Use `update-artifact` (or MCP `overlord_update_artifact`) to revise an existing mission artifact in place instead of delivering a duplicate when a later objective updates a plan or notes.
410
411
  - If a protocol or MCP call fails with auth/session errors, run `ovld auth repair` yourself before asking the user to log in again or proceed without Overlord updates.
411
412
  - If you must run `ovld auth login`, `--organization-id <id>` is optional — it validates/scopes that login or command but does not create a stored default organization.
412
413
  - Do not add or commit changes unless the user explicitly asks you to commit.
@@ -3,6 +3,8 @@
3
3
  ```bash
4
4
  ovld protocol read-context --session-key <sessionKey> --mission-id $MISSION_ID
5
5
  ovld protocol write-context --session-key <sessionKey> --mission-id $MISSION_ID --key "key" --value '"json-value"'
6
+ ovld protocol update-artifact --mission-id $MISSION_ID --artifact-id <artifact-id> \
7
+ --expected-revision <n> --label "Revised plan" --content-text-file -
6
8
  ovld protocol attachment-list --session-key <sessionKey> --objective-id <objective-id>
7
9
  ovld protocol attachment-upload-file --session-key <sessionKey> --objective-id <objective-id> --file ./spec.pdf --content-type application/pdf
8
10
  ovld protocol attachment-download-url --session-key <sessionKey> --attachment-id <attachment-id>
@@ -10,6 +12,10 @@ ovld protocol attachment-download-url --session-key <sessionKey> --attachment-id
10
12
 
11
13
  The `attach` and `load-context` responses already include an `attachments` array plus `previousObjectives` and `futureObjectives` arrays — use those for `<attachment-id>` and `<objective-id>` values. The objective currently being executed is not repeated in those arrays; it is the top-level `objective`. `previousObjectives` are the objectives already worked (before the current one) and `futureObjectives` are the ones queued after it. Run `attachment-list` mid-session if new files have been uploaded since attach. `--mission-id` is optional for attachment calls when `--objective-id` or `--attachment-id` lets the server derive the mission.
12
14
 
15
+ ## Updating existing artifacts
16
+
17
+ When a later objective or follow-up must revise a plan, notes, or URL artifact created earlier, call `update-artifact` (or MCP `overlord_update_artifact`) instead of delivering a duplicate. Use the artifact `id` and `revision` from the mission `artifacts` array (or `ovld mission artifacts`). Provide at least one of `--label`, `--content-text` / `--content-text-file`, or `--external-url`. No session key is required. Stale `--expected-revision` returns a conflict — refresh and retry. Delivery/session/objective provenance and `contentJson` remain immutable.
18
+
13
19
  ## Large Artifacts
14
20
 
15
21
  For large artifacts such as planning documents, architecture decisions, research summaries, or design documents: **save the full content as a markdown file in the linked repository, then summarize it in the artifact returned to the mission.**
@@ -18,5 +24,5 @@ For large artifacts such as planning documents, architecture decisions, research
18
24
  - Commit the file as part of the mission's work so it appears in `changeRationales`.
19
25
  - In the delivery, include a `note` or `decision` artifact with a concise summary and the repository file path — not the full document content.
20
26
 
21
- This keeps the mission feed readable while preserving the full document in version control where it can be reviewed, diffed, and referenced later.
27
+ This keeps the mission feed readable while preserving the full document in version control where it can be reviewed, diffed, and referenced later. If that summary artifact already exists on the mission, revise it with `update-artifact` rather than creating another copy.
22
28
 
@@ -7,5 +7,6 @@
7
7
  - Execution request tools (`request_execution`, `claim_execution`, `list_execution_requests`, `clear_execution_requests`, `complete_execution_launch`, `fail_execution_launch`) back the local runner queue. Agents normally work missions with `attach`/`update`/`deliver`; runner processes use these queue tools.
8
8
  - `record_change_rationales` (MCP) and `ovld protocol record-change-rationales` (CLI) both write to the same `file_changes` table. The dedicated CLI route is `POST /api/protocol/record-change-rationales`.
9
9
  - `overlord_record_work` (hosted MCP) and `ovld protocol record-work` (CLI) record already-completed chat work as a single review-column mission with a completed objective, file-change rationales, and the standard Gemini delivery summary — no `attach`/`deliver`. Hosted MCP requires `projectId` (it never chooses a project implicitly); the CLI resolves the project from the working directory or `--project-id`. The submission format is in [record-work.md](record-work.md). The route is `POST /api/protocol/record-work`.
10
+ - `overlord_update_artifact` (hosted MCP) and `ovld protocol update-artifact` (CLI) revise an existing mission artifact's label, Markdown content, and/or HTTP(S) URL in place. Required: `missionId` / `--mission-id`, `artifactId` / `--artifact-id`, `expectedRevision` / `--expected-revision`. Provide at least one editable field. No session key is required. Same service as REST `PATCH /api/missions/:id/artifacts/:artifactId`. The route is `POST /api/protocol/update-artifact`.
10
11
  - Objective attachment tools follow the `<verb>_<noun>` MCP naming: `list_attachments`, `prepare_attachment_upload`, `finalize_attachment_upload`, `get_attachment_download_url`, `upload_attachment_file`. CLI commands use `attachment-*`. `mission_id` / `missionId` is optional for attachment calls when the objective or attachment id lets the server derive mission scope.
11
- - "Artifacts" in `deliver` are the structured records an agent submits at delivery time (next_steps, test_results, migration, decision, note, url) — not user-uploaded files. Files attached by users live on objectives via the attachment tools above.
12
+ - "Artifacts" in `deliver` are the structured records an agent submits at delivery time (next_steps, test_results, migration, decision, note, url) — not user-uploaded files. Files attached by users live on objectives via the attachment tools above. Prefer `update-artifact` / `overlord_update_artifact` when a later pass must revise an artifact already on the mission.
@@ -6,7 +6,7 @@ import { promisify } from 'node:util';
6
6
  const execFileAsync = promisify(execFile);
7
7
  const OVLD_BIN = process.env.OVLD_BIN?.trim() || 'ovld';
8
8
  const PROTOCOL_VERSION = '2025-06-18';
9
- const DEFAULT_AGENT = 'antigravity';
9
+ const DEFAULT_AGENT = '__OVERLORD_ADAPTER_KEY__';
10
10
  let buffer = Buffer.alloc(0);
11
11
 
12
12
  function send(message) {
@@ -211,6 +211,10 @@ const tools = [
211
211
  missionId: stringProperty('Mission UUID or workspace display id.'),
212
212
  sessionKey: stringProperty('Session key returned by overlord_attach_session.'),
213
213
  summary: stringProperty('Delivery summary.'),
214
+ artifacts: {
215
+ type: 'array',
216
+ description: 'Optional mission artifacts to persist with this delivery.'
217
+ },
214
218
  noFileChanges: {
215
219
  type: 'boolean',
216
220
  description: 'Set true when the MCP run changed no files.'
@@ -235,6 +239,26 @@ const tools = [
235
239
  ['missionId', 'sessionKey', 'summary']
236
240
  )
237
241
  },
242
+ {
243
+ name: 'overlord_update_artifact',
244
+ title: 'Update mission artifact',
245
+ description:
246
+ 'Revise an existing mission artifact in place (label, Markdown content, and/or URL) using optimistic concurrency via expectedRevision.',
247
+ inputSchema: objectSchema(
248
+ {
249
+ missionId: stringProperty('Mission UUID or workspace display id.'),
250
+ artifactId: stringProperty('Artifact id from mission context.'),
251
+ expectedRevision: {
252
+ type: 'number',
253
+ description: 'Current artifact.revision. Stale values return a conflict error.'
254
+ },
255
+ label: stringProperty('Optional new human-facing label.'),
256
+ contentText: stringProperty('Optional new Markdown/text content.'),
257
+ externalUrl: stringProperty('Optional HTTP(S) URL.')
258
+ },
259
+ ['missionId', 'artifactId', 'expectedRevision']
260
+ )
261
+ },
238
262
  {
239
263
  name: 'overlord_record_work',
240
264
  title: 'Record completed work as a mission',
@@ -360,6 +384,7 @@ function callOverlordTool(name, args) {
360
384
  'session-key': requiredString(args, 'sessionKey'),
361
385
  summary: requiredString(args, 'summary'),
362
386
  ...(args.noFileChanges === true ? { 'no-file-changes': true } : {}),
387
+ ...(Array.isArray(args.artifacts) ? { 'artifacts-json': args.artifacts } : {}),
363
388
  ...(Array.isArray(args.changeRationales)
364
389
  ? { 'change-rationales-json': args.changeRationales }
365
390
  : {}),
@@ -387,6 +412,25 @@ function callOverlordTool(name, args) {
387
412
  : {})
388
413
  });
389
414
  }
415
+ if (name === 'overlord_update_artifact') {
416
+ if (typeof args.expectedRevision !== 'number' || !Number.isInteger(args.expectedRevision)) {
417
+ throw new Error('expectedRevision must be an integer');
418
+ }
419
+ const hasLabel = typeof args.label === 'string';
420
+ const hasContentText = typeof args.contentText === 'string';
421
+ const hasExternalUrl = typeof args.externalUrl === 'string';
422
+ if (!hasLabel && !hasContentText && !hasExternalUrl) {
423
+ throw new Error('Provide at least one of label, contentText, or externalUrl');
424
+ }
425
+ return runProtocol('update-artifact', {
426
+ 'mission-id': requiredString(args, 'missionId'),
427
+ 'artifact-id': requiredString(args, 'artifactId'),
428
+ 'expected-revision': String(Math.trunc(args.expectedRevision)),
429
+ ...(hasLabel ? { label: args.label } : {}),
430
+ ...(hasContentText ? { 'content-text': args.contentText } : {}),
431
+ ...(hasExternalUrl ? { 'external-url': args.externalUrl } : {})
432
+ });
433
+ }
390
434
  if (name === 'overlord_record_work') {
391
435
  return runProtocol('record-work', {
392
436
  'project-id': requiredString(args, 'projectId'),
@@ -433,7 +477,7 @@ process.stdin.on('data', async chunk => {
433
477
  result: {
434
478
  protocolVersion: PROTOCOL_VERSION,
435
479
  capabilities: { tools: { listChanged: false } },
436
- serverInfo: { name: 'overlord-antigravity', version: '0.3.6' }
480
+ serverInfo: { name: 'overlord-__OVERLORD_ADAPTER_KEY__', version: '0.3.10' }
437
481
  }
438
482
  });
439
483
  continue;
@@ -46,6 +46,25 @@ Required content:
46
46
  - Do not continue implementation after delivery unless follow-up execution is explicitly requested.
47
47
  - Run local repair/diagnostic commands before asking the user to fix connector setup.
48
48
 
49
+ ## Canonical Local MCP Shim
50
+
51
+ Source location:
52
+
53
+ - `connectors/core/scripts/overlord-mcp.mjs`
54
+
55
+ Codex, Cursor, and Antigravity each install a local stdio MCP bridge that delegates to `ovld protocol`. All three are rendered from this one core script at `ovld agent-setup` time: the adapter key is substituted for `__OVERLORD_ADAPTER_KEY__` in `DEFAULT_AGENT` and `serverInfo.name`. Adapter directories contain no committed copy — edit the core file.
56
+
57
+ Requirements:
58
+
59
+ - The rendered shim must remain a standalone runnable `.mjs`; harnesses start it directly from the install path, so no bundler or repo-local import may appear at runtime.
60
+ - Adapter-specific behavior beyond the agent identifier belongs in the adapter, not in a fork of the shim.
61
+ - The shim tool list must stay in parity with the hosted MCP catalog (`mcp/tool-catalog.ts`).
62
+ - `serverInfo.version` follows `connectors/VERSION` through `scripts/sync-connector-versions.mjs`.
63
+
64
+ ## Adapter Capability Differences
65
+
66
+ Adapters intentionally differ in which mechanisms they ship. The per-adapter matrix, the omissions that are decisions, and the gaps that are merely unported are recorded in the [connectors module README](../README.md#adapter-capability-matrix). Update that table when an adapter gains or drops a mechanism.
67
+
49
68
  ## Codex Connector
50
69
 
51
70
  Requirements:
@@ -50,7 +50,7 @@ fingerprint.
50
50
 
51
51
  | Concern | Owner | Overlord storage | Notes |
52
52
  | --- | --- | --- | --- |
53
- | Built-in agent connector capabilities | Overlord | Connector registry or static config | Examples: `codex`, `claude`, `cursor`. |
53
+ | Built-in agent connector capabilities | Overlord | Connector registry or static config | Examples: `codex`, `claude`, `cursor`. Which mechanisms each adapter ships, and which omissions are deliberate, are recorded in the [adapter capability matrix](../README.md#adapter-capability-matrix). |
54
54
  | Agents and models available by default | Workspace | `workspaces.settings_json`, future `workspace_agent_catalog` | Model config is workspace-level, not project-level. |
55
55
  | Personal custom harness extensions | User | `user_harness_extensions` | User-owned source of truth for draft/private custom connectors. |
56
56
  | Workspace custom harness extensions | Workspace admin/member with permission | `workspace_harness_extensions` | Workspace-installed catalog entries, optionally copied from a personal extension version. |
package/dist/index.js CHANGED
@@ -2129,6 +2129,12 @@ function connectorCoreRoot() {
2129
2129
  }
2130
2130
  return resolveRepoPath("connectors/core/overlord-mission");
2131
2131
  }
2132
+ function connectorCoreScriptsRoot(coreRoot = connectorCoreRoot()) {
2133
+ return path5.join(path5.dirname(coreRoot), "scripts");
2134
+ }
2135
+ function isConnectorCoreMcpShimPath(relativePath) {
2136
+ return relativePath === CONNECTOR_CORE_MCP_SHIM_RELATIVE_PATH;
2137
+ }
2132
2138
  function isConnectorCoreSkillPath(relativePath) {
2133
2139
  return relativePath === CONNECTOR_CORE_SKILL_RELATIVE_PATH;
2134
2140
  }
@@ -2181,6 +2187,30 @@ function readConnectorCoreReference({
2181
2187
  }
2182
2188
  return readFileSync5(referencePath);
2183
2189
  }
2190
+ function renderConnectorMcpShim({
2191
+ adapterKey,
2192
+ coreRoot = connectorCoreRoot()
2193
+ }) {
2194
+ const shimPath = path5.join(connectorCoreScriptsRoot(coreRoot), "overlord-mcp.mjs");
2195
+ if (!existsSync5(shimPath)) {
2196
+ throw new CliError({
2197
+ message: `Connector core MCP shim missing at ${shimPath}.`
2198
+ });
2199
+ }
2200
+ const source = readFileSync5(shimPath, "utf8");
2201
+ if (!source.includes(CONNECTOR_ADAPTER_KEY_PLACEHOLDER)) {
2202
+ throw new CliError({
2203
+ message: `Connector core MCP shim at ${shimPath} is missing ${CONNECTOR_ADAPTER_KEY_PLACEHOLDER}. The adapter key must stay a substitution point.`
2204
+ });
2205
+ }
2206
+ return source.replaceAll(CONNECTOR_ADAPTER_KEY_PLACEHOLDER, adapterKey);
2207
+ }
2208
+ function resolveAdapterKey({
2209
+ sourceDir,
2210
+ adapterKey
2211
+ }) {
2212
+ return adapterKey ?? path5.basename(sourceDir);
2213
+ }
2184
2214
  function managedFileSourceExists({
2185
2215
  sourceDir,
2186
2216
  relativePath,
@@ -2189,16 +2219,27 @@ function managedFileSourceExists({
2189
2219
  if (isConnectorCoreReferencePath(relativePath)) {
2190
2220
  return existsSync5(path5.join(coreRoot, "reference", path5.basename(relativePath)));
2191
2221
  }
2222
+ if (isConnectorCoreMcpShimPath(relativePath)) {
2223
+ return existsSync5(path5.join(connectorCoreScriptsRoot(coreRoot), "overlord-mcp.mjs"));
2224
+ }
2192
2225
  return existsSync5(path5.join(sourceDir, relativePath));
2193
2226
  }
2194
2227
  function resolveManagedFileContents({
2195
2228
  sourceDir,
2196
2229
  relativePath,
2230
+ adapterKey,
2197
2231
  coreRoot = connectorCoreRoot()
2198
2232
  }) {
2199
2233
  if (isConnectorCoreReferencePath(relativePath)) {
2200
2234
  return readConnectorCoreReference({ relativePath, coreRoot });
2201
2235
  }
2236
+ if (isConnectorCoreMcpShimPath(relativePath)) {
2237
+ const rendered = renderConnectorMcpShim({
2238
+ adapterKey: resolveAdapterKey({ sourceDir, adapterKey }),
2239
+ coreRoot
2240
+ });
2241
+ return Buffer.from(rendered, "utf8");
2242
+ }
2202
2243
  if (isConnectorCoreSkillPath(relativePath)) {
2203
2244
  const templatePath = path5.join(sourceDir, relativePath);
2204
2245
  if (!existsSync5(templatePath)) {
@@ -2220,7 +2261,7 @@ function resolveManagedFileContents({
2220
2261
  }
2221
2262
  return readFileSync5(sourcePath);
2222
2263
  }
2223
- var CONNECTOR_CORE_MARKER, CONNECTOR_CORE_SKILL_RELATIVE_PATH, CONNECTOR_CORE_REFERENCE_PREFIX;
2264
+ var CONNECTOR_CORE_MARKER, CONNECTOR_CORE_SKILL_RELATIVE_PATH, CONNECTOR_CORE_REFERENCE_PREFIX, CONNECTOR_CORE_MCP_SHIM_RELATIVE_PATH, CONNECTOR_ADAPTER_KEY_PLACEHOLDER;
2224
2265
  var init_connector_core_render = __esm({
2225
2266
  "src/connector-core-render.ts"() {
2226
2267
  "use strict";
@@ -2229,6 +2270,8 @@ var init_connector_core_render = __esm({
2229
2270
  CONNECTOR_CORE_MARKER = "<!-- @connector-core -->";
2230
2271
  CONNECTOR_CORE_SKILL_RELATIVE_PATH = "skills/overlord-mission/SKILL.md";
2231
2272
  CONNECTOR_CORE_REFERENCE_PREFIX = "skills/overlord-mission/reference/";
2273
+ CONNECTOR_CORE_MCP_SHIM_RELATIVE_PATH = "scripts/overlord-mcp.mjs";
2274
+ CONNECTOR_ADAPTER_KEY_PLACEHOLDER = "__OVERLORD_ADAPTER_KEY__";
2232
2275
  }
2233
2276
  });
2234
2277
 
@@ -2749,7 +2792,7 @@ function setupConnector({
2749
2792
  }
2750
2793
  let contents;
2751
2794
  try {
2752
- contents = resolveManagedFileContents({ sourceDir, relativePath });
2795
+ contents = resolveManagedFileContents({ sourceDir, relativePath, adapterKey: agentKey });
2753
2796
  } catch (error) {
2754
2797
  const message = error instanceof CliError ? error.message : String(error);
2755
2798
  warnings.push(message);
@@ -13917,11 +13960,7 @@ function shouldUseTerminalHyperlinks({
13917
13960
  if ((env.TERM ?? "").toLowerCase() === "dumb") return false;
13918
13961
  return true;
13919
13962
  }
13920
- function missionLinkLine({
13921
- displayId,
13922
- title,
13923
- hyperlink
13924
- }) {
13963
+ function missionLinkLine({ displayId, title, hyperlink }) {
13925
13964
  const id = sanitizeTerminalText(displayId);
13926
13965
  if (!id) return "";
13927
13966
  const link = missionDeepLink(id);
@@ -14842,6 +14881,7 @@ Subcommands:
14842
14881
  of hand-triaging \`git status\`
14843
14882
  read-context Read shared persistent context for this mission
14844
14883
  write-context Write shared persistent context for future sessions
14884
+ update-artifact Update an existing mission artifact in place
14845
14885
  attachment-list List all attachments for the mission
14846
14886
  attachment-download-url Get the download URL for a specific attachment
14847
14887
 
@@ -15132,6 +15172,23 @@ write-context:
15132
15172
  --key <name>
15133
15173
  --value <text> or --value-json / --value-file <path|->
15134
15174
 
15175
+ update-artifact:
15176
+ Purpose:
15177
+ Update an existing mission artifact's label, Markdown content, and/or URL in
15178
+ place (same rules as PATCH /api/missions/:id/artifacts/:artifactId). Use this
15179
+ when a later objective or follow-up must revise an artifact created earlier,
15180
+ instead of delivering a duplicate. No session key is required.
15181
+ Required:
15182
+ --mission-id <id>
15183
+ --artifact-id <id>
15184
+ --expected-revision <n> Current artifact.revision (409 if stale)
15185
+ Optional (at least one required):
15186
+ --label <text>
15187
+ --content-text <text> or --content-text-file <path|->
15188
+ --external-url <url> Empty string clears the URL
15189
+ Returns:
15190
+ Updated ArtifactDto JSON (includes the new revision).
15191
+
15135
15192
  attachment-list:
15136
15193
  Purpose:
15137
15194
  List all attachments for the mission (across all objectives).
@@ -15187,6 +15244,7 @@ var init_protocol_help = __esm({
15187
15244
  "resume-follow-up",
15188
15245
  "search-missions",
15189
15246
  "update",
15247
+ "update-artifact",
15190
15248
  "write-context"
15191
15249
  ];
15192
15250
  DEFAULT_TIMEOUT_MS = 3e4;
@@ -17956,6 +18014,7 @@ var init_commands = __esm({
17956
18014
  "--objectives-file",
17957
18015
  "--changed-files-file",
17958
18016
  "--value-file",
18017
+ "--content-text-file",
17959
18018
  "--prompt-file"
17960
18019
  ];
17961
18020
  SESSION_KEY_SUBCOMMANDS = /* @__PURE__ */ new Set([