codeam-cli 2.76.9 → 2.76.10
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 +16 -0
- package/dist/index.js +67 -33
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,22 @@ 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.76.9] — 2026-10-01
|
|
8
|
+
|
|
9
|
+
### Added
|
|
10
|
+
|
|
11
|
+
- **plugin:** OpenAI plugin package for ChatGPT and Codex (#885)
|
|
12
|
+
|
|
13
|
+
### Documentation
|
|
14
|
+
|
|
15
|
+
- **plugin:** Submission sheet matches the review account's real setup (#886)
|
|
16
|
+
- **plugin:** Submission case for search_codeagent_help (#887)
|
|
17
|
+
|
|
18
|
+
### Fixed
|
|
19
|
+
|
|
20
|
+
- **plugin:** Address directory review — no .app.json, 3 prompts, no brands or pricing (#888)
|
|
21
|
+
- **cli:** Scratch projects reach their first preview (#889)
|
|
22
|
+
|
|
7
23
|
## [2.76.8] — 2026-09-29
|
|
8
24
|
|
|
9
25
|
### Fixed
|
package/dist/index.js
CHANGED
|
@@ -10579,7 +10579,7 @@ function readAnonId() {
|
|
|
10579
10579
|
}
|
|
10580
10580
|
function superProperties() {
|
|
10581
10581
|
return {
|
|
10582
|
-
cliVersion: true ? "2.76.
|
|
10582
|
+
cliVersion: true ? "2.76.10" : "0.0.0-dev",
|
|
10583
10583
|
nodeVersion: process.version,
|
|
10584
10584
|
platform: process.platform,
|
|
10585
10585
|
arch: process.arch,
|
|
@@ -10824,7 +10824,7 @@ var http = __toESM(require("http"));
|
|
|
10824
10824
|
// package.json
|
|
10825
10825
|
var package_default = {
|
|
10826
10826
|
name: "codeam-cli",
|
|
10827
|
-
version: "2.76.
|
|
10827
|
+
version: "2.76.10",
|
|
10828
10828
|
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.",
|
|
10829
10829
|
type: "commonjs",
|
|
10830
10830
|
main: "dist/index.js",
|
|
@@ -12160,7 +12160,7 @@ var CommandRelayService = class _CommandRelayService {
|
|
|
12160
12160
|
// fresh + clear the "CLI update available" banner after a self-update
|
|
12161
12161
|
// (a codespace that reinstalls @latest reconnects via heartbeat, not
|
|
12162
12162
|
// pair/reconnect). Older backends ignore the extra field.
|
|
12163
|
-
..."2.76.
|
|
12163
|
+
..."2.76.10" ? { ideVersion: "2.76.10" } : {}
|
|
12164
12164
|
};
|
|
12165
12165
|
try {
|
|
12166
12166
|
const res = await _postJson(`${API_BASE2}/api/plugin/heartbeat`, body);
|
|
@@ -23621,9 +23621,9 @@ var healRestartCounts = /* @__PURE__ */ new Map();
|
|
|
23621
23621
|
function resetBuildHealState(sessionId) {
|
|
23622
23622
|
healRestartCounts.delete(sessionId);
|
|
23623
23623
|
}
|
|
23624
|
-
function readMarker2(
|
|
23624
|
+
function readMarker2(markerPath5) {
|
|
23625
23625
|
try {
|
|
23626
|
-
return fs42.readFileSync(
|
|
23626
|
+
return fs42.readFileSync(markerPath5, "utf8").trim();
|
|
23627
23627
|
} catch {
|
|
23628
23628
|
return null;
|
|
23629
23629
|
}
|
|
@@ -23633,12 +23633,12 @@ function watchForBuildClobber(deps) {
|
|
|
23633
23633
|
const debounceMs = deps.debounceMs ?? DEFAULT_DEBOUNCE_MS;
|
|
23634
23634
|
const maxRestarts = deps.maxRestarts ?? DEFAULT_MAX_RESTARTS;
|
|
23635
23635
|
const nextDir = path49.join(deps.cwd, ".next");
|
|
23636
|
-
const
|
|
23636
|
+
const markerPath5 = path49.join(nextDir, BUILD_MARKER_NAME);
|
|
23637
23637
|
let stopped = false;
|
|
23638
23638
|
let debounceTimer = null;
|
|
23639
23639
|
let dirUnwatch = null;
|
|
23640
23640
|
let cwdUnwatch = null;
|
|
23641
|
-
let lastKnownMarker = readMarker2(
|
|
23641
|
+
let lastKnownMarker = readMarker2(markerPath5);
|
|
23642
23642
|
const stop = () => {
|
|
23643
23643
|
if (stopped) return;
|
|
23644
23644
|
stopped = true;
|
|
@@ -23653,7 +23653,7 @@ function watchForBuildClobber(deps) {
|
|
|
23653
23653
|
};
|
|
23654
23654
|
const onDebouncedClobber = () => {
|
|
23655
23655
|
if (stopped) return;
|
|
23656
|
-
const current2 = readMarker2(
|
|
23656
|
+
const current2 = readMarker2(markerPath5);
|
|
23657
23657
|
if (current2 === lastKnownMarker) return;
|
|
23658
23658
|
lastKnownMarker = current2;
|
|
23659
23659
|
const count = (healRestartCounts.get(deps.sessionId) ?? 0) + 1;
|
|
@@ -23671,7 +23671,7 @@ function watchForBuildClobber(deps) {
|
|
|
23671
23671
|
}
|
|
23672
23672
|
log.info(
|
|
23673
23673
|
"preview",
|
|
23674
|
-
`build-heal: ${
|
|
23674
|
+
`build-heal: ${markerPath5} changed (a build likely ran) \u2014 restarting the dev server (${count}/${maxRestarts})`
|
|
23675
23675
|
);
|
|
23676
23676
|
deps.notify("Rebuilt \u2014 restarting preview");
|
|
23677
23677
|
deps.restart();
|
|
@@ -23686,7 +23686,7 @@ function watchForBuildClobber(deps) {
|
|
|
23686
23686
|
};
|
|
23687
23687
|
const attachDirWatch = () => {
|
|
23688
23688
|
if (dirUnwatch) return;
|
|
23689
|
-
lastKnownMarker = readMarker2(
|
|
23689
|
+
lastKnownMarker = readMarker2(markerPath5);
|
|
23690
23690
|
dirUnwatch = watchDir(nextDir, (filename) => {
|
|
23691
23691
|
if (filename === null || filename === BUILD_MARKER_NAME) onMarkerTouched();
|
|
23692
23692
|
});
|
|
@@ -25157,7 +25157,9 @@ function hasServableProject(cwd) {
|
|
|
25157
25157
|
const entries2 = rootEntries(cwd);
|
|
25158
25158
|
if (!entries2) return false;
|
|
25159
25159
|
if (entries2.some((e) => SERVABLE_ROOT_FILES.has(e) || /\.html?$/i.test(e))) return true;
|
|
25160
|
-
return ["public", "src"
|
|
25160
|
+
return ["public", "src", "dist", "build"].some(
|
|
25161
|
+
(dir) => import_node_fs14.default.existsSync(import_node_path12.default.join(cwd, dir, "index.html"))
|
|
25162
|
+
);
|
|
25161
25163
|
}
|
|
25162
25164
|
function isEmptyScratchProject(cwd) {
|
|
25163
25165
|
if (!isScratchWorkspace(cwd)) return false;
|
|
@@ -25165,14 +25167,35 @@ function isEmptyScratchProject(cwd) {
|
|
|
25165
25167
|
return entries2 !== null && entries2.every((e) => e.startsWith(".") || AGENT_NOTES.has(e));
|
|
25166
25168
|
}
|
|
25167
25169
|
var bringUps = /* @__PURE__ */ new Set();
|
|
25168
|
-
|
|
25170
|
+
var AUTO_PREVIEW_MARKER = import_node_path12.default.join(".codeam", "auto-preview-state.json");
|
|
25171
|
+
function markerPath2(cwd) {
|
|
25172
|
+
return import_node_path12.default.join(cwd, AUTO_PREVIEW_MARKER);
|
|
25173
|
+
}
|
|
25174
|
+
function hasAttemptedMarker(cwd) {
|
|
25175
|
+
try {
|
|
25176
|
+
return import_node_fs14.default.existsSync(markerPath2(cwd));
|
|
25177
|
+
} catch {
|
|
25178
|
+
return false;
|
|
25179
|
+
}
|
|
25180
|
+
}
|
|
25181
|
+
function writeAttemptedMarker(cwd) {
|
|
25182
|
+
try {
|
|
25183
|
+
const file = markerPath2(cwd);
|
|
25184
|
+
import_node_fs14.default.mkdirSync(import_node_path12.default.dirname(file), { recursive: true });
|
|
25185
|
+
import_node_fs14.default.writeFileSync(file, '{"attempted":true}\n', "utf-8");
|
|
25186
|
+
} catch {
|
|
25187
|
+
}
|
|
25188
|
+
}
|
|
25189
|
+
function notePreviewBringUp(sessionId, cwd = process.cwd()) {
|
|
25169
25190
|
bringUps.add(sessionId);
|
|
25191
|
+
if (isScratchWorkspace(cwd)) writeAttemptedMarker(cwd);
|
|
25170
25192
|
}
|
|
25171
25193
|
function maybeAutoOpenScratchPreview(sessionId, bridge, cwd = process.cwd()) {
|
|
25172
|
-
if (!isScratchWorkspace(cwd) || bringUps.has(sessionId)) return false;
|
|
25194
|
+
if (!isScratchWorkspace(cwd) || bringUps.has(sessionId) || hasAttemptedMarker(cwd)) return false;
|
|
25173
25195
|
if (bridge.status().status !== "idle") return false;
|
|
25174
25196
|
if (!hasServableProject(cwd)) return false;
|
|
25175
25197
|
bringUps.add(sessionId);
|
|
25198
|
+
writeAttemptedMarker(cwd);
|
|
25176
25199
|
void bridge.start().catch(() => {
|
|
25177
25200
|
});
|
|
25178
25201
|
return true;
|
|
@@ -25183,13 +25206,13 @@ var import_node_crypto11 = require("crypto");
|
|
|
25183
25206
|
var import_promises5 = __toESM(require("fs/promises"));
|
|
25184
25207
|
var import_node_os7 = __toESM(require("os"));
|
|
25185
25208
|
var import_node_path13 = __toESM(require("path"));
|
|
25186
|
-
function
|
|
25209
|
+
function markerPath3(cwd, homeDir2 = import_node_os7.default.homedir()) {
|
|
25187
25210
|
const key = (0, import_node_crypto11.createHash)("sha256").update(import_node_path13.default.resolve(cwd)).digest("hex").slice(0, 16);
|
|
25188
25211
|
return import_node_path13.default.join(homeDir2, ".codeam", "preview-active", `${key}.json`);
|
|
25189
25212
|
}
|
|
25190
25213
|
async function writeActivePreviewMarker(cwd, detection, homeDir2) {
|
|
25191
25214
|
try {
|
|
25192
|
-
const file =
|
|
25215
|
+
const file = markerPath3(cwd, homeDir2);
|
|
25193
25216
|
await import_promises5.default.mkdir(import_node_path13.default.dirname(file), { recursive: true });
|
|
25194
25217
|
await import_promises5.default.writeFile(
|
|
25195
25218
|
file,
|
|
@@ -25200,11 +25223,11 @@ async function writeActivePreviewMarker(cwd, detection, homeDir2) {
|
|
|
25200
25223
|
}
|
|
25201
25224
|
}
|
|
25202
25225
|
async function clearActivePreviewMarker(cwd, homeDir2) {
|
|
25203
|
-
await import_promises5.default.rm(
|
|
25226
|
+
await import_promises5.default.rm(markerPath3(cwd, homeDir2), { force: true }).catch(() => void 0);
|
|
25204
25227
|
}
|
|
25205
25228
|
async function readActivePreviewMarker(cwd, homeDir2) {
|
|
25206
25229
|
try {
|
|
25207
|
-
const raw = await import_promises5.default.readFile(
|
|
25230
|
+
const raw = await import_promises5.default.readFile(markerPath3(cwd, homeDir2), "utf8");
|
|
25208
25231
|
const parsed = JSON.parse(raw);
|
|
25209
25232
|
return parsed.detection && typeof parsed.detection.command === "string" ? parsed.detection : null;
|
|
25210
25233
|
} catch {
|
|
@@ -25347,12 +25370,16 @@ function buildHouseProxyChildEnv(cfg) {
|
|
|
25347
25370
|
};
|
|
25348
25371
|
if (cfg.openRouter === true) {
|
|
25349
25372
|
env.ANTHROPIC_API_KEY = "";
|
|
25350
|
-
} else {
|
|
25351
|
-
|
|
25352
|
-
env.
|
|
25353
|
-
env.
|
|
25354
|
-
env.
|
|
25355
|
-
|
|
25373
|
+
} else if (typeof cfg.model === "string" && cfg.model) {
|
|
25374
|
+
env.ANTHROPIC_MODEL = cfg.model;
|
|
25375
|
+
env.ANTHROPIC_DEFAULT_SONNET_MODEL = cfg.model;
|
|
25376
|
+
env.ANTHROPIC_DEFAULT_OPUS_MODEL = cfg.model;
|
|
25377
|
+
env.ANTHROPIC_DEFAULT_HAIKU_MODEL = cfg.model;
|
|
25378
|
+
} else if (!isManagedProviderId(cfg.managedAgentId)) {
|
|
25379
|
+
env.ANTHROPIC_MODEL = "MiniMax-M3";
|
|
25380
|
+
env.ANTHROPIC_DEFAULT_SONNET_MODEL = "MiniMax-M3";
|
|
25381
|
+
env.ANTHROPIC_DEFAULT_OPUS_MODEL = "MiniMax-M3";
|
|
25382
|
+
env.ANTHROPIC_DEFAULT_HAIKU_MODEL = "MiniMax-M3";
|
|
25356
25383
|
}
|
|
25357
25384
|
if (typeof cfg.claudeConfigDir === "string" && cfg.claudeConfigDir) {
|
|
25358
25385
|
env.CLAUDE_CONFIG_DIR = cfg.claudeConfigDir;
|
|
@@ -39853,13 +39880,13 @@ var import_node_crypto13 = require("crypto");
|
|
|
39853
39880
|
var import_promises6 = __toESM(require("fs/promises"));
|
|
39854
39881
|
var import_node_os14 = __toESM(require("os"));
|
|
39855
39882
|
var import_node_path20 = __toESM(require("path"));
|
|
39856
|
-
function
|
|
39883
|
+
function markerPath4(cwd, homeDir2 = import_node_os14.default.homedir()) {
|
|
39857
39884
|
const key = (0, import_node_crypto13.createHash)("sha256").update(import_node_path20.default.resolve(cwd)).digest("hex").slice(0, 16);
|
|
39858
39885
|
return import_node_path20.default.join(homeDir2, ".codeam", "conversation-active", `${key}.json`);
|
|
39859
39886
|
}
|
|
39860
39887
|
async function writeActiveConversationMarker(cwd, conversationId, homeDir2) {
|
|
39861
39888
|
try {
|
|
39862
|
-
const file =
|
|
39889
|
+
const file = markerPath4(cwd, homeDir2);
|
|
39863
39890
|
await import_promises6.default.mkdir(import_node_path20.default.dirname(file), { recursive: true });
|
|
39864
39891
|
await import_promises6.default.writeFile(
|
|
39865
39892
|
file,
|
|
@@ -39871,7 +39898,7 @@ async function writeActiveConversationMarker(cwd, conversationId, homeDir2) {
|
|
|
39871
39898
|
}
|
|
39872
39899
|
async function readActiveConversationMarker(cwd, homeDir2) {
|
|
39873
39900
|
try {
|
|
39874
|
-
const raw = await import_promises6.default.readFile(
|
|
39901
|
+
const raw = await import_promises6.default.readFile(markerPath4(cwd, homeDir2), "utf8");
|
|
39875
39902
|
const parsed = JSON.parse(raw);
|
|
39876
39903
|
return typeof parsed.conversationId === "string" && parsed.conversationId ? parsed.conversationId : null;
|
|
39877
39904
|
} catch {
|
|
@@ -50143,7 +50170,7 @@ async function autoUpgradeBeforeCriticalCommand() {
|
|
|
50143
50170
|
if (process.env.NODE_ENV === "test") return;
|
|
50144
50171
|
if (process.env.CODEAM_DISABLE_UPDATE_CHECK === "1") return;
|
|
50145
50172
|
if (process.env.CI) return;
|
|
50146
|
-
const current2 = true ? "2.76.
|
|
50173
|
+
const current2 = true ? "2.76.10" : null;
|
|
50147
50174
|
if (!current2) return;
|
|
50148
50175
|
const cache = readCache();
|
|
50149
50176
|
const fresh = cache && Date.now() - cache.fetchedAt < TTL_MS;
|
|
@@ -50160,7 +50187,7 @@ function checkForUpdates() {
|
|
|
50160
50187
|
if (process.env.CODEAM_DISABLE_UPDATE_CHECK === "1") return;
|
|
50161
50188
|
if (process.env.CI) return;
|
|
50162
50189
|
if (!process.stdout.isTTY) return;
|
|
50163
|
-
const current2 = true ? "2.76.
|
|
50190
|
+
const current2 = true ? "2.76.10" : null;
|
|
50164
50191
|
if (!current2) return;
|
|
50165
50192
|
const cache = readCache();
|
|
50166
50193
|
const fresh = cache && Date.now() - cache.fetchedAt < TTL_MS;
|
|
@@ -50183,7 +50210,7 @@ var SELF_UPDATE_INSTALL_TIMEOUT_MS = 18e4;
|
|
|
50183
50210
|
var SELF_UPDATE_LS_TIMEOUT_MS = 15e3;
|
|
50184
50211
|
var SUDO_PREFLIGHT_TIMEOUT_MS = 5e3;
|
|
50185
50212
|
function currentCliVersion() {
|
|
50186
|
-
return true ? "2.76.
|
|
50213
|
+
return true ? "2.76.10" : null;
|
|
50187
50214
|
}
|
|
50188
50215
|
async function installedVersion(deps) {
|
|
50189
50216
|
const ls = await deps.run(
|
|
@@ -51351,8 +51378,14 @@ var HostAgentSupervisor = class {
|
|
|
51351
51378
|
let extraArgs = [];
|
|
51352
51379
|
if (payload.houseProxy) {
|
|
51353
51380
|
const { baseUrl, token, agentKind, openRouter } = payload.houseProxy;
|
|
51381
|
+
const managedAgentId = isManagedProviderId(payload.agentId) ? payload.agentId : void 0;
|
|
51354
51382
|
childEnv = {
|
|
51355
|
-
...buildHouseProxyChildEnv({
|
|
51383
|
+
...buildHouseProxyChildEnv({
|
|
51384
|
+
baseUrl,
|
|
51385
|
+
token,
|
|
51386
|
+
openRouter: openRouter === true,
|
|
51387
|
+
...managedAgentId ? { managedAgentId } : {}
|
|
51388
|
+
}),
|
|
51356
51389
|
CODEAM_AUTO_TOKEN: payload.autoPairToken
|
|
51357
51390
|
};
|
|
51358
51391
|
const houseConfigDir = path105.join(
|
|
@@ -51371,7 +51404,8 @@ var HostAgentSupervisor = class {
|
|
|
51371
51404
|
baseUrl,
|
|
51372
51405
|
token,
|
|
51373
51406
|
openRouter: !!openRouter,
|
|
51374
|
-
claudeConfigDir: houseConfigDir
|
|
51407
|
+
claudeConfigDir: houseConfigDir,
|
|
51408
|
+
...managedAgentId ? { managedAgentId } : {}
|
|
51375
51409
|
}, payload.deployId);
|
|
51376
51410
|
} else {
|
|
51377
51411
|
const auth = await this.resolveAgentAuth(this.identity, payload.sealedAgentAuth);
|
|
@@ -52273,7 +52307,7 @@ function checkChokidar() {
|
|
|
52273
52307
|
}
|
|
52274
52308
|
async function doctor(args2 = []) {
|
|
52275
52309
|
const json = args2.includes("--json");
|
|
52276
|
-
const cliVersion = true ? "2.76.
|
|
52310
|
+
const cliVersion = true ? "2.76.10" : "0.0.0-dev";
|
|
52277
52311
|
const apiBase2 = resolveApiBaseUrl();
|
|
52278
52312
|
const diagnosticId = (0, import_node_crypto17.randomUUID)();
|
|
52279
52313
|
log.info("doctor", `run id=${diagnosticId} cli=${cliVersion}`);
|
|
@@ -52797,7 +52831,7 @@ async function mcpWarm(argv = [], opts = {}) {
|
|
|
52797
52831
|
// src/commands/version.ts
|
|
52798
52832
|
var import_picocolors15 = __toESM(require("picocolors"));
|
|
52799
52833
|
function version2() {
|
|
52800
|
-
const v = true ? "2.76.
|
|
52834
|
+
const v = true ? "2.76.10" : "unknown";
|
|
52801
52835
|
console.log(`${import_picocolors15.default.bold("codeam-cli")} ${import_picocolors15.default.cyan(v)}`);
|
|
52802
52836
|
}
|
|
52803
52837
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "codeam-cli",
|
|
3
|
-
"version": "2.76.
|
|
3
|
+
"version": "2.76.10",
|
|
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",
|