bmad-method 6.2.1-next.25 → 6.2.1-next.26

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 (36) hide show
  1. package/package.json +1 -1
  2. package/tools/cli/installers/lib/core/manifest-generator.js +57 -105
  3. package/src/bmm-skills/1-analysis/bmad-document-project/bmad-skill-manifest.yaml +0 -1
  4. package/src/bmm-skills/1-analysis/bmad-product-brief/bmad-skill-manifest.yaml +0 -1
  5. package/src/bmm-skills/1-analysis/research/bmad-domain-research/bmad-skill-manifest.yaml +0 -1
  6. package/src/bmm-skills/1-analysis/research/bmad-market-research/bmad-skill-manifest.yaml +0 -1
  7. package/src/bmm-skills/1-analysis/research/bmad-technical-research/bmad-skill-manifest.yaml +0 -1
  8. package/src/bmm-skills/2-plan-workflows/bmad-create-prd/bmad-skill-manifest.yaml +0 -1
  9. package/src/bmm-skills/2-plan-workflows/bmad-create-ux-design/bmad-skill-manifest.yaml +0 -1
  10. package/src/bmm-skills/2-plan-workflows/bmad-edit-prd/bmad-skill-manifest.yaml +0 -1
  11. package/src/bmm-skills/2-plan-workflows/bmad-validate-prd/bmad-skill-manifest.yaml +0 -1
  12. package/src/bmm-skills/3-solutioning/bmad-check-implementation-readiness/bmad-skill-manifest.yaml +0 -1
  13. package/src/bmm-skills/3-solutioning/bmad-create-architecture/bmad-skill-manifest.yaml +0 -1
  14. package/src/bmm-skills/3-solutioning/bmad-create-epics-and-stories/bmad-skill-manifest.yaml +0 -1
  15. package/src/bmm-skills/3-solutioning/bmad-generate-project-context/bmad-skill-manifest.yaml +0 -1
  16. package/src/bmm-skills/4-implementation/bmad-code-review/bmad-skill-manifest.yaml +0 -1
  17. package/src/bmm-skills/4-implementation/bmad-correct-course/bmad-skill-manifest.yaml +0 -1
  18. package/src/bmm-skills/4-implementation/bmad-create-story/bmad-skill-manifest.yaml +0 -1
  19. package/src/bmm-skills/4-implementation/bmad-dev-story/bmad-skill-manifest.yaml +0 -1
  20. package/src/bmm-skills/4-implementation/bmad-qa-generate-e2e-tests/bmad-skill-manifest.yaml +0 -1
  21. package/src/bmm-skills/4-implementation/bmad-quick-dev/bmad-skill-manifest.yaml +0 -1
  22. package/src/bmm-skills/4-implementation/bmad-retrospective/bmad-skill-manifest.yaml +0 -1
  23. package/src/bmm-skills/4-implementation/bmad-sprint-planning/bmad-skill-manifest.yaml +0 -1
  24. package/src/bmm-skills/4-implementation/bmad-sprint-status/bmad-skill-manifest.yaml +0 -1
  25. package/src/core-skills/bmad-advanced-elicitation/bmad-skill-manifest.yaml +0 -1
  26. package/src/core-skills/bmad-brainstorming/bmad-skill-manifest.yaml +0 -1
  27. package/src/core-skills/bmad-distillator/bmad-skill-manifest.yaml +0 -15
  28. package/src/core-skills/bmad-editorial-review-prose/bmad-skill-manifest.yaml +0 -1
  29. package/src/core-skills/bmad-editorial-review-structure/bmad-skill-manifest.yaml +0 -1
  30. package/src/core-skills/bmad-help/bmad-skill-manifest.yaml +0 -1
  31. package/src/core-skills/bmad-index-docs/bmad-skill-manifest.yaml +0 -1
  32. package/src/core-skills/bmad-init/bmad-skill-manifest.yaml +0 -1
  33. package/src/core-skills/bmad-party-mode/bmad-skill-manifest.yaml +0 -1
  34. package/src/core-skills/bmad-review-adversarial-general/bmad-skill-manifest.yaml +0 -1
  35. package/src/core-skills/bmad-review-edge-case-hunter/bmad-skill-manifest.yaml +0 -1
  36. package/src/core-skills/bmad-shard-doc/bmad-skill-manifest.yaml +0 -1
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://json.schemastore.org/package.json",
3
3
  "name": "bmad-method",
4
- "version": "6.2.1-next.25",
4
+ "version": "6.2.1-next.26",
5
5
  "description": "Breakthrough Method of Agile AI-driven Development",
6
6
  "keywords": [
7
7
  "agile",
@@ -50,29 +50,6 @@ class ManifestGenerator {
50
50
  return getInstallToBmadShared(manifest, filename);
51
51
  }
52
52
 
53
- /**
54
- * Native SKILL.md entrypoints can be packaged as either skills or agents.
55
- * Both need verbatim installation for skill-format IDEs.
56
- * @param {string|null} artifactType - Manifest type resolved for SKILL.md
57
- * @returns {boolean} True when the directory should be installed verbatim
58
- */
59
- isNativeSkillDirType(artifactType) {
60
- return artifactType === 'skill' || artifactType === 'agent';
61
- }
62
-
63
- /**
64
- * Check whether a loaded bmad-skill-manifest.yaml declares a native
65
- * SKILL.md entrypoint, either as a single-entry manifest or a multi-entry map.
66
- * @param {Object|null} manifest - Loaded manifest
67
- * @returns {boolean} True when the manifest contains a native skill/agent entrypoint
68
- */
69
- hasNativeSkillManifest(manifest) {
70
- if (!manifest) return false;
71
- if (manifest.__single) return this.isNativeSkillDirType(manifest.__single.type);
72
-
73
- return Object.values(manifest).some((entry) => this.isNativeSkillDirType(entry?.type));
74
- }
75
-
76
53
  /**
77
54
  * Clean text for CSV output by normalizing whitespace.
78
55
  * Note: Quote escaping is handled by escapeCsv() at write time.
@@ -170,9 +147,9 @@ class ManifestGenerator {
170
147
 
171
148
  /**
172
149
  * Recursively walk a module directory tree, collecting native SKILL.md entrypoints.
173
- * A native entrypoint directory is one that contains both a
174
- * bmad-skill-manifest.yaml with type: skill or type: agent AND a SKILL.md file
175
- * with name/description frontmatter.
150
+ * A directory is discovered as a skill when it contains a SKILL.md file with
151
+ * valid name/description frontmatter (name must match directory name).
152
+ * Manifest YAML is loaded only when present — for install_to_bmad and agent metadata.
176
153
  * Populates this.skills[] and this.skillClaimedDirs (Set of absolute paths).
177
154
  */
178
155
  async collectSkills() {
@@ -193,77 +170,55 @@ class ManifestGenerator {
193
170
  return;
194
171
  }
195
172
 
196
- // Check this directory for skill manifest
197
- const manifest = await this.loadSkillManifest(dir);
198
-
199
- // Determine if this directory is a native SKILL.md entrypoint
173
+ // SKILL.md with valid frontmatter is the primary discovery gate
200
174
  const skillFile = 'SKILL.md';
201
- const artifactType = this.getArtifactType(manifest, skillFile);
202
-
203
- if (this.isNativeSkillDirType(artifactType)) {
204
- const skillMdPath = path.join(dir, 'SKILL.md');
205
- const dirName = path.basename(dir);
206
-
207
- // Validate and parse SKILL.md
208
- const skillMeta = await this.parseSkillMd(skillMdPath, dir, dirName, debug);
209
-
210
- if (skillMeta) {
211
- // Build path relative from module root (points to SKILL.md — the permanent entrypoint)
212
- const relativePath = path.relative(modulePath, dir).split(path.sep).join('/');
213
- const installPath = relativePath
214
- ? `${this.bmadFolderName}/${moduleName}/${relativePath}/${skillFile}`
215
- : `${this.bmadFolderName}/${moduleName}/${skillFile}`;
216
-
217
- // Native SKILL.md entrypoints derive canonicalId from directory name.
218
- // Agent entrypoints may keep canonicalId metadata for compatibility, so
219
- // only warn for non-agent SKILL.md directories.
220
- if (manifest && manifest.__single && manifest.__single.canonicalId && artifactType !== 'agent') {
221
- console.warn(
222
- `Warning: Native entrypoint manifest at ${dir}/bmad-skill-manifest.yaml contains canonicalId — this field is ignored for SKILL.md directories (directory name is the canonical ID)`,
223
- );
224
- }
225
- const canonicalId = dirName;
226
-
227
- this.skills.push({
228
- name: skillMeta.name,
229
- description: this.cleanForCSV(skillMeta.description),
230
- module: moduleName,
231
- path: installPath,
232
- canonicalId,
233
- install_to_bmad: this.getInstallToBmad(manifest, skillFile),
234
- });
235
-
236
- // Add to files list
237
- this.files.push({
238
- type: 'skill',
239
- name: skillMeta.name,
240
- module: moduleName,
241
- path: installPath,
242
- });
243
-
244
- this.skillClaimedDirs.add(dir);
245
-
246
- if (debug) {
247
- console.log(`[DEBUG] collectSkills: claimed skill "${skillMeta.name}" as ${canonicalId} at ${dir}`);
248
- }
175
+ const skillMdPath = path.join(dir, skillFile);
176
+ const dirName = path.basename(dir);
177
+
178
+ const skillMeta = await this.parseSkillMd(skillMdPath, dir, dirName, debug);
179
+
180
+ if (skillMeta) {
181
+ // Load manifest when present (for install_to_bmad and agent metadata)
182
+ const manifest = await this.loadSkillManifest(dir);
183
+ const artifactType = this.getArtifactType(manifest, skillFile);
184
+
185
+ // Build path relative from module root (points to SKILL.md — the permanent entrypoint)
186
+ const relativePath = path.relative(modulePath, dir).split(path.sep).join('/');
187
+ const installPath = relativePath
188
+ ? `${this.bmadFolderName}/${moduleName}/${relativePath}/${skillFile}`
189
+ : `${this.bmadFolderName}/${moduleName}/${skillFile}`;
190
+
191
+ // Native SKILL.md entrypoints derive canonicalId from directory name.
192
+ // Agent entrypoints may keep canonicalId metadata for compatibility, so
193
+ // only warn for non-agent SKILL.md directories.
194
+ if (manifest && manifest.__single && manifest.__single.canonicalId && artifactType !== 'agent') {
195
+ console.warn(
196
+ `Warning: Native entrypoint manifest at ${dir}/bmad-skill-manifest.yaml contains canonicalId — this field is ignored for SKILL.md directories (directory name is the canonical ID)`,
197
+ );
249
198
  }
250
- }
199
+ const canonicalId = dirName;
251
200
 
252
- // Warn if manifest says this is a native entrypoint but the directory was not claimed
253
- if (manifest && !this.skillClaimedDirs.has(dir)) {
254
- let hasNativeSkillType = false;
255
- if (manifest.__single) {
256
- hasNativeSkillType = this.isNativeSkillDirType(manifest.__single.type);
257
- } else {
258
- for (const key of Object.keys(manifest)) {
259
- if (this.isNativeSkillDirType(manifest[key]?.type)) {
260
- hasNativeSkillType = true;
261
- break;
262
- }
263
- }
264
- }
265
- if (hasNativeSkillType && debug) {
266
- console.log(`[DEBUG] collectSkills: dir has native SKILL.md manifest but failed validation: ${dir}`);
201
+ this.skills.push({
202
+ name: skillMeta.name,
203
+ description: this.cleanForCSV(skillMeta.description),
204
+ module: moduleName,
205
+ path: installPath,
206
+ canonicalId,
207
+ install_to_bmad: this.getInstallToBmad(manifest, skillFile),
208
+ });
209
+
210
+ // Add to files list
211
+ this.files.push({
212
+ type: 'skill',
213
+ name: skillMeta.name,
214
+ module: moduleName,
215
+ path: installPath,
216
+ });
217
+
218
+ this.skillClaimedDirs.add(dir);
219
+
220
+ if (debug) {
221
+ console.log(`[DEBUG] collectSkills: claimed skill "${skillMeta.name}" as ${canonicalId} at ${dir}`);
267
222
  }
268
223
  }
269
224
 
@@ -1384,11 +1339,10 @@ class ManifestGenerator {
1384
1339
  const hasTasks = await fs.pathExists(path.join(modulePath, 'tasks'));
1385
1340
  const hasTools = await fs.pathExists(path.join(modulePath, 'tools'));
1386
1341
 
1387
- // Check for native-entrypoint-only modules: recursive scan for
1388
- // bmad-skill-manifest.yaml with type: skill or type: agent
1342
+ // Check for native-entrypoint-only modules: recursive scan for SKILL.md
1389
1343
  let hasSkills = false;
1390
1344
  if (!hasAgents && !hasWorkflows && !hasTasks && !hasTools) {
1391
- hasSkills = await this._hasSkillManifestRecursive(modulePath);
1345
+ hasSkills = await this._hasSkillMdRecursive(modulePath);
1392
1346
  }
1393
1347
 
1394
1348
  // If it has any of these directories or skill manifests, it's likely a module
@@ -1404,13 +1358,12 @@ class ManifestGenerator {
1404
1358
  }
1405
1359
 
1406
1360
  /**
1407
- * Recursively check if a directory tree contains a bmad-skill-manifest.yaml that
1408
- * declares a native SKILL.md entrypoint (type: skill or type: agent).
1361
+ * Recursively check if a directory tree contains a SKILL.md file.
1409
1362
  * Skips directories starting with . or _.
1410
1363
  * @param {string} dir - Directory to search
1411
- * @returns {boolean} True if a skill manifest is found
1364
+ * @returns {boolean} True if a SKILL.md is found
1412
1365
  */
1413
- async _hasSkillManifestRecursive(dir) {
1366
+ async _hasSkillMdRecursive(dir) {
1414
1367
  let entries;
1415
1368
  try {
1416
1369
  entries = await fs.readdir(dir, { withFileTypes: true });
@@ -1418,15 +1371,14 @@ class ManifestGenerator {
1418
1371
  return false;
1419
1372
  }
1420
1373
 
1421
- // Check for manifest in this directory
1422
- const manifest = await this.loadSkillManifest(dir);
1423
- if (this.hasNativeSkillManifest(manifest)) return true;
1374
+ // Check for SKILL.md in this directory
1375
+ if (entries.some((e) => !e.isDirectory() && e.name === 'SKILL.md')) return true;
1424
1376
 
1425
1377
  // Recurse into subdirectories
1426
1378
  for (const entry of entries) {
1427
1379
  if (!entry.isDirectory()) continue;
1428
1380
  if (entry.name.startsWith('.') || entry.name.startsWith('_')) continue;
1429
- if (await this._hasSkillManifestRecursive(path.join(dir, entry.name))) return true;
1381
+ if (await this._hasSkillMdRecursive(path.join(dir, entry.name))) return true;
1430
1382
  }
1431
1383
 
1432
1384
  return false;
@@ -1,15 +0,0 @@
1
- type: skill
2
- module: core
3
- capabilities:
4
- - name: bmad-distillator
5
- menu-code: DSTL
6
- description: "Produces lossless LLM-optimized distillate from source documents. Use after producing large human presentable documents that will be consumed later by LLMs"
7
- supports-headless: true
8
- input: source documents
9
- args: output, validate
10
- output: single distillate or folder of distillates next to source input
11
- config-vars-used: null
12
- phase: anytime
13
- before: []
14
- after: []
15
- is-required: false
@@ -1 +0,0 @@
1
- type: skill
@@ -1 +0,0 @@
1
- type: skill
@@ -1 +0,0 @@
1
- type: skill