gh-issue-sync — Claude Code skill: what it does, how to install
Syncs GitHub Issues into local Markdown files for triage, search, editing, and issue creation from an editor or terminal.
npx skills add mitsuhiko/gh-issue-sync --skill gh-issue-sync -a claude-code
npx skills add mitsuhiko/gh-issue-sync --skill skill -a claude-codeWhat gh-issue-sync does
The skill syncs open GitHub Issues into .issues/open/ and closed ones into .issues/closed/. Each Markdown file can hold the title, labels, assignees, milestone, state, and issue body, while its filename supplies the issue number.
Use gh-issue-sync to initialise a directory in a Git repository, fetch issues, list them, create new items, or close and reopen them. push sends local edits, and diff shows changes against an issue. Run push --dry-run to inspect a planned update first.
New issues receive a temporary ID beginning with T; pushing replaces it with the GitHub number and updates references in other issues. pull skips conflicts, while --force can overwrite local files, so review local changes before using that flag.
What it helps with
- sync GitHub Issues into Markdown files
- search an issue from the terminal
- edit labels and issue text locally
- create a new issue with a CLI command
- post an issue comment during a push
Example prompts for the agent
- Run `gh-issue-sync pull` to fetch open issues.
- Create an issue with `gh-issue-sync new "Fix login"` and add a label.
- Check local edits with `gh-issue-sync status` before running `push`.
How to install gh-issue-sync
1Skills CLI (Vercel)
npx skills add mitsuhiko/gh-issue-sync --skill gh-issue-sync -a claude-codenpx skills add mitsuhiko/gh-issue-sync --skill skill -a claude-code2Manually: put the files in place
~/.claude/skills/skill/SKILL.mdCopy the whole skill folder; for one project use .claude/skills/skill/
1Skills CLI (Vercel)
npx skills add mitsuhiko/gh-issue-sync --skill skill -a codex2Manually: put the files in place
.agents/skills/skill/SKILL.mdFor all projects use ~/.agents/skills/
1Skills CLI (Vercel)
npx skills add mitsuhiko/gh-issue-sync --skill skill -a cursor2Manually: put the files in place
.cursor/skills/skill/SKILL.mdCursor also reads .agents/skills/ and .claude/skills/
1GitHub CLI
gh skill install mitsuhiko/gh-issue-sync skill2Manually: put the files in place
.github/skills/skill/SKILL.md1Skills CLI (Vercel)
npx skills add mitsuhiko/gh-issue-sync --skill skill -a gemini-cli2Platform CLI
gemini skills install https://github.com/mitsuhiko/gh-issue-sync --path skillManually: put the files in place
.devin/skills/skill/SKILL.mdThe legacy .windsurf/skills/ path still works
Skills CLI (Vercel)
npx skills add mitsuhiko/gh-issue-sync --skill skill -a opencodeClaude.ai
Zip the folder and upload it in Settings → Capabilities → Skills
Similar
Questions about gh-issue-sync
How do I install gh-issue-sync in Claude Code?
Run npx skills add mitsuhiko/gh-issue-sync --skill gh-issue-sync -a claude-code.
What does gh-issue-sync do?
It syncs GitHub Issues with Markdown files in .issues/open/ and .issues/closed/. You can search, create, edit, close, and reopen issues locally.
How do I post a comment with gh-issue-sync?
Create a .comment.md file next to an issue file, such as .issues/open/42.comment.md. Its Markdown content is posted during push, then the file is deleted.
Source text
SKILL.md · Apache-2.0
--- name: gh-issue-sync description: "Manage GitHub issues locally as Markdown files. Use for triaging, searching, editing, and creating issues without leaving your editor or terminal." --- # gh-issue-sync Syncs GitHub issues to local Markdown files in `.issues/open/` and `.issues/closed/`. ## Commands ``` gh-issue-sync init # Initialize in git repo gh-issue-sync pull # Fetch open issues (--all for closed too) gh-issue-sync push # Push local changes (--dry-run to preview) gh-issue-sync list # List issues (supports gh issue list flags + --search) gh-issue-sync new "Title" # Create issue (--label, --edit) gh-issue-sync close 42 # Close (--reason completed|not_planned) gh-issue-sync reopen 42 gh-issue-sync status # Show local changes gh-issue-sync diff 42 # Show diff (--remote to re-fetch) ``` ## File Format `.issues/open/42-fix-login-bug.md`: ```markdown --- title: Fix login bug labels: [bug, priority:high] assignees: [alice] milestone: v1.0 state: open # For closed: state_reason: completed|not_planned # Optional: parent: 10, blocked_by: [11, 12], blocks: [15] --- Issue body in Markdown. ``` Issue number is derived from the filename, not stored in frontmatter. ## Temporary Issues New issues get a `T`-prefixed ID (e.g., `T1a2b3c`). The filename must start with `T`: ``` .issues/open/T1a2b3c-my-new-issue.md ``` On `push`, the file is renamed to the real issue number (e.g., `42-my-new-issue.md`) and `number:` in frontmatter is updated. Any `#T1a2b3c` references in other issues are also updated to `#42`. ## Comments To post a comment when pushing, create a `.comment.md` file next to the issue: ``` .issues/open/42.comment.md .issues/open/42-fix-login-bug.comment.md ``` Content is plain Markdown. The file is deleted after the comment is posted. ## Notes - Pull skips conflicts; use `--force` to overwrite local
© mitsuhiko · Apache-2.0 · mitsuhiko/gh-issue-sync