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,745 @@
1
+ import fs from "node:fs";
2
+ import http from "node:http";
3
+ import path from "node:path";
4
+ import crypto from "node:crypto";
5
+ import { spawn, spawnSync } from "node:child_process";
6
+ import { createRequire } from "node:module";
7
+ import { fileURLToPath, pathToFileURL } from "node:url";
8
+ import {
9
+ applyWorkflowManagerArtifact,
10
+ applyWorkflowManagerRequirement,
11
+ applyWorkflowManagerTask,
12
+ applyWorkflowManagerTestCase,
13
+ inspectWorkflowManagerFacts,
14
+ recordWorkflowManagerTestRun,
15
+ } from "./workflow-manager-facts.mjs";
16
+ import {
17
+ inspectWorkflowManagerContracts,
18
+ renderWorkflowManagerActionHelp,
19
+ validateWorkflowManagerActionInput,
20
+ WORKFLOW_MANAGER_ACTION_NAMES,
21
+ WORKFLOW_MANAGER_CONTRACTS_SCHEMA_VERSION,
22
+ } from "./workflow-manager-contracts.mjs";
23
+ import {
24
+ appendPrototypeChangeRequestAttachment,
25
+ applyWorkflowManagerComponentCandidateTransition,
26
+ applyPrototypeChangeRequest,
27
+ applyWorkflowManagerPageReview,
28
+ applyWorkflowManagerVisualStandardReview,
29
+ createPrototypeChangeRequest,
30
+ discardPrototypeChangeRequest,
31
+ finalizePrototypeReviewBatch,
32
+ inspectWorkflowManagerPrototypeAttachment,
33
+ inspectWorkflowManagerPrototypes,
34
+ markPrototypeChangeRequestExecution,
35
+ planWorkflowManagerComponentCandidateTransition,
36
+ PrototypeTerminalScopeError,
37
+ PrototypeSourceSnapshotError,
38
+ inspectWorkflowManagerPrototypeSourceSnapshots,
39
+ resolveWorkflowManagerPrototypeContent,
40
+ } from "./workflow-manager-prototypes.mjs";
41
+ import {
42
+ applyWorkflowManagerInitializationScript,
43
+ applyWorkflowManagerSystemLifecycle,
44
+ inspectWorkflowManagerSystems,
45
+ planWorkflowManagerInitializationScript,
46
+ planWorkflowManagerSystemLifecycle,
47
+ } from "./workflow-manager-systems.mjs";
48
+ import {
49
+ applyWorkflowManagerMockSync,
50
+ inspectWorkflowManagerMock,
51
+ planWorkflowManagerMockSync,
52
+ } from "./workflow-manager-mock.mjs";
53
+ import {
54
+ applyWorkflowManagerGateDecision,
55
+ applyWorkflowManagerSettingsUpdate,
56
+ applyWorkflowManagerTransition,
57
+ decideWorkflowManagerRelationship,
58
+ inspectWorkflowManagerSettings,
59
+ invalidateWorkflowManagerRelationship,
60
+ planWorkflowManagerSettingsUpdate,
61
+ suggestWorkflowManagerRelationship,
62
+ } from "./workflow-manager-governance.mjs";
63
+
64
+ const runtimeRoot = path.dirname(fileURLToPath(import.meta.url));
65
+ const installedStateRuntime = path.join(runtimeRoot, "..", "state", "delivery-state.mjs");
66
+ const packageStateRuntime = path.join(runtimeRoot, "delivery-state.mjs");
67
+ const stateRuntime = fs.existsSync(installedStateRuntime) ? installedStateRuntime : packageStateRuntime;
68
+ const { executeDeliveryStateCommand } = await import(pathToFileURL(stateRuntime).href);
69
+ const require = createRequire(import.meta.url);
70
+ const installedYaml = path.join(runtimeRoot, "..", "state", "vendor", "yaml", "dist", "index.js");
71
+ const yamlPackage = require(fs.existsSync(installedYaml) ? installedYaml : "yaml");
72
+ const yaml = {
73
+ parse: yamlPackage.parse,
74
+ stringify: (value) => yamlPackage.stringify(value, { lineWidth: 0 }),
75
+ };
76
+
77
+ export const WORKFLOW_MANAGER_SCHEMA_VERSION = "workflow-manager.v1";
78
+ export const WORKFLOW_MANAGER_PROTOTYPE = Object.freeze({
79
+ revision: "wm-prototype-r33",
80
+ checksum: "f98e7595",
81
+ });
82
+
83
+ export const WORKFLOW_MANAGER_RESOURCE_NAMES = Object.freeze([
84
+ "manager", "contracts", "facts", "prototypes", "prototype-source-snapshots", "attachments", "systems", "mock", "settings",
85
+ ]);
86
+ const RESOURCE_NAMES = new Set(WORKFLOW_MANAGER_RESOURCE_NAMES);
87
+ const ACTION_NAMES = new Set(WORKFLOW_MANAGER_ACTION_NAMES);
88
+
89
+ export function renderWorkflowManagerHelp(options = {}) {
90
+ const command = options.command || "manager";
91
+ return [
92
+ `Workflow Manager contract: ${WORKFLOW_MANAGER_CONTRACTS_SCHEMA_VERSION}`,
93
+ "",
94
+ "Usage:",
95
+ ` ${command} inspect [workspace-directory]`,
96
+ ` ${command} <list|show|export> [workspace-directory] --resource <resource> [--terminal-id all|<terminal-id>]`,
97
+ ` ${command} action <action-name> [workspace-directory] --input <json-file>`,
98
+ ` ${command} action <action-name> --help`,
99
+ ` ${command} serve [workspace-directory] [--port <port>] [--no-open]`,
100
+ "",
101
+ "Resources:",
102
+ ` ${WORKFLOW_MANAGER_RESOURCE_NAMES.join(" ")}`,
103
+ "",
104
+ "Governed actions:",
105
+ ...WORKFLOW_MANAGER_ACTION_NAMES.map((action) => ` ${action}`),
106
+ "",
107
+ `Run '${command} action <action-name> --help' for authorization, concurrency, planning, idempotency, and input fields.`,
108
+ ].join("\n");
109
+ }
110
+
111
+ export function renderWorkflowManagerCommandHelp(action, options = {}) {
112
+ const command = options.command || "manager";
113
+ return action ? renderWorkflowManagerActionHelp(action, { command }) : renderWorkflowManagerHelp({ command });
114
+ }
115
+
116
+ export class WorkflowManagerError extends Error {
117
+ constructor(code, message, status = 400) {
118
+ super(message);
119
+ this.name = "WorkflowManagerError";
120
+ this.code = code;
121
+ this.status = status;
122
+ }
123
+ }
124
+
125
+ export const WORKFLOW_MANAGER_NODES = Object.freeze([
126
+ { node_id: "00-bootstrap", name: "项目上下文启动", phase: "entry" },
127
+ { node_id: "01-product-shaping", name: "产品塑形", phase: "design" },
128
+ { node_id: "02-solution-design", name: "方案设计", phase: "design" },
129
+ { node_id: "03-delivery-readiness", name: "交付准备", phase: "design" },
130
+ { node_id: "04-implementation", name: "开发实现", phase: "development" },
131
+ { node_id: "05-candidate-assurance", name: "候选版本保障", phase: "development" },
132
+ { node_id: "06-version-closeout", name: "版本收尾", phase: "development" },
133
+ ]);
134
+
135
+ const MANAGER_PAGES = Object.freeze([
136
+ { page_id: "P01", name: "工作台", route: "/overview", availability: "available" },
137
+ { page_id: "P02", name: "开发流程", route: "/workflow", availability: "available" },
138
+ { page_id: "P19", name: "产品需求", route: "/product/requirements", availability: "available" },
139
+ { page_id: "P03", name: "执行任务", route: "/tasks", availability: "available" },
140
+ { page_id: "P18", name: "测试用例", route: "/test-cases", availability: "available" },
141
+ { page_id: "P04", name: "交付成果", route: "/artifacts", availability: "available" },
142
+ { page_id: "P06", name: "待办决策", route: "/decisions", availability: "available" },
143
+ { page_id: "P07", name: "项目原型", route: "/prototypes", availability: "available" },
144
+ { page_id: "P11", name: "项目视觉规范", route: "/prototypes/visual-standard", availability: "available" },
145
+ { page_id: "P12", name: "原型审批管理", route: "/prototypes/reviews", availability: "available" },
146
+ { page_id: "P13", name: "页面审核详情", route: "/prototypes/reviews/page", availability: "available", navigation: "contextual" },
147
+ { page_id: "P14", name: "页面路由管理", route: "/prototypes/routes", availability: "available" },
148
+ { page_id: "P15", name: "页面路由关系", route: "/prototypes/route-graph", availability: "available" },
149
+ { page_id: "P16", name: "修改要求", route: "/prototypes/change-requests", availability: "available" },
150
+ { page_id: "P17", name: "修订记录", route: "/prototypes/revisions", availability: "available" },
151
+ { page_id: "P08", name: "项目系统", route: "/systems", availability: "available" },
152
+ { page_id: "P09", name: "模拟服务", route: "/mock", availability: "available" },
153
+ { page_id: "P05", name: "操作与变更记录", route: "/events", availability: "available" },
154
+ { page_id: "P10", name: "设置", route: "/settings", availability: "available" },
155
+ ].map((page) => Object.freeze({
156
+ ...page,
157
+ lifecycle_status: page.availability,
158
+ mutability: "read-only",
159
+ })));
160
+
161
+ const PAGE_ROUTES = new Map(MANAGER_PAGES.map((page) => [page.page_id, page.route]));
162
+
163
+ function workspaceIdentity(projectRoot) {
164
+ const configurationFile = path.join(projectRoot, ".workflow", "config", "workspace.yaml");
165
+ if (!fs.existsSync(configurationFile)) {
166
+ throw new Error(`Workflow Manager requires workspace configuration: ${configurationFile}`);
167
+ }
168
+ const configuration = yaml.parse(fs.readFileSync(configurationFile, "utf8"));
169
+ const workflowRepositoryPath = path.resolve(projectRoot, configuration.workflow_repository?.path || ".");
170
+ const codeRepositoryPath = configuration.code_repository?.path
171
+ ? path.resolve(projectRoot, configuration.code_repository.path)
172
+ : null;
173
+ return {
174
+ workspace_id: configuration.workspace_id,
175
+ repository_layout: configuration.repository_layout,
176
+ workflow_repository: {
177
+ path: configuration.workflow_repository?.path || ".",
178
+ branch: configuration.workflow_repository?.branch || null,
179
+ current_branch: repositoryBranch(workflowRepositoryPath),
180
+ },
181
+ code_repository: {
182
+ repo_id: configuration.code_repository?.repo_id || null,
183
+ path: configuration.code_repository?.path || null,
184
+ default_branch: configuration.code_repository?.default_branch || null,
185
+ current_branch: codeRepositoryPath ? repositoryBranch(codeRepositoryPath) : null,
186
+ },
187
+ };
188
+ }
189
+
190
+ function repositoryBranch(repositoryPath) {
191
+ const result = spawnSync("git", ["branch", "--show-current"], {
192
+ cwd: repositoryPath,
193
+ encoding: "utf8",
194
+ windowsHide: true,
195
+ });
196
+ return result.status === 0 ? result.stdout.trim() || null : null;
197
+ }
198
+
199
+ function projectIdentity(inspection, projectRoot) {
200
+ const development = inspection.workflow_state?.development_state || {};
201
+ return {
202
+ project_id: inspection.project_id || inspection.project?.project_id || path.basename(projectRoot),
203
+ name: inspection.project?.name || inspection.project_id || path.basename(projectRoot),
204
+ iteration_id: development.scope_id || inspection.project?.current_iteration_id || null,
205
+ state_revision: development.revision ?? inspection.workflow_state?.revision ?? 0,
206
+ };
207
+ }
208
+
209
+ function countLabel(values) {
210
+ return `${Array.isArray(values) ? values.length : 0} 项`;
211
+ }
212
+
213
+ function stateFacts(derived) {
214
+ const tasks = Array.isArray(derived.task_facts) ? derived.task_facts : [];
215
+ const gates = Array.isArray(derived.gate_facts) ? derived.gate_facts : [];
216
+ const artifacts = Array.isArray(derived.artifact_facts) ? derived.artifact_facts : [];
217
+ const missing = Array.isArray(derived.missing_conditions) ? derived.missing_conditions : [];
218
+ const blocking = Array.isArray(derived.blocking_conditions) ? derived.blocking_conditions : [];
219
+ return [
220
+ { fact_id: "tasks", label: "任务事实", value: countLabel(tasks), source_page_id: "P03", records: tasks },
221
+ { fact_id: "gates", label: "人工审核点", value: countLabel(gates), source_page_id: "P06", records: gates },
222
+ { fact_id: "artifacts", label: "交付成果", value: countLabel(artifacts), source_page_id: "P04", records: artifacts },
223
+ { fact_id: "missing", label: "尚缺条件", value: countLabel(missing), source_page_id: "P02", records: missing },
224
+ { fact_id: "blocking", label: "阻断条件", value: countLabel(blocking), source_page_id: "P05", records: blocking },
225
+ {
226
+ fact_id: "receipt",
227
+ label: "运行凭证",
228
+ value: derived.completion_receipt_id || "尚未生成",
229
+ source_page_id: "P04",
230
+ records: derived.completion_receipt_id ? [derived.completion_receipt_id] : [],
231
+ },
232
+ ].map((fact) => ({
233
+ ...fact,
234
+ source_route: PAGE_ROUTES.get(fact.source_page_id),
235
+ mutability: "derived-read-only",
236
+ }));
237
+ }
238
+
239
+ function nodeProjection(definition, sequence, derivedStates, contracts) {
240
+ const derived = derivedStates?.[definition.node_id] || {};
241
+ const contract = contracts?.[definition.node_id] || {};
242
+ return {
243
+ ...definition,
244
+ sequence,
245
+ state: derived.state || "pending",
246
+ state_source: "derived_node_states",
247
+ missing_conditions: Array.isArray(derived.missing_conditions) ? derived.missing_conditions : [],
248
+ blocking_conditions: Array.isArray(derived.blocking_conditions) ? derived.blocking_conditions : [],
249
+ completion_receipt: derived.completion_receipt_id || derived.completion_receipt || null,
250
+ completion_ready: derived.completion_ready === true,
251
+ node_attempt: derived.node_attempt ?? 0,
252
+ mutability: "derived-read-only",
253
+ contract: {
254
+ prerequisites: Array.isArray(contract.prerequisites) ? contract.prerequisites : [],
255
+ internal_gates: Array.isArray(contract.internal_gates) ? contract.internal_gates : [],
256
+ completion: contract.completion || {},
257
+ },
258
+ state_facts: stateFacts(derived),
259
+ };
260
+ }
261
+
262
+ function workflowFocus(nodes) {
263
+ const priority = ["blocked", "active", "ready-to-complete", "waiting", "pending", "completed"];
264
+ return [...nodes].sort((left, right) => priority.indexOf(left.state) - priority.indexOf(right.state))[0] || null;
265
+ }
266
+
267
+ export function buildWorkflowManagerProjection(projectRoot) {
268
+ const root = path.resolve(projectRoot);
269
+ const inspection = executeDeliveryStateCommand(["inspect", "--project", root], { yaml });
270
+ const nodes = WORKFLOW_MANAGER_NODES.map((definition, sequence) =>
271
+ nodeProjection(definition, sequence, inspection.derived_node_states, inspection.node_contracts));
272
+ const focusNode = workflowFocus(nodes);
273
+ return {
274
+ schema_version: WORKFLOW_MANAGER_SCHEMA_VERSION,
275
+ lifecycle_status: "active",
276
+ mutability: "read-only",
277
+ prototype: WORKFLOW_MANAGER_PROTOTYPE,
278
+ workspace: workspaceIdentity(root),
279
+ project: projectIdentity(inspection, root),
280
+ workflow: {
281
+ state_source: "state inspect.derived_node_states",
282
+ nodes,
283
+ focus_node_id: focusNode?.node_id || null,
284
+ },
285
+ workbench: {
286
+ focus_node_id: focusNode?.node_id || null,
287
+ attention: {
288
+ missing_conditions: focusNode?.missing_conditions.length || 0,
289
+ blocking_conditions: focusNode?.blocking_conditions.length || 0,
290
+ pending_gates: focusNode?.state_facts.find((fact) => fact.fact_id === "gates")?.records
291
+ .filter((gate) => !new Set(["approved", "not-required"]).has(gate.decision)).length || 0,
292
+ },
293
+ next_action: focusNode?.state === "completed"
294
+ ? "进入下一节点并核对其正式状态依据"
295
+ : focusNode?.completion_ready
296
+ ? "核对完成条件并执行合法节点转换"
297
+ : "处理当前节点尚缺条件和阻断项",
298
+ },
299
+ pages: MANAGER_PAGES,
300
+ facts: inspectWorkflowManagerFacts(root),
301
+ };
302
+ }
303
+
304
+ function withPrototypeResourceContext(projectRoot, resource) {
305
+ const root = path.resolve(projectRoot);
306
+ const inspection = executeDeliveryStateCommand(["inspect", "--project", root], { yaml });
307
+ const workspace = workspaceIdentity(root);
308
+ return {
309
+ ...resource,
310
+ context: {
311
+ project: projectIdentity(inspection, root),
312
+ workspace,
313
+ branch: workspace.workflow_repository.current_branch || workspace.workflow_repository.branch,
314
+ iteration_id: resource.iteration_id || null,
315
+ prototype_revision_id: resource.prototype_revision_id,
316
+ prototype_revision_checksum: resource.prototype_revision_checksum,
317
+ terminal_id: resource.terminal_scope?.terminal_id || null,
318
+ },
319
+ };
320
+ }
321
+
322
+ export async function queryWorkflowManagerResource(projectRoot, resource, options = {}) {
323
+ if (!RESOURCE_NAMES.has(resource)) {
324
+ throw new WorkflowManagerError("resource-not-found", `Unknown Workflow Manager resource: ${resource}`, 404);
325
+ }
326
+ if (resource === "manager") return buildWorkflowManagerProjection(projectRoot);
327
+ if (resource === "contracts") return inspectWorkflowManagerContracts();
328
+ if (resource === "facts") return inspectWorkflowManagerFacts(projectRoot);
329
+ if (resource === "prototypes") {
330
+ let projection;
331
+ try {
332
+ projection = inspectWorkflowManagerPrototypes(projectRoot, options);
333
+ } catch (error) {
334
+ if (error instanceof WorkflowManagerError) throw error;
335
+ if (error instanceof PrototypeTerminalScopeError) {
336
+ throw new WorkflowManagerError(error.code, error.message, 422);
337
+ }
338
+ throw new WorkflowManagerError("prototype-revision-invalid", error.message, 422);
339
+ }
340
+ return withPrototypeResourceContext(projectRoot, projection);
341
+ }
342
+ if (resource === "prototype-source-snapshots") {
343
+ let snapshots;
344
+ try {
345
+ snapshots = inspectWorkflowManagerPrototypeSourceSnapshots(projectRoot, options);
346
+ } catch (error) {
347
+ if (error instanceof WorkflowManagerError) throw error;
348
+ if (error instanceof PrototypeTerminalScopeError) {
349
+ throw new WorkflowManagerError(error.code, error.message, 422);
350
+ }
351
+ if (error instanceof PrototypeSourceSnapshotError) {
352
+ const status = error.code === "prototype-source-snapshot-not-registered" ? 404 : 422;
353
+ throw new WorkflowManagerError(error.code, error.message, status);
354
+ }
355
+ throw new WorkflowManagerError("prototype-revision-invalid", error.message, 422);
356
+ }
357
+ return withPrototypeResourceContext(projectRoot, snapshots);
358
+ }
359
+ if (resource === "attachments") return inspectWorkflowManagerPrototypeAttachment(projectRoot, {
360
+ attachment_id: options.attachmentId,
361
+ expected_checksum: options.expectedChecksum,
362
+ });
363
+ if (resource === "systems") return inspectWorkflowManagerSystems(projectRoot, options);
364
+ if (resource === "mock") return inspectWorkflowManagerMock(projectRoot, options);
365
+ return inspectWorkflowManagerSettings(projectRoot);
366
+ }
367
+
368
+ function executePrototypeManagerAction(operation) {
369
+ try {
370
+ return operation();
371
+ } catch (error) {
372
+ if (error instanceof PrototypeTerminalScopeError) {
373
+ throw new WorkflowManagerError(error.code, error.message, 422);
374
+ }
375
+ throw error;
376
+ }
377
+ }
378
+
379
+ export async function executeWorkflowManagerAction(projectRoot, action, input = {}, options = {}) {
380
+ if (!ACTION_NAMES.has(action)) {
381
+ throw new WorkflowManagerError("action-not-found", `Unknown Workflow Manager action: ${action}`, 404);
382
+ }
383
+ if (!input || typeof input !== "object" || Array.isArray(input)) {
384
+ throw new WorkflowManagerError("invalid-request", "Workflow Manager action input must be a JSON object", 400);
385
+ }
386
+ const validation = validateWorkflowManagerActionInput(action, input);
387
+ if (!validation.valid) {
388
+ throw new WorkflowManagerError("invalid-action-input", validation.message, 400);
389
+ }
390
+ if (action === "requirement-apply") return applyWorkflowManagerRequirement(projectRoot, input);
391
+ if (action === "task-apply") return applyWorkflowManagerTask(projectRoot, input, options);
392
+ if (action === "test-case-apply") return applyWorkflowManagerTestCase(projectRoot, input);
393
+ if (action === "test-run-record") return recordWorkflowManagerTestRun(projectRoot, input);
394
+ if (action === "artifact-register") return applyWorkflowManagerArtifact(projectRoot, input, options);
395
+ if (action === "prototype-change-request-create") {
396
+ return executePrototypeManagerAction(() => createPrototypeChangeRequest(projectRoot, input));
397
+ }
398
+ if (action === "prototype-change-request-edit") {
399
+ return executePrototypeManagerAction(() => applyPrototypeChangeRequest(projectRoot, input.change_request_id, input));
400
+ }
401
+ if (action === "prototype-change-request-attachment-add") {
402
+ return executePrototypeManagerAction(() => appendPrototypeChangeRequestAttachment(projectRoot, input.change_request_id, input));
403
+ }
404
+ if (action === "prototype-review-batch-finalize") {
405
+ return executePrototypeManagerAction(() => finalizePrototypeReviewBatch(projectRoot, input));
406
+ }
407
+ if (action === "prototype-page-review-apply") {
408
+ return executePrototypeManagerAction(() => applyWorkflowManagerPageReview(projectRoot, input, options));
409
+ }
410
+ if (action === "prototype-visual-standard-review-apply") {
411
+ return executePrototypeManagerAction(() => applyWorkflowManagerVisualStandardReview(projectRoot, input, options));
412
+ }
413
+ if (action === "prototype-component-candidate-transition-plan") {
414
+ return executePrototypeManagerAction(() => planWorkflowManagerComponentCandidateTransition(projectRoot, input));
415
+ }
416
+ if (action === "prototype-component-candidate-transition-apply") {
417
+ return executePrototypeManagerAction(() => applyWorkflowManagerComponentCandidateTransition(projectRoot, input, options));
418
+ }
419
+ if (action === "prototype-change-request-execution-start") {
420
+ return executePrototypeManagerAction(() => markPrototypeChangeRequestExecution(projectRoot, input.change_request_id, input));
421
+ }
422
+ if (action === "prototype-change-request-discard") {
423
+ return executePrototypeManagerAction(() => discardPrototypeChangeRequest(projectRoot, input.change_request_id, input));
424
+ }
425
+ if (action === "system-initialization-script-plan") {
426
+ return planWorkflowManagerInitializationScript(projectRoot, input.system_id, input);
427
+ }
428
+ if (action === "system-initialization-script-apply") {
429
+ return applyWorkflowManagerInitializationScript(projectRoot, input.system_id, input, options);
430
+ }
431
+ if (action === "system-lifecycle-plan") {
432
+ return planWorkflowManagerSystemLifecycle(projectRoot, input.system_id, input);
433
+ }
434
+ if (action === "system-lifecycle-apply") {
435
+ return applyWorkflowManagerSystemLifecycle(projectRoot, input.system_id, input, options);
436
+ }
437
+ if (action === "mock-sync-plan") return planWorkflowManagerMockSync(projectRoot, input, options);
438
+ if (action === "mock-sync-apply") return applyWorkflowManagerMockSync(projectRoot, input, options);
439
+ if (action === "gate-decision-apply") return applyWorkflowManagerGateDecision(projectRoot, input, options);
440
+ if (action === "workflow-transition-apply") return applyWorkflowManagerTransition(projectRoot, input, options);
441
+ if (action === "relationship-suggest") return suggestWorkflowManagerRelationship(projectRoot, input, options);
442
+ if (action === "relationship-decide") return decideWorkflowManagerRelationship(projectRoot, input, options);
443
+ if (action === "relationship-invalidate") return invalidateWorkflowManagerRelationship(projectRoot, input, options);
444
+ if (action === "settings-update-plan") return planWorkflowManagerSettingsUpdate(projectRoot, input);
445
+ return applyWorkflowManagerSettingsUpdate(projectRoot, input, options);
446
+ }
447
+
448
+ function sendJson(response, status, value) {
449
+ const body = `${JSON.stringify(value)}\n`;
450
+ response.writeHead(status, {
451
+ "Content-Type": "application/json; charset=utf-8",
452
+ "Cache-Control": "no-store",
453
+ "Content-Length": Buffer.byteLength(body),
454
+ "X-Content-Type-Options": "nosniff",
455
+ });
456
+ response.end(body);
457
+ }
458
+
459
+ function sendError(response, error) {
460
+ const status = Number.isInteger(error?.status) ? error.status : 400;
461
+ sendJson(response, status, {
462
+ error: {
463
+ code: typeof error?.code === "string" ? error.code : "invalid-request",
464
+ message: error?.message || "Workflow Manager request failed",
465
+ },
466
+ });
467
+ }
468
+
469
+ function readJsonBody(request, maxBodyBytes) {
470
+ return new Promise((resolve, reject) => {
471
+ const chunks = [];
472
+ let length = 0;
473
+ let settled = false;
474
+ request.on("data", (chunk) => {
475
+ length += chunk.length;
476
+ if (length > maxBodyBytes) {
477
+ if (!settled) {
478
+ settled = true;
479
+ reject(new WorkflowManagerError("request-too-large", `Request body exceeds ${maxBodyBytes} bytes`, 413));
480
+ }
481
+ return;
482
+ }
483
+ chunks.push(chunk);
484
+ });
485
+ request.on("end", () => {
486
+ if (settled) return;
487
+ settled = true;
488
+ if (!length) return resolve({});
489
+ try {
490
+ const value = JSON.parse(Buffer.concat(chunks).toString("utf8"));
491
+ if (!value || typeof value !== "object" || Array.isArray(value)) {
492
+ throw new Error("JSON object required");
493
+ }
494
+ resolve(value);
495
+ } catch (error) {
496
+ reject(new WorkflowManagerError("invalid-json", `Invalid JSON request body: ${error.message}`, 400));
497
+ }
498
+ });
499
+ request.on("error", (error) => {
500
+ if (!settled) reject(error);
501
+ });
502
+ });
503
+ }
504
+
505
+ const SESSION_COOKIE = "workflow_manager_session";
506
+
507
+ function safeEqual(left, right) {
508
+ const leftBytes = Buffer.from(String(left || ""));
509
+ const rightBytes = Buffer.from(String(right || ""));
510
+ return leftBytes.length === rightBytes.length && crypto.timingSafeEqual(leftBytes, rightBytes);
511
+ }
512
+
513
+ function cookieValue(request, name) {
514
+ for (const part of String(request.headers.cookie || "").split(";")) {
515
+ const separator = part.indexOf("=");
516
+ if (separator < 0 || part.slice(0, separator).trim() !== name) continue;
517
+ return decodeURIComponent(part.slice(separator + 1).trim());
518
+ }
519
+ return null;
520
+ }
521
+
522
+ function requestOrigin(request) {
523
+ const host = String(request.headers.host || "");
524
+ if (!host) throw new WorkflowManagerError("host-rejected", "Workflow Manager request Host is required", 403);
525
+ let parsed;
526
+ try { parsed = new URL(`http://${host}`); } catch {
527
+ throw new WorkflowManagerError("host-rejected", "Workflow Manager request Host is invalid", 403);
528
+ }
529
+ if (!new Set(["127.0.0.1", "localhost", "[::1]"]).has(parsed.hostname)) {
530
+ throw new WorkflowManagerError("host-rejected", "Workflow Manager accepts only loopback Host values", 403);
531
+ }
532
+ return parsed.origin;
533
+ }
534
+
535
+ function requireBrowserWriteSession(request, sessionToken) {
536
+ const origin = requestOrigin(request);
537
+ if (String(request.headers.origin || "") !== origin) {
538
+ throw new WorkflowManagerError("origin-rejected", "Workflow Manager write requires an exact same-origin request", 403);
539
+ }
540
+ if (!safeEqual(cookieValue(request, SESSION_COOKIE), sessionToken)) {
541
+ throw new WorkflowManagerError("session-required", "Workflow Manager write requires its current browser session", 401);
542
+ }
543
+ }
544
+
545
+ function publicDirectory(packageRoot, options) {
546
+ if (options.publicRoot) return path.resolve(options.publicRoot);
547
+ const installedPublic = path.join(runtimeRoot, "public");
548
+ if (fs.existsSync(installedPublic)) return installedPublic;
549
+ return path.join(path.resolve(packageRoot), "lib", "workflow-manager-public");
550
+ }
551
+
552
+ function isInside(candidate, root) {
553
+ const relative = path.relative(root, candidate);
554
+ return relative === "" || (!relative.startsWith("..") && !path.isAbsolute(relative));
555
+ }
556
+
557
+ function serveStatic(publicRoot, response, pathname) {
558
+ const requested = pathname === "/" ? "index.html" : pathname.slice(1);
559
+ const candidate = path.resolve(publicRoot, requested);
560
+ const fallback = path.join(publicRoot, "index.html");
561
+ const file = isInside(candidate, publicRoot) && fs.existsSync(candidate) && fs.statSync(candidate).isFile()
562
+ ? candidate
563
+ : fallback;
564
+ if (!fs.existsSync(file) || !fs.statSync(file).isFile()) {
565
+ sendJson(response, 404, { error: "Workflow Manager frontend is not built." });
566
+ return;
567
+ }
568
+ const types = {
569
+ ".css": "text/css; charset=utf-8",
570
+ ".html": "text/html; charset=utf-8",
571
+ ".js": "text/javascript; charset=utf-8",
572
+ ".svg": "image/svg+xml",
573
+ };
574
+ const body = fs.readFileSync(file);
575
+ response.writeHead(200, {
576
+ "Content-Type": types[path.extname(file)] || "application/octet-stream",
577
+ "Content-Length": body.length,
578
+ "Cache-Control": "no-cache",
579
+ "Content-Security-Policy": "default-src 'self'; img-src 'self' data:; style-src 'self'; script-src 'self'; connect-src 'self'; object-src 'none'; base-uri 'none'; frame-ancestors 'none'",
580
+ "X-Content-Type-Options": "nosniff",
581
+ "Referrer-Policy": "no-referrer",
582
+ });
583
+ response.end(body);
584
+ }
585
+
586
+ function servePrototypeContent(root, response, relative, options = {}) {
587
+ const resolved = resolveWorkflowManagerPrototypeContent(root, relative, options);
588
+ const types = {
589
+ ".css": "text/css; charset=utf-8", ".html": "text/html; charset=utf-8",
590
+ ".js": "text/javascript; charset=utf-8", ".json": "application/json; charset=utf-8",
591
+ ".png": "image/png", ".jpg": "image/jpeg", ".jpeg": "image/jpeg", ".webp": "image/webp",
592
+ ".svg": "image/svg+xml",
593
+ };
594
+ const body = fs.readFileSync(resolved.file);
595
+ response.writeHead(200, {
596
+ "Content-Type": types[path.extname(resolved.file).toLowerCase()] || "application/octet-stream",
597
+ "Content-Length": body.length,
598
+ "Cache-Control": "no-store",
599
+ "Content-Security-Policy": "default-src 'self'; img-src 'self' data: blob:; style-src 'self' 'unsafe-inline'; script-src 'self' 'unsafe-inline'; connect-src 'none'; object-src 'none'; base-uri 'none'; frame-ancestors 'self'",
600
+ "X-Content-Type-Options": "nosniff",
601
+ "Referrer-Policy": "no-referrer",
602
+ "Cross-Origin-Resource-Policy": "same-origin",
603
+ });
604
+ response.end(body);
605
+ }
606
+
607
+ export function createWorkflowManagerServer(packageRoot, projectRoot, options = {}) {
608
+ const root = path.resolve(projectRoot);
609
+ const publicRoot = publicDirectory(packageRoot, options);
610
+ const maxBodyBytes = options.maxBodyBytes || 12 * 1024 * 1024;
611
+ const sessionToken = options.sessionToken || crypto.randomBytes(32).toString("base64url");
612
+ const server = http.createServer(async (request, response) => {
613
+ try {
614
+ const url = new URL(request.url || "/", "http://localhost");
615
+ if (request.method === "GET" && url.pathname === "/" && url.searchParams.has("session")) {
616
+ if (!safeEqual(url.searchParams.get("session"), sessionToken)) {
617
+ throw new WorkflowManagerError("session-invalid", "Workflow Manager browser session is invalid", 401);
618
+ }
619
+ response.writeHead(303, {
620
+ Location: "/",
621
+ "Set-Cookie": `${SESSION_COOKIE}=${encodeURIComponent(sessionToken)}; Path=/; HttpOnly; SameSite=Strict`,
622
+ "Cache-Control": "no-store",
623
+ "Referrer-Policy": "no-referrer",
624
+ });
625
+ response.end();
626
+ return;
627
+ }
628
+ if (request.method === "GET" && url.pathname === "/api/v1/health") {
629
+ sendJson(response, 200, { ok: true, schema_version: WORKFLOW_MANAGER_SCHEMA_VERSION });
630
+ return;
631
+ }
632
+ if (request.method === "GET" && url.pathname === "/api/v1/manager") {
633
+ sendJson(response, 200, buildWorkflowManagerProjection(root));
634
+ return;
635
+ }
636
+ if (request.method === "GET" && url.pathname.startsWith("/api/v1/prototype-content/")) {
637
+ const relative = decodeURIComponent(url.pathname.slice("/api/v1/prototype-content/".length));
638
+ servePrototypeContent(root, response, relative, {
639
+ revision: url.searchParams.get("revision") || undefined,
640
+ expectedChecksum: url.searchParams.get("expected_checksum") || undefined,
641
+ });
642
+ return;
643
+ }
644
+ if (request.method === "GET" && url.pathname.startsWith("/api/v1/prototype-source-snapshots/")) {
645
+ const sourceSnapshotId = decodeURIComponent(
646
+ url.pathname.slice("/api/v1/prototype-source-snapshots/".length),
647
+ );
648
+ sendJson(response, 200, await queryWorkflowManagerResource(root, "prototype-source-snapshots", {
649
+ experience: url.searchParams.get("experience") || undefined,
650
+ revision: url.searchParams.get("revision") || undefined,
651
+ expectedChecksum: url.searchParams.get("expected_checksum") || undefined,
652
+ terminalId: url.searchParams.get("terminal_id") || undefined,
653
+ pageId: url.searchParams.get("page_id") || undefined,
654
+ reviewSceneId: url.searchParams.get("review_scene_id") || undefined,
655
+ sourceRef: url.searchParams.get("source_ref") || undefined,
656
+ sourceSnapshotId,
657
+ }));
658
+ return;
659
+ }
660
+ const resourceMatch = request.method === "GET" && url.pathname.match(/^\/api\/v1\/resources\/([^/]+)$/);
661
+ if (resourceMatch) {
662
+ sendJson(response, 200, await queryWorkflowManagerResource(root, decodeURIComponent(resourceMatch[1]), {
663
+ experience: url.searchParams.get("experience") || undefined,
664
+ revision: url.searchParams.get("revision") || undefined,
665
+ branch: url.searchParams.get("branch") || undefined,
666
+ attachmentId: url.searchParams.get("attachment_id") || undefined,
667
+ expectedChecksum: url.searchParams.get("expected_checksum") || undefined,
668
+ terminalId: url.searchParams.get("terminal_id") || undefined,
669
+ pageId: url.searchParams.get("page_id") || undefined,
670
+ reviewSceneId: url.searchParams.get("review_scene_id") || undefined,
671
+ sourceSnapshotId: url.searchParams.get("source_snapshot_id") || undefined,
672
+ sourceRef: url.searchParams.get("source_ref") || undefined,
673
+ }));
674
+ return;
675
+ }
676
+ const actionMatch = request.method === "POST" && url.pathname.match(/^\/api\/v1\/actions\/([^/]+)$/);
677
+ if (actionMatch) {
678
+ const action = decodeURIComponent(actionMatch[1]);
679
+ if (!ACTION_NAMES.has(action)) {
680
+ throw new WorkflowManagerError("action-not-found", `Unknown Workflow Manager action: ${action}`, 404);
681
+ }
682
+ requireBrowserWriteSession(request, sessionToken);
683
+ const input = { ...(await readJsonBody(request, maxBodyBytes)), actor: options.uiActor || "human:workflow-manager-user" };
684
+ sendJson(response, 200, await executeWorkflowManagerAction(root, action, input, options));
685
+ return;
686
+ }
687
+ if (url.pathname.startsWith("/api/")) {
688
+ if (!new Set(["GET", "POST"]).has(request.method || "")) {
689
+ throw new WorkflowManagerError("method-not-allowed", "Method not allowed", 405);
690
+ }
691
+ throw new WorkflowManagerError("endpoint-not-found", `Unknown Workflow Manager endpoint: ${url.pathname}`, 404);
692
+ }
693
+ if (request.method !== "GET") throw new WorkflowManagerError("method-not-allowed", "Method not allowed", 405);
694
+ serveStatic(publicRoot, response, url.pathname);
695
+ } catch (error) {
696
+ sendError(response, error);
697
+ }
698
+ });
699
+ Object.defineProperty(server, "workflowManagerSessionToken", { value: sessionToken, enumerable: false });
700
+ return server;
701
+ }
702
+
703
+ function openBrowser(url) {
704
+ const command = process.platform === "win32"
705
+ ? ["cmd", ["/c", "start", "", url]]
706
+ : process.platform === "darwin"
707
+ ? ["open", [url]]
708
+ : ["xdg-open", [url]];
709
+ try {
710
+ spawn(command[0], command[1], {
711
+ detached: true,
712
+ stdio: "ignore",
713
+ windowsHide: true,
714
+ }).unref();
715
+ } catch {
716
+ // The returned loopback URL remains usable without a desktop opener.
717
+ }
718
+ }
719
+
720
+ export async function runWorkflowManagerCommand(packageRoot, projectRoot, action, options = {}) {
721
+ if (action === "inspect") return buildWorkflowManagerProjection(projectRoot);
722
+ if (new Set(["list", "show", "export"]).has(action)) {
723
+ if (!options.resource) throw new WorkflowManagerError("resource-required", `${action} requires --resource`, 400);
724
+ return queryWorkflowManagerResource(projectRoot, options.resource, options);
725
+ }
726
+ if (action === "action") {
727
+ if (!options.actionName) throw new WorkflowManagerError("action-required", "manager action requires an action name", 400);
728
+ return executeWorkflowManagerAction(projectRoot, options.actionName, options.input || {}, options);
729
+ }
730
+ if (action !== "serve") throw new Error("manager requires action inspect or serve.");
731
+ const port = Number(options.port || 4180);
732
+ if (!Number.isInteger(port) || port < 1 || port > 65535 || port === 80) {
733
+ throw new Error("Workflow Manager port must be an integer from 1 to 65535 and cannot be 80.");
734
+ }
735
+ const host = "127.0.0.1";
736
+ const server = createWorkflowManagerServer(packageRoot, projectRoot, options);
737
+ await new Promise((resolve, reject) => {
738
+ server.once("error", reject);
739
+ server.listen(port, host, resolve);
740
+ });
741
+ const address = server.address();
742
+ const url = `http://${host}:${address.port}/?session=${encodeURIComponent(server.workflowManagerSessionToken)}`;
743
+ if (options.open !== false) (options.browserOpener || openBrowser)(url);
744
+ return { server, report: { action: "serve", url, project_root: path.resolve(projectRoot) } };
745
+ }