• v0.3.2 a1e59f0165

    Release v0.3.2
    Some checks failed
    manifest-check / manifest-vs-tag consistency (pull_request) Successful in 4s
    manifest-check / check (pull_request) Successful in 0s
    release-draft / create Forgejo draft release (pull_request) Failing after 4s
    release-draft / draft (pull_request) Failing after 0s
    Stable

    quartermaster released this 2026-06-24 22:44:16 +02:00 | 1464 commits to main since this release

    v0.3.2 patch sprint — closes the v0.3.x observation queue from the
    v0.3.1 review cycle: the #16 chicken-and-egg closure (toolkit's own
    consumer-side @v0.2.0@v0.3.1 across all 3 reusable-invoking
    workflows), the #29 install-deps observability echo, and the #30/#34
    fragment-kind-side discipline restructure folded into docs/conventions.md.

    First fully-dogfooded chicken-and-egg-closure cut: this is the
    first prep-PR-merge cycle where the autonomous release-draft.yml
    exercises the v0.3.1 inline-collapse fix (per #16). Substrate-of-record
    milestone for the toolkit-on-toolkit feedback loop.

    Internal

    • .forgejo/workflows/release-draft.yml (consumer-side): bump uses: ...@v0.2.0 + toolkit_ref: v0.2.0@v0.3.1 to pick up the inline-collapse fix shipped in v0.3.1. Closes the #16 chicken-and-egg for the toolkit's own autonomous release-draft path; the next v0.3.x cut's prep-PR merge will exercise the fixed reusable via dogfood. External consumers (cellblock + tmux-tell migrations) pick up the bump at adoption time.

    • _release-prep.yml + _release-draft.yml + _manifest-check.yml: add echo "[install-deps] complete" at the end of each install-deps step. Makes the step's run-state visible in future logs (previously the step produced zero output when pre-baked deps were present, making it indistinguishable from a skipped step — the ambiguity that bit the #16 diagnostic). See #29. Observability-not-author-discipline pattern; same family as #35.

    • docs/conventions.md: restructure the chore-vs-feat subsection per "state the consumer-facing-surface test once, map onto both surfaces" — the same test applies to commit subjects AND fragment kinds. Folds #30 (adopter-friendly worked-instance, drops internal PR refs) + #34 (fragment-kind side of the discipline) into one restructure. Adds an asymmetry note explaining when chore: (silent) vs .internal.md (visible in ### Internal) is the right home.

    • .forgejo/workflows/release.yml + manifest-check.yml (consumer-side): bump uses: ...@v0.2.0 + toolkit_ref: v0.2.0@v0.3.1 to match release-draft.yml (bumped in v0.3.2 via #36). Closes the mixed-version dogfood version-skew Surveyor flagged on #36 review — the toolkit now exercises its OWN v0.3.1 reusables consistently across all 3 consumer-side workflows + picks up the v0.2.1 sudo-fix on the release-prep + manifest-check paths.

    Downloads
  • v0.3.1 b8ae12934c

    Release v0.3.1
    Some checks failed
    manifest-check / manifest-vs-tag consistency (pull_request) Successful in 4s
    manifest-check / check (pull_request) Successful in 0s
    release-draft / create Forgejo draft release (pull_request) Failing after 4s
    release-draft / draft (pull_request) Failing after 0s
    Stable

    quartermaster released this 2026-06-24 21:59:55 +02:00 | 1472 commits to main since this release

    v0.3.1 patch sprint — closes 3 v0.3.x candidates surfaced during
    the v0.3 cut: a load-bearing workflow fix that unblocks autonomous
    release-draft cycles, a bats portability fix that removes 2 hidden
    test failures, plus the chore-vs-feat commit-subject guidance that
    prevents bump-escalation.

    Consumer-bump note: the _release-draft.yml fix below only takes
    effect when consumers bump their release-draft.yml's uses: ...@v0.2.0
    uses: ...@v0.3.1. Toolkit's own consumer wrapper gets bumped in a
    post-cut PR; cellblock + tmux-tell migrations pick it up at adoption time.

    Fixed

    • _release-draft.yml: inline-collapse version-normalization into the script-invocation step. Sidesteps a runtime step-skip that was leaving the script's --version empty on every release-draft cycle. See #16.

    • tests/conventional-commits.bats: rewrite the 4 cc_parse_subject tests to compare against $output directly (with explicit newline boundaries via $'...' syntax) instead of ${lines[N]} indexing. Fixes 2 pre-existing failures on bats 5.2.37+ where the run wrapper collapses empty strings out of the lines array, silently shifting indices. Test logic + the function under test are unchanged. See #18.

    Internal

    • docs/conventions.md: new subsection "Choosing chore: vs feat: for internal-infrastructure changes" with the consumer-facing-surface test + the v0.2.1 cut-escalation worked instance. Helps human authors avoid the cut-escalation footgun where a chore:-shaped commit lands as feat: and pulls the next cut into a higher version lane. See #14.
    Downloads
  • v0.3.0 ff328f697b

    Release v0.3.0
    Some checks failed
    manifest-check / manifest-vs-tag consistency (pull_request) Successful in 4s
    manifest-check / check (pull_request) Successful in 0s
    release-draft / create Forgejo draft release (pull_request) Failing after 4s
    release-draft / draft (pull_request) Failing after 0s
    Stable

    quartermaster released this 2026-06-24 20:52:51 +02:00 | 1478 commits to main since this release

    v0.3 sprint — tmux-tell migration enablement (closes
    release-toolkit#4).
    4 config additions + a migration guide that let pre-1.0 Go projects
    (tmux-tell + similar) adopt the toolkit without compromising the
    defaults for strict-SemVer projects. Each addition is opt-in;
    existing consumers see zero behavior change.

    This is the first fully-dogfooded MINOR cut — operator dispatched
    release.yml in the Forgejo UI, the toolkit's own reusable
    workflows fired autonomously, all 4 config additions exercised in
    a single release. Substantive milestone closing the v0.3 arc.

    Added

    • pre_v1_breaking_to_minor config flag (opt-in) lets pre-1.0 projects in settling-shape express "breaking change" semantically (in commits or fragments) without triggering the major-version commitment that 1.0+ implies. Set pre_v1_breaking_to_minor: true in release-toolkit.yml to downgrade majorminor bumps while the manifest is 0.x.y. Once the project crosses 1.0.0, the flag silently becomes a no-op — major bumps survive as major. Default false (strict SemVer); the policy is opt-in via the config flag. See docs/conventions.md for mechanics + semver_apply_pre_v1_policy for the implementation. First v0.3 / release-toolkit#4 slice (1 of 5).

    • version_files: [] accepted as a valid config — opts into tag-is-version mode where git describe --tags is the authoritative version source. The lockstep check in manifest-check.sh step 2 emits SKIP rather than failing; step 4 (tag-vs-manifest) treats the git tag as its own manifest (no comparison required). release-prep.sh does NOT bump any files when configured this way; the new version propagates via the CHANGELOG transition + the tag at release-draft + publish. Distinguishes "field missing" (defaults to VERSION per v0.1 behavior) from "field explicitly empty" (tag-is-version opt-in). Right shape for Go projects with -ldflags version injection (tmux-tell + similar) and projects where the tag IS the source of truth. See docs/integration.md for the config example. Second v0.3 / release-toolkit#4 slice (2 of 5).

    • section_format: { tag_prefix, separator } config lets consumers customize the CHANGELOG.md section heading shape. Defaults match Keep a Changelog's example (## [vX.Y.Z] - YYYY-MM-DD); consumers can override either or both fields independently. Empty string for tag_prefix is a meaningful opt-out that drops the v-prefix (## [X.Y.Z] — matches tmux-tell's existing shape); separator: " — " switches to em-dash. The heading is constructed as ## [<tag_prefix><X.Y.Z>]<separator><DATE>. changelog_transition gains 2 new optional positional params (5th = TAG_PREFIX, 6th = SEPARATOR) with ${var-default} (not ${var:-default}) semantics so explicit empty string is preserved. See docs/integration.md for examples + the missing-vs-empty semantic distinction. Third v0.3 / release-toolkit#4 slice (3 of 5).

    • post_bump_hooks: [path] config lets consumers register hook scripts that fire AFTER version_files are bumped + BEFORE the git commit. Used for per-consumer bookkeeping that doesn't belong in the toolkit's general flow (updating a --version example in README to match the cut, regenerating versioned docs, syncing vendored manifests). Each hook is an executable script invoked from the consumer repo root + receives RELEASE_TOOLKIT_NEW_VERSION + RELEASE_TOOLKIT_NEW_TAG + RELEASE_TOOLKIT_PREVIOUS_TAG env vars. Zero exit → release-prep continues; non-zero exit aborts the cut with the hook's stderr propagated (no commit, no push, no PR). Multiple hooks run in declaration order; first failure aborts the chain. Hook paths are operator-controlled (no injection risk) and properly arg-quoted (paths with spaces are safe). See docs/integration.md for the full mechanics + safety surfaces. Fourth v0.3 / release-toolkit#4 slice (4 of 5).

    • docs/migration/tmux-tell.md migration guide — step-by-step migration walkthrough for projects with tmux-tell's substrate shape (Go projects with no VERSION file, build-time version injection via -ldflags, pre-1.0 BREAKING-as-minor discipline, em-dash CHANGELOG headings, per-consumer release-time bookkeeping). Covers: tmux-tell-shape release-toolkit.yml config; 4 consumer-side workflow wrappers; the README pin-update hook script with the post_bump_hooks env-var contract; trust-model checkpoint (branch-protect the hook + the config); one-cycle parity check before retiring the old workflow chain. Generalizes to any pre-1.0 Go project with similar shape; cellblock's node-strategy migration doesn't need any of these flags. Fifth + final v0.3 / release-toolkit#4 slice (5 of 5).

    Downloads
  • v0.2.1 e6e156052a

    Release v0.2.1
    Some checks failed
    manifest-check / manifest-vs-tag consistency (pull_request) Successful in 5s
    manifest-check / check (pull_request) Successful in 0s
    release-draft / create Forgejo draft release (pull_request) Failing after 4s
    release-draft / draft (pull_request) Failing after 0s
    Stable

    quartermaster released this 2026-06-24 19:15:18 +02:00 | 1488 commits to main since this release

    Fixed

    • Sudo-aware install-deps step in _release-prep.yml + _release-draft.yml + _manifest-check.yml. v0.2.0 hard-coded sudo apt-get install for the yq/jq/curl fallback, which failed opaquely with sudo: command not found on minimal root-only CI images (a common shape: Debian-derived images that run as root with no sudo package installed). v0.2.1 replaces the bare sudo calls with a 3-shape handler: (1) if EUID=0, apt-get directly; (2) else if sudo is on PATH, sudo apt-get; (3) else fail loud with ::error:: annotations naming the missing tools + actionable remedies ("pre-bake into your runner image, run as root, or install sudo"). _release-publish.yml is unchanged — it has no install-deps step (pure tag-format validation). Closes #10.

    • list_fragments warns on unrecognized basenames instead of silently skipping. v0.2.0 dropped fragments named <id>.<kind>.<suffix>.md (e.g., 3.fixed-2.md) without any signal — the parser extracts the LAST dot-segment as kind (fixed-2), which isn't a recognized kind, and the file was treated as "not a fragment" and quietly excluded from the cut. This was caught manually during the v0.2.0 release when a file-count probe surfaced a missing fragment. v0.2.1 emits warning: <path> does not match \..md` (unknown kind in basename) — skippingto stderr so the operator sees the dropped file before the cut consumes the workspace. A smarter parser that accepts...md` shapes is deferred to v0.3 (release-toolkit#9 disposition B). Closes #9.

    Internal

    • Toolkit's own consumer-shape workflows (release.yml + release-draft.yml + manifest-check.yml) added in v0.2.0 so the toolkit cuts itself through its own machinery from v0.2.1+ (closes the bootstrap chicken-and-egg). v0.2.1 is the first cut produced via this path: operator dispatches release.yml → reusable _release-prep.yml@v0.2.0 → release-prep.sh runs → prep PR opens autonomously. No external-consumer surface change; internal substrate-of-record only.
    Downloads
  • v0.2.0 a521998dba

    quartermaster released this 2026-06-24 16:55:53 +02:00 | 1496 commits to main since this release

    Fixed

    • runs_on is now a required workflow_call input on all 4 reusable workflows (_release-prep.yml / _release-draft.yml / _release-publish.yml / _manifest-check.yml). v0.1.0 hard-coded runs-on: docker, which isn't a valid label in most Forgejo runner configurations — including the one this toolkit was developed against — so the reusables would never schedule. Consumers MUST now specify runs_on: <label> matching a runner label that exists in their Forgejo config. BREAKING for v0.1.0 consumers (no consumers existed at v0.1.0 release time, so practical blast radius is zero); update with: blocks to include runs_on: when pinning to @v0.2.0. See docs/integration.md.

    • Defensive newline normalization in fragments.sh::categorize_fragments. Hard-wrapped fragment bullets (where authors wrap at ~70 chars instead of writing single-line bullets per docs/conventions.md) get collapsed to single-line bullets BEFORE the CHANGELOG.md / PR body / release body sees them. State machine preserves blank-line paragraph separators, code fences (including indented fences inside bullets), and column-0 unit boundaries. The convention in docs/conventions.md is now defensive rather than advisory — authors who follow it still produce cleaner sources, authors who slip get correct output anyway.

    Downloads
  • v0.1.0 1dd132018f

    quartermaster released this 2026-06-24 15:31:24 +02:00 | 1503 commits to main since this release

    First release.

    Added

    • The first release of release-toolkit — a shared, Forgejo-native release pipeline you reference instead of copy-pasting release machinery into every repo. It cuts releases, transitions your CHANGELOG, and runs a CI check that catches version-number drift. Consumers reference frankenbit/release-toolkit/.forgejo/workflows/_*.yml@v0.1.0 to adopt the full release flow — with human-approval gates at each stage — without copy-pasting the machinery. See docs/integration.md for the 4-step adoption guide and docs/conventions.md for the conventional-commits + changelog.d/ fragment formats.
    • Two ways to write your CHANGELOG, mixable: conventional commits (feat: / fix: / feat!: / etc.) read from git log, and hand-written changelog.d/<id>.<kind>.md fragment files. Use either or both; the toolkit merges them so a section heading never appears twice. See ADR-0002 for the both-mechanisms reasoning.
    • Multi-stage release flow with human-approval gates at each stage: workflow_dispatch → release-prep PR → Forgejo draft release → operator clicks Publish → release:published event → deploy. Four reusable Forgejo Actions workflows (_release-prep.yml + _release-draft.yml + _release-publish.yml + _manifest-check.yml) implement the four gates. See ADR-0003 for the design reasoning.
    • Built-in manifest-vs-tag CI check via _manifest-check.yml — runs on every PR and catches the usual release-prep mistakes: version numbers out of sync across files, a missing [Unreleased] heading, or a manifest left behind the latest tag. The "manifest >= tag, not strict equality" disposition (see scripts/manifest-check.sh --help) prevents false-positives on every legitimate release-prep PR.
    • Dry-run + operator preview: --dry-run skips remote mutations (no git push, no Forgejo PR creation) but DOES perform local CHANGELOG transitioning + version_file bumps + fragment deletion, so you can preview exactly what a release will do — the full git diff and the API payload — before anything runs. See docs/operations.md for the operator-preview disposition.

    The toolkit ships as bash scripts plus 4 reusable Forgejo Actions workflows; 179 unit + integration tests cover the substrate, shellcheck-clean throughout.

    Fixed

    • changelog_transition now merges sections by kind so a section heading never appears twice in a new release section when both the [Unreleased] content and the fragments contribute the same kind.

    Internal

    • Extracted the version-section extraction logic into a reusable library helper for use by both release-prep.sh and draft-release.sh.
    Downloads