-
Release v0.3.2
StableSome checks failedreleased this
2026-06-24 22:44:16 +02:00 | 1464 commits to main since this releasev0.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.1across all 3 reusable-invoking
workflows), the #29 install-deps observability echo, and the #30/#34
fragment-kind-side discipline restructure folded intodocs/conventions.md.First fully-dogfooded chicken-and-egg-closure cut: this is the
first prep-PR-merge cycle where the autonomousrelease-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): bumpuses: ...@v0.2.0+toolkit_ref: v0.2.0→@v0.3.1to 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: addecho "[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 whenchore:(silent) vs.internal.md(visible in### Internal) is the right home. -
.forgejo/workflows/release.yml+manifest-check.yml(consumer-side): bumpuses: ...@v0.2.0+toolkit_ref: v0.2.0→@v0.3.1to 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
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
-
-
Release v0.3.1
StableSome checks failedreleased this
2026-06-24 21:59:55 +02:00 | 1472 commits to main since this releasev0.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.ymlfix below only takes
effect when consumers bump theirrelease-draft.yml'suses: ...@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--versionempty on every release-draft cycle. See #16. -
tests/conventional-commits.bats: rewrite the 4cc_parse_subjecttests to compare against$outputdirectly (with explicit newline boundaries via$'...'syntax) instead of${lines[N]}indexing. Fixes 2 pre-existing failures on bats 5.2.37+ where therunwrapper collapses empty strings out of thelinesarray, silently shifting indices. Test logic + the function under test are unchanged. See #18.
Internal
docs/conventions.md: new subsection "Choosingchore:vsfeat: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 achore:-shaped commit lands asfeat:and pulls the next cut into a higher version lane. See #14.
Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
-
-
Release v0.3.0
StableSome checks failedreleased this
2026-06-24 20:52:51 +02:00 | 1478 commits to main since this releasev0.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.ymlin 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_minorconfig 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. Setpre_v1_breaking_to_minor: trueinrelease-toolkit.ymlto downgrademajor→minorbumps 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. Defaultfalse(strict SemVer); the policy is opt-in via the config flag. Seedocs/conventions.mdfor mechanics +semver_apply_pre_v1_policyfor 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 wheregit describe --tagsis the authoritative version source. The lockstep check inmanifest-check.shstep 2 emitsSKIPrather than failing; step 4 (tag-vs-manifest) treats the git tag as its own manifest (no comparison required).release-prep.shdoes 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 toVERSIONper v0.1 behavior) from "field explicitly empty" (tag-is-version opt-in). Right shape for Go projects with-ldflagsversion injection (tmux-tell + similar) and projects where the tag IS the source of truth. Seedocs/integration.mdfor 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 fortag_prefixis 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_transitiongains 2 new optional positional params (5th = TAG_PREFIX, 6th = SEPARATOR) with${var-default}(not${var:-default}) semantics so explicit empty string is preserved. Seedocs/integration.mdfor 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 AFTERversion_filesare bumped + BEFORE the git commit. Used for per-consumer bookkeeping that doesn't belong in the toolkit's general flow (updating a--versionexample in README to match the cut, regenerating versioned docs, syncing vendored manifests). Each hook is an executable script invoked from the consumer repo root + receivesRELEASE_TOOLKIT_NEW_VERSION+RELEASE_TOOLKIT_NEW_TAG+RELEASE_TOOLKIT_PREVIOUS_TAGenv 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). Seedocs/integration.mdfor the full mechanics + safety surfaces. Fourth v0.3 / release-toolkit#4 slice (4 of 5). -
docs/migration/tmux-tell.mdmigration guide — step-by-step migration walkthrough for projects with tmux-tell's substrate shape (Go projects with noVERSIONfile, 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-shaperelease-toolkit.ymlconfig; 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
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
-
-
Release v0.2.1
StableSome checks failedreleased this
2026-06-24 19:15:18 +02:00 | 1488 commits to main since this releaseFixed
-
Sudo-aware install-deps step in
_release-prep.yml+_release-draft.yml+_manifest-check.yml. v0.2.0 hard-codedsudo apt-get installfor the yq/jq/curl fallback, which failed opaquely withsudo: command not foundon minimal root-only CI images (a common shape: Debian-derived images that run as root with nosudopackage installed). v0.2.1 replaces the baresudocalls with a 3-shape handler: (1) if EUID=0,apt-getdirectly; (2) else ifsudois 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.ymlis unchanged — it has no install-deps step (pure tag-format validation). Closes #10. -
list_fragmentswarns 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 emitswarning: <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 dispatchesrelease.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
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
-
-
Release v0.2.0 Stable
released this
2026-06-24 16:55:53 +02:00 | 1496 commits to main since this releaseFixed
-
runs_onis 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-codedruns-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 specifyruns_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); updatewith:blocks to includeruns_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 indocs/conventions.mdis now defensive rather than advisory — authors who follow it still produce cleaner sources, authors who slip get correct output anyway.
Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
-
-
Release v0.1.0 Stable
released this
2026-06-24 15:31:24 +02:00 | 1503 commits to main since this releaseFirst 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.0to 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-writtenchangelog.d/<id>.<kind>.mdfragment 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:publishedevent → 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 (seescripts/manifest-check.sh --help) prevents false-positives on every legitimate release-prep PR. - Dry-run + operator preview:
--dry-runskips 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_transitionnow 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.shanddraft-release.sh.
Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
- 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