| name | quick-push |
| description | Stage, commit, and push the current repository changes with an optional version bump and changelog update. Use when the user says "quick push", "push my changes", "commit and push", "ship this", "push to a new branch", or asks to publish the current worktree. Session logging is handled separately by wrap-session so quick-push never mutates the personal knowledge base. Accepts optional `--no-bump` argument to skip the version bump. |
| allowed-tools | Bash, Read, Edit, Write, TodoWrite |
Context
- Current branch: !
git branch --show-current
- Git status: !
git status --short
- Remote info: !
git remote -v | head -1
- Change scope: !
git rev-parse --verify HEAD > /dev/null 2>&1 && git diff --stat HEAD || echo "(no commits yet)"
- Recent commits: !
git rev-parse --verify HEAD > /dev/null 2>&1 && git log --oneline -5 || echo "(no commits yet)"
Your task
Work through these steps in order. The arguments string $ARGUMENTS may contain --no-bump.
1. Orient
- Capture the intended dirty set before staging with
git status --short and
review exactly what will be included.
- If the working tree is clean, continue in clean-tree mode: skip version bump
and changelog edits, then push any unpushed commits. If there are no unpushed
commits, stop and report that there was nothing to push.
- If dirty files appear unrelated, pre-existing, or unclear and you are not
operating inside a known owned worktree, stop before staging and ask for
confirmation or a narrower path. Whole-repo staging is only safe when the
worktree is owned for this wrap-up or the user explicitly confirms the dirty
set.
- If on main/master, create a new feature branch with a descriptive name based on the changes
2. Bump version (before staging)
Skip this step in clean-tree mode.
Detect the project type and bump the version based on the nature of the changes in context.
Bump rules (based on what you observe in the diff):
- Breaking API/behavior change → major (X+1.0.0)
- New feature or capability → minor (X.Y+1.0)
- Everything else (fix, chore, refactor, test, docs, etc.) → patch (X.Y.Z+1)
Process:
- Read the current version from the primary manifest (first match:
Cargo.toml, package.json, pyproject.toml)
- Determine bump type from the changes in context (the commit prefix you'll write in step 5 should match)
- Calculate the new version
- Update the version in ALL version-bearing files that exist in the repo:
Cargo.toml — version = "X.Y.Z" in [package] (or [workspace.package] for Rust workspaces)
- every tracked
package.json with a top-level "version" field, including app packages such as apps/*/package.json; skip dependency folders such as node_modules, build output, and vendored third-party packages
pyproject.toml — version = "X.Y.Z" in [project]
- Do not add or bump
.claude-plugin/plugin.json or .codex-plugin/plugin.json version fields unless that specific repo documents a manifest-level version contract. Lab marketplace plugin identity is Git-SHA based, and these manifests normally omit version.
README.md version line/badge when present, for common forms like Version: X.Y.Z, version-X.Y.Z, or vX.Y.Z
- If a repo has a release checklist or other explicit version-sync contract, follow it before committing. Prefer repo-local tests/scripts for this if present.
- If Rust: run
cargo check to update Cargo.lock (it records the version) — if cargo check fails, stop and report the error
- Verify version sync before staging:
git grep -F "<old_version>" -- '*.toml' '*.json' '*.md' '*.yml' '*.yaml'. Review hits and fix any that represent the current project version (not historical release notes / changelog entries / dependency pins on third-party packages).
- Report:
Version: X.Y.Z → A.B.C (bump type) and list which files were updated
Skip conditions:
- Version is
0.0.0 or 0.0.1 (project not yet versioned)
- No manifest file found
--no-bump appears in $ARGUMENTS
3. Update CHANGELOG.md (before staging)
Skip this step in clean-tree mode unless the session-log update creates or
changes a changelog entry by explicit user request.
If a CHANGELOG.md exists in the repo root:
- This step documents prior commits. Do not add the current push's own entry here because its commit SHA is not known yet.
- If the version was bumped, ensure the changelog has a release section for the new version, e.g.
## [A.B.C] - YYYY-MM-DD, and move any current ## [Unreleased] content under it when the repo uses Keep a Changelog style.
- Find the most recently documented commit in the changelog (look for commit hashes in the table)
- Run
git log --oneline <last_documented_sha>..HEAD to get undocumented commits
- If there are new commits, update the changelog:
- Add new rows to the commit summary table (newest first)
- Update the Highlights section with grouped summaries
- Keep the existing structure and style
- If the changelog format is unrecognizable (no commit hash table, no clear anchor), skip rather than guess
- If no CHANGELOG.md exists, skip this step
4. Preserve the session-logging boundary
quick-push publishes the current repository only. It does not invoke save-to-md, log-code-session, or wrap-session, and it does not stage artifacts from ~/docs or another repository.
When session closeout is also requested, run wrap-session as a separate workflow after the repository push so the final commit, PR, CI, and verification state can be recorded accurately.
5. Stage, commit, and push
Notes:
- If creating a new branch, name it based on the changes (e.g.,
feat/add-user-auth, fix/navbar-styling)
- The changelog update is part of the commit — it goes in the same commit as the other changes
- Session and maintenance logs belong to the separate
wrap-session workflow and personal knowledge-base repository
- Run
wrap-session after the push when final commit, PR, CI, or verification state matters
- End with a summary of what was pushed and the branch name
- List all unfinished tasks in the session and next steps for the user to consider
- If any step fails (e.g., version bump, changelog update, push), report the error and stop the process to avoid partial commits
- Never force push or delete branches without explicit user instruction