From f166165691de5747b9e79843f21dc44ed2ed2292 Mon Sep 17 00:00:00 2001 From: claude-code-best Date: Tue, 14 Apr 2026 21:18:36 +0800 Subject: [PATCH 1/4] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=20n=20=E5=BF=AB?= =?UTF-8?q?=E6=8D=B7=E9=94=AE=E5=AF=BC=E8=87=B4=E5=85=B3=E9=97=AD=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/keybindings/defaultBindings.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/keybindings/defaultBindings.ts b/src/keybindings/defaultBindings.ts index 1414ee8f1..e9562fcb0 100644 --- a/src/keybindings/defaultBindings.ts +++ b/src/keybindings/defaultBindings.ts @@ -130,8 +130,6 @@ export const DEFAULT_BINDINGS: KeybindingBlock[] = [ { context: 'Confirmation', bindings: { - y: 'confirm:yes', - n: 'confirm:no', enter: 'confirm:yes', escape: 'confirm:no', // Navigation for dialogs with lists From b241223e70998eae545d00ec1ff3d8267a9c21c1 Mon Sep 17 00:00:00 2001 From: claude-code-best Date: Tue, 14 Apr 2026 21:19:25 +0800 Subject: [PATCH 2/4] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=20node=20?= =?UTF-8?q?=E4=B8=8B=20ws=20=E6=B2=A1=E6=89=93=E5=8C=85=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .omc/project-memory.json | 6 ++ ...593ef472-4143-4340-9c2d-4070ffea907f.jsonl | 2 + bun.lock | 58 +++++++++---------- 3 files changed, 37 insertions(+), 29 deletions(-) create mode 100644 .omc/state/agent-replay-593ef472-4143-4340-9c2d-4070ffea907f.jsonl diff --git a/.omc/project-memory.json b/.omc/project-memory.json index 7189e2b17..4f37d8f45 100644 --- a/.omc/project-memory.json +++ b/.omc/project-memory.json @@ -176,6 +176,12 @@ } }, "hotPaths": [ + { + "path": "package.json", + "accessCount": 6, + "lastAccessed": 1776308709974, + "type": "file" + }, { "path": "src", "accessCount": 1, diff --git a/.omc/state/agent-replay-593ef472-4143-4340-9c2d-4070ffea907f.jsonl b/.omc/state/agent-replay-593ef472-4143-4340-9c2d-4070ffea907f.jsonl new file mode 100644 index 000000000..87b74e63e --- /dev/null +++ b/.omc/state/agent-replay-593ef472-4143-4340-9c2d-4070ffea907f.jsonl @@ -0,0 +1,2 @@ +{"t":0,"agent":"a1b51bb","agent_type":"unknown","event":"agent_stop","success":true} +{"t":0,"agent":"a920562","agent_type":"unknown","event":"agent_stop","success":true} diff --git a/bun.lock b/bun.lock index 1b390bf8d..eaa1a6b9f 100644 --- a/bun.lock +++ b/bun.lock @@ -6,6 +6,7 @@ "name": "claude-code-best", "dependencies": { "@claude-code-best/mcp-chrome-bridge": "^2.0.7", + "ws": "^8.20.0", }, "devDependencies": { "@alcalzone/ansi-tokenize": "^0.3.0", @@ -134,7 +135,6 @@ "vscode-languageserver-protocol": "^3.17.5", "vscode-languageserver-types": "^3.17.5", "wrap-ansi": "^10.0.0", - "ws": "^8.20.0", "xss": "^1.0.15", "yaml": "^2.8.3", "zod": "^4.3.6", @@ -443,7 +443,7 @@ "@claude-code-best/builtin-tools": ["@claude-code-best/builtin-tools@workspace:packages/builtin-tools"], - "@claude-code-best/mcp-chrome-bridge": ["@claude-code-best/mcp-chrome-bridge@2.0.7", "", { "dependencies": { "@fastify/cors": "^11.0.1", "@modelcontextprotocol/sdk": "^1.11.0", "chalk": "^5.4.1", "chrome-mcp-shared": "^1.0.2", "commander": "^13.1.0", "fastify": "^5.3.2", "is-admin": "^4.0.0", "pino": "^9.6.0", "uuid": "^11.1.0" }, "bin": { "mcp-chrome-bridge": "dist/cli.js", "mcp-chrome-stdio": "dist/mcp/mcp-server-stdio.js" } }, "sha512-gb64+Ga6li3A8Ll9NKV+ePBn5/U0fccCdrH43tGYveLKZIZxURz8cbY+Z3BdbTdYSPVdFXtfUlp3TMxu4OT5gg=="], + "@claude-code-best/mcp-chrome-bridge": ["@claude-code-best/mcp-chrome-bridge@2.0.7", "https://registry.npmmirror.com/@claude-code-best/mcp-chrome-bridge/-/mcp-chrome-bridge-2.0.7.tgz", { "dependencies": { "@fastify/cors": "^11.0.1", "@modelcontextprotocol/sdk": "^1.11.0", "chalk": "^5.4.1", "chrome-mcp-shared": "^1.0.2", "commander": "^13.1.0", "fastify": "^5.3.2", "is-admin": "^4.0.0", "pino": "^9.6.0", "uuid": "^11.1.0" }, "bin": { "mcp-chrome-bridge": "dist/cli.js", "mcp-chrome-stdio": "dist/mcp/mcp-server-stdio.js" } }, "sha512-gb64+Ga6li3A8Ll9NKV+ePBn5/U0fccCdrH43tGYveLKZIZxURz8cbY+Z3BdbTdYSPVdFXtfUlp3TMxu4OT5gg=="], "@claude-code-best/mcp-client": ["@claude-code-best/mcp-client@workspace:packages/mcp-client"], @@ -507,21 +507,21 @@ "@esbuild/win32-x64": ["@esbuild/win32-x64@0.25.12", "https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", { "os": "win32", "cpu": "x64" }, "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA=="], - "@fastify/ajv-compiler": ["@fastify/ajv-compiler@4.0.5", "", { "dependencies": { "ajv": "^8.12.0", "ajv-formats": "^3.0.1", "fast-uri": "^3.0.0" } }, "sha512-KoWKW+MhvfTRWL4qrhUwAAZoaChluo0m0vbiJlGMt2GXvL4LVPQEjt8kSpHI3IBq5Rez8fg+XeH3cneztq+C7A=="], + "@fastify/ajv-compiler": ["@fastify/ajv-compiler@4.0.5", "https://registry.npmmirror.com/@fastify/ajv-compiler/-/ajv-compiler-4.0.5.tgz", { "dependencies": { "ajv": "^8.12.0", "ajv-formats": "^3.0.1", "fast-uri": "^3.0.0" } }, "sha512-KoWKW+MhvfTRWL4qrhUwAAZoaChluo0m0vbiJlGMt2GXvL4LVPQEjt8kSpHI3IBq5Rez8fg+XeH3cneztq+C7A=="], - "@fastify/cors": ["@fastify/cors@11.2.0", "", { "dependencies": { "fastify-plugin": "^5.0.0", "toad-cache": "^3.7.0" } }, "sha512-LbLHBuSAdGdSFZYTLVA3+Ch2t+sA6nq3Ejc6XLAKiQ6ViS2qFnvicpj0htsx03FyYeLs04HfRNBsz/a8SvbcUw=="], + "@fastify/cors": ["@fastify/cors@11.2.0", "https://registry.npmmirror.com/@fastify/cors/-/cors-11.2.0.tgz", { "dependencies": { "fastify-plugin": "^5.0.0", "toad-cache": "^3.7.0" } }, "sha512-LbLHBuSAdGdSFZYTLVA3+Ch2t+sA6nq3Ejc6XLAKiQ6ViS2qFnvicpj0htsx03FyYeLs04HfRNBsz/a8SvbcUw=="], - "@fastify/error": ["@fastify/error@4.2.0", "", {}, "sha512-RSo3sVDXfHskiBZKBPRgnQTtIqpi/7zhJOEmAxCiBcM7d0uwdGdxLlsCaLzGs8v8NnxIRlfG0N51p5yFaOentQ=="], + "@fastify/error": ["@fastify/error@4.2.0", "https://registry.npmmirror.com/@fastify/error/-/error-4.2.0.tgz", {}, "sha512-RSo3sVDXfHskiBZKBPRgnQTtIqpi/7zhJOEmAxCiBcM7d0uwdGdxLlsCaLzGs8v8NnxIRlfG0N51p5yFaOentQ=="], - "@fastify/fast-json-stringify-compiler": ["@fastify/fast-json-stringify-compiler@5.0.3", "", { "dependencies": { "fast-json-stringify": "^6.0.0" } }, "sha512-uik7yYHkLr6fxd8hJSZ8c+xF4WafPK+XzneQDPU+D10r5X19GW8lJcom2YijX2+qtFF1ENJlHXKFM9ouXNJYgQ=="], + "@fastify/fast-json-stringify-compiler": ["@fastify/fast-json-stringify-compiler@5.0.3", "https://registry.npmmirror.com/@fastify/fast-json-stringify-compiler/-/fast-json-stringify-compiler-5.0.3.tgz", { "dependencies": { "fast-json-stringify": "^6.0.0" } }, "sha512-uik7yYHkLr6fxd8hJSZ8c+xF4WafPK+XzneQDPU+D10r5X19GW8lJcom2YijX2+qtFF1ENJlHXKFM9ouXNJYgQ=="], - "@fastify/forwarded": ["@fastify/forwarded@3.0.1", "", {}, "sha512-JqDochHFqXs3C3Ml3gOY58zM7OqO9ENqPo0UqAjAjH8L01fRZqwX9iLeX34//kiJubF7r2ZQHtBRU36vONbLlw=="], + "@fastify/forwarded": ["@fastify/forwarded@3.0.1", "https://registry.npmmirror.com/@fastify/forwarded/-/forwarded-3.0.1.tgz", {}, "sha512-JqDochHFqXs3C3Ml3gOY58zM7OqO9ENqPo0UqAjAjH8L01fRZqwX9iLeX34//kiJubF7r2ZQHtBRU36vONbLlw=="], - "@fastify/merge-json-schemas": ["@fastify/merge-json-schemas@0.2.1", "", { "dependencies": { "dequal": "^2.0.3" } }, "sha512-OA3KGBCy6KtIvLf8DINC5880o5iBlDX4SxzLQS8HorJAbqluzLRn80UXU0bxZn7UOFhFgpRJDasfwn9nG4FG4A=="], + "@fastify/merge-json-schemas": ["@fastify/merge-json-schemas@0.2.1", "https://registry.npmmirror.com/@fastify/merge-json-schemas/-/merge-json-schemas-0.2.1.tgz", { "dependencies": { "dequal": "^2.0.3" } }, "sha512-OA3KGBCy6KtIvLf8DINC5880o5iBlDX4SxzLQS8HorJAbqluzLRn80UXU0bxZn7UOFhFgpRJDasfwn9nG4FG4A=="], "@fastify/otel": ["@fastify/otel@0.18.0", "https://registry.npmmirror.com/@fastify/otel/-/otel-0.18.0.tgz", { "dependencies": { "@opentelemetry/core": "^2.0.0", "@opentelemetry/instrumentation": "^0.212.0", "@opentelemetry/semantic-conventions": "^1.28.0", "minimatch": "^10.2.4" }, "peerDependencies": { "@opentelemetry/api": "^1.9.0" } }, "sha512-3TASCATfw+ctICSb4ymrv7iCm0qJ0N9CarB+CZ7zIJ7KqNbwI5JjyDL1/sxoC0ccTO1Zyd1iQ+oqncPg5FJXaA=="], - "@fastify/proxy-addr": ["@fastify/proxy-addr@5.1.0", "", { "dependencies": { "@fastify/forwarded": "^3.0.0", "ipaddr.js": "^2.1.0" } }, "sha512-INS+6gh91cLUjB+PVHfu1UqcB76Sqtpyp7bnL+FYojhjygvOPA9ctiD/JDKsyD9Xgu4hUhCSJBPig/w7duNajw=="], + "@fastify/proxy-addr": ["@fastify/proxy-addr@5.1.0", "https://registry.npmmirror.com/@fastify/proxy-addr/-/proxy-addr-5.1.0.tgz", { "dependencies": { "@fastify/forwarded": "^3.0.0", "ipaddr.js": "^2.1.0" } }, "sha512-INS+6gh91cLUjB+PVHfu1UqcB76Sqtpyp7bnL+FYojhjygvOPA9ctiD/JDKsyD9Xgu4hUhCSJBPig/w7duNajw=="], "@growthbook/growthbook": ["@growthbook/growthbook@1.6.5", "https://registry.npmmirror.com/@growthbook/growthbook/-/growthbook-1.6.5.tgz", { "dependencies": { "dom-mutator": "^0.6.0" } }, "sha512-mUaMsgeUTpRIUOTn33EUXHRK6j7pxBjwqH4WpQyq+pukjd1AIzWlEa6w7i6bInJUcweGgP2beXZmaP6b6UPn7A=="], @@ -1099,7 +1099,7 @@ "@xmldom/xmldom": ["@xmldom/xmldom@0.8.12", "https://registry.npmmirror.com/@xmldom/xmldom/-/xmldom-0.8.12.tgz", {}, "sha512-9k/gHF6n/pAi/9tqr3m3aqkuiNosYTurLLUtc7xQ9sxB/wm7WPygCv8GYa6mS0fLJEHhqMC1ATYhz++U/lRHqg=="], - "abstract-logging": ["abstract-logging@2.0.1", "", {}, "sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA=="], + "abstract-logging": ["abstract-logging@2.0.1", "https://registry.npmmirror.com/abstract-logging/-/abstract-logging-2.0.1.tgz", {}, "sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA=="], "accepts": ["accepts@2.0.0", "https://registry.npmmirror.com/accepts/-/accepts-2.0.0.tgz", { "dependencies": { "mime-types": "^3.0.0", "negotiator": "^1.0.0" } }, "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng=="], @@ -1133,7 +1133,7 @@ "auto-bind": ["auto-bind@5.0.1", "https://registry.npmmirror.com/auto-bind/-/auto-bind-5.0.1.tgz", {}, "sha512-ooviqdwwgfIfNmDwo94wlshcdzfO64XV0Cg6oDsDYBJfITDz1EngD2z7DkbvCWn+XIMsIqW27sEVF6qcpJrRcg=="], - "avvio": ["avvio@9.2.0", "", { "dependencies": { "@fastify/error": "^4.0.0", "fastq": "^1.17.1" } }, "sha512-2t/sy01ArdHHE0vRH5Hsay+RtCZt3dLPji7W7/MMOCEgze5b7SNDC4j5H6FnVgPkI1MTNFGzHdHrVXDDl7QSSQ=="], + "avvio": ["avvio@9.2.0", "https://registry.npmmirror.com/avvio/-/avvio-9.2.0.tgz", { "dependencies": { "@fastify/error": "^4.0.0", "fastq": "^1.17.1" } }, "sha512-2t/sy01ArdHHE0vRH5Hsay+RtCZt3dLPji7W7/MMOCEgze5b7SNDC4j5H6FnVgPkI1MTNFGzHdHrVXDDl7QSSQ=="], "axios": ["axios@1.15.0", "https://registry.npmmirror.com/axios/-/axios-1.15.0.tgz", { "dependencies": { "follow-redirects": "^1.15.11", "form-data": "^4.0.5", "proxy-from-env": "^2.1.0" } }, "sha512-wWyJDlAatxk30ZJer+GeCWS209sA42X+N5jU2jy6oHTp7ufw8uzUTVFBX9+wTfAlhiJXGS0Bq7X6efruWjuK9Q=="], @@ -1247,7 +1247,7 @@ "depd": ["depd@2.0.0", "https://registry.npmmirror.com/depd/-/depd-2.0.0.tgz", {}, "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="], - "dequal": ["dequal@2.0.3", "", {}, "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA=="], + "dequal": ["dequal@2.0.3", "https://registry.npmmirror.com/dequal/-/dequal-2.0.3.tgz", {}, "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA=="], "detect-libc": ["detect-libc@2.1.2", "https://registry.npmmirror.com/detect-libc/-/detect-libc-2.1.2.tgz", {}, "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ=="], @@ -1305,15 +1305,15 @@ "external-editor": ["external-editor@3.1.0", "https://registry.npmmirror.com/external-editor/-/external-editor-3.1.0.tgz", { "dependencies": { "chardet": "^0.7.0", "iconv-lite": "^0.4.24", "tmp": "^0.0.33" } }, "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew=="], - "fast-decode-uri-component": ["fast-decode-uri-component@1.0.1", "", {}, "sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg=="], + "fast-decode-uri-component": ["fast-decode-uri-component@1.0.1", "https://registry.npmmirror.com/fast-decode-uri-component/-/fast-decode-uri-component-1.0.1.tgz", {}, "sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg=="], "fast-deep-equal": ["fast-deep-equal@3.1.3", "https://registry.npmmirror.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="], "fast-glob": ["fast-glob@3.3.3", "https://registry.npmmirror.com/fast-glob/-/fast-glob-3.3.3.tgz", { "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.8" } }, "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg=="], - "fast-json-stringify": ["fast-json-stringify@6.3.0", "", { "dependencies": { "@fastify/merge-json-schemas": "^0.2.0", "ajv": "^8.12.0", "ajv-formats": "^3.0.1", "fast-uri": "^3.0.0", "json-schema-ref-resolver": "^3.0.0", "rfdc": "^1.2.0" } }, "sha512-oRCntNDY/329HJPlmdNLIdogNtt6Vyjb1WuT01Soss3slIdyUp8kAcDU3saQTOquEK8KFVfwIIF7FebxUAu+yA=="], + "fast-json-stringify": ["fast-json-stringify@6.3.0", "https://registry.npmmirror.com/fast-json-stringify/-/fast-json-stringify-6.3.0.tgz", { "dependencies": { "@fastify/merge-json-schemas": "^0.2.0", "ajv": "^8.12.0", "ajv-formats": "^3.0.1", "fast-uri": "^3.0.0", "json-schema-ref-resolver": "^3.0.0", "rfdc": "^1.2.0" } }, "sha512-oRCntNDY/329HJPlmdNLIdogNtt6Vyjb1WuT01Soss3slIdyUp8kAcDU3saQTOquEK8KFVfwIIF7FebxUAu+yA=="], - "fast-querystring": ["fast-querystring@1.1.2", "", { "dependencies": { "fast-decode-uri-component": "^1.0.1" } }, "sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg=="], + "fast-querystring": ["fast-querystring@1.1.2", "https://registry.npmmirror.com/fast-querystring/-/fast-querystring-1.1.2.tgz", { "dependencies": { "fast-decode-uri-component": "^1.0.1" } }, "sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg=="], "fast-uri": ["fast-uri@3.1.0", "https://registry.npmmirror.com/fast-uri/-/fast-uri-3.1.0.tgz", {}, "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA=="], @@ -1321,9 +1321,9 @@ "fast-xml-parser": ["fast-xml-parser@5.5.8", "https://registry.npmmirror.com/fast-xml-parser/-/fast-xml-parser-5.5.8.tgz", { "dependencies": { "fast-xml-builder": "^1.1.4", "path-expression-matcher": "^1.2.0", "strnum": "^2.2.0" }, "bin": { "fxparser": "src/cli/cli.js" } }, "sha512-Z7Fh2nVQSb2d+poDViM063ix2ZGt9jmY1nWhPfHBOK2Hgnb/OW3P4Et3P/81SEej0J7QbWtJqxO05h8QYfK7LQ=="], - "fastify": ["fastify@5.8.4", "", { "dependencies": { "@fastify/ajv-compiler": "^4.0.5", "@fastify/error": "^4.0.0", "@fastify/fast-json-stringify-compiler": "^5.0.0", "@fastify/proxy-addr": "^5.0.0", "abstract-logging": "^2.0.1", "avvio": "^9.0.0", "fast-json-stringify": "^6.0.0", "find-my-way": "^9.0.0", "light-my-request": "^6.0.0", "pino": "^9.14.0 || ^10.1.0", "process-warning": "^5.0.0", "rfdc": "^1.3.1", "secure-json-parse": "^4.0.0", "semver": "^7.6.0", "toad-cache": "^3.7.0" } }, "sha512-sa42J1xylbBAYUWALSBoyXKPDUvM3OoNOibIefA+Oha57FryXKKCZarA1iDntOCWp3O35voZLuDg2mdODXtPzQ=="], + "fastify": ["fastify@5.8.4", "https://registry.npmmirror.com/fastify/-/fastify-5.8.4.tgz", { "dependencies": { "@fastify/ajv-compiler": "^4.0.5", "@fastify/error": "^4.0.0", "@fastify/fast-json-stringify-compiler": "^5.0.0", "@fastify/proxy-addr": "^5.0.0", "abstract-logging": "^2.0.1", "avvio": "^9.0.0", "fast-json-stringify": "^6.0.0", "find-my-way": "^9.0.0", "light-my-request": "^6.0.0", "pino": "^9.14.0 || ^10.1.0", "process-warning": "^5.0.0", "rfdc": "^1.3.1", "secure-json-parse": "^4.0.0", "semver": "^7.6.0", "toad-cache": "^3.7.0" } }, "sha512-sa42J1xylbBAYUWALSBoyXKPDUvM3OoNOibIefA+Oha57FryXKKCZarA1iDntOCWp3O35voZLuDg2mdODXtPzQ=="], - "fastify-plugin": ["fastify-plugin@5.1.0", "", {}, "sha512-FAIDA8eovSt5qcDgcBvDuX/v0Cjz0ohGhENZ/wpc3y+oZCY2afZ9Baqql3g/lC+OHRnciQol4ww7tuthOb9idw=="], + "fastify-plugin": ["fastify-plugin@5.1.0", "https://registry.npmmirror.com/fastify-plugin/-/fastify-plugin-5.1.0.tgz", {}, "sha512-FAIDA8eovSt5qcDgcBvDuX/v0Cjz0ohGhENZ/wpc3y+oZCY2afZ9Baqql3g/lC+OHRnciQol4ww7tuthOb9idw=="], "fastq": ["fastq@1.20.1", "https://registry.npmmirror.com/fastq/-/fastq-1.20.1.tgz", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw=="], @@ -1341,7 +1341,7 @@ "finalhandler": ["finalhandler@2.1.1", "https://registry.npmmirror.com/finalhandler/-/finalhandler-2.1.1.tgz", { "dependencies": { "debug": "^4.4.0", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "on-finished": "^2.4.1", "parseurl": "^1.3.3", "statuses": "^2.0.1" } }, "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA=="], - "find-my-way": ["find-my-way@9.5.0", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-querystring": "^1.0.0", "safe-regex2": "^5.0.0" } }, "sha512-VW2RfnmscZO5KgBY5XVyKREMW5nMZcxDy+buTOsL+zIPnBlbKm+00sgzoQzq1EVh4aALZLfKdwv6atBGcjvjrQ=="], + "find-my-way": ["find-my-way@9.5.0", "https://registry.npmmirror.com/find-my-way/-/find-my-way-9.5.0.tgz", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-querystring": "^1.0.0", "safe-regex2": "^5.0.0" } }, "sha512-VW2RfnmscZO5KgBY5XVyKREMW5nMZcxDy+buTOsL+zIPnBlbKm+00sgzoQzq1EVh4aALZLfKdwv6atBGcjvjrQ=="], "find-up": ["find-up@4.1.0", "https://registry.npmmirror.com/find-up/-/find-up-4.1.0.tgz", { "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" } }, "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw=="], @@ -1483,7 +1483,7 @@ "json-bigint": ["json-bigint@1.0.0", "https://registry.npmmirror.com/json-bigint/-/json-bigint-1.0.0.tgz", { "dependencies": { "bignumber.js": "^9.0.0" } }, "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ=="], - "json-schema-ref-resolver": ["json-schema-ref-resolver@3.0.0", "", { "dependencies": { "dequal": "^2.0.3" } }, "sha512-hOrZIVL5jyYFjzk7+y7n5JDzGlU8rfWDuYyHwGa2WA8/pcmMHezp2xsVwxrebD/Q9t8Nc5DboieySDpCp4WG4A=="], + "json-schema-ref-resolver": ["json-schema-ref-resolver@3.0.0", "https://registry.npmmirror.com/json-schema-ref-resolver/-/json-schema-ref-resolver-3.0.0.tgz", { "dependencies": { "dequal": "^2.0.3" } }, "sha512-hOrZIVL5jyYFjzk7+y7n5JDzGlU8rfWDuYyHwGa2WA8/pcmMHezp2xsVwxrebD/Q9t8Nc5DboieySDpCp4WG4A=="], "json-schema-to-ts": ["json-schema-to-ts@3.1.1", "https://registry.npmmirror.com/json-schema-to-ts/-/json-schema-to-ts-3.1.1.tgz", { "dependencies": { "@babel/runtime": "^7.18.3", "ts-algebra": "^2.0.0" } }, "sha512-+DWg8jCJG2TEnpy7kOm/7/AxaYoaRbjVB4LFZLySZlWn8exGs3A4OLJR966cVvU26N7X9TWxl+Jsw7dzAqKT6g=="], @@ -1505,7 +1505,7 @@ "knip": ["knip@6.4.0", "https://registry.npmmirror.com/knip/-/knip-6.4.0.tgz", { "dependencies": { "@nodelib/fs.walk": "^1.2.3", "fast-glob": "^3.3.3", "formatly": "^0.3.0", "get-tsconfig": "4.13.7", "jiti": "^2.6.0", "minimist": "^1.2.8", "oxc-parser": "^0.121.0", "oxc-resolver": "^11.19.1", "picocolors": "^1.1.1", "picomatch": "^4.0.1", "smol-toml": "^1.6.1", "strip-json-comments": "5.0.3", "unbash": "^2.2.0", "yaml": "^2.8.2", "zod": "^4.1.11" }, "bin": { "knip": "bin/knip.js", "knip-bun": "bin/knip-bun.js" } }, "sha512-SAEeggehgkPdoLZWVEcFKzPw+vNlnrUBDqcX8cOcHGydRInSn5pnn9LN3dDJ8SkDHKXR7xYzNq3HtRJaYmxOHg=="], - "light-my-request": ["light-my-request@6.6.0", "", { "dependencies": { "cookie": "^1.0.1", "process-warning": "^4.0.0", "set-cookie-parser": "^2.6.0" } }, "sha512-CHYbu8RtboSIoVsHZ6Ye4cj4Aw/yg2oAFimlF7mNvfDV192LR7nDiKtSIfCuLT7KokPSTn/9kfVLm5OGN0A28A=="], + "light-my-request": ["light-my-request@6.6.0", "https://registry.npmmirror.com/light-my-request/-/light-my-request-6.6.0.tgz", { "dependencies": { "cookie": "^1.0.1", "process-warning": "^4.0.0", "set-cookie-parser": "^2.6.0" } }, "sha512-CHYbu8RtboSIoVsHZ6Ye4cj4Aw/yg2oAFimlF7mNvfDV192LR7nDiKtSIfCuLT7KokPSTn/9kfVLm5OGN0A28A=="], "lightningcss": ["lightningcss@1.32.0", "https://registry.npmmirror.com/lightningcss/-/lightningcss-1.32.0.tgz", { "dependencies": { "detect-libc": "^2.0.3" }, "optionalDependencies": { "lightningcss-android-arm64": "1.32.0", "lightningcss-darwin-arm64": "1.32.0", "lightningcss-darwin-x64": "1.32.0", "lightningcss-freebsd-x64": "1.32.0", "lightningcss-linux-arm-gnueabihf": "1.32.0", "lightningcss-linux-arm64-gnu": "1.32.0", "lightningcss-linux-arm64-musl": "1.32.0", "lightningcss-linux-x64-gnu": "1.32.0", "lightningcss-linux-x64-musl": "1.32.0", "lightningcss-win32-arm64-msvc": "1.32.0", "lightningcss-win32-x64-msvc": "1.32.0" } }, "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ=="], @@ -1745,13 +1745,13 @@ "resolve-pkg-maps": ["resolve-pkg-maps@1.0.0", "https://registry.npmmirror.com/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", {}, "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw=="], - "ret": ["ret@0.5.0", "", {}, "sha512-I1XxrZSQ+oErkRR4jYbAyEEu2I0avBvvMM5JN+6EBprOGRCs63ENqZ3vjavq8fBw2+62G5LF5XelKwuJpcvcxw=="], + "ret": ["ret@0.5.0", "https://registry.npmmirror.com/ret/-/ret-0.5.0.tgz", {}, "sha512-I1XxrZSQ+oErkRR4jYbAyEEu2I0avBvvMM5JN+6EBprOGRCs63ENqZ3vjavq8fBw2+62G5LF5XelKwuJpcvcxw=="], "retry": ["retry@0.12.0", "https://registry.npmmirror.com/retry/-/retry-0.12.0.tgz", {}, "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow=="], "reusify": ["reusify@1.1.0", "https://registry.npmmirror.com/reusify/-/reusify-1.1.0.tgz", {}, "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw=="], - "rfdc": ["rfdc@1.4.1", "", {}, "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA=="], + "rfdc": ["rfdc@1.4.1", "https://registry.npmmirror.com/rfdc/-/rfdc-1.4.1.tgz", {}, "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA=="], "rollup": ["rollup@4.60.1", "https://registry.npmmirror.com/rollup/-/rollup-4.60.1.tgz", { "dependencies": { "@types/estree": "1.0.8" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.60.1", "@rollup/rollup-android-arm64": "4.60.1", "@rollup/rollup-darwin-arm64": "4.60.1", "@rollup/rollup-darwin-x64": "4.60.1", "@rollup/rollup-freebsd-arm64": "4.60.1", "@rollup/rollup-freebsd-x64": "4.60.1", "@rollup/rollup-linux-arm-gnueabihf": "4.60.1", "@rollup/rollup-linux-arm-musleabihf": "4.60.1", "@rollup/rollup-linux-arm64-gnu": "4.60.1", "@rollup/rollup-linux-arm64-musl": "4.60.1", "@rollup/rollup-linux-loong64-gnu": "4.60.1", "@rollup/rollup-linux-loong64-musl": "4.60.1", "@rollup/rollup-linux-ppc64-gnu": "4.60.1", "@rollup/rollup-linux-ppc64-musl": "4.60.1", "@rollup/rollup-linux-riscv64-gnu": "4.60.1", "@rollup/rollup-linux-riscv64-musl": "4.60.1", "@rollup/rollup-linux-s390x-gnu": "4.60.1", "@rollup/rollup-linux-x64-gnu": "4.60.1", "@rollup/rollup-linux-x64-musl": "4.60.1", "@rollup/rollup-openbsd-x64": "4.60.1", "@rollup/rollup-openharmony-arm64": "4.60.1", "@rollup/rollup-win32-arm64-msvc": "4.60.1", "@rollup/rollup-win32-ia32-msvc": "4.60.1", "@rollup/rollup-win32-x64-gnu": "4.60.1", "@rollup/rollup-win32-x64-msvc": "4.60.1", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-VmtB2rFU/GroZ4oL8+ZqXgSA38O6GR8KSIvWmEFv63pQ0G6KaBH9s07PO8XTXP4vI+3UJUEypOfjkGfmSBBR0w=="], @@ -1763,7 +1763,7 @@ "safe-buffer": ["safe-buffer@5.2.1", "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], - "safe-regex2": ["safe-regex2@5.1.0", "", { "dependencies": { "ret": "~0.5.0" }, "bin": { "safe-regex2": "bin/safe-regex2.js" } }, "sha512-pNHAuBW7TrcleFHsxBr5QMi/Iyp0ENjUKz7GCcX1UO7cMh+NmVK6HxQckNL1tJp1XAJVjG6B8OKIPqodqj9rtw=="], + "safe-regex2": ["safe-regex2@5.1.0", "https://registry.npmmirror.com/safe-regex2/-/safe-regex2-5.1.0.tgz", { "dependencies": { "ret": "~0.5.0" }, "bin": { "safe-regex2": "bin/safe-regex2.js" } }, "sha512-pNHAuBW7TrcleFHsxBr5QMi/Iyp0ENjUKz7GCcX1UO7cMh+NmVK6HxQckNL1tJp1XAJVjG6B8OKIPqodqj9rtw=="], "safe-stable-stringify": ["safe-stable-stringify@2.5.0", "https://registry.npmmirror.com/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", {}, "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA=="], @@ -1771,7 +1771,7 @@ "scheduler": ["scheduler@0.27.0", "https://registry.npmmirror.com/scheduler/-/scheduler-0.27.0.tgz", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="], - "secure-json-parse": ["secure-json-parse@4.1.0", "", {}, "sha512-l4KnYfEyqYJxDwlNVyRfO2E4NTHfMKAWdUuA8J0yve2Dz/E/PdBepY03RvyJpssIpRFwJoCD55wA+mEDs6ByWA=="], + "secure-json-parse": ["secure-json-parse@4.1.0", "https://registry.npmmirror.com/secure-json-parse/-/secure-json-parse-4.1.0.tgz", {}, "sha512-l4KnYfEyqYJxDwlNVyRfO2E4NTHfMKAWdUuA8J0yve2Dz/E/PdBepY03RvyJpssIpRFwJoCD55wA+mEDs6ByWA=="], "semver": ["semver@7.7.4", "https://registry.npmmirror.com/semver/-/semver-7.7.4.tgz", { "bin": { "semver": "bin/semver.js" } }, "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA=="], @@ -1781,7 +1781,7 @@ "set-blocking": ["set-blocking@2.0.0", "https://registry.npmmirror.com/set-blocking/-/set-blocking-2.0.0.tgz", {}, "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw=="], - "set-cookie-parser": ["set-cookie-parser@2.7.2", "", {}, "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw=="], + "set-cookie-parser": ["set-cookie-parser@2.7.2", "https://registry.npmmirror.com/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz", {}, "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw=="], "setprototypeof": ["setprototypeof@1.2.0", "https://registry.npmmirror.com/setprototypeof/-/setprototypeof-1.2.0.tgz", {}, "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="], @@ -1851,7 +1851,7 @@ "to-regex-range": ["to-regex-range@5.0.1", "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="], - "toad-cache": ["toad-cache@3.7.0", "", {}, "sha512-/m8M+2BJUpoJdgAHoG+baCwBT+tf2VraSfkBgl0Y00qIWt41DJ8R5B8nsEw0I58YwF5IZH6z24/2TobDKnqSWw=="], + "toad-cache": ["toad-cache@3.7.0", "https://registry.npmmirror.com/toad-cache/-/toad-cache-3.7.0.tgz", {}, "sha512-/m8M+2BJUpoJdgAHoG+baCwBT+tf2VraSfkBgl0Y00qIWt41DJ8R5B8nsEw0I58YwF5IZH6z24/2TobDKnqSWw=="], "toidentifier": ["toidentifier@1.0.1", "https://registry.npmmirror.com/toidentifier/-/toidentifier-1.0.1.tgz", {}, "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA=="], @@ -2127,7 +2127,7 @@ "@fastify/otel/@opentelemetry/instrumentation": ["@opentelemetry/instrumentation@0.212.0", "https://registry.npmmirror.com/@opentelemetry/instrumentation/-/instrumentation-0.212.0.tgz", { "dependencies": { "@opentelemetry/api-logs": "0.212.0", "import-in-the-middle": "^2.0.6", "require-in-the-middle": "^8.0.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-IyXmpNnifNouMOe0I/gX7ENfv2ZCNdYTF0FpCsoBcpbIHzk81Ww9rQTYTnvghszCg7qGrIhNvWC8dhEifgX9Jg=="], - "@fastify/proxy-addr/ipaddr.js": ["ipaddr.js@2.3.0", "", {}, "sha512-Zv/pA+ciVFbCSBBjGfaKUya/CcGmUHzTydLMaTwrUUEM2DIEO3iZvueGxmacvmN50fGpGVKeTXpb2LcYQxeVdg=="], + "@fastify/proxy-addr/ipaddr.js": ["ipaddr.js@2.3.0", "https://registry.npmmirror.com/ipaddr.js/-/ipaddr.js-2.3.0.tgz", {}, "sha512-Zv/pA+ciVFbCSBBjGfaKUya/CcGmUHzTydLMaTwrUUEM2DIEO3iZvueGxmacvmN50fGpGVKeTXpb2LcYQxeVdg=="], "@grpc/proto-loader/yargs": ["yargs@17.7.2", "https://registry.npmmirror.com/yargs/-/yargs-17.7.2.tgz", { "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" } }, "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w=="], @@ -2295,9 +2295,9 @@ "is-admin/execa": ["execa@5.1.1", "https://registry.npmmirror.com/execa/-/execa-5.1.1.tgz", { "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", "human-signals": "^2.1.0", "is-stream": "^2.0.0", "merge-stream": "^2.0.0", "npm-run-path": "^4.0.1", "onetime": "^5.1.2", "signal-exit": "^3.0.3", "strip-final-newline": "^2.0.0" } }, "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg=="], - "light-my-request/cookie": ["cookie@1.1.1", "", {}, "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ=="], + "light-my-request/cookie": ["cookie@1.1.1", "https://registry.npmmirror.com/cookie/-/cookie-1.1.1.tgz", {}, "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ=="], - "light-my-request/process-warning": ["process-warning@4.0.1", "", {}, "sha512-3c2LzQ3rY9d0hc1emcsHhfT9Jwz0cChib/QN89oME2R451w5fy3f0afAhERFZAwrbDU43wk12d0ORBpDVME50Q=="], + "light-my-request/process-warning": ["process-warning@4.0.1", "https://registry.npmmirror.com/process-warning/-/process-warning-4.0.1.tgz", {}, "sha512-3c2LzQ3rY9d0hc1emcsHhfT9Jwz0cChib/QN89oME2R451w5fy3f0afAhERFZAwrbDU43wk12d0ORBpDVME50Q=="], "micromatch/picomatch": ["picomatch@2.3.2", "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.2.tgz", {}, "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA=="], From ca28559381c6f0ec03954b2f8e9d3a89c2a4c382 Mon Sep 17 00:00:00 2001 From: claude-code-best Date: Tue, 14 Apr 2026 21:19:36 +0800 Subject: [PATCH 3/4] =?UTF-8?q?docs:=20=E4=BF=AE=E5=A4=8D=E9=93=BE?= =?UTF-8?q?=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .omc/project-memory.json | 6 ++++++ README.md | 15 +++++++++++++++ docs/features/chrome-use-mcp.md | 2 +- 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/.omc/project-memory.json b/.omc/project-memory.json index 4f37d8f45..d784276fe 100644 --- a/.omc/project-memory.json +++ b/.omc/project-memory.json @@ -182,6 +182,12 @@ "lastAccessed": 1776308709974, "type": "file" }, + { + "path": "README.md", + "accessCount": 2, + "lastAccessed": 1776307986506, + "type": "file" + }, { "path": "src", "accessCount": 1, diff --git a/README.md b/README.md index dfb34f23b..6971e2c45 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,21 @@ --- +| 特性 | 说明 | 文档 | +|------|------|------| +| **Claude 群控技术** | Pipe IPC 多实例协作:同机 main/sub 自动编排 + LAN 跨机器零配置发现与通讯,`/pipes` 选择面板 + `Shift+↓` 交互 + 消息广播路由 | [Pipe IPC](https://ccb.agent-aura.top/docs/features/pipes-and-lan) / [LAN](https://ccb.agent-aura.top/docs/features/lan-pipes) | +| Remote Control 私有部署 | Docker 自托管 RCS + Web UI | [文档](https://ccb.agent-aura.top/docs/features/remote-control-self-hosting) | +| /dream 记忆整理 | 自动整理和优化记忆文件 | [文档](https://ccb.agent-aura.top/docs/features/auto-dream) | +| Web Search | 内置网页搜索工具 | [文档](https://ccb.agent-aura.top/docs/features/web-browser-tool) | +| 自定义模型供应商 | OpenAI/Anthropic/Gemini/Grok 兼容 | [文档](https://ccb.agent-aura.top/docs/features/custom-platform-login) | +| Voice Mode | Push-to-Talk 语音输入 | [文档](https://ccb.agent-aura.top/docs/features/voice-mode) | +| Computer Use | 屏幕截图、键鼠控制 | [文档](https://ccb.agent-aura.top/docs/features/computer-use) | +| Chrome Use | 浏览器自动化、表单填写、数据抓取 | [自托管](https://ccb.agent-aura.top/docs/features/chrome-use-mcp) [原生版](https://ccb.agent-aura.top/docs/features/claude-in-chrome-mcp) | +| Sentry | 企业级错误追踪 | [文档](https://ccb.agent-aura.top/docs/internals/sentry-setup) | +| GrowthBook | 企业级特性开关 | [文档](https://ccb.agent-aura.top/docs/internals/growthbook-adapter) | +| Langfuse 监控 | LLM 调用/工具执行/多 Agent 全链路追踪 | [文档](https://ccb.agent-aura.top/docs/features/langfuse-monitoring) | +| Poor Mode | 穷鬼模式,关闭记忆提取和键入建议 | /poor 可以开关 | + ## CoStrict 是什么 CoStrict 是一款免费开源的 AI 辅助编程工具,专为企业级开发场景设计。支持私有化部署,是组织级安全、标准化 AI 开发工作流的最佳选择。 diff --git a/docs/features/chrome-use-mcp.md b/docs/features/chrome-use-mcp.md index ff2350c3b..ecbc56f36 100644 --- a/docs/features/chrome-use-mcp.md +++ b/docs/features/chrome-use-mcp.md @@ -6,7 +6,7 @@ ### 第一步:安装 Chrome 扩展 -1. 下载扩展:https://github.com/hangwin/mcp-chrome/releases(下载最新 zip) +1. 下载扩展:https://github.com/hangwin/mcp-chrome/releases 2. 解压 zip 文件 3. 打开 Chrome 访问 `chrome://extensions/` 4. 开启右上角「开发者模式」 From da60b49b86c379ea67a9e34a1cd3f5868d471107 Mon Sep 17 00:00:00 2001 From: claude-code-best Date: Wed, 15 Apr 2026 10:54:00 +0800 Subject: [PATCH 4/4] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E7=B1=BB=E5=9E=8B?= =?UTF-8?q?=E9=97=AE=E9=A2=98(#267)=20(#271)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix: 修复 Bun 的 polyfill 问题 * fix: 类型修复完成 * feat: 统一所有包的类型文件 * fix: 修复构建问题 --- CLAUDE.md | 2 + build.ts | 21 +++++++++- bun.lock | 3 +- package.json | 18 +++++---- .../@ant/claude-for-chrome-mcp/tsconfig.json | 5 +++ .../computer-use-input/src/backends/darwin.ts | 38 ++++++++++--------- .../@ant/computer-use-input/tsconfig.json | 5 +++ packages/@ant/computer-use-mcp/tsconfig.json | 5 +++ .../computer-use-swift/src/backends/darwin.ts | 5 +++ .../computer-use-swift/src/backends/linux.ts | 5 +++ packages/@ant/computer-use-swift/src/types.ts | 1 + .../@ant/computer-use-swift/tsconfig.json | 5 +++ packages/@ant/ink/tsconfig.json | 5 +++ .../agent-tools/src/__tests__/compat.test.ts | 4 +- packages/agent-tools/tsconfig.json | 5 +++ packages/audio-capture-napi/tsconfig.json | 5 +++ packages/builtin-tools/tsconfig.json | 5 +++ .../src/__tests__/color-diff.test.ts | 12 +++--- packages/color-diff-napi/tsconfig.json | 5 +++ packages/image-processor-napi/tsconfig.json | 5 +++ .../src/__tests__/InProcessTransport.test.ts | 2 +- .../src/__tests__/discovery.test.ts | 6 +-- .../mcp-client/src/__tests__/manager.test.ts | 2 +- packages/mcp-client/tsconfig.json | 5 +++ packages/modifiers-napi/tsconfig.json | 5 +++ .../src/__tests__/disconnect-monitor.test.ts | 2 +- .../src/routes/v1/environments.ts | 4 +- .../src/routes/v1/environments.work.ts | 8 ++-- .../src/routes/v1/sessions.ts | 10 ++--- .../src/routes/v2/code-sessions.ts | 2 +- .../src/routes/v2/worker-events-stream.ts | 2 +- .../src/routes/v2/worker-events.ts | 4 +- .../src/routes/v2/worker.ts | 2 +- .../src/routes/web/control.ts | 2 +- .../src/routes/web/sessions.ts | 12 +++--- packages/remote-control-server/tsconfig.json | 14 +------ packages/url-handler-napi/tsconfig.json | 5 +++ tsconfig.base.json | 15 ++++++++ tsconfig.json | 14 +------ 39 files changed, 185 insertions(+), 90 deletions(-) create mode 100644 packages/@ant/claude-for-chrome-mcp/tsconfig.json create mode 100644 packages/@ant/computer-use-input/tsconfig.json create mode 100644 packages/@ant/computer-use-mcp/tsconfig.json create mode 100644 packages/@ant/computer-use-swift/tsconfig.json create mode 100644 packages/@ant/ink/tsconfig.json create mode 100644 packages/agent-tools/tsconfig.json create mode 100644 packages/audio-capture-napi/tsconfig.json create mode 100644 packages/builtin-tools/tsconfig.json create mode 100644 packages/color-diff-napi/tsconfig.json create mode 100644 packages/image-processor-napi/tsconfig.json create mode 100644 packages/mcp-client/tsconfig.json create mode 100644 packages/modifiers-napi/tsconfig.json create mode 100644 packages/url-handler-napi/tsconfig.json create mode 100644 tsconfig.base.json diff --git a/CLAUDE.md b/CLAUDE.md index d5511fd76..cda516cb7 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -55,6 +55,8 @@ bun run health # Check unused exports bun run check:unused +bun run typecheck + # Remote Control Server bun run rcs diff --git a/build.ts b/build.ts index dda2d666e..9d881fa81 100644 --- a/build.ts +++ b/build.ts @@ -88,8 +88,27 @@ for (const file of files) { } } +// Also patch unguarded globalThis.Bun destructuring from third-party deps +// (e.g. @anthropic-ai/sandbox-runtime) so Node.js doesn't crash at import time. +let bunPatched = 0 +const BUN_DESTRUCTURE = /var \{([^}]+)\} = globalThis\.Bun;?/g +const BUN_DESTRUCTURE_SAFE = 'var {$1} = typeof globalThis.Bun !== "undefined" ? globalThis.Bun : {};' +for (const file of files) { + if (!file.endsWith('.js')) continue + const filePath = join(outdir, file) + const content = await readFile(filePath, 'utf-8') + if (BUN_DESTRUCTURE.test(content)) { + await writeFile( + filePath, + content.replace(BUN_DESTRUCTURE, BUN_DESTRUCTURE_SAFE), + ) + bunPatched++ + } +} +BUN_DESTRUCTURE.lastIndex = 0 + console.log( - `Bundled ${result.outputs.length} files to ${outdir}/ (patched ${patched} for Node.js compat)`, + `Bundled ${result.outputs.length} files to ${outdir}/ (patched ${patched} for import.meta.require, ${bunPatched} for Bun destructure)`, ) // Step 4: Copy native .node addon files (audio-capture) diff --git a/bun.lock b/bun.lock index eaa1a6b9f..f6621ad24 100644 --- a/bun.lock +++ b/bun.lock @@ -58,10 +58,11 @@ "@sentry/node": "^10.47.0", "@smithy/core": "^3.23.13", "@smithy/node-http-handler": "^4.5.1", - "@types/bun": "^1.3.11", + "@types/bun": "^1.3.12", "@types/cacache": "^20.0.1", "@types/he": "^1.2.3", "@types/lodash-es": "^4.17.12", + "@types/node": "^25.6.0", "@types/picomatch": "^4.0.3", "@types/plist": "^3.0.5", "@types/proper-lockfile": "^4.1.4", diff --git a/package.json b/package.json index c25ae4e7d..51ebd40eb 100644 --- a/package.json +++ b/package.json @@ -60,6 +60,7 @@ "postinstall": "node scripts/postinstall.cjs && node scripts/setup-chrome-mcp.mjs", "docs:dev": "npx mintlify dev", "generate:skills": "bun run scripts/generate-skills.ts", + "typecheck": "tsc --noEmit", "rcs": "bun run scripts/rcs.ts" }, "dependencies": { @@ -68,10 +69,6 @@ "yaml": "^2.8.3" }, "devDependencies": { - "@types/he": "^1.2.3", - "@langfuse/otel": "^5.1.0", - "@langfuse/tracing": "^5.1.0", - "@types/lodash-es": "^4.17.12", "@alcalzone/ansi-tokenize": "^0.3.0", "@ant/claude-for-chrome-mcp": "workspace:*", "@ant/computer-use-input": "workspace:*", @@ -85,9 +82,6 @@ "@anthropic-ai/sdk": "^0.80.0", "@anthropic-ai/vertex-sdk": "^0.14.4", "@anthropic/ink": "workspace:*", - "@claude-code-best/builtin-tools": "workspace:*", - "@claude-code-best/agent-tools": "workspace:*", - "@claude-code-best/mcp-client": "workspace:*", "@aws-sdk/client-bedrock": "^3.1020.0", "@aws-sdk/client-bedrock-runtime": "^3.1020.0", "@aws-sdk/client-sts": "^3.1020.0", @@ -95,8 +89,13 @@ "@aws-sdk/credential-providers": "^3.1020.0", "@azure/identity": "^4.13.1", "@biomejs/biome": "^2.4.10", + "@claude-code-best/agent-tools": "workspace:*", + "@claude-code-best/builtin-tools": "workspace:*", + "@claude-code-best/mcp-client": "workspace:*", "@commander-js/extra-typings": "^14.0.0", "@growthbook/growthbook": "^1.6.5", + "@langfuse/otel": "^5.1.0", + "@langfuse/tracing": "^5.1.0", "@modelcontextprotocol/sdk": "^1.29.0", "@opentelemetry/api": "^1.9.1", "@opentelemetry/api-logs": "^0.214.0", @@ -119,8 +118,11 @@ "@sentry/node": "^10.47.0", "@smithy/core": "^3.23.13", "@smithy/node-http-handler": "^4.5.1", - "@types/bun": "^1.3.11", + "@types/bun": "^1.3.12", "@types/cacache": "^20.0.1", + "@types/he": "^1.2.3", + "@types/lodash-es": "^4.17.12", + "@types/node": "^25.6.0", "@types/picomatch": "^4.0.3", "@types/plist": "^3.0.5", "@types/proper-lockfile": "^4.1.4", diff --git a/packages/@ant/claude-for-chrome-mcp/tsconfig.json b/packages/@ant/claude-for-chrome-mcp/tsconfig.json new file mode 100644 index 000000000..67fc2cf86 --- /dev/null +++ b/packages/@ant/claude-for-chrome-mcp/tsconfig.json @@ -0,0 +1,5 @@ +{ + "extends": "../../../tsconfig.base.json", + "include": ["src/**/*.ts"], + "exclude": ["node_modules", "dist"] +} diff --git a/packages/@ant/computer-use-input/src/backends/darwin.ts b/packages/@ant/computer-use-input/src/backends/darwin.ts index 4f9569d2d..37af38cff 100644 --- a/packages/@ant/computer-use-input/src/backends/darwin.ts +++ b/packages/@ant/computer-use-input/src/backends/darwin.ts @@ -5,9 +5,12 @@ * mouse and keyboard via CoreGraphics events and System Events. */ -import { $ } from 'bun' +import { execFile, execFileSync } from 'child_process' +import { promisify } from 'util' import type { FrontmostAppInfo, InputBackend } from '../types.js' +const execFileAsync = promisify(execFile) + const KEY_MAP: Record = { return: 36, enter: 36, tab: 48, space: 49, delete: 51, backspace: 51, escape: 53, esc: 53, @@ -25,13 +28,17 @@ const MODIFIER_MAP: Record = { } async function osascript(script: string): Promise { - const result = await $`osascript -e ${script}`.quiet().nothrow().text() - return result.trim() + const { stdout } = await execFileAsync('osascript', ['-e', script], { + encoding: 'utf-8', + }) + return stdout.trim() } async function jxa(script: string): Promise { - const result = await $`osascript -l JavaScript -e ${script}`.quiet().nothrow().text() - return result.trim() + const { stdout } = await execFileAsync('osascript', ['-l', 'JavaScript', '-e', script], { + encoding: 'utf-8', + }) + return stdout.trim() } function buildMouseJxa(eventType: string, x: number, y: number, btn: number, clickState?: number): string { @@ -115,19 +122,14 @@ export const typeText: InputBackend['typeText'] = async (text) => { export const getFrontmostAppInfo: InputBackend['getFrontmostAppInfo'] = () => { try { - const result = Bun.spawnSync({ - cmd: ['osascript', '-e', ` - tell application "System Events" - set frontApp to first application process whose frontmost is true - set appName to name of frontApp - set bundleId to bundle identifier of frontApp - return bundleId & "|" & appName - end tell - `], - stdout: 'pipe', - stderr: 'pipe', - }) - const output = new TextDecoder().decode(result.stdout).trim() + const output = execFileSync('osascript', ['-e', ` + tell application "System Events" + set frontApp to first application process whose frontmost is true + set appName to name of frontApp + set bundleId to bundle identifier of frontApp + return bundleId & "|" & appName + end tell + `], { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'ignore'] }).trim() if (!output || !output.includes('|')) return null const [bundleId, appName] = output.split('|', 2) return { bundleId: bundleId!, appName: appName! } diff --git a/packages/@ant/computer-use-input/tsconfig.json b/packages/@ant/computer-use-input/tsconfig.json new file mode 100644 index 000000000..67fc2cf86 --- /dev/null +++ b/packages/@ant/computer-use-input/tsconfig.json @@ -0,0 +1,5 @@ +{ + "extends": "../../../tsconfig.base.json", + "include": ["src/**/*.ts"], + "exclude": ["node_modules", "dist"] +} diff --git a/packages/@ant/computer-use-mcp/tsconfig.json b/packages/@ant/computer-use-mcp/tsconfig.json new file mode 100644 index 000000000..67fc2cf86 --- /dev/null +++ b/packages/@ant/computer-use-mcp/tsconfig.json @@ -0,0 +1,5 @@ +{ + "extends": "../../../tsconfig.base.json", + "include": ["src/**/*.ts"], + "exclude": ["node_modules", "dist"] +} diff --git a/packages/@ant/computer-use-swift/src/backends/darwin.ts b/packages/@ant/computer-use-swift/src/backends/darwin.ts index 4bf6d5fa9..f0fad85af 100644 --- a/packages/@ant/computer-use-swift/src/backends/darwin.ts +++ b/packages/@ant/computer-use-swift/src/backends/darwin.ts @@ -274,4 +274,9 @@ export const screenshot: ScreenshotAPI = { if (displayId !== undefined) args.push('-D', String(displayId)) return captureScreenToBase64(args) }, + + captureWindowTarget(_titleOrHwnd: string | number): ScreenshotResult | null { + // Window capture not supported on macOS via this backend + return null + }, } diff --git a/packages/@ant/computer-use-swift/src/backends/linux.ts b/packages/@ant/computer-use-swift/src/backends/linux.ts index 692575433..da63efea9 100644 --- a/packages/@ant/computer-use-swift/src/backends/linux.ts +++ b/packages/@ant/computer-use-swift/src/backends/linux.ts @@ -275,4 +275,9 @@ export const screenshot: ScreenshotAPI = { return { base64: '', width: 0, height: 0 } } }, + + captureWindowTarget(_titleOrHwnd: string | number): ScreenshotResult | null { + // Window capture not supported on Linux via this backend + return null + }, } diff --git a/packages/@ant/computer-use-swift/src/types.ts b/packages/@ant/computer-use-swift/src/types.ts index 767a0fcde..67b3cba11 100644 --- a/packages/@ant/computer-use-swift/src/types.ts +++ b/packages/@ant/computer-use-swift/src/types.ts @@ -76,6 +76,7 @@ export interface ScreenshotAPI { x: number, y: number, w: number, h: number, outW: number, outH: number, quality: number, displayId?: number, ): Promise + captureWindowTarget(titleOrHwnd: string | number): ScreenshotResult | null } export interface SwiftBackend { diff --git a/packages/@ant/computer-use-swift/tsconfig.json b/packages/@ant/computer-use-swift/tsconfig.json new file mode 100644 index 000000000..5621e5882 --- /dev/null +++ b/packages/@ant/computer-use-swift/tsconfig.json @@ -0,0 +1,5 @@ +{ + "extends": "../../../tsconfig.json", + "include": ["src/**/*.ts"], + "exclude": ["node_modules", "dist"] +} diff --git a/packages/@ant/ink/tsconfig.json b/packages/@ant/ink/tsconfig.json new file mode 100644 index 000000000..f95464d03 --- /dev/null +++ b/packages/@ant/ink/tsconfig.json @@ -0,0 +1,5 @@ +{ + "extends": "../../../tsconfig.base.json", + "include": ["src/**/*.ts", "src/**/*.tsx"], + "exclude": ["node_modules", "dist"] +} diff --git a/packages/agent-tools/src/__tests__/compat.test.ts b/packages/agent-tools/src/__tests__/compat.test.ts index 4ffd4a6e7..752043f0f 100644 --- a/packages/agent-tools/src/__tests__/compat.test.ts +++ b/packages/agent-tools/src/__tests__/compat.test.ts @@ -1,6 +1,6 @@ import { describe, expect, test } from 'bun:test' import type { CoreTool, Tool, Tools, AnyObject, ToolResult, ValidationResult, PermissionResult } from '@claude-code-best/agent-tools' -import type { Tool as HostTool } from '../../src/Tool.js' +import type { Tool as HostTool } from '../../../../src/Tool.js' describe('agent-tools compatibility', () => { test('CoreTool structural compatibility with host Tool', () => { @@ -27,7 +27,7 @@ describe('agent-tools compatibility', () => { } // This assignment should work if HostTool structurally extends CoreTool - const coreTool: CoreTool = mockHostTool as CoreTool + const coreTool: CoreTool = mockHostTool as unknown as CoreTool expect(coreTool.name).toBe('test') expect(coreTool.isEnabled()).toBe(true) }) diff --git a/packages/agent-tools/tsconfig.json b/packages/agent-tools/tsconfig.json new file mode 100644 index 000000000..af2850cc4 --- /dev/null +++ b/packages/agent-tools/tsconfig.json @@ -0,0 +1,5 @@ +{ + "extends": "../../tsconfig.base.json", + "include": ["src/**/*.ts"], + "exclude": ["node_modules", "dist"] +} diff --git a/packages/audio-capture-napi/tsconfig.json b/packages/audio-capture-napi/tsconfig.json new file mode 100644 index 000000000..af2850cc4 --- /dev/null +++ b/packages/audio-capture-napi/tsconfig.json @@ -0,0 +1,5 @@ +{ + "extends": "../../tsconfig.base.json", + "include": ["src/**/*.ts"], + "exclude": ["node_modules", "dist"] +} diff --git a/packages/builtin-tools/tsconfig.json b/packages/builtin-tools/tsconfig.json new file mode 100644 index 000000000..0908dc332 --- /dev/null +++ b/packages/builtin-tools/tsconfig.json @@ -0,0 +1,5 @@ +{ + "extends": "../../tsconfig.json", + "include": ["src/**/*.ts", "src/**/*.tsx"], + "exclude": ["node_modules", "dist"] +} diff --git a/packages/color-diff-napi/src/__tests__/color-diff.test.ts b/packages/color-diff-napi/src/__tests__/color-diff.test.ts index 0e38a3c25..2c95cc8b4 100644 --- a/packages/color-diff-napi/src/__tests__/color-diff.test.ts +++ b/packages/color-diff-napi/src/__tests__/color-diff.test.ts @@ -72,18 +72,18 @@ describe("detectColorMode", () => { describe("detectLanguage", () => { test("detects language from file extension", () => { - expect(detectLanguage("index.ts")).toBe("ts"); - expect(detectLanguage("main.py")).toBe("py"); - expect(detectLanguage("style.css")).toBe("css"); + expect(detectLanguage("index.ts", null)).toBe("ts"); + expect(detectLanguage("main.py", null)).toBe("py"); + expect(detectLanguage("style.css", null)).toBe("css"); }); test("detects language from known filenames", () => { - expect(detectLanguage("Makefile")).toBe("makefile"); - expect(detectLanguage("Dockerfile")).toBe("dockerfile"); + expect(detectLanguage("Makefile", null)).toBe("makefile"); + expect(detectLanguage("Dockerfile", null)).toBe("dockerfile"); }); test("returns null for unknown extensions", () => { - expect(detectLanguage("file.xyz123")).toBeNull(); + expect(detectLanguage("file.xyz123", null)).toBeNull(); }); }); diff --git a/packages/color-diff-napi/tsconfig.json b/packages/color-diff-napi/tsconfig.json new file mode 100644 index 000000000..af2850cc4 --- /dev/null +++ b/packages/color-diff-napi/tsconfig.json @@ -0,0 +1,5 @@ +{ + "extends": "../../tsconfig.base.json", + "include": ["src/**/*.ts"], + "exclude": ["node_modules", "dist"] +} diff --git a/packages/image-processor-napi/tsconfig.json b/packages/image-processor-napi/tsconfig.json new file mode 100644 index 000000000..af2850cc4 --- /dev/null +++ b/packages/image-processor-napi/tsconfig.json @@ -0,0 +1,5 @@ +{ + "extends": "../../tsconfig.base.json", + "include": ["src/**/*.ts"], + "exclude": ["node_modules", "dist"] +} diff --git a/packages/mcp-client/src/__tests__/InProcessTransport.test.ts b/packages/mcp-client/src/__tests__/InProcessTransport.test.ts index f9ee89a4e..37c986d67 100644 --- a/packages/mcp-client/src/__tests__/InProcessTransport.test.ts +++ b/packages/mcp-client/src/__tests__/InProcessTransport.test.ts @@ -38,7 +38,7 @@ describe('InProcessTransport', () => { let received: JSONRPCMessage | null = null client.onmessage = (msg) => { received = msg } - await server.send({ jsonrpc: '2.0', result: 42, id: 1 }) + await server.send({ jsonrpc: '2.0', result: 42, id: 1 } as any) await new Promise(resolve => setTimeout(resolve, 10)) diff --git a/packages/mcp-client/src/__tests__/discovery.test.ts b/packages/mcp-client/src/__tests__/discovery.test.ts index a43d3472f..642623e81 100644 --- a/packages/mcp-client/src/__tests__/discovery.test.ts +++ b/packages/mcp-client/src/__tests__/discovery.test.ts @@ -57,9 +57,9 @@ describe('discoverTools', () => { expect(tool.name).toBe('mcp__my-server__search') expect(tool.mcpInfo).toEqual({ serverName: 'my-server', toolName: 'search' }) expect(tool.isMcp).toBe(true) - expect(tool.isReadOnly()).toBe(true) - expect(tool.userFacingName()).toBe('Search Items') - expect(await tool.description()).toBe('Search for items') + expect(tool.isReadOnly({} as any)).toBe(true) + expect(tool.userFacingName(undefined)).toBe('Search Items') + expect(await tool.description({} as any, { isNonInteractiveSession: false, toolPermissionContext: {}, tools: [] })).toBe('Search for items') }) test('respects skipPrefix option', async () => { diff --git a/packages/mcp-client/src/__tests__/manager.test.ts b/packages/mcp-client/src/__tests__/manager.test.ts index f067ffa2e..f929cb922 100644 --- a/packages/mcp-client/src/__tests__/manager.test.ts +++ b/packages/mcp-client/src/__tests__/manager.test.ts @@ -65,7 +65,7 @@ describe('createMcpManager', () => { const result = await manager.connect('test-server', { command: 'npx', args: [] }) expect(result.type).toBe('connected') - expect(connectedEvent).toBe('test-server') + expect(connectedEvent as unknown as string).toBe('test-server') }) test('disconnect calls cleanup and emits disconnected', async () => { diff --git a/packages/mcp-client/tsconfig.json b/packages/mcp-client/tsconfig.json new file mode 100644 index 000000000..af2850cc4 --- /dev/null +++ b/packages/mcp-client/tsconfig.json @@ -0,0 +1,5 @@ +{ + "extends": "../../tsconfig.base.json", + "include": ["src/**/*.ts"], + "exclude": ["node_modules", "dist"] +} diff --git a/packages/modifiers-napi/tsconfig.json b/packages/modifiers-napi/tsconfig.json new file mode 100644 index 000000000..af2850cc4 --- /dev/null +++ b/packages/modifiers-napi/tsconfig.json @@ -0,0 +1,5 @@ +{ + "extends": "../../tsconfig.base.json", + "include": ["src/**/*.ts"], + "exclude": ["node_modules", "dist"] +} diff --git a/packages/remote-control-server/src/__tests__/disconnect-monitor.test.ts b/packages/remote-control-server/src/__tests__/disconnect-monitor.test.ts index 23db3c0f6..de50e6f2d 100644 --- a/packages/remote-control-server/src/__tests__/disconnect-monitor.test.ts +++ b/packages/remote-control-server/src/__tests__/disconnect-monitor.test.ts @@ -75,7 +75,7 @@ describe("Disconnect Monitor Logic", () => { }); test("session becomes inactive when updatedAt is too old", () => { - const session = storeCreateSession({ status: "idle" }); + const session = storeCreateSession({}); storeUpdateSession(session.id, { status: "running" }); const timeoutMs = 300 * 1000 * 2; // 2x disconnect timeout diff --git a/packages/remote-control-server/src/routes/v1/environments.ts b/packages/remote-control-server/src/routes/v1/environments.ts index 692dc71b9..c812906ee 100644 --- a/packages/remote-control-server/src/routes/v1/environments.ts +++ b/packages/remote-control-server/src/routes/v1/environments.ts @@ -14,14 +14,14 @@ app.post("/bridge", acceptCliHeaders, apiKeyAuth, async (c) => { /** DELETE /v1/environments/bridge/:id — Deregister */ app.delete("/bridge/:id", acceptCliHeaders, apiKeyAuth, async (c) => { - const envId = c.req.param("id"); + const envId = c.req.param("id")!; deregisterEnvironment(envId); return c.json({ status: "ok" }, 200); }); /** POST /v1/environments/:id/bridge/reconnect — Reconnect */ app.post("/:id/bridge/reconnect", acceptCliHeaders, apiKeyAuth, async (c) => { - const envId = c.req.param("id"); + const envId = c.req.param("id")!; reconnectEnvironment(envId); const { reconnectWorkForEnvironment } = await import("../../services/work-dispatch"); await reconnectWorkForEnvironment(envId); diff --git a/packages/remote-control-server/src/routes/v1/environments.work.ts b/packages/remote-control-server/src/routes/v1/environments.work.ts index b5342eaff..7f024263a 100644 --- a/packages/remote-control-server/src/routes/v1/environments.work.ts +++ b/packages/remote-control-server/src/routes/v1/environments.work.ts @@ -7,7 +7,7 @@ const app = new Hono(); /** GET /v1/environments/:id/work/poll — Long-poll for work */ app.get("/:id/work/poll", acceptCliHeaders, apiKeyAuth, async (c) => { - const envId = c.req.param("id"); + const envId = c.req.param("id")!; updatePollTime(envId); const result = await pollWork(envId); if (!result) { @@ -19,21 +19,21 @@ app.get("/:id/work/poll", acceptCliHeaders, apiKeyAuth, async (c) => { /** POST /v1/environments/:id/work/:workId/ack — Acknowledge work */ app.post("/:id/work/:workId/ack", acceptCliHeaders, apiKeyAuth, async (c) => { - const workId = c.req.param("workId"); + const workId = c.req.param("workId")!; ackWork(workId); return c.json({ status: "ok" }, 200); }); /** POST /v1/environments/:id/work/:workId/stop — Stop work */ app.post("/:id/work/:workId/stop", acceptCliHeaders, apiKeyAuth, async (c) => { - const workId = c.req.param("workId"); + const workId = c.req.param("workId")!; stopWork(workId); return c.json({ status: "ok" }, 200); }); /** POST /v1/environments/:id/work/:workId/heartbeat — Heartbeat */ app.post("/:id/work/:workId/heartbeat", acceptCliHeaders, apiKeyAuth, async (c) => { - const workId = c.req.param("workId"); + const workId = c.req.param("workId")!; const result = heartbeatWork(workId); return c.json(result, 200); }); diff --git a/packages/remote-control-server/src/routes/v1/sessions.ts b/packages/remote-control-server/src/routes/v1/sessions.ts index 3dc950953..386602e6e 100644 --- a/packages/remote-control-server/src/routes/v1/sessions.ts +++ b/packages/remote-control-server/src/routes/v1/sessions.ts @@ -38,7 +38,7 @@ app.post("/", acceptCliHeaders, apiKeyAuth, async (c) => { /** GET /v1/sessions/:id — Get session */ app.get("/:id", acceptCliHeaders, apiKeyAuth, async (c) => { - const session = getSession(c.req.param("id")); + const session = getSession(c.req.param("id")!); if (!session) { return c.json({ error: { type: "not_found", message: "Session not found" } }, 404); } @@ -49,16 +49,16 @@ app.get("/:id", acceptCliHeaders, apiKeyAuth, async (c) => { app.patch("/:id", acceptCliHeaders, apiKeyAuth, async (c) => { const body = await c.req.json(); if (body.title) { - updateSessionTitle(c.req.param("id"), body.title); + updateSessionTitle(c.req.param("id")!, body.title); } - const session = getSession(c.req.param("id")); + const session = getSession(c.req.param("id")!); return c.json(session, 200); }); /** POST /v1/sessions/:id/archive — Archive session */ app.post("/:id/archive", acceptCliHeaders, apiKeyAuth, async (c) => { try { - archiveSession(c.req.param("id")); + archiveSession(c.req.param("id")!); } catch { return c.json({ status: "ok" }, 409); } @@ -67,7 +67,7 @@ app.post("/:id/archive", acceptCliHeaders, apiKeyAuth, async (c) => { /** POST /v1/sessions/:id/events — Send event to session */ app.post("/:id/events", acceptCliHeaders, apiKeyAuth, async (c) => { - const sessionId = c.req.param("id"); + const sessionId = c.req.param("id")!; const body = await c.req.json(); const events = body.events diff --git a/packages/remote-control-server/src/routes/v2/code-sessions.ts b/packages/remote-control-server/src/routes/v2/code-sessions.ts index e339e264f..00cb4b1cb 100644 --- a/packages/remote-control-server/src/routes/v2/code-sessions.ts +++ b/packages/remote-control-server/src/routes/v2/code-sessions.ts @@ -15,7 +15,7 @@ app.post("/", acceptCliHeaders, apiKeyAuth, async (c) => { /** POST /v1/code/sessions/:id/bridge — Get connection info + worker JWT */ app.post("/:id/bridge", acceptCliHeaders, apiKeyAuth, async (c) => { - const sessionId = c.req.param("id"); + const sessionId = c.req.param("id")!; const session = getSession(sessionId); if (!session) { return c.json({ error: { type: "not_found", message: "Session not found" } }, 404); diff --git a/packages/remote-control-server/src/routes/v2/worker-events-stream.ts b/packages/remote-control-server/src/routes/v2/worker-events-stream.ts index a177decbb..883e3073e 100644 --- a/packages/remote-control-server/src/routes/v2/worker-events-stream.ts +++ b/packages/remote-control-server/src/routes/v2/worker-events-stream.ts @@ -7,7 +7,7 @@ const app = new Hono(); /** SSE /v1/code/sessions/:id/worker/events/stream — SSE event stream */ app.get("/:id/worker/events/stream", acceptCliHeaders, sessionIngressAuth, async (c) => { - const sessionId = c.req.param("id"); + const sessionId = c.req.param("id")!; const session = getSession(sessionId); if (!session) { return c.json({ error: { type: "not_found", message: "Session not found" } }, 404); diff --git a/packages/remote-control-server/src/routes/v2/worker-events.ts b/packages/remote-control-server/src/routes/v2/worker-events.ts index d09fed5c3..3a36c74e6 100644 --- a/packages/remote-control-server/src/routes/v2/worker-events.ts +++ b/packages/remote-control-server/src/routes/v2/worker-events.ts @@ -7,7 +7,7 @@ const app = new Hono(); /** POST /v1/code/sessions/:id/worker/events — Write events */ app.post("/:id/worker/events", acceptCliHeaders, sessionIngressAuth, async (c) => { - const sessionId = c.req.param("id"); + const sessionId = c.req.param("id")!; const body = await c.req.json(); const events = Array.isArray(body) ? body : [body]; @@ -22,7 +22,7 @@ app.post("/:id/worker/events", acceptCliHeaders, sessionIngressAuth, async (c) = /** PUT /v1/code/sessions/:id/worker/state — Report worker state */ app.put("/:id/worker/state", acceptCliHeaders, sessionIngressAuth, async (c) => { - const sessionId = c.req.param("id"); + const sessionId = c.req.param("id")!; const body = await c.req.json(); if (body.status) { diff --git a/packages/remote-control-server/src/routes/v2/worker.ts b/packages/remote-control-server/src/routes/v2/worker.ts index 2ca067508..c65a21c3e 100644 --- a/packages/remote-control-server/src/routes/v2/worker.ts +++ b/packages/remote-control-server/src/routes/v2/worker.ts @@ -6,7 +6,7 @@ const app = new Hono(); /** POST /v1/code/sessions/:id/worker/register — Register worker */ app.post("/:id/worker/register", acceptCliHeaders, apiKeyAuth, async (c) => { - const sessionId = c.req.param("id"); + const sessionId = c.req.param("id")!; const session = getSession(sessionId); if (!session) { return c.json({ error: { type: "not_found", message: "Session not found" } }, 404); diff --git a/packages/remote-control-server/src/routes/web/control.ts b/packages/remote-control-server/src/routes/web/control.ts index e146bdb5f..e4ed09a8a 100644 --- a/packages/remote-control-server/src/routes/web/control.ts +++ b/packages/remote-control-server/src/routes/web/control.ts @@ -8,7 +8,7 @@ import { storeIsSessionOwner } from "../../store"; const app = new Hono(); function checkOwnership(c: { get: (key: string) => string | undefined }, sessionId: string) { - const uuid = c.get("uuid"); + const uuid = c.get("uuid")!; if (!storeIsSessionOwner(sessionId, uuid)) { return { error: true, session: null }; } diff --git a/packages/remote-control-server/src/routes/web/sessions.ts b/packages/remote-control-server/src/routes/web/sessions.ts index 94165a84d..58de27396 100644 --- a/packages/remote-control-server/src/routes/web/sessions.ts +++ b/packages/remote-control-server/src/routes/web/sessions.ts @@ -11,7 +11,7 @@ const app = new Hono(); /** POST /web/sessions — Create a session from web UI */ app.post("/sessions", uuidAuth, async (c) => { - const uuid = c.get("uuid"); + const uuid = c.get("uuid")!; const body = await c.req.json(); const session = createSession({ environment_id: body.environment_id || null, @@ -37,21 +37,21 @@ app.post("/sessions", uuidAuth, async (c) => { /** GET /web/sessions — List sessions owned by the requesting UUID */ app.get("/sessions", uuidAuth, async (c) => { - const uuid = c.get("uuid"); + const uuid = c.get("uuid")!; const sessions = storeListSessionsByOwnerUuid(uuid); return c.json(sessions, 200); }); /** GET /web/sessions/all — List sessions owned by the requesting UUID (unowned sessions excluded) */ app.get("/sessions/all", uuidAuth, async (c) => { - const uuid = c.get("uuid"); + const uuid = c.get("uuid")!; const sessions = listSessionSummariesByOwnerUuid(uuid); return c.json(sessions, 200); }); /** GET /web/sessions/:id — Session detail */ app.get("/sessions/:id", uuidAuth, async (c) => { - const uuid = c.get("uuid"); + const uuid = c.get("uuid")!; const sessionId = c.req.param("id")!; if (!storeIsSessionOwner(sessionId, uuid)) { return c.json({ error: { type: "forbidden", message: "Not your session" } }, 403); @@ -65,7 +65,7 @@ app.get("/sessions/:id", uuidAuth, async (c) => { /** GET /web/sessions/:id/history — Historical events for session */ app.get("/sessions/:id/history", uuidAuth, async (c) => { - const uuid = c.get("uuid"); + const uuid = c.get("uuid")!; const sessionId = c.req.param("id")!; if (!storeIsSessionOwner(sessionId, uuid)) { return c.json({ error: { type: "forbidden", message: "Not your session" } }, 403); @@ -82,7 +82,7 @@ app.get("/sessions/:id/history", uuidAuth, async (c) => { /** SSE /web/sessions/:id/events — Real-time event stream */ app.get("/sessions/:id/events", uuidAuth, async (c) => { - const uuid = c.get("uuid"); + const uuid = c.get("uuid")!; const sessionId = c.req.param("id")!; if (!storeIsSessionOwner(sessionId, uuid)) { return c.json({ error: { type: "forbidden", message: "Not your session" } }, 403); diff --git a/packages/remote-control-server/tsconfig.json b/packages/remote-control-server/tsconfig.json index 090f31d9f..74f468f60 100644 --- a/packages/remote-control-server/tsconfig.json +++ b/packages/remote-control-server/tsconfig.json @@ -1,17 +1,5 @@ { - "compilerOptions": { - "target": "ES2022", - "module": "ESNext", - "moduleResolution": "bundler", - "esModuleInterop": true, - "strict": true, - "skipLibCheck": true, - "outDir": "dist", - "rootDir": ".", - "declaration": true, - "resolveJsonModule": true, - "types": ["bun-types"] - }, + "extends": "../../tsconfig.base.json", "include": ["src/**/*.ts"], "exclude": ["node_modules", "dist", "web"] } diff --git a/packages/url-handler-napi/tsconfig.json b/packages/url-handler-napi/tsconfig.json new file mode 100644 index 000000000..af2850cc4 --- /dev/null +++ b/packages/url-handler-napi/tsconfig.json @@ -0,0 +1,5 @@ +{ + "extends": "../../tsconfig.base.json", + "include": ["src/**/*.ts"], + "exclude": ["node_modules", "dist"] +} diff --git a/tsconfig.base.json b/tsconfig.base.json new file mode 100644 index 000000000..db4bc1e3c --- /dev/null +++ b/tsconfig.base.json @@ -0,0 +1,15 @@ +{ + "compilerOptions": { + "target": "ESNext", + "module": "ESNext", + "moduleResolution": "bundler", + "strict": true, + "skipLibCheck": true, + "noEmit": true, + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "resolveJsonModule": true, + "jsx": "react-jsx", + "types": ["bun", "@types/node"] + } +} diff --git a/tsconfig.json b/tsconfig.json index 65f7e4c81..3ff0ed276 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,22 +1,12 @@ { + "extends": "./tsconfig.base.json", "compilerOptions": { - "target": "ESNext", - "module": "ESNext", - "moduleResolution": "bundler", - "jsx": "react-jsx", - "strict": true, - "skipLibCheck": true, - "noEmit": true, - "esModuleInterop": true, - "allowSyntheticDefaultImports": true, - "resolveJsonModule": true, - "types": ["bun"], "paths": { "src/*": ["./src/*"], "@claude-code-best/builtin-tools/*": ["./packages/builtin-tools/src/*"], "@claude-code-best/builtin-tools": ["./packages/builtin-tools/src/index.ts"] } }, - "include": ["src/**/*.ts", "src/**/*.tsx", "packages/builtin-tools/src/**/*.ts", "packages/builtin-tools/src/**/*.tsx"], + "include": ["src/**/*.ts", "src/**/*.tsx", "packages/**/*.ts", "packages/**/*.tsx"], "exclude": ["node_modules"] }