bmad-plus 0.4.2 β†’ 0.4.3

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 CHANGED
@@ -4,6 +4,33 @@ All notable changes to BMAD+ will be documented in this file.
4
4
 
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
+ ## [0.4.3] β€” 2026-05-17
8
+
9
+ ### πŸ”§ CLI Commands + Security Hardening + UX Enhancements
10
+
11
+ ### Added
12
+ - **`bmad-plus update`** β€” Update agents & skills while preserving config, IDE configs, and output directories
13
+ - **`bmad-plus doctor`** β€” Check installation integrity (version, agents, configs, pack health)
14
+ - **Internationalized `uninstall`** β€” Uses i18n system from install manifest language (10 languages)
15
+ - **Credits at startup** β€” Author attribution displayed immediately when installer launches
16
+ - **Enriched post-install guide** β€” CLI commands section + pack-specific usage examples in selected language
17
+ - **i18n strings for update/uninstall/doctor** β€” EN, FR, ES, DE, PT-BR, RU, ZH, HE, JA, IT
18
+ - **CLI guide strings** β€” `guide_cli_title`, `guide_examples_title`, pack examples for SEO/Backup/Animated/OSINT
19
+
20
+ ### Fixed
21
+ - **Security** β€” Added `mcp-server/.env` to `.gitignore`, created `.env.example` template
22
+ - **Manifest version** β€” Now reads from `package.json` dynamically (was hardcoded `0.4.0`)
23
+ - **`module.yaml` sync** β€” Added missing SEO, Backup, Animated pack definitions
24
+ - **`package.json` cleanup** β€” Removed `oveanet-pack` from `files[]` (already excluded by `.npmignore`)
25
+ - **CI/CD reliability** β€” Removed `continue-on-error` from npm publish step
26
+ - **Comment accuracy** β€” Updated "9 languages" β†’ "10 languages" in install.js header
27
+ - **Installer title** β€” Now reads version from `package.json` dynamically
28
+
29
+ ### Changed
30
+ - **Dependencies** β€” Updated `@clack/prompts` 1.1.0 β†’ 1.4.0, `fs-extra` 11.3.4 β†’ 11.3.5
31
+ - **npm scripts** β€” Added `update:bmad` and `doctor:bmad` scripts
32
+
33
+ ---
7
34
 
8
35
  ## [0.4.2] β€” 2026-03-19
9
36
 
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # πŸš€ BMAD+ β€” Augmented AI-Driven Development Framework
2
2
 
3
- [![Version](https://img.shields.io/badge/version-0.4.2-blue.svg)](CHANGELOG.md)
3
+ [![Version](https://img.shields.io/badge/version-0.4.3-blue.svg)](CHANGELOG.md)
4
4
  [![Based on](https://img.shields.io/badge/based%20on-BMAD--METHOD%20v6.2.0-green.svg)](https://github.com/bmad-code-org/BMAD-METHOD)
5
5
  [![License](https://img.shields.io/badge/license-MIT-yellow.svg)](LICENSE)
6
6
 
@@ -425,6 +425,7 @@ BMAD+/
425
425
  | **0.4.0** | 2026-03-19 | 🏒 SEO Engine v2.1 β€” SKILL.md orchestrator, Google APIs, HTML reports, competitor benchmark, 50 tests, GSC + GA4 extensions |
426
426
  | **0.4.1** | 2026-03-19 |
427
427
  | **0.4.2** | 2026-03-19 | Public packs SEO/Backup/Animated agents now in npm package | 🌐 10-language CLI, CI/CD pipeline, `.npmignore`, `/deploy` workflow, security hardening |
428
+ | **0.4.3** | 2026-05-17 | πŸ”§ `update` + `doctor` commands, i18n uninstall, enriched guide with CLI commands & examples, credits at startup, security hardening |
428
429
 
429
430
  See [CHANGELOG.md](CHANGELOG.md) for full details.
430
431
 
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://json.schemastore.org/package.json",
3
3
  "name": "bmad-plus",
4
- "version": "0.4.2",
4
+ "version": "0.4.3",
5
5
  "description": "BMAD+ β€” Augmented AI-Driven Development Framework with multi-role agents, autopilot, and parallel execution",
6
6
  "keywords": [
7
7
  "bmad",
@@ -27,19 +27,20 @@
27
27
  "tools",
28
28
  "src/bmad-plus",
29
29
  "osint-agent-package",
30
- "oveanet-pack",
31
30
  "readme-international",
32
31
  "CHANGELOG.md"
33
32
  ],
34
33
  "scripts": {
35
34
  "install:bmad": "node tools/cli/bmad-plus-cli.js install",
35
+ "update:bmad": "node tools/cli/bmad-plus-cli.js update",
36
+ "doctor:bmad": "node tools/cli/bmad-plus-cli.js doctor",
36
37
  "uninstall:bmad": "node tools/cli/bmad-plus-cli.js uninstall"
37
38
  },
38
39
  "dependencies": {
39
- "@clack/prompts": "^1.0.0",
40
+ "@clack/prompts": "^1.4.0",
40
41
  "chalk": "^4.1.2",
41
42
  "commander": "^14.0.0",
42
- "fs-extra": "^11.3.0",
43
+ "fs-extra": "^11.3.5",
43
44
  "js-yaml": "^4.1.0",
44
45
  "picocolors": "^1.1.1"
45
46
  },
@@ -1,6 +1,6 @@
1
1
  # πŸš€ BMAD+ β€” Erweitertes KI-gestΓΌtztes Entwicklungs-Framework
2
2
 
3
- [![Version](https://img.shields.io/badge/version-0.4.2-blue.svg)](../CHANGELOG.md)
3
+ [![Version](https://img.shields.io/badge/version-0.4.3-blue.svg)](../CHANGELOG.md)
4
4
  [![Based on](https://img.shields.io/badge/based%20on-BMAD--METHOD%20v6.2.0-green.svg)](https://github.com/bmad-code-org/BMAD-METHOD)
5
5
  [![License](https://img.shields.io/badge/license-MIT-yellow.svg)](../LICENSE)
6
6
 
@@ -1,6 +1,6 @@
1
1
  # πŸš€ BMAD+ β€” Framework de Desarrollo Impulsado por IA Aumentada
2
2
 
3
- [![Version](https://img.shields.io/badge/version-0.4.2-blue.svg)](../CHANGELOG.md)
3
+ [![Version](https://img.shields.io/badge/version-0.4.3-blue.svg)](../CHANGELOG.md)
4
4
  [![Based on](https://img.shields.io/badge/based%20on-BMAD--METHOD%20v6.2.0-green.svg)](https://github.com/bmad-code-org/BMAD-METHOD)
5
5
  [![License](https://img.shields.io/badge/license-MIT-yellow.svg)](../LICENSE)
6
6
 
@@ -1,6 +1,6 @@
1
1
  # πŸš€ BMAD+ β€” Augmented AI-Driven Development Framework
2
2
 
3
- [![Version](https://img.shields.io/badge/version-0.4.2-blue.svg)](../CHANGELOG.md)
3
+ [![Version](https://img.shields.io/badge/version-0.4.3-blue.svg)](../CHANGELOG.md)
4
4
  [![Based on](https://img.shields.io/badge/based%20on-BMAD--METHOD%20v6.2.0-green.svg)](https://github.com/bmad-code-org/BMAD-METHOD)
5
5
  [![License](https://img.shields.io/badge/license-MIT-yellow.svg)](../LICENSE)
6
6
 
@@ -74,6 +74,35 @@ packs:
74
74
  - bmad-audit-scan
75
75
  - bmad-audit-report
76
76
 
77
+ seo:
78
+ name: "SEO Audit 360"
79
+ icon: "πŸ”"
80
+ description: "3 agents (Scout, Chief, Judge) + 6-phase audit + PageSpeed loop"
81
+ required: false
82
+ packDir: pack-seo
83
+ agents:
84
+ - seo-scout
85
+ - seo-chief
86
+ - seo-judge
87
+
88
+ backup:
89
+ name: "Universal Backup"
90
+ icon: "πŸ—‚οΈ"
91
+ description: "Timestamped ZIP backup with smart exclusions"
92
+ required: false
93
+ packDir: pack-backup
94
+ agents:
95
+ - backup-agent
96
+
97
+ animated:
98
+ name: "Animated Website"
99
+ icon: "🎬"
100
+ description: "Luxury scroll-driven website from video"
101
+ required: false
102
+ packDir: pack-animated
103
+ agents:
104
+ - animated-website-agent
105
+
77
106
  install_packs:
78
107
  prompt:
79
108
  - "Quels packs additionnels souhaites-tu installer ?"
@@ -2,6 +2,7 @@
2
2
 
3
3
  /**
4
4
  * BMAD+ CLI β€” Main entry point
5
+ * Commands: install, uninstall, update, doctor
5
6
  */
6
7
 
7
8
  const { program } = require('commander');
@@ -22,6 +23,8 @@ if (process.stdin.isTTY) {
22
23
  // Register commands
23
24
  const install = require('./commands/install');
24
25
  const uninstall = require('./commands/uninstall');
26
+ const update = require('./commands/update');
27
+ const doctor = require('./commands/doctor');
25
28
 
26
29
  program
27
30
  .version(packageJson.version)
@@ -43,6 +46,26 @@ const uninstallCmd = program
43
46
  .description('Remove BMAD+ from your project');
44
47
  uninstallCmd.action(uninstall.action);
45
48
 
49
+ // Update command
50
+ const updateCmd = program
51
+ .command('update')
52
+ .description('Update BMAD+ agents and skills (preserves config)');
53
+
54
+ for (const option of update.options || []) {
55
+ updateCmd.option(...option);
56
+ }
57
+ updateCmd.action(update.action);
58
+
59
+ // Doctor command
60
+ const doctorCmd = program
61
+ .command('doctor')
62
+ .description('Check BMAD+ installation integrity');
63
+
64
+ for (const option of doctor.options || []) {
65
+ doctorCmd.option(...option);
66
+ }
67
+ doctorCmd.action(doctor.action);
68
+
46
69
  program.parse(process.argv);
47
70
 
48
71
  if (process.argv.slice(2).length === 0) {
@@ -0,0 +1,175 @@
1
+ /**
2
+ * BMAD+ Doctor Command
3
+ * Checks installation integrity and reports issues
4
+ *
5
+ * Author: Laurent Rochetta
6
+ */
7
+
8
+ const path = require('node:path');
9
+ const fs = require('node:fs');
10
+ const clack = require('@clack/prompts');
11
+ const pc = require('picocolors');
12
+ const { t } = require('../i18n');
13
+
14
+ module.exports = {
15
+ command: 'doctor',
16
+ description: 'Check BMAD+ installation integrity',
17
+ options: [
18
+ ['-d, --directory <path>', 'Project directory (default: current directory)'],
19
+ ],
20
+ action: async (options) => {
21
+ const projectDir = path.resolve(options.directory || process.cwd());
22
+ const packageJson = require('../../../package.json');
23
+
24
+ clack.intro(pc.bgBlue(pc.white(` BMAD+ Doctor v${packageJson.version} `)));
25
+
26
+ let checks = 0;
27
+ let passed = 0;
28
+ let warnings = 0;
29
+ let errors = 0;
30
+
31
+ // ── Check 1: Installation manifest ──
32
+ checks++;
33
+ const manifestPath = path.join(projectDir, '_bmad', '.bmad-plus-install.json');
34
+ if (!fs.existsSync(manifestPath)) {
35
+ clack.log.error('❌ BMAD+ is not installed in this directory');
36
+ clack.outro(pc.red('Run `npx bmad-plus install` first.'));
37
+ return;
38
+ }
39
+
40
+ const manifest = JSON.parse(fs.readFileSync(manifestPath, 'utf8'));
41
+ clack.log.success(`βœ… Manifest found β€” v${manifest.version}`);
42
+ passed++;
43
+
44
+ // ── Check 2: Version comparison ──
45
+ checks++;
46
+ if (manifest.version === packageJson.version) {
47
+ clack.log.success(`βœ… Version up to date (v${manifest.version})`);
48
+ passed++;
49
+ } else {
50
+ clack.log.warn(`⚠️ Version mismatch: installed v${manifest.version} β†’ latest v${packageJson.version}`);
51
+ clack.log.info(' Run `npx bmad-plus update` to upgrade');
52
+ warnings++;
53
+ }
54
+
55
+ // ── Check 3: Agent files ──
56
+ checks++;
57
+ const agentsDir = path.join(projectDir, '.agents', 'skills');
58
+ if (fs.existsSync(agentsDir)) {
59
+ const agentDirs = fs.readdirSync(agentsDir, { withFileTypes: true })
60
+ .filter(d => d.isDirectory())
61
+ .map(d => d.name);
62
+ clack.log.success(`βœ… ${agentDirs.length} agent/skill directories found`);
63
+ passed++;
64
+
65
+ // Check each expected agent from manifest packs
66
+ const expectedAgents = {
67
+ core: ['agent-strategist', 'agent-architect-dev', 'agent-quality', 'agent-orchestrator'],
68
+ osint: ['agent-shadow'],
69
+ maker: ['agent-maker'],
70
+ seo: ['pack-seo'],
71
+ backup: ['pack-backup'],
72
+ animated: ['pack-animated'],
73
+ };
74
+
75
+ for (const pack of (manifest.packs || ['core'])) {
76
+ const expected = expectedAgents[pack] || [];
77
+ for (const agent of expected) {
78
+ checks++;
79
+ const agentPath = path.join(agentsDir, agent);
80
+ if (fs.existsSync(agentPath)) {
81
+ passed++;
82
+ } else {
83
+ clack.log.warn(`⚠️ Missing agent: ${agent} (pack: ${pack})`);
84
+ warnings++;
85
+ }
86
+ }
87
+ }
88
+ } else {
89
+ clack.log.error('❌ No .agents/skills/ directory found');
90
+ errors++;
91
+ }
92
+
93
+ // ── Check 4: Config files ──
94
+ checks++;
95
+ const configPath = path.join(projectDir, '_bmad', 'config.yaml');
96
+ if (fs.existsSync(configPath)) {
97
+ clack.log.success('βœ… config.yaml present');
98
+ passed++;
99
+ } else {
100
+ clack.log.error('❌ config.yaml missing');
101
+ errors++;
102
+ }
103
+
104
+ // ── Check 5: Module config ──
105
+ checks++;
106
+ const moduleYaml = path.join(projectDir, '_bmad', 'module.yaml');
107
+ if (fs.existsSync(moduleYaml)) {
108
+ clack.log.success('βœ… module.yaml present');
109
+ passed++;
110
+ } else {
111
+ clack.log.warn('⚠️ module.yaml missing');
112
+ warnings++;
113
+ }
114
+
115
+ // ── Check 6: IDE configs ──
116
+ checks++;
117
+ const ideFiles = ['CLAUDE.md', 'GEMINI.md', 'AGENTS.md'].filter(f =>
118
+ fs.existsSync(path.join(projectDir, f))
119
+ );
120
+ if (ideFiles.length > 0) {
121
+ clack.log.success(`βœ… ${ideFiles.length} IDE config(s): ${ideFiles.join(', ')}`);
122
+ passed++;
123
+ } else {
124
+ clack.log.warn('⚠️ No IDE config files found');
125
+ warnings++;
126
+ }
127
+
128
+ // ── Check 7: Output directories ──
129
+ checks++;
130
+ const outputDir = path.join(projectDir, '_bmad-output');
131
+ if (fs.existsSync(outputDir)) {
132
+ clack.log.success('βœ… _bmad-output/ directory exists');
133
+ passed++;
134
+ } else {
135
+ clack.log.warn('⚠️ _bmad-output/ not found');
136
+ warnings++;
137
+ }
138
+
139
+ // ── Check 8: Skills integrity (SKILL.md exists in pack dirs) ──
140
+ if (manifest.packs && manifest.packs.includes('seo')) {
141
+ checks++;
142
+ const seoSkill = path.join(agentsDir, 'pack-seo', 'SKILL.md');
143
+ if (fs.existsSync(seoSkill)) {
144
+ clack.log.success('βœ… SEO Engine SKILL.md present');
145
+ passed++;
146
+ } else {
147
+ clack.log.error('❌ SEO Engine SKILL.md missing β€” /seo audit will not work');
148
+ errors++;
149
+ }
150
+ }
151
+
152
+ // ── Summary ──
153
+ const summaryColor = errors > 0 ? pc.red : warnings > 0 ? pc.yellow : pc.green;
154
+ const summaryIcon = errors > 0 ? '❌' : warnings > 0 ? '⚠️' : 'βœ…';
155
+
156
+ clack.note([
157
+ `${summaryIcon} ${passed}/${checks} checks passed`,
158
+ errors > 0 ? `❌ ${errors} error(s)` : null,
159
+ warnings > 0 ? `⚠️ ${warnings} warning(s)` : null,
160
+ '',
161
+ `πŸ“¦ Version: v${manifest.version}`,
162
+ `πŸ“… Installed: ${manifest.installed.split('T')[0]}`,
163
+ `πŸ—£οΈ Language: ${manifest.language || 'N/A'}`,
164
+ `πŸ“¦ Packs: ${(manifest.packs || ['core']).join(', ')}`,
165
+ ].filter(Boolean).join('\n'), '🩺 BMAD+ Health Report');
166
+
167
+ clack.outro(summaryColor(
168
+ errors > 0
169
+ ? 'Issues found β€” run `npx bmad-plus install` to fix'
170
+ : warnings > 0
171
+ ? 'Minor issues found β€” consider running `npx bmad-plus update`'
172
+ : 'Everything looks great! πŸŽ‰'
173
+ ));
174
+ },
175
+ };
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * BMAD+ Install Command
3
3
  * Installs agents, skills, and IDE configs into the current project
4
- * Supports 9 languages: EN, FR, ES, DE, PT-BR, RU, ZH, HE, JA
4
+ * Supports 10 languages: EN, FR, ES, DE, PT-BR, RU, ZH, HE, JA, IT
5
5
  *
6
6
  * Author: Laurent Rochetta
7
7
  */
@@ -118,7 +118,9 @@ module.exports = {
118
118
  const bmadSrc = path.join(__dirname, '..', '..', '..', 'src', 'bmad-plus');
119
119
 
120
120
  // ── Step 0: Language Selection ──
121
- clack.intro(pc.bgCyan(pc.black(' BMAD+ Installer v0.4.2 ')));
121
+ const pkgJson = require('../../../package.json');
122
+ clack.intro(pc.bgCyan(pc.black(` BMAD+ Installer v${pkgJson.version} `)));
123
+ clack.log.info(pc.dim('✨ Created by Laurent Rochetta β€” github.com/lrochetta'));
122
124
 
123
125
  let lang = 'en';
124
126
  if (!options.yes) {
@@ -373,8 +375,9 @@ module.exports = {
373
375
  fsExtra.ensureDirSync(path.join(projectDir, 'docs'));
374
376
 
375
377
  // ── Step 8: Write install manifest ──
378
+ const pkgVersion = require('../../../package.json').version;
376
379
  const manifest = {
377
- version: '0.4.0',
380
+ version: pkgVersion,
378
381
  uiLanguage: lang,
379
382
  installed: new Date().toISOString(),
380
383
  packs: selectedPacks,
@@ -431,6 +434,40 @@ module.exports = {
431
434
  i.guide_or_auto,
432
435
  '',
433
436
  `${i.guide_output}: _bmad-output/discovery/ & _bmad-output/build/`,
437
+ '',
438
+ '─'.repeat(50),
439
+ '',
440
+ `πŸ“¦ ${i.guide_cli_title || 'CLI Commands'}:`,
441
+ ` npx bmad-plus install ${i.guide_cli_install || 'β€” Install agents & skills'}`,
442
+ ` npx bmad-plus update ${i.guide_cli_update || 'β€” Update agents (keeps config)'}`,
443
+ ` npx bmad-plus doctor ${i.guide_cli_doctor || 'β€” Check installation health'}`,
444
+ ` npx bmad-plus uninstall ${i.guide_cli_uninstall || 'β€” Remove BMAD+ from project'}`,
445
+ );
446
+
447
+ // Add pack-specific examples
448
+ const examples = [];
449
+ if (selectedPacks.includes('seo')) {
450
+ examples.push(` ${i.guide_example_seo || 'πŸ” SEO: "/seo audit https://example.com"'}`);
451
+ }
452
+ if (selectedPacks.includes('backup')) {
453
+ examples.push(` ${i.guide_example_backup || 'πŸ—‚οΈ Backup: "/backup create" β†’ ZIP timestamped'}`);
454
+ }
455
+ if (selectedPacks.includes('animated')) {
456
+ examples.push(` ${i.guide_example_animated || '🎬 Animated: "/animated build hero.mp4"'}`);
457
+ }
458
+ if (selectedPacks.includes('osint')) {
459
+ examples.push(` ${i.guide_example_osint || 'πŸ” OSINT: "Shadow, investigate John Doe"'}`);
460
+ }
461
+
462
+ if (examples.length > 0) {
463
+ agentGuide.push(
464
+ '',
465
+ `πŸ’‘ ${i.guide_examples_title || 'Quick Examples'}:`,
466
+ ...examples
467
+ );
468
+ }
469
+
470
+ agentGuide.push(
434
471
  '',
435
472
  '---',
436
473
  i.guide_credits
@@ -1,6 +1,9 @@
1
1
  /**
2
2
  * BMAD+ Uninstall Command
3
3
  * Removes BMAD+ agents, skills, and configs from the current project
4
+ * Internationalized β€” uses i18n system
5
+ *
6
+ * Author: Laurent Rochetta
4
7
  */
5
8
 
6
9
  const path = require('node:path');
@@ -8,6 +11,7 @@ const fs = require('node:fs');
8
11
  const fsExtra = require('fs-extra');
9
12
  const clack = require('@clack/prompts');
10
13
  const pc = require('picocolors');
14
+ const { t, getLanguageOptions } = require('../i18n');
11
15
 
12
16
  module.exports = {
13
17
  command: 'uninstall',
@@ -26,45 +30,67 @@ module.exports = {
26
30
  }
27
31
 
28
32
  const manifest = JSON.parse(fs.readFileSync(manifestPath, 'utf8'));
29
- clack.log.info(`Found BMAD+ v${manifest.version} (installed ${manifest.installed})`);
33
+
34
+ // Use the language from install manifest, or ask
35
+ let lang = manifest.uiLanguage || 'en';
36
+ const i = t(lang);
37
+
38
+ clack.log.info(`BMAD+ v${manifest.version} (${i.installed_on || 'installed'} ${manifest.installed.split('T')[0]})`);
39
+ clack.log.info(`${i.selected_packs}: ${(manifest.packs || ['core']).join(', ')}`);
30
40
 
31
41
  const confirm = await clack.confirm({
32
- message: 'Supprimer BMAD+ de ce projet ?',
42
+ message: i.uninstall_confirm || 'Remove BMAD+ from this project?',
33
43
  });
34
44
 
35
45
  if (!confirm || clack.isCancel(confirm)) {
36
- clack.cancel('Cancelled.');
46
+ clack.cancel(i.cancelled);
37
47
  return;
38
48
  }
39
49
 
40
50
  const spinner = clack.spinner();
41
- spinner.start('Suppression...');
51
+ spinner.start(i.uninstall_removing || 'Removing...');
52
+
53
+ let removed = 0;
42
54
 
43
55
  // Remove .agents/skills/ (BMAD+ agents & skills)
44
56
  const agentsDir = path.join(projectDir, '.agents');
45
57
  if (fs.existsSync(agentsDir)) {
46
58
  fsExtra.removeSync(agentsDir);
59
+ removed++;
47
60
  }
48
61
 
49
62
  // Remove _bmad/ config
50
63
  const bmadDir = path.join(projectDir, '_bmad');
51
64
  if (fs.existsSync(bmadDir)) {
52
65
  fsExtra.removeSync(bmadDir);
66
+ removed++;
67
+ }
68
+
69
+ // Remove _bmad-output/ (only if empty)
70
+ const outputDir = path.join(projectDir, '_bmad-output');
71
+ if (fs.existsSync(outputDir)) {
72
+ const contents = fs.readdirSync(outputDir, { recursive: true }).filter(f => !f.startsWith('.'));
73
+ if (contents.length === 0) {
74
+ fsExtra.removeSync(outputDir);
75
+ removed++;
76
+ } else {
77
+ clack.log.info(i.uninstall_output_kept || 'πŸ“ _bmad-output/ kept (contains files)');
78
+ }
53
79
  }
54
80
 
55
- // Remove IDE configs
81
+ // Remove IDE configs (only BMAD+-generated ones)
56
82
  for (const configFile of ['CLAUDE.md', 'GEMINI.md', 'AGENTS.md', 'OPENCODE.md']) {
57
83
  const p = path.join(projectDir, configFile);
58
84
  if (fs.existsSync(p)) {
59
- // Only remove if it's a BMAD+ generated file
60
85
  const content = fs.readFileSync(p, 'utf8');
61
86
  if (content.includes('BMAD+')) {
62
87
  fs.unlinkSync(p);
88
+ removed++;
63
89
  }
64
90
  }
65
91
  }
66
92
 
67
- spinner.stop('βœ… BMAD+ supprimΓ©');
68
- clack.outro(pc.green('Done!'));
93
+ spinner.stop(i.uninstall_done ? i.uninstall_done(removed) : `βœ… BMAD+ removed (${removed} items)`);
94
+ clack.outro(pc.green(i.guide_ready ? 'πŸ‘‹ Done!' : 'Done!'));
69
95
  },
70
96
  };