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.
- package/CHANGELOG.md +40 -0
- package/README.md +34 -24
- package/osint-agent-package/agents/osint-investigator.md +3 -3
- package/osint-agent-package/skills/bmad-osint-investigate/osint/SKILL.md +51 -51
- package/osint-agent-package/skills/bmad-osint-investigate/osint/references/content-extraction.md +7 -7
- package/osint-agent-package/skills/bmad-osint-investigate/osint/references/platforms.md +2 -2
- package/osint-agent-package/skills/bmad-osint-investigate/osint/references/tools.md +31 -41
- package/package.json +21 -5
- package/readme-international/README.de.md +34 -24
- package/readme-international/README.es.md +35 -25
- package/readme-international/README.fr.md +34 -24
- package/src/bmad-plus/agents/agent-maker/SKILL.md +39 -14
- package/src/bmad-plus/module.yaml +5 -4
- package/src/bmad-plus/packs/pack-animated/animated-website-agent.md +40 -14
- package/src/bmad-plus/packs/pack-animated/templates/animated-website-workflow.md +15 -12
- package/src/bmad-plus/packs/pack-backup/backup-agent.md +2 -1
- package/src/bmad-plus/packs/pack-backup/templates/backup-workflow.md +2 -0
- package/src/bmad-plus/packs/pack-memory/zecher-agent.md +1 -1
- package/src/bmad-plus/packs/pack-shield/README.md +1 -1
- package/src/bmad-plus/packs/pack-shield/SKILL.md +3 -3
- package/src/bmad-plus/packs/pack-shield/categories/industry-compliance/pci-dss-agent.md +1 -1
- package/src/bmad-plus/packs/pack-shield/shield-orchestrator.md +2 -2
- package/src/bmad-plus/skills/bmad-plus-parallel/SKILL.md +1 -1
- package/src/bmad-plus/skills/bmad-plus-swarm/SKILL.md +1 -1
- package/tools/build/adapters.config.js +1 -1
- package/tools/build/generate-adapters.js +1 -1
- package/tools/cli/commands/install.js +18 -11
- package/tools/cli/commands/nexus.js +2 -1
- package/tools/cli/commands/review.js +1 -1
- package/tools/cli/commands/update.js +30 -1
- package/tools/cli/i18n.js +30 -30
- package/tools/cli/lib/packs.js +6 -6
- package/tools/cli/lib/review.js +2 -1
- package/tools/cli/lib/update-dispatch.js +10 -2
- 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
|
|
90
|
-
guide_example_backup: '🗂️ Backup: "/backup
|
|
91
|
-
guide_example_animated: '🎬 Animated: "
|
|
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
|
|
184
|
-
guide_example_backup: '🗂️ Backup : "/backup
|
|
185
|
-
guide_example_animated: '🎬 Animé : "
|
|
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
|
|
280
|
-
guide_example_backup: '🗂️ Backup: "/backup
|
|
281
|
-
guide_example_animated: '🎬 Animado: "
|
|
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
|
|
378
|
-
guide_example_backup: '🗂️ Backup: "/backup
|
|
379
|
-
guide_example_animated: '🎬 Animiert: "
|
|
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
|
|
475
|
-
guide_example_backup: '🗂️ Backup: "/backup
|
|
476
|
-
guide_example_animated: '🎬 Animado: "
|
|
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
|
|
569
|
-
guide_example_backup: '🗂️ Бэкап: "/backup
|
|
570
|
-
guide_example_animated: '🎬 Анимация: "
|
|
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
|
|
659
|
-
guide_example_backup: '🗂️ 备份: "/backup
|
|
660
|
-
guide_example_animated: '🎬 动画: "
|
|
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
|
|
749
|
-
guide_example_backup: '🗂️ גיבוי: "/backup
|
|
750
|
-
guide_example_animated: '🎬 אנימציה: "
|
|
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
|
|
843
|
-
guide_example_backup: '🗂️ バックアップ: "/backup
|
|
844
|
-
guide_example_animated: '🎬 アニメ: "
|
|
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
|
|
938
|
-
guide_example_backup: '🗂️ Backup: "/backup
|
|
939
|
-
guide_example_animated: '🎬 Animato: "
|
|
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',
|
package/tools/cli/lib/packs.js
CHANGED
|
@@ -57,7 +57,7 @@ const PACKS = {
|
|
|
57
57
|
"skills": [],
|
|
58
58
|
"packDir": "pack-shield",
|
|
59
59
|
"packSrcDir": "packs",
|
|
60
|
-
"desc": "GRC compliance (
|
|
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.
|
|
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":
|
|
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
|
|
428
|
-
"desc": "GRC compliance (
|
|
429
|
-
"description": "GRC compliance (
|
|
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",
|
package/tools/cli/lib/review.js
CHANGED
|
@@ -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
|
-
|
|
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
|
|
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
|
-
'
|
|
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,
|