About design-to-issues
A skill for synchronizing user stories from a design document with GitHub Issues. It validates story contracts, creates or updates managed issues, and checks that their content and status match the design.
Key features
- 01Validate design and story contracts
- 02Match stories to canonical issues
- 03Create and update GitHub Issues
- 04Reopen issues when contracts change
- 05Verify issue content and status
Use cases
- 01Turn revised design stories into issues
- 02Update issues after story requirements change
- 03Check issue dependencies and milestones
- 04Identify removed stories needing a decision
Install
Copy the command and run it in a terminal.
npx skills add https:/ / github.com/ eho/ agent-skills --skill design-to-issuesAfter installing, type/design-to-issuesin Claude Code to confirm it loaded.
Bundled files
References and scripts installed along with SKILL.md.
scripts/create_issue.shcreate_milestone.shrender_issue_body.pystory_contract.pytests/create_milestone_test.shrender_issue_body_test.pystory_contract_test.pyDetails
From the project READMEDesign to Issues
Synchronize the current user stories into GitHub. The design document defines desired scope; GitHub Issues track delivery progress.
Prerequisites
- Read repository instructions and the complete design document.
- Require an exact design path.
- Normal synchronization requires
Status: Revised, meaning the latest independent review had zero blockers and mechanical validation passed. The user may explicitly override a semantic review risk, but delivery-mode mechanical validation still must pass. - Use the authenticated GitHub CLI and repository policy.
Canonical identity
Identify a managed issue by repository-relative design path plus story ID:
<!-- feature-delivery:design=<REPO-RELATIVE-DESIGN-PATH> -->
<!-- feature-delivery:story=<STORY-ID> -->
Resolve and run scripts/story_contract.py in delivery mode to validate status,
story structure, stable IDs, and dependencies. Use its normalized story source
as the managed issue contract. The script's hashes may help compare content,
but GitHub progress does not require a separate tracking system.
Each story is canonical and must contain every shared architecture, data, security, migration, compatibility, or rollout requirement that affects its implementation. When such a requirement changes, update every affected story; the changed story body is what causes completed work to reopen.
Search open and closed issues for the exact marker pair. Use an exact story-ID title only to discover a legacy candidate, and adopt it only when its design path, content, and history make the match unambiguous. Stop on duplicate candidates.
Synchronization
-
Run:
python3 /absolute/path/to/scripts/story_contract.py \ <design-doc> --repo-root <repository-root> --mode delivery \ --include-source \ > <temporary-manifest.json> -
Determine the repository, default branch, milestone, labels, and stable design URL.
-
Build the complete current issue map before mutating anything.
-
Create or reuse the milestone. Do not reopen a closed milestone without user or repository-policy authority.
-
Create every missing story issue. Use the bundled renderer so issue bodies contain the exact normalized story source and canonical dependency links.
-
Update existing issues in place when the managed story body, title, dependencies, labels, or milestone differ.
-
Reopen a completed issue when its story contract changed. Leave an unchanged completed issue closed.
-
Re-read every canonical issue and verify its markers, managed body, dependencies, labels, milestone, and state.
Do not silently close stories removed from the design. Report their existing issues and ask whether they should be removed, deferred, or restored. Persist the user's decision on the issue so later runs do not ask again.
Managed issue body
<!-- feature-delivery:design=<REPO-RELATIVE-DESIGN-PATH> -->
<!-- feature-delivery:story=<STORY-ID> -->
## Managed Story Contract
<exact normalized story source>
## Canonical Dependencies
<canonical numbered issue references or None>
## Design Doc
[View in Design Doc](<repository blob URL>)
The manifest hashes may help synchronization compare content, but consumers should rely on the canonical issue body and current GitHub state rather than reproducing hash-transition rules.
Result
- Design:
- Milestone:
- Issues created:
- Issues updated:
- Changed completed issues reopened:
- Unchanged completed issues:
- Removed-story issues requiring a decision:
- Blocker:
Scripts
scripts/create_issue.shscripts/create_milestone.shscripts/story_contract.pyscripts/render_issue_body.py
Resolve scripts relative to this skill. Use temporary files for multiline bodies and preserve unrelated repository changes.