ai-delivery-workflow 0.2.2 → 0.4.0

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 (361) hide show
  1. package/README.md +45 -14
  2. package/bin/ai-delivery.mjs +181 -6
  3. package/bin/benchmark-autonomy.mjs +217 -0
  4. package/bin/release-check.mjs +382 -0
  5. package/docs/CLI-PARAMETER-REFERENCE.zh-CN.md +346 -0
  6. package/docs/CODEGRAPH-INTEGRATION.zh-CN.md +89 -0
  7. package/docs/DUAL-REPOSITORY-WORKSPACE.zh-CN.md +2 -2
  8. package/docs/EVOLUTION-MAINTENANCE.zh-CN.md +7 -7
  9. package/docs/EVOLUTION-USER-GUIDE.zh-CN.md +2 -2
  10. package/docs/FILE-REFERENCE.zh-CN.md +120 -39
  11. package/docs/MAINTENANCE-VERIFICATION.zh-CN.md +51 -0
  12. package/docs/MOCK-SYSTEM.zh-CN.md +141 -0
  13. package/docs/NPM-RELEASE-MANAGEMENT.zh-CN.md +106 -0
  14. package/docs/PROJECT-MANUAL.zh-CN.md +154 -95
  15. package/docs/PROTOTYPE-MIGRATION.zh-CN.md +164 -0
  16. package/docs/STATE-CLI-MAINTENANCE.zh-CN.md +35 -17
  17. package/docs/STATE-CLI-USER-GUIDE.zh-CN.md +115 -39
  18. package/docs/VIEWER-MAINTENANCE.zh-CN.md +101 -324
  19. package/docs/VIEWER-USER-GUIDE.zh-CN.md +68 -190
  20. package/docs/adr/0001-prototype-first-ui-governance.md +3 -0
  21. package/docs/adr/0002-microcks-as-default-mock-system.md +3 -0
  22. package/docs/adr/0003-workflow-manager-governed-control-surface.md +46 -0
  23. package/docs/adr/0004-operational-carbon-visual-standard.md +9 -0
  24. package/docs/adr/0005-prototype-management-as-routed-pages.md +7 -0
  25. package/docs/agents/domain.md +12 -0
  26. package/docs/agents/issue-tracker.md +27 -0
  27. package/docs/agents/triage-labels.md +11 -0
  28. package/docs/agents/workflow-manager-acceptance-matrix.md +93 -0
  29. package/docs/agents/workflow-manager-agent-interface.md +145 -0
  30. package/docs/agents/workflow-manager-current-state.md +205 -0
  31. package/lib/artifact-files.mjs +47 -0
  32. package/lib/codegraph.mjs +405 -0
  33. package/lib/delivery-state.mjs +3079 -198
  34. package/lib/frontend-guard.mjs +288 -0
  35. package/lib/fs-utils.mjs +53 -0
  36. package/lib/history-anchor.mjs +98 -0
  37. package/lib/mock-scenario-pack.mjs +687 -0
  38. package/lib/mock-system.mjs +897 -0
  39. package/lib/npm-package-result.mjs +11 -0
  40. package/lib/png-evidence.mjs +149 -0
  41. package/lib/project-bootstrap.mjs +96 -55
  42. package/lib/project-installer.mjs +1484 -164
  43. package/lib/project-migration.mjs +1193 -0
  44. package/lib/prototype-migration.mjs +713 -0
  45. package/lib/prototype-page-review.mjs +384 -0
  46. package/lib/prototype-review-target.mjs +334 -0
  47. package/lib/prototype-revision.mjs +812 -0
  48. package/lib/stable-value.mjs +15 -0
  49. package/lib/toml-hooks.mjs +69 -0
  50. package/lib/ui-acceptance.mjs +565 -0
  51. package/lib/visual-standard.mjs +232 -0
  52. package/lib/workflow-manager-contracts.mjs +367 -0
  53. package/lib/workflow-manager-facts.mjs +778 -0
  54. package/lib/workflow-manager-governance.mjs +514 -0
  55. package/lib/workflow-manager-mock.mjs +183 -0
  56. package/lib/workflow-manager-prototypes.mjs +1847 -0
  57. package/lib/workflow-manager-public/assets/ibm-plex-mono-latin-400-normal-CvHOgSBP.woff +0 -0
  58. package/lib/workflow-manager-public/assets/ibm-plex-mono-latin-400-normal-DMJ8VG8y.woff2 +0 -0
  59. package/lib/workflow-manager-public/assets/ibm-plex-sans-latin-400-normal-CDDApCn2.woff2 +0 -0
  60. package/lib/workflow-manager-public/assets/ibm-plex-sans-latin-400-normal-CYLoc0-x.woff +0 -0
  61. package/lib/workflow-manager-public/assets/ibm-plex-sans-latin-500-normal-6ng42L7E.woff2 +0 -0
  62. package/lib/workflow-manager-public/assets/ibm-plex-sans-latin-500-normal-BgVn5rGT.woff +0 -0
  63. package/lib/workflow-manager-public/assets/ibm-plex-sans-latin-600-normal-Cu4Hd6ag.woff +0 -0
  64. package/lib/workflow-manager-public/assets/ibm-plex-sans-latin-600-normal-CuJfVYMP.woff2 +0 -0
  65. package/lib/workflow-manager-public/assets/index-Chlg6r8f.css +1 -0
  66. package/lib/workflow-manager-public/assets/index-E-hGB5ZD.js +13 -0
  67. package/lib/workflow-manager-public/fonts/OFL-1.1.txt +90 -0
  68. package/lib/workflow-manager-public/index.html +14 -0
  69. package/lib/workflow-manager-systems.mjs +519 -0
  70. package/lib/workflow-manager-transaction.mjs +397 -0
  71. package/lib/workflow-manager.mjs +745 -0
  72. package/package.json +8 -2
  73. package/skills/ai-delivery-assemble-release/agents/openai.yaml +3 -3
  74. package/skills/ai-delivery-assemble-release/assets/release-material-index.csv +1 -1
  75. package/skills/ai-delivery-assemble-release/assets/version-inclusion.csv +1 -1
  76. package/skills/ai-delivery-bootstrap/SKILL.md +4 -4
  77. package/skills/ai-delivery-bootstrap/agents/openai.yaml +3 -3
  78. package/skills/ai-delivery-bootstrap/references/bootstrap-contract.md +4 -2
  79. package/skills/ai-delivery-checkpoint-task/SKILL.md +17 -3
  80. package/skills/ai-delivery-checkpoint-task/agents/openai.yaml +3 -3
  81. package/skills/ai-delivery-checkpoint-task/assets/runtime-template/task.json +7 -1
  82. package/skills/ai-delivery-checkpoint-task/references/checkpoint-contract.md +22 -8
  83. package/skills/ai-delivery-checkpoint-task/scripts/hook-event.mjs +91 -0
  84. package/skills/ai-delivery-checkpoint-task/scripts/task-state.mjs +1086 -51
  85. package/skills/ai-delivery-close-version/SKILL.md +9 -8
  86. package/skills/ai-delivery-close-version/agents/openai.yaml +3 -3
  87. package/skills/ai-delivery-close-version/assets/version-lineage.yaml +1 -1
  88. package/skills/ai-delivery-close-version/references/version-closeout-contract.md +2 -2
  89. package/skills/ai-delivery-define-product/SKILL.md +8 -4
  90. package/skills/ai-delivery-define-product/agents/openai.yaml +4 -4
  91. package/skills/ai-delivery-define-product/references/product-contract.md +2 -2
  92. package/skills/ai-delivery-deploy-production/agents/openai.yaml +3 -3
  93. package/skills/ai-delivery-design-architecture/SKILL.md +9 -5
  94. package/skills/ai-delivery-design-architecture/assets/architecture-template/prototype-architecture-validation.yaml +16 -16
  95. package/skills/ai-delivery-design-architecture/references/architecture-contract.md +1 -1
  96. package/skills/ai-delivery-design-experience/SKILL.md +36 -30
  97. package/skills/ai-delivery-design-experience/agents/openai.yaml +4 -4
  98. package/skills/ai-delivery-design-experience/assets/experience-template/LEGACY-COMPATIBILITY.md +16 -0
  99. package/skills/ai-delivery-design-experience/assets/experience-template/design-reference-selection.yaml +32 -0
  100. package/skills/ai-delivery-design-experience/assets/experience-template/experience-baseline.yaml +2 -2
  101. package/skills/ai-delivery-design-experience/assets/experience-template/formal-ui-confirmation.yaml +16 -3
  102. package/skills/ai-delivery-design-experience/assets/experience-template/frontend-change-scope.yaml +30 -0
  103. package/skills/ai-delivery-design-experience/assets/experience-template/interaction-contract.csv +1 -1
  104. package/skills/ai-delivery-design-experience/assets/experience-template/mock-admin-export.yaml +8 -0
  105. package/skills/ai-delivery-design-experience/assets/experience-template/mock-scenario-mappings.csv +1 -0
  106. package/skills/ai-delivery-design-experience/assets/experience-template/mock-scenario-pack-request.yaml +24 -0
  107. package/skills/ai-delivery-design-experience/assets/experience-template/product-prototype-reconciliation.yaml +2 -1
  108. package/skills/ai-delivery-design-experience/assets/experience-template/prototype-adjustment-log.csv +1 -1
  109. package/skills/ai-delivery-design-experience/assets/experience-template/prototype-component-bindings.csv +1 -0
  110. package/skills/ai-delivery-design-experience/assets/experience-template/prototype-component-candidates.csv +1 -0
  111. package/skills/ai-delivery-design-experience/assets/experience-template/prototype-components.csv +1 -0
  112. package/skills/ai-delivery-design-experience/assets/experience-template/prototype-confirmation.yaml +18 -18
  113. package/skills/ai-delivery-design-experience/assets/experience-template/prototype-data-contracts.csv +1 -0
  114. package/skills/ai-delivery-design-experience/assets/experience-template/prototype-impact-assessment.yaml +5 -5
  115. package/skills/ai-delivery-design-experience/assets/experience-template/prototype-implementation-bindings.csv +1 -0
  116. package/skills/ai-delivery-design-experience/assets/experience-template/prototype-manifest.yaml +2 -0
  117. package/skills/ai-delivery-design-experience/assets/experience-template/prototype-pages.csv +1 -0
  118. package/skills/ai-delivery-design-experience/assets/experience-template/prototype-product-coverage.csv +1 -1
  119. package/skills/ai-delivery-design-experience/assets/experience-template/prototype-review-comments.csv +1 -1
  120. package/skills/ai-delivery-design-experience/assets/experience-template/prototype-review-decision.yaml +13 -12
  121. package/skills/ai-delivery-design-experience/assets/experience-template/prototype-review-scenes.csv +1 -0
  122. package/skills/ai-delivery-design-experience/assets/experience-template/prototype-review-sessions.csv +1 -1
  123. package/skills/ai-delivery-design-experience/assets/experience-template/prototype-review-unit-pages.csv +1 -0
  124. package/skills/ai-delivery-design-experience/assets/experience-template/prototype-review-units.csv +1 -0
  125. package/skills/ai-delivery-design-experience/assets/experience-template/prototype-revision.yaml +88 -0
  126. package/skills/ai-delivery-design-experience/assets/experience-template/prototype-routes.csv +1 -0
  127. package/skills/ai-delivery-design-experience/assets/experience-template/prototype-set.yaml +2 -0
  128. package/skills/ai-delivery-design-experience/assets/experience-template/prototype-source-inspection-snapshots.csv +1 -0
  129. package/skills/ai-delivery-design-experience/assets/experience-template/prototype-terminals.csv +1 -0
  130. package/skills/ai-delivery-design-experience/assets/experience-template/prototype-tool-candidates.csv +1 -1
  131. package/skills/ai-delivery-design-experience/assets/experience-template/prototype-tool-selection.yaml +2 -3
  132. package/skills/ai-delivery-design-experience/assets/experience-template/prototype-traceability.csv +1 -1
  133. package/skills/ai-delivery-design-experience/assets/experience-template/prototype-trigger-conditions.csv +1 -0
  134. package/skills/ai-delivery-design-experience/assets/experience-template/prototype.yaml +6 -0
  135. package/skills/ai-delivery-design-experience/assets/experience-template/ui-framework-selection.yaml +17 -1
  136. package/skills/ai-delivery-design-experience/assets/experience-template/ui-handoff.yaml +6 -5
  137. package/skills/ai-delivery-design-experience/assets/experience-template/ui-mapping.csv +1 -0
  138. package/skills/ai-delivery-design-experience/assets/experience-template/visual-direction.yaml +4 -0
  139. package/skills/ai-delivery-design-experience/assets/experience-template/visual-reference-manifest.yaml +23 -0
  140. package/skills/ai-delivery-design-experience/assets/experience-template/visual-reference.html +163 -0
  141. package/skills/ai-delivery-design-experience/assets/experience-template/visual-system-confirmation.yaml +11 -0
  142. package/skills/ai-delivery-design-experience/references/experience-contract.md +26 -27
  143. package/skills/ai-delivery-design-experience/references/prototype-management-contract.md +42 -21
  144. package/skills/ai-delivery-design-tests/SKILL.md +13 -7
  145. package/skills/ai-delivery-design-tests/assets/test-design-template/prototype-test-scope.csv +1 -1
  146. package/skills/ai-delivery-design-tests/assets/test-design-template/prototype-test-validation.yaml +17 -16
  147. package/skills/ai-delivery-design-tests/references/test-design-contract.md +7 -5
  148. package/skills/ai-delivery-develop-iteration/SKILL.md +18 -11
  149. package/skills/ai-delivery-develop-iteration/agents/openai.yaml +3 -3
  150. package/skills/ai-delivery-develop-iteration/assets/development-template/candidate-manifest.yaml +36 -0
  151. package/skills/ai-delivery-develop-iteration/assets/development-template/task-prototype-traceability.csv +1 -1
  152. package/skills/ai-delivery-develop-iteration/references/development-contract.md +5 -3
  153. package/skills/ai-delivery-evolve-workflow/agents/openai.yaml +3 -3
  154. package/skills/ai-delivery-execute-test/SKILL.md +6 -2
  155. package/skills/ai-delivery-execute-test/agents/openai.yaml +4 -4
  156. package/skills/ai-delivery-execute-work-package/SKILL.md +10 -3
  157. package/skills/ai-delivery-execute-work-package/agents/openai.yaml +4 -4
  158. package/skills/ai-delivery-execute-work-package/references/work-package-contract.md +1 -1
  159. package/skills/ai-delivery-manage-git/agents/openai.yaml +3 -3
  160. package/skills/ai-delivery-manage-standards/agents/openai.yaml +4 -4
  161. package/skills/ai-delivery-orchestrate/SKILL.md +47 -29
  162. package/skills/ai-delivery-orchestrate/agents/openai.yaml +3 -3
  163. package/skills/ai-delivery-orchestrate/assets/project-template/.workflow/control/migrations/.gitkeep +0 -0
  164. package/skills/ai-delivery-orchestrate/assets/project-template/.workflow/control/repairs/.gitkeep +0 -0
  165. package/skills/ai-delivery-orchestrate/assets/project-template/.workflow/delivery/project.yaml +1 -0
  166. package/skills/ai-delivery-orchestrate/assets/project-template/.workflow/delivery/workflow-state.yaml +2 -0
  167. package/skills/ai-delivery-orchestrate/assets/project-template/.workflow/tools/frontend-guard/frontend-guard.mjs +50 -0
  168. package/skills/ai-delivery-orchestrate/assets/project-template/.workflow/tools/hooks/hook-event.mjs +91 -0
  169. package/skills/ai-delivery-orchestrate/assets/project-template/.workflow/tools/manager/manager.mjs +64 -0
  170. package/skills/ai-delivery-orchestrate/assets/project-template/.workflow/tools/manager/start.cmd +4 -0
  171. package/skills/ai-delivery-orchestrate/assets/project-template/.workflow/tools/manager/start.ps1 +2 -0
  172. package/skills/ai-delivery-orchestrate/assets/project-template/.workflow/tools/{viewer → manager}/start.sh +1 -1
  173. package/skills/ai-delivery-orchestrate/assets/project-template/.workflow/tools/mock/mock.mjs +50 -0
  174. package/skills/ai-delivery-orchestrate/assets/project-template/.workflow/tools/ui-acceptance/ui-acceptance.mjs +37 -0
  175. package/skills/ai-delivery-orchestrate/assets/project-template/AGENTS.md +32 -6
  176. package/skills/ai-delivery-orchestrate/assets/project-template/gitignore.template +1 -0
  177. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/CONTRIBUTING.md +25 -0
  178. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/LICENSE +21 -0
  179. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/README.md +250 -0
  180. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/UPSTREAM.yaml +19 -0
  181. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/airbnb/DESIGN.md +545 -0
  182. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/airbnb/README.md +5 -0
  183. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/airtable/DESIGN.md +554 -0
  184. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/airtable/README.md +5 -0
  185. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/apple/DESIGN.md +562 -0
  186. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/apple/README.md +5 -0
  187. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/binance/DESIGN.md +634 -0
  188. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/binance/README.md +5 -0
  189. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/bmw/DESIGN.md +544 -0
  190. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/bmw/README.md +5 -0
  191. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/bmw-m/DESIGN.md +503 -0
  192. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/bmw-m/README.md +5 -0
  193. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/bugatti/DESIGN.md +454 -0
  194. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/bugatti/README.md +5 -0
  195. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/cal/DESIGN.md +542 -0
  196. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/cal/README.md +5 -0
  197. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/claude/DESIGN.md +589 -0
  198. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/claude/README.md +5 -0
  199. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/clay/DESIGN.md +541 -0
  200. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/clay/README.md +5 -0
  201. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/clickhouse/DESIGN.md +544 -0
  202. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/clickhouse/README.md +5 -0
  203. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/cohere/DESIGN.md +451 -0
  204. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/cohere/README.md +5 -0
  205. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/coinbase/DESIGN.md +570 -0
  206. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/coinbase/README.md +5 -0
  207. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/composio/DESIGN.md +506 -0
  208. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/composio/README.md +5 -0
  209. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/cursor/DESIGN.md +537 -0
  210. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/cursor/README.md +5 -0
  211. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/dell-1996/DESIGN.md +632 -0
  212. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/dell-1996/README.md +5 -0
  213. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/elevenlabs/DESIGN.md +504 -0
  214. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/elevenlabs/README.md +5 -0
  215. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/expo/DESIGN.md +526 -0
  216. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/expo/README.md +5 -0
  217. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/ferrari/DESIGN.md +531 -0
  218. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/ferrari/README.md +5 -0
  219. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/figma/DESIGN.md +578 -0
  220. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/figma/README.md +5 -0
  221. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/framer/DESIGN.md +544 -0
  222. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/framer/README.md +5 -0
  223. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/hashicorp/DESIGN.md +575 -0
  224. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/hashicorp/README.md +5 -0
  225. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/hp/DESIGN.md +670 -0
  226. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/hp/README.md +5 -0
  227. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/ibm/DESIGN.md +550 -0
  228. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/ibm/README.md +5 -0
  229. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/intercom/DESIGN.md +546 -0
  230. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/intercom/README.md +5 -0
  231. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/kraken/DESIGN.md +125 -0
  232. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/kraken/README.md +5 -0
  233. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/lamborghini/DESIGN.md +288 -0
  234. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/lamborghini/README.md +5 -0
  235. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/linear.app/DESIGN.md +548 -0
  236. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/linear.app/README.md +5 -0
  237. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/lovable/DESIGN.md +298 -0
  238. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/lovable/README.md +5 -0
  239. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/mastercard/DESIGN.md +365 -0
  240. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/mastercard/README.md +5 -0
  241. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/meta/DESIGN.md +683 -0
  242. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/meta/README.md +5 -0
  243. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/minimax/DESIGN.md +746 -0
  244. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/minimax/README.md +5 -0
  245. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/mintlify/DESIGN.md +852 -0
  246. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/mintlify/README.md +5 -0
  247. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/miro/DESIGN.md +825 -0
  248. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/miro/README.md +5 -0
  249. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/mistral.ai/DESIGN.md +773 -0
  250. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/mistral.ai/README.md +5 -0
  251. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/mongodb/DESIGN.md +767 -0
  252. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/mongodb/README.md +5 -0
  253. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/nike/DESIGN.md +575 -0
  254. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/nike/README.md +5 -0
  255. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/nintendo-2001/DESIGN.md +649 -0
  256. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/nintendo-2001/README.md +5 -0
  257. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/notion/DESIGN.md +821 -0
  258. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/notion/README.md +5 -0
  259. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/nvidia/DESIGN.md +640 -0
  260. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/nvidia/README.md +5 -0
  261. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/ollama/DESIGN.md +539 -0
  262. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/ollama/README.md +5 -0
  263. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/opencode.ai/DESIGN.md +521 -0
  264. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/opencode.ai/README.md +5 -0
  265. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/pinterest/DESIGN.md +597 -0
  266. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/pinterest/README.md +5 -0
  267. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/playstation/DESIGN.md +661 -0
  268. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/playstation/README.md +5 -0
  269. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/posthog/DESIGN.md +690 -0
  270. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/posthog/README.md +5 -0
  271. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/raycast/DESIGN.md +669 -0
  272. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/raycast/README.md +5 -0
  273. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/renault/DESIGN.md +589 -0
  274. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/renault/README.md +5 -0
  275. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/replicate/DESIGN.md +616 -0
  276. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/replicate/README.md +5 -0
  277. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/resend/DESIGN.md +585 -0
  278. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/resend/README.md +5 -0
  279. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/revolut/DESIGN.md +636 -0
  280. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/revolut/README.md +5 -0
  281. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/runwayml/DESIGN.md +244 -0
  282. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/runwayml/README.md +5 -0
  283. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/sanity/DESIGN.md +357 -0
  284. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/sanity/README.md +5 -0
  285. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/sentry/DESIGN.md +551 -0
  286. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/sentry/README.md +5 -0
  287. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/shopify/DESIGN.md +516 -0
  288. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/shopify/README.md +5 -0
  289. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/slack/DESIGN.md +482 -0
  290. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/spacex/DESIGN.md +363 -0
  291. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/spacex/README.md +5 -0
  292. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/spotify/DESIGN.md +246 -0
  293. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/spotify/README.md +5 -0
  294. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/starbucks/DESIGN.md +580 -0
  295. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/starbucks/README.md +5 -0
  296. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/stripe/DESIGN.md +487 -0
  297. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/stripe/README.md +5 -0
  298. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/supabase/DESIGN.md +462 -0
  299. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/supabase/README.md +5 -0
  300. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/superhuman/DESIGN.md +448 -0
  301. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/superhuman/README.md +5 -0
  302. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/tesla/DESIGN.md +286 -0
  303. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/tesla/README.md +5 -0
  304. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/theverge/DESIGN.md +339 -0
  305. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/theverge/README.md +5 -0
  306. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/together.ai/DESIGN.md +633 -0
  307. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/together.ai/README.md +5 -0
  308. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/uber/DESIGN.md +636 -0
  309. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/uber/README.md +5 -0
  310. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/vercel/DESIGN.md +736 -0
  311. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/vercel/README.md +5 -0
  312. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/vodafone/DESIGN.md +538 -0
  313. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/vodafone/README.md +5 -0
  314. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/voltagent/DESIGN.md +521 -0
  315. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/voltagent/README.md +5 -0
  316. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/warp/DESIGN.md +526 -0
  317. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/warp/README.md +5 -0
  318. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/webflow/DESIGN.md +588 -0
  319. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/webflow/README.md +5 -0
  320. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/wired/DESIGN.md +497 -0
  321. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/wired/README.md +5 -0
  322. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/wise/DESIGN.md +544 -0
  323. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/wise/README.md +5 -0
  324. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/x.ai/DESIGN.md +465 -0
  325. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/x.ai/README.md +5 -0
  326. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/zapier/DESIGN.md +537 -0
  327. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/zapier/README.md +5 -0
  328. package/skills/ai-delivery-orchestrate/references/formal-state-contract.md +65 -20
  329. package/skills/ai-delivery-orchestrate/references/workflow-model.md +7 -5
  330. package/skills/ai-delivery-orchestrate-release/SKILL.md +2 -2
  331. package/skills/ai-delivery-orchestrate-release/agents/openai.yaml +4 -4
  332. package/skills/ai-delivery-orchestrate-release/references/release-workflow-contract.md +1 -1
  333. package/skills/ai-delivery-plan-iteration/SKILL.md +11 -4
  334. package/skills/ai-delivery-plan-iteration/agents/openai.yaml +4 -4
  335. package/skills/ai-delivery-plan-iteration/assets/planning-template/scope-manifest.yaml +17 -0
  336. package/skills/ai-delivery-plan-iteration/assets/planning-template/slice-prototype-traceability.csv +1 -1
  337. package/skills/ai-delivery-plan-iteration/references/planning-contract.md +8 -2
  338. package/skills/ai-delivery-prepare-platform/SKILL.md +5 -1
  339. package/skills/ai-delivery-prepare-platform/agents/openai.yaml +4 -4
  340. package/skills/ai-delivery-prepare-release/agents/openai.yaml +4 -4
  341. package/skills/ai-delivery-review-change/SKILL.md +14 -4
  342. package/skills/ai-delivery-review-change/agents/openai.yaml +4 -4
  343. package/skills/ai-delivery-review-change/references/review-contract.md +6 -0
  344. package/skills/ai-delivery-triage-failure/SKILL.md +5 -1
  345. package/skills/ai-delivery-triage-failure/agents/openai.yaml +4 -4
  346. package/skills/ai-delivery-validate-artifacts/SKILL.md +6 -3
  347. package/skills/ai-delivery-validate-artifacts/agents/openai.yaml +4 -4
  348. package/skills/ai-delivery-validate-artifacts/references/artifact-contract.md +13 -13
  349. package/skills/ai-delivery-verify-candidate/SKILL.md +13 -6
  350. package/skills/ai-delivery-verify-candidate/agents/openai.yaml +3 -3
  351. package/skills/ai-delivery-verify-candidate/assets/verification-template/ui-acceptance-request.yaml +19 -0
  352. package/skills/ai-delivery-verify-candidate/assets/verification-template/ui-acceptance-results.yaml +53 -0
  353. package/skills/ai-delivery-verify-candidate/references/candidate-verification-contract.md +10 -2
  354. package/skills/ai-delivery-verify-production/agents/openai.yaml +3 -3
  355. package/skills/ai-delivery-design-experience/assets/experience-template/low-fidelity-confirmation.yaml +0 -32
  356. package/skills/ai-delivery-orchestrate/assets/project-template/.workflow/tools/viewer/public/app.js +0 -546
  357. package/skills/ai-delivery-orchestrate/assets/project-template/.workflow/tools/viewer/public/index.html +0 -199
  358. package/skills/ai-delivery-orchestrate/assets/project-template/.workflow/tools/viewer/public/styles.css +0 -529
  359. package/skills/ai-delivery-orchestrate/assets/project-template/.workflow/tools/viewer/server.mjs +0 -780
  360. package/skills/ai-delivery-orchestrate/assets/project-template/.workflow/tools/viewer/start.cmd +0 -4
  361. package/skills/ai-delivery-orchestrate/assets/project-template/.workflow/tools/viewer/start.ps1 +0 -2
@@ -0,0 +1,11 @@
1
+ export function normalizeNpmPackageResult(parsed, manifest) {
2
+ if (Array.isArray(parsed)) return parsed[0];
3
+ if (!parsed || typeof parsed !== "object") return parsed;
4
+ if (parsed.name || parsed.id || Array.isArray(parsed.files)) return parsed;
5
+
6
+ const direct = parsed[manifest.name];
7
+ if (direct && typeof direct === "object") return direct;
8
+
9
+ return Object.values(parsed).find((value) => value && typeof value === "object"
10
+ && (value.name === manifest.name || value.id === `${manifest.name}@${manifest.version}`));
11
+ }
@@ -0,0 +1,149 @@
1
+ import fs from "node:fs";
2
+ import zlib from "node:zlib";
3
+
4
+ const pngSignature = Buffer.from([137, 80, 78, 71, 13, 10, 26, 10]);
5
+
6
+ function crc32(value) {
7
+ let checksum = 0xffffffff;
8
+ for (const byte of value) {
9
+ checksum ^= byte;
10
+ for (let bit = 0; bit < 8; bit += 1) {
11
+ checksum = (checksum >>> 1) ^ (0xedb88320 & -(checksum & 1));
12
+ }
13
+ }
14
+ return (checksum ^ 0xffffffff) >>> 0;
15
+ }
16
+
17
+ function paeth(left, above, upperLeft) {
18
+ const estimate = left + above - upperLeft;
19
+ const leftDistance = Math.abs(estimate - left);
20
+ const aboveDistance = Math.abs(estimate - above);
21
+ const upperLeftDistance = Math.abs(estimate - upperLeft);
22
+ if (leftDistance <= aboveDistance && leftDistance <= upperLeftDistance) return left;
23
+ return aboveDistance <= upperLeftDistance ? above : upperLeft;
24
+ }
25
+
26
+ function decodePng(file, expectedWidth, expectedHeight, label) {
27
+ const bytes = fs.readFileSync(file);
28
+ if (bytes.length < pngSignature.length || !bytes.subarray(0, 8).equals(pngSignature)) {
29
+ throw new Error(`${label} is not a PNG image.`);
30
+ }
31
+ let offset = 8;
32
+ let header = null;
33
+ let ended = false;
34
+ const compressed = [];
35
+ while (offset < bytes.length) {
36
+ if (offset + 12 > bytes.length) throw new Error(`${label} PNG chunk is truncated.`);
37
+ const length = bytes.readUInt32BE(offset);
38
+ const end = offset + 12 + length;
39
+ if (end > bytes.length) throw new Error(`${label} PNG chunk length is invalid.`);
40
+ const type = bytes.subarray(offset + 4, offset + 8);
41
+ const data = bytes.subarray(offset + 8, offset + 8 + length);
42
+ const expectedCrc = bytes.readUInt32BE(offset + 8 + length);
43
+ if (crc32(Buffer.concat([type, data])) !== expectedCrc) {
44
+ throw new Error(`${label} PNG chunk checksum mismatch.`);
45
+ }
46
+ const name = type.toString("ascii");
47
+ if (name === "IHDR") {
48
+ if (header || length !== 13) throw new Error(`${label} PNG header is invalid.`);
49
+ header = {
50
+ width: data.readUInt32BE(0),
51
+ height: data.readUInt32BE(4),
52
+ bitDepth: data[8],
53
+ colorType: data[9],
54
+ compression: data[10],
55
+ filter: data[11],
56
+ interlace: data[12],
57
+ };
58
+ } else if (name === "IDAT") {
59
+ compressed.push(data);
60
+ } else if (name === "IEND") {
61
+ if (length !== 0) throw new Error(`${label} PNG end chunk is invalid.`);
62
+ ended = true;
63
+ offset = end;
64
+ break;
65
+ }
66
+ offset = end;
67
+ }
68
+ if (!header || !ended || offset !== bytes.length || compressed.length === 0) {
69
+ throw new Error(`${label} PNG structure is incomplete.`);
70
+ }
71
+ if (header.width !== expectedWidth || header.height !== expectedHeight) {
72
+ throw new Error(
73
+ `${label} PNG dimensions ${header.width}x${header.height} do not match ${expectedWidth}x${expectedHeight}.`,
74
+ );
75
+ }
76
+ if (header.bitDepth !== 8 || !new Set([2, 6]).has(header.colorType)
77
+ || header.compression !== 0 || header.filter !== 0 || header.interlace !== 0) {
78
+ throw new Error(`${label} PNG must be non-interlaced 8-bit RGB or RGBA.`);
79
+ }
80
+ const channels = header.colorType === 6 ? 4 : 3;
81
+ const stride = header.width * channels;
82
+ const expectedLength = (stride + 1) * header.height;
83
+ let scanlines;
84
+ try {
85
+ scanlines = zlib.inflateSync(Buffer.concat(compressed), { maxOutputLength: expectedLength });
86
+ } catch (error) {
87
+ throw new Error(`${label} PNG pixel data is invalid: ${error.message}`);
88
+ }
89
+ if (scanlines.length !== expectedLength) throw new Error(`${label} PNG pixel data length is invalid.`);
90
+ const decoded = Buffer.alloc(stride * header.height);
91
+ for (let y = 0; y < header.height; y += 1) {
92
+ const encodedRow = y * (stride + 1);
93
+ const decodedRow = y * stride;
94
+ const filter = scanlines[encodedRow];
95
+ if (filter > 4) throw new Error(`${label} PNG uses an invalid scanline filter.`);
96
+ for (let x = 0; x < stride; x += 1) {
97
+ const raw = scanlines[encodedRow + 1 + x];
98
+ const left = x >= channels ? decoded[decodedRow + x - channels] : 0;
99
+ const above = y > 0 ? decoded[decodedRow + x - stride] : 0;
100
+ const upperLeft = y > 0 && x >= channels
101
+ ? decoded[decodedRow + x - stride - channels]
102
+ : 0;
103
+ let value = raw;
104
+ if (filter === 1) value += left;
105
+ else if (filter === 2) value += above;
106
+ else if (filter === 3) value += Math.floor((left + above) / 2);
107
+ else if (filter === 4) value += paeth(left, above, upperLeft);
108
+ decoded[decodedRow + x] = value & 0xff;
109
+ }
110
+ }
111
+ if (channels === 4) return decoded;
112
+ const rgba = Buffer.alloc(header.width * header.height * 4);
113
+ for (let source = 0, target = 0; source < decoded.length; source += 3, target += 4) {
114
+ rgba[target] = decoded[source];
115
+ rgba[target + 1] = decoded[source + 1];
116
+ rgba[target + 2] = decoded[source + 2];
117
+ rgba[target + 3] = 255;
118
+ }
119
+ return rgba;
120
+ }
121
+
122
+ export function verifyVisualPngEvidence(files, viewport, label) {
123
+ const prototype = decodePng(
124
+ files.prototype,
125
+ viewport.width,
126
+ viewport.height,
127
+ `${label} Prototype screenshot`,
128
+ );
129
+ const candidate = decodePng(
130
+ files.candidate,
131
+ viewport.width,
132
+ viewport.height,
133
+ `${label} Candidate screenshot`,
134
+ );
135
+ const diff = decodePng(files.diff, viewport.width, viewport.height, `${label} Visual diff`);
136
+ let changedPixels = 0;
137
+ for (let offset = 0; offset < prototype.length; offset += 4) {
138
+ const changed = prototype[offset] !== candidate[offset]
139
+ || prototype[offset + 1] !== candidate[offset + 1]
140
+ || prototype[offset + 2] !== candidate[offset + 2]
141
+ || prototype[offset + 3] !== candidate[offset + 3];
142
+ const marked = diff[offset + 3] > 0;
143
+ if (changed !== marked) {
144
+ throw new Error(`${label} Visual diff PNG does not mark the independently measured pixels.`);
145
+ }
146
+ if (changed) changedPixels += 1;
147
+ }
148
+ return { changedPixels, totalPixels: viewport.width * viewport.height };
149
+ }
@@ -3,7 +3,11 @@ import fs from "node:fs";
3
3
  import path from "node:path";
4
4
  import { spawnSync } from "node:child_process";
5
5
  import { parse as parseYaml, stringify as stringifyYaml } from "./yaml-runtime.mjs";
6
- import { executeDeliveryStateCommand } from "./delivery-state.mjs";
6
+ import {
7
+ findIncompatibleNodeStates,
8
+ stableValue,
9
+ withFormalStateReadLock,
10
+ } from "./delivery-state.mjs";
7
11
  import { inspectGitRepository, readWorkspaceConfiguration } from "./workspace.mjs";
8
12
 
9
13
  const IGNORED_DIRECTORIES = new Set([
@@ -79,6 +83,8 @@ const WORKFLOW_REQUIRED_FILES = [
79
83
  ".codex/config.toml",
80
84
  "AGENTS.md",
81
85
  ".workflow/tools/state/state.mjs",
86
+ ".workflow/tools/state/history-anchor.mjs",
87
+ ".workflow/tools/state/fs-utils.mjs",
82
88
  ".workflow/tools/evolution/evolve.mjs",
83
89
  ".workflow/tools/hooks/hook-event.mjs",
84
90
  ".workflow/delivery/project.yaml",
@@ -289,18 +295,40 @@ function readStructuredFile(file, format, errors) {
289
295
  }
290
296
  }
291
297
 
298
+ function normalizeInspectedScope(value, fallbackScopeId = null) {
299
+ return {
300
+ scope_id: value?.scope_id ?? fallbackScopeId,
301
+ active_nodes: Array.isArray(value?.active_nodes) ? value.active_nodes : [],
302
+ blocked_nodes: Array.isArray(value?.blocked_nodes) ? value.blocked_nodes : [],
303
+ completed_nodes: Array.isArray(value?.completed_nodes) ? value.completed_nodes : [],
304
+ pending_gates: Array.isArray(value?.pending_gates) ? value.pending_gates : [],
305
+ };
306
+ }
307
+
308
+ function inspectWorkflowScopes(workflowState, errors) {
309
+ const schemaVersion = Number(workflowState?.schema_version || 1);
310
+ const development = schemaVersion >= 2
311
+ ? normalizeInspectedScope(workflowState.development_state)
312
+ : normalizeInspectedScope(workflowState, workflowState.iteration_id ?? null);
313
+ const release = schemaVersion >= 2
314
+ ? normalizeInspectedScope(workflowState.release_state)
315
+ : normalizeInspectedScope(null);
316
+
317
+ for (const [scopeName, scope] of [["development", development], ["release", release]]) {
318
+ for (const conflict of findIncompatibleNodeStates(scope)) {
319
+ errors.push(`Workflow node appears in incompatible states in ${scopeName}: ${conflict.node} (${conflict.states.join(", ")}).`);
320
+ }
321
+ }
322
+
323
+ return { development, release };
324
+ }
325
+
292
326
  function compareTasks(left, right) {
293
327
  const leftSequence = Number.isInteger(left.sequence) ? left.sequence : Number.MAX_SAFE_INTEGER;
294
328
  const rightSequence = Number.isInteger(right.sequence) ? right.sequence : Number.MAX_SAFE_INTEGER;
295
329
  return leftSequence - rightSequence || String(left.task_id).localeCompare(String(right.task_id));
296
330
  }
297
331
 
298
- function stableValue(value) {
299
- if (Array.isArray(value)) return value.map(stableValue);
300
- if (!value || typeof value !== "object") return value;
301
- return Object.fromEntries(Object.keys(value).sort().map((key) => [key, stableValue(value[key])]));
302
- }
303
-
304
332
  function taskStateChecksum(task, root) {
305
333
  const comparable = { ...task };
306
334
  const stateRoot = path.resolve(root, comparable.state_root || ".");
@@ -365,8 +393,14 @@ function inspectRuntime(root, errors, workflowRoot = ".workflow") {
365
393
  }
366
394
  return true;
367
395
  });
396
+ const readyIds = new Set(ready.map((task) => task.task_id));
397
+ const waiting = queued.filter((task) => !readyIds.has(task.task_id));
368
398
  const active = tasks.filter((task) => ACTIVE_TASK_STATUSES.has(task.status));
369
- const recommended = [...active, ...ready].sort(compareTasks)[0] || null;
399
+ const retryable = tasks.filter((task) => task.status === "failed");
400
+ const recommended = active.sort(compareTasks)[0]
401
+ || retryable.sort(compareTasks)[0]
402
+ || ready.sort(compareTasks)[0]
403
+ || null;
370
404
  const checkpointRoot = path.join(root, workflowRoot, "control", "checkpoints");
371
405
  let sharedCheckpointCount = 0;
372
406
  const countCheckpoints = (directory) => {
@@ -381,9 +415,16 @@ function inspectRuntime(root, errors, workflowRoot = ".workflow") {
381
415
  return {
382
416
  task_count: tasks.length,
383
417
  closed_task_count: tasks.filter((task) => CLOSED_TASK_STATUSES.has(task.status)).length,
418
+ completed_task_count: tasks.filter((task) => task.status === "completed").length,
419
+ failed_task_count: tasks.filter((task) => task.status === "failed").length,
420
+ abandoned_task_count: tasks.filter((task) => task.status === "abandoned").length,
421
+ blocked_task_count: tasks.filter((task) => task.status === "blocked").length,
422
+ waiting_task_count: waiting.length,
384
423
  active_task_ids: active.map((task) => task.task_id),
424
+ retryable_task_ids: retryable.map((task) => task.task_id),
385
425
  queued_task_ids: queued.map((task) => task.task_id),
386
426
  ready_task_ids: ready.map((task) => task.task_id),
427
+ waiting_task_ids: waiting.map((task) => task.task_id),
387
428
  recommended_task_id: recommended?.task_id || null,
388
429
  recommended_iteration_id: recommended?.iteration_id || null,
389
430
  recommended_status: recommended?.status || null,
@@ -422,11 +463,16 @@ function recommendationFor(state, workflow, runtime) {
422
463
  if (state === "workflow-interrupted" || runtime.recommended_task_id) {
423
464
  const awaitingUser = runtime.next_action_owner === "user";
424
465
  const awaitingExternal = runtime.next_action_owner === "external";
466
+ const retryCommand = runtime.recommended_status === "failed"
467
+ ? `task-state.mjs activate --task-id ${runtime.recommended_task_id} --new-attempt --phase repair`
468
+ : null;
425
469
  return {
426
470
  skill: "ai-delivery-checkpoint-task",
427
471
  action: awaitingUser || awaitingExternal
428
472
  ? runtime.next_action
429
- : `恢复并核对任务 ${runtime.recommended_task_id || "unknown"},只继续其幂等 next_action。`,
473
+ : retryCommand
474
+ ? `使用 ${retryCommand} 重试失败的逻辑任务,然后只继续其幂等 next_action。`
475
+ : `恢复并核对任务 ${runtime.recommended_task_id || "unknown"},只继续其幂等 next_action。`,
430
476
  requires_user_input: awaitingUser,
431
477
  mutation_allowed: !awaitingUser && !awaitingExternal,
432
478
  };
@@ -484,17 +530,28 @@ export function inspectProjectState(target) {
484
530
  const workflow = {
485
531
  project_id: null,
486
532
  iteration_id: null,
533
+ release_id: null,
487
534
  artifact_count: 0,
488
535
  delivery_artifact_count: 0,
489
536
  active_nodes: [],
490
537
  blocked_nodes: [],
491
538
  pending_gates: [],
539
+ development_state: normalizeInspectedScope(null),
540
+ release_state: normalizeInspectedScope(null),
492
541
  };
493
542
  let runtime = {
494
543
  task_count: 0,
544
+ closed_task_count: 0,
545
+ completed_task_count: 0,
546
+ failed_task_count: 0,
547
+ abandoned_task_count: 0,
548
+ blocked_task_count: 0,
549
+ waiting_task_count: 0,
495
550
  active_task_ids: [],
551
+ retryable_task_ids: [],
496
552
  queued_task_ids: [],
497
553
  ready_task_ids: [],
554
+ waiting_task_ids: [],
498
555
  recommended_task_id: null,
499
556
  dependency_errors: [],
500
557
  };
@@ -518,9 +575,22 @@ export function inspectProjectState(target) {
518
575
  legacyLayout ? ".ai-delivery/install-manifest.json" : ".workflow/config/install-manifest.json",
519
576
  ), "json", errors);
520
577
  const stateRoot = path.join(root, workflowRoot);
521
- const project = readStructuredFile(path.join(stateRoot, "delivery", "project.yaml"), "yaml", errors);
522
- const workflowState = readStructuredFile(path.join(stateRoot, "delivery", "workflow-state.yaml"), "yaml", errors);
523
- const registry = readStructuredFile(path.join(stateRoot, "delivery", "artifact-registry.yaml"), "yaml", errors);
578
+ let project = null;
579
+ let workflowState = null;
580
+ let registry = null;
581
+ const readFormalState = () => {
582
+ project = readStructuredFile(path.join(stateRoot, "delivery", "project.yaml"), "yaml", errors);
583
+ workflowState = readStructuredFile(path.join(stateRoot, "delivery", "workflow-state.yaml"), "yaml", errors);
584
+ registry = readStructuredFile(path.join(stateRoot, "delivery", "artifact-registry.yaml"), "yaml", errors);
585
+ };
586
+ if (legacyLayout) readFormalState();
587
+ else {
588
+ try {
589
+ withFormalStateReadLock(root, readFormalState);
590
+ } catch (error) {
591
+ errors.push(error.message);
592
+ }
593
+ }
524
594
  readStructuredFile(path.join(stateRoot, "delivery", "standards-baseline.yaml"), "yaml", errors);
525
595
  readStructuredFile(path.join(stateRoot, "standards", "index.yaml"), "yaml", errors);
526
596
  if (manifest) {
@@ -532,11 +602,15 @@ export function inspectProjectState(target) {
532
602
  if (!installedSkills.length) errors.push("安装清单未登记任何 skill");
533
603
  }
534
604
  if (project && workflowState) {
605
+ const scopes = inspectWorkflowScopes(workflowState, errors);
535
606
  workflow.project_id = project.project_id || null;
536
- workflow.iteration_id = workflowState.iteration_id || project.current_iteration_id || null;
537
- workflow.active_nodes = Array.isArray(workflowState.active_nodes) ? workflowState.active_nodes : [];
538
- workflow.blocked_nodes = Array.isArray(workflowState.blocked_nodes) ? workflowState.blocked_nodes : [];
539
- workflow.pending_gates = Array.isArray(workflowState.pending_gates) ? workflowState.pending_gates : [];
607
+ workflow.iteration_id = scopes.development.scope_id || project.current_iteration_id || null;
608
+ workflow.release_id = scopes.release.scope_id || project.current_release_id || null;
609
+ workflow.active_nodes = scopes.development.active_nodes;
610
+ workflow.blocked_nodes = scopes.development.blocked_nodes;
611
+ workflow.pending_gates = scopes.development.pending_gates;
612
+ workflow.development_state = scopes.development;
613
+ workflow.release_state = scopes.release;
540
614
  if (project.project_id !== workflowState.project_id) {
541
615
  errors.push(`${workflowRoot}/delivery/project.yaml 与 workflow-state.yaml 的 project_id 不一致`);
542
616
  }
@@ -655,16 +729,11 @@ function taskPlanFor(initialState, result) {
655
729
 
656
730
  function adoptionMarkdown(initialState, scan, result) {
657
731
  const gaps = [];
658
- let artifactTypes = [];
659
- try {
660
- const registry = parseYaml(fs.readFileSync(
732
+ const registry = withFormalStateReadLock(result.project_root, () => parseYaml(fs.readFileSync(
661
733
  path.join(result.project_root, ".workflow", "delivery", "artifact-registry.yaml"),
662
734
  "utf8",
663
- ));
664
- artifactTypes = (registry?.artifacts || []).map((artifact) => artifact.artifact_type || "");
665
- } catch {
666
- artifactTypes = [];
667
- }
735
+ )));
736
+ const artifactTypes = (registry?.artifacts || []).map((artifact) => artifact.artifact_type || "");
668
737
  if (!artifactTypes.some((type) => /product.*baseline/.test(type))) gaps.push("缺少经确认的产品基线。");
669
738
  if (!artifactTypes.some((type) => /architecture.*baseline/.test(type))) gaps.push("缺少经确认的架构基线。");
670
739
  if (scan.summary.has_code && !scan.summary.categories.test) gaps.push("未发现可识别的自动化测试文件,需人工核对测试入口。");
@@ -694,26 +763,6 @@ ${result.recommendation.action}
694
763
  `;
695
764
  }
696
765
 
697
- function registerBootstrapReport(root, entry) {
698
- const yaml = {
699
- parse: parseYaml,
700
- stringify: (value) => stringifyYaml(value, { lineWidth: 0 }),
701
- };
702
- const inspected = executeDeliveryStateCommand(["inspect", "--project", root], { yaml });
703
- executeDeliveryStateCommand([
704
- "artifact", "register",
705
- "--project", root,
706
- "--expected-revision", String(inspected.artifact_registry.revision),
707
- "--id", entry.artifact_id,
708
- "--artifact-type", entry.artifact_type,
709
- "--path", entry.path,
710
- "--node", "00-bootstrap",
711
- "--status", entry.status,
712
- "--version", String(entry.version),
713
- "--producer-skill", entry.producer_skill,
714
- ], { yaml });
715
- }
716
-
717
766
  function writeBootstrapArtifacts(root, initialState, result, sourceScan = null) {
718
767
  const configuredCodeRoot = path.resolve(root, result.workspace?.code_repository?.path || "code");
719
768
  const scan = sourceScan || scanProjectFiles(configuredCodeRoot);
@@ -840,16 +889,6 @@ function writeBootstrapArtifacts(root, initialState, result, sourceScan = null)
840
889
  recommended_task_id: result.runtime.recommended_task_id,
841
890
  updated_at: result.detected_at,
842
891
  }, { lineWidth: 0 }));
843
- registerBootstrapReport(root, {
844
- artifact_id: report.artifact_id,
845
- artifact_type: report.artifact_type,
846
- version: 1,
847
- status: "draft",
848
- producer_skill: "ai-delivery-bootstrap",
849
- path: reportRef,
850
- checksum_algorithm: "sha256",
851
- checksum: reportChecksum,
852
- });
853
892
  return {
854
893
  run_id: runId,
855
894
  report_ref: reportRef,
@@ -921,7 +960,9 @@ export function bootstrapProject(packageRoot, target, options = {}) {
921
960
  : shouldDeferToExternal
922
961
  ? `Wait for external input: ${result.runtime.next_action}`
923
962
  : shouldDeferToRecovery
924
- ? `Resume task ${result.runtime.recommended_task_id} before any bootstrap mutation.`
963
+ ? result.runtime.recommended_status === "failed"
964
+ ? `Retry task ${result.runtime.recommended_task_id} with task-state.mjs activate --task-id ${result.runtime.recommended_task_id} --new-attempt --phase repair before any bootstrap mutation.`
965
+ : `Resume task ${result.runtime.recommended_task_id} before any bootstrap mutation.`
925
966
  : "Project bootstrap completed.",
926
967
  };
927
968
  }