@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,507 @@
1
+ import { YamlStateMachine, YamlState } from '../types/ui-types';
2
+ import {
3
+ encodePlantUML,
4
+ encodePlantUMLFallback,
5
+ } from '../utils/PlantUMLEncoder';
6
+
7
+ export class PlantUMLRenderer {
8
+ private container: HTMLElement;
9
+ private onElementClick?: (
10
+ elementType: 'state' | 'transition' | 'clear-selection',
11
+ elementId: string,
12
+ data?: unknown
13
+ ) => void;
14
+
15
+ constructor(container: HTMLElement) {
16
+ this.container = container;
17
+ }
18
+
19
+ /**
20
+ * Set click handler for interactive elements
21
+ */
22
+ public setClickHandler(
23
+ handler: (
24
+ elementType: 'state' | 'transition' | 'clear-selection',
25
+ elementId: string,
26
+ data?: unknown
27
+ ) => void
28
+ ): void {
29
+ this.onElementClick = handler;
30
+ }
31
+
32
+ /**
33
+ /**
34
+ * Render workflow using PlantUML with auto-layout
35
+ */
36
+ public async renderWorkflow(workflow: YamlStateMachine): Promise<void> {
37
+ this.container.innerHTML = '';
38
+ this.container.style.overflow = 'auto';
39
+ this.container.style.height = '100%';
40
+
41
+ const plantUMLCode = this.generatePlantUMLStateMachine(workflow);
42
+ const diagramUrl = await this.createPlantUMLUrl(plantUMLCode);
43
+
44
+ // Create container with diagram and interactive overlay
45
+ const diagramContainer = document.createElement('div');
46
+ diagramContainer.style.position = 'relative';
47
+ diagramContainer.style.padding = '20px';
48
+ diagramContainer.style.textAlign = 'center';
49
+
50
+ // Add title
51
+ const title = document.createElement('div');
52
+ title.innerHTML = `
53
+ <div style="
54
+ display: flex;
55
+ align-items: flex-start;
56
+ justify-content: center;
57
+ gap: 8px;
58
+ ">
59
+ <h2 style="
60
+ color: #1e293b;
61
+ margin: 0;
62
+ font-size: 1.5rem;
63
+ cursor: pointer;
64
+ padding: 8px 12px;
65
+ border-radius: 6px;
66
+ transition: background-color 0.2s ease;
67
+ "
68
+ class="workflow-title-clickable"
69
+ title="Click to show workflow information"
70
+ >${workflow.name} workflow</h2>
71
+ ${
72
+ workflow.metadata?.domain
73
+ ? `<span class="domain-pill" data-domain="${workflow.metadata.domain}" style="
74
+ display: inline-block;
75
+ background-color: #dbeafe;
76
+ color: #1e40af;
77
+ padding: 2px;
78
+ border-radius: 12px;
79
+ font-size: 0.7rem;
80
+ font-weight: 600;
81
+ border: 1px solid #93c5fd;
82
+ text-transform: uppercase;
83
+ letter-spacing: 0.5px;
84
+ margin-top: 6px;
85
+ ">${workflow.metadata.domain}</span>`
86
+ : ''
87
+ }
88
+ </div>
89
+ <p style="color: #64748b; margin-bottom: 20px; text-align: center;">${workflow.description || ''}</p>
90
+ `;
91
+
92
+ // Add click handler for workflow title
93
+ const titleElement = title.querySelector(
94
+ '.workflow-title-clickable'
95
+ ) as HTMLElement;
96
+ if (titleElement) {
97
+ titleElement.addEventListener('click', () => {
98
+ if (this.onElementClick) {
99
+ this.onElementClick('clear-selection', '', null);
100
+ }
101
+ });
102
+
103
+ // Add hover effects
104
+ titleElement.addEventListener('mouseenter', () => {
105
+ titleElement.style.backgroundColor = '#f8fafc';
106
+ });
107
+
108
+ titleElement.addEventListener('mouseleave', () => {
109
+ titleElement.style.backgroundColor = 'transparent';
110
+ });
111
+ }
112
+
113
+ diagramContainer.appendChild(title);
114
+
115
+ // Add PlantUML diagram with SVG proxy for interactivity
116
+ const diagramWrapper = document.createElement('div');
117
+ diagramWrapper.style.position = 'relative';
118
+ diagramWrapper.style.display = 'inline-block';
119
+
120
+ // Instead of img, fetch the SVG directly and embed it
121
+ this.loadInteractiveSVG(diagramUrl, diagramWrapper, workflow);
122
+
123
+ diagramContainer.appendChild(diagramWrapper);
124
+
125
+ this.container.appendChild(diagramContainer);
126
+ }
127
+
128
+ /**
129
+ * Generate PlantUML state machine code with proper syntax and auto-layout
130
+ */
131
+ private generatePlantUMLStateMachine(workflow: YamlStateMachine): string {
132
+ const lines: string[] = [];
133
+
134
+ lines.push('@startuml');
135
+ lines.push('!theme plain');
136
+ lines.push('skinparam backgroundColor white');
137
+ lines.push('skinparam state {');
138
+ lines.push(' BackgroundColor white');
139
+ lines.push(' BorderColor #2563eb');
140
+ lines.push(' FontColor #1e293b');
141
+ lines.push(' FontSize 12');
142
+ lines.push('}');
143
+ lines.push('skinparam arrow {');
144
+ lines.push(' Color #94a3b8');
145
+ lines.push(' FontColor #64748b');
146
+ lines.push(' FontSize 10');
147
+ lines.push('}');
148
+ lines.push('');
149
+
150
+ // Add initial state
151
+ lines.push(`[*] --> ${workflow.initial_state}`);
152
+ lines.push('');
153
+
154
+ // Add states with descriptions
155
+ for (const [stateName, stateConfig] of Object.entries(workflow.states) as [
156
+ string,
157
+ YamlState,
158
+ ][]) {
159
+ if (stateConfig.description) {
160
+ lines.push(`${stateName} : ${stateConfig.description}`);
161
+ }
162
+ }
163
+ lines.push('');
164
+
165
+ // Add transitions
166
+ for (const [stateName, stateConfig] of Object.entries(workflow.states) as [
167
+ string,
168
+ YamlState,
169
+ ][]) {
170
+ if (stateConfig.transitions) {
171
+ for (const transition of stateConfig.transitions) {
172
+ const label = transition.trigger.replace(/_/g, ' ');
173
+
174
+ // Check for review perspectives and add review icon
175
+ const hasReviews =
176
+ transition.review_perspectives &&
177
+ transition.review_perspectives.length > 0;
178
+ // Add review indicator
179
+ let reviewIcon = '';
180
+ if (hasReviews) {
181
+ reviewIcon = ' 🛡️';
182
+ }
183
+
184
+ const finalLabel = `${label}${reviewIcon}`;
185
+ lines.push(`${stateName} --> ${transition.to} : ${finalLabel}`);
186
+ }
187
+ }
188
+ }
189
+
190
+ // Add final states if any
191
+ const finalStates = Object.keys(workflow.states).filter(state => {
192
+ const stateConfig = workflow.states[state];
193
+ return (
194
+ stateConfig &&
195
+ (!stateConfig.transitions || stateConfig.transitions.length === 0)
196
+ );
197
+ });
198
+ if (finalStates.length > 0) {
199
+ lines.push('');
200
+ for (const state of finalStates) {
201
+ lines.push(`${state} --> [*]`);
202
+ }
203
+ }
204
+
205
+ lines.push('');
206
+ lines.push('@enduml');
207
+
208
+ return lines.join('\n');
209
+ }
210
+
211
+ /**
212
+ * Create PlantUML web service URL with proper encoding
213
+ */
214
+ private async createPlantUMLUrl(plantUMLCode: string): Promise<string> {
215
+ try {
216
+ // Try DEFLATE encoding first (proper PlantUML format)
217
+ const encoded = await encodePlantUML(plantUMLCode);
218
+ return `https://www.plantuml.com/plantuml/svg/${encoded}`;
219
+ } catch (error) {
220
+ console.warn('DEFLATE encoding failed, trying fallback:', error);
221
+ try {
222
+ // Fallback to base64 with ~1 header
223
+ const encoded = await encodePlantUMLFallback(plantUMLCode);
224
+ return `https://www.plantuml.com/plantuml/svg/${encoded}`;
225
+ } catch (fallbackError) {
226
+ console.error('All PlantUML encoding methods failed:', fallbackError);
227
+ // Final fallback to simple URL encoding
228
+ const encoded = encodeURIComponent(plantUMLCode);
229
+ return `https://www.plantuml.com/plantuml/svg/~1${encoded}`;
230
+ }
231
+ }
232
+ }
233
+
234
+ /**
235
+ * Load SVG directly and make it interactive
236
+ */
237
+ private async loadInteractiveSVG(
238
+ svgUrl: string,
239
+ container: HTMLElement,
240
+ workflow: YamlStateMachine
241
+ ): Promise<void> {
242
+ try {
243
+ const response = await fetch(svgUrl);
244
+
245
+ if (!response.ok) {
246
+ throw new Error(`Failed to fetch SVG: ${response.status}`);
247
+ }
248
+
249
+ const svgText = await response.text();
250
+
251
+ // Create a div to hold the SVG
252
+ const svgContainer = document.createElement('div');
253
+ svgContainer.innerHTML = svgText;
254
+ svgContainer.style.border = '1px solid #e2e8f0';
255
+ svgContainer.style.borderRadius = '8px';
256
+ svgContainer.style.backgroundColor = 'white';
257
+ svgContainer.style.overflow = 'hidden';
258
+
259
+ const svgElement = svgContainer.querySelector('svg');
260
+ if (svgElement) {
261
+ // Make SVG responsive
262
+ svgElement.style.maxWidth = '100%';
263
+ svgElement.style.height = 'auto';
264
+ svgElement.style.display = 'block';
265
+
266
+ // Add interactivity to SVG elements
267
+ this.makeSVGInteractive(svgElement, workflow);
268
+ }
269
+
270
+ container.appendChild(svgContainer);
271
+ } catch (error) {
272
+ console.error('Failed to load interactive SVG:', error);
273
+ this.showError('Failed to load interactive diagram. Using fallback.');
274
+ this.renderFallbackDiagram();
275
+ }
276
+ }
277
+
278
+ /**
279
+ * Make SVG elements interactive by adding click handlers
280
+ */
281
+ private makeSVGInteractive(
282
+ svgElement: SVGSVGElement,
283
+ workflow: YamlStateMachine
284
+ ): void {
285
+ /**
286
+ * STATE DETECTION STRATEGY:
287
+ *
288
+ * PlantUML generates SVG where state elements don't have meaningful IDs that match
289
+ * state names. Instead, states appear as <g> elements with empty/random IDs, but
290
+ * they contain <text> elements with the actual state names.
291
+ *
292
+ * Strategy:
293
+ * 1. Find all <text> elements in the SVG
294
+ * 2. Check if text content matches any workflow state name
295
+ * 3. Navigate up to find the parent <g> element
296
+ * 4. Attach click handlers to the parent <g>
297
+ *
298
+ * This approach works because PlantUML consistently puts state names
299
+ * in <text> elements, even though the container IDs are not predictable.
300
+ */
301
+ const states = Object.keys(workflow.states);
302
+
303
+ // Find all text elements and check if their content matches a state name
304
+ const textElements = svgElement.querySelectorAll('text');
305
+ for (const textElement of textElements) {
306
+ const textContent = textElement.textContent?.trim();
307
+ if (textContent && states.includes(textContent)) {
308
+ // Found a text element with a state name, get its parent group
309
+ const group = textElement.closest('g');
310
+ if (group) {
311
+ const stateName = textContent;
312
+
313
+ // Make the entire group clickable
314
+ (group as unknown as HTMLElement).style.cursor = 'pointer';
315
+ (group as unknown as HTMLElement).style.transition = 'all 0.2s ease';
316
+
317
+ // Find the rect/shape element for hover effects
318
+ const shape = group.querySelector('rect, ellipse, polygon');
319
+ const originalFill = shape?.getAttribute('fill') || '#ffffff';
320
+ const originalStroke = shape?.getAttribute('stroke') || '#000000';
321
+
322
+ // Add hover effects
323
+ group.addEventListener('mouseenter', () => {
324
+ if (shape) {
325
+ shape.setAttribute('fill', '#e0f2fe');
326
+ shape.setAttribute('stroke', '#2563eb');
327
+ shape.setAttribute('stroke-width', '2');
328
+ }
329
+ });
330
+
331
+ group.addEventListener('mouseleave', () => {
332
+ if (shape) {
333
+ shape.setAttribute('fill', originalFill);
334
+ shape.setAttribute('stroke', originalStroke);
335
+ shape.setAttribute('stroke-width', '1');
336
+ }
337
+ });
338
+
339
+ // Add click handler
340
+ group.addEventListener('click', e => {
341
+ e.stopPropagation();
342
+ if (this.onElementClick) {
343
+ this.onElementClick(
344
+ 'state',
345
+ stateName,
346
+ workflow.states[stateName]
347
+ );
348
+ }
349
+ });
350
+ }
351
+ }
352
+ }
353
+
354
+ /**
355
+ * TRANSITION DETECTION STRATEGY:
356
+ *
357
+ * PlantUML generates transition elements as <g class="link"> with IDs like "lnk3",
358
+ * "lnk4", etc. These IDs don't contain source/target state information.
359
+ *
360
+ * The original code expected IDs like "link_reproduce_analyze" but PlantUML
361
+ * generates generic IDs like "lnk3". We can't rely on ID parsing.
362
+ *
363
+ * Strategy:
364
+ * 1. Find all <g class="link"> elements with IDs starting with "lnk"
365
+ * 2. Extract the transition label text from the <text> element inside
366
+ * 3. Use fuzzy text matching to find corresponding transition in workflow data
367
+ * 4. Match transition trigger text against the SVG label text
368
+ * 5. Attach click handlers with full transition data
369
+ *
370
+ * This approach works because:
371
+ * - PlantUML consistently puts transition labels in <text> elements
372
+ * - We can normalize text (underscores to spaces) for matching
373
+ * - We have access to complete workflow transition data for context
374
+ */
375
+ const linkGroups = svgElement.querySelectorAll('g.link[id^="lnk"]');
376
+ for (const linkGroup of linkGroups) {
377
+ const linkId = linkGroup.getAttribute('id');
378
+ if (linkId && linkId.startsWith('lnk')) {
379
+ // Make the entire link group clickable
380
+ (linkGroup as unknown as HTMLElement).style.cursor = 'pointer';
381
+ (linkGroup as unknown as HTMLElement).style.transition =
382
+ 'all 0.2s ease';
383
+
384
+ // Find path and text elements for hover effects
385
+ const pathEl = linkGroup.querySelector('path');
386
+ const textEl = linkGroup.querySelector('text');
387
+ const originalStroke = pathEl?.getAttribute('stroke') || '#94A3B8';
388
+ const originalTextFill = textEl?.getAttribute('fill') || '#64748B';
389
+
390
+ // Add hover effects
391
+ linkGroup.addEventListener('mouseenter', () => {
392
+ if (pathEl) {
393
+ pathEl.setAttribute('stroke', '#2563eb');
394
+ pathEl.setAttribute('stroke-width', '3');
395
+ }
396
+ if (textEl) {
397
+ textEl.setAttribute('fill', '#2563eb');
398
+ (textEl as unknown as HTMLElement).style.fontWeight = 'bold';
399
+ }
400
+ });
401
+
402
+ linkGroup.addEventListener('mouseleave', () => {
403
+ if (pathEl) {
404
+ pathEl.setAttribute('stroke', originalStroke);
405
+ pathEl.setAttribute('stroke-width', '1');
406
+ }
407
+ if (textEl) {
408
+ textEl.setAttribute('fill', originalTextFill);
409
+ (textEl as unknown as HTMLElement).style.fontWeight = 'normal';
410
+ }
411
+ });
412
+
413
+ // Add click handler - find transition by label text matching
414
+ linkGroup.addEventListener('click', e => {
415
+ e.stopPropagation();
416
+
417
+ // Try to find matching transition by analyzing the label text
418
+ const labelText = textEl?.textContent?.trim();
419
+ if (labelText) {
420
+ // Clean the label text (remove emoji/icons, normalize spaces)
421
+ const cleanLabel = labelText.replace(/[^\w\s]/g, '').trim();
422
+
423
+ // Search through all states to find matching transition
424
+ for (const [stateName, stateData] of Object.entries(
425
+ workflow.states
426
+ )) {
427
+ if (stateData.transitions) {
428
+ for (const transition of stateData.transitions) {
429
+ // Normalize trigger text: "bug_reproduced" -> "bug reproduced"
430
+ const cleanTrigger = transition.trigger.replace(/_/g, ' ');
431
+
432
+ // Fuzzy match: check if labels contain each other (case-insensitive)
433
+ if (
434
+ cleanTrigger
435
+ .toLowerCase()
436
+ .includes(cleanLabel.toLowerCase()) ||
437
+ cleanLabel
438
+ .toLowerCase()
439
+ .includes(cleanTrigger.toLowerCase())
440
+ ) {
441
+ // Found matching transition - attach complete data
442
+ if (this.onElementClick) {
443
+ this.onElementClick(
444
+ 'transition',
445
+ `${stateName}->${transition.to}`,
446
+ {
447
+ from: stateName,
448
+ to: transition.to,
449
+ trigger: transition.trigger,
450
+ instructions: transition.instructions,
451
+ additional_instructions:
452
+ transition.additional_instructions,
453
+ transition_reason: transition.transition_reason,
454
+ review_perspectives:
455
+ transition.review_perspectives || [],
456
+ }
457
+ );
458
+ }
459
+ return; // Exit once we find a match
460
+ }
461
+ }
462
+ }
463
+ }
464
+ }
465
+
466
+ // Note: If no transition mapping is found, the click is silently ignored
467
+ // This can happen if the PlantUML label doesn't match any workflow trigger text
468
+ });
469
+ }
470
+ }
471
+ }
472
+
473
+ /**
474
+ * Render fallback diagram if PlantUML fails
475
+ */
476
+ private renderFallbackDiagram(): void {
477
+ const fallbackDiv = document.createElement('div');
478
+ fallbackDiv.style.padding = '20px';
479
+ fallbackDiv.style.border = '2px dashed #94a3b8';
480
+ fallbackDiv.style.borderRadius = '8px';
481
+ fallbackDiv.style.backgroundColor = '#f8fafc';
482
+ fallbackDiv.style.textAlign = 'center';
483
+
484
+ fallbackDiv.innerHTML = `
485
+ <div style="color: #64748b; margin-bottom: 20px;">
486
+ <strong>⚠️ PlantUML diagram failed to load</strong><br>
487
+ <span style="font-size: 14px;">Using fallback interactive view</span>
488
+ </div>
489
+ `;
490
+
491
+ this.container.appendChild(fallbackDiv);
492
+ }
493
+
494
+ /**
495
+ * Show error message
496
+ */
497
+ private showError(message: string): void {
498
+ console.error(message);
499
+ }
500
+
501
+ /**
502
+ * Clear the container
503
+ */
504
+ public clear(): void {
505
+ this.container.innerHTML = '';
506
+ }
507
+ }