codeam-cli 2.73.4 → 2.73.6

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
@@ -4,6 +4,18 @@ All notable changes to `codeam-cli` are documented here.
4
4
 
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6
6
 
7
+ ## [2.73.5] — 2026-09-03
8
+
9
+ ### Fixed
10
+
11
+ - **shared:** Postman's MCP server never installed — npm refuses it (#688)
12
+
13
+ ## [2.73.4] — 2026-09-03
14
+
15
+ ### Fixed
16
+
17
+ - **cli:** MCP startup budget that fits our shim + stop the baton mirror replaying history as live turns (#686)
18
+
7
19
  ## [2.73.3] — 2026-09-02
8
20
 
9
21
  ### Fixed
package/dist/index.js CHANGED
@@ -1872,8 +1872,27 @@ var INTEGRATION_REGISTRY = {
1872
1872
  mcp: {
1873
1873
  // Postman's OFFICIAL stdio MCP server (Node). BYO key via POSTMAN_API_KEY
1874
1874
  // (env only). Version PINNED; bump only after re-verifying headless.
1875
+ //
1876
+ // ⚠️ `--ignore-scripts` IS LOAD-BEARING — without it this integration
1877
+ // does not work at all, on any box, and never did. The package declares
1878
+ // a `preinstall` guard of `npx only-allow pnpm`, so npm REFUSES to
1879
+ // install it:
1880
+ // info run @postman/postman-mcp-server@2.11.2 preinstall npx only-allow pnpm
1881
+ // info run @postman/postman-mcp-server@2.11.2 preinstall { code: 1 }
1882
+ // and `npx -y @postman/postman-mcp-server@2.11.2` exits 1 before the
1883
+ // server is ever reached — which the agent reports as
1884
+ // `Server "postman" is not connected`, indistinguishable from a slow
1885
+ // start (found while pre-warming the box image, 2026-09-03; the user's
1886
+ // report was "Postman: idem", alongside clickup/trello, whose cause was
1887
+ // entirely different).
1888
+ //
1889
+ // Skipping scripts is safe here: the guard is the only preinstall step
1890
+ // and the published tarball already ships the built
1891
+ // `dist/src/index.js` its `bin` points at. Verified on node:22-slim:
1892
+ // `npx -y <pkg>` → exit 1; `npx -y --ignore-scripts <pkg>` with a key in
1893
+ // the env → starts; and warmed once, the bin resolves offline.
1875
1894
  command: "npx",
1876
- args: ["-y", "@postman/postman-mcp-server@2.11.2"],
1895
+ args: ["-y", "--ignore-scripts", "@postman/postman-mcp-server@2.11.2"],
1877
1896
  envMapping: {
1878
1897
  POSTMAN_API_KEY: "accessToken"
1879
1898
  }
@@ -8097,7 +8116,7 @@ function readAnonId() {
8097
8116
  }
8098
8117
  function superProperties() {
8099
8118
  return {
8100
- cliVersion: true ? "2.73.4" : "0.0.0-dev",
8119
+ cliVersion: true ? "2.73.6" : "0.0.0-dev",
8101
8120
  nodeVersion: process.version,
8102
8121
  platform: process.platform,
8103
8122
  arch: process.arch,
@@ -8339,7 +8358,7 @@ var http = __toESM(require("http"));
8339
8358
  // package.json
8340
8359
  var package_default = {
8341
8360
  name: "codeam-cli",
8342
- version: "2.73.4",
8361
+ version: "2.73.6",
8343
8362
  description: "Workflow-continuity bridge for AI coding agents. Wrap Claude Code or Codex in a PTY and supervise, approve, and redirect the session from any device \u2014 async. The terminal companion for CodeAgent Mobile.",
8344
8363
  type: "commonjs",
8345
8364
  main: "dist/index.js",
@@ -9932,7 +9951,7 @@ var CommandRelayService = class _CommandRelayService {
9932
9951
  // fresh + clear the "CLI update available" banner after a self-update
9933
9952
  // (a codespace that reinstalls @latest reconnects via heartbeat, not
9934
9953
  // pair/reconnect). Older backends ignore the extra field.
9935
- ..."2.73.4" ? { ideVersion: "2.73.4" } : {}
9954
+ ..."2.73.6" ? { ideVersion: "2.73.6" } : {}
9936
9955
  }).then(() => log.trace("relay", `heartbeat ok online=${online}`)).catch((err) => log.trace("relay", `heartbeat failed online=${online}`, err));
9937
9956
  }
9938
9957
  /**
@@ -22208,7 +22227,7 @@ async function autoUpgradeBeforeCriticalCommand() {
22208
22227
  if (process.env.NODE_ENV === "test") return;
22209
22228
  if (process.env.CODEAM_DISABLE_UPDATE_CHECK === "1") return;
22210
22229
  if (process.env.CI) return;
22211
- const current2 = true ? "2.73.4" : null;
22230
+ const current2 = true ? "2.73.6" : null;
22212
22231
  if (!current2) return;
22213
22232
  const cache = readCache();
22214
22233
  const fresh = cache && Date.now() - cache.fetchedAt < TTL_MS;
@@ -22225,7 +22244,7 @@ function checkForUpdates() {
22225
22244
  if (process.env.CODEAM_DISABLE_UPDATE_CHECK === "1") return;
22226
22245
  if (process.env.CI) return;
22227
22246
  if (!process.stdout.isTTY) return;
22228
- const current2 = true ? "2.73.4" : null;
22247
+ const current2 = true ? "2.73.6" : null;
22229
22248
  if (!current2) return;
22230
22249
  const cache = readCache();
22231
22250
  const fresh = cache && Date.now() - cache.fetchedAt < TTL_MS;
@@ -22248,7 +22267,7 @@ var SELF_UPDATE_INSTALL_TIMEOUT_MS = 18e4;
22248
22267
  var SELF_UPDATE_LS_TIMEOUT_MS = 15e3;
22249
22268
  var SUDO_PREFLIGHT_TIMEOUT_MS = 5e3;
22250
22269
  function currentCliVersion() {
22251
- return true ? "2.73.4" : null;
22270
+ return true ? "2.73.6" : null;
22252
22271
  }
22253
22272
  async function installedVersion(deps) {
22254
22273
  const ls = await deps.run(
@@ -35865,9 +35884,24 @@ var AcpClient = class {
35865
35884
  ...this.opts.extraEnv ?? {},
35866
35885
  PATH: augmentedPath
35867
35886
  },
35868
- stdio: ["pipe", "pipe", "pipe"]
35887
+ stdio: ["pipe", "pipe", "pipe"],
35888
+ // ⚠️ Own process group, so `stop()` can reap the WHOLE tree. The adapter
35889
+ // is only the top of it: it spawns the real `claude`, which spawns one
35890
+ // `codeam mcp-run` shim per integration, each of which spawns the
35891
+ // vendor's MCP server. Killing the adapter alone orphaned all of that —
35892
+ // see `stop()` for the incident. Windows has no process groups; there
35893
+ // the tree is reaped with `taskkill /T` instead.
35894
+ detached: process.platform !== "win32"
35869
35895
  });
35870
35896
  this.child = child;
35897
+ const pid = child.pid;
35898
+ if (pid && process.platform !== "win32") {
35899
+ const reapOnExit = () => {
35900
+ if (this.child === child) killQuiet(-pid, "SIGKILL");
35901
+ };
35902
+ process.once("exit", reapOnExit);
35903
+ child.once("exit", () => process.removeListener("exit", reapOnExit));
35904
+ }
35871
35905
  child.stderr?.setEncoding("utf8");
35872
35906
  child.stderr?.on("data", (chunk) => {
35873
35907
  for (const line of chunk.split(/\r?\n/)) {
@@ -36516,10 +36550,18 @@ var AcpClient = class {
36516
36550
  this.connection = null;
36517
36551
  this.sessionId = null;
36518
36552
  try {
36519
- child.kill("SIGTERM");
36553
+ const pid = child.pid;
36554
+ if (process.platform === "win32") {
36555
+ if (pid) (0, import_node_child_process29.spawnSync)("taskkill", ["/F", "/T", "/PID", String(pid)], { stdio: "ignore" });
36556
+ } else if (pid) {
36557
+ killQuiet(-pid, "SIGTERM");
36558
+ } else {
36559
+ child.kill("SIGTERM");
36560
+ }
36520
36561
  const grace = new Promise((resolve11) => {
36521
36562
  const t2 = setTimeout(() => {
36522
- killQuiet(child, "SIGKILL");
36563
+ if (process.platform !== "win32" && pid) killQuiet(-pid, "SIGKILL");
36564
+ else killQuiet(child, "SIGKILL");
36523
36565
  resolve11();
36524
36566
  }, 2e3);
36525
36567
  child.once("exit", () => {
@@ -47099,7 +47141,7 @@ function checkChokidar() {
47099
47141
  }
47100
47142
  async function doctor(args2 = []) {
47101
47143
  const json = args2.includes("--json");
47102
- const cliVersion = true ? "2.73.4" : "0.0.0-dev";
47144
+ const cliVersion = true ? "2.73.6" : "0.0.0-dev";
47103
47145
  const apiBase2 = resolveApiBaseUrl();
47104
47146
  const diagnosticId = (0, import_node_crypto13.randomUUID)();
47105
47147
  log.info("doctor", `run id=${diagnosticId} cli=${cliVersion}`);
@@ -47494,6 +47536,11 @@ function specOf(delivery) {
47494
47536
  const spec = (delivery.args ?? []).find((a) => !a.startsWith("-"));
47495
47537
  return spec ?? null;
47496
47538
  }
47539
+ function launcherFlagsOf(delivery) {
47540
+ const args2 = delivery.args ?? [];
47541
+ const specIndex = args2.findIndex((a) => !a.startsWith("-"));
47542
+ return specIndex === -1 ? [...args2] : args2.slice(0, specIndex);
47543
+ }
47497
47544
  function warmTargets() {
47498
47545
  const bySpec = /* @__PURE__ */ new Map();
47499
47546
  for (const integration of getEnabledIntegrations()) {
@@ -47502,14 +47549,20 @@ function warmTargets() {
47502
47549
  const spec = specOf(delivery);
47503
47550
  if (!spec) continue;
47504
47551
  if (!bySpec.has(spec)) {
47505
- bySpec.set(spec, { id: integration.id, launcher: delivery.command, spec });
47552
+ bySpec.set(spec, {
47553
+ id: integration.id,
47554
+ launcher: delivery.command,
47555
+ flags: launcherFlagsOf(delivery),
47556
+ spec
47557
+ });
47506
47558
  }
47507
47559
  }
47508
47560
  return [...bySpec.values()];
47509
47561
  }
47510
47562
  function warmCommand(target) {
47511
47563
  if (target.launcher === "npx") {
47512
- return { command: "npx", args: ["-y", "--package", target.spec, "-c", "true"] };
47564
+ const extra = target.flags.filter((f) => f !== "-y");
47565
+ return { command: "npx", args: ["-y", ...extra, "--package", target.spec, "-c", "true"] };
47513
47566
  }
47514
47567
  if (target.launcher === "uvx") {
47515
47568
  return { command: "uv", args: ["tool", "install", target.spec] };
@@ -47540,7 +47593,9 @@ async function mcpWarm(argv = []) {
47540
47593
  result.warmed.push(target.spec);
47541
47594
  console.log(` OK ${target.spec} (${secs}s)`);
47542
47595
  } else {
47543
- const reason = run.error?.message ?? (run.stderr ?? "").trim().split("\n").slice(-1)[0] ?? `exit ${String(run.status)}`;
47596
+ const noise = /^npm (warn|notice)\b/;
47597
+ const lines = (run.stderr ?? "").split("\n").map((l) => l.trim()).filter((l) => l.length > 0 && !noise.test(l));
47598
+ const reason = run.error?.message ?? lines[lines.length - 1] ?? `exit ${String(run.status)} (no stderr)`;
47544
47599
  result.failed.push({ spec: target.spec, reason });
47545
47600
  console.log(` MISS ${target.spec} (${secs}s) \u2014 fetched at runtime instead: ${reason}`);
47546
47601
  }
@@ -47557,7 +47612,7 @@ async function mcpWarm(argv = []) {
47557
47612
  // src/commands/version.ts
47558
47613
  var import_picocolors15 = __toESM(require("picocolors"));
47559
47614
  function version2() {
47560
- const v = true ? "2.73.4" : "unknown";
47615
+ const v = true ? "2.73.6" : "unknown";
47561
47616
  console.log(`${import_picocolors15.default.bold("codeam-cli")} ${import_picocolors15.default.cyan(v)}`);
47562
47617
  }
47563
47618
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "codeam-cli",
3
- "version": "2.73.4",
3
+ "version": "2.73.6",
4
4
  "description": "Workflow-continuity bridge for AI coding agents. Wrap Claude Code or Codex in a PTY and supervise, approve, and redirect the session from any device — async. The terminal companion for CodeAgent Mobile.",
5
5
  "type": "commonjs",
6
6
  "main": "dist/index.js",