ai-delivery-workflow 0.3.0 → 0.5.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 (357) hide show
  1. package/README.md +42 -16
  2. package/bin/ai-delivery.mjs +181 -6
  3. package/bin/benchmark-autonomy.mjs +14 -6
  4. package/bin/release-check.mjs +10 -3
  5. package/docs/CLI-PARAMETER-REFERENCE.zh-CN.md +159 -17
  6. package/docs/CODEGRAPH-INTEGRATION.zh-CN.md +89 -0
  7. package/docs/DUAL-REPOSITORY-WORKSPACE.zh-CN.md +15 -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 +119 -46
  11. package/docs/MAINTENANCE-VERIFICATION.zh-CN.md +2 -2
  12. package/docs/MOCK-SYSTEM.zh-CN.md +141 -0
  13. package/docs/NPM-RELEASE-MANAGEMENT.zh-CN.md +2 -1
  14. package/docs/PROJECT-MANUAL.zh-CN.md +175 -98
  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/adr/0006-product-line-candidate-inventory.md +20 -0
  26. package/docs/agents/domain.md +37 -0
  27. package/docs/agents/issue-tracker.md +26 -0
  28. package/docs/agents/triage-labels.md +11 -0
  29. package/docs/agents/workflow-manager-acceptance-matrix.md +93 -0
  30. package/docs/agents/workflow-manager-agent-interface.md +145 -0
  31. package/docs/agents/workflow-manager-current-state.md +205 -0
  32. package/lib/artifact-files.mjs +47 -0
  33. package/lib/codegraph.mjs +405 -0
  34. package/lib/delivery-state.mjs +3079 -198
  35. package/lib/frontend-guard.mjs +288 -0
  36. package/lib/fs-utils.mjs +53 -0
  37. package/lib/history-anchor.mjs +98 -0
  38. package/lib/mock-scenario-pack.mjs +687 -0
  39. package/lib/mock-system.mjs +897 -0
  40. package/lib/npm-auth.mjs +16 -0
  41. package/lib/npm-package-result.mjs +11 -0
  42. package/lib/png-evidence.mjs +149 -0
  43. package/lib/project-bootstrap.mjs +96 -55
  44. package/lib/project-installer.mjs +1484 -164
  45. package/lib/project-migration.mjs +1193 -0
  46. package/lib/prototype-migration.mjs +713 -0
  47. package/lib/prototype-page-review.mjs +384 -0
  48. package/lib/prototype-review-target.mjs +334 -0
  49. package/lib/prototype-revision.mjs +812 -0
  50. package/lib/stable-value.mjs +15 -0
  51. package/lib/toml-hooks.mjs +69 -0
  52. package/lib/ui-acceptance.mjs +565 -0
  53. package/lib/visual-standard.mjs +232 -0
  54. package/lib/workflow-manager-contracts.mjs +367 -0
  55. package/lib/workflow-manager-facts.mjs +778 -0
  56. package/lib/workflow-manager-governance.mjs +514 -0
  57. package/lib/workflow-manager-mock.mjs +183 -0
  58. package/lib/workflow-manager-prototypes.mjs +1847 -0
  59. package/lib/workflow-manager-public/assets/ibm-plex-mono-latin-400-normal-CvHOgSBP.woff +0 -0
  60. package/lib/workflow-manager-public/assets/ibm-plex-mono-latin-400-normal-DMJ8VG8y.woff2 +0 -0
  61. package/lib/workflow-manager-public/assets/ibm-plex-sans-latin-400-normal-CDDApCn2.woff2 +0 -0
  62. package/lib/workflow-manager-public/assets/ibm-plex-sans-latin-400-normal-CYLoc0-x.woff +0 -0
  63. package/lib/workflow-manager-public/assets/ibm-plex-sans-latin-500-normal-6ng42L7E.woff2 +0 -0
  64. package/lib/workflow-manager-public/assets/ibm-plex-sans-latin-500-normal-BgVn5rGT.woff +0 -0
  65. package/lib/workflow-manager-public/assets/ibm-plex-sans-latin-600-normal-Cu4Hd6ag.woff +0 -0
  66. package/lib/workflow-manager-public/assets/ibm-plex-sans-latin-600-normal-CuJfVYMP.woff2 +0 -0
  67. package/lib/workflow-manager-public/assets/index-Chlg6r8f.css +1 -0
  68. package/lib/workflow-manager-public/assets/index-E-hGB5ZD.js +13 -0
  69. package/lib/workflow-manager-public/fonts/OFL-1.1.txt +90 -0
  70. package/lib/workflow-manager-public/index.html +14 -0
  71. package/lib/workflow-manager-systems.mjs +519 -0
  72. package/lib/workflow-manager-transaction.mjs +397 -0
  73. package/lib/workflow-manager.mjs +745 -0
  74. package/package.json +6 -2
  75. package/skills/ai-delivery-assemble-release/SKILL.md +10 -8
  76. package/skills/ai-delivery-assemble-release/assets/release-candidate-manifest.yaml +16 -4
  77. package/skills/ai-delivery-assemble-release/assets/release-git-plan.yaml +96 -6
  78. package/skills/ai-delivery-assemble-release/assets/release-material-index.csv +1 -1
  79. package/skills/ai-delivery-assemble-release/assets/version-inclusion.csv +2 -2
  80. package/skills/ai-delivery-assemble-release/references/release-assembly-contract.md +16 -2
  81. package/skills/ai-delivery-assemble-release/scripts/plan-release.mjs +127 -3
  82. package/skills/ai-delivery-bootstrap/SKILL.md +4 -4
  83. package/skills/ai-delivery-bootstrap/references/bootstrap-contract.md +4 -2
  84. package/skills/ai-delivery-checkpoint-task/SKILL.md +17 -3
  85. package/skills/ai-delivery-checkpoint-task/assets/runtime-template/task.json +7 -1
  86. package/skills/ai-delivery-checkpoint-task/references/checkpoint-contract.md +22 -8
  87. package/skills/ai-delivery-checkpoint-task/scripts/hook-event.mjs +91 -0
  88. package/skills/ai-delivery-checkpoint-task/scripts/task-state.mjs +1086 -51
  89. package/skills/ai-delivery-close-version/SKILL.md +9 -8
  90. package/skills/ai-delivery-close-version/assets/version-lineage.yaml +1 -1
  91. package/skills/ai-delivery-close-version/references/version-closeout-contract.md +2 -2
  92. package/skills/ai-delivery-define-product/SKILL.md +8 -4
  93. package/skills/ai-delivery-define-product/references/product-contract.md +2 -2
  94. package/skills/ai-delivery-design-architecture/SKILL.md +9 -5
  95. package/skills/ai-delivery-design-architecture/assets/architecture-template/prototype-architecture-validation.yaml +16 -16
  96. package/skills/ai-delivery-design-architecture/references/architecture-contract.md +1 -1
  97. package/skills/ai-delivery-design-experience/SKILL.md +36 -30
  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/assets/development-template/candidate-manifest.yaml +36 -0
  150. package/skills/ai-delivery-develop-iteration/assets/development-template/task-prototype-traceability.csv +1 -1
  151. package/skills/ai-delivery-develop-iteration/references/development-contract.md +5 -3
  152. package/skills/ai-delivery-execute-test/SKILL.md +6 -2
  153. package/skills/ai-delivery-execute-work-package/SKILL.md +10 -3
  154. package/skills/ai-delivery-execute-work-package/references/work-package-contract.md +1 -1
  155. package/skills/ai-delivery-manage-git/SKILL.md +9 -7
  156. package/skills/ai-delivery-manage-git/references/git-policy.md +7 -3
  157. package/skills/ai-delivery-manage-git/scripts/release-git.mjs +995 -0
  158. package/skills/ai-delivery-orchestrate/SKILL.md +47 -29
  159. package/skills/ai-delivery-orchestrate/assets/project-template/.workflow/control/migrations/.gitkeep +0 -0
  160. package/skills/ai-delivery-orchestrate/assets/project-template/.workflow/control/repairs/.gitkeep +0 -0
  161. package/skills/ai-delivery-orchestrate/assets/project-template/.workflow/delivery/project.yaml +1 -0
  162. package/skills/ai-delivery-orchestrate/assets/project-template/.workflow/delivery/workflow-state.yaml +2 -0
  163. package/skills/ai-delivery-orchestrate/assets/project-template/.workflow/tools/frontend-guard/frontend-guard.mjs +50 -0
  164. package/skills/ai-delivery-orchestrate/assets/project-template/.workflow/tools/hooks/hook-event.mjs +91 -0
  165. package/skills/ai-delivery-orchestrate/assets/project-template/.workflow/tools/manager/manager.mjs +64 -0
  166. package/skills/ai-delivery-orchestrate/assets/project-template/.workflow/tools/manager/start.cmd +4 -0
  167. package/skills/ai-delivery-orchestrate/assets/project-template/.workflow/tools/manager/start.ps1 +2 -0
  168. package/skills/ai-delivery-orchestrate/assets/project-template/.workflow/tools/{viewer → manager}/start.sh +1 -1
  169. package/skills/ai-delivery-orchestrate/assets/project-template/.workflow/tools/mock/mock.mjs +50 -0
  170. package/skills/ai-delivery-orchestrate/assets/project-template/.workflow/tools/ui-acceptance/ui-acceptance.mjs +37 -0
  171. package/skills/ai-delivery-orchestrate/assets/project-template/AGENTS.md +37 -9
  172. package/skills/ai-delivery-orchestrate/assets/project-template/gitignore.template +1 -0
  173. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/CONTRIBUTING.md +25 -0
  174. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/LICENSE +21 -0
  175. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/README.md +250 -0
  176. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/UPSTREAM.yaml +19 -0
  177. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/airbnb/DESIGN.md +545 -0
  178. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/airbnb/README.md +5 -0
  179. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/airtable/DESIGN.md +554 -0
  180. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/airtable/README.md +5 -0
  181. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/apple/DESIGN.md +562 -0
  182. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/apple/README.md +5 -0
  183. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/binance/DESIGN.md +634 -0
  184. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/binance/README.md +5 -0
  185. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/bmw/DESIGN.md +544 -0
  186. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/bmw/README.md +5 -0
  187. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/bmw-m/DESIGN.md +503 -0
  188. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/bmw-m/README.md +5 -0
  189. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/bugatti/DESIGN.md +454 -0
  190. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/bugatti/README.md +5 -0
  191. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/cal/DESIGN.md +542 -0
  192. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/cal/README.md +5 -0
  193. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/claude/DESIGN.md +589 -0
  194. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/claude/README.md +5 -0
  195. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/clay/DESIGN.md +541 -0
  196. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/clay/README.md +5 -0
  197. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/clickhouse/DESIGN.md +544 -0
  198. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/clickhouse/README.md +5 -0
  199. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/cohere/DESIGN.md +451 -0
  200. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/cohere/README.md +5 -0
  201. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/coinbase/DESIGN.md +570 -0
  202. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/coinbase/README.md +5 -0
  203. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/composio/DESIGN.md +506 -0
  204. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/composio/README.md +5 -0
  205. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/cursor/DESIGN.md +537 -0
  206. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/cursor/README.md +5 -0
  207. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/dell-1996/DESIGN.md +632 -0
  208. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/dell-1996/README.md +5 -0
  209. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/elevenlabs/DESIGN.md +504 -0
  210. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/elevenlabs/README.md +5 -0
  211. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/expo/DESIGN.md +526 -0
  212. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/expo/README.md +5 -0
  213. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/ferrari/DESIGN.md +531 -0
  214. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/ferrari/README.md +5 -0
  215. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/figma/DESIGN.md +578 -0
  216. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/figma/README.md +5 -0
  217. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/framer/DESIGN.md +544 -0
  218. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/framer/README.md +5 -0
  219. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/hashicorp/DESIGN.md +575 -0
  220. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/hashicorp/README.md +5 -0
  221. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/hp/DESIGN.md +670 -0
  222. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/hp/README.md +5 -0
  223. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/ibm/DESIGN.md +550 -0
  224. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/ibm/README.md +5 -0
  225. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/intercom/DESIGN.md +546 -0
  226. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/intercom/README.md +5 -0
  227. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/kraken/DESIGN.md +125 -0
  228. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/kraken/README.md +5 -0
  229. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/lamborghini/DESIGN.md +288 -0
  230. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/lamborghini/README.md +5 -0
  231. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/linear.app/DESIGN.md +548 -0
  232. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/linear.app/README.md +5 -0
  233. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/lovable/DESIGN.md +298 -0
  234. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/lovable/README.md +5 -0
  235. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/mastercard/DESIGN.md +365 -0
  236. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/mastercard/README.md +5 -0
  237. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/meta/DESIGN.md +683 -0
  238. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/meta/README.md +5 -0
  239. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/minimax/DESIGN.md +746 -0
  240. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/minimax/README.md +5 -0
  241. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/mintlify/DESIGN.md +852 -0
  242. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/mintlify/README.md +5 -0
  243. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/miro/DESIGN.md +825 -0
  244. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/miro/README.md +5 -0
  245. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/mistral.ai/DESIGN.md +773 -0
  246. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/mistral.ai/README.md +5 -0
  247. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/mongodb/DESIGN.md +767 -0
  248. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/mongodb/README.md +5 -0
  249. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/nike/DESIGN.md +575 -0
  250. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/nike/README.md +5 -0
  251. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/nintendo-2001/DESIGN.md +649 -0
  252. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/nintendo-2001/README.md +5 -0
  253. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/notion/DESIGN.md +821 -0
  254. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/notion/README.md +5 -0
  255. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/nvidia/DESIGN.md +640 -0
  256. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/nvidia/README.md +5 -0
  257. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/ollama/DESIGN.md +539 -0
  258. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/ollama/README.md +5 -0
  259. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/opencode.ai/DESIGN.md +521 -0
  260. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/opencode.ai/README.md +5 -0
  261. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/pinterest/DESIGN.md +597 -0
  262. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/pinterest/README.md +5 -0
  263. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/playstation/DESIGN.md +661 -0
  264. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/playstation/README.md +5 -0
  265. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/posthog/DESIGN.md +690 -0
  266. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/posthog/README.md +5 -0
  267. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/raycast/DESIGN.md +669 -0
  268. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/raycast/README.md +5 -0
  269. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/renault/DESIGN.md +589 -0
  270. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/renault/README.md +5 -0
  271. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/replicate/DESIGN.md +616 -0
  272. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/replicate/README.md +5 -0
  273. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/resend/DESIGN.md +585 -0
  274. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/resend/README.md +5 -0
  275. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/revolut/DESIGN.md +636 -0
  276. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/revolut/README.md +5 -0
  277. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/runwayml/DESIGN.md +244 -0
  278. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/runwayml/README.md +5 -0
  279. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/sanity/DESIGN.md +357 -0
  280. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/sanity/README.md +5 -0
  281. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/sentry/DESIGN.md +551 -0
  282. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/sentry/README.md +5 -0
  283. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/shopify/DESIGN.md +516 -0
  284. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/shopify/README.md +5 -0
  285. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/slack/DESIGN.md +482 -0
  286. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/spacex/DESIGN.md +363 -0
  287. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/spacex/README.md +5 -0
  288. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/spotify/DESIGN.md +246 -0
  289. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/spotify/README.md +5 -0
  290. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/starbucks/DESIGN.md +580 -0
  291. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/starbucks/README.md +5 -0
  292. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/stripe/DESIGN.md +487 -0
  293. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/stripe/README.md +5 -0
  294. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/supabase/DESIGN.md +462 -0
  295. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/supabase/README.md +5 -0
  296. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/superhuman/DESIGN.md +448 -0
  297. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/superhuman/README.md +5 -0
  298. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/tesla/DESIGN.md +286 -0
  299. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/tesla/README.md +5 -0
  300. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/theverge/DESIGN.md +339 -0
  301. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/theverge/README.md +5 -0
  302. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/together.ai/DESIGN.md +633 -0
  303. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/together.ai/README.md +5 -0
  304. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/uber/DESIGN.md +636 -0
  305. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/uber/README.md +5 -0
  306. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/vercel/DESIGN.md +736 -0
  307. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/vercel/README.md +5 -0
  308. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/vodafone/DESIGN.md +538 -0
  309. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/vodafone/README.md +5 -0
  310. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/voltagent/DESIGN.md +521 -0
  311. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/voltagent/README.md +5 -0
  312. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/warp/DESIGN.md +526 -0
  313. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/warp/README.md +5 -0
  314. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/webflow/DESIGN.md +588 -0
  315. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/webflow/README.md +5 -0
  316. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/wired/DESIGN.md +497 -0
  317. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/wired/README.md +5 -0
  318. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/wise/DESIGN.md +544 -0
  319. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/wise/README.md +5 -0
  320. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/x.ai/DESIGN.md +465 -0
  321. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/x.ai/README.md +5 -0
  322. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/zapier/DESIGN.md +537 -0
  323. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/zapier/README.md +5 -0
  324. package/skills/ai-delivery-orchestrate/references/formal-state-contract.md +65 -20
  325. package/skills/ai-delivery-orchestrate/references/workflow-model.md +8 -6
  326. package/skills/ai-delivery-orchestrate-release/SKILL.md +12 -12
  327. package/skills/ai-delivery-orchestrate-release/assets/release-request.yaml +4 -1
  328. package/skills/ai-delivery-orchestrate-release/assets/version-selection.yaml +13 -1
  329. package/skills/ai-delivery-orchestrate-release/references/release-workflow-contract.md +15 -1
  330. package/skills/ai-delivery-plan-iteration/SKILL.md +11 -4
  331. package/skills/ai-delivery-plan-iteration/assets/planning-template/scope-manifest.yaml +17 -0
  332. package/skills/ai-delivery-plan-iteration/assets/planning-template/slice-prototype-traceability.csv +1 -1
  333. package/skills/ai-delivery-plan-iteration/references/planning-contract.md +8 -2
  334. package/skills/ai-delivery-prepare-platform/SKILL.md +5 -1
  335. package/skills/ai-delivery-prepare-release/SKILL.md +6 -5
  336. package/skills/ai-delivery-prepare-release/assets/release-template/release-manifest.yaml +23 -2
  337. package/skills/ai-delivery-prepare-release/references/release-contract.md +5 -1
  338. package/skills/ai-delivery-review-change/SKILL.md +14 -4
  339. package/skills/ai-delivery-review-change/references/review-contract.md +6 -0
  340. package/skills/ai-delivery-triage-failure/SKILL.md +5 -1
  341. package/skills/ai-delivery-validate-artifacts/SKILL.md +6 -3
  342. package/skills/ai-delivery-validate-artifacts/references/artifact-contract.md +13 -13
  343. package/skills/ai-delivery-verify-candidate/SKILL.md +13 -6
  344. package/skills/ai-delivery-verify-candidate/assets/verification-template/ui-acceptance-request.yaml +19 -0
  345. package/skills/ai-delivery-verify-candidate/assets/verification-template/ui-acceptance-results.yaml +53 -0
  346. package/skills/ai-delivery-verify-candidate/references/candidate-verification-contract.md +10 -2
  347. package/skills/ai-delivery-verify-production/SKILL.md +7 -4
  348. package/skills/ai-delivery-verify-production/assets/production-verification-template/production-verification.json +9 -0
  349. package/skills/ai-delivery-verify-production/assets/production-verification-template/production-verification.md +20 -0
  350. package/skills/ai-delivery-verify-production/references/production-verification-contract.md +19 -3
  351. package/skills/ai-delivery-design-experience/assets/experience-template/low-fidelity-confirmation.yaml +0 -32
  352. package/skills/ai-delivery-orchestrate/assets/project-template/.workflow/tools/viewer/public/app.js +0 -546
  353. package/skills/ai-delivery-orchestrate/assets/project-template/.workflow/tools/viewer/public/index.html +0 -199
  354. package/skills/ai-delivery-orchestrate/assets/project-template/.workflow/tools/viewer/public/styles.css +0 -529
  355. package/skills/ai-delivery-orchestrate/assets/project-template/.workflow/tools/viewer/server.mjs +0 -780
  356. package/skills/ai-delivery-orchestrate/assets/project-template/.workflow/tools/viewer/start.cmd +0 -4
  357. package/skills/ai-delivery-orchestrate/assets/project-template/.workflow/tools/viewer/start.ps1 +0 -2
@@ -0,0 +1,16 @@
1
+ const OFFICIAL_NPM_REGISTRY = "https://registry.npmjs.org/";
2
+ const OFFICIAL_NPM_TOKEN_ENV_KEY = "npm_config_//registry.npmjs.org/:_authToken";
3
+
4
+ export function withNpmAccessToken(environment = process.env) {
5
+ const token = typeof environment.NPM_ACCESS_TOKEN === "string"
6
+ ? environment.NPM_ACCESS_TOKEN.trim()
7
+ : "";
8
+ if (!token) return environment;
9
+
10
+ return {
11
+ ...environment,
12
+ [OFFICIAL_NPM_TOKEN_ENV_KEY]: token,
13
+ };
14
+ }
15
+
16
+ export { OFFICIAL_NPM_REGISTRY, OFFICIAL_NPM_TOKEN_ENV_KEY };
@@ -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
  }