codeam-cli 2.39.40 → 2.39.41

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,12 @@ 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.39.40] — 2026-06-19
8
+
9
+ ### Added
10
+
11
+ - **cli:** Run named preview tunnel via token, fallback to quick tunnel
12
+
7
13
  ## [2.39.39] — 2026-06-19
8
14
 
9
15
  ### Fixed
package/dist/index.js CHANGED
@@ -498,7 +498,7 @@ var import_qrcode_terminal = __toESM(require("qrcode-terminal"));
498
498
  // package.json
499
499
  var package_default = {
500
500
  name: "codeam-cli",
501
- version: "2.39.40",
501
+ version: "2.39.41",
502
502
  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.",
503
503
  type: "commonjs",
504
504
  main: "dist/index.js",
@@ -5908,7 +5908,7 @@ function readAnonId() {
5908
5908
  }
5909
5909
  function superProperties() {
5910
5910
  return {
5911
- cliVersion: true ? "2.39.40" : "0.0.0-dev",
5911
+ cliVersion: true ? "2.39.41" : "0.0.0-dev",
5912
5912
  nodeVersion: process.version,
5913
5913
  platform: process.platform,
5914
5914
  arch: process.arch,
@@ -15260,6 +15260,7 @@ var os28 = __toESM(require("os"));
15260
15260
  var path42 = __toESM(require("path"));
15261
15261
  var import_crypto3 = require("crypto");
15262
15262
  var import_child_process19 = require("child_process");
15263
+ var import_which2 = __toESM(require("which"));
15263
15264
 
15264
15265
  // src/lib/payload.ts
15265
15266
  var import_zod = require("zod");
@@ -16953,6 +16954,12 @@ function detectMissingNodeDeps(cwd) {
16953
16954
  }
16954
16955
  return { cmd: "npm", args: ["install", "--legacy-peer-deps"] };
16955
16956
  }
16957
+ async function ensureYarnInstalled(deps) {
16958
+ if (await deps.hasYarn()) return { ok: true, code: 0 };
16959
+ const res = await deps.installYarn();
16960
+ if (!res.ok) return res;
16961
+ return await deps.hasYarn() ? { ok: true, code: 0 } : { ok: false, code: res.code };
16962
+ }
16956
16963
  function isJsInstallCommand(cmd, args2) {
16957
16964
  const known = ["npm", "pnpm", "yarn", "bun"];
16958
16965
  if (!known.includes(cmd)) return false;
@@ -18958,6 +18965,35 @@ var previewStartH = (ctx, _cmd, parsed) => {
18958
18965
  const missingDeps = detectMissingNodeDeps(process.cwd());
18959
18966
  let preflightRan = false;
18960
18967
  if (missingDeps) {
18968
+ if (missingDeps.cmd === "yarn") {
18969
+ const ensured = await ensureYarnInstalled({
18970
+ hasYarn: async () => Boolean(await (0, import_which2.default)("yarn", { nothrow: true })),
18971
+ installYarn: async () => {
18972
+ emitProgress("SETUP_RUN", "installing yarn (not found on PATH) \u2014 npm install -g yarn");
18973
+ const r = await runSetupCommand(
18974
+ "npm",
18975
+ ["install", "-g", "yarn"],
18976
+ process.cwd(),
18977
+ detection.env,
18978
+ { timeoutMs: INSTALL_TIMEOUT_MS }
18979
+ );
18980
+ return { ok: r.status === "ok", code: r.code };
18981
+ }
18982
+ });
18983
+ if (!ensured.ok) {
18984
+ void postPreviewEvent({
18985
+ sessionId: ctx.sessionId,
18986
+ pluginId: ctx.pluginId,
18987
+ pluginAuthToken,
18988
+ type: "preview_error",
18989
+ payload: {
18990
+ stage: "spawn",
18991
+ message: `This project uses yarn but yarn isn't installed, and installing it automatically failed (npm install -g yarn, exit ${ensured.code}). Install yarn in this environment and try the preview again.`
18992
+ }
18993
+ });
18994
+ return;
18995
+ }
18996
+ }
18961
18997
  emitProgress(
18962
18998
  "SETUP_RUN",
18963
18999
  `${missingDeps.cmd} ${missingDeps.args.join(" ")} (pre-flight \u2014 node_modules missing)`
@@ -27240,7 +27276,7 @@ function checkChokidar() {
27240
27276
  }
27241
27277
  async function doctor(args2 = []) {
27242
27278
  const json = args2.includes("--json");
27243
- const cliVersion = true ? "2.39.40" : "0.0.0-dev";
27279
+ const cliVersion = true ? "2.39.41" : "0.0.0-dev";
27244
27280
  const apiBase2 = resolveApiBaseUrl();
27245
27281
  const diagnosticId = (0, import_node_crypto8.randomUUID)();
27246
27282
  log.info("doctor", `run id=${diagnosticId} cli=${cliVersion}`);
@@ -27439,7 +27475,7 @@ async function completion(args2) {
27439
27475
  // src/commands/version.ts
27440
27476
  var import_picocolors13 = __toESM(require("picocolors"));
27441
27477
  function version2() {
27442
- const v = true ? "2.39.40" : "unknown";
27478
+ const v = true ? "2.39.41" : "unknown";
27443
27479
  console.log(`${import_picocolors13.default.bold("codeam-cli")} ${import_picocolors13.default.cyan(v)}`);
27444
27480
  }
27445
27481
 
@@ -27725,7 +27761,7 @@ function checkForUpdates() {
27725
27761
  if (process.env.CODEAM_DISABLE_UPDATE_CHECK === "1") return;
27726
27762
  if (process.env.CI) return;
27727
27763
  if (!process.stdout.isTTY) return;
27728
- const current = true ? "2.39.40" : null;
27764
+ const current = true ? "2.39.41" : null;
27729
27765
  if (!current) return;
27730
27766
  const cache = readCache();
27731
27767
  const fresh = cache && Date.now() - cache.fetchedAt < TTL_MS;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "codeam-cli",
3
- "version": "2.39.40",
3
+ "version": "2.39.41",
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",