bmad-plus 0.23.0 → 0.23.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 (35) hide show
  1. package/CHANGELOG.md +40 -0
  2. package/README.md +34 -24
  3. package/osint-agent-package/agents/osint-investigator.md +3 -3
  4. package/osint-agent-package/skills/bmad-osint-investigate/osint/SKILL.md +51 -51
  5. package/osint-agent-package/skills/bmad-osint-investigate/osint/references/content-extraction.md +7 -7
  6. package/osint-agent-package/skills/bmad-osint-investigate/osint/references/platforms.md +2 -2
  7. package/osint-agent-package/skills/bmad-osint-investigate/osint/references/tools.md +31 -41
  8. package/package.json +21 -5
  9. package/readme-international/README.de.md +34 -24
  10. package/readme-international/README.es.md +35 -25
  11. package/readme-international/README.fr.md +34 -24
  12. package/src/bmad-plus/agents/agent-maker/SKILL.md +39 -14
  13. package/src/bmad-plus/module.yaml +5 -4
  14. package/src/bmad-plus/packs/pack-animated/animated-website-agent.md +40 -14
  15. package/src/bmad-plus/packs/pack-animated/templates/animated-website-workflow.md +15 -12
  16. package/src/bmad-plus/packs/pack-backup/backup-agent.md +2 -1
  17. package/src/bmad-plus/packs/pack-backup/templates/backup-workflow.md +2 -0
  18. package/src/bmad-plus/packs/pack-memory/zecher-agent.md +1 -1
  19. package/src/bmad-plus/packs/pack-shield/README.md +1 -1
  20. package/src/bmad-plus/packs/pack-shield/SKILL.md +3 -3
  21. package/src/bmad-plus/packs/pack-shield/categories/industry-compliance/pci-dss-agent.md +1 -1
  22. package/src/bmad-plus/packs/pack-shield/shield-orchestrator.md +2 -2
  23. package/src/bmad-plus/skills/bmad-plus-parallel/SKILL.md +1 -1
  24. package/src/bmad-plus/skills/bmad-plus-swarm/SKILL.md +1 -1
  25. package/tools/build/adapters.config.js +1 -1
  26. package/tools/build/generate-adapters.js +1 -1
  27. package/tools/cli/commands/install.js +18 -11
  28. package/tools/cli/commands/nexus.js +2 -1
  29. package/tools/cli/commands/review.js +1 -1
  30. package/tools/cli/commands/update.js +30 -1
  31. package/tools/cli/i18n.js +30 -30
  32. package/tools/cli/lib/packs.js +6 -6
  33. package/tools/cli/lib/review.js +2 -1
  34. package/tools/cli/lib/update-dispatch.js +10 -2
  35. package/tools/cli/lib/update-transaction.js +1 -2
package/tools/cli/i18n.js CHANGED
@@ -86,9 +86,9 @@ const LANGUAGES = {
86
86
  guide_cli_doctor: '— Check installation health',
87
87
  guide_cli_uninstall: '— Remove BMAD+ from project',
88
88
  guide_examples_title: 'Quick Examples',
89
- guide_example_seo: '🔍 SEO: "/seo audit https://example.com"',
90
- guide_example_backup: '🗂️ Backup: "/backup create" → ZIP timestamped',
91
- guide_example_animated: '🎬 Animated: "/animated build hero.mp4"',
89
+ guide_example_seo: '🔍 SEO: "/seo full https://example.com"',
90
+ guide_example_backup: '🗂️ Backup: "/backup" → ZIP timestamped',
91
+ guide_example_animated: '🎬 Animated: "animated website from hero.mp4"',
92
92
  guide_example_design: '🎨 Design: "/design read" → Atelier interviews you, then builds',
93
93
  guide_example_osint: '🔍 OSINT: "Shadow, investigate John Doe"',
94
94
  guide_memory: '🧠 Persistent Brain',
@@ -180,9 +180,9 @@ const LANGUAGES = {
180
180
  guide_cli_doctor: "— Vérifier l'installation",
181
181
  guide_cli_uninstall: '— Supprimer BMAD+ du projet',
182
182
  guide_examples_title: 'Exemples rapides',
183
- guide_example_seo: '🔍 SEO : "/seo audit https://example.com"',
184
- guide_example_backup: '🗂️ Backup : "/backup create" → ZIP horodaté',
185
- guide_example_animated: '🎬 Animé : "/animated build hero.mp4"',
183
+ guide_example_seo: '🔍 SEO : "/seo full https://example.com"',
184
+ guide_example_backup: '🗂️ Backup : "/backup" → ZIP horodaté',
185
+ guide_example_animated: '🎬 Animé : "animated website from hero.mp4"',
186
186
  guide_example_design: '🎨 Design : "/design read" → Atelier vous interroge, puis construit',
187
187
  guide_example_osint: '🔍 OSINT : "Shadow, investigate John Doe"',
188
188
  guide_memory: '🧠 Cerveau persistant',
@@ -276,9 +276,9 @@ const LANGUAGES = {
276
276
  guide_cli_doctor: '— Verificar la instalación',
277
277
  guide_cli_uninstall: '— Eliminar BMAD+ del proyecto',
278
278
  guide_examples_title: 'Ejemplos rápidos',
279
- guide_example_seo: '🔍 SEO: "/seo audit https://example.com"',
280
- guide_example_backup: '🗂️ Backup: "/backup create" → ZIP con marca de tiempo',
281
- guide_example_animated: '🎬 Animado: "/animated build hero.mp4"',
279
+ guide_example_seo: '🔍 SEO: "/seo full https://example.com"',
280
+ guide_example_backup: '🗂️ Backup: "/backup" → ZIP con marca de tiempo',
281
+ guide_example_animated: '🎬 Animado: "animated website from hero.mp4"',
282
282
  guide_example_design: '🎨 Diseño: "/design read" → Atelier te entrevista y luego construye',
283
283
  guide_example_osint: '🔍 OSINT: "Shadow, investigate John Doe"',
284
284
  guide_memory: '🧠 Cerebro persistente',
@@ -374,9 +374,9 @@ const LANGUAGES = {
374
374
  guide_cli_doctor: '— Installation prüfen',
375
375
  guide_cli_uninstall: '— BMAD+ vom Projekt entfernen',
376
376
  guide_examples_title: 'Schnellbeispiele',
377
- guide_example_seo: '🔍 SEO: "/seo audit https://example.com"',
378
- guide_example_backup: '🗂️ Backup: "/backup create" → ZIP mit Zeitstempel',
379
- guide_example_animated: '🎬 Animiert: "/animated build hero.mp4"',
377
+ guide_example_seo: '🔍 SEO: "/seo full https://example.com"',
378
+ guide_example_backup: '🗂️ Backup: "/backup" → ZIP mit Zeitstempel',
379
+ guide_example_animated: '🎬 Animiert: "animated website from hero.mp4"',
380
380
  guide_example_design: '🎨 Design: "/design read" → Atelier befragt dich, dann baut es',
381
381
  guide_example_osint: '🔍 OSINT: "Shadow, investigate John Doe"',
382
382
  guide_memory: '🧠 Beständiges Gehirn',
@@ -471,9 +471,9 @@ const LANGUAGES = {
471
471
  guide_cli_doctor: '— Verificar instalação',
472
472
  guide_cli_uninstall: '— Remover BMAD+ do projeto',
473
473
  guide_examples_title: 'Exemplos rápidos',
474
- guide_example_seo: '🔍 SEO: "/seo audit https://example.com"',
475
- guide_example_backup: '🗂️ Backup: "/backup create" → ZIP com timestamp',
476
- guide_example_animated: '🎬 Animado: "/animated build hero.mp4"',
474
+ guide_example_seo: '🔍 SEO: "/seo full https://example.com"',
475
+ guide_example_backup: '🗂️ Backup: "/backup" → ZIP com timestamp',
476
+ guide_example_animated: '🎬 Animado: "animated website from hero.mp4"',
477
477
  guide_example_design: '🎨 Design: "/design read" → Atelier entrevista você, depois constrói',
478
478
  guide_example_osint: '🔍 OSINT: "Shadow, investigate John Doe"',
479
479
  guide_memory: '🧠 Cérebro persistente',
@@ -565,9 +565,9 @@ const LANGUAGES = {
565
565
  guide_cli_doctor: '— Проверить установку',
566
566
  guide_cli_uninstall: '— Удалить BMAD+',
567
567
  guide_examples_title: 'Быстрые примеры',
568
- guide_example_seo: '🔍 SEO: "/seo audit https://example.com"',
569
- guide_example_backup: '🗂️ Бэкап: "/backup create" → ZIP',
570
- guide_example_animated: '🎬 Анимация: "/animated build hero.mp4"',
568
+ guide_example_seo: '🔍 SEO: "/seo full https://example.com"',
569
+ guide_example_backup: '🗂️ Бэкап: "/backup" → ZIP',
570
+ guide_example_animated: '🎬 Анимация: "animated website from hero.mp4"',
571
571
  guide_example_design: '🎨 Дизайн: "/design read" → Atelier опрашивает вас, затем строит',
572
572
  guide_example_osint: '🔍 OSINT: "Shadow, investigate John Doe"',
573
573
  guide_memory: '🧠 Постоянный мозг',
@@ -655,9 +655,9 @@ const LANGUAGES = {
655
655
  guide_cli_doctor: '— 检查安装',
656
656
  guide_cli_uninstall: '— 删除 BMAD+',
657
657
  guide_examples_title: '快速示例',
658
- guide_example_seo: '🔍 SEO: "/seo audit https://example.com"',
659
- guide_example_backup: '🗂️ 备份: "/backup create" → ZIP',
660
- guide_example_animated: '🎬 动画: "/animated build hero.mp4"',
658
+ guide_example_seo: '🔍 SEO: "/seo full https://example.com"',
659
+ guide_example_backup: '🗂️ 备份: "/backup" → ZIP',
660
+ guide_example_animated: '🎬 动画: "animated website from hero.mp4"',
661
661
  guide_example_design: '🎨 设计: "/design read" → Atelier 先向你提问,再构建',
662
662
  guide_example_osint: '🔍 OSINT: "Shadow, investigate John Doe"',
663
663
  guide_memory: '🧠 持久记忆',
@@ -745,9 +745,9 @@ const LANGUAGES = {
745
745
  guide_cli_doctor: '— בדיקת התקנה',
746
746
  guide_cli_uninstall: '— הסרת BMAD+',
747
747
  guide_examples_title: 'דוגמאות מהירות',
748
- guide_example_seo: '🔍 SEO: "/seo audit https://example.com"',
749
- guide_example_backup: '🗂️ גיבוי: "/backup create" → ZIP',
750
- guide_example_animated: '🎬 אנימציה: "/animated build hero.mp4"',
748
+ guide_example_seo: '🔍 SEO: "/seo full https://example.com"',
749
+ guide_example_backup: '🗂️ גיבוי: "/backup" → ZIP',
750
+ guide_example_animated: '🎬 אנימציה: "animated website from hero.mp4"',
751
751
  guide_example_design: '🎨 עיצוב: "/design read" → Atelier מראיין אותך ואז בונה',
752
752
  guide_example_osint: '🔍 OSINT: "Shadow, investigate John Doe"',
753
753
  guide_memory: '🧠 זיכרון מתמשך',
@@ -839,9 +839,9 @@ const LANGUAGES = {
839
839
  guide_cli_doctor: '— インストール確認',
840
840
  guide_cli_uninstall: '— BMAD+を削除',
841
841
  guide_examples_title: 'クイック例',
842
- guide_example_seo: '🔍 SEO: "/seo audit https://example.com"',
843
- guide_example_backup: '🗂️ バックアップ: "/backup create" → ZIP',
844
- guide_example_animated: '🎬 アニメ: "/animated build hero.mp4"',
842
+ guide_example_seo: '🔍 SEO: "/seo full https://example.com"',
843
+ guide_example_backup: '🗂️ バックアップ: "/backup" → ZIP',
844
+ guide_example_animated: '🎬 アニメ: "animated website from hero.mp4"',
845
845
  guide_example_design: '🎨 デザイン: "/design read" → Atelier がヒアリングしてから構築します',
846
846
  guide_example_osint: '🔍 OSINT: "Shadow, investigate John Doe"',
847
847
  guide_memory: '🧠 永続的な脳',
@@ -934,9 +934,9 @@ const LANGUAGES = {
934
934
  guide_cli_doctor: '— Verifica installazione',
935
935
  guide_cli_uninstall: '— Rimuovi BMAD+ dal progetto',
936
936
  guide_examples_title: 'Esempi rapidi',
937
- guide_example_seo: '🔍 SEO: "/seo audit https://example.com"',
938
- guide_example_backup: '🗂️ Backup: "/backup create" → ZIP con timestamp',
939
- guide_example_animated: '🎬 Animato: "/animated build hero.mp4"',
937
+ guide_example_seo: '🔍 SEO: "/seo full https://example.com"',
938
+ guide_example_backup: '🗂️ Backup: "/backup" → ZIP con timestamp',
939
+ guide_example_animated: '🎬 Animato: "animated website from hero.mp4"',
940
940
  guide_example_design: '🎨 Design: "/design read" → Atelier ti intervista, poi costruisce',
941
941
  guide_example_osint: '🔍 OSINT: "Shadow, investigate John Doe"',
942
942
  guide_memory: '🧠 Memoria persistente',
@@ -57,7 +57,7 @@ const PACKS = {
57
57
  "skills": [],
58
58
  "packDir": "pack-shield",
59
59
  "packSrcDir": "packs",
60
- "desc": "GRC compliance (26 frameworks)"
60
+ "desc": "GRC compliance (27 frameworks)"
61
61
  },
62
62
  "seo": {
63
63
  "name": "SEO",
@@ -220,7 +220,7 @@ const DERIVED = {
220
220
  "product": {
221
221
  "code": "bmad-plus",
222
222
  "displayName": "BMAD+",
223
- "version": "0.23.0",
223
+ "version": "0.23.1",
224
224
  "derivedFrom": "BMAD-METHOD v6.6.0"
225
225
  },
226
226
  "packOrder": [
@@ -396,7 +396,7 @@ const DERIVED = {
396
396
  "agentCount": 27,
397
397
  "subAgentCount": 0,
398
398
  "workflowCount": 11,
399
- "frameworkCount": 26,
399
+ "frameworkCount": 27,
400
400
  "categoryCount": 6,
401
401
  "skillCount": 0,
402
402
  "referenceFiles": 79,
@@ -424,9 +424,9 @@ const DERIVED = {
424
424
  "description": "Compliance agents for GDPR, ISO 27001, SOC 2, HIPAA, EU AI Act, DORA, NIS2 and more"
425
425
  }
426
426
  ],
427
- "summary": "27 compliance agents + 11 workflows across 26+ frameworks.",
428
- "desc": "GRC compliance (26 frameworks)",
429
- "description": "GRC compliance (26 frameworks)"
427
+ "summary": "27 compliance agents + 11 workflows across 27+ frameworks.",
428
+ "desc": "GRC compliance (27 frameworks)",
429
+ "description": "GRC compliance (27 frameworks)"
430
430
  },
431
431
  "seo": {
432
432
  "id": "seo",
@@ -221,7 +221,8 @@ function contentDigest(projectDir, file) {
221
221
  */
222
222
  function buildScope(projectDir, options = {}) {
223
223
  const head = options.workspace ? null : resolveCommit(projectDir, options.head || 'HEAD');
224
- const base = resolveCommit(projectDir, options.base || 'HEAD~1');
224
+ // A workspace review covers the uncommitted work, so its default base is HEAD.
225
+ const base = resolveCommit(projectDir, options.base || (options.workspace ? 'HEAD' : 'HEAD~1'));
225
226
  const mergeBase = git(projectDir, ['merge-base', base, head || 'HEAD']).trim();
226
227
  const range = options.workspace ? [mergeBase] : [mergeBase, head];
227
228
  const numstat = parseNumstat(
@@ -24,6 +24,14 @@ function refusal(reason, detail) {
24
24
  });
25
25
  }
26
26
 
27
+ /**
28
+ * One refusal for an `--auto` request, wherever it is evaluated: a policy that
29
+ * is not in `auto` mode never reads as the generic `approval-required` status.
30
+ */
31
+ function autoRefusal(reason) {
32
+ return refusal(reason === 'approval-required' ? 'automatic-updates-not-authorized' : reason);
33
+ }
34
+
27
35
  function requirePolicy(policy, targetVersion, auto) {
28
36
  if (policy.registry !== OFFICIAL_REGISTRY) throw refusal('unsupported-registry');
29
37
  if (policy.mode === 'off') throw refusal('updates-disabled');
@@ -31,7 +39,7 @@ function requirePolicy(policy, targetVersion, auto) {
31
39
  throw refusal('prerelease-not-allowed');
32
40
  if (auto) {
33
41
  const authorization = authorizeTarget(policy, targetVersion);
34
- if (!authorization.allowed) throw refusal(authorization.reason);
42
+ if (!authorization.allowed) throw autoRefusal(authorization.reason);
35
43
  }
36
44
  }
37
45
 
@@ -179,4 +187,4 @@ async function runLatestUpdate({ projectDir, auto = false, yes = false }, inject
179
187
  };
180
188
  }
181
189
 
182
- module.exports = { runLatestUpdate };
190
+ module.exports = { runLatestUpdate, autoRefusal };
@@ -264,8 +264,7 @@ function planUpdate({
264
264
  for (const { file } of files) safeTarget(projectDir, file);
265
265
  if (auto && (legacy || conflicts.length))
266
266
  throw new Error(
267
- 'Automatic update refused: ' +
268
- (legacy ? 'legacy ownership inventory' : 'local file conflicts')
267
+ 'Update refused: ' + (legacy ? 'legacy ownership inventory' : 'local file conflicts') + '.'
269
268
  );
270
269
  return {
271
270
  projectDir,