2235 Commits

Author SHA1 Message Date
Alex Verkhovsky 4efb4c159d feat(help): route from each module's own knowledge pointer
The hub bound every route to references/help.md and was told to treat no
manifest key but `module` as routing, so a module shipped from another
repository was visible and unroutable. Discovery now reads each sound
manifest's free-form `knowledge` text and follows it, for the module the
question concerns, to the document it names.

help.md stops being privileged: it opens with the discovery model and carries
its method/toolbox content as a labelled section — which is simply what those
two modules' manifests point at.
2026-09-05 01:43:24 -06:00
Alex Verkhovsky 3baa7c64fe fix(dist): point knowledge at references/help.md, the file that exists
The knowledge value named `reference/help.md`, but the bmad skill has no
reference/ directory — the file is references/help.md. Nothing ever resolved
the value, so the dangling pointer reached 30 manifests and the release
stamper's constant unnoticed.
2026-09-05 01:43:24 -06:00
Alex Verkhovsky 4477585ee1 fix(setup): stop rejecting a module's own knowledge value
parse_packaged_manifest required `knowledge` to equal one hardcoded literal
naming the bmad skill's own help document, so no second module could ship a
manifest that parses. The value is then discarded — it is not a field on
ParsedManifest and nothing reads it — so the check bought nothing.

The cost was disproportionate. discover_installed_copies parses every sibling
manifest before doing any work, so one unacceptable value aborted `bmad update`,
`setup`, and `doctor` for the whole project, including modules whose own
manifests were fine.

This is also what the format spec asks for: the packager rejects unknown or
malformed keys, while `bmad` ignores what it does not recognize, so a manifest
from a newer format cannot break an older hub. stamp_release.py keeps its
equality check — it is the packager, and it only ever runs against this repo's
manifests.

`knowledge` stays required and non-empty. CIS points it at its published
llms.txt, the same remote-docs grounding help.md already names for BMM.
2026-09-05 01:43:24 -06:00
Alex Verkhovsky 1c086ac987 feat(help): fall back to remote docs for unanswerable questions
help.md now names https://docs.bmad-method.org/llms.txt as the place to
look when it and the installed skills cannot answer a BMad question; the
index also names the source repository as the final authority. The hub
skill's constraints direct that fetch before conceding a limitation,
restoring the remote-docs grounding the CSV-era bmad-help had via its
_meta row.
2026-09-05 01:43:24 -06:00
Alex Verkhovsky 94ef73af22 fix(setup): refuse to replace a symlinked _bmad with a clear message
setup and doctor rewrite _bmad wholesale via replace_dir, so running
them through a symlinked _bmad crashed mid-flight with a raw
IsADirectoryError from the backup rename. Reads through the symlink
are the point of symlinking and stay untouched; only the write paths
now fail fast, naming the link target and the --project-root to use
against the real installation. The doctor flow rejects in its
missing-_bmad pre-flight so --list-config-questions --doctor fails
before interrogating the user.
2026-09-05 01:43:24 -06:00
Alex Verkhovsky eaeebebd76 feat(setup): report plugin-shipped copies as plugin-managed in the update check 2026-09-05 01:43:24 -06:00
Alex Verkhovsky baf0fe9aea feat(dist): add a knowledge key pointing every manifest at the bmad help doc 2026-09-05 01:43:24 -06:00
Alex Verkhovsky 3f0c83f1d9 chore(dist): move the bmad hub skill to the toolbox module 2026-09-05 01:43:24 -06:00
Alex Verkhovsky 1db98c5b14 docs(release): point step 7 at the release script itself, not the removed README section 2026-09-05 01:43:24 -06:00
Alex Verkhovsky 917694c426 chore(plugins): drop the obsolete Codex marketplace lid — Codex ships from bmad-plugins 2026-09-05 01:43:24 -06:00
Alex Verkhovsky 9535e0968c docs(release): tag each release so force-pushed main keeps history 2026-09-05 01:43:24 -06:00
Alex Verkhovsky f7ec2f77a0 feat(dist): ship plugins from bmad-plugins; split skills into method and toolbox modules
The seven standalone support skills that help.md lists as belonging to
no path and no stage — brainstorming, forge-idea, deep-recon,
advanced-elicitation, review, party-mode, customize — now carry
module = "toolbox"; the other 22 skills carry module = "method". The
module key names only the distribution grouping; the _bmad/bmm runtime
config path skills read is staged by setup.py independently of it.

The Claude marketplace and the Codex plugin lid leave this repo: both
plugin ecosystems are built by bmad-code-org/bmad-plugins from the
stamped manifests bmad-skills main serves, sharing one skills tree per
plugin. The stamper therefore stamps and validates only the manifests
(exact key set, known module, the one known update source, per-module
byte identity), and the runbook gains a rebuild-the-plugins step.
2026-09-05 01:43:24 -06:00
Alex Verkhovsky d68545414a feat(plugins): split the Claude marketplace into bmad-bmm and bmad-tools
Two marketplace entries share source "./" and list their skills
explicitly, replacing the single plugin whose skills tree was a symlink
to skills/ — with per-plugin subsets the symlink bought nothing. The
plugins/bmad-method lid is deleted. bmad-tools has no skills yet, and an
empty skills list makes Claude Code fall back to scanning skills/, so
its source points at the empty plugins/tools directory instead.

The stamper now validates the whole distribution shape before writing:
every manifest carries exactly module, version, and update_source, with
a known module and the one known source; the marketplace has exactly
one entry per module; and each entry's skills list equals, as a set,
the skills whose manifest carries that module — no orphans, no
double-shipping, no dangling paths (a dangling path is load-bearing:
Claude Code silently falls back to shipping every skill for one). The
manifest byte-identity check is now per module, since manifests
legitimately differ in the module line.

Verified live: bmad-bmm installs with 29 skills, bmad-tools with 0,
and a scratch stamp of the real tree passes.
2026-09-05 01:43:24 -06:00
Alex Verkhovsky 38156784da docs(release): note the raw.githubusercontent CDN delay after a release 2026-09-05 01:43:24 -06:00
Alex Verkhovsky 73ebd91fd1 perf(test): parallel, quiet, cache-free Python test runs
Run the suite with pytest-xdist (-n auto): 17.7s to 5.9s wall measured
locally. Quiet output when green (-q), short tracebacks and a summary
of non-passing outcomes when not (-ra --tb=short). Write nothing to
disk: -p no:cacheprovider stops .pytest_cache and
PYTHONDONTWRITEBYTECODE=1 stops __pycache__; a warm single-directory
bytecode cache measured no faster than cold, so the cache bought
nothing.

Parallelism exposed a race in test_recon_kit.py: two test classes
shared the fixture path tests/_report.md and deleted it after use, so
xdist workers could unlink it under each other. All four file-fixture
tests there now write into per-test temporary directories.
2026-09-05 01:43:24 -06:00
Alex Verkhovsky 26695850a4 fix(release): fail the stamp when a skill directory lacks its manifest
The stamper globbed for manifests, so a skill directory without
module-manifest.toml was silently skipped and would ship unstamped
with no version or update_source. Enumerate skill directories and
fail naming the offender before anything is written.
2026-09-05 01:43:23 -06:00
Alex Verkhovsky edb144f31f feat(release): stamp every Claude marketplace plugin entry
The tools/bmm split will put a second plugin into the Claude marketplace,
so the stamper no longer hardcodes plugins[0] and the bmad-method path.
It now stamps the version of every entry in the marketplace plugins
array, discovers plugins/*/.claude-plugin/plugin.json by glob, and
requires the marketplace entry count to match the plugin manifest count.
Each textual rewrite is proven against the parsed JSON: the result must
equal the original tree with only the intended version nodes changed,
and a "version" key anywhere else in a stamped file fails the run
before anything is written.
2026-09-05 01:43:23 -06:00
Alex Verkhovsky c61a3d2554 refactor(release): stamp only the skill manifests
The version's single source of truth is skills/*/module-manifest.toml.
Plugin metadata (Claude marketplace and plugin.json, Codex plugin.json)
is no longer stamped — whatever builds those artifacts reads the version
from skills/bmad/module-manifest.toml. The textual single-"version"-key
rewrite would have broken the moment the Claude marketplace gained a
second plugin, and those lids are likely to leave this repo anyway.

Tests updated: JSON-stamping cases replaced with a regression test that
plugin metadata is left byte-identical; runbook expectation adjusted.
2026-09-05 01:43:23 -06:00
Alex Verkhovsky 120823d140 feat(release): add version stamper and release runbook for the skills mirror
Make the bmad-skills mirror's main branch release-only: dev now mirrors
this branch unstamped, and main is always current dev plus one stamp
commit cut by following tools/release.md.

- tools/stamp_release.py: stdlib-only stamper that validates an
  orderable SemVer argument (rejects -dev, which setup.py cannot
  order), rewrites the version line in every skills/*/module-manifest.toml
  textually to keep the manifests byte-identical, and sets the version in
  .claude-plugin/marketplace.json, plugins/bmad-method/.claude-plugin/
  plugin.json, and .codex-plugin/plugin.json without reformatting them.
  Nothing is written unless every file validates; after writing it
  re-reads everything and fails naming the offending path if the
  manifests diverge or any file carries a different version.
- tools/release.md: self-contained runbook — clean detached checkout of
  origin/dev, human-chosen version that differs from what main serves,
  stamp, review, commit, force-with-lease push of HEAD:main.
- tools/tests/test_stamp_release.py: unit tests covering the happy path,
  invalid and -dev versions, missing version line/key, divergent
  manifests, idempotent re-stamp, and formatting preservation.
- TEMP-RELEASE-PROCESS.md: the mirror is the testbed for both the npx
  install/update flow and the release process that feeds it. Records the
  dev/main branch model, the 0.0.0-next.N throwaway versions to stamp
  there, and a note to replace the file with the real release
  instructions before this branch merges to main.
- AGENTS.md: replace the test-mirror section with a pointer to that file.
- .npmignore: exclude the new tool files and the temporary runbook from
  the npm tarball.
2026-09-05 01:43:23 -06:00
Alex Verkhovsky 0e3ac1f0b5 chore: align plugin and package versions with module manifests
Every version declaration now reads 6.11.0-next, matching the
module-manifest.toml files the update check compares against.
2026-09-05 01:43:23 -06:00
Alex Verkhovsky 1d6b0433ed fix(plugins): serve the Codex plugin from the repo root
Codex plugin add copies the plugin directory without dereferencing
symlinks, so the nested plugin shipped no skills. Root the Codex
plugin at the repo so the cache copy carries the real skills tree.
2026-09-05 01:43:02 -06:00
Alex Verkhovsky 8cfa5d789b feat(plugins): add Claude and Codex lids over the flat skills tree
Point both marketplaces at plugins/bmad-method. That folder holds the
host manifests and a skills/ symlink into the repo skills tree so an
install copies the plugin directory and Claude dereferences the payload.
Track the Codex catalog at .agents/plugins/marketplace.json.
2026-09-05 01:43:02 -06:00
Alex Verkhovsky aed29c678c docs: document the bmad-skills test mirror push 2026-09-05 01:43:02 -06:00
Alex Verkhovsky 2894d36917 chore: drop dead installer registry and unused npm tooling
bmad-modules.yaml was only consumed by the deleted installer.
yaml-lint and the staged prettier wrapper had no remaining callers.
2026-09-05 01:43:02 -06:00
Alex Verkhovsky f8926dc962 chore(test): collapse npm scripts onto colocated suites
Tests now live under tools/, skills/, and docs-site/. Discover them
there instead of listing deleted per-suite targets.
2026-09-05 01:43:02 -06:00
Alex Verkhovsky 6a098b6e6e chore: drop unused Augment review config and stale docs prompts
Augment is no longer in use, and the tools/docs working prompts have
not been run in months.
2026-09-05 01:43:02 -06:00
Alex Verkhovsky 121889775e refactor: rename website/ to docs-site
The directory is the Astro docs site, not a generic website, and the old name collided with the docs/ content tree.
2026-09-05 01:43:02 -06:00
Alex Verkhovsky 41faf4f1da chore: remove unused SVG visual-diff helper
The script's default diagram has been gone since January, and nothing in the build or quality pipeline invoked it.
2026-09-05 01:43:02 -06:00
Alex Verkhovsky 632b55f4fd chore(test): rewrite snapshot renderer tests in Python
The Node suite still installed skills under `_bmad/bmm/`. Cover the current
host-skill layout from render_skill.py itself, and keep a few internals
tests for publish paths that are awkward to hit through a full skill.
2026-09-05 01:43:01 -06:00
Alex Verkhovsky fdde307a43 chore(test): remove sprint-status template sync check
Drop test/test-template-sync.js and its hook in test:sprint-planning.
The retrospective fixture comment now says to sync the vendored
template by hand when the source changes.
2026-09-05 01:43:01 -06:00
Alex Verkhovsky 0146907c24 chore(test): colocate website tests with the Astro site 2026-09-05 01:43:01 -06:00
Alex Verkhovsky 3b64cf6fad chore(test): colocate skill-validator fixtures with the Python tests 2026-09-05 01:43:01 -06:00
Alex Verkhovsky fcafb7bb3a chore(test): delete the stale adversarial-review-tests directory 2026-09-05 01:43:01 -06:00
Alex Verkhovsky 20a9854d13 style(skills): finish the dot-slash reference sweep
All intra-skill references are now spelled from the skill root.
checkpoint-preview's step files move into steps/ (matching code-review)
and generate-trail.md into references/ so the whole chain falls under
the file-refs checker; 305 refs verified, both validators clean.
2026-09-05 01:43:01 -06:00
Alex Verkhovsky adfb619e18 style(prfaq): spell intra-skill references from the skill root
Drops every dot-slash ref; all twelve now fall under the file-refs
checker's slash rule (289 refs verified, 0 broken).
2026-09-05 01:43:01 -06:00
Alex Verkhovsky 09f4b119d4 chore: rewrite the deterministic skill validator in Python
Replace tools/validate-skills.js with a stdlib Python 3.11 port and rewire
validate:skills and test:skills onto it. Observable behavior is preserved,
including the JS frontmatter quirks; in-skill file walks are sorted.
2026-09-05 01:43:01 -06:00
Alex Verkhovsky b33544ae55 feat(tools): check backticked skill-relative refs, flag stray files, prune dead grammar
The checker's V4/V5 grammar (exec attrs, invoke-task, step metadata,
Load directives, quoted dot-paths, {_bmad} shorthand) matches nothing
in the flat tree; it verified only four script filenames. It now
resolves backticked slash-paths against the containing file's directory
and the skill root, flagging a missing file only when the path's first
directory exists — paths without one are prose, so the current tree
stays at zero false positives (276 refs verified, up from 135). Files
sitting directly under skills/ are reported as stray.
2026-09-05 01:43:01 -06:00
Alex Verkhovsky da9034dbc2 fix(tools): repoint the file-refs checker at the flat skills tree
The checker still scanned src/, which the flattening removed, so it
crashed on any fresh checkout and failed the quality gate. It now scans
skills/; the obsolete core-skills/bmm-skills module mapping is replaced
by _bmad/scripts/ -> skills/bmad/scripts/, with the install-only and
install-generated skip lists unchanged.
2026-09-05 01:43:01 -06:00
Alex Verkhovsky 8d8c577596 chore(skills): delete the deprecated bmad-generate-project-context shim
It forwarded to bmad-project-context, which help.md routes to directly.
Docs mentions are historical migration notes and stand as written;
removals.txt has no consumer since the JS installer was deleted.
2026-09-05 01:43:01 -06:00
Alex Verkhovsky 0b26ac989b docs(bmad): add the standalone support skills to the routing guide
The former core skills ship in the same flat unit but belong to no
path or stage; help.md never mentioned them, so the router could not
recommend them.
2026-09-05 01:43:01 -06:00
Alex Verkhovsky 91a7852a2e fix(skills): add the version pair to every module manifest
setup.py requires a version field and every shipped TOML manifest
lacked one, so all 30 failed parse_packaged_manifest. 6.11.0-next is
valid semver and orders below the eventual 6.11.0 release, so dev-tree
installs report newer-available once main ships.
2026-09-05 01:43:01 -06:00
Alex Verkhovsky aed23a3a0b refactor(skills): extract hub help.md and ship TOML manifests
Move the duplicated BMM routing guide into the bmad hub skill and replace
every module-manifest.md with a two-key TOML file parsed by stdlib tomllib.
Drop PyYAML from setup.py and from test:npx-skills.
2026-09-05 01:43:01 -06:00
Alex Verkhovsky 9cace71719 chore: port the web-bundles release packager to Python
Stdlib zipfile replaces the zip-CLI dependency; behavior and output
are otherwise unchanged. Verified live on both the success path (all
6 bundles packaged) and the missing-directory refusal path.
2026-09-05 01:43:01 -06:00
Alex Verkhovsky 0cfe6865e0 chore: delete orphaned format-workflow-md and workflow-path-regex tools 2026-09-05 01:43:01 -06:00
Alex Verkhovsky 32531126aa chore(ci): drop the stale test:install step and its README entries 2026-09-05 01:43:01 -06:00
Alex Verkhovsky 84def5a7d3 refactor(skills): flatten sources into a root skills/ tree
Move core and BMM skills to skills/<id>/ so npx skills can install
the repo as-is. Copy the BMM module manifest into every skill, move
the shared Python runtime into skills/bmad/scripts/, drop src/, and
retarget repo tests at the new locations.
2026-09-05 01:43:01 -06:00
Alex Verkhovsky e450ebc70d chore: rewrite the file reference checker in Python
Port tools/validate-file-refs.js to tools/validate_file_refs.py (PEP 723,
pyyaml) preserving detection, resolution, CLI, and CI-annotation behavior.
CSV extraction is dropped: .csv leaves the scan set, and the CSV test and
fixtures are deleted rather than ported. The npm dependencies block (yaml,
csv-parse) goes away with its sole consumer; validate:refs and test:refs
now run via uv, and test:refs joins the quality chain. A new stdlib
unittest suite covers extraction, mapping, skip lists, UNRESOLVED vs
BROKEN, leak detection, exit codes, and the GitHub Actions output path.

The port also hardens what the JS left fragile: multi-document YAML is
scanned in full, non-UTF-8 bytes are replaced instead of crashing the
run, and directory symlinks are not traversed.
2026-09-05 01:43:01 -06:00
Alex Verkhovsky 3c12a07852 chore: drop the npm publish workflow and dead dependencies 2026-09-05 01:43:01 -06:00
Alex Verkhovsky 3018779d53 chore: drop installer entry point and its dependencies 2026-09-05 01:43:01 -06:00
Alex Verkhovsky 636f8e277d refactor!: remove the publish script and the v6 shim skills 2026-09-05 01:43:01 -06:00