@ghostystudio/cli
v0.77.0
Published
Official Ghosty Studio CLI — configure, test and chat with your agents from the terminal. Built for humans and coding agents.
Maintainers
Readme
@ghostystudio/cli
The official Ghosty Studio CLI: configure, test and chat with your agents from the terminal. Built for humans and coding agents (Claude Code, Codex, Cursor).
npx -y @ghostystudio/cli login
# or
npm i -g @ghostystudio/cli && ghosty loginghosty login opens your browser (OAuth2 + PKCE). If you already have a session on ghosty.studio, opening the link is all it takes. A coding agent can drive it for you: ghosty login --json prints {"event":"login_url","url":…} first so the agent can hand you the link. Over SSH, CI or from another device, ghosty login --device gives you a link + code instead (automatic when there is no local browser).
Commands
ghosty login [--device] [--profile NAME] # browser OAuth2; --device = link + code (SSH, CI)
ghosty logout # signs out and revokes this device's session
ghosty whoami
ghosty usage # plan and usage this week / month (also: ghosty me usage)
ghosty usage --workspace SLUG [--by agent,day] [--days 14] # a workspace's turns and tokens per agent/day (owner or staff)
ghosty plan open [workspace|personal] # pay, change plan or manage billing (opens the browser)
ghosty engines ls [--models] # valid --engine / --model values and what each model costs
ghosty bags ls|create|set|rm <workspace> ["bag"] [--tokens 20M] [--recurring on|off] [--hard-cap on|off] [--note] # token bags (changing: staff)
ghosty spaces create <slug> [--combo …: staff] [--dry-run] # yours, trial
ghosty spaces renew <workspace> --until YYYY-MM-DD [--note] [--dry-run] # staff
ghosty spaces rename <old> <new> [--dry-run] # staff, slug only
ghosty spaces transfer <workspace> --to EMAIL [--keep-as admin] [--copy-keys] [--dry-run] # staff, new owner
ghosty agents ls [--engine E] [--ids] [--sponsor EMAIL | --owner EMAIL] # --sponsor/--owner: any account (Ghosty staff)
ghosty agents create --name NAME [--engine E] [--model M] [--prompt TEXT | --prompt-file FILE] [--env K=V,…] [--workspace SLUG] [--channels teams=off]
ghosty agents get <id> [--fields name,model,prompt] [--prompt-out FILE]
ghosty agents export <id> [--out DIR] # the agent as a YAML file (+ its skills with --out)
ghosty apply <file|dir> [--agent X] [--create] [--prune] [--dry-run] # make an agent match the file
ghosty agents set <id> [--name] [--engine] [--model] [--prompt | --prompt-file FILE] [--env K=V,…] [--connect ID,…] [--disconnect ID,…] [--toolsets +crm]
ghosty agents set <id> --prompt-base <base-id> --prompt-overlay overlay.json [--dry-run] # prompt = another agent's + edits, kept in sync
ghosty agents share|unshare <id> <email> [--role editor|admin] # share without handing it over · agents shares <id> lists them
ghosty agents teams ls|on|off|rm <id> [workspace] [--handle x] # which Teams workspaces it answers in, and its @handle there
ghosty agents archive|restore <id> # archive: stops answering, deleted after 7 days unless restored
ghosty agents token rotate|revoke <id> [--yes] # owner only: rotate prints the new gat_ token once
ghosty agents memory ls|add|edit|rm|enable|disable <id> … # rules its team taught it (--scope wa) and its promos (--promo --title --details --from --until)
ghosty agents transfer <id> --to EMAIL [--workspace SLUG] [--dry-run] # hand it over with box, memory and files · --workspace SLUG|none: move it between your workspaces
ghosty agents rm <id> [--from-workspace] [--yes] # --from-workspace: turn it off in Teams first
ghosty agents set <id> [--tool wa:tool=off,…] [--bag NAME|none] [--avatar URL|FILE]
ghosty agents restart <id>
ghosty agents box <id> [--check PATH]… [--contains PATH=TEXT]… [--recycle] # is its machine on the new image?
ghosty agents box <id> --start # start (or wake) its box now, without spending a turn
ghosty agents demo enable|disable <id>
ghosty agents demo <id> [--slug NAME] [--expires "YYYY-MM-DDTHH:MM"|no] [--turns N] [--per-ip N]
[--welcome TEXT] [--starter TEXT] [--chips "a|b|c"] [--sponsor on|off] [--rotate] # public /p/ link, no account needed
ghosty agents embed enable|disable <id> [--domains a.com,*.b.com] # web widget: chat bubble on your site, only on those domains
ghosty agents embed <id> [--per-visitor N] [--per-ip N] [--welcome TEXT] [--color #hex] [--rotate] # state + the <script> to paste
ghosty agents embed <id> [--title T] [--avatar URL] [--icon chat|avatar|ghost] [--position left] [--theme auto] [--bubble-text T] [--auto-open S] [--starters "a|b"] # its look
ghosty agents embed <id> [--style '{json}'] [--theme-source teams|site --site-url URL] [--style-file theme.json] # its theme · `theme` exports it
ghosty agents embed <id> [--copy '{"waking":"One moment, please","thinking":["Reviewing your question…"]}'|none] [--copy-file texts.json] # what it says while it works
ghosty agents embed <id> --out src/components/GhostyChat.tsx [--force] # your own React chat component (no deps), token + theme baked in · the output also prints the React snippet (`react` in --json)
ghosty agents doctor <id> [--verbose] # exits 1 when it finds a problem
ghosty agents docs ls|grant|revoke <id> [doc] [--write] [--no-deliver]
ghosty agents docs add <id> --url URL | --file PATH [--description TEXT] [--grant read|write|no]
ghosty agents set <id> --voice elevenlabs:ID --voice-replies auto --auto-stage on
ghosty agents set <id> --web-search on|off --email-any on|off --extensions developer=off,… # native web search · email anyone from customer channels · its box's extensions
ghosty agents set <id> --chat-starters "a|b" --channel-roles teams=equipo,programado=cliente # suggestions in its OWN chat (the widget's are embed --starters) · who talks on each channel
ghosty files ls|get|put|rm <id> [path] [--file LOCAL] [--out LOCAL]
ghosty skills ls|get|add|rm <id> [slug] [--file SKILL.md | --dir FOLDER] [--out DIR] # get without --out only lists
ghosty skills enable|disable <id> <slug> # turn one of its skills (or one of Ghosty's) on or off
ghosty skills templates <id> # pdf-doc templates: its own and Ghosty's, and which folder wins
ghosty dbs ls|tables|query|export|import|grant|revoke <id> [db] [--write] [--arg V]… [--external-write t1,t2] [--external-rows t:col+col] [--from easybits:ID --tables a,b --append --dry-run]
ghosty turns ls <id> [--errors | --status running|done|stopped|error] [--since 1h] [--limit N]
ghosty turns ls --workspace SLUG --quota-hits [--days 14] # messages that got no turn because the balance ran out
ghosty turns show <id> [turn-id|last] # what came in, what it answered, where the time went [--full]
ghosty turns grep <id> "text" # what the customer or the agent said, and its turn [--since 7d] [--role user|agent]
ghosty turns jobs <id> # its background jobs from your chats (video, audio, captions, downloads; 24 h) · stop: turns cancel
ghosty channels whatsapp ls|enable|disable <id> [number] [--dry-run]
ghosty channels whatsapp link|unlink <id> --integration ID --answer on|off [--forward] [--dry-run] # bring a WABA number from Formmy
ghosty channels whatsapp history <id> --integration ID [--days 7] [--dry-run] # its recent cards, messages and orders (no duplicates)
ghosty channels whatsapp|messenger connect <id> # opens Channels to connect with Meta (browser sign-in)
ghosty channels mteams connect <id> --app-id <guid> --tenant <guid> # Microsoft Teams bot (secret in GHOSTY_MTEAMS_SECRET); ls shows endpoint and last problem
ghosty channels wa import <id> --from-file F | --from-dir DIR --own-number yes|no [--dry-run] # personal WhatsApp session, no QR
ghosty channels wa pair|status|pause <id> [--phone N]
ghosty channels wa groups ls|enable|disable|set|create <id> [group] [--role equipo|cliente] [--wake mention|all] [--dry-run] # personal WhatsApp groups
ghosty boards ls|create|assign|move-cards|access|rm <workspace|agent> … [--columns-from main] [--from A --to B --integration X --dry-run] [--add|--remove EMAIL --until 14d]
ghosty spaces members ls|add|rm <workspace> [email] [--role member|admin] [--until 2026-10-28|14d]
ghosty access why <email> <agent-id> | --workspace W --board B
ghosty cards ls <id> [--q TEXT] [--limit 20] # recent cards on its sales board
ghosty cards show <id> <folio|phone|id> [--limit 20] # a card's thread, attachments and whether gs kept a copy
ghosty cards archive <id> --integration X | --column X | --before 30d [--dry-run]
ghosty mcp get|set <id> [--file servers.json] # http headers accept ${turn.token} (per-turn key)
ghosty mcp connect <id> --name N --url https://… [--from-env VAR] [--no-open] # one remote MCP by URL; OAuth in the browser if it asks
ghosty try <id> "message" [--session] [--reset]
ghosty try <id> "message" --waba --session PHONE [--media FILE [--as-formmy]] [--history FILE] # real WhatsApp path, nothing sent
ghosty try <id> --replay FILE --out DIR [--max 15] [--concurrency 8] [--resume]
ghosty chat <id> ["message"] [--conversation ID]
ghosty conversations ls <id>
ghosty conversations show <id> <conversation-id> [--limit 20] # what was said
ghosty conversations continue|model|share <id> <conversation-id> [model] [--off] # new linked thread · its model · read-only link
ghosty conversations permission <id> <conversation-id> [allow|deny] [--id P] [--always] # what the turn waits for, and answer it
ghosty conversations subagents <id> <conversation-id> [stop <task-id>] # its native subagents
ghosty schedule add <id> "what to do" --in 30m | --at ISO [--every 12h --until ISO] [--conversation ID] [--title T]
ghosty schedule ls <id>
ghosty schedule rm <id> <schedule-id>
ghosty schedule add|ls|rm <id> … --teams <workspace>#<room>[/<thread-id>] # in a Teams room/thread: it answers there as if mentioned
ghosty teams post <workspace>#<room>[/<thread-id>] "msg" [--wait] # write there as you; any @agent it mentions answers
ghosty me files ls|get|export|upload|rm [--q TEXT] [--kind image|video|audio|document|other] [--cursor C]
ghosty me memories ls|add|edit|rm
ghosty me docs ls|get|export|check|tts|restore <doc> # editable docs your agents delivered: versions, PDF/Markdown, spelling, read aloud [--rev N]
ghosty conversations archive|rm <id> --kind test|channel|personal [--before 7d] [--dry-run]
ghosty agents docs dedupe [--dry-run] # your account: merge documents with the same content
# Ghosty staff
ghosty conversations ls --user EMAIL [--since 30d] · conversations show <id> <conv> --why|--tools
ghosty turns stats [--since 14d] [--all] · push log --user EMAIL [--since 2d]
ghosty support ls|show|reply --all [--status open|waiting_customer|resolved] · support resolve|reopen <id> · support link <id> <issue|PR>
ghosty staff ls [staff] [client] [--all] · staff assign|unassign <staff> <client> [--reason] # staff on client accounts (logged)
ghosty settings ls|set|unset <KEY> [value] # platform switches (+id/-id edits a list)
ghosty ads watch [ls] · ads watch run [--dry-run] # campaign watch: paused campaigns, billing, token, numbers without ad leads
ghosty agents doctor --user EMAIL [agent] [--turns 8] · usage --images [--plan free] [--by user]
ghosty novedades ls|create|set|test|send|rm [--title] [--body] [--image FILE] [--link] [--to] [--publish] [--at]
ghosty sites ls [--house] · sites publish <file.html|folder> [--title] [--slug S] [--site <slug|id>] · sites slug <slug|id> <new-slug> # house sites on EasyBits
ghosty credentials ls|set|rm [provider] [--from-env VAR] # never as an argument
ghosty connectors ls|connect|disconnect [id] [--q TEXT] [--from-env VAR] [--no-open] # Shopify, Stripe, monday…
ghosty support open --title T --body TEXT · support ls | show <id> | reply <id> --body TEXT # ask Ghosty for help; answered by email
ghosty browser logout # revoke your terminal agents' browser tokens and disconnect Ghosty for Chrome
ghosty audit ls [--workspace SLUG] [--agent ID] [--actor EMAIL] [--action A] [--since 24h] [--limit N] # who changed what
ghosty factory rooms repos # the repos your GitHub App sees, and where they're connected
ghosty factory rooms connect owner/name --room R --create # set up the factory for a repo from the terminal
ghosty factory sprints ls|show|approve ID # the sprints @plan proposes for a bigger goal; approve signs every ticket at once
ghosty factory env ls|push [OWNER/REPO] [.env.preview] # the preview's env vars: what's missing, push them from your .env (--gen for random keys)
ghosty factory runs recheck <run> # escalated because blocked: @check reviews the same PR again, no @build loop
ghosty factory run "…" --repo owner/name [--wait] # hand a request to the Software Factory from the terminal
ghosty factory runs watch|approve|changes|merge|card <run> # wait for it and decide it without opening Teams
ghosty factory runs ls|show|why|stats|rename [--workspace SLUG] [--room R] [--status S] [show --timing] [why --refresh] # Software Factory runs
ghosty docs
ghosty partner ls|enable|credentials|agent|tenants|audit|try # one agent for each of YOUR customers: ghosty partner --help
ghosty demos try <slug> "message" ["message 2"…] [--new] [--recycle-between --agent X] # try a public demo as a visitor
ghosty demos history <id> [--since 2d] [--session web:…] [--timeline] [--full] # what demo visitors did (Ghosty staff)Global: --json (stdout is JSON only), --token <token> / GHOSTY_TOKEN (a gat_… agent token reaches only that agent), --profile <name> / GHOSTY_PROFILE (a separate saved session, e.g. one per account), --yes, --help, --version. Env: GHOSTY_URL, XDG_CONFIG_HOME, NO_COLOR, GHOSTY_NO_UPDATE_CHECK; partner commands sign with GHOSTY_PARTNER_KEY + GHOSTY_PARTNER_KEY_SECRET when set (GHOSTY_PARTNER_SECRET is the old name).
Aliases: creds = credentials, db = dbs, dbs sql = dbs query.
Every command has its own help with examples: ghosty <command> --help or ghosty help <command>.
Exit codes: 0 ok · 1 API error · 2 usage error · 3 not signed in.
Changes in 0.75.0
ads watch [ls]andads watch run [--dry-run](staff): the campaign watch. Every hour gs checks the connected Meta ad accounts and the ads-only WhatsApp numbers and alerts staff once when an active campaign is paused or stops delivering, the account has a payment pending, the Meta token expires within 7 days, or a number goes 24 h without ad leads.
Changes in 0.73.0
factory rooms ls|repos|connect|disconnect:reposlists what your GitHub App sees (newest first) and the rooms each repo is in. set up the factory for a repo without opening Teams.connect owner/repo --room R --createcreates the room, connects the repo (only if your GitHub App sees it) and tells you how ready it is for agents.
Changes in 0.72.0
factory run "…" --repo owner/name [--wait]: hand a request to the Software Factory from the terminal (it posts «@plan …» in the repo's room under your name).--waitandruns watch <run>return when the run needs you and print the next command;runs approve <run> --plan-version N,runs changes <run> --note "…",runs merge <run>andruns card <run>decide it without opening Teams.
Changes in 0.71.0
channels mteams ls|connect|zip|on|off|rm: your agent as a Microsoft Teams bot through an Azure Bot in the client's tenant (no app store).lsnow shows the bot's last problem (token rejected, send failed, app uninstalled), also in--jsonaslastError/lastErrorAt.
Changes in 0.70.0
agents set --web-search on|off,--chat-starters "a|b"(suggestions in the agent's OWN chat; the widget's stay inagents embed --starters, andagents set --startersnow says so),--channel-roles teams=equipo,programado=cliente,--extensions developer=offand--email-any on|off(owner only).mcp connect <id> --name N --url https://… [--from-env VAR] [--no-open]: one remote MCP by its URL, without writing servers.json; if it asks for OAuth, the sign-in opens in the browser and gs adds it when you finish.conversations continue|model|permission|share|subagents <id> <conv>: carry on in a new linked thread, change its model, answer a permission the turn is waiting for (allow|deny,--always,--id), share it read-only (--off), list or stop native subagents.chatnow prints each permission request with the command to answer it.turns jobs <id>: background jobs from your chats (video, audio, captions, downloads; 24 h). Read-only: stop them withturns cancel; repeating work isschedule --every.me docs ls|get|export|check|tts|restore <doc>: the editable docs your agents deliver (id or /app/docs/… link): versions, PDF/Markdown, spelling, read aloud.agents token rotate|revoke <id>(owner only),agents memory …(its team's rules and its promos) andagents transfer <id> --to EMAIL | --workspace SLUG|none [--dry-run], on newapi/v2routes.channels whatsapp|messenger connect <id>andplan open [workspace|personal]open the right page in the browser (Meta sign-in and billing stay on the web).- README: login/logout, support, browser, audit, factory, staff and settings were missing.
Changes in 0.69.0
factory runs whyputs an unmet plan criterion on top (approved_unmet_criterion): approved without the preview a criterion asked for, merged without preview, smoke failed on the merged commit, or a CI criterion approved with CInone. Each one is listed with the criterion's text and the evidence (acceptance[]in--json). A saved analysis is redone if the run had events after it.
Changes in 0.68.0
- New
spaces members ls|add|rm <workspace> [email]: a workspace's people without the Members screen (owner, admin or staff).--role adminlets them invite and remove;--until 2026-10-28or--until 14dgives a temporary seat that is removed automatically — for reviewer accounts (Meta, Google, Apple). - New
boards access <workspace> [board]: who sees a board, and--add/--removeon its «only these people» list (--restrictturns a whole-workspace board into a list,--everyoneopens it back;--untilworks here too). - New
access why <email> <agent-id>(or--workspace W --board B): every reason someone sees an agent or a board, and when temporary access expires.
Changes in 0.66.0
usage --agent <id> --by visitor: /c without an account, one row per visitor — USD, messages, page/PDF and whether they created an account — with USD per visitor and per new account.
Changes in 0.65.0
agents show <id>: alias ofagents get.agents doctor <id>prints the agent's card above the checks: engine, model, effort (FLEET_EFFORT), native subagents, whether it answers /c without an account and, for staff, its box size (infoin--json).turns ls <id> --canal anon|messenger|whatsapp|…: every row says its channel (canal; older rows deduced from the session key).usage --agent <id> [--by model,day,canal] [--cost]: one agent's tokens and USD at the provider's list price (what it would cost on the API).agents ls --json:modeland the workspace slug on every row.
Changes in 0.64.0
agents box <id> --start: start (or wake) the agent's box now, without spending a turn. Within the plan's boxes (503 if the space is full); the next turn uses that box.
Changes in 0.63.0
settings ls | set <KEY> <value|+id|-id> | unset <KEY>(staff): platform switches without a deploy — who answers /c without an account in a box (ANON_NATIVE_AGENT_ID), native subagents by agent and surface, the page builder for everyone. Logged.agents set <id> --box 4096:10(staff): its box's RAM and conversations at once.
Changes in 0.62.0
support link <id> <owner/repo#12 | URL>(staff): ties a case to the GitHub issue or PR that fixes it; when it closes, every tied customer gets "fixed" by email.
Changes in 0.61.0
support open --title T --body TEXT: ask Ghosty for help; we answer by email and replying to that email adds to the case.support ls | show <id> | reply <id>follow your cases. Staff:support ls|show|reply --all,support resolve|reopen <id>.
Changes in 0.60.0
agents archive <id>/agents restore <id>: archive an agent (it stops answering on every channel and leaves the lists; deleted automatically after 7 days) or bring it back as it was.agents ls --archivedlists archived agents and when they get deleted.
Changes in 0.59.0
spaces archive <workspace>/spaces restore <workspace>: archive a workspace (same as Settings → Archive: it leaves/appandspaces ls; agents and data stay) or bring it back. Owner or staff; dry run first, archiving asks you to type the slug; logged asworkspace.archive/workspace.restore.spaces lsno longer lists archived workspaces you are a member of (same as/app).
Changes in 0.58.1
agents docs add|replace --filesends the file type from its extension. Before, the server stored every CLI upload asapplication/octet-stream, and a PDF reached WhatsApp customers as.bin.
Changes in 0.57.1 (0.57.0 + the 0.56.1 factory fix)
sites pin <slug>/sites unpin <slug>/sites pins [--cancel|--resume]: «Pinned sites» — $49 USD/yr or $5 USD/mo ($990 / $99 MXN), includes up to 3 sites per pack; a pinned site never pauses and has no banner.--interval year|month,--currency usd|mxn,--add-pack.sites lsshows each site's state (pinned, paused, pauses on…).
Changes in 0.56.0
factory runs why <run> [--refresh]: why a run got stuck or failed — category, impact, the critical step with its evidence and what to change next time (a healthy run doesn't call the model). It first checks the approved plan's criteria against the verdict: a criterion "in the preview" approved without the preview ready comes out on top asapproved_unmet_criterion.factory runs show --timinglists stuck patterns (a command open 8+ min, the same command repeated, errors in a row, going back and forth, apt install in a box);runs statscounts runs with stuck alerts.
Changes in 0.55.0
factory runs show <run> --timing: where a run's time and money went — each turn of each role (critic, @plan, @build, @check) with minutes, minutes in tools, model and USD; the clock split into working, waiting for a person and the rest (CI, queues); and the commands that took 60 s or more.factory runs stats [--since 30d] [--repo owner/repo]: runs, % merged, median minutes to PR and to merge, @check→@build loops, red CI per run, and cost per run and per merged PR.factory runs lsshows each run's time and cost.
Changes in 0.54.0
agents embed <id> --copy '{json}'|noneand--copy-file texts.json: the phrases the web widget shows while the agent works (waking,connecting,thinking— 1–8 that rotate —,stillWorking,cantStart,interrupted,retryLabel, plain text ≤ 80 chars) and whether it shows the duration and the Copy button (showDuration,showCopyButton). Patch per key;null= Ghosty's phrase.agents embed <id> themeexportscopytoo, and--outbakes it into the component.
Changes in 0.53.0
agents embedprints the React snippet (reactin--json) and--out <file.jsx|.tsx> [--force]writes your own dependency-free chat component with your token and theme.
Changes in 0.52.0
agents embed <id>customizes the web widget:--title,--subtitle,--avatar URL|none,--icon chat|avatar|ghost,--placeholder,--position right|left,--offset X[,Y],--theme light|dark|auto,--bubble-text,--auto-open S|off,--starters "a|b"(up to 4 of yours; Ghosty's never show). The pasted<script>doesn't change.- Fine style without free CSS:
--style '{json}'|none(fontFamily from a Google Fonts allow-list, radius 0–24, header/bubble/input/send/launcher colors, titleUppercase, statusDot, sendArrow, typing, typingColor), shortcuts--font,--radius,--typing bounce|flow|flashing|shimmerand--typing-color. - Theme source:
--theme-source teams(your Ghosty Teams workspace brand,--workspace SLUG) or--theme-source site --site-url URL(your site's CSS colors), imported as editable values.agents embed <id> themeexports it as JSON;--style-file theme.jsonapplies it back.
Changes in 0.51.0
agents embed enable|disable <id> [--domains a.com,*.b.com] [--per-visitor N] [--per-ip N] [--welcome T] [--color #hex] [--rotate]: the web widget, a chat bubble with the agent on your own site (one<script>), loading only on the domains you list; each visitor gets an isolated conversation and talks as a customer. Claude or MiniGhosty (ghosty-lite) engine only. No flags = state + the snippet.
Changes in 0.50.0
cards pause|resume <id> <card> [--mode 30min|2h|24h|until_tomorrow|permanent]: the thread's pause menu; resume also lifts "operator only" and doesn't answer by itself. Logged.cards reply <id> <card> [--directive TEXT]("Ask for a reply") andcards pending <id> [--since 2d|ISO] [--reply] [--dry-run]: conversations whose last message is the customer's, flagged when they must not be answered (paused, escalated, outside the 24 h window, only a reaction, not WhatsApp Business, number without agent).channels whatsapp integrationsshows who answered each number last;--orphansandchannels messenger ls [--orphans]list numbers/pages nobody answers today that had turns.agents set --prompt-patch overlay.json/--prompt-append FILE [--dry-run]: change one piece of the prompt on the server's current copy (dry run prints the diff).audit ls [--workspace] [--agent] [--actor] [--action] [--since]: the audit log. The agent page's Save and channel changes are logged now.factory runs ls|show|rename(a workspace's Software Factory runs) andagents ls --handle build. Since 0.55:show --timingandstats.
Changes in 0.49.0
dbs export <id> <db> [--table T] [--out FILE]: download a database — the whole thing as.sqlite(sqlite3, DB Browser, DBeaver) or one table as CSV (Excel). Same buttons on each database's page in /app/datos.me files export [--out DIR] [--kind K] [--dry-run]: download every file in your account intodocuments/,conversations/andlibrary/; rerunning only brings what's new.
Changes in 0.48.0
agents teams on <id> <workspace> --factory plan,build,check: make an agent those Software Factory roles in that workspace (same as «Team» in /factory; each role keeps its name and avatar).agents teams lsshows the roles it holds.
Changes in 0.47.0
agents set --quotetakes VAT rules for the housecotizartool:iva-incluido=true(prices already include VAT),iva.CATEGORY=16(VAT for that category),solo-factura=true(VAT only when the customer asks for an invoice).- New
agents set --catalog products.csv|json: the housecotizartool's catalog (sku, nombre, precio, unidad, categoria). The category comes from here, not from the model.
Changes in 0.46.0
- New
staff ls|assign|unassign <staff-email> <client-email>(Ghosty staff): a staff member assigned to a client account sees and runs its agents (with or without a workspace), documents, databases and boards as themselves — no keys, billing or transfers, every write logged. The client sees «Your Ghosty account manager».
Changes in 0.45.0
- New
turns grep <id> "text" [--since 7d] [--role user|agent]: finds what the customer or the agent said, with its turn, to open withturns show. - New
agents set --quote iva=0,prefix=SFI,vigencia=15: config of the housecotizartool (issuer, VAT, folio prefix, validity…);agents get --fields cotizacionreads it. - New
spaces log <workspace> [--since 30d] [--action workspace]: the workspace log (transfers, staff in/out, renewals). Owner or staff. agents doctorflags skills the prompt names that the agent doesn't have (or has off), and an own skill named like a house tool that is still on.spaces transferonly changes the owner: documents, databases, boards and numbers its agents use move with it (anything also used outside stays and is listed);--copy-keysalso copies the connectors they lack.files lson pool agents says it lists knowledge files and where skills and prompt are;turns lsshows «1st turn» instead of «new» (a new SDK session, not a memory loss).
Changes in 0.44.0
- New
connectors ls|connect|disconnect: the connectors of your account (Shopify, Stripe, monday, Mercado Libre…), the same as/app/connectors.connectopens the browser for OAuth (--no-openprints the URL) or asks for the key fields (hidden,--from-env VARor stdin). Thenagents set <id> --connect <connector>gives it to an agent.
Changes in 0.42.0
agents teams offnow pauses the agent in that workspace (it keeps its@handle;onresumes it).agents teams rm <id> <workspace> [--yes]removes it and frees the handle.lsshowspausedand the workspaces where it was activated by someone else (read-only). Without--handle,onreuses the handle it already has in your other workspaces.
Changes in 0.41.1
agents teams: the agent can be given by name (0.41.0 readls/on/offas the agent).
Changes in 0.41.0
agents teams ls <id>: the Teams workspaces you administer, with the@handleit answers with in each (or the suggested one).agents teams on <id> <workspace> [--handle x]turns it on there, or changes its handle if it was already on;agents teams off <id> <workspace>turns it off (the agent stays). Same rules as the agent page (Channels → Ghosty Teams):@ghostyis reserved, a taken handle is rejected.
Changes in 0.40.0
sites ls [--house]: the sites your agents published (or, staff, Ghosty's house sites).sites publish <file.html|folder> [--title] [--slug S] [--site <slug|id>](staff) publishes a house site on EasyBits — no owner, no expiry, no banner;--siteupdates one.sites slug <slug|id> <new-slug>(staff) changes a site's slug. Slug errors come with a code:slug_invalid,slug_taken,slug_unsupported(EasyBits doesn't accept a slug yet; nothing changes, exit 1).
Changes in 0.39.0
spaces transfer <workspace> --to EMAIL [--keep-as admin|member|none] [--copy-keys](staff): hands a workspace to a new owner in one step. Its agents go with it and spend the new owner's key, so--copy-keyscopies the ones they lack (the dry run lists what's missing); the previous owner keeps the role you pick, and the agents' boxes are recycled so the new owner shows up everywhere.
Changes in 0.38.0
spaces set <workspace> --model-cap 0.25|1|4|none --house-claude on|off(staff): the most expensive model a workspace can pick, and whether its agents run on Ghosty's Claude. Both used to be only in /admin/tenants; a trial caps at 0.25 and Claude doesn't fit.partner credentials create|rotate --out-env PATH: Node 22 swallows--env-fileas its own flag (node: ./.env.partner: not found) even after the script.--env-filestill works as an alias where your Node lets it through.- Docs and help use one name for the secret:
GHOSTY_PARTNER_KEY_SECRET(GHOSTY_PARTNER_SECRETis the old name and still works).
Changes in 0.35.0
spaces create <slug> [--dry-run]: create a workspace of your own from the terminal (trial, same rules as the web form). Thenpartner enable <slug>.mcp set: anhttpserver's headers accept${turn.token}, filled per turn with theturnTokenthatmessage-stream/turnsreceive (one key per end user; the token never reaches the box).partner --help: thegpk_/gps_pair also signsmessage-streamfor the normal agents of the partner's workspace.
Changes in 0.33.0
- Staff:
agents doctor --user EMAIL(their agents: doctor, latest turns and whether the app picked up each answer, plan/bag, boxes with duplicates flagged),usage --images [--plan free] [--by user](image charges vs deliveries, real cost vs the table),conversations show <agent> <conv> --tools(every tool it ran, secrets masked, and the external domains it named). agents ls --user --appalso lists their phones with the app build.novedades lsshows how many FCM delivered and rejected; announcement pushes show up inpush log.novedades create|set --min-version N: if the app is older, its button reads «Actualizar».turns statsbreaks down by channel (Teams and A2A included).schedule add --conversation wa:<jid>answers in that WhatsApp group/chat.channels wa pairwarns that in Mexico52…and521…are different accounts.channels wa groups set <agent> <group> --wake mention|all: inmention(default when you turn a group on) the agent only answers when @-mentioned, named or replied to; the rest reaches it as context.lsshows the column.channels wa groups enable|disablenow work (they were in the help but got rejected).
Changes in 0.31.0
spaces ls [--user EMAIL]; staff:spaces join|leave <workspace>andspaces set <workspace> --combo sales(workspacesis an alias).boards createwarns when the workspace has no Sales (nobody would see the board).channels whatsapp history --dry-run --list(which conversations, whether from an ad),--only-ads,--phones a,b,--column NAME;channels whatsapp link --ads-only on|off(also alone, on a linked number) andwhatsapp lsshows it.- After a
--dry-run, the suggested command already carries--yeswhen there's no terminal. A 404 says it may be missing access. - Staff:
agents ls --user EMAIL --app all|android|ios|desktop(their list as their app gets it),usage --boxes --by template(whole fleet). - The «new version» notice checks npm every hour (it was once a day).
Changes in 0.30.0
- Support (Ghosty staff):
conversations ls --user EMAIL,conversations show <agent> <conv> --why(who sees it and why),turns stats(real failure rate),push log --user EMAIL,novedades ls|create|set|test|send|rm(Android app announcements,--image FILE). conversations archive|rm <agent> --kind test|channel [--before 7d]: clean an agent's history (rm: tests only). Deleting an agent now also deletes its chat copy.agents docs dedupe: merge your documents with the same content (keeps every agent's access);dedupe <keep> <drop>for two by hand.me files ls --q TEXT [--cursor],me files get <id> [--out],chat --file <id>(attach from your files).channels wa groups set <agent> <group> --name "…".
Changes in 0.29.0
agents ls --engine E --ids(ids only, forxargs); staff:agents ls --sponsor EMAIL | --owner EMAILlists any account's agents, andagents get|set|boxwork on them by id (logged).try --media FILEandchat --media FILEattach files as from the app (no--wabaneeded).turns cancel <agent> <conversation>: stops the turn AND that conversation's background jobs (video, subagents, pending wake-ups).agents box --recycleon Ghosty · Lite / Goose recreates its box with the current image (--reenv,--force);agents set --prompt-mode append|replace.
Changes in 0.28.0
ghosty demos try <slug> "…": try a public demo as a visitor from the terminal (keeps the thread;--new;--recycle-between --agent Xchecks memory across boxes).ghosty demos history <agent>(Ghosty staff): visitors' turns, messages, files and clones,--timeline.turns ls --session S, and on Claude agents a «resumed» column: ✓ when the turn kept its SDK session, ⚠ from scratch (orphan|stale|replaced) when it lost its memory.turns showsays the same, with the Claude CLI version.partner credentials create|rotate --env-file PATH(mode 600, nothing printed) or--format env(pipe tofly secrets import). The secret's env var is nowGHOSTY_PARTNER_KEY_SECRET(GHOSTY_PARTNER_SECRETstill works).partner agent apply --prompt-file prompt.md;partner try --verboseprints each tool's arguments and milliseconds.partner agent get|apply --agent SLUGandpartner try --agent SLUG: several agents per partner (e.g.nik-admin,nik-public).channels whatsapp link … --partner-tenant <externalId> --partner-agent <slug>: a business's WhatsApp Business number answered by that partner agent.partner waba links ls|create|set|rm: a business's WhatsApp Business number in Formmy pointed at a partner agent (url + secret, no partner keys).partner wa groups ls|create|link|unlink: WhatsApp groups of a partner agent's own number (e.g.nik-admin), each linked to a business.- Empty
partner ls|credentials ls|tenants lssay what to do next.login --device --profile <client>explains how to sign in a client's account (they approve the link).
Changes in 0.27.1
- A 404 with a reason (no such bag, room or thread) prints that reason instead of a generic «Not found».
Changes in 0.27.0
schedule add <id> "…" --teams <workspace>#<room>[/<thread-id>] --at ISO | --in 30m: at that time the agent answers in that Teams room or thread as if mentioned (with the room's memory).schedule ls|rm <id> --teams <workspace>.
Changes in 0.26.0
ghosty engines ls [--models]: engines and models valid for--engine/--model; an unknown model is rejected with the valid list (also without--engine).ghosty bags ls|create|set|rm <workspace>: token bags, monthly or one-time (--recurring off);agents set --bag NAME|nonehangs an agent on one. Changing them is Ghosty staff only.ghosty spaces renew <workspace> --until DATEandspaces rename <old> <new>(staff, logged in the workspace's audit).ghosty usage --workspace SLUG --by agent,day: turns, failed, billable tokens and «no balance» per agent and day;turns ls --workspace SLUG --quota-hitslists those messages (WhatsApp Business and Teams).agents set --tool [channel:]tool=on|off,--avatar URL|FILE(its face in Teams);agents rm --from-workspaceturns it off in Teams before deleting it.dbs importasks you to type the database name when a replace leaves a table empty or loses more than half its rows.
Changes in 0.9.1
ghosty agents --helpdescribes everyagents demoflag;ghosty usage --helphas its own page.- "Learn more" links point to the exact section of https://www.ghosty.studio/docs/cli/comandos;
partner --helplinks to /docs/cli/partners.
Changes in 0.9.0
try --waba: a test turn through the real WhatsApp Business path (inherited context, price rule, board, voice decision). It prints what it would have sent (text, voice note, files) and sends nothing.--mediafor photos/audio/PDF and--historyto seed what was said before.--whatsappis now an alias.try --replay FILE --out DIR: replays real conversations from your machine. The report is written after every step, survives Ghosty deploys (it honorsRetry-After), and--resumecontinues a partial run.agents doctorspeaks English like the rest of the CLI;channels whatsapp lsreturns a full URL.
Changes in 0.25.0
channels whatsapp historysays how many conversations arrive paused by Formmy (and how many "until 9999") or in manual mode;cards ls --pausedlists them.historyretries by itself on 502/503/504 or a dropped connection (a gs deploy mid-import) and says where it resumes.channels wa import --from easybits:<agent-id>: straight from EasyBits (no loose script); first prints whether the origin session is alive, its keys and groups. The keys stay in memory.
Changes in 0.24.2
channels whatsapp integrationsalso lists numbers the workspace already linked in gs (even if another Formmy account owns them); staff:--email.dbs renameanddbs rmalso work for Ghosty staff (migrations), not only the database's owner.
Changes in 0.24.0
dbs rename <agent> <db> <new> [--dry-run]: renames the database and rewrites every prompt, env value and SKILL.md that names it (the dry run lists them).dbs ls --orphans(databases no agent has) anddbs rm <agent> <db> [--dry-run] [--yes](deletes the whole database; owner only, same "Not deleted" error as the web).dbs importwith replace warns about rows that exist only in gs (a database shared with agents already writing there) before deleting them.channels whatsapp integrations <agent>: the owner's WhatsApp Business numbers in Formmy (number, name, who answers today, Integration id).channels whatsapp history --dry-runworks beforelink, to choose--daysbefore the cutover.turns ls --skipped: WhatsApp Business customer messages that did not open a turn, and why (operator active, records only, paused, reaction, channel off, no balance).agents create --prompt-filesays which prompt it applied instead of asking for one.
Changes in 0.22.0
try --wabaarchives its test card when it ends (--keepleaves it) and auto-stage no longer runs on tests.agents set --unset-env K1,K2.ghosty plan apply [workspace] [--dry-run]: apply a scheduled plan now, showing what changes (staff, or the owner without a subscription).agents boxshows capacity (conversations per box, boxes on, turns running, plan);ghosty usage --boxes [--workspace]: the workspace's boxes against its limit (spares, asleep) and per agent.channels whatsapp historyalso copies photos/PDFs/audio into gs (--mediare-copies missing ones; Formmy keeps files 7 days).
Changes in 0.21.0
- Catalog photos:
dbs tablesshows, per photo/link column, how many links are permanent (img.ghosty.studio), external or empty;dbs importwarns before replacing permanent links with external ones (and gives the exact--rehost-images);dbs photos put <agent> <db> --table T --key-column sku --dir photos/uploads loose photos (SKU-123.jpg → its row) to permanent links, with--dry-run.
Changes in 0.20.0
- Your language. Spanish with a Spanish locale (
LANG=es_*), English otherwise;--lang es|enorGHOSTY_LANGforces it. The server's messages are translated to English too.--jsonoutput is unchanged. - Tab completion:
ghosty completion zsh|bash|fish— commands, subcommands, flags and your agents' and workspaces' names.
Changes in 0.19.0
- The agent as a file.
ghosty agents export <agent> [--out DIR]writes its whole setup as YAML (recipe-compatible, secrets as${NAME}; with--out, its own skills too).ghosty apply <file|dir>shows a plan (+ ~ - !), asks and applies;--agent Xtargets another agent,--createmakes a new one,--prunealso removes what the file no longer lists. The current version is saved before applying.
Changes in 0.18.0
- One naming rule (like
gh): noun then verb; turning things on/off isenable|disable;on|offonly as a flag value.ghosty cards(an agent's board cards;boardstill works),skills enable|disable,agents demo enable|disable <agent>,channels wa groups enable|disable <agent> <group>,--expires(was--vence). Old forms still work and print the new one. - Help for
login,logout,whoami,docs,useandcards.
Changes in 0.17.0
- Agents by name everywhere:
ghosty agents get pia-0,ghosty try "Ghosty Ventas" "hola"(ids still work). Same-name agents: the one in theghosty useworkspace wins, otherwise the CLI lists their ids. ghosty use <workspace>: default workspace forboards,agents createandagents ls(--all,--workspace none,use --clear).
Changes in 0.16.1
agents create --like:--board same|main|new|NAME(new= its own board with the source's columns, one per number) and--no-notify(shared with the same people, no email).
Changes in 0.16.0
agents create --like <agent> [--copy-dbs] [--dry-run]: a new agent with another's setup (skills and their switches, toolsets, connectors, voice, databases, documents, board, shares), never its prompt, env or channels.skills house <id> --only a,b | --enable | --disable: Ghosty's skills in bulk.agents docs grant <id> A B …and--like <agent>.agents get --fields toolsets,connectors: effective toolsets and each connector (connected, granted, effective).boards ls|create|assign|move-cards: a workspace's boards, one per number if you like, with the columns of another and the cards moved over.
Changes in 0.15.0
try --wabalists everything the agent would send, tools included: 📍 location, 📄 files, 🎤 voice, ↩️ quotes, 🔘 buttons, 👤 contacts, reactions. Quotes and reactions now find the test message to point at.try --waba --media FILE --as-formmy: the attachment arrives like a real Formmy forward (proxy with credential, copy to gs, transcription) and the output says whether the copy worked.board ls(recent cards) andboard show <folio|phone|id>(a card's thread: who wrote, text, attachment, copy in gs).
Changes in 0.14.0
- Fix:
--jsonoutput over a pipe no longer gets cut at 64 KB (an 80 KB prompt came out as invalid JSON). The CLI now waits for stdout to drain before exiting. agents get --prompt-out FILE;agents create --workspace SLUG --channels …(born in a workspace, active in its Teams);agents set --toolsets;agents share|unshare|shares;agents docs add --url|--file;skills on|off.turns showprints what came in and what the agent answered, on any engine or channel (--fullfor the whole text).agents doctorflags databases the prompt names that the agent doesn't have (EasyBits ids left over from a migration).agents set --prompt-base <agent> --prompt-overlay overlay.json: a prompt derived from another agent's plus a JSON overlay of edits; it regenerates when the base changes (--prompt-base noneunlinks).channels whatsapp history: bring a WhatsApp Business number's recent cards, messages and orders from Formmy to the board.
Changes in 0.13.2
channels whatsapp lsshows the real number, "records only" numbers, and whether Formmy forwards to gs.whatsapp linkstores the number's name and phone.agents set --channels wa=on,teams=off(wa = personal WhatsApp).
Changes in 0.13.1
channels wa import --from-dir DIR: import a Baileys multi-file auth folder (creds.json+ one file per key, e.g. nanoclaw'sstore/auth); it undoes Baileys' file-name escaping per key type.
Changes in 0.13.0
- Migrate WhatsApp numbers without signing up again:
channels whatsapp link|unlink(a WhatsApp Business number that lives in Formmy;--answer on|offis required,--dry-runshows what changes in gs and in Formmy) andchannels wa import(a personal WhatsApp session exported from EasyBits, no QR). Alsochannels wa pair --phone(pairing code),wa statusandwa pause.
Changes in 0.12.0
- New:
channels wa groups ls|set|create: which groups of the agent's personal WhatsApp it answers, and asequipoorcliente. Turning a group on asks first (--yeswithout a terminal);--dry-runshows the plan.
Changes in 0.11.0
- New:
conversations show(what was said in a conversation;--limit 0for all).
Changes in 0.10.0
- Tells you when a new version is out (checks npm once a day, on stderr;
GHOSTY_NO_UPDATE_CHECK=1orCIturns it off). An unknown option on an old version says to update. skills getwithout--outonly lists the files; with--outit prints the absolute path. It no longer writes into the current folder silently.- New:
turns show(timeline of one turn),skills templates(pdf-doc templates and their source),agents box(check / recycle the machine serving an agent). agents getincludesenv(secret-looking values masked).
Changes in 0.8.0
- Destructive commands (
agents rm,files rm,skills rm,credentials rm,board archive,dbs importover existing rows,channels whatsapp enable) ask first. Without a terminal they need--yesor exit2. skills rmkeeps a local copy under~/.config/ghosty/trash/and prints the undo command.- New:
agents doctor,agents docs,dbs,turns,channels whatsapp,board archive,credentials,skills get,skills add --dir, voice and auto-stage flags onagents set, per-command help and "did you mean".
Requires Node 22+. Docs: https://www.ghosty.studio/docs/cli · Skill for coding agents: npx skills add https://www.ghosty.studio
