codeam-cli 2.37.0 → 2.37.2
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 +12 -0
- package/dist/index.js +56 -13
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,18 @@ 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.37.1] — 2026-06-11
|
|
8
|
+
|
|
9
|
+
### Fixed
|
|
10
|
+
|
|
11
|
+
- **cli:** Persist ACP onboarding welcome to the conversation anchor
|
|
12
|
+
|
|
13
|
+
## [2.37.0] — 2026-06-11
|
|
14
|
+
|
|
15
|
+
### Added
|
|
16
|
+
|
|
17
|
+
- **cli:** Agent sends a first onboarding welcome on a fresh pair
|
|
18
|
+
|
|
7
19
|
## [2.36.5] — 2026-06-11
|
|
8
20
|
|
|
9
21
|
### Fixed
|
package/dist/index.js
CHANGED
|
@@ -498,7 +498,7 @@ var import_qrcode_terminal = __toESM(require("qrcode-terminal"));
|
|
|
498
498
|
// package.json
|
|
499
499
|
var package_default = {
|
|
500
500
|
name: "codeam-cli",
|
|
501
|
-
version: "2.37.
|
|
501
|
+
version: "2.37.2",
|
|
502
502
|
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.",
|
|
503
503
|
type: "commonjs",
|
|
504
504
|
main: "dist/index.js",
|
|
@@ -5900,7 +5900,7 @@ function readAnonId() {
|
|
|
5900
5900
|
}
|
|
5901
5901
|
function superProperties() {
|
|
5902
5902
|
return {
|
|
5903
|
-
cliVersion: true ? "2.37.
|
|
5903
|
+
cliVersion: true ? "2.37.2" : "0.0.0-dev",
|
|
5904
5904
|
nodeVersion: process.version,
|
|
5905
5905
|
platform: process.platform,
|
|
5906
5906
|
arch: process.arch,
|
|
@@ -15380,19 +15380,25 @@ function buildOnboardingPrompt(cwd) {
|
|
|
15380
15380
|
"card. Take the initiative and write THEIR first message: a short, warm",
|
|
15381
15381
|
"onboarding welcome that you (the agent) send proactively to invite them to start.",
|
|
15382
15382
|
"",
|
|
15383
|
-
"Write it for a phone screen \u2014
|
|
15384
|
-
"energy. Cover briefly, in your own words:",
|
|
15383
|
+
"Write it for a phone screen \u2014 aim ~160 words, friendly, easy to scan, a little",
|
|
15384
|
+
"energy. Cover briefly, in your own words (give the core features visibility):",
|
|
15385
15385
|
"- Glad they spun up this session.",
|
|
15386
|
-
"- Through CodeAgent Mobile, agents like you get native context, persistent",
|
|
15386
|
+
"- Through CodeAgent Mobile, agents like you get native repo context, persistent",
|
|
15387
15387
|
" memory, and an issue tracker \u2014 powered by Beads on Dolt \u2014 out of the box, zero setup.",
|
|
15388
|
-
"- They can drive you from their phone
|
|
15388
|
+
"- They can drive you from their phone, with real core features:",
|
|
15389
|
+
" \u2022 a full integrated IDE powered by Monaco \u2014 edit code, live preview, rich visual output (NOT just a file viewer);",
|
|
15390
|
+
" \u2022 Smart Composer \u2014 helps them craft and structure prompts;",
|
|
15391
|
+
" \u2022 Team Spaces \u2014 share this session with their team to collaborate, or hand a session to someone else.",
|
|
15392
|
+
"- Invite them to share feedback or report any issue via GitHub",
|
|
15393
|
+
" (https://github.com/edgar-durand/codeagent-mobile-clients/issues) or the Discord",
|
|
15394
|
+
" bugs channel (https://discord.gg/ADMKwGAB).",
|
|
15389
15395
|
`- End with a SHORT, concrete invitation tied to THIS project (working dir: ${cwd},`,
|
|
15390
15396
|
` repo: "${repo}") \u2014 suggest 1\u20132 specific things you could help with here.`,
|
|
15391
15397
|
"",
|
|
15392
15398
|
"Rules: do NOT run any tools or shell commands \u2014 base the project hint only on the",
|
|
15393
15399
|
'repo name/path above so your reply is instant. No preamble like "Sure" or "Of',
|
|
15394
15400
|
'course" \u2014 start directly with the greeting. Use light markdown (one intro line +',
|
|
15395
|
-
"a few bullets). Keep it tight."
|
|
15401
|
+
"a few bullets). Keep it tight despite the feature list."
|
|
15396
15402
|
].join("\n");
|
|
15397
15403
|
}
|
|
15398
15404
|
function maybeSendOnboardingWelcome(opts) {
|
|
@@ -15406,13 +15412,27 @@ function maybeSendOnboardingWelcome(opts) {
|
|
|
15406
15412
|
return;
|
|
15407
15413
|
}
|
|
15408
15414
|
log.info("acpRunner", `sending first-pair onboarding welcome for session=${opts.sessionId.slice(0, 8)}`);
|
|
15409
|
-
void
|
|
15415
|
+
void runOnboardingTurn(opts).catch((err) => {
|
|
15410
15416
|
log.warn(
|
|
15411
15417
|
"acpRunner",
|
|
15412
|
-
`onboarding welcome
|
|
15418
|
+
`onboarding welcome turn failed (non-fatal): ${err instanceof Error ? err.message : String(err)}`
|
|
15413
15419
|
);
|
|
15414
15420
|
});
|
|
15415
15421
|
}
|
|
15422
|
+
async function runOnboardingTurn(opts) {
|
|
15423
|
+
const { client: client2, streaming, history, cwd } = opts;
|
|
15424
|
+
await streaming.beginTurn();
|
|
15425
|
+
try {
|
|
15426
|
+
await client2.prompt(buildOnboardingPrompt(cwd));
|
|
15427
|
+
const reply = streaming.getCurrentText();
|
|
15428
|
+
await streaming.closeAll();
|
|
15429
|
+
history.appendAgentInitiatedReply(reply);
|
|
15430
|
+
await history.flush();
|
|
15431
|
+
} catch (err) {
|
|
15432
|
+
await streaming.closeAll().catch(() => void 0);
|
|
15433
|
+
throw err;
|
|
15434
|
+
}
|
|
15435
|
+
}
|
|
15416
15436
|
|
|
15417
15437
|
// src/agents/acp/promptEcho.ts
|
|
15418
15438
|
var MAX_PROMPT_CHARS = 200;
|
|
@@ -21243,6 +21263,23 @@ var AcpHistory = class {
|
|
|
21243
21263
|
timestamp: Date.now()
|
|
21244
21264
|
});
|
|
21245
21265
|
}
|
|
21266
|
+
/**
|
|
21267
|
+
* Record an agent-initiated reply that has NO preceding user prompt
|
|
21268
|
+
* — the first-pair onboarding welcome the agent sends on its own.
|
|
21269
|
+
* Seeds the RECENT summary from the reply itself (so {@link flush}
|
|
21270
|
+
* isn't skipped for lack of a user prompt) and appends ONLY the
|
|
21271
|
+
* agent message: the background instruction that produced this reply
|
|
21272
|
+
* must never surface as a user bubble on mobile.
|
|
21273
|
+
*/
|
|
21274
|
+
appendAgentInitiatedReply(text) {
|
|
21275
|
+
const trimmed = text.trim();
|
|
21276
|
+
if (trimmed.length === 0) return;
|
|
21277
|
+
if (this.summary === null) {
|
|
21278
|
+
const oneLine = trimmed.replace(/\s+/g, " ");
|
|
21279
|
+
this.summary = oneLine.length > 120 ? oneLine.slice(0, 117) + "\u2026" : oneLine;
|
|
21280
|
+
}
|
|
21281
|
+
this.appendAgentReply(text);
|
|
21282
|
+
}
|
|
21246
21283
|
/**
|
|
21247
21284
|
* Push both the session list (RECENT entry) and the cumulative
|
|
21248
21285
|
* conversation to the backend. Fire-and-forget — failures land in
|
|
@@ -21385,10 +21422,16 @@ async function runAcpSession(opts) {
|
|
|
21385
21422
|
path: opts.cwd,
|
|
21386
21423
|
done: true
|
|
21387
21424
|
});
|
|
21388
|
-
maybeSendOnboardingWelcome({ client: client2, sessionId: opts.sessionId, cwd: opts.cwd });
|
|
21389
21425
|
const runtime = createInteractiveAgentStrategy(opts.agent, createOsStrategy());
|
|
21390
21426
|
const models = await runtime.listModels();
|
|
21391
21427
|
const history = new AcpHistory(publisher, { agent: opts.agent, acpSessionId });
|
|
21428
|
+
maybeSendOnboardingWelcome({
|
|
21429
|
+
client: client2,
|
|
21430
|
+
streaming,
|
|
21431
|
+
history,
|
|
21432
|
+
sessionId: opts.sessionId,
|
|
21433
|
+
cwd: opts.cwd
|
|
21434
|
+
});
|
|
21392
21435
|
const turnFiles = new TurnFileAggregator({
|
|
21393
21436
|
workingDir: opts.cwd,
|
|
21394
21437
|
sessionId: opts.sessionId,
|
|
@@ -26559,7 +26602,7 @@ function checkChokidar() {
|
|
|
26559
26602
|
}
|
|
26560
26603
|
async function doctor(args2 = []) {
|
|
26561
26604
|
const json = args2.includes("--json");
|
|
26562
|
-
const cliVersion = true ? "2.37.
|
|
26605
|
+
const cliVersion = true ? "2.37.2" : "0.0.0-dev";
|
|
26563
26606
|
const apiBase = resolveApiBaseUrl();
|
|
26564
26607
|
const diagnosticId = (0, import_node_crypto8.randomUUID)();
|
|
26565
26608
|
log.info("doctor", `run id=${diagnosticId} cli=${cliVersion}`);
|
|
@@ -26758,7 +26801,7 @@ async function completion(args2) {
|
|
|
26758
26801
|
// src/commands/version.ts
|
|
26759
26802
|
var import_picocolors13 = __toESM(require("picocolors"));
|
|
26760
26803
|
function version2() {
|
|
26761
|
-
const v = true ? "2.37.
|
|
26804
|
+
const v = true ? "2.37.2" : "unknown";
|
|
26762
26805
|
console.log(`${import_picocolors13.default.bold("codeam-cli")} ${import_picocolors13.default.cyan(v)}`);
|
|
26763
26806
|
}
|
|
26764
26807
|
|
|
@@ -27044,7 +27087,7 @@ function checkForUpdates() {
|
|
|
27044
27087
|
if (process.env.CODEAM_DISABLE_UPDATE_CHECK === "1") return;
|
|
27045
27088
|
if (process.env.CI) return;
|
|
27046
27089
|
if (!process.stdout.isTTY) return;
|
|
27047
|
-
const current = true ? "2.37.
|
|
27090
|
+
const current = true ? "2.37.2" : null;
|
|
27048
27091
|
if (!current) return;
|
|
27049
27092
|
const cache = readCache();
|
|
27050
27093
|
const fresh = cache && Date.now() - cache.fetchedAt < TTL_MS;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "codeam-cli",
|
|
3
|
-
"version": "2.37.
|
|
3
|
+
"version": "2.37.2",
|
|
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",
|