Tandemu installs five skills into Claude Code. They’re available in every repo after running the installer.
/morning
Start your work session.
Fetches tasks assigned to you from the connected ticket system (Jira, Linear, ClickUp, or GitHub Issues) via the Tandemu API. If none are assigned, falls back to showing unassigned backlog tasks you could pick up.
/morningWhat it does:
- Checks for an active task — if one exists, offers to continue it in the current repo
- Calls
GET /api/tasks?teamId=<your-team>&mine=truefor your assigned tasks - If empty, calls
GET /api/tasks?teamId=<your-team>&status=todo&unassigned=true - Presents tasks sorted by priority (urgent → high → medium → low)
- You pick a task using the selector
- Creates a feature branch:
feat/<task-id>-<description> - Updates the task status to “In Progress” on the ticket system
- Writes
~/.claude/tandemu-active-task.jsonto track the active task - Searches the codebase for related files and summarizes the task
Only one task can be active at a time. To switch, run /pause first.
/pause
Pause the current task.
Snapshots progress, sends partial telemetry, sets the task back to backlog on the ticket system, and clears the active task so you can pick a new one.
/pauseWhat it does:
- Reads the active task from
~/.claude/tandemu-active-task.json - Calculates elapsed time and gathers git stats across all tracked repos
- Sends a partial session span to the OTEL collector
- Fetches available statuses from the ticket system and sets the task back to a backlog/todo state
- Clears the active task file
/finish
Wrap up the current task.
Measures work done, sends telemetry, syncs status to the ticket system, and helps you commit and create a PR.
/finishWhat it does:
- Checks
git statusfor uncommitted changes - If changes exist, asks: Commit now / Stash / Leave as-is
- If committing, generates a conventional commit message from the diff
- Asks: Is this task done or coming back later?
- If done and no PR exists, offers to create one
- Measures work across all tracked repos:
- Cycle time (start to finish)
- Lines changed (additions/deletions)
- AI vs manual attribution (commits with
Co-Authored-By: Claude= AI lines) - Commit count
- Sends telemetry — a
task_sessionspan andtandemu.lines_of_codemetrics to the OTEL collector - Updates task status — fetches available statuses from the ticket system and sets it to “Done” / “Completed”
- Shows the updated task list
/standup
Generate a team standup report.
Pulls data from both the Tandemu API (telemetry) and the connected ticket system to produce a team-level report.
/standup
/standup --team "Frontend"
/standup --format slackThe report includes:
- Summary — tasks in progress, recently completed, active sessions, AI ratio
- Per-person updates — matched by email between Tandemu team members and ticket assignees
- Other contributors — tasks assigned to people not on the Tandemu team
- Backlog — top 10 unstarted tasks with count of remaining
- Blockers — stale reviews, high-friction files
Tasks are categorized by recency (completed this week), not by sprint boundaries.
/blockers
Show team friction and blockers.
Combines friction telemetry (prompt loops, errors) with stale tasks from the ticket system.
/blockers
/blockers --days 14
/blockers --team "Backend"The report includes:
- Critical friction — files with 5+ prompt loops or 3+ errors, with suggestions
- Stale/blocked tasks — tasks stuck in review or in progress too long
- DORA health — deployment frequency, lead time
- Recommended actions — prioritized list of what to fix first
For high-friction files, Claude reads the actual source code to give concrete suggestions.
How Skills Get Data
All skills read ~/.claude/tandemu.json for authentication and API URL. They call the Tandemu backend, which:
- Proxies to your connected ticket system for task data (always live, never cached)
- Queries ClickHouse for telemetry data (session time, AI ratio, friction)
- Returns unified responses regardless of which ticket system is behind it
How Status Sync Works
When /morning, /finish, or /pause needs to update a task’s status, it:
- Calls
GET /api/tasks/<taskId>/statuses?provider=<provider>to fetch the available statuses from the ticket system - Claude picks the best match (e.g., “In Progress” for starting, “Done” for finishing)
- Calls
PATCH /api/tasks/<taskId>/statuswith the exact status name
This works with any custom workflow — Linear, Jira, ClickUp, or GitHub. No hardcoded status mappings.