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.
- package/package.json +1 -1
- package/tools/cli/installers/lib/core/manifest-generator.js +57 -105
- package/src/bmm-skills/1-analysis/bmad-document-project/bmad-skill-manifest.yaml +0 -1
- package/src/bmm-skills/1-analysis/bmad-product-brief/bmad-skill-manifest.yaml +0 -1
- package/src/bmm-skills/1-analysis/research/bmad-domain-research/bmad-skill-manifest.yaml +0 -1
- package/src/bmm-skills/1-analysis/research/bmad-market-research/bmad-skill-manifest.yaml +0 -1
- package/src/bmm-skills/1-analysis/research/bmad-technical-research/bmad-skill-manifest.yaml +0 -1
- package/src/bmm-skills/2-plan-workflows/bmad-create-prd/bmad-skill-manifest.yaml +0 -1
- package/src/bmm-skills/2-plan-workflows/bmad-create-ux-design/bmad-skill-manifest.yaml +0 -1
- package/src/bmm-skills/2-plan-workflows/bmad-edit-prd/bmad-skill-manifest.yaml +0 -1
- package/src/bmm-skills/2-plan-workflows/bmad-validate-prd/bmad-skill-manifest.yaml +0 -1
- package/src/bmm-skills/3-solutioning/bmad-check-implementation-readiness/bmad-skill-manifest.yaml +0 -1
- package/src/bmm-skills/3-solutioning/bmad-create-architecture/bmad-skill-manifest.yaml +0 -1
- package/src/bmm-skills/3-solutioning/bmad-create-epics-and-stories/bmad-skill-manifest.yaml +0 -1
- package/src/bmm-skills/3-solutioning/bmad-generate-project-context/bmad-skill-manifest.yaml +0 -1
- package/src/bmm-skills/4-implementation/bmad-code-review/bmad-skill-manifest.yaml +0 -1
- package/src/bmm-skills/4-implementation/bmad-correct-course/bmad-skill-manifest.yaml +0 -1
- package/src/bmm-skills/4-implementation/bmad-create-story/bmad-skill-manifest.yaml +0 -1
- package/src/bmm-skills/4-implementation/bmad-dev-story/bmad-skill-manifest.yaml +0 -1
- package/src/bmm-skills/4-implementation/bmad-qa-generate-e2e-tests/bmad-skill-manifest.yaml +0 -1
- package/src/bmm-skills/4-implementation/bmad-quick-dev/bmad-skill-manifest.yaml +0 -1
- package/src/bmm-skills/4-implementation/bmad-retrospective/bmad-skill-manifest.yaml +0 -1
- package/src/bmm-skills/4-implementation/bmad-sprint-planning/bmad-skill-manifest.yaml +0 -1
- package/src/bmm-skills/4-implementation/bmad-sprint-status/bmad-skill-manifest.yaml +0 -1
- package/src/core-skills/bmad-advanced-elicitation/bmad-skill-manifest.yaml +0 -1
- package/src/core-skills/bmad-brainstorming/bmad-skill-manifest.yaml +0 -1
- package/src/core-skills/bmad-distillator/bmad-skill-manifest.yaml +0 -15
- package/src/core-skills/bmad-editorial-review-prose/bmad-skill-manifest.yaml +0 -1
- package/src/core-skills/bmad-editorial-review-structure/bmad-skill-manifest.yaml +0 -1
- package/src/core-skills/bmad-help/bmad-skill-manifest.yaml +0 -1
- package/src/core-skills/bmad-index-docs/bmad-skill-manifest.yaml +0 -1
- package/src/core-skills/bmad-init/bmad-skill-manifest.yaml +0 -1
- package/src/core-skills/bmad-party-mode/bmad-skill-manifest.yaml +0 -1
- package/src/core-skills/bmad-review-adversarial-general/bmad-skill-manifest.yaml +0 -1
- package/src/core-skills/bmad-review-edge-case-hunter/bmad-skill-manifest.yaml +0 -1
- package/src/core-skills/bmad-shard-doc/bmad-skill-manifest.yaml +0 -1
package/package.json
CHANGED
|
@@ -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
|
|
174
|
-
*
|
|
175
|
-
*
|
|
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
|
-
//
|
|
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
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
//
|
|
208
|
-
const
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
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
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
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.
|
|
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
|
|
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
|
|
1364
|
+
* @returns {boolean} True if a SKILL.md is found
|
|
1412
1365
|
*/
|
|
1413
|
-
async
|
|
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
|
|
1422
|
-
|
|
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.
|
|
1381
|
+
if (await this._hasSkillMdRecursive(path.join(dir, entry.name))) return true;
|
|
1430
1382
|
}
|
|
1431
1383
|
|
|
1432
1384
|
return false;
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
type: skill
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
type: skill
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
type: skill
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
type: skill
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
type: skill
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
type: skill
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
type: skill
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
type: skill
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
type: skill
|
package/src/bmm-skills/3-solutioning/bmad-check-implementation-readiness/bmad-skill-manifest.yaml
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
type: skill
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
type: skill
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
type: skill
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
type: skill
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
type: skill
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
type: skill
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
type: skill
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
type: skill
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
type: skill
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
type: skill
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
type: skill
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
type: skill
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
type: skill
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
type: skill
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
type: skill
|
|
@@ -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
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
type: skill
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
type: skill
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
type: skill
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
type: skill
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
type: skill
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
type: skill
|