@aipper/aiws 0.0.29 → 0.0.30

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 (278) hide show
  1. package/bin/aiws.js +2 -2
  2. package/dist/aiws-package.d.ts +4 -0
  3. package/dist/aiws-package.js +11 -0
  4. package/dist/aiws-package.js.map +1 -0
  5. package/dist/aiws-paths.d.ts +48 -0
  6. package/dist/aiws-paths.js +129 -0
  7. package/dist/aiws-paths.js.map +1 -0
  8. package/dist/backup.d.ts +27 -0
  9. package/dist/backup.js +125 -0
  10. package/dist/backup.js.map +1 -0
  11. package/dist/cli.d.ts +1 -0
  12. package/dist/cli.js +773 -0
  13. package/dist/cli.js.map +1 -0
  14. package/dist/codex-prompts.d.ts +17 -0
  15. package/dist/codex-prompts.js +49 -0
  16. package/dist/codex-prompts.js.map +1 -0
  17. package/dist/codex-skills.d.ts +17 -0
  18. package/dist/codex-skills.js +75 -0
  19. package/dist/codex-skills.js.map +1 -0
  20. package/dist/commands/change-advice.d.ts +25 -0
  21. package/dist/commands/change-advice.js +197 -0
  22. package/dist/commands/change-advice.js.map +1 -0
  23. package/dist/commands/change-evidence-command.d.ts +29 -0
  24. package/dist/commands/change-evidence-command.js +213 -0
  25. package/dist/commands/change-evidence-command.js.map +1 -0
  26. package/dist/commands/change-evidence-entry.d.ts +16 -0
  27. package/dist/commands/change-evidence-entry.js +35 -0
  28. package/dist/commands/change-evidence-entry.js.map +1 -0
  29. package/dist/commands/change-evidence.d.ts +108 -0
  30. package/dist/commands/change-evidence.js +341 -0
  31. package/dist/commands/change-evidence.js.map +1 -0
  32. package/dist/commands/change-finish.d.ts +71 -0
  33. package/dist/commands/change-finish.js +387 -0
  34. package/dist/commands/change-finish.js.map +1 -0
  35. package/dist/commands/change-git-status.d.ts +22 -0
  36. package/dist/commands/change-git-status.js +50 -0
  37. package/dist/commands/change-git-status.js.map +1 -0
  38. package/dist/commands/change-lifecycle-entry.d.ts +29 -0
  39. package/{src → dist}/commands/change-lifecycle-entry.js +21 -28
  40. package/dist/commands/change-lifecycle-entry.js.map +1 -0
  41. package/dist/commands/change-lifecycle.d.ts +56 -0
  42. package/dist/commands/change-lifecycle.js +211 -0
  43. package/dist/commands/change-lifecycle.js.map +1 -0
  44. package/dist/commands/change-metrics-command.d.ts +12 -0
  45. package/dist/commands/change-metrics-command.js +110 -0
  46. package/dist/commands/change-metrics-command.js.map +1 -0
  47. package/dist/commands/change-next-command.d.ts +18 -0
  48. package/dist/commands/change-next-command.js +138 -0
  49. package/dist/commands/change-next-command.js.map +1 -0
  50. package/dist/commands/change-review-gates.d.ts +107 -0
  51. package/dist/commands/change-review-gates.js +329 -0
  52. package/dist/commands/change-review-gates.js.map +1 -0
  53. package/dist/commands/change-scope-gate.d.ts +21 -0
  54. package/dist/commands/change-scope-gate.js +32 -0
  55. package/dist/commands/change-scope-gate.js.map +1 -0
  56. package/dist/commands/change-start.d.ts +30 -0
  57. package/dist/commands/change-start.js +91 -0
  58. package/dist/commands/change-start.js.map +1 -0
  59. package/dist/commands/change-state-command.d.ts +3 -0
  60. package/dist/commands/change-state-command.js +32 -0
  61. package/dist/commands/change-state-command.js.map +1 -0
  62. package/dist/commands/change-status-command.d.ts +13 -0
  63. package/dist/commands/change-status-command.js +126 -0
  64. package/dist/commands/change-status-command.js.map +1 -0
  65. package/dist/commands/change-status-context.d.ts +58 -0
  66. package/dist/commands/change-status-context.js +166 -0
  67. package/dist/commands/change-status-context.js.map +1 -0
  68. package/dist/commands/change-task-stats.d.ts +24 -0
  69. package/dist/commands/change-task-stats.js +66 -0
  70. package/dist/commands/change-task-stats.js.map +1 -0
  71. package/dist/commands/change-validate-entry.d.ts +17 -0
  72. package/dist/commands/change-validate-entry.js +44 -0
  73. package/dist/commands/change-validate-entry.js.map +1 -0
  74. package/dist/commands/change-validate.d.ts +32 -0
  75. package/dist/commands/change-validate.js +128 -0
  76. package/dist/commands/change-validate.js.map +1 -0
  77. package/dist/commands/change.d.ts +322 -0
  78. package/dist/commands/change.js +1731 -0
  79. package/dist/commands/change.js.map +1 -0
  80. package/dist/commands/codex-install-prompts.d.ts +4 -0
  81. package/dist/commands/codex-install-prompts.js +68 -0
  82. package/dist/commands/codex-install-prompts.js.map +1 -0
  83. package/dist/commands/codex-install-skills.d.ts +4 -0
  84. package/dist/commands/codex-install-skills.js +74 -0
  85. package/dist/commands/codex-install-skills.js.map +1 -0
  86. package/dist/commands/codex-status-prompts.d.ts +4 -0
  87. package/dist/commands/codex-status-prompts.js +44 -0
  88. package/dist/commands/codex-status-prompts.js.map +1 -0
  89. package/dist/commands/codex-status-skills.d.ts +4 -0
  90. package/dist/commands/codex-status-skills.js +54 -0
  91. package/dist/commands/codex-status-skills.js.map +1 -0
  92. package/dist/commands/codex-uninstall-prompts.d.ts +4 -0
  93. package/dist/commands/codex-uninstall-prompts.js +51 -0
  94. package/dist/commands/codex-uninstall-prompts.js.map +1 -0
  95. package/dist/commands/codex-uninstall-skills.d.ts +4 -0
  96. package/dist/commands/codex-uninstall-skills.js +59 -0
  97. package/dist/commands/codex-uninstall-skills.js.map +1 -0
  98. package/dist/commands/dashboard.d.ts +222 -0
  99. package/dist/commands/dashboard.js +193 -0
  100. package/dist/commands/dashboard.js.map +1 -0
  101. package/dist/commands/hooks-install.d.ts +4 -0
  102. package/dist/commands/hooks-install.js +90 -0
  103. package/dist/commands/hooks-install.js.map +1 -0
  104. package/dist/commands/hooks-status.d.ts +4 -0
  105. package/dist/commands/hooks-status.js +89 -0
  106. package/dist/commands/hooks-status.js.map +1 -0
  107. package/dist/commands/init.d.ts +4 -0
  108. package/dist/commands/init.js +100 -0
  109. package/dist/commands/init.js.map +1 -0
  110. package/dist/commands/opencode-auto.d.ts +11 -0
  111. package/dist/commands/opencode-auto.js +158 -0
  112. package/dist/commands/opencode-auto.js.map +1 -0
  113. package/dist/commands/opencode-status.d.ts +4 -0
  114. package/dist/commands/opencode-status.js +75 -0
  115. package/dist/commands/opencode-status.js.map +1 -0
  116. package/dist/commands/opencode-supervise.d.ts +24 -0
  117. package/dist/commands/opencode-supervise.js +188 -0
  118. package/dist/commands/opencode-supervise.js.map +1 -0
  119. package/dist/commands/rollback.d.ts +4 -0
  120. package/dist/commands/rollback.js +12 -0
  121. package/dist/commands/rollback.js.map +1 -0
  122. package/dist/commands/update.d.ts +4 -0
  123. package/dist/commands/update.js +212 -0
  124. package/dist/commands/update.js.map +1 -0
  125. package/dist/commands/validate.d.ts +4 -0
  126. package/dist/commands/validate.js +222 -0
  127. package/dist/commands/validate.js.map +1 -0
  128. package/dist/commands/ws-commit.d.ts +5 -0
  129. package/dist/commands/ws-commit.js +39 -0
  130. package/dist/commands/ws-commit.js.map +1 -0
  131. package/dist/commands/ws-deliver.d.ts +5 -0
  132. package/dist/commands/ws-deliver.js +59 -0
  133. package/dist/commands/ws-deliver.js.map +1 -0
  134. package/dist/commands/ws-finish.d.ts +5 -0
  135. package/dist/commands/ws-finish.js +142 -0
  136. package/dist/commands/ws-finish.js.map +1 -0
  137. package/dist/commands/ws-handoff.d.ts +5 -0
  138. package/dist/commands/ws-handoff.js +35 -0
  139. package/dist/commands/ws-handoff.js.map +1 -0
  140. package/dist/commands/ws-migrate.d.ts +5 -0
  141. package/dist/commands/ws-migrate.js +41 -0
  142. package/dist/commands/ws-migrate.js.map +1 -0
  143. package/dist/commands/ws-plan-verify.d.ts +5 -0
  144. package/dist/commands/ws-plan-verify.js +38 -0
  145. package/dist/commands/ws-plan-verify.js.map +1 -0
  146. package/dist/commands/ws-pull.d.ts +5 -0
  147. package/dist/commands/ws-pull.js +26 -0
  148. package/dist/commands/ws-pull.js.map +1 -0
  149. package/dist/commands/ws-push.d.ts +5 -0
  150. package/dist/commands/ws-push.js +68 -0
  151. package/dist/commands/ws-push.js.map +1 -0
  152. package/dist/commands/ws-submodule-setup.d.ts +5 -0
  153. package/dist/commands/ws-submodule-setup.js +55 -0
  154. package/dist/commands/ws-submodule-setup.js.map +1 -0
  155. package/dist/commands/ws-verify-before-complete.d.ts +5 -0
  156. package/dist/commands/ws-verify-before-complete.js +35 -0
  157. package/dist/commands/ws-verify-before-complete.js.map +1 -0
  158. package/dist/dashboard/app.d.ts +1 -0
  159. package/dist/dashboard/app.js +370 -0
  160. package/dist/dashboard/app.js.map +1 -0
  161. package/dist/delegation/cli.d.ts +6 -0
  162. package/dist/delegation/cli.js +14 -0
  163. package/dist/delegation/cli.js.map +1 -0
  164. package/dist/delegation/index.d.ts +35 -0
  165. package/dist/delegation/index.js +118 -0
  166. package/dist/delegation/index.js.map +1 -0
  167. package/dist/errors.d.ts +8 -0
  168. package/dist/errors.js +11 -0
  169. package/dist/errors.js.map +1 -0
  170. package/dist/exec.d.ts +9 -0
  171. package/dist/exec.js +22 -0
  172. package/dist/exec.js.map +1 -0
  173. package/dist/fs.d.ts +9 -0
  174. package/dist/fs.js +62 -0
  175. package/dist/fs.js.map +1 -0
  176. package/dist/governance.d.ts +10 -0
  177. package/dist/governance.js +135 -0
  178. package/dist/governance.js.map +1 -0
  179. package/dist/hash.d.ts +3 -0
  180. package/dist/hash.js +13 -0
  181. package/dist/hash.js.map +1 -0
  182. package/dist/hooks/deploy-claude.d.ts +13 -0
  183. package/dist/hooks/deploy-claude.js +67 -0
  184. package/dist/hooks/deploy-claude.js.map +1 -0
  185. package/dist/journal.d.ts +22 -0
  186. package/dist/journal.js +112 -0
  187. package/dist/journal.js.map +1 -0
  188. package/dist/json-schema-lite.d.ts +22 -0
  189. package/dist/json-schema-lite.js +148 -0
  190. package/dist/json-schema-lite.js.map +1 -0
  191. package/dist/managed-blocks.d.ts +24 -0
  192. package/dist/managed-blocks.js +84 -0
  193. package/dist/managed-blocks.js.map +1 -0
  194. package/dist/manifest.d.ts +24 -0
  195. package/dist/manifest.js +145 -0
  196. package/dist/manifest.js.map +1 -0
  197. package/dist/opencode-env.d.ts +62 -0
  198. package/dist/opencode-env.js +178 -0
  199. package/dist/opencode-env.js.map +1 -0
  200. package/dist/path-utils.d.ts +2 -0
  201. package/dist/path-utils.js +8 -0
  202. package/dist/path-utils.js.map +1 -0
  203. package/dist/spec.d.ts +17 -0
  204. package/dist/spec.js +174 -0
  205. package/dist/spec.js.map +1 -0
  206. package/dist/template.d.ts +20 -0
  207. package/dist/template.js +123 -0
  208. package/dist/template.js.map +1 -0
  209. package/dist/workspace.d.ts +4 -0
  210. package/dist/workspace.js +19 -0
  211. package/dist/workspace.js.map +1 -0
  212. package/package.json +11 -3
  213. package/src/aiws-package.js +0 -15
  214. package/src/backup.js +0 -149
  215. package/src/cli.js +0 -760
  216. package/src/codex-prompts.js +0 -74
  217. package/src/codex-skills.js +0 -111
  218. package/src/commands/change-advice.js +0 -181
  219. package/src/commands/change-evidence-command.js +0 -242
  220. package/src/commands/change-evidence-entry.js +0 -40
  221. package/src/commands/change-evidence.js +0 -340
  222. package/src/commands/change-finish.js +0 -413
  223. package/src/commands/change-git-status.js +0 -53
  224. package/src/commands/change-lifecycle.js +0 -236
  225. package/src/commands/change-metrics-command.js +0 -110
  226. package/src/commands/change-next-command.js +0 -133
  227. package/src/commands/change-review-gates.js +0 -331
  228. package/src/commands/change-scope-gate.js +0 -34
  229. package/src/commands/change-start.js +0 -85
  230. package/src/commands/change-state-command.js +0 -40
  231. package/src/commands/change-status-command.js +0 -125
  232. package/src/commands/change-status-context.js +0 -173
  233. package/src/commands/change-task-stats.js +0 -64
  234. package/src/commands/change-validate-entry.js +0 -45
  235. package/src/commands/change-validate.js +0 -127
  236. package/src/commands/change.js +0 -1829
  237. package/src/commands/codex-install-prompts.js +0 -68
  238. package/src/commands/codex-install-skills.js +0 -74
  239. package/src/commands/codex-status-prompts.js +0 -55
  240. package/src/commands/codex-status-skills.js +0 -63
  241. package/src/commands/codex-uninstall-prompts.js +0 -55
  242. package/src/commands/codex-uninstall-skills.js +0 -62
  243. package/src/commands/dashboard.js +0 -205
  244. package/src/commands/hooks-install.js +0 -92
  245. package/src/commands/hooks-status.js +0 -95
  246. package/src/commands/init.js +0 -101
  247. package/src/commands/opencode-auto.js +0 -167
  248. package/src/commands/opencode-status.js +0 -103
  249. package/src/commands/opencode-supervise.js +0 -200
  250. package/src/commands/rollback.js +0 -13
  251. package/src/commands/update.js +0 -145
  252. package/src/commands/validate.js +0 -228
  253. package/src/commands/ws-commit.js +0 -44
  254. package/src/commands/ws-deliver.js +0 -67
  255. package/src/commands/ws-finish.js +0 -83
  256. package/src/commands/ws-handoff.js +0 -40
  257. package/src/commands/ws-migrate.js +0 -41
  258. package/src/commands/ws-plan-verify.js +0 -44
  259. package/src/commands/ws-pull.js +0 -30
  260. package/src/commands/ws-push.js +0 -71
  261. package/src/commands/ws-submodule-setup.js +0 -65
  262. package/src/commands/ws-verify-before-complete.js +0 -39
  263. package/src/dashboard/app.js +0 -371
  264. package/src/errors.js +0 -15
  265. package/src/exec.js +0 -34
  266. package/src/fs.js +0 -91
  267. package/src/governance.js +0 -159
  268. package/src/hash.js +0 -25
  269. package/src/json-schema-lite.js +0 -164
  270. package/src/managed-blocks.js +0 -131
  271. package/src/manifest.js +0 -177
  272. package/src/opencode-env.js +0 -208
  273. package/src/path-utils.js +0 -20
  274. package/src/spec.js +0 -195
  275. package/src/template.js +0 -187
  276. package/src/workspace.js +0 -23
  277. /package/{src → dist}/dashboard/index.html +0 -0
  278. /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
+ }>;