bmad-method 6.7.1-next.7 → 6.7.1-next.8
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/README.md +5 -3
- package/package.json +1 -1
- package/tools/bundle-web-bundles.js +117 -0
- package/tools/installer/modules/custom-module-manager.js +91 -2
- package/web-bundles/README.md +27 -21
- package/web-bundles/bundles.json +139 -0
package/README.md
CHANGED
|
@@ -79,11 +79,13 @@ BMad Method extends with official modules for specialized domains. Available dur
|
|
|
79
79
|
|
|
80
80
|
## Web Bundles
|
|
81
81
|
|
|
82
|
-
V4 shipped web bundles. V6 brings them back, new and improved.
|
|
82
|
+
V4 shipped web bundles. V6 brings them back, new and improved.
|
|
83
83
|
|
|
84
|
-
Web bundles package selected BMad skills for installation as **Google Gemini Gems** and **ChatGPT Custom GPTs**. Use them to do the upfront planning work (brainstorming, product briefs, PRDs, PRFAQs, UX specs, market and industry research) in your web LLM subscription, then bring the polished artifacts into your IDE for implementation. Planning runs on a flat-rate subscription instead of metered IDE tokens, which is a meaningful cost saver on longer engagements.
|
|
84
|
+
Web bundles package selected BMad skills for installation as **Google Gemini Gems** and **ChatGPT Custom GPTs**. Use them to do the upfront planning work (brainstorming, product briefs, PRDs, PRFAQs, UX specs, market and industry research) in your web LLM subscription, then bring the polished artifacts into your IDE for implementation. Planning runs on a flat-rate subscription instead of metered IDE tokens, which is a meaningful cost saver on longer engagements. Choose the best model available to you in Gemini or ChatGPT.
|
|
85
85
|
|
|
86
|
-
Current shelf: brainstorming, product brief, PRFAQ, PRD, UX, market & industry research.
|
|
86
|
+
Current shelf: brainstorming, product brief, PRFAQ, PRD, UX, market & industry research.
|
|
87
|
+
|
|
88
|
+
**Browse and install at [bmadcode.com/web-bundles](https://bmadcode.com/web-bundles/)**. One card per bundle, inline install steps for Gemini and ChatGPT, one-click ZIP download. See [the web bundles guide](https://docs.bmad-method.org/explanation/web-bundles/) for the concept.
|
|
87
89
|
|
|
88
90
|
## Documentation
|
|
89
91
|
|
package/package.json
CHANGED
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Web Bundle Release Packager
|
|
3
|
+
*
|
|
4
|
+
* Zips each bundle under web-bundles/ into dist/web-bundles/{slug}.zip
|
|
5
|
+
* for attachment to a GitHub Release.
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* node tools/bundle-web-bundles.js
|
|
9
|
+
*
|
|
10
|
+
* After running, the script prints the exact `gh release create` command
|
|
11
|
+
* (with the correct tag from bundles.json) for you to copy.
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
const fs = require('node:fs');
|
|
15
|
+
const path = require('node:path');
|
|
16
|
+
const { execSync, execFileSync } = require('node:child_process');
|
|
17
|
+
|
|
18
|
+
const REPO_ROOT = path.resolve(__dirname, '..');
|
|
19
|
+
const BUNDLES_DIR = path.join(REPO_ROOT, 'web-bundles');
|
|
20
|
+
const DIST_DIR = path.join(REPO_ROOT, 'dist', 'web-bundles');
|
|
21
|
+
const MANIFEST = path.join(BUNDLES_DIR, 'bundles.json');
|
|
22
|
+
const SLUG_RE = /^[a-z0-9][a-z0-9-]*$/;
|
|
23
|
+
|
|
24
|
+
function fail(msg) {
|
|
25
|
+
console.error(`[ERROR] ${msg}`);
|
|
26
|
+
process.exit(1);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
function requireZipCli() {
|
|
30
|
+
try {
|
|
31
|
+
execSync('zip -v', { stdio: 'ignore' });
|
|
32
|
+
} catch {
|
|
33
|
+
fail("'zip' CLI not found on PATH. Install zip (macOS: preinstalled; Debian/Ubuntu: apt install zip; Alpine: apk add zip) and re-run.");
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
function loadManifest() {
|
|
38
|
+
if (!fs.existsSync(MANIFEST)) {
|
|
39
|
+
fail(`bundles.json not found at ${MANIFEST}`);
|
|
40
|
+
}
|
|
41
|
+
let manifest;
|
|
42
|
+
try {
|
|
43
|
+
manifest = JSON.parse(fs.readFileSync(MANIFEST, 'utf-8'));
|
|
44
|
+
} catch (error) {
|
|
45
|
+
fail(`bundles.json is not valid JSON: ${error.message}`);
|
|
46
|
+
}
|
|
47
|
+
if (!Array.isArray(manifest.bundles) || manifest.bundles.length === 0) {
|
|
48
|
+
fail('bundles.json is missing a non-empty "bundles" array.');
|
|
49
|
+
}
|
|
50
|
+
if (typeof manifest.releaseTag !== 'string' || !manifest.releaseTag) {
|
|
51
|
+
fail('bundles.json is missing "releaseTag".');
|
|
52
|
+
}
|
|
53
|
+
return manifest;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function main() {
|
|
57
|
+
requireZipCli();
|
|
58
|
+
const manifest = loadManifest();
|
|
59
|
+
const releaseTag = manifest.releaseTag;
|
|
60
|
+
|
|
61
|
+
fs.mkdirSync(DIST_DIR, { recursive: true });
|
|
62
|
+
|
|
63
|
+
console.log(`Packaging ${manifest.bundles.length} bundles for release ${releaseTag}\n`);
|
|
64
|
+
|
|
65
|
+
const zipped = [];
|
|
66
|
+
const missing = [];
|
|
67
|
+
const invalid = [];
|
|
68
|
+
for (const bundle of manifest.bundles) {
|
|
69
|
+
if (!bundle.slug || !SLUG_RE.test(bundle.slug)) {
|
|
70
|
+
invalid.push(bundle.slug || '(no slug)');
|
|
71
|
+
console.error(` [INVALID] slug must match ${SLUG_RE} — got: ${bundle.slug}`);
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
74
|
+
const src = path.join(BUNDLES_DIR, bundle.slug);
|
|
75
|
+
if (!fs.existsSync(src)) {
|
|
76
|
+
missing.push(bundle.slug);
|
|
77
|
+
console.error(` [MISSING] ${bundle.slug} — directory not found`);
|
|
78
|
+
continue;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
const out = path.join(DIST_DIR, `${bundle.slug}.zip`);
|
|
82
|
+
if (fs.existsSync(out)) fs.unlinkSync(out);
|
|
83
|
+
|
|
84
|
+
try {
|
|
85
|
+
execFileSync('zip', ['-r', '-X', '-q', out, bundle.slug, '-x', '*.DS_Store'], {
|
|
86
|
+
cwd: BUNDLES_DIR,
|
|
87
|
+
stdio: 'inherit',
|
|
88
|
+
});
|
|
89
|
+
} catch (error) {
|
|
90
|
+
fail(`zip failed for ${bundle.slug}: ${error.message}`);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
const size = (fs.statSync(out).size / 1024).toFixed(1);
|
|
94
|
+
console.log(` [OK] ${bundle.slug}.zip (${size} KB)`);
|
|
95
|
+
zipped.push(bundle.slug);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
if (invalid.length > 0) {
|
|
99
|
+
fail(`Refusing to publish: ${invalid.length} bundle(s) have invalid slugs: ${invalid.join(', ')}`);
|
|
100
|
+
}
|
|
101
|
+
if (missing.length > 0) {
|
|
102
|
+
fail(`Refusing to publish an incomplete release: missing directories for ${missing.join(', ')}`);
|
|
103
|
+
}
|
|
104
|
+
if (zipped.length === 0) {
|
|
105
|
+
fail('No bundles were packaged. Check bundles.json against web-bundles/ subdirectories.');
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
console.log(`\nWrote ${zipped.length} bundles to ${path.relative(REPO_ROOT, DIST_DIR)}/`);
|
|
109
|
+
console.log('\nNext step — create or update the GitHub Release:\n');
|
|
110
|
+
console.log(` gh release create ${releaseTag} dist/web-bundles/*.zip \\`);
|
|
111
|
+
console.log(` --title "${releaseTag}" \\`);
|
|
112
|
+
console.log(` --notes "BMad web bundles for Gemini Gems and ChatGPT Custom GPTs. See https://bmadcode.com/web-bundles/"\n`);
|
|
113
|
+
console.log('Or, to refresh an existing release:\n');
|
|
114
|
+
console.log(` gh release upload ${releaseTag} dist/web-bundles/*.zip --clobber\n`);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
main();
|
|
@@ -19,6 +19,10 @@ function quoteCustomRef(ref) {
|
|
|
19
19
|
class CustomModuleManager {
|
|
20
20
|
/** @type {Map<string, Object>} Shared across all instances: module code -> ResolvedModule */
|
|
21
21
|
static _resolutionCache = new Map();
|
|
22
|
+
/** @type {Set<string>} Repo roots refreshed in the current process (dedupe quick-update fetches). */
|
|
23
|
+
static _refreshedRepoPaths = new Set();
|
|
24
|
+
/** @type {Map<string, Promise<void>>} In-flight refresh operations keyed by repo path. */
|
|
25
|
+
static _refreshInFlight = new Map();
|
|
22
26
|
|
|
23
27
|
// ─── Source Parsing ───────────────────────────────────────────────────────
|
|
24
28
|
|
|
@@ -431,8 +435,12 @@ class CustomModuleManager {
|
|
|
431
435
|
}
|
|
432
436
|
fetchSpinner.stop(`Updated ${displayName}`);
|
|
433
437
|
} catch {
|
|
434
|
-
|
|
435
|
-
|
|
438
|
+
// Fetch failed against an existing cache — most often the remote is
|
|
439
|
+
// unreachable (network down, repo deleted/moved, auth revoked).
|
|
440
|
+
// Preserve the previous clone so re-deploy still works from cached
|
|
441
|
+
// content; surface a warning so the user knows the cache is stale.
|
|
442
|
+
fetchSpinner.error(`Could not refresh ${displayName} — keeping cached copy`);
|
|
443
|
+
await prompts.log.warn(`Custom module ${displayName} was not refreshed (remote unreachable). Using cached copy.`);
|
|
436
444
|
}
|
|
437
445
|
}
|
|
438
446
|
|
|
@@ -466,6 +474,32 @@ class CustomModuleManager {
|
|
|
466
474
|
} catch {
|
|
467
475
|
// swallow — a non-git repo (local path) wouldn't reach here anyway
|
|
468
476
|
}
|
|
477
|
+
// Best-effort: capture the remote default branch name so channel marker
|
|
478
|
+
// metadata for "next" reflects the actual tracked ref (not always "main").
|
|
479
|
+
let defaultRef = 'main';
|
|
480
|
+
if (!effectiveVersion) {
|
|
481
|
+
try {
|
|
482
|
+
const symbolic = execSync('git symbolic-ref --short refs/remotes/origin/HEAD', {
|
|
483
|
+
cwd: repoCacheDir,
|
|
484
|
+
stdio: 'pipe',
|
|
485
|
+
})
|
|
486
|
+
.toString()
|
|
487
|
+
.trim();
|
|
488
|
+
if (symbolic.startsWith('origin/')) {
|
|
489
|
+
defaultRef = symbolic.slice('origin/'.length) || defaultRef;
|
|
490
|
+
}
|
|
491
|
+
} catch {
|
|
492
|
+
// Fallback to previous marker value when symbolic ref is unavailable.
|
|
493
|
+
try {
|
|
494
|
+
const existingMarker = await fs.readJson(path.join(repoCacheDir, '.bmad-channel.json'));
|
|
495
|
+
if (existingMarker?.channel === 'next' && typeof existingMarker.version === 'string' && existingMarker.version.trim()) {
|
|
496
|
+
defaultRef = existingMarker.version.trim();
|
|
497
|
+
}
|
|
498
|
+
} catch {
|
|
499
|
+
// Keep default fallback.
|
|
500
|
+
}
|
|
501
|
+
}
|
|
502
|
+
}
|
|
469
503
|
|
|
470
504
|
// Write source metadata for later URL reconstruction
|
|
471
505
|
const metadataPath = path.join(repoCacheDir, '.bmad-source.json');
|
|
@@ -478,6 +512,15 @@ class CustomModuleManager {
|
|
|
478
512
|
sha: resolvedSha,
|
|
479
513
|
clonedAt: new Date().toISOString(),
|
|
480
514
|
});
|
|
515
|
+
// Keep a channel marker in custom cache too so update paths that rely on
|
|
516
|
+
// channel metadata (same as official-module cache) can treat this clone as
|
|
517
|
+
// refreshable. URL + no explicit ref => next, explicit ref => pinned.
|
|
518
|
+
await fs.writeJson(path.join(repoCacheDir, '.bmad-channel.json'), {
|
|
519
|
+
channel: effectiveVersion ? 'pinned' : 'next',
|
|
520
|
+
version: effectiveVersion || defaultRef,
|
|
521
|
+
sha: resolvedSha,
|
|
522
|
+
writtenAt: new Date().toISOString(),
|
|
523
|
+
});
|
|
481
524
|
|
|
482
525
|
// Install dependencies if package.json exists (skip during browsing/analysis)
|
|
483
526
|
const packageJsonPath = path.join(repoCacheDir, 'package.json');
|
|
@@ -642,6 +685,13 @@ class CustomModuleManager {
|
|
|
642
685
|
const repoRoots = await this._findCacheRepoRoots(cacheDir);
|
|
643
686
|
|
|
644
687
|
for (const { repoPath, metadata } of repoRoots) {
|
|
688
|
+
// Quick-update path: refresh URL-backed cached repos before reading
|
|
689
|
+
// files from them so re-deploy uses latest commits for `next` and
|
|
690
|
+
// the pinned ref for `pinned`.
|
|
691
|
+
if (options.bmadDir && metadata?.rawInput) {
|
|
692
|
+
await this._refreshRepoCacheOnce(repoPath, metadata);
|
|
693
|
+
}
|
|
694
|
+
|
|
645
695
|
// Check marketplace.json for matching module code
|
|
646
696
|
const marketplacePath = path.join(repoPath, '.claude-plugin', 'marketplace.json');
|
|
647
697
|
if (!(await fs.pathExists(marketplacePath))) continue;
|
|
@@ -692,6 +742,45 @@ class CustomModuleManager {
|
|
|
692
742
|
return this._findLocalSourceFromManifest(moduleCode, options);
|
|
693
743
|
}
|
|
694
744
|
|
|
745
|
+
/**
|
|
746
|
+
* Refresh one cached repo at most once per process with in-flight dedupe.
|
|
747
|
+
* Prevents concurrent quick-update callers from racing the same cache path.
|
|
748
|
+
* @param {string} repoPath - Absolute cache repo path
|
|
749
|
+
* @param {Object} metadata - Parsed .bmad-source.json metadata
|
|
750
|
+
*/
|
|
751
|
+
async _refreshRepoCacheOnce(repoPath, metadata) {
|
|
752
|
+
if (CustomModuleManager._refreshedRepoPaths.has(repoPath)) return;
|
|
753
|
+
|
|
754
|
+
const existing = CustomModuleManager._refreshInFlight.get(repoPath);
|
|
755
|
+
if (existing) {
|
|
756
|
+
await existing;
|
|
757
|
+
return;
|
|
758
|
+
}
|
|
759
|
+
|
|
760
|
+
const refreshPromise = (async () => {
|
|
761
|
+
try {
|
|
762
|
+
await this.cloneRepo(metadata.rawInput, {
|
|
763
|
+
silent: true,
|
|
764
|
+
pinOverride: metadata.version || undefined,
|
|
765
|
+
});
|
|
766
|
+
CustomModuleManager._refreshedRepoPaths.add(repoPath);
|
|
767
|
+
} catch (error_) {
|
|
768
|
+
// cloneRepo only throws here for unrecoverable cases (no cache present
|
|
769
|
+
// and a fresh clone failed, or an unexpected internal error). The
|
|
770
|
+
// common "remote unreachable but cache exists" case is handled inside
|
|
771
|
+
// cloneRepo, which preserves the clone and returns normally. Reaching
|
|
772
|
+
// this catch means we have no usable cache — surface a warning so the
|
|
773
|
+
// failure isn't silent.
|
|
774
|
+
await prompts.log.warn(`Refresh of cached custom module at ${path.basename(repoPath)} failed: ${error_?.message || error_}`);
|
|
775
|
+
} finally {
|
|
776
|
+
CustomModuleManager._refreshInFlight.delete(repoPath);
|
|
777
|
+
}
|
|
778
|
+
})();
|
|
779
|
+
|
|
780
|
+
CustomModuleManager._refreshInFlight.set(repoPath, refreshPromise);
|
|
781
|
+
await refreshPromise;
|
|
782
|
+
}
|
|
783
|
+
|
|
695
784
|
/**
|
|
696
785
|
* Check the installation manifest for a localPath entry for this module.
|
|
697
786
|
* Used as fallback when the module was installed from a local source (no cache entry).
|
package/web-bundles/README.md
CHANGED
|
@@ -2,39 +2,45 @@
|
|
|
2
2
|
|
|
3
3
|
V4 shipped web bundles. V6 brings them back, new and improved. Each bundle packages a BMad skill as a self-contained install for **Google Gemini Gems** and **ChatGPT Custom GPTs**, so you can run the planning work in your web LLM subscription before opening your IDE.
|
|
4
4
|
|
|
5
|
-
##
|
|
5
|
+
## Install
|
|
6
|
+
|
|
7
|
+
**Go to [bmadcode.com/web-bundles](https://bmadcode.com/web-bundles/).**
|
|
8
|
+
|
|
9
|
+
The site lists every bundle in a card grid, walks you through the Gemini and ChatGPT setup inline, and hands you the ZIP download in one click. That is the only supported install path.
|
|
10
|
+
|
|
11
|
+
Why a single front door:
|
|
12
|
+
|
|
13
|
+
- One place to keep install steps current as Gemini and ChatGPT evolve.
|
|
14
|
+
- Versioned releases. Every shelf update ships as a tagged GitHub Release; the site always points at the newest tag.
|
|
15
|
+
- One signup gets you on the list for new bundles as they ship.
|
|
16
|
+
|
|
17
|
+
## Why use them
|
|
6
18
|
|
|
7
19
|
- **Cost.** Web LLM subscriptions are flat-rate. Run brainstorming, briefs, PRDs, and research there instead of burning IDE tokens.
|
|
8
20
|
- **Right tool for the job.** Planning conversations want Canvas, image generation, and Deep Research. Implementation wants the codebase and a terminal. Use each where it's strongest.
|
|
9
|
-
- **Persona swapping.** Every bundle
|
|
21
|
+
- **Persona swapping.** Every bundle ships a default persona and a contrasting swap example. Change voices without touching the protocol.
|
|
10
22
|
|
|
11
23
|
## The shelf
|
|
12
24
|
|
|
13
25
|
| Bundle | Purpose |
|
|
14
26
|
| --- | --- |
|
|
15
|
-
|
|
|
16
|
-
|
|
|
17
|
-
|
|
|
18
|
-
|
|
|
19
|
-
|
|
|
20
|
-
|
|
|
27
|
+
| Brainstorming Coach | Facilitated ideation across 60 techniques. Defaults to **Carson** (Osborn lineage); swap to **Mary** for analyst rigor. |
|
|
28
|
+
| Product Brief Coach | Build a product brief through guided discovery. Create, Update, or Validate modes. |
|
|
29
|
+
| PRFAQ Coach | Working Backwards PRFAQ challenge (Bezos lineage) to forge and stress-test product concepts. |
|
|
30
|
+
| PRD Coach | Product Requirements Document with built-in validation (Cagan lineage). |
|
|
31
|
+
| UX Coach | UX patterns, flows, and design specifications. Pairs with Google Stitch. |
|
|
32
|
+
| Market & Industry Research | Market research, customer JTBD, competitive landscape, regulatory and technical lenses. Deep Research mode integrated. |
|
|
21
33
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
Each bundle has its own `INSTRUCTIONS.md` with platform-specific setup steps. Pattern is the same:
|
|
25
|
-
|
|
26
|
-
1. Create a Gem (Gemini) or Custom GPT (ChatGPT).
|
|
27
|
-
2. Upload the bundle's `SKILL.md` (and any data files) as knowledge.
|
|
28
|
-
3. Paste the block below the **PASTE BOUNDARY** into the instructions box.
|
|
29
|
-
4. Enable Web Browsing / Deep Research if the bundle's install steps call for it.
|
|
30
|
-
|
|
31
|
-
Gemini Gems require Gemini Advanced. ChatGPT Custom GPTs require Plus, Pro, Business, or Enterprise; Deep Research has its own plan limits.
|
|
34
|
+
Requires Gemini Advanced (for Gems) or ChatGPT Plus / Pro / Business / Enterprise (for Custom GPTs). Deep Research has its own plan limits.
|
|
32
35
|
|
|
33
36
|
## Build your own
|
|
34
37
|
|
|
35
38
|
Web bundles are generated from BMad skills using the [`bmad-os-skill-to-bundle`](https://github.com/bmad-code-org/bmad-utility-skills) utility skill. Point it at any BMad skill folder and it produces a `SKILL.md`, an `INSTRUCTIONS.md`, and any required data files, with persona inheritance from the owning agent.
|
|
36
39
|
|
|
37
|
-
##
|
|
40
|
+
## What's in this folder
|
|
41
|
+
|
|
42
|
+
This folder is the **source** for the shelf, packaged into ZIPs and attached to GitHub Releases. End users do not install from here. If you are a contributor working on a bundle, the bundle directories and `bundles.json` are the files you edit; the [release packager](../tools/bundle-web-bundles.js) zips them and updates the release.
|
|
43
|
+
|
|
44
|
+
## Concept docs
|
|
38
45
|
|
|
39
|
-
|
|
40
|
-
- [How to install a web bundle](https://docs.bmad-method.org/how-to/use-web-bundles/)
|
|
46
|
+
[What web bundles are and when to use them](https://docs.bmad-method.org/explanation/web-bundles/).
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": "1.0",
|
|
3
|
+
"releaseTag": "web-bundles-v1.0.0",
|
|
4
|
+
"releasedAt": "2026-05-25",
|
|
5
|
+
"bundles": [
|
|
6
|
+
{
|
|
7
|
+
"slug": "brainstorming-coach",
|
|
8
|
+
"name": "Brainstorming Coach",
|
|
9
|
+
"tagline": "60 ideation techniques across 10 categories — from SCAMPER to Zombie Apocalypse Planning",
|
|
10
|
+
"description": "Sixty proven brainstorming techniques spanning structured frameworks (SCAMPER, Five Whys, First Principles), wild plays (Drunk History Retelling, Zombie Apocalypse Planning), biomimetic prompts (Nature's Solutions), introspective work (Shadow Work Mining, Values Archaeology), and quantum-flavored framings (Superposition Collapse). Pick a route — browse the library, get a recommendation, take a random surprise, or run a progressive divergence-to-action flow. The coach asks; you generate every idea. Targets ~100 ideas before organizing (the breakthroughs live past idea 20), then promotes the session into themes, a 2×2 prioritization, and a breakthrough collage in Canvas.",
|
|
11
|
+
"defaultPersona": {
|
|
12
|
+
"name": "Carson",
|
|
13
|
+
"title": "Elite Brainstorming Specialist",
|
|
14
|
+
"lineage": "Osborn lineage"
|
|
15
|
+
},
|
|
16
|
+
"swapPersona": {
|
|
17
|
+
"name": "Mary",
|
|
18
|
+
"title": "Strategic Business Analyst",
|
|
19
|
+
"lineage": "BMad analyst — research-first rigor"
|
|
20
|
+
},
|
|
21
|
+
"accentColor": "#3b82f6",
|
|
22
|
+
"motif": "constellation",
|
|
23
|
+
"knowledgeFiles": ["SKILL.md", "brain-methods.csv"],
|
|
24
|
+
"needsWebBrowsing": true,
|
|
25
|
+
"needsDeepResearch": false,
|
|
26
|
+
"stitchIntegration": false
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
"slug": "product-brief-coach",
|
|
30
|
+
"name": "Product Brief Coach",
|
|
31
|
+
"tagline": "Three modes (Create / Update / Validate), two paths (Fast / Coaching), one brief you're proud of",
|
|
32
|
+
"description": "Create a brief drawn out through real conversation. Update an existing brief against a change signal. Or Validate — honest critique against the brief's own purpose. Two working modes: Fast path batches the gaps into one or two consolidated questions and tags assumptions for you to fix in review (best for pitching tomorrow); Coaching path walks section by section, mirrors before pushing, names the assumption hiding under your confident sentence (best for the brief you want to be proud of). The coach refuses to invent moats, traction, or differentiation you didn't give it. Depth that doesn't fit the brief lands in an Addendum so nothing valuable gets lost. Length is whatever the product earns.",
|
|
33
|
+
"defaultPersona": {
|
|
34
|
+
"name": "Mary",
|
|
35
|
+
"title": "Strategic Business Analyst",
|
|
36
|
+
"lineage": "BMad analyst"
|
|
37
|
+
},
|
|
38
|
+
"swapPersona": {
|
|
39
|
+
"name": "Iris",
|
|
40
|
+
"title": "Senior Product Strategist",
|
|
41
|
+
"lineage": "Mirror-then-push, unhurried thinking-partner voice"
|
|
42
|
+
},
|
|
43
|
+
"accentColor": "#d4a853",
|
|
44
|
+
"motif": "single-page",
|
|
45
|
+
"knowledgeFiles": ["SKILL.md"],
|
|
46
|
+
"needsWebBrowsing": true,
|
|
47
|
+
"needsDeepResearch": false,
|
|
48
|
+
"stitchIntegration": false
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
"slug": "prfaq-coach",
|
|
52
|
+
"name": "PRFAQ Coach",
|
|
53
|
+
"tagline": "Amazon's Working Backwards as a forcing function — write the press release before you build",
|
|
54
|
+
"description": "Four stages of customer-first pressure: Ignition (specific customer, concrete problem, real stakes), Press Release (9 sections, each forcing a different clarity — headline, problem paragraph, solution paragraph, leader quote, customer quote, getting started), Customer FAQ (validate the value proposition from outside in), and Internal FAQ + Verdict (feasibility, trade-offs, what survived). Hardcore mode: weasel words like 'best-in-class', 'seamless', and 'revolutionary' get challenged on sight; if you lead with technology, the coach redirects to the customer's actual problem. Generates a hero image for the press release. Works for commercial products, internal tools, open source, and community initiatives — the structure stays, the language adapts.",
|
|
55
|
+
"defaultPersona": {
|
|
56
|
+
"name": "Mary",
|
|
57
|
+
"title": "Strategic Business Analyst",
|
|
58
|
+
"lineage": "BMad analyst"
|
|
59
|
+
},
|
|
60
|
+
"swapPersona": {
|
|
61
|
+
"name": "Bezos",
|
|
62
|
+
"title": "Working Backwards Coach",
|
|
63
|
+
"lineage": "Amazon discipline — direct, dry, customer-first"
|
|
64
|
+
},
|
|
65
|
+
"accentColor": "#dc2626",
|
|
66
|
+
"motif": "document-ribbon",
|
|
67
|
+
"knowledgeFiles": ["SKILL.md"],
|
|
68
|
+
"needsWebBrowsing": true,
|
|
69
|
+
"needsDeepResearch": false,
|
|
70
|
+
"stitchIntegration": false
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
"slug": "prd-coach",
|
|
74
|
+
"name": "PRD Coach",
|
|
75
|
+
"tagline": "PRD coaching with built-in validation — capabilities in the PRD, mechanism in the Addendum",
|
|
76
|
+
"description": "Three modes (Create / Update / Validate), two entry points (Vision + Features for enterprise and dev products, Journey-led for consumer and UX-heavy products). Captures named-protagonist user journeys ('Mary, mom of three, kids finally asleep') instead of abstract personas. Enforces glossary discipline: every domain noun defined once, used verbatim across FRs, UJs, and SMs. Maintains stable IDs (FR-1..N globally, success metrics paired with counter-metrics SM-C1..N). The 7-dimension validation rubric grades decision-readiness, substance over theater, strategic coherence, done-ness clarity, scope honesty, downstream usability, and shape fit, with each finding cited to a specific PRD location. Length scales with stakes — hobby PRDs hit two pages; launch PRDs run as long as the FRs require.",
|
|
77
|
+
"defaultPersona": {
|
|
78
|
+
"name": "John",
|
|
79
|
+
"title": "Product Manager",
|
|
80
|
+
"lineage": "BMad PM — Cagan lineage"
|
|
81
|
+
},
|
|
82
|
+
"swapPersona": {
|
|
83
|
+
"name": "Ezra",
|
|
84
|
+
"title": "Principal Product Manager",
|
|
85
|
+
"lineage": "Calmer, slower-tempo coaching"
|
|
86
|
+
},
|
|
87
|
+
"accentColor": "#6366f1",
|
|
88
|
+
"motif": "section-stack",
|
|
89
|
+
"knowledgeFiles": ["SKILL.md", "prd-template.md", "prd-validation-checklist.md"],
|
|
90
|
+
"needsWebBrowsing": true,
|
|
91
|
+
"needsDeepResearch": false,
|
|
92
|
+
"stitchIntegration": false
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
"slug": "ux-coach",
|
|
96
|
+
"name": "UX Coach",
|
|
97
|
+
"tagline": "Two spines engineering can build from — DESIGN.md + EXPERIENCE.md as the contract",
|
|
98
|
+
"description": "Don Norman's human-centered design as the operating method. The coach elicits your vision and never imposes its own — no colors, fonts, or layouts you didn't put on the table. Captures named-protagonist journeys ('Mary on her couch after the kids are asleep') as the unit of design thinking. Produces two spines: DESIGN.md for visual identity (tokens in YAML frontmatter), EXPERIENCE.md for information architecture, behavior, states, and accessibility. Spines win on conflict with any mock, wireframe, or Stitch output. Surface closure is the test: every stated need has a surface, every surface has a journey. Pairs with Google Stitch — the handoff produces a Stitch prompt you copy straight from Canvas to generate editable mockups.",
|
|
99
|
+
"defaultPersona": {
|
|
100
|
+
"name": "Sally",
|
|
101
|
+
"title": "UX Designer",
|
|
102
|
+
"lineage": "BMad UX designer"
|
|
103
|
+
},
|
|
104
|
+
"swapPersona": {
|
|
105
|
+
"name": "Kenji",
|
|
106
|
+
"title": "Principal Product Designer",
|
|
107
|
+
"lineage": "Rams restraint + Zhuo systems discipline"
|
|
108
|
+
},
|
|
109
|
+
"accentColor": "#10b981",
|
|
110
|
+
"motif": "nested-layers",
|
|
111
|
+
"knowledgeFiles": ["SKILL.md", "ux-validation.md"],
|
|
112
|
+
"needsWebBrowsing": true,
|
|
113
|
+
"needsDeepResearch": false,
|
|
114
|
+
"stitchIntegration": true
|
|
115
|
+
},
|
|
116
|
+
{
|
|
117
|
+
"slug": "market-and-industry-research",
|
|
118
|
+
"name": "Market & Industry Research",
|
|
119
|
+
"tagline": "Deep Research wrapped in a sharp brief — research as input to a decision, not a deliverable",
|
|
120
|
+
"description": "Built around platform Deep Research mode. The coach handles the conversation: scopes what you actually need, drafts a sharp Deep Research brief you copy directly into Gemini or ChatGPT, then ingests the report and shapes the deliverable around your decision or learning goal. Methodology anchors when they help: Michael Porter for competitive structure, Clayton Christensen for Jobs-to-be-Done. Six sections to mix and match — market dynamics, customer insights, competitive landscape, regulatory & compliance, technical & technology trends, strategic synthesis. Validates every numeric, regulatory, or competitive claim against a source and a date. Generic findings ('the market is growing') get pushed back to specifics ('which segment, what rate, citing whom'). The deliverable is the synthesis against your decision, not the research dump.",
|
|
121
|
+
"defaultPersona": {
|
|
122
|
+
"name": "Mary",
|
|
123
|
+
"title": "Strategic Business Analyst",
|
|
124
|
+
"lineage": "BMad analyst"
|
|
125
|
+
},
|
|
126
|
+
"swapPersona": {
|
|
127
|
+
"name": "Geoff",
|
|
128
|
+
"title": "Market Strategist",
|
|
129
|
+
"lineage": "Geoffrey Moore + April Dunford lineage"
|
|
130
|
+
},
|
|
131
|
+
"accentColor": "#f59e0b",
|
|
132
|
+
"motif": "positioning-rings",
|
|
133
|
+
"knowledgeFiles": ["SKILL.md"],
|
|
134
|
+
"needsWebBrowsing": true,
|
|
135
|
+
"needsDeepResearch": true,
|
|
136
|
+
"stitchIntegration": false
|
|
137
|
+
}
|
|
138
|
+
]
|
|
139
|
+
}
|