claude-cac 1.4.2 → 1.4.4-beta.1
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/README.md +1 -0
- package/cac +24 -39
- package/package.json +1 -1
- package/scripts/postinstall.js +44 -0
package/README.md
CHANGED
|
@@ -15,6 +15,7 @@
|
|
|
15
15
|
[](https://www.npmjs.com/package/claude-cac)
|
|
16
16
|
[](https://github.com/nmhjklnm/cac)
|
|
17
17
|
[](https://cac.nextmind.space/docs)
|
|
18
|
+
[](https://t.me/claudecodecloak)
|
|
18
19
|
[](LICENSE)
|
|
19
20
|
[]()
|
|
20
21
|
|
package/cac
CHANGED
|
@@ -11,7 +11,7 @@ VERSIONS_DIR="$CAC_DIR/versions"
|
|
|
11
11
|
# ── utils: colors, read/write, UUID, proxy parsing ───────────────────────
|
|
12
12
|
|
|
13
13
|
# shellcheck disable=SC2034 # used in build-concatenated cac script
|
|
14
|
-
CAC_VERSION="1.4.
|
|
14
|
+
CAC_VERSION="1.4.4-beta.1"
|
|
15
15
|
|
|
16
16
|
_read() { [[ -f "$1" ]] && tr -d '[:space:]' < "$1" || echo "${2:-}"; }
|
|
17
17
|
_die() { printf '%b\n' "$(_red "error:") $*" >&2; exit 1; }
|
|
@@ -1280,21 +1280,38 @@ fi
|
|
|
1280
1280
|
[[ -x "$_real" ]] || { echo "[cac] error: claude not found, run 'cac claude install latest'" >&2; exit 1; }
|
|
1281
1281
|
|
|
1282
1282
|
# ── Relay local forwarding (always enabled when proxy is set) ──
|
|
1283
|
+
# Relay lifecycle: ENVIRONMENT-level, not session-level.
|
|
1284
|
+
# - Started on demand by the first session that needs it
|
|
1285
|
+
# - Persists across sessions (no cleanup on exit)
|
|
1286
|
+
# - Restarted if proxy changes (relay.proxy mismatch)
|
|
1287
|
+
# - Stopped by: cac env activate (switch), cac self delete, or machine reboot
|
|
1283
1288
|
_relay_active=false
|
|
1284
1289
|
if [[ -n "$PROXY" ]] && [[ -f "$CAC_DIR/relay.js" ]]; then
|
|
1285
1290
|
_relay_js="$CAC_DIR/relay.js"
|
|
1286
1291
|
_relay_pid_file="$CAC_DIR/relay.pid"
|
|
1287
1292
|
_relay_port_file="$CAC_DIR/relay.port"
|
|
1293
|
+
_relay_proxy_file="$CAC_DIR/relay.proxy"
|
|
1288
1294
|
|
|
1289
1295
|
# check if relay is already running
|
|
1290
1296
|
_relay_running=false
|
|
1291
1297
|
if [[ -f "$_relay_pid_file" ]]; then
|
|
1292
1298
|
_rpid=$(tr -d '[:space:]' < "$_relay_pid_file")
|
|
1293
|
-
kill -0 "$_rpid" 2>/dev/null && _relay_running=true
|
|
1299
|
+
[[ -n "$_rpid" ]] && kill -0 "$_rpid" 2>/dev/null && _relay_running=true
|
|
1300
|
+
fi
|
|
1301
|
+
|
|
1302
|
+
# kill stale relay if proxy changed (env switch without going through cac activate)
|
|
1303
|
+
# skip if relay.proxy absent (first run after upgrade — assume match)
|
|
1304
|
+
if [[ "$_relay_running" == "true" ]] && [[ -f "$_relay_proxy_file" ]]; then
|
|
1305
|
+
_old_proxy=$(tr -d '[:space:]' < "$_relay_proxy_file")
|
|
1306
|
+
if [[ "$_old_proxy" != "$PROXY" ]]; then
|
|
1307
|
+
kill "$_rpid" 2>/dev/null || true
|
|
1308
|
+
rm -f "$_relay_pid_file" "$_relay_port_file" "$_relay_proxy_file"
|
|
1309
|
+
_relay_running=false
|
|
1310
|
+
fi
|
|
1294
1311
|
fi
|
|
1295
1312
|
|
|
1296
1313
|
# start if not running
|
|
1297
|
-
if [[ "$_relay_running" != "true" ]]
|
|
1314
|
+
if [[ "$_relay_running" != "true" ]]; then
|
|
1298
1315
|
_rport=17890
|
|
1299
1316
|
while (echo >/dev/tcp/127.0.0.1/$_rport) 2>/dev/null; do
|
|
1300
1317
|
(( _rport++ ))
|
|
@@ -1306,6 +1323,7 @@ if [[ -n "$PROXY" ]] && [[ -f "$CAC_DIR/relay.js" ]]; then
|
|
|
1306
1323
|
(echo >/dev/tcp/127.0.0.1/$_rport) 2>/dev/null && break
|
|
1307
1324
|
sleep 0.1
|
|
1308
1325
|
done
|
|
1326
|
+
echo "$PROXY" > "$_relay_proxy_file"
|
|
1309
1327
|
echo "$_rport" > "$_relay_port_file"
|
|
1310
1328
|
fi
|
|
1311
1329
|
|
|
@@ -1319,40 +1337,6 @@ if [[ -n "$PROXY" ]] && [[ -f "$CAC_DIR/relay.js" ]]; then
|
|
|
1319
1337
|
fi
|
|
1320
1338
|
fi
|
|
1321
1339
|
|
|
1322
|
-
# cleanup function
|
|
1323
|
-
_cleanup_all() {
|
|
1324
|
-
# stop watchdog
|
|
1325
|
-
[[ -n "${_watchdog_pid:-}" ]] && kill "$_watchdog_pid" 2>/dev/null || true
|
|
1326
|
-
# cleanup relay
|
|
1327
|
-
if [[ "$_relay_active" == "true" ]] && [[ -f "$CAC_DIR/relay.pid" ]]; then
|
|
1328
|
-
local _p; _p=$(cat "$CAC_DIR/relay.pid" 2>/dev/null) || true
|
|
1329
|
-
[[ -n "$_p" ]] && kill "$_p" 2>/dev/null || true
|
|
1330
|
-
rm -f "$CAC_DIR/relay.pid" "$CAC_DIR/relay.port"
|
|
1331
|
-
fi
|
|
1332
|
-
}
|
|
1333
|
-
|
|
1334
|
-
trap _cleanup_all EXIT INT TERM
|
|
1335
|
-
|
|
1336
|
-
# ── Relay watchdog: auto-restart relay if it crashes ──
|
|
1337
|
-
if [[ "$_relay_active" == "true" ]]; then
|
|
1338
|
-
(while true; do
|
|
1339
|
-
sleep 10
|
|
1340
|
-
[[ -f "$_relay_pid_file" ]] || break # pid file gone = intentional shutdown
|
|
1341
|
-
_wpid=$(tr -d '[:space:]' < "$_relay_pid_file" 2>/dev/null) || break
|
|
1342
|
-
if ! kill -0 "$_wpid" 2>/dev/null; then
|
|
1343
|
-
echo "[cac] relay crashed, restarting..." >&2
|
|
1344
|
-
node "$_relay_js" "$_rport" "$PROXY" "$_relay_pid_file" </dev/null >>"$CAC_DIR/relay.log" 2>&1 &
|
|
1345
|
-
disown
|
|
1346
|
-
for _wi in {1..30}; do
|
|
1347
|
-
(echo >/dev/tcp/127.0.0.1/$_rport) 2>/dev/null && break
|
|
1348
|
-
sleep 0.1
|
|
1349
|
-
done
|
|
1350
|
-
fi
|
|
1351
|
-
done) &
|
|
1352
|
-
_watchdog_pid=$!
|
|
1353
|
-
disown
|
|
1354
|
-
fi
|
|
1355
|
-
|
|
1356
1340
|
# ── Concurrent session check ──
|
|
1357
1341
|
_max_sessions=10
|
|
1358
1342
|
[[ -f "$CAC_DIR/max_sessions" ]] && _ms=$(tr -d '[:space:]' < "$CAC_DIR/max_sessions") && [[ -n "$_ms" ]] && _max_sessions="$_ms"
|
|
@@ -1370,7 +1354,6 @@ set +e
|
|
|
1370
1354
|
"$_real" "$@"
|
|
1371
1355
|
_ec=$?
|
|
1372
1356
|
set -e
|
|
1373
|
-
_cleanup_all
|
|
1374
1357
|
exit "$_ec"
|
|
1375
1358
|
WRAPPER_EOF
|
|
1376
1359
|
local _tmp="$CAC_DIR/bin/claude.tmp"
|
|
@@ -1750,6 +1733,7 @@ MERGE_EOF
|
|
|
1750
1733
|
}
|
|
1751
1734
|
|
|
1752
1735
|
_env_cmd_ls() {
|
|
1736
|
+
_require_setup
|
|
1753
1737
|
if [[ ! -d "$ENVS_DIR" ]] || [[ -z "$(ls -A "$ENVS_DIR" 2>/dev/null)" ]]; then
|
|
1754
1738
|
echo "$(_dim " No environments yet.")"
|
|
1755
1739
|
echo " Run $(_green "cac env create <name>") to get started."
|
|
@@ -1996,6 +1980,7 @@ _relay_start() {
|
|
|
1996
1980
|
return 1
|
|
1997
1981
|
fi
|
|
1998
1982
|
|
|
1983
|
+
echo "$proxy" > "$CAC_DIR/relay.proxy"
|
|
1999
1984
|
echo "$port" > "$CAC_DIR/relay.port"
|
|
2000
1985
|
return 0
|
|
2001
1986
|
}
|
|
@@ -2015,7 +2000,7 @@ _relay_stop() {
|
|
|
2015
2000
|
fi
|
|
2016
2001
|
rm -f "$pid_file"
|
|
2017
2002
|
fi
|
|
2018
|
-
rm -f "$CAC_DIR/relay.port"
|
|
2003
|
+
rm -f "$CAC_DIR/relay.port" "$CAC_DIR/relay.proxy"
|
|
2019
2004
|
|
|
2020
2005
|
# cleanup route
|
|
2021
2006
|
_relay_remove_route 2>/dev/null || true
|
package/package.json
CHANGED
package/scripts/postinstall.js
CHANGED
|
@@ -27,6 +27,50 @@ try {
|
|
|
27
27
|
// Non-fatal — _ensure_initialized will catch it on first cac command
|
|
28
28
|
}
|
|
29
29
|
|
|
30
|
+
// Patch existing wrapper for known bugs — pure Node.js, no shell execution needed.
|
|
31
|
+
// Users who upgrade via npm install keep their old ~/.cac/bin/claude until _ensure_initialized
|
|
32
|
+
// runs (triggered by any cac command). This patch fixes critical bugs immediately.
|
|
33
|
+
var wrapperPath = path.join(cacDir, 'bin', 'claude');
|
|
34
|
+
if (home && fs.existsSync(wrapperPath)) {
|
|
35
|
+
try {
|
|
36
|
+
var wrapperContent = fs.readFileSync(wrapperPath, 'utf8');
|
|
37
|
+
var patched = wrapperContent;
|
|
38
|
+
// Fix: pgrep returns exit 1 when no claude process exists; under set -euo pipefail
|
|
39
|
+
// this aborts the wrapper before launching claude (claude appears to do nothing).
|
|
40
|
+
var buggyPgrep = '_claude_count=$(pgrep -x "claude" 2>/dev/null | wc -l | tr -d \'[:space:]\')';
|
|
41
|
+
var fixedPgrep = buggyPgrep + ' || _claude_count=0';
|
|
42
|
+
if (patched.indexOf(buggyPgrep) !== -1 && patched.indexOf(fixedPgrep) === -1) {
|
|
43
|
+
patched = patched.replace(buggyPgrep, fixedPgrep);
|
|
44
|
+
}
|
|
45
|
+
// Fix: session exit killed the shared relay, breaking all other sessions.
|
|
46
|
+
// Remove the trap so _cleanup_all never fires on exit.
|
|
47
|
+
var buggyTrap = 'trap _cleanup_all EXIT INT TERM';
|
|
48
|
+
if (patched.indexOf(buggyTrap) !== -1) {
|
|
49
|
+
patched = patched.replace(buggyTrap, '');
|
|
50
|
+
}
|
|
51
|
+
if (patched !== wrapperContent) {
|
|
52
|
+
fs.writeFileSync(wrapperPath, patched);
|
|
53
|
+
}
|
|
54
|
+
} catch (e) {
|
|
55
|
+
// Non-fatal
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// Trigger _ensure_initialized to fully regenerate wrapper to current version.
|
|
60
|
+
// cac env ls now calls _require_setup (fixed in 1.4.3+).
|
|
61
|
+
if (home) {
|
|
62
|
+
try {
|
|
63
|
+
var spawnSync = require('child_process').spawnSync;
|
|
64
|
+
spawnSync(cacBin, ['env', 'ls'], {
|
|
65
|
+
stdio: 'ignore',
|
|
66
|
+
timeout: 8000,
|
|
67
|
+
env: Object.assign({}, process.env, { HOME: home })
|
|
68
|
+
});
|
|
69
|
+
} catch (e) {
|
|
70
|
+
// Non-fatal
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
30
74
|
console.log([
|
|
31
75
|
'',
|
|
32
76
|
' claude-cac installed successfully',
|