codeam-cli 2.75.27 → 2.75.28
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 +6 -0
- package/dist/index.js +49 -13
- package/package.json +1 -1
- package/dist/postinstall.js +0 -33
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.27] — 2026-09-25
|
|
8
|
+
|
|
9
|
+
### Fixed
|
|
10
|
+
|
|
11
|
+
- **cli:** On-demand Box session resume, link reporting, per-boot logs, MCP secrets off argv (#818)
|
|
12
|
+
|
|
7
13
|
## [2.75.26] — 2026-09-25
|
|
8
14
|
|
|
9
15
|
### Added
|
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.28" : "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.28",
|
|
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.28" ? { ideVersion: "2.75.28" } : {}
|
|
12092
12092
|
};
|
|
12093
12093
|
try {
|
|
12094
12094
|
const res = await _postJson(`${API_BASE2}/api/plugin/heartbeat`, body);
|
|
@@ -24868,9 +24868,10 @@ async function bringUpInspector(targetPort, deps = {}) {
|
|
|
24868
24868
|
const start2 = deps.start ?? startInspectorProxy;
|
|
24869
24869
|
const proxy = await start2({
|
|
24870
24870
|
targetPort,
|
|
24871
|
+
...deps.targetHost ? { targetHost: deps.targetHost } : {},
|
|
24871
24872
|
script: inspectorClientSource({ allowedOrigins: resolveInspectorOrigins(env) })
|
|
24872
24873
|
});
|
|
24873
|
-
log2(`preview inspector proxy on :${proxy.port} \u2192 :${targetPort}`);
|
|
24874
|
+
log2(`preview inspector proxy on :${proxy.port} \u2192 ${deps.targetHost ?? "127.0.0.1"}:${targetPort}`);
|
|
24874
24875
|
return { port: proxy.port, proxy };
|
|
24875
24876
|
} catch (e) {
|
|
24876
24877
|
log2(`preview inspector unavailable (${e.message}) \u2014 going direct`);
|
|
@@ -24878,6 +24879,30 @@ async function bringUpInspector(targetPort, deps = {}) {
|
|
|
24878
24879
|
}
|
|
24879
24880
|
}
|
|
24880
24881
|
|
|
24882
|
+
// src/services/preview/served-address.ts
|
|
24883
|
+
var LOOPBACK_HOSTS = ["127.0.0.1", "::1"];
|
|
24884
|
+
var ANSI_RE2 = /\x1b\[[0-9;]*m/g;
|
|
24885
|
+
var LOCAL_URL_RE = /https?:\/\/(?:localhost|127\.0\.0\.1|0\.0\.0\.0|\[::1?\]|\[::\]):(\d{2,5})\b/gi;
|
|
24886
|
+
function announcedPorts(output) {
|
|
24887
|
+
const clean = output.replace(ANSI_RE2, "");
|
|
24888
|
+
const ports = [];
|
|
24889
|
+
for (const m of clean.matchAll(LOCAL_URL_RE)) {
|
|
24890
|
+
const port = Number(m[1]);
|
|
24891
|
+
if (port > 0 && port < 65536) ports.push(port);
|
|
24892
|
+
}
|
|
24893
|
+
return [...new Set(ports.reverse())];
|
|
24894
|
+
}
|
|
24895
|
+
async function resolveServedAddress(output, detectedPort, deps = {}) {
|
|
24896
|
+
const listening = deps.listening ?? isPortListening;
|
|
24897
|
+
const candidates = [.../* @__PURE__ */ new Set([...announcedPorts(output), detectedPort])];
|
|
24898
|
+
for (const port of candidates) {
|
|
24899
|
+
for (const host2 of LOOPBACK_HOSTS) {
|
|
24900
|
+
if (await listening(port, host2)) return { host: host2, port };
|
|
24901
|
+
}
|
|
24902
|
+
}
|
|
24903
|
+
return { host: "127.0.0.1", port: detectedPort };
|
|
24904
|
+
}
|
|
24905
|
+
|
|
24881
24906
|
// src/services/preview/start-orchestrator.ts
|
|
24882
24907
|
var INSTALL_TIMEOUT_MS2 = 5 * 6e4;
|
|
24883
24908
|
var SETUP_TIMEOUT_MS = 2 * 6e4;
|
|
@@ -25186,7 +25211,10 @@ async function startDevServer(ctx, extraEnv = {}) {
|
|
|
25186
25211
|
if (verdict.adopt) {
|
|
25187
25212
|
log.info("preview", `adopting the dev server already serving on port ${detection.port}`);
|
|
25188
25213
|
emitProgress("READY_DETECTED", `adopted the server already on port ${detection.port}`);
|
|
25189
|
-
return {
|
|
25214
|
+
return {
|
|
25215
|
+
devServer: null,
|
|
25216
|
+
served: await resolveServedAddress("", detection.port)
|
|
25217
|
+
};
|
|
25190
25218
|
}
|
|
25191
25219
|
emit2(USER_EVENTS.PREVIEW_ERROR, {
|
|
25192
25220
|
stage: "spawn",
|
|
@@ -25249,15 +25277,23 @@ async function startDevServer(ctx, extraEnv = {}) {
|
|
|
25249
25277
|
});
|
|
25250
25278
|
return null;
|
|
25251
25279
|
}
|
|
25252
|
-
|
|
25253
|
-
|
|
25280
|
+
const served = await resolveServedAddress(outputTail, detection.port);
|
|
25281
|
+
if (served.port !== detection.port || served.host !== "127.0.0.1") {
|
|
25282
|
+
log.info(
|
|
25283
|
+
"preview",
|
|
25284
|
+
`dev server serves on ${served.host}:${served.port} (detection said :${detection.port})`
|
|
25285
|
+
);
|
|
25286
|
+
}
|
|
25287
|
+
emitProgress("READY_DETECTED", `port ${served.port}`);
|
|
25288
|
+
return { devServer, served };
|
|
25254
25289
|
}
|
|
25255
25290
|
var MAX_TUNNEL_ATTEMPTS = 3;
|
|
25256
25291
|
async function establishTunnel(ctx, dev) {
|
|
25257
25292
|
const { detection, emit: emit2, emitProgress } = ctx;
|
|
25258
25293
|
const { devServer } = dev;
|
|
25259
25294
|
emitProgress("TUNNEL_STARTING", "cloudflared quick tunnel");
|
|
25260
|
-
const inspection = await bringUpInspector(
|
|
25295
|
+
const inspection = await bringUpInspector(dev.served.port, {
|
|
25296
|
+
targetHost: dev.served.host,
|
|
25261
25297
|
log: (m) => log.info("preview", m)
|
|
25262
25298
|
});
|
|
25263
25299
|
const pub = await bringUpPublicUrl(ctx, inspection.port);
|
|
@@ -48578,7 +48614,7 @@ async function autoUpgradeBeforeCriticalCommand() {
|
|
|
48578
48614
|
if (process.env.NODE_ENV === "test") return;
|
|
48579
48615
|
if (process.env.CODEAM_DISABLE_UPDATE_CHECK === "1") return;
|
|
48580
48616
|
if (process.env.CI) return;
|
|
48581
|
-
const current2 = true ? "2.75.
|
|
48617
|
+
const current2 = true ? "2.75.28" : null;
|
|
48582
48618
|
if (!current2) return;
|
|
48583
48619
|
const cache = readCache();
|
|
48584
48620
|
const fresh = cache && Date.now() - cache.fetchedAt < TTL_MS;
|
|
@@ -48595,7 +48631,7 @@ function checkForUpdates() {
|
|
|
48595
48631
|
if (process.env.CODEAM_DISABLE_UPDATE_CHECK === "1") return;
|
|
48596
48632
|
if (process.env.CI) return;
|
|
48597
48633
|
if (!process.stdout.isTTY) return;
|
|
48598
|
-
const current2 = true ? "2.75.
|
|
48634
|
+
const current2 = true ? "2.75.28" : null;
|
|
48599
48635
|
if (!current2) return;
|
|
48600
48636
|
const cache = readCache();
|
|
48601
48637
|
const fresh = cache && Date.now() - cache.fetchedAt < TTL_MS;
|
|
@@ -48618,7 +48654,7 @@ var SELF_UPDATE_INSTALL_TIMEOUT_MS = 18e4;
|
|
|
48618
48654
|
var SELF_UPDATE_LS_TIMEOUT_MS = 15e3;
|
|
48619
48655
|
var SUDO_PREFLIGHT_TIMEOUT_MS = 5e3;
|
|
48620
48656
|
function currentCliVersion() {
|
|
48621
|
-
return true ? "2.75.
|
|
48657
|
+
return true ? "2.75.28" : null;
|
|
48622
48658
|
}
|
|
48623
48659
|
async function installedVersion(deps) {
|
|
48624
48660
|
const ls = await deps.run(
|
|
@@ -50583,7 +50619,7 @@ function checkChokidar() {
|
|
|
50583
50619
|
}
|
|
50584
50620
|
async function doctor(args2 = []) {
|
|
50585
50621
|
const json = args2.includes("--json");
|
|
50586
|
-
const cliVersion = true ? "2.75.
|
|
50622
|
+
const cliVersion = true ? "2.75.28" : "0.0.0-dev";
|
|
50587
50623
|
const apiBase2 = resolveApiBaseUrl();
|
|
50588
50624
|
const diagnosticId = (0, import_node_crypto13.randomUUID)();
|
|
50589
50625
|
log.info("doctor", `run id=${diagnosticId} cli=${cliVersion}`);
|
|
@@ -51107,7 +51143,7 @@ async function mcpWarm(argv = [], opts = {}) {
|
|
|
51107
51143
|
// src/commands/version.ts
|
|
51108
51144
|
var import_picocolors15 = __toESM(require("picocolors"));
|
|
51109
51145
|
function version2() {
|
|
51110
|
-
const v = true ? "2.75.
|
|
51146
|
+
const v = true ? "2.75.28" : "unknown";
|
|
51111
51147
|
console.log(`${import_picocolors15.default.bold("codeam-cli")} ${import_picocolors15.default.cyan(v)}`);
|
|
51112
51148
|
}
|
|
51113
51149
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "codeam-cli",
|
|
3
|
-
"version": "2.75.
|
|
3
|
+
"version": "2.75.28",
|
|
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",
|
package/dist/postinstall.js
DELETED
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
"use strict";
|
|
3
|
-
|
|
4
|
-
// src/postinstall.ts
|
|
5
|
-
var c = {
|
|
6
|
-
reset: "\x1B[0m",
|
|
7
|
-
bold: "\x1B[1m",
|
|
8
|
-
dim: "\x1B[2m",
|
|
9
|
-
green: "\x1B[32m",
|
|
10
|
-
cyan: "\x1B[36m",
|
|
11
|
-
violet: "\x1B[35m",
|
|
12
|
-
white: "\x1B[97m"
|
|
13
|
-
};
|
|
14
|
-
var lines = [
|
|
15
|
-
"",
|
|
16
|
-
` ${c.violet}${c.bold}codeam-cli${c.reset} ${c.dim}\u2014 Claude Code remote control${c.reset}`,
|
|
17
|
-
"",
|
|
18
|
-
` ${c.dim}1.${c.reset} Pair your phone:`,
|
|
19
|
-
` ${c.cyan}codeam pair${c.reset}`,
|
|
20
|
-
"",
|
|
21
|
-
` ${c.dim}2.${c.reset} Launch Claude Code with mobile control:`,
|
|
22
|
-
` ${c.cyan}codeam${c.reset}`,
|
|
23
|
-
"",
|
|
24
|
-
` ${c.dim}Other commands:${c.reset}`,
|
|
25
|
-
` ${c.white}codeam sessions${c.reset} ${c.dim}list paired devices${c.reset}`,
|
|
26
|
-
` ${c.white}codeam status${c.reset} ${c.dim}show connection info${c.reset}`,
|
|
27
|
-
` ${c.white}codeam logout${c.reset} ${c.dim}remove all sessions${c.reset}`,
|
|
28
|
-
"",
|
|
29
|
-
` ${c.dim}Requires Claude Code:${c.reset} ${c.green}npm install -g @anthropic-ai/claude-code${c.reset}`,
|
|
30
|
-
` ${c.dim}Mobile app:${c.reset} ${c.green}https://www.codeagent-mobile.com${c.reset}`,
|
|
31
|
-
""
|
|
32
|
-
];
|
|
33
|
-
process.stdout.write(lines.join("\n") + "\n");
|