bmad-method 6.0.0-alpha.14 → 6.0.0-alpha.15
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/.coderabbit.yaml +36 -0
- package/{CODE_OF_CONDUCT.md → .github/CODE_OF_CONDUCT.md} +4 -4
- package/CHANGELOG.md +136 -408
- package/README.md +4 -1
- package/docs/custom-content-installation.md +245 -0
- package/docs/index.md +2 -2
- package/docs/installers-bundlers/installers-modules-platforms-reference.md +6 -5
- package/docs/web-bundles-gemini-gpt-guide.md +1 -1
- package/example-custom-content/README.md +4 -0
- package/example-custom-content/agents/commit-poet/commit-poet.agent.yaml +1 -1
- package/example-custom-content/agents/toolsmith/toolsmith-sidecar/instructions.md +1 -1
- package/example-custom-content/agents/toolsmith/toolsmith-sidecar/knowledge/docs.md +1 -1
- package/example-custom-content/agents/toolsmith/toolsmith-sidecar/knowledge/installers.md +1 -1
- package/example-custom-content/agents/toolsmith/toolsmith-sidecar/knowledge/modules.md +2 -2
- package/example-custom-content/agents/toolsmith/toolsmith.agent.yaml +1 -1
- package/example-custom-content/{custom.yaml → module.yaml} +1 -0
- package/example-custom-content/workflows/quiz-master/steps/step-01-init.md +2 -2
- package/example-custom-content/workflows/quiz-master/steps/step-02-q1.md +1 -1
- package/example-custom-content/workflows/quiz-master/steps/step-03-q2.md +1 -1
- package/example-custom-content/workflows/quiz-master/steps/step-04-q3.md +1 -1
- package/example-custom-content/workflows/quiz-master/steps/step-05-q4.md +1 -1
- package/example-custom-content/workflows/quiz-master/steps/step-06-q5.md +1 -1
- package/example-custom-content/workflows/quiz-master/steps/step-07-q6.md +1 -1
- package/example-custom-content/workflows/quiz-master/steps/step-08-q7.md +1 -1
- package/example-custom-content/workflows/quiz-master/steps/step-09-q8.md +1 -1
- package/example-custom-content/workflows/quiz-master/steps/step-10-q9.md +1 -1
- package/example-custom-content/workflows/quiz-master/steps/step-11-q10.md +1 -1
- package/example-custom-content/workflows/quiz-master/steps/step-12-results.md +1 -1
- package/example-custom-content/workflows/quiz-master/workflow.md +1 -1
- package/example-custom-module/mwm/README.md +5 -0
- package/example-custom-module/mwm/agents/cbt-coach/cbt-coach.agent.yaml +1 -0
- package/example-custom-module/mwm/agents/crisis-navigator.agent.yaml +3 -2
- package/example-custom-module/mwm/agents/meditation-guide.agent.yaml +3 -2
- package/example-custom-module/mwm/agents/wellness-companion/wellness-companion.agent.yaml +1 -0
- package/example-custom-module/mwm/{_module-installer/install-config.yaml → module.yaml} +1 -0
- package/package.json +1 -1
- package/src/core/_module-installer/installer.js +1 -1
- package/src/modules/bmb/_module-installer/installer.js +1 -1
- package/src/modules/bmb/docs/agents/index.md +1 -1
- package/src/modules/bmb/workflows/create-module/steps/step-04-structure.md +3 -3
- package/src/modules/bmb/workflows/create-module/steps/step-05-config.md +1 -1
- package/src/modules/bmb/workflows/create-module/steps/step-08-installer.md +8 -8
- package/src/modules/bmb/workflows/create-module/steps/step-09-documentation.md +2 -1
- package/src/modules/bmb/workflows/create-module/steps/step-10-roadmap.md +3 -2
- package/src/modules/bmb/workflows/create-module/steps/step-11-validate.md +3 -3
- package/src/modules/bmb/workflows/create-module/templates/installer.template.js +1 -1
- package/src/modules/bmb/workflows/create-module/validation.md +3 -3
- package/src/modules/bmb/workflows/create-workflow/steps/step-01-init.md +1 -1
- package/src/modules/bmb/workflows/create-workflow/steps/step-07-build.md +1 -1
- package/src/modules/bmgd/README.md +2 -1
- package/src/modules/bmm/_module-installer/installer.js +1 -1
- package/src/modules/bmm/_module-installer/platform-specifics/claude-code.js +1 -1
- package/src/modules/bmm/_module-installer/platform-specifics/windsurf.js +1 -1
- package/src/modules/cis/_module-installer/installer.js +1 -1
- package/tools/cli/README.md +4 -4
- package/tools/cli/installers/lib/core/config-collector.js +16 -8
- package/tools/cli/installers/lib/core/custom-module-cache.js +239 -0
- package/tools/cli/installers/lib/core/detector.js +8 -4
- package/tools/cli/installers/lib/core/installer.js +815 -23
- package/tools/cli/installers/lib/core/manifest-generator.js +176 -13
- package/tools/cli/installers/lib/core/manifest.js +47 -0
- package/tools/cli/installers/lib/custom/handler.js +150 -20
- package/tools/cli/installers/lib/modules/manager.js +78 -32
- package/tools/cli/lib/agent/compiler.js +3 -11
- package/tools/cli/lib/agent/installer.js +2 -1
- package/tools/cli/lib/cli-utils.js +21 -4
- package/tools/cli/lib/ui.js +499 -11
- package/tools/maintainer/review-pr-README.md +55 -0
- package/tools/maintainer/review-pr.md +242 -0
- package/tools/migrate-custom-module-paths.js +124 -0
- package/bmad-method-6.0.0-alpha.14.tgz +0 -0
- package/docs/custom-agent-installation.md +0 -137
- package/example-custom-content/workflows/quiz-master/workflow-plan-quiz-master.md +0 -269
- /package/src/core/{_module-installer/install-config.yaml → module.yaml} +0 -0
- /package/src/modules/bmb/{_module-installer/install-config.yaml → module.yaml} +0 -0
- /package/src/modules/bmb/workflows/create-module/templates/{install-config.template.yaml → module.template.yaml} +0 -0
- /package/src/modules/bmgd/{_module-installer/install-config.yaml → module.yaml} +0 -0
- /package/src/modules/bmm/{_module-installer/install-config.yaml → module.yaml} +0 -0
- /package/src/modules/cis/{_module-installer/install-config.yaml → module.yaml} +0 -0
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
# Raven's Verdict - Deep PR Review Tool
|
|
2
|
+
|
|
3
|
+
A cynical adversarial review, transformed into cold engineering professionalism.
|
|
4
|
+
|
|
5
|
+
<orientation>
|
|
6
|
+
CRITICAL: Sandboxed Execution Rules
|
|
7
|
+
|
|
8
|
+
Before proceeding, you MUST verify:
|
|
9
|
+
|
|
10
|
+
- [ ] PR number or URL was EXPLICITLY provided in the user's message
|
|
11
|
+
- [ ] You are NOT inferring the PR from conversation history
|
|
12
|
+
- [ ] You are NOT looking at git branches, recent commits, or local state
|
|
13
|
+
- [ ] You are NOT guessing or assuming any PR numbers
|
|
14
|
+
|
|
15
|
+
**If no explicit PR number/URL was provided, STOP immediately and ask:**
|
|
16
|
+
"What PR number or URL should I review?"
|
|
17
|
+
</orientation>
|
|
18
|
+
|
|
19
|
+
<preflight-checks>
|
|
20
|
+
|
|
21
|
+
## Preflight Checks
|
|
22
|
+
|
|
23
|
+
### 0.1 Parse PR Input
|
|
24
|
+
|
|
25
|
+
Extract PR number from user input. Examples of valid formats:
|
|
26
|
+
|
|
27
|
+
- `123` (just the number)
|
|
28
|
+
- `#123` (with hash)
|
|
29
|
+
- `https://github.com/owner/repo/pull/123` (full URL)
|
|
30
|
+
|
|
31
|
+
If a URL specifies a different repository than the current one:
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
# Check current repo
|
|
35
|
+
gh repo view --json nameWithOwner -q '.nameWithOwner'
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
If mismatch detected, ask user:
|
|
39
|
+
|
|
40
|
+
> "This PR is from `{detected_repo}` but we're in `{current_repo}`. Proceed with reviewing `{detected_repo}#123`? (y/n)"
|
|
41
|
+
|
|
42
|
+
If user confirms, store `{REPO}` for use in all subsequent `gh` commands.
|
|
43
|
+
|
|
44
|
+
### 0.2 Ensure Clean Checkout
|
|
45
|
+
|
|
46
|
+
Verify the working tree is clean and check out the PR branch.
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
# Check for uncommitted changes
|
|
50
|
+
git status --porcelain
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
If output is non-empty, STOP and tell user:
|
|
54
|
+
|
|
55
|
+
> "You have uncommitted changes. Please commit or stash them before running a PR review."
|
|
56
|
+
|
|
57
|
+
If clean, fetch and checkout the PR branch:
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
# Fetch and checkout PR branch
|
|
61
|
+
# For cross-repo PRs, include --repo {REPO}
|
|
62
|
+
gh pr checkout {PR_NUMBER} [--repo {REPO}]
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
If checkout fails, STOP and report the error.
|
|
66
|
+
|
|
67
|
+
Now you're on the PR branch with full access to all files as they exist in the PR.
|
|
68
|
+
|
|
69
|
+
### 0.3 Check PR Size
|
|
70
|
+
|
|
71
|
+
```bash
|
|
72
|
+
# For cross-repo PRs, include --repo {REPO}
|
|
73
|
+
gh pr view {PR_NUMBER} [--repo {REPO}] --json additions,deletions,changedFiles -q '{"additions": .additions, "deletions": .deletions, "files": .changedFiles}'
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
**Size thresholds:**
|
|
77
|
+
|
|
78
|
+
| Metric | Warning Threshold |
|
|
79
|
+
| ------------- | ----------------- |
|
|
80
|
+
| Files changed | > 50 |
|
|
81
|
+
| Lines changed | > 5000 |
|
|
82
|
+
|
|
83
|
+
If thresholds exceeded, ask user:
|
|
84
|
+
|
|
85
|
+
> "This PR has {X} files and {Y} line changes. That's large.
|
|
86
|
+
>
|
|
87
|
+
> **[f] Focus** - Pick specific files or directories to review
|
|
88
|
+
> **[p] Proceed** - Review everything (may be slow/expensive)
|
|
89
|
+
> **[a] Abort** - Stop here"
|
|
90
|
+
|
|
91
|
+
### 0.4 Note Binary Files
|
|
92
|
+
|
|
93
|
+
```bash
|
|
94
|
+
# For cross-repo PRs, include --repo {REPO}
|
|
95
|
+
gh pr diff {PR_NUMBER} [--repo {REPO}] --name-only | grep -E '\.(png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot|pdf|zip|tar|gz|bin|exe|dll|so|dylib)$' || echo "No binary files detected"
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
Store list of binary files to skip. Note them in final output.
|
|
99
|
+
|
|
100
|
+
</preflight-checks>
|
|
101
|
+
|
|
102
|
+
<adversarial-review>
|
|
103
|
+
|
|
104
|
+
### 1.1 Run Cynical Review
|
|
105
|
+
|
|
106
|
+
**INTERNAL PERSONA - Never post this directly:**
|
|
107
|
+
|
|
108
|
+
Task: You are a cynical, jaded code reviewer with zero patience for sloppy work. This PR was submitted by a clueless weasel and you expect to find problems. Find at least five issues to fix or improve in it. Number them. Be skeptical of everything. Ultrathink.
|
|
109
|
+
|
|
110
|
+
Output format:
|
|
111
|
+
|
|
112
|
+
```markdown
|
|
113
|
+
### [NUMBER]. [FINDING TITLE] [likely]
|
|
114
|
+
|
|
115
|
+
**Severity:** [EMOJI] [LEVEL]
|
|
116
|
+
|
|
117
|
+
[DESCRIPTION - be specific, include file:line references]
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
Severity scale:
|
|
121
|
+
|
|
122
|
+
| Level | Emoji | Meaning |
|
|
123
|
+
| -------- | ----- | ------------------------------------------------------- |
|
|
124
|
+
| Critical | 🔴 | Security issue, data loss risk, or broken functionality |
|
|
125
|
+
| Moderate | 🟡 | Bug, performance issue, or significant code smell |
|
|
126
|
+
| Minor | 🟢 | Style, naming, minor improvement opportunity |
|
|
127
|
+
|
|
128
|
+
Likely tag:
|
|
129
|
+
|
|
130
|
+
- Add `[likely]` to findings with high confidence, e.g. with direct evidence
|
|
131
|
+
- Sort findings by severity (Critical → Moderate → Minor), not by confidence
|
|
132
|
+
|
|
133
|
+
</adversarial-review>
|
|
134
|
+
|
|
135
|
+
<tone-transformation>
|
|
136
|
+
|
|
137
|
+
**Transform the cynical output into cold engineering professionalism.**
|
|
138
|
+
|
|
139
|
+
**Transformation rules:**
|
|
140
|
+
|
|
141
|
+
1. Remove all inflammatory language, insults, assumptions about the author
|
|
142
|
+
2. Keep all technical substance, file references, severity ratings and likely tag
|
|
143
|
+
3. Replace accusatory phrasing with neutral observations:
|
|
144
|
+
- ❌ "The author clearly didn't think about..."
|
|
145
|
+
- ✅ "This implementation may not account for..."
|
|
146
|
+
4. Preserve skepticism as healthy engineering caution:
|
|
147
|
+
- ❌ "This will definitely break in production"
|
|
148
|
+
- ✅ "This pattern has historically caused issues in production environments"
|
|
149
|
+
5. Add the suggested fixes.
|
|
150
|
+
6. Keep suggestions actionable and specific
|
|
151
|
+
|
|
152
|
+
Output format after transformation:
|
|
153
|
+
|
|
154
|
+
```markdown
|
|
155
|
+
## PR Review: #{PR_NUMBER}
|
|
156
|
+
|
|
157
|
+
**Title:** {PR_TITLE}
|
|
158
|
+
**Author:** @{AUTHOR}
|
|
159
|
+
**Branch:** {HEAD} → {BASE}
|
|
160
|
+
|
|
161
|
+
---
|
|
162
|
+
|
|
163
|
+
### Findings
|
|
164
|
+
|
|
165
|
+
[TRANSFORMED FINDINGS HERE]
|
|
166
|
+
|
|
167
|
+
---
|
|
168
|
+
|
|
169
|
+
### Summary
|
|
170
|
+
|
|
171
|
+
**Critical:** {COUNT} | **Moderate:** {COUNT} | **Minor:** {COUNT}
|
|
172
|
+
|
|
173
|
+
[BINARY_FILES_NOTE if any]
|
|
174
|
+
|
|
175
|
+
---
|
|
176
|
+
|
|
177
|
+
_Review generated by Raven's Verdict. LLM-produced analysis - findings may be incorrect or lack context. Verify before acting._
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
</tone-transformation>
|
|
181
|
+
|
|
182
|
+
<post-review>
|
|
183
|
+
### 3.1 Preview
|
|
184
|
+
|
|
185
|
+
Display the complete transformed review to the user.
|
|
186
|
+
|
|
187
|
+
```
|
|
188
|
+
══════════════════════════════════════════════════════
|
|
189
|
+
PREVIEW - This will be posted to PR #{PR_NUMBER}
|
|
190
|
+
══════════════════════════════════════════════════════
|
|
191
|
+
|
|
192
|
+
[FULL REVIEW CONTENT]
|
|
193
|
+
|
|
194
|
+
══════════════════════════════════════════════════════
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
### 3.2 Confirm
|
|
198
|
+
|
|
199
|
+
Ask user for explicit confirmation:
|
|
200
|
+
|
|
201
|
+
> **Ready to post this review to PR #{PR_NUMBER}?**
|
|
202
|
+
>
|
|
203
|
+
> **[y] Yes** - Post as comment
|
|
204
|
+
> **[n] No** - Abort, do not post
|
|
205
|
+
> **[e] Edit** - Let me modify before posting
|
|
206
|
+
> **[s] Save only** - Save locally, don't post
|
|
207
|
+
|
|
208
|
+
### 3.3 Post or Save
|
|
209
|
+
|
|
210
|
+
**Write review to a temp file, then post:**
|
|
211
|
+
|
|
212
|
+
1. Write the review content to a temp file with a unique name (include PR number to avoid collisions)
|
|
213
|
+
2. Post using `gh pr comment {PR_NUMBER} [--repo {REPO}] --body-file {path}`
|
|
214
|
+
3. Delete the temp file after successful post
|
|
215
|
+
|
|
216
|
+
Do NOT use heredocs or `echo` - Markdown code blocks will break shell parsing. Use your file writing tool instead.
|
|
217
|
+
|
|
218
|
+
**If auth fails or post fails:**
|
|
219
|
+
|
|
220
|
+
1. Display error prominently:
|
|
221
|
+
|
|
222
|
+
```
|
|
223
|
+
⚠️ FAILED TO POST REVIEW
|
|
224
|
+
Error: {ERROR_MESSAGE}
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
2. Keep the temp file and tell the user where it is, so they can post manually with:
|
|
228
|
+
`gh pr comment {PR_NUMBER} [--repo {REPO}] --body-file {path}`
|
|
229
|
+
|
|
230
|
+
**If save only (s):**
|
|
231
|
+
|
|
232
|
+
Keep the temp file and inform user of location.
|
|
233
|
+
|
|
234
|
+
</post-review>
|
|
235
|
+
|
|
236
|
+
<notes>
|
|
237
|
+
- The "cynical asshole" phase is internal only - never posted
|
|
238
|
+
- Tone transform MUST happen before any external output
|
|
239
|
+
- When in doubt, ask the user - never assume
|
|
240
|
+
- If you're unsure about severity, err toward higher severity
|
|
241
|
+
- If you're unsure about confidence, be honest and use Medium or Low
|
|
242
|
+
</notes>
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Migration script to convert relative paths to absolute paths in custom module manifests
|
|
3
|
+
* This should be run once to update existing installations
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
const fs = require('fs-extra');
|
|
7
|
+
const path = require('node:path');
|
|
8
|
+
const yaml = require('yaml');
|
|
9
|
+
const chalk = require('chalk');
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Find BMAD directory in project
|
|
13
|
+
*/
|
|
14
|
+
function findBmadDir(projectDir = process.cwd()) {
|
|
15
|
+
const possibleNames = ['bmad', '.bmad'];
|
|
16
|
+
|
|
17
|
+
for (const name of possibleNames) {
|
|
18
|
+
const bmadDir = path.join(projectDir, name);
|
|
19
|
+
if (fs.existsSync(bmadDir)) {
|
|
20
|
+
return bmadDir;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Update manifest to use absolute paths
|
|
29
|
+
*/
|
|
30
|
+
async function updateManifest(manifestPath, projectRoot) {
|
|
31
|
+
console.log(chalk.cyan(`\nUpdating manifest: ${manifestPath}`));
|
|
32
|
+
|
|
33
|
+
const content = await fs.readFile(manifestPath, 'utf8');
|
|
34
|
+
const manifest = yaml.parse(content);
|
|
35
|
+
|
|
36
|
+
if (!manifest.customModules || manifest.customModules.length === 0) {
|
|
37
|
+
console.log(chalk.dim(' No custom modules found'));
|
|
38
|
+
return false;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
let updated = false;
|
|
42
|
+
|
|
43
|
+
for (const customModule of manifest.customModules) {
|
|
44
|
+
if (customModule.relativePath && !customModule.sourcePath) {
|
|
45
|
+
// Convert relative path to absolute
|
|
46
|
+
const absolutePath = path.resolve(projectRoot, customModule.relativePath);
|
|
47
|
+
customModule.sourcePath = absolutePath;
|
|
48
|
+
|
|
49
|
+
// Remove the old relativePath
|
|
50
|
+
delete customModule.relativePath;
|
|
51
|
+
|
|
52
|
+
console.log(chalk.green(` ✓ Updated ${customModule.id}: ${customModule.relativePath} → ${absolutePath}`));
|
|
53
|
+
updated = true;
|
|
54
|
+
} else if (customModule.sourcePath && !path.isAbsolute(customModule.sourcePath)) {
|
|
55
|
+
// Source path exists but is not absolute
|
|
56
|
+
const absolutePath = path.resolve(customModule.sourcePath);
|
|
57
|
+
customModule.sourcePath = absolutePath;
|
|
58
|
+
|
|
59
|
+
console.log(chalk.green(` ✓ Updated ${customModule.id}: ${customModule.sourcePath} → ${absolutePath}`));
|
|
60
|
+
updated = true;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
if (updated) {
|
|
65
|
+
// Write back the updated manifest
|
|
66
|
+
const yamlStr = yaml.dump(manifest, {
|
|
67
|
+
indent: 2,
|
|
68
|
+
lineWidth: -1,
|
|
69
|
+
noRefs: true,
|
|
70
|
+
sortKeys: false,
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
await fs.writeFile(manifestPath, yamlStr);
|
|
74
|
+
console.log(chalk.green(' Manifest updated successfully'));
|
|
75
|
+
} else {
|
|
76
|
+
console.log(chalk.dim(' All paths already absolute'));
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
return updated;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Main migration function
|
|
84
|
+
*/
|
|
85
|
+
async function migrate(directory) {
|
|
86
|
+
const projectRoot = path.resolve(directory || process.cwd());
|
|
87
|
+
const bmadDir = findBmadDir(projectRoot);
|
|
88
|
+
|
|
89
|
+
if (!bmadDir) {
|
|
90
|
+
console.error(chalk.red('✗ No BMAD installation found in directory'));
|
|
91
|
+
process.exit(1);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
console.log(chalk.blue.bold('🔄 BMAD Custom Module Path Migration'));
|
|
95
|
+
console.log(chalk.dim(`Project: ${projectRoot}`));
|
|
96
|
+
console.log(chalk.dim(`BMAD Directory: ${bmadDir}`));
|
|
97
|
+
|
|
98
|
+
const manifestPath = path.join(bmadDir, '_cfg', 'manifest.yaml');
|
|
99
|
+
|
|
100
|
+
if (!fs.existsSync(manifestPath)) {
|
|
101
|
+
console.error(chalk.red('✗ No manifest.yaml found'));
|
|
102
|
+
process.exit(1);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
const updated = await updateManifest(manifestPath, projectRoot);
|
|
106
|
+
|
|
107
|
+
if (updated) {
|
|
108
|
+
console.log(chalk.green.bold('\n✨ Migration completed successfully!'));
|
|
109
|
+
console.log(chalk.dim('Custom modules now use absolute source paths.'));
|
|
110
|
+
} else {
|
|
111
|
+
console.log(chalk.yellow('\n⚠ No migration needed - paths already absolute'));
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// Run migration if called directly
|
|
116
|
+
if (require.main === module) {
|
|
117
|
+
const directory = process.argv[2];
|
|
118
|
+
migrate(directory).catch((error) => {
|
|
119
|
+
console.error(chalk.red('\n✗ Migration failed:'), error.message);
|
|
120
|
+
process.exit(1);
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
module.exports = { migrate };
|
|
Binary file
|
|
@@ -1,137 +0,0 @@
|
|
|
1
|
-
# Custom Agent Installation
|
|
2
|
-
|
|
3
|
-
BMAD agents and workflows are now installed through the main CLI installer using a `custom.yaml` configuration file or by having an installer file.
|
|
4
|
-
|
|
5
|
-
## Quick Start
|
|
6
|
-
|
|
7
|
-
Create a `custom.yaml` file in the root of your agent/workflow folder:
|
|
8
|
-
|
|
9
|
-
```yaml
|
|
10
|
-
code: my-custom-agent
|
|
11
|
-
name: 'My Custom Agent'
|
|
12
|
-
default_selected: true
|
|
13
|
-
```
|
|
14
|
-
|
|
15
|
-
Then run the BMAD installer from your project directory:
|
|
16
|
-
|
|
17
|
-
```bash
|
|
18
|
-
npx bmad-method install
|
|
19
|
-
```
|
|
20
|
-
|
|
21
|
-
Or if you have bmad-cli installed globally:
|
|
22
|
-
|
|
23
|
-
```bash
|
|
24
|
-
bmad install
|
|
25
|
-
```
|
|
26
|
-
|
|
27
|
-
## Installation Methods
|
|
28
|
-
|
|
29
|
-
### Method 1: Stand-alone Folder with custom.yaml
|
|
30
|
-
|
|
31
|
-
Place your agent or workflow in a folder with a `custom.yaml` file at the root:
|
|
32
|
-
|
|
33
|
-
```
|
|
34
|
-
my-agent/
|
|
35
|
-
├── custom.yaml # Required configuration file
|
|
36
|
-
├── my-agent.agent.yaml
|
|
37
|
-
└── sidecar/ # Optional
|
|
38
|
-
└── instructions.md
|
|
39
|
-
```
|
|
40
|
-
|
|
41
|
-
### Method 2: Installer File
|
|
42
|
-
|
|
43
|
-
For more complex installations, include an `installer.js` or `installer.yaml` file in your agent/workflow folder:
|
|
44
|
-
|
|
45
|
-
```
|
|
46
|
-
my-workflow/
|
|
47
|
-
├── workflow.md
|
|
48
|
-
└── installer.yaml # Custom installation logic
|
|
49
|
-
```
|
|
50
|
-
|
|
51
|
-
## What It Does
|
|
52
|
-
|
|
53
|
-
1. **Discovers** available agents and workflows from folders with `custom.yaml`
|
|
54
|
-
2. **Installs** to your project's `.bmad/custom/` directory
|
|
55
|
-
3. **Creates** IDE commands for all your configured IDEs (Claude Code, Codex, Cursor, etc.)
|
|
56
|
-
4. **Registers** the agent/workflow in the BMAD system
|
|
57
|
-
|
|
58
|
-
## Example custom.yaml
|
|
59
|
-
|
|
60
|
-
```yaml
|
|
61
|
-
code: my-custom-agent
|
|
62
|
-
name: 'My Custom Agent'
|
|
63
|
-
default_selected: true
|
|
64
|
-
```
|
|
65
|
-
|
|
66
|
-
## Installing Reference Agents
|
|
67
|
-
|
|
68
|
-
The BMAD source includes example agents you can install. **You must copy them to your project first.**
|
|
69
|
-
|
|
70
|
-
### Step 1: Copy the Agent Template
|
|
71
|
-
|
|
72
|
-
**For simple agents** (single file):
|
|
73
|
-
|
|
74
|
-
```bash
|
|
75
|
-
# From your project root
|
|
76
|
-
mkdir -p .bmad/custom/agents/my-agent
|
|
77
|
-
cp node_modules/bmad-method/src/modules/bmb/reference/agents/stand-alone/commit-poet.agent.yaml \
|
|
78
|
-
.bmad/custom/agents/my-agent/
|
|
79
|
-
```
|
|
80
|
-
|
|
81
|
-
**For expert agents** (folder with sidecar files):
|
|
82
|
-
|
|
83
|
-
```bash
|
|
84
|
-
# Copy the entire folder
|
|
85
|
-
cp -r node_modules/bmad-method/src/modules/bmb/reference/agents/agent-with-memory/journal-keeper \
|
|
86
|
-
.bmad/custom/agents/
|
|
87
|
-
```
|
|
88
|
-
|
|
89
|
-
### Step 2: Create custom.yaml
|
|
90
|
-
|
|
91
|
-
```bash
|
|
92
|
-
# In the agent folder, create custom.yaml
|
|
93
|
-
cat > .bmad/custom/agents/my-agent/custom.yaml << EOF
|
|
94
|
-
code: my-agent
|
|
95
|
-
name: "My Custom Agent"
|
|
96
|
-
default_selected: true
|
|
97
|
-
EOF
|
|
98
|
-
```
|
|
99
|
-
|
|
100
|
-
### Step 3: Install
|
|
101
|
-
|
|
102
|
-
```bash
|
|
103
|
-
npx bmad-method install
|
|
104
|
-
# or: bmad install (if BMAD installed locally)
|
|
105
|
-
```
|
|
106
|
-
|
|
107
|
-
The installer will:
|
|
108
|
-
|
|
109
|
-
1. Find the agent with its `custom.yaml`
|
|
110
|
-
2. Install it to the appropriate location
|
|
111
|
-
3. Create IDE commands for immediate use
|
|
112
|
-
|
|
113
|
-
### Available Reference Agents
|
|
114
|
-
|
|
115
|
-
**Simple (standalone file):**
|
|
116
|
-
|
|
117
|
-
- `commit-poet.agent.yaml` - Commit message artisan with style preferences
|
|
118
|
-
|
|
119
|
-
**Expert (folder with sidecar):**
|
|
120
|
-
|
|
121
|
-
- `journal-keeper/` - Personal journal companion with memory and pattern recognition
|
|
122
|
-
|
|
123
|
-
Find these in the BMAD source:
|
|
124
|
-
|
|
125
|
-
```
|
|
126
|
-
src/modules/bmb/reference/agents/
|
|
127
|
-
├── stand-alone/
|
|
128
|
-
│ └── commit-poet.agent.yaml
|
|
129
|
-
└── agent-with-memory/
|
|
130
|
-
└── journal-keeper/
|
|
131
|
-
├── journal-keeper.agent.yaml
|
|
132
|
-
└── journal-keeper-sidecar/
|
|
133
|
-
```
|
|
134
|
-
|
|
135
|
-
## Creating Your Own
|
|
136
|
-
|
|
137
|
-
Use the BMB agent builder to craft your agents. Once ready to use, place your `.agent.yaml` files or folders with `custom.yaml` in `.bmad/custom/agents/` or `.bmad/custom/workflows/`.
|