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.
Files changed (81) hide show
  1. package/package.json +1 -2
  2. package/src/bmm-skills/1-analysis/bmad-agent-analyst/SKILL.md +47 -36
  3. package/src/bmm-skills/1-analysis/bmad-agent-analyst/customize.yaml +44 -0
  4. package/src/bmm-skills/1-analysis/bmad-agent-tech-writer/SKILL.md +46 -33
  5. package/src/bmm-skills/1-analysis/bmad-agent-tech-writer/customize.yaml +38 -0
  6. package/src/bmm-skills/1-analysis/bmad-product-brief/SKILL.md +22 -3
  7. package/src/bmm-skills/1-analysis/bmad-product-brief/customize.yaml +6 -0
  8. package/src/bmm-skills/1-analysis/bmad-product-brief/prompts/contextual-discovery.md +7 -7
  9. package/src/bmm-skills/1-analysis/bmad-product-brief/prompts/draft-and-review.md +5 -5
  10. package/src/bmm-skills/1-analysis/bmad-product-brief/prompts/finalize.md +3 -1
  11. package/src/bmm-skills/1-analysis/bmad-product-brief/prompts/guided-elicitation.md +2 -2
  12. package/src/bmm-skills/2-plan-workflows/bmad-agent-pm/SKILL.md +46 -35
  13. package/src/bmm-skills/2-plan-workflows/bmad-agent-pm/customize.yaml +41 -0
  14. package/src/bmm-skills/2-plan-workflows/bmad-agent-ux-designer/SKILL.md +46 -31
  15. package/src/bmm-skills/2-plan-workflows/bmad-agent-ux-designer/customize.yaml +26 -0
  16. package/src/bmm-skills/2-plan-workflows/bmad-create-prd/steps-c/step-08-scoping.md +70 -23
  17. package/src/bmm-skills/2-plan-workflows/bmad-create-prd/steps-c/step-11-polish.md +1 -1
  18. package/src/bmm-skills/3-solutioning/bmad-agent-architect/SKILL.md +46 -30
  19. package/src/bmm-skills/3-solutioning/bmad-agent-architect/customize.yaml +29 -0
  20. package/src/bmm-skills/4-implementation/bmad-agent-dev/SKILL.md +57 -43
  21. package/src/bmm-skills/4-implementation/bmad-agent-dev/customize.yaml +44 -0
  22. package/src/bmm-skills/4-implementation/bmad-quick-dev/step-01-clarify-and-route.md +14 -5
  23. package/src/bmm-skills/4-implementation/bmad-quick-dev/step-03-implement.md +2 -0
  24. package/src/bmm-skills/4-implementation/bmad-quick-dev/step-05-present.md +17 -8
  25. package/src/bmm-skills/4-implementation/bmad-quick-dev/step-oneshot.md +4 -0
  26. package/src/bmm-skills/4-implementation/bmad-quick-dev/sync-sprint-status.md +19 -0
  27. package/src/bmm-skills/4-implementation/bmad-quick-dev/workflow.md +1 -0
  28. package/src/core-skills/module.yaml +1 -0
  29. package/src/scripts/resolve_customization.py +248 -0
  30. package/tools/installer/cli-utils.js +0 -137
  31. package/tools/installer/commands/status.js +1 -1
  32. package/tools/installer/commands/uninstall.js +1 -1
  33. package/tools/installer/core/existing-install.js +1 -1
  34. package/tools/installer/core/install-paths.js +7 -4
  35. package/tools/installer/core/installer.js +58 -10
  36. package/tools/installer/core/manifest-generator.js +9 -10
  37. package/tools/installer/core/manifest.js +1 -578
  38. package/tools/installer/file-ops.js +1 -1
  39. package/tools/installer/fs-native.js +116 -0
  40. package/tools/installer/ide/_config-driven.js +1 -1
  41. package/tools/installer/ide/platform-codes.js +1 -1
  42. package/tools/installer/ide/shared/path-utils.js +0 -145
  43. package/tools/installer/ide/shared/skill-manifest.js +1 -1
  44. package/tools/installer/message-loader.js +1 -1
  45. package/tools/installer/modules/community-manager.js +11 -6
  46. package/tools/installer/modules/custom-module-manager.js +1 -28
  47. package/tools/installer/modules/external-manager.js +5 -44
  48. package/tools/installer/modules/official-modules.js +5 -53
  49. package/tools/installer/modules/plugin-resolver.js +1 -1
  50. package/tools/installer/modules/registry-client.js +133 -12
  51. package/tools/installer/project-root.js +1 -1
  52. package/tools/installer/prompts.js +0 -106
  53. package/tools/installer/ui.js +45 -12
  54. package/tools/migrate-custom-module-paths.js +1 -1
  55. package/tools/installer/ide/shared/agent-command-generator.js +0 -180
  56. package/tools/installer/ide/shared/bmad-artifacts.js +0 -208
  57. package/tools/installer/ide/shared/module-injections.js +0 -136
  58. package/tools/installer/ide/templates/agent-command-template.md +0 -14
  59. package/tools/installer/ide/templates/combined/antigravity.md +0 -8
  60. package/tools/installer/ide/templates/combined/default-agent.md +0 -15
  61. package/tools/installer/ide/templates/combined/default-task.md +0 -10
  62. package/tools/installer/ide/templates/combined/default-tool.md +0 -10
  63. package/tools/installer/ide/templates/combined/default-workflow.md +0 -6
  64. package/tools/installer/ide/templates/combined/gemini-agent.toml +0 -14
  65. package/tools/installer/ide/templates/combined/gemini-task.toml +0 -11
  66. package/tools/installer/ide/templates/combined/gemini-tool.toml +0 -11
  67. package/tools/installer/ide/templates/combined/gemini-workflow-yaml.toml +0 -16
  68. package/tools/installer/ide/templates/combined/gemini-workflow.toml +0 -14
  69. package/tools/installer/ide/templates/combined/kiro-agent.md +0 -16
  70. package/tools/installer/ide/templates/combined/kiro-task.md +0 -9
  71. package/tools/installer/ide/templates/combined/kiro-tool.md +0 -9
  72. package/tools/installer/ide/templates/combined/kiro-workflow.md +0 -7
  73. package/tools/installer/ide/templates/combined/opencode-agent.md +0 -15
  74. package/tools/installer/ide/templates/combined/opencode-task.md +0 -13
  75. package/tools/installer/ide/templates/combined/opencode-tool.md +0 -13
  76. package/tools/installer/ide/templates/combined/opencode-workflow-yaml.md +0 -16
  77. package/tools/installer/ide/templates/combined/opencode-workflow.md +0 -16
  78. package/tools/installer/ide/templates/combined/rovodev.md +0 -9
  79. package/tools/installer/ide/templates/combined/trae.md +0 -9
  80. package/tools/installer/ide/templates/combined/windsurf-workflow.md +0 -10
  81. 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-extra');
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 is always in _bmad/_memory
675
- const bmadMemoryPath = '_memory';
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(bmadMemoryPath + '/') && path.dirname(relativePath).includes('-sidecar')) {
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 installedModules = entries
793
- .filter((entry) => entry.isDirectory() && entry.name !== '_config' && entry.name !== 'docs')
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 installedModules = entries
921
- .filter((entry) => entry.isDirectory() && entry.name !== '_config' && entry.name !== 'docs' && entry.name !== '_memory')
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-extra');
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
- for (const entry of entries) {
198
- if (!entry.isDirectory()) continue;
199
- if (entry.name.startsWith('.') || entry.name.startsWith('_')) continue;
200
- await walk(path.join(dir, entry.name));
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,capabilities,role,identity,communicationStyle,principles,module,path,canonicalId\n';
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),