diff --git a/config/claude-native-audited-versions.json b/config/claude-native-audited-versions.json index 7000e01..b16970a 100644 --- a/config/claude-native-audited-versions.json +++ b/config/claude-native-audited-versions.json @@ -626,6 +626,15 @@ "tarball_integrity": "sha512-EXSediF1ujcqQeElbXdCEe+uW3NUQAOjn1xHHAgvwzY08nzJeePjagn9+YS6bmhHxBgDKwlGu7pL8Kv7EpiFtg==", "tarball_sha256": "1bb3c8364d652dd08a15856ee27c6600ecd1e45360243154fa846f240ce7a1df", "status": "offset_discovered" + }, + "2.1.223": { + "wrapper_spec": "@anthropic-ai/claude-code@2.1.223", + "native_spec": "@anthropic-ai/claude-code-linux-arm64@2.1.223", + "entry_js_offset": 257987828, + "entry_end_offset": 281109040, + "tarball_integrity": "sha512-gh0n3fvUgzsrjeTqZraOhDKOzS7afB9U/qFvRY0FBpccogbJCk8otTYavPfdhAA2xESAoA0BaoVdzO4k4VkphA==", + "tarball_sha256": "29c49ec62bfbe995e5b1354a4c32d17101065d2c7722d5d0285cfa6a08d8c441", + "status": "offset_discovered" } } } diff --git a/config/claude-termux-release-manifest.json b/config/claude-termux-release-manifest.json index 1d8f045..21f7a07 100644 --- a/config/claude-termux-release-manifest.json +++ b/config/claude-termux-release-manifest.json @@ -2,7 +2,7 @@ "manifest_version": 1, "package_name": "@bash0816/claude-code", "latest_audited_version": "2.1.222", - "latest_candidate_version": "2.1.222-1", + "latest_candidate_version": "2.1.223", "previous_stable_version": "2.1.220-2", "stable_pinned_version": "2.1.193", "manifest_url": "https://raw.githubusercontent.com/bash0816/ClaudeCode-Termux/main/config/claude-termux-release-manifest.json" diff --git a/packages/claude-code/config/claude-native-audited-versions.json b/packages/claude-code/config/claude-native-audited-versions.json index 7000e01..b16970a 100644 --- a/packages/claude-code/config/claude-native-audited-versions.json +++ b/packages/claude-code/config/claude-native-audited-versions.json @@ -626,6 +626,15 @@ "tarball_integrity": "sha512-EXSediF1ujcqQeElbXdCEe+uW3NUQAOjn1xHHAgvwzY08nzJeePjagn9+YS6bmhHxBgDKwlGu7pL8Kv7EpiFtg==", "tarball_sha256": "1bb3c8364d652dd08a15856ee27c6600ecd1e45360243154fa846f240ce7a1df", "status": "offset_discovered" + }, + "2.1.223": { + "wrapper_spec": "@anthropic-ai/claude-code@2.1.223", + "native_spec": "@anthropic-ai/claude-code-linux-arm64@2.1.223", + "entry_js_offset": 257987828, + "entry_end_offset": 281109040, + "tarball_integrity": "sha512-gh0n3fvUgzsrjeTqZraOhDKOzS7afB9U/qFvRY0FBpccogbJCk8otTYavPfdhAA2xESAoA0BaoVdzO4k4VkphA==", + "tarball_sha256": "29c49ec62bfbe995e5b1354a4c32d17101065d2c7722d5d0285cfa6a08d8c441", + "status": "offset_discovered" } } } diff --git a/packages/claude-code/config/claude-termux-release-manifest.json b/packages/claude-code/config/claude-termux-release-manifest.json index 1d8f045..21f7a07 100644 --- a/packages/claude-code/config/claude-termux-release-manifest.json +++ b/packages/claude-code/config/claude-termux-release-manifest.json @@ -2,7 +2,7 @@ "manifest_version": 1, "package_name": "@bash0816/claude-code", "latest_audited_version": "2.1.222", - "latest_candidate_version": "2.1.222-1", + "latest_candidate_version": "2.1.223", "previous_stable_version": "2.1.220-2", "stable_pinned_version": "2.1.193", "manifest_url": "https://raw.githubusercontent.com/bash0816/ClaudeCode-Termux/main/config/claude-termux-release-manifest.json" diff --git a/packages/claude-code/lib/termux-run-claude-native.sh b/packages/claude-code/lib/termux-run-claude-native.sh index 60af4cf..679169a 100755 --- a/packages/claude-code/lib/termux-run-claude-native.sh +++ b/packages/claude-code/lib/termux-run-claude-native.sh @@ -599,6 +599,7 @@ function rewriteNativeChunkSource(source) { const _bunPropertyAccessExpected = (() => { const _ver = String(process.env.CURRENT_CLAUDE_VERSION || ''); const _m = _ver.match(/^(\d+)\.(\d+)\.(\d+)/); + if (_m && (Number(_m[1]) > 2 || Number(_m[2]) > 1 || Number(_m[3]) >= 223)) return 43; if (_m && (Number(_m[1]) > 2 || Number(_m[2]) > 1 || Number(_m[3]) >= 219)) return 42; if (_m && (Number(_m[1]) > 2 || Number(_m[2]) > 1 || Number(_m[3]) >= 216)) return 40; if (_m && (Number(_m[1]) > 2 || Number(_m[2]) > 1 || Number(_m[3]) >= 214)) return 39; @@ -1464,6 +1465,7 @@ function rewriteNativeChunkSource(source) { const _bunPropertyAccessExpected = (() => { const _ver = String(process.env.CURRENT_CLAUDE_VERSION || ''); const _m = _ver.match(/^(\d+)\.(\d+)\.(\d+)/); + if (_m && (Number(_m[1]) > 2 || Number(_m[2]) > 1 || Number(_m[3]) >= 223)) return 43; if (_m && (Number(_m[1]) > 2 || Number(_m[2]) > 1 || Number(_m[3]) >= 219)) return 42; if (_m && (Number(_m[1]) > 2 || Number(_m[2]) > 1 || Number(_m[3]) >= 216)) return 40; if (_m && (Number(_m[1]) > 2 || Number(_m[2]) > 1 || Number(_m[3]) >= 214)) return 39; diff --git a/packages/claude-code/lib/termux-run-claude-native.test.js b/packages/claude-code/lib/termux-run-claude-native.test.js index 960187c..1e92845 100644 --- a/packages/claude-code/lib/termux-run-claude-native.test.js +++ b/packages/claude-code/lib/termux-run-claude-native.test.js @@ -563,6 +563,43 @@ test('rewriteNativeChunkSource rejects stale Bun property access count for versi } }); +test('rewriteNativeChunkSource rewrites the synthetic bundle slice (version 2.1.223)', () => { + process.env.CURRENT_CLAUDE_VERSION = '2.1.223'; + try { + const { rewriteNativeChunkSource } = loadHelperApi(); + const typeofBun = Array.from({ length: 7 }, () => 'typeof Bun').join('; '); + const bunProps = Array.from({ length: 43 }, (_, index) => `Bun.p${index}`).join('; '); + const source = `function(exports, require, module, __filename, __dirname) { ${typeofBun}; typeof globalThis.Bun; globalThis.Bun; ${bunProps}; npmInstallDeprecated:!0; npmInstallDeprecated:!0; function dYs(){return(e,t,r)=>{let{cmd:n,prefixArgs:o}=ox({pinToCurrentBinary:!0}),i=[n,...o,"--bg-pty-host",r.ptySock];return i}} }`; + const patched = rewriteNativeChunkSource(source); + + assert.match(patched, /var __claudeBun = globalThis\.__claudeBunShim;/); + assert.match(patched, /typeof __claudeBun/); + assert.match(patched, /typeof globalThis\.__claudeBun/); + assert.match(patched, /globalThis\.__claudeBun/); + assert.match(patched, /__claudeBun\./); + assert.equal((patched.match(/__claudeBun\./g) || []).length, 43); + } finally { + delete process.env.CURRENT_CLAUDE_VERSION; + } +}); + +test('rewriteNativeChunkSource rejects stale Bun property access count for version 2.1.223', () => { + process.env.CURRENT_CLAUDE_VERSION = '2.1.223'; + try { + const { rewriteNativeChunkSource } = loadHelperApi(); + const typeofBun = Array.from({ length: 7 }, () => 'typeof Bun').join('; '); + const bunProps = Array.from({ length: 42 }, (_, index) => `Bun.p${index}`).join('; '); + const source = `function(exports, require, module, __filename, __dirname) { ${typeofBun}; typeof globalThis.Bun; globalThis.Bun; ${bunProps}; npmInstallDeprecated:!0; npmInstallDeprecated:!0; function dYs(){return(e,t,r)=>{let{cmd:n,prefixArgs:o}=ox({pinToCurrentBinary:!0}),i=[n,...o,"--bg-pty-host",r.ptySock];return i}} }`; + + assert.throws( + () => rewriteNativeChunkSource(source), + /unexpected Bun property access count 42/, + ); + } finally { + delete process.env.CURRENT_CLAUDE_VERSION; + } +}); + test('rewriteNativeChunkSource rejects unexpected replacement counts', () => { const { rewriteNativeChunkSource } = loadHelperApi(); const source = buildSyntheticBundleSource().replace('Bun.p30;', ''); diff --git a/packages/claude-code/package.json b/packages/claude-code/package.json index 4da1f85..0c4ef2d 100644 --- a/packages/claude-code/package.json +++ b/packages/claude-code/package.json @@ -1,6 +1,6 @@ { "name": "@bash0816/claude-code", - "version": "2.1.222-1", + "version": "2.1.223", "description": "Unofficial Termux-native Claude Code wrapper with audited native replay", "license": "GPL-3.0-only", "bin": {