- refuse to release when the clone is shallow and no previous release tag
is found: tags beyond the fetch depth would silently restart versioning
at X.Y.0; --allow-shallow bypasses the guard for a true first release
- new --check preflight validates the release environment without
releasing: branch resolution + pattern, working tree, tag discovery,
shallow clone, remote origin URL parse (same parse the push performs),
push auth method, version files, release target — all problems reported
at once, non-zero exit on failure
- .releaser.gitlab-ci.yml gains an optional .releaser:check MR-pipeline
job; CI examples now set GIT_DEPTH: 0
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- CurrentBranch falls back to CI_COMMIT_BRANCH, CI_COMMIT_REF_NAME, then
GITHUB_REF_NAME when HEAD is detached, so --branch is no longer required
in GitLab CI / GitHub Actions jobs
- go-git push paths (token and SSH agent) now push HEAD's commit hash to
the branch instead of refs/heads/<branch>, which never exists in a
detached CI checkout — go-git silently skipped the branch update and
pushed only the tag
- .releaser.gitlab-ci.yml template drops the redundant --branch flag
- docs: README, usage, ci-integration, changelog, ROADMAP updated
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Add `go tool staticcheck ./...` between vet and test in the `task ci`
pipeline. Fix the SA4006 finding it surfaced: the PlainOpen error in
TestLatestTagTagsIterFails was assigned but never read (the nil check was
lost when the skip logic was simplified).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Docker CI containers run as root by default (golang:1.26-alpine), where
os.Chmod has no effect and permission restrictions don't apply. Four
tests were failing because they relied on chmod to force error paths:
- gradle: TestWriteVersionReadOnly
- cmd: TestInitConfigWriteFails, TestRunLatestTagFails
- gitutil: TestLatestTagTagsIterFails (had broken skip logic that only
fired if Chmod itself errored, which never happens as root)
Replace all four with an upfront os.Getuid() == 0 check so they are
skipped cleanly in root environments and still run (and must pass) on
non-root local development.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add internal/node package: reads/writes package.json version (single or
multi-path via node.package_json / node.package_jsons)
- Add maven.pom_paths support: update multiple pom.xml files in one release
commit; pom_paths overrides pom_path; --pom flag clears pom_paths
- Add git.bump_rules config: per-type control of which version component bumps
(breaking/feat/fix accept "patch" or "minor"); wired through version.Next()
as a new sixth parameter
- Extract injectable function vars (absPath, gitAllCommits, gitCommitsSince,
gitCommitFiles) to enable error-path testing without interfaces
- Achieve 100% per-package statement coverage across all 12 packages
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>