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 +27 -0
- package/README.md +2 -1
- package/package.json +5 -4
- package/readme-international/README.de.md +1 -1
- package/readme-international/README.es.md +1 -1
- package/readme-international/README.fr.md +1 -1
- package/src/bmad-plus/module.yaml +29 -0
- package/tools/cli/bmad-plus-cli.js +23 -0
- package/tools/cli/commands/doctor.js +175 -0
- package/tools/cli/commands/install.js +40 -3
- package/tools/cli/commands/uninstall.js +34 -8
- package/tools/cli/commands/update.js +172 -0
- package/tools/cli/i18n.js +425 -303
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
|
-
[](CHANGELOG.md)
|
|
4
4
|
[](https://github.com/bmad-code-org/BMAD-METHOD)
|
|
5
5
|
[](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.
|
|
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.
|
|
40
|
+
"@clack/prompts": "^1.4.0",
|
|
40
41
|
"chalk": "^4.1.2",
|
|
41
42
|
"commander": "^14.0.0",
|
|
42
|
-
"fs-extra": "^11.3.
|
|
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
|
-
[](../CHANGELOG.md)
|
|
4
4
|
[](https://github.com/bmad-code-org/BMAD-METHOD)
|
|
5
5
|
[](../LICENSE)
|
|
6
6
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# π BMAD+ β Framework de Desarrollo Impulsado por IA Aumentada
|
|
2
2
|
|
|
3
|
-
[](../CHANGELOG.md)
|
|
4
4
|
[](https://github.com/bmad-code-org/BMAD-METHOD)
|
|
5
5
|
[](../LICENSE)
|
|
6
6
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# π BMAD+ β Augmented AI-Driven Development Framework
|
|
2
2
|
|
|
3
|
-
[](../CHANGELOG.md)
|
|
4
4
|
[](https://github.com/bmad-code-org/BMAD-METHOD)
|
|
5
5
|
[](../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
|
|
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
|
-
|
|
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:
|
|
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
|
-
|
|
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: '
|
|
42
|
+
message: i.uninstall_confirm || 'Remove BMAD+ from this project?',
|
|
33
43
|
});
|
|
34
44
|
|
|
35
45
|
if (!confirm || clack.isCancel(confirm)) {
|
|
36
|
-
clack.cancel(
|
|
46
|
+
clack.cancel(i.cancelled);
|
|
37
47
|
return;
|
|
38
48
|
}
|
|
39
49
|
|
|
40
50
|
const spinner = clack.spinner();
|
|
41
|
-
spinner.start('
|
|
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(
|
|
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
|
};
|