bmad-method 6.6.1-next.0 → 6.6.1-next.2
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/src/bmm-skills/1-analysis/bmad-prfaq/bmad-manifest.json +2 -2
- package/src/bmm-skills/1-analysis/bmad-product-brief/bmad-manifest.json +2 -2
- package/src/bmm-skills/module-help.csv +1 -1
- package/src/core-skills/bmad-distillator/resources/distillate-format-reference.md +1 -1
- package/src/core-skills/bmad-help/SKILL.md +4 -4
- package/src/core-skills/module-help.csv +1 -1
- package/tools/installer/core/installer.js +13 -2
- package/tools/installer/ide/_config-driven.js +1 -12
- package/tools/installer/modules/module-help-schema.js +13 -0
- package/tools/installer/modules/plugin-resolver.js +2 -2
package/package.json
CHANGED
|
@@ -7,8 +7,8 @@
|
|
|
7
7
|
"description": "Produces battle-tested PRFAQ document and optional LLM distillate for PRD input.",
|
|
8
8
|
"supports-headless": true,
|
|
9
9
|
"phase-name": "1-analysis",
|
|
10
|
-
"
|
|
11
|
-
"
|
|
10
|
+
"preceded-by": ["brainstorming", "perform-research"],
|
|
11
|
+
"followed-by": ["create-prd"],
|
|
12
12
|
"is-required": false,
|
|
13
13
|
"output-location": "{planning_artifacts}"
|
|
14
14
|
}
|
|
@@ -8,8 +8,8 @@
|
|
|
8
8
|
"description": "Produces executive product brief and optional LLM distillate for PRD input.",
|
|
9
9
|
"supports-headless": true,
|
|
10
10
|
"phase-name": "1-analysis",
|
|
11
|
-
"
|
|
12
|
-
"
|
|
11
|
+
"preceded-by": ["brainstorming", "perform-research"],
|
|
12
|
+
"followed-by": ["create-prd"],
|
|
13
13
|
"is-required": true,
|
|
14
14
|
"output-location": "{planning_artifacts}"
|
|
15
15
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
module,skill,display-name,menu-code,description,action,args,phase,
|
|
1
|
+
module,skill,display-name,menu-code,description,action,args,phase,preceded-by,followed-by,required,output-location,outputs
|
|
2
2
|
BMad Method,_meta,,,,,,,,,false,https://docs.bmad-method.org/llms.txt,
|
|
3
3
|
BMad Method,bmad-document-project,Document Project,DP,Analyze an existing project to produce useful documentation.,,,anytime,,,false,project-knowledge,*
|
|
4
4
|
BMad Method,bmad-generate-project-context,Generate Project Context,GPC,Scan existing codebase to generate a lean LLM-optimized project-context.md. Essential for brownfield projects.,,,anytime,,,false,output_folder,project context
|
|
@@ -139,7 +139,7 @@ parts: 1
|
|
|
139
139
|
|
|
140
140
|
## Solution Architecture
|
|
141
141
|
- Plugins: skill bundles with Anthropic plugin standard as base format + bmad-manifest.json extending for BMAD-specific metadata (installer options, capabilities, help integration, phase ordering, dependencies)
|
|
142
|
-
- Existing manifest example: `{"module-code":"bmm","replaces-skill":"bmad-create-product-brief","capabilities":[{"name":"create-brief","menu-code":"CB","supports-headless":true,"phase-name":"1-analysis","
|
|
142
|
+
- Existing manifest example: `{"module-code":"bmm","replaces-skill":"bmad-create-product-brief","capabilities":[{"name":"create-brief","menu-code":"CB","supports-headless":true,"phase-name":"1-analysis","preceded-by":["brainstorming"],"followed-by":["create-prd"],"is-required":true}]}`
|
|
143
143
|
- Vercel skills CLI handles platform translation; integration pattern (wrap/fork/call) is PRD decision
|
|
144
144
|
- bmad-setup: global skill scanning installed bmad-manifest.json files, registering capabilities, configuring project settings; always included as base skill in every bundle (solves bootstrapping)
|
|
145
145
|
- bmad-update: plugin update path without full reinstall; technical approach (diff/replace/preserve customizations) is PRD decision
|
|
@@ -33,16 +33,16 @@ When this skill completes, the user should:
|
|
|
33
33
|
The catalog uses this format:
|
|
34
34
|
|
|
35
35
|
```
|
|
36
|
-
module,skill,display-name,menu-code,description,action,args,phase,
|
|
36
|
+
module,skill,display-name,menu-code,description,action,args,phase,preceded-by,followed-by,required,output-location,outputs
|
|
37
37
|
```
|
|
38
38
|
|
|
39
39
|
**Phases** determine the high-level flow:
|
|
40
40
|
- `anytime` — available regardless of workflow state
|
|
41
41
|
- Numbered phases (`1-analysis`, `2-planning`, etc.) flow in order; naming varies by module
|
|
42
42
|
|
|
43
|
-
**
|
|
44
|
-
- `
|
|
45
|
-
- `
|
|
43
|
+
**Sequencing** determines recommended ordering within and across phases (these are soft suggestions, not hard gates — see `required` for gating):
|
|
44
|
+
- `preceded-by` — skills that should ideally complete before this one
|
|
45
|
+
- `followed-by` — skills that should ideally run after this one
|
|
46
46
|
- Format: `skill-name` for single-action skills, `skill-name:action` for multi-action skills
|
|
47
47
|
|
|
48
48
|
**Required gates**:
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
module,skill,display-name,menu-code,description,action,args,phase,
|
|
1
|
+
module,skill,display-name,menu-code,description,action,args,phase,preceded-by,followed-by,required,output-location,outputs
|
|
2
2
|
Core,_meta,,,,,,,,,false,https://docs.bmad-method.org/llms.txt,
|
|
3
3
|
Core,bmad-brainstorming,Brainstorming,BSP,Use early in ideation or when stuck generating ideas.,,,anytime,,,false,{output_folder}/brainstorming,brainstorming session
|
|
4
4
|
Core,bmad-party-mode,Party Mode,PM,Orchestrate multi-agent discussions when you need multiple perspectives or want agents to collaborate.,,,anytime,,,false,,
|
|
@@ -12,6 +12,7 @@ const { BMAD_FOLDER_NAME } = require('../ide/shared/path-utils');
|
|
|
12
12
|
const { InstallPaths } = require('./install-paths');
|
|
13
13
|
const { ExternalModuleManager } = require('../modules/external-manager');
|
|
14
14
|
const { resolveModuleVersion } = require('../modules/version-resolver');
|
|
15
|
+
const { MODULE_HELP_CSV_HEADER } = require('../modules/module-help-schema');
|
|
15
16
|
|
|
16
17
|
const { ExistingInstall } = require('./existing-install');
|
|
17
18
|
const { warnPreNativeSkillsLegacy } = require('./legacy-warnings');
|
|
@@ -942,7 +943,7 @@ class Installer {
|
|
|
942
943
|
*/
|
|
943
944
|
async mergeModuleHelpCatalogs(bmadDir, _agentEntries = []) {
|
|
944
945
|
const allRows = [];
|
|
945
|
-
const headerRow =
|
|
946
|
+
const headerRow = MODULE_HELP_CSV_HEADER;
|
|
946
947
|
const COLUMN_COUNT = 13;
|
|
947
948
|
const PHASE_INDEX = 7;
|
|
948
949
|
|
|
@@ -975,9 +976,19 @@ class Installer {
|
|
|
975
976
|
const content = await fs.readFile(helpFilePath, 'utf8');
|
|
976
977
|
const lines = content.split('\n').filter((line) => line.trim() && !line.startsWith('#'));
|
|
977
978
|
|
|
979
|
+
let headerWarned = false;
|
|
978
980
|
for (const line of lines) {
|
|
979
|
-
//
|
|
981
|
+
// Header row: warn on drift from canonical schema, then skip.
|
|
982
|
+
// Data rows are loaded positionally regardless, so the warning
|
|
983
|
+
// is advisory — the maintainer should rename their columns.
|
|
980
984
|
if (line.startsWith('module,')) {
|
|
985
|
+
if (!headerWarned && line.trim() !== headerRow) {
|
|
986
|
+
await prompts.log.warn(
|
|
987
|
+
` ${moduleName}/module-help.csv header does not match canonical schema. ` +
|
|
988
|
+
`Expected: ${headerRow} | Found: ${line.trim()} | Data loaded positionally.`,
|
|
989
|
+
);
|
|
990
|
+
headerWarned = true;
|
|
991
|
+
}
|
|
981
992
|
continue;
|
|
982
993
|
}
|
|
983
994
|
|
|
@@ -57,15 +57,6 @@ function isSafeCanonicalId(value) {
|
|
|
57
57
|
// OpenCode's native `@skills/<id>` skill-reference syntax.
|
|
58
58
|
const DEFAULT_COMMANDS_BODY_TEMPLATE = '@skills/{canonicalId}';
|
|
59
59
|
|
|
60
|
-
// `bmad-help` is the structural meta-skill across BMAD: the orientation
|
|
61
|
-
// helper that points users at every other skill. It is invoked
|
|
62
|
-
// persona-style ("ask the helper") even though it has no [agent]
|
|
63
|
-
// customize.toml of its own (it isn't a configurable persona). Surfacing
|
|
64
|
-
// it in agents-picker contexts mirrors how users actually reach for it,
|
|
65
|
-
// and the inclusion is unique and stable — there is no second meta-help
|
|
66
|
-
// skill to encourage growth of this exception.
|
|
67
|
-
const ALWAYS_AGENT_IDS = new Set(['bmad-help']);
|
|
68
|
-
|
|
69
60
|
// Is this skill a persona agent (vs. a workflow/tool/standalone skill)?
|
|
70
61
|
// Used by platforms that surface only persona agents (e.g. Copilot's Custom
|
|
71
62
|
// Agents picker). Signal: the skill's source `customize.toml` has an
|
|
@@ -77,15 +68,13 @@ const ALWAYS_AGENT_IDS = new Set(['bmad-help']);
|
|
|
77
68
|
// GDS, WDS, TEA, and correctly excludes meta-skills like
|
|
78
69
|
// `bmad-agent-builder` (a skill-builder workflow whose canonical id
|
|
79
70
|
// contains `-agent-` but which has no [agent] section because it isn't a
|
|
80
|
-
// persona itself).
|
|
81
|
-
// structural exception (`bmad-help`).
|
|
71
|
+
// persona itself).
|
|
82
72
|
//
|
|
83
73
|
// Reading the source toml — at install time the source skill directory
|
|
84
74
|
// (resolved from manifest record.path) still exists; cleanup runs later
|
|
85
75
|
// in the install flow.
|
|
86
76
|
async function isAgentSkill(record, bmadDir) {
|
|
87
77
|
if (!record?.path || !bmadDir) return false;
|
|
88
|
-
if (record.canonicalId && ALWAYS_AGENT_IDS.has(record.canonicalId)) return true;
|
|
89
78
|
const bmadFolderName = path.basename(bmadDir);
|
|
90
79
|
const bmadPrefix = bmadFolderName + '/';
|
|
91
80
|
const relativePath = record.path.startsWith(bmadPrefix) ? record.path.slice(bmadPrefix.length) : record.path;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Canonical schema for per-module `module-help.csv` files.
|
|
3
|
+
*
|
|
4
|
+
* Both the merger (`Installer.mergeModuleHelpCatalogs`) and the synthesizer
|
|
5
|
+
* (`PluginResolver._buildSynthesizedHelpCsv`) emit this exact header. The
|
|
6
|
+
* merger compares each per-module file's header against this string and
|
|
7
|
+
* warns on drift, so any rename here must be matched in external module
|
|
8
|
+
* authors' CSVs (or accepted as a positional fall-through with a warning).
|
|
9
|
+
*/
|
|
10
|
+
const MODULE_HELP_CSV_HEADER =
|
|
11
|
+
'module,skill,display-name,menu-code,description,action,args,phase,preceded-by,followed-by,required,output-location,outputs';
|
|
12
|
+
|
|
13
|
+
module.exports = { MODULE_HELP_CSV_HEADER };
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
const fs = require('../fs-native');
|
|
2
2
|
const path = require('node:path');
|
|
3
3
|
const yaml = require('yaml');
|
|
4
|
+
const { MODULE_HELP_CSV_HEADER } = require('./module-help-schema');
|
|
4
5
|
|
|
5
6
|
/**
|
|
6
7
|
* Resolves how to install a plugin from marketplace.json by analyzing
|
|
@@ -338,8 +339,7 @@ class PluginResolver {
|
|
|
338
339
|
* @returns {string} CSV content
|
|
339
340
|
*/
|
|
340
341
|
_buildSynthesizedHelpCsv(moduleName, skillInfos) {
|
|
341
|
-
const
|
|
342
|
-
const rows = [header];
|
|
342
|
+
const rows = [MODULE_HELP_CSV_HEADER];
|
|
343
343
|
|
|
344
344
|
for (const info of skillInfos) {
|
|
345
345
|
const displayName = this._formatDisplayName(info.name || info.dirName);
|