Commit and push the current branch
Ship the working tree on the branch that is checked out. This skill never creates or switches branches. Explicit invocation on a branch, including the default branch, authorizes the push to that branch. For a feature branch off the default, use commit-push.
Contract
| Field | Bound contract |
|---|---|
| Trigger | A human explicitly invokes this skill to commit and push to the checked-out branch. |
| Authority | Human-only: explicit human invocation is the authorization. The skill previews the exact push target and the commit set before the push. The write set is local commits on the checked-out branch and one push to origin/<current-branch>. Rollback is git reset --hard <prior-HEAD> for new commits and a revert commit for pushed work. No remote mutation beyond the previewed push. |
| Side effect | Local commits on the checked-out branch and one git push to origin/<current-branch>. No branch creation, no branch switch, no pull request, no force push. |
| Done | The checked-out branch is committed and pushed: git status --porcelain is empty and git rev-list --left-right --count origin/<current-branch>...HEAD prints 0 0. |
Inputs
- Working-tree state (
git status,git diff HEAD): required, gathered by the skill. - Current branch and recent history (
git branch --show-current,git log --oneline -10): required, gathered by the skill. - Push-target state (
git rev-list --left-right --count origin/<current-branch>...HEAD): required, gathered by the skill.NO_REMOTE_BRANCHmeans the local tracking ref is absent; step 5 observes the remote withgit ls-remote --heads origin <current-branch>to decide whether the branch is new. - Default branch (
git rev-parse --abbrev-ref origin/HEAD, thengit ls-remote --symref origin HEAD, thengh repo view --json defaultBranchRef --jq '.defaultBranchRef.name'verified againstgit ls-remote --heads origin <default>): required as the preview base for a branch new toorigin. When every resolver fails, the skill stops; a default branch is never guessed.
Procedure
- Gather context: run
git status,git diff HEAD,git branch --show-current,git log --oneline -10,git remote,git rev-list --left-right --count origin/$(git branch --show-current)...HEAD 2>/dev/null || echo NO_REMOTE_BRANCH, andgit rev-parse --abbrev-ref origin/HEAD 2>/dev/null || echo DEFAULT_BRANCH_UNRESOLVED. Whengit remotelists noorigin, skip the resolution below; step 4 reports local-only. Otherwise, strip theorigin/prefix from the default branch; treatDEFAULT_BRANCH_UNRESOLVEDor bareHEADas unresolved. When unresolved, rungit ls-remote --symref origin HEADand take the branch named by the firstref: refs/heads/<name>line. When that fails too, rungh repo view --json defaultBranchRef --jq '.defaultBranchRef.name'and accept its name only whengit ls-remote --heads origin <name>lists it. When every resolver fails, reportDEFAULT_BRANCH_UNRESOLVEDand stop; never guess. Done when: tree state, branch, recent history, push-target counts, and default branch are known, or the skill has stopped. - Classify the branch state. Done when: the state is classified and the skill continues or stops.
- Detached HEAD (empty branch name): there is no branch ref to push. Report that this skill pushes only the checked-out branch and stop.
commit-pushcreates a feature branch when one is wanted. - Nothing to do (clean tree and zero on the right side of the push-target counts): report and stop.
- Clean tree with commits ahead of the push target, or
NO_REMOTE_BRANCHwhenoriginexists: skip to step 5. Withoutorigin, continue to step 4 and report local-only. - Otherwise: continue.
- Detached HEAD (empty branch name): there is no branch ref to push. Report that this skill pushes only the checked-out branch and stop.
- Author the commits with
commit. Its message conventions, atomicity rules, and staging discipline apply. Do not restate them here. Its default-branch auto-branching does not apply: invocation on the checked-out branch is explicit authorization to commit on it. Done when:commitreports the working tree committed, or reports nothing to commit. - Detect the remote with
git remote. If nooriginremote exists (empty output, or other remotes but none namedorigin), do not push and do not add or guess a remote. Report local-only and stop. Done when:originis confirmed present, or the local-only result is reported. - Preview the push and wait for explicit human approval. Name the target
origin/<current-branch>and observe the remote:git ls-remote --heads origin <current-branch>. Non-empty output (branch exists onorigin): refresh the tracking tip withgit fetch --no-tags origin refs/heads/<current-branch>:refs/remotes/origin/<current-branch>; when the fetch fails, report and stop without pushing. Listgit log --oneline origin/<current-branch>..HEAD. Empty output (branch new toorigin): say so, then list the full commit rangegit log --oneline origin/<default>..HEAD, materializing the base first withgit fetch --no-tags origin refs/heads/<default>:refs/remotes/origin/<default>; when that fetch fails and no localorigin/<default>exists, report and stop without pushing, never falling back to an unanchored or truncated listing. A failedls-remotecall means the remote cannot be observed: report and stop without pushing. The push always targetsorigin, even when the configured upstream points elsewhere. Show the target and the commit list, then wait for the human to approve the exact mutation set (platform blocking question tool, chat fallback). On no answer or refusal, stop with nothing pushed. On approval, push withgit push -u origin HEAD. Never force-push. Done when: the push is accepted, or the rejection or a stop is reported. - Verify:
git status --porcelainis empty andgit rev-list --left-right --count origin/<current-branch>...HEADprints0 0. Done when: both read clean, or the residue is reported.
Failure and recovery
- Detached HEAD: report and stop. No commit is created. Suggest
commit-pushfor a feature branch. - Nothing to do: report and stop. No mutation occurs.
- No
originremote: report local-only with the commit list. Never add, invent, or guess a remote. - Default branch unresolved after
origin/HEAD,git ls-remote --symref origin HEAD, and verifiedgh: report and stop. A branch new tooriginhas no honest preview base without it. Never guess a default branch. - No fetched base for a new-branch preview (fetch of
<default>failed andorigin/<default>is absent): report and stop before the push. The commit set is never previewed from HEAD alone or truncated. - Tracking-tip refresh fails before an existing-branch preview: report and stop without pushing.
- Push rejected on a diverged remote branch: report the rejection and the counts from
git rev-list --left-right --count origin/<current-branch>...HEAD. Leave resolution to the user. Never force-push. - Verification residue (non-empty
git status --porcelain, or counts other than0 0): report the uncommitted files or unpushed commits. Do not claim done.
Output
The committed working tree on the checked-out branch, one push to origin/<current-branch>, and a report naming the branch, the pushed commit hashes and subjects, and the verification result. When no origin remote exists, a local-only report naming the commits left unpushed.