On this page
#Changelog
#0.60.1
Feature matrix n/a support for toolchain-native checks
#Features
- Feature matrix. Support "n/a" cells for checks where the toolchain already handles the concern natively (e.g., circular-deps for Go modules).
#0.60.0
#Features
- Go workspace dependency validation. GoImportScanner enables deps-unused, deps-undeclared, deps-runtime-test-only, and deps-dev-in-lib checks for Go projects.
- Circular dependency detection. New
circular-depsquality check detects intra-package circular import chains using Tarjan's SCC algorithm. Per-language severity: Python=warn, npm=error. Go is skipped (compiler catches cycles). - Dart dead-module detection. The
dead-modulescheck now supports Dart projects, finding unreachable files via entry-point reachability from pubspec.yaml barrel files and bin/ scripts. - Feature matrix directive. New
table-feature-matrixselfdoc directive auto-generates a language support table in docs.
#0.59.1
#Fixes
- Fix. Root-project dep scan no longer produces false-positive deps-undeclared findings from sibling project source files.
#0.59.0
#Features
- PlainTarget auto-detection. VERSION-only projects are now auto-detected without opt-in configuration.
- Unified manifest detection. Target detection files are now derived from the target registry as a single source of truth, eliminating hardcoded manifest lists.
- Required template variables.
process_templatenow errors on missing critical variables at scaffold time instead of silently leaving placeholders. - Monorepo sync template resolution.
monorepo syncnow resolves template variables in per-project CI workflows instead of copying them verbatim.
#Fixes
- Scaffold auto-commit and hook install from sub-directories. Scaffold auto-commit and pre-push hook installation now work correctly when run from monorepo sub-project directories.
- Release file commits auto-exempted. Commits that only touch
.rlsbl/releases/files are now automatically exempted from changelog coverage checks.
#0.58.0
#Features
- New check.
dead-workspace-packagesdetects workspace library packages never imported by any sibling, with specific messaging for test-only imports.
#Fixes
- Improved. Expanded monorepo
release initcommand description for better selfdoc SEO.
#0.57.1
#Fixes
- Fix.
monorepo release-initno longer crashes on Python 3.14 when rendering commented-out package sections. Thetomlkit.dumps()call was replaced withtomlkit.item().as_string()to avoid aValueErrorwhen serializing arrays.
#0.57.0
#Features
- New.
monorepo release-initnow accepts a--packagesflag to scaffold only specific packages. Packages with zero unreleased commits are automatically commented out with an explanation. - New. Feature support matrix:
get_feature_matrix()andgenerate_feature_matrix_markdown()functions showing which checks support which targets.
#Fixes
- Fix.
retry.tomlis now cleaned up when validation fails during release retry, in both the init and retry handlers. Previously, an invalidretry.tomlcould be left behind, blocking subsequent retries.
#0.56.0
#Breaking
- LICENSE removed from scaffold. Projects must now manage their own LICENSE file. The
license-filecheck enforces its presence.
#Features
- npm dead module detection. New
dead-modules-npmcheck detects unreachable modules in npm packages by tracing entry-point reachability through the dependency graph. - New checks.
license-fileerrors if LICENSE is missing, empty, or contains template variables.scaffold-unreplaced-varsdetects leftover template variables in scaffold-generated files. - Batch release-init improvements. Flutter targets now get per-target config sections. Release files include TOML comments and the
contextfield.
#Fixes
- Fix retry.toml blocking release.
release retrynow cleans up the scaffolded retry.toml when validation fails, preventing it from blocking subsequentrelease runattempts. - Fix bare scaffold for plain targets.
rlsbl scaffoldnow reads targets from config.json for already-scaffolded projects that use plain targets, instead of erroring. - Fix workspace-unregistered false positives. The check now skips private
package.jsonfiles and parent directories of registered projects. - Shared release config validation. Single and batch release paths now use a shared validator, fixing missing Flutter validation in the batch path.
#0.55.0
#Features
- New command.
monorepo release-initscaffolds a batch release file with per-package sections for all workspace projects. - New feature.
dead-modulescheck now supports Go projects. Detects unreferencedinternal/packages via tree-sitter import scanning.
#Fixes
- Fix. Template sheltering now handles dotted placeholders like
{{zig.projectName}}, preventing YAML corruption in multi-target scaffold. - Fix. Scaffold with explicit
--targetnow uses the current directory as project root, fixing dev_node detection for plain-target projects in monorepos. - Fix. Workspace stale-entries and unregistered checks now recognize all 16 target manifest types plus
.rlsbl/config.jsonas a universal project indicator.
#0.54.2
#Fixes
- Fix. Batch release files now enforce mandatory description per package, matching single-release behavior.
- Fix. Dep quality checks now share a cached import scan instead of scanning 4x per workspace project.
#0.54.1
#Breaking
- Breaking. Release description is now mandatory in unreleased.toml. Every release must have a short summary.
#0.54.0
#Breaking
- Breaking. Renamed
changelog_exempttodev_node. Dev node projects no longer participate in the changelog system — no JSONL entries, no CHANGELOG.md, no pre-push enforcement. Release does version bump + tag + GitHub Release (body from release description). Boundary guardrail prevents non-dev-nodes from depending on dev_nodes at runtime.
#Features
- Internal. Added
WorkspaceProjecttyped wrapper andprojectfield onProjectContextfor structured workspace project access. - New feature. Release description and context fields in
unreleased.toml. Description appears in CHANGELOG.md under version heading. Context appears as collapsible details block. Description mandatory for dev_node releases. - New feature. Three quality checks:
deps-runtime-test-only(warning: runtime dep only used in tests),deps-dev-in-lib(error: dev dep imported in lib code),dead-modules(warning: Python modules with zero intra-project references).
#Fixes
- Fix. Library lint now excludes test and example files by default. Go
*_test.go, Pythontest_*.py/tests/, npm*.test.ts/__tests__/, andexamples/dirs are no longer flagged for stdout usage.
#0.53.0
#Breaking
- Breaking. Renamed
internalworkspace flag tochangelog_exempt. The new name describes the behavior (changelog enforcement exemption), preventing misuse.
#Features
- Internal. Added
scopefield to Dependency namedtuple (runtime/dev/peer/explicit). Reverse dependency graph now supports scope-filtered traversal.
#0.52.0
#Breaking
- Breaking. All target methods (
template_mappings,read_name,write_version) now requirectxparameter (no default). Fixed_is_libraryCWD bug intemplate_mappings.
#Features
- New feature.
internal = trueworkspace flag. Internal projects are fully exempt from changelog enforcement: no JSONL entries needed, pre-push check skips them, no user-facing requirement. Version bumps and GitHub Releases still work. - New feature.
deps-unusedcheck now scans JS/TS imports via tree-sitter. npm workspace dependencies (workspace:*) are no longer false-positived as unused.
#Fixes
- Fix. Go target no longer misdetects cmd-layout projects (
cmd/*/main.go) as libraries. Scaffold now correctly includespublish.ymland.goreleaser.ymlfor these projects. - Fix. Standalone multi-target publish workflows now inject
working-directory,packages-dir, and version-file paths for targets in subdirectories. Refactored to structured YAML.
#0.51.0
#Breaking
- Breaking. Renamed
monorepo_roottoworkspace_rootonProjectContext. DeletedProjectCheckContext— all check functions now receiveProjectContextwith pre-loaded config. - Breaking. All target methods (
template_vars,shared_template_mappings,read_name,write_version,publish) now acceptctx: ProjectContextinstead ofproject_root. Fixed latent bugs where dartwrite_versionand dockerread_namedidn't receive config.
#Features
- Internal. Added
[tool.uv.sources]for editable strictcli install.
#0.50.0
#Breaking
- Breaking. Config utility functions (
should_tag,get_push_timeout,push_if_needed,read_deploy_config,get_publish_config) now accept a config dict instead ofproject_root.write_project_configreturns the updated dict. - Breaking. All target
publish()methods now acceptctx: ProjectContextinstead ofproject_root. Config is read fromctx.config— no redundant disk reads during publish.
#Features
- Internal. Extracted shared
_rel_to_git_rootutility, eliminating duplicate path normalization in release flow. - Internal. Added regression test for release abort cleanup (unexpected-files scenario).
#0.49.2
#Features
- Internal. Commands that don't read config no longer load it at startup. Scaffold commands use
ProjectContextfor direct config access. - Internal. Added release integration tests exercising the full release flow against real git repos (no mocked subprocess calls).
#Fixes
- Fix. Increased npm check-name timeout from 10s to 30s to reduce CI flakiness on cold-cache runners.
- Fix. Changelog finalization now uses git-relative paths consistently, matching the version-bump commit's path format.
- Fix. Monorepo release lock file now uses the correct root path.
#0.49.1
#Fixes
- Fix. Monorepo release commits now use correct relative paths for version-bumped files.
#0.49.0
#Breaking
- Breaking. Release, pre-push check, deploy, and undo commands now receive
ProjectContextinstead of bareproject_root. Config is read once at startup viactx.configinstead of re-reading from disk at each call site.
#Fixes
- Fix. Configuration docs no longer trigger stale-description warnings on every release. The
versionfield is excluded from the selfdoc.json schema table. - Fix. Adapted check system bootstrap for strictcli v0.11 API (required
appfield in checks.toml).
#0.48.2
#Fixes
- Fix. Lockfile modifications from version bump no longer falsely flagged as concurrent changes during release.
#0.48.1
#Fixes
- Fix.
rlsbl scaffoldno longer crashes for Go, Zig, and Docker projects (missingproject_rootargument intemplate_vars/shared_template_mappings).
#0.48.0
#Breaking
- Breaking. All internal APIs now require explicit
project_rootparameter (no silent CWD fallback). Eliminates the last footgun from the os.chdir removal.
#Fixes
- Fix. Release aborts (e.g., unexpected dirty files) now revert version-bumped files instead of leaving the working tree dirty. Prevents selfdoc hash oscillation on subsequent releases.
- Fix. Corrupt
.rlsbl/config.jsonnow raises a clear error with the file path instead of silently returning empty config. - Fix. Release lock file is now created relative to the project root, not CWD.
#0.47.0
#Breaking
- Breaking.
release initscaffoldsbump = ""(was"patch") andrelease retryscaffoldsref = ""(was the tag). Both fields must now be set explicitly. Scaffolded files include explanatory TOML comments.
#Features
- New flag.
watch --run-idmonitors CI runs by ID instead of commit SHA. Accepts multiple values (--run-id 123 --run-id 456). Mutually exclusive with the SHA positional arg. - Retry + watch integration.
release retrynow captures dispatched workflow run IDs and passes them towatch --run-id, so monitoring works correctly even when the dispatch ref differs from the release tag. - CI sync rewrite. Monorepo CI sync transforms rewritten from text-based to structured YAML (ruamel.yaml round-trip mode).
working-directoryis now injected per-job (not workflow-level), correctly handling cross-project CI workflows. - Monorepo scoping.
statusandunreleasednow filter commits by project directory in monorepo mode, showing only commits that touch the current project's files.
#Fixes
- Fix.
changelog addin monorepo sub-projects no longer writes to the root JSONL file. Path resolution uses explicit project root instead of CWD. - Fix. Config reads (
push_timeout, publish config, deploy config, etc.) no longer fail silently after CWD shifts during monorepo releases. All config functions accept explicitproject_root. - Fix. Release no longer falsely aborts with 'unexpected modified files' when project_root is an absolute path.
#0.46.0
#Breaking
- Breaking.
--updateflag removed fromscaffold. Barerlsbl scaffoldis now idempotent — creates what's missing, three-way merges what exists. Run it anytime.
#0.45.1
#Fixes
- Bug fix. Scaffold now creates non-workflow files (like
.npmignore) from all targets, not just the primary. - Bug fix. Docker publish template no longer has
{{version}}replaced by the literal version. Added escape syntax (\{{...}}) to the template engine. - Bug fix. Scaffold now uses the correct subdirectory path for npm targets instead of always looking at the repo root.
- Docs.
release retryhelp text updated to describe dispatch-only behavior.
#0.45.0
#Breaking
- Breaking.
push_timeoutmust now be explicitly set in.rlsbl/config.jsonor viaRLSBL_PUSH_TIMEOUTenv var. The implicit 120-second default is removed.
#Features
- Improvement. The
plainrelease target now bumpspyproject.tomlversion when present, keeping it in sync withVERSION.
#Fixes
- Bug fix.
release runnow correctly applies directory scoping for monorepo changelog validation, matchingrlsbl check --tag changelogbehavior. - Bug fix. Changelog checks now use the target-specific tag pattern in monorepos (e.g.,
go/v*for Go targets instead ofgo@v*).
#0.44.0
#Breaking
- Breaking.
release retryis now dispatch-only. It no longer deletes/re-creates the GitHub Release or re-uploads assets. It dispatches workflows fromretry.tomlviagh workflow run. Schema simplified to 3 fields:version,dispatch,ref.
#0.43.1
#Features
- Scaffold. npm targets now get a
.npmignorefile with sensible defaults, preventing non-npm content from being published.
#Fixes
- Bug fix.
release retrynow always dispatches all workflows listed inretry.toml, not just as a fallback when no runs are found. Fixes CI never being re-triggered when Publish triggers naturally.
#0.43.0
#Breaking
- Breaking.
edit-release,undo, andyankare now subcommands of thereleasegroup:release edit,release undo,release yank. - Breaking.
release retryis now file-driven viaretry.toml. Auto-scaffolds the file with defaults when not present. The version positional argument is removed.
#Features
- Improvement.
release yanknow shows a confirmation prompt before destructive operations, with--yesto bypass. - Improvement.
release runnow detects monorepo root and errors with guidance to usemonorepo release.
#Fixes
- Bug fix. Multi-target scaffold now correctly includes
workflow_dispatchin merged publish workflows. - Bug fix.
selfdoc.jsonversion is now auto-bumped during release even whendocsis not in the configured targets. The version-consistency check also detects drift independently of target config. - Bug fix. Monorepo changelog coverage now only requires entries for commits touching the package's own files, not all commits in the range.
- Bug fix.
release yanknow uses correct monorepo tag format instead of hardcodingv{version}.
#0.42.0
#Breaking
- Breaking.
rlsbl releaseis now a command group. Userlsbl release run(wasrlsbl release),rlsbl release init(wasrlsbl release-init), and the newrlsbl release retry. - Breaking.
rlsbl release runrequires--watchor--no-watch.--watchauto-monitors CI to completion;--no-watchprints the watch hint.
#Features
- New command.
rlsbl release retryre-creates a GitHub Release to re-trigger CI/CD workflows, with asset re-upload and automaticgh workflow runfallback. - Scaffold. All generated CI and Publish workflow templates now include
workflow_dispatchtrigger for manual re-triggering after GitHub Actions outages. - Watch.
rlsbl watchnow suggestsrlsbl release retrywhen no CI runs are found but a GitHub Release exists for the commit. - New target.
pgdesignrelease target for database schema projects.
#Fixes
- Bug fix.
rlsbl checkcommands no longer crash in monorepo context withWorkspaceGraph.__init__() missing required argument.
#0.41.7
#Features
- New feature. Releases are now blocked when there are no user-facing changelog entries. Shown as a warning during
rlsbl check, hard error duringrlsbl release. - New feature.
changelog addandchangelog amendnow detect duplicate commits -- hard error when the same commit appears in an entry with matching type, warning when types differ.
#Fixes
- Fix. DocsTarget version sync now also updates the last entry in selfdoc.json
versionsarray, preventing VER003 lint failures after release.
#0.41.6
#Features
- New feature. Run
selfdoc gen --no-commitbeforeselfdoc checkduring release, ensuring docs are regenerated from source before validation.
#Fixes
- Fix.
selfdoc checkfailures now print a clean error message instead of a raw Python traceback.
#0.41.5
#Fixes
- Fix. Detect npm moniker collisions for separator-free names. Previously,
check-name pgspec --target npmreported "available" even thoughpg-specexists and npm considers them identical. Now generates insertion variants (inserting-,.,_at every position) and checks each. Also fixed dot separator handling -- dots are now treated identically to dashes and underscores, matching npm's actual normalization.
#0.41.4
#Fixes
- Fix: selfdoc hashes no longer left dirty after release. Content hashes are refreshed after the version bump so the working tree stays clean post-release.
#0.41.3
#Features
- DocsTarget is now a versioned target. Reads and writes version from
selfdoc.json. Theversion-consistencycheck now includes docs targets instead of skipping them.
#0.41.2
#Features
- Go assets use goreleaser for cross-compilation. When goreleaser is installed,
build_assets()produces binaries for linux/darwin/windows x amd64/arm64. Falls back to host-onlygo buildwhen goreleaser is unavailable.
#0.41.1
#Breaking
- **Breaking:
.claude/settings.jsonremoved from scaffold templates.** Claude Code does not require this file. Projects with customized hooks keep their existing file.
#Features
- Config validation and migration. Release flow now validates
publish.<target>.assetsconfig.scaffold --updateauto-detects missingprivatekey. Newconfig-schemacheck (29 checks total). Removedget_max_asset_size_mb()implicit default.
#Fixes
- **Fix:
library-lintcheck skips non-library projects.** Standalone projects no longer produce 523 spurious lint errors inrlsbl check --all.
#0.41.0
#Breaking
- **Breaking:
privateconfig key is now required.** No implicit default. Set"private": truefor private repos or"private": falsefor public repos. Private repos are blocked from publishing to public registries. - Breaking: private hook template removed. The
post-release-private.sh.tplscaffold template is deleted. Asset upload is now a built-in release step configured viapublish.<target>.assets. A newprivate-hook-stalecheck detects legacy private hooks. - Breaking: CLAUDE.md removed from scaffold templates. Projects using selfdoc root file templates should manage CLAUDE.md via
docs/_CLAUDE.md. Scaffold no longer creates or updates CLAUDE.md. - **Breaking:
run_cmdlegacy signature removed.** The release command no longer acceptsrun_cmd(registry, args, flags). UseReleaseConfigfromrlsbl.release_fileinstead.
#Features
- **New command:
changelog amend.** Amend historical changelog entries in released JSONL files. Unlocks the file, appends the entry, re-locks, regenerates CHANGELOG.md, and syncs GitHub Release notes viaedit-release. - **Per-target
build_assets().** New target method for building distributable artifacts. Implemented for PyPI (uv build), npm (npm pack), Go (go build), and Cargo (cargo build --release). - Release asset upload. Configure
publish.<target>.assets: trueandmax_asset_size_mbto build and upload artifacts to GitHub Releases duringrlsbl release. Size guard aborts if artifacts exceed the limit. - Auto-dump strictcli schema during release. Projects with strictcli in their dependencies automatically run
--dump-schemaduring release. Changed.strictcli/schema.jsonis included in the release commit. - Selfdoc check runs earlier in release pipeline. Moved from after lint to after pre-checks hook, catching staleness errors before tests run.
#Fixes
- Fix: noop commit warnings eliminated. Monorepo sync, monorepo snapshot, and validation cache no longer warn when nothing changed. Prints a clear skip message instead.
- **Fix:
release-initno longer refuses empty files.** An empty or whitespace-onlyunreleased.tomlleft after finalization no longer blocksrelease-init. - Fix: version-consistency check no longer fails on DocsTarget. Targets with no version file (like docs) are skipped in the version comparison.
#0.40.1
#Fixes
- Fix. CI workflow updated for the
checktocheck-namerename.
#0.40.0
#Breaking
- **Breaking: removed
--skip-tests,--skip-lint,--skip-docs,--skip-remote-check, and--no-tagflags from the release command.** Tests, lint, and remote checks now always run. Selfdoc check is automatically skipped when docs target is excluded in the release file. Only--allow-dirtyremains as a release-specific flag.
#Features
- selfdoc root file templates. README.md and CLAUDE.md are now auto-generated by selfdoc from
docs/_README.mdanddocs/_CLAUDE.mdtemplates. Edit the templates, not the generated files.
#0.39.0
#Breaking
- Breaking: file-based releases.
rlsbl releasenow reads from.rlsbl/releases/unreleased.tomlinstead of CLI args. Runrlsbl release-initto scaffold the file. The file declares bump type, included/excluded targets, and per-target config. - **Breaking:
rlsbl doctor,monorepo lint, andchangelog validateremoved.** Replaced by the unifiedrlsbl checkcommand. Userlsbl check --all,rlsbl check --tag workspace, orrlsbl check --tag changelog. - **Breaking:
--dry-run,--yes,--quietare now global flags.** They apply to all commands. Bothrlsbl --dry-run releaseandrlsbl release --dry-runwork. - Breaking: PyYAML replaced with ruamel.yaml. Projects extending rlsbl's YAML handling must use the ruamel.yaml API.
- Breaking:
rlsbl check(name availability) renamed torlsbl check-nameto make room for the unified check system.
#Features
- Unified check system. 27 checks migrated to strictcli's
@app.check()framework. Runrlsbl check --all, filter by tag (--tag project,--tag changelog,--tag workspace,--tag release), or by name (--name lock). Supports dependency ordering, JSON output, dry-run, and verbose modes. - Dart target and workspace scanner. New
darttarget type: reads/writespubspec.yamlversion field with round-trip formatting preservation. DartScanner detects intra-workspace dependencies in Dart monorepos. - Flutter iOS/Android targets with Shorebird OTA. Separate
flutter-iosandflutter-androidtargets with platform-specific tags. Release filemodefield (ota/build) controls release type. Native file detection blocks OTA when platform code changes. Build number (+N) management opt-in via config. - **
monorepo graphcommand.** Export the workspace dependency graph as JSON, DOT (Graphviz), or indented text. Filter with--root(transitive deps),--reverse(transitive rdeps), and--depth. - **
monorepo snapshotcommand.** Generates.rlsbl-monorepo/snapshot.jsonsummarizing all packages, versions, deps, and graph structure.--checkmode for CI staleness detection. Auto-regenerates during monorepo releases. - Architectural layer rules. Define
[layers]inworkspace.tomlwith ordered layers and glob-based package assignments. Thelayers-violationscheck enforces dependency direction. Supports unrestricted packages, forbidden targets, and explicit cross-layer allowances. - Dependency-import validation. New
deps-unusedanddeps-undeclaredchecks scan source files (Python via tree-sitter, Dart via regex) to verify declared dependencies match actual imports. Whitelist via.rlsbl-monorepo/dep-overrides.toml. - **
monorepo impactcommand.** Analyze blast radius of changes: input a package name, file paths, or git range (--since). Outputs direct/transitive dependents, test scope, and release candidates in JSON or text. - Coordinated multi-package releases.
monorepo releasereads a batch release file (.rlsbl-monorepo/releases/unreleased.toml) and releases packages in topological order. Newdeps-stalecheck detects outdated intra-workspace constraints. Advisory constraint propagation after each release.
#0.38.2
#Fixes
- Fix. Publish router no longer fails for plain-target releases. Added a no-op job so GitHub Actions workflows succeed even when all conditional publish jobs are skipped.
#0.38.1
#Features
- Hook-generated files included in release commit. Files modified or created by pre-checks and pre-release hooks are now automatically detected and included in the release commit, instead of being left dirty.
#Fixes
- Fix PyPI build for subdirectory targets.
uv build --out-dirno longer produces a doubled path (e.g.pypi/pypi/dist) when the pypi target lives in a subdirectory.
#0.38.0
#Breaking
- Monorepo publish router inlines jobs.
monorepo syncnow inlines each sub-project's publish steps directly into the rootpublish.ymlinstead of calling per-project reusable workflows viaworkflow_call. This fixes PyPI Trusted Publishing (OIDC), which rejects tokens from reusable workflows. Per-project source workflows stayon: release(standalone-ready). Old{name}-publish.ymlwrappers are auto-deleted on sync.
#Features
- Publish router hash cache.
monorepo syncnow caches SHA256 hashes of per-project publish workflows in.rlsbl-monorepo/publish-cache.jsonand skips router regeneration when nothing changed.
#Fixes
- **Fix Zig npm-wrapper
needs:dependency.**build_npm_publish_jobs()no longer hardcodesneeds: [goreleaser]-- Zig projects now correctly useneeds: [build-and-upload]. - **Fix monorepo sync self-reference with
path=".".** Projects withpath="."no longer wrap the generated router as their own publish workflow.
#0.37.0
#Features
- New feature. Auto-sync lockfiles during release. After version bump, rlsbl detects uv.lock, package-lock.json, and go.sum, runs the appropriate sync command, and includes modified lockfiles in the release commit.
#Fixes
- Fix. Restore path-based changelog-only commit exemption alongside the Autogenerated trailer check. Manual commits touching only .rlsbl/changes/ or CHANGELOG.md are now correctly skipped during coverage validation.
- Fix. Skip gitignored lockfiles during release lockfile sync. Previously, syncing a lockfile that was in .gitignore caused git add to fail and aborted the release.
#0.36.1
#Fixes
- Fix. Monorepo target detection now resolves project paths relative to the monorepo root, not the current directory. Fixes changelog validation and status reporting when running from inside a sub-project.
- Fix.
uv buildanduv publishnow run from the sub-project directory in monorepo mode, fixing build failures for PyPI targets.
#0.36.0
#Features
- New feature. Asset size guard in private post-release hook -- checks files in
dist/againstmax_asset_size_mb(default 2MB) before uploading to GitHub Releases.
#0.35.1
#Features
- Cleanup. Changelog commit exemption now uses only the
Autogenerated: truetrailer; old path-pattern fallback removed.
#Fixes
- Bug fix. Release finalization now generates the per-version
.mdfile alongside the JSONL. - Bug fix. Release flow no longer false-positives on files written by hooks, lint, or changelog generation.
#0.35.0
#Features
- **
rlsbl releasewarns about stale changelog entries in monorepo mode.** During finalization, entries referencing commits outside the unreleased range are flagged to stderr (warn-only; no entries stripped) so out-of-range entries don't silently carry into the next release cycle. - **Template action versions now use
{{action "name"}}placeholders.** GitHub Action versions in scaffold templates are resolved at scaffold time fromrlsbl/data/action_versions.toml, eliminating duplication between the table and 60+ template references. Updates to action versions now require editing only the table.
#Fixes
- Release flow no longer crashes when extracting the changelog entry. Fixed a regression introduced in v0.34.0 where the in-memory preview of
generate_changelogused## Unreleasedas the heading but entry extraction looked for## X.Y.Z, returning None and crashing later in GitHub Release notes generation. The preview call now passesversion_override=new_versionso the heading matches. - **
max_entries_per_commitdefault raised from 2 to 5.** The previous default 2 was too strict and contradicted the documented practice that one commit can appear in multiple JSONL entries (e.g., fix + feature). Default now matches the existingmax_commits_per_entrydefault of 5.
#0.34.0
#Features
- Configurable changelog batch-limits validation.
rlsbl changelog validatenow checks that no entry has more thanmax_commits_per_entry(default 5) commits and that no commit appears in more thanmax_entries_per_commit(default 2) entries. Both limits configurable per project via thebatch_limitssection in.rlsbl/config.json. Known violations can be silenced via anexclusionslist with a requiredreasonfield for audit purposes.
#0.33.0
#Features
- **
rlsbl dev installexpanded.** New--global(default) and--venvflags. Added support for hex, deno, zig, and swift targets in addition to pypi/npm/go/cargo. For pypi/npm,--venvinstalls into the project's local environment (uv sync/npm install).
#Fixes
- PyPI publish error names both env vars. When the PyPI publish credential is missing and no
token_varoverride is configured, the error message now reads 'no PYPI_TOKEN or TWINE_PASSWORD' instead of hardcoding only PYPI_TOKEN. - Em-dash in status warning.
rlsbl status's 'commits ahead' warning now uses an em-dash separator (— run) instead of two hyphens (-- run). - **Empty
release_branchesconfig is now an error.** Previously an explicit empty list silently fell back to['main','master']and disabled the manual-push warning. To opt out of the warning, remove therelease_brancheskey entirely; to limit to specific branches, list them. - **
rlsbl releaseno longer pollutes the working tree on abort.** Previously, when a pre-mutation check (selfdoc, tests, lint, hooks) failed, the regeneratedCHANGELOG.mdwas left in the working tree and had to be manually reverted. The write is now deferred until after all pre-checks pass.
#0.32.0
#Features
- Status warning for unreleased commits.
rlsbl statusnow prints a prominent! N commits ahead of <tag>warning when the current project has unreleased commits since its last tag. - Centralized GitHub Actions versions. All scaffolded workflows now read action versions from a single table (
rlsbl/data/action_versions.toml), andactions/checkouthas been bumped to v6 across every template ahead of the June 2026 Node 20 deprecation. - **
scaffold --dry-run.** Preview which files would be created, updated, conflicted, or unchanged without writing anything. - **
scaffold --updateregenerates stale pre-push hooks.** Known-old hook contents are recognized by content hash and overwritten with the current template; user-customized hooks are preserved and a unified diff is printed for manual review. - Pre-push hook warns on manual release-branch pushes. Pushing to
main/masteroutsiderlsbl releasenow prints a prominent warning (configurable viarelease_branchesin.rlsbl/config.json). The push is not blocked. - Config-driven per-target publish gating. A new
publishsection in.rlsbl/config.jsondeclareslocal: true|falseandtoken_varoverrides per target, replacing ad-hoc env-var-presence checks across all 7 publishable targets. - **New
rlsbl dev installcommand.** Locally installs the current project in editable mode based on its target (pypi →uv tool install -e ., npm →npm link, go →go install ./..., cargo →cargo install --path .). Supports--uninstall, and in monorepos:--all,--include,--exclude. - **User-owned
ci-custom.ymlandpublish-custom.yml.** Customize CI without three-way merge conflicts by adding your own jobs in a separate workflow file thatrlsbl scaffoldnever touches. - **
--no-commitflag onrlsbl monorepo init/add/sync.** Consistent withscaffoldandchangelog; enables batched migrations into a single commit.
#Fixes
- Go monorepo tag bug fix. Release in a Go monorepo no longer produces malformed tags like
auth-gatewayv0.1.0when the workspace.toml path lacks a trailing slash — the separator is now inserted defensively, and workspace paths are normalized at load time. - Monorepo publish workflows now run on release. The generated publish router declares per-target
permissions:andsecrets: inherit, fixing thestartup_failurethat affected every monorepo publish run on GitHub Actions. - **
scaffold --updateno longer commits files with merge conflict markers.** Conflicted files are excluded from the auto-commit and listed so they can be resolved manually. - Docs target no longer fails when Cloudflare credentials are missing.
DocsTarget.publish()gracefully skipsselfdoc deploywhenCF_ACCOUNT_IDorCF_PAGES_API_TOKENis absent, instead of producing a hard subprocess error on every release. - **
Autogenerated:trailer uses git's--trailerflag.** rlsbl-created commits now record the trailer viagit commit --trailerinstead of embedding it in the commit message body. This makes the trailer correctly parseable bygit interpret-trailersand other git tooling, which previously couldn't read the embedded form.
#0.31.0
#Breaking
- Breaking. Go targets in monorepos now use path-based tags (
go/v0.1.1) instead of name-based ([email protected]), matching Go module proxy requirements. All tag discovery and matching updated.
#Features
- Feature. Go CLI projects automatically run
go installafter release to update the local binary. - Feature.
selfdoc checkruns automatically during release whenselfdoc.jsonexists. Skip with--skip-docs.
#Fixes
- Fix. Commits touching only changelog infrastructure files (
.rlsbl/changes/,CHANGELOG.md) are again exempt from coverage, even without theAutogeneratedtrailer. - Fix. Release flow now rolls back locally on push failure: deletes the tag, resets commits, and prints recovery instructions. Branch and tag are pushed in a single
git pushcommand. - Fix.
rlsbl undonow handles the two-commit release pattern (version bump + changelog finalize), reverting both and restoring JSONL state.
#0.30.1
#Features
- Feature. All
commit_files()calls now default toautogenerated=True, ensuring every rlsbl-generated commit carries theAutogenerated: truetrailer. - Feature. Pre-push hook now blocks pushes when
unreleased.jsonl,.validated, orCHANGELOG.mdare gitignored.
#Fixes
- Fix.
.validatedcache is no longer gitignored; tracked per project rules. - Fix. Pre-push hook now reads all JSONL files (unreleased + versioned) for coverage, fixing release pushes being blocked after changelog finalization.
#0.30.0
#Breaking
- Breaking. Changelog coverage exemption now uses the
Autogenerated: truegit trailer instead of file-path pattern matching and commit-message regexes. Auto-generated commits must carry this trailer to be exempt.
#Features
- New command.
rlsbl commitcommits files with anAutogenerated: truegit trailer, marking them as auto-generated for changelog coverage exemption. - Feature. Changelog finalization,
rlsbl changelog add, andrlsbl changelog generateauto-commits now carry theAutogenerated: truetrailer. - Feature. Pre-push hook skips JSONL coverage check when pushing a version tag (standalone
v*or monoreponame@v*).
#0.29.1
#Fixes
- Fix. Release no longer aborts when the
.validatedchangelog cache is updated during validation.
#0.29.0
#Features
- New command.
rlsbl monorepo lintdetects unregistered projects and stale workspace entries.
#Fixes
- Fix. Pre-push hook now recognizes monorepo release commit messages and filters coverage checks to only commits affecting each sub-project.
- Fix. Release commit now includes all version files modified by targets (
__init__.pyfor PyPI,build.zig.zonfor Zig, dynamically-chosen file for Maven). - Fix. Built-in tests, lint, and hook scripts now run from the correct sub-project directory in monorepo mode.
- Fix. Changelog validation,
rlsbl status, andrlsbl changelog validatenow use project-scoped tags (<name>@v*) in monorepo mode. - Fix.
rlsbl undonow correctly finds project-scoped tags and matches monorepo release commit messages.
#0.28.1
#Fixes
- Fix: status applies changelog-only exemptions.
rlsbl statusnow excludes changelog-only commits from the JSONL coverage count, consistent withchangelog validate. Shows exemption count when applicable. - Fix: gitignore uses set-union merge on scaffold update.
scaffold --updatenow appends new entries to.gitignorewithout three-way merge, eliminating predictable conflicts. No lines are removed or reordered. - Fix: backfill script uses CWD as default project root.
scripts/backfill_changelog.pynow operates on the current directory instead of hardcoding rlsbl's own root. Accepts--project-rootfor explicit override.
#0.28.0
#Breaking
- Revert: strict type validation removed. Changelog entry types are freeform strings again. Non-standard types render under "Other" in generated CHANGELOG.md. Formalization deferred until real-world usage patterns emerge.
#Features
- **
changelog generateauto-commits.** Generated CHANGELOG.md and per-version .md files are now auto-committed after generation. Use--no-committo skip.
#Fixes
- **Fix: monorepo publish workflow renamed to
publish.yml.** The monorepo publish router was namedpublish-router.yml, which broke PyPI Trusted Publishing OIDC claims when projects moved between standalone and monorepo layouts. Now alwayspublish.ymlin both contexts. - Fix: monorepo sync handles trailing slashes, version-file paths, and packages-dir. Sync no longer produces double-slash globs from workspace.toml paths with trailing slashes. Action inputs like
go-version-fileare rewritten to include the sub-project path.pypa/gh-action-pypi-publishgetspackages-dirinjected whenworking-directoryis set. - **Fix: monorepo publish workflow renamed to
publish.yml.** The monorepo publish router was namedpublish-router.yml, which broke PyPI Trusted Publishing OIDC claims. Now alwayspublish.ymlin both standalone and monorepo contexts. - Fix: monorepo sync handles trailing slashes, version-file paths, and packages-dir. Sync no longer produces double-slash globs. Action inputs like
go-version-fileare rewritten for sub-project paths.pypa/gh-action-pypi-publishgetspackages-dirinjected.
#0.27.0
#Breaking
- Breaking: JSONL changelog required.
rlsbl releasenow requires.rlsbl/changes/to exist. The manual CHANGELOG.md heading check fallback has been removed. Runrlsbl scaffold --updateto set up JSONL changelogs. - Breaking: old lint.toml ignore format removed. The deprecated flat
ignorekey in.rlsbl/lint.tomlis no longer supported. Use per-language config in.rlsbl/lint/python.tomletc. - **Breaking:
get_*method aliases removed from BaseTarget.** Target implementations now use bare method names (version_file,template_dir, etc.) matching the ReleaseTarget protocol. - Breaking: lint returns empty results when no language detected. Previously defaulted to Python scanning; now requires a language marker file (pyproject.toml, go.mod, package.json).
#0.26.1
#Fixes
- Fix: Watch CI hint points to the correct commit. The release command now captures the pushed SHA before running post-release hooks, so
rlsbl watchtargets the release commit instead of a post-hook auto-commit.
#0.26.0
#Features
- **
rlsbl yankcommand.** Deprecate or delete past releases. Soft yank (rlsbl yank v1.2.3) marks the GitHub Release as a pre-release with a deprecation notice. Hard yank (rlsbl yank v1.2.3 --hard) deletes the GitHub Release and its git tag entirely. - **PyPI release bumps
__version__.** Python source files containing__version__are now updated alongsidepyproject.tomlduring release, keeping runtime version introspection in sync. - Strict type validation for JSONL entries. Changelog entries with
user_facing: truenow requiretypeto be one offeature,fix, orbreaking. Unrecognized types are rejected during validation andchangelog add.
#Fixes
- Fix: scaffold stays in sub-project directory. In monorepos,
rlsbl scaffoldno longer walks up to the repo root when project files already exist in the current directory. Previously this caused scaffold to operate on the wrong project.
#0.25.4
- No user-facing changes.
#0.25.3
#Fixes
- Fix: tag-based range for changelog validation. Unreleased commit detection now uses
<last_tag>..HEADinstead oforigin/main..HEAD. This correctly answers "what hasn't been released" rather than "what hasn't been pushed," and works regardless of branch naming convention or remote configuration.
#0.25.2
- No user-facing changes.
#0.25.1
#Fixes
- Fix: built-in lint only runs on library projects. The pre-release lint check no longer runs on CLI applications, avoiding false positives for
print()calls and entry points. Lint runs only for monorepo projects withlibrary = true. - Fix: CHANGELOG.md regenerated after JSONL finalization. The release command now regenerates CHANGELOG.md after renaming
unreleased.jsonlto the versioned file, so the changelog heading shows the version number instead of "Unreleased".
#0.25.0
#Features
- Structured JSONL changelog. Changelog entries are now backed by structured JSONL files in
.rlsbl/changes/. Each entry maps a description to commit hashes withuser_facingandtypefields.rlsbl changelog add/validate/generatecommands manage entries.rlsbl releaseauto-validates coverage and generates CHANGELOG.md. Pre-push blocks on missing coverage.rlsbl unreleaseduses exact hash matching.rlsbl statusshows coverage info. Scaffold creates the directory for new projects.changelog addauto-commits entries (with--no-commitopt-out). Coverage validation skips changelog-only commits. Internal commit logic centralized viacommit_fileshelper. Pre-push hook compatible with strictcli argument handling. - Changelog backfill script.
scripts/backfill_changelog.pymigrates an existing CHANGELOG.md into JSONL files by parsing entries, mapping them to commits via keyword matching, and writing per-version JSONL files.
#Fixes
- Fix: selfdoc CLI documentation. Replaced incompatible
code-helpdirectives with auto-generated CLI docs viaselfdoc gen, fixing the build warning after the strictcli migration. - Fix: monorepo commands commit without safegit.
monorepo init,add, andsyncnow properly fall back to plain git when safegit is not installed, instead of silently skipping the commit. - Fix: pre-push hook compatibility with strictcli. The pre-push hook no longer passes extra arguments that strictcli rejects. Release pushes (containing a version bump commit) skip the JSONL coverage check entirely since validation already ran during
rlsbl release.
#0.24.0
#Features
- **
rlsbl edit-release [version].** New command that updates GitHub Release notes from CHANGELOG.md. Auto-detects the current version if none is given. Supports--dry-runto preview without changes.
#0.23.1
- No user-facing changes.
#0.23.0
#Breaking
- Breaking: hooks are now scaffold-managed.
pre-release.shandpost-release.share no longer user-owned.scaffold --updatemerges template improvements into existing hooks via three-way merge. - **Breaking:
rlsbl initremoved.** Theinitalias forscaffoldhas been dropped. Userlsbl scaffolddirectly. - **Breaking:
--registryflag removed.** Use--targetinstead. The--registryflag was deprecated since 0.20.0.
#Features
- Per-command help. CLI dispatch migrated to strictcli. Every command and monorepo subcommand now has its own
--helpwith typed flags, arguments, and descriptions. - Multi-ecosystem library lint. Library boundary lint now supports Go and npm in addition to Python. Go lint detects forbidden imports (
net/http,cobra,urfave/cli),fmt.Println, andfunc main(). npm lint detects forbidden imports (express,koa,commander, etc.),console.log, andbinentry points. - AST and regex lint backends. Each language has two lint implementations: tree-sitter AST (accurate, default) and regex (lightweight fallback). Select via
parser = "regex"in.rlsbl/lint.toml. - Per-language lint config. Lint rules are now configured in
.rlsbl/lint/python.toml,go.toml, andnpm.tomlwith[forbidden-imports],[stdout], and[entry-point]sections. Scaffold generates these with sensible defaults. The oldlint.tomlignore list is deprecated; a warning is shown if detected. - Built-in pre-release checks.
rlsbl releasenow runs tests and lint automatically before releasing. No hook customization needed for standard checks. Skip with--skip-testsor--skip-lint. - Two-hook model. New
pre-checks.shhook runs before built-in checks (for setup tasks). The existingpre-release.shruns after (for custom validation). - Standalone library lint.
rlsbl doctor --check library-lintnow works on any project, not just monorepo libraries.
#Fixes
- Fix: lint false positives from vendored code. The lint file walker no longer descends into
.venv/,node_modules/,__pycache__/, and other non-source directories.
#0.22.1
#Features
- Name check short-circuiting. When a name is already taken, variant checking and GitHub repo lookups are now skipped, reducing API calls from 6 to 1-2 per taken name. Ultranormalization breaks after the first conflict instead of checking all 64 variants.
- Reason-specific explanations. Check results now explain WHY a name was rejected: stdlib module conflict, npm moniker collision, or visual similarity. Previously only the status ("taken") was shown.
- PyPI caveats for available names. Available PyPI names now always show the prohibited names list warning and suggest
--ultranormalized-variantswhen the flag wasn't used. - Steps-run summary. Verbose check output ends with a "Checked:" line listing which validations ran (registry, stdlib, variants, GitHub, ultranormalization, moniker similarity).
- Multi-name summary. Batch checks now print an aggregate summary ("N available, M taken") and the delay setting after the table.
- Rate limit retry visibility. HTTP 429 retries now print "Rate limited, retrying in Ns..." to stderr instead of sleeping silently.
#0.22.0
#Features
- Library boundary lint. Tag monorepo projects with
library = truein workspace.toml (ormonorepo add --library true) to enforce library discipline.rlsbl doctor --check library-lintdetects forbidden imports (argparse, flask, click, etc.),print()calls, and CLI entry points in library source files via Python AST analysis. Logging usage is flagged as a warning. Violations block releases via the pre-release hook. Supports.rlsbl/lint.tomlignore lists for false positives. - **Library column in
monorepo status.** Shows which projects are tagged as libraries. Dynamic column — hidden when no projects havelibrary = true. - PyPI check: Simple API. Switched from the JSON API to the Simple API for availability checks. Fixes false "available" results for package names that are registered but have no releases.
- PyPI check: stdlib collision detection. Names that conflict with Python standard library modules (like
queue,json,os) are now reported as taken without hitting the network. - **PyPI check:
--ultranormalized-variants.** New flag that generates visual-similarity variants (l/1/i and o/0 substitutions) and checks each against PyPI. Catches names likeclithat PyPI rejects due to collision withcl1. - npm check: moniker similarity detection. The npm check now queries the search API to detect moniker conflicts — names that npm considers identical after stripping punctuation. Catches cases like
selfdocconflicting withself-doc. - **
rlsbl doctor --check <name>.** Run a single diagnostic check by name instead of all checks. Useful in CI and pre-release hooks.
#Fixes
- Fix: scaffold template variable resolution for secondary targets. Multi-target projects (e.g., pypi+npm) no longer leave
{{registryUrl}}unresolved when npm is a secondary target.
#0.21.2
#Features
- Hook output is now visible. Pre-release and post-release hooks stream stdout/stderr to the terminal in real-time. On failure, the actual exit code is shown instead of a generic error message.
- **
RLSBL_HOOK_TIMEOUTenvironment variable.** Configure a timeout in seconds for release hooks. Default is no timeout (hooks run to completion), fixing the previous 120-second hard limit that silently killed long-running test suites.
#0.21.1
#Features
- **
rlsbl release --allow-dirty.** Release with uncommitted changes in the working tree. Pre-existing dirty files are tracked and excluded from the unexpected-files safety check, so genuinely new unexpected files are still caught. - **
monorepo addpasses--targetto scaffold.** When an explicit target is specified (e.g.,--target plain), it is forwarded to the scaffold subprocess instead of relying on auto-detection. Removes a special case wheremonorepo addpre-created a VERSION file for plain targets.
#0.21.0
#Features
- **Cross-registry
depends_onin workspace.toml.** Monorepo projects can now declare explicit dependencies on siblings in any ecosystem:depends_on = ["framework"]. These edges are respected byrelease-order, counted instatusDeps/Rdeps columns, and shown inoutdatedwith status "explicit". Usemonorepo add --depends-on name1,name2to set them during project registration. - **
plaintarget for no-build-system projects.** Register template directories, shared config, or other non-code projects withmonorepo add --target plain. Uses a plainVERSIONfile, creates GitHub Releases with changelog notes, but generates no CI or publish workflows. Standard tag format. - **
--targetflag onmonorepo add.** Explicitly specify any target type, bypassing auto-detection. Works for all registered targets, not justplain. - Reusable npm binary wrapper. The platform-specific npm package distribution pattern (esbuild/biome/turbo-style) is now a shared module used by both Go and Zig targets. Platform list is configurable via
npm_wrapper.platformsin project config. - Zig target. New release target for Zig projects. Detects
build.zig.zon, manages versions viaVERSIONfile with best-effort.zonsync, generates CI (viamlugg/setup-zig) and publish workflows that cross-compile for 6 platforms from a single runner. Supports optional npm binary wrapper distribution. - CI router fix for projects without workflows.
monorepo syncno longer includes projects without CI workflows in the CI router, preventing references to non-existent workflow files.
#0.20.0
#Breaking
- **Breaking:
rlsbl checknow requires--target.** The implicit default of checking both npm and PyPI has been removed. Specify--target npm,--target pypi, or--target goexplicitly.
#Features
- Multi-name checking.
rlsbl check foo bar baz --target pypichecks multiple names in one invocation and prints a compact table. Single-name invocations still show the verbose format with variants. - **Rate limiting for
rlsbl check.** New--delayflag (default 200ms) throttles between names. HTTP 429 responses from PyPI/Go/GitHub trigger automatic retry with exponential backoff. - **
rlsbl monorepo check-names.** Batch-check name availability for all workspace projects. Supports--prefixand--suffixto evaluate namespacing strategies (e.g.,--prefix www- --target pypi). - **
rlsbl monorepo outdated.** For each project, shows its intra-workspace dependency constraints against current sibling versions. Reports versioned deps as ok/outdated, and labels workspace/path references. - **Dependency columns in
rlsbl monorepo status.** New Deps and Rdeps columns show how many workspace siblings each project depends on and how many depend on it. Hidden when no intra-workspace dependencies exist. - Monorepo-aware pre-push changelog check. The pre-push hook now detects monorepo context and only checks changelogs for projects whose files appear in the pushed commits.
- **Per-subcommand help for
rlsbl monorepo.** Each subcommand now has its own--helpwith usage and description. - Path dependency rewriting for PyPI. When building a PyPI package in a monorepo, path dependencies (e.g.,
core @ {root:uri}/../core) are automatically rewritten to versioned constraints in a temp copy. The working tree is never modified. - **
rlsbl monorepo release-order.** Shows the topological order to release projects in, based on intra-workspace dependencies. Detects cycles.
#0.19.1
- No user-facing changes.
#0.19.0
#Features
- **
rlsbl deploy [name]command.** Deploy to configured targets via SSH with health checks (HTTP, TCP, script) and automatic rollback on failure. Configure targets in.rlsbl/config.jsonunder thedeploykey. Supports--dry-runto preview without executing and--forceto override branch restrictions. - Deploy CI workflow template.
rlsbl scaffoldgenerates a deploy workflow when deploy targets are configured. - Project root discovery. rlsbl now finds the project root automatically, so commands work from any subdirectory (like git, cargo, npm).
- Scaffold untracks gitignored files.
rlsbl scaffoldrunsgit rm --cachedon tracked files matching new.gitignoreentries. - **Monorepo: lock files moved to
.rlsbl-monorepo/.**rlsbl releaseno longer creates a spurious.rlsbl/directory at the repo root. - Deploy after publish.
rlsbl releaseruns deploy automatically after publish completes. Deploy failures do not undo the release — retry withrlsbl deploy <name>.
#0.18.1
#Features
- **
env_fileconfig key.** Set"env_file": "~/path/to/.env"in.rlsbl/config.jsonto load environment variables before release. Useful for secrets needed by target publish steps (e.g.,CLOUDFLARE_API_TOKENfor docs deploys).
#0.18.0
#Breaking
- **Breaking: removed
--includeand--excludeflags fromrlsbl release.** Target selection for releases is now config-only viarelease_targetsin.rlsbl/config.json.
#Features
- Go binary distribution: Homebrew tap. Go binary projects can now scaffold Homebrew tap support. Set
{"homebrew": {"tap": "homebrew-tap"}}in.rlsbl/config.jsonto add abrews:section to the goreleaser config and passHOMEBREW_TAP_TOKENto the publish workflow. Users install viabrew install user/tap/tool. - Go binary distribution: npm wrapper. Go binary projects can scaffold npm binary wrapper packages (the esbuild/biome/turbo pattern). Set
{"npm_wrapper": {"scope": "@user"}}to generate platform-specific packages for 6 platforms (linux/darwin/win32, x64/arm64), a wrapper package withoptionalDependencies, a bin script, and a publish workflow that packages goreleaser archives into npm packages. Users install vianpm install -g @user/tool.
#0.17.0
#Features
- Cross-target metadata in templates. Multi-target projects now merge template variables from all targets during scaffold, not just the primary. Variables are namespaced by target (
{{pypi.minRequiredPython}},{{npm.minRequiredNode}}). CI templates include runtime version references from project manifests (requires-python,engines.node,godirective,rust-version). - **
rlsbl doctor: metadata consistency checks.** Three new checks validate that package name, license, and description are consistent across targets. Names are normalized per registry conventions (npm scope stripping, PyPI PEP 503, Go module path). Mismatches produce warnings, not failures. - Per-target subdirectory paths. Targets can now live in subdirectories. Configure with
{"name": "npm", "path": "npm/"}in thetargetsarray (plain strings still default to project root). Version sync, build, publish, doctor, status, and scaffold all resolve per-target paths. Useful for projects that ship wrapper packages alongside the main artifact.
#0.16.1
#Features
- npm scaffold: lockfile warning.
rlsbl scaffoldnow warns when an npm project has no lockfile (package-lock.json,pnpm-lock.yaml, oryarn.lock) and adds a "run npm install" step to the next steps output. Prevents broken CI fromnpm cifailing on first push.
#0.16.0
#Features
- **
rlsbl doctorcommand.** Diagnoses release state with 7 checks: stale lock file, version consistency across targets, local/remote tag existence, GitHub Release existence, branch sync, changelog coverage.--fixauto-repairs safe issues (stale locks, missing remote tags, missing GitHub Releases). - Lock file hardening.
.rlsbl/lockadded to gitignore template.atexithandler ensures lock cleanup on process exit. Newis_stale()helper for doctor. - Go scaffold: goreleaser ldflags. Goreleaser template now includes
-X main.version={{.Version}}for version injection at build time. - Go scaffold: dynamic goreleaser main field.
main:field auto-detects root vscmd/<name>/project structure via{{goreleaserMain}}template variable. - Go scaffold: version.go generation. Binary Go projects get a scaffolded
version.gowithReadBuildInfofallback forgo installusers. Libraries are excluded. - npm: package manager detection.
NpmTargetdetects pnpm, yarn, or npm by searching for lock files from the project directory up to the git root. - npm: per-manager CI and publish templates. Separate CI and publish workflow templates for npm, pnpm, and yarn. pnpm templates include
pnpm/action-setup@v4. All CI templates now include an install step before testing.
#0.15.0
#Features
- Deleted built-in config migration engine. Removed
rlsbl/lib/(ConfigMigrator, schema_loader, ~440 LOC), therlsbl configsubcommand tree, and all associated tests (~1,500 LOC). Config migrations are now handled by the externalmigrabletool. - **
rlsbl migratecommand.** Shells out tomigrable migrate --config-dir .rlsbl. Supports--dry-runand--status. Gives install instructions if migrable is not found. - **
--jsonflag forrlsbl status.** Outputs structured JSON with name, version, target, branch, tag, clean, changelog, ci, publish. - Documented hidden flags.
--no-commitand--skip-sharednow appear inrlsbl scaffold --help. - Go root main detection.
rlsbl scaffoldwarns when a Go project has its main package incmd/<name>/instead of the project root, sincego install module@latestwon't work.
#0.14.0
#Features
- Router watch paths. Projects in a monorepo can declare extra file patterns to watch via
--watchonmonorepo addor thewatchkey inworkspace.toml. The CI router generates multi-line path filters including both the project directory and all watch entries. - Swift target split. New
swift-appletarget for Apple-platform Swift projects (macOS-only CI). The existingswifttarget keeps macOS+ubuntu for server-side Swift.swift-applerequires explicit declaration in.rlsbl/config.json(no auto-detection). - Subtree publishing. Monorepo projects with
subtree_remoteconfigured get automatic git subtree pushes after release. The project's subdirectory is split and pushed to a mirror repo with plain semver tags, enabling SPM consumption. A GitHub Release is also created on the mirror. Failures are non-fatal. - Explicit target enforcement.
rlsbl scaffoldnow warns when using auto-detected targets and always writes the detected target to.rlsbl/config.json, ensuring subsequent runs use explicit config. - **
monorepo statusenhanced.** Optional Watch column (path count) and Remote column (subtree URL) appear when projects use these features. - **
monorepo syncwarns for Swift projects** withoutsubtree_remote, since SPM can't resolve monorepo-style prefixed tags. - 12 registered targets. swift-apple joins npm, pypi, go, swift, cargo, deno, docker, hex, maven, spec, docs.
#0.13.1
#Features
- **Monorepo sync adds
working-directory.** Synced CI workflows now includedefaults: run: working-directory: {path}so steps run in the correct project subdirectory. - Monorepo add shows guidance. When no target is detected, the error now suggests which manifest files to create.
- Dynamic merged publish workflows. Multi-target projects now get dynamically generated publish workflows composed from each target's individual template. Supports all 11 targets, replaces the static npm+pypi+go-only merged template.
#0.13.0
#Features
- Monorepo support. New
rlsbl monorepocommand family for managing multi-project repos with independent versioning. Projects remain fully standalone — extracting to a solo repo requires zero config changes. -monorepo initcreates a.rlsbl-monorepo/workspace.tomlworkspace manifest. -monorepo add <path>registers a project (auto-detects target, auto-scaffolds, auto-syncs CI). -monorepo remove <path>unregisters a project. -monorepo listshows all registered projects. -monorepo statusshows version, latest tag, target, and unreleased changelog entries per project. -monorepo synccopies per-project CI workflows to root, rewrites triggers toworkflow_call, generates a CI router (paths-filter dispatch) and publish router (tag-prefix dispatch), sets copies read-only with source header. - Scoped releases in monorepos.
rlsbl releaseinside a monorepo project automatically prefixes tags ([email protected]), scopes version reads/writes and changelog to the project subdirectory, and uses a scoped commit message. - **Monorepo-aware
rlsbl status.** Shows monorepo tag format and project count hint when inside a monorepo project. - Scaffold triggers monorepo sync. Running
rlsbl scaffoldinside a monorepo project automatically syncs workflows to root.
#0.12.0
#Features
- 7 new release targets. swift (SPM), cargo (Rust/crates.io), deno (JSR), hex (Elixir/hex.pm), maven (Gradle/Maven), docker, spec (versioned specifications). Each with CI/publish templates and hybrid publish support.
- Opt-in target config. Projects declare targets in
.rlsbl/config.json"targets"array. Auto-detection remains as fallback for existing projects. - Hybrid publish.
rlsbl releasepublishes locally when ecosystem token is available (NPM_TOKEN, CARGO_REGISTRY_TOKEN, HEX_API_KEY, etc.). Falls back to CI otherwise. - Private registry workflow.
rlsbl scaffold --private(or auto-detected) skips publish.yml, generates a post-release hook that uploads artifacts to GitHub Releases. Prints consumer install instructions. - tomlkit replaces TOML regex.
pyproject.tomlediting (version bumps, keyword injection) now uses tomlkit for correct round-trip editing with comment preservation. Fixes edge cases with[project.urls]sub-tables. - detect_targets() covers all targets. Auto-detection now finds all 11 registered targets, not just npm/pypi/go.
#0.11.3
#Features
- **
--include/--excluderelease flags.** Control which targets run during release. Replaces--skip-docs. - **
release_targetsconfig.** Declare baseline targets in.rlsbl/config.jsonto avoid auto-detect surprises.
#0.11.2
#Features
- Watch re-polls for late-starting workflows. After initial runs complete, waits 5 seconds and re-polls for workflows that started late (e.g., Publish triggered by GitHub Release creation). Fixes missing Publish detection.
#0.11.1
#Features
- Release aborts if behind remote. Fetches origin before releasing and exits if local branch is behind. Use
--skip-remote-checkfor offline releases. - Watch reports which workflows ran. After CI completes, prints a summary table of workflow names and results. Warns if a publish workflow exists on disk but didn't trigger.
#0.11.0
#Features
- Docs system extracted to selfdoc.
rlsbl docscommands removed. DocsTarget now detectsselfdoc.jsonand delegates to theselfdocCLI. Install selfdoc separately for documentation generation. - **
rlsbl checkincludes GitHub repo search.** Shows repo count as informational context (not an availability check) after registry checks. - Codehome target removed. The plugin target and
rlsbl registercommand were premature and have been removed pending a more mature design.
#0.10.1
#Features
- Codehome target rewrite. Now root-scoped: each plugin (or plugin group) lives in its own repo with
plugin.json. Standardv1.2.3tags, no namespacing. Push is delivery. - **
rlsbl registercommand.** Prints the JSON registry entry for the current plugin repo (name, repo URL, description, plugins provided). - Scaffold template for codehome.
rlsbl scaffold --target codehomecreates CI workflow that validates plugin.json. - Plugin validation. Release validates
plugin.jsonhas required fields (name, version, description) and valid semver.
#0.10.0
#Features
- Codehome plugin target.
--target codehome --scope plugins/<name>releases individual plugins from a monorepo. Reads/writesplugin.toml, creates namespaced tags ([email protected]). - Docs target. Auto-generate documentation from Python docstrings and deploy to Cloudflare Pages or GitHub Pages.
rlsbl docs init/build/serve/deploycommands. Zero external dependencies (stdlibast+ built-in MD/HTML converter). - **
rlsbl targetscommand.** Lists all available targets with detection status, scope type, and version file. - Multi-target release. Secondary root-scoped targets (e.g., docs) auto-run build+deploy during release. Use
--skip-docsto opt out. - **
--targetand--scopeCLI flags.**--targetselects the release target explicitly.--scoperestricts operations to a subdirectory for subdir-scoped targets. - Scoped release safety. Validates scope path exists, includes pyproject.toml in commit for plugin targets, warns when
--scopeis used with root-scoped targets. - **
--registrydeprecated.** Use--targetinstead. Prints a deprecation warning when used.
#0.9.1
#Features
- **
rlsbl config showsubcommand.** Barerlsbl confignow prints help; useconfig showfor project info. - Race condition parsing fix. Porcelain parser handles stripped leading whitespace correctly.
#0.9.0
#Features
- **
rlsbl unreleasedcommand.** Lists commits since last tag, cross-references CHANGELOG entries, reports coverage status. Supports--jsonfor machine-readable output. - **
rlsbl prscommand.** Lists open GitHub pull requests for the current repo. - Config management system.
rlsbl config init/migrate/statussubcommands for managing project config with schema-driven migration (deep merge, flat merge, list-by-key merge strategies, versioned migrations, atomic writes). - Scaffold auto-commits. Created files are committed automatically (use
--no-committo opt out). Runs config migrations when.rlsbl/config-schema.jsonexists. - Parallel watch.
rlsbl watchpolls CI runs concurrently (total time = max of all runs, not sum). - Parallel variant checking.
rlsbl checkuses ThreadPoolExecutor for concurrent registry queries. - Advisory lockfile.
.rlsbl/lockprevents concurrent release/scaffold operations. - **
rlsbl undoimprovements.** Auto-pushes revert commit (with confirmation prompt, or automatic with--yes). Prints structured failure summary table with remediation commands on partial failure. - Pre-release suffix support.
bump_versionhandles versions like1.0.0-beta.1. - **
--forceno longer overwrites user-owned files.** CHANGELOG.md, LICENSE, and hooks are preserved even with--force. - **Pre-release hook receives
RLSBL_VERSION.** Matches the existing post-release hook behavior. - Release race condition fix. Aborts if unexpected files are modified before commit.
- Top-level error handler sanitized. No longer exposes sensitive CalledProcessError details.
- Discover hardened. Pagination capped at 20 pages; retries once on HTTP 403 with
Retry-Afterheader. - **
record-gifvalidates flags.** Clear error message on non-integer flag values. - Release prompt mentions ecosystem tagging when enabled.
- npm check timeout. Variant checking has 10-second subprocess timeout.
#0.8.3
#Features
- Pre-release hook runs Python checks before npm (faster failure)
- Go CI template uses
go-version-file: go.modinstead of hardcoded versions; adds-raceflag - Node.js 24 in all CI/publish templates (dropped Node 18 EOL)
#Fixes
- Fix watch: resolve short SHAs to full 40-char (
gh run list --commitrequires it)
#0.8.2
#Features
- Handle KeyboardInterrupt in watch command (clean exit, no stack trace)
- Escape AppleScript strings in watch notifications (prevents injection via git tags)
- Clear error when
--registryis missing a value - Resolve project config path at call time (not module import time)
- Add
--width,--height,--font-size,--durationflags to record-gif
#0.8.1
#Features
- Templates included in wheel. Moved
templates/into therlsbl/package so non-editable installs (pip, pipx) get them. Previouslyrlsbl scaffoldcrashed on PyPI installs. - **
undochecks prerequisites.** Now verifies gh CLI auth and clean working tree before proceeding. - TOML trailing comma fix. Adding the rlsbl keyword no longer produces a double comma.
- **Pagination URL validation in
discover.** Only followsLinkheader URLs pointing toapi.github.com. - **
.rlsbl/versionincluded in release commit.** No more orphaned version marker changes. - Non-ASCII preserved in package.json.
json.dumpsnow usesensure_ascii=False.
#0.8.0
#Features
- Universal three-way merge for scaffold updates. Replaced all format-specific merge strategies (YAML job-level, JSON deep-merge, line-based, section append) with
git merge-file. Bases are stored in.rlsbl/bases/at scaffold time. On--update, user customizations and template updates merge cleanly; conflicts get git-style conflict markers. - **Removed
ruamel-yamldependency.** No longer needed since YAML-aware merging is replaced by three-way text merge. - Detailed scaffold output. Every file now shows its action: created, updated, merged, unchanged, user-owned, or CONFLICTS.
#0.7.0
#Features
- **Removed
check-prscommand.** Was a useless wrapper aroundgh pr list. - **JSON deep-merge for
.claude/settings.json.** Scaffold now merges new template keys into existing user settings instead of skipping the file. User values are preserved. - YAML job-level merge for CI workflows.
ci.ymlandpublish.ymlare now merged at the job level: rlsbl-managed jobs are updated, user-added jobs are preserved. Usesruamel.yamlfor comment-preserving round-trip parsing. - Explicit USER_OWNED category.
CHANGELOG.md,LICENSE, and hooks are formally marked as user-owned and never overwritten. - LICENSE year update.
scaffold --updateextends the copyright year range to the current year.
#0.6.0
#Features
- Scripts moved to subcommands.
check-prs.sh,record-gif.sh, andpre-push-hook.share no longer scaffolded intoscripts/. They are now built-in subcommands:rlsbl record-gif,rlsbl pre-push-check. - **
rlsbl watchcommand.** Monitors all CI runs for a commit, prints results to stderr, sends desktop notification, exits 1 on failure.rlsbl releaseprintsWatch CI: rlsbl watch <sha>for easy invocation. - Removed built-in background CI watcher from
rlsbl release. Userlsbl watchexplicitly instead. - **Hooks moved to
.rlsbl/hooks/.**pre-release.shandpost-release.shmoved fromscripts/to.rlsbl/hooks/.rlsbl releaselooks for hooks there. - Pre-push hook is a one-liner.
.git/hooks/pre-pushnow callsexec rlsbl pre-push-check "$@"instead of being a full script copy. Updates happen viauv tool upgrade rlsbl, not re-scaffolding.
#0.5.2
#Features
- Version detection reads source tree first.
__version__now readspyproject.tomldirectly when running from source, fixing stale metadata from editable installs. - CLAUDE.md template is registry-specific. Publish setup instructions (NPM_TOKEN, Trusted Publishing, GoReleaser) now match the project's registry instead of always showing NPM_TOKEN.
- Gitignore merge normalizes trailing slashes.
*.egg-info/and*.egg-infoare now recognized as duplicates during scaffold merge. - **
record-gif.shno longer hardcodes/tmp/.** Uses baremktempfor portability. - **Go check hidden by default in
rlsbl check.** Only shown with--registry go. Labels changed from "available"/"taken" to "not found"/"exists" since Go modules use repository paths. - **Auth hint on 403 in
rlsbl discover.** Suggestsgh auth loginwhen rate-limited.
#0.5.1
#Features
- CI watcher prints to stderr. The background CI watcher now writes results to inherited stderr instead of attempting tty detection. AI agents and terminal users both see CI pass/fail in their output stream. On failure, the GitHub Actions run URL is printed.
- **
*.local-onlygitignore pattern.** Scaffolded.gitignorenow includes*.local-only. Use a.local-only/directory or*.local-onlysuffix to keep files out of version control without per-file gitignore entries.
#0.5.0
#Features
- Post-release hooks.
scripts/post-release.shruns after a successful release withRLSBL_VERSIONenv var set. Non-fatal (release is already complete). Scaffolded viarlsbl scaffold. - CI watcher. After pushing, rlsbl spawns a background process that watches CI via
gh run watchand sends a desktop notification (notify-send on Linux, osascript on macOS) when CI passes or fails. - Ecosystem discoverability:
rlsbl discovercommand lists all rlsbl-tagged projects via GitHub topics rlsbl configshows ecosystem tagging status and source--quietflag is respected by all tagging output- Auto-tagging:
scaffoldandreleaseinject"rlsbl"keyword into package.json/pyproject.toml and add therlsblGitHub topic - Opt-out via
--no-tagflag, project config (.rlsbl/config.json), or user config (~/.rlsbl/config.json) rlsbl discover --minefilters to the authenticated user's repos
#0.4.2
#Features
- Configurable push timeout via
RLSBL_PUSH_TIMEOUTenv var (default 120s), fixing timeouts on repos with slow pre-push hooks - Print a note when
RLSBL_PUSH_TIMEOUToverrides the default
#Fixes
- Fix own pre-push hook missing VERSION file detection for Go projects
#0.4.1
#Features
- Go adapter uses VERSION file as version source (not git tags)
- First release bootstraps from VERSION without bumping
- Pre-release.sh template auto-detects Go/npm/Python and runs appropriate checks
- Pre-push hook template supports Go VERSION file
- GoReleaser NEXT_STEPS clarified (CI handles it, no local install needed)
#0.4.0
#Features
- Go project support: scaffold with GoReleaser, CI, and publish workflows
- Version-file-less registries: release skips commit step when version is the git tag
- Go name availability check via pkg.go.dev
- Cross-compilation template (linux/darwin/windows x amd64/arm64)
#0.3.1
- No user-facing changes.
#0.3.0
#Features
- Confirmation prompt on release (skip with --yes)
configcommand: show detected registries, scaffolding state, workflows, hooksundocommand: revert a botched release (deletes tag, reverts commit, deletes GitHub Release)- Merged publish workflow for dual-registry projects (scaffold generates one file with both npm + pypi jobs)
#0.2.0
#Features
- CLI redesign:
--registryflag replaces positional registry argument - Rename
check-namecommand tocheck - All commands are top-level:
rlsbl release,rlsbl check,rlsbl scaffold,rlsbl status
#Fixes
- Fix astral-sh/setup-uv version (v7, not v8)
#0.1.1
#Fixes
- Fix astral-sh/setup-uv version (v8 tag doesn't exist, use v7)
#0.1.0
#Features
- 4 top-level commands:
release,status,scaffold,check-name - Initial release as
rlsbl(renamed from share-it-on) - Pure Python (stdlib only, Python 3.11+, tomllib for TOML parsing)
- Auto-detects registries from project files (package.json, pyproject.toml)
- Release syncs version across all detected version files
- Context-aware scaffold: appends CLAUDE.md, merges .gitignore, preserves custom CI
- Hash-based
--updatemode detects customized files - Pre-release hook, pre-push changelog enforcement
- Dual-publish CI: npm (token) + PyPI (OIDC Trusted Publishing)
- Also installable via npm (thin Node wrapper)