Files
holocron/plugins/git/skills/git-commits/SKILL.md
Defame1297 20e5627fd7 fix(git): correct three command claims the plugin got wrong, and give rebase an owner
Three statements were false against the git in use (2.39.5), each verified by
running it.

`git rebase --autosquash HEAD~N` without `-i` is a silent no-op: git prints
"Successfully rebased", the `fixup!` commit survives with the same SHA, and
rewrite-history.md presented that as the preferred flow with `-i` as an optional
review step. The agent reports the squash as done and the `fixup!` subject then
trips this repo's own commit-msg gate. `-i` is now the command, not the alternative.

"Fetch never modifies a local branch, so it is always safe to run" — new text on
this branch — is false: `git fetch origin main:probe` fast-forwarded the local
branch, and a `+` prefix force-updates it, losing commits. The claim is scoped to
the no-refspec form.

`git worktree add --orphan` does not exist before Git 2.42; on 2.39.5 it is
`error: unknown option 'orphan'`, exit 129. The same file gives a version floor for
`--recurse-submodules` three sections earlier. Floor added, with a fallback that
was tested before being documented.

git-workflow claimed "every request resolves to exactly one of these six" while
rebase, reset and stash were owned by no skill — `git reset` appeared nowhere in
the plugin, old tree or new — so "undo my last commit" routed nowhere. The claim is
gone, the router gains rows for all three, and the procedures now exist: plain
rebase with `--onto` and conflict handling, a reset mode table gated on `--hard`,
and stash save/pop/list/drop. `--hard` gets an always-loaded Gotcha, matching the
register the force-push refusal already sets.

Cherry-pick had three claimants pointing at git-history while git-commits owned the
flow, and the two copies were not equivalent — git-history's lacked the destination
check, the rtk prefix and `--abort`. Resolved to git-commits per #112; the weaker
duplicate is replaced by a hand-off.

git-commits' metadata.version was deleted rather than bumped in 14af50b, leaving two
house-contract documents citing a worked v0.1.2 to v0.1.3 transition against a file
declaring no version. Restored to 0.1.3.

Also: the divergent-pull explanation stated a `--ff-only` default that does not
exist (it is a hard error); `--remote` "requires" a configured branch where it uses
one; `git push origin --delete` moved to git-remotes, which owns the remote-side
gates; seven retired `git:<name>` source slugs; git-orchestrate quoted a
git-workflow sentence that no longer exists; git-submodules regains the indirect
trigger that made "add a dependency repo" routable; and commit atomicity is a common
gate rather than reachable only from the create flow.

Refs: #112, #113
2026-09-01 12:38:38 +00:00

3.6 KiB

name, description, metadata, allowed-tools
name description metadata allowed-tools
git-commits Use when creating, amending, squashing, or cherry-picking commits, including writing and validating the Conventional Commits message. Not history inspection -> `git-history`. Not branch lifecycle -> `git-branches`.
version category source_keys
0.1.3 git
conventional-commits-spec
commitlint-config-conventional
org-commit-conventions
context7-git-htmldocs
Bash

Gotchas

  • Run git as rtk git <subcommand>, never bare git — org convention, in && chains too.
  • Refuse to force-push main/master — a rewrite leaves the branch diverged and the reflex is to force it back; safe only where nobody else has based work on it.
  • reset --hard is a confirmation gate, not a default. It overwrites the working tree, and uncommitted edits it discards were never in git, so no reflog recovers them. Name what will be lost and offer a stash first.
  • Never add --no-verify — using it when a hook fails bypasses the QA gate the pipeline depends on. Only on the user's explicit demand, with a warning.

Dispatch

Read exactly one flow file. Each is self-contained.

Condition Flow Read
Composing a new commit from staged changes create references/create-commit.md
Amending, squashing, folding a fixup, rebasing onto a new base, or resetting HEAD rewrite references/rewrite-history.md
Replaying an existing commit onto the current branch cherry-pick references/cherry-pick.md

Gates on every flow

  1. Confirmation. No history rewrite executes without explicit approval from the user or the calling agent. Cherry-pick needs the destination branch confirmed first.
  2. Atomicity. The result must be one logical, independently reviewable and reversible change that leaves the repository buildable and testable. This binds an amend or a squashed result as much as a fresh commit — say so before writing it, not after.
  3. Secrets. Before any commit or amend, scan the staged diff for anything resembling an API key, token, password, connection string, or environment-specific config. Stop and flag it rather than committing it.
  4. Validation. Check the message against commitlint config-conventional before committing. If a type, footer, or breaking-change edge case is not obvious, read references/conventional-commits-spec.md — it carries the constraint table, the 11-type set, and the footer token rules.
  5. SemVer impact. Report the bump the commit implies: feat → MINOR, fix/perf/revert → PATCH, any breaking change → MAJOR, everything else → none. Callers decide releases from this, so never omit it.
  6. Conflicts. If a rebase or cherry-pick halts, offer resolution or an abort. Do not resolve automatically without confirmation.

Output

For an agent caller, return:

{
  "operation": "create|amend|squash|cherry-pick",
  "status": "success|conflict|rejected",
  "message": "commit message or error description",
  "commit_hash": "abc1234",
  "semver_impact": "MAJOR|MINOR|PATCH|none",
  "breaking_change": false,
  "confirmation_required": false,
  "details": {
    "type": "feat",
    "scope": "api",
    "description": "add user authentication",
    "body": "optional body text, or null",
    "footers": ["Fixes: #123", "Refs: #456", "Co-authored-by: Bob <bob@example.com>"]
  }
}

details.footers is an array of the resolved trailer lines, empty when there are none — never a single joined string, and never omitted. Downstream agents index it.

For a human caller, show the same fields as a prose preview with a confirmation prompt.