mcpbeat

Mining Session Skills

sugarforever/mining-session-skills

Review one completed Claude Code session and propose a skill to create, update, or reuse so similar work goes faster next time. Use when the user asks to "mine a session for skills", "what skill can be created or updated from the session where I…", "extract a skill from this chat", or to review a past session for reusable workflows. Operates on exported session markdown from claude-session-manager. Not for exporting/converting sessions (use claude-session-manager) and not for writing blogs or TODOs from sessions.

4k tokens
context cost
the whole folder, loaded on every use
6
files
ships runnable scripts
0
copies elsewhere
how many repositories repackaged it
130
stars on the repo
on the repository, not the skill itself

Install

one command, takes just this skill from the repository
npx skills add https://github.com/sugarforever/01coder-agent-skills --skill mining-session-skills

What comes with it

11 134 bytes besides the instruction
references/drafting-quality-bars.md
references/friction-signals.md
references/worth-it-gate.md
scripts/extract_session_signals.py
scripts/test_extract_session_signals.py

The instruction itself

15 sections, as written by the author

Mining Session Skills

Overview

Review one completed Claude Code session and answer: is there a skill worth creating or updating so this kind of work goes faster next time? A clean "nothing worth making here" is a valid result.

This skill is the judgment layer on top of claude-session-manager (the export/normalization layer). It reads exported markdown, not raw JSONL.

Preconditions

  • Inventory = skills loaded in THIS session. Create-vs-update-vs-reuse is decided against the skills already advertised/loaded in the running session. State this limit in the report ("comparison limited to skills loaded this session"). Run this skill where the relevant skills are loaded.
  • Mining operates on exported markdown (default ~/.claude/session-markdown), produced by claude-session-manager. If the target session is not exported yet, export it first (step 1.5).

Why exported markdown, not raw JSONL

Measured: a real session's raw JSONL was ~1.5M tokens (exceeds the context window); the exported compact body was ~91k tokens (17× smaller) with tool payloads deferred to a sidecar. Raw grep '"type":"user"' over JSONL is a trap (tool results are role:user). Always read/mine the exported markdown. Raw-JSONL byte grep is acceptable ONLY as a location prefilter (step 1).

Pipeline

Copy this checklist and track progress:

- [ ] 1. Locate the session (keyword search; confirm with user)
- [ ] 1.5 Export it if not already exported
- [ ] 2. Read the compact transcript (pull sidecar only as needed)
- [ ] 2.5 Segment into topic arcs
- [ ] 3. Mine friction signals per arc
- [ ] 4. Apply the worth-it gate
- [ ] 5. Decide create / update / reuse
- [ ] 6. Present the proposal
- [ ] 7. On approval, interview + draft

1. Locate

Search by the user's description. Prefilter optionally with a raw-JSONL byte grep across ~/.claude/projects (finds which file mentions a keyword without parsing), and/or grep the exported corpus under ~/.claude/session-markdown. Skip <local-command-caveat> / <command-*> wrapper noise — the first-prompt excerpt is often a wrapper, not the real ask. Present a ranked shortlist and let the user confirm.

1.5 Export

If the chosen session has no markdown yet, run claude-session-manager to export just that session, then continue.

2. Read

Read the session .md. Pull tool-details/<id>.tools.md ONLY for the specific <tool_call_NNNNNN> refs that matter. Use scripts/extract_session_signals.py <session>.md to get a clean JSON list of human prompts (with event index, line, timestamp, arc-break hints, and the prompt text) — it encodes the input-robustness rules below.

Input-robustness rules:

  • The real exported header format is ### N. user - <ISO> / ### N. assistant - <ISO> (not ### MM-DD HH:MM:SS User:).
  • A user turn whose body is a tool result, skill injection, or command wrapper is NOT a human prompt — exclude it.
  • Ignore thinking-signature blobs and empty attachment events.

2.5 Segment

Sessions can be multi-day, multi-task kitchen sinks. Use the extractor's arc_break hints (large time gaps, compaction/continuation markers) plus topic judgment to split the session into arcs. Mine each arc independently. Do NOT assume one task per session.

3. Mine

Per arc, extract friction signals. See references/friction-signals.md for the taxonomy and how to cite evidence.

4. Gate

Apply the worth-it filter to every candidate. See references/worth-it-gate.md. If nothing passes, report the clean negative and stop.

5. Decide

For each surviving candidate, compare against skills loaded this session:

  • No loaded skill covers it → CREATE (new skills/<name>/).
  • Loaded and editable (in this repo's skills/) → UPDATE that SKILL.md.
  • Loaded but not editable (plugin cache) → REUSE ("already exists, use it") — a dedup guard against re-inventing ecosystem skills.

6. Propose

Present a review-ready report per candidate: candidate · action (CREATE/UPDATE/REUSE) · why · evidence (event/line/tool_call refs) · proposed gerund name · description (triggers + exclusions). List gate-rejected items briefly. Wait for approval before any file change.

7. Draft

On approval: interview the user for the taste/judgment the transcript cannot show, then scaffold or edit the SKILL.md following references/drafting-quality-bars.md. For a new skill, run scripts/sync-marketplace-skills.sh and bump the version in .claude-plugin/marketplace.json (per the repo CLAUDE.md).

Notes

  • Treat transcript data as private (prompts, file contents, secrets). Do not modify original .jsonl files.
  • The value of this skill is the mining methodology, not the SKILL.md format — Claude knows the format natively.

How to use it

Copy the folder

Take sugarforever/mining-session-skills from the repository into ~/.claude/skills for personal use, or into .claude/skills inside a project.

Check the name does not clash

The agent identifies a skill by the name field in its header. Two skills with the same name cannot sit side by side — one of them will be ignored.