CLI

Referencia de comandos

Todos los comandos del CLI de Ghosty con ejemplos (agentes, canales, conectores, credenciales, turnos, sitios, navegador), opciones globales y códigos de salida.

Actualizado 2026-10-10

Todos aceptan --json y --help (ghosty skills --help y ghosty help skills enseñan el uso y los ejemplos de ese comando). <id> es un agente: su nombre (ghosty agents get pia-0, sin importar mayúsculas) o su id (sale en ghosty agents ls). Si varios se llaman igual, gana el del espacio de ghosty use; si aún son varios, el CLI enseña los ids para elegir.

Regla de nombres (como gh): sustantivo y luego verbo (ghosty cards show, ghosty boards create); prender o apagar algo es enable / disable (ghosty skills disable <id> pdf-doc); on / off sólo como valor de una opción (--sponsor on). Las formas viejas (board, skills on|off, --on/--off, --vence) siguen funcionando y avisan cuál es la nueva.

Sesión

ComandoQué hace
ghosty loginAbre el navegador y entra con tu cuenta (OAuth2).
ghosty login --deviceEntra desde otro dispositivo con liga + código (automático por SSH o CI).
ghosty login --device --profile <cliente>Opera la cuenta de OTRA persona (un cliente): le mandas la liga y el código, ella aprueba, y la sesión queda en ese perfil. Úsalo con --profile <cliente>; ghosty logout --profile <cliente> la revoca.
ghosty logoutCierra la sesión y la revoca en el servidor.
ghosty whoamiCon qué correo estás. Con --json trae también el plan de tu cuenta.
ghosty usageTu plan y cuánto llevas usado esta semana y este mes (también ghosty me usage). Ver .
ghosty use <espacio>Espacio por default: boards lo toma sin escribirlo, agents create nace ahí (--workspace none para uno personal) y agents ls enseña sólo los de ahí (--all para todos). ghosty use dice cuál; --clear lo quita. Va por perfil (--profile).

Agentes

bash
ghosty agents lsghosty agents ls --engine ghosty-lite --ids            # sólo ids, para encadenar con xargsghosty agents ls --sponsor testers@ghosty.studio       # staff: agentes de CUALQUIER cuenta (también --owner CORREO); se operan por idghosty agents set <id> --prompt-file persona.md --prompt-mode replace   # su prompt SIN la persona de casaghosty agents create --name Moon --engine ghosty-lite --model gpt-5.6-luna --env GHOSTY_THINKING_EFFORT=maxghosty agents get <id>                         # configuración completaghosty agents get <id> --fields name,model,promptghosty agents get <id> --prompt-out PROMPT.md  # el prompt a un archivo (vuelve con set --prompt-file)ghosty agents create --name Pia --workspace ventas --channels teams=off   # nace en el espacio, a nombre de su dueñoghosty agents create --name tania-mkt --like <id-pia> --dry-run            # con la configuración de otro (no su prompt, env ni canales)ghosty agents create --name tania-mkt --like <id-pia> --board new --no-notify   # tablero propio con las columnas del original; comparte sin mandar correoghosty agents get <id> --fields toolsets,connectors   # lo que tiene de verdad: toolsets efectivos y conectoresghosty agents set <id> --prompt-file PROMPT.md # identidad / instruccionesghosty agents set <id> --name "Ventas" --model claude-sonnet-5ghosty agents set <id> --engine claude --model claude-haiku-5-5 --env FLEET_EFFORT=highghosty agents set <id> --engine claude --dry-run      # qué hace cambiar de motor (sesiones, cajas, memoria) sin cambiarloghosty agents set <id> --connect google-drive          # le da acceso a tu Drive (--disconnect lo quita)ghosty agents set <id> --channels wa=on,teams=off      # prende/apaga canales (wa = WhatsApp personal)ghosty agents set <id> --unset-env EASYBITS_API_KEY,EASYBITS_BASE_URL   # borra variables del env (también: --env K=)ghosty agents set <id> --prompt-base <id-base> --prompt-overlay capa.json --dry-run   # prompt = el de otro agente + una capa; se regenera sologhosty agents set <id> --prompt-base <id-base> --prompt-overlay espejo.json     # espejo.json = {"edits":[]}: un solo prompt y una sola memoria; lo que cambies en la base se replicaghosty agents set <id> --toolsets +crm                 # grupos de tools de gs: lista = reemplaza; +x / -x suma o quitaghosty agents share <id> ana@empresa.com --role admin  # compartir sin ceder (editor o admin); agents shares <id> los listaghosty agents unshare <id> ana@empresa.comghosty agents teams ls <id>                    # los equipos de Teams que administras: dónde contesta y con qué @handleghosty agents teams on <id> abogados --handle licenciado   # lo prende en ese equipo (sin --handle, el de su nombre); sobre uno activo le cambia el @handleghosty agents teams on <id> abogados --factory plan,build,check   # lo hace @plan, @build y @check de la Software Factory de ese equipoghosty agents teams off <id> abogados          # lo pausa en ese equipo: deja de contestar y conserva su @handleghosty agents teams rm <id> abogados --yes     # lo quita del equipo y suelta el @handle; el agente sigueghosty agents set <id> --voice elevenlabs:<voice-id> --voice-replies auto   # notas de voz en canalesghosty agents set <id> --auto-stage on         # mueve solo las tarjetas del tablero tras cada turno de clienteghosty agents set <id> --quote iva=0,prefix=SFI,vigencia=15   # config de la tool de casa cotizar (emisor, IVA, folio); vacío borra (rfc=)ghosty agents set <id> --catalog productos.csv  # su catálogo (sku,nombre,precio,unidad,categoria); reemplaza al anteriorghosty agents set <id> --quote iva-incluido=true,iva.GRANEL=16,solo-factura=true   # precios con IVA salvo granel, que suma 16 % sólo con facturaghosty agents set <id> --tool cotizar=off      # apaga una tool de casa en todos los canales (con canal: wa:cotizar=off)ghosty agents doctor <id>                      # revisa la configuración; sale con 1 si encuentra un problemaghosty agents archive <id>                     # deja de contestar en todos sus canales y sale de las listas; nada se borra. A los 7 días se borra sologhosty agents restore <id>                     # lo devuelve tal cual: Teams con su @handle, WhatsApp, memoria y conversacionesghosty agents ls --archived                    # los archivados y la fecha en que se borranghosty agents rm <id>                          # borra el agente, sus cajas, su bundle (skills) y sus versiones; quedan el uso y los turnos (cobro). Dueño o staff (queda en la bitácora); pide escribir su nombreghosty agents rm <id> --from-workspace         # si está activo en Teams: primero lo desactiva ahí y luego lo borra (dueño o staff)ghosty agents set <id> --tool wa:actualizar_identidad=off   # una tool por canal (canal:tool) o en todos (tool=off); =on sólo quita el vetoghosty agents set <id> --avatar ./cara.png     # su cara en Teams (o una liga https); queda en img.ghosty.studioghosty agents set <id> --bag "MiniGhosty"      # de qué bolsa de su espacio gasta (sólo staff; none = el saldo del espacio)ghosty engines ls --models                     # motores y modelos válidos para --engine/--model, con su costoghosty agents restart <id>                     # sólo Ghosty · Lite y Goose: carga skills nuevasghosty agents demo <id> --slug guardias && ghosty agents demo enable <id>   # liga pública para probarlo sin cuenta (ver abajo)ghosty agents box <id> --contains /opt/claude-worker/skills/pdf-doc/render-doc.mjs=pdf-templates   # ¿su máquina ya trae la imagen nueva?ghosty agents box <id> --recycle               # la cambia (nunca a media respuesta); la nueva nace en el siguiente turno (Ghosty · Lite y Goose también, con el historial de su último respaldo) (--reenv sólo re-hornea el env; --force aunque esté ocupada)ghosty agents box <id>                         # también dice su capacidad: conversaciones por caja, cajas encendidas, turnos ahora y lo que da el plan

agents get enseña el env del agente; los valores con cara de secreto (…KEY, …TOKEN, …SECRET) salen como •••.

agents box dice qué máquinas lo atienden y, con --check RUTA (se repite) o --contains RUTA=TEXTO, si traen lo que esperas. Sirve tras un cambio de imagen: si sale ✗, --recycle y verifica después de un turno. En Ghosty · Lite y Goose se usa agents restart.

create da de alta un agente de tu cuenta (sin espacio de trabajo) y devuelve su id. Sin --engine usa Claude; sin --model, el default del motor. Un motor o modelo que no existe se rechaza (también sin --engine) y el error lista los válidos; ghosty engines ls --models los enseña antes.

--env K=V,K2=V2 pone variables en la máquina del agente, en create o en set; K= la borra. La más útil: GHOSTY_THINKING_EFFORT (off · low · medium · high · max) fija cuánto piensa el modelo en Ghosty · Lite.

Conectar Drive (u otro conector) en tu cuenta no le da acceso a ningún agente: cada uno lo recibe con --connect <conector> o en su ficha → Conectores. Sólo el dueño puede darlo.

set cambia sólo lo que le pases. El prompt y el modelo se aplican desde el siguiente turno. Con --engine cambias el motor; --model es entonces un modelo del motor nuevo. En Claude el esfuerzo es --env FLEET_EFFORT=low|medium|high|xhigh|max; sin él va en medium. Codex, DeepSeek, Goose y DeepAgents están deprecados: usa Claude, Ghosty · Lite o Gemini.

Demo público: agents demo

Una liga /p/<nombre>-<código> para que cualquiera pruebe tu agente sin cuenta, tal cual lo armaste (su máquina, sus skills, su motor), pagado por ti. Con «Quedármelo» la persona crea su cuenta y se lleva su copia, con la conversación y los archivos de la prueba.

bash
ghosty agents demo <id>                                   # estado: liga, vencimiento, topes y númerosghosty agents demo <id> --slug guardias && ghosty agents demo enable <id>              # crea la liga y la enciendeghosty agents demo <id> --expires "2026-10-15T20:00"        # deja de entrar en esa fecha (hora de tu máquina)ghosty agents demo <id> --expires no                        # sin vencimientoghosty agents demo <id> --welcome "¡Hola! Súbeme tu Excel de guardias" --starter "Enséñame cómo empezar" --chips "¿Qué haces?|¿Cuánto cuesta?"ghosty agents demo <id> --turns 150 --per-ip 30           # topes contra abusoghosty agents demo <id> --sponsor on                      # la copia de quien lo conserve corre con TU llaveghosty agents demo <id> --rotate                          # código nuevo: la liga anterior deja de entrarghosty agents demo disable <id>
OpciónQué hace
--slug NOMBRENombre de la liga. Se le agrega un código de 6 caracteres para que no se adivine.
enable · disableghosty agents demo enable <id> lo enciende y disable lo apaga (--on/--off siguen como alias).
--expires "AAAA-MM-DDTHH:MM"Fecha fija en que deja de aceptar mensajes, igual para todos; en la hora de tu máquina. --expires no lo quita. Al vencer, el visitante sólo ve «Quedármelo».
--turns NMensajes por visitante (default 150).
--per-ip NMensajes por IP al día (default 30).
--welcome TEXTOSaludo del chat. Vacío = el saludo de siempre.
--starter TEXTOSugerencia destacada, la primera y en color; al tocarla el agente da un recorrido de 3 pasos. --starter "" la quita.
--chips "a|b|c"Sugerencias, separadas por | (pueden llevar comas y signos).
--sponsor on|offCon on, la copia de quien lo conserve usa tu llave del motor (sólo ese agente) y no cuenta contra su plan.
--rotateCódigo nuevo si la liga se filtró; las conversaciones abiertas siguen.

Sin opciones sólo enseña el estado. La salida trae las pruebas, mensajes y copias (cuántas con tu llave) y, si el agente no contestó a un visitante, el último motivo.

Widget web: agents embed

Una burbuja de chat con tu agente en tu sitio, con una línea de código. Sólo carga en los dominios que pongas; cada visitante tiene su conversación, aislada, y habla como cliente. Detalle en .

bash
ghosty agents embed enable <id> --domains "mitienda.com,*.mitienda.mx"   # lo enciende y te da el <script> para pegarghosty agents embed <id>                                   # estado, dominios, topes, el código y númerosghosty agents embed <id> --welcome "¡Hola! ¿En qué te ayudo?" --color "#0e1317"ghosty agents embed <id> --per-visitor 30 --per-ip 60      # topes contra abusoghosty agents embed <id> --title "Mi tienda" --subtitle "Responde en minutos" --avatar https://mitienda.com/logo.png --icon avatarghosty agents embed <id> --position left --offset 24,24 --theme auto --placeholder "Pregunta lo que quieras"ghosty agents embed <id> --bubble-text "¿Dudas?" --auto-open 15 --starters "¿Precios?|¿Envíos?"   # sugerencias tuyas (hasta 4)ghosty agents embed <id> --style '{"fontFamily":"Barlow","radius":0,"headerBg":"#2d4a2e"}'   # estilo fino; --style none lo reseteaghosty agents embed <id> --theme-source teams                # la marca de tu espacio de Teams (--workspace SLUG)ghosty agents embed <id> --theme-source site --site-url https://mitienda.com   # los colores de tu sitioghosty agents embed <id> theme > tema.json                   # exporta el tema; --style-file tema.json lo aplicaghosty agents embed <id> --copy '{"waking":"Un momento, por favor","thinking":["Revisando su consulta…"]}'   # lo que dice mientras trabaja; --copy none las regresaghosty agents embed <id> --out src/components/GhostyChat.tsx   # tu propio componente de React (token y tema horneados; .jsx sin tipos; --force pisa)ghosty agents embed <id> --rotate                          # token nuevo: el código viejo deja de cargarghosty agents embed disable <id>
OpciónQué hace
enable · disableLo enciende o lo apaga en todos lados al instante. Encender pide motor Claude y al menos un dominio.
--domains "a.com,*.b.com"Dónde puede cargar. a.com incluye www.a.com; *.b.com, sus subdominios. Reemplaza la lista.
--per-visitor NMensajes por visitante al día (default 30).
--per-ip NMensajes por IP al día (default 60).
--welcome TEXTOEl primer mensaje que ve el visitante (vacío = «¡Hola! ¿En qué te ayudo?»).
--color "#rrggbb"Color principal; el texto encima se calcula por contraste.
--title T · --subtitle TNombre del encabezado (default: el del agente) y un renglón debajo.
--avatar URL|noneTu imagen https (se rehospeda en img.ghosty.studio); none = el fantasma del agente.
--icon chat|avatar|ghostQué lleva el botón flotante.
--placeholder TTexto gris de la caja para escribir.
--position right|left · --offset X[,Y]Esquina y separación en px del lado y de abajo (0–200).
--theme light|dark|autoTema del panel (auto = el del visitante).
--bubble-text TEtiqueta junto al botón.
--auto-open S|offSe abre solo a los S segundos (1–120), una vez por visita, nunca en el teléfono.
--starters "a|b"Hasta 4 sugerencias tuyas; "" las quita. Nunca salen las de Ghosty.
--style '{json}'|noneEstilo fino sin CSS libre (tipografía, esquinas, colores por pieza). PATCH por llave; ver .
--font NOMBRE · --radius 0-24Atajos de style.fontFamily y style.radius.
--theme-source custom|teams|siteImporta el tema de la marca de Teams (--workspace SLUG) o de tu sitio (--site-url); queda editable.
--style-file ARCHIVOAplica un tema exportado con agents embed <id> theme.
--copy '{json}'|noneLas frases mientras el agente trabaja (waking, connecting, thinking de 1 a 8, stillWorking, cantStart, interrupted, retryLabel; texto plano ≤ 80) y showDuration/showCopyButton. PATCH por llave (null = la de Ghosty); ver .
--copy-file ARCHIVOEl mismo objeto copy desde un archivo.
themeghosty agents embed <id> theme imprime el tema (y copy) en JSON.
--out ARCHIVO.tsx|.jsxEscribe un componente de React completo y editable, sin dependencias, con tu token y tu tema arriba. No pisa un archivo que ya existe sin --force. Ver .
--rotateToken nuevo si el código se filtró o quieres cortarlo en todos los sitios.

La salida trae también el snippet de React (npm i @ghostystudio/widget + <GhostyWidget token="emb_…" />); en --json, en el campo react ({install, code}).

Probar un demo y ver qué pasó: demos

bash
ghosty demos try guardias-k3x9q2 "recuerda MANZANA-47"                 # como visitante, sin navegador (mismo hilo entre corridas; --new para otro)ghosty demos try guardias-k3x9q2 "¿qué palabra te dije?" --recycle-between --agent <id>   # cambia de caja entre mensajes: ¿recuerda?ghosty demos history <id> --since 2d --timeline                       # qué hicieron los visitantes (sólo staff de Ghosty)

demos try cuenta contra los topes del demo (mensajes por visitante y por IP al día) y sale en sus números y en el CRM. demos history enseña turnos, mensajes, adjuntos, entregas y clones; es sólo para el staff de Ghosty: el dueño ve números (agents demo), no los chats de sus visitantes.

El agente como archivo

ghosty agents export saca toda la configuración de un agente a un YAML (compatible con las recetas); ghosty apply deja a un agente como dice el archivo, enseñando antes el plan.

bash
ghosty agents export pia-0 --out ./pia          # agent.yaml + skills/<slug>/… (sin --out: el YAML a stdout)ghosty apply ./pia --dry-run                    # el plan: + agrega, ~ cambia, - quita, ! notaghosty apply ./pia                              # pregunta y aplica (--yes sin terminal)ghosty apply ./pia --agent tania-mkt --dry-run  # el mismo archivo sobre otro agenteghosty apply ./pia --create --name sofi-mkt     # un agente nuevo con el archivo
  • Lo que el archivo no menciona no se toca; los campos que trae quedan exactos.
  • Las listas (bases, documentos, compartidos, skills propias, variables de env) agregan y cambian; quitar exige --prune (sin él salen con !).
  • Los secretos nunca salen: se exportan como ${NOMBRE}. Con NOMBRE en tu entorno se cambia; si no, se conserva el valor de hoy.
  • Antes de aplicar se guarda la versión actual del agente (Versiones, en la web). apply no mueve un agente de espacio.

Configurar un agente

Todo agente tiene máquina y disco propios: archivos, skills y MCP funcionan con cualquier motor. En los de pool (Claude, Codex, DeepSeek, Gemini) entran solos en el siguiente turno; en Ghosty · Lite y Goose las skills nuevas entran con agents restart (needsRestart en agents get).

Archivos

bash
# Hasta 10 MB cada unoghosty files ls <id>ghosty files put <id> precios.md --file ./precios.mdcat notas.txt | ghosty files put <id> notas.txtghosty files get <id> precios.md --out ./copia.mdghosty files rm <id> precios.md

Prompt derivado

Un agente puede heredar el prompt de otro con una capa de ediciones: la sucursal de una tienda que usa el prompt de la matriz, cambiando nombre, horario y catálogo. Cuando cambia el de la base, el derivado se regenera solo.

json
{ "edits": [  { "what": "nombre", "find": "Tania", "replace": "Pia", "all": true },  { "what": "sucursal", "find": "## Mínimo de compra\n", "replace": "## Sucursal Ixmiquilpan\n…\n\n## Mínimo de compra\n" },  { "what": "qué atiendo", "find": "\\*\\*Qué atiendo:\\*\\*[^\\n]*", "regex": true, "replace": "**Qué atiendo:** las dos marcas." }] }
  • Las ediciones van en orden y cada una tiene que encontrar su sitio. Si la base cambió justo ahí, el derivado se queda con su prompt anterior y agents doctor lo marca (prompt.base).
  • --dry-run dice si todas aplican (--out FILE escribe el resultado). --prompt-base none suelta la liga y conserva el prompt de hoy.
  • Mientras esté ligado, su prompt no se edita a mano (409): se cambia la base o la capa.

Parchar el prompt

Para cambiar un pedazo del prompt sin reescribirlo entero (y sin pisar lo que alguien más cambió en medio), con el mismo formato de capa:

bash
ghosty agents set <id> --prompt-patch horario.json --dry-run   # el diff: qué líneas cambianghosty agents set <id> --prompt-patch horario.jsonghosty agents set <id> --prompt-append aviso-octubre.md        # agrega ese texto al final
  • Se aplica en el servidor, sobre el prompt de ese momento: no hace falta bajarlo con get --prompt-out y volver a subirlo.
  • Si una edición no encuentra su lugar, no cambia nada (409 con cuál fue). --prompt-patch y --prompt-append juntos: primero las ediciones, luego el texto.
  • Queda en la bitácora (agent.prompt_patch). No aplica a un prompt derivado: ahí se cambia la base o la capa.

Skills

bash
# Del catálogo por su nombre, o una propia con --fileghosty skills ls <id>ghosty skills disable <id> pdf-doc                 # apaga una (propia o de Ghosty); enable la vuelve a prenderghosty skills house <id> --only pdf-doc,office-reader --dry-run   # las de Ghosty en bloque (--enable / --disable)ghosty skills add <id> grill-meghosty skills add <id> mi-skill --file ./SKILL.mdghosty skills get <id> mi-skill                    # lista sus archivosghosty skills get <id> mi-skill --out ./mi-skill   # baja la carpeta completa (y dice la ruta absoluta)ghosty skills templates <id>                       # plantillas de pdf-doc: las suyas y las de Ghostyghosty skills add <id> mi-skill --dir ./mi-skill   # sube una carpeta (SKILL.md + archivos)ghosty skills rm <id> mi-skill                     # guarda una copia local y dice cómo deshacerloghosty agents restart <id>                         # sólo Ghosty · Lite y Goose

skills rm guarda la copia en ~/.config/ghosty/trash/ e imprime el comando que la restaura.

skills templates lee una máquina viva (corre un turno antes) y lista lo que ve pdf-doc: agente:<skill> o casa. Una plantilla propia es <skill>/pdf-templates/<nombre>.html en cualquiera de sus skills; con el mismo nombre le gana a la de casa.

Servidores MCP

bash
# `set` REEMPLAZA la lista completaghosty mcp get <id> > servers.jsonghosty mcp set <id> --file servers.json

Una llave por usuario final: en un MCP http, una cabecera puede llevar ${turn.token} ("Authorization": "Bearer ${turn.token}"). Cada turno de message-stream o turns manda su turnToken y gs lo pone sólo en ese turno, a través de su proxy: el token nunca entra a la caja ni se guarda. Un turno sin turnToken en ese agente falla con error. No vale en sse, stdio, la URL ni en agentes ACP.

La tool cotizar hace las cuentas, el folio y el PDF; el agente sólo pone los renglones. El IVA de cada renglón sale de la configuración del agente, en este orden:

  1. Si la llamada trae iva_pct, ésa para todo.
  2. Con solo-factura=true y sin factura: true en la cotización: 0.
  3. Si la categoría del renglón tiene regla (iva.GRANEL=16): ésa.
  4. Con iva-incluido=true (los precios ya lo traen): 0.
  5. Si no: iva (16 por default).

La categoría sale del catálogo del agente (--catalog), no del modelo; sólo si el producto no está en el catálogo cuenta la que mande el agente. Si los renglones llevan tasas distintas, el PDF lo desglosa («IVA (GRANEL 16%)»). Un agente con su propia skill cotizar no usa esta tool: guardar esa skill la apaga.

Revisar un agente: agents doctor

Como brew doctor: sólo enseña lo que hay que atender, cada hallazgo con el comando que lo arregla, y sale con 1 si hay un problema (sirve de compuerta en un script). --verbose enseña también lo que pasó.

Revisa: skills que podrían dispararse con lo mismo (dos de cotizar encendidas a la vez), skills que el prompt nombra (skill \cotizar`, .claude/skills/cotizar/) y el agente no tiene o tiene apagadas, una skill propia con el nombre de una tool de casa que sigue encendida (el modelo puede usar la genérica), tools que el prompt nombra y no existen o no tienen permiso, tablas de escritura desde clientes que ya no existen, db_/doc_` en el prompt sin nada concedido y turnos que fallaron en las últimas 24 h.

Bases de datos

bash
ghosty dbs ls <id>                                   # las bases de la cuenta y cuáles tiene este agenteghosty dbs tables <id> <base>                        # tablas, filas y columnasghosty dbs query <id> <base> "SELECT count(*) FROM productos"ghosty dbs query <id> <base> "SELECT * FROM productos WHERE sku = ?" --arg ABC-12ghosty dbs query <id> <base> "UPDATE folio SET n = n + 1" --writeghosty dbs export <id> <base>                        # la base entera: <base>.sqlite (sqlite3, DB Browser for SQLite, DBeaver)ghosty dbs export <id> <base> --table productos      # una tabla en CSV (abre en Excel): <base>-productos.csvghosty dbs grant <id> <base> --external-write cotizaciones,folio   # qué escribe desde WhatsApp/Messengerghosty dbs grant <id> <base> --external-rows clientes:telefono+tel_secundario   # desde WhatsApp/Messenger cada cliente ve sólo SUS filas ("" = sin filtro)ghosty dbs revoke <id> <base>ghosty dbs rename <id> totequim siiqtec --dry-run    # también reescribe los prompts, env y SKILL.md que la nombranghosty dbs ls <id> --orphans                         # bases que ningún agente tiene concedidasghosty dbs rm <id> <base> --dry-run                  # borra la base entera (revoke sólo quita el acceso); dueño o staffghosty dbs import <id> <base> --from easybits:<id-base> --dry-run   # copia tablas de EasyBits ($EASYBITS_API_KEY)ghosty dbs import <id> <base> --from easybits:<id-base> --tables productos,precios --append
  • query es de sólo lectura; --write permite INSERT/UPDATE/DELETE/DDL. --arg V da el valor de cada ?, en orden (se repite).
  • import reemplaza las filas de cada tabla (idempotente); --append las agrega en vez de reemplazar y --tables a,b copia sólo esas. --dry-run enseña el plan (+ crea, ~ reemplaza N → M filas) y no cambia nada. Si la base es compartida con agentes que ya escriben en gs (cotizaciones, folios), avisa de las filas que sólo existen en gs y pregunta antes de borrarlas.
  • export baja una copia: sin --table, la base entera como SQLite (todas las tablas, con sus filas); con --table, esa tabla en CSV UTF-8. --out dice dónde guardarla. Usa tu sesión, no el token gat_ del agente, y queda en la bitácora. Las mismas descargas están en la página de cada base (/app/datos?tab=dbs → la base → .sqlite / tabla.csv).
  • db es alias de dbs, y dbs sql de dbs query.

Las fotos de un catálogo deben vivir en ligas permanentes (img.ghosty.studio): las de EasyBits o de la web del cliente caducan o cambian, y WhatsApp deja de mandarlas.

bash
ghosty dbs tables <id> <base>                                              # por columna de fotos: permanentes · de fuera · vacíasghosty dbs rehost <id> <base> --table catalogo --column imagen_url         # copia las de fuera a ligas permanentes (idempotente)ghosty dbs import <id> <base> --from easybits:<id-base> --rehost-images catalogo.imagen_urlghosty dbs photos put <id> <base> --table catalogo --key-column sku --dir fotos/ --dry-run   # fotos sueltas: SKU-123.jpg → la fila con sku = SKU-123
  • import avisa si reemplazar una tabla regresaría ligas permanentes a ligas de fuera, y te da la bandera exacta.
  • photos put sólo acepta JPEG, PNG o WebP de hasta 10 MB; --dry-run lista las claves que no tienen fila y los archivos que no son imagen. La columna es imagen_url salvo --column.
  • En la web (/app/dbs, pestaña Tablas) ves los mismos conteos, el botón «Hacer permanentes» y puedes arrastrar una foto a una fila.

Documentos

bash
ghosty agents docs ls <id>                           # documentos que consulta y puede mandarghosty agents docs grant <id> "Catálogo 2026.pdf"    # --write: puede reemplazarlo · --no-deliver: nunca lo mandaghosty agents docs grant <id> "Catálogo.pdf" "Precios.xlsx"   # varios a la vez; --like <otro> copia los de otro agenteghosty agents docs revoke <id> "Catálogo 2026.pdf"ghosty agents docs add <id> --url https://ejemplo.com/lista.pdf --description "Precios 2026"   # sube y concede (--file para uno local)ghosty agents docs replace <id> "Catálogo.pdf" --file catalogo-oct.pdf --note "precios de octubre"   # versión nuevaghosty agents docs history <id> "Catálogo.pdf"       # versiones: quién, cuándo y desde dónde; y qué agentes lo usanghosty agents docs restore <id> "Catálogo.pdf" 3     # vuelve a la v3 como versión nueva

<base> y el documento aceptan el id o el nombre. Un token de agente (gat_…) sólo ve lo concedido y no puede concederse nada.

Un documento es uno solo aunque lo usen varios agentes: replace sube una versión nueva que conserva el nombre (sólo la extensión sigue al tipo), los accesos y a todos los agentes que lo usan, así que el prompt que lo nombra no se rompe. La versión anterior queda en el historial (se guardan 20). Con un token de agente, replace y restore sólo funcionan si el agente tiene «Puede actualizarlo» (grant --write).

Turnos

bash
ghosty turns ls <id> --errors --since 1h             # turnos que fallaron y por quéghosty turns ls <id> --status running                # running · done · stopped · errorghosty turns ls <id> --skipped --since 1d            # mensajes de WhatsApp Business que NO abrieron turno y por qué (operador activo, sólo registra, pausa…)ghosty turns ls <id> --session web:…                 # una conversación; en Claude la columna «resumed» dice si retomó (✓) o empezó de cero (⚠ orphan|stale|replaced)ghosty turns ls --workspace descti --quota-hits      # los mensajes de TODO un espacio (WhatsApp Business y Teams) que no se atendieron porque se acabó el saldoghosty turns ls <id> --json --limit 100ghosty turns show <id>                               # el último turno: qué entró, qué contestó, cada tool con sus segundosghosty turns show <id> --full                        # el mensaje y la respuesta completosghosty turns cancel <id> <conversación>              # detener: el turno en curso Y sus encargos en fondo (video, subagentes, despertadores)ghosty turns show <id> <turn-id>                     # uno en particular (el id sale en turns ls)ghosty turns grep <id> "IVA" --since 7d --role agent # lo que dijo el agente (o --role user, el cliente) y en qué turno

turns grep busca en el texto de las conversaciones (no en los pasos ni las tools) y devuelve cada coincidencia con su turno, para abrirlo con turns show. En la columna «resumed», «1.er turno» es el primer turno de una sesión nueva del SDK: no es pérdida de memoria.

--errors es lo mismo que --status error. --since acepta 30m, 1h, 2d o una fecha ISO; --limit es 20 por default (máximo 500).

turns show enseña primero lo que entró (in) y lo que contestó (out), en cualquier motor y canal (grupos de WhatsApp incluidos). Luego responde «¿en qué se fueron 4 minutos?»: la línea de tiempo del turno (+12.3s Bash office-reader … 8.1 s), las tools más lentas y el total de llamadas al modelo y tokens de salida. Esa parte sale del transcript del motor, así que sólo existe en los de pool (Claude, Codex, DeepSeek, Gemini), no en Ghosty · Lite ni Goose.

Canales de WhatsApp

bash
ghosty channels whatsapp ls <id>                     # números de WhatsApp Business y quién los contestaghosty channels whatsapp enable <id> 5512345678 --dry-runghosty channels whatsapp disable <id> 5512345678

Encender un número hace que el agente les conteste a clientes reales: pide escribir los últimos 4 dígitos (o --yes). Un número tiene un solo agente: encenderlo se lo quita al otro.

Los grupos son del WhatsApp personal pareado al agente (no de WhatsApp Business): en cuáles contesta y con qué rol. equipo = gente de la casa (escribe en bases, tools de admin); cliente = como cualquier cliente.

bash
ghosty channels wa groups ls <id>                                   # nombre, encendido, rol, jid (--cached: sin preguntarle a WhatsApp)ghosty channels wa groups enable <id> "Pia-cotizadora" --role equipo --dry-runghosty channels wa groups set <id> 120363…@g.us --name "Equipo SoFi"   # el nombre con que lo ve gs (el de WhatsApp no cambia)ghosty channels wa groups disable <id> "Pia-cotizadora"ghosty channels wa groups set <id> "Equipo ventas" --wake mention   # sólo contesta si lo mencionan o le respondenghosty channels wa groups create <id> "Equipo ventas" --role equipo  # crea el grupo y da la liga de invitación

<grupo> es su nombre o su jid. Encender un grupo confirma (o --yes): el agente empieza a contestar ahí.

--wake: mention (default al encender un grupo) abre turno sólo si mencionan al agente con @, escriben su nombre o le responden a un mensaje suyo; lo demás le llega como contexto en su siguiente turno. all contesta cada mensaje (los grupos importados y los creados con create).

¿Quién contestaba este número?

Si un número o una página quedó sin agente, la columna «last answered by» dice qué agente lo contestó por última vez y cuándo (sale de los turnos de gs), para regresárselo:

bash
ghosty channels whatsapp integrations <id>            # + «last answered by» por númeroghosty channels whatsapp integrations <id> --orphans  # sólo los que hoy no contesta nadie y sí tuvieron turnosghosty channels messenger ls <id> [--orphans]         # lo mismo con las páginas de Messenger del espacioghosty channels whatsapp enable <agente> 5512345678 --dry-run   # regresarlo

Traer un número de otro lado

Para migrar un agente de EasyBits (o de un droplet) sin volver a dar de alta el número:

bash
# WhatsApp Business: el número ya vive en Formmy; se reapunta a este agenteghosty channels whatsapp integrations <id>                                            # los números del dueño en Formmy (y los ya enlazados en gs): número, quién contesta hoy, id; staff: --email otra-cuentaghosty channels whatsapp link <id> --integration <id-formmy> --answer off --dry-run   # el plan: qué cambia en gs y en Formmyghosty channels whatsapp link <id> --integration <id-formmy> --answer on              # desde aquí contesta a clientes realesghosty channels whatsapp unlink <id> --integration <id-formmy>                        # vuelve a donde estabaghosty channels whatsapp history <id> --integration <id-formmy> --days 7 --dry-run    # tarjetas, mensajes, pedidos y archivos recientes de Formmy al tablero (el ensayo funciona antes de enlazar; al importar cuenta las que llegan pausadas y reintenta solo si hay un deploy)ghosty channels whatsapp history <id> --integration <id> --days 7 --dry-run --list      # CUÁLES: teléfono, nombre, primer mensaje, si vino de anuncioghosty channels whatsapp history <id> --integration <id> --only-ads --column "Nuevo"   # importa sólo las de anuncio (o --phones a,b) a esa columnaghosty channels whatsapp link <id> --integration <id> --answer off --forward --ads-only on   # sólo abre tarjeta lo que viene de un anuncioghosty channels whatsapp link <id> --integration <id> --board Ventas   # un agente con varios números: cada número llena su tablero (agent = el del agente)ghosty channels whatsapp link <id> --integration <id> --answer on --partner-tenant org_123 --partner-agent nik-public   # número de un negocio de tu partner: lo contesta ese agente (ver Partners)ghosty channels whatsapp history <id> --integration <id-formmy> --days 7 --media      # sólo re-copia los archivos que faltan
# WhatsApp personal: la sesión de Baileys exportada de EasyBits, sin QRghosty channels wa import <id> --from easybits:<id-agente> --own-number no --dry-run   # directo de EasyBits ($EASYBITS_API_KEY): primero dice si la sesión del origen está viva, llaves y gruposghosty channels wa import <id> --from-file sesion.json --own-number no --dry-runghosty channels wa import <id> --from-file sesion.json --own-number noghosty channels wa import <id> --from-dir store/auth --own-number no --dry-run   # carpeta multi-archivo de Baileys (nanoclaw)ghosty channels wa status <id>ghosty channels wa pause <id>                    # la vuelta atrás de este lado (conserva la sesión)ghosty channels wa pair <id> --phone 5215512345678   # parear un número nuevo por código, sin QR (en México 52… y 521… son cuentas distintas: avisa cuál probar)
  • --answer no tiene default: on contesta a clientes reales; off sólo registra. Formmy únicamente reenvía si su canal está encendido: con on se enciende; con off, sólo si agregas --forward (el plan avisa si gs no va a ver las conversaciones).
  • Lo hace el dueño, un admin del agente o el staff de Ghosty. Si el dueño del número en Formmy tiene otro correo, sólo el staff.
  • history va después de link y no duplica: córrelo antes del corte y otra vez justo en él. No dispara avisos de «lead nuevo».
  • history también copia a gs los archivos (fotos, PDF, audios) y el resumen dice cuántos se copiaron y cuántos fallaron. Formmy los borra a los 7 días: trae el número dentro de esa semana. Los que fallaron se reintentan con --media, que no toca tarjetas ni mensajes; con --dry-run dice cuántos faltan.
  • import: apaga antes el WhatsApp en EasyBits sin cerrar sesión (dos conexiones con las mismas llaves se tumban; cerrar sesión las invalida). --own-number no = es el número de una persona: sólo su chat consigo misma cuenta como del dueño. Borra el archivo al terminar: son las llaves de la cuenta.

Tablero

bash
ghosty boards ls siiqtec                                   # los tableros del espacio, con agentes y tarjetasghosty boards create siiqtec "Siiqtec - Ixmiquilpan" --columns-from mainghosty boards assign <id> "Siiqtec - Ixmiquilpan"          # a dónde manda sus tarjetas NUEVASghosty boards move-cards siiqtec --from main --to "Siiqtec - Ixmiquilpan" --integration <id-formmy> --dry-run   # y las que ya estabanghosty boards rm siiqtec "Prueba"                          # sólo uno vacío que no sea el principalghosty cards ls <id> --q 7712                              # tarjetas recientes (folio, nombre, teléfono, columna)ghosty cards ls <id> --paused --limit 200                 # las que el agente no contesta: pausadas (p. ej. las que trae history de Formmy) o en manualghosty cards show <id> "#12"                               # el hilo: quién escribió, texto, adjunto y si gs guardó copiaghosty cards archive <id> --integration prueba --dry-run   # archiva tarjetas en bloque (reversible)ghosty cards archive <id> --column Perdido --before 30d --yesghosty cards pause <id> "#12" --mode 2h                    # pausa al agente en esa conversación (30min | 2h | 24h | until_tomorrow | permanent)ghosty cards resume <id> "#12"                             # lo reanuda; también quita «sólo operador» (escalada)ghosty cards reply <id> "#12" --directive "ofrécele el envío"   # «Pedir respuesta»: contesta lo que el cliente dejó pendienteghosty cards pending <id> --since 2026-10-06T02:13Z        # las que esperan respuesta, y por qué algunas no se contestanghosty cards pending <id> --since 12h --reply --dry-run    # qué contestaría; sin --dry-run las contesta una por una (pregunta, o --yes)

resume no contesta solo (el despertar que Formmy manda al reanudar se ignora); para eso está reply, que sólo sirve en WhatsApp Business y si el número lo contesta ese agente. pending marca y nunca contesta: las pausadas, las escaladas, las que salieron de la ventana de 24 h de WhatsApp (Meta sólo acepta plantillas), las que sólo traen una reacción, las que no son de WhatsApp Business y las de números sin agente. pause, resume y reply quedan en la bitácora.

El tablero es del espacio: un agente compartido contigo no te da su tablero; el dueño tiene que agregarte al espacio. Se necesita al menos un filtro (--integration, --column o --before).

Credenciales

bash
ghosty credentials ls                                # llaves de tu vault (sólo los últimos 4)ghosty credentials set elevenlabs                    # prompt oculto; o --from-env VAR, o por stdinghosty credentials rm elevenlabs

Una llave nunca se acepta como argumento: se quedaría en el historial del shell. creds es alias de credentials.

Conectores

bash
ghosty connectors ls --q shop                        # tus conectores: conectado / disponible / muy prontoghosty connectors connect shopify                    # OAuth: abre el navegador (--no-open sólo imprime la URL)ghosty connectors connect stripe --from-env STRIPE_SECRET_KEY   # por llave: se verifica antes de guardarseghosty connectors disconnect shopify                 # revoca en el proveedor y lo quita de tu cuentaghosty agents set <agente> --connect shopify         # luego dáselo a un agente

Son los mismos de /app/connectors y la app. Los de llave con varios campos (Odoo, WooCommerce…) los pregunta uno por uno; los secretos sin eco y nunca como argumento.

Confirmaciones

agents rm, files rm, skills rm, credentials rm, board archive, reemplazar filas con dbs import y channels whatsapp enable preguntan antes de actuar. Sin terminal (un agente de código, CI) nunca esperan respuesta: agrega --yes, o salen con 2 y el comando exacto para reintentar.

Platicar con un agente

Turnos de prueba

bash
# Un turno de prueba: espera la respuesta completa (hasta 3 min)ghosty try <id> "¿qué horarios tienen?"ghosty try <id> "pásalo a PDF" --media foto.jpg                     # con adjuntos, como desde la app (se repite, hasta 8)ghosty try <id> "hola" --waba --session 5210000000009             # el camino real de WhatsApp; enseña lo que MANDARÍA (la tarjeta de prueba se archiva sola; --keep la deja)ghosty try <id> "cotízame esto" --waba --session 5210000000009 --media lista.jpgghosty try <id> "" --waba --session 5210000000009 --media nota.ogg --as-formmy   # el adjunto llega como lo manda Formmy (proxy con credencial)ghosty try <id> "¿y el envío?" --waba --session 5210000000009 --history hilo.json --resetghosty try <id> --replay muestra.json --out ./replay --max 5     # conversaciones reales; el reporte queda en tu discoghosty try <id> --replay muestra.json --out ./replay --concurrency 4   # conversaciones a la vez (default 8, máx. 30)ghosty try <id> --reset                  # olvida la sesión de prueba

--waba pasa por el mismo camino que un cliente real de WhatsApp Business (contexto heredado, regla de precios, tablero, voz) y no manda nada: ni mensaje, ni nota de voz, ni link de pago. Enseña todo lo que habría salido, también lo que mandan las tools: 📍 ubicación, 📄 archivos, 🎤 voz, ↩️ citas, 🔘 botones, 👤 contactos y reacciones. Con --as-formmy el adjunto recorre lo mismo que uno real: proxy con credencial, copia en gs y transcripción; al final dice si la copia llegó. --replay corre desde tu máquina y escribe replay.json después de cada paso; si Ghosty se despliega a media corrida espera el Retry-After y sigue, y --resume retoma una corrida cortada.

Conversaciones

bash
ghosty chat <id> "resume el último correo"ghosty chat <id> "¿qué dice este contrato?" --media contrato.pdfghosty chat <id>                         # modo interactivo; Ctrl-C cancela el turno, Ctrl-D saleghosty chat <id> "sigue" --conversation <conversation-id>ghosty conversations ls <id>ghosty conversations show <id> <conversación> [--limit 20]   # lo que se dijo (0 = todo)

try es para probar configuración; chat usa las conversaciones reales del agente, las mismas que ves en el panel y en la app.

Programar turnos

El agente trabaja solo a la hora que le digas: cada corrida cae en una conversación y te avisa en el teléfono (app de iOS o Mac). Si su respuesta es exactamente OK, no avisa; úsalo para un «revisa y avísame sólo si…».

bash
ghosty schedule add <id> "Revisa la campaña y dame el resumen" --at 2026-10-01T09:00-06:00 --every 12h --until 2026-10-25 --title "Campaña"ghosty schedule add <id> "Recuérdame llamar a Ana" --in 30mghosty schedule add <id> "Sigue con el reporte" --in 2h --conversation <conversation-id>ghosty schedule ls <id>                  # pendientes y últimas corridasghosty schedule rm <id> <schedule-id>

Sin --conversation se abre una conversación nueva (con --title, lleva ese nombre). Reglas: repetición mínima cada 15 minutos, --until obligatorio al repetir, como mucho a 30 días, y hasta 5 pendientes por conversación.

En una conversación de un canal (--conversation waba:…, wa:<jid> de WhatsApp personal —un grupo o un chat— o messenger:…) la respuesta sale por ese canal; una respuesta «OK» no se manda. En WABA sólo dentro de la ventana de 24 h; en WhatsApp personal, si el número del agente está conectado.

En un hilo de Teams

bash
ghosty schedule add minighosty "Preséntate al equipo y di qué haces" --teams descti#general/4812 --at 2026-10-01T09:00ghosty schedule ls minighosty --teams desctighosty schedule rm minighosty <id> --teams descti

A esa hora el agente contesta en el room (o en el hilo: el número es el id del mensaje con que empieza) como si alguien lo mencionara, con la memoria de ese room. Hace falta que esté activo en el Teams del espacio y que seas miembro. Sin hilo, publica en el room. --every todavía no va con --teams.

Tu cuenta

bash
ghosty me files ls --kind documentghosty me files ls --q contrato                    # busca por nombre (biblioteca + tus hilos), con --cursor para la siguiente páginaghosty me files get <file-id> --out contrato.pdf   # lo baja (sin --out: la liga firmada)ghosty me files export --dry-run                   # cuántos archivos y MB hay, por carpetaghosty me files export --out respaldo/             # baja TODOS: documentos/, conversaciones/, biblioteca/ (repetirlo sólo trae lo nuevo)ghosty chat <id> "resúmelo" --file <file-id>       # adjunta de tus archivos, sin volver a subirghosty agents docs dedupe --dry-run                # documentos con el mismo contenido: se queda uno con los permisos de todosghosty me files upload ./contrato.pdfghosty me files rm <file-id>ghosty me memories ls                              # lo que tus agentes recuerdan de tighosty me memories add "prefiero respuestas cortas"   # de la app: valen para todos tus agentesghosty me memories edit <id> "texto nuevo"ghosty me memories rm <id>ghosty docs                              # abre esta documentación

Uso

bash
ghosty usage                             # o: ghosty me usage# Plan Pro#   This week    42% used  resets 2026-10-05#   This month   18% used  resets 2026-11-01#   Top-ups     available
bash
ghosty usage --workspace descti --by agent,day --days 14   # turnos, fallidos, tokens y «sin saldo» por agente y día (CDMX); dueño o staffghosty usage --boxes --workspace siiqtec    # cajas del espacio contra su tope (spares, dormidas) y por agenteghosty plan apply siiqtec --dry-run         # qué cambia si aplicas YA el plan programado (asientos, paralelo, hosting, tokens)

plan apply lo puede correr el staff o el dueño del espacio si no tiene suscripción (con suscripción, el plan nuevo entra al pagarse la factura). Sin espacio, ambos usan el de ghosty use.

Con --json trae plan.name, week.pct y month.pct (de 0 a 1; month.pct es null si tu plan no tiene tope mensual), sus resetsAt, creditMxn (saldo de recargas) y exhausted (true si ya no te queda uso). Cambiar de plan o recargar: .

Espacios

Bolsas de tokens, renovación y slug de un espacio. Leer las bolsas lo puede el dueño; cambiarlas, renovar y renombrar es del staff de Ghosty (queda en la bitácora del espacio).

bash
ghosty spaces ls                                             # tus espacios: rol, plan, combo (staff: --user CORREO, los de alguien)ghosty spaces create mailmask --dry-run                      # espacio nuevo a tu nombre (prueba, mismas reglas que la web); quita --dry-run para crearloghosty spaces join denik                                     # staff: entra al espacio de un cliente (sin asiento; queda en bitácora) · leave para salirghosty spaces set denik --combo sales --dry-run              # staff: teams | sales | both (sin Ventas, sus tableros no se ven)ghosty spaces set mailmask --model-cap 4 --house-claude on  # staff: + Claude de casa (si el dueño no trae llave);: el modelo más caro que puede elegir (0.25 | 1 | 4 | none = el del plan); una prueba topa en 0.25 y no le cabe Claudeghosty bags ls descti                                        # bolsas, gasto, si cortan y qué agentes gastan de cada unaghosty bags create descti "MiniGhosty" --tokens 20M --note "pactado 30-sep"ghosty bags set descti "Astra" --recurring off              # carga única: cuenta desde hoy y no se recargaghosty bags set descti "Astra" --tokens 30M                 # sube el topeghosty agents set minighosty --bag "MiniGhosty"             # cuélgale un agente (none = el saldo del espacio)ghosty bags rm descti "Vieja"                               # sólo si ningún agente la usaghosty spaces renew descti --until 2026-11-01 --note "pagó octubre"   # «pagado hasta»; con Stripe se niegaghosty spaces rename totequim siiqtec --dry-run             # sólo el slug; id, tablero, Stripe y WhatsApp se quedanghosty spaces transfer siiqtec --to siiqtec@gmail.com --keep-as admin --copy-keys --dry-run   # dueño nuevo: copia las llaves que le falten, el anterior queda admin; las cajas ACP se mudan con su /data y las del pool se reciclanghosty spaces archive pruebas --dry-run                     # dueño o staff: lo mismo que Ajustes → Archivar (pide escribir el slug); sale de /app y de spaces lsghosty spaces restore pruebas                               # lo trae de vueltaghosty spaces log siiqtec --since 30d                       # la bitácora: traspasos, staff que entra o sale, renovaciones

Un traspaso sólo cambia el dueño: el espacio, sus agentes, sus skills y su historial se quedan igual. Los documentos, bases, tableros y números que usan sus agentes pasan a la cuenta nueva; lo que también usa un agente de fuera del espacio se queda y la simulación lo avisa. --copy-keys copia las llaves de proveedor y los conectores (MercadoPago, Skydropx…) que le falten al dueño nuevo.

Archivar no borra nada: el espacio deja de salir en /app y en ghosty spaces ls, y sus agentes, datos e historial se quedan. Lo puede el dueño o el staff; queda en la bitácora (workspace.archive / workspace.restore) y se deshace con ghosty spaces restore <espacio>.

Una bolsa mensual (default) se recarga cada periodo del espacio; una de carga única (--recurring off) cuenta todo lo gastado desde que se creó y, al acabarse, se acabó. Con --hard-cap on (default) los turnos se frenan al 100 % con «se acabó el saldo»; con off sólo se cuenta. Un agente sin bolsa gasta del saldo del espacio.

Bitácora

Quién cambió qué: el «Guardar» de la ficha, los cambios de canal, pausas y respuestas desde el CLI, parches del prompt, traspasos, staff que entra o sale y «entrar como». El staff de Ghosty ve todo; cualquier otra cuenta, sólo lo de sus espacios y sus agentes. El token gat_ de un agente no la lee.

bash
ghosty audit ls --workspace siiqtec --since 24hghosty audit ls --agent tania-0 --action agent         # agent.save, agent.prompt_patch…ghosty audit ls --actor brenda@siiqtec.com --since 2026-10-05T00:00Zghosty audit ls --action card --json                   # card.pause, card.resume, card.reply

Fábrica

Los pedidos de la Software Factory de un espacio (viven en su Teams). Leer pide ser miembro; renombrar, dueño, admin o staff (queda en la bitácora como factory.run_rename).

bash
ghosty factory runs ls --workspace business --room mailmaskghosty factory runs show 15 --workspace business       # etapa, plan vigente, PR, preview, últimos eventos y qué rol trabaja (--full: el plan)ghosty factory runs rename 15 "Docs del CLI al día" --workspace business --dry-runghosty agents ls --handle build --workspace business   # quién es @build (sin --workspace: en todos tus espacios)

runs ls enseña cuánto tardó y costó cada pedido. Para ver en qué se fue el tiempo y el dinero de uno:

bash
ghosty factory runs show 13 --timing --workspace mercadito-verde# #13 · pr_review · vueltas 0 · CI rojo 0 · $4.32 USD# reloj: 4.2 h = trabajando 71.8 min · esperando a una persona 3.0 h · lo demás (CI, colas) 1.3 min# hora   paso           tiempo    en tools  model     usd    estado# 17:07  @plan (hilo)   1.2 min   0.1 min   opus-5-5  $0.87  done# 17:09  @check (crítico) 0.6 min 0.1 min   opus-5-5  $0.51  done# 17:10  @build         68.8 min  66 min    sonnet-5-5 $1.82 done# Comandos más lentos (≥ 60 s)#   17:23 @build 10.3 min  Bash: until grep -q "TC_EXIT…
  • Trabajando: algún rol tenía un turno corriendo. Esperando a una persona: el plan o el PR por aprobar. Lo demás: CI, colas, despliegue.
  • Los comandos de 60 s o más salen de la transcripción de cada rol. Los motores ACP no guardan una: salen con minutos y costo, sin comandos.
  • El costo incluye el primer turno de @plan en el hilo, antes de que naciera el pedido.

Por qué se atoró o falló (un pedido sano no llama al modelo; el análisis se guarda, --refresh lo rehace). Ver :

bash
ghosty factory runs why 13 --workspace mercadito-verde

Y cómo va la fábrica del espacio:

bash
ghosty factory runs stats --since 7d --workspace mercadito-verde [--repo dueño/repo]# pedidos: 11 · mezclados: 10 (91 %) · mediana hasta el PR 29.6 min · hasta el merge 30.3 min# vueltas @check→@build por pedido: 0.4 · CI rojo por pedido: 0# costo: $29.89 USD · por pedido $2.72 · por PR mezclado $2.99

Pedir ayuda

Soporte es por correo: cada caso tiene su propia dirección de respuesta, así que contestar el correo o escribir aquí cae en el mismo caso. También se lo puedes pedir a tu agente en tu chat: «repórtalo a soporte». El caso lleva tu cuenta, tus agentes y sus errores recientes; no tienes que repetirlos.

bash
ghosty support open --title "Mi agente no contesta en WhatsApp" --body "Desde ayer a las 6 pm…"ghosty support ls                                    # tus casos y su estadoghosty support show <id>                             # el hiloghosty support reply <id> --body "Ya probé reconectar"   # si estaba resuelto, se reabre

En la web: Soporte en el menú de .

Soporte

Para el staff de Ghosty (User.isAdmin): lo que antes era un script en la caja por cada reporte. Leer conversaciones ajenas queda en la bitácora.

bash
ghosty agents ls --user ana@empresa.com --app android            # su lista tal como la recibe su app (tono, espacio, último uso; sin tokens)ghosty usage --boxes --by template                                # toda la flota por template: cuántas, RAM y vCPU reales, despiertas y dormidasghosty conversations ls --user david@empresa.com --since 7d          # sus conversaciones en cualquier agente (también --surface android)ghosty conversations show <agente> <conversación> --why              # clase del hilo, de quién es y si el dueño / su usuario lo ven en su lista o por ligaghosty turns stats --since 14d                                       # tasa real de fallos por motor, canal (Teams y A2A incluidos) y error; sin staff, canal prueba ni agentes borrados (--all los incluye)ghosty push log --user brenda@siiqtec.com --since 1d                 # qué avisos se le mandaron y qué contestó Apple/Googleghosty agents doctor --user quiroz@empresa.com                     # sus agentes: doctor, últimos turnos (y si la app recogió cada respuesta), plan/bolsa y cajas (marca duplicadas)ghosty usage --images --plan free --since 7d --by user              # cargos de imágenes contra las que entregaron los agentes; costo real contra la tablaghosty conversations show <agente> <conversación> --tools           # cada tool que corrió (secretos enmascarados) y los dominios externos que nombróghosty novedades create --title "PDF y audio" --body "…" --image hero.png --link chats --publishghosty novedades set <id> --min-version 12                           # si su app es más vieja, el botón dice «Actualizar» (Play, desde la app)ghosty novedades test <id>                                           # sólo a tu teléfonoghosty novedades send <id> --at "2026-10-02T12:00"                   # programado, hora CDMX (9–21 h)ghosty support ls --all --status open                        # la bandeja; cada caso también te llega por correo y lo contestas desde ahí (/resuelto en la 1.ª línea lo cierra)ghosty support reply <id> --all --body "Listo" --resolve     # le llega al cliente por correo

conversations archive|rm con --kind test|channel es para el dueño del agente (o staff): rm nunca borra hilos de clientes (--kind channel), que sólo se archivan porque su memoria es la que los sigue atendiendo. --kind personal lo usa cualquiera con acceso al agente y sólo toca SUS propios chats con él, nunca los de otra persona. Lo borrado desaparece también de las apps (iOS, Android) en su siguiente sincronización. push log se registra desde el 1-oct-2026 y se guarda 30 días; desde el mismo día incluye el push de las novedades (kind: novedad), y novedades ls dice cuántos entregó y rechazó FCM. agents ls --user --app enseña también sus teléfonos con la build de la app, y la columna «fetched» de agents doctor --user existe desde el 1-oct. --tools lee el transcript en Tigris (claude-worker) o el historial de la caja (goose, ghosty-lite); nunca con un turno en marcha en ese hilo.

Staff asignado

Un ejecutivo de Ghosty asignado a la cuenta de un cliente ve y opera, con su propia sesión, los agentes de esa cuenta (con y sin espacio), sus documentos, bases y tableros. No ve llaves ni tokens, no toca plan ni cobro, no traspasa ni borra. Sólo el staff asigna; el cliente lo ve como «Tu ejecutivo de Ghosty» en su cuenta. Cada asignación y cada escritura del ejecutivo quedan en la bitácora.

bash
ghosty staff assign brenda@siiqtec.com siiqtec@gmail.com --reason "migración SIIQTEC"   # asignar (si ya estaba, no hace nada)ghosty staff ls brenda@siiqtec.com                                    # a quién atiende (--all: también las revocadas)ghosty staff ls "" siiqtec@gmail.com                                  # quién atiende a esa cuentaghosty staff unassign brenda@siiqtec.com siiqtec@gmail.com --yes      # deja de atenderla en su siguiente clic

En el panel, el ejecutivo elige «Atendiendo: » en Documentos y bases y en Agentes; es una cookie que se revalida en cada request, nunca otra sesión ni «Entrar como».

Sitios

Los sitios que publican tus agentes, en <slug>.ghosty.page (nadie necesita cuenta propia de nada). sites ls enseña los tuyos: vivos, en pausa y despublicados que aún se pueden recuperar.

Plan Gratis: un sitio se pausa a los 30 días sin cambios (aviso 7 días antes; cada cambio le da otros 30). En pausa su liga enseña «Esta página está en pausa — Reactívala» y no se borra nada. A los 30 días de pausa se despublica (la liga ya no sirve y el slug queda apartado) y su copia se guarda 6 meses más; después se borra de verdad. Reactivarlo en cualquier momento antes de eso lo regresa tal cual, en la misma liga.

Sitios fijos: $49 USD al año o $5 USD al mes ($990 / $99 MXN), incluye hasta 3 sitios. Un sitio fijo no se pausa y va sin la franja «Hecha con Ghosty». ¿Necesitas más? Cada paquete extra suma 3 sitios por el mismo precio. Soltar un sitio, cancelar o un pago fallido lo regresan a la regla Gratis con aviso: nunca se pausa de golpe.

bash
ghosty sites ls                                                      # tus sitios: estado (fijado, en pausa, se pausa el…) y ligaghosty sites pin tacos-don-pepe                                      # fíjalo: con lugar libre al momento; si no, una liga de pago con tarjetaghosty sites pin tacos-don-pepe --interval month --currency mxn      # mensual y en pesos ($99 MXN al mes)ghosty sites pin landing-nueva --add-pack                            # ya usas tus 3: suma 3 más y fija ésteghosty sites unpin landing-vieja                                     # suelta su lugar (vuelve a la regla Gratis con aviso)ghosty sites pins                                                    # tu suscripción, lugares usados y qué sitios ocupanghosty sites pins --cancel                                           # cancela al final del periodo (--resume lo deshace)ghosty sites ls --house                                              # staff: los sitios de la casaghosty sites publish ./melon.html --title "Gelatina de sandía" --slug gelatina-de-sandia   # staff: un .html suelto o una carpeta con index.htmlghosty sites publish ./landing/ --site gelatina-de-sandia            # staff: actualiza ése (sin --site siempre nace uno nuevo)ghosty sites slug arbol-palpitante gelatina-de-sandia                # staff: cambia el slug de cualquier sitio vivo

El slug: minúsculas, números y guiones, de 3 a 60, sin guion al inicio, al final ni doble, y no reservado (api, admin, s, www, app, assets, static, dashboard, login). Errores con código: slug_invalid, slug_taken y slug_unsupported (EasyBits todavía no acepta elegir ni cambiar el slug; no cambia nada y sale con 1). Topes: 1 MB por archivo, 8 MB y 40 archivos por sitio.

bash
ghosty browser logout          # cierra la sesión del navegador: invalida los tokens de Ghosty para Chrome de tus agentes de terminal y desconecta la extensión

Pide confirmación (--yes para scripts). Para volver a conectar la terminal, copia el comando nuevo del panel de la extensión. Ver .

Partners

ghosty partner le da un agente a cada uno de tus clientes (un solo agente compartido, memoria por cliente). Tiene su propia página: .

Idioma

El CLI habla español si tu sistema está en español (LANG=es_MX…) y en inglés en otro caso; --lang es|en o GHOSTY_LANG lo fuerzan. También traduce al inglés los mensajes del servidor. Con --json las llaves y los códigos no cambian.

Autocompletado

bash
source <(ghosty completion zsh)          # en ~/.zshrc, después de compiniteval "$(ghosty completion bash)"          # en ~/.bashrcghosty completion fish > ~/.config/fish/completions/ghosty.fish

Completa comandos, subcomandos y opciones, y los nombres de tus agentes y espacios (se guardan 5 minutos).

Opciones globales

OpciónQué hace
--jsonSalida para máquinas: stdout lleva sólo JSON. Avisos y progreso van a stderr.
--token <token>Usa ese token en vez de la sesión. También por la variable GHOSTY_TOKEN.
--profile <nombre>Usa una sesión guardada aparte (también GHOSTY_PROFILE): por ejemplo una por cuenta. Letras, dígitos, - y _.
-y, --yesSalta las confirmaciones (obligatorio sin terminal).
-h, --helpAyuda. También ghosty help <comando>.
-v, --versionVersión.

Un token de agente (gat_…, se genera en la ficha del agente) sólo alcanza a ese agente: sirve para agents get/set/restart, files, skills, mcp y try, pero no para listar agentes ni para chat.

Variables de entorno

VariableQué hace
GHOSTY_TOKENToken en vez de la sesión (como --token).
GHOSTY_PROFILEPerfil de sesión (como --profile).
GHOSTY_URLOtro servidor (default https://www.ghosty.studio).
XDG_CONFIG_HOMEDónde se guarda la sesión: $XDG_CONFIG_HOME/ghosty/config.json (default ~/.config). Con perfil, config.<nombre>.json.
NO_COLORSin colores ni banner.
GHOSTY_NO_UPDATE_CHECKNo preguntar a npm por versiones nuevas (tampoco lo hace con CI). Por default revisa una vez al día y avisa por stderr.
EASYBITS_API_KEYLlave de EasyBits para dbs import --from easybits:….
GHOSTY_PARTNER_KEY · GHOSTY_PARTNER_KEY_SECRETFirma los comandos de partner con la credencial de tu servidor (GHOSTY_PARTNER_SECRET también vale, por compatibilidad). Ver .

Códigos de salida

CódigoSignifica
0Bien.
1Error de la API (el mensaje dice cuál).
2Uso incorrecto: comando u opción que no existe, falta un argumento.
3Sin sesión. Corre ghosty login.