bmad-plus 0.9.0 → 0.9.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 (192) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/LICENSE +21 -21
  3. package/README.md +105 -85
  4. package/osint-agent-package/README.md +88 -88
  5. package/osint-agent-package/SETUP_KEYS.md +108 -108
  6. package/osint-agent-package/agents/osint-investigator.md +80 -80
  7. package/osint-agent-package/install.ps1 +87 -87
  8. package/osint-agent-package/install.sh +76 -76
  9. package/osint-agent-package/skills/bmad-osint-investigate/SKILL.md +147 -147
  10. package/osint-agent-package/skills/bmad-osint-investigate/osint/references/enrichment-databases-fr.md +148 -148
  11. package/osint-agent-package/skills/bmad-osint-investigate/osint/scripts/_http.py +101 -101
  12. package/osint-agent-package/skills/bmad-osint-investigate/osint/scripts/apify.py +266 -266
  13. package/osint-agent-package/skills/bmad-osint-investigate/osint/scripts/brightdata.py +101 -101
  14. package/osint-agent-package/skills/bmad-osint-investigate/osint/scripts/diagnose.py +141 -141
  15. package/osint-agent-package/skills/bmad-osint-investigate/osint/scripts/exa.py +79 -79
  16. package/osint-agent-package/skills/bmad-osint-investigate/osint/scripts/jina.py +71 -71
  17. package/osint-agent-package/skills/bmad-osint-investigate/osint/scripts/parallel.py +85 -85
  18. package/osint-agent-package/skills/bmad-osint-investigate/osint/scripts/perplexity.py +102 -102
  19. package/osint-agent-package/skills/bmad-osint-investigate/osint/scripts/tavily.py +72 -72
  20. package/osint-agent-package/skills/bmad-osint-investigate/osint/scripts/volley.py +208 -208
  21. package/osint-agent-package/skills/bmad-osint-investigator/SKILL.md +15 -15
  22. package/package.json +30 -3
  23. package/readme-international/README.de.md +8 -3
  24. package/readme-international/README.es.md +8 -3
  25. package/readme-international/README.fr.md +8 -3
  26. package/src/bmad-plus/agents/agent-architect-dev/SKILL.md +96 -96
  27. package/src/bmad-plus/agents/agent-architect-dev/bmad-skill-manifest.yaml +13 -13
  28. package/src/bmad-plus/agents/agent-maker/SKILL.md +201 -201
  29. package/src/bmad-plus/agents/agent-maker/bmad-skill-manifest.yaml +13 -13
  30. package/src/bmad-plus/agents/agent-orchestrator/SKILL.md +137 -137
  31. package/src/bmad-plus/agents/agent-orchestrator/bmad-skill-manifest.yaml +13 -13
  32. package/src/bmad-plus/agents/agent-quality/SKILL.md +83 -83
  33. package/src/bmad-plus/agents/agent-quality/bmad-skill-manifest.yaml +13 -13
  34. package/src/bmad-plus/agents/agent-shadow/SKILL.md +71 -71
  35. package/src/bmad-plus/agents/agent-shadow/bmad-skill-manifest.yaml +13 -13
  36. package/src/bmad-plus/agents/agent-strategist/SKILL.md +80 -80
  37. package/src/bmad-plus/agents/agent-strategist/bmad-skill-manifest.yaml +13 -13
  38. package/src/bmad-plus/data/role-triggers.yaml +209 -209
  39. package/src/bmad-plus/module-help.csv +10 -10
  40. package/src/bmad-plus/packs/pack-memory/README.md +106 -106
  41. package/src/bmad-plus/packs/pack-memory/memory-orchestrator.md +79 -79
  42. package/src/bmad-plus/packs/pack-memory/shared/karpathy-guardrails.md +86 -86
  43. package/src/bmad-plus/packs/pack-memory/shared/memory-protocol.md +143 -143
  44. package/src/bmad-plus/packs/pack-memory/templates/context.md +39 -39
  45. package/src/bmad-plus/packs/pack-memory/templates/decisions.md +25 -25
  46. package/src/bmad-plus/packs/pack-memory/templates/identity.yaml +39 -39
  47. package/src/bmad-plus/packs/pack-memory/templates/lessons.md +31 -31
  48. package/src/bmad-plus/packs/pack-memory/templates/patterns.md +24 -24
  49. package/src/bmad-plus/packs/pack-memory/templates/session-handoff.md +25 -25
  50. package/src/bmad-plus/packs/pack-memory/zecher-agent.md +157 -157
  51. package/src/bmad-plus/packs/pack-seo/bmad-skill-manifest.yaml +13 -13
  52. package/src/bmad-plus/packs/pack-shield/README.md +110 -110
  53. package/src/bmad-plus/packs/pack-shield/SKILL.md +82 -82
  54. package/src/bmad-plus/packs/pack-shield/categories/accessibility-esg/csrd-agent.md +251 -251
  55. package/src/bmad-plus/packs/pack-shield/categories/accessibility-esg/section508-agent.md +168 -168
  56. package/src/bmad-plus/packs/pack-shield/categories/accessibility-esg/wcag-agent.md +190 -190
  57. package/src/bmad-plus/packs/pack-shield/categories/ai-governance/eu-ai-act-agent.md +86 -86
  58. package/src/bmad-plus/packs/pack-shield/categories/ai-governance/iso42001-agent.md +240 -240
  59. package/src/bmad-plus/packs/pack-shield/categories/ai-governance/nist-ai-rmf-agent.md +122 -122
  60. package/src/bmad-plus/packs/pack-shield/categories/cybersecurity/cis-controls-agent.md +210 -210
  61. package/src/bmad-plus/packs/pack-shield/categories/cybersecurity/ism-agent.md +139 -139
  62. package/src/bmad-plus/packs/pack-shield/categories/cybersecurity/iso27001-agent.md +156 -156
  63. package/src/bmad-plus/packs/pack-shield/categories/cybersecurity/nis2-agent.md +72 -72
  64. package/src/bmad-plus/packs/pack-shield/categories/cybersecurity/nist-800-53-agent.md +239 -239
  65. package/src/bmad-plus/packs/pack-shield/categories/cybersecurity/nist-csf-agent.md +207 -207
  66. package/src/bmad-plus/packs/pack-shield/categories/data-privacy/ccpa-agent.md +94 -94
  67. package/src/bmad-plus/packs/pack-shield/categories/data-privacy/dpdpa-agent.md +136 -136
  68. package/src/bmad-plus/packs/pack-shield/categories/data-privacy/gdpr-agent.md +296 -296
  69. package/src/bmad-plus/packs/pack-shield/categories/data-privacy/iso27701-agent.md +134 -134
  70. package/src/bmad-plus/packs/pack-shield/categories/data-privacy/lgpd-agent.md +129 -129
  71. package/src/bmad-plus/packs/pack-shield/categories/defense-export/cmmc-agent.md +116 -116
  72. package/src/bmad-plus/packs/pack-shield/categories/defense-export/ear-agent.md +261 -261
  73. package/src/bmad-plus/packs/pack-shield/categories/defense-export/itar-agent.md +191 -191
  74. package/src/bmad-plus/packs/pack-shield/categories/defense-export/tsa-agent.md +356 -356
  75. package/src/bmad-plus/packs/pack-shield/categories/industry-compliance/dora-agent.md +499 -499
  76. package/src/bmad-plus/packs/pack-shield/categories/industry-compliance/fedramp-agent.md +236 -236
  77. package/src/bmad-plus/packs/pack-shield/categories/industry-compliance/hipaa-agent.md +162 -162
  78. package/src/bmad-plus/packs/pack-shield/categories/industry-compliance/pci-dss-agent.md +228 -228
  79. package/src/bmad-plus/packs/pack-shield/categories/industry-compliance/soc2-agent.md +255 -255
  80. package/src/bmad-plus/packs/pack-shield/categories/industry-compliance/swift-csp-agent.md +153 -153
  81. package/src/bmad-plus/packs/pack-shield/categories/workflows/ai-act-classifier.md +131 -131
  82. package/src/bmad-plus/packs/pack-shield/categories/workflows/ai-act-fria.md +155 -155
  83. package/src/bmad-plus/packs/pack-shield/categories/workflows/ai-act-incidents.md +187 -187
  84. package/src/bmad-plus/packs/pack-shield/categories/workflows/ai-act-roles.md +113 -113
  85. package/src/bmad-plus/packs/pack-shield/categories/workflows/breach-sentinel.md +197 -197
  86. package/src/bmad-plus/packs/pack-shield/categories/workflows/cookie-policy-gen.md +180 -180
  87. package/src/bmad-plus/packs/pack-shield/categories/workflows/dpia-sentinel.md +235 -235
  88. package/src/bmad-plus/packs/pack-shield/categories/workflows/legitimate-interest.md +159 -159
  89. package/src/bmad-plus/packs/pack-shield/categories/workflows/privacy-advisor.md +133 -133
  90. package/src/bmad-plus/packs/pack-shield/categories/workflows/privacy-notice-gen.md +160 -160
  91. package/src/bmad-plus/packs/pack-shield/categories/workflows/privacy-policy-gen.md +135 -135
  92. package/src/bmad-plus/packs/pack-shield/references/ccpa/ccpa-gdpr-comparison.md +117 -117
  93. package/src/bmad-plus/packs/pack-shield/references/ccpa/consumer-rights-workflows.md +177 -177
  94. package/src/bmad-plus/packs/pack-shield/references/cis-controls/framework-mappings.md +162 -162
  95. package/src/bmad-plus/packs/pack-shield/references/cis-controls/implementation-guidance.md +235 -235
  96. package/src/bmad-plus/packs/pack-shield/references/cis-controls/safeguards-detail.md +252 -252
  97. package/src/bmad-plus/packs/pack-shield/references/cmmc/cmmc-assessment.md +170 -170
  98. package/src/bmad-plus/packs/pack-shield/references/cmmc/cmmc-levels.md +113 -113
  99. package/src/bmad-plus/packs/pack-shield/references/cmmc/cmmc-practices.md +211 -211
  100. package/src/bmad-plus/packs/pack-shield/references/csrd/compliance-program.md +281 -281
  101. package/src/bmad-plus/packs/pack-shield/references/csrd/double-materiality.md +253 -253
  102. package/src/bmad-plus/packs/pack-shield/references/csrd/esrs-standards.md +401 -401
  103. package/src/bmad-plus/packs/pack-shield/references/dora/article-reference.md +441 -441
  104. package/src/bmad-plus/packs/pack-shield/references/dora/incident-classification.md +297 -297
  105. package/src/bmad-plus/packs/pack-shield/references/dora/rts-its-guide.md +306 -306
  106. package/src/bmad-plus/packs/pack-shield/references/dora/third-party-risk.md +349 -349
  107. package/src/bmad-plus/packs/pack-shield/references/dpdpa/gdpr-comparison.md +173 -173
  108. package/src/bmad-plus/packs/pack-shield/references/dpdpa/rights-and-obligations.md +426 -426
  109. package/src/bmad-plus/packs/pack-shield/references/dpdpa/rules-2025.md +599 -599
  110. package/src/bmad-plus/packs/pack-shield/references/dpdpa/sections-reference.md +319 -319
  111. package/src/bmad-plus/packs/pack-shield/references/ear/ccl-eccn-guide.md +250 -250
  112. package/src/bmad-plus/packs/pack-shield/references/ear/compliance-program.md +280 -280
  113. package/src/bmad-plus/packs/pack-shield/references/ear/license-exceptions.md +207 -207
  114. package/src/bmad-plus/packs/pack-shield/references/eu-ai-act/gpai-governance.md +267 -267
  115. package/src/bmad-plus/packs/pack-shield/references/eu-ai-act/obligations-high-risk.md +287 -287
  116. package/src/bmad-plus/packs/pack-shield/references/eu-ai-act/risk-classification.md +182 -182
  117. package/src/bmad-plus/packs/pack-shield/references/fedramp/appendices-guide.md +209 -209
  118. package/src/bmad-plus/packs/pack-shield/references/fedramp/control-families.md +281 -281
  119. package/src/bmad-plus/packs/pack-shield/references/fedramp/poam-guide.md +93 -93
  120. package/src/bmad-plus/packs/pack-shield/references/fedramp/readiness-checklist.md +134 -134
  121. package/src/bmad-plus/packs/pack-shield/references/fedramp/sap-sar-guide.md +86 -86
  122. package/src/bmad-plus/packs/pack-shield/references/fedramp/ssp-guide.md +129 -129
  123. package/src/bmad-plus/packs/pack-shield/references/gdpr-compliance/documents.md +192 -192
  124. package/src/bmad-plus/packs/pack-shield/references/gdpr-compliance/dpa-template.md +121 -121
  125. package/src/bmad-plus/packs/pack-shield/references/gdpr-compliance/privacy-notice.md +87 -87
  126. package/src/bmad-plus/packs/pack-shield/references/hipaa-compliance/breach-notification.md +293 -293
  127. package/src/bmad-plus/packs/pack-shield/references/hipaa-compliance/privacy-rule.md +276 -276
  128. package/src/bmad-plus/packs/pack-shield/references/hipaa-compliance/security-rule.md +299 -299
  129. package/src/bmad-plus/packs/pack-shield/references/hipaa-compliance/templates.md +568 -568
  130. package/src/bmad-plus/packs/pack-shield/references/ism/control-applicability.md +181 -181
  131. package/src/bmad-plus/packs/pack-shield/references/ism/guidelines-overview.md +183 -183
  132. package/src/bmad-plus/packs/pack-shield/references/iso27001/annex-a-2013.md +203 -203
  133. package/src/bmad-plus/packs/pack-shield/references/iso27001/annex-a-2022.md +132 -132
  134. package/src/bmad-plus/packs/pack-shield/references/iso27001/control-mapping.md +153 -153
  135. package/src/bmad-plus/packs/pack-shield/references/iso27701/annex-a-controls.md +195 -195
  136. package/src/bmad-plus/packs/pack-shield/references/iso27701/regulatory-mapping.md +229 -229
  137. package/src/bmad-plus/packs/pack-shield/references/iso27701/transition-guide.md +219 -219
  138. package/src/bmad-plus/packs/pack-shield/references/iso42001/iso42001-ai-risk-assessment.md +258 -258
  139. package/src/bmad-plus/packs/pack-shield/references/iso42001/iso42001-clauses-requirements.md +279 -279
  140. package/src/bmad-plus/packs/pack-shield/references/iso42001/iso42001-controls-annex-a.md +155 -155
  141. package/src/bmad-plus/packs/pack-shield/references/itar/compliance-program.md +174 -174
  142. package/src/bmad-plus/packs/pack-shield/references/itar/licensing-guide.md +146 -146
  143. package/src/bmad-plus/packs/pack-shield/references/itar/usml-categories.md +93 -93
  144. package/src/bmad-plus/packs/pack-shield/references/lgpd/anpd-enforcement.md +147 -147
  145. package/src/bmad-plus/packs/pack-shield/references/lgpd/compliance-program.md +272 -272
  146. package/src/bmad-plus/packs/pack-shield/references/lgpd/lgpd-articles.md +271 -271
  147. package/src/bmad-plus/packs/pack-shield/references/nis2/article-21-measures.md +153 -153
  148. package/src/bmad-plus/packs/pack-shield/references/nis2/iso27001-nis2-mapping.md +68 -68
  149. package/src/bmad-plus/packs/pack-shield/references/nist-800-53/assessment-rmf.md +349 -349
  150. package/src/bmad-plus/packs/pack-shield/references/nist-800-53/baselines-tailoring.md +277 -277
  151. package/src/bmad-plus/packs/pack-shield/references/nist-800-53/control-families.md +450 -450
  152. package/src/bmad-plus/packs/pack-shield/references/nist-ai-rmf/rmf-core.md +361 -361
  153. package/src/bmad-plus/packs/pack-shield/references/nist-ai-rmf/rmf-profiles.md +192 -192
  154. package/src/bmad-plus/packs/pack-shield/references/nist-csf/csf-10-to-20-mapping.md +143 -143
  155. package/src/bmad-plus/packs/pack-shield/references/nist-csf/csf-20-functions-categories.md +278 -278
  156. package/src/bmad-plus/packs/pack-shield/references/nist-csf/csf-implementation-tiers.md +135 -135
  157. package/src/bmad-plus/packs/pack-shield/references/pci-compliance/pci-dss-requirements.md +366 -366
  158. package/src/bmad-plus/packs/pack-shield/references/pci-compliance/pci-dss-saq-guide.md +217 -217
  159. package/src/bmad-plus/packs/pack-shield/references/pci-compliance/pci-dss-v4-changes.md +190 -190
  160. package/src/bmad-plus/packs/pack-shield/references/section-508/wcag-mapping.md +160 -160
  161. package/src/bmad-plus/packs/pack-shield/references/soc2/controls.md +241 -241
  162. package/src/bmad-plus/packs/pack-shield/references/soc2/evidence.md +236 -236
  163. package/src/bmad-plus/packs/pack-shield/references/soc2/policies.md +254 -254
  164. package/src/bmad-plus/packs/pack-shield/references/soc2/vendor.md +276 -276
  165. package/src/bmad-plus/packs/pack-shield/references/swift-csp/swift-assessment.md +202 -202
  166. package/src/bmad-plus/packs/pack-shield/references/swift-csp/swift-controls.md +545 -545
  167. package/src/bmad-plus/packs/pack-shield/references/tsa-compliance/tsa-crmp-requirements.md +359 -359
  168. package/src/bmad-plus/packs/pack-shield/references/tsa-compliance/tsa-directives-overview.md +187 -187
  169. package/src/bmad-plus/packs/pack-shield/references/tsa-compliance/tsa-incident-reporting.md +187 -187
  170. package/src/bmad-plus/packs/pack-shield/references/wcag/criteria-detail.md +510 -510
  171. package/src/bmad-plus/packs/pack-shield/shared/audit-report-template.md +103 -103
  172. package/src/bmad-plus/packs/pack-shield/shared/cross-framework-mapper.md +103 -103
  173. package/src/bmad-plus/packs/pack-shield/shared/gap-analysis-template.md +83 -83
  174. package/src/bmad-plus/packs/pack-shield/shield-orchestrator.md +229 -229
  175. package/src/bmad-plus/packs/pack-shield/upstream-sync.yaml +68 -68
  176. package/src/bmad-plus/skills/bmad-plus-autopilot/SKILL.md +99 -99
  177. package/src/bmad-plus/skills/bmad-plus-parallel/SKILL.md +93 -93
  178. package/src/bmad-plus/skills/bmad-plus-sync/SKILL.md +69 -69
  179. package/tools/cli/bmad-plus-cli.js +5 -3
  180. package/tools/cli/commands/autoconfig.js +5 -58
  181. package/tools/cli/commands/doctor.js +2 -0
  182. package/tools/cli/commands/install.js +9 -128
  183. package/tools/cli/commands/memory.js +1 -0
  184. package/tools/cli/commands/scan.js +26 -41
  185. package/tools/cli/commands/uninstall.js +7 -4
  186. package/tools/cli/commands/update.js +2 -1
  187. package/tools/cli/lib/ide-config.js +259 -0
  188. package/tools/cli/lib/memory-init.js +0 -1
  189. package/tools/cli/lib/pack-copy.js +84 -84
  190. package/tools/cli/lib/packs.js +114 -114
  191. package/tools/cli/lib/stack-detect.js +102 -0
  192. package/tools/cli/lib/validate.js +45 -0
@@ -1,84 +1,84 @@
1
- /**
2
- * BMAD+ Shared Pack-Copy Module
3
- * Extracted duplicate file-copy loops from install.js and update.js.
4
- *
5
- * Author: Laurent Rochetta
6
- */
7
-
8
- const path = require('node:path');
9
- const fs = require('node:fs');
10
- const fsExtra = require('fs-extra');
11
-
12
- /**
13
- * Copy files for a single pack definition into the target directories.
14
- *
15
- * @param {object} opts
16
- * @param {string} opts.bmadSrc - Path to src/bmad-plus/
17
- * @param {string} opts.targetAgentsDir - Destination for agents / skills
18
- * @param {string} opts.targetDataDir - Destination for data files
19
- * @param {string} opts.projectRoot - Project root (for external package resolution)
20
- * @param {object} opts.pack - Pack definition from PACKS
21
- * @returns {{ copiedAgents: number, copiedSkills: number, copiedFiles: number }}
22
- */
23
- function copyPackFiles({ bmadSrc, targetAgentsDir, targetDataDir, projectRoot, pack }) {
24
- let copiedAgents = 0;
25
- let copiedSkills = 0;
26
- let copiedFiles = 0;
27
-
28
- if (!pack) return { copiedAgents, copiedSkills, copiedFiles };
29
-
30
- // Copy agents
31
- for (const agent of (pack.agents || [])) {
32
- const src = path.join(bmadSrc, 'agents', agent);
33
- const dest = path.join(targetAgentsDir, agent);
34
- if (fs.existsSync(src)) {
35
- fsExtra.copySync(src, dest, { overwrite: true });
36
- copiedAgents++;
37
- }
38
- }
39
-
40
- // Copy skills
41
- for (const skill of (pack.skills || [])) {
42
- const src = path.join(bmadSrc, 'skills', skill);
43
- const dest = path.join(targetAgentsDir, skill);
44
- if (fs.existsSync(src)) {
45
- fsExtra.copySync(src, dest, { overwrite: true });
46
- copiedSkills++;
47
- }
48
- }
49
-
50
- // Copy data files
51
- for (const dataFile of (pack.data || [])) {
52
- const src = path.join(bmadSrc, 'data', dataFile);
53
- const dest = path.join(targetDataDir, dataFile);
54
- if (fs.existsSync(src)) {
55
- fsExtra.copySync(src, dest, { overwrite: true });
56
- copiedFiles++;
57
- }
58
- }
59
-
60
- // Copy external package (e.g. OSINT)
61
- if (pack.externalPackage) {
62
- const extSrc = path.join(projectRoot, pack.externalPackage, 'skills');
63
- if (fs.existsSync(extSrc)) {
64
- fsExtra.copySync(extSrc, targetAgentsDir, { overwrite: true });
65
- copiedSkills++;
66
- }
67
- }
68
-
69
- // Copy pack directory (SEO, Backup, Animated, Shield, etc.)
70
- if (pack.packDir) {
71
- const srcParent = pack.packSrcDir || 'agents';
72
- const packSrc = path.join(bmadSrc, srcParent, pack.packDir);
73
- const packDest = path.join(targetAgentsDir, pack.packDir);
74
- if (fs.existsSync(packSrc)) {
75
- fsExtra.copySync(packSrc, packDest, { overwrite: true });
76
- copiedAgents++;
77
- copiedFiles++;
78
- }
79
- }
80
-
81
- return { copiedAgents, copiedSkills, copiedFiles };
82
- }
83
-
84
- module.exports = { copyPackFiles };
1
+ /**
2
+ * BMAD+ Shared Pack-Copy Module
3
+ * Extracted duplicate file-copy loops from install.js and update.js.
4
+ *
5
+ * Author: Laurent Rochetta
6
+ */
7
+
8
+ const path = require('node:path');
9
+ const fs = require('node:fs');
10
+ const fsExtra = require('fs-extra');
11
+
12
+ /**
13
+ * Copy files for a single pack definition into the target directories.
14
+ *
15
+ * @param {object} opts
16
+ * @param {string} opts.bmadSrc - Path to src/bmad-plus/
17
+ * @param {string} opts.targetAgentsDir - Destination for agents / skills
18
+ * @param {string} opts.targetDataDir - Destination for data files
19
+ * @param {string} opts.projectRoot - Project root (for external package resolution)
20
+ * @param {object} opts.pack - Pack definition from PACKS
21
+ * @returns {{ copiedAgents: number, copiedSkills: number, copiedFiles: number }}
22
+ */
23
+ function copyPackFiles({ bmadSrc, targetAgentsDir, targetDataDir, projectRoot, pack }) {
24
+ let copiedAgents = 0;
25
+ let copiedSkills = 0;
26
+ let copiedFiles = 0;
27
+
28
+ if (!pack) return { copiedAgents, copiedSkills, copiedFiles };
29
+
30
+ // Copy agents
31
+ for (const agent of (pack.agents || [])) {
32
+ const src = path.join(bmadSrc, 'agents', agent);
33
+ const dest = path.join(targetAgentsDir, agent);
34
+ if (fs.existsSync(src)) {
35
+ fsExtra.copySync(src, dest, { overwrite: true });
36
+ copiedAgents++;
37
+ }
38
+ }
39
+
40
+ // Copy skills
41
+ for (const skill of (pack.skills || [])) {
42
+ const src = path.join(bmadSrc, 'skills', skill);
43
+ const dest = path.join(targetAgentsDir, skill);
44
+ if (fs.existsSync(src)) {
45
+ fsExtra.copySync(src, dest, { overwrite: true });
46
+ copiedSkills++;
47
+ }
48
+ }
49
+
50
+ // Copy data files
51
+ for (const dataFile of (pack.data || [])) {
52
+ const src = path.join(bmadSrc, 'data', dataFile);
53
+ const dest = path.join(targetDataDir, dataFile);
54
+ if (fs.existsSync(src)) {
55
+ fsExtra.copySync(src, dest, { overwrite: true });
56
+ copiedFiles++;
57
+ }
58
+ }
59
+
60
+ // Copy external package (e.g. OSINT)
61
+ if (pack.externalPackage) {
62
+ const extSrc = path.join(projectRoot, pack.externalPackage, 'skills');
63
+ if (fs.existsSync(extSrc)) {
64
+ fsExtra.copySync(extSrc, targetAgentsDir, { overwrite: true });
65
+ copiedSkills++;
66
+ }
67
+ }
68
+
69
+ // Copy pack directory (SEO, Backup, Animated, Shield, etc.)
70
+ if (pack.packDir) {
71
+ const srcParent = pack.packSrcDir || 'agents';
72
+ const packSrc = path.join(bmadSrc, srcParent, pack.packDir);
73
+ const packDest = path.join(targetAgentsDir, pack.packDir);
74
+ if (fs.existsSync(packSrc)) {
75
+ fsExtra.copySync(packSrc, packDest, { overwrite: true });
76
+ copiedAgents++;
77
+ copiedFiles++;
78
+ }
79
+ }
80
+
81
+ return { copiedAgents, copiedSkills, copiedFiles };
82
+ }
83
+
84
+ module.exports = { copyPackFiles };
@@ -1,114 +1,114 @@
1
- /**
2
- * BMAD+ Shared PACKS Module
3
- * Single source of truth for pack definitions, expected agents, and pack ordering.
4
- *
5
- * Author: Laurent Rochetta
6
- */
7
-
8
- const PACKS = {
9
- core: {
10
- name: 'Core',
11
- icon: 'b',
12
- agents: ['agent-strategist', 'agent-architect-dev', 'agent-quality', 'agent-orchestrator'],
13
- skills: ['bmad-plus-autopilot', 'bmad-plus-parallel', 'bmad-plus-sync'],
14
- data: ['role-triggers.yaml'],
15
- packDir: 'pack-core',
16
- packSrcDir: 'packs',
17
- required: true,
18
- desc: 'Core agents & skills',
19
- },
20
- osint: {
21
- name: 'OSINT',
22
- icon: 'j',
23
- agents: ['agent-shadow'],
24
- skills: [],
25
- externalPackage: 'osint-agent-package',
26
- packDir: 'pack-osint',
27
- packSrcDir: 'packs',
28
- desc: 'OSINT & investigation',
29
- },
30
- maker: {
31
- name: 'Maker',
32
- icon: 'f',
33
- agents: ['agent-maker'],
34
- skills: [],
35
- data: [],
36
- packDir: 'pack-maker',
37
- packSrcDir: 'packs',
38
- desc: 'Agent creation toolkit',
39
- },
40
- shield: {
41
- name: 'Shield',
42
- icon: 'm',
43
- agents: ['shield-orchestrator'],
44
- skills: [],
45
- packDir: 'pack-shield',
46
- packSrcDir: 'packs',
47
- desc: 'GRC compliance (25+ frameworks)',
48
- },
49
- seo: {
50
- name: 'SEO',
51
- icon: 'k',
52
- agents: ['seo-scout', 'seo-chief', 'seo-judge'],
53
- skills: [],
54
- packDir: 'pack-seo',
55
- packSrcDir: 'packs',
56
- desc: 'SEO audit & optimization',
57
- },
58
- memory: {
59
- name: 'Memory',
60
- icon: 'x',
61
- agents: ['zecher'],
62
- skills: [],
63
- packDir: 'pack-memory',
64
- packSrcDir: 'packs',
65
- desc: 'Persistent cross-session memory',
66
- },
67
- 'dev-studio': {
68
- name: 'Dev Studio',
69
- icon: 'v',
70
- agents: ['dev-studio-orchestrator'],
71
- skills: ['dev-studio'],
72
- packDir: 'pack-dev-studio',
73
- packSrcDir: 'packs',
74
- desc: 'SDLC automation (6 agents, 56+ skills)',
75
- },
76
- backup: {
77
- name: 'Backup',
78
- icon: 'y',
79
- agents: ['backup-agent'],
80
- skills: [],
81
- packDir: 'pack-backup',
82
- packSrcDir: 'packs',
83
- desc: 'Backup & restore',
84
- },
85
- animated: {
86
- name: 'Animated',
87
- icon: 'z',
88
- agents: ['animated-website-agent'],
89
- skills: [],
90
- packDir: 'pack-animated',
91
- packSrcDir: 'packs',
92
- desc: 'Animated website agents',
93
- },
94
- };
95
-
96
- const PACK_ORDER = ['core', 'osint', 'maker', 'shield', 'seo', 'memory', 'dev-studio', 'backup', 'animated'];
97
-
98
- /**
99
- * Maps each pack to the list of directory names expected under .agents/skills/
100
- * after installation. Each entry contains agent directory names AND/OR pack directory names.
101
- */
102
- const EXPECTED_AGENTS = {
103
- core: { agents: ['agent-strategist', 'agent-architect-dev', 'agent-quality', 'agent-orchestrator'], packDir: null },
104
- osint: { agents: ['agent-shadow'], packDir: null },
105
- maker: { agents: ['agent-maker'], packDir: null },
106
- shield: { agents: ['shield-orchestrator'], packDir: 'pack-shield' },
107
- seo: { agents: ['seo-scout', 'seo-chief', 'seo-judge'], packDir: 'pack-seo' },
108
- memory: { agents: ['zecher'], packDir: 'pack-memory' },
109
- 'dev-studio': { agents: ['dev-studio-orchestrator'], packDir: 'pack-dev-studio' },
110
- backup: { agents: ['backup-agent'], packDir: 'pack-backup' },
111
- animated: { agents: ['animated-website-agent'], packDir: 'pack-animated' },
112
- };
113
-
114
- module.exports = { PACKS, PACK_ORDER, EXPECTED_AGENTS };
1
+ /**
2
+ * BMAD+ Shared PACKS Module
3
+ * Single source of truth for pack definitions, expected agents, and pack ordering.
4
+ *
5
+ * Author: Laurent Rochetta
6
+ */
7
+
8
+ const PACKS = {
9
+ core: {
10
+ name: 'Core',
11
+ icon: 'b',
12
+ agents: ['agent-strategist', 'agent-architect-dev', 'agent-quality', 'agent-orchestrator'],
13
+ skills: ['bmad-plus-autopilot', 'bmad-plus-parallel', 'bmad-plus-sync'],
14
+ data: ['role-triggers.yaml'],
15
+ packDir: 'pack-core',
16
+ packSrcDir: 'packs',
17
+ required: true,
18
+ desc: 'Core agents & skills',
19
+ },
20
+ osint: {
21
+ name: 'OSINT',
22
+ icon: 'j',
23
+ agents: ['agent-shadow'],
24
+ skills: [],
25
+ externalPackage: 'osint-agent-package',
26
+ packDir: 'pack-osint',
27
+ packSrcDir: 'packs',
28
+ desc: 'OSINT & investigation',
29
+ },
30
+ maker: {
31
+ name: 'Maker',
32
+ icon: 'f',
33
+ agents: ['agent-maker'],
34
+ skills: [],
35
+ data: [],
36
+ packDir: 'pack-maker',
37
+ packSrcDir: 'packs',
38
+ desc: 'Agent creation toolkit',
39
+ },
40
+ shield: {
41
+ name: 'Shield',
42
+ icon: 'm',
43
+ agents: ['shield-orchestrator'],
44
+ skills: [],
45
+ packDir: 'pack-shield',
46
+ packSrcDir: 'packs',
47
+ desc: 'GRC compliance (25+ frameworks)',
48
+ },
49
+ seo: {
50
+ name: 'SEO',
51
+ icon: 'k',
52
+ agents: ['seo-scout', 'seo-chief', 'seo-judge'],
53
+ skills: [],
54
+ packDir: 'pack-seo',
55
+ packSrcDir: 'packs',
56
+ desc: 'SEO audit & optimization',
57
+ },
58
+ memory: {
59
+ name: 'Memory',
60
+ icon: 'x',
61
+ agents: ['zecher'],
62
+ skills: [],
63
+ packDir: 'pack-memory',
64
+ packSrcDir: 'packs',
65
+ desc: 'Persistent cross-session memory',
66
+ },
67
+ 'dev-studio': {
68
+ name: 'Dev Studio',
69
+ icon: 'v',
70
+ agents: ['dev-studio-orchestrator'],
71
+ skills: ['dev-studio'],
72
+ packDir: 'pack-dev-studio',
73
+ packSrcDir: 'packs',
74
+ desc: 'SDLC automation (6 agents, 56+ skills)',
75
+ },
76
+ backup: {
77
+ name: 'Backup',
78
+ icon: 'y',
79
+ agents: ['backup-agent'],
80
+ skills: [],
81
+ packDir: 'pack-backup',
82
+ packSrcDir: 'packs',
83
+ desc: 'Backup & restore',
84
+ },
85
+ animated: {
86
+ name: 'Animated',
87
+ icon: 'z',
88
+ agents: ['animated-website-agent'],
89
+ skills: [],
90
+ packDir: 'pack-animated',
91
+ packSrcDir: 'packs',
92
+ desc: 'Animated website agents',
93
+ },
94
+ };
95
+
96
+ const PACK_ORDER = ['core', 'osint', 'maker', 'shield', 'seo', 'memory', 'dev-studio', 'backup', 'animated'];
97
+
98
+ /**
99
+ * Maps each pack to the list of directory names expected under .agents/skills/
100
+ * after installation. Each entry contains agent directory names AND/OR pack directory names.
101
+ */
102
+ const EXPECTED_AGENTS = {
103
+ core: { agents: ['agent-strategist', 'agent-architect-dev', 'agent-quality', 'agent-orchestrator'], packDir: null },
104
+ osint: { agents: ['agent-shadow'], packDir: null },
105
+ maker: { agents: ['agent-maker'], packDir: null },
106
+ shield: { agents: ['shield-orchestrator'], packDir: 'pack-shield' },
107
+ seo: { agents: ['seo-scout', 'seo-chief', 'seo-judge'], packDir: 'pack-seo' },
108
+ memory: { agents: ['zecher'], packDir: 'pack-memory' },
109
+ 'dev-studio': { agents: ['dev-studio-orchestrator'], packDir: 'pack-dev-studio' },
110
+ backup: { agents: ['backup-agent'], packDir: 'pack-backup' },
111
+ animated: { agents: ['animated-website-agent'], packDir: 'pack-animated' },
112
+ };
113
+
114
+ module.exports = { PACKS, PACK_ORDER, EXPECTED_AGENTS };
@@ -0,0 +1,102 @@
1
+ /**
2
+ * BMAD+ Stack Detection — Shared Module
3
+ * Unified project stack detection for autoconfig and scan commands.
4
+ * Merges patterns from both original implementations.
5
+ */
6
+
7
+ const path = require('node:path');
8
+ const fs = require('node:fs');
9
+
10
+ // ── Project Detection Markers (for scan.js) ──
11
+
12
+ const PROJECT_MARKERS = [
13
+ { file: 'package.json', stack: 'Node.js', detect: (dir) => {
14
+ try {
15
+ const pkg = JSON.parse(fs.readFileSync(path.join(dir, 'package.json'), 'utf8'));
16
+ const deps = { ...pkg.dependencies, ...pkg.devDependencies };
17
+ if (deps['next']) return 'Next.js';
18
+ if (deps['nuxt']) return 'Nuxt';
19
+ if (deps['react']) return 'React';
20
+ if (deps['vue']) return 'Vue.js';
21
+ if (deps['svelte']) return 'Svelte';
22
+ if (deps['express']) return 'Express';
23
+ if (deps['fastify']) return 'Fastify';
24
+ if (deps['electron']) return 'Electron';
25
+ if (deps['tauri']) return 'Tauri';
26
+ return 'Node.js';
27
+ } catch {
28
+ return 'Node.js';
29
+ }
30
+ }},
31
+ { file: 'Cargo.toml', stack: 'Rust' },
32
+ { file: 'pyproject.toml', stack: 'Python' },
33
+ { file: 'requirements.txt', stack: 'Python' },
34
+ { file: 'go.mod', stack: 'Go' },
35
+ { file: 'composer.json', stack: 'PHP' },
36
+ { file: 'Gemfile', stack: 'Ruby' },
37
+ { file: 'pom.xml', stack: 'Java' },
38
+ { file: 'build.gradle', stack: 'Java/Kotlin' },
39
+ ];
40
+
41
+ // ── Full Stack Detection (for autoconfig.js) ──
42
+
43
+ function detectStack(dir) {
44
+ const result = {
45
+ language: null,
46
+ framework: null,
47
+ runtime: null,
48
+ packageManager: null,
49
+ hasTypeScript: false,
50
+ };
51
+
52
+ // Package.json analysis
53
+ const pkgPath = path.join(dir, 'package.json');
54
+ if (fs.existsSync(pkgPath)) {
55
+ try {
56
+ const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf8'));
57
+ const deps = { ...pkg.dependencies, ...pkg.devDependencies };
58
+ result.runtime = 'Node.js';
59
+ result.language = deps['typescript'] || fs.existsSync(path.join(dir, 'tsconfig.json')) ? 'TypeScript' : 'JavaScript';
60
+ result.hasTypeScript = result.language === 'TypeScript';
61
+
62
+ // Framework detection
63
+ if (deps['next']) result.framework = 'Next.js';
64
+ else if (deps['nuxt']) result.framework = 'Nuxt';
65
+ else if (deps['@angular/core']) result.framework = 'Angular';
66
+ else if (deps['react']) result.framework = 'React';
67
+ else if (deps['vue']) result.framework = 'Vue.js';
68
+ else if (deps['svelte']) result.framework = 'Svelte';
69
+ else if (deps['express']) result.framework = 'Express';
70
+ else if (deps['fastify']) result.framework = 'Fastify';
71
+ else if (deps['hono']) result.framework = 'Hono';
72
+ else if (deps['electron']) result.framework = 'Electron';
73
+ else if (deps['tauri']) result.framework = 'Tauri';
74
+ else if (deps['react-native']) result.framework = 'React Native';
75
+
76
+ // Package manager
77
+ if (fs.existsSync(path.join(dir, 'pnpm-lock.yaml'))) result.packageManager = 'pnpm';
78
+ else if (fs.existsSync(path.join(dir, 'yarn.lock'))) result.packageManager = 'yarn';
79
+ else if (fs.existsSync(path.join(dir, 'bun.lockb'))) result.packageManager = 'bun';
80
+ else result.packageManager = 'npm';
81
+ } catch (e) {
82
+ console.warn('stack-detect: Failed to parse package.json in detectStack', e.message);
83
+ }
84
+ }
85
+
86
+ // Other languages
87
+ if (!result.runtime) {
88
+ if (fs.existsSync(path.join(dir, 'Cargo.toml'))) { result.language = 'Rust'; result.runtime = 'Rust'; }
89
+ else if (fs.existsSync(path.join(dir, 'pyproject.toml')) || fs.existsSync(path.join(dir, 'requirements.txt'))) { result.language = 'Python'; result.runtime = 'Python'; }
90
+ else if (fs.existsSync(path.join(dir, 'go.mod'))) { result.language = 'Go'; result.runtime = 'Go'; }
91
+ else if (fs.existsSync(path.join(dir, 'composer.json'))) { result.language = 'PHP'; result.runtime = 'PHP'; }
92
+ else if (fs.existsSync(path.join(dir, 'Gemfile'))) { result.language = 'Ruby'; result.runtime = 'Ruby'; }
93
+ else if (fs.existsSync(path.join(dir, 'pom.xml')) || fs.existsSync(path.join(dir, 'build.gradle'))) { result.language = 'Java'; result.runtime = 'JVM'; }
94
+ }
95
+
96
+ return result;
97
+ }
98
+
99
+ module.exports = {
100
+ detectStack,
101
+ PROJECT_MARKERS,
102
+ };
@@ -0,0 +1,45 @@
1
+ /**
2
+ * BMAD+ User Input Validation Utilities
3
+ * Extracted from install.js for modularity and reuse.
4
+ */
5
+
6
+ // Shell metacharacters that are dangerous in user-provided names
7
+ const SHELL_META = /[;&|`$(){}[\]!#~<>*?\\\n\r]/;
8
+
9
+ /**
10
+ * Validate and sanitize a user name.
11
+ * Rules:
12
+ * - Must not be empty
13
+ * - Must not exceed 100 characters
14
+ * - Must not contain shell metacharacters
15
+ *
16
+ * @param {string} rawName - Raw user-provided name
17
+ * @param {string} fallback - Fallback name if validation fails
18
+ * @returns {{ name: string, warnings: string[] }} Sanitized name and any warnings
19
+ */
20
+ function validateUserName(rawName, fallback) {
21
+ const warnings = [];
22
+
23
+ if (!rawName || rawName.trim().length === 0) {
24
+ warnings.push('Name cannot be empty. Using default.');
25
+ return { name: fallback, warnings };
26
+ }
27
+
28
+ if (rawName.length > 100) {
29
+ warnings.push('Name too long (>100 chars). Truncating.');
30
+ return { name: rawName.slice(0, 100), warnings };
31
+ }
32
+
33
+ if (SHELL_META.test(rawName)) {
34
+ const sanitized = rawName.replace(SHELL_META, '').trim() || 'Developer';
35
+ warnings.push('Name contains shell metacharacters. Using sanitized version.');
36
+ return { name: sanitized, warnings };
37
+ }
38
+
39
+ return { name: rawName, warnings };
40
+ }
41
+
42
+ module.exports = {
43
+ validateUserName,
44
+ SHELL_META,
45
+ };