Catchup — Async-Team Return Briefing skill

Summarize and review what changed while you were away.

by oliver-kriska·MIT license·★ 560 Stars on the repo·GitHub ↗

Use now

Files of Catchup — Async-Team Return Briefing

oliver-kriska/main1 file shown
SKILL.md
Show the full text138 lines

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.

1---
2name: catchup
3description: "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."
4effort: medium
5disable-model-invocation: true
6argument-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]"
7---
8 
9# Catchup — Async-Team Return Briefing
10 
11You've been away. This skill is a **thin orchestrator**: it resolves
12the window + sources here, then delegates the I/O fan-out, impact
13analysis, and brief assembly to the `catchup-runner` agent (Sonnet) so
14your (often Opus) session does not pay for summarization. You only
15print what the agent returns.
16 
17## Usage
18 
19```
20/catchup # since you were last active
21/catchup --since "friday"
22/catchup --since "2h" --focus reviews-requested
23/catchup --since last-commit --depth deep
24/catchup --scope all # include cross-repo pings/reviews
25```
26 
27Default is **repo-scoped**: every GitHub signal (reviews requested,
28notifications, mentions) is filtered to the repo you ran it in. Pass
29`--scope all` to also include cross-repo activity, which is then listed
30in its own separate section — never mixed into this repo's lists.
31 
32## Iron Laws
33 
341. **Delegate the heavy work** — spawn `catchup-runner` (sonnet) for
35 fan-out + assembly. Do NOT run the `gh`/`git` fan-out in this
36 session; that defeats the cost/speed purpose.
372. **Resolve the window here, once** — the agent must never re-resolve
38 it. Pass absolute `SINCE_*` values.
393. **MCP runs here, not in the agent** — Linear/Calendar MCP tools are
40 unreliable in subagents. If present, fetch in this context and pass
41 the text to the agent; else mark absent.
424. **Validate `--since` before any shell** — match the grammar; on no
43 match fall back to 24h and note the assumption.
445. **Stop after the brief** — print the agent's summary, never
45 auto-transition to another command.
466. **Repo-scoped by default** — pass `SCOPE=repo` unless the user
47 passed `--scope all`. A brief run inside one repo must not leak
48 another repo's reviews/notifications. Cross-repo is opt-in only.
49 
50## Workflow
51 
52### 1. Parse arguments
53 
54From `$ARGUMENTS`: `--since`, `--scope`, `--sources`, `--depth`,
55`--focus`. Defaults: `--since last-active`, **`--scope repo`**, all
56detected sources, `--depth standard`, no focus. `--scope` accepts
57`repo` (default — every GitHub signal filtered to the current repo) or
58`all` (cross-repo allowed, listed in its own section).
59 
60### 2. Resolve the time window (here, in this context)
61 
62Read `${CLAUDE_SKILL_DIR}/references/time-window.md`. Resolve calendar
63words (`friday`, `yesterday`, a date) in the **user's local timezone**
64(this machine = the user's TZ), pivot through `SINCE_EPOCH`, derive
65`SINCE_ISO` (UTC) + `SINCE_LABEL` (with TZ abbrev) + `LOCAL_TZ`.
66 
67Default `last-active` = MAX of: newest Claude session mtime for this
68repo, your last own commit (`git log --author=<you> -1 --format=%ct`),
69your last own PR **in this repo** (`gh pr list --repo <repo> --author
70@me --state all`, repo-scoped — a global search would anchor to other
71repos). The latest footprint is "you were last here". Record which
72signal won. Variants: `last-session` (sessions only),
73`last-commit`/`last-mine` (your git/PR only). No signal → 24h, noted.
74 
75### 3. Detect sources + pull MCP data (here)
76 
77```
78gh: command -v gh && gh auth status → github ON
79git: git rev-parse --is-inside-work-tree → git ON
80linear/calendar: a Linear / Google-Calendar MCP tool present?
81```
82 
83If Linear/Calendar MCP is present, query it **in this context now**
84(assigned/updated tickets since `SINCE_ISO`; missed + today's
85meetings in `LOCAL_TZ`) and keep the short text as `LINEAR_DATA` /
86`CALENDAR_DATA`. If absent, set them to `absent` (the agent will
87proxy-harvest `XXX-####` refs for Linear; skip calendar with a note).
88 
89### 4. Delegate to `catchup-runner` (Sonnet)
90 
91Spawn one agent, foreground, passing a self-contained prompt:
92 
93```
94Agent(subagent_type: "catchup-runner", prompt: """
95SINCE_EPOCH={…} SINCE_ISO={…Z} SINCE_LABEL="{… local TZ}"
96LOCAL_TZ={…} SOURCES={github,git} SCOPE={repo|all} DEPTH={…} FOCUS={…}
97OUT_PATH={cwd}/.claude/catchup/brief-{YYYY-MM-DD}.md # local date (date +%F), not UTC
98LINEAR_DATA={text or "absent"}
99CALENDAR_DATA={text or "absent"}
100Window anchor signal: {which one won, for the Risks note}
101Do the gh+git fan-out, impact analysis, and brief assembly per your
102instructions. Write the file. Return ONLY the inline summary.
103""")
104```
105 
106The agent inlines all recipes (it cannot read this plugin's
107references). Do not re-implement its work here.
108 
109### 5. Present + stop
110 
111Print the agent's returned summary verbatim and the brief path.
112 
113**If the agent returned no summary** (e.g. it hit its turn budget
114mid-assembly — the brief file is usually already written): do NOT
115re-summarize the brief yourself; that pulls the expensive step back
116into this (often Opus) session, defeating the delegation. Instead
117`SendMessage` the agent by the `agentId` from its stop usage:
118*"Return only the inline summary now."* — it finishes cheaply in
119Sonnet. Only if that also fails, read the brief's Intent + Top
120priorities section (not the whole file) and print that.
121 
122**Do NOT** auto-invoke any other command. The user decides what's
123first.
124 
125## Sources at MVP
126 
127GitHub (`gh`), Git (`git`), Linear MCP (optional), Google Calendar MCP
128(optional). Slack/Gmail are **v2 opt-in** — never queried, never piped
129raw. Scheduling + per-project config are designed in
130`${CLAUDE_SKILL_DIR}/references/config-schema.md`, not built at MVP.
131 
132## Graceful degradation contract
133 
134A missing source degrades the brief, never breaks it. `git log` alone
135(always available in a repo) is a valid minimum brief. Every absent or
136failed source becomes one honest line under the brief's
137Risks/assumptions block, so the reader knows what it does *not* cover.
138 

Discussion

Alternatives