Help us improve
Share bugs, ideas, or general feedback.
From runesmith-sprint
Convert a plan (or several) in plans/active/ into Jira ticket drafts organized by sprint. Drafts persist as JSON under plans/active/{slug}/tickets/{KEY}.json until push; after push they archive to archive/tickets-pushed/{YYYY-MM}/. Use when the user says "convert this plan to tickets", "make tickets from this plan", "break down the plan", "plan to tickets", "ticket up the plan", or wants to materialize plan work as Jira issues.
npx claudepluginhub runemarklabs/runesmith --plugin runesmith-sprintHow this skill is triggered — by the user, by Claude, or both
Slash command
/runesmith-sprint:plan-to-ticketsThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Read one or more `plans/active/<slug>/plan.md` files. Decompose into Jira tickets. Write each as JSON under `plans/active/<slug>/tickets/` so the draft state survives across sessions. Organize them into a target sprint (or backlog). User confirms; push via existing ticket flow. After push, archive the JSON drafts to `archive/tickets-pushed/<YYYY-MM>/` for history.
Mandates invoking relevant skills via tools before any response in coding sessions. Covers access, priorities, and adaptations for Claude Code, Copilot CLI, Gemini CLI.
Share bugs, ideas, or general feedback.
Read one or more plans/active/<slug>/plan.md files. Decompose into Jira tickets. Write each as JSON under plans/active/<slug>/tickets/ so the draft state survives across sessions. Organize them into a target sprint (or backlog). User confirms; push via existing ticket flow. After push, archive the JSON drafts to archive/tickets-pushed/<YYYY-MM>/ for history.
Atlassian-enabled only.
lib/folder-conventions.md - canonical home for ticket drafts (plans/active/<slug>/tickets/) and post-push archive (archive/tickets-pushed/<YYYY-MM>/)lib/plan-format.md - how to read plans; directory shape includes tickets/ subfolderlib/atlassian-rest.md - endpointslib/comms-check.md - runs firstlib/atlassian-enabled.mdlib/jira-tags.md - apply cowork-planned, bootstraprunesmith-jira:ticket (push flow)lib/user-prompts.md - structured-input requirement for any user promptThis skill follows the marketplace-wide user-prompt standard in lib/user-prompts.md. Every user prompt MUST use the host client's structured input UI (single-pick, multi-pick, or text-input form). Never freeform plain-text yes/no questions. The only exception is the consent-trigger gate documented in lib/consent.md, which waits for user-initiated phrases like "make the ticket".
If not: "Atlassian not enabled. Run /atlassian:enable first."
plans/active/ exists and has at least one plan with status: open or status: building.
List all plans in plans/active/ with status: open or status: building. Show:
Plans available
[1] {slug} status: open ({status sort})
[2] {slug} status: building
...
User picks one or more. Multiple plans can map to one batch of tickets.
For each selected plan, propose a ticket breakdown. Strategy:
status: building and >5 child tickets, or user opts in).Show proposed tickets in a table. For each: Type (Epic / Story / Task / Bug), Summary, Description excerpt, target Sprint (default: backlog; user can pick active sprint).
For each ticket batch:
If targeting a sprint, look up sprint id via GET /rest/agile/1.0/board/{BOARD_ID}/sprint?state=active (or future).
Render every ticket as the JSON the runesmith-jira:ticket skill expects:
{
"fields": {
"project": { "key": "{JIRA_PROJECT_KEY}" },
"issuetype": { "name": "Task" },
"summary": "...",
"description": <ADF document derived from plan section>,
"labels": ["cowork-planned", "bootstrap"],
"priority": { "name": "Medium" }
}
}
Description ADF includes a link to the plan slug (back-reference).
Write each ticket JSON to plans/active/<slug>/tickets/<DRAFT-ID>.json where <DRAFT-ID> is a deterministic local identifier (e.g. <slug>-001, <slug>-002). These drafts persist on disk so the plan-to-tickets workflow can resume across sessions and so the user can review them outside chat.
If targeting a sprint, also include sprint assignment via POST /rest/agile/1.0/sprint/{SPRINT_ID}/issue after creates.
{N} tickets to create:
Epic: 1 {summary}
Story: 3 ...
Task: 5 ...
Bug: 0
Target: {sprint name | Backlog}
Push these tickets to {JIRA_PROJECT_KEY}?
Wait for trigger phrase ("push", "make the tickets", "create them", "yes").
For each ticket, call the same REST flow as atlassian:ticket:
POST {SITE_URL}/rest/api/3/issue
Capture each response key.
After all tickets created, if any are sprint-targeted:
POST {SITE_URL}/rest/agile/1.0/sprint/{SPRINT_ID}/issue
{ "issues": [<list of new keys>] }
If Epic created, link Stories/Tasks to it via the Epic Link custom field (auto-discover via GET /rest/api/3/field).
Append the new ticket keys to the plan's frontmatter tickets: array. Edit plan.md in place (preserving the rest):
tickets:
- {KEY-1}
- {KEY-2}
Touch updated: to today's date. If plan was status: open, optionally bump to status: building (ask user via structured prompt).
Per lib/folder-conventions.md, after successful Jira push:
plans/active/<slug>/tickets/<DRAFT-ID>.json → plans/active/<slug>/tickets/<JIRA-KEY>.json (so the on-disk name matches the issued key).archive/tickets-pushed/<YYYY-MM>/<JIRA-KEY>.json for history.plans/active/<slug>/tickets/ ends empty (or holds only unpushed drafts if user partially confirmed).If any push failed, leave its draft JSON in plans/active/<slug>/tickets/ for retry; record the failure in the report.
✓ Tickets created from plan(s)
Plans: {slug-1}, {slug-2}
Tickets: {N} created
{KEY-1} Task {summary} → {sprint name | Backlog}
...
Sprint assignments: {n}
Plan(s) updated with ticket references.
Drafts archived: archive/tickets-pushed/<YYYY-MM>/
Next: /runesmith-sprint:start-sprint to hand the active sprint to CC, or
/runesmith-sprint:sprint-status to see board state.
cowork-planned + bootstrap labelsplans/active/<slug>/tickets/ BEFORE push consentarchive/tickets-pushed/<YYYY-MM>/<KEY>.jsonplans/active/<slug>/tickets/ for retrytickets: and asks before adding more)No plans with status open or building: "No active plans to convert. Create one with /core:plan first."
Plan body missing acceptance criteria: Skill asks user to add them inline before decomposition, or proceeds with Task-only breakdown.
Sprint id lookup fails: Default to Backlog; surface the failure but continue.
Ticket create 400 (custom field required): Surface field name; ask user to fill or use a Story type that doesn't require it.
Plan already has tickets[] populated: Show existing keys; ask "Add more, replace, or skip?"
Sprint full / capacity warning: Note in report, doesn't block.