bmad-plus 0.7.1 → 0.7.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 +12 -0
- package/README.md +1 -1
- package/package.json +1 -1
- 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/tools/cli/bmad-plus-cli.js +2 -2
- package/tools/cli/commands/scan.js +25 -10
- package/tools/cli/i18n.js +10 -10
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,18 @@ All notable changes to BMAD+ will be documented in this file.
|
|
|
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
7
|
|
|
8
|
+
## [0.7.3] — 2026-05-17
|
|
9
|
+
|
|
10
|
+
### 🎨 Scan UX Improvements
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
- **Scan legend** — Color-coded status legend displayed before the project table
|
|
14
|
+
- **`--active-days <n>`** — Custom threshold for "active" status (default: 30 days)
|
|
15
|
+
- **`--paused-days <n>`** — Custom threshold for "paused" status (default: 180 days)
|
|
16
|
+
|
|
17
|
+
### Fixed
|
|
18
|
+
- Scan now accepts positional path argument (`npx bmad-plus scan D:\path`)
|
|
19
|
+
|
|
8
20
|
## [0.7.1] — 2026-05-17
|
|
9
21
|
|
|
10
22
|
### 🛠️ CLI Commands & Guardrails Injection
|
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
|
|
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.7.
|
|
4
|
+
"version": "0.7.3",
|
|
5
5
|
"description": "BMAD+ — Augmented AI-Driven Development Framework with multi-role agents, autopilot, and parallel execution",
|
|
6
6
|
"keywords": [
|
|
7
7
|
"bmad",
|
|
@@ -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
|
|
|
@@ -70,13 +70,13 @@ doctorCmd.action(doctor.action);
|
|
|
70
70
|
|
|
71
71
|
// Scan command
|
|
72
72
|
const scanCmd = program
|
|
73
|
-
.command('scan')
|
|
73
|
+
.command('scan [path]')
|
|
74
74
|
.description('Scan directories to discover and index projects in the global brain');
|
|
75
75
|
|
|
76
76
|
for (const option of scan.options || []) {
|
|
77
77
|
scanCmd.option(...option);
|
|
78
78
|
}
|
|
79
|
-
scanCmd.action(scan.action);
|
|
79
|
+
scanCmd.action((scanPath, options) => scan.action({ ...options, directory: scanPath || options.directory }));
|
|
80
80
|
|
|
81
81
|
// Memory command
|
|
82
82
|
const memoryCmd = program
|
|
@@ -51,12 +51,12 @@ const SKIP_DIRS = new Set([
|
|
|
51
51
|
'AppData', 'Recovery', 'PerfLogs',
|
|
52
52
|
]);
|
|
53
53
|
|
|
54
|
-
function getProjectStatus(dir) {
|
|
54
|
+
function getProjectStatus(dir, activeDays = 30, pausedDays = 180) {
|
|
55
55
|
try {
|
|
56
56
|
const stat = fs.statSync(dir);
|
|
57
57
|
const daysSince = (Date.now() - stat.mtimeMs) / (1000 * 60 * 60 * 24);
|
|
58
|
-
if (daysSince <
|
|
59
|
-
if (daysSince <
|
|
58
|
+
if (daysSince < activeDays) return 'active';
|
|
59
|
+
if (daysSince < pausedDays) return 'paused';
|
|
60
60
|
return 'archived';
|
|
61
61
|
} catch { return 'unknown'; }
|
|
62
62
|
}
|
|
@@ -86,7 +86,7 @@ function hasBmadInstalled(dir) {
|
|
|
86
86
|
fs.existsSync(path.join(dir, '_bmad'));
|
|
87
87
|
}
|
|
88
88
|
|
|
89
|
-
function scanDirectory(rootDir, maxDepth = 4, currentDepth = 0) {
|
|
89
|
+
function scanDirectory(rootDir, maxDepth = 4, currentDepth = 0, activeDays = 30, pausedDays = 180) {
|
|
90
90
|
const projects = [];
|
|
91
91
|
|
|
92
92
|
if (currentDepth > maxDepth) return projects;
|
|
@@ -106,7 +106,7 @@ function scanDirectory(rootDir, maxDepth = 4, currentDepth = 0) {
|
|
|
106
106
|
path: rootDir,
|
|
107
107
|
name: getProjectName(rootDir),
|
|
108
108
|
stack,
|
|
109
|
-
status: getProjectStatus(rootDir),
|
|
109
|
+
status: getProjectStatus(rootDir, activeDays, pausedDays),
|
|
110
110
|
bmad: hasBmadInstalled(rootDir),
|
|
111
111
|
hasAgentsMd: fs.existsSync(path.join(rootDir, 'AGENTS.md')),
|
|
112
112
|
hasGit: fs.existsSync(path.join(rootDir, '.git')),
|
|
@@ -121,7 +121,7 @@ function scanDirectory(rootDir, maxDepth = 4, currentDepth = 0) {
|
|
|
121
121
|
path: rootDir,
|
|
122
122
|
name: getProjectName(rootDir),
|
|
123
123
|
stack: 'Unknown',
|
|
124
|
-
status: getProjectStatus(rootDir),
|
|
124
|
+
status: getProjectStatus(rootDir, activeDays, pausedDays),
|
|
125
125
|
bmad: hasBmadInstalled(rootDir),
|
|
126
126
|
hasAgentsMd: fs.existsSync(path.join(rootDir, 'AGENTS.md')),
|
|
127
127
|
hasGit: true,
|
|
@@ -136,7 +136,7 @@ function scanDirectory(rootDir, maxDepth = 4, currentDepth = 0) {
|
|
|
136
136
|
if (entry.name.startsWith('.') && entry.name !== '.git') continue;
|
|
137
137
|
|
|
138
138
|
const subPath = path.join(rootDir, entry.name);
|
|
139
|
-
const subProjects = scanDirectory(subPath, maxDepth, currentDepth + 1);
|
|
139
|
+
const subProjects = scanDirectory(subPath, maxDepth, currentDepth + 1, activeDays, pausedDays);
|
|
140
140
|
projects.push(...subProjects);
|
|
141
141
|
}
|
|
142
142
|
|
|
@@ -149,11 +149,15 @@ module.exports = {
|
|
|
149
149
|
options: [
|
|
150
150
|
['-d, --directory <path>', 'Directory to scan (default: current directory)'],
|
|
151
151
|
['--depth <n>', 'Max depth to scan (default: 4)', '4'],
|
|
152
|
+
['--active-days <n>', 'Days since last modified to consider a project "active" (default: 30)', '30'],
|
|
153
|
+
['--paused-days <n>', 'Days since last modified to consider a project "paused" (default: 180)', '180'],
|
|
152
154
|
['-y, --yes', 'Index all projects without prompting'],
|
|
153
155
|
],
|
|
154
156
|
action: async (options) => {
|
|
155
157
|
const scanDir = path.resolve(options.directory || process.cwd());
|
|
156
158
|
const maxDepth = parseInt(options.depth) || 4;
|
|
159
|
+
const activeDays = parseInt(options.activeDays) || 30;
|
|
160
|
+
const pausedDays = parseInt(options.pausedDays) || 180;
|
|
157
161
|
|
|
158
162
|
clack.intro(pc.bgMagenta(pc.white(' 🧠 BMAD+ Project Scanner ')));
|
|
159
163
|
|
|
@@ -168,7 +172,7 @@ module.exports = {
|
|
|
168
172
|
const spinner = clack.spinner();
|
|
169
173
|
spinner.start(`Scanning ${scanDir} (depth: ${maxDepth})...`);
|
|
170
174
|
|
|
171
|
-
const projects = scanDirectory(scanDir, maxDepth);
|
|
175
|
+
const projects = scanDirectory(scanDir, maxDepth, 0, activeDays, pausedDays);
|
|
172
176
|
|
|
173
177
|
if (projects.length === 0) {
|
|
174
178
|
spinner.stop('No projects found.');
|
|
@@ -178,9 +182,20 @@ module.exports = {
|
|
|
178
182
|
|
|
179
183
|
spinner.stop(`Found ${pc.bold(projects.length)} project(s)`);
|
|
180
184
|
|
|
181
|
-
// Display
|
|
185
|
+
// Display legend
|
|
186
|
+
const activeCount = projects.filter(p => p.status === 'active').length;
|
|
187
|
+
const pausedCount = projects.filter(p => p.status === 'paused').length;
|
|
188
|
+
const archivedCount = projects.filter(p => p.status === 'archived').length;
|
|
189
|
+
|
|
190
|
+
clack.log.info('');
|
|
191
|
+
clack.log.info(pc.dim(' Legend:'));
|
|
192
|
+
clack.log.info(` ${pc.green('●')} active modified < ${activeDays} days ago ${pc.dim(`(${activeCount} found)`)}`);
|
|
193
|
+
clack.log.info(` ${pc.yellow('◐')} paused modified ${activeDays}–${pausedDays} days ago ${pc.dim(`(${pausedCount} found)`)}`);
|
|
194
|
+
clack.log.info(` ${pc.dim('○')} archived modified > ${pausedDays} days ago ${pc.dim(`(${archivedCount} found)`)}`);
|
|
182
195
|
clack.log.info('');
|
|
183
|
-
|
|
196
|
+
|
|
197
|
+
// Display table
|
|
198
|
+
clack.log.info(pc.bold(' # Status BMAD+ Stack Name Path'));
|
|
184
199
|
clack.log.info(pc.dim(' ' + '─'.repeat(90)));
|
|
185
200
|
|
|
186
201
|
projects.forEach((p, i) => {
|
package/tools/cli/i18n.js
CHANGED
|
@@ -10,7 +10,7 @@ const LANGUAGES = {
|
|
|
10
10
|
flag: '🇬🇧',
|
|
11
11
|
name: 'English',
|
|
12
12
|
locale: 'en',
|
|
13
|
-
installer_title: ' BMAD+ Installer v0.7.
|
|
13
|
+
installer_title: ' BMAD+ Installer v0.7.3 ',
|
|
14
14
|
select_language: 'Select your language',
|
|
15
15
|
installing_to: 'Installing to',
|
|
16
16
|
select_packs: 'Which packs to install? (Core is always included)',
|
|
@@ -92,7 +92,7 @@ const LANGUAGES = {
|
|
|
92
92
|
flag: '🇫🇷',
|
|
93
93
|
name: 'Français',
|
|
94
94
|
locale: 'fr',
|
|
95
|
-
installer_title: ' BMAD+ Installeur v0.7.
|
|
95
|
+
installer_title: ' BMAD+ Installeur v0.7.3 ',
|
|
96
96
|
select_language: 'Choisissez votre langue',
|
|
97
97
|
installing_to: 'Installation dans',
|
|
98
98
|
select_packs: 'Quels packs installer ? (Core est toujours inclus)',
|
|
@@ -172,7 +172,7 @@ const LANGUAGES = {
|
|
|
172
172
|
flag: '🇪🇸',
|
|
173
173
|
name: 'Español',
|
|
174
174
|
locale: 'es',
|
|
175
|
-
installer_title: ' BMAD+ Instalador v0.7.
|
|
175
|
+
installer_title: ' BMAD+ Instalador v0.7.3 ',
|
|
176
176
|
select_language: 'Seleccione su idioma',
|
|
177
177
|
installing_to: 'Instalando en',
|
|
178
178
|
select_packs: '¿Qué packs instalar? (Core siempre está incluido)',
|
|
@@ -242,7 +242,7 @@ const LANGUAGES = {
|
|
|
242
242
|
flag: '🇩🇪',
|
|
243
243
|
name: 'Deutsch',
|
|
244
244
|
locale: 'de',
|
|
245
|
-
installer_title: ' BMAD+ Installer v0.7.
|
|
245
|
+
installer_title: ' BMAD+ Installer v0.7.3 ',
|
|
246
246
|
select_language: 'Wählen Sie Ihre Sprache',
|
|
247
247
|
installing_to: 'Installiere in',
|
|
248
248
|
select_packs: 'Welche Packs installieren? (Core ist immer enthalten)',
|
|
@@ -312,7 +312,7 @@ const LANGUAGES = {
|
|
|
312
312
|
flag: '🇧🇷',
|
|
313
313
|
name: 'Português (Brasil)',
|
|
314
314
|
locale: 'pt-BR',
|
|
315
|
-
installer_title: ' BMAD+ Instalador v0.7.
|
|
315
|
+
installer_title: ' BMAD+ Instalador v0.7.3 ',
|
|
316
316
|
select_language: 'Selecione seu idioma',
|
|
317
317
|
installing_to: 'Instalando em',
|
|
318
318
|
select_packs: 'Quais packs instalar? (Core sempre está incluído)',
|
|
@@ -382,7 +382,7 @@ const LANGUAGES = {
|
|
|
382
382
|
flag: '🇷🇺',
|
|
383
383
|
name: 'Русский',
|
|
384
384
|
locale: 'ru',
|
|
385
|
-
installer_title: ' BMAD+ Установщик v0.7.
|
|
385
|
+
installer_title: ' BMAD+ Установщик v0.7.3 ',
|
|
386
386
|
select_language: 'Выберите язык',
|
|
387
387
|
installing_to: 'Установка в',
|
|
388
388
|
select_packs: 'Какие пакеты установить? (Core всегда включён)',
|
|
@@ -452,7 +452,7 @@ const LANGUAGES = {
|
|
|
452
452
|
flag: '🇨🇳',
|
|
453
453
|
name: '中文 (简体)',
|
|
454
454
|
locale: 'zh-CN',
|
|
455
|
-
installer_title: ' BMAD+ 安装程序 v0.7.
|
|
455
|
+
installer_title: ' BMAD+ 安装程序 v0.7.3 ',
|
|
456
456
|
select_language: '选择您的语言',
|
|
457
457
|
installing_to: '安装到',
|
|
458
458
|
select_packs: '安装哪些包?(Core 始终包含)',
|
|
@@ -522,7 +522,7 @@ const LANGUAGES = {
|
|
|
522
522
|
flag: '🇮🇱',
|
|
523
523
|
name: 'עברית',
|
|
524
524
|
locale: 'he',
|
|
525
|
-
installer_title: ' BMAD+ מתקין v0.7.
|
|
525
|
+
installer_title: ' BMAD+ מתקין v0.7.3 ',
|
|
526
526
|
select_language: 'בחר את השפה שלך',
|
|
527
527
|
installing_to: 'מתקין ב',
|
|
528
528
|
select_packs: 'אילו חבילות להתקין? (Core תמיד כלול)',
|
|
@@ -592,7 +592,7 @@ const LANGUAGES = {
|
|
|
592
592
|
flag: '🇯🇵',
|
|
593
593
|
name: '日本語',
|
|
594
594
|
locale: 'ja',
|
|
595
|
-
installer_title: ' BMAD+ インストーラー v0.7.
|
|
595
|
+
installer_title: ' BMAD+ インストーラー v0.7.3 ',
|
|
596
596
|
select_language: '言語を選択してください',
|
|
597
597
|
installing_to: 'インストール先',
|
|
598
598
|
select_packs: 'どのパックをインストールしますか?(Coreは常に含まれます)',
|
|
@@ -662,7 +662,7 @@ const LANGUAGES = {
|
|
|
662
662
|
flag: '🇮🇹',
|
|
663
663
|
name: 'Italiano',
|
|
664
664
|
locale: 'it',
|
|
665
|
-
installer_title: ' BMAD+ Installatore v0.7.
|
|
665
|
+
installer_title: ' BMAD+ Installatore v0.7.3 ',
|
|
666
666
|
select_language: 'Seleziona la tua lingua',
|
|
667
667
|
installing_to: 'Installazione in',
|
|
668
668
|
select_packs: 'Quali pack installare? (Core è sempre incluso)',
|