@codemcp/workflows 5.3.0 → 6.0.2
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 +78 -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/cli/resources/agents/architect.yaml +61 -0
- package/packages/cli/resources/agents/business-analyst.yaml +60 -0
- package/packages/cli/resources/agents/developer.yaml +61 -0
- package/packages/cli/resources/templates/architecture/arc42/arc42-template-EN.md +1077 -0
- package/packages/cli/resources/templates/architecture/arc42/images/01_2_iso-25010-topics-EN.drawio-2023.png +0 -0
- package/packages/cli/resources/templates/architecture/arc42/images/01_2_iso-25010-topics-EN.drawio.png +0 -0
- package/packages/cli/resources/templates/architecture/arc42/images/05_building_blocks-EN.png +0 -0
- package/packages/cli/resources/templates/architecture/arc42/images/08-concepts-EN.drawio.png +0 -0
- package/packages/cli/resources/templates/architecture/arc42/images/arc42-logo.png +0 -0
- package/packages/cli/resources/templates/architecture/c4.md +224 -0
- package/packages/cli/resources/templates/architecture/freestyle.md +53 -0
- package/packages/cli/resources/templates/architecture/game.md +250 -0
- package/packages/cli/resources/templates/architecture/none.md +17 -0
- package/packages/cli/resources/templates/design/comprehensive.md +207 -0
- package/packages/cli/resources/templates/design/freestyle.md +37 -0
- package/packages/cli/resources/templates/design/game.md +66 -0
- package/packages/cli/resources/templates/design/none.md +17 -0
- package/packages/cli/resources/templates/requirements/ears.md +90 -0
- package/packages/cli/resources/templates/requirements/freestyle.md +42 -0
- package/packages/cli/resources/templates/requirements/game.md +162 -0
- package/packages/cli/resources/templates/requirements/none.md +17 -0
- package/packages/cli/resources/templates/skills/POWER.md +23 -0
- package/packages/cli/resources/templates/skills/SKILL.md +19 -0
- package/packages/cli/resources/workflows/adr.yaml +157 -0
- package/packages/cli/resources/workflows/big-bang-conversion.yaml +592 -0
- package/packages/cli/resources/workflows/boundary-testing.yaml +376 -0
- package/packages/cli/resources/workflows/bugfix.yaml +177 -0
- package/packages/cli/resources/workflows/business-analysis.yaml +597 -0
- package/packages/cli/resources/workflows/c4-analysis.yaml +471 -0
- package/packages/cli/resources/workflows/epcc.yaml +183 -0
- package/packages/cli/resources/workflows/game-beginner.yaml +434 -0
- package/packages/cli/resources/workflows/greenfield.yaml +201 -0
- package/packages/cli/resources/workflows/minor.yaml +138 -0
- package/packages/cli/resources/workflows/posts.yaml +193 -0
- package/packages/cli/resources/workflows/sdd-bugfix-crowd.yaml +608 -0
- package/packages/cli/resources/workflows/sdd-bugfix.yaml +381 -0
- package/packages/cli/resources/workflows/sdd-feature-crowd.yaml +713 -0
- package/packages/cli/resources/workflows/sdd-feature.yaml +471 -0
- package/packages/cli/resources/workflows/sdd-greenfield-crowd.yaml +336 -0
- package/packages/cli/resources/workflows/sdd-greenfield.yaml +463 -0
- package/packages/cli/resources/workflows/slides.yaml +237 -0
- package/packages/cli/resources/workflows/tdd.yaml +160 -0
- package/packages/cli/resources/workflows/waterfall.yaml +209 -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/core/resources/agents/architect.yaml +61 -0
- package/packages/core/resources/agents/business-analyst.yaml +60 -0
- package/packages/core/resources/agents/developer.yaml +61 -0
- package/packages/core/resources/templates/architecture/arc42/arc42-template-EN.md +1077 -0
- package/packages/core/resources/templates/architecture/arc42/images/01_2_iso-25010-topics-EN.drawio-2023.png +0 -0
- package/packages/core/resources/templates/architecture/arc42/images/01_2_iso-25010-topics-EN.drawio.png +0 -0
- package/packages/core/resources/templates/architecture/arc42/images/05_building_blocks-EN.png +0 -0
- package/packages/core/resources/templates/architecture/arc42/images/08-concepts-EN.drawio.png +0 -0
- package/packages/core/resources/templates/architecture/arc42/images/arc42-logo.png +0 -0
- package/packages/core/resources/templates/architecture/c4.md +224 -0
- package/packages/core/resources/templates/architecture/freestyle.md +53 -0
- package/packages/core/resources/templates/architecture/game.md +250 -0
- package/packages/core/resources/templates/architecture/none.md +17 -0
- package/packages/core/resources/templates/design/comprehensive.md +207 -0
- package/packages/core/resources/templates/design/freestyle.md +37 -0
- package/packages/core/resources/templates/design/game.md +66 -0
- package/packages/core/resources/templates/design/none.md +17 -0
- package/packages/core/resources/templates/requirements/ears.md +90 -0
- package/packages/core/resources/templates/requirements/freestyle.md +42 -0
- package/packages/core/resources/templates/requirements/game.md +162 -0
- package/packages/core/resources/templates/requirements/none.md +17 -0
- package/packages/core/resources/templates/skills/POWER.md +23 -0
- package/packages/core/resources/templates/skills/SKILL.md +19 -0
- package/packages/core/resources/workflows/adr.yaml +157 -0
- package/packages/core/resources/workflows/big-bang-conversion.yaml +592 -0
- package/packages/core/resources/workflows/boundary-testing.yaml +376 -0
- package/packages/core/resources/workflows/bugfix.yaml +177 -0
- package/packages/core/resources/workflows/business-analysis.yaml +597 -0
- package/packages/core/resources/workflows/c4-analysis.yaml +471 -0
- package/packages/core/resources/workflows/epcc.yaml +183 -0
- package/packages/core/resources/workflows/game-beginner.yaml +434 -0
- package/packages/core/resources/workflows/greenfield.yaml +201 -0
- package/packages/core/resources/workflows/minor.yaml +138 -0
- package/packages/core/resources/workflows/posts.yaml +193 -0
- package/packages/core/resources/workflows/sdd-bugfix-crowd.yaml +608 -0
- package/packages/core/resources/workflows/sdd-bugfix.yaml +381 -0
- package/packages/core/resources/workflows/sdd-feature-crowd.yaml +713 -0
- package/packages/core/resources/workflows/sdd-feature.yaml +471 -0
- package/packages/core/resources/workflows/sdd-greenfield-crowd.yaml +336 -0
- package/packages/core/resources/workflows/sdd-greenfield.yaml +463 -0
- package/packages/core/resources/workflows/slides.yaml +237 -0
- package/packages/core/resources/workflows/tdd.yaml +160 -0
- package/packages/core/resources/workflows/waterfall.yaml +209 -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/mcp-server/resources/agents/architect.yaml +61 -0
- package/packages/mcp-server/resources/agents/business-analyst.yaml +60 -0
- package/packages/mcp-server/resources/agents/developer.yaml +61 -0
- package/packages/mcp-server/resources/templates/architecture/arc42/arc42-template-EN.md +1077 -0
- package/packages/mcp-server/resources/templates/architecture/arc42/images/01_2_iso-25010-topics-EN.drawio-2023.png +0 -0
- package/packages/mcp-server/resources/templates/architecture/arc42/images/01_2_iso-25010-topics-EN.drawio.png +0 -0
- package/packages/mcp-server/resources/templates/architecture/arc42/images/05_building_blocks-EN.png +0 -0
- package/packages/mcp-server/resources/templates/architecture/arc42/images/08-concepts-EN.drawio.png +0 -0
- package/packages/mcp-server/resources/templates/architecture/arc42/images/arc42-logo.png +0 -0
- package/packages/mcp-server/resources/templates/architecture/c4.md +224 -0
- package/packages/mcp-server/resources/templates/architecture/freestyle.md +53 -0
- package/packages/mcp-server/resources/templates/architecture/game.md +250 -0
- package/packages/mcp-server/resources/templates/architecture/none.md +17 -0
- package/packages/mcp-server/resources/templates/design/comprehensive.md +207 -0
- package/packages/mcp-server/resources/templates/design/freestyle.md +37 -0
- package/packages/mcp-server/resources/templates/design/game.md +66 -0
- package/packages/mcp-server/resources/templates/design/none.md +17 -0
- package/packages/mcp-server/resources/templates/requirements/ears.md +90 -0
- package/packages/mcp-server/resources/templates/requirements/freestyle.md +42 -0
- package/packages/mcp-server/resources/templates/requirements/game.md +162 -0
- package/packages/mcp-server/resources/templates/requirements/none.md +17 -0
- package/packages/mcp-server/resources/templates/skills/POWER.md +23 -0
- package/packages/mcp-server/resources/templates/skills/SKILL.md +19 -0
- package/packages/mcp-server/resources/workflows/adr.yaml +157 -0
- package/packages/mcp-server/resources/workflows/big-bang-conversion.yaml +592 -0
- package/packages/mcp-server/resources/workflows/boundary-testing.yaml +376 -0
- package/packages/mcp-server/resources/workflows/bugfix.yaml +177 -0
- package/packages/mcp-server/resources/workflows/business-analysis.yaml +597 -0
- package/packages/mcp-server/resources/workflows/c4-analysis.yaml +471 -0
- package/packages/mcp-server/resources/workflows/epcc.yaml +183 -0
- package/packages/mcp-server/resources/workflows/game-beginner.yaml +434 -0
- package/packages/mcp-server/resources/workflows/greenfield.yaml +201 -0
- package/packages/mcp-server/resources/workflows/minor.yaml +138 -0
- package/packages/mcp-server/resources/workflows/posts.yaml +193 -0
- package/packages/mcp-server/resources/workflows/sdd-bugfix-crowd.yaml +608 -0
- package/packages/mcp-server/resources/workflows/sdd-bugfix.yaml +381 -0
- package/packages/mcp-server/resources/workflows/sdd-feature-crowd.yaml +713 -0
- package/packages/mcp-server/resources/workflows/sdd-feature.yaml +471 -0
- package/packages/mcp-server/resources/workflows/sdd-greenfield-crowd.yaml +336 -0
- package/packages/mcp-server/resources/workflows/sdd-greenfield.yaml +463 -0
- package/packages/mcp-server/resources/workflows/slides.yaml +237 -0
- package/packages/mcp-server/resources/workflows/tdd.yaml +160 -0
- package/packages/mcp-server/resources/workflows/waterfall.yaml +209 -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,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Task Backend Client Interface
|
|
3
|
+
*
|
|
4
|
+
* Defines the contract for task backend operations (CLI commands, etc.).
|
|
5
|
+
* Enables clean abstraction of different task backends (beads, GitHub Issues, etc.).
|
|
6
|
+
*/
|
|
7
|
+
export {};
|
|
8
|
+
//# sourceMappingURL=task-backend-client.interface.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-backend-client.interface.js","sourceRoot":"","sources":["../../src/interfaces/task-backend-client.interface.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Logging utility for Vibe Feature MCP Server
|
|
3
|
+
*
|
|
4
|
+
* Provides structured logging with proper MCP compliance:
|
|
5
|
+
* - Uses stderr for all local logging (MCP requirement)
|
|
6
|
+
* - Supports MCP log message notifications to client
|
|
7
|
+
* - Provides structured logging with proper levels:
|
|
8
|
+
* - debug: Tracing and detailed execution flow
|
|
9
|
+
* - info: Success operations and important milestones
|
|
10
|
+
* - warn: Expected errors and recoverable issues
|
|
11
|
+
* - error: Caught but unexpected errors
|
|
12
|
+
*/
|
|
13
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
14
|
+
export declare enum LogLevel {
|
|
15
|
+
DEBUG = 0,
|
|
16
|
+
INFO = 1,
|
|
17
|
+
WARN = 2,
|
|
18
|
+
ERROR = 3,
|
|
19
|
+
SILENT = 4
|
|
20
|
+
}
|
|
21
|
+
export interface LogContext {
|
|
22
|
+
component?: string;
|
|
23
|
+
conversationId?: string;
|
|
24
|
+
phase?: string;
|
|
25
|
+
operation?: string;
|
|
26
|
+
[key: string]: unknown;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Set the MCP server instance for log notifications
|
|
30
|
+
*/
|
|
31
|
+
export declare function setMcpServerForLogging(server: McpServer): void;
|
|
32
|
+
/**
|
|
33
|
+
* Set the logging level from MCP client request
|
|
34
|
+
*/
|
|
35
|
+
export declare function setMcpLoggingLevel(level: string): void;
|
|
36
|
+
declare class Logger {
|
|
37
|
+
private component;
|
|
38
|
+
private explicitLogLevel?;
|
|
39
|
+
constructor(component: string, logLevel?: LogLevel);
|
|
40
|
+
private getCurrentLogLevel;
|
|
41
|
+
private getLogLevelFromEnv;
|
|
42
|
+
private shouldLog;
|
|
43
|
+
private formatMessage;
|
|
44
|
+
/**
|
|
45
|
+
* Send log message to MCP client if server is available and level is appropriate
|
|
46
|
+
*/
|
|
47
|
+
private sendMcpLogMessage;
|
|
48
|
+
debug(message: string, context?: LogContext): void;
|
|
49
|
+
info(message: string, context?: LogContext): void;
|
|
50
|
+
/**
|
|
51
|
+
* Send enhanced MCP notifications with better formatting for important events
|
|
52
|
+
*/
|
|
53
|
+
private sendEnhancedMcpNotification;
|
|
54
|
+
/**
|
|
55
|
+
* Capitalize phase name for display
|
|
56
|
+
*/
|
|
57
|
+
private capitalizePhase;
|
|
58
|
+
warn(message: string, context?: LogContext): void;
|
|
59
|
+
error(message: string, error?: Error, context?: LogContext): void;
|
|
60
|
+
child(childComponent: string): Logger;
|
|
61
|
+
}
|
|
62
|
+
export declare function createLogger(component: string, logLevel?: LogLevel): Logger;
|
|
63
|
+
export declare const logger: Logger;
|
|
64
|
+
export {};
|
|
@@ -0,0 +1,283 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Logging utility for Vibe Feature MCP Server
|
|
3
|
+
*
|
|
4
|
+
* Provides structured logging with proper MCP compliance:
|
|
5
|
+
* - Uses stderr for all local logging (MCP requirement)
|
|
6
|
+
* - Supports MCP log message notifications to client
|
|
7
|
+
* - Provides structured logging with proper levels:
|
|
8
|
+
* - debug: Tracing and detailed execution flow
|
|
9
|
+
* - info: Success operations and important milestones
|
|
10
|
+
* - warn: Expected errors and recoverable issues
|
|
11
|
+
* - error: Caught but unexpected errors
|
|
12
|
+
*/
|
|
13
|
+
export var LogLevel;
|
|
14
|
+
(function (LogLevel) {
|
|
15
|
+
LogLevel[LogLevel["DEBUG"] = 0] = "DEBUG";
|
|
16
|
+
LogLevel[LogLevel["INFO"] = 1] = "INFO";
|
|
17
|
+
LogLevel[LogLevel["WARN"] = 2] = "WARN";
|
|
18
|
+
LogLevel[LogLevel["ERROR"] = 3] = "ERROR";
|
|
19
|
+
LogLevel[LogLevel["SILENT"] = 4] = "SILENT";
|
|
20
|
+
})(LogLevel || (LogLevel = {}));
|
|
21
|
+
// Global MCP server reference for log notifications
|
|
22
|
+
let mcpServerInstance = null;
|
|
23
|
+
// Unified logging level - can be set by MCP client or environment
|
|
24
|
+
let currentLoggingLevel = null;
|
|
25
|
+
// Test mode detection function to check at runtime
|
|
26
|
+
function isTestMode() {
|
|
27
|
+
// Check explicit environment variables
|
|
28
|
+
if (process.env.NODE_ENV === 'test' || process.env.VITEST === 'true') {
|
|
29
|
+
return true;
|
|
30
|
+
}
|
|
31
|
+
// Check if running in a temporary directory (common for tests)
|
|
32
|
+
const cwd = process.cwd();
|
|
33
|
+
if (cwd.includes('/tmp/') || cwd.includes('temp') || cwd.includes('test-')) {
|
|
34
|
+
return true;
|
|
35
|
+
}
|
|
36
|
+
// Check if LOG_LEVEL is explicitly set to ERROR
|
|
37
|
+
if (process.env.LOG_LEVEL === 'ERROR') {
|
|
38
|
+
return true;
|
|
39
|
+
}
|
|
40
|
+
return false;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Set the MCP server instance for log notifications
|
|
44
|
+
*/
|
|
45
|
+
export function setMcpServerForLogging(server) {
|
|
46
|
+
mcpServerInstance = server;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Set the logging level from MCP client request
|
|
50
|
+
*/
|
|
51
|
+
export function setMcpLoggingLevel(level) {
|
|
52
|
+
// Map MCP levels to our internal levels
|
|
53
|
+
const levelMap = {
|
|
54
|
+
debug: LogLevel.DEBUG,
|
|
55
|
+
info: LogLevel.INFO,
|
|
56
|
+
notice: LogLevel.INFO,
|
|
57
|
+
warning: LogLevel.WARN,
|
|
58
|
+
error: LogLevel.ERROR,
|
|
59
|
+
critical: LogLevel.ERROR,
|
|
60
|
+
alert: LogLevel.ERROR,
|
|
61
|
+
emergency: LogLevel.ERROR,
|
|
62
|
+
};
|
|
63
|
+
currentLoggingLevel = levelMap[level] ?? LogLevel.INFO;
|
|
64
|
+
}
|
|
65
|
+
class Logger {
|
|
66
|
+
component;
|
|
67
|
+
explicitLogLevel;
|
|
68
|
+
constructor(component, logLevel) {
|
|
69
|
+
this.component = component;
|
|
70
|
+
this.explicitLogLevel = logLevel;
|
|
71
|
+
}
|
|
72
|
+
getCurrentLogLevel() {
|
|
73
|
+
// Check environment variable first (allows SILENT to override test mode)
|
|
74
|
+
const envLevel = this.getLogLevelFromEnv();
|
|
75
|
+
if (envLevel === LogLevel.SILENT) {
|
|
76
|
+
return LogLevel.SILENT;
|
|
77
|
+
}
|
|
78
|
+
// Force ERROR level in test environments (unless SILENT)
|
|
79
|
+
if (isTestMode()) {
|
|
80
|
+
return LogLevel.ERROR;
|
|
81
|
+
}
|
|
82
|
+
// Use MCP-set level if available (takes precedence)
|
|
83
|
+
if (currentLoggingLevel !== null) {
|
|
84
|
+
return currentLoggingLevel;
|
|
85
|
+
}
|
|
86
|
+
// Use environment variable level
|
|
87
|
+
if (envLevel !== null) {
|
|
88
|
+
return envLevel;
|
|
89
|
+
}
|
|
90
|
+
// If explicit log level was provided, use it
|
|
91
|
+
if (this.explicitLogLevel !== undefined) {
|
|
92
|
+
return this.explicitLogLevel;
|
|
93
|
+
}
|
|
94
|
+
// Default to INFO
|
|
95
|
+
return LogLevel.INFO;
|
|
96
|
+
}
|
|
97
|
+
getLogLevelFromEnv() {
|
|
98
|
+
const envLevel = process.env.LOG_LEVEL?.toUpperCase();
|
|
99
|
+
switch (envLevel) {
|
|
100
|
+
case 'DEBUG':
|
|
101
|
+
return LogLevel.DEBUG;
|
|
102
|
+
case 'INFO':
|
|
103
|
+
return LogLevel.INFO;
|
|
104
|
+
case 'WARN':
|
|
105
|
+
return LogLevel.WARN;
|
|
106
|
+
case 'ERROR':
|
|
107
|
+
return LogLevel.ERROR;
|
|
108
|
+
case 'SILENT':
|
|
109
|
+
return LogLevel.SILENT;
|
|
110
|
+
default:
|
|
111
|
+
return null;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
shouldLog(level) {
|
|
115
|
+
return level >= this.getCurrentLogLevel();
|
|
116
|
+
}
|
|
117
|
+
formatMessage(level, message, context) {
|
|
118
|
+
const timestamp = new Date().toISOString();
|
|
119
|
+
const contextStr = context ? ` ${JSON.stringify(context)}` : '';
|
|
120
|
+
return `[${timestamp}] ${level.toUpperCase()} [${this.component}] ${message}${contextStr}`;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Send log message to MCP client if server is available and level is appropriate
|
|
124
|
+
*/
|
|
125
|
+
async sendMcpLogMessage(level, message, context) {
|
|
126
|
+
if (mcpServerInstance) {
|
|
127
|
+
try {
|
|
128
|
+
// Safely serialize context to avoid JSON issues
|
|
129
|
+
let logData = message;
|
|
130
|
+
if (context) {
|
|
131
|
+
try {
|
|
132
|
+
const contextStr = JSON.stringify(context, null, 0);
|
|
133
|
+
logData = `${message} ${contextStr}`;
|
|
134
|
+
}
|
|
135
|
+
catch (_error) {
|
|
136
|
+
// If JSON serialization fails, just use the message
|
|
137
|
+
logData = `${message} [context serialization failed]`;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
await mcpServerInstance.server.notification({
|
|
141
|
+
method: 'notifications/message',
|
|
142
|
+
params: {
|
|
143
|
+
level,
|
|
144
|
+
logger: this.component,
|
|
145
|
+
data: logData,
|
|
146
|
+
},
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
catch (error) {
|
|
150
|
+
// Fallback to stderr if MCP notification fails
|
|
151
|
+
// Don't use this.error to avoid infinite recursion
|
|
152
|
+
if (!isTestMode()) {
|
|
153
|
+
process.stderr.write(`[MCP-LOG-ERROR] Failed to send log notification: ${error}\n`);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
debug(message, context) {
|
|
159
|
+
if (this.shouldLog(LogLevel.DEBUG)) {
|
|
160
|
+
const formattedMessage = this.formatMessage('debug', message, context);
|
|
161
|
+
// Always log to stderr for MCP compliance
|
|
162
|
+
process.stderr.write(formattedMessage + '\n');
|
|
163
|
+
// Also send to MCP client if available (only for debug level)
|
|
164
|
+
this.sendMcpLogMessage('debug', message, context).catch(() => {
|
|
165
|
+
// Ignore MCP notification errors for debug messages
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
info(message, context) {
|
|
170
|
+
if (this.shouldLog(LogLevel.INFO)) {
|
|
171
|
+
const formattedMessage = this.formatMessage('info', message, context);
|
|
172
|
+
// Always log to stderr for MCP compliance
|
|
173
|
+
process.stderr.write(formattedMessage + '\n');
|
|
174
|
+
// Send enhanced notifications for important events
|
|
175
|
+
this.sendEnhancedMcpNotification('info', message, context).catch(() => {
|
|
176
|
+
// Ignore MCP notification errors for info messages
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Send enhanced MCP notifications with better formatting for important events
|
|
182
|
+
*/
|
|
183
|
+
async sendEnhancedMcpNotification(level, message, context) {
|
|
184
|
+
if (mcpServerInstance) {
|
|
185
|
+
try {
|
|
186
|
+
let enhancedMessage = message;
|
|
187
|
+
let notificationLevel = level;
|
|
188
|
+
// Enhance phase transition messages
|
|
189
|
+
if (context &&
|
|
190
|
+
(context.from || context.to) &&
|
|
191
|
+
message.includes('transition')) {
|
|
192
|
+
const from = context.from
|
|
193
|
+
? this.capitalizePhase(context.from)
|
|
194
|
+
: '';
|
|
195
|
+
const to = context.to
|
|
196
|
+
? this.capitalizePhase(context.to)
|
|
197
|
+
: '';
|
|
198
|
+
if (from && to) {
|
|
199
|
+
enhancedMessage = `Phase Transition: ${from} → ${to}`;
|
|
200
|
+
notificationLevel = 'info';
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
// Enhance initialization messages
|
|
204
|
+
if (message.includes('initialized successfully')) {
|
|
205
|
+
enhancedMessage = '🚀 Vibe Feature MCP Server Ready';
|
|
206
|
+
notificationLevel = 'info';
|
|
207
|
+
}
|
|
208
|
+
// Safely serialize context to avoid JSON issues
|
|
209
|
+
let logData = enhancedMessage;
|
|
210
|
+
if (context) {
|
|
211
|
+
try {
|
|
212
|
+
const contextStr = JSON.stringify(context, null, 0);
|
|
213
|
+
logData = `${enhancedMessage} ${contextStr}`;
|
|
214
|
+
}
|
|
215
|
+
catch (_error) {
|
|
216
|
+
// If JSON serialization fails, just use the message
|
|
217
|
+
logData = `${enhancedMessage} [context serialization failed]`;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
// Use the underlying server's notification method
|
|
221
|
+
await mcpServerInstance.server.notification({
|
|
222
|
+
method: 'notifications/message',
|
|
223
|
+
params: {
|
|
224
|
+
level: notificationLevel,
|
|
225
|
+
logger: this.component,
|
|
226
|
+
data: logData,
|
|
227
|
+
},
|
|
228
|
+
});
|
|
229
|
+
}
|
|
230
|
+
catch (error) {
|
|
231
|
+
// Fallback to stderr if MCP notification fails
|
|
232
|
+
// Don't use this.error to avoid infinite recursion
|
|
233
|
+
if (!isTestMode()) {
|
|
234
|
+
process.stderr.write(`[MCP-LOG-ERROR] Failed to send log notification: ${error}\n`);
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Capitalize phase name for display
|
|
241
|
+
*/
|
|
242
|
+
capitalizePhase(phase) {
|
|
243
|
+
return phase
|
|
244
|
+
.split('_')
|
|
245
|
+
.map(word => word.charAt(0).toUpperCase() + word.slice(1))
|
|
246
|
+
.join(' ');
|
|
247
|
+
}
|
|
248
|
+
warn(message, context) {
|
|
249
|
+
if (this.shouldLog(LogLevel.WARN)) {
|
|
250
|
+
const formattedMessage = this.formatMessage('warn', message, context);
|
|
251
|
+
// Always log to stderr for MCP compliance
|
|
252
|
+
process.stderr.write(formattedMessage + '\n');
|
|
253
|
+
// Also send to MCP client if available
|
|
254
|
+
this.sendEnhancedMcpNotification('warning', message, context).catch(() => {
|
|
255
|
+
// Ignore MCP notification errors for warn messages
|
|
256
|
+
});
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
error(message, error, context) {
|
|
260
|
+
if (this.shouldLog(LogLevel.ERROR)) {
|
|
261
|
+
const errorContext = error
|
|
262
|
+
? { ...context, error: error.message, stack: error.stack }
|
|
263
|
+
: context;
|
|
264
|
+
const formattedMessage = this.formatMessage('error', message, errorContext);
|
|
265
|
+
// Always log to stderr for MCP compliance
|
|
266
|
+
process.stderr.write(formattedMessage + '\n');
|
|
267
|
+
// Also send to MCP client if available
|
|
268
|
+
this.sendEnhancedMcpNotification('error', message, errorContext).catch(() => {
|
|
269
|
+
// Ignore MCP notification errors for error messages
|
|
270
|
+
});
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
child(childComponent) {
|
|
274
|
+
return new Logger(`${this.component}:${childComponent}`, this.explicitLogLevel);
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
// Factory function to create loggers
|
|
278
|
+
export function createLogger(component, logLevel) {
|
|
279
|
+
return new Logger(component, logLevel);
|
|
280
|
+
}
|
|
281
|
+
// Default logger for the main application
|
|
282
|
+
export const logger = createLogger('VibeFeatureMCP');
|
|
283
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Path Validation Utilities
|
|
3
|
+
*
|
|
4
|
+
* Provides utilities for validating file paths, resolving relative paths,
|
|
5
|
+
* and ensuring security constraints for the file linking functionality.
|
|
6
|
+
*/
|
|
7
|
+
export interface PathValidationResult {
|
|
8
|
+
isValid: boolean;
|
|
9
|
+
resolvedPath?: string;
|
|
10
|
+
error?: string;
|
|
11
|
+
}
|
|
12
|
+
export declare class PathValidationUtils {
|
|
13
|
+
/**
|
|
14
|
+
* Validate if a string is a known template name
|
|
15
|
+
*/
|
|
16
|
+
static isTemplateName(value: string, availableTemplates: string[]): boolean;
|
|
17
|
+
/**
|
|
18
|
+
* Validate and resolve a file path
|
|
19
|
+
*/
|
|
20
|
+
static validateFilePath(filePath: string, projectPath: string): Promise<PathValidationResult>;
|
|
21
|
+
/**
|
|
22
|
+
* Validate and resolve a file or directory path
|
|
23
|
+
*/
|
|
24
|
+
static validateFileOrDirectoryPath(filePath: string, projectPath: string): Promise<PathValidationResult>;
|
|
25
|
+
/**
|
|
26
|
+
* Resolve a file path to absolute, handling various formats
|
|
27
|
+
*/
|
|
28
|
+
static resolvePath(filePath: string, projectPath: string): string;
|
|
29
|
+
/**
|
|
30
|
+
* Check if a resolved path is within safe boundaries
|
|
31
|
+
* Prevents directory traversal attacks
|
|
32
|
+
*/
|
|
33
|
+
static isPathSafe(resolvedPath: string, projectPath: string): boolean;
|
|
34
|
+
/**
|
|
35
|
+
* Validate parameter as either template name or file path
|
|
36
|
+
*/
|
|
37
|
+
static validateParameter(value: string, availableTemplates: string[], projectPath: string): Promise<{
|
|
38
|
+
isTemplate: boolean;
|
|
39
|
+
isFilePath: boolean;
|
|
40
|
+
resolvedPath?: string;
|
|
41
|
+
error?: string;
|
|
42
|
+
}>;
|
|
43
|
+
/**
|
|
44
|
+
* Get common file patterns for documentation
|
|
45
|
+
*/
|
|
46
|
+
static getCommonDocumentationPatterns(): {
|
|
47
|
+
architecture: string[];
|
|
48
|
+
requirements: string[];
|
|
49
|
+
design: string[];
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Cross-platform utility to extract the last component of a path.
|
|
54
|
+
* Handles both forward slashes (/) and backslashes (\) regardless of
|
|
55
|
+
* the platform the code is running on.
|
|
56
|
+
*
|
|
57
|
+
* Note: Node.js's `path.basename()` only handles the native path separator
|
|
58
|
+
* for the current platform. This function normalizes paths to handle both
|
|
59
|
+
* Unix and Windows paths on any platform.
|
|
60
|
+
*
|
|
61
|
+
* @param filePath - The file path to extract from
|
|
62
|
+
* @param fallback - Fallback value if path is empty (default: 'unknown')
|
|
63
|
+
* @returns The last component of the path, or the fallback value
|
|
64
|
+
*
|
|
65
|
+
* @example
|
|
66
|
+
* // Unix-style paths
|
|
67
|
+
* getPathBasename('/home/user/project') // 'project'
|
|
68
|
+
*
|
|
69
|
+
* // Windows-style paths (works on any platform)
|
|
70
|
+
* getPathBasename('c:\\work\\project') // 'project'
|
|
71
|
+
*
|
|
72
|
+
* // Mixed paths
|
|
73
|
+
* getPathBasename('c:/work/project') // 'project'
|
|
74
|
+
*/
|
|
75
|
+
export declare function getPathBasename(filePath: string, fallback?: string): string;
|
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Path Validation Utilities
|
|
3
|
+
*
|
|
4
|
+
* Provides utilities for validating file paths, resolving relative paths,
|
|
5
|
+
* and ensuring security constraints for the file linking functionality.
|
|
6
|
+
*/
|
|
7
|
+
import { access, stat } from 'node:fs/promises';
|
|
8
|
+
import { resolve, isAbsolute, join, normalize, basename } from 'node:path';
|
|
9
|
+
import { createLogger } from './logger.js';
|
|
10
|
+
const logger = createLogger('PathValidationUtils');
|
|
11
|
+
export class PathValidationUtils {
|
|
12
|
+
/**
|
|
13
|
+
* Validate if a string is a known template name
|
|
14
|
+
*/
|
|
15
|
+
static isTemplateName(value, availableTemplates) {
|
|
16
|
+
return availableTemplates.includes(value);
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Validate and resolve a file path
|
|
20
|
+
*/
|
|
21
|
+
static async validateFilePath(filePath, projectPath) {
|
|
22
|
+
try {
|
|
23
|
+
// Resolve the path to absolute
|
|
24
|
+
const resolvedPath = this.resolvePath(filePath, projectPath);
|
|
25
|
+
// Security validation - prevent directory traversal
|
|
26
|
+
if (!this.isPathSafe(resolvedPath, projectPath)) {
|
|
27
|
+
return {
|
|
28
|
+
isValid: false,
|
|
29
|
+
error: 'Path is outside project boundaries for security reasons',
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
// Check if file exists and is readable
|
|
33
|
+
await access(resolvedPath);
|
|
34
|
+
// Verify it's a file (not a directory)
|
|
35
|
+
const stats = await stat(resolvedPath);
|
|
36
|
+
if (!stats.isFile()) {
|
|
37
|
+
return {
|
|
38
|
+
isValid: false,
|
|
39
|
+
error: 'Path points to a directory, not a file',
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
logger.debug('File path validated successfully', {
|
|
43
|
+
originalPath: filePath,
|
|
44
|
+
resolvedPath,
|
|
45
|
+
});
|
|
46
|
+
return {
|
|
47
|
+
isValid: true,
|
|
48
|
+
resolvedPath,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
catch (error) {
|
|
52
|
+
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
|
|
53
|
+
logger.debug('File path validation failed', {
|
|
54
|
+
filePath,
|
|
55
|
+
error: errorMessage,
|
|
56
|
+
});
|
|
57
|
+
return {
|
|
58
|
+
isValid: false,
|
|
59
|
+
error: `File not found or not accessible: ${errorMessage}`,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Validate and resolve a file or directory path
|
|
65
|
+
*/
|
|
66
|
+
static async validateFileOrDirectoryPath(filePath, projectPath) {
|
|
67
|
+
try {
|
|
68
|
+
// Resolve the path to absolute
|
|
69
|
+
const resolvedPath = this.resolvePath(filePath, projectPath);
|
|
70
|
+
// Security validation - prevent directory traversal
|
|
71
|
+
if (!this.isPathSafe(resolvedPath, projectPath)) {
|
|
72
|
+
return {
|
|
73
|
+
isValid: false,
|
|
74
|
+
error: 'Path is outside project boundaries for security reasons',
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
// Check if file or directory exists and is readable
|
|
78
|
+
await access(resolvedPath);
|
|
79
|
+
// Verify it's either a file or directory
|
|
80
|
+
const stats = await stat(resolvedPath);
|
|
81
|
+
if (!stats.isFile() && !stats.isDirectory()) {
|
|
82
|
+
return {
|
|
83
|
+
isValid: false,
|
|
84
|
+
error: 'Path is neither a file nor a directory',
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
logger.debug('File or directory path validated successfully', {
|
|
88
|
+
originalPath: filePath,
|
|
89
|
+
resolvedPath,
|
|
90
|
+
isFile: stats.isFile(),
|
|
91
|
+
isDirectory: stats.isDirectory(),
|
|
92
|
+
});
|
|
93
|
+
return {
|
|
94
|
+
isValid: true,
|
|
95
|
+
resolvedPath,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
catch (error) {
|
|
99
|
+
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
|
|
100
|
+
logger.debug('File or directory path validation failed', {
|
|
101
|
+
filePath,
|
|
102
|
+
error: errorMessage,
|
|
103
|
+
});
|
|
104
|
+
return {
|
|
105
|
+
isValid: false,
|
|
106
|
+
error: `File or directory not found or not accessible: ${errorMessage}`,
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Resolve a file path to absolute, handling various formats
|
|
112
|
+
*/
|
|
113
|
+
static resolvePath(filePath, projectPath) {
|
|
114
|
+
// If already absolute, return as-is
|
|
115
|
+
if (isAbsolute(filePath)) {
|
|
116
|
+
return normalize(filePath);
|
|
117
|
+
}
|
|
118
|
+
// Handle relative paths (./file, ../file, file)
|
|
119
|
+
return resolve(projectPath, filePath);
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Check if a resolved path is within safe boundaries
|
|
123
|
+
* Prevents directory traversal attacks
|
|
124
|
+
*/
|
|
125
|
+
static isPathSafe(resolvedPath, projectPath) {
|
|
126
|
+
const normalizedResolved = normalize(resolvedPath);
|
|
127
|
+
const normalizedProject = normalize(projectPath);
|
|
128
|
+
// Allow paths within the project directory
|
|
129
|
+
if (normalizedResolved.startsWith(normalizedProject)) {
|
|
130
|
+
return true;
|
|
131
|
+
}
|
|
132
|
+
// Allow paths in common documentation locations relative to project
|
|
133
|
+
const allowedPaths = [
|
|
134
|
+
normalize(join(projectPath, '..')), // Parent directory (for monorepos)
|
|
135
|
+
'/usr/share/doc', // System documentation
|
|
136
|
+
'/opt/docs', // Optional documentation
|
|
137
|
+
];
|
|
138
|
+
return allowedPaths.some(allowedPath => normalizedResolved.startsWith(allowedPath));
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Validate parameter as either template name or file path
|
|
142
|
+
*/
|
|
143
|
+
static async validateParameter(value, availableTemplates, projectPath) {
|
|
144
|
+
// First check if it's a template name
|
|
145
|
+
if (this.isTemplateName(value, availableTemplates)) {
|
|
146
|
+
return {
|
|
147
|
+
isTemplate: true,
|
|
148
|
+
isFilePath: false,
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
// Then validate as file or directory path
|
|
152
|
+
const pathValidation = await this.validateFileOrDirectoryPath(value, projectPath);
|
|
153
|
+
if (pathValidation.isValid) {
|
|
154
|
+
return {
|
|
155
|
+
isTemplate: false,
|
|
156
|
+
isFilePath: true,
|
|
157
|
+
resolvedPath: pathValidation.resolvedPath,
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
// Neither template nor valid file/directory path
|
|
161
|
+
return {
|
|
162
|
+
isTemplate: false,
|
|
163
|
+
isFilePath: false,
|
|
164
|
+
error: `Invalid parameter: not a known template (${availableTemplates.join(', ')}) and not a valid file or directory path (${pathValidation.error})`,
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Get common file patterns for documentation
|
|
169
|
+
*/
|
|
170
|
+
static getCommonDocumentationPatterns() {
|
|
171
|
+
return {
|
|
172
|
+
architecture: [
|
|
173
|
+
'ARCHITECTURE.md',
|
|
174
|
+
'ARCHITECTURE.txt',
|
|
175
|
+
'architecture.md',
|
|
176
|
+
'Architecture.md',
|
|
177
|
+
'docs/ARCHITECTURE.md',
|
|
178
|
+
'docs/architecture.md',
|
|
179
|
+
'README.md', // Can contain architecture info
|
|
180
|
+
],
|
|
181
|
+
requirements: [
|
|
182
|
+
'REQUIREMENTS.md',
|
|
183
|
+
'REQUIREMENTS.txt',
|
|
184
|
+
'requirements.md',
|
|
185
|
+
'Requirements.md',
|
|
186
|
+
'docs/REQUIREMENTS.md',
|
|
187
|
+
'docs/requirements.md',
|
|
188
|
+
'README.md', // Often contains requirements
|
|
189
|
+
],
|
|
190
|
+
design: [
|
|
191
|
+
'DESIGN.md',
|
|
192
|
+
'DESIGN.txt',
|
|
193
|
+
'design.md',
|
|
194
|
+
'Design.md',
|
|
195
|
+
'docs/DESIGN.md',
|
|
196
|
+
'docs/design.md',
|
|
197
|
+
'README.md', // Can contain design info
|
|
198
|
+
],
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Cross-platform utility to extract the last component of a path.
|
|
204
|
+
* Handles both forward slashes (/) and backslashes (\) regardless of
|
|
205
|
+
* the platform the code is running on.
|
|
206
|
+
*
|
|
207
|
+
* Note: Node.js's `path.basename()` only handles the native path separator
|
|
208
|
+
* for the current platform. This function normalizes paths to handle both
|
|
209
|
+
* Unix and Windows paths on any platform.
|
|
210
|
+
*
|
|
211
|
+
* @param filePath - The file path to extract from
|
|
212
|
+
* @param fallback - Fallback value if path is empty (default: 'unknown')
|
|
213
|
+
* @returns The last component of the path, or the fallback value
|
|
214
|
+
*
|
|
215
|
+
* @example
|
|
216
|
+
* // Unix-style paths
|
|
217
|
+
* getPathBasename('/home/user/project') // 'project'
|
|
218
|
+
*
|
|
219
|
+
* // Windows-style paths (works on any platform)
|
|
220
|
+
* getPathBasename('c:\\work\\project') // 'project'
|
|
221
|
+
*
|
|
222
|
+
* // Mixed paths
|
|
223
|
+
* getPathBasename('c:/work/project') // 'project'
|
|
224
|
+
*/
|
|
225
|
+
export function getPathBasename(filePath, fallback = 'unknown') {
|
|
226
|
+
if (!filePath) {
|
|
227
|
+
return fallback;
|
|
228
|
+
}
|
|
229
|
+
// Normalize backslashes to forward slashes for cross-platform support
|
|
230
|
+
// This ensures Windows paths are handled correctly on Unix and vice versa
|
|
231
|
+
const normalizedPath = filePath.replace(/\\/g, '/');
|
|
232
|
+
// Remove trailing slashes
|
|
233
|
+
const trimmedPath = normalizedPath.replace(/\/+$/, '');
|
|
234
|
+
// Use basename on the normalized path
|
|
235
|
+
const result = basename(trimmedPath);
|
|
236
|
+
return result || fallback;
|
|
237
|
+
}
|
|
238
|
+
//# sourceMappingURL=path-validation-utils.js.map
|