emotional-recap — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited emotional-recap (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Generate a wellbeing-focused review of the user's recent Claude Code conversations. The skill reads conversation transcripts, performs sentiment / tone / emotion analysis using established psychological frameworks, surfaces patterns (time-of-day, project, streaks, vocabulary), and writes a supportive Markdown + HTML report grounded in cited research.
This skill is supportive, not diagnostic. It surfaces observations and reframes them with science; it never pathologises, prescribes treatment, or replaces a professional. Wellness is a long game — this is one signal among many.
_On startup, use the Read tool to load ~/.claude/skills/emotional-recap/preferences.md. If missing, treat as "no preferences set" and apply Defaults from this file._
_On startup, use the Read tool to load ~/.claude/skills/emotional-recap/DESIGN.md. This file is the renderer contract: aesthetic direction, type system, colour tokens, layout, visualisation principles, anti-patterns, renderer guarantees, component patterns. Apply its tokens and rules to every emitted HTML / SVG / Markdown artefact. Renderer guarantees in DESIGN.md §7 are non-negotiable — they fail closed (refuse to write if violated)._
_When DESIGN.md and preferences.md conflict: DESIGN.md wins for renderer guarantees (a11y, anti-patterns, token shape); `preferences.md` wins for user-tunable knobs (tone, citation depth, framework choice, auto_open, etc.). If DESIGN.md is missing, fall back to the inline spec in reference/report-structure.md and flag once._
_On startup, use Bash to detect: current working directory, current project slug (cwd path with / → -, prefixed with -), today's date in YYYY-MM-DD. Skip any that fail._
Conversation transcripts live at ~/.claude/projects/<project-slug>/<uuid>.jsonl. Each line is one event (user message, assistant message, tool result, system reminder). The skill operates on user-authored text only — assistant output, tool outputs, and system reminders are excluded from sentiment analysis (they are not the user's emotional signal).
Check $ARGUMENTS:
preferences.md, feedback-journal.md, sessions/, resume-state.md, reports/, confirm, stop## Feedback & learning)resume-state.md exists, continue the previous unfinished run24h, 7d, 30d)emotional-recap — Wellbeing review of recent Claude Code conversations
Usage:
/emotional-recap Default: all projects, last 48h, both formats
/emotional-recap --window=7d Last 7 days
/emotional-recap --scope=current Only the current project's conversations
/emotional-recap --format=html HTML report only
/emotional-recap --last=10 Last 10 conversations (after window filter)
/emotional-recap --dry-run Analyse + print summary, no file written
/emotional-recap feedback Rate the most recent report
/emotional-recap config Set preferences
/emotional-recap resume Continue an interrupted run
/emotional-recap reset Clear preferences + journal + reports
/emotional-recap help This help
Current preferences:
(loaded from ~/.claude/skills/emotional-recap/preferences.md)Use AskUserQuestion to collect (in two batches of ≤4 questions):
Batch 1 — Scope & output
24h / 48h / 7d / 30dall projects / current project only / ask each timeboth md+html / md only / html only~/.claude/skills/emotional-recap/reports/ (default) / ~/Desktop/wellness/ / custom pathBatch 2 — Tone & depth
yes / nowarm & supportive (default) / clinical & neutral / direct & terseminimal (1-line refs) / standard (full APA inline, ~5 refs) / academic (full reference list, ~10 refs)Plutchik wheel (8 primary emotions) / Ekman basic (6 emotions) / Russell circumplex (valence×arousal) / combined (use all three contextually)Write to ~/.claude/skills/emotional-recap/preferences.md in three-tier format:
# /emotional-recap preferences
Updated: YYYY-MM-DD
## Defaults
- window: 48h
- scope: all
- format: both
- report_dir: ~/.claude/skills/emotional-recap/reports/
- auto_open: yes
- tone: warm
- citation_depth: standard
- framework: combined
## Profile (optional — edit freely)
- (free-form lines the user can edit to nudge defaults — e.g. "avoid mentioning sleep; I work nights by choice")
## Learned
- (populated from feedback over time)Delete in order, with confirmation:
~/.claude/skills/emotional-recap/preferences.md~/.claude/skills/emotional-recap/feedback-journal.md~/.claude/skills/emotional-recap/sessions/~/.claude/skills/emotional-recap/resume-state.md~/.claude/skills/emotional-recap/reports/ — these are user-facing artefacts.Confirm: Preferences, journal, sessions, and resume state cleared. Reports kept unless you opted in. Using defaults.
If ~/.claude/skills/emotional-recap/preferences.md does not exist:
First time using/emotional-recap? I'll use sensible defaults (last 48h across all projects, both md+html, warm tone, combined emotion frameworks). Run/emotional-recap configanytime to tune. Continuing…
Then proceed.
~/.claude/skills/emotional-recap/preferences.md → apply Defaults, then Profile overrides, then Learned overrides.reference/report-structure.md and flag once.~/.claude/skills/emotional-recap/feedback-journal.md if present — scan the last ~10 entries for Signal: lines and silently apply them as soft biases for this run.resume-state.md exists and $ARGUMENTS is not resume, mention once: A previous run was interrupted — run /emotional-recap resume to continue, or ignore to start fresh. Continue with the new run regardless.Continue silently on missing files — graceful degradation is mandatory.
$ARGUMENTS; fall back to preferences; fall back to Defaults.now - window (e.g. now - 48h).scope=all → glob ~/.claude/projects/*/scope=current → only the current project slugscope=<explicit-slug> → that one directorymtime >= cutoff.--last=N, sort by mtime desc and take top N.No conversations found in the last <window>. Either nothing's happened, or you're not using Claude Code through it — enjoy the quiet.Print a one-line confirmation: Scanning N conversations across M projects from <date> to <date>.
For each JSONL file:
type == "user" with a message.content that is a string or has text parts). Exclude:tool_use_result, tool_result)<command-*> tag payloads<command-name> blocks) — keep only the natural-language fragments the user typedtimestamp, project_slug, conversation_id, text.Aggregate stats: total messages, total tokens (approx word count × 1.3), distinct conversations, distinct projects, span (first → last timestamp).
Apply the user's chosen framework(s) — see ~/.claude/skills/emotional-recap/reference/frameworks.md for the full reference. Summary:
valence (−1 unpleasant → +1 pleasant) and arousal (0 calm → 1 activated) score.For each message produce a compact record:
{ts, project, valence, arousal, plutchik: [...], dominant_tone, markers: {...}}Important reading caveats (include in every report):
Surface the patterns that actually matter. Look for:
Pattern presentation rule: every flagged pattern must include (a) the observation, (b) the science behind why it matters, (c) one supportive reframe or question — never an instruction. Example:
_Your messages got shorter and more 1st-person after 11pm on May 11 and 12. Pennebaker (2003) found rising self-focus often tracks with fatigue or rumination. Worth noticing — what was happening those nights?_
Render both formats from a single shared structure. Bind every visual decision to a `DESIGN.md` token — no hard-coded hex, no inline style="" for colour or layout (data-driven values like width: 60% for a bar fill are allowed). Use the component patterns in DESIGN.md §8 and the renderer rules in reference/report-structure.md.
Before writing the file, run the 16-item renderer self-audit (DESIGN.md §7 → "Renderer self-audit"):
role="img", <title>, <desc>.aria-hidden="true".color-mix() in emitted CSS — pre-compute mixes for both themes and emit as theme-scoped CSS vars (see item 15).title=""-only tooltips on interactive elements.−1 negative · 0 neutral · +1 positive legend.var(--*) tokens, not literal hex.(pointer: coarse) viewports for interactive chart elements.<p class="chart-source"> caption with framework/method + a real citation drawn from reference/citations.md. Per DESIGN.md §7 provenance table.reference/citations.md, no prescriptive phrases ("you should", "you must", "fix", "stop", "treatment", "therapy"). If §04 is empty, the section header still renders with the "no standout options this window" line; do not silently skip.#[0-9a-fA-F]{3,8}) appearing as background, color, or border-color values on selectors that hold text or visible surface. Allowed locations for hex literals: inside :root { … } and @media (prefers-color-scheme: dark) :root { … } blocks ONLY. Anywhere else → fail..hl-quote color on .hl-card background), compute the contrast ratio using the light-mode token values and again using the dark-mode token values. Fail if either ratio is < 4.5:1 for normal text or < 3:1 for large text (≥18pt or ≥14pt bold).If any item fails, refuse to write and report which check failed. The user may override with --force but the default is fail-closed.
The audit is not a substitute for visual inspection. If a render passes 16/16 but still looks wrong in the reader's theme, the audit needs another item — log a journal entry and grow the checklist. Quality is the union of "passes the rules" + "looks right in the actual theme the reader uses."
Section order (DESIGN.md §4 IA — _fold-by-fold_: brief → highlights → insights → anchors → raw data → reference; 12 sections numbered 01–12 contiguously; both md + html unless noted):
_— Brief —_
_— Highlights —_
_— Insights —_
<details> / reframe). 3–7 cards. Scroll-snap, no JS, accessible in source order. This is the report's middle act — the main signal._— Anchors —_
reference/citations.md. Never prescriptive — the language is "research suggests…" / "studies indicate…" / "worth trying if it fits". Per DESIGN.md §6 language guardrails. Section may render empty (with the "no standout options" line) if no pattern this run admits a research-backed action._— Raw data — every chart carries a chart-source caption with framework + citation —_
_— Reference —_
reference/citations.md.HTML design requirements — see DESIGN.md for the canonical contract (tokens, type, palette, anti-patterns, renderer guarantees). The high-level shape:
-webkit-font-smoothing: antialiased. No font-feature-settings: "ss01" on fallback fonts.--t-hero (5.5rem). Always paired with −1 negative · 0 neutral · +1 positive legend below.font-feature-settings: "tnum") on every numeric value..num span marked aria-hidden="true". No gaps.--q?-line / --q?-ink / --q?-fill tokens. AA-compliant text tokens only.role="img", <title>, <desc>.<g tabindex="0"> with focus-visible state + inline-revealed details. No title=""-only tooltips.<style> block in <head>. Dark mode via prefers-color-scheme: dark with mirror token set.Tone of voice: per preferences (warm default).
File naming: reports/YYYY-MM-DD-HHMM-recap.md and .html.
mkdir -p the report directory if needed.~/.claude/skills/emotional-recap/sessions/YYYY-MM-DD-HHMM.md: # Session YYYY-MM-DD HH:MM
- window: <value>
- scope: <value>
- conversations: N
- dominant_quadrant: <Russell quadrant>
- mean_valence: <x>
- mean_arousal: <y>
- top_emotions: [...]
- patterns_flagged: [<short list>]
- report_md: <path>
- report_html: <path>auto_open is true and the format includes html, run open <path> (macOS) / xdg-open (Linux). Skip silently on failure.Print, in chat (≤6 lines):
Example:
Window: last 48h, 14 conversations across 3 projects. Mean tone: slight positive, moderately activated. 2 patterns to consider: (1) evening valence drop, (2) frustration streak inazadrepo (3 sessions). Saved:~/.claude/skills/emotional-recap/reports/2026-05-13-1430-recap.md(+ .html)
Final line:
Run /emotional-recap feedback — even one rating sharpens the next report. This is a mirror, not a diagnosis — your felt sense always overrides the analysis.When invoked as /emotional-recap feedback:
sessions/YYYY-MM-DD-HHMM.md. If none → say No recent session found. and stop.AskUserQuestion (4 questions, one batch):~/.claude/skills/emotional-recap/feedback-journal.md: ## YYYY-MM-DD-HHMM
- tone_fit: <answer>
- accuracy: <answer>
- usefulness: <answer>
- design: <answer>
- Signal: <one-line generalisation, e.g. "user finds 'warm' tone preachy; bias to 'clinical' next run">Signal, promote it to ## Learned in preferences.md. Mention once: Noticed you consistently <signal>. Saved as a standing default — change anytime in /emotional-recap config.## Learned, log the demotion in the journal with a Demoted: line). Never leave stale rules.Pre-selection bias: in Step 5 of the main workflow, the tone-of-voice choice and pattern-density threshold are biased by current ## Learned rules. E.g. if Learned says "user wants ≤3 flags per report", cap pattern flags at 3.
If ~/.claude/skills/emotional-recap/resume-state.md exists and $ARGUMENTS == resume:
step, window, scope, files_processed, intermediate_path.resume-state.md.The main workflow writes resume-state.md only when it processes ≥10 files — small runs are not worth resuming. State is overwritten on each run.
preferences.md / feedback-journal.md / failed JSONL parse — continue with defaults. Never block.Learned rule only after 3+ consistent signals. Mention once when promoting.Learned rule contradicted twice gets demoted. Never carry rules that no longer fit.reset always asks before deleting reports/ (they are user artefacts, not skill state).feedback, resume, config, reset, help subcommands: ✅ all routed.reference/frameworks.md, reference/citations.md, reference/report-structure.md to keep this file under 500 lines.~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.