Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Extract conversation turns from AI session history files (.jsonl)
.claude/skills/axoviq-ai-session/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 137% | 0% |
| case-02 | ✗→✓ | ▲ Improved | 17% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 8% | 0% |
| case-04 | ✗→✓ | ▲ Improved | 16% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 9% | 0% |
Extracts human-readable conversation turns from AI coding session history files (.jsonl). Supports two formats:
(~/.claude/projects/<hash>/<session-id>.jsonl)
{"role": ..., "content": ...} per-line formatused by OpenAI Codex and Cursor IDE sessions
Format is detected automatically from the first parseable line.
Only substantive conversation turns are kept:
| Content type | Action | |---|---| | User text messages | Kept if ≥ 3 words | | Assistant text responses | Kept if ≥ 20 words | | Assistant thinking blocks | Skipped (internal reasoning, not final output) | | Tool use / tool result blocks | Skipped (avoids leaking file contents or credentials) | | Image / attachment blocks | Skipped | | Sub-agent scaffolding (isSidechain: true) | Skipped (internal sub-agent turns) | | Session metadata lines | Skipped (permission-mode, file-history-snapshot, system, last-prompt) |
The extracted text is then passed through Synthadoc's standard pre-LLM source sanitizer (zero-width characters, bidi overrides, HTML comments, hidden CSS spans, base64 blobs, instruction-override phrases), exactly like PDF, DOCX, URL, and every other source type.
Each turn is labelled [USER] or [ASSISTANT] and separated by ---:
[USER]
How do I implement a sliding window algorithm?
---
[ASSISTANT]
A sliding window algorithm maintains a contiguous subarray (the "window") …suggested_slugThe skill returns a suggested_slug in metadata derived from the session file's modification time and the first substantive user message:
session-2026-07-15-how-do-i-implement-a-slidingSessions longer than 30 substantive turns are split into 30-turn chunks. Each chunk is labelled with a ## Part N of M header so the downstream LLM can process sections independently. The metadata dict includes chunk_total when chunking occurs; single-chunk sessions (≤ 30 turns) are unchanged.
are stripped. This is intentional: it avoids leaking file contents and credentials into the wiki.
Corrupt or empty files produce an empty ExtractedContent.
creates or updates the same wiki page (standard ingest dedup applies via source hash).
.jsonl"claude session", "codex session", "cursor session","ai session", "session history"
pythonimport asyncio from synthadoc.skills.session.scripts.main import SessionSkill skill = SessionSkill() async def main(): result = await skill.extract("/path/to/session.jsonl") print(result.text) # [USER]\n...\n\n---\n\n[ASSISTANT]\n... print(result.metadata) # {"format": "claude_code", "turn_count": 42, "suggested_slug": "..."} asyncio.run(main())
Other measured skills in the registry, with their headline benchmark lift.