mdan-method 2.6.3
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/.mdan/config/config.yaml +36 -0
- package/.mdan/state/MDAN-STATE.template.json +39 -0
- package/AGENTS.md +308 -0
- package/AGENTS_LIST.md +946 -0
- package/ARCHITECTURE.md +590 -0
- package/CHANGELOG.md +1770 -0
- package/CONTRIBUTING.md +512 -0
- package/INSTALL.md +246 -0
- package/LICENSE +30 -0
- package/MDAN.fr.md +259 -0
- package/README.md +233 -0
- package/SECURITY.md +85 -0
- package/USAGE.md +368 -0
- package/app/__init__.py +5 -0
- package/app/cis/agents/__init__.py +31 -0
- package/app/cis/agents/brainstorming-coach/__init__.py +3 -0
- package/app/cis/agents/brainstorming-coach/agent.py +162 -0
- package/app/cis/agents/brainstorming-coach/prompt.yaml +53 -0
- package/app/cis/agents/creative-problem-solver/__init__.py +3 -0
- package/app/cis/agents/creative-problem-solver/agent.py +233 -0
- package/app/cis/agents/creative-problem-solver/prompt.yaml +74 -0
- package/app/cis/agents/design-thinking-coach/__init__.py +3 -0
- package/app/cis/agents/design-thinking-coach/agent.py +241 -0
- package/app/cis/agents/design-thinking-coach/prompt.yaml +77 -0
- package/app/cis/agents/innovation-strategist/__init__.py +3 -0
- package/app/cis/agents/innovation-strategist/agent.py +271 -0
- package/app/cis/agents/innovation-strategist/prompt.yaml +70 -0
- package/app/cis/agents/presentation-master/__init__.py +3 -0
- package/app/cis/agents/presentation-master/agent.py +420 -0
- package/app/cis/agents/presentation-master/prompt.yaml +62 -0
- package/app/cis/agents/storyteller/__init__.py +3 -0
- package/app/cis/agents/storyteller/agent.py +303 -0
- package/app/cis/agents/storyteller/prompt.yaml +99 -0
- package/app/core/__init__.py +5 -0
- package/app/core/agents/__init__.py +5 -0
- package/app/core/agents/mdan-master/__init__.py +7 -0
- package/app/core/agents/mdan-master/agent.py +302 -0
- package/app/core/agents/mdan-master/prompt.yaml +105 -0
- package/app/mmb/agents/__init__.py +24 -0
- package/app/mmb/agents/agent-builder/__init__.py +5 -0
- package/app/mmb/agents/agent-builder/agent.py +261 -0
- package/app/mmb/agents/agent-builder/prompt.yaml +48 -0
- package/app/mmb/agents/module-builder/__init__.py +5 -0
- package/app/mmb/agents/module-builder/agent.py +299 -0
- package/app/mmb/agents/module-builder/prompt.yaml +50 -0
- package/app/mmb/agents/workflow-builder/__init__.py +5 -0
- package/app/mmb/agents/workflow-builder/agent.py +318 -0
- package/app/mmb/agents/workflow-builder/prompt.yaml +52 -0
- package/app/mmm/agents/__init__.py +48 -0
- package/app/mmm/agents/analyst/__init__.py +7 -0
- package/app/mmm/agents/analyst/agent.py +384 -0
- package/app/mmm/agents/analyst/prompt.yaml +62 -0
- package/app/mmm/agents/architect/__init__.py +7 -0
- package/app/mmm/agents/architect/agent.py +300 -0
- package/app/mmm/agents/architect/prompt.yaml +66 -0
- package/app/mmm/agents/dev/__init__.py +7 -0
- package/app/mmm/agents/dev/agent.py +285 -0
- package/app/mmm/agents/dev/prompt.yaml +62 -0
- package/app/mmm/agents/pm/__init__.py +7 -0
- package/app/mmm/agents/pm/agent.py +417 -0
- package/app/mmm/agents/pm/prompt.yaml +64 -0
- package/app/mmm/agents/qa/__init__.py +7 -0
- package/app/mmm/agents/qa/agent.py +267 -0
- package/app/mmm/agents/qa/prompt.yaml +67 -0
- package/app/mmm/agents/quick-flow-solo-dev/__init__.py +7 -0
- package/app/mmm/agents/quick-flow-solo-dev/agent.py +319 -0
- package/app/mmm/agents/quick-flow-solo-dev/prompt.yaml +60 -0
- package/app/mmm/agents/sm/__init__.py +7 -0
- package/app/mmm/agents/sm/agent.py +357 -0
- package/app/mmm/agents/sm/prompt.yaml +61 -0
- package/app/mmm/agents/tech-writer/__init__.py +7 -0
- package/app/mmm/agents/tech-writer/agent.py +420 -0
- package/app/mmm/agents/tech-writer/prompt.yaml +70 -0
- package/app/mmm/agents/ux-designer/__init__.py +14 -0
- package/app/mmm/agents/ux-designer/agent.py +412 -0
- package/app/mmm/agents/ux-designer/prompt.yaml +37 -0
- package/app/packs/__init__.py +32 -0
- package/app/packs/db-optimization/__init__.py +13 -0
- package/app/packs/db-optimization/agents/__init__.py +11 -0
- package/app/packs/db-optimization/agents/db-performance-analyst/__init__.py +5 -0
- package/app/packs/db-optimization/agents/db-performance-analyst/agent.py +559 -0
- package/app/packs/db-optimization/agents/db-performance-analyst/prompt.yaml +63 -0
- package/app/packs/db-optimization/agents/indexing-specialist/__init__.py +5 -0
- package/app/packs/db-optimization/agents/indexing-specialist/agent.py +713 -0
- package/app/packs/db-optimization/agents/indexing-specialist/prompt.yaml +92 -0
- package/app/packs/db-optimization/agents/query-optimizer/__init__.py +5 -0
- package/app/packs/db-optimization/agents/query-optimizer/agent.py +566 -0
- package/app/packs/db-optimization/agents/query-optimizer/prompt.yaml +74 -0
- package/app/packs/devops-azure/__init__.py +13 -0
- package/app/packs/devops-azure/agents/__init__.py +11 -0
- package/app/packs/devops-azure/agents/azure-specialist/__init__.py +5 -0
- package/app/packs/devops-azure/agents/azure-specialist/agent.py +584 -0
- package/app/packs/devops-azure/agents/azure-specialist/prompt.yaml +301 -0
- package/app/packs/devops-azure/agents/cicd-architect/__init__.py +5 -0
- package/app/packs/devops-azure/agents/cicd-architect/agent.py +665 -0
- package/app/packs/devops-azure/agents/cicd-architect/prompt.yaml +409 -0
- package/app/packs/devops-azure/agents/devops-engineer/__init__.py +5 -0
- package/app/packs/devops-azure/agents/devops-engineer/agent.py +545 -0
- package/app/packs/devops-azure/agents/devops-engineer/prompt.yaml +263 -0
- package/app/packs/fintech/__init__.py +13 -0
- package/app/packs/fintech/agents/__init__.py +11 -0
- package/app/packs/fintech/agents/compliance-officer/__init__.py +5 -0
- package/app/packs/fintech/agents/compliance-officer/agent.py +449 -0
- package/app/packs/fintech/agents/compliance-officer/prompt.yaml +135 -0
- package/app/packs/fintech/agents/financial-analyst/__init__.py +5 -0
- package/app/packs/fintech/agents/financial-analyst/agent.py +392 -0
- package/app/packs/fintech/agents/financial-analyst/prompt.yaml +143 -0
- package/app/packs/fintech/agents/risk-manager/__init__.py +5 -0
- package/app/packs/fintech/agents/risk-manager/agent.py +664 -0
- package/app/packs/fintech/agents/risk-manager/prompt.yaml +240 -0
- package/app/tea/agents/tea/__init__.py +9 -0
- package/app/tea/agents/tea/agent.py +689 -0
- package/app/tea/agents/tea/prompt.yaml +100 -0
- package/cli/v1/mdan.py +421 -0
- package/cli/v1/mdan.sh +724 -0
- package/cli/v1/mdan_crewai.py +539 -0
- package/docs/404.md +9 -0
- package/docs/_STYLE_GUIDE.md +370 -0
- package/docs/explanation/advanced-elicitation.md +49 -0
- package/docs/explanation/adversarial-review.md +59 -0
- package/docs/explanation/brainstorming.md +33 -0
- package/docs/explanation/established-projects-faq.md +50 -0
- package/docs/explanation/party-mode.md +59 -0
- package/docs/explanation/preventing-agent-conflicts.md +112 -0
- package/docs/explanation/project-context.md +157 -0
- package/docs/explanation/quick-flow.md +73 -0
- package/docs/explanation/why-solutioning-matters.md +77 -0
- package/docs/how-to/customize-mdan.md +172 -0
- package/docs/how-to/established-projects.md +117 -0
- package/docs/how-to/get-answers-about-mdan.md +134 -0
- package/docs/how-to/install-mdan.md +97 -0
- package/docs/how-to/non-interactive-installation.md +171 -0
- package/docs/how-to/project-context.md +136 -0
- package/docs/how-to/quick-fixes.md +123 -0
- package/docs/how-to/shard-large-documents.md +78 -0
- package/docs/how-to/upgrade-to-v6.md +97 -0
- package/docs/index.md +59 -0
- package/docs/reference/agents.md +28 -0
- package/docs/reference/commands.md +151 -0
- package/docs/reference/modules.md +76 -0
- package/docs/reference/testing.md +106 -0
- package/docs/reference/workflow-map.md +89 -0
- package/docs/roadmap.mdx +136 -0
- package/docs/tutorials/getting-started.md +286 -0
- package/examples/crewai/crewai_auto_mode.py +62 -0
- package/examples/crewai/crewai_custom_crew.py +85 -0
- package/examples/crewai/crewai_debate.py +57 -0
- package/examples/crewai/crewai_with_serper.py +82 -0
- package/examples/crewai/crewai_with_sql.py +117 -0
- package/integrations/__init__.py +33 -0
- package/integrations/crewai/__init__.py +27 -0
- package/integrations/crewai/agents/__init__.py +21 -0
- package/integrations/crewai/agents/architect_agent.py +264 -0
- package/integrations/crewai/agents/dev_agent.py +271 -0
- package/integrations/crewai/agents/devops_agent.py +421 -0
- package/integrations/crewai/agents/doc_agent.py +388 -0
- package/integrations/crewai/agents/product_agent.py +203 -0
- package/integrations/crewai/agents/security_agent.py +386 -0
- package/integrations/crewai/agents/test_agent.py +358 -0
- package/integrations/crewai/agents/ux_agent.py +257 -0
- package/integrations/crewai/flows/__init__.py +13 -0
- package/integrations/crewai/flows/auto_flow.py +451 -0
- package/integrations/crewai/flows/build_flow.py +297 -0
- package/integrations/crewai/flows/debate_flow.py +422 -0
- package/integrations/crewai/flows/discovery_flow.py +267 -0
- package/integrations/crewai/orchestrator.py +558 -0
- package/integrations/crewai/skills/__init__.py +8 -0
- package/integrations/crewai/skills/skill_router.py +534 -0
- package/integrations/crewai/tools/__init__.py +11 -0
- package/integrations/crewai/tools/file_tool.py +355 -0
- package/integrations/crewai/tools/serper_tool.py +169 -0
- package/integrations/crewai/tools/sql_tool.py +435 -0
- package/integrations/docs/all-integrations.md +300 -0
- package/integrations/docs/cursor.md +74 -0
- package/integrations/docs/mcp.md +153 -0
- package/integrations/docs/windsurf.md +48 -0
- package/package.json +119 -0
- package/prompts/cis/brainstorming-coach.yaml +53 -0
- package/prompts/cis/creative-problem-solver.yaml +74 -0
- package/prompts/cis/design-thinking-coach.yaml +77 -0
- package/prompts/cis/innovation-strategist.yaml +70 -0
- package/prompts/cis/presentation-master.yaml +62 -0
- package/prompts/cis/storyteller.yaml +99 -0
- package/prompts/core/mdan-master.yaml +105 -0
- package/prompts/mmb/agent-builder.yaml +48 -0
- package/prompts/mmb/module-builder.yaml +50 -0
- package/prompts/mmb/workflow-builder.yaml +52 -0
- package/prompts/mmm/analyst.yaml +62 -0
- package/prompts/mmm/architect.yaml +66 -0
- package/prompts/mmm/dev.yaml +62 -0
- package/prompts/mmm/pm.yaml +64 -0
- package/prompts/mmm/qa.yaml +67 -0
- package/prompts/mmm/quick-flow-solo-dev.yaml +60 -0
- package/prompts/mmm/sm.yaml +61 -0
- package/prompts/mmm/tech-writer.yaml +70 -0
- package/prompts/mmm/ux-designer.yaml +33 -0
- package/prompts/packs/db-optimization/db-performance-analyst.yaml +63 -0
- package/prompts/packs/db-optimization/indexing-specialist.yaml +92 -0
- package/prompts/packs/db-optimization/query-optimizer.yaml +74 -0
- package/prompts/packs/devops-azure/azure-specialist.yaml +301 -0
- package/prompts/packs/devops-azure/cicd-architect.yaml +409 -0
- package/prompts/packs/devops-azure/devops-engineer.yaml +263 -0
- package/prompts/packs/fintech/compliance-officer.yaml +135 -0
- package/prompts/packs/fintech/financial-analyst.yaml +143 -0
- package/prompts/packs/fintech/risk-manager.yaml +240 -0
- package/prompts/tea/tea.yaml +100 -0
- package/requirements.txt +5 -0
- package/requirements_crewai.txt +37 -0
- package/src/agents/module-help.csv +31 -0
- package/src/agents/module.yaml +50 -0
- package/src/agents/team/analyst.agent.yaml +43 -0
- package/src/agents/team/architect.agent.yaml +29 -0
- package/src/agents/team/dev.agent.yaml +38 -0
- package/src/agents/team/pm.agent.yaml +44 -0
- package/src/agents/team/qa.agent.yaml +58 -0
- package/src/agents/team/quick-flow-solo-dev.agent.yaml +32 -0
- package/src/agents/team/sm.agent.yaml +37 -0
- package/src/agents/team/tech-writer/tech-writer-sidecar/documentation-standards.md +224 -0
- package/src/agents/team/tech-writer/tech-writer.agent.yaml +46 -0
- package/src/agents/team/ux-designer.agent.yaml +27 -0
- package/src/agents/teams/default-party.csv +20 -0
- package/src/agents/teams/team-fullstack.yaml +12 -0
- package/src/core/WIZARD-ENGINE.md +94 -0
- package/src/core/agents/mdan-master.agent.yaml +133 -0
- package/src/core/tasks/editorial-review-prose.xml +102 -0
- package/src/core/tasks/editorial-review-structure.xml +208 -0
- package/src/core/tasks/help.md +86 -0
- package/src/core/tasks/index-docs.xml +65 -0
- package/src/core/tasks/review-adversarial-general.xml +49 -0
- package/src/core/tasks/shard-doc.xml +108 -0
- package/src/core/tasks/workflow.xml +235 -0
- package/src/memory/MEMORY-AUTO.json +66 -0
- package/src/memory/MEMORY-SYSTEM.md +61 -0
- package/src/memory/v1-memory-system.md +197 -0
- package/src/memory/v1-resume-protocol.md +379 -0
- package/src/packs/db-optimization/agents/prompt.yaml +63 -0
- package/src/packs/devops-azure/agents/prompt.yaml +301 -0
- package/src/packs/fintech/agents/prompt.yaml +135 -0
- package/src/phases/auto/auto-01-load.md +165 -0
- package/src/phases/auto/auto-02-discover.md +207 -0
- package/src/phases/auto/auto-03-plan.md +509 -0
- package/src/phases/auto/auto-04-architect.md +567 -0
- package/src/phases/auto/auto-05-implement.md +713 -0
- package/src/phases/auto/auto-06-test.md +559 -0
- package/src/phases/auto/auto-07-deploy.md +510 -0
- package/src/phases/auto/auto-08-doc.md +970 -0
- package/src/phases/manual/01-discover.md +136 -0
- package/src/phases/manual/02-design.md +147 -0
- package/src/phases/manual/03-build.md +113 -0
- package/src/phases/manual/04-verify.md +107 -0
- package/src/phases/manual/05-ship.md +156 -0
- package/src/protocols/debate-protocol.md +58 -0
- package/src/protocols/universal-envelope.md +42 -0
- package/src/protocols/v1-debate-protocol.md +454 -0
- package/src/protocols/v1-universal-envelope.md +273 -0
- package/src/utility/agent-components/activation-rules.txt +6 -0
- package/src/utility/agent-components/activation-steps.txt +14 -0
- package/src/utility/agent-components/agent-command-header.md +1 -0
- package/src/utility/agent-components/agent.customize.template.yaml +41 -0
- package/src/utility/agent-components/handler-action.txt +4 -0
- package/src/utility/agent-components/handler-data.txt +5 -0
- package/src/utility/agent-components/handler-exec.txt +6 -0
- package/src/utility/agent-components/handler-multi.txt +14 -0
- package/src/utility/agent-components/handler-tmpl.txt +5 -0
- package/src/utility/agent-components/handler-validate-workflow.txt +7 -0
- package/src/utility/agent-components/handler-workflow.txt +10 -0
- package/src/utility/agent-components/menu-handlers.txt +6 -0
- package/src/wizards/01-discover/create-product-brief/steps/step-01-init.md +7 -0
- package/src/wizards/01-discover/create-product-brief/steps/step-02-vision.md +7 -0
- package/src/wizards/01-discover/create-product-brief/steps/step-03-users.md +7 -0
- package/src/wizards/01-discover/create-product-brief/steps/step-04-scope.md +7 -0
- package/src/wizards/01-discover/create-product-brief/steps/step-05-metrics.md +7 -0
- package/src/wizards/01-discover/create-product-brief/steps/step-06-complete.md +7 -0
- package/src/wizards/01-discover/create-product-brief/templates/product-brief.template.md +14 -0
- package/src/wizards/01-discover/create-product-brief/wizard.md +105 -0
- package/src/wizards/01-discover/research/domain-steps/step-01-init.md +137 -0
- package/src/wizards/01-discover/research/domain-steps/step-02-domain-analysis.md +229 -0
- package/src/wizards/01-discover/research/domain-steps/step-03-competitive-landscape.md +238 -0
- package/src/wizards/01-discover/research/domain-steps/step-04-regulatory-focus.md +206 -0
- package/src/wizards/01-discover/research/domain-steps/step-05-technical-trends.md +234 -0
- package/src/wizards/01-discover/research/domain-steps/step-06-research-synthesis.md +444 -0
- package/src/wizards/01-discover/research/market-steps/step-01-init.md +182 -0
- package/src/wizards/01-discover/research/market-steps/step-02-customer-behavior.md +237 -0
- package/src/wizards/01-discover/research/market-steps/step-03-customer-pain-points.md +249 -0
- package/src/wizards/01-discover/research/market-steps/step-04-customer-decisions.md +259 -0
- package/src/wizards/01-discover/research/market-steps/step-05-competitive-analysis.md +177 -0
- package/src/wizards/01-discover/research/market-steps/step-06-research-completion.md +476 -0
- package/src/wizards/01-discover/research/technical-steps/step-01-init.md +137 -0
- package/src/wizards/01-discover/research/technical-steps/step-02-technical-overview.md +239 -0
- package/src/wizards/01-discover/research/technical-steps/step-03-integration-patterns.md +248 -0
- package/src/wizards/01-discover/research/technical-steps/step-04-architectural-patterns.md +202 -0
- package/src/wizards/01-discover/research/technical-steps/step-05-implementation-research.md +233 -0
- package/src/wizards/01-discover/research/technical-steps/step-06-research-synthesis.md +487 -0
- package/src/wizards/01-discover/research/templates/research.template.md +29 -0
- package/src/wizards/01-discover/research/workflow-domain-research.md +54 -0
- package/src/wizards/01-discover/research/workflow-market-research.md +54 -0
- package/src/wizards/01-discover/research/workflow-technical-research.md +54 -0
- package/src/wizards/02-plan/create-prd/data/domain-complexity.csv +15 -0
- package/src/wizards/02-plan/create-prd/data/prd-purpose.md +197 -0
- package/src/wizards/02-plan/create-prd/data/project-types.csv +11 -0
- package/src/wizards/02-plan/create-prd/steps/step-01-init.md +191 -0
- package/src/wizards/02-plan/create-prd/steps/step-01b-continue.md +152 -0
- package/src/wizards/02-plan/create-prd/steps/step-02-discovery.md +224 -0
- package/src/wizards/02-plan/create-prd/steps/step-02b-vision.md +154 -0
- package/src/wizards/02-plan/create-prd/steps/step-02c-executive-summary.md +170 -0
- package/src/wizards/02-plan/create-prd/steps/step-03-success.md +226 -0
- package/src/wizards/02-plan/create-prd/steps/step-04-journeys.md +213 -0
- package/src/wizards/02-plan/create-prd/steps/step-05-domain.md +207 -0
- package/src/wizards/02-plan/create-prd/steps/step-06-innovation.md +226 -0
- package/src/wizards/02-plan/create-prd/steps/step-07-project-type.md +237 -0
- package/src/wizards/02-plan/create-prd/steps/step-08-scoping.md +228 -0
- package/src/wizards/02-plan/create-prd/steps/step-09-functional.md +231 -0
- package/src/wizards/02-plan/create-prd/steps/step-10-nonfunctional.md +242 -0
- package/src/wizards/02-plan/create-prd/steps/step-11-polish.md +217 -0
- package/src/wizards/02-plan/create-prd/steps/step-12-complete.md +124 -0
- package/src/wizards/02-plan/create-prd/templates/prd-template.md +10 -0
- package/src/wizards/02-plan/create-prd/wizard.md +63 -0
- package/src/wizards/02-plan/create-ux-design/steps/step-01-init.md +135 -0
- package/src/wizards/02-plan/create-ux-design/steps/step-01b-continue.md +127 -0
- package/src/wizards/02-plan/create-ux-design/steps/step-02-discovery.md +190 -0
- package/src/wizards/02-plan/create-ux-design/steps/step-03-core-experience.md +216 -0
- package/src/wizards/02-plan/create-ux-design/steps/step-04-emotional-response.md +219 -0
- package/src/wizards/02-plan/create-ux-design/steps/step-05-inspiration.md +234 -0
- package/src/wizards/02-plan/create-ux-design/steps/step-06-design-system.md +252 -0
- package/src/wizards/02-plan/create-ux-design/steps/step-07-defining-experience.md +254 -0
- package/src/wizards/02-plan/create-ux-design/steps/step-08-visual-foundation.md +224 -0
- package/src/wizards/02-plan/create-ux-design/steps/step-09-design-directions.md +224 -0
- package/src/wizards/02-plan/create-ux-design/steps/step-10-user-journeys.md +241 -0
- package/src/wizards/02-plan/create-ux-design/steps/step-11-component-strategy.md +248 -0
- package/src/wizards/02-plan/create-ux-design/steps/step-12-ux-patterns.md +237 -0
- package/src/wizards/02-plan/create-ux-design/steps/step-13-responsive-accessibility.md +264 -0
- package/src/wizards/02-plan/create-ux-design/steps/step-14-complete.md +171 -0
- package/src/wizards/02-plan/create-ux-design/templates/ux-design-template.md +13 -0
- package/src/wizards/02-plan/create-ux-design/wizard.md +42 -0
- package/src/wizards/03-architect/create-architecture/data/domain-complexity.csv +13 -0
- package/src/wizards/03-architect/create-architecture/data/project-types.csv +7 -0
- package/src/wizards/03-architect/create-architecture/steps/step-01-init.md +153 -0
- package/src/wizards/03-architect/create-architecture/steps/step-01b-continue.md +173 -0
- package/src/wizards/03-architect/create-architecture/steps/step-02-context.md +224 -0
- package/src/wizards/03-architect/create-architecture/steps/step-03-starter.md +329 -0
- package/src/wizards/03-architect/create-architecture/steps/step-04-decisions.md +318 -0
- package/src/wizards/03-architect/create-architecture/steps/step-05-patterns.md +359 -0
- package/src/wizards/03-architect/create-architecture/steps/step-06-structure.md +379 -0
- package/src/wizards/03-architect/create-architecture/steps/step-07-validation.md +359 -0
- package/src/wizards/03-architect/create-architecture/steps/step-08-complete.md +76 -0
- package/src/wizards/03-architect/create-architecture/templates/architecture-decision-template.md +12 -0
- package/src/wizards/03-architect/create-architecture/wizard.md +49 -0
- package/src/wizards/03-architect/create-epics/steps/step-01-validate-prerequisites.md +259 -0
- package/src/wizards/03-architect/create-epics/steps/step-02-design-epics.md +233 -0
- package/src/wizards/03-architect/create-epics/steps/step-03-create-stories.md +272 -0
- package/src/wizards/03-architect/create-epics/steps/step-04-final-validation.md +149 -0
- package/src/wizards/03-architect/create-epics/templates/epics-template.md +57 -0
- package/src/wizards/03-architect/create-epics/wizard.md +58 -0
- package/src/wizards/04-build/code-review/checklist.md +23 -0
- package/src/wizards/04-build/code-review/instructions.xml +227 -0
- package/src/wizards/04-build/code-review/workflow.yaml +43 -0
- package/src/wizards/04-build/dev-story/checklist.md +80 -0
- package/src/wizards/04-build/dev-story/instructions.xml +410 -0
- package/src/wizards/04-build/dev-story/workflow.yaml +20 -0
- package/src/wizards/04-build/sprint-planning/checklist.md +33 -0
- package/src/wizards/04-build/sprint-planning/instructions.md +226 -0
- package/src/wizards/04-build/sprint-planning/sprint-status-template.yaml +55 -0
- package/src/wizards/04-build/sprint-planning/workflow.yaml +47 -0
- package/src/wizards/05-ship/document-project/templates/deep-dive-template.md +345 -0
- package/src/wizards/05-ship/document-project/templates/index-template.md +169 -0
- package/src/wizards/05-ship/document-project/templates/project-overview-template.md +103 -0
- package/src/wizards/05-ship/document-project/templates/project-scan-report-schema.json +160 -0
- package/src/wizards/05-ship/document-project/templates/source-tree-template.md +135 -0
- package/src/wizards/05-ship/document-project/wizard.md +130 -0
- package/src/wizards/quick/quick-dev/steps/step-01-mode-detection.md +174 -0
- package/src/wizards/quick/quick-dev/steps/step-02-context-gathering.md +118 -0
- package/src/wizards/quick/quick-dev/steps/step-03-execute.md +111 -0
- package/src/wizards/quick/quick-dev/steps/step-04-self-check.md +111 -0
- package/src/wizards/quick/quick-dev/steps/step-05-adversarial-review.md +104 -0
- package/src/wizards/quick/quick-dev/steps/step-06-resolve-findings.md +146 -0
- package/src/wizards/quick/quick-dev/wizard.md +50 -0
- package/src/wizards/quick/quick-spec/steps/step-01-understand.md +189 -0
- package/src/wizards/quick/quick-spec/steps/step-02-investigate.md +143 -0
- package/src/wizards/quick/quick-spec/steps/step-03-generate.md +126 -0
- package/src/wizards/quick/quick-spec/steps/step-04-review.md +200 -0
- package/src/wizards/quick/quick-spec/templates/tech-spec-template.md +74 -0
- package/src/wizards/quick/quick-spec/wizard.md +79 -0
- package/src/wizards/special/brainstorming/methods/brain-methods.csv +62 -0
- package/src/wizards/special/brainstorming/steps/step-01-session-setup.md +197 -0
- package/src/wizards/special/brainstorming/steps/step-01b-continue.md +122 -0
- package/src/wizards/special/brainstorming/steps/step-02a-user-selected.md +225 -0
- package/src/wizards/special/brainstorming/steps/step-02b-ai-recommended.md +237 -0
- package/src/wizards/special/brainstorming/steps/step-02c-random-selection.md +209 -0
- package/src/wizards/special/brainstorming/steps/step-02d-progressive-flow.md +264 -0
- package/src/wizards/special/brainstorming/steps/step-03-technique-execution.md +399 -0
- package/src/wizards/special/brainstorming/steps/step-04-idea-organization.md +303 -0
- package/src/wizards/special/brainstorming/wizard.md +58 -0
- package/src/wizards/special/party-mode/steps/step-01-agent-loading.md +138 -0
- package/src/wizards/special/party-mode/steps/step-02-discussion-orchestration.md +187 -0
- package/src/wizards/special/party-mode/steps/step-03-graceful-exit.md +168 -0
- package/src/wizards/special/party-mode/wizard.md +194 -0
- package/test/README.md +295 -0
- package/test/adversarial-review-tests/README.md +56 -0
- package/test/adversarial-review-tests/sample-content.md +46 -0
- package/test/adversarial-review-tests/test-cases.yaml +103 -0
- package/test/fixtures/agent-schema/invalid/critical-actions/actions-as-string.agent.yaml +27 -0
- package/test/fixtures/agent-schema/invalid/critical-actions/empty-string-in-actions.agent.yaml +30 -0
- package/test/fixtures/agent-schema/invalid/menu/empty-menu.agent.yaml +22 -0
- package/test/fixtures/agent-schema/invalid/menu/missing-menu.agent.yaml +20 -0
- package/test/fixtures/agent-schema/invalid/menu-commands/empty-command-target.agent.yaml +25 -0
- package/test/fixtures/agent-schema/invalid/menu-commands/no-command-target.agent.yaml +24 -0
- package/test/fixtures/agent-schema/invalid/menu-triggers/camel-case.agent.yaml +25 -0
- package/test/fixtures/agent-schema/invalid/menu-triggers/compound-invalid-format.agent.yaml +25 -0
- package/test/fixtures/agent-schema/invalid/menu-triggers/compound-mismatched-kebab.agent.yaml +25 -0
- package/test/fixtures/agent-schema/invalid/menu-triggers/duplicate-triggers.agent.yaml +31 -0
- package/test/fixtures/agent-schema/invalid/menu-triggers/empty-trigger.agent.yaml +25 -0
- package/test/fixtures/agent-schema/invalid/menu-triggers/leading-asterisk.agent.yaml +25 -0
- package/test/fixtures/agent-schema/invalid/menu-triggers/snake-case.agent.yaml +25 -0
- package/test/fixtures/agent-schema/invalid/menu-triggers/trigger-with-spaces.agent.yaml +25 -0
- package/test/fixtures/agent-schema/invalid/metadata/empty-module-string.agent.yaml +26 -0
- package/test/fixtures/agent-schema/invalid/metadata/empty-name.agent.yaml +24 -0
- package/test/fixtures/agent-schema/invalid/metadata/extra-metadata-fields.agent.yaml +27 -0
- package/test/fixtures/agent-schema/invalid/metadata/missing-id.agent.yaml +23 -0
- package/test/fixtures/agent-schema/invalid/persona/empty-principles-array.agent.yaml +24 -0
- package/test/fixtures/agent-schema/invalid/persona/empty-string-in-principles.agent.yaml +27 -0
- package/test/fixtures/agent-schema/invalid/persona/extra-persona-fields.agent.yaml +27 -0
- package/test/fixtures/agent-schema/invalid/persona/missing-role.agent.yaml +24 -0
- package/test/fixtures/agent-schema/invalid/prompts/empty-content.agent.yaml +29 -0
- package/test/fixtures/agent-schema/invalid/prompts/extra-prompt-fields.agent.yaml +31 -0
- package/test/fixtures/agent-schema/invalid/prompts/missing-content.agent.yaml +28 -0
- package/test/fixtures/agent-schema/invalid/prompts/missing-id.agent.yaml +28 -0
- package/test/fixtures/agent-schema/invalid/top-level/empty-file.agent.yaml +5 -0
- package/test/fixtures/agent-schema/invalid/top-level/extra-top-level-keys.agent.yaml +28 -0
- package/test/fixtures/agent-schema/invalid/top-level/missing-agent-key.agent.yaml +11 -0
- package/test/fixtures/agent-schema/invalid/yaml-errors/invalid-indentation.agent.yaml +19 -0
- package/test/fixtures/agent-schema/invalid/yaml-errors/malformed-yaml.agent.yaml +18 -0
- package/test/fixtures/agent-schema/valid/critical-actions/empty-critical-actions.agent.yaml +24 -0
- package/test/fixtures/agent-schema/valid/critical-actions/no-critical-actions.agent.yaml +22 -0
- package/test/fixtures/agent-schema/valid/critical-actions/valid-critical-actions.agent.yaml +27 -0
- package/test/fixtures/agent-schema/valid/menu/multiple-menu-items.agent.yaml +31 -0
- package/test/fixtures/agent-schema/valid/menu/single-menu-item.agent.yaml +22 -0
- package/test/fixtures/agent-schema/valid/menu-commands/all-command-types.agent.yaml +38 -0
- package/test/fixtures/agent-schema/valid/menu-commands/multiple-commands.agent.yaml +24 -0
- package/test/fixtures/agent-schema/valid/menu-triggers/compound-triggers.agent.yaml +31 -0
- package/test/fixtures/agent-schema/valid/menu-triggers/kebab-case-triggers.agent.yaml +34 -0
- package/test/fixtures/agent-schema/valid/metadata/core-agent-with-module.agent.yaml +24 -0
- package/test/fixtures/agent-schema/valid/metadata/empty-module-name-in-path.agent.yaml +24 -0
- package/test/fixtures/agent-schema/valid/metadata/malformed-path-treated-as-core.agent.yaml +24 -0
- package/test/fixtures/agent-schema/valid/metadata/module-agent-correct.agent.yaml +24 -0
- package/test/fixtures/agent-schema/valid/metadata/module-agent-missing-module.agent.yaml +23 -0
- package/test/fixtures/agent-schema/valid/metadata/wrong-module-value.agent.yaml +24 -0
- package/test/fixtures/agent-schema/valid/persona/complete-persona.agent.yaml +24 -0
- package/test/fixtures/agent-schema/valid/prompts/empty-prompts.agent.yaml +24 -0
- package/test/fixtures/agent-schema/valid/prompts/no-prompts.agent.yaml +22 -0
- package/test/fixtures/agent-schema/valid/prompts/valid-prompts-minimal.agent.yaml +28 -0
- package/test/fixtures/agent-schema/valid/prompts/valid-prompts-with-description.agent.yaml +30 -0
- package/test/fixtures/agent-schema/valid/top-level/minimal-core-agent.agent.yaml +24 -0
- package/test/fixtures/file-refs-csv/invalid/all-empty-workflow.csv +3 -0
- package/test/fixtures/file-refs-csv/invalid/empty-data.csv +1 -0
- package/test/fixtures/file-refs-csv/invalid/no-workflow-column.csv +3 -0
- package/test/fixtures/file-refs-csv/invalid/unresolvable-vars.csv +3 -0
- package/test/fixtures/file-refs-csv/valid/bmm-style.csv +3 -0
- package/test/fixtures/file-refs-csv/valid/core-style.csv +3 -0
- package/test/fixtures/file-refs-csv/valid/minimal.csv +2 -0
- package/test/test-agent-schema.js +387 -0
- package/test/test-cli-integration.sh +159 -0
- package/test/test-file-refs-csv.js +133 -0
- package/test/test-installation-components.js +212 -0
- package/test/test-rehype-plugins.mjs +1050 -0
- package/test/unit-test-schema.js +133 -0
- package/tests/run_all_tests.py +80 -0
- package/tests/scenarios/cis/brainstorming-coach.test.py +150 -0
- package/tests/scenarios/cis/creative-problem-solver.test.py +167 -0
- package/tests/scenarios/cis/design-thinking-coach.test.py +177 -0
- package/tests/scenarios/cis/innovation-strategist.test.py +191 -0
- package/tests/scenarios/cis/presentation-master.test.py +240 -0
- package/tests/scenarios/cis/storyteller.test.py +324 -0
- package/tests/scenarios/core/mdan-master.test.py +281 -0
- package/tests/scenarios/mmb/agent-builder.test.py +124 -0
- package/tests/scenarios/mmb/module-builder.test.py +124 -0
- package/tests/scenarios/mmb/workflow-builder.test.py +124 -0
- package/tests/scenarios/mmm/analyst.test.py +138 -0
- package/tests/scenarios/mmm/architect.test.py +138 -0
- package/tests/scenarios/mmm/dev.test.py +138 -0
- package/tests/scenarios/mmm/pm.test.py +138 -0
- package/tests/scenarios/mmm/qa.test.py +138 -0
- package/tests/scenarios/mmm/quick-flow-solo-dev.test.py +138 -0
- package/tests/scenarios/mmm/sm.test.py +138 -0
- package/tests/scenarios/mmm/tech-writer.test.py +138 -0
- package/tests/scenarios/mmm/ux-designer.test.py +294 -0
- package/tests/scenarios/packs/db-optimization/db-performance-analyst.test.py +108 -0
- package/tests/scenarios/packs/db-optimization/indexing-specialist.test.py +108 -0
- package/tests/scenarios/packs/db-optimization/query-optimizer.test.py +106 -0
- package/tests/scenarios/packs/devops-azure/azure-specialist.test.py +125 -0
- package/tests/scenarios/packs/devops-azure/cicd-architect.test.py +122 -0
- package/tests/scenarios/packs/devops-azure/devops-engineer.test.py +128 -0
- package/tests/scenarios/packs/fintech/compliance-officer.test.py +165 -0
- package/tests/scenarios/packs/fintech/financial-analyst.test.py +184 -0
- package/tests/scenarios/packs/fintech/risk-manager.test.py +171 -0
- package/tests/scenarios/tea/tea.test.py +346 -0
- package/tests/simple_cis_test.py +285 -0
- package/tests/simple_db_optimization_test.py +199 -0
- package/tests/simple_devops_test.py +193 -0
- package/tests/simple_fintech_test.py +205 -0
- package/tests/simple_mmb_test.py +103 -0
- package/tests/simple_mmm_test.py +159 -0
- package/tests/simple_tea_test.py +80 -0
- package/tests/simple_test.py +111 -0
- package/tests/simple_ux_designer_test.py +144 -0
- package/tests/validate_yaml.py +86 -0
- package/tools/build-docs.mjs +463 -0
- package/tools/cli/README.md +60 -0
- package/tools/cli/commands/install.js +87 -0
- package/tools/cli/commands/status.js +65 -0
- package/tools/cli/commands/uninstall.js +167 -0
- package/tools/cli/external-official-modules.yaml +53 -0
- package/tools/cli/installers/install-messages.yaml +39 -0
- package/tools/cli/installers/lib/core/config-collector.js +1285 -0
- package/tools/cli/installers/lib/core/custom-module-cache.js +260 -0
- package/tools/cli/installers/lib/core/dependency-resolver.js +743 -0
- package/tools/cli/installers/lib/core/detector.js +223 -0
- package/tools/cli/installers/lib/core/ide-config-manager.js +157 -0
- package/tools/cli/installers/lib/core/installer.js +3162 -0
- package/tools/cli/installers/lib/core/manifest-generator.js +1081 -0
- package/tools/cli/installers/lib/core/manifest.js +1038 -0
- package/tools/cli/installers/lib/custom/handler.js +358 -0
- package/tools/cli/installers/lib/ide/_base-ide.js +665 -0
- package/tools/cli/installers/lib/ide/_config-driven.js +634 -0
- package/tools/cli/installers/lib/ide/codex.js +440 -0
- package/tools/cli/installers/lib/ide/github-copilot.js +699 -0
- package/tools/cli/installers/lib/ide/kilo.js +269 -0
- package/tools/cli/installers/lib/ide/manager.js +342 -0
- package/tools/cli/installers/lib/ide/platform-codes.js +100 -0
- package/tools/cli/installers/lib/ide/platform-codes.yaml +243 -0
- package/tools/cli/installers/lib/ide/rovodev.js +257 -0
- package/tools/cli/installers/lib/ide/shared/agent-command-generator.js +180 -0
- package/tools/cli/installers/lib/ide/shared/mdan-artifacts.js +174 -0
- package/tools/cli/installers/lib/ide/shared/module-injections.js +136 -0
- package/tools/cli/installers/lib/ide/shared/path-utils.js +299 -0
- package/tools/cli/installers/lib/ide/shared/task-tool-command-generator.js +366 -0
- package/tools/cli/installers/lib/ide/shared/workflow-command-generator.js +318 -0
- package/tools/cli/installers/lib/ide/templates/agent-command-template.md +14 -0
- package/tools/cli/installers/lib/ide/templates/combined/antigravity.md +8 -0
- package/tools/cli/installers/lib/ide/templates/combined/default-agent.md +15 -0
- package/tools/cli/installers/lib/ide/templates/combined/default-task.md +10 -0
- package/tools/cli/installers/lib/ide/templates/combined/default-tool.md +10 -0
- package/tools/cli/installers/lib/ide/templates/combined/default-workflow-yaml.md +14 -0
- package/tools/cli/installers/lib/ide/templates/combined/default-workflow.md +6 -0
- package/tools/cli/installers/lib/ide/templates/combined/gemini-agent.toml +14 -0
- package/tools/cli/installers/lib/ide/templates/combined/gemini-task.toml +11 -0
- package/tools/cli/installers/lib/ide/templates/combined/gemini-tool.toml +11 -0
- package/tools/cli/installers/lib/ide/templates/combined/gemini-workflow-yaml.toml +16 -0
- package/tools/cli/installers/lib/ide/templates/combined/gemini-workflow.toml +14 -0
- package/tools/cli/installers/lib/ide/templates/combined/kiro-agent.md +16 -0
- package/tools/cli/installers/lib/ide/templates/combined/kiro-task.md +9 -0
- package/tools/cli/installers/lib/ide/templates/combined/kiro-tool.md +9 -0
- package/tools/cli/installers/lib/ide/templates/combined/kiro-workflow-yaml.md +15 -0
- package/tools/cli/installers/lib/ide/templates/combined/kiro-workflow.md +7 -0
- package/tools/cli/installers/lib/ide/templates/combined/opencode-agent.md +15 -0
- package/tools/cli/installers/lib/ide/templates/combined/opencode-task.md +13 -0
- package/tools/cli/installers/lib/ide/templates/combined/opencode-tool.md +13 -0
- package/tools/cli/installers/lib/ide/templates/combined/opencode-workflow-yaml.md +16 -0
- package/tools/cli/installers/lib/ide/templates/combined/opencode-workflow.md +16 -0
- package/tools/cli/installers/lib/ide/templates/combined/rovodev.md +9 -0
- package/tools/cli/installers/lib/ide/templates/combined/trae.md +9 -0
- package/tools/cli/installers/lib/ide/templates/combined/windsurf-workflow.md +10 -0
- package/tools/cli/installers/lib/ide/templates/split/.gitkeep +0 -0
- package/tools/cli/installers/lib/ide/templates/workflow-command-template.md +13 -0
- package/tools/cli/installers/lib/ide/templates/workflow-commander.md +5 -0
- package/tools/cli/installers/lib/message-loader.js +83 -0
- package/tools/cli/installers/lib/modules/external-manager.js +136 -0
- package/tools/cli/installers/lib/modules/manager.js +1498 -0
- package/tools/cli/lib/activation-builder.js +165 -0
- package/tools/cli/lib/agent/compiler.js +525 -0
- package/tools/cli/lib/agent/installer.js +680 -0
- package/tools/cli/lib/agent/template-engine.js +152 -0
- package/tools/cli/lib/agent-analyzer.js +109 -0
- package/tools/cli/lib/agent-party-generator.js +194 -0
- package/tools/cli/lib/cli-utils.js +182 -0
- package/tools/cli/lib/config.js +213 -0
- package/tools/cli/lib/file-ops.js +204 -0
- package/tools/cli/lib/platform-codes.js +116 -0
- package/tools/cli/lib/project-root.js +77 -0
- package/tools/cli/lib/prompts.js +809 -0
- package/tools/cli/lib/ui.js +1936 -0
- package/tools/cli/lib/xml-handler.js +177 -0
- package/tools/cli/lib/xml-to-markdown.js +82 -0
- package/tools/cli/lib/yaml-format.js +245 -0
- package/tools/cli/lib/yaml-xml-builder.js +587 -0
- package/tools/cli/mdan-cli.js +106 -0
- package/tools/docs/_prompt-external-modules-page.md +59 -0
- package/tools/docs/fix-refs.md +91 -0
- package/tools/fix-doc-links.js +285 -0
- package/tools/format-workflow-md.js +263 -0
- package/tools/lib/xml-utils.js +13 -0
- package/tools/mdan-npx-wrapper.js +38 -0
- package/tools/migrate-custom-module-paths.js +124 -0
- package/tools/platform-codes.yaml +157 -0
- package/tools/schema/agent.js +491 -0
- package/tools/validate-agent-schema.js +110 -0
- package/tools/validate-doc-links.js +407 -0
- package/tools/validate-file-refs.js +554 -0
- package/tools/validate-svg-changes.sh +356 -0
- package/website/README.md +75 -0
- package/website/astro.config.mjs +136 -0
- package/website/public/favicon.ico +0 -0
- package/website/public/workflow-map-diagram.html +361 -0
- package/website/src/components/Banner.astro +62 -0
- package/website/src/components/Header.astro +96 -0
- package/website/src/components/MobileMenuFooter.astro +33 -0
- package/website/src/content/config.ts +6 -0
- package/website/src/lib/site-url.mjs +25 -0
- package/website/src/pages/404.astro +11 -0
- package/website/src/pages/robots.txt.ts +48 -0
- package/website/src/rehype-base-paths.js +112 -0
- package/website/src/rehype-markdown-links.js +119 -0
- package/website/src/styles/custom.css +805 -0
|
@@ -0,0 +1,743 @@
|
|
|
1
|
+
const fs = require('fs-extra');
|
|
2
|
+
const path = require('node:path');
|
|
3
|
+
const glob = require('glob');
|
|
4
|
+
const yaml = require('yaml');
|
|
5
|
+
const prompts = require('../../../lib/prompts');
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Dependency Resolver for MDAN modules
|
|
9
|
+
* Handles cross-module dependencies and ensures all required files are included
|
|
10
|
+
*/
|
|
11
|
+
class DependencyResolver {
|
|
12
|
+
constructor() {
|
|
13
|
+
this.dependencies = new Map();
|
|
14
|
+
this.resolvedFiles = new Set();
|
|
15
|
+
this.missingDependencies = new Set();
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Resolve all dependencies for selected modules
|
|
20
|
+
* @param {string} mdanDir - MDAN installation directory
|
|
21
|
+
* @param {Array} selectedModules - Modules explicitly selected by user
|
|
22
|
+
* @param {Object} options - Resolution options
|
|
23
|
+
* @returns {Object} Resolution results with all required files
|
|
24
|
+
*/
|
|
25
|
+
async resolve(mdanDir, selectedModules = [], options = {}) {
|
|
26
|
+
if (options.verbose) {
|
|
27
|
+
await prompts.log.info('Resolving module dependencies...');
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// Always include core as base
|
|
31
|
+
const modulesToProcess = new Set(['core', ...selectedModules]);
|
|
32
|
+
|
|
33
|
+
// First pass: collect all explicitly selected files
|
|
34
|
+
const primaryFiles = await this.collectPrimaryFiles(mdanDir, modulesToProcess, options);
|
|
35
|
+
|
|
36
|
+
// Second pass: parse and resolve dependencies
|
|
37
|
+
const allDependencies = await this.parseDependencies(primaryFiles);
|
|
38
|
+
|
|
39
|
+
// Third pass: resolve dependency paths and collect files
|
|
40
|
+
const resolvedDeps = await this.resolveDependencyPaths(mdanDir, allDependencies);
|
|
41
|
+
|
|
42
|
+
// Fourth pass: check for transitive dependencies
|
|
43
|
+
const transitiveDeps = await this.resolveTransitiveDependencies(mdanDir, resolvedDeps);
|
|
44
|
+
|
|
45
|
+
// Combine all files
|
|
46
|
+
const allFiles = new Set([...primaryFiles.map((f) => f.path), ...resolvedDeps, ...transitiveDeps]);
|
|
47
|
+
|
|
48
|
+
// Organize by module
|
|
49
|
+
const organizedFiles = this.organizeByModule(mdanDir, allFiles);
|
|
50
|
+
|
|
51
|
+
// Report results (only in verbose mode)
|
|
52
|
+
if (options.verbose) {
|
|
53
|
+
await this.reportResults(organizedFiles, selectedModules);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
return {
|
|
57
|
+
primaryFiles,
|
|
58
|
+
dependencies: resolvedDeps,
|
|
59
|
+
transitiveDependencies: transitiveDeps,
|
|
60
|
+
allFiles: [...allFiles],
|
|
61
|
+
byModule: organizedFiles,
|
|
62
|
+
missing: [...this.missingDependencies],
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Collect primary files from selected modules
|
|
68
|
+
*/
|
|
69
|
+
async collectPrimaryFiles(mdanDir, modules, options = {}) {
|
|
70
|
+
const files = [];
|
|
71
|
+
const { moduleManager } = options;
|
|
72
|
+
|
|
73
|
+
for (const module of modules) {
|
|
74
|
+
// Skip external modules - they're installed from cache, not from source
|
|
75
|
+
if (moduleManager && (await moduleManager.isExternalModule(module))) {
|
|
76
|
+
continue;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// Handle both source (src/) and installed (mdan/) directory structures
|
|
80
|
+
let moduleDir;
|
|
81
|
+
|
|
82
|
+
// Check if this is a source directory (has 'src' subdirectory)
|
|
83
|
+
const srcDir = path.join(mdanDir, 'src');
|
|
84
|
+
if (await fs.pathExists(srcDir)) {
|
|
85
|
+
// Source directory structure: src/core or src/bmm
|
|
86
|
+
if (module === 'core') {
|
|
87
|
+
moduleDir = path.join(srcDir, 'core');
|
|
88
|
+
} else if (module === 'bmm') {
|
|
89
|
+
moduleDir = path.join(srcDir, 'bmm');
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
if (!moduleDir) {
|
|
94
|
+
continue;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
if (!(await fs.pathExists(moduleDir))) {
|
|
98
|
+
await prompts.log.warn('Module directory not found: ' + moduleDir);
|
|
99
|
+
continue;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// Collect agents
|
|
103
|
+
const agentsDir = path.join(moduleDir, 'agents');
|
|
104
|
+
if (await fs.pathExists(agentsDir)) {
|
|
105
|
+
const agentFiles = await glob.glob('*.md', { cwd: agentsDir });
|
|
106
|
+
for (const file of agentFiles) {
|
|
107
|
+
const agentPath = path.join(agentsDir, file);
|
|
108
|
+
|
|
109
|
+
// Check for localskip attribute
|
|
110
|
+
const content = await fs.readFile(agentPath, 'utf8');
|
|
111
|
+
const hasLocalSkip = content.match(/<agent[^>]*\slocalskip="true"[^>]*>/);
|
|
112
|
+
if (hasLocalSkip) {
|
|
113
|
+
continue; // Skip agents marked for web-only
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
files.push({
|
|
117
|
+
path: agentPath,
|
|
118
|
+
type: 'agent',
|
|
119
|
+
module,
|
|
120
|
+
name: path.basename(file, '.md'),
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
// Collect tasks
|
|
126
|
+
const tasksDir = path.join(moduleDir, 'tasks');
|
|
127
|
+
if (await fs.pathExists(tasksDir)) {
|
|
128
|
+
const taskFiles = await glob.glob('*.md', { cwd: tasksDir });
|
|
129
|
+
for (const file of taskFiles) {
|
|
130
|
+
files.push({
|
|
131
|
+
path: path.join(tasksDir, file),
|
|
132
|
+
type: 'task',
|
|
133
|
+
module,
|
|
134
|
+
name: path.basename(file, '.md'),
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
return files;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* Parse dependencies from file content
|
|
145
|
+
*/
|
|
146
|
+
async parseDependencies(files) {
|
|
147
|
+
const allDeps = new Set();
|
|
148
|
+
|
|
149
|
+
for (const file of files) {
|
|
150
|
+
const content = await fs.readFile(file.path, 'utf8');
|
|
151
|
+
|
|
152
|
+
// Parse YAML frontmatter for explicit dependencies
|
|
153
|
+
const frontmatterMatch = content.match(/^---\r?\n([\s\S]*?)\r?\n---/);
|
|
154
|
+
if (frontmatterMatch) {
|
|
155
|
+
try {
|
|
156
|
+
// Pre-process to handle backticks in YAML values
|
|
157
|
+
let yamlContent = frontmatterMatch[1];
|
|
158
|
+
// Quote values with backticks to make them valid YAML
|
|
159
|
+
yamlContent = yamlContent.replaceAll(/: `([^`]+)`/g, ': "$1"');
|
|
160
|
+
|
|
161
|
+
const frontmatter = yaml.parse(yamlContent);
|
|
162
|
+
if (frontmatter.dependencies) {
|
|
163
|
+
const deps = Array.isArray(frontmatter.dependencies) ? frontmatter.dependencies : [frontmatter.dependencies];
|
|
164
|
+
|
|
165
|
+
for (const dep of deps) {
|
|
166
|
+
allDeps.add({
|
|
167
|
+
from: file.path,
|
|
168
|
+
dependency: dep,
|
|
169
|
+
type: 'explicit',
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
// Check for template dependencies
|
|
175
|
+
if (frontmatter.template) {
|
|
176
|
+
const templates = Array.isArray(frontmatter.template) ? frontmatter.template : [frontmatter.template];
|
|
177
|
+
for (const template of templates) {
|
|
178
|
+
allDeps.add({
|
|
179
|
+
from: file.path,
|
|
180
|
+
dependency: template,
|
|
181
|
+
type: 'template',
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
} catch (error) {
|
|
186
|
+
await prompts.log.warn('Failed to parse frontmatter in ' + file.name + ': ' + error.message);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
// Parse content for command references (cross-module dependencies)
|
|
191
|
+
const commandRefs = this.parseCommandReferences(content);
|
|
192
|
+
for (const ref of commandRefs) {
|
|
193
|
+
allDeps.add({
|
|
194
|
+
from: file.path,
|
|
195
|
+
dependency: ref,
|
|
196
|
+
type: 'command',
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
// Parse for file path references
|
|
201
|
+
const fileRefs = this.parseFileReferences(content);
|
|
202
|
+
for (const ref of fileRefs) {
|
|
203
|
+
// Determine type based on path format
|
|
204
|
+
// Paths starting with mdan/ are absolute references to the mdan installation
|
|
205
|
+
const depType = ref.startsWith('mdan/') ? 'mdan-path' : 'file';
|
|
206
|
+
allDeps.add({
|
|
207
|
+
from: file.path,
|
|
208
|
+
dependency: ref,
|
|
209
|
+
type: depType,
|
|
210
|
+
});
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
return allDeps;
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
/**
|
|
218
|
+
* Parse command references from content
|
|
219
|
+
*/
|
|
220
|
+
parseCommandReferences(content) {
|
|
221
|
+
const refs = new Set();
|
|
222
|
+
|
|
223
|
+
// Match @task-{name} or @agent-{name} or @{module}-{type}-{name}
|
|
224
|
+
const commandPattern = /@(task-|agent-|mdan-)([a-z0-9-]+)/g;
|
|
225
|
+
let match;
|
|
226
|
+
|
|
227
|
+
while ((match = commandPattern.exec(content)) !== null) {
|
|
228
|
+
refs.add(match[0]);
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
// Match file paths like mdan/core/agents/analyst
|
|
232
|
+
const pathPattern = /mdan\/(core|bmm|cis)\/(agents|tasks)\/([a-z0-9-]+)/g;
|
|
233
|
+
|
|
234
|
+
while ((match = pathPattern.exec(content)) !== null) {
|
|
235
|
+
refs.add(match[0]);
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
return [...refs];
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
/**
|
|
242
|
+
* Parse file path references from content
|
|
243
|
+
*/
|
|
244
|
+
parseFileReferences(content) {
|
|
245
|
+
const refs = new Set();
|
|
246
|
+
|
|
247
|
+
// Match relative paths like ../templates/file.yaml or ./data/file.md
|
|
248
|
+
const relativePattern = /['"](\.\.?\/[^'"]+\.(md|yaml|yml|xml|json|txt|csv))['"]/g;
|
|
249
|
+
let match;
|
|
250
|
+
|
|
251
|
+
while ((match = relativePattern.exec(content)) !== null) {
|
|
252
|
+
refs.add(match[1]);
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
// Parse exec attributes in command tags
|
|
256
|
+
const execPattern = /exec="([^"]+)"/g;
|
|
257
|
+
while ((match = execPattern.exec(content)) !== null) {
|
|
258
|
+
let execPath = match[1];
|
|
259
|
+
if (execPath && execPath !== '*') {
|
|
260
|
+
// Remove {project-root} prefix to get the actual path
|
|
261
|
+
// Usage is like {project-root}/.mdan/core/tasks/foo.md
|
|
262
|
+
if (execPath.includes('{project-root}')) {
|
|
263
|
+
execPath = execPath.replace('{project-root}', '');
|
|
264
|
+
}
|
|
265
|
+
refs.add(execPath);
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
// Parse tmpl attributes in command tags
|
|
270
|
+
const tmplPattern = /tmpl="([^"]+)"/g;
|
|
271
|
+
while ((match = tmplPattern.exec(content)) !== null) {
|
|
272
|
+
let tmplPath = match[1];
|
|
273
|
+
if (tmplPath && tmplPath !== '*') {
|
|
274
|
+
// Remove {project-root} prefix to get the actual path
|
|
275
|
+
// Usage is like {project-root}/.mdan/core/tasks/foo.md
|
|
276
|
+
if (tmplPath.includes('{project-root}')) {
|
|
277
|
+
tmplPath = tmplPath.replace('{project-root}', '');
|
|
278
|
+
}
|
|
279
|
+
refs.add(tmplPath);
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
return [...refs];
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
/**
|
|
287
|
+
* Resolve dependency paths to actual files
|
|
288
|
+
*/
|
|
289
|
+
async resolveDependencyPaths(mdanDir, dependencies) {
|
|
290
|
+
const resolved = new Set();
|
|
291
|
+
|
|
292
|
+
for (const dep of dependencies) {
|
|
293
|
+
const resolvedPaths = await this.resolveSingleDependency(mdanDir, dep);
|
|
294
|
+
for (const path of resolvedPaths) {
|
|
295
|
+
resolved.add(path);
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
return resolved;
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
/**
|
|
303
|
+
* Resolve a single dependency to file paths
|
|
304
|
+
*/
|
|
305
|
+
async resolveSingleDependency(mdanDir, dep) {
|
|
306
|
+
const paths = [];
|
|
307
|
+
|
|
308
|
+
switch (dep.type) {
|
|
309
|
+
case 'explicit':
|
|
310
|
+
case 'file': {
|
|
311
|
+
let depPath = dep.dependency;
|
|
312
|
+
|
|
313
|
+
// Handle {project-root} prefix if present
|
|
314
|
+
if (depPath.includes('{project-root}')) {
|
|
315
|
+
// Remove {project-root} and resolve as mdan path
|
|
316
|
+
depPath = depPath.replace('{project-root}', '');
|
|
317
|
+
|
|
318
|
+
if (depPath.startsWith('mdan/')) {
|
|
319
|
+
const mdanPath = depPath.replace(/^mdan\//, '');
|
|
320
|
+
|
|
321
|
+
// Handle glob patterns
|
|
322
|
+
if (depPath.includes('*')) {
|
|
323
|
+
// Extract the base path and pattern
|
|
324
|
+
const pathParts = mdanPath.split('/');
|
|
325
|
+
const module = pathParts[0];
|
|
326
|
+
const filePattern = pathParts.at(-1);
|
|
327
|
+
const middlePath = pathParts.slice(1, -1).join('/');
|
|
328
|
+
|
|
329
|
+
let basePath;
|
|
330
|
+
if (module === 'core') {
|
|
331
|
+
basePath = path.join(mdanDir, 'core', middlePath);
|
|
332
|
+
} else {
|
|
333
|
+
basePath = path.join(mdanDir, 'modules', module, middlePath);
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
if (await fs.pathExists(basePath)) {
|
|
337
|
+
const files = await glob.glob(filePattern, { cwd: basePath });
|
|
338
|
+
for (const file of files) {
|
|
339
|
+
paths.push(path.join(basePath, file));
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
} else {
|
|
343
|
+
// Direct path
|
|
344
|
+
if (mdanPath.startsWith('core/')) {
|
|
345
|
+
const corePath = path.join(mdanDir, mdanPath);
|
|
346
|
+
if (await fs.pathExists(corePath)) {
|
|
347
|
+
paths.push(corePath);
|
|
348
|
+
}
|
|
349
|
+
} else {
|
|
350
|
+
const parts = mdanPath.split('/');
|
|
351
|
+
const module = parts[0];
|
|
352
|
+
const rest = parts.slice(1).join('/');
|
|
353
|
+
const modulePath = path.join(mdanDir, 'modules', module, rest);
|
|
354
|
+
|
|
355
|
+
if (await fs.pathExists(modulePath)) {
|
|
356
|
+
paths.push(modulePath);
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
} else {
|
|
362
|
+
// Regular relative path handling
|
|
363
|
+
const sourceDir = path.dirname(dep.from);
|
|
364
|
+
|
|
365
|
+
// Handle glob patterns
|
|
366
|
+
if (depPath.includes('*')) {
|
|
367
|
+
const basePath = path.resolve(sourceDir, path.dirname(depPath));
|
|
368
|
+
const pattern = path.basename(depPath);
|
|
369
|
+
|
|
370
|
+
if (await fs.pathExists(basePath)) {
|
|
371
|
+
const files = await glob.glob(pattern, { cwd: basePath });
|
|
372
|
+
for (const file of files) {
|
|
373
|
+
paths.push(path.join(basePath, file));
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
} else {
|
|
377
|
+
// Direct file reference
|
|
378
|
+
const fullPath = path.resolve(sourceDir, depPath);
|
|
379
|
+
if (await fs.pathExists(fullPath)) {
|
|
380
|
+
paths.push(fullPath);
|
|
381
|
+
} else {
|
|
382
|
+
this.missingDependencies.add(`${depPath} (referenced by ${path.basename(dep.from)})`);
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
break;
|
|
388
|
+
}
|
|
389
|
+
case 'command': {
|
|
390
|
+
// Resolve command references to actual files
|
|
391
|
+
const commandPath = await this.resolveCommandToPath(mdanDir, dep.dependency);
|
|
392
|
+
if (commandPath) {
|
|
393
|
+
paths.push(commandPath);
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
break;
|
|
397
|
+
}
|
|
398
|
+
case 'mdan-path': {
|
|
399
|
+
// Resolve mdan/ paths (from {project-root}/.mdan/... references)
|
|
400
|
+
// These are paths relative to the src directory structure
|
|
401
|
+
const mdanPath = dep.dependency.replace(/^mdan\//, '');
|
|
402
|
+
|
|
403
|
+
// Try to resolve as if it's in src structure
|
|
404
|
+
// mdan/core/tasks/foo.md -> src/core/tasks/foo.md
|
|
405
|
+
// mdan/core/tasks/bar.md -> src/bmm/tasks/bar.md (bmm is directly under src/)
|
|
406
|
+
// mdan/cis/agents/bar.md -> src/modules/cis/agents/bar.md
|
|
407
|
+
|
|
408
|
+
if (mdanPath.startsWith('core/')) {
|
|
409
|
+
const corePath = path.join(mdanDir, mdanPath);
|
|
410
|
+
if (await fs.pathExists(corePath)) {
|
|
411
|
+
paths.push(corePath);
|
|
412
|
+
} else {
|
|
413
|
+
// Not found, but don't report as missing since it might be installed later
|
|
414
|
+
}
|
|
415
|
+
} else {
|
|
416
|
+
// It's a module path like bmm/tasks/foo.md or cis/agents/bar.md
|
|
417
|
+
const parts = mdanPath.split('/');
|
|
418
|
+
const module = parts[0];
|
|
419
|
+
const rest = parts.slice(1).join('/');
|
|
420
|
+
let modulePath;
|
|
421
|
+
if (module === 'bmm') {
|
|
422
|
+
// bmm is directly under src/
|
|
423
|
+
modulePath = path.join(mdanDir, module, rest);
|
|
424
|
+
} else {
|
|
425
|
+
// Other modules are under modules/
|
|
426
|
+
modulePath = path.join(mdanDir, 'modules', module, rest);
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
if (await fs.pathExists(modulePath)) {
|
|
430
|
+
paths.push(modulePath);
|
|
431
|
+
} else {
|
|
432
|
+
// Not found, but don't report as missing since it might be installed later
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
break;
|
|
437
|
+
}
|
|
438
|
+
case 'template': {
|
|
439
|
+
// Resolve template references
|
|
440
|
+
let templateDep = dep.dependency;
|
|
441
|
+
|
|
442
|
+
// Handle {project-root} prefix if present
|
|
443
|
+
if (templateDep.includes('{project-root}')) {
|
|
444
|
+
// Remove {project-root} and treat as mdan-path
|
|
445
|
+
templateDep = templateDep.replace('{project-root}', '');
|
|
446
|
+
|
|
447
|
+
// Now resolve as a mdan path
|
|
448
|
+
if (templateDep.startsWith('mdan/')) {
|
|
449
|
+
const mdanPath = templateDep.replace(/^mdan\//, '');
|
|
450
|
+
|
|
451
|
+
if (mdanPath.startsWith('core/')) {
|
|
452
|
+
const corePath = path.join(mdanDir, mdanPath);
|
|
453
|
+
if (await fs.pathExists(corePath)) {
|
|
454
|
+
paths.push(corePath);
|
|
455
|
+
}
|
|
456
|
+
} else {
|
|
457
|
+
// Module path like cis/templates/brainstorm.md
|
|
458
|
+
const parts = mdanPath.split('/');
|
|
459
|
+
const module = parts[0];
|
|
460
|
+
const rest = parts.slice(1).join('/');
|
|
461
|
+
const modulePath = path.join(mdanDir, 'modules', module, rest);
|
|
462
|
+
|
|
463
|
+
if (await fs.pathExists(modulePath)) {
|
|
464
|
+
paths.push(modulePath);
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
} else {
|
|
469
|
+
// Regular relative template path
|
|
470
|
+
const sourceDir = path.dirname(dep.from);
|
|
471
|
+
const templatePath = path.resolve(sourceDir, templateDep);
|
|
472
|
+
|
|
473
|
+
if (await fs.pathExists(templatePath)) {
|
|
474
|
+
paths.push(templatePath);
|
|
475
|
+
} else {
|
|
476
|
+
this.missingDependencies.add(`Template: ${dep.dependency}`);
|
|
477
|
+
}
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
break;
|
|
481
|
+
}
|
|
482
|
+
// No default
|
|
483
|
+
}
|
|
484
|
+
|
|
485
|
+
return paths;
|
|
486
|
+
}
|
|
487
|
+
|
|
488
|
+
/**
|
|
489
|
+
* Resolve command reference to file path
|
|
490
|
+
*/
|
|
491
|
+
async resolveCommandToPath(mdanDir, command) {
|
|
492
|
+
// Parse command format: @task-name or @agent-name or mdan/module/type/name
|
|
493
|
+
|
|
494
|
+
if (command.startsWith('@task-')) {
|
|
495
|
+
const taskName = command.slice(6);
|
|
496
|
+
// Search all modules for this task
|
|
497
|
+
for (const module of ['core', 'bmm', 'cis']) {
|
|
498
|
+
const taskPath =
|
|
499
|
+
module === 'core'
|
|
500
|
+
? path.join(mdanDir, 'core', 'tasks', `${taskName}.md`)
|
|
501
|
+
: path.join(mdanDir, 'modules', module, 'tasks', `${taskName}.md`);
|
|
502
|
+
if (await fs.pathExists(taskPath)) {
|
|
503
|
+
return taskPath;
|
|
504
|
+
}
|
|
505
|
+
}
|
|
506
|
+
} else if (command.startsWith('@agent-')) {
|
|
507
|
+
const agentName = command.slice(7);
|
|
508
|
+
// Search all modules for this agent
|
|
509
|
+
for (const module of ['core', 'bmm', 'cis']) {
|
|
510
|
+
const agentPath =
|
|
511
|
+
module === 'core'
|
|
512
|
+
? path.join(mdanDir, 'core', 'agents', `${agentName}.md`)
|
|
513
|
+
: path.join(mdanDir, 'modules', module, 'agents', `${agentName}.md`);
|
|
514
|
+
if (await fs.pathExists(agentPath)) {
|
|
515
|
+
return agentPath;
|
|
516
|
+
}
|
|
517
|
+
}
|
|
518
|
+
} else if (command.startsWith('mdan/')) {
|
|
519
|
+
// Direct path reference
|
|
520
|
+
const parts = command.split('/');
|
|
521
|
+
if (parts.length >= 4) {
|
|
522
|
+
const [, module, type, ...nameParts] = parts;
|
|
523
|
+
const name = nameParts.join('/'); // Handle nested paths
|
|
524
|
+
|
|
525
|
+
// Check if name already has extension
|
|
526
|
+
const fileName = name.endsWith('.md') ? name : `${name}.md`;
|
|
527
|
+
|
|
528
|
+
const filePath =
|
|
529
|
+
module === 'core' ? path.join(mdanDir, 'core', type, fileName) : path.join(mdanDir, 'modules', module, type, fileName);
|
|
530
|
+
if (await fs.pathExists(filePath)) {
|
|
531
|
+
return filePath;
|
|
532
|
+
}
|
|
533
|
+
}
|
|
534
|
+
}
|
|
535
|
+
|
|
536
|
+
// Don't report as missing if it's a self-reference within the module being installed
|
|
537
|
+
if (!command.includes('cis') || command.includes('brain')) {
|
|
538
|
+
// Only report missing if it's a true external dependency
|
|
539
|
+
// this.missingDependencies.add(`Command: ${command}`);
|
|
540
|
+
}
|
|
541
|
+
return null;
|
|
542
|
+
}
|
|
543
|
+
|
|
544
|
+
/**
|
|
545
|
+
* Resolve transitive dependencies (dependencies of dependencies)
|
|
546
|
+
*/
|
|
547
|
+
async resolveTransitiveDependencies(mdanDir, directDeps) {
|
|
548
|
+
const transitive = new Set();
|
|
549
|
+
const processed = new Set();
|
|
550
|
+
|
|
551
|
+
// Process each direct dependency
|
|
552
|
+
for (const depPath of directDeps) {
|
|
553
|
+
if (processed.has(depPath)) continue;
|
|
554
|
+
processed.add(depPath);
|
|
555
|
+
|
|
556
|
+
// Only process markdown and YAML files for transitive deps
|
|
557
|
+
if ((depPath.endsWith('.md') || depPath.endsWith('.yaml') || depPath.endsWith('.yml')) && (await fs.pathExists(depPath))) {
|
|
558
|
+
const content = await fs.readFile(depPath, 'utf8');
|
|
559
|
+
const subDeps = await this.parseDependencies([
|
|
560
|
+
{
|
|
561
|
+
path: depPath,
|
|
562
|
+
type: 'dependency',
|
|
563
|
+
module: this.getModuleFromPath(mdanDir, depPath),
|
|
564
|
+
name: path.basename(depPath),
|
|
565
|
+
},
|
|
566
|
+
]);
|
|
567
|
+
|
|
568
|
+
const resolvedSubDeps = await this.resolveDependencyPaths(mdanDir, subDeps);
|
|
569
|
+
for (const subDep of resolvedSubDeps) {
|
|
570
|
+
if (!directDeps.has(subDep)) {
|
|
571
|
+
transitive.add(subDep);
|
|
572
|
+
}
|
|
573
|
+
}
|
|
574
|
+
}
|
|
575
|
+
}
|
|
576
|
+
|
|
577
|
+
return transitive;
|
|
578
|
+
}
|
|
579
|
+
|
|
580
|
+
/**
|
|
581
|
+
* Get module name from file path
|
|
582
|
+
*/
|
|
583
|
+
getModuleFromPath(mdanDir, filePath) {
|
|
584
|
+
const relative = path.relative(mdanDir, filePath);
|
|
585
|
+
const parts = relative.split(path.sep);
|
|
586
|
+
|
|
587
|
+
// Handle source directory structure (src/core, src/bmm, or src/modules/xxx)
|
|
588
|
+
if (parts[0] === 'src') {
|
|
589
|
+
if (parts[1] === 'core') {
|
|
590
|
+
return 'core';
|
|
591
|
+
} else if (parts[1] === 'bmm') {
|
|
592
|
+
return 'bmm';
|
|
593
|
+
} else if (parts[1] === 'modules' && parts.length > 2) {
|
|
594
|
+
return parts[2];
|
|
595
|
+
}
|
|
596
|
+
}
|
|
597
|
+
|
|
598
|
+
// Check if it's in modules directory (installed structure)
|
|
599
|
+
if (parts[0] === 'modules' && parts.length > 1) {
|
|
600
|
+
return parts[1];
|
|
601
|
+
}
|
|
602
|
+
|
|
603
|
+
// Otherwise return the first part (core, etc.)
|
|
604
|
+
// But don't return 'src' as a module name
|
|
605
|
+
if (parts[0] === 'src') {
|
|
606
|
+
return 'unknown';
|
|
607
|
+
}
|
|
608
|
+
return parts[0] || 'unknown';
|
|
609
|
+
}
|
|
610
|
+
|
|
611
|
+
/**
|
|
612
|
+
* Organize files by module
|
|
613
|
+
*/
|
|
614
|
+
organizeByModule(mdanDir, files) {
|
|
615
|
+
const organized = {};
|
|
616
|
+
|
|
617
|
+
for (const file of files) {
|
|
618
|
+
const module = this.getModuleFromPath(mdanDir, file);
|
|
619
|
+
if (!organized[module]) {
|
|
620
|
+
organized[module] = {
|
|
621
|
+
agents: [],
|
|
622
|
+
tasks: [],
|
|
623
|
+
tools: [],
|
|
624
|
+
templates: [],
|
|
625
|
+
data: [],
|
|
626
|
+
other: [],
|
|
627
|
+
};
|
|
628
|
+
}
|
|
629
|
+
|
|
630
|
+
// Get relative path correctly based on module structure
|
|
631
|
+
let moduleBase;
|
|
632
|
+
|
|
633
|
+
// Check if file is in source directory structure
|
|
634
|
+
if (file.includes('/src/core/') || file.includes('/src/bmm/')) {
|
|
635
|
+
if (module === 'core') {
|
|
636
|
+
moduleBase = path.join(mdanDir, 'src', 'core');
|
|
637
|
+
} else if (module === 'bmm') {
|
|
638
|
+
moduleBase = path.join(mdanDir, 'src', 'bmm');
|
|
639
|
+
}
|
|
640
|
+
} else {
|
|
641
|
+
moduleBase = module === 'core' ? path.join(mdanDir, 'core') : path.join(mdanDir, 'modules', module);
|
|
642
|
+
}
|
|
643
|
+
|
|
644
|
+
const relative = path.relative(moduleBase, file);
|
|
645
|
+
|
|
646
|
+
if (relative.startsWith('agents/') || file.includes('/agents/')) {
|
|
647
|
+
organized[module].agents.push(file);
|
|
648
|
+
} else if (relative.startsWith('tasks/') || file.includes('/tasks/')) {
|
|
649
|
+
organized[module].tasks.push(file);
|
|
650
|
+
} else if (relative.startsWith('tools/') || file.includes('/tools/')) {
|
|
651
|
+
organized[module].tools.push(file);
|
|
652
|
+
} else if (relative.includes('data/')) {
|
|
653
|
+
organized[module].data.push(file);
|
|
654
|
+
} else {
|
|
655
|
+
organized[module].other.push(file);
|
|
656
|
+
}
|
|
657
|
+
}
|
|
658
|
+
|
|
659
|
+
return organized;
|
|
660
|
+
}
|
|
661
|
+
|
|
662
|
+
/**
|
|
663
|
+
* Report resolution results
|
|
664
|
+
*/
|
|
665
|
+
async reportResults(organized, selectedModules) {
|
|
666
|
+
await prompts.log.success('Dependency resolution complete');
|
|
667
|
+
|
|
668
|
+
for (const [module, files] of Object.entries(organized)) {
|
|
669
|
+
const isSelected = selectedModules.includes(module) || module === 'core';
|
|
670
|
+
const totalFiles =
|
|
671
|
+
files.agents.length + files.tasks.length + files.tools.length + files.templates.length + files.data.length + files.other.length;
|
|
672
|
+
|
|
673
|
+
if (totalFiles > 0) {
|
|
674
|
+
await prompts.log.info(` ${module.toUpperCase()} module:`);
|
|
675
|
+
await prompts.log.message(` Status: ${isSelected ? 'Selected' : 'Dependencies only'}`);
|
|
676
|
+
|
|
677
|
+
if (files.agents.length > 0) {
|
|
678
|
+
await prompts.log.message(` Agents: ${files.agents.length}`);
|
|
679
|
+
}
|
|
680
|
+
if (files.tasks.length > 0) {
|
|
681
|
+
await prompts.log.message(` Tasks: ${files.tasks.length}`);
|
|
682
|
+
}
|
|
683
|
+
if (files.templates.length > 0) {
|
|
684
|
+
await prompts.log.message(` Templates: ${files.templates.length}`);
|
|
685
|
+
}
|
|
686
|
+
if (files.data.length > 0) {
|
|
687
|
+
await prompts.log.message(` Data files: ${files.data.length}`);
|
|
688
|
+
}
|
|
689
|
+
if (files.other.length > 0) {
|
|
690
|
+
await prompts.log.message(` Other files: ${files.other.length}`);
|
|
691
|
+
}
|
|
692
|
+
}
|
|
693
|
+
}
|
|
694
|
+
|
|
695
|
+
if (this.missingDependencies.size > 0) {
|
|
696
|
+
await prompts.log.warn('Missing dependencies:');
|
|
697
|
+
for (const missing of this.missingDependencies) {
|
|
698
|
+
await prompts.log.warn(` - ${missing}`);
|
|
699
|
+
}
|
|
700
|
+
}
|
|
701
|
+
}
|
|
702
|
+
|
|
703
|
+
/**
|
|
704
|
+
* Create a bundle for web deployment
|
|
705
|
+
* @param {Object} resolution - Resolution results from resolve()
|
|
706
|
+
* @returns {Object} Bundle data ready for web
|
|
707
|
+
*/
|
|
708
|
+
async createWebBundle(resolution) {
|
|
709
|
+
const bundle = {
|
|
710
|
+
metadata: {
|
|
711
|
+
created: new Date().toISOString(),
|
|
712
|
+
modules: Object.keys(resolution.byModule),
|
|
713
|
+
totalFiles: resolution.allFiles.length,
|
|
714
|
+
},
|
|
715
|
+
agents: {},
|
|
716
|
+
tasks: {},
|
|
717
|
+
templates: {},
|
|
718
|
+
data: {},
|
|
719
|
+
};
|
|
720
|
+
|
|
721
|
+
// Bundle all files by type
|
|
722
|
+
for (const filePath of resolution.allFiles) {
|
|
723
|
+
if (!(await fs.pathExists(filePath))) continue;
|
|
724
|
+
|
|
725
|
+
const content = await fs.readFile(filePath, 'utf8');
|
|
726
|
+
const relative = path.relative(path.dirname(resolution.primaryFiles[0]?.path || '.'), filePath);
|
|
727
|
+
|
|
728
|
+
if (filePath.includes('/agents/')) {
|
|
729
|
+
bundle.agents[relative] = content;
|
|
730
|
+
} else if (filePath.includes('/tasks/')) {
|
|
731
|
+
bundle.tasks[relative] = content;
|
|
732
|
+
} else if (filePath.includes('template')) {
|
|
733
|
+
bundle.templates[relative] = content;
|
|
734
|
+
} else {
|
|
735
|
+
bundle.data[relative] = content;
|
|
736
|
+
}
|
|
737
|
+
}
|
|
738
|
+
|
|
739
|
+
return bundle;
|
|
740
|
+
}
|
|
741
|
+
}
|
|
742
|
+
|
|
743
|
+
module.exports = { DependencyResolver };
|