overlord-cli 0.2610081212.0 → 0.2610201032.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.
@@ -1 +1 @@
1
- 0.3.50
1
+ 0.3.51
@@ -1,4 +1,4 @@
1
- contractVersion: "153"
1
+ contractVersion: "160"
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.50",
4
+ "version": "0.3.51",
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.50",
3
+ "version": "0.3.51",
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: "153"
1
+ contractVersion: "160"
2
2
  componentType: connector
3
3
  componentKey: claude
4
4
  label: "Claude Code Connector"
@@ -6,7 +6,7 @@
6
6
  "hooks": [
7
7
  {
8
8
  "type": "command",
9
- "command": "${CLAUDE_PLUGIN_ROOT}/scripts/user-prompt-submit-hook.sh"
9
+ "command": "\"${CLAUDE_PLUGIN_ROOT}/scripts/user-prompt-submit-hook.sh\""
10
10
  }
11
11
  ]
12
12
  }
@@ -17,7 +17,7 @@
17
17
  "hooks": [
18
18
  {
19
19
  "type": "command",
20
- "command": "${CLAUDE_PLUGIN_ROOT}/scripts/post-tool-use-hook.sh"
20
+ "command": "\"${CLAUDE_PLUGIN_ROOT}/scripts/post-tool-use-hook.sh\""
21
21
  }
22
22
  ]
23
23
  }
@@ -28,7 +28,7 @@
28
28
  "hooks": [
29
29
  {
30
30
  "type": "command",
31
- "command": "${CLAUDE_PLUGIN_ROOT}/scripts/stop-hook.sh"
31
+ "command": "\"${CLAUDE_PLUGIN_ROOT}/scripts/stop-hook.sh\""
32
32
  }
33
33
  ]
34
34
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "overlord",
3
- "version": "0.3.50",
3
+ "version": "0.3.51",
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: "153"
1
+ contractVersion: "160"
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.50",
3
+ "version": "0.3.51",
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: "153"
1
+ contractVersion: "160"
2
2
  componentType: connector
3
3
  componentKey: cursor
4
4
  label: "Cursor Connector"
@@ -1,4 +1,4 @@
1
- contractVersion: "153"
1
+ contractVersion: "160"
2
2
  componentType: connector
3
3
  componentKey: opencode
4
4
  label: "OpenCode Connector"
@@ -1,4 +1,4 @@
1
- contractVersion: "153"
1
+ contractVersion: "160"
2
2
  componentType: connector
3
3
  componentKey: pi
4
4
  label: "PI Connector"
@@ -1271,7 +1271,7 @@ process.stdin.on('data', async chunk => {
1271
1271
  result: {
1272
1272
  protocolVersion: PROTOCOL_VERSION,
1273
1273
  capabilities: { tools: { listChanged: false } },
1274
- serverInfo: { name: 'overlord-__OVERLORD_ADAPTER_KEY__', version: '0.3.50' }
1274
+ serverInfo: { name: 'overlord-__OVERLORD_ADAPTER_KEY__', version: '0.3.51' }
1275
1275
  }
1276
1276
  });
1277
1277
  continue;
@@ -17,6 +17,57 @@ invoke `ovld protocol …`). Tests enforce that it never reaches further.
17
17
 
18
18
  ---
19
19
 
20
+ ## Claude plugin CI
21
+
22
+ `.github/workflows/claude-plugin.yml` runs on relevant pull requests and manual
23
+ dispatch. `yarn connectors:check` includes `yarn connectors:claude:check`, which
24
+ uses the setup managed-file renderer to stage the complete Claude plugin in a
25
+ temporary directory, including the shared skill, references and post-tool hook.
26
+ It runs `claude plugin validate --strict` and removes staging on success or
27
+ failure. Install Claude Code 2.1.303, the CI tooling pin, to run it locally.
28
+ This pin does not update the fixture-backed verified `HARNESS-MATRIX` version.
29
+
30
+ `claude plugin test` runs mod handler tests (`.test.ts`/`.test.tsx`). Overlord's
31
+ shell-hook/skill plugin has no mod handlers, so the checker reports it as not
32
+ applicable. Hook behavior remains covered by executable descriptor fixtures in
33
+ `connectors:capabilities:check`. A future mod must add native tests and wire
34
+ `claude plugin test` into this job when it ships.
35
+
36
+ The manual workflow's `run_evals` input enables `yarn connectors:claude:eval`
37
+ only on the default branch, after validation. Configure the repository secret
38
+ `ANTHROPIC_API_KEY` for that job; PR checks receive no model credential.
39
+ Two cases in `test/fixtures/claude-plugin-evals` test inspection without
40
+ attachment and draft creation without execution. They consult the rendered
41
+ mission skill but cannot run shell commands or mutate real missions. They use
42
+ deterministic graders, one run per case, no baseline, a perfect-score threshold,
43
+ a $2 launch ceiling and 90-second per-case timeouts. Claude checks the ceiling
44
+ before launching each run, so one in-flight run can exceed it. This is a small
45
+ behavior smoke suite, not a statistical quality certification.
46
+
47
+ Reports stay local (`--no-publish`) and are uploaded as GitHub artifacts for
48
+ 14 days, including on failure when reports exist. Locally, set
49
+ `CLAUDE_PLUGIN_REPORT_DIR` to a persistent output directory; otherwise the
50
+ checker prints a newly created temporary report directory. Native nonzero
51
+ exit codes propagate, including failed graders, unavailable eval service,
52
+ authentication errors and budget exhaustion. There is no skip-to-green path.
53
+
54
+ ### Hook failure policy
55
+
56
+ Keep `onFailure` unset for current Claude hooks. `UserPromptSubmit` records
57
+ activity, `PostToolUse` observes an action that already ran, and `Stop` offers
58
+ guidance. Blocking on capture outages would impede prompts without enforcing
59
+ attach-before-edit. Scripts also deliberately suppress transport failures, so
60
+ a manifest field alone would not turn them into policy gates. The dormant
61
+ permission hook must continue to defer to Claude on failure under the contract.
62
+
63
+ Claude Code 2.1.295 added `onFailure: "block"` for command/HTTP hooks; it has no
64
+ effect on `Stop` or background command hooks. A future attach-before-edit gate
65
+ needs a separate opt-in pre-action policy, explicit unbound-session behavior,
66
+ failure fixtures and contract review before adoption. See Anthropic's
67
+ [hook failure reference](https://code.claude.com/docs/en/hooks#block-the-action-when-a-hook-fails),
68
+ [plugin command reference](https://code.claude.com/docs/en/plugins/cli-reference#plugin-test)
69
+ and [eval documentation](https://code.claude.com/docs/en/plugin-evals).
70
+
20
71
  ## A. Conformance Manifest (shared with Layer 3 §3.1)
21
72
 
22
73
  For each connector's `conformance-manifest.yaml`
package/dist/index.js CHANGED
@@ -39260,6 +39260,8 @@ Environment fallback:
39260
39260
  --session-key <- SESSION_KEY printed on stderr after attach/connect/prompt/resume-follow-up
39261
39261
  --mission-id <- mission display id (e.g. coo:8) or UUID
39262
39262
  --objective-id <- OVERLORD_OBJECTIVE_ID (objective display id, e.g. coo:8.k7xm)
39263
+ Read commands inherit it only with no explicit mission or a matching
39264
+ parent mission display id; explicit objective flags are always validated.
39263
39265
  backend URL <- overlord.toml backend_url, OVERLORD_BACKEND_URL, or dev OVERLORD_BACKEND_URL_DEV
39264
39266
  auth token <- OVERLORD_USER_TOKEN, OVLD_USER_TOKEN, or USER_TOKEN
39265
39267
 
@@ -39354,6 +39356,11 @@ connect:
39354
39356
  load-context:
39355
39357
  Purpose:
39356
39358
  Read mission details without creating a session.
39359
+ An explicit mission (flag or positional) ignores an inherited objective unless
39360
+ its parent mission display id matches. This also applies to read-context and
39361
+ attachment reads, including bootstrap fallback. For UUID selectors, explicitly
39362
+ pass the objective to pin the read. Explicit objective/mission pairs retain
39363
+ validation. Reads never change the active execution binding or update/delivery target.
39357
39364
  Required:
39358
39365
  --mission-id <id> Or --objective-id with a display id
39359
39366
  Optional:
@@ -39931,6 +39938,7 @@ hook-event:
39931
39938
  read-context:
39932
39939
  Purpose:
39933
39940
  Read persistent shared context written by earlier sessions.
39941
+ Explicit mission selection ignores a different inherited objective (see load-context).
39934
39942
  Required:
39935
39943
  --mission-id <id>
39936
39944
  Optional:
@@ -39989,6 +39997,7 @@ attachment-list:
39989
39997
  with --objective-id).
39990
39998
  Each entry includes id, filename, mimeType, sizeBytes, status, storageKey, and url.
39991
39999
  The url field is a server-relative path; prepend the backend base URL to download.
40000
+ Explicit mission selection ignores a different inherited objective (see load-context).
39992
40001
  Required:
39993
40002
  --mission-id <id>
39994
40003
  Optional:
@@ -39998,6 +40007,7 @@ attachment-download-url:
39998
40007
  Purpose:
39999
40008
  Return the authenticated download URL for a specific attachment, or save it
40000
40009
  to a new file using the CLI's existing authentication.
40010
+ Explicit mission selection ignores a different inherited objective (see load-context).
40001
40011
  Required:
40002
40012
  --mission-id <id>
40003
40013
  --attachment-id <id> (use the id from attachment-list output)
@@ -41164,6 +41174,25 @@ function missionDisplayId(mission) {
41164
41174
  const record2 = asRecord5(mission);
41165
41175
  return typeof record2.displayId === "string" ? record2.displayId : typeof record2.id === "string" ? record2.id : "unknown";
41166
41176
  }
41177
+ function createdObjectiveLines(mission) {
41178
+ const objectives = asRecord5(mission).objectives;
41179
+ if (!Array.isArray(objectives)) return [];
41180
+ return objectives.map((entry, index) => {
41181
+ const objective = asRecord5(entry);
41182
+ const identifier = typeof objective.displayId === "string" && objective.displayId || typeof objective.id === "string" && objective.id || `#${index + 1}`;
41183
+ const assignedAgent = typeof objective.assignedAgent === "string" ? objective.assignedAgent : "project default";
41184
+ const model = typeof objective.model === "string" ? objective.model : "project default";
41185
+ const resource = typeof objective.resourceKey === "string" ? objective.resourceKey : "project default";
41186
+ const fields = [
41187
+ `agent=${assignedAgent}`,
41188
+ `model=${model}`,
41189
+ `resource=${resource}`,
41190
+ `autoAdvance=${objective.autoAdvance === true}`
41191
+ ];
41192
+ const title = typeof objective.title === "string" && objective.title.trim();
41193
+ return ` Objective ${identifier}${title ? ` (${title})` : ""}: ${fields.join(", ")}`;
41194
+ });
41195
+ }
41167
41196
  function appendDeclaredOutputPaths({
41168
41197
  flags,
41169
41198
  active,
@@ -41272,6 +41301,8 @@ Run \`${primaryCommand} protocol help\` for usage.`
41272
41301
  rejectOversizedInlineJson({ flags: parsed.flags });
41273
41302
  const workingDirectory = process.cwd();
41274
41303
  const flags = Object.fromEntries(parsed.flags);
41304
+ const explicitMissionId = flagValue(parsed.flags, "--mission-id") ?? parsed.positional[0];
41305
+ const mayInheritObjective = (objectiveId) => !READ_ONLY_MISSION_SUBCOMMANDS.has(subcommand) || explicitMissionId === void 0 || missionDisplayIdFromObjectiveRef(objectiveId) === explicitMissionId.trim();
41275
41306
  const retiredFlags = RETIRED_CHANGE_TRACKING_FLAGS[subcommand] ?? [];
41276
41307
  const suppliedRetiredFlags = retiredFlags.filter((flag) => flag in flags);
41277
41308
  if (suppliedRetiredFlags.length > 0) {
@@ -41282,10 +41313,9 @@ Run \`${primaryCommand} protocol help\` for usage.`
41282
41313
  if (subcommand === "attach" && typeof flags["--execution-request-id"] !== "string" && process.env.OVERLORD_EXECUTION_REQUEST_ID) {
41283
41314
  flags["--execution-request-id"] = process.env.OVERLORD_EXECUTION_REQUEST_ID;
41284
41315
  }
41285
- if (OBJECTIVE_SCOPED_SUBCOMMANDS.has(subcommand) && typeof flags["--objective-id"] !== "string" && process.env.OVERLORD_OBJECTIVE_ID) {
41316
+ if (OBJECTIVE_SCOPED_SUBCOMMANDS.has(subcommand) && typeof flags["--objective-id"] !== "string" && process.env.OVERLORD_OBJECTIVE_ID && mayInheritObjective(process.env.OVERLORD_OBJECTIVE_ID)) {
41286
41317
  flags["--objective-id"] = process.env.OVERLORD_OBJECTIVE_ID;
41287
41318
  }
41288
- const explicitMissionId = flagValue(parsed.flags, "--mission-id") ?? parsed.positional[0];
41289
41319
  if (subcommand === "attach" || OBJECTIVE_SCOPED_SUBCOMMANDS.has(subcommand)) {
41290
41320
  const needsChannelId = subcommand === "attach" && typeof flags["--session-channel-id"] !== "string";
41291
41321
  const needsExecutionRequestId = subcommand === "attach" && typeof flags["--execution-request-id"] !== "string";
@@ -41306,7 +41336,7 @@ Run \`${primaryCommand} protocol help\` for usage.`
41306
41336
  if (needsExecutionRequestId && recovered.executionRequestId) {
41307
41337
  flags["--execution-request-id"] = recovered.executionRequestId;
41308
41338
  }
41309
- if (needsObjectiveId && recovered.objectiveId) {
41339
+ if (needsObjectiveId && recovered.objectiveId && mayInheritObjective(recovered.objectiveId)) {
41310
41340
  flags["--objective-id"] = recovered.objectiveId;
41311
41341
  }
41312
41342
  }
@@ -41864,7 +41894,10 @@ async function runManagementCommand({
41864
41894
  }
41865
41895
  }
41866
41896
  if (json2) printJson(mission);
41867
- else console.log(`Created mission ${missionDisplayId(mission)}`);
41897
+ else {
41898
+ console.log(`Created mission ${missionDisplayId(mission)}`);
41899
+ for (const line of createdObjectiveLines(mission)) console.log(line);
41900
+ }
41868
41901
  return;
41869
41902
  }
41870
41903
  case "attach":
@@ -42655,7 +42688,7 @@ Note: ${reinstallHint}`);
42655
42688
  message: "Usage: ovld runner service <install|start|stop|restart|status|uninstall> [--no-start] [--json]"
42656
42689
  });
42657
42690
  }
42658
- var SYNC_CHANGE_EVIDENCE_KEYS, OBJECTIVE_DISPLAY_ID_RE, PROTOCOL_FILE_FLAGS, SESSION_KEY_SUBCOMMANDS, OBJECTIVE_SCOPED_SUBCOMMANDS, RETIRED_CHANGE_TRACKING_FLAGS, MAX_CHANGES_HEALTH_ENTRIES, MAX_DECLARED_OUTPUT_PATHS, MAX_RUNNER_FAILURE_MESSAGE_LENGTH;
42691
+ var SYNC_CHANGE_EVIDENCE_KEYS, OBJECTIVE_DISPLAY_ID_RE, PROTOCOL_FILE_FLAGS, SESSION_KEY_SUBCOMMANDS, OBJECTIVE_SCOPED_SUBCOMMANDS, READ_ONLY_MISSION_SUBCOMMANDS, RETIRED_CHANGE_TRACKING_FLAGS, MAX_CHANGES_HEALTH_ENTRIES, MAX_DECLARED_OUTPUT_PATHS, MAX_RUNNER_FAILURE_MESSAGE_LENGTH;
42659
42692
  var init_commands = __esm({
42660
42693
  "src/commands.ts"() {
42661
42694
  "use strict";
@@ -42748,6 +42781,12 @@ var init_commands = __esm({
42748
42781
  "update-artifact",
42749
42782
  "write-context"
42750
42783
  ]);
42784
+ READ_ONLY_MISSION_SUBCOMMANDS = /* @__PURE__ */ new Set([
42785
+ "load-context",
42786
+ "read-context",
42787
+ "attachment-list",
42788
+ "attachment-download-url"
42789
+ ]);
42751
42790
  RETIRED_CHANGE_TRACKING_FLAGS = {
42752
42791
  update: ["--track-changed-files", "--changed-files-json", "--changed-files-file"],
42753
42792
  deliver: [