
managing-git-workflow
Automates git commits, push, and PR creation with context-aware messages and ticket extraction. Use
Managing Git Workflow
Overview
Turn an explicit Git or pull-request request into one bounded operation. Resolve scripts/skill-set-git relative to the directory containing this SKILL.md, then invoke that absolute path directly for all Git and GitHub activity. Do not depend on a host-specific plugin-root environment variable or a shell variable persisting across tool calls. References use <git-runner> as a non-executable placeholder; replace it with the resolved absolute path in every invocation. The runner returns JSON, preserves shell metacharacters through file arguments, and applies index and remote compare-and-swap checks before mutation.
Authorization Boundary
Inspection is read-only. Run inspect whenever repository state may have changed.
Treat each mutation as a separate capability:
commit: authorized only by a request to create a commit; never pushes.push: authorized only by a request to push; publishes existing commits only.pr-create: authorized only by a request to create a PR; may push existing commits when the PR branch is not current remotely.
Do not infer one capability from another. A commit request does not authorize push, and a push request does not authorize creating a commit. Never execute direct Git or GitHub commands from this skill.
Workflow Selection
| Request | Reference | Runner operation |
|---|---|---|
| Inspect or commit | reference/commit.md | inspect, commit |
| Push existing commits | reference/push.md | inspect, push |
| Create or find a PR | reference/pr.md | inspect, pr-create |
Common Contract
- Parse successful stdout as one JSON object.
- Parse a nonzero command's stderr as a recoverable JSON error.
- Stop on stale
index_fingerprint, changed remote SHA, behind/diverged history, or ambiguous scope. - Use
--dry-runbefore a mutation when the requested scope is not already fully confirmed. - Ask
input-preparefor a managed path, replace its exactSKILL_SET_INPUT_REPLACE_MEsentinel through the scoped Edit capability, then pass it as--message-fileor--body-file. - Preserve staged, unstaged, and untracked distinctions in every user-facing summary.
Commit Scope Rules
- With no paths, commit the current index only.
- With user-named paths, pass one
--pathper path. The runner rejects staged paths outside that scope. - Pass
--allonly when the user explicitly requested every current change. - If the index is empty and no scope was named, ask for paths. Do not infer them from nearby files.
- Generate the message from
commit_context.staged_diffor thestaged_previewreturned by commit dry-run, not from a general working-tree summary.
Language Detection
Detect the user's language from the current conversation, project instructions, and recent commit subjects returned by inspect. Default to English. Adapt user-facing messages, commit messages, and PR text; keep commands, paths, and technical identifiers in English.
Safety Invariants
- Never publish from
commit. - Never create a commit from
pushorpr-create. - Never include dirty files in a PR implicitly.
- Require explicit confirmation before proceeding with dirty files excluded from a new PR.
- Return an existing PR URL instead of creating a duplicate.
- Use the committed PR range
origin/<base>...HEADreported by the runner. - Do not resolve divergence or remote races automatically; report the recovery decision to the user.
- If the user cancels after preparing text, remove its managed allocation with
input-discard. - Never pass an unchanged sentinel; the runner rejects it before any commit, push, or PR creation.
References
reference/commit.md— index/path scope, message generation, and index CASreference/push.md— expected remote SHA and existing-commit publicationreference/pr.md— committed PR scope, dirty exclusion, and existing PR detection