bmad-method 5.0.0 → 5.0.1

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 (329) hide show
  1. package/.github/FUNDING.yaml +15 -0
  2. package/.github/ISSUE_TEMPLATE/bug_report.md +32 -0
  3. package/.github/ISSUE_TEMPLATE/feature_request.md +22 -0
  4. package/.github/workflows/discord.yaml +25 -0
  5. package/.github/workflows/format-check.yaml +42 -0
  6. package/.github/workflows/manual-release.yaml +173 -0
  7. package/.husky/pre-commit +3 -2
  8. package/.vscode/settings.json +67 -74
  9. package/CHANGELOG.md +564 -19
  10. package/CONTRIBUTING.md +168 -5
  11. package/LICENSE +1 -1
  12. package/README.md +146 -218
  13. package/bmad-core/agent-teams/team-all.yaml +14 -0
  14. package/bmad-core/agent-teams/team-fullstack.yaml +18 -0
  15. package/bmad-core/agent-teams/team-ide-minimal.yaml +10 -0
  16. package/bmad-core/agent-teams/team-no-ui.yaml +13 -0
  17. package/bmad-core/agents/analyst.md +81 -0
  18. package/bmad-core/agents/architect.md +83 -0
  19. package/bmad-core/agents/bmad-master.md +107 -0
  20. package/bmad-core/agents/bmad-orchestrator.md +149 -0
  21. package/bmad-core/agents/dev.md +75 -0
  22. package/bmad-core/agents/pm.md +81 -0
  23. package/bmad-core/agents/po.md +76 -0
  24. package/bmad-core/agents/qa.md +88 -0
  25. package/bmad-core/agents/sm.md +62 -0
  26. package/bmad-core/agents/ux-expert.md +66 -0
  27. package/{.bmad-core → bmad-core}/checklists/architect-checklist.md +0 -5
  28. package/{.bmad-core → bmad-core}/checklists/change-checklist.md +2 -2
  29. package/{.bmad-core → bmad-core}/checklists/pm-checklist.md +0 -5
  30. package/{.bmad-core → bmad-core}/checklists/po-master-checklist.md +0 -9
  31. package/{.bmad-core → bmad-core}/checklists/story-dod-checklist.md +0 -7
  32. package/{.bmad-core → bmad-core}/checklists/story-draft-checklist.md +1 -4
  33. package/bmad-core/core-config.yaml +20 -0
  34. package/bmad-core/data/bmad-kb.md +806 -0
  35. package/bmad-core/data/brainstorming-techniques.md +36 -0
  36. package/bmad-core/data/elicitation-methods.md +154 -0
  37. package/bmad-core/data/test-levels-framework.md +146 -0
  38. package/bmad-core/data/test-priorities-matrix.md +172 -0
  39. package/bmad-core/tasks/advanced-elicitation.md +117 -0
  40. package/{.bmad-core → bmad-core}/tasks/correct-course.md +9 -12
  41. package/bmad-core/tasks/create-brownfield-story.md +312 -0
  42. package/{.bmad-core → bmad-core}/tasks/create-deep-research-prompt.md +4 -27
  43. package/bmad-core/tasks/create-next-story.md +112 -0
  44. package/bmad-core/tasks/document-project.md +343 -0
  45. package/bmad-core/tasks/facilitate-brainstorming-session.md +136 -0
  46. package/bmad-core/tasks/generate-ai-frontend-prompt.md +51 -0
  47. package/{.bmad-core → bmad-core}/tasks/index-docs.md +3 -13
  48. package/bmad-core/tasks/kb-mode-interaction.md +75 -0
  49. package/bmad-core/tasks/nfr-assess.md +343 -0
  50. package/bmad-core/tasks/qa-gate.md +159 -0
  51. package/bmad-core/tasks/review-story.md +314 -0
  52. package/bmad-core/tasks/risk-profile.md +353 -0
  53. package/{.bmad-core → bmad-core}/tasks/shard-doc.md +27 -15
  54. package/bmad-core/tasks/test-design.md +174 -0
  55. package/bmad-core/tasks/trace-requirements.md +264 -0
  56. package/bmad-core/tasks/validate-next-story.md +134 -0
  57. package/bmad-core/templates/architecture-tmpl.yaml +650 -0
  58. package/bmad-core/templates/brainstorming-output-tmpl.yaml +156 -0
  59. package/bmad-core/templates/brownfield-architecture-tmpl.yaml +476 -0
  60. package/bmad-core/templates/brownfield-prd-tmpl.yaml +280 -0
  61. package/bmad-core/templates/competitor-analysis-tmpl.yaml +306 -0
  62. package/bmad-core/templates/front-end-architecture-tmpl.yaml +218 -0
  63. package/bmad-core/templates/front-end-spec-tmpl.yaml +349 -0
  64. package/bmad-core/templates/fullstack-architecture-tmpl.yaml +823 -0
  65. package/bmad-core/templates/market-research-tmpl.yaml +252 -0
  66. package/bmad-core/templates/prd-tmpl.yaml +202 -0
  67. package/bmad-core/templates/project-brief-tmpl.yaml +221 -0
  68. package/bmad-core/templates/qa-gate-tmpl.yaml +102 -0
  69. package/bmad-core/templates/story-tmpl.yaml +137 -0
  70. package/bmad-core/workflows/brownfield-fullstack.yaml +297 -0
  71. package/bmad-core/workflows/brownfield-service.yaml +187 -0
  72. package/bmad-core/workflows/brownfield-ui.yaml +197 -0
  73. package/{.bmad-core/workflows/greenfield-fullstack.yml → bmad-core/workflows/greenfield-fullstack.yaml} +140 -77
  74. package/bmad-core/workflows/greenfield-service.yaml +206 -0
  75. package/bmad-core/workflows/greenfield-ui.yaml +235 -0
  76. package/common/tasks/create-doc.md +101 -0
  77. package/{.bmad-core → common}/tasks/execute-checklist.md +2 -13
  78. package/common/utils/bmad-doc-template.md +325 -0
  79. package/common/utils/workflow-management.md +69 -0
  80. package/dist/agents/analyst.txt +2889 -0
  81. package/dist/agents/architect.txt +3552 -0
  82. package/dist/agents/bmad-master.txt +8769 -0
  83. package/dist/agents/bmad-orchestrator.txt +1513 -0
  84. package/dist/agents/dev.txt +414 -0
  85. package/{.bmad-core/web-bundles → dist}/agents/pm.txt +668 -1119
  86. package/{.bmad-core/web-bundles → dist}/agents/po.txt +341 -484
  87. package/dist/agents/qa.txt +1987 -0
  88. package/dist/agents/sm.txt +658 -0
  89. package/dist/agents/ux-expert.txt +694 -0
  90. package/dist/expansion-packs/bmad-2d-phaser-game-dev/agents/game-designer.txt +2371 -0
  91. package/dist/expansion-packs/bmad-2d-phaser-game-dev/agents/game-developer.txt +1620 -0
  92. package/dist/expansion-packs/bmad-2d-phaser-game-dev/agents/game-sm.txt +815 -0
  93. package/dist/expansion-packs/bmad-2d-phaser-game-dev/teams/phaser-2d-nodejs-game-team.txt +10952 -0
  94. package/dist/expansion-packs/bmad-2d-unity-game-dev/agents/game-architect.txt +4012 -0
  95. package/dist/expansion-packs/bmad-2d-unity-game-dev/agents/game-designer.txt +3698 -0
  96. package/dist/expansion-packs/bmad-2d-unity-game-dev/agents/game-developer.txt +450 -0
  97. package/dist/expansion-packs/bmad-2d-unity-game-dev/agents/game-sm.txt +973 -0
  98. package/dist/expansion-packs/bmad-2d-unity-game-dev/teams/unity-2d-game-team.txt +15376 -0
  99. package/dist/expansion-packs/bmad-infrastructure-devops/agents/infra-devops-platform.txt +2075 -0
  100. package/dist/teams/team-all.txt +12682 -0
  101. package/dist/teams/team-fullstack.txt +10421 -0
  102. package/dist/teams/team-ide-minimal.txt +5103 -0
  103. package/dist/teams/team-no-ui.txt +8980 -0
  104. package/docs/GUIDING-PRINCIPLES.md +91 -0
  105. package/docs/core-architecture.md +219 -0
  106. package/docs/enhanced-ide-development-workflow.md +248 -0
  107. package/docs/expansion-packs.md +280 -0
  108. package/docs/how-to-contribute-with-pull-requests.md +158 -0
  109. package/docs/user-guide.md +504 -0
  110. package/docs/versioning-and-releases.md +115 -53
  111. package/docs/versions.md +4 -5
  112. package/docs/working-in-the-brownfield.md +597 -0
  113. package/eslint.config.mjs +119 -0
  114. package/expansion-packs/Complete AI Agent System - Blank Templates & Google Cloud Setup/Complete AI Agent System - Flowchart.svg +102 -0
  115. package/expansion-packs/Complete AI Agent System - Blank Templates & Google Cloud Setup/PART 1 - Google Cloud Vertex AI Setup Documentation/1.1 Google Cloud Project Setup/1.1.1 - Initial Project Configuration - bash copy.txt +13 -0
  116. package/expansion-packs/Complete AI Agent System - Blank Templates & Google Cloud Setup/PART 1 - Google Cloud Vertex AI Setup Documentation/1.1 Google Cloud Project Setup/1.1.1 - Initial Project Configuration - bash.txt +13 -0
  117. package/expansion-packs/Complete AI Agent System - Blank Templates & Google Cloud Setup/PART 1 - Google Cloud Vertex AI Setup Documentation/1.2 Agent Development Kit Installation/1.2.2 - Basic Project Structure - txt.txt +25 -0
  118. package/expansion-packs/Complete AI Agent System - Blank Templates & Google Cloud Setup/PART 1 - Google Cloud Vertex AI Setup Documentation/1.3 Core Configuration Files/1.3.1 - settings.py +34 -0
  119. package/expansion-packs/Complete AI Agent System - Blank Templates & Google Cloud Setup/PART 1 - Google Cloud Vertex AI Setup Documentation/1.3 Core Configuration Files/1.3.2 - main.py - Base Application.py +70 -0
  120. package/expansion-packs/Complete AI Agent System - Blank Templates & Google Cloud Setup/PART 1 - Google Cloud Vertex AI Setup Documentation/1.4 Deployment Configuration/1.4.2 - cloudbuild.yaml +26 -0
  121. package/expansion-packs/Complete AI Agent System - Blank Templates & Google Cloud Setup/README.md +109 -0
  122. package/expansion-packs/README.md +2 -112
  123. package/expansion-packs/bmad-2d-phaser-game-dev/agent-teams/phaser-2d-nodejs-game-team.yaml +13 -0
  124. package/expansion-packs/bmad-2d-phaser-game-dev/agents/game-designer.md +71 -0
  125. package/expansion-packs/bmad-2d-phaser-game-dev/agents/game-developer.md +78 -0
  126. package/expansion-packs/bmad-2d-phaser-game-dev/agents/game-sm.md +64 -0
  127. package/expansion-packs/bmad-2d-phaser-game-dev/checklists/game-design-checklist.md +201 -0
  128. package/expansion-packs/bmad-2d-phaser-game-dev/checklists/game-story-dod-checklist.md +160 -0
  129. package/expansion-packs/bmad-2d-phaser-game-dev/config.yaml +8 -0
  130. package/expansion-packs/bmad-2d-phaser-game-dev/data/bmad-kb.md +250 -0
  131. package/expansion-packs/bmad-2d-phaser-game-dev/data/development-guidelines.md +647 -0
  132. package/expansion-packs/bmad-2d-phaser-game-dev/tasks/advanced-elicitation.md +110 -0
  133. package/expansion-packs/bmad-2d-phaser-game-dev/tasks/create-game-story.md +216 -0
  134. package/expansion-packs/bmad-2d-phaser-game-dev/tasks/game-design-brainstorming.md +290 -0
  135. package/expansion-packs/bmad-2d-phaser-game-dev/templates/game-architecture-tmpl.yaml +613 -0
  136. package/expansion-packs/bmad-2d-phaser-game-dev/templates/game-brief-tmpl.yaml +356 -0
  137. package/expansion-packs/bmad-2d-phaser-game-dev/templates/game-design-doc-tmpl.yaml +343 -0
  138. package/expansion-packs/bmad-2d-phaser-game-dev/templates/game-story-tmpl.yaml +253 -0
  139. package/expansion-packs/bmad-2d-phaser-game-dev/templates/level-design-doc-tmpl.yaml +484 -0
  140. package/expansion-packs/bmad-2d-phaser-game-dev/workflows/game-dev-greenfield.yaml +183 -0
  141. package/expansion-packs/bmad-2d-phaser-game-dev/workflows/game-prototype.yaml +175 -0
  142. package/expansion-packs/bmad-2d-unity-game-dev/agent-teams/unity-2d-game-team.yaml +14 -0
  143. package/expansion-packs/bmad-2d-unity-game-dev/agents/game-architect.md +80 -0
  144. package/expansion-packs/bmad-2d-unity-game-dev/agents/game-designer.md +77 -0
  145. package/expansion-packs/bmad-2d-unity-game-dev/agents/game-developer.md +78 -0
  146. package/expansion-packs/bmad-2d-unity-game-dev/agents/game-sm.md +65 -0
  147. package/expansion-packs/bmad-2d-unity-game-dev/checklists/game-architect-checklist.md +391 -0
  148. package/expansion-packs/bmad-2d-unity-game-dev/checklists/game-change-checklist.md +203 -0
  149. package/expansion-packs/bmad-2d-unity-game-dev/checklists/game-design-checklist.md +201 -0
  150. package/expansion-packs/bmad-2d-unity-game-dev/checklists/game-story-dod-checklist.md +124 -0
  151. package/expansion-packs/bmad-2d-unity-game-dev/config.yaml +6 -0
  152. package/expansion-packs/bmad-2d-unity-game-dev/data/bmad-kb.md +769 -0
  153. package/expansion-packs/bmad-2d-unity-game-dev/data/development-guidelines.md +586 -0
  154. package/expansion-packs/bmad-2d-unity-game-dev/tasks/advanced-elicitation.md +110 -0
  155. package/expansion-packs/bmad-2d-unity-game-dev/tasks/correct-course-game.md +141 -0
  156. package/expansion-packs/bmad-2d-unity-game-dev/tasks/create-game-story.md +184 -0
  157. package/expansion-packs/bmad-2d-unity-game-dev/tasks/game-design-brainstorming.md +290 -0
  158. package/expansion-packs/bmad-2d-unity-game-dev/tasks/validate-game-story.md +200 -0
  159. package/expansion-packs/bmad-2d-unity-game-dev/templates/game-architecture-tmpl.yaml +1030 -0
  160. package/expansion-packs/bmad-2d-unity-game-dev/templates/game-brief-tmpl.yaml +356 -0
  161. package/expansion-packs/bmad-2d-unity-game-dev/templates/game-design-doc-tmpl.yaml +705 -0
  162. package/expansion-packs/bmad-2d-unity-game-dev/templates/game-story-tmpl.yaml +256 -0
  163. package/expansion-packs/bmad-2d-unity-game-dev/templates/level-design-doc-tmpl.yaml +484 -0
  164. package/expansion-packs/bmad-2d-unity-game-dev/workflows/game-dev-greenfield.yaml +183 -0
  165. package/expansion-packs/bmad-2d-unity-game-dev/workflows/game-prototype.yaml +175 -0
  166. package/expansion-packs/{infrastructure-devops → bmad-infrastructure-devops}/README.md +9 -9
  167. package/expansion-packs/{infrastructure-devops → bmad-infrastructure-devops}/agents/infra-devops-platform.md +30 -18
  168. package/expansion-packs/{infrastructure-devops → bmad-infrastructure-devops}/checklists/infrastructure-checklist.md +1 -1
  169. package/expansion-packs/bmad-infrastructure-devops/config.yaml +9 -0
  170. package/expansion-packs/bmad-infrastructure-devops/data/bmad-kb.md +305 -0
  171. package/expansion-packs/{infrastructure-devops → bmad-infrastructure-devops}/tasks/review-infrastructure.md +4 -5
  172. package/expansion-packs/{infrastructure-devops → bmad-infrastructure-devops}/tasks/validate-infrastructure.md +4 -5
  173. package/expansion-packs/bmad-infrastructure-devops/templates/infrastructure-architecture-tmpl.yaml +424 -0
  174. package/expansion-packs/bmad-infrastructure-devops/templates/infrastructure-platform-from-arch-tmpl.yaml +629 -0
  175. package/package.json +74 -42
  176. package/prettier.config.mjs +32 -0
  177. package/release_notes.md +30 -0
  178. package/tools/bmad-npx-wrapper.js +13 -15
  179. package/tools/builders/web-builder.js +544 -15
  180. package/tools/bump-all-versions.js +115 -0
  181. package/tools/bump-expansion-version.js +90 -0
  182. package/tools/cli.js +65 -32
  183. package/tools/flattener/aggregate.js +76 -0
  184. package/tools/flattener/binary.js +80 -0
  185. package/tools/flattener/discovery.js +71 -0
  186. package/tools/flattener/files.js +35 -0
  187. package/tools/flattener/ignoreRules.js +176 -0
  188. package/tools/flattener/main.js +573 -0
  189. package/tools/flattener/projectRoot.js +206 -0
  190. package/tools/flattener/prompts.js +44 -0
  191. package/tools/flattener/stats.helpers.js +395 -0
  192. package/tools/flattener/stats.js +80 -0
  193. package/tools/flattener/test-matrix.js +413 -0
  194. package/tools/flattener/xml.js +88 -0
  195. package/tools/installer/README.md +3 -53
  196. package/tools/installer/bin/bmad.js +475 -90
  197. package/tools/installer/config/ide-agent-config.yaml +58 -0
  198. package/tools/installer/config/install.config.yaml +123 -0
  199. package/tools/installer/lib/config-loader.js +208 -40
  200. package/tools/installer/lib/file-manager.js +258 -55
  201. package/tools/installer/lib/ide-base-setup.js +228 -0
  202. package/tools/installer/lib/ide-setup.js +1265 -253
  203. package/tools/installer/lib/installer.js +1651 -310
  204. package/tools/installer/lib/memory-profiler.js +225 -0
  205. package/tools/installer/lib/module-manager.js +114 -0
  206. package/tools/installer/lib/resource-locator.js +308 -0
  207. package/tools/installer/package.json +25 -24
  208. package/tools/lib/dependency-resolver.js +44 -48
  209. package/tools/lib/yaml-utils.js +29 -0
  210. package/tools/md-assets/web-agent-startup-instructions.md +39 -0
  211. package/tools/preview-release-notes.js +66 -0
  212. package/tools/shared/bannerArt.js +105 -0
  213. package/tools/sync-installer-version.js +7 -9
  214. package/tools/update-expansion-version.js +53 -0
  215. package/tools/upgraders/v3-to-v4-upgrader.js +221 -320
  216. package/tools/version-bump.js +42 -27
  217. package/tools/yaml-format.js +57 -44
  218. package/.bmad-core/agent-teams/team-all.yml +0 -16
  219. package/.bmad-core/agent-teams/team-fullstack.yml +0 -26
  220. package/.bmad-core/agent-teams/team-no-ui.yml +0 -15
  221. package/.bmad-core/agents/analyst.md +0 -59
  222. package/.bmad-core/agents/architect.md +0 -66
  223. package/.bmad-core/agents/bmad-master.md +0 -104
  224. package/.bmad-core/agents/bmad-orchestrator.md +0 -81
  225. package/.bmad-core/agents/dev.md +0 -70
  226. package/.bmad-core/agents/pm.md +0 -59
  227. package/.bmad-core/agents/po.md +0 -60
  228. package/.bmad-core/agents/qa.md +0 -52
  229. package/.bmad-core/agents/sm.md +0 -55
  230. package/.bmad-core/agents/ux-expert.md +0 -66
  231. package/.bmad-core/data/bmad-kb.md +0 -47
  232. package/.bmad-core/schemas/agent-team-schema.yml +0 -153
  233. package/.bmad-core/tasks/advanced-elicitation.md +0 -92
  234. package/.bmad-core/tasks/brainstorming-techniques.md +0 -238
  235. package/.bmad-core/tasks/core-dump.md +0 -74
  236. package/.bmad-core/tasks/create-agent.md +0 -202
  237. package/.bmad-core/tasks/create-doc.md +0 -74
  238. package/.bmad-core/tasks/create-expansion-pack.md +0 -425
  239. package/.bmad-core/tasks/create-next-story.md +0 -206
  240. package/.bmad-core/tasks/create-team.md +0 -229
  241. package/.bmad-core/tasks/doc-migration-task.md +0 -143
  242. package/.bmad-core/tasks/generate-ai-frontend-prompt.md +0 -58
  243. package/.bmad-core/templates/agent-tmpl.md +0 -58
  244. package/.bmad-core/templates/architecture-tmpl.md +0 -771
  245. package/.bmad-core/templates/brownfield-architecture-tmpl.md +0 -542
  246. package/.bmad-core/templates/brownfield-prd-tmpl.md +0 -240
  247. package/.bmad-core/templates/competitor-analysis-tmpl.md +0 -289
  248. package/.bmad-core/templates/expansion-pack-plan-tmpl.md +0 -91
  249. package/.bmad-core/templates/front-end-architecture-tmpl.md +0 -173
  250. package/.bmad-core/templates/front-end-spec-tmpl.md +0 -411
  251. package/.bmad-core/templates/fullstack-architecture-tmpl.md +0 -1016
  252. package/.bmad-core/templates/market-research-tmpl.md +0 -261
  253. package/.bmad-core/templates/prd-tmpl.md +0 -200
  254. package/.bmad-core/templates/project-brief-tmpl.md +0 -228
  255. package/.bmad-core/templates/simple-project-prd-tmpl.md +0 -461
  256. package/.bmad-core/templates/story-tmpl.md +0 -61
  257. package/.bmad-core/templates/web-agent-startup-instructions-template.md +0 -39
  258. package/.bmad-core/utils/agent-switcher.ide.md +0 -112
  259. package/.bmad-core/utils/template-format.md +0 -26
  260. package/.bmad-core/utils/workflow-management.md +0 -224
  261. package/.bmad-core/web-bundles/agents/analyst.txt +0 -1684
  262. package/.bmad-core/web-bundles/agents/architect.txt +0 -3584
  263. package/.bmad-core/web-bundles/agents/bmad-master.txt +0 -9491
  264. package/.bmad-core/web-bundles/agents/bmad-orchestrator.txt +0 -1466
  265. package/.bmad-core/web-bundles/agents/dev.txt +0 -316
  266. package/.bmad-core/web-bundles/agents/qa.txt +0 -129
  267. package/.bmad-core/web-bundles/agents/sm.txt +0 -658
  268. package/.bmad-core/web-bundles/agents/ux-expert.txt +0 -1099
  269. package/.bmad-core/web-bundles/teams/team-all.txt +0 -10757
  270. package/.bmad-core/web-bundles/teams/team-fullstack.txt +0 -10109
  271. package/.bmad-core/web-bundles/teams/team-no-ui.txt +0 -8950
  272. package/.bmad-core/workflows/brownfield-fullstack.yml +0 -116
  273. package/.bmad-core/workflows/brownfield-service.yml +0 -117
  274. package/.bmad-core/workflows/brownfield-ui.yml +0 -127
  275. package/.bmad-core/workflows/greenfield-service.yml +0 -143
  276. package/.bmad-core/workflows/greenfield-ui.yml +0 -172
  277. package/.claude/commands/analyst.md +0 -63
  278. package/.claude/commands/architect.md +0 -70
  279. package/.claude/commands/bmad-master.md +0 -108
  280. package/.claude/commands/bmad-orchestrator.md +0 -85
  281. package/.claude/commands/dev.md +0 -74
  282. package/.claude/commands/pm.md +0 -63
  283. package/.claude/commands/po.md +0 -64
  284. package/.claude/commands/qa.md +0 -56
  285. package/.claude/commands/sm.md +0 -59
  286. package/.claude/commands/ux-expert.md +0 -70
  287. package/.cursor/rules/analyst.mdc +0 -77
  288. package/.cursor/rules/architect.mdc +0 -84
  289. package/.cursor/rules/bmad-master.mdc +0 -122
  290. package/.cursor/rules/bmad-orchestrator.mdc +0 -99
  291. package/.cursor/rules/dev.mdc +0 -88
  292. package/.cursor/rules/pm.mdc +0 -77
  293. package/.cursor/rules/po.mdc +0 -78
  294. package/.cursor/rules/qa.mdc +0 -70
  295. package/.cursor/rules/sm.mdc +0 -73
  296. package/.cursor/rules/ux-expert.mdc +0 -84
  297. package/.github/workflows/release.yml +0 -59
  298. package/.releaserc.json +0 -18
  299. package/.roo/.roomodes +0 -95
  300. package/.roo/README.md +0 -38
  301. package/.vscode/extensions.json +0 -6
  302. package/.windsurf/rules/analyst.md +0 -71
  303. package/.windsurf/rules/architect.md +0 -78
  304. package/.windsurf/rules/bmad-master.md +0 -116
  305. package/.windsurf/rules/bmad-orchestrator.md +0 -93
  306. package/.windsurf/rules/dev.md +0 -82
  307. package/.windsurf/rules/pm.md +0 -71
  308. package/.windsurf/rules/po.md +0 -72
  309. package/.windsurf/rules/qa.md +0 -64
  310. package/.windsurf/rules/sm.md +0 -67
  311. package/.windsurf/rules/ux-expert.md +0 -78
  312. package/docs/bmad-workflow-guide.md +0 -161
  313. package/docs/claude-code-guide.md +0 -119
  314. package/docs/cursor-guide.md +0 -127
  315. package/docs/roo-code-guide.md +0 -140
  316. package/docs/sample-output/simple-fullstack-greenfield/prd.md +0 -42
  317. package/docs/windsurf-guide.md +0 -127
  318. package/expansion-packs/infrastructure-devops/manifest.yml +0 -38
  319. package/expansion-packs/infrastructure-devops/templates/infrastructure-architecture-tmpl.md +0 -415
  320. package/expansion-packs/infrastructure-devops/templates/infrastructure-platform-from-arch-tmpl.md +0 -0
  321. package/tools/installer/config/install.config.yml +0 -139
  322. package/tools/installer/package-lock.json +0 -906
  323. package/tools/installer/templates/claude-commands.md +0 -7
  324. package/tools/installer/templates/cursor-rules.md +0 -22
  325. package/tools/installer/templates/windsurf-rules.md +0 -22
  326. package/tools/semantic-release-sync-installer.js +0 -31
  327. /package/{.bmad-core → bmad-core}/data/technical-preferences.md +0 -0
  328. /package/{.bmad-core → bmad-core}/tasks/brownfield-create-epic.md +0 -0
  329. /package/{.bmad-core → bmad-core}/tasks/brownfield-create-story.md +0 -0
@@ -0,0 +1,115 @@
1
+ const fs = require('node:fs');
2
+ const path = require('node:path');
3
+ const yaml = require('js-yaml');
4
+
5
+ const arguments_ = process.argv.slice(2);
6
+ const bumpType = arguments_[0] || 'minor'; // default to minor
7
+
8
+ if (!['major', 'minor', 'patch'].includes(bumpType)) {
9
+ console.log('Usage: node bump-all-versions.js [major|minor|patch]');
10
+ console.log('Default: minor');
11
+ process.exit(1);
12
+ }
13
+
14
+ function bumpVersion(currentVersion, type) {
15
+ const [major, minor, patch] = currentVersion.split('.').map(Number);
16
+
17
+ switch (type) {
18
+ case 'major': {
19
+ return `${major + 1}.0.0`;
20
+ }
21
+ case 'minor': {
22
+ return `${major}.${minor + 1}.0`;
23
+ }
24
+ case 'patch': {
25
+ return `${major}.${minor}.${patch + 1}`;
26
+ }
27
+ default: {
28
+ return currentVersion;
29
+ }
30
+ }
31
+ }
32
+
33
+ async function bumpAllVersions() {
34
+ const updatedItems = [];
35
+
36
+ // First, bump the core version (package.json)
37
+ const packagePath = path.join(__dirname, '..', 'package.json');
38
+ try {
39
+ const packageContent = fs.readFileSync(packagePath, 'utf8');
40
+ const packageJson = JSON.parse(packageContent);
41
+ const oldCoreVersion = packageJson.version || '1.0.0';
42
+ const newCoreVersion = bumpVersion(oldCoreVersion, bumpType);
43
+
44
+ packageJson.version = newCoreVersion;
45
+
46
+ fs.writeFileSync(packagePath, JSON.stringify(packageJson, null, 2) + '\n');
47
+
48
+ updatedItems.push({
49
+ type: 'core',
50
+ name: 'BMad Core',
51
+ oldVersion: oldCoreVersion,
52
+ newVersion: newCoreVersion,
53
+ });
54
+ console.log(`✓ BMad Core (package.json): ${oldCoreVersion} → ${newCoreVersion}`);
55
+ } catch (error) {
56
+ console.error(`✗ Failed to update BMad Core: ${error.message}`);
57
+ }
58
+
59
+ // Then, bump all expansion packs
60
+ const expansionPacksDir = path.join(__dirname, '..', 'expansion-packs');
61
+
62
+ try {
63
+ const entries = fs.readdirSync(expansionPacksDir, { withFileTypes: true });
64
+
65
+ for (const entry of entries) {
66
+ if (entry.isDirectory() && !entry.name.startsWith('.') && entry.name !== 'README.md') {
67
+ const packId = entry.name;
68
+ const configPath = path.join(expansionPacksDir, packId, 'config.yaml');
69
+
70
+ if (fs.existsSync(configPath)) {
71
+ try {
72
+ const configContent = fs.readFileSync(configPath, 'utf8');
73
+ const config = yaml.load(configContent);
74
+ const oldVersion = config.version || '1.0.0';
75
+ const newVersion = bumpVersion(oldVersion, bumpType);
76
+
77
+ config.version = newVersion;
78
+
79
+ const updatedYaml = yaml.dump(config, { indent: 2 });
80
+ fs.writeFileSync(configPath, updatedYaml);
81
+
82
+ updatedItems.push({ type: 'expansion', name: packId, oldVersion, newVersion });
83
+ console.log(`✓ ${packId}: ${oldVersion} → ${newVersion}`);
84
+ } catch (error) {
85
+ console.error(`✗ Failed to update ${packId}: ${error.message}`);
86
+ }
87
+ }
88
+ }
89
+ }
90
+
91
+ if (updatedItems.length > 0) {
92
+ const coreCount = updatedItems.filter((index) => index.type === 'core').length;
93
+ const expansionCount = updatedItems.filter((index) => index.type === 'expansion').length;
94
+
95
+ console.log(
96
+ `\n✓ Successfully bumped ${updatedItems.length} item(s) with ${bumpType} version bump`,
97
+ );
98
+ if (coreCount > 0) console.log(` - ${coreCount} core`);
99
+ if (expansionCount > 0) console.log(` - ${expansionCount} expansion pack(s)`);
100
+
101
+ console.log('\nNext steps:');
102
+ console.log('1. Test the changes');
103
+ console.log(
104
+ '2. Commit: git add -A && git commit -m "chore: bump all versions (' + bumpType + ')"',
105
+ );
106
+ } else {
107
+ console.log('No items found to update');
108
+ }
109
+ } catch (error) {
110
+ console.error('Error reading expansion packs directory:', error.message);
111
+ process.exit(1);
112
+ }
113
+ }
114
+
115
+ bumpAllVersions();
@@ -0,0 +1,90 @@
1
+ // Load required modules
2
+ const fs = require('node:fs');
3
+ const path = require('node:path');
4
+ const yaml = require('js-yaml');
5
+
6
+ // Parse CLI arguments
7
+ const arguments_ = process.argv.slice(2);
8
+ const packId = arguments_[0];
9
+ const bumpType = arguments_[1] || 'minor';
10
+
11
+ // Validate arguments
12
+ if (!packId || arguments_.length > 2) {
13
+ console.log('Usage: node bump-expansion-version.js <expansion-pack-id> [major|minor|patch]');
14
+ console.log('Default: minor');
15
+ console.log('Example: node bump-expansion-version.js bmad-creator-tools patch');
16
+ process.exit(1);
17
+ }
18
+
19
+ if (!['major', 'minor', 'patch'].includes(bumpType)) {
20
+ console.error('Error: Bump type must be major, minor, or patch');
21
+ process.exit(1);
22
+ }
23
+
24
+ // Version bump logic
25
+ function bumpVersion(currentVersion, type) {
26
+ const [major, minor, patch] = currentVersion.split('.').map(Number);
27
+
28
+ switch (type) {
29
+ case 'major': {
30
+ return `${major + 1}.0.0`;
31
+ }
32
+ case 'minor': {
33
+ return `${major}.${minor + 1}.0`;
34
+ }
35
+ case 'patch': {
36
+ return `${major}.${minor}.${patch + 1}`;
37
+ }
38
+ default: {
39
+ return currentVersion;
40
+ }
41
+ }
42
+ }
43
+
44
+ // Main function to bump version
45
+ async function updateVersion() {
46
+ const configPath = path.join(__dirname, '..', 'expansion-packs', packId, 'config.yaml');
47
+
48
+ // Check if config exists
49
+ if (!fs.existsSync(configPath)) {
50
+ console.error(`Error: Expansion pack '${packId}' not found`);
51
+ console.log('\nAvailable expansion packs:');
52
+
53
+ const packsDir = path.join(__dirname, '..', 'expansion-packs');
54
+ const entries = fs.readdirSync(packsDir, { withFileTypes: true });
55
+
56
+ for (const entry of entries) {
57
+ if (entry.isDirectory() && !entry.name.startsWith('.')) {
58
+ console.log(` - ${entry.name}`);
59
+ }
60
+ }
61
+
62
+ process.exit(1);
63
+ }
64
+
65
+ try {
66
+ const configContent = fs.readFileSync(configPath, 'utf8');
67
+ const config = yaml.load(configContent);
68
+
69
+ const oldVersion = config.version || '1.0.0';
70
+ const newVersion = bumpVersion(oldVersion, bumpType);
71
+
72
+ config.version = newVersion;
73
+
74
+ const updatedYaml = yaml.dump(config, { indent: 2 });
75
+ fs.writeFileSync(configPath, updatedYaml);
76
+
77
+ console.log(`✓ ${packId}: ${oldVersion} → ${newVersion}`);
78
+ console.log(`\n✓ Successfully bumped ${packId} with ${bumpType} version bump`);
79
+ console.log('\nNext steps:');
80
+ console.log(`1. Test the changes`);
81
+ console.log(
82
+ `2. Commit: git add -A && git commit -m "chore: bump ${packId} version (${bumpType})"`,
83
+ );
84
+ } catch (error) {
85
+ console.error('Error updating version:', error.message);
86
+ process.exit(1);
87
+ }
88
+ }
89
+
90
+ updateVersion();
package/tools/cli.js CHANGED
@@ -1,16 +1,14 @@
1
- #!/usr/bin/env node
2
-
3
1
  const { Command } = require('commander');
4
2
  const WebBuilder = require('./builders/web-builder');
5
3
  const V3ToV4Upgrader = require('./upgraders/v3-to-v4-upgrader');
6
4
  const IdeSetup = require('./installer/lib/ide-setup');
7
- const path = require('path');
5
+ const path = require('node:path');
8
6
 
9
7
  const program = new Command();
10
8
 
11
9
  program
12
10
  .name('bmad-build')
13
- .description('BMAD-METHOD build tool for creating web bundles')
11
+ .description('BMad-Method build tool for creating web bundles')
14
12
  .version('4.0.0');
15
13
 
16
14
  program
@@ -18,10 +16,12 @@ program
18
16
  .description('Build web bundles for agents and teams')
19
17
  .option('-a, --agents-only', 'Build only agent bundles')
20
18
  .option('-t, --teams-only', 'Build only team bundles')
19
+ .option('-e, --expansions-only', 'Build only expansion pack bundles')
20
+ .option('--no-expansions', 'Skip building expansion packs')
21
21
  .option('--no-clean', 'Skip cleaning output directories')
22
22
  .action(async (options) => {
23
23
  const builder = new WebBuilder({
24
- rootDir: process.cwd()
24
+ rootDir: process.cwd(),
25
25
  });
26
26
 
27
27
  try {
@@ -30,28 +30,23 @@ program
30
30
  await builder.cleanOutputDirs();
31
31
  }
32
32
 
33
- if (!options.teamsOnly) {
34
- console.log('Building agent bundles...');
35
- await builder.buildAgents();
36
- }
33
+ if (options.expansionsOnly) {
34
+ console.log('Building expansion pack bundles...');
35
+ await builder.buildAllExpansionPacks({ clean: false });
36
+ } else {
37
+ if (!options.teamsOnly) {
38
+ console.log('Building agent bundles...');
39
+ await builder.buildAgents();
40
+ }
37
41
 
38
- if (!options.agentsOnly) {
39
- console.log('Building team bundles...');
40
- await builder.buildTeams();
41
- }
42
+ if (!options.agentsOnly) {
43
+ console.log('Building team bundles...');
44
+ await builder.buildTeams();
45
+ }
42
46
 
43
- // Generate IDE configuration folders
44
- console.log('Generating IDE configuration folders...');
45
- const installDir = process.cwd();
46
-
47
- // Generate configurations for all supported IDEs
48
- const ides = ['cursor', 'claude-code', 'windsurf', 'roo'];
49
- for (const ide of ides) {
50
- try {
51
- console.log(`Setting up ${ide} integration...`);
52
- await IdeSetup.setup(ide, installDir);
53
- } catch (error) {
54
- console.warn(`Warning: Failed to setup ${ide}:`, error.message);
47
+ if (!options.noExpansions) {
48
+ console.log('Building expansion pack bundles...');
49
+ await builder.buildAllExpansionPacks({ clean: false });
55
50
  }
56
51
  }
57
52
 
@@ -62,6 +57,32 @@ program
62
57
  }
63
58
  });
64
59
 
60
+ program
61
+ .command('build:expansions')
62
+ .description('Build web bundles for all expansion packs')
63
+ .option('--expansion <name>', 'Build specific expansion pack only')
64
+ .option('--no-clean', 'Skip cleaning output directories')
65
+ .action(async (options) => {
66
+ const builder = new WebBuilder({
67
+ rootDir: process.cwd(),
68
+ });
69
+
70
+ try {
71
+ if (options.expansion) {
72
+ console.log(`Building expansion pack: ${options.expansion}`);
73
+ await builder.buildExpansionPack(options.expansion, { clean: options.clean });
74
+ } else {
75
+ console.log('Building all expansion packs...');
76
+ await builder.buildAllExpansionPacks({ clean: options.clean });
77
+ }
78
+
79
+ console.log('Expansion pack build completed successfully!');
80
+ } catch (error) {
81
+ console.error('Expansion pack build failed:', error.message);
82
+ process.exit(1);
83
+ }
84
+ });
85
+
65
86
  program
66
87
  .command('list:agents')
67
88
  .description('List all available agents')
@@ -69,7 +90,19 @@ program
69
90
  const builder = new WebBuilder({ rootDir: process.cwd() });
70
91
  const agents = await builder.resolver.listAgents();
71
92
  console.log('Available agents:');
72
- agents.forEach(agent => console.log(` - ${agent}`));
93
+ for (const agent of agents) console.log(` - ${agent}`);
94
+ process.exit(0);
95
+ });
96
+
97
+ program
98
+ .command('list:expansions')
99
+ .description('List all available expansion packs')
100
+ .action(async () => {
101
+ const builder = new WebBuilder({ rootDir: process.cwd() });
102
+ const expansions = await builder.listExpansionPacks();
103
+ console.log('Available expansion packs:');
104
+ for (const expansion of expansions) console.log(` - ${expansion}`);
105
+ process.exit(0);
73
106
  });
74
107
 
75
108
  program
@@ -81,19 +114,19 @@ program
81
114
  // Validate by attempting to build all agents and teams
82
115
  const agents = await builder.resolver.listAgents();
83
116
  const teams = await builder.resolver.listTeams();
84
-
117
+
85
118
  console.log('Validating agents...');
86
119
  for (const agent of agents) {
87
120
  await builder.resolver.resolveAgentDependencies(agent);
88
121
  console.log(` ✓ ${agent}`);
89
122
  }
90
-
123
+
91
124
  console.log('\nValidating teams...');
92
125
  for (const team of teams) {
93
126
  await builder.resolver.resolveTeamDependencies(team);
94
127
  console.log(` ✓ ${team}`);
95
128
  }
96
-
129
+
97
130
  console.log('\nAll configurations are valid!');
98
131
  } catch (error) {
99
132
  console.error('Validation failed:', error.message);
@@ -103,7 +136,7 @@ program
103
136
 
104
137
  program
105
138
  .command('upgrade')
106
- .description('Upgrade a BMAD-METHOD V3 project to V4')
139
+ .description('Upgrade a BMad-Method V3 project to V4')
107
140
  .option('-p, --project <path>', 'Path to V3 project (defaults to current directory)')
108
141
  .option('--dry-run', 'Show what would be changed without making changes')
109
142
  .option('--no-backup', 'Skip creating backup (not recommended)')
@@ -112,8 +145,8 @@ program
112
145
  await upgrader.upgrade({
113
146
  projectPath: options.project,
114
147
  dryRun: options.dryRun,
115
- backup: options.backup
148
+ backup: options.backup,
116
149
  });
117
150
  });
118
151
 
119
- program.parse();
152
+ program.parse();
@@ -0,0 +1,76 @@
1
+ const fs = require('fs-extra');
2
+ const path = require('node:path');
3
+ const os = require('node:os');
4
+ const { isBinaryFile } = require('./binary.js');
5
+
6
+ /**
7
+ * Aggregate file contents with bounded concurrency.
8
+ * Returns text files, binary files (with size), and errors.
9
+ * @param {string[]} files absolute file paths
10
+ * @param {string} rootDir
11
+ * @param {{ text?: string, warn?: (msg: string) => void } | null} spinner
12
+ */
13
+ async function aggregateFileContents(files, rootDir, spinner = null) {
14
+ const results = {
15
+ textFiles: [],
16
+ binaryFiles: [],
17
+ errors: [],
18
+ totalFiles: files.length,
19
+ processedFiles: 0,
20
+ };
21
+
22
+ // Automatic concurrency selection based on CPU count and workload size.
23
+ // - Base on 2x logical CPUs, clamped to [2, 64]
24
+ // - For very small workloads, avoid excessive parallelism
25
+ const cpuCount = os.cpus && Array.isArray(os.cpus()) ? os.cpus().length : os.cpus?.length || 4;
26
+ let concurrency = Math.min(64, Math.max(2, (Number(cpuCount) || 4) * 2));
27
+ if (files.length > 0 && files.length < concurrency) {
28
+ concurrency = Math.max(1, Math.min(concurrency, Math.ceil(files.length / 2)));
29
+ }
30
+
31
+ async function processOne(filePath) {
32
+ try {
33
+ const relativePath = path.relative(rootDir, filePath);
34
+ if (spinner) {
35
+ spinner.text = `Processing: ${relativePath} (${results.processedFiles + 1}/${results.totalFiles})`;
36
+ }
37
+
38
+ const binary = await isBinaryFile(filePath);
39
+ if (binary) {
40
+ const { size } = await fs.stat(filePath);
41
+ results.binaryFiles.push({ path: relativePath, absolutePath: filePath, size });
42
+ } else {
43
+ const content = await fs.readFile(filePath, 'utf8');
44
+ results.textFiles.push({
45
+ path: relativePath,
46
+ absolutePath: filePath,
47
+ content,
48
+ size: content.length,
49
+ lines: content.split('\n').length,
50
+ });
51
+ }
52
+ } catch (error) {
53
+ const relativePath = path.relative(rootDir, filePath);
54
+ const errorInfo = { path: relativePath, absolutePath: filePath, error: error.message };
55
+ results.errors.push(errorInfo);
56
+ if (spinner) {
57
+ spinner.warn(`Warning: Could not read file ${relativePath}: ${error.message}`);
58
+ } else {
59
+ console.warn(`Warning: Could not read file ${relativePath}: ${error.message}`);
60
+ }
61
+ } finally {
62
+ results.processedFiles++;
63
+ }
64
+ }
65
+
66
+ for (let index = 0; index < files.length; index += concurrency) {
67
+ const slice = files.slice(index, index + concurrency);
68
+ await Promise.all(slice.map(processOne));
69
+ }
70
+
71
+ return results;
72
+ }
73
+
74
+ module.exports = {
75
+ aggregateFileContents,
76
+ };
@@ -0,0 +1,80 @@
1
+ const fsp = require('node:fs/promises');
2
+ const path = require('node:path');
3
+ const { Buffer } = require('node:buffer');
4
+
5
+ /**
6
+ * Efficiently determine if a file is binary without reading the whole file.
7
+ * - Fast path by extension for common binaries
8
+ * - Otherwise read a small prefix and check for NUL bytes
9
+ * @param {string} filePath
10
+ * @returns {Promise<boolean>}
11
+ */
12
+ async function isBinaryFile(filePath) {
13
+ try {
14
+ const stats = await fsp.stat(filePath);
15
+ if (stats.isDirectory()) {
16
+ throw new Error('EISDIR: illegal operation on a directory');
17
+ }
18
+
19
+ const binaryExtensions = new Set([
20
+ '.jpg',
21
+ '.jpeg',
22
+ '.png',
23
+ '.gif',
24
+ '.bmp',
25
+ '.ico',
26
+ '.svg',
27
+ '.pdf',
28
+ '.doc',
29
+ '.docx',
30
+ '.xls',
31
+ '.xlsx',
32
+ '.ppt',
33
+ '.pptx',
34
+ '.zip',
35
+ '.tar',
36
+ '.gz',
37
+ '.rar',
38
+ '.7z',
39
+ '.exe',
40
+ '.dll',
41
+ '.so',
42
+ '.dylib',
43
+ '.mp3',
44
+ '.mp4',
45
+ '.avi',
46
+ '.mov',
47
+ '.wav',
48
+ '.ttf',
49
+ '.otf',
50
+ '.woff',
51
+ '.woff2',
52
+ '.bin',
53
+ '.dat',
54
+ '.db',
55
+ '.sqlite',
56
+ ]);
57
+
58
+ const extension = path.extname(filePath).toLowerCase();
59
+ if (binaryExtensions.has(extension)) return true;
60
+ if (stats.size === 0) return false;
61
+
62
+ const sampleSize = Math.min(4096, stats.size);
63
+ const fd = await fsp.open(filePath, 'r');
64
+ try {
65
+ const buffer = Buffer.allocUnsafe(sampleSize);
66
+ const { bytesRead } = await fd.read(buffer, 0, sampleSize, 0);
67
+ const slice = bytesRead === sampleSize ? buffer : buffer.subarray(0, bytesRead);
68
+ return slice.includes(0);
69
+ } finally {
70
+ await fd.close();
71
+ }
72
+ } catch (error) {
73
+ console.warn(`Warning: Could not determine if file is binary: ${filePath} - ${error.message}`);
74
+ return false;
75
+ }
76
+ }
77
+
78
+ module.exports = {
79
+ isBinaryFile,
80
+ };
@@ -0,0 +1,71 @@
1
+ const path = require('node:path');
2
+ const { execFile } = require('node:child_process');
3
+ const { promisify } = require('node:util');
4
+ const { glob } = require('glob');
5
+ const { loadIgnore } = require('./ignoreRules.js');
6
+
7
+ const pExecFile = promisify(execFile);
8
+
9
+ async function isGitRepo(rootDir) {
10
+ try {
11
+ const { stdout } = await pExecFile('git', ['rev-parse', '--is-inside-work-tree'], {
12
+ cwd: rootDir,
13
+ });
14
+ return (
15
+ String(stdout || '')
16
+ .toString()
17
+ .trim() === 'true'
18
+ );
19
+ } catch {
20
+ return false;
21
+ }
22
+ }
23
+
24
+ async function gitListFiles(rootDir) {
25
+ try {
26
+ const { stdout } = await pExecFile('git', ['ls-files', '-co', '--exclude-standard'], {
27
+ cwd: rootDir,
28
+ });
29
+ return String(stdout || '')
30
+ .split(/\r?\n/)
31
+ .map((s) => s.trim())
32
+ .filter(Boolean);
33
+ } catch {
34
+ return [];
35
+ }
36
+ }
37
+
38
+ /**
39
+ * Discover files under rootDir.
40
+ * - Prefer git ls-files when available for speed/correctness
41
+ * - Fallback to glob and apply unified ignore rules
42
+ * @param {string} rootDir
43
+ * @param {object} [options]
44
+ * @param {boolean} [options.preferGit=true]
45
+ * @returns {Promise<string[]>} absolute file paths
46
+ */
47
+ async function discoverFiles(rootDir, options = {}) {
48
+ const { preferGit = true } = options;
49
+ const { filter } = await loadIgnore(rootDir);
50
+
51
+ // Try git first
52
+ if (preferGit && (await isGitRepo(rootDir))) {
53
+ const relFiles = await gitListFiles(rootDir);
54
+ const filteredRel = relFiles.filter((p) => filter(p));
55
+ return filteredRel.map((p) => path.resolve(rootDir, p));
56
+ }
57
+
58
+ // Glob fallback
59
+ const globbed = await glob('**/*', {
60
+ cwd: rootDir,
61
+ nodir: true,
62
+ dot: true,
63
+ follow: false,
64
+ });
65
+ const filteredRel = globbed.filter((p) => filter(p));
66
+ return filteredRel.map((p) => path.resolve(rootDir, p));
67
+ }
68
+
69
+ module.exports = {
70
+ discoverFiles,
71
+ };
@@ -0,0 +1,35 @@
1
+ const path = require('node:path');
2
+ const discovery = require('./discovery.js');
3
+ const ignoreRules = require('./ignoreRules.js');
4
+ const { isBinaryFile } = require('./binary.js');
5
+ const { aggregateFileContents } = require('./aggregate.js');
6
+
7
+ // Backward-compatible signature; delegate to central loader
8
+ async function parseGitignore(gitignorePath) {
9
+ return await ignoreRules.parseGitignore(gitignorePath);
10
+ }
11
+
12
+ async function discoverFiles(rootDir) {
13
+ try {
14
+ // Delegate to discovery module which respects .gitignore and defaults
15
+ return await discovery.discoverFiles(rootDir, { preferGit: true });
16
+ } catch (error) {
17
+ console.error('Error discovering files:', error.message);
18
+ return [];
19
+ }
20
+ }
21
+
22
+ async function filterFiles(files, rootDir) {
23
+ const { filter } = await ignoreRules.loadIgnore(rootDir);
24
+ const relativeFiles = files.map((f) => path.relative(rootDir, f));
25
+ const filteredRelative = relativeFiles.filter((p) => filter(p));
26
+ return filteredRelative.map((p) => path.resolve(rootDir, p));
27
+ }
28
+
29
+ module.exports = {
30
+ parseGitignore,
31
+ discoverFiles,
32
+ isBinaryFile,
33
+ aggregateFileContents,
34
+ filterFiles,
35
+ };