bmad-method 6.0.3 → 6.0.5-next.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/.augment/code_review_guidelines.yaml +2 -42
- package/.claude/skills/bmad-os-findings-triage/SKILL.md +6 -0
- package/.claude/skills/bmad-os-findings-triage/prompts/agent-prompt.md +104 -0
- package/.claude/skills/bmad-os-findings-triage/prompts/instructions.md +286 -0
- package/.claude/skills/bmad-os-review-pr/SKILL.md +1 -1
- package/.claude/skills/bmad-os-review-pr/prompts/instructions.md +63 -6
- package/.claude/skills/bmad-os-review-prompt/SKILL.md +177 -0
- package/.claude/skills/bmad-os-root-cause-analysis/SKILL.md +12 -0
- package/.claude/skills/bmad-os-root-cause-analysis/prompts/instructions.md +74 -0
- package/.github/ISSUE_TEMPLATE/config.yaml +1 -1
- package/.github/ISSUE_TEMPLATE/documentation.yaml +1 -1
- package/.github/workflows/publish.yaml +243 -0
- package/CHANGELOG.md +32 -0
- package/CONTRIBUTING.md +1 -1
- package/README.md +8 -8
- package/README_CN.md +121 -0
- package/docs/_STYLE_GUIDE.md +10 -10
- package/docs/explanation/brainstorming.md +1 -1
- package/docs/explanation/party-mode.md +1 -1
- package/docs/explanation/preventing-agent-conflicts.md +1 -1
- package/docs/explanation/project-context.md +15 -15
- package/docs/explanation/quick-flow.md +9 -9
- package/docs/how-to/established-projects.md +7 -7
- package/docs/how-to/get-answers-about-bmad.md +2 -2
- package/docs/how-to/install-bmad.md +16 -6
- package/docs/how-to/project-context.md +2 -2
- package/docs/how-to/quick-fixes.md +5 -5
- package/docs/how-to/shard-large-documents.md +1 -1
- package/docs/how-to/upgrade-to-v6.md +8 -5
- package/docs/index.md +2 -2
- package/docs/reference/agents.md +14 -14
- package/docs/reference/commands.md +64 -70
- package/docs/reference/testing.md +1 -1
- package/docs/reference/workflow-map.md +19 -19
- package/docs/tutorials/getting-started.md +34 -34
- package/docs/zh-cn/404.md +9 -0
- package/docs/zh-cn/_STYLE_GUIDE.md +370 -0
- package/docs/zh-cn/explanation/advanced-elicitation.md +62 -0
- package/docs/zh-cn/explanation/adversarial-review.md +71 -0
- package/docs/zh-cn/explanation/brainstorming.md +43 -0
- package/docs/zh-cn/explanation/established-projects-faq.md +60 -0
- package/docs/zh-cn/explanation/party-mode.md +79 -0
- package/docs/zh-cn/explanation/preventing-agent-conflicts.md +137 -0
- package/docs/zh-cn/explanation/project-context.md +176 -0
- package/docs/zh-cn/explanation/quick-flow.md +93 -0
- package/docs/zh-cn/explanation/why-solutioning-matters.md +90 -0
- package/docs/zh-cn/how-to/customize-bmad.md +182 -0
- package/docs/zh-cn/how-to/established-projects.md +134 -0
- package/docs/zh-cn/how-to/get-answers-about-bmad.md +144 -0
- package/docs/zh-cn/how-to/install-bmad.md +105 -0
- package/docs/zh-cn/how-to/non-interactive-installation.md +181 -0
- package/docs/zh-cn/how-to/project-context.md +152 -0
- package/docs/zh-cn/how-to/quick-fixes.md +140 -0
- package/docs/zh-cn/how-to/shard-large-documents.md +86 -0
- package/docs/zh-cn/how-to/upgrade-to-v6.md +120 -0
- package/docs/zh-cn/index.md +69 -0
- package/docs/zh-cn/reference/agents.md +41 -0
- package/docs/zh-cn/reference/commands.md +166 -0
- package/docs/zh-cn/reference/modules.md +94 -0
- package/docs/zh-cn/reference/testing.md +122 -0
- package/docs/zh-cn/reference/workflow-map.md +104 -0
- package/docs/zh-cn/roadmap.mdx +152 -0
- package/docs/zh-cn/tutorials/getting-started.md +300 -0
- package/package.json +1 -1
- package/src/bmm/agents/analyst.agent.yaml +1 -1
- package/src/bmm/agents/bmad-skill-manifest.yaml +39 -0
- package/src/bmm/agents/dev.agent.yaml +2 -2
- package/src/bmm/agents/pm.agent.yaml +1 -1
- package/src/bmm/agents/qa.agent.yaml +1 -1
- package/src/bmm/agents/quick-flow-solo-dev.agent.yaml +6 -2
- package/src/bmm/agents/sm.agent.yaml +4 -4
- package/src/bmm/agents/tech-writer/bmad-skill-manifest.yaml +3 -0
- package/src/bmm/agents/tech-writer/tech-writer.agent.yaml +1 -1
- package/src/bmm/module-help.csv +11 -10
- package/src/bmm/workflows/1-analysis/create-product-brief/bmad-skill-manifest.yaml +3 -0
- package/src/bmm/workflows/1-analysis/create-product-brief/steps/step-02-vision.md +1 -1
- package/src/bmm/workflows/1-analysis/create-product-brief/steps/step-03-users.md +1 -1
- package/src/bmm/workflows/1-analysis/create-product-brief/steps/step-04-metrics.md +1 -1
- package/src/bmm/workflows/1-analysis/create-product-brief/steps/step-05-scope.md +1 -1
- package/src/bmm/workflows/1-analysis/create-product-brief/steps/step-06-complete.md +1 -1
- package/src/bmm/workflows/1-analysis/research/bmad-skill-manifest.yaml +14 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/bmad-skill-manifest.yaml +14 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-02-discovery.md +1 -1
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-02b-vision.md +1 -1
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-02c-executive-summary.md +1 -1
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-03-success.md +1 -1
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-04-journeys.md +1 -1
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-05-domain.md +1 -1
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-06-innovation.md +1 -1
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-07-project-type.md +1 -1
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-08-scoping.md +1 -1
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-09-functional.md +1 -1
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-10-nonfunctional.md +1 -1
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-11-polish.md +1 -1
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-12-complete.md +1 -1
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-e/step-e-01-discovery.md +1 -1
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-e/step-e-02-review.md +1 -1
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-01-discovery.md +1 -1
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-10-smart-validation.md +1 -1
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-11-holistic-quality-validation.md +1 -1
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-13-report-complete.md +1 -1
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/bmad-skill-manifest.yaml +3 -0
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-02-discovery.md +1 -1
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-03-core-experience.md +2 -2
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-04-emotional-response.md +2 -2
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-05-inspiration.md +2 -2
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-06-design-system.md +2 -2
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-07-defining-experience.md +2 -2
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-08-visual-foundation.md +2 -2
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-09-design-directions.md +2 -2
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-10-user-journeys.md +2 -2
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-11-component-strategy.md +2 -2
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-12-ux-patterns.md +2 -2
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-13-responsive-accessibility.md +2 -2
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-14-complete.md +1 -1
- package/src/bmm/workflows/3-solutioning/check-implementation-readiness/bmad-skill-manifest.yaml +3 -0
- package/src/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-06-final-assessment.md +1 -1
- package/src/bmm/workflows/3-solutioning/create-architecture/bmad-skill-manifest.yaml +3 -0
- package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-02-context.md +2 -2
- package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-03-starter.md +2 -2
- package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-04-decisions.md +2 -2
- package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-05-patterns.md +2 -2
- package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-06-structure.md +2 -2
- package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-07-validation.md +2 -2
- package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-08-complete.md +1 -1
- package/src/bmm/workflows/3-solutioning/create-epics-and-stories/bmad-skill-manifest.yaml +3 -0
- package/src/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-01-validate-prerequisites.md +1 -1
- package/src/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-02-design-epics.md +1 -1
- package/src/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-03-create-stories.md +1 -1
- package/src/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-04-final-validation.md +2 -2
- package/src/bmm/workflows/4-implementation/code-review/bmad-skill-manifest.yaml +3 -0
- package/src/bmm/workflows/4-implementation/code-review/discover-inputs.md +88 -0
- package/src/bmm/workflows/4-implementation/code-review/workflow.md +271 -0
- package/src/bmm/workflows/4-implementation/correct-course/bmad-skill-manifest.yaml +3 -0
- package/src/bmm/workflows/4-implementation/correct-course/checklist.md +1 -1
- package/src/bmm/workflows/4-implementation/correct-course/{instructions.md → workflow.md} +79 -12
- package/src/bmm/workflows/4-implementation/create-story/bmad-skill-manifest.yaml +3 -0
- package/src/bmm/workflows/4-implementation/create-story/checklist.md +9 -10
- package/src/bmm/workflows/4-implementation/create-story/discover-inputs.md +88 -0
- package/src/bmm/workflows/4-implementation/create-story/workflow.md +388 -0
- package/src/bmm/workflows/4-implementation/dev-story/bmad-skill-manifest.yaml +3 -0
- package/src/bmm/workflows/4-implementation/dev-story/{instructions.xml → workflow.md} +49 -2
- package/src/bmm/workflows/4-implementation/retrospective/bmad-skill-manifest.yaml +3 -0
- package/src/bmm/workflows/4-implementation/retrospective/{instructions.md → workflow.md} +64 -23
- package/src/bmm/workflows/4-implementation/sprint-planning/bmad-skill-manifest.yaml +3 -0
- package/src/bmm/workflows/4-implementation/sprint-planning/sprint-status-template.yaml +1 -0
- package/src/bmm/workflows/4-implementation/sprint-planning/{instructions.md → workflow.md} +55 -10
- package/src/bmm/workflows/4-implementation/sprint-status/bmad-skill-manifest.yaml +3 -0
- package/src/bmm/workflows/4-implementation/sprint-status/{instructions.md → workflow.md} +45 -8
- package/src/bmm/workflows/bmad-quick-flow/bmad-quick-dev-new-preview/SKILL.md +6 -0
- package/src/bmm/workflows/bmad-quick-flow/bmad-quick-dev-new-preview/bmad-skill-manifest.yaml +1 -0
- package/src/bmm/workflows/bmad-quick-flow/bmad-quick-dev-new-preview/steps/step-01-clarify-and-route.md +54 -0
- package/src/bmm/workflows/bmad-quick-flow/bmad-quick-dev-new-preview/steps/step-02-plan.md +39 -0
- package/src/bmm/workflows/bmad-quick-flow/bmad-quick-dev-new-preview/steps/step-03-implement.md +35 -0
- package/src/bmm/workflows/bmad-quick-flow/bmad-quick-dev-new-preview/steps/step-04-review.md +55 -0
- package/src/bmm/workflows/bmad-quick-flow/bmad-quick-dev-new-preview/steps/step-05-present.md +19 -0
- package/src/bmm/workflows/bmad-quick-flow/bmad-quick-dev-new-preview/tech-spec-template.md +90 -0
- package/src/bmm/workflows/bmad-quick-flow/bmad-quick-dev-new-preview/workflow.md +84 -0
- package/src/bmm/workflows/bmad-quick-flow/quick-dev/bmad-skill-manifest.yaml +3 -0
- package/src/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-05-adversarial-review.md +8 -14
- package/src/bmm/workflows/bmad-quick-flow/quick-dev/workflow.md +1 -1
- package/src/bmm/workflows/bmad-quick-flow/quick-spec/bmad-skill-manifest.yaml +3 -0
- package/src/bmm/workflows/bmad-quick-flow/quick-spec/steps/step-04-review.md +4 -6
- package/src/bmm/workflows/bmad-quick-flow/quick-spec/workflow.md +1 -1
- package/src/bmm/workflows/document-project/bmad-skill-manifest.yaml +3 -0
- package/src/bmm/workflows/document-project/instructions.md +5 -7
- package/src/bmm/workflows/document-project/workflow.md +39 -0
- package/src/bmm/workflows/document-project/workflows/deep-dive-instructions.md +0 -1
- package/src/bmm/workflows/document-project/workflows/deep-dive-workflow.md +42 -0
- package/src/bmm/workflows/document-project/workflows/full-scan-instructions.md +0 -1
- package/src/bmm/workflows/document-project/workflows/full-scan-workflow.md +42 -0
- package/src/bmm/workflows/generate-project-context/bmad-skill-manifest.yaml +3 -0
- package/src/bmm/workflows/generate-project-context/steps/step-02-generate.md +2 -2
- package/src/bmm/workflows/qa-generate-e2e-tests/bmad-skill-manifest.yaml +3 -0
- package/src/bmm/workflows/qa-generate-e2e-tests/checklist.md +1 -1
- package/src/bmm/workflows/qa-generate-e2e-tests/{instructions.md → workflow.md} +40 -7
- package/src/core/agents/bmad-master.agent.yaml +1 -1
- package/src/core/agents/bmad-skill-manifest.yaml +3 -0
- package/src/core/module-help.csv +3 -2
- package/src/core/module.yaml +1 -1
- package/src/core/tasks/bmad-help/SKILL.md +6 -0
- package/src/core/tasks/bmad-help/bmad-skill-manifest.yaml +1 -0
- package/src/core/tasks/{help.md → bmad-help/workflow.md} +6 -4
- package/src/core/tasks/bmad-review-adversarial-general/SKILL.md +6 -0
- package/src/core/tasks/bmad-review-adversarial-general/bmad-skill-manifest.yaml +1 -0
- package/src/core/tasks/bmad-review-adversarial-general/workflow.md +32 -0
- package/src/core/tasks/bmad-review-edge-case-hunter/SKILL.md +6 -0
- package/src/core/tasks/bmad-review-edge-case-hunter/bmad-skill-manifest.yaml +1 -0
- package/src/core/tasks/bmad-review-edge-case-hunter/workflow.md +62 -0
- package/src/core/tasks/bmad-skill-manifest.yaml +19 -0
- package/src/core/workflows/advanced-elicitation/bmad-skill-manifest.yaml +3 -0
- package/src/core/workflows/advanced-elicitation/workflow.md +138 -0
- package/src/core/workflows/brainstorming/bmad-skill-manifest.yaml +3 -0
- package/src/core/workflows/brainstorming/steps/step-01-session-setup.md +31 -18
- package/src/core/workflows/brainstorming/steps/step-01b-continue.md +1 -1
- package/src/core/workflows/brainstorming/steps/step-03-technique-execution.md +3 -3
- package/src/core/workflows/brainstorming/steps/step-04-idea-organization.md +2 -2
- package/src/core/workflows/brainstorming/workflow.md +5 -3
- package/src/core/workflows/party-mode/bmad-skill-manifest.yaml +3 -0
- package/src/core/workflows/party-mode/workflow.md +1 -1
- package/src/utility/agent-components/activation-steps.txt +2 -2
- package/src/utility/agent-components/handler-multi.txt +1 -2
- package/test/adversarial-review-tests/README.md +3 -3
- package/test/adversarial-review-tests/test-cases.yaml +2 -2
- package/test/fixtures/agent-schema/valid/menu/multiple-menu-items.agent.yaml +1 -1
- package/test/fixtures/agent-schema/valid/menu-commands/all-command-types.agent.yaml +1 -1
- package/test/fixtures/agent-schema/valid/menu-commands/multiple-commands.agent.yaml +1 -2
- package/test/fixtures/file-refs-csv/valid/bmm-style.csv +1 -1
- package/test/test-file-refs-csv.js +1 -1
- package/test/test-install-to-bmad.js +154 -0
- package/test/test-installation-components.js +1586 -2
- package/test/test-workflow-path-regex.js +88 -0
- package/tools/cli/installers/install-messages.yaml +1 -1
- package/tools/cli/installers/lib/core/installer.js +34 -1
- package/tools/cli/installers/lib/core/manifest-generator.js +332 -41
- package/tools/cli/installers/lib/ide/_base-ide.js +24 -15
- package/tools/cli/installers/lib/ide/_config-driven.js +547 -53
- package/tools/cli/installers/lib/ide/manager.js +26 -62
- package/tools/cli/installers/lib/ide/platform-codes.yaml +116 -29
- package/tools/cli/installers/lib/ide/shared/agent-command-generator.js +1 -0
- package/tools/cli/installers/lib/ide/shared/bmad-artifacts.js +7 -0
- package/tools/cli/installers/lib/ide/shared/path-utils.js +68 -3
- package/tools/cli/installers/lib/ide/shared/skill-manifest.js +90 -0
- package/tools/cli/installers/lib/ide/shared/task-tool-command-generator.js +2 -0
- package/tools/cli/installers/lib/ide/shared/workflow-command-generator.js +6 -145
- package/tools/cli/installers/lib/ide/templates/agent-command-template.md +1 -1
- package/tools/cli/installers/lib/ide/templates/combined/default-workflow.md +1 -1
- package/tools/cli/installers/lib/ide/templates/combined/gemini-workflow-yaml.toml +1 -1
- package/tools/cli/installers/lib/ide/templates/combined/gemini-workflow.toml +1 -1
- package/tools/cli/installers/lib/ide/templates/combined/opencode-agent.md +1 -1
- package/tools/cli/installers/lib/ide/templates/combined/opencode-task.md +0 -1
- package/tools/cli/installers/lib/ide/templates/combined/opencode-tool.md +0 -1
- package/tools/cli/installers/lib/ide/templates/combined/opencode-workflow-yaml.md +0 -1
- package/tools/cli/installers/lib/ide/templates/combined/opencode-workflow.md +0 -1
- package/tools/cli/installers/lib/modules/manager.js +9 -132
- package/tools/cli/lib/agent/compiler.js +1 -10
- package/tools/cli/lib/agent-analyzer.js +2 -14
- package/tools/cli/lib/yaml-xml-builder.js +1 -18
- package/tools/docs/native-skills-migration-checklist.md +281 -0
- package/tools/platform-codes.yaml +1 -1
- package/tools/schema/agent.js +1 -3
- package/tools/validate-file-refs.js +2 -0
- package/website/astro.config.mjs +24 -3
- package/website/src/content/config.ts +2 -1
- package/website/src/content/i18n/zh-CN.json +28 -0
- package/src/bmm/workflows/4-implementation/code-review/instructions.xml +0 -227
- package/src/bmm/workflows/4-implementation/code-review/workflow.yaml +0 -43
- package/src/bmm/workflows/4-implementation/correct-course/workflow.yaml +0 -53
- package/src/bmm/workflows/4-implementation/create-story/instructions.xml +0 -346
- package/src/bmm/workflows/4-implementation/create-story/workflow.yaml +0 -52
- package/src/bmm/workflows/4-implementation/dev-story/workflow.yaml +0 -20
- package/src/bmm/workflows/4-implementation/retrospective/workflow.yaml +0 -52
- package/src/bmm/workflows/4-implementation/sprint-planning/workflow.yaml +0 -47
- package/src/bmm/workflows/4-implementation/sprint-status/workflow.yaml +0 -25
- package/src/bmm/workflows/document-project/workflow.yaml +0 -22
- package/src/bmm/workflows/document-project/workflows/deep-dive.yaml +0 -31
- package/src/bmm/workflows/document-project/workflows/full-scan.yaml +0 -31
- package/src/bmm/workflows/qa-generate-e2e-tests/workflow.yaml +0 -42
- package/src/core/tasks/review-adversarial-general.xml +0 -49
- package/src/core/tasks/workflow.xml +0 -235
- package/src/core/workflows/advanced-elicitation/workflow.xml +0 -118
- package/src/utility/agent-components/handler-validate-workflow.txt +0 -7
- package/src/utility/agent-components/handler-workflow.txt +0 -10
- package/tools/cli/installers/lib/ide/codex.js +0 -440
- package/tools/cli/installers/lib/ide/github-copilot.js +0 -699
- package/tools/cli/installers/lib/ide/kilo.js +0 -269
- package/tools/cli/installers/lib/ide/rovodev.js +0 -257
- package/tools/cli/installers/lib/ide/templates/combined/default-workflow-yaml.md +0 -14
- package/tools/cli/installers/lib/ide/templates/combined/kiro-workflow-yaml.md +0 -15
- package/tools/cli/installers/lib/ide/templates/workflow-command-template.md +0 -13
- package/tools/cli/installers/lib/ide/templates/workflow-commander.md +0 -5
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
const fs = require('fs-extra');
|
|
2
|
-
const path = require('node:path');
|
|
3
1
|
const { BMAD_FOLDER_NAME } = require('./shared/path-utils');
|
|
4
2
|
const prompts = require('../../../lib/prompts');
|
|
5
3
|
|
|
@@ -8,8 +6,7 @@ const prompts = require('../../../lib/prompts');
|
|
|
8
6
|
* Dynamically discovers and loads IDE handlers
|
|
9
7
|
*
|
|
10
8
|
* Loading strategy:
|
|
11
|
-
*
|
|
12
|
-
* 2. Config-driven handlers (from platform-codes.yaml) - for standard IDE installation patterns
|
|
9
|
+
* All platforms are config-driven from platform-codes.yaml.
|
|
13
10
|
*/
|
|
14
11
|
class IdeManager {
|
|
15
12
|
constructor() {
|
|
@@ -43,49 +40,12 @@ class IdeManager {
|
|
|
43
40
|
}
|
|
44
41
|
|
|
45
42
|
/**
|
|
46
|
-
* Dynamically load all IDE handlers
|
|
47
|
-
* 1. Load custom installer files first (codex.js, github-copilot.js, kilo.js, rovodev.js)
|
|
48
|
-
* 2. Load config-driven handlers from platform-codes.yaml
|
|
43
|
+
* Dynamically load all IDE handlers from platform-codes.yaml
|
|
49
44
|
*/
|
|
50
45
|
async loadHandlers() {
|
|
51
|
-
// Load custom installer files
|
|
52
|
-
await this.loadCustomInstallerFiles();
|
|
53
|
-
|
|
54
|
-
// Load config-driven handlers from platform-codes.yaml
|
|
55
46
|
await this.loadConfigDrivenHandlers();
|
|
56
47
|
}
|
|
57
48
|
|
|
58
|
-
/**
|
|
59
|
-
* Load custom installer files (unique installation logic)
|
|
60
|
-
* These files have special installation patterns that don't fit the config-driven model
|
|
61
|
-
*/
|
|
62
|
-
async loadCustomInstallerFiles() {
|
|
63
|
-
const ideDir = __dirname;
|
|
64
|
-
const customFiles = ['codex.js', 'github-copilot.js', 'kilo.js', 'rovodev.js'];
|
|
65
|
-
|
|
66
|
-
for (const file of customFiles) {
|
|
67
|
-
const filePath = path.join(ideDir, file);
|
|
68
|
-
if (!fs.existsSync(filePath)) continue;
|
|
69
|
-
|
|
70
|
-
try {
|
|
71
|
-
const HandlerModule = require(filePath);
|
|
72
|
-
const HandlerClass = HandlerModule.default || Object.values(HandlerModule)[0];
|
|
73
|
-
|
|
74
|
-
if (HandlerClass) {
|
|
75
|
-
const instance = new HandlerClass();
|
|
76
|
-
if (instance.name && typeof instance.name === 'string') {
|
|
77
|
-
if (typeof instance.setBmadFolderName === 'function') {
|
|
78
|
-
instance.setBmadFolderName(this.bmadFolderName);
|
|
79
|
-
}
|
|
80
|
-
this.handlers.set(instance.name, instance);
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
} catch (error) {
|
|
84
|
-
await prompts.log.warn(`Warning: Could not load ${file}: ${error.message}`);
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
|
|
89
49
|
/**
|
|
90
50
|
* Load config-driven handlers from platform-codes.yaml
|
|
91
51
|
* This creates ConfigDrivenIdeSetup instances for platforms with installer config
|
|
@@ -97,9 +57,6 @@ class IdeManager {
|
|
|
97
57
|
const { ConfigDrivenIdeSetup } = require('./_config-driven');
|
|
98
58
|
|
|
99
59
|
for (const [platformCode, platformInfo] of Object.entries(platformConfig.platforms)) {
|
|
100
|
-
// Skip if already loaded by custom installer
|
|
101
|
-
if (this.handlers.has(platformCode)) continue;
|
|
102
|
-
|
|
103
60
|
// Skip if no installer config (platform may not need installation)
|
|
104
61
|
if (!platformInfo.installer) continue;
|
|
105
62
|
|
|
@@ -127,6 +84,11 @@ class IdeManager {
|
|
|
127
84
|
continue;
|
|
128
85
|
}
|
|
129
86
|
|
|
87
|
+
// Skip suspended platforms (e.g., IDE doesn't support skills yet)
|
|
88
|
+
if (handler.platformConfig?.suspended) {
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
|
|
130
92
|
ides.push({
|
|
131
93
|
value: key,
|
|
132
94
|
name: name,
|
|
@@ -176,6 +138,22 @@ class IdeManager {
|
|
|
176
138
|
return { success: false, ide: ideName, error: 'unsupported IDE' };
|
|
177
139
|
}
|
|
178
140
|
|
|
141
|
+
// Block suspended platforms — clean up legacy files but don't install
|
|
142
|
+
if (handler.platformConfig?.suspended) {
|
|
143
|
+
if (!options.silent) {
|
|
144
|
+
await prompts.log.warn(`${handler.displayName || ideName}: ${handler.platformConfig.suspended}`);
|
|
145
|
+
}
|
|
146
|
+
// Still clean up legacy artifacts so old broken configs don't linger
|
|
147
|
+
if (typeof handler.cleanup === 'function') {
|
|
148
|
+
try {
|
|
149
|
+
await handler.cleanup(projectDir, { silent: true });
|
|
150
|
+
} catch {
|
|
151
|
+
// Best-effort cleanup — don't let stale files block the suspended result
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
return { success: false, ide: ideName, error: 'suspended' };
|
|
155
|
+
}
|
|
156
|
+
|
|
179
157
|
try {
|
|
180
158
|
const handlerResult = await handler.setup(projectDir, bmadDir, options);
|
|
181
159
|
// Build detail string from handler-returned data
|
|
@@ -189,24 +167,10 @@ class IdeManager {
|
|
|
189
167
|
if (r.tasks > 0) parts.push(`${r.tasks} tasks`);
|
|
190
168
|
if (r.tools > 0) parts.push(`${r.tools} tools`);
|
|
191
169
|
detail = parts.join(', ');
|
|
192
|
-
} else if (handlerResult && handlerResult.counts) {
|
|
193
|
-
// Codex handler returns { success, counts: { agents, workflows, tasks }, written }
|
|
194
|
-
const c = handlerResult.counts;
|
|
195
|
-
const parts = [];
|
|
196
|
-
if (c.agents > 0) parts.push(`${c.agents} agents`);
|
|
197
|
-
if (c.workflows > 0) parts.push(`${c.workflows} workflows`);
|
|
198
|
-
if (c.tasks > 0) parts.push(`${c.tasks} tasks`);
|
|
199
|
-
detail = parts.join(', ');
|
|
200
|
-
} else if (handlerResult && handlerResult.modes !== undefined) {
|
|
201
|
-
// Kilo handler returns { success, modes, workflows, tasks, tools }
|
|
202
|
-
const parts = [];
|
|
203
|
-
if (handlerResult.modes > 0) parts.push(`${handlerResult.modes} modes`);
|
|
204
|
-
if (handlerResult.workflows > 0) parts.push(`${handlerResult.workflows} workflows`);
|
|
205
|
-
if (handlerResult.tasks > 0) parts.push(`${handlerResult.tasks} tasks`);
|
|
206
|
-
if (handlerResult.tools > 0) parts.push(`${handlerResult.tools} tools`);
|
|
207
|
-
detail = parts.join(', ');
|
|
208
170
|
}
|
|
209
|
-
|
|
171
|
+
// Propagate handler's success status (default true for backward compat)
|
|
172
|
+
const success = handlerResult?.success !== false;
|
|
173
|
+
return { success, ide: ideName, detail, error: handlerResult?.error, handlerResult };
|
|
210
174
|
} catch (error) {
|
|
211
175
|
await prompts.log.error(`Failed to setup ${ideName}: ${error.message}`);
|
|
212
176
|
return { success: false, ide: ideName, error: error.message };
|
|
@@ -20,8 +20,11 @@ platforms:
|
|
|
20
20
|
category: ide
|
|
21
21
|
description: "Google's AI development environment"
|
|
22
22
|
installer:
|
|
23
|
-
|
|
23
|
+
legacy_targets:
|
|
24
|
+
- .agent/workflows
|
|
25
|
+
target_dir: .agent/skills
|
|
24
26
|
template_type: antigravity
|
|
27
|
+
skill_format: true
|
|
25
28
|
|
|
26
29
|
auggie:
|
|
27
30
|
name: "Auggie"
|
|
@@ -29,8 +32,11 @@ platforms:
|
|
|
29
32
|
category: cli
|
|
30
33
|
description: "AI development tool"
|
|
31
34
|
installer:
|
|
32
|
-
|
|
35
|
+
legacy_targets:
|
|
36
|
+
- .augment/commands
|
|
37
|
+
target_dir: .augment/skills
|
|
33
38
|
template_type: default
|
|
39
|
+
skill_format: true
|
|
34
40
|
|
|
35
41
|
claude-code:
|
|
36
42
|
name: "Claude Code"
|
|
@@ -38,8 +44,12 @@ platforms:
|
|
|
38
44
|
category: cli
|
|
39
45
|
description: "Anthropic's official CLI for Claude"
|
|
40
46
|
installer:
|
|
41
|
-
|
|
47
|
+
legacy_targets:
|
|
48
|
+
- .claude/commands
|
|
49
|
+
target_dir: .claude/skills
|
|
42
50
|
template_type: default
|
|
51
|
+
skill_format: true
|
|
52
|
+
ancestor_conflict_check: true
|
|
43
53
|
|
|
44
54
|
cline:
|
|
45
55
|
name: "Cline"
|
|
@@ -47,15 +57,26 @@ platforms:
|
|
|
47
57
|
category: ide
|
|
48
58
|
description: "AI coding assistant"
|
|
49
59
|
installer:
|
|
50
|
-
|
|
51
|
-
|
|
60
|
+
legacy_targets:
|
|
61
|
+
- .clinerules/workflows
|
|
62
|
+
target_dir: .cline/skills
|
|
63
|
+
template_type: default
|
|
64
|
+
skill_format: true
|
|
52
65
|
|
|
53
66
|
codex:
|
|
54
67
|
name: "Codex"
|
|
55
68
|
preferred: false
|
|
56
69
|
category: cli
|
|
57
70
|
description: "OpenAI Codex integration"
|
|
58
|
-
|
|
71
|
+
installer:
|
|
72
|
+
legacy_targets:
|
|
73
|
+
- .codex/prompts
|
|
74
|
+
- ~/.codex/prompts
|
|
75
|
+
target_dir: .agents/skills
|
|
76
|
+
template_type: default
|
|
77
|
+
skill_format: true
|
|
78
|
+
ancestor_conflict_check: true
|
|
79
|
+
artifact_types: [agents, workflows, tasks]
|
|
59
80
|
|
|
60
81
|
codebuddy:
|
|
61
82
|
name: "CodeBuddy"
|
|
@@ -63,8 +84,11 @@ platforms:
|
|
|
63
84
|
category: ide
|
|
64
85
|
description: "Tencent Cloud Code Assistant - AI-powered coding companion"
|
|
65
86
|
installer:
|
|
66
|
-
|
|
87
|
+
legacy_targets:
|
|
88
|
+
- .codebuddy/commands
|
|
89
|
+
target_dir: .codebuddy/skills
|
|
67
90
|
template_type: default
|
|
91
|
+
skill_format: true
|
|
68
92
|
|
|
69
93
|
crush:
|
|
70
94
|
name: "Crush"
|
|
@@ -72,8 +96,11 @@ platforms:
|
|
|
72
96
|
category: ide
|
|
73
97
|
description: "AI development assistant"
|
|
74
98
|
installer:
|
|
75
|
-
|
|
99
|
+
legacy_targets:
|
|
100
|
+
- .crush/commands
|
|
101
|
+
target_dir: .crush/skills
|
|
76
102
|
template_type: default
|
|
103
|
+
skill_format: true
|
|
77
104
|
|
|
78
105
|
cursor:
|
|
79
106
|
name: "Cursor"
|
|
@@ -81,8 +108,11 @@ platforms:
|
|
|
81
108
|
category: ide
|
|
82
109
|
description: "AI-first code editor"
|
|
83
110
|
installer:
|
|
84
|
-
|
|
111
|
+
legacy_targets:
|
|
112
|
+
- .cursor/commands
|
|
113
|
+
target_dir: .cursor/skills
|
|
85
114
|
template_type: default
|
|
115
|
+
skill_format: true
|
|
86
116
|
|
|
87
117
|
gemini:
|
|
88
118
|
name: "Gemini CLI"
|
|
@@ -90,15 +120,24 @@ platforms:
|
|
|
90
120
|
category: cli
|
|
91
121
|
description: "Google's CLI for Gemini"
|
|
92
122
|
installer:
|
|
93
|
-
|
|
94
|
-
|
|
123
|
+
legacy_targets:
|
|
124
|
+
- .gemini/commands
|
|
125
|
+
target_dir: .gemini/skills
|
|
126
|
+
template_type: default
|
|
127
|
+
skill_format: true
|
|
95
128
|
|
|
96
129
|
github-copilot:
|
|
97
130
|
name: "GitHub Copilot"
|
|
98
131
|
preferred: false
|
|
99
132
|
category: ide
|
|
100
133
|
description: "GitHub's AI pair programmer"
|
|
101
|
-
|
|
134
|
+
installer:
|
|
135
|
+
legacy_targets:
|
|
136
|
+
- .github/agents
|
|
137
|
+
- .github/prompts
|
|
138
|
+
target_dir: .github/skills
|
|
139
|
+
template_type: default
|
|
140
|
+
skill_format: true
|
|
102
141
|
|
|
103
142
|
iflow:
|
|
104
143
|
name: "iFlow"
|
|
@@ -106,15 +145,24 @@ platforms:
|
|
|
106
145
|
category: ide
|
|
107
146
|
description: "AI workflow automation"
|
|
108
147
|
installer:
|
|
109
|
-
|
|
148
|
+
legacy_targets:
|
|
149
|
+
- .iflow/commands
|
|
150
|
+
target_dir: .iflow/skills
|
|
110
151
|
template_type: default
|
|
152
|
+
skill_format: true
|
|
111
153
|
|
|
112
154
|
kilo:
|
|
113
155
|
name: "KiloCoder"
|
|
114
156
|
preferred: false
|
|
115
157
|
category: ide
|
|
116
158
|
description: "AI coding platform"
|
|
117
|
-
|
|
159
|
+
suspended: "Kilo Code does not yet support the Agent Skills standard. Support is paused until they implement it. See https://github.com/kilocode/kilo-code/issues for updates."
|
|
160
|
+
installer:
|
|
161
|
+
legacy_targets:
|
|
162
|
+
- .kilocode/workflows
|
|
163
|
+
target_dir: .kilocode/skills
|
|
164
|
+
template_type: default
|
|
165
|
+
skill_format: true
|
|
118
166
|
|
|
119
167
|
kiro:
|
|
120
168
|
name: "Kiro"
|
|
@@ -122,8 +170,11 @@ platforms:
|
|
|
122
170
|
category: ide
|
|
123
171
|
description: "Amazon's AI-powered IDE"
|
|
124
172
|
installer:
|
|
125
|
-
|
|
173
|
+
legacy_targets:
|
|
174
|
+
- .kiro/steering
|
|
175
|
+
target_dir: .kiro/skills
|
|
126
176
|
template_type: kiro
|
|
177
|
+
skill_format: true
|
|
127
178
|
|
|
128
179
|
opencode:
|
|
129
180
|
name: "OpenCode"
|
|
@@ -131,13 +182,25 @@ platforms:
|
|
|
131
182
|
category: ide
|
|
132
183
|
description: "OpenCode terminal coding assistant"
|
|
133
184
|
installer:
|
|
134
|
-
|
|
135
|
-
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
-
|
|
139
|
-
|
|
140
|
-
|
|
185
|
+
legacy_targets:
|
|
186
|
+
- .opencode/agents
|
|
187
|
+
- .opencode/commands
|
|
188
|
+
- .opencode/agent
|
|
189
|
+
- .opencode/command
|
|
190
|
+
target_dir: .opencode/skills
|
|
191
|
+
template_type: opencode
|
|
192
|
+
skill_format: true
|
|
193
|
+
ancestor_conflict_check: true
|
|
194
|
+
|
|
195
|
+
pi:
|
|
196
|
+
name: "Pi"
|
|
197
|
+
preferred: false
|
|
198
|
+
category: cli
|
|
199
|
+
description: "Provider-agnostic terminal-native AI coding agent"
|
|
200
|
+
installer:
|
|
201
|
+
target_dir: .pi/skills
|
|
202
|
+
template_type: default
|
|
203
|
+
skill_format: true
|
|
141
204
|
|
|
142
205
|
qwen:
|
|
143
206
|
name: "QwenCoder"
|
|
@@ -145,24 +208,35 @@ platforms:
|
|
|
145
208
|
category: ide
|
|
146
209
|
description: "Qwen AI coding assistant"
|
|
147
210
|
installer:
|
|
148
|
-
|
|
211
|
+
legacy_targets:
|
|
212
|
+
- .qwen/commands
|
|
213
|
+
target_dir: .qwen/skills
|
|
149
214
|
template_type: default
|
|
215
|
+
skill_format: true
|
|
150
216
|
|
|
151
217
|
roo:
|
|
152
|
-
name: "Roo
|
|
218
|
+
name: "Roo Code"
|
|
153
219
|
preferred: false
|
|
154
220
|
category: ide
|
|
155
221
|
description: "Enhanced Cline fork"
|
|
156
222
|
installer:
|
|
157
|
-
|
|
223
|
+
legacy_targets:
|
|
224
|
+
- .roo/commands
|
|
225
|
+
target_dir: .roo/skills
|
|
158
226
|
template_type: default
|
|
227
|
+
skill_format: true
|
|
159
228
|
|
|
160
229
|
rovo-dev:
|
|
161
230
|
name: "Rovo Dev"
|
|
162
231
|
preferred: false
|
|
163
232
|
category: ide
|
|
164
233
|
description: "Atlassian's Rovo development environment"
|
|
165
|
-
|
|
234
|
+
installer:
|
|
235
|
+
legacy_targets:
|
|
236
|
+
- .rovodev/workflows
|
|
237
|
+
target_dir: .rovodev/skills
|
|
238
|
+
template_type: default
|
|
239
|
+
skill_format: true
|
|
166
240
|
|
|
167
241
|
trae:
|
|
168
242
|
name: "Trae"
|
|
@@ -170,8 +244,11 @@ platforms:
|
|
|
170
244
|
category: ide
|
|
171
245
|
description: "AI coding tool"
|
|
172
246
|
installer:
|
|
173
|
-
|
|
174
|
-
|
|
247
|
+
legacy_targets:
|
|
248
|
+
- .trae/rules
|
|
249
|
+
target_dir: .trae/skills
|
|
250
|
+
template_type: default
|
|
251
|
+
skill_format: true
|
|
175
252
|
|
|
176
253
|
windsurf:
|
|
177
254
|
name: "Windsurf"
|
|
@@ -179,8 +256,11 @@ platforms:
|
|
|
179
256
|
category: ide
|
|
180
257
|
description: "AI-powered IDE with cascade flows"
|
|
181
258
|
installer:
|
|
182
|
-
|
|
259
|
+
legacy_targets:
|
|
260
|
+
- .windsurf/workflows
|
|
261
|
+
target_dir: .windsurf/skills
|
|
183
262
|
template_type: windsurf
|
|
263
|
+
skill_format: true
|
|
184
264
|
|
|
185
265
|
# ============================================================================
|
|
186
266
|
# Installer Config Schema
|
|
@@ -191,12 +271,19 @@ platforms:
|
|
|
191
271
|
# template_type: string # Default template type to use
|
|
192
272
|
# header_template: string (optional) # Override for header/frontmatter template
|
|
193
273
|
# body_template: string (optional) # Override for body/content template
|
|
274
|
+
# legacy_targets: array (optional) # Old target dirs to clean up on reinstall (migration)
|
|
275
|
+
# - string # Relative path, e.g. .opencode/agent
|
|
194
276
|
# targets: array (optional) # For multi-target installations
|
|
195
277
|
# - target_dir: string
|
|
196
278
|
# template_type: string
|
|
197
279
|
# artifact_types: [agents, workflows, tasks, tools]
|
|
198
280
|
# artifact_types: array (optional) # Filter which artifacts to install (default: all)
|
|
199
281
|
# skip_existing: boolean (optional) # Skip files that already exist (default: false)
|
|
282
|
+
# skill_format: boolean (optional) # Use directory-per-skill output: <name>/SKILL.md
|
|
283
|
+
# # with clean frontmatter (name + description, unquoted)
|
|
284
|
+
# ancestor_conflict_check: boolean (optional) # Refuse install when ancestor dir has BMAD files
|
|
285
|
+
# # in the same target_dir (for IDEs that inherit
|
|
286
|
+
# # skills from parent directories)
|
|
200
287
|
|
|
201
288
|
# ============================================================================
|
|
202
289
|
# Platform Categories
|
|
@@ -47,6 +47,7 @@ class AgentCommandGenerator {
|
|
|
47
47
|
name: agent.name,
|
|
48
48
|
description: agent.description || `${agent.name} agent`,
|
|
49
49
|
module: agent.module,
|
|
50
|
+
canonicalId: agent.canonicalId || '',
|
|
50
51
|
relativePath: path.join(agent.module, 'agents', agentPathInModule), // For command filename
|
|
51
52
|
agentPath: agentRelPath, // Relative path to actual agent file
|
|
52
53
|
content: launcherContent,
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
const path = require('node:path');
|
|
2
2
|
const fs = require('fs-extra');
|
|
3
|
+
const { loadSkillManifest, getCanonicalId } = require('./skill-manifest');
|
|
3
4
|
|
|
4
5
|
/**
|
|
5
6
|
* Helpers for gathering BMAD agents/tasks from the installed tree.
|
|
@@ -34,6 +35,7 @@ async function getAgentsFromBmad(bmadDir, selectedModules = []) {
|
|
|
34
35
|
|
|
35
36
|
const agentDirPath = path.join(standaloneAgentsDir, agentDir.name);
|
|
36
37
|
const agentFiles = await fs.readdir(agentDirPath);
|
|
38
|
+
const skillManifest = await loadSkillManifest(agentDirPath);
|
|
37
39
|
|
|
38
40
|
for (const file of agentFiles) {
|
|
39
41
|
if (!file.endsWith('.md')) continue;
|
|
@@ -48,6 +50,7 @@ async function getAgentsFromBmad(bmadDir, selectedModules = []) {
|
|
|
48
50
|
path: filePath,
|
|
49
51
|
name: file.replace('.md', ''),
|
|
50
52
|
module: 'standalone', // Mark as standalone agent
|
|
53
|
+
canonicalId: getCanonicalId(skillManifest, file),
|
|
51
54
|
});
|
|
52
55
|
}
|
|
53
56
|
}
|
|
@@ -84,6 +87,7 @@ async function getAgentsFromDir(dirPath, moduleName, relativePath = '') {
|
|
|
84
87
|
}
|
|
85
88
|
|
|
86
89
|
const entries = await fs.readdir(dirPath, { withFileTypes: true });
|
|
90
|
+
const skillManifest = await loadSkillManifest(dirPath);
|
|
87
91
|
|
|
88
92
|
for (const entry of entries) {
|
|
89
93
|
// Skip if entry.name is undefined or not a string
|
|
@@ -124,6 +128,7 @@ async function getAgentsFromDir(dirPath, moduleName, relativePath = '') {
|
|
|
124
128
|
name: entry.name.replace('.md', ''),
|
|
125
129
|
module: moduleName,
|
|
126
130
|
relativePath: newRelativePath, // Keep the .md extension for the full path
|
|
131
|
+
canonicalId: getCanonicalId(skillManifest, entry.name),
|
|
127
132
|
});
|
|
128
133
|
}
|
|
129
134
|
}
|
|
@@ -139,6 +144,7 @@ async function getTasksFromDir(dirPath, moduleName) {
|
|
|
139
144
|
}
|
|
140
145
|
|
|
141
146
|
const files = await fs.readdir(dirPath);
|
|
147
|
+
const skillManifest = await loadSkillManifest(dirPath);
|
|
142
148
|
|
|
143
149
|
for (const file of files) {
|
|
144
150
|
// Include both .md and .xml task files
|
|
@@ -160,6 +166,7 @@ async function getTasksFromDir(dirPath, moduleName) {
|
|
|
160
166
|
path: filePath,
|
|
161
167
|
name: file.replace(ext, ''),
|
|
162
168
|
module: moduleName,
|
|
169
|
+
canonicalId: getCanonicalId(skillManifest, file),
|
|
163
170
|
});
|
|
164
171
|
}
|
|
165
172
|
|
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
* - bmm/workflows/plan-project.md → bmad-bmm-plan-project.md
|
|
13
13
|
* - bmm/tasks/create-story.md → bmad-bmm-create-story.md
|
|
14
14
|
* - core/agents/brainstorming.md → bmad-agent-brainstorming.md (core agents skip module name)
|
|
15
|
+
* - standalone/agents/fred.md → bmad-agent-standalone-fred.md
|
|
15
16
|
*/
|
|
16
17
|
|
|
17
18
|
// Type segments - agents are included in naming, others are filtered out
|
|
@@ -26,8 +27,9 @@ const BMAD_FOLDER_NAME = '_bmad';
|
|
|
26
27
|
* Converts: 'bmm', 'agents', 'pm' → 'bmad-agent-bmm-pm.md'
|
|
27
28
|
* Converts: 'bmm', 'workflows', 'correct-course' → 'bmad-bmm-correct-course.md'
|
|
28
29
|
* Converts: 'core', 'agents', 'brainstorming' → 'bmad-agent-brainstorming.md' (core agents skip module name)
|
|
30
|
+
* Converts: 'standalone', 'agents', 'fred' → 'bmad-agent-standalone-fred.md'
|
|
29
31
|
*
|
|
30
|
-
* @param {string} module - Module name (e.g., 'bmm', 'core')
|
|
32
|
+
* @param {string} module - Module name (e.g., 'bmm', 'core', 'standalone')
|
|
31
33
|
* @param {string} type - Artifact type ('agents', 'workflows', 'tasks', 'tools')
|
|
32
34
|
* @param {string} name - Artifact name (e.g., 'pm', 'brainstorming')
|
|
33
35
|
* @returns {string} Flat filename like 'bmad-agent-bmm-pm.md' or 'bmad-bmm-correct-course.md'
|
|
@@ -39,6 +41,10 @@ function toDashName(module, type, name) {
|
|
|
39
41
|
if (module === 'core') {
|
|
40
42
|
return isAgent ? `bmad-agent-${name}.md` : `bmad-${name}.md`;
|
|
41
43
|
}
|
|
44
|
+
// For standalone module, include 'standalone' in the name
|
|
45
|
+
if (module === 'standalone') {
|
|
46
|
+
return isAgent ? `bmad-agent-standalone-${name}.md` : `bmad-standalone-${name}.md`;
|
|
47
|
+
}
|
|
42
48
|
|
|
43
49
|
// Module artifacts: bmad-module-name.md or bmad-agent-module-name.md
|
|
44
50
|
// eslint-disable-next-line unicorn/prefer-string-replace-all -- regex replace is intentional here
|
|
@@ -63,7 +69,7 @@ function toDashPath(relativePath) {
|
|
|
63
69
|
}
|
|
64
70
|
|
|
65
71
|
// Strip common file extensions to avoid double extensions in generated filenames
|
|
66
|
-
// e.g., 'create-story.xml' → 'create-story', 'workflow.
|
|
72
|
+
// e.g., 'create-story.xml' → 'create-story', 'workflow.md' → 'workflow'
|
|
67
73
|
const withoutExt = relativePath.replace(/\.(md|yaml|yml|json|xml|toml)$/i, '');
|
|
68
74
|
const parts = withoutExt.split(/[/\\]/);
|
|
69
75
|
|
|
@@ -110,6 +116,8 @@ function isDashFormat(filename) {
|
|
|
110
116
|
* Parses: 'bmad-bmm-correct-course.md' → { prefix: 'bmad', module: 'bmm', type: 'workflows', name: 'correct-course' }
|
|
111
117
|
* Parses: 'bmad-agent-brainstorming.md' → { prefix: 'bmad', module: 'core', type: 'agents', name: 'brainstorming' } (core agents)
|
|
112
118
|
* Parses: 'bmad-brainstorming.md' → { prefix: 'bmad', module: 'core', type: 'workflows', name: 'brainstorming' } (core workflows)
|
|
119
|
+
* Parses: 'bmad-agent-standalone-fred.md' → { prefix: 'bmad', module: 'standalone', type: 'agents', name: 'fred' }
|
|
120
|
+
* Parses: 'bmad-standalone-foo.md' → { prefix: 'bmad', module: 'standalone', type: 'workflows', name: 'foo' }
|
|
113
121
|
*
|
|
114
122
|
* @param {string} filename - Dash-formatted filename
|
|
115
123
|
* @returns {Object|null} Parsed parts or null if invalid format
|
|
@@ -127,7 +135,16 @@ function parseDashName(filename) {
|
|
|
127
135
|
|
|
128
136
|
if (isAgent) {
|
|
129
137
|
// This is an agent file
|
|
130
|
-
// Format: bmad-agent-name (core) or bmad-agent-module-name
|
|
138
|
+
// Format: bmad-agent-name (core) or bmad-agent-standalone-name or bmad-agent-module-name
|
|
139
|
+
if (parts.length >= 4 && parts[2] === 'standalone') {
|
|
140
|
+
// Standalone agent: bmad-agent-standalone-name
|
|
141
|
+
return {
|
|
142
|
+
prefix: parts[0],
|
|
143
|
+
module: 'standalone',
|
|
144
|
+
type: 'agents',
|
|
145
|
+
name: parts.slice(3).join('-'),
|
|
146
|
+
};
|
|
147
|
+
}
|
|
131
148
|
if (parts.length === 3) {
|
|
132
149
|
// Core agent: bmad-agent-name
|
|
133
150
|
return {
|
|
@@ -158,6 +175,16 @@ function parseDashName(filename) {
|
|
|
158
175
|
};
|
|
159
176
|
}
|
|
160
177
|
|
|
178
|
+
// Check for standalone non-agent: bmad-standalone-name
|
|
179
|
+
if (parts[1] === 'standalone') {
|
|
180
|
+
return {
|
|
181
|
+
prefix: parts[0],
|
|
182
|
+
module: 'standalone',
|
|
183
|
+
type: 'workflows', // Default to workflows for non-agent standalone items
|
|
184
|
+
name: parts.slice(2).join('-'),
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
|
|
161
188
|
// Otherwise, it's a module workflow/tool/task (bmad-module-name)
|
|
162
189
|
return {
|
|
163
190
|
prefix: parts[0],
|
|
@@ -180,6 +207,9 @@ function toUnderscoreName(module, type, name) {
|
|
|
180
207
|
if (module === 'core') {
|
|
181
208
|
return isAgent ? `bmad_agent_${name}.md` : `bmad_${name}.md`;
|
|
182
209
|
}
|
|
210
|
+
if (module === 'standalone') {
|
|
211
|
+
return isAgent ? `bmad_agent_standalone_${name}.md` : `bmad_standalone_${name}.md`;
|
|
212
|
+
}
|
|
183
213
|
return isAgent ? `bmad_${module}_agent_${name}.md` : `bmad_${module}_${name}.md`;
|
|
184
214
|
}
|
|
185
215
|
|
|
@@ -231,6 +261,15 @@ function parseUnderscoreName(filename) {
|
|
|
231
261
|
|
|
232
262
|
if (agentIndex !== -1) {
|
|
233
263
|
if (agentIndex === 1) {
|
|
264
|
+
// bmad_agent_... - check for standalone
|
|
265
|
+
if (parts.length >= 4 && parts[2] === 'standalone') {
|
|
266
|
+
return {
|
|
267
|
+
prefix: parts[0],
|
|
268
|
+
module: 'standalone',
|
|
269
|
+
type: 'agents',
|
|
270
|
+
name: parts.slice(3).join('_'),
|
|
271
|
+
};
|
|
272
|
+
}
|
|
234
273
|
return {
|
|
235
274
|
prefix: parts[0],
|
|
236
275
|
module: 'core',
|
|
@@ -256,6 +295,16 @@ function parseUnderscoreName(filename) {
|
|
|
256
295
|
};
|
|
257
296
|
}
|
|
258
297
|
|
|
298
|
+
// Check for standalone non-agent: bmad_standalone_name
|
|
299
|
+
if (parts[1] === 'standalone') {
|
|
300
|
+
return {
|
|
301
|
+
prefix: parts[0],
|
|
302
|
+
module: 'standalone',
|
|
303
|
+
type: 'workflows',
|
|
304
|
+
name: parts.slice(2).join('_'),
|
|
305
|
+
};
|
|
306
|
+
}
|
|
307
|
+
|
|
259
308
|
return {
|
|
260
309
|
prefix: parts[0],
|
|
261
310
|
module: parts[1],
|
|
@@ -264,6 +313,21 @@ function parseUnderscoreName(filename) {
|
|
|
264
313
|
};
|
|
265
314
|
}
|
|
266
315
|
|
|
316
|
+
/**
|
|
317
|
+
* Resolve the skill name for an artifact.
|
|
318
|
+
* Prefers canonicalId from a bmad-skill-manifest.yaml sidecar when available,
|
|
319
|
+
* falling back to the path-derived name from toDashPath().
|
|
320
|
+
*
|
|
321
|
+
* @param {Object} artifact - Artifact object (must have relativePath; may have canonicalId)
|
|
322
|
+
* @returns {string} Filename like 'bmad-create-prd.md' or 'bmad-agent-bmm-pm.md'
|
|
323
|
+
*/
|
|
324
|
+
function resolveSkillName(artifact) {
|
|
325
|
+
if (artifact.canonicalId) {
|
|
326
|
+
return `${artifact.canonicalId}.md`;
|
|
327
|
+
}
|
|
328
|
+
return toDashPath(artifact.relativePath);
|
|
329
|
+
}
|
|
330
|
+
|
|
267
331
|
// Backward compatibility aliases (colon format was same as underscore)
|
|
268
332
|
const toColonName = toUnderscoreName;
|
|
269
333
|
const toColonPath = toUnderscorePath;
|
|
@@ -275,6 +339,7 @@ module.exports = {
|
|
|
275
339
|
// New standard (dash-based)
|
|
276
340
|
toDashName,
|
|
277
341
|
toDashPath,
|
|
342
|
+
resolveSkillName,
|
|
278
343
|
customAgentDashName,
|
|
279
344
|
isDashFormat,
|
|
280
345
|
parseDashName,
|