Park agent coding sessions you're waiting on, and resume them later — across four harnesses: Claude Code, Codex CLI, pi, and OpenCode.
You know the situation: a session is blocked on a PR review, a colleague's
answer, or tomorrow's deploy. You'll want it back — in the right directory,
in the right tool, with its full conversation — but not today. apark is a
tiny SQLite-backed ledger of those parked sessions: what each one was doing,
why it stopped, and the exact command that resumes it.
$ apark list
OVERDUE #4 cc nexi-payment-gate cluster capacity waiting 2026-07-25
#7 cc regional-api-gate PR #68 approved + mergeable waiting 8d ago
#9 cx billing-export flaky test bisect waiting today
$ apark resume 7 # cd <cwd> && claude -r <session-id>
$ apark resume 9 # cd <cwd> && codex resume <session-id>
Each harness stores sessions differently; apark ships an adapter per harness that knows where sessions live, how to pull metadata (title, cwd, git branch, last prompt), and how to resume:
| Harness | Session store | Resume |
|---|---|---|
| Claude Code | ~/.claude/projects/**.jsonl |
claude -r <id> |
| Codex CLI | ~/.codex/state_N.sqlite |
codex resume <id> |
| pi | ~/.pi/agent/sessions/**.jsonl |
pi --session <id> |
| OpenCode | ~/.local/share/opencode/opencode.db |
opencode -s <id> |
apark add <session-id> figures out which harness a session belongs to by
searching all four stores (--harness to force). Harnesses that aren't
installed are silently skipped. All stores are read strictly read-only.
git clone https://github.com/delor/apark && cd apark
./install.shThe installer symlinks ~/.bin/apark and, for each harness it detects on
the machine, drops a /park and /waiting slash command into that
harness's native prompt directory. --harness <name> (repeatable) installs
for specific harnesses only. It never overwrites real files — only creates
or refreshes symlinks.
Requirements: Python 3.8+ (stdlib only — no pip installs), bash, Linux.
apark add <session-id> --note "waiting on PR review" --check-back 2026-08-04
apark add --harness codex # auto-detect newest codex session
apark list # waiting sessions, OVERDUE/DUE first
apark list --harness claude # filter by harness
apark find <query> # search titles/notes/recaps/projects
apark show <ref> # everything about one session
apark resume <ref> # cd + exec the right harness
apark edit <ref> --note ... --check-back ... --tag ...
apark done <ref> # keep the record, mark finished
apark rm <ref> # delete the record<ref> is the numeric id from list, a full session id, or a unique
session-id prefix. A recap (multi-line context for future-you) can be piped
in: printf '%s' "$recap" | apark add <id> --recap -.
Inside any of the four agents, /park has the agent itself draft a recap of
the current session (what's done, what it's blocked on, next steps), show it
for approval, and file it with apark add. /waiting lists what you're
waiting on. Command sources live in commands/ per harness.
Single SQLite file at ~/.apark/apark.db (override with APARK_DB).
Sessions parked with a pre-rename ccpark database are migrated
automatically on first run.