@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
@@ -0,0 +1,88 @@
1
+ import type { LoadedConfig } from "./policy/config.js";
2
+ import { type CriticResult, type ReviewArtifact, type ReviewSeverity, type ReviewVerdict } from "@momentiq/dark-factory-schemas";
3
+ export interface AggregateInputs {
4
+ loaded: LoadedConfig;
5
+ commit: string;
6
+ parent: string;
7
+ range: string;
8
+ diffHash: string;
9
+ criticResults: CriticResult[];
10
+ status: ReviewArtifact["status"];
11
+ createdAt: string;
12
+ quorumOverride?: number;
13
+ }
14
+ export declare function buildAggregate(inputs: AggregateInputs): ReviewArtifact;
15
+ /**
16
+ * Cycle 322.3 — does this critic count toward the quorum?
17
+ *
18
+ * Exported for `gate.ts` so the gate evaluator and the verdict
19
+ * computation see the same definition of "completed".
20
+ */
21
+ export declare function isCriticCompleted(r: CriticResult): boolean;
22
+ /**
23
+ * Cycle 322.3 — does this completed critic veto the gate?
24
+ *
25
+ * Manifesto §11 "first principles veto": any rigorous critic with a
26
+ * blocking finding (or `requiresHumanJudgment`, or a
27
+ * CHANGES_REQUESTED verdict) blocks the gate regardless of how many
28
+ * other critics approved. Returns `false` for non-completed critics
29
+ * — only a completed critic can veto.
30
+ */
31
+ export declare function criticVetoesGate(r: CriticResult, blockingSeverities: ReviewSeverity[]): boolean;
32
+ export interface QuorumAggregateOutcome {
33
+ verdict: ReviewVerdict;
34
+ /**
35
+ * Which gate-decision path drove the verdict. Distinct telemetry
36
+ * value so operators can route alerts differently:
37
+ * - `veto` — a completed critic raised a blocking finding /
38
+ * CHANGES_REQUESTED verdict / requiresHumanJudgment. The
39
+ * manifesto §11 invariant: a single rigorous critic vetoes
40
+ * regardless of quorum status.
41
+ * - `majority` — >= quorum critics completed and majority voted
42
+ * APPROVED (no veto). Ties favor CHANGES_REQUESTED.
43
+ * - `quorum_unmet` — < quorum critics completed (no veto).
44
+ * Distinct from a content block: a sustained spike correlated
45
+ * with `critic_run_error` on adapter X is a vendor-incident
46
+ * pattern operators page on.
47
+ */
48
+ reason: "majority" | "veto" | "quorum_unmet";
49
+ completedCount: number;
50
+ totalCount: number;
51
+ }
52
+ /**
53
+ * Cycle 322.3 — compute the aggregate verdict under
54
+ * `min-complete-quorum`. Pure: takes only the critic results, the
55
+ * blocking severities, and the quorum value; no config / I/O / time
56
+ * dependence. Used by both `aggregateVerdict` (writes the artifact)
57
+ * and `runner.runReview` (emits the `review_finished` telemetry
58
+ * with the reason for downstream alerting).
59
+ *
60
+ * Verdict rules, in priority order:
61
+ * 1. Any completed critic vetoes → CHANGES_REQUESTED, reason `veto`.
62
+ * 2. completedCount >= quorum → majority verdict among completed
63
+ * critics. Ties favor CHANGES_REQUESTED (conservative).
64
+ * 3. completedCount < quorum → CHANGES_REQUESTED, reason
65
+ * `quorum_unmet`. (The veto-preserves-quorum semantics in (1)
66
+ * ensures a single rigorous critic can still block even when
67
+ * quorum is unmet — §11 invariant.)
68
+ *
69
+ * The "veto wins over quorum_unmet" precedence is the key §11
70
+ * property: an outage that knocks out two critics doesn't paralyze
71
+ * the third critic's BLOCKER finding.
72
+ */
73
+ export declare function quorumAggregateVerdict(results: CriticResult[], blockingSeverities: ReviewSeverity[], quorum: number): QuorumAggregateOutcome;
74
+ export interface WriteResult {
75
+ jsonPath: string;
76
+ markdownPath: string | null;
77
+ }
78
+ export declare function writeArtifacts(loaded: LoadedConfig, artifact: ReviewArtifact): Promise<WriteResult>;
79
+ export declare function readArtifact(loaded: LoadedConfig, commit: string): Promise<ReviewArtifact | null>;
80
+ export declare function renderMarkdown(artifact: ReviewArtifact): string;
81
+ export declare function writePending(loaded: LoadedConfig, inputs: Omit<AggregateInputs, "criticResults" | "status">): Promise<WriteResult>;
82
+ export interface AcquireLockResult {
83
+ acquired: boolean;
84
+ lockPath: string;
85
+ }
86
+ export declare function acquireCommitLock(loaded: LoadedConfig, commit: string): Promise<AcquireLockResult>;
87
+ export declare function releaseCommitLock(lockPath: string): void;
88
+ //# sourceMappingURL=report.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../src/report.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAOvD,OAAO,EAGL,KAAK,YAAY,EACjB,KAAK,cAAc,EAEnB,KAAK,cAAc,EACnB,KAAK,aAAa,EACnB,MAAM,gCAAgC,CAAC;AAExC,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,YAAY,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,YAAY,EAAE,CAAC;IAC9B,MAAM,EAAE,cAAc,CAAC,QAAQ,CAAC,CAAC;IACjC,SAAS,EAAE,MAAM,CAAC;IAOlB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAUD,wBAAgB,cAAc,CAAC,MAAM,EAAE,eAAe,GAAG,cAAc,CA0BtE;AA6ED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,YAAY,GAAG,OAAO,CAE1D;AAED;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAC9B,CAAC,EAAE,YAAY,EACf,kBAAkB,EAAE,cAAc,EAAE,GACnC,OAAO,CAMT;AAED,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,aAAa,CAAC;IACvB;;;;;;;;;;;;;OAaG;IACH,MAAM,EAAE,UAAU,GAAG,MAAM,GAAG,cAAc,CAAC;IAI7C,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,YAAY,EAAE,EACvB,kBAAkB,EAAE,cAAc,EAAE,EACpC,MAAM,EAAE,MAAM,GACb,sBAAsB,CAqCxB;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;IAEjB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAeD,wBAAsB,cAAc,CAClC,MAAM,EAAE,YAAY,EACpB,QAAQ,EAAE,cAAc,GACvB,OAAO,CAAC,WAAW,CAAC,CAkBtB;AAED,wBAAsB,YAAY,CAChC,MAAM,EAAE,YAAY,EACpB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAWhC;AAED,wBAAgB,cAAc,CAAC,QAAQ,EAAE,cAAc,GAAG,MAAM,CA+F/D;AAED,wBAAsB,YAAY,CAChC,MAAM,EAAE,YAAY,EACpB,MAAM,EAAE,IAAI,CAAC,eAAe,EAAE,eAAe,GAAG,QAAQ,CAAC,GACxD,OAAO,CAAC,WAAW,CAAC,CAOtB;AAGD,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,YAAY,EACpB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,iBAAiB,CAAC,CAa5B;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAQxD"}
package/dist/report.js ADDED
@@ -0,0 +1,376 @@
1
+ import { existsSync, mkdirSync, readFileSync, unlinkSync, writeFileSync } from "node:fs";
2
+ import { artifactJsonPath, artifactLockPath, artifactMarkdownPath, resolveArtifactDir, } from "./paths.js";
3
+ import { parseReviewArtifact, REVIEW_SEVERITIES, } from "@momentiq/dark-factory-schemas";
4
+ const SEVERITY_RANK = {
5
+ blocker: 0,
6
+ high: 1,
7
+ medium: 2,
8
+ low: 3,
9
+ note: 4,
10
+ };
11
+ export function buildAggregate(inputs) {
12
+ const { loaded, commit, parent, range, diffHash, criticResults, status, createdAt, quorumOverride } = inputs;
13
+ const repoName = loaded.repoRoot.split("/").pop() ?? loaded.repoRoot;
14
+ const aggregationPolicy = loaded.config.aggregation.policy;
15
+ const blockingSeverities = loaded.config.aggregation.blockingSeverities;
16
+ let gateVerdict;
17
+ if (status === "complete") {
18
+ gateVerdict = aggregateVerdict(criticResults, blockingSeverities, loaded, quorumOverride);
19
+ }
20
+ const artifact = {
21
+ version: 2,
22
+ status,
23
+ repo: repoName,
24
+ commit,
25
+ parent,
26
+ range,
27
+ diffHash,
28
+ artifactScope: loaded.config.git.artifactScope,
29
+ aggregationPolicy,
30
+ criticResults,
31
+ createdAt,
32
+ ...(gateVerdict !== undefined ? { gateVerdict } : {}),
33
+ };
34
+ return artifact;
35
+ }
36
+ function aggregateVerdict(results, blockingSeverities, loaded, quorumOverride) {
37
+ // Cycle 322.3 — dispatch on policy. `min-complete-quorum` uses the
38
+ // quorum aggregator below; everything else falls through to the
39
+ // existing 322.2 `required`-flag-threaded `block-if-any` path.
40
+ if (loaded.config.aggregation.policy === "min-complete-quorum") {
41
+ // Cycle 322.7 — profile.quorum (when supplied) overrides root
42
+ // aggregation.quorum. Without this, a 1-of-2 local profile with
43
+ // one APPROVED + one ERRORED critic would have `gate --profile local`
44
+ // pass (uses quorumOverride=1) but `agent-review status/show`
45
+ // report CHANGES_REQUESTED (uses root quorum=2). Codex P2 caught
46
+ // this divergence on PR #1468.
47
+ const quorum = quorumOverride ?? loaded.config.aggregation.quorum;
48
+ // Schema validation guarantees `quorum` is set when the policy
49
+ // is `min-complete-quorum`; the defensive fallback to 2 is for
50
+ // hand-constructed configs in tests (the parser would already
51
+ // have rejected a real on-disk config without quorum).
52
+ return quorumAggregateVerdict(results, blockingSeverities, quorum ?? 2).verdict;
53
+ }
54
+ // Cycle 322.2 Component 4 — `required` flag threading.
55
+ //
56
+ // Optional (`required: false`) critics produce findings that appear in
57
+ // the artifact for inspection but cannot flip the aggregate verdict to
58
+ // CHANGES_REQUESTED. This implements the §11 "shadow mode" semantics
59
+ // correctly: an optional critic must produce inspectable findings AND
60
+ // disagreement metrics without blocking — anything else makes "shadow
61
+ // mode" a name only.
62
+ //
63
+ // Below-the-line: `required: false` critics are still inspected for
64
+ // disagreement metrics (computed in agent-review-stats), so the
65
+ // calibration window data accumulates even though the gate doesn't
66
+ // block on them.
67
+ const requiredIds = new Set(loaded.config.critics.filter((c) => c.required).map((c) => c.id));
68
+ for (const r of results) {
69
+ if (requiredIds.has(r.criticId) && (r.status === "error" || r.status === "running" || r.status === "pending")) {
70
+ return "CHANGES_REQUESTED";
71
+ }
72
+ if (r.status !== "complete")
73
+ continue;
74
+ // Optional critics' verdicts / human-judgment / blocking findings are
75
+ // informational only — they cannot flip the aggregate.
76
+ if (!requiredIds.has(r.criticId))
77
+ continue;
78
+ if (r.verdict === "CHANGES_REQUESTED")
79
+ return "CHANGES_REQUESTED";
80
+ if (r.requiresHumanJudgment)
81
+ return "CHANGES_REQUESTED";
82
+ if (hasBlockingFinding(r.findings, blockingSeverities))
83
+ return "CHANGES_REQUESTED";
84
+ }
85
+ return "APPROVED";
86
+ }
87
+ function hasBlockingFinding(findings, blockingSeverities) {
88
+ return findings.some((f) => blockingSeverities.includes(f.severity));
89
+ }
90
+ // ---------------------------------------------------------------------------
91
+ // Cycle 322.3 — `min-complete-quorum` aggregation.
92
+ //
93
+ // Shared with `gate.ts:evaluateQuorumCriticResults` via these
94
+ // exports so the verdict and the gate-block enforcement cannot
95
+ // drift: any change to the "what counts as a veto" or "what counts
96
+ // as completed" semantics lands in one place.
97
+ //
98
+ // Vocabulary:
99
+ // - **Completed**: `status === "complete"` AND has a verdict
100
+ // (i.e., not pending/running/error). The schema enforces verdict
101
+ // presence on completed results, so this is a single field check.
102
+ // - **Vetoer**: a completed critic that the gate must treat as
103
+ // blocking regardless of vote count. The veto condition is the
104
+ // same as the block-if-any single-critic block trigger:
105
+ // CHANGES_REQUESTED verdict, OR `requiresHumanJudgment`, OR a
106
+ // blocking-severity finding.
107
+ /**
108
+ * Cycle 322.3 — does this critic count toward the quorum?
109
+ *
110
+ * Exported for `gate.ts` so the gate evaluator and the verdict
111
+ * computation see the same definition of "completed".
112
+ */
113
+ export function isCriticCompleted(r) {
114
+ return r.status === "complete";
115
+ }
116
+ /**
117
+ * Cycle 322.3 — does this completed critic veto the gate?
118
+ *
119
+ * Manifesto §11 "first principles veto": any rigorous critic with a
120
+ * blocking finding (or `requiresHumanJudgment`, or a
121
+ * CHANGES_REQUESTED verdict) blocks the gate regardless of how many
122
+ * other critics approved. Returns `false` for non-completed critics
123
+ * — only a completed critic can veto.
124
+ */
125
+ export function criticVetoesGate(r, blockingSeverities) {
126
+ if (!isCriticCompleted(r))
127
+ return false;
128
+ if (r.verdict === "CHANGES_REQUESTED")
129
+ return true;
130
+ if (r.requiresHumanJudgment)
131
+ return true;
132
+ if (hasBlockingFinding(r.findings, blockingSeverities))
133
+ return true;
134
+ return false;
135
+ }
136
+ /**
137
+ * Cycle 322.3 — compute the aggregate verdict under
138
+ * `min-complete-quorum`. Pure: takes only the critic results, the
139
+ * blocking severities, and the quorum value; no config / I/O / time
140
+ * dependence. Used by both `aggregateVerdict` (writes the artifact)
141
+ * and `runner.runReview` (emits the `review_finished` telemetry
142
+ * with the reason for downstream alerting).
143
+ *
144
+ * Verdict rules, in priority order:
145
+ * 1. Any completed critic vetoes → CHANGES_REQUESTED, reason `veto`.
146
+ * 2. completedCount >= quorum → majority verdict among completed
147
+ * critics. Ties favor CHANGES_REQUESTED (conservative).
148
+ * 3. completedCount < quorum → CHANGES_REQUESTED, reason
149
+ * `quorum_unmet`. (The veto-preserves-quorum semantics in (1)
150
+ * ensures a single rigorous critic can still block even when
151
+ * quorum is unmet — §11 invariant.)
152
+ *
153
+ * The "veto wins over quorum_unmet" precedence is the key §11
154
+ * property: an outage that knocks out two critics doesn't paralyze
155
+ * the third critic's BLOCKER finding.
156
+ */
157
+ export function quorumAggregateVerdict(results, blockingSeverities, quorum) {
158
+ const completed = results.filter(isCriticCompleted);
159
+ const vetoer = completed.find((r) => criticVetoesGate(r, blockingSeverities));
160
+ if (vetoer) {
161
+ return {
162
+ verdict: "CHANGES_REQUESTED",
163
+ reason: "veto",
164
+ completedCount: completed.length,
165
+ totalCount: results.length,
166
+ };
167
+ }
168
+ if (completed.length < quorum) {
169
+ return {
170
+ verdict: "CHANGES_REQUESTED",
171
+ reason: "quorum_unmet",
172
+ completedCount: completed.length,
173
+ totalCount: results.length,
174
+ };
175
+ }
176
+ // Quorum met and no veto — vote the majority of completed critics.
177
+ // Without veto, every completed critic has APPROVED OR (no verdict
178
+ // — schema impossible, but defensive). Count APPROVED vs other.
179
+ const approveCount = completed.filter((r) => r.verdict === "APPROVED").length;
180
+ const changesCount = completed.length - approveCount;
181
+ // Ties favor CHANGES_REQUESTED (conservative). With 0 changes, all
182
+ // approved → APPROVED. With any changes >= approveCount → CHANGES_REQUESTED.
183
+ // (The veto path above caught CHANGES_REQUESTED via vetoer, so
184
+ // changesCount in practice will be 0 here unless a critic returned
185
+ // CHANGES_REQUESTED with no blocking findings + no requiresHumanJudgment
186
+ // — schema-legal but unusual; we still honor the verdict.)
187
+ const verdict = approveCount > changesCount ? "APPROVED" : "CHANGES_REQUESTED";
188
+ return {
189
+ verdict,
190
+ reason: "majority",
191
+ completedCount: completed.length,
192
+ totalCount: results.length,
193
+ };
194
+ }
195
+ // JSON is the authoritative gate-input; markdown is a presentation artifact.
196
+ // The write order is JSON-first, markdown best-effort, so a broken markdown
197
+ // path (e.g., a previously-created directory at the markdown filename) cannot
198
+ // turn a successful review into a terminal error via the runner's catch path,
199
+ // or leave a pending JSON stuck on disk via writePending. Without best-effort
200
+ // markdown handling, the runner's recovery either overwrites the completed
201
+ // JSON with status=error (for success-path failures) or skips the recovery
202
+ // entirely (for partial-write failures during writePending).
203
+ //
204
+ // `markdownPath` is `null` when markdown render or write fails so the
205
+ // degradation is observable to callers and the CLI — silently swallowing
206
+ // the failure while still returning the path would hide artifact-write
207
+ // failures from operators.
208
+ export async function writeArtifacts(loaded, artifact) {
209
+ const dir = await resolveArtifactDir(loaded);
210
+ mkdirSync(dir, { recursive: true });
211
+ const jsonPath = artifactJsonPath(dir, artifact.commit);
212
+ const markdownPath = artifactMarkdownPath(dir, artifact.commit);
213
+ writeFileSync(jsonPath, `${JSON.stringify(artifact, null, 2)}\n`, "utf8");
214
+ let writtenMarkdownPath = null;
215
+ try {
216
+ writeFileSync(markdownPath, renderMarkdown(artifact), "utf8");
217
+ writtenMarkdownPath = markdownPath;
218
+ }
219
+ catch (err) {
220
+ // Surface the degradation on stderr so operators see it instead of
221
+ // having a silent failure with a returned-but-empty markdown path.
222
+ process.stderr.write(`agent-review: markdown render/write failed for ${markdownPath} (${err.message}); JSON artifact at ${jsonPath} is authoritative.\n`);
223
+ }
224
+ return { jsonPath, markdownPath: writtenMarkdownPath };
225
+ }
226
+ export async function readArtifact(loaded, commit) {
227
+ const dir = await resolveArtifactDir(loaded);
228
+ const path = artifactJsonPath(dir, commit);
229
+ if (!existsSync(path))
230
+ return null;
231
+ let raw;
232
+ try {
233
+ raw = JSON.parse(readFileSync(path, "utf8"));
234
+ }
235
+ catch {
236
+ return null;
237
+ }
238
+ return parseReviewArtifact(raw, loaded.config.aggregation.blockingSeverities);
239
+ }
240
+ export function renderMarkdown(artifact) {
241
+ const lines = [];
242
+ lines.push(`# Local Critic Review — ${artifact.commit.slice(0, 12)}`);
243
+ lines.push("");
244
+ lines.push(`- **Status:** ${artifact.status}`);
245
+ lines.push(`- **Verdict:** ${artifact.gateVerdict ?? "(pending)"}`);
246
+ lines.push(`- **Range:** ${artifact.range}`);
247
+ lines.push(`- **Diff hash:** ${artifact.diffHash}`);
248
+ lines.push(`- **Aggregation:** ${artifact.aggregationPolicy}`);
249
+ lines.push(`- **Artifact scope:** ${artifact.artifactScope}`);
250
+ lines.push(`- **Created at:** ${artifact.createdAt}`);
251
+ if (artifact.bypass) {
252
+ lines.push(`- **Bypass:** ${artifact.bypass.reason} (at ${artifact.bypass.at})`);
253
+ }
254
+ lines.push("");
255
+ for (const result of artifact.criticResults) {
256
+ lines.push(`## Critic: ${result.criticId} (${result.reviewer.name})`);
257
+ lines.push("");
258
+ lines.push(`- **Adapter:** ${result.reviewer.adapter}`);
259
+ lines.push(`- **Model:** ${result.reviewer.model.id}`);
260
+ lines.push(`- **Runtime:** ${result.reviewer.runtime}`);
261
+ if (result.reviewer.agentId)
262
+ lines.push(`- **Agent ID:** ${result.reviewer.agentId}`);
263
+ if (result.reviewer.runId)
264
+ lines.push(`- **Run ID:** ${result.reviewer.runId}`);
265
+ lines.push(`- **Status:** ${result.status}`);
266
+ if (result.verdict)
267
+ lines.push(`- **Verdict:** ${result.verdict}`);
268
+ lines.push(`- **Confidence:** ${result.confidence}`);
269
+ if (result.requiresHumanJudgment)
270
+ lines.push(`- **Requires human judgment:** yes`);
271
+ if (typeof result.durationMs === "number") {
272
+ lines.push(`- **Duration:** ${result.durationMs} ms`);
273
+ }
274
+ if (result.error) {
275
+ lines.push(`- **Error:** ${result.error.message}${result.error.retryable ? " (retryable)" : ""}`);
276
+ // Cycle 322.1 — surface the SDK-supplied error code and total
277
+ // retries used so a reader can immediately tell whether the
278
+ // failure was a transient upstream outage (`code:
279
+ // capacity_exceeded, retries: 2`) or a permanent
280
+ // misconfiguration (`code: invalid_api_key, retries: 0`).
281
+ if (result.error.code) {
282
+ lines.push(`- **Error code:** \`${result.error.code}\``);
283
+ }
284
+ if (typeof result.error.retryCount === "number" && result.error.retryCount > 0) {
285
+ lines.push(`- **Retries used:** ${result.error.retryCount}`);
286
+ }
287
+ if (result.error.rawSamplePath) {
288
+ lines.push(`- **Raw sample:** ${result.error.rawSamplePath}`);
289
+ }
290
+ }
291
+ if (result.summary) {
292
+ lines.push("");
293
+ lines.push("### Summary");
294
+ lines.push("");
295
+ lines.push(result.summary);
296
+ }
297
+ lines.push("");
298
+ lines.push("### Findings");
299
+ if (result.findings.length === 0) {
300
+ lines.push("");
301
+ lines.push("_No findings._");
302
+ }
303
+ else {
304
+ const sorted = [...result.findings].sort((a, b) => SEVERITY_RANK[a.severity] - SEVERITY_RANK[b.severity]);
305
+ for (const sev of REVIEW_SEVERITIES) {
306
+ const subset = sorted.filter((f) => f.severity === sev);
307
+ if (subset.length === 0)
308
+ continue;
309
+ lines.push("");
310
+ lines.push(`#### ${sev.toUpperCase()} (${subset.length})`);
311
+ for (const f of subset) {
312
+ lines.push("");
313
+ const tag = f.manifestoSection ? ` ${f.manifestoSection}` : "";
314
+ lines.push(`- **${f.category}${tag}** — \`${f.file ?? "(no file)"}\`${f.line !== undefined ? `:${f.line}` : ""}${f.symbol ? ` (\`${f.symbol}\`)` : ""}`);
315
+ lines.push(` - Evidence: ${f.evidence}`);
316
+ lines.push(` - Impact: ${f.impact}`);
317
+ lines.push(` - Required fix: ${f.requiredFix}`);
318
+ }
319
+ }
320
+ }
321
+ lines.push("");
322
+ lines.push("### Validation evidence consumed");
323
+ if (result.validation.qualityGateResults.length === 0) {
324
+ lines.push("");
325
+ lines.push("_No quality-gate evidence consumed._");
326
+ }
327
+ else {
328
+ lines.push("");
329
+ lines.push("| Command | Exit | Duration |");
330
+ lines.push("|---------|------|----------|");
331
+ for (const r of result.validation.qualityGateResults) {
332
+ lines.push(`| ${r.command} | ${r.exitCode} | ${r.durationMs} ms |`);
333
+ }
334
+ }
335
+ if (result.validation.qualityGatesMissing.length > 0) {
336
+ lines.push("");
337
+ lines.push(`**Missing required gates:** ${result.validation.qualityGatesMissing.join(", ")}`);
338
+ }
339
+ lines.push("");
340
+ }
341
+ return `${lines.join("\n")}\n`;
342
+ }
343
+ export async function writePending(loaded, inputs) {
344
+ const artifact = buildAggregate({
345
+ ...inputs,
346
+ criticResults: [],
347
+ status: "pending",
348
+ });
349
+ return writeArtifacts(loaded, artifact);
350
+ }
351
+ export async function acquireCommitLock(loaded, commit) {
352
+ const dir = await resolveArtifactDir(loaded);
353
+ mkdirSync(dir, { recursive: true });
354
+ const lockPath = artifactLockPath(dir, commit);
355
+ if (existsSync(lockPath)) {
356
+ return { acquired: false, lockPath };
357
+ }
358
+ try {
359
+ writeFileSync(lockPath, `${process.pid}\n${new Date().toISOString()}\n`, { flag: "wx" });
360
+ return { acquired: true, lockPath };
361
+ }
362
+ catch {
363
+ return { acquired: false, lockPath };
364
+ }
365
+ }
366
+ export function releaseCommitLock(lockPath) {
367
+ try {
368
+ if (existsSync(lockPath)) {
369
+ unlinkSync(lockPath);
370
+ }
371
+ }
372
+ catch {
373
+ // best-effort
374
+ }
375
+ }
376
+ //# sourceMappingURL=report.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report.js","sourceRoot":"","sources":["../src/report.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAGzF,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,oBAAoB,EACpB,kBAAkB,GACnB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,mBAAmB,EACnB,iBAAiB,GAMlB,MAAM,gCAAgC,CAAC;AAoBxC,MAAM,aAAa,GAAmC;IACpD,OAAO,EAAE,CAAC;IACV,IAAI,EAAE,CAAC;IACP,MAAM,EAAE,CAAC;IACT,GAAG,EAAE,CAAC;IACN,IAAI,EAAE,CAAC;CACR,CAAC;AAEF,MAAM,UAAU,cAAc,CAAC,MAAuB;IACpD,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,EAAE,SAAS,EAAE,cAAc,EAAE,GAAG,MAAM,CAAC;IAC7G,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,MAAM,CAAC,QAAQ,CAAC;IACrE,MAAM,iBAAiB,GAAG,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC;IAC3D,MAAM,kBAAkB,GAAG,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,kBAAkB,CAAC;IAExE,IAAI,WAAsC,CAAC;IAC3C,IAAI,MAAM,KAAK,UAAU,EAAE,CAAC;QAC1B,WAAW,GAAG,gBAAgB,CAAC,aAAa,EAAE,kBAAkB,EAAE,MAAM,EAAE,cAAc,CAAC,CAAC;IAC5F,CAAC;IAED,MAAM,QAAQ,GAAmB;QAC/B,OAAO,EAAE,CAAC;QACV,MAAM;QACN,IAAI,EAAE,QAAQ;QACd,MAAM;QACN,MAAM;QACN,KAAK;QACL,QAAQ;QACR,aAAa,EAAE,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,aAAa;QAC9C,iBAAiB;QACjB,aAAa;QACb,SAAS;QACT,GAAG,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACtD,CAAC;IACF,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,gBAAgB,CACvB,OAAuB,EACvB,kBAAoC,EACpC,MAAoB,EACpB,cAAuB;IAEvB,mEAAmE;IACnE,gEAAgE;IAChE,+DAA+D;IAC/D,IAAI,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,KAAK,qBAAqB,EAAE,CAAC;QAC/D,8DAA8D;QAC9D,gEAAgE;QAChE,sEAAsE;QACtE,8DAA8D;QAC9D,iEAAiE;QACjE,+BAA+B;QAC/B,MAAM,MAAM,GAAG,cAAc,IAAI,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC;QAClE,+DAA+D;QAC/D,+DAA+D;QAC/D,8DAA8D;QAC9D,uDAAuD;QACvD,OAAO,sBAAsB,CAAC,OAAO,EAAE,kBAAkB,EAAE,MAAM,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;IAClF,CAAC;IAED,uDAAuD;IACvD,EAAE;IACF,uEAAuE;IACvE,uEAAuE;IACvE,qEAAqE;IACrE,sEAAsE;IACtE,sEAAsE;IACtE,qBAAqB;IACrB,EAAE;IACF,oEAAoE;IACpE,gEAAgE;IAChE,mEAAmE;IACnE,iBAAiB;IACjB,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC9F,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,IAAI,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,KAAK,OAAO,IAAI,CAAC,CAAC,MAAM,KAAK,SAAS,IAAI,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,EAAE,CAAC;YAC9G,OAAO,mBAAmB,CAAC;QAC7B,CAAC;QACD,IAAI,CAAC,CAAC,MAAM,KAAK,UAAU;YAAE,SAAS;QACtC,sEAAsE;QACtE,uDAAuD;QACvD,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC;YAAE,SAAS;QAC3C,IAAI,CAAC,CAAC,OAAO,KAAK,mBAAmB;YAAE,OAAO,mBAAmB,CAAC;QAClE,IAAI,CAAC,CAAC,qBAAqB;YAAE,OAAO,mBAAmB,CAAC;QACxD,IAAI,kBAAkB,CAAC,CAAC,CAAC,QAAQ,EAAE,kBAAkB,CAAC;YAAE,OAAO,mBAAmB,CAAC;IACrF,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,SAAS,kBAAkB,CAAC,QAAyB,EAAE,kBAAoC;IACzF,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;AACvE,CAAC;AAED,8EAA8E;AAC9E,mDAAmD;AACnD,EAAE;AACF,8DAA8D;AAC9D,+DAA+D;AAC/D,mEAAmE;AACnE,8CAA8C;AAC9C,EAAE;AACF,cAAc;AACd,+DAA+D;AAC/D,qEAAqE;AACrE,sEAAsE;AACtE,iEAAiE;AACjE,mEAAmE;AACnE,4DAA4D;AAC5D,kEAAkE;AAClE,iCAAiC;AAEjC;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAC,CAAe;IAC/C,OAAO,CAAC,CAAC,MAAM,KAAK,UAAU,CAAC;AACjC,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,gBAAgB,CAC9B,CAAe,EACf,kBAAoC;IAEpC,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IACxC,IAAI,CAAC,CAAC,OAAO,KAAK,mBAAmB;QAAE,OAAO,IAAI,CAAC;IACnD,IAAI,CAAC,CAAC,qBAAqB;QAAE,OAAO,IAAI,CAAC;IACzC,IAAI,kBAAkB,CAAC,CAAC,CAAC,QAAQ,EAAE,kBAAkB,CAAC;QAAE,OAAO,IAAI,CAAC;IACpE,OAAO,KAAK,CAAC;AACf,CAAC;AA0BD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,UAAU,sBAAsB,CACpC,OAAuB,EACvB,kBAAoC,EACpC,MAAc;IAEd,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;IACpD,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,gBAAgB,CAAC,CAAC,EAAE,kBAAkB,CAAC,CAAC,CAAC;IAC9E,IAAI,MAAM,EAAE,CAAC;QACX,OAAO;YACL,OAAO,EAAE,mBAAmB;YAC5B,MAAM,EAAE,MAAM;YACd,cAAc,EAAE,SAAS,CAAC,MAAM;YAChC,UAAU,EAAE,OAAO,CAAC,MAAM;SAC3B,CAAC;IACJ,CAAC;IACD,IAAI,SAAS,CAAC,MAAM,GAAG,MAAM,EAAE,CAAC;QAC9B,OAAO;YACL,OAAO,EAAE,mBAAmB;YAC5B,MAAM,EAAE,cAAc;YACtB,cAAc,EAAE,SAAS,CAAC,MAAM;YAChC,UAAU,EAAE,OAAO,CAAC,MAAM;SAC3B,CAAC;IACJ,CAAC;IACD,mEAAmE;IACnE,mEAAmE;IACnE,gEAAgE;IAChE,MAAM,YAAY,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,UAAU,CAAC,CAAC,MAAM,CAAC;IAC9E,MAAM,YAAY,GAAG,SAAS,CAAC,MAAM,GAAG,YAAY,CAAC;IACrD,mEAAmE;IACnE,6EAA6E;IAC7E,+DAA+D;IAC/D,mEAAmE;IACnE,yEAAyE;IACzE,2DAA2D;IAC3D,MAAM,OAAO,GAAkB,YAAY,GAAG,YAAY,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,mBAAmB,CAAC;IAC9F,OAAO;QACL,OAAO;QACP,MAAM,EAAE,UAAU;QAClB,cAAc,EAAE,SAAS,CAAC,MAAM;QAChC,UAAU,EAAE,OAAO,CAAC,MAAM;KAC3B,CAAC;AACJ,CAAC;AAQD,6EAA6E;AAC7E,4EAA4E;AAC5E,8EAA8E;AAC9E,8EAA8E;AAC9E,8EAA8E;AAC9E,2EAA2E;AAC3E,2EAA2E;AAC3E,6DAA6D;AAC7D,EAAE;AACF,sEAAsE;AACtE,yEAAyE;AACzE,uEAAuE;AACvE,2BAA2B;AAC3B,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,MAAoB,EACpB,QAAwB;IAExB,MAAM,GAAG,GAAG,MAAM,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAC7C,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACpC,MAAM,QAAQ,GAAG,gBAAgB,CAAC,GAAG,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IACxD,MAAM,YAAY,GAAG,oBAAoB,CAAC,GAAG,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IAChE,aAAa,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC1E,IAAI,mBAAmB,GAAkB,IAAI,CAAC;IAC9C,IAAI,CAAC;QACH,aAAa,CAAC,YAAY,EAAE,cAAc,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,CAAC;QAC9D,mBAAmB,GAAG,YAAY,CAAC;IACrC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,mEAAmE;QACnE,mEAAmE;QACnE,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,kDAAkD,YAAY,KAAM,GAAa,CAAC,OAAO,uBAAuB,QAAQ,sBAAsB,CAC/I,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,mBAAmB,EAAE,CAAC;AACzD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,MAAoB,EACpB,MAAc;IAEd,MAAM,GAAG,GAAG,MAAM,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAC7C,MAAM,IAAI,GAAG,gBAAgB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAC3C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACnC,IAAI,GAAY,CAAC;IACjB,IAAI,CAAC;QACH,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;IAC/C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,mBAAmB,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,kBAAkB,CAAC,CAAC;AAChF,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,QAAwB;IACrD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,CAAC,IAAI,CAAC,2BAA2B,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;IACtE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,iBAAiB,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IAC/C,KAAK,CAAC,IAAI,CAAC,kBAAkB,QAAQ,CAAC,WAAW,IAAI,WAAW,EAAE,CAAC,CAAC;IACpE,KAAK,CAAC,IAAI,CAAC,gBAAgB,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;IAC7C,KAAK,CAAC,IAAI,CAAC,oBAAoB,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC;IACpD,KAAK,CAAC,IAAI,CAAC,sBAAsB,QAAQ,CAAC,iBAAiB,EAAE,CAAC,CAAC;IAC/D,KAAK,CAAC,IAAI,CAAC,yBAAyB,QAAQ,CAAC,aAAa,EAAE,CAAC,CAAC;IAC9D,KAAK,CAAC,IAAI,CAAC,qBAAqB,QAAQ,CAAC,SAAS,EAAE,CAAC,CAAC;IACtD,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;QACpB,KAAK,CAAC,IAAI,CAAC,iBAAiB,QAAQ,CAAC,MAAM,CAAC,MAAM,QAAQ,QAAQ,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,CAAC;IACnF,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,MAAM,MAAM,IAAI,QAAQ,CAAC,aAAa,EAAE,CAAC;QAC5C,KAAK,CAAC,IAAI,CAAC,cAAc,MAAM,CAAC,QAAQ,KAAK,MAAM,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,CAAC;QACtE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,kBAAkB,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;QACxD,KAAK,CAAC,IAAI,CAAC,gBAAgB,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;QACvD,KAAK,CAAC,IAAI,CAAC,kBAAkB,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;QACxD,IAAI,MAAM,CAAC,QAAQ,CAAC,OAAO;YAAE,KAAK,CAAC,IAAI,CAAC,mBAAmB,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;QACtF,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK;YAAE,KAAK,CAAC,IAAI,CAAC,iBAAiB,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;QAChF,KAAK,CAAC,IAAI,CAAC,iBAAiB,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QAC7C,IAAI,MAAM,CAAC,OAAO;YAAE,KAAK,CAAC,IAAI,CAAC,kBAAkB,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;QACnE,KAAK,CAAC,IAAI,CAAC,qBAAqB,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;QACrD,IAAI,MAAM,CAAC,qBAAqB;YAAE,KAAK,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;QACnF,IAAI,OAAO,MAAM,CAAC,UAAU,KAAK,QAAQ,EAAE,CAAC;YAC1C,KAAK,CAAC,IAAI,CAAC,mBAAmB,MAAM,CAAC,UAAU,KAAK,CAAC,CAAC;QACxD,CAAC;QACD,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YACjB,KAAK,CAAC,IAAI,CAAC,gBAAgB,MAAM,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAClG,8DAA8D;YAC9D,4DAA4D;YAC5D,kDAAkD;YAClD,iDAAiD;YACjD,0DAA0D;YAC1D,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;gBACtB,KAAK,CAAC,IAAI,CAAC,uBAAuB,MAAM,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC;YAC3D,CAAC;YACD,IAAI,OAAO,MAAM,CAAC,KAAK,CAAC,UAAU,KAAK,QAAQ,IAAI,MAAM,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,EAAE,CAAC;gBAC/E,KAAK,CAAC,IAAI,CAAC,uBAAuB,MAAM,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC;YAC/D,CAAC;YACD,IAAI,MAAM,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC;gBAC/B,KAAK,CAAC,IAAI,CAAC,qBAAqB,MAAM,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC,CAAC;YAChE,CAAC;QACH,CAAC;QACD,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACf,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAC1B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACf,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC7B,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC3B,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACjC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACf,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAC/B,CAAC;aAAM,CAAC;YACN,MAAM,MAAM,GAAG,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;YAC1G,KAAK,MAAM,GAAG,IAAI,iBAAiB,EAAE,CAAC;gBACpC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,GAAG,CAAC,CAAC;gBACxD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;oBAAE,SAAS;gBAClC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACf,KAAK,CAAC,IAAI,CAAC,QAAQ,GAAG,CAAC,WAAW,EAAE,KAAK,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;gBAC3D,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;oBACvB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;oBACf,MAAM,GAAG,GAAG,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC/D,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,QAAQ,GAAG,GAAG,UAAU,CAAC,CAAC,IAAI,IAAI,WAAW,KAAK,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBACzJ,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;oBAC1C,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;oBACtC,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;gBACnD,CAAC;YACH,CAAC;QACH,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;QAC/C,IAAI,MAAM,CAAC,UAAU,CAAC,kBAAkB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACf,KAAK,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;QACrD,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACf,KAAK,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;YAC5C,KAAK,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;YAC5C,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,UAAU,CAAC,kBAAkB,EAAE,CAAC;gBACrD,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,MAAM,CAAC,CAAC,QAAQ,MAAM,CAAC,CAAC,UAAU,OAAO,CAAC,CAAC;YACtE,CAAC;QACH,CAAC;QACD,IAAI,MAAM,CAAC,UAAU,CAAC,mBAAmB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACf,KAAK,CAAC,IAAI,CAAC,+BAA+B,MAAM,CAAC,UAAU,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAChG,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IACD,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;AACjC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,MAAoB,EACpB,MAAyD;IAEzD,MAAM,QAAQ,GAAG,cAAc,CAAC;QAC9B,GAAG,MAAM;QACT,aAAa,EAAE,EAAE;QACjB,MAAM,EAAE,SAAS;KAClB,CAAC,CAAC;IACH,OAAO,cAAc,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;AAC1C,CAAC;AAQD,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,MAAoB,EACpB,MAAc;IAEd,MAAM,GAAG,GAAG,MAAM,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAC7C,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACpC,MAAM,QAAQ,GAAG,gBAAgB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAC/C,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzB,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;IACvC,CAAC;IACD,IAAI,CAAC;QACH,aAAa,CAAC,QAAQ,EAAE,GAAG,OAAO,CAAC,GAAG,KAAK,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QACzF,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IACtC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;IACvC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,QAAgB;IAChD,IAAI,CAAC;QACH,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YACzB,UAAU,CAAC,QAAQ,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,cAAc;IAChB,CAAC;AACH,CAAC"}
@@ -0,0 +1,30 @@
1
+ import type { LoadedConfig } from "./policy/config.js";
2
+ import type { AdapterRegistry } from "./adapters/critic.js";
3
+ import { type WriteResult } from "./report.js";
4
+ import type { TelemetrySink } from "./evidence/audit-trail.js";
5
+ import type { GateResult, ReviewArtifact, ReviewPacket } from "@momentiq/dark-factory-schemas";
6
+ export interface ReviewRunOptions {
7
+ loaded: LoadedConfig;
8
+ registry: AdapterRegistry;
9
+ ref?: string;
10
+ cwd?: string;
11
+ telemetry?: TelemetrySink;
12
+ signal?: AbortSignal;
13
+ profileName?: string;
14
+ }
15
+ export interface ReviewRunOutcome {
16
+ artifact: ReviewArtifact;
17
+ paths: WriteResult;
18
+ packet: ReviewPacket;
19
+ acquired: boolean;
20
+ }
21
+ export declare function runReview(options: ReviewRunOptions): Promise<ReviewRunOutcome>;
22
+ export interface GateRunOptions {
23
+ loaded: LoadedConfig;
24
+ commit: string;
25
+ cwd?: string;
26
+ telemetry?: TelemetrySink;
27
+ profileName?: string;
28
+ }
29
+ export declare function runCommitGate(options: GateRunOptions): Promise<GateResult>;
30
+ //# sourceMappingURL=runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,KAAK,EAAE,eAAe,EAAuB,MAAM,sBAAsB,CAAC;AAkBjF,OAAO,EAOL,KAAK,WAAW,EACjB,MAAM,aAAa,CAAC;AAIrB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,KAAK,EAGV,UAAU,EACV,cAAc,EACd,YAAY,EAEb,MAAM,gCAAgC,CAAC;AAExC,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,YAAY,CAAC;IACrB,QAAQ,EAAE,eAAe,CAAC;IAC1B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,aAAa,CAAC;IAC1B,MAAM,CAAC,EAAE,WAAW,CAAC;IAUrB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,cAAc,CAAC;IACzB,KAAK,EAAE,WAAW,CAAC;IACnB,MAAM,EAAE,YAAY,CAAC;IACrB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,wBAAsB,SAAS,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAwSpF;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,YAAY,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,aAAa,CAAC;IAkB1B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,wBAAsB,aAAa,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,UAAU,CAAC,CA2KhF"}