Commit Graph

1936 Commits

Author SHA1 Message Date
pbean 1e4033fba8 Merge remote-tracking branch 'origin/main' into feat/bmad-marketplace-plugin 2026-06-09 12:12:22 -07:00
Aristo Rinjuang 397b2a5c87
feat: add CodeWhale as supported installer platform (#2459)
CodeWhale uses .codewhale/skills/ (project) and
~/.codewhale/skills/ (global) for skill directories,
matching the existing config-driven installer pattern.

- platform-codes.yaml: codewhale entry after codex
- test: Test 12b validates install target and setup
2026-06-08 22:29:35 -05:00
Oneby Wang 072d0a7458
fix(skills): renumber retrospective workflow steps (#2448)
Co-authored-by: Brian <bmadcode@gmail.com>
2026-06-06 20:37:51 -05:00
Emmanuel Atsé 717a84f2e8
docs(fr): sync French docs with latest English source + fix non-ASCII anchor validation (#2408)
* docs(fr): translation of install-custom-modules

Reference commit 97d32405

* docs(fr): refinement of forensic-investigation

* docs(fr): translation of customize-bmad TOML customization rewrite

Reference commits 0dbfae67, 4405b817, ffdd9bc6, b63086f2"

* fix(docs): handle non-ASCII anchors in link validator

Anchor validation failed for links containing accented characters
(e.g. ./customize-bmad.md#dépannage) because the raw anchor didn't
match the slugified version produced by extractAnchors.

Normalize anchors through decodeURIComponent + headingToAnchor before
comparing, and guard against malformed URI components.

* docs(fr): translation of install-bmad channel and config rewrite

Reference commits 3d824d4c, 91a57499, 0f852a38

* docs(fr): translation of expand-bmad-for-your-org organizational customization patterns

Reference commits c52c9b5b, b63086f2, 4405b817, 0dbfae67

* docs(fr): update install-custom-modules

Reference commit 231a2036

* docs(fr): consolidate non-interactive installation into unified install-bmad guide

Replace standalone non-interactive-installation.md with a redirect stub
pointing to the Installations CI non interactives section in install-bmad.md.

* docs(fr): translation of named-agents

Reference commits 0dbfae67, 4405b817, b63086f2

* docs(fr): refinement of upgrade-to-v6

* docs(fr): refine agents.md

* docs(fr): refine commands.md

rename bmad-create-prd to bmad-prd and update skill descriptions

* docs(fr): refine workflow-map-diagram

Reference commit c52c9b5b

rename create-prd to prd, create-product-brief to product-brief
add prfaq workflow, update agent labels and output names
refine French wording throughout

* docs(fr): update and refine workflow-map

Reference commits: 380590a c52c9b5

* docs(fr): update and refine getting-started

Reference commits c52c9b5b, 0f852a38

rename bmad-create-prd to bmad-prd, add PRD intents section
update Quick Reference table, refine French wording throughout

* docs(fr): refine index.md

Reference commit 0dbfae67

refine French wording throughout, improve phrasing and table formatting

* docs(fr): apply French typographic conventions across all docs

regex-based pass followed by AI + manual review of all 34 source files

Rules applied:
- Apostrophe: ASCII ' → curly ’ (U+2019) in all French prose
- Guillemets: ASCII "..." → « … » with narrow no-break space (U+202F) on both sides
- Narrow no-break space (U+202F): before ; ? ! and after « / before »
- No-break space (U+00A0): before : in French prose
- Thousands separator: narrow no-break space (U+202F) in 4+ digit numbers

Additional review fixes: remaining ASCII quotes in _STYLE_GUIDE.md
checklist items, testing.md, and party-mode.md numbering.

Preserved exclusions: YAML frontmatter delimiters, code blocks,
backtick inline code, URLs, footnote syntax, and English UI text.

* docs(fr): align sidebar ordering with current English docs

Update sidebar order values across all French explanation and how-to
pages to match the live English documentation structure.

* docs(fr): fix omission in quick-dev from english

* docs(fr): style guide formatting

* docs(fr): use quick-dev wording in workflow-map-diagram-fr

* docs(fr): fix typos

* docs(fr): add bmad-investigate / IN trigger to agent tables

The forensic investigation feature added the IN menu trigger and
bmad-investigate skill, but the French docs that enumerate triggers
and agent capabilities were not updated.

- agents.md: add IN trigger and Enquête de code to Amelia's row
- named-agents.md: add Enquête de code to Amelia's capabilities

* docs(fr): fix agent skill identifiers to use bmad-agent-* prefix

The agent skill identifiers in agents.md and commands.md were missing
the -agent- segment of the namespace (e.g. bmad-pm instead of
bmad-agent-pm). All agent launchers use the bmad-agent-* naming
convention since the installer generates skill directories under that
prefix.

- agents.md: fix bmad-dev, bmad-analyst, bmad-pm, bmad-architect,
  bmad-ux-designer, bmad-tech-writer
- commands.md: fix bmad-pm, bmad-architect

* docs(fr): rename bmad-create-ux-design to bmad-ux (#2413)

Apply ee47e30c (refactor(bmad-ux): spine-based UX skill) to French docs.
Rename skill bmad-create-ux-design → bmad-ux and update outputs
from ux-spec.md to DESIGN.md + EXPERIENCE.md.

* docs(fr): translate bmad-spec section

French translation of the bmad-spec section introduced in aa6dece
(feat(bmad-spec): introduce Spec kernel distiller skill (#2417)).

* docs(fr): improve core-tools locution, phrasing and typography

Broader pass across all sections of core-tools.md for more idiomatic
French: consistent section headers (À utiliser quand, Fonctionnement),
natural verb choices, fluid sentence construction and corrected
punctuation.

* docs(fr): apply French typography and table formatting pass

Continuation of 27002100. Systematic pass across all French documentation
assisted by an automated French typography linter:
- Replace regular space with NBSP (U+00A0) before colons per French
  typographic convention
- Align table separator rows to match column widths
- Fix thousands separator in install-bmad.md (5000 → 5 000)
- Correct glossary example code block rendering in _STYLE_GUIDE.md

* docs(fr): fix missing french typography on roadmap.mdx

* docs(fr): translate web-bundles explanation and how-to

French translation of:
- docs/explanation/web-bundles.md
- docs/how-to/use-web-bundles.md
Reference commits: 7729ad46, d659a03d, 3bc2ad30

* docs(fr): refresh skill metadata references

Fixes #2437 for French.

- agents.md: update PM triggers CP/VP/EP → PRD, remove stale US trigger
  from Technical Writer, align PRD description to create/update/validate
- commands.md: fix Cursor/Windsurf skill paths to .agents/skills/,
  update core tools count to 12, align PRD description
- core-tools.md: add missing bmad-customize tool entry and section with
  link to customize-bmad how-to
- party-mode.md: replace stale "BMad Master orchestre" with "Le Party
  Mode orchestre la discussion"

---------

Co-authored-by: Brian <bmadcode@gmail.com>
2026-06-06 20:34:42 -05:00
Loic Duong faffffedbb
docs: update planning workflow diagram (#2444) 2026-06-06 20:33:30 -05:00
duliangang b178f27c01
fix(bmad-create-epics-and-stories): discover bmad-ux spine outputs (#2446) 2026-06-06 20:32:47 -05:00
pbean b41c3b0a04 feat(bmad-module): reach installer parity on source parsing, channels, and clone cache
Close the remaining capability gaps where the skill's custom-module install was
narrower than the canonical installer (tools/installer/modules/custom-module-manager.js
+ channel-resolver.js). The new-spec install path was already shared code and the
legacy resolver a faithful port, so this targets only the independently-implemented
source/channel/cache plumbing.

- source.mjs parseSource: accept `owner/repo@ref`, and browser-style deep-path
  git URLs (tree/blob, GitLab `-/tree`, Gitea `src/branch`, `?path=`), extracting
  the embedded ref + repo subdirectory — so a module in a monorepo subfolder
  installs directly. URL-based parsing handles Azure DevOps `_git`, nested
  groups, and dotted repo names.
- lib/cache.mjs: shared clone cache at ~/.bmad/cache/custom-modules/<host>/<owner>/<repo>/
  with .bmad-source.json/.bmad-channel.json metadata, matching the installer
  (reuse on matching ref, fetch/refresh otherwise, keep stale copy on fetch
  failure). materializeSource copies the module root out of the cache into a
  throwaway temp tree so the cache is never mutated.
- lib/channel-resolver.mjs: node:-only port of resolveChannel (stable/next/pinned);
  `stable` resolves the latest non-prerelease GitHub tag, falling back to next.
  semver-lite gains prerelease/compare/rcompare so it stays registry-free.
- install.mjs/update.mjs: resolve channel+ref before clone; update re-resolves the
  channel the module was installed with.

Tests + CI:
- test/test-bmad-module-source.mjs: unit coverage for parseSource, semver-lite, and
  channel-resolver, at parity with the installer's test-parse-source-urls.js /
  test-installer-channels.js.
- Wire the skill's unit test (test:skill-source) and its end-to-end integration
  test (test:skill) into npm test, npm run quality, and the quality.yaml CI job —
  the integration test was previously committed but only ever run by hand.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-06 15:06:48 -07:00
pbean 34b2fb1c78 feat(bmad-module): install legacy marketplace.json modules in the skill
The standalone bmad-module skill only understood the new plugin.json#bmad
spec, so installing a legacy repo (marketplace.json + module.yaml, e.g.
bmad-code-org/bmad-module-game-dev-studio) failed with exit 20. Legacy
support existed only in the full installer's PluginResolver, which the
skill can't import (it ships self-contained under .claude/skills/).

Port that resolver into lib/legacy-resolver.mjs (strategies 1-5): when a
repo has no plugin.json#bmad but has a marketplace.json, resolve it into a
synthetic manifest of the same shape readAndValidateManifest produces, then
run it through the existing buildCopyPlan -> rewrite -> stage -> swap
pipeline unchanged. buildCopyPlan already copies marketplace.json verbatim,
flattens arbitrary skill paths to skills/<basename>, and flattens
moduleDefinition/moduleHelpCsv, so almost no downstream change is needed.

- plugin-json.mjs: extract validateManifestObject(m, {allowReserved}) and
  add hasBmadPluginJson(dir). Legacy installs pass allowReserved:true so
  first-party codes (gds, bmm, ...) install; new-spec authors still get
  exit 21.
- install.mjs: detect new-spec -> legacy -> neither in §3; write
  synthesized module.yaml/module-help.csv into the temp clone for the
  strategy-5 fallback.
- cli.mjs: add --module <code> to disambiguate a multi-module marketplace
  (otherwise exit 20 lists the available codes).
- help-catalog.mjs: export MODULE_HELP_CSV_HEADER for the synthesizer.
- tests: legacy fixtures (strategy-1, reserved code, synthesize fallback)
  + integration assertions. SKILL.md/README updated.

Verified: full install of the real game-dev-studio repo resolves gds and
lands 250 files under _bmad/gds/. Integration suite 97/0, installer
component tests 374/0.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-06 11:49:31 -07:00
Alex Verkhovsky c9d9316e97
fix: clarify quick dev subagent use (#2450)
* fix: clarify quick dev subagent use

* fix: clarify subagent use in more workflows
2026-06-04 04:49:40 -07:00
pbean 08f25d0588 refactor(bmad-module): tighten SKILL.md and drop dead exit code 40
- Remove EXIT.FILE_OVERLAP (40): never thrown anywhere; its docs
  described code 70 (path traversal). Dropped from exit.mjs and the
  cli.mjs --help listing.
- Document --channel on the update verb (already wired through the
  scripts for both install and update).
- Trim the SKILL.md exit-code table to the codes that change what the
  agent tells the user (5, 10, 80, 90); defer the full list to the
  script's --help, removing the triplicated/drifting table.
- Lightly tighten the intro and script-path prose loaded on every
  skill activation; no behavioral change.

Integration suite 73 pass / 0 fail; validate:refs clean.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-03 15:11:26 -07:00
pbean be1235fac6 feat(installer): prompt to pick module.yaml when a plugin has several
When the ancestor walk added in the previous commit finds more than one
module.yaml + module-help.csv pair between the skills' common parent and
the repo root, the deepest one was chosen silently. That could surprise a
user whose repo legitimately carries module definitions at multiple levels.

PluginResolver.resolve now accepts an optional chooseModuleDefinition
callback. When >1 candidate is found it is invoked with each candidate
enriched with its relativePath + module.yaml code/name/description, and its
selection wins. Headless callers (the --custom-source CLI flow, tests,
re-resolution lookups) omit the callback and keep the deterministic
deepest-first default, so nothing blocks. The interactive custom-module
flow supplies a prompt, pausing/resuming its spinner around the choice.

Threads options through CustomModuleManager.resolvePlugin and wires the
prompt into both resolve sites of _addCustomUrlModules. Adds tests for the
deepest-first default, candidate enrichment, and chooser override.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-03 14:41:28 -07:00
pbean acbae8e107 fix(installer): resolve legacy module.yaml above skills' common parent
PluginResolver strategy 1 only checked the skills' common parent for
module.yaml + module-help.csv. For the canonical BMad layout (module
files at src/, skills under src/skills/<name>/) the common parent is
src/skills, so the files were missed and the resolver fell through to
strategy 5 — synthesizing a degenerate module named after the marketplace
plugin (e.g. bmad-creative-intelligence-suite) and discarding the real
`code` (cis) and `agents:` roster. That mismatch then made
resolveInstalledModuleYaml fail, emitting the collectAgentsFromModuleYaml
and writeCentralConfig "could not locate module.yaml" warnings.

Strategy 1 now walks up from the skills' common parent to the repo root
(bounded, deepest-first) and uses the first directory with both files, so
src/module.yaml resolves correctly. Also match on `pluginName` in
resolveInstalledModuleYaml's resolution-cache fallback so a module tracked
under its marketplace plugin name still resolves. Adds a regression test
mirroring the bmad-creative-intelligence-suite layout.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-03 14:36:56 -07:00
Brian feab3d5e4e
bmad-brainstorming: facilitation modes, append-only memlog, and a visual session composer (#2445)
* Initial draft: brainstorming improved

* bmad-brainstorming: apply quality-analysis fixes

- Add ## Overview heading (prose was already present)
- Fix resume scan to glob output_dir/*/session.md (per-session subfolders);
  handle multiple in-progress sessions
- Anchor brain_methods to {skill-root} and always pass --file to brain.py
  (--file before subcommand); drop the unreliable conditional
- Log decisions, dismissed E3 false positive, verified tests (15 passed)

* bmad-brainstorming: memlog session memory + facilitation refinements

Replace the running-log concept with a generic, append-only memlog
(scripts/memlog.py): a flat, chronological, write-only session memory any
skill can reuse. Entries land at the end in the order they happen; --type
tags the kind (idea/insight/question/decision/technique); nothing is
grouped, reordered, or rewritten. The file is .memlog.md, read only on resume.

- scripts/memlog.py (init/append/set) + test_memlog.py (20 tests)
- SKILL.md: reordered into framing + flow; lean Memlog framing; batch
  technique model (Facilitator Chosen / Browse / Category / Inventive Flow);
  Progressive removed; facilitation stance preserved
- references/finalize.md: two-move synthesis + opt-in artifacts, each derived
  from the memlog via subagent
- references/headless.md, customize.toml: memlog wiring + per-topic folders

* bmad-brainstorming: gate technique-flow choice and stop full-catalog dumps

- brain.py: `list` now requires --category or --all; a bare `list` is refused so the full ~100-technique catalog can no longer flood context. --all is the deliberate full-dump escape hatch.
- SKILL.md: technique-flow selection is now a hard gate (present the four ways, wait for the user's pick) instead of a soft default that got skipped; Stance "no multiple-choice" rule scoped to generation, with an explicit carve-out for that one process menu.
- headless.md: use `list --all` deliberately, passing --file.
- customize.toml: fix stale "progressive flows" wording to match the four real flows.
- test_brain.py: regression tests for the list guard (bare refused, --all dumps all).

* bmad-brainstorming: remove .decision-log.md build-time artifact

The workflow-builder writes .decision-log.md to track its own build session; it is a build-time artifact, not part of the shipped skill, so it should not be committed to the project.

* bmad-brainstorming: facilitation modes, attributed memlog, and the selection composer

- Three facilitation modes chosen up front (Facilitator / Creative Partner / Ideate for me), each a loaded frame; SKILL.md routes mode + technique selection primarily through the selection page, with the in-chat menus as fallback.
- memlog: optional --by user|coach attribution (required in Creative Partner) so authorship stays visible in the log.
- brain.py: generates a self-contained "browse all" selection page (brain-selector.html) - a session composer with facilitation mode, a hand-picked + Random + Invent + AI-picks technique strategy, category toggle-chips and a category-aware filter, and a copy-to-clipboard prompt with a paste-back banner. Category-tinted cards, 13 crafted category icons, and a hand-assigned icon for each of the 100 techniques. `html` writes to a file (never dumps the catalog into context); a snapshot test keeps the shipped page in sync with the CSV.
- Drop the now-unused Six Thinking Hats detail file; the catalog needs no detail files.
- finalize.md: synthesis is mode-aware and the "hand them the mirror" step reads the by-attribution tags.

* bmad-brainstorming: fix code-review findings

memlog.py
- Parse frontmatter by the first line that is exactly `---`, so a `---` inside a
  topic/goal value no longer truncates the block, drops `status`, and breaks resume
  forever. Neutralize newlines in field values on render too.

brain.py (selector page + CLI)
- Composer: category toggles now define session scope; the text filter is a pure
  browse aid. checked() and the random pool both key off scope (offCats), so hidden
  cards are never silently copied and a stray filter term can't starve a random draw.
- Clipboard: only show the "Copied!" banner when the copy actually succeeds; on
  failure show a warning and a prefilled prompt() so the text is never lost.
- category_style: fall back to the neutral glyph instead of KeyError if the hue/glyph
  dicts ever desync.
- random: clamp -n so a negative/oversized value returns cleanly instead of crashing.
- --extra: merge a JSON overlay of additional_techniques into every command, so the
  browse page and category draws include custom techniques/categories as advertised.

docs
- SKILL.md: fix dangling `## Choosing Your Mode` anchor and the "Copy selection"
  button label; document --extra in the regen instructions.
- mode-autonomous.md: persist the mode flip when handing off from autonomous, so a
  resume restores the new stance.
- finalize.md: grammar/typo fixes (CodeRabbit).

tests
- Regression tests for the memlog `---` fix, --extra merge, negative -n, and the
  category fallback; regenerated the snapshot-tested selection page. Renamed the
  shadowing `type`/`l` locals flagged by CodeRabbit. 52 passing.

* bmad-brainstorming: composer header polish + dark mode

- Center header content (.hwrap) so it aligns with the card column on wide screens.
- Replace the text filter with jump-nav: category chips smooth-scroll to their
  section (offset for the sticky header); drop the category exclude-toggle, so
  Random/AI draw from the whole catalog.
- Fix narrow-screen crowding between the chips and the Copy prompt button.
- Move Copy prompt to the end of the Techniques row, anchored to the Total readout.
- Add a per-mode hint line that explains the selected facilitation stance.
- Dark mode: refactor all colors to CSS variables + a dark palette, with a header
  toggle (☾/☀) that defaults to system preference and persists in localStorage; an
  inline head script applies the theme before first paint to avoid a flash. Category
  hues are lifted toward white on dark surfaces to stay legible.

Regenerated the snapshot-tested selection page; SKILL.md wording updated (chips are
jump-nav, not a filter). 52 Python tests passing.

* bmad-brainstorming: condense SKILL.md, extract resume + in-chat technique frames

- Rewrite SKILL.md: consolidate framing, merge session setup into Run a
  Session, descriptive (non-imperative) Overview true across all 3 stances
  (~2,790 -> ~2,070 tokens)
- Extract Resuming to references/resume.md (loads only on resume)
- Extract in-chat technique selection to references/in-chat-techniques.md
  (loads only when the composer page is declined)
- Add HTML-open recovery guidance to the composer-page step
- Ideate-for-me now auto-produces the HTML keepsake (finalize.md +
  mode-autonomous.md) instead of asking first

* Enhance bmad-brainstorming: goal facet, proven grouping, convergence, icon sidecar

Catalog (brain-methods.csv -> 108 methods):
- Add provenance / good_for / audience columns (additive, backward-compatible)
- Add 8 researched classic methods: How Might We, Job to Be Done, Empathy Map,
  Backcasting, TRIZ Contradiction, Fishbone Diagram, Build on What Works, Scenario Cross

Selector page (brain.py generator):
- "Proven & Professional" lead group (29 named methods, cross-category)
- Super-group ordering (Structured/Creative/Wild/Introspective) replacing alphabetical
- "Great for" goal filter driven by good_for tags
- Per-category "Invent a ... technique" cards reusing the invent flow

Convergence:
- New references/converge.md (diverge -> converge -> finalize); wired into SKILL.md

Maintainability:
- Extract category + technique icons to assets/brain-icons.json; brain.py loads the
  sidecar, with logic and fallbacks staying in code (8 new icons added, full coverage)

Docs:
- Add analysis/ (catalog-analysis.md + method-matrix.csv): the 4-axis review behind these changes

All 52 tests pass.
2026-06-02 22:54:43 -05:00
pbean bca9388750 docs(bmad-module): drop stale temp-repo references and install paths
This work was developed in a separate bmad-marketplace repo and is now
landing directly in BMAD-METHOD, so the migration framing is obsolete:

- remove links to docs/spec.md (only existed in the temp repo) and the
  bmad-marketplace / 'upstream patch' / 'sibling checkout' references in
  README, the integration test, and the acme-md-lint fixture
- drop dead 'spec §N' pointers in install.mjs, install-plan.mjs, and
  plugin-json.mjs (including a user-facing reserved-code error message)
- reword the manifest-generator 'patch' note as in-repo behavior
- correct the documented install path from _bmad/ to the IDE skills
  directories the installer now distributes skills to (.claude/skills/, etc.)

No behavior change. Integration suite: 73 pass / 0 fail.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-01 18:00:32 -07:00
pbean 4d036bc18b docs(bmad-module): correct script location to installed IDE skills dir
Step 4 pointed at _bmad/core/skills/bmad-module/, but the new module
system distributes skills verbatim into the selected IDE directories
(.claude/skills/, .agents/skills/, etc.). Resolve the script relative
to SKILL.md instead, and route the missing-script case to the existing
exit-code-5 reinstall guidance.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-01 17:44:34 -07:00
pbean 9bc76acdcb feat(installer): recognize new module system (plugin.json#bmad)
Add Strategy 0 to PluginResolver: detect a .claude-plugin/plugin.json
carrying a bmad{} block at the module root and resolve+validate it via
the bmad-module skill's own libs (new bmad-module-lib bridge), so the
installer and runtime skill agree on what a module is. Every resolved
module now carries a format discriminator ('plugin-json' | 'legacy').

OfficialModules routes 'plugin-json' resolutions through a new
_installFromPluginJson path that reuses the skill's copy-plan/flatten/
rewrite/atomic-swap libs, producing an on-disk layout byte-identical to
a bmad-module install while leaving legacy installs untouched. Direct
mode in ui.js prefers a root plugin.json#bmad manifest over SKILL.md
scanning. Adds Test Suite 45 covering detection, legacy fall-through,
and end-to-end install.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-01 13:14:14 -07:00
pbean 8d628b5f1b fix(validate-skills): skip tests/fixtures when discovering skills
The skill validator walks all of src/ recursively, so the bmad-module skill's
reference and negative example modules under tests/fixtures/ (intentionally
non-bmad-* names and deliberately-malformed fixtures) were validated as
production skills and tripped HIGH SKILL-04 name-format findings, failing
`validate:skills --strict`.

Exclude a `fixtures/` directory whose parent is `tests/` from discovery so the
validator judges only real skills. No production skill lives under tests/fixtures/.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-01 09:53:17 -07:00
pbean 546826b451 feat(bmad-module): complete custom-module install to match the installer CLI
The bmad-module skill copied a module's files and distributed skills to IDEs,
but skipped four post-copy steps the full `bmad install --custom-source` path
performs, leaving modules incompletely installed:

- Merge each module's module-help.csv into _bmad/_config/bmad-help.csv (the
  catalog bmad-help reads) — new lib/help-catalog.mjs
- Generate [modules.<code>] / [agents.<code>] blocks in config.toml /
  config.user.toml from module.yaml (defaults + --set overrides), via a
  targeted merge that preserves [core] and sibling modules — new lib/config-gen.mjs
- Create the working directories a module declares under `directories:`
  (with move-on-path-change and wds_folders) — new lib/module-dirs.mjs
- Run `npm install --omit=dev` in place when a module ships package.json
  (opt out via bmad.install.skipNpm) — new lib/npm-deps.mjs

All four run as a shared finishModuleInstall step wired into install, update,
and remove; every step is non-fatal so a module already committed to _bmad/
isn't lost to a post-copy hiccup. Adds a repeatable --set <code>.<key>=<value>
flag mirroring the installer.

Also fixes two latent issues in the manifest-driven copy that the new steps
depend on:
- moduleDefinition / moduleHelpCsv are now flattened to the module root even
  when they live inside a declared skill dir (the setup-skill assets pattern);
  previously claimedSrc dedup skipped them and the rewritten plugin.json
  pointed at a non-existent ./module.yaml.
- package.json / package-lock.json are now copied so npm deps can install.

Tests: extends the integration suite with config/agent-roster, --set,
directory-creation, help-catalog, removal-cleanup, and npm assertions
(73/73 pass); adds a minimal-npm fixture and rewrites the comprehensive
fixture's module-help.csv to the canonical schema.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-01 09:52:52 -07:00
Brian fae7015226
Redesign party-mode skill as conversation-first, subagents opt-in (#2441)
Reframes the party-mode skill around outcomes instead of a rigid
subagent script, addressing issue #2280.

- Voicing the room is the default; subagents become opt-in (--subagents)
  for rounds that genuinely need independent thinking.
- Removes the lossy 400-word context cap and the 'Do NOT use tools'
  constraint that drove subagents to fabricate on grounded questions.
- Adds a 'What Good Feels Like' bar: short in-character turns, real
  drama over consensus, brevity by default.
- Adds orchestrator weaving so independently-produced turns read as one
  conversation without altering what any persona actually argued.
- Slims SKILL.md from 128 to 75 lines.
2026-05-30 00:39:22 -05:00
Loic Duong e74dd8040d
docs: refresh skill metadata references (#2439)
* docs: refresh skill metadata references

* docs: link BMad customization guide
2026-05-29 22:34:00 -05:00
pbean af52c7baf9 feat(bmad-module): distribute installed skills to the user's chosen IDEs
The bmad-module skill staged community modules under _bmad/<code>/ but never
pushed their skills out to the coding assistants the user selected at
`bmad install` time, so a freshly installed module was invisible to Claude
Code / Cursor / Copilot / etc. until a full reinstall; remove left skills
orphaned in the IDE dirs.

install/update/remove now distribute (or prune) skills to every IDE listed in
_bmad/_config/manifest.yaml and clean the redundant skill dirs from _bmad/,
matching how official modules end up.

Single engine, three callers — no fork:
- New tools/installer/core/ide-sync.js (syncIdes) wraps the real
  IdeManager.setupBatch + platform-codes engine. The full installer
  (_setupIdes/_cleanupSkillDirs), the new `bmad ide-sync` command, and the
  skill all route through it, so new IDEs and engine changes propagate
  everywhere automatically.

Local, dependency-free delivery — no npx/network at runtime:
- build-ide-sync.mjs esbuild-bundles the engine into vendor/ide-sync.mjs
  (+ platform-codes.yaml), aliasing ../prompts and ../project-root to small
  shims so @clack and the installer graph are dropped. The bundle ships inside
  the skill tree (like yaml.mjs); the skill execs it locally. It's
  generated-from-source and gated by vendor:check, refreshed on every install.

update/remove pass --prune with the module's canonicalIds so skills dropped
between versions (or on uninstall) are removed from IDE dirs + command
pointers. Graceful degradation: if the bundle is unreachable, the verb still
succeeds and points the user at `bmad ide-sync`.

Tests: new test/test-ide-sync.js drift-guard (engine == bundle, incl. prune),
integration.test.sh IDE-distribution section (offline), bundle self-check in
the build. All gates green (vendor:check, lint, format, test:install 349/349).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-05-29 20:30:46 -07:00
Brian Madison 6a62b2e0ba unwrapped prose 2026-05-29 21:31:23 -05:00
pbean 6addf6464d Merge remote-tracking branch 'origin/main' into feat/bmad-marketplace-plugin
# Conflicts:
#	.prettierignore
#	package.json
2026-05-29 14:52:46 -07:00
pbean ce461c09cc style(bmad-module): apply prettier formatting to README and SKILL
Formatting-only; no content changes. Brings both docs in line with the
repo's prettier config (a leftover from the .js→.mjs migration).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-05-28 19:30:23 -07:00
pbean bd63b83f72 test(bmad-module): make integration suite self-contained
The suite resolved its reference modules from `<repo>/examples`, which
existed only in the sibling bmad-marketplace checkout — so after the
skill moved into BMAD-METHOD core every install/list/remove assertion
failed with "local source not a directory".

Vendor the two reference modules (acme-md-lint, acme-devlog) under
tests/fixtures/examples/ and point EXAMPLES there; drop the now-unused
REPO_DIR. Also correct the comprehensive-install assertion: hooks are
flattened to the canonical root slot (hooks.json), matching .mcp.json
and rewriteManifestPaths — not a hooks/ subdir.

Suite now passes 41/41.

Note: these fixtures are copies of the bmad-marketplace examples and
must be re-synced if those reference modules change.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-05-28 19:29:59 -07:00
pbean dfae0291ca fix(bmad-module): copy file-typed agents/commands entries on install
The copy planner treated every skills/agents/commands entry as a
directory and ran it through addDirRecursive, which lists files *under*
the path. For a subagent declared as a file (e.g.
`"agents": ["./agents/foo.md"]` — a standard Claude-Code shape) that
listed nothing, so the agent was silently dropped from the install even
though rewriteManifestPaths already remapped it to `./agents/foo.md`.

Stat each entry and branch: directories recurse as before, files are
queued directly (honoring the ignore matcher). Verified by the
comprehensive fixture's changelog-archivist.md agent.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-05-28 19:29:40 -07:00
pbean 354b252abd feat(bmad-module): register skill in core module-help.csv
The bmad-module skill installed but was absent from the core help
registry, so it never surfaced in the bmad-help menu (every other core
skill has a row). Add it as menu-code MM ("Manage Modules").

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-05-28 19:29:18 -07:00
pbean 6d49cc505b feat(bmad-module): manifest-driven copy plan with canonical path rewriting
Replace the flat copy-list staging with a manifest-driven copy plan:

- buildCopyPlan maps declared skills/agents/commands and string-typed
  Claude-Code surfaces into canonical install slots, copies conventional
  top-level metadata, and drops anything not covered (no more leaking of
  tools/, website/, .github/, etc.).
- rewriteManifestPaths emits a plugin.json whose paths point at the
  canonical post-install locations, keeping the on-disk manifest
  self-consistent inside _bmad/<code>/.
- stageCopyPlan stages the plan plus synthesized files (rewritten
  plugin.json) into the tmp dir for the atomic swap.

install.mjs and update.mjs switch to the new plan/skillDestDirs flow and
drop the now-unused copy-list helpers.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-05-28 19:20:35 -07:00
github-actions[bot] 3bcd6c3cce chore(release): v6.8.0 [skip ci] 2026-05-25 21:47:24 +00:00
Brian 62c836ee61
docs(changelog): v6.8.0 release notes (#2427) 2026-05-25 16:46:38 -05:00
hanhnt2-hblab db744d405f
fix: support nested group paths in SSH Git URLs (#2379)
Co-authored-by: Brian <bmadcode@gmail.com>
2026-05-25 14:15:04 -05:00
Jacob du Toit 7b31b1accd
feat: expand advanced elicitation methods with 19 new techniques (#2062)
Adds 19 new elicitation methods across 7 categories including a new
'framing' category. All existing 50 methods preserved. Entries sorted
alphabetically by category then method name.

New methods added:
- advanced: Chain-of-Thought Scaffolding, Few-Shot Exemplar Priming
- collaboration: Six Thinking Hats, Delphi Method
- core: Second-Order Thinking, Inversion Analysis, Problem Decomposition,
  Analogy Mapping, Steelmanning
- creative: Constraint Injection, Morphological Analysis
- framing (new): Abstraction Laddering, Reframe the Question,
  Stakeholder Lens Rotation
- learning: Deliberate Practice Loop
- research: Source Triangulation
- risk: Assumption Audit, Cascading Failure Simulation
- technical: Boundary & Edge Case Sweep

Closes #2061

Co-authored-by: Brian <bmadcode@gmail.com>
Co-authored-by: Alex Verkhovsky <alexey.verkhovsky@gmail.com>
2026-05-25 14:09:17 -05:00
Jérôme Revillard 9c291b7ca9
fix: resolve default branch explicitly when updating shallow-cloned custom modules (#2332)
With shallow clones (--depth 1), `origin/HEAD` becomes stale after the
initial clone. The update path used `git reset --hard origin/HEAD` which
never picked up new commits pushed to the default branch.

Resolve the default branch name via `git symbolic-ref refs/remotes/origin/HEAD`,
then fetch and reset against `origin/<branch>` explicitly. Falls back to
`main` if origin/HEAD is not set.

Co-authored-by: Brian <bmadcode@gmail.com>
2026-05-25 14:05:59 -05:00
robertocsko-seon fea431fd2e
fix(installer): read config.toml on re-run so user_name (and other user-scoped answers) are preserved as defaults (#2411)
loadExistingConfig only read from legacy _bmad/<module>/config.yaml files, but
the installer writes user-scoped answers (user_name, communication_language, etc.)
to _bmad/config.user.toml. On every subsequent reinstall those values were not
loaded back, so the user got re-prompted instead of seeing their prior answers as
defaults.

Adds parseCentralToml — a lightweight line scanner matching the installer's own
TOML output format — and updates loadExistingConfig to read config.toml and
config.user.toml first (merging both into the same section buckets). Legacy
per-module config.yaml files are kept as a fallback for pre-v6 installations.

Co-authored-by: RobertOcsko <robert.ocsko@;seon.io>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: Brian <bmadcode@gmail.com>
2026-05-25 13:56:05 -05:00
SevenSteven 9a2fba97a3
fix: capture dev story baseline commits (#2403)
Co-authored-by: Brian <bmadcode@gmail.com>
2026-05-25 13:50:08 -05:00
Farzad Rashidi 065003fc95
Fix stale custom-source redeploys on quick-update (#2399)
* fix(installer): refresh custom-source cache on quick-update and persist channel marker

* fix(installer): persist real next ref and atomically dedupe custom refresh

* fix(installer): preserve custom-source cache when remote unreachable

When git fetch fails against an existing custom-module cache, cloneRepo
previously wiped the cache and attempted a fresh clone, which then also
failed for the same reason (network down, repo deleted/moved, auth
revoked) — leaving the user with no usable cache. With the new
quick-update refresh path calling cloneRepo for every cached custom
module, this turned transient remote outages into cache loss on every
quick-update.

- cloneRepo: on fetch failure with an existing cache, keep the previous
  clone and surface a warning via prompts.log.warn instead of removing
  the cache. The downstream metadata write uses the existing HEAD.
- _refreshRepoCacheOnce: update the comment to reflect that the common
  "remote unreachable but cache exists" case is now handled inside
  cloneRepo; warn on the remaining unrecoverable failures so they
  aren't silent.

Tests: 349 passed, 0 failed.

---------

Co-authored-by: Brian Madison <bmadcode@gmail.com>
2026-05-25 13:39:04 -05:00
Brian 7729ad461d
docs: route all web-bundles install traffic to bmadcode.com/web-bundles (#2425)
Make bmadcode.com/web-bundles/ the single supported install path. The
site keeps install steps current as Gemini and ChatGPT evolve, always
points at the newest tagged release, and turns one signup into the
notification channel for new bundles.

- README.md: drop direct-folder install reference, point to the site
- web-bundles/README.md: lead with Install (site), reframe folder as
  source for the shelf rather than install target
- docs/explanation/web-bundles.md: replace the per-bundle INSTRUCTIONS.md
  steer with the site, replace the dead how-to link
- docs/how-to/use-web-bundles.md: rewrite as a short pointer to the site
  (kept the file so existing inbound links resolve), retain prerequisites,
  persona customization, and build-your-own sections
2026-05-25 12:17:27 -05:00
Brian 2b76d03316
feat(web-bundles): release packager + manifest for bmadcode.com/web-bundles/ (#2424)
* feat(web-bundles): add release packager + bundle manifest

Adds the infrastructure for shipping web bundles as downloadable ZIPs
attached to a GitHub Release, consumed by the upcoming
bmadcode.com/web-bundles/ page.

- web-bundles/bundles.json — manifest with persona, tagline, description,
  accent color, motif key, knowledge files, and feature flags
  (web-browsing, deep-research, stitch integration) for each of the 6
  bundles. Top-level releaseTag and downloadUrlPattern so the
  consuming page can construct download URLs without hardcoding.
- tools/bundle-web-bundles.js — packager that zips each bundle dir into
  dist/web-bundles/{slug}.zip and prints the gh release create command.
  Zero dependencies; uses system zip.
- .gitignore — exclude dist/web-bundles/ build artifacts.

The web-bundles-v1.0.0 release on GitHub is currently in draft state
with the 6 zips attached; it'll be published in coordination with the
Ghost site page going live.

* fix(web-bundles): single-source release tag, sharper bundle copy

- Remove downloadUrlPattern from bundles.json — the consuming page
  derives the URL from releaseTag, so version bumps now touch one
  field instead of two.
- product-brief-coach: drop "one-page" (briefs are whatever length
  the product earns).
- brainstorming-coach: real numbers — 60 techniques across 10
  categories — with concrete examples (SCAMPER, Drunk History
  Retelling, Nature's Solutions, Six Thinking Hats, etc.) so the
  card actually communicates the surprising breadth.

* fix(web-bundles): harden release script per PR review

- Verify the zip CLI is on PATH up front with a clear install
  hint, instead of crashing mid-zip with an opaque execSync error.
- Wrap JSON.parse in try/catch; validate the manifest shape (bundles
  array non-empty, releaseTag present, slug present per entry) before
  trying to package, so config errors fail with a targeted message.
- Catch zip failures per-bundle and surface the failing slug.
- Refuse to print the gh release command when zero bundles were
  packaged (would otherwise mislead the user into creating an empty
  release).
- Derive --title from manifest.releaseTag so the printed command can
  never drift from the actual tag (was previously hardcoded
  "Web Bundles v1" while the tag had moved to v1.0.0).
- Remove the stale `web-bundles-v1` example from the file header.

Addresses augmentcode bot review comments on PR #2424.

* docs(web-bundles): rewrite copy to actually sell what each bundle does

The JSON drives the bmadcode.com/web-bundles/ page; previous copy
was generic and undersold the actual capabilities. Rewrote each
tagline + description to lead with concrete, differentiating facts
pulled directly from each bundle's SKILL.md:

- Brainstorming Coach: 60 techniques across 10 categories with
  specific names (SCAMPER, Drunk History Retelling, Nature's
  Solutions, Shadow Work Mining, Superposition Collapse); calls
  out the 4 routes (browse, recommend, random, progressive) and
  the ~100-idea quantity-unlocks-quality target.
- Product Brief Coach: names the three intent modes (Create /
  Update / Validate) and the two working paths (Fast / Coaching);
  surfaces the [ASSUMPTION] tag system and the Addendum.
- PRFAQ Coach: details the 4 stages (Ignition / Press Release /
  Customer FAQ / Internal FAQ + Verdict), the 9 press release
  sections, the weasel-word list ("best-in-class", "seamless"),
  and that it adapts for commercial, internal, OSS, community.
- PRD Coach: spells out the two entry points (Vision+Features
  vs Journey-led), named-protagonist journeys, glossary
  discipline, stable ID system (FR-1..N, SM-C1..N), and the
  7-dimension validation rubric.
- UX Coach: leads with the two-spine contract (DESIGN.md +
  EXPERIENCE.md), Don Norman framing, named-protagonist
  journeys, surface closure as the test, and Stitch integration.
- Market & Industry Research: leads with Deep Research as the
  engine, names Porter and Christensen as anchors, lists the 6
  deliverable sections, and frames the deliverable as synthesis
  not a research dump.

* fix(web-bundles): security hardening + strict bundle validation

Two issues raised by coderabbit on the latest commit:

1. Shell injection surface: execSync was building the zip command
   with a template literal that interpolated bundle.slug from JSON.
   Even with our controlled inputs, a slug with shell metacharacters
   would break quoting. Switched to execFileSync with an argument
   array (no shell) and added a strict ^[a-z0-9][a-z0-9-]*$ slug
   regex enforced before any FS or zip call.

2. Missing bundle directories were [SKIP]-warned but the script
   still printed the release command, allowing an incomplete release
   to ship cleanly. Now treated as fatal: any missing or invalid slug
   blocks the printed gh command and exits non-zero with the offending
   slugs listed.
2026-05-25 11:43:55 -05:00
Emmanuel Atsé cede485217
feat(docs): Add sidebar order validator for doc frontmatter (#2409)
* feat(docs): add sidebar order validator

Adds tools/validate-sidebar-order.js to validate sidebar.order values
in YAML frontmatter across English and translated docs.

Checks for duplicate orders, gaps in sequence, and missing order fields.
For translations, also warns on order drift from English counterparts.
Wired into the quality script as docs:validate-sidebar.

* fix(validate-sidebar): tighten language detection and drift guard, add docstrings

* fix(validate-sidebar): replace subdirectory heuristic with locale pattern matching

detectLanguageDirs() previously classified any top-level docs/ directory
containing subdirectories as a translation language. This was too broad —
if an English section ever gained nested subfolders it would be silently
excluded from validation.

Replaced with a BCP 47 locale-code regex (/^[a-z]{2}(?:-[a-zA-Z]{2})?$/)
that matches known patterns (cs, fr, vi-vn, zh-cn) and won't falsely
classify content sections like explanation/ or reference/.

* fix(validate-sidebar): guard drift check against undefined order values

extractSidebarOrder() returns { hasSidebar: false } when no sidebar block
exists, leaving order as undefined rather than null. The drift check only
guarded against null, allowing undefined values to emit noisy warnings
like "Order drift: ... order undefined".

Changed the guard to typeof === 'number' which correctly excludes both
undefined and null without relying on a specific sentinel value.

* chore(validate-sidebar): add JSDoc docstrings to all functions

Adds @param and @returns annotations to extractSidebarOrder,
detectLanguageDirs, getEnglishSections, checkDirectory,
checkTranslationDrift, and relativePath.

* fix(validate-sidebar): add to pre-commit hook

* refactor(validate-sidebar): harden parsing and edge-case handling

Refactor to main() wrapper with pure return-based APIs, single directory
scan, and shared reporting. Harden frontmatter parsing (anchored delimiter,
direct-child-only order extraction, flow mapping support) and validation
(Infinity/zero guard, gap flood cap, multi-segment locales, graceful ENOENT).

* docs: fix sidebar.order duplicates and gaps across all locales

Resolves all validator errors flagged by the new
tools/validate-sidebar-order.js check.

English (docs/{explanation,how-to,reference}/):
- Renumbered to remove duplicates; established reading order
  for new explanation pages added since orders were last set.

Translations (cs, fr, vi-vn, zh-cn):
- Mirrored English structural ordering where files exist, then
  compacted to 1..N within each directory to eliminate gaps
  caused by missing translation files.

Non-blocking drift warnings remain where translation directories
have fewer files than English; these are expected per the
validator's design.

---------

Co-authored-by: Brian Madison <bmadcode@gmail.com>
2026-05-25 10:15:37 -05:00
Jérôme Revillard 436845493f
fix(skills): strengthen activation guardrails to prevent LLM short-circuiting (#2398)
* fix(skills): strengthen activation guardrails for all workflow skills

Add explicit "Activation is complete" boundary markers that require
confirming activation_steps_prepend and activation_steps_append were
fully executed before beginning the main workflow.

Previously, the guardrail was either missing (bmad-product-brief,
bmad-prd, bmad-investigate) or too weak ("Begin the workflow below").
LLM agents would short-circuit complex activation sequences (INCLUDE →
READ → RUN → CHECK → FILTER → CD) by guessing variables instead of
executing steps in order, causing append steps and on_complete hooks
to be silently skipped.

The new guardrail explicitly names both prepend and append steps,
requiring confirmation before proceeding. This prevents agents from
starting the main workflow in parallel with activation.

23 skills updated: bmad-product-brief, bmad-prd, bmad-prfaq,
bmad-investigate, bmad-create-story, bmad-dev-story,
bmad-quick-dev, bmad-code-review, bmad-correct-course,
bmad-sprint-planning, bmad-sprint-status, bmad-retrospective,
bmad-qa-generate-e2e-tests, bmad-checkpoint-preview,
bmad-check-implementation-readiness, bmad-create-architecture,
bmad-create-epics-and-stories, bmad-generate-project-context,
bmad-create-ux-design, bmad-document-project, bmad-market-research,
bmad-technical-research, bmad-domain-research.

* fix(skills): extend activation gate to agent + new skills, refine placement

- bmad-product-brief / bmad-prd: pull activation_steps_append out of
  the numbered list so the sentinel reads as a paragraph break, not
  as the next list item.
- bmad-investigate: move the sentinel above Step 7 (routing) — Step 7
  is workflow routing, not activation; the gate must fire first.
- bmad-agent-{analyst,tech-writer,pm,ux-designer,architect,dev}: add
  the same gate between Step 7 (append) and Step 8 (menu dispatch).
  Persona skills had the same short-circuit risk but no sentinel.
- bmad-ux, bmad-spec: new skills introduced on main after this branch
  forked; apply the same gate so the pattern stays consistent.
- removals.txt: register bmad-create-ux-design as renamed to bmad-ux.

---------

Co-authored-by: Brian Madison <bmadcode@gmail.com>
2026-05-25 09:59:38 -05:00
Alex Verkhovsky 1a5df418b3
fix: keep brainstorming idea flow collaborative (#2402)
Co-authored-by: Brian <bmadcode@gmail.com>
2026-05-25 09:34:49 -05:00
Dov Benyomin Sohacheski bfecb6ee95
fix(bmm-skills): define project_context in dev-story, sprint-planning, sprint-status (#2422)
Co-authored-by: Brian <bmadcode@gmail.com>
2026-05-25 09:33:05 -05:00
Brian d659a03d53
docs(web-bundles): fix install framing and add update/customize guidance (#2423)
- Drop "one-click install" framing in README and explanation page; setup is
  multi-step but consistent across the shelf.
- Drop "two files (sometimes three)" claim; honestly name SKILL.md,
  INSTRUCTIONS.md, and any required data files (templates, CSVs,
  validation checklists).
- Add explicit setup pattern in README (create Gem/GPT, upload knowledge,
  paste instructions, save).
- Add "Updating and customizing" section to the explanation page covering
  re-upload-the-attachments updates and the rule of thumb that custom
  changes belong in the pasted instructions block, not the knowledge
  files, so future updates don't clobber team customizations.
2026-05-25 09:27:24 -05:00
Brian 3bc2ad30a3
feat(web-bundles): bring back V4 web bundles for V6 (#2421)
* feat(web-bundles): bring back V4 web bundles for V6

Restores the V4 web bundle pattern for V6. BMad planning skills are
repackaged as one-click installs for Google Gemini Gems and ChatGPT
Custom GPTs, so users can run analysis and planning conversations in
flat-rate web LLM subscriptions instead of metered IDE tokens.

Current shelf (6 bundles): brainstorming, product brief, PRFAQ, PRD,
UX, market and industry research. Each bundle ships a SKILL.md
protocol, an INSTRUCTIONS.md with a default persona and a contrasting
swap example, and any required data files.

New in this commit:

- Market & Industry Research bundle merging market and domain research
  with Porter and Christensen anchors, Mary persona inherited from the
  BMad analyst agent, Geoffrey Moore swap example, Deep Research mode
  integrated as the default research path
- web-bundles/README.md folder index listing all 6 bundles
- README.md section announcing the V6 web bundle shelf
- docs/explanation/web-bundles.md concept page (what, why, when)
- docs/how-to/use-web-bundles.md install steps for Gemini Gems and
  ChatGPT Custom GPTs

* docs(web-bundles): unindent admonition closer in use-web-bundles.md

The :::note[Prerequisites] closer was indented under the last bullet,
which can prevent the admonition from closing and break Starlight
rendering for the rest of the page. Flush left now.
2026-05-25 08:46:19 -05:00
Emmanuel Atsé 189c2b85eb
docs(en): add bmad-investigate / IN trigger to agent tables (#2410)
The forensic investigation feature (commit 380590aa) added the IN menu
trigger and bmad-investigate skill, but several docs that enumerate
triggers and agent capabilities were not updated.

- agents.md: add IN trigger and Forensic Investigation to Amelia's row
- named-agents.md: add forensic investigation to Amelia's capabilities

Co-authored-by: Brian <bmadcode@gmail.com>
2026-05-24 14:44:00 -05:00
Rayan Salhab f28d04a92a
fix: write customization JSON as UTF-8 (#2414)
Co-authored-by: cyphercodes <cyphercodes@users.noreply.github.com>
Co-authored-by: Brian <bmadcode@gmail.com>
2026-05-24 14:42:45 -05:00
Brian aa6dece05d
feat(bmad-spec): introduce Spec kernel distiller skill (#2417)
* feat(bmad-spec): add Spec kernel distiller skill

New 2-plan-workflows skill that distills any intent input (brain dump,
PRD, transcript, brief) into a spec.md carrying the five-field kernel:
Problem, Capabilities, Constraints, Non-goals, Success signal. Headless
callers receive JSON; interactive runs close conversationally with the
spec path and gap-coverage invitations.

Includes:
- SKILL.md with activation contract and conventions
- customize.toml exposing template path, output path, run-folder pattern
- assets/spec-template.md (five-field skeleton)
- assets/headless-schemas.md (JSON IO contracts)

* remove brain-dump fallback config from bmad-spec customize.toml

* refactor(bmad-spec): companions+sources model, routing tilt, flat output path

- Collapse `related:` into `companions:`; companion paths may point inside the spec folder (spec-authored) or outside it (adopted from an upstream skill), distinguished implicitly by path
- `sources:` reserved for fully-absorbed inputs; downstream does NOT read these
- Soften mutation contract: bmad-spec owns SPEC.md and spec-authored companions; adopted companions belong to their originating skill
- Add "when to spawn a companion" tilt: multi-item catalogs, tables, diagrams (always), editorial voice rules; sub-bullets in a kernel field signal it has outgrown the kernel
- Fix Spec Law rule 7 and Pass 2: load-bearing content lands in SPEC.md or a companion, not the decision log (the log records wrapper-drops only)
- Flatten output path to `{planning_artifacts}/specs/spec-{slug}-{date}/`, mirroring `prds/` and `ux-designs/`; drop `spec_folder_name` (no longer used)
- Extract Load-bearing definition into its own section above Spec Law

* chore(core): retire bmad-distillator, promote bmad-spec to core

- Delete bmad-distillator/ and all registry + doc references (superseded by bmad-spec; no skill or workflow in any BMad module invoked it)
- Add bmad-distillator to removals.txt so installer cleans it from existing IDE skill directories on update
- Move bmad-spec from bmm-skills/2-plan-workflows/ to core-skills/ (universal scope: game design, research hypotheses, editorial briefs, policy, business plans, not just software)
- Register bmad-spec in core module-help.csv and bmad-pro-skills marketplace plugin
- Drop bmad-distillator section from core-tools.md (en, vi-vn, cs, fr, zh-cn) and vi-vn dev guide; renumber subsequent sections

* refactor(bmad-spec): add lean-prose discipline + generalize help text

- Add Spec Law rule 8: lean prose. Every sentence carries load-bearing content; cut decoration, hedges, backstory, throat-clearing. Applies to SPEC.md, companions, and decision log.
- Update Self-Validate Pass 1 to enforce rules 1-6 and 8 (rule 7 stays in Pass 2)
- Prime the operation up-front: write lean from the first pass, every sentence must earn its place
- Note in Companions section that companions follow the same lean discipline
- Generalize core module-help.csv entry: domain-agnostic framing (software, game design, research, editorial, policy, business, anything intent-bearing); call out succinct, no-fluff and "locks the WHAT before the HOW" as the value props

* fix(bmad-spec): address PR review findings (CodeRabbit + Augment)

- headless-schemas.md: rewrite spec_path examples to point at the spec folder (not a file), rename source_artifact to sources[] array, add companions[] array, update verdict from "six rules" to "eight rules", disambiguate reason requirement (only when status=blocked)
- SKILL.md activation: fix config path from {project-root}/_bmad/config.yaml to {project-root}/_bmad/core/config.yaml (matches other BMM skills)
- customize.toml + SKILL.md Workspace: drop {date} from default run_folder_pattern (spec-{slug}); same slug = same folder = trivial in-place update, no glob-and-pick-most-recent needed. Override available for users who want dated history.
- spec-template.md: rename "## Success signals" (plural) to "## Success signal" (singular) to match SKILL.md kernel naming
- SKILL.md Frontmatter conventions: fix adopted-companion example path from _bmad-output/ux-designs/foo-ux/DESIGN.md to ../../ux-designs/ux-foo-bar-2026-05-23/DESIGN.md (matches actual flat-output convention)
- SKILL.md Spec Law: fix double-period typo in rule 2 ((stack, conventions)..)
- SKILL.md Overview: fix awkward "bloat with expansive line item details the kernel" phrasing; drop software-flavored downstream consumer list since bmad-spec is now a core skill serving any domain

* fix(bmad-spec): drop {planning_artifacts} dependency; output to {output_folder}/specs

bmad-spec is a core skill but its default path used {planning_artifacts}, a bmm-module variable. Core-only installs (no bmm) would fail at activation when the resolver tried to expand the path.

Land specs directly under {output_folder}/specs/spec-{slug}/ instead. Works in any install regardless of installed modules, and aligns with the long-term BMad direction of grouping artifacts as siblings under {output_folder}/<type>/ rather than nested under planning vs implementation parents.

In bmm installs, adopted-companion paths from spec to UX/PRD pick up one extra .. (e.g., ../planning-artifacts/ux-designs/<run>/DESIGN.md) since the spec folder is now one level up from planning-artifacts. Examples in SKILL.md and headless-schemas.md updated. module-help.csv output-location updated and stale -{date} fragment removed.

* docs(bmad-spec): add reference docs, trim headless schema, tighten defaults

- Add full bmad-spec entry to docs/reference/core-tools.md and table-row
  stubs to cs/fr/vi-vn/zh-cn (full translation pending).
- Strip headless-schemas.md to a minimal {status, files} success response
  and {status, error_code, reason} blocked response. Drop spec_path,
  capabilities, verdict, decision_log_path — all derivable from the files
  themselves.
- Narrow customize.toml persistent_facts default from recursive glob to
  single {project-root}/project-context.md; document override path.
- Drop unused {doc_workspace} convention line from SKILL.md.
- Clarify Self-Validate verdict handling for interactive vs headless.
- Document missing_slug error code in SKILL.md + headless schema.
2026-05-24 14:08:34 -05:00
pbean 1fb1cf5ee6 bug: fixed atomicwrites 2026-05-23 22:13:25 -07:00
pbean a0fba4b824 fix(bmad-module): make skill self-contained so it works after npx install
The skill is copied into _bmad/core/skills/bmad-module/ by the installer,
which strips node_modules, ships no package.json under the skill, and never
runs npm install there. Bare `import 'yaml'`/`import 'semver'` therefore
crashed at module load (ERR_MODULE_NOT_FOUND, exit 1) before any structured
exit code could fire. Every other installed script is zero-third-party-dep.

- Vendor the real yaml@2.8.4 as a deterministic esbuild single-file bundle
  (scripts/lib/vendor/yaml.mjs), imported by relative path. Guarantees
  byte-identical manifest.yaml round-trips with BMAD core's writer, which uses
  the same library + options (tools/installer/core/manifest.js).
- Drop semver for a node:-only semver-lite.mjs (valid/validRange),
  parity-tested against the real semver across 469 cases (400 fuzzed).
- Fix a third bare yaml import that the original report missed (frontmatter.mjs).
- Make bmad-module.mjs a zero-import launcher that maps any load failure to a
  new documented EXIT.TOOLING (5) with reinstall guidance instead of leaking a
  raw ESM stack trace; the verb dispatcher moves to cli.mjs.
- Enforce vendor freshness so a yaml/esbuild bump can't ship a stale bundle:
  build-vendor.mjs --check is wired into npm test (pre-commit), npm run quality,
  and the quality.yaml CI validate job. Adds vendor:build / vendor:check scripts.
- Ignore the generated vendor/ dir in eslint + prettier; document the rationale
  in SKILL.md, README.md, and vendor/README.md.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-23 17:29:46 -07:00
Brian ee47e30cf6
refactor(bmad-ux): spine-based UX skill (DESIGN.md + EXPERIENCE.md) (#2413)
* refactor(bmad-ux): replace bmad-create-ux-design with lean spine-based bmad-ux

* refactor(bmad-ux): adopt DESIGN.md spec, split into two-file spine, align prd/brief

DESIGN.md (visual identity per the Google Labs spec) and EXPERIENCE.md
(behavior, flow, IA) replace the single design.md spine. EXPERIENCE.md
cross-references DESIGN.md tokens via the spec's {path.to.token} syntax.

Example suite restructure
- 3 DESIGN.md examples: editorial (Stitch source / Linen & Logic), calm
  native mobile (Quill), shadcn-on-Tailwind web SaaS (Drift)
- 2 paired EXPERIENCE.md examples (Quill, Drift); Linen & Logic unpaired
  to model the Stitch handoff scenario
- Replaces the prior 2-example combined spine set

Discovery additions (outcome-driven, one line each)
- Source scan: glob {planning_artifacts}/ for candidates, parent never reads
- Form-factor: resolve before IA closes; journeys often derive it
- Surface closure: every stated need has a surface, every surface a journey
- Named-protagonist journeys (Mary, not "the user")
- Design handoff working mode (extensible producer registry, default: Stitch)

PRD and brief alignment with same insights
- bmad-prd: dropped standalone Primary Persona section from template;
  renamed "Personas + Journeys" entry to "Journey-led"; named-protagonist
  rule on UJs; form-factor probe; validation checklist updated
- bmad-product-brief: form-factor surfaced in Discovery topics

Quality scan fixes
- Added ## Overview heading; renamed ## Activation to ## On Activation
- Replaced ../ paths in example assets with {planning_artifacts}/
- Sources section compressed (abstract delta-only rule)
- Working mode aligned to "Fast path" / "Coaching path" BMad-wide convention

New
- references/design-md-spec.md: working summary of the spec for the LLM
- customize.toml: design_md_examples, experience_md_examples,
  design_handoffs registries
- .prettierignore: ignore .analysis/ quality-scan artifacts repo-wide

* refactor(bmad-ux): activation parity with prd/brief, opt-in reviewer gate, no headline grade

- Restructure On Activation as numbered six-step list mirroring bmad-prd
  and bmad-product-brief, restoring the explicit key-resolution list that
  earlier crammed-paragraph form had dropped (planning_artifacts and
  friends were silently unresolved at Create).
- Make Reviewer Gate opt-in and lens-selectable. At Finalize, ask before
  spending tokens on parallel reviewer subagents; at Validate intent,
  skip that question but still confirm lens picks. Stops the auto-run
  WCAG audit on hobby-stakes work.
- Drop the overall validation grade. Per-category verdicts and severity
  counts already say what is true; a single headline grade conflated
  design rigor with release readiness and led "POOR" pills landing on
  reports whose own bodies described the work as strong. Removed from
  references/validate.md (ladder rule + markdown twin), HTML template
  (grade pill div + CSS vars + classes).
- Trim creative-tools.md: drop the Custom entries section. Runtime
  prompt files should only carry what the LLM needs to act in this
  moment; how-to-extend-via-TOML is setup-time human documentation
  already covered by customize.toml comments.

* fix(bmad-ux): align validation report template with 8-category rubric

Template placeholders referenced 'Decision-readiness' and 'seven dimensions'
from the prior rubric. Replace with TEMPLATE_CATEGORY_NAME and inline the
eight canonical categories from references/validate.md so the synthesis pass
names them verbatim.

* fix(validate-skills): remove stale WF-01/WF-02 rules

WF-01/WF-02 were originally scoped to workflow.md files (now mostly gone)
but had been generalized to flag name/description in any non-SKILL.md
markdown. That over-captured legitimate spec files — e.g. DESIGN.md
examples in bmad-ux/assets/ that carry name/description per the Google
Labs DESIGN.md spec.

Step files are already covered by STEP-06. Rule count: 14 → 12.

* fix(bmad-ux): address PR review followups

- validation-report-template.html: severity badge class is badge-sev-*,
  not sev-* (the comment misled the synthesis pass).
- Sweep dangling bmad-create-ux-design references: module-help.csv,
  bmad-agent-ux-designer/customize.toml, bmad-prd/SKILL.md handoff list,
  workflow-map.md (en + 4 translations), getting-started.md (en + 4
  translations). Workflow-map output column updated to DESIGN.md +
  EXPERIENCE.md.
- references/validate.md: Markdown capitalized as a proper noun.
2026-05-22 23:16:06 -05:00