{"id":"catchup","name":"catchup","summary":"あなたが不在の間に何が変わったのかを要約し、振り返ってください。週末や休暇、フライトの後に、見逃したPR、gitコミット、リニアチケット、ミーティングの確認に使うべきです。","body":"# Catchup — Async-Team Return Briefing\n\nYou've been away. This skill is a **thin orchestrator**: it resolves\nthe window + sources here, then delegates the I/O fan-out, impact\nanalysis, and brief assembly to the `catchup-runner` agent (Sonnet) so\nyour (often Opus) session does not pay for summarization. You only\nprint what the agent returns.\n\n## Usage\n\n```\n/catchup                                  # since you were last active\n/catchup --since \"friday\"\n/catchup --since \"2h\" --focus reviews-requested\n/catchup --since last-commit --depth deep\n/catchup --scope all                      # include cross-repo pings/reviews\n```\n\nDefault is **repo-scoped**: every GitHub signal (reviews requested,\nnotifications, mentions) is filtered to the repo you ran it in. Pass\n`--scope all` to also include cross-repo activity, which is then listed\nin its own separate section — never mixed into this repo's lists.\n\n## Iron Laws\n\n1. **Delegate the heavy work** — spawn `catchup-runner` (sonnet) for\n   fan-out + assembly. Do NOT run the `gh`/`git` fan-out in this\n   session; that defeats the cost/speed purpose.\n2. **Resolve the window here, once** — the agent must never re-resolve\n   it. Pass absolute `SINCE_*` values.\n3. **MCP runs here, not in the agent** — Linear/Calendar MCP tools are\n   unreliable in subagents. If present, fetch in this context and pass\n   the text to the agent; else mark absent.\n4. **Validate `--since` before any shell** — match the grammar; on no\n   match fall back to 24h and note the assumption.\n5. **Stop after the brief** — print the agent's summary, never\n   auto-transition to another command.\n6. **Repo-scoped by default** — pass `SCOPE=repo` unless the user\n   passed `--scope all`. A brief run inside one repo must not leak\n   another repo's reviews/notifications. Cross-repo is opt-in only.\n\n## Workflow\n\n### 1. Parse arguments\n\nFrom `$ARGUMENTS`: `--since`, `--scope`, `--sources`, `--depth`,\n`--focus`. Defaults: `--since last-active`, **`--scope repo`**, all\ndetected sources, `--depth standard`, no focus. `--scope` accepts\n`repo` (default — every GitHub signal filtered to the current repo) or\n`all` (cross-repo allowed, listed in its own section).\n\n### 2. Resolve the time window (here, in this context)\n\nRead `${CLAUDE_SKILL_DIR}/references/time-window.md`. Resolve calendar\nwords (`friday`, `yesterday`, a date) in the **user's local timezone**\n(this machine = the user's TZ), pivot through `SINCE_EPOCH`, derive\n`SINCE_ISO` (UTC) + `SINCE_LABEL` (with TZ abbrev) + `LOCAL_TZ`.\n\nDefault `last-active` = MAX of: newest Claude session mtime for this\nrepo, your last own commit (`git log --author=<you> -1 --format=%ct`),\nyour last own PR **in this repo** (`gh pr list --repo <repo> --author\n@me --state all`, repo-scoped — a global search would anchor to other\nrepos). The latest footprint is \"you were last here\". Record which\nsignal won. Variants: `last-session` (sessions only),\n`last-commit`/`last-mine` (your git/PR only). No signal → 24h, noted.\n\n### 3. Detect sources + pull MCP data (here)\n\n```\ngh:   command -v gh && gh auth status               → github ON\ngit:  git rev-parse --is-inside-work-tree           → git ON\nlinear/calendar: a Linear / Google-Calendar MCP tool present?\n```\n\nIf Linear/Calendar MCP is present, query it **in this context now**\n(assigned/updated tickets since `SINCE_ISO`; missed + today's\nmeetings in `LOCAL_TZ`) and keep the short text as `LINEAR_DATA` /\n`CALENDAR_DATA`. If absent, set them to `absent` (the agent will\nproxy-harvest `XXX-####` refs for Linear; skip calendar with a note).\n\n### 4. Delegate to `catchup-runner` (Sonnet)\n\nSpawn one agent, foreground, passing a self-contained prompt:\n\n```\nAgent(subagent_type: \"catchup-runner\", prompt: \"\"\"\nSINCE_EPOCH={…}  SINCE_ISO={…Z}  SINCE_LABEL=\"{… local TZ}\"\nLOCAL_TZ={…}  SOURCES={github,git}  SCOPE={repo|all}  DEPTH={…}  FOCUS={…}\nOUT_PATH={cwd}/.claude/catchup/brief-{YYYY-MM-DD}.md   # local date (date +%F), not UTC\nLINEAR_DATA={text or \"absent\"}\nCALENDAR_DATA={text or \"absent\"}\nWindow anchor signal: {which one won, for the Risks note}\nDo the gh+git fan-out, impact analysis, and brief assembly per your\ninstructions. Write the file. Return ONLY the inline summary.\n\"\"\")\n```\n\nThe agent inlines all recipes (it cannot read this plugin's\nreferences). Do not re-implement its work here.\n\n### 5. Present + stop\n\nPrint the agent's returned summary verbatim and the brief path.\n\n**If the agent returned no summary** (e.g. it hit its turn budget\nmid-assembly — the brief file is usually already written): do NOT\nre-summarize the brief yourself; that pulls the expensive step back\ninto this (often Opus) session, defeating the delegation. Instead\n`SendMessage` the agent by the `agentId` from its stop usage:\n*\"Return only the inline summary now.\"* — it finishes cheaply in\nSonnet. Only if that also fails, read the brief's Intent + Top\npriorities section (not the whole file) and print that.\n\n**Do NOT** auto-invoke any other command. The user decides what's\nfirst.\n\n## Sources at MVP\n\nGitHub (`gh`), Git (`git`), Linear MCP (optional), Google Calendar MCP\n(optional). Slack/Gmail are **v2 opt-in** — never queried, never piped\nraw. Scheduling + per-project config are designed in\n`${CLAUDE_SKILL_DIR}/references/config-schema.md`, not built at MVP.\n\n## Graceful degradation contract\n\nA missing source degrades the brief, never breaks it. `git log` alone\n(always available in a repo) is a valid minimum brief. Every absent or\nfailed source becomes one honest line under the brief's\nRisks/assumptions block, so the reader knows what it does *not* cover.","author":"@oliver-kriska","ownerProfile":null,"authorContacts":null,"sourceUrl":"https://github.com/oliver-kriska/claude-elixir-phoenix/tree/main/plugins/catchup/skills/catchup","license":"MIT","category":"review","lang":"en","tokens":1499,"stars":0,"calls30d":2,"claimed":false,"visibility":"public","origin":"crawler","version":"0.1.0","createdAt":"2026-08-22","updatedAt":"2026-08-22","files":[{"path":"references/brief-format.md","size":6350,"sha256":"17e91982f1621734788665443424a644feaa084e9ac9a8c39b3b46dd05a4c9b7"},{"path":"references/config-schema.md","size":3283,"sha256":"60399699559e75085a3ce340bc47bfa67278582eb4779a3bbac5aeb3c4df6783"},{"path":"references/source-adapters.md","size":9547,"sha256":"b1b8a41b6732956d43dd3da7f07201eab63918c27f0aebfc5594206cd25dff98"},{"path":"references/time-window.md","size":7807,"sha256":"0e79aeea0be9dcc00996748130bc75aa93e84c0426629957d3fa14b83d331296"}],"requires":{"mcp":[],"tools":["Read","Grep","Glob","Bash","Write","WebFetch","Agent"]},"safety":{"flags":[],"scannedAt":"2026-08-22","hasScripts":false,"networkEndpoints":[]}}