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,587 @@
|
|
|
1
|
+
const yaml = require('yaml');
|
|
2
|
+
const fs = require('fs-extra');
|
|
3
|
+
const path = require('node:path');
|
|
4
|
+
const crypto = require('node:crypto');
|
|
5
|
+
const { AgentAnalyzer } = require('./agent-analyzer');
|
|
6
|
+
const { ActivationBuilder } = require('./activation-builder');
|
|
7
|
+
const { escapeXml } = require('../../lib/xml-utils');
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Converts agent YAML files to XML format with smart activation injection
|
|
11
|
+
*/
|
|
12
|
+
class YamlXmlBuilder {
|
|
13
|
+
constructor() {
|
|
14
|
+
this.analyzer = new AgentAnalyzer();
|
|
15
|
+
this.activationBuilder = new ActivationBuilder();
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Deep merge two objects (for customize.yaml + agent.yaml)
|
|
20
|
+
* @param {Object} target - Target object
|
|
21
|
+
* @param {Object} source - Source object to merge in
|
|
22
|
+
* @returns {Object} Merged object
|
|
23
|
+
*/
|
|
24
|
+
deepMerge(target, source) {
|
|
25
|
+
const output = { ...target };
|
|
26
|
+
|
|
27
|
+
if (this.isObject(target) && this.isObject(source)) {
|
|
28
|
+
for (const key of Object.keys(source)) {
|
|
29
|
+
if (this.isObject(source[key])) {
|
|
30
|
+
if (key in target) {
|
|
31
|
+
output[key] = this.deepMerge(target[key], source[key]);
|
|
32
|
+
} else {
|
|
33
|
+
output[key] = source[key];
|
|
34
|
+
}
|
|
35
|
+
} else if (Array.isArray(source[key])) {
|
|
36
|
+
// For arrays, append rather than replace (for commands)
|
|
37
|
+
if (Array.isArray(target[key])) {
|
|
38
|
+
output[key] = [...target[key], ...source[key]];
|
|
39
|
+
} else {
|
|
40
|
+
output[key] = source[key];
|
|
41
|
+
}
|
|
42
|
+
} else {
|
|
43
|
+
output[key] = source[key];
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
return output;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Check if value is an object
|
|
53
|
+
*/
|
|
54
|
+
isObject(item) {
|
|
55
|
+
return item && typeof item === 'object' && !Array.isArray(item);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Load and merge agent YAML with customization
|
|
60
|
+
* @param {string} agentYamlPath - Path to base agent YAML
|
|
61
|
+
* @param {string} customizeYamlPath - Path to customize YAML (optional)
|
|
62
|
+
* @returns {Object} Merged agent configuration
|
|
63
|
+
*/
|
|
64
|
+
async loadAndMergeAgent(agentYamlPath, customizeYamlPath = null) {
|
|
65
|
+
// Load base agent
|
|
66
|
+
const agentContent = await fs.readFile(agentYamlPath, 'utf8');
|
|
67
|
+
const agentYaml = yaml.parse(agentContent);
|
|
68
|
+
|
|
69
|
+
// Load customization if exists
|
|
70
|
+
let merged = agentYaml;
|
|
71
|
+
if (customizeYamlPath && (await fs.pathExists(customizeYamlPath))) {
|
|
72
|
+
const customizeContent = await fs.readFile(customizeYamlPath, 'utf8');
|
|
73
|
+
const customizeYaml = yaml.parse(customizeContent);
|
|
74
|
+
|
|
75
|
+
if (customizeYaml) {
|
|
76
|
+
// Special handling: persona fields are merged, but only non-empty values override
|
|
77
|
+
if (customizeYaml.persona) {
|
|
78
|
+
const basePersona = merged.agent.persona || {};
|
|
79
|
+
const customPersona = {};
|
|
80
|
+
|
|
81
|
+
// Only copy non-empty customize values
|
|
82
|
+
for (const [key, value] of Object.entries(customizeYaml.persona)) {
|
|
83
|
+
if (value !== '' && value !== null && !(Array.isArray(value) && value.length === 0)) {
|
|
84
|
+
customPersona[key] = value;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
// Merge non-empty customize values over base
|
|
89
|
+
if (Object.keys(customPersona).length > 0) {
|
|
90
|
+
merged.agent.persona = { ...basePersona, ...customPersona };
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// Merge metadata (only non-empty values)
|
|
95
|
+
if (customizeYaml.agent && customizeYaml.agent.metadata) {
|
|
96
|
+
const nonEmptyMetadata = {};
|
|
97
|
+
for (const [key, value] of Object.entries(customizeYaml.agent.metadata)) {
|
|
98
|
+
if (value !== '' && value !== null) {
|
|
99
|
+
nonEmptyMetadata[key] = value;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
merged.agent.metadata = { ...merged.agent.metadata, ...nonEmptyMetadata };
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// Append menu items (support both 'menu' and legacy 'commands')
|
|
106
|
+
const customMenuItems = customizeYaml.menu || customizeYaml.commands;
|
|
107
|
+
if (customMenuItems) {
|
|
108
|
+
// Determine if base uses 'menu' or 'commands'
|
|
109
|
+
if (merged.agent.menu) {
|
|
110
|
+
merged.agent.menu = [...merged.agent.menu, ...customMenuItems];
|
|
111
|
+
} else if (merged.agent.commands) {
|
|
112
|
+
merged.agent.commands = [...merged.agent.commands, ...customMenuItems];
|
|
113
|
+
} else {
|
|
114
|
+
// Default to 'menu' for new agents
|
|
115
|
+
merged.agent.menu = customMenuItems;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
// Append critical actions
|
|
120
|
+
if (customizeYaml.critical_actions) {
|
|
121
|
+
merged.agent.critical_actions = [...(merged.agent.critical_actions || []), ...customizeYaml.critical_actions];
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
// Append prompts
|
|
125
|
+
if (customizeYaml.prompts) {
|
|
126
|
+
merged.agent.prompts = [...(merged.agent.prompts || []), ...customizeYaml.prompts];
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
// Append memories
|
|
130
|
+
if (customizeYaml.memories) {
|
|
131
|
+
merged.agent.memories = [...(merged.agent.memories || []), ...customizeYaml.memories];
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
return merged;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* Convert agent YAML to XML
|
|
141
|
+
* @param {Object} agentYaml - Parsed agent YAML object
|
|
142
|
+
* @param {Object} buildMetadata - Metadata about the build (file paths, hashes, etc.)
|
|
143
|
+
* @returns {string} XML content
|
|
144
|
+
*/
|
|
145
|
+
async convertToXml(agentYaml, buildMetadata = {}) {
|
|
146
|
+
const agent = agentYaml.agent;
|
|
147
|
+
const metadata = agent.metadata || {};
|
|
148
|
+
|
|
149
|
+
// Add module from buildMetadata if available
|
|
150
|
+
if (buildMetadata.module) {
|
|
151
|
+
metadata.module = buildMetadata.module;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
// Analyze agent to determine needed handlers
|
|
155
|
+
const profile = this.analyzer.analyzeAgentObject(agentYaml);
|
|
156
|
+
|
|
157
|
+
// Build activation block only if not skipped
|
|
158
|
+
let activationBlock = '';
|
|
159
|
+
if (!buildMetadata.skipActivation) {
|
|
160
|
+
activationBlock = await this.activationBuilder.buildActivation(
|
|
161
|
+
profile,
|
|
162
|
+
metadata,
|
|
163
|
+
agent.critical_actions || [],
|
|
164
|
+
buildMetadata.forWebBundle || false, // Pass web bundle flag
|
|
165
|
+
);
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
// Start building XML
|
|
169
|
+
let xml = '';
|
|
170
|
+
|
|
171
|
+
if (buildMetadata.forWebBundle) {
|
|
172
|
+
// Web bundle: keep existing format
|
|
173
|
+
xml += '<!-- Powered by MDAN-CORE™ -->\n\n';
|
|
174
|
+
xml += `# ${metadata.title || 'Agent'}\n\n`;
|
|
175
|
+
} else {
|
|
176
|
+
// Installation: use YAML frontmatter + instruction
|
|
177
|
+
// Extract name from filename: "cli-chief.yaml" or "pm.agent.yaml" -> "cli chief" or "pm"
|
|
178
|
+
const filename = buildMetadata.sourceFile || 'agent.yaml';
|
|
179
|
+
let nameFromFile = path.basename(filename, path.extname(filename)); // Remove .yaml/.md extension
|
|
180
|
+
nameFromFile = nameFromFile.replace(/\.agent$/, ''); // Remove .agent suffix if present
|
|
181
|
+
nameFromFile = nameFromFile.replaceAll('-', ' '); // Replace dashes with spaces
|
|
182
|
+
|
|
183
|
+
xml += '---\n';
|
|
184
|
+
xml += `name: "${nameFromFile}"\n`;
|
|
185
|
+
xml += `description: "${metadata.title || 'MDAN Agent'}"\n`;
|
|
186
|
+
xml += '---\n\n';
|
|
187
|
+
xml +=
|
|
188
|
+
"You must fully embody this agent's persona and follow all activation instructions exactly as specified. NEVER break character until given an exit command.\n\n";
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
xml += '```xml\n';
|
|
192
|
+
|
|
193
|
+
// Agent opening tag
|
|
194
|
+
const agentAttrs = [
|
|
195
|
+
`id="${metadata.id || ''}"`,
|
|
196
|
+
`name="${metadata.name || ''}"`,
|
|
197
|
+
`title="${metadata.title || ''}"`,
|
|
198
|
+
`icon="${metadata.icon || '🤖'}"`,
|
|
199
|
+
];
|
|
200
|
+
|
|
201
|
+
// Add localskip attribute if present
|
|
202
|
+
if (metadata.localskip === true) {
|
|
203
|
+
agentAttrs.push('localskip="true"');
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
xml += `<agent ${agentAttrs.join(' ')}>\n`;
|
|
207
|
+
|
|
208
|
+
// Activation block (only if not skipped)
|
|
209
|
+
if (activationBlock) {
|
|
210
|
+
xml += activationBlock + '\n';
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
// Persona section
|
|
214
|
+
xml += this.buildPersonaXml(agent.persona);
|
|
215
|
+
|
|
216
|
+
// Memories section (if exists)
|
|
217
|
+
if (agent.memories) {
|
|
218
|
+
xml += this.buildMemoriesXml(agent.memories);
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
// Prompts section (if exists)
|
|
222
|
+
if (agent.prompts) {
|
|
223
|
+
xml += this.buildPromptsXml(agent.prompts);
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
// Menu section (support both 'menu' and legacy 'commands')
|
|
227
|
+
const menuItems = agent.menu || agent.commands || [];
|
|
228
|
+
xml += this.buildCommandsXml(menuItems, buildMetadata.forWebBundle);
|
|
229
|
+
|
|
230
|
+
xml += '</agent>\n';
|
|
231
|
+
xml += '```\n';
|
|
232
|
+
|
|
233
|
+
return xml;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
/**
|
|
237
|
+
* Build persona XML section
|
|
238
|
+
*/
|
|
239
|
+
buildPersonaXml(persona) {
|
|
240
|
+
if (!persona) return '';
|
|
241
|
+
|
|
242
|
+
let xml = ' <persona>\n';
|
|
243
|
+
|
|
244
|
+
if (persona.role) {
|
|
245
|
+
xml += ` <role>${escapeXml(persona.role)}</role>\n`;
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
if (persona.identity) {
|
|
249
|
+
xml += ` <identity>${escapeXml(persona.identity)}</identity>\n`;
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
if (persona.communication_style) {
|
|
253
|
+
xml += ` <communication_style>${escapeXml(persona.communication_style)}</communication_style>\n`;
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
if (persona.principles) {
|
|
257
|
+
// Principles can be array or string
|
|
258
|
+
let principlesText;
|
|
259
|
+
if (Array.isArray(persona.principles)) {
|
|
260
|
+
principlesText = persona.principles.join(' ');
|
|
261
|
+
} else {
|
|
262
|
+
principlesText = persona.principles;
|
|
263
|
+
}
|
|
264
|
+
xml += ` <principles>${escapeXml(principlesText)}</principles>\n`;
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
xml += ' </persona>\n';
|
|
268
|
+
|
|
269
|
+
return xml;
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
/**
|
|
273
|
+
* Build memories XML section
|
|
274
|
+
*/
|
|
275
|
+
buildMemoriesXml(memories) {
|
|
276
|
+
if (!memories || memories.length === 0) return '';
|
|
277
|
+
|
|
278
|
+
let xml = ' <memories>\n';
|
|
279
|
+
|
|
280
|
+
for (const memory of memories) {
|
|
281
|
+
xml += ` <memory>${escapeXml(memory)}</memory>\n`;
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
xml += ' </memories>\n';
|
|
285
|
+
|
|
286
|
+
return xml;
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
/**
|
|
290
|
+
* Build prompts XML section
|
|
291
|
+
* Handles both array format and object/dictionary format
|
|
292
|
+
*/
|
|
293
|
+
buildPromptsXml(prompts) {
|
|
294
|
+
if (!prompts) return '';
|
|
295
|
+
|
|
296
|
+
// Handle object/dictionary format: { promptId: 'content', ... }
|
|
297
|
+
// Convert to array format for processing
|
|
298
|
+
let promptsArray = prompts;
|
|
299
|
+
if (!Array.isArray(prompts)) {
|
|
300
|
+
// Check if it's an object with no length property (dictionary format)
|
|
301
|
+
if (typeof prompts === 'object' && prompts.length === undefined) {
|
|
302
|
+
promptsArray = Object.entries(prompts).map(([id, content]) => ({
|
|
303
|
+
id: id,
|
|
304
|
+
content: content,
|
|
305
|
+
}));
|
|
306
|
+
} else {
|
|
307
|
+
return ''; // Not a valid prompts format
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
if (promptsArray.length === 0) return '';
|
|
312
|
+
|
|
313
|
+
let xml = ' <prompts>\n';
|
|
314
|
+
|
|
315
|
+
for (const prompt of promptsArray) {
|
|
316
|
+
xml += ` <prompt id="${prompt.id || ''}">\n`;
|
|
317
|
+
xml += ` <content>\n`;
|
|
318
|
+
xml += `${escapeXml(prompt.content || '')}\n`;
|
|
319
|
+
xml += ` </content>\n`;
|
|
320
|
+
xml += ` </prompt>\n`;
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
xml += ' </prompts>\n';
|
|
324
|
+
|
|
325
|
+
return xml;
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
/**
|
|
329
|
+
* Build menu XML section (renamed from commands for clarity)
|
|
330
|
+
* Auto-injects *help and *exit, adds * prefix to all triggers
|
|
331
|
+
* Supports both legacy format and new multi format with nested handlers
|
|
332
|
+
* @param {Array} menuItems - Menu items from YAML
|
|
333
|
+
* @param {boolean} forWebBundle - Whether building for web bundle
|
|
334
|
+
*/
|
|
335
|
+
buildCommandsXml(menuItems, forWebBundle = false) {
|
|
336
|
+
let xml = ' <menu>\n';
|
|
337
|
+
|
|
338
|
+
// Always inject menu display option first
|
|
339
|
+
xml += ` <item cmd="*menu">[M] Redisplay Menu Options</item>\n`;
|
|
340
|
+
|
|
341
|
+
// Add user-defined menu items with * prefix
|
|
342
|
+
if (menuItems && menuItems.length > 0) {
|
|
343
|
+
for (const item of menuItems) {
|
|
344
|
+
// Skip ide-only items when building for web bundles
|
|
345
|
+
if (forWebBundle && item['ide-only'] === true) {
|
|
346
|
+
continue;
|
|
347
|
+
}
|
|
348
|
+
// Skip web-only items when NOT building for web bundles (i.e., IDE/local installation)
|
|
349
|
+
if (!forWebBundle && item['web-only'] === true) {
|
|
350
|
+
continue;
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
// Handle multi format menu items with nested handlers
|
|
354
|
+
if (item.multi && item.triggers && Array.isArray(item.triggers)) {
|
|
355
|
+
xml += ` <item type="multi">${escapeXml(item.multi)}\n`;
|
|
356
|
+
xml += this.buildNestedHandlers(item.triggers);
|
|
357
|
+
xml += ` </item>\n`;
|
|
358
|
+
}
|
|
359
|
+
// Handle legacy format menu items
|
|
360
|
+
else if (item.trigger) {
|
|
361
|
+
// For legacy items, keep using cmd with *<trigger> format
|
|
362
|
+
let trigger = item.trigger || '';
|
|
363
|
+
if (!trigger.startsWith('*')) {
|
|
364
|
+
trigger = '*' + trigger;
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
const attrs = [`cmd="${trigger}"`];
|
|
368
|
+
|
|
369
|
+
// Add handler attributes
|
|
370
|
+
// If workflow-install exists, use its value for workflow attribute (vendoring)
|
|
371
|
+
// workflow-install is build-time metadata - tells installer where to copy workflows
|
|
372
|
+
// The final XML should only have workflow pointing to the install location
|
|
373
|
+
if (item['workflow-install']) {
|
|
374
|
+
attrs.push(`workflow="${item['workflow-install']}"`);
|
|
375
|
+
} else if (item.workflow) {
|
|
376
|
+
attrs.push(`workflow="${item.workflow}"`);
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
if (item['validate-workflow']) attrs.push(`validate-workflow="${item['validate-workflow']}"`);
|
|
380
|
+
if (item.exec) attrs.push(`exec="${item.exec}"`);
|
|
381
|
+
if (item.tmpl) attrs.push(`tmpl="${item.tmpl}"`);
|
|
382
|
+
if (item.data) attrs.push(`data="${item.data}"`);
|
|
383
|
+
if (item.action) attrs.push(`action="${item.action}"`);
|
|
384
|
+
|
|
385
|
+
xml += ` <item ${attrs.join(' ')}>${escapeXml(item.description || '')}</item>\n`;
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
// Always inject dismiss last
|
|
391
|
+
xml += ` <item cmd="*dismiss">[D] Dismiss Agent</item>\n`;
|
|
392
|
+
|
|
393
|
+
xml += ' </menu>\n';
|
|
394
|
+
|
|
395
|
+
return xml;
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
/**
|
|
399
|
+
* Build nested handlers for multi format menu items
|
|
400
|
+
* @param {Array} triggers - Triggers array from multi format
|
|
401
|
+
* @returns {string} Handler XML
|
|
402
|
+
*/
|
|
403
|
+
buildNestedHandlers(triggers) {
|
|
404
|
+
let xml = '';
|
|
405
|
+
|
|
406
|
+
for (const triggerGroup of triggers) {
|
|
407
|
+
for (const [triggerName, execArray] of Object.entries(triggerGroup)) {
|
|
408
|
+
// Build trigger with * prefix
|
|
409
|
+
let trigger = triggerName.startsWith('*') ? triggerName : '*' + triggerName;
|
|
410
|
+
|
|
411
|
+
// Extract the relevant execution data
|
|
412
|
+
const execData = this.processExecArray(execArray);
|
|
413
|
+
|
|
414
|
+
// For nested handlers in multi items, we don't need cmd attribute
|
|
415
|
+
// The match attribute will handle fuzzy matching
|
|
416
|
+
const attrs = [`match="${escapeXml(execData.description || '')}"`];
|
|
417
|
+
|
|
418
|
+
// Add handler attributes based on exec data
|
|
419
|
+
if (execData.route) attrs.push(`exec="${execData.route}"`);
|
|
420
|
+
if (execData.workflow) attrs.push(`workflow="${execData.workflow}"`);
|
|
421
|
+
if (execData['validate-workflow']) attrs.push(`validate-workflow="${execData['validate-workflow']}"`);
|
|
422
|
+
if (execData.action) attrs.push(`action="${execData.action}"`);
|
|
423
|
+
if (execData.data) attrs.push(`data="${execData.data}"`);
|
|
424
|
+
if (execData.tmpl) attrs.push(`tmpl="${execData.tmpl}"`);
|
|
425
|
+
// Only add type if it's not 'exec' (exec is already implied by the exec attribute)
|
|
426
|
+
if (execData.type && execData.type !== 'exec') attrs.push(`type="${execData.type}"`);
|
|
427
|
+
|
|
428
|
+
xml += ` <handler ${attrs.join(' ')}></handler>\n`;
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
return xml;
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
/**
|
|
436
|
+
* Process the execution array from multi format triggers
|
|
437
|
+
* Extracts relevant data for XML attributes
|
|
438
|
+
* @param {Array} execArray - Array of execution objects
|
|
439
|
+
* @returns {Object} Processed execution data
|
|
440
|
+
*/
|
|
441
|
+
processExecArray(execArray) {
|
|
442
|
+
const result = {
|
|
443
|
+
description: '',
|
|
444
|
+
route: null,
|
|
445
|
+
workflow: null,
|
|
446
|
+
data: null,
|
|
447
|
+
action: null,
|
|
448
|
+
type: null,
|
|
449
|
+
};
|
|
450
|
+
|
|
451
|
+
if (!Array.isArray(execArray)) {
|
|
452
|
+
return result;
|
|
453
|
+
}
|
|
454
|
+
|
|
455
|
+
for (const exec of execArray) {
|
|
456
|
+
if (exec.input) {
|
|
457
|
+
// Use input as description if no explicit description is provided
|
|
458
|
+
result.description = exec.input;
|
|
459
|
+
}
|
|
460
|
+
|
|
461
|
+
if (exec.route) {
|
|
462
|
+
// Determine if it's a workflow or exec based on file extension or context
|
|
463
|
+
if (exec.route.endsWith('.yaml') || exec.route.endsWith('.yml')) {
|
|
464
|
+
result.workflow = exec.route;
|
|
465
|
+
} else {
|
|
466
|
+
result.route = exec.route;
|
|
467
|
+
}
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
if (exec.data !== null && exec.data !== undefined) {
|
|
471
|
+
result.data = exec.data;
|
|
472
|
+
}
|
|
473
|
+
|
|
474
|
+
if (exec.action) {
|
|
475
|
+
result.action = exec.action;
|
|
476
|
+
}
|
|
477
|
+
|
|
478
|
+
if (exec.type) {
|
|
479
|
+
result.type = exec.type;
|
|
480
|
+
}
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
return result;
|
|
484
|
+
}
|
|
485
|
+
|
|
486
|
+
/**
|
|
487
|
+
* Calculate file hash for build tracking
|
|
488
|
+
*/
|
|
489
|
+
async calculateFileHash(filePath) {
|
|
490
|
+
if (!(await fs.pathExists(filePath))) {
|
|
491
|
+
return null;
|
|
492
|
+
}
|
|
493
|
+
|
|
494
|
+
const content = await fs.readFile(filePath, 'utf8');
|
|
495
|
+
return crypto.createHash('md5').update(content).digest('hex').slice(0, 8);
|
|
496
|
+
}
|
|
497
|
+
|
|
498
|
+
/**
|
|
499
|
+
* Build agent XML from YAML files and return as string (for in-memory use)
|
|
500
|
+
* @param {string} agentYamlPath - Path to agent YAML
|
|
501
|
+
* @param {string} customizeYamlPath - Path to customize YAML (optional)
|
|
502
|
+
* @param {Object} options - Build options
|
|
503
|
+
* @returns {Promise<string>} XML content as string
|
|
504
|
+
*/
|
|
505
|
+
async buildFromYaml(agentYamlPath, customizeYamlPath = null, options = {}) {
|
|
506
|
+
// Load and merge YAML files
|
|
507
|
+
const mergedAgent = await this.loadAndMergeAgent(agentYamlPath, customizeYamlPath);
|
|
508
|
+
|
|
509
|
+
// Calculate hashes for build tracking
|
|
510
|
+
const sourceHash = await this.calculateFileHash(agentYamlPath);
|
|
511
|
+
const customizeHash = customizeYamlPath ? await this.calculateFileHash(customizeYamlPath) : null;
|
|
512
|
+
|
|
513
|
+
// Extract module from path (e.g., /path/to/modules/bmm/agents/pm.yaml -> bmm)
|
|
514
|
+
// or /path/to/.mdan/bmm/agents/pm.yaml -> bmm
|
|
515
|
+
// or /path/to/src/bmm/agents/pm.yaml -> bmm
|
|
516
|
+
let module = 'core'; // default to core
|
|
517
|
+
const pathParts = agentYamlPath.split(path.sep);
|
|
518
|
+
|
|
519
|
+
// Look for module indicators in the path
|
|
520
|
+
const modulesIndex = pathParts.indexOf('modules');
|
|
521
|
+
const mdanIndex = pathParts.indexOf('mdan');
|
|
522
|
+
const srcIndex = pathParts.indexOf('src');
|
|
523
|
+
|
|
524
|
+
if (modulesIndex !== -1 && pathParts[modulesIndex + 1]) {
|
|
525
|
+
// Path contains /modules/{module}/
|
|
526
|
+
module = pathParts[modulesIndex + 1];
|
|
527
|
+
} else if (mdanIndex !== -1 && pathParts[mdanIndex + 1]) {
|
|
528
|
+
// Path contains /.mdan/{module}/
|
|
529
|
+
const potentialModule = pathParts[mdanIndex + 1];
|
|
530
|
+
// Check if it's a known module, not 'agents' or '_config'
|
|
531
|
+
if (['bmm', 'bmb', 'cis', 'core'].includes(potentialModule)) {
|
|
532
|
+
module = potentialModule;
|
|
533
|
+
}
|
|
534
|
+
} else if (srcIndex !== -1 && pathParts[srcIndex + 1]) {
|
|
535
|
+
// Path contains /src/{module}/ (bmm and core are directly under src/)
|
|
536
|
+
const potentialModule = pathParts[srcIndex + 1];
|
|
537
|
+
if (potentialModule === 'bmm' || potentialModule === 'core') {
|
|
538
|
+
module = potentialModule;
|
|
539
|
+
}
|
|
540
|
+
}
|
|
541
|
+
|
|
542
|
+
// Build metadata
|
|
543
|
+
const buildMetadata = {
|
|
544
|
+
sourceFile: path.basename(agentYamlPath),
|
|
545
|
+
sourceHash,
|
|
546
|
+
customizeFile: customizeYamlPath ? path.basename(customizeYamlPath) : null,
|
|
547
|
+
customizeHash,
|
|
548
|
+
builderVersion: '1.0.0',
|
|
549
|
+
includeMetadata: options.includeMetadata !== false,
|
|
550
|
+
skipActivation: options.skipActivation === true,
|
|
551
|
+
forWebBundle: options.forWebBundle === true,
|
|
552
|
+
module: module, // Add module to buildMetadata
|
|
553
|
+
};
|
|
554
|
+
|
|
555
|
+
// Convert to XML and return
|
|
556
|
+
return await this.convertToXml(mergedAgent, buildMetadata);
|
|
557
|
+
}
|
|
558
|
+
|
|
559
|
+
/**
|
|
560
|
+
* Build agent XML from YAML files
|
|
561
|
+
* @param {string} agentYamlPath - Path to agent YAML
|
|
562
|
+
* @param {string} customizeYamlPath - Path to customize YAML (optional)
|
|
563
|
+
* @param {string} outputPath - Path to write XML file
|
|
564
|
+
* @param {Object} options - Build options
|
|
565
|
+
*/
|
|
566
|
+
async buildAgent(agentYamlPath, customizeYamlPath, outputPath, options = {}) {
|
|
567
|
+
// Use buildFromYaml to get XML content
|
|
568
|
+
const xml = await this.buildFromYaml(agentYamlPath, customizeYamlPath, options);
|
|
569
|
+
|
|
570
|
+
// Write output file
|
|
571
|
+
await fs.ensureDir(path.dirname(outputPath));
|
|
572
|
+
await fs.writeFile(outputPath, xml, 'utf8');
|
|
573
|
+
|
|
574
|
+
// Calculate hashes for return value
|
|
575
|
+
const sourceHash = await this.calculateFileHash(agentYamlPath);
|
|
576
|
+
const customizeHash = customizeYamlPath ? await this.calculateFileHash(customizeYamlPath) : null;
|
|
577
|
+
|
|
578
|
+
return {
|
|
579
|
+
success: true,
|
|
580
|
+
outputPath,
|
|
581
|
+
sourceHash,
|
|
582
|
+
customizeHash,
|
|
583
|
+
};
|
|
584
|
+
}
|
|
585
|
+
}
|
|
586
|
+
|
|
587
|
+
module.exports = { YamlXmlBuilder };
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
const { program } = require('commander');
|
|
2
|
+
const path = require('node:path');
|
|
3
|
+
const fs = require('node:fs');
|
|
4
|
+
const { execSync } = require('node:child_process');
|
|
5
|
+
const semver = require('semver');
|
|
6
|
+
const prompts = require('./lib/prompts');
|
|
7
|
+
|
|
8
|
+
// The installer flow uses many sequential @clack/prompts, each adding keypress
|
|
9
|
+
// listeners to stdin. Raise the limit to avoid spurious EventEmitter warnings.
|
|
10
|
+
if (process.stdin?.setMaxListeners) {
|
|
11
|
+
const currentLimit = process.stdin.getMaxListeners();
|
|
12
|
+
process.stdin.setMaxListeners(Math.max(currentLimit, 50));
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
// Check for updates - do this asynchronously so it doesn't block startup
|
|
16
|
+
const packageJson = require('../../package.json');
|
|
17
|
+
const packageName = 'mdan';
|
|
18
|
+
checkForUpdate().catch(() => {
|
|
19
|
+
// Silently ignore errors - version check is best-effort
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
async function checkForUpdate() {
|
|
23
|
+
try {
|
|
24
|
+
// For beta versions, check the beta tag; otherwise check latest
|
|
25
|
+
const isBeta =
|
|
26
|
+
packageJson.version.includes('Beta') ||
|
|
27
|
+
packageJson.version.includes('beta') ||
|
|
28
|
+
packageJson.version.includes('alpha') ||
|
|
29
|
+
packageJson.version.includes('rc');
|
|
30
|
+
const tag = isBeta ? 'beta' : 'latest';
|
|
31
|
+
|
|
32
|
+
const result = execSync(`npm view ${packageName}@${tag} version`, {
|
|
33
|
+
encoding: 'utf8',
|
|
34
|
+
stdio: 'pipe',
|
|
35
|
+
timeout: 5000,
|
|
36
|
+
}).trim();
|
|
37
|
+
|
|
38
|
+
if (result && semver.gt(result, packageJson.version)) {
|
|
39
|
+
const color = await prompts.getColor();
|
|
40
|
+
const updateMsg = [
|
|
41
|
+
`You are using version ${packageJson.version} but ${result} is available.`,
|
|
42
|
+
'',
|
|
43
|
+
'To update, exit and first run:',
|
|
44
|
+
` npm cache clean --force && npx mdan@${tag} install`,
|
|
45
|
+
].join('\n');
|
|
46
|
+
await prompts.box(updateMsg, 'Update Available', {
|
|
47
|
+
rounded: true,
|
|
48
|
+
formatBorder: color.yellow,
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
} catch {
|
|
52
|
+
// Silently fail - network issues or npm not available
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// Fix for stdin issues when running through npm on Windows
|
|
57
|
+
// Ensures keyboard interaction works properly with CLI prompts
|
|
58
|
+
if (process.stdin.isTTY) {
|
|
59
|
+
try {
|
|
60
|
+
process.stdin.resume();
|
|
61
|
+
process.stdin.setEncoding('utf8');
|
|
62
|
+
|
|
63
|
+
// On Windows, explicitly reference the stdin stream to ensure it's properly initialized
|
|
64
|
+
if (process.platform === 'win32') {
|
|
65
|
+
process.stdin.on('error', () => {
|
|
66
|
+
// Ignore stdin errors - they can occur when the terminal is closing
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
} catch {
|
|
70
|
+
// Silently ignore - some environments may not support these operations
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// Load all command modules
|
|
75
|
+
const commandsPath = path.join(__dirname, 'commands');
|
|
76
|
+
const commandFiles = fs.readdirSync(commandsPath).filter((file) => file.endsWith('.js'));
|
|
77
|
+
|
|
78
|
+
const commands = {};
|
|
79
|
+
for (const file of commandFiles) {
|
|
80
|
+
const command = require(path.join(commandsPath, file));
|
|
81
|
+
commands[command.command] = command;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// Set up main program
|
|
85
|
+
program.version(packageJson.version).description('MDAN Core CLI - Universal AI agent framework');
|
|
86
|
+
|
|
87
|
+
// Register all commands
|
|
88
|
+
for (const [name, cmd] of Object.entries(commands)) {
|
|
89
|
+
const command = program.command(name).description(cmd.description);
|
|
90
|
+
|
|
91
|
+
// Add options
|
|
92
|
+
for (const option of cmd.options || []) {
|
|
93
|
+
command.option(...option);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
// Set action
|
|
97
|
+
command.action(cmd.action);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
// Parse arguments
|
|
101
|
+
program.parse(process.argv);
|
|
102
|
+
|
|
103
|
+
// Show help if no command provided
|
|
104
|
+
if (process.argv.slice(2).length === 0) {
|
|
105
|
+
program.outputHelp();
|
|
106
|
+
}
|