{
  "markdown": "# gh-resolve-skills\n\nThree skills for one job: getting a **blocked GitHub pull request** back to\nmergeable. GitHub greys out a merge button for three reasons — red required\nchecks, a branch with conflicts, and a head that is behind its base — and this\nrepo has one skill per reason. Packaged as a single plugin named `gh-resolve`,\ninstallable on six coding-agent harnesses.\n\nUnlike its sibling [`harness-skills`](https://github.com/dEitY719/harness-skills),\nthis repo owns no shared assets — it links out for the\n[per-harness tool mappings and the CI workflow](#shared-assets).\n\n## Skills\n\n| Skill | Invoke | What it does |\n|-------|--------|--------------|\n| `ci-fail` | `/gh-resolve:ci-fail [pr] [remote] [--wait <s>] [--label-variant <s>]` | Reads the failing required checks' logs, identifies the root cause, fixes it locally, re-runs the same lint/test command CI ran, fast-forward pushes, then removes the `CI fail` label. Never blind-retries a job. |\n| `conflict` | `/gh-resolve:conflict [pr] [remote] [--worktree <path>]` | Rebases the head onto its base and walks each conflicting file with the user's intent, then pushes with `--force-with-lease` and clears the `conflict` label and board status. |\n| `outdated` | `/gh-resolve:outdated [pr] [remote] [--worktree <path>]` | The cheap case: base moved, nothing conflicts. Clean rebase, `--force-with-lease` push, verify. Idempotent — safe to re-run. |\n\nPick by what GitHub is complaining about, not by what you would rather fix.\n`outdated` refuses to do `conflict`'s job and hands off by exit code the moment\na rebase produces a conflict; `conflict` never reads CI logs; `ci-fail` never\nrebases and never force-pushes.\n\nAdjacent verbs live elsewhere: creating a PR (`gh-pr:create`), merging one\n(`gh-pr:merge`), reviewing one (`gh-verify:review-all`), and replying to review\ncomments (`gh-pr:reply`) are all in other repos of this family. This repo starts\nwhen a PR is blocked and stops when it is mergeable again.\n\n### Visual guides and worked examples (GitHub Pages)\n\n- `ci-fail` — [visual guide](https://deity719.github.io/gh-resolve-skills/skill-guides/ci-fail.html) · [usage example](https://deity719.github.io/gh-resolve-skills/skill-output/ci-fail-usage.html) (red required checks to a green, pushed PR)\n- `conflict` — [visual guide](https://deity719.github.io/gh-resolve-skills/skill-guides/conflict.html) · [usage example](https://deity719.github.io/gh-resolve-skills/skill-output/conflict-usage.html) (a conflicting branch to a rebased, mergeable PR)\n- `outdated` — [visual guide](https://deity719.github.io/gh-resolve-skills/skill-guides/outdated.html) · [usage example](https://deity719.github.io/gh-resolve-skills/skill-output/outdated-usage.html) (an out-of-date head to a base-synced PR)\n\nEach page is generated from a Markdown source under\n[`docs/skill-guides/`](docs/skill-guides) and [`docs/skill-output/`](docs/skill-output).\n\n## Requirements\n\n| Need | Why |\n|------|-----|\n| `git` | All three rebase, commit, or push. |\n| `gh`, authenticated per host | Every skill binds `TARGET_HOST` + `TARGET_REPO` from the remote URL and prefixes each API call with `GH_HOST=` (dEitY719/dotfiles#1403), so GitHub Enterprise remotes work — but only if `gh` is logged into that host. |\n| A checkout on the PR's head branch | Or a detached scratch worktree passed as `--worktree <path>` (`conflict` / `outdated` only), which makes the PR number mandatory. `gh-pr:merge-train` owns that worktree's lifecycle; these skills never create or remove it. |\n| Not the default branch | All three refuse to run on the repo's default branch. |\n\n## Install\n\n### Claude Code\n\n```\n/plugin marketplace add dEitY719/gh-resolve-skills\n/plugin install gh-resolve@gh-resolve-skills\n```\n\n### Codex\n\n```\ncodex plugin install dEitY719/gh-resolve-skills\n```\n\n### Kimi CLI\n\n```\nkimi plugin install dEitY719/gh-resolve-skills\n```\n\n### Hermes Agent\n\n```\nhermes plugins install dEitY719/gh-resolve-skills\n```\n\n### OpenCode\n\nSee [`.opencode/INSTALL.md`](.opencode/INSTALL.md).\n\n### Gemini CLI / Antigravity\n\n```\ngemini extensions install https://github.com/dEitY719/gh-resolve-skills\n```\n\nAntigravity (`agy`) shares `~/.gemini`, so it inherits the install.\n\n## Harness support\n\nThese skills are `git`, `gh`, and local file edits, so they port well. The only\nClaude-Code-specific capabilities they reach for are `AskUserQuestion` (the\nconflict resolution loop) and `Skill()` (the `outdated` -> `conflict` handoff).\nEvery gap and its workaround is documented per harness in\n[`harness-skills/references/`](https://github.com/dEitY719/harness-skills/tree/main/references);\nread the one file for the harness you are on.\n\n| Skill | Claude Code | Codex | Kimi | Gemini / Antigravity | Hermes | OpenCode |\n|-------|:-----------:|:-----:|:----:|:--------------------:|:------:|:--------:|\n| `ci-fail` | full | full | full | full | full | full |\n| `conflict` | full | full, confirm in chat | full | full (Antigravity: confirm in chat) | full, confirm in chat | full, confirm in chat |\n| `outdated` | full | full, manual handoff | full, manual handoff | full, manual handoff | full, manual handoff | full, manual handoff |\n\n*confirm in chat* — `conflict` must stop and ask before resolving an ambiguous\nhunk. Kimi (`AskUserQuestion`) and Gemini CLI (`ask_user`) have a structured\nquestion tool; Codex, Hermes, Antigravity, and OpenCode do not, so ask in the\nconversation and wait for a real reply. An auto-approve session setting is not\nthe user's answer.\n\n*manual handoff* — `outdated` delegates a `CONFLICTING` PR to `conflict` by exit\ncode. Outside Claude Code there is no skill-invocation tool: print the exit code\nand the follow-up command and stop. Do not inline the other skill's per-file\nrebase loop.\n\n## Shared assets\n\nThis repo owns none — deliberately.\n\n- **Per-harness tool mappings** live in\n  [`harness-skills/references/`](https://github.com/dEitY719/harness-skills/tree/main/references)\n  (`{codex,kimi,gemini,antigravity,hermes,opencode}-tools.md`). That repo is\n  their sole owner; the other fourteen `*-skills` repos link there rather than\n  carrying copies, so one tool rename is one edit, not fifteen\n  (dEitY719/dotfiles#1410 F-5 / NF-2). The only condensed mirror here is\n  `.kimi-plugin/plugin.json`'s `skillInstructions`, because Kimi CLI cannot read\n  a reference file at load time — it points back to the canonical file.\n- **The reusable CI workflow** is\n  [`harness-skills/.github/workflows/skill-check.yml`](https://github.com/dEitY719/harness-skills/blob/main/.github/workflows/skill-check.yml)\n  (dEitY719/dotfiles#1410 D-10). See [CI](#ci).\n\n## Layout\n\nManifests live at the repo root and all point at one flat `skills/` directory:\n\n```\n.\n├── skills/{ci-fail,conflict,outdated}/\n│   ├── SKILL.md\n│   ├── references/\n│   └── evals/                                    (conflict, outdated)\n├── .claude-plugin/{marketplace,plugin}.json      Claude Code\n├── .codex-plugin/plugin.json                     Codex\n├── .kimi-plugin/plugin.json                      Kimi CLI\n├── .hermes-plugin/{plugin.yaml,__init__.py}      Hermes Agent\n├── .opencode/plugins/gh-resolve.js + INSTALL.md  OpenCode\n├── .agents/plugins/marketplace.json              Antigravity\n├── gemini-extension.json + GEMINI.md             Gemini CLI\n├── package.json\n├── CLAUDE.md · AGENTS.md -> CLAUDE.md\n└── LICENSE\n```\n\nOnly Claude Code understands a nested `plugins/<name>/skills/` layout. The other\nfive harnesses resolve manifests at the repo root and a skills tree at\n`./skills/`, so this repo keeps everything flat. See [`CLAUDE.md`](CLAUDE.md) for\nthe full rationale and contribution rules.\n\nSkill directory names dropped the `gh-pr-resolve-` prefix they carried in\ndotfiles: the plugin name already supplies the namespace, so\n`/gh:pr-resolve-conflict` is now `/gh-resolve:conflict` and the old prefix would\nonly stutter.\n\nThe `.kimi-plugin/` manifest is pre-provisioned: Kimi CLI is not installed on the\nmaintainer's machines yet, and shipping the manifest now costs nothing and saves\na migration later.\n\n## CI\n\n[`.github/workflows/validate.yml`](.github/workflows/validate.yml) calls the\nreusable workflow owned by `harness-skills`:\n\n```yaml\njobs:\n  validate:\n    uses: dEitY719/harness-skills/.github/workflows/skill-check.yml@main\n    with:\n      plugin-name: gh-resolve\n```\n\nIt validates manifests, skill frontmatter (the `name:` must be bare and match\nthe directory), progressive-disclosure line limits, the Codex description\nbudget, version agreement across all seven manifests, shell scripts, and the\nno-emoji rule. There is no local copy to keep in sync; a check added upstream\napplies here on the next run.\n\n## Provenance\n\nThese skills were extracted from\n[`dEitY719/dotfiles`](https://github.com/dEitY719/dotfiles)\n(`claude/skills/gh-pr-resolve-{ci-fail,conflict,outdated}`) as a content\nsnapshot at source commit `b5f7fd1347e56c9a70e9b67ba15e7c5b7f1cf9ac` — no history\nrewriting. The dotfiles copies were removed in Phase 4 of that repo's migration,\nso that path no longer resolves there. Behaviour is unchanged from the snapshot:\nonly the namespace moved, from `gh:pr-resolve-*` to `gh-resolve:*`, and the two\noversized `SKILL.md` files had detail relocated into their own `references/` to\nfit the 100-line progressive-disclosure limit.\n\nThis is Phase 2 of the dEitY719/dotfiles#1410 migration (tracking issue dEitY719/dotfiles#1660).\n`packaging-skills` was Phase 0; `harness-skills` — the sibling that owns the\nshared assets this repo links to — and `pkm-skills` were Phase 1.\n\n## License\n\nMIT. See [LICENSE](LICENSE).\n",
  "bytes": 9556,
  "sha": "f4505654a2aad88632c7576d6f88100e6d9aef4d0a6fe5dc5abcafd4d1473574",
  "repo_slug": "deity719/gh-resolve-skills",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/plg_deity719_gh_resolve_skills_364fa9c4/readme"
}