@codemcp/workflows 5.3.0 → 6.0.1

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 (451) hide show
  1. package/README.md +91 -0
  2. package/package.json +77 -17
  3. package/packages/cli/dist/chunk-R5U7XKVJ.js +16 -0
  4. package/packages/cli/dist/chunk-RTDQR2KY.js +6718 -0
  5. package/packages/cli/dist/cli-CZ4FMSWR.js +1421 -0
  6. package/packages/cli/dist/dist-KZOA4GL5.js +65 -0
  7. package/packages/cli/dist/dist-UGVUJIDN.js +14475 -0
  8. package/packages/cli/dist/index.js +21 -0
  9. package/packages/cli/package.json +28 -0
  10. package/packages/core/dist/beads-integration.d.ts +50 -0
  11. package/packages/core/dist/beads-integration.js +387 -0
  12. package/packages/core/dist/beads-integration.js.map +1 -0
  13. package/packages/core/dist/beads-state-manager.d.ts +58 -0
  14. package/packages/core/dist/beads-state-manager.js +212 -0
  15. package/packages/core/dist/beads-state-manager.js.map +1 -0
  16. package/packages/core/dist/config-manager.d.ts +24 -0
  17. package/packages/core/dist/config-manager.js +68 -0
  18. package/packages/core/dist/config-manager.js.map +1 -0
  19. package/packages/core/dist/conversation-manager.d.ts +98 -0
  20. package/packages/core/dist/conversation-manager.js +382 -0
  21. package/packages/core/dist/conversation-manager.js.map +1 -0
  22. package/packages/core/dist/file-detection-manager.d.ts +53 -0
  23. package/packages/core/dist/file-detection-manager.js +221 -0
  24. package/packages/core/dist/file-detection-manager.js.map +1 -0
  25. package/packages/core/dist/file-storage.d.ts +93 -0
  26. package/packages/core/dist/file-storage.js +301 -0
  27. package/packages/core/dist/file-storage.js.map +1 -0
  28. package/packages/core/dist/git-manager.d.ts +22 -0
  29. package/packages/core/dist/git-manager.js +123 -0
  30. package/packages/core/dist/git-manager.js.map +1 -0
  31. package/packages/core/dist/index.d.ts +24 -0
  32. package/packages/core/dist/index.js +31 -0
  33. package/packages/core/dist/index.js.map +1 -0
  34. package/packages/core/dist/instruction-generator.d.ts +40 -0
  35. package/packages/core/dist/instruction-generator.js +89 -0
  36. package/packages/core/dist/instruction-generator.js.map +1 -0
  37. package/packages/core/dist/interaction-logger.d.ts +37 -0
  38. package/packages/core/dist/interaction-logger.js +87 -0
  39. package/packages/core/dist/interaction-logger.js.map +1 -0
  40. package/packages/core/dist/interfaces/index.d.ts +9 -0
  41. package/packages/core/dist/interfaces/index.js +10 -0
  42. package/packages/core/dist/interfaces/index.js.map +1 -0
  43. package/packages/core/dist/interfaces/instruction-generator.interface.d.ts +41 -0
  44. package/packages/core/dist/interfaces/instruction-generator.interface.js +8 -0
  45. package/packages/core/dist/interfaces/instruction-generator.interface.js.map +1 -0
  46. package/packages/core/dist/interfaces/plan-manager.interface.d.ts +55 -0
  47. package/packages/core/dist/interfaces/plan-manager.interface.js +8 -0
  48. package/packages/core/dist/interfaces/plan-manager.interface.js.map +1 -0
  49. package/packages/core/dist/interfaces/task-backend-client.interface.d.ts +52 -0
  50. package/packages/core/dist/interfaces/task-backend-client.interface.js +8 -0
  51. package/packages/core/dist/interfaces/task-backend-client.interface.js.map +1 -0
  52. package/packages/core/dist/logger.d.ts +64 -0
  53. package/packages/core/dist/logger.js +283 -0
  54. package/packages/core/dist/logger.js.map +1 -0
  55. package/packages/core/dist/path-validation-utils.d.ts +75 -0
  56. package/packages/core/dist/path-validation-utils.js +238 -0
  57. package/packages/core/dist/path-validation-utils.js.map +1 -0
  58. package/packages/core/dist/persistence-interface.d.ts +91 -0
  59. package/packages/core/dist/persistence-interface.js +9 -0
  60. package/packages/core/dist/persistence-interface.js.map +1 -0
  61. package/{dist/components/beads/beads-plan-manager.d.ts → packages/core/dist/plan-manager.d.ts} +15 -15
  62. package/{dist/components/beads/beads-plan-manager.js → packages/core/dist/plan-manager.js} +66 -50
  63. package/packages/core/dist/plan-manager.js.map +1 -0
  64. package/packages/core/dist/project-docs-manager.d.ts +119 -0
  65. package/packages/core/dist/project-docs-manager.js +366 -0
  66. package/packages/core/dist/project-docs-manager.js.map +1 -0
  67. package/packages/core/dist/state-machine-loader.d.ts +61 -0
  68. package/packages/core/dist/state-machine-loader.js +273 -0
  69. package/packages/core/dist/state-machine-loader.js.map +1 -0
  70. package/packages/core/dist/state-machine-types.d.ts +64 -0
  71. package/packages/core/dist/state-machine-types.js +7 -0
  72. package/packages/core/dist/state-machine-types.js.map +1 -0
  73. package/packages/core/dist/state-machine.d.ts +52 -0
  74. package/packages/core/dist/state-machine.js +256 -0
  75. package/packages/core/dist/state-machine.js.map +1 -0
  76. package/packages/core/dist/system-prompt-generator.d.ts +14 -0
  77. package/packages/core/dist/system-prompt-generator.js +42 -0
  78. package/packages/core/dist/system-prompt-generator.js.map +1 -0
  79. package/packages/core/dist/task-backend.d.ts +45 -0
  80. package/packages/core/dist/task-backend.js +176 -0
  81. package/packages/core/dist/task-backend.js.map +1 -0
  82. package/packages/core/dist/template-manager.d.ts +61 -0
  83. package/packages/core/dist/template-manager.js +231 -0
  84. package/packages/core/dist/template-manager.js.map +1 -0
  85. package/packages/core/dist/transition-engine.d.ts +77 -0
  86. package/packages/core/dist/transition-engine.js +244 -0
  87. package/packages/core/dist/transition-engine.js.map +1 -0
  88. package/packages/core/dist/types.d.ts +54 -0
  89. package/packages/core/dist/types.js +5 -0
  90. package/packages/core/dist/workflow-manager.d.ts +89 -0
  91. package/packages/core/dist/workflow-manager.js +468 -0
  92. package/packages/core/dist/workflow-manager.js.map +1 -0
  93. package/packages/core/package.json +33 -0
  94. package/packages/docs/.vitepress/dist/.gitignore +2 -0
  95. package/packages/docs/.vitepress/dist/404.html +23 -0
  96. package/packages/docs/.vitepress/dist/assets/app.Dz3lZH3M.js +1 -0
  97. package/packages/docs/.vitepress/dist/assets/chunks/framework.DZS7lpav.js +19 -0
  98. package/packages/docs/.vitepress/dist/assets/chunks/theme.q5Ewb3F1.js +206 -0
  99. package/packages/docs/.vitepress/dist/assets/dev_ARCHITECTURE.md.da_vFDwM.js +130 -0
  100. package/packages/docs/.vitepress/dist/assets/dev_ARCHITECTURE.md.da_vFDwM.lean.js +1 -0
  101. package/packages/docs/.vitepress/dist/assets/dev_DEVELOPMENT.md.DWl9cccE.js +72 -0
  102. package/packages/docs/.vitepress/dist/assets/dev_DEVELOPMENT.md.DWl9cccE.lean.js +1 -0
  103. package/packages/docs/.vitepress/dist/assets/dev_LOGGING.md.BebvbW7z.js +34 -0
  104. package/packages/docs/.vitepress/dist/assets/dev_LOGGING.md.BebvbW7z.lean.js +1 -0
  105. package/packages/docs/.vitepress/dist/assets/dev_PUBLISHING.md.CQqbiIOF.js +1 -0
  106. package/packages/docs/.vitepress/dist/assets/dev_PUBLISHING.md.CQqbiIOF.lean.js +1 -0
  107. package/packages/docs/.vitepress/dist/assets/index.md.D6ROLohf.js +2 -0
  108. package/packages/docs/.vitepress/dist/assets/index.md.D6ROLohf.lean.js +1 -0
  109. package/packages/docs/.vitepress/dist/assets/inter-italic-cyrillic-ext.r48I6akx.woff2 +0 -0
  110. package/packages/docs/.vitepress/dist/assets/inter-italic-cyrillic.By2_1cv3.woff2 +0 -0
  111. package/packages/docs/.vitepress/dist/assets/inter-italic-greek-ext.1u6EdAuj.woff2 +0 -0
  112. package/packages/docs/.vitepress/dist/assets/inter-italic-greek.DJ8dCoTZ.woff2 +0 -0
  113. package/packages/docs/.vitepress/dist/assets/inter-italic-latin-ext.CN1xVJS-.woff2 +0 -0
  114. package/packages/docs/.vitepress/dist/assets/inter-italic-latin.C2AdPX0b.woff2 +0 -0
  115. package/packages/docs/.vitepress/dist/assets/inter-italic-vietnamese.BSbpV94h.woff2 +0 -0
  116. package/packages/docs/.vitepress/dist/assets/inter-roman-cyrillic-ext.BBPuwvHQ.woff2 +0 -0
  117. package/packages/docs/.vitepress/dist/assets/inter-roman-cyrillic.C5lxZ8CY.woff2 +0 -0
  118. package/packages/docs/.vitepress/dist/assets/inter-roman-greek-ext.CqjqNYQ-.woff2 +0 -0
  119. package/packages/docs/.vitepress/dist/assets/inter-roman-greek.BBVDIX6e.woff2 +0 -0
  120. package/packages/docs/.vitepress/dist/assets/inter-roman-latin-ext.4ZJIpNVo.woff2 +0 -0
  121. package/packages/docs/.vitepress/dist/assets/inter-roman-latin.Di8DUHzh.woff2 +0 -0
  122. package/packages/docs/.vitepress/dist/assets/inter-roman-vietnamese.BjW4sHH5.woff2 +0 -0
  123. package/packages/docs/.vitepress/dist/assets/mcp-interaction-pattern.VdvOPuTt.png +0 -0
  124. package/packages/docs/.vitepress/dist/assets/placeholder-demo-greenfield.B8lG_tBI.png +0 -0
  125. package/packages/docs/.vitepress/dist/assets/style.CAgdBzOq.css +1 -0
  126. package/packages/docs/.vitepress/dist/assets/user_advanced-engineering.md.MkETYNtq.js +50 -0
  127. package/packages/docs/.vitepress/dist/assets/user_advanced-engineering.md.MkETYNtq.lean.js +1 -0
  128. package/packages/docs/.vitepress/dist/assets/user_agent-setup.md.B54OLL2H.js +24 -0
  129. package/packages/docs/.vitepress/dist/assets/user_agent-setup.md.B54OLL2H.lean.js +1 -0
  130. package/packages/docs/.vitepress/dist/assets/user_beads-integration.md.BzdR5Fif.js +15 -0
  131. package/packages/docs/.vitepress/dist/assets/user_beads-integration.md.BzdR5Fif.lean.js +1 -0
  132. package/packages/docs/.vitepress/dist/assets/user_crowd-mcp-integration.md.C15kSdIJ.js +157 -0
  133. package/packages/docs/.vitepress/dist/assets/user_crowd-mcp-integration.md.C15kSdIJ.lean.js +1 -0
  134. package/packages/docs/.vitepress/dist/assets/user_custom-workflows.md.Cz4IYCXa.js +143 -0
  135. package/packages/docs/.vitepress/dist/assets/user_custom-workflows.md.Cz4IYCXa.lean.js +1 -0
  136. package/packages/docs/.vitepress/dist/assets/user_git-commit-feature.md.UcTvDR-O.js +1 -0
  137. package/packages/docs/.vitepress/dist/assets/user_git-commit-feature.md.UcTvDR-O.lean.js +1 -0
  138. package/packages/docs/.vitepress/dist/assets/user_how-it-works.md.DiOXNgaL.js +23 -0
  139. package/packages/docs/.vitepress/dist/assets/user_how-it-works.md.DiOXNgaL.lean.js +1 -0
  140. package/packages/docs/.vitepress/dist/assets/user_long-term-memory.md.DZh0tjNa.js +43 -0
  141. package/packages/docs/.vitepress/dist/assets/user_long-term-memory.md.DZh0tjNa.lean.js +1 -0
  142. package/packages/docs/.vitepress/dist/assets/user_packaged-workflows.md.s1HT89ZU.js +2 -0
  143. package/packages/docs/.vitepress/dist/assets/user_packaged-workflows.md.s1HT89ZU.lean.js +1 -0
  144. package/packages/docs/.vitepress/dist/assets/user_tutorial.md.Dmj8zLB2.js +3 -0
  145. package/packages/docs/.vitepress/dist/assets/user_tutorial.md.Dmj8zLB2.lean.js +1 -0
  146. package/packages/docs/.vitepress/dist/assets/user_workflow-selection.md.CrPGw9Hr.js +7 -0
  147. package/packages/docs/.vitepress/dist/assets/user_workflow-selection.md.CrPGw9Hr.lean.js +1 -0
  148. package/packages/docs/.vitepress/dist/assets/workflows.md.Bm5sGt3u.js +1 -0
  149. package/packages/docs/.vitepress/dist/assets/workflows.md.Bm5sGt3u.lean.js +1 -0
  150. package/packages/docs/.vitepress/dist/assets/workflows_adr.md.DEaXkbRp.js +1 -0
  151. package/packages/docs/.vitepress/dist/assets/workflows_adr.md.DEaXkbRp.lean.js +1 -0
  152. package/packages/docs/.vitepress/dist/assets/workflows_big-bang-conversion.md.BA5R1LxZ.js +1 -0
  153. package/packages/docs/.vitepress/dist/assets/workflows_big-bang-conversion.md.BA5R1LxZ.lean.js +1 -0
  154. package/packages/docs/.vitepress/dist/assets/workflows_boundary-testing.md.DBcYnMhx.js +1 -0
  155. package/packages/docs/.vitepress/dist/assets/workflows_boundary-testing.md.DBcYnMhx.lean.js +1 -0
  156. package/packages/docs/.vitepress/dist/assets/workflows_bugfix.md.CZRCL0Hp.js +1 -0
  157. package/packages/docs/.vitepress/dist/assets/workflows_bugfix.md.CZRCL0Hp.lean.js +1 -0
  158. package/packages/docs/.vitepress/dist/assets/workflows_business-analysis.md.fGLml8Hw.js +1 -0
  159. package/packages/docs/.vitepress/dist/assets/workflows_business-analysis.md.fGLml8Hw.lean.js +1 -0
  160. package/packages/docs/.vitepress/dist/assets/workflows_c4-analysis.md.Dnssqzuf.js +1 -0
  161. package/packages/docs/.vitepress/dist/assets/workflows_c4-analysis.md.Dnssqzuf.lean.js +1 -0
  162. package/packages/docs/.vitepress/dist/assets/workflows_epcc.md.M6DnIhpp.js +1 -0
  163. package/packages/docs/.vitepress/dist/assets/workflows_epcc.md.M6DnIhpp.lean.js +1 -0
  164. package/packages/docs/.vitepress/dist/assets/workflows_game-beginner.md.CNxzWLtd.js +1 -0
  165. package/packages/docs/.vitepress/dist/assets/workflows_game-beginner.md.CNxzWLtd.lean.js +1 -0
  166. package/packages/docs/.vitepress/dist/assets/workflows_greenfield.md.vx_g-WOe.js +1 -0
  167. package/packages/docs/.vitepress/dist/assets/workflows_greenfield.md.vx_g-WOe.lean.js +1 -0
  168. package/packages/docs/.vitepress/dist/assets/workflows_minor.md.DdnfwMf4.js +1 -0
  169. package/packages/docs/.vitepress/dist/assets/workflows_minor.md.DdnfwMf4.lean.js +1 -0
  170. package/packages/docs/.vitepress/dist/assets/workflows_posts.md.SOldXvq7.js +1 -0
  171. package/packages/docs/.vitepress/dist/assets/workflows_posts.md.SOldXvq7.lean.js +1 -0
  172. package/packages/docs/.vitepress/dist/assets/workflows_sdd-bugfix-crowd.md.-lSf42gJ.js +1 -0
  173. package/packages/docs/.vitepress/dist/assets/workflows_sdd-bugfix-crowd.md.-lSf42gJ.lean.js +1 -0
  174. package/packages/docs/.vitepress/dist/assets/workflows_sdd-bugfix.md.oRAsEVbc.js +1 -0
  175. package/packages/docs/.vitepress/dist/assets/workflows_sdd-bugfix.md.oRAsEVbc.lean.js +1 -0
  176. package/packages/docs/.vitepress/dist/assets/workflows_sdd-feature-crowd.md.DAtnfCAd.js +1 -0
  177. package/packages/docs/.vitepress/dist/assets/workflows_sdd-feature-crowd.md.DAtnfCAd.lean.js +1 -0
  178. package/packages/docs/.vitepress/dist/assets/workflows_sdd-feature.md.Ce3-H_g3.js +1 -0
  179. package/packages/docs/.vitepress/dist/assets/workflows_sdd-feature.md.Ce3-H_g3.lean.js +1 -0
  180. package/packages/docs/.vitepress/dist/assets/workflows_sdd-greenfield-crowd.md.8DUvcmLe.js +1 -0
  181. package/packages/docs/.vitepress/dist/assets/workflows_sdd-greenfield-crowd.md.8DUvcmLe.lean.js +1 -0
  182. package/packages/docs/.vitepress/dist/assets/workflows_sdd-greenfield.md.eEN6U0J4.js +1 -0
  183. package/packages/docs/.vitepress/dist/assets/workflows_sdd-greenfield.md.eEN6U0J4.lean.js +1 -0
  184. package/packages/docs/.vitepress/dist/assets/workflows_slides.md.Cqt-19_1.js +1 -0
  185. package/packages/docs/.vitepress/dist/assets/workflows_slides.md.Cqt-19_1.lean.js +1 -0
  186. package/packages/docs/.vitepress/dist/assets/workflows_tdd.md.BjVC69tu.js +1 -0
  187. package/packages/docs/.vitepress/dist/assets/workflows_tdd.md.BjVC69tu.lean.js +1 -0
  188. package/packages/docs/.vitepress/dist/assets/workflows_waterfall.md.CL6jTZP9.js +1 -0
  189. package/packages/docs/.vitepress/dist/assets/workflows_waterfall.md.CL6jTZP9.lean.js +1 -0
  190. package/packages/docs/.vitepress/dist/dev/ARCHITECTURE.html +155 -0
  191. package/packages/docs/.vitepress/dist/dev/DEVELOPMENT.html +97 -0
  192. package/packages/docs/.vitepress/dist/dev/LOGGING.html +59 -0
  193. package/packages/docs/.vitepress/dist/dev/PUBLISHING.html +30 -0
  194. package/packages/docs/.vitepress/dist/hashmap.json +1 -0
  195. package/packages/docs/.vitepress/dist/index.html +27 -0
  196. package/packages/docs/.vitepress/dist/user/advanced-engineering.html +75 -0
  197. package/packages/docs/.vitepress/dist/user/agent-setup.html +49 -0
  198. package/packages/docs/.vitepress/dist/user/beads-integration.html +40 -0
  199. package/packages/docs/.vitepress/dist/user/crowd-mcp-integration.html +182 -0
  200. package/packages/docs/.vitepress/dist/user/custom-workflows.html +168 -0
  201. package/packages/docs/.vitepress/dist/user/git-commit-feature.html +30 -0
  202. package/packages/docs/.vitepress/dist/user/how-it-works.html +48 -0
  203. package/packages/docs/.vitepress/dist/user/long-term-memory.html +68 -0
  204. package/packages/docs/.vitepress/dist/user/packaged-workflows.html +27 -0
  205. package/packages/docs/.vitepress/dist/user/tutorial.html +28 -0
  206. package/packages/docs/.vitepress/dist/user/workflow-selection.html +32 -0
  207. package/packages/docs/.vitepress/dist/vp-icons.css +0 -0
  208. package/packages/docs/.vitepress/dist/workflows/adr.html +26 -0
  209. package/packages/docs/.vitepress/dist/workflows/adr.yaml +157 -0
  210. package/packages/docs/.vitepress/dist/workflows/big-bang-conversion.html +26 -0
  211. package/packages/docs/.vitepress/dist/workflows/big-bang-conversion.yaml +592 -0
  212. package/packages/docs/.vitepress/dist/workflows/boundary-testing.html +26 -0
  213. package/packages/docs/.vitepress/dist/workflows/boundary-testing.yaml +376 -0
  214. package/packages/docs/.vitepress/dist/workflows/bugfix.html +26 -0
  215. package/packages/docs/.vitepress/dist/workflows/bugfix.yaml +177 -0
  216. package/packages/docs/.vitepress/dist/workflows/business-analysis.html +26 -0
  217. package/packages/docs/.vitepress/dist/workflows/business-analysis.yaml +597 -0
  218. package/packages/docs/.vitepress/dist/workflows/c4-analysis.html +26 -0
  219. package/packages/docs/.vitepress/dist/workflows/c4-analysis.yaml +471 -0
  220. package/packages/docs/.vitepress/dist/workflows/epcc.html +26 -0
  221. package/packages/docs/.vitepress/dist/workflows/epcc.yaml +183 -0
  222. package/packages/docs/.vitepress/dist/workflows/game-beginner.html +26 -0
  223. package/packages/docs/.vitepress/dist/workflows/game-beginner.yaml +434 -0
  224. package/packages/docs/.vitepress/dist/workflows/greenfield.html +26 -0
  225. package/packages/docs/.vitepress/dist/workflows/greenfield.yaml +201 -0
  226. package/packages/docs/.vitepress/dist/workflows/minor.html +26 -0
  227. package/packages/docs/.vitepress/dist/workflows/minor.yaml +138 -0
  228. package/packages/docs/.vitepress/dist/workflows/posts.html +26 -0
  229. package/packages/docs/.vitepress/dist/workflows/posts.yaml +193 -0
  230. package/packages/docs/.vitepress/dist/workflows/sdd-bugfix-crowd.html +26 -0
  231. package/packages/docs/.vitepress/dist/workflows/sdd-bugfix-crowd.yaml +608 -0
  232. package/packages/docs/.vitepress/dist/workflows/sdd-bugfix.html +26 -0
  233. package/packages/docs/.vitepress/dist/workflows/sdd-bugfix.yaml +381 -0
  234. package/packages/docs/.vitepress/dist/workflows/sdd-feature-crowd.html +26 -0
  235. package/packages/docs/.vitepress/dist/workflows/sdd-feature-crowd.yaml +713 -0
  236. package/packages/docs/.vitepress/dist/workflows/sdd-feature.html +26 -0
  237. package/packages/docs/.vitepress/dist/workflows/sdd-feature.yaml +471 -0
  238. package/packages/docs/.vitepress/dist/workflows/sdd-greenfield-crowd.html +26 -0
  239. package/packages/docs/.vitepress/dist/workflows/sdd-greenfield-crowd.yaml +336 -0
  240. package/packages/docs/.vitepress/dist/workflows/sdd-greenfield.html +26 -0
  241. package/packages/docs/.vitepress/dist/workflows/sdd-greenfield.yaml +463 -0
  242. package/packages/docs/.vitepress/dist/workflows/slides.html +26 -0
  243. package/packages/docs/.vitepress/dist/workflows/slides.yaml +237 -0
  244. package/packages/docs/.vitepress/dist/workflows/tdd.html +26 -0
  245. package/packages/docs/.vitepress/dist/workflows/tdd.yaml +160 -0
  246. package/packages/docs/.vitepress/dist/workflows/waterfall.html +26 -0
  247. package/packages/docs/.vitepress/dist/workflows/waterfall.yaml +209 -0
  248. package/packages/docs/.vitepress/dist/workflows.html +26 -0
  249. package/packages/docs/package.json +32 -0
  250. package/packages/mcp-server/dist/index.js +10546 -0
  251. package/packages/mcp-server/package.json +41 -0
  252. package/packages/visualizer/dist/WorkflowVisualizer.vue +1147 -0
  253. package/packages/visualizer/dist/index.ts +17 -0
  254. package/packages/visualizer/dist/main.ts +673 -0
  255. package/packages/visualizer/dist/services/BundledWorkflows.ts +35 -0
  256. package/packages/visualizer/dist/services/FileUploadHandler.ts +166 -0
  257. package/packages/visualizer/dist/services/WorkflowLoader.ts +198 -0
  258. package/packages/visualizer/dist/services/YamlParser.ts +248 -0
  259. package/packages/visualizer/dist/services/workflow-list.ts +23 -0
  260. package/packages/visualizer/dist/types/ui-types.ts +84 -0
  261. package/packages/visualizer/dist/types/visualization-types.ts +95 -0
  262. package/packages/visualizer/dist/types/vite-env.d.ts +12 -0
  263. package/packages/visualizer/dist/utils/DomHelpers.ts +206 -0
  264. package/packages/visualizer/dist/utils/ErrorHandler.ts +170 -0
  265. package/packages/visualizer/dist/utils/PlantUMLEncoder.ts +121 -0
  266. package/packages/visualizer/dist/visualization/DiagramRenderer.ts +430 -0
  267. package/packages/visualizer/dist/visualization/LayoutEngine.ts +339 -0
  268. package/packages/visualizer/dist/visualization/PlantUMLRenderer.ts +507 -0
  269. package/packages/visualizer/dist/visualization/StateRenderer.ts +339 -0
  270. package/packages/visualizer/dist/visualization/TransitionRenderer.ts +432 -0
  271. package/packages/visualizer/package.json +39 -0
  272. package/resources/.DS_Store +0 -0
  273. package/resources/agents/architect.yaml +61 -0
  274. package/resources/agents/business-analyst.yaml +60 -0
  275. package/resources/agents/developer.yaml +61 -0
  276. package/resources/state-machine-schema.json +114 -0
  277. package/resources/templates/architecture/arc42/arc42-template-EN.md +1077 -0
  278. package/resources/templates/architecture/arc42/images/01_2_iso-25010-topics-EN.drawio-2023.png +0 -0
  279. package/resources/templates/architecture/arc42/images/01_2_iso-25010-topics-EN.drawio.png +0 -0
  280. package/resources/templates/architecture/arc42/images/05_building_blocks-EN.png +0 -0
  281. package/resources/templates/architecture/arc42/images/08-concepts-EN.drawio.png +0 -0
  282. package/resources/templates/architecture/arc42/images/arc42-logo.png +0 -0
  283. package/resources/templates/architecture/c4.md +224 -0
  284. package/resources/templates/architecture/freestyle.md +53 -0
  285. package/resources/templates/architecture/game.md +250 -0
  286. package/resources/templates/architecture/none.md +17 -0
  287. package/resources/templates/design/comprehensive.md +207 -0
  288. package/resources/templates/design/freestyle.md +37 -0
  289. package/resources/templates/design/game.md +66 -0
  290. package/resources/templates/design/none.md +17 -0
  291. package/resources/templates/requirements/ears.md +90 -0
  292. package/resources/templates/requirements/freestyle.md +42 -0
  293. package/resources/templates/requirements/game.md +162 -0
  294. package/resources/templates/requirements/none.md +17 -0
  295. package/resources/templates/skills/POWER.md +23 -0
  296. package/resources/templates/skills/SKILL.md +19 -0
  297. package/resources/workflows/adr.yaml +157 -0
  298. package/resources/workflows/big-bang-conversion.yaml +592 -0
  299. package/resources/workflows/boundary-testing.yaml +376 -0
  300. package/resources/workflows/bugfix.yaml +177 -0
  301. package/resources/workflows/business-analysis.yaml +597 -0
  302. package/resources/workflows/c4-analysis.yaml +471 -0
  303. package/resources/workflows/epcc.yaml +183 -0
  304. package/resources/workflows/game-beginner.yaml +434 -0
  305. package/resources/workflows/greenfield.yaml +201 -0
  306. package/resources/workflows/minor.yaml +138 -0
  307. package/resources/workflows/posts.yaml +193 -0
  308. package/resources/workflows/sdd-bugfix-crowd.yaml +608 -0
  309. package/resources/workflows/sdd-bugfix.yaml +381 -0
  310. package/resources/workflows/sdd-feature-crowd.yaml +713 -0
  311. package/resources/workflows/sdd-feature.yaml +471 -0
  312. package/resources/workflows/sdd-greenfield-crowd.yaml +336 -0
  313. package/resources/workflows/sdd-greenfield.yaml +463 -0
  314. package/resources/workflows/slides.yaml +237 -0
  315. package/resources/workflows/tdd.yaml +160 -0
  316. package/resources/workflows/waterfall.yaml +209 -0
  317. package/dist/components/beads/beads-instruction-generator.d.ts +0 -44
  318. package/dist/components/beads/beads-instruction-generator.d.ts.map +0 -1
  319. package/dist/components/beads/beads-instruction-generator.js +0 -160
  320. package/dist/components/beads/beads-instruction-generator.js.map +0 -1
  321. package/dist/components/beads/beads-plan-manager.d.ts.map +0 -1
  322. package/dist/components/beads/beads-plan-manager.js.map +0 -1
  323. package/dist/components/beads/beads-task-backend-client.d.ts +0 -43
  324. package/dist/components/beads/beads-task-backend-client.d.ts.map +0 -1
  325. package/dist/components/beads/beads-task-backend-client.js +0 -175
  326. package/dist/components/beads/beads-task-backend-client.js.map +0 -1
  327. package/dist/index.d.ts +0 -9
  328. package/dist/index.d.ts.map +0 -1
  329. package/dist/index.js +0 -74
  330. package/dist/index.js.map +0 -1
  331. package/dist/notification-service.d.ts +0 -14
  332. package/dist/notification-service.d.ts.map +0 -1
  333. package/dist/notification-service.js +0 -18
  334. package/dist/notification-service.js.map +0 -1
  335. package/dist/plugin-system/beads-plugin.d.ts +0 -71
  336. package/dist/plugin-system/beads-plugin.d.ts.map +0 -1
  337. package/dist/plugin-system/beads-plugin.js +0 -465
  338. package/dist/plugin-system/beads-plugin.js.map +0 -1
  339. package/dist/plugin-system/commit-plugin.d.ts +0 -40
  340. package/dist/plugin-system/commit-plugin.d.ts.map +0 -1
  341. package/dist/plugin-system/commit-plugin.js +0 -204
  342. package/dist/plugin-system/commit-plugin.js.map +0 -1
  343. package/dist/plugin-system/index.d.ts +0 -9
  344. package/dist/plugin-system/index.d.ts.map +0 -1
  345. package/dist/plugin-system/index.js +0 -9
  346. package/dist/plugin-system/index.js.map +0 -1
  347. package/dist/plugin-system/plugin-interfaces.d.ts +0 -98
  348. package/dist/plugin-system/plugin-interfaces.d.ts.map +0 -1
  349. package/dist/plugin-system/plugin-interfaces.js +0 -9
  350. package/dist/plugin-system/plugin-interfaces.js.map +0 -1
  351. package/dist/plugin-system/plugin-registry.d.ts +0 -44
  352. package/dist/plugin-system/plugin-registry.d.ts.map +0 -1
  353. package/dist/plugin-system/plugin-registry.js +0 -132
  354. package/dist/plugin-system/plugin-registry.js.map +0 -1
  355. package/dist/resource-handlers/conversation-state.d.ts +0 -15
  356. package/dist/resource-handlers/conversation-state.d.ts.map +0 -1
  357. package/dist/resource-handlers/conversation-state.js +0 -40
  358. package/dist/resource-handlers/conversation-state.js.map +0 -1
  359. package/dist/resource-handlers/development-plan.d.ts +0 -14
  360. package/dist/resource-handlers/development-plan.d.ts.map +0 -1
  361. package/dist/resource-handlers/development-plan.js +0 -31
  362. package/dist/resource-handlers/development-plan.js.map +0 -1
  363. package/dist/resource-handlers/index.d.ts +0 -24
  364. package/dist/resource-handlers/index.d.ts.map +0 -1
  365. package/dist/resource-handlers/index.js +0 -62
  366. package/dist/resource-handlers/index.js.map +0 -1
  367. package/dist/resource-handlers/system-prompt.d.ts +0 -15
  368. package/dist/resource-handlers/system-prompt.d.ts.map +0 -1
  369. package/dist/resource-handlers/system-prompt.js +0 -40
  370. package/dist/resource-handlers/system-prompt.js.map +0 -1
  371. package/dist/resource-handlers/workflow-resource.d.ts +0 -15
  372. package/dist/resource-handlers/workflow-resource.d.ts.map +0 -1
  373. package/dist/resource-handlers/workflow-resource.js +0 -85
  374. package/dist/resource-handlers/workflow-resource.js.map +0 -1
  375. package/dist/response-renderer.d.ts +0 -30
  376. package/dist/response-renderer.d.ts.map +0 -1
  377. package/dist/response-renderer.js +0 -94
  378. package/dist/response-renderer.js.map +0 -1
  379. package/dist/server-config.d.ts +0 -34
  380. package/dist/server-config.d.ts.map +0 -1
  381. package/dist/server-config.js +0 -503
  382. package/dist/server-config.js.map +0 -1
  383. package/dist/server-helpers.d.ts +0 -70
  384. package/dist/server-helpers.d.ts.map +0 -1
  385. package/dist/server-helpers.js +0 -171
  386. package/dist/server-helpers.js.map +0 -1
  387. package/dist/server-implementation.d.ts +0 -74
  388. package/dist/server-implementation.d.ts.map +0 -1
  389. package/dist/server-implementation.js +0 -201
  390. package/dist/server-implementation.js.map +0 -1
  391. package/dist/server.d.ts +0 -6
  392. package/dist/server.d.ts.map +0 -1
  393. package/dist/server.js +0 -5
  394. package/dist/server.js.map +0 -1
  395. package/dist/tool-handlers/base-tool-handler.d.ts +0 -50
  396. package/dist/tool-handlers/base-tool-handler.d.ts.map +0 -1
  397. package/dist/tool-handlers/base-tool-handler.js +0 -81
  398. package/dist/tool-handlers/base-tool-handler.js.map +0 -1
  399. package/dist/tool-handlers/conduct-review.d.ts +0 -49
  400. package/dist/tool-handlers/conduct-review.d.ts.map +0 -1
  401. package/dist/tool-handlers/conduct-review.js +0 -104
  402. package/dist/tool-handlers/conduct-review.js.map +0 -1
  403. package/dist/tool-handlers/get-tool-info.d.ts +0 -75
  404. package/dist/tool-handlers/get-tool-info.d.ts.map +0 -1
  405. package/dist/tool-handlers/get-tool-info.js +0 -168
  406. package/dist/tool-handlers/get-tool-info.js.map +0 -1
  407. package/dist/tool-handlers/index.d.ts +0 -41
  408. package/dist/tool-handlers/index.d.ts.map +0 -1
  409. package/dist/tool-handlers/index.js +0 -71
  410. package/dist/tool-handlers/index.js.map +0 -1
  411. package/dist/tool-handlers/list-workflows.d.ts +0 -35
  412. package/dist/tool-handlers/list-workflows.d.ts.map +0 -1
  413. package/dist/tool-handlers/list-workflows.js +0 -43
  414. package/dist/tool-handlers/list-workflows.js.map +0 -1
  415. package/dist/tool-handlers/no-idea.d.ts +0 -41
  416. package/dist/tool-handlers/no-idea.d.ts.map +0 -1
  417. package/dist/tool-handlers/no-idea.js +0 -29
  418. package/dist/tool-handlers/no-idea.js.map +0 -1
  419. package/dist/tool-handlers/proceed-to-phase.d.ts +0 -41
  420. package/dist/tool-handlers/proceed-to-phase.d.ts.map +0 -1
  421. package/dist/tool-handlers/proceed-to-phase.js +0 -165
  422. package/dist/tool-handlers/proceed-to-phase.js.map +0 -1
  423. package/dist/tool-handlers/reset-development.d.ts +0 -31
  424. package/dist/tool-handlers/reset-development.d.ts.map +0 -1
  425. package/dist/tool-handlers/reset-development.js +0 -48
  426. package/dist/tool-handlers/reset-development.js.map +0 -1
  427. package/dist/tool-handlers/resume-workflow.d.ts +0 -87
  428. package/dist/tool-handlers/resume-workflow.d.ts.map +0 -1
  429. package/dist/tool-handlers/resume-workflow.js +0 -212
  430. package/dist/tool-handlers/resume-workflow.js.map +0 -1
  431. package/dist/tool-handlers/setup-project-docs.d.ts +0 -37
  432. package/dist/tool-handlers/setup-project-docs.d.ts.map +0 -1
  433. package/dist/tool-handlers/setup-project-docs.js +0 -138
  434. package/dist/tool-handlers/setup-project-docs.js.map +0 -1
  435. package/dist/tool-handlers/start-development.d.ts +0 -79
  436. package/dist/tool-handlers/start-development.d.ts.map +0 -1
  437. package/dist/tool-handlers/start-development.js +0 -484
  438. package/dist/tool-handlers/start-development.js.map +0 -1
  439. package/dist/tool-handlers/whats-next.d.ts +0 -41
  440. package/dist/tool-handlers/whats-next.d.ts.map +0 -1
  441. package/dist/tool-handlers/whats-next.js +0 -123
  442. package/dist/tool-handlers/whats-next.js.map +0 -1
  443. package/dist/types.d.ts +0 -119
  444. package/dist/types.d.ts.map +0 -1
  445. package/dist/types.js +0 -5
  446. package/dist/version-info.d.ts +0 -30
  447. package/dist/version-info.d.ts.map +0 -1
  448. package/dist/version-info.js +0 -178
  449. package/dist/version-info.js.map +0 -1
  450. package/skill/SKILL.md +0 -28
  451. /package/{dist → packages/core/dist}/types.js.map +0 -0
@@ -0,0 +1,1147 @@
1
+ <template>
2
+ <div id="workflow-visualizer-app" :class="{ fullscreen: !showSidebar }">
3
+ <header class="app-header" v-if="!hideHeader">
4
+ <h1>Workflow Visualizer</h1>
5
+ <div class="workflow-controls">
6
+ <select id="workflow-selector" class="workflow-selector">
7
+ <option value="">Select a workflow...</option>
8
+ </select>
9
+ <input
10
+ type="file"
11
+ id="file-upload"
12
+ accept=".yaml,.yml"
13
+ class="file-upload"
14
+ />
15
+ <label for="file-upload" class="file-upload-label">Upload YAML</label>
16
+ </div>
17
+ </header>
18
+
19
+ <main class="app-main" :class="{ 'no-sidebar': !showSidebar }">
20
+ <div class="diagram-container">
21
+ <div id="diagram-canvas" class="diagram-canvas">
22
+ <div class="loading-message">
23
+ {{
24
+ initialWorkflow
25
+ ? 'Loading workflow...'
26
+ : 'Select a workflow to visualize'
27
+ }}
28
+ </div>
29
+ </div>
30
+ </div>
31
+
32
+ <aside v-if="showSidebar" class="side-panel">
33
+ <div class="side-panel-header">
34
+ <h2>Details</h2>
35
+ </div>
36
+ <div class="side-panel-content">
37
+ <div class="empty-state">
38
+ Click on a state or transition to see details
39
+ </div>
40
+ </div>
41
+ </aside>
42
+ </main>
43
+
44
+ <div id="error-container" class="error-container hidden">
45
+ <div class="error-message">
46
+ <span class="error-text"></span>
47
+ <button class="error-close">&times;</button>
48
+ </div>
49
+ </div>
50
+ </div>
51
+ </template>
52
+
53
+ <script setup lang="ts">
54
+ import { onMounted, onUnmounted, watch } from 'vue';
55
+ import { load as parseYaml } from 'js-yaml';
56
+ import { marked } from 'marked';
57
+ import { FileUploadHandler } from './services/FileUploadHandler';
58
+ import { ErrorHandler } from './utils/ErrorHandler';
59
+ import { PlantUMLRenderer } from './visualization/PlantUMLRenderer';
60
+ import { getRequiredElement } from './utils/DomHelpers';
61
+
62
+ // Configure marked for GitHub Flavored Markdown
63
+ marked.setOptions({
64
+ gfm: true,
65
+ breaks: true,
66
+ });
67
+
68
+ // Render markdown content to HTML
69
+ function renderMarkdown(content: string): string {
70
+ if (!content) return '';
71
+ return marked(content);
72
+ }
73
+
74
+ // Component props
75
+ interface WorkflowDefinition {
76
+ name: string;
77
+ displayName?: string;
78
+ domain?: string;
79
+ path: string;
80
+ }
81
+
82
+ interface Props {
83
+ showSidebar?: boolean;
84
+ hideHeader?: boolean;
85
+ initialWorkflow?: string;
86
+ workflows?: WorkflowDefinition[];
87
+ }
88
+
89
+ const props = withDefaults(defineProps<Props>(), {
90
+ showSidebar: true,
91
+ hideHeader: false,
92
+ initialWorkflow: '',
93
+ workflows: () => [],
94
+ });
95
+
96
+ interface WorkflowVisualizerApp {
97
+ plantUMLRenderer: unknown;
98
+ fileUploadHandler: unknown;
99
+ errorHandler: unknown;
100
+ }
101
+
102
+ interface AppState {
103
+ currentWorkflow: unknown;
104
+ selectedElement: unknown;
105
+ highlightedPath: unknown;
106
+ isLoading: boolean;
107
+ error: unknown;
108
+ parentState: unknown;
109
+ }
110
+
111
+ let workflowVisualizerApp: WorkflowVisualizerApp | null = null;
112
+ let appState: AppState = {
113
+ currentWorkflow: null,
114
+ selectedElement: null,
115
+ highlightedPath: null,
116
+ isLoading: false,
117
+ error: null,
118
+ parentState: null,
119
+ };
120
+
121
+ // Function to populate workflow selector
122
+ const populateWorkflowSelector = () => {
123
+ // Check if we're in browser environment (not SSR)
124
+ if (typeof document === 'undefined') return;
125
+
126
+ const workflowSelector =
127
+ document.querySelector<HTMLSelectElement>('#workflow-selector');
128
+ if (!workflowSelector || props.workflows.length === 0) return;
129
+
130
+ // Clear existing options except the first one
131
+ while (workflowSelector.children.length > 1) {
132
+ const lastChild = workflowSelector.lastChild;
133
+ if (lastChild) {
134
+ workflowSelector.removeChild(lastChild);
135
+ }
136
+ }
137
+
138
+ // Add workflow options
139
+ for (const workflow of props.workflows) {
140
+ const option = document.createElement('option');
141
+ option.value = workflow.name;
142
+ const domainText = workflow.domain ? ` [${workflow.domain}]` : '';
143
+ const displayName = workflow.displayName || workflow.name;
144
+ option.textContent = `${displayName}${domainText}`;
145
+ workflowSelector.appendChild(option);
146
+ }
147
+ };
148
+
149
+ // Watch for changes in workflows prop (only in browser)
150
+ watch(
151
+ () => props.workflows,
152
+ () => {
153
+ populateWorkflowSelector();
154
+ },
155
+ { immediate: true }
156
+ );
157
+
158
+ // Helper functions for handling interactions
159
+ function handleElementClick(event: {
160
+ elementType: string;
161
+ elementId: string;
162
+ data: unknown;
163
+ }): void {
164
+ if (event.elementType === 'node' && event.data) {
165
+ selectState(event.elementId, event.data);
166
+ } else if (event.elementType === 'transition' && event.data) {
167
+ selectTransition(event.elementId, event.data);
168
+ }
169
+ }
170
+
171
+ function selectState(stateId: string, nodeData: unknown): void {
172
+ const workflow = appState.currentWorkflow;
173
+ if (!workflow || !workflow.states[stateId]) return;
174
+
175
+ const state = workflow.states[stateId];
176
+
177
+ appState.selectedElement = {
178
+ type: 'state',
179
+ id: stateId,
180
+ data: state,
181
+ };
182
+
183
+ updateSidePanel();
184
+ }
185
+
186
+ function selectTransition(transitionId: string, linkData: unknown): void {
187
+ const workflow = appState.currentWorkflow;
188
+ if (!workflow) return;
189
+
190
+ if (linkData && linkData.from && linkData.to && linkData.trigger) {
191
+ const transitionData = {
192
+ trigger: linkData.trigger,
193
+ from: linkData.from,
194
+ to: linkData.to,
195
+ instructions: linkData.instructions || '',
196
+ additional_instructions: linkData.additional_instructions || '',
197
+ transition_reason: linkData.transition_reason || '',
198
+ review_perspectives: linkData.review_perspectives || [],
199
+ };
200
+
201
+ appState.selectedElement = {
202
+ type: 'transition',
203
+ id: transitionId,
204
+ data: transitionData,
205
+ };
206
+
207
+ updateSidePanel();
208
+ }
209
+ }
210
+
211
+ function clearSelectionAndShowMetadata(): void {
212
+ appState.selectedElement = null;
213
+ appState.parentState = null;
214
+ updateSidePanel();
215
+ }
216
+
217
+ function updateSidePanel(): void {
218
+ // Check if we're in browser environment (not SSR)
219
+ if (typeof document === 'undefined') return;
220
+
221
+ const sidePanelContent = document.querySelector('.side-panel-content');
222
+ const sidePanelHeader = document.querySelector('.side-panel-header');
223
+
224
+ if (!sidePanelContent || !sidePanelHeader) return; // Side panel not visible
225
+
226
+ if (!appState.currentWorkflow) {
227
+ sidePanelHeader.innerHTML = '<h2>Details</h2>';
228
+ sidePanelContent.innerHTML =
229
+ '<div class="empty-state">Select a workflow to see details</div>';
230
+ return;
231
+ }
232
+
233
+ if (appState.selectedElement) {
234
+ renderSelectedElementDetails();
235
+ } else {
236
+ // Show workflow metadata when no element is selected
237
+ renderMetadataDetails();
238
+ }
239
+ }
240
+
241
+ function renderSelectedElementDetails(): void {
242
+ const element = appState.selectedElement;
243
+
244
+ if (element.type === 'state') {
245
+ renderStateDetailsWithHeader(element.id, element.data);
246
+ } else if (element.type === 'transition') {
247
+ renderTransitionDetailsWithHeader(element.data);
248
+ }
249
+ }
250
+
251
+ function renderStateDetailsWithHeader(
252
+ stateId: string,
253
+ stateData: unknown
254
+ ): void {
255
+ // Check if we're in browser environment (not SSR)
256
+ if (typeof document === 'undefined') return;
257
+
258
+ const workflow = appState.currentWorkflow;
259
+ const isInitial = stateId === workflow.initial_state;
260
+ const sidePanelHeader = document.querySelector('.side-panel-header');
261
+ const sidePanelContent = document.querySelector('.side-panel-content');
262
+
263
+ if (!sidePanelHeader || !sidePanelContent) return;
264
+
265
+ // Update header with back button
266
+ sidePanelHeader.innerHTML = `
267
+ <button class="back-button" title="Back to Overview">←</button>
268
+ <h2>State: ${stateId}</h2>
269
+ `;
270
+
271
+ const backButton = sidePanelHeader.querySelector('.back-button');
272
+ backButton?.addEventListener('click', () => {
273
+ clearSelection();
274
+ });
275
+
276
+ // Render state content
277
+ sidePanelContent.innerHTML = `
278
+ <div class="detail-section">
279
+ <h3 class="detail-title">
280
+ ${stateId}
281
+ ${isInitial ? '<span class="badge badge-success">Initial</span>' : ''}
282
+ </h3>
283
+ <p class="detail-content">${stateData.description}</p>
284
+ </div>
285
+
286
+ <div class="detail-section">
287
+ <h4 class="detail-subtitle">Default Instructions</h4>
288
+ <div class="code-block">${renderMarkdown(stateData.default_instructions)}</div>
289
+ </div>
290
+
291
+ <div class="detail-section">
292
+ <h4 class="detail-subtitle">Transitions (${stateData.transitions.length})</h4>
293
+ <ul class="transitions-list">
294
+ ${(
295
+ stateData as {
296
+ transitions: Array<{
297
+ to: string;
298
+ trigger: string;
299
+ transition_reason: string;
300
+ }>;
301
+ }
302
+ ).transitions
303
+ .map(
304
+ transition => `
305
+ <li class="transition-item clickable-transition" data-from="${stateId}" data-to="${transition.to}" data-trigger="${transition.trigger}">
306
+ <div class="transition-trigger">${transition.trigger}</div>
307
+ <div class="transition-target">→ ${transition.to}</div>
308
+ <div class="transition-reason">${transition.transition_reason}</div>
309
+ </li>
310
+ `
311
+ )
312
+ .join('')}
313
+ </ul>
314
+ </div>
315
+ `;
316
+
317
+ // Add click handlers to transitions
318
+ const transitionItems = sidePanelContent.querySelectorAll(
319
+ '.clickable-transition'
320
+ );
321
+ for (const item of transitionItems) {
322
+ item.addEventListener('click', e => {
323
+ e.stopPropagation();
324
+ const fromState = item.getAttribute('data-from');
325
+ const toState = item.getAttribute('data-to');
326
+ const trigger = item.getAttribute('data-trigger');
327
+
328
+ if (fromState && toState && trigger) {
329
+ const fullTransition = (
330
+ stateData as {
331
+ transitions: Array<{
332
+ to: string;
333
+ trigger: string;
334
+ instructions?: string;
335
+ additional_instructions?: string;
336
+ transition_reason?: string;
337
+ }>;
338
+ }
339
+ ).transitions.find(t => t.to === toState && t.trigger === trigger);
340
+
341
+ if (fullTransition) {
342
+ appState.parentState = { id: stateId, data: stateData };
343
+
344
+ selectTransition(`${fromState}->${toState}`, {
345
+ from: fromState,
346
+ to: toState,
347
+ trigger: trigger,
348
+ instructions: fullTransition.instructions,
349
+ additional_instructions: fullTransition.additional_instructions,
350
+ transition_reason: fullTransition.transition_reason,
351
+ });
352
+ }
353
+ }
354
+ });
355
+ }
356
+ }
357
+
358
+ function renderTransitionDetailsWithHeader(transitionData: unknown): void {
359
+ // Check if we're in browser environment (not SSR)
360
+ if (typeof document === 'undefined') return;
361
+
362
+ const sidePanelHeader = document.querySelector('.side-panel-header');
363
+ const sidePanelContent = document.querySelector('.side-panel-content');
364
+
365
+ if (!sidePanelHeader || !sidePanelContent) return;
366
+
367
+ // Update header with back button
368
+ sidePanelHeader.innerHTML = `
369
+ <button class="back-button" title="Back to State">←</button>
370
+ <h2>Transition: ${transitionData.trigger}</h2>
371
+ `;
372
+
373
+ const backButton = sidePanelHeader.querySelector('.back-button');
374
+ backButton?.addEventListener('click', () => {
375
+ goBackToParentState();
376
+ });
377
+
378
+ const transition = transitionData as {
379
+ trigger: string;
380
+ from: string;
381
+ to: string;
382
+ transition_reason?: string;
383
+ instructions?: string;
384
+ additional_instructions?: string;
385
+ review_perspectives?: Array<{ perspective: string; prompt: string }>;
386
+ };
387
+
388
+ // Render transition content
389
+ sidePanelContent.innerHTML = `
390
+ <div class="detail-section">
391
+ <h3 class="detail-title">Transition: ${transition.trigger}</h3>
392
+ <p class="detail-content">
393
+ <strong>${transition.from}</strong> → <strong>${transition.to}</strong>
394
+ </p>
395
+ </div>
396
+
397
+ <div class="detail-section">
398
+ <h4 class="detail-subtitle">Reason</h4>
399
+ <p class="detail-content">${transition.transition_reason || ''}</p>
400
+ </div>
401
+
402
+ ${
403
+ transition.instructions
404
+ ? `
405
+ <div class="detail-section">
406
+ <h4 class="detail-subtitle">Instructions</h4>
407
+ <div class="code-block">${renderMarkdown(transition.instructions)}</div>
408
+ </div>
409
+ `
410
+ : ''
411
+ }
412
+
413
+ ${
414
+ transition.additional_instructions
415
+ ? `
416
+ <div class="detail-section">
417
+ <h4 class="detail-subtitle">Additional Instructions</h4>
418
+ <div class="code-block">${renderMarkdown(transition.additional_instructions)}</div>
419
+ </div>
420
+ `
421
+ : ''
422
+ }
423
+
424
+ ${
425
+ transition.review_perspectives?.length
426
+ ? `
427
+ <div class="detail-section">
428
+ <h4 class="detail-subtitle">Review Perspectives (${transition.review_perspectives.length})</h4>
429
+ ${transition.review_perspectives
430
+ .map(
431
+ review => `
432
+ <div class="review-perspective">
433
+ <h5 class="review-role">${review.perspective.replace(/_/g, ' ').toUpperCase()}</h5>
434
+ <p class="review-prompt">${review.prompt}</p>
435
+ </div>
436
+ `
437
+ )
438
+ .join('')}
439
+ </div>
440
+ `
441
+ : ''
442
+ }
443
+ `;
444
+ }
445
+
446
+ function renderMetadataDetails(): void {
447
+ // Check if we're in browser environment (not SSR)
448
+ if (typeof document === 'undefined') return;
449
+
450
+ const workflow = appState.currentWorkflow as {
451
+ name: string;
452
+ description: string;
453
+ metadata?: Record<string, unknown>;
454
+ } | null;
455
+ if (!workflow) return;
456
+
457
+ const metadata = workflow.metadata;
458
+
459
+ const sidePanelHeader = document.querySelector('.side-panel-header');
460
+ const sidePanelContent = document.querySelector('.side-panel-content');
461
+
462
+ if (!sidePanelHeader || !sidePanelContent) return;
463
+
464
+ // Update header
465
+ sidePanelHeader.innerHTML = '<h2>Workflow Info</h2>';
466
+
467
+ // Render metadata content
468
+ sidePanelContent.innerHTML = `
469
+ <div class="detail-section">
470
+ <h3 class="detail-title">${workflow.name}</h3>
471
+ <p class="detail-content">${workflow.description}</p>
472
+ </div>
473
+
474
+ ${
475
+ metadata
476
+ ? `
477
+ <div class="detail-section">
478
+ ${Object.entries(metadata)
479
+ .map(
480
+ ([key, value]) => `
481
+ <div class="metadata-item">
482
+ <strong>${key.replace(/_/g, ' ').toUpperCase()}:</strong>
483
+ ${
484
+ Array.isArray(value)
485
+ ? `
486
+ <ul>
487
+ ${value.map(item => `<li>${item}</li>`).join('')}
488
+ </ul>
489
+ `
490
+ : `<span>${value}</span>`
491
+ }
492
+ </div>
493
+ `
494
+ )
495
+ .join('')}
496
+ </div>
497
+ `
498
+ : ''
499
+ }
500
+ `;
501
+ }
502
+
503
+ function goBackToParentState(): void {
504
+ if (appState.parentState) {
505
+ appState.selectedElement = {
506
+ type: 'state',
507
+ id: appState.parentState.id,
508
+ data: appState.parentState.data,
509
+ };
510
+ appState.parentState = null;
511
+ updateSidePanel();
512
+ } else {
513
+ clearSelection();
514
+ }
515
+ }
516
+
517
+ function clearSelection(): void {
518
+ appState.selectedElement = null;
519
+ appState.parentState = null;
520
+
521
+ // Check if we're in browser environment (not SSR)
522
+ if (typeof document === 'undefined') return;
523
+
524
+ const sidePanelHeader = document.querySelector('.side-panel-header');
525
+ if (sidePanelHeader) {
526
+ sidePanelHeader.innerHTML = '<h2>Details</h2>';
527
+ }
528
+
529
+ updateSidePanel();
530
+ }
531
+
532
+ onMounted(async () => {
533
+ try {
534
+ // Initialize the workflow visualizer
535
+ const errorHandler = new ErrorHandler();
536
+
537
+ // Get DOM elements (some may not exist if header is hidden)
538
+ const workflowSelector =
539
+ document.querySelector<HTMLSelectElement>('#workflow-selector');
540
+ const fileUploadInput =
541
+ document.querySelector<HTMLInputElement>('#file-upload');
542
+ const diagramCanvas = getRequiredElement('#diagram-canvas');
543
+ const sidePanelContent = document.querySelector('.side-panel-content');
544
+ const sidePanelHeader = document.querySelector('.side-panel-header');
545
+
546
+ // Initialize PlantUML renderer
547
+ const plantUMLRenderer = new PlantUMLRenderer(diagramCanvas);
548
+
549
+ // Set up click handler for interactive elements
550
+ plantUMLRenderer.setClickHandler((elementType, elementId, data) => {
551
+ if (elementType === 'state') {
552
+ handleElementClick({
553
+ elementType: 'node',
554
+ elementId: elementId,
555
+ data: data,
556
+ });
557
+ } else if (elementType === 'transition') {
558
+ handleElementClick({
559
+ elementType: 'transition',
560
+ elementId: elementId,
561
+ data: data,
562
+ });
563
+ } else if (elementType === 'clear-selection') {
564
+ clearSelectionAndShowMetadata();
565
+ }
566
+ });
567
+
568
+ // Simple workflow loading function
569
+ const loadWorkflow = async (workflowName: string) => {
570
+ const workflow = props.workflows.find(w => w.name === workflowName);
571
+ if (!workflow) {
572
+ throw new Error(`Workflow '${workflowName}' not found`);
573
+ }
574
+
575
+ const response = await fetch(workflow.path);
576
+ if (!response.ok) {
577
+ throw new Error(`Failed to load workflow: ${response.statusText}`);
578
+ }
579
+
580
+ const yamlContent = await response.text();
581
+ const parsedWorkflow = parseYaml(yamlContent);
582
+
583
+ return parsedWorkflow;
584
+ };
585
+
586
+ // Initialize file upload handler (only if element exists)
587
+ let fileUploadHandler = null;
588
+ if (fileUploadInput) {
589
+ // Simple file upload handler that matches the new architecture
590
+ fileUploadHandler = {
591
+ setupEventListeners: () => {
592
+ fileUploadInput.addEventListener('change', async event => {
593
+ const target = event.target as HTMLInputElement;
594
+ const files = target.files;
595
+
596
+ if (!files || files.length === 0) {
597
+ return;
598
+ }
599
+
600
+ const file = files[0];
601
+
602
+ try {
603
+ // Validate file type
604
+ const validExtensions = ['.yaml', '.yml'];
605
+ const fileName = file.name.toLowerCase();
606
+ const isValidType = validExtensions.some(ext =>
607
+ fileName.endsWith(ext)
608
+ );
609
+
610
+ if (!isValidType) {
611
+ throw new Error(
612
+ 'Invalid file type. Please select a .yaml or .yml file.'
613
+ );
614
+ }
615
+
616
+ // Validate file size (1MB limit)
617
+ const maxSizeBytes = 1024 * 1024;
618
+ if (file.size > maxSizeBytes) {
619
+ throw new Error(
620
+ `File too large. Maximum size is ${maxSizeBytes / 1024 / 1024}MB.`
621
+ );
622
+ }
623
+
624
+ if (file.size === 0) {
625
+ throw new Error('File is empty.');
626
+ }
627
+
628
+ // Read file content
629
+ const yamlContent = await new Promise<string>(
630
+ (resolve, reject) => {
631
+ const reader = new FileReader();
632
+ reader.onload = e => {
633
+ if (e.target?.result) {
634
+ resolve(e.target.result as string);
635
+ } else {
636
+ reject(new Error('Failed to read file content'));
637
+ }
638
+ };
639
+ reader.onerror = () =>
640
+ reject(new Error('Error reading file'));
641
+ reader.readAsText(file);
642
+ }
643
+ );
644
+
645
+ if (!yamlContent.trim()) {
646
+ throw new Error('Uploaded file is empty');
647
+ }
648
+
649
+ // Parse and render the workflow
650
+ diagramCanvas.innerHTML =
651
+ '<div class="loading-message">Loading uploaded workflow...</div>';
652
+ const workflow = parseYaml(yamlContent);
653
+ appState.currentWorkflow = workflow;
654
+ appState.selectedElement = null;
655
+ appState.highlightedPath = null;
656
+ await plantUMLRenderer.renderWorkflow(workflow);
657
+
658
+ // Clear workflow selector since this is an uploaded workflow
659
+ if (workflowSelector) {
660
+ workflowSelector.value = '';
661
+ }
662
+
663
+ updateSidePanel();
664
+ console.log(
665
+ `Successfully loaded uploaded workflow: ${workflow.name || 'Unnamed'}`
666
+ );
667
+ } catch (error) {
668
+ console.error('Failed to load uploaded workflow:', error);
669
+ diagramCanvas.innerHTML = `<div class="loading-message">Failed to load workflow: ${error.message}</div>`;
670
+ } finally {
671
+ // Clear the input so the same file can be uploaded again
672
+ target.value = '';
673
+ }
674
+ });
675
+ },
676
+ };
677
+
678
+ fileUploadHandler.setupEventListeners();
679
+ }
680
+
681
+ // Set up event listeners and populate workflow selector (only if selector exists)
682
+ if (workflowSelector) {
683
+ console.log('Setting up workflow selector, workflows:', props.workflows);
684
+
685
+ // Populate the workflow selector with available workflows
686
+ populateWorkflowSelector();
687
+
688
+ workflowSelector.addEventListener('change', async event => {
689
+ const target = event.target as HTMLSelectElement;
690
+ const workflowName = target.value;
691
+
692
+ if (!workflowName) {
693
+ diagramCanvas.innerHTML =
694
+ '<div class="loading-message">Select a workflow to visualize</div>';
695
+ return;
696
+ }
697
+
698
+ try {
699
+ diagramCanvas.innerHTML =
700
+ '<div class="loading-message">Loading workflow...</div>';
701
+ const workflow = await loadWorkflow(workflowName);
702
+ appState.currentWorkflow = workflow;
703
+ appState.selectedElement = null;
704
+ appState.highlightedPath = null;
705
+ await plantUMLRenderer.renderWorkflow(workflow);
706
+ updateSidePanel();
707
+ } catch (error) {
708
+ console.error('Failed to load workflow:', error);
709
+ diagramCanvas.innerHTML =
710
+ '<div class="loading-message">Failed to load workflow</div>';
711
+ }
712
+ });
713
+ }
714
+
715
+ // Load initial workflow if specified
716
+ if (props.initialWorkflow) {
717
+ try {
718
+ const workflow = await loadWorkflow(props.initialWorkflow);
719
+ appState.currentWorkflow = workflow;
720
+ appState.selectedElement = null;
721
+ appState.highlightedPath = null;
722
+ await plantUMLRenderer.renderWorkflow(workflow);
723
+ // Only update selector if it exists (when header is visible)
724
+ if (workflowSelector) {
725
+ workflowSelector.value = props.initialWorkflow;
726
+ }
727
+ updateSidePanel();
728
+ } catch (error) {
729
+ console.error('Failed to load initial workflow:', error);
730
+ diagramCanvas.innerHTML =
731
+ '<div class="loading-message">Failed to load workflow</div>';
732
+ }
733
+ }
734
+
735
+ workflowVisualizerApp = {
736
+ plantUMLRenderer,
737
+ fileUploadHandler,
738
+ errorHandler,
739
+ };
740
+ } catch (error) {
741
+ console.error('Failed to load WorkflowVisualizerApp:', error);
742
+
743
+ // Fallback: show error message
744
+ const errorContainer = document.getElementById('error-container');
745
+ const errorText = document.querySelector('.error-text');
746
+ if (errorContainer && errorText) {
747
+ errorText.textContent = 'Failed to load workflow visualizer';
748
+ errorContainer.classList.remove('hidden');
749
+ }
750
+ }
751
+ });
752
+
753
+ onUnmounted(() => {
754
+ // Clean up any resources
755
+ workflowVisualizerApp = null;
756
+ });
757
+ </script>
758
+
759
+ <style>
760
+ /* Workflow Visualizer styles - adapted from original CSS files */
761
+
762
+ /* CSS Variables */
763
+ #workflow-visualizer-app {
764
+ --color-primary: #2563eb;
765
+ --color-primary-hover: #1d4ed8;
766
+ --color-secondary: #64748b;
767
+ --color-success: #059669;
768
+ --color-warning: #d97706;
769
+ --color-error: #dc2626;
770
+
771
+ --color-white: #ffffff;
772
+ --color-gray-50: #f8fafc;
773
+ --color-gray-100: #f1f5f9;
774
+ --color-gray-200: #e2e8f0;
775
+ --color-gray-300: #cbd5e1;
776
+ --color-gray-400: #94a3b8;
777
+ --color-gray-500: #64748b;
778
+ --color-gray-600: #475569;
779
+ --color-gray-700: #334155;
780
+ --color-gray-800: #1e293b;
781
+ --color-gray-900: #0f172a;
782
+
783
+ --font-family-sans:
784
+ -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue',
785
+ Arial, sans-serif;
786
+ --font-family-mono:
787
+ 'SF Mono', Monaco, 'Cascadia Code', 'Roboto Mono', Consolas, 'Courier New',
788
+ monospace;
789
+
790
+ --spacing-xs: 0.25rem;
791
+ --spacing-sm: 0.5rem;
792
+ --spacing-md: 1rem;
793
+ --spacing-lg: 1.5rem;
794
+ --spacing-xl: 2rem;
795
+
796
+ --radius-sm: 0.25rem;
797
+ --radius-md: 0.375rem;
798
+ --radius-lg: 0.5rem;
799
+
800
+ --shadow-sm: 0 1px 2px 0 rgb(0 0 0 / 0.05);
801
+ --shadow-md: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);
802
+ --shadow-lg:
803
+ 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);
804
+ }
805
+
806
+ /* Container for the entire visualizer */
807
+ #workflow-visualizer-app {
808
+ width: 100%;
809
+ height: 100%;
810
+ background: var(--color-white);
811
+ border-radius: var(--radius-lg);
812
+ box-shadow: var(--shadow-lg);
813
+ overflow: hidden;
814
+ font-family: var(--font-family-sans);
815
+ font-size: 14px;
816
+ line-height: 1.5;
817
+ color: var(--color-gray-900);
818
+ }
819
+
820
+ /* Ensure proper scoping within VitePress */
821
+ #workflow-visualizer-app * {
822
+ box-sizing: border-box;
823
+ }
824
+
825
+ /* App Header */
826
+ #workflow-visualizer-app .app-header {
827
+ background: var(--color-gray-50);
828
+ border-bottom: 1px solid var(--color-gray-200);
829
+ padding: var(--spacing-lg);
830
+ }
831
+
832
+ #workflow-visualizer-app .app-header h1 {
833
+ margin: 0 0 var(--spacing-md) 0;
834
+ color: var(--color-gray-900);
835
+ font-size: 1.5rem;
836
+ font-weight: 600;
837
+ line-height: 1.2;
838
+ }
839
+
840
+ #workflow-visualizer-app .workflow-controls {
841
+ display: flex;
842
+ gap: var(--spacing-md);
843
+ align-items: center;
844
+ flex-wrap: wrap;
845
+ }
846
+
847
+ #workflow-visualizer-app .workflow-selector {
848
+ flex: 1;
849
+ min-width: 200px;
850
+ padding: var(--spacing-sm);
851
+ border: 1px solid var(--color-gray-300);
852
+ border-radius: var(--radius-md);
853
+ background: var(--color-white);
854
+ font-family: inherit;
855
+ font-size: inherit;
856
+ color: var(--color-gray-900);
857
+ }
858
+
859
+ #workflow-visualizer-app .file-upload {
860
+ display: none;
861
+ }
862
+
863
+ #workflow-visualizer-app .file-upload-label {
864
+ padding: var(--spacing-sm) var(--spacing-md);
865
+ background: var(--color-primary);
866
+ color: var(--color-white);
867
+ border-radius: var(--radius-md);
868
+ cursor: pointer;
869
+ font-weight: 500;
870
+ transition: background-color 0.2s;
871
+ border: none;
872
+ font-family: inherit;
873
+ font-size: inherit;
874
+ }
875
+
876
+ #workflow-visualizer-app .file-upload-label:hover {
877
+ background: var(--color-primary-hover);
878
+ }
879
+
880
+ /* Main Layout */
881
+ #workflow-visualizer-app .app-main {
882
+ display: flex;
883
+ height: 100%;
884
+ }
885
+
886
+ #workflow-visualizer-app.fullscreen .app-main {
887
+ height: 80vh;
888
+ }
889
+
890
+ #workflow-visualizer-app .diagram-container {
891
+ flex: 1;
892
+ position: relative;
893
+ overflow: hidden;
894
+ background: var(--color-white);
895
+ }
896
+
897
+ #workflow-visualizer-app .diagram-canvas {
898
+ width: 100%;
899
+ height: 100%;
900
+ overflow: auto;
901
+ position: relative;
902
+ }
903
+
904
+ #workflow-visualizer-app .loading-message {
905
+ display: flex;
906
+ align-items: center;
907
+ justify-content: center;
908
+ height: 100%;
909
+ color: var(--color-gray-500);
910
+ font-size: 1rem;
911
+ font-style: italic;
912
+ }
913
+
914
+ /* Side Panel */
915
+ #workflow-visualizer-app .side-panel {
916
+ width: 35%;
917
+ border-left: 1px solid var(--color-gray-200);
918
+ background: var(--color-gray-50);
919
+ display: flex;
920
+ flex-direction: column;
921
+ }
922
+
923
+ #workflow-visualizer-app .side-panel .metadata-item {
924
+ margin-bottom: 8px;
925
+ }
926
+
927
+ #workflow-visualizer-app .side-panel .metadata-item ul {
928
+ list-style: circle;
929
+ padding: 0;
930
+ margin-bottom: var(--spacing-sm);
931
+ }
932
+
933
+ #workflow-visualizer-app .side-panel .metadata-item ul li {
934
+ padding-bottom: var(--spacing-sm);
935
+ margin-left: var(--spacing-lg);
936
+ }
937
+
938
+ #workflow-visualizer-app .side-panel-header {
939
+ padding: var(--spacing-lg);
940
+ border-bottom: 1px solid var(--color-gray-200);
941
+ background: var(--color-white);
942
+ display: flex;
943
+ align-items: center;
944
+ }
945
+
946
+ #workflow-visualizer-app .side-panel-header h2 {
947
+ margin: 0;
948
+ color: var(--color-gray-900);
949
+ font-size: 1.125rem;
950
+ font-weight: 600;
951
+ line-height: 1.2;
952
+ }
953
+
954
+ #workflow-visualizer-app .side-panel-content {
955
+ flex: 1;
956
+ padding: var(--spacing-lg);
957
+ overflow-y: auto;
958
+ }
959
+
960
+ #workflow-visualizer-app .empty-state {
961
+ color: var(--color-gray-500);
962
+ text-align: center;
963
+ font-style: italic;
964
+ padding: var(--spacing-xl) 0;
965
+ }
966
+
967
+ /* Detail sections */
968
+ #workflow-visualizer-app .detail-section {
969
+ margin-bottom: var(--spacing-lg);
970
+ padding-bottom: var(--spacing-lg);
971
+ border-bottom: 1px solid var(--color-gray-200);
972
+ }
973
+
974
+ #workflow-visualizer-app .detail-section:last-child {
975
+ border-bottom: none;
976
+ margin-bottom: 0;
977
+ padding-bottom: 0;
978
+ }
979
+
980
+ #workflow-visualizer-app .detail-title {
981
+ font-size: 1.125rem;
982
+ font-weight: 600;
983
+ color: var(--color-gray-900);
984
+ margin-bottom: var(--spacing-sm);
985
+ }
986
+
987
+ #workflow-visualizer-app .detail-subtitle {
988
+ font-size: 1rem;
989
+ font-weight: 500;
990
+ color: var(--color-gray-800);
991
+ margin-bottom: var(--spacing-sm);
992
+ }
993
+
994
+ #workflow-visualizer-app .detail-content {
995
+ color: var(--color-gray-700);
996
+ line-height: 1.6;
997
+ margin: 0;
998
+ }
999
+
1000
+ #workflow-visualizer-app .code-block {
1001
+ background-color: var(--color-gray-100);
1002
+ border: 1px solid var(--color-gray-200);
1003
+ border-radius: var(--radius-md);
1004
+ padding: var(--spacing-md);
1005
+ font-family: var(--font-family-mono);
1006
+ font-size: 0.875rem;
1007
+ color: var(--color-gray-800);
1008
+ overflow-x: auto;
1009
+ white-space: pre-wrap;
1010
+ word-break: break-word;
1011
+ margin: var(--spacing-sm) 0;
1012
+ }
1013
+
1014
+ /* Badges */
1015
+ #workflow-visualizer-app .badge {
1016
+ display: inline-flex;
1017
+ align-items: center;
1018
+ padding: 0.25rem 0.5rem;
1019
+ border-radius: var(--radius-sm);
1020
+ font-size: 0.75rem;
1021
+ font-weight: 500;
1022
+ text-transform: uppercase;
1023
+ letter-spacing: 0.025em;
1024
+ margin-left: var(--spacing-sm);
1025
+ }
1026
+
1027
+ #workflow-visualizer-app .badge-success {
1028
+ background-color: var(--color-success);
1029
+ color: var(--color-white);
1030
+ }
1031
+
1032
+ /* Transitions list */
1033
+ #workflow-visualizer-app .transitions-list {
1034
+ list-style: none;
1035
+ padding: 0;
1036
+ margin: 0;
1037
+ }
1038
+
1039
+ #workflow-visualizer-app .transition-item {
1040
+ background: var(--color-white);
1041
+ border: 1px solid var(--color-gray-200);
1042
+ border-radius: var(--radius-md);
1043
+ padding: var(--spacing-md);
1044
+ margin-bottom: var(--spacing-sm);
1045
+ transition: all 0.2s ease;
1046
+ }
1047
+
1048
+ #workflow-visualizer-app .transition-item:hover {
1049
+ border-color: var(--color-primary);
1050
+ box-shadow: var(--shadow-sm);
1051
+ }
1052
+
1053
+ #workflow-visualizer-app .transition-trigger {
1054
+ font-weight: 600;
1055
+ color: var(--color-gray-900);
1056
+ margin-bottom: 0.25rem;
1057
+ }
1058
+
1059
+ #workflow-visualizer-app .transition-target {
1060
+ color: var(--color-primary);
1061
+ font-weight: 500;
1062
+ margin-bottom: 0.25rem;
1063
+ }
1064
+
1065
+ #workflow-visualizer-app .transition-reason {
1066
+ color: var(--color-gray-600);
1067
+ font-size: 0.875rem;
1068
+ }
1069
+
1070
+ /* Error container */
1071
+ #workflow-visualizer-app .error-container {
1072
+ position: absolute;
1073
+ bottom: var(--spacing-lg);
1074
+ right: var(--spacing-lg);
1075
+ z-index: 1000;
1076
+ }
1077
+
1078
+ #workflow-visualizer-app .error-container.hidden {
1079
+ display: none;
1080
+ }
1081
+
1082
+ #workflow-visualizer-app .error-message {
1083
+ background: #fef2f2;
1084
+ border: 1px solid #fecaca;
1085
+ color: var(--color-error);
1086
+ padding: var(--spacing-md);
1087
+ border-radius: var(--radius-md);
1088
+ display: flex;
1089
+ align-items: center;
1090
+ gap: var(--spacing-sm);
1091
+ max-width: 300px;
1092
+ box-shadow: var(--shadow-md);
1093
+ }
1094
+
1095
+ #workflow-visualizer-app .error-close {
1096
+ background: none;
1097
+ border: none;
1098
+ color: var(--color-error);
1099
+ cursor: pointer;
1100
+ font-size: 1.25rem;
1101
+ line-height: 1;
1102
+ padding: 0;
1103
+ }
1104
+
1105
+ /* Buttons */
1106
+ #workflow-visualizer-app button {
1107
+ cursor: pointer;
1108
+ font-family: inherit;
1109
+ }
1110
+
1111
+ #workflow-visualizer-app select {
1112
+ cursor: pointer;
1113
+ }
1114
+
1115
+ /* Back button */
1116
+ #workflow-visualizer-app .back-button {
1117
+ background: none;
1118
+ border: none;
1119
+ color: var(--color-gray-500);
1120
+ cursor: pointer;
1121
+ font-size: 18px;
1122
+ padding: 4px;
1123
+ margin-right: 8px;
1124
+ border-radius: 4px;
1125
+ transition: all 0.2s ease;
1126
+ }
1127
+
1128
+ #workflow-visualizer-app .back-button:hover {
1129
+ background-color: var(--color-gray-100);
1130
+ }
1131
+
1132
+ /* PlantUML diagram styles */
1133
+ #workflow-visualizer-app .diagram-canvas svg {
1134
+ max-width: 100%;
1135
+ height: auto;
1136
+ }
1137
+
1138
+ /* Clickable elements in diagrams */
1139
+ #workflow-visualizer-app .clickable-transition {
1140
+ cursor: pointer;
1141
+ transition: background-color 0.2s ease;
1142
+ }
1143
+
1144
+ #workflow-visualizer-app .clickable-transition:hover {
1145
+ background-color: #f0f9ff;
1146
+ }
1147
+ </style>