@chenmk/superflow 0.4.0 → 0.5.1

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 (242) hide show
  1. package/INSTALL.en.md +58 -12
  2. package/INSTALL.md +62 -33
  3. package/README.md +181 -54
  4. package/README.zh-CN.md +158 -51
  5. package/assets/brand/managed-review-loop.png +0 -0
  6. package/assets/manifest.json +10 -5
  7. package/assets/scripts/superflow-coding-ready.mjs +135 -0
  8. package/assets/scripts/superflow-dependency-update-hook.sh +81 -8
  9. package/assets/scripts/superflow-document-audit.mjs +240 -0
  10. package/assets/scripts/superflow-environment-preflight.mjs +398 -0
  11. package/assets/scripts/superflow-hook-guard.sh +40 -1
  12. package/assets/scripts/superflow-managed-command-guard.py +309 -0
  13. package/assets/scripts/superflow-managed-executor-preflight.mjs +421 -0
  14. package/assets/scripts/superflow-managed-owner-verification.sh +117 -0
  15. package/assets/scripts/superflow-managed-work-check.mjs +287 -26
  16. package/assets/scripts/superflow-managed-work-guard.sh +6 -92
  17. package/assets/skills/superflow-clarify/SKILL.md +14 -0
  18. package/assets/skills/superflow-design/SKILL.md +38 -13
  19. package/assets/skills/superflow-docs/SKILL.md +93 -2
  20. package/assets/skills/superflow-pipeline/SKILL.md +167 -10
  21. package/assets/skills/superflow-pipeline/references/batch-prompt-template.md +17 -9
  22. package/assets/skills/superflow-pipeline/references/document-readiness.md +157 -0
  23. package/assets/skills/superflow-pipeline/references/document-templates.md +9 -5
  24. package/assets/skills/superflow-pipeline/references/feature-gated-workflow.md +14 -0
  25. package/assets/skills/superflow-pipeline/references/implementation-prompt-template.md +20 -11
  26. package/assets/skills/superflow-pipeline/references/managed-work.md +123 -15
  27. package/assets/skills/superflow-pipeline/references/orchestration.md +2 -2
  28. package/assets/skills/superflow-pipeline/references/p0-baseline-template.md +3 -2
  29. package/assets/skills/superflow-pipeline/references/quality-gate.md +7 -5
  30. package/assets/skills/superflow-pipeline/references/reviewer-checklist.md +7 -0
  31. package/assets/skills/superflow-pipeline/scripts/superflow-guard.sh +205 -9
  32. package/assets/skills/superflow-pipeline/scripts/superflow-handoff.sh +7 -4
  33. package/assets/skills/superflow-requirement-review/SKILL.md +178 -0
  34. package/assets/skills/superflow-requirement-review/agents/openai.yaml +4 -0
  35. package/assets/skills-en/superflow-clarify/SKILL.md +17 -0
  36. package/assets/skills-en/superflow-design/SKILL.md +31 -12
  37. package/assets/skills-en/superflow-docs/SKILL.md +99 -0
  38. package/assets/skills-en/superflow-pipeline/SKILL.md +163 -9
  39. package/assets/skills-en/superflow-pipeline/references/batch-prompt-template.md +4 -0
  40. package/assets/skills-en/superflow-pipeline/references/document-readiness.md +125 -0
  41. package/assets/skills-en/superflow-pipeline/references/document-templates.md +10 -0
  42. package/assets/skills-en/superflow-pipeline/references/feature-gated-workflow.md +7 -0
  43. package/assets/skills-en/superflow-pipeline/references/implementation-prompt-template.md +7 -0
  44. package/assets/skills-en/superflow-pipeline/references/managed-work.md +160 -10
  45. package/assets/skills-en/superflow-pipeline/references/quality-gate.md +12 -0
  46. package/assets/skills-en/superflow-pipeline/references/reviewer-checklist.md +7 -0
  47. package/assets/skills-en/superflow-pipeline/scripts/superflow-guard.sh +205 -9
  48. package/assets/skills-en/superflow-pipeline/scripts/superflow-handoff.sh +7 -4
  49. package/assets/skills-en/superflow-requirement-review/SKILL.md +99 -0
  50. package/assets/skills-en/superflow-requirement-review/agents/openai.yaml +4 -0
  51. package/dist/app/cli.js +64 -9
  52. package/dist/app/cli.js.map +1 -1
  53. package/dist/app/commands/change-guard.js +19 -2
  54. package/dist/app/commands/change-guard.js.map +1 -1
  55. package/dist/app/commands/check.js +107 -45
  56. package/dist/app/commands/check.js.map +1 -1
  57. package/dist/app/commands/docs.js +7 -3
  58. package/dist/app/commands/docs.js.map +1 -1
  59. package/dist/app/commands/doctor.js +174 -198
  60. package/dist/app/commands/doctor.js.map +1 -1
  61. package/dist/app/commands/eval.js +64 -0
  62. package/dist/app/commands/eval.js.map +1 -0
  63. package/dist/app/commands/implement.js +7 -3
  64. package/dist/app/commands/implement.js.map +1 -1
  65. package/dist/app/commands/init.js +12 -24
  66. package/dist/app/commands/init.js.map +1 -1
  67. package/dist/app/commands/mcp.js +167 -0
  68. package/dist/app/commands/mcp.js.map +1 -0
  69. package/dist/app/commands/pipeline.js +652 -18
  70. package/dist/app/commands/pipeline.js.map +1 -1
  71. package/dist/app/commands/requirement-review.js +6 -0
  72. package/dist/app/commands/requirement-review.js.map +1 -0
  73. package/dist/app/commands/status.js +66 -3
  74. package/dist/app/commands/status.js.map +1 -1
  75. package/dist/app/commands/uninstall.js +3 -3
  76. package/dist/app/commands/uninstall.js.map +1 -1
  77. package/dist/app/commands/update.js +83 -9
  78. package/dist/app/commands/update.js.map +1 -1
  79. package/dist/domains/agent.js +3 -11
  80. package/dist/domains/agent.js.map +1 -1
  81. package/dist/domains/config/cli-help.js +54 -12
  82. package/dist/domains/config/cli-help.js.map +1 -1
  83. package/dist/domains/config/i18n.js +6 -8
  84. package/dist/domains/config/i18n.js.map +1 -1
  85. package/dist/domains/config/manifest.js +0 -3
  86. package/dist/domains/config/manifest.js.map +1 -1
  87. package/dist/domains/deps.js +68 -7
  88. package/dist/domains/deps.js.map +1 -1
  89. package/dist/domains/managed-work/completion-policy.js +174 -0
  90. package/dist/domains/managed-work/completion-policy.js.map +1 -0
  91. package/dist/domains/managed-work/context-manifest.js +208 -0
  92. package/dist/domains/managed-work/context-manifest.js.map +1 -0
  93. package/dist/domains/managed-work/contract.js +135 -4
  94. package/dist/domains/managed-work/contract.js.map +1 -1
  95. package/dist/domains/managed-work/control-signals.js +34 -0
  96. package/dist/domains/managed-work/control-signals.js.map +1 -0
  97. package/dist/domains/managed-work/control.js +628 -0
  98. package/dist/domains/managed-work/control.js.map +1 -0
  99. package/dist/domains/managed-work/evaluation.js +497 -0
  100. package/dist/domains/managed-work/evaluation.js.map +1 -0
  101. package/dist/domains/managed-work/evidence-path.js +14 -0
  102. package/dist/domains/managed-work/evidence-path.js.map +1 -0
  103. package/dist/domains/managed-work/execution-contract.js +167 -0
  104. package/dist/domains/managed-work/execution-contract.js.map +1 -0
  105. package/dist/domains/managed-work/executor-policy.js +65 -0
  106. package/dist/domains/managed-work/executor-policy.js.map +1 -0
  107. package/dist/domains/managed-work/failure.js +65 -0
  108. package/dist/domains/managed-work/failure.js.map +1 -0
  109. package/dist/domains/managed-work/host-review.js +77 -0
  110. package/dist/domains/managed-work/host-review.js.map +1 -0
  111. package/dist/domains/managed-work/human-messages.js +31 -0
  112. package/dist/domains/managed-work/human-messages.js.map +1 -0
  113. package/dist/domains/managed-work/input.js +29 -3
  114. package/dist/domains/managed-work/input.js.map +1 -1
  115. package/dist/domains/managed-work/journal.js +77 -3
  116. package/dist/domains/managed-work/journal.js.map +1 -1
  117. package/dist/domains/managed-work/lock.js +67 -1
  118. package/dist/domains/managed-work/lock.js.map +1 -1
  119. package/dist/domains/managed-work/notifications.js +0 -15
  120. package/dist/domains/managed-work/notifications.js.map +1 -1
  121. package/dist/domains/managed-work/pair-admission.js +108 -0
  122. package/dist/domains/managed-work/pair-admission.js.map +1 -0
  123. package/dist/domains/managed-work/prompts.js +257 -22
  124. package/dist/domains/managed-work/prompts.js.map +1 -1
  125. package/dist/domains/managed-work/redaction.js +90 -0
  126. package/dist/domains/managed-work/redaction.js.map +1 -0
  127. package/dist/domains/managed-work/review-convergence.js +41 -0
  128. package/dist/domains/managed-work/review-convergence.js.map +1 -0
  129. package/dist/domains/managed-work/review-facts.js +181 -0
  130. package/dist/domains/managed-work/review-facts.js.map +1 -0
  131. package/dist/domains/managed-work/rule-selection.js +84 -0
  132. package/dist/domains/managed-work/rule-selection.js.map +1 -0
  133. package/dist/domains/managed-work/runner.js +1967 -175
  134. package/dist/domains/managed-work/runner.js.map +1 -1
  135. package/dist/domains/managed-work/schemas.js +72 -2
  136. package/dist/domains/managed-work/schemas.js.map +1 -1
  137. package/dist/domains/managed-work/service.js +82 -13
  138. package/dist/domains/managed-work/service.js.map +1 -1
  139. package/dist/domains/managed-work/state.js +195 -5
  140. package/dist/domains/managed-work/state.js.map +1 -1
  141. package/dist/domains/managed-work/storage.js +66 -24
  142. package/dist/domains/managed-work/storage.js.map +1 -1
  143. package/dist/domains/managed-work/types.js +12 -9
  144. package/dist/domains/managed-work/types.js.map +1 -1
  145. package/dist/domains/managed-work/verification-categories.js +39 -0
  146. package/dist/domains/managed-work/verification-categories.js.map +1 -0
  147. package/dist/domains/managed-work/verification-policy.js +116 -0
  148. package/dist/domains/managed-work/verification-policy.js.map +1 -0
  149. package/dist/domains/managed-work/wait.js +21 -3
  150. package/dist/domains/managed-work/wait.js.map +1 -1
  151. package/dist/domains/managed-work/workspace-binding.js +133 -0
  152. package/dist/domains/managed-work/workspace-binding.js.map +1 -0
  153. package/dist/domains/sdd-readiness.js +44 -0
  154. package/dist/domains/sdd-readiness.js.map +1 -0
  155. package/dist/domains/skill/deploy.js +0 -6
  156. package/dist/domains/skill/deploy.js.map +1 -1
  157. package/dist/domains/skill/scripts.js +0 -8
  158. package/dist/domains/skill/scripts.js.map +1 -1
  159. package/dist/domains/state.js +1 -2
  160. package/dist/domains/state.js.map +1 -1
  161. package/dist/mcp/runtime-identity.js +21 -0
  162. package/dist/mcp/runtime-identity.js.map +1 -0
  163. package/dist/mcp/server.js +369 -0
  164. package/dist/mcp/server.js.map +1 -0
  165. package/dist/platform/agent-process.js +499 -38
  166. package/dist/platform/agent-process.js.map +1 -1
  167. package/dist/platform/executable.js +28 -0
  168. package/dist/platform/executable.js.map +1 -0
  169. package/dist/platform/paths.js +1 -17
  170. package/dist/platform/paths.js.map +1 -1
  171. package/dist/platform/process-tree.js +44 -0
  172. package/dist/platform/process-tree.js.map +1 -0
  173. package/dist/platform/process.js +1 -1
  174. package/dist/platform/process.js.map +1 -1
  175. package/package.json +17 -7
  176. package/scripts/check-design-principles.mjs +107 -0
  177. package/scripts/check-managed-work-design.mjs +507 -0
  178. package/scripts/clean-dist.js +9 -0
  179. package/scripts/ensure-bin-modes.js +11 -0
  180. package/scripts/preinstall.js +57 -0
  181. package/dist/cli/index.js +0 -193
  182. package/dist/cli/index.js.map +0 -1
  183. package/dist/commands/archive.js +0 -6
  184. package/dist/commands/archive.js.map +0 -1
  185. package/dist/commands/clarify.js +0 -6
  186. package/dist/commands/clarify.js.map +0 -1
  187. package/dist/commands/design.js +0 -28
  188. package/dist/commands/design.js.map +0 -1
  189. package/dist/commands/docs.js +0 -6
  190. package/dist/commands/docs.js.map +0 -1
  191. package/dist/commands/doctor.js +0 -494
  192. package/dist/commands/doctor.js.map +0 -1
  193. package/dist/commands/implement.js +0 -6
  194. package/dist/commands/implement.js.map +0 -1
  195. package/dist/commands/init.js +0 -520
  196. package/dist/commands/init.js.map +0 -1
  197. package/dist/commands/pipeline.js +0 -6
  198. package/dist/commands/pipeline.js.map +0 -1
  199. package/dist/commands/scan.js +0 -63
  200. package/dist/commands/scan.js.map +0 -1
  201. package/dist/commands/status.js +0 -173
  202. package/dist/commands/status.js.map +0 -1
  203. package/dist/commands/uninstall.js +0 -214
  204. package/dist/commands/uninstall.js.map +0 -1
  205. package/dist/commands/update.js +0 -193
  206. package/dist/commands/update.js.map +0 -1
  207. package/dist/commands/verify.js +0 -6
  208. package/dist/commands/verify.js.map +0 -1
  209. package/dist/core/assets.js +0 -27
  210. package/dist/core/assets.js.map +0 -1
  211. package/dist/core/cli-help.js +0 -98
  212. package/dist/core/cli-help.js.map +0 -1
  213. package/dist/core/context.js +0 -123
  214. package/dist/core/context.js.map +0 -1
  215. package/dist/core/dependencies.js +0 -146
  216. package/dist/core/dependencies.js.map +0 -1
  217. package/dist/core/detect.js +0 -64
  218. package/dist/core/detect.js.map +0 -1
  219. package/dist/core/i18n.js +0 -105
  220. package/dist/core/i18n.js.map +0 -1
  221. package/dist/core/integrity.js +0 -46
  222. package/dist/core/integrity.js.map +0 -1
  223. package/dist/core/manifest.js +0 -21
  224. package/dist/core/manifest.js.map +0 -1
  225. package/dist/core/prompts.js +0 -20
  226. package/dist/core/prompts.js.map +0 -1
  227. package/dist/core/registry.js +0 -134
  228. package/dist/core/registry.js.map +0 -1
  229. package/dist/core/rules.js +0 -17
  230. package/dist/core/rules.js.map +0 -1
  231. package/dist/core/scripts.js +0 -48
  232. package/dist/core/scripts.js.map +0 -1
  233. package/dist/core/skill-check.js +0 -32
  234. package/dist/core/skill-check.js.map +0 -1
  235. package/dist/core/skills.js +0 -62
  236. package/dist/core/skills.js.map +0 -1
  237. package/dist/core/state.js +0 -54
  238. package/dist/core/state.js.map +0 -1
  239. package/dist/utils/path.js +0 -11
  240. package/dist/utils/path.js.map +0 -1
  241. package/dist/utils/shell.js +0 -29
  242. package/dist/utils/shell.js.map +0 -1
@@ -0,0 +1,41 @@
1
+ const MAX_STAGNANT_TRANSITIONS = 2;
2
+ export function assessReviewConvergence(history) {
3
+ const relevant = history.filter((review) => review.result === "needs_fix");
4
+ const current = relevant.at(-1);
5
+ const previous = relevant.at(-2);
6
+ if (!current || !previous) {
7
+ return decision(true, 0, previous, current);
8
+ }
9
+ let stagnantTransitions = 0;
10
+ for (let index = relevant.length - 1; index > 0; index -= 1) {
11
+ if (resolvedAny(relevant[index - 1], relevant[index]))
12
+ break;
13
+ stagnantTransitions += 1;
14
+ }
15
+ return decision(stagnantTransitions < MAX_STAGNANT_TRANSITIONS, stagnantTransitions, previous, current);
16
+ }
17
+ function decision(shouldContinue, stagnantTransitions, previous, current) {
18
+ return {
19
+ shouldContinue,
20
+ stagnantTransitions,
21
+ previousBlocking: blocking(previous).length,
22
+ currentBlocking: blocking(current).length,
23
+ };
24
+ }
25
+ function resolvedAny(previous, current) {
26
+ const currentFindings = blocking(current);
27
+ return blocking(previous).some((finding) => !currentFindings.some((item) => sameFinding(finding, item)));
28
+ }
29
+ function blocking(review) {
30
+ return review?.findings.filter((finding) => finding.blocking) ?? [];
31
+ }
32
+ function sameFinding(left, right) {
33
+ const sameId = normalize(left.id) !== "" && normalize(left.id) === normalize(right.id);
34
+ const sameScope = normalize(left.category) === normalize(right.category) &&
35
+ normalize(left.target) === normalize(right.target);
36
+ return sameId || sameScope;
37
+ }
38
+ function normalize(value) {
39
+ return value.toLowerCase().replace(/\s+/g, " ").trim();
40
+ }
41
+ //# sourceMappingURL=review-convergence.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-convergence.js","sourceRoot":"","sources":["../../../src/domains/managed-work/review-convergence.ts"],"names":[],"mappings":"AASA,MAAM,wBAAwB,GAAG,CAAC,CAAC;AAEnC,MAAM,UAAU,uBAAuB,CACrC,OAAuB;IAEvB,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC;IAC3E,MAAM,OAAO,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAChC,MAAM,QAAQ,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACjC,IAAI,CAAC,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC1B,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC9C,CAAC;IACD,IAAI,mBAAmB,GAAG,CAAC,CAAC;IAC5B,KAAK,IAAI,KAAK,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QAC5D,IAAI,WAAW,CAAC,QAAQ,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;YAAE,MAAM;QAC7D,mBAAmB,IAAI,CAAC,CAAC;IAC3B,CAAC;IACD,OAAO,QAAQ,CACb,mBAAmB,GAAG,wBAAwB,EAC9C,mBAAmB,EACnB,QAAQ,EACR,OAAO,CACR,CAAC;AACJ,CAAC;AAED,SAAS,QAAQ,CACf,cAAuB,EACvB,mBAA2B,EAC3B,QAAuB,EACvB,OAAsB;IAEtB,OAAO;QACL,cAAc;QACd,mBAAmB;QACnB,gBAAgB,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC,MAAM;QAC3C,eAAe,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC,MAAM;KAC1C,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,QAAsB,EAAE,OAAqB;IAChE,MAAM,eAAe,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC1C,OAAO,QAAQ,CAAC,QAAQ,CAAC,CAAC,IAAI,CAC5B,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CACzE,CAAC;AACJ,CAAC;AAED,SAAS,QAAQ,CAAC,MAAqB;IACrC,OAAO,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;AACtE,CAAC;AAED,SAAS,WAAW,CAAC,IAAmB,EAAE,KAAoB;IAC5D,MAAM,MAAM,GACV,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC1E,MAAM,SAAS,GACb,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC;QACtD,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACrD,OAAO,MAAM,IAAI,SAAS,CAAC;AAC7B,CAAC;AAED,SAAS,SAAS,CAAC,KAAa;IAC9B,OAAO,KAAK,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;AACzD,CAAC"}
@@ -0,0 +1,181 @@
1
+ import { createHash } from "crypto";
2
+ import { existsSync, readFileSync, statSync, writeFileSync } from "fs";
3
+ import path from "path";
4
+ import { readCompletionTasks } from "./completion-policy.js";
5
+ import { ensureManagedContextManifest, managedContextManifestPath, } from "./context-manifest.js";
6
+ import { managedRunDir } from "./paths.js";
7
+ import { snapshotChangedWorkspaceFiles } from "./state.js";
8
+ import { writeJsonAtomic } from "./storage.js";
9
+ import { categoriesForCommand } from "./verification-categories.js";
10
+ import { canonicalEvidencePath } from "./evidence-path.js";
11
+ import { isAcceptedEvidenceCommand } from "./execution-contract.js";
12
+ export function writeManagedReviewFacts(contract, state) {
13
+ const runDir = managedRunDir(state.projectRoot, state.taskId, state.runId);
14
+ const result = state.lastExecutorResult
15
+ ? JSON.parse(readFileSync(state.lastExecutorResult, "utf-8"))
16
+ : emptyResult();
17
+ const manifest = ensureManagedContextManifest(contract);
18
+ const tasks = readCompletionTasks(contract, result);
19
+ const commands = result.commands ?? [];
20
+ const categories = [
21
+ ...new Set(commands.flatMap(categoriesForCommand)),
22
+ ].sort();
23
+ const roots = [contract.projectRoot, ...contract.relatedProjectRoots];
24
+ const workspaceSnapshot = snapshotChangedWorkspaceFiles(roots);
25
+ const roundBaseline = state.lastReviewedWorkspaceFiles ?? state.baselineWorkspaceFiles ?? {};
26
+ const facts = {
27
+ schemaVersion: 1,
28
+ taskId: state.taskId,
29
+ runId: state.runId,
30
+ reviewRound: state.reviewRound,
31
+ contextManifest: {
32
+ path: managedContextManifestPath(contract),
33
+ sha256: manifest.manifestHash,
34
+ },
35
+ workspace: {
36
+ roots,
37
+ changedFiles: [...new Set(result.changedFiles ?? [])].sort(),
38
+ roundChangedFiles: changedFilesBetween(workspaceSnapshot, roundBaseline, contract.projectRoot),
39
+ },
40
+ tasks: {
41
+ total: tasks.length,
42
+ completed: tasks.filter((task) => task.completed).length,
43
+ pendingLocal: tasks
44
+ .filter((task) => !task.completed && task.category === "local_required")
45
+ .map((task) => task.taskId),
46
+ pendingExternal: tasks
47
+ .filter((task) => !task.completed && task.category !== "local_required")
48
+ .map((task) => task.taskId),
49
+ },
50
+ commands: {
51
+ total: commands.length,
52
+ successful: commands.filter(isAcceptedEvidenceCommand).length,
53
+ categories,
54
+ items: commands.map((command) => ({
55
+ command: command.command,
56
+ exitCode: command.exitCode,
57
+ assertion: command.assertion ?? "positive",
58
+ categories: categoriesForCommand(command),
59
+ })),
60
+ },
61
+ evidence: evidencePaths(result)
62
+ .sort()
63
+ .map((entry) => evidenceFact(entry, contract, runDir)),
64
+ };
65
+ const jsonPath = path.join(runDir, `review-facts-${state.reviewRound}.json`);
66
+ const markdownPath = path.join(runDir, `review-facts-${state.reviewRound}.md`);
67
+ writeJsonAtomic(jsonPath, facts);
68
+ writeFileSync(markdownPath, renderReviewFacts(facts, contract.language), "utf-8");
69
+ return { jsonPath, markdownPath, facts, workspaceSnapshot };
70
+ }
71
+ function evidencePaths(result) {
72
+ const structured = (result.taskEvidence ?? []).flatMap((item) => item.evidencePaths);
73
+ const paths = structured.length > 0 ? structured : (result.evidence ?? []);
74
+ return [...new Set(paths.map(canonicalEvidencePath))];
75
+ }
76
+ function changedFilesBetween(current, baseline, primaryRoot) {
77
+ const keys = new Set([...Object.keys(current), ...Object.keys(baseline)]);
78
+ return [...keys]
79
+ .filter((key) => current[key] !== baseline[key])
80
+ .map((key) => {
81
+ const separator = key.indexOf("::");
82
+ const root = key.slice(0, separator);
83
+ const relative = key.slice(separator + 2).replaceAll("\\", "/");
84
+ return path.resolve(root) === path.resolve(primaryRoot)
85
+ ? relative
86
+ : path.join(root, relative).replaceAll("\\", "/");
87
+ })
88
+ .sort();
89
+ }
90
+ function evidenceFact(entry, contract, runDir) {
91
+ const evidencePath = canonicalEvidencePath(entry);
92
+ const candidates = path.isAbsolute(evidencePath)
93
+ ? [evidencePath]
94
+ : [
95
+ path.resolve(contract.projectRoot, evidencePath),
96
+ path.resolve(runDir, evidencePath),
97
+ ];
98
+ const file = candidates.find(existsSync) ?? candidates[0];
99
+ if (!existsSync(file)) {
100
+ return {
101
+ path: file,
102
+ kind: "file",
103
+ exists: false,
104
+ bytes: null,
105
+ sha256: null,
106
+ };
107
+ }
108
+ const stat = statSync(file);
109
+ if (stat.isDirectory()) {
110
+ return {
111
+ path: file,
112
+ kind: "directory",
113
+ exists: true,
114
+ bytes: stat.size,
115
+ sha256: null,
116
+ };
117
+ }
118
+ return {
119
+ path: file,
120
+ kind: "file",
121
+ exists: true,
122
+ bytes: stat.size,
123
+ sha256: createHash("sha256").update(readFileSync(file)).digest("hex"),
124
+ };
125
+ }
126
+ function renderReviewFacts(facts, language) {
127
+ const title = language === "en" ? "# Host Review Facts" : "# Host 评审事实包";
128
+ const labels = language === "en"
129
+ ? {
130
+ warning: "Runner facts are deterministic inputs, not semantic conclusions.",
131
+ changed: "Task changed files",
132
+ roundChanged: "Changed since previous Host review",
133
+ tasks: "Tasks",
134
+ commands: "Commands",
135
+ evidence: "Evidence",
136
+ }
137
+ : {
138
+ warning: "Runner 事实仅作为确定性输入,不代表语义结论。",
139
+ changed: "任务累计变更文件",
140
+ roundChanged: "相对上次 Host 评审的变更文件",
141
+ tasks: "任务",
142
+ commands: "命令",
143
+ evidence: "证据",
144
+ };
145
+ return [
146
+ title,
147
+ "",
148
+ labels.warning,
149
+ "",
150
+ `## ${labels.changed} (${facts.workspace.changedFiles.length})`,
151
+ ...facts.workspace.changedFiles.map((file) => `- ${file}`),
152
+ "",
153
+ `## ${labels.roundChanged} (${facts.workspace.roundChangedFiles.length})`,
154
+ ...(facts.workspace.roundChangedFiles.length > 0
155
+ ? facts.workspace.roundChangedFiles.map((file) => `- ${file}`)
156
+ : [language === "en" ? "- none" : "- 无"]),
157
+ "",
158
+ `## ${labels.tasks} (${facts.tasks.completed}/${facts.tasks.total})`,
159
+ `- pending local: ${facts.tasks.pendingLocal.join(", ") || "none"}`,
160
+ `- pending external: ${facts.tasks.pendingExternal.join(", ") || "none"}`,
161
+ "",
162
+ `## ${labels.commands} (${facts.commands.successful}/${facts.commands.total})`,
163
+ `- categories: ${facts.commands.categories.join(", ") || "none"}`,
164
+ "",
165
+ `## ${labels.evidence} (${facts.evidence.length})`,
166
+ ...facts.evidence.map((item) => `- ${item.exists ? "PASS" : "MISSING"} ${item.path}`),
167
+ "",
168
+ ].join("\n");
169
+ }
170
+ function emptyResult() {
171
+ return {
172
+ status: "ready_for_review",
173
+ summary: "",
174
+ changedFiles: [],
175
+ commands: [],
176
+ evidence: [],
177
+ releasePrerequisites: [],
178
+ blockers: [],
179
+ };
180
+ }
181
+ //# sourceMappingURL=review-facts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-facts.js","sourceRoot":"","sources":["../../../src/domains/managed-work/review-facts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,84 @@
1
+ import { existsSync, readdirSync } from "fs";
2
+ import path from "path";
3
+ const SCENARIO_TOKENS = {
4
+ core: ["common", "core", "general", "security", "git", "review"],
5
+ java: ["java", "spring", "maven", "gradle", "backend"],
6
+ frontend: ["front", "javascript", "typescript", "react", "vue", "node"],
7
+ database: ["database", "mysql", "sql", "migration", "mybatis"],
8
+ runtime: ["runtime", "e2e", "integration", "docker", "browser", "deploy"],
9
+ };
10
+ export function selectManagedRuleFiles(contract) {
11
+ const roots = [contract.projectRoot, ...contract.relatedProjectRoots];
12
+ const scenarios = new Set(["core"]);
13
+ for (const root of roots)
14
+ detectRepositoryScenarios(root, scenarios);
15
+ detectRequestScenarios(contract, scenarios);
16
+ const files = roots.flatMap((root) => selectRootRules(root, scenarios));
17
+ return {
18
+ scenarios: [...scenarios].sort(),
19
+ files: [...new Set(files)].sort(),
20
+ };
21
+ }
22
+ function detectRepositoryScenarios(root, scenarios) {
23
+ const javaMarkers = ["pom.xml", "build.gradle", "build.gradle.kts"];
24
+ if (javaMarkers.some((name) => existsSync(path.join(root, name)))) {
25
+ scenarios.add("java");
26
+ }
27
+ if (existsSync(path.join(root, "package.json")))
28
+ scenarios.add("frontend");
29
+ if (["migrations", "db", "sql"].some((name) => existsSync(path.join(root, name)))) {
30
+ scenarios.add("database");
31
+ }
32
+ }
33
+ function detectRequestScenarios(contract, scenarios) {
34
+ const text = [contract.request, contract.objective, ...contract.doneCriteria]
35
+ .join("\n")
36
+ .toLowerCase();
37
+ for (const [scenario, tokens] of Object.entries(SCENARIO_TOKENS)) {
38
+ if (tokens.some((token) => text.includes(token))) {
39
+ scenarios.add(scenario);
40
+ }
41
+ }
42
+ if (["engineering", "sdd"].includes(contract.profile)) {
43
+ scenarios.add("runtime");
44
+ }
45
+ }
46
+ function selectRootRules(root, scenarios) {
47
+ const files = ["AGENTS.md", "CLAUDE.md"]
48
+ .map((name) => path.join(root, name))
49
+ .filter((file) => existsSync(file));
50
+ for (const relativeRoot of [
51
+ path.join(".codex", "rules"),
52
+ path.join(".claude", "rules"),
53
+ ]) {
54
+ const rulesRoot = path.join(root, relativeRoot);
55
+ if (!existsSync(rulesRoot))
56
+ continue;
57
+ for (const file of markdownFiles(rulesRoot)) {
58
+ if (matchesScenario(file, rulesRoot, scenarios))
59
+ files.push(file);
60
+ }
61
+ }
62
+ return files;
63
+ }
64
+ function matchesScenario(file, rulesRoot, scenarios) {
65
+ const relative = path.relative(rulesRoot, file).toLowerCase();
66
+ let classified = false;
67
+ for (const [scenario, tokens] of Object.entries(SCENARIO_TOKENS)) {
68
+ if (!tokens.some((token) => relative.includes(token)))
69
+ continue;
70
+ classified = true;
71
+ if (scenarios.has(scenario))
72
+ return true;
73
+ }
74
+ return !classified;
75
+ }
76
+ function markdownFiles(root) {
77
+ return readdirSync(root, { withFileTypes: true }).flatMap((entry) => {
78
+ const target = path.join(root, entry.name);
79
+ if (entry.isDirectory())
80
+ return markdownFiles(target);
81
+ return entry.isFile() && entry.name.endsWith(".md") ? [target] : [];
82
+ });
83
+ }
84
+ //# sourceMappingURL=rule-selection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rule-selection.js","sourceRoot":"","sources":["../../../src/domains/managed-work/rule-selection.ts"],"names":[],"mappings":"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"}