replay ยท diff

git:20260531.9623906 to git:20260828.f3eda3b

4 added, 0 removed. Audit A to A.

---
name: replay
description: Find, analyze, and share AI coding sessions with vibe-replay. Use when the user asks for a replay, wants to find a past session, run a session retro, share Cursor/Claude/Codex session context, or attach session context to a PR.
allowed-tools: Bash(npx *) Bash(grep *) Bash(ls *) Bash(cat *) Bash(cp *) Bash(gh *)
argument-hint: [session-path-or-search-query]
---
# Session Replay and Search
This skill helps agents find local AI coding sessions, generate shareable replay artifacts, and paste polished session context into PRs. It uses [vibe-replay](https://github.com/tuo-lei/vibe-replay) for the raw session discovery, parsing, redaction, analytics, and export work, then uses agent judgment for review, cleanup, and sharing decisions.
## What this skill is for
Use this skill when the user asks to:
- Generate a replay or GitHub-ready summary of an AI coding session.
- Attach Claude Code, Cursor, or Codex session context to a PR.
- Find a previous session, transcript, replay, branch discussion, bug investigation, PR, or design thread.
- Remember what happened in a past agent conversation.
- Run a retro on prompt quality, tool usage, errors, compactions, cost, or agent efficiency.
- Compare sessions or choose which session should be replayed/shared.
Plain text summaries of an AI session - stats, tool breakdown, per-prompt details - are hard for an agent to write from scratch. Delegate that to `vibe-replay`, then use agent reasoning to handle the things a CLI cannot decide well:
- **Ranking session search results** - choosing the likely match from metadata and brief scan signals.
- **Reviewing flagged credentials** - deciding whether a regex hit is a real secret or a false positive.
- **Translating** session prompts that are not in the audience's language.
- **Softening tone** in prompts written when the user was frustrated.
- **Appending to PRs safely** - preserving existing PR descriptions instead of overwriting them.
Each cleanup step is opt-in. Ask the user before rewriting their content.
## Step 1 - Choose the session
Prefer structured discovery over manually browsing local history.
### If the user provides a session path
Use the provided path. Infer the provider when possible:
- Cursor transcripts usually live under `~/.cursor/projects/.../agent-transcripts/...`.
- Claude Code transcripts usually live under `~/.claude/projects/.../*.jsonl`.
- Codex sessions are discoverable through `vibe-replay sessions`; if the path is not obviously Claude or Cursor, pass the provider returned by search or ask the user.
### If this is the current Claude Code session
Find the current session file with `${CLAUDE_SESSION_ID}`:
```bash
grep -l '"sessionId":"${CLAUDE_SESSION_ID}"' ~/.claude/projects/*/*.jsonl 2>/dev/null
```
If multiple files match (normal after `/resume`), pick the oldest. `vibe-replay` auto-discovers related files by slug/project.
### If the user describes a past or fuzzy session
Use `vibe-replay sessions` first. Prefer `--json` so results can be ranked without scraping terminal text:
```bash
npx vibe-replay sessions --query "<terms>" --limit 10 --json
```
Useful filters:
```bash
npx vibe-replay sessions --project "vibe-replay" --json
npx vibe-replay sessions --provider cursor --query "auth bug" --json
npx vibe-replay sessions --query "codex parser" --scan --json
npx vibe-replay sessions --query "PR review CI" --any --brief --dedupe --json
+ npx vibe-replay sessions --compacted --limit 10 --json
```
Search workflow:
1. Start shallow with `--query` or `--project`, `--limit 10`, and `--json`.
2. Rank matches by timestamp, project, title/first prompt match quality, provider, and user intent.
3. If a remembered query has several loose terms and returns nothing, retry with `--any`.
4. Add `--brief` when the user asks a fuzzy retrospective question; it adds `matchQuality`, matched/unmatched terms, `whyMatched`, `brief`, `signals`, and `suggestedNextAction`.
5. Add `--dedupe` when repeated long-prompt sessions from multiple workspaces clutter results.
6. Only add plain `--scan` for a narrowed candidate set when the user asks about retro, efficiency, prompt quality, cost, tool usage, compactions, API errors, files modified, or session quality.
Avoid broad `--scan` over many sessions. It is intentionally available, but expensive compared with metadata search.
If `--json` returns an empty array, verify `vibe-replay` is installed and accessible:
```bash
npx vibe-replay --version
```
Then broaden or drop the query, retry with `--any`, filter by project/provider, or ask the user for a session path directly.
For search results, return a short ranked list with provider, timestamp, project, title or first prompt preview, slug/session id, why it matched, and whether deeper scan/replay is recommended. Do not dump full raw prompts unless the user asks.
After choosing a session, branch by intent:
- **PR sharing or replay export** - continue with Steps 2-5, then Step 7.
- **Session retro or efficiency analysis** - skip PR artifact cleanup and use Step 6.
## Step 2 - PR sharing path: generate the artifacts
Once you have a session path and provider, run `vibe-replay` with the provider when known:
```bash
npx vibe-replay --provider <provider> --session <PATH> --github
```
For Claude Code, `--provider claude-code` may be omitted because it is the default, but include the provider when it came from `vibe-replay sessions`. For Cursor, use `--provider cursor`. For Codex, use `--provider codex`.
This writes to `~/.vibe-replay/<slug>/`:
- `github-summary.md` - the markdown summary to paste into the PR.
- `redactions.json` - credential audit report.
- `session-preview.gif` / `.svg` - preview animations; skip unless the user explicitly asks.
If the user asks for an interactive local replay instead of PR artifacts, run:
```bash
npx vibe-replay --provider <provider> --session <PATH> --open
```
## Step 3 - Review credential redactions
Read `redactions.json`. It has two fields:
- `alreadyRedactedCount` - how many secrets `vibe-replay` already replaced with `[REDACTED]` automatically. Just report this number to the user.
- `leftoverFindings` - regex hits in the final markdown that `vibe-replay` was not confident enough to auto-redact.
If `leftoverFindings` is empty, say so and move on.
If `leftoverFindings` is non-empty, present the findings to the user. For each one:
- Show: rule (e.g. "GitHub Token"), context snippet (one line of surrounding text), and your judgment of whether it looks real
- Note that some matches are false positives - commit hashes, UUIDs, version strings, package names can look like tokens. Use the surrounding context to judge.
- Offer choices: "Redact all", "Review one-by-one", "Keep as-is" (if you believe they're false positives), or "Cancel"
If the user chooses to redact any finding, first copy the original to a working file. Do not overwrite `github-summary.md`:
```bash
cp ~/.vibe-replay/<slug>/github-summary.md ~/.vibe-replay/<slug>/github-summary.clean.md
```
Then apply replacements to `github-summary.clean.md`. The original stays intact so the user can recover the unedited version. All later steps (translation, tone) also operate on the `.clean.md` copy. Create it on the first edit, then keep using it.
## Step 4 - Offer translation
Read the working file (`github-summary.clean.md` if it exists from step 3, otherwise `github-summary.md`):
```bash
cat ~/.vibe-replay/<slug>/github-summary.clean.md 2>/dev/null || cat ~/.vibe-replay/<slug>/github-summary.md
```
Detect the language of the user-prompt sections. If the dominant language is not English (or does not match the repo's primary language - check `README.md` if unsure), ask:
> "The prompts are in {detected language}. Translate to {target language} before sharing? [Yes / No]"
If yes, apply this prompt to the user-prompt sections of the markdown (always write the result to `github-summary.clean.md`, creating it from a copy of the original if it doesn't exist yet):
```
You are a translation assistant for AI coding sessions.
Translate the following user prompts from {source} to {target}.
Rules:
- Only translate natural language text
- Preserve code blocks, file paths, variable names, CLI commands verbatim
- Preserve markdown formatting
- Keep technical jargon in English (API, endpoint, middleware, etc.)
- Maintain the original intent and tone
- If a prompt is already in {target}, return it unchanged
```
Only rewrite the prompt text. Do not touch tool-call output, file diffs, or stats.
## Step 5 - Offer tone softening
Scan the user-prompt sections for harsh language, profanity, frustration, or passive-aggressive tone toward the AI. If you find any, ask:
> "Some prompts contain {brief example, e.g. 'frustrated language'}. Soften the tone before sharing? [Professional / Neutral / Friendly / Skip]"
If the user picks a style, apply this prompt to the affected user prompts (write the result to `github-summary.clean.md`, same rule as step 3):
```
You are a tone adjustment assistant for AI coding sessions.
Rewrite the following user prompts to be more {style}.
Rules:
- Preserve the EXACT technical meaning and intent
- Remove frustration, harsh language, profanity, or passive-aggressive tone
- Keep code references, file paths, and technical terms unchanged
- If a prompt is already appropriate, return it unchanged
- Do NOT add excessive politeness or corporate-speak - keep it natural
Style guide:
- Professional: direct but respectful, suitable for work sharing
- Neutral: factual and unemotional, like documentation
- Friendly: warm and collaborative, like messaging a teammate
```
## Step 6 - Alternative path: session retro guidance
If the user asked for a session retro instead of PR sharing, do not generate or clean `github-summary.md`. Narrow the candidate set first, then use scan-backed results:
```bash
npx vibe-replay sessions --project "<project>" --limit 5 --scan --json
```
If the user gave search terms instead of a project, use a narrowed query:
```bash
npx vibe-replay sessions --query "<terms>" --limit 5 --scan --json
```
Separate observations from recommendations.
For efficiency analysis, look at:
- Prompt count and whether the user had to repeat intent.
- Tool calls per prompt and edit count per prompt.
- Long duration, API errors, compactions, and subagent count.
+ - Token input/output, cache read/write, and the derived uncached/miss prompt
+ footprint. Treat Cursor token snapshots and compaction counts as estimated or
+ lower-bound evidence, respectively.
- First prompt clarity: goal, constraints, files, expected verification, and merge/review instructions.
Prefer actionable advice such as "the first prompt had a clear goal but missed verification criteria" or "the session became expensive because it searched broadly before narrowing to one file."
## Step 7 - Preview and paste
Show the user the final markdown (or a diff against the original if changes were made). Ask:
> "Paste into a PR now? [Append to current PR's body / Replace current PR's body / Open new PR / Just save the file / Cancel]"
Important: `gh pr edit --body-file <file>` replaces the entire PR body. If the user already has a hand-written summary, checklist, or screenshots in the PR body, replacing wipes them silently. Default to appending under a `## Session Replay` heading instead.
To append (recommended default):
```bash
# Read existing body, then write existing + separator + cleaned summary
gh pr view --json body --jq .body > /tmp/pr-body.md
SUMMARY=$(ls ~/.vibe-replay/<slug>/github-summary.clean.md 2>/dev/null || echo ~/.vibe-replay/<slug>/github-summary.md)
echo "" >> /tmp/pr-body.md
echo "---" >> /tmp/pr-body.md
echo "" >> /tmp/pr-body.md
echo "## Session Replay" >> /tmp/pr-body.md
echo "" >> /tmp/pr-body.md
cat "$SUMMARY" >> /tmp/pr-body.md
gh pr edit --body-file /tmp/pr-body.md
```
To replace, only if the user explicitly chooses this, confirm out loud what is about to be lost first:
```bash
gh pr edit --body-file ~/.vibe-replay/<slug>/github-summary.clean.md
```
If saving locally only, the cleaned version is already at `~/.vibe-replay/<slug>/github-summary.clean.md` from earlier steps. Just report the path. If no cleanup steps ran, copy the original first so the user has a `.clean.md` to share without touching the source.
## Notes
- The skip-the-image rule still applies: by default, do NOT include the GIF reference (first line of the original markdown) when pasting into a PR. Committing a binary GIF bloats git history. Only include it if the user explicitly asks for the GIF.
- `github-summary.clean.md` is the only shareable markdown file the skill edits. The original `github-summary.md` is treated as read-only so the user can always recover the raw output.
- The literal `${CLAUDE_SESSION_ID}` is interpolated by the Claude Code harness when this skill runs. If it is empty or no file matches, ask the user which session to use or search with `vibe-replay sessions`.
- Session data may contain private code, credentials, internal links, or frustrated wording. Quote only the minimum needed.
- Treat `vibe-replay sessions` as metadata/subsequence search, not semantic search. If results are weak, broaden terms, filter by project/provider, or inspect a small number of returned transcripts.