catchup

$npx mdskill add oliver-kriska/claude-elixir-phoenix/catchup

Summarize and review changes while away for quick repo updates

  • Solves the task of summarizing missed PRs, git commits, Linear tickets, and meetings after being away.
  • Depends on Read, Grep, Glob, Bash, Write, WebFetch, Agent tools to fetch and process data from GitHub, Git, Linear, and Calendar.
  • Decides what to include based on the specified window (since), scope (repo or all), and sources (github, git, linear, calendar).
  • Delivers a brief summary of changes via the catchup-runner agent (Sonnet) for quick review by the user.

SKILL.md

.github/skills/catchupView on GitHub ↗
---
name: catchup
description: "Summarize and review what changed while you were away. Use after a weekend, vacation, or flight to check missed PRs, git commits, Linear tickets, and meetings — one prioritized brief, not a firehose."
effort: medium
disable-model-invocation: true
argument-hint: "[--since \"friday\"|\"2h\"|\"last-active\"|\"last-commit\"] [--scope repo|all] [--sources github,git,linear,calendar] [--depth quick|standard|deep] [--focus prs,reviews-requested,mentions,impact]"
allowed-tools: Read, Grep, Glob, Bash, Write, WebFetch, Agent
---

# Catchup — Async-Team Return Briefing

You've been away. This skill is a **thin orchestrator**: it resolves
the window + sources here, then delegates the I/O fan-out, impact
analysis, and brief assembly to the `catchup-runner` agent (Sonnet) so
your (often Opus) session does not pay for summarization. You only
print what the agent returns.

## Usage

```
/catchup                                  # since you were last active
/catchup --since "friday"
/catchup --since "2h" --focus reviews-requested
/catchup --since last-commit --depth deep
/catchup --scope all                      # include cross-repo pings/reviews
```

Default is **repo-scoped**: every GitHub signal (reviews requested,
notifications, mentions) is filtered to the repo you ran it in. Pass
`--scope all` to also include cross-repo activity, which is then listed
in its own separate section — never mixed into this repo's lists.

## Iron Laws

1. **Delegate the heavy work** — spawn `catchup-runner` (sonnet) for
   fan-out + assembly. Do NOT run the `gh`/`git` fan-out in this
   session; that defeats the cost/speed purpose.
2. **Resolve the window here, once** — the agent must never re-resolve
   it. Pass absolute `SINCE_*` values.
3. **MCP runs here, not in the agent** — Linear/Calendar MCP tools are
   unreliable in subagents. If present, fetch in this context and pass
   the text to the agent; else mark absent.
4. **Validate `--since` before any shell** — match the grammar; on no
   match fall back to 24h and note the assumption.
5. **Stop after the brief** — print the agent's summary, never
   auto-transition to another command.
6. **Repo-scoped by default** — pass `SCOPE=repo` unless the user
   passed `--scope all`. A brief run inside one repo must not leak
   another repo's reviews/notifications. Cross-repo is opt-in only.

## Workflow

### 1. Parse arguments

From `$ARGUMENTS`: `--since`, `--scope`, `--sources`, `--depth`,
`--focus`. Defaults: `--since last-active`, **`--scope repo`**, all
detected sources, `--depth standard`, no focus. `--scope` accepts
`repo` (default — every GitHub signal filtered to the current repo) or
`all` (cross-repo allowed, listed in its own section).

### 2. Resolve the time window (here, in this context)

Read `${CLAUDE_SKILL_DIR}/references/time-window.md`. Resolve calendar
words (`friday`, `yesterday`, a date) in the **user's local timezone**
(this machine = the user's TZ), pivot through `SINCE_EPOCH`, derive
`SINCE_ISO` (UTC) + `SINCE_LABEL` (with TZ abbrev) + `LOCAL_TZ`.

Default `last-active` = MAX of: newest Claude session mtime for this
repo, your last own commit (`git log --author=<you> -1 --format=%ct`),
your last own PR **in this repo** (`gh pr list --repo <repo> --author
@me --state all`, repo-scoped — a global search would anchor to other
repos). The latest footprint is "you were last here". Record which
signal won. Variants: `last-session` (sessions only),
`last-commit`/`last-mine` (your git/PR only). No signal → 24h, noted.

### 3. Detect sources + pull MCP data (here)

```
gh:   command -v gh && gh auth status               → github ON
git:  git rev-parse --is-inside-work-tree           → git ON
linear/calendar: a Linear / Google-Calendar MCP tool present?
```

If Linear/Calendar MCP is present, query it **in this context now**
(assigned/updated tickets since `SINCE_ISO`; missed + today's
meetings in `LOCAL_TZ`) and keep the short text as `LINEAR_DATA` /
`CALENDAR_DATA`. If absent, set them to `absent` (the agent will
proxy-harvest `XXX-####` refs for Linear; skip calendar with a note).

### 4. Delegate to `catchup-runner` (Sonnet)

Spawn one agent, foreground, passing a self-contained prompt:

```
Agent(subagent_type: "catchup-runner", prompt: """
SINCE_EPOCH={…}  SINCE_ISO={…Z}  SINCE_LABEL="{… local TZ}"
LOCAL_TZ={…}  SOURCES={github,git}  SCOPE={repo|all}  DEPTH={…}  FOCUS={…}
OUT_PATH={cwd}/.claude/catchup/brief-{YYYY-MM-DD}.md   # local date (date +%F), not UTC
LINEAR_DATA={text or "absent"}
CALENDAR_DATA={text or "absent"}
Window anchor signal: {which one won, for the Risks note}
Do the gh+git fan-out, impact analysis, and brief assembly per your
instructions. Write the file. Return ONLY the inline summary.
""")
```

The agent inlines all recipes (it cannot read this plugin's
references). Do not re-implement its work here.

### 5. Present + stop

Print the agent's returned summary verbatim and the brief path.

**If the agent returned no summary** (e.g. it hit its turn budget
mid-assembly — the brief file is usually already written): do NOT
re-summarize the brief yourself; that pulls the expensive step back
into this (often Opus) session, defeating the delegation. Instead
`SendMessage` the agent by the `agentId` from its stop usage:
*"Return only the inline summary now."* — it finishes cheaply in
Sonnet. Only if that also fails, read the brief's Intent + Top
priorities section (not the whole file) and print that.

**Do NOT** auto-invoke any other command. The user decides what's
first.

## Sources at MVP

GitHub (`gh`), Git (`git`), Linear MCP (optional), Google Calendar MCP
(optional). Slack/Gmail are **v2 opt-in** — never queried, never piped
raw. Scheduling + per-project config are designed in
`${CLAUDE_SKILL_DIR}/references/config-schema.md`, not built at MVP.

## Graceful degradation contract

A missing source degrades the brief, never breaks it. `git log` alone
(always available in a repo) is a valid minimum brief. Every absent or
failed source becomes one honest line under the brief's
Risks/assumptions block, so the reader knows what it does *not* cover.

More from oliver-kriska/claude-elixir-phoenix

SkillDescription
ash-frameworkAsh Framework — resources, actions, policies, aggregates, calculations, AshPhoenix.Form, LiveView, migrations. Use when generating resources via mix ash.codegen, editing changes, checks, types, validations, or domain code interfaces.
cc-changelog|
codex-abRun an A/B codex review experiment — holistic codex review vs 3 focused dimension passes (security, ecto, liveview) on the branch diff, classify findings, report a panel-value verdict. Use when the branch is fresh, before any codex review runs.
compound-docsSearchable Elixir/Phoenix/Ecto solution documentation system with YAML frontmatter. Builds institutional knowledge from solved problems. Use when consulting past solutions before investigating new issues.
docs-check|
ecto-n1-checkDetect N+1 query anti-patterns specifically — Repo calls inside Enum/for
ecto-patternsEcto patterns — schemas, changesets, queries, migrations, Multi, associations, preloads, upserts. Use when editing Repo calls, Ecto.Query, or schema fields. Skip for Ash.
ecto:constraint-debugDebug Ecto constraint violations - trace triggers, check migrations, find duplicate data. Use when seeing unique_constraint, foreign_key_constraint, or check_constraint errors.
ecto:n1-checkDetect N+1 query anti-patterns specifically — Repo calls inside Enum/for loops, missing preloads on associations. Use when N+1 is explicitly suspected, NOT for unrelated Ecto questions or wider database performance.
elixir-idiomsOTP/BEAM patterns and Elixir idioms — GenServer, Supervisor, Task, Registry, pattern matching, with chains, pipes. Use when designing processes or debugging BEAM issues.