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 +12 -0
- package/dist/index.js +68 -20
- package/package.json +1 -1
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.
|
|
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.
|
|
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.
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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 =
|
|
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, [
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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",
|