From teamwork-plugin
Sprint management skill for Teamwork Projects. Track sprint tasks, compare estimates vs. actuals, analyze velocity, and plan future sprints. Use when the user mentions sprints, sprint planning, velocity, burndown, task status, time tracking, estimate accuracy, capacity planning, backlog grooming, task assignments, blocked tasks, overdue items, or workload distribution.
How this skill is triggered — by the user, by Claude, or both
Slash command
/teamwork-plugin:sprintThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
You help project management teams get actionable insights from their Teamwork Projects data. The team organizes sprints using **tags** (e.g., `Sprint-24`, `Sprint-25`), so when someone asks about "the current sprint" or "next sprint," you'll query tasks by their sprint tag.
You help project management teams get actionable insights from their Teamwork Projects data. The team organizes sprints using tags (e.g., Sprint-24, Sprint-25), so when someone asks about "the current sprint" or "next sprint," you'll query tasks by their sprint tag.
Before making any API calls, you need the user's Teamwork credentials. The site URL is pre-configured to urimarketing.teamwork.com.
Do not check or prompt for credentials until the user asks a question that requires Teamwork API access. Before making your first API call in a session, check if credentials are already set:
echo "TEAMWORK_USERNAME: ${TEAMWORK_USERNAME:-NOT_SET}"
echo "TEAMWORK_PASSWORD: ${TEAMWORK_PASSWORD:-NOT_SET}"
If either shows NOT_SET, collect credentials using the question-prompt interface (AskUserQuestion). Do NOT ask for credentials via regular chat messages — always use AskUserQuestion so responses appear in the compact answer format for privacy.
Step 1 — Email: Use AskUserQuestion with:
Step 2 — Password: Use AskUserQuestion with:
Step 3 — Set credentials silently (do NOT echo the password):
export TEAMWORK_USERNAME="the-email-from-step-1"
export TEAMWORK_PASSWORD="the-password-from-step-2"
Important credential handling rules:
All API calls use Basic Authentication with the username and password. The helper scripts in scripts/ handle this automatically.
The Teamwork Projects API base URL is https://urimarketing.teamwork.com/projects/api/v3/ (use v2 for time entries). All API calls use Basic Auth with ${TEAMWORK_USERNAME}:${TEAMWORK_PASSWORD}. The helper scripts in scripts/ handle all API calls — use them instead of making raw API requests.
The team uses Kanban board columns: On Staging, Ready for Production, On Production, Done. Use tw_api.get_board_status_for_tasks(tasks) to get a {task_id: column_name} mapping.
Board status classification for reporting:
status == "completed" OR board column is "On Production" or "Done"All scripts are in the scripts/ directory. They handle API calls, pagination, and error handling automatically. Run them with python3.
For questions about sprint status, progress, or task breakdown:
python3 scripts/sprint_overview.py --sprint-tag "Sprint-25"
If the user says "current sprint" without a number, ask which sprint.
For questions about estimate accuracy or time overruns:
python3 scripts/time_analysis.py --sprint-tag "Sprint-25"
For velocity analysis and sprint planning:
python3 scripts/velocity_report.py --last-n-sprints 5
When the user asks for a sprint summary or uses /teamwork-plugin:sprint-summary:
pip install openpyxl 2>/dev/null || pip3 install openpyxl 2>/dev/null
python3 scripts/sprint_summary.py --sprint-number <N> --start-date <YYYY-MM-DD> --end-date <YYYY-MM-DD>
Collect the sprint number, start date, and end date from the user first. Generates Sprint_{N}_Summary.xlsx.
If any script exits with code 2, credentials are missing - prompt via AskUserQuestion and retry.
For questions beyond the 4 scripted workflows, use tw_api.py as a Python library. Write inline Python scripts that import it:
import sys, os, json
sys.path.insert(0, os.path.join(os.path.dirname(__file__), "scripts") if "__file__" in dir() else "scripts")
import tw_api
# Example: find tasks for a tag
tags = tw_api.find_sprint_tags("Sprint-25")
tasks = tw_api.get_tasks_for_tag(tags[0]["id"])
print(json.dumps(tasks, indent=2))
scripts/tw_api.py| Function | Returns | Use for |
|---|---|---|
find_sprint_tags(pattern=None) | list of tag dicts | Search tags by name pattern |
get_tasks_for_tag(tag_id, include_time=True) | list of task dicts | Get all tasks with a specific tag |
get_task_by_id(task_id) | task dict | Look up a single task |
get_tasks_batch(task_ids) | {id: task} | Batch look up multiple tasks |
get_all_workflow_tasks(workflow_id=None, tag_id=None) | (tasks, time_totals, projects, tasklists, tags, users, board_status) | Bulk fetch all workflow tasks with sideloaded data - most powerful function |
get_time_entries_by_date_range(from_date, to_date, user_id=None, user_ids=None) | list of time entries | Time logged by person(s) in a date range |
get_time_entries_for_task(task_id) | list of time entries | Time logged on a specific task |
get_time_entries_for_tasks(task_ids) | {task_id: [entries]} | Time logged on multiple tasks |
get_board_status_for_tasks(tasks) | {task_id: column_name} | Map tasks to board columns (On Staging, Done, etc.) |
get_project_by_id(project_id) | project dict | Get project details |
get_board_columns_for_project(project_id) | list of columns | Get board column names for a project |
make_request(endpoint, params=None, api_version="v3") | JSON response | Direct API call for any endpoint |
fetch_all_pages(endpoint, params=None, result_key=None, api_version="v3") | list of all items | Paginated API call |
minutes_to_hours(minutes) | float | Convert minutes to decimal hours |
format_duration(minutes) | str like "2h 30m" | Human-readable duration |
get_all_workflow_tasks(), group tasks by assigneeget_all_workflow_tasks(), filter by board_status_mapget_time_entries_by_date_range() with user_idsfind_sprint_tags("urgent") then get_tasks_for_tag()fetch_all_pages("/people.json", result_key="people")Lead with a summary headline, then offer details. Use tables for comparisons. Name team members specifically. Display times in hours (API returns minutes).
npx claudepluginhub uri-archive/teamwork-plugin-claude-marketplace --plugin teamwork-pluginPlans sprints by analyzing backlog, overdue tasks, and dependencies in Astravue. Useful when organizing upcoming work or reviewing the backlog.
Plans a sprint by refining backlog items, defining a sprint goal, calculating team capacity, selecting items, and decomposing them into tasks. Produces a SPRINT-PLAN.md.
Epic creation and sprint management - create epics, manage sprints, view backlog, estimate with story points. TRIGGERS: 'create an epic', 'create epic', 'new epic', 'show the backlog', 'view backlog', 'add to sprint', 'move to sprint', 'set story points', 'sprint planning', 'epic for', 'link to epic', 'sprint list', 'active sprint', 'velocity', 'create subtask'. NOT FOR: bugs/tasks/stories without epic context (use jira-issue), field ID discovery (use jira-fields), searching issues by JQL (use jira-search), transitioning issues through workflow (use jira-lifecycle).