jira-sync Skill
Status: To be developed Priority: Medium
Purpose
Bidirectional sync between SpecWeave increments and JIRA (Atlassian)
Note: This skill handles ONLY JIRA. For Azure DevOps, see ado-sync skill.
Features
Export to JIRA
- Create JIRA issues from SpecWeave increments
- Map spec.md user stories → JIRA Stories
- Map tasks.md tasks → JIRA Sub-tasks
- Create Epics if specified in spec.md
- Set priorities, labels, components
Import from JIRA
- Sync JIRA updates back to SpecWeave
- Import existing JIRA issues as increments
- Update status, assignees, comments
Bidirectional Sync
- Keep status in sync (To Do, In Progress, Done)
- Sync descriptions and acceptance criteria
- Sync comments
- Handle conflicts intelligently
JIRA-Specific Concepts
Mapping: SpecWeave → JIRA
| SpecWeave | JIRA |
|---|---|
| spec.md (with Epic) | Epic |
| spec.md User Story | Story |
| tasks.md Task | Sub-task |
| Acceptance Tests (spec.md) | Acceptance Criteria (Story) |
| Acceptance Criteria (tasks.md) | Sub-task checklist |
| Status: planned | To Do |
| Status: in-progress | In Progress |
| Status: completed | Done |
JIRA Structure Example
spec.md with JIRA structure:
---
increment: 002-payment-processing
status: planned
structure: jira
jira_epic: PROJ-123
---
## Epic: E-commerce Infrastructure
**JIRA**: PROJ-123
### Story: Subscribe to Plan
**JIRA**: PROJ-124
**Priority**: P1
**Labels**: payments, stripe
**Components**: Backend, Frontend
**Description**:
As a user, I want to subscribe to a monthly plan...
**Acceptance Criteria**:
- User can select plan
- Payment processed
- Subscription activated
tasks.md creates Sub-tasks:
## Tasks for PROJ-124 (Subscribe to Plan)
### Task T001: Create StripeService
**JIRA**: PROJ-125 (Sub-task of PROJ-124)
**Agent**: nodejs-backend
**Description**: Create Stripe service class...
**Acceptance Criteria**:
- [ ] StripeService class exists
- [ ] Unit tests passing
Authentication
JIRA Cloud:
JIRA Server/Data Center:
jira_sync:
type: "server"
url: "https://jira.your-company.com"
username: "user"
password: "${JIRA_PASSWORD}" # From environment variable
project_key: "PROJ"
Configuration
Workflow
Export Workflow (SpecWeave → JIRA)
User: Creates increment in SpecWeave
.specweave/increments/0002-payment/
spec.md (with structure: jira)
tasks.md
↓ jira-sync detects new increment
Creates in JIRA:
Epic: PROJ-123 "E-commerce Infrastructure"
Story: PROJ-124 "Subscribe to Plan"
Sub-task: PROJ-125 "Create StripeService"
Sub-task: PROJ-126 "Create API endpoints"
Links created:
spec.md → PROJ-124
tasks.md T001 → PROJ-125
tasks.md T002 → PROJ-126
Import Workflow (JIRA → SpecWeave)
User: Updates JIRA issue status to "In Progress"
↓ JIRA webhook triggers
jira-sync:
Detects change to PROJ-124
Finds linked increment: 002-payment
Updates: .specweave/increments/0002-payment/spec.md
status: planned → in-progress
Bidirectional Sync
User: Checks off task in tasks.md
- [x] T001: Create StripeService
↓ jira-sync detects change
Updates JIRA:
PROJ-125 status → Done
User: Changes PROJ-124 to "Done" in JIRA
↓ JIRA webhook triggers
jira-sync updates SpecWeave:
.specweave/increments/0002-payment/spec.md
status: in-progress → completed
API Integration
JIRA REST API Endpoints Used
// Create Epic
POST /rest/api/3/issue
{
"fields": {
"project": { "key": "PROJ" },
"issuetype": { "name": "Epic" },
"summary": "E-commerce Infrastructure",
"customfield_10011": "epic-name" // Epic Name field
}
}
// Create Story (linked to Epic)
POST /rest/api/3/issue
{
"fields": {
"project": { "key": "PROJ" },
"issuetype": { "name": "Story" },
"summary": "Subscribe to Plan",
"parent": { "key": "PROJ-123" } // Link to Epic
}
}
// Create Sub-task
POST /rest/api/3/issue
{
"fields": {
"project": { "key": "PROJ" },
"issuetype": { "name": "Sub-task" },
"parent": { "key": "PROJ-124" },
"summary": "Create StripeService"
}
}
// Update status
POST /rest/api/3/issue/{issueKey}/transitions
{
"transition": { "id": "31" } // "In Progress"
}
Webhooks
Setup JIRA Webhook
- Go to JIRA Settings → System → Webhooks
- Create webhook:
- URL:
https://your-app.com/api/webhooks/jira - Events: Issue created, updated, deleted
- Secret: Random string (store in JIRA_WEBHOOK_SECRET)
- URL:
Webhook Handler
// Receives JIRA webhook
POST /api/webhooks/jira
// jira-sync processes:
1. Verify webhook signature
2. Extract issue data
3. Find linked SpecWeave increment
4. Update spec.md or tasks.md
5. Commit changes (optional)
Conflict Resolution
Scenario: Both SpecWeave and JIRA updated simultaneously
Strategy:
- Timestamp-based: Latest change wins
- User prompt: Ask user which to keep
- Merge: Combine changes if possible
Example:
SpecWeave: status → in-progress (10:00 AM)
JIRA: status → done (10:05 AM)
jira-sync:
Latest is JIRA (10:05 AM)
Update SpecWeave → done
Error Handling
Common errors:
- JIRA API rate limits → Retry with exponential backoff
- Authentication failed → Notify user, check credentials
- Issue not found → Create if export, skip if import
- Network errors → Queue for retry
Testing
Test scenarios:
- Create increment → Creates JIRA issues
- Update JIRA → Updates SpecWeave
- Update SpecWeave → Updates JIRA
- Conflict resolution
- Webhook handling
- Error recovery
Integration with Other Skills
- task-builder: Reads JIRA structure from spec.md
- increment-planner: Can specify structure: jira
Future Enhancements
- Support for JIRA sprints/iterations
- Sync custom fields
- Attachment sync
- Advanced filtering (which issues to sync)
- Bulk import from JIRA
To implement: See task in .specweave/increments/
See also: ado-sync skill for Azure DevOps integration