skills/github-issue-creator/SKILL.md
Create or update GitHub issues from screenshots, emails, messages, or any visual/text input. Extracts structured data, redacts PII, detects issue templates, proposes issues for approval, then files them via gh CLI. Don't use for GitLab/Jira tickets, opening pull requests, or fixing the bug described in the issue.
npx skillsauth add luongnv89/skills github-issue-creatorInstall 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 and update GitHub issues from screenshots, emails, messages, and other unstructured input sources.
This skill creates issues on a remote GitHub repo, so always verify connectivity first:
gh auth status
gh repo view --json name,owner,url
If gh is not authenticated or the current directory is not a GitHub repo, stop and tell the user what's missing before continuing.
Follow these three phases strictly. Do not skip the approval step — the user must confirm before any issue is created or updated.
Read the user's input carefully. Input can be:
For each distinct issue you identify, extract:
bug, enhancement, critical, ui, backend)It's fine if not all fields are available — extract what you can. Don't fabricate details that aren't in the input.
GitHub issues are typically public (or at least visible to the whole team). Bug reports from emails, screenshots, and support tickets often contain personal or confidential data that should never end up in a GitHub issue. Before composing any issue content, scan everything you extracted and redact the following:
Personal Identifiable Information (PII):
j***@example.com or just remove)[user_id] or [redacted]Credentials and secrets:
[REDACTED_API_KEY], [REDACTED_TOKEN], etc. Flag these to the user as a heads-up ("I noticed an API key in the screenshot — I've removed it from the issue.")Infrastructure details (redact unless clearly needed for the bug):
[internal_ip][internal_host]Other sensitive content:
How to handle it in practice:
Check the repo for issue templates:
# Check for issue templates in common locations
ls .github/ISSUE_TEMPLATE/ 2>/dev/null
cat .github/ISSUE_TEMPLATE/*.md 2>/dev/null
cat .github/ISSUE_TEMPLATE/*.yml 2>/dev/null
# Also check for a simple issue template
cat .github/ISSUE_TEMPLATE.md 2>/dev/null
If templates exist, read them and use their structure for the proposed issues. Match each issue to the most appropriate template (e.g., bug report template for bugs, feature request template for enhancements).
If no templates exist, use this default structure:
## Description
[Clear description of the issue]
## Steps to Reproduce
1. [Step 1]
2. [Step 2]
3. [Step 3]
## Expected Behavior
[What should happen]
## Actual Behavior
[What actually happens]
## Environment
- OS: [if known]
- Browser/Version: [if known]
- App Version: [if known]
## Additional Context
[Screenshots, logs, related issues]
Before proposing new issues, search for potentially related open issues:
gh issue list --state open --limit 30
If any existing issues look related to the extracted information, propose updating them instead of creating duplicates. Use keyword matching on titles and bodies — err on the side of flagging potential duplicates for the user to decide.
Show the user a clear, numbered list of proposed actions. For each:
### Issue [N]: [Create new | Update #existing-number]
**Title**: [issue title]
**Labels**: `bug`, `ui` (etc.)
**Template**: [template name if using repo template, or "default"]
**Body preview**:
> [Show the full issue body as it will appear on GitHub]
---
If proposing updates to existing issues, show what will be added (as a comment or body edit) and link to the existing issue.
End with a clear prompt:
Does this look right? You can:
- Say "go" or "approve" to create/update all issues as shown
- Say "skip 2" to exclude a specific issue
- Ask me to modify any issue before creating it
- Say "cancel" to abort
Do not proceed until the user explicitly approves. This is critical — creating issues is a visible action that others will see.
Once approved, execute the actions using gh:
Creating a new issue:
gh issue create --title "TITLE" --body "$(cat <<'ISSUE_BODY'
... issue body ...
ISSUE_BODY
)" --label "bug,ui"
Updating an existing issue (add a comment):
gh issue comment ISSUE_NUMBER --body "$(cat <<'COMMENT_BODY'
... update content ...
COMMENT_BODY
)"
Adding labels to an existing issue:
gh issue edit ISSUE_NUMBER --add-label "label1,label2"
After each action, confirm success and report the issue URL back to the user. At the end, provide a summary:
Done! Created/updated the following issues:
- #42: Login button unresponsive on mobile Safari
- #38: (updated) Add dark mode support — added reproduction details
After the user approves the proposal, the skill creates the issue and reports:
Done! Created/updated the following issues:
- #47: Login button unresponsive on mobile Safari
https://github.com/acme/webapp/issues/47
Labels: bug, ui, mobile
The created issue body looks like:
## Description
The login button does not respond to taps on mobile Safari (iOS 17). Tapping the
button produces no visual feedback and the login flow never initiates.
## Steps to Reproduce
1. Open https://app.example.com on iPhone with Safari (iOS 17)
2. Enter valid credentials
3. Tap the "Log In" button
## Expected Behavior
The login flow initiates and the user is redirected to the dashboard.
## Actual Behavior
Nothing happens. No spinner, no error message, no navigation.
## Environment
- OS: iOS 17.4
- Browser: Safari (mobile)
- App Version: 2.3.1
## Additional Context
Reported via screenshot on 2026-04-19. Note: reporter email and user ID were
redacted before filing.
gh auth status at the start; stop and tell the user what's missing before extracting any data..yml templates with structured fields and map extracted data to the template's field IDs and types; respect required fields.gh auth status and gh repo view succeed before any extraction beginsgh label list) or are clearly flagged as newAfter completing each major step, output a status report in this format:
◆ [Step Name] ([step N of M] — [context])
··································································
[Check 1]: √ pass
[Check 2]: √ pass (note if relevant)
[Check 3]: × fail — [reason]
[Check 4]: √ pass
[Criteria]: √ N/M met
____________________________
Result: PASS | FAIL | PARTIAL
Adapt the check names to match what the step actually validates. Use √ for pass, × for fail, and — to add brief context. The "Criteria" line summarizes how many acceptance criteria were met. The "Result" line gives the overall verdict.
Phase 1 — Extract
◆ Extract (step 1 of 3 — [input type: screenshot/email/text])
··································································
Input parsed: √ pass | × fail — [parse error]
Data extracted: √ pass ([N] issues identified)
PII redacted: √ pass | × fail — [what was found/removed]
____________________________
Result: PASS | FAIL | PARTIAL
Phase 2 — Template Detection & Proposal
◆ Template Detection (step 2 of 3 — [repo name])
··································································
Templates found: √ pass ([N] templates) | × fail — using default
Fields mapped: √ pass | × fail — [unmapped fields]
____________________________
Result: PASS | FAIL | PARTIAL
Phase 3 — Create / Update
◆ Create/Update (step 3 of 3 — [N issues])
··································································
Issue created: √ pass (#[number]: [title])
Labels applied: √ pass | × fail — [labels missing]
Assignees set: √ pass | × fail — [assignees not set]
____________________________
Result: PASS | FAIL | PARTIAL
gh label list --limit 50.yml templates with structured fields (type: input, type: textarea, etc.). When you encounter these, map your extracted data to the template's field IDs and format the issue body accordingly, respecting required fields and field types.documentation
Manage software releases end-to-end: bump version, generate changelog, tag, push, GitHub release, publish to PyPI/npm. Use when user asks to ship, cut a release, tag a version, or list changes since last tag. Skip routine commits and marketplace publishing.
development
Review UI for usability issues using Steve Krug's principles and produce a scannable report. Use when asked for a usability audit, UX review, or UI feedback on screenshots, URLs, or code. Don't use for visual/brand design critique, accessibility (WCAG) audits, or backend/API review.
development
Validate app/startup ideas with market, feasibility, commercial, and open-source competitor analysis. Use when asked to evaluate, validate, or score a product idea. Don't use for PRDs, go-to-market plans, or investor decks.
testing
Install local-first security hardening: pre-commit secret detection, offline dependency scans, static analysis, reports, and gated free CI. Use when hardening repos or adding security hooks. Don't use for incident response or cloud security reviews.