Populate Jira with the full GSD state from all repos (one-time initial sync)
How this skill is triggered — by the user, by Claude, or both
Slash command
/claude-gsd-jira-plugin:jira-seed --dry-run--dry-runThis skill is limited to the following tools:
The summary Claude sees in its skill listing — used to decide when to auto-load this skill
<objective>
Repos: auto-detected via src/*/.planning/ glob
$ARGUMENTS
Before doing anything, verify GSD is set up in this project:
src/*/.planning/ROADMAP.md -- if zero matches, abort with:
ERROR: No GSD repos found. Expected src/{repo}/.planning/ROADMAP.md files.
Run /gsd-new-project first to initialize GSD planning.
ROADMAP.md has at least one milestone definedGSD repos found:
- src/my-api/.planning/ (3 milestones, 12 phases)
- src/my-pwa/.planning/ (2 milestones, 8 phases)
JIRA_HOST, JIRA_USERNAME, JIRA_API_TOKENMissing Jira credentials. Set these env vars:
export JIRA_HOST=https://yourteam.atlassian.net
export [email protected]
export JIRA_API_TOKEN=<token from https://id.atlassian.com/manage-profile/security/api-tokens>
JIRA_PROJECT_KEY env var is set, use itdata/jira-config.json has projectKey, use itGET /rest/api/3/project and pick the first project (or prompt if multiple)data/jira-mapping.json -- if non-empty, warn that cards already exist and ask to confirm --force or abortdata/jira-config.json if exists; otherwise discover via API and saveLaunch N Explore agents in parallel, one per detected repo:
Read src/{repo}/.planning/ROADMAP.md
Read src/{repo}/.planning/STATE.md
Glob src/{repo}/.planning/phases/**/*-PLAN.md
Glob src/{repo}/.planning/milestones/**/*-PLAN.md
For each milestone found in ROADMAP.md:
- Extract: version, name, phase range, completion status
For each phase:
- Extract: number, name, slug, done/pending, plan count
For each PLAN.md:
- Extract: phase, plan number, objective (from <objective> tag), requirements
Return structured JSON with the full hierarchy.
Merge results from all agents into a single card list:
For each repo:
For each milestone:
-> Epic card: "[{repo}] {version} -- {name}"
status: Done if all phases complete, else In Progress
For each phase in milestone:
-> Feature card: "Phase {N}: {name}"
status:
- Concluido if [x] in ROADMAP
- Executando if stopped_at and status=executing
- Planejamento if stopped_at and status=planning/discussing
- Pronto if ready to execute
- Backlog (default) if not started
link: parent Epic
For each PLAN.md in phase:
-> Subtask card: "{phase}-{plan}: {objective}"
status: inherit parent Feature status
link: parent Feature
If --dry-run:
Print the full card hierarchy as a table:
| Type | Card ID | Summary | Status |
|---------|--------------------------------------|----------------------------------|-------------|
| Epic | my-api/v2.0 | [my-api] v2.0 -- Onboarding | Concluido |
| Feature | my-api/v2.0/32-iam-foundation | Phase 32: IAM Foundation | Concluido |
| Subtask | my-api/v2.0/32-iam-foundation/01 | 32-01: Register + Login handlers | Concluido |
Print totals: X epics, Y features, Z subtasks Stop here.
When creating cards, ALWAYS include a structured description in Atlassian Document Format (ADF). Extract content from the GSD artifacts found in Step 2.
Source: ROADMAP.md + milestones/{version}-ROADMAP.md + MILESTONES.md
## Goal -> milestone name/goal
## Phases -> list with [done/pending] status
## Stats -> from MILESTONES.md (accomplishments, test counts)
Source: milestones/{version}-ROADMAP.md section ### Phase N:
## Goal -> **Goal**: line
## Requirements -> requirement codes (AUTH-01, etc.)
## Success Criteria -> numbered criteria from **Success Criteria** block
## Plans -> plan list from **Plans**: block
## Dependencies -> **Depends on**: line
Source: {phase-dir}/{NN}-{PP}-PLAN.md (YAML frontmatter + tag)
## Objective -> first line of <objective> tag
## Requirements -> requirements from frontmatter
## Must-Haves -> truths from must_haves.truths
## Files Modified -> files_modified list (max 15)
Wave: {wave number}
Use {"type": "doc", "version": 1, "content": [...]} with heading, paragraph, and bulletList nodes.
{
"type": "doc", "version": 1,
"content": [
{"type": "heading", "attrs": {"level": 2}, "content": [{"type": "text", "text": "Goal"}]},
{"type": "paragraph", "content": [{"type": "text", "text": "..."}]},
{"type": "bulletList", "content": [
{"type": "listItem", "content": [{"type": "paragraph", "content": [{"type": "text", "text": "..."}]}]}
]}
]
}
Before creating cards, discover the Epic Link custom field:
curl -s "${JIRA_HOST}/rest/api/3/field" \
-H "Authorization: Basic ..." | jq '.[] | select(.name == "Epic Link") | .id'
Store the field ID (typically customfield_10014) for linking features to epics.
Also discover available transitions (if not already in data/jira-config.json):
curl -s "${JIRA_HOST}/rest/api/3/issue/{any-issue-key}/transitions" \
-H "Authorization: Basic ..."
Save discovered IDs to data/jira-config.json.
Read the project key from data/jira-config.json or JIRA_PROJECT_KEY env var.
For each epic card:
{repo}/{milestone} -> {PROJECT_KEY}-XXXFor each feature card:
{repo}/{milestone}/{phase} -> {PROJECT_KEY}-XXXFor each subtask card:
{repo}/{milestone}/{phase}/plan-{N} -> {PROJECT_KEY}-XXXWrite data/jira-mapping.json after each batch (A, B, C) for crash recovery.
Print summary:
Jira Seed Complete
Repos scanned: N ({repo1}, {repo2}, ...)
Epics created: X (Y concluido, Z in progress)
Features created: X (Y concluido, Z executando, W planejamento, V pronto, U backlog)
Subtasks created: X
Total cards: X
Mapping saved: data/jira-mapping.json
Transition IDs vary per Jira project. They are stored in data/jira-config.json:
{
"projectKey": "PROJ",
"transitions": {
"backlog": { "transitionId": "11", "statusId": "10000" },
"planejamento": { "transitionId": "2", "statusId": "10036" },
"pronto": { "transitionId": "3", "statusId": "10037" },
"executando": { "transitionId": "21", "statusId": "10001" },
"verificacao": { "transitionId": "31", "statusId": "10002" },
"concluido": { "transitionId": "41", "statusId": "10003" }
}
}
If data/jira-config.json does not exist, discover transitions by calling:
curl -s "${JIRA_HOST}/rest/api/3/issue/{any-issue-key}/transitions" \
-H "Authorization: Basic $(echo -n '${JIRA_USERNAME}:${JIRA_API_TOKEN}' | base64)"
Then save the discovered IDs to data/jira-config.json for future runs.
| Column | Status Name | Flow Direction |
|---|---|---|
| Backlog | Backlog | Start |
| Planejamento | Planejamento | -> |
| Pronto | Pronto | -> |
| Executando | Executando | -> |
| Verificacao | Verificacao | -> |
| Concluido | Concluido | End |
Auto-detected repos get labels derived from their directory name.
All cards also get gsd-managed.
Common mappings (customize in data/jira-config.json repoLabels if needed):
| Repo Directory | Default Label |
|---|---|
| *-api, *-backend, *-server | backend |
| *-pwa, *-web, *-frontend | frontend |
| *-infra, *-terraform, *-iac | infra |
| (other) | directory name |
| Type | Format |
|---|---|
| Epic | [{repo}] v{N}.{N} -- {milestone_name} |
| Feature | Phase {N}: {phase_name} |
| Subtask | {phase_num}-{plan_num}: {objective_first_line} |
npx claudepluginhub dumorro/claude-gsd-jira-plugin --plugin claude-gsd-jira-pluginCreates bite-sized, testable implementation plans from specs or requirements, with file structure and task decomposition. Activates before coding multi-step tasks.