codeam-cli 2.75.30 → 2.75.32
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 +49 -15
- 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.31] — 2026-09-26
|
|
8
|
+
|
|
9
|
+
### Fixed
|
|
10
|
+
|
|
11
|
+
- **cli:** Prewarm installs yarn projects' deps at session start too (#826)
|
|
12
|
+
|
|
13
|
+
## [2.75.30] — 2026-09-25
|
|
14
|
+
|
|
15
|
+
### Fixed
|
|
16
|
+
|
|
17
|
+
- **cli:** Preview error log tail without terminal escape codes (#823)
|
|
18
|
+
|
|
7
19
|
## [2.75.29] — 2026-09-25
|
|
8
20
|
|
|
9
21
|
### Fixed
|
package/dist/index.js
CHANGED
|
@@ -10516,7 +10516,7 @@ function readAnonId() {
|
|
|
10516
10516
|
}
|
|
10517
10517
|
function superProperties() {
|
|
10518
10518
|
return {
|
|
10519
|
-
cliVersion: true ? "2.75.
|
|
10519
|
+
cliVersion: true ? "2.75.32" : "0.0.0-dev",
|
|
10520
10520
|
nodeVersion: process.version,
|
|
10521
10521
|
platform: process.platform,
|
|
10522
10522
|
arch: process.arch,
|
|
@@ -10758,7 +10758,7 @@ var http = __toESM(require("http"));
|
|
|
10758
10758
|
// package.json
|
|
10759
10759
|
var package_default = {
|
|
10760
10760
|
name: "codeam-cli",
|
|
10761
|
-
version: "2.75.
|
|
10761
|
+
version: "2.75.32",
|
|
10762
10762
|
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.",
|
|
10763
10763
|
type: "commonjs",
|
|
10764
10764
|
main: "dist/index.js",
|
|
@@ -12088,7 +12088,7 @@ var CommandRelayService = class _CommandRelayService {
|
|
|
12088
12088
|
// fresh + clear the "CLI update available" banner after a self-update
|
|
12089
12089
|
// (a codespace that reinstalls @latest reconnects via heartbeat, not
|
|
12090
12090
|
// pair/reconnect). Older backends ignore the extra field.
|
|
12091
|
-
..."2.75.
|
|
12091
|
+
..."2.75.32" ? { ideVersion: "2.75.32" } : {}
|
|
12092
12092
|
};
|
|
12093
12093
|
try {
|
|
12094
12094
|
const res = await _postJson(`${API_BASE2}/api/plugin/heartbeat`, body);
|
|
@@ -21910,8 +21910,12 @@ function makePreviewHeartbeatReaffirm(deps) {
|
|
|
21910
21910
|
const now = deps.now ?? Date.now;
|
|
21911
21911
|
const intervalMs = deps.intervalMs ?? PREVIEW_REAFFIRM_INTERVAL_MS;
|
|
21912
21912
|
let lastAffirmedAt = null;
|
|
21913
|
+
let firstBeat = true;
|
|
21913
21914
|
return ({ firstAfterConnect }) => {
|
|
21914
21915
|
const current2 = deps.serving();
|
|
21916
|
+
const isFirstBeat = firstBeat;
|
|
21917
|
+
firstBeat = false;
|
|
21918
|
+
if (!current2 && isFirstBeat) deps.clearStale?.();
|
|
21915
21919
|
if (!current2) {
|
|
21916
21920
|
lastAffirmedAt = null;
|
|
21917
21921
|
return;
|
|
@@ -23925,19 +23929,36 @@ function listScriptCandidates(root) {
|
|
|
23925
23929
|
}
|
|
23926
23930
|
|
|
23927
23931
|
// src/services/preview/prewarm-deps.ts
|
|
23932
|
+
var import_which2 = __toESM(require("which"));
|
|
23928
23933
|
var inFlight = null;
|
|
23929
23934
|
var PREWARM_INSTALL_TIMEOUT_MS = 5 * 6e4;
|
|
23930
23935
|
function prewarmNodeDeps(cwd) {
|
|
23931
23936
|
if (inFlight) return inFlight;
|
|
23932
23937
|
const missing = detectMissingNodeDeps(cwd);
|
|
23933
|
-
if (!missing
|
|
23938
|
+
if (!missing) return Promise.resolve();
|
|
23934
23939
|
log.info("preview", `prewarm: installing deps (${missing.cmd} ${missing.args.join(" ")})`);
|
|
23935
23940
|
const started = Date.now();
|
|
23936
|
-
inFlight =
|
|
23937
|
-
|
|
23938
|
-
|
|
23941
|
+
inFlight = (async () => {
|
|
23942
|
+
if (missing.cmd === "yarn") {
|
|
23943
|
+
const ensured = await ensureYarnInstalled({
|
|
23944
|
+
hasYarn: async () => Boolean(await (0, import_which2.default)("yarn", { nothrow: true })),
|
|
23945
|
+
installYarn: async () => {
|
|
23946
|
+
const r2 = await runSetupCommand("npm", ["install", "-g", "yarn"], cwd, void 0, {
|
|
23947
|
+
timeoutMs: PREWARM_INSTALL_TIMEOUT_MS
|
|
23948
|
+
});
|
|
23949
|
+
return { ok: r2.status === "ok", code: r2.code };
|
|
23950
|
+
}
|
|
23951
|
+
});
|
|
23952
|
+
if (!ensured.ok) {
|
|
23953
|
+
log.info("preview", `prewarm: yarn unavailable (exit ${ensured.code}) \u2014 Preview will retry`);
|
|
23954
|
+
return;
|
|
23955
|
+
}
|
|
23956
|
+
}
|
|
23957
|
+
const r = await runSetupCommand(missing.cmd, missing.args, cwd, void 0, {
|
|
23958
|
+
timeoutMs: PREWARM_INSTALL_TIMEOUT_MS
|
|
23959
|
+
});
|
|
23939
23960
|
log.info("preview", `prewarm: deps ${r.status} after ${Date.now() - started}ms`);
|
|
23940
|
-
}).catch((err) => {
|
|
23961
|
+
})().catch((err) => {
|
|
23941
23962
|
log.info("preview", `prewarm: deps install threw (${String(err)})`);
|
|
23942
23963
|
}).finally(() => {
|
|
23943
23964
|
inFlight = null;
|
|
@@ -24086,7 +24107,7 @@ function activePreviewSessionIds() {
|
|
|
24086
24107
|
var import_child_process20 = require("child_process");
|
|
24087
24108
|
var fs43 = __toESM(require("fs"));
|
|
24088
24109
|
var path51 = __toESM(require("path"));
|
|
24089
|
-
var
|
|
24110
|
+
var import_which3 = __toESM(require("which"));
|
|
24090
24111
|
|
|
24091
24112
|
// src/services/project-env/index.ts
|
|
24092
24113
|
var import_fs6 = require("fs");
|
|
@@ -25102,7 +25123,7 @@ async function provisionDeps(ctx) {
|
|
|
25102
25123
|
if (missingDeps) {
|
|
25103
25124
|
if (missingDeps.cmd === "yarn") {
|
|
25104
25125
|
const ensured = await ensureYarnInstalled({
|
|
25105
|
-
hasYarn: async () => Boolean(await (0,
|
|
25126
|
+
hasYarn: async () => Boolean(await (0, import_which3.default)("yarn", { nothrow: true })),
|
|
25106
25127
|
installYarn: async () => {
|
|
25107
25128
|
emitProgress("SETUP_RUN", "installing yarn (not found on PATH) \u2014 npm install -g yarn");
|
|
25108
25129
|
const r = await runSetupCommand(
|
|
@@ -28047,7 +28068,9 @@ ${failure?.rawExcerpt ?? ""}`
|
|
|
28047
28068
|
});
|
|
28048
28069
|
return detection;
|
|
28049
28070
|
}
|
|
28071
|
+
var previewRequestedInProcess = false;
|
|
28050
28072
|
var requestPreviewDetectH = (ctx) => {
|
|
28073
|
+
previewRequestedInProcess = true;
|
|
28051
28074
|
if (!ctx.pluginAuthToken) {
|
|
28052
28075
|
log.info("preview", "no pluginAuthToken \u2014 skipping detect");
|
|
28053
28076
|
return;
|
|
@@ -28097,6 +28120,16 @@ function makePreviewReaffirm(args2) {
|
|
|
28097
28120
|
type: USER_EVENTS.PREVIEW_READY,
|
|
28098
28121
|
payload
|
|
28099
28122
|
});
|
|
28123
|
+
},
|
|
28124
|
+
clearStale: () => {
|
|
28125
|
+
if (previewRequestedInProcess) return;
|
|
28126
|
+
emitPreviewEvent({
|
|
28127
|
+
sessionId,
|
|
28128
|
+
pluginId: args2.pluginId,
|
|
28129
|
+
pluginAuthToken: token,
|
|
28130
|
+
type: USER_EVENTS.PREVIEW_STOPPED,
|
|
28131
|
+
payload: { reason: "restart" }
|
|
28132
|
+
});
|
|
28100
28133
|
}
|
|
28101
28134
|
});
|
|
28102
28135
|
}
|
|
@@ -28141,6 +28174,7 @@ var previewStartH = (ctx, _cmd, parsed) => {
|
|
|
28141
28174
|
void startPreviewFromDetection(ctx, rawDetection, ctx.pluginAuthToken);
|
|
28142
28175
|
};
|
|
28143
28176
|
function startPreviewFromDetection(ctx, detection, pluginAuthToken, opts = {}) {
|
|
28177
|
+
previewRequestedInProcess = true;
|
|
28144
28178
|
const emit2 = (type, payload) => {
|
|
28145
28179
|
const tagged = originPayload(payload, opts.origin) ?? {};
|
|
28146
28180
|
opts.onEvent?.(type, tagged);
|
|
@@ -48640,7 +48674,7 @@ async function autoUpgradeBeforeCriticalCommand() {
|
|
|
48640
48674
|
if (process.env.NODE_ENV === "test") return;
|
|
48641
48675
|
if (process.env.CODEAM_DISABLE_UPDATE_CHECK === "1") return;
|
|
48642
48676
|
if (process.env.CI) return;
|
|
48643
|
-
const current2 = true ? "2.75.
|
|
48677
|
+
const current2 = true ? "2.75.32" : null;
|
|
48644
48678
|
if (!current2) return;
|
|
48645
48679
|
const cache = readCache();
|
|
48646
48680
|
const fresh = cache && Date.now() - cache.fetchedAt < TTL_MS;
|
|
@@ -48657,7 +48691,7 @@ function checkForUpdates() {
|
|
|
48657
48691
|
if (process.env.CODEAM_DISABLE_UPDATE_CHECK === "1") return;
|
|
48658
48692
|
if (process.env.CI) return;
|
|
48659
48693
|
if (!process.stdout.isTTY) return;
|
|
48660
|
-
const current2 = true ? "2.75.
|
|
48694
|
+
const current2 = true ? "2.75.32" : null;
|
|
48661
48695
|
if (!current2) return;
|
|
48662
48696
|
const cache = readCache();
|
|
48663
48697
|
const fresh = cache && Date.now() - cache.fetchedAt < TTL_MS;
|
|
@@ -48680,7 +48714,7 @@ var SELF_UPDATE_INSTALL_TIMEOUT_MS = 18e4;
|
|
|
48680
48714
|
var SELF_UPDATE_LS_TIMEOUT_MS = 15e3;
|
|
48681
48715
|
var SUDO_PREFLIGHT_TIMEOUT_MS = 5e3;
|
|
48682
48716
|
function currentCliVersion() {
|
|
48683
|
-
return true ? "2.75.
|
|
48717
|
+
return true ? "2.75.32" : null;
|
|
48684
48718
|
}
|
|
48685
48719
|
async function installedVersion(deps) {
|
|
48686
48720
|
const ls = await deps.run(
|
|
@@ -50645,7 +50679,7 @@ function checkChokidar() {
|
|
|
50645
50679
|
}
|
|
50646
50680
|
async function doctor(args2 = []) {
|
|
50647
50681
|
const json = args2.includes("--json");
|
|
50648
|
-
const cliVersion = true ? "2.75.
|
|
50682
|
+
const cliVersion = true ? "2.75.32" : "0.0.0-dev";
|
|
50649
50683
|
const apiBase2 = resolveApiBaseUrl();
|
|
50650
50684
|
const diagnosticId = (0, import_node_crypto13.randomUUID)();
|
|
50651
50685
|
log.info("doctor", `run id=${diagnosticId} cli=${cliVersion}`);
|
|
@@ -51169,7 +51203,7 @@ async function mcpWarm(argv = [], opts = {}) {
|
|
|
51169
51203
|
// src/commands/version.ts
|
|
51170
51204
|
var import_picocolors15 = __toESM(require("picocolors"));
|
|
51171
51205
|
function version2() {
|
|
51172
|
-
const v = true ? "2.75.
|
|
51206
|
+
const v = true ? "2.75.32" : "unknown";
|
|
51173
51207
|
console.log(`${import_picocolors15.default.bold("codeam-cli")} ${import_picocolors15.default.cyan(v)}`);
|
|
51174
51208
|
}
|
|
51175
51209
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "codeam-cli",
|
|
3
|
-
"version": "2.75.
|
|
3
|
+
"version": "2.75.32",
|
|
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",
|