@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.
- package/LICENSE +201 -0
- package/README.md +150 -0
- package/dist/adapters/_shared.d.ts +45 -0
- package/dist/adapters/_shared.d.ts.map +1 -0
- package/dist/adapters/_shared.js +200 -0
- package/dist/adapters/_shared.js.map +1 -0
- package/dist/adapters/codex-sdk.d.ts +279 -0
- package/dist/adapters/codex-sdk.d.ts.map +1 -0
- package/dist/adapters/codex-sdk.js +930 -0
- package/dist/adapters/codex-sdk.js.map +1 -0
- package/dist/adapters/critic-result-schema.d.ts +215 -0
- package/dist/adapters/critic-result-schema.d.ts.map +1 -0
- package/dist/adapters/critic-result-schema.js +153 -0
- package/dist/adapters/critic-result-schema.js.map +1 -0
- package/dist/adapters/critic.d.ts +62 -0
- package/dist/adapters/critic.d.ts.map +1 -0
- package/dist/adapters/critic.js +79 -0
- package/dist/adapters/critic.js.map +1 -0
- package/dist/adapters/cursor-sdk.d.ts +153 -0
- package/dist/adapters/cursor-sdk.d.ts.map +1 -0
- package/dist/adapters/cursor-sdk.js +818 -0
- package/dist/adapters/cursor-sdk.js.map +1 -0
- package/dist/adapters/gemini-sdk.d.ts +113 -0
- package/dist/adapters/gemini-sdk.d.ts.map +1 -0
- package/dist/adapters/gemini-sdk.js +532 -0
- package/dist/adapters/gemini-sdk.js.map +1 -0
- package/dist/adapters/grok-direct-sdk.d.ts +148 -0
- package/dist/adapters/grok-direct-sdk.d.ts.map +1 -0
- package/dist/adapters/grok-direct-sdk.js +694 -0
- package/dist/adapters/grok-direct-sdk.js.map +1 -0
- package/dist/branch-protection/audit_branch_protection.py +759 -0
- package/dist/branch-protection/index.d.ts +25 -0
- package/dist/branch-protection/index.d.ts.map +1 -0
- package/dist/branch-protection/index.js +70 -0
- package/dist/branch-protection/index.js.map +1 -0
- package/dist/branch-protection/spec-default.yaml +314 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +581 -0
- package/dist/cli.js.map +1 -0
- package/dist/cycle-doc-validator/index.d.ts +43 -0
- package/dist/cycle-doc-validator/index.d.ts.map +1 -0
- package/dist/cycle-doc-validator/index.js +69 -0
- package/dist/cycle-doc-validator/index.js.map +1 -0
- package/dist/cycle-doc-validator/validate_cycle_doc.py +1260 -0
- package/dist/cycle-tracker-sync/attribute_pr_cycle_ref.py +384 -0
- package/dist/cycle-tracker-sync/index.d.ts +20 -0
- package/dist/cycle-tracker-sync/index.d.ts.map +1 -0
- package/dist/cycle-tracker-sync/index.js +71 -0
- package/dist/cycle-tracker-sync/index.js.map +1 -0
- package/dist/cycle-tracker-sync/sync_cycle_trackers.py +1093 -0
- package/dist/evidence/audit-trail.d.ts +59 -0
- package/dist/evidence/audit-trail.d.ts.map +1 -0
- package/dist/evidence/audit-trail.js +283 -0
- package/dist/evidence/audit-trail.js.map +1 -0
- package/dist/evidence/index.d.ts +4 -0
- package/dist/evidence/index.d.ts.map +1 -0
- package/dist/evidence/index.js +29 -0
- package/dist/evidence/index.js.map +1 -0
- package/dist/evidence/per-sha.d.ts +13 -0
- package/dist/evidence/per-sha.d.ts.map +1 -0
- package/dist/evidence/per-sha.js +97 -0
- package/dist/evidence/per-sha.js.map +1 -0
- package/dist/evidence/quality-gates.d.ts +19 -0
- package/dist/evidence/quality-gates.d.ts.map +1 -0
- package/dist/evidence/quality-gates.js +212 -0
- package/dist/evidence/quality-gates.js.map +1 -0
- package/dist/git.d.ts +40 -0
- package/dist/git.d.ts.map +1 -0
- package/dist/git.js +414 -0
- package/dist/git.js.map +1 -0
- package/dist/glob.d.ts +4 -0
- package/dist/glob.d.ts.map +1 -0
- package/dist/glob.js +99 -0
- package/dist/glob.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +33 -0
- package/dist/index.js.map +1 -0
- package/dist/paths.d.ts +12 -0
- package/dist/paths.d.ts.map +1 -0
- package/dist/paths.js +42 -0
- package/dist/paths.js.map +1 -0
- package/dist/policy/baseline.d.ts +15 -0
- package/dist/policy/baseline.d.ts.map +1 -0
- package/dist/policy/baseline.js +115 -0
- package/dist/policy/baseline.js.map +1 -0
- package/dist/policy/config.d.ts +64 -0
- package/dist/policy/config.d.ts.map +1 -0
- package/dist/policy/config.js +363 -0
- package/dist/policy/config.js.map +1 -0
- package/dist/policy/gate.d.ts +80 -0
- package/dist/policy/gate.d.ts.map +1 -0
- package/dist/policy/gate.js +1019 -0
- package/dist/policy/gate.js.map +1 -0
- package/dist/policy/index.d.ts +7 -0
- package/dist/policy/index.d.ts.map +1 -0
- package/dist/policy/index.js +14 -0
- package/dist/policy/index.js.map +1 -0
- package/dist/policy/merge-queue.d.ts +183 -0
- package/dist/policy/merge-queue.d.ts.map +1 -0
- package/dist/policy/merge-queue.js +310 -0
- package/dist/policy/merge-queue.js.map +1 -0
- package/dist/policy/profile.d.ts +98 -0
- package/dist/policy/profile.d.ts.map +1 -0
- package/dist/policy/profile.js +156 -0
- package/dist/policy/profile.js.map +1 -0
- package/dist/policy/tdd-classifier.d.ts +18 -0
- package/dist/policy/tdd-classifier.d.ts.map +1 -0
- package/dist/policy/tdd-classifier.js +79 -0
- package/dist/policy/tdd-classifier.js.map +1 -0
- package/dist/prompt.d.ts +13 -0
- package/dist/prompt.d.ts.map +1 -0
- package/dist/prompt.js +175 -0
- package/dist/prompt.js.map +1 -0
- package/dist/report.d.ts +88 -0
- package/dist/report.d.ts.map +1 -0
- package/dist/report.js +376 -0
- package/dist/report.js.map +1 -0
- package/dist/runner.d.ts +30 -0
- package/dist/runner.d.ts.map +1 -0
- package/dist/runner.js +456 -0
- package/dist/runner.js.map +1 -0
- package/dist/security.d.ts +2 -0
- package/dist/security.d.ts.map +1 -0
- package/dist/security.js +19 -0
- package/dist/security.js.map +1 -0
- package/dist/trusted-surface/rebind.d.ts +10 -0
- package/dist/trusted-surface/rebind.d.ts.map +1 -0
- package/dist/trusted-surface/rebind.js +154 -0
- package/dist/trusted-surface/rebind.js.map +1 -0
- 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
|
package/dist/cli.js.map
ADDED
|
@@ -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"}
|