@crewbie/cli 0.1.0-alpha.49

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 (165) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +253 -0
  3. package/dist/cli.d.ts +2 -0
  4. package/dist/cli.js +506 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/config.d.ts +84 -0
  7. package/dist/config.js +178 -0
  8. package/dist/config.js.map +1 -0
  9. package/dist/core.d.ts +31 -0
  10. package/dist/core.js +186 -0
  11. package/dist/core.js.map +1 -0
  12. package/dist/execution/attribution.d.ts +10 -0
  13. package/dist/execution/attribution.js +102 -0
  14. package/dist/execution/attribution.js.map +1 -0
  15. package/dist/execution/cancel.d.ts +3 -0
  16. package/dist/execution/cancel.js +59 -0
  17. package/dist/execution/cancel.js.map +1 -0
  18. package/dist/execution/capabilities.d.ts +22 -0
  19. package/dist/execution/capabilities.js +101 -0
  20. package/dist/execution/capabilities.js.map +1 -0
  21. package/dist/execution/controls.d.ts +51 -0
  22. package/dist/execution/controls.js +257 -0
  23. package/dist/execution/controls.js.map +1 -0
  24. package/dist/execution/dispatch.d.ts +69 -0
  25. package/dist/execution/dispatch.js +831 -0
  26. package/dist/execution/dispatch.js.map +1 -0
  27. package/dist/execution/fix.d.ts +3 -0
  28. package/dist/execution/fix.js +267 -0
  29. package/dist/execution/fix.js.map +1 -0
  30. package/dist/execution/github.d.ts +15 -0
  31. package/dist/execution/github.js +43 -0
  32. package/dist/execution/github.js.map +1 -0
  33. package/dist/execution/merge.d.ts +15 -0
  34. package/dist/execution/merge.js +133 -0
  35. package/dist/execution/merge.js.map +1 -0
  36. package/dist/execution/planning-approval.d.ts +33 -0
  37. package/dist/execution/planning-approval.js +227 -0
  38. package/dist/execution/planning-approval.js.map +1 -0
  39. package/dist/execution/pr-review.d.ts +86 -0
  40. package/dist/execution/pr-review.js +339 -0
  41. package/dist/execution/pr-review.js.map +1 -0
  42. package/dist/execution/review-loop.d.ts +63 -0
  43. package/dist/execution/review-loop.js +463 -0
  44. package/dist/execution/review-loop.js.map +1 -0
  45. package/dist/execution/test-feature.d.ts +29 -0
  46. package/dist/execution/test-feature.js +240 -0
  47. package/dist/execution/test-feature.js.map +1 -0
  48. package/dist/execution/watch.d.ts +12 -0
  49. package/dist/execution/watch.js +34 -0
  50. package/dist/execution/watch.js.map +1 -0
  51. package/dist/memory/context.d.ts +14 -0
  52. package/dist/memory/context.js +82 -0
  53. package/dist/memory/context.js.map +1 -0
  54. package/dist/memory/improvement.d.ts +25 -0
  55. package/dist/memory/improvement.js +168 -0
  56. package/dist/memory/improvement.js.map +1 -0
  57. package/dist/memory/launch.d.ts +9 -0
  58. package/dist/memory/launch.js +65 -0
  59. package/dist/memory/launch.js.map +1 -0
  60. package/dist/memory/runner.d.ts +4 -0
  61. package/dist/memory/runner.js +74 -0
  62. package/dist/memory/runner.js.map +1 -0
  63. package/dist/memory/state.d.ts +10 -0
  64. package/dist/memory/state.js +42 -0
  65. package/dist/memory/state.js.map +1 -0
  66. package/dist/presentation.d.ts +19 -0
  67. package/dist/presentation.js +128 -0
  68. package/dist/presentation.js.map +1 -0
  69. package/dist/reporting/dashboard.d.ts +2 -0
  70. package/dist/reporting/dashboard.js +106 -0
  71. package/dist/reporting/dashboard.js.map +1 -0
  72. package/dist/reporting/pr-usage.d.ts +24 -0
  73. package/dist/reporting/pr-usage.js +179 -0
  74. package/dist/reporting/pr-usage.js.map +1 -0
  75. package/dist/reporting/records.d.ts +28 -0
  76. package/dist/reporting/records.js +152 -0
  77. package/dist/reporting/records.js.map +1 -0
  78. package/dist/setup/agents.d.ts +8 -0
  79. package/dist/setup/agents.js +83 -0
  80. package/dist/setup/agents.js.map +1 -0
  81. package/dist/setup/assessment.d.ts +31 -0
  82. package/dist/setup/assessment.js +75 -0
  83. package/dist/setup/assessment.js.map +1 -0
  84. package/dist/setup/auto-loaded.d.ts +17 -0
  85. package/dist/setup/auto-loaded.js +49 -0
  86. package/dist/setup/auto-loaded.js.map +1 -0
  87. package/dist/setup/copilot-version.d.ts +7 -0
  88. package/dist/setup/copilot-version.js +39 -0
  89. package/dist/setup/copilot-version.js.map +1 -0
  90. package/dist/setup/copilot.d.ts +22 -0
  91. package/dist/setup/copilot.js +164 -0
  92. package/dist/setup/copilot.js.map +1 -0
  93. package/dist/setup/init.d.ts +41 -0
  94. package/dist/setup/init.js +315 -0
  95. package/dist/setup/init.js.map +1 -0
  96. package/dist/setup/install.d.ts +12 -0
  97. package/dist/setup/install.js +211 -0
  98. package/dist/setup/install.js.map +1 -0
  99. package/dist/setup/instruction-quality.d.ts +25 -0
  100. package/dist/setup/instruction-quality.js +258 -0
  101. package/dist/setup/instruction-quality.js.map +1 -0
  102. package/dist/setup/inventory.d.ts +26 -0
  103. package/dist/setup/inventory.js +78 -0
  104. package/dist/setup/inventory.js.map +1 -0
  105. package/dist/setup/onboarding.d.ts +40 -0
  106. package/dist/setup/onboarding.js +472 -0
  107. package/dist/setup/onboarding.js.map +1 -0
  108. package/dist/setup/package.d.ts +2 -0
  109. package/dist/setup/package.js +8 -0
  110. package/dist/setup/package.js.map +1 -0
  111. package/dist/setup/planning-workflow.d.ts +3 -0
  112. package/dist/setup/planning-workflow.js +250 -0
  113. package/dist/setup/planning-workflow.js.map +1 -0
  114. package/dist/setup/repository-map.d.ts +34 -0
  115. package/dist/setup/repository-map.js +89 -0
  116. package/dist/setup/repository-map.js.map +1 -0
  117. package/dist/setup/review.d.ts +8 -0
  118. package/dist/setup/review.js +137 -0
  119. package/dist/setup/review.js.map +1 -0
  120. package/dist/setup/team.d.ts +18 -0
  121. package/dist/setup/team.js +172 -0
  122. package/dist/setup/team.js.map +1 -0
  123. package/dist/setup/templates.d.ts +11 -0
  124. package/dist/setup/templates.js +494 -0
  125. package/dist/setup/templates.js.map +1 -0
  126. package/dist/setup/terminal.d.ts +12 -0
  127. package/dist/setup/terminal.js +11 -0
  128. package/dist/setup/terminal.js.map +1 -0
  129. package/dist/setup/update.d.ts +6 -0
  130. package/dist/setup/update.js +71 -0
  131. package/dist/setup/update.js.map +1 -0
  132. package/dist/specification/batch.d.ts +50 -0
  133. package/dist/specification/batch.js +127 -0
  134. package/dist/specification/batch.js.map +1 -0
  135. package/dist/specification/plan-checks.d.ts +6 -0
  136. package/dist/specification/plan-checks.js +73 -0
  137. package/dist/specification/plan-checks.js.map +1 -0
  138. package/dist/specification/planning.d.ts +26 -0
  139. package/dist/specification/planning.js +507 -0
  140. package/dist/specification/planning.js.map +1 -0
  141. package/dist/specification/prose.d.ts +1 -0
  142. package/dist/specification/prose.js +15 -0
  143. package/dist/specification/prose.js.map +1 -0
  144. package/dist/tracking/ado.d.ts +19 -0
  145. package/dist/tracking/ado.js +128 -0
  146. package/dist/tracking/ado.js.map +1 -0
  147. package/dist/tracking/github.d.ts +8 -0
  148. package/dist/tracking/github.js +112 -0
  149. package/dist/tracking/github.js.map +1 -0
  150. package/dist/tracking/issues.d.ts +28 -0
  151. package/dist/tracking/issues.js +180 -0
  152. package/dist/tracking/issues.js.map +1 -0
  153. package/dist/tracking/native.d.ts +5 -0
  154. package/dist/tracking/native.js +30 -0
  155. package/dist/tracking/native.js.map +1 -0
  156. package/dist/tracking/refs.d.ts +14 -0
  157. package/dist/tracking/refs.js +56 -0
  158. package/dist/tracking/refs.js.map +1 -0
  159. package/dist/tracking/sources.d.ts +5 -0
  160. package/dist/tracking/sources.js +29 -0
  161. package/dist/tracking/sources.js.map +1 -0
  162. package/docs/operations.md +1114 -0
  163. package/examples/batch.json +27 -0
  164. package/examples/runs.json +22 -0
  165. package/package.json +50 -0
package/dist/cli.js ADDED
@@ -0,0 +1,506 @@
1
+ #!/usr/bin/env node
2
+ import { execFileSync } from "node:child_process";
3
+ import { appendFile } from "node:fs/promises";
4
+ import { resolve } from "node:path";
5
+ import { parseArgs } from "node:util";
6
+ import { hash, integer, json, optionalText, readJson, record, safePath, string, writeAtomic } from "./core.js";
7
+ import { limitsFor, loadConfig } from "./config.js";
8
+ import { probeCapabilities, renderReport } from "./execution/capabilities.js";
9
+ import { githubReader } from "./execution/github.js";
10
+ import { dispatch, eligible, inspectWork, preflight, renderDispatchResult } from "./execution/dispatch.js";
11
+ import { CHECK_READER } from "./execution/merge.js";
12
+ import { baselineLaunches, setLaunchPause } from "./execution/controls.js";
13
+ import { cancelRun } from "./execution/cancel.js";
14
+ import { watchBatch } from "./execution/watch.js";
15
+ import { parseReviewPlan, reconcileReview, watchReviews } from "./execution/review-loop.js";
16
+ import { initCommand } from "./setup/init.js";
17
+ import { terminalPrompts } from "./setup/terminal.js";
18
+ import { latestCopilotVersion } from "./setup/copilot-version.js";
19
+ import { updateRepository } from "./setup/update.js";
20
+ import { approvedBatch, parseBatch, requireApproval } from "./specification/batch.js";
21
+ import { preparePlanning, publishPlanning, requestPlanningRevision } from "./specification/planning.js";
22
+ import { prepareReview, publishReview } from "./execution/pr-review.js";
23
+ import { handleFeatureFixComment } from "./execution/fix.js";
24
+ import { releaseMergedPlan } from "./execution/planning-approval.js";
25
+ import { checkPrDescription } from "./specification/prose.js";
26
+ import { api, requireWriter } from "./tracking/github.js";
27
+ import { publish, publishDescription, reapproveIssues } from "./tracking/issues.js";
28
+ import { adoApi, createWorkItem, importWorkItem, linkAdo, syncAdo, writeBack } from "./tracking/ado.js";
29
+ import { verifySources } from "./tracking/sources.js";
30
+ import { memoryContext } from "./memory/context.js";
31
+ import { applyMaintenance, prepareMaintenance } from "./memory/runner.js";
32
+ import { dashboard } from "./reporting/dashboard.js";
33
+ import { collectRecords, parseRecords } from "./reporting/records.js";
34
+ import { collectPrUsage, renderPrUsage } from "./reporting/pr-usage.js";
35
+ import { createOutput } from "./presentation.js";
36
+ import { checkoutTestFeature, discoverTestFeatures, renderTestFeatureList, runStartCommand, saveLocalStart, selectionOrThrow, suggestedStartCommand } from "./execution/test-feature.js";
37
+ const HELP = `Crewbie: a project-specific AI implementation crew.
38
+
39
+ USAGE
40
+ crewbie <command> [options]
41
+
42
+ SETUP AND GUIDANCE
43
+ init [--model MODEL] [--out setup.json] LLM assessment, tailored team and approval
44
+ --model-policy cost-aware|fixed New specialists: reviewed catalog choices (default cost-aware)
45
+ --specialist-model MODEL Explicit new-specialist model override
46
+ --model-profile economy|balanced|quality Capability-aware selection (default balanced)
47
+ --description "project intent" Greenfield context; asks again when unclear
48
+ --repo owner/name Setup repository for labels and workflows
49
+ init --assessment-only [--out setup.json] Offline inventory; no LLM
50
+ init --update --out team.json Reassess an installed crew without resetting policy
51
+ init --proposal setup.json --apply --guidance apply|skip
52
+ Install reviewed team and GitHub labels
53
+ --skip-labels Explicit offline setup; no GitHub writes
54
+ --copilot-version X.Y.Z Set CREWBIE_COPILOT_VERSION for hosted planning if unset
55
+ init --proposal setup.json --update Preview safe managed-file upgrades
56
+ --json Machine-readable installation preview
57
+ update [--apply] [--offline] [--json] Update repository integration without AI reassessment
58
+
59
+ PLANNING AND EXECUTION
60
+ revise-plan --pr N --feedback-file feedback.txt [--apply]
61
+ Preview/request one same-PR planning revision
62
+ preflight [--batch-id ID] [--json] Preview approvals, specialist/model and remaining launch limits
63
+ pause | resume [--apply] Control future implementation/review launches, not running sessions
64
+ cancel --issue N --run-id ID [--apply] Preview/cancel an attributable cloud-agent Actions run
65
+ reapprove --issue N[,N...] [--apply] Move open tasks to their owner's configured model and re-approve
66
+ budget --issue N --historical-attempts N [--apply] Adopt reviewed pre-upgrade launch counts; never reset them
67
+ test [feature] [--list] [--no-start] Check out a Crewbie feature branch and start the app
68
+ approve --batch batch.json --yes [--execute] Approve exact local scope
69
+ publish --batch batch.json [--apply] [--ado-create] [--dispatch-local] [--watch]
70
+ --watch [--timeout-seconds 3600] [--poll-seconds 30] Reconcile until handoff
71
+ publish --pr 123 --proposal handoff.json [--apply] Preview/finalize PR metadata
72
+ publish --review-loop review.json [--apply] [--watch] Review, correct and re-review
73
+
74
+ STATUS AND REPORTS
75
+ doctor --repo owner/name [--agent stem] [--model id] [--json]
76
+ status --batch batch.json Validate a task/dependency graph
77
+ status --source requirements.md Import text with a content revision
78
+ status --issue 123 | --ado-id 456 Import a remote work item
79
+ status --pr 123 [--json] Read observed token usage and coverage
80
+ status --memory developer [--topic cold/name.md]
81
+ status Reconcile remote work read-only
82
+ dashboard --records runs.json --out report.html
83
+ dashboard --collect --out report.html
84
+
85
+ OUTPUT AND AUTHENTICATION
86
+ Terminal output uses grouped sections and responsive tables.
87
+ --json preserves machine-readable data on supported commands.
88
+ Redirected output stays plain; NO_COLOR disables terminal colours.
89
+ Use --path to select a local repository (default: current directory).
90
+ Paths supplied for input/output files are relative to that repository.
91
+ Remote commands use GH_TOKEN/GITHUB_TOKEN or authenticated GitHub CLI.
92
+ ADO uses CREWBIE_ADO_TOKEN. Never put tokens in command arguments.
93
+ Exit codes: 0 success; 1 error; 2 blocked capability. Unknown is not verified.
94
+ `;
95
+ function token() {
96
+ const configured = process.env.GH_TOKEN || process.env.GITHUB_TOKEN;
97
+ if (configured)
98
+ return configured;
99
+ try {
100
+ const value = execFileSync("gh", ["auth", "token", "--hostname", "github.com"], {
101
+ encoding: "utf8", stdio: ["ignore", "pipe", "pipe"], timeout: 10_000, windowsHide: true,
102
+ }).trim();
103
+ if (!value)
104
+ throw new Error("Empty credential.");
105
+ return value;
106
+ }
107
+ catch {
108
+ throw new Error("Set GH_TOKEN or authenticate GitHub CLI with gh auth login. Never put a token in a command argument.");
109
+ }
110
+ }
111
+ async function main() {
112
+ const { values, positionals } = parseArgs({
113
+ allowPositionals: true, strict: true,
114
+ options: {
115
+ help: { type: "boolean", short: "h" }, path: { type: "string" }, repo: { type: "string" },
116
+ agent: { type: "string" }, model: { type: "string" }, json: { type: "boolean" },
117
+ "model-policy": { type: "string" }, "specialist-model": { type: "string" }, offline: { type: "boolean" },
118
+ "model-profile": { type: "string" }, "batch-id": { type: "string" }, "run-id": { type: "string" },
119
+ "historical-attempts": { type: "string" },
120
+ out: { type: "string" }, proposal: { type: "string" }, apply: { type: "boolean" },
121
+ update: { type: "boolean" }, batch: { type: "string" }, yes: { type: "boolean" },
122
+ description: { type: "string" },
123
+ guidance: { type: "string" }, "assessment-only": { type: "boolean" }, "skip-labels": { type: "boolean" },
124
+ "copilot-version": { type: "string" },
125
+ start: { type: "string" },
126
+ execute: { type: "boolean" }, source: { type: "string" }, issue: { type: "string" },
127
+ "ado-id": { type: "string" }, "ado-create": { type: "boolean" },
128
+ "dispatch-local": { type: "boolean" },
129
+ watch: { type: "boolean" }, "timeout-seconds": { type: "string" }, "poll-seconds": { type: "string" },
130
+ memory: { type: "string" }, topic: { type: "string", multiple: true },
131
+ records: { type: "string" }, collect: { type: "boolean" }, prepare: { type: "boolean" },
132
+ "pages-mode": { type: "string" },
133
+ pr: { type: "string" },
134
+ "feedback-file": { type: "string" },
135
+ "review-loop": { type: "string" },
136
+ list: { type: "boolean" }, "no-start": { type: "boolean" },
137
+ },
138
+ });
139
+ const output = createOutput({ machine: values.json === true || positionals[0]?.startsWith("internal-") === true });
140
+ if (values.help || positionals.length === 0) {
141
+ output.text(HELP);
142
+ return;
143
+ }
144
+ if (positionals.length !== 1 && !(positionals[0] === "test" && positionals.length === 2))
145
+ throw new Error("Choose exactly one command.");
146
+ const command = positionals[0];
147
+ if (command !== "init")
148
+ output.heading(command);
149
+ if (values["review-loop"] && (command !== "publish" || values.batch || values.pr || values["dispatch-local"]))
150
+ throw new Error("--review-loop requires publish and cannot be combined with batch/PR publication.");
151
+ if (values.watch && (command !== "publish" || (!values["review-loop"] && (!values.batch || !values["dispatch-local"]))))
152
+ throw new Error("--watch requires publish --batch and --dispatch-local, or publish --review-loop.");
153
+ if (!values.watch && (values["timeout-seconds"] !== undefined || values["poll-seconds"] !== undefined))
154
+ throw new Error("Watch timing options require --watch.");
155
+ const timeoutMs = integer(Number(values["timeout-seconds"] ?? 3600), "timeout seconds", 1, 86400) * 1000;
156
+ const pollMs = integer(Number(values["poll-seconds"] ?? 30), "poll seconds", 1, 300) * 1000;
157
+ if (command === "publish" && values.pr !== undefined && values.batch)
158
+ throw new Error("Choose either batch publication or PR finalization, not both.");
159
+ const root = resolve(values.path ?? ".");
160
+ if (command === "init") {
161
+ await initCommand(root, values, { client: () => api(token()), report: output.text, latestCopilotVersion });
162
+ return;
163
+ }
164
+ if (command === "update") {
165
+ output.text(await updateRepository(root, values, values.offline ? undefined : api(token())));
166
+ return;
167
+ }
168
+ if (command === "doctor") {
169
+ if (!values.repo)
170
+ throw new Error("doctor requires --repo owner/repository.");
171
+ const report = await probeCapabilities(githubReader(token()), {
172
+ repository: values.repo, ...(values.agent === undefined ? {} : { agent: values.agent }),
173
+ ...(values.model === undefined ? {} : { model: values.model }),
174
+ });
175
+ output.data(report, renderReport(report));
176
+ if (report.findings.some((finding) => finding.status === "blocked"))
177
+ process.exitCode = 2;
178
+ return;
179
+ }
180
+ if (command === "status" && values.source) {
181
+ if (!/\.(md|txt)$/i.test(values.source))
182
+ throw new Error("Source files must be Markdown or plain text. Convert Word/PDF outside Crewbie.");
183
+ const path = await safePath(root, values.source);
184
+ const content = await optionalText(path);
185
+ if (content === null)
186
+ throw new Error("Source file does not exist.");
187
+ if (content.length > 1_000_000 || content.includes("\0"))
188
+ throw new Error("Source is too large or not plain text. Split or convert it first.");
189
+ output.data({ uri: values.source, revision: hash(content), text: content });
190
+ return;
191
+ }
192
+ if (command === "dashboard" && values.records) {
193
+ const records = parseRecords(await readJson(await safePath(root, values.records)));
194
+ if (!values.out)
195
+ throw new Error("Choose a report path with --out.");
196
+ await writeAtomic(root, values.out, dashboard(records));
197
+ output.text(`Report written to ${values.out}. Unavailable measurements remain unknown.`);
198
+ return;
199
+ }
200
+ const config = await loadConfig(root);
201
+ if (command === "test") {
202
+ if (!config.repository)
203
+ throw new Error("Configure repository before testing a feature.");
204
+ const client = api(token());
205
+ const features = await discoverTestFeatures(client, config);
206
+ const query = positionals[1];
207
+ if (values.list || !query) {
208
+ output.data(features, renderTestFeatureList(features));
209
+ return;
210
+ }
211
+ const feature = selectionOrThrow(features, query);
212
+ if (values.json) {
213
+ output.data(feature);
214
+ return;
215
+ }
216
+ const { previous } = await checkoutTestFeature(root, feature);
217
+ output.text([
218
+ `Checked out ${feature.branch}: ${feature.title}`,
219
+ ...(feature.pullRequest ? [`Feature PR: ${feature.pullRequest.url}`] : []),
220
+ `Run \`git switch ${previous}\` to go back.`,
221
+ ].join("\n"));
222
+ if (values["no-start"])
223
+ return;
224
+ let start = config.local?.start ?? "";
225
+ if (!start && process.stdin.isTTY && process.stdout.isTTY) {
226
+ const suggestion = await suggestedStartCommand(root);
227
+ const prompt = suggestion
228
+ ? `Command to start the app locally when testing a feature? Press Enter for ${suggestion}. Leave empty to skip.`
229
+ : "Command to start the app locally when testing a feature? Leave empty to skip.";
230
+ start = (await terminalPrompts().ask(prompt)).trim() || suggestion || "";
231
+ if (start && await terminalPrompts().confirm("Save this start command to .crewbie/config.json?", true))
232
+ await saveLocalStart(root, config, start);
233
+ }
234
+ if (!start) {
235
+ output.text("No local.start command is configured. Set local.start in .crewbie/config.json to start the app automatically after checkout.");
236
+ return;
237
+ }
238
+ output.text(`Starting: ${start}`);
239
+ process.exitCode = await runStartCommand(root, start);
240
+ return;
241
+ }
242
+ if (command === "budget") {
243
+ if (!values.issue || !values["historical-attempts"])
244
+ throw new Error("Use budget --issue N --historical-attempts N; review historical attempts before --apply.");
245
+ output.text(await baselineLaunches(api(token()), config, integer(Number(values.issue), "issue"), integer(Number(values["historical-attempts"]), "historical attempts"), values.apply === true));
246
+ return;
247
+ }
248
+ if (command === "pause" || command === "resume") {
249
+ output.text(await setLaunchPause(api(token()), config, command === "pause", values.apply === true));
250
+ return;
251
+ }
252
+ if (command === "reapprove") {
253
+ if (!values.issue)
254
+ throw new Error("Use reapprove --issue N[,N...]; preview first, then --apply.");
255
+ const issues = values.issue.split(",").map((value) => integer(Number(value.trim().replace(/^#/, "")), "issue"));
256
+ output.text(await reapproveIssues(api(token()), config, issues, values.apply === true));
257
+ return;
258
+ }
259
+ if (command === "cancel") {
260
+ if (!values.issue || !values["run-id"])
261
+ throw new Error("Use cancel --issue N --run-id ID; preview first, then --apply.");
262
+ output.text(await cancelRun(api(token()), config, integer(Number(values.issue), "issue"), integer(Number(values["run-id"]), "run ID"), values.apply === true));
263
+ return;
264
+ }
265
+ if (command === "preflight") {
266
+ const report = await preflight(api(token()), config, values["batch-id"], undefined, config.ado ? adoApi(config.ado, process.env.CREWBIE_ADO_TOKEN ?? "") : undefined);
267
+ output.data(report, [report.notice, ...report.tasks.map((task) => `#${task.issue} ${task.specialist} / ${task.model}: ${task.ready ? "READY" : "NOT READY"} - ${task.reason}\n Approval: ${task.approved}; launches ${task.allowance.used}/${task.allowance.maxLaunchesPerBatch}; task attempts ${task.allowance.taskUsed}/${task.allowance.maxAttemptsPerTask}`)].join("\n"));
268
+ return;
269
+ }
270
+ if (command === "revise-plan") {
271
+ if (!values.pr || !values["feedback-file"])
272
+ throw new Error("Use revise-plan --pr N --feedback-file feedback.txt; --apply explicitly requests a potentially billable revision.");
273
+ const feedback = await optionalText(await safePath(root, values["feedback-file"]));
274
+ if (feedback === null)
275
+ throw new Error("Feedback file does not exist.");
276
+ output.text(await requestPlanningRevision(api(token()), config, integer(Number(values.pr), "planning PR"), feedback, values.apply === true));
277
+ return;
278
+ }
279
+ if (command === "publish" && values["review-loop"]) {
280
+ const plan = parseReviewPlan(await readJson(await safePath(root, values["review-loop"])));
281
+ output.data({ repository: config.repository, plan, authorization: "Applying authorizes bounded review and same-specialist correction sessions, real GitHub reviews and metadata updates. No merges." });
282
+ if (!values.apply) {
283
+ output.text("Preview only. Review the exact issues, correction paths and round budget before --apply.");
284
+ return;
285
+ }
286
+ const client = api(token());
287
+ const ado = config.ado ? adoApi(config.ado, process.env.CREWBIE_ADO_TOKEN ?? "") : undefined;
288
+ if (values.watch) {
289
+ const outcome = await watchReviews(client, config, plan, { timeoutMs, pollMs, progress: output.text, ...(ado ? { ado } : {}) });
290
+ output.text(`Review loop: ${outcome}. No PRs were merged.`);
291
+ if (outcome !== "clean")
292
+ process.exitCode = 2;
293
+ }
294
+ else
295
+ output.data(await reconcileReview(client, config, plan, ado));
296
+ return;
297
+ }
298
+ if (command === "approve" || (command === "status" && values.batch) || (command === "publish" && values.pr === undefined)) {
299
+ if (!values.batch)
300
+ throw new Error("Choose a batch file with --batch.");
301
+ const batchPath = await safePath(root, values.batch);
302
+ const batch = parseBatch(await readJson(batchPath), config);
303
+ if (command === "approve") {
304
+ if (!values.yes)
305
+ throw new Error("Review the spec, tasks, owner/model and prerequisites, then use --yes to record approval.");
306
+ await writeAtomic(root, values.batch, json(approvedBatch(batch, values.execute === true)));
307
+ output.text(`Approved exact batch ${batch.id}; execution ${values.execute ? "authorized" : "not authorized"}.`);
308
+ }
309
+ else if (command === "status")
310
+ output.data(batch);
311
+ else {
312
+ requireApproval(batch);
313
+ if (values.watch && !batch.approval?.execute)
314
+ throw new Error("Watching requires execution approval.");
315
+ output.data({ batch: batch.id, repository: config.repository, tasks: batch.tasks, createAdoWorkItems: values["ado-create"] === true, executionApproved: batch.approval?.execute, dispatch: values["dispatch-local"] ? "local" : "workflow" });
316
+ if (!values.apply) {
317
+ output.text("Preview only. Add --apply to publish the approved work.");
318
+ return;
319
+ }
320
+ const github = api(token());
321
+ await requireWriter(github, config.repository);
322
+ const ado = config.ado ? adoApi(config.ado, process.env.CREWBIE_ADO_TOKEN ?? "") : undefined;
323
+ await verifySources(batch.sources, github, config, ado);
324
+ const adoMapping = new Map();
325
+ for (const task of batch.tasks)
326
+ if (task.adoWorkItem)
327
+ adoMapping.set(task.id, task.adoWorkItem);
328
+ if (values["ado-create"]) {
329
+ if (!config.ado)
330
+ throw new Error("Configure the ADO organization, project, and work item type first.");
331
+ const client = adoApi(config.ado, process.env.CREWBIE_ADO_TOKEN ?? "");
332
+ for (const task of batch.tasks)
333
+ if (!adoMapping.has(task.id)) {
334
+ const id = await createWorkItem(client, config.ado, batch, task);
335
+ adoMapping.set(task.id, id);
336
+ output.text(`ADO mapping confirmed: ${task.id} -> ${id}.`);
337
+ }
338
+ }
339
+ if (adoMapping.size && !config.ado)
340
+ throw new Error("Tasks reference ADO work items but the repository has no ADO integration policy.");
341
+ const published = await publish(github, config, batch, ado, !values["dispatch-local"]);
342
+ if (config.ado && adoMapping.size) {
343
+ const client = adoApi(config.ado, process.env.CREWBIE_ADO_TOKEN ?? "");
344
+ for (const item of published) {
345
+ const id = adoMapping.get(item.task);
346
+ if (id) {
347
+ await linkAdo(github, config, item.issue, id);
348
+ await writeBack(client, id, [`https://github.com/${config.repository}/issues/${item.issue}`], `Crewbie execution issue created for ${item.task}.`);
349
+ }
350
+ }
351
+ }
352
+ output.data(published);
353
+ if (values["dispatch-local"] && batch.approval?.execute) {
354
+ const reconcile = async () => {
355
+ const work = await dispatch(github, config, ado, { batch, issueNumbers: published.map((item) => item.issue) });
356
+ if (ado)
357
+ await syncAdo(github, ado, config, work);
358
+ return work;
359
+ };
360
+ if (values.watch) {
361
+ const result = await watchBatch(batch, reconcile, { timeoutMs, pollMs, progress: (work) => {
362
+ output.data(work.map((item) => ({ issue: item.issue.number, task: item.metadata.task.id, state: item.state, reason: item.reason })));
363
+ } });
364
+ output.text(`Watch ${result.outcome} after ${result.rounds} reconciliation rounds. No PRs were merged.`);
365
+ if (result.outcome !== "handoff") {
366
+ output.error("Work needs attention or more time. Existing cloud sessions continue; inspect their status before resuming the same approved batch.");
367
+ process.exitCode = 2;
368
+ }
369
+ }
370
+ else
371
+ output.data(await reconcile());
372
+ }
373
+ }
374
+ return;
375
+ }
376
+ if (command === "publish" && values.pr !== undefined) {
377
+ if (!values.proposal)
378
+ throw new Error("Provide a PR description proposal with body, headSha and beforeHash.");
379
+ output.data(await publishDescription(api(token()), config, Number(values.pr), await readJson(await safePath(root, values.proposal)), values.apply === true));
380
+ if (!values.apply)
381
+ output.text("Preview only. Confirm the handoff and actual checks before --apply.");
382
+ return;
383
+ }
384
+ if (command === "status" && values.memory) {
385
+ output.data(await memoryContext(root, config, values.memory, values.topic ?? []));
386
+ return;
387
+ }
388
+ if (command === "status" && values["ado-id"]) {
389
+ if (!config.ado)
390
+ throw new Error("Configure ADO before importing work items.");
391
+ output.data(await importWorkItem(adoApi(config.ado, process.env.CREWBIE_ADO_TOKEN ?? ""), config.ado, integer(Number(values["ado-id"]), "ADO ID")));
392
+ return;
393
+ }
394
+ const github = api(token());
395
+ if (command === "status" && values.pr) {
396
+ const pr = record(await github.request("GET", `/repos/${config.repository}/pulls/${integer(Number(values.pr), "PR number")}`), "pull request");
397
+ const usage = await collectPrUsage(github, config.repository, pr);
398
+ output.data(usage, `${renderPrUsage(usage)}\n${usage.warnings.join("\n")}`);
399
+ }
400
+ else if (command === "status" && values.issue) {
401
+ const number = integer(Number(values.issue), "issue number");
402
+ const issue = record(await github.request("GET", `/repos/${config.repository}/issues/${number}`), "issue");
403
+ output.data({
404
+ uri: string(issue.html_url, "issue URL"), revision: string(issue.updated_at, "issue revision"),
405
+ fingerprint: hash(`${string(issue.title, "issue title")}\n\n${typeof issue.body === "string" ? issue.body : ""}`),
406
+ text: `${string(issue.title, "issue title")}\n\n${typeof issue.body === "string" ? issue.body : ""}`,
407
+ });
408
+ }
409
+ else if (command === "status") {
410
+ const work = await inspectWork(github, config);
411
+ eligible(work, config.maxActive);
412
+ output.data(work.map((item) => ({ issue: item.issue.number, task: item.metadata.task.id, state: item.state, reason: item.reason })));
413
+ }
414
+ else if (command === "internal-pr-check") {
415
+ const number = integer(Number(values.pr), "PR number");
416
+ const pr = record(await github.request("GET", `/repos/${config.repository}/pulls/${number}`), "PR");
417
+ checkPrDescription(string(pr.body, "PR description"), limitsFor(config).pr);
418
+ output.text("PR has concise what/why/checks sections. Human review still judges the reasoning and evidence.");
419
+ }
420
+ else if (command === "internal-dispatch") {
421
+ const ado = config.ado ? adoApi(config.ado, process.env.CREWBIE_ADO_TOKEN ?? "") : undefined;
422
+ const hints = (process.env.CREWBIE_ISSUE_NUMBERS ?? "").trim();
423
+ const issueNumbers = hints ? hints.split(",").map((value) => integer(Number(value), "confirmed issue number")) : [];
424
+ if (issueNumbers.length > 100)
425
+ throw new Error("At most 100 confirmed issue IDs can be reconciled at once.");
426
+ if (process.env.CREWBIE_CHECKS_TOKEN)
427
+ CHECK_READER.client = api(process.env.CREWBIE_CHECKS_TOKEN);
428
+ const work = await dispatch(github, config, ado, issueNumbers.length ? { issueNumbers } : undefined);
429
+ const summary = renderDispatchResult(work, config);
430
+ output.text(summary);
431
+ if (process.env.GITHUB_STEP_SUMMARY)
432
+ await appendFile(process.env.GITHUB_STEP_SUMMARY, summary + "\n");
433
+ if (config.ado)
434
+ await syncAdo(github, adoApi(config.ado, process.env.CREWBIE_ADO_TOKEN ?? ""), config, work);
435
+ }
436
+ else if (command === "internal-maintain") {
437
+ if (values.prepare === values.apply)
438
+ throw new Error("Choose --prepare or --apply, not both.");
439
+ output.text(values.prepare ? `Selected ${await prepareMaintenance(root, github, config)} new evidence records.` : await applyMaintenance(root, github, config));
440
+ }
441
+ else if (command === "internal-plan") {
442
+ if (values.prepare === values.apply)
443
+ throw new Error("Choose --prepare or --apply for planning.");
444
+ if (values.prepare) {
445
+ if (!process.env.GITHUB_EVENT_PATH || !["issues", "issue_comment", "workflow_dispatch"].includes(process.env.GITHUB_EVENT_NAME ?? ""))
446
+ throw new Error("Planning preparation requires a GitHub issues, issue_comment or workflow_dispatch event.");
447
+ const result = await preparePlanning(root, github, config, await readJson(process.env.GITHUB_EVENT_PATH), process.env.GITHUB_RUN_ID ? integer(Number(process.env.GITHUB_RUN_ID), "workflow run ID") : undefined);
448
+ if (process.env.GITHUB_OUTPUT)
449
+ await appendFile(process.env.GITHUB_OUTPUT, `ready=${result.ready}\nmodel=${result.model}\n`);
450
+ output.text(result.reason);
451
+ }
452
+ else
453
+ output.text(await publishPlanning(root, github, config));
454
+ }
455
+ else if (command === "internal-review") {
456
+ if (values.prepare === values.apply)
457
+ throw new Error("Choose --prepare or --apply for review.");
458
+ if (values.prepare) {
459
+ const pr = integer(Number(process.env.PR_NUMBER), "PR number");
460
+ const head = String(process.env.HEAD_SHA ?? "");
461
+ if (!/^[a-f0-9]{40}$/.test(head))
462
+ throw new Error("Review needs the full PR head SHA.");
463
+ const result = await prepareReview(root, github, config, pr, head, integer(Number(process.env.GITHUB_RUN_ID), "workflow run ID"));
464
+ if (process.env.GITHUB_OUTPUT)
465
+ await appendFile(process.env.GITHUB_OUTPUT, `ready=${result.ready}\nmodel=${result.model}\n`);
466
+ output.text(result.reason);
467
+ }
468
+ else
469
+ output.text(await publishReview(root, github, config));
470
+ }
471
+ else if (command === "internal-fix") {
472
+ if (!process.env.GITHUB_EVENT_PATH || process.env.GITHUB_EVENT_NAME !== "issue_comment")
473
+ throw new Error("Feature fixes require a GitHub issue_comment event.");
474
+ output.text(await handleFeatureFixComment(github, config, await readJson(process.env.GITHUB_EVENT_PATH)));
475
+ }
476
+ else if (command === "internal-release-plan") {
477
+ if (!values.pr)
478
+ throw new Error("Choose a merged planning PR with --pr.");
479
+ const ado = config.ado ? adoApi(config.ado, process.env.CREWBIE_ADO_TOKEN ?? "") : undefined;
480
+ output.text(await releaseMergedPlan(github, config, integer(Number(values.pr), "planning PR"), ado));
481
+ }
482
+ else if (command === "internal-pages") {
483
+ if (!["private", "public"].includes(values["pages-mode"] ?? ""))
484
+ throw new Error("Explicitly select private or public Pages mode.");
485
+ const pages = record(await github.request("GET", `/repos/${config.repository}/pages`), "Pages configuration");
486
+ if (values["pages-mode"] === "private" && pages.public !== false)
487
+ throw new Error("Private Pages was not confirmed. Use the access-controlled Actions artifact instead.");
488
+ if (values["pages-mode"] === "public" && pages.public !== true)
489
+ throw new Error("Configured Pages visibility does not match the explicitly selected public mode.");
490
+ output.text(`Pages visibility confirmed: ${values["pages-mode"]}.`);
491
+ }
492
+ else if (command === "dashboard" && values.collect) {
493
+ if (!values.out)
494
+ throw new Error("Choose a report path with --out.");
495
+ await writeAtomic(root, values.out, dashboard(await collectRecords(github, config)));
496
+ output.text(`Report written to ${values.out}.`);
497
+ }
498
+ else
499
+ throw new Error(`Unknown command or missing input: ${command}. Use --help.`);
500
+ }
501
+ main().catch((error) => {
502
+ createOutput({ machine: process.argv.includes("--json") || process.argv.some((arg) => arg.startsWith("internal-")) })
503
+ .error(error instanceof Error ? error.message : "Unexpected failure.");
504
+ process.exitCode = 1;
505
+ });
506
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,84 @@
1
+ export interface Role {
2
+ id: string;
3
+ purpose: string;
4
+ model: string;
5
+ modelReason?: string;
6
+ complexity?: "routine" | "standard" | "complex";
7
+ checks?: string[];
8
+ nonNegotiables?: string[];
9
+ contextPaths?: string[];
10
+ sourceAgent?: string;
11
+ }
12
+ export declare const PLANNING_LABEL = "crewbie:ready-for-planning";
13
+ export declare const RESTART_LABEL = "crewbie:restart";
14
+ export declare const DEFAULT_LIMITS: {
15
+ spec: number;
16
+ hot: number;
17
+ constitution: number;
18
+ topic: number;
19
+ };
20
+ /** `pr` has no evidence-backed default; it is enforced only when a repository sets it explicitly. */
21
+ export type WordLimits = typeof DEFAULT_LIMITS & {
22
+ pr?: number;
23
+ };
24
+ export type ModelProfile = "economy" | "balanced" | "quality";
25
+ export declare const DEFAULT_EXECUTION_LIMITS: {
26
+ maxLaunchesPerBatch: number;
27
+ maxAttemptsPerTask: number;
28
+ };
29
+ export type MergeMethod = "merge" | "squash" | "rebase";
30
+ /** How Crewbie merges task PRs into their plan's feature branch once the session completed and every check passed. */
31
+ export interface MergePolicy {
32
+ method: MergeMethod;
33
+ }
34
+ export declare const DEFAULT_MERGE: MergePolicy;
35
+ export interface ReviewConfig {
36
+ enabled: boolean;
37
+ role: string;
38
+ model?: string;
39
+ }
40
+ export interface LocalConfig {
41
+ start: string;
42
+ }
43
+ export declare function modelProfile(value: unknown): ModelProfile;
44
+ export interface Config {
45
+ schemaVersion: 1;
46
+ repository: string;
47
+ roles: Role[];
48
+ constitution: string | null;
49
+ maxActive: number;
50
+ nightly: {
51
+ enabled: boolean;
52
+ maxRecords: number;
53
+ allowedPaths: string[];
54
+ };
55
+ ado: {
56
+ organization: string;
57
+ project: string;
58
+ workItemType: string;
59
+ } | null;
60
+ limits?: WordLimits;
61
+ planning?: {
62
+ enabled: boolean;
63
+ model: string;
64
+ executeOnMerge?: boolean;
65
+ };
66
+ modelProfile?: ModelProfile;
67
+ execution?: typeof DEFAULT_EXECUTION_LIMITS;
68
+ merge?: MergePolicy;
69
+ review?: ReviewConfig;
70
+ local?: LocalConfig;
71
+ }
72
+ export declare function mergeFor(config: Config): MergePolicy;
73
+ /** The enabled reviewer of feature PRs and the model it runs with, or null when PR review is off. */
74
+ export declare function reviewerFor(config: Config): {
75
+ role: string;
76
+ model: string;
77
+ } | null;
78
+ export declare function limitsFor(config?: Config): WordLimits;
79
+ export declare function isRoleContextPath(path: string): boolean;
80
+ export declare function isExistingAgentPath(path: string): boolean;
81
+ export declare function agentArchivePath(path: string): string;
82
+ export declare function parseConfig(value: unknown): Config;
83
+ export declare function loadConfig(root: string): Promise<Config>;
84
+ export declare function requireExecution(config: Config): void;