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-11-05

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 ls                                       # --json: motor, modelo y espacio en cada filaghosty 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 completa (también: agents show <id>)ghosty 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> --web-search on        # búsqueda web nativa del motor (Claude, Gemini), aparte de las tools de gsghosty agents set <id> --chat-starters "¿Qué pendientes tengo?|Resume mis correos"   # sugerencias de SU chat (app, Mac, /c): hasta 5 de ≤ 80 caracteres; "" las quitaghosty agents set <id> --channel-roles teams=cliente,programado=equipo   # quién habla en cada canal: equipo (escribe en bases, tools admin) o clienteghosty agents set <id> --extensions developer=off   # extensiones del config.yaml de su caja (Ghosty · Lite y Goose); se funden con lo guardadoghosty agents set <id> --email-any on          # enviar_correo puede escribir a cualquier dirección desde canales de cliente (off = sólo a quien escribe; sólo el dueño)ghosty 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> --quote plantilla=@cotizacion.html,logo=https://…/logo.png,comercial="Ana Ruiz",numeros=es   # el PDF sale con TU formato (plantilla HTML propia)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 agents set <id> --box 4096:10           # caja de 4 GB que atiende 10 conversaciones a la vez (sólo staff; recicla sus cajas)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> --start                 # la levanta (o la despierta) ya, sin gastar un turno; dentro de las cajas de tu planghosty 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.

--chat-starters son las sugerencias del chat del propio agente (app, Mac, /c); las del widget web son otras y van con agents embed --starters. --channel-roles sólo cambia teams y programado (turnos programados): chat siempre es el equipo, y WhatsApp Business, Messenger, el demo y el widget siempre son clientes; el WhatsApp personal pone el rol por grupo (channels wa groups set --role).

Token, memoria y cesión

bash
ghosty agents token rotate <id>                # token gat_ nuevo: sale UNA vez en stdout (el anterior deja de servir)ghosty agents token revoke <id>                # cierra el canal del editor; nada entra hasta rotar otroghosty agents memory ls <id>                   # las reglas que le enseñó su equipo y sus promos (vigente hoy, prendida, apagada)ghosty agents memory add <id> "No ofrezcas envío los domingos" --scope wa   # sin --scope vale en todos sus canalesghosty agents memory edit <id> <id-regla> "Envío gratis desde $999"ghosty agents memory add <id> --promo --title "Buen Fin" --details "15 % en todo" --from 2026-11-13 --until 2026-11-16ghosty agents memory disable <id> <id-promo>   # deja de ofrecerla y la conserva (enable la vuelve a prender; rm la borra)ghosty agents transfer <id> --to ana@empresa.com --dry-run   # cederlo con su caja, memoria y archivos: a qué espacio llega y qué le faltaríaghosty agents transfer <id> --workspace ventas --dry-run     # moverlo entre tus espacios (none = tu espacio personal)

token y transfer van con tu sesión de dueño, nunca con el token gat_ del agente: un token no se rota a sí mismo ni regala su agente. En Claude Code, Ghosty · Lite y Goose (motores ACP), rotar o revocar reinicia el relé y corta el turno en curso; si el cambio no llega a la caja, no cambia nada. Rotar es lo mismo que «Conexión con tu editor» en la ficha.

memory es lo de la ficha → Memoria: las reglas viajan en cada conversación del agente, también con clientes (tus preferencias personales van en me memories). Una promo con fechas sólo se ofrece esos días (hora de CDMX).

transfer --to pide escribir el correo: el agente deja de ser tuyo. Llega al espacio que digas con --workspace (de esa persona); si tiene uno, a ése, y si no, a su espacio personal. El dry run avisa si le falta la llave del proveedor. Mover entre tus espacios valida antes el cupo del plan, el modelo y el @handle, y no mueve una caja con un turno en curso salvo --force. Queda en la bitácora (agent.transfer, agent.move, agent.token.rotate).

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.mdghosty files ls <id> adjuntos --session <conversación>   # agente de pool: la carpeta de ESA conversación en su cajaghosty files rm <id> adjuntos/ab12cd34/cookies.txt --session <conversación>

files es el disco del agente; los archivos de tu cuenta (lo que subiste y lo que entregaron) son ghosty me files. Con --session nunca se despierta una caja dormida: si lo está, sale paused.

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
# Un servidor remoto con su URL (lo de «Tu sistema» en la ficha)ghosty mcp connect <id> --name notion --url https://mcp.notion.com/mcp     # si pide OAuth, abre el inicio de sesión (--no-open imprime la liga)ghosty mcp connect <id> --name crm --url https://crm.ejemplo.com/mcp --from-env CRM_TOKEN   # con token: va como Authorization: Bearer

connect agrega un servidor sin reescribir la lista (reemplaza al que tenga el mismo nombre). Sin --from-env, gs prueba el servidor: si contesta, se agrega tal cual; si pide OAuth, lo autorizas en el navegador y gs lo agrega y le refresca el token. El token se pasa con el NOMBRE de una variable de entorno, nunca el valor como argumento.

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.

Plantilla propia. Con --quote plantilla=@cotizacion.html el PDF sale de tu HTML (una hoja, con tu logo y tu acomodo) en vez del formato de Ghosty; plantilla= vuelve al de Ghosty. Variables: {{logo}}, {{empresa}}, {{rfc}}, {{direccion}}, {{telefono}}, {{correo}}, {{comercial}}, {{folio}}, {{fecha}}, {{vigencia}}, {{cliente}}, {{cliente_domicilio}}, {{cliente_rfc}}, {{subtotal}}, {{descuento}}, {{base}}, {{iva_pct}}, {{iva}}, {{total}}, {{moneda}}, {{notas}}; por renglón, dentro de {{#items}}…{{/items}}: {{sku}}, {{concepto}}, {{cantidad}}, {{unidad}}, {{precio}}, {{iva_pct}}, {{importe}}. {{#variable}}…{{/variable}} pinta el bloque sólo si hay valor. Los montos llegan sin símbolo; numeros=es los escribe 1.234,56.

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

Arriba de las revisiones enseña la ficha del agente: motor y modelo, effort (FLEET_EFFORT, o el del modelo), si tiene subagentes nativos, si atiende /c sin cuenta (ANON_NATIVE_AGENT_ID) y, sólo para el staff de Ghosty, el tamaño de su caja (MB y conversaciones por caja). En --json es el campo info.

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 checkpoints <id> <base>                   # puntos de regreso: se toma uno antes de cada escritura del agenteghosty dbs restore <id> <base> <checkpoint>          # regresa la base a ese punto (antes toma otro, así que se puede deshacer)ghosty 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> --canal anon --since 1d          # sólo un canal: chat · teams · whatsapp · wa · messenger · programado · prueba · demo · embed · anon (/c sin cuenta); cada fila dice su canalghosty 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 jobs <id>                               # lo que tiene en segundo plano de tus chats (video, audio, subtítulos, descargas; 24 h) y si ya le llegó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.

turns jobs es sólo lectura (GET /api/v2/me/agents/:id/tasks): los encargos en segundo plano de tus chats personales de las últimas 24 h. Se detienen con turns cancel; lo que se repite a una hora no es un encargo sino un turno programado (schedule add --every).

--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> 5512345678ghosty channels whatsapp connect <id>               # abre o retoma la conexión de un número y da una liga para cualquier pantallaghosty channels messenger connect <id>              # abre Canales para conectar una página con Meta

whatsapp connect no pide saldo y no prende al agente. La liga sirve 1 hora en cualquier pantalla, por si tu teléfono no termina el inicio de sesión de Meta. Si lo corres otra vez, retoma la misma conexión y te dice si ya quedó (--no-open o --json sólo imprimen la URL). messenger connect abre la página Canales, porque ese inicio de sesión de Meta no se puede hacer desde la terminal.

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. name sólo despierta si el texto escribe su nombre o un alias (una @ o una respuesta no cuentan). all contesta cada mensaje (los grupos importados y los creados con create). --alias "tilin,ghos": otros nombres que lo despiertan en ese grupo además del suyo, como el apodo con que le dicen ahí (reemplaza la lista; --alias "" la vacía).

¿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 messenger status <id>                 # cada página: quién contesta, último webhook y si el token sigue vivo (le pregunta a Meta)ghosty channels messenger on|off <id> <página> [--take] [--dry-run] [--yes]   # que este agente la conteste, o que deje (apagada sigue registrando)ghosty channels whatsapp enable <agente> 5512345678 --dry-run   # regresarlo

Microsoft Teams

El agente como bot del Microsoft Teams de una empresa, con un Azure Bot registrado en SU tenant (sin tienda de apps). Paso a paso en .

bash
ghosty channels mteams connect <id> --app-id <guid> --tenant <guid> [--name "Sofi"]   # el secreto: --secret o GHOSTY_MTEAMS_SECRETghosty channels mteams ls <id>                       # bots, messaging endpoint, último mensaje y último problema (token rechazado, envío fallido, app desinstalada)ghosty channels mteams zip <id> <bot> --out sofi-teams.zip   # el paquete que el admin sube en Teamsghosty channels mteams off|on|rm <id> <bot>

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 contacts <id> --integration <id> --mute 5512345678   # el agente nunca le contesta a ese númeroghosty channels whatsapp contacts <id> --integration <id> --allow 5512345678  # siempre le contesta, aunque sea contacto conocido (--unmute lo regresa a la regla general)ghosty channels whatsapp contacts <id> --integration <id> --signature 👾        # firma de sus mensajes («👾: Hola…»); off = sin firmaghosty channels whatsapp contacts <id> --integration <id> --list --q mamá      # la agenda del teléfono con la regla de cada contactoghosty channels whatsapp link <id> --integration <id> --new-only on   # el agente sólo contesta a contactos nuevos; los de antes los atiendes túghosty 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 boards access siiqtec "Siiqtec - Ixmiquilpan"       # quién lo ve: todo el espacio o «sólo estas personas»ghosty boards access siiqtec main --add ana@x.com --until 14d   # súmala a la lista; se retira sola a los 14 días (--remove la quita, --everyone lo abre a todos)ghosty boards followups siiqtec main template      # da de alta en Meta la plantilla de seguimiento (utilidad)ghosty boards followups siiqtec main on            # cada cotización recibe toques a los 2, 7 y 14 días; paran si contesta o pagaghosty 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)ghosty conversations continue <id> <conversación>    # una conversación nueva enlazada: el agente recibe el final de ésta en su primer turnoghosty conversations model <id> <conversación> gpt-5.6-luna   # el modelo de esa conversación, desde el siguiente turno (Ghosty · Lite y Goose)ghosty conversations permission <id> <conversación>  # qué está esperando el turno (id, título, opciones)ghosty conversations permission <id> <conversación> allow [--always] [--id PERMISO]   # o deny, o el id de una opciónghosty conversations share <id> <conversación>       # liga de sólo lectura sin cuenta: /s/… (--off deja de compartir)ghosty conversations subagents <id> <conversación>   # sus subagentes nativos: estado, tokens, tools, minutosghosty conversations subagents <id> <conversación> stop <task-id>   # detiene ése; el turno y los demás siguen

Cuando un turno de Ghosty · Lite o Goose pide permiso (mandar un correo, correr un comando) se detiene hasta que alguien conteste. chat imprime la petición con el comando para contestarla (--json: una línea permission con id y options); sólo contesta quien pidió el turno, desde cualquier terminal, la app o la web. Una liga compartida es una ventana, no una foto: enseña también lo que se hable después, y --off la cierra.

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.

Vigilar páginas

Dale al agente las páginas que revisas cada día (precios de la competencia, una convocatoria, el estado de un trámite) y que te diga algo sólo cuando cambien. La plataforma baja la página cada N horas sin turno del modelo, así que revisar no gasta saldo; si cambió, el agente recibe un turno en esa conversación con lo que cambió y te avisa por su canal. Si según tu --instruction el cambio no importa, contesta OK y no avisa.

bash
ghosty watch add <id> https://competencia.mx/precios --every 12h --focus "Planes" --instruction "avísame si bajan el Pro" --title "Competencia"ghosty watch ls <id>                          # estado, último cambio y conversaciónghosty watch check <id> <watch-id> --dry-run  # baja y compara ya; no guarda ni avisaghosty watch check <id> <watch-id>            # revísala en el siguiente barridoghosty watch rm <id> <watch-id>ghosty watch resume <id> <watch-id>           # reanuda una pausada o renueva una vencida

Al comparar se ignoran fechas, horas, «hace 5 minutos», scripts, imágenes y URLs de las ligas. --focus compara sólo una parte: el texto de un encabezado (hasta el siguiente de su nivel) o de una línea. Reglas: cada 1 h como mínimo y 7 días como máximo (default 24 h), vence a los 90 días (--days, hasta 365), 10 por agente y por cuenta según el plan (Gratis 2, Pro 10, Power 25, Max 50, espacio de equipo 25). Tras 5 lecturas fallidas seguidas se pausa y te llega un push, una sola vez.

Sin --conversation se abre una conversación nueva; con --conversation wa:<jid> o waba:… el aviso sale por ese canal, como un turno programado. El agente puede hacer lo mismo solo con sus tools watch_add, watch_list y watch_remove.

Brief de la mañana

Cada mañana, a tu hora (7:30 por default, todos los días), cae en tu chat personal más reciente con tu agente principal un resumen corto: lo que va en curso y lo que te necesita, en 5 renglones, con una nota de voz arriba y un push. Viene encendido; sólo llega si hay algo que contar.

bash
ghosty brief                                   # encendido, voz, hora, días y el último que salióghosty brief off                               # apágalo (on lo prende)ghosty brief --at 8:15 --days 1-5              # a las 8:15, de lunes a viernesghosty brief --voice off                       # sin nota de vozghosty brief pause 7                           # no lo mandes 7 días; vuelve solo (o una fecha: 2026-11-20)ghosty brief resume                            # quita la pausaghosty brief run --dry-run                     # arma el de hoy y lo imprime (con la liga del audio); no manda nadaghosty brief run                               # mándalo ya a tu chat

--days acepta todos, lv, fds o números de 0 (domingo) a 6 con comas y rangos (1-5, 0,6). El pie del mensaje («¿Te sirve? · Ya no me lo mandes») funciona con un toque, y también puedes pedirle a tu agente que lo prenda, lo apague o lo pause. La pausa va de 1 a 90 días, regresa sola el día marcado y prender o apagar la quita; ghosty brief run lo manda aunque esté en pausa. API: GET/PUT /api/v2/me/digest (pauseDays, o pausedUntil con fecha o null).

Teams

Escribe en un room o hilo a tu nombre, como en el composer: el @agente que menciones contesta (el mismo filtro de varios @, el auto-seguir del hilo y el tope de relevos). Sin hilo abre uno nuevo, como el botón «Pedir».

bash
ghosty teams post business#mailmask "@plan que el Deploy espere al ci con needs"ghosty teams post business#mailmask/5612 "@plan ¿en qué va?" --wait

--wait espera a que cada agente mencionado termine e imprime sus respuestas (--timeout en segundos, 600 por defecto; sale con 1 si se acaba). Hace falta ser miembro del Teams del espacio, con tu sesión: el token de un agente (gat_) no escribe. Hasta 30 mensajes por hora por persona, y cada uno queda en ghosty audit ls --action teams.post.

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>[,<file-id>…]         # pregunta antes; sin terminal pide --yesghosty me files rm --q cookies --dry-run          # qué borraría, sin borrar nadaghosty 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 me docs ls                                  # documentos editables que te entregaron tus agentes (los que editas en /c)ghosty me docs get <doc>                           # título y versiones (<doc> = id o la liga /app/docs/<id> que da el agente)ghosty me docs export <doc> --format md > propuesta.md   # sin --out lo imprime; PDF (default) va a un archivoghosty me docs check <doc> --language es           # ortografía y gramática por bloque (es, en-US, pt-BR, fr)ghosty me docs tts <doc> --block 0 --segment 1 --out frase.wav   # una frase (o el bloque entero) en voz altaghosty me docs restore <doc> 2                     # la versión 2 de vuelta como versión nueva (--rev N en get/export/check/tts)ghosty docs                              # abre esta documentación

me docs son los documentos editables que el agente entrega en un hilo (los abres en /c y la liga dice /app/docs/<id>). No son los de agents docs (archivos de tu cuenta que un agente lee) ni 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 --agent <id> --by model,day --cost   # un agente: tokens y USD a precio de lista del proveedor por modelo/día/canal (lo que costaría por API)ghosty usage --agent <id> --by visitor            # /c sin cuenta: por visitante USD, mensajes, página/PDF y si creó cuenta; USD por visitante y por cuenta nuevaghosty usage --boxes --workspace siiqtec    # cajas del espacio contra su tope (spares, dormidas) y por agenteghosty plan open siiqtec                    # la página del plan del espacio: pagar, cambiar de plan, facturas (sin espacio o con personal: /c/uso)ghosty 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, plan, renovación y slug de un espacio. Leer las bolsas lo puede el dueño; cambiarlas, cambiar el plan, 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 de 30 días, una por cuenta; si ya la usaste nace cerrado, "closed": true, y se abre pagando); 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 | none (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 plan business pro --courtesy --dry-run       # staff: trial | pro | empresarial, mismas reglas que /admin/tenants; enseña plan, modelos, tokens y «pagado hasta» antes → después. Sin cobro en Stripe ni correo al cliente; --until FECHA mueve «pagado hasta», --note va a la bitácoraghosty 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, renovacionesghosty spaces members ls business                           # su gente: rol, si ya entró y hasta cuándo (dueño, admin o staff)ghosty spaces members add business chrome-review@ghosty.studio --until 14d   # asiento temporal: se retira solo (--role admin para que invite y quite)ghosty spaces members add business ana@x.com --role collaborator --room sales   # colaborador de UN room: sin asiento ni agente personalghosty spaces members rm business chrome-review@ghosty.studio --yesghosty access why chrome-review@ghosty.studio <id>          # por qué ve un agente: dueño, asiento, compartido, staff asignadoghosty access why ana@x.com --workspace siiqtec --board main   # o un tablero: rol en el espacio, Ventas y la lista

Colaboradores de un room. --role collaborator --room <room> invita a alguien a UN room de Teams del espacio: no ocupa asiento, no le nace agente personal y, si su cuenta sólo tiene ese rol, al entrar va directo a ese room. Si ya es miembro, admin o staff, el alta se rechaza y no se le cambia el rol; para pasarlo a miembro, quítalo y vuelve a invitarlo.

[blocked]Acceso temporal. --until (fecha 2026-10-28, que vence al final del día en CDMX, o 14d / 12h) sirve para cuentas de revisor (Meta, Google, Apple) que entran por días: el asiento o el lugar en la lista del tablero se retira solo y queda en la bitácora (workspace.members.rm, board.access). Repetir add --until sobre alguien que ya está mueve la fecha; add sin --until lo vuelve fijo. Quitar a alguien del espacio también lo saca de las listas de sus tableros.

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

Delegar desde la terminal

Tu agente de código (Claude Code, Codex) le pasa a la fábrica lo largo y aislado y sigue con lo suyo. Primero, si el repo no está en ningún room, déjalo listo desde la terminal:

bash
ghosty factory rooms connect blissito/ghosty-studio --room studio --create --workspace business# ✓ Creé #studio y le conecté blissito/ghosty-studio#   fábrica: activa · CI ws-business#   listo para agentes: nivel 1/3 (5/9) · falta: ci, codeowners, dependabot, protectedghosty factory rooms ls --workspace business             # qué rooms tienen repo y trabajan como fábricaghosty factory rooms repos --workspace business          # los repos que ve tu GitHub App y en qué room está cada unoghosty factory sprints ls --workspace business           # los sprints que propuso @plan (borrador, activos) y cuántos tickets tienen mergeghosty factory sprints show 12 --workspace business      # sus tickets en orden, con dependencias, etapa y runghosty factory sprints approve 12 --workspace business   # una sola firma para todos los tickets incluidos

rooms connect revisa que tu GitHub App vea el repo (si no, te da la liga para darle acceso). Desconectar (rooms disconnect … --yes) lo puede quien lo conectó o el dueño.

factory run publica «@plan » en el room conectado al repo, a tu nombre, como si lo escribieras en Teams: el mismo plan, las mismas firmas y la misma tarjeta.

bash
ghosty factory run "Agrega el rol COLLABORATOR: invitado por room, aterriza en el room, sin agente personal. Queda cuando una invitación a #factory entra directo ahí" \  --repo blissito/ghosty-studio --wait --workspace business# ✓ Enviado a @plan en #factory (hilo 8812)# 10:42 @plan está escribiendo el plan# 10:46 #31 plan listo, espera tu firma# Léelo: ghosty factory runs show 31 --full --workspace business# Firma: ghosty factory runs approve 31 --plan-version 1 --workspace business
ghosty factory runs approve 31 --plan-version 1 --workspace business --yesghosty factory runs watch 31 --workspace business      # regresa con el PR listo (o si hay que decidir)ghosty factory runs merge 31 --workspace business --yesghosty factory runs card 31 --workspace business       # baja la tarjeta viva al final del hilo
  • --wait y watch regresan cuando el pedido te necesita (firmar el plan, decidir tras un escalado, mergear el PR) o termina, e imprimen el siguiente comando. Si se acaba --timeout (1800 s por defecto) salen con código 1.
  • approve exige la versión del plan que leíste: si @plan ya entregó otra, se rechaza.
  • changes --note "…" le regresa el plan a @plan con tu nota (o replanea tras un escalado).
  • Cualquier miembro del espacio puede pedir, firmar y mergear. Todo queda en la bitácora: factory.run, factory.run_approve, factory.run_merge.
  • Una sola tarjeta viva por pedido: card la baja y la anterior queda como huella quieta con liga a la viva.

Qué hacer con un pedido escalado

Cuando @check frena un pedido tres vueltas seguidas, o le falta algo que @build no puede dar, el pedido espera a una persona. runs show dice por qué se frenó y runs advise recomienda qué hacer:

bash
ghosty factory runs advise 115 --workspace business# #115 Que @build lo arregle · confianza alta · gpt-5.6-luna# Los cuatro puntos caben en el plan firmado; dos son pruebas que se pidieron desde la vuelta 1.# Nota para @build#   1. Filtrar activeMarketers con tieneAsiento y borrar workspaceMarketer al quitar a alguien#      campaign-permission.server.ts:34-36#   …# @check revisa sólo#   Esos cuatro puntos# No se aplicó nada. Para aplicarla (edita la nota antes si quieres):#   ghosty factory runs approve 115 --note "1. …" --check-scope "…" --workspace business
  • Compara los hallazgos de @check contra el plan firmado. Si lo que falta cabe en el plan, recomienda que @build lo arregle. Si contradice el plan o no estaba previsto, recomienda rehacerlo (changes).
  • Cada punto de la nota cita el hallazgo o el paso del plan que lo justifica.
  • No aplica nada. Aprobar con --note le da a @build una vuelta más con esa nota, y --check-scope hace que @check revise sólo eso: lo nuevo que encuentre va como nota, no como hallazgo.

Variables de la preview

Si @check escala porque la preview no arranca (le faltan variables de entorno), otra vuelta de @build no sirve: las variables las da una persona. Viven en tu compu (tu .env, tu gestor de contraseñas), así que el camino es pedírselo a tu agente de terminal: «pon las variables de entorno de la fábrica para este repo».

bash
ghosty factory env ls blissito/ghosty-studio --workspace business# blissito/ghosty-studio · #studio# guardadas: REVIEWER_EMAIL# faltan: DATABASE_URL, SESSION_SECRET, PROVIDER_KEYS_MASTER# #125 está escalado porque su preview no arranca (DATABASE_URL, SESSION_SECRET, PROVIDER_KEYS_MASTER)
ghosty factory env push blissito/ghosty-studio .env.preview --gen SESSION_SECRET,PROVIDER_KEYS_MASTER --workspace business# ✓ blissito/ghosty-studio: 3 variables guardadas; sus previews se están reconstruyendo.# #125 esperaba esto: ghosty factory runs recheck 125 --workspace business
ghosty factory runs recheck 125 --workspace business --yes   # @check revisa el mismo PR, sin vuelta de @build

Un pedido que dejó de avanzar (la tarjeta dice «Sin avanzar») se mueve como desde la tarjeta: resume hace que su rol siga donde se quedó, stop detiene el turno que corre y cancel cierra el pedido. Si un rol está trabajando, resume no hace nada y te sugiere stop. Staff de Ghosty puede usar estos tres aunque no sea miembro del espacio (nunca firmar ni mergear):

bash
ghosty factory runs resume 27 --workspace palmera-legal --yes# ✓ #27: su rol lo retomó (construyendo).

Cuando @check escala una decisión, deja 2–3 caminos con su acción. choose sin letra los lista; con letra aplica uno, y la elección le llega literal al siguiente rol:

bash
ghosty factory runs choose 153 --workspace business#   a) Arreglar el permiso en main (recheck)#   b) Hacer merge así (merge_as_is)ghosty factory runs choose 153 a --workspace business --yes

merge_as_is hace merge con el CI como está, con checks en rojo incluidos. Es para cuando lo rojo no lo causa el PR (un permiso del workflow, jobs que GitHub no arrancó). Pide confirmación y queda en bitácora (merge_override).

  • ls dice qué falta: lo de .env.example y lo que nombran los pedidos escalados por bloqueo. Sin repo, usa el origin de GitHub de la carpeta donde corre.
  • push agrega: cambia las llaves que trae y deja las demás (--replace reemplaza el .env entero). --gen genera ahí mismo llaves al azar (32 bytes hex) para sesiones y cifrado.
  • Usa valores desechables (una base de prueba, llaves nuevas), nunca los de producción: la preview corre el código del repo y puede leerlos. Las que tocan producción salen marcadas.
  • Los valores van cifrados a la bóveda y nunca regresan: la CLI sólo imprime nombres. Ver lo puede cualquier miembro que vea el repo; guardar, sólo el dueño del espacio. Queda en bitácora (factory.env_set, con los nombres).

Ver y corregir pedidos

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, y se rehace solo si el pedido tuvo eventos después). Ver :

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

Antes que los atascos, cruza los criterios del plan aprobado con la evidencia: si @check aprobó un criterio «en la preview» sin la preview lista, se mezcló «sin preview», el smoke falló sobre el commit que se mezcló o se aprobó un criterio de CI con el CI en none, sale arriba como approved_unmet_criterion:

bash
ghosty factory runs why 96 --workspace business# #96 approved_unmet_criterion · impacto alto · gpt-5.6-luna# Criterio incumplido y aprobado#   16:10 approved_without_preview  «La reserva pública de un servicio se completa de punta a punta en la preview del PR»#     @check aprobó y el veredicto no trae preview lista; dice: «…se probó contra el build RR8 en la caja…, no en la preview»

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 correoghosty support link <id> blissito/mailmask#52                # al cerrarse el issue (o mergearse el PR), «ya quedó» a todos los casos ligados

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

Ajustes

Perillas de la plataforma que el staff de Ghosty mueve sin desplegar: qué agente atiende /c sin cuenta en caja (ANON_NATIVE_AGENT_ID), qué agentes y superficies tienen subagentes nativos, el constructor de páginas para todos. Cada cambio queda en la bitácora; las que llevan JSON siguen en /admin/settings.

bash
ghosty settings ls                                                     # valor, de dónde sale (fila, env o default) y qué esghosty settings set ANON_NATIVE_AGENT_ID cmu7pgbyr0001gee3ruk172mm      # /c sin cuenta lo atiende ese agente en cajaghosty settings set NATIVE_SUBAGENT_AGENTS +cmu7pgbyr0001gee3ruk172mm   # en listas: +id agrega, -id quitaghosty settings unset ANON_NATIVE_AGENT_ID                              # vuelve al default (/c sin caja)

Versiones de las apps

Las compuertas de versión de las apps de Ghosty (iOS, Android y Notch, la de Mac), sólo para el staff. suggestBuild le enseña a las builds menores un aviso de «actualiza» que se puede cerrar; minBuild deja sin entrar a las builds menores hasta que actualicen. Se sube suggestBuild cuando la versión nueva ya está en la tienda, nunca antes: el aviso manda a la gente allá. minBuild pide confirmación y nunca puede pasar de suggestBuild. Cada cambio queda en la bitácora; los flags de emergencia siguen en /admin/settings.

bash
ghosty app ls                                  # minBuild y suggestBuild de iOS, Android y Notch, y los flagsghosty app suggest 106                         # iOS: las builds menores a 106 ven el aviso de «actualiza»ghosty app suggest 14 --platform android       # lo mismo en Android (su versionCode)ghosty app min 95 --yes                        # las builds menores a 95 ya no entran hasta actualizar

Cupones

Un cupón suma saldo a la cuenta personal (en pesos de costo, como las recargas: una recarga de $99 suma unos $49.50) y, si lo pides, presta un plan (pro, power o max) hasta una fecha; un cupón nunca baja el plan de quien ya paga uno mayor. Un canje por cuenta; con --eligibility hackathon:<evento> sólo lo canjean los correos de una aplicación aceptada en ese evento; con --agent <id> cada cuenta que lo canjea recibe su propia copia de ese agente (personal: lo que gasta sale de su plan y del saldo del cupón). Nace como borrador: nadie lo canjea hasta que lo activas con --on. Sólo staff crea y edita; cualquiera canjea.

bash
ghosty coupons create HACK2026 --credit 0 --plan pro --until 2026-11-13T05:59:00-06:00 --max 100   # borradorghosty coupons set HACK2026 --credit 50 --on      # ponle monto y actívaloghosty coupons ls                                  # monto, plan prestado, vigencia, canjes y estadoghosty coupons set HACK2026 --plan pro --from 2026-11-12T00:00:00-06:00 --until 2026-11-27T00:00:00-06:00 --redeem-by 2026-11-12T23:59:59-06:00 --convert-promo HACK2026-50   # el plan arranca el día del evento, el canje cierra esa noche y al terminar se ofrece seguir con ese código de Stripeghosty coupons show HACK2026                       # quién lo canjeó, su ventana de plan y quién ya pagaghosty coupons redeem HACK2026                     # canjéalo para tu cuenta

La persona también lo canjea en («Canjear cupón») o con la liga directa https://www.ghosty.studio/canjear?codigo=HACK2026 (pide entrar y vuelve a /c/uso con el resultado).

Vigía de campañas

Cada hora revisa las cuentas de Meta conectadas (Ghosty Ads) y los números de WhatsApp «sólo anuncios», y avisa al staff (correo, WhatsApp y room de Teams) si una campaña activa se pausa o Meta deja de entregarla, si la cuenta queda con pago pendiente, si la conexión con Meta caduca en 7 días o si un número pasa 24 h sin leads de anuncio. Meta no avisa nada de esto por webhook. Cada aviso sale una vez.

bash
ghosty ads watch                  # cuentas y números vigilados: último revisado y último avisoghosty ads watch run --dry-run    # lo que avisaría ahora, sin avisarghosty ads watch run              # una vuelta ahora (avisa y guarda)

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.

Apps con backend, su base de datos y checkpoints: .

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 rm landing-de-prueba                                    # bórralo: deja de servirse y no se deshace (--yes sin terminal)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 domain add agenda-perdix reservas.midominio.com         # dominio propio para una app: te dice el registro DNS que ponesghosty sites domain verify agenda-perdix reservas.midominio.com      # vuelve a mirar el DNS; listo = https://reservas.midominio.comghosty sites domain ls agenda-perdix                                 # los dominios de la app y su estado (rm <slug> <dominio> lo quita)ghosty sites show agenda-perdix                                      # todo de la app: estado (Lista/Arrancando/Dormida/Falló), dominios, nombres de variables, base, archivos, tareasghosty sites env set agenda-perdix STRIPE_SECRET_KEY=sk_live_…        # variables de la app (env ls sólo da nombres; env rm <slug> NOMBRE la borra)ghosty sites cron pause agenda-perdix cm123                          # tareas programadas: cron ls, pause|resume|rm <slug> <id>ghosty sites files rm agenda-perdix cm456                            # archivos que guarda la app: files ls, rm <slug> <id>ghosty sites errors agenda-perdix --since 6h                         # errores del servidor y del navegador, agrupados (--kind, --req-id)ghosty sites agent agenda-perdix create                              # el agente dentro de la app (Haiku 5.5); --agent <id> liga uno tuyo, --model lo cambiaghosty 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 .

Voz

ghosty tts dice un texto con la voz de la casa (Kokoro, español de México, con el léxico de pronunciación de Ghosty) y lo guarda en un .wav. Es la misma voz de las notas de voz: sirve para oír cómo sonará algo antes de mandarlo.

sh
ghosty tts "Hola, gracias por escribir. Te aviso por WhatsApp."ghosty tts "Tu cita quedó el jueves a las cinco." --voice ef_dora --out cita.wav && afplay cita.wav

Voces: em_santa (hombre, la de la casa, default), em_alex (hombre) y ef_dora (mujer). Las marcas (WhatsApp, Claude, GitHub, ghosty.studio…) se escriben normal: el léxico corrige cómo suenan. Hasta 400 caracteres y 60 frases por minuto.

Transmitir en vivo

ghosty events live manda los eventos del espacio a tu canal de YouTube y a una página de Facebook, sin copiar llaves: se conectan por OAuth y «prepare» crea el evento en cada destino y carga las llaves en la sala de eventos (hazlo con la sala vacía, la reinicia). Lo mismo está en Teams: Ajustes del room → Evento (modo webinar) → «Transmisión en vivo».

sh
ghosty events live connect youtube --workspace mi-espacio     # abre el navegador; elige cuenta y canalghosty events live connect facebook --workspace mi-espacio    # elige la páginaghosty events live prepare --title "Hackatón" --privacy unlisted --at 2026-11-12T19:00ghosty events live check     # qué destinos tiene cargados la salaghosty events live ls        # a dónde transmite el espacioghosty events live unlink facebook

Después, en el room, el anfitrión aprieta Grabar con «En vivo» marcado y sale al aire solo; YouTube cierra la transmisión al cortar. --only youtube prepara sólo ese destino. Facebook siempre sale público en la página.

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.