appiq-solution 1.3.2 → 1.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (297) hide show
  1. package/#Tools/APPIQ-METHOD/.bmad-config.json +13 -0
  2. package/#Tools/APPIQ-METHOD/.cursor/commands/analyze.md +27 -0
  3. package/#Tools/APPIQ-METHOD/.cursor/commands/appiq.md +27 -0
  4. package/#Tools/APPIQ-METHOD/.cursor/commands/help.md +27 -0
  5. package/#Tools/APPIQ-METHOD/.cursor/commands/story.md +27 -0
  6. package/#Tools/APPIQ-METHOD/CHANGELOG.md +119 -173
  7. package/#Tools/APPIQ-METHOD/DEVELOPMENT_GUIDE.md +855 -0
  8. package/#Tools/APPIQ-METHOD/NPM-README.md +138 -0
  9. package/#Tools/APPIQ-METHOD/README.md +73 -105
  10. package/#Tools/APPIQ-METHOD/SMART_WORKFLOW_GUIDE.md +401 -0
  11. package/#Tools/APPIQ-METHOD/activate-appiq.js +81 -0
  12. package/#Tools/APPIQ-METHOD/appiq-solution/README.md +226 -0
  13. package/#Tools/APPIQ-METHOD/bmad-core/agent-teams/team-flutter-mobile.yaml +114 -0
  14. package/#Tools/APPIQ-METHOD/bmad-core/agent-teams/team-fullstack.yaml +11 -1
  15. package/#Tools/APPIQ-METHOD/bmad-core/agents/analyst.md +7 -3
  16. package/#Tools/APPIQ-METHOD/bmad-core/agents/architect.md +6 -0
  17. package/#Tools/APPIQ-METHOD/bmad-core/agents/bmad-orchestrator.md +0 -84
  18. package/#Tools/APPIQ-METHOD/bmad-core/agents/bmad-smart-launcher.md +170 -0
  19. package/#Tools/APPIQ-METHOD/bmad-core/agents/dev.md +31 -12
  20. package/#Tools/APPIQ-METHOD/bmad-core/agents/pm.md +10 -4
  21. package/#Tools/APPIQ-METHOD/bmad-core/agents/qa.md +17 -0
  22. package/#Tools/APPIQ-METHOD/bmad-core/agents/sm.md +8 -3
  23. package/#Tools/APPIQ-METHOD/bmad-core/agents/ux-expert.md +8 -3
  24. package/#Tools/APPIQ-METHOD/bmad-core/bmad-core/user-guide.md +0 -0
  25. package/#Tools/APPIQ-METHOD/bmad-core/checklists/security-validation-checklist.md +332 -0
  26. package/#Tools/APPIQ-METHOD/bmad-core/data/backend-services-integration.md +686 -0
  27. package/#Tools/APPIQ-METHOD/bmad-core/data/shadcn-ui-integration.md +388 -0
  28. package/#Tools/APPIQ-METHOD/bmad-core/data/technical-preferences.md +147 -1
  29. package/#Tools/APPIQ-METHOD/bmad-core/enhanced-ide-development-workflow.md +43 -0
  30. package/#Tools/APPIQ-METHOD/bmad-core/tasks/create-flutter-story.md +197 -0
  31. package/#Tools/APPIQ-METHOD/bmad-core/tasks/intelligent-epic-creation.md +234 -0
  32. package/#Tools/APPIQ-METHOD/bmad-core/tasks/smart-project-analysis.md +289 -0
  33. package/#Tools/APPIQ-METHOD/bmad-core/templates/flutter-mobile-prd-tmpl.yaml +330 -0
  34. package/#Tools/APPIQ-METHOD/bmad-core/templates/flutter-story-tmpl.yaml +376 -0
  35. package/#Tools/APPIQ-METHOD/bmad-core/templates/flutter-ui-spec-tmpl.yaml +415 -0
  36. package/#Tools/APPIQ-METHOD/bmad-core/templates/fullstack-architecture-tmpl.yaml +12 -5
  37. package/#Tools/APPIQ-METHOD/bmad-core/user-guide.md +10 -9
  38. package/#Tools/APPIQ-METHOD/bmad-core/workflows/brownfield-fullstack.yaml +15 -1
  39. package/#Tools/APPIQ-METHOD/bmad-core/workflows/greenfield-fullstack.yaml +49 -5
  40. package/#Tools/APPIQ-METHOD/bmad-core/working-in-the-brownfield.md +56 -44
  41. package/#Tools/APPIQ-METHOD/commands/README.md +28 -0
  42. package/#Tools/APPIQ-METHOD/commands/analyze.md +27 -0
  43. package/#Tools/APPIQ-METHOD/commands/appiq.md +27 -0
  44. package/#Tools/APPIQ-METHOD/commands/help.md +27 -0
  45. package/#Tools/APPIQ-METHOD/commands/story.md +27 -0
  46. package/#Tools/APPIQ-METHOD/dist/agents/bmad-orchestrator.txt +0 -111
  47. package/#Tools/APPIQ-METHOD/dist/agents/pm.txt +2 -0
  48. package/#Tools/APPIQ-METHOD/dist/expansion-packs/bmad-2d-phaser-game-dev/teams/phaser-2d-nodejs-game-team.txt +0 -111
  49. package/#Tools/APPIQ-METHOD/dist/expansion-packs/bmad-2d-unity-game-dev/teams/unity-2d-game-team.txt +0 -111
  50. package/#Tools/APPIQ-METHOD/dist/teams/team-all.txt +2 -111
  51. package/#Tools/APPIQ-METHOD/dist/teams/team-fullstack.txt +2 -111
  52. package/#Tools/APPIQ-METHOD/dist/teams/team-ide-minimal.txt +0 -111
  53. package/#Tools/APPIQ-METHOD/dist/teams/team-no-ui.txt +2 -111
  54. package/#Tools/APPIQ-METHOD/expansion-packs/bmad-2d-phaser-game-dev/config.yaml +1 -1
  55. package/#Tools/APPIQ-METHOD/expansion-packs/bmad-2d-unity-game-dev/config.yaml +1 -1
  56. package/#Tools/APPIQ-METHOD/expansion-packs/bmad-flutter-mobile-dev/agent-teams/flutter-mobile-team.yaml +23 -0
  57. package/#Tools/APPIQ-METHOD/expansion-packs/bmad-flutter-mobile-dev/agents/flutter-cubit-agent.md +133 -0
  58. package/#Tools/APPIQ-METHOD/expansion-packs/bmad-flutter-mobile-dev/agents/flutter-data-agent.md +160 -0
  59. package/#Tools/APPIQ-METHOD/expansion-packs/bmad-flutter-mobile-dev/agents/flutter-domain-agent.md +153 -0
  60. package/#Tools/APPIQ-METHOD/expansion-packs/bmad-flutter-mobile-dev/agents/flutter-ui-agent.md +122 -0
  61. package/#Tools/APPIQ-METHOD/expansion-packs/bmad-flutter-mobile-dev/agents/shared-components-agent.md +161 -0
  62. package/#Tools/APPIQ-METHOD/expansion-packs/bmad-flutter-mobile-dev/checklists/flutter-story-dod-checklist.md +194 -0
  63. package/#Tools/APPIQ-METHOD/expansion-packs/bmad-flutter-mobile-dev/config.yaml +41 -0
  64. package/#Tools/APPIQ-METHOD/expansion-packs/bmad-flutter-mobile-dev/data/flutter-development-guidelines.md +551 -0
  65. package/#Tools/APPIQ-METHOD/expansion-packs/bmad-flutter-mobile-dev/templates/flutter-mobile-architecture-tmpl.yaml +530 -0
  66. package/#Tools/APPIQ-METHOD/expansion-packs/bmad-flutter-mobile-dev/workflows/flutter-ui-first-development.yaml +220 -0
  67. package/#Tools/APPIQ-METHOD/expansion-packs/bmad-infrastructure-devops/config.yaml +1 -1
  68. package/#Tools/APPIQ-METHOD/install-appiq.sh +41 -0
  69. package/#Tools/APPIQ-METHOD/package-lock.json +631 -0
  70. package/#Tools/APPIQ-METHOD/package.json +20 -69
  71. package/#Tools/APPIQ-METHOD/tasks/todo.md +275 -0
  72. package/#Tools/APPIQ-METHOD/tools/appiq-installer.js +2622 -0
  73. package/#Tools/APPIQ-METHOD/tools/bmad-npx-wrapper.js +5 -7
  74. package/#Tools/APPIQ-METHOD/tools/cli.js +3 -3
  75. package/#Tools/APPIQ-METHOD/tools/epic-solution-installer.js +538 -0
  76. package/#Tools/APPIQ-METHOD/tools/flattener/main.js +570 -0
  77. package/#Tools/APPIQ-METHOD/tools/installer/bin/bmad.js +15 -14
  78. package/#Tools/APPIQ-METHOD/tools/installer/lib/installer.js +28 -2
  79. package/#Tools/APPIQ-METHOD/tools/installer/package-lock.json +906 -0
  80. package/#Tools/APPIQ-METHOD/tools/installer/package.json +1 -1
  81. package/#Tools/APPIQ-METHOD/tools/setup-ide-commands.js +345 -0
  82. package/#Tools/APPIQ-METHOD/tools/smart-installer.js +589 -0
  83. package/README.md +73 -105
  84. package/package.json +20 -69
  85. package/tools/appiq-installer.js +2622 -0
  86. package/tools/bmad-npx-wrapper.js +5 -7
  87. package/tools/cli.js +3 -3
  88. package/tools/epic-solution-installer.js +538 -0
  89. package/tools/flattener/main.js +570 -0
  90. package/tools/installer/bin/bmad.js +15 -14
  91. package/tools/installer/lib/installer.js +28 -2
  92. package/tools/installer/package-lock.json +89 -89
  93. package/tools/installer/package.json +1 -1
  94. package/tools/setup-ide-commands.js +345 -0
  95. package/tools/smart-installer.js +589 -0
  96. package/#Tools/APPIQ-METHOD/appiq_start.md +0 -232
  97. package/#Tools/APPIQ-METHOD/deployment/DEPLOYMENT_GUIDE.md +0 -426
  98. package/#Tools/APPIQ-METHOD/deployment/GITHUB_RELEASE_GUIDE.md +0 -326
  99. package/#Tools/APPIQ-METHOD/deployment/README.md +0 -331
  100. package/#Tools/APPIQ-METHOD/deployment/build/bmad-core/agent-teams/team-all.yaml +0 -14
  101. package/#Tools/APPIQ-METHOD/deployment/build/bmad-core/agent-teams/team-fullstack.yaml +0 -18
  102. package/#Tools/APPIQ-METHOD/deployment/build/bmad-core/agent-teams/team-ide-minimal.yaml +0 -10
  103. package/#Tools/APPIQ-METHOD/deployment/build/bmad-core/agent-teams/team-no-ui.yaml +0 -13
  104. package/#Tools/APPIQ-METHOD/deployment/build/bmad-core/agents/analyst.md +0 -81
  105. package/#Tools/APPIQ-METHOD/deployment/build/bmad-core/agents/architect.md +0 -84
  106. package/#Tools/APPIQ-METHOD/deployment/build/bmad-core/agents/bmad-master.md +0 -108
  107. package/#Tools/APPIQ-METHOD/deployment/build/bmad-core/agents/bmad-orchestrator.md +0 -234
  108. package/#Tools/APPIQ-METHOD/deployment/build/bmad-core/agents/dev.md +0 -76
  109. package/#Tools/APPIQ-METHOD/deployment/build/bmad-core/agents/pm.md +0 -79
  110. package/#Tools/APPIQ-METHOD/deployment/build/bmad-core/agents/po.md +0 -76
  111. package/#Tools/APPIQ-METHOD/deployment/build/bmad-core/agents/qa.md +0 -69
  112. package/#Tools/APPIQ-METHOD/deployment/build/bmad-core/agents/sm.md +0 -62
  113. package/#Tools/APPIQ-METHOD/deployment/build/bmad-core/agents/ux-expert.md +0 -66
  114. package/#Tools/APPIQ-METHOD/deployment/build/bmad-core/checklists/architect-checklist.md +0 -443
  115. package/#Tools/APPIQ-METHOD/deployment/build/bmad-core/checklists/change-checklist.md +0 -182
  116. package/#Tools/APPIQ-METHOD/deployment/build/bmad-core/checklists/pm-checklist.md +0 -375
  117. package/#Tools/APPIQ-METHOD/deployment/build/bmad-core/checklists/po-master-checklist.md +0 -441
  118. package/#Tools/APPIQ-METHOD/deployment/build/bmad-core/checklists/story-dod-checklist.md +0 -101
  119. package/#Tools/APPIQ-METHOD/deployment/build/bmad-core/checklists/story-draft-checklist.md +0 -156
  120. package/#Tools/APPIQ-METHOD/deployment/build/bmad-core/data/bmad-kb.md +0 -803
  121. package/#Tools/APPIQ-METHOD/deployment/build/bmad-core/data/brainstorming-techniques.md +0 -36
  122. package/#Tools/APPIQ-METHOD/deployment/build/bmad-core/data/elicitation-methods.md +0 -134
  123. package/#Tools/APPIQ-METHOD/deployment/build/bmad-core/data/technical-preferences.md +0 -3
  124. package/#Tools/APPIQ-METHOD/deployment/build/bmad-core/tasks/advanced-elicitation.md +0 -117
  125. package/#Tools/APPIQ-METHOD/deployment/build/bmad-core/tasks/brownfield-create-epic.md +0 -160
  126. package/#Tools/APPIQ-METHOD/deployment/build/bmad-core/tasks/brownfield-create-story.md +0 -147
  127. package/#Tools/APPIQ-METHOD/deployment/build/bmad-core/tasks/correct-course.md +0 -70
  128. package/#Tools/APPIQ-METHOD/deployment/build/bmad-core/tasks/create-brownfield-story.md +0 -304
  129. package/#Tools/APPIQ-METHOD/deployment/build/bmad-core/tasks/create-deep-research-prompt.md +0 -289
  130. package/#Tools/APPIQ-METHOD/deployment/build/bmad-core/tasks/create-next-story.md +0 -112
  131. package/#Tools/APPIQ-METHOD/deployment/build/bmad-core/tasks/document-project.md +0 -341
  132. package/#Tools/APPIQ-METHOD/deployment/build/bmad-core/tasks/facilitate-brainstorming-session.md +0 -136
  133. package/#Tools/APPIQ-METHOD/deployment/build/bmad-core/tasks/generate-ai-frontend-prompt.md +0 -51
  134. package/#Tools/APPIQ-METHOD/deployment/build/bmad-core/tasks/index-docs.md +0 -179
  135. package/#Tools/APPIQ-METHOD/deployment/build/bmad-core/tasks/kb-mode-interaction.md +0 -75
  136. package/#Tools/APPIQ-METHOD/deployment/build/bmad-core/tasks/review-story.md +0 -145
  137. package/#Tools/APPIQ-METHOD/deployment/build/bmad-core/tasks/shard-doc.md +0 -187
  138. package/#Tools/APPIQ-METHOD/deployment/build/bmad-core/tasks/validate-next-story.md +0 -134
  139. package/#Tools/APPIQ-METHOD/deployment/build/bmad-core/templates/architecture-tmpl.yaml +0 -650
  140. package/#Tools/APPIQ-METHOD/deployment/build/bmad-core/templates/brainstorming-output-tmpl.yaml +0 -156
  141. package/#Tools/APPIQ-METHOD/deployment/build/bmad-core/templates/brownfield-architecture-tmpl.yaml +0 -476
  142. package/#Tools/APPIQ-METHOD/deployment/build/bmad-core/templates/brownfield-prd-tmpl.yaml +0 -280
  143. package/#Tools/APPIQ-METHOD/deployment/build/bmad-core/templates/competitor-analysis-tmpl.yaml +0 -293
  144. package/#Tools/APPIQ-METHOD/deployment/build/bmad-core/templates/front-end-architecture-tmpl.yaml +0 -206
  145. package/#Tools/APPIQ-METHOD/deployment/build/bmad-core/templates/front-end-spec-tmpl.yaml +0 -349
  146. package/#Tools/APPIQ-METHOD/deployment/build/bmad-core/templates/fullstack-architecture-tmpl.yaml +0 -805
  147. package/#Tools/APPIQ-METHOD/deployment/build/bmad-core/templates/market-research-tmpl.yaml +0 -252
  148. package/#Tools/APPIQ-METHOD/deployment/build/bmad-core/templates/prd-tmpl.yaml +0 -202
  149. package/#Tools/APPIQ-METHOD/deployment/build/bmad-core/templates/project-brief-tmpl.yaml +0 -221
  150. package/#Tools/APPIQ-METHOD/deployment/build/bmad-core/templates/story-tmpl.yaml +0 -137
  151. package/#Tools/APPIQ-METHOD/deployment/build/bmad-core/user-guide.md +0 -250
  152. package/#Tools/APPIQ-METHOD/deployment/build/bmad-core/workflows/brownfield-fullstack.yaml +0 -297
  153. package/#Tools/APPIQ-METHOD/deployment/build/bmad-core/workflows/brownfield-service.yaml +0 -187
  154. package/#Tools/APPIQ-METHOD/deployment/build/bmad-core/workflows/brownfield-ui.yaml +0 -197
  155. package/#Tools/APPIQ-METHOD/deployment/build/bmad-core/workflows/greenfield-fullstack.yaml +0 -240
  156. package/#Tools/APPIQ-METHOD/deployment/build/bmad-core/workflows/greenfield-service.yaml +0 -206
  157. package/#Tools/APPIQ-METHOD/deployment/build/bmad-core/workflows/greenfield-ui.yaml +0 -235
  158. package/#Tools/APPIQ-METHOD/deployment/build/bmad-core/working-in-the-brownfield.md +0 -361
  159. package/#Tools/APPIQ-METHOD/deployment/build/expansion-packs/README.md +0 -3
  160. package/#Tools/APPIQ-METHOD/deployment/build/expansion-packs/bmad-2d-phaser-game-dev/agent-teams/phaser-2d-nodejs-game-team.yaml +0 -13
  161. package/#Tools/APPIQ-METHOD/deployment/build/expansion-packs/bmad-2d-phaser-game-dev/agents/game-designer.md +0 -71
  162. package/#Tools/APPIQ-METHOD/deployment/build/expansion-packs/bmad-2d-phaser-game-dev/agents/game-developer.md +0 -78
  163. package/#Tools/APPIQ-METHOD/deployment/build/expansion-packs/bmad-2d-phaser-game-dev/agents/game-sm.md +0 -64
  164. package/#Tools/APPIQ-METHOD/deployment/build/expansion-packs/bmad-2d-phaser-game-dev/checklists/game-design-checklist.md +0 -201
  165. package/#Tools/APPIQ-METHOD/deployment/build/expansion-packs/bmad-2d-phaser-game-dev/checklists/game-story-dod-checklist.md +0 -160
  166. package/#Tools/APPIQ-METHOD/deployment/build/expansion-packs/bmad-2d-phaser-game-dev/config.yaml +0 -8
  167. package/#Tools/APPIQ-METHOD/deployment/build/expansion-packs/bmad-2d-phaser-game-dev/data/bmad-kb.md +0 -254
  168. package/#Tools/APPIQ-METHOD/deployment/build/expansion-packs/bmad-2d-phaser-game-dev/data/development-guidelines.md +0 -651
  169. package/#Tools/APPIQ-METHOD/deployment/build/expansion-packs/bmad-2d-phaser-game-dev/tasks/advanced-elicitation.md +0 -111
  170. package/#Tools/APPIQ-METHOD/deployment/build/expansion-packs/bmad-2d-phaser-game-dev/tasks/create-game-story.md +0 -216
  171. package/#Tools/APPIQ-METHOD/deployment/build/expansion-packs/bmad-2d-phaser-game-dev/tasks/game-design-brainstorming.md +0 -308
  172. package/#Tools/APPIQ-METHOD/deployment/build/expansion-packs/bmad-2d-phaser-game-dev/templates/game-architecture-tmpl.yaml +0 -613
  173. package/#Tools/APPIQ-METHOD/deployment/build/expansion-packs/bmad-2d-phaser-game-dev/templates/game-brief-tmpl.yaml +0 -356
  174. package/#Tools/APPIQ-METHOD/deployment/build/expansion-packs/bmad-2d-phaser-game-dev/templates/game-design-doc-tmpl.yaml +0 -343
  175. package/#Tools/APPIQ-METHOD/deployment/build/expansion-packs/bmad-2d-phaser-game-dev/templates/game-story-tmpl.yaml +0 -253
  176. package/#Tools/APPIQ-METHOD/deployment/build/expansion-packs/bmad-2d-phaser-game-dev/templates/level-design-doc-tmpl.yaml +0 -484
  177. package/#Tools/APPIQ-METHOD/deployment/build/expansion-packs/bmad-2d-phaser-game-dev/workflows/game-dev-greenfield.yaml +0 -183
  178. package/#Tools/APPIQ-METHOD/deployment/build/expansion-packs/bmad-2d-phaser-game-dev/workflows/game-prototype.yaml +0 -175
  179. package/#Tools/APPIQ-METHOD/deployment/build/expansion-packs/bmad-2d-unity-game-dev/agent-teams/unity-2d-game-team.yaml +0 -14
  180. package/#Tools/APPIQ-METHOD/deployment/build/expansion-packs/bmad-2d-unity-game-dev/agents/game-architect.md +0 -80
  181. package/#Tools/APPIQ-METHOD/deployment/build/expansion-packs/bmad-2d-unity-game-dev/agents/game-designer.md +0 -77
  182. package/#Tools/APPIQ-METHOD/deployment/build/expansion-packs/bmad-2d-unity-game-dev/agents/game-developer.md +0 -78
  183. package/#Tools/APPIQ-METHOD/deployment/build/expansion-packs/bmad-2d-unity-game-dev/agents/game-sm.md +0 -65
  184. package/#Tools/APPIQ-METHOD/deployment/build/expansion-packs/bmad-2d-unity-game-dev/checklists/game-architect-checklist.md +0 -396
  185. package/#Tools/APPIQ-METHOD/deployment/build/expansion-packs/bmad-2d-unity-game-dev/checklists/game-change-checklist.md +0 -203
  186. package/#Tools/APPIQ-METHOD/deployment/build/expansion-packs/bmad-2d-unity-game-dev/checklists/game-design-checklist.md +0 -201
  187. package/#Tools/APPIQ-METHOD/deployment/build/expansion-packs/bmad-2d-unity-game-dev/checklists/game-story-dod-checklist.md +0 -132
  188. package/#Tools/APPIQ-METHOD/deployment/build/expansion-packs/bmad-2d-unity-game-dev/config.yaml +0 -6
  189. package/#Tools/APPIQ-METHOD/deployment/build/expansion-packs/bmad-2d-unity-game-dev/data/bmad-kb.md +0 -776
  190. package/#Tools/APPIQ-METHOD/deployment/build/expansion-packs/bmad-2d-unity-game-dev/data/development-guidelines.md +0 -590
  191. package/#Tools/APPIQ-METHOD/deployment/build/expansion-packs/bmad-2d-unity-game-dev/tasks/advanced-elicitation.md +0 -111
  192. package/#Tools/APPIQ-METHOD/deployment/build/expansion-packs/bmad-2d-unity-game-dev/tasks/correct-course-game.md +0 -151
  193. package/#Tools/APPIQ-METHOD/deployment/build/expansion-packs/bmad-2d-unity-game-dev/tasks/create-game-story.md +0 -184
  194. package/#Tools/APPIQ-METHOD/deployment/build/expansion-packs/bmad-2d-unity-game-dev/tasks/game-design-brainstorming.md +0 -308
  195. package/#Tools/APPIQ-METHOD/deployment/build/expansion-packs/bmad-2d-unity-game-dev/tasks/validate-game-story.md +0 -200
  196. package/#Tools/APPIQ-METHOD/deployment/build/expansion-packs/bmad-2d-unity-game-dev/templates/game-architecture-tmpl.yaml +0 -1030
  197. package/#Tools/APPIQ-METHOD/deployment/build/expansion-packs/bmad-2d-unity-game-dev/templates/game-brief-tmpl.yaml +0 -356
  198. package/#Tools/APPIQ-METHOD/deployment/build/expansion-packs/bmad-2d-unity-game-dev/templates/game-design-doc-tmpl.yaml +0 -705
  199. package/#Tools/APPIQ-METHOD/deployment/build/expansion-packs/bmad-2d-unity-game-dev/templates/game-story-tmpl.yaml +0 -256
  200. package/#Tools/APPIQ-METHOD/deployment/build/expansion-packs/bmad-2d-unity-game-dev/templates/level-design-doc-tmpl.yaml +0 -484
  201. package/#Tools/APPIQ-METHOD/deployment/build/expansion-packs/bmad-2d-unity-game-dev/workflows/game-dev-greenfield.yaml +0 -183
  202. package/#Tools/APPIQ-METHOD/deployment/build/expansion-packs/bmad-2d-unity-game-dev/workflows/game-prototype.yaml +0 -175
  203. package/#Tools/APPIQ-METHOD/deployment/build/expansion-packs/bmad-infrastructure-devops/README.md +0 -147
  204. package/#Tools/APPIQ-METHOD/deployment/build/expansion-packs/bmad-infrastructure-devops/agents/infra-devops-platform.md +0 -71
  205. package/#Tools/APPIQ-METHOD/deployment/build/expansion-packs/bmad-infrastructure-devops/checklists/infrastructure-checklist.md +0 -484
  206. package/#Tools/APPIQ-METHOD/deployment/build/expansion-packs/bmad-infrastructure-devops/config.yaml +0 -9
  207. package/#Tools/APPIQ-METHOD/deployment/build/expansion-packs/bmad-infrastructure-devops/data/bmad-kb.md +0 -308
  208. package/#Tools/APPIQ-METHOD/deployment/build/expansion-packs/bmad-infrastructure-devops/tasks/review-infrastructure.md +0 -160
  209. package/#Tools/APPIQ-METHOD/deployment/build/expansion-packs/bmad-infrastructure-devops/tasks/validate-infrastructure.md +0 -154
  210. package/#Tools/APPIQ-METHOD/deployment/build/expansion-packs/bmad-infrastructure-devops/templates/infrastructure-architecture-tmpl.yaml +0 -424
  211. package/#Tools/APPIQ-METHOD/deployment/build/expansion-packs/bmad-infrastructure-devops/templates/infrastructure-platform-from-arch-tmpl.yaml +0 -629
  212. package/#Tools/APPIQ-METHOD/deployment/build/expansion-packs/bmad-mobile-app-dev/agent-teams/mobile-team-cross-platform.yaml +0 -22
  213. package/#Tools/APPIQ-METHOD/deployment/build/expansion-packs/bmad-mobile-app-dev/agent-teams/mobile-team-flutter.yaml +0 -20
  214. package/#Tools/APPIQ-METHOD/deployment/build/expansion-packs/bmad-mobile-app-dev/agent-teams/mobile-team-minimal.yaml +0 -13
  215. package/#Tools/APPIQ-METHOD/deployment/build/expansion-packs/bmad-mobile-app-dev/agent-teams/mobile-team-react-native.yaml +0 -20
  216. package/#Tools/APPIQ-METHOD/deployment/build/expansion-packs/bmad-mobile-app-dev/agents/mobile-analytics.md +0 -1487
  217. package/#Tools/APPIQ-METHOD/deployment/build/expansion-packs/bmad-mobile-app-dev/agents/mobile-architect.md +0 -279
  218. package/#Tools/APPIQ-METHOD/deployment/build/expansion-packs/bmad-mobile-app-dev/agents/mobile-developer.md +0 -649
  219. package/#Tools/APPIQ-METHOD/deployment/build/expansion-packs/bmad-mobile-app-dev/agents/mobile-pm.md +0 -339
  220. package/#Tools/APPIQ-METHOD/deployment/build/expansion-packs/bmad-mobile-app-dev/agents/mobile-qa.md +0 -622
  221. package/#Tools/APPIQ-METHOD/deployment/build/expansion-packs/bmad-mobile-app-dev/agents/mobile-security.md +0 -1027
  222. package/#Tools/APPIQ-METHOD/deployment/build/expansion-packs/bmad-mobile-app-dev/agents/mobile-ux-expert.md +0 -1451
  223. package/#Tools/APPIQ-METHOD/deployment/build/expansion-packs/bmad-mobile-app-dev/checklists/mobile-development-checklist.md +0 -490
  224. package/#Tools/APPIQ-METHOD/deployment/build/expansion-packs/bmad-mobile-app-dev/config.yaml +0 -54
  225. package/#Tools/APPIQ-METHOD/deployment/build/expansion-packs/bmad-mobile-app-dev/data/bmad-kb.md +0 -292
  226. package/#Tools/APPIQ-METHOD/deployment/build/expansion-packs/bmad-mobile-app-dev/data/flutter-development-guidelines.md +0 -483
  227. package/#Tools/APPIQ-METHOD/deployment/build/expansion-packs/bmad-mobile-app-dev/tasks/existing-app-analysis.md +0 -645
  228. package/#Tools/APPIQ-METHOD/deployment/build/expansion-packs/bmad-mobile-app-dev/tasks/platform-selection.md +0 -489
  229. package/#Tools/APPIQ-METHOD/deployment/build/expansion-packs/bmad-mobile-app-dev/templates/mobile-architecture-tmpl.yaml +0 -437
  230. package/#Tools/APPIQ-METHOD/deployment/build/expansion-packs/bmad-mobile-app-dev/templates/mobile-prd-tmpl.yaml +0 -408
  231. package/#Tools/APPIQ-METHOD/deployment/build/expansion-packs/bmad-mobile-app-dev/workflows/mobile-app-development-init.yaml +0 -555
  232. package/#Tools/APPIQ-METHOD/deployment/build/expansion-packs/bmad-mobile-app-dev/workflows/mobile-brownfield-flutter.yaml +0 -336
  233. package/#Tools/APPIQ-METHOD/deployment/build/expansion-packs/bmad-mobile-app-dev/workflows/mobile-brownfield-react-native.yaml +0 -345
  234. package/#Tools/APPIQ-METHOD/deployment/build/expansion-packs/bmad-mobile-app-dev/workflows/mobile-greenfield-flutter.yaml +0 -281
  235. package/#Tools/APPIQ-METHOD/deployment/build/expansion-packs/bmad-mobile-app-dev/workflows/mobile-greenfield-react-native.yaml +0 -283
  236. package/#Tools/APPIQ-METHOD/deployment/build/expansion-packs/bmad-mobile-app-dev/workflows/mobile-platform-selection.yaml +0 -404
  237. package/#Tools/APPIQ-METHOD/deployment/build/slash-commands/appiq.md +0 -273
  238. package/#Tools/APPIQ-METHOD/deployment/build/slash-commands/ide-integrations/claude-appiq.md +0 -294
  239. package/#Tools/APPIQ-METHOD/deployment/build/slash-commands/ide-integrations/cursor-appiq.md +0 -516
  240. package/#Tools/APPIQ-METHOD/deployment/build/slash-commands/ide-integrations/universal-appiq.md +0 -448
  241. package/#Tools/APPIQ-METHOD/deployment/build/slash-commands/ide-integrations/windsurf-appiq.md +0 -698
  242. package/#Tools/APPIQ-METHOD/deployment/build/slash-commands/start.md +0 -211
  243. package/#Tools/APPIQ-METHOD/deployment/build-release.sh +0 -449
  244. package/#Tools/APPIQ-METHOD/deployment/create-release.sh +0 -196
  245. package/#Tools/APPIQ-METHOD/deployment/dist/appiq_installer.sh +0 -678
  246. package/#Tools/APPIQ-METHOD/deployment/docs/main_prd.md +0 -36
  247. package/#Tools/APPIQ-METHOD/deployment/init_appiq.sh +0 -805
  248. package/#Tools/APPIQ-METHOD/deployment/init_appiq_v2.sh +0 -678
  249. package/#Tools/APPIQ-METHOD/deployment/installers/appiq-global.sh +0 -91
  250. package/#Tools/APPIQ-METHOD/deployment/installers/claude-integration.sh +0 -281
  251. package/#Tools/APPIQ-METHOD/deployment/installers/cursor-integration.sh +0 -257
  252. package/#Tools/APPIQ-METHOD/deployment/installers/terminal-integration.sh +0 -645
  253. package/#Tools/APPIQ-METHOD/deployment/installers/windsurf-integration.sh +0 -350
  254. package/#Tools/APPIQ-METHOD/deployment/package-v2.sh +0 -97
  255. package/#Tools/APPIQ-METHOD/deployment/package.sh +0 -363
  256. package/#Tools/APPIQ-METHOD/deployment/quick-install.sh +0 -57
  257. package/#Tools/APPIQ-METHOD/dist/expansion-packs/bmad-mobile-app-dev/agents/mobile-analytics.txt +0 -1530
  258. package/#Tools/APPIQ-METHOD/dist/expansion-packs/bmad-mobile-app-dev/agents/mobile-architect.txt +0 -322
  259. package/#Tools/APPIQ-METHOD/dist/expansion-packs/bmad-mobile-app-dev/agents/mobile-developer.txt +0 -692
  260. package/#Tools/APPIQ-METHOD/dist/expansion-packs/bmad-mobile-app-dev/agents/mobile-pm.txt +0 -382
  261. package/#Tools/APPIQ-METHOD/dist/expansion-packs/bmad-mobile-app-dev/agents/mobile-qa.txt +0 -665
  262. package/#Tools/APPIQ-METHOD/dist/expansion-packs/bmad-mobile-app-dev/agents/mobile-security.txt +0 -1070
  263. package/#Tools/APPIQ-METHOD/dist/expansion-packs/bmad-mobile-app-dev/agents/mobile-ux-expert.txt +0 -1494
  264. package/#Tools/APPIQ-METHOD/dist/expansion-packs/bmad-mobile-app-dev/teams/mobile-team-cross-platform.txt +0 -15613
  265. package/#Tools/APPIQ-METHOD/expansion-packs/bmad-mobile-app-dev/agent-teams/mobile-team-cross-platform.yaml +0 -22
  266. package/#Tools/APPIQ-METHOD/expansion-packs/bmad-mobile-app-dev/agent-teams/mobile-team-flutter.yaml +0 -20
  267. package/#Tools/APPIQ-METHOD/expansion-packs/bmad-mobile-app-dev/agent-teams/mobile-team-minimal.yaml +0 -13
  268. package/#Tools/APPIQ-METHOD/expansion-packs/bmad-mobile-app-dev/agent-teams/mobile-team-react-native.yaml +0 -20
  269. package/#Tools/APPIQ-METHOD/expansion-packs/bmad-mobile-app-dev/agents/mobile-analytics.md +0 -1487
  270. package/#Tools/APPIQ-METHOD/expansion-packs/bmad-mobile-app-dev/agents/mobile-architect.md +0 -279
  271. package/#Tools/APPIQ-METHOD/expansion-packs/bmad-mobile-app-dev/agents/mobile-developer.md +0 -649
  272. package/#Tools/APPIQ-METHOD/expansion-packs/bmad-mobile-app-dev/agents/mobile-pm.md +0 -339
  273. package/#Tools/APPIQ-METHOD/expansion-packs/bmad-mobile-app-dev/agents/mobile-qa.md +0 -622
  274. package/#Tools/APPIQ-METHOD/expansion-packs/bmad-mobile-app-dev/agents/mobile-security.md +0 -1027
  275. package/#Tools/APPIQ-METHOD/expansion-packs/bmad-mobile-app-dev/agents/mobile-ux-expert.md +0 -1451
  276. package/#Tools/APPIQ-METHOD/expansion-packs/bmad-mobile-app-dev/checklists/mobile-development-checklist.md +0 -490
  277. package/#Tools/APPIQ-METHOD/expansion-packs/bmad-mobile-app-dev/config.yaml +0 -54
  278. package/#Tools/APPIQ-METHOD/expansion-packs/bmad-mobile-app-dev/data/bmad-kb.md +0 -292
  279. package/#Tools/APPIQ-METHOD/expansion-packs/bmad-mobile-app-dev/data/flutter-development-guidelines.md +0 -483
  280. package/#Tools/APPIQ-METHOD/expansion-packs/bmad-mobile-app-dev/tasks/existing-app-analysis.md +0 -645
  281. package/#Tools/APPIQ-METHOD/expansion-packs/bmad-mobile-app-dev/tasks/platform-selection.md +0 -489
  282. package/#Tools/APPIQ-METHOD/expansion-packs/bmad-mobile-app-dev/templates/mobile-architecture-tmpl.yaml +0 -437
  283. package/#Tools/APPIQ-METHOD/expansion-packs/bmad-mobile-app-dev/templates/mobile-prd-tmpl.yaml +0 -408
  284. package/#Tools/APPIQ-METHOD/expansion-packs/bmad-mobile-app-dev/workflows/mobile-app-development-init.yaml +0 -555
  285. package/#Tools/APPIQ-METHOD/expansion-packs/bmad-mobile-app-dev/workflows/mobile-brownfield-flutter.yaml +0 -336
  286. package/#Tools/APPIQ-METHOD/expansion-packs/bmad-mobile-app-dev/workflows/mobile-brownfield-react-native.yaml +0 -345
  287. package/#Tools/APPIQ-METHOD/expansion-packs/bmad-mobile-app-dev/workflows/mobile-greenfield-flutter.yaml +0 -281
  288. package/#Tools/APPIQ-METHOD/expansion-packs/bmad-mobile-app-dev/workflows/mobile-greenfield-react-native.yaml +0 -283
  289. package/#Tools/APPIQ-METHOD/expansion-packs/bmad-mobile-app-dev/workflows/mobile-platform-selection.yaml +0 -404
  290. package/#Tools/APPIQ-METHOD/package-bmad-backup.json +0 -78
  291. package/#Tools/APPIQ-METHOD/slash-commands/appiq.md +0 -273
  292. package/#Tools/APPIQ-METHOD/slash-commands/ide-integrations/claude-appiq.md +0 -294
  293. package/#Tools/APPIQ-METHOD/slash-commands/ide-integrations/cursor-appiq.md +0 -516
  294. package/#Tools/APPIQ-METHOD/slash-commands/ide-integrations/universal-appiq.md +0 -448
  295. package/#Tools/APPIQ-METHOD/slash-commands/ide-integrations/windsurf-appiq.md +0 -698
  296. package/#Tools/APPIQ-METHOD/slash-commands/start.md +0 -211
  297. /package/#Tools/APPIQ-METHOD/{deployment/build/bmad-core/core-config.yaml → bmad-core/core-config.yaml.bak} +0 -0
@@ -0,0 +1,570 @@
1
+ #!/usr/bin/env node
2
+
3
+ const { Command } = require('commander');
4
+ const fs = require('fs-extra');
5
+ const path = require('node:path');
6
+ const { glob } = require('glob');
7
+ const { minimatch } = require('minimatch');
8
+
9
+ /**
10
+ * Recursively discover all files in a directory
11
+ * @param {string} rootDir - The root directory to scan
12
+ * @returns {Promise<string[]>} Array of file paths
13
+ */
14
+ async function discoverFiles(rootDir) {
15
+ try {
16
+ const gitignorePath = path.join(rootDir, '.gitignore');
17
+ const gitignorePatterns = await parseGitignore(gitignorePath);
18
+
19
+ // Common gitignore patterns that should always be ignored
20
+ const commonIgnorePatterns = [
21
+ // Version control
22
+ '.git/**',
23
+ '.svn/**',
24
+ '.hg/**',
25
+ '.bzr/**',
26
+
27
+ // Dependencies
28
+ 'node_modules/**',
29
+ 'bower_components/**',
30
+ 'vendor/**',
31
+ 'packages/**',
32
+
33
+ // Build outputs
34
+ 'build/**',
35
+ 'dist/**',
36
+ 'out/**',
37
+ 'target/**',
38
+ 'bin/**',
39
+ 'obj/**',
40
+ 'release/**',
41
+ 'debug/**',
42
+
43
+ // Environment and config
44
+ '.env',
45
+ '.env.*',
46
+ '*.env',
47
+ '.config',
48
+
49
+ // Logs
50
+ 'logs/**',
51
+ '*.log',
52
+ 'npm-debug.log*',
53
+ 'yarn-debug.log*',
54
+ 'yarn-error.log*',
55
+ 'lerna-debug.log*',
56
+
57
+ // Coverage and testing
58
+ 'coverage/**',
59
+ '.nyc_output/**',
60
+ '.coverage/**',
61
+ 'test-results/**',
62
+ 'junit.xml',
63
+
64
+ // Cache directories
65
+ '.cache/**',
66
+ '.tmp/**',
67
+ '.temp/**',
68
+ 'tmp/**',
69
+ 'temp/**',
70
+ '.sass-cache/**',
71
+ '.eslintcache',
72
+ '.stylelintcache',
73
+
74
+ // OS generated files
75
+ '.DS_Store',
76
+ '.DS_Store?',
77
+ '._*',
78
+ '.Spotlight-V100',
79
+ '.Trashes',
80
+ 'ehthumbs.db',
81
+ 'Thumbs.db',
82
+ 'desktop.ini',
83
+
84
+ // IDE and editor files
85
+ '.vscode/**',
86
+ '.idea/**',
87
+ '*.swp',
88
+ '*.swo',
89
+ '*~',
90
+ '.project',
91
+ '.classpath',
92
+ '.settings/**',
93
+ '*.sublime-project',
94
+ '*.sublime-workspace',
95
+
96
+ // Package manager files
97
+ 'package-lock.json',
98
+ 'yarn.lock',
99
+ 'pnpm-lock.yaml',
100
+ 'composer.lock',
101
+ 'Pipfile.lock',
102
+
103
+ // Runtime and compiled files
104
+ '*.pyc',
105
+ '*.pyo',
106
+ '*.pyd',
107
+ '__pycache__/**',
108
+ '*.class',
109
+ '*.jar',
110
+ '*.war',
111
+ '*.ear',
112
+ '*.o',
113
+ '*.so',
114
+ '*.dll',
115
+ '*.exe',
116
+
117
+ // Documentation build
118
+ '_site/**',
119
+ '.jekyll-cache/**',
120
+ '.jekyll-metadata',
121
+
122
+ // Flattener specific outputs
123
+ 'flattened-codebase.xml',
124
+ 'repomix-output.xml'
125
+ ];
126
+
127
+ const combinedIgnores = [
128
+ ...gitignorePatterns,
129
+ ...commonIgnorePatterns
130
+ ];
131
+
132
+ // Use glob to recursively find all files, excluding common ignore patterns
133
+ const files = await glob('**/*', {
134
+ cwd: rootDir,
135
+ nodir: true, // Only files, not directories
136
+ dot: true, // Include hidden files
137
+ follow: false, // Don't follow symbolic links
138
+ ignore: combinedIgnores
139
+ });
140
+
141
+ return files.map(file => path.resolve(rootDir, file));
142
+ } catch (error) {
143
+ console.error('Error discovering files:', error.message);
144
+ return [];
145
+ }
146
+ }
147
+
148
+ /**
149
+ * Parse .gitignore file and return ignore patterns
150
+ * @param {string} gitignorePath - Path to .gitignore file
151
+ * @returns {Promise<string[]>} Array of ignore patterns
152
+ */
153
+ async function parseGitignore(gitignorePath) {
154
+ try {
155
+ if (!await fs.pathExists(gitignorePath)) {
156
+ return [];
157
+ }
158
+
159
+ const content = await fs.readFile(gitignorePath, 'utf8');
160
+ return content
161
+ .split('\n')
162
+ .map(line => line.trim())
163
+ .filter(line => line && !line.startsWith('#')) // Remove empty lines and comments
164
+ .map(pattern => {
165
+ // Convert gitignore patterns to glob patterns
166
+ if (pattern.endsWith('/')) {
167
+ return pattern + '**';
168
+ }
169
+ return pattern;
170
+ });
171
+ } catch (error) {
172
+ console.error('Error parsing .gitignore:', error.message);
173
+ return [];
174
+ }
175
+ }
176
+
177
+ /**
178
+ * Check if a file is binary using file command and heuristics
179
+ * @param {string} filePath - Path to the file
180
+ * @returns {Promise<boolean>} True if file is binary
181
+ */
182
+ async function isBinaryFile(filePath) {
183
+ try {
184
+ // First check by file extension
185
+ const binaryExtensions = [
186
+ '.jpg', '.jpeg', '.png', '.gif', '.bmp', '.ico', '.svg',
187
+ '.pdf', '.doc', '.docx', '.xls', '.xlsx', '.ppt', '.pptx',
188
+ '.zip', '.tar', '.gz', '.rar', '.7z',
189
+ '.exe', '.dll', '.so', '.dylib',
190
+ '.mp3', '.mp4', '.avi', '.mov', '.wav',
191
+ '.ttf', '.otf', '.woff', '.woff2',
192
+ '.bin', '.dat', '.db', '.sqlite'
193
+ ];
194
+
195
+ const ext = path.extname(filePath).toLowerCase();
196
+ if (binaryExtensions.includes(ext)) {
197
+ return true;
198
+ }
199
+
200
+ // For files without clear extensions, try to read a small sample
201
+ const stats = await fs.stat(filePath);
202
+ if (stats.size === 0) {
203
+ return false; // Empty files are considered text
204
+ }
205
+
206
+ // Read first 1024 bytes to check for null bytes
207
+ const sampleSize = Math.min(1024, stats.size);
208
+ const buffer = await fs.readFile(filePath, { encoding: null, flag: 'r' });
209
+ const sample = buffer.slice(0, sampleSize);
210
+ // If we find null bytes, it's likely binary
211
+ return sample.includes(0);
212
+ } catch (error) {
213
+ console.warn(`Warning: Could not determine if file is binary: ${filePath} - ${error.message}`);
214
+ return false; // Default to text if we can't determine
215
+ }
216
+ }
217
+
218
+ /**
219
+ * Read and aggregate content from text files
220
+ * @param {string[]} files - Array of file paths
221
+ * @param {string} rootDir - The root directory
222
+ * @param {Object} spinner - Optional spinner instance for progress display
223
+ * @returns {Promise<Object>} Object containing file contents and metadata
224
+ */
225
+ async function aggregateFileContents(files, rootDir, spinner = null) {
226
+ const results = {
227
+ textFiles: [],
228
+ binaryFiles: [],
229
+ errors: [],
230
+ totalFiles: files.length,
231
+ processedFiles: 0
232
+ };
233
+
234
+ for (const filePath of files) {
235
+ try {
236
+ const relativePath = path.relative(rootDir, filePath);
237
+
238
+ // Update progress indicator
239
+ if (spinner) {
240
+ spinner.text = `Processing file ${results.processedFiles + 1}/${results.totalFiles}: ${relativePath}`;
241
+ }
242
+
243
+ const isBinary = await isBinaryFile(filePath);
244
+
245
+ if (isBinary) {
246
+ results.binaryFiles.push({
247
+ path: relativePath,
248
+ absolutePath: filePath,
249
+ size: (await fs.stat(filePath)).size
250
+ });
251
+ } else {
252
+ // Read text file content
253
+ const content = await fs.readFile(filePath, 'utf8');
254
+ results.textFiles.push({
255
+ path: relativePath,
256
+ absolutePath: filePath,
257
+ content: content,
258
+ size: content.length,
259
+ lines: content.split('\n').length
260
+ });
261
+ }
262
+
263
+ results.processedFiles++;
264
+ } catch (error) {
265
+ const relativePath = path.relative(rootDir, filePath);
266
+ const errorInfo = {
267
+ path: relativePath,
268
+ absolutePath: filePath,
269
+ error: error.message
270
+ };
271
+
272
+ results.errors.push(errorInfo);
273
+
274
+ // Log warning without interfering with spinner
275
+ if (spinner) {
276
+ spinner.warn(`Warning: Could not read file ${relativePath}: ${error.message}`);
277
+ } else {
278
+ console.warn(`Warning: Could not read file ${relativePath}: ${error.message}`);
279
+ }
280
+
281
+ results.processedFiles++;
282
+ }
283
+ }
284
+
285
+ return results;
286
+ }
287
+
288
+ /**
289
+ * Generate XML output with aggregated file contents using streaming
290
+ * @param {Object} aggregatedContent - The aggregated content object
291
+ * @param {string} outputPath - The output file path
292
+ * @returns {Promise<void>} Promise that resolves when writing is complete
293
+ */
294
+ async function generateXMLOutput(aggregatedContent, outputPath) {
295
+ const { textFiles } = aggregatedContent;
296
+
297
+ // Create write stream for efficient memory usage
298
+ const writeStream = fs.createWriteStream(outputPath, { encoding: 'utf8' });
299
+
300
+ return new Promise((resolve, reject) => {
301
+ writeStream.on('error', reject);
302
+ writeStream.on('finish', resolve);
303
+
304
+ // Write XML header
305
+ writeStream.write('<?xml version="1.0" encoding="UTF-8"?>\n');
306
+ writeStream.write('<files>\n');
307
+
308
+ // Process files one by one to minimize memory usage
309
+ let fileIndex = 0;
310
+
311
+ const writeNextFile = () => {
312
+ if (fileIndex >= textFiles.length) {
313
+ // All files processed, close XML and stream
314
+ writeStream.write('</files>\n');
315
+ writeStream.end();
316
+ return;
317
+ }
318
+
319
+ const file = textFiles[fileIndex];
320
+ fileIndex++;
321
+
322
+ // Write file opening tag
323
+ writeStream.write(` <file path="${escapeXml(file.path)}">`);
324
+
325
+ // Use CDATA for code content, handling CDATA end sequences properly
326
+ if (file.content?.trim()) {
327
+ const indentedContent = indentFileContent(file.content);
328
+ if (file.content.includes(']]>')) {
329
+ // If content contains ]]>, split it and wrap each part in CDATA
330
+ writeStream.write(splitAndWrapCDATA(indentedContent));
331
+ } else {
332
+ writeStream.write(`<![CDATA[\n${indentedContent}\n ]]>`);
333
+ }
334
+ } else if (file.content) {
335
+ // Handle empty or whitespace-only content
336
+ const indentedContent = indentFileContent(file.content);
337
+ writeStream.write(`<![CDATA[\n${indentedContent}\n ]]>`);
338
+ }
339
+
340
+ // Write file closing tag
341
+ writeStream.write('</file>\n');
342
+
343
+ // Continue with next file on next tick to avoid stack overflow
344
+ setImmediate(writeNextFile);
345
+ };
346
+
347
+ // Start processing files
348
+ writeNextFile();
349
+ });
350
+ }
351
+
352
+ /**
353
+ * Escape XML special characters for attributes
354
+ * @param {string} str - String to escape
355
+ * @returns {string} Escaped string
356
+ */
357
+ function escapeXml(str) {
358
+ if (typeof str !== 'string') {
359
+ return String(str);
360
+ }
361
+ return str
362
+ .replace(/&/g, '&amp;')
363
+ .replace(/</g, '&lt;')
364
+ .replace(/>/g, '&gt;')
365
+ .replace(/"/g, '&quot;')
366
+ .replace(/'/g, '&apos;');
367
+ }
368
+
369
+ /**
370
+ * Indent file content with 4 spaces for each line
371
+ * @param {string} content - Content to indent
372
+ * @returns {string} Indented content
373
+ */
374
+ function indentFileContent(content) {
375
+ if (typeof content !== 'string') {
376
+ return String(content);
377
+ }
378
+
379
+ // Split content into lines and add 4 spaces of indentation to each line
380
+ return content.split('\n').map(line => ` ${line}`).join('\n');
381
+ }
382
+
383
+ /**
384
+ * Split content containing ]]> and wrap each part in CDATA
385
+ * @param {string} content - Content to process
386
+ * @returns {string} Content with properly wrapped CDATA sections
387
+ */
388
+ function splitAndWrapCDATA(content) {
389
+ if (typeof content !== 'string') {
390
+ return String(content);
391
+ }
392
+
393
+ // Replace ]]> with ]]]]><![CDATA[> to escape it within CDATA
394
+ const escapedContent = content.replace(/]]>/g, ']]]]><![CDATA[>');
395
+ return `<![CDATA[
396
+ ${escapedContent}
397
+ ]]>`;
398
+ }
399
+
400
+ /**
401
+ * Calculate statistics for the processed files
402
+ * @param {Object} aggregatedContent - The aggregated content object
403
+ * @param {number} xmlFileSize - The size of the generated XML file in bytes
404
+ * @returns {Object} Statistics object
405
+ */
406
+ function calculateStatistics(aggregatedContent, xmlFileSize) {
407
+ const { textFiles, binaryFiles, errors } = aggregatedContent;
408
+
409
+ // Calculate total file size in bytes
410
+ const totalTextSize = textFiles.reduce((sum, file) => sum + file.size, 0);
411
+ const totalBinarySize = binaryFiles.reduce((sum, file) => sum + file.size, 0);
412
+ const totalSize = totalTextSize + totalBinarySize;
413
+
414
+ // Calculate total lines of code
415
+ const totalLines = textFiles.reduce((sum, file) => sum + file.lines, 0);
416
+
417
+ // Estimate token count (rough approximation: 1 token ā‰ˆ 4 characters)
418
+ const estimatedTokens = Math.ceil(xmlFileSize / 4);
419
+
420
+ // Format file size
421
+ const formatSize = (bytes) => {
422
+ if (bytes < 1024) return `${bytes} B`;
423
+ if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;
424
+ return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
425
+ };
426
+
427
+ return {
428
+ totalFiles: textFiles.length + binaryFiles.length,
429
+ textFiles: textFiles.length,
430
+ binaryFiles: binaryFiles.length,
431
+ errorFiles: errors.length,
432
+ totalSize: formatSize(totalSize),
433
+ xmlSize: formatSize(xmlFileSize),
434
+ totalLines,
435
+ estimatedTokens: estimatedTokens.toLocaleString()
436
+ };
437
+ }
438
+
439
+ /**
440
+ * Filter files based on .gitignore patterns
441
+ * @param {string[]} files - Array of file paths
442
+ * @param {string} rootDir - The root directory
443
+ * @returns {Promise<string[]>} Filtered array of file paths
444
+ */
445
+ async function filterFiles(files, rootDir) {
446
+ const gitignorePath = path.join(rootDir, '.gitignore');
447
+ const ignorePatterns = await parseGitignore(gitignorePath);
448
+
449
+ if (ignorePatterns.length === 0) {
450
+ return files;
451
+ }
452
+
453
+ // Convert absolute paths to relative for pattern matching
454
+ const relativeFiles = files.map(file => path.relative(rootDir, file));
455
+
456
+ // Separate positive and negative patterns
457
+ const positivePatterns = ignorePatterns.filter(p => !p.startsWith('!'));
458
+ const negativePatterns = ignorePatterns.filter(p => p.startsWith('!')).map(p => p.slice(1));
459
+
460
+ // Filter out files that match ignore patterns
461
+ const filteredRelative = [];
462
+
463
+ for (const file of relativeFiles) {
464
+ let shouldIgnore = false;
465
+
466
+ // First check positive patterns (ignore these files)
467
+ for (const pattern of positivePatterns) {
468
+ if (minimatch(file, pattern)) {
469
+ shouldIgnore = true;
470
+ break;
471
+ }
472
+ }
473
+
474
+ // Then check negative patterns (don't ignore these files even if they match positive patterns)
475
+ if (shouldIgnore) {
476
+ for (const pattern of negativePatterns) {
477
+ if (minimatch(file, pattern)) {
478
+ shouldIgnore = false;
479
+ break;
480
+ }
481
+ }
482
+ }
483
+
484
+ if (!shouldIgnore) {
485
+ filteredRelative.push(file);
486
+ }
487
+ }
488
+
489
+ // Convert back to absolute paths
490
+ return filteredRelative.map(file => path.resolve(rootDir, file));
491
+ }
492
+
493
+ const program = new Command();
494
+
495
+ program
496
+ .name('bmad-flatten')
497
+ .description('BMad-Method codebase flattener tool')
498
+ .version('1.0.0')
499
+ .option('-i, --input <path>', 'Input directory to flatten', process.cwd())
500
+ .option('-o, --output <path>', 'Output file path', 'flattened-codebase.xml')
501
+ .action(async (options) => {
502
+ const inputDir = path.resolve(options.input);
503
+ const outputPath = path.resolve(options.output);
504
+
505
+ console.log(`Flattening codebase from: ${inputDir}`);
506
+ console.log(`Output file: ${outputPath}`);
507
+
508
+ try {
509
+ // Verify input directory exists
510
+ if (!await fs.pathExists(inputDir)) {
511
+ console.error(`āŒ Error: Input directory does not exist: ${inputDir}`);
512
+ process.exit(1);
513
+ }
514
+
515
+ // Import ora dynamically
516
+ const { default: ora } = await import('ora');
517
+
518
+ // Start file discovery with spinner
519
+ const discoverySpinner = ora('šŸ” Discovering files...').start();
520
+ const files = await discoverFiles(inputDir);
521
+ const filteredFiles = await filterFiles(files, inputDir);
522
+ discoverySpinner.succeed(`šŸ“ Found ${filteredFiles.length} files to include`);
523
+
524
+ // Process files with progress tracking
525
+ console.log('Reading file contents');
526
+ const processingSpinner = ora('šŸ“„ Processing files...').start();
527
+ const aggregatedContent = await aggregateFileContents(filteredFiles, inputDir, processingSpinner);
528
+ processingSpinner.succeed(`āœ… Processed ${aggregatedContent.processedFiles}/${filteredFiles.length} files`);
529
+
530
+ // Log processing results for test validation
531
+ console.log(`Processed ${aggregatedContent.processedFiles}/${filteredFiles.length} files`);
532
+ if (aggregatedContent.errors.length > 0) {
533
+ console.log(`Errors: ${aggregatedContent.errors.length}`);
534
+ }
535
+ console.log(`Text files: ${aggregatedContent.textFiles.length}`);
536
+ if (aggregatedContent.binaryFiles.length > 0) {
537
+ console.log(`Binary files: ${aggregatedContent.binaryFiles.length}`);
538
+ }
539
+
540
+ // Generate XML output using streaming
541
+ const xmlSpinner = ora('šŸ”§ Generating XML output...').start();
542
+ await generateXMLOutput(aggregatedContent, outputPath);
543
+ xmlSpinner.succeed('šŸ“ XML generation completed');
544
+
545
+ // Calculate and display statistics
546
+ const outputStats = await fs.stat(outputPath);
547
+ const stats = calculateStatistics(aggregatedContent, outputStats.size);
548
+
549
+ // Display completion summary
550
+ console.log('\nšŸ“Š Completion Summary:');
551
+ console.log(`āœ… Successfully processed ${filteredFiles.length} files into ${path.basename(outputPath)}`);
552
+ console.log(`šŸ“ Output file: ${outputPath}`);
553
+ console.log(`šŸ“ Total source size: ${stats.totalSize}`);
554
+ console.log(`šŸ“„ Generated XML size: ${stats.xmlSize}`);
555
+ console.log(`šŸ“ Total lines of code: ${stats.totalLines.toLocaleString()}`);
556
+ console.log(`šŸ”¢ Estimated tokens: ${stats.estimatedTokens}`);
557
+ console.log(`šŸ“Š File breakdown: ${stats.textFiles} text, ${stats.binaryFiles} binary, ${stats.errorFiles} errors`);
558
+
559
+ } catch (error) {
560
+ console.error('āŒ Critical error:', error.message);
561
+ console.error('An unexpected error occurred.');
562
+ process.exit(1);
563
+ }
564
+ });
565
+
566
+ if (require.main === module) {
567
+ program.parse();
568
+ }
569
+
570
+ module.exports = program;
@@ -33,20 +33,7 @@ try {
33
33
 
34
34
  program
35
35
  .version(version)
36
- .description('BMad Method installer - Universal AI agent framework for any domain')
37
- .action(async () => {
38
- // Default action when no command is provided - start interactive installation
39
- try {
40
- const answers = await promptInstallation();
41
- if (!answers._alreadyInstalled) {
42
- await installer.install(answers);
43
- process.exit(0);
44
- }
45
- } catch (error) {
46
- console.error(chalk.red('Installation failed:'), error.message);
47
- process.exit(1);
48
- }
49
- });
36
+ .description('BMad Method installer - Universal AI agent framework for any domain');
50
37
 
51
38
  program
52
39
  .command('install')
@@ -123,6 +110,20 @@ program
123
110
  }
124
111
  });
125
112
 
113
+ program
114
+ .command('flatten')
115
+ .description('Flatten codebase to XML format')
116
+ .option('-i, --input <path>', 'Input directory to flatten', process.cwd())
117
+ .option('-o, --output <path>', 'Output file path', 'flattened-codebase.xml')
118
+ .action(async (options) => {
119
+ try {
120
+ await installer.flatten(options);
121
+ } catch (error) {
122
+ console.error(chalk.red('Flatten failed:'), error.message);
123
+ process.exit(1);
124
+ }
125
+ });
126
+
126
127
  async function promptInstallation() {
127
128
 
128
129
  // Display ASCII logo
@@ -497,7 +497,7 @@ class Installer {
497
497
  case "reinstall":
498
498
  // For reinstall, don't check for modifications - just overwrite
499
499
  return await this.performReinstall(config, installDir, spinner);
500
- case "expansions":
500
+ case "expansions": {
501
501
  // Ask which expansion packs to install
502
502
  const availableExpansionPacks = await resourceLocator.getExpansionPacks();
503
503
 
@@ -534,6 +534,7 @@ class Installer {
534
534
  console.log(chalk.green(` - ${packId} → .${packId}/`));
535
535
  }
536
536
  return;
537
+ }
537
538
  case "cancel":
538
539
  console.log("Installation cancelled.");
539
540
  return;
@@ -865,6 +866,8 @@ class Installer {
865
866
  }).join(", ");
866
867
  console.log(chalk.green(`āœ“ IDE rules and configurations set up for: ${ideNames}`));
867
868
  }
869
+
870
+
868
871
 
869
872
  // Information about web bundles
870
873
  if (!config.includeWebBundles) {
@@ -1428,7 +1431,7 @@ class Installer {
1428
1431
  return config.selectedWebBundleTeams ?
1429
1432
  `teams: ${config.selectedWebBundleTeams.join(', ')}` :
1430
1433
  'selected teams';
1431
- case 'custom':
1434
+ case 'custom': {
1432
1435
  const parts = [];
1433
1436
  if (config.selectedWebBundleTeams && config.selectedWebBundleTeams.length > 0) {
1434
1437
  parts.push(`teams: ${config.selectedWebBundleTeams.join(', ')}`);
@@ -1437,6 +1440,7 @@ class Installer {
1437
1440
  parts.push('individual agents');
1438
1441
  }
1439
1442
  return parts.length > 0 ? parts.join(' + ') : 'custom selection';
1443
+ }
1440
1444
  default:
1441
1445
  return 'selected bundles';
1442
1446
  }
@@ -1741,6 +1745,28 @@ class Installer {
1741
1745
 
1742
1746
  return null;
1743
1747
  }
1748
+
1749
+ async flatten(options) {
1750
+ const { spawn } = require('child_process');
1751
+ const flattenerPath = path.join(__dirname, '..', '..', 'flattener', 'main.js');
1752
+
1753
+ const args = [];
1754
+ if (options.input) {
1755
+ args.push('--input', options.input);
1756
+ }
1757
+ if (options.output) {
1758
+ args.push('--output', options.output);
1759
+ }
1760
+
1761
+ const child = spawn('node', [flattenerPath, ...args], {
1762
+ stdio: 'inherit',
1763
+ cwd: process.cwd()
1764
+ });
1765
+
1766
+ child.on('exit', (code) => {
1767
+ process.exit(code);
1768
+ });
1769
+ }
1744
1770
  }
1745
1771
 
1746
1772
  module.exports = new Installer();