Quickstart
macOS and Linux. One binary. No npm, no plugin, no account.
curl -fsSL https://tryhermes.pages.dev/install | shOpen a new terminal, then check what Hermes can see:
hermes doctorIf hermes is not found, add the install folder to your PATH:
export PATH="$HOME/.local/bin:$PATH"Then, in the project you were editing:
hermes handoff claude cursor -m "what you were doing"The rule
One name is where you are going. Two names are from, then to.
| Command | Means |
|---|---|
hermes handoff claude | Go to Claude |
hermes handoff cursor | Go to Cursor. Not “leave Cursor”. |
hermes handoff cursor claude | From Cursor to Claude |
hermes handoff claude cursor | From Claude to Cursor |
With one name, the source is the newest session that belongs to this folder. hermes to <agent> is the same as hermes handoff <agent>.
handoff
Packs this repo and prepares the next agent.
~/src/app main* ❯ hermes handoff claude cursor -m "finish upload rate limit" packed handoff-20260927T141205 from claude id=7c21a9f0-3b1e-4c2a-9e51-0d3c1b2a7f44 to cursor copied PROMPT.md → clipboard next hermes resume cursor
The pack is a handoff-<timestamp>/ folder next to your project:
handoff-20260927T141205/ ├── PROMPT.md the brief the next agent reads ├── SUMMARY.md ├── manifest.json ├── git/ │ ├── branch.txt │ ├── changed-files.txt │ ├── diff.patch │ └── log.txt ├── sessions/claude.md when Hermes can read the chat ├── DECISIONS.md with --decisions └── files/ with --include-files
./handoff-*. zsh expands the glob. Use hermes resume.Where it lands
| Destination | What happens |
|---|---|
| CLI agents on your PATH claude, codex, opencode… | Starts seeded from the pack: opened claude (seeded from the pack) |
| Editors and GUIs Cursor, Antigravity, Claude desktop or web, VS Code chat | PROMPT.md goes to your clipboard. Open a new chat and paste, or type @PROMPT.md. |
Force either path with --open, --no-open or --copy. There is no vscode agent: for VS Code or the Claude app, use --no-open --copy and paste.
In Cursor this is a new chat, not the old composer id. Continuity is the work, not the thread id.
list and --id
Pick a specific chat instead of the newest one.
hermes list --herehermes list --agent cursor --here -q keywordhermes handoff cursor claude --id e188~/src/app main* ❯ hermes list --agent cursor --here # cursor 2026-09-27 14:10 e1884976-2f0c-4b7e-9a51-3d0c1b2a7f10 upload rate limit ~/Library/Application Support/Cursor/User/globalStorage/state.vscdb 2026-09-27 11:02 b03d11e2-9c4a-4e0b-8f7d-61a2c3e4f5a6 fix flaky upload test ~/Library/Application Support/Cursor/User/globalStorage/state.vscdb
A prefix of the id is enough. Without --id, Hermes takes the newest session for this folder. hermes list without --here shows every session Hermes can see on this machine.
Folder scope
Hermes only packs chats that belong to the folder you are in. Another project’s chat on the same machine is ignored. If nothing matches, you still get a git-only pack and a warning:
~/src/blog main ❯ hermes handoff codex packed handoff-20260927T142030 from git only to codex opened codex (seeded from the pack) warn no agent session for this folder; pack is git-only (this is fine). Use --id to pick a chat from another project next hermes resume codex
Pass --id to pick any chat that hermes list shows. For GUI chats Hermes cannot read, use --from none for a git-only pack.
resume
Reuses the latest pack. No glob.
hermes resumehermes resume cursorhermes resume --print--print prints PROMPT.md, the brief the next agent reads.
doctor
Shows what git sees and which agents Hermes can read on this machine. You do not need every agent installed to try Hermes.
~/src/app main* ❯ hermes doctor hermes doctor ✓ git binary ok ✓ git repo ~/src/app (branch main, 3 changed files) ✓ sqlite3 (Cursor DBs) ok ✓ claude 3 session(s) ✓ cursor 2 session(s) ✗ opencode 0 session(s) ✓ home /Users/you Hermes never writes into Cursor/Claude databases. You do not need every agent installed to test Hermes.
More commands
| Command | Does |
|---|---|
hermes to <agent> | Same as hermes handoff <agent> |
hermes from <agent> | Packs a session from one agent. The destination stays Cursor unless you name one. |
hermes validate [pack] | Checks a handoff pack |
hermes site | Serves this landing page locally |
hermes version | Prints the version |
Flags
| Flag | What it does |
|---|---|
-m, --message | What you were doing |
--from | Source agent: auto, none or an agent id |
--to | Destination agent (default cursor) |
--id | Session id from hermes list (a prefix is enough) |
--session | Explicit session file |
--include-files | Copy changed files into the pack |
--decisions | Notes the next agent must not redo |
-o, --output | Output directory |
--zip | Also write a .zip |
--copy | Copy PROMPT.md to the clipboard |
--open | Start the destination CLI (default when it is on PATH) |
--no-open | Do not start the next agent; only write the pack |
--print | Print PROMPT.md |
--agent list | Filter by agent id |
-q, --query list | Search title, id, or path |
--here list | Prefer sessions that look like this directory |
--from auto prefers a Claude session, then the newest. --from none skips every reader and packs git only.
Agents
Each one can be a source, a destination, or both. Hermes reads sessions and never writes into editor databases.
| Id | Product | Reads from |
|---|---|---|
claude | Claude Code | ~/.claude/projects |
cursor | Cursor | state.vscdb, read-only |
codex | Codex CLI | ~/.codex/sessions |
opencode | OpenCode | ~/.local/share/opencode |
cline | Cline / Roo | ~/.cline, editor globalStorage |
kimi | Kimi | ~/.kimi-code, ~/.kimi |
antigravity · agy | Antigravity | ~/.gemini/antigravity-cli |
pi | Pi Agent | ~/.pi/agent |
copilot | Copilot CLI | ~/.copilot |
zcode | ZCode | ~/.zcode/cli/db, read-only |
deepseek · dsh | DeepSeek Harness | ~/.dsh |
Aliases also work: claude-code, codex-cli, open-code.
What it won’t do
- Merge two agents into one native history
- Write into Cursor or Claude databases
- Upload anything, run an MCP server, or ask for an account
- Restore a Cursor composer id
The work travels. The agents do not merge.