curt-convert
Convert Claude Code session transcripts (.jsonl) into .curt
single-file conversation files. Sister tool to
curt-wildchat.
- Repo: github.com/JordanNewell/curt-convert
- npm:
curt-convert@1.0.2(MIT) - Role: write only
- Depends on:
curt-format— every output file is re-parsed withparseCurtbefore it is written; a file that fails round-trip validation is never written.
Install
npm install -g curt-convert # or: npx curt-convert
CLI
curt-convert ~/.claude/projects/C--tmp-demo/abc-123.jsonl
curt-convert ~/.claude/projects/C--tmp-demo/ -o ./out
curt-convert "**/*.jsonl" -o ./out
curt-convert session.jsonl --stdout > session.curt
- A
.jsonlfile, a directory (walked recursively), or a glob all work. - Output defaults to alongside each input;
-o/--outredirects. - Names follow the bulk convention via
curtFilename(). - Bulk runs never overwrite: colliding inputs (parent sessions and
sidechain files share a
sessionId) get a deterministic-<6 hex>suffix from the source path — stable across runs. SetCURT_CONVERT_SELFCHECK=0to skip the self-check.
Mapping highlights
sessionId→conversation.id;ai-title(or first user text, ≤60 chars) →conversation.title.tool_useblocks →toolCalls[]andtool_resultblocks → separaterole: "tool"messages withtoolCallId— declares thetool-linkageextension.- Thinking blocks kept out of
contentas a message extra; the opaque signature dropped. - Documented losses: token counts and cost,
parentUuidchaining,<system-reminder>harness spans, meta/noise lines.
Handling warnings
Output is transcript-equivalent, not redacted: if the transcript contains
secrets, the .curt file contains them too. Scrub before sharing.
Where to go deeper
The full mapping table (every JSONL line type, kept or dropped), the documented-losses ledger, and the security note live in the repo README: github.com/JordanNewell/curt-convert.