@jentrix/cli 0.5.7 → 0.5.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.
Files changed (2) hide show
  1. package/dist/main.js +67 -11
  2. package/package.json +1 -1
package/dist/main.js CHANGED
@@ -20962,7 +20962,7 @@ function refreshAccessToken(input) {
20962
20962
 
20963
20963
  // src/client.ts
20964
20964
  var CLI_NAME = "stacks-cli";
20965
- var CLI_VERSION = "0.5.7";
20965
+ var CLI_VERSION = "0.5.9";
20966
20966
  var DEAD_TOKEN_MESSAGE = "authentication failed (HTTP 401): the token is dead or expired \u2014 mint a new PAT at /account/tokens on your Jentrix server and update STACKS_TOKEN (or --token / the config file).";
20967
20967
  var RELOGIN_MESSAGE = "OAuth session expired and could not be refreshed \u2014 run `jentrix login` to sign in again.";
20968
20968
  function originOf2(url2) {
@@ -21117,6 +21117,17 @@ function execTarget(file, args, platform2 = process.platform, comSpec = process.
21117
21117
  options: { windowsVerbatimArguments: true }
21118
21118
  };
21119
21119
  }
21120
+ function browserTarget(url2, platform2 = process.platform, comSpec = process.env.ComSpec) {
21121
+ if (platform2 === "darwin") return { file: "open", args: [url2], options: {} };
21122
+ if (platform2 !== "win32") {
21123
+ return { file: "xdg-open", args: [url2], options: {} };
21124
+ }
21125
+ return {
21126
+ file: comSpec || "cmd.exe",
21127
+ args: ["/d", "/s", "/c", `"start "" ${quoteForCmd(url2)}"`],
21128
+ options: { windowsVerbatimArguments: true }
21129
+ };
21130
+ }
21120
21131
 
21121
21132
  // src/loopback.ts
21122
21133
  import { createServer } from "node:http";
@@ -21185,11 +21196,13 @@ async function bindLoopback(ports, timeoutMs = CALLBACK_TIMEOUT_MS) {
21185
21196
  }
21186
21197
  function openBrowser(url2) {
21187
21198
  return new Promise((resolve5) => {
21188
- const os = platform();
21189
- const cmd = os === "darwin" ? "open" : os === "win32" ? "cmd" : "xdg-open";
21190
- const args = os === "win32" ? ["/c", "start", "", url2] : [url2];
21199
+ const { file, args, options } = browserTarget(url2, platform());
21191
21200
  try {
21192
- const child = spawn(cmd, args, { stdio: "ignore", detached: true });
21201
+ const child = spawn(file, args, {
21202
+ stdio: "ignore",
21203
+ detached: true,
21204
+ ...options
21205
+ });
21193
21206
  child.on("error", () => resolve5());
21194
21207
  child.unref();
21195
21208
  } catch {
@@ -27900,18 +27913,39 @@ var NPM_INSTALL_TIMEOUT_MS2 = 3e5;
27900
27913
  var SUPERSEDED = ["@jentrix/stacks-cli", "@jentrix/stacks-runner"];
27901
27914
  var CLI_SPEC = `@jentrix/cli@${CLI_VERSION}`;
27902
27915
  var RUNNER_SPEC2 = `@jentrix/runner@${CLI_VERSION}`;
27916
+ function compareVersions(a, b) {
27917
+ const parts = (v) => {
27918
+ const m = /^(\d+)\.(\d+)\.(\d+)/.exec(v.trim());
27919
+ return m ? [Number(m[1]), Number(m[2]), Number(m[3])] : [0, 0, 0];
27920
+ };
27921
+ const [x, y] = [parts(a), parts(b)];
27922
+ for (let i = 0; i < 3; i++) {
27923
+ if (x[i] !== y[i]) return x[i] - y[i];
27924
+ }
27925
+ return 0;
27926
+ }
27903
27927
  function say(deps2, text = "") {
27904
27928
  deps2.writeOut(text);
27905
27929
  }
27906
27930
  async function installToolchain(deps2) {
27907
27931
  const npm = await deps2.resolveNpm();
27908
27932
  let global = await deps2.globalInstall();
27909
- if (global.cliDir) {
27933
+ const installedVersion = global.cliVersion;
27934
+ const behind = global.cliDir !== null && (installedVersion === null || compareVersions(installedVersion, CLI_VERSION) < 0);
27935
+ const upgradable = behind && !global.runningFromGlobal;
27936
+ if (global.cliDir && !upgradable) {
27910
27937
  say(
27911
27938
  deps2,
27912
- `jentrix ${CLI_VERSION} is already installed (${global.cliDir}).`
27939
+ `jentrix ${installedVersion ?? "(unreadable version)"} is already installed (${global.cliDir}).`
27913
27940
  );
27914
- say(deps2, " Upgrade it any time with: npm update -g @jentrix/cli");
27941
+ if (behind) {
27942
+ say(deps2, ` ${CLI_VERSION} is available \u2014 upgrade with:`);
27943
+ say(deps2, ` npm install -g ${CLI_SPEC} ${RUNNER_SPEC2}`);
27944
+ } else if (installedVersion && compareVersions(installedVersion, CLI_VERSION) > 0) {
27945
+ say(deps2, ` Newer than this ${CLI_VERSION} runner \u2014 left alone.`);
27946
+ } else {
27947
+ say(deps2, " Upgrade it any time with: npm update -g @jentrix/cli");
27948
+ }
27915
27949
  } else {
27916
27950
  if (!npm) {
27917
27951
  deps2.writeErr(
@@ -27920,7 +27954,10 @@ async function installToolchain(deps2) {
27920
27954
  return EXIT_CODES.INVALID_INPUT;
27921
27955
  }
27922
27956
  await deps2.invoke(npm, ["rm", "-g", ...SUPERSEDED], void 0, 6e4);
27923
- say(deps2, `Installing ${CLI_SPEC} + ${RUNNER_SPEC2} (npm -g)\u2026`);
27957
+ say(
27958
+ deps2,
27959
+ upgradable ? `Upgrading jentrix ${installedVersion ?? "?"} \u2192 ${CLI_VERSION} (npm -g)\u2026` : `Installing ${CLI_SPEC} + ${RUNNER_SPEC2} (npm -g)\u2026`
27960
+ );
27924
27961
  const installed = await deps2.invoke(
27925
27962
  npm,
27926
27963
  ["install", "-g", CLI_SPEC, RUNNER_SPEC2],
@@ -27944,7 +27981,10 @@ async function installToolchain(deps2) {
27944
27981
  );
27945
27982
  return EXIT_CODES.INTERNAL;
27946
27983
  }
27947
- say(deps2, "Installed the CLI and the session runner.");
27984
+ say(
27985
+ deps2,
27986
+ upgradable ? `Upgraded to ${global.cliVersion ?? CLI_VERSION}.` : "Installed the CLI and the session runner."
27987
+ );
27948
27988
  }
27949
27989
  if (!global.runnerDir) {
27950
27990
  if (!npm) {
@@ -28863,12 +28903,28 @@ registerSetupCommand(
28863
28903
  const candidate = join6(root, "@jentrix", name);
28864
28904
  return existsSync6(join6(candidate, "package.json")) ? candidate : null;
28865
28905
  };
28906
+ const cliDir = dir("cli");
28907
+ const versionOf = (packageDir) => {
28908
+ if (!packageDir) return null;
28909
+ try {
28910
+ const raw = readFileSync7(join6(packageDir, "package.json"), "utf8");
28911
+ const parsed = JSON.parse(raw);
28912
+ const value = typeof parsed === "object" && parsed !== null ? parsed.version : void 0;
28913
+ return typeof value === "string" ? value : null;
28914
+ } catch {
28915
+ return null;
28916
+ }
28917
+ };
28866
28918
  return {
28867
- cliDir: dir("cli"),
28919
+ cliDir,
28920
+ cliVersion: versionOf(cliDir),
28868
28921
  runnerDir: dir("runner"),
28869
28922
  binDir,
28870
28923
  binDirOnPath: Boolean(
28871
28924
  binDir && (process.env.PATH ?? "").split(delimiter2).some((entry) => entry && resolve4(entry) === resolve4(binDir))
28925
+ ),
28926
+ runningFromGlobal: Boolean(
28927
+ cliDir && resolve4(cliDir) === resolve4(PACKAGE_ROOT)
28872
28928
  )
28873
28929
  };
28874
28930
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jentrix/cli",
3
- "version": "0.5.7",
3
+ "version": "0.5.9",
4
4
  "description": "Command-line client for the Jentrix MCP surface (jentrix tool <name>, generated noun-verb commands).",
5
5
  "keywords": [
6
6
  "jentrix",