overlord-cli 0.2608181255.0 → 0.2608181615.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 (25) hide show
  1. package/dist/connectors/VERSION +1 -1
  2. package/dist/connectors/adapters/antigravity/plugin.json +1 -1
  3. package/dist/connectors/adapters/antigravity/skills/attach.md +5 -0
  4. package/dist/connectors/adapters/antigravity/skills/connect.md +5 -0
  5. package/dist/connectors/adapters/antigravity/skills/discuss-objective.md +5 -0
  6. package/dist/connectors/adapters/antigravity/skills/load.md +5 -0
  7. package/dist/connectors/adapters/claude/.claude-plugin/plugin.json +1 -1
  8. package/dist/connectors/adapters/claude/commands/attach.md +5 -0
  9. package/dist/connectors/adapters/claude/commands/connect.md +5 -0
  10. package/dist/connectors/adapters/claude/commands/discuss-objective.md +5 -0
  11. package/dist/connectors/adapters/claude/commands/load.md +5 -0
  12. package/dist/connectors/adapters/codex/.codex-plugin/plugin.json +1 -1
  13. package/dist/connectors/adapters/cursor/.cursor-plugin/plugin.json +1 -1
  14. package/dist/connectors/adapters/cursor/commands/attach.md +5 -0
  15. package/dist/connectors/adapters/cursor/commands/connect.md +7 -0
  16. package/dist/connectors/adapters/cursor/commands/discuss-objective.md +5 -0
  17. package/dist/connectors/adapters/cursor/commands/load.md +7 -0
  18. package/dist/connectors/core/overlord-mission/SKILL.md +11 -3
  19. package/dist/connectors/core/overlord-mission/reference/cli.md +24 -0
  20. package/dist/connectors/core/overlord-mission/reference/context.md +1 -2
  21. package/dist/connectors/core/overlord-mission/reference/mcp.md +3 -2
  22. package/dist/connectors/core/scripts/overlord-mcp.mjs +81 -27
  23. package/dist/index.js +492 -294
  24. package/dist/index.js.map +4 -4
  25. package/package.json +1 -1
@@ -1 +1 @@
1
- 0.3.26
1
+ 0.3.28
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://antigravity.google/schemas/v1/plugin.json",
3
3
  "name": "overlord",
4
- "version": "0.3.26",
4
+ "version": "0.3.28",
5
5
  "description": "Chat-driven access to Overlord mission protocol workflows through skills and MCP.",
6
6
  "author": {
7
7
  "name": "Cooperativ",
@@ -10,7 +10,12 @@ If no mission ID was provided, ask the user for one and stop.
10
10
  Run:
11
11
  `ovld protocol attach --mission-id <missionId>`
12
12
 
13
+ or, when the argument is an objective display id:
14
+
15
+ `ovld protocol attach --objective-id <objectiveId>`
16
+
13
17
  Rules:
18
+ - The argument may be a mission display id (`coo:756`) or an objective display id (`coo:756.k7xm`). An objective display id already names its mission, so pass it as `--objective-id` on its own — do not split it or pass it as `--mission-id`.
14
19
  - Use `attach` only when the user explicitly wants this Antigravity session to execute mission work.
15
20
  - After the command succeeds, report the returned `SESSION_KEY`.
16
21
  - Follow the `overlord-mission` skill workflow after attaching: update while working, ask exactly one blocking question if blocked, and deliver last.
@@ -10,7 +10,12 @@ If no mission ID was provided, ask the user for one and stop.
10
10
  Run:
11
11
  `ovld protocol connect --mission-id <missionId>`
12
12
 
13
+ or, when the argument is an objective display id:
14
+
15
+ `ovld protocol connect --objective-id <objectiveId>`
16
+
13
17
  Rules:
18
+ - The argument may be a mission display id (`coo:756`) or an objective display id (`coo:756.k7xm`). An objective display id already names its mission, so pass it as `--objective-id` on its own — do not split it or pass it as `--mission-id`.
14
19
  - Use `connect`, not `attach`.
15
20
  - Do not load extra mission context unless the user explicitly asks for it.
16
21
  - After the command succeeds, report the returned `SESSION_KEY` and confirm that future updates should use that mission.
@@ -10,7 +10,12 @@ If no mission ID was provided, ask the user for one and stop.
10
10
  Run:
11
11
  `ovld protocol discuss-objective --mission-id <missionId>`
12
12
 
13
+ or, when the argument is an objective display id:
14
+
15
+ `ovld protocol discuss-objective --objective-id <objectiveId>`
16
+
13
17
  Rules:
18
+ - The argument may be a mission display id (`coo:756`) or an objective display id (`coo:756.k7xm`). An objective display id already names its mission, so pass it as `--objective-id` on its own — do not split it or pass it as `--mission-id`.
14
19
  - Use `discuss-objective`, not `attach`, when the user is opening or discussing a mission but has not asked Antigravity to execute it.
15
20
  - Do not create or switch sessions.
16
21
  - Summarize the returned objective state for the user.
@@ -10,7 +10,12 @@ If no mission ID was provided, ask the user for one and stop.
10
10
  Run:
11
11
  `ovld protocol load-context --mission-id <missionId>`
12
12
 
13
+ or, when the argument is an objective display id:
14
+
15
+ `ovld protocol load-context --objective-id <objectiveId>`
16
+
13
17
  Rules:
18
+ - The argument may be a mission display id (`coo:756`) or an objective display id (`coo:756.k7xm`). An objective display id already names its mission, so pass it as `--objective-id` on its own — do not split it or pass it as `--mission-id`.
14
19
  - Use `load-context`, not `attach`.
15
20
  - Do not create or switch sessions.
16
21
  - Summarize the returned mission details, history, artifacts, and shared context for the user.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "overlord",
3
- "version": "0.3.26",
3
+ "version": "0.3.28",
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",
@@ -12,7 +12,12 @@ If no mission ID was provided, ask the user for one and stop.
12
12
  Run:
13
13
  `ovld protocol attach --mission-id <missionId>`
14
14
 
15
+ or, when the argument is an objective display id:
16
+
17
+ `ovld protocol attach --objective-id <objectiveId>`
18
+
15
19
  Rules:
20
+ - The argument may be a mission display id (`coo:756`) or an objective display id (`coo:756.k7xm`). An objective display id already names its mission, so pass it as `--objective-id` on its own — do not split it or pass it as `--mission-id`.
16
21
  - Use `attach` only when the user explicitly wants this Claude session to execute mission work.
17
22
  - After the command succeeds, report the returned `SESSION_KEY`.
18
23
  - Follow the `overlord-mission` skill workflow after attaching: update while working, ask exactly one blocking question if blocked, and deliver last.
@@ -13,7 +13,12 @@ If no mission ID was provided, ask the user for one and stop.
13
13
  Run:
14
14
  `ovld protocol connect --mission-id <missionId>`
15
15
 
16
+ or, when the argument is an objective display id:
17
+
18
+ `ovld protocol connect --objective-id <objectiveId>`
19
+
16
20
  Rules:
21
+ - The argument may be a mission display id (`coo:756`) or an objective display id (`coo:756.k7xm`). An objective display id already names its mission, so pass it as `--objective-id` on its own — do not split it or pass it as `--mission-id`.
17
22
  - Use `connect`, not `attach`.
18
23
  - Do not load extra mission context unless the user explicitly asks for it.
19
24
  - After the command succeeds, report the returned `SESSION_KEY` and confirm that future updates should use that mission.
@@ -12,7 +12,12 @@ If no mission ID was provided, ask the user for one and stop.
12
12
  Run:
13
13
  `ovld protocol discuss-objective --mission-id <missionId>`
14
14
 
15
+ or, when the argument is an objective display id:
16
+
17
+ `ovld protocol discuss-objective --objective-id <objectiveId>`
18
+
15
19
  Rules:
20
+ - The argument may be a mission display id (`coo:756`) or an objective display id (`coo:756.k7xm`). An objective display id already names its mission, so pass it as `--objective-id` on its own — do not split it or pass it as `--mission-id`.
16
21
  - Use `discuss-objective`, not `attach`, when the user is opening or discussing a mission but has not asked Claude to execute it.
17
22
  - Do not create or switch sessions.
18
23
  - Summarize the returned objective state for the user.
@@ -14,7 +14,12 @@ If no mission ID was provided, ask the user for one and stop.
14
14
  Run:
15
15
  `ovld protocol load-context --mission-id <missionId>`
16
16
 
17
+ or, when the argument is an objective display id:
18
+
19
+ `ovld protocol load-context --objective-id <objectiveId>`
20
+
17
21
  Rules:
22
+ - The argument may be a mission display id (`coo:756`) or an objective display id (`coo:756.k7xm`). An objective display id already names its mission, so pass it as `--objective-id` on its own — do not split it or pass it as `--mission-id`.
18
23
  - Use `load-context`, not `attach`.
19
24
  - Do not create or switch sessions.
20
25
  - Summarize the returned mission details, history, artifacts, and shared context for the user.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "overlord",
3
- "version": "0.3.26",
3
+ "version": "0.3.28",
4
4
  "description": "Chat-driven access to Overlord mission protocol workflows with hook-driven activity capture.",
5
5
  "author": {
6
6
  "name": "Cooperativ",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "overlord",
3
- "version": "0.3.26",
3
+ "version": "0.3.28",
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",
@@ -6,7 +6,12 @@ If no mission ID was provided, ask the user for one and stop.
6
6
  Run:
7
7
  `ovld protocol attach --mission-id <missionId>`
8
8
 
9
+ or, when the argument is an objective display id:
10
+
11
+ `ovld protocol attach --objective-id <objectiveId>`
12
+
9
13
  Rules:
14
+ - The argument may be a mission display id (`coo:756`) or an objective display id (`coo:756.k7xm`). An objective display id already names its mission, so pass it as `--objective-id` on its own — do not split it or pass it as `--mission-id`.
10
15
  - Use attach only when the user explicitly wants this session to execute mission work.
11
16
  - After the command succeeds, report the returned `SESSION_KEY`.
12
17
  - Follow the `overlord-mission` skill workflow after attaching: update while working, ask exactly one blocking question if blocked, and deliver last.
@@ -4,3 +4,10 @@ Use the text after `/connect` as the mission ID.
4
4
 
5
5
  Run:
6
6
  `ovld protocol connect --mission-id <missionId>`
7
+
8
+ or, when the argument is an objective display id:
9
+
10
+ `ovld protocol connect --objective-id <objectiveId>`
11
+
12
+ Rules:
13
+ - The argument may be a mission display id (`coo:756`) or an objective display id (`coo:756.k7xm`). An objective display id already names its mission, so pass it as `--objective-id` on its own — do not split it or pass it as `--mission-id`.
@@ -6,6 +6,11 @@ If no mission ID was provided, ask the user for one and stop.
6
6
  Run:
7
7
  `ovld protocol discuss-objective --mission-id <missionId>`
8
8
 
9
+ or, when the argument is an objective display id:
10
+
11
+ `ovld protocol discuss-objective --objective-id <objectiveId>`
12
+
9
13
  Rules:
14
+ - The argument may be a mission display id (`coo:756`) or an objective display id (`coo:756.k7xm`). An objective display id already names its mission, so pass it as `--objective-id` on its own — do not split it or pass it as `--mission-id`.
10
15
  - Use this when the user wants to open or discuss a mission, not execute it.
11
16
  - Do not attach after this command unless the user explicitly asks to execute.
@@ -5,5 +5,12 @@ Use the text after `/load` as the mission ID.
5
5
  Run:
6
6
  `ovld protocol load-context --mission-id <missionId>`
7
7
 
8
+ or, when the argument is an objective display id:
9
+
10
+ `ovld protocol load-context --objective-id <objectiveId>`
11
+
8
12
  When you open or discuss an existing mission that has a draft objective, submit it with:
9
13
  `ovld protocol discuss-objective --mission-id <missionId>`
14
+
15
+ Rules:
16
+ - The argument may be a mission display id (`coo:756`) or an objective display id (`coo:756.k7xm`). An objective display id already names its mission, so pass it as `--objective-id` on its own — do not split it or pass it as `--mission-id`.
@@ -15,6 +15,8 @@ Use this mode when the prompt already contains a mission ID or explicitly says t
15
15
 
16
16
  **`<mission_id>` is always the short display id** — `coo:695`, `1:899`: a workspace prefix, a colon, and a number. Pass it as `--mission-id`. **`<objective_id>`** is the objective display id (`coo:695.k7xm`) or UUID; pass it as `--objective-id` when you know which objective to execute. Never pass an objective id as `--mission-id`. If the prompt includes `OVERLORD_OBJECTIVE_ID` or an Objective ID line, include `--objective-id` on attach. If the only id you can find is a bare UUID with no mission display id, re-read the prompt or run `ovld protocol search-missions` rather than guessing.
17
17
 
18
+ **An objective display id is a complete address.** `coo:695.k7xm` already spells its mission, so `--mission-id` is optional on every command whenever you pass a full objective display id as `--objective-id`; Overlord derives `coo:695` from it. This is the identifier to reach for when reconnecting to a mission that is running more than one objective, where "the active objective" is ambiguous and a mission id alone is not enough. An objective **UUID** names no mission, so it still needs `--mission-id` alongside it.
19
+
18
20
  1. Attach first with `ovld protocol attach --mission-id <mission_id> [--objective-id <objective_id>]`.
19
21
  2. The attach response prints JSON to stdout containing `session.sessionKey`. The CLI also persists this key automatically so subsequent `ovld protocol` commands in the same working directory resolve it without `--session-key`. If auto-resolution fails, pass `--session-key <sessionKey>` explicitly on every subsequent call.
20
22
  3. Treat the Overlord mission prompt as authoritative for the objective, constraints, and delivery target. Begin executing the current objective immediately after attach; do not wait for more instructions or ask for confirmation. This differs from `connect` or `load-context`, which only retrieve mission context and never imply the agent should act.
@@ -61,7 +63,7 @@ ovld protocol add-objectives --mission-id <mission_id> --objectives-json '[{"obj
61
63
 
62
64
  Discussing or otherwise opening a mission from within a chat should cause the draft objective to be marked **submitted** — this signals the mission is in active discussion with an agent, but not yet being executed. Only an explicit order to execute (e.g. "execute this", "do this", "start working on it") should cause you to **attach** to the mission and trigger execution.
63
65
 
64
- - **Discussing / opening a mission** → `ovld protocol discuss-objective --mission-id $MISSION_ID` (draft → submitted, no session).
66
+ - **Discussing / opening a mission** → `ovld protocol discuss-objective --mission-id $MISSION_ID` (draft → submitted, no session). Add `--objective-id <objective_id>` when the mission holds more than one draft and you mean a specific one.
65
67
  - **Creating a mission** via `ovld protocol create` keeps the objective in `draft` state.
66
68
  - **Explicitly ordered to execute** → `ovld protocol attach --mission-id $MISSION_ID` (draft/submitted → executing, session begins).
67
69
 
@@ -78,9 +80,9 @@ Use this mode when the conversation starts normally and the user asks the agent
78
80
  - If the user wants to **add more objectives to an existing mission** (not create a new mission), use `ovld protocol add-objectives --mission-id <mission_id> --objectives-json '[{"objective":"..."}]'` instead.
79
81
  2. Default to `create` for new missions. Only use `ovld protocol prompt --agent <agent-identifier> --objectives-json '[{"objective":"..."}]'` when the user explicitly asks to create and execute immediately.
80
82
  `prompt` creates the mission in `execute` status and attaches immediately.
81
- 3. If the user already has a mission ID and only wants to inspect it, run `ovld protocol load-context --mission-id <mission_id>`.
83
+ 3. If the user already has a mission ID and only wants to inspect it, run `ovld protocol load-context --mission-id <mission_id>`. To read one specific objective's context — the only way to read context on a mission running objectives in parallel — add `--objective-id <objective_id>` (or pass it alone).
82
84
  When you open or discuss an existing mission that has a draft objective, submit it with `ovld protocol discuss-objective --mission-id <mission_id>`.
83
- 4. If the user wants to route the current session onto an existing mission by ID, run `ovld protocol connect --mission-id <mission_id>`.
85
+ 4. If the user wants to route the current session onto an existing mission by ID, run `ovld protocol connect --mission-id <mission_id>` (add `--objective-id <objective_id>` to pin the session to a specific objective).
84
86
  5. If the user wants to establish a persistent session with a mission by ID, run `ovld protocol attach --mission-id <mission_id>`.
85
87
  6. If the user wants to find a mission but does not know the ID, run `ovld protocol search-missions --query "..." --status next-up,execute` and ask the user to confirm.
86
88
  7. If you need to understand project routing before prompting, use `ovld protocol discover-project`.
@@ -96,8 +98,13 @@ For mission creation examples, project discovery, and `--objectives-json` format
96
98
 
97
99
  ```bash
98
100
  ovld protocol attach --mission-id $MISSION_ID
101
+ ovld protocol attach --mission-id $MISSION_ID --objective-id $OBJECTIVE_ID # pin the objective
102
+ ovld protocol attach --objective-id $OBJECTIVE_ID # display id only
99
103
  ```
100
104
 
105
+ The third form works because an objective display id (`coo:695.k7xm`) already
106
+ names its mission — use it when reconnecting and the mission id is not at hand.
107
+
101
108
  In a git workspace, `attach` records a VCS baseline (changed file paths from local `git status`) so delivery can compute the run-attributable delta automatically.
102
109
 
103
110
  ### Update
@@ -394,6 +401,7 @@ Field shape, inline vs stdin piping, and `record-change-rationales` syntax are i
394
401
  ## Rules
395
402
 
396
403
  - Always attach first and always deliver last once you are on a mission.
404
+ - `--objective-id` is accepted anywhere `--mission-id` is, and a full objective display id (`coo:695.k7xm`) makes `--mission-id` optional. Prefer passing it on every call once you know which objective you are running, so events, artifacts, and file changes land on that objective rather than on whichever one Overlord would rediscover.
397
405
  - `attach` is itself the go-ahead to start work — proceed with implementation immediately after attaching, without pausing to ask the user whether to continue. Only `connect` or `load-context` are for inspection without action; do not treat `attach` the same way.
398
406
  - Use `ovld protocol` commands and the connector's native commands/tools instead of ad hoc scripts.
399
407
  - Do not invent protocol subcommands. Use `ovld protocol help` when unsure.
@@ -1,9 +1,33 @@
1
1
  # CLI Command Reference
2
2
 
3
+ ## Addressing a mission or an objective
4
+
5
+ Every `ovld protocol` subcommand that takes `--mission-id` also takes
6
+ `--objective-id`, and an objective **display** id (`coo:756.k7xm`) already names
7
+ its mission — so `--mission-id` is optional whenever you pass one:
8
+
9
+ ```bash
10
+ ovld protocol update --objective-id coo:756.k7xm --summary "..." # mission derived
11
+ ovld protocol update --mission-id coo:756 --objective-id coo:756.k7xm # same thing
12
+ ```
13
+
14
+ Use the objective form when reconnecting to a mission that is running more than
15
+ one objective: "the active objective" is ambiguous there, and commands that
16
+ rediscover it (`attach`, `load-context`, `connect`) fail with
17
+ `ambiguous_active_objective` until you name one.
18
+
19
+ An objective **UUID** carries no parent mission, so it still needs
20
+ `--mission-id` next to it. The CLI also fills `--objective-id` in from
21
+ `OVERLORD_OBJECTIVE_ID` on session-scoped commands, so a launched agent rarely
22
+ types it at all. Two commands deliberately never inherit it:
23
+ `update-objective` (the id names the row being changed) and `discuss-objective`
24
+ (it wants a draft, not the objective already executing).
25
+
3
26
  ## Attach
4
27
 
5
28
  ```bash
6
29
  ovld protocol attach --mission-id $MISSION_ID [--objective-id $OVERLORD_OBJECTIVE_ID]
30
+ ovld protocol attach --objective-id coo:756.k7xm
7
31
  ```
8
32
 
9
33
  In a git workspace, `attach` records a VCS baseline (changed file paths from local `git status`) so delivery can compute the run-attributable delta automatically.
@@ -12,7 +12,7 @@ ovld protocol attachment-upload-file --session-key <sessionKey> --objective-id <
12
12
  ovld protocol attachment-download-url --session-key <sessionKey> --attachment-id <attachment-id>
13
13
  ```
14
14
 
15
- 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.
15
+ 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` is a full display ID that lets the server derive the mission; an attachment ID alone does not carry mission scope.
16
16
 
17
17
  ## Creating artifacts during a turn
18
18
 
@@ -31,4 +31,3 @@ For large artifacts such as planning documents, architecture decisions, research
31
31
  - Prefer `add-artifact` mid-turn (or a delivery artifact) with a `note` or `decision` type, a concise summary, and the repository file path — not the full document content.
32
32
 
33
33
  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.
34
-
@@ -1,5 +1,6 @@
1
1
  # MCP And API Defaults
2
2
 
3
+ - Every mission-scoped tool accepts `objectiveId` (hosted MCP) / `objective_id` (local shim) alongside `missionId`, taking an objective UUID or a display id such as `coo:756.k7xm`. A display id already names its mission, so `missionId` is **optional** whenever one is supplied — `overlord_load_mission_context`, `overlord_attach_session`, `overlord_update_session`, `overlord_deliver_session`, `overlord_add_artifact`, `overlord_add_objectives`, and `overlord_update_artifact` all resolve the mission from it. An objective **UUID** names no mission and still needs `missionId`. On `overlord_load_mission_context` and `overlord_attach_session` the objective is also a *pin*: it selects which objective to read or execute, which is the only way to address a mission that is running objectives in parallel.
3
4
  - API requires `agentIdentifier` and `connectionMethod` on attach/connect/prompt. Connector adapters set the appropriate agent identifier; the CLI uses `cli` as the connection method, and the MCP tool defaults to `mcp`. Override with `--agent` / `--method` when calling from a different runtime.
4
5
  - Hosted Overlord MCP (`/mcp`) uses camelCase JSON keys (`missionId`, `sessionKey`, `deviceFingerprint`) matching `POST /api/protocol/*` bodies. The local shim uses snake_case keys mapped to CLI flags (`mission_id`, `session_key`, `device_fingerprint`). Some local-only operations (`connect`, `revert`, `prompt`, runner queue tools) intentionally remain out of hosted MCP for now.
5
6
  - `discover_project` accepts an explicit project id (`projectId` hosted, `project_id` local shim) or a working directory (`workingDirectory` hosted, `working_directory` local shim). When resolving by directory and a device fingerprint is available, include `deviceFingerprint` / `device_fingerprint` so resource-directory matching prefers the current device.
@@ -7,8 +8,8 @@
7
8
  - 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
9
  - `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
10
  - `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_add_artifact` (hosted MCP) and `ovld protocol add-artifact` (CLI) create a mission artifact during a turn without delivering. Required: `missionId` / `--mission-id`, `type` / `--type`, `label` / `--label`, plus at least one of `contentText` / `--content-text`/`--content-text-file` or `externalUrl` / `--external-url`. Optional `sessionKey` / `--session-key` stamps session/objective provenance. Same service as REST `POST /api/missions/:id/artifacts`. The route is `POST /api/protocol/add-artifact`.
11
- - `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`.
11
+ - `overlord_add_artifact` (hosted MCP) and `ovld protocol add-artifact` (CLI) create a mission artifact during a turn without delivering. Required: `type` / `--type`, `label` / `--label`, mission scope (`missionId` / `--mission-id`, or an objective display id as `objectiveId` / `--objective-id`), plus at least one of `contentText` / `--content-text`/`--content-text-file` or `externalUrl` / `--external-url`. Optional `sessionKey` / `--session-key` stamps session/objective provenance; `objectiveId` / `--objective-id` does the same when there is no live session, and the session key wins if both are given. Same service as REST `POST /api/missions/:id/artifacts`. The route is `POST /api/protocol/add-artifact`.
12
+ - `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: `artifactId` / `--artifact-id`, `expectedRevision` / `--expected-revision`, and mission scope (`missionId` / `--mission-id`, or an objective display id as `objectiveId` / `--objective-id`). 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`.
12
13
  - `overlord_create_mission` / `overlord_add_objectives` accept optional `autoAdvance` (boolean; default false). `overlord_update_objective` (`objectiveId` plus optional `autoAdvance` and/or `instructionText`) and `ovld protocol update-objective --objective-id <id>` with `--auto-advance|--no-auto-advance` and/or `--instruction-text|--instruction-text-file` update an existing objective. Instruction text is editable only in `draft` or `future` state. The route is `POST /api/protocol/update-objective`.
13
14
  - 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.
14
15
  - "Artifacts" may be published mid-turn with `add-artifact` / `overlord_add_artifact`, revised with `update-artifact` / `overlord_update_artifact`, or attached at `deliver` 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.
@@ -164,12 +164,17 @@ const tools = [
164
164
  'Load structured mission context, objectives, history, artifacts, and shared context.',
165
165
  inputSchema: objectSchema(
166
166
  {
167
- missionId: stringProperty('Mission UUID or workspace display id such as coo:150.'),
167
+ missionId: stringProperty(
168
+ 'Mission UUID or workspace display id. Optional when objectiveId is a display id such as coo:756.k7xm, which already names its mission.'
169
+ ),
170
+ objectiveId: stringProperty(
171
+ 'Objective UUID or display id such as coo:756.k7xm. Returns that objective as the current one instead of rediscovering the mission active objective.'
172
+ ),
168
173
  executionTargetId: stringProperty(
169
174
  'Optional local execution target id for resolving sibling project resource paths.'
170
175
  )
171
176
  },
172
- ['missionId']
177
+ []
173
178
  )
174
179
  },
175
180
  {
@@ -178,7 +183,12 @@ const tools = [
178
183
  description: 'Append one or more draft objectives to an existing mission.',
179
184
  inputSchema: objectSchema(
180
185
  {
181
- missionId: stringProperty('Mission UUID or workspace display id.'),
186
+ missionId: stringProperty(
187
+ 'Mission UUID or workspace display id. Optional when objectiveId is a display id such as coo:756.k7xm, which already names its mission.'
188
+ ),
189
+ objectiveId: stringProperty(
190
+ 'Objective UUID or display id such as coo:756.k7xm. Used only to supply missionId when it is omitted.'
191
+ ),
182
192
  objectives: {
183
193
  type: 'array',
184
194
  description:
@@ -193,7 +203,7 @@ const tools = [
193
203
  })
194
204
  }
195
205
  },
196
- ['missionId', 'objectives']
206
+ ['objectives']
197
207
  )
198
208
  },
199
209
  {
@@ -221,7 +231,9 @@ const tools = [
221
231
  'Attach an MCP-hosted agent session to a mission before update/ask/deliver. Pass objectiveId when the caller already knows which objective to execute.',
222
232
  inputSchema: objectSchema(
223
233
  {
224
- missionId: stringProperty('Mission UUID or workspace display id.'),
234
+ missionId: stringProperty(
235
+ 'Mission UUID or workspace display id. Optional when objectiveId is a display id such as coo:756.k7xm, which already names its mission.'
236
+ ),
225
237
  objectiveId: stringProperty(
226
238
  'Optional objective UUID or display id (e.g. coo:756.k7xm). Pins attach to that objective.'
227
239
  ),
@@ -231,7 +243,7 @@ const tools = [
231
243
  'Optional local execution target id for resolving sibling project resource paths.'
232
244
  )
233
245
  },
234
- ['missionId']
246
+ []
235
247
  )
236
248
  },
237
249
  {
@@ -240,13 +252,18 @@ const tools = [
240
252
  description: 'Post an update, alert, decision, or discussion summary for an attached session.',
241
253
  inputSchema: objectSchema(
242
254
  {
243
- missionId: stringProperty('Mission UUID or workspace display id.'),
255
+ missionId: stringProperty(
256
+ 'Mission UUID or workspace display id. Optional when objectiveId is a display id such as coo:756.k7xm, which already names its mission.'
257
+ ),
258
+ objectiveId: stringProperty(
259
+ 'Objective UUID or display id such as coo:756.k7xm. Supplies missionId when it is omitted; the session key still determines which objective the event lands on.'
260
+ ),
244
261
  sessionKey: stringProperty('Session key returned by overlord_attach_session.'),
245
262
  summary: stringProperty('Update text.'),
246
263
  phase: stringProperty('Optional protocol phase.'),
247
264
  eventType: stringProperty('Optional event type. Defaults to update.')
248
265
  },
249
- ['missionId', 'sessionKey', 'summary']
266
+ ['sessionKey', 'summary']
250
267
  )
251
268
  },
252
269
  {
@@ -256,7 +273,12 @@ const tools = [
256
273
  'Deliver an attached session with explicit summary, optional change rationales, and optional human-action/tradeoff evidence.',
257
274
  inputSchema: objectSchema(
258
275
  {
259
- missionId: stringProperty('Mission UUID or workspace display id.'),
276
+ missionId: stringProperty(
277
+ 'Mission UUID or workspace display id. Optional when objectiveId is a display id such as coo:756.k7xm, which already names its mission.'
278
+ ),
279
+ objectiveId: stringProperty(
280
+ 'Objective UUID or display id such as coo:756.k7xm. Supplies missionId when it is omitted; the session key still determines which objective is delivered.'
281
+ ),
260
282
  sessionKey: stringProperty('Session key returned by overlord_attach_session.'),
261
283
  summary: stringProperty('Delivery summary.'),
262
284
  artifacts: {
@@ -284,7 +306,7 @@ const tools = [
284
306
  deferredWork: { type: 'array', description: 'Intentionally deferred work.' },
285
307
  assumptions: { type: 'array', description: 'Material implementation assumptions.' }
286
308
  },
287
- ['missionId', 'sessionKey', 'summary']
309
+ ['sessionKey', 'summary']
288
310
  )
289
311
  },
290
312
  {
@@ -294,7 +316,12 @@ const tools = [
294
316
  'Create a mission artifact during a turn without delivering (plan, notes, decision, URL). Provide type, label, and at least one of contentText or externalUrl. Optional sessionKey stamps provenance. Revise later with overlord_update_artifact.',
295
317
  inputSchema: objectSchema(
296
318
  {
297
- missionId: stringProperty('Mission UUID or workspace display id.'),
319
+ missionId: stringProperty(
320
+ 'Mission UUID or workspace display id. Optional when objectiveId is a display id such as coo:756.k7xm, which already names its mission.'
321
+ ),
322
+ objectiveId: stringProperty(
323
+ 'Objective UUID or display id such as coo:756.k7xm. Stamps objective provenance when no live sessionKey is available.'
324
+ ),
298
325
  type: stringProperty(
299
326
  'Artifact type: test_results, next_steps, note, url, decision, or migration.'
300
327
  ),
@@ -303,7 +330,7 @@ const tools = [
303
330
  externalUrl: stringProperty('Optional HTTP(S) URL.'),
304
331
  sessionKey: stringProperty('Optional live session key from attach.')
305
332
  },
306
- ['missionId', 'type', 'label']
333
+ ['type', 'label']
307
334
  )
308
335
  },
309
336
  {
@@ -313,7 +340,12 @@ const tools = [
313
340
  'Revise an existing mission artifact in place (label, Markdown content, and/or URL) using optimistic concurrency via expectedRevision.',
314
341
  inputSchema: objectSchema(
315
342
  {
316
- missionId: stringProperty('Mission UUID or workspace display id.'),
343
+ missionId: stringProperty(
344
+ 'Mission UUID or workspace display id. Optional when objectiveId is a display id such as coo:756.k7xm, which already names its mission.'
345
+ ),
346
+ objectiveId: stringProperty(
347
+ 'Objective UUID or display id such as coo:756.k7xm. Used only to supply missionId when it is omitted.'
348
+ ),
317
349
  artifactId: stringProperty('Artifact id from mission context.'),
318
350
  expectedRevision: {
319
351
  type: 'number',
@@ -323,7 +355,7 @@ const tools = [
323
355
  contentText: stringProperty('Optional new Markdown/text content.'),
324
356
  externalUrl: stringProperty('Optional HTTP(S) URL.')
325
357
  },
326
- ['missionId', 'artifactId', 'expectedRevision']
358
+ ['artifactId', 'expectedRevision']
327
359
  )
328
360
  },
329
361
  {
@@ -339,7 +371,8 @@ const tools = [
339
371
  title: stringProperty('Optional mission title.'),
340
372
  changeRationales: {
341
373
  type: 'array',
342
- description: 'One entry per meaningful file change (filePath, label, summary, why, impact).'
374
+ description:
375
+ 'One entry per meaningful file change (filePath, label, summary, why, impact).'
343
376
  },
344
377
  changedFiles: {
345
378
  type: 'array',
@@ -366,6 +399,26 @@ function requiredString(args, name) {
366
399
  return value;
367
400
  }
368
401
 
402
+ /**
403
+ * Forward mission/objective addressing to the CLI. The CLI owns the shared
404
+ * `@overlord/contract` parser and derives a mission from a display id before it
405
+ * performs local bookkeeping or calls the backend, so this standalone shim
406
+ * does not carry a second copy of the public-id regex.
407
+ */
408
+ function missionScopeFlags(args) {
409
+ const objectiveId = optionalString(args, 'objectiveId');
410
+ const missionId = optionalString(args, 'missionId');
411
+ if (!missionId && !objectiveId) {
412
+ throw new Error(
413
+ 'Missing required argument: missionId (pass it, or an objective display id such as coo:756.k7xm as objectiveId)'
414
+ );
415
+ }
416
+ return {
417
+ ...(missionId ? { 'mission-id': missionId } : {}),
418
+ ...(objectiveId ? { 'objective-id': objectiveId } : {})
419
+ };
420
+ }
421
+
369
422
  function callOverlordTool(name, args) {
370
423
  if (name === 'overlord_resolve_project') {
371
424
  return runProtocol('discover-project', {
@@ -425,7 +478,7 @@ function callOverlordTool(name, args) {
425
478
  }
426
479
  if (name === 'overlord_load_mission_context') {
427
480
  return runProtocol('load-context', {
428
- 'mission-id': requiredString(args, 'missionId'),
481
+ ...missionScopeFlags(args),
429
482
  ...(optionalString(args, 'executionTargetId')
430
483
  ? { 'execution-target-id': requiredString(args, 'executionTargetId') }
431
484
  : {})
@@ -434,7 +487,7 @@ function callOverlordTool(name, args) {
434
487
  if (name === 'overlord_add_objectives') {
435
488
  if (!Array.isArray(args.objectives)) throw new Error('objectives must be an array');
436
489
  return runProtocol('add-objectives', {
437
- 'mission-id': requiredString(args, 'missionId'),
490
+ ...missionScopeFlags(args),
438
491
  'objectives-json': args.objectives
439
492
  });
440
493
  }
@@ -446,17 +499,18 @@ function callOverlordTool(name, args) {
446
499
  }
447
500
  return runProtocol('update-objective', {
448
501
  'objective-id': requiredString(args, 'objectiveId'),
449
- ...(hasAutoAdvance ? (args.autoAdvance ? { 'auto-advance': true } : { 'no-auto-advance': true }) : {}),
502
+ ...(hasAutoAdvance
503
+ ? args.autoAdvance
504
+ ? { 'auto-advance': true }
505
+ : { 'no-auto-advance': true }
506
+ : {}),
450
507
  ...(hasInstructionText ? { 'instruction-text': requiredString(args, 'instructionText') } : {})
451
508
  });
452
509
  }
453
510
  if (name === 'overlord_attach_session') {
454
511
  return runProtocol('attach', {
455
- 'mission-id': requiredString(args, 'missionId'),
512
+ ...missionScopeFlags(args),
456
513
  agent: optionalString(args, 'agent') ?? DEFAULT_AGENT,
457
- ...(optionalString(args, 'objectiveId')
458
- ? { 'objective-id': requiredString(args, 'objectiveId') }
459
- : {}),
460
514
  ...(optionalString(args, 'model') ? { model: requiredString(args, 'model') } : {}),
461
515
  ...(optionalString(args, 'executionTargetId')
462
516
  ? { 'execution-target-id': requiredString(args, 'executionTargetId') }
@@ -465,7 +519,7 @@ function callOverlordTool(name, args) {
465
519
  }
466
520
  if (name === 'overlord_update_session') {
467
521
  return runProtocol('update', {
468
- 'mission-id': requiredString(args, 'missionId'),
522
+ ...missionScopeFlags(args),
469
523
  'session-key': requiredString(args, 'sessionKey'),
470
524
  summary: requiredString(args, 'summary'),
471
525
  ...(optionalString(args, 'phase') ? { phase: requiredString(args, 'phase') } : {}),
@@ -476,7 +530,7 @@ function callOverlordTool(name, args) {
476
530
  }
477
531
  if (name === 'overlord_deliver_session') {
478
532
  return runProtocol('deliver', {
479
- 'mission-id': requiredString(args, 'missionId'),
533
+ ...missionScopeFlags(args),
480
534
  'session-key': requiredString(args, 'sessionKey'),
481
535
  summary: requiredString(args, 'summary'),
482
536
  ...(args.noFileChanges === true ? { 'no-file-changes': true } : {}),
@@ -515,7 +569,7 @@ function callOverlordTool(name, args) {
515
569
  throw new Error('Provide at least one of contentText or externalUrl');
516
570
  }
517
571
  return runProtocol('add-artifact', {
518
- 'mission-id': requiredString(args, 'missionId'),
572
+ ...missionScopeFlags(args),
519
573
  type: requiredString(args, 'type'),
520
574
  label: requiredString(args, 'label'),
521
575
  ...(hasContentText ? { 'content-text': args.contentText } : {}),
@@ -536,7 +590,7 @@ function callOverlordTool(name, args) {
536
590
  throw new Error('Provide at least one of label, contentText, or externalUrl');
537
591
  }
538
592
  return runProtocol('update-artifact', {
539
- 'mission-id': requiredString(args, 'missionId'),
593
+ ...missionScopeFlags(args),
540
594
  'artifact-id': requiredString(args, 'artifactId'),
541
595
  'expected-revision': String(Math.trunc(args.expectedRevision)),
542
596
  ...(hasLabel ? { label: args.label } : {}),
@@ -590,7 +644,7 @@ process.stdin.on('data', async chunk => {
590
644
  result: {
591
645
  protocolVersion: PROTOCOL_VERSION,
592
646
  capabilities: { tools: { listChanged: false } },
593
- serverInfo: { name: 'overlord-__OVERLORD_ADAPTER_KEY__', version: '0.3.26' }
647
+ serverInfo: { name: 'overlord-__OVERLORD_ADAPTER_KEY__', version: '0.3.28' }
594
648
  }
595
649
  });
596
650
  continue;