@openflowjs/cli 0.2.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 (403) hide show
  1. package/dist/bin/openflow.d.ts +2 -0
  2. package/dist/bin/openflow.js +8 -0
  3. package/dist/bin/openflow.js.map +1 -0
  4. package/dist/commands/config.d.ts +2 -0
  5. package/dist/commands/config.js +38 -0
  6. package/dist/commands/config.js.map +1 -0
  7. package/dist/commands/flow.d.ts +1 -0
  8. package/dist/commands/flow.js +119 -0
  9. package/dist/commands/flow.js.map +1 -0
  10. package/dist/commands/init.d.ts +2 -0
  11. package/dist/commands/init.js +1082 -0
  12. package/dist/commands/init.js.map +1 -0
  13. package/dist/commands/iteration.d.ts +1 -0
  14. package/dist/commands/iteration.js +131 -0
  15. package/dist/commands/iteration.js.map +1 -0
  16. package/dist/commands/mcp.d.ts +1 -0
  17. package/dist/commands/mcp.js +12 -0
  18. package/dist/commands/mcp.js.map +1 -0
  19. package/dist/commands/module.d.ts +1 -0
  20. package/dist/commands/module.js +137 -0
  21. package/dist/commands/module.js.map +1 -0
  22. package/dist/commands/plan.d.ts +1 -0
  23. package/dist/commands/plan.js +111 -0
  24. package/dist/commands/plan.js.map +1 -0
  25. package/dist/commands/plugin.d.ts +1 -0
  26. package/dist/commands/plugin.js +246 -0
  27. package/dist/commands/plugin.js.map +1 -0
  28. package/dist/commands/preflight.d.ts +8 -0
  29. package/dist/commands/preflight.js +57 -0
  30. package/dist/commands/preflight.js.map +1 -0
  31. package/dist/commands/review.d.ts +1 -0
  32. package/dist/commands/review.js +145 -0
  33. package/dist/commands/review.js.map +1 -0
  34. package/dist/commands/state.d.ts +1 -0
  35. package/dist/commands/state.js +28 -0
  36. package/dist/commands/state.js.map +1 -0
  37. package/dist/commands/validate.d.ts +1 -0
  38. package/dist/commands/validate.js +310 -0
  39. package/dist/commands/validate.js.map +1 -0
  40. package/dist/core/artifacts.d.ts +140 -0
  41. package/dist/core/artifacts.js +809 -0
  42. package/dist/core/artifacts.js.map +1 -0
  43. package/dist/core/index.d.ts +12 -0
  44. package/dist/core/index.js +27 -0
  45. package/dist/core/index.js.map +1 -0
  46. package/dist/core-artifacts/marketplace.json +14 -0
  47. package/dist/core-artifacts/modules.json +20 -0
  48. package/dist/core-artifacts/openflow/.claude-plugin/plugin.json +8 -0
  49. package/dist/core-artifacts/openflow/.mcp.json +9 -0
  50. package/dist/core-artifacts/openflow/agents/openflow-artifact-reviewer.md +308 -0
  51. package/dist/core-artifacts/openflow/agents/openflow-code-reviewer.md +177 -0
  52. package/dist/core-artifacts/openflow/agents/openflow-executor-deep.md +119 -0
  53. package/dist/core-artifacts/openflow/agents/openflow-executor-general.md +104 -0
  54. package/dist/core-artifacts/openflow/agents/openflow-executor-quick.md +93 -0
  55. package/dist/core-artifacts/openflow/agents/openflow-explorer.md +69 -0
  56. package/dist/core-artifacts/openflow/agents/openflow-knowledge-curator.md +89 -0
  57. package/dist/core-artifacts/openflow/commands/knowledge.md +102 -0
  58. package/dist/core-artifacts/openflow/hooks/hooks.json +33 -0
  59. package/dist/core-artifacts/openflow/scripts/openflow-drift-guard.cjs +54 -0
  60. package/dist/core-artifacts/openflow/scripts/openflow-evidence-reminder.cjs +64 -0
  61. package/dist/core-artifacts/openflow/scripts/openflow-mcp-review.cjs +27 -0
  62. package/dist/core-artifacts/openflow/scripts/openflow-write-guard.cjs +27 -0
  63. package/dist/core-artifacts/openflow/scripts/session-start.cjs +12 -0
  64. package/dist/core-artifacts/openflow/skills/brainstorm/SKILL.md +131 -0
  65. package/dist/core-artifacts/openflow/skills/cli-reference/SKILL.md +196 -0
  66. package/dist/core-artifacts/openflow/skills/finalize/SKILL.md +109 -0
  67. package/dist/core-artifacts/openflow/skills/finalize/references/summary-template.md +39 -0
  68. package/dist/core-artifacts/openflow/skills/implement/SKILL.md +296 -0
  69. package/dist/core-artifacts/openflow/skills/implement/references/working-memory.md +49 -0
  70. package/dist/core-artifacts/openflow/skills/knowledge-retrieval/SKILL.md +78 -0
  71. package/dist/core-artifacts/openflow/skills/prd/SKILL.md +173 -0
  72. package/dist/core-artifacts/openflow/skills/prd/references/level-routing.md +94 -0
  73. package/dist/core-artifacts/openflow/skills/prd/references/prd-template.md +187 -0
  74. package/dist/core-artifacts/openflow/skills/prd/references/wireframe-template.html +122 -0
  75. package/dist/core-artifacts/openflow/skills/spec/SKILL.md +341 -0
  76. package/dist/core-artifacts/openflow/skills/spec/references/context-template.md +38 -0
  77. package/dist/core-artifacts/openflow/skills/spec/references/plan-template.md +61 -0
  78. package/dist/core-artifacts/openflow/skills/spec/references/spec-template.md +187 -0
  79. package/dist/core-artifacts/openflow/skills/spec/references/tasks-template.md +99 -0
  80. package/dist/core-artifacts/openflow/skills/workflow-governance/SKILL.md +384 -0
  81. package/dist/core-artifacts/openflow/skills/workflow-governance/references/knowledge-schema.md +241 -0
  82. package/dist/core-artifacts/openflow/skills/workflow-governance/references/state-files.md +148 -0
  83. package/dist/core-artifacts/openflow/skills/workflow-governance/references/workflow.md +119 -0
  84. package/dist/core-artifacts/templates/.gitkeep +0 -0
  85. package/dist/index.d.ts +4 -0
  86. package/dist/index.js +5 -0
  87. package/dist/index.js.map +1 -0
  88. package/dist/mcp/review-mcp-server.d.ts +1 -0
  89. package/dist/mcp/review-mcp-server.js +191 -0
  90. package/dist/mcp/review-mcp-server.js.map +1 -0
  91. package/dist/mcp/review-server.d.ts +33 -0
  92. package/dist/mcp/review-server.js +340 -0
  93. package/dist/mcp/review-server.js.map +1 -0
  94. package/dist/mcp/review-ui/assets/arc-DH58vMfF.js +1 -0
  95. package/dist/mcp/review-ui/assets/architecture-YZFGNWBL-CW8o5JQi.js +1 -0
  96. package/dist/mcp/review-ui/assets/architectureDiagram-Q4EWVU46-CH35GquJ.js +36 -0
  97. package/dist/mcp/review-ui/assets/array-BCJ35G43.js +1 -0
  98. package/dist/mcp/review-ui/assets/blockDiagram-DXYQGD6D-B1JZnKG_.js +132 -0
  99. package/dist/mcp/review-ui/assets/c4Diagram-AHTNJAMY-DCAtnxWd.js +10 -0
  100. package/dist/mcp/review-ui/assets/channel-BgHR4NPf.js +1 -0
  101. package/dist/mcp/review-ui/assets/chunk-2KRD3SAO-BkEfK915.js +1 -0
  102. package/dist/mcp/review-ui/assets/chunk-4BX2VUAB-Dn9kswJO.js +1 -0
  103. package/dist/mcp/review-ui/assets/chunk-4TB4RGXK-DbeI3ZO6.js +206 -0
  104. package/dist/mcp/review-ui/assets/chunk-55IACEB6-CLBoivXU.js +1 -0
  105. package/dist/mcp/review-ui/assets/chunk-5FUZZQ4R-DU7La6QA.js +62 -0
  106. package/dist/mcp/review-ui/assets/chunk-5PVQY5BW-Dy3eUu9a.js +2 -0
  107. package/dist/mcp/review-ui/assets/chunk-67CJDMHE-BKQ4iYAM.js +1 -0
  108. package/dist/mcp/review-ui/assets/chunk-7N4EOEYR-CUngSlME.js +1 -0
  109. package/dist/mcp/review-ui/assets/chunk-AA7GKIK3-BClDbXxt.js +1 -0
  110. package/dist/mcp/review-ui/assets/chunk-BSJP7CBP-BlpmbHL-.js +1 -0
  111. package/dist/mcp/review-ui/assets/chunk-CIAEETIT-THpBXcoN.js +1 -0
  112. package/dist/mcp/review-ui/assets/chunk-Dlc7tRH4.js +1 -0
  113. package/dist/mcp/review-ui/assets/chunk-EDXVE4YY-DNUlHz7M.js +1 -0
  114. package/dist/mcp/review-ui/assets/chunk-ENJZ2VHE-fwEKj0pQ.js +10 -0
  115. package/dist/mcp/review-ui/assets/chunk-FMBD7UC4-Cj8B2TLo.js +15 -0
  116. package/dist/mcp/review-ui/assets/chunk-FOC6F5B3-BtR_JW_A.js +1 -0
  117. package/dist/mcp/review-ui/assets/chunk-ICPOFSXX-WTr3HDYE.js +122 -0
  118. package/dist/mcp/review-ui/assets/chunk-K5T4RW27-vtP3ehR7.js +94 -0
  119. package/dist/mcp/review-ui/assets/chunk-KGLVRYIC-Di2tkB7O.js +1 -0
  120. package/dist/mcp/review-ui/assets/chunk-LIHQZDEY-DoHl9hYE.js +1 -0
  121. package/dist/mcp/review-ui/assets/chunk-ORNJ4GCN-Bff-Vc2X.js +1 -0
  122. package/dist/mcp/review-ui/assets/chunk-OYMX7WX6-Djey8TrX.js +231 -0
  123. package/dist/mcp/review-ui/assets/chunk-QZHKN3VN-C4w1Z4n9.js +1 -0
  124. package/dist/mcp/review-ui/assets/chunk-U2HBQHQK-D8HUikvJ.js +70 -0
  125. package/dist/mcp/review-ui/assets/chunk-X2U36JSP-CuZ-SN2r.js +1 -0
  126. package/dist/mcp/review-ui/assets/chunk-YZCP3GAM-D0-dHF3G.js +1 -0
  127. package/dist/mcp/review-ui/assets/chunk-ZZ45TVLE-C1aIZGDA.js +1 -0
  128. package/dist/mcp/review-ui/assets/classDiagram-6PBFFD2Q-DHrSK7zx.js +1 -0
  129. package/dist/mcp/review-ui/assets/classDiagram-v2-HSJHXN6E-ftN8ECVk.js +1 -0
  130. package/dist/mcp/review-ui/assets/clone-C3rjhi9V.js +1 -0
  131. package/dist/mcp/review-ui/assets/cose-bilkent-S5V4N54A-szpqu_3d.js +1 -0
  132. package/dist/mcp/review-ui/assets/cytoscape.esm-DZ22BVwz.js +321 -0
  133. package/dist/mcp/review-ui/assets/dagre-B4oIQbi5.js +1 -0
  134. package/dist/mcp/review-ui/assets/dagre-KV5264BT-zDsxU5-B.js +4 -0
  135. package/dist/mcp/review-ui/assets/defaultLocale-CIS5GEjP.js +1 -0
  136. package/dist/mcp/review-ui/assets/diagram-5BDNPKRD-UgfFjZ4o.js +10 -0
  137. package/dist/mcp/review-ui/assets/diagram-G4DWMVQ6-Wh9VCn50.js +24 -0
  138. package/dist/mcp/review-ui/assets/diagram-MMDJMWI5-xVD3G7_9.js +43 -0
  139. package/dist/mcp/review-ui/assets/diagram-TYMM5635-AUD291P2.js +24 -0
  140. package/dist/mcp/review-ui/assets/dist-B51l2n-9.js +1 -0
  141. package/dist/mcp/review-ui/assets/erDiagram-SMLLAGMA-B83D6NXm.js +85 -0
  142. package/dist/mcp/review-ui/assets/flatten-B80WBwOJ.js +1 -0
  143. package/dist/mcp/review-ui/assets/flowDiagram-DWJPFMVM-D3lXOeHD.js +162 -0
  144. package/dist/mcp/review-ui/assets/ganttDiagram-T4ZO3ILL-CFAN903o.js +292 -0
  145. package/dist/mcp/review-ui/assets/gitGraph-7Q5UKJZL-BfgkNWmC.js +1 -0
  146. package/dist/mcp/review-ui/assets/gitGraphDiagram-UUTBAWPF-DxqTOi4I.js +106 -0
  147. package/dist/mcp/review-ui/assets/graphlib-De-foo_H.js +1 -0
  148. package/dist/mcp/review-ui/assets/identity-CWMh0UL-.js +1 -0
  149. package/dist/mcp/review-ui/assets/index-Do0fBEfH.css +2 -0
  150. package/dist/mcp/review-ui/assets/index-uPMLqduV.js +123 -0
  151. package/dist/mcp/review-ui/assets/info-OMHHGYJF-DE18zZ5Z.js +1 -0
  152. package/dist/mcp/review-ui/assets/infoDiagram-42DDH7IO-Bnco1OGr.js +2 -0
  153. package/dist/mcp/review-ui/assets/init-BMBYmmUa.js +1 -0
  154. package/dist/mcp/review-ui/assets/ishikawaDiagram-UXIWVN3A-B89fugr9.js +70 -0
  155. package/dist/mcp/review-ui/assets/journeyDiagram-VCZTEJTY-CMx2w_is.js +139 -0
  156. package/dist/mcp/review-ui/assets/kanban-definition-6JOO6SKY-YvTOD1Vd.js +89 -0
  157. package/dist/mcp/review-ui/assets/katex-8mXVa4k3.js +257 -0
  158. package/dist/mcp/review-ui/assets/line-BCdBO-oK.js +1 -0
  159. package/dist/mcp/review-ui/assets/linear-d7UHSQqm.js +1 -0
  160. package/dist/mcp/review-ui/assets/mermaid-parser.core-DI1-3xL2.js +4 -0
  161. package/dist/mcp/review-ui/assets/mindmap-definition-QFDTVHPH-E_mV-_Fs.js +96 -0
  162. package/dist/mcp/review-ui/assets/ordinal-BDTCIhXR.js +1 -0
  163. package/dist/mcp/review-ui/assets/packet-4T2RLAQJ-BLPGKWDX.js +1 -0
  164. package/dist/mcp/review-ui/assets/path-CIRGLb_6.js +1 -0
  165. package/dist/mcp/review-ui/assets/pie-ZZUOXDRM-DVV6Yua9.js +1 -0
  166. package/dist/mcp/review-ui/assets/pieDiagram-DEJITSTG-Ct4JvywP.js +30 -0
  167. package/dist/mcp/review-ui/assets/quadrantDiagram-34T5L4WZ-BSFYvc1U.js +7 -0
  168. package/dist/mcp/review-ui/assets/radar-PYXPWWZC-BMkQDLKp.js +1 -0
  169. package/dist/mcp/review-ui/assets/reduce-C80XcylQ.js +1 -0
  170. package/dist/mcp/review-ui/assets/requirementDiagram-MS252O5E-Bp7uSYEK.js +84 -0
  171. package/dist/mcp/review-ui/assets/rough.esm-DtEqI08j.js +1 -0
  172. package/dist/mcp/review-ui/assets/sankeyDiagram-XADWPNL6-CV38ZpSv.js +10 -0
  173. package/dist/mcp/review-ui/assets/sequenceDiagram-FGHM5R23-BXN9jl1N.js +157 -0
  174. package/dist/mcp/review-ui/assets/src-Cxc1bu7b.js +1 -0
  175. package/dist/mcp/review-ui/assets/stateDiagram-FHFEXIEX-DZduDkIw.js +1 -0
  176. package/dist/mcp/review-ui/assets/stateDiagram-v2-QKLJ7IA2-xAWOcxSi.js +1 -0
  177. package/dist/mcp/review-ui/assets/timeline-definition-GMOUNBTQ-CLqXzNm8.js +120 -0
  178. package/dist/mcp/review-ui/assets/treeView-SZITEDCU-tPcANHUc.js +1 -0
  179. package/dist/mcp/review-ui/assets/treemap-W4RFUUIX-BGbXISSk.js +1 -0
  180. package/dist/mcp/review-ui/assets/vennDiagram-DHZGUBPP-gCnd0IYN.js +34 -0
  181. package/dist/mcp/review-ui/assets/wardley-RL74JXVD-CK3EfklM.js +1 -0
  182. package/dist/mcp/review-ui/assets/wardleyDiagram-NUSXRM2D-Dd7qMlPS.js +20 -0
  183. package/dist/mcp/review-ui/assets/xychartDiagram-5P7HB3ND-DXHXO8Zm.js +7 -0
  184. package/dist/mcp/review-ui/index.html +29 -0
  185. package/dist/mcp/studio/assets/arc-DH58vMfF.js +1 -0
  186. package/dist/mcp/studio/assets/architecture-YZFGNWBL-8xrwD39F.js +1 -0
  187. package/dist/mcp/studio/assets/architectureDiagram-Q4EWVU46-VmcLZTJf.js +36 -0
  188. package/dist/mcp/studio/assets/array-BCJ35G43.js +1 -0
  189. package/dist/mcp/studio/assets/blockDiagram-DXYQGD6D-D-1mlLYy.js +132 -0
  190. package/dist/mcp/studio/assets/c4Diagram-AHTNJAMY-DCAtnxWd.js +10 -0
  191. package/dist/mcp/studio/assets/channel-BgHR4NPf.js +1 -0
  192. package/dist/mcp/studio/assets/chunk-2KRD3SAO-CMDQx2WD.js +1 -0
  193. package/dist/mcp/studio/assets/chunk-4BX2VUAB-Dn9kswJO.js +1 -0
  194. package/dist/mcp/studio/assets/chunk-4TB4RGXK-aFEYGDkJ.js +206 -0
  195. package/dist/mcp/studio/assets/chunk-55IACEB6-CLBoivXU.js +1 -0
  196. package/dist/mcp/studio/assets/chunk-5FUZZQ4R-DU7La6QA.js +62 -0
  197. package/dist/mcp/studio/assets/chunk-5PVQY5BW-Dy3eUu9a.js +2 -0
  198. package/dist/mcp/studio/assets/chunk-67CJDMHE-DnkyJt7A.js +1 -0
  199. package/dist/mcp/studio/assets/chunk-7N4EOEYR-cnJ9dWSC.js +1 -0
  200. package/dist/mcp/studio/assets/chunk-AA7GKIK3-DjCZnyrT.js +1 -0
  201. package/dist/mcp/studio/assets/chunk-BSJP7CBP-BlpmbHL-.js +1 -0
  202. package/dist/mcp/studio/assets/chunk-CIAEETIT-CtvXSBsf.js +1 -0
  203. package/dist/mcp/studio/assets/chunk-Dlc7tRH4.js +1 -0
  204. package/dist/mcp/studio/assets/chunk-EDXVE4YY-DNUlHz7M.js +1 -0
  205. package/dist/mcp/studio/assets/chunk-ENJZ2VHE-fwEKj0pQ.js +10 -0
  206. package/dist/mcp/studio/assets/chunk-FMBD7UC4-Cj8B2TLo.js +15 -0
  207. package/dist/mcp/studio/assets/chunk-FOC6F5B3-Ca28VADd.js +1 -0
  208. package/dist/mcp/studio/assets/chunk-ICPOFSXX-WTr3HDYE.js +122 -0
  209. package/dist/mcp/studio/assets/chunk-K5T4RW27-pqiOLnBn.js +94 -0
  210. package/dist/mcp/studio/assets/chunk-KGLVRYIC-DZfGlR-G.js +1 -0
  211. package/dist/mcp/studio/assets/chunk-LIHQZDEY-6Ygb8Kwt.js +1 -0
  212. package/dist/mcp/studio/assets/chunk-ORNJ4GCN-DSlr7oSO.js +1 -0
  213. package/dist/mcp/studio/assets/chunk-OYMX7WX6-8z_2lCb3.js +231 -0
  214. package/dist/mcp/studio/assets/chunk-QZHKN3VN-C4w1Z4n9.js +1 -0
  215. package/dist/mcp/studio/assets/chunk-U2HBQHQK-D8HUikvJ.js +70 -0
  216. package/dist/mcp/studio/assets/chunk-X2U36JSP-CuZ-SN2r.js +1 -0
  217. package/dist/mcp/studio/assets/chunk-YZCP3GAM-D0-dHF3G.js +1 -0
  218. package/dist/mcp/studio/assets/chunk-ZZ45TVLE-C1aIZGDA.js +1 -0
  219. package/dist/mcp/studio/assets/classDiagram-6PBFFD2Q-IZXxqxqM.js +1 -0
  220. package/dist/mcp/studio/assets/classDiagram-v2-HSJHXN6E-BiJKwTXT.js +1 -0
  221. package/dist/mcp/studio/assets/clone-g4CuF1Hf.js +1 -0
  222. package/dist/mcp/studio/assets/cose-bilkent-S5V4N54A-szpqu_3d.js +1 -0
  223. package/dist/mcp/studio/assets/cytoscape.esm-DZ22BVwz.js +321 -0
  224. package/dist/mcp/studio/assets/dagre-Be9o0OzC.js +1 -0
  225. package/dist/mcp/studio/assets/dagre-KV5264BT-iB6PnHLr.js +4 -0
  226. package/dist/mcp/studio/assets/defaultLocale-CIS5GEjP.js +1 -0
  227. package/dist/mcp/studio/assets/diagram-5BDNPKRD-BLfWbiEB.js +10 -0
  228. package/dist/mcp/studio/assets/diagram-G4DWMVQ6-CgcnwgVO.js +24 -0
  229. package/dist/mcp/studio/assets/diagram-MMDJMWI5-CpkXvs2p.js +43 -0
  230. package/dist/mcp/studio/assets/diagram-TYMM5635-guxqmxjJ.js +24 -0
  231. package/dist/mcp/studio/assets/dist-B51l2n-9.js +1 -0
  232. package/dist/mcp/studio/assets/erDiagram-SMLLAGMA-Lwv-cC2Y.js +85 -0
  233. package/dist/mcp/studio/assets/flatten-Dv3Z_7XJ.js +1 -0
  234. package/dist/mcp/studio/assets/flowDiagram-DWJPFMVM-BKnaFfFR.js +162 -0
  235. package/dist/mcp/studio/assets/ganttDiagram-T4ZO3ILL-CFAN903o.js +292 -0
  236. package/dist/mcp/studio/assets/gitGraph-7Q5UKJZL-BSdEZNVc.js +1 -0
  237. package/dist/mcp/studio/assets/gitGraphDiagram-UUTBAWPF-D4z4QWni.js +106 -0
  238. package/dist/mcp/studio/assets/graphlib-C1IZi4Cg.js +1 -0
  239. package/dist/mcp/studio/assets/identity-CWMh0UL-.js +1 -0
  240. package/dist/mcp/studio/assets/index-CyBqHDpB.js +109 -0
  241. package/dist/mcp/studio/assets/index-Dn_Ujmba.css +2 -0
  242. package/dist/mcp/studio/assets/info-OMHHGYJF-CoTx64p3.js +1 -0
  243. package/dist/mcp/studio/assets/infoDiagram-42DDH7IO-QEji23sQ.js +2 -0
  244. package/dist/mcp/studio/assets/init-BMBYmmUa.js +1 -0
  245. package/dist/mcp/studio/assets/ishikawaDiagram-UXIWVN3A-lMurmqul.js +70 -0
  246. package/dist/mcp/studio/assets/journeyDiagram-VCZTEJTY-CMx2w_is.js +139 -0
  247. package/dist/mcp/studio/assets/kanban-definition-6JOO6SKY-DsOybLrS.js +89 -0
  248. package/dist/mcp/studio/assets/katex-8mXVa4k3.js +257 -0
  249. package/dist/mcp/studio/assets/line-BCdBO-oK.js +1 -0
  250. package/dist/mcp/studio/assets/linear-d7UHSQqm.js +1 -0
  251. package/dist/mcp/studio/assets/mermaid-parser.core-BZtTt4qJ.js +4 -0
  252. package/dist/mcp/studio/assets/mindmap-definition-QFDTVHPH-B2yfABR9.js +96 -0
  253. package/dist/mcp/studio/assets/ordinal-BDTCIhXR.js +1 -0
  254. package/dist/mcp/studio/assets/packet-4T2RLAQJ-Bi4IG7s8.js +1 -0
  255. package/dist/mcp/studio/assets/path-CIRGLb_6.js +1 -0
  256. package/dist/mcp/studio/assets/pie-ZZUOXDRM-DsJRjVcu.js +1 -0
  257. package/dist/mcp/studio/assets/pieDiagram-DEJITSTG-JeKGFs3r.js +30 -0
  258. package/dist/mcp/studio/assets/quadrantDiagram-34T5L4WZ-BSFYvc1U.js +7 -0
  259. package/dist/mcp/studio/assets/radar-PYXPWWZC-cUDYP2Ic.js +1 -0
  260. package/dist/mcp/studio/assets/reduce-x-wchVXY.js +1 -0
  261. package/dist/mcp/studio/assets/requirementDiagram-MS252O5E-CGeLKQyn.js +84 -0
  262. package/dist/mcp/studio/assets/rough.esm-DtEqI08j.js +1 -0
  263. package/dist/mcp/studio/assets/sankeyDiagram-XADWPNL6-CV38ZpSv.js +10 -0
  264. package/dist/mcp/studio/assets/sequenceDiagram-FGHM5R23-BbHPv3l1.js +157 -0
  265. package/dist/mcp/studio/assets/src-Cxc1bu7b.js +1 -0
  266. package/dist/mcp/studio/assets/stateDiagram-FHFEXIEX-BuBuguzn.js +1 -0
  267. package/dist/mcp/studio/assets/stateDiagram-v2-QKLJ7IA2-PQA-rl9o.js +1 -0
  268. package/dist/mcp/studio/assets/timeline-definition-GMOUNBTQ-D5xtyNE9.js +120 -0
  269. package/dist/mcp/studio/assets/treeView-SZITEDCU-DhRx0eaI.js +1 -0
  270. package/dist/mcp/studio/assets/treemap-W4RFUUIX-Btsj9DUH.js +1 -0
  271. package/dist/mcp/studio/assets/vennDiagram-DHZGUBPP-W4g15SMY.js +34 -0
  272. package/dist/mcp/studio/assets/wardley-RL74JXVD-BTpKsgl7.js +1 -0
  273. package/dist/mcp/studio/assets/wardleyDiagram-NUSXRM2D-f7wgXdwe.js +20 -0
  274. package/dist/mcp/studio/assets/xychartDiagram-5P7HB3ND-BWx9swPf.js +7 -0
  275. package/dist/mcp/studio/index.html +29 -0
  276. package/dist/review-mcp-server.d.ts +1 -0
  277. package/dist/review-mcp-server.js +178 -0
  278. package/dist/review-mcp-server.js.map +1 -0
  279. package/dist/review-server.d.ts +17 -0
  280. package/dist/review-server.js +223 -0
  281. package/dist/review-server.js.map +1 -0
  282. package/dist/review-ui/assets/arc-DH58vMfF.js +1 -0
  283. package/dist/review-ui/assets/architecture-YZFGNWBL-ChakYgFO.js +1 -0
  284. package/dist/review-ui/assets/architectureDiagram-Q4EWVU46-CcJOZCOb.js +36 -0
  285. package/dist/review-ui/assets/array-BCJ35G43.js +1 -0
  286. package/dist/review-ui/assets/blockDiagram-DXYQGD6D-H7mMv5Tv.js +132 -0
  287. package/dist/review-ui/assets/c4Diagram-AHTNJAMY-DCAtnxWd.js +10 -0
  288. package/dist/review-ui/assets/channel-BgHR4NPf.js +1 -0
  289. package/dist/review-ui/assets/chunk-2KRD3SAO-BfA3IkPQ.js +1 -0
  290. package/dist/review-ui/assets/chunk-4BX2VUAB-Dn9kswJO.js +1 -0
  291. package/dist/review-ui/assets/chunk-4TB4RGXK-CvTeZi33.js +206 -0
  292. package/dist/review-ui/assets/chunk-55IACEB6-CLBoivXU.js +1 -0
  293. package/dist/review-ui/assets/chunk-5FUZZQ4R-DU7La6QA.js +62 -0
  294. package/dist/review-ui/assets/chunk-5PVQY5BW-Dy3eUu9a.js +2 -0
  295. package/dist/review-ui/assets/chunk-67CJDMHE-BQ1xNHFx.js +1 -0
  296. package/dist/review-ui/assets/chunk-7N4EOEYR-B1ORNLQP.js +1 -0
  297. package/dist/review-ui/assets/chunk-AA7GKIK3-D3pS3mnx.js +1 -0
  298. package/dist/review-ui/assets/chunk-BSJP7CBP-BlpmbHL-.js +1 -0
  299. package/dist/review-ui/assets/chunk-CIAEETIT-BDZkAY47.js +1 -0
  300. package/dist/review-ui/assets/chunk-Dlc7tRH4.js +1 -0
  301. package/dist/review-ui/assets/chunk-EDXVE4YY-DNUlHz7M.js +1 -0
  302. package/dist/review-ui/assets/chunk-ENJZ2VHE-fwEKj0pQ.js +10 -0
  303. package/dist/review-ui/assets/chunk-FMBD7UC4-Cj8B2TLo.js +15 -0
  304. package/dist/review-ui/assets/chunk-FOC6F5B3-DGtCX5Ra.js +1 -0
  305. package/dist/review-ui/assets/chunk-ICPOFSXX-WTr3HDYE.js +122 -0
  306. package/dist/review-ui/assets/chunk-K5T4RW27-CWpdECLF.js +94 -0
  307. package/dist/review-ui/assets/chunk-KGLVRYIC-oI2XKaPz.js +1 -0
  308. package/dist/review-ui/assets/chunk-LIHQZDEY-Dzp3G35O.js +1 -0
  309. package/dist/review-ui/assets/chunk-ORNJ4GCN-DsHuVbPU.js +1 -0
  310. package/dist/review-ui/assets/chunk-OYMX7WX6-fgjoXAXJ.js +231 -0
  311. package/dist/review-ui/assets/chunk-QZHKN3VN-C4w1Z4n9.js +1 -0
  312. package/dist/review-ui/assets/chunk-U2HBQHQK-D8HUikvJ.js +70 -0
  313. package/dist/review-ui/assets/chunk-X2U36JSP-CuZ-SN2r.js +1 -0
  314. package/dist/review-ui/assets/chunk-YZCP3GAM-D0-dHF3G.js +1 -0
  315. package/dist/review-ui/assets/chunk-ZZ45TVLE-C1aIZGDA.js +1 -0
  316. package/dist/review-ui/assets/classDiagram-6PBFFD2Q-D_3LhkJc.js +1 -0
  317. package/dist/review-ui/assets/classDiagram-v2-HSJHXN6E-DQRUREh5.js +1 -0
  318. package/dist/review-ui/assets/clone-BZMtGzbS.js +1 -0
  319. package/dist/review-ui/assets/cose-bilkent-S5V4N54A-szpqu_3d.js +1 -0
  320. package/dist/review-ui/assets/cytoscape.esm-DZ22BVwz.js +321 -0
  321. package/dist/review-ui/assets/dagre-BfNtd34y.js +1 -0
  322. package/dist/review-ui/assets/dagre-KV5264BT-D6PbxORW.js +4 -0
  323. package/dist/review-ui/assets/defaultLocale-CIS5GEjP.js +1 -0
  324. package/dist/review-ui/assets/diagram-5BDNPKRD-BNAXBDig.js +10 -0
  325. package/dist/review-ui/assets/diagram-G4DWMVQ6-CIGS_5yQ.js +24 -0
  326. package/dist/review-ui/assets/diagram-MMDJMWI5-DJmcU2xZ.js +43 -0
  327. package/dist/review-ui/assets/diagram-TYMM5635-DW8XzrAz.js +24 -0
  328. package/dist/review-ui/assets/dist-B51l2n-9.js +1 -0
  329. package/dist/review-ui/assets/erDiagram-SMLLAGMA-BfUNH8zz.js +85 -0
  330. package/dist/review-ui/assets/flatten-BHh95bpO.js +1 -0
  331. package/dist/review-ui/assets/flowDiagram-DWJPFMVM-qgnlSvEC.js +162 -0
  332. package/dist/review-ui/assets/ganttDiagram-T4ZO3ILL-CFAN903o.js +292 -0
  333. package/dist/review-ui/assets/gitGraph-7Q5UKJZL-Dn47XunR.js +1 -0
  334. package/dist/review-ui/assets/gitGraphDiagram-UUTBAWPF-BcG6fDsE.js +106 -0
  335. package/dist/review-ui/assets/graphlib-Cie4kcbC.js +1 -0
  336. package/dist/review-ui/assets/identity-CWMh0UL-.js +1 -0
  337. package/dist/review-ui/assets/index-ByplNhhd.css +2 -0
  338. package/dist/review-ui/assets/index-S7nbpFp2.js +123 -0
  339. package/dist/review-ui/assets/info-OMHHGYJF-hAukP1xW.js +1 -0
  340. package/dist/review-ui/assets/infoDiagram-42DDH7IO-FblTAfC3.js +2 -0
  341. package/dist/review-ui/assets/init-BMBYmmUa.js +1 -0
  342. package/dist/review-ui/assets/ishikawaDiagram-UXIWVN3A-BA7dJd-J.js +70 -0
  343. package/dist/review-ui/assets/journeyDiagram-VCZTEJTY-CMx2w_is.js +139 -0
  344. package/dist/review-ui/assets/kanban-definition-6JOO6SKY-CFiOZCrT.js +89 -0
  345. package/dist/review-ui/assets/katex-8mXVa4k3.js +257 -0
  346. package/dist/review-ui/assets/line-BCdBO-oK.js +1 -0
  347. package/dist/review-ui/assets/linear-d7UHSQqm.js +1 -0
  348. package/dist/review-ui/assets/mermaid-parser.core-BHMXLuNx.js +4 -0
  349. package/dist/review-ui/assets/mindmap-definition-QFDTVHPH-CWO7vDqu.js +96 -0
  350. package/dist/review-ui/assets/ordinal-BDTCIhXR.js +1 -0
  351. package/dist/review-ui/assets/packet-4T2RLAQJ-Btz3ryW7.js +1 -0
  352. package/dist/review-ui/assets/path-CIRGLb_6.js +1 -0
  353. package/dist/review-ui/assets/pie-ZZUOXDRM-CreBtuDj.js +1 -0
  354. package/dist/review-ui/assets/pieDiagram-DEJITSTG-X2mFk5I3.js +30 -0
  355. package/dist/review-ui/assets/quadrantDiagram-34T5L4WZ-BSFYvc1U.js +7 -0
  356. package/dist/review-ui/assets/radar-PYXPWWZC-BcAPYMpV.js +1 -0
  357. package/dist/review-ui/assets/reduce-14YNCNxn.js +1 -0
  358. package/dist/review-ui/assets/requirementDiagram-MS252O5E-CDv1lxdq.js +84 -0
  359. package/dist/review-ui/assets/rough.esm-DtEqI08j.js +1 -0
  360. package/dist/review-ui/assets/sankeyDiagram-XADWPNL6-CV38ZpSv.js +10 -0
  361. package/dist/review-ui/assets/sequenceDiagram-FGHM5R23-DCuV_bhx.js +157 -0
  362. package/dist/review-ui/assets/src-Cxc1bu7b.js +1 -0
  363. package/dist/review-ui/assets/stateDiagram-FHFEXIEX-BfE_bGUQ.js +1 -0
  364. package/dist/review-ui/assets/stateDiagram-v2-QKLJ7IA2-u1yKXWoz.js +1 -0
  365. package/dist/review-ui/assets/timeline-definition-GMOUNBTQ-Ci0uFxaT.js +120 -0
  366. package/dist/review-ui/assets/treeView-SZITEDCU-BXg6-7zY.js +1 -0
  367. package/dist/review-ui/assets/treemap-W4RFUUIX-BToYbgol.js +1 -0
  368. package/dist/review-ui/assets/vennDiagram-DHZGUBPP-DvOuThac.js +34 -0
  369. package/dist/review-ui/assets/wardley-RL74JXVD-BAYzkcK-.js +1 -0
  370. package/dist/review-ui/assets/wardleyDiagram-NUSXRM2D-YxTu6WZw.js +20 -0
  371. package/dist/review-ui/assets/xychartDiagram-5P7HB3ND-V9j-Dl7t.js +7 -0
  372. package/dist/review-ui/index.html +29 -0
  373. package/dist/run-openflow-cli.d.ts +1 -0
  374. package/dist/run-openflow-cli.js +41 -0
  375. package/dist/run-openflow-cli.js.map +1 -0
  376. package/dist/shared/args.d.ts +3 -0
  377. package/dist/shared/args.js +27 -0
  378. package/dist/shared/args.js.map +1 -0
  379. package/dist/shared/browser.d.ts +4 -0
  380. package/dist/shared/browser.js +17 -0
  381. package/dist/shared/browser.js.map +1 -0
  382. package/dist/shared/fs.d.ts +15 -0
  383. package/dist/shared/fs.js +48 -0
  384. package/dist/shared/fs.js.map +1 -0
  385. package/dist/shared/i18n.d.ts +5 -0
  386. package/dist/shared/i18n.js +65 -0
  387. package/dist/shared/i18n.js.map +1 -0
  388. package/dist/shared/locales/en-US.json +88 -0
  389. package/dist/shared/locales/zh-CN.json +88 -0
  390. package/dist/shared/plugin-registry.d.ts +36 -0
  391. package/dist/shared/plugin-registry.js +51 -0
  392. package/dist/shared/plugin-registry.js.map +1 -0
  393. package/dist/shared/project-state.d.ts +17 -0
  394. package/dist/shared/project-state.js +75 -0
  395. package/dist/shared/project-state.js.map +1 -0
  396. package/dist/shared/terminal.d.ts +10 -0
  397. package/dist/shared/terminal.js +110 -0
  398. package/dist/shared/terminal.js.map +1 -0
  399. package/package.json +28 -0
  400. package/templates/archive/.gitkeep +1 -0
  401. package/templates/config.json +11 -0
  402. package/templates/current.json +3 -0
  403. package/templates/iterations/.gitkeep +1 -0
@@ -0,0 +1,191 @@
1
+ import { existsSync } from "node:fs";
2
+ import { readFile } from "node:fs/promises";
3
+ import { join } from "node:path";
4
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
5
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
6
+ import { z } from "zod";
7
+ import { startReviewServer } from "./review-server.js";
8
+ const sessions = new Map();
9
+ const reviewModeSchema = z.enum(["spec", "prd", "dashboard"]);
10
+ export async function runReviewMcpServer() {
11
+ const server = new McpServer({
12
+ name: "openflow-studio",
13
+ version: "0.2.0"
14
+ });
15
+ registerReviewTools(server);
16
+ const transport = new StdioServerTransport();
17
+ await server.connect(transport);
18
+ process.stdin.resume();
19
+ try {
20
+ await waitForStdinClose();
21
+ }
22
+ finally {
23
+ await closeAllSessions();
24
+ await server.close();
25
+ }
26
+ }
27
+ async function waitForStdinClose() {
28
+ await new Promise((resolve, reject) => {
29
+ const cleanup = () => {
30
+ process.stdin.off("close", resolveOnce);
31
+ process.stdin.off("end", resolveOnce);
32
+ process.stdin.off("error", rejectOnce);
33
+ };
34
+ const resolveOnce = () => {
35
+ cleanup();
36
+ resolve();
37
+ };
38
+ const rejectOnce = (error) => {
39
+ cleanup();
40
+ reject(error);
41
+ };
42
+ process.stdin.once("close", resolveOnce);
43
+ process.stdin.once("end", resolveOnce);
44
+ process.stdin.once("error", rejectOnce);
45
+ });
46
+ }
47
+ function registerReviewTools(server) {
48
+ server.registerTool("openflow_studio_launch", {
49
+ description: "Launch the OpenFlow Studio site for the current project. " +
50
+ "In 'dashboard' mode (default) shows live iteration progress, stage, and task completion — no review submission. " +
51
+ "In 'spec' or 'prd' mode, the Studio shows the corresponding artifact for human review and submission. " +
52
+ "Call this at the start of any spec/implement/finalize flow to give the user a live view. " +
53
+ "Returns { sessionId, url } — show the URL to the user.",
54
+ inputSchema: {
55
+ flowPath: z.string().min(1).describe("Path to .openflow root or iteration folder.").optional(),
56
+ mode: reviewModeSchema.describe("'dashboard' for progress view (default), 'spec' or 'prd' for review.").optional(),
57
+ port: z.number().int().min(0).max(65535).describe("Local HTTP port; defaults to 3456. Use 0 for auto-assign.").optional(),
58
+ timeoutMinutes: z.number().min(0).describe("Minutes of inactivity before auto-close. 0 = disabled. Defaults to 60 for dashboard.").optional()
59
+ }
60
+ }, async (args) => textResult(await startReview({ ...args, mode: args.mode ?? "dashboard" })));
61
+ server.registerTool("openflow_review_start", {
62
+ description: "Launch the OpenFlow Studio in review mode for an iteration. Returns a sessionId and browser URL. " +
63
+ "Show the URL to the user and ask them to open it and submit a review (approve or request changes). " +
64
+ "After calling this, call openflow_review_wait with the returned sessionId to block until submission. " +
65
+ "Use flowPath=.openflow/iterations/<iteration-id> and mode=spec, or flowPath=.openflow/prds/<id> and mode=prd.",
66
+ inputSchema: {
67
+ flowPath: z.string().min(1).describe("Path to the iteration folder, e.g. .openflow/iterations/2026-05-10-my-feature").optional(),
68
+ flow: z.string().min(1).describe("Alias for flowPath (either one is accepted).").optional(),
69
+ mode: z.enum(["spec", "prd"]).describe("Review mode: spec for iterations or prd for product requirement review.").optional(),
70
+ port: z.number().int().min(0).max(65535).describe("Local HTTP port; defaults to 3456. Use 0 for auto-assign.").optional(),
71
+ timeoutMinutes: z.number().min(0).describe("Minutes of inactivity before the server auto-closes. 0 = disabled. Defaults to 30.").optional()
72
+ }
73
+ }, async (args) => textResult(await startReview(args)));
74
+ server.registerTool("openflow_review_wait", {
75
+ description: "Block until the user submits a review in the Review UI for the given sessionId. " +
76
+ "Returns the full review result. By default closes the UI session after submission (closeOnSubmit defaults to true). " +
77
+ "Always call this after openflow_review_start; do not poll — this call resolves only when the user submits.",
78
+ inputSchema: {
79
+ sessionId: z.string().min(1).describe("The sessionId returned by openflow_review_start."),
80
+ closeOnSubmit: z.boolean().describe("Close the server after submission (default true).").optional()
81
+ }
82
+ }, async (args) => textResult(await waitForReview(args)));
83
+ server.registerTool("openflow_review_get_result", {
84
+ description: "Read the most recently submitted review from disk without waiting. " +
85
+ "Returns { review: null } if no review has been submitted yet. " +
86
+ "Use this to inspect a prior review rather than waiting for a new submission.",
87
+ inputSchema: {
88
+ flowPath: z.string().min(1).describe("Path to the iteration folder.").optional(),
89
+ flow: z.string().min(1).describe("Alias for flowPath.").optional(),
90
+ mode: reviewModeSchema.describe("Which review file to read: spec or prd.").optional()
91
+ }
92
+ }, async (args) => textResult(await getReviewResult(args)));
93
+ server.registerTool("openflow_review_close", {
94
+ description: "Close a running Review UI session and shut down its HTTP server. " +
95
+ "Use this to clean up a session that will not receive a submission, or when the user cancels the review.",
96
+ inputSchema: {
97
+ sessionId: z.string().min(1).describe("The sessionId returned by openflow_review_start.")
98
+ }
99
+ }, async (args) => textResult(await closeReview(args)));
100
+ }
101
+ async function startReview(args) {
102
+ const flowPath = args.flowPath ?? args.flow ?? ".openflow";
103
+ const mode = args.mode ?? "spec";
104
+ const port = args.port ?? 3456;
105
+ const idleTimeoutMs = (args.timeoutMinutes ?? 30) * 60 * 1000;
106
+ const runningServer = await startReviewServer({ flowPath, mode, port, idleTimeoutMs });
107
+ const sessionId = `review-${Date.now()}-${sessions.size + 1}`;
108
+ sessions.set(sessionId, {
109
+ id: sessionId,
110
+ flowPath,
111
+ mode,
112
+ runningServer
113
+ });
114
+ return {
115
+ sessionId,
116
+ url: runningServer.url,
117
+ flowPath,
118
+ mode
119
+ };
120
+ }
121
+ async function waitForReview(args) {
122
+ const closeOnSubmit = args.closeOnSubmit ?? true;
123
+ const session = requireSession(args.sessionId);
124
+ let review;
125
+ try {
126
+ review = await session.runningServer.waitForReview();
127
+ }
128
+ catch (error) {
129
+ sessions.delete(args.sessionId);
130
+ throw error;
131
+ }
132
+ if (closeOnSubmit) {
133
+ await closeSession(args.sessionId);
134
+ }
135
+ return {
136
+ sessionId: args.sessionId,
137
+ flowPath: session.flowPath,
138
+ mode: session.mode,
139
+ review
140
+ };
141
+ }
142
+ async function getReviewResult(args) {
143
+ const flowPath = args.flowPath ?? args.flow ?? ".openflow";
144
+ const mode = args.mode ?? "spec";
145
+ const reviewPath = join(flowPath, "reviews", mode === "prd" ? "prd-review.json" : "spec-review.json");
146
+ if (!existsSync(reviewPath)) {
147
+ return {
148
+ flowPath,
149
+ mode,
150
+ review: null
151
+ };
152
+ }
153
+ return {
154
+ flowPath,
155
+ mode,
156
+ review: JSON.parse(await readFile(reviewPath, "utf8"))
157
+ };
158
+ }
159
+ async function closeReview(args) {
160
+ await closeSession(args.sessionId);
161
+ return { sessionId: args.sessionId, closed: true };
162
+ }
163
+ async function closeSession(sessionId) {
164
+ const session = requireSession(sessionId);
165
+ sessions.delete(sessionId);
166
+ await session.runningServer.close();
167
+ }
168
+ async function closeAllSessions() {
169
+ const sessionIds = Array.from(sessions.keys());
170
+ for (const sessionId of sessionIds) {
171
+ await closeSession(sessionId);
172
+ }
173
+ }
174
+ function requireSession(sessionId) {
175
+ const session = sessions.get(sessionId);
176
+ if (!session) {
177
+ throw new Error(`Unknown review session: ${sessionId}`);
178
+ }
179
+ return session;
180
+ }
181
+ function textResult(value) {
182
+ return {
183
+ content: [
184
+ {
185
+ type: "text",
186
+ text: JSON.stringify(value, null, 2)
187
+ }
188
+ ]
189
+ };
190
+ }
191
+ //# sourceMappingURL=review-mcp-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-mcp-server.js","sourceRoot":"","sources":["../../src/mcp/review-mcp-server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ import { type Server } from "node:http";
2
+ export type ReviewMode = "spec" | "dashboard" | "prd";
3
+ export interface ReviewServerOptions {
4
+ flowPath: string;
5
+ mode: ReviewMode;
6
+ port: number;
7
+ host?: string;
8
+ /** Milliseconds of inactivity before the server auto-closes. 0 = disabled. Default: 30 min. */
9
+ idleTimeoutMs?: number;
10
+ }
11
+ export interface RunningReviewServer {
12
+ server: Server;
13
+ url: string;
14
+ waitForReview: () => Promise<unknown>;
15
+ close: () => Promise<void>;
16
+ }
17
+ /** Dashboard status payload — always-available summary of current flow state. */
18
+ export interface DashboardStatus {
19
+ flowPath: string;
20
+ activeIteration: string | null;
21
+ stage: string | null;
22
+ gate: string | null;
23
+ title: string | null;
24
+ revision: number | null;
25
+ level: number | null;
26
+ taskSummary: {
27
+ total: number;
28
+ completed: number;
29
+ pending: number;
30
+ } | null;
31
+ lastUpdated: string;
32
+ }
33
+ export declare function startReviewServer(options: ReviewServerOptions): Promise<RunningReviewServer>;
@@ -0,0 +1,340 @@
1
+ import { createServer } from "node:http";
2
+ import { existsSync } from "node:fs";
3
+ import { appendFile, mkdir, readFile, writeFile } from "node:fs/promises";
4
+ import { dirname, extname, join, relative, resolve, sep } from "node:path";
5
+ import { fileURLToPath } from "node:url";
6
+ import { validateReviewResult } from "../core/index.js";
7
+ import { collectFiles, isRecord } from "../shared/fs.js";
8
+ const MIME_TYPES = {
9
+ ".css": "text/css; charset=utf-8",
10
+ ".html": "text/html; charset=utf-8",
11
+ ".js": "text/javascript; charset=utf-8",
12
+ ".json": "application/json; charset=utf-8",
13
+ ".map": "application/json; charset=utf-8",
14
+ ".md": "text/plain; charset=utf-8",
15
+ ".svg": "image/svg+xml"
16
+ };
17
+ export async function startReviewServer(options) {
18
+ const staticRoot = getReviewUiStaticRoot();
19
+ const host = options.host ?? "127.0.0.1";
20
+ const idleTimeoutMs = options.idleTimeoutMs ?? 30 * 60 * 1000;
21
+ const resolvedOptions = {
22
+ ...options,
23
+ flowPath: await resolveReviewFlowPath(options.flowPath)
24
+ };
25
+ let submitReview = () => { };
26
+ let rejectReview = () => { };
27
+ let timeoutHandle;
28
+ const submittedReview = new Promise((resolve, reject) => {
29
+ submitReview = (review) => {
30
+ if (timeoutHandle !== undefined) {
31
+ clearTimeout(timeoutHandle);
32
+ timeoutHandle = undefined;
33
+ }
34
+ resolve(review);
35
+ };
36
+ rejectReview = reject;
37
+ });
38
+ const server = createServer((request, response) => {
39
+ handleRequest(request, response, resolvedOptions, staticRoot, submitReview).catch((error) => {
40
+ sendJson(response, 500, {
41
+ error: error instanceof Error ? error.message : String(error)
42
+ });
43
+ });
44
+ });
45
+ await new Promise((resolve, reject) => {
46
+ server.once("error", reject);
47
+ server.listen(options.port, host, () => {
48
+ server.off("error", reject);
49
+ resolve();
50
+ });
51
+ });
52
+ const address = server.address();
53
+ const actualPort = typeof address === "object" && address ? address.port : options.port;
54
+ if (idleTimeoutMs > 0) {
55
+ timeoutHandle = setTimeout(() => {
56
+ timeoutHandle = undefined;
57
+ rejectReview(new Error(`Review session timed out after ${Math.round(idleTimeoutMs / 60000)} min of inactivity`));
58
+ server.close();
59
+ }, idleTimeoutMs);
60
+ timeoutHandle.unref();
61
+ }
62
+ const close = () => {
63
+ if (timeoutHandle !== undefined) {
64
+ clearTimeout(timeoutHandle);
65
+ timeoutHandle = undefined;
66
+ }
67
+ return new Promise((resolve, reject) => {
68
+ server.close((error) => {
69
+ if (error) {
70
+ reject(error);
71
+ return;
72
+ }
73
+ resolve();
74
+ });
75
+ });
76
+ };
77
+ return {
78
+ server,
79
+ url: `http://${host}:${actualPort}`,
80
+ waitForReview: () => submittedReview,
81
+ close
82
+ };
83
+ }
84
+ async function handleRequest(request, response, options, staticRoot, onReviewSubmitted) {
85
+ const url = new URL(request.url ?? "/", "http://localhost");
86
+ // CORS headers for local dev
87
+ response.setHeader("Access-Control-Allow-Origin", "*");
88
+ response.setHeader("Access-Control-Allow-Methods", "GET, PUT, OPTIONS");
89
+ response.setHeader("Access-Control-Allow-Headers", "Content-Type");
90
+ if (request.method === "OPTIONS") {
91
+ response.writeHead(204);
92
+ response.end();
93
+ return;
94
+ }
95
+ if (request.method === "GET" && url.pathname === "/healthz") {
96
+ sendJson(response, 200, { ok: true });
97
+ return;
98
+ }
99
+ if (request.method === "GET" && url.pathname === "/api/flow") {
100
+ sendJson(response, 200, await readFlowPayload(options));
101
+ return;
102
+ }
103
+ if (request.method === "GET" && url.pathname === "/api/status") {
104
+ sendJson(response, 200, await readDashboardStatus(options.flowPath));
105
+ return;
106
+ }
107
+ if (request.method === "PUT" && url.pathname === "/api/review") {
108
+ const body = await readRequestJson(request);
109
+ // Only allow review submission when mode is spec or prd, not dashboard.
110
+ if (options.mode === "dashboard") {
111
+ sendJson(response, 400, { error: "review submission not available in dashboard mode" });
112
+ return;
113
+ }
114
+ const reviewPath = getReviewPath(options.flowPath, options.mode);
115
+ const validation = validateReviewResult(body, relative(options.flowPath, reviewPath));
116
+ if (!validation.valid) {
117
+ sendJson(response, 400, validation);
118
+ return;
119
+ }
120
+ await mkdir(dirname(reviewPath), { recursive: true });
121
+ const reviewJson = `${JSON.stringify(body, null, 2)}\n`;
122
+ await writeFile(reviewPath, reviewJson, "utf8");
123
+ await appendFile(join(options.flowPath, "reviews", "history.jsonl"), JSON.stringify(body), "utf8");
124
+ await appendFile(join(options.flowPath, "reviews", "history.jsonl"), "\n", "utf8");
125
+ sendJson(response, 200, { ok: true });
126
+ onReviewSubmitted(body);
127
+ return;
128
+ }
129
+ // PRD assets static file serving — but only if not a built studio asset (which also lives under /assets/)
130
+ if (request.method === "GET" && url.pathname.startsWith("/assets/")) {
131
+ // Built studio assets (Vite chunks) take priority; serve them directly.
132
+ const staticAssetPath = resolve(staticRoot, `.${url.pathname}`);
133
+ const staticRelPath = relative(staticRoot, staticAssetPath);
134
+ if (!staticRelPath.startsWith("..") && !staticRelPath.includes(`..${sep}`) && existsSync(staticAssetPath)) {
135
+ await serveStatic(response, staticRoot, url.pathname);
136
+ return;
137
+ }
138
+ const assetsDir = join(options.flowPath, "assets");
139
+ const assetPath = resolve(assetsDir, `.${url.pathname.replace("/assets/", "/")}`);
140
+ const relativePath = relative(assetsDir, assetPath);
141
+ if (relativePath.startsWith("..") || relativePath.includes(`..${sep}`)) {
142
+ sendJson(response, 403, { error: "forbidden" });
143
+ return;
144
+ }
145
+ if (!existsSync(assetPath)) {
146
+ sendJson(response, 404, { error: "not found" });
147
+ return;
148
+ }
149
+ const content = await readFile(assetPath);
150
+ const contentType = MIME_TYPES[extname(assetPath)] ?? "application/octet-stream";
151
+ response.writeHead(200, { "content-type": contentType });
152
+ response.end(content);
153
+ return;
154
+ }
155
+ if (request.method !== "GET") {
156
+ sendJson(response, 405, { error: "method not allowed" });
157
+ return;
158
+ }
159
+ await serveStatic(response, staticRoot, url.pathname);
160
+ }
161
+ async function readFlowPayload(options) {
162
+ const flow = await readOptionalJson(join(options.flowPath, "flow.json"));
163
+ let activeRevision = isRecord(flow) && typeof flow.revision === "number" ? flow.revision : null;
164
+ // For PRD mode, read revision from prd.json if flow.json is absent
165
+ if (activeRevision === null && options.mode === "prd") {
166
+ const prdJson = await readOptionalJson(join(options.flowPath, "prd.json"));
167
+ if (isRecord(prdJson) && typeof prdJson.revision === "number") {
168
+ activeRevision = prdJson.revision;
169
+ }
170
+ }
171
+ // Only read the review file if its revision matches the current flow revision (prevents stale state)
172
+ const effectiveReviewMode = options.mode === "dashboard" ? "spec" : options.mode;
173
+ const rawReview = await readOptionalJson(getReviewPath(options.flowPath, effectiveReviewMode));
174
+ const review = isRecord(rawReview) && activeRevision !== null && typeof rawReview.revision === "number" && rawReview.revision !== activeRevision ? null : rawReview;
175
+ // PRD mode: read prd.md and list assets
176
+ let prd = null;
177
+ let prdAssets;
178
+ if (options.mode === "prd") {
179
+ prd = await readOptionalText(join(options.flowPath, "prd.md"));
180
+ const assetsDir = join(options.flowPath, "assets");
181
+ if (existsSync(assetsDir)) {
182
+ const assetFiles = await collectFiles(assetsDir);
183
+ prdAssets = assetFiles.map((f) => relative(assetsDir, f));
184
+ }
185
+ else {
186
+ const prdJson = await readOptionalJson(join(options.flowPath, "prd.json"));
187
+ if (isRecord(prdJson) && Array.isArray(prdJson.assets)) {
188
+ prdAssets = prdJson.assets.map((a) => a.replace(/^assets\//, ""));
189
+ }
190
+ }
191
+ }
192
+ return {
193
+ mode: options.mode,
194
+ flowPath: options.flowPath,
195
+ activeRevision,
196
+ artifacts: {
197
+ flow,
198
+ state: await readOptionalText(join(options.flowPath, "STATE.md")),
199
+ spec: await readOptionalText(join(options.flowPath, "SPEC.md")),
200
+ context: await readOptionalText(join(options.flowPath, "CONTEXT.md")),
201
+ tasks: await readOptionalText(join(options.flowPath, "TASKS.md")),
202
+ plan: await readOptionalText(join(options.flowPath, "PLAN.md")),
203
+ review,
204
+ reviewHistory: await readReviewHistory(options.flowPath),
205
+ summary: await readOptionalText(join(options.flowPath, "SUMMARY.md")),
206
+ prd,
207
+ prdAssets,
208
+ extensions: await readExtensionResults(options.flowPath)
209
+ }
210
+ };
211
+ }
212
+ async function readDashboardStatus(flowPath) {
213
+ const rootPath = flowPath.endsWith("current.json") ? dirname(flowPath) : flowPath;
214
+ const currentPath = join(rootPath, "current.json");
215
+ const current = existsSync(currentPath) ? await readOptionalJson(currentPath) : null;
216
+ const activeIteration = isRecord(current) && typeof current.activeIteration === "string" ? current.activeIteration : null;
217
+ let iterPath = rootPath;
218
+ if (activeIteration) {
219
+ const candidate = join(rootPath, "iterations", activeIteration);
220
+ if (existsSync(candidate)) {
221
+ iterPath = candidate;
222
+ }
223
+ }
224
+ const flow = await readOptionalJson(join(iterPath, "flow.json"));
225
+ const tasksText = await readOptionalText(join(iterPath, "TASKS.md"));
226
+ let taskSummary = null;
227
+ if (tasksText) {
228
+ const checkboxes = tasksText.match(/- \[[ x]\]/g) ?? [];
229
+ const completed = checkboxes.filter((c) => c === "- [x]").length;
230
+ taskSummary = { total: checkboxes.length, completed, pending: checkboxes.length - completed };
231
+ }
232
+ return {
233
+ flowPath: rootPath,
234
+ activeIteration,
235
+ stage: isRecord(flow) && typeof flow.stage === "string" ? flow.stage : null,
236
+ gate: isRecord(flow) && typeof flow.gate === "string" ? flow.gate : null,
237
+ title: isRecord(flow) && typeof flow.title === "string" ? flow.title : null,
238
+ revision: isRecord(flow) && typeof flow.revision === "number" ? flow.revision : null,
239
+ level: isRecord(flow) && typeof flow.level === "number" ? flow.level : null,
240
+ taskSummary,
241
+ lastUpdated: new Date().toISOString()
242
+ };
243
+ }
244
+ async function resolveReviewFlowPath(flowPath) {
245
+ if (existsSync(join(flowPath, "flow.json"))) {
246
+ return flowPath;
247
+ }
248
+ if (existsSync(join(flowPath, "prd.json"))) {
249
+ return flowPath;
250
+ }
251
+ const currentPath = join(flowPath, "current.json");
252
+ if (!existsSync(currentPath)) {
253
+ return flowPath;
254
+ }
255
+ const current = await readOptionalJson(currentPath);
256
+ if (!isRecord(current) || typeof current.activeIteration !== "string" || current.activeIteration.trim().length === 0) {
257
+ return flowPath;
258
+ }
259
+ const iterationPath = join(flowPath, "iterations", current.activeIteration);
260
+ return existsSync(iterationPath) ? iterationPath : flowPath;
261
+ }
262
+ async function readReviewHistory(flowPath) {
263
+ const historyPath = join(flowPath, "reviews", "history.jsonl");
264
+ if (!existsSync(historyPath)) {
265
+ return [];
266
+ }
267
+ const text = await readFile(historyPath, "utf8");
268
+ const entries = [];
269
+ for (const line of text.split("\n")) {
270
+ const trimmed = line.trim();
271
+ if (!trimmed)
272
+ continue;
273
+ try {
274
+ entries.push(JSON.parse(trimmed));
275
+ }
276
+ catch { /* skip malformed lines */ }
277
+ }
278
+ return entries;
279
+ }
280
+ async function readExtensionResults(flowPath) {
281
+ const extensionRoot = join(flowPath, "extensions");
282
+ if (!existsSync(extensionRoot)) {
283
+ return [];
284
+ }
285
+ const files = await collectFiles(extensionRoot);
286
+ const results = [];
287
+ for (const file of files) {
288
+ if (!file.endsWith("result.json")) {
289
+ continue;
290
+ }
291
+ results.push({
292
+ path: file,
293
+ result: await readOptionalJson(file)
294
+ });
295
+ }
296
+ return results;
297
+ }
298
+ async function serveStatic(response, staticRoot, requestPath) {
299
+ const normalizedPath = requestPath === "/" ? "/index.html" : requestPath;
300
+ const filePath = resolve(staticRoot, `.${normalizedPath}`);
301
+ const relativePath = relative(staticRoot, filePath);
302
+ if (relativePath.startsWith("..") || relativePath.includes(`..${sep}`)) {
303
+ sendJson(response, 403, { error: "forbidden" });
304
+ return;
305
+ }
306
+ const targetPath = existsSync(filePath) ? filePath : join(staticRoot, "index.html");
307
+ const content = await readFile(targetPath);
308
+ const contentType = MIME_TYPES[extname(targetPath)] ?? "application/octet-stream";
309
+ response.writeHead(200, { "content-type": contentType });
310
+ response.end(content);
311
+ }
312
+ async function readRequestJson(request) {
313
+ const chunks = [];
314
+ for await (const chunk of request) {
315
+ chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));
316
+ }
317
+ return JSON.parse(Buffer.concat(chunks).toString("utf8"));
318
+ }
319
+ async function readOptionalText(path) {
320
+ if (!existsSync(path)) {
321
+ return null;
322
+ }
323
+ return readFile(path, "utf8");
324
+ }
325
+ async function readOptionalJson(path) {
326
+ const text = await readOptionalText(path);
327
+ return text === null ? null : JSON.parse(text);
328
+ }
329
+ function sendJson(response, statusCode, body) {
330
+ response.writeHead(statusCode, { "content-type": "application/json; charset=utf-8" });
331
+ response.end(JSON.stringify(body, null, 2));
332
+ }
333
+ function getReviewUiStaticRoot() {
334
+ return join(dirname(fileURLToPath(import.meta.url)), "studio");
335
+ }
336
+ function getReviewPath(flowPath, mode) {
337
+ const reviewFile = mode === "spec" ? "spec-review.json" : "prd-review.json";
338
+ return join(flowPath, "reviews", reviewFile);
339
+ }
340
+ //# sourceMappingURL=review-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-server.js","sourceRoot":"","sources":["../../src/mcp/review-server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ import{n as e,t}from"./path-CIRGLb_6.js";import{a as n,c as r,d as i,f as a,i as o,l as s,m as c,n as l,o as u,p as d,r as f,u as p}from"./dist-B51l2n-9.js";function m(e){return e.innerRadius}function h(e){return e.outerRadius}function g(e){return e.startAngle}function _(e){return e.endAngle}function v(e){return e&&e.padAngle}function y(e,t,n,r,i,a,o,s){var c=n-e,l=r-t,u=o-i,d=s-a,f=d*c-u*l;if(!(f*f<1e-12))return f=(u*(t-a)-d*(e-i))/f,[e+f*c,t+f*l]}function b(e,t,n,r,i,a,o){var c=e-n,l=t-r,u=(o?a:-a)/d(c*c+l*l),f=u*l,p=-u*c,m=e+f,h=t+p,g=n+f,_=r+p,v=(m+g)/2,y=(h+_)/2,b=g-m,x=_-h,S=b*b+x*x,C=i-a,w=m*_-g*h,T=(x<0?-1:1)*d(s(0,C*C*S-w*w)),E=(w*x-b*T)/S,D=(-w*b-x*T)/S,O=(w*x+b*T)/S,k=(-w*b+x*T)/S,A=E-v,j=D-y,M=O-v,N=k-y;return A*A+j*j>M*M+N*N&&(E=O,D=k),{cx:E,cy:D,x01:-f,y01:-p,x11:E*(i/C-1),y11:D*(i/C-1)}}function x(){var s=m,x=h,S=e(0),C=null,w=g,T=_,E=v,D=null,O=t(k);function k(){var e,t,m=+s.apply(this,arguments),h=+x.apply(this,arguments),g=w.apply(this,arguments)-r,_=T.apply(this,arguments)-r,v=l(_-g),k=_>g;if(D||=e=O(),h<m&&(t=h,h=m,m=t),!(h>1e-12))D.moveTo(0,0);else if(v>c-1e-12)D.moveTo(h*u(g),h*a(g)),D.arc(0,0,h,g,_,!k),m>1e-12&&(D.moveTo(m*u(_),m*a(_)),D.arc(0,0,m,_,g,k));else{var A=g,j=_,M=g,N=_,P=v,F=v,I=E.apply(this,arguments)/2,L=I>1e-12&&(C?+C.apply(this,arguments):d(m*m+h*h)),R=p(l(h-m)/2,+S.apply(this,arguments)),z=R,B=R,V,H;if(L>1e-12){var U=o(L/m*a(I)),W=o(L/h*a(I));(P-=U*2)>1e-12?(U*=k?1:-1,M+=U,N-=U):(P=0,M=N=(g+_)/2),(F-=W*2)>1e-12?(W*=k?1:-1,A+=W,j-=W):(F=0,A=j=(g+_)/2)}var G=h*u(A),K=h*a(A),q=m*u(N),J=m*a(N);if(R>1e-12){var Y=h*u(j),X=h*a(j),Z=m*u(M),Q=m*a(M),$;if(v<i)if($=y(G,K,Z,Q,Y,X,q,J)){var ee=G-$[0],te=K-$[1],ne=Y-$[0],re=X-$[1],ie=1/a(f((ee*ne+te*re)/(d(ee*ee+te*te)*d(ne*ne+re*re)))/2),ae=d($[0]*$[0]+$[1]*$[1]);z=p(R,(m-ae)/(ie-1)),B=p(R,(h-ae)/(ie+1))}else z=B=0}F>1e-12?B>1e-12?(V=b(Z,Q,G,K,h,B,k),H=b(Y,X,q,J,h,B,k),D.moveTo(V.cx+V.x01,V.cy+V.y01),B<R?D.arc(V.cx,V.cy,B,n(V.y01,V.x01),n(H.y01,H.x01),!k):(D.arc(V.cx,V.cy,B,n(V.y01,V.x01),n(V.y11,V.x11),!k),D.arc(0,0,h,n(V.cy+V.y11,V.cx+V.x11),n(H.cy+H.y11,H.cx+H.x11),!k),D.arc(H.cx,H.cy,B,n(H.y11,H.x11),n(H.y01,H.x01),!k))):(D.moveTo(G,K),D.arc(0,0,h,A,j,!k)):D.moveTo(G,K),!(m>1e-12)||!(P>1e-12)?D.lineTo(q,J):z>1e-12?(V=b(q,J,Y,X,m,-z,k),H=b(G,K,Z,Q,m,-z,k),D.lineTo(V.cx+V.x01,V.cy+V.y01),z<R?D.arc(V.cx,V.cy,z,n(V.y01,V.x01),n(H.y01,H.x01),!k):(D.arc(V.cx,V.cy,z,n(V.y01,V.x01),n(V.y11,V.x11),!k),D.arc(0,0,m,n(V.cy+V.y11,V.cx+V.x11),n(H.cy+H.y11,H.cx+H.x11),k),D.arc(H.cx,H.cy,z,n(H.y11,H.x11),n(H.y01,H.x01),!k))):D.arc(0,0,m,N,M,k)}if(D.closePath(),e)return D=null,e+``||null}return k.centroid=function(){var e=(+s.apply(this,arguments)+ +x.apply(this,arguments))/2,t=(+w.apply(this,arguments)+ +T.apply(this,arguments))/2-i/2;return[u(t)*e,a(t)*e]},k.innerRadius=function(t){return arguments.length?(s=typeof t==`function`?t:e(+t),k):s},k.outerRadius=function(t){return arguments.length?(x=typeof t==`function`?t:e(+t),k):x},k.cornerRadius=function(t){return arguments.length?(S=typeof t==`function`?t:e(+t),k):S},k.padRadius=function(t){return arguments.length?(C=t==null?null:typeof t==`function`?t:e(+t),k):C},k.startAngle=function(t){return arguments.length?(w=typeof t==`function`?t:e(+t),k):w},k.endAngle=function(t){return arguments.length?(T=typeof t==`function`?t:e(+t),k):T},k.padAngle=function(t){return arguments.length?(E=typeof t==`function`?t:e(+t),k):E},k.context=function(e){return arguments.length?(D=e??null,k):D},k}export{x as t};
@@ -0,0 +1 @@
1
+ import"./chunk-K5T4RW27-vtP3ehR7.js";import{n as e}from"./chunk-7N4EOEYR-CUngSlME.js";export{e as createArchitectureServices};