415 lines
8.7 KiB
Markdown
415 lines
8.7 KiB
Markdown
# ado-sync Skill
|
|
|
|
**Status**: To be developed
|
|
**Priority**: Medium
|
|
|
|
## Purpose
|
|
|
|
Bidirectional sync between SpecWeave increments and Azure DevOps (ADO)
|
|
|
|
**Note**: This skill handles ONLY Azure DevOps. For JIRA, see `jira-sync` skill.
|
|
|
|
## Features
|
|
|
|
### Export to ADO
|
|
- Create ADO work items from SpecWeave increments
|
|
- Map spec.md user stories → ADO User Stories
|
|
- Map tasks.md tasks → ADO Tasks
|
|
- Create Features if specified in spec.md
|
|
- Set Area Paths, Iterations, priorities
|
|
|
|
### Import from ADO
|
|
- Sync ADO updates back to SpecWeave
|
|
- Import existing ADO work items as increments
|
|
- Update status, assignees, comments
|
|
|
|
### Bidirectional Sync
|
|
- Keep status in sync (New, Active, Resolved, Closed)
|
|
- Sync descriptions and acceptance criteria
|
|
- Sync comments and attachments
|
|
- Handle conflicts intelligently
|
|
|
|
## ADO-Specific Concepts
|
|
|
|
### Mapping: SpecWeave → Azure DevOps
|
|
|
|
| SpecWeave | Azure DevOps |
|
|
|-----------|--------------|
|
|
| spec.md (with Feature) | Feature |
|
|
| spec.md User Story | User Story |
|
|
| tasks.md Task | Task |
|
|
| Acceptance Tests (spec.md) | Acceptance Criteria (User Story) |
|
|
| Acceptance Criteria (tasks.md) | Task checklist |
|
|
| Status: planned | New |
|
|
| Status: in-progress | Active |
|
|
| Status: completed | Closed |
|
|
|
|
### ADO Structure Example
|
|
|
|
**spec.md with ADO structure**:
|
|
```markdown
|
|
---
|
|
increment: 002-payment-processing
|
|
status: planned
|
|
structure: ado
|
|
ado_feature: 456
|
|
---
|
|
|
|
## Feature: Payment Processing
|
|
**ADO**: 456
|
|
**Area Path**: Platform/Payments
|
|
**Iteration**: Sprint 12
|
|
|
|
### User Story: Subscribe to Plan
|
|
**ADO**: 789
|
|
**Priority**: 1
|
|
**Area Path**: Platform/Payments
|
|
**Iteration**: Sprint 12
|
|
|
|
**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 Tasks**:
|
|
```markdown
|
|
## Tasks for ADO-789 (Subscribe to Plan)
|
|
|
|
### Task T001: Create StripeService
|
|
**ADO**: 790 (Task under User Story 789)
|
|
**Agent**: nodejs-backend
|
|
**Area Path**: Platform/Payments/Backend
|
|
**Iteration**: Sprint 12
|
|
|
|
**Description**: Create Stripe service class...
|
|
|
|
**Acceptance Criteria**:
|
|
- [ ] StripeService class exists
|
|
- [ ] Unit tests passing
|
|
```
|
|
|
|
## Authentication
|
|
|
|
**Personal Access Token (PAT)**:
|
|
|
|
|
|
**OAuth 2.0** (for apps):
|
|
```yaml
|
|
ado_sync:
|
|
url: "https://dev.azure.com/your-org"
|
|
project: "YourProject"
|
|
auth_type: "oauth"
|
|
client_id: "${ADO_CLIENT_ID}"
|
|
client_secret: "${ADO_CLIENT_SECRET}"
|
|
```
|
|
|
|
## Configuration
|
|
|
|
|
|
|
|
## Workflow
|
|
|
|
### Export Workflow (SpecWeave → ADO)
|
|
|
|
```
|
|
User: Creates increment in SpecWeave
|
|
.specweave/increments/0002-payment/
|
|
spec.md (with structure: ado)
|
|
tasks.md
|
|
|
|
↓ ado-sync detects new increment
|
|
|
|
Creates in ADO:
|
|
Feature: 456 "Payment Processing"
|
|
Area Path: Platform/Payments
|
|
Iteration: Sprint 12
|
|
|
|
User Story: 789 "Subscribe to Plan"
|
|
Area Path: Platform/Payments
|
|
Iteration: Sprint 12
|
|
|
|
Task: 790 "Create StripeService"
|
|
Area Path: Platform/Payments/Backend
|
|
Iteration: Sprint 12
|
|
|
|
Task: 791 "Create API endpoints"
|
|
|
|
Links created:
|
|
spec.md → ADO-789
|
|
tasks.md T001 → ADO-790
|
|
tasks.md T002 → ADO-791
|
|
```
|
|
|
|
### Import Workflow (ADO → SpecWeave)
|
|
|
|
```
|
|
User: Updates ADO work item status to "Active"
|
|
|
|
↓ ADO service hook triggers
|
|
|
|
ado-sync:
|
|
Detects change to ADO-789
|
|
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
|
|
|
|
↓ ado-sync detects change
|
|
|
|
Updates ADO:
|
|
Work Item 790 status → Closed
|
|
|
|
User: Changes ADO-789 to "Closed" in Azure DevOps
|
|
|
|
↓ ADO service hook triggers
|
|
|
|
ado-sync updates SpecWeave:
|
|
.specweave/increments/0002-payment/spec.md
|
|
status: in-progress → completed
|
|
```
|
|
|
|
## API Integration
|
|
|
|
### Azure DevOps REST API Endpoints Used
|
|
|
|
```typescript
|
|
// Create Feature
|
|
POST https://dev.azure.com/{org}/{project}/_apis/wit/workitems/$Feature?api-version=7.0
|
|
Content-Type: application/json-patch+json
|
|
|
|
[
|
|
{
|
|
"op": "add",
|
|
"path": "/fields/System.Title",
|
|
"value": "Payment Processing"
|
|
},
|
|
{
|
|
"op": "add",
|
|
"path": "/fields/System.AreaPath",
|
|
"value": "Platform/Payments"
|
|
},
|
|
{
|
|
"op": "add",
|
|
"path": "/fields/System.IterationPath",
|
|
"value": "Sprint 12"
|
|
}
|
|
]
|
|
|
|
// Create User Story (linked to Feature)
|
|
POST https://dev.azure.com/{org}/{project}/_apis/wit/workitems/$User%20Story?api-version=7.0
|
|
|
|
[
|
|
{
|
|
"op": "add",
|
|
"path": "/fields/System.Title",
|
|
"value": "Subscribe to Plan"
|
|
},
|
|
{
|
|
"op": "add",
|
|
"path": "/relations/-",
|
|
"value": {
|
|
"rel": "System.LinkTypes.Hierarchy-Reverse",
|
|
"url": "https://dev.azure.com/{org}/_apis/wit/workItems/456"
|
|
}
|
|
}
|
|
]
|
|
|
|
// Create Task (linked to User Story)
|
|
POST https://dev.azure.com/{org}/{project}/_apis/wit/workitems/$Task?api-version=7.0
|
|
|
|
[
|
|
{
|
|
"op": "add",
|
|
"path": "/fields/System.Title",
|
|
"value": "Create StripeService"
|
|
},
|
|
{
|
|
"op": "add",
|
|
"path": "/relations/-",
|
|
"value": {
|
|
"rel": "System.LinkTypes.Hierarchy-Reverse",
|
|
"url": "https://dev.azure.com/{org}/_apis/wit/workItems/789"
|
|
}
|
|
}
|
|
]
|
|
|
|
// Update status
|
|
PATCH https://dev.azure.com/{org}/{project}/_apis/wit/workitems/{id}?api-version=7.0
|
|
|
|
[
|
|
{
|
|
"op": "add",
|
|
"path": "/fields/System.State",
|
|
"value": "Active"
|
|
}
|
|
]
|
|
```
|
|
|
|
## Service Hooks (Webhooks)
|
|
|
|
### Setup ADO Service Hook
|
|
|
|
1. Go to Project Settings → Service hooks
|
|
2. Create new service hook:
|
|
- Service: Web Hooks
|
|
- Trigger: Work item updated
|
|
- URL: `https://your-app.com/api/webhooks/ado`
|
|
- Filters: Area path = Platform/Payments (optional)
|
|
|
|
### Service Hook Handler
|
|
|
|
```typescript
|
|
// Receives ADO service hook
|
|
POST /api/webhooks/ado
|
|
|
|
// ado-sync processes:
|
|
1. Verify request (optional: check secret)
|
|
2. Extract work item data
|
|
3. Find linked SpecWeave increment
|
|
4. Update spec.md or tasks.md
|
|
5. Commit changes (optional)
|
|
```
|
|
|
|
## ADO-Specific Features
|
|
|
|
### Area Paths
|
|
|
|
**Organize work by area**:
|
|
```markdown
|
|
# spec.md
|
|
---
|
|
ado_area_path: "Platform/Payments"
|
|
---
|
|
```
|
|
|
|
Maps to ADO Area Path for organization.
|
|
|
|
### Iterations/Sprints
|
|
|
|
**Assign to sprint**:
|
|
```markdown
|
|
# spec.md
|
|
---
|
|
ado_iteration: "Sprint 12"
|
|
---
|
|
```
|
|
|
|
Or auto-detect current sprint:
|
|
```yaml
|
|
# config.yaml
|
|
ado_sync:
|
|
auto_detect_iteration: true
|
|
```
|
|
|
|
### Work Item Types
|
|
|
|
**ADO supports custom work item types**:
|
|
- Epic → Feature → User Story → Task (default)
|
|
- Custom types supported via config
|
|
|
|
```yaml
|
|
ado_sync:
|
|
work_item_types:
|
|
epic: "Epic"
|
|
feature: "Feature"
|
|
story: "User Story"
|
|
task: "Task"
|
|
```
|
|
|
|
### Custom Fields
|
|
|
|
**Sync custom fields**:
|
|
```yaml
|
|
ado_sync:
|
|
custom_fields:
|
|
- name: "Custom.Priority"
|
|
map_from: "priority" # From spec.md frontmatter
|
|
- name: "Custom.Estimate"
|
|
map_from: "estimate"
|
|
```
|
|
|
|
## Conflict Resolution
|
|
|
|
**Scenario**: Both SpecWeave and ADO updated simultaneously
|
|
|
|
**Strategy**:
|
|
1. **Timestamp-based**: Latest change wins
|
|
2. **User prompt**: Ask user which to keep (via Ping.aiff)
|
|
3. **Merge**: Combine changes if possible
|
|
|
|
**Example**:
|
|
```
|
|
SpecWeave: status → in-progress (10:00 AM)
|
|
ADO: status → closed (10:05 AM)
|
|
|
|
ado-sync:
|
|
Latest is ADO (10:05 AM)
|
|
Update SpecWeave → completed
|
|
🔔 Ping.aiff: "ADO conflict resolved - ADO version used"
|
|
```
|
|
|
|
## Error Handling
|
|
|
|
**Common errors**:
|
|
- ADO API rate limits → Retry with exponential backoff
|
|
- Authentication failed → Notify user, check PAT
|
|
- Work item not found → Create if export, skip if import
|
|
- Network errors → Queue for retry
|
|
- Area Path invalid → Use default or notify user
|
|
|
|
## Testing
|
|
|
|
**Test scenarios**:
|
|
1. Create increment → Creates ADO work items
|
|
2. Update ADO → Updates SpecWeave
|
|
3. Update SpecWeave → Updates ADO
|
|
4. Area Path mapping
|
|
5. Iteration mapping
|
|
6. Conflict resolution
|
|
7. Service hook handling
|
|
8. Custom fields sync
|
|
|
|
## Integration with Other Skills
|
|
|
|
- **task-builder**: Reads ADO structure from spec.md
|
|
- **increment-planner**: Can specify structure: ado
|
|
|
|
## Comparison: JIRA vs ADO
|
|
|
|
| Feature | JIRA (jira-sync) | Azure DevOps (ado-sync) |
|
|
|---------|------------------|-------------------------|
|
|
| **Epic level** | Epic | Feature |
|
|
| **Story level** | Story | User Story |
|
|
| **Task level** | Sub-task | Task |
|
|
| **Organization** | Components, Labels | Area Paths |
|
|
| **Sprints** | Sprints (board-based) | Iterations (path-based) |
|
|
| **API** | JIRA REST API v3 | Azure DevOps REST API v7.0 |
|
|
| **Auth** | API Token | PAT or OAuth |
|
|
| **Webhooks** | JIRA Webhooks | Service Hooks |
|
|
| **Custom fields** | Custom fields | Work item fields |
|
|
|
|
## Future Enhancements
|
|
|
|
- Support for ADO Boards/Backlogs
|
|
- Sprint burndown sync
|
|
- Test case sync (ADO Test Plans)
|
|
- Build/release pipeline integration
|
|
- Wiki sync
|
|
- Git repo integration (link commits to work items)
|
|
|
|
---
|
|
|
|
**To implement**: See task in .specweave/increments/
|
|
|
|
**See also**: `jira-sync` skill for JIRA integration
|