bmad-method-quarkus 1.0.0
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/.claude-plugin/marketplace.json +53 -0
- package/AGENTS.md +12 -0
- package/LICENSE +30 -0
- package/README.md +94 -0
- package/README_CN.md +108 -0
- package/README_VN.md +109 -0
- package/bmad-modules.yaml +133 -0
- package/package.json +123 -0
- package/removals.txt +87 -0
- package/src/bmm-skills/agents/bmad-agent-analyst/SKILL.md +76 -0
- package/src/bmm-skills/agents/bmad-agent-analyst/customize.toml +105 -0
- package/src/bmm-skills/agents/bmad-agent-architect/SKILL.md +76 -0
- package/src/bmm-skills/agents/bmad-agent-architect/customize.toml +65 -0
- package/src/bmm-skills/agents/bmad-agent-dev/SKILL.md +76 -0
- package/src/bmm-skills/agents/bmad-agent-dev/customize.toml +83 -0
- package/src/bmm-skills/agents/bmad-agent-pm/SKILL.md +76 -0
- package/src/bmm-skills/agents/bmad-agent-pm/customize.toml +75 -0
- package/src/bmm-skills/agents/bmad-agent-ux-designer/SKILL.md +76 -0
- package/src/bmm-skills/agents/bmad-agent-ux-designer/customize.toml +60 -0
- package/src/bmm-skills/agents/bmad-quarkus-architect/.memlog.md +12 -0
- package/src/bmm-skills/agents/bmad-quarkus-architect/.memlog.md:Zone.Identifier +0 -0
- package/src/bmm-skills/agents/bmad-quarkus-architect/SKILL.md +86 -0
- package/src/bmm-skills/agents/bmad-quarkus-architect/SKILL.md:Zone.Identifier +0 -0
- package/src/bmm-skills/agents/bmad-quarkus-architect/customize.toml +37 -0
- package/src/bmm-skills/agents/bmad-quarkus-architect/customize.toml:Zone.Identifier +0 -0
- package/src/bmm-skills/agents/bmad-quarkus-architect/references/enrich-stories.md +19 -0
- package/src/bmm-skills/agents/bmad-quarkus-architect/references/enrich-stories.md:Zone.Identifier +0 -0
- package/src/bmm-skills/agents/bmad-quarkus-architect/references/prompt-quality-canon.md +79 -0
- package/src/bmm-skills/agents/bmad-quarkus-architect/references/prompt-quality-canon.md:Zone.Identifier +0 -0
- package/src/bmm-skills/agents/bmad-quarkus-architect/skills/bqa-setup/SKILL.md +80 -0
- package/src/bmm-skills/agents/bmad-quarkus-architect/skills/bqa-setup/SKILL.md:Zone.Identifier +0 -0
- package/src/bmm-skills/agents/bmad-quarkus-architect/skills/bqa-setup/assets/module-help.csv +9 -0
- package/src/bmm-skills/agents/bmad-quarkus-architect/skills/bqa-setup/assets/module-help.csv:Zone.Identifier +0 -0
- package/src/bmm-skills/agents/bmad-quarkus-architect/skills/bqa-setup/assets/module.yaml +16 -0
- package/src/bmm-skills/agents/bmad-quarkus-architect/skills/bqa-setup/assets/module.yaml:Zone.Identifier +0 -0
- package/src/bmm-skills/agents/bmad-quarkus-architect/skills/bqa-setup/scripts/cleanup-legacy.py +287 -0
- package/src/bmm-skills/agents/bmad-quarkus-architect/skills/bqa-setup/scripts/cleanup-legacy.py:Zone.Identifier +0 -0
- package/src/bmm-skills/agents/bmad-quarkus-architect/skills/bqa-setup/scripts/merge-config.py +441 -0
- package/src/bmm-skills/agents/bmad-quarkus-architect/skills/bqa-setup/scripts/merge-config.py:Zone.Identifier +0 -0
- package/src/bmm-skills/agents/bmad-quarkus-architect/skills/bqa-setup/scripts/merge-help-csv.py +246 -0
- package/src/bmm-skills/agents/bmad-quarkus-architect/skills/bqa-setup/scripts/merge-help-csv.py:Zone.Identifier +0 -0
- package/src/bmm-skills/agents/bmad-quarkus-architect/skills/quarkus-error-handling-i18n/SKILL.md +181 -0
- package/src/bmm-skills/agents/bmad-quarkus-architect/skills/quarkus-error-handling-i18n/SKILL.md:Zone.Identifier +0 -0
- package/src/bmm-skills/agents/bmad-quarkus-architect/skills/quarkus-grpc-services/SKILL.md +141 -0
- package/src/bmm-skills/agents/bmad-quarkus-architect/skills/quarkus-grpc-services/SKILL.md:Zone.Identifier +0 -0
- package/src/bmm-skills/agents/bmad-quarkus-architect/skills/quarkus-hexagonal-core/SKILL.md +392 -0
- package/src/bmm-skills/agents/bmad-quarkus-architect/skills/quarkus-hexagonal-core/SKILL.md:Zone.Identifier +0 -0
- package/src/bmm-skills/agents/bmad-quarkus-architect/skills/quarkus-kafka-messaging/SKILL.md +148 -0
- package/src/bmm-skills/agents/bmad-quarkus-architect/skills/quarkus-kafka-messaging/SKILL.md:Zone.Identifier +0 -0
- package/src/bmm-skills/agents/bmad-quarkus-architect/skills/quarkus-observability-otel/SKILL.md +180 -0
- package/src/bmm-skills/agents/bmad-quarkus-architect/skills/quarkus-observability-otel/SKILL.md:Zone.Identifier +0 -0
- package/src/bmm-skills/agents/bmad-quarkus-architect/skills/quarkus-openapi-tmforum/SKILL.md +128 -0
- package/src/bmm-skills/agents/bmad-quarkus-architect/skills/quarkus-openapi-tmforum/SKILL.md:Zone.Identifier +0 -0
- package/src/bmm-skills/agents/bmad-quarkus-architect/skills/quarkus-sql-jdbc-agroal/SKILL.md +245 -0
- package/src/bmm-skills/agents/bmad-quarkus-architect/skills/quarkus-sql-jdbc-agroal/SKILL.md:Zone.Identifier +0 -0
- package/src/bmm-skills/module-help.csv +19 -0
- package/src/bmm-skills/module.yaml +92 -0
- package/src/bmm-skills/plan/bmad-architecture/SKILL.md +85 -0
- package/src/bmm-skills/plan/bmad-architecture/assets/spine-template.md +79 -0
- package/src/bmm-skills/plan/bmad-architecture/customize.toml +102 -0
- package/src/bmm-skills/plan/bmad-architecture/references/headless.md +26 -0
- package/src/bmm-skills/plan/bmad-architecture/references/reviewer-gate.md +13 -0
- package/src/bmm-skills/plan/bmad-architecture/scripts/lint_spine.py +257 -0
- package/src/bmm-skills/plan/bmad-architecture/scripts/tests/test_lint_spine.py +270 -0
- package/src/bmm-skills/plan/bmad-create-epics-and-stories/SKILL.md +93 -0
- package/src/bmm-skills/plan/bmad-create-epics-and-stories/customize.toml +41 -0
- package/src/bmm-skills/plan/bmad-create-epics-and-stories/steps/step-01-validate-prerequisites.md +263 -0
- package/src/bmm-skills/plan/bmad-create-epics-and-stories/steps/step-02-design-epics.md +242 -0
- package/src/bmm-skills/plan/bmad-create-epics-and-stories/steps/step-03-create-stories.md +255 -0
- package/src/bmm-skills/plan/bmad-create-epics-and-stories/steps/step-04-final-validation.md +143 -0
- package/src/bmm-skills/plan/bmad-create-epics-and-stories/templates/epics-template.md +61 -0
- package/src/bmm-skills/plan/bmad-generate-project-context/SKILL.md +10 -0
- package/src/bmm-skills/plan/bmad-prd/SKILL.md +94 -0
- package/src/bmm-skills/plan/bmad-prd/assets/headless-schemas.md +76 -0
- package/src/bmm-skills/plan/bmad-prd/assets/prd-template.md +165 -0
- package/src/bmm-skills/plan/bmad-prd/assets/prd-validation-checklist.md +135 -0
- package/src/bmm-skills/plan/bmad-prd/assets/validation-report-template.html +325 -0
- package/src/bmm-skills/plan/bmad-prd/customize.toml +149 -0
- package/src/bmm-skills/plan/bmad-prd/references/headless.md +39 -0
- package/src/bmm-skills/plan/bmad-prd/references/validate.md +97 -0
- package/src/bmm-skills/plan/bmad-prfaq/SKILL.md +135 -0
- package/src/bmm-skills/plan/bmad-prfaq/agents/artifact-analyzer.md +60 -0
- package/src/bmm-skills/plan/bmad-prfaq/agents/web-researcher.md +49 -0
- package/src/bmm-skills/plan/bmad-prfaq/assets/prfaq-template.md +62 -0
- package/src/bmm-skills/plan/bmad-prfaq/bmad-manifest.json +16 -0
- package/src/bmm-skills/plan/bmad-prfaq/customize.toml +41 -0
- package/src/bmm-skills/plan/bmad-prfaq/references/customer-faq.md +55 -0
- package/src/bmm-skills/plan/bmad-prfaq/references/internal-faq.md +51 -0
- package/src/bmm-skills/plan/bmad-prfaq/references/press-release.md +60 -0
- package/src/bmm-skills/plan/bmad-prfaq/references/verdict.md +83 -0
- package/src/bmm-skills/plan/bmad-product-brief/SKILL.md +91 -0
- package/src/bmm-skills/plan/bmad-product-brief/assets/brief-template.md +41 -0
- package/src/bmm-skills/plan/bmad-product-brief/customize.toml +101 -0
- package/src/bmm-skills/plan/bmad-project-context/SKILL.md +110 -0
- package/src/bmm-skills/plan/bmad-project-context/customize.toml +24 -0
- package/src/bmm-skills/plan/bmad-project-context/references/best-practices.md +65 -0
- package/src/bmm-skills/plan/bmad-project-context/references/template.md +55 -0
- package/src/bmm-skills/plan/bmad-spec/SKILL.md +160 -0
- package/src/bmm-skills/plan/bmad-spec/assets/headless-schemas.md +33 -0
- package/src/bmm-skills/plan/bmad-spec/assets/spec-template.md +49 -0
- package/src/bmm-skills/plan/bmad-spec/assets/stories-schema.md +44 -0
- package/src/bmm-skills/plan/bmad-spec/customize.toml +52 -0
- package/src/bmm-skills/plan/bmad-sprint-planning/SKILL.md +62 -0
- package/src/bmm-skills/plan/bmad-sprint-planning/customize.toml +41 -0
- package/src/bmm-skills/plan/bmad-sprint-planning/references/fix-sprint-status.md +30 -0
- package/src/bmm-skills/plan/bmad-sprint-planning/references/generate-tracking.md +25 -0
- package/src/bmm-skills/plan/bmad-sprint-planning/references/readiness-gate.md +20 -0
- package/src/bmm-skills/plan/bmad-sprint-planning/references/status-view.md +14 -0
- package/src/bmm-skills/plan/bmad-sprint-planning/references/validate.md +10 -0
- package/src/bmm-skills/plan/bmad-sprint-planning/scripts/__pycache__/sprint_plan.cpython-311.pyc +0 -0
- package/src/bmm-skills/plan/bmad-sprint-planning/scripts/sprint_plan.py +697 -0
- package/src/bmm-skills/plan/bmad-sprint-planning/scripts/tests/__pycache__/test_sprint_plan.cpython-311-pytest-9.1.1.pyc +0 -0
- package/src/bmm-skills/plan/bmad-sprint-planning/scripts/tests/test_sprint_plan.py +524 -0
- package/src/bmm-skills/plan/bmad-sprint-planning/sprint-status-template.yaml +71 -0
- package/src/bmm-skills/plan/bmad-ux/SKILL.md +90 -0
- package/src/bmm-skills/plan/bmad-ux/assets/color-themes.md +9 -0
- package/src/bmm-skills/plan/bmad-ux/assets/design-directions.md +9 -0
- package/src/bmm-skills/plan/bmad-ux/assets/design-example-editorial.md +158 -0
- package/src/bmm-skills/plan/bmad-ux/assets/design-example-mobile.md +93 -0
- package/src/bmm-skills/plan/bmad-ux/assets/design-example-shadcn.md +109 -0
- package/src/bmm-skills/plan/bmad-ux/assets/excalidraw-wireframe.md +19 -0
- package/src/bmm-skills/plan/bmad-ux/assets/experience-example-mobile.md +112 -0
- package/src/bmm-skills/plan/bmad-ux/assets/experience-example-shadcn.md +133 -0
- package/src/bmm-skills/plan/bmad-ux/assets/headless-schemas.md +84 -0
- package/src/bmm-skills/plan/bmad-ux/assets/key-screens.md +29 -0
- package/src/bmm-skills/plan/bmad-ux/assets/validation-report-template.html +319 -0
- package/src/bmm-skills/plan/bmad-ux/customize.toml +102 -0
- package/src/bmm-skills/plan/bmad-ux/references/creative-tools.md +19 -0
- package/src/bmm-skills/plan/bmad-ux/references/design-md-spec.md +50 -0
- package/src/bmm-skills/plan/bmad-ux/references/headless.md +37 -0
- package/src/bmm-skills/plan/bmad-ux/references/validate.md +115 -0
- package/src/bmm-skills/ship/bmad-build/SKILL.md +13 -0
- package/src/bmm-skills/ship/bmad-build/compile-epic-context.md +62 -0
- package/src/bmm-skills/ship/bmad-build/customize.toml +164 -0
- package/src/bmm-skills/ship/bmad-build/references/deletion-check.md +14 -0
- package/src/bmm-skills/ship/bmad-build/review-prompts/edge-case-hunter.md +88 -0
- package/src/bmm-skills/ship/bmad-build/review-prompts/verification-gap.md +113 -0
- package/src/bmm-skills/ship/bmad-build/spec-template.md +89 -0
- package/src/bmm-skills/ship/bmad-build/step-01-clarify-and-route.md +105 -0
- package/src/bmm-skills/ship/bmad-build/step-02-plan.md +47 -0
- package/src/bmm-skills/ship/bmad-build/step-03-implement.md +49 -0
- package/src/bmm-skills/ship/bmad-build/step-04-review.md +55 -0
- package/src/bmm-skills/ship/bmad-build/step-05-present.md +75 -0
- package/src/bmm-skills/ship/bmad-build/step-oneshot.md +77 -0
- package/src/bmm-skills/ship/bmad-build/sync-sprint-status.md +19 -0
- package/src/bmm-skills/ship/bmad-build/workflow.md +84 -0
- package/src/bmm-skills/ship/bmad-build-auto/SKILL.md +13 -0
- package/src/bmm-skills/ship/bmad-build-auto/compile-epic-context.md +62 -0
- package/src/bmm-skills/ship/bmad-build-auto/customize.toml +121 -0
- package/src/bmm-skills/ship/bmad-build-auto/references/deletion-check.md +14 -0
- package/src/bmm-skills/ship/bmad-build-auto/review-prompts/edge-case-hunter.md +88 -0
- package/src/bmm-skills/ship/bmad-build-auto/review-prompts/verification-gap.md +113 -0
- package/src/bmm-skills/ship/bmad-build-auto/spec-template.md +99 -0
- package/src/bmm-skills/ship/bmad-build-auto/step-01-clarify-and-route.md +83 -0
- package/src/bmm-skills/ship/bmad-build-auto/step-02-plan.md +27 -0
- package/src/bmm-skills/ship/bmad-build-auto/step-03-implement.md +44 -0
- package/src/bmm-skills/ship/bmad-build-auto/step-04-review.md +96 -0
- package/src/bmm-skills/ship/bmad-build-auto/workflow.md +104 -0
- package/src/bmm-skills/ship/bmad-checkpoint-preview/SKILL.md +68 -0
- package/src/bmm-skills/ship/bmad-checkpoint-preview/customize.toml +41 -0
- package/src/bmm-skills/ship/bmad-checkpoint-preview/generate-trail.md +38 -0
- package/src/bmm-skills/ship/bmad-checkpoint-preview/step-01-orientation.md +105 -0
- package/src/bmm-skills/ship/bmad-checkpoint-preview/step-02-walkthrough.md +89 -0
- package/src/bmm-skills/ship/bmad-checkpoint-preview/step-03-detail-pass.md +106 -0
- package/src/bmm-skills/ship/bmad-checkpoint-preview/step-04-testing.md +74 -0
- package/src/bmm-skills/ship/bmad-checkpoint-preview/step-05-wrapup.md +30 -0
- package/src/bmm-skills/ship/bmad-code-review/SKILL.md +90 -0
- package/src/bmm-skills/ship/bmad-code-review/customize.toml +113 -0
- package/src/bmm-skills/ship/bmad-code-review/references/deletion-check.md +14 -0
- package/src/bmm-skills/ship/bmad-code-review/review-prompts/edge-case-hunter.md +88 -0
- package/src/bmm-skills/ship/bmad-code-review/review-prompts/verification-gap.md +113 -0
- package/src/bmm-skills/ship/bmad-code-review/steps/step-01-gather-context.md +87 -0
- package/src/bmm-skills/ship/bmad-code-review/steps/step-02-review.md +32 -0
- package/src/bmm-skills/ship/bmad-code-review/steps/step-03-triage.md +50 -0
- package/src/bmm-skills/ship/bmad-code-review/steps/step-04-present.md +132 -0
- package/src/bmm-skills/ship/bmad-correct-course/SKILL.md +300 -0
- package/src/bmm-skills/ship/bmad-correct-course/checklist.md +288 -0
- package/src/bmm-skills/ship/bmad-correct-course/customize.toml +41 -0
- package/src/bmm-skills/ship/bmad-qa-generate-e2e-tests/SKILL.md +176 -0
- package/src/bmm-skills/ship/bmad-qa-generate-e2e-tests/checklist.md +33 -0
- package/src/bmm-skills/ship/bmad-qa-generate-e2e-tests/customize.toml +41 -0
- package/src/bmm-skills/ship/bmad-retrospective/SKILL.md +94 -0
- package/src/bmm-skills/ship/bmad-retrospective/customize.toml +41 -0
- package/src/bmm-skills/ship/bmad-retrospective/references/acceptance-verdict.md +55 -0
- package/src/bmm-skills/ship/bmad-retrospective/references/aggregate-views.md +17 -0
- package/src/bmm-skills/ship/bmad-retrospective/references/evidence-gathering.md +30 -0
- package/src/bmm-skills/ship/bmad-retrospective/references/retro-document.md +84 -0
- package/src/bmm-skills/ship/bmad-retrospective/references/team-discussion.md +22 -0
- package/src/bmm-skills/ship/bmad-retrospective/scripts/__pycache__/sprint_status.cpython-311.pyc +0 -0
- package/src/bmm-skills/ship/bmad-retrospective/scripts/git_evidence.py +304 -0
- package/src/bmm-skills/ship/bmad-retrospective/scripts/sprint_status.py +746 -0
- package/src/bmm-skills/ship/bmad-retrospective/scripts/tests/__pycache__/test_git_evidence.cpython-311-pytest-9.1.1.pyc +0 -0
- package/src/bmm-skills/ship/bmad-retrospective/scripts/tests/__pycache__/test_sprint_status.cpython-311-pytest-9.1.1.pyc +0 -0
- package/src/bmm-skills/ship/bmad-retrospective/scripts/tests/fixtures/sprint-status-template.yaml +71 -0
- package/src/bmm-skills/ship/bmad-retrospective/scripts/tests/test_git_evidence.py +750 -0
- package/src/bmm-skills/ship/bmad-retrospective/scripts/tests/test_sprint_status.py +1579 -0
- package/src/bmm-skills/v6-shims/README.md +28 -0
- package/src/bmm-skills/v6-shims/bmad-create-architecture/SKILL.md +30 -0
- package/src/bmm-skills/v6-shims/bmad-create-architecture/customize.toml +41 -0
- package/src/bmm-skills/v6-shims/bmad-create-prd/SKILL.md +30 -0
- package/src/bmm-skills/v6-shims/bmad-create-prd/customize.toml +41 -0
- package/src/bmm-skills/v6-shims/bmad-create-story/SKILL.md +434 -0
- package/src/bmm-skills/v6-shims/bmad-create-story/checklist.md +357 -0
- package/src/bmm-skills/v6-shims/bmad-create-story/customize.toml +41 -0
- package/src/bmm-skills/v6-shims/bmad-create-story/discover-inputs.md +88 -0
- package/src/bmm-skills/v6-shims/bmad-create-story/template.md +49 -0
- package/src/bmm-skills/v6-shims/bmad-dev-auto/SKILL.md +19 -0
- package/src/bmm-skills/v6-shims/bmad-dev-story/SKILL.md +502 -0
- package/src/bmm-skills/v6-shims/bmad-dev-story/checklist.md +80 -0
- package/src/bmm-skills/v6-shims/bmad-dev-story/customize.toml +44 -0
- package/src/bmm-skills/v6-shims/bmad-document-project/SKILL.md +14 -0
- package/src/bmm-skills/v6-shims/bmad-domain-research/SKILL.md +14 -0
- package/src/bmm-skills/v6-shims/bmad-edit-prd/SKILL.md +30 -0
- package/src/bmm-skills/v6-shims/bmad-edit-prd/customize.toml +42 -0
- package/src/bmm-skills/v6-shims/bmad-market-research/SKILL.md +14 -0
- package/src/bmm-skills/v6-shims/bmad-quick-dev/SKILL.md +19 -0
- package/src/bmm-skills/v6-shims/bmad-sprint-status/SKILL.md +26 -0
- package/src/bmm-skills/v6-shims/bmad-sprint-status/customize.toml +41 -0
- package/src/bmm-skills/v6-shims/bmad-technical-research/SKILL.md +14 -0
- package/src/bmm-skills/v6-shims/bmad-validate-prd/SKILL.md +30 -0
- package/src/bmm-skills/v6-shims/bmad-validate-prd/customize.toml +42 -0
- package/src/core-skills/bmad-advanced-elicitation/SKILL.md +65 -0
- package/src/core-skills/bmad-advanced-elicitation/assets/methods.csv +72 -0
- package/src/core-skills/bmad-advanced-elicitation/customize.toml +54 -0
- package/src/core-skills/bmad-advanced-elicitation/scripts/pick_methods.py +233 -0
- package/src/core-skills/bmad-advanced-elicitation/scripts/tests/test_pick_methods.py +228 -0
- package/src/core-skills/bmad-brainstorming/SKILL.md +80 -0
- package/src/core-skills/bmad-brainstorming/assets/brain-icons.json +166 -0
- package/src/core-skills/bmad-brainstorming/assets/brain-methods.csv +109 -0
- package/src/core-skills/bmad-brainstorming/assets/brain-selector.html +328 -0
- package/src/core-skills/bmad-brainstorming/customize.toml +84 -0
- package/src/core-skills/bmad-brainstorming/references/converge.md +24 -0
- package/src/core-skills/bmad-brainstorming/references/finalize.md +26 -0
- package/src/core-skills/bmad-brainstorming/references/headless.md +54 -0
- package/src/core-skills/bmad-brainstorming/references/in-chat-techniques.md +18 -0
- package/src/core-skills/bmad-brainstorming/references/mode-autonomous.md +10 -0
- package/src/core-skills/bmad-brainstorming/references/mode-facilitator.md +11 -0
- package/src/core-skills/bmad-brainstorming/references/mode-partner.md +16 -0
- package/src/core-skills/bmad-brainstorming/references/resume.md +5 -0
- package/src/core-skills/bmad-brainstorming/scripts/brain.py +770 -0
- package/src/core-skills/bmad-brainstorming/scripts/tests/test_brain.py +239 -0
- package/src/core-skills/bmad-customize/SKILL.md +111 -0
- package/src/core-skills/bmad-customize/scripts/list_customizable_skills.py +231 -0
- package/src/core-skills/bmad-customize/scripts/tests/test_list_customizable_skills.py +249 -0
- package/src/core-skills/bmad-deep-recon/SKILL.md +82 -0
- package/src/core-skills/bmad-deep-recon/assets/research.template.md +18 -0
- package/src/core-skills/bmad-deep-recon/customize.toml +212 -0
- package/src/core-skills/bmad-deep-recon/references/draft.md +8 -0
- package/src/core-skills/bmad-deep-recon/references/finalize.md +11 -0
- package/src/core-skills/bmad-deep-recon/references/html-briefing.md +16 -0
- package/src/core-skills/bmad-deep-recon/references/lifecycle.md +11 -0
- package/src/core-skills/bmad-deep-recon/references/process.md +10 -0
- package/src/core-skills/bmad-deep-recon/references/run.md +73 -0
- package/src/core-skills/bmad-deep-recon/references/selection.md +13 -0
- package/src/core-skills/bmad-deep-recon/references/synthesis.md +16 -0
- package/src/core-skills/bmad-deep-recon/references/verification.md +29 -0
- package/src/core-skills/bmad-deep-recon/scripts/recon_kit.py +322 -0
- package/src/core-skills/bmad-deep-recon/scripts/tests/test_recon_kit.py +144 -0
- package/src/core-skills/bmad-deep-recon/types/academic-lit.md +19 -0
- package/src/core-skills/bmad-deep-recon/types/competitive.md +19 -0
- package/src/core-skills/bmad-deep-recon/types/domain.md +19 -0
- package/src/core-skills/bmad-deep-recon/types/market.md +19 -0
- package/src/core-skills/bmad-deep-recon/types/technical.md +19 -0
- package/src/core-skills/bmad-deep-recon/types/user-voice.md +19 -0
- package/src/core-skills/bmad-forge-idea/SKILL.md +107 -0
- package/src/core-skills/bmad-forge-idea/customize.toml +42 -0
- package/src/core-skills/bmad-forge-idea/scripts/resolve_personas.py +275 -0
- package/src/core-skills/bmad-forge-idea/scripts/tests/test_resolve_personas.py +138 -0
- package/src/core-skills/bmad-help/SKILL.md +75 -0
- package/src/core-skills/bmad-party-mode/SKILL.md +60 -0
- package/src/core-skills/bmad-party-mode/customize.toml +211 -0
- package/src/core-skills/bmad-party-mode/references/create-party.md +70 -0
- package/src/core-skills/bmad-party-mode/references/mode-agent-team.md +13 -0
- package/src/core-skills/bmad-party-mode/references/mode-auto.md +13 -0
- package/src/core-skills/bmad-party-mode/references/mode-subagent.md +31 -0
- package/src/core-skills/bmad-party-mode/references/party-memory.md +51 -0
- package/src/core-skills/bmad-party-mode/scripts/resolve_party.py +282 -0
- package/src/core-skills/bmad-party-mode/scripts/tests/test_resolve_party.py +146 -0
- package/src/core-skills/bmad-review/SKILL.md +49 -0
- package/src/core-skills/bmad-review/customize.toml +141 -0
- package/src/core-skills/bmad-review/references/editorial-common.md +56 -0
- package/src/core-skills/bmad-review/references/lens-adversarial.md +19 -0
- package/src/core-skills/bmad-review/references/lens-edge-case-hunter.md +54 -0
- package/src/core-skills/bmad-review/references/lens-prose.md +7 -0
- package/src/core-skills/bmad-review/references/lens-structure.md +9 -0
- package/src/core-skills/bmad-review/references/lens-verification-gap.md +92 -0
- package/src/core-skills/bmad-review/references/structure-models.md +44 -0
- package/src/core-skills/bmad-review/scripts/tests/test_word_metrics.py +62 -0
- package/src/core-skills/bmad-review/scripts/word_metrics.py +102 -0
- package/src/core-skills/module-help.csv +10 -0
- package/src/core-skills/module.yaml +38 -0
- package/src/core-skills/v6-shims/README.md +25 -0
- package/src/core-skills/v6-shims/bmad-editorial-review/SKILL.md +6 -0
- package/src/core-skills/v6-shims/bmad-editorial-review/customize.toml +31 -0
- package/src/core-skills/v6-shims/bmad-editorial-review-prose/SKILL.md +6 -0
- package/src/core-skills/v6-shims/bmad-editorial-review-structure/SKILL.md +6 -0
- package/src/core-skills/v6-shims/bmad-review-adversarial-general/SKILL.md +6 -0
- package/src/core-skills/v6-shims/bmad-review-edge-case-hunter/SKILL.md +6 -0
- package/src/core-skills/v6-shims/bmad-review-verification-gap/SKILL.md +6 -0
- package/src/scripts/__pycache__/config_utils.cpython-311.pyc +0 -0
- package/src/scripts/config_utils.py +119 -0
- package/src/scripts/memlog.py +224 -0
- package/src/scripts/render_skill.py +401 -0
- package/src/scripts/resolve_config.py +74 -0
- package/src/scripts/resolve_customization.py +99 -0
- package/src/scripts/tests/__pycache__/test_config_utils.cpython-311.pyc +0 -0
- package/src/scripts/tests/__pycache__/test_resolve_config.cpython-311.pyc +0 -0
- package/src/scripts/tests/__pycache__/test_resolve_customization.cpython-311.pyc +0 -0
- package/src/scripts/tests/test_config_utils.py +85 -0
- package/src/scripts/tests/test_memlog.py +306 -0
- package/src/scripts/tests/test_resolve_config.py +89 -0
- package/src/scripts/tests/test_resolve_customization.py +77 -0
- package/tools/bundle-web-bundles.js +117 -0
- package/tools/format-workflow-md.js +263 -0
- package/tools/installer/README.md +60 -0
- package/tools/installer/bmad-cli.js +105 -0
- package/tools/installer/cli-utils.js +57 -0
- package/tools/installer/commands/install.js +149 -0
- package/tools/installer/commands/status.js +65 -0
- package/tools/installer/commands/uninstall.js +167 -0
- package/tools/installer/core/config.js +73 -0
- package/tools/installer/core/existing-install.js +121 -0
- package/tools/installer/core/install-paths.js +132 -0
- package/tools/installer/core/installer.js +1767 -0
- package/tools/installer/core/legacy-warnings.js +151 -0
- package/tools/installer/core/manifest-generator.js +859 -0
- package/tools/installer/core/manifest.js +433 -0
- package/tools/installer/core/uv-check.js +195 -0
- package/tools/installer/core/wsl-node-check.js +109 -0
- package/tools/installer/file-ops.js +204 -0
- package/tools/installer/fs-native.js +116 -0
- package/tools/installer/ide/_config-driven.js +972 -0
- package/tools/installer/ide/manager.js +324 -0
- package/tools/installer/ide/platform-codes.js +80 -0
- package/tools/installer/ide/platform-codes.yaml +343 -0
- package/tools/installer/ide/shared/installed-skills.js +50 -0
- package/tools/installer/ide/shared/path-utils.js +219 -0
- package/tools/installer/ide/shared/skill-manifest.js +57 -0
- package/tools/installer/install-messages.yaml +37 -0
- package/tools/installer/list-options.js +210 -0
- package/tools/installer/message-loader.js +83 -0
- package/tools/installer/modules/channel-plan.js +203 -0
- package/tools/installer/modules/channel-resolver.js +241 -0
- package/tools/installer/modules/custom-module-manager.js +924 -0
- package/tools/installer/modules/external-manager.js +671 -0
- package/tools/installer/modules/git-env.js +47 -0
- package/tools/installer/modules/module-help-schema.js +13 -0
- package/tools/installer/modules/official-modules.js +2257 -0
- package/tools/installer/modules/plugin-resolver.js +398 -0
- package/tools/installer/modules/version-resolver.js +336 -0
- package/tools/installer/project-root.js +224 -0
- package/tools/installer/prompts.js +791 -0
- package/tools/installer/set-overrides.js +330 -0
- package/tools/installer/ui.js +2167 -0
- package/tools/installer/yaml-format.js +245 -0
- package/tools/javascript-conventions.md +5 -0
- package/tools/migrate-custom-module-paths.js +124 -0
- package/tools/skill-validator.md +378 -0
- package/tools/validate-published-implementation-model.mjs +68 -0
- package/tools/validate-sidebar-order.js +388 -0
- package/tools/validate-skills.js +735 -0
- package/tools/validate-svg-changes.sh +356 -0
- package/web-bundles/README.md +46 -0
- package/web-bundles/brainstorming-coach/INSTRUCTIONS.md +86 -0
- package/web-bundles/brainstorming-coach/SKILL.md +83 -0
- package/web-bundles/brainstorming-coach/brain-methods.csv +62 -0
- package/web-bundles/bundles.json +139 -0
- package/web-bundles/market-and-industry-research/INSTRUCTIONS.md +88 -0
- package/web-bundles/market-and-industry-research/SKILL.md +59 -0
- package/web-bundles/prd-coach/INSTRUCTIONS.md +86 -0
- package/web-bundles/prd-coach/SKILL.md +101 -0
- package/web-bundles/prd-coach/prd-template.md +165 -0
- package/web-bundles/prd-coach/prd-validation-checklist.md +135 -0
- package/web-bundles/prfaq-coach/INSTRUCTIONS.md +86 -0
- package/web-bundles/prfaq-coach/SKILL.md +139 -0
- package/web-bundles/product-brief-coach/INSTRUCTIONS.md +86 -0
- package/web-bundles/product-brief-coach/SKILL.md +113 -0
- package/web-bundles/ux-coach/INSTRUCTIONS.md +92 -0
- package/web-bundles/ux-coach/SKILL.md +187 -0
- package/web-bundles/ux-coach/ux-validation.md +100 -0
|
@@ -0,0 +1,343 @@
|
|
|
1
|
+
# BMAD Platform Codes Configuration
|
|
2
|
+
#
|
|
3
|
+
# Each platform entry has:
|
|
4
|
+
# name: Display name shown to users
|
|
5
|
+
# preferred: Whether shown as a recommended option on install
|
|
6
|
+
# suspended: (optional) Message explaining why install is blocked
|
|
7
|
+
# installer:
|
|
8
|
+
# target_dir: Directory where skill directories are installed (project/workspace)
|
|
9
|
+
# global_target_dir: (optional) User-home directory for global install
|
|
10
|
+
# ancestor_conflict_check: (optional) Refuse install when ancestor dir has BMAD files
|
|
11
|
+
#
|
|
12
|
+
# Multiple platforms may share the same target_dir or global_target_dir — many tools
|
|
13
|
+
# read from the shared `.agents/skills/` and `~/.agents/skills/` cross-tool standard.
|
|
14
|
+
# Paths verified against each tool's primary docs as of 2026-04-25.
|
|
15
|
+
|
|
16
|
+
platforms:
|
|
17
|
+
adal:
|
|
18
|
+
name: "AdaL"
|
|
19
|
+
preferred: false
|
|
20
|
+
installer:
|
|
21
|
+
target_dir: .adal/skills
|
|
22
|
+
global_target_dir: ~/.adal/skills
|
|
23
|
+
|
|
24
|
+
amp:
|
|
25
|
+
name: "Sourcegraph Amp"
|
|
26
|
+
preferred: false
|
|
27
|
+
installer:
|
|
28
|
+
target_dir: .agents/skills
|
|
29
|
+
global_target_dir: ~/.config/agents/skills
|
|
30
|
+
|
|
31
|
+
antigravity:
|
|
32
|
+
name: "Google Antigravity"
|
|
33
|
+
preferred: false
|
|
34
|
+
installer:
|
|
35
|
+
target_dir: .agent/skills
|
|
36
|
+
global_target_dir: ~/.gemini/antigravity/skills
|
|
37
|
+
|
|
38
|
+
antigravity-cli:
|
|
39
|
+
name: "Antigravity CLI (AGY)"
|
|
40
|
+
preferred: false
|
|
41
|
+
installer:
|
|
42
|
+
target_dir: .agents/skills
|
|
43
|
+
global_target_dir: ~/.gemini/antigravity-cli/skills
|
|
44
|
+
|
|
45
|
+
auggie:
|
|
46
|
+
name: "Auggie"
|
|
47
|
+
preferred: false
|
|
48
|
+
installer:
|
|
49
|
+
target_dir: .agents/skills
|
|
50
|
+
global_target_dir: ~/.agents/skills
|
|
51
|
+
|
|
52
|
+
bob:
|
|
53
|
+
name: "IBM Bob"
|
|
54
|
+
preferred: false
|
|
55
|
+
installer:
|
|
56
|
+
target_dir: .bob/skills
|
|
57
|
+
global_target_dir: ~/.bob/skills
|
|
58
|
+
|
|
59
|
+
claude-code:
|
|
60
|
+
name: "Claude Code"
|
|
61
|
+
preferred: true
|
|
62
|
+
installer:
|
|
63
|
+
target_dir: .claude/skills
|
|
64
|
+
global_target_dir: ~/.claude/skills
|
|
65
|
+
|
|
66
|
+
cline:
|
|
67
|
+
name: "Cline"
|
|
68
|
+
preferred: false
|
|
69
|
+
installer:
|
|
70
|
+
target_dir: .cline/skills
|
|
71
|
+
global_target_dir: ~/.cline/skills
|
|
72
|
+
|
|
73
|
+
codex:
|
|
74
|
+
name: "Codex"
|
|
75
|
+
preferred: true
|
|
76
|
+
installer:
|
|
77
|
+
target_dir: .agents/skills
|
|
78
|
+
global_target_dir: ~/.codex/skills
|
|
79
|
+
|
|
80
|
+
codewhale:
|
|
81
|
+
name: "CodeWhale"
|
|
82
|
+
preferred: false
|
|
83
|
+
installer:
|
|
84
|
+
target_dir: .codewhale/skills
|
|
85
|
+
global_target_dir: ~/.codewhale/skills
|
|
86
|
+
|
|
87
|
+
codebuddy:
|
|
88
|
+
name: "CodeBuddy"
|
|
89
|
+
preferred: false
|
|
90
|
+
installer:
|
|
91
|
+
target_dir: .codebuddy/skills
|
|
92
|
+
global_target_dir: ~/.codebuddy/skills
|
|
93
|
+
|
|
94
|
+
command-code:
|
|
95
|
+
name: "Command Code"
|
|
96
|
+
preferred: false
|
|
97
|
+
installer:
|
|
98
|
+
target_dir: .agents/skills
|
|
99
|
+
global_target_dir: ~/.agents/skills
|
|
100
|
+
|
|
101
|
+
cortex:
|
|
102
|
+
name: "Snowflake Cortex Code"
|
|
103
|
+
preferred: false
|
|
104
|
+
installer:
|
|
105
|
+
target_dir: .cortex/skills
|
|
106
|
+
global_target_dir: ~/.snowflake/cortex/skills
|
|
107
|
+
|
|
108
|
+
crush:
|
|
109
|
+
name: "Crush"
|
|
110
|
+
preferred: false
|
|
111
|
+
installer:
|
|
112
|
+
target_dir: .agents/skills
|
|
113
|
+
global_target_dir: ~/.config/agents/skills
|
|
114
|
+
|
|
115
|
+
cursor:
|
|
116
|
+
name: "Cursor"
|
|
117
|
+
preferred: true
|
|
118
|
+
installer:
|
|
119
|
+
target_dir: .agents/skills
|
|
120
|
+
global_target_dir: ~/.agents/skills
|
|
121
|
+
|
|
122
|
+
droid:
|
|
123
|
+
name: "Factory Droid"
|
|
124
|
+
preferred: false
|
|
125
|
+
installer:
|
|
126
|
+
target_dir: .factory/skills
|
|
127
|
+
global_target_dir: ~/.factory/skills
|
|
128
|
+
|
|
129
|
+
firebender:
|
|
130
|
+
name: "Firebender"
|
|
131
|
+
preferred: false
|
|
132
|
+
installer:
|
|
133
|
+
target_dir: .firebender/skills
|
|
134
|
+
global_target_dir: ~/.agents/skills
|
|
135
|
+
|
|
136
|
+
gemini:
|
|
137
|
+
name: "Gemini CLI"
|
|
138
|
+
preferred: false
|
|
139
|
+
installer:
|
|
140
|
+
target_dir: .agents/skills
|
|
141
|
+
global_target_dir: ~/.agents/skills
|
|
142
|
+
|
|
143
|
+
github-copilot:
|
|
144
|
+
name: "GitHub Copilot"
|
|
145
|
+
preferred: true
|
|
146
|
+
installer:
|
|
147
|
+
target_dir: .agents/skills
|
|
148
|
+
global_target_dir: ~/.agents/skills
|
|
149
|
+
commands_target_dir: .github/agents
|
|
150
|
+
commands_extension: .agent.md
|
|
151
|
+
commands_body_template: "LOAD the FULL {project-root}/{target_dir}/{canonicalId}/SKILL.md, READ its entire contents and follow its directions exactly!"
|
|
152
|
+
# The Custom Agents picker should only show persona agents (not
|
|
153
|
+
# workflows/tools). Detected by reading each skill's source
|
|
154
|
+
# `customize.toml` and checking for an `[agent]` section — that's
|
|
155
|
+
# the actual configuration source of truth: every BMAD persona is
|
|
156
|
+
# configured under `[agent]`, every workflow under `[workflow]`,
|
|
157
|
+
# every standalone skill has no customize.toml. This signal is
|
|
158
|
+
# naming-independent, so personas like `bmad-tea` (which doesn't
|
|
159
|
+
# follow the `-agent-` convention) are still included, and
|
|
160
|
+
# meta-skills like `bmad-agent-builder` (which contains `-agent-`
|
|
161
|
+
# but is a skill-builder workflow, not a persona) are correctly
|
|
162
|
+
# excluded.
|
|
163
|
+
commands_filter: agents-only
|
|
164
|
+
|
|
165
|
+
goose:
|
|
166
|
+
name: "Block Goose"
|
|
167
|
+
preferred: false
|
|
168
|
+
installer:
|
|
169
|
+
target_dir: .agents/skills
|
|
170
|
+
global_target_dir: ~/.config/agents/skills
|
|
171
|
+
|
|
172
|
+
hermes:
|
|
173
|
+
name: "Hermes Agent"
|
|
174
|
+
preferred: false
|
|
175
|
+
installer:
|
|
176
|
+
target_dir: .agents/skills
|
|
177
|
+
global_target_dir: ~/.hermes/skills
|
|
178
|
+
|
|
179
|
+
iflow:
|
|
180
|
+
name: "iFlow"
|
|
181
|
+
preferred: false
|
|
182
|
+
installer:
|
|
183
|
+
target_dir: .iflow/skills
|
|
184
|
+
global_target_dir: ~/.iflow/skills
|
|
185
|
+
|
|
186
|
+
junie:
|
|
187
|
+
name: "Junie"
|
|
188
|
+
preferred: false
|
|
189
|
+
installer:
|
|
190
|
+
target_dir: .junie/skills
|
|
191
|
+
global_target_dir: ~/.junie/skills
|
|
192
|
+
|
|
193
|
+
kilo:
|
|
194
|
+
name: "KiloCoder"
|
|
195
|
+
preferred: false
|
|
196
|
+
installer:
|
|
197
|
+
target_dir: .agents/skills
|
|
198
|
+
global_target_dir: ~/.kilocode/skills
|
|
199
|
+
|
|
200
|
+
kimi-code:
|
|
201
|
+
name: "Kimi Code"
|
|
202
|
+
preferred: false
|
|
203
|
+
installer:
|
|
204
|
+
target_dir: .agents/skills
|
|
205
|
+
global_target_dir: ~/.agents/skills
|
|
206
|
+
|
|
207
|
+
kiro:
|
|
208
|
+
name: "Kiro"
|
|
209
|
+
preferred: false
|
|
210
|
+
installer:
|
|
211
|
+
target_dir: .kiro/skills
|
|
212
|
+
global_target_dir: ~/.kiro/skills
|
|
213
|
+
|
|
214
|
+
kode:
|
|
215
|
+
name: "Kode"
|
|
216
|
+
preferred: false
|
|
217
|
+
installer:
|
|
218
|
+
target_dir: .kode/skills
|
|
219
|
+
global_target_dir: ~/.kode/skills
|
|
220
|
+
|
|
221
|
+
mistral-vibe:
|
|
222
|
+
name: "Mistral Vibe"
|
|
223
|
+
preferred: false
|
|
224
|
+
installer:
|
|
225
|
+
target_dir: .agents/skills
|
|
226
|
+
global_target_dir: ~/.vibe/skills
|
|
227
|
+
|
|
228
|
+
mux:
|
|
229
|
+
name: "Mux"
|
|
230
|
+
preferred: false
|
|
231
|
+
installer:
|
|
232
|
+
target_dir: .agents/skills
|
|
233
|
+
global_target_dir: ~/.agents/skills
|
|
234
|
+
|
|
235
|
+
neovate:
|
|
236
|
+
name: "Neovate"
|
|
237
|
+
preferred: false
|
|
238
|
+
installer:
|
|
239
|
+
target_dir: .neovate/skills
|
|
240
|
+
global_target_dir: ~/.neovate/skills
|
|
241
|
+
|
|
242
|
+
ona:
|
|
243
|
+
name: "Ona"
|
|
244
|
+
preferred: false
|
|
245
|
+
installer:
|
|
246
|
+
target_dir: .ona/skills
|
|
247
|
+
|
|
248
|
+
openclaw:
|
|
249
|
+
name: "OpenClaw"
|
|
250
|
+
preferred: false
|
|
251
|
+
installer:
|
|
252
|
+
target_dir: .agents/skills
|
|
253
|
+
global_target_dir: ~/.agents/skills
|
|
254
|
+
|
|
255
|
+
opencode:
|
|
256
|
+
name: "OpenCode"
|
|
257
|
+
preferred: false
|
|
258
|
+
installer:
|
|
259
|
+
target_dir: .agents/skills
|
|
260
|
+
global_target_dir: ~/.agents/skills
|
|
261
|
+
commands_target_dir: .opencode/commands
|
|
262
|
+
|
|
263
|
+
openhands:
|
|
264
|
+
name: "OpenHands"
|
|
265
|
+
preferred: false
|
|
266
|
+
installer:
|
|
267
|
+
target_dir: .agents/skills
|
|
268
|
+
global_target_dir: ~/.agents/skills
|
|
269
|
+
|
|
270
|
+
pi:
|
|
271
|
+
name: "Pi"
|
|
272
|
+
preferred: false
|
|
273
|
+
installer:
|
|
274
|
+
target_dir: .agents/skills
|
|
275
|
+
global_target_dir: ~/.agents/skills
|
|
276
|
+
|
|
277
|
+
pochi:
|
|
278
|
+
name: "Pochi"
|
|
279
|
+
preferred: false
|
|
280
|
+
installer:
|
|
281
|
+
target_dir: .agents/skills
|
|
282
|
+
global_target_dir: ~/.agents/skills
|
|
283
|
+
|
|
284
|
+
qoder:
|
|
285
|
+
name: "Qoder"
|
|
286
|
+
preferred: false
|
|
287
|
+
installer:
|
|
288
|
+
target_dir: .qoder/skills
|
|
289
|
+
global_target_dir: ~/.qoder/skills
|
|
290
|
+
|
|
291
|
+
qwen:
|
|
292
|
+
name: "QwenCoder"
|
|
293
|
+
preferred: false
|
|
294
|
+
installer:
|
|
295
|
+
target_dir: .qwen/skills
|
|
296
|
+
global_target_dir: ~/.qwen/skills
|
|
297
|
+
|
|
298
|
+
replit:
|
|
299
|
+
name: "Replit Agent"
|
|
300
|
+
preferred: false
|
|
301
|
+
installer:
|
|
302
|
+
target_dir: .agents/skills
|
|
303
|
+
|
|
304
|
+
roo:
|
|
305
|
+
name: "Roo Code"
|
|
306
|
+
preferred: false
|
|
307
|
+
installer:
|
|
308
|
+
target_dir: .agents/skills
|
|
309
|
+
global_target_dir: ~/.agents/skills
|
|
310
|
+
|
|
311
|
+
rovo-dev:
|
|
312
|
+
name: "Rovo Dev"
|
|
313
|
+
preferred: false
|
|
314
|
+
installer:
|
|
315
|
+
target_dir: .agents/skills
|
|
316
|
+
global_target_dir: ~/.agents/skills
|
|
317
|
+
|
|
318
|
+
trae:
|
|
319
|
+
name: "Trae"
|
|
320
|
+
preferred: false
|
|
321
|
+
installer:
|
|
322
|
+
target_dir: .trae/skills
|
|
323
|
+
|
|
324
|
+
warp:
|
|
325
|
+
name: "Warp"
|
|
326
|
+
preferred: false
|
|
327
|
+
installer:
|
|
328
|
+
target_dir: .agents/skills
|
|
329
|
+
global_target_dir: ~/.agents/skills
|
|
330
|
+
|
|
331
|
+
windsurf:
|
|
332
|
+
name: "Windsurf"
|
|
333
|
+
preferred: false
|
|
334
|
+
installer:
|
|
335
|
+
target_dir: .agents/skills
|
|
336
|
+
global_target_dir: ~/.agents/skills
|
|
337
|
+
|
|
338
|
+
zencoder:
|
|
339
|
+
name: "Zencoder"
|
|
340
|
+
preferred: false
|
|
341
|
+
installer:
|
|
342
|
+
target_dir: .zencoder/skills
|
|
343
|
+
global_target_dir: ~/.zencoder/skills
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
const path = require('node:path');
|
|
2
|
+
const fs = require('../../fs-native');
|
|
3
|
+
const csv = require('csv-parse/sync');
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Read the global skill-manifest.csv and return the set of canonicalIds.
|
|
7
|
+
* These define which directory entries in a target_dir are BMAD-owned, regardless
|
|
8
|
+
* of whether they happen to start with "bmad-" (custom modules can ship skills
|
|
9
|
+
* with any prefix, e.g. "fred-cool-skill").
|
|
10
|
+
*
|
|
11
|
+
* @param {string} bmadDir - Path to the _bmad install directory
|
|
12
|
+
* @returns {Promise<Set<string>>} Set of canonicalIds, or empty set if manifest missing
|
|
13
|
+
*/
|
|
14
|
+
async function getInstalledCanonicalIds(bmadDir) {
|
|
15
|
+
const ids = new Set();
|
|
16
|
+
if (!bmadDir) return ids;
|
|
17
|
+
|
|
18
|
+
const csvPath = path.join(bmadDir, '_config', 'skill-manifest.csv');
|
|
19
|
+
if (!(await fs.pathExists(csvPath))) return ids;
|
|
20
|
+
|
|
21
|
+
try {
|
|
22
|
+
const content = await fs.readFile(csvPath, 'utf8');
|
|
23
|
+
const records = csv.parse(content, { columns: true, skip_empty_lines: true });
|
|
24
|
+
for (const record of records) {
|
|
25
|
+
if (record.canonicalId) ids.add(record.canonicalId);
|
|
26
|
+
}
|
|
27
|
+
} catch {
|
|
28
|
+
// Unreadable/invalid manifest — treat as no info
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
return ids;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Test whether a directory entry is BMAD-owned.
|
|
36
|
+
* Prefers the manifest's canonicalIds; falls back to the legacy "bmad" prefix
|
|
37
|
+
* when no manifest is available (early install, ancestor lookup with no bmad dir).
|
|
38
|
+
*
|
|
39
|
+
* @param {string} entry - Directory entry name
|
|
40
|
+
* @param {Set<string>|null} canonicalIds - From getInstalledCanonicalIds, or null
|
|
41
|
+
* @returns {boolean}
|
|
42
|
+
*/
|
|
43
|
+
function isBmadOwnedEntry(entry, canonicalIds) {
|
|
44
|
+
if (!entry || typeof entry !== 'string') return false;
|
|
45
|
+
if (entry.toLowerCase().startsWith('bmad-os-')) return false;
|
|
46
|
+
if (canonicalIds && canonicalIds.size > 0) return canonicalIds.has(entry);
|
|
47
|
+
return entry.toLowerCase().startsWith('bmad');
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
module.exports = { getInstalledCanonicalIds, isBmadOwnedEntry };
|
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Path transformation utilities for IDE installer standardization
|
|
3
|
+
*
|
|
4
|
+
* Provides utilities to convert hierarchical paths to flat naming conventions.
|
|
5
|
+
*
|
|
6
|
+
* DASH-BASED NAMING (new standard):
|
|
7
|
+
* - Agents: bmad-agent-module-name.md (with bmad-agent- prefix)
|
|
8
|
+
* - Workflows/Tasks/Tools: bmad-module-name.md
|
|
9
|
+
*
|
|
10
|
+
* Example outputs:
|
|
11
|
+
* - cis/agents/storymaster.md → bmad-agent-cis-storymaster.md
|
|
12
|
+
* - bmm/workflows/plan-project.md → bmad-bmm-plan-project.md
|
|
13
|
+
* - bmm/tasks/create-story.md → bmad-bmm-create-story.md
|
|
14
|
+
* - core/agents/brainstorming.md → bmad-agent-brainstorming.md (core agents skip module name)
|
|
15
|
+
* - standalone/agents/fred.md → bmad-agent-standalone-fred.md
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
const AGENT_SEGMENT = 'agents';
|
|
19
|
+
|
|
20
|
+
// BMAD installation folder name - centralized constant for all installers
|
|
21
|
+
const BMAD_FOLDER_NAME = '_bmad';
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Convert hierarchical path to flat dash-separated name (NEW STANDARD)
|
|
25
|
+
* Converts: 'bmm', 'agents', 'pm' → 'bmad-agent-bmm-pm.md'
|
|
26
|
+
* Converts: 'bmm', 'workflows', 'correct-course' → 'bmad-bmm-correct-course.md'
|
|
27
|
+
* Converts: 'core', 'agents', 'brainstorming' → 'bmad-agent-brainstorming.md' (core agents skip module name)
|
|
28
|
+
* Converts: 'standalone', 'agents', 'fred' → 'bmad-agent-standalone-fred.md'
|
|
29
|
+
*
|
|
30
|
+
* @param {string} module - Module name (e.g., 'bmm', 'core', 'standalone')
|
|
31
|
+
* @param {string} type - Artifact type ('agents', 'workflows', 'tasks', 'tools')
|
|
32
|
+
* @param {string} name - Artifact name (e.g., 'pm', 'brainstorming')
|
|
33
|
+
* @returns {string} Flat filename like 'bmad-agent-bmm-pm.md' or 'bmad-bmm-correct-course.md'
|
|
34
|
+
*/
|
|
35
|
+
function toDashName(module, type, name) {
|
|
36
|
+
const isAgent = type === AGENT_SEGMENT;
|
|
37
|
+
|
|
38
|
+
// For core module, skip the module name: use 'bmad-agent-name.md' instead of 'bmad-agent-core-name.md'
|
|
39
|
+
if (module === 'core') {
|
|
40
|
+
return isAgent ? `bmad-agent-${name}.md` : `bmad-${name}.md`;
|
|
41
|
+
}
|
|
42
|
+
// For standalone module, include 'standalone' in the name
|
|
43
|
+
if (module === 'standalone') {
|
|
44
|
+
return isAgent ? `bmad-agent-standalone-${name}.md` : `bmad-standalone-${name}.md`;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// Module artifacts: bmad-module-name.md or bmad-agent-module-name.md
|
|
48
|
+
// eslint-disable-next-line unicorn/prefer-string-replace-all -- regex replace is intentional here
|
|
49
|
+
const dashName = name.replace(/\//g, '-'); // Flatten nested paths
|
|
50
|
+
return isAgent ? `bmad-agent-${module}-${dashName}.md` : `bmad-${module}-${dashName}.md`;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Convert relative path to flat dash-separated name
|
|
55
|
+
* Converts: 'bmm/agents/pm.md' → 'bmad-agent-bmm-pm.md'
|
|
56
|
+
* Converts: 'bmm/agents/analyst/analyst.md' → 'bmad-agent-bmm-analyst.md' (uses folder name)
|
|
57
|
+
* Converts: 'bmm/workflows/correct-course.md' → 'bmad-bmm-correct-course.md'
|
|
58
|
+
* Converts: 'core/agents/brainstorming.md' → 'bmad-agent-brainstorming.md' (core agents skip module name)
|
|
59
|
+
*
|
|
60
|
+
* @param {string} relativePath - Path like 'bmm/agents/pm.md'
|
|
61
|
+
* @returns {string} Flat filename like 'bmad-agent-bmm-pm.md' or 'bmad-brainstorming.md'
|
|
62
|
+
*/
|
|
63
|
+
function toDashPath(relativePath) {
|
|
64
|
+
if (!relativePath || typeof relativePath !== 'string') {
|
|
65
|
+
// Return a safe default for invalid input
|
|
66
|
+
return 'bmad-unknown.md';
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// Strip common file extensions to avoid double extensions in generated filenames
|
|
70
|
+
// e.g., 'create-story.xml' → 'create-story', 'workflow.md' → 'workflow'
|
|
71
|
+
const withoutExt = relativePath.replace(/\.(md|yaml|yml|json|xml|toml)$/i, '');
|
|
72
|
+
const parts = withoutExt.split(/[/\\]/);
|
|
73
|
+
|
|
74
|
+
const module = parts[0];
|
|
75
|
+
const type = parts[1];
|
|
76
|
+
let name;
|
|
77
|
+
|
|
78
|
+
// For agents, if nested in a folder (more than 3 parts), use the folder name only
|
|
79
|
+
// e.g., 'bmm/agents/analyst/analyst' → 'analyst' (not 'analyst-analyst')
|
|
80
|
+
if (type === 'agents' && parts.length > 3) {
|
|
81
|
+
// Use the folder name (parts[2]) as the name, ignore the file name
|
|
82
|
+
name = parts[2];
|
|
83
|
+
} else {
|
|
84
|
+
// For non-nested or non-agents, join all parts after type
|
|
85
|
+
name = parts.slice(2).join('-');
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
return toDashName(module, type, name);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* Create custom agent dash name
|
|
93
|
+
* Creates: 'bmad-custom-agent-fred-commit-poet.md'
|
|
94
|
+
*
|
|
95
|
+
* @param {string} agentName - Custom agent name
|
|
96
|
+
* @returns {string} Flat filename like 'bmad-custom-agent-fred-commit-poet.md'
|
|
97
|
+
*/
|
|
98
|
+
function customAgentDashName(agentName) {
|
|
99
|
+
return `bmad-custom-agent-${agentName}.md`;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* Check if a filename uses dash format
|
|
104
|
+
* @param {string} filename - Filename to check
|
|
105
|
+
* @returns {boolean} True if filename uses dash format
|
|
106
|
+
*/
|
|
107
|
+
function isDashFormat(filename) {
|
|
108
|
+
return filename.startsWith('bmad-') && filename.includes('-');
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* Extract parts from a dash-formatted filename
|
|
113
|
+
* Parses: 'bmad-agent-bmm-pm.md' → { prefix: 'bmad', module: 'bmm', type: 'agents', name: 'pm' }
|
|
114
|
+
* Parses: 'bmad-bmm-correct-course.md' → { prefix: 'bmad', module: 'bmm', type: 'workflows', name: 'correct-course' }
|
|
115
|
+
* Parses: 'bmad-agent-brainstorming.md' → { prefix: 'bmad', module: 'core', type: 'agents', name: 'brainstorming' } (core agents)
|
|
116
|
+
* Parses: 'bmad-brainstorming.md' → { prefix: 'bmad', module: 'core', type: 'workflows', name: 'brainstorming' } (core workflows)
|
|
117
|
+
* Parses: 'bmad-agent-standalone-fred.md' → { prefix: 'bmad', module: 'standalone', type: 'agents', name: 'fred' }
|
|
118
|
+
* Parses: 'bmad-standalone-foo.md' → { prefix: 'bmad', module: 'standalone', type: 'workflows', name: 'foo' }
|
|
119
|
+
*
|
|
120
|
+
* @param {string} filename - Dash-formatted filename
|
|
121
|
+
* @returns {Object|null} Parsed parts or null if invalid format
|
|
122
|
+
*/
|
|
123
|
+
function parseDashName(filename) {
|
|
124
|
+
const withoutExt = filename.replace('.md', '');
|
|
125
|
+
const parts = withoutExt.split('-');
|
|
126
|
+
|
|
127
|
+
if (parts.length < 2 || parts[0] !== 'bmad') {
|
|
128
|
+
return null;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
// Check if this is an agent file (has 'agent' as second part)
|
|
132
|
+
const isAgent = parts[1] === 'agent';
|
|
133
|
+
|
|
134
|
+
if (isAgent) {
|
|
135
|
+
// This is an agent file
|
|
136
|
+
// Format: bmad-agent-name (core) or bmad-agent-standalone-name or bmad-agent-module-name
|
|
137
|
+
if (parts.length >= 4 && parts[2] === 'standalone') {
|
|
138
|
+
// Standalone agent: bmad-agent-standalone-name
|
|
139
|
+
return {
|
|
140
|
+
prefix: parts[0],
|
|
141
|
+
module: 'standalone',
|
|
142
|
+
type: 'agents',
|
|
143
|
+
name: parts.slice(3).join('-'),
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
if (parts.length === 3) {
|
|
147
|
+
// Core agent: bmad-agent-name
|
|
148
|
+
return {
|
|
149
|
+
prefix: parts[0],
|
|
150
|
+
module: 'core',
|
|
151
|
+
type: 'agents',
|
|
152
|
+
name: parts[2],
|
|
153
|
+
};
|
|
154
|
+
} else {
|
|
155
|
+
// Module agent: bmad-agent-module-name
|
|
156
|
+
return {
|
|
157
|
+
prefix: parts[0],
|
|
158
|
+
module: parts[2],
|
|
159
|
+
type: 'agents',
|
|
160
|
+
name: parts.slice(3).join('-'),
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
// Not an agent file - must be a workflow/tool/task
|
|
166
|
+
// If only 2 parts (bmad-name), it's a core workflow/tool/task
|
|
167
|
+
if (parts.length === 2) {
|
|
168
|
+
return {
|
|
169
|
+
prefix: parts[0],
|
|
170
|
+
module: 'core',
|
|
171
|
+
type: 'workflows', // Default to workflows for non-agent core items
|
|
172
|
+
name: parts[1],
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
// Check for standalone non-agent: bmad-standalone-name
|
|
177
|
+
if (parts[1] === 'standalone') {
|
|
178
|
+
return {
|
|
179
|
+
prefix: parts[0],
|
|
180
|
+
module: 'standalone',
|
|
181
|
+
type: 'workflows', // Default to workflows for non-agent standalone items
|
|
182
|
+
name: parts.slice(2).join('-'),
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
// Otherwise, it's a module workflow/tool/task (bmad-module-name)
|
|
187
|
+
return {
|
|
188
|
+
prefix: parts[0],
|
|
189
|
+
module: parts[1],
|
|
190
|
+
type: 'workflows', // Default to workflows for non-agent module items
|
|
191
|
+
name: parts.slice(2).join('-'),
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
/**
|
|
196
|
+
* Resolve the skill name for an artifact.
|
|
197
|
+
* Prefers canonicalId from a bmad-skill-manifest.yaml sidecar when available,
|
|
198
|
+
* falling back to the path-derived name from toDashPath().
|
|
199
|
+
*
|
|
200
|
+
* @param {Object} artifact - Artifact object (must have relativePath; may have canonicalId)
|
|
201
|
+
* @returns {string} Filename like 'bmad-create-prd.md' or 'bmad-agent-bmm-pm.md'
|
|
202
|
+
*/
|
|
203
|
+
function resolveSkillName(artifact) {
|
|
204
|
+
if (artifact.canonicalId) {
|
|
205
|
+
return `${artifact.canonicalId}.md`;
|
|
206
|
+
}
|
|
207
|
+
return toDashPath(artifact.relativePath);
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
module.exports = {
|
|
211
|
+
toDashName,
|
|
212
|
+
toDashPath,
|
|
213
|
+
resolveSkillName,
|
|
214
|
+
customAgentDashName,
|
|
215
|
+
isDashFormat,
|
|
216
|
+
parseDashName,
|
|
217
|
+
AGENT_SEGMENT,
|
|
218
|
+
BMAD_FOLDER_NAME,
|
|
219
|
+
};
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
const path = require('node:path');
|
|
2
|
+
const fs = require('../../fs-native');
|
|
3
|
+
const yaml = require('yaml');
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Load bmad-skill-manifest.yaml from a directory.
|
|
7
|
+
* Single-entry manifests (canonicalId at top level) apply to all files in the directory.
|
|
8
|
+
* Multi-entry manifests are keyed by source filename.
|
|
9
|
+
* @param {string} dirPath - Directory to check for bmad-skill-manifest.yaml
|
|
10
|
+
* @returns {Object|null} Parsed manifest or null
|
|
11
|
+
*/
|
|
12
|
+
async function loadSkillManifest(dirPath) {
|
|
13
|
+
const manifestPath = path.join(dirPath, 'bmad-skill-manifest.yaml');
|
|
14
|
+
try {
|
|
15
|
+
if (!(await fs.pathExists(manifestPath))) return null;
|
|
16
|
+
const content = await fs.readFile(manifestPath, 'utf8');
|
|
17
|
+
const parsed = yaml.parse(content);
|
|
18
|
+
if (!parsed || typeof parsed !== 'object') return null;
|
|
19
|
+
if (parsed.canonicalId || parsed.type) return { __single: parsed };
|
|
20
|
+
return parsed;
|
|
21
|
+
} catch (error) {
|
|
22
|
+
console.warn(`Warning: Failed to parse bmad-skill-manifest.yaml in ${dirPath}: ${error.message}`);
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Get the canonicalId for a specific file from a loaded skill manifest.
|
|
29
|
+
* @param {Object|null} manifest - Loaded manifest (from loadSkillManifest)
|
|
30
|
+
* @param {string} filename - Source filename to look up (e.g., 'pm.md', 'help.md')
|
|
31
|
+
* @returns {string} canonicalId or empty string
|
|
32
|
+
*/
|
|
33
|
+
function getCanonicalId(manifest, filename) {
|
|
34
|
+
if (!manifest) return '';
|
|
35
|
+
// Single-entry manifest applies to all files in the directory
|
|
36
|
+
if (manifest.__single) return manifest.__single.canonicalId || '';
|
|
37
|
+
// Multi-entry: look up by filename directly
|
|
38
|
+
if (manifest[filename]) return manifest[filename].canonicalId || '';
|
|
39
|
+
return '';
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Get the artifact type for a specific file from a loaded skill manifest.
|
|
44
|
+
* @param {Object|null} manifest - Loaded manifest (from loadSkillManifest)
|
|
45
|
+
* @param {string} filename - Source filename to look up
|
|
46
|
+
* @returns {string|null} type or null
|
|
47
|
+
*/
|
|
48
|
+
function getArtifactType(manifest, filename) {
|
|
49
|
+
if (!manifest) return null;
|
|
50
|
+
// Single-entry manifest applies to all files in the directory
|
|
51
|
+
if (manifest.__single) return manifest.__single.type || null;
|
|
52
|
+
// Multi-entry: look up by filename directly
|
|
53
|
+
if (manifest[filename]) return manifest[filename].type || null;
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
module.exports = { loadSkillManifest, getCanonicalId, getArtifactType };
|