com um clique
speckit-atlassian-sync-push
// Push User Stories + tasks from spec.md / tasks.md to Jira as Stories and Sub-tasks under an existing Epic
// Push User Stories + tasks from spec.md / tasks.md to Jira as Stories and Sub-tasks under an existing Epic
Fetch a Jira Epic and format its content as spec input ready for /speckit-specify
Generate a custom checklist for the current feature based on user requirements.
Identify underspecified areas in the current feature spec by asking up to 5 highly targeted clarification questions and encoding answers back into the spec.
Download frames from a Figma file URL into the feature designs/ folder
Create a GitHub Pull Request for the active feature branch using spec.md as source for title and body
Convert all Markdown files in the current feature directory to self-contained HTML
| name | speckit-atlassian-sync-push |
| description | Push User Stories + tasks from spec.md / tasks.md to Jira as Stories and Sub-tasks under an existing Epic |
| argument-hint | [epic-key] e.g. /speckit-atlassian-sync-push DEVPT-518 |
| compatibility | Requires spec-kit project structure with .specify/ directory and Atlassian MCP connected |
| metadata | {"author":"afianza-local","source":"atlassian-sync:commands/speckit.atlassian-sync.push.md"} |
| user-invocable | true |
{{ARGS}}
You MUST consider the user input before proceeding (if not empty). If a Jira key is provided (e.g. DEVPT-518), treat it as the Epic key and skip asking for it.
Run .specify/scripts/bash/check-prerequisites.sh --json --paths-only from repo root. Parse JSON for:
FEATURE_DIR (absolute path to the active feature directory)FEATURE_SPEC (absolute path to spec.md)TASKS (absolute path to tasks.md)If JSON parsing fails, abort and ask the user to run /speckit-specify first.
Read .specify/extensions/atlassian-sync/config/atlassian.yml for defaults:
cloudIdprojectKeyissueTypes.story / issueTypes.subtaskepicLinkFieldCheck if a per-feature override file exists at {FEATURE_DIR}/atlassian.yml. If it does, merge it on top (feature values win).
DEVPT-518), use it directly.Read FEATURE_SPEC. Parse every ### User Story N section. For each story extract:
— (e.g. Crear y gestionar el equipo de un cliente)(Priority: P?) annotation**Why or **¿Por qué)**Why this priority** / **¿Por qué P?** paragraph**Independent Test** / **Test independiente** paragraph**Given** … **When** … **Then** … blocksBuild the full Jira description from these parts using this template:
{narrative}
**¿Por qué {priority}?**
{why}
**Test independiente**
{independent_test}
---
**Escenarios de aceptación**
1. **Given** ...
**When** ...
**Then** ...
[repeat for each scenario]
Also extract PO questions: look for lines or sections containing NEEDS CLARIFICATION, TODO, open questions (lines ending with ? that are not inside acceptance scenarios). Collect them per story.
Read TASKS. For each task line matching the checklist format:
- [ ] T### [P] [US?] Description with file path
Extract:
T###[P][US?] tag (e.g. [US1], [US2]) — maps to story indexGroup tasks by story ([US1] → Story 1, [US2] → Story 2, etc.).
Tasks without a [US?] tag (setup, foundational, polish) go into a special _unassigned bucket — do NOT create them as sub-tasks under a story; ask the user which story (or skip).
Show a dry-run summary:
📋 Ready to push to Jira
Epic: {epicKey}
Project: {projectKey}
Cloud: {cloudId}
Stories to create: N
• US1 · {title} — {task_count} sub-tasks
• US2 · {title} — {task_count} sub-tasks
...
Unassigned tasks (no [US?] label): M
→ Skipping unless you specify a story
Proceed? (yes / no)
Wait for confirmation before making any API calls.
For each User Story, call mcp__atlassian__createJiraIssue with:
cloudId: from configprojectKey: from configissueTypeName: Storysummary: US{N} · {title}description: full description built in Step 4contentFormat: markdownadditional_fields: { "{epicLinkField}": "{epicKey}" }Create all stories in parallel (single message, multiple tool calls).
Store the mapping: US1 → DEVPT-XXX, US2 → DEVPT-YYY, etc.
For each story, create its sub-tasks under the Story key obtained in Step 7.
Call mcp__atlassian__createJiraIssue with:
cloudId: from configprojectKey: from configissueTypeName: Sub-taskparent: the Story key for this storysummary: {id} · {description} (include [P] marker if parallelizable)description: file path and brief context extracted from the task linecontentFormat: markdownBatch sub-task creation in parallel groups of up to 6 calls per message to avoid rate limits.
Output a table of all created issues:
| Story / Sub-task | Jira Key | Link |
|---|---|---|
| US1 · {title} | DEVPT-XXX | https://... |
| └ T001 · ... | DEVPT-YYY | https://... |
| └ T002 · ... | DEVPT-YYZ | https://... |
| US2 · {title} | DEVPT-XXZ | https://... |
| ... |
Total: N Stories + M Sub-tasks created.
If PO questions were found in Step 4, ask:
"Se encontraron preguntas pendientes para la PO en {N} historias. ¿Quieres añadirlas como comentarios en Jira? (yes / no)"
If yes:
mcp__atlassian__addCommentToJiraIssueUS{N} · prefix in summary), skip it and warn.mcp__atlassian__createJiraIssue returns an error for a single item, log the error and continue with the rest./mcp y vuelve a ejecutar."[US?] label are silently skipped unless the user explicitly asks to include them.