一键导入
recap
Summarize what shipped over a date range, commit range, or release tag — synthesizes git log, GitHub PRs, and Linear issues into a single markdown brief.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
Summarize what shipped over a date range, commit range, or release tag — synthesizes git log, GitHub PRs, and Linear issues into a single markdown brief.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
Generate a single-file HTML artifact (status report, slide deck, prototype, throwaway editor, flowchart, etc.) and open it in the browser. Use when the user wants a one-off visual artifact instead of markdown — for sharing, reference, or interactive exploration.
Gather context from the codebase and (optionally) the web, then propose multiple ways to move forward with tradeoffs, relative impact, and effort. Use when user wants to explore options, weigh approaches, or asks "what are my options" / "how should I tackle this" before committing to a plan.
Propose a concrete plan to cut a branch and implement a change as one or more atomic commits, grounded in the current codebase and (optionally) outside research. Use when user wants a step-by-step implementation plan, asks "propose a plan" / "how would you implement this", or is ready to move from discussion to execution.
View a Sentry issue by short ID (e.g. PROJECT-123) or URL. Shows details, status, latest event, and tag distribution. Use when user wants to view, check, or look up a Sentry issue, error, or event.
Break a PRD into independently-grabbable GitHub issues using tracer-bullet vertical slices. Use when user wants to convert a PRD to issues, create implementation tickets, or break down a PRD into work items.
Create a PRD through user interview, codebase exploration, and module design, then submit as a GitHub issue. Use when user wants to write a PRD, create a product requirements document, or plan a new feature.
| name | recap |
| description | Summarize what shipped over a date range, commit range, or release tag — synthesizes git log, GitHub PRs, and Linear issues into a single markdown brief. |
Produce a markdown brief covering everything shipped (and the notable in‑flight work) for the given range. The output should be a usable starting point for: a weekly demo‑day review, a monthly/quarterly release blog draft, and an OOO catch‑up. One file, three audiences — the user does the final tone pass.
Interpret $ARGUMENTS:
YYYY-MM-DD..YYYY-MM-DD, or "since YYYY-MM-DD" (end = today).v1.2.3..v1.2.4; a single tag means "since that tag" (end = HEAD).<sha>..<sha> or <sha>..HEAD.Compute and remember:
START, END (absolute ISO dates, for GitHub/Linear date filters)FROM_REF, TO_REF (git refs, when available)State the resolved window in one short line before gathering data so the user can interrupt if it's wrong. Example: Recap window: 2026-04-23 → 2026-04-30 (7 days, FROM_REF=v1.4.0, TO_REF=HEAD).
Most recaps cover a single repo (the one you're standing in), but a release frequently spans multiple. Decide which repos to include:
+../sso +../other-repo or a trailing comma‑separated list — use exactly those plus the current repo.v0.7, a multi‑week date span, or a free‑text mention of related repos like "also consult ../sso"), peek at sibling directories under .. for git repos. List candidates with one line each (name · last‑commit date · remote) and ask the user which to include before gathering. For weekly/demo cadence, default to the current repo only.For each included repo, remember its label (use the directory name, e.g. reminet, sso) — these become section headers and the stats line in the output.
Issue these calls in a single message. When multiple repos are in scope, fan out — fire the per‑repo calls together rather than serially.
Git, per repo (skip a repo if it's not a git checkout):
git -C <repo-path> log --no-merges --pretty=format:'%h|%an|%ad|%s' --date=short FROM_REF..TO_REF--since=START --until=END if no refs are available.git -C <repo-path> show --no-patch --format=%B <sha>.owner/repo from git -C <repo-path> remote get-url origin.GitHub PRs, per repo (use gh CLI — works without MCP auth):
gh pr list -R <owner/repo> --state merged --search "merged:START..END" --limit 200 --json number,title,author,mergedAt,labels,url,bodygh pr list -R <owner/repo> --state closed --search "closed:START..END -is:merged" --limit 100 --json number,title,author,closedAt,urlgh pr list -R <owner/repo> --state open --search "updated:>=START" --limit 50 --json number,title,author,updatedAt,isDraft,url--limit and check whether the result is truncated. If a single repo dominates volume (e.g. 200/200 returned), the rest of the data is likely missing — bump the limit before composing.release: master → prod, Production deploy …, Deploy: …) and read their bodies. They reveal what actually reached production vs. what only merged to master — these can differ by weeks. Features behind staging‑only feature flags will show as "merged" but are not yet user‑facing.Linear (only if mcp__linear-server__* tools are available — load via ToolSearch if listed as deferred):
mcp__linear-server__list_issues filtered to issues completed/updated in [START, END]. Across teams unless one is obvious from the working directory. Pull title, identifier, state, project, and labels.If Linear isn't available, skip silently and add one line at the bottom of the file: _Linear data unavailable — recap is based on git + GitHub only._
Merge the streams so each piece of work appears once, not three times:
ENG-123, INF-45) often appear in PR titles, branch names, and commit subjects.#1083).Then discover topics — single‑title reads miss themes that span dozens of PRs. For ranges longer than a couple of weeks this matters most:
jq -r '.[] | "\(.mergedAt[0:10]) #\(.number) \(.title)"' /tmp/recap-merged.json | sort > /tmp/recap-titles.txt. Easier to grep than JSON.grep -oE '#[0-9]+ [a-zA-Z]+:' /tmp/recap-titles.txt | awk '{print $2}' | sort | uniq -c | sort -rn. Surfaces the dominant areas (fix:, server:, db:, web:, ui:).gh pr view <num> --json body for the umbrella PR, and grep the codebase (enum files, asset directories, recipe data) for names and counts. The audience wants "six new beetles: Cucumber, Bumblebee, …", not "previously gated behind CRAFTING_2".Drop pure noise from the entry list: dependabot bumps with no behavior change, lint‑only commits, typo fixes — unless that's literally all there is.
File path: recap-<start>-to-<end>.md in the current working directory. For tag inputs use recap-<tag>.md. Never overwrite an existing file — if it exists, ask the user whether to overwrite or pick a new name.
Skeleton:
# Recap: <human range>
<one‑line stats. With multiple repos, list each: "2026-04-23 → 2026-04-30 · 7 days · `reminet` 14 PRs · `sso` 6 commits · 9 Linear issues completed">
## Summary
<2–3 sentences in prose. The headline ship, the dominant area of focus, anything notable like an incident, rollback, or migration milestone. No bullets here.>
## At a glance ← include for release / quarterly / >1 month recaps; skip for weekly/demo
<TOC: bolded link per top‑level section, each followed by a one‑line keyword digest of the items inside (e.g. "Shopify points, friends/social upgrades, NYFW achievements, smart‑contract wallets"). Indented sub‑section links beneath. Functions as a secondary executive summary — a reader skims it in 15 seconds and jumps to whatever interests them.>
## Highlights
<Body — see formatting rules below. With multi-repo recaps, the secondary repo usually gets its own subsection (e.g. "### SSO platform (`sso` repo)") rather than being interleaved with the primary repo, so each repo's story reads cleanly.>
## In flight ← OOO / demo cadence
## Feature‑complete but not yet released ← release‑draft cadence (use this name when the recap is being written for a release announcement)
<Notable open PRs and in‑progress / gated work. For release drafts, group these by feature with a per‑feature status blockquote (see formatting rules).>
≤ 6 entries: flat bulleted list, no subsections.
> 6 entries: pick whichever grouping fits the content best:
Each entry uses a title bullet with a sub‑bullet for the blurb:
- **Short title**
- One‑sentence blurb explaining what changed and why it matters.
Sort within a group by impact, then recency.
Released features — drop feature‑flag names from the prose and write concrete content instead. "Six new beetles: Cucumber, Bumblebee, Blue Longicorn, Golden Tiger, Pondhawk, Death Feigning" beats "previously gated behind CRAFTING_2 flag". Counts and names are what an external reader cares about; flags are plumbing. Pull names from PR bodies, code (enum files, asset directories), or recipe data.
Unreleased / gated features — flag names are useful here, since they document the gating. Each gated feature deserves a per‑feature status blockquote rather than a single blanket warning. Different states call for different framing:
### Cheese Streak Shields
> _Status: v0 ready and gated behind `FFLAG_CHEESE_SHIELDS`. Product wants to iterate before release._
- **Streak protection**
- …
Common states: v0 ready, Product iterating, ready for internal dogfood, still in active development — see open PRs, staging only, not yet in prod. If status is unclear, ask the user before composing — guessing turns "unreleased" into "shipped" and creates rework.
For non‑user‑facing platform work (deprecations, migrations, new internal infra), use the section name Platform: Deprecation, Consolidation, Optimization with three ### sub‑buckets matching the title and individual systems as ####:
## Platform: Deprecation, Consolidation, Optimization
### Deprecation
#### MongoDB retired
…
#### Identity service retired
…
### Consolidation
#### Profile server evaporation
…
### Optimization
#### Email infrastructure
…
#### Blob storage and image processing
…
Avoid Internal: prefixes and blanket REMOVE from public post warnings. Even non‑user‑facing items often have parts (paginated lists, signed URLs, new email pipeline, observability) that read well in a "Behind the scenes" footer for a public post — let the editor decide what makes the cut.
End the file with a single italicized Editor's notes paragraph that calls out:
This gives the editor a punch list rather than a delete‑everything warning.
Neutral and concrete. No marketing adjectives ("blazing‑fast", "delightful"). The user will tone‑shift it for whichever audience they're publishing to.
For public release blog drafts: fetch the project's previous release post (e.g. via WebFetch on the prior post URL — ask the user for it) before composing. The recap voice is dense and bullet‑heavy by design; the public post is narrative. Modeling on the prior post avoids producing copy that has to be entirely rewritten.
Write the file, print the path, and end with one line: what the user should tweak before publishing — typically tightening the Summary and trimming In flight for a public post, or keeping it for an OOO brief.
CLAUDE.md context as background — don't restate it in the recap.owner/repo to query and proceed with GitHub‑only data.mergedAt dates.gate:, Deploy: enable …, or staging‑only changes are signals — confirm with the user whether the feature is part of the announce before placing it in a Headline section.