@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.
- package/README.md +91 -0
- package/package.json +77 -17
- package/packages/cli/dist/chunk-R5U7XKVJ.js +16 -0
- package/packages/cli/dist/chunk-RTDQR2KY.js +6718 -0
- package/packages/cli/dist/cli-CZ4FMSWR.js +1421 -0
- package/packages/cli/dist/dist-KZOA4GL5.js +65 -0
- package/packages/cli/dist/dist-UGVUJIDN.js +14475 -0
- package/packages/cli/dist/index.js +21 -0
- package/packages/cli/package.json +28 -0
- package/packages/core/dist/beads-integration.d.ts +50 -0
- package/packages/core/dist/beads-integration.js +387 -0
- package/packages/core/dist/beads-integration.js.map +1 -0
- package/packages/core/dist/beads-state-manager.d.ts +58 -0
- package/packages/core/dist/beads-state-manager.js +212 -0
- package/packages/core/dist/beads-state-manager.js.map +1 -0
- package/packages/core/dist/config-manager.d.ts +24 -0
- package/packages/core/dist/config-manager.js +68 -0
- package/packages/core/dist/config-manager.js.map +1 -0
- package/packages/core/dist/conversation-manager.d.ts +98 -0
- package/packages/core/dist/conversation-manager.js +382 -0
- package/packages/core/dist/conversation-manager.js.map +1 -0
- package/packages/core/dist/file-detection-manager.d.ts +53 -0
- package/packages/core/dist/file-detection-manager.js +221 -0
- package/packages/core/dist/file-detection-manager.js.map +1 -0
- package/packages/core/dist/file-storage.d.ts +93 -0
- package/packages/core/dist/file-storage.js +301 -0
- package/packages/core/dist/file-storage.js.map +1 -0
- package/packages/core/dist/git-manager.d.ts +22 -0
- package/packages/core/dist/git-manager.js +123 -0
- package/packages/core/dist/git-manager.js.map +1 -0
- package/packages/core/dist/index.d.ts +24 -0
- package/packages/core/dist/index.js +31 -0
- package/packages/core/dist/index.js.map +1 -0
- package/packages/core/dist/instruction-generator.d.ts +40 -0
- package/packages/core/dist/instruction-generator.js +89 -0
- package/packages/core/dist/instruction-generator.js.map +1 -0
- package/packages/core/dist/interaction-logger.d.ts +37 -0
- package/packages/core/dist/interaction-logger.js +87 -0
- package/packages/core/dist/interaction-logger.js.map +1 -0
- package/packages/core/dist/interfaces/index.d.ts +9 -0
- package/packages/core/dist/interfaces/index.js +10 -0
- package/packages/core/dist/interfaces/index.js.map +1 -0
- package/packages/core/dist/interfaces/instruction-generator.interface.d.ts +41 -0
- package/packages/core/dist/interfaces/instruction-generator.interface.js +8 -0
- package/packages/core/dist/interfaces/instruction-generator.interface.js.map +1 -0
- package/packages/core/dist/interfaces/plan-manager.interface.d.ts +55 -0
- package/packages/core/dist/interfaces/plan-manager.interface.js +8 -0
- package/packages/core/dist/interfaces/plan-manager.interface.js.map +1 -0
- package/packages/core/dist/interfaces/task-backend-client.interface.d.ts +52 -0
- package/packages/core/dist/interfaces/task-backend-client.interface.js +8 -0
- package/packages/core/dist/interfaces/task-backend-client.interface.js.map +1 -0
- package/packages/core/dist/logger.d.ts +64 -0
- package/packages/core/dist/logger.js +283 -0
- package/packages/core/dist/logger.js.map +1 -0
- package/packages/core/dist/path-validation-utils.d.ts +75 -0
- package/packages/core/dist/path-validation-utils.js +238 -0
- package/packages/core/dist/path-validation-utils.js.map +1 -0
- package/packages/core/dist/persistence-interface.d.ts +91 -0
- package/packages/core/dist/persistence-interface.js +9 -0
- package/packages/core/dist/persistence-interface.js.map +1 -0
- package/{dist/components/beads/beads-plan-manager.d.ts → packages/core/dist/plan-manager.d.ts} +15 -15
- package/{dist/components/beads/beads-plan-manager.js → packages/core/dist/plan-manager.js} +66 -50
- package/packages/core/dist/plan-manager.js.map +1 -0
- package/packages/core/dist/project-docs-manager.d.ts +119 -0
- package/packages/core/dist/project-docs-manager.js +366 -0
- package/packages/core/dist/project-docs-manager.js.map +1 -0
- package/packages/core/dist/state-machine-loader.d.ts +61 -0
- package/packages/core/dist/state-machine-loader.js +273 -0
- package/packages/core/dist/state-machine-loader.js.map +1 -0
- package/packages/core/dist/state-machine-types.d.ts +64 -0
- package/packages/core/dist/state-machine-types.js +7 -0
- package/packages/core/dist/state-machine-types.js.map +1 -0
- package/packages/core/dist/state-machine.d.ts +52 -0
- package/packages/core/dist/state-machine.js +256 -0
- package/packages/core/dist/state-machine.js.map +1 -0
- package/packages/core/dist/system-prompt-generator.d.ts +14 -0
- package/packages/core/dist/system-prompt-generator.js +42 -0
- package/packages/core/dist/system-prompt-generator.js.map +1 -0
- package/packages/core/dist/task-backend.d.ts +45 -0
- package/packages/core/dist/task-backend.js +176 -0
- package/packages/core/dist/task-backend.js.map +1 -0
- package/packages/core/dist/template-manager.d.ts +61 -0
- package/packages/core/dist/template-manager.js +231 -0
- package/packages/core/dist/template-manager.js.map +1 -0
- package/packages/core/dist/transition-engine.d.ts +77 -0
- package/packages/core/dist/transition-engine.js +244 -0
- package/packages/core/dist/transition-engine.js.map +1 -0
- package/packages/core/dist/types.d.ts +54 -0
- package/packages/core/dist/types.js +5 -0
- package/packages/core/dist/workflow-manager.d.ts +89 -0
- package/packages/core/dist/workflow-manager.js +468 -0
- package/packages/core/dist/workflow-manager.js.map +1 -0
- package/packages/core/package.json +33 -0
- package/packages/docs/.vitepress/dist/.gitignore +2 -0
- package/packages/docs/.vitepress/dist/404.html +23 -0
- package/packages/docs/.vitepress/dist/assets/app.Dz3lZH3M.js +1 -0
- package/packages/docs/.vitepress/dist/assets/chunks/framework.DZS7lpav.js +19 -0
- package/packages/docs/.vitepress/dist/assets/chunks/theme.q5Ewb3F1.js +206 -0
- package/packages/docs/.vitepress/dist/assets/dev_ARCHITECTURE.md.da_vFDwM.js +130 -0
- package/packages/docs/.vitepress/dist/assets/dev_ARCHITECTURE.md.da_vFDwM.lean.js +1 -0
- package/packages/docs/.vitepress/dist/assets/dev_DEVELOPMENT.md.DWl9cccE.js +72 -0
- package/packages/docs/.vitepress/dist/assets/dev_DEVELOPMENT.md.DWl9cccE.lean.js +1 -0
- package/packages/docs/.vitepress/dist/assets/dev_LOGGING.md.BebvbW7z.js +34 -0
- package/packages/docs/.vitepress/dist/assets/dev_LOGGING.md.BebvbW7z.lean.js +1 -0
- package/packages/docs/.vitepress/dist/assets/dev_PUBLISHING.md.CQqbiIOF.js +1 -0
- package/packages/docs/.vitepress/dist/assets/dev_PUBLISHING.md.CQqbiIOF.lean.js +1 -0
- package/packages/docs/.vitepress/dist/assets/index.md.D6ROLohf.js +2 -0
- package/packages/docs/.vitepress/dist/assets/index.md.D6ROLohf.lean.js +1 -0
- package/packages/docs/.vitepress/dist/assets/inter-italic-cyrillic-ext.r48I6akx.woff2 +0 -0
- package/packages/docs/.vitepress/dist/assets/inter-italic-cyrillic.By2_1cv3.woff2 +0 -0
- package/packages/docs/.vitepress/dist/assets/inter-italic-greek-ext.1u6EdAuj.woff2 +0 -0
- package/packages/docs/.vitepress/dist/assets/inter-italic-greek.DJ8dCoTZ.woff2 +0 -0
- package/packages/docs/.vitepress/dist/assets/inter-italic-latin-ext.CN1xVJS-.woff2 +0 -0
- package/packages/docs/.vitepress/dist/assets/inter-italic-latin.C2AdPX0b.woff2 +0 -0
- package/packages/docs/.vitepress/dist/assets/inter-italic-vietnamese.BSbpV94h.woff2 +0 -0
- package/packages/docs/.vitepress/dist/assets/inter-roman-cyrillic-ext.BBPuwvHQ.woff2 +0 -0
- package/packages/docs/.vitepress/dist/assets/inter-roman-cyrillic.C5lxZ8CY.woff2 +0 -0
- package/packages/docs/.vitepress/dist/assets/inter-roman-greek-ext.CqjqNYQ-.woff2 +0 -0
- package/packages/docs/.vitepress/dist/assets/inter-roman-greek.BBVDIX6e.woff2 +0 -0
- package/packages/docs/.vitepress/dist/assets/inter-roman-latin-ext.4ZJIpNVo.woff2 +0 -0
- package/packages/docs/.vitepress/dist/assets/inter-roman-latin.Di8DUHzh.woff2 +0 -0
- package/packages/docs/.vitepress/dist/assets/inter-roman-vietnamese.BjW4sHH5.woff2 +0 -0
- package/packages/docs/.vitepress/dist/assets/mcp-interaction-pattern.VdvOPuTt.png +0 -0
- package/packages/docs/.vitepress/dist/assets/placeholder-demo-greenfield.B8lG_tBI.png +0 -0
- package/packages/docs/.vitepress/dist/assets/style.CAgdBzOq.css +1 -0
- package/packages/docs/.vitepress/dist/assets/user_advanced-engineering.md.MkETYNtq.js +50 -0
- package/packages/docs/.vitepress/dist/assets/user_advanced-engineering.md.MkETYNtq.lean.js +1 -0
- package/packages/docs/.vitepress/dist/assets/user_agent-setup.md.B54OLL2H.js +24 -0
- package/packages/docs/.vitepress/dist/assets/user_agent-setup.md.B54OLL2H.lean.js +1 -0
- package/packages/docs/.vitepress/dist/assets/user_beads-integration.md.BzdR5Fif.js +15 -0
- package/packages/docs/.vitepress/dist/assets/user_beads-integration.md.BzdR5Fif.lean.js +1 -0
- package/packages/docs/.vitepress/dist/assets/user_crowd-mcp-integration.md.C15kSdIJ.js +157 -0
- package/packages/docs/.vitepress/dist/assets/user_crowd-mcp-integration.md.C15kSdIJ.lean.js +1 -0
- package/packages/docs/.vitepress/dist/assets/user_custom-workflows.md.Cz4IYCXa.js +143 -0
- package/packages/docs/.vitepress/dist/assets/user_custom-workflows.md.Cz4IYCXa.lean.js +1 -0
- package/packages/docs/.vitepress/dist/assets/user_git-commit-feature.md.UcTvDR-O.js +1 -0
- package/packages/docs/.vitepress/dist/assets/user_git-commit-feature.md.UcTvDR-O.lean.js +1 -0
- package/packages/docs/.vitepress/dist/assets/user_how-it-works.md.DiOXNgaL.js +23 -0
- package/packages/docs/.vitepress/dist/assets/user_how-it-works.md.DiOXNgaL.lean.js +1 -0
- package/packages/docs/.vitepress/dist/assets/user_long-term-memory.md.DZh0tjNa.js +43 -0
- package/packages/docs/.vitepress/dist/assets/user_long-term-memory.md.DZh0tjNa.lean.js +1 -0
- package/packages/docs/.vitepress/dist/assets/user_packaged-workflows.md.s1HT89ZU.js +2 -0
- package/packages/docs/.vitepress/dist/assets/user_packaged-workflows.md.s1HT89ZU.lean.js +1 -0
- package/packages/docs/.vitepress/dist/assets/user_tutorial.md.Dmj8zLB2.js +3 -0
- package/packages/docs/.vitepress/dist/assets/user_tutorial.md.Dmj8zLB2.lean.js +1 -0
- package/packages/docs/.vitepress/dist/assets/user_workflow-selection.md.CrPGw9Hr.js +7 -0
- package/packages/docs/.vitepress/dist/assets/user_workflow-selection.md.CrPGw9Hr.lean.js +1 -0
- package/packages/docs/.vitepress/dist/assets/workflows.md.Bm5sGt3u.js +1 -0
- package/packages/docs/.vitepress/dist/assets/workflows.md.Bm5sGt3u.lean.js +1 -0
- package/packages/docs/.vitepress/dist/assets/workflows_adr.md.DEaXkbRp.js +1 -0
- package/packages/docs/.vitepress/dist/assets/workflows_adr.md.DEaXkbRp.lean.js +1 -0
- package/packages/docs/.vitepress/dist/assets/workflows_big-bang-conversion.md.BA5R1LxZ.js +1 -0
- package/packages/docs/.vitepress/dist/assets/workflows_big-bang-conversion.md.BA5R1LxZ.lean.js +1 -0
- package/packages/docs/.vitepress/dist/assets/workflows_boundary-testing.md.DBcYnMhx.js +1 -0
- package/packages/docs/.vitepress/dist/assets/workflows_boundary-testing.md.DBcYnMhx.lean.js +1 -0
- package/packages/docs/.vitepress/dist/assets/workflows_bugfix.md.CZRCL0Hp.js +1 -0
- package/packages/docs/.vitepress/dist/assets/workflows_bugfix.md.CZRCL0Hp.lean.js +1 -0
- package/packages/docs/.vitepress/dist/assets/workflows_business-analysis.md.fGLml8Hw.js +1 -0
- package/packages/docs/.vitepress/dist/assets/workflows_business-analysis.md.fGLml8Hw.lean.js +1 -0
- package/packages/docs/.vitepress/dist/assets/workflows_c4-analysis.md.Dnssqzuf.js +1 -0
- package/packages/docs/.vitepress/dist/assets/workflows_c4-analysis.md.Dnssqzuf.lean.js +1 -0
- package/packages/docs/.vitepress/dist/assets/workflows_epcc.md.M6DnIhpp.js +1 -0
- package/packages/docs/.vitepress/dist/assets/workflows_epcc.md.M6DnIhpp.lean.js +1 -0
- package/packages/docs/.vitepress/dist/assets/workflows_game-beginner.md.CNxzWLtd.js +1 -0
- package/packages/docs/.vitepress/dist/assets/workflows_game-beginner.md.CNxzWLtd.lean.js +1 -0
- package/packages/docs/.vitepress/dist/assets/workflows_greenfield.md.vx_g-WOe.js +1 -0
- package/packages/docs/.vitepress/dist/assets/workflows_greenfield.md.vx_g-WOe.lean.js +1 -0
- package/packages/docs/.vitepress/dist/assets/workflows_minor.md.DdnfwMf4.js +1 -0
- package/packages/docs/.vitepress/dist/assets/workflows_minor.md.DdnfwMf4.lean.js +1 -0
- package/packages/docs/.vitepress/dist/assets/workflows_posts.md.SOldXvq7.js +1 -0
- package/packages/docs/.vitepress/dist/assets/workflows_posts.md.SOldXvq7.lean.js +1 -0
- package/packages/docs/.vitepress/dist/assets/workflows_sdd-bugfix-crowd.md.-lSf42gJ.js +1 -0
- package/packages/docs/.vitepress/dist/assets/workflows_sdd-bugfix-crowd.md.-lSf42gJ.lean.js +1 -0
- package/packages/docs/.vitepress/dist/assets/workflows_sdd-bugfix.md.oRAsEVbc.js +1 -0
- package/packages/docs/.vitepress/dist/assets/workflows_sdd-bugfix.md.oRAsEVbc.lean.js +1 -0
- package/packages/docs/.vitepress/dist/assets/workflows_sdd-feature-crowd.md.DAtnfCAd.js +1 -0
- package/packages/docs/.vitepress/dist/assets/workflows_sdd-feature-crowd.md.DAtnfCAd.lean.js +1 -0
- package/packages/docs/.vitepress/dist/assets/workflows_sdd-feature.md.Ce3-H_g3.js +1 -0
- package/packages/docs/.vitepress/dist/assets/workflows_sdd-feature.md.Ce3-H_g3.lean.js +1 -0
- package/packages/docs/.vitepress/dist/assets/workflows_sdd-greenfield-crowd.md.8DUvcmLe.js +1 -0
- package/packages/docs/.vitepress/dist/assets/workflows_sdd-greenfield-crowd.md.8DUvcmLe.lean.js +1 -0
- package/packages/docs/.vitepress/dist/assets/workflows_sdd-greenfield.md.eEN6U0J4.js +1 -0
- package/packages/docs/.vitepress/dist/assets/workflows_sdd-greenfield.md.eEN6U0J4.lean.js +1 -0
- package/packages/docs/.vitepress/dist/assets/workflows_slides.md.Cqt-19_1.js +1 -0
- package/packages/docs/.vitepress/dist/assets/workflows_slides.md.Cqt-19_1.lean.js +1 -0
- package/packages/docs/.vitepress/dist/assets/workflows_tdd.md.BjVC69tu.js +1 -0
- package/packages/docs/.vitepress/dist/assets/workflows_tdd.md.BjVC69tu.lean.js +1 -0
- package/packages/docs/.vitepress/dist/assets/workflows_waterfall.md.CL6jTZP9.js +1 -0
- package/packages/docs/.vitepress/dist/assets/workflows_waterfall.md.CL6jTZP9.lean.js +1 -0
- package/packages/docs/.vitepress/dist/dev/ARCHITECTURE.html +155 -0
- package/packages/docs/.vitepress/dist/dev/DEVELOPMENT.html +97 -0
- package/packages/docs/.vitepress/dist/dev/LOGGING.html +59 -0
- package/packages/docs/.vitepress/dist/dev/PUBLISHING.html +30 -0
- package/packages/docs/.vitepress/dist/hashmap.json +1 -0
- package/packages/docs/.vitepress/dist/index.html +27 -0
- package/packages/docs/.vitepress/dist/user/advanced-engineering.html +75 -0
- package/packages/docs/.vitepress/dist/user/agent-setup.html +49 -0
- package/packages/docs/.vitepress/dist/user/beads-integration.html +40 -0
- package/packages/docs/.vitepress/dist/user/crowd-mcp-integration.html +182 -0
- package/packages/docs/.vitepress/dist/user/custom-workflows.html +168 -0
- package/packages/docs/.vitepress/dist/user/git-commit-feature.html +30 -0
- package/packages/docs/.vitepress/dist/user/how-it-works.html +48 -0
- package/packages/docs/.vitepress/dist/user/long-term-memory.html +68 -0
- package/packages/docs/.vitepress/dist/user/packaged-workflows.html +27 -0
- package/packages/docs/.vitepress/dist/user/tutorial.html +28 -0
- package/packages/docs/.vitepress/dist/user/workflow-selection.html +32 -0
- package/packages/docs/.vitepress/dist/vp-icons.css +0 -0
- package/packages/docs/.vitepress/dist/workflows/adr.html +26 -0
- package/packages/docs/.vitepress/dist/workflows/adr.yaml +157 -0
- package/packages/docs/.vitepress/dist/workflows/big-bang-conversion.html +26 -0
- package/packages/docs/.vitepress/dist/workflows/big-bang-conversion.yaml +592 -0
- package/packages/docs/.vitepress/dist/workflows/boundary-testing.html +26 -0
- package/packages/docs/.vitepress/dist/workflows/boundary-testing.yaml +376 -0
- package/packages/docs/.vitepress/dist/workflows/bugfix.html +26 -0
- package/packages/docs/.vitepress/dist/workflows/bugfix.yaml +177 -0
- package/packages/docs/.vitepress/dist/workflows/business-analysis.html +26 -0
- package/packages/docs/.vitepress/dist/workflows/business-analysis.yaml +597 -0
- package/packages/docs/.vitepress/dist/workflows/c4-analysis.html +26 -0
- package/packages/docs/.vitepress/dist/workflows/c4-analysis.yaml +471 -0
- package/packages/docs/.vitepress/dist/workflows/epcc.html +26 -0
- package/packages/docs/.vitepress/dist/workflows/epcc.yaml +183 -0
- package/packages/docs/.vitepress/dist/workflows/game-beginner.html +26 -0
- package/packages/docs/.vitepress/dist/workflows/game-beginner.yaml +434 -0
- package/packages/docs/.vitepress/dist/workflows/greenfield.html +26 -0
- package/packages/docs/.vitepress/dist/workflows/greenfield.yaml +201 -0
- package/packages/docs/.vitepress/dist/workflows/minor.html +26 -0
- package/packages/docs/.vitepress/dist/workflows/minor.yaml +138 -0
- package/packages/docs/.vitepress/dist/workflows/posts.html +26 -0
- package/packages/docs/.vitepress/dist/workflows/posts.yaml +193 -0
- package/packages/docs/.vitepress/dist/workflows/sdd-bugfix-crowd.html +26 -0
- package/packages/docs/.vitepress/dist/workflows/sdd-bugfix-crowd.yaml +608 -0
- package/packages/docs/.vitepress/dist/workflows/sdd-bugfix.html +26 -0
- package/packages/docs/.vitepress/dist/workflows/sdd-bugfix.yaml +381 -0
- package/packages/docs/.vitepress/dist/workflows/sdd-feature-crowd.html +26 -0
- package/packages/docs/.vitepress/dist/workflows/sdd-feature-crowd.yaml +713 -0
- package/packages/docs/.vitepress/dist/workflows/sdd-feature.html +26 -0
- package/packages/docs/.vitepress/dist/workflows/sdd-feature.yaml +471 -0
- package/packages/docs/.vitepress/dist/workflows/sdd-greenfield-crowd.html +26 -0
- package/packages/docs/.vitepress/dist/workflows/sdd-greenfield-crowd.yaml +336 -0
- package/packages/docs/.vitepress/dist/workflows/sdd-greenfield.html +26 -0
- package/packages/docs/.vitepress/dist/workflows/sdd-greenfield.yaml +463 -0
- package/packages/docs/.vitepress/dist/workflows/slides.html +26 -0
- package/packages/docs/.vitepress/dist/workflows/slides.yaml +237 -0
- package/packages/docs/.vitepress/dist/workflows/tdd.html +26 -0
- package/packages/docs/.vitepress/dist/workflows/tdd.yaml +160 -0
- package/packages/docs/.vitepress/dist/workflows/waterfall.html +26 -0
- package/packages/docs/.vitepress/dist/workflows/waterfall.yaml +209 -0
- package/packages/docs/.vitepress/dist/workflows.html +26 -0
- package/packages/docs/package.json +32 -0
- package/packages/mcp-server/dist/index.js +10546 -0
- package/packages/mcp-server/package.json +41 -0
- package/packages/visualizer/dist/WorkflowVisualizer.vue +1147 -0
- package/packages/visualizer/dist/index.ts +17 -0
- package/packages/visualizer/dist/main.ts +673 -0
- package/packages/visualizer/dist/services/BundledWorkflows.ts +35 -0
- package/packages/visualizer/dist/services/FileUploadHandler.ts +166 -0
- package/packages/visualizer/dist/services/WorkflowLoader.ts +198 -0
- package/packages/visualizer/dist/services/YamlParser.ts +248 -0
- package/packages/visualizer/dist/services/workflow-list.ts +23 -0
- package/packages/visualizer/dist/types/ui-types.ts +84 -0
- package/packages/visualizer/dist/types/visualization-types.ts +95 -0
- package/packages/visualizer/dist/types/vite-env.d.ts +12 -0
- package/packages/visualizer/dist/utils/DomHelpers.ts +206 -0
- package/packages/visualizer/dist/utils/ErrorHandler.ts +170 -0
- package/packages/visualizer/dist/utils/PlantUMLEncoder.ts +121 -0
- package/packages/visualizer/dist/visualization/DiagramRenderer.ts +430 -0
- package/packages/visualizer/dist/visualization/LayoutEngine.ts +339 -0
- package/packages/visualizer/dist/visualization/PlantUMLRenderer.ts +507 -0
- package/packages/visualizer/dist/visualization/StateRenderer.ts +339 -0
- package/packages/visualizer/dist/visualization/TransitionRenderer.ts +432 -0
- package/packages/visualizer/package.json +39 -0
- package/resources/.DS_Store +0 -0
- package/resources/agents/architect.yaml +61 -0
- package/resources/agents/business-analyst.yaml +60 -0
- package/resources/agents/developer.yaml +61 -0
- package/resources/state-machine-schema.json +114 -0
- package/resources/templates/architecture/arc42/arc42-template-EN.md +1077 -0
- package/resources/templates/architecture/arc42/images/01_2_iso-25010-topics-EN.drawio-2023.png +0 -0
- package/resources/templates/architecture/arc42/images/01_2_iso-25010-topics-EN.drawio.png +0 -0
- package/resources/templates/architecture/arc42/images/05_building_blocks-EN.png +0 -0
- package/resources/templates/architecture/arc42/images/08-concepts-EN.drawio.png +0 -0
- package/resources/templates/architecture/arc42/images/arc42-logo.png +0 -0
- package/resources/templates/architecture/c4.md +224 -0
- package/resources/templates/architecture/freestyle.md +53 -0
- package/resources/templates/architecture/game.md +250 -0
- package/resources/templates/architecture/none.md +17 -0
- package/resources/templates/design/comprehensive.md +207 -0
- package/resources/templates/design/freestyle.md +37 -0
- package/resources/templates/design/game.md +66 -0
- package/resources/templates/design/none.md +17 -0
- package/resources/templates/requirements/ears.md +90 -0
- package/resources/templates/requirements/freestyle.md +42 -0
- package/resources/templates/requirements/game.md +162 -0
- package/resources/templates/requirements/none.md +17 -0
- package/resources/templates/skills/POWER.md +23 -0
- package/resources/templates/skills/SKILL.md +19 -0
- package/resources/workflows/adr.yaml +157 -0
- package/resources/workflows/big-bang-conversion.yaml +592 -0
- package/resources/workflows/boundary-testing.yaml +376 -0
- package/resources/workflows/bugfix.yaml +177 -0
- package/resources/workflows/business-analysis.yaml +597 -0
- package/resources/workflows/c4-analysis.yaml +471 -0
- package/resources/workflows/epcc.yaml +183 -0
- package/resources/workflows/game-beginner.yaml +434 -0
- package/resources/workflows/greenfield.yaml +201 -0
- package/resources/workflows/minor.yaml +138 -0
- package/resources/workflows/posts.yaml +193 -0
- package/resources/workflows/sdd-bugfix-crowd.yaml +608 -0
- package/resources/workflows/sdd-bugfix.yaml +381 -0
- package/resources/workflows/sdd-feature-crowd.yaml +713 -0
- package/resources/workflows/sdd-feature.yaml +471 -0
- package/resources/workflows/sdd-greenfield-crowd.yaml +336 -0
- package/resources/workflows/sdd-greenfield.yaml +463 -0
- package/resources/workflows/slides.yaml +237 -0
- package/resources/workflows/tdd.yaml +160 -0
- package/resources/workflows/waterfall.yaml +209 -0
- package/dist/components/beads/beads-instruction-generator.d.ts +0 -44
- package/dist/components/beads/beads-instruction-generator.d.ts.map +0 -1
- package/dist/components/beads/beads-instruction-generator.js +0 -160
- package/dist/components/beads/beads-instruction-generator.js.map +0 -1
- package/dist/components/beads/beads-plan-manager.d.ts.map +0 -1
- package/dist/components/beads/beads-plan-manager.js.map +0 -1
- package/dist/components/beads/beads-task-backend-client.d.ts +0 -43
- package/dist/components/beads/beads-task-backend-client.d.ts.map +0 -1
- package/dist/components/beads/beads-task-backend-client.js +0 -175
- package/dist/components/beads/beads-task-backend-client.js.map +0 -1
- package/dist/index.d.ts +0 -9
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -74
- package/dist/index.js.map +0 -1
- package/dist/notification-service.d.ts +0 -14
- package/dist/notification-service.d.ts.map +0 -1
- package/dist/notification-service.js +0 -18
- package/dist/notification-service.js.map +0 -1
- package/dist/plugin-system/beads-plugin.d.ts +0 -71
- package/dist/plugin-system/beads-plugin.d.ts.map +0 -1
- package/dist/plugin-system/beads-plugin.js +0 -465
- package/dist/plugin-system/beads-plugin.js.map +0 -1
- package/dist/plugin-system/commit-plugin.d.ts +0 -40
- package/dist/plugin-system/commit-plugin.d.ts.map +0 -1
- package/dist/plugin-system/commit-plugin.js +0 -204
- package/dist/plugin-system/commit-plugin.js.map +0 -1
- package/dist/plugin-system/index.d.ts +0 -9
- package/dist/plugin-system/index.d.ts.map +0 -1
- package/dist/plugin-system/index.js +0 -9
- package/dist/plugin-system/index.js.map +0 -1
- package/dist/plugin-system/plugin-interfaces.d.ts +0 -98
- package/dist/plugin-system/plugin-interfaces.d.ts.map +0 -1
- package/dist/plugin-system/plugin-interfaces.js +0 -9
- package/dist/plugin-system/plugin-interfaces.js.map +0 -1
- package/dist/plugin-system/plugin-registry.d.ts +0 -44
- package/dist/plugin-system/plugin-registry.d.ts.map +0 -1
- package/dist/plugin-system/plugin-registry.js +0 -132
- package/dist/plugin-system/plugin-registry.js.map +0 -1
- package/dist/resource-handlers/conversation-state.d.ts +0 -15
- package/dist/resource-handlers/conversation-state.d.ts.map +0 -1
- package/dist/resource-handlers/conversation-state.js +0 -40
- package/dist/resource-handlers/conversation-state.js.map +0 -1
- package/dist/resource-handlers/development-plan.d.ts +0 -14
- package/dist/resource-handlers/development-plan.d.ts.map +0 -1
- package/dist/resource-handlers/development-plan.js +0 -31
- package/dist/resource-handlers/development-plan.js.map +0 -1
- package/dist/resource-handlers/index.d.ts +0 -24
- package/dist/resource-handlers/index.d.ts.map +0 -1
- package/dist/resource-handlers/index.js +0 -62
- package/dist/resource-handlers/index.js.map +0 -1
- package/dist/resource-handlers/system-prompt.d.ts +0 -15
- package/dist/resource-handlers/system-prompt.d.ts.map +0 -1
- package/dist/resource-handlers/system-prompt.js +0 -40
- package/dist/resource-handlers/system-prompt.js.map +0 -1
- package/dist/resource-handlers/workflow-resource.d.ts +0 -15
- package/dist/resource-handlers/workflow-resource.d.ts.map +0 -1
- package/dist/resource-handlers/workflow-resource.js +0 -85
- package/dist/resource-handlers/workflow-resource.js.map +0 -1
- package/dist/response-renderer.d.ts +0 -30
- package/dist/response-renderer.d.ts.map +0 -1
- package/dist/response-renderer.js +0 -94
- package/dist/response-renderer.js.map +0 -1
- package/dist/server-config.d.ts +0 -34
- package/dist/server-config.d.ts.map +0 -1
- package/dist/server-config.js +0 -503
- package/dist/server-config.js.map +0 -1
- package/dist/server-helpers.d.ts +0 -70
- package/dist/server-helpers.d.ts.map +0 -1
- package/dist/server-helpers.js +0 -171
- package/dist/server-helpers.js.map +0 -1
- package/dist/server-implementation.d.ts +0 -74
- package/dist/server-implementation.d.ts.map +0 -1
- package/dist/server-implementation.js +0 -201
- package/dist/server-implementation.js.map +0 -1
- package/dist/server.d.ts +0 -6
- package/dist/server.d.ts.map +0 -1
- package/dist/server.js +0 -5
- package/dist/server.js.map +0 -1
- package/dist/tool-handlers/base-tool-handler.d.ts +0 -50
- package/dist/tool-handlers/base-tool-handler.d.ts.map +0 -1
- package/dist/tool-handlers/base-tool-handler.js +0 -81
- package/dist/tool-handlers/base-tool-handler.js.map +0 -1
- package/dist/tool-handlers/conduct-review.d.ts +0 -49
- package/dist/tool-handlers/conduct-review.d.ts.map +0 -1
- package/dist/tool-handlers/conduct-review.js +0 -104
- package/dist/tool-handlers/conduct-review.js.map +0 -1
- package/dist/tool-handlers/get-tool-info.d.ts +0 -75
- package/dist/tool-handlers/get-tool-info.d.ts.map +0 -1
- package/dist/tool-handlers/get-tool-info.js +0 -168
- package/dist/tool-handlers/get-tool-info.js.map +0 -1
- package/dist/tool-handlers/index.d.ts +0 -41
- package/dist/tool-handlers/index.d.ts.map +0 -1
- package/dist/tool-handlers/index.js +0 -71
- package/dist/tool-handlers/index.js.map +0 -1
- package/dist/tool-handlers/list-workflows.d.ts +0 -35
- package/dist/tool-handlers/list-workflows.d.ts.map +0 -1
- package/dist/tool-handlers/list-workflows.js +0 -43
- package/dist/tool-handlers/list-workflows.js.map +0 -1
- package/dist/tool-handlers/no-idea.d.ts +0 -41
- package/dist/tool-handlers/no-idea.d.ts.map +0 -1
- package/dist/tool-handlers/no-idea.js +0 -29
- package/dist/tool-handlers/no-idea.js.map +0 -1
- package/dist/tool-handlers/proceed-to-phase.d.ts +0 -41
- package/dist/tool-handlers/proceed-to-phase.d.ts.map +0 -1
- package/dist/tool-handlers/proceed-to-phase.js +0 -165
- package/dist/tool-handlers/proceed-to-phase.js.map +0 -1
- package/dist/tool-handlers/reset-development.d.ts +0 -31
- package/dist/tool-handlers/reset-development.d.ts.map +0 -1
- package/dist/tool-handlers/reset-development.js +0 -48
- package/dist/tool-handlers/reset-development.js.map +0 -1
- package/dist/tool-handlers/resume-workflow.d.ts +0 -87
- package/dist/tool-handlers/resume-workflow.d.ts.map +0 -1
- package/dist/tool-handlers/resume-workflow.js +0 -212
- package/dist/tool-handlers/resume-workflow.js.map +0 -1
- package/dist/tool-handlers/setup-project-docs.d.ts +0 -37
- package/dist/tool-handlers/setup-project-docs.d.ts.map +0 -1
- package/dist/tool-handlers/setup-project-docs.js +0 -138
- package/dist/tool-handlers/setup-project-docs.js.map +0 -1
- package/dist/tool-handlers/start-development.d.ts +0 -79
- package/dist/tool-handlers/start-development.d.ts.map +0 -1
- package/dist/tool-handlers/start-development.js +0 -484
- package/dist/tool-handlers/start-development.js.map +0 -1
- package/dist/tool-handlers/whats-next.d.ts +0 -41
- package/dist/tool-handlers/whats-next.d.ts.map +0 -1
- package/dist/tool-handlers/whats-next.js +0 -123
- package/dist/tool-handlers/whats-next.js.map +0 -1
- package/dist/types.d.ts +0 -119
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js +0 -5
- package/dist/version-info.d.ts +0 -30
- package/dist/version-info.d.ts.map +0 -1
- package/dist/version-info.js +0 -178
- package/dist/version-info.js.map +0 -1
- package/skill/SKILL.md +0 -28
- /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
|
+
}
|