git-plugin/skills/github-issue-writing/SKILL.md
Create well-structured GitHub issues with clear titles, descriptions, and acceptance criteria. Use when filing bugs, requesting features, or structuring issue content.
npx skillsauth add laurigates/claude-plugins github-issue-writingInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Create well-structured, actionable GitHub issues.
| Use this skill when... | Use the alternative when... |
|---|---|
| Filing a new bug, feature, or chore issue with clear title and acceptance criteria | Use git-issue to start working on existing issues end-to-end |
| Structuring an issue body with reproduction steps, scope, and definition of done | Use github-issue-autodetect to link existing issues from staged diffs |
| Choosing the [Type] Component: Description title format | Use github-pr-title to author the conventional title for the PR that fixes it |
| Designing a feature-request issue before implementation begins | Use git-issue-manage for transfer/pin/lock/develop-branch admin operations |
[Type] Component: Brief description
| Type | Example |
|------|---------|
| Bug | [Bug] Auth: Login fails with valid credentials |
| Feature | [Feature] API: Add rate limiting support |
| Docs | [Docs] README: Add installation instructions |
| Chore | [Chore] CI: Update Node.js version |
Guidelines:
## Summary
Brief description of the bug.
## Steps to Reproduce
1. Go to '...'
2. Click on '...'
3. See error
## Expected Behavior
What should happen.
## Actual Behavior
What actually happens.
## Environment
- OS: macOS 14.0
- Browser: Chrome 120
- Version: 2.1.0
## Summary
What this feature does.
## Motivation
Why this is needed. What problem does it solve?
## Proposed Solution
Description of desired behavior.
## Acceptance Criteria
- [ ] Criterion 1
- [ ] Criterion 2
- [ ] Criterion 3
GitHub supports first-class issue types. Use --type when creating issues:
| Type | Use For | |------|---------| | Bug | Something broken that needs fixing | | Feature | New functionality request | | Task | General work item |
Note: Available types depend on repository/org configuration. Use gh issue create --type "Bug" to leverage them.
--body-fileFor any non-trivial body — anything containing backticks, code fences, or multi-line content — use --body-file <path>, never --body "<text>". This applies to all gh commands that accept a body: gh issue create, gh issue edit, gh issue comment, gh pr create, gh pr edit, gh pr comment.
| Body shape | Pattern |
|---|---|
| Trivially short, single line, no backticks | --body "Short text" is fine |
| Contains backticks (inline code, code fences) | --body-file /tmp/body.md — required |
| Multi-line | --body-file /tmp/body.md — required |
| Contains shell metacharacters ($, ", ', \) | --body-file /tmp/body.md — required |
Shell-quoted --body strings escape backticks (` becomes \`), breaking inline code spans and triple-backtick code fences in the rendered issue. Bash heredocs interact unpredictably with the agent's argument escaping. Writing the markdown to a file with the Write tool sidesteps shell quoting entirely — the file content is preserved byte-for-byte.
1. Write tool → /tmp/issue-body.md (markdown body, no shell escaping)
2. gh issue create --title "..." --body-file /tmp/issue-body.md
The same --body-file <path> form is supported by every gh command that accepts a body.
# Create issue with a body file (preferred for any non-trivial body)
gh issue create --title "[Bug] Auth: Login fails" --body-file /tmp/issue-body.md
# Trivially short body — inline --body is acceptable
gh issue create --title "[Chore] Bump dep" --body "See renovate PR"
# With labels
gh issue create --title "..." --body-file /tmp/body.md --label "bug" --label "priority: high"
# With assignee
gh issue create --title "..." --body-file /tmp/body.md --assignee "@me"
# With issue type
gh issue create --title "..." --body-file /tmp/body.md --type "Bug"
# As sub-issue of a parent
gh issue create --title "..." --body-file /tmp/body.md
gh api repos/{owner}/{repo}/issues/{parent}/sub_issues -f sub_issue_id={new_id}
# Search before creating
gh issue list --search "login error" --state all
Pick the mechanism that matches the relationship — GitHub surfaces each one differently and only the native APIs trigger "Blocked" badges on project boards.
| Relationship | How to record | Why |
|--------------|---------------|-----|
| Hard dependency (must happen before) | Native dependencies/blocked_by API — see /git:issue-hierarchy --blocked-by N | Sidebar "Relationships" entry + Blocked badge on boards |
| Composition (part-of scope) | Sub-issue API — see /git:issue-hierarchy --add N | Progress bar on parent, tracked separately from dependencies |
| Soft reference ("related to") | Plain markdown Related to #789 in the body | Cross-link only; no lifecycle coupling |
| Auto-close on merge | Fixes #N / Closes #N footer in commit or PR body | Closes issue when the PR merges |
Do not write Blocks #123 or Blocked by #456 in issue bodies any more —
those strings used to be GitHub's workaround for missing dependency APIs, but
they are no longer parsed. Call /git:issue-hierarchy (or the REST endpoints
at issues/{N}/dependencies/blocked_by) so the relationship shows up in the
sidebar and on project boards.
| Action | Command |
|--------|---------|
| Create | gh issue create --title "..." --body-file /tmp/body.md |
| Create with type | gh issue create --title "..." --body-file /tmp/body.md --type "Bug" |
| Search | gh issue list --search "keyword" |
| View | gh issue view N |
| Edit body | gh issue edit N --body-file /tmp/body.md |
| Comment | gh issue comment N --body-file /tmp/comment.md |
| Labels | gh label list |
| Context | Command |
|---------|---------|
| Create issue | gh issue create --title "..." --body-file /tmp/body.md |
| Create with type | gh issue create --title "..." --type "Bug" --body-file /tmp/body.md |
| List labels | gh label list --json name |
| Search issues | gh issue list --search "keyword" --state all --json number,title |
| View issue | gh issue view N --json title,body,labels |
tools
Scaffold a new ComfyUI custom-node repo (pyproject, CI, release-please, vitest+pytest, JS extension skeleton) in the picker/gesture vein. Use when bootstrapping or init-ing a comfyui node pack.
tools
Orchestrate a ComfyUI node pack from idea to registry: scaffold, create + seed the repo, open the gitops adoption PR. Use when releasing or spinning up a new comfyui node pack.
testing
macOS EndpointSecurity/EDR high CPU & battery drain. Use when Kandji ESF / XProtect pegs a core; trace the exec storm via powermetrics + eslogger.
development
odiff pixel-by-pixel image diffing. Use when comparing screenshots, detecting visual regressions, diffing before/after PNGs, asserting golden images.