codeam-cli 2.61.95 → 2.61.96

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,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.61.95] — 2026-08-08
8
+
9
+ ### Fixed
10
+
11
+ - **cli:** Re-assert full-auto mode on Agent Packs fresh conversations (#605)
12
+
7
13
  ## [2.61.94] — 2026-08-08
8
14
 
9
15
  ### Fixed
package/dist/index.js CHANGED
@@ -2711,7 +2711,9 @@ var PACK_REGISTRY = {
2711
2711
  name: "Reviewer",
2712
2712
  description: "Skeptical review in a fresh context \u2014 finds and fixes what the coder missed.",
2713
2713
  skillIds: ["code-review", "code-naming"],
2714
- prompt: REVIEWER_PROMPT
2714
+ prompt: REVIEWER_PROMPT,
2715
+ // Review-only: approving clean with no change is success, not a stall.
2716
+ requiresCommit: false
2715
2717
  }
2716
2718
  ]
2717
2719
  },
@@ -2740,7 +2742,9 @@ var PACK_REGISTRY = {
2740
2742
  name: "Reviewer",
2741
2743
  description: "Audits correctness, scope, design, and conventions with fresh eyes.",
2742
2744
  skillIds: ["code-review", "code-naming"],
2743
- prompt: REVIEWER_PROMPT
2745
+ prompt: REVIEWER_PROMPT,
2746
+ // Review-only: approving clean with no change is success, not a stall.
2747
+ requiresCommit: false
2744
2748
  },
2745
2749
  {
2746
2750
  role: "qa",
@@ -8017,7 +8021,7 @@ function readAnonId() {
8017
8021
  }
8018
8022
  function superProperties() {
8019
8023
  return {
8020
- cliVersion: true ? "2.61.95" : "0.0.0-dev",
8024
+ cliVersion: true ? "2.61.96" : "0.0.0-dev",
8021
8025
  nodeVersion: process.version,
8022
8026
  platform: process.platform,
8023
8027
  arch: process.arch,
@@ -8198,7 +8202,7 @@ var os4 = __toESM(require("os"));
8198
8202
  // package.json
8199
8203
  var package_default = {
8200
8204
  name: "codeam-cli",
8201
- version: "2.61.95",
8205
+ version: "2.61.96",
8202
8206
  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.",
8203
8207
  type: "commonjs",
8204
8208
  main: "dist/index.js",
@@ -9515,7 +9519,7 @@ var CommandRelayService = class _CommandRelayService {
9515
9519
  // fresh + clear the "CLI update available" banner after a self-update
9516
9520
  // (a codespace that reinstalls @latest reconnects via heartbeat, not
9517
9521
  // pair/reconnect). Older backends ignore the extra field.
9518
- ..."2.61.95" ? { ideVersion: "2.61.95" } : {}
9522
+ ..."2.61.96" ? { ideVersion: "2.61.96" } : {}
9519
9523
  }).then(() => log.trace("relay", `heartbeat ok online=${online}`)).catch((err) => log.trace("relay", `heartbeat failed online=${online}`, err));
9520
9524
  }
9521
9525
  /**
@@ -20688,7 +20692,7 @@ async function autoUpgradeBeforeCriticalCommand() {
20688
20692
  if (process.env.NODE_ENV === "test") return;
20689
20693
  if (process.env.CODEAM_DISABLE_UPDATE_CHECK === "1") return;
20690
20694
  if (process.env.CI) return;
20691
- const current2 = true ? "2.61.95" : null;
20695
+ const current2 = true ? "2.61.96" : null;
20692
20696
  if (!current2) return;
20693
20697
  const cache = readCache();
20694
20698
  const fresh = cache && Date.now() - cache.fetchedAt < TTL_MS;
@@ -20705,7 +20709,7 @@ function checkForUpdates() {
20705
20709
  if (process.env.CODEAM_DISABLE_UPDATE_CHECK === "1") return;
20706
20710
  if (process.env.CI) return;
20707
20711
  if (!process.stdout.isTTY) return;
20708
- const current2 = true ? "2.61.95" : null;
20712
+ const current2 = true ? "2.61.96" : null;
20709
20713
  if (!current2) return;
20710
20714
  const cache = readCache();
20711
20715
  const fresh = cache && Date.now() - cache.fetchedAt < TTL_MS;
@@ -20725,7 +20729,7 @@ var SELF_UPDATE_INTERVAL_MS = 60 * 60 * 1e3;
20725
20729
  var SELF_UPDATE_VIEW_TIMEOUT_MS = 3e4;
20726
20730
  var SELF_UPDATE_INSTALL_TIMEOUT_MS = 18e4;
20727
20731
  function currentCliVersion() {
20728
- return true ? "2.61.95" : null;
20732
+ return true ? "2.61.96" : null;
20729
20733
  }
20730
20734
  function runCmd(cmd, args2, timeoutMs) {
20731
20735
  return new Promise((resolve9) => {
@@ -35742,11 +35746,31 @@ var PackRunner = class _PackRunner {
35742
35746
  await this.settle("aborted");
35743
35747
  return false;
35744
35748
  }
35749
+ const commitOptional = stageDef.requiresCommit === false;
35745
35750
  let endSha = await this.deps.gates.head();
35746
35751
  if (!endSha || endSha === startSha) {
35752
+ if (commitOptional && reply.trim().length > 0) {
35753
+ const reviewedCommit = startSha ? await this.deps.gates.canonicalCommit(startSha) : null;
35754
+ const handoff2 = {
35755
+ commit: reviewedCommit ?? "(no changes)",
35756
+ summary: reply.trim().slice(-SUMMARY_MAX_CHARS),
35757
+ diffStat: "reviewed \u2014 no changes needed",
35758
+ durationMs: Date.now() - startedMs
35759
+ };
35760
+ return this.recordHandoff(index, stageDef.role, handoff2);
35761
+ }
35747
35762
  reply = await this.deps.driver.runTurn(NUDGE_PROMPT, "\u25B6 Waiting for the stage commit\u2026");
35748
35763
  endSha = await this.deps.gates.head();
35749
35764
  if (!endSha || endSha === startSha) {
35765
+ if (commitOptional && reply.trim().length > 0) {
35766
+ const reviewedCommit = startSha ? await this.deps.gates.canonicalCommit(startSha) : null;
35767
+ return this.recordHandoff(index, stageDef.role, {
35768
+ commit: reviewedCommit ?? "(no changes)",
35769
+ summary: reply.trim().slice(-SUMMARY_MAX_CHARS),
35770
+ diffStat: "reviewed \u2014 no changes needed",
35771
+ durationMs: Date.now() - startedMs
35772
+ });
35773
+ }
35750
35774
  return this.stall(index, "stage produced no commit", reply);
35751
35775
  }
35752
35776
  }
@@ -35759,16 +35783,7 @@ var PackRunner = class _PackRunner {
35759
35783
  checks: await this.deps.gates.runChecks() ?? void 0,
35760
35784
  durationMs: Date.now() - startedMs
35761
35785
  };
35762
- stages = this.state.stages.slice();
35763
- stages[index] = { ...stages[index], status: "done", handoff };
35764
- this.state = { ...this.state, stages, currentStage: index + 1 };
35765
- try {
35766
- this.deps.ledger.saveStageHandoff(this.state.runId, index, stageDef.role, handoff);
35767
- } catch (err) {
35768
- this.deps.log(`pack handoff save failed: ${err.message}`);
35769
- }
35770
- await this.publish();
35771
- return true;
35786
+ return this.recordHandoff(index, stageDef.role, handoff);
35772
35787
  } catch (err) {
35773
35788
  if (this.control === "abort") {
35774
35789
  await this.settle("aborted");
@@ -35777,6 +35792,19 @@ var PackRunner = class _PackRunner {
35777
35792
  return this.stall(index, err.message);
35778
35793
  }
35779
35794
  }
35795
+ /** Mark a stage `done` with its handoff, persist, and advance. */
35796
+ async recordHandoff(index, role, handoff) {
35797
+ const stages = this.state.stages.slice();
35798
+ stages[index] = { ...stages[index], status: "done", handoff };
35799
+ this.state = { ...this.state, stages, currentStage: index + 1 };
35800
+ try {
35801
+ this.deps.ledger.saveStageHandoff(this.state.runId, index, role, handoff);
35802
+ } catch (err) {
35803
+ this.deps.log(`pack handoff save failed: ${err.message}`);
35804
+ }
35805
+ await this.publish();
35806
+ return true;
35807
+ }
35780
35808
  async stall(index, reason, lastReply) {
35781
35809
  const stages = this.state.stages.slice();
35782
35810
  stages[index] = { ...stages[index], status: "failed", error: reason };
@@ -42502,7 +42530,7 @@ function checkChokidar() {
42502
42530
  }
42503
42531
  async function doctor(args2 = []) {
42504
42532
  const json = args2.includes("--json");
42505
- const cliVersion = true ? "2.61.95" : "0.0.0-dev";
42533
+ const cliVersion = true ? "2.61.96" : "0.0.0-dev";
42506
42534
  const apiBase2 = resolveApiBaseUrl();
42507
42535
  const diagnosticId = (0, import_node_crypto13.randomUUID)();
42508
42536
  log.info("doctor", `run id=${diagnosticId} cli=${cliVersion}`);
@@ -42893,7 +42921,7 @@ async function mcpRun(args2) {
42893
42921
  // src/commands/version.ts
42894
42922
  var import_picocolors15 = __toESM(require("picocolors"));
42895
42923
  function version2() {
42896
- const v = true ? "2.61.95" : "unknown";
42924
+ const v = true ? "2.61.96" : "unknown";
42897
42925
  console.log(`${import_picocolors15.default.bold("codeam-cli")} ${import_picocolors15.default.cyan(v)}`);
42898
42926
  }
42899
42927
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "codeam-cli",
3
- "version": "2.61.95",
3
+ "version": "2.61.96",
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",