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.
Files changed (79) hide show
  1. package/.coderabbit.yaml +36 -0
  2. package/{CODE_OF_CONDUCT.md → .github/CODE_OF_CONDUCT.md} +4 -4
  3. package/CHANGELOG.md +136 -408
  4. package/README.md +4 -1
  5. package/docs/custom-content-installation.md +245 -0
  6. package/docs/index.md +2 -2
  7. package/docs/installers-bundlers/installers-modules-platforms-reference.md +6 -5
  8. package/docs/web-bundles-gemini-gpt-guide.md +1 -1
  9. package/example-custom-content/README.md +4 -0
  10. package/example-custom-content/agents/commit-poet/commit-poet.agent.yaml +1 -1
  11. package/example-custom-content/agents/toolsmith/toolsmith-sidecar/instructions.md +1 -1
  12. package/example-custom-content/agents/toolsmith/toolsmith-sidecar/knowledge/docs.md +1 -1
  13. package/example-custom-content/agents/toolsmith/toolsmith-sidecar/knowledge/installers.md +1 -1
  14. package/example-custom-content/agents/toolsmith/toolsmith-sidecar/knowledge/modules.md +2 -2
  15. package/example-custom-content/agents/toolsmith/toolsmith.agent.yaml +1 -1
  16. package/example-custom-content/{custom.yaml → module.yaml} +1 -0
  17. package/example-custom-content/workflows/quiz-master/steps/step-01-init.md +2 -2
  18. package/example-custom-content/workflows/quiz-master/steps/step-02-q1.md +1 -1
  19. package/example-custom-content/workflows/quiz-master/steps/step-03-q2.md +1 -1
  20. package/example-custom-content/workflows/quiz-master/steps/step-04-q3.md +1 -1
  21. package/example-custom-content/workflows/quiz-master/steps/step-05-q4.md +1 -1
  22. package/example-custom-content/workflows/quiz-master/steps/step-06-q5.md +1 -1
  23. package/example-custom-content/workflows/quiz-master/steps/step-07-q6.md +1 -1
  24. package/example-custom-content/workflows/quiz-master/steps/step-08-q7.md +1 -1
  25. package/example-custom-content/workflows/quiz-master/steps/step-09-q8.md +1 -1
  26. package/example-custom-content/workflows/quiz-master/steps/step-10-q9.md +1 -1
  27. package/example-custom-content/workflows/quiz-master/steps/step-11-q10.md +1 -1
  28. package/example-custom-content/workflows/quiz-master/steps/step-12-results.md +1 -1
  29. package/example-custom-content/workflows/quiz-master/workflow.md +1 -1
  30. package/example-custom-module/mwm/README.md +5 -0
  31. package/example-custom-module/mwm/agents/cbt-coach/cbt-coach.agent.yaml +1 -0
  32. package/example-custom-module/mwm/agents/crisis-navigator.agent.yaml +3 -2
  33. package/example-custom-module/mwm/agents/meditation-guide.agent.yaml +3 -2
  34. package/example-custom-module/mwm/agents/wellness-companion/wellness-companion.agent.yaml +1 -0
  35. package/example-custom-module/mwm/{_module-installer/install-config.yaml → module.yaml} +1 -0
  36. package/package.json +1 -1
  37. package/src/core/_module-installer/installer.js +1 -1
  38. package/src/modules/bmb/_module-installer/installer.js +1 -1
  39. package/src/modules/bmb/docs/agents/index.md +1 -1
  40. package/src/modules/bmb/workflows/create-module/steps/step-04-structure.md +3 -3
  41. package/src/modules/bmb/workflows/create-module/steps/step-05-config.md +1 -1
  42. package/src/modules/bmb/workflows/create-module/steps/step-08-installer.md +8 -8
  43. package/src/modules/bmb/workflows/create-module/steps/step-09-documentation.md +2 -1
  44. package/src/modules/bmb/workflows/create-module/steps/step-10-roadmap.md +3 -2
  45. package/src/modules/bmb/workflows/create-module/steps/step-11-validate.md +3 -3
  46. package/src/modules/bmb/workflows/create-module/templates/installer.template.js +1 -1
  47. package/src/modules/bmb/workflows/create-module/validation.md +3 -3
  48. package/src/modules/bmb/workflows/create-workflow/steps/step-01-init.md +1 -1
  49. package/src/modules/bmb/workflows/create-workflow/steps/step-07-build.md +1 -1
  50. package/src/modules/bmgd/README.md +2 -1
  51. package/src/modules/bmm/_module-installer/installer.js +1 -1
  52. package/src/modules/bmm/_module-installer/platform-specifics/claude-code.js +1 -1
  53. package/src/modules/bmm/_module-installer/platform-specifics/windsurf.js +1 -1
  54. package/src/modules/cis/_module-installer/installer.js +1 -1
  55. package/tools/cli/README.md +4 -4
  56. package/tools/cli/installers/lib/core/config-collector.js +16 -8
  57. package/tools/cli/installers/lib/core/custom-module-cache.js +239 -0
  58. package/tools/cli/installers/lib/core/detector.js +8 -4
  59. package/tools/cli/installers/lib/core/installer.js +815 -23
  60. package/tools/cli/installers/lib/core/manifest-generator.js +176 -13
  61. package/tools/cli/installers/lib/core/manifest.js +47 -0
  62. package/tools/cli/installers/lib/custom/handler.js +150 -20
  63. package/tools/cli/installers/lib/modules/manager.js +78 -32
  64. package/tools/cli/lib/agent/compiler.js +3 -11
  65. package/tools/cli/lib/agent/installer.js +2 -1
  66. package/tools/cli/lib/cli-utils.js +21 -4
  67. package/tools/cli/lib/ui.js +499 -11
  68. package/tools/maintainer/review-pr-README.md +55 -0
  69. package/tools/maintainer/review-pr.md +242 -0
  70. package/tools/migrate-custom-module-paths.js +124 -0
  71. package/bmad-method-6.0.0-alpha.14.tgz +0 -0
  72. package/docs/custom-agent-installation.md +0 -137
  73. package/example-custom-content/workflows/quiz-master/workflow-plan-quiz-master.md +0 -269
  74. /package/src/core/{_module-installer/install-config.yaml → module.yaml} +0 -0
  75. /package/src/modules/bmb/{_module-installer/install-config.yaml → module.yaml} +0 -0
  76. /package/src/modules/bmb/workflows/create-module/templates/{install-config.template.yaml → module.template.yaml} +0 -0
  77. /package/src/modules/bmgd/{_module-installer/install-config.yaml → module.yaml} +0 -0
  78. /package/src/modules/bmm/{_module-installer/install-config.yaml → module.yaml} +0 -0
  79. /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/`.