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,152 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Template Engine for MDAN Agent Install Configuration
|
|
3
|
+
* Processes {{variable}}, {{#if}}, {{#unless}}, and {{/if}} blocks
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Process all template syntax in a string
|
|
8
|
+
* @param {string} content - Content with template syntax
|
|
9
|
+
* @param {Object} variables - Key-value pairs from install_config answers
|
|
10
|
+
* @returns {string} Processed content
|
|
11
|
+
*/
|
|
12
|
+
function processTemplate(content, variables = {}) {
|
|
13
|
+
let result = content;
|
|
14
|
+
|
|
15
|
+
// Process conditionals first (they may contain variables)
|
|
16
|
+
result = processConditionals(result, variables);
|
|
17
|
+
|
|
18
|
+
// Then process simple variable replacements
|
|
19
|
+
result = processVariables(result, variables);
|
|
20
|
+
|
|
21
|
+
// Clean up any empty lines left by removed conditionals
|
|
22
|
+
result = cleanupEmptyLines(result);
|
|
23
|
+
|
|
24
|
+
return result;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Process {{#if}}, {{#unless}}, {{/if}}, {{/unless}} blocks
|
|
29
|
+
*/
|
|
30
|
+
function processConditionals(content, variables) {
|
|
31
|
+
let result = content;
|
|
32
|
+
|
|
33
|
+
// Process {{#if variable == "value"}} blocks
|
|
34
|
+
// Handle both regular quotes and JSON-escaped quotes (\")
|
|
35
|
+
const ifEqualsPattern = /\{\{#if\s+(\w+)\s*==\s*\\?"([^"\\]+)\\?"\s*\}\}([\s\S]*?)\{\{\/if\}\}/g;
|
|
36
|
+
result = result.replaceAll(ifEqualsPattern, (match, varName, value, block) => {
|
|
37
|
+
return variables[varName] === value ? block : '';
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
// Process {{#if variable}} blocks (boolean or truthy check)
|
|
41
|
+
const ifBoolPattern = /\{\{#if\s+(\w+)\s*\}\}([\s\S]*?)\{\{\/if\}\}/g;
|
|
42
|
+
result = result.replaceAll(ifBoolPattern, (match, varName, block) => {
|
|
43
|
+
const val = variables[varName];
|
|
44
|
+
// Treat as truthy: true, non-empty string, non-zero number
|
|
45
|
+
const isTruthy = val === true || (typeof val === 'string' && val.length > 0) || (typeof val === 'number' && val !== 0);
|
|
46
|
+
return isTruthy ? block : '';
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
// Process {{#unless variable}} blocks (inverse of if)
|
|
50
|
+
const unlessPattern = /\{\{#unless\s+(\w+)\s*\}\}([\s\S]*?)\{\{\/unless\}\}/g;
|
|
51
|
+
result = result.replaceAll(unlessPattern, (match, varName, block) => {
|
|
52
|
+
const val = variables[varName];
|
|
53
|
+
const isFalsy = val === false || val === '' || val === null || val === undefined || val === 0;
|
|
54
|
+
return isFalsy ? block : '';
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
return result;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Process {{variable}} replacements
|
|
62
|
+
*/
|
|
63
|
+
function processVariables(content, variables) {
|
|
64
|
+
let result = content;
|
|
65
|
+
|
|
66
|
+
// Replace {{variable}} with value
|
|
67
|
+
const varPattern = /\{\{(\w+)\}\}/g;
|
|
68
|
+
result = result.replaceAll(varPattern, (match, varName) => {
|
|
69
|
+
if (Object.hasOwn(variables, varName)) {
|
|
70
|
+
return String(variables[varName]);
|
|
71
|
+
}
|
|
72
|
+
// If variable not found, leave as-is (might be runtime variable like {user_name})
|
|
73
|
+
return match;
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
return result;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Clean up excessive empty lines left after removing conditional blocks
|
|
81
|
+
*/
|
|
82
|
+
function cleanupEmptyLines(content) {
|
|
83
|
+
// Replace 3+ consecutive newlines with 2
|
|
84
|
+
return content.replaceAll(/\n{3,}/g, '\n\n');
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Extract install_config from agent YAML object
|
|
89
|
+
* @param {Object} agentYaml - Parsed agent YAML
|
|
90
|
+
* @returns {Object|null} install_config section or null
|
|
91
|
+
*/
|
|
92
|
+
function extractInstallConfig(agentYaml) {
|
|
93
|
+
return agentYaml?.agent?.install_config || null;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Remove install_config from agent YAML (after processing)
|
|
98
|
+
* @param {Object} agentYaml - Parsed agent YAML
|
|
99
|
+
* @returns {Object} Agent YAML without install_config
|
|
100
|
+
*/
|
|
101
|
+
function stripInstallConfig(agentYaml) {
|
|
102
|
+
const result = structuredClone(agentYaml);
|
|
103
|
+
if (result.agent) {
|
|
104
|
+
delete result.agent.install_config;
|
|
105
|
+
}
|
|
106
|
+
return result;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Process entire agent YAML object with template variables
|
|
111
|
+
* @param {Object} agentYaml - Parsed agent YAML
|
|
112
|
+
* @param {Object} variables - Answers from install_config questions
|
|
113
|
+
* @returns {Object} Processed agent YAML
|
|
114
|
+
*/
|
|
115
|
+
function processAgentYaml(agentYaml, variables) {
|
|
116
|
+
// Convert to JSON string, process templates, parse back
|
|
117
|
+
const jsonString = JSON.stringify(agentYaml, null, 2);
|
|
118
|
+
const processed = processTemplate(jsonString, variables);
|
|
119
|
+
return JSON.parse(processed);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* Get default values from install_config questions
|
|
124
|
+
* @param {Object} installConfig - install_config section
|
|
125
|
+
* @returns {Object} Default values keyed by variable name
|
|
126
|
+
*/
|
|
127
|
+
function getDefaultValues(installConfig) {
|
|
128
|
+
const defaults = {};
|
|
129
|
+
|
|
130
|
+
if (!installConfig?.questions) {
|
|
131
|
+
return defaults;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
for (const question of installConfig.questions) {
|
|
135
|
+
if (question.var && question.default !== undefined) {
|
|
136
|
+
defaults[question.var] = question.default;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
return defaults;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
module.exports = {
|
|
144
|
+
processTemplate,
|
|
145
|
+
processConditionals,
|
|
146
|
+
processVariables,
|
|
147
|
+
extractInstallConfig,
|
|
148
|
+
stripInstallConfig,
|
|
149
|
+
processAgentYaml,
|
|
150
|
+
getDefaultValues,
|
|
151
|
+
cleanupEmptyLines,
|
|
152
|
+
};
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
const yaml = require('yaml');
|
|
2
|
+
const fs = require('fs-extra');
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Analyzes agent YAML files to detect which handlers are needed
|
|
6
|
+
*/
|
|
7
|
+
class AgentAnalyzer {
|
|
8
|
+
/**
|
|
9
|
+
* Analyze an agent YAML structure to determine which handlers it needs
|
|
10
|
+
* @param {Object} agentYaml - Parsed agent YAML object
|
|
11
|
+
* @returns {Object} Profile of needed handlers
|
|
12
|
+
*/
|
|
13
|
+
analyzeAgentObject(agentYaml) {
|
|
14
|
+
const profile = {
|
|
15
|
+
usedAttributes: new Set(),
|
|
16
|
+
hasPrompts: false,
|
|
17
|
+
menuItems: [],
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
// Check if agent has prompts section
|
|
21
|
+
if (agentYaml.agent && agentYaml.agent.prompts) {
|
|
22
|
+
profile.hasPrompts = true;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
// Analyze menu items (support both 'menu' and legacy 'commands')
|
|
26
|
+
const menuItems = agentYaml.agent?.menu || agentYaml.agent?.commands || [];
|
|
27
|
+
|
|
28
|
+
for (const item of menuItems) {
|
|
29
|
+
// Track the menu item
|
|
30
|
+
profile.menuItems.push(item);
|
|
31
|
+
|
|
32
|
+
// Check for multi format items
|
|
33
|
+
if (item.multi && item.triggers) {
|
|
34
|
+
profile.usedAttributes.add('multi');
|
|
35
|
+
|
|
36
|
+
// Also check attributes in nested handlers
|
|
37
|
+
for (const triggerGroup of item.triggers) {
|
|
38
|
+
for (const [triggerName, execArray] of Object.entries(triggerGroup)) {
|
|
39
|
+
if (Array.isArray(execArray)) {
|
|
40
|
+
for (const exec of execArray) {
|
|
41
|
+
if (exec.route) {
|
|
42
|
+
// Check if route is a workflow or exec
|
|
43
|
+
if (exec.route.endsWith('.yaml') || exec.route.endsWith('.yml')) {
|
|
44
|
+
profile.usedAttributes.add('workflow');
|
|
45
|
+
} else {
|
|
46
|
+
profile.usedAttributes.add('exec');
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
if (exec.workflow) profile.usedAttributes.add('workflow');
|
|
50
|
+
if (exec.action) profile.usedAttributes.add('action');
|
|
51
|
+
if (exec.type && ['exec', 'action', 'workflow'].includes(exec.type)) {
|
|
52
|
+
profile.usedAttributes.add(exec.type);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
} else {
|
|
59
|
+
// Check for each possible attribute in legacy items
|
|
60
|
+
if (item.workflow) {
|
|
61
|
+
profile.usedAttributes.add('workflow');
|
|
62
|
+
}
|
|
63
|
+
if (item['validate-workflow']) {
|
|
64
|
+
profile.usedAttributes.add('validate-workflow');
|
|
65
|
+
}
|
|
66
|
+
if (item.exec) {
|
|
67
|
+
profile.usedAttributes.add('exec');
|
|
68
|
+
}
|
|
69
|
+
if (item.tmpl) {
|
|
70
|
+
profile.usedAttributes.add('tmpl');
|
|
71
|
+
}
|
|
72
|
+
if (item.data) {
|
|
73
|
+
profile.usedAttributes.add('data');
|
|
74
|
+
}
|
|
75
|
+
if (item.action) {
|
|
76
|
+
profile.usedAttributes.add('action');
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// Convert Set to Array for easier use
|
|
82
|
+
profile.usedAttributes = [...profile.usedAttributes];
|
|
83
|
+
|
|
84
|
+
return profile;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Analyze an agent YAML file
|
|
89
|
+
* @param {string} filePath - Path to agent YAML file
|
|
90
|
+
* @returns {Object} Profile of needed handlers
|
|
91
|
+
*/
|
|
92
|
+
async analyzeAgentFile(filePath) {
|
|
93
|
+
const content = await fs.readFile(filePath, 'utf8');
|
|
94
|
+
const agentYaml = yaml.parse(content);
|
|
95
|
+
return this.analyzeAgentObject(agentYaml);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Check if an agent needs a specific handler
|
|
100
|
+
* @param {Object} profile - Agent profile from analyze
|
|
101
|
+
* @param {string} handlerType - Handler type to check
|
|
102
|
+
* @returns {boolean} True if handler is needed
|
|
103
|
+
*/
|
|
104
|
+
needsHandler(profile, handlerType) {
|
|
105
|
+
return profile.usedAttributes.includes(handlerType);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
module.exports = { AgentAnalyzer };
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
const path = require('node:path');
|
|
2
|
+
const fs = require('fs-extra');
|
|
3
|
+
const { escapeXml } = require('../../lib/xml-utils');
|
|
4
|
+
|
|
5
|
+
const AgentPartyGenerator = {
|
|
6
|
+
/**
|
|
7
|
+
* Generate agent-manifest.csv content
|
|
8
|
+
* @param {Array} agentDetails - Array of agent details
|
|
9
|
+
* @param {Object} options - Generation options
|
|
10
|
+
* @returns {string} XML content
|
|
11
|
+
*/
|
|
12
|
+
generateAgentParty(agentDetails, options = {}) {
|
|
13
|
+
const { forWeb = false } = options;
|
|
14
|
+
|
|
15
|
+
// Group agents by module
|
|
16
|
+
const agentsByModule = {
|
|
17
|
+
bmm: [],
|
|
18
|
+
cis: [],
|
|
19
|
+
core: [],
|
|
20
|
+
custom: [],
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
for (const agent of agentDetails) {
|
|
24
|
+
const moduleKey = agentsByModule[agent.module] ? agent.module : 'custom';
|
|
25
|
+
agentsByModule[moduleKey].push(agent);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// Build XML content
|
|
29
|
+
let xmlContent = `<!-- Powered by MDAN-CORE™ -->
|
|
30
|
+
<!-- Agent Manifest - Generated during MDAN ${forWeb ? 'bundling' : 'installation'} -->
|
|
31
|
+
<!-- This file contains a summary of all ${forWeb ? 'bundled' : 'installed'} agents for quick reference -->
|
|
32
|
+
<manifest id="mdan/_config/agent-manifest.csv" version="1.0" generated="${new Date().toISOString()}">
|
|
33
|
+
<description>
|
|
34
|
+
Complete roster of ${forWeb ? 'bundled' : 'installed'} MDAN agents with summarized personas for efficient multi-agent orchestration.
|
|
35
|
+
Used by party-mode and other multi-agent coordination features.
|
|
36
|
+
</description>
|
|
37
|
+
`;
|
|
38
|
+
|
|
39
|
+
// Add agents by module
|
|
40
|
+
for (const [module, agents] of Object.entries(agentsByModule)) {
|
|
41
|
+
if (agents.length === 0) continue;
|
|
42
|
+
|
|
43
|
+
const moduleTitle =
|
|
44
|
+
module === 'bmm' ? 'BMM Module' : module === 'cis' ? 'CIS Module' : module === 'core' ? 'Core Module' : 'Custom Module';
|
|
45
|
+
|
|
46
|
+
xmlContent += `\n <!-- ${moduleTitle} Agents -->\n`;
|
|
47
|
+
|
|
48
|
+
for (const agent of agents) {
|
|
49
|
+
xmlContent += ` <agent id="${agent.id}" name="${agent.name}" title="${agent.title || ''}" icon="${agent.icon || ''}">
|
|
50
|
+
<persona>
|
|
51
|
+
<role>${escapeXml(agent.role || '')}</role>
|
|
52
|
+
<identity>${escapeXml(agent.identity || '')}</identity>
|
|
53
|
+
<communication_style>${escapeXml(agent.communicationStyle || '')}</communication_style>
|
|
54
|
+
<principles>${agent.principles || ''}</principles>
|
|
55
|
+
</persona>
|
|
56
|
+
</agent>\n`;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// Add statistics
|
|
61
|
+
const totalAgents = agentDetails.length;
|
|
62
|
+
const moduleList = Object.keys(agentsByModule)
|
|
63
|
+
.filter((m) => agentsByModule[m].length > 0)
|
|
64
|
+
.join(', ');
|
|
65
|
+
|
|
66
|
+
xmlContent += `\n <statistics>
|
|
67
|
+
<total_agents>${totalAgents}</total_agents>
|
|
68
|
+
<modules>${moduleList}</modules>
|
|
69
|
+
<last_updated>${new Date().toISOString()}</last_updated>
|
|
70
|
+
</statistics>
|
|
71
|
+
</manifest>`;
|
|
72
|
+
|
|
73
|
+
return xmlContent;
|
|
74
|
+
},
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Extract agent details from XML content
|
|
78
|
+
* @param {string} content - Full agent file content (markdown with XML)
|
|
79
|
+
* @param {string} moduleName - Module name
|
|
80
|
+
* @param {string} agentName - Agent name
|
|
81
|
+
* @returns {Object} Agent details
|
|
82
|
+
*/
|
|
83
|
+
extractAgentDetails(content, moduleName, agentName) {
|
|
84
|
+
try {
|
|
85
|
+
// Extract agent XML block
|
|
86
|
+
const agentMatch = content.match(/<agent[^>]*>([\s\S]*?)<\/agent>/);
|
|
87
|
+
if (!agentMatch) return null;
|
|
88
|
+
|
|
89
|
+
const agentXml = agentMatch[0];
|
|
90
|
+
|
|
91
|
+
// Extract attributes from opening tag
|
|
92
|
+
const nameMatch = agentXml.match(/name="([^"]*)"/);
|
|
93
|
+
const titleMatch = agentXml.match(/title="([^"]*)"/);
|
|
94
|
+
const iconMatch = agentXml.match(/icon="([^"]*)"/);
|
|
95
|
+
|
|
96
|
+
// Extract persona elements - now we just copy them as-is
|
|
97
|
+
const roleMatch = agentXml.match(/<role>([\s\S]*?)<\/role>/);
|
|
98
|
+
const identityMatch = agentXml.match(/<identity>([\s\S]*?)<\/identity>/);
|
|
99
|
+
const styleMatch = agentXml.match(/<communication_style>([\s\S]*?)<\/communication_style>/);
|
|
100
|
+
const principlesMatch = agentXml.match(/<principles>([\s\S]*?)<\/principles>/);
|
|
101
|
+
|
|
102
|
+
return {
|
|
103
|
+
id: `mdan/${moduleName}/agents/${agentName}.md`,
|
|
104
|
+
name: nameMatch ? nameMatch[1] : agentName,
|
|
105
|
+
title: titleMatch ? titleMatch[1] : 'Agent',
|
|
106
|
+
icon: iconMatch ? iconMatch[1] : '🤖',
|
|
107
|
+
module: moduleName,
|
|
108
|
+
role: roleMatch ? roleMatch[1].trim() : '',
|
|
109
|
+
identity: identityMatch ? identityMatch[1].trim() : '',
|
|
110
|
+
communicationStyle: styleMatch ? styleMatch[1].trim() : '',
|
|
111
|
+
principles: principlesMatch ? principlesMatch[1].trim() : '',
|
|
112
|
+
};
|
|
113
|
+
} catch (error) {
|
|
114
|
+
console.error(`Error extracting details for agent ${agentName}:`, error);
|
|
115
|
+
return null;
|
|
116
|
+
}
|
|
117
|
+
},
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Extract attribute from XML tag
|
|
121
|
+
*/
|
|
122
|
+
extractAttribute(xml, tagName, attrName) {
|
|
123
|
+
const regex = new RegExp(`<${tagName}[^>]*\\s${attrName}="([^"]*)"`, 'i');
|
|
124
|
+
const match = xml.match(regex);
|
|
125
|
+
return match ? match[1] : '';
|
|
126
|
+
},
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Apply config overrides to agent details
|
|
130
|
+
* @param {Object} details - Original agent details
|
|
131
|
+
* @param {string} configContent - Config file content
|
|
132
|
+
* @returns {Object} Agent details with overrides applied
|
|
133
|
+
*/
|
|
134
|
+
applyConfigOverrides(details, configContent) {
|
|
135
|
+
try {
|
|
136
|
+
// Extract agent-config XML block
|
|
137
|
+
const configMatch = configContent.match(/<agent-config>([\s\S]*?)<\/agent-config>/);
|
|
138
|
+
if (!configMatch) return details;
|
|
139
|
+
|
|
140
|
+
const configXml = configMatch[0];
|
|
141
|
+
|
|
142
|
+
// Extract override values
|
|
143
|
+
const nameMatch = configXml.match(/<name>([\s\S]*?)<\/name>/);
|
|
144
|
+
const titleMatch = configXml.match(/<title>([\s\S]*?)<\/title>/);
|
|
145
|
+
const roleMatch = configXml.match(/<role>([\s\S]*?)<\/role>/);
|
|
146
|
+
const identityMatch = configXml.match(/<identity>([\s\S]*?)<\/identity>/);
|
|
147
|
+
const styleMatch = configXml.match(/<communication_style>([\s\S]*?)<\/communication_style>/);
|
|
148
|
+
const principlesMatch = configXml.match(/<principles>([\s\S]*?)<\/principles>/);
|
|
149
|
+
|
|
150
|
+
// Apply overrides only if values are non-empty
|
|
151
|
+
if (nameMatch && nameMatch[1].trim()) {
|
|
152
|
+
details.name = nameMatch[1].trim();
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
if (titleMatch && titleMatch[1].trim()) {
|
|
156
|
+
details.title = titleMatch[1].trim();
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
if (roleMatch && roleMatch[1].trim()) {
|
|
160
|
+
details.role = roleMatch[1].trim();
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
if (identityMatch && identityMatch[1].trim()) {
|
|
164
|
+
details.identity = identityMatch[1].trim();
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
if (styleMatch && styleMatch[1].trim()) {
|
|
168
|
+
details.communicationStyle = styleMatch[1].trim();
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
if (principlesMatch && principlesMatch[1].trim()) {
|
|
172
|
+
// Principles are now just copied as-is (narrative paragraph)
|
|
173
|
+
details.principles = principlesMatch[1].trim();
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
return details;
|
|
177
|
+
} catch (error) {
|
|
178
|
+
console.error(`Error applying config overrides:`, error);
|
|
179
|
+
return details;
|
|
180
|
+
}
|
|
181
|
+
},
|
|
182
|
+
|
|
183
|
+
/**
|
|
184
|
+
* Write agent-manifest.csv to file
|
|
185
|
+
*/
|
|
186
|
+
async writeAgentParty(filePath, agentDetails, options = {}) {
|
|
187
|
+
const content = this.generateAgentParty(agentDetails, options);
|
|
188
|
+
await fs.ensureDir(path.dirname(filePath));
|
|
189
|
+
await fs.writeFile(filePath, content, 'utf8');
|
|
190
|
+
return content;
|
|
191
|
+
},
|
|
192
|
+
};
|
|
193
|
+
|
|
194
|
+
module.exports = { AgentPartyGenerator };
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
const path = require('node:path');
|
|
2
|
+
const os = require('node:os');
|
|
3
|
+
const prompts = require('./prompts');
|
|
4
|
+
|
|
5
|
+
const CLIUtils = {
|
|
6
|
+
/**
|
|
7
|
+
* Get version from package.json
|
|
8
|
+
*/
|
|
9
|
+
getVersion() {
|
|
10
|
+
try {
|
|
11
|
+
const packageJson = require(path.join(__dirname, '..', '..', '..', 'package.json'));
|
|
12
|
+
return packageJson.version || 'Unknown';
|
|
13
|
+
} catch {
|
|
14
|
+
return 'Unknown';
|
|
15
|
+
}
|
|
16
|
+
},
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Display MDAN logo using @clack intro + box
|
|
20
|
+
* @param {boolean} _clearScreen - Deprecated, ignored (no longer clears screen)
|
|
21
|
+
*/
|
|
22
|
+
async displayLogo(_clearScreen = true) {
|
|
23
|
+
const version = this.getVersion();
|
|
24
|
+
const color = await prompts.getColor();
|
|
25
|
+
|
|
26
|
+
// ASCII art logo
|
|
27
|
+
const logo = [
|
|
28
|
+
' ██████╗ ███╗ ███╗ █████╗ ██████╗ ™',
|
|
29
|
+
' ██╔══██╗████╗ ████║██╔══██╗██╔══██╗',
|
|
30
|
+
' ██████╔╝██╔████╔██║███████║██║ ██║',
|
|
31
|
+
' ██╔══██╗██║╚██╔╝██║██╔══██║██║ ██║',
|
|
32
|
+
' ██████╔╝██║ ╚═╝ ██║██║ ██║██████╔╝',
|
|
33
|
+
' ╚═════╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚═════╝',
|
|
34
|
+
]
|
|
35
|
+
.map((line) => color.yellow(line))
|
|
36
|
+
.join('\n');
|
|
37
|
+
|
|
38
|
+
const tagline = ' Build More, Architect Dreams';
|
|
39
|
+
|
|
40
|
+
await prompts.box(`${logo}\n${tagline}`, `v${version}`, {
|
|
41
|
+
contentAlign: 'center',
|
|
42
|
+
rounded: true,
|
|
43
|
+
formatBorder: color.blue,
|
|
44
|
+
});
|
|
45
|
+
},
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Display section header
|
|
49
|
+
* @param {string} title - Section title
|
|
50
|
+
* @param {string} subtitle - Optional subtitle
|
|
51
|
+
*/
|
|
52
|
+
async displaySection(title, subtitle = null) {
|
|
53
|
+
await prompts.note(subtitle || '', title);
|
|
54
|
+
},
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Display info box
|
|
58
|
+
* @param {string|Array} content - Content to display
|
|
59
|
+
* @param {Object} options - Box options
|
|
60
|
+
*/
|
|
61
|
+
async displayBox(content, options = {}) {
|
|
62
|
+
let text = content;
|
|
63
|
+
if (Array.isArray(content)) {
|
|
64
|
+
text = content.join('\n\n');
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
const color = await prompts.getColor();
|
|
68
|
+
const borderColor = options.borderColor || 'cyan';
|
|
69
|
+
const colorMap = { green: color.green, red: color.red, yellow: color.yellow, cyan: color.cyan, blue: color.blue };
|
|
70
|
+
const formatBorder = colorMap[borderColor] || color.cyan;
|
|
71
|
+
|
|
72
|
+
await prompts.box(text, options.title, {
|
|
73
|
+
rounded: options.borderStyle === 'round' || options.borderStyle === undefined,
|
|
74
|
+
formatBorder,
|
|
75
|
+
});
|
|
76
|
+
},
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Display module configuration header
|
|
80
|
+
* @param {string} moduleName - Module name (fallback if no custom header)
|
|
81
|
+
* @param {string} header - Custom header from module.yaml
|
|
82
|
+
* @param {string} subheader - Custom subheader from module.yaml
|
|
83
|
+
*/
|
|
84
|
+
async displayModuleConfigHeader(moduleName, header = null, subheader = null) {
|
|
85
|
+
const title = header || `Configuring ${moduleName.toUpperCase()} Module`;
|
|
86
|
+
await prompts.note(subheader || '', title);
|
|
87
|
+
},
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Display module with no custom configuration
|
|
91
|
+
* @param {string} moduleName - Module name (fallback if no custom header)
|
|
92
|
+
* @param {string} header - Custom header from module.yaml
|
|
93
|
+
* @param {string} subheader - Custom subheader from module.yaml
|
|
94
|
+
*/
|
|
95
|
+
async displayModuleNoConfig(moduleName, header = null, subheader = null) {
|
|
96
|
+
const title = header || `${moduleName.toUpperCase()} Module - No Custom Configuration`;
|
|
97
|
+
await prompts.note(subheader || '', title);
|
|
98
|
+
},
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* Display step indicator
|
|
102
|
+
* @param {number} current - Current step
|
|
103
|
+
* @param {number} total - Total steps
|
|
104
|
+
* @param {string} description - Step description
|
|
105
|
+
*/
|
|
106
|
+
async displayStep(current, total, description) {
|
|
107
|
+
const progress = `[${current}/${total}]`;
|
|
108
|
+
await prompts.log.step(`${progress} ${description}`);
|
|
109
|
+
},
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* Display completion message
|
|
113
|
+
* @param {string} message - Completion message
|
|
114
|
+
*/
|
|
115
|
+
async displayComplete(message) {
|
|
116
|
+
const color = await prompts.getColor();
|
|
117
|
+
await prompts.box(`\u2728 ${message}`, 'Complete', {
|
|
118
|
+
rounded: true,
|
|
119
|
+
formatBorder: color.green,
|
|
120
|
+
});
|
|
121
|
+
},
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* Display error message
|
|
125
|
+
* @param {string} message - Error message
|
|
126
|
+
*/
|
|
127
|
+
async displayError(message) {
|
|
128
|
+
const color = await prompts.getColor();
|
|
129
|
+
await prompts.box(`\u2717 ${message}`, 'Error', {
|
|
130
|
+
rounded: true,
|
|
131
|
+
formatBorder: color.red,
|
|
132
|
+
});
|
|
133
|
+
},
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* Format list for display
|
|
137
|
+
* @param {Array} items - Items to display
|
|
138
|
+
* @param {string} prefix - Item prefix
|
|
139
|
+
*/
|
|
140
|
+
formatList(items, prefix = '\u2022') {
|
|
141
|
+
return items.map((item) => ` ${prefix} ${item}`).join('\n');
|
|
142
|
+
},
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* Clear previous lines
|
|
146
|
+
* @param {number} lines - Number of lines to clear
|
|
147
|
+
*/
|
|
148
|
+
clearLines(lines) {
|
|
149
|
+
for (let i = 0; i < lines; i++) {
|
|
150
|
+
process.stdout.moveCursor(0, -1);
|
|
151
|
+
process.stdout.clearLine(1);
|
|
152
|
+
}
|
|
153
|
+
},
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* Display module completion message
|
|
157
|
+
* @param {string} moduleName - Name of the completed module
|
|
158
|
+
* @param {boolean} clearScreen - Whether to clear the screen first (deprecated, always false now)
|
|
159
|
+
*/
|
|
160
|
+
displayModuleComplete(moduleName, clearScreen = false) {
|
|
161
|
+
// No longer clear screen or show boxes - just a simple completion message
|
|
162
|
+
// This is deprecated but kept for backwards compatibility
|
|
163
|
+
},
|
|
164
|
+
|
|
165
|
+
/**
|
|
166
|
+
* Expand path with ~ expansion
|
|
167
|
+
* @param {string} inputPath - Path to expand
|
|
168
|
+
* @returns {string} Expanded path
|
|
169
|
+
*/
|
|
170
|
+
expandPath(inputPath) {
|
|
171
|
+
if (!inputPath) return inputPath;
|
|
172
|
+
|
|
173
|
+
// Expand ~ to home directory
|
|
174
|
+
if (inputPath.startsWith('~')) {
|
|
175
|
+
return path.join(os.homedir(), inputPath.slice(1));
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
return inputPath;
|
|
179
|
+
},
|
|
180
|
+
};
|
|
181
|
+
|
|
182
|
+
module.exports = { CLIUtils };
|