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
61 lines
2.3 KiB
Markdown
61 lines
2.3 KiB
Markdown
---
|
|
name: git-remotes
|
|
|
|
description: >
|
|
Use when a git operation — remote config, fetch, push, or pull — touches a
|
|
remote, even when the user does not name it.
|
|
Not local commits -> `git-commits`.
|
|
Not local branches -> `git-branches`.
|
|
Not log or bisect queries -> `git-history`.
|
|
Not submodule pointers -> `git-submodules`.
|
|
|
|
metadata:
|
|
version: "1.0.3"
|
|
category: git
|
|
source_keys:
|
|
- git-scm-remote-docs
|
|
- git-scm-fetch-docs
|
|
- git-scm-push-docs
|
|
- git-scm-pull-docs
|
|
- context7-git-htmldocs
|
|
---
|
|
|
|
## Gotchas
|
|
|
|
- **`--force-with-lease` alone is not safe** — background processes (IDE plugins, cron jobs) running `git fetch` silently defeat the protection. Combine it with `--force-if-includes`, or pin the explicit `--force-with-lease=<ref>:<sha>` form.
|
|
- **Prune does not touch tags by default** — `git fetch --prune` leaves orphaned tags behind. Use `--prune --prune-tags`, or set `fetch.pruneTags true`.
|
|
- **Set `pull.ff only` explicitly** — do not trust the installed default.
|
|
|
|
## Step 1 — Clear the force-push gate
|
|
|
|
`main`/`master` are a hard refusal: decline a force-push to either regardless of confirmation — no local approval restores what the remote loses. Elsewhere, `rtk git push --force`/`-f` run only after `confirm: true` for that specific push; for a human caller, prompt instead of failing.
|
|
|
|
## Step 2 — Dispatch
|
|
|
|
Read the row matching the operation, and only that row — each file is self-contained. A task spanning two operations reads both.
|
|
|
|
| Operation | Read |
|
|
|---|---|
|
|
| Add, remove, rename, inspect, or re-point a remote; tracking, mirror, and `set-url` config | `references/remote-config.md` |
|
|
| Fetch or prune remote-tracking refs; shallow or partial fetch | `references/fetch.md` |
|
|
| Push branches or tags; refspecs; force-push | `references/push.md` |
|
|
| Pull — integrate remote changes into the current branch | `references/pull.md` |
|
|
|
|
## Step 3 — Return format
|
|
|
|
For agent callers, return:
|
|
|
|
```json
|
|
{
|
|
"success": true,
|
|
"operation": "push",
|
|
"remote": "origin",
|
|
"branch": "main",
|
|
"output": "...",
|
|
"warnings": ["force-with-lease not confirmed"],
|
|
"recommendations": ["set `pull.ff only` so the default does not vary by Git version"]
|
|
}
|
|
```
|
|
|
|
On failure, set `success: false` and add an `error` field holding the root cause and a recovery suggestion.
|