@aipper/aiws 0.0.28 → 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 (267) hide show
  1. package/README.md +18 -2
  2. package/bin/aiws.js +2 -2
  3. package/dist/aiws-package.d.ts +4 -0
  4. package/dist/aiws-package.js +11 -0
  5. package/dist/aiws-package.js.map +1 -0
  6. package/dist/aiws-paths.d.ts +48 -0
  7. package/dist/aiws-paths.js +129 -0
  8. package/dist/aiws-paths.js.map +1 -0
  9. package/dist/backup.d.ts +27 -0
  10. package/dist/backup.js +125 -0
  11. package/dist/backup.js.map +1 -0
  12. package/dist/cli.d.ts +1 -0
  13. package/dist/cli.js +773 -0
  14. package/dist/cli.js.map +1 -0
  15. package/dist/codex-prompts.d.ts +17 -0
  16. package/dist/codex-prompts.js +49 -0
  17. package/dist/codex-prompts.js.map +1 -0
  18. package/dist/codex-skills.d.ts +17 -0
  19. package/dist/codex-skills.js +75 -0
  20. package/dist/codex-skills.js.map +1 -0
  21. package/dist/commands/change-advice.d.ts +25 -0
  22. package/dist/commands/change-advice.js +197 -0
  23. package/dist/commands/change-advice.js.map +1 -0
  24. package/dist/commands/change-evidence-command.d.ts +29 -0
  25. package/dist/commands/change-evidence-command.js +213 -0
  26. package/dist/commands/change-evidence-command.js.map +1 -0
  27. package/dist/commands/change-evidence-entry.d.ts +16 -0
  28. package/dist/commands/change-evidence-entry.js +35 -0
  29. package/dist/commands/change-evidence-entry.js.map +1 -0
  30. package/dist/commands/change-evidence.d.ts +108 -0
  31. package/dist/commands/change-evidence.js +341 -0
  32. package/dist/commands/change-evidence.js.map +1 -0
  33. package/dist/commands/change-finish.d.ts +71 -0
  34. package/dist/commands/change-finish.js +387 -0
  35. package/dist/commands/change-finish.js.map +1 -0
  36. package/dist/commands/change-git-status.d.ts +22 -0
  37. package/dist/commands/change-git-status.js +50 -0
  38. package/dist/commands/change-git-status.js.map +1 -0
  39. package/dist/commands/change-lifecycle-entry.d.ts +29 -0
  40. package/{src → dist}/commands/change-lifecycle-entry.js +21 -28
  41. package/dist/commands/change-lifecycle-entry.js.map +1 -0
  42. package/dist/commands/change-lifecycle.d.ts +56 -0
  43. package/dist/commands/change-lifecycle.js +211 -0
  44. package/dist/commands/change-lifecycle.js.map +1 -0
  45. package/dist/commands/change-metrics-command.d.ts +12 -0
  46. package/dist/commands/change-metrics-command.js +110 -0
  47. package/dist/commands/change-metrics-command.js.map +1 -0
  48. package/dist/commands/change-next-command.d.ts +18 -0
  49. package/dist/commands/change-next-command.js +138 -0
  50. package/dist/commands/change-next-command.js.map +1 -0
  51. package/dist/commands/change-review-gates.d.ts +107 -0
  52. package/dist/commands/change-review-gates.js +329 -0
  53. package/dist/commands/change-review-gates.js.map +1 -0
  54. package/dist/commands/change-scope-gate.d.ts +21 -0
  55. package/dist/commands/change-scope-gate.js +32 -0
  56. package/dist/commands/change-scope-gate.js.map +1 -0
  57. package/dist/commands/change-start.d.ts +30 -0
  58. package/dist/commands/change-start.js +91 -0
  59. package/dist/commands/change-start.js.map +1 -0
  60. package/dist/commands/change-state-command.d.ts +3 -0
  61. package/dist/commands/change-state-command.js +32 -0
  62. package/dist/commands/change-state-command.js.map +1 -0
  63. package/dist/commands/change-status-command.d.ts +13 -0
  64. package/dist/commands/change-status-command.js +126 -0
  65. package/dist/commands/change-status-command.js.map +1 -0
  66. package/dist/commands/change-status-context.d.ts +58 -0
  67. package/dist/commands/change-status-context.js +166 -0
  68. package/dist/commands/change-status-context.js.map +1 -0
  69. package/dist/commands/change-task-stats.d.ts +24 -0
  70. package/dist/commands/change-task-stats.js +66 -0
  71. package/dist/commands/change-task-stats.js.map +1 -0
  72. package/dist/commands/change-validate-entry.d.ts +17 -0
  73. package/dist/commands/change-validate-entry.js +44 -0
  74. package/dist/commands/change-validate-entry.js.map +1 -0
  75. package/dist/commands/change-validate.d.ts +32 -0
  76. package/dist/commands/change-validate.js +128 -0
  77. package/dist/commands/change-validate.js.map +1 -0
  78. package/dist/commands/change.d.ts +322 -0
  79. package/dist/commands/change.js +1731 -0
  80. package/dist/commands/change.js.map +1 -0
  81. package/dist/commands/codex-install-prompts.d.ts +4 -0
  82. package/dist/commands/codex-install-prompts.js +68 -0
  83. package/dist/commands/codex-install-prompts.js.map +1 -0
  84. package/dist/commands/codex-install-skills.d.ts +4 -0
  85. package/dist/commands/codex-install-skills.js +74 -0
  86. package/dist/commands/codex-install-skills.js.map +1 -0
  87. package/dist/commands/codex-status-prompts.d.ts +4 -0
  88. package/dist/commands/codex-status-prompts.js +44 -0
  89. package/dist/commands/codex-status-prompts.js.map +1 -0
  90. package/dist/commands/codex-status-skills.d.ts +4 -0
  91. package/dist/commands/codex-status-skills.js +54 -0
  92. package/dist/commands/codex-status-skills.js.map +1 -0
  93. package/dist/commands/codex-uninstall-prompts.d.ts +4 -0
  94. package/dist/commands/codex-uninstall-prompts.js +51 -0
  95. package/dist/commands/codex-uninstall-prompts.js.map +1 -0
  96. package/dist/commands/codex-uninstall-skills.d.ts +4 -0
  97. package/dist/commands/codex-uninstall-skills.js +59 -0
  98. package/dist/commands/codex-uninstall-skills.js.map +1 -0
  99. package/dist/commands/dashboard.d.ts +222 -0
  100. package/dist/commands/dashboard.js +193 -0
  101. package/dist/commands/dashboard.js.map +1 -0
  102. package/dist/commands/hooks-install.d.ts +4 -0
  103. package/dist/commands/hooks-install.js +90 -0
  104. package/dist/commands/hooks-install.js.map +1 -0
  105. package/dist/commands/hooks-status.d.ts +4 -0
  106. package/dist/commands/hooks-status.js +89 -0
  107. package/dist/commands/hooks-status.js.map +1 -0
  108. package/dist/commands/init.d.ts +4 -0
  109. package/dist/commands/init.js +100 -0
  110. package/dist/commands/init.js.map +1 -0
  111. package/dist/commands/opencode-auto.d.ts +11 -0
  112. package/dist/commands/opencode-auto.js +158 -0
  113. package/dist/commands/opencode-auto.js.map +1 -0
  114. package/dist/commands/opencode-status.d.ts +4 -0
  115. package/dist/commands/opencode-status.js +75 -0
  116. package/dist/commands/opencode-status.js.map +1 -0
  117. package/dist/commands/opencode-supervise.d.ts +24 -0
  118. package/dist/commands/opencode-supervise.js +188 -0
  119. package/dist/commands/opencode-supervise.js.map +1 -0
  120. package/dist/commands/rollback.d.ts +4 -0
  121. package/dist/commands/rollback.js +12 -0
  122. package/dist/commands/rollback.js.map +1 -0
  123. package/dist/commands/update.d.ts +4 -0
  124. package/dist/commands/update.js +212 -0
  125. package/dist/commands/update.js.map +1 -0
  126. package/dist/commands/validate.d.ts +4 -0
  127. package/dist/commands/validate.js +222 -0
  128. package/dist/commands/validate.js.map +1 -0
  129. package/dist/commands/ws-commit.d.ts +5 -0
  130. package/dist/commands/ws-commit.js +39 -0
  131. package/dist/commands/ws-commit.js.map +1 -0
  132. package/dist/commands/ws-deliver.d.ts +5 -0
  133. package/dist/commands/ws-deliver.js +59 -0
  134. package/dist/commands/ws-deliver.js.map +1 -0
  135. package/dist/commands/ws-finish.d.ts +5 -0
  136. package/dist/commands/ws-finish.js +142 -0
  137. package/dist/commands/ws-finish.js.map +1 -0
  138. package/dist/commands/ws-handoff.d.ts +5 -0
  139. package/dist/commands/ws-handoff.js +35 -0
  140. package/dist/commands/ws-handoff.js.map +1 -0
  141. package/dist/commands/ws-migrate.d.ts +5 -0
  142. package/dist/commands/ws-migrate.js +41 -0
  143. package/dist/commands/ws-migrate.js.map +1 -0
  144. package/dist/commands/ws-plan-verify.d.ts +5 -0
  145. package/dist/commands/ws-plan-verify.js +38 -0
  146. package/dist/commands/ws-plan-verify.js.map +1 -0
  147. package/dist/commands/ws-pull.d.ts +5 -0
  148. package/dist/commands/ws-pull.js +26 -0
  149. package/dist/commands/ws-pull.js.map +1 -0
  150. package/dist/commands/ws-push.d.ts +5 -0
  151. package/dist/commands/ws-push.js +68 -0
  152. package/dist/commands/ws-push.js.map +1 -0
  153. package/dist/commands/ws-submodule-setup.d.ts +5 -0
  154. package/dist/commands/ws-submodule-setup.js +55 -0
  155. package/dist/commands/ws-submodule-setup.js.map +1 -0
  156. package/dist/commands/ws-verify-before-complete.d.ts +5 -0
  157. package/dist/commands/ws-verify-before-complete.js +35 -0
  158. package/dist/commands/ws-verify-before-complete.js.map +1 -0
  159. package/dist/dashboard/app.d.ts +1 -0
  160. package/dist/dashboard/app.js +370 -0
  161. package/dist/dashboard/app.js.map +1 -0
  162. package/dist/delegation/cli.d.ts +6 -0
  163. package/dist/delegation/cli.js +14 -0
  164. package/dist/delegation/cli.js.map +1 -0
  165. package/dist/delegation/index.d.ts +35 -0
  166. package/dist/delegation/index.js +118 -0
  167. package/dist/delegation/index.js.map +1 -0
  168. package/dist/errors.d.ts +8 -0
  169. package/dist/errors.js +11 -0
  170. package/dist/errors.js.map +1 -0
  171. package/dist/exec.d.ts +9 -0
  172. package/dist/exec.js +22 -0
  173. package/dist/exec.js.map +1 -0
  174. package/dist/fs.d.ts +9 -0
  175. package/dist/fs.js +62 -0
  176. package/dist/fs.js.map +1 -0
  177. package/dist/governance.d.ts +10 -0
  178. package/dist/governance.js +135 -0
  179. package/dist/governance.js.map +1 -0
  180. package/dist/hash.d.ts +3 -0
  181. package/dist/hash.js +13 -0
  182. package/dist/hash.js.map +1 -0
  183. package/dist/hooks/deploy-claude.d.ts +13 -0
  184. package/dist/hooks/deploy-claude.js +67 -0
  185. package/dist/hooks/deploy-claude.js.map +1 -0
  186. package/dist/journal.d.ts +22 -0
  187. package/dist/journal.js +112 -0
  188. package/dist/journal.js.map +1 -0
  189. package/dist/json-schema-lite.d.ts +22 -0
  190. package/dist/json-schema-lite.js +148 -0
  191. package/dist/json-schema-lite.js.map +1 -0
  192. package/dist/managed-blocks.d.ts +24 -0
  193. package/dist/managed-blocks.js +84 -0
  194. package/dist/managed-blocks.js.map +1 -0
  195. package/dist/manifest.d.ts +24 -0
  196. package/dist/manifest.js +145 -0
  197. package/dist/manifest.js.map +1 -0
  198. package/dist/opencode-env.d.ts +62 -0
  199. package/dist/opencode-env.js +178 -0
  200. package/dist/opencode-env.js.map +1 -0
  201. package/dist/path-utils.d.ts +2 -0
  202. package/dist/path-utils.js +8 -0
  203. package/dist/path-utils.js.map +1 -0
  204. package/dist/spec.d.ts +17 -0
  205. package/dist/spec.js +174 -0
  206. package/dist/spec.js.map +1 -0
  207. package/dist/template.d.ts +20 -0
  208. package/dist/template.js +123 -0
  209. package/dist/template.js.map +1 -0
  210. package/dist/workspace.d.ts +4 -0
  211. package/dist/workspace.js +19 -0
  212. package/dist/workspace.js.map +1 -0
  213. package/package.json +11 -3
  214. package/src/aiws-package.js +0 -15
  215. package/src/backup.js +0 -149
  216. package/src/cli.js +0 -647
  217. package/src/codex-prompts.js +0 -74
  218. package/src/codex-skills.js +0 -111
  219. package/src/commands/change-advice.js +0 -200
  220. package/src/commands/change-evidence-command.js +0 -242
  221. package/src/commands/change-evidence-entry.js +0 -40
  222. package/src/commands/change-evidence.js +0 -340
  223. package/src/commands/change-finish.js +0 -484
  224. package/src/commands/change-git-status.js +0 -53
  225. package/src/commands/change-lifecycle.js +0 -236
  226. package/src/commands/change-metrics-command.js +0 -110
  227. package/src/commands/change-next-command.js +0 -129
  228. package/src/commands/change-review-gates.js +0 -315
  229. package/src/commands/change-scope-gate.js +0 -34
  230. package/src/commands/change-start.js +0 -120
  231. package/src/commands/change-state-command.js +0 -40
  232. package/src/commands/change-status-command.js +0 -134
  233. package/src/commands/change-status-context.js +0 -202
  234. package/src/commands/change-task-stats.js +0 -64
  235. package/src/commands/change-validate-entry.js +0 -45
  236. package/src/commands/change-validate.js +0 -127
  237. package/src/commands/change.js +0 -2087
  238. package/src/commands/codex-install-prompts.js +0 -68
  239. package/src/commands/codex-install-skills.js +0 -74
  240. package/src/commands/codex-status-prompts.js +0 -55
  241. package/src/commands/codex-status-skills.js +0 -63
  242. package/src/commands/codex-uninstall-prompts.js +0 -55
  243. package/src/commands/codex-uninstall-skills.js +0 -62
  244. package/src/commands/dashboard.js +0 -205
  245. package/src/commands/hooks-install.js +0 -92
  246. package/src/commands/hooks-status.js +0 -95
  247. package/src/commands/init.js +0 -93
  248. package/src/commands/opencode-status.js +0 -61
  249. package/src/commands/rollback.js +0 -13
  250. package/src/commands/update.js +0 -133
  251. package/src/commands/validate.js +0 -222
  252. package/src/dashboard/app.js +0 -371
  253. package/src/errors.js +0 -15
  254. package/src/exec.js +0 -34
  255. package/src/fs.js +0 -91
  256. package/src/governance.js +0 -159
  257. package/src/hash.js +0 -25
  258. package/src/json-schema-lite.js +0 -164
  259. package/src/managed-blocks.js +0 -131
  260. package/src/manifest.js +0 -153
  261. package/src/opencode-env.js +0 -76
  262. package/src/path-utils.js +0 -20
  263. package/src/spec.js +0 -195
  264. package/src/template.js +0 -187
  265. package/src/workspace.js +0 -23
  266. /package/{src → dist}/dashboard/index.html +0 -0
  267. /package/{src → dist}/dashboard/style.css +0 -0
@@ -0,0 +1,329 @@
1
+ import path from "node:path";
2
+ import fs from "node:fs/promises";
3
+ import { pathExists } from "../fs.js";
4
+ import { loadWorkflowReviewGates } from "../spec.js";
5
+ export const TMP_REVIEW_FALLBACKS = [
6
+ { fileName: "codex-review.md", persistentKind: "review" },
7
+ { fileName: "spec-review.md", persistentKind: "review" },
8
+ { fileName: "quality-review.md", persistentKind: "review" },
9
+ { fileName: "verify-before-complete.md", persistentKind: "evidence" },
10
+ ];
11
+ /**
12
+ * @param {string} input
13
+ */
14
+ function normalizeSlashes(input) {
15
+ return String(input || "").replaceAll("\\", "/");
16
+ }
17
+ /**
18
+ * @param {string} gitRoot
19
+ * @param {string} absPath
20
+ */
21
+ function relFromRoot(gitRoot, absPath) {
22
+ return normalizeSlashes(path.relative(gitRoot, absPath));
23
+ }
24
+ /**
25
+ * @param {string} gitRoot
26
+ * @param {string} fileName
27
+ */
28
+ export function tmpReviewFallbackPath(gitRoot, fileName) {
29
+ return path.join(gitRoot, ".aiws", "tmp", "review", fileName);
30
+ }
31
+ /**
32
+ * @param {string} gitRoot
33
+ * @param {string} changeId
34
+ * @param {string} fileName
35
+ */
36
+ function persistentReviewPath(gitRoot, changeId, fileName) {
37
+ return path.join(gitRoot, ".aiws", "changes", changeId, "review", fileName);
38
+ }
39
+ /**
40
+ * @param {string} gitRoot
41
+ * @param {string} changeId
42
+ * @param {string} fileName
43
+ */
44
+ function persistentEvidencePath(gitRoot, changeId, fileName) {
45
+ return path.join(gitRoot, ".aiws", "changes", changeId, "evidence", fileName);
46
+ }
47
+ /**
48
+ * @param {string} gitRoot
49
+ * @param {string} changeId
50
+ */
51
+ async function hasGenericReviewSignal(gitRoot, changeId) {
52
+ const persistentCodexReview = persistentReviewPath(gitRoot, changeId, "codex-review.md");
53
+ if (await pathExists(persistentCodexReview))
54
+ return true;
55
+ const tmpCodexReview = tmpReviewFallbackPath(gitRoot, "codex-review.md");
56
+ return await pathExists(tmpCodexReview);
57
+ }
58
+ /**
59
+ * @param {string} gitRoot
60
+ * @param {string} changeId
61
+ * @param {string} gateId
62
+ */
63
+ function reviewGateArtifactPaths(gitRoot, changeId, gateId) {
64
+ switch (gateId) {
65
+ case "spec_review":
66
+ return {
67
+ primaryAbs: persistentReviewPath(gitRoot, changeId, "spec-review.md"),
68
+ fallbackAbs: tmpReviewFallbackPath(gitRoot, "spec-review.md"),
69
+ };
70
+ case "quality_review":
71
+ return {
72
+ primaryAbs: persistentReviewPath(gitRoot, changeId, "quality-review.md"),
73
+ fallbackAbs: tmpReviewFallbackPath(gitRoot, "quality-review.md"),
74
+ };
75
+ case "verify_before_complete":
76
+ return {
77
+ primaryAbs: persistentEvidencePath(gitRoot, changeId, "verify-before-complete.md"),
78
+ fallbackAbs: tmpReviewFallbackPath(gitRoot, "verify-before-complete.md"),
79
+ };
80
+ default:
81
+ return null;
82
+ }
83
+ }
84
+ /**
85
+ * @param {string} absDir
86
+ * @param {(fileName: string) => boolean} predicate
87
+ */
88
+ async function findLatestFileByMtime(absDir, predicate) {
89
+ /** @type {Array<{ abs: string, mtimeMs: number }>} */
90
+ const matches = [];
91
+ if (!(await pathExists(absDir)))
92
+ return "";
93
+ try {
94
+ const entries = await fs.readdir(absDir, { withFileTypes: true });
95
+ for (const entry of entries) {
96
+ if (!entry.isFile())
97
+ continue;
98
+ if (!predicate(entry.name))
99
+ continue;
100
+ const abs = path.join(absDir, entry.name);
101
+ const st = await fs.stat(abs);
102
+ matches.push({ abs, mtimeMs: st.mtimeMs });
103
+ }
104
+ }
105
+ catch {
106
+ return "";
107
+ }
108
+ matches.sort((a, b) => b.mtimeMs - a.mtimeMs);
109
+ return matches[0]?.abs || "";
110
+ }
111
+ /**
112
+ * @param {string} gitRoot
113
+ */
114
+ async function listActiveChangeIds(gitRoot) {
115
+ const changesRoot = path.join(gitRoot, ".aiws", "changes");
116
+ try {
117
+ const entries = await fs.readdir(changesRoot, { withFileTypes: true });
118
+ return entries
119
+ .filter((entry) => entry.isDirectory())
120
+ .map((entry) => entry.name)
121
+ .filter((name) => name && !name.startsWith(".") && name !== "archive" && name !== "templates")
122
+ .sort();
123
+ }
124
+ catch {
125
+ return [];
126
+ }
127
+ }
128
+ /**
129
+ * @param {string} gitRoot
130
+ * @param {string} changeId
131
+ * @param {{ branchMatchesChange?: boolean }} [context]
132
+ */
133
+ async function canAttributeTmpReviewFallback(gitRoot, changeId, context) {
134
+ if (context?.branchMatchesChange === true)
135
+ return true;
136
+ const activeChangeIds = await listActiveChangeIds(gitRoot);
137
+ return activeChangeIds.length === 1 && activeChangeIds[0] === changeId;
138
+ }
139
+ /**
140
+ * @param {string} gitRoot
141
+ * @param {string} changeId
142
+ * @param {{ branchMatchesChange?: boolean }} [context]
143
+ * @param {{ counts?: { review?: number } }} [collaboration]
144
+ */
145
+ export async function collectReviewSignals(gitRoot, changeId, context, collaboration) {
146
+ const persistentCount = Number(collaboration?.counts?.review || 0);
147
+ const tmpFallbackPaths = [];
148
+ const canAttributeTmpFallback = await canAttributeTmpReviewFallback(gitRoot, changeId, context);
149
+ for (const { fileName, persistentKind } of TMP_REVIEW_FALLBACKS) {
150
+ if (persistentKind !== "review")
151
+ continue;
152
+ const tmpReviewPath = tmpReviewFallbackPath(gitRoot, fileName);
153
+ if (!(await pathExists(tmpReviewPath)))
154
+ continue;
155
+ const persistentPath = persistentReviewPath(gitRoot, changeId, fileName);
156
+ if (await pathExists(persistentPath))
157
+ continue;
158
+ if (!canAttributeTmpFallback)
159
+ continue;
160
+ tmpFallbackPaths.push(relFromRoot(gitRoot, tmpReviewPath));
161
+ }
162
+ const tmpFallbackExists = tmpFallbackPaths.length > 0;
163
+ const effectiveCount = persistentCount + tmpFallbackPaths.length;
164
+ let source = "none";
165
+ if (persistentCount > 0 && tmpFallbackExists)
166
+ source = "persistent+tmp_fallback";
167
+ else if (persistentCount > 0)
168
+ source = "persistent";
169
+ else if (tmpFallbackExists)
170
+ source = "tmp_fallback";
171
+ return {
172
+ persistentCount,
173
+ tmpFallbackExists,
174
+ tmpFallbackCount: tmpFallbackPaths.length,
175
+ tmpFallbackPath: tmpFallbackPaths[0] || "",
176
+ tmpFallbackPaths,
177
+ effectiveCount,
178
+ source,
179
+ };
180
+ }
181
+ /**
182
+ * @param {string} gitRoot
183
+ * @param {string} changeId
184
+ * @param {{ branchMatchesChange?: boolean }} [context]
185
+ */
186
+ export async function collectReviewGates(gitRoot, changeId, context) {
187
+ const spec = await loadWorkflowReviewGates();
188
+ const canAttributeTmpFallback = await canAttributeTmpReviewFallback(gitRoot, changeId, context);
189
+ const genericReviewSignal = canAttributeTmpFallback ? await hasGenericReviewSignal(gitRoot, changeId) : await pathExists(persistentReviewPath(gitRoot, changeId, "codex-review.md"));
190
+ /** @type {Array<any>} */
191
+ const gates = [];
192
+ for (const gate of spec.gates) {
193
+ const paths = reviewGateArtifactPaths(gitRoot, changeId, gate.id);
194
+ if (!paths)
195
+ continue;
196
+ const primaryExists = await pathExists(paths.primaryAbs);
197
+ const fallbackExists = await pathExists(paths.fallbackAbs);
198
+ const primaryPath = relFromRoot(gitRoot, paths.primaryAbs);
199
+ const fallbackPath = relFromRoot(gitRoot, paths.fallbackAbs);
200
+ let ready = false;
201
+ let status = "missing";
202
+ let foundPath = "";
203
+ if (primaryExists) {
204
+ ready = true;
205
+ status = "persistent";
206
+ foundPath = primaryPath;
207
+ }
208
+ else if (fallbackExists && canAttributeTmpFallback) {
209
+ ready = true;
210
+ status = "tmp_fallback";
211
+ foundPath = fallbackPath;
212
+ }
213
+ else if (fallbackExists) {
214
+ ready = false;
215
+ status = "tmp_unattributed";
216
+ foundPath = fallbackPath;
217
+ }
218
+ gates.push({
219
+ id: gate.id,
220
+ name: gate.name,
221
+ stage: gate.stage,
222
+ focus: gate.focus,
223
+ next: gate.next,
224
+ ready,
225
+ status,
226
+ primaryPath,
227
+ fallbackPath,
228
+ foundPath,
229
+ });
230
+ }
231
+ const specReview = gates.find((gate) => gate.id === "spec_review") || null;
232
+ const qualityReview = gates.find((gate) => gate.id === "quality_review") || null;
233
+ const verifyBeforeComplete = gates.find((gate) => gate.id === "verify_before_complete") || null;
234
+ const validateStampDir = path.join(gitRoot, ".aiws", "tmp", "aiws-validate");
235
+ const latestValidateStamp = await findLatestFileByMtime(validateStampDir, (name) => name.endsWith(".json"));
236
+ const validateStamp = {
237
+ id: "validate_stamp",
238
+ name: "validate-stamp",
239
+ ready: Boolean(latestValidateStamp),
240
+ status: latestValidateStamp ? "latest" : "missing",
241
+ dir: relFromRoot(gitRoot, validateStampDir),
242
+ foundPath: latestValidateStamp ? relFromRoot(gitRoot, latestValidateStamp) : "",
243
+ };
244
+ const dualReviewMissingIds = [specReview, qualityReview].filter((gate) => !(gate && gate.ready)).map((gate) => gate?.id || "");
245
+ const finishGateMissingIds = [];
246
+ if (!specReview?.ready)
247
+ finishGateMissingIds.push("spec_review");
248
+ if (!qualityReview?.ready)
249
+ finishGateMissingIds.push("quality_review");
250
+ if (!validateStamp.ready)
251
+ finishGateMissingIds.push("validate_stamp");
252
+ if (!verifyBeforeComplete?.ready)
253
+ finishGateMissingIds.push("verify_before_complete");
254
+ const genericReviewOnly = genericReviewSignal && dualReviewMissingIds.length === 2;
255
+ const dualReviewPending = dualReviewMissingIds.length > 0;
256
+ return {
257
+ source: spec.source,
258
+ specVersion: spec.specVersion,
259
+ version: spec.version,
260
+ gates,
261
+ specReview,
262
+ qualityReview,
263
+ verifyBeforeComplete,
264
+ validateStamp,
265
+ summary: {
266
+ gateCount: gates.length,
267
+ gateReadyCount: gates.filter((gate) => gate.ready).length,
268
+ genericReviewOnly,
269
+ dualReviewPending,
270
+ dualReviewReady: dualReviewMissingIds.length === 0,
271
+ dualReviewMissingIds,
272
+ dualReviewMissingCount: dualReviewMissingIds.length,
273
+ finishGateReady: finishGateMissingIds.length === 0,
274
+ finishGateMissingIds,
275
+ finishGateMissingCount: finishGateMissingIds.length,
276
+ },
277
+ };
278
+ }
279
+ /**
280
+ * @param {string} changeId
281
+ * @param {any} reviewGates
282
+ */
283
+ export function collectFinishGateErrors(changeId, reviewGates) {
284
+ const summary = reviewGates?.summary && typeof reviewGates.summary === "object" ? reviewGates.summary : {};
285
+ const missingIds = Array.isArray(summary.finishGateMissingIds) ? summary.finishGateMissingIds : [];
286
+ if (missingIds.length === 0)
287
+ return [];
288
+ /** @type {string[]} */
289
+ const errors = [];
290
+ for (const missingId of missingIds) {
291
+ if (missingId === "spec_review") {
292
+ const gate = reviewGates?.specReview || {};
293
+ if (gate.status === "tmp_unattributed") {
294
+ errors.push(`finish gate has unattributed tmp spec review (persist it to .aiws/changes/${changeId}/review/spec-review.md or rerun in the owning change context)`);
295
+ }
296
+ else {
297
+ errors.push(`finish gate missing spec review (run \`$ws-spec-review\` or write .aiws/changes/${changeId}/review/spec-review.md)`);
298
+ }
299
+ continue;
300
+ }
301
+ if (missingId === "quality_review") {
302
+ const gate = reviewGates?.qualityReview || {};
303
+ if (gate.status === "tmp_unattributed") {
304
+ errors.push(`finish gate has unattributed tmp quality review (persist it to .aiws/changes/${changeId}/review/quality-review.md or rerun in the owning change context)`);
305
+ }
306
+ else {
307
+ errors.push(`finish gate missing quality review (run \`$ws-quality-review\` or write .aiws/changes/${changeId}/review/quality-review.md)`);
308
+ }
309
+ continue;
310
+ }
311
+ if (missingId === "validate_stamp") {
312
+ errors.push("finish gate missing validate stamp (run `aiws validate . --stamp`)");
313
+ continue;
314
+ }
315
+ if (missingId === "verify_before_complete") {
316
+ const gate = reviewGates?.verifyBeforeComplete || {};
317
+ if (gate.status === "tmp_unattributed") {
318
+ errors.push(`finish gate has unattributed tmp verify-before-complete evidence (persist it to .aiws/changes/${changeId}/evidence/verify-before-complete.md or rerun in the owning change context)`);
319
+ }
320
+ else {
321
+ errors.push(`finish gate missing verify-before-complete evidence (run \`$ws-verify-before-complete\` or write .aiws/changes/${changeId}/evidence/verify-before-complete.md)`);
322
+ }
323
+ continue;
324
+ }
325
+ errors.push(`finish gate missing required artifact: ${missingId}`);
326
+ }
327
+ return errors;
328
+ }
329
+ //# sourceMappingURL=change-review-gates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"change-review-gates.js","sourceRoot":"","sources":["../../src/commands/change-review-gates.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * @param {any} lifecycle
3
+ */
4
+ export declare function computeScopeGate(lifecycle: any): {
5
+ checked: boolean;
6
+ ready: boolean;
7
+ status: string;
8
+ source: string;
9
+ lastRunAt: string;
10
+ errors: number;
11
+ warnings: number;
12
+ };
13
+ /**
14
+ * @param {string} changeId
15
+ */
16
+ export declare function scopeGateFailureAction(changeId: string): string;
17
+ /**
18
+ * @param {string} changeId
19
+ */
20
+ export declare function scopeGatePendingRecommendation(changeId: string): string;
21
+ export declare function scopeGatePassedRecommendation(): string;
@@ -0,0 +1,32 @@
1
+ /**
2
+ * @param {any} lifecycle
3
+ */
4
+ export function computeScopeGate(lifecycle) {
5
+ const runs = Number(lifecycle?.strictScopeValidateRuns || 0);
6
+ const pass = lifecycle?.strictScopeValidatePass === true;
7
+ return {
8
+ checked: runs > 0,
9
+ ready: runs > 0 && pass,
10
+ status: runs === 0 ? "not_run" : pass ? "passed" : "failed",
11
+ source: runs > 0 ? "metrics.validate.check_scope" : "",
12
+ lastRunAt: String(lifecycle?.strictScopeValidateAt || ""),
13
+ errors: Number(lifecycle?.strictScopeValidateErrors || 0),
14
+ warnings: Number(lifecycle?.strictScopeValidateWarnings || 0),
15
+ };
16
+ }
17
+ /**
18
+ * @param {string} changeId
19
+ */
20
+ export function scopeGateFailureAction(changeId) {
21
+ return `scope gate 未通过:更新 plan 的 \`## Scope\` / \`### In Scope\` 或收敛改动后复跑 \`aiws change validate ${changeId} --strict --check-scope\``;
22
+ }
23
+ /**
24
+ * @param {string} changeId
25
+ */
26
+ export function scopeGatePendingRecommendation(changeId) {
27
+ return `范围门禁:\`aiws change validate ${changeId} --strict --check-scope\``;
28
+ }
29
+ export function scopeGatePassedRecommendation() {
30
+ return "范围门禁:最近一次 `--check-scope` 已通过";
31
+ }
32
+ //# sourceMappingURL=change-scope-gate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"change-scope-gate.js","sourceRoot":"","sources":["../../src/commands/change-scope-gate.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,SAAc;IAC7C,MAAM,IAAI,GAAG,MAAM,CAAC,SAAS,EAAE,uBAAuB,IAAI,CAAC,CAAC,CAAC;IAC7D,MAAM,IAAI,GAAG,SAAS,EAAE,uBAAuB,KAAK,IAAI,CAAC;IACzD,OAAO;QACL,OAAO,EAAE,IAAI,GAAG,CAAC;QACjB,KAAK,EAAE,IAAI,GAAG,CAAC,IAAI,IAAI;QACvB,MAAM,EAAE,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ;QAC3D,MAAM,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,8BAA8B,CAAC,CAAC,CAAC,EAAE;QACtD,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,qBAAqB,IAAI,EAAE,CAAC;QACzD,MAAM,EAAE,MAAM,CAAC,SAAS,EAAE,yBAAyB,IAAI,CAAC,CAAC;QACzD,QAAQ,EAAE,MAAM,CAAC,SAAS,EAAE,2BAA2B,IAAI,CAAC,CAAC;KAC9D,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,QAAgB;IACrD,OAAO,4FAA4F,QAAQ,2BAA2B,CAAC;AACzI,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,8BAA8B,CAAC,QAAgB;IAC7D,OAAO,+BAA+B,QAAQ,2BAA2B,CAAC;AAC5E,CAAC;AAED,MAAM,UAAU,6BAA6B;IAC3C,OAAO,+BAA+B,CAAC;AACzC,CAAC"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * @param {string} changeDir
3
+ * @param {string} baseBranch
4
+ * @param {string} changeBranch
5
+ * @param {{
6
+ * nowIsoUtc: () => string,
7
+ * pathExists: (path: string) => Promise<boolean>,
8
+ * readText: (path: string) => Promise<string>,
9
+ * writeText: (path: string, content: string) => Promise<void>
10
+ * }} deps
11
+ */
12
+ export declare function maybeRecordBaseBranch(changeDir: string, baseBranch: string, changeBranch: string, deps: any): Promise<void>;
13
+ /**
14
+ * @param {string} gitRoot
15
+ * @param {{ branch: string, hasBranch: boolean, hasGitmodules: boolean }} options
16
+ * @param {{
17
+ * runCommand: typeof import("../exec.js").runCommand,
18
+ * UserError: typeof import("../errors.js").UserError
19
+ * }} deps
20
+ */
21
+ export declare function switchOrCreateStartBranch(gitRoot: string, options: any, deps: any): Promise<void>;
22
+ /**
23
+ * @param {string} gitRoot
24
+ * @param {{ branch: string, hasBranch: boolean, headReady: boolean }} options
25
+ * @param {{
26
+ * runCommand: typeof import("../exec.js").runCommand,
27
+ * UserError: typeof import("../errors.js").UserError
28
+ * }} deps
29
+ */
30
+ export declare function prepareNoSwitchBranch(gitRoot: string, options: any, deps: any): Promise<boolean>;
@@ -0,0 +1,91 @@
1
+ import path from "node:path";
2
+ /**
3
+ * @param {string} changeDir
4
+ * @param {string} baseBranch
5
+ * @param {string} changeBranch
6
+ * @param {{
7
+ * nowIsoUtc: () => string,
8
+ * pathExists: (path: string) => Promise<boolean>,
9
+ * readText: (path: string) => Promise<string>,
10
+ * writeText: (path: string, content: string) => Promise<void>
11
+ * }} deps
12
+ */
13
+ export async function maybeRecordBaseBranch(changeDir, baseBranch, changeBranch, deps) {
14
+ const base = String(baseBranch || "").trim();
15
+ if (!base)
16
+ return;
17
+ if (base === String(changeBranch || "").trim())
18
+ return;
19
+ const metaPath = path.join(changeDir, ".ws-change.json");
20
+ if (!(await deps.pathExists(metaPath)))
21
+ return;
22
+ /** @type {any} */
23
+ let meta = null;
24
+ try {
25
+ meta = JSON.parse(await deps.readText(metaPath));
26
+ }
27
+ catch {
28
+ meta = null;
29
+ }
30
+ if (!meta || typeof meta !== "object")
31
+ return;
32
+ const current = String(meta.base_branch || "").trim();
33
+ if (current)
34
+ return;
35
+ meta.base_branch = base;
36
+ meta.base_branch_set_at = deps.nowIsoUtc();
37
+ await deps.writeText(metaPath, JSON.stringify(meta, null, 2) + "\n");
38
+ }
39
+ /**
40
+ * @param {string} gitRoot
41
+ * @param {{ branch: string, hasBranch: boolean, hasGitmodules: boolean }} options
42
+ * @param {{
43
+ * runCommand: typeof import("../exec.js").runCommand,
44
+ * UserError: typeof import("../errors.js").UserError
45
+ * }} deps
46
+ */
47
+ export async function switchOrCreateStartBranch(gitRoot, options, deps) {
48
+ if (options.hasBranch) {
49
+ if (options.hasGitmodules) {
50
+ console.error("warn: .gitmodules detected; switching only the superproject branch (submodules stay on their current/pin branches).");
51
+ }
52
+ let sw = await deps.runCommand("git", ["switch", options.branch], { cwd: gitRoot });
53
+ if (sw.code === 0)
54
+ return;
55
+ let co = await deps.runCommand("git", ["checkout", options.branch], { cwd: gitRoot });
56
+ if (co.code !== 0)
57
+ throw new deps.UserError("Failed to switch branch.", { details: co.stderr || co.stdout });
58
+ return;
59
+ }
60
+ if (options.hasGitmodules) {
61
+ console.error("warn: .gitmodules detected; creating and switching only the superproject branch (submodules stay on their current/pin branches).");
62
+ }
63
+ let sw = await deps.runCommand("git", ["switch", "-c", options.branch], { cwd: gitRoot });
64
+ if (sw.code === 0)
65
+ return;
66
+ let co = await deps.runCommand("git", ["checkout", "-b", options.branch], { cwd: gitRoot });
67
+ if (co.code !== 0)
68
+ throw new deps.UserError("Failed to create branch.", { details: co.stderr || co.stdout });
69
+ }
70
+ /**
71
+ * @param {string} gitRoot
72
+ * @param {{ branch: string, hasBranch: boolean, headReady: boolean }} options
73
+ * @param {{
74
+ * runCommand: typeof import("../exec.js").runCommand,
75
+ * UserError: typeof import("../errors.js").UserError
76
+ * }} deps
77
+ */
78
+ export async function prepareNoSwitchBranch(gitRoot, options, deps) {
79
+ if (options.hasBranch)
80
+ return true;
81
+ if (!options.headReady) {
82
+ console.error(`warn: repo has no commits; cannot create branch "${options.branch}" without switching (skipped)`);
83
+ return false;
84
+ }
85
+ const branchResult = await deps.runCommand("git", ["branch", options.branch], { cwd: gitRoot });
86
+ if (branchResult.code !== 0) {
87
+ throw new deps.UserError("Failed to create branch.", { details: branchResult.stderr || branchResult.stdout });
88
+ }
89
+ return true;
90
+ }
91
+ //# sourceMappingURL=change-start.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"change-start.js","sourceRoot":"","sources":["../../src/commands/change-start.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare function runChangeStateCommand(input: any, deps: any): Promise<{
2
+ output: any;
3
+ }>;
@@ -0,0 +1,32 @@
1
+ import path from "node:path";
2
+ import { readJournalEvents } from "../journal.js";
3
+ export async function runChangeStateCommand(input, deps) {
4
+ const { gitRoot, changeId, options } = input;
5
+ const status = await deps.computeChangeStatus(gitRoot, changeId);
6
+ const advice = await deps.computeChangeNextAdvice(gitRoot, changeId);
7
+ const journal = await readJournalEvents(gitRoot, changeId);
8
+ if (journal.phase) {
9
+ status.phase = journal.phase;
10
+ }
11
+ const journalInfo = {
12
+ phase: journal.phase,
13
+ events: journal.events.length,
14
+ };
15
+ const output = deps.renderChangeStateMarkdown({
16
+ changeId,
17
+ gitRoot,
18
+ now: deps.nowIsoUtc(),
19
+ status,
20
+ advice,
21
+ journalInfo,
22
+ planVerifyLine: deps.planVerifyHint(changeId),
23
+ });
24
+ const dest = path.join(deps.changeDirAbs(gitRoot, changeId), "STATE.md");
25
+ if (options.write === true) {
26
+ await deps.writeText(dest, output);
27
+ await deps.appendMetricsEvent(gitRoot, changeId, "state_written", { path: path.relative(gitRoot, dest) });
28
+ return { output: `ok: state written: ${path.relative(gitRoot, dest)}\n` };
29
+ }
30
+ return { output };
31
+ }
32
+ //# sourceMappingURL=change-state-command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"change-state-command.js","sourceRoot":"","sources":["../../src/commands/change-state-command.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAElD,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,KAAU,EAAE,IAAS;IAC/D,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC;IAC7C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IACjE,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,uBAAuB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAErE,MAAM,OAAO,GAAG,MAAM,iBAAiB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAC3D,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,MAAM,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;IAC/B,CAAC;IACD,MAAM,WAAW,GAAG;QAClB,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM;KAC9B,CAAC;IAEF,MAAM,MAAM,GAAG,IAAI,CAAC,yBAAyB,CAAC;QAC5C,QAAQ;QACR,OAAO;QACP,GAAG,EAAE,IAAI,CAAC,SAAS,EAAE;QACrB,MAAM;QACN,MAAM;QACN,WAAW;QACX,cAAc,EAAE,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC;KAC9C,CAAC,CAAC;IACH,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE,UAAU,CAAC,CAAC;IACzE,IAAI,OAAO,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;QAC3B,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACnC,MAAM,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;QAC1G,OAAO,EAAE,MAAM,EAAE,sBAAsB,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;IAC5E,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,CAAC;AACpB,CAAC"}
@@ -0,0 +1,13 @@
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 declare function renderChangeStatusOutput(input: any, deps: any): Promise<string>;