bmad-method 6.0.0-alpha.13 → 6.0.0-alpha.15
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/.coderabbit.yaml +36 -0
- package/.github/CODE_OF_CONDUCT.md +128 -0
- package/.github/ISSUE_TEMPLATE/idea_submission.md +1 -1
- package/.github/scripts/discord-helpers.sh +15 -0
- package/.github/workflows/discord.yaml +278 -8
- package/.github/workflows/quality.yaml +19 -0
- package/.markdownlint-cli2.yaml +42 -0
- package/.prettierignore +3 -0
- package/CHANGELOG.md +183 -360
- package/README.md +4 -1
- package/docs/agent-customization-guide.md +2 -2
- package/docs/custom-content-installation.md +245 -0
- package/docs/document-sharding-guide.md +1 -1
- package/docs/index.md +2 -2
- package/docs/installers-bundlers/installers-modules-platforms-reference.md +6 -5
- package/docs/web-bundles-gemini-gpt-guide.md +1 -1
- package/eslint.config.mjs +14 -0
- package/example-custom-content/README.md +8 -0
- package/{custom/src → example-custom-content}/agents/commit-poet/commit-poet.agent.yaml +1 -1
- package/{custom/src → example-custom-content}/agents/toolsmith/toolsmith-sidecar/instructions.md +5 -5
- package/{custom/src → example-custom-content}/agents/toolsmith/toolsmith-sidecar/knowledge/docs.md +1 -1
- package/{custom/src → example-custom-content}/agents/toolsmith/toolsmith-sidecar/knowledge/installers.md +1 -1
- package/{custom/src → example-custom-content}/agents/toolsmith/toolsmith-sidecar/knowledge/modules.md +2 -2
- package/{custom/src → example-custom-content}/agents/toolsmith/toolsmith-sidecar/memories.md +1 -1
- package/{custom/src → example-custom-content}/agents/toolsmith/toolsmith.agent.yaml +18 -17
- package/example-custom-content/module.yaml +4 -0
- package/example-custom-content/workflows/quiz-master/steps/step-01-init.md +168 -0
- package/example-custom-content/workflows/quiz-master/steps/step-02-q1.md +155 -0
- package/example-custom-content/workflows/quiz-master/steps/step-03-q2.md +89 -0
- package/example-custom-content/workflows/quiz-master/steps/step-04-q3.md +36 -0
- package/example-custom-content/workflows/quiz-master/steps/step-05-q4.md +36 -0
- package/example-custom-content/workflows/quiz-master/steps/step-06-q5.md +36 -0
- package/example-custom-content/workflows/quiz-master/steps/step-07-q6.md +36 -0
- package/example-custom-content/workflows/quiz-master/steps/step-08-q7.md +36 -0
- package/example-custom-content/workflows/quiz-master/steps/step-09-q8.md +36 -0
- package/example-custom-content/workflows/quiz-master/steps/step-10-q9.md +36 -0
- package/example-custom-content/workflows/quiz-master/steps/step-11-q10.md +36 -0
- package/example-custom-content/workflows/quiz-master/steps/step-12-results.md +150 -0
- package/example-custom-content/workflows/quiz-master/templates/csv-headers.template +1 -0
- package/example-custom-content/workflows/quiz-master/workflow.md +54 -0
- package/example-custom-content/workflows/wassup/workflow.md +26 -0
- package/example-custom-module/mwm/README.md +9 -0
- package/example-custom-module/mwm/agents/cbt-coach/cbt-coach-sidecar/cognitive-distortions.md +47 -0
- package/example-custom-module/mwm/agents/cbt-coach/cbt-coach-sidecar/thought-records.md +17 -0
- package/example-custom-module/mwm/agents/cbt-coach/cbt-coach.agent.yaml +151 -0
- package/example-custom-module/mwm/agents/crisis-navigator.agent.yaml +138 -0
- package/example-custom-module/mwm/agents/meditation-guide.agent.yaml +138 -0
- package/example-custom-module/mwm/agents/wellness-companion/wellness-companion-sidecar/insights.md +13 -0
- package/example-custom-module/mwm/agents/wellness-companion/wellness-companion-sidecar/instructions.md +30 -0
- package/example-custom-module/mwm/agents/wellness-companion/wellness-companion-sidecar/memories.md +13 -0
- package/example-custom-module/mwm/agents/wellness-companion/wellness-companion-sidecar/patterns.md +17 -0
- package/example-custom-module/mwm/agents/wellness-companion/wellness-companion.agent.yaml +125 -0
- package/example-custom-module/mwm/module.yaml +28 -0
- package/example-custom-module/mwm/workflows/cbt-thought-record/README.md +31 -0
- package/example-custom-module/mwm/workflows/cbt-thought-record/workflow.md +45 -0
- package/example-custom-module/mwm/workflows/crisis-support/README.md +31 -0
- package/example-custom-module/mwm/workflows/crisis-support/workflow.md +45 -0
- package/example-custom-module/mwm/workflows/daily-checkin/README.md +32 -0
- package/example-custom-module/mwm/workflows/daily-checkin/workflow.md +45 -0
- package/example-custom-module/mwm/workflows/guided-meditation/README.md +31 -0
- package/example-custom-module/mwm/workflows/guided-meditation/workflow.md +45 -0
- package/example-custom-module/mwm/workflows/wellness-journal/README.md +31 -0
- package/example-custom-module/mwm/workflows/wellness-journal/workflow.md +45 -0
- package/package.json +9 -4
- package/src/core/_module-installer/installer.js +1 -1
- package/src/core/{_module-installer/install-config.yaml → module.yaml} +5 -1
- package/src/core/resources/excalidraw/library-loader.md +2 -2
- package/src/core/workflows/brainstorming/steps/step-01-session-setup.md +1 -1
- package/src/core/workflows/brainstorming/workflow.md +1 -1
- package/src/core/workflows/party-mode/steps/step-03-graceful-exit.md +0 -1
- package/src/core/workflows/party-mode/workflow.md +2 -3
- package/src/modules/bmb/README.md +1 -1
- package/src/modules/bmb/_module-installer/installer.js +76 -0
- package/src/modules/bmb/agents/bmad-builder.agent.yaml +32 -9
- package/src/modules/bmb/docs/agents/agent-menu-patterns.md +5 -5
- package/src/modules/bmb/docs/agents/expert-agent-architecture.md +20 -20
- package/src/modules/bmb/docs/agents/index.md +1 -1
- package/src/modules/bmb/docs/agents/module-agent-architecture.md +45 -45
- package/src/modules/bmb/docs/agents/simple-agent-architecture.md +7 -3
- package/src/modules/bmb/docs/workflows/architecture.md +1 -1
- package/src/modules/bmb/docs/workflows/templates/step-01-init-continuable-template.md +241 -0
- package/src/modules/bmb/docs/workflows/templates/step-1b-template.md +223 -0
- package/src/modules/bmb/{workflows/create-workflow → docs/workflows}/templates/step-file.md +4 -4
- package/src/modules/bmb/docs/workflows/{step-template.md → templates/step-template.md} +40 -33
- package/src/modules/bmb/docs/workflows/templates/workflow-template.md +104 -0
- package/src/modules/bmb/{workflows/create-workflow → docs/workflows}/templates/workflow.md +1 -1
- package/src/modules/bmb/{_module-installer/install-config.yaml → module.yaml} +4 -9
- package/src/modules/bmb/reference/agents/expert-examples/journal-keeper/README.md +4 -4
- package/src/modules/bmb/reference/agents/expert-examples/journal-keeper/journal-keeper.agent.yaml +8 -8
- package/src/modules/bmb/reference/agents/module-examples/security-engineer.agent.yaml +6 -6
- package/src/modules/bmb/reference/agents/module-examples/trend-analyst.agent.yaml +7 -7
- package/src/modules/bmb/reference/workflows/meal-prep-nutrition/steps/step-01-init.md +2 -3
- package/src/modules/bmb/reference/workflows/meal-prep-nutrition/steps/step-01b-continue.md +10 -40
- package/src/modules/bmb/reference/workflows/meal-prep-nutrition/steps/step-02-profile.md +1 -1
- package/src/modules/bmb/reference/workflows/meal-prep-nutrition/steps/step-03-assessment.md +1 -0
- package/src/modules/bmb/reference/workflows/meal-prep-nutrition/steps/step-04-strategy.md +2 -2
- package/src/modules/bmb/reference/workflows/meal-prep-nutrition/steps/step-05-shopping.md +2 -2
- package/src/modules/bmb/reference/workflows/meal-prep-nutrition/steps/step-06-prep-schedule.md +2 -2
- package/src/modules/bmb/reference/workflows/meal-prep-nutrition/workflow.md +2 -2
- package/src/modules/bmb/workflows/create-agent/data/info-and-installation-guide.md +16 -4
- package/src/modules/bmb/workflows/create-agent/data/reference/agents/expert-examples/journal-keeper/README.md +4 -4
- package/src/modules/bmb/workflows/create-agent/data/reference/agents/expert-examples/journal-keeper/journal-keeper.agent.yaml +7 -7
- package/src/modules/bmb/workflows/create-agent/data/reference/workflows/meal-prep-nutrition/steps/step-05-shopping.md +1 -1
- package/src/modules/bmb/workflows/create-agent/data/validation-complete.md +3 -3
- package/src/modules/bmb/workflows/create-agent/steps/step-01-brainstorm.md +3 -3
- package/src/modules/bmb/workflows/create-agent/steps/step-02-discover.md +3 -3
- package/src/modules/bmb/workflows/create-agent/steps/step-03-persona.md +3 -3
- package/src/modules/bmb/workflows/create-agent/steps/step-04-commands.md +6 -6
- package/src/modules/bmb/workflows/create-agent/steps/step-05-name.md +2 -2
- package/src/modules/bmb/workflows/create-agent/steps/step-06-build.md +3 -3
- package/src/modules/bmb/workflows/create-agent/steps/step-07-validate.md +3 -3
- package/src/modules/bmb/workflows/create-agent/steps/step-08-setup.md +2 -2
- package/src/modules/bmb/workflows/create-agent/steps/step-09-customize.md +3 -3
- package/src/modules/bmb/workflows/create-agent/steps/step-10-build-tools.md +2 -2
- package/src/modules/bmb/workflows/create-agent/steps/step-11-celebrate.md +2 -2
- package/src/modules/bmb/workflows/create-agent/workflow.md +11 -11
- package/src/modules/bmb/workflows/create-module/steps/step-01-init.md +155 -0
- package/src/modules/bmb/workflows/create-module/steps/step-01b-continue.md +169 -0
- package/src/modules/bmb/workflows/create-module/steps/step-02-concept.md +217 -0
- package/src/modules/bmb/workflows/create-module/steps/step-03-components.md +267 -0
- package/src/modules/bmb/workflows/create-module/steps/step-04-structure.md +228 -0
- package/src/modules/bmb/workflows/create-module/steps/step-05-config.md +233 -0
- package/src/modules/bmb/workflows/create-module/steps/step-06-agents.md +296 -0
- package/src/modules/bmb/workflows/create-module/steps/step-07-workflows.md +228 -0
- package/src/modules/bmb/workflows/create-module/steps/step-08-installer.md +186 -0
- package/src/modules/bmb/workflows/create-module/steps/step-09-documentation.md +309 -0
- package/src/modules/bmb/workflows/create-module/steps/step-10-roadmap.md +337 -0
- package/src/modules/bmb/workflows/create-module/steps/step-11-validate.md +335 -0
- package/src/modules/bmb/workflows/create-module/templates/agent.template.md +317 -0
- package/src/modules/bmb/workflows/create-module/templates/installer.template.js +47 -0
- package/src/modules/bmb/workflows/create-module/templates/module-plan.template.md +5 -0
- package/src/modules/bmb/workflows/create-module/templates/module.template.yaml +53 -0
- package/src/modules/bmb/workflows/create-module/templates/workflow-plan-template.md +23 -0
- package/src/modules/bmb/workflows/create-module/validation.md +126 -0
- package/src/modules/bmb/workflows/create-module/workflow.md +55 -0
- package/src/modules/bmb/workflows/create-workflow/steps/step-01-init.md +45 -56
- package/src/modules/bmb/workflows/create-workflow/steps/step-02-gather.md +9 -31
- package/src/modules/bmb/workflows/create-workflow/steps/step-03-tools-configuration.md +250 -0
- package/src/modules/bmb/workflows/create-workflow/steps/step-04-plan-review.md +216 -0
- package/src/modules/bmb/workflows/create-workflow/steps/step-05-output-format-design.md +289 -0
- package/src/modules/bmb/workflows/create-workflow/steps/{step-09-design.md → step-06-design.md} +76 -44
- package/src/modules/bmb/workflows/create-workflow/steps/{step-11-build.md → step-07-build.md} +71 -25
- package/src/modules/bmb/workflows/create-workflow/steps/{step-12-review.md → step-08-review.md} +30 -16
- package/src/modules/bmb/workflows/create-workflow/steps/step-09-complete.md +187 -0
- package/src/modules/bmb/workflows/create-workflow/workflow.md +2 -2
- package/src/modules/bmb/workflows/edit-agent/steps/step-01-discover-intent.md +2 -2
- package/src/modules/bmb/workflows/edit-agent/steps/step-02-analyze-agent.md +14 -14
- package/src/modules/bmb/workflows/edit-agent/steps/step-03-propose-changes.md +4 -4
- package/src/modules/bmb/workflows/edit-agent/steps/step-04-apply-changes.md +2 -2
- package/src/modules/bmb/workflows/edit-agent/steps/step-05-validate.md +4 -4
- package/src/modules/bmb/workflows/edit-agent/workflow.md +1 -1
- package/src/modules/bmb/workflows/edit-workflow/steps/step-01-analyze.md +2 -6
- package/src/modules/bmb/workflows/edit-workflow/steps/step-03-improve.md +2 -2
- package/src/modules/bmb/workflows/edit-workflow/steps/step-04-validate.md +1 -1
- package/src/modules/bmb/workflows/edit-workflow/workflow.md +1 -1
- package/src/modules/bmb/workflows/workflow-compliance-check/steps/step-01-validate-goal.md +2 -2
- package/src/modules/bmb/workflows/workflow-compliance-check/steps/step-02-workflow-validation.md +5 -5
- package/src/modules/bmb/workflows/workflow-compliance-check/steps/step-03-step-validation.md +7 -7
- package/src/modules/bmb/workflows/workflow-compliance-check/steps/step-04-file-validation.md +3 -3
- package/src/modules/bmb/workflows/workflow-compliance-check/steps/step-05-intent-spectrum-validation.md +3 -3
- package/src/modules/bmb/workflows/workflow-compliance-check/steps/step-06-web-subprocess-validation.md +3 -3
- package/src/modules/bmb/workflows/workflow-compliance-check/steps/step-07-holistic-analysis.md +3 -3
- package/src/modules/bmb/workflows/workflow-compliance-check/steps/step-08-generate-report.md +2 -2
- package/src/modules/bmb/workflows/workflow-compliance-check/workflow.md +1 -1
- package/src/modules/bmb/workflows-legacy/edit-module/checklist.md +0 -1
- package/src/modules/bmgd/README.md +2 -1
- package/src/modules/bmgd/workflows/3-technical/game-architecture/instructions.md +8 -8
- package/src/modules/bmm/_module-installer/installer.js +1 -1
- package/src/modules/bmm/_module-installer/platform-specifics/claude-code.js +1 -1
- package/src/modules/bmm/_module-installer/platform-specifics/windsurf.js +1 -1
- package/src/modules/bmm/agents/analyst.agent.yaml +11 -8
- package/src/modules/bmm/agents/architect.agent.yaml +1 -5
- package/src/modules/bmm/agents/pm.agent.yaml +5 -5
- package/src/modules/bmm/docs/README.md +23 -1
- package/src/modules/bmm/docs/agents-guide.md +16 -35
- package/src/modules/bmm/docs/brownfield-guide.md +17 -30
- package/src/modules/bmm/docs/enterprise-agentic-development.md +2 -2
- package/src/modules/bmm/docs/faq.md +6 -39
- package/src/modules/bmm/docs/glossary.md +11 -24
- package/src/modules/bmm/docs/images/README.md +37 -0
- package/src/modules/bmm/docs/images/workflow-method-greenfield.excalidraw +62 -202
- package/src/modules/bmm/docs/images/workflow-method-greenfield.svg +3 -1
- package/src/modules/bmm/docs/quick-spec-flow.md +652 -0
- package/src/modules/bmm/docs/quick-start.md +9 -25
- package/src/modules/bmm/docs/test-architecture.md +6 -6
- package/src/modules/bmm/docs/troubleshooting.md +680 -0
- package/src/modules/bmm/docs/workflow-document-project-reference.md +1 -1
- package/src/modules/bmm/docs/workflows-implementation.md +143 -3
- package/src/modules/bmm/docs/workflows-solutioning.md +2 -2
- package/src/modules/bmm/{_module-installer/install-config.yaml → module.yaml} +1 -1
- package/src/modules/bmm/tasks/daily-standup.xml +85 -0
- package/src/modules/bmm/testarch/knowledge/ci-burn-in.md +1 -1
- package/src/modules/bmm/testarch/knowledge/overview.md +1 -1
- package/src/modules/bmm/workflows/1-analysis/product-brief/steps/step-02-vision.md +2 -2
- package/src/modules/bmm/workflows/1-analysis/product-brief/steps/step-03-users.md +2 -2
- package/src/modules/bmm/workflows/1-analysis/product-brief/steps/step-04-metrics.md +2 -2
- package/src/modules/bmm/workflows/1-analysis/product-brief/steps/step-05-scope.md +2 -2
- package/src/modules/bmm/workflows/1-analysis/product-brief/workflow.md +1 -1
- package/src/modules/bmm/workflows/1-analysis/research/domain-steps/step-01-init.md +8 -8
- package/src/modules/bmm/workflows/1-analysis/research/domain-steps/step-02-domain-analysis.md +18 -18
- package/src/modules/bmm/workflows/1-analysis/research/domain-steps/step-03-competitive-landscape.md +18 -18
- package/src/modules/bmm/workflows/1-analysis/research/domain-steps/step-04-regulatory-focus.md +18 -18
- package/src/modules/bmm/workflows/1-analysis/research/domain-steps/step-05-technical-trends.md +17 -17
- package/src/modules/bmm/workflows/1-analysis/research/domain-steps/step-06-research-synthesis.md +35 -36
- package/src/modules/bmm/workflows/1-analysis/research/market-steps/step-01-init.md +5 -6
- package/src/modules/bmm/workflows/1-analysis/research/market-steps/step-02-customer-behavior.md +20 -19
- package/src/modules/bmm/workflows/1-analysis/research/market-steps/step-02-customer-insights.md +21 -20
- package/src/modules/bmm/workflows/1-analysis/research/market-steps/step-03-customer-pain-points.md +20 -19
- package/src/modules/bmm/workflows/1-analysis/research/market-steps/step-04-customer-decisions.md +21 -20
- package/src/modules/bmm/workflows/1-analysis/research/market-steps/step-05-competitive-analysis.md +16 -15
- package/src/modules/bmm/workflows/1-analysis/research/market-steps/step-06-research-completion.md +36 -37
- package/src/modules/bmm/workflows/1-analysis/research/research.template.md +0 -1
- package/src/modules/bmm/workflows/1-analysis/research/technical-steps/step-01-init.md +8 -8
- package/src/modules/bmm/workflows/1-analysis/research/technical-steps/step-02-technical-overview.md +19 -18
- package/src/modules/bmm/workflows/1-analysis/research/technical-steps/step-03-integration-patterns.md +20 -19
- package/src/modules/bmm/workflows/1-analysis/research/technical-steps/step-04-architectural-patterns.md +21 -20
- package/src/modules/bmm/workflows/1-analysis/research/technical-steps/step-05-implementation-research.md +19 -18
- package/src/modules/bmm/workflows/1-analysis/research/technical-steps/step-06-research-synthesis.md +38 -39
- package/src/modules/bmm/workflows/1-analysis/research/workflow.md +14 -8
- package/src/modules/bmm/workflows/2-plan-workflows/create-ux-design/workflow.md +6 -0
- package/src/modules/bmm/workflows/2-plan-workflows/prd/prd-template.md +7 -0
- package/src/modules/bmm/workflows/2-plan-workflows/prd/steps/step-01-init.md +138 -56
- package/src/modules/bmm/workflows/2-plan-workflows/prd/steps/step-01b-continue.md +93 -51
- package/src/modules/bmm/workflows/2-plan-workflows/prd/steps/step-02-discovery.md +223 -78
- package/src/modules/bmm/workflows/2-plan-workflows/prd/steps/step-03-success.md +20 -2
- package/src/modules/bmm/workflows/2-plan-workflows/prd/steps/step-04-journeys.md +18 -0
- package/src/modules/bmm/workflows/2-plan-workflows/prd/steps/step-05-domain.md +21 -0
- package/src/modules/bmm/workflows/2-plan-workflows/prd/steps/step-06-innovation.md +21 -0
- package/src/modules/bmm/workflows/2-plan-workflows/prd/steps/step-07-project-type.md +21 -0
- package/src/modules/bmm/workflows/2-plan-workflows/prd/steps/step-08-scoping.md +18 -0
- package/src/modules/bmm/workflows/2-plan-workflows/prd/steps/step-09-functional.md +18 -0
- package/src/modules/bmm/workflows/2-plan-workflows/prd/steps/step-10-nonfunctional.md +18 -0
- package/src/modules/bmm/workflows/2-plan-workflows/prd/steps/step-11-complete.md +13 -0
- package/src/modules/bmm/workflows/2-plan-workflows/prd/workflow.md +2 -2
- package/src/modules/bmm/workflows/3-solutioning/architecture/steps/step-03-starter.md +14 -14
- package/src/modules/bmm/workflows/3-solutioning/architecture/steps/step-04-decisions.md +7 -7
- package/src/modules/bmm/workflows/3-solutioning/architecture/workflow.md +2 -1
- package/src/modules/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-01-validate-prerequisites.md +258 -0
- package/src/modules/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-02-design-epics.md +232 -0
- package/src/modules/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-03-create-stories.md +271 -0
- package/src/modules/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-04-final-validation.md +144 -0
- package/src/modules/bmm/workflows/3-solutioning/create-epics-and-stories/templates/epics-template.md +57 -0
- package/src/modules/bmm/workflows/3-solutioning/create-epics-and-stories/workflow.md +58 -0
- package/src/modules/bmm/workflows/3-solutioning/implementation-readiness/steps/step-01-document-discovery.md +189 -0
- package/src/modules/bmm/workflows/3-solutioning/implementation-readiness/steps/step-02-prd-analysis.md +177 -0
- package/src/modules/bmm/workflows/3-solutioning/implementation-readiness/steps/step-03-epic-coverage-validation.md +178 -0
- package/src/modules/bmm/workflows/3-solutioning/implementation-readiness/steps/step-04-ux-alignment.md +138 -0
- package/src/modules/bmm/workflows/3-solutioning/implementation-readiness/steps/step-05-epic-quality-review.md +251 -0
- package/src/modules/bmm/workflows/3-solutioning/implementation-readiness/steps/step-06-final-assessment.md +132 -0
- package/src/modules/bmm/workflows/3-solutioning/implementation-readiness/templates/readiness-report-template.md +4 -0
- package/src/modules/bmm/workflows/3-solutioning/implementation-readiness/workflow.md +54 -0
- package/src/modules/{bmgd/workflows/4-production → bmm/workflows/4-implementation}/code-review/checklist.md +2 -1
- package/src/modules/bmm/workflows/4-implementation/code-review/instructions.xml +51 -3
- package/src/modules/bmm/workflows/4-implementation/code-review/workflow.yaml +1 -1
- package/src/modules/bmm/workflows/4-implementation/create-story/instructions.xml +32 -2
- package/src/modules/bmm/workflows/4-implementation/retrospective/instructions.md +3 -3
- package/src/modules/bmm/workflows/4-implementation/sprint-planning/instructions.md +19 -21
- package/src/modules/bmm/workflows/4-implementation/sprint-planning/sprint-status-template.yaml +10 -10
- package/src/modules/bmm/workflows/4-implementation/sprint-status/instructions.md +174 -0
- package/src/modules/bmm/workflows/4-implementation/sprint-status/workflow.yaml +35 -0
- package/src/modules/bmm/workflows/bmad-quick-flow/quick-dev/instructions.md +104 -7
- package/src/modules/bmm/workflows/bmad-quick-flow/quick-dev/workflow.yaml +4 -0
- package/src/modules/bmm/workflows/document-project/instructions.md +1 -1
- package/src/modules/bmm/workflows/document-project/workflows/deep-dive-instructions.md +2 -2
- package/src/modules/bmm/workflows/generate-project-context/workflow.md +1 -1
- package/src/modules/bmm/workflows/testarch/atdd/atdd-checklist-template.md +1 -1
- package/src/modules/bmm/workflows/testarch/ci/checklist.md +1 -1
- package/src/modules/bmm/workflows/testarch/ci/github-actions-template.yaml +36 -3
- package/src/modules/bmm/workflows/testarch/ci/gitlab-ci-template.yaml +25 -4
- package/src/modules/bmm/workflows/testarch/ci/instructions.md +2 -2
- package/src/modules/bmm/workflows/testarch/test-review/instructions.md +1 -1
- package/src/modules/bmm/workflows/workflow-status/paths/enterprise-brownfield.yaml +1 -6
- package/src/modules/bmm/workflows/workflow-status/paths/enterprise-greenfield.yaml +1 -6
- package/src/modules/bmm/workflows/workflow-status/paths/method-brownfield.yaml +1 -6
- package/src/modules/bmm/workflows/workflow-status/paths/method-greenfield.yaml +1 -7
- package/src/modules/cis/_module-installer/installer.js +1 -1
- package/tools/cli/README.md +7 -7
- package/tools/cli/commands/build.js +9 -184
- package/tools/cli/commands/install.js +1 -6
- package/tools/cli/installers/lib/core/config-collector.js +80 -12
- package/tools/cli/installers/lib/core/custom-module-cache.js +239 -0
- package/tools/cli/installers/lib/core/detector.js +8 -4
- package/tools/cli/installers/lib/core/installer.js +933 -376
- package/tools/cli/installers/lib/core/manifest-generator.js +265 -41
- package/tools/cli/installers/lib/core/manifest.js +47 -0
- package/tools/cli/installers/lib/core/post-install-sidecar-replacement.js +79 -0
- package/tools/cli/installers/lib/custom/handler.js +396 -0
- package/tools/cli/installers/lib/ide/_base-ide.js +10 -0
- package/tools/cli/installers/lib/ide/auggie.js +19 -7
- package/tools/cli/installers/lib/ide/crush.js +19 -6
- package/tools/cli/installers/lib/ide/cursor.js +29 -13
- package/tools/cli/installers/lib/ide/gemini.js +49 -1
- package/tools/cli/installers/lib/ide/iflow.js +20 -1
- package/tools/cli/installers/lib/ide/kiro-cli.js +327 -0
- package/tools/cli/installers/lib/ide/opencode.js +3 -3
- package/tools/cli/installers/lib/ide/roo.js +120 -184
- package/tools/cli/installers/lib/ide/rovo-dev.js +1 -1
- package/tools/cli/installers/lib/ide/shared/agent-command-generator.js +8 -2
- package/tools/cli/installers/lib/ide/shared/bmad-artifacts.js +34 -19
- package/tools/cli/installers/lib/ide/shared/workflow-command-generator.js +18 -14
- package/tools/cli/installers/lib/ide/templates/agent-command-template.md +1 -1
- package/tools/cli/installers/lib/ide/templates/workflow-commander.md +5 -0
- package/tools/cli/installers/lib/modules/manager.js +535 -56
- package/tools/cli/lib/agent/compiler.js +57 -16
- package/tools/cli/lib/agent/installer.js +129 -28
- package/tools/cli/lib/cli-utils.js +21 -4
- package/tools/cli/lib/config.js +2 -1
- package/tools/cli/lib/ui.js +561 -12
- package/tools/cli/lib/yaml-xml-builder.js +0 -15
- package/tools/maintainer/review-pr-README.md +55 -0
- package/tools/maintainer/review-pr.md +242 -0
- package/tools/migrate-custom-module-paths.js +124 -0
- package/tools/schema/agent.js +149 -89
- package/tools/validate-svg-changes.sh +356 -0
- package/custom/src/agents/commit-poet/installation-guide.md +0 -36
- package/custom/src/agents/toolsmith/installation-guide.md +0 -36
- package/docs/custom-agent-installation.md +0 -183
- package/src/modules/bmb/docs/workflows/workflow-template.md +0 -152
- package/src/modules/bmb/workflows/create-workflow/steps/step-03-tools-overview.md +0 -127
- package/src/modules/bmb/workflows/create-workflow/steps/step-04-core-tools.md +0 -145
- package/src/modules/bmb/workflows/create-workflow/steps/step-05-memory-requirements.md +0 -136
- package/src/modules/bmb/workflows/create-workflow/steps/step-06-external-tools.md +0 -154
- package/src/modules/bmb/workflows/create-workflow/steps/step-07-installation-guidance.md +0 -159
- package/src/modules/bmb/workflows/create-workflow/steps/step-08-tools-summary.md +0 -167
- package/src/modules/bmb/workflows/create-workflow/steps/step-10-plan-review.md +0 -215
- package/src/modules/bmb/workflows/create-workflow/templates/build-summary.md +0 -36
- package/src/modules/bmb/workflows/create-workflow/templates/completion-section.md +0 -39
- package/src/modules/bmb/workflows/create-workflow/templates/content-template.md +0 -21
- package/src/modules/bmb/workflows/create-workflow/templates/design-section.md +0 -53
- package/src/modules/bmb/workflows/create-workflow/templates/project-info.md +0 -18
- package/src/modules/bmb/workflows/create-workflow/templates/requirements-section.md +0 -47
- package/src/modules/bmb/workflows/create-workflow/templates/review-section.md +0 -56
- package/src/modules/bmb/workflows/create-workflow/templates/workflow-plan.md +0 -54
- package/src/modules/bmb/workflows-legacy/create-module/README.md +0 -229
- package/src/modules/bmb/workflows-legacy/create-module/brainstorm-context.md +0 -137
- package/src/modules/bmb/workflows-legacy/create-module/checklist.md +0 -235
- package/src/modules/bmb/workflows-legacy/create-module/installer-templates/install-config.yaml +0 -92
- package/src/modules/bmb/workflows-legacy/create-module/installer-templates/installer.js +0 -231
- package/src/modules/bmb/workflows-legacy/create-module/instructions.md +0 -577
- package/src/modules/bmb/workflows-legacy/create-module/module-structure.md +0 -400
- package/src/modules/bmb/workflows-legacy/create-module/workflow.yaml +0 -52
- package/src/modules/bmm/workflows/3-solutioning/create-epics-and-stories/epics-template.md +0 -80
- package/src/modules/bmm/workflows/3-solutioning/create-epics-and-stories/instructions.md +0 -387
- package/src/modules/bmm/workflows/3-solutioning/create-epics-and-stories/workflow.yaml +0 -53
- package/src/modules/bmm/workflows/3-solutioning/implementation-readiness/checklist.md +0 -169
- package/src/modules/bmm/workflows/3-solutioning/implementation-readiness/instructions.md +0 -332
- package/src/modules/bmm/workflows/3-solutioning/implementation-readiness/template.md +0 -146
- package/src/modules/bmm/workflows/3-solutioning/implementation-readiness/workflow.yaml +0 -64
- package/tools/cli/commands/agent-install.js +0 -409
- package/tools/cli/commands/cleanup.js +0 -141
- /package/{custom/src → example-custom-content}/agents/toolsmith/toolsmith-sidecar/knowledge/bundlers.md +0 -0
- /package/{custom/src → example-custom-content}/agents/toolsmith/toolsmith-sidecar/knowledge/deploy.md +0 -0
- /package/{custom/src → example-custom-content}/agents/toolsmith/toolsmith-sidecar/knowledge/tests.md +0 -0
- /package/src/modules/bmgd/{_module-installer/install-config.yaml → module.yaml} +0 -0
- /package/src/modules/cis/{_module-installer/install-config.yaml → module.yaml} +0 -0
package/tools/schema/agent.js
CHANGED
|
@@ -75,27 +75,41 @@ function agentSchema(options = {}) {
|
|
|
75
75
|
}
|
|
76
76
|
// Handle multi format with triggers array (new format)
|
|
77
77
|
else if (item.triggers && Array.isArray(item.triggers)) {
|
|
78
|
-
for (const
|
|
79
|
-
|
|
80
|
-
|
|
78
|
+
for (const [triggerIndex, triggerItem] of item.triggers.entries()) {
|
|
79
|
+
let triggerName = null;
|
|
80
|
+
|
|
81
|
+
// Extract trigger name from all three formats
|
|
82
|
+
if (triggerItem.trigger) {
|
|
83
|
+
// Format 1: Simple flat format with trigger field
|
|
84
|
+
triggerName = triggerItem.trigger;
|
|
85
|
+
} else {
|
|
86
|
+
// Format 2a or 2b: Object-key format
|
|
87
|
+
const keys = Object.keys(triggerItem);
|
|
88
|
+
if (keys.length === 1 && keys[0] !== 'trigger') {
|
|
89
|
+
triggerName = keys[0];
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
if (triggerName) {
|
|
94
|
+
if (!TRIGGER_PATTERN.test(triggerName)) {
|
|
81
95
|
ctx.addIssue({
|
|
82
96
|
code: 'custom',
|
|
83
|
-
path: ['agent', 'menu', index, 'triggers'],
|
|
84
|
-
message: `agent.menu[].triggers
|
|
97
|
+
path: ['agent', 'menu', index, 'triggers', triggerIndex],
|
|
98
|
+
message: `agent.menu[].triggers[] must be kebab-case (lowercase words separated by hyphen) - got "${triggerName}"`,
|
|
85
99
|
});
|
|
86
100
|
return;
|
|
87
101
|
}
|
|
88
102
|
|
|
89
|
-
if (seenTriggers.has(
|
|
103
|
+
if (seenTriggers.has(triggerName)) {
|
|
90
104
|
ctx.addIssue({
|
|
91
105
|
code: 'custom',
|
|
92
|
-
path: ['agent', 'menu', index, 'triggers'],
|
|
93
|
-
message: `agent.menu[].triggers
|
|
106
|
+
path: ['agent', 'menu', index, 'triggers', triggerIndex],
|
|
107
|
+
message: `agent.menu[].triggers[] duplicates "${triggerName}" within the same agent`,
|
|
94
108
|
});
|
|
95
109
|
return;
|
|
96
110
|
}
|
|
97
111
|
|
|
98
|
-
seenTriggers.add(
|
|
112
|
+
seenTriggers.add(triggerName);
|
|
99
113
|
}
|
|
100
114
|
}
|
|
101
115
|
}
|
|
@@ -250,101 +264,147 @@ function buildMenuItemSchema() {
|
|
|
250
264
|
.object({
|
|
251
265
|
multi: createNonEmptyString('agent.menu[].multi'),
|
|
252
266
|
triggers: z
|
|
253
|
-
.array(
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
267
|
+
.array(
|
|
268
|
+
z.union([
|
|
269
|
+
// Format 1: Simple flat format (has trigger field)
|
|
270
|
+
z
|
|
271
|
+
.object({
|
|
272
|
+
trigger: z.string(),
|
|
273
|
+
input: createNonEmptyString('agent.menu[].triggers[].input'),
|
|
274
|
+
route: createNonEmptyString('agent.menu[].triggers[].route').optional(),
|
|
275
|
+
action: createNonEmptyString('agent.menu[].triggers[].action').optional(),
|
|
276
|
+
data: z.string().optional(),
|
|
277
|
+
type: z.enum(['exec', 'action', 'workflow']).optional(),
|
|
278
|
+
})
|
|
279
|
+
.strict()
|
|
280
|
+
.refine((data) => data.trigger, { message: 'Must have trigger field' })
|
|
281
|
+
.superRefine((value, ctx) => {
|
|
282
|
+
// Must have either route or action (or both)
|
|
283
|
+
if (!value.route && !value.action) {
|
|
284
|
+
ctx.addIssue({
|
|
285
|
+
code: 'custom',
|
|
286
|
+
message: 'agent.menu[].triggers[] must have either route or action (or both)',
|
|
287
|
+
});
|
|
288
|
+
}
|
|
289
|
+
}),
|
|
290
|
+
// Format 2a: Object with array format (like bmad-builder.agent.yaml)
|
|
291
|
+
z
|
|
292
|
+
.object({})
|
|
293
|
+
.passthrough()
|
|
294
|
+
.refine(
|
|
295
|
+
(value) => {
|
|
296
|
+
const keys = Object.keys(value);
|
|
297
|
+
if (keys.length !== 1) return false;
|
|
298
|
+
const triggerItems = value[keys[0]];
|
|
299
|
+
return Array.isArray(triggerItems);
|
|
300
|
+
},
|
|
301
|
+
{ message: 'Must be object with single key pointing to array' },
|
|
302
|
+
)
|
|
303
|
+
.superRefine((value, ctx) => {
|
|
304
|
+
const triggerName = Object.keys(value)[0];
|
|
305
|
+
const triggerItems = value[triggerName];
|
|
306
|
+
|
|
307
|
+
if (!Array.isArray(triggerItems)) {
|
|
308
|
+
ctx.addIssue({
|
|
309
|
+
code: 'custom',
|
|
310
|
+
message: `Trigger "${triggerName}" must be an array of items`,
|
|
311
|
+
});
|
|
312
|
+
return;
|
|
313
|
+
}
|
|
262
314
|
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
}
|
|
315
|
+
// Check required fields in the array
|
|
316
|
+
const hasInput = triggerItems.some((item) => 'input' in item);
|
|
317
|
+
const hasRouteOrAction = triggerItems.some((item) => 'route' in item || 'action' in item);
|
|
267
318
|
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
319
|
+
if (!hasInput) {
|
|
320
|
+
ctx.addIssue({
|
|
321
|
+
code: 'custom',
|
|
322
|
+
message: `Trigger "${triggerName}" must have an input field`,
|
|
323
|
+
});
|
|
324
|
+
}
|
|
271
325
|
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
326
|
+
if (!hasRouteOrAction) {
|
|
327
|
+
ctx.addIssue({
|
|
328
|
+
code: 'custom',
|
|
329
|
+
message: `Trigger "${triggerName}" must have a route or action field`,
|
|
330
|
+
});
|
|
331
|
+
}
|
|
332
|
+
}),
|
|
333
|
+
// Format 2b: Object with direct fields (like analyst.agent.yaml)
|
|
334
|
+
z
|
|
335
|
+
.object({})
|
|
336
|
+
.passthrough()
|
|
337
|
+
.refine(
|
|
338
|
+
(value) => {
|
|
339
|
+
const keys = Object.keys(value);
|
|
340
|
+
if (keys.length !== 1) return false;
|
|
341
|
+
const triggerFields = value[keys[0]];
|
|
342
|
+
return !Array.isArray(triggerFields) && typeof triggerFields === 'object';
|
|
343
|
+
},
|
|
344
|
+
{ message: 'Must be object with single key pointing to object' },
|
|
345
|
+
)
|
|
346
|
+
.superRefine((value, ctx) => {
|
|
347
|
+
const triggerName = Object.keys(value)[0];
|
|
348
|
+
const triggerFields = value[triggerName];
|
|
349
|
+
|
|
350
|
+
// Check required fields
|
|
351
|
+
if (!triggerFields.input || typeof triggerFields.input !== 'string') {
|
|
352
|
+
ctx.addIssue({
|
|
353
|
+
code: 'custom',
|
|
354
|
+
message: `Trigger "${triggerName}" must have an input field`,
|
|
355
|
+
});
|
|
356
|
+
}
|
|
275
357
|
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
{
|
|
285
|
-
message: 'agent.menu[].triggers must be an array of trigger objects with input and either route/action or TODO',
|
|
286
|
-
},
|
|
358
|
+
if (!triggerFields.route && !triggerFields.action) {
|
|
359
|
+
ctx.addIssue({
|
|
360
|
+
code: 'custom',
|
|
361
|
+
message: `Trigger "${triggerName}" must have a route or action field`,
|
|
362
|
+
});
|
|
363
|
+
}
|
|
364
|
+
}),
|
|
365
|
+
]),
|
|
287
366
|
)
|
|
288
|
-
.
|
|
289
|
-
// Validate and clean up the triggers
|
|
290
|
-
for (const trigger of triggers) {
|
|
291
|
-
const keys = Object.keys(trigger);
|
|
292
|
-
if (keys.length !== 1) {
|
|
293
|
-
throw new Error('Each trigger object must have exactly one key');
|
|
294
|
-
}
|
|
295
|
-
|
|
296
|
-
const execArray = trigger[keys[0]];
|
|
297
|
-
if (!Array.isArray(execArray)) {
|
|
298
|
-
throw new TypeError(`Trigger "${keys[0]}" must be an array`);
|
|
299
|
-
}
|
|
300
|
-
|
|
301
|
-
// Validate each item in the exec array
|
|
302
|
-
for (const item of execArray) {
|
|
303
|
-
if ('input' in item && typeof item.input !== 'string') {
|
|
304
|
-
throw new Error('Input must be a string');
|
|
305
|
-
}
|
|
306
|
-
if ('route' in item && typeof item.route !== 'string' && item.route !== 'TODO') {
|
|
307
|
-
throw new Error('Route must be a string or TODO');
|
|
308
|
-
}
|
|
309
|
-
if ('type' in item && !['exec', 'action', 'workflow', 'TODO'].includes(item.type)) {
|
|
310
|
-
throw new Error('Type must be one of: exec, action, workflow, TODO');
|
|
311
|
-
}
|
|
312
|
-
}
|
|
313
|
-
}
|
|
314
|
-
return triggers;
|
|
315
|
-
}),
|
|
367
|
+
.min(1, { message: 'agent.menu[].triggers must have at least one trigger' }),
|
|
316
368
|
discussion: z.boolean().optional(),
|
|
317
369
|
})
|
|
318
370
|
.strict()
|
|
319
371
|
.superRefine((value, ctx) => {
|
|
320
|
-
//
|
|
321
|
-
const
|
|
322
|
-
for (const
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
372
|
+
// Check for duplicate trigger names
|
|
373
|
+
const seenTriggers = new Set();
|
|
374
|
+
for (const [index, triggerItem] of value.triggers.entries()) {
|
|
375
|
+
let triggerName = null;
|
|
376
|
+
|
|
377
|
+
// Extract trigger name from either format
|
|
378
|
+
if (triggerItem.trigger) {
|
|
379
|
+
// Format 1
|
|
380
|
+
triggerName = triggerItem.trigger;
|
|
381
|
+
} else {
|
|
382
|
+
// Format 2
|
|
383
|
+
const keys = Object.keys(triggerItem);
|
|
384
|
+
if (keys.length === 1) {
|
|
385
|
+
triggerName = keys[0];
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
if (triggerName) {
|
|
390
|
+
if (seenTriggers.has(triggerName)) {
|
|
328
391
|
ctx.addIssue({
|
|
329
392
|
code: 'custom',
|
|
330
|
-
path: ['agent', 'menu', 'triggers'],
|
|
331
|
-
message: `Trigger
|
|
393
|
+
path: ['agent', 'menu', 'triggers', index],
|
|
394
|
+
message: `Trigger name "${triggerName}" is duplicated`,
|
|
332
395
|
});
|
|
333
396
|
}
|
|
334
|
-
|
|
335
|
-
}
|
|
397
|
+
seenTriggers.add(triggerName);
|
|
336
398
|
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
});
|
|
399
|
+
// Validate trigger name format
|
|
400
|
+
if (!TRIGGER_PATTERN.test(triggerName)) {
|
|
401
|
+
ctx.addIssue({
|
|
402
|
+
code: 'custom',
|
|
403
|
+
path: ['agent', 'menu', 'triggers', index],
|
|
404
|
+
message: `Trigger name "${triggerName}" must be kebab-case (lowercase words separated by hyphen)`,
|
|
405
|
+
});
|
|
406
|
+
}
|
|
346
407
|
}
|
|
347
|
-
seenTriggers.add(triggerKey);
|
|
348
408
|
}
|
|
349
409
|
});
|
|
350
410
|
|
|
@@ -0,0 +1,356 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
#
|
|
3
|
+
# Visual SVG Validation Script
|
|
4
|
+
#
|
|
5
|
+
# Compares old vs new SVG files using browser-accurate rendering (Playwright)
|
|
6
|
+
# and pixel-level comparison (ImageMagick), then generates a prompt for AI analysis.
|
|
7
|
+
#
|
|
8
|
+
# Usage: ./tools/validate-svg-changes.sh <path-to-svg>
|
|
9
|
+
#
|
|
10
|
+
|
|
11
|
+
set -e
|
|
12
|
+
|
|
13
|
+
SVG_FILE="${1:-src/modules/bmm/docs/images/workflow-method-greenfield.svg}"
|
|
14
|
+
TMP_DIR="/tmp/svg-validation-$$"
|
|
15
|
+
|
|
16
|
+
echo "🎨 Visual SVG Validation"
|
|
17
|
+
echo ""
|
|
18
|
+
|
|
19
|
+
# Check if file exists
|
|
20
|
+
if [ ! -f "$SVG_FILE" ]; then
|
|
21
|
+
echo "❌ Error: SVG file not found: $SVG_FILE"
|
|
22
|
+
exit 1
|
|
23
|
+
fi
|
|
24
|
+
|
|
25
|
+
# Check for ImageMagick
|
|
26
|
+
if ! command -v magick &> /dev/null; then
|
|
27
|
+
echo "❌ ImageMagick not found"
|
|
28
|
+
echo ""
|
|
29
|
+
echo "Install with:"
|
|
30
|
+
echo " brew install imagemagick"
|
|
31
|
+
echo ""
|
|
32
|
+
exit 1
|
|
33
|
+
fi
|
|
34
|
+
|
|
35
|
+
echo "✓ ImageMagick found"
|
|
36
|
+
|
|
37
|
+
# Check for Node.js
|
|
38
|
+
if ! command -v node &> /dev/null; then
|
|
39
|
+
echo "❌ Node.js not found"
|
|
40
|
+
exit 1
|
|
41
|
+
fi
|
|
42
|
+
|
|
43
|
+
echo "✓ Node.js found ($(node -v))"
|
|
44
|
+
|
|
45
|
+
# Check for Playwright (local install)
|
|
46
|
+
if [ ! -d "node_modules/playwright" ]; then
|
|
47
|
+
echo ""
|
|
48
|
+
echo "📦 Playwright not found locally"
|
|
49
|
+
echo "Installing Playwright (local to this project, no package.json changes)..."
|
|
50
|
+
echo ""
|
|
51
|
+
npm install --no-save playwright
|
|
52
|
+
echo ""
|
|
53
|
+
echo "✓ Playwright installed"
|
|
54
|
+
else
|
|
55
|
+
echo "✓ Playwright found"
|
|
56
|
+
fi
|
|
57
|
+
|
|
58
|
+
echo ""
|
|
59
|
+
echo "🔄 Rendering SVGs to PNG..."
|
|
60
|
+
echo ""
|
|
61
|
+
|
|
62
|
+
# Create temp directory
|
|
63
|
+
mkdir -p "$TMP_DIR"
|
|
64
|
+
|
|
65
|
+
# Extract old SVG from git
|
|
66
|
+
git show HEAD:"$SVG_FILE" > "$TMP_DIR/old.svg" 2>/dev/null || {
|
|
67
|
+
echo "❌ Could not extract old SVG from git HEAD"
|
|
68
|
+
echo " Make sure you have uncommitted changes to compare"
|
|
69
|
+
exit 1
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
# Copy new SVG
|
|
73
|
+
cp "$SVG_FILE" "$TMP_DIR/new.svg"
|
|
74
|
+
|
|
75
|
+
# Create Node.js renderer script in project directory (so it can find node_modules)
|
|
76
|
+
cat > "tools/render-svg-temp.js" << 'EOJS'
|
|
77
|
+
const { chromium } = require('playwright');
|
|
78
|
+
const fs = require('fs');
|
|
79
|
+
|
|
80
|
+
async function renderSVG(svgPath, pngPath) {
|
|
81
|
+
const browser = await chromium.launch({ headless: true });
|
|
82
|
+
const page = await browser.newPage();
|
|
83
|
+
|
|
84
|
+
const svgContent = fs.readFileSync(svgPath, 'utf8');
|
|
85
|
+
const widthMatch = svgContent.match(/width="([^"]+)"/);
|
|
86
|
+
const heightMatch = svgContent.match(/height="([^"]+)"/);
|
|
87
|
+
const width = Math.ceil(parseFloat(widthMatch[1]));
|
|
88
|
+
const height = Math.ceil(parseFloat(heightMatch[1]));
|
|
89
|
+
|
|
90
|
+
const html = `
|
|
91
|
+
<!DOCTYPE html>
|
|
92
|
+
<html>
|
|
93
|
+
<head>
|
|
94
|
+
<style>
|
|
95
|
+
body { margin: 0; padding: 0; background: white; }
|
|
96
|
+
svg { display: block; }
|
|
97
|
+
</style>
|
|
98
|
+
</head>
|
|
99
|
+
<body>${svgContent}</body>
|
|
100
|
+
</html>
|
|
101
|
+
`;
|
|
102
|
+
|
|
103
|
+
await page.setContent(html);
|
|
104
|
+
await page.setViewportSize({ width, height });
|
|
105
|
+
await page.waitForTimeout(1000);
|
|
106
|
+
await page.screenshot({ path: pngPath, fullPage: true });
|
|
107
|
+
await browser.close();
|
|
108
|
+
|
|
109
|
+
console.log(`✓ Rendered ${pngPath}`);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
(async () => {
|
|
113
|
+
await renderSVG(process.argv[2], process.argv[3]);
|
|
114
|
+
await renderSVG(process.argv[4], process.argv[5]);
|
|
115
|
+
})();
|
|
116
|
+
EOJS
|
|
117
|
+
|
|
118
|
+
# Render both SVGs (run from project dir so node_modules is accessible)
|
|
119
|
+
node tools/render-svg-temp.js \
|
|
120
|
+
"$TMP_DIR/old.svg" "$TMP_DIR/old.png" \
|
|
121
|
+
"$TMP_DIR/new.svg" "$TMP_DIR/new.png"
|
|
122
|
+
|
|
123
|
+
# Clean up temp script
|
|
124
|
+
rm tools/render-svg-temp.js
|
|
125
|
+
|
|
126
|
+
echo ""
|
|
127
|
+
echo "🔍 Comparing pixels..."
|
|
128
|
+
echo ""
|
|
129
|
+
|
|
130
|
+
# Compare using ImageMagick
|
|
131
|
+
DIFF_OUTPUT=$(magick compare -metric AE "$TMP_DIR/old.png" "$TMP_DIR/new.png" "$TMP_DIR/diff.png" 2>&1 || true)
|
|
132
|
+
DIFF_PIXELS=$(echo "$DIFF_OUTPUT" | awk '{print $1}')
|
|
133
|
+
|
|
134
|
+
# Get image dimensions
|
|
135
|
+
DIMENSIONS=$(magick identify -format "%wx%h" "$TMP_DIR/old.png")
|
|
136
|
+
WIDTH=$(echo "$DIMENSIONS" | cut -d'x' -f1)
|
|
137
|
+
HEIGHT=$(echo "$DIMENSIONS" | cut -d'x' -f2)
|
|
138
|
+
TOTAL_PIXELS=$((WIDTH * HEIGHT))
|
|
139
|
+
|
|
140
|
+
# Calculate percentage
|
|
141
|
+
DIFF_PERCENT=$(echo "scale=4; $DIFF_PIXELS / $TOTAL_PIXELS * 100" | bc)
|
|
142
|
+
|
|
143
|
+
echo "📊 Results:"
|
|
144
|
+
echo " Dimensions: ${WIDTH} × ${HEIGHT}"
|
|
145
|
+
echo " Total pixels: $(printf "%'d" $TOTAL_PIXELS)"
|
|
146
|
+
echo " Different pixels: $(printf "%'d" $DIFF_PIXELS)"
|
|
147
|
+
echo " Difference: ${DIFF_PERCENT}%"
|
|
148
|
+
echo ""
|
|
149
|
+
|
|
150
|
+
if (( $(echo "$DIFF_PERCENT < 0.01" | bc -l) )); then
|
|
151
|
+
echo "✅ ESSENTIALLY IDENTICAL (< 0.01% difference)"
|
|
152
|
+
VERDICT="essentially identical"
|
|
153
|
+
elif (( $(echo "$DIFF_PERCENT < 0.1" | bc -l) )); then
|
|
154
|
+
echo "⚠️ MINOR DIFFERENCES (< 0.1%)"
|
|
155
|
+
VERDICT="minor differences detected"
|
|
156
|
+
else
|
|
157
|
+
echo "❌ SIGNIFICANT DIFFERENCES (≥ 0.1%)"
|
|
158
|
+
VERDICT="significant differences detected"
|
|
159
|
+
fi
|
|
160
|
+
|
|
161
|
+
echo ""
|
|
162
|
+
echo "📁 Output files:"
|
|
163
|
+
echo " Old render: $TMP_DIR/old.png"
|
|
164
|
+
echo " New render: $TMP_DIR/new.png"
|
|
165
|
+
echo " Diff image: $TMP_DIR/diff.png"
|
|
166
|
+
echo ""
|
|
167
|
+
|
|
168
|
+
# Generate HTML comparison page
|
|
169
|
+
cat > "$TMP_DIR/comparison.html" << 'EOHTML'
|
|
170
|
+
<!DOCTYPE html>
|
|
171
|
+
<html>
|
|
172
|
+
<head>
|
|
173
|
+
<title>SVG Comparison</title>
|
|
174
|
+
<style>
|
|
175
|
+
* { margin: 0; padding: 0; box-sizing: border-box; }
|
|
176
|
+
body {
|
|
177
|
+
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
|
|
178
|
+
background: #f5f5f5;
|
|
179
|
+
padding: 20px;
|
|
180
|
+
}
|
|
181
|
+
.header {
|
|
182
|
+
background: white;
|
|
183
|
+
padding: 20px;
|
|
184
|
+
border-radius: 8px;
|
|
185
|
+
margin-bottom: 20px;
|
|
186
|
+
box-shadow: 0 2px 4px rgba(0,0,0,0.1);
|
|
187
|
+
}
|
|
188
|
+
h1 { margin-bottom: 10px; color: #333; }
|
|
189
|
+
.stats {
|
|
190
|
+
display: grid;
|
|
191
|
+
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
|
|
192
|
+
gap: 10px;
|
|
193
|
+
margin-top: 15px;
|
|
194
|
+
}
|
|
195
|
+
.stat {
|
|
196
|
+
background: #f8f9fa;
|
|
197
|
+
padding: 10px;
|
|
198
|
+
border-radius: 4px;
|
|
199
|
+
}
|
|
200
|
+
.stat-label { font-size: 12px; color: #666; text-transform: uppercase; }
|
|
201
|
+
.stat-value { font-size: 18px; font-weight: 600; color: #333; margin-top: 4px; }
|
|
202
|
+
.container {
|
|
203
|
+
display: grid;
|
|
204
|
+
grid-template-columns: 1fr 1fr 1fr;
|
|
205
|
+
gap: 20px;
|
|
206
|
+
margin-bottom: 20px;
|
|
207
|
+
}
|
|
208
|
+
.panel {
|
|
209
|
+
background: white;
|
|
210
|
+
padding: 20px;
|
|
211
|
+
border-radius: 8px;
|
|
212
|
+
box-shadow: 0 2px 4px rgba(0,0,0,0.1);
|
|
213
|
+
}
|
|
214
|
+
h2 {
|
|
215
|
+
margin: 0 0 15px 0;
|
|
216
|
+
color: #333;
|
|
217
|
+
font-size: 18px;
|
|
218
|
+
border-bottom: 2px solid #e0e0e0;
|
|
219
|
+
padding-bottom: 10px;
|
|
220
|
+
}
|
|
221
|
+
.image-container {
|
|
222
|
+
border: 1px solid #ddd;
|
|
223
|
+
background: white;
|
|
224
|
+
overflow: auto;
|
|
225
|
+
max-height: 600px;
|
|
226
|
+
}
|
|
227
|
+
img {
|
|
228
|
+
display: block;
|
|
229
|
+
max-width: 100%;
|
|
230
|
+
height: auto;
|
|
231
|
+
}
|
|
232
|
+
.verdict {
|
|
233
|
+
display: inline-block;
|
|
234
|
+
padding: 4px 12px;
|
|
235
|
+
border-radius: 12px;
|
|
236
|
+
font-size: 14px;
|
|
237
|
+
font-weight: 600;
|
|
238
|
+
}
|
|
239
|
+
.verdict.good { background: #d4edda; color: #155724; }
|
|
240
|
+
.verdict.warning { background: #fff3cd; color: #856404; }
|
|
241
|
+
.verdict.bad { background: #f8d7da; color: #721c24; }
|
|
242
|
+
</style>
|
|
243
|
+
</head>
|
|
244
|
+
<body>
|
|
245
|
+
<div class="header">
|
|
246
|
+
<h1>🎨 SVG Visual Comparison</h1>
|
|
247
|
+
<p><strong>File:</strong> FILENAME_PLACEHOLDER</p>
|
|
248
|
+
<div class="stats">
|
|
249
|
+
<div class="stat">
|
|
250
|
+
<div class="stat-label">Dimensions</div>
|
|
251
|
+
<div class="stat-value">DIMENSIONS_PLACEHOLDER</div>
|
|
252
|
+
</div>
|
|
253
|
+
<div class="stat">
|
|
254
|
+
<div class="stat-label">Different Pixels</div>
|
|
255
|
+
<div class="stat-value">DIFF_PIXELS_PLACEHOLDER</div>
|
|
256
|
+
</div>
|
|
257
|
+
<div class="stat">
|
|
258
|
+
<div class="stat-label">Difference</div>
|
|
259
|
+
<div class="stat-value">DIFF_PERCENT_PLACEHOLDER%</div>
|
|
260
|
+
</div>
|
|
261
|
+
<div class="stat">
|
|
262
|
+
<div class="stat-label">Verdict</div>
|
|
263
|
+
<div class="stat-value"><span class="verdict VERDICT_CLASS_PLACEHOLDER">VERDICT_PLACEHOLDER</span></div>
|
|
264
|
+
</div>
|
|
265
|
+
</div>
|
|
266
|
+
</div>
|
|
267
|
+
|
|
268
|
+
<div class="container">
|
|
269
|
+
<div class="panel">
|
|
270
|
+
<h2>📄 Old (HEAD)</h2>
|
|
271
|
+
<div class="image-container">
|
|
272
|
+
<img src="old.png" alt="Old SVG">
|
|
273
|
+
</div>
|
|
274
|
+
</div>
|
|
275
|
+
|
|
276
|
+
<div class="panel">
|
|
277
|
+
<h2>📝 New (Working)</h2>
|
|
278
|
+
<div class="image-container">
|
|
279
|
+
<img src="new.png" alt="New SVG">
|
|
280
|
+
</div>
|
|
281
|
+
</div>
|
|
282
|
+
|
|
283
|
+
<div class="panel">
|
|
284
|
+
<h2>🔍 Diff (Red = Changes)</h2>
|
|
285
|
+
<div class="image-container">
|
|
286
|
+
<img src="diff.png" alt="Diff">
|
|
287
|
+
</div>
|
|
288
|
+
</div>
|
|
289
|
+
</div>
|
|
290
|
+
</body>
|
|
291
|
+
</html>
|
|
292
|
+
EOHTML
|
|
293
|
+
|
|
294
|
+
# Determine verdict class for styling
|
|
295
|
+
if (( $(echo "$DIFF_PERCENT < 0.01" | bc -l) )); then
|
|
296
|
+
VERDICT_CLASS="good"
|
|
297
|
+
elif (( $(echo "$DIFF_PERCENT < 0.1" | bc -l) )); then
|
|
298
|
+
VERDICT_CLASS="warning"
|
|
299
|
+
else
|
|
300
|
+
VERDICT_CLASS="bad"
|
|
301
|
+
fi
|
|
302
|
+
|
|
303
|
+
# Replace placeholders in HTML
|
|
304
|
+
sed -i '' "s|FILENAME_PLACEHOLDER|$SVG_FILE|g" "$TMP_DIR/comparison.html"
|
|
305
|
+
sed -i '' "s|DIMENSIONS_PLACEHOLDER|${WIDTH} × ${HEIGHT}|g" "$TMP_DIR/comparison.html"
|
|
306
|
+
sed -i '' "s|DIFF_PIXELS_PLACEHOLDER|$(printf "%'d" $DIFF_PIXELS) / $(printf "%'d" $TOTAL_PIXELS)|g" "$TMP_DIR/comparison.html"
|
|
307
|
+
sed -i '' "s|DIFF_PERCENT_PLACEHOLDER|$DIFF_PERCENT|g" "$TMP_DIR/comparison.html"
|
|
308
|
+
sed -i '' "s|VERDICT_PLACEHOLDER|$VERDICT|g" "$TMP_DIR/comparison.html"
|
|
309
|
+
sed -i '' "s|VERDICT_CLASS_PLACEHOLDER|$VERDICT_CLASS|g" "$TMP_DIR/comparison.html"
|
|
310
|
+
|
|
311
|
+
echo "✓ Generated comparison page: $TMP_DIR/comparison.html"
|
|
312
|
+
echo ""
|
|
313
|
+
echo "🌐 Opening comparison in browser..."
|
|
314
|
+
open "$TMP_DIR/comparison.html"
|
|
315
|
+
echo ""
|
|
316
|
+
|
|
317
|
+
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
318
|
+
echo ""
|
|
319
|
+
echo "🤖 AI VISUAL ANALYSIS PROMPT"
|
|
320
|
+
echo ""
|
|
321
|
+
echo "Copy and paste this into Gemini/Claude with the diff image attached:"
|
|
322
|
+
echo ""
|
|
323
|
+
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
324
|
+
cat << PROMPT
|
|
325
|
+
|
|
326
|
+
I've made changes to an Excalidraw diagram SVG file. Please analyze the visual differences between the old and new versions.
|
|
327
|
+
|
|
328
|
+
**Automated Analysis:**
|
|
329
|
+
- Dimensions: ${WIDTH} × ${HEIGHT} pixels
|
|
330
|
+
- Different pixels: $(printf "%'d" $DIFF_PIXELS) out of $(printf "%'d" $TOTAL_PIXELS)
|
|
331
|
+
- Difference: ${DIFF_PERCENT}%
|
|
332
|
+
- Verdict: ${VERDICT}
|
|
333
|
+
|
|
334
|
+
**Attached Image:**
|
|
335
|
+
The attached image shows the pixel-level diff (red = differences).
|
|
336
|
+
|
|
337
|
+
**Questions:**
|
|
338
|
+
1. Are the differences purely anti-aliasing/rendering artifacts, or are there actual content changes?
|
|
339
|
+
2. If there are content changes, what specifically changed?
|
|
340
|
+
3. Do the changes align with the intent to remove zombie Excalidraw elements (elements marked as deleted but left in the JSON)?
|
|
341
|
+
4. Is this safe to commit?
|
|
342
|
+
|
|
343
|
+
**Context:**
|
|
344
|
+
- File: $SVG_FILE
|
|
345
|
+
- Changes: Removed 191 lines of zombie JSON from Excalidraw source
|
|
346
|
+
- Expected: Visual output should be identical (zombie elements were already marked as deleted)
|
|
347
|
+
|
|
348
|
+
PROMPT
|
|
349
|
+
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
350
|
+
echo ""
|
|
351
|
+
echo "📎 Attach this file to your AI prompt:"
|
|
352
|
+
echo " $TMP_DIR/diff.png"
|
|
353
|
+
echo ""
|
|
354
|
+
echo "💡 To open the diff image:"
|
|
355
|
+
echo " open $TMP_DIR/diff.png"
|
|
356
|
+
echo ""
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
# Custom Agent Installation
|
|
2
|
-
|
|
3
|
-
## Quick Install
|
|
4
|
-
|
|
5
|
-
```bash
|
|
6
|
-
# Interactive
|
|
7
|
-
npx bmad-method agent-install
|
|
8
|
-
|
|
9
|
-
# Non-interactive
|
|
10
|
-
npx bmad-method agent-install --defaults
|
|
11
|
-
```
|
|
12
|
-
|
|
13
|
-
## Install Specific Agent
|
|
14
|
-
|
|
15
|
-
```bash
|
|
16
|
-
# From specific source file
|
|
17
|
-
npx bmad-method agent-install --source ./my-agent.agent.yaml
|
|
18
|
-
|
|
19
|
-
# With default config (no prompts)
|
|
20
|
-
npx bmad-method agent-install --source ./my-agent.agent.yaml --defaults
|
|
21
|
-
|
|
22
|
-
# To specific destination
|
|
23
|
-
npx bmad-method agent-install --source ./my-agent.agent.yaml --destination ./my-project
|
|
24
|
-
```
|
|
25
|
-
|
|
26
|
-
## Batch Install
|
|
27
|
-
|
|
28
|
-
1. Copy agent YAML to `{bmad folder}/custom/src/agents/` OR `custom/src/agents` at your project folder root
|
|
29
|
-
2. Run `npx bmad-method install` and select `Compile Agents` or `Quick Update`
|
|
30
|
-
|
|
31
|
-
## What Happens
|
|
32
|
-
|
|
33
|
-
1. Source YAML compiled to .md
|
|
34
|
-
2. Installed to `custom/agents/{agent-name}/`
|
|
35
|
-
3. Added to agent manifest
|
|
36
|
-
4. Backup saved to `_cfg/custom/agents/`
|