@ghostystudio/cli 0.93.0 → 0.93.1
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 +4 -0
- package/dist/index.js +7 -7
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -153,6 +153,10 @@ Every command has its own help with examples: `ghosty <command> --help` or `ghos
|
|
|
153
153
|
|
|
154
154
|
Exit codes: `0` ok · `1` API error · `2` usage error · `3` not signed in.
|
|
155
155
|
|
|
156
|
+
### Changes in 0.93.1
|
|
157
|
+
|
|
158
|
+
- `factory runs choose` also offers `fix_main`: a separate run fixes the main branch (CI permission, workflow) and the escalated run waits for it — it no longer counts as «your turn» — then updates itself and goes back to @check when the fix merges.
|
|
159
|
+
|
|
156
160
|
### Changes in 0.93.0
|
|
157
161
|
|
|
158
162
|
- `factory runs choose <run> [a|b|c]`: when @check escalates a decision it leaves 2–3 concrete paths (build, recheck, replan, close, merge_as_is). Without a letter it lists them; with one it applies it and the choice reaches the next role word for word. `merge_as_is` merges with CI as it is (red checks the PR didn't cause), asks for confirmation and is logged. `runs show` lists the options of an escalated run.
|
package/dist/index.js
CHANGED
|
@@ -1175,7 +1175,7 @@ async function postLong(path2, body, timeoutMs = 9e5) {
|
|
|
1175
1175
|
const req = httpsRequest(`${base}${path2}`, {
|
|
1176
1176
|
method: "POST",
|
|
1177
1177
|
timeout: timeoutMs,
|
|
1178
|
-
headers: { authorization: `Bearer ${token}`, "user-agent": `ghosty-cli/${"0.93.
|
|
1178
|
+
headers: { authorization: `Bearer ${token}`, "user-agent": `ghosty-cli/${"0.93.1"}`, "content-type": "application/json", "content-length": Buffer.byteLength(data) }
|
|
1179
1179
|
}, (res) => {
|
|
1180
1180
|
let buf = "";
|
|
1181
1181
|
res.on("data", (c) => buf += c);
|
|
@@ -1217,7 +1217,7 @@ async function request(path2, opts = {}, retried = false) {
|
|
|
1217
1217
|
method: opts.method ?? (opts.body !== void 0 || opts.raw !== void 0 ? "POST" : "GET"),
|
|
1218
1218
|
headers: {
|
|
1219
1219
|
authorization: `Bearer ${token}`,
|
|
1220
|
-
"user-agent": `ghosty-cli/${"0.93.
|
|
1220
|
+
"user-agent": `ghosty-cli/${"0.93.1"}`,
|
|
1221
1221
|
"accept-language": lang(),
|
|
1222
1222
|
...opts.body !== void 0 ? { "content-type": "application/json" } : {},
|
|
1223
1223
|
...opts.headers
|
|
@@ -11278,7 +11278,7 @@ async function call(path2, v, init = {}) {
|
|
|
11278
11278
|
"x-ghosty-ts": ts,
|
|
11279
11279
|
"x-ghosty-sig": sig,
|
|
11280
11280
|
"content-type": "application/json",
|
|
11281
|
-
"user-agent": `ghosty-cli/${"0.93.
|
|
11281
|
+
"user-agent": `ghosty-cli/${"0.93.1"}`
|
|
11282
11282
|
},
|
|
11283
11283
|
body: method === "GET" ? void 0 : raw
|
|
11284
11284
|
});
|
|
@@ -14029,7 +14029,7 @@ var HELPS_ES = {
|
|
|
14029
14029
|
"advise: con un pedido ESCALADO, qu\xE9 hacer \u2014que @build lo arregle o rehacer el plan\u2014 con la nota para @build punto por punto (cada uno cita el hallazgo o el paso del plan que lo justifica) y qu\xE9 debe revisar @check. Compara los hallazgos de @check contra el plan firmado. No aplica nada: imprime el comando exacto de approve/changes. show dice por qu\xE9 se escal\xF3.",
|
|
14030
14030
|
"why: si el pedido no fue sano (atascos, @build de m\xE1s de 30 min, vueltas, CI rojo, escalado), una categor\xEDa (missing_service, unresolved_build_or_tests, fixed_strategy\u2026), el paso cr\xEDtico con su evidencia y qu\xE9 cambiar la pr\xF3xima vez. Primero cruza los criterios del plan aprobado con la evidencia: aprobado sin la preview que ped\xEDa un criterio, mezclado sin preview, smoke rojo sobre el commit mezclado o criterio de CI con CI none \u2192 approved_unmet_criterion, arriba de cualquier atasco. Un pedido sano no llama al modelo. Cuando un pedido cierra sin ser sano, el room recibe este resumen en su hilo.",
|
|
14031
14031
|
"Mientras un rol trabaja, si se atora el room recibe un \u23F3 en el hilo y al rol se le dice qu\xE9 revisar; desde la segunda vez en el mismo pedido, quien lo pidi\xF3 recibe un push.",
|
|
14032
|
-
"choose: cuando @check escala una decisi\xF3n deja 2\u20133 caminos concretos (a, b, c), cada uno con su acci\xF3n: build (@build lo hace en la rama), recheck, replan, close o
|
|
14032
|
+
"choose: cuando @check escala una decisi\xF3n deja 2\u20133 caminos concretos (a, b, c), cada uno con su acci\xF3n: build (@build lo hace en la rama), recheck, replan, close, merge_as_is o fix_main (abre un pedido aparte que arregla la rama principal; \xE9ste espera sin contar como \xABte toca\xBB y, al mergearse el arreglo, se pone al d\xEDa y se revisa solo). Sin letra los lista; con letra lo aplica y la elecci\xF3n le llega literal al siguiente rol. merge_as_is hace merge con el CI como est\xE1 (con checks en rojo): \xFAsalo cuando lo rojo no lo causa el PR; pide confirmaci\xF3n y queda en bit\xE1cora (merge_override). show tambi\xE9n lista las opciones."
|
|
14033
14033
|
]
|
|
14034
14034
|
}
|
|
14035
14035
|
};
|
|
@@ -15043,7 +15043,7 @@ HELPS.factory = {
|
|
|
15043
15043
|
["--yes", "rename, approve, changes, merge: skip the confirmation (required without a terminal)"]
|
|
15044
15044
|
],
|
|
15045
15045
|
examples: ["ghosty factory rooms connect blissito/ghosty-studio --room studio --create --workspace business", 'ghosty factory run "Add a COLLABORATOR role: invited by room, lands in the room, no personal agent. Done when an invite to #factory logs in straight there" --repo blissito/ghosty-studio --wait --workspace business', "ghosty factory runs approve 31 --plan-version 2 --workspace business", "ghosty factory runs watch 31 --workspace business", "ghosty factory runs merge 31 --workspace business", "ghosty factory runs ls --workspace business --room mailmask", "ghosty factory runs show 15 --workspace business", "ghosty factory runs show 13 --timing --workspace mercadito-verde", "ghosty factory runs why 13 --workspace mercadito-verde", "ghosty factory runs advise 115 --workspace business", "ghosty factory runs stats --since 7d --workspace mercadito-verde", 'ghosty factory runs rename 15 "Docs del CLI al d\xEDa" --workspace business --dry-run'],
|
|
15046
|
-
notes: ["env: the preview's environment variables live on your computer, so your terminal agent pushes them. ls lists saved and missing names (from .env.example and from runs escalated because the preview won't start); push adds them (only the workspace owner). Use disposable values, never production: the preview runs the repo's code. Values never come back. Then runs recheck <run>: @check reviews the same PR again without another @build loop. Logged as factory.env_set and factory.run_recheck.", "sprints: when the goal is too big for one run, @plan proposes a sprint (3\u20138 tickets in order, with dependencies) as a draft. approve signs every included ticket at once; they start one at a time as their dependencies merge. Only the owner or whoever asked can approve. Logged as factory.sprint_approve.", "rooms repos lists the repos your GitHub App sees (most recent first) and which rooms each one is already in.", "rooms connect checks that YOUR GitHub App installation sees the repo (if not, it gives you the link to grant access) and tells you how ready the repo is for agents (levels 1\u20133 and what's missing). Any member can connect; only whoever connected it, or the owner, can disconnect. Logged as factory.room_connect / factory.room_disconnect.", "run posts \xAB@plan <your text>\xBB in the room under YOUR name, like typing it in Teams: the same plan, approvals and card. Write it like a ticket: the goal, why, and how you'll know it's done. Any member can run, approve, ask for changes and merge; each one is logged (factory.run, factory.run_approve\u2026).", "card brings the run's live card down to the bottom of its thread; the old one stays as a still footprint linking to the live one. The roles can do it too (factory_card).", "Reading needs membership in the workspace; rename needs owner, admin or Ghosty staff, and is logged (factory.run_rename). The room's card picks the new title up on its next refresh.", "Who is @plan or @build: ghosty agents ls --handle plan --workspace SLUG.", "stats: runs, % merged, median minutes to PR and to merge, @check\u2192@build loops and red CI per run, and cost per run and per merged PR. The cost counts @plan's first turn in the thread, before the run existed.", "--timing reads each role's transcript: engines without one (ACP) show minutes and cost but no commands. It also lists stuck patterns: a command open 8+ min, the same command 4 times, the same error 3 times, going back and forth, or apt install inside a box.", "why: if the run wasn't healthy (stuck patterns, @build over 30 min, loops, red CI, escalated), a category (missing_service, unresolved_build_or_tests, fixed_strategy\u2026), the critical step with its evidence and what to change next time. First it checks the approved plan's criteria against the evidence: approved without the preview a criterion asked for, merged without preview, smoke failed on the merged commit, or a CI criterion with CI none \u2192 approved_unmet_criterion, above any stuck pattern. A healthy run doesn't call the model. When a run closes unhealthy, the room gets this summary in its thread.", "advise: for an ESCALATED run, what to do \u2014 let @build fix it or redo the plan \u2014 with the note for @build point by point (each one cites the finding or plan step behind it) and what @check should review. It compares @check's findings against the signed plan. Nothing is applied: it prints the exact approve/changes command. show tells you why it was escalated.", "While a role works, if it gets stuck the room gets a \u23F3 message in the thread and the role is told what to check; from the second time in the same run, whoever asked gets a push.", "choose: when @check escalates a decision it leaves 2\u20133 concrete paths (a, b, c), each one an action: build (@build does it on the branch), recheck, replan, close or
|
|
15046
|
+
notes: ["env: the preview's environment variables live on your computer, so your terminal agent pushes them. ls lists saved and missing names (from .env.example and from runs escalated because the preview won't start); push adds them (only the workspace owner). Use disposable values, never production: the preview runs the repo's code. Values never come back. Then runs recheck <run>: @check reviews the same PR again without another @build loop. Logged as factory.env_set and factory.run_recheck.", "sprints: when the goal is too big for one run, @plan proposes a sprint (3\u20138 tickets in order, with dependencies) as a draft. approve signs every included ticket at once; they start one at a time as their dependencies merge. Only the owner or whoever asked can approve. Logged as factory.sprint_approve.", "rooms repos lists the repos your GitHub App sees (most recent first) and which rooms each one is already in.", "rooms connect checks that YOUR GitHub App installation sees the repo (if not, it gives you the link to grant access) and tells you how ready the repo is for agents (levels 1\u20133 and what's missing). Any member can connect; only whoever connected it, or the owner, can disconnect. Logged as factory.room_connect / factory.room_disconnect.", "run posts \xAB@plan <your text>\xBB in the room under YOUR name, like typing it in Teams: the same plan, approvals and card. Write it like a ticket: the goal, why, and how you'll know it's done. Any member can run, approve, ask for changes and merge; each one is logged (factory.run, factory.run_approve\u2026).", "card brings the run's live card down to the bottom of its thread; the old one stays as a still footprint linking to the live one. The roles can do it too (factory_card).", "Reading needs membership in the workspace; rename needs owner, admin or Ghosty staff, and is logged (factory.run_rename). The room's card picks the new title up on its next refresh.", "Who is @plan or @build: ghosty agents ls --handle plan --workspace SLUG.", "stats: runs, % merged, median minutes to PR and to merge, @check\u2192@build loops and red CI per run, and cost per run and per merged PR. The cost counts @plan's first turn in the thread, before the run existed.", "--timing reads each role's transcript: engines without one (ACP) show minutes and cost but no commands. It also lists stuck patterns: a command open 8+ min, the same command 4 times, the same error 3 times, going back and forth, or apt install inside a box.", "why: if the run wasn't healthy (stuck patterns, @build over 30 min, loops, red CI, escalated), a category (missing_service, unresolved_build_or_tests, fixed_strategy\u2026), the critical step with its evidence and what to change next time. First it checks the approved plan's criteria against the evidence: approved without the preview a criterion asked for, merged without preview, smoke failed on the merged commit, or a CI criterion with CI none \u2192 approved_unmet_criterion, above any stuck pattern. A healthy run doesn't call the model. When a run closes unhealthy, the room gets this summary in its thread.", "advise: for an ESCALATED run, what to do \u2014 let @build fix it or redo the plan \u2014 with the note for @build point by point (each one cites the finding or plan step behind it) and what @check should review. It compares @check's findings against the signed plan. Nothing is applied: it prints the exact approve/changes command. show tells you why it was escalated.", "While a role works, if it gets stuck the room gets a \u23F3 message in the thread and the role is told what to check; from the second time in the same run, whoever asked gets a push.", "choose: when @check escalates a decision it leaves 2\u20133 concrete paths (a, b, c), each one an action: build (@build does it on the branch), recheck, replan, close, merge_as_is or fix_main (opens a separate run that fixes the main branch; this run waits without counting as \xAByour turn\xBB and is updated and re-reviewed on its own when the fix merges). Without a letter it lists them; with one it applies it and the choice reaches the next role word for word. merge_as_is merges with CI as it is (red checks included): use it when what's red isn't caused by the PR; it asks for confirmation and is logged (merge_override). show lists the options too."],
|
|
15047
15047
|
learn: `${REF}#fabrica`
|
|
15048
15048
|
};
|
|
15049
15049
|
function helpText(cmd) {
|
|
@@ -17840,7 +17840,7 @@ async function main() {
|
|
|
17840
17840
|
const tokens = splitTokens(pos, v);
|
|
17841
17841
|
globals.token = tokens.session;
|
|
17842
17842
|
globals.profile = v.profile;
|
|
17843
|
-
if (v.version) return out({ version: "0.93.
|
|
17843
|
+
if (v.version) return out({ version: "0.93.1" }, () => "0.93.1");
|
|
17844
17844
|
for (const n of normalizeArgs(pos, v)) if (!globals.json) info(dim(n));
|
|
17845
17845
|
const context = (await readConfig()).workspace;
|
|
17846
17846
|
if (!explicitToken()?.startsWith("gat_")) {
|
|
@@ -18045,7 +18045,7 @@ async function main() {
|
|
|
18045
18045
|
throw unknown(cmd, cmd, COMMANDS, "ghosty --help");
|
|
18046
18046
|
}
|
|
18047
18047
|
}
|
|
18048
|
-
var notice = updateNotice("0.93.
|
|
18048
|
+
var notice = updateNotice("0.93.1").catch(() => null);
|
|
18049
18049
|
main().then(
|
|
18050
18050
|
async () => {
|
|
18051
18051
|
const n = process.stderr.isTTY ? await notice : null;
|
package/package.json
CHANGED