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 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
- [![Version](https://img.shields.io/badge/version-0.7.1-blue.svg)](CHANGELOG.md)
3
+ [![Version](https://img.shields.io/badge/version-0.7.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
 
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.1",
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
- [![Version](https://img.shields.io/badge/version-0.7.1-blue.svg)](../CHANGELOG.md)
3
+ [![Version](https://img.shields.io/badge/version-0.7.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.7.1-blue.svg)](../CHANGELOG.md)
3
+ [![Version](https://img.shields.io/badge/version-0.7.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.7.1-blue.svg)](../CHANGELOG.md)
3
+ [![Version](https://img.shields.io/badge/version-0.7.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
 
@@ -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 < 30) return 'active';
59
- if (daysSince < 180) return 'paused';
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 table
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
- clack.log.info(pc.bold(' # Status BMAD+ Stack Name Path'));
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.1 ',
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.1 ',
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.1 ',
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.1 ',
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.1 ',
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.1 ',
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.1 ',
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.1 ',
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.1 ',
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.1 ',
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)',