@tryglen/cli 0.5.2 → 0.6.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 +3 -3
- package/dist/_utils/agents-table.d.ts +10 -0
- package/dist/_utils/agents-table.js +26 -0
- package/dist/_utils/agents-table.js.map +1 -0
- package/dist/_utils/cli-error.d.ts +11 -0
- package/dist/_utils/cli-error.js +24 -0
- package/dist/_utils/cli-error.js.map +1 -0
- package/dist/_utils/codex-app-server.js +4 -1
- package/dist/_utils/codex-app-server.js.map +1 -1
- package/dist/_utils/config.js +3 -1
- package/dist/_utils/config.js.map +1 -1
- package/dist/_utils/credentials.d.ts +1 -1
- package/dist/_utils/credentials.js +8 -3
- package/dist/_utils/credentials.js.map +1 -1
- package/dist/_utils/ensure-global-cli.d.ts +7 -5
- package/dist/_utils/ensure-global-cli.js +47 -17
- package/dist/_utils/ensure-global-cli.js.map +1 -1
- package/dist/_utils/find-bin.d.ts +6 -0
- package/dist/_utils/find-bin.js +85 -0
- package/dist/_utils/find-bin.js.map +1 -0
- package/dist/_utils/http.d.ts +10 -3
- package/dist/_utils/http.js +56 -5
- package/dist/_utils/http.js.map +1 -1
- package/dist/_utils/loopback-server.d.ts +1 -1
- package/dist/_utils/loopback-server.js +17 -2
- package/dist/_utils/loopback-server.js.map +1 -1
- package/dist/_utils/open-browser.js +3 -0
- package/dist/_utils/open-browser.js.map +1 -1
- package/dist/_utils/plugin-status.d.ts +4 -0
- package/dist/_utils/plugin-status.js +23 -0
- package/dist/_utils/plugin-status.js.map +1 -0
- package/dist/_utils/run-bin.d.ts +13 -0
- package/dist/_utils/run-bin.js +51 -0
- package/dist/_utils/run-bin.js.map +1 -0
- package/dist/_utils/state-line.js +3 -1
- package/dist/_utils/state-line.js.map +1 -1
- package/dist/_utils/state.d.ts +1 -1
- package/dist/_utils/state.js +8 -2
- package/dist/_utils/state.js.map +1 -1
- package/dist/_utils/update.d.ts +20 -2
- package/dist/_utils/update.js +111 -15
- package/dist/_utils/update.js.map +1 -1
- package/dist/_utils/version.js +12 -1
- package/dist/_utils/version.js.map +1 -1
- package/dist/_utils/which.d.ts +3 -2
- package/dist/_utils/which.js +5 -12
- package/dist/_utils/which.js.map +1 -1
- package/dist/bin.js +44 -22
- package/dist/bin.js.map +1 -1
- package/dist/commands/doctor.d.ts +6 -3
- package/dist/commands/doctor.js +68 -54
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/incognito.d.ts +2 -1
- package/dist/commands/incognito.js +16 -4
- package/dist/commands/incognito.js.map +1 -1
- package/dist/commands/ingest.d.ts +1 -5
- package/dist/commands/ingest.js +47 -16
- package/dist/commands/ingest.js.map +1 -1
- package/dist/commands/install.d.ts +5 -1
- package/dist/commands/install.js +114 -62
- package/dist/commands/install.js.map +1 -1
- package/dist/commands/login.d.ts +2 -1
- package/dist/commands/login.js +41 -10
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/logout.d.ts +2 -1
- package/dist/commands/logout.js +20 -5
- package/dist/commands/logout.js.map +1 -1
- package/dist/commands/onboard.d.ts +2 -1
- package/dist/commands/onboard.js +7 -3
- package/dist/commands/onboard.js.map +1 -1
- package/dist/commands/org.d.ts +3 -2
- package/dist/commands/org.js +40 -9
- package/dist/commands/org.js.map +1 -1
- package/dist/commands/search.d.ts +2 -4
- package/dist/commands/search.js +25 -16
- package/dist/commands/search.js.map +1 -1
- package/dist/commands/session-start.d.ts +6 -3
- package/dist/commands/session-start.js +16 -6
- package/dist/commands/session-start.js.map +1 -1
- package/dist/commands/status.d.ts +2 -1
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/statusline.d.ts +7 -5
- package/dist/commands/statusline.js +18 -8
- package/dist/commands/statusline.js.map +1 -1
- package/dist/commands/uninstall.d.ts +2 -1
- package/dist/commands/uninstall.js +8 -3
- package/dist/commands/uninstall.js.map +1 -1
- package/dist/commands/update.d.ts +10 -3
- package/dist/commands/update.js +111 -12
- package/dist/commands/update.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { findBin } from "./find-bin.js";
|
|
2
|
+
import { runBin } from "./run-bin.js";
|
|
3
|
+
// A line whose first token is the glen plugin: claude lists `❯ glen@glen`
|
|
4
|
+
// entries (selection marker before the name), codex lists plugin names
|
|
5
|
+
// (`glen — …`) — match exactly `glen` (optionally `@<marketplace>`) at line
|
|
6
|
+
// start, tolerating common list markers (`❯`, `>`, `•`, `*`, `-`) before the
|
|
7
|
+
// name, so `foo@glen`, `glenda`, or a description merely mentioning glen
|
|
8
|
+
// never false-positives.
|
|
9
|
+
const GLEN_PLUGIN_LINE = /^[\s>❯•*-]*glen(@\S+)?(\s|$)/im;
|
|
10
|
+
// Detects whether the glen plugin is installed for an agent by parsing
|
|
11
|
+
// `<agent> plugin list` output. "unknown" (agent missing or list failed)
|
|
12
|
+
// lets callers fall back to attempting an install.
|
|
13
|
+
const glenPluginStatus = (agentBin) => {
|
|
14
|
+
const bin = findBin(agentBin);
|
|
15
|
+
if (!bin)
|
|
16
|
+
return "unknown";
|
|
17
|
+
const r = runBin(bin, ["plugin", "list"], { timeoutMs: 30_000 });
|
|
18
|
+
if (!r.ok)
|
|
19
|
+
return "unknown";
|
|
20
|
+
return GLEN_PLUGIN_LINE.test(r.value.stdout) ? "installed" : "not-installed";
|
|
21
|
+
};
|
|
22
|
+
export { glenPluginStatus };
|
|
23
|
+
//# sourceMappingURL=plugin-status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin-status.js","sourceRoot":"","sources":["../../src/_utils/plugin-status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAItC,0EAA0E;AAC1E,uEAAuE;AACvE,4EAA4E;AAC5E,6EAA6E;AAC7E,yEAAyE;AACzE,yBAAyB;AACzB,MAAM,gBAAgB,GAAG,gCAAgC,CAAC;AAE1D,uEAAuE;AACvE,yEAAyE;AACzE,mDAAmD;AACnD,MAAM,gBAAgB,GAAG,CAAC,QAA4B,EAAgB,EAAE;IACtE,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC9B,IAAI,CAAC,GAAG;QAAE,OAAO,SAAS,CAAC;IAC3B,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC;IACjE,IAAI,CAAC,CAAC,CAAC,EAAE;QAAE,OAAO,SAAS,CAAC;IAC5B,OAAO,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,eAAe,CAAC;AAC/E,CAAC,CAAC;AAEF,OAAO,EAAE,gBAAgB,EAAE,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { type Result } from "./result.js";
|
|
2
|
+
type RunBinFailure = {
|
|
3
|
+
readonly code: number | null;
|
|
4
|
+
readonly stderrTail: string;
|
|
5
|
+
readonly spawnError?: string;
|
|
6
|
+
};
|
|
7
|
+
declare const runBin: (bin: string, args: readonly string[], opts?: {
|
|
8
|
+
timeoutMs?: number;
|
|
9
|
+
}) => Result<{
|
|
10
|
+
stdout: string;
|
|
11
|
+
}, RunBinFailure>;
|
|
12
|
+
export { runBin };
|
|
13
|
+
export type { RunBinFailure };
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { execFileSync } from "node:child_process";
|
|
2
|
+
import { err, ok } from "./result.js";
|
|
3
|
+
const tail = (s) => s
|
|
4
|
+
.split("\n")
|
|
5
|
+
.map((l) => l.trim())
|
|
6
|
+
.filter(Boolean)
|
|
7
|
+
.slice(-3)
|
|
8
|
+
.join(" · ")
|
|
9
|
+
.slice(0, 400);
|
|
10
|
+
// Synchronous on purpose: install/update steps are sequential UX with a
|
|
11
|
+
// ✓/✗ per line. 60s default timeout.
|
|
12
|
+
const runBin = (bin, args, opts = {}) => {
|
|
13
|
+
try {
|
|
14
|
+
const stdout = execFileSync(bin, args, {
|
|
15
|
+
encoding: "utf8",
|
|
16
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
17
|
+
timeout: opts.timeoutMs ?? 60_000,
|
|
18
|
+
});
|
|
19
|
+
return ok({ stdout });
|
|
20
|
+
}
|
|
21
|
+
catch (e) {
|
|
22
|
+
const ex = e;
|
|
23
|
+
if (ex.code === "ENOENT") {
|
|
24
|
+
return err({
|
|
25
|
+
code: null,
|
|
26
|
+
stderrTail: "",
|
|
27
|
+
spawnError: `ENOENT: ${bin} not found`,
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
const stderr = typeof ex.stderr === "string"
|
|
31
|
+
? ex.stderr
|
|
32
|
+
: (ex.stderr?.toString("utf8") ?? "");
|
|
33
|
+
if (ex.code === "ETIMEDOUT") {
|
|
34
|
+
return err({
|
|
35
|
+
code: ex.status ?? null,
|
|
36
|
+
stderrTail: tail(stderr),
|
|
37
|
+
spawnError: `ETIMEDOUT: ${bin} ${args[0] ?? ""} timed out`.trim(),
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
if (ex.signal) {
|
|
41
|
+
return err({
|
|
42
|
+
code: ex.status ?? null,
|
|
43
|
+
stderrTail: tail(stderr),
|
|
44
|
+
spawnError: `killed by ${ex.signal}`,
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
return err({ code: ex.status ?? null, stderrTail: tail(stderr) });
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
export { runBin };
|
|
51
|
+
//# sourceMappingURL=run-bin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-bin.js","sourceRoot":"","sources":["../../src/_utils/run-bin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAe,GAAG,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AAQnD,MAAM,IAAI,GAAG,CAAC,CAAS,EAAU,EAAE,CACjC,CAAC;KACE,KAAK,CAAC,IAAI,CAAC;KACX,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;KACpB,MAAM,CAAC,OAAO,CAAC;KACf,KAAK,CAAC,CAAC,CAAC,CAAC;KACT,IAAI,CAAC,KAAK,CAAC;KACX,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AAEnB,wEAAwE;AACxE,qCAAqC;AACrC,MAAM,MAAM,GAAG,CACb,GAAW,EACX,IAAuB,EACvB,OAA+B,EAAE,EACU,EAAE;IAC7C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,YAAY,CAAC,GAAG,EAAE,IAAgB,EAAE;YACjD,QAAQ,EAAE,MAAM;YAChB,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;YACjC,OAAO,EAAE,IAAI,CAAC,SAAS,IAAI,MAAM;SAClC,CAAC,CAAC;QACH,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;IACxB,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,EAAE,GAAG,CAIV,CAAC;QACF,IAAI,EAAE,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACzB,OAAO,GAAG,CAAC;gBACT,IAAI,EAAE,IAAI;gBACV,UAAU,EAAE,EAAE;gBACd,UAAU,EAAE,WAAW,GAAG,YAAY;aACvC,CAAC,CAAC;QACL,CAAC;QACD,MAAM,MAAM,GACV,OAAO,EAAE,CAAC,MAAM,KAAK,QAAQ;YAC3B,CAAC,CAAC,EAAE,CAAC,MAAM;YACX,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QAC1C,IAAI,EAAE,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YAC5B,OAAO,GAAG,CAAC;gBACT,IAAI,EAAE,EAAE,CAAC,MAAM,IAAI,IAAI;gBACvB,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC;gBACxB,UAAU,EAAE,cAAc,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,YAAY,CAAC,IAAI,EAAE;aAClE,CAAC,CAAC;QACL,CAAC;QACD,IAAI,EAAE,CAAC,MAAM,EAAE,CAAC;YACd,OAAO,GAAG,CAAC;gBACT,IAAI,EAAE,EAAE,CAAC,MAAM,IAAI,IAAI;gBACvB,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC;gBACxB,UAAU,EAAE,aAAa,EAAE,CAAC,MAAM,EAAE;aACrC,CAAC,CAAC;QACL,CAAC;QACD,OAAO,GAAG,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,MAAM,IAAI,IAAI,EAAE,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACpE,CAAC;AACH,CAAC,CAAC;AAEF,OAAO,EAAE,MAAM,EAAE,CAAC"}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
const formatStateLine = (state) => {
|
|
2
2
|
if (!state)
|
|
3
3
|
return null;
|
|
4
|
-
|
|
4
|
+
// Org slugs are auto-generated ("acme-1234") — the NAME is the
|
|
5
|
+
// human-meaningful field, so prefer it.
|
|
6
|
+
const org = state.activeOrgName ?? state.activeOrgSlug ?? state.activeOrgId;
|
|
5
7
|
return state.incognito
|
|
6
8
|
? `[glen] org: ${org} · incognito: ON — nothing this session is being recorded`
|
|
7
9
|
: `[glen] org: ${org} · recording`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"state-line.js","sourceRoot":"","sources":["../../src/_utils/state-line.ts"],"names":[],"mappings":"AAEA,MAAM,eAAe,GAAG,CAAC,KAAuB,EAAiB,EAAE;IACjE,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,MAAM,GAAG,GAAG,KAAK,CAAC,aAAa,IAAI,KAAK,CAAC,aAAa,IAAI,KAAK,CAAC,WAAW,CAAC;IAC5E,OAAO,KAAK,CAAC,SAAS;QACpB,CAAC,CAAC,eAAe,GAAG,2DAA2D;QAC/E,CAAC,CAAC,eAAe,GAAG,cAAc,CAAC;AACvC,CAAC,CAAC;AAEF,OAAO,EAAE,eAAe,EAAE,CAAC"}
|
|
1
|
+
{"version":3,"file":"state-line.js","sourceRoot":"","sources":["../../src/_utils/state-line.ts"],"names":[],"mappings":"AAEA,MAAM,eAAe,GAAG,CAAC,KAAuB,EAAiB,EAAE;IACjE,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,+DAA+D;IAC/D,wCAAwC;IACxC,MAAM,GAAG,GAAG,KAAK,CAAC,aAAa,IAAI,KAAK,CAAC,aAAa,IAAI,KAAK,CAAC,WAAW,CAAC;IAC5E,OAAO,KAAK,CAAC,SAAS;QACpB,CAAC,CAAC,eAAe,GAAG,2DAA2D;QAC/E,CAAC,CAAC,eAAe,GAAG,cAAc,CAAC;AACvC,CAAC,CAAC;AAEF,OAAO,EAAE,eAAe,EAAE,CAAC"}
|
package/dist/_utils/state.d.ts
CHANGED
|
@@ -8,6 +8,6 @@ type GlenState = {
|
|
|
8
8
|
declare const statePath: () => string;
|
|
9
9
|
declare const readState: () => Promise<GlenState | null>;
|
|
10
10
|
declare const writeState: (state: GlenState) => Promise<Result<void, unknown>>;
|
|
11
|
-
declare const clearState: () => Promise<void
|
|
11
|
+
declare const clearState: () => Promise<Result<void, unknown>>;
|
|
12
12
|
export { statePath, readState, writeState, clearState };
|
|
13
13
|
export type { GlenState };
|
package/dist/_utils/state.js
CHANGED
|
@@ -25,7 +25,8 @@ const writeState = async (state) => {
|
|
|
25
25
|
const mk = await fromPromise(mkdir(dirname(filePath), { recursive: true, mode: 0o700 }));
|
|
26
26
|
if (!mk.ok)
|
|
27
27
|
return mk;
|
|
28
|
-
|
|
28
|
+
// pid-suffixed so concurrent writers never clobber each other's tmp file.
|
|
29
|
+
const tmp = `${filePath}.${process.pid}.tmp`;
|
|
29
30
|
const w = await fromPromise(writeFile(tmp, JSON.stringify(state, null, 2)));
|
|
30
31
|
if (!w.ok)
|
|
31
32
|
return w;
|
|
@@ -34,8 +35,13 @@ const writeState = async (state) => {
|
|
|
34
35
|
return mv;
|
|
35
36
|
return { ok: true, value: undefined };
|
|
36
37
|
};
|
|
38
|
+
// ENOENT counts as success (nothing to clear); any other failure is returned
|
|
39
|
+
// so the caller can tell the user the file is still on disk.
|
|
37
40
|
const clearState = async () => {
|
|
38
|
-
await fromPromise(unlink(statePath()));
|
|
41
|
+
const r = await fromPromise(unlink(statePath()));
|
|
42
|
+
if (!r.ok && r.error.code !== "ENOENT")
|
|
43
|
+
return r;
|
|
44
|
+
return { ok: true, value: undefined };
|
|
39
45
|
};
|
|
40
46
|
export { statePath, readState, writeState, clearState };
|
|
41
47
|
//# sourceMappingURL=state.js.map
|
package/dist/_utils/state.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/_utils/state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC9E,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAU1C,MAAM,SAAS,GAAG,GAAW,EAAE,CAC7B,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC;AAExE,MAAM,SAAS,GAAG,KAAK,IAA+B,EAAE;IACtD,MAAM,GAAG,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC,SAAS,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC;IAC9D,IAAI,CAAC,GAAG,CAAC,EAAE;QAAE,OAAO,IAAI,CAAC;IACzB,MAAM,MAAM,GAAG,MAAM,WAAW,CAC9B,IAAI,OAAO,CAAU,CAAC,OAAO,EAAE,EAAE,CAC/B,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAY,CAAC,CAC1C,CACF,CAAC;IACF,IAAI,CAAC,MAAM,CAAC,EAAE;QAAE,OAAO,IAAI,CAAC;IAC5B,MAAM,CAAC,GAAG,MAAM,CAAC,KAAuC,CAAC;IACzD,IAAI,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,WAAW,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IACzD,OAAO;QACL,WAAW,EAAE,CAAC,CAAC,WAAW;QAC1B,aAAa,EAAE,OAAO,CAAC,CAAC,aAAa,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI;QAC3E,aAAa,EAAE,OAAO,CAAC,CAAC,aAAa,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI;QAC3E,SAAS,EAAE,CAAC,CAAC,SAAS,KAAK,IAAI;KAChC,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,UAAU,GAAG,KAAK,EAAE,KAAgB,EAAkC,EAAE;IAC5E,MAAM,QAAQ,GAAG,SAAS,EAAE,CAAC;IAC7B,MAAM,EAAE,GAAG,MAAM,WAAW,CAC1B,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAC3D,CAAC;IACF,IAAI,CAAC,EAAE,CAAC,EAAE;QAAE,OAAO,EAAE,CAAC;IACtB,MAAM,GAAG,GAAG,GAAG,QAAQ,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/_utils/state.ts"],"names":[],"mappings":"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"}
|
package/dist/_utils/update.d.ts
CHANGED
|
@@ -1,11 +1,29 @@
|
|
|
1
|
+
declare const lockPath: () => string;
|
|
1
2
|
declare const shouldCheck: (now: number) => boolean;
|
|
2
3
|
declare const recordCheck: (now: number, latest: string | null) => void;
|
|
3
4
|
declare const fetchLatest: () => Promise<string | null>;
|
|
5
|
+
declare const cachedNewerVersion: () => string | null;
|
|
4
6
|
declare const newer: (a: string, b: string) => boolean;
|
|
5
7
|
declare const isNpmGlobalInstall: () => boolean;
|
|
6
|
-
|
|
8
|
+
type SelfUpdateResult = {
|
|
9
|
+
readonly ok: true;
|
|
10
|
+
} | {
|
|
11
|
+
readonly ok: false;
|
|
12
|
+
readonly reason: "locked" | "npm-failed";
|
|
13
|
+
readonly stderrTail?: string;
|
|
14
|
+
};
|
|
15
|
+
declare const runSelfUpdate: () => SelfUpdateResult;
|
|
7
16
|
/** Detached, TTL'd: never blocks the calling turn. Safe to call from every command. */
|
|
8
17
|
declare const maybeSpawnBackgroundUpdate: () => Promise<void>;
|
|
9
18
|
/** 426 from the server: update NOW, then re-exec the (new) global bin with the original args. */
|
|
10
19
|
declare const handle426AndReexec: (argv: string[]) => never;
|
|
11
|
-
|
|
20
|
+
/**
|
|
21
|
+
* 426 in a hook context: hint + detached background update, never block or
|
|
22
|
+
* re-exec — the hook has a hard timeout and Claude/Codex inject its stdout
|
|
23
|
+
* as context, so a synchronous npm install here would block the user's turn.
|
|
24
|
+
* Returns whether a background update was actually spawned, so callers can
|
|
25
|
+
* pick an honest agent-facing hint (a gated spawn means nothing is updating —
|
|
26
|
+
* the user has to run the install themselves).
|
|
27
|
+
*/
|
|
28
|
+
declare const handle426InHook: () => boolean;
|
|
29
|
+
export { lockPath, shouldCheck, recordCheck, fetchLatest, newer, isNpmGlobalInstall, runSelfUpdate, maybeSpawnBackgroundUpdate, handle426AndReexec, handle426InHook, cachedNewerVersion, };
|
package/dist/_utils/update.js
CHANGED
|
@@ -1,9 +1,14 @@
|
|
|
1
1
|
import { execFileSync, spawn, spawnSync } from "node:child_process";
|
|
2
2
|
import { mkdirSync, readFileSync, realpathSync, rmSync, writeFileSync, } from "node:fs";
|
|
3
3
|
import { homedir } from "node:os";
|
|
4
|
-
import { join } from "node:path";
|
|
4
|
+
import { dirname, join } from "node:path";
|
|
5
|
+
import { runBin } from "./run-bin.js";
|
|
5
6
|
import { cliVersion } from "./version.js";
|
|
6
|
-
|
|
7
|
+
// Mirrors how codex-hooks-setup.ts derives its marker path from statePath():
|
|
8
|
+
// when GLEN_STATE_PATH is set (tests), the glen dir is its dirname.
|
|
9
|
+
const glenDir = () => process.env.GLEN_STATE_PATH
|
|
10
|
+
? dirname(process.env.GLEN_STATE_PATH)
|
|
11
|
+
: join(homedir(), ".glen");
|
|
7
12
|
const checkPath = () => join(glenDir(), "update-check.json");
|
|
8
13
|
const lockPath = () => join(glenDir(), "update.lock");
|
|
9
14
|
const DAY_MS = 24 * 60 * 60 * 1000;
|
|
@@ -44,6 +49,17 @@ const fetchLatest = async () => {
|
|
|
44
49
|
return null;
|
|
45
50
|
}
|
|
46
51
|
};
|
|
52
|
+
// Reads the TTL'd update-check cache (never hits the network). Returns the
|
|
53
|
+
// newer known version, else null.
|
|
54
|
+
const cachedNewerVersion = () => {
|
|
55
|
+
try {
|
|
56
|
+
const data = JSON.parse(readFileSync(checkPath(), "utf8"));
|
|
57
|
+
return data.latest && newer(data.latest, cliVersion) ? data.latest : null;
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
};
|
|
47
63
|
const newer = (a, b) => {
|
|
48
64
|
const pa = a.split(".").map(Number);
|
|
49
65
|
const pb = b.split(".").map(Number);
|
|
@@ -66,22 +82,64 @@ const isNpmGlobalInstall = () => {
|
|
|
66
82
|
return false;
|
|
67
83
|
}
|
|
68
84
|
};
|
|
69
|
-
const
|
|
85
|
+
const LOCK_TTL_MS = 10 * 60 * 1000;
|
|
86
|
+
// Acquire the update lock dir atomically (mkdir without recursive throws
|
|
87
|
+
// EEXIST when held). A stale lock — no readable start marker, or one older
|
|
88
|
+
// than LOCK_TTL_MS (e.g. a previous update was SIGKILLed mid-install) — is
|
|
89
|
+
// removed and the mkdir retried ONCE.
|
|
90
|
+
const acquireUpdateLock = () => {
|
|
91
|
+
const tryMkdir = () => {
|
|
92
|
+
try {
|
|
93
|
+
mkdirSync(lockPath());
|
|
94
|
+
}
|
|
95
|
+
catch {
|
|
96
|
+
return false;
|
|
97
|
+
}
|
|
98
|
+
try {
|
|
99
|
+
writeFileSync(join(lockPath(), "started"), String(Date.now()));
|
|
100
|
+
}
|
|
101
|
+
catch {
|
|
102
|
+
// best-effort: a missing marker reads as stale to the next contender
|
|
103
|
+
}
|
|
104
|
+
return true;
|
|
105
|
+
};
|
|
106
|
+
if (tryMkdir())
|
|
107
|
+
return true;
|
|
108
|
+
const startedAt = (() => {
|
|
109
|
+
try {
|
|
110
|
+
const n = Number(readFileSync(join(lockPath(), "started"), "utf8"));
|
|
111
|
+
return Number.isFinite(n) ? n : null;
|
|
112
|
+
}
|
|
113
|
+
catch {
|
|
114
|
+
return null;
|
|
115
|
+
}
|
|
116
|
+
})();
|
|
117
|
+
if (startedAt !== null && Date.now() - startedAt <= LOCK_TTL_MS)
|
|
118
|
+
return false;
|
|
70
119
|
try {
|
|
71
|
-
|
|
120
|
+
rmSync(lockPath(), { recursive: true, force: true });
|
|
72
121
|
}
|
|
73
122
|
catch {
|
|
74
123
|
return false;
|
|
75
124
|
}
|
|
125
|
+
return tryMkdir();
|
|
126
|
+
};
|
|
127
|
+
const runSelfUpdate = () => {
|
|
128
|
+
if (!acquireUpdateLock())
|
|
129
|
+
return { ok: false, reason: "locked" };
|
|
76
130
|
try {
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
timeout: 120_000,
|
|
131
|
+
const r = runBin("npm", ["install", "-g", "@tryglen/cli@latest"], {
|
|
132
|
+
timeoutMs: 120_000,
|
|
80
133
|
});
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
134
|
+
if (!r.ok) {
|
|
135
|
+
const stderrTail = r.error.stderrTail || r.error.spawnError;
|
|
136
|
+
return {
|
|
137
|
+
ok: false,
|
|
138
|
+
reason: "npm-failed",
|
|
139
|
+
...(stderrTail ? { stderrTail } : {}),
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
return { ok: true };
|
|
85
143
|
}
|
|
86
144
|
finally {
|
|
87
145
|
rmSync(lockPath(), { recursive: true, force: true });
|
|
@@ -101,6 +159,9 @@ const maybeSpawnBackgroundUpdate = async () => {
|
|
|
101
159
|
return;
|
|
102
160
|
}
|
|
103
161
|
const child = spawn(process.execPath, [process.argv[1] ?? "glen", "__self-update"], { detached: true, stdio: "ignore" });
|
|
162
|
+
child.on("error", () => {
|
|
163
|
+
// best-effort — an uncaught async 'error' would crash the calling command
|
|
164
|
+
});
|
|
104
165
|
child.unref();
|
|
105
166
|
};
|
|
106
167
|
/** 426 from the server: update NOW, then re-exec the (new) global bin with the original args. */
|
|
@@ -108,15 +169,50 @@ const handle426AndReexec = (argv) => {
|
|
|
108
169
|
if (process.env.GLEN_REEXEC === "1" ||
|
|
109
170
|
autoUpdateDisabled() ||
|
|
110
171
|
!isNpmGlobalInstall() ||
|
|
111
|
-
!runSelfUpdate()) {
|
|
172
|
+
!runSelfUpdate().ok) {
|
|
112
173
|
process.stderr.write("[glen] this CLI is below the server's minimum version; run `npm i -g @tryglen/cli@latest`.\n");
|
|
113
174
|
process.exit(1);
|
|
114
175
|
}
|
|
115
|
-
|
|
176
|
+
// Re-exec via process.execPath + argv[1] (never a bare "glen" — fails
|
|
177
|
+
// off-PATH and exits silently).
|
|
178
|
+
const r = spawnSync(process.execPath, [process.argv[1] ?? "glen", ...argv], {
|
|
116
179
|
stdio: "inherit",
|
|
117
180
|
env: { ...process.env, GLEN_REEXEC: "1" },
|
|
118
181
|
});
|
|
119
|
-
|
|
182
|
+
if (r.status === null || r.error) {
|
|
183
|
+
process.stderr.write("[glen] updated, but could not re-run the command automatically — run it again.\n");
|
|
184
|
+
process.exit(1);
|
|
185
|
+
}
|
|
186
|
+
process.exit(r.status);
|
|
187
|
+
};
|
|
188
|
+
/**
|
|
189
|
+
* 426 in a hook context: hint + detached background update, never block or
|
|
190
|
+
* re-exec — the hook has a hard timeout and Claude/Codex inject its stdout
|
|
191
|
+
* as context, so a synchronous npm install here would block the user's turn.
|
|
192
|
+
* Returns whether a background update was actually spawned, so callers can
|
|
193
|
+
* pick an honest agent-facing hint (a gated spawn means nothing is updating —
|
|
194
|
+
* the user has to run the install themselves).
|
|
195
|
+
*/
|
|
196
|
+
const handle426InHook = () => {
|
|
197
|
+
const spawned = (() => {
|
|
198
|
+
if (autoUpdateDisabled() || !isNpmGlobalInstall())
|
|
199
|
+
return false;
|
|
200
|
+
try {
|
|
201
|
+
const c = spawn(process.execPath, [process.argv[1] ?? "glen", "__self-update"], { detached: true, stdio: "ignore" });
|
|
202
|
+
c.on("error", () => {
|
|
203
|
+
/* best-effort */
|
|
204
|
+
});
|
|
205
|
+
c.unref();
|
|
206
|
+
return true;
|
|
207
|
+
}
|
|
208
|
+
catch {
|
|
209
|
+
return false;
|
|
210
|
+
}
|
|
211
|
+
})();
|
|
212
|
+
process.stderr.write(spawned
|
|
213
|
+
? "[glen] glen CLI is below the server's minimum version — updating in the background; this turn was not recorded.\n"
|
|
214
|
+
: "[glen] glen CLI is below the server's minimum version — update it: npm i -g @tryglen/cli@latest\n");
|
|
215
|
+
return spawned;
|
|
120
216
|
};
|
|
121
|
-
export { shouldCheck, recordCheck, fetchLatest, newer, isNpmGlobalInstall, runSelfUpdate, maybeSpawnBackgroundUpdate, handle426AndReexec, };
|
|
217
|
+
export { lockPath, shouldCheck, recordCheck, fetchLatest, newer, isNpmGlobalInstall, runSelfUpdate, maybeSpawnBackgroundUpdate, handle426AndReexec, handle426InHook, cachedNewerVersion, };
|
|
122
218
|
//# sourceMappingURL=update.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/_utils/update.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACpE,OAAO,EACL,SAAS,EACT,YAAY,EACZ,YAAY,EACZ,MAAM,EACN,aAAa,GACd,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/_utils/update.ts"],"names":[],"mappings":"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"}
|
package/dist/_utils/version.js
CHANGED
|
@@ -5,6 +5,17 @@ import { fileURLToPath } from "node:url";
|
|
|
5
5
|
// Works from both src/_utils/ (vitest runs TS directly) and dist/_utils/ (built)
|
|
6
6
|
// because both are exactly two levels deep from the package root.
|
|
7
7
|
const pkgPath = join(dirname(fileURLToPath(import.meta.url)), "..", "..", "package.json");
|
|
8
|
-
|
|
8
|
+
// A corrupt install (missing/unparseable package.json) must not crash every
|
|
9
|
+
// command — including hooks — at import time. Fall back to "0.0.0", which is
|
|
10
|
+
// older than any published version, so the update paths still fire.
|
|
11
|
+
const cliVersion = (() => {
|
|
12
|
+
try {
|
|
13
|
+
const v = JSON.parse(readFileSync(pkgPath, "utf8")).version;
|
|
14
|
+
return typeof v === "string" ? v : "0.0.0";
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
return "0.0.0";
|
|
18
|
+
}
|
|
19
|
+
})();
|
|
9
20
|
export { cliVersion };
|
|
10
21
|
//# sourceMappingURL=version.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/_utils/version.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,0DAA0D;AAC1D,iFAAiF;AACjF,kEAAkE;AAClE,MAAM,OAAO,GAAG,IAAI,CAClB,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EACvC,IAAI,EACJ,IAAI,EACJ,cAAc,CACf,CAAC;AAEF,MAAM,UAAU,
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/_utils/version.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,0DAA0D;AAC1D,iFAAiF;AACjF,kEAAkE;AAClE,MAAM,OAAO,GAAG,IAAI,CAClB,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EACvC,IAAI,EACJ,IAAI,EACJ,cAAc,CACf,CAAC;AAEF,4EAA4E;AAC5E,6EAA6E;AAC7E,oEAAoE;AACpE,MAAM,UAAU,GAAG,CAAC,GAAG,EAAE;IACvB,IAAI,CAAC;QACH,MAAM,CAAC,GACL,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CACzC,CAAC,OAAO,CAAC;QACV,OAAO,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;IAC7C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,OAAO,CAAC;IACjB,CAAC;AACH,CAAC,CAAC,EAAE,CAAC;AAEL,OAAO,EAAE,UAAU,EAAE,CAAC"}
|
package/dist/_utils/which.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
2
|
+
* True when the named agent binary is resolvable (PATH, well-known macOS
|
|
3
|
+
* dirs, login-shell PATH, or a persisted `glen install --<bin>-path`
|
|
4
|
+
* override). See find-bin.ts.
|
|
4
5
|
*/
|
|
5
6
|
declare const isInstalled: (bin: string) => boolean;
|
|
6
7
|
export { isInstalled };
|
package/dist/_utils/which.js
CHANGED
|
@@ -1,16 +1,9 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { findBin } from "./find-bin.js";
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
4
|
-
*
|
|
3
|
+
* True when the named agent binary is resolvable (PATH, well-known macOS
|
|
4
|
+
* dirs, login-shell PATH, or a persisted `glen install --<bin>-path`
|
|
5
|
+
* override). See find-bin.ts.
|
|
5
6
|
*/
|
|
6
|
-
const isInstalled = (bin) =>
|
|
7
|
-
try {
|
|
8
|
-
execFileSync("which", [bin], { stdio: "ignore" });
|
|
9
|
-
return true;
|
|
10
|
-
}
|
|
11
|
-
catch {
|
|
12
|
-
return false;
|
|
13
|
-
}
|
|
14
|
-
};
|
|
7
|
+
const isInstalled = (bin) => findBin(bin) !== null;
|
|
15
8
|
export { isInstalled };
|
|
16
9
|
//# sourceMappingURL=which.js.map
|
package/dist/_utils/which.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"which.js","sourceRoot":"","sources":["../../src/_utils/which.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"which.js","sourceRoot":"","sources":["../../src/_utils/which.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAExC;;;;GAIG;AACH,MAAM,WAAW,GAAG,CAAC,GAAW,EAAW,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC;AAEpE,OAAO,EAAE,WAAW,EAAE,CAAC"}
|