Observed since 20 Oct, 22:07 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
Session handover engine for AI coding agents: checkpointed, resumable, backend-agnostic persistent memory.
Session handover engine for AI coding agents: checkpointed, resumable, backend-agnostic persistent memory.
AI coding agents (Claude Code, Codex, OpenCode, Cline, ...) are stateless between
sessions. Every new session starts with re-explaining the project, the decisions
already made, and what was left half-done. agent-handover is the small piece of
infrastructure that fixes this: at the end of a session the agent writes a
structured handover; at the start of the next one, it resumes from it — even if
the previous handover crashed halfway.
Extracted from a personal "AI Team OS" that has run daily handovers across multiple machines and agents since 2025.
┌─ session ends ──────────────────────────────────────────────┐
│ HandoverEngine(steps, checkpoint, pause_file) │
│ step 1: collect session facts ── checkpointed │
│ step 2: MemoryStore.write(layer=1...) ── checkpointed │
│ step 3: MemoryStore.write(layer=2...) ── checkpointed │
│ step 4: GitBackend.publish(...) ── checkpointed │
└──────────────────────────────────────────────────────────────┘
┌─ next session starts ───────────────────────────────────────┐
│ $ agent-handover check # 0=clean 1=RESUME 2=completed │
│ read layer2/current-state.md → agent has context again │
└──────────────────────────────────────────────────────────────┘
Three memory layers, all plain Markdown (git-friendly, diff-able, readable by humans and any agent that can read a file):
| Layer | File pattern | Semantics |
|---|---|---|
| 1 | layer1/YYYY-MM/<tag>-<date>.md | session notes (append, dated) |
| 2 | layer2/current-state.md | "where are we now" (always overwritten) |
| 3 | layer3/YYYY-MM-<tag>-archive.md | monthly compaction of old notes |
Three rules learned in production:
agent-handover check → exit 1) and resumed without re-running done steps.PAUSE file is an absolute kill-switch. Agents that write to your repos
need a brake a human can pull with touch PAUSE.pip install agent-handover # or: pip install -e . from a clone
from pathlib import Path
from agent_handover import Checkpoint, HandoverEngine, MemoryStore, Step, GitBackend
store = MemoryStore("memory/")
cp = Checkpoint(".agent-handover/checkpoint.json")
git = GitBackend(".", paths=["memory/"])
engine = HandoverEngine(
steps=[
Step("session_note", lambda: store.write(1, notes, tag="refactor")),
Step("current_state", lambda: store.write(2, snapshot)),
Step("publish", lambda: git.publish("handover: session sync")),
],
checkpoint=cp,
pause_file=Path.home() / ".agent_handover" / "PAUSE",
)
engine.run() # resumes pending steps automatically after a crash
In your agent's bootstrap (CLAUDE.md / AGENTS.md):
agent-handover check # exit 1 → finish the interrupted handover first
agent-handover run)Don't want to write Python? Describe the handover in a TOML file and run it from the CLI — same checkpointed engine, as data:
agent-handover run --config .agent-handover/handover.toml --note "what happened"
# local only (no git push):
agent-handover run --config .agent-handover/handover.toml --note "wip" --no-push
CLI flags (--note, --current-state, --no-push, --checkpoint) override the
file, so one config serves every session. See
examples/run/ for a starter handover.toml.
A first-class adapter for the OpenAI Codex CLI.
Install the bootstrap block into your repo's AGENTS.md (idempotent, preserves
your other rules) and write a handover at the end of each session:
from agent_handover.adapters.codex import install_agents_md, build_codex_handover_engine
install_agents_md("AGENTS.md") # Codex runs `agent-handover check` on start
engine = build_codex_handover_engine( # one call for the end-of-session hook
session_note="reviewed PR #42; released v0.2.0",
current_state="parser refactor merged; next: TOML step config",
)
engine.run() # writes memory/, publishes, checkpointed
See examples/codex-cli/ for a runnable end-of-session
script and the AGENTS.md block.
A first-class adapter for Cline, the autonomous coding
agent for VS Code. Cline reads a directory of rule files (.clinerules/),
so the adapter installs a dedicated, idempotent rule file that never touches
your other rules:
from agent_handover.adapters.cline import install_clinerules, build_cline_handover_engine
install_clinerules(".clinerules") # writes .clinerules/00-agent-handover.md
engine = build_cline_handover_engine( # one call for the end-of-session hook
session_note="reviewed PR #42; released v0.3.0",
current_state="parser refactor merged; next: TOML step config",
)
engine.run() # writes memory/, publishes, checkpointed
See examples/cline/ for a runnable end-of-session script
and the .clinerules/ rule file.
A first-class adapter for OpenCode. OpenCode reads
AGENTS.md as its rules file (the same mechanism as Codex), so this adapter
shares its block and installer with the Codex adapter — only the example path
and engine tag differ:
from agent_handover.adapters.opencode import install_agents_md, build_opencode_handover_engine
install_agents_md("AGENTS.md") # OpenCode runs `agent-handover check` on start
engine = build_opencode_handover_engine( # one call for the end-of-session hook
session_note="reviewed PR #42; released v0.4.0",
current_state="parser refactor merged; next: TOML step config",
)
engine.run() # writes memory/, publishes, checkpointed
See examples/opencode/ for a runnable end-of-session
script and the AGENTS.md block.
AGENTS.md bootstrap + end-of-session handover).clinerules/ rule file + end-of-session handover)AGENTS.md bootstrap + end-of-session handover)agent-handover run with declarative step config (TOML)Issues and PRs welcome — especially reports from other agent stacks (Codex CLI, Cline, OpenCode).
MIT
Download counts and popularity will appear here as the collector receives them.
| Version | Published | Direct dependencies | Open version |
|---|---|---|---|
| 0.5.1 | 13 Jul 2026 | 1 |
This describes our collected data; it is not a security assessment.
Observed since 20 Oct, 22:07 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
package:08a39e64373abd1e24b05e71301e4ae568cc160fe9296b65050ec1b8884819e7