codeam-cli 2.52.7 → 2.52.8
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 +6 -0
- package/dist/index.js +136 -98
- package/package.json +1 -1
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.52.7] — 2026-07-03
|
|
8
|
+
|
|
9
|
+
### Fixed
|
|
10
|
+
|
|
11
|
+
- **cli:** Wait for Claude native binary before spawning the agent in codespaces
|
|
12
|
+
|
|
7
13
|
## [2.52.6] — 2026-07-03
|
|
8
14
|
|
|
9
15
|
### Fixed
|
package/dist/index.js
CHANGED
|
@@ -5397,7 +5397,7 @@ function readAnonId() {
|
|
|
5397
5397
|
}
|
|
5398
5398
|
function superProperties() {
|
|
5399
5399
|
return {
|
|
5400
|
-
cliVersion: true ? "2.52.
|
|
5400
|
+
cliVersion: true ? "2.52.8" : "0.0.0-dev",
|
|
5401
5401
|
nodeVersion: process.version,
|
|
5402
5402
|
platform: process.platform,
|
|
5403
5403
|
arch: process.arch,
|
|
@@ -5578,7 +5578,7 @@ var os4 = __toESM(require("os"));
|
|
|
5578
5578
|
// package.json
|
|
5579
5579
|
var package_default = {
|
|
5580
5580
|
name: "codeam-cli",
|
|
5581
|
-
version: "2.52.
|
|
5581
|
+
version: "2.52.8",
|
|
5582
5582
|
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.",
|
|
5583
5583
|
type: "commonjs",
|
|
5584
5584
|
main: "dist/index.js",
|
|
@@ -14928,7 +14928,7 @@ async function autoUpgradeBeforeCriticalCommand() {
|
|
|
14928
14928
|
if (process.env.NODE_ENV === "test") return;
|
|
14929
14929
|
if (process.env.CODEAM_DISABLE_UPDATE_CHECK === "1") return;
|
|
14930
14930
|
if (process.env.CI) return;
|
|
14931
|
-
const current = true ? "2.52.
|
|
14931
|
+
const current = true ? "2.52.8" : null;
|
|
14932
14932
|
if (!current) return;
|
|
14933
14933
|
const cache = readCache();
|
|
14934
14934
|
const fresh = cache && Date.now() - cache.fetchedAt < TTL_MS;
|
|
@@ -14945,7 +14945,7 @@ function checkForUpdates() {
|
|
|
14945
14945
|
if (process.env.CODEAM_DISABLE_UPDATE_CHECK === "1") return;
|
|
14946
14946
|
if (process.env.CI) return;
|
|
14947
14947
|
if (!process.stdout.isTTY) return;
|
|
14948
|
-
const current = true ? "2.52.
|
|
14948
|
+
const current = true ? "2.52.8" : null;
|
|
14949
14949
|
if (!current) return;
|
|
14950
14950
|
const cache = readCache();
|
|
14951
14951
|
const fresh = cache && Date.now() - cache.fetchedAt < TTL_MS;
|
|
@@ -15647,7 +15647,7 @@ var defaultSpawner = (env, cwd, args2 = []) => (0, import_node_child_process15.s
|
|
|
15647
15647
|
detached: false
|
|
15648
15648
|
});
|
|
15649
15649
|
function currentCliVersion() {
|
|
15650
|
-
return true ? "2.52.
|
|
15650
|
+
return true ? "2.52.8" : null;
|
|
15651
15651
|
}
|
|
15652
15652
|
function runCmd(cmd, args2, timeoutMs) {
|
|
15653
15653
|
return new Promise((resolve7) => {
|
|
@@ -20997,19 +20997,98 @@ var AgentService = class _AgentService {
|
|
|
20997
20997
|
};
|
|
20998
20998
|
|
|
20999
20999
|
// src/agents/acp/adapters.ts
|
|
21000
|
-
var
|
|
21000
|
+
var path51 = __toESM(require("path"));
|
|
21001
|
+
|
|
21002
|
+
// src/agents/acp/agent-binary.ts
|
|
21003
|
+
var import_fs4 = __toESM(require("fs"));
|
|
21004
|
+
var import_path8 = __toESM(require("path"));
|
|
21005
|
+
var import_child_process23 = require("child_process");
|
|
21006
|
+
function currentPlatformKey() {
|
|
21007
|
+
return `${process.platform}-${process.arch}`;
|
|
21008
|
+
}
|
|
21009
|
+
function defaultSdkDir() {
|
|
21010
|
+
try {
|
|
21011
|
+
const manifest = require.resolve("@anthropic-ai/claude-agent-sdk/package.json");
|
|
21012
|
+
return import_path8.default.dirname(manifest);
|
|
21013
|
+
} catch {
|
|
21014
|
+
return null;
|
|
21015
|
+
}
|
|
21016
|
+
}
|
|
21017
|
+
function resolveClaudeNativeBinary(deps = {}) {
|
|
21018
|
+
const existsSync21 = deps.existsSync ?? import_fs4.default.existsSync;
|
|
21019
|
+
const platformKey = deps.platformKey ?? currentPlatformKey();
|
|
21020
|
+
const sdkDir = deps.sdkDir !== void 0 ? deps.sdkDir : defaultSdkDir();
|
|
21021
|
+
if (!sdkDir) return null;
|
|
21022
|
+
const scopeDir = import_path8.default.dirname(sdkDir);
|
|
21023
|
+
const binName = process.platform === "win32" ? "claude.exe" : "claude";
|
|
21024
|
+
const candidate = import_path8.default.join(scopeDir, `claude-agent-sdk-${platformKey}`, binName);
|
|
21025
|
+
return existsSync21(candidate) ? candidate : null;
|
|
21026
|
+
}
|
|
21027
|
+
var realSleep = (ms) => new Promise((resolve7) => setTimeout(resolve7, ms));
|
|
21028
|
+
async function waitForClaudeNativeBinary(opts = {}) {
|
|
21029
|
+
const timeoutMs = opts.timeoutMs ?? 18e4;
|
|
21030
|
+
const pollMs = opts.pollMs ?? 500;
|
|
21031
|
+
const now = opts.now ?? Date.now;
|
|
21032
|
+
const sleep3 = opts.sleep ?? realSleep;
|
|
21033
|
+
const deps = {
|
|
21034
|
+
sdkDir: opts.sdkDir,
|
|
21035
|
+
platformKey: opts.platformKey,
|
|
21036
|
+
existsSync: opts.existsSync
|
|
21037
|
+
};
|
|
21038
|
+
const deadline = now() + timeoutMs;
|
|
21039
|
+
let found = resolveClaudeNativeBinary(deps);
|
|
21040
|
+
if (found) return found;
|
|
21041
|
+
while (now() < deadline) {
|
|
21042
|
+
await sleep3(pollMs);
|
|
21043
|
+
found = resolveClaudeNativeBinary(deps);
|
|
21044
|
+
if (found) return found;
|
|
21045
|
+
}
|
|
21046
|
+
return resolveClaudeNativeBinary(deps);
|
|
21047
|
+
}
|
|
21048
|
+
function isCommandOnPath(cmd, probe = defaultWhich) {
|
|
21049
|
+
return probe(cmd);
|
|
21050
|
+
}
|
|
21051
|
+
function defaultWhich(cmd) {
|
|
21052
|
+
const finder = process.platform === "win32" ? "where" : "which";
|
|
21053
|
+
try {
|
|
21054
|
+
const res = (0, import_child_process23.spawnSync)(finder, [cmd], { stdio: "ignore" });
|
|
21055
|
+
return res.status === 0;
|
|
21056
|
+
} catch {
|
|
21057
|
+
return false;
|
|
21058
|
+
}
|
|
21059
|
+
}
|
|
21060
|
+
async function waitForCommandOnPath(cmd, opts = {}) {
|
|
21061
|
+
const timeoutMs = opts.timeoutMs ?? 18e4;
|
|
21062
|
+
const pollMs = opts.pollMs ?? 500;
|
|
21063
|
+
const now = opts.now ?? Date.now;
|
|
21064
|
+
const sleep3 = opts.sleep ?? realSleep;
|
|
21065
|
+
const probe = opts.probe;
|
|
21066
|
+
const check = () => isCommandOnPath(cmd, probe);
|
|
21067
|
+
const deadline = now() + timeoutMs;
|
|
21068
|
+
if (check()) return true;
|
|
21069
|
+
while (now() < deadline) {
|
|
21070
|
+
await sleep3(pollMs);
|
|
21071
|
+
if (check()) return true;
|
|
21072
|
+
}
|
|
21073
|
+
return check();
|
|
21074
|
+
}
|
|
21075
|
+
|
|
21076
|
+
// src/agents/acp/adapters.ts
|
|
21001
21077
|
var require_ = require;
|
|
21078
|
+
function claudeBinaryWaiter(opts = {}) {
|
|
21079
|
+
return waitForClaudeNativeBinary(opts).then((p2) => p2 !== null);
|
|
21080
|
+
}
|
|
21002
21081
|
function resolveBin(pkgName, binName) {
|
|
21003
21082
|
try {
|
|
21004
21083
|
const manifestPath = require_.resolve(`${pkgName}/package.json`);
|
|
21005
21084
|
const manifest = require_(`${pkgName}/package.json`);
|
|
21006
|
-
const pkgDir =
|
|
21085
|
+
const pkgDir = path51.dirname(manifestPath);
|
|
21007
21086
|
const bin = manifest.bin;
|
|
21008
21087
|
if (!bin) return null;
|
|
21009
|
-
if (typeof bin === "string") return
|
|
21088
|
+
if (typeof bin === "string") return path51.resolve(pkgDir, bin);
|
|
21010
21089
|
const target = binName ?? Object.keys(bin)[0];
|
|
21011
21090
|
if (!target || !bin[target]) return null;
|
|
21012
|
-
return
|
|
21091
|
+
return path51.resolve(pkgDir, bin[target]);
|
|
21013
21092
|
} catch {
|
|
21014
21093
|
return null;
|
|
21015
21094
|
}
|
|
@@ -21021,7 +21100,8 @@ var REGISTRY = {
|
|
|
21021
21100
|
return {
|
|
21022
21101
|
command: process.execPath,
|
|
21023
21102
|
args: [bin],
|
|
21024
|
-
requiresAgentBinary: "claude"
|
|
21103
|
+
requiresAgentBinary: "claude",
|
|
21104
|
+
waitForBinary: claudeBinaryWaiter
|
|
21025
21105
|
};
|
|
21026
21106
|
},
|
|
21027
21107
|
codex: () => {
|
|
@@ -21030,7 +21110,9 @@ var REGISTRY = {
|
|
|
21030
21110
|
return {
|
|
21031
21111
|
command: process.execPath,
|
|
21032
21112
|
args: [bin],
|
|
21033
|
-
requiresAgentBinary: "codex"
|
|
21113
|
+
requiresAgentBinary: "codex",
|
|
21114
|
+
// codex ships via `npm install -g @openai/codex` → PATH binary.
|
|
21115
|
+
waitForBinary: (o) => waitForCommandOnPath("codex", o)
|
|
21034
21116
|
};
|
|
21035
21117
|
},
|
|
21036
21118
|
// Cursor speaks ACP NATIVELY via `cursor-agent acp` ("Start the Cursor
|
|
@@ -21047,7 +21129,8 @@ var REGISTRY = {
|
|
|
21047
21129
|
cursor: () => ({
|
|
21048
21130
|
command: "cursor-agent",
|
|
21049
21131
|
args: ["acp"],
|
|
21050
|
-
requiresAgentBinary: "cursor-agent"
|
|
21132
|
+
requiresAgentBinary: "cursor-agent",
|
|
21133
|
+
waitForBinary: (o) => waitForCommandOnPath("cursor-agent", o)
|
|
21051
21134
|
}),
|
|
21052
21135
|
// Gemini speaks ACP natively via `gemini --acp` — no npm adapter
|
|
21053
21136
|
// package, just the user-installed `gemini` binary on PATH. Same
|
|
@@ -21064,7 +21147,8 @@ var REGISTRY = {
|
|
|
21064
21147
|
// cleaner because it survives whatever shell env the parent
|
|
21065
21148
|
// codeam was launched from.
|
|
21066
21149
|
args: ["--skip-trust", "--acp"],
|
|
21067
|
-
requiresAgentBinary: "gemini"
|
|
21150
|
+
requiresAgentBinary: "gemini",
|
|
21151
|
+
waitForBinary: (o) => waitForCommandOnPath("gemini", o)
|
|
21068
21152
|
})
|
|
21069
21153
|
};
|
|
21070
21154
|
function getAcpAdapter(agent) {
|
|
@@ -21075,52 +21159,6 @@ function requiresAcp(agent) {
|
|
|
21075
21159
|
return getAcpAdapter(agent) !== null;
|
|
21076
21160
|
}
|
|
21077
21161
|
|
|
21078
|
-
// src/agents/acp/claude-binary.ts
|
|
21079
|
-
var import_fs4 = __toESM(require("fs"));
|
|
21080
|
-
var import_path8 = __toESM(require("path"));
|
|
21081
|
-
function currentPlatformKey() {
|
|
21082
|
-
return `${process.platform}-${process.arch}`;
|
|
21083
|
-
}
|
|
21084
|
-
function defaultSdkDir() {
|
|
21085
|
-
try {
|
|
21086
|
-
const manifest = require.resolve("@anthropic-ai/claude-agent-sdk/package.json");
|
|
21087
|
-
return import_path8.default.dirname(manifest);
|
|
21088
|
-
} catch {
|
|
21089
|
-
return null;
|
|
21090
|
-
}
|
|
21091
|
-
}
|
|
21092
|
-
function resolveClaudeNativeBinary(deps = {}) {
|
|
21093
|
-
const existsSync21 = deps.existsSync ?? import_fs4.default.existsSync;
|
|
21094
|
-
const platformKey = deps.platformKey ?? currentPlatformKey();
|
|
21095
|
-
const sdkDir = deps.sdkDir !== void 0 ? deps.sdkDir : defaultSdkDir();
|
|
21096
|
-
if (!sdkDir) return null;
|
|
21097
|
-
const scopeDir = import_path8.default.dirname(sdkDir);
|
|
21098
|
-
const binName = process.platform === "win32" ? "claude.exe" : "claude";
|
|
21099
|
-
const candidate = import_path8.default.join(scopeDir, `claude-agent-sdk-${platformKey}`, binName);
|
|
21100
|
-
return existsSync21(candidate) ? candidate : null;
|
|
21101
|
-
}
|
|
21102
|
-
var realSleep = (ms) => new Promise((resolve7) => setTimeout(resolve7, ms));
|
|
21103
|
-
async function waitForClaudeNativeBinary(opts = {}) {
|
|
21104
|
-
const timeoutMs = opts.timeoutMs ?? 18e4;
|
|
21105
|
-
const pollMs = opts.pollMs ?? 500;
|
|
21106
|
-
const now = opts.now ?? Date.now;
|
|
21107
|
-
const sleep3 = opts.sleep ?? realSleep;
|
|
21108
|
-
const deps = {
|
|
21109
|
-
sdkDir: opts.sdkDir,
|
|
21110
|
-
platformKey: opts.platformKey,
|
|
21111
|
-
existsSync: opts.existsSync
|
|
21112
|
-
};
|
|
21113
|
-
const deadline = now() + timeoutMs;
|
|
21114
|
-
let found = resolveClaudeNativeBinary(deps);
|
|
21115
|
-
if (found) return found;
|
|
21116
|
-
while (now() < deadline) {
|
|
21117
|
-
await sleep3(pollMs);
|
|
21118
|
-
found = resolveClaudeNativeBinary(deps);
|
|
21119
|
-
if (found) return found;
|
|
21120
|
-
}
|
|
21121
|
-
return resolveClaudeNativeBinary(deps);
|
|
21122
|
-
}
|
|
21123
|
-
|
|
21124
21162
|
// src/agents/acp/runner.ts
|
|
21125
21163
|
var import_node_crypto7 = require("crypto");
|
|
21126
21164
|
|
|
@@ -25160,7 +25198,7 @@ function commonPrefixLength(a, b) {
|
|
|
25160
25198
|
}
|
|
25161
25199
|
|
|
25162
25200
|
// src/agents/acp/onboarding.ts
|
|
25163
|
-
var
|
|
25201
|
+
var import_child_process24 = require("child_process");
|
|
25164
25202
|
var fs48 = __toESM(require("fs"));
|
|
25165
25203
|
var os40 = __toESM(require("os"));
|
|
25166
25204
|
var path54 = __toESM(require("path"));
|
|
@@ -25181,7 +25219,7 @@ var _onboardingSeam = {
|
|
|
25181
25219
|
*/
|
|
25182
25220
|
gitRemoteUrl: (cwd) => {
|
|
25183
25221
|
try {
|
|
25184
|
-
return (0,
|
|
25222
|
+
return (0, import_child_process24.execFileSync)("git", ["-C", cwd, "remote", "get-url", "origin"], {
|
|
25185
25223
|
encoding: "utf8",
|
|
25186
25224
|
stdio: ["ignore", "pipe", "ignore"],
|
|
25187
25225
|
timeout: 2e3
|
|
@@ -25483,7 +25521,7 @@ function extractSelectPrompt(text) {
|
|
|
25483
25521
|
var import_crypto5 = require("crypto");
|
|
25484
25522
|
|
|
25485
25523
|
// src/services/turn-files/git-changeset.ts
|
|
25486
|
-
var
|
|
25524
|
+
var import_child_process25 = require("child_process");
|
|
25487
25525
|
var fs49 = __toESM(require("fs/promises"));
|
|
25488
25526
|
var path55 = __toESM(require("path"));
|
|
25489
25527
|
async function collectRepoChangeset(opts) {
|
|
@@ -25598,7 +25636,7 @@ function defaultRunGit(cwd, args2) {
|
|
|
25598
25636
|
return new Promise((resolve7) => {
|
|
25599
25637
|
let proc;
|
|
25600
25638
|
try {
|
|
25601
|
-
proc = (0,
|
|
25639
|
+
proc = (0, import_child_process25.spawn)("git", args2, { cwd, env: process.env });
|
|
25602
25640
|
} catch {
|
|
25603
25641
|
resolve7(null);
|
|
25604
25642
|
return;
|
|
@@ -28574,10 +28612,10 @@ async function start(requestedAgent) {
|
|
|
28574
28612
|
const depsReady = process.env.CODESPACES === "true" ? provisionProjectDependencies(cwd).catch(() => void 0) : Promise.resolve();
|
|
28575
28613
|
if (process.env.CODESPACES === "true") {
|
|
28576
28614
|
const GATE_TIMEOUT_MS = 24e4;
|
|
28577
|
-
const
|
|
28615
|
+
const agentBinaryReady = getAcpAdapter(session.agent)?.waitForBinary({ timeoutMs: GATE_TIMEOUT_MS }).catch(() => false) ?? Promise.resolve(true);
|
|
28578
28616
|
let gateTimer;
|
|
28579
28617
|
await Promise.race([
|
|
28580
|
-
Promise.all([beadsReady.catch(() => null), depsReady,
|
|
28618
|
+
Promise.all([beadsReady.catch(() => null), depsReady, agentBinaryReady]),
|
|
28581
28619
|
new Promise((resolve7) => {
|
|
28582
28620
|
gateTimer = setTimeout(resolve7, GATE_TIMEOUT_MS);
|
|
28583
28621
|
})
|
|
@@ -29118,11 +29156,11 @@ async function logout() {
|
|
|
29118
29156
|
var import_picocolors11 = __toESM(require("picocolors"));
|
|
29119
29157
|
|
|
29120
29158
|
// src/services/providers/github-codespaces.ts
|
|
29121
|
-
var
|
|
29159
|
+
var import_child_process26 = require("child_process");
|
|
29122
29160
|
var import_util4 = require("util");
|
|
29123
29161
|
var import_picocolors9 = __toESM(require("picocolors"));
|
|
29124
29162
|
var path58 = __toESM(require("path"));
|
|
29125
|
-
var execFileP6 = (0, import_util4.promisify)(
|
|
29163
|
+
var execFileP6 = (0, import_util4.promisify)(import_child_process26.execFile);
|
|
29126
29164
|
var MAX_BUFFER = 8 * 1024 * 1024;
|
|
29127
29165
|
function resetStdinForChild() {
|
|
29128
29166
|
if (process.stdin.isTTY) {
|
|
@@ -29166,7 +29204,7 @@ var GitHubCodespacesProvider = class {
|
|
|
29166
29204
|
if (!isAuthed) {
|
|
29167
29205
|
resetStdinForChild();
|
|
29168
29206
|
await new Promise((resolve7, reject) => {
|
|
29169
|
-
const proc = (0,
|
|
29207
|
+
const proc = (0, import_child_process26.spawn)("gh", ["auth", "login", "-s", "codespace,repo,read:user"], {
|
|
29170
29208
|
stdio: "inherit"
|
|
29171
29209
|
});
|
|
29172
29210
|
proc.on("exit", (code) => {
|
|
@@ -29200,7 +29238,7 @@ var GitHubCodespacesProvider = class {
|
|
|
29200
29238
|
wt(noteLines.join("\n"), "One more permission needed");
|
|
29201
29239
|
resetStdinForChild();
|
|
29202
29240
|
const refreshCode = await new Promise((resolve7, reject) => {
|
|
29203
|
-
const proc = (0,
|
|
29241
|
+
const proc = (0, import_child_process26.spawn)(
|
|
29204
29242
|
"gh",
|
|
29205
29243
|
["auth", "refresh", "-h", "github.com", "-s", "codespace"],
|
|
29206
29244
|
{ stdio: "inherit" }
|
|
@@ -29350,7 +29388,7 @@ var GitHubCodespacesProvider = class {
|
|
|
29350
29388
|
O2.step(`Installing gh via ${installCmd.describe}\u2026`);
|
|
29351
29389
|
resetStdinForChild();
|
|
29352
29390
|
const ok = await new Promise((resolve7) => {
|
|
29353
|
-
const proc = (0,
|
|
29391
|
+
const proc = (0, import_child_process26.spawn)(installCmd.exe, installCmd.args, { stdio: "inherit" });
|
|
29354
29392
|
proc.on("exit", (code) => resolve7(code === 0));
|
|
29355
29393
|
proc.on("error", () => resolve7(false));
|
|
29356
29394
|
});
|
|
@@ -29377,7 +29415,7 @@ var GitHubCodespacesProvider = class {
|
|
|
29377
29415
|
);
|
|
29378
29416
|
resetStdinForChild();
|
|
29379
29417
|
await new Promise((resolve7, reject) => {
|
|
29380
|
-
const proc = (0,
|
|
29418
|
+
const proc = (0, import_child_process26.spawn)(
|
|
29381
29419
|
"gh",
|
|
29382
29420
|
["auth", "refresh", "-h", "github.com", "-s", "repo,read:org"],
|
|
29383
29421
|
{ stdio: "inherit" }
|
|
@@ -29555,7 +29593,7 @@ var GitHubCodespacesProvider = class {
|
|
|
29555
29593
|
async streamCommand(workspaceId, command2) {
|
|
29556
29594
|
resetStdinForChild();
|
|
29557
29595
|
return new Promise((resolve7, reject) => {
|
|
29558
|
-
const proc = (0,
|
|
29596
|
+
const proc = (0, import_child_process26.spawn)(
|
|
29559
29597
|
"gh",
|
|
29560
29598
|
["codespace", "ssh", "-c", workspaceId, "--", "-tt", command2],
|
|
29561
29599
|
{ stdio: "inherit" }
|
|
@@ -29582,11 +29620,11 @@ var GitHubCodespacesProvider = class {
|
|
|
29582
29620
|
`mkdir -p ${shellQuote(remoteDir)} && tar -xzf - -C ${shellQuote(remoteDir)}`
|
|
29583
29621
|
];
|
|
29584
29622
|
await new Promise((resolve7, reject) => {
|
|
29585
|
-
const tar = (0,
|
|
29623
|
+
const tar = (0, import_child_process26.spawn)("tar", tarArgs, {
|
|
29586
29624
|
stdio: ["ignore", "pipe", "pipe"],
|
|
29587
29625
|
env: tarEnv
|
|
29588
29626
|
});
|
|
29589
|
-
const ssh = (0,
|
|
29627
|
+
const ssh = (0, import_child_process26.spawn)("gh", sshArgs, {
|
|
29590
29628
|
stdio: [tar.stdout, "pipe", "pipe"]
|
|
29591
29629
|
});
|
|
29592
29630
|
let tarErr = "";
|
|
@@ -29620,7 +29658,7 @@ var GitHubCodespacesProvider = class {
|
|
|
29620
29658
|
}
|
|
29621
29659
|
const cmd = parts.join(" && ");
|
|
29622
29660
|
await new Promise((resolve7, reject) => {
|
|
29623
|
-
const proc = (0,
|
|
29661
|
+
const proc = (0, import_child_process26.spawn)(
|
|
29624
29662
|
"gh",
|
|
29625
29663
|
["codespace", "ssh", "-c", workspaceId, "--", cmd],
|
|
29626
29664
|
{ stdio: ["pipe", "pipe", "pipe"] }
|
|
@@ -29678,11 +29716,11 @@ function shellQuote(s) {
|
|
|
29678
29716
|
}
|
|
29679
29717
|
|
|
29680
29718
|
// src/services/providers/gitpod.ts
|
|
29681
|
-
var
|
|
29719
|
+
var import_child_process27 = require("child_process");
|
|
29682
29720
|
var import_util5 = require("util");
|
|
29683
29721
|
var path59 = __toESM(require("path"));
|
|
29684
29722
|
var import_picocolors10 = __toESM(require("picocolors"));
|
|
29685
|
-
var execFileP7 = (0, import_util5.promisify)(
|
|
29723
|
+
var execFileP7 = (0, import_util5.promisify)(import_child_process27.execFile);
|
|
29686
29724
|
var MAX_BUFFER2 = 8 * 1024 * 1024;
|
|
29687
29725
|
function resetStdinForChild2() {
|
|
29688
29726
|
if (process.stdin.isTTY) {
|
|
@@ -29722,7 +29760,7 @@ var GitpodProvider = class {
|
|
|
29722
29760
|
);
|
|
29723
29761
|
resetStdinForChild2();
|
|
29724
29762
|
await new Promise((resolve7, reject) => {
|
|
29725
|
-
const proc = (0,
|
|
29763
|
+
const proc = (0, import_child_process27.spawn)("gitpod", ["login"], { stdio: "inherit" });
|
|
29726
29764
|
proc.on("exit", (code) => {
|
|
29727
29765
|
if (code === 0) resolve7();
|
|
29728
29766
|
else reject(new Error("gitpod login failed."));
|
|
@@ -29874,7 +29912,7 @@ var GitpodProvider = class {
|
|
|
29874
29912
|
async streamCommand(workspaceId, command2) {
|
|
29875
29913
|
resetStdinForChild2();
|
|
29876
29914
|
return new Promise((resolve7, reject) => {
|
|
29877
|
-
const proc = (0,
|
|
29915
|
+
const proc = (0, import_child_process27.spawn)(
|
|
29878
29916
|
"gitpod",
|
|
29879
29917
|
["workspace", "ssh", workspaceId, "--", "-tt", command2],
|
|
29880
29918
|
{ stdio: "inherit" }
|
|
@@ -29894,11 +29932,11 @@ var GitpodProvider = class {
|
|
|
29894
29932
|
const tarEnv = { ...process.env, COPYFILE_DISABLE: "1" };
|
|
29895
29933
|
const remoteCmd = `mkdir -p ${shellQuote2(remoteDir)} && tar -xzf - -C ${shellQuote2(remoteDir)}`;
|
|
29896
29934
|
await new Promise((resolve7, reject) => {
|
|
29897
|
-
const tar = (0,
|
|
29935
|
+
const tar = (0, import_child_process27.spawn)("tar", tarArgs, {
|
|
29898
29936
|
stdio: ["ignore", "pipe", "pipe"],
|
|
29899
29937
|
env: tarEnv
|
|
29900
29938
|
});
|
|
29901
|
-
const ssh = (0,
|
|
29939
|
+
const ssh = (0, import_child_process27.spawn)(
|
|
29902
29940
|
"gitpod",
|
|
29903
29941
|
["workspace", "ssh", workspaceId, "--", remoteCmd],
|
|
29904
29942
|
{ stdio: [tar.stdout, "pipe", "pipe"] }
|
|
@@ -29930,7 +29968,7 @@ var GitpodProvider = class {
|
|
|
29930
29968
|
}
|
|
29931
29969
|
const cmd = parts.join(" && ");
|
|
29932
29970
|
await new Promise((resolve7, reject) => {
|
|
29933
|
-
const proc = (0,
|
|
29971
|
+
const proc = (0, import_child_process27.spawn)(
|
|
29934
29972
|
"gitpod",
|
|
29935
29973
|
["workspace", "ssh", workspaceId, "--", cmd],
|
|
29936
29974
|
{ stdio: ["pipe", "pipe", "pipe"] }
|
|
@@ -29954,10 +29992,10 @@ function shellQuote2(s) {
|
|
|
29954
29992
|
}
|
|
29955
29993
|
|
|
29956
29994
|
// src/services/providers/gitlab-workspaces.ts
|
|
29957
|
-
var
|
|
29995
|
+
var import_child_process28 = require("child_process");
|
|
29958
29996
|
var import_util6 = require("util");
|
|
29959
29997
|
var path60 = __toESM(require("path"));
|
|
29960
|
-
var execFileP8 = (0, import_util6.promisify)(
|
|
29998
|
+
var execFileP8 = (0, import_util6.promisify)(import_child_process28.execFile);
|
|
29961
29999
|
var MAX_BUFFER3 = 8 * 1024 * 1024;
|
|
29962
30000
|
var GITLAB_API_BASE = process.env.CODEAM_GITLAB_API_URL ?? "https://gitlab.com/api/v4";
|
|
29963
30001
|
function resetStdinForChild3() {
|
|
@@ -29999,7 +30037,7 @@ var GitLabWorkspacesProvider = class {
|
|
|
29999
30037
|
);
|
|
30000
30038
|
resetStdinForChild3();
|
|
30001
30039
|
await new Promise((resolve7, reject) => {
|
|
30002
|
-
const proc = (0,
|
|
30040
|
+
const proc = (0, import_child_process28.spawn)(
|
|
30003
30041
|
"glab",
|
|
30004
30042
|
["auth", "login", "--scopes", "api,read_user,read_repository"],
|
|
30005
30043
|
{ stdio: "inherit" }
|
|
@@ -30171,7 +30209,7 @@ Docs: https://docs.gitlab.com/ee/user/workspace/configuration.html`
|
|
|
30171
30209
|
const sshHost = process.env.CODEAM_GITLAB_SSH_HOST ?? "workspaces.gitlab.com";
|
|
30172
30210
|
resetStdinForChild3();
|
|
30173
30211
|
return new Promise((resolve7, reject) => {
|
|
30174
|
-
const proc = (0,
|
|
30212
|
+
const proc = (0, import_child_process28.spawn)(
|
|
30175
30213
|
"ssh",
|
|
30176
30214
|
["-tt", "-o", "StrictHostKeyChecking=accept-new", `${workspaceId}@${sshHost}`, command2],
|
|
30177
30215
|
{ stdio: "inherit" }
|
|
@@ -30192,8 +30230,8 @@ Docs: https://docs.gitlab.com/ee/user/workspace/configuration.html`
|
|
|
30192
30230
|
const tarEnv = { ...process.env, COPYFILE_DISABLE: "1" };
|
|
30193
30231
|
const remoteCmd = `mkdir -p ${shellQuote3(remoteDir)} && tar -xzf - -C ${shellQuote3(remoteDir)}`;
|
|
30194
30232
|
await new Promise((resolve7, reject) => {
|
|
30195
|
-
const tar = (0,
|
|
30196
|
-
const ssh = (0,
|
|
30233
|
+
const tar = (0, import_child_process28.spawn)("tar", tarArgs, { stdio: ["ignore", "pipe", "pipe"], env: tarEnv });
|
|
30234
|
+
const ssh = (0, import_child_process28.spawn)(
|
|
30197
30235
|
"ssh",
|
|
30198
30236
|
["-o", "StrictHostKeyChecking=accept-new", `${workspaceId}@${sshHost}`, remoteCmd],
|
|
30199
30237
|
{ stdio: [tar.stdout, "pipe", "pipe"] }
|
|
@@ -30223,7 +30261,7 @@ Docs: https://docs.gitlab.com/ee/user/workspace/configuration.html`
|
|
|
30223
30261
|
}
|
|
30224
30262
|
const cmd = parts.join(" && ");
|
|
30225
30263
|
await new Promise((resolve7, reject) => {
|
|
30226
|
-
const proc = (0,
|
|
30264
|
+
const proc = (0, import_child_process28.spawn)(
|
|
30227
30265
|
"ssh",
|
|
30228
30266
|
["-o", "StrictHostKeyChecking=accept-new", `${workspaceId}@${sshHost}`, cmd],
|
|
30229
30267
|
{ stdio: ["pipe", "pipe", "pipe"] }
|
|
@@ -30282,10 +30320,10 @@ function shellQuote3(s) {
|
|
|
30282
30320
|
}
|
|
30283
30321
|
|
|
30284
30322
|
// src/services/providers/railway.ts
|
|
30285
|
-
var
|
|
30323
|
+
var import_child_process29 = require("child_process");
|
|
30286
30324
|
var import_util7 = require("util");
|
|
30287
30325
|
var path61 = __toESM(require("path"));
|
|
30288
|
-
var execFileP9 = (0, import_util7.promisify)(
|
|
30326
|
+
var execFileP9 = (0, import_util7.promisify)(import_child_process29.execFile);
|
|
30289
30327
|
var MAX_BUFFER4 = 8 * 1024 * 1024;
|
|
30290
30328
|
function resetStdinForChild4() {
|
|
30291
30329
|
if (process.stdin.isTTY) {
|
|
@@ -30326,7 +30364,7 @@ var RailwayProvider = class {
|
|
|
30326
30364
|
);
|
|
30327
30365
|
resetStdinForChild4();
|
|
30328
30366
|
await new Promise((resolve7, reject) => {
|
|
30329
|
-
const proc = (0,
|
|
30367
|
+
const proc = (0, import_child_process29.spawn)("railway", ["login"], { stdio: "inherit" });
|
|
30330
30368
|
proc.on("exit", (code) => {
|
|
30331
30369
|
if (code === 0) resolve7();
|
|
30332
30370
|
else reject(new Error("railway login failed."));
|
|
@@ -30469,7 +30507,7 @@ var RailwayProvider = class {
|
|
|
30469
30507
|
}
|
|
30470
30508
|
resetStdinForChild4();
|
|
30471
30509
|
return new Promise((resolve7, reject) => {
|
|
30472
|
-
const proc = (0,
|
|
30510
|
+
const proc = (0, import_child_process29.spawn)(
|
|
30473
30511
|
"railway",
|
|
30474
30512
|
["shell", "--project", projectId, "--service", serviceId, "--command", command2],
|
|
30475
30513
|
{ stdio: "inherit" }
|
|
@@ -30493,8 +30531,8 @@ var RailwayProvider = class {
|
|
|
30493
30531
|
const tarEnv = { ...process.env, COPYFILE_DISABLE: "1" };
|
|
30494
30532
|
const remoteCmd = `mkdir -p ${shellQuote4(remoteDir)} && tar -xzf - -C ${shellQuote4(remoteDir)}`;
|
|
30495
30533
|
await new Promise((resolve7, reject) => {
|
|
30496
|
-
const tar = (0,
|
|
30497
|
-
const sh = (0,
|
|
30534
|
+
const tar = (0, import_child_process29.spawn)("tar", tarArgs, { stdio: ["ignore", "pipe", "pipe"], env: tarEnv });
|
|
30535
|
+
const sh = (0, import_child_process29.spawn)(
|
|
30498
30536
|
"railway",
|
|
30499
30537
|
["shell", "--project", projectId, "--service", serviceId, "--command", remoteCmd],
|
|
30500
30538
|
{ stdio: [tar.stdout, "pipe", "pipe"] }
|
|
@@ -30527,7 +30565,7 @@ var RailwayProvider = class {
|
|
|
30527
30565
|
}
|
|
30528
30566
|
const cmd = parts.join(" && ");
|
|
30529
30567
|
await new Promise((resolve7, reject) => {
|
|
30530
|
-
const proc = (0,
|
|
30568
|
+
const proc = (0, import_child_process29.spawn)(
|
|
30531
30569
|
"railway",
|
|
30532
30570
|
["shell", "--project", projectId, "--service", serviceId, "--command", cmd],
|
|
30533
30571
|
{ stdio: ["pipe", "pipe", "pipe"] }
|
|
@@ -31335,7 +31373,7 @@ function checkChokidar() {
|
|
|
31335
31373
|
}
|
|
31336
31374
|
async function doctor(args2 = []) {
|
|
31337
31375
|
const json = args2.includes("--json");
|
|
31338
|
-
const cliVersion = true ? "2.52.
|
|
31376
|
+
const cliVersion = true ? "2.52.8" : "0.0.0-dev";
|
|
31339
31377
|
const apiBase2 = resolveApiBaseUrl();
|
|
31340
31378
|
const diagnosticId = (0, import_node_crypto8.randomUUID)();
|
|
31341
31379
|
log.info("doctor", `run id=${diagnosticId} cli=${cliVersion}`);
|
|
@@ -31534,7 +31572,7 @@ async function completion(args2) {
|
|
|
31534
31572
|
// src/commands/version.ts
|
|
31535
31573
|
var import_picocolors15 = __toESM(require("picocolors"));
|
|
31536
31574
|
function version2() {
|
|
31537
|
-
const v = true ? "2.52.
|
|
31575
|
+
const v = true ? "2.52.8" : "unknown";
|
|
31538
31576
|
console.log(`${import_picocolors15.default.bold("codeam-cli")} ${import_picocolors15.default.cyan(v)}`);
|
|
31539
31577
|
}
|
|
31540
31578
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "codeam-cli",
|
|
3
|
-
"version": "2.52.
|
|
3
|
+
"version": "2.52.8",
|
|
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",
|