@chatpanel/cli
v0.37.2
Published
ChatPanel in the terminal — the same chats, models, tools, memory and teams as the extension and the desktop, through the local gateway, as a TUI and as scriptable commands.
Maintainers
Readme
ChatPanel CLI
ChatPanel in the terminal — the same chats, models, tools, memory, skills and teams as the browser extension and the desktop app, through the local gateway, as a chat screen and as commands you can script.
npm i -g @chatpanel/cli
chatpanel # the chat screen (also `cpcli` and `chatpanel-cli`)
chatpanel -c # continue the last chat · -r picks one
chatpanel ask "what did we decide about the rollback?"It needs the ChatPanel gateway running on this machine (chatpanel-gateway, or the desktop
app, which bundles it). The gateway is what redacts personal data before a model sees it,
routes to the model or coding agent you pick, and holds the history every ChatPanel client
shares — so a chat you have here is in the extension's history and the desktop's list a few
seconds later, and theirs are here.
The screen
❯ What did we decide about the rollback? 14:02
◆ Codex
⚙ find history_search "rollback" ✓ 0.4s
You decided to roll back on Friday, after the …
╭──────────────────────────────────────────────────────────────╮
│ ❯ Ask anything — / for commands │
╰──────────────────────────────────────────────────────────────╯
Codex · redacted · gateway 0.10.0
1.2s first token · 8.6s| Key | Does |
|---|---|
| Enter | send — Alt+Enter or a trailing \ adds a line; a paste keeps its lines |
| Esc | stop the reply · close a menu |
| ↑ ↓ | input history · move in a menu |
| Tab | complete a /command |
| Ctrl+P | pick a model or agent |
| Ctrl+O | open a past chat |
| Ctrl+N | new chat |
| Ctrl+S | send the message you typed while a reply was running (steer) |
| Ctrl+R | ask the last question again |
| Ctrl+C | leave (twice while a reply runs) |
The colours are the product's own palette (@chatpanel/events/theme.js), so the terminal
looks like the side panel. Text itself is never painted — your terminal's own foreground is
used, so it reads on any background; --theme light or --theme dark picks the matching
greys when the terminal does not say which it is (COLORFGBG), --theme ansi is for a
16-colour one (chatpanel config set theme light to keep it). Code
blocks are framed and highlighted, links and headings coloured, every answer ends with what
it cost (time to first token, tokens, tool calls).
Type / for the menu. Built-ins: /model, /new, /chats, /search, /open,
/memory, /skills, /teams, /runs, /redact, /retry, /edit, /stop, /rename,
/resume, /sh, /sync, /status, /sideline, /help, /quit (or /exit).
!<command> runs a command in your shell (!git status, !npm test 2>&1 | tail). The
output shows in the transcript and rides into your next question, so "why did that fail?" has
the failure in front of the model. Esc kills a long one. Non-interactive — no vim here. Every skill, recipe, team and agent you
saved in the extension or the desktop is a /command here too — /summarize the thread,
/research compare A and B — because they live on the gateway, not in any one client.
While a reply streams you see what the turn is doing (which tool it called, what a coding
agent is reading), and you can keep typing: the next message queues and is sent when the
reply ends. When a tool wants to do something destructive, or the model proposes saving a
recipe or a team, a card asks you — y, n, or a for always.
Commands
chatpanel ask "<question>" [--model <id>] [--chat <id> | --continue] [--no-tools] [--redaction off] [--json]
chatpanel models [--all] # what can answer, agents first
chatpanel chats [filter] # chats on this client; continue one with --chat <id>
chatpanel show <record id> # a chat, note or meeting
chatpanel search "<question>" [-c] # researched over all your records, answered with the ones it cites
chatpanel search --list "<words>" [--type note] [--since 7d] # the index hits instead
chatpanel memory [remember "<fact>" | forget <id>]
chatpanel skills · teams · runs [<id> | stop <id>]
chatpanel sync [--push] [--pull]
chatpanel status
chatpanel config set model codex # this terminal's defaults
chatpanel redact "<text>" # what the model would receiveask reads stdin as context when piped (git diff | chatpanel ask "review this"), streams
the answer, and prints the chat id so you can continue it. --json gives a script the
answer, the model, usage, timing and the tool steps in one object.
Your folder, once you say so
Start cpcli inside a project and it asks, once: let coding agents work here? Say yes and
a Codex or Claude Code turn asked from that chat reads and changes files in that folder
— the answer to "where did the agent put the file" is "where you started". Say always and
the folder is remembered (~/.chatpanel/cli/settings.json, and its subfolders count). Say no
and agents keep using the gateway's default workspace, ~/.chatpanel/workspace. /cwd
shows or changes it; chatpanel config trust [dir] / untrust from a script; ask --trust
or ask --cwd <dir> for a one-off. Your home directory and / are never a project. Needs
gateway 0.11.1 or newer — an older one keeps its default and says so in the trail.
Where things live
Everything is under ~/.chatpanel, next to the gateway's own files: the CLI's records and
turn log in ~/.chatpanel/cli/events.db, its settings in ~/.chatpanel/cli/settings.json.
Shared settings — MCP servers, skills, web search, tool policy, teams, agents, recipes —
are the gateway's (/v1/prefs) and are never copied here. The CLI authenticates to the
gateway as you, with the token the gateway writes to ~/.chatpanel/gateway-token.
CHATPANEL_GATEWAY_URL points it at another gateway; CHATPANEL_HOME moves the directory.
Privacy
The CLI never talks to a model directly. Every turn goes through the gateway, which replaces
names, emails, numbers and secrets with placeholders before the request leaves the machine
and restores them in the reply. When the model needs to look something up, the tool runs
here on the real values and its result is redacted again before the model reads it.
/redact preview <text> shows exactly what would be sent; /redact off turns it off for
one chat, visibly.
Development
npm install
npm test # the suite
node bin/chatpanel.js # run from source
npm run build # the minified package in build/npm/ (what is published)
npm run test:dist # …and the suite against itNode 22.12 or newer. The chat logic — the tool loop, presence, prefetch, the gates, teams,
sync — is @chatpanel/events and @chatpanel/pii, shared with the other clients;
src/core/ binds them to Node and the gateway, src/tui/ draws, src/commands/ prints.
