codeam-cli 2.75.36 → 2.75.38

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.37] — 2026-09-27
8
+
9
+ ### Fixed
10
+
11
+ - **cli:** The review lists files, not new folders; skip sockets and beads state (#839)
12
+
13
+ ## [2.75.36] — 2026-09-26
14
+
15
+ ### Fixed
16
+
17
+ - **cli:** A host restarts onto an update unless a session is actually mid-turn (#836)
18
+
7
19
  ## [2.75.35] — 2026-09-26
8
20
 
9
21
  ### Fixed
package/dist/index.js CHANGED
@@ -10529,7 +10529,7 @@ function readAnonId() {
10529
10529
  }
10530
10530
  function superProperties() {
10531
10531
  return {
10532
- cliVersion: true ? "2.75.36" : "0.0.0-dev",
10532
+ cliVersion: true ? "2.75.38" : "0.0.0-dev",
10533
10533
  nodeVersion: process.version,
10534
10534
  platform: process.platform,
10535
10535
  arch: process.arch,
@@ -10771,7 +10771,7 @@ var http = __toESM(require("http"));
10771
10771
  // package.json
10772
10772
  var package_default = {
10773
10773
  name: "codeam-cli",
10774
- version: "2.75.36",
10774
+ version: "2.75.38",
10775
10775
  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.",
10776
10776
  type: "commonjs",
10777
10777
  main: "dist/index.js",
@@ -12101,7 +12101,7 @@ var CommandRelayService = class _CommandRelayService {
12101
12101
  // fresh + clear the "CLI update available" banner after a self-update
12102
12102
  // (a codespace that reinstalls @latest reconnects via heartbeat, not
12103
12103
  // pair/reconnect). Older backends ignore the extra field.
12104
- ..."2.75.36" ? { ideVersion: "2.75.36" } : {}
12104
+ ..."2.75.38" ? { ideVersion: "2.75.38" } : {}
12105
12105
  };
12106
12106
  try {
12107
12107
  const res = await _postJson(`${API_BASE2}/api/plugin/heartbeat`, body);
@@ -20458,14 +20458,14 @@ function defaultSdkDir() {
20458
20458
  return resolveSdkDirViaRequire();
20459
20459
  }
20460
20460
  function resolveClaudeNativeBinary(deps = {}) {
20461
- const existsSync31 = deps.existsSync ?? import_fs.default.existsSync;
20461
+ const existsSync32 = deps.existsSync ?? import_fs.default.existsSync;
20462
20462
  const platformKey = deps.platformKey ?? currentPlatformKey();
20463
20463
  const sdkDir = deps.sdkDir !== void 0 ? deps.sdkDir : defaultSdkDir();
20464
20464
  if (!sdkDir) return null;
20465
20465
  const scopeDir = import_path4.default.dirname(sdkDir);
20466
20466
  const binName = platformKey.startsWith("win32-") ? "claude.exe" : "claude";
20467
20467
  const candidate = import_path4.default.join(scopeDir, `claude-agent-sdk-${platformKey}`, binName);
20468
- return existsSync31(candidate) ? candidate : null;
20468
+ return existsSync32(candidate) ? candidate : null;
20469
20469
  }
20470
20470
  var realSleep = (ms) => new Promise((resolve12) => setTimeout(resolve12, ms));
20471
20471
  async function waitForClaudeNativeBinary(opts = {}) {
@@ -20547,18 +20547,18 @@ function augmentUserLocalBinPaths(deps = {}) {
20547
20547
  env.PATH = [...additions, ...parts].join(p2.delimiter);
20548
20548
  }
20549
20549
  function resolveCursorAgentBinary(deps = {}) {
20550
- const existsSync31 = deps.existsSync ?? import_fs.default.existsSync;
20550
+ const existsSync32 = deps.existsSync ?? import_fs.default.existsSync;
20551
20551
  const platform3 = deps.platform ?? process.platform;
20552
20552
  const env = deps.env ?? process.env;
20553
20553
  if (platform3 === "win32") {
20554
20554
  const localAppData = env.LOCALAPPDATA;
20555
20555
  if (!localAppData) return null;
20556
20556
  const exe = import_path4.default.win32.join(localAppData, "cursor-agent", "cursor-agent.exe");
20557
- return existsSync31(exe) ? exe : null;
20557
+ return existsSync32(exe) ? exe : null;
20558
20558
  }
20559
20559
  const home = deps.homedir ?? import_os4.default.homedir();
20560
20560
  const unix = import_path4.default.posix.join(home, ".local", "bin", "cursor-agent");
20561
- return existsSync31(unix) ? unix : null;
20561
+ return existsSync32(unix) ? unix : null;
20562
20562
  }
20563
20563
  async function waitForCursorAgent(opts = {}) {
20564
20564
  const timeoutMs = opts.timeoutMs ?? 18e4;
@@ -26214,7 +26214,14 @@ async function provisionBeads(opts = {}) {
26214
26214
  "--shared-server",
26215
26215
  "--skip-agents",
26216
26216
  "--skip-hooks",
26217
- "--non-interactive"
26217
+ "--non-interactive",
26218
+ // ⚠️ Without it `bd init` COMMITS ("bd init: initialize beads issue
26219
+ // tracking") on whatever branch the user's repo is on — verified with bd
26220
+ // 1.0.5 on a scratch repo, and seen on a fleet box's feature branch
26221
+ // (break-it 2026-09-24/26). Stealth keeps beads out of git: it only writes
26222
+ // `.git/info/exclude` (local, never committed); the global git config was
26223
+ // verified untouched.
26224
+ "--stealth"
26218
26225
  ]);
26219
26226
  const alreadyInit = /already initialized|already exists/i.test(init.stderr + init.stdout);
26220
26227
  if (init.code !== 0 && !alreadyInit) {
@@ -26222,6 +26229,8 @@ async function provisionBeads(opts = {}) {
26222
26229
  return result;
26223
26230
  }
26224
26231
  result.initialized = true;
26232
+ const workdir = opts.cwd ?? process.cwd();
26233
+ ensureLocalGitExclude(findRepoRoot(workdir) ?? workdir, [".beads/", ".dolt/"]);
26225
26234
  const server = await _provisionSeam.ensureSharedServer(bd);
26226
26235
  result.serverUp = server.up;
26227
26236
  if (!server.up) {
@@ -26264,7 +26273,8 @@ async function provisionBeads(opts = {}) {
26264
26273
  // `git push` on a box without git-lfs (fleet box 2026-09-24).
26265
26274
  "--skip-agents",
26266
26275
  "--skip-hooks",
26267
- "--non-interactive"
26276
+ "--non-interactive",
26277
+ "--stealth"
26268
26278
  ]);
26269
26279
  if (mint.code !== 0) {
26270
26280
  log.warn(
@@ -26335,6 +26345,23 @@ function dedupeRecipes(agents) {
26335
26345
  }
26336
26346
  return [...seen2];
26337
26347
  }
26348
+ function ensureLocalGitExclude(cwd, patterns) {
26349
+ try {
26350
+ const gitDir = path54.join(cwd, ".git");
26351
+ if (!fs46.statSync(gitDir).isDirectory()) return;
26352
+ const file = path54.join(gitDir, "info", "exclude");
26353
+ fs46.mkdirSync(path54.dirname(file), { recursive: true });
26354
+ const current2 = fs46.existsSync(file) ? fs46.readFileSync(file, "utf8") : "";
26355
+ const have = new Set(current2.split(/\r?\n/).map((l) => l.trim()));
26356
+ const missing = patterns.filter((p2) => !have.has(p2));
26357
+ if (missing.length === 0) return;
26358
+ const prefix = current2.length > 0 && !current2.endsWith("\n") ? "\n" : "";
26359
+ fs46.appendFileSync(file, `${prefix}# CodeAgent: beads state stays local
26360
+ ${missing.join("\n")}
26361
+ `);
26362
+ } catch {
26363
+ }
26364
+ }
26338
26365
 
26339
26366
  // src/beads/watcher.ts
26340
26367
  var crypto4 = __toESM(require("crypto"));
@@ -27620,7 +27647,7 @@ var STALE_STAGING_AGE_MS = CLI_UPDATE_INSTALL_TIMEOUT_MS;
27620
27647
  function sweepStaleCliStagingDirs(nodeModulesDir, now = Date.now(), deps) {
27621
27648
  if (!nodeModulesDir) return 0;
27622
27649
  const readdirSync14 = deps?.readdirSync ?? fs51.readdirSync;
27623
- const statSync15 = deps?.statSync ?? fs51.statSync;
27650
+ const statSync16 = deps?.statSync ?? fs51.statSync;
27624
27651
  const rmSync10 = deps?.rmSync ?? fs51.rmSync;
27625
27652
  let removed = 0;
27626
27653
  let entries;
@@ -27633,7 +27660,7 @@ function sweepStaleCliStagingDirs(nodeModulesDir, now = Date.now(), deps) {
27633
27660
  if (!/^\.codeam-cli-/.test(name)) continue;
27634
27661
  const full = path59.join(nodeModulesDir, name);
27635
27662
  try {
27636
- const st3 = statSync15(full);
27663
+ const st3 = statSync16(full);
27637
27664
  if (now - st3.mtimeMs < STALE_STAGING_AGE_MS) continue;
27638
27665
  rmSync10(full, { recursive: true, force: true });
27639
27666
  removed++;
@@ -37725,6 +37752,7 @@ var import_crypto4 = require("crypto");
37725
37752
  // src/services/turn-files/git-changeset.ts
37726
37753
  var import_child_process29 = require("child_process");
37727
37754
  var fs63 = __toESM(require("fs/promises"));
37755
+ var import_fs7 = require("fs");
37728
37756
  var path74 = __toESM(require("path"));
37729
37757
 
37730
37758
  // src/services/turn-files/review-ignore.ts
@@ -37764,7 +37792,12 @@ var CURATED_REVIEW_IGNORE = [
37764
37792
  "awscli/",
37765
37793
  // CodeAgent's own runtime prefixes (never a user change).
37766
37794
  ".codeam/",
37767
- "codeam-node20/"
37795
+ "codeam-node20/",
37796
+ // Beads (issue tracker + agent memory) and its Dolt store — our tooling's
37797
+ // state, written on every bd op; it showed up as `.beads/issues.jsonl` in
37798
+ // the user's review (break-it 2026-09-26).
37799
+ ".beads/",
37800
+ ".dolt/"
37768
37801
  ];
37769
37802
  function makeReviewIgnore(repoRoot) {
37770
37803
  const ig = (0, import_ignore2.default)().add(CURATED_REVIEW_IGNORE);
@@ -37786,7 +37819,12 @@ function makeReviewIgnore(repoRoot) {
37786
37819
 
37787
37820
  // src/services/turn-files/git-changeset.ts
37788
37821
  async function collectRepoChangeset(opts) {
37789
- const status2 = await runGit3(opts.repoRoot, ["status", "--porcelain=v1", "-z"]);
37822
+ const status2 = await runGit3(opts.repoRoot, [
37823
+ "status",
37824
+ "--porcelain=v1",
37825
+ "-z",
37826
+ "--untracked-files=all"
37827
+ ]);
37790
37828
  if (status2 === null) return null;
37791
37829
  const numstatRaw = await runGit3(opts.repoRoot, [
37792
37830
  "diff",
@@ -37797,7 +37835,9 @@ async function collectRepoChangeset(opts) {
37797
37835
  const numstat = parseNumstat(numstatRaw ?? "");
37798
37836
  const reviewIgnore = makeReviewIgnore(opts.repoRoot);
37799
37837
  const rows = parseStatus(status2).filter(
37800
- (row) => !isIgnoredFilePath(row.filePath) && !reviewIgnore(row.filePath)
37838
+ (row) => !isIgnoredFilePath(row.filePath) && !reviewIgnore(row.filePath) && // A socket, FIFO or device node is never a change to review (a
37839
+ // `cc-socks/1522.sock` reached the Files tab).
37840
+ isReviewablePath(path74.join(opts.repoRoot, row.filePath))
37801
37841
  );
37802
37842
  const MAX_CHANGESET_FILES = Math.max(1, Number(process.env.CODEAM_MAX_CHANGESET_FILES ?? 500));
37803
37843
  const truncated = rows.length > MAX_CHANGESET_FILES;
@@ -37969,6 +38009,14 @@ async function discoverRepos(workingDir, maxDepth = 4) {
37969
38009
  }
37970
38010
  }
37971
38011
  }
38012
+ function isReviewablePath(absPath) {
38013
+ try {
38014
+ const st3 = (0, import_fs7.lstatSync)(absPath);
38015
+ return st3.isFile() || st3.isSymbolicLink();
38016
+ } catch {
38017
+ return true;
38018
+ }
38019
+ }
37972
38020
 
37973
38021
  // src/services/turn-files/files-outbox.ts
37974
38022
  var fs64 = __toESM(require("fs/promises"));
@@ -48787,7 +48835,7 @@ async function autoUpgradeBeforeCriticalCommand() {
48787
48835
  if (process.env.NODE_ENV === "test") return;
48788
48836
  if (process.env.CODEAM_DISABLE_UPDATE_CHECK === "1") return;
48789
48837
  if (process.env.CI) return;
48790
- const current2 = true ? "2.75.36" : null;
48838
+ const current2 = true ? "2.75.38" : null;
48791
48839
  if (!current2) return;
48792
48840
  const cache = readCache();
48793
48841
  const fresh = cache && Date.now() - cache.fetchedAt < TTL_MS;
@@ -48804,7 +48852,7 @@ function checkForUpdates() {
48804
48852
  if (process.env.CODEAM_DISABLE_UPDATE_CHECK === "1") return;
48805
48853
  if (process.env.CI) return;
48806
48854
  if (!process.stdout.isTTY) return;
48807
- const current2 = true ? "2.75.36" : null;
48855
+ const current2 = true ? "2.75.38" : null;
48808
48856
  if (!current2) return;
48809
48857
  const cache = readCache();
48810
48858
  const fresh = cache && Date.now() - cache.fetchedAt < TTL_MS;
@@ -48827,7 +48875,7 @@ var SELF_UPDATE_INSTALL_TIMEOUT_MS = 18e4;
48827
48875
  var SELF_UPDATE_LS_TIMEOUT_MS = 15e3;
48828
48876
  var SUDO_PREFLIGHT_TIMEOUT_MS = 5e3;
48829
48877
  function currentCliVersion() {
48830
- return true ? "2.75.36" : null;
48878
+ return true ? "2.75.38" : null;
48831
48879
  }
48832
48880
  async function installedVersion(deps) {
48833
48881
  const ls = await deps.run(
@@ -50795,7 +50843,7 @@ function checkChokidar() {
50795
50843
  }
50796
50844
  async function doctor(args2 = []) {
50797
50845
  const json = args2.includes("--json");
50798
- const cliVersion = true ? "2.75.36" : "0.0.0-dev";
50846
+ const cliVersion = true ? "2.75.38" : "0.0.0-dev";
50799
50847
  const apiBase2 = resolveApiBaseUrl();
50800
50848
  const diagnosticId = (0, import_node_crypto13.randomUUID)();
50801
50849
  log.info("doctor", `run id=${diagnosticId} cli=${cliVersion}`);
@@ -51319,7 +51367,7 @@ async function mcpWarm(argv = [], opts = {}) {
51319
51367
  // src/commands/version.ts
51320
51368
  var import_picocolors15 = __toESM(require("picocolors"));
51321
51369
  function version2() {
51322
- const v = true ? "2.75.36" : "unknown";
51370
+ const v = true ? "2.75.38" : "unknown";
51323
51371
  console.log(`${import_picocolors15.default.bold("codeam-cli")} ${import_picocolors15.default.cyan(v)}`);
51324
51372
  }
51325
51373
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "codeam-cli",
3
- "version": "2.75.36",
3
+ "version": "2.75.38",
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",