CLI

Your memory, from the terminal.

For you, and for the agents you work with.

Same memory, any terminal.

Set Dory up in an assistant, check that it answers, and ask what it would say. A pipe gets JSON from every read verb.

dory help --agent

dory comes with Dory.app. Download

zsh — ~/code/orchard

A terminal: dory setup claude-code registers Dory's MCP server, places the rules block, adds the skill and hooks, and backs up first. dory doctor reports ready to serve after a synthetic recall through the MCP pipe. dory recall returns two lines, each saying whose words it is, and a Trust Receipt.

Scripted demo, fictional data. Painting: Gustave Courbet, The Calm Sea, 1869. The Met, CC0.

The commands

The ones you will use.

Read verbs answer what Dory holds and what it would say. Narrowing verbs make it quieter. Anything that widens waits for you. dory help --json marks each verb with which it is.

Set up

Put Dory into an assistant. Idempotent, backed up and reversible.

  • dory onboard Every first-run step, one question at a time
  • dory setup claude-code MCP server, rules block, skill and hooks
  • dory setup --catalogue Every client this build knows, with its setup
  • dory rules cursor The block to paste where a client needs it
  • dory setup cursor --uninstall Removes exactly what setup wrote

Check

Content-blind: counts and closed words, never your memories.

  • dory doctor Ends with a real recall through the MCP pipe
  • dory doctor --fix Offers each fix, one y/N at a time
  • dory status Is the engine alive, and what it holds
  • dory source status What each source is doing
  • dory setup --repair What differs from the running build

Ask and explain

What an assistant would be told, and why, through the same gate.

  • dory recall "what did we decide about retries?" The gated capsule, never raw memory
  • dory scope --for claude-code What that assistant may reach now
  • dory explain --last --for claude-code The last delivery: sent, held back, why
  • dory why <id> --for claude-code Why Dory holds it, and the gate’s verdict
  • dory log --limit 5 What Dory worked out, run by run

Connect a source

A request from an agent rings the doorbell. You answer it with Touch ID.

  • dory source connect --kind notion --json Files the request and exits 4 with its link
  • dory approve wait <intent> --json 0 done, 4 still waiting, 1 declined or expired
  • dory approve <intent> Yours, at your own terminal
  • dory source pause <id> Stop reading, keep everything

Make it quieter

Narrowing is open to agents. Undoing it is yours.

  • dory sever <id> Retire a memory and never say it
  • dory rule add --words others Keep other people’s words back
  • dory rule list Your standing rules, newest last
  • dory revert <run-id> Undo a run; what you confirmed stays

For agents

The manual ships inside the build that runs it.

  • dory help --agent The agent’s manual, as this build shipped it
  • dory help --json --fields verbs.path,verbs.effect Every verb and whether an agent may run it
  • dory help error HUMAN_ACTION_REQUIRED Any error code, explained offline
  • dory status --json Any read verb, as JSON; a pipe needs no flag

Dory Reach Coming soon

ChatGPT and Claude on the web will reach your Mac through a relay that forwards encrypted traffic it cannot read. Not available yet. What it will and will not do

  • dory remote reach status The Mac’s Reach name, the tunnel, the certificate
  • dory remote reach off Closes the tunnel

Agents call it. You approve.

An agent may read and narrow. Widening is yours.

Hand the terminal to your coding agent. It can install Dory into itself, check it, read from it and make it quieter.

  • A verb that would widen asks you on your Mac. When it cannot, it exits 4 with a dory://approve/… link.
  • You approve it in Dory with Touch ID. The request expires in ten minutes.
  • The agent waits with dory approve wait. A request is never a grant.

Your agent can install Dory and check that it works. When it asks for more, like a new source, the request waits for you and your Touch ID. Scripted demo, fictional data.

The contract

Built to be scripted.

A terminal reads tables; a pipe reads JSON. --fields trims an answer, every error is one object on stderr, and six exit codes say whose turn it is. Nothing is remembered between invocations.

  1. 0 ok The verb did what it says.
  2. 1 refused Refused or failed; nothing changed beyond what it printed.
  3. 2 usage The command line was wrong.
  4. 3 daemon_unreachable The engine did not answer.
  5. 4 human_turn_required It widens what Dory may say. It is the person’s turn.
  6. 5 transient Opening, busy or rate-limited. Retry after retry_after_ms.
stderr · dory-error/2 · a doorbell
$ dory source connect --kind notion --json   # exit 4
{"error": {
  "contract": "dory-error/2",
  "code": "HUMAN_ACTION_REQUIRED",
  "class": "human_turn_required",
  "retryable": false,
  "remediation": [{ "argv": ["dory", "approve", "in-7q2k"], "requires_human": true }],
  "explain": ["dory", "help", "error", "HUMAN_ACTION_REQUIRED"],
  "human_action": {
    "kind": "connect_source",
    "url": "dory://approve/in-7q2k",
    "expires_in": 600,
    "poll_interval": 2,
    "next_step": ["dory", "approve", "wait", "in-7q2k", "--json"]
  }
}}

The shape, abridged; the intent id is fictional. Retry only when retryable is true. Never run a step whose requires_human is true: give the person the command.

One command for every assistant. At launch.

One email when Dory is ready to install. Nothing else. Privacy

There is no notarized build yet. How assistants connect over MCP