codeam-cli 2.61.23 → 2.61.24
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 +23 -0
- package/dist/index.js +50 -41
- package/package.json +5 -4
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,29 @@ 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.61.23] — 2026-07-20
|
|
8
|
+
|
|
9
|
+
### Added
|
|
10
|
+
|
|
11
|
+
- **shared:** Add Agent Skills wire types (SkillDefinition, SkillsManifest)
|
|
12
|
+
- **shared:** Seed SKILL_REGISTRY with code-review + resolve-conflicts
|
|
13
|
+
- **cli:** Skills.json manifest read/persist/clear util
|
|
14
|
+
- **cli:** Materialize curated SKILL.md bundles under $HOME (namespaced)
|
|
15
|
+
- **cli:** ProvisionSkillsForStart materializes skills before agent spawn
|
|
16
|
+
- **cli:** Persist self-hosted deploy skills manifest to skills.json
|
|
17
|
+
- **cli:** Skills_configure relay command (add/remove/list) in both registries
|
|
18
|
+
- **shared:** Add skillIds to AgentReviewPlan wire type
|
|
19
|
+
|
|
20
|
+
### Fixed
|
|
21
|
+
|
|
22
|
+
- **cli:** SKILL.md frontmatter name must match codeam-<id> skill dir
|
|
23
|
+
- **cli:** ConfigureSkill rejects unknown action instead of destructive remove fall-through
|
|
24
|
+
- **cli:** Quote SKILL.md description (valid YAML) + harden skills manifest read
|
|
25
|
+
|
|
26
|
+
### Tests
|
|
27
|
+
|
|
28
|
+
- **cli:** Make skills path assertions separator-agnostic (Windows CI)
|
|
29
|
+
|
|
7
30
|
## [2.61.21] — 2026-07-18
|
|
8
31
|
|
|
9
32
|
### Added
|
package/dist/index.js
CHANGED
|
@@ -6117,7 +6117,7 @@ function readAnonId() {
|
|
|
6117
6117
|
}
|
|
6118
6118
|
function superProperties() {
|
|
6119
6119
|
return {
|
|
6120
|
-
cliVersion: true ? "2.61.
|
|
6120
|
+
cliVersion: true ? "2.61.24" : "0.0.0-dev",
|
|
6121
6121
|
nodeVersion: process.version,
|
|
6122
6122
|
platform: process.platform,
|
|
6123
6123
|
arch: process.arch,
|
|
@@ -6298,7 +6298,7 @@ var os4 = __toESM(require("os"));
|
|
|
6298
6298
|
// package.json
|
|
6299
6299
|
var package_default = {
|
|
6300
6300
|
name: "codeam-cli",
|
|
6301
|
-
version: "2.61.
|
|
6301
|
+
version: "2.61.24",
|
|
6302
6302
|
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.",
|
|
6303
6303
|
type: "commonjs",
|
|
6304
6304
|
main: "dist/index.js",
|
|
@@ -6375,7 +6375,7 @@ var package_default = {
|
|
|
6375
6375
|
"@agentclientprotocol/sdk": "1.2.1",
|
|
6376
6376
|
"@clack/prompts": "^1.2.0",
|
|
6377
6377
|
chokidar: "^3.6.0",
|
|
6378
|
-
ignore: "^
|
|
6378
|
+
ignore: "^7.0.6",
|
|
6379
6379
|
picocolors: "^1.1.0",
|
|
6380
6380
|
"qrcode-terminal": "^0.12.0",
|
|
6381
6381
|
which: "^6.0.0",
|
|
@@ -6394,8 +6394,9 @@ var package_default = {
|
|
|
6394
6394
|
"@vitest/coverage-v8": "^4.1.7",
|
|
6395
6395
|
"node-pty": "^1.1.0",
|
|
6396
6396
|
tsup: "^8.0.0",
|
|
6397
|
-
typescript: "^
|
|
6398
|
-
vitest: "^4.1.5"
|
|
6397
|
+
typescript: "^7.0.2",
|
|
6398
|
+
vitest: "^4.1.5",
|
|
6399
|
+
yaml: "^2.9.0"
|
|
6399
6400
|
}
|
|
6400
6401
|
};
|
|
6401
6402
|
|
|
@@ -7462,7 +7463,7 @@ var CommandRelayService = class _CommandRelayService {
|
|
|
7462
7463
|
// fresh + clear the "CLI update available" banner after a self-update
|
|
7463
7464
|
// (a codespace that reinstalls @latest reconnects via heartbeat, not
|
|
7464
7465
|
// pair/reconnect). Older backends ignore the extra field.
|
|
7465
|
-
..."2.61.
|
|
7466
|
+
..."2.61.24" ? { ideVersion: "2.61.24" } : {}
|
|
7466
7467
|
}).then(() => log.trace("relay", `heartbeat ok online=${online}`)).catch((err) => log.trace("relay", `heartbeat failed online=${online}`, err));
|
|
7467
7468
|
}
|
|
7468
7469
|
/**
|
|
@@ -16763,6 +16764,29 @@ function persistOrClearSkillsFromPayload(skills) {
|
|
|
16763
16764
|
else clearSkillsManifest();
|
|
16764
16765
|
}
|
|
16765
16766
|
|
|
16767
|
+
// src/lib/process-guards.ts
|
|
16768
|
+
var installed = false;
|
|
16769
|
+
function installRelayCrashGuards() {
|
|
16770
|
+
if (installed) return;
|
|
16771
|
+
installed = true;
|
|
16772
|
+
process.on("unhandledRejection", (reason) => {
|
|
16773
|
+
log.error("process", `unhandledRejection \u2014 relay kept alive \u2014 ${describeReason(reason)}`);
|
|
16774
|
+
});
|
|
16775
|
+
process.on("uncaughtException", (err) => {
|
|
16776
|
+
log.error("process", `uncaughtException \u2014 relay kept alive \u2014 ${describeReason(err)}`);
|
|
16777
|
+
});
|
|
16778
|
+
}
|
|
16779
|
+
function describeReason(reason) {
|
|
16780
|
+
if (reason instanceof Error) {
|
|
16781
|
+
return reason.stack ?? `${reason.name}: ${reason.message}`;
|
|
16782
|
+
}
|
|
16783
|
+
try {
|
|
16784
|
+
return typeof reason === "string" ? reason : JSON.stringify(reason);
|
|
16785
|
+
} catch {
|
|
16786
|
+
return String(reason);
|
|
16787
|
+
}
|
|
16788
|
+
}
|
|
16789
|
+
|
|
16766
16790
|
// src/commands/host/host-client.ts
|
|
16767
16791
|
var fs35 = __toESM(require("fs"));
|
|
16768
16792
|
var os31 = __toESM(require("os"));
|
|
@@ -18288,7 +18312,7 @@ async function autoUpgradeBeforeCriticalCommand() {
|
|
|
18288
18312
|
if (process.env.NODE_ENV === "test") return;
|
|
18289
18313
|
if (process.env.CODEAM_DISABLE_UPDATE_CHECK === "1") return;
|
|
18290
18314
|
if (process.env.CI) return;
|
|
18291
|
-
const current = true ? "2.61.
|
|
18315
|
+
const current = true ? "2.61.24" : null;
|
|
18292
18316
|
if (!current) return;
|
|
18293
18317
|
const cache = readCache();
|
|
18294
18318
|
const fresh = cache && Date.now() - cache.fetchedAt < TTL_MS;
|
|
@@ -18305,7 +18329,7 @@ function checkForUpdates() {
|
|
|
18305
18329
|
if (process.env.CODEAM_DISABLE_UPDATE_CHECK === "1") return;
|
|
18306
18330
|
if (process.env.CI) return;
|
|
18307
18331
|
if (!process.stdout.isTTY) return;
|
|
18308
|
-
const current = true ? "2.61.
|
|
18332
|
+
const current = true ? "2.61.24" : null;
|
|
18309
18333
|
if (!current) return;
|
|
18310
18334
|
const cache = readCache();
|
|
18311
18335
|
const fresh = cache && Date.now() - cache.fetchedAt < TTL_MS;
|
|
@@ -18325,7 +18349,7 @@ var SELF_UPDATE_INTERVAL_MS = 60 * 60 * 1e3;
|
|
|
18325
18349
|
var SELF_UPDATE_VIEW_TIMEOUT_MS = 3e4;
|
|
18326
18350
|
var SELF_UPDATE_INSTALL_TIMEOUT_MS = 18e4;
|
|
18327
18351
|
function currentCliVersion() {
|
|
18328
|
-
return true ? "2.61.
|
|
18352
|
+
return true ? "2.61.24" : null;
|
|
18329
18353
|
}
|
|
18330
18354
|
function runCmd(cmd, args2, timeoutMs) {
|
|
18331
18355
|
return new Promise((resolve8) => {
|
|
@@ -18652,8 +18676,12 @@ var defaultResumeSpawner = (env, cwd) => (0, import_node_child_process24.spawn)(
|
|
|
18652
18676
|
detached: false
|
|
18653
18677
|
});
|
|
18654
18678
|
var defaultOnIdentityRejected = () => {
|
|
18679
|
+
defaultDisableService();
|
|
18655
18680
|
deleteHostIdentity();
|
|
18656
|
-
log.warn(
|
|
18681
|
+
log.warn(
|
|
18682
|
+
"host-agent",
|
|
18683
|
+
"host identity rejected by backend \u2014 disabled service + wiped sealed identity, exiting"
|
|
18684
|
+
);
|
|
18657
18685
|
process.exit(1);
|
|
18658
18686
|
};
|
|
18659
18687
|
var defaultOnUpdated = (version3) => {
|
|
@@ -19072,10 +19100,13 @@ var HostAgentSupervisor = class {
|
|
|
19072
19100
|
"CODEAM_HOST_LABEL=CodeAgent Box",
|
|
19073
19101
|
// The enroll token above is a SINGLE-USE bootstrap, but it lives in the
|
|
19074
19102
|
// container's fixed env — it can't be stripped after first boot like the
|
|
19075
|
-
// self-hosted systemd unit does
|
|
19076
|
-
//
|
|
19077
|
-
//
|
|
19078
|
-
//
|
|
19103
|
+
// self-hosted systemd unit does, so on every restart (docker restart /
|
|
19104
|
+
// reboot / fleet_start_box wake) the redeem terminally expires.
|
|
19105
|
+
// `resolveHostIdentity` now resumes from a sealed identity on ANY
|
|
19106
|
+
// terminal enroll-token rejection (not just ephemeral boxes — see its
|
|
19107
|
+
// doc comment), so this flag is no longer load-bearing for that
|
|
19108
|
+
// decision; kept set for observability/back-compat with older CLI
|
|
19109
|
+
// builds that still gate on it. Not a secret → plain KEY=value.
|
|
19079
19110
|
"-e",
|
|
19080
19111
|
"CODEAM_ENROLL_EPHEMERAL=1",
|
|
19081
19112
|
image
|
|
@@ -19522,10 +19553,10 @@ async function resolveHostIdentity(enrollToken) {
|
|
|
19522
19553
|
return identity;
|
|
19523
19554
|
} catch (err) {
|
|
19524
19555
|
if (isTerminalEnrollError(err)) {
|
|
19525
|
-
if (existing
|
|
19556
|
+
if (existing) {
|
|
19526
19557
|
log.info(
|
|
19527
19558
|
"host-agent",
|
|
19528
|
-
"
|
|
19559
|
+
"enroll token terminally rejected (expired/replayed) but a sealed identity is present; resuming from it \u2014 likely a restart, not a re-enroll"
|
|
19529
19560
|
);
|
|
19530
19561
|
return existing;
|
|
19531
19562
|
}
|
|
@@ -19549,6 +19580,7 @@ async function resolveHostIdentity(enrollToken) {
|
|
|
19549
19580
|
return null;
|
|
19550
19581
|
}
|
|
19551
19582
|
async function hostAgent(args2 = []) {
|
|
19583
|
+
installRelayCrashGuards();
|
|
19552
19584
|
const tokenArg = args2.find((a) => a.startsWith("--token="));
|
|
19553
19585
|
const enrollToken = (tokenArg ? tokenArg.slice("--token=".length).trim() : "") || process.env.CODEAM_ENROLL_TOKEN || void 0;
|
|
19554
19586
|
const identity = await resolveHostIdentity(enrollToken);
|
|
@@ -23809,29 +23841,6 @@ function buildKeepAlive(ctx) {
|
|
|
23809
23841
|
};
|
|
23810
23842
|
}
|
|
23811
23843
|
|
|
23812
|
-
// src/lib/process-guards.ts
|
|
23813
|
-
var installed = false;
|
|
23814
|
-
function installRelayCrashGuards() {
|
|
23815
|
-
if (installed) return;
|
|
23816
|
-
installed = true;
|
|
23817
|
-
process.on("unhandledRejection", (reason) => {
|
|
23818
|
-
log.error("process", `unhandledRejection \u2014 relay kept alive \u2014 ${describeReason(reason)}`);
|
|
23819
|
-
});
|
|
23820
|
-
process.on("uncaughtException", (err) => {
|
|
23821
|
-
log.error("process", `uncaughtException \u2014 relay kept alive \u2014 ${describeReason(err)}`);
|
|
23822
|
-
});
|
|
23823
|
-
}
|
|
23824
|
-
function describeReason(reason) {
|
|
23825
|
-
if (reason instanceof Error) {
|
|
23826
|
-
return reason.stack ?? `${reason.name}: ${reason.message}`;
|
|
23827
|
-
}
|
|
23828
|
-
try {
|
|
23829
|
-
return typeof reason === "string" ? reason : JSON.stringify(reason);
|
|
23830
|
-
} catch {
|
|
23831
|
-
return String(reason);
|
|
23832
|
-
}
|
|
23833
|
-
}
|
|
23834
|
-
|
|
23835
23844
|
// src/commands/start-infra-only.ts
|
|
23836
23845
|
var INFRA_ONLY_COMMAND_TYPES = /* @__PURE__ */ new Set([
|
|
23837
23846
|
// File ops (drive the dashboard's Files panel + open-file).
|
|
@@ -38332,7 +38341,7 @@ function checkChokidar() {
|
|
|
38332
38341
|
}
|
|
38333
38342
|
async function doctor(args2 = []) {
|
|
38334
38343
|
const json = args2.includes("--json");
|
|
38335
|
-
const cliVersion = true ? "2.61.
|
|
38344
|
+
const cliVersion = true ? "2.61.24" : "0.0.0-dev";
|
|
38336
38345
|
const apiBase2 = resolveApiBaseUrl();
|
|
38337
38346
|
const diagnosticId = (0, import_node_crypto12.randomUUID)();
|
|
38338
38347
|
log.info("doctor", `run id=${diagnosticId} cli=${cliVersion}`);
|
|
@@ -38843,7 +38852,7 @@ async function mcpRun(args2) {
|
|
|
38843
38852
|
// src/commands/version.ts
|
|
38844
38853
|
var import_picocolors15 = __toESM(require("picocolors"));
|
|
38845
38854
|
function version2() {
|
|
38846
|
-
const v = true ? "2.61.
|
|
38855
|
+
const v = true ? "2.61.24" : "unknown";
|
|
38847
38856
|
console.log(`${import_picocolors15.default.bold("codeam-cli")} ${import_picocolors15.default.cyan(v)}`);
|
|
38848
38857
|
}
|
|
38849
38858
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "codeam-cli",
|
|
3
|
-
"version": "2.61.
|
|
3
|
+
"version": "2.61.24",
|
|
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",
|
|
@@ -77,7 +77,7 @@
|
|
|
77
77
|
"@agentclientprotocol/sdk": "1.2.1",
|
|
78
78
|
"@clack/prompts": "^1.2.0",
|
|
79
79
|
"chokidar": "^3.6.0",
|
|
80
|
-
"ignore": "^
|
|
80
|
+
"ignore": "^7.0.6",
|
|
81
81
|
"picocolors": "^1.1.0",
|
|
82
82
|
"qrcode-terminal": "^0.12.0",
|
|
83
83
|
"which": "^6.0.0",
|
|
@@ -96,7 +96,8 @@
|
|
|
96
96
|
"@vitest/coverage-v8": "^4.1.7",
|
|
97
97
|
"node-pty": "^1.1.0",
|
|
98
98
|
"tsup": "^8.0.0",
|
|
99
|
-
"typescript": "^
|
|
100
|
-
"vitest": "^4.1.5"
|
|
99
|
+
"typescript": "^7.0.2",
|
|
100
|
+
"vitest": "^4.1.5",
|
|
101
|
+
"yaml": "^2.9.0"
|
|
101
102
|
}
|
|
102
103
|
}
|