bmad-plus 0.12.2 → 0.13.0

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 (44) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/README.md +36 -8
  3. package/package.json +6 -4
  4. package/readme-international/README.de.md +37 -8
  5. package/readme-international/README.es.md +38 -9
  6. package/readme-international/README.fr.md +37 -8
  7. package/src/bmad-plus/agents/agent-orchestrator/SKILL.md +2 -0
  8. package/src/bmad-plus/module.yaml +270 -220
  9. package/src/bmad-plus/packs/pack-seo/scripts/seo_apis.py +8 -8
  10. package/src/bmad-plus/packs/pack-seo/scripts/seo_fetch.py +1 -2
  11. package/src/bmad-plus/packs/pack-seo/scripts/seo_report.py +0 -1
  12. package/src/bmad-plus/skills/bmad-plus-autopilot/SKILL.md +1 -1
  13. package/tools/bmad-plus-npx.js +4 -2
  14. package/tools/build/adapters.config.js +60 -51
  15. package/tools/build/check-counts.js +52 -54
  16. package/tools/build/check-install-contract.js +298 -0
  17. package/tools/build/generate-adapters.js +252 -56
  18. package/tools/build/generate.js +187 -10
  19. package/tools/build/generated-adapters/.codex/AGENTS.md +20 -7
  20. package/tools/build/generated-adapters/.cursor/rules/bmad-plus.mdc +20 -7
  21. package/tools/build/generated-adapters/.opencode/AGENTS.md +20 -7
  22. package/tools/build/generated-adapters/AGENTS.md +20 -7
  23. package/tools/build/generated-adapters/CLAUDE.md +20 -7
  24. package/tools/build/generated-adapters/CONVENTIONS.md +20 -7
  25. package/tools/build/generated-adapters/GEMINI.md +20 -7
  26. package/tools/build/module.template.yaml +82 -0
  27. package/tools/cli/bmad-plus-cli.js +16 -1
  28. package/tools/cli/commands/doctor.js +12 -40
  29. package/tools/cli/commands/install.js +108 -163
  30. package/tools/cli/commands/uninstall.js +173 -65
  31. package/tools/cli/commands/update-check.js +31 -0
  32. package/tools/cli/commands/update-policy.js +39 -0
  33. package/tools/cli/commands/update.js +102 -113
  34. package/tools/cli/i18n.js +60 -0
  35. package/tools/cli/lib/ide-config.js +4 -261
  36. package/tools/cli/lib/install-manifest.js +17 -0
  37. package/tools/cli/lib/installed-adapters.js +89 -0
  38. package/tools/cli/lib/npm-runner.js +177 -0
  39. package/tools/cli/lib/pack-copy.js +62 -66
  40. package/tools/cli/lib/packs.js +437 -3
  41. package/tools/cli/lib/update-check.js +153 -0
  42. package/tools/cli/lib/update-dispatch.js +182 -0
  43. package/tools/cli/lib/update-policy.js +90 -0
  44. package/tools/cli/lib/update-transaction.js +334 -0
@@ -3,17 +3,19 @@
3
3
  * BMAD+ Build — registry.yaml → pack artifacts generator (Pillar 1)
4
4
  *
5
5
  * Reads the root registry.yaml (the single source of truth) and generates the
6
- * pack data currently hand-maintained in tools/cli/lib/packs.js:
6
+ * pack data in tools/cli/lib/packs.js and src/bmad-plus/module.yaml:
7
7
  * - PACKS (CLI pack definitions)
8
8
  * - PACK_ORDER (install/display order)
9
9
  * - EXPECTED_AGENTS (what `bmad-plus doctor` verifies after install)
10
+ * - DERIVED (counts, display metadata, targets, Python provisioning)
10
11
  *
11
12
  * Usage:
12
13
  * node tools/build/generate.js # print generated packs module source
13
- * node tools/build/generate.js --json # print { PACKS, PACK_ORDER, EXPECTED_AGENTS } as JSON
14
+ * node tools/build/generate.js --json # print all generated data as JSON
14
15
  * node tools/build/generate.js --out <file> # write generated module source to <file>
16
+ * --module-out <yaml> # also write generated module.yaml
15
17
  * node tools/build/generate.js --check # verify registry.yaml reproduces the live
16
- * # tools/cli/lib/packs.js exactly (exit 1 on drift)
18
+ * # packs.js and module.yaml (exit 1 on drift)
17
19
  *
18
20
  * Author: Laurent Rochetta
19
21
  */
@@ -28,9 +30,19 @@ const yaml = require('js-yaml');
28
30
  const REPO_ROOT = path.join(__dirname, '..', '..');
29
31
  const DEFAULT_REGISTRY_PATH = path.join(REPO_ROOT, 'registry.yaml');
30
32
  const DEFAULT_PACKS_MODULE_PATH = path.join(REPO_ROOT, 'tools', 'cli', 'lib', 'packs.js');
33
+ const DEFAULT_MODULE_PATH = path.join(REPO_ROOT, 'src', 'bmad-plus', 'module.yaml');
34
+ const MODULE_TEMPLATE_PATH = path.join(__dirname, 'module.template.yaml');
31
35
  const PACKAGE_JSON_PATH = path.join(REPO_ROOT, 'package.json');
32
36
 
33
37
  const INSTALL_LAYOUTS = ['loose', 'packaged'];
38
+ const OWNED_COUNT_RE = /(?<![\w.-])\d+\+?[\s-]+(?:[A-Za-zÀ-ÿ-]+\s+){0,6}(?:agents?|skills?|workflows?|packs?|frameworks?|languages?|reference files)\b/gi;
39
+ const STANDARD_PREFIX_RE = /\b(?:ISO(?:\/IEC)?|IEC|SOC|NIST(?: SP)?|PCI(?: DSS)?|WCAG|Section)\s*$/i;
40
+
41
+ function hasOwnedCount(value) {
42
+ return [...value.matchAll(OWNED_COUNT_RE)].some((match) =>
43
+ !STANDARD_PREFIX_RE.test(value.slice(0, match.index))
44
+ );
45
+ }
34
46
 
35
47
  /**
36
48
  * Validate the minimal contract the generator relies on.
@@ -53,11 +65,22 @@ function validateRegistry(registry) {
53
65
  seenOrders.add(pack.order);
54
66
 
55
67
  if (!pack.cli || typeof pack.cli !== 'object') throw new Error(`${where}: missing "cli" block`);
56
- for (const field of ['name', 'icon', 'desc']) {
68
+ for (const field of ['name', 'icon']) {
57
69
  if (typeof pack.cli[field] !== 'string' || pack.cli[field] === '') {
58
70
  throw new Error(`${where}: missing cli.${field}`);
59
71
  }
60
72
  }
73
+ if (!pack.cli.desc && !pack.cli.desc_template) {
74
+ throw new Error(`${where}: missing cli.desc or cli.desc_template`);
75
+ }
76
+ for (const [field, value] of Object.entries({
77
+ 'cli.desc': pack.cli.desc, 'cli.desc_template': pack.cli.desc_template,
78
+ summary: pack.summary, summary_template: pack.summary_template,
79
+ })) {
80
+ if (value !== undefined && (typeof value !== 'string' || hasOwnedCount(value))) {
81
+ throw new Error(`${where}: ${field} must use derived placeholders for owned count dimensions`);
82
+ }
83
+ }
61
84
  if (!Array.isArray(pack.agents)) throw new Error(`${where}: "agents" must be a list`);
62
85
  if (pack.skills !== undefined && !Array.isArray(pack.skills)) {
63
86
  throw new Error(`${where}: "skills" must be a list`);
@@ -71,6 +94,21 @@ function validateRegistry(registry) {
71
94
  if (pack.install_layout === 'packaged' && !Array.isArray((pack.doctor || {}).pack_agents)) {
72
95
  throw new Error(`${where}: packaged layout requires "doctor.pack_agents" list`);
73
96
  }
97
+ if (pack.personas !== undefined) {
98
+ if (!Array.isArray(pack.personas)) throw new Error(`${where}: personas must be a list`);
99
+ const roster = new Set([...pack.agents, ...(pack.sub_agents || [])]);
100
+ const ids = new Set();
101
+ for (const persona of pack.personas) {
102
+ if (!persona || ['id', 'name', 'role', 'description'].some((key) =>
103
+ typeof persona[key] !== 'string' || !persona[key].trim())) {
104
+ throw new Error(`${where}: each persona needs id, name, role and description`);
105
+ }
106
+ if (!roster.has(persona.id) || ids.has(persona.id)) {
107
+ throw new Error(`${where}: persona ${persona.id} is absent from its roster or duplicated`);
108
+ }
109
+ ids.add(persona.id);
110
+ }
111
+ }
74
112
  }
75
113
  return registry;
76
114
  }
@@ -99,6 +137,7 @@ function buildPackOrder(registry) {
99
137
  * - `required` only when true (other packs omit the key entirely)
100
138
  */
101
139
  function buildPacks(registry) {
140
+ const derived = buildDerived(registry);
102
141
  const packs = {};
103
142
  for (const [id, p] of sortedPackEntries(registry)) {
104
143
  const entry = {
@@ -112,12 +151,130 @@ function buildPacks(registry) {
112
151
  entry.packDir = p.pack_dir;
113
152
  entry.packSrcDir = p.pack_src_dir || 'packs';
114
153
  if (p.required === true) entry.required = true;
115
- entry.desc = p.cli.desc;
154
+ entry.desc = derived.packs[id].desc;
116
155
  packs[id] = entry;
117
156
  }
118
157
  return packs;
119
158
  }
120
159
 
160
+ /** Recursively count reference files; sourceRoot is injectable for fixture trees. */
161
+ function countMarkdownFiles(dir) {
162
+ if (!fs.existsSync(dir)) return 0;
163
+ return fs.readdirSync(dir, { withFileTypes: true }).reduce((count, entry) => {
164
+ if (entry.isDirectory()) return count + countMarkdownFiles(path.join(dir, entry.name));
165
+ return count + Number(entry.isFile() && entry.name.endsWith('.md'));
166
+ }, 0);
167
+ }
168
+
169
+ function renderSummary(pack, derived, field = 'summary') {
170
+ const template = field === 'summary' ? pack.summary_template : pack.cli.desc_template;
171
+ const fallback = field === 'summary' ? pack.summary : pack.cli.desc;
172
+ if (!template) return fallback || '';
173
+ const values = {
174
+ agent_count: derived.agentCount, installer_agent_count: derived.installerAgentCount,
175
+ sub_agent_count: derived.subAgentCount, workflow_count: derived.workflowCount,
176
+ framework_count: derived.frameworkCount, category_count: derived.categoryCount,
177
+ skill_count: derived.skillCount, reference_file_count: derived.referenceFiles,
178
+ };
179
+ return template.replace(/\{([a-z_]+)\}/g, (_match, key) => {
180
+ if (!(key in values)) throw new Error(`Unknown derived summary placeholder: ${key}`);
181
+ return String(values[key]);
182
+ });
183
+ }
184
+
185
+ /** The one derivation engine; its JSON result is shipped for runtime consumers. */
186
+ function buildDerived(registry, { sourceRoot = path.join(REPO_ROOT, 'src', 'bmad-plus') } = {}) {
187
+ const packs = {};
188
+ const pythonPacks = {};
189
+ let installerAgents = 0;
190
+ let totalAgents = 0;
191
+ for (const [id, pack] of sortedPackEntries(registry)) {
192
+ const categories = pack.categories || [];
193
+ const categoryAgentCounts = categories.map((category) => (category.agents || []).length);
194
+ const categoryAgentCount = categoryAgentCounts.reduce((sum, count) => sum + count, 0);
195
+ const installerAgentCount = pack.agents.length;
196
+ const subAgentCount = (pack.sub_agents || []).length;
197
+ const facts = {
198
+ id, order: pack.order, name: pack.cli.name, displayName: pack.display_name || pack.cli.name,
199
+ required: pack.required === true, installerAgentCount, categoryAgentCount,
200
+ agentCount: categoryAgentCount || subAgentCount || installerAgentCount,
201
+ subAgentCount,
202
+ workflowCount: (pack.workflows || []).length + categories.reduce((sum, c) => sum + (c.workflows || []).length, 0),
203
+ frameworkCount: (pack.compliance_tags || []).length,
204
+ categoryCount: categories.length,
205
+ skillCount: (pack.skills || []).length,
206
+ referenceFiles: countMarkdownFiles(path.join(sourceRoot, pack.pack_src_dir || 'packs', pack.pack_dir, 'references')),
207
+ categoryAgentCounts,
208
+ personas: (pack.personas || []).map(({ id, name, role, description, alias }) => ({
209
+ id, name, role, description, ...(alias ? { alias } : {}),
210
+ })),
211
+ };
212
+ facts.summary = renderSummary(pack, facts);
213
+ facts.desc = renderSummary(pack, facts, 'description');
214
+ facts.description = facts.desc;
215
+ packs[id] = facts;
216
+ installerAgents += installerAgentCount;
217
+ totalAgents += new Set([
218
+ ...pack.agents, ...(pack.sub_agents || []), ...categories.flatMap((c) => c.agents || []),
219
+ ]).size;
220
+ if ((pack.runtime || []).includes('python')) {
221
+ const packagePath = pack.python_package || `src/bmad-plus/${pack.pack_src_dir || 'packs'}/${pack.pack_dir}`;
222
+ pythonPacks[id] = {
223
+ requirements: [...packagePath.split(/[\\/]/), 'requirements.txt'],
224
+ verifyModules: [...(pack.python_verify_modules || [])],
225
+ };
226
+ }
227
+ }
228
+ const { LANGUAGES } = require('../cli/i18n');
229
+ return {
230
+ product: {
231
+ code: registry.product.code, displayName: registry.product.display_name,
232
+ version: registry.product.version, derivedFrom: registry.product.derived_from,
233
+ },
234
+ packOrder: buildPackOrder(registry),
235
+ packCount: Object.keys(packs).length, installerAgents, totalAgents,
236
+ languages: Object.keys(LANGUAGES), packs, pythonPacks,
237
+ targets: {
238
+ spine: registry.targets.spine,
239
+ adapters: registry.targets.adapters.map(({ tool, file }) => ({ tool, file })),
240
+ models_supported: [...registry.targets.models_supported],
241
+ },
242
+ };
243
+ }
244
+
245
+ /** Preserve project questions/compatibility separately from generated pack facts. */
246
+ function generateModuleSource(registry, templatePath = MODULE_TEMPLATE_PATH) {
247
+ const moduleConfig = yaml.load(fs.readFileSync(templatePath, 'utf8'));
248
+ const derived = buildDerived(registry);
249
+ moduleConfig.code = registry.product.code;
250
+ moduleConfig.packs = {};
251
+ for (const [id, pack] of sortedPackEntries(registry)) {
252
+ const facts = derived.packs[id];
253
+ const entry = {
254
+ name: facts.displayName, icon: pack.icon_emoji, description: facts.summary || facts.desc,
255
+ required: facts.required, agents: [...pack.agents], skills: [...(pack.skills || [])],
256
+ };
257
+ for (const key of ['data', 'external_package', 'orchestrator', 'categories', 'workflows',
258
+ 'sub_agents', 'required_keys', 'optional_keys', 'cohabitation_warning']) {
259
+ if (key in pack) entry[key] = JSON.parse(JSON.stringify(pack[key]));
260
+ }
261
+ if (pack.install_layout === 'packaged') {
262
+ entry.packDir = pack.pack_dir;
263
+ entry.packSrcDir = pack.pack_src_dir || 'packs';
264
+ }
265
+ moduleConfig.packs[id] = entry;
266
+ }
267
+ moduleConfig.install_packs['multi-select'] = [
268
+ ...derived.packOrder.filter((id) => !derived.packs[id].required).map((id) => ({
269
+ value: id, label: `${registry.packs[id].icon_emoji} ${derived.packs[id].displayName} — ${derived.packs[id].summary || derived.packs[id].desc}`,
270
+ })),
271
+ { value: 'all', label: 'Tout installer' },
272
+ { value: 'none', label: 'Aucun — Core uniquement' },
273
+ ];
274
+ return '# AUTO-GENERATED from registry.yaml + tools/build/module.template.yaml — DO NOT EDIT.\n' +
275
+ yaml.dump(moduleConfig, { lineWidth: 110, noRefs: true });
276
+ }
277
+
121
278
  /**
122
279
  * Generate EXPECTED_AGENTS (consumed by `bmad-plus doctor`).
123
280
  * - loose packs → agent DIRECTORIES checked under .agents/skills/
@@ -135,12 +292,13 @@ function buildExpectedAgents(registry) {
135
292
  return expected;
136
293
  }
137
294
 
138
- /** Convenience: all three artifacts at once. */
295
+ /** Convenience: all runtime artifacts at once. */
139
296
  function buildAll(registry) {
140
297
  return {
141
298
  PACKS: buildPacks(registry),
142
299
  PACK_ORDER: buildPackOrder(registry),
143
300
  EXPECTED_AGENTS: buildExpectedAgents(registry),
301
+ DERIVED: buildDerived(registry),
144
302
  };
145
303
  }
146
304
 
@@ -149,7 +307,7 @@ function buildAll(registry) {
149
307
  * Evaluating this source yields exports deep-equal to the hand-written module.
150
308
  */
151
309
  function generatePacksModuleSource(registry) {
152
- const { PACKS, PACK_ORDER, EXPECTED_AGENTS } = buildAll(registry);
310
+ const { PACKS, PACK_ORDER, EXPECTED_AGENTS, DERIVED } = buildAll(registry);
153
311
  const j = (value) => JSON.stringify(value, null, 2);
154
312
  return [
155
313
  '/**',
@@ -166,13 +324,17 @@ function generatePacksModuleSource(registry) {
166
324
  '',
167
325
  `const EXPECTED_AGENTS = ${j(EXPECTED_AGENTS)};`,
168
326
  '',
169
- 'module.exports = { PACKS, PACK_ORDER, EXPECTED_AGENTS };',
327
+ `const DERIVED = ${j(DERIVED)};`,
328
+ '',
329
+ 'module.exports = { PACKS, PACK_ORDER, EXPECTED_AGENTS, DERIVED };',
170
330
  '',
171
331
  ].join('\n');
172
332
  }
173
333
 
174
334
  /** Human-readable drill-down for a mismatching keyed object. */
175
335
  function describeDiff(label, generated, current, mismatches) {
336
+ generated = generated || {};
337
+ current = current || {};
176
338
  if (Array.isArray(generated) || Array.isArray(current)) {
177
339
  mismatches.push(
178
340
  `${label}: generated ${JSON.stringify(generated)} != current ${JSON.stringify(current)}`
@@ -202,8 +364,10 @@ function check({
202
364
  registryPath = DEFAULT_REGISTRY_PATH,
203
365
  packsModulePath = DEFAULT_PACKS_MODULE_PATH,
204
366
  packageJsonPath = PACKAGE_JSON_PATH,
367
+ modulePath = DEFAULT_MODULE_PATH,
205
368
  } = {}) {
206
369
  const registry = loadRegistry(registryPath);
370
+ delete require.cache[require.resolve(packsModulePath)];
207
371
  const current = require(packsModulePath);
208
372
  const generated = buildAll(registry);
209
373
  const mismatches = [];
@@ -216,11 +380,14 @@ function check({
216
380
  );
217
381
  }
218
382
 
219
- for (const key of ['PACKS', 'PACK_ORDER', 'EXPECTED_AGENTS']) {
383
+ for (const key of ['PACKS', 'PACK_ORDER', 'EXPECTED_AGENTS', 'DERIVED']) {
220
384
  if (!isDeepStrictEqual(generated[key], current[key])) {
221
385
  describeDiff(key, generated[key], current[key], mismatches);
222
386
  }
223
387
  }
388
+ if (fs.readFileSync(modulePath, 'utf8').replace(/\r\n/g, '\n') !== generateModuleSource(registry)) {
389
+ mismatches.push('module.yaml: generated pack metadata differs from registry.yaml');
390
+ }
224
391
 
225
392
  return { ok: mismatches.length === 0, mismatches };
226
393
  }
@@ -233,7 +400,7 @@ function main(argv) {
233
400
  if (args.includes('--check')) {
234
401
  const result = check();
235
402
  if (result.ok) {
236
- console.log('OK — registry.yaml reproduces tools/cli/lib/packs.js exactly (no drift).');
403
+ console.log('OK — registry.yaml reproduces packs.js and module.yaml (no drift).');
237
404
  return 0;
238
405
  }
239
406
  console.error('DRIFT DETECTED between registry.yaml and tools/cli/lib/packs.js:');
@@ -257,6 +424,11 @@ function main(argv) {
257
424
  return 1;
258
425
  }
259
426
  fs.writeFileSync(path.resolve(outPath), source, 'utf8');
427
+ const moduleOutIdx = args.indexOf('--module-out');
428
+ if (moduleOutIdx !== -1) {
429
+ if (!args[moduleOutIdx + 1]) throw new Error('--module-out requires a file path');
430
+ fs.writeFileSync(path.resolve(args[moduleOutIdx + 1]), generateModuleSource(registry), 'utf8');
431
+ }
260
432
  console.log(`Generated ${path.resolve(outPath)} from registry.yaml`);
261
433
  return 0;
262
434
  }
@@ -272,12 +444,17 @@ if (require.main === module) {
272
444
  module.exports = {
273
445
  DEFAULT_REGISTRY_PATH,
274
446
  DEFAULT_PACKS_MODULE_PATH,
447
+ DEFAULT_MODULE_PATH,
448
+ MODULE_TEMPLATE_PATH,
275
449
  loadRegistry,
276
450
  validateRegistry,
277
451
  buildPacks,
278
452
  buildPackOrder,
279
453
  buildExpectedAgents,
280
454
  buildAll,
455
+ buildDerived,
456
+ renderSummary,
457
+ generateModuleSource,
281
458
  generatePacksModuleSource,
282
459
  check,
283
460
  main,
@@ -28,16 +28,21 @@ To activate an agent, say its name or persona:
28
28
  - **Forge** (Architect-Dev) — Architecture + Development + Documentation
29
29
  - **Sentinel** (Quality) — QA + UX review
30
30
  - **Nexus** (Orchestrator) — Sprint management + Autopilot + Parallel execution
31
- - **Shadow** (OSINT) — Investigation + Scraping + Psychoprofiling (if OSINT pack installed)
32
- - **Maker** (Agent Creator) — Design, build, validate, and package new BMAD+ agents
33
- - **Shield** (GRC) — Compliance agents for GDPR, ISO 27001, SOC 2, HIPAA, EU AI Act, DORA, NIS2 and more (derived counts: see Registry facts below)
31
+ - **Shadow** (OSINT) — Investigation + Scraping + Psychoprofiling (OSINT)
32
+ - **Maker** (Agent Creator) — Design, build, validate, and package new BMAD+ agents (Maker)
33
+ - **Shield** (GRC) — Compliance agents for GDPR, ISO 27001, SOC 2, HIPAA, EU AI Act, DORA, NIS2 and more (Shield)
34
+ - **SEO Scout** (Technical Scanner) — Crawling + technical inspection + performance (SEO)
35
+ - **SEO Chief** (Strategist & Reporter) — Scoring + strategy + reporting (SEO)
36
+ - **SEO Judge** (Content & AI Analyst) — Content quality + structured data + GEO analysis (SEO)
37
+ - **Zecher** (זכר, Memory Guardian) — Memory Archivist — Persistent cross-session memory, consolidation, project scanning, context recall, session handoffs (Memory)
34
38
  - **Miriam** (מרים) — Business Analyst — Strategic analysis, research, product briefs (Dev Studio)
35
39
  - **Huldah** (חולדה) — Technical Writer — Documentation, diagrams, editorial review (Dev Studio)
36
40
  - **Yosef** (יוסף) — Product Manager — PRD, requirements, feature prioritization (Dev Studio)
37
41
  - **Rachel** (רחל) — UX Designer — User experience, wireframes, empathy mapping (Dev Studio)
38
42
  - **Bezalel** (בצלאל) — System Architect — Architecture, ADRs, epics & stories (Dev Studio)
39
43
  - **Oholiab** (אהליאב) — Senior Engineer — TDD, sprint, code review, implementation (Dev Studio)
40
- - **Zecher** (זכר, Memory Guardian) — Memory Archivist — Persistent cross-session memory, consolidation, project scanning, context recall, session handoffs
44
+ - **Backup Manager** (Backup & Restore) — Timestamped backups, restoration, and rotation (Backup)
45
+ - **Animated Website Creator** (Website Builder) — Video-driven scrolling websites (Animated)
41
46
 
42
47
  ## Skills
43
48
 
@@ -98,19 +103,27 @@ Agents MUST follow these behavioral principles:
98
103
  - `.agents/memory/patterns.md` — Write when a reusable pattern is validated
99
104
  - `.agents/memory/context.md` — Update at session end with project state
100
105
 
106
+ ## Framework updates
107
+
108
+ Once per session, check the installed framework before starting project work. If this is the BMAD+ source checkout, use `node tools/cli/bmad-plus-cli.js update-check --json`; otherwise use `npx --no-install bmad-plus update-check --json` from the project root.
109
+ If the command is unavailable or the result is off, unknown, offline or stale, continue the user task. Do not install a CLI just to perform this check or claim that an offline version is current.
110
+ When `updateAvailable` is true and `canAutoApply` is true, run the same CLI with `update --latest --auto`. This follows the project update policy; it does not grant permission to expand that policy.
111
+ When an update is available but automatic application is not eligible, explain the version and reason. An explicit request to update can be fulfilled with `update --latest --yes`; do not change the policy, overwrite customized files, or resolve conflicts without the user request covering that action.
112
+ After a successful update, reread the project spine and relevant installed skills, or start a fresh session if the client cannot reload them. Respect preserved local instructions. Check only once even when several adapters include this section.
113
+
101
114
  ## Registry facts (computed from registry.yaml — never hand-typed)
102
115
 
103
- - Product: BMAD+ v0.12.2 (derived from BMAD-METHOD v6.6.0)
116
+ - Product: BMAD+ v0.13.0 (derived from BMAD-METHOD v6.6.0)
104
117
  - Models supported: claude, gpt, gemini, local (model-agnostic by contract)
105
118
  - Packs (9): Core, OSINT, Maker, Shield, SEO, Memory, Dev Studio, Backup, Animated
106
119
  - Installer agents (14 across all packs):
107
120
  - Core (required): 4 installer agents — Core agents & skills
108
121
  - OSINT: 1 installer agent — OSINT & investigation — 2 compliance frameworks
109
122
  - Maker: 1 installer agent — Agent creation toolkit
110
- - Shield: 1 installer agent — GRC compliance (25+ frameworks) — 27 specialized agents, 11 workflows, 26 compliance frameworks
123
+ - Shield: 1 installer agent — GRC compliance (26 frameworks) — 27 specialized agents, 11 workflows, 26 compliance frameworks
111
124
  - SEO: 3 installer agents — SEO audit & optimization — 1 compliance frameworks
112
125
  - Memory: 1 installer agent — Persistent cross-session memory
113
- - Dev Studio: 1 installer agent — SDLC automation (6 agents, 56+ skills) — 6 sub-agents, 38 workflows
126
+ - Dev Studio: 1 installer agent — SDLC automation (6 agents, specialized workflows) — 6 sub-agents, 38 workflows
114
127
  - Backup: 1 installer agent — Backup & restore
115
128
  - Animated: 1 installer agent — Animated website agents
116
129
 
@@ -33,16 +33,21 @@ To activate an agent, say its name or persona:
33
33
  - **Forge** (Architect-Dev) — Architecture + Development + Documentation
34
34
  - **Sentinel** (Quality) — QA + UX review
35
35
  - **Nexus** (Orchestrator) — Sprint management + Autopilot + Parallel execution
36
- - **Shadow** (OSINT) — Investigation + Scraping + Psychoprofiling (if OSINT pack installed)
37
- - **Maker** (Agent Creator) — Design, build, validate, and package new BMAD+ agents
38
- - **Shield** (GRC) — Compliance agents for GDPR, ISO 27001, SOC 2, HIPAA, EU AI Act, DORA, NIS2 and more (derived counts: see Registry facts below)
36
+ - **Shadow** (OSINT) — Investigation + Scraping + Psychoprofiling (OSINT)
37
+ - **Maker** (Agent Creator) — Design, build, validate, and package new BMAD+ agents (Maker)
38
+ - **Shield** (GRC) — Compliance agents for GDPR, ISO 27001, SOC 2, HIPAA, EU AI Act, DORA, NIS2 and more (Shield)
39
+ - **SEO Scout** (Technical Scanner) — Crawling + technical inspection + performance (SEO)
40
+ - **SEO Chief** (Strategist & Reporter) — Scoring + strategy + reporting (SEO)
41
+ - **SEO Judge** (Content & AI Analyst) — Content quality + structured data + GEO analysis (SEO)
42
+ - **Zecher** (זכר, Memory Guardian) — Memory Archivist — Persistent cross-session memory, consolidation, project scanning, context recall, session handoffs (Memory)
39
43
  - **Miriam** (מרים) — Business Analyst — Strategic analysis, research, product briefs (Dev Studio)
40
44
  - **Huldah** (חולדה) — Technical Writer — Documentation, diagrams, editorial review (Dev Studio)
41
45
  - **Yosef** (יוסף) — Product Manager — PRD, requirements, feature prioritization (Dev Studio)
42
46
  - **Rachel** (רחל) — UX Designer — User experience, wireframes, empathy mapping (Dev Studio)
43
47
  - **Bezalel** (בצלאל) — System Architect — Architecture, ADRs, epics & stories (Dev Studio)
44
48
  - **Oholiab** (אהליאב) — Senior Engineer — TDD, sprint, code review, implementation (Dev Studio)
45
- - **Zecher** (זכר, Memory Guardian) — Memory Archivist — Persistent cross-session memory, consolidation, project scanning, context recall, session handoffs
49
+ - **Backup Manager** (Backup & Restore) — Timestamped backups, restoration, and rotation (Backup)
50
+ - **Animated Website Creator** (Website Builder) — Video-driven scrolling websites (Animated)
46
51
 
47
52
  ## Skills
48
53
 
@@ -103,19 +108,27 @@ Agents MUST follow these behavioral principles:
103
108
  - `.agents/memory/patterns.md` — Write when a reusable pattern is validated
104
109
  - `.agents/memory/context.md` — Update at session end with project state
105
110
 
111
+ ## Framework updates
112
+
113
+ Once per session, check the installed framework before starting project work. If this is the BMAD+ source checkout, use `node tools/cli/bmad-plus-cli.js update-check --json`; otherwise use `npx --no-install bmad-plus update-check --json` from the project root.
114
+ If the command is unavailable or the result is off, unknown, offline or stale, continue the user task. Do not install a CLI just to perform this check or claim that an offline version is current.
115
+ When `updateAvailable` is true and `canAutoApply` is true, run the same CLI with `update --latest --auto`. This follows the project update policy; it does not grant permission to expand that policy.
116
+ When an update is available but automatic application is not eligible, explain the version and reason. An explicit request to update can be fulfilled with `update --latest --yes`; do not change the policy, overwrite customized files, or resolve conflicts without the user request covering that action.
117
+ After a successful update, reread the project spine and relevant installed skills, or start a fresh session if the client cannot reload them. Respect preserved local instructions. Check only once even when several adapters include this section.
118
+
106
119
  ## Registry facts (computed from registry.yaml — never hand-typed)
107
120
 
108
- - Product: BMAD+ v0.12.2 (derived from BMAD-METHOD v6.6.0)
121
+ - Product: BMAD+ v0.13.0 (derived from BMAD-METHOD v6.6.0)
109
122
  - Models supported: claude, gpt, gemini, local (model-agnostic by contract)
110
123
  - Packs (9): Core, OSINT, Maker, Shield, SEO, Memory, Dev Studio, Backup, Animated
111
124
  - Installer agents (14 across all packs):
112
125
  - Core (required): 4 installer agents — Core agents & skills
113
126
  - OSINT: 1 installer agent — OSINT & investigation — 2 compliance frameworks
114
127
  - Maker: 1 installer agent — Agent creation toolkit
115
- - Shield: 1 installer agent — GRC compliance (25+ frameworks) — 27 specialized agents, 11 workflows, 26 compliance frameworks
128
+ - Shield: 1 installer agent — GRC compliance (26 frameworks) — 27 specialized agents, 11 workflows, 26 compliance frameworks
116
129
  - SEO: 3 installer agents — SEO audit & optimization — 1 compliance frameworks
117
130
  - Memory: 1 installer agent — Persistent cross-session memory
118
- - Dev Studio: 1 installer agent — SDLC automation (6 agents, 56+ skills) — 6 sub-agents, 38 workflows
131
+ - Dev Studio: 1 installer agent — SDLC automation (6 agents, specialized workflows) — 6 sub-agents, 38 workflows
119
132
  - Backup: 1 installer agent — Backup & restore
120
133
  - Animated: 1 installer agent — Animated website agents
121
134
 
@@ -28,16 +28,21 @@ To activate an agent, say its name or persona:
28
28
  - **Forge** (Architect-Dev) — Architecture + Development + Documentation
29
29
  - **Sentinel** (Quality) — QA + UX review
30
30
  - **Nexus** (Orchestrator) — Sprint management + Autopilot + Parallel execution
31
- - **Shadow** (OSINT) — Investigation + Scraping + Psychoprofiling (if OSINT pack installed)
32
- - **Maker** (Agent Creator) — Design, build, validate, and package new BMAD+ agents
33
- - **Shield** (GRC) — Compliance agents for GDPR, ISO 27001, SOC 2, HIPAA, EU AI Act, DORA, NIS2 and more (derived counts: see Registry facts below)
31
+ - **Shadow** (OSINT) — Investigation + Scraping + Psychoprofiling (OSINT)
32
+ - **Maker** (Agent Creator) — Design, build, validate, and package new BMAD+ agents (Maker)
33
+ - **Shield** (GRC) — Compliance agents for GDPR, ISO 27001, SOC 2, HIPAA, EU AI Act, DORA, NIS2 and more (Shield)
34
+ - **SEO Scout** (Technical Scanner) — Crawling + technical inspection + performance (SEO)
35
+ - **SEO Chief** (Strategist & Reporter) — Scoring + strategy + reporting (SEO)
36
+ - **SEO Judge** (Content & AI Analyst) — Content quality + structured data + GEO analysis (SEO)
37
+ - **Zecher** (זכר, Memory Guardian) — Memory Archivist — Persistent cross-session memory, consolidation, project scanning, context recall, session handoffs (Memory)
34
38
  - **Miriam** (מרים) — Business Analyst — Strategic analysis, research, product briefs (Dev Studio)
35
39
  - **Huldah** (חולדה) — Technical Writer — Documentation, diagrams, editorial review (Dev Studio)
36
40
  - **Yosef** (יוסף) — Product Manager — PRD, requirements, feature prioritization (Dev Studio)
37
41
  - **Rachel** (רחל) — UX Designer — User experience, wireframes, empathy mapping (Dev Studio)
38
42
  - **Bezalel** (בצלאל) — System Architect — Architecture, ADRs, epics & stories (Dev Studio)
39
43
  - **Oholiab** (אהליאב) — Senior Engineer — TDD, sprint, code review, implementation (Dev Studio)
40
- - **Zecher** (זכר, Memory Guardian) — Memory Archivist — Persistent cross-session memory, consolidation, project scanning, context recall, session handoffs
44
+ - **Backup Manager** (Backup & Restore) — Timestamped backups, restoration, and rotation (Backup)
45
+ - **Animated Website Creator** (Website Builder) — Video-driven scrolling websites (Animated)
41
46
 
42
47
  ## Skills
43
48
 
@@ -98,19 +103,27 @@ Agents MUST follow these behavioral principles:
98
103
  - `.agents/memory/patterns.md` — Write when a reusable pattern is validated
99
104
  - `.agents/memory/context.md` — Update at session end with project state
100
105
 
106
+ ## Framework updates
107
+
108
+ Once per session, check the installed framework before starting project work. If this is the BMAD+ source checkout, use `node tools/cli/bmad-plus-cli.js update-check --json`; otherwise use `npx --no-install bmad-plus update-check --json` from the project root.
109
+ If the command is unavailable or the result is off, unknown, offline or stale, continue the user task. Do not install a CLI just to perform this check or claim that an offline version is current.
110
+ When `updateAvailable` is true and `canAutoApply` is true, run the same CLI with `update --latest --auto`. This follows the project update policy; it does not grant permission to expand that policy.
111
+ When an update is available but automatic application is not eligible, explain the version and reason. An explicit request to update can be fulfilled with `update --latest --yes`; do not change the policy, overwrite customized files, or resolve conflicts without the user request covering that action.
112
+ After a successful update, reread the project spine and relevant installed skills, or start a fresh session if the client cannot reload them. Respect preserved local instructions. Check only once even when several adapters include this section.
113
+
101
114
  ## Registry facts (computed from registry.yaml — never hand-typed)
102
115
 
103
- - Product: BMAD+ v0.12.2 (derived from BMAD-METHOD v6.6.0)
116
+ - Product: BMAD+ v0.13.0 (derived from BMAD-METHOD v6.6.0)
104
117
  - Models supported: claude, gpt, gemini, local (model-agnostic by contract)
105
118
  - Packs (9): Core, OSINT, Maker, Shield, SEO, Memory, Dev Studio, Backup, Animated
106
119
  - Installer agents (14 across all packs):
107
120
  - Core (required): 4 installer agents — Core agents & skills
108
121
  - OSINT: 1 installer agent — OSINT & investigation — 2 compliance frameworks
109
122
  - Maker: 1 installer agent — Agent creation toolkit
110
- - Shield: 1 installer agent — GRC compliance (25+ frameworks) — 27 specialized agents, 11 workflows, 26 compliance frameworks
123
+ - Shield: 1 installer agent — GRC compliance (26 frameworks) — 27 specialized agents, 11 workflows, 26 compliance frameworks
111
124
  - SEO: 3 installer agents — SEO audit & optimization — 1 compliance frameworks
112
125
  - Memory: 1 installer agent — Persistent cross-session memory
113
- - Dev Studio: 1 installer agent — SDLC automation (6 agents, 56+ skills) — 6 sub-agents, 38 workflows
126
+ - Dev Studio: 1 installer agent — SDLC automation (6 agents, specialized workflows) — 6 sub-agents, 38 workflows
114
127
  - Backup: 1 installer agent — Backup & restore
115
128
  - Animated: 1 installer agent — Animated website agents
116
129
 
@@ -26,16 +26,21 @@ To activate an agent, say its name or persona:
26
26
  - **Forge** (Architect-Dev) — Architecture + Development + Documentation
27
27
  - **Sentinel** (Quality) — QA + UX review
28
28
  - **Nexus** (Orchestrator) — Sprint management + Autopilot + Parallel execution
29
- - **Shadow** (OSINT) — Investigation + Scraping + Psychoprofiling (if OSINT pack installed)
30
- - **Maker** (Agent Creator) — Design, build, validate, and package new BMAD+ agents
31
- - **Shield** (GRC) — Compliance agents for GDPR, ISO 27001, SOC 2, HIPAA, EU AI Act, DORA, NIS2 and more (derived counts: see Registry facts below)
29
+ - **Shadow** (OSINT) — Investigation + Scraping + Psychoprofiling (OSINT)
30
+ - **Maker** (Agent Creator) — Design, build, validate, and package new BMAD+ agents (Maker)
31
+ - **Shield** (GRC) — Compliance agents for GDPR, ISO 27001, SOC 2, HIPAA, EU AI Act, DORA, NIS2 and more (Shield)
32
+ - **SEO Scout** (Technical Scanner) — Crawling + technical inspection + performance (SEO)
33
+ - **SEO Chief** (Strategist & Reporter) — Scoring + strategy + reporting (SEO)
34
+ - **SEO Judge** (Content & AI Analyst) — Content quality + structured data + GEO analysis (SEO)
35
+ - **Zecher** (זכר, Memory Guardian) — Memory Archivist — Persistent cross-session memory, consolidation, project scanning, context recall, session handoffs (Memory)
32
36
  - **Miriam** (מרים) — Business Analyst — Strategic analysis, research, product briefs (Dev Studio)
33
37
  - **Huldah** (חולדה) — Technical Writer — Documentation, diagrams, editorial review (Dev Studio)
34
38
  - **Yosef** (יוסף) — Product Manager — PRD, requirements, feature prioritization (Dev Studio)
35
39
  - **Rachel** (רחל) — UX Designer — User experience, wireframes, empathy mapping (Dev Studio)
36
40
  - **Bezalel** (בצלאל) — System Architect — Architecture, ADRs, epics & stories (Dev Studio)
37
41
  - **Oholiab** (אהליאב) — Senior Engineer — TDD, sprint, code review, implementation (Dev Studio)
38
- - **Zecher** (זכר, Memory Guardian) — Memory Archivist — Persistent cross-session memory, consolidation, project scanning, context recall, session handoffs
42
+ - **Backup Manager** (Backup & Restore) — Timestamped backups, restoration, and rotation (Backup)
43
+ - **Animated Website Creator** (Website Builder) — Video-driven scrolling websites (Animated)
39
44
 
40
45
  ## Skills
41
46
 
@@ -96,19 +101,27 @@ Agents MUST follow these behavioral principles:
96
101
  - `.agents/memory/patterns.md` — Write when a reusable pattern is validated
97
102
  - `.agents/memory/context.md` — Update at session end with project state
98
103
 
104
+ ## Framework updates
105
+
106
+ Once per session, check the installed framework before starting project work. If this is the BMAD+ source checkout, use `node tools/cli/bmad-plus-cli.js update-check --json`; otherwise use `npx --no-install bmad-plus update-check --json` from the project root.
107
+ If the command is unavailable or the result is off, unknown, offline or stale, continue the user task. Do not install a CLI just to perform this check or claim that an offline version is current.
108
+ When `updateAvailable` is true and `canAutoApply` is true, run the same CLI with `update --latest --auto`. This follows the project update policy; it does not grant permission to expand that policy.
109
+ When an update is available but automatic application is not eligible, explain the version and reason. An explicit request to update can be fulfilled with `update --latest --yes`; do not change the policy, overwrite customized files, or resolve conflicts without the user request covering that action.
110
+ After a successful update, reread the project spine and relevant installed skills, or start a fresh session if the client cannot reload them. Respect preserved local instructions. Check only once even when several adapters include this section.
111
+
99
112
  ## Registry facts (computed from registry.yaml — never hand-typed)
100
113
 
101
- - Product: BMAD+ v0.12.2 (derived from BMAD-METHOD v6.6.0)
114
+ - Product: BMAD+ v0.13.0 (derived from BMAD-METHOD v6.6.0)
102
115
  - Models supported: claude, gpt, gemini, local (model-agnostic by contract)
103
116
  - Packs (9): Core, OSINT, Maker, Shield, SEO, Memory, Dev Studio, Backup, Animated
104
117
  - Installer agents (14 across all packs):
105
118
  - Core (required): 4 installer agents — Core agents & skills
106
119
  - OSINT: 1 installer agent — OSINT & investigation — 2 compliance frameworks
107
120
  - Maker: 1 installer agent — Agent creation toolkit
108
- - Shield: 1 installer agent — GRC compliance (25+ frameworks) — 27 specialized agents, 11 workflows, 26 compliance frameworks
121
+ - Shield: 1 installer agent — GRC compliance (26 frameworks) — 27 specialized agents, 11 workflows, 26 compliance frameworks
109
122
  - SEO: 3 installer agents — SEO audit & optimization — 1 compliance frameworks
110
123
  - Memory: 1 installer agent — Persistent cross-session memory
111
- - Dev Studio: 1 installer agent — SDLC automation (6 agents, 56+ skills) — 6 sub-agents, 38 workflows
124
+ - Dev Studio: 1 installer agent — SDLC automation (6 agents, specialized workflows) — 6 sub-agents, 38 workflows
112
125
  - Backup: 1 installer agent — Backup & restore
113
126
  - Animated: 1 installer agent — Animated website agents
114
127
 
@@ -29,16 +29,21 @@ To activate an agent, say its name or persona:
29
29
  - **Forge** (Architect-Dev) — Architecture + Development + Documentation
30
30
  - **Sentinel** (Quality) — QA + UX review
31
31
  - **Nexus** (Orchestrator) — Sprint management + Autopilot + Parallel execution
32
- - **Shadow** (OSINT) — Investigation + Scraping + Psychoprofiling (if OSINT pack installed)
33
- - **Maker** (Agent Creator) — Design, build, validate, and package new BMAD+ agents
34
- - **Shield** (GRC) — Compliance agents for GDPR, ISO 27001, SOC 2, HIPAA, EU AI Act, DORA, NIS2 and more (derived counts: see Registry facts below)
32
+ - **Shadow** (OSINT) — Investigation + Scraping + Psychoprofiling (OSINT)
33
+ - **Maker** (Agent Creator) — Design, build, validate, and package new BMAD+ agents (Maker)
34
+ - **Shield** (GRC) — Compliance agents for GDPR, ISO 27001, SOC 2, HIPAA, EU AI Act, DORA, NIS2 and more (Shield)
35
+ - **SEO Scout** (Technical Scanner) — Crawling + technical inspection + performance (SEO)
36
+ - **SEO Chief** (Strategist & Reporter) — Scoring + strategy + reporting (SEO)
37
+ - **SEO Judge** (Content & AI Analyst) — Content quality + structured data + GEO analysis (SEO)
38
+ - **Zecher** (זכר, Memory Guardian) — Memory Archivist — Persistent cross-session memory, consolidation, project scanning, context recall, session handoffs (Memory)
35
39
  - **Miriam** (מרים) — Business Analyst — Strategic analysis, research, product briefs (Dev Studio)
36
40
  - **Huldah** (חולדה) — Technical Writer — Documentation, diagrams, editorial review (Dev Studio)
37
41
  - **Yosef** (יוסף) — Product Manager — PRD, requirements, feature prioritization (Dev Studio)
38
42
  - **Rachel** (רחל) — UX Designer — User experience, wireframes, empathy mapping (Dev Studio)
39
43
  - **Bezalel** (בצלאל) — System Architect — Architecture, ADRs, epics & stories (Dev Studio)
40
44
  - **Oholiab** (אהליאב) — Senior Engineer — TDD, sprint, code review, implementation (Dev Studio)
41
- - **Zecher** (זכר, Memory Guardian) — Memory Archivist — Persistent cross-session memory, consolidation, project scanning, context recall, session handoffs
45
+ - **Backup Manager** (Backup & Restore) — Timestamped backups, restoration, and rotation (Backup)
46
+ - **Animated Website Creator** (Website Builder) — Video-driven scrolling websites (Animated)
42
47
 
43
48
  ## Skills
44
49
 
@@ -99,19 +104,27 @@ Agents MUST follow these behavioral principles:
99
104
  - `.agents/memory/patterns.md` — Write when a reusable pattern is validated
100
105
  - `.agents/memory/context.md` — Update at session end with project state
101
106
 
107
+ ## Framework updates
108
+
109
+ Once per session, check the installed framework before starting project work. If this is the BMAD+ source checkout, use `node tools/cli/bmad-plus-cli.js update-check --json`; otherwise use `npx --no-install bmad-plus update-check --json` from the project root.
110
+ If the command is unavailable or the result is off, unknown, offline or stale, continue the user task. Do not install a CLI just to perform this check or claim that an offline version is current.
111
+ When `updateAvailable` is true and `canAutoApply` is true, run the same CLI with `update --latest --auto`. This follows the project update policy; it does not grant permission to expand that policy.
112
+ When an update is available but automatic application is not eligible, explain the version and reason. An explicit request to update can be fulfilled with `update --latest --yes`; do not change the policy, overwrite customized files, or resolve conflicts without the user request covering that action.
113
+ After a successful update, reread the project spine and relevant installed skills, or start a fresh session if the client cannot reload them. Respect preserved local instructions. Check only once even when several adapters include this section.
114
+
102
115
  ## Registry facts (computed from registry.yaml — never hand-typed)
103
116
 
104
- - Product: BMAD+ v0.12.2 (derived from BMAD-METHOD v6.6.0)
117
+ - Product: BMAD+ v0.13.0 (derived from BMAD-METHOD v6.6.0)
105
118
  - Models supported: claude, gpt, gemini, local (model-agnostic by contract)
106
119
  - Packs (9): Core, OSINT, Maker, Shield, SEO, Memory, Dev Studio, Backup, Animated
107
120
  - Installer agents (14 across all packs):
108
121
  - Core (required): 4 installer agents — Core agents & skills
109
122
  - OSINT: 1 installer agent — OSINT & investigation — 2 compliance frameworks
110
123
  - Maker: 1 installer agent — Agent creation toolkit
111
- - Shield: 1 installer agent — GRC compliance (25+ frameworks) — 27 specialized agents, 11 workflows, 26 compliance frameworks
124
+ - Shield: 1 installer agent — GRC compliance (26 frameworks) — 27 specialized agents, 11 workflows, 26 compliance frameworks
112
125
  - SEO: 3 installer agents — SEO audit & optimization — 1 compliance frameworks
113
126
  - Memory: 1 installer agent — Persistent cross-session memory
114
- - Dev Studio: 1 installer agent — SDLC automation (6 agents, 56+ skills) — 6 sub-agents, 38 workflows
127
+ - Dev Studio: 1 installer agent — SDLC automation (6 agents, specialized workflows) — 6 sub-agents, 38 workflows
115
128
  - Backup: 1 installer agent — Backup & restore
116
129
  - Animated: 1 installer agent — Animated website agents
117
130