overlord-cli 0.2607280953.0 → 0.2607292110.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 +400 -195
  25. package/dist/index.js.map +4 -4
  26. package/package.json +3 -3
  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. |