@xulthekl/team-flow 0.22.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (405) hide show
  1. package/.agents/plugins/marketplace.json +20 -0
  2. package/.agents/skills +1 -0
  3. package/.claude/always/phase-guard.md +3 -0
  4. package/.claude-plugin/marketplace.json +20 -0
  5. package/.claude-plugin/plugin.json +31 -0
  6. package/.codex-plugin/plugin.json +45 -0
  7. package/.codexignore +6 -0
  8. package/.cursor-plugin/marketplace.json +17 -0
  9. package/.cursor-plugin/plugin.json +31 -0
  10. package/.github/copilot-instructions.md +15 -0
  11. package/.github/dependabot.yml +10 -0
  12. package/.github/plugin/marketplace.json +42 -0
  13. package/.github/workflows/ci.yml +98 -0
  14. package/.github/workflows/hol-plugin-scanner.yml +17 -0
  15. package/.opencode/INSTALL.md +61 -0
  16. package/.opencode/plugins/team-flow.js +70 -0
  17. package/AGENTS.md +280 -0
  18. package/CHANGELOG.md +635 -0
  19. package/CONTRIBUTING.md +115 -0
  20. package/GEMINI.md +14 -0
  21. package/HANDOFF.md +219 -0
  22. package/INSTALL.md +810 -0
  23. package/LICENSE +21 -0
  24. package/README.md +185 -0
  25. package/SECURITY.md +37 -0
  26. package/agents/bug-investigator.md +180 -0
  27. package/agents/change-split-auditor.md +257 -0
  28. package/agents/code-reviewer.md +171 -0
  29. package/agents/cross-change-consistency-checker.md +215 -0
  30. package/agents/prd-completeness-reviewer.md +197 -0
  31. package/agents/prototype-builder.md +230 -0
  32. package/agents/prototype-env-scout.md +156 -0
  33. package/agents/prototype-reviewer.md +226 -0
  34. package/assets/icon.svg +6 -0
  35. package/dist/index.d.ts +13 -0
  36. package/dist/index.js +5 -0
  37. package/dist/parsing/change-parser.d.ts +12 -0
  38. package/dist/parsing/change-parser.js +54 -0
  39. package/dist/parsing/requirement-blocks.d.ts +31 -0
  40. package/dist/parsing/requirement-blocks.js +192 -0
  41. package/dist/schema/base.d.ts +7 -0
  42. package/dist/schema/base.js +1 -0
  43. package/dist/schema/change.d.ts +25 -0
  44. package/dist/schema/change.js +1 -0
  45. package/dist/schema/index.d.ts +3 -0
  46. package/dist/schema/index.js +1 -0
  47. package/dist/schema/spec.d.ts +11 -0
  48. package/dist/schema/spec.js +1 -0
  49. package/dist/validation/constants.d.ts +42 -0
  50. package/dist/validation/constants.js +42 -0
  51. package/dist/validation/tokenizer.d.ts +17 -0
  52. package/dist/validation/tokenizer.js +173 -0
  53. package/dist/validation/types.d.ts +40 -0
  54. package/dist/validation/types.js +1 -0
  55. package/dist/validation/validator.d.ts +21 -0
  56. package/dist/validation/validator.js +489 -0
  57. package/docs/README_en.md +358 -0
  58. package/docs/artifact-contract.md +96 -0
  59. package/docs/decision-points.md +88 -0
  60. package/docs/e2e-integration-design.md +207 -0
  61. package/docs/examples/README.md +25 -0
  62. package/docs/examples/add-dark-mode/README.md +13 -0
  63. package/docs/examples/add-dark-mode/design.md +49 -0
  64. package/docs/examples/add-dark-mode/execution-contract.md +56 -0
  65. package/docs/examples/add-dark-mode/proposal.md +46 -0
  66. package/docs/examples/add-dark-mode/specs/ui-theme/spec.md +35 -0
  67. package/docs/examples/add-dark-mode/tasks.md +26 -0
  68. package/docs/examples/refactor-auth-boundary/README.md +15 -0
  69. package/docs/examples/refactor-auth-boundary/design.md +41 -0
  70. package/docs/examples/refactor-auth-boundary/execution-contract.md +61 -0
  71. package/docs/examples/refactor-auth-boundary/proposal.md +47 -0
  72. package/docs/examples/refactor-auth-boundary/specs/auth-boundary/spec.md +45 -0
  73. package/docs/examples/refactor-auth-boundary/tasks.md +25 -0
  74. package/docs/plans/2026-07-07-fix-batch-design.md +68 -0
  75. package/docs/plans/2026-07-20-001-refactor-skill-collaboration-protocol-plan.md +128 -0
  76. package/docs/platform-matrix.md +45 -0
  77. package/docs/prototype-design-research.md +206 -0
  78. package/docs/release-checklist.md +96 -0
  79. package/docs/showcase.html +699 -0
  80. package/docs/skill-rename-v0.8.0.md +49 -0
  81. package/docs/state-machine.md +162 -0
  82. package/gemini-extension.json +6 -0
  83. package/hooks/hooks-cursor.json +8 -0
  84. package/hooks/hooks.json +26 -0
  85. package/hooks/pre-tool-use-guard +116 -0
  86. package/hooks/session-start +14 -0
  87. package/llms.txt +51 -0
  88. package/package.json +48 -0
  89. package/plugin.json +27 -0
  90. package/prd/v1/plan.md +443 -0
  91. package/prd/v1/prd.md +580 -0
  92. package/scripts/check-update.mjs +91 -0
  93. package/scripts/check-version-consistency.mjs +345 -0
  94. package/scripts/ensure-branch.mjs +71 -0
  95. package/scripts/get-config +31 -0
  96. package/scripts/guard/checks/artifacts-exist.mjs +36 -0
  97. package/scripts/guard/checks/contract-current.mjs +33 -0
  98. package/scripts/guard/checks/contract-fresh.mjs +17 -0
  99. package/scripts/guard/checks/dp-gate-passed.mjs +35 -0
  100. package/scripts/guard/checks/dp3-approved.mjs +22 -0
  101. package/scripts/guard/checks/execution-plan-ready.mjs +40 -0
  102. package/scripts/guard/checks/execution-reviews-passed.mjs +36 -0
  103. package/scripts/guard/checks/schema-valid.mjs +63 -0
  104. package/scripts/guard/checks/specs-merged.mjs +51 -0
  105. package/scripts/guard/checks/tasks-complete.mjs +31 -0
  106. package/scripts/guard/checks/tests-passing.mjs +31 -0
  107. package/scripts/guard/design-token-guard.mjs +237 -0
  108. package/scripts/guard/guard.mjs +205 -0
  109. package/scripts/infer-workflow.mjs +136 -0
  110. package/scripts/install-amazon-q.mjs +9 -0
  111. package/scripts/install-cline.mjs +9 -0
  112. package/scripts/install-continue.mjs +9 -0
  113. package/scripts/install-cursor.mjs +265 -0
  114. package/scripts/install-git-hooks.mjs +82 -0
  115. package/scripts/install-kiro.mjs +9 -0
  116. package/scripts/install-pi.mjs +9 -0
  117. package/scripts/install-qoder.mjs +9 -0
  118. package/scripts/install-qwen.mjs +9 -0
  119. package/scripts/install-roocode.mjs +9 -0
  120. package/scripts/install-windsurf.mjs +9 -0
  121. package/scripts/install-zcode.mjs +265 -0
  122. package/scripts/lib/cmd-audit.mjs +127 -0
  123. package/scripts/lib/cmd-checkpoint.mjs +118 -0
  124. package/scripts/lib/cmd-config.mjs +88 -0
  125. package/scripts/lib/cmd-doctor.mjs +267 -0
  126. package/scripts/lib/cmd-execution.mjs +206 -0
  127. package/scripts/lib/cmd-handoff.mjs +94 -0
  128. package/scripts/lib/cmd-inject.mjs +310 -0
  129. package/scripts/lib/cmd-install-amazon-q.mjs +11 -0
  130. package/scripts/lib/cmd-install-cline.mjs +11 -0
  131. package/scripts/lib/cmd-install-continue.mjs +11 -0
  132. package/scripts/lib/cmd-install-cursor.mjs +14 -0
  133. package/scripts/lib/cmd-install-kiro.mjs +11 -0
  134. package/scripts/lib/cmd-install-pi.mjs +11 -0
  135. package/scripts/lib/cmd-install-qoder.mjs +11 -0
  136. package/scripts/lib/cmd-install-qwen.mjs +11 -0
  137. package/scripts/lib/cmd-install-roocode.mjs +11 -0
  138. package/scripts/lib/cmd-install-windsurf.mjs +11 -0
  139. package/scripts/lib/cmd-install-workbuddy.mjs +359 -0
  140. package/scripts/lib/cmd-install-zcode.mjs +14 -0
  141. package/scripts/lib/cmd-isolate.mjs +37 -0
  142. package/scripts/lib/cmd-list.mjs +71 -0
  143. package/scripts/lib/cmd-runtime.mjs +85 -0
  144. package/scripts/lib/cmd-solutions.mjs +71 -0
  145. package/scripts/lib/cmd-state.mjs +231 -0
  146. package/scripts/lib/cmd-sync.mjs +102 -0
  147. package/scripts/lib/cmd-validate.mjs +105 -0
  148. package/scripts/lib/cmd-version.mjs +148 -0
  149. package/scripts/lib/config-loader.mjs +107 -0
  150. package/scripts/lib/execution-plan.mjs +492 -0
  151. package/scripts/lib/execution-recommendation.mjs +221 -0
  152. package/scripts/lib/hash.mjs +74 -0
  153. package/scripts/lib/install.mjs +267 -0
  154. package/scripts/lib/platform-runtime-inventory.mjs +27 -0
  155. package/scripts/lib/platforms.mjs +165 -0
  156. package/scripts/lib/prototype-sync.mjs +192 -0
  157. package/scripts/lib/sdd-overlay.mjs +262 -0
  158. package/scripts/lib/shell-quote.mjs +4 -0
  159. package/scripts/lib/solutions-capture.mjs +102 -0
  160. package/scripts/lib/solutions-index-gen.mjs +112 -0
  161. package/scripts/lib/solutions-inject.mjs +77 -0
  162. package/scripts/lib/solutions-promote.mjs +145 -0
  163. package/scripts/lib/spec-paths.mjs +85 -0
  164. package/scripts/lib/state-loader.mjs +154 -0
  165. package/scripts/lint/lint-skills.mjs +149 -0
  166. package/scripts/lint/rules/behavior-consistency.mjs +56 -0
  167. package/scripts/lint/rules/dp-trigger-points.mjs +60 -0
  168. package/scripts/lint/rules/exception-handling.mjs +59 -0
  169. package/scripts/lint/rules/no-contradictory-instructions.mjs +67 -0
  170. package/scripts/lint/rules/no-redundant-checks.mjs +50 -0
  171. package/scripts/lint/rules/token-rules.mjs +122 -0
  172. package/scripts/review-package +44 -0
  173. package/scripts/task-brief +40 -0
  174. package/scripts/team-flow.mjs +164 -0
  175. package/scripts/token-baseline.mjs +158 -0
  176. package/scripts/validate-artifacts +96 -0
  177. package/scripts/verify-marketplace-release.mjs +59 -0
  178. package/skills/architecture-design/SKILL.md +140 -0
  179. package/skills/architecture-design/chapters/ch01-4a-domains.md +27 -0
  180. package/skills/architecture-design/chapters/ch02-change-cascade.md +27 -0
  181. package/skills/architecture-design/chapters/ch03-architecture-outputs.md +25 -0
  182. package/skills/architecture-design/chapters/ch04-entity-to-aggregate.md +27 -0
  183. package/skills/architecture-design/chapters/ch05-cqrs.md +32 -0
  184. package/skills/architecture-design/chapters/ch06-integration.md +54 -0
  185. package/skills/architecture-design/cheatsheet.md +51 -0
  186. package/skills/architecture-design/glossary.md +23 -0
  187. package/skills/architecture-design/patterns.md +32 -0
  188. package/skills/bug-investigator/SKILL.md +77 -0
  189. package/skills/build-executor/SKILL.md +163 -0
  190. package/skills/build-executor/implementer-prompt.md +162 -0
  191. package/skills/build-executor/references/execution-modes.md +86 -0
  192. package/skills/build-executor/task-reviewer-prompt.md +195 -0
  193. package/skills/ce-brainstorm/SKILL.md +415 -0
  194. package/skills/ce-brainstorm/references/agents/slack-researcher.md +127 -0
  195. package/skills/ce-brainstorm/references/blindspot-pass.md +70 -0
  196. package/skills/ce-brainstorm/references/brainstorm-sections.md +285 -0
  197. package/skills/ce-brainstorm/references/handoff.md +168 -0
  198. package/skills/ce-brainstorm/references/html-rendering.md +634 -0
  199. package/skills/ce-brainstorm/references/markdown-rendering.md +241 -0
  200. package/skills/ce-brainstorm/references/model-tiers.md +9 -0
  201. package/skills/ce-brainstorm/references/prd-mapping.md +71 -0
  202. package/skills/ce-brainstorm/references/product-pressure-test.md +42 -0
  203. package/skills/ce-brainstorm/references/reasoning-elevation.md +63 -0
  204. package/skills/ce-brainstorm/references/settled-decisions.md +45 -0
  205. package/skills/ce-brainstorm/references/synthesis-summary.md +282 -0
  206. package/skills/ce-brainstorm/references/universal-brainstorming.md +73 -0
  207. package/skills/ce-brainstorm/references/verdict-routing.md +26 -0
  208. package/skills/ce-brainstorm/references/visual-probes.md +158 -0
  209. package/skills/ce-brainstorm/scripts/visual-probe-server.js +418 -0
  210. package/skills/ce-compound/SKILL.md +114 -0
  211. package/skills/ce-compound/assets/resolution-template.md +94 -0
  212. package/skills/ce-compound/references/agents/best-practices-researcher.md +115 -0
  213. package/skills/ce-compound/references/agents/data-integrity-guardian.md +68 -0
  214. package/skills/ce-compound/references/agents/framework-docs-researcher.md +93 -0
  215. package/skills/ce-compound/references/agents/pattern-recognition-specialist.md +55 -0
  216. package/skills/ce-compound/references/agents/performance-oracle.md +108 -0
  217. package/skills/ce-compound/references/agents/security-sentinel.md +91 -0
  218. package/skills/ce-compound/references/agents/session-historian.md +83 -0
  219. package/skills/ce-compound/references/concepts-vocabulary.md +78 -0
  220. package/skills/ce-compound/references/full-mode-workflow.md +413 -0
  221. package/skills/ce-compound/references/grounding-validation.md +84 -0
  222. package/skills/ce-compound/references/lightweight-mode.md +53 -0
  223. package/skills/ce-compound/references/output-standards.md +182 -0
  224. package/skills/ce-compound/references/promotion-rules.md +38 -0
  225. package/skills/ce-compound/references/schema.yaml +231 -0
  226. package/skills/ce-compound/references/three-tier-index.md +55 -0
  227. package/skills/ce-compound/references/v0.5-upgrade.md +32 -0
  228. package/skills/ce-compound/references/write-flow.md +36 -0
  229. package/skills/ce-compound/references/yaml-schema.md +118 -0
  230. package/skills/ce-compound/scripts/session-history/discover-sessions.sh +130 -0
  231. package/skills/ce-compound/scripts/session-history/extract-errors.py +254 -0
  232. package/skills/ce-compound/scripts/session-history/extract-metadata.py +456 -0
  233. package/skills/ce-compound/scripts/session-history/extract-skeleton.py +575 -0
  234. package/skills/ce-compound/scripts/validate-doc-claims.py +346 -0
  235. package/skills/ce-compound/scripts/validate-frontmatter.py +137 -0
  236. package/skills/ce-ideate/SKILL.md +402 -0
  237. package/skills/ce-ideate/references/agents/issue-intelligence-analyst.md +200 -0
  238. package/skills/ce-ideate/references/agents/learnings-researcher.md +247 -0
  239. package/skills/ce-ideate/references/agents/slack-researcher.md +127 -0
  240. package/skills/ce-ideate/references/agents/web-researcher.md +121 -0
  241. package/skills/ce-ideate/references/divergent-ideation.md +89 -0
  242. package/skills/ce-ideate/references/html-rendering.md +634 -0
  243. package/skills/ce-ideate/references/ideation-sections.md +191 -0
  244. package/skills/ce-ideate/references/markdown-rendering.md +238 -0
  245. package/skills/ce-ideate/references/post-ideation-workflow.md +167 -0
  246. package/skills/ce-ideate/references/universal-ideation.md +107 -0
  247. package/skills/ce-ideate/references/web-research-cache.md +56 -0
  248. package/skills/ce-plan/SKILL.md +137 -0
  249. package/skills/ce-plan/references/agents/agent-native-planning-strategist.md +62 -0
  250. package/skills/ce-plan/references/agents/architecture-strategist.md +46 -0
  251. package/skills/ce-plan/references/agents/best-practices-researcher.md +114 -0
  252. package/skills/ce-plan/references/agents/data-integrity-guardian.md +68 -0
  253. package/skills/ce-plan/references/agents/data-migration-reviewer.md +103 -0
  254. package/skills/ce-plan/references/agents/deployment-verification-agent.md +157 -0
  255. package/skills/ce-plan/references/agents/framework-docs-researcher.md +93 -0
  256. package/skills/ce-plan/references/agents/git-history-analyzer.md +40 -0
  257. package/skills/ce-plan/references/agents/learnings-researcher.md +247 -0
  258. package/skills/ce-plan/references/agents/pattern-recognition-specialist.md +55 -0
  259. package/skills/ce-plan/references/agents/performance-oracle.md +108 -0
  260. package/skills/ce-plan/references/agents/repo-research-analyst.md +258 -0
  261. package/skills/ce-plan/references/agents/security-sentinel.md +91 -0
  262. package/skills/ce-plan/references/agents/slack-researcher.md +127 -0
  263. package/skills/ce-plan/references/agents/spec-flow-analyzer.md +80 -0
  264. package/skills/ce-plan/references/agents/web-researcher.md +121 -0
  265. package/skills/ce-plan/references/approach-altitude.md +55 -0
  266. package/skills/ce-plan/references/change-splitting.md +65 -0
  267. package/skills/ce-plan/references/completion-contract.md +33 -0
  268. package/skills/ce-plan/references/core-principles.md +40 -0
  269. package/skills/ce-plan/references/deepening-workflow.md +263 -0
  270. package/skills/ce-plan/references/dependency-graph.md +36 -0
  271. package/skills/ce-plan/references/html-rendering.md +634 -0
  272. package/skills/ce-plan/references/intake-routing.md +189 -0
  273. package/skills/ce-plan/references/markdown-rendering.md +238 -0
  274. package/skills/ce-plan/references/plan-handoff.md +150 -0
  275. package/skills/ce-plan/references/plan-sections.md +427 -0
  276. package/skills/ce-plan/references/plan-structure.md +120 -0
  277. package/skills/ce-plan/references/planning-modes.md +69 -0
  278. package/skills/ce-plan/references/reasoning-elevation.md +63 -0
  279. package/skills/ce-plan/references/research-workflow.md +165 -0
  280. package/skills/ce-plan/references/review-and-write.md +127 -0
  281. package/skills/ce-plan/references/settled-decisions.md +45 -0
  282. package/skills/ce-plan/references/synthesis-summary.md +418 -0
  283. package/skills/ce-plan/references/universal-planning.md +168 -0
  284. package/skills/ce-proof/SKILL.md +346 -0
  285. package/skills/ce-strategy/SKILL.md +97 -0
  286. package/skills/ce-strategy/references/interview.md +143 -0
  287. package/skills/ce-strategy/references/strategy-template.md +89 -0
  288. package/skills/code-reviewer/SKILL.md +84 -0
  289. package/skills/code-reviewer/code-reviewer-prompt.md +195 -0
  290. package/skills/contract-builder/SKILL.md +72 -0
  291. package/skills/design-system/SKILL.md +75 -0
  292. package/skills/design-system/references/agents/design-system-architect.md +138 -0
  293. package/skills/design-system/references/creation-flow.md +170 -0
  294. package/skills/design-system/references/preview-template.html +319 -0
  295. package/skills/design-system/references/token-derivation.md +115 -0
  296. package/skills/design-system/references/variant-schema.md +60 -0
  297. package/skills/e2e/SKILL.md +56 -0
  298. package/skills/e2e/references/test-verifier.md +40 -0
  299. package/skills/need-explorer/SKILL.md +79 -0
  300. package/skills/prototype/SKILL.md +98 -0
  301. package/skills/prototype/references/agents/design-system-architect.md +122 -0
  302. package/skills/prototype/references/checklist.md +82 -0
  303. package/skills/prototype/references/craft/accessibility-baseline.md +71 -0
  304. package/skills/prototype/references/craft/anti-ai-slop.md +87 -0
  305. package/skills/prototype/references/craft/laws-of-ux.md +60 -0
  306. package/skills/prototype/references/craft/state-coverage.md +81 -0
  307. package/skills/prototype/references/craft/typography-hierarchy.md +50 -0
  308. package/skills/prototype/references/layouts.md +223 -0
  309. package/skills/prototype/references/orchestration-flow.md +101 -0
  310. package/skills/prototype/references/prototype-scaffold/assets/design-tokens.css +19 -0
  311. package/skills/prototype/references/prototype-scaffold/components/button.html +3 -0
  312. package/skills/prototype/references/prototype-scaffold/design-system.md +7 -0
  313. package/skills/prototype/references/prototype-scaffold/flow.md +11 -0
  314. package/skills/prototype/references/prototype-scaffold/index.html +20 -0
  315. package/skills/prototype/references/prototype-scaffold/pages/index.html +11 -0
  316. package/skills/prototype/references/template.html +396 -0
  317. package/skills/release-archivist/SKILL.md +166 -0
  318. package/skills/release-archivist/references/closing-procedures.md +81 -0
  319. package/skills/session-handoff/SKILL.md +110 -0
  320. package/skills/session-handoff/references/context-extraction.md +70 -0
  321. package/skills/session-handoff/references/handoff-template.md +90 -0
  322. package/skills/session-handoff/references/skill-recommendation.md +43 -0
  323. package/skills/spec-merger/SKILL.md +66 -0
  324. package/skills/spec-writer/SKILL.md +149 -0
  325. package/skills/workflow-bootstrap/SKILL.md +148 -0
  326. package/skills/workflow-bootstrap/references/agents/codebase-recon-analyst.md +121 -0
  327. package/skills/workflow-bootstrap/references/b1-reconnaissance.md +80 -0
  328. package/skills/workflow-bootstrap/scripts/recon-probe.sh +328 -0
  329. package/skills/workflow-feedback/SKILL.md +120 -0
  330. package/skills/workflow-feedback/references/category-guide.md +121 -0
  331. package/skills/workflow-feedback/references/feedback-template.md +73 -0
  332. package/skills/workflow-feedback/references/review-mode.md +92 -0
  333. package/skills/workflow-orchestrator/SKILL.md +94 -0
  334. package/skills/workflow-orchestrator/references/feedback-loops.md +56 -0
  335. package/skills/workflow-orchestrator/references/s1-path-router.md +81 -0
  336. package/skills/workflow-orchestrator/references/s2-prd-prototype-loop.md +96 -0
  337. package/skills/workflow-orchestrator/references/s3-plan-pipeline.md +50 -0
  338. package/skills/workflow-orchestrator/references/s4-split-validate.md +108 -0
  339. package/skills/workflow-orchestrator/references/s5-monitoring.md +61 -0
  340. package/skills/workflow-orchestrator/references/state-model.md +185 -0
  341. package/skills/workflow-start/SKILL.md +147 -0
  342. package/skills/workflow-start/references/routing-rules.md +155 -0
  343. package/src/index.ts +16 -0
  344. package/src/parsing/change-parser.ts +79 -0
  345. package/src/parsing/requirement-blocks.ts +244 -0
  346. package/src/schema/base.ts +8 -0
  347. package/src/schema/change.ts +29 -0
  348. package/src/schema/index.ts +3 -0
  349. package/src/schema/spec.ts +12 -0
  350. package/src/validation/constants.ts +53 -0
  351. package/src/validation/tokenizer.ts +180 -0
  352. package/src/validation/types.ts +47 -0
  353. package/src/validation/validator.ts +552 -0
  354. package/templates/abandonment-summary.md +29 -0
  355. package/templates/design.md +37 -0
  356. package/templates/execution-contract.md +99 -0
  357. package/templates/plan.md +86 -0
  358. package/templates/prd.md +468 -0
  359. package/templates/proposal.md +37 -0
  360. package/templates/spec.md +31 -0
  361. package/templates/tasks.md +47 -0
  362. package/tests/e2e.test.mjs +266 -0
  363. package/tests/lib/cmd-audit.test.mjs +202 -0
  364. package/tests/lib/cmd-checkpoint.test.mjs +98 -0
  365. package/tests/lib/cmd-config.test.mjs +101 -0
  366. package/tests/lib/cmd-doctor.test.mjs +450 -0
  367. package/tests/lib/cmd-execution.test.mjs +647 -0
  368. package/tests/lib/cmd-handoff.test.mjs +137 -0
  369. package/tests/lib/cmd-inject.test.mjs +218 -0
  370. package/tests/lib/cmd-install-workbuddy.test.mjs +113 -0
  371. package/tests/lib/cmd-install-zcode.test.mjs +42 -0
  372. package/tests/lib/cmd-isolate.test.mjs +68 -0
  373. package/tests/lib/cmd-list.test.mjs +127 -0
  374. package/tests/lib/cmd-runtime.test.mjs +83 -0
  375. package/tests/lib/cmd-state-missing.test.mjs +65 -0
  376. package/tests/lib/cmd-state.test.mjs +365 -0
  377. package/tests/lib/cmd-sync-paths.test.mjs +84 -0
  378. package/tests/lib/cmd-validate-paths.test.mjs +90 -0
  379. package/tests/lib/config-loader.test.mjs +175 -0
  380. package/tests/lib/ensure-branch.test.mjs +59 -0
  381. package/tests/lib/execution-control-plane.test.mjs +168 -0
  382. package/tests/lib/execution-plan.test.mjs +474 -0
  383. package/tests/lib/guard-specs-merged.test.mjs +108 -0
  384. package/tests/lib/guard-tests-passing.test.mjs +112 -0
  385. package/tests/lib/guard-transitions.test.mjs +262 -0
  386. package/tests/lib/guard.test.mjs +611 -0
  387. package/tests/lib/hash.test.mjs +138 -0
  388. package/tests/lib/infer-workflow.test.mjs +161 -0
  389. package/tests/lib/install-git-hooks.test.mjs +20 -0
  390. package/tests/lib/marketplace-release-docs.test.mjs +31 -0
  391. package/tests/lib/minimality-discipline.test.mjs +37 -0
  392. package/tests/lib/model-profiles-docs.test.mjs +33 -0
  393. package/tests/lib/node20-compatibility.test.mjs +73 -0
  394. package/tests/lib/node20-test-entry.test.mjs +17 -0
  395. package/tests/lib/platform-runtime-distribution.test.mjs +150 -0
  396. package/tests/lib/raw-mode-smoke.test.mjs +42 -0
  397. package/tests/lib/sdd-overlay.test.mjs +118 -0
  398. package/tests/lib/spec-paths.test.mjs +80 -0
  399. package/tests/lib/state-loader.test.mjs +251 -0
  400. package/tests/lib/token-baseline.test.mjs +72 -0
  401. package/tests/lib/token-rules.test.mjs +94 -0
  402. package/tests/lib/verify-marketplace-release.test.mjs +128 -0
  403. package/tests/tsconfig.json +12 -0
  404. package/token-baseline.json +95 -0
  405. package/tsconfig.json +14 -0
@@ -0,0 +1,489 @@
1
+ import { MIN_PURPOSE_LENGTH, MIN_WHY_SECTION_LENGTH, MAX_WHY_SECTION_LENGTH, MAX_REQUIREMENT_TEXT_LENGTH, MAX_DELTAS_PER_CHANGE, VALIDATION_MESSAGES, VERIFICATION_MESSAGES, } from './constants.js';
2
+ import { tokenize } from './tokenizer.js';
3
+ import { parseDeltaSpec, normalizeRequirementName, extractRequirementsSection, } from '../parsing/requirement-blocks.js';
4
+ const REQUIREMENT_HEADER_REGEX = /^###\s*Requirement:\s*(.+)\s*$/i;
5
+ const SCENARIO_HEADER_REGEX = /^####\s+Scenario:/i;
6
+ function normalizeLineEndings(content) {
7
+ return content.replace(/\r\n?/g, '\n');
8
+ }
9
+ function extractSection(content, heading) {
10
+ const normalized = normalizeLineEndings(content);
11
+ const lines = normalized.split('\n');
12
+ // Match headings that contain the English keyword — supports both
13
+ // "## Why" and "## 背景(Why)" style bilingual headings.
14
+ const headingRegex = new RegExp(`^##\\s+.*\\b${heading.replace(/\s+/g, '\\s+')}\\b.*$`, 'i');
15
+ const idx = lines.findIndex((l) => headingRegex.test(l));
16
+ if (idx === -1)
17
+ return undefined;
18
+ let endIdx = lines.length;
19
+ for (let i = idx + 1; i < lines.length; i++) {
20
+ if (/^##\s+/.test(lines[i])) {
21
+ endIdx = i;
22
+ break;
23
+ }
24
+ }
25
+ return lines.slice(idx + 1, endIdx).join('\n').trim();
26
+ }
27
+ function containsShallOrMust(text) {
28
+ return /\b(SHALL|MUST)\b/.test(text);
29
+ }
30
+ function countScenarios(blockRaw) {
31
+ const matches = blockRaw.match(/^####\s+/gm);
32
+ return matches ? matches.length : 0;
33
+ }
34
+ function extractRequirementText(blockRaw) {
35
+ const lines = blockRaw.split('\n');
36
+ for (let i = 1; i < lines.length; i++) {
37
+ const line = lines[i];
38
+ if (/^####\s+/.test(line))
39
+ break;
40
+ const trimmed = line.trim();
41
+ if (trimmed.length === 0)
42
+ continue;
43
+ if (/^\*\*[^*]+\*\*:/.test(trimmed))
44
+ continue;
45
+ return trimmed;
46
+ }
47
+ return undefined;
48
+ }
49
+ function buildMissingShallOrMustMessage(action, blockName) {
50
+ const base = `${action} "${blockName}" must contain SHALL or MUST`;
51
+ if (containsShallOrMust(blockName)) {
52
+ return `${base} in the requirement body, not only in the header. Move the SHALL/MUST statement to the line immediately after the "### Requirement: ..." header.`;
53
+ }
54
+ return base;
55
+ }
56
+ function formatSectionList(sections) {
57
+ if (sections.length === 0)
58
+ return '';
59
+ if (sections.length === 1)
60
+ return sections[0];
61
+ const head = sections.slice(0, -1);
62
+ const last = sections[sections.length - 1];
63
+ return `${head.join(', ')} and ${last}`;
64
+ }
65
+ function enrichTopLevelError(itemId, baseMessage) {
66
+ const msg = baseMessage.trim();
67
+ if (msg === VALIDATION_MESSAGES.CHANGE_NO_DELTAS) {
68
+ return `${msg}. ${VALIDATION_MESSAGES.GUIDE_NO_DELTAS}`;
69
+ }
70
+ if (msg.includes('Spec must have a Purpose section') ||
71
+ msg.includes('Spec must have a Requirements section')) {
72
+ return `${msg}. ${VALIDATION_MESSAGES.GUIDE_MISSING_SPEC_SECTIONS}`;
73
+ }
74
+ if (msg.includes('Change must have a Why section') ||
75
+ msg.includes('Change must have a What Changes section')) {
76
+ return `${msg}. ${VALIDATION_MESSAGES.GUIDE_MISSING_CHANGE_SECTIONS}`;
77
+ }
78
+ return msg;
79
+ }
80
+ function createReport(issues, strictMode = false) {
81
+ const errors = issues.filter((i) => i.level === 'ERROR').length;
82
+ const warnings = issues.filter((i) => i.level === 'WARNING').length;
83
+ const info = issues.filter((i) => i.level === 'INFO').length;
84
+ const valid = strictMode ? errors === 0 && warnings === 0 : errors === 0;
85
+ return {
86
+ valid,
87
+ issues,
88
+ summary: { errors, warnings, info },
89
+ };
90
+ }
91
+ export class Validator {
92
+ strictMode;
93
+ constructor(strictMode = false) {
94
+ this.strictMode = strictMode;
95
+ }
96
+ validateSpecContent(specName, content) {
97
+ const issues = [];
98
+ if (!specName || specName.trim().length === 0) {
99
+ issues.push({ level: 'ERROR', path: 'name', message: VALIDATION_MESSAGES.SPEC_NAME_EMPTY });
100
+ }
101
+ const purposeSection = extractSection(content, 'Purpose');
102
+ if (!purposeSection || purposeSection.trim().length === 0) {
103
+ issues.push({
104
+ level: 'ERROR',
105
+ path: 'overview',
106
+ message: VALIDATION_MESSAGES.SPEC_PURPOSE_EMPTY,
107
+ });
108
+ }
109
+ else if (purposeSection.length < MIN_PURPOSE_LENGTH) {
110
+ issues.push({
111
+ level: 'WARNING',
112
+ path: 'overview',
113
+ message: VALIDATION_MESSAGES.PURPOSE_TOO_BRIEF,
114
+ });
115
+ }
116
+ const reqSectionParts = extractRequirementsSection(content);
117
+ if (reqSectionParts.bodyBlocks.length === 0) {
118
+ issues.push({
119
+ level: 'ERROR',
120
+ path: 'requirements',
121
+ message: VALIDATION_MESSAGES.SPEC_NO_REQUIREMENTS,
122
+ });
123
+ }
124
+ for (const block of reqSectionParts.bodyBlocks) {
125
+ const reqText = extractRequirementText(block.raw);
126
+ if (!reqText || reqText.trim().length === 0) {
127
+ issues.push({
128
+ level: 'ERROR',
129
+ path: `requirements.${block.name}`,
130
+ message: VALIDATION_MESSAGES.REQUIREMENT_EMPTY,
131
+ });
132
+ }
133
+ else {
134
+ if (!containsShallOrMust(reqText)) {
135
+ issues.push({
136
+ level: 'ERROR',
137
+ path: `requirements.${block.name}`,
138
+ message: buildMissingShallOrMustMessage('ADDED', block.name),
139
+ });
140
+ }
141
+ if (reqText.length > MAX_REQUIREMENT_TEXT_LENGTH) {
142
+ issues.push({
143
+ level: 'INFO',
144
+ path: `requirements.${block.name}`,
145
+ message: VALIDATION_MESSAGES.REQUIREMENT_TOO_LONG,
146
+ });
147
+ }
148
+ }
149
+ const scenarioCount = countScenarios(block.raw);
150
+ if (scenarioCount < 1) {
151
+ issues.push({
152
+ level: 'WARNING',
153
+ path: `requirements.${block.name}.scenarios`,
154
+ message: `${VALIDATION_MESSAGES.REQUIREMENT_NO_SCENARIOS}. ${VALIDATION_MESSAGES.GUIDE_SCENARIO_FORMAT}`,
155
+ });
156
+ }
157
+ }
158
+ return createReport(issues, this.strictMode);
159
+ }
160
+ validateChangeContent(changeName, content) {
161
+ const issues = [];
162
+ if (!changeName || changeName.trim().length === 0) {
163
+ issues.push({ level: 'ERROR', path: 'name', message: VALIDATION_MESSAGES.CHANGE_NAME_EMPTY });
164
+ }
165
+ const whySection = extractSection(content, 'Why');
166
+ if (!whySection || whySection.trim().length === 0) {
167
+ issues.push({
168
+ level: 'ERROR',
169
+ path: 'why',
170
+ message: VALIDATION_MESSAGES.CHANGE_WHY_TOO_SHORT,
171
+ });
172
+ }
173
+ else {
174
+ if (whySection.length < MIN_WHY_SECTION_LENGTH) {
175
+ issues.push({
176
+ level: 'ERROR',
177
+ path: 'why',
178
+ message: VALIDATION_MESSAGES.CHANGE_WHY_TOO_SHORT,
179
+ });
180
+ }
181
+ if (whySection.length > MAX_WHY_SECTION_LENGTH) {
182
+ issues.push({
183
+ level: 'WARNING',
184
+ path: 'why',
185
+ message: VALIDATION_MESSAGES.CHANGE_WHY_TOO_LONG,
186
+ });
187
+ }
188
+ }
189
+ const whatChanges = extractSection(content, 'What Changes');
190
+ if (!whatChanges || whatChanges.trim().length === 0) {
191
+ issues.push({
192
+ level: 'ERROR',
193
+ path: 'whatChanges',
194
+ message: VALIDATION_MESSAGES.CHANGE_WHAT_EMPTY,
195
+ });
196
+ }
197
+ return createReport(issues, this.strictMode);
198
+ }
199
+ validateDeltaSpec(content) {
200
+ const issues = [];
201
+ const plan = parseDeltaSpec(content);
202
+ const totalDeltas = plan.added.length + plan.modified.length + plan.removed.length + plan.renamed.length;
203
+ if (totalDeltas === 0) {
204
+ issues.push({
205
+ level: 'ERROR',
206
+ path: 'file',
207
+ message: enrichTopLevelError('change', VALIDATION_MESSAGES.CHANGE_NO_DELTAS),
208
+ });
209
+ return createReport(issues, this.strictMode);
210
+ }
211
+ if (totalDeltas > MAX_DELTAS_PER_CHANGE) {
212
+ issues.push({
213
+ level: 'WARNING',
214
+ path: 'file',
215
+ message: VALIDATION_MESSAGES.CHANGE_TOO_MANY_DELTAS,
216
+ });
217
+ }
218
+ const addedNames = new Set();
219
+ const modifiedNames = new Set();
220
+ const removedNames = new Set();
221
+ const renamedFrom = new Set();
222
+ const renamedTo = new Set();
223
+ for (const block of plan.added) {
224
+ const key = normalizeRequirementName(block.name);
225
+ if (addedNames.has(key)) {
226
+ issues.push({
227
+ level: 'ERROR',
228
+ path: 'added',
229
+ message: `Duplicate requirement in ADDED: "${block.name}"`,
230
+ });
231
+ }
232
+ else {
233
+ addedNames.add(key);
234
+ }
235
+ const reqText = extractRequirementText(block.raw);
236
+ if (!reqText) {
237
+ issues.push({
238
+ level: 'ERROR',
239
+ path: `added.${block.name}`,
240
+ message: `ADDED "${block.name}" is missing requirement text`,
241
+ });
242
+ }
243
+ else if (!containsShallOrMust(reqText)) {
244
+ issues.push({
245
+ level: 'ERROR',
246
+ path: `added.${block.name}`,
247
+ message: buildMissingShallOrMustMessage('ADDED', block.name),
248
+ });
249
+ }
250
+ if (countScenarios(block.raw) < 1) {
251
+ issues.push({
252
+ level: 'ERROR',
253
+ path: `added.${block.name}`,
254
+ message: `ADDED "${block.name}" must include at least one scenario`,
255
+ });
256
+ }
257
+ }
258
+ for (const block of plan.modified) {
259
+ const key = normalizeRequirementName(block.name);
260
+ if (modifiedNames.has(key)) {
261
+ issues.push({
262
+ level: 'ERROR',
263
+ path: 'modified',
264
+ message: `Duplicate requirement in MODIFIED: "${block.name}"`,
265
+ });
266
+ }
267
+ else {
268
+ modifiedNames.add(key);
269
+ }
270
+ const reqText = extractRequirementText(block.raw);
271
+ if (!reqText) {
272
+ issues.push({
273
+ level: 'ERROR',
274
+ path: `modified.${block.name}`,
275
+ message: `MODIFIED "${block.name}" is missing requirement text`,
276
+ });
277
+ }
278
+ else if (!containsShallOrMust(reqText)) {
279
+ issues.push({
280
+ level: 'ERROR',
281
+ path: `modified.${block.name}`,
282
+ message: buildMissingShallOrMustMessage('MODIFIED', block.name),
283
+ });
284
+ }
285
+ if (countScenarios(block.raw) < 1) {
286
+ issues.push({
287
+ level: 'ERROR',
288
+ path: `modified.${block.name}`,
289
+ message: `MODIFIED "${block.name}" must include at least one scenario`,
290
+ });
291
+ }
292
+ }
293
+ for (const name of plan.removed) {
294
+ const key = normalizeRequirementName(name);
295
+ if (removedNames.has(key)) {
296
+ issues.push({
297
+ level: 'ERROR',
298
+ path: 'removed',
299
+ message: `Duplicate requirement in REMOVED: "${name}"`,
300
+ });
301
+ }
302
+ else {
303
+ removedNames.add(key);
304
+ }
305
+ }
306
+ for (const { from, to } of plan.renamed) {
307
+ const fromKey = normalizeRequirementName(from);
308
+ const toKey = normalizeRequirementName(to);
309
+ if (renamedFrom.has(fromKey)) {
310
+ issues.push({
311
+ level: 'ERROR',
312
+ path: 'renamed',
313
+ message: `Duplicate FROM in RENAMED: "${from}"`,
314
+ });
315
+ }
316
+ else {
317
+ renamedFrom.add(fromKey);
318
+ }
319
+ if (renamedTo.has(toKey)) {
320
+ issues.push({
321
+ level: 'ERROR',
322
+ path: 'renamed',
323
+ message: `Duplicate TO in RENAMED: "${to}"`,
324
+ });
325
+ }
326
+ else {
327
+ renamedTo.add(toKey);
328
+ }
329
+ }
330
+ for (const n of modifiedNames) {
331
+ if (removedNames.has(n)) {
332
+ issues.push({
333
+ level: 'ERROR',
334
+ path: 'cross-section',
335
+ message: `Requirement present in both MODIFIED and REMOVED: "${n}"`,
336
+ });
337
+ }
338
+ if (addedNames.has(n)) {
339
+ issues.push({
340
+ level: 'ERROR',
341
+ path: 'cross-section',
342
+ message: `Requirement present in both MODIFIED and ADDED: "${n}"`,
343
+ });
344
+ }
345
+ }
346
+ for (const n of addedNames) {
347
+ if (removedNames.has(n)) {
348
+ issues.push({
349
+ level: 'ERROR',
350
+ path: 'cross-section',
351
+ message: `Requirement present in both ADDED and REMOVED: "${n}"`,
352
+ });
353
+ }
354
+ }
355
+ for (const { from, to } of plan.renamed) {
356
+ const fromKey = normalizeRequirementName(from);
357
+ const toKey = normalizeRequirementName(to);
358
+ if (modifiedNames.has(fromKey)) {
359
+ issues.push({
360
+ level: 'ERROR',
361
+ path: 'cross-section',
362
+ message: `MODIFIED references old name from RENAMED. Use new header for "${to}"`,
363
+ });
364
+ }
365
+ if (addedNames.has(toKey)) {
366
+ issues.push({
367
+ level: 'ERROR',
368
+ path: 'cross-section',
369
+ message: `RENAMED TO collides with ADDED for "${to}"`,
370
+ });
371
+ }
372
+ }
373
+ return createReport(issues, this.strictMode);
374
+ }
375
+ validateImplementation(diffSummary, specContent, designContent, config) {
376
+ const dimensions = [];
377
+ const language = config?.verification?.language ?? 'auto';
378
+ // --- Completeness ---
379
+ const completenessFindings = [];
380
+ const requirements = this.extractRequirementNames(specContent);
381
+ const diffTokens = tokenize(diffSummary, language);
382
+ for (const req of requirements) {
383
+ // A requirement is considered covered when every significant token appears
384
+ // somewhere in the diff tokens. Uses language-aware tokenization so that
385
+ // both English (stemming) and Chinese (CJK sliding window) are handled.
386
+ const reqTokens = tokenize(req, language);
387
+ const allPresent = reqTokens.size === 0 || [...reqTokens].every(t => diffTokens.has(t));
388
+ if (!allPresent) {
389
+ completenessFindings.push({
390
+ level: 'CRITICAL',
391
+ dimension: 'Completeness',
392
+ message: VERIFICATION_MESSAGES.COMPLETENESS_MISSING_REQUIREMENT.replace('{requirement}', req),
393
+ });
394
+ }
395
+ }
396
+ dimensions.push({
397
+ name: 'Completeness',
398
+ status: completenessFindings.some(f => f.level === 'CRITICAL') ? 'FAIL' : completenessFindings.length > 0 ? 'WARN' : 'PASS',
399
+ findings: completenessFindings,
400
+ });
401
+ // --- Correctness ---
402
+ const correctnessFindings = [];
403
+ const placeholderPatterns = ['TODO', 'FIXME', 'HACK', 'XXX', 'PLACEHOLDER'];
404
+ for (const pattern of placeholderPatterns) {
405
+ if (diffSummary.includes(pattern)) {
406
+ correctnessFindings.push({
407
+ level: 'CRITICAL',
408
+ dimension: 'Correctness',
409
+ message: VERIFICATION_MESSAGES.VERIFICATION_PLACEHOLDER_DETECTED,
410
+ });
411
+ break;
412
+ }
413
+ }
414
+ dimensions.push({
415
+ name: 'Correctness',
416
+ status: correctnessFindings.some(f => f.level === 'CRITICAL') ? 'FAIL' : correctnessFindings.length > 0 ? 'WARN' : 'PASS',
417
+ findings: correctnessFindings,
418
+ });
419
+ // --- Coherence ---
420
+ const coherenceFindings = [];
421
+ const decisionNames = this.extractDecisionNames(designContent);
422
+ for (const name of decisionNames) {
423
+ // Tokenize both the decision name and the diff summary using language-aware
424
+ // tokenization, then check that all decision tokens appear in diff tokens.
425
+ const decisionTokens = tokenize(name, language);
426
+ const allPresent = decisionTokens.size === 0 || [...decisionTokens].every(t => diffTokens.has(t));
427
+ if (!allPresent) {
428
+ coherenceFindings.push({
429
+ level: 'IMPORTANT',
430
+ dimension: 'Coherence',
431
+ message: VERIFICATION_MESSAGES.COHERENCE_PATTERN_MISSING.replace('{pattern}', name),
432
+ });
433
+ }
434
+ }
435
+ dimensions.push({
436
+ name: 'Coherence',
437
+ status: coherenceFindings.some(f => f.level === 'CRITICAL') ? 'FAIL' : coherenceFindings.length > 0 ? 'WARN' : 'PASS',
438
+ findings: coherenceFindings,
439
+ });
440
+ // --- Verdict ---
441
+ const hasCritical = dimensions.some(d => d.status === 'FAIL');
442
+ const hasWarning = dimensions.some(d => d.status === 'WARN');
443
+ const verdict = hasCritical ? 'FAIL' : hasWarning ? 'CONDITIONAL' : 'PASS';
444
+ return { dimensions, verdict };
445
+ }
446
+ extractRequirementNames(specContent) {
447
+ const regex = /### Requirement:\s*(.+)/g;
448
+ const names = [];
449
+ let match;
450
+ while ((match = regex.exec(specContent)) !== null) {
451
+ names.push(match[1].trim());
452
+ }
453
+ return names;
454
+ }
455
+ extractDecisionNames(designContent) {
456
+ const regex = /- Choice:\s*(.+)/g;
457
+ const names = [];
458
+ let match;
459
+ while ((match = regex.exec(designContent)) !== null) {
460
+ names.push(match[1].trim());
461
+ }
462
+ return names;
463
+ }
464
+ detectSyncConflicts(deltaSpecs) {
465
+ const reqToChanges = new Map();
466
+ for (const { changeName, content } of deltaSpecs) {
467
+ const plan = parseDeltaSpec(content);
468
+ const names = [
469
+ ...plan.modified.map(b => normalizeRequirementName(b.name)),
470
+ ...plan.renamed.map(r => normalizeRequirementName(r.to)),
471
+ ];
472
+ for (const name of names) {
473
+ const existing = reqToChanges.get(name) || [];
474
+ existing.push(changeName);
475
+ reqToChanges.set(name, existing);
476
+ }
477
+ }
478
+ const conflicts = [];
479
+ for (const [requirement, changes] of reqToChanges) {
480
+ if (changes.length >= 2) {
481
+ conflicts.push({ requirement, spec: requirement, changes });
482
+ }
483
+ }
484
+ return { hasConflicts: conflicts.length > 0, conflicts };
485
+ }
486
+ isValid(report) {
487
+ return report.valid;
488
+ }
489
+ }