bmad-method 6.2.1-next.9 → 6.2.2
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/AGENTS.md +1 -0
- package/README_CN.md +23 -36
- package/package.json +4 -6
- package/src/{bmm/agents → bmm-skills/1-analysis}/bmad-agent-analyst/bmad-skill-manifest.yaml +1 -2
- package/src/{bmm/agents → bmm-skills/1-analysis}/bmad-agent-tech-writer/bmad-skill-manifest.yaml +1 -2
- package/src/{bmm/workflows/1-analysis/bmad-product-brief-preview → bmm-skills/1-analysis/bmad-product-brief}/SKILL.md +2 -3
- package/src/{bmm/workflows → bmm-skills}/1-analysis/research/bmad-domain-research/SKILL.md +1 -1
- package/src/{bmm/workflows → bmm-skills}/1-analysis/research/bmad-market-research/SKILL.md +1 -1
- package/src/{bmm/workflows → bmm-skills}/1-analysis/research/bmad-technical-research/SKILL.md +1 -1
- package/src/{bmm/agents → bmm-skills/2-plan-workflows}/bmad-agent-pm/bmad-skill-manifest.yaml +1 -2
- package/src/{bmm/agents → bmm-skills/2-plan-workflows}/bmad-agent-ux-designer/bmad-skill-manifest.yaml +1 -2
- package/src/{bmm/workflows → bmm-skills}/2-plan-workflows/bmad-edit-prd/steps-e/step-e-01-discovery.md +1 -1
- package/src/{bmm/workflows → bmm-skills}/2-plan-workflows/bmad-edit-prd/steps-e/step-e-01b-legacy-conversion.md +1 -1
- package/src/{bmm/workflows → bmm-skills}/2-plan-workflows/bmad-edit-prd/steps-e/step-e-02-review.md +1 -1
- package/src/{bmm/workflows → bmm-skills}/2-plan-workflows/bmad-edit-prd/steps-e/step-e-03-edit.md +1 -1
- package/src/{bmm/workflows → bmm-skills}/2-plan-workflows/bmad-edit-prd/steps-e/step-e-04-complete.md +1 -1
- package/src/{bmm/agents → bmm-skills/3-solutioning}/bmad-agent-architect/bmad-skill-manifest.yaml +1 -2
- package/src/{bmm/agents → bmm-skills/4-implementation}/bmad-agent-dev/bmad-skill-manifest.yaml +1 -2
- package/src/{bmm/agents → bmm-skills/4-implementation}/bmad-agent-qa/bmad-skill-manifest.yaml +1 -2
- package/src/{bmm/agents → bmm-skills/4-implementation}/bmad-agent-quick-flow-solo-dev/SKILL.md +1 -3
- package/src/{bmm/agents → bmm-skills/4-implementation}/bmad-agent-quick-flow-solo-dev/bmad-skill-manifest.yaml +1 -2
- package/src/{bmm/agents → bmm-skills/4-implementation}/bmad-agent-sm/bmad-skill-manifest.yaml +1 -2
- package/src/{bmm/workflows → bmm-skills}/4-implementation/bmad-code-review/steps/step-01-gather-context.md +3 -2
- package/src/bmm-skills/4-implementation/bmad-code-review/steps/step-02-review.md +34 -0
- package/src/{bmm/workflows → bmm-skills}/4-implementation/bmad-code-review/steps/step-03-triage.md +7 -8
- package/src/bmm-skills/4-implementation/bmad-code-review/steps/step-04-present.md +129 -0
- package/src/{bmm/workflows → bmm-skills}/4-implementation/bmad-code-review/workflow.md +1 -0
- package/src/{bmm/workflows → bmm-skills}/4-implementation/bmad-correct-course/workflow.md +4 -4
- package/src/{bmm/workflows/bmad-quick-flow/bmad-quick-dev-new-preview → bmm-skills/4-implementation/bmad-quick-dev}/SKILL.md +1 -1
- package/src/{bmm/workflows/bmad-quick-flow/bmad-quick-dev-new-preview/tech-spec-template.md → bmm-skills/4-implementation/bmad-quick-dev/spec-template.md} +0 -2
- package/src/{bmm/workflows/bmad-quick-flow/bmad-quick-dev-new-preview → bmm-skills/4-implementation/bmad-quick-dev}/step-01-clarify-and-route.md +22 -8
- package/src/{bmm/workflows/bmad-quick-flow/bmad-quick-dev-new-preview → bmm-skills/4-implementation/bmad-quick-dev}/step-02-plan.md +3 -3
- package/src/{bmm/workflows/bmad-quick-flow/bmad-quick-dev-new-preview → bmm-skills/4-implementation/bmad-quick-dev}/step-03-implement.md +6 -0
- package/src/{bmm/workflows/bmad-quick-flow/bmad-quick-dev-new-preview → bmm-skills/4-implementation/bmad-quick-dev}/step-05-present.md +8 -6
- package/src/{bmm/workflows/bmad-quick-flow/bmad-quick-dev-new-preview → bmm-skills/4-implementation/bmad-quick-dev}/step-oneshot.md +2 -2
- package/src/{bmm/workflows/bmad-quick-flow/bmad-quick-dev-new-preview → bmm-skills/4-implementation/bmad-quick-dev}/workflow.md +3 -3
- package/src/bmm-skills/module-help.csv +30 -0
- package/src/{core/skills/bmad-advanced-elicitation/workflow.md → core-skills/bmad-advanced-elicitation/SKILL.md} +3 -1
- package/src/{core/skills/bmad-editorial-review-prose/workflow.md → core-skills/bmad-editorial-review-prose/SKILL.md} +5 -0
- package/src/{core/skills/bmad-editorial-review-structure/workflow.md → core-skills/bmad-editorial-review-structure/SKILL.md} +5 -0
- package/src/core-skills/bmad-help/SKILL.md +73 -0
- package/src/{core/skills/bmad-index-docs/workflow.md → core-skills/bmad-index-docs/SKILL.md} +5 -0
- package/src/{core/skills/bmad-review-adversarial-general/workflow.md → core-skills/bmad-review-adversarial-general/SKILL.md} +5 -0
- package/src/{core/skills/bmad-review-edge-case-hunter/workflow.md → core-skills/bmad-review-edge-case-hunter/SKILL.md} +5 -0
- package/src/{core/skills/bmad-shard-doc/workflow.md → core-skills/bmad-shard-doc/SKILL.md} +5 -0
- package/src/core-skills/module-help.csv +11 -0
- package/tools/bmad-npx-wrapper.js +2 -2
- package/tools/cli/commands/install.js +1 -8
- package/tools/cli/external-official-modules.yaml +1 -1
- package/tools/cli/installers/lib/core/config-collector.js +110 -23
- package/tools/cli/installers/lib/core/dependency-resolver.js +11 -11
- package/tools/cli/installers/lib/core/installer.js +4 -214
- package/tools/cli/installers/lib/core/manifest-generator.js +122 -833
- package/tools/cli/installers/lib/core/manifest.js +2 -2
- package/tools/cli/installers/lib/custom/handler.js +1 -247
- package/tools/cli/installers/lib/ide/_base-ide.js +0 -16
- package/tools/cli/installers/lib/ide/_config-driven.js +13 -168
- package/tools/cli/installers/lib/ide/manager.js +2 -7
- package/tools/cli/installers/lib/ide/shared/agent-command-generator.js +0 -1
- package/tools/cli/installers/lib/ide/shared/bmad-artifacts.js +27 -0
- package/tools/cli/installers/lib/ide/shared/skill-manifest.js +1 -19
- package/tools/cli/installers/lib/modules/manager.js +12 -459
- package/tools/cli/lib/project-root.js +5 -5
- package/tools/cli/lib/ui.js +0 -19
- package/tools/skill-validator.md +52 -22
- package/tools/validate-skills.js +736 -0
- package/src/bmm/data/project-context-template.md +0 -26
- package/src/bmm/module-help.csv +0 -32
- package/src/bmm/workflows/1-analysis/bmad-create-product-brief/SKILL.md +0 -6
- package/src/bmm/workflows/1-analysis/bmad-create-product-brief/bmad-skill-manifest.yaml +0 -1
- package/src/bmm/workflows/1-analysis/bmad-create-product-brief/product-brief.template.md +0 -10
- package/src/bmm/workflows/1-analysis/bmad-create-product-brief/steps/step-01-init.md +0 -170
- package/src/bmm/workflows/1-analysis/bmad-create-product-brief/steps/step-01b-continue.md +0 -158
- package/src/bmm/workflows/1-analysis/bmad-create-product-brief/steps/step-02-vision.md +0 -193
- package/src/bmm/workflows/1-analysis/bmad-create-product-brief/steps/step-03-users.md +0 -196
- package/src/bmm/workflows/1-analysis/bmad-create-product-brief/steps/step-04-metrics.md +0 -199
- package/src/bmm/workflows/1-analysis/bmad-create-product-brief/steps/step-05-scope.md +0 -213
- package/src/bmm/workflows/1-analysis/bmad-create-product-brief/steps/step-06-complete.md +0 -159
- package/src/bmm/workflows/1-analysis/bmad-create-product-brief/workflow.md +0 -55
- package/src/bmm/workflows/1-analysis/bmad-product-brief-preview/bmad-skill-manifest.yaml +0 -1
- package/src/bmm/workflows/1-analysis/research/bmad-domain-research/bmad-skill-manifest.yaml +0 -1
- package/src/bmm/workflows/1-analysis/research/bmad-market-research/bmad-skill-manifest.yaml +0 -1
- package/src/bmm/workflows/1-analysis/research/bmad-technical-research/bmad-skill-manifest.yaml +0 -1
- package/src/bmm/workflows/1-analysis/research/market-steps/step-01-init.md +0 -182
- package/src/bmm/workflows/1-analysis/research/market-steps/step-02-customer-behavior.md +0 -237
- package/src/bmm/workflows/1-analysis/research/market-steps/step-03-customer-pain-points.md +0 -249
- package/src/bmm/workflows/1-analysis/research/market-steps/step-04-customer-decisions.md +0 -259
- package/src/bmm/workflows/1-analysis/research/market-steps/step-05-competitive-analysis.md +0 -177
- package/src/bmm/workflows/1-analysis/research/market-steps/step-06-research-completion.md +0 -476
- package/src/bmm/workflows/1-analysis/research/research.template.md +0 -29
- package/src/bmm/workflows/2-plan-workflows/bmad-create-ux-design/bmad-skill-manifest.yaml +0 -1
- package/src/bmm/workflows/2-plan-workflows/bmad-edit-prd/bmad-skill-manifest.yaml +0 -1
- package/src/bmm/workflows/2-plan-workflows/bmad-validate-prd/bmad-skill-manifest.yaml +0 -1
- package/src/bmm/workflows/3-solutioning/bmad-check-implementation-readiness/bmad-skill-manifest.yaml +0 -1
- package/src/bmm/workflows/3-solutioning/bmad-create-architecture/bmad-skill-manifest.yaml +0 -1
- package/src/bmm/workflows/3-solutioning/bmad-create-epics-and-stories/bmad-skill-manifest.yaml +0 -1
- package/src/bmm/workflows/4-implementation/bmad-code-review/bmad-skill-manifest.yaml +0 -1
- package/src/bmm/workflows/4-implementation/bmad-code-review/steps/step-02-review.md +0 -41
- package/src/bmm/workflows/4-implementation/bmad-code-review/steps/step-04-present.md +0 -38
- package/src/bmm/workflows/4-implementation/bmad-correct-course/bmad-skill-manifest.yaml +0 -1
- package/src/bmm/workflows/4-implementation/bmad-create-story/bmad-skill-manifest.yaml +0 -1
- package/src/bmm/workflows/4-implementation/bmad-dev-story/bmad-skill-manifest.yaml +0 -1
- package/src/bmm/workflows/4-implementation/bmad-retrospective/bmad-skill-manifest.yaml +0 -1
- package/src/bmm/workflows/4-implementation/bmad-sprint-planning/bmad-skill-manifest.yaml +0 -1
- package/src/bmm/workflows/4-implementation/bmad-sprint-status/bmad-skill-manifest.yaml +0 -1
- package/src/bmm/workflows/bmad-document-project/bmad-skill-manifest.yaml +0 -1
- package/src/bmm/workflows/bmad-generate-project-context/bmad-skill-manifest.yaml +0 -1
- package/src/bmm/workflows/bmad-qa-generate-e2e-tests/bmad-skill-manifest.yaml +0 -1
- package/src/bmm/workflows/bmad-quick-flow/bmad-quick-dev/SKILL.md +0 -6
- package/src/bmm/workflows/bmad-quick-flow/bmad-quick-dev/bmad-skill-manifest.yaml +0 -1
- package/src/bmm/workflows/bmad-quick-flow/bmad-quick-dev/steps/step-01-mode-detection.md +0 -169
- package/src/bmm/workflows/bmad-quick-flow/bmad-quick-dev/steps/step-02-context-gathering.md +0 -114
- package/src/bmm/workflows/bmad-quick-flow/bmad-quick-dev/steps/step-03-execute.md +0 -107
- package/src/bmm/workflows/bmad-quick-flow/bmad-quick-dev/steps/step-04-self-check.md +0 -107
- package/src/bmm/workflows/bmad-quick-flow/bmad-quick-dev/steps/step-05-adversarial-review.md +0 -94
- package/src/bmm/workflows/bmad-quick-flow/bmad-quick-dev/steps/step-06-resolve-findings.md +0 -144
- package/src/bmm/workflows/bmad-quick-flow/bmad-quick-dev/workflow.md +0 -38
- package/src/bmm/workflows/bmad-quick-flow/bmad-quick-dev-new-preview/bmad-skill-manifest.yaml +0 -1
- package/src/bmm/workflows/bmad-quick-flow/bmad-quick-spec/SKILL.md +0 -6
- package/src/bmm/workflows/bmad-quick-flow/bmad-quick-spec/bmad-skill-manifest.yaml +0 -1
- package/src/bmm/workflows/bmad-quick-flow/bmad-quick-spec/steps/step-01-understand.md +0 -185
- package/src/bmm/workflows/bmad-quick-flow/bmad-quick-spec/steps/step-02-investigate.md +0 -140
- package/src/bmm/workflows/bmad-quick-flow/bmad-quick-spec/steps/step-03-generate.md +0 -123
- package/src/bmm/workflows/bmad-quick-flow/bmad-quick-spec/steps/step-04-review.md +0 -195
- package/src/bmm/workflows/bmad-quick-flow/bmad-quick-spec/tech-spec-template.md +0 -74
- package/src/bmm/workflows/bmad-quick-flow/bmad-quick-spec/workflow.md +0 -73
- package/src/core/module-help.csv +0 -11
- package/src/core/skills/bmad-advanced-elicitation/SKILL.md +0 -6
- package/src/core/skills/bmad-advanced-elicitation/bmad-skill-manifest.yaml +0 -1
- package/src/core/skills/bmad-brainstorming/bmad-skill-manifest.yaml +0 -1
- package/src/core/skills/bmad-distillator/bmad-skill-manifest.yaml +0 -15
- package/src/core/skills/bmad-editorial-review-prose/SKILL.md +0 -6
- package/src/core/skills/bmad-editorial-review-prose/bmad-skill-manifest.yaml +0 -1
- package/src/core/skills/bmad-editorial-review-structure/SKILL.md +0 -6
- package/src/core/skills/bmad-editorial-review-structure/bmad-skill-manifest.yaml +0 -1
- package/src/core/skills/bmad-help/SKILL.md +0 -6
- package/src/core/skills/bmad-help/bmad-skill-manifest.yaml +0 -1
- package/src/core/skills/bmad-help/workflow.md +0 -88
- package/src/core/skills/bmad-index-docs/SKILL.md +0 -6
- package/src/core/skills/bmad-index-docs/bmad-skill-manifest.yaml +0 -1
- package/src/core/skills/bmad-init/bmad-skill-manifest.yaml +0 -1
- package/src/core/skills/bmad-party-mode/bmad-skill-manifest.yaml +0 -1
- package/src/core/skills/bmad-review-adversarial-general/SKILL.md +0 -6
- package/src/core/skills/bmad-review-adversarial-general/bmad-skill-manifest.yaml +0 -1
- package/src/core/skills/bmad-review-edge-case-hunter/SKILL.md +0 -6
- package/src/core/skills/bmad-review-edge-case-hunter/bmad-skill-manifest.yaml +0 -1
- package/src/core/skills/bmad-shard-doc/SKILL.md +0 -6
- package/src/core/skills/bmad-shard-doc/bmad-skill-manifest.yaml +0 -1
- package/src/core/tasks/bmad-create-prd/bmad-skill-manifest.yaml +0 -1
- package/src/utility/agent-components/activation-rules.txt +0 -6
- package/src/utility/agent-components/activation-steps.txt +0 -14
- package/src/utility/agent-components/agent-command-header.md +0 -1
- package/src/utility/agent-components/agent.customize.template.yaml +0 -41
- package/src/utility/agent-components/handler-action.txt +0 -4
- package/src/utility/agent-components/handler-data.txt +0 -5
- package/src/utility/agent-components/handler-exec.txt +0 -6
- package/src/utility/agent-components/handler-multi.txt +0 -13
- package/src/utility/agent-components/handler-tmpl.txt +0 -5
- package/src/utility/agent-components/menu-handlers.txt +0 -6
- package/tools/cli/installers/lib/ide/shared/task-tool-command-generator.js +0 -368
- package/tools/cli/installers/lib/ide/shared/workflow-command-generator.js +0 -179
- package/tools/cli/lib/activation-builder.js +0 -165
- package/tools/cli/lib/agent/compiler.js +0 -516
- package/tools/cli/lib/agent/installer.js +0 -680
- package/tools/cli/lib/agent/template-engine.js +0 -152
- package/tools/cli/lib/agent-analyzer.js +0 -97
- package/tools/cli/lib/agent-party-generator.js +0 -194
- package/tools/cli/lib/xml-handler.js +0 -177
- package/tools/cli/lib/xml-to-markdown.js +0 -82
- package/tools/cli/lib/yaml-xml-builder.js +0 -570
- package/tools/schema/agent.js +0 -489
- /package/src/{bmm/agents → bmm-skills/1-analysis}/bmad-agent-analyst/SKILL.md +0 -0
- /package/src/{bmm/agents → bmm-skills/1-analysis}/bmad-agent-tech-writer/SKILL.md +0 -0
- /package/src/{bmm/agents → bmm-skills/1-analysis}/bmad-agent-tech-writer/explain-concept.md +0 -0
- /package/src/{bmm/agents → bmm-skills/1-analysis}/bmad-agent-tech-writer/mermaid-gen.md +0 -0
- /package/src/{bmm/agents → bmm-skills/1-analysis}/bmad-agent-tech-writer/validate-doc.md +0 -0
- /package/src/{bmm/agents → bmm-skills/1-analysis}/bmad-agent-tech-writer/write-document.md +0 -0
- /package/src/{bmm/workflows → bmm-skills/1-analysis}/bmad-document-project/SKILL.md +0 -0
- /package/src/{bmm/workflows → bmm-skills/1-analysis}/bmad-document-project/checklist.md +0 -0
- /package/src/{bmm/workflows → bmm-skills/1-analysis}/bmad-document-project/documentation-requirements.csv +0 -0
- /package/src/{bmm/workflows → bmm-skills/1-analysis}/bmad-document-project/instructions.md +0 -0
- /package/src/{bmm/workflows → bmm-skills/1-analysis}/bmad-document-project/templates/deep-dive-template.md +0 -0
- /package/src/{bmm/workflows → bmm-skills/1-analysis}/bmad-document-project/templates/index-template.md +0 -0
- /package/src/{bmm/workflows → bmm-skills/1-analysis}/bmad-document-project/templates/project-overview-template.md +0 -0
- /package/src/{bmm/workflows → bmm-skills/1-analysis}/bmad-document-project/templates/project-scan-report-schema.json +0 -0
- /package/src/{bmm/workflows → bmm-skills/1-analysis}/bmad-document-project/templates/source-tree-template.md +0 -0
- /package/src/{bmm/workflows → bmm-skills/1-analysis}/bmad-document-project/workflow.md +0 -0
- /package/src/{bmm/workflows → bmm-skills/1-analysis}/bmad-document-project/workflows/deep-dive-instructions.md +0 -0
- /package/src/{bmm/workflows → bmm-skills/1-analysis}/bmad-document-project/workflows/deep-dive-workflow.md +0 -0
- /package/src/{bmm/workflows → bmm-skills/1-analysis}/bmad-document-project/workflows/full-scan-instructions.md +0 -0
- /package/src/{bmm/workflows → bmm-skills/1-analysis}/bmad-document-project/workflows/full-scan-workflow.md +0 -0
- /package/src/{bmm/workflows/1-analysis/bmad-product-brief-preview → bmm-skills/1-analysis/bmad-product-brief}/agents/artifact-analyzer.md +0 -0
- /package/src/{bmm/workflows/1-analysis/bmad-product-brief-preview → bmm-skills/1-analysis/bmad-product-brief}/agents/opportunity-reviewer.md +0 -0
- /package/src/{bmm/workflows/1-analysis/bmad-product-brief-preview → bmm-skills/1-analysis/bmad-product-brief}/agents/skeptic-reviewer.md +0 -0
- /package/src/{bmm/workflows/1-analysis/bmad-product-brief-preview → bmm-skills/1-analysis/bmad-product-brief}/agents/web-researcher.md +0 -0
- /package/src/{bmm/workflows/1-analysis/bmad-product-brief-preview → bmm-skills/1-analysis/bmad-product-brief}/bmad-manifest.json +0 -0
- /package/src/{bmm/workflows/1-analysis/bmad-product-brief-preview → bmm-skills/1-analysis/bmad-product-brief}/prompts/contextual-discovery.md +0 -0
- /package/src/{bmm/workflows/1-analysis/bmad-product-brief-preview → bmm-skills/1-analysis/bmad-product-brief}/prompts/draft-and-review.md +0 -0
- /package/src/{bmm/workflows/1-analysis/bmad-product-brief-preview → bmm-skills/1-analysis/bmad-product-brief}/prompts/finalize.md +0 -0
- /package/src/{bmm/workflows/1-analysis/bmad-product-brief-preview → bmm-skills/1-analysis/bmad-product-brief}/prompts/guided-elicitation.md +0 -0
- /package/src/{bmm/workflows/1-analysis/bmad-product-brief-preview → bmm-skills/1-analysis/bmad-product-brief}/resources/brief-template.md +0 -0
- /package/src/{bmm/workflows → bmm-skills}/1-analysis/research/bmad-domain-research/domain-steps/step-01-init.md +0 -0
- /package/src/{bmm/workflows → bmm-skills}/1-analysis/research/bmad-domain-research/domain-steps/step-02-domain-analysis.md +0 -0
- /package/src/{bmm/workflows → bmm-skills}/1-analysis/research/bmad-domain-research/domain-steps/step-03-competitive-landscape.md +0 -0
- /package/src/{bmm/workflows → bmm-skills}/1-analysis/research/bmad-domain-research/domain-steps/step-04-regulatory-focus.md +0 -0
- /package/src/{bmm/workflows → bmm-skills}/1-analysis/research/bmad-domain-research/domain-steps/step-05-technical-trends.md +0 -0
- /package/src/{bmm/workflows → bmm-skills}/1-analysis/research/bmad-domain-research/domain-steps/step-06-research-synthesis.md +0 -0
- /package/src/{bmm/workflows → bmm-skills}/1-analysis/research/bmad-domain-research/research.template.md +0 -0
- /package/src/{bmm/workflows → bmm-skills}/1-analysis/research/bmad-domain-research/workflow.md +0 -0
- /package/src/{bmm/workflows → bmm-skills}/1-analysis/research/bmad-market-research/research.template.md +0 -0
- /package/src/{bmm/workflows → bmm-skills}/1-analysis/research/bmad-market-research/steps/step-01-init.md +0 -0
- /package/src/{bmm/workflows → bmm-skills}/1-analysis/research/bmad-market-research/steps/step-02-customer-behavior.md +0 -0
- /package/src/{bmm/workflows → bmm-skills}/1-analysis/research/bmad-market-research/steps/step-03-customer-pain-points.md +0 -0
- /package/src/{bmm/workflows → bmm-skills}/1-analysis/research/bmad-market-research/steps/step-04-customer-decisions.md +0 -0
- /package/src/{bmm/workflows → bmm-skills}/1-analysis/research/bmad-market-research/steps/step-05-competitive-analysis.md +0 -0
- /package/src/{bmm/workflows → bmm-skills}/1-analysis/research/bmad-market-research/steps/step-06-research-completion.md +0 -0
- /package/src/{bmm/workflows → bmm-skills}/1-analysis/research/bmad-market-research/workflow.md +0 -0
- /package/src/{bmm/workflows → bmm-skills}/1-analysis/research/bmad-technical-research/research.template.md +0 -0
- /package/src/{bmm/workflows → bmm-skills}/1-analysis/research/bmad-technical-research/technical-steps/step-01-init.md +0 -0
- /package/src/{bmm/workflows → bmm-skills}/1-analysis/research/bmad-technical-research/technical-steps/step-02-technical-overview.md +0 -0
- /package/src/{bmm/workflows → bmm-skills}/1-analysis/research/bmad-technical-research/technical-steps/step-03-integration-patterns.md +0 -0
- /package/src/{bmm/workflows → bmm-skills}/1-analysis/research/bmad-technical-research/technical-steps/step-04-architectural-patterns.md +0 -0
- /package/src/{bmm/workflows → bmm-skills}/1-analysis/research/bmad-technical-research/technical-steps/step-05-implementation-research.md +0 -0
- /package/src/{bmm/workflows → bmm-skills}/1-analysis/research/bmad-technical-research/technical-steps/step-06-research-synthesis.md +0 -0
- /package/src/{bmm/workflows → bmm-skills}/1-analysis/research/bmad-technical-research/workflow.md +0 -0
- /package/src/{bmm/agents → bmm-skills/2-plan-workflows}/bmad-agent-pm/SKILL.md +0 -0
- /package/src/{bmm/agents → bmm-skills/2-plan-workflows}/bmad-agent-ux-designer/SKILL.md +0 -0
- /package/src/{core/tasks → bmm-skills/2-plan-workflows}/bmad-create-prd/SKILL.md +0 -0
- /package/src/{bmm/workflows/2-plan-workflows/bmad-validate-prd → bmm-skills/2-plan-workflows/bmad-create-prd}/data/domain-complexity.csv +0 -0
- /package/src/{bmm/workflows/2-plan-workflows/bmad-validate-prd → bmm-skills/2-plan-workflows/bmad-create-prd}/data/prd-purpose.md +0 -0
- /package/src/{bmm/workflows/2-plan-workflows/bmad-validate-prd → bmm-skills/2-plan-workflows/bmad-create-prd}/data/project-types.csv +0 -0
- /package/src/{core/tasks → bmm-skills/2-plan-workflows}/bmad-create-prd/steps-c/step-01-init.md +0 -0
- /package/src/{core/tasks → bmm-skills/2-plan-workflows}/bmad-create-prd/steps-c/step-01b-continue.md +0 -0
- /package/src/{core/tasks → bmm-skills/2-plan-workflows}/bmad-create-prd/steps-c/step-02-discovery.md +0 -0
- /package/src/{core/tasks → bmm-skills/2-plan-workflows}/bmad-create-prd/steps-c/step-02b-vision.md +0 -0
- /package/src/{core/tasks → bmm-skills/2-plan-workflows}/bmad-create-prd/steps-c/step-02c-executive-summary.md +0 -0
- /package/src/{core/tasks → bmm-skills/2-plan-workflows}/bmad-create-prd/steps-c/step-03-success.md +0 -0
- /package/src/{core/tasks → bmm-skills/2-plan-workflows}/bmad-create-prd/steps-c/step-04-journeys.md +0 -0
- /package/src/{core/tasks → bmm-skills/2-plan-workflows}/bmad-create-prd/steps-c/step-05-domain.md +0 -0
- /package/src/{core/tasks → bmm-skills/2-plan-workflows}/bmad-create-prd/steps-c/step-06-innovation.md +0 -0
- /package/src/{core/tasks → bmm-skills/2-plan-workflows}/bmad-create-prd/steps-c/step-07-project-type.md +0 -0
- /package/src/{core/tasks → bmm-skills/2-plan-workflows}/bmad-create-prd/steps-c/step-08-scoping.md +0 -0
- /package/src/{core/tasks → bmm-skills/2-plan-workflows}/bmad-create-prd/steps-c/step-09-functional.md +0 -0
- /package/src/{core/tasks → bmm-skills/2-plan-workflows}/bmad-create-prd/steps-c/step-10-nonfunctional.md +0 -0
- /package/src/{core/tasks → bmm-skills/2-plan-workflows}/bmad-create-prd/steps-c/step-11-polish.md +0 -0
- /package/src/{core/tasks → bmm-skills/2-plan-workflows}/bmad-create-prd/steps-c/step-12-complete.md +0 -0
- /package/src/{core/tasks → bmm-skills/2-plan-workflows}/bmad-create-prd/templates/prd-template.md +0 -0
- /package/src/{core/tasks → bmm-skills/2-plan-workflows}/bmad-create-prd/workflow.md +0 -0
- /package/src/{bmm/workflows → bmm-skills}/2-plan-workflows/bmad-create-ux-design/SKILL.md +0 -0
- /package/src/{bmm/workflows → bmm-skills}/2-plan-workflows/bmad-create-ux-design/steps/step-01-init.md +0 -0
- /package/src/{bmm/workflows → bmm-skills}/2-plan-workflows/bmad-create-ux-design/steps/step-01b-continue.md +0 -0
- /package/src/{bmm/workflows → bmm-skills}/2-plan-workflows/bmad-create-ux-design/steps/step-02-discovery.md +0 -0
- /package/src/{bmm/workflows → bmm-skills}/2-plan-workflows/bmad-create-ux-design/steps/step-03-core-experience.md +0 -0
- /package/src/{bmm/workflows → bmm-skills}/2-plan-workflows/bmad-create-ux-design/steps/step-04-emotional-response.md +0 -0
- /package/src/{bmm/workflows → bmm-skills}/2-plan-workflows/bmad-create-ux-design/steps/step-05-inspiration.md +0 -0
- /package/src/{bmm/workflows → bmm-skills}/2-plan-workflows/bmad-create-ux-design/steps/step-06-design-system.md +0 -0
- /package/src/{bmm/workflows → bmm-skills}/2-plan-workflows/bmad-create-ux-design/steps/step-07-defining-experience.md +0 -0
- /package/src/{bmm/workflows → bmm-skills}/2-plan-workflows/bmad-create-ux-design/steps/step-08-visual-foundation.md +0 -0
- /package/src/{bmm/workflows → bmm-skills}/2-plan-workflows/bmad-create-ux-design/steps/step-09-design-directions.md +0 -0
- /package/src/{bmm/workflows → bmm-skills}/2-plan-workflows/bmad-create-ux-design/steps/step-10-user-journeys.md +0 -0
- /package/src/{bmm/workflows → bmm-skills}/2-plan-workflows/bmad-create-ux-design/steps/step-11-component-strategy.md +0 -0
- /package/src/{bmm/workflows → bmm-skills}/2-plan-workflows/bmad-create-ux-design/steps/step-12-ux-patterns.md +0 -0
- /package/src/{bmm/workflows → bmm-skills}/2-plan-workflows/bmad-create-ux-design/steps/step-13-responsive-accessibility.md +0 -0
- /package/src/{bmm/workflows → bmm-skills}/2-plan-workflows/bmad-create-ux-design/steps/step-14-complete.md +0 -0
- /package/src/{bmm/workflows → bmm-skills}/2-plan-workflows/bmad-create-ux-design/ux-design-template.md +0 -0
- /package/src/{bmm/workflows → bmm-skills}/2-plan-workflows/bmad-create-ux-design/workflow.md +0 -0
- /package/src/{bmm/workflows → bmm-skills}/2-plan-workflows/bmad-edit-prd/SKILL.md +0 -0
- /package/src/{bmm/workflows → bmm-skills}/2-plan-workflows/bmad-edit-prd/workflow.md +0 -0
- /package/src/{bmm/workflows → bmm-skills}/2-plan-workflows/bmad-validate-prd/SKILL.md +0 -0
- /package/src/{bmm/workflows/2-plan-workflows/create-prd → bmm-skills/2-plan-workflows/bmad-validate-prd}/data/domain-complexity.csv +0 -0
- /package/src/{bmm/workflows/2-plan-workflows/create-prd → bmm-skills/2-plan-workflows/bmad-validate-prd}/data/prd-purpose.md +0 -0
- /package/src/{bmm/workflows/2-plan-workflows/create-prd → bmm-skills/2-plan-workflows/bmad-validate-prd}/data/project-types.csv +0 -0
- /package/src/{bmm/workflows → bmm-skills}/2-plan-workflows/bmad-validate-prd/steps-v/step-v-01-discovery.md +0 -0
- /package/src/{bmm/workflows → bmm-skills}/2-plan-workflows/bmad-validate-prd/steps-v/step-v-02-format-detection.md +0 -0
- /package/src/{bmm/workflows → bmm-skills}/2-plan-workflows/bmad-validate-prd/steps-v/step-v-02b-parity-check.md +0 -0
- /package/src/{bmm/workflows → bmm-skills}/2-plan-workflows/bmad-validate-prd/steps-v/step-v-03-density-validation.md +0 -0
- /package/src/{bmm/workflows → bmm-skills}/2-plan-workflows/bmad-validate-prd/steps-v/step-v-04-brief-coverage-validation.md +0 -0
- /package/src/{bmm/workflows → bmm-skills}/2-plan-workflows/bmad-validate-prd/steps-v/step-v-05-measurability-validation.md +0 -0
- /package/src/{bmm/workflows → bmm-skills}/2-plan-workflows/bmad-validate-prd/steps-v/step-v-06-traceability-validation.md +0 -0
- /package/src/{bmm/workflows → bmm-skills}/2-plan-workflows/bmad-validate-prd/steps-v/step-v-07-implementation-leakage-validation.md +0 -0
- /package/src/{bmm/workflows → bmm-skills}/2-plan-workflows/bmad-validate-prd/steps-v/step-v-08-domain-compliance-validation.md +0 -0
- /package/src/{bmm/workflows → bmm-skills}/2-plan-workflows/bmad-validate-prd/steps-v/step-v-09-project-type-validation.md +0 -0
- /package/src/{bmm/workflows → bmm-skills}/2-plan-workflows/bmad-validate-prd/steps-v/step-v-10-smart-validation.md +0 -0
- /package/src/{bmm/workflows → bmm-skills}/2-plan-workflows/bmad-validate-prd/steps-v/step-v-11-holistic-quality-validation.md +0 -0
- /package/src/{bmm/workflows → bmm-skills}/2-plan-workflows/bmad-validate-prd/steps-v/step-v-12-completeness-validation.md +0 -0
- /package/src/{bmm/workflows → bmm-skills}/2-plan-workflows/bmad-validate-prd/steps-v/step-v-13-report-complete.md +0 -0
- /package/src/{bmm/workflows → bmm-skills}/2-plan-workflows/bmad-validate-prd/workflow.md +0 -0
- /package/src/{core/tasks/bmad-create-prd → bmm-skills/2-plan-workflows/create-prd}/data/domain-complexity.csv +0 -0
- /package/src/{core/tasks/bmad-create-prd → bmm-skills/2-plan-workflows/create-prd}/data/prd-purpose.md +0 -0
- /package/src/{core/tasks/bmad-create-prd → bmm-skills/2-plan-workflows/create-prd}/data/project-types.csv +0 -0
- /package/src/{bmm/workflows → bmm-skills}/2-plan-workflows/create-prd/steps-v/step-v-01-discovery.md +0 -0
- /package/src/{bmm/workflows → bmm-skills}/2-plan-workflows/create-prd/steps-v/step-v-02-format-detection.md +0 -0
- /package/src/{bmm/workflows → bmm-skills}/2-plan-workflows/create-prd/steps-v/step-v-02b-parity-check.md +0 -0
- /package/src/{bmm/workflows → bmm-skills}/2-plan-workflows/create-prd/steps-v/step-v-03-density-validation.md +0 -0
- /package/src/{bmm/workflows → bmm-skills}/2-plan-workflows/create-prd/steps-v/step-v-04-brief-coverage-validation.md +0 -0
- /package/src/{bmm/workflows → bmm-skills}/2-plan-workflows/create-prd/steps-v/step-v-05-measurability-validation.md +0 -0
- /package/src/{bmm/workflows → bmm-skills}/2-plan-workflows/create-prd/steps-v/step-v-06-traceability-validation.md +0 -0
- /package/src/{bmm/workflows → bmm-skills}/2-plan-workflows/create-prd/steps-v/step-v-07-implementation-leakage-validation.md +0 -0
- /package/src/{bmm/workflows → bmm-skills}/2-plan-workflows/create-prd/steps-v/step-v-08-domain-compliance-validation.md +0 -0
- /package/src/{bmm/workflows → bmm-skills}/2-plan-workflows/create-prd/steps-v/step-v-09-project-type-validation.md +0 -0
- /package/src/{bmm/workflows → bmm-skills}/2-plan-workflows/create-prd/steps-v/step-v-10-smart-validation.md +0 -0
- /package/src/{bmm/workflows → bmm-skills}/2-plan-workflows/create-prd/steps-v/step-v-11-holistic-quality-validation.md +0 -0
- /package/src/{bmm/workflows → bmm-skills}/2-plan-workflows/create-prd/steps-v/step-v-12-completeness-validation.md +0 -0
- /package/src/{bmm/workflows → bmm-skills}/2-plan-workflows/create-prd/steps-v/step-v-13-report-complete.md +0 -0
- /package/src/{bmm/workflows → bmm-skills}/2-plan-workflows/create-prd/workflow-validate-prd.md +0 -0
- /package/src/{bmm/agents → bmm-skills/3-solutioning}/bmad-agent-architect/SKILL.md +0 -0
- /package/src/{bmm/workflows → bmm-skills}/3-solutioning/bmad-check-implementation-readiness/SKILL.md +0 -0
- /package/src/{bmm/workflows → bmm-skills}/3-solutioning/bmad-check-implementation-readiness/steps/step-01-document-discovery.md +0 -0
- /package/src/{bmm/workflows → bmm-skills}/3-solutioning/bmad-check-implementation-readiness/steps/step-02-prd-analysis.md +0 -0
- /package/src/{bmm/workflows → bmm-skills}/3-solutioning/bmad-check-implementation-readiness/steps/step-03-epic-coverage-validation.md +0 -0
- /package/src/{bmm/workflows → bmm-skills}/3-solutioning/bmad-check-implementation-readiness/steps/step-04-ux-alignment.md +0 -0
- /package/src/{bmm/workflows → bmm-skills}/3-solutioning/bmad-check-implementation-readiness/steps/step-05-epic-quality-review.md +0 -0
- /package/src/{bmm/workflows → bmm-skills}/3-solutioning/bmad-check-implementation-readiness/steps/step-06-final-assessment.md +0 -0
- /package/src/{bmm/workflows → bmm-skills}/3-solutioning/bmad-check-implementation-readiness/templates/readiness-report-template.md +0 -0
- /package/src/{bmm/workflows → bmm-skills}/3-solutioning/bmad-check-implementation-readiness/workflow.md +0 -0
- /package/src/{bmm/workflows → bmm-skills}/3-solutioning/bmad-create-architecture/SKILL.md +0 -0
- /package/src/{bmm/workflows → bmm-skills}/3-solutioning/bmad-create-architecture/architecture-decision-template.md +0 -0
- /package/src/{bmm/workflows → bmm-skills}/3-solutioning/bmad-create-architecture/data/domain-complexity.csv +0 -0
- /package/src/{bmm/workflows → bmm-skills}/3-solutioning/bmad-create-architecture/data/project-types.csv +0 -0
- /package/src/{bmm/workflows → bmm-skills}/3-solutioning/bmad-create-architecture/steps/step-01-init.md +0 -0
- /package/src/{bmm/workflows → bmm-skills}/3-solutioning/bmad-create-architecture/steps/step-01b-continue.md +0 -0
- /package/src/{bmm/workflows → bmm-skills}/3-solutioning/bmad-create-architecture/steps/step-02-context.md +0 -0
- /package/src/{bmm/workflows → bmm-skills}/3-solutioning/bmad-create-architecture/steps/step-03-starter.md +0 -0
- /package/src/{bmm/workflows → bmm-skills}/3-solutioning/bmad-create-architecture/steps/step-04-decisions.md +0 -0
- /package/src/{bmm/workflows → bmm-skills}/3-solutioning/bmad-create-architecture/steps/step-05-patterns.md +0 -0
- /package/src/{bmm/workflows → bmm-skills}/3-solutioning/bmad-create-architecture/steps/step-06-structure.md +0 -0
- /package/src/{bmm/workflows → bmm-skills}/3-solutioning/bmad-create-architecture/steps/step-07-validation.md +0 -0
- /package/src/{bmm/workflows → bmm-skills}/3-solutioning/bmad-create-architecture/steps/step-08-complete.md +0 -0
- /package/src/{bmm/workflows → bmm-skills}/3-solutioning/bmad-create-architecture/workflow.md +0 -0
- /package/src/{bmm/workflows → bmm-skills}/3-solutioning/bmad-create-epics-and-stories/SKILL.md +0 -0
- /package/src/{bmm/workflows → bmm-skills}/3-solutioning/bmad-create-epics-and-stories/steps/step-01-validate-prerequisites.md +0 -0
- /package/src/{bmm/workflows → bmm-skills}/3-solutioning/bmad-create-epics-and-stories/steps/step-02-design-epics.md +0 -0
- /package/src/{bmm/workflows → bmm-skills}/3-solutioning/bmad-create-epics-and-stories/steps/step-03-create-stories.md +0 -0
- /package/src/{bmm/workflows → bmm-skills}/3-solutioning/bmad-create-epics-and-stories/steps/step-04-final-validation.md +0 -0
- /package/src/{bmm/workflows → bmm-skills}/3-solutioning/bmad-create-epics-and-stories/templates/epics-template.md +0 -0
- /package/src/{bmm/workflows → bmm-skills}/3-solutioning/bmad-create-epics-and-stories/workflow.md +0 -0
- /package/src/{bmm/workflows → bmm-skills/3-solutioning}/bmad-generate-project-context/SKILL.md +0 -0
- /package/src/{bmm/workflows → bmm-skills/3-solutioning}/bmad-generate-project-context/project-context-template.md +0 -0
- /package/src/{bmm/workflows → bmm-skills/3-solutioning}/bmad-generate-project-context/steps/step-01-discover.md +0 -0
- /package/src/{bmm/workflows → bmm-skills/3-solutioning}/bmad-generate-project-context/steps/step-02-generate.md +0 -0
- /package/src/{bmm/workflows → bmm-skills/3-solutioning}/bmad-generate-project-context/steps/step-03-complete.md +0 -0
- /package/src/{bmm/workflows → bmm-skills/3-solutioning}/bmad-generate-project-context/workflow.md +0 -0
- /package/src/{bmm/agents → bmm-skills/4-implementation}/bmad-agent-dev/SKILL.md +0 -0
- /package/src/{bmm/agents → bmm-skills/4-implementation}/bmad-agent-qa/SKILL.md +0 -0
- /package/src/{bmm/agents → bmm-skills/4-implementation}/bmad-agent-sm/SKILL.md +0 -0
- /package/src/{bmm/workflows → bmm-skills}/4-implementation/bmad-code-review/SKILL.md +0 -0
- /package/src/{bmm/workflows → bmm-skills}/4-implementation/bmad-correct-course/SKILL.md +0 -0
- /package/src/{bmm/workflows → bmm-skills}/4-implementation/bmad-correct-course/checklist.md +0 -0
- /package/src/{bmm/workflows → bmm-skills}/4-implementation/bmad-create-story/SKILL.md +0 -0
- /package/src/{bmm/workflows → bmm-skills}/4-implementation/bmad-create-story/checklist.md +0 -0
- /package/src/{bmm/workflows → bmm-skills}/4-implementation/bmad-create-story/discover-inputs.md +0 -0
- /package/src/{bmm/workflows → bmm-skills}/4-implementation/bmad-create-story/template.md +0 -0
- /package/src/{bmm/workflows → bmm-skills}/4-implementation/bmad-create-story/workflow.md +0 -0
- /package/src/{bmm/workflows → bmm-skills}/4-implementation/bmad-dev-story/SKILL.md +0 -0
- /package/src/{bmm/workflows → bmm-skills}/4-implementation/bmad-dev-story/checklist.md +0 -0
- /package/src/{bmm/workflows → bmm-skills}/4-implementation/bmad-dev-story/workflow.md +0 -0
- /package/src/{bmm/workflows → bmm-skills/4-implementation}/bmad-qa-generate-e2e-tests/SKILL.md +0 -0
- /package/src/{bmm/workflows → bmm-skills/4-implementation}/bmad-qa-generate-e2e-tests/checklist.md +0 -0
- /package/src/{bmm/workflows → bmm-skills/4-implementation}/bmad-qa-generate-e2e-tests/workflow.md +0 -0
- /package/src/{bmm/workflows/bmad-quick-flow/bmad-quick-dev-new-preview → bmm-skills/4-implementation/bmad-quick-dev}/step-04-review.md +0 -0
- /package/src/{bmm/workflows → bmm-skills}/4-implementation/bmad-retrospective/SKILL.md +0 -0
- /package/src/{bmm/workflows → bmm-skills}/4-implementation/bmad-retrospective/workflow.md +0 -0
- /package/src/{bmm/workflows → bmm-skills}/4-implementation/bmad-sprint-planning/SKILL.md +0 -0
- /package/src/{bmm/workflows → bmm-skills}/4-implementation/bmad-sprint-planning/checklist.md +0 -0
- /package/src/{bmm/workflows → bmm-skills}/4-implementation/bmad-sprint-planning/sprint-status-template.yaml +0 -0
- /package/src/{bmm/workflows → bmm-skills}/4-implementation/bmad-sprint-planning/workflow.md +0 -0
- /package/src/{bmm/workflows → bmm-skills}/4-implementation/bmad-sprint-status/SKILL.md +0 -0
- /package/src/{bmm/workflows → bmm-skills}/4-implementation/bmad-sprint-status/workflow.md +0 -0
- /package/src/{bmm → bmm-skills}/module.yaml +0 -0
- /package/src/{core/skills → core-skills}/bmad-advanced-elicitation/methods.csv +0 -0
- /package/src/{core/skills → core-skills}/bmad-brainstorming/SKILL.md +0 -0
- /package/src/{core/skills → core-skills}/bmad-brainstorming/brain-methods.csv +0 -0
- /package/src/{core/skills → core-skills}/bmad-brainstorming/steps/step-01-session-setup.md +0 -0
- /package/src/{core/skills → core-skills}/bmad-brainstorming/steps/step-01b-continue.md +0 -0
- /package/src/{core/skills → core-skills}/bmad-brainstorming/steps/step-02a-user-selected.md +0 -0
- /package/src/{core/skills → core-skills}/bmad-brainstorming/steps/step-02b-ai-recommended.md +0 -0
- /package/src/{core/skills → core-skills}/bmad-brainstorming/steps/step-02c-random-selection.md +0 -0
- /package/src/{core/skills → core-skills}/bmad-brainstorming/steps/step-02d-progressive-flow.md +0 -0
- /package/src/{core/skills → core-skills}/bmad-brainstorming/steps/step-03-technique-execution.md +0 -0
- /package/src/{core/skills → core-skills}/bmad-brainstorming/steps/step-04-idea-organization.md +0 -0
- /package/src/{core/skills → core-skills}/bmad-brainstorming/template.md +0 -0
- /package/src/{core/skills → core-skills}/bmad-brainstorming/workflow.md +0 -0
- /package/src/{core/skills → core-skills}/bmad-distillator/SKILL.md +0 -0
- /package/src/{core/skills → core-skills}/bmad-distillator/agents/distillate-compressor.md +0 -0
- /package/src/{core/skills → core-skills}/bmad-distillator/agents/round-trip-reconstructor.md +0 -0
- /package/src/{core/skills → core-skills}/bmad-distillator/resources/compression-rules.md +0 -0
- /package/src/{core/skills → core-skills}/bmad-distillator/resources/distillate-format-reference.md +0 -0
- /package/src/{core/skills → core-skills}/bmad-distillator/resources/splitting-strategy.md +0 -0
- /package/src/{core/skills → core-skills}/bmad-distillator/scripts/analyze_sources.py +0 -0
- /package/src/{core/skills → core-skills}/bmad-distillator/scripts/tests/test_analyze_sources.py +0 -0
- /package/src/{core/skills → core-skills}/bmad-init/SKILL.md +0 -0
- /package/src/{core/skills → core-skills}/bmad-init/resources/core-module.yaml +0 -0
- /package/src/{core/skills → core-skills}/bmad-init/scripts/bmad_init.py +0 -0
- /package/src/{core/skills → core-skills}/bmad-init/scripts/tests/test_bmad_init.py +0 -0
- /package/src/{core/skills → core-skills}/bmad-party-mode/SKILL.md +0 -0
- /package/src/{core/skills → core-skills}/bmad-party-mode/steps/step-01-agent-loading.md +0 -0
- /package/src/{core/skills → core-skills}/bmad-party-mode/steps/step-02-discussion-orchestration.md +0 -0
- /package/src/{core/skills → core-skills}/bmad-party-mode/steps/step-03-graceful-exit.md +0 -0
- /package/src/{core/skills → core-skills}/bmad-party-mode/workflow.md +0 -0
- /package/src/{core → core-skills}/module.yaml +0 -0
|
@@ -16,15 +16,12 @@ const {
|
|
|
16
16
|
const packageJson = require('../../../../../package.json');
|
|
17
17
|
|
|
18
18
|
/**
|
|
19
|
-
* Generates manifest files for installed
|
|
19
|
+
* Generates manifest files for installed skills and agents
|
|
20
20
|
*/
|
|
21
21
|
class ManifestGenerator {
|
|
22
22
|
constructor() {
|
|
23
|
-
this.workflows = [];
|
|
24
23
|
this.skills = [];
|
|
25
24
|
this.agents = [];
|
|
26
|
-
this.tasks = [];
|
|
27
|
-
this.tools = [];
|
|
28
25
|
this.modules = [];
|
|
29
26
|
this.files = [];
|
|
30
27
|
this.selectedIdes = [];
|
|
@@ -85,10 +82,6 @@ class ManifestGenerator {
|
|
|
85
82
|
this.modules = allModules;
|
|
86
83
|
this.updatedModules = allModules; // Include ALL modules (including custom) for scanning
|
|
87
84
|
|
|
88
|
-
// For CSV manifests, we need to include ALL modules that are installed
|
|
89
|
-
// preservedModules controls which modules stay as-is in the CSV (don't get rescanned)
|
|
90
|
-
// But all modules should be included in the final manifest
|
|
91
|
-
this.preservedModules = allModules; // Include ALL modules (including custom)
|
|
92
85
|
this.bmadDir = bmadDir;
|
|
93
86
|
this.bmadFolderName = path.basename(bmadDir); // Get the actual folder name (e.g., '_bmad' or 'bmad')
|
|
94
87
|
this.allInstalledFiles = installedFiles;
|
|
@@ -111,44 +104,30 @@ class ManifestGenerator {
|
|
|
111
104
|
// Collect skills first (populates skillClaimedDirs before legacy collectors run)
|
|
112
105
|
await this.collectSkills();
|
|
113
106
|
|
|
114
|
-
// Collect workflow data
|
|
115
|
-
await this.collectWorkflows(selectedModules);
|
|
116
|
-
|
|
117
107
|
// Collect agent data - use updatedModules which includes all installed modules
|
|
118
108
|
await this.collectAgents(this.updatedModules);
|
|
119
109
|
|
|
120
|
-
// Collect task data
|
|
121
|
-
await this.collectTasks(this.updatedModules);
|
|
122
|
-
|
|
123
|
-
// Collect tool data
|
|
124
|
-
await this.collectTools(this.updatedModules);
|
|
125
|
-
|
|
126
110
|
// Write manifest files and collect their paths
|
|
127
111
|
const manifestFiles = [
|
|
128
112
|
await this.writeMainManifest(cfgDir),
|
|
129
|
-
await this.writeWorkflowManifest(cfgDir),
|
|
130
113
|
await this.writeSkillManifest(cfgDir),
|
|
131
114
|
await this.writeAgentManifest(cfgDir),
|
|
132
|
-
await this.writeTaskManifest(cfgDir),
|
|
133
|
-
await this.writeToolManifest(cfgDir),
|
|
134
115
|
await this.writeFilesManifest(cfgDir),
|
|
135
116
|
];
|
|
136
117
|
|
|
137
118
|
return {
|
|
138
119
|
skills: this.skills.length,
|
|
139
|
-
workflows: this.workflows.length,
|
|
140
120
|
agents: this.agents.length,
|
|
141
|
-
tasks: this.tasks.length,
|
|
142
|
-
tools: this.tools.length,
|
|
143
121
|
files: this.files.length,
|
|
144
122
|
manifestFiles: manifestFiles,
|
|
145
123
|
};
|
|
146
124
|
}
|
|
147
125
|
|
|
148
126
|
/**
|
|
149
|
-
* Recursively walk a module directory tree, collecting
|
|
150
|
-
* A
|
|
151
|
-
*
|
|
127
|
+
* Recursively walk a module directory tree, collecting native SKILL.md entrypoints.
|
|
128
|
+
* A directory is discovered as a skill when it contains a SKILL.md file with
|
|
129
|
+
* valid name/description frontmatter (name must match directory name).
|
|
130
|
+
* Manifest YAML is loaded only when present — for install_to_bmad and agent metadata.
|
|
152
131
|
* Populates this.skills[] and this.skillClaimedDirs (Set of absolute paths).
|
|
153
132
|
*/
|
|
154
133
|
async collectSkills() {
|
|
@@ -169,76 +148,55 @@ class ManifestGenerator {
|
|
|
169
148
|
return;
|
|
170
149
|
}
|
|
171
150
|
|
|
172
|
-
//
|
|
173
|
-
const manifest = await this.loadSkillManifest(dir);
|
|
174
|
-
|
|
175
|
-
// Determine if this directory is a skill (type: skill in manifest)
|
|
151
|
+
// SKILL.md with valid frontmatter is the primary discovery gate
|
|
176
152
|
const skillFile = 'SKILL.md';
|
|
177
|
-
const
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
//
|
|
184
|
-
const
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
)
|
|
199
|
-
|
|
200
|
-
const canonicalId = dirName;
|
|
201
|
-
|
|
202
|
-
this.skills.push({
|
|
203
|
-
name: skillMeta.name,
|
|
204
|
-
description: this.cleanForCSV(skillMeta.description),
|
|
205
|
-
module: moduleName,
|
|
206
|
-
path: installPath,
|
|
207
|
-
canonicalId,
|
|
208
|
-
install_to_bmad: this.getInstallToBmad(manifest, skillFile),
|
|
209
|
-
});
|
|
210
|
-
|
|
211
|
-
// Add to files list
|
|
212
|
-
this.files.push({
|
|
213
|
-
type: 'skill',
|
|
214
|
-
name: skillMeta.name,
|
|
215
|
-
module: moduleName,
|
|
216
|
-
path: installPath,
|
|
217
|
-
});
|
|
218
|
-
|
|
219
|
-
this.skillClaimedDirs.add(dir);
|
|
220
|
-
|
|
221
|
-
if (debug) {
|
|
222
|
-
console.log(`[DEBUG] collectSkills: claimed skill "${skillMeta.name}" as ${canonicalId} at ${dir}`);
|
|
223
|
-
}
|
|
153
|
+
const skillMdPath = path.join(dir, skillFile);
|
|
154
|
+
const dirName = path.basename(dir);
|
|
155
|
+
|
|
156
|
+
const skillMeta = await this.parseSkillMd(skillMdPath, dir, dirName, debug);
|
|
157
|
+
|
|
158
|
+
if (skillMeta) {
|
|
159
|
+
// Load manifest when present (for install_to_bmad and agent metadata)
|
|
160
|
+
const manifest = await this.loadSkillManifest(dir);
|
|
161
|
+
const artifactType = this.getArtifactType(manifest, skillFile);
|
|
162
|
+
|
|
163
|
+
// Build path relative from module root (points to SKILL.md — the permanent entrypoint)
|
|
164
|
+
const relativePath = path.relative(modulePath, dir).split(path.sep).join('/');
|
|
165
|
+
const installPath = relativePath
|
|
166
|
+
? `${this.bmadFolderName}/${moduleName}/${relativePath}/${skillFile}`
|
|
167
|
+
: `${this.bmadFolderName}/${moduleName}/${skillFile}`;
|
|
168
|
+
|
|
169
|
+
// Native SKILL.md entrypoints derive canonicalId from directory name.
|
|
170
|
+
// Agent entrypoints may keep canonicalId metadata for compatibility, so
|
|
171
|
+
// only warn for non-agent SKILL.md directories.
|
|
172
|
+
if (manifest && manifest.__single && manifest.__single.canonicalId && artifactType !== 'agent') {
|
|
173
|
+
console.warn(
|
|
174
|
+
`Warning: Native entrypoint manifest at ${dir}/bmad-skill-manifest.yaml contains canonicalId — this field is ignored for SKILL.md directories (directory name is the canonical ID)`,
|
|
175
|
+
);
|
|
224
176
|
}
|
|
225
|
-
|
|
177
|
+
const canonicalId = dirName;
|
|
226
178
|
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
179
|
+
this.skills.push({
|
|
180
|
+
name: skillMeta.name,
|
|
181
|
+
description: this.cleanForCSV(skillMeta.description),
|
|
182
|
+
module: moduleName,
|
|
183
|
+
path: installPath,
|
|
184
|
+
canonicalId,
|
|
185
|
+
install_to_bmad: this.getInstallToBmad(manifest, skillFile),
|
|
186
|
+
});
|
|
187
|
+
|
|
188
|
+
// Add to files list
|
|
189
|
+
this.files.push({
|
|
190
|
+
type: 'skill',
|
|
191
|
+
name: skillMeta.name,
|
|
192
|
+
module: moduleName,
|
|
193
|
+
path: installPath,
|
|
194
|
+
});
|
|
195
|
+
|
|
196
|
+
this.skillClaimedDirs.add(dir);
|
|
197
|
+
|
|
198
|
+
if (debug) {
|
|
199
|
+
console.log(`[DEBUG] collectSkills: claimed skill "${skillMeta.name}" as ${canonicalId} at ${dir}`);
|
|
242
200
|
}
|
|
243
201
|
}
|
|
244
202
|
|
|
@@ -310,509 +268,106 @@ class ManifestGenerator {
|
|
|
310
268
|
}
|
|
311
269
|
|
|
312
270
|
/**
|
|
313
|
-
* Collect all
|
|
314
|
-
* Scans the INSTALLED bmad directory, not the source
|
|
315
|
-
*/
|
|
316
|
-
async collectWorkflows(selectedModules) {
|
|
317
|
-
this.workflows = [];
|
|
318
|
-
|
|
319
|
-
// Use updatedModules which already includes deduplicated 'core' + selectedModules
|
|
320
|
-
for (const moduleName of this.updatedModules) {
|
|
321
|
-
const modulePath = path.join(this.bmadDir, moduleName);
|
|
322
|
-
|
|
323
|
-
if (await fs.pathExists(modulePath)) {
|
|
324
|
-
const moduleWorkflows = await this.getWorkflowsFromPath(modulePath, moduleName);
|
|
325
|
-
this.workflows.push(...moduleWorkflows);
|
|
326
|
-
|
|
327
|
-
// Also scan tasks/ for type:skill entries (skills can live anywhere)
|
|
328
|
-
const tasksSkills = await this.getWorkflowsFromPath(modulePath, moduleName, 'tasks');
|
|
329
|
-
this.workflows.push(...tasksSkills);
|
|
330
|
-
}
|
|
331
|
-
}
|
|
332
|
-
}
|
|
333
|
-
|
|
334
|
-
/**
|
|
335
|
-
* Recursively find and parse workflow.md files
|
|
336
|
-
*/
|
|
337
|
-
async getWorkflowsFromPath(basePath, moduleName, subDir = 'workflows') {
|
|
338
|
-
const workflows = [];
|
|
339
|
-
const workflowsPath = path.join(basePath, subDir);
|
|
340
|
-
const debug = process.env.BMAD_DEBUG_MANIFEST === 'true';
|
|
341
|
-
|
|
342
|
-
if (debug) {
|
|
343
|
-
console.log(`[DEBUG] Scanning workflows in: ${workflowsPath}`);
|
|
344
|
-
}
|
|
345
|
-
|
|
346
|
-
if (!(await fs.pathExists(workflowsPath))) {
|
|
347
|
-
if (debug) {
|
|
348
|
-
console.log(`[DEBUG] Workflows path does not exist: ${workflowsPath}`);
|
|
349
|
-
}
|
|
350
|
-
return workflows;
|
|
351
|
-
}
|
|
352
|
-
|
|
353
|
-
// Recursively find workflow.md files
|
|
354
|
-
const findWorkflows = async (dir, relativePath = '') => {
|
|
355
|
-
// Skip directories already claimed as skills
|
|
356
|
-
if (this.skillClaimedDirs && this.skillClaimedDirs.has(dir)) return;
|
|
357
|
-
|
|
358
|
-
const entries = await fs.readdir(dir, { withFileTypes: true });
|
|
359
|
-
// Load skill manifest for this directory (if present)
|
|
360
|
-
const skillManifest = await this.loadSkillManifest(dir);
|
|
361
|
-
|
|
362
|
-
for (const entry of entries) {
|
|
363
|
-
const fullPath = path.join(dir, entry.name);
|
|
364
|
-
|
|
365
|
-
if (entry.isDirectory()) {
|
|
366
|
-
// Skip directories claimed by collectSkills
|
|
367
|
-
if (this.skillClaimedDirs && this.skillClaimedDirs.has(fullPath)) continue;
|
|
368
|
-
// Recurse into subdirectories
|
|
369
|
-
const newRelativePath = relativePath ? `${relativePath}/${entry.name}` : entry.name;
|
|
370
|
-
await findWorkflows(fullPath, newRelativePath);
|
|
371
|
-
} else if (entry.name === 'workflow.md' || (entry.name.startsWith('workflow-') && entry.name.endsWith('.md'))) {
|
|
372
|
-
// Parse workflow file (both YAML and MD formats)
|
|
373
|
-
if (debug) {
|
|
374
|
-
console.log(`[DEBUG] Found workflow file: ${fullPath}`);
|
|
375
|
-
}
|
|
376
|
-
try {
|
|
377
|
-
// Read and normalize line endings (fix Windows CRLF issues)
|
|
378
|
-
const rawContent = await fs.readFile(fullPath, 'utf8');
|
|
379
|
-
const content = rawContent.replaceAll('\r\n', '\n').replaceAll('\r', '\n');
|
|
380
|
-
|
|
381
|
-
// Parse MD workflow with YAML frontmatter
|
|
382
|
-
const frontmatterMatch = content.match(/^---\n([\s\S]*?)\n---/);
|
|
383
|
-
if (!frontmatterMatch) {
|
|
384
|
-
if (debug) {
|
|
385
|
-
console.log(`[DEBUG] Skipped (no frontmatter): ${fullPath}`);
|
|
386
|
-
}
|
|
387
|
-
continue; // Skip MD files without frontmatter
|
|
388
|
-
}
|
|
389
|
-
const workflow = yaml.parse(frontmatterMatch[1]);
|
|
390
|
-
|
|
391
|
-
if (debug) {
|
|
392
|
-
console.log(`[DEBUG] Parsed: name="${workflow.name}", description=${workflow.description ? 'OK' : 'MISSING'}`);
|
|
393
|
-
}
|
|
394
|
-
|
|
395
|
-
// Skip template workflows (those with placeholder values)
|
|
396
|
-
if (workflow.name && workflow.name.includes('{') && workflow.name.includes('}')) {
|
|
397
|
-
if (debug) {
|
|
398
|
-
console.log(`[DEBUG] Skipped (template placeholder): ${workflow.name}`);
|
|
399
|
-
}
|
|
400
|
-
continue;
|
|
401
|
-
}
|
|
402
|
-
|
|
403
|
-
// Skip workflows marked as non-standalone (reference/example workflows)
|
|
404
|
-
if (workflow.standalone === false) {
|
|
405
|
-
if (debug) {
|
|
406
|
-
console.log(`[DEBUG] Skipped (standalone=false): ${workflow.name}`);
|
|
407
|
-
}
|
|
408
|
-
continue;
|
|
409
|
-
}
|
|
410
|
-
|
|
411
|
-
if (workflow.name && workflow.description) {
|
|
412
|
-
// Build relative path for installation
|
|
413
|
-
const installPath =
|
|
414
|
-
moduleName === 'core'
|
|
415
|
-
? `${this.bmadFolderName}/core/${subDir}/${relativePath}/${entry.name}`
|
|
416
|
-
: `${this.bmadFolderName}/${moduleName}/${subDir}/${relativePath}/${entry.name}`;
|
|
417
|
-
|
|
418
|
-
// Workflows with standalone: false are filtered out above
|
|
419
|
-
workflows.push({
|
|
420
|
-
name: workflow.name,
|
|
421
|
-
description: this.cleanForCSV(workflow.description),
|
|
422
|
-
module: moduleName,
|
|
423
|
-
path: installPath,
|
|
424
|
-
canonicalId: this.getCanonicalId(skillManifest, entry.name),
|
|
425
|
-
});
|
|
426
|
-
|
|
427
|
-
// Add to files list
|
|
428
|
-
this.files.push({
|
|
429
|
-
type: 'workflow',
|
|
430
|
-
name: workflow.name,
|
|
431
|
-
module: moduleName,
|
|
432
|
-
path: installPath,
|
|
433
|
-
});
|
|
434
|
-
|
|
435
|
-
if (debug) {
|
|
436
|
-
console.log(`[DEBUG] ✓ Added workflow: ${workflow.name} (${moduleName})`);
|
|
437
|
-
}
|
|
438
|
-
} else {
|
|
439
|
-
if (debug) {
|
|
440
|
-
console.log(`[DEBUG] Skipped (missing name or description): ${fullPath}`);
|
|
441
|
-
}
|
|
442
|
-
}
|
|
443
|
-
} catch (error) {
|
|
444
|
-
await prompts.log.warn(`Failed to parse workflow at ${fullPath}: ${error.message}`);
|
|
445
|
-
}
|
|
446
|
-
}
|
|
447
|
-
}
|
|
448
|
-
};
|
|
449
|
-
|
|
450
|
-
await findWorkflows(workflowsPath);
|
|
451
|
-
|
|
452
|
-
if (debug) {
|
|
453
|
-
console.log(`[DEBUG] Total workflows found in ${moduleName}: ${workflows.length}`);
|
|
454
|
-
}
|
|
455
|
-
|
|
456
|
-
return workflows;
|
|
457
|
-
}
|
|
458
|
-
|
|
459
|
-
/**
|
|
460
|
-
* Collect all agents from core and selected modules
|
|
461
|
-
* Scans the INSTALLED bmad directory, not the source
|
|
271
|
+
* Collect all agents from selected modules by walking their directory trees.
|
|
462
272
|
*/
|
|
463
273
|
async collectAgents(selectedModules) {
|
|
464
274
|
this.agents = [];
|
|
275
|
+
const debug = process.env.BMAD_DEBUG_MANIFEST === 'true';
|
|
465
276
|
|
|
466
|
-
//
|
|
277
|
+
// Walk each module's full directory tree looking for type:agent manifests
|
|
467
278
|
for (const moduleName of this.updatedModules) {
|
|
468
|
-
const
|
|
279
|
+
const modulePath = path.join(this.bmadDir, moduleName);
|
|
280
|
+
if (!(await fs.pathExists(modulePath))) continue;
|
|
469
281
|
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
this.agents.push(...moduleAgents);
|
|
473
|
-
}
|
|
282
|
+
const moduleAgents = await this.getAgentsFromDirRecursive(modulePath, moduleName, '', debug);
|
|
283
|
+
this.agents.push(...moduleAgents);
|
|
474
284
|
}
|
|
475
285
|
|
|
476
286
|
// Get standalone agents from bmad/agents/ directory
|
|
477
287
|
const standaloneAgentsDir = path.join(this.bmadDir, 'agents');
|
|
478
288
|
if (await fs.pathExists(standaloneAgentsDir)) {
|
|
479
|
-
const
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
if (!agentDir.isDirectory()) continue;
|
|
289
|
+
const standaloneAgents = await this.getAgentsFromDirRecursive(standaloneAgentsDir, 'standalone', '', debug);
|
|
290
|
+
this.agents.push(...standaloneAgents);
|
|
291
|
+
}
|
|
483
292
|
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
this.agents.push(...standaloneAgents);
|
|
487
|
-
}
|
|
293
|
+
if (debug) {
|
|
294
|
+
console.log(`[DEBUG] collectAgents: total agents found: ${this.agents.length}`);
|
|
488
295
|
}
|
|
489
296
|
}
|
|
490
297
|
|
|
491
298
|
/**
|
|
492
|
-
*
|
|
493
|
-
*
|
|
299
|
+
* Recursively walk a directory tree collecting agents.
|
|
300
|
+
* Discovers agents via directory with bmad-skill-manifest.yaml containing type: agent
|
|
301
|
+
*
|
|
302
|
+
* @param {string} dirPath - Current directory being scanned
|
|
303
|
+
* @param {string} moduleName - Module this directory belongs to
|
|
304
|
+
* @param {string} relativePath - Path relative to the module root (for install path construction)
|
|
305
|
+
* @param {boolean} debug - Emit debug messages
|
|
494
306
|
*/
|
|
495
|
-
async
|
|
496
|
-
// Skip directories claimed by collectSkills
|
|
497
|
-
if (this.skillClaimedDirs && this.skillClaimedDirs.has(dirPath)) return [];
|
|
307
|
+
async getAgentsFromDirRecursive(dirPath, moduleName, relativePath = '', debug = false) {
|
|
498
308
|
const agents = [];
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
309
|
+
let entries;
|
|
310
|
+
try {
|
|
311
|
+
entries = await fs.readdir(dirPath, { withFileTypes: true });
|
|
312
|
+
} catch {
|
|
313
|
+
return agents;
|
|
314
|
+
}
|
|
502
315
|
|
|
503
316
|
for (const entry of entries) {
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
if (entry.isDirectory()) {
|
|
507
|
-
// Check for new-format agent: bmad-skill-manifest.yaml with type: agent
|
|
508
|
-
// Note: type:agent dirs may also be claimed by collectSkills for IDE installation,
|
|
509
|
-
// but we still need to process them here for agent-manifest.csv
|
|
510
|
-
const dirManifest = await this.loadSkillManifest(fullPath);
|
|
511
|
-
if (dirManifest && dirManifest.__single && dirManifest.__single.type === 'agent') {
|
|
512
|
-
const m = dirManifest.__single;
|
|
513
|
-
const dirRelativePath = relativePath ? `${relativePath}/${entry.name}` : entry.name;
|
|
514
|
-
const installPath =
|
|
515
|
-
moduleName === 'core'
|
|
516
|
-
? `${this.bmadFolderName}/core/agents/${dirRelativePath}`
|
|
517
|
-
: `${this.bmadFolderName}/${moduleName}/agents/${dirRelativePath}`;
|
|
518
|
-
|
|
519
|
-
agents.push({
|
|
520
|
-
name: m.name || entry.name,
|
|
521
|
-
displayName: m.displayName || m.name || entry.name,
|
|
522
|
-
title: m.title || '',
|
|
523
|
-
icon: m.icon || '',
|
|
524
|
-
capabilities: m.capabilities ? this.cleanForCSV(m.capabilities) : '',
|
|
525
|
-
role: m.role ? this.cleanForCSV(m.role) : '',
|
|
526
|
-
identity: m.identity ? this.cleanForCSV(m.identity) : '',
|
|
527
|
-
communicationStyle: m.communicationStyle ? this.cleanForCSV(m.communicationStyle) : '',
|
|
528
|
-
principles: m.principles ? this.cleanForCSV(m.principles) : '',
|
|
529
|
-
module: m.module || moduleName,
|
|
530
|
-
path: installPath,
|
|
531
|
-
canonicalId: m.canonicalId || '',
|
|
532
|
-
});
|
|
533
|
-
|
|
534
|
-
this.files.push({
|
|
535
|
-
type: 'agent',
|
|
536
|
-
name: m.name || entry.name,
|
|
537
|
-
module: moduleName,
|
|
538
|
-
path: installPath,
|
|
539
|
-
});
|
|
540
|
-
continue;
|
|
541
|
-
}
|
|
542
|
-
|
|
543
|
-
// Skip directories claimed by collectSkills (non-agent type skills)
|
|
544
|
-
if (this.skillClaimedDirs && this.skillClaimedDirs.has(fullPath)) continue;
|
|
545
|
-
|
|
546
|
-
// Recurse into subdirectories
|
|
547
|
-
const newRelativePath = relativePath ? `${relativePath}/${entry.name}` : entry.name;
|
|
548
|
-
const subDirAgents = await this.getAgentsFromDir(fullPath, moduleName, newRelativePath);
|
|
549
|
-
agents.push(...subDirAgents);
|
|
550
|
-
} else if (entry.name.endsWith('.md') && !entry.name.endsWith('.agent.yaml') && entry.name.toLowerCase() !== 'readme.md') {
|
|
551
|
-
const content = await fs.readFile(fullPath, 'utf8');
|
|
552
|
-
|
|
553
|
-
// Skip files that don't contain <agent> tag (e.g., README files)
|
|
554
|
-
if (!content.includes('<agent')) {
|
|
555
|
-
continue;
|
|
556
|
-
}
|
|
557
|
-
|
|
558
|
-
// Skip web-only agents
|
|
559
|
-
if (content.includes('localskip="true"')) {
|
|
560
|
-
continue;
|
|
561
|
-
}
|
|
562
|
-
|
|
563
|
-
// Extract agent metadata from the XML structure
|
|
564
|
-
const nameMatch = content.match(/name="([^"]+)"/);
|
|
565
|
-
const titleMatch = content.match(/title="([^"]+)"/);
|
|
566
|
-
const iconMatch = content.match(/icon="([^"]+)"/);
|
|
567
|
-
const capabilitiesMatch = content.match(/capabilities="([^"]+)"/);
|
|
568
|
-
|
|
569
|
-
// Extract persona fields
|
|
570
|
-
const roleMatch = content.match(/<role>([^<]+)<\/role>/);
|
|
571
|
-
const identityMatch = content.match(/<identity>([\s\S]*?)<\/identity>/);
|
|
572
|
-
const styleMatch = content.match(/<communication_style>([\s\S]*?)<\/communication_style>/);
|
|
573
|
-
const principlesMatch = content.match(/<principles>([\s\S]*?)<\/principles>/);
|
|
317
|
+
if (!entry.isDirectory()) continue;
|
|
318
|
+
if (entry.name.startsWith('.') || entry.name.startsWith('_')) continue;
|
|
574
319
|
|
|
575
|
-
|
|
576
|
-
const fileRelativePath = relativePath ? `${relativePath}/${entry.name}` : entry.name;
|
|
577
|
-
const installPath =
|
|
578
|
-
moduleName === 'core'
|
|
579
|
-
? `${this.bmadFolderName}/core/agents/${fileRelativePath}`
|
|
580
|
-
: `${this.bmadFolderName}/${moduleName}/agents/${fileRelativePath}`;
|
|
320
|
+
const fullPath = path.join(dirPath, entry.name);
|
|
581
321
|
|
|
582
|
-
|
|
322
|
+
// Check for type:agent manifest BEFORE checking skillClaimedDirs —
|
|
323
|
+
// agent dirs may be claimed by collectSkills for IDE installation,
|
|
324
|
+
// but we still need them in agent-manifest.csv.
|
|
325
|
+
const dirManifest = await this.loadSkillManifest(fullPath);
|
|
326
|
+
if (dirManifest && dirManifest.__single && dirManifest.__single.type === 'agent') {
|
|
327
|
+
const m = dirManifest.__single;
|
|
328
|
+
const dirRelativePath = relativePath ? `${relativePath}/${entry.name}` : entry.name;
|
|
329
|
+
const agentModule = m.module || moduleName;
|
|
330
|
+
const installPath = `${this.bmadFolderName}/${agentModule}/${dirRelativePath}`;
|
|
583
331
|
|
|
584
332
|
agents.push({
|
|
585
|
-
name:
|
|
586
|
-
displayName:
|
|
587
|
-
title:
|
|
588
|
-
icon:
|
|
589
|
-
capabilities:
|
|
590
|
-
role:
|
|
591
|
-
identity:
|
|
592
|
-
communicationStyle:
|
|
593
|
-
principles:
|
|
594
|
-
module:
|
|
333
|
+
name: m.name || entry.name,
|
|
334
|
+
displayName: m.displayName || m.name || entry.name,
|
|
335
|
+
title: m.title || '',
|
|
336
|
+
icon: m.icon || '',
|
|
337
|
+
capabilities: m.capabilities ? this.cleanForCSV(m.capabilities) : '',
|
|
338
|
+
role: m.role ? this.cleanForCSV(m.role) : '',
|
|
339
|
+
identity: m.identity ? this.cleanForCSV(m.identity) : '',
|
|
340
|
+
communicationStyle: m.communicationStyle ? this.cleanForCSV(m.communicationStyle) : '',
|
|
341
|
+
principles: m.principles ? this.cleanForCSV(m.principles) : '',
|
|
342
|
+
module: agentModule,
|
|
595
343
|
path: installPath,
|
|
596
|
-
canonicalId:
|
|
344
|
+
canonicalId: m.canonicalId || '',
|
|
597
345
|
});
|
|
598
346
|
|
|
599
|
-
// Add to files list
|
|
600
347
|
this.files.push({
|
|
601
348
|
type: 'agent',
|
|
602
|
-
name:
|
|
603
|
-
module:
|
|
349
|
+
name: m.name || entry.name,
|
|
350
|
+
module: agentModule,
|
|
604
351
|
path: installPath,
|
|
605
352
|
});
|
|
606
|
-
}
|
|
607
|
-
}
|
|
608
|
-
|
|
609
|
-
return agents;
|
|
610
|
-
}
|
|
611
|
-
|
|
612
|
-
/**
|
|
613
|
-
* Collect all tasks from core and selected modules
|
|
614
|
-
* Scans the INSTALLED bmad directory, not the source
|
|
615
|
-
*/
|
|
616
|
-
async collectTasks(selectedModules) {
|
|
617
|
-
this.tasks = [];
|
|
618
353
|
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
const tasksPath = path.join(this.bmadDir, moduleName, 'tasks');
|
|
622
|
-
|
|
623
|
-
if (await fs.pathExists(tasksPath)) {
|
|
624
|
-
const moduleTasks = await this.getTasksFromDir(tasksPath, moduleName);
|
|
625
|
-
this.tasks.push(...moduleTasks);
|
|
626
|
-
}
|
|
627
|
-
}
|
|
628
|
-
}
|
|
629
|
-
|
|
630
|
-
/**
|
|
631
|
-
* Get tasks from a directory
|
|
632
|
-
*/
|
|
633
|
-
async getTasksFromDir(dirPath, moduleName) {
|
|
634
|
-
// Skip directories claimed by collectSkills
|
|
635
|
-
if (this.skillClaimedDirs && this.skillClaimedDirs.has(dirPath)) return [];
|
|
636
|
-
const tasks = [];
|
|
637
|
-
const files = await fs.readdir(dirPath);
|
|
638
|
-
// Load skill manifest for this directory (if present)
|
|
639
|
-
const skillManifest = await this.loadSkillManifest(dirPath);
|
|
640
|
-
|
|
641
|
-
for (const file of files) {
|
|
642
|
-
// Check for both .xml and .md files
|
|
643
|
-
if (file.endsWith('.xml') || file.endsWith('.md')) {
|
|
644
|
-
const filePath = path.join(dirPath, file);
|
|
645
|
-
const content = await fs.readFile(filePath, 'utf8');
|
|
646
|
-
|
|
647
|
-
// Skip internal/engine files (not user-facing tasks)
|
|
648
|
-
if (content.includes('internal="true"')) {
|
|
649
|
-
continue;
|
|
354
|
+
if (debug) {
|
|
355
|
+
console.log(`[DEBUG] collectAgents: found type:agent "${m.name || entry.name}" at ${fullPath}`);
|
|
650
356
|
}
|
|
651
|
-
|
|
652
|
-
let name = file.replace(/\.(xml|md)$/, '');
|
|
653
|
-
let displayName = name;
|
|
654
|
-
let description = '';
|
|
655
|
-
let standalone = false;
|
|
656
|
-
|
|
657
|
-
if (file.endsWith('.md')) {
|
|
658
|
-
// Parse YAML frontmatter for .md tasks
|
|
659
|
-
const frontmatterMatch = content.match(/^---\r?\n([\s\S]*?)\r?\n---/);
|
|
660
|
-
if (frontmatterMatch) {
|
|
661
|
-
try {
|
|
662
|
-
const frontmatter = yaml.parse(frontmatterMatch[1]);
|
|
663
|
-
name = frontmatter.name || name;
|
|
664
|
-
displayName = frontmatter.displayName || frontmatter.name || name;
|
|
665
|
-
description = this.cleanForCSV(frontmatter.description || '');
|
|
666
|
-
// Tasks are standalone by default unless explicitly false (internal=true is already filtered above)
|
|
667
|
-
standalone = frontmatter.standalone !== false && frontmatter.standalone !== 'false';
|
|
668
|
-
} catch {
|
|
669
|
-
// If YAML parsing fails, use defaults
|
|
670
|
-
standalone = true; // Default to standalone
|
|
671
|
-
}
|
|
672
|
-
} else {
|
|
673
|
-
standalone = true; // No frontmatter means standalone
|
|
674
|
-
}
|
|
675
|
-
} else {
|
|
676
|
-
// For .xml tasks, extract from tag attributes
|
|
677
|
-
const nameMatch = content.match(/name="([^"]+)"/);
|
|
678
|
-
displayName = nameMatch ? nameMatch[1] : name;
|
|
679
|
-
|
|
680
|
-
const descMatch = content.match(/description="([^"]+)"/);
|
|
681
|
-
const objMatch = content.match(/<objective>([^<]+)<\/objective>/);
|
|
682
|
-
description = this.cleanForCSV(descMatch ? descMatch[1] : objMatch ? objMatch[1].trim() : '');
|
|
683
|
-
|
|
684
|
-
const standaloneFalseMatch = content.match(/<task[^>]+standalone="false"/);
|
|
685
|
-
standalone = !standaloneFalseMatch;
|
|
686
|
-
}
|
|
687
|
-
|
|
688
|
-
// Build relative path for installation
|
|
689
|
-
const installPath =
|
|
690
|
-
moduleName === 'core' ? `${this.bmadFolderName}/core/tasks/${file}` : `${this.bmadFolderName}/${moduleName}/tasks/${file}`;
|
|
691
|
-
|
|
692
|
-
tasks.push({
|
|
693
|
-
name: name,
|
|
694
|
-
displayName: displayName,
|
|
695
|
-
description: description,
|
|
696
|
-
module: moduleName,
|
|
697
|
-
path: installPath,
|
|
698
|
-
standalone: standalone,
|
|
699
|
-
canonicalId: this.getCanonicalId(skillManifest, file),
|
|
700
|
-
});
|
|
701
|
-
|
|
702
|
-
// Add to files list
|
|
703
|
-
this.files.push({
|
|
704
|
-
type: 'task',
|
|
705
|
-
name: name,
|
|
706
|
-
module: moduleName,
|
|
707
|
-
path: installPath,
|
|
708
|
-
});
|
|
357
|
+
continue;
|
|
709
358
|
}
|
|
710
|
-
}
|
|
711
|
-
|
|
712
|
-
return tasks;
|
|
713
|
-
}
|
|
714
|
-
|
|
715
|
-
/**
|
|
716
|
-
* Collect all tools from core and selected modules
|
|
717
|
-
* Scans the INSTALLED bmad directory, not the source
|
|
718
|
-
*/
|
|
719
|
-
async collectTools(selectedModules) {
|
|
720
|
-
this.tools = [];
|
|
721
359
|
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
360
|
+
// Skip directories claimed by collectSkills (non-agent type skills) —
|
|
361
|
+
// avoids recursing into skill trees that can't contain agents.
|
|
362
|
+
if (this.skillClaimedDirs && this.skillClaimedDirs.has(fullPath)) continue;
|
|
725
363
|
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
364
|
+
// Recurse into subdirectories
|
|
365
|
+
const newRelativePath = relativePath ? `${relativePath}/${entry.name}` : entry.name;
|
|
366
|
+
const subDirAgents = await this.getAgentsFromDirRecursive(fullPath, moduleName, newRelativePath, debug);
|
|
367
|
+
agents.push(...subDirAgents);
|
|
730
368
|
}
|
|
731
|
-
}
|
|
732
369
|
|
|
733
|
-
|
|
734
|
-
* Get tools from a directory
|
|
735
|
-
*/
|
|
736
|
-
async getToolsFromDir(dirPath, moduleName) {
|
|
737
|
-
// Skip directories claimed by collectSkills
|
|
738
|
-
if (this.skillClaimedDirs && this.skillClaimedDirs.has(dirPath)) return [];
|
|
739
|
-
const tools = [];
|
|
740
|
-
const files = await fs.readdir(dirPath);
|
|
741
|
-
// Load skill manifest for this directory (if present)
|
|
742
|
-
const skillManifest = await this.loadSkillManifest(dirPath);
|
|
743
|
-
|
|
744
|
-
for (const file of files) {
|
|
745
|
-
// Check for both .xml and .md files
|
|
746
|
-
if (file.endsWith('.xml') || file.endsWith('.md')) {
|
|
747
|
-
const filePath = path.join(dirPath, file);
|
|
748
|
-
const content = await fs.readFile(filePath, 'utf8');
|
|
749
|
-
|
|
750
|
-
// Skip internal tools (same as tasks)
|
|
751
|
-
if (content.includes('internal="true"')) {
|
|
752
|
-
continue;
|
|
753
|
-
}
|
|
754
|
-
|
|
755
|
-
let name = file.replace(/\.(xml|md)$/, '');
|
|
756
|
-
let displayName = name;
|
|
757
|
-
let description = '';
|
|
758
|
-
let standalone = false;
|
|
759
|
-
|
|
760
|
-
if (file.endsWith('.md')) {
|
|
761
|
-
// Parse YAML frontmatter for .md tools
|
|
762
|
-
const frontmatterMatch = content.match(/^---\r?\n([\s\S]*?)\r?\n---/);
|
|
763
|
-
if (frontmatterMatch) {
|
|
764
|
-
try {
|
|
765
|
-
const frontmatter = yaml.parse(frontmatterMatch[1]);
|
|
766
|
-
name = frontmatter.name || name;
|
|
767
|
-
displayName = frontmatter.displayName || frontmatter.name || name;
|
|
768
|
-
description = this.cleanForCSV(frontmatter.description || '');
|
|
769
|
-
// Tools are standalone by default unless explicitly false (internal=true is already filtered above)
|
|
770
|
-
standalone = frontmatter.standalone !== false && frontmatter.standalone !== 'false';
|
|
771
|
-
} catch {
|
|
772
|
-
// If YAML parsing fails, use defaults
|
|
773
|
-
standalone = true; // Default to standalone
|
|
774
|
-
}
|
|
775
|
-
} else {
|
|
776
|
-
standalone = true; // No frontmatter means standalone
|
|
777
|
-
}
|
|
778
|
-
} else {
|
|
779
|
-
// For .xml tools, extract from tag attributes
|
|
780
|
-
const nameMatch = content.match(/name="([^"]+)"/);
|
|
781
|
-
displayName = nameMatch ? nameMatch[1] : name;
|
|
782
|
-
|
|
783
|
-
const descMatch = content.match(/description="([^"]+)"/);
|
|
784
|
-
const objMatch = content.match(/<objective>([^<]+)<\/objective>/);
|
|
785
|
-
description = this.cleanForCSV(descMatch ? descMatch[1] : objMatch ? objMatch[1].trim() : '');
|
|
786
|
-
|
|
787
|
-
const standaloneFalseMatch = content.match(/<tool[^>]+standalone="false"/);
|
|
788
|
-
standalone = !standaloneFalseMatch;
|
|
789
|
-
}
|
|
790
|
-
|
|
791
|
-
// Build relative path for installation
|
|
792
|
-
const installPath =
|
|
793
|
-
moduleName === 'core' ? `${this.bmadFolderName}/core/tools/${file}` : `${this.bmadFolderName}/${moduleName}/tools/${file}`;
|
|
794
|
-
|
|
795
|
-
tools.push({
|
|
796
|
-
name: name,
|
|
797
|
-
displayName: displayName,
|
|
798
|
-
description: description,
|
|
799
|
-
module: moduleName,
|
|
800
|
-
path: installPath,
|
|
801
|
-
standalone: standalone,
|
|
802
|
-
canonicalId: this.getCanonicalId(skillManifest, file),
|
|
803
|
-
});
|
|
804
|
-
|
|
805
|
-
// Add to files list
|
|
806
|
-
this.files.push({
|
|
807
|
-
type: 'tool',
|
|
808
|
-
name: name,
|
|
809
|
-
module: moduleName,
|
|
810
|
-
path: installPath,
|
|
811
|
-
});
|
|
812
|
-
}
|
|
813
|
-
}
|
|
814
|
-
|
|
815
|
-
return tools;
|
|
370
|
+
return agents;
|
|
816
371
|
}
|
|
817
372
|
|
|
818
373
|
/**
|
|
@@ -900,131 +455,6 @@ class ManifestGenerator {
|
|
|
900
455
|
return manifestPath;
|
|
901
456
|
}
|
|
902
457
|
|
|
903
|
-
/**
|
|
904
|
-
* Read existing CSV and preserve rows for modules NOT being updated
|
|
905
|
-
* @param {string} csvPath - Path to existing CSV file
|
|
906
|
-
* @param {number} moduleColumnIndex - Which column contains the module name (0-indexed)
|
|
907
|
-
* @param {Array<string>} expectedColumns - Expected column names in order
|
|
908
|
-
* @param {Object} defaultValues - Default values for missing columns
|
|
909
|
-
* @returns {Array} Preserved CSV rows (without header), upgraded to match expected columns
|
|
910
|
-
*/
|
|
911
|
-
async getPreservedCsvRows(csvPath, moduleColumnIndex, expectedColumns, defaultValues = {}) {
|
|
912
|
-
if (!(await fs.pathExists(csvPath)) || this.preservedModules.length === 0) {
|
|
913
|
-
return [];
|
|
914
|
-
}
|
|
915
|
-
|
|
916
|
-
try {
|
|
917
|
-
const content = await fs.readFile(csvPath, 'utf8');
|
|
918
|
-
const lines = content.trim().split('\n');
|
|
919
|
-
|
|
920
|
-
if (lines.length < 2) {
|
|
921
|
-
return []; // No data rows
|
|
922
|
-
}
|
|
923
|
-
|
|
924
|
-
// Parse header to understand old schema
|
|
925
|
-
const header = lines[0];
|
|
926
|
-
const headerColumns = header.match(/(".*?"|[^",\s]+)(?=\s*,|\s*$)/g) || [];
|
|
927
|
-
const oldColumns = headerColumns.map((c) => c.replaceAll(/^"|"$/g, ''));
|
|
928
|
-
|
|
929
|
-
// Skip header row for data
|
|
930
|
-
const dataRows = lines.slice(1);
|
|
931
|
-
const preservedRows = [];
|
|
932
|
-
|
|
933
|
-
for (const row of dataRows) {
|
|
934
|
-
// Simple CSV parsing (handles quoted values)
|
|
935
|
-
const columns = row.match(/(".*?"|[^",\s]+)(?=\s*,|\s*$)/g) || [];
|
|
936
|
-
const cleanColumns = columns.map((c) => c.replaceAll(/^"|"$/g, ''));
|
|
937
|
-
|
|
938
|
-
const moduleValue = cleanColumns[moduleColumnIndex];
|
|
939
|
-
|
|
940
|
-
// Keep this row if it belongs to a preserved module
|
|
941
|
-
if (this.preservedModules.includes(moduleValue)) {
|
|
942
|
-
// Upgrade row to match expected schema
|
|
943
|
-
const upgradedRow = this.upgradeRowToSchema(cleanColumns, oldColumns, expectedColumns, defaultValues);
|
|
944
|
-
preservedRows.push(upgradedRow);
|
|
945
|
-
}
|
|
946
|
-
}
|
|
947
|
-
|
|
948
|
-
return preservedRows;
|
|
949
|
-
} catch (error) {
|
|
950
|
-
await prompts.log.warn(`Failed to read existing CSV ${csvPath}: ${error.message}`);
|
|
951
|
-
return [];
|
|
952
|
-
}
|
|
953
|
-
}
|
|
954
|
-
|
|
955
|
-
/**
|
|
956
|
-
* Upgrade a CSV row from old schema to new schema
|
|
957
|
-
* @param {Array<string>} rowValues - Values from old row
|
|
958
|
-
* @param {Array<string>} oldColumns - Old column names
|
|
959
|
-
* @param {Array<string>} newColumns - New column names
|
|
960
|
-
* @param {Object} defaultValues - Default values for missing columns
|
|
961
|
-
* @returns {string} Upgraded CSV row
|
|
962
|
-
*/
|
|
963
|
-
upgradeRowToSchema(rowValues, oldColumns, newColumns, defaultValues) {
|
|
964
|
-
const upgradedValues = [];
|
|
965
|
-
|
|
966
|
-
for (const newCol of newColumns) {
|
|
967
|
-
const oldIndex = oldColumns.indexOf(newCol);
|
|
968
|
-
|
|
969
|
-
if (oldIndex !== -1 && oldIndex < rowValues.length) {
|
|
970
|
-
// Column exists in old schema, use its value
|
|
971
|
-
upgradedValues.push(rowValues[oldIndex]);
|
|
972
|
-
} else if (defaultValues[newCol] === undefined) {
|
|
973
|
-
// Column missing, no default provided
|
|
974
|
-
upgradedValues.push('');
|
|
975
|
-
} else {
|
|
976
|
-
// Column missing, use default value
|
|
977
|
-
upgradedValues.push(defaultValues[newCol]);
|
|
978
|
-
}
|
|
979
|
-
}
|
|
980
|
-
|
|
981
|
-
// Properly quote values and join
|
|
982
|
-
return upgradedValues.map((v) => `"${v}"`).join(',');
|
|
983
|
-
}
|
|
984
|
-
|
|
985
|
-
/**
|
|
986
|
-
* Write workflow manifest CSV
|
|
987
|
-
* @returns {string} Path to the manifest file
|
|
988
|
-
*/
|
|
989
|
-
async writeWorkflowManifest(cfgDir) {
|
|
990
|
-
const csvPath = path.join(cfgDir, 'workflow-manifest.csv');
|
|
991
|
-
const escapeCsv = (value) => `"${String(value ?? '').replaceAll('"', '""')}"`;
|
|
992
|
-
|
|
993
|
-
// Create CSV header - standalone column removed, canonicalId added as optional column
|
|
994
|
-
let csv = 'name,description,module,path,canonicalId\n';
|
|
995
|
-
|
|
996
|
-
// Build workflows map from discovered workflows only
|
|
997
|
-
// Old entries are NOT preserved - the manifest reflects what actually exists on disk
|
|
998
|
-
const allWorkflows = new Map();
|
|
999
|
-
|
|
1000
|
-
// Only add workflows that were actually discovered in this scan
|
|
1001
|
-
for (const workflow of this.workflows) {
|
|
1002
|
-
const key = `${workflow.module}:${workflow.name}`;
|
|
1003
|
-
allWorkflows.set(key, {
|
|
1004
|
-
name: workflow.name,
|
|
1005
|
-
description: workflow.description,
|
|
1006
|
-
module: workflow.module,
|
|
1007
|
-
path: workflow.path,
|
|
1008
|
-
canonicalId: workflow.canonicalId || '',
|
|
1009
|
-
});
|
|
1010
|
-
}
|
|
1011
|
-
|
|
1012
|
-
// Write all workflows
|
|
1013
|
-
for (const [, value] of allWorkflows) {
|
|
1014
|
-
const row = [
|
|
1015
|
-
escapeCsv(value.name),
|
|
1016
|
-
escapeCsv(value.description),
|
|
1017
|
-
escapeCsv(value.module),
|
|
1018
|
-
escapeCsv(value.path),
|
|
1019
|
-
escapeCsv(value.canonicalId),
|
|
1020
|
-
].join(',');
|
|
1021
|
-
csv += row + '\n';
|
|
1022
|
-
}
|
|
1023
|
-
|
|
1024
|
-
await fs.writeFile(csvPath, csv);
|
|
1025
|
-
return csvPath;
|
|
1026
|
-
}
|
|
1027
|
-
|
|
1028
458
|
/**
|
|
1029
459
|
* Write skill manifest CSV
|
|
1030
460
|
* @returns {string} Path to the manifest file
|
|
@@ -1125,134 +555,6 @@ class ManifestGenerator {
|
|
|
1125
555
|
return csvPath;
|
|
1126
556
|
}
|
|
1127
557
|
|
|
1128
|
-
/**
|
|
1129
|
-
* Write task manifest CSV
|
|
1130
|
-
* @returns {string} Path to the manifest file
|
|
1131
|
-
*/
|
|
1132
|
-
async writeTaskManifest(cfgDir) {
|
|
1133
|
-
const csvPath = path.join(cfgDir, 'task-manifest.csv');
|
|
1134
|
-
const escapeCsv = (value) => `"${String(value ?? '').replaceAll('"', '""')}"`;
|
|
1135
|
-
|
|
1136
|
-
// Read existing manifest to preserve entries
|
|
1137
|
-
const existingEntries = new Map();
|
|
1138
|
-
if (await fs.pathExists(csvPath)) {
|
|
1139
|
-
const content = await fs.readFile(csvPath, 'utf8');
|
|
1140
|
-
const records = csv.parse(content, {
|
|
1141
|
-
columns: true,
|
|
1142
|
-
skip_empty_lines: true,
|
|
1143
|
-
});
|
|
1144
|
-
for (const record of records) {
|
|
1145
|
-
existingEntries.set(`${record.module}:${record.name}`, record);
|
|
1146
|
-
}
|
|
1147
|
-
}
|
|
1148
|
-
|
|
1149
|
-
// Create CSV header with standalone and canonicalId columns
|
|
1150
|
-
let csvContent = 'name,displayName,description,module,path,standalone,canonicalId\n';
|
|
1151
|
-
|
|
1152
|
-
// Combine existing and new tasks
|
|
1153
|
-
const allTasks = new Map();
|
|
1154
|
-
|
|
1155
|
-
// Add existing entries
|
|
1156
|
-
for (const [key, value] of existingEntries) {
|
|
1157
|
-
allTasks.set(key, value);
|
|
1158
|
-
}
|
|
1159
|
-
|
|
1160
|
-
// Add/update new tasks
|
|
1161
|
-
for (const task of this.tasks) {
|
|
1162
|
-
const key = `${task.module}:${task.name}`;
|
|
1163
|
-
allTasks.set(key, {
|
|
1164
|
-
name: task.name,
|
|
1165
|
-
displayName: task.displayName,
|
|
1166
|
-
description: task.description,
|
|
1167
|
-
module: task.module,
|
|
1168
|
-
path: task.path,
|
|
1169
|
-
standalone: task.standalone,
|
|
1170
|
-
canonicalId: task.canonicalId || '',
|
|
1171
|
-
});
|
|
1172
|
-
}
|
|
1173
|
-
|
|
1174
|
-
// Write all tasks
|
|
1175
|
-
for (const [, record] of allTasks) {
|
|
1176
|
-
const row = [
|
|
1177
|
-
escapeCsv(record.name),
|
|
1178
|
-
escapeCsv(record.displayName),
|
|
1179
|
-
escapeCsv(record.description),
|
|
1180
|
-
escapeCsv(record.module),
|
|
1181
|
-
escapeCsv(record.path),
|
|
1182
|
-
escapeCsv(record.standalone),
|
|
1183
|
-
escapeCsv(record.canonicalId),
|
|
1184
|
-
].join(',');
|
|
1185
|
-
csvContent += row + '\n';
|
|
1186
|
-
}
|
|
1187
|
-
|
|
1188
|
-
await fs.writeFile(csvPath, csvContent);
|
|
1189
|
-
return csvPath;
|
|
1190
|
-
}
|
|
1191
|
-
|
|
1192
|
-
/**
|
|
1193
|
-
* Write tool manifest CSV
|
|
1194
|
-
* @returns {string} Path to the manifest file
|
|
1195
|
-
*/
|
|
1196
|
-
async writeToolManifest(cfgDir) {
|
|
1197
|
-
const csvPath = path.join(cfgDir, 'tool-manifest.csv');
|
|
1198
|
-
const escapeCsv = (value) => `"${String(value ?? '').replaceAll('"', '""')}"`;
|
|
1199
|
-
|
|
1200
|
-
// Read existing manifest to preserve entries
|
|
1201
|
-
const existingEntries = new Map();
|
|
1202
|
-
if (await fs.pathExists(csvPath)) {
|
|
1203
|
-
const content = await fs.readFile(csvPath, 'utf8');
|
|
1204
|
-
const records = csv.parse(content, {
|
|
1205
|
-
columns: true,
|
|
1206
|
-
skip_empty_lines: true,
|
|
1207
|
-
});
|
|
1208
|
-
for (const record of records) {
|
|
1209
|
-
existingEntries.set(`${record.module}:${record.name}`, record);
|
|
1210
|
-
}
|
|
1211
|
-
}
|
|
1212
|
-
|
|
1213
|
-
// Create CSV header with standalone and canonicalId columns
|
|
1214
|
-
let csvContent = 'name,displayName,description,module,path,standalone,canonicalId\n';
|
|
1215
|
-
|
|
1216
|
-
// Combine existing and new tools
|
|
1217
|
-
const allTools = new Map();
|
|
1218
|
-
|
|
1219
|
-
// Add existing entries
|
|
1220
|
-
for (const [key, value] of existingEntries) {
|
|
1221
|
-
allTools.set(key, value);
|
|
1222
|
-
}
|
|
1223
|
-
|
|
1224
|
-
// Add/update new tools
|
|
1225
|
-
for (const tool of this.tools) {
|
|
1226
|
-
const key = `${tool.module}:${tool.name}`;
|
|
1227
|
-
allTools.set(key, {
|
|
1228
|
-
name: tool.name,
|
|
1229
|
-
displayName: tool.displayName,
|
|
1230
|
-
description: tool.description,
|
|
1231
|
-
module: tool.module,
|
|
1232
|
-
path: tool.path,
|
|
1233
|
-
standalone: tool.standalone,
|
|
1234
|
-
canonicalId: tool.canonicalId || '',
|
|
1235
|
-
});
|
|
1236
|
-
}
|
|
1237
|
-
|
|
1238
|
-
// Write all tools
|
|
1239
|
-
for (const [, record] of allTools) {
|
|
1240
|
-
const row = [
|
|
1241
|
-
escapeCsv(record.name),
|
|
1242
|
-
escapeCsv(record.displayName),
|
|
1243
|
-
escapeCsv(record.description),
|
|
1244
|
-
escapeCsv(record.module),
|
|
1245
|
-
escapeCsv(record.path),
|
|
1246
|
-
escapeCsv(record.standalone),
|
|
1247
|
-
escapeCsv(record.canonicalId),
|
|
1248
|
-
].join(',');
|
|
1249
|
-
csvContent += row + '\n';
|
|
1250
|
-
}
|
|
1251
|
-
|
|
1252
|
-
await fs.writeFile(csvPath, csvContent);
|
|
1253
|
-
return csvPath;
|
|
1254
|
-
}
|
|
1255
|
-
|
|
1256
558
|
/**
|
|
1257
559
|
* Write files manifest CSV
|
|
1258
560
|
*/
|
|
@@ -1352,21 +654,12 @@ class ManifestGenerator {
|
|
|
1352
654
|
continue;
|
|
1353
655
|
}
|
|
1354
656
|
|
|
1355
|
-
// Check if this looks like a module (has agents
|
|
657
|
+
// Check if this looks like a module (has agents directory or skill manifests)
|
|
1356
658
|
const modulePath = path.join(bmadDir, entry.name);
|
|
1357
659
|
const hasAgents = await fs.pathExists(path.join(modulePath, 'agents'));
|
|
1358
|
-
const
|
|
1359
|
-
const hasTasks = await fs.pathExists(path.join(modulePath, 'tasks'));
|
|
1360
|
-
const hasTools = await fs.pathExists(path.join(modulePath, 'tools'));
|
|
1361
|
-
|
|
1362
|
-
// Check for skill-only modules: recursive scan for bmad-skill-manifest.yaml with type: skill
|
|
1363
|
-
let hasSkills = false;
|
|
1364
|
-
if (!hasAgents && !hasWorkflows && !hasTasks && !hasTools) {
|
|
1365
|
-
hasSkills = await this._hasSkillManifestRecursive(modulePath);
|
|
1366
|
-
}
|
|
660
|
+
const hasSkills = await this._hasSkillMdRecursive(modulePath);
|
|
1367
661
|
|
|
1368
|
-
|
|
1369
|
-
if (hasAgents || hasWorkflows || hasTasks || hasTools || hasSkills) {
|
|
662
|
+
if (hasAgents || hasSkills) {
|
|
1370
663
|
modules.push(entry.name);
|
|
1371
664
|
}
|
|
1372
665
|
}
|
|
@@ -1378,12 +671,12 @@ class ManifestGenerator {
|
|
|
1378
671
|
}
|
|
1379
672
|
|
|
1380
673
|
/**
|
|
1381
|
-
* Recursively check if a directory tree contains a
|
|
674
|
+
* Recursively check if a directory tree contains a SKILL.md file.
|
|
1382
675
|
* Skips directories starting with . or _.
|
|
1383
676
|
* @param {string} dir - Directory to search
|
|
1384
|
-
* @returns {boolean} True if a
|
|
677
|
+
* @returns {boolean} True if a SKILL.md is found
|
|
1385
678
|
*/
|
|
1386
|
-
async
|
|
679
|
+
async _hasSkillMdRecursive(dir) {
|
|
1387
680
|
let entries;
|
|
1388
681
|
try {
|
|
1389
682
|
entries = await fs.readdir(dir, { withFileTypes: true });
|
|
@@ -1391,18 +684,14 @@ class ManifestGenerator {
|
|
|
1391
684
|
return false;
|
|
1392
685
|
}
|
|
1393
686
|
|
|
1394
|
-
// Check for
|
|
1395
|
-
|
|
1396
|
-
if (manifest) {
|
|
1397
|
-
const type = this.getArtifactType(manifest, 'workflow.md');
|
|
1398
|
-
if (type === 'skill') return true;
|
|
1399
|
-
}
|
|
687
|
+
// Check for SKILL.md in this directory
|
|
688
|
+
if (entries.some((e) => !e.isDirectory() && e.name === 'SKILL.md')) return true;
|
|
1400
689
|
|
|
1401
690
|
// Recurse into subdirectories
|
|
1402
691
|
for (const entry of entries) {
|
|
1403
692
|
if (!entry.isDirectory()) continue;
|
|
1404
693
|
if (entry.name.startsWith('.') || entry.name.startsWith('_')) continue;
|
|
1405
|
-
if (await this.
|
|
694
|
+
if (await this._hasSkillMdRecursive(path.join(dir, entry.name))) return true;
|
|
1406
695
|
}
|
|
1407
696
|
|
|
1408
697
|
return false;
|