@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.
- package/README.md +9 -0
- package/dist/index.js +54 -15
- 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.
|
|
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.
|
|
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.
|
|
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 ?
|
|
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
|
-
|
|
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 (
|
|
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.
|
|
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.
|
|
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