codeam-cli 2.75.38 → 2.75.39

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.75.38] — 2026-09-27
8
+
9
+ ### Fixed
10
+
11
+ - **cli:** Beads never commits to the user's repo (bd init --stealth) (#844)
12
+
7
13
  ## [2.75.37] — 2026-09-27
8
14
 
9
15
  ### 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.38" : "0.0.0-dev",
10532
+ cliVersion: true ? "2.75.39" : "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.38",
10774
+ version: "2.75.39",
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.38" ? { ideVersion: "2.75.38" } : {}
12104
+ ..."2.75.39" ? { ideVersion: "2.75.39" } : {}
12105
12105
  };
12106
12106
  try {
12107
12107
  const res = await _postJson(`${API_BASE2}/api/plugin/heartbeat`, body);
@@ -12436,6 +12436,10 @@ function isUnsafeWindowsWatchRoot(dir, homedir53) {
12436
12436
  }
12437
12437
  return false;
12438
12438
  }
12439
+ function isFilesystemRoot(dir) {
12440
+ const resolved = path5.resolve(dir);
12441
+ return resolved === path5.parse(resolved).root;
12442
+ }
12439
12443
  var _chokidarSeam = {
12440
12444
  load: () => {
12441
12445
  try {
@@ -12520,6 +12524,13 @@ var FileWatcherService = class {
12520
12524
  if (this.stopped) {
12521
12525
  throw new Error("FileWatcherService has already been stopped \u2014 re-instantiate to restart.");
12522
12526
  }
12527
+ if (isFilesystemRoot(this.opts.workingDir)) {
12528
+ log.warn(
12529
+ "fileWatcher",
12530
+ `refusing to watch ${this.opts.workingDir} \u2014 the filesystem root. Run codeam from your project folder to enable file change emission.`
12531
+ );
12532
+ return;
12533
+ }
12523
12534
  const isWin = process.platform === "win32";
12524
12535
  if (isWin && isUnsafeWindowsWatchRoot(this.opts.workingDir, os5.homedir())) {
12525
12536
  log.warn(
@@ -33098,13 +33109,13 @@ var ConnectionBuilder = class {
33098
33109
  /**
33099
33110
  * Adds a typed request handler for one method.
33100
33111
  */
33101
- onReceiveRequest(method, parse, handler) {
33112
+ onReceiveRequest(method, parse2, handler) {
33102
33113
  return this.withHandler({
33103
33114
  handleMessage: async (message, cx) => {
33104
33115
  if (message.kind !== "request" || message.method !== method) {
33105
33116
  return Handled.no(message);
33106
33117
  }
33107
- const request2 = parse(message.params);
33118
+ const request2 = parse2(message.params);
33108
33119
  return await handler(request2, message.responder, cx) ?? Handled.yes();
33109
33120
  },
33110
33121
  describe: () => `${this.connectionName ?? "request"}:${method}`
@@ -33113,13 +33124,13 @@ var ConnectionBuilder = class {
33113
33124
  /**
33114
33125
  * Adds a typed notification handler for one method.
33115
33126
  */
33116
- onReceiveNotification(method, parse, handler) {
33127
+ onReceiveNotification(method, parse2, handler) {
33117
33128
  return this.withHandler({
33118
33129
  handleMessage: async (message, cx) => {
33119
33130
  if (message.kind !== "notification" || message.method !== method) {
33120
33131
  return Handled.no(message);
33121
33132
  }
33122
- const notification = parse(message.params);
33133
+ const notification = parse2(message.params);
33123
33134
  return await handler(notification, cx) ?? Handled.yes();
33124
33135
  },
33125
33136
  describe: () => `${this.connectionName ?? "notification"}:${method}`
@@ -48344,9 +48355,9 @@ function fileSessionChildStore(file = hostSessionStatePath()) {
48344
48355
  load() {
48345
48356
  try {
48346
48357
  const raw = JSON.parse(fs77.readFileSync(file, "utf8"));
48347
- return Array.isArray(raw?.sessions) ? raw.sessions.filter(isRecord5) : [];
48358
+ return Array.isArray(raw?.sessions) ? raw.sessions.filter(isRecord5) : null;
48348
48359
  } catch {
48349
- return [];
48360
+ return null;
48350
48361
  }
48351
48362
  },
48352
48363
  save(list) {
@@ -48835,7 +48846,7 @@ async function autoUpgradeBeforeCriticalCommand() {
48835
48846
  if (process.env.NODE_ENV === "test") return;
48836
48847
  if (process.env.CODEAM_DISABLE_UPDATE_CHECK === "1") return;
48837
48848
  if (process.env.CI) return;
48838
- const current2 = true ? "2.75.38" : null;
48849
+ const current2 = true ? "2.75.39" : null;
48839
48850
  if (!current2) return;
48840
48851
  const cache = readCache();
48841
48852
  const fresh = cache && Date.now() - cache.fetchedAt < TTL_MS;
@@ -48852,7 +48863,7 @@ function checkForUpdates() {
48852
48863
  if (process.env.CODEAM_DISABLE_UPDATE_CHECK === "1") return;
48853
48864
  if (process.env.CI) return;
48854
48865
  if (!process.stdout.isTTY) return;
48855
- const current2 = true ? "2.75.38" : null;
48866
+ const current2 = true ? "2.75.39" : null;
48856
48867
  if (!current2) return;
48857
48868
  const cache = readCache();
48858
48869
  const fresh = cache && Date.now() - cache.fetchedAt < TTL_MS;
@@ -48875,7 +48886,7 @@ var SELF_UPDATE_INSTALL_TIMEOUT_MS = 18e4;
48875
48886
  var SELF_UPDATE_LS_TIMEOUT_MS = 15e3;
48876
48887
  var SUDO_PREFLIGHT_TIMEOUT_MS = 5e3;
48877
48888
  function currentCliVersion() {
48878
- return true ? "2.75.38" : null;
48889
+ return true ? "2.75.39" : null;
48879
48890
  }
48880
48891
  async function installedVersion(deps) {
48881
48892
  const ls = await deps.run(
@@ -50149,11 +50160,12 @@ var HostAgentSupervisor = class {
50149
50160
  try {
50150
50161
  if (this.children.size > 0) return;
50151
50162
  const records = this.sessionStore.load();
50152
- if (records.length === 0) {
50163
+ if (records === null) {
50153
50164
  const target = this.fallbackResumeTarget();
50154
50165
  if (target) this.resumeOne(target);
50155
50166
  return;
50156
50167
  }
50168
+ if (records.length === 0) return;
50157
50169
  const max = resolveMaxResumeSessions();
50158
50170
  const { resume, dropped } = planSessionResume(records, max);
50159
50171
  for (const rec of dropped) {
@@ -50201,6 +50213,13 @@ var HostAgentSupervisor = class {
50201
50213
  const session = getActiveSession();
50202
50214
  if (!session || !session.pluginId || !session.pollSecret || !session.agent) return null;
50203
50215
  const cwd = session.cwd && fs80.existsSync(session.cwd) ? session.cwd : process.cwd();
50216
+ if (isFilesystemRoot(cwd)) {
50217
+ log.warn(
50218
+ "host-agent",
50219
+ `resume: skipping session ${session.id.slice(0, 8)} \u2014 it has no saved workspace and the fallback is the filesystem root`
50220
+ );
50221
+ return null;
50222
+ }
50204
50223
  const deployId = deployIdFromWorkspace(session.cwd) ?? session.id;
50205
50224
  return { deployId, cwd, session };
50206
50225
  }
@@ -50272,7 +50291,7 @@ var HostAgentSupervisor = class {
50272
50291
  */
50273
50292
  knownSavedSessions() {
50274
50293
  try {
50275
- const persisted = new Map(this.sessionStore.load().map((r) => [r.deployId, r.agent]));
50294
+ const persisted = new Map((this.sessionStore.load() ?? []).map((r) => [r.deployId, r.agent]));
50276
50295
  for (const c2 of this.children.values()) persisted.set(c2.deployId, c2.agent);
50277
50296
  return this.listSavedSessions().map((s) => ({ s, deployId: deployIdFromWorkspace(s.cwd) })).filter(
50278
50297
  (x) => x.deployId !== null && !!x.s.cwd && fs80.existsSync(x.s.cwd)
@@ -50843,7 +50862,7 @@ function checkChokidar() {
50843
50862
  }
50844
50863
  async function doctor(args2 = []) {
50845
50864
  const json = args2.includes("--json");
50846
- const cliVersion = true ? "2.75.38" : "0.0.0-dev";
50865
+ const cliVersion = true ? "2.75.39" : "0.0.0-dev";
50847
50866
  const apiBase2 = resolveApiBaseUrl();
50848
50867
  const diagnosticId = (0, import_node_crypto13.randomUUID)();
50849
50868
  log.info("doctor", `run id=${diagnosticId} cli=${cliVersion}`);
@@ -51367,7 +51386,7 @@ async function mcpWarm(argv = [], opts = {}) {
51367
51386
  // src/commands/version.ts
51368
51387
  var import_picocolors15 = __toESM(require("picocolors"));
51369
51388
  function version2() {
51370
- const v = true ? "2.75.38" : "unknown";
51389
+ const v = true ? "2.75.39" : "unknown";
51371
51390
  console.log(`${import_picocolors15.default.bold("codeam-cli")} ${import_picocolors15.default.cyan(v)}`);
51372
51391
  }
51373
51392
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "codeam-cli",
3
- "version": "2.75.38",
3
+ "version": "2.75.39",
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",