Bump version and update changelog without tagging or releasing
Bumps project version and updates changelog for development milestones without tagging or releasing.
/plugin marketplace add https://www.claudepluginhub.com/api/plugins/zigrivers-scaffold/marketplace.json/plugin install zigrivers-scaffold@cpd-zigrivers-scaffold<major|minor|patch or --dry-run>Bump the project version and update the changelog without tagging, pushing, or creating a GitHub release. A lightweight companion to /scaffold:release for marking development milestones — like completing a set of user stories or reaching a pre-release checkpoint.
$ARGUMENTS
Gather project context before proceeding.
git branch --show-current).git status --porcelain). If dirty, warn (do not block): "Working tree has uncommitted changes. They will not be included in the version bump."git fetch --tags.Scan the project root for version files. For each found file, record the current version:
| File | How to Read Version |
|---|---|
package.json | .version field |
pyproject.toml | [project].version or [tool.poetry].version |
Cargo.toml | [package].version |
.claude-plugin/plugin.json | .version field |
pubspec.yaml | version: field |
setup.cfg | [metadata].version |
version.txt | Entire file contents (trimmed) |
.beads/ directory → enables Beads integration in changelog.CHANGELOG.md.v* tags: git tag -l 'v*' --sort=-v:refname | head -5.Parse $ARGUMENTS to determine the mode:
| Argument | Mode |
|---|---|
| (empty) | Auto — analyze commits, suggest bump |
major, minor, or patch | Explicit — skip analysis, use specified bump |
--dry-run | Dry Run — preview only, zero mutations |
If --dry-run is combined with a bump type (e.g., minor --dry-run), use both: explicit bump + dry-run mode.
If no version files are found and no v* tags exist:
package.json, Cargo.toml, pyproject.toml, etc.).package.json exists but has no "version" → add "version": "0.1.0" field.version.txt with 0.1.0.version.txt with 0.1.0.<file> with version 0.1.0?" Confirm before proceeding.If no v* tags exist but version files do exist, note the current version — commit analysis will use all commits.
Skip this phase if: Explicit mode or first-bump mode (Phase 0.5 just created the version file).
Get commits since the last tag (or all commits if no tags):
git log <last-tag>..HEAD --oneline --no-merges
If no tags exist, use all commits: git log --oneline --no-merges.
Categorize each commit:
| Pattern | Bump |
|---|---|
feat: or feat(scope): | minor |
fix: or fix(scope): | patch |
BREAKING CHANGE: in body or !: suffix | major |
perf:, refactor:, docs:, chore:, style:, test:, build:, ci: | patch (non-feature change) |
Apply the highest-wins rule.
Show the user:
Commits since <last-tag>: <count>
feat: <count> commits
fix: <count> commits
other: <count> commits
BREAKING: <yes/no>
Suggested bump: <major|minor|patch>
<current-version> → <new-version>
Ask: "Confirm this bump, or override? (major / minor / patch / confirm)"
If no conventional commits were found, fall back: "No conventional commits found. What type of bump? (major / minor / patch)"
Record the confirmed version.
In dry-run mode: Display the changelog preview but do not write to disk. Skip to Phase 4 (summary).
Group commits since the last tag (or all commits for first bump) by type:
## [vX.Y.Z] - YYYY-MM-DD
### Added
- feat: description (commit-hash)
### Fixed
- fix: description (commit-hash)
### Changed
- refactor: description (commit-hash)
- perf: description (commit-hash)
### Other
- chore: description (commit-hash)
Omit empty sections. Use the commit's first line (without the type prefix) as the description.
If .beads/ exists:
bd list --status closed (or parse .beads/issues.jsonl for closed issues).BD-xxx or scaffold-xxx in commit messages).### Completed Tasks
- [BD-xxx] Task title
- [BD-yyy] Task title
If .beads/ does not exist or no tasks match, silently skip.
CHANGELOG.md exists: prepend the new entry after the # Changelog heading (or after any header block).CHANGELOG.md does not exist: create it with:# Changelog
All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/).
## [vX.Y.Z] - YYYY-MM-DD
...
In dry-run mode: Show which files would change and the commit message. Skip to Phase 4.
For each version file detected in Phase 0.2, update the version to the new value.
If applicable:
package-lock.json exists → run npm install --package-lock-onlyCargo.lock exists → run cargo update -wStage all changed files and commit:
git add <changed-files>
git commit -m "chore(version): vX.Y.Z"
If a Beads task is active, include the task ID: [BD-xxx] chore(version): vX.Y.Z.
Show the final summary:
Version bump complete!
<current-version> → <new-version>
Version files updated: <list>
Changelog: CHANGELOG.md updated
This was a version bump only — no tags, no push, no GitHub release.
When ready for a formal release: /scaffold:release current
In dry-run mode:
Dry-run complete — no changes were made.
Would bump: <current> → <new>
Would update: <version-files>
Would create/update: CHANGELOG.md entry
Run /scaffold:version-bump to execute.
/scaffold:release for the full ceremony..beads/ doesn't exist.chore(version): — distinct from release's chore(release):.When this step is complete, tell the user:
Version bump complete — version files updated, changelog written, commit created.
Next (if applicable):
/scaffold:release current — Tag, publish, and create a GitHub release for the version already in files./scaffold:quick-task — Create a focused task for post-bump work.Pipeline reference: /scaffold:prompt-pipeline