Finding 13: five blocks of near-identical wording were repeated across skills within a plugin — the gitea "resolve owner and repo" step (5 skills), the 404-masks-403 note (6 files), the manual pagination explanation (8 files), the git plugin's main/master force-push refusal (7 files, some with multiple internal restatements), and the bin skills' domain-glossary/ADR paragraph (5 skills). Tightened each instance in place — same meaning, fewer words — rather than extracting to a shared file, which ADR-0014's one-file-per-skill install constraint rules out. Left the three git skills' structured-result JSON shapes alone (coupled to the separate, out-of-scope git-orchestrate merge candidate, finding 19). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YR2CjVumUbEGWcMikcoXBD
3.7 KiB
3.7 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`. |
|
Bash |
Gotchas
- Run git as
rtk git <subcommand>, never baregit— org convention, in&&chains too, except where a skill's Gotchas name a specific bare-git case (interactive rebase here). - Refuse to force-push
main/master. A rewrite diverges the branch and the reflex is to force it back — safe only where nobody else has based work on it. reset --hardis 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
- Confirmation. No history rewrite executes without explicit approval from the user or the calling agent. Cherry-pick needs the destination branch confirmed first.
- 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.
- 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.
- Validation. Check the message against commitlint
config-conventionalbefore committing. If a type, footer, or breaking-change edge case is not obvious, readreferences/conventional-commits-spec.md— it carries the constraint table, the 11-type set, and the footer token rules. - 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. - 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.