@ghostystudio/cli 0.96.0 → 0.98.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/README.md +9 -0
  2. package/dist/index.js +54 -15
  3. package/package.json +1 -1
package/README.md CHANGED
@@ -108,6 +108,7 @@ ghosty watch ls <id>
108
108
  ghosty watch check <id> <watch-id> [--dry-run]
109
109
  ghosty watch rm|resume <id> <watch-id>
110
110
  ghosty brief [show] · brief on|off [--voice on|off] [--at HH:MM] [--days 1-5|all|0,6] # your morning brief: in your chat with a voice note, only when there's something
111
+ ghosty brief pause <days|YYYY-MM-DD> · brief resume # skip it for a while; it comes back on its own
111
112
  ghosty brief run [--dry-run]
112
113
  ghosty tts "Hola, te aviso por WhatsApp." [--voice em_santa|em_alex|ef_dora] [--out voz.wav] # the house voice (Mexican Spanish + pronunciation lexicon)
113
114
  ghosty teams post <workspace>#<room>[/<thread-id>] "msg" [--wait] # write there as you; any @agent it mentions answers
@@ -155,6 +156,14 @@ Every command has its own help with examples: `ghosty <command> --help` or `ghos
155
156
 
156
157
  Exit codes: `0` ok · `1` API error · `2` usage error · `3` not signed in.
157
158
 
159
+ ### Changes in 0.98.0
160
+
161
+ - `brief pause <days|YYYY-MM-DD>` skips your morning brief for 1 to 90 days and it comes back on its own; `brief resume` removes the pause. `brief show` tells you when it returns, and `brief on|off` clears the pause.
162
+
163
+ ### Changes in 0.97.0
164
+
165
+ - `sites agent <slug> [create] [--agent id] [--model m] [--prompt p]`: the agent that lives inside an app and talks to its users (same as the agent's `app_agent`). With no flags it shows which one the app has; `create` makes «Agente de <title>» on Haiku 5.5 with the app's `/mcp`; `--agent` links one of yours; `--model` / `--prompt` change it live, without touching the app.
166
+
158
167
  ### Changes in 0.96.0
159
168
 
160
169
  - `sites show <slug|id>`: everything the site's page shows (`/c/sitios/<slug>`), from `GET /api/v2/sites/:ref/detail`: one app status (Ready / Starting… / Asleep / Failed), domains, variable names (never values), database, files, tasks, and email/AI when the app used them. It never wakes the app.
package/dist/index.js CHANGED
@@ -1183,7 +1183,7 @@ async function postLong(path2, body, timeoutMs = 9e5) {
1183
1183
  const req = httpsRequest(`${base}${path2}`, {
1184
1184
  method: "POST",
1185
1185
  timeout: timeoutMs,
1186
- headers: { authorization: `Bearer ${token}`, "user-agent": `ghosty-cli/${"0.96.0"}`, "content-type": "application/json", "content-length": Buffer.byteLength(data) }
1186
+ headers: { authorization: `Bearer ${token}`, "user-agent": `ghosty-cli/${"0.98.0"}`, "content-type": "application/json", "content-length": Buffer.byteLength(data) }
1187
1187
  }, (res) => {
1188
1188
  let buf = "";
1189
1189
  res.on("data", (c) => buf += c);
@@ -1225,7 +1225,7 @@ async function request(path2, opts = {}, retried = false) {
1225
1225
  method: opts.method ?? (opts.body !== void 0 || opts.raw !== void 0 ? "POST" : "GET"),
1226
1226
  headers: {
1227
1227
  authorization: `Bearer ${token}`,
1228
- "user-agent": `ghosty-cli/${"0.96.0"}`,
1228
+ "user-agent": `ghosty-cli/${"0.98.0"}`,
1229
1229
  "accept-language": lang(),
1230
1230
  ...opts.body !== void 0 ? { "content-type": "application/json" } : {},
1231
1231
  ...opts.headers
@@ -11286,7 +11286,7 @@ async function call(path2, v, init = {}) {
11286
11286
  "x-ghosty-ts": ts,
11287
11287
  "x-ghosty-sig": sig,
11288
11288
  "content-type": "application/json",
11289
- "user-agent": `ghosty-cli/${"0.96.0"}`
11289
+ "user-agent": `ghosty-cli/${"0.98.0"}`
11290
11290
  },
11291
11291
  body: method === "GET" ? void 0 : raw
11292
11292
  });
@@ -11758,7 +11758,7 @@ function parseAtFlag(raw) {
11758
11758
  return hour <= 23 && minute <= 59 ? { hour, minute } : null;
11759
11759
  }
11760
11760
  function showView(v) {
11761
- const state = v.enabled ? lavender(t("on", "encendido")) : dim(t("off", "apagado"));
11761
+ const state = !v.enabled ? dim(t("off", "apagado")) : v.pausedUntil ? dim(t(`paused until ${v.pausedUntil}`, `en pausa hasta el ${v.pausedUntil}`)) : lavender(t("on", "encendido"));
11762
11762
  const at = v.hour !== void 0 && v.minute !== void 0 ? `${pad(v.hour)}:${pad(v.minute)}` : "7:30";
11763
11763
  const when = [at, v.days ? daysLabel(v.days) : null, v.timeZone].filter(Boolean).join(" \xB7 ");
11764
11764
  const voice = v.voice === void 0 ? "" : ` \xB7 ${v.voice ? t("with voice", "con voz") : t("no voice", "sin voz")}`;
@@ -11779,7 +11779,14 @@ function showRun(r) {
11779
11779
  if (r.error) parts.push(dim(r.error));
11780
11780
  return parts.join("\n");
11781
11781
  }
11782
- async function briefCmd(sub, v) {
11782
+ function parsePauseArg(raw) {
11783
+ const s2 = raw?.trim() ?? "";
11784
+ if (/^\d{4}-\d{2}-\d{2}$/.test(s2)) return { pausedUntil: s2 };
11785
+ if (!/^\d{1,2}$/.test(s2)) return null;
11786
+ const n = Number(s2);
11787
+ return n >= 1 && n <= 90 ? { pauseDays: n } : null;
11788
+ }
11789
+ async function briefCmd(sub, arg, v) {
11783
11790
  const patch = {};
11784
11791
  if (v.voice !== void 0) {
11785
11792
  const on = ["on", "si", "s\xED", "true", "1", "yes"].includes(v.voice.toLowerCase());
@@ -11798,7 +11805,13 @@ async function briefCmd(sub, v) {
11798
11805
  patch.days = days;
11799
11806
  }
11800
11807
  if (sub === "on" || sub === "off") patch.enabled = sub === "on";
11801
- if (Object.keys(patch).length && (!sub || sub === "show" || sub === "set" || sub === "on" || sub === "off")) {
11808
+ if (sub === "pause") {
11809
+ const pause = parsePauseArg(arg);
11810
+ if (!pause) throw usage(t("pause takes days (1\u201390) or the date it comes back (YYYY-MM-DD).", "pause va con d\xEDas (1\u201390) o la fecha en que vuelve (YYYY-MM-DD)."), "ghosty brief pause 7");
11811
+ Object.assign(patch, pause);
11812
+ }
11813
+ if (sub === "resume") patch.pausedUntil = null;
11814
+ if (Object.keys(patch).length && (!sub || sub === "show" || sub === "set" || sub === "on" || sub === "off" || sub === "pause" || sub === "resume")) {
11802
11815
  const r = await api(PATH, { method: "PUT", body: { ...patch, via: "cli" } });
11803
11816
  return out(r, () => showView(r));
11804
11817
  }
@@ -11811,7 +11824,7 @@ async function briefCmd(sub, v) {
11811
11824
  const r = await api(`${PATH}/run`, { method: "POST", body: { dryRun: !!v["dry-run"], ...v.email ? { email: v.email } : {} } });
11812
11825
  return out(r, () => showRun(r));
11813
11826
  }
11814
- throw usage(t(`Unknown brief subcommand: ${sub}.`, `Subcomando de brief desconocido: ${sub}.`), "ghosty brief [show] | on | off [--voice on|off] [--at HH:MM] [--days 1-5] | run [--dry-run] [--email X]");
11827
+ throw usage(t(`Unknown brief subcommand: ${sub}.`, `Subcomando de brief desconocido: ${sub}.`), "ghosty brief [show] | on | off [--voice on|off] [--at HH:MM] [--days 1-5] | pause <days|YYYY-MM-DD> | resume | run [--dry-run] [--email X]");
11815
11828
  }
11816
11829
 
11817
11830
  // src/commands/data.ts
@@ -13697,7 +13710,7 @@ var HELPS_ES = {
13697
13710
  },
13698
13711
  brief: {
13699
13712
  summary: "Tu brief de la ma\xF1ana: a tu hora (7:30 por default) cae en tu chat un resumen corto con nota de voz y un push \u2014 lo que va en curso y lo que te necesita, en 5 renglones. Encendido por default; s\xF3lo llega si hay algo que contar.",
13700
- replace: [["person@x.com", "persona@x.com"]],
13713
+ replace: [["person@x.com", "persona@x.com"], ["<days|", "<d\xEDas|"]],
13701
13714
  flags: [
13702
13715
  ["--voice on|off", "con o sin la nota de voz (em_santa) arriba de los renglones"],
13703
13716
  ["--at HH:MM", "la hora a la que llega, 24 h, en tu zona"],
@@ -14019,6 +14032,7 @@ var HELPS_ES = {
14019
14032
  ["--cancel / --resume", "pins: cancela al final del periodo (los sitios vuelven a Gratis con aviso), o lo deshace"],
14020
14033
  ["--days N", "search: la ventana de Search Console en d\xEDas (default 28; Google reporta con 2\u20133 d\xEDas de retraso)"],
14021
14034
  ["--since S / --kind K / --req-id ID", "errors: ventana (30m, 6h, 7d; default 24h), un tipo de evento, o todo lo de una petici\xF3n (su x-request-id)"],
14035
+ ["--agent ID / --model M / --prompt P", "agent: liga a la app uno de tus agentes (motor claude), o cambia el modelo o el prompt del agente de la app"],
14022
14036
  ["--title T", "publish: el nombre del sitio (default: el <title> del HTML o el nombre de la carpeta)"],
14023
14037
  ["--slug S", "publish: el slug de un sitio NUEVO (a-z, 0-9 y guiones, 3\u201360, no reservado)"],
14024
14038
  ["--site X", "publish: actualiza ese sitio de la casa (slug, id o URL) en vez de crear uno"]
@@ -14029,6 +14043,7 @@ var HELPS_ES = {
14029
14043
  "Una carpeta necesita index.html en la ra\xEDz; se saltan ocultos y node_modules. Topes: 1 MB por archivo, 8 MB y 40 archivos por sitio.",
14030
14044
  "Errores de slug: slug_invalid, slug_taken, slug_unsupported (exit 1, no cambia nada).",
14031
14045
  "show: lo mismo que la p\xE1gina del sitio (/c/sitios/<slug>): un solo estado de la app (Lista / Arrancando\u2026 / Dormida / Fall\xF3), dominios, NOMBRES de las variables (los valores nunca regresan), base, archivos, tareas, y correo/IA s\xF3lo si la app los us\xF3. Nunca despierta la app.",
14046
+ "agent: el agente que vive DENTRO de la app y platica con sus usuarios (lo mismo que la tool app_agent). Sin flags dice cu\xE1l tiene; \xABcreate\xBB crea \xABAgente de <t\xEDtulo>\xBB en Haiku 5.5 con el /mcp de la app; --agent liga uno tuyo; --model / --prompt lo cambian en caliente, sin tocar la app.",
14032
14047
  "errors: los errores del servidor y del navegador de una app, agrupados por mensaje con su conteo y las migas del m\xE1s reciente (lo mismo que la tool app_errors). La app los manda con /apps/sdk/errors.mjs.",
14033
14048
  "env/cron/files: s\xF3lo apps con backend. env set reinicia la app sin rebuild si su caja existe. Las tareas nuevas las crea el agente (app_cron); aqu\xED se pausan, reanudan o borran."
14034
14049
  ]
@@ -14557,7 +14572,7 @@ var HELPS = {
14557
14572
  },
14558
14573
  brief: {
14559
14574
  summary: "Your morning brief: at your time (7:30 by default) a short summary lands in your chat with a voice note and a push \u2014 what's in progress and what needs you, in 5 lines. On by default; it only arrives when there's something to tell.",
14560
- usage: ["ghosty brief show", "ghosty brief on|off", "ghosty brief [--voice on|off] [--at HH:MM] [--days 1-5|all|0,6]", "ghosty brief run [--dry-run]", "ghosty brief run --dry-run --email person@x.com"],
14575
+ usage: ["ghosty brief show", "ghosty brief on|off", "ghosty brief [--voice on|off] [--at HH:MM] [--days 1-5|all|0,6]", "ghosty brief pause <days|YYYY-MM-DD>", "ghosty brief resume", "ghosty brief run [--dry-run]", "ghosty brief run --dry-run --email person@x.com"],
14561
14576
  flags: [
14562
14577
  ["--voice on|off", "with or without the voice note (em_santa) on top of the lines"],
14563
14578
  ["--at HH:MM", "the time it arrives, 24 h, in your time zone"],
@@ -14565,7 +14580,7 @@ var HELPS = {
14565
14580
  ["--dry-run", "run: collect and draft today's brief now and print it; saves nothing, posts nothing, pushes nobody"],
14566
14581
  ["--email X", "run --dry-run (Ghosty staff): another account's brief, without sending it"]
14567
14582
  ],
14568
- examples: ["ghosty brief", "ghosty brief --at 8:15 --days 1-5", "ghosty brief --voice off", "ghosty brief run --dry-run", "ghosty brief off"],
14583
+ examples: ["ghosty brief", "ghosty brief --at 8:15 --days 1-5", "ghosty brief --voice off", "ghosty brief pause 7", "ghosty brief resume", "ghosty brief run --dry-run", "ghosty brief off"],
14569
14584
  notes: ["It goes to the latest personal chat with your main agent, as a message from it; your agent knows what it said in your next message.", "run --dry-run also makes the voice note so you can hear it (the link is printed); nothing is posted.", "The footer \xABUseful? \xB7 Stop sending it\xBB works with one tap; you can also ask your agent to turn it on or off."]
14570
14585
  },
14571
14586
  teams: {
@@ -15040,6 +15055,7 @@ HELPS.sites = {
15040
15055
  "ghosty sites cron [ls] <slug> \xB7 cron pause|resume|rm <slug> <id>",
15041
15056
  "ghosty sites files [ls] <slug> \xB7 files rm <slug> <id>",
15042
15057
  "ghosty sites errors <slug> [--since 24h] [--kind server_error|client_error|request|build] [--req-id ID]",
15058
+ "ghosty sites agent <slug> [create] [--agent id] [--model m] [--prompt p]",
15043
15059
  "ghosty sites pin <slug|id> [--interval year|month] [--currency usd|mxn] [--add-pack]",
15044
15060
  "ghosty sites unpin <slug|id>",
15045
15061
  "ghosty sites pins [--cancel | --resume]",
@@ -15055,11 +15071,12 @@ HELPS.sites = {
15055
15071
  ["--cancel / --resume", "pins: cancel at period end (sites go back to Free with notice), or undo it"],
15056
15072
  ["--days N", "search: Search Console window in days (default 28; Google reports 2\u20133 days late)"],
15057
15073
  ["--since S / --kind K / --req-id ID", "errors: window (30m, 6h, 7d; default 24h), one event kind, or everything from one request (its x-request-id)"],
15074
+ ["--agent ID / --model M / --prompt P", "agent: link one of your agents (claude engine) to the app, or change the app agent's model or prompt"],
15058
15075
  ["--title T", "publish: the site's name (default: the HTML <title> or the folder name)"],
15059
15076
  ["--slug S", "publish: the slug for a NEW site (a-z, 0-9 and hyphens, 3\u201360, not reserved)"],
15060
15077
  ["--site X", "publish: update that house site (slug, id or URL) instead of creating one"]
15061
15078
  ],
15062
- examples: ["ghosty sites show agenda-perdix", "ghosty sites env set agenda-perdix STRIPE_SECRET_KEY=sk_live_\u2026", "ghosty sites cron pause agenda-perdix cm123", "ghosty sites pin tacos-don-pepe", "ghosty sites pin tacos-don-pepe --interval month --currency mxn", "ghosty sites unpin landing-vieja", "ghosty sites pins --cancel", "ghosty sites publish ./landing/ --site gelatina-de-sandia"],
15079
+ examples: ["ghosty sites show agenda-perdix", "ghosty sites env set agenda-perdix STRIPE_SECRET_KEY=sk_live_\u2026", "ghosty sites cron pause agenda-perdix cm123", "ghosty sites agent agenda-perdix create", "ghosty sites agent agenda-perdix --model claude-sonnet-5-5", "ghosty sites pin tacos-don-pepe", "ghosty sites pin tacos-don-pepe --interval month --currency mxn", "ghosty sites unpin landing-vieja", "ghosty sites pins --cancel", "ghosty sites publish ./landing/ --site gelatina-de-sandia"],
15063
15080
  notes: [
15064
15081
  "pin: with a free slot it pins right away; without a subscription it prints a card-payment link (the site is pinned when you pay); with every slot used it answers needs_pack (repeat with --add-pack).",
15065
15082
  "unpin, cancelling, or a failed payment never pause a site at once: it goes back to the Free rule (30 days since its last change, at least 8 from today, notice 7 days before).",
@@ -15754,7 +15771,7 @@ var packPrice = (c, i, lang2) => `$${(PACK[i]?.[c] ?? 0).toLocaleString("en-US")
15754
15771
  var kb = (n) => n ? `${Math.max(1, Math.round(n / 1024))} KB` : "";
15755
15772
  var day = (iso) => iso ? iso.slice(0, 10) : "";
15756
15773
  async function sitesCmd(sub, a1, a2, v, a3, rest = []) {
15757
- const ex = "ghosty sites ls [--house] \xB7 show <slug|id> \xB7 env|cron|files \u2026 \xB7 errors <slug> [--since 24h] [--kind K] [--req-id ID] \xB7 pin|unpin <slug|id> \xB7 pins [--cancel|--resume] \xB7 search <slug|id> [--days 28] \xB7 domain [ls|add|verify|rm] <slug> [domain] \xB7 publish <file.html|folder> [--title T] [--slug S] [--site <slug|id>] \xB7 slug <slug|id> <new-slug>";
15774
+ const ex = "ghosty sites ls [--house] \xB7 show <slug|id> \xB7 env|cron|files \u2026 \xB7 errors <slug> [--since 24h] [--kind K] [--req-id ID] \xB7 agent <slug> [--agent id] [--model m] \xB7 pin|unpin <slug|id> \xB7 pins [--cancel|--resume] \xB7 search <slug|id> [--days 28] \xB7 domain [ls|add|verify|rm] <slug> [domain] \xB7 publish <file.html|folder> [--title T] [--slug S] [--site <slug|id>] \xB7 slug <slug|id> <new-slug>";
15758
15775
  switch (sub ?? "ls") {
15759
15776
  case "ls":
15760
15777
  case "list": {
@@ -15839,6 +15856,24 @@ ${table(r.pinned.map((p) => ({ slug: p.slug, title: (p.title ?? "").slice(0, 40)
15839
15856
  const r = await api(`/api/v2/sites/${encodeURIComponent(a1)}/errors${q.size ? `?${q}` : ""}`);
15840
15857
  return out(r, () => errorsLines(r, t("en", "es") === "es" ? "es" : "en"));
15841
15858
  }
15859
+ case "agent": {
15860
+ if (!a1) throw usage(t("Missing the app (slug, id or URL).", "Falta la app (slug, id o URL)."), "ghosty sites agent <slug> [--agent id] [--model m] [--prompt p]");
15861
+ const path2 = `/api/v2/sites/${encodeURIComponent(a1)}/agent`;
15862
+ const change = v.agent || v.model || v.prompt || a2 === "create" || a2 === "set";
15863
+ if (!change) {
15864
+ const r2 = await api(path2);
15865
+ return out(
15866
+ r2,
15867
+ () => r2.agent ? `${bold(r2.agent.name)} ${dim(`${r2.agent.id} \xB7 ${r2.agent.model ?? ""}`)}
15868
+ ${r2.agent.manageUrl}` : t(`${r2.slug} has no agent yet. Create one (Haiku 5.5): ghosty sites agent ${r2.slug} create`, `${r2.slug} todav\xEDa no tiene agente. Crea uno (Haiku 5.5): ghosty sites agent ${r2.slug} create`)
15869
+ );
15870
+ }
15871
+ const r = await api(path2, { method: "POST", body: { ...v.agent ? { agent: v.agent } : {}, ...v.model ? { model: v.model } : {}, ...v.prompt ? { prompt: v.prompt } : {} } });
15872
+ const what = r.created ? t("Created", "Creado") : r.linked ? t("Linked", "Ligado") : r.changed.length ? t("Updated", "Actualizado") : t("Unchanged", "Sin cambios");
15873
+ return out(r, () => `${lavender("\u2713")} ${what} ${bold(r.name)} ${dim(`${r.agentId} \xB7 ${r.model ?? ""}`)}
15874
+ ${r.manageUrl}${r.warning ? `
15875
+ ${dim(r.warning)}` : ""}`);
15876
+ }
15842
15877
  case "publish":
15843
15878
  case "deploy": {
15844
15879
  if (!a1) throw usage(t("Missing the file or folder.", "Falta el archivo o la carpeta."), ex);
@@ -17504,6 +17539,7 @@ ${bold("Sites")} ${dim("(sites your agents publish at <slug>.ghosty.page)")}
17504
17539
  sites domain add|verify|rm <slug> <dom> Custom domain for a site or app (DNS record \u2192 verify \u2192 HTTPS) [ls <slug>: list]
17505
17540
  sites show <slug|id> Everything about a site or app: status, domains, variable names, data, files, tasks
17506
17541
  sites env|cron|files [ls] <slug> An app's variables (set <slug> K=V \xB7 rm <slug> K), tasks (pause|resume|rm <slug> <id>), files (rm <slug> <id>)
17542
+ sites agent <slug> [create] The agent inside an app (Haiku 5.5 by default) [--agent id: link yours] [--model m] [--prompt p]
17507
17543
  sites pins Your pinned-sites subscription and slots [--cancel | --resume]
17508
17544
  sites publish <file.html|folder> Publish a house site (staff): no owner, no expiry, no banner [--title] [--slug S] [--site <slug|id>: update that one]
17509
17545
  sites slug <slug|id> <new-slug> Change a site's slug (staff)
@@ -17547,6 +17583,7 @@ ${bold("Watch pages")} ${dim("(checked without a model turn; the agent only get
17547
17583
  ${bold("Morning brief")} ${dim("(on by default: 7:30 in your chat with a voice note and a push, only when there's something)")}
17548
17584
  brief [show] Is it on, voice, time, days, the last one sent
17549
17585
  brief on|off Turn it on or off [--voice on|off] [--at HH:MM] [--days 1-5|all|0,6]
17586
+ brief pause <days|YYYY-MM-DD> Skip it for a while; it comes back on its own (brief resume removes the pause)
17550
17587
  brief run Send today's now [--dry-run: collect and draft, send nothing] [--email X (staff, with --dry-run)]
17551
17588
 
17552
17589
  ${bold("Teams")}
@@ -17731,6 +17768,7 @@ ${bold("Sitios")} ${dim("(los sitios que publican tus agentes en <slug>.ghosty.
17731
17768
  sites domain add|verify|rm <slug> <dom> Dominio propio para un sitio o app (registro DNS \u2192 verificar \u2192 HTTPS) [ls <slug>: lista]
17732
17769
  sites show <slug|id> Todo de un sitio o app: estado, dominios, nombres de variables, datos, archivos, tareas
17733
17770
  sites env|cron|files [ls] <slug> Variables (set <slug> K=V \xB7 rm <slug> K), tareas (pause|resume|rm <slug> <id>) y archivos (rm <slug> <id>) de una app
17771
+ sites agent <slug> [create] El agente dentro de una app (Haiku 5.5 por default) [--agent id: liga uno tuyo] [--model m] [--prompt p]
17734
17772
  sites publish <archivo.html|carpeta> Publica un sitio de la casa (staff): sin due\xF1o, sin caducidad, sin franja [--title] [--slug S] [--site <slug|id>: actualiza \xE9se]
17735
17773
  sites slug <slug|id> <slug-nuevo> Cambia el slug de un sitio (staff)
17736
17774
 
@@ -17773,6 +17811,7 @@ ${bold("Vigilar p\xE1ginas")} ${dim("(se revisan sin turno del modelo; el agent
17773
17811
  ${bold("Brief de la ma\xF1ana")} ${dim("(encendido por default: 7:30 en tu chat con nota de voz y un push, s\xF3lo si hay algo)")}
17774
17812
  brief [show] Si est\xE1 prendido, voz, hora, d\xEDas, el \xFAltimo que sali\xF3
17775
17813
  brief on|off Prenderlo o apagarlo [--voice on|off] [--at HH:MM] [--days 1-5|todos|0,6]
17814
+ brief pause <d\xEDas|AAAA-MM-DD> No lo mandes un tiempo; vuelve solo (brief resume quita la pausa)
17776
17815
  brief run M\xE1ndalo ya [--dry-run: junta y redacta, no manda nada] [--email X (staff, con --dry-run)]
17777
17816
 
17778
17817
  ${bold("Teams")}
@@ -18139,7 +18178,7 @@ async function main() {
18139
18178
  const tokens = splitTokens(pos, v);
18140
18179
  globals.token = tokens.session;
18141
18180
  globals.profile = v.profile;
18142
- if (v.version) return out({ version: "0.96.0" }, () => "0.96.0");
18181
+ if (v.version) return out({ version: "0.98.0" }, () => "0.98.0");
18143
18182
  for (const n of normalizeArgs(pos, v)) if (!globals.json) info(dim(n));
18144
18183
  const context = (await readConfig()).workspace;
18145
18184
  if (!explicitToken()?.startsWith("gat_")) {
@@ -18277,7 +18316,7 @@ async function main() {
18277
18316
  case "watch":
18278
18317
  return watchCmd(sub, a1, a2, v);
18279
18318
  case "brief":
18280
- return briefCmd(sub, v);
18319
+ return briefCmd(sub, a1, v);
18281
18320
  case "teams":
18282
18321
  return teamsCmd(sub, a1, a2, v);
18283
18322
  case "browser":
@@ -18346,7 +18385,7 @@ async function main() {
18346
18385
  throw unknown(cmd, cmd, COMMANDS, "ghosty --help");
18347
18386
  }
18348
18387
  }
18349
- var notice = updateNotice("0.96.0").catch(() => null);
18388
+ var notice = updateNotice("0.98.0").catch(() => null);
18350
18389
  main().then(
18351
18390
  async () => {
18352
18391
  const n = process.stderr.isTTY ? await notice : null;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ghostystudio/cli",
3
- "version": "0.96.0",
3
+ "version": "0.98.0",
4
4
  "description": "Official Ghosty Studio CLI — configure, test and chat with your agents from the terminal. Built for humans and coding agents.",
5
5
  "type": "module",
6
6
  "bin": {