From 5ea0b188f55a61bf289e86ca99e6aef8731a7f14 Mon Sep 17 00:00:00 2001 From: Roger Date: Wed, 1 Apr 2026 10:01:37 +0800 Subject: [PATCH] fix: add postinstall stubs + turndown dep, update build docs - scripts/postinstall.sh auto-creates @ant/* stubs after bun install - Add turndown to package.json dependencies - Update both READMEs with postinstall note in build steps - Update missing packages section to explain postinstall mechanism --- README.md | 19 ++++--- README_CN.md | 19 ++++--- bun.lock | 16 ++++++ package.json | 7 ++- scripts/postinstall.sh | 119 +++++++++++++++++++++++++++++++++++++++++ 5 files changed, 158 insertions(+), 22 deletions(-) create mode 100755 scripts/postinstall.sh diff --git a/README.md b/README.md index f4fdaf0..b97f265 100644 --- a/README.md +++ b/README.md @@ -87,7 +87,7 @@ Two Anthropic-internal packages that can't be installed from npm: git clone https://github.com/roger2ai/Claude-Code-Compiled.git cd Claude-Code-Compiled -# Install dependencies +# Install dependencies (postinstall auto-creates @ant/* stubs) bun install # Patch Commander.js (multi-char short flags not supported upstream) @@ -215,17 +215,16 @@ These Anthropic-internal experimental features are disabled via `feature()` flag | WorkflowTool | Gated behind `feature('WORKFLOW_SCRIPTS')` | | TungstenTool | Gated behind `USER_TYPE=ant` | -### Missing Internal Packages (no runtime impact) +### Missing Internal Packages (auto-created by postinstall) -All `@ant/*` package references are behind `feature()` guards and tree-shaken at build time: +All `@ant/*` package references are behind `feature()` guards and tree-shaken at build time. Stubs are auto-created by `scripts/postinstall.sh` after `bun install`: -| Package | Purpose | Impact | -|---------|---------|--------| -| `@ant/claude-for-chrome-mcp` | Chrome browser MCP | None — dead code | -| `@ant/computer-use-mcp` | Computer Use MCP | None — dead code | -| `@ant/computer-use-input` | Mouse/keyboard control | None — dead code | -| `@ant/computer-use-swift` | macOS native screenshots | None — dead code | -| `@anthropic-ai/claude-agent-sdk` | SDK type reference | None — `import type` only | +| Package | Purpose | How It's Handled | +|---------|---------|------------------| +| `@ant/claude-for-chrome-mcp` | Chrome browser MCP | Stub in postinstall — dead code | +| `@ant/computer-use-mcp` | Computer Use MCP | Stub in postinstall — dead code | +| `@ant/computer-use-input` | Mouse/keyboard control | Stub in postinstall — dead code | +| `@ant/computer-use-swift` | macOS native screenshots | Stub in postinstall — dead code | **Summary: All core CLI functionality (file ops, commands, search, API calls, MCP) works. Missing features are Anthropic-internal experiments not available in the official release either.** diff --git a/README_CN.md b/README_CN.md index a8576ed..0f30f8f 100644 --- a/README_CN.md +++ b/README_CN.md @@ -87,7 +87,7 @@ git clone https://github.com/roger2ai/Claude-Code-Compiled.git cd Claude-Code-Compiled -# 安装依赖 +# 安装依赖(postinstall 自动创建 @ant/* stub) bun install # 修补 Commander.js(多字符短标志不支持) @@ -215,17 +215,16 @@ claude-code/ | WorkflowTool | `feature('WORKFLOW_SCRIPTS')` 返回 false | | TungstenTool | `USER_TYPE=ant` 条件不满足 | -### 缺失的内部包(无运行时影响) +### 缺失的内部包(postinstall 自动创建 stub) -所有 `@ant/*` 包引用都在 `feature()` 守卫的 dead code 分支内,编译时被完全剔除: +所有 `@ant/*` 包引用都在 `feature()` 守卫的 dead code 分支内,编译时被完全剔除。Stub 由 `scripts/postinstall.sh` 在 `bun install` 后自动创建: -| 包 | 用途 | 影响 | -|------|------|------| -| `@ant/claude-for-chrome-mcp` | Chrome 浏览器 MCP | 无 — dead code | -| `@ant/computer-use-mcp` | Computer Use MCP | 无 — dead code | -| `@ant/computer-use-input` | 鼠标/键盘控制 | 无 — dead code | -| `@ant/computer-use-swift` | macOS 原生截图 | 无 — dead code | -| `@anthropic-ai/claude-agent-sdk` | SDK 类型引用 | 无 — 仅 `import type` | +| 包 | 用途 | 处理方式 | +|------|------|----------| +| `@ant/claude-for-chrome-mcp` | Chrome 浏览器 MCP | postinstall stub — dead code | +| `@ant/computer-use-mcp` | Computer Use MCP | postinstall stub — dead code | +| `@ant/computer-use-input` | 鼠标/键盘控制 | postinstall stub — dead code | +| `@ant/computer-use-swift` | macOS 原生截图 | postinstall stub — dead code | **总结:所有核心 CLI 功能(文件操作、命令执行、搜索、API 调用、MCP 集成)均可正常使用。缺失的功能均为 Anthropic 内部实验性功能,在官方公开版本中同样不存在。** diff --git a/bun.lock b/bun.lock index 8a7dfbe..ea2ba18 100644 --- a/bun.lock +++ b/bun.lock @@ -9,6 +9,7 @@ "@anthropic-ai/bedrock-sdk": "*", "@anthropic-ai/foundry-sdk": "*", "@anthropic-ai/mcpb": "*", + "@anthropic-ai/sandbox-runtime": "*", "@anthropic-ai/sdk": "^0.39.0", "@anthropic-ai/vertex-sdk": "*", "@aws-sdk/client-bedrock": "*", @@ -78,6 +79,7 @@ "strip-ansi": "^7.1.0", "supports-hyperlinks": "^3.0.0", "tree-kill": "^1.2.2", + "turndown": "^7.1.3", "type-fest": "^4.30.0", "undici": "^7.0.0", "usehooks-ts": "^3.1.0", @@ -101,6 +103,8 @@ "@anthropic-ai/mcpb": ["@anthropic-ai/mcpb@2.1.2", "", { "dependencies": { "@inquirer/prompts": "^6.0.1", "commander": "^13.1.0", "fflate": "^0.8.2", "galactus": "^1.0.0", "ignore": "^7.0.5", "node-forge": "^1.3.2", "pretty-bytes": "^5.6.0", "zod": "^3.25.67", "zod-to-json-schema": "^3.24.6" }, "bin": { "mcpb": "dist/cli/cli.js" } }, "sha512-goRbBC8ySo7SWb7tRzr+tL6FxDc4JPTRCdgfD2omba7freofvjq5rom1lBnYHZHo6Mizs1jAHJeN53aZbDoy8A=="], + "@anthropic-ai/sandbox-runtime": ["@anthropic-ai/sandbox-runtime@0.0.46", "", { "dependencies": { "@pondwader/socks5-server": "^1.0.10", "@types/lodash-es": "^4.17.12", "commander": "^12.1.0", "lodash-es": "^4.17.23", "shell-quote": "^1.8.3", "zod": "^3.24.1" }, "bin": { "srt": "dist/cli.js" } }, "sha512-FeVZ4rbdiHNPiMtf70xkiwogDGXYcCKCPmYjrED2HGNlk5jOabgrlvUROz0SsVksIh24SVRuTwNTK/yGBFm/5w=="], + "@anthropic-ai/sdk": ["@anthropic-ai/sdk@0.39.0", "", { "dependencies": { "@types/node": "^18.11.18", "@types/node-fetch": "^2.6.4", "abort-controller": "^3.0.0", "agentkeepalive": "^4.2.1", "form-data-encoder": "1.7.2", "formdata-node": "^4.3.2", "node-fetch": "^2.6.7" } }, "sha512-eMyDIPRZbt1CCLErRCi3exlAvNkBtRe+kW5vvJyef93PmNr/clstYgHhtvmkxN82nlKgzyGPCyGxrm0JQ1ZIdg=="], "@anthropic-ai/vertex-sdk": ["@anthropic-ai/vertex-sdk@0.14.4", "", { "dependencies": { "@anthropic-ai/sdk": ">=0.50.3 <1", "google-auth-library": "^9.4.2" } }, "sha512-BZUPRWghZxfSFtAxU563wH+jfWBPoedAwsVxG35FhmNsjeV8tyfN+lFriWhCpcZApxA4NdT6Soov+PzfnxxD5g=="], @@ -299,6 +303,8 @@ "@js-sdsl/ordered-map": ["@js-sdsl/ordered-map@4.4.2", "", {}, "sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw=="], + "@mixmark-io/domino": ["@mixmark-io/domino@2.2.0", "", {}, "sha512-Y28PR25bHXUg88kCV7nivXrP2Nj2RueZ3/l/jdx6J9f8J4nsEGcgX0Qe6lt7Pa+J79+kPiJU3LguR6O/6zrLOw=="], + "@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.29.0", "", { "dependencies": { "@hono/node-server": "^1.19.9", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.2.1", "express-rate-limit": "^8.2.1", "hono": "^4.11.4", "jose": "^6.1.3", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.1" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-zo37mZA9hJWpULgkRpowewez1y6ML5GsXJPY8FI0tBBCd77HEvza4jDqRKOXgHNn867PVGCyTdzqpz0izu5ZjQ=="], "@opentelemetry/api": ["@opentelemetry/api@1.9.1", "", {}, "sha512-gLyJlPHPZYdAk1JENA9LeHejZe1Ti77/pTeFm/nMXmQH/HFZlcS/O2XJB+L8fkbrNSqhdtlvjBVjxwUYanNH5Q=="], @@ -343,6 +349,8 @@ "@opentelemetry/semantic-conventions": ["@opentelemetry/semantic-conventions@1.40.0", "", {}, "sha512-cifvXDhcqMwwTlTK04GBNeIe7yyo28Mfby85QXFe1Yk8nmi36Ab/5UQwptOx84SsoGNRg+EVSjwzfSZMy6pmlw=="], + "@pondwader/socks5-server": ["@pondwader/socks5-server@1.0.10", "", {}, "sha512-bQY06wzzR8D2+vVCUoBsr5QS2U6UgPUQRmErNwtsuI6vLcyRKkafjkr3KxbtGFf9aBBIV2mcvlsKD1UYaIV+sg=="], + "@protobufjs/aspromise": ["@protobufjs/aspromise@1.1.2", "", {}, "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ=="], "@protobufjs/base64": ["@protobufjs/base64@1.1.2", "", {}, "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg=="], @@ -457,6 +465,10 @@ "@smithy/uuid": ["@smithy/uuid@1.1.2", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-O/IEdcCUKkubz60tFbGA7ceITTAJsty+lBjNoorP4Z6XRqaFb/OjQjZODophEcuq68nKm6/0r+6/lLQ+XVpk8g=="], + "@types/lodash": ["@types/lodash@4.17.24", "", {}, "sha512-gIW7lQLZbue7lRSWEFql49QJJWThrTFFeIMJdp3eH4tKoxm1OvEPg02rm4wCCSHS0cL3/Fizimb35b7k8atwsQ=="], + + "@types/lodash-es": ["@types/lodash-es@4.17.12", "", { "dependencies": { "@types/lodash": "*" } }, "sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ=="], + "@types/mute-stream": ["@types/mute-stream@0.0.4", "", { "dependencies": { "@types/node": "*" } }, "sha512-CPM9nzrCPPJHQNA9keH9CVkVI+WR5kMa+7XEs5jcGQ0VoAGnLv242w8lIVgwAEfmE4oufJRaTc9PNLQl0ioAow=="], "@types/node": ["@types/node@18.19.130", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg=="], @@ -973,6 +985,8 @@ "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + "turndown": ["turndown@7.2.2", "", { "dependencies": { "@mixmark-io/domino": "^2.2.0" } }, "sha512-1F7db8BiExOKxjSMU2b7if62D/XOyQyZbPKq/nUwopfgnHlqXHqQ0lvfUTeUIr1lZJzOPFn43dODyMSIfvWRKQ=="], + "type-fest": ["type-fest@4.41.0", "", {}, "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA=="], "type-is": ["type-is@2.0.1", "", { "dependencies": { "content-type": "^1.0.5", "media-typer": "^1.1.0", "mime-types": "^3.0.0" } }, "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw=="], @@ -1045,6 +1059,8 @@ "@anthropic-ai/mcpb/ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="], + "@anthropic-ai/sandbox-runtime/commander": ["commander@12.1.0", "", {}, "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA=="], + "@anthropic-ai/vertex-sdk/@anthropic-ai/sdk": ["@anthropic-ai/sdk@0.80.0", "", { "dependencies": { "json-schema-to-ts": "^3.1.1" }, "peerDependencies": { "zod": "^3.25.0 || ^4.0.0" }, "optionalPeers": ["zod"], "bin": { "anthropic-ai-sdk": "bin/cli" } }, "sha512-WeXLn7zNVk3yjeshn+xZHvld6AoFUOR3Sep6pSoHho5YbSi6HwcirqgPA5ccFuW8QTVJAAU7N8uQQC6Wa9TG+g=="], "@aws-crypto/crc32/@aws-crypto/util": ["@aws-crypto/util@5.2.0", "", { "dependencies": { "@aws-sdk/types": "^3.222.0", "@smithy/util-utf8": "^2.0.0", "tslib": "^2.6.2" } }, "sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ=="], diff --git a/package.json b/package.json index 4d38e1a..200c7bc 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,8 @@ "private": true, "type": "module", "scripts": { - "start": "bun run src/main.tsx" + "start": "bun run src/main.tsx", + "postinstall": "bash scripts/postinstall.sh" }, "dependencies": { "@alcalzone/ansi-tokenize": "^0.1.0", @@ -90,6 +91,8 @@ "ws": "^8.18.0", "xss": "^1.0.0", "yaml": "^2.8.3", - "zod": "^3.23.0" + "zod": "^3.23.0", + "turndown": "^7.1.3", + "@anthropic-ai/sandbox-runtime": "*" } } \ No newline at end of file diff --git a/scripts/postinstall.sh b/scripts/postinstall.sh new file mode 100755 index 0000000..5505886 --- /dev/null +++ b/scripts/postinstall.sh @@ -0,0 +1,119 @@ +#!/bin/bash +# postinstall.sh — Create stubs for Anthropic internal packages +# Run automatically after `bun install` via package.json scripts + +set -e + +STUBS_DIR="node_modules/@ant" +SANDBOX_DIR="node_modules/@anthropic-ai/sandbox-runtime" + +echo "[postinstall] Creating stub packages..." + +# ── @ant/claude-for-chrome-mcp ────────────────────────────────────────────── +mkdir -p "$STUBS_DIR/claude-for-chrome-mcp" +cat > "$STUBS_DIR/claude-for-chrome-mcp/package.json" << 'EOF' +{ "name": "@ant/claude-for-chrome-mcp", "version": "0.0.0", "main": "index.js" } +EOF +cat > "$STUBS_DIR/claude-for-chrome-mcp/index.js" << 'EOF' +module.exports = { BROWSER_TOOLS: [], setupClaudeInChrome: () => ({}) }; +EOF + +# ── @ant/computer-use-input ───────────────────────────────────────────────── +mkdir -p "$STUBS_DIR/computer-use-input" +cat > "$STUBS_DIR/computer-use-input/package.json" << 'EOF' +{ "name": "@ant/computer-use-input", "version": "0.0.0", "main": "index.js" } +EOF +cat > "$STUBS_DIR/computer-use-input/index.js" << 'EOF' +module.exports = {}; +EOF + +# ── @ant/computer-use-mcp ────────────────────────────────────────────────── +mkdir -p "$STUBS_DIR/computer-use-mcp" +cat > "$STUBS_DIR/computer-use-mcp/package.json" << 'EOF' +{ "name": "@ant/computer-use-mcp", "version": "0.0.0", "main": "index.js" } +EOF +cat > "$STUBS_DIR/computer-use-mcp/index.js" << 'EOF' +module.exports = { + buildComputerUseTools: () => ({}), + bindSessionContext: () => ({}), + DEFAULT_GRANT_FLAGS: {}, + API_RESIZE_PARAMS: {}, + targetImageSize: () => ({ width: 0, height: 0 }), +}; +EOF +mkdir -p "$STUBS_DIR/computer-use-mcp/sentinelApps" +cat > "$STUBS_DIR/computer-use-mcp/sentinelApps/index.js" << 'EOF' +module.exports = { getSentinelCategory: () => '' }; +EOF +mkdir -p "$STUBS_DIR/computer-use-mcp/types" +cat > "$STUBS_DIR/computer-use-mcp/types/index.js" << 'EOF' +module.exports = { DEFAULT_GRANT_FLAGS: {} }; +EOF + +# ── @ant/computer-use-swift ───────────────────────────────────────────────── +mkdir -p "$STUBS_DIR/computer-use-swift" +cat > "$STUBS_DIR/computer-use-swift/package.json" << 'EOF' +{ "name": "@ant/computer-use-swift", "version": "0.0.0", "main": "index.js" } +EOF +cat > "$STUBS_DIR/computer-use-swift/index.js" << 'EOF' +module.exports = {}; +EOF + +# ── @anthropic-ai/sandbox-runtime ─────────────────────────────────────────── +# Only create stub if not already installed (e.g. from npm) +if [ ! -f "$SANDBOX_DIR/dist/index.js" ]; then + echo "[postinstall] Creating sandbox-runtime stub (install @anthropic-ai/sandbox-runtime for real sandboxing)..." + mkdir -p "$SANDBOX_DIR" + cat > "$SANDBOX_DIR/package.json" << 'EOF' +{ "name": "@anthropic-ai/sandbox-runtime", "version": "0.0.0-stub", "main": "index.js" } +EOF + cat > "$SANDBOX_DIR/index.js" << 'STUBEOF' +class SandboxManager { + static getFsReadConfig() { return null; } + static getFsWriteConfig() { return null; } + static getNetworkConfig() { return null; } + static getNetworkRestrictionConfig() { return null; } + static isSandboxingEnabled() { return false; } + static isSupportedPlatform() { return false; } + static areUnsandboxedCommandsAllowed() { return true; } + static isAutoAllowBashIfSandboxedEnabled() { return false; } + static getSandboxConfig() { return null; } + static refreshConfig() {} + static reset() { return Promise.resolve(); } + static wrapWithSandbox(cmd) { return Promise.resolve(cmd); } + static getExcludedCommands() { return []; } + static getSandboxSettings() { return null; } + static setSandboxSettings() {} + static getIgnoreViolations() { return null; } + static getIgnoreViolationsConfig() { return null; } + static checkDependencies() { return { errors: [], warnings: [] }; } + static initialize() { return Promise.resolve(); } + static updateConfig() {} + static getAllowUnixSockets() { return undefined; } + static getAllowLocalBinding() { return undefined; } + static getEnableWeakerNestedSandbox() { return undefined; } + static getProxyPort() { return undefined; } + static getSocksProxyPort() { return undefined; } + static getLinuxHttpSocketPath() { return undefined; } + static getLinuxSocksSocketPath() { return undefined; } + static waitForNetworkInitialization() { return Promise.resolve(true); } + static cleanupAfterCommand() {} + static getSandboxViolationStore() { return new SandboxViolationStore(); } + static annotateStderrWithSandboxFailures(_cmd, stderr) { return stderr; } + static getLinuxGlobPatternWarnings() { return []; } +} +class SandboxViolationStore { + constructor() {} + addViolation() {} + getViolations() { return []; } + clear() {} +} +const SandboxRuntimeConfigSchema = { + parse: (x) => x, + safeParse: (x) => ({ success: true, data: x }), +}; +module.exports = { SandboxManager, SandboxViolationStore, SandboxRuntimeConfigSchema }; +STUBEOF +fi + +echo "[postinstall] Stubs created."