@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.
Files changed (91) hide show
  1. package/README.md +3 -3
  2. package/dist/_utils/agents-table.d.ts +10 -0
  3. package/dist/_utils/agents-table.js +26 -0
  4. package/dist/_utils/agents-table.js.map +1 -0
  5. package/dist/_utils/cli-error.d.ts +11 -0
  6. package/dist/_utils/cli-error.js +24 -0
  7. package/dist/_utils/cli-error.js.map +1 -0
  8. package/dist/_utils/codex-app-server.js +4 -1
  9. package/dist/_utils/codex-app-server.js.map +1 -1
  10. package/dist/_utils/config.js +3 -1
  11. package/dist/_utils/config.js.map +1 -1
  12. package/dist/_utils/credentials.d.ts +1 -1
  13. package/dist/_utils/credentials.js +8 -3
  14. package/dist/_utils/credentials.js.map +1 -1
  15. package/dist/_utils/ensure-global-cli.d.ts +7 -5
  16. package/dist/_utils/ensure-global-cli.js +47 -17
  17. package/dist/_utils/ensure-global-cli.js.map +1 -1
  18. package/dist/_utils/find-bin.d.ts +6 -0
  19. package/dist/_utils/find-bin.js +85 -0
  20. package/dist/_utils/find-bin.js.map +1 -0
  21. package/dist/_utils/http.d.ts +10 -3
  22. package/dist/_utils/http.js +56 -5
  23. package/dist/_utils/http.js.map +1 -1
  24. package/dist/_utils/loopback-server.d.ts +1 -1
  25. package/dist/_utils/loopback-server.js +17 -2
  26. package/dist/_utils/loopback-server.js.map +1 -1
  27. package/dist/_utils/open-browser.js +3 -0
  28. package/dist/_utils/open-browser.js.map +1 -1
  29. package/dist/_utils/plugin-status.d.ts +4 -0
  30. package/dist/_utils/plugin-status.js +23 -0
  31. package/dist/_utils/plugin-status.js.map +1 -0
  32. package/dist/_utils/run-bin.d.ts +13 -0
  33. package/dist/_utils/run-bin.js +51 -0
  34. package/dist/_utils/run-bin.js.map +1 -0
  35. package/dist/_utils/state-line.js +3 -1
  36. package/dist/_utils/state-line.js.map +1 -1
  37. package/dist/_utils/state.d.ts +1 -1
  38. package/dist/_utils/state.js +8 -2
  39. package/dist/_utils/state.js.map +1 -1
  40. package/dist/_utils/update.d.ts +20 -2
  41. package/dist/_utils/update.js +111 -15
  42. package/dist/_utils/update.js.map +1 -1
  43. package/dist/_utils/version.js +12 -1
  44. package/dist/_utils/version.js.map +1 -1
  45. package/dist/_utils/which.d.ts +3 -2
  46. package/dist/_utils/which.js +5 -12
  47. package/dist/_utils/which.js.map +1 -1
  48. package/dist/bin.js +44 -22
  49. package/dist/bin.js.map +1 -1
  50. package/dist/commands/doctor.d.ts +6 -3
  51. package/dist/commands/doctor.js +68 -54
  52. package/dist/commands/doctor.js.map +1 -1
  53. package/dist/commands/incognito.d.ts +2 -1
  54. package/dist/commands/incognito.js +16 -4
  55. package/dist/commands/incognito.js.map +1 -1
  56. package/dist/commands/ingest.d.ts +1 -5
  57. package/dist/commands/ingest.js +47 -16
  58. package/dist/commands/ingest.js.map +1 -1
  59. package/dist/commands/install.d.ts +5 -1
  60. package/dist/commands/install.js +114 -62
  61. package/dist/commands/install.js.map +1 -1
  62. package/dist/commands/login.d.ts +2 -1
  63. package/dist/commands/login.js +41 -10
  64. package/dist/commands/login.js.map +1 -1
  65. package/dist/commands/logout.d.ts +2 -1
  66. package/dist/commands/logout.js +20 -5
  67. package/dist/commands/logout.js.map +1 -1
  68. package/dist/commands/onboard.d.ts +2 -1
  69. package/dist/commands/onboard.js +7 -3
  70. package/dist/commands/onboard.js.map +1 -1
  71. package/dist/commands/org.d.ts +3 -2
  72. package/dist/commands/org.js +40 -9
  73. package/dist/commands/org.js.map +1 -1
  74. package/dist/commands/search.d.ts +2 -4
  75. package/dist/commands/search.js +25 -16
  76. package/dist/commands/search.js.map +1 -1
  77. package/dist/commands/session-start.d.ts +6 -3
  78. package/dist/commands/session-start.js +16 -6
  79. package/dist/commands/session-start.js.map +1 -1
  80. package/dist/commands/status.d.ts +2 -1
  81. package/dist/commands/status.js.map +1 -1
  82. package/dist/commands/statusline.d.ts +7 -5
  83. package/dist/commands/statusline.js +18 -8
  84. package/dist/commands/statusline.js.map +1 -1
  85. package/dist/commands/uninstall.d.ts +2 -1
  86. package/dist/commands/uninstall.js +8 -3
  87. package/dist/commands/uninstall.js.map +1 -1
  88. package/dist/commands/update.d.ts +10 -3
  89. package/dist/commands/update.js +111 -12
  90. package/dist/commands/update.js.map +1 -1
  91. package/package.json +1 -1
@@ -0,0 +1,4 @@
1
+ type PluginStatus = "installed" | "not-installed" | "unknown";
2
+ declare const glenPluginStatus: (agentBin: "claude" | "codex") => PluginStatus;
3
+ export { glenPluginStatus };
4
+ export type { PluginStatus };
@@ -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
- const org = state.activeOrgSlug ?? state.activeOrgName ?? state.activeOrgId;
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"}
@@ -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 };
@@ -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
- const tmp = `${filePath}.tmp`;
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
@@ -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;IAC9B,MAAM,CAAC,GAAG,MAAM,WAAW,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5E,IAAI,CAAC,CAAC,CAAC,EAAE;QAAE,OAAO,CAAC,CAAC;IACpB,MAAM,EAAE,GAAG,MAAM,WAAW,CAAC,MAAM,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC;IACpD,IAAI,CAAC,EAAE,CAAC,EAAE;QAAE,OAAO,EAAE,CAAC;IACtB,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;AACxC,CAAC,CAAC;AAEF,MAAM,UAAU,GAAG,KAAK,IAAmB,EAAE;IAC3C,MAAM,WAAW,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;AACzC,CAAC,CAAC;AAEF,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC"}
1
+ {"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/_utils/state.ts"],"names":[],"mappings":"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"}
@@ -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
- declare const runSelfUpdate: () => boolean;
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
- export { shouldCheck, recordCheck, fetchLatest, newer, isNpmGlobalInstall, runSelfUpdate, maybeSpawnBackgroundUpdate, handle426AndReexec, };
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, };
@@ -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
- const glenDir = () => join(homedir(), ".glen");
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 runSelfUpdate = () => {
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
- mkdirSync(lockPath()); // atomic lock; throws if held
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
- execFileSync("npm", ["install", "-g", "@tryglen/cli@latest"], {
78
- stdio: "ignore",
79
- timeout: 120_000,
131
+ const r = runBin("npm", ["install", "-g", "@tryglen/cli@latest"], {
132
+ timeoutMs: 120_000,
80
133
  });
81
- return true;
82
- }
83
- catch {
84
- return false;
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
- const r = spawnSync("glen", argv, {
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
- process.exit(r.status ?? 1);
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":"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"}
1
+ {"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/_utils/update.ts"],"names":[],"mappings":"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"}
@@ -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
- const cliVersion = JSON.parse(readFileSync(pkgPath, "utf8")).version;
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,GACd,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CACzC,CAAC,OAAO,CAAC;AAEV,OAAO,EAAE,UAAU,EAAE,CAAC"}
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"}
@@ -1,6 +1,7 @@
1
1
  /**
2
- * Returns true when the named binary is found on PATH (via `which`).
3
- * Used by install.ts and doctor.ts to detect coding agents.
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 };
@@ -1,16 +1,9 @@
1
- import { execFileSync } from "node:child_process";
1
+ import { findBin } from "./find-bin.js";
2
2
  /**
3
- * Returns true when the named binary is found on PATH (via `which`).
4
- * Used by install.ts and doctor.ts to detect coding agents.
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
@@ -1 +1 @@
1
- {"version":3,"file":"which.js","sourceRoot":"","sources":["../../src/_utils/which.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD;;;GAGG;AACH,MAAM,WAAW,GAAG,CAAC,GAAW,EAAW,EAAE;IAC3C,IAAI,CAAC;QACH,YAAY,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;QAClD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC,CAAC;AAEF,OAAO,EAAE,WAAW,EAAE,CAAC"}
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"}