Skip to Content

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.

/morning

What it does:

  1. Checks for an active task — if one exists, offers to continue it in the current repo
  2. Calls GET /api/tasks?teamId=<your-team>&mine=true for your assigned tasks
  3. If empty, calls GET /api/tasks?teamId=<your-team>&status=todo&unassigned=true
  4. Presents tasks sorted by priority (urgent → high → medium → low)
  5. You pick a task using the selector
  6. Creates a feature branch: feat/<task-id>-<description>
  7. Updates the task status to “In Progress” on the ticket system
  8. Writes ~/.claude/tandemu-active-task.json to track the active task
  9. 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.

/pause

What it does:

  1. Reads the active task from ~/.claude/tandemu-active-task.json
  2. Calculates elapsed time and gathers git stats across all tracked repos
  3. Sends a partial session span to the OTEL collector
  4. Fetches available statuses from the ticket system and sets the task back to a backlog/todo state
  5. 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.

/finish

What it does:

  1. Checks git status for uncommitted changes
  2. If changes exist, asks: Commit now / Stash / Leave as-is
  3. If committing, generates a conventional commit message from the diff
  4. Asks: Is this task done or coming back later?
  5. If done and no PR exists, offers to create one
  6. 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
  7. Sends telemetry — a task_session span and tandemu.lines_of_code metrics to the OTEL collector
  8. Updates task status — fetches available statuses from the ticket system and sets it to “Done” / “Completed”
  9. 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 slack

The 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:

  1. Calls GET /api/tasks/<taskId>/statuses?provider=<provider> to fetch the available statuses from the ticket system
  2. Claude picks the best match (e.g., “In Progress” for starting, “Done” for finishing)
  3. Calls PATCH /api/tasks/<taskId>/status with the exact status name

This works with any custom workflow — Linear, Jira, ClickUp, or GitHub. No hardcoded status mappings.

Last updated on