bmad-method 6.2.1-next.3 → 6.2.1-next.30
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/package.json +4 -6
- package/src/{bmm/agents → bmm-skills/1-analysis}/bmad-agent-analyst/SKILL.md +15 -17
- package/src/{bmm/agents → bmm-skills/1-analysis}/bmad-agent-analyst/bmad-skill-manifest.yaml +2 -3
- package/src/{bmm/agents → bmm-skills/1-analysis}/bmad-agent-tech-writer/SKILL.md +13 -16
- package/src/{bmm/agents → bmm-skills/1-analysis}/bmad-agent-tech-writer/bmad-skill-manifest.yaml +2 -3
- 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/SKILL.md +14 -16
- package/src/{bmm/agents → bmm-skills/2-plan-workflows}/bmad-agent-pm/bmad-skill-manifest.yaml +2 -3
- package/src/{bmm/agents → bmm-skills/2-plan-workflows}/bmad-agent-ux-designer/SKILL.md +9 -16
- package/src/{bmm/agents → bmm-skills/2-plan-workflows}/bmad-agent-ux-designer/bmad-skill-manifest.yaml +2 -3
- 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/SKILL.md +10 -16
- package/src/{bmm/agents → bmm-skills/3-solutioning}/bmad-agent-architect/bmad-skill-manifest.yaml +2 -3
- package/src/{bmm/agents → bmm-skills/4-implementation}/bmad-agent-dev/SKILL.md +10 -16
- package/src/{bmm/agents → bmm-skills/4-implementation}/bmad-agent-dev/bmad-skill-manifest.yaml +2 -3
- package/src/{bmm/agents → bmm-skills/4-implementation}/bmad-agent-qa/SKILL.md +9 -16
- package/src/{bmm/agents → bmm-skills/4-implementation}/bmad-agent-qa/bmad-skill-manifest.yaml +2 -3
- package/src/{bmm/agents → bmm-skills/4-implementation}/bmad-agent-quick-flow-solo-dev/SKILL.md +10 -16
- package/src/{bmm/agents → bmm-skills/4-implementation}/bmad-agent-quick-flow-solo-dev/bmad-skill-manifest.yaml +2 -3
- package/src/{bmm/agents → bmm-skills/4-implementation}/bmad-agent-sm/SKILL.md +12 -16
- package/src/{bmm/agents → bmm-skills/4-implementation}/bmad-agent-sm/bmad-skill-manifest.yaml +2 -3
- 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/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 → bmm-skills/4-implementation/bmad-quick-dev}/step-01-clarify-and-route.md +12 -13
- package/src/{bmm/workflows/bmad-quick-flow/bmad-quick-dev-new-preview → bmm-skills/4-implementation/bmad-quick-dev}/step-02-plan.md +1 -1
- package/src/{bmm/workflows/bmad-quick-flow/bmad-quick-dev-new-preview → bmm-skills/4-implementation/bmad-quick-dev}/step-03-implement.md +3 -3
- package/src/{bmm/workflows/bmad-quick-flow/bmad-quick-dev-new-preview → bmm-skills/4-implementation/bmad-quick-dev}/step-04-review.md +5 -6
- package/src/bmm-skills/4-implementation/bmad-quick-dev/step-05-present.md +63 -0
- package/src/bmm-skills/4-implementation/bmad-quick-dev/step-oneshot.md +49 -0
- package/src/{bmm/workflows/bmad-quick-flow/bmad-quick-dev-new-preview → bmm-skills/4-implementation/bmad-quick-dev}/workflow.md +2 -2
- package/src/{bmm → bmm-skills}/module-help.csv +3 -5
- 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/workflow.md → core-skills/bmad-help/SKILL.md} +5 -1
- 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/tools/cli/commands/install.js +1 -8
- 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 +62 -723
- 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/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/agents/bmad-agent-analyst/bmad-manifest.json +0 -44
- package/src/bmm/agents/bmad-agent-architect/bmad-manifest.json +0 -20
- package/src/bmm/agents/bmad-agent-dev/bmad-manifest.json +0 -20
- package/src/bmm/agents/bmad-agent-pm/bmad-manifest.json +0 -44
- package/src/bmm/agents/bmad-agent-qa/bmad-manifest.json +0 -14
- package/src/bmm/agents/bmad-agent-quick-flow-solo-dev/bmad-manifest.json +0 -32
- package/src/bmm/agents/bmad-agent-sm/bmad-manifest.json +0 -32
- package/src/bmm/agents/bmad-agent-tech-writer/bmad-manifest.json +0 -38
- package/src/bmm/agents/bmad-agent-ux-designer/bmad-manifest.json +0 -14
- package/src/bmm/agents/bmad-skill-manifest.yaml +0 -39
- package/src/bmm/data/project-context-template.md +0 -26
- package/src/bmm/teams/default-party.csv +0 -20
- package/src/bmm/teams/team-fullstack.yaml +0 -12
- 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-dev-new-preview/step-05-present.md +0 -17
- 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/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-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-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/{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/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/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-correct-course/workflow.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}/tech-spec-template.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-help.csv +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
|
|
|
@@ -309,153 +267,6 @@ class ManifestGenerator {
|
|
|
309
267
|
}
|
|
310
268
|
}
|
|
311
269
|
|
|
312
|
-
/**
|
|
313
|
-
* Collect all workflows from core and selected modules
|
|
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
270
|
/**
|
|
460
271
|
* Collect all agents from core and selected modules
|
|
461
272
|
* Scans the INSTALLED bmad directory, not the source
|
|
@@ -490,7 +301,7 @@ class ManifestGenerator {
|
|
|
490
301
|
|
|
491
302
|
/**
|
|
492
303
|
* Get agents from a directory recursively
|
|
493
|
-
* Only includes
|
|
304
|
+
* Only includes .md files with agent content
|
|
494
305
|
*/
|
|
495
306
|
async getAgentsFromDir(dirPath, moduleName, relativePath = '') {
|
|
496
307
|
// Skip directories claimed by collectSkills
|
|
@@ -547,7 +358,7 @@ class ManifestGenerator {
|
|
|
547
358
|
const newRelativePath = relativePath ? `${relativePath}/${entry.name}` : entry.name;
|
|
548
359
|
const subDirAgents = await this.getAgentsFromDir(fullPath, moduleName, newRelativePath);
|
|
549
360
|
agents.push(...subDirAgents);
|
|
550
|
-
} else if (entry.name.endsWith('.md') &&
|
|
361
|
+
} else if (entry.name.endsWith('.md') && entry.name.toLowerCase() !== 'readme.md') {
|
|
551
362
|
const content = await fs.readFile(fullPath, 'utf8');
|
|
552
363
|
|
|
553
364
|
// Skip files that don't contain <agent> tag (e.g., README files)
|
|
@@ -609,212 +420,6 @@ class ManifestGenerator {
|
|
|
609
420
|
return agents;
|
|
610
421
|
}
|
|
611
422
|
|
|
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
|
-
|
|
619
|
-
// Use updatedModules which already includes deduplicated 'core' + selectedModules
|
|
620
|
-
for (const moduleName of this.updatedModules) {
|
|
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;
|
|
650
|
-
}
|
|
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
|
-
});
|
|
709
|
-
}
|
|
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
|
-
|
|
722
|
-
// Use updatedModules which already includes deduplicated 'core' + selectedModules
|
|
723
|
-
for (const moduleName of this.updatedModules) {
|
|
724
|
-
const toolsPath = path.join(this.bmadDir, moduleName, 'tools');
|
|
725
|
-
|
|
726
|
-
if (await fs.pathExists(toolsPath)) {
|
|
727
|
-
const moduleTools = await this.getToolsFromDir(toolsPath, moduleName);
|
|
728
|
-
this.tools.push(...moduleTools);
|
|
729
|
-
}
|
|
730
|
-
}
|
|
731
|
-
}
|
|
732
|
-
|
|
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;
|
|
816
|
-
}
|
|
817
|
-
|
|
818
423
|
/**
|
|
819
424
|
* Write main manifest as YAML with installation info only
|
|
820
425
|
* Fetches fresh version info for all modules
|
|
@@ -900,131 +505,6 @@ class ManifestGenerator {
|
|
|
900
505
|
return manifestPath;
|
|
901
506
|
}
|
|
902
507
|
|
|
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
508
|
/**
|
|
1029
509
|
* Write skill manifest CSV
|
|
1030
510
|
* @returns {string} Path to the manifest file
|
|
@@ -1125,134 +605,6 @@ class ManifestGenerator {
|
|
|
1125
605
|
return csvPath;
|
|
1126
606
|
}
|
|
1127
607
|
|
|
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
608
|
/**
|
|
1257
609
|
* Write files manifest CSV
|
|
1258
610
|
*/
|
|
@@ -1352,21 +704,12 @@ class ManifestGenerator {
|
|
|
1352
704
|
continue;
|
|
1353
705
|
}
|
|
1354
706
|
|
|
1355
|
-
// Check if this looks like a module (has agents
|
|
707
|
+
// Check if this looks like a module (has agents directory or skill manifests)
|
|
1356
708
|
const modulePath = path.join(bmadDir, entry.name);
|
|
1357
709
|
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
|
-
}
|
|
710
|
+
const hasSkills = await this._hasSkillMdRecursive(modulePath);
|
|
1367
711
|
|
|
1368
|
-
|
|
1369
|
-
if (hasAgents || hasWorkflows || hasTasks || hasTools || hasSkills) {
|
|
712
|
+
if (hasAgents || hasSkills) {
|
|
1370
713
|
modules.push(entry.name);
|
|
1371
714
|
}
|
|
1372
715
|
}
|
|
@@ -1378,12 +721,12 @@ class ManifestGenerator {
|
|
|
1378
721
|
}
|
|
1379
722
|
|
|
1380
723
|
/**
|
|
1381
|
-
* Recursively check if a directory tree contains a
|
|
724
|
+
* Recursively check if a directory tree contains a SKILL.md file.
|
|
1382
725
|
* Skips directories starting with . or _.
|
|
1383
726
|
* @param {string} dir - Directory to search
|
|
1384
|
-
* @returns {boolean} True if a
|
|
727
|
+
* @returns {boolean} True if a SKILL.md is found
|
|
1385
728
|
*/
|
|
1386
|
-
async
|
|
729
|
+
async _hasSkillMdRecursive(dir) {
|
|
1387
730
|
let entries;
|
|
1388
731
|
try {
|
|
1389
732
|
entries = await fs.readdir(dir, { withFileTypes: true });
|
|
@@ -1391,18 +734,14 @@ class ManifestGenerator {
|
|
|
1391
734
|
return false;
|
|
1392
735
|
}
|
|
1393
736
|
|
|
1394
|
-
// Check for
|
|
1395
|
-
|
|
1396
|
-
if (manifest) {
|
|
1397
|
-
const type = this.getArtifactType(manifest, 'workflow.md');
|
|
1398
|
-
if (type === 'skill') return true;
|
|
1399
|
-
}
|
|
737
|
+
// Check for SKILL.md in this directory
|
|
738
|
+
if (entries.some((e) => !e.isDirectory() && e.name === 'SKILL.md')) return true;
|
|
1400
739
|
|
|
1401
740
|
// Recurse into subdirectories
|
|
1402
741
|
for (const entry of entries) {
|
|
1403
742
|
if (!entry.isDirectory()) continue;
|
|
1404
743
|
if (entry.name.startsWith('.') || entry.name.startsWith('_')) continue;
|
|
1405
|
-
if (await this.
|
|
744
|
+
if (await this._hasSkillMdRecursive(path.join(dir, entry.name))) return true;
|
|
1406
745
|
}
|
|
1407
746
|
|
|
1408
747
|
return false;
|