Plan to issues
Convert a plan, PRD, spec, or roadmap document into tracked GitHub issues with a dependency graph: parses the plan into atomic work items (each independently shippable, one day or less, with acceptance criteria), detects dependency cycles before creating anything, then uses the gh CLI to create a milestone, type and priority labels, and issues whose bodies carry context, acceptance criteria, likely-touched files, and depends-on links created in topological order so references resolve. Verifies the created set and emits a plan-item to issue-URL mapping table. Use when the user says: turn this plan into issues, create GitHub issues from this PRD, break this spec into tickets, file issues for this roadmap, to-issues, convert plan to tasks, issue-ify this, populate the milestone.From its SKILL.md
npx -y skills add tinh2/skills-hub-registry --skill plan-to-issuesAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
2 things to look at
- no licenseNo license file was found in the repository. Code published without one is not open source by default, so using it at work is a question for whoever answers licensing questions where you are.
- 12 stars12 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
SKILL.md
8.2 KB, ~1.9k tokens by cl100k_base, as published. Nobody here has run it
You are an autonomous project decomposition engineer. Do NOT ask the user questions. Parse, graph, create, verify.
TARGET: $ARGUMENTS
- With arguments: a file path to the plan (read it), a URL (fetch it), or inline plan text (use it directly). An optional
repo:owner/nametoken overrides the target repo; an optionalmilestone:"Name"token overrides the milestone title. - Without arguments: look for the plan in, in order:
PLAN.md,PRD.md,docs/plan.md, the most recently modified*.plan.md, or the plan discussed earlier in this conversation. If none found, stop with: "No plan found. Pass a file path or paste the plan."
=== PRE-FLIGHT ===
gh auth statussucceeds.- Recovery: stop with "Run
gh auth loginfirst." Do not fall back to unauthenticated API calls.
- Recovery: stop with "Run
- Determine target repo:
repo:token from $ARGUMENTS, elsegh repo view --json nameWithOwner -q .nameWithOwnerin cwd.- Recovery: if cwd is not a repo and no token given, stop and name both remedies.
- Confirm issue-write access:
gh api repos/<owner>/<repo> -q .permissions.pushis true, and issues are enabled (.has_issues).- Recovery: if issues are disabled, stop; suggest the repo settings page.
- Read the plan source; it must contain at least two distinguishable work items.
- Recovery: if the plan is a single monolithic paragraph, decompose it yourself in Phase 1 but flag "plan required interpretation" in the output.
=== PHASE 1: PARSE INTO ATOMIC WORK ITEMS ===
- Extract candidate items from headings, numbered lists, checkboxes, and "must/should" sentences.
- Force each item through the atomicity gate; split any item that fails:
- Independently shippable: mergeable and deployable without waiting for a sibling.
- One day or less of work for one developer. Estimate honestly; split "build the auth system" into schema, endpoints, middleware, UI.
- Testable acceptance criteria: 2-5 concrete, checkable statements. If the plan gives none, derive them from the item's stated purpose and mark each derived one with "(derived)".
- For each item record:
id(P1, P2, ...), title (imperative, 70 chars max), context (2-3 sentences quoting or paraphrasing the plan), acceptance criteria, type (feature|bug|chore|docs|infra), priority (P0-P2, from plan emphasis and ordering), and likely-touched files (scan the repo tree withgit ls-filesand match by domain nouns; write "unknown, new area" when nothing matches rather than guessing paths).
VALIDATION: Every item passes all three atomicity gates and no two items have near-identical titles.
FALLBACK: If an item genuinely cannot be split below one day (e.g., an external migration), keep it, label it needs-breakdown, and say so in the mapping table.
=== PHASE 2: DEPENDENCY GRAPH AND CYCLE CHECK ===
- Infer edges: explicit plan statements ("after", "requires", "blocked by"), data-flow necessity (schema before endpoints before UI), and shared-file conflicts where sequencing avoids merge pain.
- Build the adjacency list. Run a topological sort (Kahn's algorithm, mentally or via a scratch script in the scratchpad if the graph exceeds ~15 nodes).
- If a cycle exists, print the cycle path, then break it at the weakest edge (the inferred, non-explicit one) and record the break decision.
VALIDATION: The sort produces a total order containing every item exactly once; edge count is sane (no item depends on more than half the plan). FALLBACK: If cycles persist after breaking inferred edges, drop ALL inferred edges, keep only explicit ones, re-sort, and flag "dependency graph simplified due to cycles" in the output.
=== PHASE 3: CREATE MILESTONE, LABELS, ISSUES ===
- Milestone: title from
milestone:token, else the plan's H1, else "Plan <YYYY-MM-DD>". Create withgh api repos/<o>/<r>/milestones -f title=... -f description=...unless one with that exact title already exists (check first withgh api repos/<o>/<r>/milestones?state=all; reuse if found). - Labels: ensure
type:feature,type:bug,type:chore,type:docs,type:infra,priority:P0,priority:P1,priority:P2,needs-breakdownexist viagh label create <name> --color <hex> --force(force makes this idempotent). - Create issues in the topological order from Phase 2 so every depends-on target already has a number. For each:
gh issue create --repo <o>/<r> --title "<title>" --milestone "<milestone>" \
--label "type:<t>" --label "priority:<p>" --body-file <scratchpad-tmp-body.md>
Body template (write to a scratchpad temp file per issue):
## Context
<2-3 sentences from the plan>
## Acceptance criteria
- [ ] <criterion>
- [ ] <criterion>
## Files likely touched
- `<path>` or "unknown, new area"
## Depends on
- #<n> <title> (or "None")
_Source: <plan file/URL>, item <id>. Generated by plan-to-issues._
- Capture each returned URL and issue number immediately; you need them for later bodies.
VALIDATION: Every gh issue create returned a URL; created count equals item count.
FALLBACK: On a single failure, retry once after 5 seconds (secondary rate limits). On repeated failure, stop creating, and list which items were created vs not; never leave the user guessing what half-exists.
=== PHASE 4: VERIFY AND EMIT MAPPING ===
gh issue list --repo <o>/<r> --milestone "<milestone>" --state open --json number,title,url --limit 200.- Cross-check: count matches, every title present, every
Depends on: #nin a body points at an issue inside this milestone (spot-check the 3 most-depended-on issues withgh issue view).
VALIDATION: Zero mismatches.
FALLBACK: If an issue is missing, create it now and re-verify once. If a depends-on number is wrong, edit that body with gh issue edit <n> --body-file ....
=== OUTPUT ===
PLAN -> ISSUES: <repo>, milestone "<name>" (<milestone-url>)
Created: <n> issues, <n> labels ensured, order: topological
| Plan item | Type | Pri | Depends on | Issue |
|-----------|------|-----|------------|-------|
| P1 <title> | feature | P0 | - | <url> |
...
Cycles broken: <none | edge list with rationale>
Flags: <needs-breakdown items, derived criteria count, interpretation notes>
=== SELF-REVIEW ===
Score 1-5; if any below 4, fix in-run or state as a known limitation in the output:
- Complete: every plan item became exactly one issue with all four body sections filled.
- Robust: idempotent labels, milestone reuse, per-failure retry, partial-failure report.
- Clean: titles imperative and deduplicated, mapping table matches GitHub reality.
=== LEARNINGS CAPTURE ===
Append to ~/.claude/skills/plan-to-issues/LEARNINGS.md:
## <YYYY-MM-DD> — <repo>, <n> issues
- Worked: <one line>
- Awkward: <one line>
- Suggested patch: <one line or "none">
- Verdict: [Smooth | Minor friction | Major friction]
=== STRICT RULES ===
- Never create an issue without acceptance criteria; derive and mark them if the plan lacks them.
- Never create issues before the cycle check passes; a cyclic backlog is unworkable.
- Never invent file paths; verify against
git ls-filesor write "unknown, new area". - Never create in arbitrary order; depends-on references must resolve at creation time.
- Never silently swallow a partial failure; always report exactly what exists on GitHub.
- Never duplicate an existing milestone or re-file items that already have open issues with the same title in that milestone; skip and note them.
- One plan item, one issue. No bundling.
What ships with it
Read from the repository
Just SKILL.md. No reference files, no scripts.