You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
🩹 fix(skills): make bump_release.sh accept patch, minor and major bumps - #813
from AI(claude-code, claude-sonnet-5-5, i760-bump-release-fixes)
Fixes#760 (bump-release: JSON mode treats every bump as a failure, and feat! parses as MINOR)
The release script bump_release.sh stopped with "Failed to analyze commits" whenever analyze_commits.py found a release to make, because that program reports patch, minor and major as exit codes 1, 2 and 3. The script now stops only when the exit code is above 3 or the output is not JSON. prepare-release.yml reads the same exit codes, so the workflow is unchanged.
On main, bump_release.sh also stopped when there was nothing to release, with a Python JSONDecodeError. The analyze_commits() function printed its "Analyzing commits since last release..." line to stdout, in front of the JSON that main() reads. That line now goes to stderr, and messages from analyze_commits.py reach the terminal directly, so the function prints only the JSON on stdout.
bump_release.sh starts a release only when you run it as a program, so a test can load its functions without starting one.
Run mise run skills:test-bump-release to check commit parsing and the script's handling of each exit code; mise run check runs it too. Against the script on main, the tests for patch, minor, major, no bump and an exit code above 3 fail. The no-commits test passes on main as well, because the old script also stops when there are no commits. The commit-parsing tests pass on main because this PR leaves analyze_commits.py unchanged.
Decisions for codekiln
Add the bump-release script tests to CI?
I recommend adding a CI step for these tests: they finish in a few seconds and need no credentials. Without a CI job, a change that breaks bump_release.sh passes review, and nobody finds out until someone next runs the bump-release skill. I left the job out because #760 asks only for the script fix; say yes and I will add a step to .github/workflows/ci.yml.
…t feat! parsing
analyze_commits.py exits 0-3 for NONE/PATCH/MINOR/MAJOR, so bump_release.sh
must not treat a nonzero exit as failure. Keep stderr and the progress line
out of the JSON. Add tests for JSON mode on every bump and for feat! and
feat(scope)! parsing, run by `mise run skills:test-bump-release` and by
`mise run check`.
#760 bump-release: JSON mode treats every bump as a failure, and feat! parses as MINOR
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…ase.sh
#760 bump-release: JSON mode treats every bump as a failure, and feat! parses as MINOR
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…o reports what
#760 bump-release: JSON mode treats every bump as a failure, and feat! parses as MINOR
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
codekiln
changed the title
🩹 fix(skills): bump-release JSON mode accepts exit codes 1-3, and test feat! parsing
🩹 fix(skills): bump-release no longer stops when the commit analyzer reports a patch, minor or major bump
Oct 13, 2026
…'s jargon
#760 bump-release: JSON mode treats every bump as a failure, and feat! parses as MINOR
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
The new regression suite is only reachable through the local mise run check chain. .github/workflows/ci.yml runs its Rust commands directly and invokes neither check nor skills:test-bump-release, so a future breakage of this release script can still pass every PR check. Please add this task as a CI step/job so these tests enforce the fix during review.
codekiln
added
ready-for-review
Green CI, no open threads, Copilot settled; ready for codekiln to review and merge
and removed
wip
Not ready yet: an open PR short of the ready bar, or an issue an open PR closes
labels
Oct 14, 2026
codekiln
added
wip
Not ready yet: an open PR short of the ready bar, or an issue an open PR closes
and removed
ready-for-review
Green CI, no open threads, Copilot settled; ready for codekiln to review and merge
labels
Oct 14, 2026
The reason will be displayed to describe this comment to others. Learn more.
from AI(claude-code, claude-opus-5-5, langstar-label-rules)
AI (codekiln-review): The body's second bullet says what changed on stdout and leaves out the bug it fixes:
The analyze_commits() function in bump_release.sh now prints only the JSON on stdout. Messages from analyze_commits.py reach the terminal directly, and the function's "Analyzing commits since last release..." line goes to stderr.
The first bullet says the script stopped "whenever analyze_commits.py found a release to make", so a reader takes a run with nothing to release as working on main. It was not. I ran the bump_release.sh from origin/main with --dry-run --skip-checks in a scratch repository whose only commit after v1.2.3 was 📚 docs: reword, and it stopped with a Python json.decoder.JSONDecodeError: analyze_commits() printed its progress line to stdout, in front of the JSON that main() reads. The script at this commit prints "No releasable commits found since last release" for the same repository. Without that fact, codekiln reaches "the tests for patch, minor, major, no bump and an exit code above 3 fail" in the last bullet and has to work out why the no-bump test fails on main when the first bullet blamed only exit codes 1, 2 and 3.
On main, bump_release.sh also stopped when there was nothing to release, with a Python JSONDecodeError. The analyze_commits() function printed its "Analyzing commits since last release..." line to stdout, in front of the JSON that main() reads. That line now goes to stderr, and messages from analyze_commits.py reach the terminal directly, so the function prints only the JSON on stdout.
from AI(claude-code, claude-opus-5-5, langstar-label-rules)
AI (codekiln-review): Answering review 5715765570. The body's second bullet now reads:
On main, bump_release.sh also stopped when there was nothing to release, with a Python JSONDecodeError. The analyze_commits() function printed its "Analyzing commits since last release..." line to stdout, in front of the JSON that main() reads. That line now goes to stderr, and messages from analyze_commits.py reach the terminal directly, so the function prints only the JSON on stdout.
The reason will be displayed to describe this comment to others. Learn more.
from AI(claude-code, claude-opus-5-5, langstar-label-rules)
AI (codekiln-review): The CI decision says a broken script fails the next release, but no release step runs bump_release.sh.
Without a CI job, a change that breaks the script passes review and fails at the next release.
codekiln decides on this recommendation from this sentence, and the consequence it gives does not happen. The Prepare Release workflow runs analyze_commits.py directly, at prepare-release.yml:62, and git grep bump_release.sh finds the script named only in the bump-release skill's SKILL.md. I ran the bump_release.sh from origin/main in a scratch repository: it stopped with a release to make, with nothing to release and with no commits since the tag. Its analyze_commits() has read the analyzer that way since 94381dc ✨ feat: add automated CI/CD release pipeline with cross-platform builds (#146), and every release from v0.3.0 to v2.2.0 went out in that time. A break in bump_release.sh shows up the next time someone runs the skill by hand. Rules: My/Pref/Writing/Win the Reader's Trust and My/Pref/Writing/Be specific and explicit.
Rewrite:
Without a CI job, a change that breaks bump_release.sh passes review, and nobody finds out until someone next runs the bump-release skill.
The reason will be displayed to describe this comment to others. Learn more.
🟢 Approval recommended
No active review issues block approval of the analyzer exit-code handling changes.
No open issues 🎉
Review effort: Balanced
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
bugSomething isn't workingpriority: mediumReview after high: bug fixes and features with no open decisionwipNot ready yet: an open PR short of the ready bar, or an issue an open PR closes
2 participants
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
from AI(claude-code, claude-sonnet-5-5, i760-bump-release-fixes)
Fixes #760 (bump-release: JSON mode treats every bump as a failure, and feat! parses as MINOR)
bump_release.shstopped with "Failed to analyze commits" wheneveranalyze_commits.pyfound a release to make, because that program reports patch, minor and major as exit codes 1, 2 and 3. The script now stops only when the exit code is above 3 or the output is not JSON.prepare-release.ymlreads the same exit codes, so the workflow is unchanged.main,bump_release.shalso stopped when there was nothing to release, with a PythonJSONDecodeError. Theanalyze_commits()function printed its "Analyzing commits since last release..." line to stdout, in front of the JSON thatmain()reads. That line now goes to stderr, and messages fromanalyze_commits.pyreach the terminal directly, so the function prints only the JSON on stdout.bump_release.shstarts a release only when you run it as a program, so a test can load its functions without starting one.feat!:andfeat(scope)!:commits count as MINOR. That is wrong: the regex inanalyze_commits.pyalready reads the!and returns MAJOR onmain, so this PR adds tests for both forms.mise run skills:test-bump-releaseto check commit parsing and the script's handling of each exit code;mise run checkruns it too. Against the script onmain, the tests for patch, minor, major, no bump and an exit code above 3 fail. The no-commits test passes onmainas well, because the old script also stops when there are no commits. The commit-parsing tests pass onmainbecause this PR leavesanalyze_commits.pyunchanged.Decisions for codekiln
Add the bump-release script tests to CI?
I recommend adding a CI step for these tests: they finish in a few seconds and need no credentials. Without a CI job, a change that breaks
bump_release.shpasses review, and nobody finds out until someone next runs the bump-release skill. I left the job out because #760 asks only for the script fix; say yes and I will add a step to.github/workflows/ci.yml.🤖 Generated with Claude Code