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 8612d316ea fix(release): promote dev to main with fast-forward pushes 2026-09-05 04:32:20 -06:00
Alex Verkhovsky bdec5aafe0 feat(release): stamp dev releases and package metadata 2026-09-05 03:00:11 -06:00
Alex Verkhovsky 04055f1236 chore: bump placeholder version to 6.12.0-next
Main has released 6.12.0, so the module manifests and the package
version now carry the next placeholder above it.
2026-09-05 01:45:00 -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 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 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 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