bmad-method 6.7.1-next.7 → 6.7.1-next.9

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 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. Find them in [`web-bundles/`](./web-bundles/).
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. Ensure that when using you choose the best model available to you in Gemini or ChatGPT.
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. Each bundle has its own `INSTRUCTIONS.md` to follow; the setup pattern is the same across the shelf (create a Gem or GPT, attach knowledge file(s) (bundle customized SKILL.md and additional content), paste the instructions block, save). See [the web bundles guide](https://docs.bmad-method.org/explanation/web-bundles/) for the concept and [the how-to](https://docs.bmad-method.org/how-to/use-web-bundles/) for setup details.
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
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://json.schemastore.org/package.json",
3
3
  "name": "bmad-method",
4
- "version": "6.7.1-next.7",
4
+ "version": "6.7.1-next.9",
5
5
  "description": "Breakthrough Method of Agile AI-driven Development",
6
6
  "keywords": [
7
7
  "agile",
@@ -10,7 +10,7 @@ description: 'Execute story implementation following a context filled story spec
10
10
  **Your Role:** Developer implementing the story.
11
11
  - Communicate all responses in {communication_language} and language MUST be tailored to {user_skill_level}
12
12
  - Generate all documents in {document_output_language}
13
- - Only modify the story file in these areas: Tasks/Subtasks checkboxes, Dev Agent Record (Debug Log, Completion Notes), File List, Change Log, and Status
13
+ - Only modify the story file in these areas: YAML frontmatter `baseline_commit`, Tasks/Subtasks checkboxes, Dev Agent Record (Debug Log, Completion Notes), File List, Change Log, and Status
14
14
  - Execute ALL steps in exact order; do NOT skip steps
15
15
  - Absolutely DO NOT stop because of "milestones", "significant progress", or "session boundaries". Continue in a single execution until the story is COMPLETE (all ACs satisfied and all tasks/subtasks checked) UNLESS a HALT condition is triggered or the USER gives other instruction.
16
16
  - Do NOT schedule a "next session" or request review pauses unless a HALT condition applies. Only Step 9 decides completion.
@@ -76,7 +76,7 @@ Activation is complete. If `activation_steps_prepend` or `activation_steps_appen
76
76
  <workflow>
77
77
  <critical>Communicate all responses in {communication_language} and language MUST be tailored to {user_skill_level}</critical>
78
78
  <critical>Generate all documents in {document_output_language}</critical>
79
- <critical>Only modify the story file in these areas: Tasks/Subtasks checkboxes, Dev Agent Record (Debug Log, Completion Notes), File List,
79
+ <critical>Only modify the story file in these areas: YAML frontmatter `baseline_commit`, Tasks/Subtasks checkboxes, Dev Agent Record (Debug Log, Completion Notes), File List,
80
80
  Change Log, and Status</critical>
81
81
  <critical>Execute ALL steps in exact order; do NOT skip steps</critical>
82
82
  <critical>Absolutely DO NOT stop because of "milestones", "significant progress", or "session boundaries". Continue in a single execution
@@ -261,26 +261,40 @@ Activation is complete. If `activation_steps_prepend` or `activation_steps_appen
261
261
  </step>
262
262
 
263
263
  <step n="4" goal="Mark story in-progress" tag="sprint-status">
264
+ <action>If story file YAML frontmatter already contains `baseline_commit`, preserve the existing value and do not overwrite it</action>
265
+
264
266
  <check if="{{sprint_status}} file exists">
265
267
  <action>Load the FULL file: {{sprint_status}}</action>
266
268
  <action>Read all development_status entries to find {{story_key}}</action>
267
- <action>Get current status value for development_status[{{story_key}}]</action>
269
+ <action>Set {{current_status}} to development_status[{{story_key}}]</action>
270
+ </check>
271
+
272
+ <check if="{{sprint_status}} file does NOT exist">
273
+ <action>Set {{current_status}} to the story file Status section value</action>
274
+ </check>
275
+
276
+ <check if="{{current_status}} == 'ready-for-dev' AND story file YAML frontmatter does NOT contain baseline_commit">
277
+ <action>Run `git rev-parse HEAD` to capture current commit into {{baseline_commit}}; if git/version control is unavailable, set {{baseline_commit}} = `NO_VCS`</action>
278
+ <action>If story file YAML frontmatter exists, add `baseline_commit: {{baseline_commit}}` to the frontmatter</action>
279
+ <action>If story file has no YAML frontmatter, create frontmatter at the top containing only `baseline_commit: {{baseline_commit}}`</action>
280
+ </check>
268
281
 
269
- <check if="current status == 'ready-for-dev' OR review_continuation == true">
282
+ <check if="{{sprint_status}} file exists">
283
+ <check if="{{current_status}} == 'ready-for-dev' OR (review_continuation == true AND {{current_status}} != 'in-progress')">
270
284
  <action>Update the story in the sprint status report to = "in-progress"</action>
271
285
  <action>Update last_updated field to current date</action>
272
286
  <output>🚀 Starting work on story {{story_key}}
273
- Status updated: ready-for-dev → in-progress
287
+ Status updated: {{current_status}} → in-progress
274
288
  </output>
275
289
  </check>
276
290
 
277
- <check if="current status == 'in-progress'">
291
+ <check if="{{current_status}} == 'in-progress'">
278
292
  <output>⏯️ Resuming work on story {{story_key}}
279
293
  Story is already marked in-progress
280
294
  </output>
281
295
  </check>
282
296
 
283
- <check if="current status is neither ready-for-dev nor in-progress">
297
+ <check if="{{current_status}} is neither ready-for-dev nor in-progress">
284
298
  <output>⚠️ Unexpected story status: {{current_status}}
285
299
  Expected ready-for-dev or in-progress. Continuing anyway...
286
300
  </output>
@@ -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
- fetchSpinner.error(`Update failed, re-downloading ${displayName}`);
435
- await fs.remove(repoCacheDir);
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).
@@ -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
- ## Why use these
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's `INSTRUCTIONS.md` carries a default persona and a contrasting swap example. Change voices without touching the protocol.
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
- | [`brainstorming-coach/`](./brainstorming-coach/) | Facilitated ideation across 60 techniques. Defaults to **Carson** (Osborn lineage); swap to **Mary** for analyst rigor. |
16
- | [`product-brief-coach/`](./product-brief-coach/) | Build a one-page product brief through guided discovery. |
17
- | [`prfaq-coach/`](./prfaq-coach/) | Working Backwards PRFAQ challenge (Bezos lineage) to forge and stress-test product concepts. |
18
- | [`prd-coach/`](./prd-coach/) | Product Requirements Document with built-in validation (Cagan lineage). |
19
- | [`ux-coach/`](./ux-coach/) | UX patterns, flows, and design specifications. |
20
- | [`market-and-industry-research/`](./market-and-industry-research/) | Market research, customer JTBD, competitive landscape, regulatory and technical lenses. Deep Research mode integrated. |
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
- ## Install
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
- ## Docs
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
- - [What web bundles are and when to use them](https://docs.bmad-method.org/explanation/web-bundles/)
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
+ }