bmad-method 6.0.4 → 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/.github/workflows/publish.yaml +243 -0
- package/CONTRIBUTING.md +1 -1
- 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 +1 -1
- 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 -3
- 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-03-technique-execution.md +1 -1
- package/src/core/workflows/brainstorming/workflow.md +1 -1
- package/src/core/workflows/party-mode/bmad-skill-manifest.yaml +3 -0
- 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/lib/core/installer.js +34 -1
- package/tools/cli/installers/lib/core/manifest-generator.js +328 -35
- package/tools/cli/installers/lib/ide/_base-ide.js +24 -15
- package/tools/cli/installers/lib/ide/_config-driven.js +472 -53
- package/tools/cli/installers/lib/ide/manager.js +23 -61
- package/tools/cli/installers/lib/ide/platform-codes.yaml +108 -30
- 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/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/review-edge-case-hunter.xml +0 -63
- 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,22 +167,6 @@ 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)
|
|
210
172
|
const success = handlerResult?.success !== false;
|
|
@@ -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,11 @@ 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
|
|
43
52
|
ancestor_conflict_check: true
|
|
44
53
|
|
|
45
54
|
cline:
|
|
@@ -48,15 +57,26 @@ platforms:
|
|
|
48
57
|
category: ide
|
|
49
58
|
description: "AI coding assistant"
|
|
50
59
|
installer:
|
|
51
|
-
|
|
52
|
-
|
|
60
|
+
legacy_targets:
|
|
61
|
+
- .clinerules/workflows
|
|
62
|
+
target_dir: .cline/skills
|
|
63
|
+
template_type: default
|
|
64
|
+
skill_format: true
|
|
53
65
|
|
|
54
66
|
codex:
|
|
55
67
|
name: "Codex"
|
|
56
68
|
preferred: false
|
|
57
69
|
category: cli
|
|
58
70
|
description: "OpenAI Codex integration"
|
|
59
|
-
|
|
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]
|
|
60
80
|
|
|
61
81
|
codebuddy:
|
|
62
82
|
name: "CodeBuddy"
|
|
@@ -64,8 +84,11 @@ platforms:
|
|
|
64
84
|
category: ide
|
|
65
85
|
description: "Tencent Cloud Code Assistant - AI-powered coding companion"
|
|
66
86
|
installer:
|
|
67
|
-
|
|
87
|
+
legacy_targets:
|
|
88
|
+
- .codebuddy/commands
|
|
89
|
+
target_dir: .codebuddy/skills
|
|
68
90
|
template_type: default
|
|
91
|
+
skill_format: true
|
|
69
92
|
|
|
70
93
|
crush:
|
|
71
94
|
name: "Crush"
|
|
@@ -73,8 +96,11 @@ platforms:
|
|
|
73
96
|
category: ide
|
|
74
97
|
description: "AI development assistant"
|
|
75
98
|
installer:
|
|
76
|
-
|
|
99
|
+
legacy_targets:
|
|
100
|
+
- .crush/commands
|
|
101
|
+
target_dir: .crush/skills
|
|
77
102
|
template_type: default
|
|
103
|
+
skill_format: true
|
|
78
104
|
|
|
79
105
|
cursor:
|
|
80
106
|
name: "Cursor"
|
|
@@ -82,8 +108,11 @@ platforms:
|
|
|
82
108
|
category: ide
|
|
83
109
|
description: "AI-first code editor"
|
|
84
110
|
installer:
|
|
85
|
-
|
|
111
|
+
legacy_targets:
|
|
112
|
+
- .cursor/commands
|
|
113
|
+
target_dir: .cursor/skills
|
|
86
114
|
template_type: default
|
|
115
|
+
skill_format: true
|
|
87
116
|
|
|
88
117
|
gemini:
|
|
89
118
|
name: "Gemini CLI"
|
|
@@ -91,15 +120,24 @@ platforms:
|
|
|
91
120
|
category: cli
|
|
92
121
|
description: "Google's CLI for Gemini"
|
|
93
122
|
installer:
|
|
94
|
-
|
|
95
|
-
|
|
123
|
+
legacy_targets:
|
|
124
|
+
- .gemini/commands
|
|
125
|
+
target_dir: .gemini/skills
|
|
126
|
+
template_type: default
|
|
127
|
+
skill_format: true
|
|
96
128
|
|
|
97
129
|
github-copilot:
|
|
98
130
|
name: "GitHub Copilot"
|
|
99
131
|
preferred: false
|
|
100
132
|
category: ide
|
|
101
133
|
description: "GitHub's AI pair programmer"
|
|
102
|
-
|
|
134
|
+
installer:
|
|
135
|
+
legacy_targets:
|
|
136
|
+
- .github/agents
|
|
137
|
+
- .github/prompts
|
|
138
|
+
target_dir: .github/skills
|
|
139
|
+
template_type: default
|
|
140
|
+
skill_format: true
|
|
103
141
|
|
|
104
142
|
iflow:
|
|
105
143
|
name: "iFlow"
|
|
@@ -107,15 +145,24 @@ platforms:
|
|
|
107
145
|
category: ide
|
|
108
146
|
description: "AI workflow automation"
|
|
109
147
|
installer:
|
|
110
|
-
|
|
148
|
+
legacy_targets:
|
|
149
|
+
- .iflow/commands
|
|
150
|
+
target_dir: .iflow/skills
|
|
111
151
|
template_type: default
|
|
152
|
+
skill_format: true
|
|
112
153
|
|
|
113
154
|
kilo:
|
|
114
155
|
name: "KiloCoder"
|
|
115
156
|
preferred: false
|
|
116
157
|
category: ide
|
|
117
158
|
description: "AI coding platform"
|
|
118
|
-
|
|
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
|
|
119
166
|
|
|
120
167
|
kiro:
|
|
121
168
|
name: "Kiro"
|
|
@@ -123,8 +170,11 @@ platforms:
|
|
|
123
170
|
category: ide
|
|
124
171
|
description: "Amazon's AI-powered IDE"
|
|
125
172
|
installer:
|
|
126
|
-
|
|
173
|
+
legacy_targets:
|
|
174
|
+
- .kiro/steering
|
|
175
|
+
target_dir: .kiro/skills
|
|
127
176
|
template_type: kiro
|
|
177
|
+
skill_format: true
|
|
128
178
|
|
|
129
179
|
opencode:
|
|
130
180
|
name: "OpenCode"
|
|
@@ -133,15 +183,24 @@ platforms:
|
|
|
133
183
|
description: "OpenCode terminal coding assistant"
|
|
134
184
|
installer:
|
|
135
185
|
legacy_targets:
|
|
186
|
+
- .opencode/agents
|
|
187
|
+
- .opencode/commands
|
|
136
188
|
- .opencode/agent
|
|
137
189
|
- .opencode/command
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
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
|
|
145
204
|
|
|
146
205
|
qwen:
|
|
147
206
|
name: "QwenCoder"
|
|
@@ -149,24 +208,35 @@ platforms:
|
|
|
149
208
|
category: ide
|
|
150
209
|
description: "Qwen AI coding assistant"
|
|
151
210
|
installer:
|
|
152
|
-
|
|
211
|
+
legacy_targets:
|
|
212
|
+
- .qwen/commands
|
|
213
|
+
target_dir: .qwen/skills
|
|
153
214
|
template_type: default
|
|
215
|
+
skill_format: true
|
|
154
216
|
|
|
155
217
|
roo:
|
|
156
|
-
name: "Roo
|
|
218
|
+
name: "Roo Code"
|
|
157
219
|
preferred: false
|
|
158
220
|
category: ide
|
|
159
221
|
description: "Enhanced Cline fork"
|
|
160
222
|
installer:
|
|
161
|
-
|
|
223
|
+
legacy_targets:
|
|
224
|
+
- .roo/commands
|
|
225
|
+
target_dir: .roo/skills
|
|
162
226
|
template_type: default
|
|
227
|
+
skill_format: true
|
|
163
228
|
|
|
164
229
|
rovo-dev:
|
|
165
230
|
name: "Rovo Dev"
|
|
166
231
|
preferred: false
|
|
167
232
|
category: ide
|
|
168
233
|
description: "Atlassian's Rovo development environment"
|
|
169
|
-
|
|
234
|
+
installer:
|
|
235
|
+
legacy_targets:
|
|
236
|
+
- .rovodev/workflows
|
|
237
|
+
target_dir: .rovodev/skills
|
|
238
|
+
template_type: default
|
|
239
|
+
skill_format: true
|
|
170
240
|
|
|
171
241
|
trae:
|
|
172
242
|
name: "Trae"
|
|
@@ -174,8 +244,11 @@ platforms:
|
|
|
174
244
|
category: ide
|
|
175
245
|
description: "AI coding tool"
|
|
176
246
|
installer:
|
|
177
|
-
|
|
178
|
-
|
|
247
|
+
legacy_targets:
|
|
248
|
+
- .trae/rules
|
|
249
|
+
target_dir: .trae/skills
|
|
250
|
+
template_type: default
|
|
251
|
+
skill_format: true
|
|
179
252
|
|
|
180
253
|
windsurf:
|
|
181
254
|
name: "Windsurf"
|
|
@@ -183,8 +256,11 @@ platforms:
|
|
|
183
256
|
category: ide
|
|
184
257
|
description: "AI-powered IDE with cascade flows"
|
|
185
258
|
installer:
|
|
186
|
-
|
|
259
|
+
legacy_targets:
|
|
260
|
+
- .windsurf/workflows
|
|
261
|
+
target_dir: .windsurf/skills
|
|
187
262
|
template_type: windsurf
|
|
263
|
+
skill_format: true
|
|
188
264
|
|
|
189
265
|
# ============================================================================
|
|
190
266
|
# Installer Config Schema
|
|
@@ -203,9 +279,11 @@ platforms:
|
|
|
203
279
|
# artifact_types: [agents, workflows, tasks, tools]
|
|
204
280
|
# artifact_types: array (optional) # Filter which artifacts to install (default: all)
|
|
205
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)
|
|
206
284
|
# ancestor_conflict_check: boolean (optional) # Refuse install when ancestor dir has BMAD files
|
|
207
285
|
# # in the same target_dir (for IDEs that inherit
|
|
208
|
-
# #
|
|
286
|
+
# # skills from parent directories)
|
|
209
287
|
|
|
210
288
|
# ============================================================================
|
|
211
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,
|