ai-delivery-workflow 0.3.0 → 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 (360) hide show
  1. package/README.md +40 -14
  2. package/bin/ai-delivery.mjs +181 -6
  3. package/bin/benchmark-autonomy.mjs +14 -6
  4. package/bin/release-check.mjs +2 -1
  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 +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 +108 -38
  11. package/docs/MAINTENANCE-VERIFICATION.zh-CN.md +2 -2
  12. package/docs/MOCK-SYSTEM.zh-CN.md +141 -0
  13. package/docs/PROJECT-MANUAL.zh-CN.md +148 -93
  14. package/docs/PROTOTYPE-MIGRATION.zh-CN.md +164 -0
  15. package/docs/STATE-CLI-MAINTENANCE.zh-CN.md +35 -17
  16. package/docs/STATE-CLI-USER-GUIDE.zh-CN.md +115 -39
  17. package/docs/VIEWER-MAINTENANCE.zh-CN.md +101 -324
  18. package/docs/VIEWER-USER-GUIDE.zh-CN.md +68 -190
  19. package/docs/adr/0001-prototype-first-ui-governance.md +3 -0
  20. package/docs/adr/0002-microcks-as-default-mock-system.md +3 -0
  21. package/docs/adr/0003-workflow-manager-governed-control-surface.md +46 -0
  22. package/docs/adr/0004-operational-carbon-visual-standard.md +9 -0
  23. package/docs/adr/0005-prototype-management-as-routed-pages.md +7 -0
  24. package/docs/agents/domain.md +12 -0
  25. package/docs/agents/issue-tracker.md +27 -0
  26. package/docs/agents/triage-labels.md +11 -0
  27. package/docs/agents/workflow-manager-acceptance-matrix.md +93 -0
  28. package/docs/agents/workflow-manager-agent-interface.md +145 -0
  29. package/docs/agents/workflow-manager-current-state.md +205 -0
  30. package/lib/artifact-files.mjs +47 -0
  31. package/lib/codegraph.mjs +405 -0
  32. package/lib/delivery-state.mjs +3079 -198
  33. package/lib/frontend-guard.mjs +288 -0
  34. package/lib/fs-utils.mjs +53 -0
  35. package/lib/history-anchor.mjs +98 -0
  36. package/lib/mock-scenario-pack.mjs +687 -0
  37. package/lib/mock-system.mjs +897 -0
  38. package/lib/npm-package-result.mjs +11 -0
  39. package/lib/png-evidence.mjs +149 -0
  40. package/lib/project-bootstrap.mjs +96 -55
  41. package/lib/project-installer.mjs +1484 -164
  42. package/lib/project-migration.mjs +1193 -0
  43. package/lib/prototype-migration.mjs +713 -0
  44. package/lib/prototype-page-review.mjs +384 -0
  45. package/lib/prototype-review-target.mjs +334 -0
  46. package/lib/prototype-revision.mjs +812 -0
  47. package/lib/stable-value.mjs +15 -0
  48. package/lib/toml-hooks.mjs +69 -0
  49. package/lib/ui-acceptance.mjs +565 -0
  50. package/lib/visual-standard.mjs +232 -0
  51. package/lib/workflow-manager-contracts.mjs +367 -0
  52. package/lib/workflow-manager-facts.mjs +778 -0
  53. package/lib/workflow-manager-governance.mjs +514 -0
  54. package/lib/workflow-manager-mock.mjs +183 -0
  55. package/lib/workflow-manager-prototypes.mjs +1847 -0
  56. package/lib/workflow-manager-public/assets/ibm-plex-mono-latin-400-normal-CvHOgSBP.woff +0 -0
  57. package/lib/workflow-manager-public/assets/ibm-plex-mono-latin-400-normal-DMJ8VG8y.woff2 +0 -0
  58. package/lib/workflow-manager-public/assets/ibm-plex-sans-latin-400-normal-CDDApCn2.woff2 +0 -0
  59. package/lib/workflow-manager-public/assets/ibm-plex-sans-latin-400-normal-CYLoc0-x.woff +0 -0
  60. package/lib/workflow-manager-public/assets/ibm-plex-sans-latin-500-normal-6ng42L7E.woff2 +0 -0
  61. package/lib/workflow-manager-public/assets/ibm-plex-sans-latin-500-normal-BgVn5rGT.woff +0 -0
  62. package/lib/workflow-manager-public/assets/ibm-plex-sans-latin-600-normal-Cu4Hd6ag.woff +0 -0
  63. package/lib/workflow-manager-public/assets/ibm-plex-sans-latin-600-normal-CuJfVYMP.woff2 +0 -0
  64. package/lib/workflow-manager-public/assets/index-Chlg6r8f.css +1 -0
  65. package/lib/workflow-manager-public/assets/index-E-hGB5ZD.js +13 -0
  66. package/lib/workflow-manager-public/fonts/OFL-1.1.txt +90 -0
  67. package/lib/workflow-manager-public/index.html +14 -0
  68. package/lib/workflow-manager-systems.mjs +519 -0
  69. package/lib/workflow-manager-transaction.mjs +397 -0
  70. package/lib/workflow-manager.mjs +745 -0
  71. package/package.json +6 -2
  72. package/skills/ai-delivery-assemble-release/agents/openai.yaml +3 -3
  73. package/skills/ai-delivery-assemble-release/assets/release-material-index.csv +1 -1
  74. package/skills/ai-delivery-assemble-release/assets/version-inclusion.csv +1 -1
  75. package/skills/ai-delivery-bootstrap/SKILL.md +4 -4
  76. package/skills/ai-delivery-bootstrap/agents/openai.yaml +3 -3
  77. package/skills/ai-delivery-bootstrap/references/bootstrap-contract.md +4 -2
  78. package/skills/ai-delivery-checkpoint-task/SKILL.md +17 -3
  79. package/skills/ai-delivery-checkpoint-task/agents/openai.yaml +3 -3
  80. package/skills/ai-delivery-checkpoint-task/assets/runtime-template/task.json +7 -1
  81. package/skills/ai-delivery-checkpoint-task/references/checkpoint-contract.md +22 -8
  82. package/skills/ai-delivery-checkpoint-task/scripts/hook-event.mjs +91 -0
  83. package/skills/ai-delivery-checkpoint-task/scripts/task-state.mjs +1086 -51
  84. package/skills/ai-delivery-close-version/SKILL.md +9 -8
  85. package/skills/ai-delivery-close-version/agents/openai.yaml +3 -3
  86. package/skills/ai-delivery-close-version/assets/version-lineage.yaml +1 -1
  87. package/skills/ai-delivery-close-version/references/version-closeout-contract.md +2 -2
  88. package/skills/ai-delivery-define-product/SKILL.md +8 -4
  89. package/skills/ai-delivery-define-product/agents/openai.yaml +4 -4
  90. package/skills/ai-delivery-define-product/references/product-contract.md +2 -2
  91. package/skills/ai-delivery-deploy-production/agents/openai.yaml +3 -3
  92. package/skills/ai-delivery-design-architecture/SKILL.md +9 -5
  93. package/skills/ai-delivery-design-architecture/assets/architecture-template/prototype-architecture-validation.yaml +16 -16
  94. package/skills/ai-delivery-design-architecture/references/architecture-contract.md +1 -1
  95. package/skills/ai-delivery-design-experience/SKILL.md +36 -30
  96. package/skills/ai-delivery-design-experience/agents/openai.yaml +4 -4
  97. package/skills/ai-delivery-design-experience/assets/experience-template/LEGACY-COMPATIBILITY.md +16 -0
  98. package/skills/ai-delivery-design-experience/assets/experience-template/design-reference-selection.yaml +32 -0
  99. package/skills/ai-delivery-design-experience/assets/experience-template/experience-baseline.yaml +2 -2
  100. package/skills/ai-delivery-design-experience/assets/experience-template/formal-ui-confirmation.yaml +16 -3
  101. package/skills/ai-delivery-design-experience/assets/experience-template/frontend-change-scope.yaml +30 -0
  102. package/skills/ai-delivery-design-experience/assets/experience-template/interaction-contract.csv +1 -1
  103. package/skills/ai-delivery-design-experience/assets/experience-template/mock-admin-export.yaml +8 -0
  104. package/skills/ai-delivery-design-experience/assets/experience-template/mock-scenario-mappings.csv +1 -0
  105. package/skills/ai-delivery-design-experience/assets/experience-template/mock-scenario-pack-request.yaml +24 -0
  106. package/skills/ai-delivery-design-experience/assets/experience-template/product-prototype-reconciliation.yaml +2 -1
  107. package/skills/ai-delivery-design-experience/assets/experience-template/prototype-adjustment-log.csv +1 -1
  108. package/skills/ai-delivery-design-experience/assets/experience-template/prototype-component-bindings.csv +1 -0
  109. package/skills/ai-delivery-design-experience/assets/experience-template/prototype-component-candidates.csv +1 -0
  110. package/skills/ai-delivery-design-experience/assets/experience-template/prototype-components.csv +1 -0
  111. package/skills/ai-delivery-design-experience/assets/experience-template/prototype-confirmation.yaml +18 -18
  112. package/skills/ai-delivery-design-experience/assets/experience-template/prototype-data-contracts.csv +1 -0
  113. package/skills/ai-delivery-design-experience/assets/experience-template/prototype-impact-assessment.yaml +5 -5
  114. package/skills/ai-delivery-design-experience/assets/experience-template/prototype-implementation-bindings.csv +1 -0
  115. package/skills/ai-delivery-design-experience/assets/experience-template/prototype-manifest.yaml +2 -0
  116. package/skills/ai-delivery-design-experience/assets/experience-template/prototype-pages.csv +1 -0
  117. package/skills/ai-delivery-design-experience/assets/experience-template/prototype-product-coverage.csv +1 -1
  118. package/skills/ai-delivery-design-experience/assets/experience-template/prototype-review-comments.csv +1 -1
  119. package/skills/ai-delivery-design-experience/assets/experience-template/prototype-review-decision.yaml +13 -12
  120. package/skills/ai-delivery-design-experience/assets/experience-template/prototype-review-scenes.csv +1 -0
  121. package/skills/ai-delivery-design-experience/assets/experience-template/prototype-review-sessions.csv +1 -1
  122. package/skills/ai-delivery-design-experience/assets/experience-template/prototype-review-unit-pages.csv +1 -0
  123. package/skills/ai-delivery-design-experience/assets/experience-template/prototype-review-units.csv +1 -0
  124. package/skills/ai-delivery-design-experience/assets/experience-template/prototype-revision.yaml +88 -0
  125. package/skills/ai-delivery-design-experience/assets/experience-template/prototype-routes.csv +1 -0
  126. package/skills/ai-delivery-design-experience/assets/experience-template/prototype-set.yaml +2 -0
  127. package/skills/ai-delivery-design-experience/assets/experience-template/prototype-source-inspection-snapshots.csv +1 -0
  128. package/skills/ai-delivery-design-experience/assets/experience-template/prototype-terminals.csv +1 -0
  129. package/skills/ai-delivery-design-experience/assets/experience-template/prototype-tool-candidates.csv +1 -1
  130. package/skills/ai-delivery-design-experience/assets/experience-template/prototype-tool-selection.yaml +2 -3
  131. package/skills/ai-delivery-design-experience/assets/experience-template/prototype-traceability.csv +1 -1
  132. package/skills/ai-delivery-design-experience/assets/experience-template/prototype-trigger-conditions.csv +1 -0
  133. package/skills/ai-delivery-design-experience/assets/experience-template/prototype.yaml +6 -0
  134. package/skills/ai-delivery-design-experience/assets/experience-template/ui-framework-selection.yaml +17 -1
  135. package/skills/ai-delivery-design-experience/assets/experience-template/ui-handoff.yaml +6 -5
  136. package/skills/ai-delivery-design-experience/assets/experience-template/ui-mapping.csv +1 -0
  137. package/skills/ai-delivery-design-experience/assets/experience-template/visual-direction.yaml +4 -0
  138. package/skills/ai-delivery-design-experience/assets/experience-template/visual-reference-manifest.yaml +23 -0
  139. package/skills/ai-delivery-design-experience/assets/experience-template/visual-reference.html +163 -0
  140. package/skills/ai-delivery-design-experience/assets/experience-template/visual-system-confirmation.yaml +11 -0
  141. package/skills/ai-delivery-design-experience/references/experience-contract.md +26 -27
  142. package/skills/ai-delivery-design-experience/references/prototype-management-contract.md +42 -21
  143. package/skills/ai-delivery-design-tests/SKILL.md +13 -7
  144. package/skills/ai-delivery-design-tests/assets/test-design-template/prototype-test-scope.csv +1 -1
  145. package/skills/ai-delivery-design-tests/assets/test-design-template/prototype-test-validation.yaml +17 -16
  146. package/skills/ai-delivery-design-tests/references/test-design-contract.md +7 -5
  147. package/skills/ai-delivery-develop-iteration/SKILL.md +18 -11
  148. package/skills/ai-delivery-develop-iteration/agents/openai.yaml +3 -3
  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-evolve-workflow/agents/openai.yaml +3 -3
  153. package/skills/ai-delivery-execute-test/SKILL.md +6 -2
  154. package/skills/ai-delivery-execute-test/agents/openai.yaml +4 -4
  155. package/skills/ai-delivery-execute-work-package/SKILL.md +10 -3
  156. package/skills/ai-delivery-execute-work-package/agents/openai.yaml +4 -4
  157. package/skills/ai-delivery-execute-work-package/references/work-package-contract.md +1 -1
  158. package/skills/ai-delivery-manage-git/agents/openai.yaml +3 -3
  159. package/skills/ai-delivery-manage-standards/agents/openai.yaml +4 -4
  160. package/skills/ai-delivery-orchestrate/SKILL.md +47 -29
  161. package/skills/ai-delivery-orchestrate/agents/openai.yaml +3 -3
  162. package/skills/ai-delivery-orchestrate/assets/project-template/.workflow/control/migrations/.gitkeep +0 -0
  163. package/skills/ai-delivery-orchestrate/assets/project-template/.workflow/control/repairs/.gitkeep +0 -0
  164. package/skills/ai-delivery-orchestrate/assets/project-template/.workflow/delivery/project.yaml +1 -0
  165. package/skills/ai-delivery-orchestrate/assets/project-template/.workflow/delivery/workflow-state.yaml +2 -0
  166. package/skills/ai-delivery-orchestrate/assets/project-template/.workflow/tools/frontend-guard/frontend-guard.mjs +50 -0
  167. package/skills/ai-delivery-orchestrate/assets/project-template/.workflow/tools/hooks/hook-event.mjs +91 -0
  168. package/skills/ai-delivery-orchestrate/assets/project-template/.workflow/tools/manager/manager.mjs +64 -0
  169. package/skills/ai-delivery-orchestrate/assets/project-template/.workflow/tools/manager/start.cmd +4 -0
  170. package/skills/ai-delivery-orchestrate/assets/project-template/.workflow/tools/manager/start.ps1 +2 -0
  171. package/skills/ai-delivery-orchestrate/assets/project-template/.workflow/tools/{viewer → manager}/start.sh +1 -1
  172. package/skills/ai-delivery-orchestrate/assets/project-template/.workflow/tools/mock/mock.mjs +50 -0
  173. package/skills/ai-delivery-orchestrate/assets/project-template/.workflow/tools/ui-acceptance/ui-acceptance.mjs +37 -0
  174. package/skills/ai-delivery-orchestrate/assets/project-template/AGENTS.md +32 -6
  175. package/skills/ai-delivery-orchestrate/assets/project-template/gitignore.template +1 -0
  176. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/CONTRIBUTING.md +25 -0
  177. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/LICENSE +21 -0
  178. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/README.md +250 -0
  179. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/UPSTREAM.yaml +19 -0
  180. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/airbnb/DESIGN.md +545 -0
  181. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/airbnb/README.md +5 -0
  182. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/airtable/DESIGN.md +554 -0
  183. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/airtable/README.md +5 -0
  184. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/apple/DESIGN.md +562 -0
  185. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/apple/README.md +5 -0
  186. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/binance/DESIGN.md +634 -0
  187. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/binance/README.md +5 -0
  188. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/bmw/DESIGN.md +544 -0
  189. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/bmw/README.md +5 -0
  190. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/bmw-m/DESIGN.md +503 -0
  191. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/bmw-m/README.md +5 -0
  192. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/bugatti/DESIGN.md +454 -0
  193. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/bugatti/README.md +5 -0
  194. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/cal/DESIGN.md +542 -0
  195. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/cal/README.md +5 -0
  196. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/claude/DESIGN.md +589 -0
  197. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/claude/README.md +5 -0
  198. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/clay/DESIGN.md +541 -0
  199. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/clay/README.md +5 -0
  200. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/clickhouse/DESIGN.md +544 -0
  201. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/clickhouse/README.md +5 -0
  202. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/cohere/DESIGN.md +451 -0
  203. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/cohere/README.md +5 -0
  204. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/coinbase/DESIGN.md +570 -0
  205. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/coinbase/README.md +5 -0
  206. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/composio/DESIGN.md +506 -0
  207. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/composio/README.md +5 -0
  208. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/cursor/DESIGN.md +537 -0
  209. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/cursor/README.md +5 -0
  210. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/dell-1996/DESIGN.md +632 -0
  211. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/dell-1996/README.md +5 -0
  212. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/elevenlabs/DESIGN.md +504 -0
  213. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/elevenlabs/README.md +5 -0
  214. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/expo/DESIGN.md +526 -0
  215. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/expo/README.md +5 -0
  216. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/ferrari/DESIGN.md +531 -0
  217. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/ferrari/README.md +5 -0
  218. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/figma/DESIGN.md +578 -0
  219. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/figma/README.md +5 -0
  220. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/framer/DESIGN.md +544 -0
  221. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/framer/README.md +5 -0
  222. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/hashicorp/DESIGN.md +575 -0
  223. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/hashicorp/README.md +5 -0
  224. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/hp/DESIGN.md +670 -0
  225. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/hp/README.md +5 -0
  226. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/ibm/DESIGN.md +550 -0
  227. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/ibm/README.md +5 -0
  228. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/intercom/DESIGN.md +546 -0
  229. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/intercom/README.md +5 -0
  230. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/kraken/DESIGN.md +125 -0
  231. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/kraken/README.md +5 -0
  232. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/lamborghini/DESIGN.md +288 -0
  233. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/lamborghini/README.md +5 -0
  234. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/linear.app/DESIGN.md +548 -0
  235. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/linear.app/README.md +5 -0
  236. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/lovable/DESIGN.md +298 -0
  237. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/lovable/README.md +5 -0
  238. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/mastercard/DESIGN.md +365 -0
  239. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/mastercard/README.md +5 -0
  240. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/meta/DESIGN.md +683 -0
  241. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/meta/README.md +5 -0
  242. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/minimax/DESIGN.md +746 -0
  243. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/minimax/README.md +5 -0
  244. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/mintlify/DESIGN.md +852 -0
  245. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/mintlify/README.md +5 -0
  246. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/miro/DESIGN.md +825 -0
  247. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/miro/README.md +5 -0
  248. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/mistral.ai/DESIGN.md +773 -0
  249. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/mistral.ai/README.md +5 -0
  250. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/mongodb/DESIGN.md +767 -0
  251. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/mongodb/README.md +5 -0
  252. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/nike/DESIGN.md +575 -0
  253. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/nike/README.md +5 -0
  254. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/nintendo-2001/DESIGN.md +649 -0
  255. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/nintendo-2001/README.md +5 -0
  256. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/notion/DESIGN.md +821 -0
  257. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/notion/README.md +5 -0
  258. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/nvidia/DESIGN.md +640 -0
  259. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/nvidia/README.md +5 -0
  260. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/ollama/DESIGN.md +539 -0
  261. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/ollama/README.md +5 -0
  262. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/opencode.ai/DESIGN.md +521 -0
  263. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/opencode.ai/README.md +5 -0
  264. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/pinterest/DESIGN.md +597 -0
  265. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/pinterest/README.md +5 -0
  266. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/playstation/DESIGN.md +661 -0
  267. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/playstation/README.md +5 -0
  268. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/posthog/DESIGN.md +690 -0
  269. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/posthog/README.md +5 -0
  270. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/raycast/DESIGN.md +669 -0
  271. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/raycast/README.md +5 -0
  272. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/renault/DESIGN.md +589 -0
  273. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/renault/README.md +5 -0
  274. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/replicate/DESIGN.md +616 -0
  275. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/replicate/README.md +5 -0
  276. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/resend/DESIGN.md +585 -0
  277. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/resend/README.md +5 -0
  278. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/revolut/DESIGN.md +636 -0
  279. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/revolut/README.md +5 -0
  280. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/runwayml/DESIGN.md +244 -0
  281. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/runwayml/README.md +5 -0
  282. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/sanity/DESIGN.md +357 -0
  283. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/sanity/README.md +5 -0
  284. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/sentry/DESIGN.md +551 -0
  285. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/sentry/README.md +5 -0
  286. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/shopify/DESIGN.md +516 -0
  287. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/shopify/README.md +5 -0
  288. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/slack/DESIGN.md +482 -0
  289. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/spacex/DESIGN.md +363 -0
  290. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/spacex/README.md +5 -0
  291. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/spotify/DESIGN.md +246 -0
  292. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/spotify/README.md +5 -0
  293. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/starbucks/DESIGN.md +580 -0
  294. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/starbucks/README.md +5 -0
  295. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/stripe/DESIGN.md +487 -0
  296. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/stripe/README.md +5 -0
  297. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/supabase/DESIGN.md +462 -0
  298. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/supabase/README.md +5 -0
  299. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/superhuman/DESIGN.md +448 -0
  300. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/superhuman/README.md +5 -0
  301. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/tesla/DESIGN.md +286 -0
  302. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/tesla/README.md +5 -0
  303. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/theverge/DESIGN.md +339 -0
  304. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/theverge/README.md +5 -0
  305. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/together.ai/DESIGN.md +633 -0
  306. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/together.ai/README.md +5 -0
  307. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/uber/DESIGN.md +636 -0
  308. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/uber/README.md +5 -0
  309. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/vercel/DESIGN.md +736 -0
  310. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/vercel/README.md +5 -0
  311. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/vodafone/DESIGN.md +538 -0
  312. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/vodafone/README.md +5 -0
  313. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/voltagent/DESIGN.md +521 -0
  314. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/voltagent/README.md +5 -0
  315. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/warp/DESIGN.md +526 -0
  316. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/warp/README.md +5 -0
  317. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/webflow/DESIGN.md +588 -0
  318. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/webflow/README.md +5 -0
  319. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/wired/DESIGN.md +497 -0
  320. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/wired/README.md +5 -0
  321. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/wise/DESIGN.md +544 -0
  322. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/wise/README.md +5 -0
  323. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/x.ai/DESIGN.md +465 -0
  324. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/x.ai/README.md +5 -0
  325. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/zapier/DESIGN.md +537 -0
  326. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/zapier/README.md +5 -0
  327. package/skills/ai-delivery-orchestrate/references/formal-state-contract.md +65 -20
  328. package/skills/ai-delivery-orchestrate/references/workflow-model.md +7 -5
  329. package/skills/ai-delivery-orchestrate-release/SKILL.md +2 -2
  330. package/skills/ai-delivery-orchestrate-release/agents/openai.yaml +4 -4
  331. package/skills/ai-delivery-orchestrate-release/references/release-workflow-contract.md +1 -1
  332. package/skills/ai-delivery-plan-iteration/SKILL.md +11 -4
  333. package/skills/ai-delivery-plan-iteration/agents/openai.yaml +4 -4
  334. package/skills/ai-delivery-plan-iteration/assets/planning-template/scope-manifest.yaml +17 -0
  335. package/skills/ai-delivery-plan-iteration/assets/planning-template/slice-prototype-traceability.csv +1 -1
  336. package/skills/ai-delivery-plan-iteration/references/planning-contract.md +8 -2
  337. package/skills/ai-delivery-prepare-platform/SKILL.md +5 -1
  338. package/skills/ai-delivery-prepare-platform/agents/openai.yaml +4 -4
  339. package/skills/ai-delivery-prepare-release/agents/openai.yaml +4 -4
  340. package/skills/ai-delivery-review-change/SKILL.md +14 -4
  341. package/skills/ai-delivery-review-change/agents/openai.yaml +4 -4
  342. package/skills/ai-delivery-review-change/references/review-contract.md +6 -0
  343. package/skills/ai-delivery-triage-failure/SKILL.md +5 -1
  344. package/skills/ai-delivery-triage-failure/agents/openai.yaml +4 -4
  345. package/skills/ai-delivery-validate-artifacts/SKILL.md +6 -3
  346. package/skills/ai-delivery-validate-artifacts/agents/openai.yaml +4 -4
  347. package/skills/ai-delivery-validate-artifacts/references/artifact-contract.md +13 -13
  348. package/skills/ai-delivery-verify-candidate/SKILL.md +13 -6
  349. package/skills/ai-delivery-verify-candidate/agents/openai.yaml +3 -3
  350. package/skills/ai-delivery-verify-candidate/assets/verification-template/ui-acceptance-request.yaml +19 -0
  351. package/skills/ai-delivery-verify-candidate/assets/verification-template/ui-acceptance-results.yaml +53 -0
  352. package/skills/ai-delivery-verify-candidate/references/candidate-verification-contract.md +10 -2
  353. package/skills/ai-delivery-verify-production/agents/openai.yaml +3 -3
  354. package/skills/ai-delivery-design-experience/assets/experience-template/low-fidelity-confirmation.yaml +0 -32
  355. package/skills/ai-delivery-orchestrate/assets/project-template/.workflow/tools/viewer/public/app.js +0 -546
  356. package/skills/ai-delivery-orchestrate/assets/project-template/.workflow/tools/viewer/public/index.html +0 -199
  357. package/skills/ai-delivery-orchestrate/assets/project-template/.workflow/tools/viewer/public/styles.css +0 -529
  358. package/skills/ai-delivery-orchestrate/assets/project-template/.workflow/tools/viewer/server.mjs +0 -780
  359. package/skills/ai-delivery-orchestrate/assets/project-template/.workflow/tools/viewer/start.cmd +0 -4
  360. package/skills/ai-delivery-orchestrate/assets/project-template/.workflow/tools/viewer/start.ps1 +0 -2
@@ -0,0 +1,514 @@
1
+ import crypto from "node:crypto";
2
+ import fs from "node:fs";
3
+ import path from "node:path";
4
+ import { createRequire } from "node:module";
5
+ import { fileURLToPath, pathToFileURL } from "node:url";
6
+ import {
7
+ commitWorkflowManagerAction,
8
+ prepareWorkflowManagerFormalTransaction,
9
+ workflowManagerRequestChecksum,
10
+ } from "./workflow-manager-transaction.mjs";
11
+
12
+ const runtimeRoot = path.dirname(fileURLToPath(import.meta.url));
13
+ const installedYaml = path.join(runtimeRoot, "..", "state", "vendor", "yaml", "dist", "index.js");
14
+ const require = createRequire(import.meta.url);
15
+ const YAML = require(fs.existsSync(installedYaml) ? installedYaml : "yaml");
16
+ const installedState = path.join(runtimeRoot, "..", "state", "delivery-state.mjs");
17
+ const packageState = path.join(runtimeRoot, "delivery-state.mjs");
18
+ const { executeDeliveryStateCommand } = await import(pathToFileURL(
19
+ fs.existsSync(installedState) ? installedState : packageState,
20
+ ).href);
21
+
22
+ export const WORKFLOW_MANAGER_GOVERNANCE_SCHEMA_VERSION = "workflow-manager.governance.v1";
23
+
24
+ const RELATIONS_FILE = ".workflow/control/relations.yaml";
25
+ const SETTINGS_FILE = ".workflow/config/manager-settings.json";
26
+ const RECEIPTS_ROOT = ".workflow/control/receipts";
27
+ const EVENTS_FILE = ".workflow/control/events/workflow-manager-events.jsonl";
28
+ const SAFE_ID = /^[A-Za-z0-9][A-Za-z0-9._:/-]{0,191}$/;
29
+ const SAFE_ENTITY_TYPE = /^[a-z][a-z0-9-]{0,63}$/;
30
+ const RELATION_TYPES = new Set([
31
+ "implements", "implemented-by", "covers", "covered-by", "verifies", "verified-by",
32
+ "produces", "produced-by", "depends-on", "blocks", "sourced-from", "supersedes", "related-to",
33
+ ]);
34
+ const DEVELOPMENT_NODES = new Set([
35
+ "00-bootstrap", "01-product-shaping", "02-solution-design", "03-delivery-readiness",
36
+ "04-implementation", "05-candidate-assurance", "06-version-closeout",
37
+ ]);
38
+
39
+ function stable(value) {
40
+ if (Array.isArray(value)) return value.map(stable);
41
+ if (value && typeof value === "object") {
42
+ return Object.fromEntries(Object.keys(value).sort().map((key) => [key, stable(value[key])]));
43
+ }
44
+ return value;
45
+ }
46
+
47
+ function sha256(value) {
48
+ return crypto.createHash("sha256").update(value).digest("hex");
49
+ }
50
+
51
+ function checksum(value) {
52
+ return sha256(JSON.stringify(stable(value)));
53
+ }
54
+
55
+ function contained(root, relative) {
56
+ const absolute = path.resolve(root, ...relative.split("/"));
57
+ const relation = path.relative(root, absolute);
58
+ if (relation.startsWith("..") || path.isAbsolute(relation)) throw new Error(`Governed path escapes project: ${relative}`);
59
+ return absolute;
60
+ }
61
+
62
+ function atomicWrite(file, content) {
63
+ fs.mkdirSync(path.dirname(file), { recursive: true });
64
+ const temporary = `${file}.${process.pid}.${crypto.randomUUID()}.tmp`;
65
+ fs.writeFileSync(temporary, content, { encoding: "utf8", flag: "wx" });
66
+ try {
67
+ fs.renameSync(temporary, file);
68
+ } catch (error) {
69
+ fs.rmSync(temporary, { force: true });
70
+ throw error;
71
+ }
72
+ }
73
+
74
+ function requireHuman(actor) {
75
+ if (!/^human:[A-Za-z0-9._@/-]+$/.test(String(actor || ""))) {
76
+ throw new Error("Governed confirmation requires actor human:<identity>");
77
+ }
78
+ }
79
+
80
+ function requireAgent(actor) {
81
+ if (!/^agent:[A-Za-z0-9._@/-]+$/.test(String(actor || ""))) {
82
+ throw new Error("Relationship suggestion requires actor agent:<identity>");
83
+ }
84
+ }
85
+
86
+ function receiptFiles(root) {
87
+ const directory = contained(root, RECEIPTS_ROOT);
88
+ if (!fs.existsSync(directory)) return [];
89
+ return fs.readdirSync(directory).filter((name) => name.endsWith(".json")).sort()
90
+ .map((name) => path.join(directory, name));
91
+ }
92
+
93
+ function replay(root, action, input, subject = null) {
94
+ if (!input.idempotency_key) return null;
95
+ const legacyRequestChecksum = checksum({ action, input });
96
+ const governedRequestChecksum = workflowManagerRequestChecksum(action, input, subject);
97
+ for (const file of receiptFiles(root)) {
98
+ try {
99
+ const receipt = JSON.parse(fs.readFileSync(file, "utf8"));
100
+ if (receipt.action !== action || receipt.idempotency_key !== input.idempotency_key) continue;
101
+ const legacy = receipt.request_checksum === legacyRequestChecksum;
102
+ const governed = receipt.request_checksum === governedRequestChecksum
103
+ && (receipt.subject ?? null) === subject;
104
+ if (!legacy && !governed) {
105
+ throw new Error("Idempotency key was already used for a different request");
106
+ }
107
+ return receipt;
108
+ } catch (error) {
109
+ if (/Idempotency key/.test(error.message)) throw error;
110
+ }
111
+ }
112
+ return null;
113
+ }
114
+
115
+ function record(root, action, input, detail = {}) {
116
+ const timestamp = new Date().toISOString();
117
+ const receipt = {
118
+ schema_version: 1,
119
+ receipt_id: `WMG-${crypto.randomUUID()}`,
120
+ action,
121
+ actor: input.actor,
122
+ idempotency_key: input.idempotency_key || null,
123
+ request_checksum: checksum({ action, input }),
124
+ applied_at: timestamp,
125
+ ...detail,
126
+ };
127
+ receipt.receipt_checksum = checksum(receipt);
128
+ atomicWrite(contained(root, `${RECEIPTS_ROOT}/${receipt.receipt_id}.json`), `${JSON.stringify(receipt, null, 2)}\n`);
129
+ const event = {
130
+ schema_version: 1,
131
+ event_id: `WME-${crypto.randomUUID()}`,
132
+ type: `workflow-manager.${action}`,
133
+ occurred_at: timestamp,
134
+ receipt_id: receipt.receipt_id,
135
+ subject: detail.subject || null,
136
+ };
137
+ const eventFile = contained(root, EVENTS_FILE);
138
+ fs.mkdirSync(path.dirname(eventFile), { recursive: true });
139
+ fs.appendFileSync(eventFile, `${JSON.stringify(event)}\n`, "utf8");
140
+ return { receipt, event };
141
+ }
142
+
143
+ function relationsDocument(root) {
144
+ const file = contained(root, RELATIONS_FILE);
145
+ if (!fs.existsSync(file)) return { file, document: { schema_version: 1, revision: 0, relations: [] }, checksum: null };
146
+ const bytes = fs.readFileSync(file);
147
+ const document = YAML.parse(bytes.toString("utf8")) || {};
148
+ if (!Number.isInteger(document.revision) || !Array.isArray(document.relations)) {
149
+ throw new Error("Relationship registry must contain revision and relations");
150
+ }
151
+ return { file, document, checksum: sha256(bytes) };
152
+ }
153
+
154
+ function requireRelationRevision(loaded, input) {
155
+ if (input.expected_revision !== loaded.document.revision) throw new Error("Relationship registry revision mismatch");
156
+ if ((input.expected_checksum || null) !== loaded.checksum) throw new Error("Relationship registry checksum mismatch");
157
+ }
158
+
159
+ function relationResult(root, action, input, relation, loaded, next, options = {}) {
160
+ const content = YAML.stringify(next, { lineWidth: 0 });
161
+ const currentChecksum = sha256(content);
162
+ const result = {
163
+ relation,
164
+ current_revision: next.revision,
165
+ current_checksum: currentChecksum,
166
+ };
167
+ const recorded = commitWorkflowManagerAction(root, {
168
+ action,
169
+ subject: relation.relation_id,
170
+ input,
171
+ result,
172
+ detail: {
173
+ relation_id: relation.relation_id,
174
+ relation_state: relation.relation_state,
175
+ previous_revision: loaded.document.revision,
176
+ current_revision: next.revision,
177
+ current_checksum: currentChecksum,
178
+ affected_identities: [relation.from, relation.to, relation.relation_id],
179
+ },
180
+ writes: [{ file: loaded.file, content }],
181
+ receiptPrefix: "WMG",
182
+ eventType: `workflow-manager.${action}`,
183
+ transactionHooks: options.transactionHooks,
184
+ });
185
+ return {
186
+ schema_version: WORKFLOW_MANAGER_GOVERNANCE_SCHEMA_VERSION,
187
+ outcome: recorded.outcome,
188
+ ...result,
189
+ receipt: recorded.receipt,
190
+ event: recorded.event,
191
+ };
192
+ }
193
+
194
+ export function suggestWorkflowManagerRelationship(projectRoot, input = {}, options = {}) {
195
+ const root = path.resolve(projectRoot);
196
+ requireAgent(input.actor);
197
+ if (!SAFE_ID.test(String(input.from || "")) || !SAFE_ID.test(String(input.to || "")) || input.from === input.to) {
198
+ throw new Error("Relationship requires distinct stable from/to identities");
199
+ }
200
+ if (!SAFE_ENTITY_TYPE.test(String(input.from_entity_type || ""))
201
+ || !SAFE_ENTITY_TYPE.test(String(input.to_entity_type || ""))) {
202
+ throw new Error("Relationship requires stable from/to entity types");
203
+ }
204
+ if (!RELATION_TYPES.has(input.relation_type)) throw new Error(`Unsupported relationship type: ${input.relation_type}`);
205
+ if (!String(input.rationale || "").trim()) throw new Error("Relationship suggestion rationale is required");
206
+ const existing = replay(root, "relationship-suggested", input);
207
+ if (existing) return { outcome: "idempotent-replay", receipt: existing };
208
+ const loaded = relationsDocument(root);
209
+ requireRelationRevision(loaded, input);
210
+ const timestamp = new Date().toISOString();
211
+ const relation = {
212
+ relation_id: `REL-${crypto.randomUUID()}`,
213
+ from: input.from,
214
+ from_entity_type: input.from_entity_type,
215
+ to: input.to,
216
+ to_entity_type: input.to_entity_type,
217
+ relation_type: input.relation_type,
218
+ relation_state: "suggested",
219
+ revision: 1,
220
+ suggested_by: input.actor,
221
+ rationale: String(input.rationale).trim(),
222
+ created_at: timestamp,
223
+ updated_at: timestamp,
224
+ decision: null,
225
+ };
226
+ const next = structuredClone(loaded.document);
227
+ next.revision += 1;
228
+ next.relations.push(relation);
229
+ return relationResult(root, "relationship-suggested", input, relation, loaded, next, options);
230
+ }
231
+
232
+ export function decideWorkflowManagerRelationship(projectRoot, input = {}, options = {}) {
233
+ const root = path.resolve(projectRoot);
234
+ requireHuman(input.actor);
235
+ if (!new Set(["confirmed", "rejected"]).has(input.decision)) throw new Error("Relationship decision must be confirmed or rejected");
236
+ const existing = replay(root, "relationship-decided", input);
237
+ if (existing) return { outcome: "idempotent-replay", receipt: existing };
238
+ const loaded = relationsDocument(root);
239
+ requireRelationRevision(loaded, input);
240
+ const next = structuredClone(loaded.document);
241
+ const relation = next.relations.find((item) => item.relation_id === input.relation_id);
242
+ if (!relation) throw new Error(`Relationship does not exist: ${input.relation_id}`);
243
+ if (relation.relation_state !== "suggested") throw new Error("Only a suggested relationship may be decided");
244
+ relation.relation_state = input.decision;
245
+ relation.revision = Number(relation.revision || 1) + 1;
246
+ relation.updated_at = new Date().toISOString();
247
+ relation.decision = { actor: input.actor, comment: String(input.comment || "").trim() || null, decided_at: relation.updated_at };
248
+ next.revision += 1;
249
+ return relationResult(root, "relationship-decided", input, relation, loaded, next, options);
250
+ }
251
+
252
+ export function invalidateWorkflowManagerRelationship(projectRoot, input = {}, options = {}) {
253
+ const root = path.resolve(projectRoot);
254
+ requireHuman(input.actor);
255
+ if (!String(input.rationale || "").trim()) throw new Error("Relationship invalidation rationale is required");
256
+ const existing = replay(root, "relationship-invalidated", input);
257
+ if (existing) return { outcome: "idempotent-replay", receipt: existing };
258
+ const loaded = relationsDocument(root);
259
+ requireRelationRevision(loaded, input);
260
+ const next = structuredClone(loaded.document);
261
+ const relation = next.relations.find((item) => item.relation_id === input.relation_id);
262
+ if (!relation) throw new Error(`Relationship does not exist: ${input.relation_id}`);
263
+ if (relation.relation_state === "invalidated") throw new Error("Relationship is already invalidated");
264
+ relation.relation_state = "invalidated";
265
+ relation.revision = Number(relation.revision || 1) + 1;
266
+ relation.updated_at = new Date().toISOString();
267
+ relation.invalidation = { actor: input.actor, rationale: String(input.rationale).trim(), invalidated_at: relation.updated_at };
268
+ next.revision += 1;
269
+ return relationResult(root, "relationship-invalidated", input, relation, loaded, next, options);
270
+ }
271
+
272
+ function readSettings(root) {
273
+ const file = contained(root, SETTINGS_FILE);
274
+ if (!fs.existsSync(file)) return { file, value: { schema_version: 1, revision: 0, preferences: {} }, checksum: null };
275
+ const bytes = fs.readFileSync(file);
276
+ const value = JSON.parse(bytes.toString("utf8"));
277
+ if (!Number.isInteger(value.revision) || !value.preferences || typeof value.preferences !== "object") {
278
+ throw new Error("Workflow Manager settings are invalid");
279
+ }
280
+ return { file, value, checksum: sha256(bytes) };
281
+ }
282
+
283
+ export function inspectWorkflowManagerSettings(projectRoot) {
284
+ const root = path.resolve(projectRoot);
285
+ const loaded = readSettings(root);
286
+ return {
287
+ schema_version: "workflow-manager.settings.v1",
288
+ registration_status: fs.existsSync(loaded.file) ? "registered" : "not-registered",
289
+ revision: loaded.value.revision,
290
+ checksum: loaded.checksum,
291
+ preferences: loaded.value.preferences,
292
+ interface: {
293
+ language: "zh-CN", visual_standard: "Operational Carbon", icon_library: "Lucide",
294
+ minimum_width: 1180, mobile_supported: false,
295
+ },
296
+ security: {
297
+ bind_host: "127.0.0.1", arbitrary_shell: false, arbitrary_paths: false,
298
+ raw_yaml_editing: false, gate_bypass: false,
299
+ },
300
+ mutability: "governed",
301
+ };
302
+ }
303
+
304
+ function prepareSettingsUpdate(projectRoot, input = {}) {
305
+ const root = path.resolve(projectRoot);
306
+ requireHuman(input.actor);
307
+ const loaded = readSettings(root);
308
+ if (input.expected_revision !== loaded.value.revision) throw new Error("Workflow Manager settings revision mismatch");
309
+ if ((input.expected_checksum || null) !== loaded.checksum) throw new Error("Workflow Manager settings checksum mismatch");
310
+ const changes = input.changes;
311
+ if (!changes || typeof changes !== "object" || Array.isArray(changes)) throw new Error("Settings changes must be an object");
312
+ const allowed = new Set(["default_port", "system_health_timeout_ms"]);
313
+ for (const key of Object.keys(changes)) if (!allowed.has(key)) throw new Error(`Unsupported setting: ${key}`);
314
+ if (changes.default_port !== undefined
315
+ && (!Number.isInteger(changes.default_port) || changes.default_port < 1 || changes.default_port > 65535 || changes.default_port === 80)) {
316
+ throw new Error("default_port must be an integer from 1 to 65535 and cannot be 80");
317
+ }
318
+ if (changes.system_health_timeout_ms !== undefined
319
+ && (!Number.isInteger(changes.system_health_timeout_ms) || changes.system_health_timeout_ms < 100 || changes.system_health_timeout_ms > 60000)) {
320
+ throw new Error("system_health_timeout_ms must be an integer from 100 to 60000");
321
+ }
322
+ const next = { schema_version: 1, revision: loaded.value.revision + 1, preferences: { ...loaded.value.preferences, ...changes } };
323
+ const content = `${JSON.stringify(next, null, 2)}\n`;
324
+ const currentChecksum = sha256(content);
325
+ const plan = {
326
+ action: "settings-update",
327
+ expected_revision: loaded.value.revision,
328
+ expected_checksum: loaded.checksum,
329
+ changes: stable(changes),
330
+ current_revision: next.revision,
331
+ current_checksum: currentChecksum,
332
+ affected_identities: ["workflow-manager-settings"],
333
+ };
334
+ return { root, loaded, content, currentChecksum, plan, planChecksum: checksum(plan) };
335
+ }
336
+
337
+ export function planWorkflowManagerSettingsUpdate(projectRoot, input = {}) {
338
+ const prepared = prepareSettingsUpdate(projectRoot, input);
339
+ return {
340
+ schema_version: WORKFLOW_MANAGER_GOVERNANCE_SCHEMA_VERSION,
341
+ outcome: "planned",
342
+ mutability: "plan-only",
343
+ ...prepared.plan,
344
+ plan_checksum: prepared.planChecksum,
345
+ };
346
+ }
347
+
348
+ export function applyWorkflowManagerSettingsUpdate(projectRoot, input = {}, options = {}) {
349
+ const root = path.resolve(projectRoot);
350
+ requireHuman(input.actor);
351
+ const existing = replay(root, "settings-updated", input);
352
+ if (existing) return { outcome: "idempotent-replay", receipt: existing, result: existing.result };
353
+ const prepared = prepareSettingsUpdate(root, input);
354
+ if (input.expected_plan_checksum !== prepared.planChecksum) {
355
+ throw new Error("Workflow Manager settings plan checksum mismatch");
356
+ }
357
+ const result = {
358
+ current_revision: prepared.plan.current_revision,
359
+ current_checksum: prepared.currentChecksum,
360
+ plan_checksum: prepared.planChecksum,
361
+ };
362
+ const recorded = commitWorkflowManagerAction(root, {
363
+ action: "settings-updated",
364
+ subject: "workflow-manager-settings",
365
+ input,
366
+ result,
367
+ detail: {
368
+ previous_revision: prepared.loaded.value.revision,
369
+ current_revision: prepared.plan.current_revision,
370
+ current_checksum: prepared.currentChecksum,
371
+ plan_checksum: prepared.planChecksum,
372
+ affected_identities: ["workflow-manager-settings"],
373
+ },
374
+ writes: [{ file: prepared.loaded.file, content: prepared.content }],
375
+ receiptPrefix: "WMG",
376
+ eventType: "workflow-manager.settings-updated",
377
+ transactionHooks: options.transactionHooks,
378
+ });
379
+ return {
380
+ outcome: recorded.outcome,
381
+ ...result,
382
+ receipt: recorded.receipt,
383
+ event: recorded.event,
384
+ };
385
+ }
386
+
387
+ export function applyWorkflowManagerGateDecision(projectRoot, input = {}, options = {}) {
388
+ const root = path.resolve(projectRoot);
389
+ requireHuman(input.actor);
390
+ if (/^UX-(LF|VS|UI)$/.test(String(input.gate_id || ""))) {
391
+ throw new Error("UX decisions are completed in P11/P12 through Prototype review");
392
+ }
393
+ if (!new Set(["approved", "rejected"]).has(input.decision)) throw new Error("P06 decision must be approved or rejected");
394
+ if (!Number.isInteger(input.expected_scope_revision) || input.expected_scope_revision < 0) {
395
+ throw new Error("Gate decision requires expected_scope_revision");
396
+ }
397
+ const existing = replay(root, "gate-decision-applied", input, input.gate_id);
398
+ if (existing) return { outcome: "idempotent-replay", receipt: existing };
399
+ const comment = String(input.comment || "").trim() || null;
400
+ const args = [
401
+ "gate", "decide", "--project", root,
402
+ "--expected-scope-revision", String(input.expected_scope_revision),
403
+ "--gate-id", String(input.gate_id || ""),
404
+ "--decision", input.decision,
405
+ "--actor", input.actor,
406
+ "--rationale", comment || `Workflow Manager ${input.decision} decision for ${input.gate_id}.`,
407
+ ];
408
+ for (const evidence of input.evidence || []) args.push("--evidence", evidence);
409
+ const transaction = prepareWorkflowManagerFormalTransaction(root, {
410
+ action: "gate-decision-applied",
411
+ subject: input.gate_id,
412
+ input,
413
+ resultFactory: ({ mutations }) => {
414
+ const state = mutations.find((mutation) => mutation.stream === "workflow-state")?.value;
415
+ const scopes = [state?.development_state, state?.release_state].filter(Boolean);
416
+ const gate = scopes.flatMap((scope) => scope.gate_decisions || [])
417
+ .findLast((item) => item.gate_id === input.gate_id && item.decision === input.decision);
418
+ if (!gate) throw new Error("Formal state transaction did not record the expected Gate decision");
419
+ const scope = scopes.find((item) => (item.gate_decisions || []).includes(gate));
420
+ return { gate, scope_revision: scope?.revision ?? null, comment };
421
+ },
422
+ detailFactory: (_formalContext, result) => ({
423
+ gate_id: input.gate_id,
424
+ decision: input.decision,
425
+ comment,
426
+ expected_scope_revision: input.expected_scope_revision,
427
+ current_scope_revision: result.scope_revision,
428
+ affected_identities: [input.gate_id],
429
+ delegated_writer: "delivery-state.gate-decide",
430
+ }),
431
+ receiptPrefix: "WMG",
432
+ });
433
+ const formal = executeDeliveryStateCommand(args, {
434
+ yaml: { parse: YAML.parse, stringify: (value) => YAML.stringify(value, { lineWidth: 0 }) },
435
+ ...(options.stateOptions || {}),
436
+ managerTransactionWriteFactory: transaction.factory,
437
+ });
438
+ const recorded = transaction.result();
439
+ return {
440
+ schema_version: WORKFLOW_MANAGER_GOVERNANCE_SCHEMA_VERSION,
441
+ outcome: recorded.outcome,
442
+ formal,
443
+ receipt: recorded.receipt,
444
+ event: recorded.event,
445
+ };
446
+ }
447
+
448
+ export function applyWorkflowManagerTransition(projectRoot, input = {}, options = {}) {
449
+ const root = path.resolve(projectRoot);
450
+ requireHuman(input.actor);
451
+ if (!new Set(["node-started", "node-completed"]).has(input.event)) {
452
+ throw new Error("Workflow Manager transition event must be node-started or node-completed");
453
+ }
454
+ if (!DEVELOPMENT_NODES.has(input.node_id)) {
455
+ throw new Error("Workflow Manager transitions are limited to the formal seven-node development workflow");
456
+ }
457
+ if (!SAFE_ID.test(String(input.iteration_id || ""))) throw new Error("Workflow transition requires iteration_id");
458
+ if (!Number.isInteger(input.expected_scope_revision) || input.expected_scope_revision < 0) {
459
+ throw new Error("Workflow transition requires expected_scope_revision");
460
+ }
461
+ if (!Array.isArray(input.evidence)) throw new Error("Workflow transition evidence must be an array");
462
+ const existing = replay(root, "workflow-transition-applied", input, input.node_id);
463
+ if (existing) return { outcome: "idempotent-replay", receipt: existing };
464
+ const args = [
465
+ "transition", "--project", root,
466
+ "--expected-scope-revision", String(input.expected_scope_revision),
467
+ "--event", input.event,
468
+ "--iteration-id", input.iteration_id,
469
+ "--node", input.node_id,
470
+ ];
471
+ for (const evidence of input.evidence) args.push("--evidence", String(evidence));
472
+ const transaction = prepareWorkflowManagerFormalTransaction(root, {
473
+ action: "workflow-transition-applied",
474
+ subject: input.node_id,
475
+ input,
476
+ resultFactory: ({ mutations }) => {
477
+ const state = mutations.find((mutation) => mutation.stream === "workflow-state")?.value;
478
+ const scope = state?.development_state;
479
+ if (!scope || scope.revision !== input.expected_scope_revision + 1) {
480
+ throw new Error("Formal state transaction did not record the expected workflow transition");
481
+ }
482
+ const completion = (scope.node_completion_receipts || [])
483
+ .findLast((item) => item.node === input.node_id);
484
+ return {
485
+ node_id: input.node_id,
486
+ transition_event: input.event,
487
+ iteration_id: input.iteration_id,
488
+ scope_revision: scope.revision,
489
+ completion_receipt_id: completion?.receipt_id || null,
490
+ };
491
+ },
492
+ detailFactory: (_formalContext, result) => ({
493
+ ...result,
494
+ expected_scope_revision: input.expected_scope_revision,
495
+ current_scope_revision: result.scope_revision,
496
+ affected_identities: [input.node_id],
497
+ delegated_writer: "delivery-state.transition",
498
+ }),
499
+ receiptPrefix: "WMG",
500
+ });
501
+ const formal = executeDeliveryStateCommand(args, {
502
+ yaml: { parse: YAML.parse, stringify: (value) => YAML.stringify(value, { lineWidth: 0 }) },
503
+ ...(options.stateOptions || {}),
504
+ managerTransactionWriteFactory: transaction.factory,
505
+ });
506
+ const recorded = transaction.result();
507
+ return {
508
+ schema_version: WORKFLOW_MANAGER_GOVERNANCE_SCHEMA_VERSION,
509
+ outcome: recorded.outcome,
510
+ formal,
511
+ receipt: recorded.receipt,
512
+ event: recorded.event,
513
+ };
514
+ }