npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@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.

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 login

ghosty 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] and ads 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: repos lists 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 --create creates 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). --wait and runs 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> and runs 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). ls now shows the bot's last problem (token rejected, send failed, app uninstalled), also in --json as lastError/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 in agents embed --starters, and agents set --starters now says so), --channel-roles teams=equipo,programado=cliente, --extensions developer=off and --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. chat now 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 with turns cancel; repeating work is schedule --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) and agents transfer <id> --to EMAIL | --workspace SLUG|none [--dry-run], on new api/v2 routes.
  • channels whatsapp|messenger connect <id> and plan 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 why puts 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 CI none. 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 admin lets them invite and remove; --until 2026-10-28 or --until 14d gives a temporary seat that is removed automatically — for reviewer accounts (Meta, Google, Apple).
  • New boards access <workspace> [board]: who sees a board, and --add / --remove on its «only these people» list (--restrict turns a whole-workspace board into a list, --everyone opens it back; --until works 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 of agents 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 (info in --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: model and 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 --archived lists 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 /app and spaces ls; agents and data stay) or bring it back. Owner or staff; dry run first, archiving asks you to type the slug; logged as workspace.archive / workspace.restore.
  • spaces ls no longer lists archived workspaces you are a member of (same as /app).

Changes in 0.58.1

  • agents docs add|replace --file sends the file type from its extension. Before, the server stored every CLI upload as application/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 ls shows 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 as approved_unmet_criterion.
  • factory runs show --timing lists 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 stats counts 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 ls shows each run's time and cost.

Changes in 0.54.0

  • agents embed <id> --copy '{json}'|none and --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> theme exports copy too, and --out bakes it into the component.

Changes in 0.53.0

  • agents embed prints the React snippet (react in --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|shimmer and --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> theme exports it as JSON; --style-file theme.json applies 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") and cards 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 integrations shows who answered each number last; --orphans and channels 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) and agents ls --handle build. Since 0.55: show --timing and stats.

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 into documents/, conversations/ and library/; 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 ls shows the roles it holds.

Changes in 0.47.0

  • agents set --quote takes VAT rules for the house cotizar tool: 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 house cotizar tool'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 with turns show.
  • New agents set --quote iva=0,prefix=SFI,vigencia=15: config of the house cotizar tool (issuer, VAT, folio prefix, validity…); agents get --fields cotizacion reads it.
  • New spaces log <workspace> [--since 30d] [--action workspace]: the workspace log (transfers, staff in/out, renewals). Owner or staff.
  • agents doctor flags 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 transfer only changes the owner: documents, databases, boards and numbers its agents use move with it (anything also used outside stays and is listed); --copy-keys also copies the connectors they lack.
  • files ls on pool agents says it lists knowledge files and where skills and prompt are; turns ls shows «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. connect opens the browser for OAuth (--no-open prints the URL) or asks for the key fields (hidden, --from-env VAR or stdin). Then agents set <id> --connect <connector> gives it to an agent.

Changes in 0.42.0

  • agents teams off now pauses the agent in that workspace (it keeps its @handle; on resumes it). agents teams rm <id> <workspace> [--yes] removes it and frees the handle. ls shows paused and the workspaces where it was activated by someone else (read-only). Without --handle, on reuses 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 read ls/on/off as the agent).

Changes in 0.41.0

  • agents teams ls <id>: the Teams workspaces you administer, with the @handle it 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): @ghosty is 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; --site updates 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-keys copies 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-file as its own flag (node: ./.env.partner: not found) even after the script. --env-file still 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_SECRET is 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). Then partner enable <slug>.
  • mcp set: an http server's headers accept ${turn.token}, filled per turn with the turnToken that message-stream/turns receive (one key per end user; the token never reaches the box).
  • partner --help: the gpk_/gps_ pair also signs message-stream for 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 --app also lists their phones with the app build. novedades ls shows how many FCM delivered and rejected; announcement pushes show up in push log.
  • novedades create|set --min-version N: if the app is older, its button reads «Actualizar». turns stats breaks down by channel (Teams and A2A included).
  • schedule add --conversation wa:<jid> answers in that WhatsApp group/chat. channels wa pair warns that in Mexico 52… and 521… are different accounts.
  • channels wa groups set <agent> <group> --wake mention|all: in mention (default when you turn a group on) the agent only answers when @-mentioned, named or replied to; the rest reaches it as context. ls shows the column.
  • channels wa groups enable|disable now work (they were in the help but got rejected).

Changes in 0.31.0

  • spaces ls [--user EMAIL]; staff: spaces join|leave <workspace> and spaces set <workspace> --combo sales (workspaces is an alias). boards create warns 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) and whatsapp ls shows it.
  • After a --dry-run, the suggested command already carries --yes when 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, for xargs); staff: agents ls --sponsor EMAIL | --owner EMAIL lists any account's agents, and agents get|set|box work on them by id (logged).
  • try --media FILE and chat --media FILE attach files as from the app (no --waba needed).
  • turns cancel <agent> <conversation>: stops the turn AND that conversation's background jobs (video, subagents, pending wake-ups).
  • agents box --recycle on 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 X checks 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 show says the same, with the Claude CLI version.
  • partner credentials create|rotate --env-file PATH (mode 600, nothing printed) or --format env (pipe to fly secrets import). The secret's env var is now GHOSTY_PARTNER_KEY_SECRET (GHOSTY_PARTNER_SECRET still works).
  • partner agent apply --prompt-file prompt.md; partner try --verbose prints each tool's arguments and milliseconds.
  • partner agent get|apply --agent SLUG and partner 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 ls say 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|none hangs an agent on one. Changing them is Ghosty staff only.
  • ghosty spaces renew <workspace> --until DATE and spaces 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-hits lists those messages (WhatsApp Business and Teams).
  • agents set --tool [channel:]tool=on|off, --avatar URL|FILE (its face in Teams); agents rm --from-workspace turns it off in Teams before deleting it.
  • dbs import asks 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 --help describes every agents demo flag; ghosty usage --help has its own page.
  • "Learn more" links point to the exact section of https://www.ghosty.studio/docs/cli/comandos; partner --help links 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. --media for photos/audio/PDF and --history to seed what was said before. --whatsapp is 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 honors Retry-After), and --resume continues a partial run.
  • agents doctor speaks English like the rest of the CLI; channels whatsapp ls returns a full URL.

Changes in 0.25.0

  • channels whatsapp history says how many conversations arrive paused by Formmy (and how many "until 9999") or in manual mode; cards ls --paused lists them.
  • history retries 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 integrations also lists numbers the workspace already linked in gs (even if another Formmy account owns them); staff: --email.
  • dbs rename and dbs rm also 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) and dbs rm <agent> <db> [--dry-run] [--yes] (deletes the whole database; owner only, same "Not deleted" error as the web).
  • dbs import with 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-run works before link, to choose --days before 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-file says which prompt it applied instead of asking for one.

Changes in 0.22.0

  • try --waba archives its test card when it ends (--keep leaves 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 box shows 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 history also copies photos/PDFs/audio into gs (--media re-copies missing ones; Formmy keeps files 7 days).

Changes in 0.21.0

  • Catalog photos: dbs tables shows, per photo/link column, how many links are permanent (img.ghosty.studio), external or empty; dbs import warns 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|en or GHOSTY_LANG forces it. The server's messages are translated to English too. --json output 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 X targets another agent, --create makes a new one, --prune also 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 is enable|disable; on|off only as a flag value. ghosty cards (an agent's board cards; board still 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, use and cards.

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 the ghosty use workspace wins, otherwise the CLI lists their ids.
  • ghosty use <workspace>: default workspace for boards, agents create and agents 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 --waba lists 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) and board show <folio|phone|id> (a card's thread: who wrote, text, attachment, copy in gs).

Changes in 0.14.0

  • Fix: --json output 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 show prints what came in and what the agent answered, on any engine or channel (--full for the whole text).
  • agents doctor flags 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 none unlinks).
  • 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 ls shows the real number, "records only" numbers, and whether Formmy forwards to gs. whatsapp link stores 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's store/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|off is required, --dry-run shows what changes in gs and in Formmy) and channels wa import (a personal WhatsApp session exported from EasyBits, no QR). Also channels wa pair --phone (pairing code), wa status and wa pause.

Changes in 0.12.0

  • New: channels wa groups ls|set|create: which groups of the agent's personal WhatsApp it answers, and as equipo or cliente. Turning a group on asks first (--yes without a terminal); --dry-run shows the plan.

Changes in 0.11.0

  • New: conversations show (what was said in a conversation; --limit 0 for 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=1 or CI turns it off). An unknown option on an old version says to update.
  • skills get without --out only lists the files; with --out it 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 get includes env (secret-looking values masked).

Changes in 0.8.0

  • Destructive commands (agents rm, files rm, skills rm, credentials rm, board archive, dbs import over existing rows, channels whatsapp enable) ask first. Without a terminal they need --yes or exit 2.
  • skills rm keeps 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 on agents 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