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 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.23" : "0.0.0-dev",
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.23",
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: "^5.3.2",
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: "^6.0.3",
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.23" ? { ideVersion: "2.61.23" } : {}
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.23" : null;
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.23" : null;
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.23" : null;
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("host-agent", "host identity rejected by backend \u2014 wiped sealed identity, exiting");
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. This flag tells `resolveHostIdentity`
19076
- // that on a restart (docker restart / reboot / fleet_start_box wake) an
19077
- // expired-token redeem is EXPECTED: resume from the sealed identity
19078
- // instead of dying with "token expired". Not a secret → plain KEY=value.
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 && process.env.CODEAM_ENROLL_EPHEMERAL === "1") {
19556
+ if (existing) {
19526
19557
  log.info(
19527
19558
  "host-agent",
19528
- "ephemeral enroll token expired on restart; resuming from sealed identity"
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.23" : "0.0.0-dev";
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.23" : "unknown";
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.23",
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": "^5.3.2",
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": "^6.0.3",
100
- "vitest": "^4.1.5"
99
+ "typescript": "^7.0.2",
100
+ "vitest": "^4.1.5",
101
+ "yaml": "^2.9.0"
101
102
  }
102
103
  }