ai-delivery-workflow 0.2.2 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (361) hide show
  1. package/README.md +45 -14
  2. package/bin/ai-delivery.mjs +181 -6
  3. package/bin/benchmark-autonomy.mjs +217 -0
  4. package/bin/release-check.mjs +382 -0
  5. package/docs/CLI-PARAMETER-REFERENCE.zh-CN.md +346 -0
  6. package/docs/CODEGRAPH-INTEGRATION.zh-CN.md +89 -0
  7. package/docs/DUAL-REPOSITORY-WORKSPACE.zh-CN.md +2 -2
  8. package/docs/EVOLUTION-MAINTENANCE.zh-CN.md +7 -7
  9. package/docs/EVOLUTION-USER-GUIDE.zh-CN.md +2 -2
  10. package/docs/FILE-REFERENCE.zh-CN.md +120 -39
  11. package/docs/MAINTENANCE-VERIFICATION.zh-CN.md +51 -0
  12. package/docs/MOCK-SYSTEM.zh-CN.md +141 -0
  13. package/docs/NPM-RELEASE-MANAGEMENT.zh-CN.md +106 -0
  14. package/docs/PROJECT-MANUAL.zh-CN.md +154 -95
  15. package/docs/PROTOTYPE-MIGRATION.zh-CN.md +164 -0
  16. package/docs/STATE-CLI-MAINTENANCE.zh-CN.md +35 -17
  17. package/docs/STATE-CLI-USER-GUIDE.zh-CN.md +115 -39
  18. package/docs/VIEWER-MAINTENANCE.zh-CN.md +101 -324
  19. package/docs/VIEWER-USER-GUIDE.zh-CN.md +68 -190
  20. package/docs/adr/0001-prototype-first-ui-governance.md +3 -0
  21. package/docs/adr/0002-microcks-as-default-mock-system.md +3 -0
  22. package/docs/adr/0003-workflow-manager-governed-control-surface.md +46 -0
  23. package/docs/adr/0004-operational-carbon-visual-standard.md +9 -0
  24. package/docs/adr/0005-prototype-management-as-routed-pages.md +7 -0
  25. package/docs/agents/domain.md +12 -0
  26. package/docs/agents/issue-tracker.md +27 -0
  27. package/docs/agents/triage-labels.md +11 -0
  28. package/docs/agents/workflow-manager-acceptance-matrix.md +93 -0
  29. package/docs/agents/workflow-manager-agent-interface.md +145 -0
  30. package/docs/agents/workflow-manager-current-state.md +205 -0
  31. package/lib/artifact-files.mjs +47 -0
  32. package/lib/codegraph.mjs +405 -0
  33. package/lib/delivery-state.mjs +3079 -198
  34. package/lib/frontend-guard.mjs +288 -0
  35. package/lib/fs-utils.mjs +53 -0
  36. package/lib/history-anchor.mjs +98 -0
  37. package/lib/mock-scenario-pack.mjs +687 -0
  38. package/lib/mock-system.mjs +897 -0
  39. package/lib/npm-package-result.mjs +11 -0
  40. package/lib/png-evidence.mjs +149 -0
  41. package/lib/project-bootstrap.mjs +96 -55
  42. package/lib/project-installer.mjs +1484 -164
  43. package/lib/project-migration.mjs +1193 -0
  44. package/lib/prototype-migration.mjs +713 -0
  45. package/lib/prototype-page-review.mjs +384 -0
  46. package/lib/prototype-review-target.mjs +334 -0
  47. package/lib/prototype-revision.mjs +812 -0
  48. package/lib/stable-value.mjs +15 -0
  49. package/lib/toml-hooks.mjs +69 -0
  50. package/lib/ui-acceptance.mjs +565 -0
  51. package/lib/visual-standard.mjs +232 -0
  52. package/lib/workflow-manager-contracts.mjs +367 -0
  53. package/lib/workflow-manager-facts.mjs +778 -0
  54. package/lib/workflow-manager-governance.mjs +514 -0
  55. package/lib/workflow-manager-mock.mjs +183 -0
  56. package/lib/workflow-manager-prototypes.mjs +1847 -0
  57. package/lib/workflow-manager-public/assets/ibm-plex-mono-latin-400-normal-CvHOgSBP.woff +0 -0
  58. package/lib/workflow-manager-public/assets/ibm-plex-mono-latin-400-normal-DMJ8VG8y.woff2 +0 -0
  59. package/lib/workflow-manager-public/assets/ibm-plex-sans-latin-400-normal-CDDApCn2.woff2 +0 -0
  60. package/lib/workflow-manager-public/assets/ibm-plex-sans-latin-400-normal-CYLoc0-x.woff +0 -0
  61. package/lib/workflow-manager-public/assets/ibm-plex-sans-latin-500-normal-6ng42L7E.woff2 +0 -0
  62. package/lib/workflow-manager-public/assets/ibm-plex-sans-latin-500-normal-BgVn5rGT.woff +0 -0
  63. package/lib/workflow-manager-public/assets/ibm-plex-sans-latin-600-normal-Cu4Hd6ag.woff +0 -0
  64. package/lib/workflow-manager-public/assets/ibm-plex-sans-latin-600-normal-CuJfVYMP.woff2 +0 -0
  65. package/lib/workflow-manager-public/assets/index-Chlg6r8f.css +1 -0
  66. package/lib/workflow-manager-public/assets/index-E-hGB5ZD.js +13 -0
  67. package/lib/workflow-manager-public/fonts/OFL-1.1.txt +90 -0
  68. package/lib/workflow-manager-public/index.html +14 -0
  69. package/lib/workflow-manager-systems.mjs +519 -0
  70. package/lib/workflow-manager-transaction.mjs +397 -0
  71. package/lib/workflow-manager.mjs +745 -0
  72. package/package.json +8 -2
  73. package/skills/ai-delivery-assemble-release/agents/openai.yaml +3 -3
  74. package/skills/ai-delivery-assemble-release/assets/release-material-index.csv +1 -1
  75. package/skills/ai-delivery-assemble-release/assets/version-inclusion.csv +1 -1
  76. package/skills/ai-delivery-bootstrap/SKILL.md +4 -4
  77. package/skills/ai-delivery-bootstrap/agents/openai.yaml +3 -3
  78. package/skills/ai-delivery-bootstrap/references/bootstrap-contract.md +4 -2
  79. package/skills/ai-delivery-checkpoint-task/SKILL.md +17 -3
  80. package/skills/ai-delivery-checkpoint-task/agents/openai.yaml +3 -3
  81. package/skills/ai-delivery-checkpoint-task/assets/runtime-template/task.json +7 -1
  82. package/skills/ai-delivery-checkpoint-task/references/checkpoint-contract.md +22 -8
  83. package/skills/ai-delivery-checkpoint-task/scripts/hook-event.mjs +91 -0
  84. package/skills/ai-delivery-checkpoint-task/scripts/task-state.mjs +1086 -51
  85. package/skills/ai-delivery-close-version/SKILL.md +9 -8
  86. package/skills/ai-delivery-close-version/agents/openai.yaml +3 -3
  87. package/skills/ai-delivery-close-version/assets/version-lineage.yaml +1 -1
  88. package/skills/ai-delivery-close-version/references/version-closeout-contract.md +2 -2
  89. package/skills/ai-delivery-define-product/SKILL.md +8 -4
  90. package/skills/ai-delivery-define-product/agents/openai.yaml +4 -4
  91. package/skills/ai-delivery-define-product/references/product-contract.md +2 -2
  92. package/skills/ai-delivery-deploy-production/agents/openai.yaml +3 -3
  93. package/skills/ai-delivery-design-architecture/SKILL.md +9 -5
  94. package/skills/ai-delivery-design-architecture/assets/architecture-template/prototype-architecture-validation.yaml +16 -16
  95. package/skills/ai-delivery-design-architecture/references/architecture-contract.md +1 -1
  96. package/skills/ai-delivery-design-experience/SKILL.md +36 -30
  97. package/skills/ai-delivery-design-experience/agents/openai.yaml +4 -4
  98. package/skills/ai-delivery-design-experience/assets/experience-template/LEGACY-COMPATIBILITY.md +16 -0
  99. package/skills/ai-delivery-design-experience/assets/experience-template/design-reference-selection.yaml +32 -0
  100. package/skills/ai-delivery-design-experience/assets/experience-template/experience-baseline.yaml +2 -2
  101. package/skills/ai-delivery-design-experience/assets/experience-template/formal-ui-confirmation.yaml +16 -3
  102. package/skills/ai-delivery-design-experience/assets/experience-template/frontend-change-scope.yaml +30 -0
  103. package/skills/ai-delivery-design-experience/assets/experience-template/interaction-contract.csv +1 -1
  104. package/skills/ai-delivery-design-experience/assets/experience-template/mock-admin-export.yaml +8 -0
  105. package/skills/ai-delivery-design-experience/assets/experience-template/mock-scenario-mappings.csv +1 -0
  106. package/skills/ai-delivery-design-experience/assets/experience-template/mock-scenario-pack-request.yaml +24 -0
  107. package/skills/ai-delivery-design-experience/assets/experience-template/product-prototype-reconciliation.yaml +2 -1
  108. package/skills/ai-delivery-design-experience/assets/experience-template/prototype-adjustment-log.csv +1 -1
  109. package/skills/ai-delivery-design-experience/assets/experience-template/prototype-component-bindings.csv +1 -0
  110. package/skills/ai-delivery-design-experience/assets/experience-template/prototype-component-candidates.csv +1 -0
  111. package/skills/ai-delivery-design-experience/assets/experience-template/prototype-components.csv +1 -0
  112. package/skills/ai-delivery-design-experience/assets/experience-template/prototype-confirmation.yaml +18 -18
  113. package/skills/ai-delivery-design-experience/assets/experience-template/prototype-data-contracts.csv +1 -0
  114. package/skills/ai-delivery-design-experience/assets/experience-template/prototype-impact-assessment.yaml +5 -5
  115. package/skills/ai-delivery-design-experience/assets/experience-template/prototype-implementation-bindings.csv +1 -0
  116. package/skills/ai-delivery-design-experience/assets/experience-template/prototype-manifest.yaml +2 -0
  117. package/skills/ai-delivery-design-experience/assets/experience-template/prototype-pages.csv +1 -0
  118. package/skills/ai-delivery-design-experience/assets/experience-template/prototype-product-coverage.csv +1 -1
  119. package/skills/ai-delivery-design-experience/assets/experience-template/prototype-review-comments.csv +1 -1
  120. package/skills/ai-delivery-design-experience/assets/experience-template/prototype-review-decision.yaml +13 -12
  121. package/skills/ai-delivery-design-experience/assets/experience-template/prototype-review-scenes.csv +1 -0
  122. package/skills/ai-delivery-design-experience/assets/experience-template/prototype-review-sessions.csv +1 -1
  123. package/skills/ai-delivery-design-experience/assets/experience-template/prototype-review-unit-pages.csv +1 -0
  124. package/skills/ai-delivery-design-experience/assets/experience-template/prototype-review-units.csv +1 -0
  125. package/skills/ai-delivery-design-experience/assets/experience-template/prototype-revision.yaml +88 -0
  126. package/skills/ai-delivery-design-experience/assets/experience-template/prototype-routes.csv +1 -0
  127. package/skills/ai-delivery-design-experience/assets/experience-template/prototype-set.yaml +2 -0
  128. package/skills/ai-delivery-design-experience/assets/experience-template/prototype-source-inspection-snapshots.csv +1 -0
  129. package/skills/ai-delivery-design-experience/assets/experience-template/prototype-terminals.csv +1 -0
  130. package/skills/ai-delivery-design-experience/assets/experience-template/prototype-tool-candidates.csv +1 -1
  131. package/skills/ai-delivery-design-experience/assets/experience-template/prototype-tool-selection.yaml +2 -3
  132. package/skills/ai-delivery-design-experience/assets/experience-template/prototype-traceability.csv +1 -1
  133. package/skills/ai-delivery-design-experience/assets/experience-template/prototype-trigger-conditions.csv +1 -0
  134. package/skills/ai-delivery-design-experience/assets/experience-template/prototype.yaml +6 -0
  135. package/skills/ai-delivery-design-experience/assets/experience-template/ui-framework-selection.yaml +17 -1
  136. package/skills/ai-delivery-design-experience/assets/experience-template/ui-handoff.yaml +6 -5
  137. package/skills/ai-delivery-design-experience/assets/experience-template/ui-mapping.csv +1 -0
  138. package/skills/ai-delivery-design-experience/assets/experience-template/visual-direction.yaml +4 -0
  139. package/skills/ai-delivery-design-experience/assets/experience-template/visual-reference-manifest.yaml +23 -0
  140. package/skills/ai-delivery-design-experience/assets/experience-template/visual-reference.html +163 -0
  141. package/skills/ai-delivery-design-experience/assets/experience-template/visual-system-confirmation.yaml +11 -0
  142. package/skills/ai-delivery-design-experience/references/experience-contract.md +26 -27
  143. package/skills/ai-delivery-design-experience/references/prototype-management-contract.md +42 -21
  144. package/skills/ai-delivery-design-tests/SKILL.md +13 -7
  145. package/skills/ai-delivery-design-tests/assets/test-design-template/prototype-test-scope.csv +1 -1
  146. package/skills/ai-delivery-design-tests/assets/test-design-template/prototype-test-validation.yaml +17 -16
  147. package/skills/ai-delivery-design-tests/references/test-design-contract.md +7 -5
  148. package/skills/ai-delivery-develop-iteration/SKILL.md +18 -11
  149. package/skills/ai-delivery-develop-iteration/agents/openai.yaml +3 -3
  150. package/skills/ai-delivery-develop-iteration/assets/development-template/candidate-manifest.yaml +36 -0
  151. package/skills/ai-delivery-develop-iteration/assets/development-template/task-prototype-traceability.csv +1 -1
  152. package/skills/ai-delivery-develop-iteration/references/development-contract.md +5 -3
  153. package/skills/ai-delivery-evolve-workflow/agents/openai.yaml +3 -3
  154. package/skills/ai-delivery-execute-test/SKILL.md +6 -2
  155. package/skills/ai-delivery-execute-test/agents/openai.yaml +4 -4
  156. package/skills/ai-delivery-execute-work-package/SKILL.md +10 -3
  157. package/skills/ai-delivery-execute-work-package/agents/openai.yaml +4 -4
  158. package/skills/ai-delivery-execute-work-package/references/work-package-contract.md +1 -1
  159. package/skills/ai-delivery-manage-git/agents/openai.yaml +3 -3
  160. package/skills/ai-delivery-manage-standards/agents/openai.yaml +4 -4
  161. package/skills/ai-delivery-orchestrate/SKILL.md +47 -29
  162. package/skills/ai-delivery-orchestrate/agents/openai.yaml +3 -3
  163. package/skills/ai-delivery-orchestrate/assets/project-template/.workflow/control/migrations/.gitkeep +0 -0
  164. package/skills/ai-delivery-orchestrate/assets/project-template/.workflow/control/repairs/.gitkeep +0 -0
  165. package/skills/ai-delivery-orchestrate/assets/project-template/.workflow/delivery/project.yaml +1 -0
  166. package/skills/ai-delivery-orchestrate/assets/project-template/.workflow/delivery/workflow-state.yaml +2 -0
  167. package/skills/ai-delivery-orchestrate/assets/project-template/.workflow/tools/frontend-guard/frontend-guard.mjs +50 -0
  168. package/skills/ai-delivery-orchestrate/assets/project-template/.workflow/tools/hooks/hook-event.mjs +91 -0
  169. package/skills/ai-delivery-orchestrate/assets/project-template/.workflow/tools/manager/manager.mjs +64 -0
  170. package/skills/ai-delivery-orchestrate/assets/project-template/.workflow/tools/manager/start.cmd +4 -0
  171. package/skills/ai-delivery-orchestrate/assets/project-template/.workflow/tools/manager/start.ps1 +2 -0
  172. package/skills/ai-delivery-orchestrate/assets/project-template/.workflow/tools/{viewer → manager}/start.sh +1 -1
  173. package/skills/ai-delivery-orchestrate/assets/project-template/.workflow/tools/mock/mock.mjs +50 -0
  174. package/skills/ai-delivery-orchestrate/assets/project-template/.workflow/tools/ui-acceptance/ui-acceptance.mjs +37 -0
  175. package/skills/ai-delivery-orchestrate/assets/project-template/AGENTS.md +32 -6
  176. package/skills/ai-delivery-orchestrate/assets/project-template/gitignore.template +1 -0
  177. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/CONTRIBUTING.md +25 -0
  178. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/LICENSE +21 -0
  179. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/README.md +250 -0
  180. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/UPSTREAM.yaml +19 -0
  181. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/airbnb/DESIGN.md +545 -0
  182. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/airbnb/README.md +5 -0
  183. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/airtable/DESIGN.md +554 -0
  184. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/airtable/README.md +5 -0
  185. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/apple/DESIGN.md +562 -0
  186. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/apple/README.md +5 -0
  187. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/binance/DESIGN.md +634 -0
  188. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/binance/README.md +5 -0
  189. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/bmw/DESIGN.md +544 -0
  190. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/bmw/README.md +5 -0
  191. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/bmw-m/DESIGN.md +503 -0
  192. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/bmw-m/README.md +5 -0
  193. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/bugatti/DESIGN.md +454 -0
  194. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/bugatti/README.md +5 -0
  195. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/cal/DESIGN.md +542 -0
  196. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/cal/README.md +5 -0
  197. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/claude/DESIGN.md +589 -0
  198. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/claude/README.md +5 -0
  199. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/clay/DESIGN.md +541 -0
  200. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/clay/README.md +5 -0
  201. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/clickhouse/DESIGN.md +544 -0
  202. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/clickhouse/README.md +5 -0
  203. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/cohere/DESIGN.md +451 -0
  204. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/cohere/README.md +5 -0
  205. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/coinbase/DESIGN.md +570 -0
  206. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/coinbase/README.md +5 -0
  207. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/composio/DESIGN.md +506 -0
  208. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/composio/README.md +5 -0
  209. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/cursor/DESIGN.md +537 -0
  210. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/cursor/README.md +5 -0
  211. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/dell-1996/DESIGN.md +632 -0
  212. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/dell-1996/README.md +5 -0
  213. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/elevenlabs/DESIGN.md +504 -0
  214. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/elevenlabs/README.md +5 -0
  215. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/expo/DESIGN.md +526 -0
  216. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/expo/README.md +5 -0
  217. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/ferrari/DESIGN.md +531 -0
  218. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/ferrari/README.md +5 -0
  219. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/figma/DESIGN.md +578 -0
  220. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/figma/README.md +5 -0
  221. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/framer/DESIGN.md +544 -0
  222. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/framer/README.md +5 -0
  223. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/hashicorp/DESIGN.md +575 -0
  224. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/hashicorp/README.md +5 -0
  225. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/hp/DESIGN.md +670 -0
  226. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/hp/README.md +5 -0
  227. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/ibm/DESIGN.md +550 -0
  228. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/ibm/README.md +5 -0
  229. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/intercom/DESIGN.md +546 -0
  230. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/intercom/README.md +5 -0
  231. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/kraken/DESIGN.md +125 -0
  232. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/kraken/README.md +5 -0
  233. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/lamborghini/DESIGN.md +288 -0
  234. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/lamborghini/README.md +5 -0
  235. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/linear.app/DESIGN.md +548 -0
  236. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/linear.app/README.md +5 -0
  237. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/lovable/DESIGN.md +298 -0
  238. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/lovable/README.md +5 -0
  239. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/mastercard/DESIGN.md +365 -0
  240. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/mastercard/README.md +5 -0
  241. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/meta/DESIGN.md +683 -0
  242. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/meta/README.md +5 -0
  243. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/minimax/DESIGN.md +746 -0
  244. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/minimax/README.md +5 -0
  245. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/mintlify/DESIGN.md +852 -0
  246. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/mintlify/README.md +5 -0
  247. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/miro/DESIGN.md +825 -0
  248. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/miro/README.md +5 -0
  249. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/mistral.ai/DESIGN.md +773 -0
  250. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/mistral.ai/README.md +5 -0
  251. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/mongodb/DESIGN.md +767 -0
  252. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/mongodb/README.md +5 -0
  253. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/nike/DESIGN.md +575 -0
  254. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/nike/README.md +5 -0
  255. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/nintendo-2001/DESIGN.md +649 -0
  256. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/nintendo-2001/README.md +5 -0
  257. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/notion/DESIGN.md +821 -0
  258. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/notion/README.md +5 -0
  259. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/nvidia/DESIGN.md +640 -0
  260. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/nvidia/README.md +5 -0
  261. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/ollama/DESIGN.md +539 -0
  262. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/ollama/README.md +5 -0
  263. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/opencode.ai/DESIGN.md +521 -0
  264. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/opencode.ai/README.md +5 -0
  265. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/pinterest/DESIGN.md +597 -0
  266. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/pinterest/README.md +5 -0
  267. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/playstation/DESIGN.md +661 -0
  268. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/playstation/README.md +5 -0
  269. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/posthog/DESIGN.md +690 -0
  270. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/posthog/README.md +5 -0
  271. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/raycast/DESIGN.md +669 -0
  272. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/raycast/README.md +5 -0
  273. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/renault/DESIGN.md +589 -0
  274. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/renault/README.md +5 -0
  275. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/replicate/DESIGN.md +616 -0
  276. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/replicate/README.md +5 -0
  277. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/resend/DESIGN.md +585 -0
  278. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/resend/README.md +5 -0
  279. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/revolut/DESIGN.md +636 -0
  280. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/revolut/README.md +5 -0
  281. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/runwayml/DESIGN.md +244 -0
  282. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/runwayml/README.md +5 -0
  283. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/sanity/DESIGN.md +357 -0
  284. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/sanity/README.md +5 -0
  285. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/sentry/DESIGN.md +551 -0
  286. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/sentry/README.md +5 -0
  287. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/shopify/DESIGN.md +516 -0
  288. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/shopify/README.md +5 -0
  289. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/slack/DESIGN.md +482 -0
  290. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/spacex/DESIGN.md +363 -0
  291. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/spacex/README.md +5 -0
  292. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/spotify/DESIGN.md +246 -0
  293. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/spotify/README.md +5 -0
  294. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/starbucks/DESIGN.md +580 -0
  295. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/starbucks/README.md +5 -0
  296. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/stripe/DESIGN.md +487 -0
  297. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/stripe/README.md +5 -0
  298. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/supabase/DESIGN.md +462 -0
  299. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/supabase/README.md +5 -0
  300. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/superhuman/DESIGN.md +448 -0
  301. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/superhuman/README.md +5 -0
  302. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/tesla/DESIGN.md +286 -0
  303. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/tesla/README.md +5 -0
  304. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/theverge/DESIGN.md +339 -0
  305. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/theverge/README.md +5 -0
  306. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/together.ai/DESIGN.md +633 -0
  307. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/together.ai/README.md +5 -0
  308. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/uber/DESIGN.md +636 -0
  309. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/uber/README.md +5 -0
  310. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/vercel/DESIGN.md +736 -0
  311. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/vercel/README.md +5 -0
  312. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/vodafone/DESIGN.md +538 -0
  313. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/vodafone/README.md +5 -0
  314. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/voltagent/DESIGN.md +521 -0
  315. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/voltagent/README.md +5 -0
  316. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/warp/DESIGN.md +526 -0
  317. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/warp/README.md +5 -0
  318. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/webflow/DESIGN.md +588 -0
  319. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/webflow/README.md +5 -0
  320. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/wired/DESIGN.md +497 -0
  321. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/wired/README.md +5 -0
  322. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/wise/DESIGN.md +544 -0
  323. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/wise/README.md +5 -0
  324. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/x.ai/DESIGN.md +465 -0
  325. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/x.ai/README.md +5 -0
  326. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/zapier/DESIGN.md +537 -0
  327. package/skills/ai-delivery-orchestrate/assets/project-template/ref/ui/design-md/zapier/README.md +5 -0
  328. package/skills/ai-delivery-orchestrate/references/formal-state-contract.md +65 -20
  329. package/skills/ai-delivery-orchestrate/references/workflow-model.md +7 -5
  330. package/skills/ai-delivery-orchestrate-release/SKILL.md +2 -2
  331. package/skills/ai-delivery-orchestrate-release/agents/openai.yaml +4 -4
  332. package/skills/ai-delivery-orchestrate-release/references/release-workflow-contract.md +1 -1
  333. package/skills/ai-delivery-plan-iteration/SKILL.md +11 -4
  334. package/skills/ai-delivery-plan-iteration/agents/openai.yaml +4 -4
  335. package/skills/ai-delivery-plan-iteration/assets/planning-template/scope-manifest.yaml +17 -0
  336. package/skills/ai-delivery-plan-iteration/assets/planning-template/slice-prototype-traceability.csv +1 -1
  337. package/skills/ai-delivery-plan-iteration/references/planning-contract.md +8 -2
  338. package/skills/ai-delivery-prepare-platform/SKILL.md +5 -1
  339. package/skills/ai-delivery-prepare-platform/agents/openai.yaml +4 -4
  340. package/skills/ai-delivery-prepare-release/agents/openai.yaml +4 -4
  341. package/skills/ai-delivery-review-change/SKILL.md +14 -4
  342. package/skills/ai-delivery-review-change/agents/openai.yaml +4 -4
  343. package/skills/ai-delivery-review-change/references/review-contract.md +6 -0
  344. package/skills/ai-delivery-triage-failure/SKILL.md +5 -1
  345. package/skills/ai-delivery-triage-failure/agents/openai.yaml +4 -4
  346. package/skills/ai-delivery-validate-artifacts/SKILL.md +6 -3
  347. package/skills/ai-delivery-validate-artifacts/agents/openai.yaml +4 -4
  348. package/skills/ai-delivery-validate-artifacts/references/artifact-contract.md +13 -13
  349. package/skills/ai-delivery-verify-candidate/SKILL.md +13 -6
  350. package/skills/ai-delivery-verify-candidate/agents/openai.yaml +3 -3
  351. package/skills/ai-delivery-verify-candidate/assets/verification-template/ui-acceptance-request.yaml +19 -0
  352. package/skills/ai-delivery-verify-candidate/assets/verification-template/ui-acceptance-results.yaml +53 -0
  353. package/skills/ai-delivery-verify-candidate/references/candidate-verification-contract.md +10 -2
  354. package/skills/ai-delivery-verify-production/agents/openai.yaml +3 -3
  355. package/skills/ai-delivery-design-experience/assets/experience-template/low-fidelity-confirmation.yaml +0 -32
  356. package/skills/ai-delivery-orchestrate/assets/project-template/.workflow/tools/viewer/public/app.js +0 -546
  357. package/skills/ai-delivery-orchestrate/assets/project-template/.workflow/tools/viewer/public/index.html +0 -199
  358. package/skills/ai-delivery-orchestrate/assets/project-template/.workflow/tools/viewer/public/styles.css +0 -529
  359. package/skills/ai-delivery-orchestrate/assets/project-template/.workflow/tools/viewer/server.mjs +0 -780
  360. package/skills/ai-delivery-orchestrate/assets/project-template/.workflow/tools/viewer/start.cmd +0 -4
  361. package/skills/ai-delivery-orchestrate/assets/project-template/.workflow/tools/viewer/start.ps1 +0 -2
@@ -0,0 +1,232 @@
1
+ import fs from "node:fs";
2
+ import crypto from "node:crypto";
3
+ import path from "node:path";
4
+ import { parse as parseYaml } from "./yaml-runtime.mjs";
5
+
6
+ function containedPath(root, relative, label) {
7
+ if (!relative || path.isAbsolute(relative)) throw new Error(`${label} must be a project-relative path.`);
8
+ const resolvedRoot = path.resolve(root);
9
+ const resolved = path.resolve(resolvedRoot, relative);
10
+ const relation = path.relative(resolvedRoot, resolved);
11
+ if (relation === ".." || relation.startsWith(`..${path.sep}`)) {
12
+ throw new Error(`${label} resolves outside the project.`);
13
+ }
14
+ return resolved;
15
+ }
16
+
17
+ function readYaml(file, label) {
18
+ if (!fs.existsSync(file)) throw new Error(`${label} is missing: ${file}`);
19
+ const value = parseYaml(fs.readFileSync(file, "utf8"));
20
+ if (!value || typeof value !== "object" || Array.isArray(value)) {
21
+ throw new Error(`${label} must contain a YAML mapping.`);
22
+ }
23
+ return value;
24
+ }
25
+
26
+ function sha256(file) {
27
+ return crypto.createHash("sha256").update(fs.readFileSync(file)).digest("hex");
28
+ }
29
+
30
+ function requireChecksum(value, label) {
31
+ const checksum = String(value || "");
32
+ if (!/^[a-f0-9]{64}$/.test(checksum)) throw new Error(`${label} checksum is missing or invalid.`);
33
+ return checksum;
34
+ }
35
+
36
+ function addRequiredInput(required, scope, ref, checksum, label) {
37
+ if (!ref || typeof ref !== "string") throw new Error(`${label} reference is missing.`);
38
+ const identity = `${scope}:${ref}`;
39
+ const expected = requireChecksum(checksum, label);
40
+ if (required.has(identity) && required.get(identity).checksum !== expected) {
41
+ throw new Error(`${label} has conflicting checksums for ${ref}.`);
42
+ }
43
+ required.set(identity, { scope, ref, checksum: expected });
44
+ }
45
+
46
+ function requiredVisualStandardInputs(projectRoot, experienceRoot, confirmation) {
47
+ const required = new Map();
48
+ const direct = [
49
+ ["visual_direction", "Visual direction"],
50
+ ["design_reference_selection", "Design reference selection"],
51
+ ["visual_reference_manifest", "Visual Reference manifest"],
52
+ ["visual_reference", "Visual Reference"],
53
+ ["design_tokens", "Design tokens"],
54
+ ["ui_framework_selection", "UI framework selection"],
55
+ ["component_state_matrix", "Component state matrix"],
56
+ ];
57
+ for (const [prefix, label] of direct) {
58
+ addRequiredInput(
59
+ required,
60
+ "experience",
61
+ confirmation[`${prefix}_ref`],
62
+ confirmation[`${prefix}_checksum`],
63
+ label,
64
+ );
65
+ }
66
+
67
+ const selection = readYaml(
68
+ containedPath(experienceRoot, confirmation.design_reference_selection_ref, "Design reference selection"),
69
+ "Design reference selection",
70
+ );
71
+ if (selection.decision !== "selected" || !String(selection.rationale || "").trim()) {
72
+ throw new Error("Design reference selection must be selected and include a rationale.");
73
+ }
74
+ for (const [prefix, label] of [
75
+ ["catalog", "Design Reference Library catalog"],
76
+ ["license", "Design Reference Library license"],
77
+ ["upstream", "Design Reference Library upstream attribution"],
78
+ ]) {
79
+ addRequiredInput(required, "project", selection[`${prefix}_ref`], selection[`${prefix}_checksum`], label);
80
+ }
81
+ if (!/^[a-f0-9]{40}$/.test(String(selection.upstream_version || ""))) {
82
+ throw new Error("Design reference selection must pin the upstream version commit.");
83
+ }
84
+ const upstream = readYaml(
85
+ containedPath(projectRoot, selection.upstream_ref, "Design Reference Library upstream attribution"),
86
+ "Design Reference Library upstream attribution",
87
+ );
88
+ if (upstream.source_commit !== selection.upstream_version) {
89
+ throw new Error("Design reference upstream version does not match UPSTREAM.yaml.");
90
+ }
91
+ if (upstream.license !== "MIT" || upstream.license_ref !== path.basename(selection.license_ref || "")) {
92
+ throw new Error("Design Reference Library license does not match UPSTREAM.yaml attribution.");
93
+ }
94
+ const evaluated = Array.isArray(selection.evaluated_references) ? selection.evaluated_references : [];
95
+ if (evaluated.length < 2 || evaluated.length > 3) {
96
+ throw new Error("Design reference selection must evaluate exactly two or three references.");
97
+ }
98
+ const evaluatedIdentities = new Set();
99
+ for (const reference of evaluated) {
100
+ addRequiredInput(required, "project", reference?.ref, reference?.checksum, "Evaluated design reference");
101
+ evaluatedIdentities.add(reference.ref);
102
+ }
103
+ const primary = selection.primary_reference;
104
+ if (!primary || !evaluatedIdentities.has(primary.ref)) {
105
+ throw new Error("Primary design reference must be one of the evaluated references.");
106
+ }
107
+ addRequiredInput(required, "project", primary.ref, primary.checksum, "Primary design reference");
108
+ if (selection.max_supporting_references !== 1) {
109
+ throw new Error("Design reference selection must allow at most one supporting reference.");
110
+ }
111
+ const supporting = selection.supporting_reference;
112
+ if (supporting) {
113
+ if (!evaluatedIdentities.has(supporting.ref) || !String(supporting.scope || "").trim()) {
114
+ throw new Error("Supporting design reference must be evaluated and declare a narrow scope.");
115
+ }
116
+ addRequiredInput(required, "project", supporting.ref, supporting.checksum, "Supporting design reference");
117
+ }
118
+
119
+ const framework = readYaml(
120
+ containedPath(experienceRoot, confirmation.ui_framework_selection_ref, "UI framework selection"),
121
+ "UI framework selection",
122
+ );
123
+ if (![framework.selected_framework, framework.selected_version,
124
+ framework.selected_component_system, framework.selected_component_system_version,
125
+ framework.selected_icon_library, framework.selected_icon_library_version]
126
+ .every((value) => String(value || "").trim())) {
127
+ throw new Error("UI framework, component system, and icon library versions must all be pinned.");
128
+ }
129
+ if (!framework.component_registry || !framework.component_registry_version) {
130
+ throw new Error("UI framework selection must pin the component registry and version.");
131
+ }
132
+ addRequiredInput(
133
+ required,
134
+ "experience",
135
+ framework.component_configuration_ref,
136
+ framework.component_configuration_checksum,
137
+ "Component configuration",
138
+ );
139
+ if (!Array.isArray(framework.selected_components) || !framework.selected_components.length) {
140
+ throw new Error("UI framework selection must list the selected components.");
141
+ }
142
+ if (!Array.isArray(framework.local_adaptations)) {
143
+ throw new Error("UI framework selection local_adaptations must be a list.");
144
+ }
145
+ for (const adaptation of framework.local_adaptations) {
146
+ addRequiredInput(required, "experience", adaptation?.ref, adaptation?.checksum, "Local adaptation");
147
+ }
148
+ if (framework.selection_source === "workflow-default"
149
+ && framework.architecture_compatibility?.react_web === true
150
+ && (framework.selected_component_system !== "shadcn" || framework.selected_icon_library !== "lucide")) {
151
+ throw new Error("Compatible React Web defaults must select shadcn and lucide.");
152
+ }
153
+ if (confirmation.component_system !== framework.selected_component_system
154
+ || confirmation.icon_library !== framework.selected_icon_library) {
155
+ throw new Error("UX-VS component system or icon library does not match the framework selection.");
156
+ }
157
+
158
+ const manifest = readYaml(
159
+ containedPath(experienceRoot, confirmation.visual_reference_manifest_ref, "Visual Reference manifest"),
160
+ "Visual Reference manifest",
161
+ );
162
+ for (const [refField, checksumField, label] of [
163
+ ["entrypoint", "entrypoint_checksum", "Visual Reference entrypoint"],
164
+ ["design_reference_selection_ref", "design_reference_selection_checksum", "Manifest design reference selection"],
165
+ ["design_tokens_ref", "design_tokens_checksum", "Manifest design tokens"],
166
+ ["component_state_matrix_ref", "component_state_matrix_checksum", "Manifest component state matrix"],
167
+ ]) addRequiredInput(required, "experience", manifest[refField], manifest[checksumField], label);
168
+
169
+ return required;
170
+ }
171
+
172
+ export function validateVisualStandard(projectRoot, options = {}) {
173
+ const experienceRoot = containedPath(projectRoot, options.experience, "Experience directory");
174
+ const confirmation = readYaml(
175
+ path.join(experienceRoot, "visual-system-confirmation.yaml"),
176
+ "Visual system confirmation",
177
+ );
178
+ if (confirmation.decision !== "approved" || confirmation.human_approval?.decision !== "approved") {
179
+ throw new Error("Visual Standard requires an approved human UX-VS decision.");
180
+ }
181
+ if (!confirmation.human_approval?.approver || !confirmation.human_approval?.decided_at) {
182
+ throw new Error("Visual Standard approval must identify the human approver and decision time.");
183
+ }
184
+ const validatedAt = options.now ? Number(options.now()) : Date.now();
185
+ if (!Number.isFinite(validatedAt)) throw new Error("Visual Standard validation clock is invalid.");
186
+ const expiresAt = Date.parse(confirmation.approval_expires_at || "");
187
+ if (!Number.isFinite(expiresAt)) {
188
+ throw new Error("Visual Standard approval must declare a valid approval_expires_at time.");
189
+ }
190
+ if (validatedAt >= expiresAt) throw new Error("Visual Standard approval expired.");
191
+ const inputs = Array.isArray(confirmation.design_input_checksums)
192
+ ? confirmation.design_input_checksums
193
+ : [];
194
+ if (!inputs.length) throw new Error("Visual Standard must bind every design input checksum.");
195
+ const requiredInputs = requiredVisualStandardInputs(projectRoot, experienceRoot, confirmation);
196
+ const seenInputs = new Set();
197
+ for (const input of inputs) {
198
+ if (!input || !new Set(["project", "experience"]).has(input.scope)) {
199
+ throw new Error("Every design input must declare project or experience scope.");
200
+ }
201
+ if (!/^[a-f0-9]{64}$/.test(String(input.checksum || ""))) {
202
+ throw new Error(`Design input checksum is invalid for ${input.ref || "unknown input"}.`);
203
+ }
204
+ const identity = `${input.scope}:${input.ref}`;
205
+ if (seenInputs.has(identity)) throw new Error(`Duplicate design input: ${identity}.`);
206
+ seenInputs.add(identity);
207
+ const inputFile = containedPath(
208
+ input.scope === "project" ? projectRoot : experienceRoot,
209
+ input.ref,
210
+ `Design input ${input.ref || "path"}`,
211
+ );
212
+ if (!fs.existsSync(inputFile) || !fs.statSync(inputFile).isFile()) {
213
+ throw new Error(`Design input is missing: ${input.ref}.`);
214
+ }
215
+ if (sha256(inputFile) !== input.checksum) {
216
+ throw new Error(`Design input checksum mismatch for ${input.ref}.`);
217
+ }
218
+ }
219
+ for (const [identity, required] of requiredInputs) {
220
+ if (!seenInputs.has(identity)) throw new Error(`Required design input is missing: ${required.ref}.`);
221
+ const declared = inputs.find((input) => `${input.scope}:${input.ref}` === identity);
222
+ if (declared.checksum !== required.checksum) {
223
+ throw new Error(`Required design input checksum conflicts with its source artifact: ${required.ref}.`);
224
+ }
225
+ }
226
+ return {
227
+ valid: true,
228
+ experience: path.relative(path.resolve(projectRoot), experienceRoot).replaceAll("\\", "/"),
229
+ design_input_count: inputs.length,
230
+ approval_expires_at: confirmation.approval_expires_at || null,
231
+ };
232
+ }
@@ -0,0 +1,367 @@
1
+ import crypto from "node:crypto";
2
+
3
+ export const WORKFLOW_MANAGER_CONTRACTS_SCHEMA_VERSION = "workflow-manager.contracts.v1";
4
+
5
+ const jsonType = (type, description) => ({ type, description });
6
+ const string = (description) => jsonType("string", description);
7
+ const nonEmptyString = (description) => ({ type: "string", minLength: 1, description });
8
+ const nullableString = (description) => ({ type: ["string", "null"], description });
9
+ const integer = (description) => jsonType("integer", description);
10
+ const array = (description) => ({ type: "array", description, items: { type: "string" } });
11
+ const object = (description) => ({ type: "object", description, additionalProperties: true });
12
+
13
+ function actionContract(action, {
14
+ required = [],
15
+ properties = {},
16
+ actor = "human-or-agent",
17
+ concurrency = "target-revision-or-checksum",
18
+ idempotency = "required",
19
+ plan = "not-required",
20
+ mutability = "governed",
21
+ }) {
22
+ return Object.freeze({
23
+ action,
24
+ contract_version: 1,
25
+ mutability,
26
+ authorization: { actor },
27
+ concurrency: { mode: concurrency },
28
+ retry: { idempotency },
29
+ planning: { mode: plan },
30
+ input_schema: {
31
+ $schema: "https://json-schema.org/draft/2020-12/schema",
32
+ $id: `urn:ai-delivery:workflow-manager:action:${action}:v1`,
33
+ type: "object",
34
+ required,
35
+ properties,
36
+ additionalProperties: false,
37
+ },
38
+ output_schema: {
39
+ $schema: "https://json-schema.org/draft/2020-12/schema",
40
+ $id: `urn:ai-delivery:workflow-manager:result:${action}:v1`,
41
+ type: "object",
42
+ required: ["outcome"],
43
+ properties: {
44
+ outcome: string("Applied, planned, not-registered, or idempotent-replay outcome."),
45
+ result: object("Action-specific structured result."),
46
+ receipt: object("Immutable Workflow Manager receipt when the action mutates state."),
47
+ event: object("Immutable Workflow Manager event when the action mutates state."),
48
+ },
49
+ additionalProperties: true,
50
+ },
51
+ });
52
+ }
53
+
54
+ const exactPrototype = {
55
+ prototype_revision_id: string("Exact Prototype Revision identity."),
56
+ prototype_revision_checksum: string("Exact Prototype Revision checksum."),
57
+ terminal_id: string("Exact registered Logical Terminal identity."),
58
+ page_id: string("Stable Prototype Page identity."),
59
+ page_checksum: string("Exact Page checksum."),
60
+ };
61
+ const exactCandidateTransition = {
62
+ revision: string("Exact frozen Prototype revision reference."),
63
+ prototype_revision_id: string("Exact frozen Prototype Revision identity."),
64
+ prototype_revision_checksum: string("Exact frozen Prototype Revision checksum."),
65
+ terminal_id: string("Exact source Logical Terminal for the Component Candidate."),
66
+ component_id: string("Stable Component Candidate identity."),
67
+ expected_lifecycle: string("Expected current Component Candidate lifecycle."),
68
+ target_lifecycle: string("Requested legal successor Component Candidate lifecycle."),
69
+ experience: string("Registered Experience root."),
70
+ };
71
+ const governed = {
72
+ actor: string("Authenticated human or agent actor identity."),
73
+ idempotency_key: string("Caller-generated retry identity."),
74
+ };
75
+ const candidateTransitionGoverned = {
76
+ ...governed,
77
+ idempotency_key: nonEmptyString("Non-empty caller-generated retry identity."),
78
+ };
79
+ const collectionConcurrency = {
80
+ expected_revision: integer("Expected collection revision."),
81
+ expected_checksum: nullableString("Expected collection checksum, or null for an unregistered collection."),
82
+ };
83
+
84
+ export const WORKFLOW_MANAGER_ACTION_CONTRACTS = Object.freeze([
85
+ actionContract("requirement-apply", {
86
+ required: ["operation", "requirement_id", "title", "summary", "status", "acceptance", "expected_revision", "expected_checksum", "actor", "idempotency_key"],
87
+ properties: {
88
+ operation: string("create or update."), requirement_id: string("Stable requirement identity."),
89
+ iteration_id: string("Required when creating."), title: string("Requirement title."),
90
+ summary: string("Requirement summary."), status: string("Requirement lifecycle state."),
91
+ acceptance: array("Acceptance statements."), expected_entity_revision: integer("Required when updating."),
92
+ ...collectionConcurrency, ...governed,
93
+ },
94
+ }),
95
+ actionContract("task-apply", {
96
+ required: ["operation", "task_id", "next_action", "expected_shared_revision", "actor", "idempotency_key"],
97
+ properties: {
98
+ operation: string("create, activate, checkpoint, or finish."), task_id: string("Stable task identity."),
99
+ iteration_id: string("Iteration identity for create."), node: string("Formal seven-node identity for create."),
100
+ skill: string("Owning installed skill for create."), goal: string("Stable logical task goal."),
101
+ responsibility: string("Task responsibility."), scope: array("Task scope identities."),
102
+ acceptance: array("Task acceptance identities."), depends_on: array("Blocking task identities."),
103
+ status: string("Writer-supported task state."), phase: string("Writer-supported attempt phase."),
104
+ next_action: string("Concrete next action."), next_action_owner: string("agent, user, or external."),
105
+ completed_steps: array("Completed step descriptions."), blockers: array("Current blockers."),
106
+ evidence: array("Evidence identities."), actual_outputs: array("Produced output paths or identities."),
107
+ sequence: integer("Optional ordering sequence."), derived_from: string("Source task identity."),
108
+ supersedes: string("Superseded task identity."), new_attempt: { type: "boolean", description: "Start a new attempt after failure." },
109
+ expected_shared_revision: integer("Expected shared task revision; zero when creating."),
110
+ ...governed,
111
+ },
112
+ concurrency: "task-state-writer-shared-revision",
113
+ }),
114
+ actionContract("test-case-apply", {
115
+ required: ["operation", "test_case_id", "title", "kind", "status", "steps", "expected_result", "expected_revision", "expected_checksum", "actor", "idempotency_key"],
116
+ properties: {
117
+ operation: string("create or update."), test_case_id: string("Stable test-case identity."),
118
+ iteration_id: string("Required when creating."), title: string("Test-case title."), kind: string("Test category."),
119
+ status: string("Test-case lifecycle state."), steps: array("Ordered test steps."),
120
+ expected_result: string("Expected observable result."), expected_entity_revision: integer("Required when updating."),
121
+ ...collectionConcurrency, ...governed,
122
+ },
123
+ }),
124
+ actionContract("test-run-record", {
125
+ required: ["test_run_id", "test_case_id", "test_case_version", "iteration_id", "candidate_id", "outcome", "evidence", "expected_revision", "expected_checksum", "actor", "idempotency_key"],
126
+ properties: {
127
+ test_run_id: string("Unique immutable test-run identity."), test_case_id: string("Bound test-case identity."),
128
+ test_case_version: integer("Exact test-case version."), iteration_id: string("Iteration identity."),
129
+ candidate_id: string("Exact candidate identity."), outcome: string("Observed test outcome."),
130
+ evidence: array("Evidence identities."), ...collectionConcurrency, ...governed,
131
+ },
132
+ }),
133
+ actionContract("artifact-register", {
134
+ required: ["artifact_id", "artifact_type", "path", "node", "status", "expected_revision", "actor", "idempotency_key"],
135
+ properties: {
136
+ artifact_id: string("Stable artifact identity."), artifact_type: string("Artifact semantic type."),
137
+ path: string("Existing project-relative .workflow path."), node: string("Owning formal node."),
138
+ status: string("Artifact status."), version: string("Artifact semantic version."),
139
+ producer_skill: string("Producing skill identity."), candidate_id: string("Bound candidate identity."),
140
+ supersedes: string("Superseded artifact identity."), expected_revision: integer("Expected formal artifact Registry revision."),
141
+ ...governed,
142
+ },
143
+ concurrency: "formal-artifact-registry-revision",
144
+ }),
145
+ actionContract("prototype-change-request-create", {
146
+ required: ["prototype_revision_id", "prototype_revision_checksum", "terminal_id", "page_id", "page_checksum", "body", "actor", "idempotency_key"],
147
+ properties: { ...exactPrototype, review_scene_id: string("Optional Review Scene identity."), body: string("Required change request body."), ...governed },
148
+ actor: "human",
149
+ }),
150
+ actionContract("prototype-change-request-edit", {
151
+ required: ["change_request_id", "expected_revision", "body", "actor", "idempotency_key"],
152
+ properties: { change_request_id: string("Change request identity."), expected_revision: integer("Expected request revision."), body: string("Replacement draft body."), ...governed },
153
+ actor: "human",
154
+ }),
155
+ actionContract("prototype-change-request-attachment-add", {
156
+ required: ["change_request_id", "expected_revision", "content_base64", "media_type", "actor", "idempotency_key"],
157
+ properties: { change_request_id: string("Change request identity."), expected_revision: integer("Expected request revision."), content_base64: string("Bounded base64 image content."), media_type: string("Allowed image media type."), ...governed },
158
+ actor: "human",
159
+ }),
160
+ actionContract("prototype-review-batch-finalize", {
161
+ required: ["prototype_revision_id", "prototype_revision_checksum", "terminal_id", "page_id", "change_request_ids", "actor", "idempotency_key"],
162
+ properties: { ...exactPrototype, change_request_ids: array("Exact request identities included in the batch."), ...governed },
163
+ actor: "human",
164
+ }),
165
+ actionContract("prototype-page-review-apply", {
166
+ required: ["revision", "terminal_id", "page_id", "target_checksum", "page_checksum", "decision", "actor", "idempotency_key"],
167
+ properties: { revision: string("Prototype revision reference."), terminal_id: string("Exact registered Logical Terminal identity."), page_id: string("Stable Page identity."), review_scene_id: string("Optional selected Review Scene identity."), target_checksum: string("Prototype checksum."), page_checksum: string("Page checksum."), decision: string("approved or changes-requested."), expected_scope_revision: integer("Required when final approval decides UX-UI."), rationale: string("Decision rationale."), comment: string("AI-readable optional comment."), experience: string("Registered Experience root."), ...governed },
168
+ actor: "human",
169
+ }),
170
+ actionContract("prototype-visual-standard-review-apply", {
171
+ required: ["revision", "prototype_revision_id", "prototype_revision_checksum", "visual_standard_checksum", "terminal_id", "decision", "actor", "idempotency_key"],
172
+ properties: {
173
+ revision: string("Exact Prototype revision reference."),
174
+ prototype_revision_id: string("Exact Prototype Revision identity."),
175
+ prototype_revision_checksum: string("Exact Prototype Revision checksum."),
176
+ visual_standard_checksum: string("Exact Visual Standard checksum bound by the Prototype Revision."),
177
+ terminal_id: string("all or one exact registered Logical Terminal identity."),
178
+ decision: string("approved or changes-requested."),
179
+ comment: string("Required non-empty modification comment when changes are requested."),
180
+ experience: string("Registered Experience root."),
181
+ ...governed,
182
+ },
183
+ actor: "human",
184
+ }),
185
+ actionContract("prototype-component-candidate-transition-plan", {
186
+ required: ["revision", "prototype_revision_id", "prototype_revision_checksum", "terminal_id", "component_id", "expected_lifecycle", "target_lifecycle", "actor", "idempotency_key"],
187
+ properties: { ...exactCandidateTransition, ...candidateTransitionGoverned },
188
+ actor: "human",
189
+ concurrency: "prototype-revision-checksum-and-candidate-lifecycle",
190
+ plan: "plan-only",
191
+ }),
192
+ actionContract("prototype-component-candidate-transition-apply", {
193
+ required: ["revision", "prototype_revision_id", "prototype_revision_checksum", "terminal_id", "component_id", "expected_lifecycle", "target_lifecycle", "expected_plan_checksum", "actor", "idempotency_key"],
194
+ properties: {
195
+ ...exactCandidateTransition,
196
+ expected_plan_checksum: string("Exact checksum returned by prototype-component-candidate-transition-plan."),
197
+ ...candidateTransitionGoverned,
198
+ },
199
+ actor: "human",
200
+ concurrency: "prototype-revision-checksum-and-candidate-lifecycle",
201
+ plan: "required-before-apply",
202
+ }),
203
+ actionContract("prototype-change-request-execution-start", {
204
+ required: ["change_request_id", "expected_revision", "actor", "idempotency_key"],
205
+ properties: { change_request_id: string("Change request identity."), expected_revision: integer("Expected request revision."), ...governed },
206
+ actor: "agent",
207
+ }),
208
+ actionContract("prototype-change-request-discard", {
209
+ required: ["change_request_id", "expected_revision", "rationale", "actor", "idempotency_key"],
210
+ properties: { change_request_id: string("Change request identity."), expected_revision: integer("Expected request revision."), rationale: string("Human discard rationale."), ...governed },
211
+ actor: "human",
212
+ }),
213
+ actionContract("system-initialization-script-plan", {
214
+ required: ["system_id", "script_id", "expected_registry_revision", "expected_registry_checksum", "idempotency_key"],
215
+ properties: { system_id: string("Project System identity."), script_id: string("Initialization script identity."), name: string("Human-readable script name."), content: string("Final edited script content."), source_path: string("Optional registered import provenance."), expected_registry_revision: integer("Expected Registry revision."), expected_registry_checksum: string("Expected Registry checksum."), expected_script_checksum: string("Expected current script checksum."), branch: string("Current branch."), ...governed },
216
+ plan: "required-before-apply",
217
+ }),
218
+ actionContract("system-initialization-script-apply", {
219
+ required: ["system_id", "script_id", "content", "expected_registry_revision", "expected_registry_checksum", "actor", "idempotency_key"],
220
+ properties: { system_id: string("Project System identity."), script_id: string("Initialization script identity."), name: string("Human-readable script name."), content: string("Final edited script content."), source_path: string("Optional registered import provenance."), expected_registry_revision: integer("Expected Registry revision."), expected_registry_checksum: string("Expected Registry checksum."), expected_script_checksum: string("Expected current script checksum."), branch: string("Current branch."), ...governed },
221
+ plan: "required-before-apply",
222
+ }),
223
+ actionContract("system-lifecycle-plan", {
224
+ required: ["system_id", "operation", "expected_registry_revision", "expected_registry_checksum", "branch", "idempotency_key"],
225
+ properties: { system_id: string("Project System identity."), operation: string("start, stop, restart, or status."), expected_registry_revision: integer("Expected Registry revision."), expected_registry_checksum: string("Expected Registry checksum."), branch: string("Current branch."), ...governed },
226
+ plan: "required-before-apply",
227
+ }),
228
+ actionContract("system-lifecycle-apply", {
229
+ required: ["system_id", "operation", "expected_registry_revision", "expected_registry_checksum", "expected_plan_checksum", "branch", "actor", "idempotency_key"],
230
+ properties: { system_id: string("Project System identity."), operation: string("start, stop, restart, or status."), expected_registry_revision: integer("Expected Registry revision."), expected_registry_checksum: string("Expected Registry checksum."), expected_plan_checksum: string("Exact prior plan checksum."), branch: string("Current branch."), ...governed },
231
+ plan: "required-before-apply",
232
+ }),
233
+ actionContract("mock-sync-plan", {
234
+ required: ["idempotency_key"], properties: { ...governed }, plan: "required-before-apply",
235
+ }),
236
+ actionContract("mock-sync-apply", {
237
+ required: ["expected_plan_checksum", "actor", "idempotency_key"], properties: { expected_plan_checksum: string("Exact prior sync plan checksum."), ...governed }, plan: "required-before-apply",
238
+ }),
239
+ actionContract("gate-decision-apply", {
240
+ required: ["gate_id", "decision", "expected_scope_revision", "evidence", "actor", "idempotency_key"],
241
+ properties: { gate_id: string("Pending non-UX Gate identity."), decision: string("approved or rejected."), expected_scope_revision: integer("Expected formal scope revision."), evidence: array("Gate evidence identities."), comment: string("Optional AI-readable comment."), ...governed }, actor: "human", concurrency: "formal-scope-revision",
242
+ }),
243
+ actionContract("workflow-transition-apply", {
244
+ required: ["event", "iteration_id", "node_id", "expected_scope_revision", "evidence", "actor", "idempotency_key"],
245
+ properties: { event: string("node-started or node-completed."), iteration_id: string("Exact iteration identity."), node_id: string("Formal seven-node identity."), expected_scope_revision: integer("Expected formal scope revision."), evidence: array("Transition evidence identities."), ...governed }, actor: "human", concurrency: "formal-scope-revision",
246
+ }),
247
+ actionContract("relationship-suggest", {
248
+ required: ["from", "from_entity_type", "to", "to_entity_type", "relation_type", "rationale", "expected_revision", "expected_checksum", "actor", "idempotency_key"], properties: { from: string("Source entity identity."), from_entity_type: string("Source entity type."), to: string("Target entity identity."), to_entity_type: string("Target entity type."), relation_type: string("Governed relationship type."), rationale: string("AI suggestion rationale."), ...collectionConcurrency, ...governed }, actor: "agent",
249
+ }),
250
+ actionContract("relationship-decide", {
251
+ required: ["relation_id", "decision", "expected_revision", "expected_checksum", "actor", "idempotency_key"], properties: { relation_id: string("Relationship identity."), decision: string("confirmed or rejected."), comment: string("Optional human comment."), ...collectionConcurrency, ...governed }, actor: "human",
252
+ }),
253
+ actionContract("relationship-invalidate", {
254
+ required: ["relation_id", "rationale", "expected_revision", "expected_checksum", "actor", "idempotency_key"], properties: { relation_id: string("Relationship identity."), rationale: string("Human invalidation rationale."), ...collectionConcurrency, ...governed }, actor: "human",
255
+ }),
256
+ actionContract("settings-update-plan", {
257
+ required: ["expected_revision", "expected_checksum", "changes", "actor", "idempotency_key"], properties: { expected_revision: integer("Expected settings revision."), expected_checksum: nullableString("Expected settings checksum, or null before first write."), changes: object("Whitelisted Manager preference changes."), ...governed }, actor: "human", plan: "plan-only",
258
+ }),
259
+ actionContract("settings-update-apply", {
260
+ required: ["expected_revision", "expected_checksum", "expected_plan_checksum", "changes", "actor", "idempotency_key"], properties: { expected_revision: integer("Expected settings revision."), expected_checksum: nullableString("Expected settings checksum, or null before first write."), expected_plan_checksum: string("Exact checksum returned by settings-update-plan."), changes: object("Whitelisted Manager preference changes."), ...governed }, actor: "human", plan: "required-before-apply",
261
+ }),
262
+ ]);
263
+
264
+ export const WORKFLOW_MANAGER_ACTION_NAMES = Object.freeze(
265
+ WORKFLOW_MANAGER_ACTION_CONTRACTS.map((contract) => contract.action),
266
+ );
267
+
268
+ const ACTION_CONTRACT_BY_NAME = new Map(
269
+ WORKFLOW_MANAGER_ACTION_CONTRACTS.map((contract) => [contract.action, contract]),
270
+ );
271
+
272
+ function schemaType(schema = {}) {
273
+ return Array.isArray(schema.type) ? schema.type.join("|") : schema.type || "any";
274
+ }
275
+
276
+ export function renderWorkflowManagerActionHelp(action, options = {}) {
277
+ const contract = ACTION_CONTRACT_BY_NAME.get(action);
278
+ if (!contract) throw new Error(`Unknown Workflow Manager action contract: ${action}`);
279
+ const command = options.command || "manager";
280
+ const required = new Set(contract.input_schema.required || []);
281
+ const fields = Object.entries(contract.input_schema.properties || {});
282
+ return [
283
+ `Workflow Manager contract: ${WORKFLOW_MANAGER_CONTRACTS_SCHEMA_VERSION}`,
284
+ `Action: ${contract.action}`,
285
+ `Usage: ${command} action ${contract.action} [workspace-directory] --input <json-file>`,
286
+ `Authorization: ${contract.authorization.actor}`,
287
+ `Concurrency: ${contract.concurrency.mode}`,
288
+ `Idempotency: ${contract.retry.idempotency}`,
289
+ `Planning: ${contract.planning.mode}`,
290
+ "",
291
+ "Required input fields:",
292
+ ...fields.filter(([field]) => required.has(field)).map(([field, schema]) =>
293
+ ` ${field} (${schemaType(schema)}) ${schema.description || ""}`.trimEnd()),
294
+ "",
295
+ "Optional input fields:",
296
+ ...fields.filter(([field]) => !required.has(field)).map(([field, schema]) =>
297
+ ` ${field} (${schemaType(schema)}) ${schema.description || ""}`.trimEnd()),
298
+ "",
299
+ "Result: structured outcome plus immutable receipt and event for applied mutations.",
300
+ ].join("\n");
301
+ }
302
+
303
+ function valueMatchesType(value, schema) {
304
+ if (Array.isArray(schema.type)) return schema.type.some((type) => valueMatchesType(value, { ...schema, type }));
305
+ if (schema.type === "null") return value === null;
306
+ if (schema.type === "object") return value !== null && typeof value === "object" && !Array.isArray(value);
307
+ if (schema.type === "array") return Array.isArray(value);
308
+ if (schema.type === "integer") return Number.isInteger(value);
309
+ if (schema.type === "boolean") return typeof value === "boolean";
310
+ if (schema.type === "string") return typeof value === "string";
311
+ return true;
312
+ }
313
+
314
+ export function validateWorkflowManagerActionInput(action, input) {
315
+ const contract = ACTION_CONTRACT_BY_NAME.get(action);
316
+ if (!contract) throw new Error(`Unknown Workflow Manager action contract: ${action}`);
317
+ const actor = String(input.actor || "");
318
+ if (contract.authorization.actor === "human" && !/^human:[A-Za-z0-9._@/-]+$/.test(actor)) {
319
+ return { valid: false, message: `${action} requires a human actor` };
320
+ }
321
+ if (contract.authorization.actor === "agent" && !/^agent:[A-Za-z0-9._@/-]+$/.test(actor)) {
322
+ return { valid: false, message: `${action} requires an agent actor` };
323
+ }
324
+ if (contract.authorization.actor === "human-or-agent"
325
+ && !/^(human|agent):[A-Za-z0-9._@/-]+$/.test(actor)) {
326
+ return { valid: false, message: `${action} requires a human or agent actor` };
327
+ }
328
+ for (const field of contract.input_schema.required || []) {
329
+ if (!(field in input) || input[field] === undefined) {
330
+ return { valid: false, message: `${field} is required for ${action}` };
331
+ }
332
+ }
333
+ if (contract.input_schema.additionalProperties === false) {
334
+ for (const field of Object.keys(input)) {
335
+ if (!(field in contract.input_schema.properties)) {
336
+ return { valid: false, message: `Unsupported field for ${action}: ${field}` };
337
+ }
338
+ }
339
+ }
340
+ for (const [field, value] of Object.entries(input)) {
341
+ const schema = contract.input_schema.properties[field];
342
+ if (!schema || value === undefined) continue;
343
+ if (!valueMatchesType(value, schema)) {
344
+ const expected = Array.isArray(schema.type) ? schema.type.join(" or ") : schema.type;
345
+ return { valid: false, message: `${field} must be ${expected} for ${action}` };
346
+ }
347
+ if (schema.type === "string" && Number.isInteger(schema.minLength) && value.length < schema.minLength) {
348
+ return { valid: false, message: `${field} must not be empty for ${action}` };
349
+ }
350
+ if (schema.type === "array" && schema.items) {
351
+ const invalid = value.findIndex((item) => !valueMatchesType(item, schema.items));
352
+ if (invalid >= 0) return { valid: false, message: `${field}[${invalid}] has an invalid type for ${action}` };
353
+ }
354
+ }
355
+ return { valid: true, contract };
356
+ }
357
+
358
+ export function inspectWorkflowManagerContracts() {
359
+ const actions = WORKFLOW_MANAGER_ACTION_CONTRACTS.map((contract) => structuredClone(contract));
360
+ const checksum = crypto.createHash("sha256").update(JSON.stringify(actions)).digest("hex");
361
+ return {
362
+ schema_version: WORKFLOW_MANAGER_CONTRACTS_SCHEMA_VERSION,
363
+ revision: 1,
364
+ checksum,
365
+ actions,
366
+ };
367
+ }