13 Commits

Author SHA1 Message Date
Alex Verkhovsky fa1637ee40 build: move the Node toolchain into docs-site (#2834)
The root package.json, lockfile, .nvmrc, prettier ignore file and
.npmignore are gone. docs-site has its own package.json and lockfile
with the Astro, ESLint and Prettier dependencies, and its scripts run
relative to that directory. tools/quality.py, both workflows and the
docs all call npm inside docs-site.

stamp_release.py stamps only the 29 skill manifests now; the version
lives nowhere else on this branch. The tests for package stamping go
with it.
2026-09-05 18:11:37 -06:00
Alex Verkhovsky 40c4572a31 build: declare the Python toolchain in pyproject.toml (#2830)
* build: declare the Python toolchain in pyproject.toml

Pin the dev environment (pytest, pytest-xdist, pyyaml, ruamel.yaml, ruff)
with uv instead of a one-line --with list in package.json. The project is
marked non-packaged: the tree itself is what gets installed, and shipped
scripts keep their inline metadata. The validate CI job now runs on uv
alone, without Node, and gains a ruff check.

* style: apply ruff to tools and skill scripts

Mechanical output of ruff check --fix and ruff format under the new
config, plus four hand edits: explicit zip strictness in setup.py and
test_sprint_status.py, an f-string for the hex colour in brain.py, and a
noqa on the sys.path-dependent import in render_skill.py. No behaviour
change; 500 tests pass.

* build: declare Python 3.11 as the floor of every shipped script

Eighteen scripts declared 3.8 or 3.10 inline while ruff targeted 3.11,
so an autofix could introduce syntax those scripts did not advertise.
The lower floors were never reachable: every skill that carried one
also runs a 3.11 hub script, and uv fetches whatever interpreter a
script asks for. All inline metadata now says 3.11, and a test keeps
the inline floors equal to requires-python and the ruff target.
2026-09-05 12:28:22 -06:00
Alex Verkhovsky bdec5aafe0 feat(release): stamp dev releases and package metadata 2026-09-05 03:00:11 -06:00
Alex Verkhovsky 7807036e29 fix(dist): point skill update sources at BMAD-METHOD 2026-09-05 02:35:34 -06:00
Alex Verkhovsky 42189fe117 fix(release): reject build metadata in the version stamper
setup.py drops build metadata when ordering versions, so 6.12.0+hotfix
compares equal to 6.12.0 and a release stamped that way is invisible to
every installed copy. The runbook warned against it; the stamper accepted
it. Reject it before anything is written.

The version rule is now "orderable and distinguishable", one notch
stricter than setup.py's orderability - the contract test pins that gap
and pins the premise it rests on.
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 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 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 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