skalpel 3.0.8 → 3.0.9

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.
@@ -298,6 +298,24 @@ function runUninstall(rest) {
298
298
  // Fallback to the old unconditional message if no summary made it back.
299
299
  process.stdout.write(`\n${ok} skalpel state removed from this machine.\n`);
300
300
  }
301
+
302
+ // Only emit the "running agents still have stale env" hint when
303
+ // something was actually removed (or in dry-run); on already-clean
304
+ // re-runs the hint adds noise without value.
305
+ const ranAnyCleanup = summary && !(
306
+ summary.rcBlocksRemoved === 0 &&
307
+ !summary.serviceFileRemoved &&
308
+ summary.userDataFilesRemoved === 0
309
+ );
310
+ if (!summary || ranAnyCleanup) {
311
+ process.stdout.write(
312
+ `${dim('Note: any open shells or running coding agents (Claude Code, Codex, ' +
313
+ 'Cursor, etc.) still have the skalpel proxy env vars cached in their ' +
314
+ 'environment. Open a fresh shell and restart any active agents to drop ' +
315
+ 'them.')}\n`
316
+ );
317
+ }
318
+
301
319
  process.stdout.write(`${dim('To finish removal, also run:')}\n`);
302
320
  process.stdout.write(` npm uninstall -g skalpel\n`);
303
321
  return 0;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "skalpel",
3
- "version": "3.0.8",
3
+ "version": "3.0.9",
4
4
  "description": "Skalpel — local proxy and TUI for coding agents (skalpel + skalpeld bundle).",
5
5
  "license": "Apache-2.0",
6
6
  "homepage": "https://skalpel.ai",
@@ -54,10 +54,10 @@
54
54
  "x64"
55
55
  ],
56
56
  "optionalDependencies": {
57
- "@skalpelai/skalpel-darwin-arm64": "3.0.8",
58
- "@skalpelai/skalpel-darwin-x64": "3.0.8",
59
- "@skalpelai/skalpel-linux-arm64": "3.0.8",
60
- "@skalpelai/skalpel-linux-x64": "3.0.8",
61
- "@skalpelai/skalpel-win32-x64": "3.0.8"
57
+ "@skalpelai/skalpel-darwin-arm64": "3.0.9",
58
+ "@skalpelai/skalpel-darwin-x64": "3.0.9",
59
+ "@skalpelai/skalpel-linux-arm64": "3.0.9",
60
+ "@skalpelai/skalpel-linux-x64": "3.0.9",
61
+ "@skalpelai/skalpel-win32-x64": "3.0.9"
62
62
  }
63
63
  }
@@ -226,12 +226,35 @@ function main(argv) {
226
226
  return 0;
227
227
  }
228
228
 
229
- // B32: refuse to run under `npx skalpel`.
230
- if (paths.isNpxInvocation()) {
231
- process.stderr.write(
232
- 'Skalpel does not support `npx skalpel` please run `npm i -g @skalpelai/skalpel` instead.\n'
229
+ // npx mode: prior to v3.0.9 we returned exit 1 here, which caused
230
+ // npm to roll back the cached package install — leaving an empty
231
+ // ~/.npm/_npx/<hash>/ dir and a silent failure that re-prompted on
232
+ // every subsequent `npx skalpel` call. The original reason for the
233
+ // gate (B32) was that paths.binPath() couldn't locate the platform
234
+ // binary under npx's directory layout. That was fixed in v3.0.1
235
+ // when binPath was rewritten to use require.resolve against the
236
+ // platform sub-package (see paths.js:99-116) — which works under
237
+ // npx, global, or local install paths uniformly.
238
+ //
239
+ // We still skip the install wizard under npx because the wizard's
240
+ // service-register step would bake the npx cache path
241
+ // (~/.npm/_npx/<hash>/...) into the OS service unit, and that path
242
+ // is evicted by npx's cache GC. Exit 0 instead of 1 so npm install
243
+ // completes and the binary becomes invokable.
244
+ //
245
+ // Uninstall, however, MUST run under npx: a user running
246
+ // `npx skalpel uninstall` to clean up a prior `npm install -g`
247
+ // would otherwise hit the same skip and have nothing happen.
248
+ if (paths.isNpxInvocation() && !opts.uninstall) {
249
+ log.info(
250
+ 'npx mode detected — skipping install wizard (service-register / ' +
251
+ 'env-inject would bake transient npx cache paths into your system).'
233
252
  );
234
- return 1;
253
+ log.info(
254
+ 'For a persistent install with daemon-on-boot and shell env vars, ' +
255
+ 'run: `npm install -g skalpel`'
256
+ );
257
+ return 0;
235
258
  }
236
259
 
237
260
  const total = 5;