bmad-method-quarkus 1.0.0

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