@tryglen/cli 0.5.1 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (88) 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/find-bin.d.ts +6 -0
  16. package/dist/_utils/find-bin.js +85 -0
  17. package/dist/_utils/find-bin.js.map +1 -0
  18. package/dist/_utils/http.d.ts +10 -3
  19. package/dist/_utils/http.js +56 -5
  20. package/dist/_utils/http.js.map +1 -1
  21. package/dist/_utils/loopback-server.d.ts +1 -1
  22. package/dist/_utils/loopback-server.js +17 -2
  23. package/dist/_utils/loopback-server.js.map +1 -1
  24. package/dist/_utils/open-browser.js +3 -0
  25. package/dist/_utils/open-browser.js.map +1 -1
  26. package/dist/_utils/plugin-status.d.ts +4 -0
  27. package/dist/_utils/plugin-status.js +23 -0
  28. package/dist/_utils/plugin-status.js.map +1 -0
  29. package/dist/_utils/run-bin.d.ts +13 -0
  30. package/dist/_utils/run-bin.js +51 -0
  31. package/dist/_utils/run-bin.js.map +1 -0
  32. package/dist/_utils/state-line.js +3 -1
  33. package/dist/_utils/state-line.js.map +1 -1
  34. package/dist/_utils/state.d.ts +1 -1
  35. package/dist/_utils/state.js +8 -2
  36. package/dist/_utils/state.js.map +1 -1
  37. package/dist/_utils/update.d.ts +20 -2
  38. package/dist/_utils/update.js +111 -15
  39. package/dist/_utils/update.js.map +1 -1
  40. package/dist/_utils/version.js +12 -1
  41. package/dist/_utils/version.js.map +1 -1
  42. package/dist/_utils/which.d.ts +3 -2
  43. package/dist/_utils/which.js +5 -12
  44. package/dist/_utils/which.js.map +1 -1
  45. package/dist/bin.js +44 -22
  46. package/dist/bin.js.map +1 -1
  47. package/dist/commands/doctor.d.ts +6 -3
  48. package/dist/commands/doctor.js +68 -54
  49. package/dist/commands/doctor.js.map +1 -1
  50. package/dist/commands/incognito.d.ts +2 -1
  51. package/dist/commands/incognito.js +16 -4
  52. package/dist/commands/incognito.js.map +1 -1
  53. package/dist/commands/ingest.d.ts +1 -5
  54. package/dist/commands/ingest.js +47 -16
  55. package/dist/commands/ingest.js.map +1 -1
  56. package/dist/commands/install.d.ts +5 -1
  57. package/dist/commands/install.js +121 -81
  58. package/dist/commands/install.js.map +1 -1
  59. package/dist/commands/login.d.ts +2 -1
  60. package/dist/commands/login.js +41 -10
  61. package/dist/commands/login.js.map +1 -1
  62. package/dist/commands/logout.d.ts +2 -1
  63. package/dist/commands/logout.js +20 -5
  64. package/dist/commands/logout.js.map +1 -1
  65. package/dist/commands/onboard.d.ts +2 -1
  66. package/dist/commands/onboard.js +7 -3
  67. package/dist/commands/onboard.js.map +1 -1
  68. package/dist/commands/org.d.ts +3 -2
  69. package/dist/commands/org.js +40 -9
  70. package/dist/commands/org.js.map +1 -1
  71. package/dist/commands/search.d.ts +2 -4
  72. package/dist/commands/search.js +25 -16
  73. package/dist/commands/search.js.map +1 -1
  74. package/dist/commands/session-start.d.ts +6 -3
  75. package/dist/commands/session-start.js +16 -6
  76. package/dist/commands/session-start.js.map +1 -1
  77. package/dist/commands/status.d.ts +2 -1
  78. package/dist/commands/status.js.map +1 -1
  79. package/dist/commands/statusline.d.ts +7 -5
  80. package/dist/commands/statusline.js +18 -8
  81. package/dist/commands/statusline.js.map +1 -1
  82. package/dist/commands/uninstall.d.ts +2 -1
  83. package/dist/commands/uninstall.js +8 -3
  84. package/dist/commands/uninstall.js.map +1 -1
  85. package/dist/commands/update.d.ts +10 -3
  86. package/dist/commands/update.js +111 -12
  87. package/dist/commands/update.js.map +1 -1
  88. package/package.json +1 -1
@@ -1,15 +1,16 @@
1
1
  import prompts from "prompts";
2
+ import { causeOf, cliErr } from "../_utils/cli-error.js";
2
3
  import { config } from "../_utils/config.js";
3
4
  import { readCredentials } from "../_utils/credentials.js";
4
5
  import { buildGlenHeaders } from "../_utils/glen-headers.js";
5
- import { httpJson } from "../_utils/http.js";
6
+ import { httpJson, networkRemedy } from "../_utils/http.js";
6
7
  import { err, ok } from "../_utils/result.js";
7
- import { readState, writeState } from "../_utils/state.js";
8
+ import { readState, statePath, writeState } from "../_utils/state.js";
8
9
  import { cliVersion } from "../_utils/version.js";
9
10
  const fetchOrgs = async () => {
10
11
  const creds = await readCredentials();
11
12
  if (!creds)
12
- return err("Not connected. Run `glen login` first.");
13
+ return err(cliErr({ what: "not connected", remedy: "run `glen login` first" }));
13
14
  const state = await readState();
14
15
  const res = await httpJson(config.listOrgsUrl, {
15
16
  method: "POST",
@@ -21,14 +22,28 @@ const fetchOrgs = async () => {
21
22
  timeoutMs: config.listOrgsTimeoutMs,
22
23
  });
23
24
  if (!res.ok)
24
- return err("Could not reach glen (network error).");
25
+ return err(cliErr({
26
+ what: "could not reach glen",
27
+ why: res.error.detail,
28
+ remedy: networkRemedy(res.error),
29
+ }));
25
30
  if (res.value.status === 401 || res.value.status === 403)
26
- return err("Your session lost its organization. Run `glen login` to reconnect.");
31
+ return err(cliErr({
32
+ what: "your session lost its organization",
33
+ remedy: "run `glen login` to reconnect",
34
+ }));
27
35
  if (!res.value.isOk)
28
- return err(`glen returned HTTP ${res.value.status}.`);
36
+ return err(cliErr({
37
+ what: `glen returned HTTP ${res.value.status}`,
38
+ why: res.value.rawText.slice(0, 200) || `HTTP ${res.value.status}`,
39
+ remedy: "try again in a minute — if it persists, check https://tryglen.com/status",
40
+ }));
29
41
  const orgs = res.value.json?.orgs;
30
42
  if (!orgs)
31
- return err("Unexpected response from glen.");
43
+ return err(cliErr({
44
+ what: "unexpected response from glen",
45
+ remedy: "update the CLI (`glen update`) and retry",
46
+ }));
32
47
  return ok(orgs);
33
48
  };
34
49
  const applySwitch = async (target) => {
@@ -40,7 +55,12 @@ const applySwitch = async (target) => {
40
55
  incognito: current?.incognito ?? false,
41
56
  });
42
57
  if (!w.ok)
43
- return err("Failed to write state file.");
58
+ return err(cliErr({
59
+ what: "could not save org selection",
60
+ why: causeOf(w.error),
61
+ path: statePath(),
62
+ remedy: "check ownership of ~/.glen (e.g. `sudo chown -R $USER ~/.glen`) and retry",
63
+ }));
44
64
  process.stdout.write(`🏔️ Active organization is now ${target.name} (${target.slug}).\n`);
45
65
  return ok(undefined);
46
66
  };
@@ -53,13 +73,24 @@ const orgList = async () => {
53
73
  return ok(undefined);
54
74
  };
55
75
  const orgSwitch = async (slug) => {
76
+ // No slug + no TTY: the interactive picker would hang (or silently no-op) —
77
+ // fail fast with the scripted alternative before any network call.
78
+ if (!slug && !process.stdin.isTTY)
79
+ return err(cliErr({
80
+ what: "no organization specified",
81
+ remedy: "non-interactive shell — pass a slug: glen org switch <slug> (see `glen org list`)",
82
+ }));
56
83
  const orgs = await fetchOrgs();
57
84
  if (!orgs.ok)
58
85
  return orgs;
59
86
  if (slug) {
60
87
  const target = orgs.value.find((o) => o.slug === slug || o.orgId === slug);
61
88
  if (!target)
62
- return err(`No organization "${slug}". Available: ${orgs.value.map((o) => o.slug).join(", ")}`);
89
+ return err(cliErr({
90
+ what: `no organization "${slug}"`,
91
+ why: `available: ${orgs.value.map((o) => o.slug).join(", ")}`,
92
+ remedy: "run `glen org list` and pass one of the listed slugs",
93
+ }));
63
94
  return applySwitch(target);
64
95
  }
65
96
  const response = await prompts({
@@ -1 +1 @@
1
- {"version":3,"file":"org.js","sourceRoot":"","sources":["../../src/commands/org.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"org.js","sourceRoot":"","sources":["../../src/commands/org.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,4 @@
1
+ import { type CliError } from "../_utils/cli-error.js";
1
2
  import { type Result } from "../_utils/result.js";
2
- declare const search: (query: string) => Promise<Result<void, {
3
- code: number;
4
- message: string;
5
- }>>;
3
+ declare const search: (query: string) => Promise<Result<void, CliError>>;
6
4
  export { search };
@@ -1,8 +1,9 @@
1
+ import { cliErr } from "../_utils/cli-error.js";
1
2
  import { config } from "../_utils/config.js";
2
3
  import { readCredentials } from "../_utils/credentials.js";
3
4
  import { gitContext } from "../_utils/git-context.js";
4
5
  import { buildGlenHeaders } from "../_utils/glen-headers.js";
5
- import { httpJson } from "../_utils/http.js";
6
+ import { httpJson, networkRemedy } from "../_utils/http.js";
6
7
  import { err, ok } from "../_utils/result.js";
7
8
  import { readState } from "../_utils/state.js";
8
9
  import { handle426AndReexec, maybeSpawnBackgroundUpdate, } from "../_utils/update.js";
@@ -10,10 +11,13 @@ import { cliVersion } from "../_utils/version.js";
10
11
  const search = async (query) => {
11
12
  void maybeSpawnBackgroundUpdate();
12
13
  if (!query.trim())
13
- return err({ code: 2, message: 'usage: glen search "<query>"' });
14
+ return err(cliErr({
15
+ what: "missing search query",
16
+ remedy: 'usage: glen search "<query>"',
17
+ }));
14
18
  const creds = await readCredentials();
15
19
  if (!creds)
16
- return err({ code: 1, message: "glen: not connected run `glen login`." });
20
+ return err(cliErr({ what: "not connected", remedy: "run `glen login` first" }));
17
21
  const state = await readState();
18
22
  // Assemble additionalContext for search. Apply the empty-context rule: only
19
23
  // include when we have at least one non-empty group.
@@ -34,27 +38,32 @@ const search = async (query) => {
34
38
  timeoutMs: config.searchTimeoutMs,
35
39
  });
36
40
  if (!res.ok)
37
- return err({ code: 2, message: "glen search failed (network error)." });
41
+ return err(cliErr({
42
+ what: "glen search failed",
43
+ why: res.error.detail,
44
+ remedy: networkRemedy(res.error),
45
+ }));
38
46
  if (res.value.status === 426)
39
47
  handle426AndReexec(process.argv.slice(2));
40
48
  if (res.value.status === 401 || res.value.status === 403) {
41
49
  if (res.value.rawText.includes("no active organization")) {
42
- return err({
43
- code: 1,
44
- message: "No active organization. Run `glen org switch`.",
45
- });
50
+ return err(cliErr({
51
+ what: "no active organization",
52
+ remedy: "run `glen org switch`",
53
+ }));
46
54
  }
47
55
  // Don't clear credentials — a concurrent `glen login` may have just saved a fresh key.
48
- return err({
49
- code: 1,
50
- message: "glen: your connection expired — run `glen login` to reconnect.",
51
- });
56
+ return err(cliErr({
57
+ what: "your connection expired",
58
+ remedy: "run `glen login` to reconnect",
59
+ }));
52
60
  }
53
61
  if (!res.value.isOk)
54
- return err({
55
- code: 2,
56
- message: `glen search failed (HTTP ${res.value.status}).`,
57
- });
62
+ return err(cliErr({
63
+ what: `glen search failed (HTTP ${res.value.status})`,
64
+ why: res.value.rawText.slice(0, 200) || `HTTP ${res.value.status}`,
65
+ remedy: "try again in a minute — if it persists, check https://tryglen.com/status",
66
+ }));
58
67
  const context = res.value.json?.context;
59
68
  process.stdout.write(typeof context === "string" && context.trim()
60
69
  ? `${context}\n`
@@ -1 +1 @@
1
- {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/commands/search.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/commands/search.ts"],"names":[],"mappings":"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"}
@@ -8,11 +8,14 @@
8
8
  * Behavior:
9
9
  * 1. Spawn a detached `glen doctor --auto` (background maintenance; never blocks).
10
10
  * 2. Read stdin (SessionStart event JSON, parsed defensively — tolerate garbage).
11
- * 3. Read local session state.
11
+ * 3. Read local credentials + session state.
12
12
  * 4. Write ONE JSON object to stdout:
13
- * - state exists → hookSpecificOutput.additionalContext = formatStateLine(state)
13
+ * - creds + state → hookSpecificOutput.additionalContext = formatStateLine(state)
14
14
  * + systemMessage at top level when incognito is ON
15
- * - no state hookSpecificOutput.additionalContext = "[glen] not connectedrun `glen login`"
15
+ * - no creds → "[glen] not set up on this machine ask the user whether
16
+ * to set up glen, then use the glen-setup skill."
17
+ * - creds, no org → "[glen] no org selected — ask the user whether to set up
18
+ * glen, then use the glen-setup skill."
16
19
  * 5. Always exit 0 — this hook must never block a session.
17
20
  */
18
21
  declare const sessionStart: () => Promise<void>;
@@ -1,9 +1,12 @@
1
1
  import { spawn } from "node:child_process";
2
+ import { readCredentials } from "../_utils/credentials.js";
2
3
  import { formatStateLine } from "../_utils/state-line.js";
3
4
  import { readState } from "../_utils/state.js";
4
5
  // Reads stdin defensively (SessionStart hook event — parse lenient; may be empty
5
6
  // or invalid and we must still work).
6
7
  const readStdin = async () => {
8
+ if (process.stdin.isTTY)
9
+ return ""; // manual run in a terminal — don't hang
7
10
  const chunks = [];
8
11
  for await (const chunk of process.stdin)
9
12
  chunks.push(chunk);
@@ -34,11 +37,14 @@ const spawnDoctorAuto = () => {
34
37
  * Behavior:
35
38
  * 1. Spawn a detached `glen doctor --auto` (background maintenance; never blocks).
36
39
  * 2. Read stdin (SessionStart event JSON, parsed defensively — tolerate garbage).
37
- * 3. Read local session state.
40
+ * 3. Read local credentials + session state.
38
41
  * 4. Write ONE JSON object to stdout:
39
- * - state exists → hookSpecificOutput.additionalContext = formatStateLine(state)
42
+ * - creds + state → hookSpecificOutput.additionalContext = formatStateLine(state)
40
43
  * + systemMessage at top level when incognito is ON
41
- * - no state hookSpecificOutput.additionalContext = "[glen] not connectedrun `glen login`"
44
+ * - no creds → "[glen] not set up on this machine ask the user whether
45
+ * to set up glen, then use the glen-setup skill."
46
+ * - creds, no org → "[glen] no org selected — ask the user whether to set up
47
+ * glen, then use the glen-setup skill."
42
48
  * 5. Always exit 0 — this hook must never block a session.
43
49
  */
44
50
  const sessionStart = async () => {
@@ -53,10 +59,14 @@ const sessionStart = async () => {
53
59
  catch {
54
60
  // Tolerate stdin errors — the hook must always produce output.
55
61
  }
62
+ const credentials = await readCredentials();
56
63
  const state = await readState();
57
- const additionalContext = state
58
- ? (formatStateLine(state) ?? "[glen] not connected — run `glen login`")
59
- : "[glen] not connectedrun `glen login`";
64
+ const noOrgHint = "[glen] no org selected — ask the user whether to set up glen, then use the glen-setup skill.";
65
+ const additionalContext = !credentials
66
+ ? "[glen] not set up on this machine ask the user whether to set up glen, then use the glen-setup skill."
67
+ : state
68
+ ? (formatStateLine(state) ?? noOrgHint)
69
+ : noOrgHint;
60
70
  const output = {
61
71
  hookSpecificOutput: {
62
72
  hookEventName: "SessionStart",
@@ -1 +1 @@
1
- {"version":3,"file":"session-start.js","sourceRoot":"","sources":["../../src/commands/session-start.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAE/C,iFAAiF;AACjF,sCAAsC;AACtC,MAAM,SAAS,GAAG,KAAK,IAAqB,EAAE;IAC5C,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,OAAO,CAAC,KAAK;QAAE,MAAM,CAAC,IAAI,CAAC,KAAe,CAAC,CAAC;IACtE,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AAChD,CAAC,CAAC;AAEF,2EAA2E;AAC3E,+EAA+E;AAC/E,4EAA4E;AAC5E,MAAM,eAAe,GAAG,GAAS,EAAE;IACjC,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,KAAK,CACb,OAAO,CAAC,QAAQ,EAChB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAC/C,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,CACpC,CAAC;QACF,CAAC,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YACjB,iBAAiB;QACnB,CAAC,CAAC,CAAC;QACH,CAAC,CAAC,KAAK,EAAE,CAAC;IACZ,CAAC;IAAC,MAAM,CAAC;QACP,0DAA0D;IAC5D,CAAC;AACH,CAAC,CAAC;AAEF;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,YAAY,GAAG,KAAK,IAAmB,EAAE;IAC7C,wEAAwE;IACxE,wEAAwE;IACxE,8BAA8B;IAC9B,eAAe,EAAE,CAAC;IAElB,8DAA8D;IAC9D,IAAI,CAAC;QACH,MAAM,SAAS,EAAE,CAAC;IACpB,CAAC;IAAC,MAAM,CAAC;QACP,+DAA+D;IACjE,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,SAAS,EAAE,CAAC;IAEhC,MAAM,iBAAiB,GAAG,KAAK;QAC7B,CAAC,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,yCAAyC,CAAC;QACvE,CAAC,CAAC,yCAAyC,CAAC;IAU9C,MAAM,MAAM,GAAuB;QACjC,kBAAkB,EAAE;YAClB,aAAa,EAAE,cAAc;YAC7B,iBAAiB;SAClB;QACD,GAAG,CAAC,KAAK,EAAE,SAAS;YAClB,CAAC,CAAC;gBACE,aAAa,EACX,uFAAuF;aAC1F;YACH,CAAC,CAAC,EAAE,CAAC;KACR,CAAC;IAEF,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;AAC/C,CAAC,CAAC;AAEF,OAAO,EAAE,YAAY,EAAE,CAAC"}
1
+ {"version":3,"file":"session-start.js","sourceRoot":"","sources":["../../src/commands/session-start.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAE/C,iFAAiF;AACjF,sCAAsC;AACtC,MAAM,SAAS,GAAG,KAAK,IAAqB,EAAE;IAC5C,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK;QAAE,OAAO,EAAE,CAAC,CAAC,wCAAwC;IAC5E,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,OAAO,CAAC,KAAK;QAAE,MAAM,CAAC,IAAI,CAAC,KAAe,CAAC,CAAC;IACtE,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AAChD,CAAC,CAAC;AAEF,2EAA2E;AAC3E,+EAA+E;AAC/E,4EAA4E;AAC5E,MAAM,eAAe,GAAG,GAAS,EAAE;IACjC,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,KAAK,CACb,OAAO,CAAC,QAAQ,EAChB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAC/C,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,CACpC,CAAC;QACF,CAAC,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YACjB,iBAAiB;QACnB,CAAC,CAAC,CAAC;QACH,CAAC,CAAC,KAAK,EAAE,CAAC;IACZ,CAAC;IAAC,MAAM,CAAC;QACP,0DAA0D;IAC5D,CAAC;AACH,CAAC,CAAC;AAEF;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,YAAY,GAAG,KAAK,IAAmB,EAAE;IAC7C,wEAAwE;IACxE,wEAAwE;IACxE,8BAA8B;IAC9B,eAAe,EAAE,CAAC;IAElB,8DAA8D;IAC9D,IAAI,CAAC;QACH,MAAM,SAAS,EAAE,CAAC;IACpB,CAAC;IAAC,MAAM,CAAC;QACP,+DAA+D;IACjE,CAAC;IAED,MAAM,WAAW,GAAG,MAAM,eAAe,EAAE,CAAC;IAC5C,MAAM,KAAK,GAAG,MAAM,SAAS,EAAE,CAAC;IAEhC,MAAM,SAAS,GACb,8FAA8F,CAAC;IACjG,MAAM,iBAAiB,GAAG,CAAC,WAAW;QACpC,CAAC,CAAC,yGAAyG;QAC3G,CAAC,CAAC,KAAK;YACL,CAAC,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,SAAS,CAAC;YACvC,CAAC,CAAC,SAAS,CAAC;IAUhB,MAAM,MAAM,GAAuB;QACjC,kBAAkB,EAAE;YAClB,aAAa,EAAE,cAAc;YAC7B,iBAAiB;SAClB;QACD,GAAG,CAAC,KAAK,EAAE,SAAS;YAClB,CAAC,CAAC;gBACE,aAAa,EACX,uFAAuF;aAC1F;YACH,CAAC,CAAC,EAAE,CAAC;KACR,CAAC;IAEF,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;AAC/C,CAAC,CAAC;AAEF,OAAO,EAAE,YAAY,EAAE,CAAC"}
@@ -1,3 +1,4 @@
1
+ import type { CliError } from "../_utils/cli-error.js";
1
2
  import { type Result } from "../_utils/result.js";
2
- declare const status: () => Promise<Result<void, string>>;
3
+ declare const status: () => Promise<Result<void, CliError>>;
3
4
  export { status };
@@ -1 +1 @@
1
- {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAAe,EAAE,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAElD,MAAM,MAAM,GAAG,KAAK,IAAmC,EAAE;IACvD,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,eAAe,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;IAE3E,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,UAAU,IAAI,CAAC,CAAC;IAEjD,IAAI,KAAK,EAAE,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,GAAG,EAAE,CAAC;QAC1C,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,sCAAsC,MAAM,CAAC,OAAO,IAAI,CACzD,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,yDAAyD,MAAM,CAAC,OAAO,IAAI,CAC5E,CAAC;QACF,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,UAAU,KAAK,CAAC,aAAa,IAAI,KAAK,CAAC,WAAW,GAAG,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,CAChH,CAAC;YACF,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,gBAAgB,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;QAC3E,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,uCAAuC,CAAC,CAAC;QAChE,CAAC;QACD,OAAO,EAAE,CAAC,SAAS,CAAC,CAAC;IACvB,CAAC;IAED,IAAI,KAAK,EAAE,CAAC;QACV,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,UAAU,KAAK,CAAC,aAAa,IAAI,KAAK,CAAC,WAAW,GAAG,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,CAChH,CAAC;QACF,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,gBAAgB,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;IAC3E,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,uCAAuC,CAAC,CAAC;IAChE,CAAC;IAED,OAAO,EAAE,CAAC,SAAS,CAAC,CAAC;AACvB,CAAC,CAAC;AAEF,OAAO,EAAE,MAAM,EAAE,CAAC"}
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAAe,EAAE,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAElD,MAAM,MAAM,GAAG,KAAK,IAAqC,EAAE;IACzD,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,eAAe,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;IAE3E,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,UAAU,IAAI,CAAC,CAAC;IAEjD,IAAI,KAAK,EAAE,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,GAAG,EAAE,CAAC;QAC1C,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,sCAAsC,MAAM,CAAC,OAAO,IAAI,CACzD,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,yDAAyD,MAAM,CAAC,OAAO,IAAI,CAC5E,CAAC;QACF,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,UAAU,KAAK,CAAC,aAAa,IAAI,KAAK,CAAC,WAAW,GAAG,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,CAChH,CAAC;YACF,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,gBAAgB,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;QAC3E,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,uCAAuC,CAAC,CAAC;QAChE,CAAC;QACD,OAAO,EAAE,CAAC,SAAS,CAAC,CAAC;IACvB,CAAC;IAED,IAAI,KAAK,EAAE,CAAC;QACV,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,UAAU,KAAK,CAAC,aAAa,IAAI,KAAK,CAAC,WAAW,GAAG,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,CAChH,CAAC;QACF,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,gBAAgB,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;IAC3E,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,uCAAuC,CAAC,CAAC;IAChE,CAAC;IAED,OAAO,EAAE,CAAC,SAAS,CAAC,CAAC;AACvB,CAAC,CAAC;AAEF,OAAO,EAAE,MAAM,EAAE,CAAC"}
@@ -2,12 +2,14 @@
2
2
  * `glen statusline` — called by the agent's status-line hook.
3
3
  *
4
4
  * Reads stdin (Claude Code statusline JSON payload; parsed defensively, currently
5
- * unused — reserved for future enrichment). Reads local session state. Outputs a
6
- * single line to stdout and always exits 0 so it never breaks the host UI.
5
+ * unused — reserved for future enrichment). Reads local credentials + session
6
+ * state. Outputs a single line to stdout and always exits 0 so it never breaks
7
+ * the host UI.
7
8
  *
8
- * Output:
9
- * state + org → 🏔️ <slug|name|id>[ · incognito]
10
- * no state → 🏔️ glen — run `glen org switch`
9
+ * Output (org slugs are auto-generated — the NAME is the human-meaningful field):
10
+ * creds + state → 🏔️ <name|slug|id>[ · 🕶️ incognito]
11
+ * no creds → 🏔️ glen — not connected · ask me to "set up glen"
12
+ * creds, no org → 🏔️ glen — no org selected · ask me to "set up glen"
11
13
  */
12
14
  declare const statusline: () => Promise<void>;
13
15
  export { statusline };
@@ -1,6 +1,9 @@
1
+ import { readCredentials } from "../_utils/credentials.js";
1
2
  import { readState } from "../_utils/state.js";
2
3
  // Reads stdin defensively (Claude Code statusline JSON — parse lenient, v1 ignores fields).
3
4
  const readStdin = async () => {
5
+ if (process.stdin.isTTY)
6
+ return ""; // manual run in a terminal — don't hang
4
7
  const chunks = [];
5
8
  for await (const chunk of process.stdin)
6
9
  chunks.push(chunk);
@@ -10,12 +13,14 @@ const readStdin = async () => {
10
13
  * `glen statusline` — called by the agent's status-line hook.
11
14
  *
12
15
  * Reads stdin (Claude Code statusline JSON payload; parsed defensively, currently
13
- * unused — reserved for future enrichment). Reads local session state. Outputs a
14
- * single line to stdout and always exits 0 so it never breaks the host UI.
16
+ * unused — reserved for future enrichment). Reads local credentials + session
17
+ * state. Outputs a single line to stdout and always exits 0 so it never breaks
18
+ * the host UI.
15
19
  *
16
- * Output:
17
- * state + org → 🏔️ <slug|name|id>[ · incognito]
18
- * no state → 🏔️ glen — run `glen org switch`
20
+ * Output (org slugs are auto-generated — the NAME is the human-meaningful field):
21
+ * creds + state → 🏔️ <name|slug|id>[ · 🕶️ incognito]
22
+ * no creds → 🏔️ glen — not connected · ask me to "set up glen"
23
+ * creds, no org → 🏔️ glen — no org selected · ask me to "set up glen"
19
24
  */
20
25
  const statusline = async () => {
21
26
  // Drain stdin before doing anything else (hook may pipe data to us).
@@ -25,12 +30,17 @@ const statusline = async () => {
25
30
  catch {
26
31
  // Ignore stdin errors — the statusline must always produce output.
27
32
  }
33
+ const credentials = await readCredentials();
28
34
  const state = await readState();
29
35
  const line = (() => {
36
+ if (!credentials)
37
+ return '🏔️ glen — not connected · ask me to "set up glen"';
30
38
  if (!state)
31
- return "🏔️ glen — run `glen org switch`";
32
- const slug = state.activeOrgSlug ?? state.activeOrgName ?? state.activeOrgId;
33
- return state.incognito ? `🏔️ ${slug} · incognito` : `🏔️ ${slug}`;
39
+ return '🏔️ glen — no org selected · ask me to "set up glen"';
40
+ const orgDisplay = state.activeOrgName ?? state.activeOrgSlug ?? state.activeOrgId;
41
+ return state.incognito
42
+ ? `🏔️ ${orgDisplay} · 🕶️ incognito`
43
+ : `🏔️ ${orgDisplay}`;
34
44
  })();
35
45
  process.stdout.write(line);
36
46
  };
@@ -1 +1 @@
1
- {"version":3,"file":"statusline.js","sourceRoot":"","sources":["../../src/commands/statusline.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAE/C,4FAA4F;AAC5F,MAAM,SAAS,GAAG,KAAK,IAAqB,EAAE;IAC5C,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,OAAO,CAAC,KAAK;QAAE,MAAM,CAAC,IAAI,CAAC,KAAe,CAAC,CAAC;IACtE,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AAChD,CAAC,CAAC;AAEF;;;;;;;;;;GAUG;AACH,MAAM,UAAU,GAAG,KAAK,IAAmB,EAAE;IAC3C,qEAAqE;IACrE,IAAI,CAAC;QACH,MAAM,SAAS,EAAE,CAAC;IACpB,CAAC;IAAC,MAAM,CAAC;QACP,mEAAmE;IACrE,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,SAAS,EAAE,CAAC;IAEhC,MAAM,IAAI,GAAG,CAAC,GAAG,EAAE;QACjB,IAAI,CAAC,KAAK;YAAE,OAAO,kCAAkC,CAAC;QACtD,MAAM,IAAI,GACR,KAAK,CAAC,aAAa,IAAI,KAAK,CAAC,aAAa,IAAI,KAAK,CAAC,WAAW,CAAC;QAClE,OAAO,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,IAAI,cAAc,CAAC,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC;IACrE,CAAC,CAAC,EAAE,CAAC;IAEL,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AAC7B,CAAC,CAAC;AAEF,OAAO,EAAE,UAAU,EAAE,CAAC"}
1
+ {"version":3,"file":"statusline.js","sourceRoot":"","sources":["../../src/commands/statusline.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAE/C,4FAA4F;AAC5F,MAAM,SAAS,GAAG,KAAK,IAAqB,EAAE;IAC5C,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK;QAAE,OAAO,EAAE,CAAC,CAAC,wCAAwC;IAC5E,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,OAAO,CAAC,KAAK;QAAE,MAAM,CAAC,IAAI,CAAC,KAAe,CAAC,CAAC;IACtE,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AAChD,CAAC,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,GAAG,KAAK,IAAmB,EAAE;IAC3C,qEAAqE;IACrE,IAAI,CAAC;QACH,MAAM,SAAS,EAAE,CAAC;IACpB,CAAC;IAAC,MAAM,CAAC;QACP,mEAAmE;IACrE,CAAC;IAED,MAAM,WAAW,GAAG,MAAM,eAAe,EAAE,CAAC;IAC5C,MAAM,KAAK,GAAG,MAAM,SAAS,EAAE,CAAC;IAEhC,MAAM,IAAI,GAAG,CAAC,GAAG,EAAE;QACjB,IAAI,CAAC,WAAW;YAAE,OAAO,oDAAoD,CAAC;QAC9E,IAAI,CAAC,KAAK;YAAE,OAAO,sDAAsD,CAAC;QAC1E,MAAM,UAAU,GACd,KAAK,CAAC,aAAa,IAAI,KAAK,CAAC,aAAa,IAAI,KAAK,CAAC,WAAW,CAAC;QAClE,OAAO,KAAK,CAAC,SAAS;YACpB,CAAC,CAAC,OAAO,UAAU,kBAAkB;YACrC,CAAC,CAAC,OAAO,UAAU,EAAE,CAAC;IAC1B,CAAC,CAAC,EAAE,CAAC;IAEL,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AAC7B,CAAC,CAAC;AAEF,OAAO,EAAE,UAAU,EAAE,CAAC"}
@@ -1,3 +1,4 @@
1
+ import { type CliError } from "../_utils/cli-error.js";
1
2
  import { type Result } from "../_utils/result.js";
2
3
  /**
3
4
  * `glen uninstall`
@@ -7,5 +8,5 @@ import { type Result } from "../_utils/result.js";
7
8
  * blocks, clears the install marker. Other tools' hooks are untouched.
8
9
  * Plugin removal itself stays with the agents' own CLIs (printed below).
9
10
  */
10
- declare const uninstall: () => Promise<Result<void, string>>;
11
+ declare const uninstall: () => Promise<Result<void, CliError>>;
11
12
  export { uninstall };
@@ -1,5 +1,6 @@
1
+ import { cliErr } from "../_utils/cli-error.js";
1
2
  import { isCodexHooksInstalled, uninstallCodexHooks, } from "../_utils/codex-hooks-setup.js";
2
- import { ok } from "../_utils/result.js";
3
+ import { err, ok } from "../_utils/result.js";
3
4
  import { isInstalled } from "../_utils/which.js";
4
5
  /**
5
6
  * `glen uninstall`
@@ -16,8 +17,12 @@ const uninstall = async () => {
16
17
  process.stdout.write(" Removing glen hooks from Codex's user config layer... ");
17
18
  const r = await uninstallCodexHooks();
18
19
  if (!r.ok) {
19
- process.stdout.write(`✗\n ${r.error}\n`);
20
- return r;
20
+ process.stdout.write("✗\n");
21
+ return err(cliErr({
22
+ what: "could not remove codex hooks",
23
+ why: r.error,
24
+ remedy: "re-run `glen uninstall`; if it persists remove the glen entries from ~/.codex/hooks.json manually",
25
+ }));
21
26
  }
22
27
  process.stdout.write("✓\n");
23
28
  process.stdout.write(" Note: Codex trust keys are positional — if other tools registered\n" +
@@ -1 +1 @@
1
- {"version":3,"file":"uninstall.js","sourceRoot":"","sources":["../../src/commands/uninstall.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,mBAAmB,GACpB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAe,EAAE,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD;;;;;;;GAOG;AACH,MAAM,SAAS,GAAG,KAAK,IAAmC,EAAE;IAC1D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAErD,MAAM,iBAAiB,GAAG,MAAM,qBAAqB,EAAE,CAAC;IACxD,IAAI,iBAAiB,EAAE,CAAC;QACtB,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,0DAA0D,CAC3D,CAAC;QACF,MAAM,CAAC,GAAG,MAAM,mBAAmB,EAAE,CAAC;QACtC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;YACV,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;YAC1C,OAAO,CAAC,CAAC;QACX,CAAC;QACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC5B,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,uEAAuE;YACrE,0DAA0D,CAC7D,CAAC;IACJ,CAAC;IAED,MAAM,cAAc,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;IAC5C,MAAM,eAAe,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;IAC9C,IAAI,cAAc,IAAI,eAAe,EAAE,CAAC;QACtC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,yCAAyC,CAAC,CAAC;QAChE,IAAI,cAAc,EAAE,CAAC;YACnB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;QACzD,CAAC;QACD,IAAI,eAAe,EAAE,CAAC;YACpB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,yCAAyC,CAAC,CAAC;QAClE,CAAC;IACH,CAAC;IACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,wFAAwF,CACzF,CAAC;IACF,OAAO,EAAE,CAAC,SAAS,CAAC,CAAC;AACvB,CAAC,CAAC;AAEF,OAAO,EAAE,SAAS,EAAE,CAAC"}
1
+ {"version":3,"file":"uninstall.js","sourceRoot":"","sources":["../../src/commands/uninstall.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,EACL,qBAAqB,EACrB,mBAAmB,GACpB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAe,GAAG,EAAE,EAAE,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD;;;;;;;GAOG;AACH,MAAM,SAAS,GAAG,KAAK,IAAqC,EAAE;IAC5D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAErD,MAAM,iBAAiB,GAAG,MAAM,qBAAqB,EAAE,CAAC;IACxD,IAAI,iBAAiB,EAAE,CAAC;QACtB,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,0DAA0D,CAC3D,CAAC;QACF,MAAM,CAAC,GAAG,MAAM,mBAAmB,EAAE,CAAC;QACtC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;YACV,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAC5B,OAAO,GAAG,CACR,MAAM,CAAC;gBACL,IAAI,EAAE,8BAA8B;gBACpC,GAAG,EAAE,CAAC,CAAC,KAAK;gBACZ,MAAM,EACJ,mGAAmG;aACtG,CAAC,CACH,CAAC;QACJ,CAAC;QACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC5B,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,uEAAuE;YACrE,0DAA0D,CAC7D,CAAC;IACJ,CAAC;IAED,MAAM,cAAc,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;IAC5C,MAAM,eAAe,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;IAC9C,IAAI,cAAc,IAAI,eAAe,EAAE,CAAC;QACtC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,yCAAyC,CAAC,CAAC;QAChE,IAAI,cAAc,EAAE,CAAC;YACnB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;QACzD,CAAC;QACD,IAAI,eAAe,EAAE,CAAC;YACpB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,yCAAyC,CAAC,CAAC;QAClE,CAAC;IACH,CAAC;IACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,wFAAwF,CACzF,CAAC;IACF,OAAO,EAAE,CAAC,SAAS,CAAC,CAAC;AACvB,CAAC,CAAC;AAEF,OAAO,EAAE,SAAS,EAAE,CAAC"}
@@ -1,7 +1,14 @@
1
+ import { type CliError } from "../_utils/cli-error.js";
1
2
  import { type Result } from "../_utils/result.js";
2
3
  /**
3
- * `glen update` — checks for a newer version and installs it if the CLI was
4
- * installed globally via npm. Prints before/after version info.
4
+ * `glen update` — converge: self-update the CLI (npm-global installs), then
5
+ * run the update steps for every agent whose glen plugin is already
6
+ * installed, then re-verify the codex user-layer hooks.
7
+ *
8
+ * The plugin section intentionally runs in the OLD-version process after a
9
+ * self-update — the plugin update commands are stable agent CLIs, and
10
+ * re-exec'ing mid-command would lose the printed context. A failed
11
+ * self-update returns immediately, skipping the plugin section.
5
12
  */
6
- declare const update: () => Promise<Result<void, string>>;
13
+ declare const update: () => Promise<Result<void, CliError>>;
7
14
  export { update };
@@ -1,11 +1,22 @@
1
- import { ok } from "../_utils/result.js";
2
- import { fetchLatest, isNpmGlobalInstall, runSelfUpdate, } from "../_utils/update.js";
1
+ import { AGENTS } from "../_utils/agents-table.js";
2
+ import { cliErr } from "../_utils/cli-error.js";
3
+ import { installCodexHooks, isCodexHooksInstalled, } from "../_utils/codex-hooks-setup.js";
4
+ import { findBin } from "../_utils/find-bin.js";
5
+ import { glenPluginStatus } from "../_utils/plugin-status.js";
6
+ import { err, ok } from "../_utils/result.js";
7
+ import { runBin } from "../_utils/run-bin.js";
8
+ import { fetchLatest, isNpmGlobalInstall, lockPath, newer, runSelfUpdate, } from "../_utils/update.js";
3
9
  import { cliVersion } from "../_utils/version.js";
4
- /**
5
- * `glen update` checks for a newer version and installs it if the CLI was
6
- * installed globally via npm. Prints before/after version info.
7
- */
8
- const update = async () => {
10
+ // Step label: last two args make a readable name ("update glen@glen",
11
+ // "marketplace upgrade glen")same convention as install.ts.
12
+ const stepLabel = (step) => step.slice(1).join(" ");
13
+ // ---------------------------------------------------------------------------
14
+ // CLI self-update same logic + CliError mappings as before. Non-error
15
+ // outcomes (registry unreachable, already current, not npm-global) are info,
16
+ // not failures; a failed self-update IS a failure: it returns a CliError
17
+ // (locked / npm-failed) that bin.ts prints via formatCliError and exits 1.
18
+ // ---------------------------------------------------------------------------
19
+ const updateCli = async () => {
9
20
  process.stdout.write(`Current version: ${cliVersion}\n`);
10
21
  const latest = await fetchLatest();
11
22
  if (!latest) {
@@ -13,7 +24,9 @@ const update = async () => {
13
24
  return ok(undefined);
14
25
  }
15
26
  process.stdout.write(`Latest version: ${latest}\n`);
16
- if (latest === cliVersion) {
27
+ // `newer` (not `===`) — a locally-newer dev build must not "update"
28
+ // (downgrade) to the older registry version.
29
+ if (!newer(latest, cliVersion)) {
17
30
  process.stdout.write("Already up to date.\n");
18
31
  return ok(undefined);
19
32
  }
@@ -23,12 +36,98 @@ const update = async () => {
23
36
  }
24
37
  process.stdout.write(`Updating to v${latest}...\n`);
25
38
  const updated = runSelfUpdate();
26
- if (updated) {
27
- process.stdout.write(`Updated to v${latest}.\n`);
39
+ if (!updated.ok) {
40
+ if (updated.reason === "locked") {
41
+ return err(cliErr({
42
+ what: "another update appears to be in progress",
43
+ path: lockPath(),
44
+ remedy: `if no update is running, delete the lock dir and retry: rm -rf ${lockPath()}`,
45
+ }));
46
+ }
47
+ return err(cliErr({
48
+ what: "npm install failed",
49
+ ...(updated.stderrTail ? { why: updated.stderrTail } : {}),
50
+ remedy: "run `npm i -g @tryglen/cli@latest` manually",
51
+ }));
28
52
  }
29
- else {
30
- process.stdout.write("Update failed or another update is already in progress. Try: npm i -g @tryglen/cli@latest\n");
53
+ process.stdout.write(`Updated to v${latest}.\n`);
54
+ return ok(undefined);
55
+ };
56
+ // ---------------------------------------------------------------------------
57
+ // Plugin converge — runs an agent's updateSteps when (and only when) the glen
58
+ // plugin is already installed for it. `glen update` NEVER installs a plugin;
59
+ // that's `glen install`'s job.
60
+ // ---------------------------------------------------------------------------
61
+ const updateAgentPlugin = (agent, resolvedBin) => {
62
+ process.stdout.write(` Updating ${agent.name} plugin:\n`);
63
+ const results = [];
64
+ for (const step of agent.updateSteps) {
65
+ const label = stepLabel(step);
66
+ const r = runBin(resolvedBin, step);
67
+ if (r.ok) {
68
+ process.stdout.write(` ${label}... ✓\n`);
69
+ results.push(true);
70
+ }
71
+ else {
72
+ const cause = r.error.stderrTail || r.error.spawnError || `exit ${r.error.code}`;
73
+ process.stdout.write(` ${label}... ✗ ${cause}\n`);
74
+ process.stdout.write(` → run \`${agent.bin} ${step.join(" ")}\` manually to see the full error\n`);
75
+ results.push(false);
76
+ }
77
+ }
78
+ return results;
79
+ };
80
+ // Re-verify the codex user-layer hooks, but only when the install marker says
81
+ // glen registered them before — Claude-only users never get codex config
82
+ // written. installCodexHooks is idempotent (re-merge + re-trust).
83
+ const reverifyCodexHooks = async () => {
84
+ if (!(await isCodexHooksInstalled()))
85
+ return [];
86
+ const r = await installCodexHooks();
87
+ if (r.ok) {
88
+ if (!r.value.trusted) {
89
+ // Registered but untrusted hooks are silently skipped by Codex — surface
90
+ // it as a warning with the manual re-trust step.
91
+ process.stdout.write(" codex hooks: ⚠ registered but not trusted — open Codex, run /hooks, and trust the glen hooks\n");
92
+ return [false];
93
+ }
94
+ process.stdout.write(" codex hooks: ✓ re-verified\n");
95
+ return [true];
31
96
  }
97
+ process.stdout.write(` codex hooks: ✗ ${r.error}\n → run \`glen install --agent codex\`\n`);
98
+ return [false];
99
+ };
100
+ const updatePlugins = async () => {
101
+ const results = [];
102
+ for (const agent of AGENTS) {
103
+ const resolvedBin = findBin(agent.bin);
104
+ if (resolvedBin === null || glenPluginStatus(agent.bin) !== "installed") {
105
+ process.stdout.write(` ${agent.bin}: skipped (plugin not installed)\n`);
106
+ continue;
107
+ }
108
+ results.push(...updateAgentPlugin(agent, resolvedBin));
109
+ }
110
+ results.push(...(await reverifyCodexHooks()));
111
+ process.stdout.write(results.every(Boolean)
112
+ ? "\nEverything up to date.\n"
113
+ : "\nDone, with warnings above — fix them before relying on glen memory.\n");
114
+ };
115
+ /**
116
+ * `glen update` — converge: self-update the CLI (npm-global installs), then
117
+ * run the update steps for every agent whose glen plugin is already
118
+ * installed, then re-verify the codex user-layer hooks.
119
+ *
120
+ * The plugin section intentionally runs in the OLD-version process after a
121
+ * self-update — the plugin update commands are stable agent CLIs, and
122
+ * re-exec'ing mid-command would lose the printed context. A failed
123
+ * self-update returns immediately, skipping the plugin section.
124
+ */
125
+ const update = async () => {
126
+ const self = await updateCli();
127
+ if (!self.ok)
128
+ return self;
129
+ process.stdout.write("\n");
130
+ await updatePlugins();
32
131
  return ok(undefined);
33
132
  };
34
133
  export { update };
@@ -1 +1 @@
1
- {"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,EAAE,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EACL,WAAW,EACX,kBAAkB,EAClB,aAAa,GACd,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAElD;;;GAGG;AACH,MAAM,MAAM,GAAG,KAAK,IAAmC,EAAE;IACvD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,oBAAoB,UAAU,IAAI,CAAC,CAAC;IAEzD,MAAM,MAAM,GAAG,MAAM,WAAW,EAAE,CAAC;IACnC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,wDAAwD,CACzD,CAAC;QACF,OAAO,EAAE,CAAC,SAAS,CAAC,CAAC;IACvB,CAAC;IAED,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,oBAAoB,MAAM,IAAI,CAAC,CAAC;IAErD,IAAI,MAAM,KAAK,UAAU,EAAE,CAAC;QAC1B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;QAC9C,OAAO,EAAE,CAAC,SAAS,CAAC,CAAC;IACvB,CAAC;IAED,IAAI,CAAC,kBAAkB,EAAE,EAAE,CAAC;QAC1B,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,sBAAsB,MAAM,4EAA4E,CACzG,CAAC;QACF,OAAO,EAAE,CAAC,SAAS,CAAC,CAAC;IACvB,CAAC;IAED,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,gBAAgB,MAAM,OAAO,CAAC,CAAC;IACpD,MAAM,OAAO,GAAG,aAAa,EAAE,CAAC;IAChC,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,MAAM,KAAK,CAAC,CAAC;IACnD,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,6FAA6F,CAC9F,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,CAAC,SAAS,CAAC,CAAC;AACvB,CAAC,CAAC;AAEF,OAAO,EAAE,MAAM,EAAE,CAAC"}
1
+ {"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"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"}