@bragi-gmbh/codebus 1.2.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 (133) hide show
  1. package/bin/codebus.js +2 -0
  2. package/dist/binding-guard.js +97 -0
  3. package/dist/binding-guard.js.map +1 -0
  4. package/dist/client.js +94 -0
  5. package/dist/client.js.map +1 -0
  6. package/dist/commands/ack.js +47 -0
  7. package/dist/commands/ack.js.map +1 -0
  8. package/dist/commands/archive.js +21 -0
  9. package/dist/commands/archive.js.map +1 -0
  10. package/dist/commands/as.js +299 -0
  11. package/dist/commands/as.js.map +1 -0
  12. package/dist/commands/ask.js +189 -0
  13. package/dist/commands/ask.js.map +1 -0
  14. package/dist/commands/auth.js +33 -0
  15. package/dist/commands/auth.js.map +1 -0
  16. package/dist/commands/checkin.js +235 -0
  17. package/dist/commands/checkin.js.map +1 -0
  18. package/dist/commands/decision.js +52 -0
  19. package/dist/commands/decision.js.map +1 -0
  20. package/dist/commands/digest.js +117 -0
  21. package/dist/commands/digest.js.map +1 -0
  22. package/dist/commands/doctor.js +106 -0
  23. package/dist/commands/doctor.js.map +1 -0
  24. package/dist/commands/factory.js +191 -0
  25. package/dist/commands/factory.js.map +1 -0
  26. package/dist/commands/github-login.js +205 -0
  27. package/dist/commands/github-login.js.map +1 -0
  28. package/dist/commands/graph.js +88 -0
  29. package/dist/commands/graph.js.map +1 -0
  30. package/dist/commands/health.js +34 -0
  31. package/dist/commands/health.js.map +1 -0
  32. package/dist/commands/inbox.js +83 -0
  33. package/dist/commands/inbox.js.map +1 -0
  34. package/dist/commands/ingest.js +553 -0
  35. package/dist/commands/ingest.js.map +1 -0
  36. package/dist/commands/init.js +97 -0
  37. package/dist/commands/init.js.map +1 -0
  38. package/dist/commands/install.js +520 -0
  39. package/dist/commands/install.js.map +1 -0
  40. package/dist/commands/invite.js +152 -0
  41. package/dist/commands/invite.js.map +1 -0
  42. package/dist/commands/jira.js +237 -0
  43. package/dist/commands/jira.js.map +1 -0
  44. package/dist/commands/join.js +96 -0
  45. package/dist/commands/join.js.map +1 -0
  46. package/dist/commands/links.js +66 -0
  47. package/dist/commands/links.js.map +1 -0
  48. package/dist/commands/login.js +84 -0
  49. package/dist/commands/login.js.map +1 -0
  50. package/dist/commands/morning.js +121 -0
  51. package/dist/commands/morning.js.map +1 -0
  52. package/dist/commands/next.js +66 -0
  53. package/dist/commands/next.js.map +1 -0
  54. package/dist/commands/onboarding.js +109 -0
  55. package/dist/commands/onboarding.js.map +1 -0
  56. package/dist/commands/pack.js +276 -0
  57. package/dist/commands/pack.js.map +1 -0
  58. package/dist/commands/plan-gh.js +425 -0
  59. package/dist/commands/plan-gh.js.map +1 -0
  60. package/dist/commands/plan.js +465 -0
  61. package/dist/commands/plan.js.map +1 -0
  62. package/dist/commands/pr.js +88 -0
  63. package/dist/commands/pr.js.map +1 -0
  64. package/dist/commands/question.js +142 -0
  65. package/dist/commands/question.js.map +1 -0
  66. package/dist/commands/read.js +84 -0
  67. package/dist/commands/read.js.map +1 -0
  68. package/dist/commands/refs.js +357 -0
  69. package/dist/commands/refs.js.map +1 -0
  70. package/dist/commands/reply.js +38 -0
  71. package/dist/commands/reply.js.map +1 -0
  72. package/dist/commands/repo.js +1198 -0
  73. package/dist/commands/repo.js.map +1 -0
  74. package/dist/commands/report.js +41 -0
  75. package/dist/commands/report.js.map +1 -0
  76. package/dist/commands/resolve-refs.js +21 -0
  77. package/dist/commands/resolve-refs.js.map +1 -0
  78. package/dist/commands/resolve.js +93 -0
  79. package/dist/commands/resolve.js.map +1 -0
  80. package/dist/commands/send.js +168 -0
  81. package/dist/commands/send.js.map +1 -0
  82. package/dist/commands/sent.js +22 -0
  83. package/dist/commands/sent.js.map +1 -0
  84. package/dist/commands/session.js +426 -0
  85. package/dist/commands/session.js.map +1 -0
  86. package/dist/commands/statusline.js +43 -0
  87. package/dist/commands/statusline.js.map +1 -0
  88. package/dist/commands/task.js +140 -0
  89. package/dist/commands/task.js.map +1 -0
  90. package/dist/commands/tick.js +233 -0
  91. package/dist/commands/tick.js.map +1 -0
  92. package/dist/commands/upgrade.js +76 -0
  93. package/dist/commands/upgrade.js.map +1 -0
  94. package/dist/commands/watch.js +169 -0
  95. package/dist/commands/watch.js.map +1 -0
  96. package/dist/commands/whoami.js +27 -0
  97. package/dist/commands/whoami.js.map +1 -0
  98. package/dist/config.js +103 -0
  99. package/dist/config.js.map +1 -0
  100. package/dist/directives.js +102 -0
  101. package/dist/directives.js.map +1 -0
  102. package/dist/errors.js +110 -0
  103. package/dist/errors.js.map +1 -0
  104. package/dist/git-hooks.js +116 -0
  105. package/dist/git-hooks.js.map +1 -0
  106. package/dist/graph-bootstrap.js +95 -0
  107. package/dist/graph-bootstrap.js.map +1 -0
  108. package/dist/graph-remote.js +889 -0
  109. package/dist/graph-remote.js.map +1 -0
  110. package/dist/graph.js +335 -0
  111. package/dist/graph.js.map +1 -0
  112. package/dist/index.js +154 -0
  113. package/dist/index.js.map +1 -0
  114. package/dist/kit/graph-publish.mjs +400 -0
  115. package/dist/mail-latency.js +120 -0
  116. package/dist/mail-latency.js.map +1 -0
  117. package/dist/mcp-registry.js +859 -0
  118. package/dist/mcp-registry.js.map +1 -0
  119. package/dist/mcp.js +193 -0
  120. package/dist/mcp.js.map +1 -0
  121. package/dist/output.js +12 -0
  122. package/dist/output.js.map +1 -0
  123. package/dist/positioning.js +21 -0
  124. package/dist/positioning.js.map +1 -0
  125. package/dist/rolestore.js +89 -0
  126. package/dist/rolestore.js.map +1 -0
  127. package/dist/session.js +49 -0
  128. package/dist/session.js.map +1 -0
  129. package/dist/sessionstore.js +736 -0
  130. package/dist/sessionstore.js.map +1 -0
  131. package/dist/version-check.js +97 -0
  132. package/dist/version-check.js.map +1 -0
  133. package/package.json +47 -0
@@ -0,0 +1,465 @@
1
+ import { resolveConfig } from "../config.js";
2
+ import { makeCtx, workspaceId, repoId } from "../client.js";
3
+ import { render } from "../output.js";
4
+ import { CodebusError } from "../errors.js";
5
+ /**
6
+ * codebus plan … — SP-A planning-layer CLI (fleet-v3 build/w2-sp-a-cli,
7
+ * lane 2 of docs/plans/fleet-v3/sp-a-planning-layer.md §A.3).
8
+ *
9
+ * Every verb below is a thin wrapper over an RPC defined in
10
+ * supabase/migrations/0049_plan_maps.sql (lane 1, frozen/merged — this file
11
+ * calls those exact RPCs and does not reinterpret their contracts). Plans
12
+ * and plan_tickets carry NO display_id column in 0049 (unlike tasks/
13
+ * questions/decisions, which get one from bus_counters, 0004) — every verb
14
+ * below therefore takes the raw plan/ticket UUID directly. There is no
15
+ * WORKSPACE-SCOPED display-id resolution step to perform here (the house
16
+ * rule in question.ts/task.ts applies to CB-TASK-/CB-Q- style ids, which
17
+ * simply don't exist for plans/tickets in the merged schema); `--msg` in
18
+ * `plan review record` is the one place a display id (CB-MSG-…) is
19
+ * threaded through, and it is passed verbatim to plan_review_record, which
20
+ * resolves it server-side, scoped to the plan's own workspace (0049's own
21
+ * fix for the cross-workspace display_id collision class).
22
+ *
23
+ * Every RPC error is surfaced verbatim via CodebusError(error.message) —
24
+ * 0049's typed error codes (unknown_repo, not_authorized_resolver,
25
+ * cursor_regression, …) reach the caller unmodified.
26
+ */
27
+ // ─────────────────────────────────────────────────────────── plan lifecycle
28
+ export async function planCreateCore(ctx, opts) {
29
+ const ws = await workspaceId(ctx);
30
+ const { data, error } = await ctx.supabase.rpc("plan_create", {
31
+ p_workspace_id: ws,
32
+ p_title: opts.title,
33
+ p_destination: opts.destination,
34
+ p_stale_hours: opts.staleHours ?? 8,
35
+ p_is_drill: !!opts.drill,
36
+ p_spec_ref: opts.specRef ?? null,
37
+ });
38
+ if (error)
39
+ throw new CodebusError(error.message);
40
+ return { id: data };
41
+ }
42
+ export async function planAssignPlannerCore(ctx, planId, plannerSlug) {
43
+ const { error } = await ctx.supabase.rpc("plan_assign_planner", { p_plan_id: planId, p_planner_slug: plannerSlug });
44
+ if (error)
45
+ throw new CodebusError(error.message);
46
+ }
47
+ export async function planTransitionCore(ctx, planId, from, to, reason) {
48
+ const { data, error } = await ctx.supabase.rpc("plan_transition", {
49
+ p_plan_id: planId, p_expected_status: from, p_new_status: to, p_reason: reason ?? null,
50
+ });
51
+ if (error)
52
+ throw new CodebusError(error.message);
53
+ return { status: data };
54
+ }
55
+ // ────────────────────────────────────────────────────────────────── tickets
56
+ export async function planTicketChartCore(ctx, planId, opts) {
57
+ const ws = await workspaceId(ctx);
58
+ const repoIdVal = opts.repo ? await repoId(ctx, ws, opts.repo) : null;
59
+ const { data, error } = await ctx.supabase.rpc("plan_chart_ticket", {
60
+ p_plan_id: planId, p_type: opts.type, p_title: opts.title,
61
+ p_body: opts.body ?? null, p_repo_id: repoIdVal, p_dedupe_key: opts.dedupeKey ?? null,
62
+ });
63
+ if (error)
64
+ throw new CodebusError(error.message);
65
+ return { id: data };
66
+ }
67
+ export async function planTicketDispatchCore(ctx, ticketId, recipient) {
68
+ // Enqueue ONLY — 0049 grants plan_dispatch_claim/plan_dispatch_ack to
69
+ // `fleet_runner` alone (mirroring fleet_wake_claim/fleet_wake_ack; a
70
+ // deliberate BLOCKER-severity build-review fix in 0049 restricting a prior
71
+ // any-authenticated grant). The CLI authenticates as `authenticated`
72
+ // (never fleet_runner — there is no session mechanism that assumes a raw
73
+ // Postgres role), so it cannot itself claim+send the outbox row. See the
74
+ // final build report for this gap: nothing in this codebase currently
75
+ // drains plan_ticket_dispatches (no plan_drain() cron job analogous to
76
+ // 0047's fleet_drain()) — out of THIS lane's scope (chart/dispatch/
77
+ // resolve/cancel/reopen/edge/note/review/morning/show, not a drain verb).
78
+ const { data, error } = await ctx.supabase.rpc("plan_ticket_dispatch", {
79
+ p_ticket_id: ticketId, p_recipient_slug: recipient ?? null,
80
+ });
81
+ if (error)
82
+ throw new CodebusError(error.message);
83
+ return { dispatchId: data };
84
+ }
85
+ export async function planTicketResolveCore(ctx, ticketId, opts) {
86
+ const { error } = await ctx.supabase.rpc("plan_ticket_resolve", {
87
+ p_ticket_id: ticketId, p_result: opts.result, p_summary: opts.summary,
88
+ p_refs: opts.refs ?? [], p_dispatch_id: opts.dispatchId ?? null, p_owner_override: !!opts.ownerOverride,
89
+ });
90
+ if (error)
91
+ throw new CodebusError(error.message);
92
+ }
93
+ export async function planTicketCancelCore(ctx, ticketId, cascade) {
94
+ const { error } = await ctx.supabase.rpc("plan_ticket_cancel", { p_ticket_id: ticketId, p_cascade: cascade });
95
+ if (error)
96
+ throw new CodebusError(error.message);
97
+ }
98
+ export async function planTicketReopenCore(ctx, ticketId) {
99
+ const { error } = await ctx.supabase.rpc("plan_ticket_reopen", { p_ticket_id: ticketId });
100
+ if (error)
101
+ throw new CodebusError(error.message);
102
+ }
103
+ // ──────────────────────────────────────────────────────────── blocker edges
104
+ export async function planEdgeAddCore(ctx, ticketId, blockedByTicketId) {
105
+ const { error } = await ctx.supabase.rpc("plan_edge_add", {
106
+ p_ticket_id: ticketId, p_blocked_by_ticket_id: blockedByTicketId,
107
+ });
108
+ if (error)
109
+ throw new CodebusError(error.message);
110
+ }
111
+ export async function planEdgeRemoveCore(ctx, ticketId, blockedByTicketId) {
112
+ const { error } = await ctx.supabase.rpc("plan_edge_remove", {
113
+ p_ticket_id: ticketId, p_blocked_by_ticket_id: blockedByTicketId,
114
+ });
115
+ if (error)
116
+ throw new CodebusError(error.message);
117
+ }
118
+ // ───────────────────────────────────────────────────────────────────── note
119
+ export async function planNoteCore(ctx, planId, summary, ticketId, evidenceRef) {
120
+ const { error } = await ctx.supabase.rpc("plan_note", {
121
+ p_plan_id: planId, p_summary: summary, p_ticket_id: ticketId ?? null, p_evidence_ref: evidenceRef ?? null,
122
+ });
123
+ if (error)
124
+ throw new CodebusError(error.message);
125
+ }
126
+ // ───────────────────────────────────────────────────────────── review record
127
+ export async function planReviewRecordCore(ctx, planId, opts) {
128
+ const { error } = await ctx.supabase.rpc("plan_review_record", {
129
+ p_plan_id: planId, p_kind: opts.kind, p_verdict: opts.verdict,
130
+ p_bus_msg_display_id: opts.msg, p_loop_no: opts.loop,
131
+ });
132
+ if (error)
133
+ throw new CodebusError(error.message);
134
+ }
135
+ // Round-1 review (CB-MSG-005365) MAJOR finding 5: `plan show` used to run a
136
+ // single unbounded PostgREST select for tickets and events. PostgREST's
137
+ // `api.max_rows` (supabase/config.toml, 1000 by default) silently caps ANY
138
+ // single response at that many rows — a plan with more tickets/events than
139
+ // that would render an INCOMPLETE frontier/history while the command
140
+ // reported success, with no indication anything was missing. Fixed with a
141
+ // paged range loop (stable `order by id`, matching the ordering the view/
142
+ // table already guarantee) that keeps fetching full pages until a
143
+ // short page signals the end, capped at a sane hard maximum so a
144
+ // pathological plan can't loop unboundedly — the cap is reported via an
145
+ // explicit `truncated` flag rather than silently dropping rows.
146
+ const PLAN_SHOW_PAGE_SIZE = 1000; // matches config.toml's api.max_rows
147
+ const PLAN_SHOW_HARD_CAP = 10000; // sane upper bound on one `plan show` call
148
+ async function fetchAllPaged(page, pageSize, hardCap) {
149
+ const rows = [];
150
+ let from = 0;
151
+ for (;;) {
152
+ const { data, error } = await page(from, from + pageSize - 1);
153
+ if (error)
154
+ throw new CodebusError(error.message);
155
+ const batch = data ?? [];
156
+ rows.push(...batch);
157
+ if (batch.length < pageSize)
158
+ return { rows, truncated: false }; // short page = last page
159
+ if (rows.length >= hardCap) {
160
+ // Round-4 review MINOR finding (comment 3810828388): landing on
161
+ // hardCap exactly after a FULL page doesn't by itself prove more rows
162
+ // exist — the total could legitimately equal hardCap with nothing
163
+ // beyond it. Probe a single extra row past the cap to disambiguate
164
+ // rather than assuming worst-case at the boundary; this only costs one
165
+ // extra round-trip, and only when the cap is actually hit.
166
+ const { data: probe, error: probeErr } = await page(rows.length, rows.length);
167
+ if (probeErr)
168
+ throw new CodebusError(probeErr.message);
169
+ return { rows, truncated: (probe ?? []).length > 0 };
170
+ }
171
+ from += pageSize;
172
+ }
173
+ }
174
+ /**
175
+ * Frontier view (§A.2.2): reads `plan_ticket_states`, which carries a
176
+ * `derived_state` column (frontier/fog/dispatched/resolved/cancelled) —
177
+ * nothing here recomputes frontier client-side; the view IS the source.
178
+ * `pageSize`/`hardCap` are exposed only for tests to exercise the paging
179
+ * loop without provisioning thousands of real rows; the CLI itself always
180
+ * uses the real defaults above.
181
+ */
182
+ export async function planShowCore(ctx, planId, opts = {}) {
183
+ const pageSize = opts.pageSize ?? PLAN_SHOW_PAGE_SIZE;
184
+ const hardCap = opts.hardCap ?? PLAN_SHOW_HARD_CAP;
185
+ const { data: plan, error: planErr } = await ctx.supabase.from("plans").select("*").eq("id", planId).single();
186
+ if (planErr || !plan)
187
+ throw new CodebusError(`plan not found (or not visible to you): ${planId}`);
188
+ const ticketsResult = await fetchAllPaged((from, to) => ctx.supabase
189
+ .from("plan_ticket_states")
190
+ .select("id, type, title, status, derived_state, repo_id, assigned_agent, resolution_summary")
191
+ .eq("plan_id", planId).order("id").range(from, to), pageSize, hardCap);
192
+ const eventsResult = await fetchAllPaged((from, to) => ctx.supabase
193
+ .from("plan_events")
194
+ .select("id, event_type, actor_agent_id, summary, created_at")
195
+ .eq("plan_id", planId).order("id").range(from, to), pageSize, hardCap);
196
+ return {
197
+ plan: plan,
198
+ tickets: ticketsResult.rows, ticketsTruncated: ticketsResult.truncated,
199
+ events: eventsResult.rows, eventsTruncated: eventsResult.truncated,
200
+ };
201
+ }
202
+ export async function planRollupCore(ctx, planId) {
203
+ const ws = await workspaceId(ctx);
204
+ const { data, error } = await ctx.supabase.rpc("bus_plan_status", {
205
+ p_workspace_id: ws,
206
+ p_plan_id: planId ?? null,
207
+ });
208
+ if (error)
209
+ throw new CodebusError(error.message);
210
+ return data;
211
+ }
212
+ export async function planDeliveryCore(ctx, opts = {}) {
213
+ const ws = await workspaceId(ctx);
214
+ const { data, error } = await ctx.supabase.rpc("bus_delivery_status", {
215
+ p_workspace_id: ws,
216
+ p_cursor: opts.cursor ?? null,
217
+ p_limit: opts.limit ?? 50,
218
+ });
219
+ if (error)
220
+ throw new CodebusError(error.message);
221
+ return data;
222
+ }
223
+ // Flat summary rows for `plan rollup`'s human (non-JSON) table — the full
224
+ // nested rollup (pr_pipeline, jira_coverage, environments, green2_basis, …)
225
+ // is only sensibly consumed via --json; this mirrors dash_v1's own
226
+ // JSON-only posture while still giving a plain-text glance for interactive
227
+ // use. bus_plan_status items only — see flattenDeliveryItem below for
228
+ // bus_delivery_status, which carries a DIFFERENT shape (no health/
229
+ // ticket_counts/jira_coverage; environments + quality instead).
230
+ // Exported (Sol/CI coverage-gate finding, PR #54): purely so
231
+ // test/unit/plan-flatten.test.ts can call these directly, in-process,
232
+ // with fabricated item shapes that force EVERY internal branch/callback —
233
+ // including the two map() callbacks inside flattenDeliveryItem below — to
234
+ // actually run. Relying only on the integration suite's subprocess CLI
235
+ // calls left those two callbacks permanently uncovered: the only delivery
236
+ // fixture that exercises the human-render path (plan.test.ts) is a bare,
237
+ // freshly-created plan with empty `environments`/`quality` arrays, so
238
+ // `envs.map(...)`/`quality.map(...)` never fired their callbacks — dragging
239
+ // plan.ts's function coverage (and the whole-project aggregate) under the
240
+ // coverage gate's 90% threshold. No behavior change; export-only.
241
+ export function flattenStatusItem(item) {
242
+ const tg = (item.three_greens ?? {});
243
+ const tc = (item.ticket_counts ?? {});
244
+ const jc = item.jira_coverage;
245
+ return {
246
+ id: item.id, title: item.title, status: item.status, health: item.health,
247
+ spec_approved: tg.spec_approved, repo_prs_merged: tg.repo_prs_merged, plan_done: tg.plan_done,
248
+ tickets_total: tc.total, jira_coverage_pct: jc ? jc.coverage_pct : null,
249
+ };
250
+ }
251
+ // Review fix (Sol round-4, MINOR): `plan delivery` used to reuse
252
+ // flattenStatusItem above, which reads bus_plan_status's OWN fields
253
+ // (health, ticket_counts, jira_coverage) — none of which exist on a
254
+ // bus_delivery_status item, so the human table rendered three permanently
255
+ // blank columns while silently dropping the two fields delivery items
256
+ // actually carry (environments, quality). This is delivery's own
257
+ // flattener: shared identity fields plus its actual legs.
258
+ // `environments` is null (leg unavailable, schema-not-landed — see
259
+ // 0069_status_rollups.sql's F1 fix), '[]' (available, genuinely none
260
+ // configured), or a populated array — rendered as a distinct string in
261
+ // each case so "unavailable" is never confused with "none". `quality` is
262
+ // always an array (one entry per repo the plan's tickets touch, graph_status
263
+ // forwarded verbatim) — summarized here as a repo-slug list, full detail
264
+ // only via --json.
265
+ export function flattenDeliveryItem(item) {
266
+ const tg = (item.three_greens ?? {});
267
+ const envs = item.environments;
268
+ const environmentsSummary = envs === null || envs === undefined
269
+ ? "(unavailable)"
270
+ : Array.isArray(envs) && envs.length === 0
271
+ ? "(none)"
272
+ : Array.isArray(envs)
273
+ ? envs.map((e) => e.environment_name).join(",")
274
+ : "(unavailable)";
275
+ const quality = Array.isArray(item.quality) ? item.quality : [];
276
+ return {
277
+ id: item.id, title: item.title, status: item.status,
278
+ repo_prs_merged: tg.repo_prs_merged,
279
+ environments: environmentsSummary,
280
+ quality_repos: quality.map((q) => q.repo_slug).join(",") || "(none)",
281
+ };
282
+ }
283
+ function renderPlanShowHuman(r) {
284
+ const p = r.plan;
285
+ const lines = [];
286
+ lines.push(`plan ${p.id} — ${p.title}`);
287
+ lines.push(` status=${p.status} owner=${p.owner_agent_id} planner=${p.planner_agent_id ?? "(none)"} stale_hours=${p.stale_hours}`);
288
+ lines.push(` destination: ${p.destination}`);
289
+ if (p.spec_ref)
290
+ lines.push(` spec_ref: ${p.spec_ref}`);
291
+ lines.push("");
292
+ lines.push(`tickets (frontier view)${r.ticketsTruncated ? " — TRUNCATED, more rows exist" : ""}:`);
293
+ lines.push(render(r.tickets.map((t) => ({ id: t.id, type: t.type, state: t.derived_state, title: t.title })), { json: false }));
294
+ lines.push("");
295
+ lines.push(`events${r.eventsTruncated ? " — TRUNCATED, more rows exist" : ""}:`);
296
+ lines.push(render(r.events.map((e) => ({ id: e.id, type: e.event_type, actor: e.actor_agent_id, summary: e.summary })), { json: false }));
297
+ return lines.join("\n");
298
+ }
299
+ // ───────────────────────────────────────────────────────────── registration
300
+ export function registerPlan(program, g) {
301
+ const plan = program.command("plan").description("planning layer: plan maps, tickets, frontier (SP-A)");
302
+ g(plan.command("create"))
303
+ .requiredOption("--title <t>")
304
+ .requiredOption("--destination <d>", "what this plan produces")
305
+ .option("--stale-hours <n>", "hours before an in-flight dispatch counts as a morning exception", "8")
306
+ .option("--drill", "mark as a drill plan (excluded from morning unless --include-drills)")
307
+ .option("--spec-ref <ref>", "spec doc ref — required later to leave 'charting' via `plan transition` "
308
+ + "(0049 has no separate RPC to set spec_ref after creation; there is no `to-spec` verb in this lane)")
309
+ .action(async (o) => {
310
+ const ctx = await makeCtx(resolveConfig(o));
311
+ const { id } = await planCreateCore(ctx, {
312
+ title: o.title, destination: o.destination, staleHours: Number(o.staleHours),
313
+ drill: !!o.drill, specRef: o.specRef,
314
+ });
315
+ console.log(render([{ id, title: o.title, status: "charting" }], { json: !!o.json }));
316
+ });
317
+ g(plan.command("assign-planner").argument("<plan>"))
318
+ .requiredOption("--planner <slug>", "must be an agent with function_role=planner")
319
+ .action(async (planId, o) => {
320
+ const ctx = await makeCtx(resolveConfig(o));
321
+ await planAssignPlannerCore(ctx, planId, o.planner);
322
+ console.log(render([{ plan_id: planId, planner: o.planner }], { json: !!o.json }));
323
+ });
324
+ g(plan.command("transition").argument("<plan>"))
325
+ .requiredOption("--from <status>", "expected current status (optimistic concurrency)")
326
+ .requiredOption("--to <status>")
327
+ .option("--reason <text>", "required when --to abandoned")
328
+ .action(async (planId, o) => {
329
+ const ctx = await makeCtx(resolveConfig(o));
330
+ const result = await planTransitionCore(ctx, planId, o.from, o.to, o.reason);
331
+ console.log(render([{ plan_id: planId, status: result.status }], { json: !!o.json }));
332
+ });
333
+ const ticket = plan.command("ticket").description("plan ticket operations (chart/dispatch/resolve/cancel/reopen)");
334
+ g(ticket.command("chart").argument("<plan>"))
335
+ .requiredOption("--type <t>", "research|prototype|grill|task|decision")
336
+ .requiredOption("--title <t>")
337
+ .option("--body <b>")
338
+ .option("--repo <slug>", "workspace repo slug — required later to dispatch a prototype/task ticket")
339
+ .option("--dedupe-key <key>", "idempotent creation key, unique per plan")
340
+ .action(async (planId, o) => {
341
+ const ctx = await makeCtx(resolveConfig(o));
342
+ const { id } = await planTicketChartCore(ctx, planId, {
343
+ type: o.type, title: o.title, body: o.body, repo: o.repo, dedupeKey: o.dedupeKey,
344
+ });
345
+ console.log(render([{ id, plan_id: planId, type: o.type, title: o.title }], { json: !!o.json }));
346
+ });
347
+ g(ticket.command("dispatch").argument("<ticket>"))
348
+ .option("--to <slug>", "explicit recipient (omit for pre-Phase-E plan_repo_charters auto-selection on repo tickets)")
349
+ .action(async (ticketId, o) => {
350
+ const ctx = await makeCtx(resolveConfig(o));
351
+ const { dispatchId } = await planTicketDispatchCore(ctx, ticketId, o.to);
352
+ console.log(render([{ ticket_id: ticketId, dispatch_id: dispatchId }], { json: !!o.json }));
353
+ });
354
+ g(ticket.command("resolve").argument("<ticket>"))
355
+ .requiredOption("--result <r>", "resolved|rejected")
356
+ .requiredOption("--summary <s>")
357
+ .option("--ref <refs>", "comma-separated evidence refs (msg:.../issue:.../pr:.../dec:.../event:...)")
358
+ .option("--dispatch <id>", "the ticket's CURRENT active dispatch id (required if dispatched, unless --owner-override)")
359
+ .option("--owner-override", "owner appeal path — owner-only, may omit --dispatch but never supply a wrong one")
360
+ .action(async (ticketId, o) => {
361
+ const ctx = await makeCtx(resolveConfig(o));
362
+ const refs = o.ref ? String(o.ref).split(",").map((s) => s.trim()).filter(Boolean) : [];
363
+ await planTicketResolveCore(ctx, ticketId, {
364
+ result: o.result, summary: o.summary, refs,
365
+ dispatchId: o.dispatch !== undefined ? Number(o.dispatch) : undefined,
366
+ ownerOverride: !!o.ownerOverride,
367
+ });
368
+ console.log(render([{ ticket_id: ticketId, result: o.result }], { json: !!o.json }));
369
+ });
370
+ g(ticket.command("cancel").argument("<ticket>"))
371
+ .requiredOption("--cascade <c>", "unblock|cancel — no default, an explicit choice is required (§A.2.2)")
372
+ .action(async (ticketId, o) => {
373
+ const ctx = await makeCtx(resolveConfig(o));
374
+ await planTicketCancelCore(ctx, ticketId, o.cascade);
375
+ console.log(render([{ ticket_id: ticketId, status: "cancelled", cascade: o.cascade }], { json: !!o.json }));
376
+ });
377
+ g(ticket.command("reopen").argument("<ticket>"))
378
+ .action(async (ticketId, o) => {
379
+ const ctx = await makeCtx(resolveConfig(o));
380
+ await planTicketReopenCore(ctx, ticketId);
381
+ console.log(render([{ ticket_id: ticketId, status: "open" }], { json: !!o.json }));
382
+ });
383
+ const edge = plan.command("edge").description("blocker edges between tickets in the same plan");
384
+ g(edge.command("add").argument("<ticket>"))
385
+ .requiredOption("--blocked-by <ticket>", "the blocking ticket — <ticket> stays fog until this resolves")
386
+ .action(async (ticketId, o) => {
387
+ const ctx = await makeCtx(resolveConfig(o));
388
+ await planEdgeAddCore(ctx, ticketId, o.blockedBy);
389
+ console.log(render([{ ticket_id: ticketId, blocked_by: o.blockedBy }], { json: !!o.json }));
390
+ });
391
+ g(edge.command("remove").argument("<ticket>"))
392
+ .requiredOption("--blocked-by <ticket>")
393
+ .action(async (ticketId, o) => {
394
+ const ctx = await makeCtx(resolveConfig(o));
395
+ await planEdgeRemoveCore(ctx, ticketId, o.blockedBy);
396
+ console.log(render([{ ticket_id: ticketId, unblocked_from: o.blockedBy }], { json: !!o.json }));
397
+ });
398
+ g(plan.command("note").argument("<plan>"))
399
+ .requiredOption("--summary <s>")
400
+ .option("--ticket <id>", "attach the note to a ticket in this plan")
401
+ .option("--ref <ref>", "a single evidence ref (msg:/issue:/pr:/dec:/event:)")
402
+ .action(async (planId, o) => {
403
+ const ctx = await makeCtx(resolveConfig(o));
404
+ await planNoteCore(ctx, planId, o.summary, o.ticket, o.ref);
405
+ console.log(render([{ plan_id: planId, note: o.summary }], { json: !!o.json }));
406
+ });
407
+ const review = plan.command("review").description("plan review records (green-1/green-3, §A.2.13)");
408
+ g(review.command("record").argument("<plan>"))
409
+ .requiredOption("--kind <k>", "plan_review|verification")
410
+ .requiredOption("--verdict <v>", "approve|revise")
411
+ .requiredOption("--msg <displayId>", "CB-MSG-… the review verdict was posted in — reviewer_agent_id is derived server-side from its sender")
412
+ .requiredOption("--loop <n>", "review loop number")
413
+ .action(async (planId, o) => {
414
+ const ctx = await makeCtx(resolveConfig(o));
415
+ await planReviewRecordCore(ctx, planId, { kind: o.kind, verdict: o.verdict, msg: o.msg, loop: Number(o.loop) });
416
+ console.log(render([{ plan_id: planId, kind: o.kind, verdict: o.verdict, loop: Number(o.loop) }], { json: !!o.json }));
417
+ });
418
+ async function showPlan(planId, o) {
419
+ const ctx = await makeCtx(resolveConfig(o));
420
+ const result = await planShowCore(ctx, planId);
421
+ if (o.json) {
422
+ console.log(JSON.stringify(result, null, 2));
423
+ return;
424
+ }
425
+ console.log(renderPlanShowHuman(result));
426
+ }
427
+ g(plan.command("show").argument("<plan>")).action(showPlan);
428
+ // Compatibility restored (Sol round-1, F3/MAJOR + coordinator ruling):
429
+ // `plan status <plan>` is EXACTLY the pre-0069 alias again — same
430
+ // required argument, same handler (`showPlan`, the frontier view via
431
+ // planShowCore) — no output-shape change for any existing caller. The
432
+ // new bus_plan_status rollup lives at `plan rollup` instead (below), a
433
+ // brand new verb with no compatibility surface to protect.
434
+ g(plan.command("status").argument("<plan>")).action(showPlan); // alias — same frontier view
435
+ g(plan.command("rollup").argument("[plan]"))
436
+ .action(async (planId, o) => {
437
+ const ctx = await makeCtx(resolveConfig(o));
438
+ const result = await planRollupCore(ctx, planId);
439
+ if (o.json) {
440
+ console.log(JSON.stringify(result, null, 2));
441
+ return;
442
+ }
443
+ console.log(render(result.items.map(flattenStatusItem), { json: false }));
444
+ if (result.degraded.length > 0)
445
+ console.log(`\ndegraded: ${result.degraded.join(", ")}`);
446
+ });
447
+ g(plan.command("delivery"))
448
+ .option("--cursor <c>", "pagination cursor from a previous call's next_cursor")
449
+ .option("--limit <n>", "page size (default 50, hard-capped at 100)")
450
+ .action(async (o) => {
451
+ const ctx = await makeCtx(resolveConfig(o));
452
+ const result = await planDeliveryCore(ctx, { cursor: o.cursor, limit: o.limit ? Number(o.limit) : undefined });
453
+ if (o.json) {
454
+ console.log(JSON.stringify(result, null, 2));
455
+ return;
456
+ }
457
+ console.log(render(result.items.map(flattenDeliveryItem), { json: false }));
458
+ if (result.next_cursor)
459
+ console.log(`\nnext_cursor: ${result.next_cursor}`);
460
+ if (result.degraded.length > 0)
461
+ console.log(`\ndegraded: ${result.degraded.join(", ")}`);
462
+ });
463
+ return plan;
464
+ }
465
+ //# sourceMappingURL=plan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan.js","sourceRoot":"","sources":["../../src/commands/plan.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,88 @@
1
+ import { resolveConfig } from "../config.js";
2
+ import { makeCtx, workspaceId, repoId } from "../client.js";
3
+ import { render } from "../output.js";
4
+ import { CodebusError } from "../errors.js";
5
+ async function resolvePrId(ctx, ws, idOrDisplay) {
6
+ if (/^CB-PR-/i.test(idOrDisplay)) {
7
+ // display ids are only unique per workspace — always scope the lookup
8
+ const { data, error } = await ctx.supabase.from("pull_requests").select("id")
9
+ .eq("workspace_id", ws).eq("display_id", idOrDisplay.toUpperCase()).single();
10
+ if (error || !data)
11
+ throw new CodebusError(`PR not found: ${idOrDisplay}`);
12
+ return data.id;
13
+ }
14
+ return idOrDisplay;
15
+ }
16
+ async function createPr(o) {
17
+ const ctx = await makeCtx(resolveConfig(o));
18
+ const ws = await workspaceId(ctx);
19
+ const rid = await repoId(ctx, ws, o.repo);
20
+ if (!rid)
21
+ throw new CodebusError(`unknown repo: ${o.repo}`);
22
+ let taskId = null;
23
+ if (o.task) {
24
+ const { data } = await ctx.supabase.from("tasks").select("id")
25
+ .eq("workspace_id", ws).eq("display_id", o.task.toUpperCase()).single();
26
+ if (!data)
27
+ throw new CodebusError(`task not found: ${o.task}`);
28
+ taskId = data.id;
29
+ }
30
+ const { data, error } = await ctx.supabase.from("pull_requests")
31
+ .insert({
32
+ workspace_id: ws, repo_id: rid, task_id: taskId,
33
+ branch: o.branch ?? null, url: o.prUrl ?? null,
34
+ number: o.number ? parseInt(o.number, 10) : null,
35
+ ...(o.status ? { status: o.status } : {}),
36
+ }).select().single();
37
+ if (error)
38
+ throw new CodebusError(error.message);
39
+ console.log(render([{ display_id: data.display_id, status: data.status, repo: o.repo, branch: data.branch }], { json: !!o.json }));
40
+ }
41
+ async function listPrs(o) {
42
+ const ctx = await makeCtx(resolveConfig(o));
43
+ const ws = await workspaceId(ctx);
44
+ let q = ctx.supabase.from("pull_requests")
45
+ .select("display_id, status, branch, url, number, repos:repo_id(slug), tasks:task_id(display_id)")
46
+ .eq("workspace_id", ws).order("created_at", { ascending: false });
47
+ if (o.status)
48
+ q = q.eq("status", o.status);
49
+ if (o.repo) {
50
+ const rid = await repoId(ctx, ws, o.repo);
51
+ q = q.eq("repo_id", rid);
52
+ }
53
+ const { data, error } = await q;
54
+ if (error)
55
+ throw new CodebusError(error.message);
56
+ const rows = (data ?? []).map((r) => ({
57
+ id: r.display_id, status: r.status, repo: r.repos?.slug,
58
+ branch: r.branch, task: r.tasks?.display_id, url: r.url,
59
+ }));
60
+ console.log(render(rows, { json: !!o.json }));
61
+ }
62
+ async function updatePr(idOrDisplay, o) {
63
+ const ctx = await makeCtx(resolveConfig(o));
64
+ const ws = await workspaceId(ctx);
65
+ const id = await resolvePrId(ctx, ws, idOrDisplay);
66
+ const patch = { updated_at: new Date().toISOString() };
67
+ if (o.status)
68
+ patch.status = o.status;
69
+ if (o.prUrl)
70
+ patch.url = o.prUrl;
71
+ if (o.branch)
72
+ patch.branch = o.branch;
73
+ const { data, error } = await ctx.supabase.from("pull_requests").update(patch).eq("id", id).select().single();
74
+ if (error)
75
+ throw new CodebusError(error.message);
76
+ console.log(render([{ display_id: data.display_id, status: data.status, url: data.url }], { json: !!o.json }));
77
+ }
78
+ export function registerPr(program, g) {
79
+ const pr = program.command("pr").description("pull requests (CB-PR)");
80
+ g(pr.command("create")).requiredOption("--repo <slug>")
81
+ .option("--task <CB-TASK-id>").option("--branch <name>").option("--pr-url <url>", "external PR/MR URL")
82
+ .option("--number <n>").option("--status <s>", "draft|open|review_requested|approved|merged|closed")
83
+ .action(createPr);
84
+ g(pr.command("list")).option("--repo <slug>").option("--status <s>").action(listPrs);
85
+ g(pr.command("update").argument("<id>", "CB-PR-… or uuid"))
86
+ .option("--status <s>").option("--pr-url <url>", "external PR/MR URL").option("--branch <name>").action(updatePr);
87
+ }
88
+ //# sourceMappingURL=pr.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pr.js","sourceRoot":"","sources":["../../src/commands/pr.ts"],"names":[],"mappings":"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"}