- Add internal/notify package: best-effort release notifications to Slack, Microsoft Teams, Google Chat, Telegram, and a generic JSON webhook; every target is independently opt-in and a failed notification never fails the release
- Add notify config section (slack_webhook_url, teams_webhook_url, google_chat_webhook_url, telegram_bot_token/telegram_chat_id, webhook_url) with matching env var fallbacks; 100% coverage plus FuzzMessagePayloads
- Wire notification sending into run() — fires after tag+push (including --no-release), skipped on --no-push/--no-commit since nothing was published yet
- Document the notify section in README, Hugo docs, and .releaser.yml template; update CLAUDE.md architecture/fuzzing tables
- Also commit the Apache License 2.0 docs-site footer link (docs/hugo.toml geekdocContentLicense), left uncommitted from a prior change
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>
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 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>
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>