codeam-cli 2.75.29 → 2.75.31

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.75.30] — 2026-09-25
8
+
9
+ ### Fixed
10
+
11
+ - **cli:** Preview error log tail without terminal escape codes (#823)
12
+
13
+ ## [2.75.29] — 2026-09-25
14
+
15
+ ### Fixed
16
+
17
+ - **cli:** Preview reaches the real dev server (readiness, Host), no CodeAgent Cloud copy (#821)
18
+
7
19
  ## [2.75.28] — 2026-09-25
8
20
 
9
21
  ### Fixed
package/dist/index.js CHANGED
@@ -10516,7 +10516,7 @@ function readAnonId() {
10516
10516
  }
10517
10517
  function superProperties() {
10518
10518
  return {
10519
- cliVersion: true ? "2.75.29" : "0.0.0-dev",
10519
+ cliVersion: true ? "2.75.31" : "0.0.0-dev",
10520
10520
  nodeVersion: process.version,
10521
10521
  platform: process.platform,
10522
10522
  arch: process.arch,
@@ -10758,7 +10758,7 @@ var http = __toESM(require("http"));
10758
10758
  // package.json
10759
10759
  var package_default = {
10760
10760
  name: "codeam-cli",
10761
- version: "2.75.29",
10761
+ version: "2.75.31",
10762
10762
  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.",
10763
10763
  type: "commonjs",
10764
10764
  main: "dist/index.js",
@@ -12088,7 +12088,7 @@ var CommandRelayService = class _CommandRelayService {
12088
12088
  // fresh + clear the "CLI update available" banner after a self-update
12089
12089
  // (a codespace that reinstalls @latest reconnects via heartbeat, not
12090
12090
  // pair/reconnect). Older backends ignore the extra field.
12091
- ..."2.75.29" ? { ideVersion: "2.75.29" } : {}
12091
+ ..."2.75.31" ? { ideVersion: "2.75.31" } : {}
12092
12092
  };
12093
12093
  try {
12094
12094
  const res = await _postJson(`${API_BASE2}/api/plugin/heartbeat`, body);
@@ -23925,19 +23925,36 @@ function listScriptCandidates(root) {
23925
23925
  }
23926
23926
 
23927
23927
  // src/services/preview/prewarm-deps.ts
23928
+ var import_which2 = __toESM(require("which"));
23928
23929
  var inFlight = null;
23929
23930
  var PREWARM_INSTALL_TIMEOUT_MS = 5 * 6e4;
23930
23931
  function prewarmNodeDeps(cwd) {
23931
23932
  if (inFlight) return inFlight;
23932
23933
  const missing = detectMissingNodeDeps(cwd);
23933
- if (!missing || missing.cmd !== "npm") return Promise.resolve();
23934
+ if (!missing) return Promise.resolve();
23934
23935
  log.info("preview", `prewarm: installing deps (${missing.cmd} ${missing.args.join(" ")})`);
23935
23936
  const started = Date.now();
23936
- inFlight = runSetupCommand(missing.cmd, missing.args, cwd, void 0, {
23937
- timeoutMs: PREWARM_INSTALL_TIMEOUT_MS
23938
- }).then((r) => {
23937
+ inFlight = (async () => {
23938
+ if (missing.cmd === "yarn") {
23939
+ const ensured = await ensureYarnInstalled({
23940
+ hasYarn: async () => Boolean(await (0, import_which2.default)("yarn", { nothrow: true })),
23941
+ installYarn: async () => {
23942
+ const r2 = await runSetupCommand("npm", ["install", "-g", "yarn"], cwd, void 0, {
23943
+ timeoutMs: PREWARM_INSTALL_TIMEOUT_MS
23944
+ });
23945
+ return { ok: r2.status === "ok", code: r2.code };
23946
+ }
23947
+ });
23948
+ if (!ensured.ok) {
23949
+ log.info("preview", `prewarm: yarn unavailable (exit ${ensured.code}) \u2014 Preview will retry`);
23950
+ return;
23951
+ }
23952
+ }
23953
+ const r = await runSetupCommand(missing.cmd, missing.args, cwd, void 0, {
23954
+ timeoutMs: PREWARM_INSTALL_TIMEOUT_MS
23955
+ });
23939
23956
  log.info("preview", `prewarm: deps ${r.status} after ${Date.now() - started}ms`);
23940
- }).catch((err) => {
23957
+ })().catch((err) => {
23941
23958
  log.info("preview", `prewarm: deps install threw (${String(err)})`);
23942
23959
  }).finally(() => {
23943
23960
  inFlight = null;
@@ -24086,7 +24103,7 @@ function activePreviewSessionIds() {
24086
24103
  var import_child_process20 = require("child_process");
24087
24104
  var fs43 = __toESM(require("fs"));
24088
24105
  var path51 = __toESM(require("path"));
24089
- var import_which2 = __toESM(require("which"));
24106
+ var import_which3 = __toESM(require("which"));
24090
24107
 
24091
24108
  // src/services/project-env/index.ts
24092
24109
  var import_fs6 = require("fs");
@@ -24895,10 +24912,13 @@ async function bringUpInspector(targetPort, deps = {}) {
24895
24912
 
24896
24913
  // src/services/preview/served-address.ts
24897
24914
  var LOOPBACK_HOSTS = ["127.0.0.1", "::1"];
24898
- var ANSI_RE2 = /\x1b\[[0-9;]*m/g;
24915
+ var ANSI_RE2 = /\x1b\[[0-9;?]*[A-Za-z]/g;
24916
+ function stripAnsi(text) {
24917
+ return text.replace(ANSI_RE2, "");
24918
+ }
24899
24919
  var LOCAL_URL_RE = /https?:\/\/(?:localhost|127\.0\.0\.1|0\.0\.0\.0|\[::1?\]|\[::\]):(\d{2,5})\b/gi;
24900
24920
  function announcedPorts(output) {
24901
- const clean = output.replace(ANSI_RE2, "");
24921
+ const clean = stripAnsi(output);
24902
24922
  const ports = [];
24903
24923
  for (const m of clean.matchAll(LOCAL_URL_RE)) {
24904
24924
  const port = Number(m[1]);
@@ -25099,7 +25119,7 @@ async function provisionDeps(ctx) {
25099
25119
  if (missingDeps) {
25100
25120
  if (missingDeps.cmd === "yarn") {
25101
25121
  const ensured = await ensureYarnInstalled({
25102
- hasYarn: async () => Boolean(await (0, import_which2.default)("yarn", { nothrow: true })),
25122
+ hasYarn: async () => Boolean(await (0, import_which3.default)("yarn", { nothrow: true })),
25103
25123
  installYarn: async () => {
25104
25124
  emitProgress("SETUP_RUN", "installing yarn (not found on PATH) \u2014 npm install -g yarn");
25105
25125
  const r = await runSetupCommand(
@@ -25287,7 +25307,7 @@ async function startDevServer(ctx, extraEnv = {}) {
25287
25307
  emit2(USER_EVENTS.PREVIEW_ERROR, {
25288
25308
  stage: "spawn",
25289
25309
  message: `The dev server exited (code ${outcome.code}) before it was ready. It may need a database or other services.`,
25290
- stderrTail: outputTail.slice(-8e3)
25310
+ stderrTail: stripAnsi(outputTail).slice(-8e3)
25291
25311
  });
25292
25312
  return null;
25293
25313
  }
@@ -25296,7 +25316,7 @@ async function startDevServer(ctx, extraEnv = {}) {
25296
25316
  emit2(USER_EVENTS.PREVIEW_ERROR, {
25297
25317
  stage: "ready_timeout",
25298
25318
  message: "The dev server didn't become ready in time. It may be stuck waiting on a database or other service.",
25299
- stderrTail: outputTail.slice(-8e3)
25319
+ stderrTail: stripAnsi(outputTail).slice(-8e3)
25300
25320
  });
25301
25321
  return null;
25302
25322
  }
@@ -48637,7 +48657,7 @@ async function autoUpgradeBeforeCriticalCommand() {
48637
48657
  if (process.env.NODE_ENV === "test") return;
48638
48658
  if (process.env.CODEAM_DISABLE_UPDATE_CHECK === "1") return;
48639
48659
  if (process.env.CI) return;
48640
- const current2 = true ? "2.75.29" : null;
48660
+ const current2 = true ? "2.75.31" : null;
48641
48661
  if (!current2) return;
48642
48662
  const cache = readCache();
48643
48663
  const fresh = cache && Date.now() - cache.fetchedAt < TTL_MS;
@@ -48654,7 +48674,7 @@ function checkForUpdates() {
48654
48674
  if (process.env.CODEAM_DISABLE_UPDATE_CHECK === "1") return;
48655
48675
  if (process.env.CI) return;
48656
48676
  if (!process.stdout.isTTY) return;
48657
- const current2 = true ? "2.75.29" : null;
48677
+ const current2 = true ? "2.75.31" : null;
48658
48678
  if (!current2) return;
48659
48679
  const cache = readCache();
48660
48680
  const fresh = cache && Date.now() - cache.fetchedAt < TTL_MS;
@@ -48677,7 +48697,7 @@ var SELF_UPDATE_INSTALL_TIMEOUT_MS = 18e4;
48677
48697
  var SELF_UPDATE_LS_TIMEOUT_MS = 15e3;
48678
48698
  var SUDO_PREFLIGHT_TIMEOUT_MS = 5e3;
48679
48699
  function currentCliVersion() {
48680
- return true ? "2.75.29" : null;
48700
+ return true ? "2.75.31" : null;
48681
48701
  }
48682
48702
  async function installedVersion(deps) {
48683
48703
  const ls = await deps.run(
@@ -50642,7 +50662,7 @@ function checkChokidar() {
50642
50662
  }
50643
50663
  async function doctor(args2 = []) {
50644
50664
  const json = args2.includes("--json");
50645
- const cliVersion = true ? "2.75.29" : "0.0.0-dev";
50665
+ const cliVersion = true ? "2.75.31" : "0.0.0-dev";
50646
50666
  const apiBase2 = resolveApiBaseUrl();
50647
50667
  const diagnosticId = (0, import_node_crypto13.randomUUID)();
50648
50668
  log.info("doctor", `run id=${diagnosticId} cli=${cliVersion}`);
@@ -51166,7 +51186,7 @@ async function mcpWarm(argv = [], opts = {}) {
51166
51186
  // src/commands/version.ts
51167
51187
  var import_picocolors15 = __toESM(require("picocolors"));
51168
51188
  function version2() {
51169
- const v = true ? "2.75.29" : "unknown";
51189
+ const v = true ? "2.75.31" : "unknown";
51170
51190
  console.log(`${import_picocolors15.default.bold("codeam-cli")} ${import_picocolors15.default.cyan(v)}`);
51171
51191
  }
51172
51192
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "codeam-cli",
3
- "version": "2.75.29",
3
+ "version": "2.75.31",
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",