- Add Apache License 2.0 (Copyright 2026 K3nnyfr <alex@k3nny.fr>), linked from a new README License section
- Fix task docs:build leaving stale files in docs/public by passing --cleanDestinationDir to hugo
- Ignore /.task/ (Task runner's local checksum cache)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Add internal/pyproject package with ReadVersion and WriteVersion for
pyproject.toml files. Reads [project].version (PEP 621) first, then
falls back to [tool.poetry].version. Section boundaries are detected
via TOML's rule that headers always start at the beginning of a line
(\n[ pattern), so inline arrays with [ characters don't interfere.
Config follows the established multi-value pattern:
- python.pyproject_toml: single path (opt-in, no default)
- python.pyproject_tomls: list for monorepos (overrides single)
- --pyproject flag overrides pyproject_toml and clears pyproject_tomls
100% per-package statement coverage maintained across all 14 packages;
FuzzReadVersion and FuzzWriteVersion added per fuzzing guidelines.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
All git.k3nny.fr/releaser links were missing the /k3nny/ namespace.
Fixed in docs/hugo.toml (geekdocRepo + geekdocEditPath), installation,
ci-integration, and changelog pages. Also added repo link to the docs
home page and README.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add releaser-logo-1024.png as Geekdoc site header logo (geekdocLogo)
and a 128×128 resized copy in README
- Set docs/hugo.toml baseURL to https://releaser.k3nny.fr/
- Anchor .gitignore binary pattern to /releaser-* to stop it matching
files inside docs/static/images/
- Restore docs URL link in README lost during merge to main
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- docs/hugo.toml: set geekdocLogo to images/releaser-logo-1024.png so
Geekdoc renders it in the site header
- docs/static/images/releaser-logo-128.png: 128×128 version resized from
the 1024×1024 source via ImageMagick for README display
- README.md: add logo above the release badge
- .gitignore: scope releaser-* to repo root (/releaser-*) so it no
longer matches files inside docs/static/images/
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Add go tool staticcheck ./... to the task ci pipeline (between vet and
test), consistent with the Gitea CI workflow. Fix the SA4006 it surfaced
in TestLatestTagTagsIterFails where err from PlainOpen was assigned but
never read before being overwritten.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Four tests relied on os.Chmod to force error paths but were failing in
Docker CI (golang:1.26-alpine runs as root, where chmod restrictions have
no effect). Added os.Getuid() == 0 skip guards to:
- internal/gradle: TestWriteVersionReadOnly
- internal/gitutil: TestLatestTagTagsIterFails (replaced broken skip logic
that only fired if Chmod itself errored)
- cmd: TestInitConfigWriteFails, TestRunLatestTagFails
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Add internal/gradle package with ReadVersion and WriteVersion for
build.gradle (Groovy DSL, single-quoted) and build.gradle.kts (Kotlin
DSL, double-quoted). Quote style is preserved on write. regexp.QuoteMeta
ensures version strings with dots or special characters are safe.
Config follows the established multi-value pattern:
- gradle.build_file: single path (opt-in, no default)
- gradle.build_files: list for multi-module projects (overrides build_file)
- --gradle flag overrides build_file and clears build_files
100% per-package statement coverage maintained across all 13 packages;
FuzzReadVersion and FuzzWriteVersion added per fuzzing guidelines.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add Hugo + Geekdoc documentation site (docs/): installation, CLI
reference, configuration, CI integration, and changelog pages; explicit
menu bundle nav so all pages appear in the sidebar on every page
- Add Gitea CI workflow (.gitea/workflows/docs.yml): builds on push to
main when docs/** changes, deploys minified site to gh-pages branch
- Add docs:setup / docs:serve / docs:build Taskfile tasks; theme bundle
downloaded at build time (not committed)
- Add FuzzUpdate to internal/changelog and FuzzWriteVersion to
internal/node to complete fuzz coverage for all file-rewriting packages
- Add fuzzing completeness guidelines to CLAUDE.md: authoritative table,
exempt-package rationale, seed corpus rules
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>
- GitHub release support: internal/ghclient (no SDK, minimal HTTP client);
GITHUB_TOKEN env var; github.token/github.repo config; GitHub takes
precedence over GitLab when both are configured; publisher interface
(releasePublisher) in cmd/main.go makes providers interchangeable
- SSH agent push: gitutil.Push() now tries gitssh.NewSSHAgentAuth for
git@/ssh:// remotes before falling back to the system git binary
- --release-env-file flag: override dotenv artifact path; pass "" to disable
- git.releasable_types config: filter which commit types trigger a bump
(defaults to fix, feat, breaking); useful for maintenance branches
- commits.Group(), ExtractSubject(), ReleasableSet() exported helpers:
notes.go and changelog.go now delegate to these instead of duplicating
- CHANGELOG deduplication guard: changelog.Update() is idempotent — skips
write if ## [version] section already exists
- Always load config sources: LoadWithSources() called unconditionally;
removes the dual config path that previously only tracked sources in
--verbose mode
- .releaser.gitlab-ci.yml: adds artifacts: reports: dotenv: release.env
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Documents the release.env feature: a NEXT_VERSION=<tag> file written
to the repo root on every real release, intended as a GitLab CI dotenv
artifact for passing the version to downstream pipeline jobs.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- --verbose flag: config source table, per-commit type analysis, version
decision explanation; output always to stderr
- Colored structured output: logStep/logDone/logWarn symbols, ▸ verbose
section headers, TTY-aware ANSI colors (NO_COLOR / TERM=dumb respected)
- Name + version header printed at the start of every invocation
- Default tag_prefix changed from "v" to "" (bare 1.2.3 tags by default)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Tags are now bare version numbers by default (e.g. 1.2.3).
Set tag_prefix: "v" in .releaser.yml or pass --tag-prefix v to opt in
to the v-prefixed convention.
Updated all affected tests, the .releaser.yml template comment, and
the README configuration reference.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Prints a configuration table on startup showing each key, its value,
and the source (default / config file / env: VARNAME / flag: --name)
- Lists every commit since the last tag with its parsed type and
the version-bump decision (feat/fix/breaking → patch bump, or ignored)
- Explains the final version choice: highest commit type → next tag
- All verbose output goes to stderr so it never pollutes stdout captures
- Sources tracking wired through config.LoadWithSources and
ApplyEnvWithSources; LoadWithSources uses a two-pass approach to
detect which YAML fields were explicitly set vs defaulted
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Automatically write/update CHANGELOG.md on every release, grouped by
Breaking Changes / Added / Fixed; file is created if missing and the
new section is committed alongside pom.xml in the release commit
- Add --init flag: scaffolds a default .releaser.yml in the repo root
- Add --changelog-file flag: override the default CHANGELOG.md path
- Add CommitFiles() to gitutil so pom.xml and CHANGELOG.md are staged
in a single commit
- Fix HTTPS push when no token is set: delegate to the git CLI so that
system credential helpers, SSH agents, and netrc are honoured
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
If pom.xml (or the configured maven.pom_path) is absent, releaser now
logs a notice and proceeds to tag and push without failing. This makes
the tool usable in non-Maven projects. An os.Stat error that is not
ErrNotExist (e.g. permission denied) still surfaces as an error.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
go build ./cmd/... tried to write a binary named "cmd" which conflicts
with the source directory of the same name; pass -o /dev/null so the
build step only verifies compilation without writing output.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>