@ironbee-ai/cli 0.8.0 → 0.8.2

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/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.8.2 (2026-05-08)
4
+
5
+ ### Features
6
+
7
+ * **update:** warn on prefix mismatch and PATH shadow before installing ([675a1f3](https://github.com/ironbee-ai/ironbee-cli/commit/675a1f3b62350dc5e78469f62568409e967c81a3))
8
+
9
+ ## 0.8.1 (2026-05-08)
10
+
11
+ ### Bug Fixes
12
+
13
+ * **ci:** bump release-npm to Node 22 + silence postinstall stderr noise ([ded3dbd](https://github.com/ironbee-ai/ironbee-cli/commit/ded3dbdfbe7447576ea6523d047eb5a55e669074))
14
+
3
15
  ## 0.8.0 (2026-05-08)
4
16
 
5
17
  ## 0.7.3 (2026-05-07)
@@ -1,3 +1,26 @@
1
1
  import { Command } from "commander";
2
+ /**
3
+ * Walk up from a known module dir to the npm prefix it sits under.
4
+ * Returns null when the dir is not in a recognizable npm global layout
5
+ * (e.g. ts-node dev runs from src/, or local node_modules installs).
6
+ */
7
+ export declare function deriveInstallPrefix(dir: string): string | null;
8
+ export interface PrefixMismatch {
9
+ running: string;
10
+ npm: string;
11
+ }
12
+ export declare function detectPrefixMismatch(runningDir: string, npmPrefix: string | null): PrefixMismatch | null;
13
+ /**
14
+ * Derive the npm prefix from a binary path on PATH.
15
+ * - Unix: <prefix>/bin/<name> → prefix is the parent of the bin/ dir
16
+ * - Windows: <prefix>\<name>.cmd → prefix is the binary's directory
17
+ */
18
+ export declare function derivePrefixFromBinary(binaryPath: string): string | null;
19
+ export interface PathShadow {
20
+ shadowBinary: string;
21
+ shadowPrefix: string;
22
+ runningPrefix: string;
23
+ }
24
+ export declare function detectShadowOnPath(runningDir: string, firstPathBinary: string | null): PathShadow | null;
2
25
  export declare const updateCommand: Command;
3
26
  //# sourceMappingURL=update.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,eAAO,MAAM,aAAa,EAAE,OAiCtB,CAAC"}
1
+ {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAiB9D;AA4BD,MAAM,WAAW,cAAc;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,cAAc,GAAG,IAAI,CASxG;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CASxE;AA6BD,MAAM,WAAW,UAAU;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;CACzB;AAED,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,IAAI,GAAG,UAAU,GAAG,IAAI,CAaxG;AA+BD,eAAO,MAAM,aAAa,EAAE,OA4CtB,CAAC"}
@@ -1,10 +1,191 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
2
35
  Object.defineProperty(exports, "__esModule", { value: true });
3
36
  exports.updateCommand = void 0;
37
+ exports.deriveInstallPrefix = deriveInstallPrefix;
38
+ exports.detectPrefixMismatch = detectPrefixMismatch;
39
+ exports.derivePrefixFromBinary = derivePrefixFromBinary;
40
+ exports.detectShadowOnPath = detectShadowOnPath;
4
41
  const commander_1 = require("commander");
5
42
  const child_process_1 = require("child_process");
43
+ const fs_1 = require("fs");
44
+ const path = __importStar(require("path"));
6
45
  const output_1 = require("../lib/output");
7
46
  const version_1 = require("../lib/version");
47
+ /**
48
+ * Walk up from a known module dir to the npm prefix it sits under.
49
+ * Returns null when the dir is not in a recognizable npm global layout
50
+ * (e.g. ts-node dev runs from src/, or local node_modules installs).
51
+ */
52
+ function deriveInstallPrefix(dir) {
53
+ let cur = dir;
54
+ while (true) {
55
+ const parent = path.dirname(cur);
56
+ if (parent === cur) {
57
+ return null;
58
+ }
59
+ if (path.basename(cur) === "node_modules") {
60
+ // Unix global: <prefix>/lib/node_modules
61
+ // Windows global: <prefix>/node_modules
62
+ if (path.basename(parent) === "lib") {
63
+ return path.dirname(parent);
64
+ }
65
+ return parent;
66
+ }
67
+ cur = parent;
68
+ }
69
+ }
70
+ function getNpmConfiguredPrefix() {
71
+ try {
72
+ const out = (0, child_process_1.execSync)("npm config get prefix", {
73
+ encoding: "utf-8",
74
+ stdio: ["ignore", "pipe", "ignore"],
75
+ });
76
+ const trimmed = (out ?? "").toString().trim();
77
+ return trimmed.length > 0 ? trimmed : null;
78
+ }
79
+ catch {
80
+ return null;
81
+ }
82
+ }
83
+ function normalizeForCompare(p) {
84
+ let resolved;
85
+ try {
86
+ resolved = (0, fs_1.realpathSync)(p);
87
+ }
88
+ catch {
89
+ resolved = path.resolve(p);
90
+ }
91
+ while (resolved.length > 1 && (resolved.endsWith("/") || resolved.endsWith(path.sep))) {
92
+ resolved = resolved.slice(0, -1);
93
+ }
94
+ return process.platform === "win32" ? resolved.toLowerCase() : resolved;
95
+ }
96
+ function detectPrefixMismatch(runningDir, npmPrefix) {
97
+ const running = deriveInstallPrefix(runningDir);
98
+ if (!running || !npmPrefix) {
99
+ return null;
100
+ }
101
+ if (normalizeForCompare(running) === normalizeForCompare(npmPrefix)) {
102
+ return null;
103
+ }
104
+ return { running, npm: npmPrefix };
105
+ }
106
+ /**
107
+ * Derive the npm prefix from a binary path on PATH.
108
+ * - Unix: <prefix>/bin/<name> → prefix is the parent of the bin/ dir
109
+ * - Windows: <prefix>\<name>.cmd → prefix is the binary's directory
110
+ */
111
+ function derivePrefixFromBinary(binaryPath) {
112
+ if (!binaryPath) {
113
+ return null;
114
+ }
115
+ const dir = path.dirname(binaryPath);
116
+ if (process.platform !== "win32" && path.basename(dir) === "bin") {
117
+ return path.dirname(dir);
118
+ }
119
+ return dir;
120
+ }
121
+ function findFirstPathBinary(name) {
122
+ const pathEnv = process.env.PATH ?? "";
123
+ if (pathEnv.length === 0) {
124
+ return null;
125
+ }
126
+ const sep = process.platform === "win32" ? ";" : ":";
127
+ const dirs = pathEnv.split(sep);
128
+ const exts = process.platform === "win32"
129
+ ? (process.env.PATHEXT ?? ".COM;.EXE;.BAT;.CMD").split(";")
130
+ : [""];
131
+ for (const dir of dirs) {
132
+ if (dir.length === 0) {
133
+ continue;
134
+ }
135
+ for (const ext of exts) {
136
+ const candidate = path.join(dir, name + ext);
137
+ try {
138
+ (0, fs_1.accessSync)(candidate, fs_1.constants.X_OK);
139
+ return candidate;
140
+ }
141
+ catch {
142
+ // not found / not executable, keep searching
143
+ }
144
+ }
145
+ }
146
+ return null;
147
+ }
148
+ function detectShadowOnPath(runningDir, firstPathBinary) {
149
+ const runningPrefix = deriveInstallPrefix(runningDir);
150
+ if (!runningPrefix || !firstPathBinary) {
151
+ return null;
152
+ }
153
+ const shadowPrefix = derivePrefixFromBinary(firstPathBinary);
154
+ if (!shadowPrefix) {
155
+ return null;
156
+ }
157
+ if (normalizeForCompare(runningPrefix) === normalizeForCompare(shadowPrefix)) {
158
+ return null;
159
+ }
160
+ return { shadowBinary: firstPathBinary, shadowPrefix, runningPrefix };
161
+ }
162
+ function warnPathShadow(s) {
163
+ const removeCmd = process.platform === "win32"
164
+ ? `del "${s.shadowBinary}"`
165
+ : `rm "${s.shadowBinary}"`;
166
+ output_1.log.blank();
167
+ output_1.log.warn(output_1.pc.bold("Another IronBee install is earlier on your PATH"));
168
+ output_1.log.warn(` PATH-resolved binary: ${output_1.pc.cyan(s.shadowBinary)}`);
169
+ output_1.log.warn(` This update is for: ${output_1.pc.cyan(s.runningPrefix)}`);
170
+ output_1.log.warn("After install, your shell will keep resolving the OLDER one.");
171
+ output_1.log.warn("To fix, either:");
172
+ output_1.log.warn(` 1) Remove the shadow: ${output_1.pc.cyan(removeCmd)}`);
173
+ output_1.log.warn(" 2) Or install to the shadow's location:");
174
+ output_1.log.warn(` ${output_1.pc.cyan(`npm install -g --prefix "${s.shadowPrefix}" @ironbee-ai/cli@latest`)}`);
175
+ output_1.log.blank();
176
+ }
177
+ function warnPrefixMismatch(mismatch) {
178
+ output_1.log.blank();
179
+ output_1.log.warn(output_1.pc.bold("Install location mismatch detected"));
180
+ output_1.log.warn(` Active IronBee runs from: ${output_1.pc.cyan(mismatch.running)}`);
181
+ output_1.log.warn(` npm install will write to: ${output_1.pc.cyan(mismatch.npm)}`);
182
+ output_1.log.warn("After install, your shell may keep resolving the OLD version on PATH.");
183
+ output_1.log.warn("To make the new version take effect, either:");
184
+ output_1.log.warn(` 1) Align npm prefix: ${output_1.pc.cyan(`npm config set prefix "${mismatch.running}"`)}`);
185
+ output_1.log.warn(" 2) Or install directly to the active location:");
186
+ output_1.log.warn(` ${output_1.pc.cyan(`npm install -g --prefix "${mismatch.running}" @ironbee-ai/cli@latest`)}`);
187
+ output_1.log.blank();
188
+ }
8
189
  exports.updateCommand = new commander_1.Command("update")
9
190
  .description("Update IronBee CLI to the latest version")
10
191
  .action(async () => {
@@ -21,6 +202,14 @@ exports.updateCommand = new commander_1.Command("update")
21
202
  return;
22
203
  }
23
204
  output_1.log.info(`New version available: ${output_1.pc.dim(local)} ${output_1.pc.yellow("→")} ${output_1.pc.green(output_1.pc.bold(latest))}`);
205
+ const mismatch = detectPrefixMismatch(__dirname, getNpmConfiguredPrefix());
206
+ if (mismatch) {
207
+ warnPrefixMismatch(mismatch);
208
+ }
209
+ const shadow = detectShadowOnPath(__dirname, findFirstPathBinary("ironbee"));
210
+ if (shadow) {
211
+ warnPathShadow(shadow);
212
+ }
24
213
  output_1.log.step(`Running ${output_1.pc.cyan("npm install -g @ironbee-ai/cli@latest")}...`);
25
214
  try {
26
215
  (0, child_process_1.execSync)("npm install -g @ironbee-ai/cli@latest", { stdio: "inherit" });
@@ -1 +1 @@
1
- {"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":";;;AAAA,yCAAoC;AACpC,iDAAyC;AACzC,0CAAwC;AACxC,4CAAqE;AAExD,QAAA,aAAa,GAAY,IAAI,mBAAO,CAAC,QAAQ,CAAC;KACtD,WAAW,CAAC,0CAA0C,CAAC;KACvD,MAAM,CAAC,KAAK,IAAmB,EAAE;IAC9B,MAAM,KAAK,GAAW,IAAA,yBAAe,GAAE,CAAC;IACxC,YAAG,CAAC,IAAI,CAAC,oBAAoB,WAAE,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC/C,YAAG,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;IAErC,MAAM,MAAM,GAAkB,MAAM,IAAA,4BAAkB,GAAE,CAAC;IAEzD,IAAI,CAAC,MAAM,EAAE,CAAC;QACV,YAAG,CAAC,KAAK,CAAC,+DAA+D,CAAC,CAAC;QAC3E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;IAED,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;QACnB,YAAG,CAAC,OAAO,CAAC,kCAAkC,WAAE,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACjE,OAAO;IACX,CAAC;IAED,YAAG,CAAC,IAAI,CAAC,0BAA0B,WAAE,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,WAAE,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,WAAE,CAAC,KAAK,CAAC,WAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC;IACnG,YAAG,CAAC,IAAI,CAAC,WAAW,WAAE,CAAC,IAAI,CAAC,uCAAuC,CAAC,KAAK,CAAC,CAAC;IAE3E,IAAI,CAAC;QACD,IAAA,wBAAQ,EAAC,uCAAuC,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;QACxE,YAAG,CAAC,KAAK,EAAE,CAAC;QACZ,YAAG,CAAC,OAAO,CAAC,cAAc,WAAE,CAAC,KAAK,CAAC,WAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC;QACvD,YAAG,CAAC,IAAI,CAAC,uDAAuD,CAAC,CAAC;IACtE,CAAC;IAAC,MAAM,CAAC;QACL,YAAG,CAAC,KAAK,EAAE,CAAC;QACZ,YAAG,CAAC,KAAK,CAAC,sCAAsC,CAAC,CAAC;QAClD,OAAO,CAAC,GAAG,CAAC,KAAK,WAAE,CAAC,IAAI,CAAC,uCAAuC,CAAC,EAAE,CAAC,CAAC;QACrE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;AACL,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ironbee-ai/cli",
3
- "version": "0.8.0",
3
+ "version": "0.8.2",
4
4
  "description": "The CLI for IronBee — Verification and Intelligence Layer for Agentic Development",
5
5
  "main": "dist/index.js",
6
6
  "bin": {
@@ -8,6 +8,8 @@
8
8
  },
9
9
  "files": [
10
10
  "dist",
11
+ "scripts/run-postinstall.js",
12
+ "scripts/run-preuninstall.js",
11
13
  "README.md",
12
14
  "LICENSE",
13
15
  "CHANGELOG.md"
@@ -23,8 +25,8 @@
23
25
  "release:patch": "release-it patch --ci -VV",
24
26
  "release:minor": "release-it minor --ci -VV",
25
27
  "release:major": "release-it major --ci -VV",
26
- "postinstall": "node dist/scripts/postinstall.js || true",
27
- "preuninstall": "node dist/scripts/preuninstall.js || true"
28
+ "postinstall": "node scripts/run-postinstall.js",
29
+ "preuninstall": "node scripts/run-preuninstall.js"
28
30
  },
29
31
  "keywords": [
30
32
  "ai",
@@ -0,0 +1,35 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Wrapper for the `postinstall` lifecycle hook.
4
+ *
5
+ * The published package ships `dist/scripts/postinstall.js` (compiled from
6
+ * `src/scripts/postinstall.ts`) and that's what we want to run when an
7
+ * end user installs the CLI via `npm install -g @ironbee-ai/cli`.
8
+ *
9
+ * In a fresh dev clone or CI checkout, `dist/` doesn't exist yet because
10
+ * `npm ci` runs lifecycle hooks BEFORE `npm run build`. The previous
11
+ * inline `node dist/scripts/postinstall.js || true` form swallowed the
12
+ * exit code at the shell level but still printed a `MODULE_NOT_FOUND`
13
+ * stack trace to stderr — confusing in CI logs and not portable to
14
+ * Windows cmd / PowerShell.
15
+ *
16
+ * This wrapper checks for the compiled file first and silently no-ops
17
+ * when it isn't there. Cross-platform, no stderr noise.
18
+ */
19
+
20
+ const fs = require("fs");
21
+ const path = require("path");
22
+
23
+ const target = path.join(__dirname, "..", "dist", "scripts", "postinstall.js");
24
+ if (!fs.existsSync(target)) {
25
+ // dist/ not built yet (dev clone, fresh CI before build) — skip.
26
+ process.exit(0);
27
+ }
28
+
29
+ try {
30
+ require(target);
31
+ } catch (e) {
32
+ // Match the original `|| true` semantics: never break the install
33
+ // because the optional postinstall hook had a problem.
34
+ process.exit(0);
35
+ }
@@ -0,0 +1,19 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Wrapper for the `preuninstall` lifecycle hook. See
4
+ * `scripts/run-postinstall.js` for the why; same shape.
5
+ */
6
+
7
+ const fs = require("fs");
8
+ const path = require("path");
9
+
10
+ const target = path.join(__dirname, "..", "dist", "scripts", "preuninstall.js");
11
+ if (!fs.existsSync(target)) {
12
+ process.exit(0);
13
+ }
14
+
15
+ try {
16
+ require(target);
17
+ } catch (e) {
18
+ process.exit(0);
19
+ }