overlord-cli 0.2608181615.0 → 0.2608191441.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.28
1
+ 0.3.29
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://antigravity.google/schemas/v1/plugin.json",
3
3
  "name": "overlord",
4
- "version": "0.3.28",
4
+ "version": "0.3.29",
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.28",
3
+ "version": "0.3.29",
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,6 +1,6 @@
1
1
  {
2
2
  "name": "overlord",
3
- "version": "0.3.28",
3
+ "version": "0.3.29",
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.28",
3
+ "version": "0.3.29",
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",
@@ -84,7 +84,7 @@ Use this mode when the conversation starts normally and the user asks the agent
84
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>`.
85
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).
86
86
  5. If the user wants to establish a persistent session with a mission by ID, run `ovld protocol attach --mission-id <mission_id>`.
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.
87
+ 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.
88
88
  7. If you need to understand project routing before prompting, use `ovld protocol discover-project`.
89
89
  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 the file changes with 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).
90
90
  9. If you need other lifecycle commands or flags, run `ovld protocol help` and use the real subcommand list instead of guessing.
@@ -110,14 +110,37 @@ const tools = [
110
110
  ['name']
111
111
  )
112
112
  },
113
+ {
114
+ name: 'overlord_list_project_statuses',
115
+ title: 'List Overlord project statuses',
116
+ description:
117
+ "Read one project's board columns. Status names and order are defined per project, so two projects in the same workspace can label the same lifecycle differently; each status also carries a stable type (draft, next, execute, review, complete, blocked, cancelled) that does not vary by project.",
118
+ inputSchema: objectSchema(
119
+ {
120
+ projectId: stringProperty('Overlord project id, slug, or name.')
121
+ },
122
+ ['projectId']
123
+ )
124
+ },
113
125
  {
114
126
  name: 'overlord_search_missions',
115
127
  title: 'Search Overlord missions',
116
- description: 'Search missions in the OAuth-bound workspace.',
128
+ description:
129
+ "Search missions across the caller's authorized workspaces in one organization. Returns applied filters and truncation metadata; complete and cancelled missions remain eligible by default.",
117
130
  inputSchema: objectSchema({
118
131
  query: stringProperty('Search query text.'),
119
- status: stringProperty('Comma-separated status types, such as draft,execute,review.'),
120
- projectId: stringProperty('Optional project id, slug, or name.'),
132
+ status: stringProperty(
133
+ 'Comma-separated status TYPES, such as draft,next,execute,review. Types are workspace-invariant (draft, next, execute, review, complete, blocked, cancelled). Project-defined status names are not accepted here.'
134
+ ),
135
+ projectId: stringProperty(
136
+ 'Optional stable Overlord project UUID. Resolve a human project reference first.'
137
+ ),
138
+ resourceKey: stringProperty(
139
+ 'Optional logical resource key, matched by name within selected projects.'
140
+ ),
141
+ dateField: stringProperty('Date column for an explicit range: createdAt or updatedAt.'),
142
+ from: stringProperty('Optional inclusive ISO-8601 date/time lower bound.'),
143
+ to: stringProperty('Optional exclusive ISO-8601 date/time upper bound.'),
121
144
  limit: {
122
145
  type: 'number',
123
146
  description: 'Maximum result count. Defaults to 25.'
@@ -399,6 +422,17 @@ function requiredString(args, name) {
399
422
  return value;
400
423
  }
401
424
 
425
+ function optionalProjectUuid(args) {
426
+ const projectId = optionalString(args, 'projectId');
427
+ if (!projectId) return null;
428
+ if (!/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(projectId)) {
429
+ throw new Error(
430
+ 'projectId must be a stable Overlord project UUID; resolve human references first'
431
+ );
432
+ }
433
+ return projectId;
434
+ }
435
+
402
436
  /**
403
437
  * Forward mission/objective addressing to the CLI. The CLI owns the shared
404
438
  * `@overlord/contract` parser and derives a mission from a display id before it
@@ -440,13 +474,25 @@ function callOverlordTool(name, args) {
440
474
  ...(optionalString(args, 'slug') ? { slug: requiredString(args, 'slug') } : {})
441
475
  });
442
476
  }
477
+ if (name === 'overlord_list_project_statuses') {
478
+ return runProtocol('statuses', {
479
+ 'project-id': requiredString(args, 'projectId')
480
+ });
481
+ }
443
482
  if (name === 'overlord_search_missions') {
444
483
  return runProtocol('search-missions', {
484
+ 'response-version': '2',
445
485
  ...(optionalString(args, 'query') ? { query: requiredString(args, 'query') } : {}),
446
486
  ...(optionalString(args, 'status') ? { status: requiredString(args, 'status') } : {}),
447
- ...(optionalString(args, 'projectId')
448
- ? { 'project-id': requiredString(args, 'projectId') }
487
+ ...(optionalProjectUuid(args) ? { 'project-id': optionalProjectUuid(args) } : {}),
488
+ ...(optionalString(args, 'resourceKey')
489
+ ? { 'resource-key': requiredString(args, 'resourceKey') }
490
+ : {}),
491
+ ...(optionalString(args, 'dateField')
492
+ ? { 'date-field': requiredString(args, 'dateField') }
449
493
  : {}),
494
+ ...(optionalString(args, 'from') ? { from: requiredString(args, 'from') } : {}),
495
+ ...(optionalString(args, 'to') ? { to: requiredString(args, 'to') } : {}),
450
496
  ...(typeof args.limit === 'number' && Number.isFinite(args.limit)
451
497
  ? { limit: String(Math.trunc(args.limit)) }
452
498
  : {})
@@ -644,7 +690,7 @@ process.stdin.on('data', async chunk => {
644
690
  result: {
645
691
  protocolVersion: PROTOCOL_VERSION,
646
692
  capabilities: { tools: { listChanged: false } },
647
- serverInfo: { name: 'overlord-__OVERLORD_ADAPTER_KEY__', version: '0.3.28' }
693
+ serverInfo: { name: 'overlord-__OVERLORD_ADAPTER_KEY__', version: '0.3.29' }
648
694
  }
649
695
  });
650
696
  continue;
package/dist/index.js CHANGED
@@ -18725,6 +18725,13 @@ var init_migration_ledger = __esm({
18725
18725
  }
18726
18726
  });
18727
18727
 
18728
+ // ../database/dist/next-status-type-migration-runtime.js
18729
+ var init_next_status_type_migration_runtime = __esm({
18730
+ "../database/dist/next-status-type-migration-runtime.js"() {
18731
+ "use strict";
18732
+ }
18733
+ });
18734
+
18728
18735
  // ../database/dist/objective-display-key.js
18729
18736
  var init_objective_display_key = __esm({
18730
18737
  "../database/dist/objective-display-key.js"() {
@@ -18749,6 +18756,13 @@ var init_project_resources_resource_key_migration_runtime = __esm({
18749
18756
  }
18750
18757
  });
18751
18758
 
18759
+ // ../database/dist/project-statuses-migration-runtime.js
18760
+ var init_project_statuses_migration_runtime = __esm({
18761
+ "../database/dist/project-statuses-migration-runtime.js"() {
18762
+ "use strict";
18763
+ }
18764
+ });
18765
+
18752
18766
  // ../database/dist/connection.js
18753
18767
  var init_connection = __esm({
18754
18768
  "../database/dist/connection.js"() {
@@ -18758,8 +18772,10 @@ var init_connection = __esm({
18758
18772
  init_ext_everhour_migration_runtime();
18759
18773
  init_local_paths();
18760
18774
  init_migration_ledger();
18775
+ init_next_status_type_migration_runtime();
18761
18776
  init_objective_display_key_migration_runtime();
18762
18777
  init_project_resources_resource_key_migration_runtime();
18778
+ init_project_statuses_migration_runtime();
18763
18779
  }
18764
18780
  });
18765
18781
 
@@ -18787,6 +18803,7 @@ var init_migrate_postgres = __esm({
18787
18803
  init_ext_everhour_migration_runtime();
18788
18804
  init_migration_ledger();
18789
18805
  init_objective_display_key_migration_runtime();
18806
+ init_project_statuses_migration_runtime();
18790
18807
  }
18791
18808
  });
18792
18809
 
@@ -20960,14 +20977,37 @@ load-context:
20960
20977
 
20961
20978
  search-missions:
20962
20979
  Purpose:
20963
- Find missions by keyword, status, or project.
20980
+ Find missions by keyword, status type, or project.
20964
20981
  Optional:
20965
20982
  --query <text> Free-text search
20966
- --status <csv> Comma-separated statuses (e.g. next-up,execute)
20967
- --project-id <id> Restrict to one project
20983
+ --status <csv> Comma-separated status TYPES (e.g. execute,review).
20984
+ Types are workspace-invariant: draft, next, execute, review,
20985
+ complete, blocked, cancelled. Project-defined status
20986
+ names (board column labels) are not accepted here \u2014
20987
+ use \`statuses\` to read one project's names.
20988
+ --project-id <id|slug|name> Restrict to one project (CLI resolves human references)
20989
+ --resource-key <csv> Restrict to logical resource key names
20990
+ --date-field <createdAt|updatedAt>
20991
+ Date column for explicit range filtering
20992
+ --from <ISO-8601> Inclusive date/time lower bound
20993
+ --to <ISO-8601> Exclusive date/time upper bound
20968
20994
  --limit <n> Max results (default: 25)
20995
+ --response-version <1|2> 1 (default) returns the legacy array; 2 returns
20996
+ SearchMissionsResponseV2 with snippets, match
20997
+ evidence, appliedFilters, and truncation counts
20969
20998
  Returns:
20970
- JSON with matching missions.
20999
+ JSON with matching missions (v1) or the versioned search envelope (v2).
21000
+
21001
+ statuses:
21002
+ Purpose:
21003
+ List one project's board columns. Statuses are defined per project, so their
21004
+ names and order vary between projects in the same workspace; the status TYPE
21005
+ of each column does not.
21006
+ Required:
21007
+ --project-id <id> Project id, slug, or name
21008
+ Returns:
21009
+ JSON array of statuses ordered by position, each with id, projectId, key,
21010
+ name, type, position, isDefault, and isTerminal.
20971
21011
 
20972
21012
  discuss-objective:
20973
21013
  Purpose:
@@ -23988,8 +24028,10 @@ async function runManagementCommand({
23988
24028
  const query = flagValue(parsed.flags, "--query");
23989
24029
  const projectId = flagValue(parsed.flags, "--project-id");
23990
24030
  const limit = flagValue(parsed.flags, "--limit");
24031
+ const statusTypes = (flagValue(parsed.flags, "--status") ?? "").split(",").map((value) => value.trim()).filter((value) => value !== "");
23991
24032
  if (query) params.set("q", query);
23992
24033
  if (projectId) params.set("projectId", projectId);
24034
+ if (statusTypes.length > 0) params.set("statusTypes", statusTypes.join(","));
23993
24035
  if (limit) params.set("limit", limit);
23994
24036
  let missions;
23995
24037
  const result = await runtime.backend.get(
@@ -24007,6 +24049,45 @@ async function runManagementCommand({
24007
24049
  }
24008
24050
  return;
24009
24051
  }
24052
+ // Board columns are project-scoped (coo:752): two projects in one workspace
24053
+ // may name and order their statuses differently, so the only way to discover
24054
+ // a board's columns is to ask the project that owns them. Read-only —
24055
+ // status definitions are edited in project settings.
24056
+ case "statuses": {
24057
+ const sub = parsed.positional[0];
24058
+ if (sub !== "list") {
24059
+ throw new CliError({
24060
+ message: "Usage: ovld statuses list --project-id <id|slug|name> [--json]"
24061
+ });
24062
+ }
24063
+ const projectRef = flagValue(parsed.flags, "--project-id");
24064
+ if (!projectRef) {
24065
+ throw new CliError({
24066
+ message: "Missing --project-id (accepts a project id, slug, or name)"
24067
+ });
24068
+ }
24069
+ const project = await resolveProjectByIdOrName({
24070
+ backend: runtime.backend,
24071
+ projectRef
24072
+ });
24073
+ const statuses = await runtime.backend.get(
24074
+ `/api/projects/${encodeURIComponent(project.id)}/statuses`
24075
+ );
24076
+ if (json) printJson({ projectId: project.id, statuses });
24077
+ else {
24078
+ for (const status of statuses) {
24079
+ const record = asRecord5(status);
24080
+ const flags = [
24081
+ record.isDefault === true ? "default" : null,
24082
+ record.isTerminal === true ? "terminal" : null
24083
+ ].filter(Boolean).join(",");
24084
+ console.log(
24085
+ `${record.position ?? ""} ${record.key ?? ""} ${record.name ?? ""} ${record.type ?? ""} ${flags}`
24086
+ );
24087
+ }
24088
+ }
24089
+ return;
24090
+ }
24010
24091
  case "requests": {
24011
24092
  const sub = parsed.positional[0];
24012
24093
  if (!sub) {
@@ -24738,6 +24819,7 @@ var COMMAND_FLAGS = {
24738
24819
  "--no-start"
24739
24820
  ],
24740
24821
  missions: ["--status", "--query", "--project-id", "--limit"],
24822
+ statuses: ["--project-id"],
24741
24823
  requests: ["--mission-id", "--objective-id", "--revision", "--decision", "--text"],
24742
24824
  inputs: ["--mission-id", "--objective-id", "--channel-id", "--body", "--kind"],
24743
24825
  mission: [],
@@ -24857,6 +24939,13 @@ Missions:
24857
24939
  ${primaryCommand} prompt "<objective>" [--json]
24858
24940
  ${primaryCommand} attach <missionId> [agent] [--json]
24859
24941
  ${primaryCommand} missions list [--status <csv>] [--project-id <id>] [--json]
24942
+ --status filters status TYPES
24943
+ (draft,execute,review,complete,blocked,cancelled),
24944
+ not the project-defined status names on a board
24945
+ ${primaryCommand} statuses list --project-id <id|slug|name> [--json]
24946
+ List one project's board columns (key, name, type,
24947
+ position, default/terminal). Statuses are defined
24948
+ per project, so they vary between projects.
24860
24949
  ${primaryCommand} mission context|events|deliveries|artifacts|rationales <missionId> [--json]
24861
24950
  ${primaryCommand} requests [--mission-id <id>] [--objective-id <id>] [--json]
24862
24951
  List open and recent agent decisions
@@ -24886,7 +24975,8 @@ Protocol (JSON output by default):
24886
24975
  ${primaryCommand} protocol heartbeat --mission-id <id> --session-key <key>
24887
24976
  ${primaryCommand} protocol ask --mission-id <id> --session-key <key> --question "..."
24888
24977
  ${primaryCommand} protocol deliver --mission-id <id> --session-key <key> --summary "..."
24889
- ${primaryCommand} protocol search-missions --query "<text>" --status next-up,execute
24978
+ ${primaryCommand} protocol search-missions --query "<text>" --status execute,review
24979
+ ${primaryCommand} protocol statuses --project-id <id|slug|name>
24890
24980
  ${primaryCommand} protocol load-context --mission-id <id>
24891
24981
  ${primaryCommand} protocol help
24892
24982
 
@@ -24939,6 +25029,7 @@ var KNOWN_COMMANDS = /* @__PURE__ */ new Set([
24939
25029
  "resume",
24940
25030
  "runner",
24941
25031
  "missions",
25032
+ "statuses",
24942
25033
  "requests",
24943
25034
  "inputs",
24944
25035
  "inbox",