Referencia de comandos
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
Agentes
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
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.
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 .
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
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.
- 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}. ConNOMBREen 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).
applyno 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
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.
- 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 doctorlo marca (prompt.base). --dry-rundice si todas aplican (--out FILEescribe el resultado).--prompt-base nonesuelta 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:
- Se aplica en el servidor, sobre el prompt de ese momento: no hace falta bajarlo con
get --prompt-outy volver a subirlo. - Si una edición no encuentra su lugar, no cambia nada (409 con cuál fue).
--prompt-patchy--prompt-appendjuntos: 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
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
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.
Cotizar con la tool de casa: IVA y catálogo
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:
- Si la llamada trae
iva_pct, ésa para todo. - Con
solo-factura=truey sinfactura: trueen la cotización: 0. - Si la categoría del renglón tiene regla (
iva.GRANEL=16): ésa. - Con
iva-incluido=true(los precios ya lo traen): 0. - 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
queryes de sólo lectura;--writepermiteINSERT/UPDATE/DELETE/DDL.--arg Vda el valor de cada?, en orden (se repite).importreemplaza las filas de cada tabla (idempotente);--appendlas agrega en vez de reemplazar y--tables a,bcopia sólo esas.--dry-runenseñ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.exportbaja una copia: sin--table, la base entera como SQLite (todas las tablas, con sus filas); con--table, esa tabla en CSV UTF-8.--outdice dónde guardarla. Usa tu sesión, no el tokengat_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).dbes alias dedbs, ydbs sqldedbs query.
Fotos del catálogo
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.
importavisa si reemplazar una tabla regresaría ligas permanentes a ligas de fuera, y te da la bandera exacta.photos putsólo acepta JPEG, PNG o WebP de hasta 10 MB;--dry-runlista las claves que no tienen fila y los archivos que no son imagen. La columna esimagen_urlsalvo--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
<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
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
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.
<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:
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 .
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:
--answerno tiene default:oncontesta a clientes reales;offsólo registra. Formmy únicamente reenvía si su canal está encendido: cononse enciende; conoff, 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.
historyva después delinky no duplica: córrelo antes del corte y otra vez justo en él. No dispara avisos de «lead nuevo».historytambié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-rundice 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
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
Una llave nunca se acepta como argumento: se quedaría en el historial del shell. creds es alias de credentials.
Conectores
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
--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
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…».
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
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.
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.
--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».
--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
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
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).
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.
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:
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.
--waitywatchregresan 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.approveexige 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:
cardla 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:
- Compara los hallazgos de
@checkcontra el plan firmado. Si lo que falta cabe en el plan, recomienda que@buildlo 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
--notele da a@builduna vuelta más con esa nota, y--check-scopehace que@checkrevise 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».
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):
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:
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).
lsdice qué falta: lo de.env.exampley lo que nombran los pedidos escalados por bloqueo. Sin repo, usa eloriginde GitHub de la carpeta donde corre.pushagrega: cambia las llaves que trae y deja las demás (--replacereemplaza el.enventero).--gengenera 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).
runs ls enseña cuánto tardó y costó cada pedido. Para ver en qué se fue el tiempo y el dinero de uno:
- 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
@planen 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 :
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:
Y cómo va la fábrica del espacio:
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.
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.
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.
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.
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.
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.
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.
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.
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.
Navegador
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.
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».
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
Completa comandos, subcomandos y opciones, y los nombres de tus agentes y espacios (se guardan 5 minutos).
Opciones globales
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.