bmad-method 6.3.1-next.1 → 6.3.1-next.11
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/package.json +1 -2
- package/src/bmm-skills/1-analysis/bmad-agent-analyst/SKILL.md +47 -36
- package/src/bmm-skills/1-analysis/bmad-agent-analyst/customize.yaml +44 -0
- package/src/bmm-skills/1-analysis/bmad-agent-tech-writer/SKILL.md +46 -33
- package/src/bmm-skills/1-analysis/bmad-agent-tech-writer/customize.yaml +38 -0
- package/src/bmm-skills/1-analysis/bmad-product-brief/SKILL.md +22 -3
- package/src/bmm-skills/1-analysis/bmad-product-brief/customize.yaml +6 -0
- package/src/bmm-skills/1-analysis/bmad-product-brief/prompts/contextual-discovery.md +7 -7
- package/src/bmm-skills/1-analysis/bmad-product-brief/prompts/draft-and-review.md +5 -5
- package/src/bmm-skills/1-analysis/bmad-product-brief/prompts/finalize.md +3 -1
- package/src/bmm-skills/1-analysis/bmad-product-brief/prompts/guided-elicitation.md +2 -2
- package/src/bmm-skills/2-plan-workflows/bmad-agent-pm/SKILL.md +46 -35
- package/src/bmm-skills/2-plan-workflows/bmad-agent-pm/customize.yaml +41 -0
- package/src/bmm-skills/2-plan-workflows/bmad-agent-ux-designer/SKILL.md +46 -31
- package/src/bmm-skills/2-plan-workflows/bmad-agent-ux-designer/customize.yaml +26 -0
- package/src/bmm-skills/2-plan-workflows/bmad-create-prd/steps-c/step-08-scoping.md +70 -23
- package/src/bmm-skills/2-plan-workflows/bmad-create-prd/steps-c/step-11-polish.md +1 -1
- package/src/bmm-skills/3-solutioning/bmad-agent-architect/SKILL.md +46 -30
- package/src/bmm-skills/3-solutioning/bmad-agent-architect/customize.yaml +29 -0
- package/src/bmm-skills/4-implementation/bmad-agent-dev/SKILL.md +57 -43
- package/src/bmm-skills/4-implementation/bmad-agent-dev/customize.yaml +44 -0
- package/src/bmm-skills/4-implementation/bmad-quick-dev/step-01-clarify-and-route.md +14 -5
- package/src/bmm-skills/4-implementation/bmad-quick-dev/step-03-implement.md +2 -0
- package/src/bmm-skills/4-implementation/bmad-quick-dev/step-05-present.md +17 -8
- package/src/bmm-skills/4-implementation/bmad-quick-dev/step-oneshot.md +4 -0
- package/src/bmm-skills/4-implementation/bmad-quick-dev/sync-sprint-status.md +19 -0
- package/src/bmm-skills/4-implementation/bmad-quick-dev/workflow.md +1 -0
- package/src/core-skills/module.yaml +1 -0
- package/src/scripts/resolve_customization.py +248 -0
- package/tools/installer/cli-utils.js +0 -137
- package/tools/installer/commands/status.js +1 -1
- package/tools/installer/commands/uninstall.js +1 -1
- package/tools/installer/core/existing-install.js +1 -1
- package/tools/installer/core/install-paths.js +7 -4
- package/tools/installer/core/installer.js +58 -10
- package/tools/installer/core/manifest-generator.js +9 -10
- package/tools/installer/core/manifest.js +1 -578
- package/tools/installer/file-ops.js +1 -1
- package/tools/installer/fs-native.js +116 -0
- package/tools/installer/ide/_config-driven.js +1 -1
- package/tools/installer/ide/platform-codes.js +1 -1
- package/tools/installer/ide/shared/path-utils.js +0 -145
- package/tools/installer/ide/shared/skill-manifest.js +1 -1
- package/tools/installer/message-loader.js +1 -1
- package/tools/installer/modules/community-manager.js +11 -6
- package/tools/installer/modules/custom-module-manager.js +1 -28
- package/tools/installer/modules/external-manager.js +5 -44
- package/tools/installer/modules/official-modules.js +5 -53
- package/tools/installer/modules/plugin-resolver.js +1 -1
- package/tools/installer/modules/registry-client.js +133 -12
- package/tools/installer/project-root.js +1 -1
- package/tools/installer/prompts.js +0 -106
- package/tools/installer/ui.js +45 -12
- package/tools/migrate-custom-module-paths.js +1 -1
- package/tools/installer/ide/shared/agent-command-generator.js +0 -180
- package/tools/installer/ide/shared/bmad-artifacts.js +0 -208
- package/tools/installer/ide/shared/module-injections.js +0 -136
- package/tools/installer/ide/templates/agent-command-template.md +0 -14
- package/tools/installer/ide/templates/combined/antigravity.md +0 -8
- package/tools/installer/ide/templates/combined/default-agent.md +0 -15
- package/tools/installer/ide/templates/combined/default-task.md +0 -10
- package/tools/installer/ide/templates/combined/default-tool.md +0 -10
- package/tools/installer/ide/templates/combined/default-workflow.md +0 -6
- package/tools/installer/ide/templates/combined/gemini-agent.toml +0 -14
- package/tools/installer/ide/templates/combined/gemini-task.toml +0 -11
- package/tools/installer/ide/templates/combined/gemini-tool.toml +0 -11
- package/tools/installer/ide/templates/combined/gemini-workflow-yaml.toml +0 -16
- package/tools/installer/ide/templates/combined/gemini-workflow.toml +0 -14
- package/tools/installer/ide/templates/combined/kiro-agent.md +0 -16
- package/tools/installer/ide/templates/combined/kiro-task.md +0 -9
- package/tools/installer/ide/templates/combined/kiro-tool.md +0 -9
- package/tools/installer/ide/templates/combined/kiro-workflow.md +0 -7
- package/tools/installer/ide/templates/combined/opencode-agent.md +0 -15
- package/tools/installer/ide/templates/combined/opencode-task.md +0 -13
- package/tools/installer/ide/templates/combined/opencode-tool.md +0 -13
- package/tools/installer/ide/templates/combined/opencode-workflow-yaml.md +0 -16
- package/tools/installer/ide/templates/combined/opencode-workflow.md +0 -16
- package/tools/installer/ide/templates/combined/rovodev.md +0 -9
- package/tools/installer/ide/templates/combined/trae.md +0 -9
- package/tools/installer/ide/templates/combined/windsurf-workflow.md +0 -10
- package/tools/installer/ide/templates/split/.gitkeep +0 -0
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
const path = require('node:path');
|
|
2
|
-
const fs = require('fs-
|
|
2
|
+
const fs = require('../fs-native');
|
|
3
3
|
const { Manifest } = require('./manifest');
|
|
4
4
|
const { OfficialModules } = require('../modules/official-modules');
|
|
5
5
|
const { IdeManager } = require('../ide/manager');
|
|
@@ -244,6 +244,15 @@ class Installer {
|
|
|
244
244
|
|
|
245
245
|
const installTasks = [];
|
|
246
246
|
|
|
247
|
+
installTasks.push({
|
|
248
|
+
title: 'Installing shared scripts',
|
|
249
|
+
task: async () => {
|
|
250
|
+
await this._installSharedScripts(paths);
|
|
251
|
+
addResult('Shared scripts', 'ok');
|
|
252
|
+
return 'Shared scripts installed';
|
|
253
|
+
},
|
|
254
|
+
});
|
|
255
|
+
|
|
247
256
|
if (allModules.length > 0) {
|
|
248
257
|
installTasks.push({
|
|
249
258
|
title: isQuickUpdate ? `Updating ${allModules.length} module(s)` : `Installing ${allModules.length} module(s)`,
|
|
@@ -558,6 +567,44 @@ class Installer {
|
|
|
558
567
|
return { tempBackupDir, tempModifiedBackupDir };
|
|
559
568
|
}
|
|
560
569
|
|
|
570
|
+
/**
|
|
571
|
+
* Sync src/scripts/* → _bmad/scripts/ so shared Python scripts
|
|
572
|
+
* (e.g. resolve_customization.py) are available at install time.
|
|
573
|
+
* Wipes the destination first so files removed or renamed in source
|
|
574
|
+
* (e.g. resolve-customization.js → resolve_customization.py) don't
|
|
575
|
+
* linger and get recorded as installed. Also seeds _bmad/custom/.gitignore
|
|
576
|
+
* on fresh installs so *.user.yaml overrides stay out of version control.
|
|
577
|
+
*/
|
|
578
|
+
async _installSharedScripts(paths) {
|
|
579
|
+
const srcScriptsDir = path.join(paths.srcDir, 'src', 'scripts');
|
|
580
|
+
if (!(await fs.pathExists(srcScriptsDir))) {
|
|
581
|
+
throw new Error(`Shared scripts source directory not found: ${srcScriptsDir}`);
|
|
582
|
+
}
|
|
583
|
+
|
|
584
|
+
await fs.remove(paths.scriptsDir);
|
|
585
|
+
await fs.ensureDir(paths.scriptsDir);
|
|
586
|
+
await fs.copy(srcScriptsDir, paths.scriptsDir, { overwrite: true });
|
|
587
|
+
await this._trackFilesRecursive(paths.scriptsDir);
|
|
588
|
+
|
|
589
|
+
const customGitignore = path.join(paths.customDir, '.gitignore');
|
|
590
|
+
if (!(await fs.pathExists(customGitignore))) {
|
|
591
|
+
await fs.writeFile(customGitignore, '*.user.yaml\n', 'utf8');
|
|
592
|
+
this.installedFiles.add(customGitignore);
|
|
593
|
+
}
|
|
594
|
+
}
|
|
595
|
+
|
|
596
|
+
async _trackFilesRecursive(dir) {
|
|
597
|
+
const entries = await fs.readdir(dir, { withFileTypes: true });
|
|
598
|
+
for (const entry of entries) {
|
|
599
|
+
const full = path.join(dir, entry.name);
|
|
600
|
+
if (entry.isDirectory()) {
|
|
601
|
+
await this._trackFilesRecursive(full);
|
|
602
|
+
} else if (entry.isFile()) {
|
|
603
|
+
this.installedFiles.add(full);
|
|
604
|
+
}
|
|
605
|
+
}
|
|
606
|
+
}
|
|
607
|
+
|
|
561
608
|
/**
|
|
562
609
|
* Install official (non-custom) modules.
|
|
563
610
|
* @param {Object} config - Installation configuration
|
|
@@ -671,8 +718,11 @@ class Installer {
|
|
|
671
718
|
const customFiles = [];
|
|
672
719
|
const modifiedFiles = [];
|
|
673
720
|
|
|
674
|
-
// Memory
|
|
675
|
-
|
|
721
|
+
// Memory subtrees (v6.1: _bmad/_memory, current: _bmad/memory) hold
|
|
722
|
+
// per-user runtime data generated by agents with sidecars. These files
|
|
723
|
+
// aren't installer-managed and must never be reported as "custom" or
|
|
724
|
+
// "modified" — they're user state, not user overrides.
|
|
725
|
+
const bmadMemoryPaths = ['_memory', 'memory'];
|
|
676
726
|
|
|
677
727
|
// Check if the manifest has hashes - if not, we can't detect modifications
|
|
678
728
|
let manifestHasHashes = false;
|
|
@@ -738,7 +788,7 @@ class Installer {
|
|
|
738
788
|
continue;
|
|
739
789
|
}
|
|
740
790
|
|
|
741
|
-
if (relativePath.startsWith(
|
|
791
|
+
if (bmadMemoryPaths.some((mp) => relativePath === mp || relativePath.startsWith(mp + '/'))) {
|
|
742
792
|
continue;
|
|
743
793
|
}
|
|
744
794
|
|
|
@@ -789,9 +839,8 @@ class Installer {
|
|
|
789
839
|
|
|
790
840
|
// Get all installed module directories
|
|
791
841
|
const entries = await fs.readdir(bmadDir, { withFileTypes: true });
|
|
792
|
-
const
|
|
793
|
-
|
|
794
|
-
.map((entry) => entry.name);
|
|
842
|
+
const nonModuleDirs = new Set(['_config', '_memory', 'memory', 'docs', 'scripts', 'custom']);
|
|
843
|
+
const installedModules = entries.filter((entry) => entry.isDirectory() && !nonModuleDirs.has(entry.name)).map((entry) => entry.name);
|
|
795
844
|
|
|
796
845
|
// Generate config.yaml for each installed module
|
|
797
846
|
for (const moduleName of installedModules) {
|
|
@@ -917,9 +966,8 @@ class Installer {
|
|
|
917
966
|
|
|
918
967
|
// Get all installed module directories
|
|
919
968
|
const entries = await fs.readdir(bmadDir, { withFileTypes: true });
|
|
920
|
-
const
|
|
921
|
-
|
|
922
|
-
.map((entry) => entry.name);
|
|
969
|
+
const nonModuleDirs = new Set(['_config', '_memory', 'memory', 'docs', 'scripts', 'custom']);
|
|
970
|
+
const installedModules = entries.filter((entry) => entry.isDirectory() && !nonModuleDirs.has(entry.name)).map((entry) => entry.name);
|
|
923
971
|
|
|
924
972
|
// Add core module to scan (it's installed at root level as _config, but we check src/core-skills)
|
|
925
973
|
const coreModulePath = getSourcePath('core-skills');
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
const path = require('node:path');
|
|
2
|
-
const fs = require('fs-
|
|
2
|
+
const fs = require('../fs-native');
|
|
3
3
|
const yaml = require('yaml');
|
|
4
4
|
const crypto = require('node:crypto');
|
|
5
5
|
const csv = require('csv-parse/sync');
|
|
@@ -193,11 +193,13 @@ class ManifestGenerator {
|
|
|
193
193
|
}
|
|
194
194
|
}
|
|
195
195
|
|
|
196
|
-
// Recurse into subdirectories
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
196
|
+
// Recurse into subdirectories — but not inside a discovered skill
|
|
197
|
+
if (!skillMeta) {
|
|
198
|
+
for (const entry of entries) {
|
|
199
|
+
if (!entry.isDirectory()) continue;
|
|
200
|
+
if (entry.name.startsWith('.') || entry.name.startsWith('_')) continue;
|
|
201
|
+
await walk(path.join(dir, entry.name));
|
|
202
|
+
}
|
|
201
203
|
}
|
|
202
204
|
};
|
|
203
205
|
|
|
@@ -327,7 +329,6 @@ class ManifestGenerator {
|
|
|
327
329
|
displayName: m.displayName || m.name || entry.name,
|
|
328
330
|
title: m.title || '',
|
|
329
331
|
icon: m.icon || '',
|
|
330
|
-
capabilities: m.capabilities ? this.cleanForCSV(m.capabilities) : '',
|
|
331
332
|
role: m.role ? this.cleanForCSV(m.role) : '',
|
|
332
333
|
identity: m.identity ? this.cleanForCSV(m.identity) : '',
|
|
333
334
|
communicationStyle: m.communicationStyle ? this.cleanForCSV(m.communicationStyle) : '',
|
|
@@ -497,7 +498,7 @@ class ManifestGenerator {
|
|
|
497
498
|
}
|
|
498
499
|
|
|
499
500
|
// Create CSV header with persona fields and canonicalId
|
|
500
|
-
let csvContent = 'name,displayName,title,icon,
|
|
501
|
+
let csvContent = 'name,displayName,title,icon,role,identity,communicationStyle,principles,module,path,canonicalId\n';
|
|
501
502
|
|
|
502
503
|
// Combine existing and new agents, preferring new data for duplicates
|
|
503
504
|
const allAgents = new Map();
|
|
@@ -515,7 +516,6 @@ class ManifestGenerator {
|
|
|
515
516
|
displayName: agent.displayName,
|
|
516
517
|
title: agent.title,
|
|
517
518
|
icon: agent.icon,
|
|
518
|
-
capabilities: agent.capabilities,
|
|
519
519
|
role: agent.role,
|
|
520
520
|
identity: agent.identity,
|
|
521
521
|
communicationStyle: agent.communicationStyle,
|
|
@@ -533,7 +533,6 @@ class ManifestGenerator {
|
|
|
533
533
|
escapeCsv(record.displayName),
|
|
534
534
|
escapeCsv(record.title),
|
|
535
535
|
escapeCsv(record.icon),
|
|
536
|
-
escapeCsv(record.capabilities),
|
|
537
536
|
escapeCsv(record.role),
|
|
538
537
|
escapeCsv(record.identity),
|
|
539
538
|
escapeCsv(record.communicationStyle),
|