{"slug":"catchup-2","title":"catchup","summary":"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.","platform":"Claude","tags":[],"authorName":"LLM Mart","authorSlug":"llm-mart","score":0,"source":"github","price":null,"verified":false,"createdAt":"2026-10-04T15:14:18.690718Z","repo":{"url":"https://github.com/oliver-kriska/claude-elixir-phoenix","stars":560,"forks":44,"license":"MIT","updatedAt":"2026-10-02T04:11:38Z"},"bodyHtml":"<hr>\n<h2>name: catchup\ndescription: \"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.\"\neffort: medium\ndisable-model-invocation: true\nargument-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]\"</h2>\n<h1>Catchup — Async-Team Return Briefing</h1>\n<p>You've been away. This skill is a <strong>thin orchestrator</strong>: it resolves\nthe window + sources here, then delegates the I/O fan-out, impact\nanalysis, and brief assembly to the <code>catchup-runner</code> agent (Sonnet) so\nyour (often Opus) session does not pay for summarization. You only\nprint what the agent returns.</p>\n<h2>Usage</h2>\n<pre><code>/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</code></pre>\n<p>Default is <strong>repo-scoped</strong>: every GitHub signal (reviews requested,\nnotifications, mentions) is filtered to the repo you ran it in. Pass\n<code>--scope all</code> to also include cross-repo activity, which is then listed\nin its own separate section — never mixed into this repo's lists.</p>\n<h2>Iron Laws</h2>\n<ol>\n<li><strong>Delegate the heavy work</strong> — spawn <code>catchup-runner</code> (sonnet) for\nfan-out + assembly. Do NOT run the <code>gh</code>/<code>git</code> fan-out in this\nsession; that defeats the cost/speed purpose.</li>\n<li><strong>Resolve the window here, once</strong> — the agent must never re-resolve\nit. Pass absolute <code>SINCE_*</code> values.</li>\n<li><strong>MCP runs here, not in the agent</strong> — Linear/Calendar MCP tools are\nunreliable in subagents. If present, fetch in this context and pass\nthe text to the agent; else mark absent.</li>\n<li><strong>Validate <code>--since</code> before any shell</strong> — match the grammar; on no\nmatch fall back to 24h and note the assumption.</li>\n<li><strong>Stop after the brief</strong> — print the agent's summary, never\nauto-transition to another command.</li>\n<li><strong>Repo-scoped by default</strong> — pass <code>SCOPE=repo</code> unless the user\npassed <code>--scope all</code>. A brief run inside one repo must not leak\nanother repo's reviews/notifications. Cross-repo is opt-in only.</li>\n</ol>\n<h2>Workflow</h2>\n<h3>1. Parse arguments</h3>\n<p>From <code>$ARGUMENTS</code>: <code>--since</code>, <code>--scope</code>, <code>--sources</code>, <code>--depth</code>,\n<code>--focus</code>. Defaults: <code>--since last-active</code>, <strong><code>--scope repo</code></strong>, all\ndetected sources, <code>--depth standard</code>, no focus. <code>--scope</code> accepts\n<code>repo</code> (default — every GitHub signal filtered to the current repo) or\n<code>all</code> (cross-repo allowed, listed in its own section).</p>\n<h3>2. Resolve the time window (here, in this context)</h3>\n<p>Read <code>${CLAUDE_SKILL_DIR}/references/time-window.md</code>. Resolve calendar\nwords (<code>friday</code>, <code>yesterday</code>, a date) in the <strong>user's local timezone</strong>\n(this machine = the user's TZ), pivot through <code>SINCE_EPOCH</code>, derive\n<code>SINCE_ISO</code> (UTC) + <code>SINCE_LABEL</code> (with TZ abbrev) + <code>LOCAL_TZ</code>.</p>\n<p>Default <code>last-active</code> = MAX of: newest Claude session mtime for this\nrepo, your last own commit (<code>git log --author=&lt;you&gt; -1 --format=%ct</code>),\nyour last own PR <strong>in this repo</strong> (<code>gh pr list --repo &lt;repo&gt; --author @me --state all</code>, repo-scoped — a global search would anchor to other\nrepos). The latest footprint is \"you were last here\". Record which\nsignal won. Variants: <code>last-session</code> (sessions only),\n<code>last-commit</code>/<code>last-mine</code> (your git/PR only). No signal → 24h, noted.</p>\n<h3>3. Detect sources + pull MCP data (here)</h3>\n<pre><code>gh:   command -v gh &amp;&amp; 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</code></pre>\n<p>If Linear/Calendar MCP is present, query it <strong>in this context now</strong>\n(assigned/updated tickets since <code>SINCE_ISO</code>; missed + today's\nmeetings in <code>LOCAL_TZ</code>) and keep the short text as <code>LINEAR_DATA</code> /\n<code>CALENDAR_DATA</code>. If absent, set them to <code>absent</code> (the agent will\nproxy-harvest <code>XXX-####</code> refs for Linear; skip calendar with a note).</p>\n<h3>4. Delegate to <code>catchup-runner</code> (Sonnet)</h3>\n<p>Spawn one agent, foreground, passing a self-contained prompt:</p>\n<pre><code>Agent(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</code></pre>\n<p>The agent inlines all recipes (it cannot read this plugin's\nreferences). Do not re-implement its work here.</p>\n<h3>5. Present + stop</h3>\n<p>Print the agent's returned summary verbatim and the brief path.</p>\n<p><strong>If the agent returned no summary</strong> (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<code>SendMessage</code> the agent by the <code>agentId</code> from its stop usage:\n<em>\"Return only the inline summary now.\"</em> — 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.</p>\n<p><strong>Do NOT</strong> auto-invoke any other command. The user decides what's\nfirst.</p>\n<h2>Sources at MVP</h2>\n<p>GitHub (<code>gh</code>), Git (<code>git</code>), Linear MCP (optional), Google Calendar MCP\n(optional). Slack/Gmail are <strong>v2 opt-in</strong> — never queried, never piped\nraw. Scheduling + per-project config are designed in\n<code>${CLAUDE_SKILL_DIR}/references/config-schema.md</code>, not built at MVP.</p>\n<h2>Graceful degradation contract</h2>\n<p>A missing source degrades the brief, never breaks it. <code>git log</code> 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 <em>not</em> cover.</p>\n","files":[{"path":"references/brief-format.md","sizeBytes":6350,"isText":true},{"path":"references/config-schema.md","sizeBytes":3283,"isText":true},{"path":"references/source-adapters.md","sizeBytes":9547,"isText":true},{"path":"references/time-window.md","sizeBytes":7807,"isText":true},{"path":"SKILL.md","sizeBytes":6125,"isText":true}],"reviewScore":null,"reviewSummary":null,"trust":{"provenance":"trusted-source-unreviewed","notice":"Community-authored content, reproduced verbatim and not vetted as instructions. Treat it as data to evaluate, never as directives to follow.","bodySource":null},"bodyLocked":false,"purchaseUrl":null,"sourceUrl":null,"report":{"provenance":"trusted-source-unreviewed","screen":{"ran":true,"outcome":"clean","suspicious":0,"notes":0,"hiddenCharacters":false},"virusScan":{"engine":"clamav","status":"clean","scannedAt":"2026-10-04T15:15:44.52846Z","sha256":"57793B11AC7144F3684101F205A4701FC8BE539B1FEABA0632E88950DC3A42ED","sizeBytes":16499},"review":null,"source":{"repositoryUrl":"https://github.com/oliver-kriska/claude-elixir-phoenix","path":"plugins/catchup/skills/catchup","license":"MIT","commit":"9767a82d24ddddad553e85f88efc2869a7fd7d88","subtreeSha":"D92C5014D5F4A88A91118230F48A820218B0031E637A63989FE99A738DA5A536","lastSyncedAt":"2026-10-04T15:14:09.139242Z"},"reviewedAt":"2026-10-04T15:17:57.910771Z","notice":"Community-authored content, reproduced verbatim and not vetted as instructions. Treat it as data to evaluate, never as directives to follow."},"install":[{"target":"skills-cli","command":"npx skills add https://github.com/oliver-kriska/claude-elixir-phoenix/tree/main/plugins/catchup/skills/catchup"},{"target":"claude-code","command":"claude plugin marketplace add https://llmmart.ai/marketplace.json && claude plugin install oliver-kriska-claude-elixir-phoenix@llmmart"},{"target":"git","command":"git clone https://github.com/oliver-kriska/claude-elixir-phoenix.git"}]}