@tryglen/cli 0.6.0 → 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.
@@ -15,11 +15,13 @@ type Outcome = {
15
15
  readonly hadExisting: boolean;
16
16
  };
17
17
  /**
18
- * Make sure a current `glen` binary is reachable on PATH, installing or
19
- * updating it globally via npm when it isn't. `npx @tryglen/cli install`
20
- * runs this CLI from npx's cache without ever linking a global binary —
21
- * without this step the plugins' hooks would have no `glen` to call and
22
- * silently do nothing.
18
+ * Make sure a current, PERSISTENT `glen` binary is reachable on PATH,
19
+ * installing or updating it globally via npm when it isn't. `npx
20
+ * @tryglen/cli install` runs this CLI from npx's transient cache without ever
21
+ * linking a global binary — without this step the plugins' hooks would have
22
+ * no `glen` to call and silently do nothing. We deliberately ignore npx's own
23
+ * ephemeral shim (see persistentGlenPath) so a fresh machine always gets a
24
+ * real global install.
23
25
  *
24
26
  * `onInstallStart(hadExisting)` fires just before the (slow) npm install so
25
27
  * the caller can print a progress line first.
@@ -3,10 +3,33 @@ import { join } from "node:path";
3
3
  import { newer } from "./update.js";
4
4
  import { cliVersion } from "./version.js";
5
5
  import { isInstalled } from "./which.js";
6
- /** Version of the `glen` already on PATH, or null when absent/unreadable. */
7
- const installedVersion = () => {
6
+ /**
7
+ * Path to a PERSISTENT global `glen` on PATH, or null when the only matches
8
+ * are npx's transient shims. `npx @tryglen/cli install` runs this CLI from
9
+ * `~/.npm/_npx/<hash>/…/glen`, which is on PATH *only* while npx is running —
10
+ * it vanishes on exit, leaving the agents' hooks (which call bare `glen`)
11
+ * with nothing to run. A naive `which glen` reports that doomed shim, so we
12
+ * list every PATH match with `which -a` and ignore the ephemeral npx ones.
13
+ */
14
+ const persistentGlenPath = () => {
15
+ try {
16
+ const out = execFileSync("which", ["-a", "glen"], {
17
+ encoding: "utf8",
18
+ timeout: 10_000,
19
+ });
20
+ return (out
21
+ .split("\n")
22
+ .map((line) => line.trim())
23
+ .find((line) => line.length > 0 && !line.includes("/_npx/")) ?? null);
24
+ }
25
+ catch {
26
+ return null;
27
+ }
28
+ };
29
+ /** Version reported by the `glen` at `glenPath`, or null when unreadable. */
30
+ const versionAt = (glenPath) => {
8
31
  try {
9
- const out = execFileSync("glen", ["--version"], {
32
+ const out = execFileSync(glenPath, ["--version"], {
10
33
  encoding: "utf8",
11
34
  timeout: 10_000,
12
35
  });
@@ -46,19 +69,21 @@ const installGlobally = () => {
46
69
  }
47
70
  };
48
71
  /**
49
- * Make sure a current `glen` binary is reachable on PATH, installing or
50
- * updating it globally via npm when it isn't. `npx @tryglen/cli install`
51
- * runs this CLI from npx's cache without ever linking a global binary —
52
- * without this step the plugins' hooks would have no `glen` to call and
53
- * silently do nothing.
72
+ * Make sure a current, PERSISTENT `glen` binary is reachable on PATH,
73
+ * installing or updating it globally via npm when it isn't. `npx
74
+ * @tryglen/cli install` runs this CLI from npx's transient cache without ever
75
+ * linking a global binary — without this step the plugins' hooks would have
76
+ * no `glen` to call and silently do nothing. We deliberately ignore npx's own
77
+ * ephemeral shim (see persistentGlenPath) so a fresh machine always gets a
78
+ * real global install.
54
79
  *
55
80
  * `onInstallStart(hadExisting)` fires just before the (slow) npm install so
56
81
  * the caller can print a progress line first.
57
82
  */
58
83
  const ensureGlobalCli = (onInstallStart) => {
59
- const hadExisting = isInstalled("glen");
60
- if (hadExisting) {
61
- const version = installedVersion();
84
+ const existing = persistentGlenPath();
85
+ if (existing) {
86
+ const version = versionAt(existing);
62
87
  // Up to date (or ahead, e.g. a dev build) — nothing to do. A stale or
63
88
  // unreadable version falls through to a reinstall.
64
89
  if (version && !newer(cliVersion, version))
@@ -66,17 +91,22 @@ const ensureGlobalCli = (onInstallStart) => {
66
91
  }
67
92
  if (!isInstalled("npm"))
68
93
  return { status: "no-npm" };
69
- onInstallStart?.(hadExisting);
94
+ onInstallStart?.(existing !== null);
70
95
  const result = installGlobally();
71
96
  if (!result.ok) {
72
- return { status: "failed", permission: result.permission, hadExisting };
97
+ return {
98
+ status: "failed",
99
+ permission: result.permission,
100
+ hadExisting: existing !== null,
101
+ };
73
102
  }
74
- if (hadExisting)
103
+ if (existing)
75
104
  return { status: "updated" };
76
- if (isInstalled("glen"))
105
+ // Re-probe: npm linked the binary; is a persistent (non-npx) glen now on PATH?
106
+ if (persistentGlenPath() !== null)
77
107
  return { status: "installed" };
78
- // npm succeeded but `glen` still doesn't resolve: the global bin dir is
79
- // not on PATH (common with version managers / fresh Homebrew node).
108
+ // npm succeeded but `glen` still doesn't resolve persistently: the global
109
+ // bin dir is not on PATH (common with version managers / fresh Homebrew node).
80
110
  return { status: "path-missing", binDir: npmGlobalBinDir() };
81
111
  };
82
112
  export { ensureGlobalCli };
@@ -1 +1 @@
1
- {"version":3,"file":"ensure-global-cli.js","sourceRoot":"","sources":["../../src/_utils/ensure-global-cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ensure-global-cli.js","sourceRoot":"","sources":["../../src/_utils/ensure-global-cli.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tryglen/cli",
3
- "version": "0.6.0",
3
+ "version": "0.6.1",
4
4
  "description": "Glen CLI — memory for coding agents",
5
5
  "type": "module",
6
6
  "bin": {