overlord-cli 0.2609091820.0 → 0.2609181229.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.
package/README.md CHANGED
@@ -257,9 +257,9 @@ colocation convention):
257
257
  The packaged CLI lives in this module as a self-contained Yarn sub-project:
258
258
 
259
259
  ```bash
260
- yarn build:cli:prod # tsc emit + esbuild bundle to cli/dist/index.js
260
+ yarn cli:build:prod # tsc emit + esbuild bundle to cli/dist/index.js
261
261
  yarn test:cli # unit + subprocess smoke tests
262
- yarn pack:cli:prod # produce an installable tarball
262
+ yarn cli:pack:prod # produce an installable tarball
263
263
  node cli/bin/ovld.mjs version
264
264
  ```
265
265
 
@@ -276,7 +276,7 @@ cli/
276
276
  ```
277
277
 
278
278
  The CLI ships command parsing, config/auth onboarding, connector setup, backend
279
- client calls, and local runner/agent launch logic. Run `yarn build:cli:prod` before using
279
+ client calls, and local runner/agent launch logic. Run `yarn cli:build:prod` before using
280
280
  the compiled CLI (`node cli/bin/ovld.mjs …`).
281
281
 
282
282
  ### In-repo build vs installed CLI
@@ -1 +1 @@
1
- 0.3.45
1
+ 0.3.47
@@ -1,4 +1,4 @@
1
- contractVersion: "140"
1
+ contractVersion: "143"
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.45",
4
+ "version": "0.3.47",
5
5
  "description": "Chat-driven access to Overlord mission protocol workflows through skills and MCP.",
6
6
  "author": {
7
7
  "name": "Cooperativ",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "overlord",
3
- "version": "0.3.45",
3
+ "version": "0.3.47",
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",
@@ -1,4 +1,4 @@
1
- contractVersion: "140"
1
+ contractVersion: "143"
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.45",
3
+ "version": "0.3.47",
4
4
  "description": "Chat-driven access to Overlord mission protocol workflows with hook-driven activity capture.",
5
5
  "author": {
6
6
  "name": "Cooperativ",
@@ -1,4 +1,4 @@
1
- contractVersion: "140"
1
+ contractVersion: "143"
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.45",
3
+ "version": "0.3.47",
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",
@@ -1,4 +1,4 @@
1
- contractVersion: "140"
1
+ contractVersion: "143"
2
2
  componentType: connector
3
3
  componentKey: cursor
4
4
  label: "Cursor Connector"
@@ -1,4 +1,4 @@
1
- contractVersion: "140"
1
+ contractVersion: "143"
2
2
  componentType: connector
3
3
  componentKey: opencode
4
4
  label: "OpenCode Connector"
@@ -1,4 +1,4 @@
1
- contractVersion: "140"
1
+ contractVersion: "143"
2
2
  componentType: connector
3
3
  componentKey: pi
4
4
  label: "PI Connector"
@@ -82,9 +82,9 @@ Do not attach to a mission just because it was mentioned or opened in conversati
82
82
 
83
83
  Use this mode when the conversation starts normally and the user asks the agent to create, inspect, connect to, or otherwise use Overlord.
84
84
 
85
- 1. If the user wants to create missions (and does not ask to start execution), run `ovld protocol create --agent <agent-identifier> --objectives-json '[{"objective":"..."}]'`.
85
+ 1. If the user wants to create missions (and does not ask to start execution), resolve the intended project and run `ovld protocol create --project-id <project-id> --agent <agent-identifier> --objectives-json '[{"objective":"..."}]'`.
86
86
  - When `--session-key` and `--mission-id` are provided, it creates a follow-up draft.
87
- - When session flags are omitted, it resolves the project by matching current working directory (or `--working-directory`) to Overlord project resource directories, then creates a standalone draft.
87
+ - Creation never infers a project. If the user explicitly asks to capture work outside every project, use `--unassigned-to-project`; otherwise resolve a project first with `ovld protocol discover-project` and pass its id.
88
88
  - Pass multiple items in `--objectives-json` when creating ordered steps for the same feature or goal.
89
89
  - 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.
90
90
  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.
@@ -95,7 +95,7 @@ Use this mode when the conversation starts normally and the user asks the agent
95
95
  5. If the user wants to establish a persistent session with a mission by ID, run `ovld protocol attach --mission-id <mission_id>`.
96
96
  6. If the user wants to find a mission but does not know the ID, run `ovld protocol search-missions --query "..." --status execute,review` and ask the user to confirm.
97
97
  7. If you need to understand project routing before prompting, use `ovld protocol discover-project`.
98
- 8. If the user wants to **record work that is already finished** in this chat (for example, something you just built in a chat app) as a completed mission, run `ovld protocol record-work` (or the hosted `overlord_record_work` MCP tool). This creates a mission with one completed objective, records explicitly supplied changed files and optional rationales, lands it in the review column, and runs the standard Gemini delivery summary — all in one call, with no `attach`/`deliver`. Do **not** use it for in-progress work. The exact submission format is in [reference/record-work.md](reference/record-work.md).
98
+ 8. If the user wants to **record work that is already finished** in this chat (for example, something you just built in a chat app) as a completed mission, run `ovld protocol record-work --project-id <project-id>` (or the hosted `overlord_record_work` MCP tool). This creates a mission with one completed objective, records explicitly supplied changed files and optional rationales, lands it in the review column, and runs the standard Gemini delivery summary — all in one call, with no `attach`/`deliver`. Do **not** use it for in-progress work. The exact submission format is in [reference/record-work.md](reference/record-work.md).
99
99
  9. If you need other lifecycle commands or flags, run `ovld protocol help` and use the real subcommand list instead of guessing.
100
100
  10. Once you attach to a mission, switch back to Mode 1 and follow the full mission lifecycle.
101
101
 
@@ -225,15 +225,15 @@ nothing qualifies. Omit the report when none of these facts apply.
225
225
  Human actions are collected across every mission into the Feed page's **Human actions** rail,
226
226
  where the operator reads them without the delivery context. Each item must stand alone:
227
227
 
228
- | Field | Expected | What to write |
229
- | ---------- | -------- | ---------------------------------------------------------------------------------------------- |
230
- | `action` | required | One imperative sentence naming the exact thing to do, where, and with what value. |
231
- | `reason` | expected | Why the step is needed and what breaks or stays incomplete until it is done. |
232
- | `category` | expected | `environment`, `database`, `deployment`, `codegen`, `packaging`, `external_service`, or `other`.|
233
- | `blocking` | optional | `true` when the delivered work does not function until this is done. |
228
+ | Field | Expected | What to write |
229
+ | ---------- | ---------- | ------------------------------------------------------------------------------------------------- |
230
+ | `action` | required | One imperative sentence naming the exact thing to do, where, and with what value. |
231
+ | `reason` | expected | Why the step is needed and what breaks or stays incomplete until it is done. |
232
+ | `category` | expected | `environment`, `database`, `deployment`, `codegen`, `packaging`, `external_service`, or `other`. |
233
+ | `blocking` | optional | `true` when the delivered work does not function until this is done. |
234
234
  | `command` | when known | The exact command, setting name, or value to apply, verbatim. Placeholders in `<angle brackets>`. |
235
- | `verify` | when known | How the operator confirms it worked: a command to run, a URL to open, or the state to observe. |
236
- | `link` | when known | An HTTP(S) URL or a repository-relative file path (never another URI scheme). |
235
+ | `verify` | when known | How the operator confirms it worked: a command to run, a URL to open, or the state to observe. |
236
+ | `link` | when known | An HTTP(S) URL or a repository-relative file path (never another URI scheme). |
237
237
 
238
238
  Vague (the operator has to rediscover everything):
239
239
 
@@ -333,8 +333,8 @@ When creating missions from within a repository:
333
333
 
334
334
  - Prefer `create` by default for draft mission creation.
335
335
  - Use `prompt` only when the user explicitly asks to start execution immediately.
336
- - Both commands can resolve the project from the current working directory; use `--working-directory` to override or `--project-id` to be explicit.
337
- - Follow-up `create` calls under an active session inherit the current mission's project by default, but `--project-id` can override that when the follow-up belongs in a different project.
336
+ - `create`, `prompt`, and `record-work` require an explicit `--project-id`; use `discover-project` first when the project is known only from the checkout. They never infer a destination project.
337
+ - Use `create --unassigned-to-project` only when the user deliberately requests an account-owned inbox capture. `--inbox` is a compatibility alias.
338
338
  - Create multiple missions when each prompt represents a different feature or goal.
339
339
  - Add objectives to the same mission when each prompt is a sequential step toward the same feature or goal; use `ovld protocol add-objectives --mission-id <mission_id> --objectives-json '[{"objective":"..."}]'`.
340
340
  - `create` and `prompt` require `--objectives-json` or `--objectives-file` with an ordered array of `{ "objective": "...", "title": "...", "autoAdvance": true }` objects. A single objective is just an array with one item. `--auto-advance` / `--no-auto-advance` set the default when an item omits `autoAdvance` (default off).
@@ -345,17 +345,18 @@ When creating missions from within a repository:
345
345
  - `create`, `prompt`, `create-mission`, and `record-work` accept `--assigned-to <member>` to set the mission's human owner. Accepts a username, an email, a user-id UUID, or the `orgid:username` member ID. When omitted, the assignee defaults to the mission creator.
346
346
 
347
347
  ```bash
348
- ovld protocol create --agent <agent-identifier> --objectives-json '[{"objective":"Capture follow-up work from this repository"}]'
348
+ ovld protocol create --project-id <project-id> --agent <agent-identifier> --objectives-json '[{"objective":"Capture follow-up work from this repository"}]'
349
349
  ```
350
350
 
351
351
  ```bash
352
352
  # One call: a draft mission whose first objective is already assigned to Codex.
353
353
  ovld protocol create --agent <agent-identifier> \
354
+ --project-id <project-id> \
354
355
  --objectives-json '[{"objective":"Implement the API","agent":"codex","model":"gpt-5.6-terra"},{"objective":"Add CLI docs","agent":"claude"}]'
355
356
  ```
356
357
 
357
358
  ```bash
358
- ovld protocol prompt --agent <agent-identifier> --objectives-json '[{"objective":"Implement feature X"}]'
359
+ ovld protocol prompt --project-id <project-id> --agent <agent-identifier> --objectives-json '[{"objective":"Implement feature X"}]'
359
360
  ```
360
361
 
361
362
  ```bash
@@ -413,8 +414,8 @@ When you need a project ID for a protocol command and the mission prompt did not
413
414
  **Locally (CLI inside a shell on the user's machine):**
414
415
 
415
416
  1. `--project-id` if explicitly provided.
416
- 2. Otherwise, let the CLI match the current working directory (the default behavior of `create`, `prompt`, `discover-project`).
417
- 3. If working-directory resolution returns nothing, read `.overlord/project.json` from the cwd (or any ancestor you have access to). Select the `projects[]` entry with `isPrimary: true` and pass its id via `--project-id`. If the array or primary entry is missing, treat the metadata as invalid and run `ovld doctor`; do not fall back to a top-level projection. To associate missions with a different linked project, pass that project's id explicitly.
417
+ 2. Otherwise, run `ovld protocol discover-project` for the current working directory, then pass its returned id via `--project-id`.
418
+ 3. If discovery returns nothing, read `.overlord/project.json` from the cwd (or any ancestor you have access to). Select the `projects[]` entry with `isPrimary: true` and pass its id via `--project-id`. If the array or primary entry is missing, treat the metadata as invalid and run `ovld doctor`; do not fall back to a top-level projection. To associate missions with a different linked project, pass that project's id explicitly.
418
419
 
419
420
  **Over MCP (web agents and hosted tools, where the server cannot see the agent's cwd):**
420
421
 
@@ -175,8 +175,8 @@ When creating missions from within a repository:
175
175
 
176
176
  - Prefer `create` by default for draft mission creation.
177
177
  - Use `prompt` only when the user explicitly asks to start execution immediately.
178
- - Both commands can resolve the project from the current working directory; use `--working-directory` to override or `--project-id` to be explicit.
179
- - Follow-up `create` calls under an active session inherit the current mission's project by default, but `--project-id` can override that when the follow-up belongs in a different project.
178
+ - `create`, `prompt`, and `record-work` require an explicit `--project-id`; use `discover-project` first when the project is known only from the checkout. They never infer a destination project.
179
+ - Use `create --unassigned-to-project` only when the user deliberately requests an account-owned inbox capture. `--inbox` is a compatibility alias.
180
180
  - Create multiple missions when each prompt represents a different feature or goal.
181
181
  - Add objectives to the same mission when each prompt is a sequential step toward the same feature or goal; use `ovld protocol add-objectives --mission-id <mission_id> --objectives-json '[{"objective":"..."}]'`.
182
182
  - `create` and `prompt` require `--objectives-json` or `--objectives-file` with an ordered array of `{ "objective": "...", "title": "...", "autoAdvance": true }` objects. A single objective is just an array with one item. `--auto-advance` / `--no-auto-advance` map each opted-in item to authoritative Run Queue membership (default off).
@@ -186,17 +186,18 @@ When creating missions from within a repository:
186
186
  - `record-work` creates exactly one **completed** objective from a single `--objective` (or positional / an `objective` field in `--payload-json`) plus a `--summary` and file-change data — it does not take `--objectives-json`. See [record-work.md](record-work.md).
187
187
 
188
188
  ```bash
189
- ovld protocol create --agent <agent-identifier> --objectives-json '[{"objective":"Capture follow-up work from this repository"}]'
189
+ ovld protocol create --project-id <project-id> --agent <agent-identifier> --objectives-json '[{"objective":"Capture follow-up work from this repository"}]'
190
190
  ```
191
191
 
192
192
  ```bash
193
193
  # One call: a draft mission whose first objective is already assigned to Codex.
194
194
  ovld protocol create --agent <agent-identifier> \
195
+ --project-id <project-id> \
195
196
  --objectives-json '[{"objective":"Implement the API","agent":"codex","model":"gpt-5.6-terra"},{"objective":"Add CLI docs","agent":"claude"}]'
196
197
  ```
197
198
 
198
199
  ```bash
199
- ovld protocol prompt --agent <agent-identifier> --objectives-json '[{"objective":"Implement feature X"}]'
200
+ ovld protocol prompt --project-id <project-id> --agent <agent-identifier> --objectives-json '[{"objective":"Implement feature X"}]'
200
201
  ```
201
202
 
202
203
  ```bash
@@ -277,8 +278,8 @@ When you need a project ID for a protocol command and the mission prompt did not
277
278
  **Locally (CLI inside a shell on the user's machine):**
278
279
 
279
280
  1. `--project-id` if explicitly provided.
280
- 2. Otherwise, let the CLI match the current working directory (the default behavior of `create`, `prompt`, `discover-project`).
281
- 3. If working-directory resolution returns nothing, read `.overlord/project.json` from the cwd (or any ancestor you have access to). Select the `projects[]` entry with `isPrimary: true` and pass its id via `--project-id`. If the array or primary entry is missing, treat the metadata as invalid and run `ovld doctor`; do not fall back to a top-level projection. To associate missions with a different linked project, pass that project's id explicitly.
281
+ 2. Otherwise, run `ovld protocol discover-project` for the current working directory, then pass its returned id via `--project-id`.
282
+ 3. If discovery returns nothing, read `.overlord/project.json` from the cwd (or any ancestor you have access to). Select the `projects[]` entry with `isPrimary: true` and pass its id via `--project-id`. If the array or primary entry is missing, treat the metadata as invalid and run `ovld doctor`; do not fall back to a top-level projection. To associate missions with a different linked project, pass that project's id explicitly.
282
283
 
283
284
  **Over MCP (web agents and hosted tools, where the server cannot see the agent's cwd):**
284
285
 
@@ -7,7 +7,8 @@
7
7
  - `permission-request` is invoked by connector permission hooks installed by adapter bundles. Agents do not normally call it directly.
8
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.
9
9
  - Change rationales are optional annotations attached to `update` or `deliver` (`--change-rationales-json` / `--change-rationales-file`, or `changeRationales` over MCP) and stored as `change_rationales` rows. Normal delivery requires only a summary; objective-ledger evidence is captured locally and synchronized independently.
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, explicitly supplied changed files, optional 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_create_mission` requires `projectId` for a mission, unless `unassignedToProject: true` deliberately requests an account-owned inbox item; omission of both is rejected. `overlord_create_inbox_item` is also explicit by name.
11
+ - `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, explicitly supplied changed files, optional rationales, and the standard Gemini delivery summary — no `attach`/`deliver`. Both require an explicit project reference. The submission format is in [record-work.md](record-work.md). The route is `POST /api/protocol/record-work`.
11
12
  - `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
13
  - `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`.
13
14
  - `overlord_delete_missions` / `overlord_delete_objectives` (hosted MCP) and `ovld protocol delete-missions` / `delete-objectives` (CLI) bulk soft-delete one to 100 mission or objective UUID/display-id references atomically. They require `confirm: true` / `--confirm`; before setting it, agents must show the resolved list to the user and receive affirmative approval. A missing, duplicate, deleted, or unauthorized target rejects the entire request. Mission deletion includes live child objectives; objective deletion removes live Run Queue membership.
@@ -257,10 +257,15 @@ const tools = [
257
257
  name: 'overlord_create_mission',
258
258
  title: 'Create Overlord mission',
259
259
  description:
260
- 'Create a draft mission in projectId, or an account-owned inbox item when projectId is omitted. This connector never chooses a project implicitly.',
260
+ 'Create a draft mission with projectId. To intentionally create an account-owned inbox item, set unassignedToProject to true; omission of both is rejected.',
261
261
  inputSchema: objectSchema(
262
262
  {
263
- projectId: stringProperty('Optional Overlord project id, slug, or name.'),
263
+ projectId: stringProperty(
264
+ 'Overlord project id, slug, or name. Required unless unassignedToProject is true.'
265
+ ),
266
+ unassignedToProject: booleanProperty(
267
+ 'Set true only to intentionally create an account-owned inbox item instead of a project mission. Cannot be combined with projectId.'
268
+ ),
264
269
  objective: stringProperty('Initial objective text.'),
265
270
  title: stringProperty('Optional mission title.'),
266
271
  resourceKey: stringProperty('Optional logical project resource key for the objective.'),
@@ -271,7 +276,7 @@ const tools = [
271
276
  'Optional model identifier for the assigned agent. Requires agent; rejected without it.'
272
277
  ),
273
278
  assignedTo: stringProperty(
274
- 'Optional workspace member to own the mission (workspace_users.id, profile UUID, orgid:username, bare username, or email). Rejected when the member is not in the workspace; meaningless on the inbox fallback.'
279
+ 'Optional workspace member to own the mission (workspace_users.id, profile UUID, orgid:username, bare username, or email). Rejected when the member is not in the workspace; meaningless for an unassigned inbox item.'
275
280
  ),
276
281
  autoAdvance: booleanProperty(
277
282
  'When true, Overlord queues the next objective for execution after this one is delivered. Defaults to false.'
@@ -496,7 +501,7 @@ const tools = [
496
501
  name: 'overlord_queue_objective',
497
502
  title: 'Queue objective',
498
503
  description:
499
- 'Use this only when the user explicitly asks to add, move, or remove an objective in the project Run Queue. Queue membership is target-neutral and sequences delivery-driven launches; it does not directly launch the objective.',
504
+ 'Use this only when the user explicitly asks to add, move, or remove an objective in the project Run Queue. Queue membership is target-neutral and sequences delivery-driven launches; it does not directly launch the objective. Adding an objective also queues every not-yet-started objective after it in the mission; a removed objective moves to the end of its mission.',
500
505
  inputSchema: objectSchema(
501
506
  {
502
507
  objectiveId: stringProperty('Objective UUID or display id such as coo:756.k7xm.'),
@@ -634,14 +639,27 @@ const tools = [
634
639
  items: {
635
640
  type: 'object',
636
641
  properties: {
637
- action: { type: 'string', description: 'Required. One imperative sentence: what, where, which value.' },
638
- reason: { type: 'string', description: 'Expected. Why it is needed and what stays broken until done.' },
642
+ action: {
643
+ type: 'string',
644
+ description: 'Required. One imperative sentence: what, where, which value.'
645
+ },
646
+ reason: {
647
+ type: 'string',
648
+ description: 'Expected. Why it is needed and what stays broken until done.'
649
+ },
639
650
  category: {
640
651
  type: 'string',
641
- description: 'Expected. environment, database, deployment, codegen, packaging, external_service, or other.'
652
+ description:
653
+ 'Expected. environment, database, deployment, codegen, packaging, external_service, or other.'
654
+ },
655
+ blocking: {
656
+ type: 'boolean',
657
+ description: 'True when the delivered work does not function until this is done.'
658
+ },
659
+ command: {
660
+ type: 'string',
661
+ description: 'Exact command, setting, or value to apply, verbatim.'
642
662
  },
643
- blocking: { type: 'boolean', description: 'True when the delivered work does not function until this is done.' },
644
- command: { type: 'string', description: 'Exact command, setting, or value to apply, verbatim.' },
645
663
  verify: { type: 'string', description: 'How the operator confirms it worked.' },
646
664
  link: { type: 'string', description: 'HTTP(S) URL or repository-relative file path.' }
647
665
  },
@@ -852,7 +870,8 @@ async function callOverlordTool(name, args) {
852
870
  return runProtocol('create', {
853
871
  ...(optionalString(args, 'projectId')
854
872
  ? { 'project-id': requiredString(args, 'projectId') }
855
- : { inbox: true }),
873
+ : {}),
874
+ ...(args.unassignedToProject === true ? { 'unassigned-to-project': true } : {}),
856
875
  objective: requiredString(args, 'objective'),
857
876
  ...(optionalString(args, 'title') ? { title: requiredString(args, 'title') } : {}),
858
877
  ...(optionalString(args, 'resourceKey')
@@ -873,7 +892,7 @@ async function callOverlordTool(name, args) {
873
892
  }
874
893
  if (name === 'overlord_create_inbox_item') {
875
894
  return runProtocol('create', {
876
- inbox: true,
895
+ 'unassigned-to-project': true,
877
896
  title: requiredString(args, 'title'),
878
897
  objective: requiredString(args, 'objective')
879
898
  });
@@ -1209,7 +1228,7 @@ process.stdin.on('data', async chunk => {
1209
1228
  result: {
1210
1229
  protocolVersion: PROTOCOL_VERSION,
1211
1230
  capabilities: { tools: { listChanged: false } },
1212
- serverInfo: { name: 'overlord-__OVERLORD_ADAPTER_KEY__', version: '0.3.45' }
1231
+ serverInfo: { name: 'overlord-__OVERLORD_ADAPTER_KEY__', version: '0.3.47' }
1213
1232
  }
1214
1233
  });
1215
1234
  continue;
@@ -127,9 +127,7 @@ Setup should work without the desktop app and should not fail hard when the Clau
127
127
 
128
128
  ## Cursor Connector
129
129
 
130
- Can be implemented after Codex and Claude.
131
-
132
- Requirements:
130
+ Shipped. Requirements:
133
131
 
134
132
  - Install local Cursor plugin/rules/commands.
135
133
  - Add `beforeSubmitPrompt` hook to record follow-ups.
@@ -156,9 +154,8 @@ Requirements:
156
154
 
157
155
  ## Antigravity Connector
158
156
 
159
- Can be implemented after local MVP.
160
-
161
- Requirements:
157
+ Shipped, currently fixture-proven only at tier 0 — see
158
+ `connectors/adapters/antigravity/CAPABILITIES.md`. Requirements:
162
159
 
163
160
  - Install Antigravity plugin.
164
161
  - Provide protocol skill and commands.
package/dist/index.js CHANGED
@@ -18478,7 +18478,10 @@ function launchSessionSnapshotFromMetadata(metadata) {
18478
18478
  openOnLaunch: viewer?.openOnLaunch !== false,
18479
18479
  // A snapshot frozen before `openAs` existed carries none; `window` is what
18480
18480
  // those runs actually did, so the absent case must not become `tab`.
18481
- openAs: parseViewerOpenAs(viewer?.openAs)
18481
+ openAs: parseViewerOpenAs(viewer?.openAs),
18482
+ // A snapshot frozen before `background` existed carries none; those runs
18483
+ // opened in the foreground, so absent must not become background.
18484
+ background: viewer?.background === true
18482
18485
  },
18483
18486
  executionProviderSource: source(cast.executionProviderSource),
18484
18487
  viewerOpenSource: source(cast.viewerOpenSource),
@@ -19072,11 +19075,20 @@ function latchSupportsOpenAs(productVersion) {
19072
19075
  return false;
19073
19076
  return compareLatchProductVersions(version2, LATCH_OPEN_AS_MIN_PRODUCT_VERSION) >= 0;
19074
19077
  }
19075
- function buildLatchOpenArgs({ providerSessionId, viewer, openAs, productVersion }) {
19078
+ function latchSupportsOpenBackground(productVersion) {
19079
+ const version2 = trimmed5(productVersion);
19080
+ if (!version2)
19081
+ return false;
19082
+ return compareLatchProductVersions(version2, LATCH_OPEN_BACKGROUND_MIN_PRODUCT_VERSION) >= 0;
19083
+ }
19084
+ function buildLatchOpenArgs({ providerSessionId, viewer, openAs, background, productVersion }) {
19076
19085
  const args = ["open", providerSessionId, "--with", viewer];
19077
19086
  if (openAs && latchSupportsOpenAs(productVersion)) {
19078
19087
  args.push("--as", parseViewerOpenAs(openAs));
19079
19088
  }
19089
+ if (typeof background === "boolean" && latchSupportsOpenBackground(productVersion)) {
19090
+ args.push(background ? "--background" : "--foreground");
19091
+ }
19080
19092
  args.push("--json");
19081
19093
  return args;
19082
19094
  }
@@ -19086,7 +19098,7 @@ function latchAttachCommand({ executable = "latch", providerSessionId }) {
19086
19098
  function shouldUseLatchProvider({ providerKind, latchSelectable }) {
19087
19099
  return trimmed5(providerKind)?.toLowerCase() === "latch" && latchSelectable === true;
19088
19100
  }
19089
- var LATCH_MANIFEST_FORMAT_VERSION, DEFAULT_LATCH_TERMINAL_SIZE, LATCH_OPEN_AS_MIN_PRODUCT_VERSION;
19101
+ var LATCH_MANIFEST_FORMAT_VERSION, DEFAULT_LATCH_TERMINAL_SIZE, LATCH_OPEN_AS_MIN_PRODUCT_VERSION, LATCH_OPEN_BACKGROUND_MIN_PRODUCT_VERSION;
19090
19102
  var init_latch_launch = __esm({
19091
19103
  "../packages/core/dist/service/latch-launch.js"() {
19092
19104
  "use strict";
@@ -19094,6 +19106,7 @@ var init_latch_launch = __esm({
19094
19106
  LATCH_MANIFEST_FORMAT_VERSION = 1;
19095
19107
  DEFAULT_LATCH_TERMINAL_SIZE = { cols: 120, rows: 36 };
19096
19108
  LATCH_OPEN_AS_MIN_PRODUCT_VERSION = "0.2608140931.0";
19109
+ LATCH_OPEN_BACKGROUND_MIN_PRODUCT_VERSION = "0.2609181007.0";
19097
19110
  }
19098
19111
  });
19099
19112
 
@@ -36788,6 +36801,7 @@ function openLatchViewer({
36788
36801
  providerSessionId,
36789
36802
  viewerKind,
36790
36803
  openAs,
36804
+ background,
36791
36805
  productVersion
36792
36806
  }) {
36793
36807
  const viewer = latchViewerFlagForKind(viewerKind);
@@ -36802,7 +36816,7 @@ function openLatchViewer({
36802
36816
  const sendsOpenAs = Boolean(openAs) && latchSupportsOpenAs(productVersion);
36803
36817
  const result = spawnLatchJson({
36804
36818
  executable,
36805
- args: buildLatchOpenArgs({ providerSessionId, viewer, openAs, productVersion })
36819
+ args: buildLatchOpenArgs({ providerSessionId, viewer, openAs, background, productVersion })
36806
36820
  });
36807
36821
  if (result.status !== 0) {
36808
36822
  const detail = (result.stderr || result.stdout || `exit ${result.status ?? "null"}`).trim();
@@ -36812,7 +36826,13 @@ function openLatchViewer({
36812
36826
  attachCommand
36813
36827
  };
36814
36828
  }
36815
- return { ok: true, viewer, openAs: sendsOpenAs ? parseViewerOpenAs(openAs) : null };
36829
+ const sendsBackground = typeof background === "boolean" && latchSupportsOpenBackground(productVersion);
36830
+ return {
36831
+ ok: true,
36832
+ viewer,
36833
+ openAs: sendsOpenAs ? parseViewerOpenAs(openAs) : null,
36834
+ background: sendsBackground ? background : null
36835
+ };
36816
36836
  }
36817
36837
  var init_latch_launch2 = __esm({
36818
36838
  "src/latch-launch.ts"() {
@@ -37688,6 +37708,9 @@ async function launchAgent({
37688
37708
  providerSessionId: created.providerSession.providerSessionId,
37689
37709
  viewerKind: snapshot?.viewer.kind ?? "iterm",
37690
37710
  openAs: snapshot?.viewer.openAs ?? null,
37711
+ // Falls back to the resolved profile for a request claimed before the
37712
+ // snapshot carried `background`.
37713
+ background: snapshot?.viewer.background ?? options.terminalLaunchBackground ?? false,
37691
37714
  productVersion: latchProductVersion
37692
37715
  });
37693
37716
  }
@@ -38231,6 +38254,8 @@ create-run-queue:
38231
38254
  Returns:
38232
38255
  The created RunQueueDto, unpaused and positioned after the existing queues.
38233
38256
  Rules:
38257
+ A new queue stays until it is used. Once it has held an entry and its last
38258
+ entry completes, is removed, or moves away, the queue deletes itself.
38234
38259
  Queue definitions are project configuration and require the project:update
38235
38260
  permission, so a mission_lifecycle-scoped agent token cannot run this. Entry
38236
38261
  operations (queue-objective, dequeue-objective, reorder-run-queue) are
@@ -38306,6 +38331,9 @@ queue-objective:
38306
38331
  Choose at most one of --after, --front, and --position. Without --queue,
38307
38332
  --after selects its queue; otherwise the default queue is used. Re-running
38308
38333
  without placement is idempotent.
38334
+ Queueing an objective also queues every not-yet-started objective after it
38335
+ in the mission, directly behind it. Queue order and mission objective order
38336
+ are one sequence: reordering either reorders the other.
38309
38337
 
38310
38338
  dequeue-objective:
38311
38339
  Purpose:
@@ -38316,6 +38344,9 @@ dequeue-objective:
38316
38344
  --project-id <id|slug|name> Confirms the objective's project
38317
38345
  Returns:
38318
38346
  { removed, objectiveId }. Already-unqueued objectives return removed: false.
38347
+ Rules:
38348
+ A removed objective that has not started moves to the end of its mission's
38349
+ objectives, and stays last when queued again unless it is moved.
38319
38350
 
38320
38351
  retry-queue-entry:
38321
38352
  Purpose:
@@ -38450,15 +38481,16 @@ delete-objectives:
38450
38481
 
38451
38482
  create:
38452
38483
  Purpose:
38453
- Create a draft mission without attaching. Without --project-id and
38454
- without a resolvable working-directory project, falls back to an
38455
- account-owned inbox item instead of failing.
38484
+ Create a draft mission without attaching. A project must be named
38485
+ explicitly; use --unassigned-to-project only for deliberate account-owned
38486
+ inbox capture.
38456
38487
  Required:
38457
38488
  --objective "<text>" or --objectives-json / --objectives-file <path|->
38458
38489
  Optional:
38459
38490
  --title <text>
38460
- --project-id <id> Skips working-directory project resolution
38461
- --inbox Force an account-owned inbox item instead of a project mission
38491
+ --project-id <id> Required for a project mission; never inferred
38492
+ --unassigned-to-project Intentionally create an account-owned inbox item
38493
+ --inbox Compatibility alias for --unassigned-to-project
38462
38494
  --assigned-to <id> Workspace member to own the mission (meaningless on the inbox fallback)
38463
38495
  --auto-advance / --no-auto-advance
38464
38496
  Add matching objectives to the authoritative Run Queue. Defaults to off.
@@ -38475,9 +38507,9 @@ prompt:
38475
38507
  Create a mission and attach to it in one call.
38476
38508
  Required:
38477
38509
  --objective "<text>" or --objectives-json / --objectives-file <path|->
38510
+ --project-id <id>
38478
38511
  Optional:
38479
38512
  --title <text>
38480
- --project-id <id>
38481
38513
  --agent <identifier>
38482
38514
  --model <identifier>
38483
38515
  --external-session-id <id>
@@ -38501,9 +38533,9 @@ record-work:
38501
38533
  Required:
38502
38534
  --objective "<text>" (or positional, or an "objective" field in --payload-json)
38503
38535
  --summary or --summary-file <path|->
38536
+ --project-id <id>
38504
38537
  Optional:
38505
38538
  --title <text>
38506
- --project-id <id>
38507
38539
  --assigned-to <id> Workspace member to own the mission
38508
38540
  --artifacts-json / --artifacts-file <path|->
38509
38541
  --change-rationales-json / --change-rationales-file <path|->