From base-config
Manages full GitHub issue lifecycle: create with conventional commit titles, sub-issues, cross-repo links, edit/view/list, dump trees to markdown/YAML, push from files, comment/label/close.
npx claudepluginhub enitrat/skill-issue --plugin base-configThis skill uses the workspace's default tool permissions.
This skill provides a structured approach to writing GitHub issues that communicate context, scope, and direction clearly.
Creates isolated Git worktrees for feature branches with prioritized directory selection, gitignore safety checks, auto project setup for Node/Python/Rust/Go, and baseline verification.
Executes implementation plans in current session by dispatching fresh subagents per independent task, with two-stage reviews: spec compliance then code quality.
Dispatches parallel agents to independently tackle 2+ tasks like separate test failures or subsystems without shared state or dependencies.
This skill provides a structured approach to writing GitHub issues that communicate context, scope, and direction clearly.
Issue titles must follow conventional commit format:
<type>(<scope>): <description>
Valid types: feat, fix, docs, style, refactor, perf, test, build, ci, chore, revert
Examples:
feat(auth): add OAuth2 login supportfix(api): resolve race condition in request handlerchore(deps): update dependencies to latest versionsdocs(readme): add installation instructionsThe script validates this format automatically. Use --skip-validation only if the repository uses a different convention.
Every issue should answer three questions for the reader:
This framework ensures issues are actionable and provide enough context for anyone picking them up.
Explain the background and motivation:
## Why
Currently, [describe current state/behavior].
This causes [specific problem or bottleneck], which [impact on users/system/workflow].
Addressing this will [concrete benefit - improved metrics, unlocked capabilities, better UX].
Define the scope concretely:
## What
[Verb] [specific thing] to [achieve outcome].
Scope:
- [In scope item 1]
- [In scope item 2]
Out of scope:
- [Explicitly excluded item]
Provide implementation direction:
## How
Approach: [brief strategy - e.g., "Extend existing X pattern", "Add new Y component"]
Key areas:
1. [Component/file] - [what changes here]
2. [Component/file] - [what changes here]
Skeleton:
- [High-level step 1]
- [High-level step 2]
- [Integration point]
Keep acceptance criteria focused on integration and observable behavior:
## Acceptance Criteria
- [ ] [Observable behavior or state that confirms completion]
- [ ] [Integration with existing system works as expected]
- [ ] [Edge case or error condition handled]
Tips:
Keep testing plans succinct and focused on verification:
## Testing Plan
- [ ] [How to manually verify the change]
- [ ] [Key integration scenario to test]
- [ ] [Regression check if applicable]
Tips:
This skill includes Python scripts in scripts/ that wrap GitHub API operations. Run them with uv:
| Command | Description |
|---|---|
create | Create a new issue |
create-sub | Create a sub-issue linked to a parent |
edit | Edit an existing issue's title or body |
view | View issue details |
list | List issues in a repository |
list-subissues | List all sub-issues of a parent (GraphQL API) |
dump-tree | Dump issue and sub-issues to markdown with frontmatter |
push | Push/sync issue from markdown file to GitHub |
link | Link two issues (parent/child relationship) |
close | Close an issue |
comment | Add a comment to an issue |
labels | Manage issue labels |
init | Initialize an issue body file with template |
# Initialize a template file
uv run scripts/gh_issue.py init --template default
uv run scripts/gh_issue.py init --template bug
uv run scripts/gh_issue.py init --template feature
# Create an issue from a body file
uv run scripts/gh_issue.py create owner/repo \
--title "Brief, descriptive title" \
--body-file /tmp/issue-body.md
# Create with labels and assignees
uv run scripts/gh_issue.py create owner/repo \
--title "Add caching layer" \
--body-file /tmp/issue-body.md \
--labels "enhancement,performance" \
--assignees "@me"
# Create a sub-issue linked to parent
uv run scripts/gh_issue.py create-sub owner/repo \
--parent 10 \
--title "Implement caching middleware" \
--body-file /tmp/sub-issue.md
# Edit an issue's body
uv run scripts/gh_issue.py edit owner/repo 123 \
--body-file /tmp/updated-body.md
# Edit an issue's title
uv run scripts/gh_issue.py edit owner/repo 123 \
--title "feat(api): updated title"
# View an issue
uv run scripts/gh_issue.py view owner/repo 123
# List open issues
uv run scripts/gh_issue.py list owner/repo
# List issues by label
uv run scripts/gh_issue.py list owner/repo --labels "bug"
# List all sub-issues of a parent (handles cross-repo references)
uv run scripts/gh_issue.py list-subissues owner/repo 123
uv run scripts/gh_issue.py list-subissues owner/repo 123 --json
# Dump issue and all sub-issues to markdown files
uv run scripts/gh_issue.py dump-tree owner/repo 123 thoughts/shared/issues/
# Link existing issues
uv run scripts/gh_issue.py link owner/repo --parent 10 --child 42
# Add a comment
uv run scripts/gh_issue.py comment owner/repo 123 "Progress update: ..."
# Close an issue
uv run scripts/gh_issue.py close owner/repo 123 --reason completed
By default, the script shows a preview and asks for confirmation before creating:
============================================================
ISSUE PREVIEW
============================================================
Repository: owner/repo
Title: feat(api): add caching to API responses
Labels: enhancement, performance
Body:
----------------------------------------
## Why
...
----------------------------------------
Create this issue?
y = create issue
n = cancel
e = edit (saves to /tmp/issue-body.md for editing)
y to create the issuen to cancele to save body to /tmp/issue-body.md for editing, then re-runUse --yes or -y to skip confirmation (for automation).
# Initialize template
uv run scripts/gh_issue.py init --output /tmp/issue-body.md
# Edit the template with your content
# ... edit /tmp/issue-body.md ...
# Create the issue (will show preview first)
uv run scripts/gh_issue.py create owner/repo \
--title "feat(api): add caching layer" \
--body-file /tmp/issue-body.md
uv run scripts/gh_issue.py create owner/repo \
--title "feat(api): add caching layer to API responses" \
--body-file /tmp/issue-body.md \
--labels "enhancement,performance" \
--assignees "@me" \
--milestone "v2.0"
uv run scripts/gh_issue.py create owner/repo \
--title "Issue title" \
--body-file /tmp/issue-body.md \
--project "Project Name"
# Create a new issue linked to parent #10
uv run scripts/gh_issue.py create-sub owner/repo \
--parent 10 \
--title "feat(cache): implement caching middleware" \
--body "## Why
Part of the caching initiative (#10).
## What
Implement the middleware layer for request caching."
# Link issue #42 as a sub-issue of #10
uv run scripts/gh_issue.py link owner/repo --parent 10 --child 42
Reference the issue number in a commit message to auto-close:
git commit -m "Add caching middleware
Fixes #42"
Keywords that close issues: fixes, closes, resolves (followed by #issue_number)
When an issue references sub-issues from other repositories, use list-subissues to find them all:
uv run scripts/gh_issue.py list-subissues owner/repo 123
This command:
owner/other-repo#456)Output formats:
--json): Machine-readable format for scriptingTo save an issue and all its sub-issues as markdown files with YAML frontmatter:
uv run scripts/gh_issue.py dump-tree owner/repo 123 thoughts/shared/issues/
This command:
{issue_number}-{safe-title}.md{issue_number}-{safe-title}/Output format (frontmatter):
---
title: "feat(auth): add OAuth2 support"
repo: owner/repo
number: 123
state: open
labels:
- enhancement
assignees:
- username
milestone: "Q1 2026"
parent: owner/repo#100
created_at: 2026-01-14T12:00:00Z
author: username
url: https://github.com/owner/repo/issues/123
---
## Why
... actual body content (clean, no metadata) ...
Benefits:
Push a markdown file with frontmatter back to GitHub:
# Create new issue (no number in frontmatter)
uv run scripts/gh_issue.py push new-feature.md
# Update existing issue (has number in frontmatter)
uv run scripts/gh_issue.py push 123-existing-issue.md
# Skip confirmation
uv run scripts/gh_issue.py push issue.md --yes
The push command:
number is omittednumber is presentparent is specifiedRequired frontmatter fields:
title: Issue title (must follow conventional commit format)repo: Repository in owner/repo formatOptional frontmatter fields:
number: Issue number (omit for new issues)labels: List of labels to applyassignees: List of GitHub usernamesmilestone: Milestone name or numberproject: Project name to add issue toparent: Parent issue reference (e.g., "owner/repo#123")The frontmatter format enables a powerful workflow:
# 1. Export issue tree to local files
uv run scripts/gh_issue.py dump-tree owner/repo 123 ./issues/
# 2. Edit locally (modify body, add labels, change assignees, etc.)
$EDITOR ./issues/123-feature/456-sub-task.md
# 3. Push changes back to GitHub
uv run scripts/gh_issue.py push ./issues/123-feature/456-sub-task.md
Use cases:
| Task | Command |
|---|---|
| Init template | uv run scripts/gh_issue.py init |
| Init bug template | uv run scripts/gh_issue.py init --template bug |
| Create issue | uv run scripts/gh_issue.py create owner/repo --title "feat(scope): description" --body-file /tmp/issue.md |
| Create (skip preview) | uv run scripts/gh_issue.py create owner/repo --title "..." --body-file ... --yes |
| Create sub-issue | uv run scripts/gh_issue.py create-sub owner/repo --parent 10 --title "feat(scope): ..." |
| Edit issue body | uv run scripts/gh_issue.py edit owner/repo 123 --body-file /tmp/updated.md |
| Edit issue title | uv run scripts/gh_issue.py edit owner/repo 123 --title "feat(scope): new title" |
| View issue | uv run scripts/gh_issue.py view owner/repo 123 |
| List issues | uv run scripts/gh_issue.py list owner/repo |
| List sub-issues | uv run scripts/gh_issue.py list-subissues owner/repo 123 |
| Dump issue tree | uv run scripts/gh_issue.py dump-tree owner/repo 123 ./issues/ |
| Push from file | uv run scripts/gh_issue.py push ./issues/123-feature.md |
| Link issues | uv run scripts/gh_issue.py link owner/repo --parent 10 --child 42 |
| Add comment | uv run scripts/gh_issue.py comment owner/repo 123 "message" |
| Add labels | uv run scripts/gh_issue.py labels owner/repo 123 --add "bug,urgent" |
| Close issue | uv run scripts/gh_issue.py close owner/repo 123 |