From ai-dev-team
Manage sprint lifecycle including planning, execution tracking, and closure operations.
npx claudepluginhub marcel-Ngan/ai-dev-team --plugin ai-dev-teamThis skill uses the workspace's default tool permissions.
Manage sprint lifecycle including planning, execution tracking, and closure operations.
Provides Ktor server patterns for routing DSL, plugins (auth, CORS, serialization), Koin DI, WebSockets, services, and testApplication testing.
Conducts multi-source web research with firecrawl and exa MCPs: searches, scrapes pages, synthesizes cited reports. For deep dives, competitive analysis, tech evaluations, or due diligence.
Provides demand forecasting, safety stock optimization, replenishment planning, and promotional lift estimation for multi-location retailers managing 300-800 SKUs.
Manage sprint lifecycle including planning, execution tracking, and closure operations.
| Tool | Purpose |
|---|---|
Atlassian:searchJiraIssuesUsingJql | Query sprint items, velocity |
Atlassian:editJiraIssue | Assign items to sprint, update status |
Atlassian:addCommentToJiraIssue | Log sprint decisions |
Atlassian:getJiraIssue | Fetch issue details |
All values come from config/project.json:
{
"cloudId": "{{jira.cloudId}}",
"projectKey": "{{jira.development.projectKey}}",
"sprintLengthDays": "{{agile.sprintLengthDays}}"
}
Atlassian:searchJiraIssuesUsingJql({
cloudId: "{{jira.cloudId}}",
jql: "project = {{jira.development.projectKey}} AND labels = 'refined' AND sprint IS EMPTY ORDER BY rank ASC",
fields: ["summary", "priority", "labels", "customfield_10016", "issuetype"]
})
// Get completed stories from last sprint
Atlassian:searchJiraIssuesUsingJql({
cloudId: "{{jira.cloudId}}",
jql: "project = {{jira.development.projectKey}} AND sprint IN closedSprints() AND status = Done AND resolved >= -14d",
fields: ["customfield_10016"] // story points field
})
Atlassian:editJiraIssue({
cloudId: "{{jira.cloudId}}",
issueIdOrKey: "PROJECT-45",
fields: {
customfield_10020: 123 // sprint ID field - get from board
}
})
Atlassian:addCommentToJiraIssue({
cloudId: "{{jira.cloudId}}",
issueIdOrKey: "PROJECT-45",
commentBody: `๐ค **Orchestrator Agent** - Sprint Planning
**Sprint:** Sprint 5 (Jan 6 - Jan 20)
**Committed:** Yes
**Sprint Goal Alignment:**
This story supports sprint goal: "Complete user authentication"
**Capacity Check:**
- Team velocity: 34 points
- Current commitment: 28 points
- This story: 5 points
- Remaining capacity: 1 point`
})
Atlassian:searchJiraIssuesUsingJql({
cloudId: "{{jira.cloudId}}",
jql: "project = {{jira.development.projectKey}} AND sprint IN openSprints()",
fields: ["summary", "status", "assignee", "customfield_10016"]
})
Atlassian:searchJiraIssuesUsingJql({
cloudId: "{{jira.cloudId}}",
jql: "project = {{jira.development.projectKey}} AND sprint IN openSprints() AND status = 'In Progress'",
fields: ["summary", "assignee", "updated"]
})
Atlassian:searchJiraIssuesUsingJql({
cloudId: "{{jira.cloudId}}",
jql: "project = {{jira.development.projectKey}} AND sprint IN openSprints() AND labels = 'blocked'",
fields: ["summary", "labels", "comment"]
})
Atlassian:searchJiraIssuesUsingJql({
cloudId: "{{jira.cloudId}}",
jql: "project = {{jira.development.projectKey}} AND sprint IN openSprints() AND (status CHANGED DURING (-1d, now()) OR updated >= -1d)",
fields: ["summary", "status", "assignee", "updated"]
})
// All sprint items with status
Atlassian:searchJiraIssuesUsingJql({
cloudId: "{{jira.cloudId}}",
jql: "project = {{jira.development.projectKey}} AND sprint IN openSprints()",
fields: ["summary", "status", "customfield_10016", "issuetype"]
})
## Sprint Progress Report
**Sprint:** Sprint 5
**Days Remaining:** 7 of 14
### Status Breakdown
| Status | Count | Points |
|--------|-------|--------|
| Done | 4 | 13 |
| In Progress | 3 | 8 |
| To Do | 2 | 5 |
| Blocked | 1 | 3 |
### Burndown
- **Committed:** 29 points
- **Completed:** 13 points (45%)
- **On Track:** Yes
### Blockers
- PROJECT-52: Waiting for API documentation (blocked 2 days)
### Risk Assessment
- Medium risk: 1 blocked item needs resolution by mid-sprint
Atlassian:searchJiraIssuesUsingJql({
cloudId: "{{jira.cloudId}}",
jql: "project = {{jira.development.projectKey}} AND sprint IN openSprints() AND status != Done",
fields: ["summary", "status", "customfield_10016"]
})
Atlassian:addCommentToJiraIssue({
cloudId: "{{jira.cloudId}}",
issueIdOrKey: "PROJECT-45",
commentBody: `๐ค **Orchestrator Agent** - Sprint Closure
**Sprint 5 Complete**
**This Story:** โ
Done
**Sprint Summary:**
- Committed: 29 points
- Completed: 26 points
- Velocity: 90%
**Carryover:** 1 story (3 points) moved to Sprint 6`
})
// Update sprint field to next sprint ID
Atlassian:editJiraIssue({
cloudId: "{{jira.cloudId}}",
issueIdOrKey: "PROJECT-58",
fields: {
customfield_10020: 124 // next sprint ID
}
})
Atlassian:addCommentToJiraIssue({
cloudId: "{{jira.cloudId}}",
issueIdOrKey: "PROJECT-58",
commentBody: `๐ค **Orchestrator Agent**
**Carried over from Sprint 5**
**Reason:** Not completed due to blocked dependency
**Original commitment:** Sprint 5
**New sprint:** Sprint 6
**Notes:** Dependency resolved, ready to continue`
})
// Get last 3 sprints completed points
Atlassian:searchJiraIssuesUsingJql({
cloudId: "{{jira.cloudId}}",
jql: "project = {{jira.development.projectKey}} AND sprint IN closedSprints() AND status = Done AND resolved >= -42d",
fields: ["customfield_10016", "resolutiondate"]
})
## Sprint Velocity Metrics
**Last 3 Sprints:**
| Sprint | Committed | Completed | Velocity |
|--------|-----------|-----------|----------|
| Sprint 4 | 28 | 26 | 93% |
| Sprint 3 | 32 | 30 | 94% |
| Sprint 2 | 25 | 25 | 100% |
**Average Velocity:** 27 points
**Recommended Commitment:** 26-28 points
| Error | Cause | Resolution |
|---|---|---|
| Sprint not found | Invalid sprint ID | Query board for sprint IDs |
| Cannot modify | Sprint is closed | Use next open sprint |
| No permission | Board access required | Verify board permissions |