@momentiq/dark-factory-cli 0.1.0-alpha.4

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 (132) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +150 -0
  3. package/dist/adapters/_shared.d.ts +45 -0
  4. package/dist/adapters/_shared.d.ts.map +1 -0
  5. package/dist/adapters/_shared.js +200 -0
  6. package/dist/adapters/_shared.js.map +1 -0
  7. package/dist/adapters/codex-sdk.d.ts +279 -0
  8. package/dist/adapters/codex-sdk.d.ts.map +1 -0
  9. package/dist/adapters/codex-sdk.js +930 -0
  10. package/dist/adapters/codex-sdk.js.map +1 -0
  11. package/dist/adapters/critic-result-schema.d.ts +215 -0
  12. package/dist/adapters/critic-result-schema.d.ts.map +1 -0
  13. package/dist/adapters/critic-result-schema.js +153 -0
  14. package/dist/adapters/critic-result-schema.js.map +1 -0
  15. package/dist/adapters/critic.d.ts +62 -0
  16. package/dist/adapters/critic.d.ts.map +1 -0
  17. package/dist/adapters/critic.js +79 -0
  18. package/dist/adapters/critic.js.map +1 -0
  19. package/dist/adapters/cursor-sdk.d.ts +153 -0
  20. package/dist/adapters/cursor-sdk.d.ts.map +1 -0
  21. package/dist/adapters/cursor-sdk.js +818 -0
  22. package/dist/adapters/cursor-sdk.js.map +1 -0
  23. package/dist/adapters/gemini-sdk.d.ts +113 -0
  24. package/dist/adapters/gemini-sdk.d.ts.map +1 -0
  25. package/dist/adapters/gemini-sdk.js +532 -0
  26. package/dist/adapters/gemini-sdk.js.map +1 -0
  27. package/dist/adapters/grok-direct-sdk.d.ts +148 -0
  28. package/dist/adapters/grok-direct-sdk.d.ts.map +1 -0
  29. package/dist/adapters/grok-direct-sdk.js +694 -0
  30. package/dist/adapters/grok-direct-sdk.js.map +1 -0
  31. package/dist/branch-protection/audit_branch_protection.py +759 -0
  32. package/dist/branch-protection/index.d.ts +25 -0
  33. package/dist/branch-protection/index.d.ts.map +1 -0
  34. package/dist/branch-protection/index.js +70 -0
  35. package/dist/branch-protection/index.js.map +1 -0
  36. package/dist/branch-protection/spec-default.yaml +314 -0
  37. package/dist/cli.d.ts +3 -0
  38. package/dist/cli.d.ts.map +1 -0
  39. package/dist/cli.js +581 -0
  40. package/dist/cli.js.map +1 -0
  41. package/dist/cycle-doc-validator/index.d.ts +43 -0
  42. package/dist/cycle-doc-validator/index.d.ts.map +1 -0
  43. package/dist/cycle-doc-validator/index.js +69 -0
  44. package/dist/cycle-doc-validator/index.js.map +1 -0
  45. package/dist/cycle-doc-validator/validate_cycle_doc.py +1260 -0
  46. package/dist/cycle-tracker-sync/attribute_pr_cycle_ref.py +384 -0
  47. package/dist/cycle-tracker-sync/index.d.ts +20 -0
  48. package/dist/cycle-tracker-sync/index.d.ts.map +1 -0
  49. package/dist/cycle-tracker-sync/index.js +71 -0
  50. package/dist/cycle-tracker-sync/index.js.map +1 -0
  51. package/dist/cycle-tracker-sync/sync_cycle_trackers.py +1093 -0
  52. package/dist/evidence/audit-trail.d.ts +59 -0
  53. package/dist/evidence/audit-trail.d.ts.map +1 -0
  54. package/dist/evidence/audit-trail.js +283 -0
  55. package/dist/evidence/audit-trail.js.map +1 -0
  56. package/dist/evidence/index.d.ts +4 -0
  57. package/dist/evidence/index.d.ts.map +1 -0
  58. package/dist/evidence/index.js +29 -0
  59. package/dist/evidence/index.js.map +1 -0
  60. package/dist/evidence/per-sha.d.ts +13 -0
  61. package/dist/evidence/per-sha.d.ts.map +1 -0
  62. package/dist/evidence/per-sha.js +97 -0
  63. package/dist/evidence/per-sha.js.map +1 -0
  64. package/dist/evidence/quality-gates.d.ts +19 -0
  65. package/dist/evidence/quality-gates.d.ts.map +1 -0
  66. package/dist/evidence/quality-gates.js +212 -0
  67. package/dist/evidence/quality-gates.js.map +1 -0
  68. package/dist/git.d.ts +40 -0
  69. package/dist/git.d.ts.map +1 -0
  70. package/dist/git.js +414 -0
  71. package/dist/git.js.map +1 -0
  72. package/dist/glob.d.ts +4 -0
  73. package/dist/glob.d.ts.map +1 -0
  74. package/dist/glob.js +99 -0
  75. package/dist/glob.js.map +1 -0
  76. package/dist/index.d.ts +17 -0
  77. package/dist/index.d.ts.map +1 -0
  78. package/dist/index.js +33 -0
  79. package/dist/index.js.map +1 -0
  80. package/dist/paths.d.ts +12 -0
  81. package/dist/paths.d.ts.map +1 -0
  82. package/dist/paths.js +42 -0
  83. package/dist/paths.js.map +1 -0
  84. package/dist/policy/baseline.d.ts +15 -0
  85. package/dist/policy/baseline.d.ts.map +1 -0
  86. package/dist/policy/baseline.js +115 -0
  87. package/dist/policy/baseline.js.map +1 -0
  88. package/dist/policy/config.d.ts +64 -0
  89. package/dist/policy/config.d.ts.map +1 -0
  90. package/dist/policy/config.js +363 -0
  91. package/dist/policy/config.js.map +1 -0
  92. package/dist/policy/gate.d.ts +80 -0
  93. package/dist/policy/gate.d.ts.map +1 -0
  94. package/dist/policy/gate.js +1019 -0
  95. package/dist/policy/gate.js.map +1 -0
  96. package/dist/policy/index.d.ts +7 -0
  97. package/dist/policy/index.d.ts.map +1 -0
  98. package/dist/policy/index.js +14 -0
  99. package/dist/policy/index.js.map +1 -0
  100. package/dist/policy/merge-queue.d.ts +183 -0
  101. package/dist/policy/merge-queue.d.ts.map +1 -0
  102. package/dist/policy/merge-queue.js +310 -0
  103. package/dist/policy/merge-queue.js.map +1 -0
  104. package/dist/policy/profile.d.ts +98 -0
  105. package/dist/policy/profile.d.ts.map +1 -0
  106. package/dist/policy/profile.js +156 -0
  107. package/dist/policy/profile.js.map +1 -0
  108. package/dist/policy/tdd-classifier.d.ts +18 -0
  109. package/dist/policy/tdd-classifier.d.ts.map +1 -0
  110. package/dist/policy/tdd-classifier.js +79 -0
  111. package/dist/policy/tdd-classifier.js.map +1 -0
  112. package/dist/prompt.d.ts +13 -0
  113. package/dist/prompt.d.ts.map +1 -0
  114. package/dist/prompt.js +175 -0
  115. package/dist/prompt.js.map +1 -0
  116. package/dist/report.d.ts +88 -0
  117. package/dist/report.d.ts.map +1 -0
  118. package/dist/report.js +376 -0
  119. package/dist/report.js.map +1 -0
  120. package/dist/runner.d.ts +30 -0
  121. package/dist/runner.d.ts.map +1 -0
  122. package/dist/runner.js +456 -0
  123. package/dist/runner.js.map +1 -0
  124. package/dist/security.d.ts +2 -0
  125. package/dist/security.d.ts.map +1 -0
  126. package/dist/security.js +19 -0
  127. package/dist/security.js.map +1 -0
  128. package/dist/trusted-surface/rebind.d.ts +10 -0
  129. package/dist/trusted-surface/rebind.d.ts.map +1 -0
  130. package/dist/trusted-surface/rebind.js +154 -0
  131. package/dist/trusted-surface/rebind.js.map +1 -0
  132. package/package.json +78 -0
package/dist/cli.js ADDED
@@ -0,0 +1,581 @@
1
+ #!/usr/bin/env node
2
+ // Dark Factory CLI entrypoint.
3
+ //
4
+ // Phase B shipped the underlying services (Critic Orchestrator, Policy
5
+ // Engine, Trusted-Surface Rebind) as a library + a stub binary.
6
+ //
7
+ // Phase C extended the binary with four subcommands that wrap the
8
+ // Python-backed services extracted in cycle 331.1 Phase C:
9
+ //
10
+ // df validate-cycle-doc — service #5 (cycle-doc trailer validator)
11
+ // df audit-branch-protection — service #7 (branch-protection drift detector)
12
+ // df sync-trackers — service #9 part A (cycle tracker sync)
13
+ // df attribute-pr — service #9 part B (PR -> Cycle Ref attribution)
14
+ //
15
+ // Phase D (this file's additions) ships two more pure-TS subcommands:
16
+ //
17
+ // df audit stats [--path <NDJSON>] — service #8 (read/summarize _runs.ndjson)
18
+ // df admit-pr --files-stdin — service #6 plan-vs-code classifier
19
+ //
20
+ // Phase F upgrades two stubs to real implementations:
21
+ //
22
+ // df status-check — sentinel aggregator (exit 0).
23
+ // df critic [--ref <gitref>] — real Critic Orchestrator via
24
+ // runReview() + 4 vendor adapters.
25
+ //
26
+ // The remaining subcommands listed in --help (review, gate, doctor) land
27
+ // in Phase G or later. For now they print a "not implemented" message
28
+ // and exit 2.
29
+ //
30
+ // Argument parsing is intentionally minimal — every flag after a Phase C
31
+ // subcommand is passed through to the wrapped Python script verbatim.
32
+ // The Python scripts already have argparse-based help; consumers invoke
33
+ // `df validate-cycle-doc --help` to get the full flag list. Phase D
34
+ // subcommands accept their own flags directly (see `cmdAudit` and
35
+ // `cmdAdmitPr` below).
36
+ import { existsSync, readFileSync } from "node:fs";
37
+ import { dirname, resolve } from "node:path";
38
+ import { fileURLToPath } from "node:url";
39
+ import { runValidateCycleDoc } from "./cycle-doc-validator/index.js";
40
+ import { runAuditBranchProtection } from "./branch-protection/index.js";
41
+ import { runSyncCycleTrackers, runAttributePrCycleRef, } from "./cycle-tracker-sync/index.js";
42
+ import { FileTelemetrySink, readTelemetryEvents, summarizeTelemetry, computeQuorumStats, computeCriticAgreement, } from "./evidence/audit-trail.js";
43
+ import { classifyPrKindFromFiles } from "./policy/merge-queue.js";
44
+ import { AdapterRegistry } from "./adapters/critic.js";
45
+ import { CursorSdkAdapter } from "./adapters/cursor-sdk.js";
46
+ import { CodexSdkAdapter } from "./adapters/codex-sdk.js";
47
+ import { GeminiSdkAdapter } from "./adapters/gemini-sdk.js";
48
+ import { GrokDirectSdkAdapter } from "./adapters/grok-direct-sdk.js";
49
+ import { loadAgentReviewConfig } from "./policy/config.js";
50
+ import { runReview } from "./runner.js";
51
+ import { resolveArtifactDir, telemetryPath } from "./paths.js";
52
+ function readPackageMeta() {
53
+ try {
54
+ const here = dirname(fileURLToPath(import.meta.url));
55
+ // dist/cli.js → ../package.json
56
+ const pkgPath = resolve(here, "..", "package.json");
57
+ const raw = readFileSync(pkgPath, "utf8");
58
+ return JSON.parse(raw);
59
+ }
60
+ catch {
61
+ return {};
62
+ }
63
+ }
64
+ function printHelp(meta) {
65
+ const name = meta.name ?? "@momentiq/dark-factory-cli";
66
+ const version = meta.version ?? "unknown";
67
+ process.stdout.write([
68
+ `${name} v${version}`,
69
+ "",
70
+ "Dark Factory OSS CLI — multi-vendor adversarial critic orchestration.",
71
+ "",
72
+ "Usage:",
73
+ " df --version Print version and exit",
74
+ " df --help Print this help and exit",
75
+ "",
76
+ "Subcommands (Phase C — services #5/#7/#9):",
77
+ " df validate-cycle-doc Validate a PR's Cycle:/Issue:/ProjectItem: trailers",
78
+ " df audit-branch-protection Detect drift between spec.yaml and live GH ruleset",
79
+ " df sync-trackers Reconcile GitHub tracker issues with cycle docs",
80
+ " df attribute-pr Write PR's Cycle: trailer into project board's Cycle Ref field",
81
+ "",
82
+ "Subcommands (Phase D — services #6/#8):",
83
+ " df audit stats Summarize the _runs.ndjson audit trail (service #8)",
84
+ " df admit-pr Classify a PR as plan vs code (service #6)",
85
+ "",
86
+ "Subcommands (Phase F — reusable-workflow gates, dogfood-wired):",
87
+ " df status-check Sentinel aggregator (PR Status Check gate).",
88
+ " Exits 0 — merge queue is the real aggregator.",
89
+ " df critic Real Critic Orchestrator wiring (agent-critic",
90
+ " gate). Loads .agent-review/config.json, runs",
91
+ " the 4 vendor adapters via runReview, writes",
92
+ " aggregate verdict to .git/agent-reviews/<sha>.",
93
+ " Degrades-and-passes on any error (exit 0).",
94
+ "",
95
+ "Subcommands (coming in cycle 331.1 Phase G+):",
96
+ " df review Run the multi-critic review for the current commit",
97
+ " df gate Evaluate gate verdict for the current commit",
98
+ " df doctor Diagnose installation, env, and config",
99
+ "",
100
+ "Each Phase C subcommand passes its remaining argv through to the bundled",
101
+ "Python script verbatim; run `df <subcommand> --help` for full flags.",
102
+ "Phase D subcommands parse flags directly — see `df audit --help` and",
103
+ "`df admit-pr --help`. Phase F's `df critic` accepts --ref/--config/--cwd",
104
+ "(see `df critic --help`); status-check accepts no flags. Both subcommands",
105
+ "exit 0 even on failure so the reusable workflows do not block the merge",
106
+ "queue on a single vendor flake — vendor errors register in the artifact",
107
+ "as `status=error` and the configured min-complete-quorum policy decides",
108
+ "the aggregate verdict.",
109
+ "",
110
+ "System requirements:",
111
+ " Node.js >=20",
112
+ " python3 (>=3.11)",
113
+ " gh CLI (authenticated) for service #5/#7/#9 GitHub API calls",
114
+ " git on PATH",
115
+ "",
116
+ "Library usage today:",
117
+ " import { runReview, evaluateCommitGate, buildReviewPacket }",
118
+ ` from \"${name}\";`,
119
+ "",
120
+ "Status: 0.1.0-alpha.4 — Phase F wires the real Critic Orchestrator",
121
+ " and dogfoods dark-factory on its own PRs. Reusable workflows",
122
+ " from Phase E now invoke real critic logic. The substrate",
123
+ " validates itself end-to-end.",
124
+ " Pure-TS port of #5/#7/#9 tracked as Phase C-PORT follow-up.",
125
+ "",
126
+ "Docs: https://github.com/momentiq-ai/dark-factory",
127
+ "",
128
+ ].join("\n"));
129
+ }
130
+ function printVersion(meta) {
131
+ process.stdout.write(`${meta.version ?? "unknown"}\n`);
132
+ }
133
+ function notImplemented(sub) {
134
+ process.stderr.write(`df: subcommand "${sub}" is not implemented in this alpha build.\n` +
135
+ ` Phase B/C/D ship services as library + Python-wrapped subcommands;\n` +
136
+ ` Phase E added reusable workflow stubs (status-check, critic);\n` +
137
+ ` Phase F upgraded both to real implementations;\n` +
138
+ ` "${sub}" lands in Phase G or later (see \`df --help\`).\n`);
139
+ return 2;
140
+ }
141
+ async function runPhaseCSubcommand(sub, rest) {
142
+ // Each Phase C subcommand inherits stdio so user sees Python output
143
+ // live (logs, progress, structured GHA `::error::` lines).
144
+ switch (sub) {
145
+ case "validate-cycle-doc": {
146
+ const result = await runValidateCycleDoc({ args: rest, inheritStdio: true });
147
+ return result.exitCode;
148
+ }
149
+ case "audit-branch-protection": {
150
+ const result = await runAuditBranchProtection({ args: rest, inheritStdio: true });
151
+ return result.exitCode;
152
+ }
153
+ case "sync-trackers": {
154
+ const result = await runSyncCycleTrackers({ args: rest, inheritStdio: true });
155
+ return result.exitCode;
156
+ }
157
+ case "attribute-pr": {
158
+ const result = await runAttributePrCycleRef({ args: rest, inheritStdio: true });
159
+ return result.exitCode;
160
+ }
161
+ default:
162
+ // Unreachable — caller guarantees `sub` is one of the cases above.
163
+ return notImplemented(sub);
164
+ }
165
+ }
166
+ const PHASE_C_SUBCOMMANDS = new Set([
167
+ "validate-cycle-doc",
168
+ "audit-branch-protection",
169
+ "sync-trackers",
170
+ "attribute-pr",
171
+ ]);
172
+ const PHASE_D_SUBCOMMANDS = new Set(["audit", "admit-pr"]);
173
+ // Phase F upgrades two reusable-workflow handlers from stubs (Phase E) to
174
+ // real implementations:
175
+ //
176
+ // - `status-check` stays thin: a sentinel aggregator. The merge queue's
177
+ // ALLGREEN rule already does the real cross-check aggregation; this
178
+ // subcommand exists for the `PR Status Check` ruleset context.
179
+ //
180
+ // - `critic` is now wired to the real Critic Orchestrator (Phase B
181
+ // extraction). It loads `.agent-review/config.json`, instantiates
182
+ // the 4 vendor adapters, runs `runReview()`, and writes the
183
+ // aggregate artifact. Degrades-and-passes on any error so the
184
+ // dogfood gate stays green while operators triage upstream issues.
185
+ const PHASE_F_SUBCOMMANDS = new Set(["status-check", "critic"]);
186
+ function cmdStatusCheck(_rest) {
187
+ // PR Status Check is a sentinel aggregator. As cycle 331.1 Phase E
188
+ // documents in `.github/workflows/pr-status-check.yml`, this gate is
189
+ // present specifically to satisfy the `PR Status Check` ruleset context
190
+ // — its passage means "the workflow itself reached this step", which
191
+ // is the contract every other status check separately enforces. There
192
+ // is no useful aggregation work to do here that the merge queue's
193
+ // `ALLGREEN` rule doesn't already do. So we keep this thin: emit a
194
+ // structured one-liner and exit 0.
195
+ //
196
+ // A richer aggregator (querying the GitHub Actions API for sibling
197
+ // check results) was considered for Phase F; deferred as gold-plating
198
+ // because the merge queue already provides that semantics with
199
+ // stronger guarantees (it sees the actual rerun state, not a snapshot).
200
+ process.stdout.write("df status-check: sentinel-pass (cycle 331.1 Phase F) — merge queue is the real aggregator.\n");
201
+ return 0;
202
+ }
203
+ function parseCriticArgs(rest) {
204
+ const { flags } = parseFlags(rest);
205
+ const ref = typeof flags["ref"] === "string"
206
+ ? flags["ref"]
207
+ : typeof flags["pr"] === "string"
208
+ ? "HEAD"
209
+ : "HEAD";
210
+ const out = { ref };
211
+ if (typeof flags["config"] === "string") {
212
+ out.configPath = flags["config"];
213
+ }
214
+ if (typeof flags["cwd"] === "string") {
215
+ out.cwd = flags["cwd"];
216
+ }
217
+ return out;
218
+ }
219
+ function buildDefaultAdapterRegistry() {
220
+ // Each adapter reads its API key from the corresponding env var by
221
+ // default (CURSOR_API_KEY / CODEX_API_KEY / GEMINI_API_KEY /
222
+ // XAI_API_KEY). Missing keys cause the adapter's `review()` to
223
+ // return `status="error"` rather than throw at registry-init time —
224
+ // exactly the behavior min-complete-quorum needs to degrade
225
+ // gracefully.
226
+ const registry = new AdapterRegistry();
227
+ registry.register(new CursorSdkAdapter());
228
+ registry.register(new CodexSdkAdapter());
229
+ registry.register(new GeminiSdkAdapter());
230
+ registry.register(new GrokDirectSdkAdapter());
231
+ return registry;
232
+ }
233
+ async function cmdCritic(rest) {
234
+ if (rest.includes("--help") || rest.includes("-h")) {
235
+ process.stdout.write([
236
+ "df critic — run the multi-vendor adversarial critic against HEAD",
237
+ "",
238
+ "Usage:",
239
+ " df critic [--ref <gitref>] [--config <path>] [--cwd <path>]",
240
+ "",
241
+ "Reads .agent-review/config.json (or --config <path>), instantiates",
242
+ "the configured vendor adapters, runs the critics against the named",
243
+ "git ref (default HEAD), and writes the aggregate verdict + per-",
244
+ "critic findings to `.git/agent-reviews/<sha>.json` (path comes",
245
+ "from the loaded config's git.artifactDir).",
246
+ "",
247
+ "Environment:",
248
+ " CURSOR_API_KEY / CODEX_API_KEY / GEMINI_API_KEY / XAI_API_KEY",
249
+ " Vendor critic API keys. Missing keys cause the corresponding",
250
+ " critic to register as `status=error` (non-blocking under the",
251
+ " default min-complete-quorum policy).",
252
+ "",
253
+ "Exit code:",
254
+ " Always 0 in this build — vendor / config errors are surfaced",
255
+ " on stderr with a [critic-degraded] prefix. The aggregate gate",
256
+ " verdict is written to the artifact file regardless.",
257
+ "",
258
+ ].join("\n"));
259
+ return 0;
260
+ }
261
+ const opts = parseCriticArgs(rest);
262
+ try {
263
+ const loaded = await loadAgentReviewConfig({
264
+ ...(opts.cwd !== undefined ? { cwd: opts.cwd } : {}),
265
+ });
266
+ const registry = buildDefaultAdapterRegistry();
267
+ // Wire a file telemetry sink so the run lands in
268
+ // `.git/agent-reviews/_runs.ndjson` (the same path `df audit stats`
269
+ // reads). This is dogfood proof: the substrate exercises its own
270
+ // audit trail on its own PRs.
271
+ const artifactDir = await resolveArtifactDir(loaded);
272
+ const sink = new FileTelemetrySink(telemetryPath(artifactDir));
273
+ const outcome = await runReview({
274
+ loaded,
275
+ registry,
276
+ ref: opts.ref,
277
+ telemetry: sink,
278
+ });
279
+ const verdict = outcome.artifact.gateVerdict ?? "(no verdict)";
280
+ const reviewedSha = outcome.artifact.commit;
281
+ const findingCount = outcome.artifact.criticResults.reduce((acc, r) => acc + r.findings.length, 0);
282
+ const criticSummaries = outcome.artifact.criticResults
283
+ .map((r) => ` ${r.criticId}: ${r.status}` +
284
+ (r.verdict ? ` (${r.verdict})` : "") +
285
+ ` — findings=${r.findings.length}`)
286
+ .join("\n");
287
+ process.stdout.write([
288
+ `df critic: review complete for ${reviewedSha}`,
289
+ ` verdict: ${verdict}`,
290
+ ` total findings: ${findingCount}`,
291
+ ` per-critic:`,
292
+ criticSummaries,
293
+ ` artifact: ${outcome.paths.jsonPath}`,
294
+ "",
295
+ ].join("\n"));
296
+ return 0;
297
+ }
298
+ catch (err) {
299
+ // Degrade-and-pass. See the design comment above the function.
300
+ process.stderr.write([
301
+ "[critic-degraded] df critic failed before completing a review.",
302
+ `[critic-degraded] cause: ${err.message}`,
303
+ "[critic-degraded] exiting 0 so the dogfood gate stays green. Operators:",
304
+ "[critic-degraded] - check .agent-review/config.json exists at repo root",
305
+ "[critic-degraded] - check vendor API keys are exported (CURSOR_API_KEY etc.)",
306
+ "[critic-degraded] - check the worktree's .git/agent-reviews/ is writable",
307
+ "[critic-degraded] - inspect upstream logs for stack trace context",
308
+ "",
309
+ ].join("\n"));
310
+ return 0;
311
+ }
312
+ }
313
+ // ---------------------------------------------------------------------------
314
+ // Phase D: `df audit stats` — service #8 (audit/compliance trail).
315
+ //
316
+ // Reads the `_runs.ndjson` file (path supplied via `--path`, or default
317
+ // resolved via `--git-dir` heuristic, or as a last resort the local
318
+ // `.git/agent-reviews/_runs.ndjson`) and emits the same operator-
319
+ // friendly summary that sage3c's `make agent-review-stats` produced.
320
+ //
321
+ // The default-path resolution chain is deliberately conservative:
322
+ // without a Phase E config-loader, the CLI cannot reliably discover
323
+ // the consumer's artifact dir from inside an arbitrary worktree, so
324
+ // we surface a clear error when nothing was found rather than
325
+ // silently scanning the wrong path.
326
+ // ---------------------------------------------------------------------------
327
+ function parseFlags(rest) {
328
+ const flags = {};
329
+ const positional = [];
330
+ for (let i = 0; i < rest.length; i++) {
331
+ const a = rest[i] ?? "";
332
+ if (a.startsWith("--")) {
333
+ const eq = a.indexOf("=");
334
+ if (eq >= 0) {
335
+ flags[a.slice(2, eq)] = a.slice(eq + 1);
336
+ }
337
+ else {
338
+ const next = rest[i + 1];
339
+ if (next !== undefined && !next.startsWith("--")) {
340
+ flags[a.slice(2)] = next;
341
+ i++;
342
+ }
343
+ else {
344
+ flags[a.slice(2)] = true;
345
+ }
346
+ }
347
+ }
348
+ else {
349
+ positional.push(a);
350
+ }
351
+ }
352
+ return { flags, positional };
353
+ }
354
+ function cmdAuditHelp() {
355
+ process.stdout.write([
356
+ "df audit — operate on the _runs.ndjson audit trail (service #8)",
357
+ "",
358
+ "Usage:",
359
+ " df audit stats [--path <PATH>] Summarize the audit trail",
360
+ " df audit --help Show this help",
361
+ "",
362
+ "Defaults:",
363
+ " --path defaults to `<repo>/.git/agent-reviews/_runs.ndjson` when",
364
+ " present; otherwise the command exits with a clear error.",
365
+ "",
366
+ ].join("\n"));
367
+ }
368
+ function cmdAudit(rest) {
369
+ if (rest.includes("--help") || rest.includes("-h")) {
370
+ cmdAuditHelp();
371
+ return 0;
372
+ }
373
+ const action = rest[0] ?? "";
374
+ if (action !== "stats") {
375
+ process.stderr.write(`df audit: unknown action "${action}". Run \`df audit --help\` for usage.\n`);
376
+ return 2;
377
+ }
378
+ const { flags } = parseFlags(rest.slice(1));
379
+ let path = typeof flags["path"] === "string" ? flags["path"] : undefined;
380
+ if (!path) {
381
+ const defaultPath = resolve(process.cwd(), ".git", "agent-reviews", "_runs.ndjson");
382
+ if (existsSync(defaultPath)) {
383
+ path = defaultPath;
384
+ }
385
+ }
386
+ if (!path) {
387
+ process.stderr.write("df audit stats: no audit trail found. Pass --path <PATH> or run inside a repo with a `.git/agent-reviews/_runs.ndjson` file.\n");
388
+ return 1;
389
+ }
390
+ const events = readTelemetryEvents(path);
391
+ const stats = summarizeTelemetry(events);
392
+ process.stdout.write(`df audit stats (${path})\n`);
393
+ process.stdout.write(` total runs: ${stats.totalRuns}\n`);
394
+ process.stdout.write(` errored runs: ${stats.errorRuns}\n`);
395
+ process.stdout.write(` approved verdicts: ${stats.approvedCount}\n`);
396
+ process.stdout.write(` changes requested: ${stats.changesRequestedCount}\n`);
397
+ process.stdout.write(` gate passes: ${stats.passes}\n`);
398
+ process.stdout.write(` gate blocks: ${stats.blocks}\n`);
399
+ process.stdout.write(` gate bypasses: ${stats.bypasses}\n`);
400
+ process.stdout.write(` median run ms: ${stats.medianDurationMs ?? "n/a"}\n`);
401
+ const retry = stats.retry;
402
+ const retryActivity = retry.totalRetryAttempts +
403
+ retry.oneRetrySuccess +
404
+ retry.twoPlusRetrySuccess +
405
+ Object.values(retry.exhaustedByErrorCode).reduce((a, b) => a + b, 0);
406
+ if (retryActivity > 0) {
407
+ process.stdout.write(` retry summary:\n`);
408
+ process.stdout.write(` first-attempt success: ${retry.firstAttemptSuccess}\n`);
409
+ process.stdout.write(` 1-retry success: ${retry.oneRetrySuccess}\n`);
410
+ process.stdout.write(` 2+-retry success: ${retry.twoPlusRetrySuccess}\n`);
411
+ process.stdout.write(` total retry attempts: ${retry.totalRetryAttempts}\n`);
412
+ const codes = Object.entries(retry.exhaustedByErrorCode);
413
+ if (codes.length > 0) {
414
+ process.stdout.write(` exhausted by error code:\n`);
415
+ codes
416
+ .sort((a, b) => b[1] - a[1] || a[0].localeCompare(b[0]))
417
+ .forEach(([code, n]) => process.stdout.write(` ${code}: ${n}\n`));
418
+ }
419
+ }
420
+ for (const [id, c] of Object.entries(stats.byCritic)) {
421
+ process.stdout.write(` critic ${id}: starts=${c.starts} finishes=${c.finishes} errors=${c.errors} approved=${c.approved} blocks=${c.totalBlockers} highs=${c.totalHigh}\n`);
422
+ }
423
+ const agreement = computeCriticAgreement(events);
424
+ if (agreement.comparedCommits > 0) {
425
+ const pct = Math.round((agreement.agreedCommits / agreement.comparedCommits) * 100);
426
+ process.stdout.write(` multi-critic agreement: ${agreement.agreedCommits}/${agreement.comparedCommits} = ${pct}% (critics: ${agreement.comparedCriticIds.join(", ")})\n`);
427
+ const disagreements = Object.entries(agreement.disagreementsByPattern);
428
+ if (disagreements.length > 0) {
429
+ process.stdout.write(` disagreements:\n`);
430
+ disagreements
431
+ .sort((a, b) => b[1] - a[1] || a[0].localeCompare(b[0]))
432
+ .forEach(([pattern, n]) => process.stdout.write(` ${pattern}: ${n}\n`));
433
+ }
434
+ }
435
+ const quorumStats = computeQuorumStats(events);
436
+ if (quorumStats.totalAggregateEvents > 0) {
437
+ process.stdout.write(` quorum stats (${quorumStats.totalAggregateEvents} reviews):\n`);
438
+ const reasons = Object.entries(quorumStats.byReason);
439
+ reasons
440
+ .sort((a, b) => b[1] - a[1] || a[0].localeCompare(b[0]))
441
+ .forEach(([reason, n]) => {
442
+ const pct = Math.round((n / quorumStats.totalAggregateEvents) * 100);
443
+ process.stdout.write(` ${reason}: ${n} (${pct}%)\n`);
444
+ });
445
+ const culprits = Object.entries(quorumStats.quorumUnmetByCritic);
446
+ if (culprits.length > 0) {
447
+ process.stdout.write(` would-be quorum_unmet by critic:\n`);
448
+ culprits
449
+ .sort((a, b) => b[1] - a[1] || a[0].localeCompare(b[0]))
450
+ .forEach(([id, n]) => process.stdout.write(` ${id}: ${n}\n`));
451
+ }
452
+ }
453
+ return 0;
454
+ }
455
+ // ---------------------------------------------------------------------------
456
+ // Phase D: `df admit-pr` — service #6 plan-vs-code classifier.
457
+ //
458
+ // Classifies a PR's file list (passed via --files-stdin reading newline-
459
+ // separated paths, or --files comma-separated for one-shot CLI) and
460
+ // prints `plan` or `code` to stdout. Exit code is always 0 unless the
461
+ // input cannot be parsed; this is a classifier, not a gate.
462
+ //
463
+ // Stdin form is preferred for CI integration:
464
+ // gh pr view 123 --json files --jq '.files[].path' | df admit-pr --files-stdin
465
+ //
466
+ // The lightweight CLI surface lets sage3c retire the inline bash
467
+ // classifier in `.github/workflows/plan-pr-review-gate.yml` once Phase
468
+ // E ships the reusable workflow.
469
+ // ---------------------------------------------------------------------------
470
+ function cmdAdmitPrHelp() {
471
+ process.stdout.write([
472
+ "df admit-pr — classify a PR as `plan` vs `code` (service #6)",
473
+ "",
474
+ "Usage:",
475
+ " df admit-pr --files-stdin Read newline-separated paths from stdin",
476
+ " df admit-pr --files <a,b,c> Comma-separated paths on the CLI",
477
+ " df admit-pr --help Show this help",
478
+ "",
479
+ "Output: `plan` or `code` on stdout, plus a one-line rationale on stderr.",
480
+ "",
481
+ "Classifier (ported from .github/workflows/plan-pr-review-gate.yml):",
482
+ " - `plan` iff at least one file matches",
483
+ " /docs/roadmap/cycles/cycleN[.M]-slug.md AND no file is outside docs/.",
484
+ " - everything else is `code`.",
485
+ "",
486
+ ].join("\n"));
487
+ }
488
+ async function readStdinUtf8() {
489
+ return new Promise((res, rej) => {
490
+ let acc = "";
491
+ process.stdin.setEncoding("utf8");
492
+ process.stdin.on("data", (chunk) => {
493
+ acc += chunk;
494
+ });
495
+ process.stdin.on("end", () => res(acc));
496
+ process.stdin.on("error", (err) => rej(err));
497
+ });
498
+ }
499
+ async function cmdAdmitPr(rest) {
500
+ if (rest.includes("--help") || rest.includes("-h")) {
501
+ cmdAdmitPrHelp();
502
+ return 0;
503
+ }
504
+ const { flags } = parseFlags(rest);
505
+ let paths = [];
506
+ if (flags["files-stdin"]) {
507
+ const raw = await readStdinUtf8();
508
+ paths = raw
509
+ .split(/\r?\n/)
510
+ .map((line) => line.trim())
511
+ .filter((line) => line.length > 0);
512
+ }
513
+ else if (typeof flags["files"] === "string") {
514
+ paths = flags["files"]
515
+ .split(",")
516
+ .map((s) => s.trim())
517
+ .filter((s) => s.length > 0);
518
+ }
519
+ else {
520
+ process.stderr.write("df admit-pr: pass --files-stdin (newline-separated stdin) or --files a,b,c. Run --help for usage.\n");
521
+ return 2;
522
+ }
523
+ if (paths.length === 0) {
524
+ process.stderr.write("df admit-pr: empty file list — cannot classify. Classifying as `code` (default-upward).\n");
525
+ process.stdout.write("code\n");
526
+ return 0;
527
+ }
528
+ const kind = classifyPrKindFromFiles(paths);
529
+ process.stderr.write(`df admit-pr: classified ${paths.length} file(s) as ${kind}.\n`);
530
+ process.stdout.write(`${kind}\n`);
531
+ return 0;
532
+ }
533
+ async function main(argv) {
534
+ const meta = readPackageMeta();
535
+ const args = argv.slice(2);
536
+ if (args.length === 0 || args.includes("--help") || args.includes("-h")) {
537
+ // Top-level --help/-h. Subcommand --help is forwarded to the Python
538
+ // script via the rest-args pass-through.
539
+ if (args.length === 0) {
540
+ printHelp(meta);
541
+ return 0;
542
+ }
543
+ // If a subcommand is present alongside --help, forward to Python.
544
+ const sub0 = args[0] ?? "";
545
+ if (!PHASE_C_SUBCOMMANDS.has(sub0) &&
546
+ !PHASE_D_SUBCOMMANDS.has(sub0) &&
547
+ !PHASE_F_SUBCOMMANDS.has(sub0)) {
548
+ printHelp(meta);
549
+ return 0;
550
+ }
551
+ }
552
+ if (args.length > 0 && (args[0] === "--version" || args[0] === "-V")) {
553
+ printVersion(meta);
554
+ return 0;
555
+ }
556
+ const sub = args[0] ?? "";
557
+ const rest = args.slice(1);
558
+ if (PHASE_C_SUBCOMMANDS.has(sub)) {
559
+ return runPhaseCSubcommand(sub, rest);
560
+ }
561
+ if (sub === "audit") {
562
+ return cmdAudit(rest);
563
+ }
564
+ if (sub === "admit-pr") {
565
+ return cmdAdmitPr(rest);
566
+ }
567
+ if (sub === "status-check") {
568
+ return cmdStatusCheck(rest);
569
+ }
570
+ if (sub === "critic") {
571
+ return await cmdCritic(rest);
572
+ }
573
+ return notImplemented(sub);
574
+ }
575
+ main(process.argv).then((code) => {
576
+ process.exitCode = code;
577
+ }, (err) => {
578
+ process.stderr.write(`df: fatal: ${err.message}\n`);
579
+ process.exitCode = 1;
580
+ });
581
+ //# 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,43 @@
1
+ export interface ValidateCycleDocOptions {
2
+ /** Extra argv passed to the Python script after the script path. */
3
+ readonly args?: ReadonlyArray<string>;
4
+ /**
5
+ * Working directory for the subprocess. Defaults to `process.cwd()`.
6
+ * The script uses cwd to locate the consumer's git toplevel.
7
+ */
8
+ readonly cwd?: string;
9
+ /**
10
+ * Override env vars merged into `process.env` for the subprocess. The
11
+ * wrapper always sets `DF_REPO_ROOT` if `repoRoot` is supplied.
12
+ */
13
+ readonly env?: NodeJS.ProcessEnv;
14
+ /**
15
+ * Explicit repo root. Set as `DF_REPO_ROOT` so the script bypasses
16
+ * `git rev-parse` resolution. Use when invoking outside a git
17
+ * worktree (rare; mostly for tests).
18
+ */
19
+ readonly repoRoot?: string;
20
+ /**
21
+ * Inherit stdio (default `true`). When `false` the parent captures
22
+ * stdout/stderr as strings on the result.
23
+ */
24
+ readonly inheritStdio?: boolean;
25
+ /** Python interpreter name. Defaults to `python3`. */
26
+ readonly python?: string;
27
+ }
28
+ export interface ValidateCycleDocResult {
29
+ readonly exitCode: number;
30
+ readonly stdout: string;
31
+ readonly stderr: string;
32
+ }
33
+ /**
34
+ * Filesystem path to the bundled `validate_cycle_doc.py` script.
35
+ *
36
+ * In dev (running from `src/`) and published (running from `dist/`), the
37
+ * script lives next to this module. The post-build copy step in
38
+ * `packages/cli/scripts/copy-assets.mjs` mirrors `src/**\/*.py` to
39
+ * `dist/**\/*.py` so the resolution is identical.
40
+ */
41
+ export declare function getValidateCycleDocScriptPath(): string;
42
+ export declare function runValidateCycleDoc(options?: ValidateCycleDocOptions): Promise<ValidateCycleDocResult>;
43
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cycle-doc-validator/index.ts"],"names":[],"mappings":"AAuBA,MAAM,WAAW,uBAAuB;IACtC,oEAAoE;IACpE,QAAQ,CAAC,IAAI,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IACtC;;;OAGG;IACH,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB;;;OAGG;IACH,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACjC;;;;OAIG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B;;;OAGG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC;IAChC,sDAAsD;IACtD,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED;;;;;;;GAOG;AACH,wBAAgB,6BAA6B,IAAI,MAAM,CAGtD;AAED,wBAAgB,mBAAmB,CACjC,OAAO,GAAE,uBAA4B,GACpC,OAAO,CAAC,sBAAsB,CAAC,CAmCjC"}