@aipper/aiws 0.0.29 → 0.0.31
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/bin/aiws.js +2 -2
- package/dist/aiws-package.d.ts +4 -0
- package/dist/aiws-package.js +11 -0
- package/dist/aiws-package.js.map +1 -0
- package/dist/aiws-paths.d.ts +48 -0
- package/dist/aiws-paths.js +129 -0
- package/dist/aiws-paths.js.map +1 -0
- package/dist/backup.d.ts +27 -0
- package/dist/backup.js +125 -0
- package/dist/backup.js.map +1 -0
- package/dist/cli.d.ts +1 -0
- package/dist/cli.js +773 -0
- package/dist/cli.js.map +1 -0
- package/dist/codex-prompts.d.ts +17 -0
- package/dist/codex-prompts.js +49 -0
- package/dist/codex-prompts.js.map +1 -0
- package/dist/codex-skills.d.ts +17 -0
- package/dist/codex-skills.js +75 -0
- package/dist/codex-skills.js.map +1 -0
- package/dist/commands/change-advice.d.ts +25 -0
- package/dist/commands/change-advice.js +197 -0
- package/dist/commands/change-advice.js.map +1 -0
- package/dist/commands/change-evidence-command.d.ts +29 -0
- package/dist/commands/change-evidence-command.js +213 -0
- package/dist/commands/change-evidence-command.js.map +1 -0
- package/dist/commands/change-evidence-entry.d.ts +16 -0
- package/dist/commands/change-evidence-entry.js +35 -0
- package/dist/commands/change-evidence-entry.js.map +1 -0
- package/dist/commands/change-evidence.d.ts +108 -0
- package/dist/commands/change-evidence.js +341 -0
- package/dist/commands/change-evidence.js.map +1 -0
- package/dist/commands/change-finish.d.ts +71 -0
- package/dist/commands/change-finish.js +387 -0
- package/dist/commands/change-finish.js.map +1 -0
- package/dist/commands/change-git-status.d.ts +22 -0
- package/dist/commands/change-git-status.js +50 -0
- package/dist/commands/change-git-status.js.map +1 -0
- package/dist/commands/change-lifecycle-entry.d.ts +29 -0
- package/{src → dist}/commands/change-lifecycle-entry.js +21 -28
- package/dist/commands/change-lifecycle-entry.js.map +1 -0
- package/dist/commands/change-lifecycle.d.ts +56 -0
- package/dist/commands/change-lifecycle.js +211 -0
- package/dist/commands/change-lifecycle.js.map +1 -0
- package/dist/commands/change-metrics-command.d.ts +12 -0
- package/dist/commands/change-metrics-command.js +110 -0
- package/dist/commands/change-metrics-command.js.map +1 -0
- package/dist/commands/change-next-command.d.ts +18 -0
- package/dist/commands/change-next-command.js +138 -0
- package/dist/commands/change-next-command.js.map +1 -0
- package/dist/commands/change-review-gates.d.ts +107 -0
- package/dist/commands/change-review-gates.js +329 -0
- package/dist/commands/change-review-gates.js.map +1 -0
- package/dist/commands/change-scope-gate.d.ts +21 -0
- package/dist/commands/change-scope-gate.js +32 -0
- package/dist/commands/change-scope-gate.js.map +1 -0
- package/dist/commands/change-start.d.ts +30 -0
- package/dist/commands/change-start.js +91 -0
- package/dist/commands/change-start.js.map +1 -0
- package/dist/commands/change-state-command.d.ts +3 -0
- package/dist/commands/change-state-command.js +32 -0
- package/dist/commands/change-state-command.js.map +1 -0
- package/dist/commands/change-status-command.d.ts +13 -0
- package/dist/commands/change-status-command.js +126 -0
- package/dist/commands/change-status-command.js.map +1 -0
- package/dist/commands/change-status-context.d.ts +58 -0
- package/dist/commands/change-status-context.js +166 -0
- package/dist/commands/change-status-context.js.map +1 -0
- package/dist/commands/change-task-stats.d.ts +24 -0
- package/dist/commands/change-task-stats.js +66 -0
- package/dist/commands/change-task-stats.js.map +1 -0
- package/dist/commands/change-validate-entry.d.ts +17 -0
- package/dist/commands/change-validate-entry.js +44 -0
- package/dist/commands/change-validate-entry.js.map +1 -0
- package/dist/commands/change-validate.d.ts +32 -0
- package/dist/commands/change-validate.js +128 -0
- package/dist/commands/change-validate.js.map +1 -0
- package/dist/commands/change.d.ts +322 -0
- package/dist/commands/change.js +1731 -0
- package/dist/commands/change.js.map +1 -0
- package/dist/commands/codex-install-prompts.d.ts +4 -0
- package/dist/commands/codex-install-prompts.js +68 -0
- package/dist/commands/codex-install-prompts.js.map +1 -0
- package/dist/commands/codex-install-skills.d.ts +4 -0
- package/dist/commands/codex-install-skills.js +74 -0
- package/dist/commands/codex-install-skills.js.map +1 -0
- package/dist/commands/codex-status-prompts.d.ts +4 -0
- package/dist/commands/codex-status-prompts.js +44 -0
- package/dist/commands/codex-status-prompts.js.map +1 -0
- package/dist/commands/codex-status-skills.d.ts +4 -0
- package/dist/commands/codex-status-skills.js +54 -0
- package/dist/commands/codex-status-skills.js.map +1 -0
- package/dist/commands/codex-uninstall-prompts.d.ts +4 -0
- package/dist/commands/codex-uninstall-prompts.js +51 -0
- package/dist/commands/codex-uninstall-prompts.js.map +1 -0
- package/dist/commands/codex-uninstall-skills.d.ts +4 -0
- package/dist/commands/codex-uninstall-skills.js +59 -0
- package/dist/commands/codex-uninstall-skills.js.map +1 -0
- package/dist/commands/dashboard.d.ts +222 -0
- package/dist/commands/dashboard.js +193 -0
- package/dist/commands/dashboard.js.map +1 -0
- package/dist/commands/hooks-install.d.ts +4 -0
- package/dist/commands/hooks-install.js +90 -0
- package/dist/commands/hooks-install.js.map +1 -0
- package/dist/commands/hooks-status.d.ts +4 -0
- package/dist/commands/hooks-status.js +89 -0
- package/dist/commands/hooks-status.js.map +1 -0
- package/dist/commands/init.d.ts +4 -0
- package/dist/commands/init.js +100 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/opencode-auto.d.ts +11 -0
- package/dist/commands/opencode-auto.js +158 -0
- package/dist/commands/opencode-auto.js.map +1 -0
- package/dist/commands/opencode-status.d.ts +4 -0
- package/dist/commands/opencode-status.js +75 -0
- package/dist/commands/opencode-status.js.map +1 -0
- package/dist/commands/opencode-supervise.d.ts +24 -0
- package/dist/commands/opencode-supervise.js +188 -0
- package/dist/commands/opencode-supervise.js.map +1 -0
- package/dist/commands/rollback.d.ts +4 -0
- package/dist/commands/rollback.js +12 -0
- package/dist/commands/rollback.js.map +1 -0
- package/dist/commands/update.d.ts +4 -0
- package/dist/commands/update.js +212 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/commands/validate.d.ts +4 -0
- package/dist/commands/validate.js +222 -0
- package/dist/commands/validate.js.map +1 -0
- package/dist/commands/ws-commit.d.ts +5 -0
- package/dist/commands/ws-commit.js +39 -0
- package/dist/commands/ws-commit.js.map +1 -0
- package/dist/commands/ws-deliver.d.ts +5 -0
- package/dist/commands/ws-deliver.js +59 -0
- package/dist/commands/ws-deliver.js.map +1 -0
- package/dist/commands/ws-finish.d.ts +5 -0
- package/dist/commands/ws-finish.js +142 -0
- package/dist/commands/ws-finish.js.map +1 -0
- package/dist/commands/ws-handoff.d.ts +5 -0
- package/dist/commands/ws-handoff.js +35 -0
- package/dist/commands/ws-handoff.js.map +1 -0
- package/dist/commands/ws-migrate.d.ts +5 -0
- package/dist/commands/ws-migrate.js +41 -0
- package/dist/commands/ws-migrate.js.map +1 -0
- package/dist/commands/ws-plan-verify.d.ts +5 -0
- package/dist/commands/ws-plan-verify.js +38 -0
- package/dist/commands/ws-plan-verify.js.map +1 -0
- package/dist/commands/ws-pull.d.ts +5 -0
- package/dist/commands/ws-pull.js +26 -0
- package/dist/commands/ws-pull.js.map +1 -0
- package/dist/commands/ws-push.d.ts +5 -0
- package/dist/commands/ws-push.js +68 -0
- package/dist/commands/ws-push.js.map +1 -0
- package/dist/commands/ws-submodule-setup.d.ts +5 -0
- package/dist/commands/ws-submodule-setup.js +55 -0
- package/dist/commands/ws-submodule-setup.js.map +1 -0
- package/dist/commands/ws-verify-before-complete.d.ts +5 -0
- package/dist/commands/ws-verify-before-complete.js +35 -0
- package/dist/commands/ws-verify-before-complete.js.map +1 -0
- package/dist/dashboard/app.d.ts +1 -0
- package/dist/dashboard/app.js +370 -0
- package/dist/dashboard/app.js.map +1 -0
- package/dist/delegation/cli.d.ts +6 -0
- package/dist/delegation/cli.js +14 -0
- package/dist/delegation/cli.js.map +1 -0
- package/dist/delegation/index.d.ts +35 -0
- package/dist/delegation/index.js +118 -0
- package/dist/delegation/index.js.map +1 -0
- package/dist/errors.d.ts +8 -0
- package/dist/errors.js +11 -0
- package/dist/errors.js.map +1 -0
- package/dist/exec.d.ts +9 -0
- package/dist/exec.js +22 -0
- package/dist/exec.js.map +1 -0
- package/dist/fs.d.ts +9 -0
- package/dist/fs.js +62 -0
- package/dist/fs.js.map +1 -0
- package/dist/governance.d.ts +10 -0
- package/dist/governance.js +135 -0
- package/dist/governance.js.map +1 -0
- package/dist/hash.d.ts +3 -0
- package/dist/hash.js +13 -0
- package/dist/hash.js.map +1 -0
- package/dist/hooks/deploy-claude.d.ts +13 -0
- package/dist/hooks/deploy-claude.js +67 -0
- package/dist/hooks/deploy-claude.js.map +1 -0
- package/dist/journal.d.ts +22 -0
- package/dist/journal.js +112 -0
- package/dist/journal.js.map +1 -0
- package/dist/json-schema-lite.d.ts +22 -0
- package/dist/json-schema-lite.js +148 -0
- package/dist/json-schema-lite.js.map +1 -0
- package/dist/managed-blocks.d.ts +24 -0
- package/dist/managed-blocks.js +84 -0
- package/dist/managed-blocks.js.map +1 -0
- package/dist/manifest.d.ts +24 -0
- package/dist/manifest.js +145 -0
- package/dist/manifest.js.map +1 -0
- package/dist/opencode-env.d.ts +62 -0
- package/dist/opencode-env.js +178 -0
- package/dist/opencode-env.js.map +1 -0
- package/dist/path-utils.d.ts +2 -0
- package/dist/path-utils.js +8 -0
- package/dist/path-utils.js.map +1 -0
- package/dist/spec.d.ts +17 -0
- package/dist/spec.js +174 -0
- package/dist/spec.js.map +1 -0
- package/dist/template.d.ts +20 -0
- package/dist/template.js +123 -0
- package/dist/template.js.map +1 -0
- package/dist/workspace.d.ts +4 -0
- package/dist/workspace.js +19 -0
- package/dist/workspace.js.map +1 -0
- package/package.json +11 -3
- package/src/aiws-package.js +0 -15
- package/src/backup.js +0 -149
- package/src/cli.js +0 -760
- package/src/codex-prompts.js +0 -74
- package/src/codex-skills.js +0 -111
- package/src/commands/change-advice.js +0 -181
- package/src/commands/change-evidence-command.js +0 -242
- package/src/commands/change-evidence-entry.js +0 -40
- package/src/commands/change-evidence.js +0 -340
- package/src/commands/change-finish.js +0 -413
- package/src/commands/change-git-status.js +0 -53
- package/src/commands/change-lifecycle.js +0 -236
- package/src/commands/change-metrics-command.js +0 -110
- package/src/commands/change-next-command.js +0 -133
- package/src/commands/change-review-gates.js +0 -331
- package/src/commands/change-scope-gate.js +0 -34
- package/src/commands/change-start.js +0 -85
- package/src/commands/change-state-command.js +0 -40
- package/src/commands/change-status-command.js +0 -125
- package/src/commands/change-status-context.js +0 -173
- package/src/commands/change-task-stats.js +0 -64
- package/src/commands/change-validate-entry.js +0 -45
- package/src/commands/change-validate.js +0 -127
- package/src/commands/change.js +0 -1829
- package/src/commands/codex-install-prompts.js +0 -68
- package/src/commands/codex-install-skills.js +0 -74
- package/src/commands/codex-status-prompts.js +0 -55
- package/src/commands/codex-status-skills.js +0 -63
- package/src/commands/codex-uninstall-prompts.js +0 -55
- package/src/commands/codex-uninstall-skills.js +0 -62
- package/src/commands/dashboard.js +0 -205
- package/src/commands/hooks-install.js +0 -92
- package/src/commands/hooks-status.js +0 -95
- package/src/commands/init.js +0 -101
- package/src/commands/opencode-auto.js +0 -167
- package/src/commands/opencode-status.js +0 -103
- package/src/commands/opencode-supervise.js +0 -200
- package/src/commands/rollback.js +0 -13
- package/src/commands/update.js +0 -145
- package/src/commands/validate.js +0 -228
- package/src/commands/ws-commit.js +0 -44
- package/src/commands/ws-deliver.js +0 -67
- package/src/commands/ws-finish.js +0 -83
- package/src/commands/ws-handoff.js +0 -40
- package/src/commands/ws-migrate.js +0 -41
- package/src/commands/ws-plan-verify.js +0 -44
- package/src/commands/ws-pull.js +0 -30
- package/src/commands/ws-push.js +0 -71
- package/src/commands/ws-submodule-setup.js +0 -65
- package/src/commands/ws-verify-before-complete.js +0 -39
- package/src/dashboard/app.js +0 -371
- package/src/errors.js +0 -15
- package/src/exec.js +0 -34
- package/src/fs.js +0 -91
- package/src/governance.js +0 -159
- package/src/hash.js +0 -25
- package/src/json-schema-lite.js +0 -164
- package/src/managed-blocks.js +0 -131
- package/src/manifest.js +0 -177
- package/src/opencode-env.js +0 -208
- package/src/path-utils.js +0 -20
- package/src/spec.js +0 -195
- package/src/template.js +0 -187
- package/src/workspace.js +0 -23
- /package/{src → dist}/dashboard/index.html +0 -0
- /package/{src → dist}/dashboard/style.css +0 -0
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @param {{
|
|
3
|
+
* gitRoot: string,
|
|
4
|
+
* branch: string,
|
|
5
|
+
* status: any
|
|
6
|
+
* }} input
|
|
7
|
+
* @param {{
|
|
8
|
+
* effectiveReviewCount: (status: any) => number,
|
|
9
|
+
* governanceGuidanceLines: (status: any) => Promise<string[]>,
|
|
10
|
+
* planVerifyHint: (changeId: string) => string
|
|
11
|
+
* }} deps
|
|
12
|
+
*/
|
|
13
|
+
export async function renderChangeStatusOutput(input, deps) {
|
|
14
|
+
const { gitRoot, branch, status } = input;
|
|
15
|
+
/** @type {string[]} */
|
|
16
|
+
const lines = [];
|
|
17
|
+
lines.push(`✓ aiws change status: ${status.changeId}`);
|
|
18
|
+
lines.push(`dir: ${status.dir}`);
|
|
19
|
+
lines.push(`phase: ${status.phase}`);
|
|
20
|
+
lines.push(`branch: ${branch || "(detached HEAD)"}`);
|
|
21
|
+
lines.push(`meta: ${status.metaState}`);
|
|
22
|
+
if (status.reqId)
|
|
23
|
+
lines.push(`Req_ID: ${status.reqId}`);
|
|
24
|
+
if (status.probId)
|
|
25
|
+
lines.push(`Problem_ID: ${status.probId}`);
|
|
26
|
+
lines.push(`tasks: ${status.tasks.done}/${status.tasks.total} (unchecked=${status.tasks.unchecked}, optional_open=${status.tasks.optionalUnchecked || 0}, n_a=${status.tasks.naCount || 0})`);
|
|
27
|
+
if (status.reviewSignals) {
|
|
28
|
+
lines.push(`review_signal: effective=${status.reviewSignals.effectiveCount} source=${status.reviewSignals.source}`);
|
|
29
|
+
}
|
|
30
|
+
if (status.reviewGates?.summary) {
|
|
31
|
+
const summary = status.reviewGates.summary;
|
|
32
|
+
const missing = summary.finishGateMissingIds.length > 0 ? summary.finishGateMissingIds.join(", ") : "(none)";
|
|
33
|
+
lines.push(`review_gates: generic_only=${summary.genericReviewOnly} dual_pending=${summary.dualReviewPending} dual_ready=${summary.dualReviewReady} finish_ready=${summary.finishGateReady} missing=${missing}`);
|
|
34
|
+
for (const gate of status.reviewGates.gates || []) {
|
|
35
|
+
lines.push(`review_gate:${gate.id} ready=${gate.ready} status=${gate.status}${gate.foundPath ? ` path=${gate.foundPath}` : ""}`);
|
|
36
|
+
}
|
|
37
|
+
if (status.reviewGates.validateStamp) {
|
|
38
|
+
const validateStamp = status.reviewGates.validateStamp;
|
|
39
|
+
lines.push(`review_gate:${validateStamp.id} ready=${validateStamp.ready} status=${validateStamp.status}${validateStamp.foundPath ? ` path=${validateStamp.foundPath}` : ""}`);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
if (status.scopeGate) {
|
|
43
|
+
lines.push(`scope_gate: status=${status.scopeGate.status} ready=${status.scopeGate.ready} checked=${status.scopeGate.checked} errors=${status.scopeGate.errors} warnings=${status.scopeGate.warnings}${status.scopeGate.lastRunAt ? ` at=${status.scopeGate.lastRunAt}` : ""}`);
|
|
44
|
+
}
|
|
45
|
+
if (status.git) {
|
|
46
|
+
lines.push(`git: clean=${status.git.clean} staged=${status.git.staged} unstaged=${status.git.unstaged} untracked=${status.git.untracked} conflicted=${status.git.conflicted}`);
|
|
47
|
+
}
|
|
48
|
+
if (status.governance) {
|
|
49
|
+
lines.push(`governance: current=${status.governance.currentStage} next=${status.governance.recommendedStage}`);
|
|
50
|
+
if (status.governance.rationale)
|
|
51
|
+
lines.push(`governance_reason: ${status.governance.rationale}`);
|
|
52
|
+
if (status.governance.ruleId)
|
|
53
|
+
lines.push(`governance_rule: ${status.governance.ruleId}`);
|
|
54
|
+
if (status.governance.source)
|
|
55
|
+
lines.push(`governance_source: ${status.governance.source}`);
|
|
56
|
+
}
|
|
57
|
+
lines.push(`baseline: ${status.baselineLabel}${status.baselineAt ? ` (at=${status.baselineAt})` : ""}`);
|
|
58
|
+
lines.push(`drift: ${status.driftFiles.length > 0 ? status.driftFiles.join(", ") : "(none)"}`);
|
|
59
|
+
if (status.evidence?.counts) {
|
|
60
|
+
const counts = status.evidence.counts;
|
|
61
|
+
lines.push(`evidence: declared=${counts.total} (exists=${counts.exists}, missing=${counts.missing}, persistent=${counts.persistent}, tmp=${counts.tmp})`);
|
|
62
|
+
}
|
|
63
|
+
if (status.collaboration?.counts) {
|
|
64
|
+
const counts = status.collaboration.counts;
|
|
65
|
+
lines.push(`collaboration: analysis=${counts.analysis}, patches=${counts.patches}, review=${counts.review}, evidence_dir=${counts.evidence}`);
|
|
66
|
+
}
|
|
67
|
+
lines.push("");
|
|
68
|
+
lines.push("Blockers (strict):");
|
|
69
|
+
if (status.blockersStrict.length === 0)
|
|
70
|
+
lines.push("- (none)");
|
|
71
|
+
else
|
|
72
|
+
for (const blocker of status.blockersStrict)
|
|
73
|
+
lines.push(`- ${blocker}`);
|
|
74
|
+
lines.push("");
|
|
75
|
+
lines.push("Blockers (archive):");
|
|
76
|
+
if (status.blockersArchive.length === 0)
|
|
77
|
+
lines.push("- (none)");
|
|
78
|
+
else
|
|
79
|
+
for (const blocker of status.blockersArchive)
|
|
80
|
+
lines.push(`- ${blocker}`);
|
|
81
|
+
lines.push("");
|
|
82
|
+
lines.push("Next (recommended):");
|
|
83
|
+
if (status.terminatedReuse) {
|
|
84
|
+
lines.push(`- ${status.terminatedReuse.message}`);
|
|
85
|
+
lines.push(`- rerun \`aiws change finish ${status.changeId} --push\` to resume the unfinished finish/archive flow`);
|
|
86
|
+
lines.push(`- do not continue development or commit on \`change/${status.changeId}\``);
|
|
87
|
+
return lines.join("\n") + "\n";
|
|
88
|
+
}
|
|
89
|
+
lines.push(`- ${deps.planVerifyHint(status.changeId)}`);
|
|
90
|
+
if (status.blockersStrict.length > 0) {
|
|
91
|
+
lines.push("- 先修复 Blockers (strict) 后复跑质量门,再进入编码:simple/local 单点修复优先 `$ws-dev-lite`;否则 `$ws-dev`");
|
|
92
|
+
return lines.join("\n") + "\n";
|
|
93
|
+
}
|
|
94
|
+
if (status.tasks.unchecked > 0) {
|
|
95
|
+
lines.push("- 继续开发:simple/local 单点修复优先 `$ws-dev-lite`;否则 `$ws-dev`(小步实现 + 可复现验证)");
|
|
96
|
+
if ((status.collaboration?.counts?.analysis || 0) > 0)
|
|
97
|
+
lines.push("- 已有委托分析:在编码前先收敛 `.aiws/changes/<id>/analysis/` 中的结论");
|
|
98
|
+
if ((status.collaboration?.counts?.patches || 0) > 0)
|
|
99
|
+
lines.push("- 已有 patch 草案:应用前先人工审查 `.aiws/changes/<id>/patches/`");
|
|
100
|
+
lines.push("- 提交/交付前强制门禁:`aiws validate .`(可选落盘:`aiws validate . --stamp`)");
|
|
101
|
+
lines.push(`- (可选)状态快照:\`aiws change state ${status.changeId} --write\``);
|
|
102
|
+
return lines.join("\n") + "\n";
|
|
103
|
+
}
|
|
104
|
+
if (status.evidence?.counts && status.evidence.counts.persistent === 0) {
|
|
105
|
+
lines.push("- 交付前建议生成持久证据:`.aiws/changes/<id>/evidence/...`(并把路径回填到 proposal.md 的 Evidence_Path)");
|
|
106
|
+
}
|
|
107
|
+
if (status.evidence?.missing && status.evidence.missing.length > 0) {
|
|
108
|
+
const show = status.evidence.missing.slice(0, 5);
|
|
109
|
+
lines.push(`- 交付前建议补齐缺失证据文件(missing=${status.evidence.missing.length}):${show.join(", ")}${status.evidence.missing.length > show.length ? ", ..." : ""}`);
|
|
110
|
+
}
|
|
111
|
+
if ((status.collaboration?.counts?.patches || 0) > 0) {
|
|
112
|
+
lines.push("- 存在委托 patch 草案:交付前确认其已被人工审查,并在 review/handoff 中记录结论");
|
|
113
|
+
}
|
|
114
|
+
if ((status.collaboration?.counts?.analysis || 0) > 0 && deps.effectiveReviewCount(status) === 0) {
|
|
115
|
+
lines.push("- 存在委托分析但尚无 review 汇总:建议先在 `.aiws/changes/<id>/review/` 形成结论后再交付");
|
|
116
|
+
}
|
|
117
|
+
lines.push(`- (可选)状态快照:\`aiws change state ${status.changeId} --write\``);
|
|
118
|
+
for (const line of await deps.governanceGuidanceLines(status))
|
|
119
|
+
lines.push(`- ${line}`);
|
|
120
|
+
if (status.governance?.rationale)
|
|
121
|
+
lines.push(`- 阶段判定:${status.governance.rationale}`);
|
|
122
|
+
if (status.governance?.warning)
|
|
123
|
+
lines.push(`- 注意:${status.governance.warning}`);
|
|
124
|
+
return lines.join("\n") + "\n";
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=change-status-command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"change-status-command.js","sourceRoot":"","sources":["../../src/commands/change-status-command.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @param {string} gitRoot
|
|
3
|
+
* @param {string} changeId
|
|
4
|
+
* @param {{
|
|
5
|
+
* currentBranch: (gitRoot: string) => Promise<string>,
|
|
6
|
+
* inferChangeIdFromBranch: (branch: string) => string
|
|
7
|
+
* }} deps
|
|
8
|
+
*/
|
|
9
|
+
export declare function resolveChangeStatusContext(gitRoot: string, changeId: string, deps: any): Promise<{
|
|
10
|
+
worktree: string;
|
|
11
|
+
branch: any;
|
|
12
|
+
branchMatchesChange: boolean;
|
|
13
|
+
source: string;
|
|
14
|
+
warning: string;
|
|
15
|
+
currentWorktree: string;
|
|
16
|
+
currentBranch: any;
|
|
17
|
+
changeWorktree: string;
|
|
18
|
+
}>;
|
|
19
|
+
/**
|
|
20
|
+
* @param {string} changeDir
|
|
21
|
+
* @param {{ pathExists: (path: string) => Promise<boolean>, readText: (path: string) => Promise<string> }} deps
|
|
22
|
+
*/
|
|
23
|
+
export declare function readChangeMetrics(changeDir: string, deps: any): Promise<{
|
|
24
|
+
state: string;
|
|
25
|
+
abs: string;
|
|
26
|
+
events: any;
|
|
27
|
+
}>;
|
|
28
|
+
/**
|
|
29
|
+
* @param {{ state: string, events: any[] }} metrics
|
|
30
|
+
*/
|
|
31
|
+
export declare function summarizeLifecycleSignals(metrics: any): {
|
|
32
|
+
metricsState: string;
|
|
33
|
+
latestEventType: string;
|
|
34
|
+
eventCounts: Record<string, number>;
|
|
35
|
+
evidenceRuns: number;
|
|
36
|
+
finishRuns: number;
|
|
37
|
+
finishCleanupPendingReason: string;
|
|
38
|
+
finishState: string;
|
|
39
|
+
finishStateReason: string;
|
|
40
|
+
finishStateEventType: string;
|
|
41
|
+
archiveRuns: number;
|
|
42
|
+
strictValidatePass: boolean;
|
|
43
|
+
strictScopeValidateRuns: any;
|
|
44
|
+
strictScopeValidatePass: boolean;
|
|
45
|
+
strictScopeValidateAt: string;
|
|
46
|
+
strictScopeValidateErrors: number;
|
|
47
|
+
strictScopeValidateWarnings: number;
|
|
48
|
+
};
|
|
49
|
+
/**
|
|
50
|
+
* @param {Record<string, string | null>} curTruth
|
|
51
|
+
* @param {any} baseline
|
|
52
|
+
* @returns {{ baselineLabel: string, baselineAt: string, driftFiles: string[] }}
|
|
53
|
+
*/
|
|
54
|
+
export declare function truthDrift(curTruth: Record<string, string | null>, baseline: any): {
|
|
55
|
+
baselineLabel: string;
|
|
56
|
+
baselineAt: string;
|
|
57
|
+
driftFiles: string[];
|
|
58
|
+
};
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
/**
|
|
3
|
+
* @param {string} gitRoot
|
|
4
|
+
* @param {string} changeId
|
|
5
|
+
* @param {{
|
|
6
|
+
* currentBranch: (gitRoot: string) => Promise<string>,
|
|
7
|
+
* inferChangeIdFromBranch: (branch: string) => string
|
|
8
|
+
* }} deps
|
|
9
|
+
*/
|
|
10
|
+
export async function resolveChangeStatusContext(gitRoot, changeId, deps) {
|
|
11
|
+
const rootBranch = await deps.currentBranch(gitRoot);
|
|
12
|
+
const contextBranch = rootBranch;
|
|
13
|
+
const inferred = deps.inferChangeIdFromBranch(contextBranch);
|
|
14
|
+
return {
|
|
15
|
+
worktree: path.resolve(gitRoot),
|
|
16
|
+
branch: contextBranch,
|
|
17
|
+
branchMatchesChange: inferred === changeId,
|
|
18
|
+
source: "current_worktree",
|
|
19
|
+
warning: "",
|
|
20
|
+
currentWorktree: path.resolve(gitRoot),
|
|
21
|
+
currentBranch: rootBranch,
|
|
22
|
+
changeWorktree: "",
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* @param {string} changeDir
|
|
27
|
+
* @param {{ pathExists: (path: string) => Promise<boolean>, readText: (path: string) => Promise<string> }} deps
|
|
28
|
+
*/
|
|
29
|
+
export async function readChangeMetrics(changeDir, deps) {
|
|
30
|
+
const metricsAbs = path.join(changeDir, "metrics.json");
|
|
31
|
+
if (!(await deps.pathExists(metricsAbs)))
|
|
32
|
+
return { state: "missing", abs: metricsAbs, events: [] };
|
|
33
|
+
try {
|
|
34
|
+
const parsed = JSON.parse(await deps.readText(metricsAbs));
|
|
35
|
+
const events = Array.isArray(parsed?.events) ? parsed.events : [];
|
|
36
|
+
return { state: "ok", abs: metricsAbs, events };
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
return { state: "invalid", abs: metricsAbs, events: [] };
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
const FINISH_DONE_COMPLETED_CLEANUPS = new Set([
|
|
43
|
+
"removed",
|
|
44
|
+
"pruned-missing",
|
|
45
|
+
"skipped:current_worktree",
|
|
46
|
+
]);
|
|
47
|
+
/**
|
|
48
|
+
* @param {any} ev
|
|
49
|
+
* @returns {{ state: string, reason: string, eventType: string } | null}
|
|
50
|
+
*/
|
|
51
|
+
function classifyFinishLifecycleEvent(ev) {
|
|
52
|
+
const type = String(ev?.type || "").trim();
|
|
53
|
+
if (!type)
|
|
54
|
+
return null;
|
|
55
|
+
if (type === "finish_local") {
|
|
56
|
+
return { state: "local", reason: "", eventType: type };
|
|
57
|
+
}
|
|
58
|
+
if (type === "finish_failed") {
|
|
59
|
+
return { state: "failed", reason: String(ev?.payload?.error || ""), eventType: type };
|
|
60
|
+
}
|
|
61
|
+
if (type === "finish_cleanup_pending") {
|
|
62
|
+
return {
|
|
63
|
+
state: "cleanup_pending",
|
|
64
|
+
reason: String(ev?.payload?.reason || ev?.payload?.cleanup || ""),
|
|
65
|
+
eventType: type,
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
if (type === "finish") {
|
|
69
|
+
return { state: "done", reason: "", eventType: type };
|
|
70
|
+
}
|
|
71
|
+
if (type !== "finish_done")
|
|
72
|
+
return null;
|
|
73
|
+
const payload = ev?.payload && typeof ev.payload === "object" ? ev.payload : null;
|
|
74
|
+
const hasPush = payload ? Object.prototype.hasOwnProperty.call(payload, "push") : false;
|
|
75
|
+
const pushCompleted = hasPush ? payload?.push === true : null;
|
|
76
|
+
const cleanup = String(payload?.cleanup || "").trim();
|
|
77
|
+
if (pushCompleted === false || cleanup === "not_requested") {
|
|
78
|
+
return { state: "local", reason: "", eventType: type };
|
|
79
|
+
}
|
|
80
|
+
if (!cleanup) {
|
|
81
|
+
return { state: "done", reason: "", eventType: type };
|
|
82
|
+
}
|
|
83
|
+
if (FINISH_DONE_COMPLETED_CLEANUPS.has(cleanup)) {
|
|
84
|
+
return { state: "done", reason: "", eventType: type };
|
|
85
|
+
}
|
|
86
|
+
return {
|
|
87
|
+
state: "cleanup_pending",
|
|
88
|
+
reason: cleanup.startsWith("skipped:") ? cleanup.slice("skipped:".length) : cleanup,
|
|
89
|
+
eventType: type,
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* @param {{ state: string, events: any[] }} metrics
|
|
94
|
+
*/
|
|
95
|
+
export function summarizeLifecycleSignals(metrics) {
|
|
96
|
+
const events = Array.isArray(metrics?.events) ? metrics.events : [];
|
|
97
|
+
/** @type {Record<string, number>} */
|
|
98
|
+
const eventCounts = {};
|
|
99
|
+
let finishState = "";
|
|
100
|
+
let finishStateReason = "";
|
|
101
|
+
let finishStateEventType = "";
|
|
102
|
+
for (const ev of events) {
|
|
103
|
+
const type = String(ev?.type || "").trim();
|
|
104
|
+
if (!type)
|
|
105
|
+
continue;
|
|
106
|
+
eventCounts[type] = (eventCounts[type] || 0) + 1;
|
|
107
|
+
const finishIsTerminal = finishState === "done";
|
|
108
|
+
if (finishIsTerminal && type !== "finish_done" && type !== "finish")
|
|
109
|
+
continue;
|
|
110
|
+
const classified = classifyFinishLifecycleEvent(ev);
|
|
111
|
+
if (!classified)
|
|
112
|
+
continue;
|
|
113
|
+
finishState = classified.state;
|
|
114
|
+
finishStateReason = classified.reason;
|
|
115
|
+
finishStateEventType = classified.eventType;
|
|
116
|
+
}
|
|
117
|
+
const latest = events.length > 0 ? events[events.length - 1] : null;
|
|
118
|
+
const validateEvents = events.filter((ev) => ev?.type === "validate");
|
|
119
|
+
const latestStrictValidate = [...validateEvents].reverse().find((ev) => ev?.payload?.strict === true) || null;
|
|
120
|
+
const latestStrictScopeValidate = [...validateEvents].reverse().find((ev) => ev?.payload?.strict === true && ev?.payload?.check_scope === true) || null;
|
|
121
|
+
const strictScopeValidateRuns = validateEvents.filter((ev) => ev?.payload?.strict === true && ev?.payload?.check_scope === true).length;
|
|
122
|
+
return {
|
|
123
|
+
metricsState: String(metrics?.state || "missing"),
|
|
124
|
+
latestEventType: String(latest?.type || ""),
|
|
125
|
+
eventCounts,
|
|
126
|
+
evidenceRuns: eventCounts.evidence || 0,
|
|
127
|
+
finishRuns: (eventCounts.finish || 0) + (eventCounts.finish_done || 0),
|
|
128
|
+
finishCleanupPendingReason: finishState === "cleanup_pending" ? finishStateReason : "",
|
|
129
|
+
finishState,
|
|
130
|
+
finishStateReason,
|
|
131
|
+
finishStateEventType,
|
|
132
|
+
archiveRuns: eventCounts.archive || 0,
|
|
133
|
+
strictValidatePass: latestStrictValidate ? latestStrictValidate?.payload?.ok === true : false,
|
|
134
|
+
strictScopeValidateRuns,
|
|
135
|
+
strictScopeValidatePass: latestStrictScopeValidate ? latestStrictScopeValidate?.payload?.ok === true : false,
|
|
136
|
+
strictScopeValidateAt: String(latestStrictScopeValidate?.timestamp || ""),
|
|
137
|
+
strictScopeValidateErrors: Number(latestStrictScopeValidate?.payload?.errors || 0),
|
|
138
|
+
strictScopeValidateWarnings: Number(latestStrictScopeValidate?.payload?.warnings || 0),
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* @param {Record<string, string | null>} curTruth
|
|
143
|
+
* @param {any} baseline
|
|
144
|
+
* @returns {{ baselineLabel: string, baselineAt: string, driftFiles: string[] }}
|
|
145
|
+
*/
|
|
146
|
+
export function truthDrift(curTruth, baseline) {
|
|
147
|
+
/** @type {string[]} */
|
|
148
|
+
const driftFiles = [];
|
|
149
|
+
const createdTruth = baseline?.base_truth_files && typeof baseline.base_truth_files === "object" ? baseline.base_truth_files : {};
|
|
150
|
+
const syncedTruth = baseline?.synced_truth_files && typeof baseline.synced_truth_files === "object" ? baseline.synced_truth_files : {};
|
|
151
|
+
const effective = Object.keys(syncedTruth).length > 0 ? syncedTruth : createdTruth;
|
|
152
|
+
const baselineLabel = Object.keys(syncedTruth).length > 0 ? "sync" : "creation";
|
|
153
|
+
const baselineAt = Object.keys(syncedTruth).length > 0 ? String(baseline?.synced_at || "") : String(baseline?.created_at || "");
|
|
154
|
+
for (const [rel, info] of Object.entries(effective || {})) {
|
|
155
|
+
const baseSha = info && typeof info === "object" ? String(info.sha256 || "") : "";
|
|
156
|
+
const curSha = curTruth[rel] ?? null;
|
|
157
|
+
if (curSha == null) {
|
|
158
|
+
driftFiles.push(rel);
|
|
159
|
+
continue;
|
|
160
|
+
}
|
|
161
|
+
if (baseSha && curSha !== baseSha)
|
|
162
|
+
driftFiles.push(rel);
|
|
163
|
+
}
|
|
164
|
+
return { baselineLabel, baselineAt, driftFiles };
|
|
165
|
+
}
|
|
166
|
+
//# sourceMappingURL=change-status-context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"change-status-context.js","sourceRoot":"","sources":["../../src/commands/change-status-context.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parse checkbox tasks with AIWS-specific control markers.
|
|
3
|
+
*
|
|
4
|
+
* Supported markers:
|
|
5
|
+
* - `[optional]`: unchecked optional tasks do not block archive/finish.
|
|
6
|
+
* - `[n/a: ...]` / `[na: ...]` / `[not-applicable: ...]`: task is treated as closed.
|
|
7
|
+
*
|
|
8
|
+
* Returned `total/done/unchecked` are the effective gate counts. Optional open
|
|
9
|
+
* tasks are reported separately via `optionalUnchecked`.
|
|
10
|
+
*
|
|
11
|
+
* @param {string} text
|
|
12
|
+
*/
|
|
13
|
+
export declare function checkboxStats(text: string): {
|
|
14
|
+
total: number;
|
|
15
|
+
done: number;
|
|
16
|
+
unchecked: number;
|
|
17
|
+
hasCheckboxes: boolean;
|
|
18
|
+
totalAll: number;
|
|
19
|
+
doneAll: number;
|
|
20
|
+
uncheckedAll: number;
|
|
21
|
+
optionalTotal: number;
|
|
22
|
+
optionalUnchecked: number;
|
|
23
|
+
naCount: number;
|
|
24
|
+
};
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parse checkbox tasks with AIWS-specific control markers.
|
|
3
|
+
*
|
|
4
|
+
* Supported markers:
|
|
5
|
+
* - `[optional]`: unchecked optional tasks do not block archive/finish.
|
|
6
|
+
* - `[n/a: ...]` / `[na: ...]` / `[not-applicable: ...]`: task is treated as closed.
|
|
7
|
+
*
|
|
8
|
+
* Returned `total/done/unchecked` are the effective gate counts. Optional open
|
|
9
|
+
* tasks are reported separately via `optionalUnchecked`.
|
|
10
|
+
*
|
|
11
|
+
* @param {string} text
|
|
12
|
+
*/
|
|
13
|
+
export function checkboxStats(text) {
|
|
14
|
+
const lines = String(text || "").split(/\r?\n/);
|
|
15
|
+
let total = 0;
|
|
16
|
+
let done = 0;
|
|
17
|
+
let unchecked = 0;
|
|
18
|
+
let totalAll = 0;
|
|
19
|
+
let doneAll = 0;
|
|
20
|
+
let uncheckedAll = 0;
|
|
21
|
+
let optionalTotal = 0;
|
|
22
|
+
let optionalUnchecked = 0;
|
|
23
|
+
let naCount = 0;
|
|
24
|
+
for (const rawLine of lines) {
|
|
25
|
+
const match = rawLine.match(/^\s*-\s+\[([ xX])\]\s+(.*)$/);
|
|
26
|
+
if (!match)
|
|
27
|
+
continue;
|
|
28
|
+
totalAll += 1;
|
|
29
|
+
const checked = String(match[1] || "").toLowerCase() === "x";
|
|
30
|
+
const body = String(match[2] || "");
|
|
31
|
+
const isOptional = /\[(?:optional|Optional)\]/.test(body);
|
|
32
|
+
const isNa = /\[(?:n\/a|na|not-applicable)\s*:[^\]]+\]/i.test(body);
|
|
33
|
+
if (checked)
|
|
34
|
+
doneAll += 1;
|
|
35
|
+
else
|
|
36
|
+
uncheckedAll += 1;
|
|
37
|
+
if (isOptional) {
|
|
38
|
+
optionalTotal += 1;
|
|
39
|
+
if (!checked && !isNa)
|
|
40
|
+
optionalUnchecked += 1;
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
total += 1;
|
|
44
|
+
if (checked || isNa) {
|
|
45
|
+
done += 1;
|
|
46
|
+
if (isNa)
|
|
47
|
+
naCount += 1;
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
unchecked += 1;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return {
|
|
54
|
+
total,
|
|
55
|
+
done,
|
|
56
|
+
unchecked,
|
|
57
|
+
hasCheckboxes: totalAll > 0,
|
|
58
|
+
totalAll,
|
|
59
|
+
doneAll,
|
|
60
|
+
uncheckedAll,
|
|
61
|
+
optionalTotal,
|
|
62
|
+
optionalUnchecked,
|
|
63
|
+
naCount,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=change-task-stats.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"change-task-stats.js","sourceRoot":"","sources":["../../src/commands/change-task-stats.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAChD,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,IAAI,aAAa,GAAG,CAAC,CAAC;IACtB,IAAI,iBAAiB,GAAG,CAAC,CAAC;IAC1B,IAAI,OAAO,GAAG,CAAC,CAAC;IAEhB,KAAK,MAAM,OAAO,IAAI,KAAK,EAAE,CAAC;QAC5B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;QAC3D,IAAI,CAAC,KAAK;YAAE,SAAS;QACrB,QAAQ,IAAI,CAAC,CAAC;QACd,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,KAAK,GAAG,CAAC;QAC7D,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QACpC,MAAM,UAAU,GAAG,2BAA2B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1D,MAAM,IAAI,GAAG,2CAA2C,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEpE,IAAI,OAAO;YAAE,OAAO,IAAI,CAAC,CAAC;;YACrB,YAAY,IAAI,CAAC,CAAC;QAEvB,IAAI,UAAU,EAAE,CAAC;YACf,aAAa,IAAI,CAAC,CAAC;YACnB,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI;gBAAE,iBAAiB,IAAI,CAAC,CAAC;YAC9C,SAAS;QACX,CAAC;QAED,KAAK,IAAI,CAAC,CAAC;QACX,IAAI,OAAO,IAAI,IAAI,EAAE,CAAC;YACpB,IAAI,IAAI,CAAC,CAAC;YACV,IAAI,IAAI;gBAAE,OAAO,IAAI,CAAC,CAAC;QACzB,CAAC;aAAM,CAAC;YACN,SAAS,IAAI,CAAC,CAAC;QACjB,CAAC;IACH,CAAC;IAED,OAAO;QACL,KAAK;QACL,IAAI;QACJ,SAAS;QACT,aAAa,EAAE,QAAQ,GAAG,CAAC;QAC3B,QAAQ;QACR,OAAO;QACP,YAAY;QACZ,aAAa;QACb,iBAAiB;QACjB,OAAO;KACR,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @param {{
|
|
3
|
+
* gitRoot: string,
|
|
4
|
+
* changeId: string,
|
|
5
|
+
* options: { strict: boolean, allowTruthDrift: boolean, checkEvidence: boolean, checkScope: boolean }
|
|
6
|
+
* }} input
|
|
7
|
+
* @param {{
|
|
8
|
+
* appendMetricsEvent: (gitRoot: string, changeId: string, type: string, payload: any) => Promise<void>,
|
|
9
|
+
* validateChangeArtifacts: (gitRoot: string, changeId: string, options: any) => Promise<any>,
|
|
10
|
+
* UserError: typeof import("../errors.js").UserError
|
|
11
|
+
* }} deps
|
|
12
|
+
*/
|
|
13
|
+
export declare function runChangeValidateCommand(input: any, deps: any): Promise<{
|
|
14
|
+
output: string;
|
|
15
|
+
stderr: string;
|
|
16
|
+
errorToThrow: any;
|
|
17
|
+
}>;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @param {{
|
|
3
|
+
* gitRoot: string,
|
|
4
|
+
* changeId: string,
|
|
5
|
+
* options: { strict: boolean, allowTruthDrift: boolean, checkEvidence: boolean, checkScope: boolean }
|
|
6
|
+
* }} input
|
|
7
|
+
* @param {{
|
|
8
|
+
* appendMetricsEvent: (gitRoot: string, changeId: string, type: string, payload: any) => Promise<void>,
|
|
9
|
+
* validateChangeArtifacts: (gitRoot: string, changeId: string, options: any) => Promise<any>,
|
|
10
|
+
* UserError: typeof import("../errors.js").UserError
|
|
11
|
+
* }} deps
|
|
12
|
+
*/
|
|
13
|
+
export async function runChangeValidateCommand(input, deps) {
|
|
14
|
+
const { gitRoot, changeId, options } = input;
|
|
15
|
+
const result = await deps.validateChangeArtifacts(gitRoot, changeId, {
|
|
16
|
+
strict: options.strict === true,
|
|
17
|
+
allowTruthDrift: options.allowTruthDrift === true,
|
|
18
|
+
checkEvidence: options.checkEvidence === true,
|
|
19
|
+
checkScope: options.checkScope === true,
|
|
20
|
+
});
|
|
21
|
+
await deps.appendMetricsEvent(gitRoot, changeId, "validate", {
|
|
22
|
+
ok: result.ok === true,
|
|
23
|
+
strict: options.strict === true,
|
|
24
|
+
allow_truth_drift: options.allowTruthDrift === true,
|
|
25
|
+
check_evidence: options.checkEvidence === true,
|
|
26
|
+
check_scope: options.checkScope === true,
|
|
27
|
+
errors: Array.isArray(result.errors) ? result.errors.length : 0,
|
|
28
|
+
warnings: Array.isArray(result.warnings) ? result.warnings.length : 0,
|
|
29
|
+
exit_code: result.exitCode,
|
|
30
|
+
});
|
|
31
|
+
if (result.raw) {
|
|
32
|
+
return {
|
|
33
|
+
output: result.ok ? `ok: change validated (${changeId})\n` : "",
|
|
34
|
+
stderr: result.raw + "\n",
|
|
35
|
+
errorToThrow: result.ok ? null : new deps.UserError(""),
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
return {
|
|
39
|
+
output: result.ok ? `ok: change validated (${changeId})\n` : "",
|
|
40
|
+
stderr: "",
|
|
41
|
+
errorToThrow: result.ok ? null : new deps.UserError(""),
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=change-validate-entry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"change-validate-entry.js","sourceRoot":"","sources":["../../src/commands/change-validate-entry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAAC,KAAU,EAAE,IAAS;IAClE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC;IAC7C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,uBAAuB,CAAC,OAAO,EAAE,QAAQ,EAAE;QACnE,MAAM,EAAE,OAAO,CAAC,MAAM,KAAK,IAAI;QAC/B,eAAe,EAAE,OAAO,CAAC,eAAe,KAAK,IAAI;QACjD,aAAa,EAAE,OAAO,CAAC,aAAa,KAAK,IAAI;QAC7C,UAAU,EAAE,OAAO,CAAC,UAAU,KAAK,IAAI;KACxC,CAAC,CAAC;IAEH,MAAM,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE;QAC3D,EAAE,EAAE,MAAM,CAAC,EAAE,KAAK,IAAI;QACtB,MAAM,EAAE,OAAO,CAAC,MAAM,KAAK,IAAI;QAC/B,iBAAiB,EAAE,OAAO,CAAC,eAAe,KAAK,IAAI;QACnD,cAAc,EAAE,OAAO,CAAC,aAAa,KAAK,IAAI;QAC9C,WAAW,EAAE,OAAO,CAAC,UAAU,KAAK,IAAI;QACxC,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC/D,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACrE,SAAS,EAAE,MAAM,CAAC,QAAQ;KAC3B,CAAC,CAAC;IAEH,IAAI,MAAM,CAAC,GAAG,EAAE,CAAC;QACf,OAAO;YACL,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,yBAAyB,QAAQ,KAAK,CAAC,CAAC,CAAC,EAAE;YAC/D,MAAM,EAAE,MAAM,CAAC,GAAG,GAAG,IAAI;YACzB,YAAY,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;SACxD,CAAC;IACJ,CAAC;IACD,OAAO;QACL,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,yBAAyB,QAAQ,KAAK,CAAC,CAAC,CAAC,EAAE;QAC/D,MAAM,EAAE,EAAE;QACV,YAAY,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;KACxD,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @param {string} gitRoot
|
|
3
|
+
* @param {string} changeId
|
|
4
|
+
* @param {{ strict: boolean, allowTruthDrift: boolean, checkEvidence?: boolean, checkScope?: boolean }} options
|
|
5
|
+
* @param {{
|
|
6
|
+
* assertValidChangeId: (changeId: string) => void,
|
|
7
|
+
* collectFinishGateErrors: (changeId: string, reviewGates: any) => string[],
|
|
8
|
+
* computeChangeStatus: (gitRoot: string, changeId: string) => Promise<any>,
|
|
9
|
+
* ensureTruthFiles: (gitRoot: string) => Promise<void>,
|
|
10
|
+
* resolveWsChangeChecker: (gitRoot: string) => Promise<{ args: string[] }>,
|
|
11
|
+
* runPython: (cwd: string, args: string[]) => Promise<{ code: number, stdout: string, stderr: string }>
|
|
12
|
+
* }} deps
|
|
13
|
+
*/
|
|
14
|
+
export declare function validateChangeArtifacts(gitRoot: string, changeId: string, options: {
|
|
15
|
+
strict: boolean;
|
|
16
|
+
allowTruthDrift: boolean;
|
|
17
|
+
checkEvidence?: boolean;
|
|
18
|
+
checkScope?: boolean;
|
|
19
|
+
}, deps: any): Promise<{
|
|
20
|
+
ok: boolean;
|
|
21
|
+
changeId: string;
|
|
22
|
+
strict: boolean;
|
|
23
|
+
allowTruthDrift: boolean;
|
|
24
|
+
exitCode: any;
|
|
25
|
+
errors: string[];
|
|
26
|
+
warnings: string[];
|
|
27
|
+
groups: Record<string, {
|
|
28
|
+
errors: string[];
|
|
29
|
+
warnings: string[];
|
|
30
|
+
}>;
|
|
31
|
+
raw: string;
|
|
32
|
+
}>;
|