session-handover
Hand off a coding-agent session to the next one — across tools.
session-handover reads your local session transcripts from Claude Code
(~/.claude/projects) and Codex CLI (~/.codex/sessions) and generates a
structured Markdown handover: what the goal was, what happened, what broke,
what's still open, and what the next agent should do. If you bounce between
Claude Code and Codex, this is the missing bridge — no more hand-writing
handover.md from memory.
Zero dependencies. Python standard library only.
Install
pip install session-handover
Usage
List recent local sessions from both tools, newest first:
$ session-handover list
TOOL SESSION STARTED MESSAGES
codex 0199f3a1-… 2026-09-30 00:41 57
claude-code a4c2e901-… 2026-09-29 23:58 34
Generate a handover for the most recent session (prints to stdout):
$ session-handover make
Or pick a session and write it to a file:
$ session-handover make --session a4c2e901 --out HANDOVER.md
The generated document includes:
- Goal — the first user message of the session
- What happened — counts of file edits, commands, reads, plus a timeline of notable actions (which files were edited, which commands were run)
- Files touched, and
git diff --stat/git statusif the session's working dir is a repo - Errors encountered — failed commands, tracebacks, tool errors
- Open items and a Next steps checklist template for the receiving agent
For testing or non-default locations:
SESSION_HANDOVER_CLAUDE_DIR=/path/to/claude/projects \
SESSION_HANDOVER_CODEX_DIR=/path/to/codex/sessions \
session-handover list
How it works
Claude Code stores each session as a .jsonl transcript; Codex CLI stores
per-day .jsonl session files. The parsers walk these line by line and
heuristically extract messages, tool calls (Edit/Write/Bash on the
Claude side, function_call items like apply_patch/shell on the Codex
side), and error signals. No LLM involved — it's fast, local, and private.
Honest limitations
- Heuristic extraction, not an LLM. The handover is a mechanical summary of what the transcript contains. It won't capture why a decision was made unless that was said out loud in the session. Read before trusting.
- Transcript formats are undocumented and change. Both Claude Code and
Codex CLI can alter their
.jsonlschemas at any time. The parsers are written defensively — unknown shapes are skipped, malformed lines are dropped, a bad file never crashes the run — but detail may silently degrade after a CLI update. - Codex support is best-effort. The Codex CLI session format has shifted
across versions; the parser targets the
response_item/function_callshape and degrades gracefully on anything else. - No remote sessions. Only transcripts on this machine are read. Nothing is uploaded anywhere.
- Session discovery uses file modification time for "most recent"; clock skew or copied files can misorder the list.
Development
python3 tests/test_parsers.py
python3 tests/test_cli.py
License
MIT
Release files for session-handover 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| session_handover-0.1.0.tar.gz | 11.9 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| session_handover-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 22.1 kB
Release files / session_handover-0.1.0.tar.gz
| Download URL | session_handover-0.1.0.tar.gz |
|---|---|
| Size | 11.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
fb273a0e1887dd30caaecd9f669fa7d12eaa87361b3fbba107591926ba86c77f
|
|
BLAKE2b-256 checksum How to use checksums |
d6fb5d830a8eae86044e56d9bbc3fa90a938803036833f72c37f720c3e633150
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.3
|
Release files / session_handover-0.1.0-py3-none-any.whl
| Download URL | session_handover-0.1.0-py3-none-any.whl |
|---|---|
| Size | 10.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
d67c611b57072ffec06be04a598bfdbf97648174194f11f00a10cc28966f3f2e
|
|
BLAKE2b-256 checksum How to use checksums |
74f5555edb1a1164d5541485058ba683699f86b2644ec1bf43fa2519e67d2f37
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.3
|