codeam-cli 2.60.38 → 2.60.40
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 +13 -0
- package/dist/index.js +55 -9
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,19 @@ 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.60.39] — 2026-07-10
|
|
8
|
+
|
|
9
|
+
### Fixed
|
|
10
|
+
|
|
11
|
+
- **cli:** Emit an 'installing' phase on first CodeRabbit link
|
|
12
|
+
|
|
13
|
+
## [2.60.38] — 2026-07-10
|
|
14
|
+
|
|
15
|
+
### Fixed
|
|
16
|
+
|
|
17
|
+
- **cli:** Time-bound CodeRabbit one-shot so a hung review can't wedge the relay
|
|
18
|
+
- **cli:** Parse real CodeRabbit --agent findings; never dump raw NDJSON
|
|
19
|
+
|
|
7
20
|
## [2.60.37] — 2026-07-10
|
|
8
21
|
|
|
9
22
|
### Fixed
|
package/dist/index.js
CHANGED
|
@@ -5689,7 +5689,7 @@ function readAnonId() {
|
|
|
5689
5689
|
}
|
|
5690
5690
|
function superProperties() {
|
|
5691
5691
|
return {
|
|
5692
|
-
cliVersion: true ? "2.60.
|
|
5692
|
+
cliVersion: true ? "2.60.40" : "0.0.0-dev",
|
|
5693
5693
|
nodeVersion: process.version,
|
|
5694
5694
|
platform: process.platform,
|
|
5695
5695
|
arch: process.arch,
|
|
@@ -5870,7 +5870,7 @@ var os4 = __toESM(require("os"));
|
|
|
5870
5870
|
// package.json
|
|
5871
5871
|
var package_default = {
|
|
5872
5872
|
name: "codeam-cli",
|
|
5873
|
-
version: "2.60.
|
|
5873
|
+
version: "2.60.40",
|
|
5874
5874
|
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.",
|
|
5875
5875
|
type: "commonjs",
|
|
5876
5876
|
main: "dist/index.js",
|
|
@@ -6963,7 +6963,7 @@ var CommandRelayService = class {
|
|
|
6963
6963
|
// fresh + clear the "CLI update available" banner after a self-update
|
|
6964
6964
|
// (a codespace that reinstalls @latest reconnects via heartbeat, not
|
|
6965
6965
|
// pair/reconnect). Older backends ignore the extra field.
|
|
6966
|
-
..."2.60.
|
|
6966
|
+
..."2.60.40" ? { ideVersion: "2.60.40" } : {}
|
|
6967
6967
|
}).then(() => log.trace("relay", `heartbeat ok online=${online}`)).catch((err) => log.trace("relay", `heartbeat failed online=${online}`, err));
|
|
6968
6968
|
}
|
|
6969
6969
|
/**
|
|
@@ -15721,6 +15721,45 @@ function defaultLoginWithApiKey(key) {
|
|
|
15721
15721
|
if (r.status !== 0) return { ok: false, error: out2.trim() || "API key authentication failed" };
|
|
15722
15722
|
return { ok: true };
|
|
15723
15723
|
}
|
|
15724
|
+
function collectChangedFiles(cwd) {
|
|
15725
|
+
const run = (args2) => {
|
|
15726
|
+
try {
|
|
15727
|
+
const r = (0, import_node_child_process15.spawnSync)("git", args2, { cwd, encoding: "utf8", timeout: 1e4 });
|
|
15728
|
+
return r.status === 0 && typeof r.stdout === "string" ? r.stdout : "";
|
|
15729
|
+
} catch {
|
|
15730
|
+
return "";
|
|
15731
|
+
}
|
|
15732
|
+
};
|
|
15733
|
+
const STATUS = {
|
|
15734
|
+
A: "added",
|
|
15735
|
+
M: "modified",
|
|
15736
|
+
D: "deleted",
|
|
15737
|
+
R: "renamed"
|
|
15738
|
+
};
|
|
15739
|
+
const byPath = /* @__PURE__ */ new Map();
|
|
15740
|
+
for (const line of run(["status", "--porcelain"]).split(/\r?\n/)) {
|
|
15741
|
+
if (!line.trim()) continue;
|
|
15742
|
+
const x = line[0];
|
|
15743
|
+
const y2 = line[1];
|
|
15744
|
+
let p2 = line.slice(3).trim();
|
|
15745
|
+
if (p2.includes(" -> ")) p2 = (p2.split(" -> ").pop() ?? p2).trim();
|
|
15746
|
+
if (p2.startsWith('"') && p2.endsWith('"')) p2 = p2.slice(1, -1);
|
|
15747
|
+
const code = x !== " " && x !== "?" ? x : y2 === "?" ? "?" : y2;
|
|
15748
|
+
const status2 = code === "?" ? "added" : STATUS[code] ?? "modified";
|
|
15749
|
+
byPath.set(p2, { path: p2, status: status2 });
|
|
15750
|
+
}
|
|
15751
|
+
for (const line of run(["--no-pager", "diff", "--numstat", "HEAD"]).split(/\r?\n/)) {
|
|
15752
|
+
const m = line.match(/^(\d+|-)\t(\d+|-)\t(.+)$/);
|
|
15753
|
+
if (!m) continue;
|
|
15754
|
+
let p2 = m[3];
|
|
15755
|
+
if (p2.includes(" => ")) p2 = p2.replace(/.*\{.*? => (.*?)\}.*/, "$1").replace(/.* => /, "");
|
|
15756
|
+
const cur = byPath.get(p2) ?? { path: p2, status: "modified" };
|
|
15757
|
+
cur.additions = m[1] === "-" ? void 0 : Number(m[1]);
|
|
15758
|
+
cur.deletions = m[2] === "-" ? void 0 : Number(m[2]);
|
|
15759
|
+
byPath.set(p2, cur);
|
|
15760
|
+
}
|
|
15761
|
+
return [...byPath.values()];
|
|
15762
|
+
}
|
|
15724
15763
|
async function configureCoderabbit(input, deps = {}) {
|
|
15725
15764
|
const os50 = deps.os ?? createOsStrategy();
|
|
15726
15765
|
const ensureInstalled = deps.ensureInstalled ?? ensureCoderabbitInstalled;
|
|
@@ -15774,6 +15813,7 @@ async function configureCoderabbit(input, deps = {}) {
|
|
|
15774
15813
|
if (input.action === "link_oauth") {
|
|
15775
15814
|
const res2 = base();
|
|
15776
15815
|
if (!installed) {
|
|
15816
|
+
deps.onEvent?.({ kind: "installing" });
|
|
15777
15817
|
const ok = await ensureInstalled(os50);
|
|
15778
15818
|
res2.installed = ok;
|
|
15779
15819
|
if (!ok) return { ...res2, error: "CodeRabbit CLI could not be installed" };
|
|
@@ -15817,10 +15857,16 @@ async function configureCoderabbit(input, deps = {}) {
|
|
|
15817
15857
|
}
|
|
15818
15858
|
if (!deps.runReview) return { ...res, error: "No reviewer available" };
|
|
15819
15859
|
const out2 = await deps.runReview(input.review ?? {});
|
|
15860
|
+
const files = collectChangedFiles(process.cwd());
|
|
15820
15861
|
return {
|
|
15821
15862
|
...res,
|
|
15822
15863
|
loggedIn: true,
|
|
15823
|
-
review: {
|
|
15864
|
+
review: {
|
|
15865
|
+
markdown: out2.markdown,
|
|
15866
|
+
hunks: out2.hunks,
|
|
15867
|
+
stats: out2.stats,
|
|
15868
|
+
...files.length > 0 ? { files } : {}
|
|
15869
|
+
},
|
|
15824
15870
|
...out2.stats && typeof out2.stats.error === "string" ? { error: String(out2.stats.error) } : {}
|
|
15825
15871
|
};
|
|
15826
15872
|
}
|
|
@@ -17368,7 +17414,7 @@ async function autoUpgradeBeforeCriticalCommand() {
|
|
|
17368
17414
|
if (process.env.NODE_ENV === "test") return;
|
|
17369
17415
|
if (process.env.CODEAM_DISABLE_UPDATE_CHECK === "1") return;
|
|
17370
17416
|
if (process.env.CI) return;
|
|
17371
|
-
const current = true ? "2.60.
|
|
17417
|
+
const current = true ? "2.60.40" : null;
|
|
17372
17418
|
if (!current) return;
|
|
17373
17419
|
const cache = readCache();
|
|
17374
17420
|
const fresh = cache && Date.now() - cache.fetchedAt < TTL_MS;
|
|
@@ -17385,7 +17431,7 @@ function checkForUpdates() {
|
|
|
17385
17431
|
if (process.env.CODEAM_DISABLE_UPDATE_CHECK === "1") return;
|
|
17386
17432
|
if (process.env.CI) return;
|
|
17387
17433
|
if (!process.stdout.isTTY) return;
|
|
17388
|
-
const current = true ? "2.60.
|
|
17434
|
+
const current = true ? "2.60.40" : null;
|
|
17389
17435
|
if (!current) return;
|
|
17390
17436
|
const cache = readCache();
|
|
17391
17437
|
const fresh = cache && Date.now() - cache.fetchedAt < TTL_MS;
|
|
@@ -17405,7 +17451,7 @@ var SELF_UPDATE_INTERVAL_MS = 60 * 60 * 1e3;
|
|
|
17405
17451
|
var SELF_UPDATE_VIEW_TIMEOUT_MS = 3e4;
|
|
17406
17452
|
var SELF_UPDATE_INSTALL_TIMEOUT_MS = 18e4;
|
|
17407
17453
|
function currentCliVersion() {
|
|
17408
|
-
return true ? "2.60.
|
|
17454
|
+
return true ? "2.60.40" : null;
|
|
17409
17455
|
}
|
|
17410
17456
|
function runCmd(cmd, args2, timeoutMs) {
|
|
17411
17457
|
return new Promise((resolve7) => {
|
|
@@ -34465,7 +34511,7 @@ function checkChokidar() {
|
|
|
34465
34511
|
}
|
|
34466
34512
|
async function doctor(args2 = []) {
|
|
34467
34513
|
const json = args2.includes("--json");
|
|
34468
|
-
const cliVersion = true ? "2.60.
|
|
34514
|
+
const cliVersion = true ? "2.60.40" : "0.0.0-dev";
|
|
34469
34515
|
const apiBase2 = resolveApiBaseUrl();
|
|
34470
34516
|
const diagnosticId = (0, import_node_crypto12.randomUUID)();
|
|
34471
34517
|
log.info("doctor", `run id=${diagnosticId} cli=${cliVersion}`);
|
|
@@ -34664,7 +34710,7 @@ async function completion(args2) {
|
|
|
34664
34710
|
// src/commands/version.ts
|
|
34665
34711
|
var import_picocolors15 = __toESM(require("picocolors"));
|
|
34666
34712
|
function version2() {
|
|
34667
|
-
const v = true ? "2.60.
|
|
34713
|
+
const v = true ? "2.60.40" : "unknown";
|
|
34668
34714
|
console.log(`${import_picocolors15.default.bold("codeam-cli")} ${import_picocolors15.default.cyan(v)}`);
|
|
34669
34715
|
}
|
|
34670
34716
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "codeam-cli",
|
|
3
|
-
"version": "2.60.
|
|
3
|
+
"version": "2.60.40",
|
|
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",
|