{"_id":"@caoruhua/open-claude-remote","_rev":"21-2d8fffacb10dfd9a34af047266ed2749","name":"@caoruhua/open-claude-remote","dist-tags":{"latest":"1.4.0"},"versions":{"0.1.0":{"name":"@caoruhua/open-claude-remote","version":"0.1.0","keywords":["claude","claude-code","remote","terminal","proxy","mobile"],"author":{"name":"caoruhua"},"license":"MIT","_id":"@caoruhua/open-claude-remote@0.1.0","maintainers":[{"name":"caoruhua","email":"tangzh.tom@gmail.com"}],"homepage":"https://github.com/StephenTowne/open-claude-remote#readme","bugs":{"url":"https://github.com/StephenTowne/open-claude-remote/issues"},"os":["darwin","linux"],"bin":{"claude-remote":"dist/cli.js"},"dist":{"shasum":"f3c99c6afbb818dc563786524a4305d639ba0d83","tarball":"https://registry.npmjs.org/@caoruhua/open-claude-remote/-/open-claude-remote-0.1.0.tgz","fileCount":187,"integrity":"sha512-tz0zuSR3+fhwYeXbe0Y7pC4omPodG0x6ojdG6XoKvx0iOkD0zbvLkJtOOPhYtw4hSMpkLGtO9EcdnCU4JEnzig==","signatures":[{"sig":"MEUCIDG/J6SJZAJ8O+ZKZ1eul/wL+CW/nR1VoKz0i19oc8vBAiEAxw+nlDTI2ex56E8UN3ha5Jd5wj0lPa2gYq4Vk99Kla8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1096323},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=20.0.0"},"gitHead":"ead9d39098817f61e691aa73b1eada8d156da481","scripts":{"dev":"tsx src/index.ts","test":"vitest run","build":"tsc","start":"node dist/index.js","test:watch":"vitest","build:publish":"node scripts/build-for-publish.js"},"_npmUser":{"name":"caoruhua","email":"tangzh.tom@gmail.com"},"repository":{"url":"git+https://github.com/StephenTowne/open-claude-remote.git","type":"git"},"_npmVersion":"11.6.2","description":"Remote control proxy for Claude Code CLI - control your PC terminal from mobile browser","directories":{},"_nodeVersion":"24.13.0","dependencies":{"ws":"^8.18.0","cors":"^2.8.5","pino":"^9.6.0","cookie":"^1.0.0","express":"^4.21.0","node-pty":"^1.0.0","web-push":"^3.6.7","qrcode-terminal":"^0.12.0","@claude-remote/shared":"workspace:*"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","vitest":"^3.0.0","@types/ws":"^8.5.0","typescript":"^5.7.0","@types/cors":"^2.8.17","@types/node":"^22.0.0","pino-pretty":"^13.0.0","@types/cookie":"^0.6.0","@types/express":"^5.0.0","@types/web-push":"^3.6.4","@types/qrcode-terminal":"^0.12.2"},"peerDependencies":{"@anthropic-ai/claude-code":">=0.0.1"},"peerDependenciesMeta":{"@anthropic-ai/claude-code":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/open-claude-remote_0.1.0_1772544803285_0.35994785595967915","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@caoruhua/open-claude-remote","version":"0.1.3","keywords":["claude","claude-code","remote","terminal","proxy","mobile"],"author":{"name":"caoruhua"},"license":"MIT","_id":"@caoruhua/open-claude-remote@0.1.3","maintainers":[{"name":"caoruhua","email":"tangzh.tom@gmail.com"}],"homepage":"https://github.com/StephenTowne/open-claude-remote#readme","bugs":{"url":"https://github.com/StephenTowne/open-claude-remote/issues"},"os":["darwin","linux"],"bin":{"claude-remote":"dist/backend/src/cli.js"},"dist":{"shasum":"93bec4ca87970ff76d91b1d5eb59159ae4e58628","tarball":"https://registry.npmjs.org/@caoruhua/open-claude-remote/-/open-claude-remote-0.1.3.tgz","fileCount":228,"integrity":"sha512-0gnt8LwyPOW7ra07VImqGz6KDj5I1Z1+HIIOyfSyEp8RxF5MQeQneaysWoVC/7f/CslM25RlebmoDEUb7PlANg==","signatures":[{"sig":"MEUCIQDSjtPlqZJZ+b3RJDfLzx9MD7j8H66vBtTUCD1sbdbCjAIgHypJ2S9G658990vPsk1nHpiKFvNAY3SlYRda4AGGIBc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1264464},"main":"./dist/backend/src/index.js","pnpm":{"onlyBuiltDependencies":["esbuild","node-pty"]},"type":"module","types":"./dist/backend/src/index.d.ts","engines":{"node":">=20.0.0"},"gitHead":"d4d5eeb3bc5f36eae5a24060af3c1eeaf9e43d6c","imports":{"#shared":"./shared/index.ts"},"scripts":{"dev":"concurrently --kill-others --handle-input -n backend,frontend -c blue,green \"tsx backend/src/index.ts\" \"cd frontend && vite\"","stop":"tsx backend/src/registry/stop-instances.ts","test":"vitest run","build":"tsc && tsc-alias && cd frontend && vite build","clean":"rm -rf dist frontend-dist","start":"node dist/backend/src/index.js","dev:cli":"tsx backend/src/cli.ts","test:unit":"vitest run --project backend backend/tests/unit --project frontend","test:watch":"vitest","postinstall":"node scripts/fix-node-pty-permissions.js","test:backend":"vitest run --project backend","test:frontend":"vitest run --project frontend","prepublishOnly":"pnpm build","test:integration":"vitest run --project backend backend/tests/integration"},"_npmUser":{"name":"caoruhua","email":"tangzh.tom@gmail.com"},"repository":{"url":"git+https://github.com/StephenTowne/open-claude-remote.git","type":"git"},"_npmVersion":"11.6.2","description":"Remote control proxy for Claude Code CLI - control your PC terminal from mobile browser","directories":{},"_nodeVersion":"24.13.0","dependencies":{"ws":"^8.19.0","cors":"^2.8.6","pino":"^9.14.0","cookie":"^1.1.1","express":"^4.22.1","node-pty":"^1.1.0","web-push":"^3.6.7","qrcode-terminal":"^0.12.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","vite":"^6.4.1","jsdom":"^26.1.0","react":"^19.2.4","vitest":"^3.2.4","zustand":"^5.0.11","@types/ws":"^8.18.1","happy-dom":"^20.8.3","react-dom":"^19.2.4","tsc-alias":"^1.8.16","typescript":"^5.9.3","@types/cors":"^2.8.19","@types/node":"^22.19.13","pino-pretty":"^13.1.3","@types/react":"^19.2.14","@xterm/xterm":"^5.5.0","concurrently":"^9.2.1","@dnd-kit/core":"^6.3.1","@types/cookie":"^0.6.0","@types/express":"^5.0.6","@types/web-push":"^3.6.4","@types/react-dom":"^19.2.3","@xterm/addon-fit":"^0.10.0","@dnd-kit/sortable":"^8.0.0","@dnd-kit/utilities":"^3.2.2","@xterm/addon-webgl":"^0.18.0","@vitejs/plugin-react":"^4.7.0","@testing-library/react":"^16.3.2","@types/qrcode-terminal":"^0.12.2","@xterm/addon-unicode11":"^0.8.0"},"peerDependencies":{"@anthropic-ai/claude-code":">=0.0.1"},"peerDependenciesMeta":{"@anthropic-ai/claude-code":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/open-claude-remote_0.1.3_1772722219676_0.025460702779131816","host":"s3://npm-registry-packages-npm-production"}},"0.1.4":{"name":"@caoruhua/open-claude-remote","version":"0.1.4","keywords":["claude","claude-code","remote","terminal","proxy","mobile"],"author":{"name":"caoruhua"},"license":"MIT","_id":"@caoruhua/open-claude-remote@0.1.4","maintainers":[{"name":"caoruhua","email":"tangzh.tom@gmail.com"}],"homepage":"https://github.com/StephenTowne/open-claude-remote#readme","bugs":{"url":"https://github.com/StephenTowne/open-claude-remote/issues"},"os":["darwin","linux"],"bin":{"claude-remote":"dist/backend/src/cli.js"},"dist":{"shasum":"0bce725f17cdf45c384aa962ed139e54023882f5","tarball":"https://registry.npmjs.org/@caoruhua/open-claude-remote/-/open-claude-remote-0.1.4.tgz","fileCount":232,"integrity":"sha512-sBIOgurnCbG/eZsUoJ/pSx2MgFMo+RNWv/MkPKW85vP7563nrIa5wv5YicVoOeMwm5WH2VXA3cwFJOL0AZtIeQ==","signatures":[{"sig":"MEUCIQCzidhuUr87Z4qDnkdzztHuqh1KhehW9fygmrDk1+sulQIgIbsXcg+tZjaZUAvhvXIZbOemgjPQ0U+uNFnfD/L5HF4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1268357},"main":"./dist/backend/src/index.js","pnpm":{"onlyBuiltDependencies":["esbuild","node-pty"]},"type":"module","types":"./dist/backend/src/index.d.ts","engines":{"node":">=20.0.0"},"gitHead":"d4d5eeb3bc5f36eae5a24060af3c1eeaf9e43d6c","imports":{"#shared":"./shared/index.ts"},"scripts":{"dev":"concurrently --kill-others --handle-input -n backend,frontend -c blue,green \"tsx backend/src/index.ts\" \"cd frontend && vite\"","stop":"tsx backend/src/registry/stop-instances.ts","test":"vitest run","build":"tsc && tsc-alias && cd frontend && vite build","clean":"rm -rf dist frontend-dist","start":"node dist/backend/src/index.js","dev:cli":"tsx backend/src/cli.ts","test:unit":"vitest run --project backend backend/tests/unit --project frontend","test:watch":"vitest","postinstall":"node scripts/fix-node-pty-permissions.js","test:backend":"vitest run --project backend","test:frontend":"vitest run --project frontend","prepublishOnly":"pnpm build","test:integration":"vitest run --project backend backend/tests/integration"},"_npmUser":{"name":"caoruhua","email":"tangzh.tom@gmail.com"},"repository":{"url":"git+https://github.com/StephenTowne/open-claude-remote.git","type":"git"},"_npmVersion":"11.6.2","description":"Remote control proxy for Claude Code CLI - control your PC terminal from mobile browser","directories":{},"_nodeVersion":"24.13.0","dependencies":{"ws":"^8.19.0","cors":"^2.8.6","pino":"^9.14.0","cookie":"^1.1.1","express":"^4.22.1","node-pty":"^1.1.0","web-push":"^3.6.7","qrcode-terminal":"^0.12.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","vite":"^6.4.1","jsdom":"^26.1.0","react":"^19.2.4","vitest":"^3.2.4","zustand":"^5.0.11","@types/ws":"^8.18.1","happy-dom":"^20.8.3","react-dom":"^19.2.4","tsc-alias":"^1.8.16","typescript":"^5.9.3","@types/cors":"^2.8.19","@types/node":"^22.19.13","pino-pretty":"^13.1.3","@types/react":"^19.2.14","@xterm/xterm":"^5.5.0","concurrently":"^9.2.1","@dnd-kit/core":"^6.3.1","@types/cookie":"^0.6.0","@types/express":"^5.0.6","@types/web-push":"^3.6.4","@types/react-dom":"^19.2.3","@xterm/addon-fit":"^0.10.0","@dnd-kit/sortable":"^8.0.0","@dnd-kit/utilities":"^3.2.2","@xterm/addon-webgl":"^0.18.0","@vitejs/plugin-react":"^4.7.0","@testing-library/react":"^16.3.2","@types/qrcode-terminal":"^0.12.2","@xterm/addon-unicode11":"^0.8.0"},"peerDependencies":{"@anthropic-ai/claude-code":">=0.0.1"},"peerDependenciesMeta":{"@anthropic-ai/claude-code":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/open-claude-remote_0.1.4_1772723500258_0.1978859859526878","host":"s3://npm-registry-packages-npm-production"}},"0.1.5":{"name":"@caoruhua/open-claude-remote","version":"0.1.5","keywords":["claude","claude-code","remote","terminal","proxy","mobile"],"author":{"name":"caoruhua"},"license":"MIT","_id":"@caoruhua/open-claude-remote@0.1.5","maintainers":[{"name":"caoruhua","email":"tangzh.tom@gmail.com"}],"homepage":"https://github.com/StephenTowne/open-claude-remote#readme","bugs":{"url":"https://github.com/StephenTowne/open-claude-remote/issues"},"os":["darwin","linux"],"bin":{"claude-remote":"dist/backend/src/cli.js"},"dist":{"shasum":"1b686b332cf43f0822d1e7d6d6a205cca01b527c","tarball":"https://registry.npmjs.org/@caoruhua/open-claude-remote/-/open-claude-remote-0.1.5.tgz","fileCount":235,"integrity":"sha512-a1RaplYAdE0egvWgmZApz90E42ycojKvz7W+TwaTs1Fv7BuASghfrvXc1KW4NNOQ/ee0dA8DKro/ev81NWgwGw==","signatures":[{"sig":"MEYCIQDEcQ5bWSIiypddB2utUVnmt+KZg5DCfExvsaNVVmpWwwIhAM9ywwvVL4rTunuXehyRpOvjAob2tRxgZ7SUXN3ABnO3","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1284057},"main":"./dist/backend/src/index.js","pnpm":{"onlyBuiltDependencies":["esbuild","node-pty"]},"type":"module","types":"./dist/backend/src/index.d.ts","engines":{"node":">=20.0.0"},"gitHead":"1a3583320893a65b36be8670ed91085f2889799b","imports":{"#shared":"./shared/index.ts"},"scripts":{"dev":"concurrently --kill-others --handle-input -n backend,frontend -c blue,green \"tsx backend/src/index.ts\" \"cd frontend && vite\"","stop":"tsx backend/src/registry/stop-instances.ts","test":"vitest run","build":"tsc && tsc-alias && cd frontend && vite build","clean":"rm -rf dist frontend-dist","start":"node dist/backend/src/index.js","dev:cli":"tsx backend/src/cli.ts","test:unit":"vitest run --project backend backend/tests/unit --project frontend","test:watch":"vitest","test:backend":"vitest run --project backend","test:frontend":"vitest run --project frontend","prepublishOnly":"pnpm build","test:integration":"vitest run --project backend backend/tests/integration"},"_npmUser":{"name":"caoruhua","email":"tangzh.tom@gmail.com"},"repository":{"url":"git+https://github.com/StephenTowne/open-claude-remote.git","type":"git"},"_npmVersion":"11.6.2","description":"Remote control proxy for Claude Code CLI - control your PC terminal from mobile browser","directories":{},"_nodeVersion":"24.13.0","dependencies":{"ws":"^8.19.0","cors":"^2.8.6","pino":"^9.14.0","cookie":"^1.1.1","express":"^4.22.1","node-pty":"^1.1.0","web-push":"^3.6.7","qrcode-terminal":"^0.12.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","vite":"^6.4.1","jsdom":"^26.1.0","react":"^19.2.4","vitest":"^3.2.4","zustand":"^5.0.11","@types/ws":"^8.18.1","happy-dom":"^20.8.3","react-dom":"^19.2.4","tsc-alias":"^1.8.16","typescript":"^5.9.3","@types/cors":"^2.8.19","@types/node":"^22.19.13","pino-pretty":"^13.1.3","@types/react":"^19.2.14","@xterm/xterm":"^5.5.0","concurrently":"^9.2.1","@dnd-kit/core":"^6.3.1","@types/cookie":"^0.6.0","@types/express":"^5.0.6","@types/web-push":"^3.6.4","@types/react-dom":"^19.2.3","@xterm/addon-fit":"^0.10.0","@dnd-kit/sortable":"^8.0.0","@dnd-kit/utilities":"^3.2.2","@xterm/addon-webgl":"^0.18.0","@vitejs/plugin-react":"^4.7.0","@testing-library/react":"^16.3.2","@types/qrcode-terminal":"^0.12.2","@xterm/addon-unicode11":"^0.8.0"},"_npmOperationalInternal":{"tmp":"tmp/open-claude-remote_0.1.5_1772787596355_0.2590257558859739","host":"s3://npm-registry-packages-npm-production"}},"0.1.6":{"name":"@caoruhua/open-claude-remote","version":"0.1.6","keywords":["claude","claude-code","remote","terminal","proxy","mobile"],"author":{"name":"caoruhua"},"license":"MIT","_id":"@caoruhua/open-claude-remote@0.1.6","maintainers":[{"name":"caoruhua","email":"tangzh.tom@gmail.com"}],"homepage":"https://github.com/StephenTowne/open-claude-remote#readme","bugs":{"url":"https://github.com/StephenTowne/open-claude-remote/issues"},"os":["darwin","linux"],"bin":{"claude-remote":"dist/backend/src/cli.js"},"dist":{"shasum":"47008bb3fe543ce6879b21406cb7da67a693e5de","tarball":"https://registry.npmjs.org/@caoruhua/open-claude-remote/-/open-claude-remote-0.1.6.tgz","fileCount":235,"integrity":"sha512-ot+RFkOOpqZU1umMIN7JSvayq6S9evum/7Jf7jm/cunQEh3ga+sbdaLxFKQjV3GYV5N0qkR7PDOtUkLT0kSUWA==","signatures":[{"sig":"MEUCIQC6eqJgd1uj6ewz+EJEo/t5QCcs0HWiZrZvdh8SRSL4QwIgHfwWdsFqSX6hocLE8evVObdmBTTymaXGSIZY4ytoilY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1288938},"main":"./dist/backend/src/index.js","pnpm":{"onlyBuiltDependencies":["esbuild","node-pty"]},"type":"module","types":"./dist/backend/src/index.d.ts","engines":{"node":">=20.0.0"},"gitHead":"a9d5a34cdf45a7e7e5c5c225be8fa66a21b26f1a","imports":{"#shared":"./shared/index.ts"},"scripts":{"dev":"concurrently --kill-others --handle-input -n backend,frontend -c blue,green \"tsx backend/src/index.ts\" \"cd frontend && vite\"","stop":"tsx backend/src/registry/stop-instances.ts","test":"vitest run","build":"tsc && tsc-alias && cd frontend && vite build","clean":"rm -rf dist frontend-dist","start":"node dist/backend/src/index.js","dev:cli":"tsx backend/src/cli.ts","test:unit":"vitest run --project backend backend/tests/unit --project frontend","test:watch":"vitest","test:backend":"vitest run --project backend","test:frontend":"vitest run --project frontend","prepublishOnly":"pnpm build","test:integration":"vitest run --project backend backend/tests/integration"},"_npmUser":{"name":"caoruhua","email":"tangzh.tom@gmail.com"},"repository":{"url":"git+https://github.com/StephenTowne/open-claude-remote.git","type":"git"},"_npmVersion":"11.6.2","description":"Remote control proxy for Claude Code CLI - control your PC terminal from mobile browser","directories":{},"_nodeVersion":"24.13.0","dependencies":{"ws":"^8.19.0","cors":"^2.8.6","pino":"^9.14.0","cookie":"^1.1.1","express":"^4.22.1","node-pty":"^1.1.0","web-push":"^3.6.7","qrcode-terminal":"^0.12.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","vite":"^6.4.1","jsdom":"^26.1.0","react":"^19.2.4","vitest":"^3.2.4","zustand":"^5.0.11","@types/ws":"^8.18.1","happy-dom":"^20.8.3","react-dom":"^19.2.4","tsc-alias":"^1.8.16","typescript":"^5.9.3","@types/cors":"^2.8.19","@types/node":"^22.19.13","pino-pretty":"^13.1.3","@types/react":"^19.2.14","@xterm/xterm":"^5.5.0","concurrently":"^9.2.1","@dnd-kit/core":"^6.3.1","@types/cookie":"^0.6.0","@types/express":"^5.0.6","@types/web-push":"^3.6.4","@types/react-dom":"^19.2.3","@xterm/addon-fit":"^0.10.0","@dnd-kit/sortable":"^8.0.0","@dnd-kit/utilities":"^3.2.2","@xterm/addon-webgl":"^0.18.0","@vitejs/plugin-react":"^4.7.0","@testing-library/react":"^16.3.2","@types/qrcode-terminal":"^0.12.2","@xterm/addon-unicode11":"^0.8.0"},"_npmOperationalInternal":{"tmp":"tmp/open-claude-remote_0.1.6_1772810872657_0.6629240828304832","host":"s3://npm-registry-packages-npm-production"}},"0.1.7":{"name":"@caoruhua/open-claude-remote","version":"0.1.7","keywords":["claude","claude-code","remote","terminal","proxy","mobile"],"author":{"name":"caoruhua"},"license":"MIT","_id":"@caoruhua/open-claude-remote@0.1.7","maintainers":[{"name":"caoruhua","email":"tangzh.tom@gmail.com"}],"homepage":"https://github.com/StephenTowne/open-claude-remote#readme","bugs":{"url":"https://github.com/StephenTowne/open-claude-remote/issues"},"os":["darwin","linux"],"bin":{"claude-remote":"dist/backend/src/cli.js"},"dist":{"shasum":"cc7f588fed620d024f056c382bd692da2decbb3a","tarball":"https://registry.npmjs.org/@caoruhua/open-claude-remote/-/open-claude-remote-0.1.7.tgz","fileCount":235,"integrity":"sha512-/OQN7pLbDxxaybTsBmplN9C58b3GyLOpJIHnTbwYEODwclwKc61cuc+taNNb/0w4avOzzC0s0JlMmcLbM20amg==","signatures":[{"sig":"MEQCIHcEHwlC2IcUytKEGQfWN/Iu9j7YsCeesE7aHZ6OxMQkAiBpOJS+SXfimFRsKSR48FKasRT+5u2WN6B+vz40M6u16g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1288826},"main":"./dist/backend/src/index.js","pnpm":{"onlyBuiltDependencies":["esbuild","node-pty"]},"type":"module","types":"./dist/backend/src/index.d.ts","engines":{"node":">=20.0.0"},"gitHead":"a9d5a34cdf45a7e7e5c5c225be8fa66a21b26f1a","imports":{"#shared":"./shared/index.ts"},"scripts":{"dev":"concurrently --kill-others --handle-input -n backend,frontend -c blue,green \"tsx backend/src/index.ts\" \"cd frontend && vite\"","stop":"tsx backend/src/registry/stop-instances.ts","test":"vitest run","build":"tsc && tsc-alias && cd frontend && vite build","clean":"rm -rf dist frontend-dist","start":"node dist/backend/src/index.js","dev:cli":"tsx backend/src/cli.ts","test:unit":"vitest run --project backend backend/tests/unit --project frontend","test:watch":"vitest","test:backend":"vitest run --project backend","test:frontend":"vitest run --project frontend","prepublishOnly":"pnpm build","test:integration":"vitest run --project backend backend/tests/integration"},"_npmUser":{"name":"caoruhua","email":"tangzh.tom@gmail.com"},"repository":{"url":"git+https://github.com/StephenTowne/open-claude-remote.git","type":"git"},"_npmVersion":"11.6.2","description":"Remote control proxy for Claude Code CLI - control your PC terminal from mobile browser","directories":{},"_nodeVersion":"24.13.0","dependencies":{"ws":"^8.19.0","cors":"^2.8.6","pino":"^9.14.0","cookie":"^1.1.1","express":"^4.22.1","node-pty":"^1.1.0","web-push":"^3.6.7","qrcode-terminal":"^0.12.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","vite":"^6.4.1","jsdom":"^26.1.0","react":"^19.2.4","vitest":"^3.2.4","zustand":"^5.0.11","@types/ws":"^8.18.1","happy-dom":"^20.8.3","react-dom":"^19.2.4","tsc-alias":"^1.8.16","typescript":"^5.9.3","@types/cors":"^2.8.19","@types/node":"^22.19.13","pino-pretty":"^13.1.3","@types/react":"^19.2.14","@xterm/xterm":"^5.5.0","concurrently":"^9.2.1","@dnd-kit/core":"^6.3.1","@types/cookie":"^0.6.0","@types/express":"^5.0.6","@types/web-push":"^3.6.4","@types/react-dom":"^19.2.3","@xterm/addon-fit":"^0.10.0","@dnd-kit/sortable":"^8.0.0","@dnd-kit/utilities":"^3.2.2","@xterm/addon-webgl":"^0.18.0","@vitejs/plugin-react":"^4.7.0","@testing-library/react":"^16.3.2","@types/qrcode-terminal":"^0.12.2","@xterm/addon-unicode11":"^0.8.0"},"_npmOperationalInternal":{"tmp":"tmp/open-claude-remote_0.1.7_1772811353769_0.22140434871159353","host":"s3://npm-registry-packages-npm-production"}},"0.2.3":{"name":"@caoruhua/open-claude-remote","version":"0.2.3","keywords":["claude","claude-code","remote","terminal","proxy","mobile"],"author":{"name":"caoruhua"},"license":"MIT","_id":"@caoruhua/open-claude-remote@0.2.3","maintainers":[{"name":"caoruhua","email":"tangzh.tom@gmail.com"}],"homepage":"https://github.com/StephenTowne/open-claude-remote#readme","bugs":{"url":"https://github.com/StephenTowne/open-claude-remote/issues"},"os":["darwin","linux"],"bin":{"claude-remote":"dist/backend/src/cli.js"},"dist":{"shasum":"7f3d64a91d6e05bc7f06c4d34be243df99456d7f","tarball":"https://registry.npmjs.org/@caoruhua/open-claude-remote/-/open-claude-remote-0.2.3.tgz","fileCount":283,"integrity":"sha512-NbxyM5TEi5fRVe4sB5EECt/4mcgsx8iNJUvap4v2MxSHtyNnzLQKR0YdnZpywvwfQNtv/vxZruavjzcG9zOIDQ==","signatures":[{"sig":"MEQCIDiie0XIHiObo3XTO41qiSpmtaQz02aNxVymQqejQwhLAiAUWLcATEAifoG5PI2TdERSNL/98brzGEmXdOjzChnXrQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1409943},"main":"./dist/backend/src/index.js","pnpm":{"onlyBuiltDependencies":["esbuild","node-pty"]},"type":"module","types":"./dist/backend/src/index.d.ts","engines":{"node":">=20.0.0"},"gitHead":"9809bba7b96546a7c6f3b76a2deaf0b6e724921f","imports":{"#shared":"./shared/index.ts"},"scripts":{"dev":"concurrently --kill-others --handle-input -n backend,frontend -c blue,green \"tsx backend/src/index.ts\" \"cd frontend && vite\"","stop":"tsx backend/src/registry/stop-instances.ts","test":"vitest run","build":"tsc && tsc-alias && cd frontend && vite build","clean":"rm -rf dist frontend-dist","start":"node dist/backend/src/index.js","dev:cli":"tsx backend/src/cli.ts","test:unit":"vitest run --project backend backend/tests/unit --project frontend","test:watch":"vitest","test:backend":"vitest run --project backend","test:frontend":"vitest run --project frontend","prepublishOnly":"pnpm build","test:integration":"vitest run --project backend backend/tests/integration"},"_npmUser":{"name":"caoruhua","email":"tangzh.tom@gmail.com"},"repository":{"url":"git+https://github.com/StephenTowne/open-claude-remote.git","type":"git"},"_npmVersion":"11.6.2","description":"Remote control proxy for Claude Code CLI - control your PC terminal from mobile browser","directories":{},"_nodeVersion":"24.13.0","dependencies":{"ws":"^8.19.0","cors":"^2.8.6","pino":"^9.14.0","cookie":"^1.1.1","express":"^4.22.1","node-pty":"^1.1.0","web-push":"^3.6.7","qrcode-terminal":"^0.12.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","vite":"^6.4.1","jsdom":"^26.1.0","react":"^19.2.4","vitest":"^3.2.4","zustand":"^5.0.11","@types/ws":"^8.18.1","happy-dom":"^20.8.3","react-dom":"^19.2.4","tsc-alias":"^1.8.16","typescript":"^5.9.3","@types/cors":"^2.8.19","@types/node":"^22.19.15","pino-pretty":"^13.1.3","@types/react":"^19.2.14","@xterm/xterm":"^5.5.0","concurrently":"^9.2.1","@dnd-kit/core":"^6.3.1","@types/cookie":"^0.6.0","@types/express":"^5.0.6","@types/web-push":"^3.6.4","@types/react-dom":"^19.2.3","@xterm/addon-fit":"^0.10.0","@dnd-kit/sortable":"^8.0.0","@dnd-kit/utilities":"^3.2.2","@xterm/addon-webgl":"^0.18.0","@vitejs/plugin-react":"^4.7.0","@testing-library/react":"^16.3.2","@types/qrcode-terminal":"^0.12.2","@xterm/addon-unicode11":"^0.8.0"},"_npmOperationalInternal":{"tmp":"tmp/open-claude-remote_0.2.3_1772855878196_0.07363539687864429","host":"s3://npm-registry-packages-npm-production"}},"0.2.4":{"name":"@caoruhua/open-claude-remote","version":"0.2.4","keywords":["claude","claude-code","remote","terminal","proxy","mobile"],"author":{"name":"caoruhua"},"license":"MIT","_id":"@caoruhua/open-claude-remote@0.2.4","maintainers":[{"name":"caoruhua","email":"tangzh.tom@gmail.com"}],"homepage":"https://github.com/StephenTowne/open-claude-remote#readme","bugs":{"url":"https://github.com/StephenTowne/open-claude-remote/issues"},"os":["darwin","linux"],"bin":{"claude-remote":"dist/backend/src/cli.js"},"dist":{"shasum":"7242246264c0262406c5a2acc0cba2070ee9860d","tarball":"https://registry.npmjs.org/@caoruhua/open-claude-remote/-/open-claude-remote-0.2.4.tgz","fileCount":283,"integrity":"sha512-Ikt12bQSpFVkGdJGY0eqKDk2Wh/XnH1NASsDD70WCZiVq4R69fZQecydSfoAkkGMbA+U2PVWDZ1gTLhe6Q02BQ==","signatures":[{"sig":"MEYCIQDuW+3a4u5tgSaAIqwJe6JOAo6vlg0R2jRQmkcux/OkuQIhAP3Pc5fmsb9B6EvD9B9r/K+XCJxCzg1DHovmiFicDQ6e","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1418118},"main":"./dist/backend/src/index.js","pnpm":{"onlyBuiltDependencies":["esbuild","node-pty"]},"type":"module","types":"./dist/backend/src/index.d.ts","engines":{"node":">=20.0.0"},"gitHead":"c002f3eda372ecaf7c2fee84c41c745c5dd947eb","imports":{"#shared":"./shared/index.ts"},"scripts":{"dev":"concurrently --kill-others --handle-input -n backend,frontend -c blue,green \"tsx backend/src/index.ts\" \"cd frontend && vite\"","stop":"tsx backend/src/registry/stop-instances.ts","test":"vitest run","build":"tsc && tsc-alias && cd frontend && vite build","clean":"rm -rf dist frontend-dist","start":"node dist/backend/src/index.js","dev:cli":"tsx backend/src/cli.ts","test:unit":"vitest run --project backend backend/tests/unit --project frontend","test:watch":"vitest","test:backend":"vitest run --project backend","test:frontend":"vitest run --project frontend","prepublishOnly":"pnpm build","test:integration":"vitest run --project backend backend/tests/integration"},"_npmUser":{"name":"caoruhua","email":"tangzh.tom@gmail.com"},"repository":{"url":"git+https://github.com/StephenTowne/open-claude-remote.git","type":"git"},"_npmVersion":"11.6.2","description":"Remote control proxy for Claude Code CLI - control your PC terminal from mobile browser","directories":{},"_nodeVersion":"24.13.0","dependencies":{"ws":"^8.19.0","cors":"^2.8.6","pino":"^9.14.0","cookie":"^1.1.1","express":"^4.22.1","node-pty":"^1.1.0","web-push":"^3.6.7","qrcode-terminal":"^0.12.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","vite":"^6.4.1","jsdom":"^26.1.0","react":"^19.2.4","vitest":"^3.2.4","zustand":"^5.0.11","@types/ws":"^8.18.1","happy-dom":"^20.8.3","react-dom":"^19.2.4","tsc-alias":"^1.8.16","typescript":"^5.9.3","@types/cors":"^2.8.19","@types/node":"^22.19.15","pino-pretty":"^13.1.3","@types/react":"^19.2.14","@xterm/xterm":"^5.5.0","concurrently":"^9.2.1","@dnd-kit/core":"^6.3.1","@types/cookie":"^0.6.0","@types/express":"^5.0.6","@types/web-push":"^3.6.4","@types/react-dom":"^19.2.3","@xterm/addon-fit":"^0.10.0","@dnd-kit/sortable":"^8.0.0","@dnd-kit/utilities":"^3.2.2","@xterm/addon-webgl":"^0.18.0","@vitejs/plugin-react":"^4.7.0","@testing-library/react":"^16.3.2","@types/qrcode-terminal":"^0.12.2","@xterm/addon-unicode11":"^0.8.0"},"_npmOperationalInternal":{"tmp":"tmp/open-claude-remote_0.2.4_1772879033769_0.15325895372554577","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@caoruhua/open-claude-remote","version":"0.3.0","keywords":["claude","claude-code","remote","terminal","proxy","mobile"],"author":{"name":"caoruhua"},"license":"MIT","_id":"@caoruhua/open-claude-remote@0.3.0","maintainers":[{"name":"caoruhua","email":"tangzh.tom@gmail.com"}],"homepage":"https://github.com/StephenTowne/open-claude-remote#readme","bugs":{"url":"https://github.com/StephenTowne/open-claude-remote/issues"},"os":["darwin","linux"],"bin":{"claude-remote":"dist/backend/src/cli.js"},"dist":{"shasum":"5cdcf3d54c6bd5cd21a92a2e2cdfb457c14e2e88","tarball":"https://registry.npmjs.org/@caoruhua/open-claude-remote/-/open-claude-remote-0.3.0.tgz","fileCount":283,"integrity":"sha512-gDfEIk/1k9J+zMt+C+ym7oeJLPc32kd0hGc7VBLE47/XHiNRF7usNwkPGywSDMRTG2Bs0STnz45KMvrILjCSMw==","signatures":[{"sig":"MEUCIQCS3AAiY2jou4V3tF3t75veXudXwa8QqvbgJ/xd1h9avwIgWV8q3yL+RUzyYQBPL9K1pJmd4miqDNFBXo1E1fdPg4o=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1440249},"main":"./dist/backend/src/index.js","pnpm":{"onlyBuiltDependencies":["esbuild","node-pty"]},"type":"module","types":"./dist/backend/src/index.d.ts","engines":{"node":">=20.0.0"},"gitHead":"733f199e1160bba5ae6cb3c77ef70cb258553678","imports":{"#shared":"./shared/index.ts"},"scripts":{"dev":"concurrently --kill-others --handle-input -n backend,frontend -c blue,green \"tsx backend/src/index.ts\" \"cd frontend && vite\"","stop":"tsx backend/src/registry/stop-instances.ts","test":"vitest run","build":"tsc && tsc-alias && cd frontend && vite build","clean":"rm -rf dist frontend-dist","start":"node dist/backend/src/index.js","dev:cli":"tsx backend/src/cli.ts","test:unit":"vitest run --project backend backend/tests/unit --project frontend","test:watch":"vitest","test:backend":"vitest run --project backend","test:frontend":"vitest run --project frontend","prepublishOnly":"pnpm build","test:integration":"vitest run --project backend backend/tests/integration"},"_npmUser":{"name":"caoruhua","email":"tangzh.tom@gmail.com"},"repository":{"url":"git+https://github.com/StephenTowne/open-claude-remote.git","type":"git"},"_npmVersion":"11.6.2","description":"Remote control proxy for Claude Code CLI - control your PC terminal from mobile browser","directories":{},"_nodeVersion":"24.13.0","dependencies":{"ws":"^8.19.0","cors":"^2.8.6","pino":"^9.14.0","cookie":"^1.1.1","express":"^4.22.1","node-pty":"^1.1.0","web-push":"^3.6.7","qrcode-terminal":"^0.12.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","vite":"^6.4.1","jsdom":"^26.1.0","react":"^19.2.4","vitest":"^3.2.4","zustand":"^5.0.11","@types/ws":"^8.18.1","happy-dom":"^20.8.3","react-dom":"^19.2.4","tsc-alias":"^1.8.16","typescript":"^5.9.3","@types/cors":"^2.8.19","@types/node":"^22.19.15","pino-pretty":"^13.1.3","@types/react":"^19.2.14","@xterm/xterm":"^5.5.0","concurrently":"^9.2.1","@dnd-kit/core":"^6.3.1","@types/cookie":"^0.6.0","@types/express":"^5.0.6","@types/web-push":"^3.6.4","@types/react-dom":"^19.2.3","@xterm/addon-fit":"^0.10.0","@dnd-kit/sortable":"^8.0.0","@dnd-kit/utilities":"^3.2.2","@xterm/addon-webgl":"^0.18.0","@vitejs/plugin-react":"^4.7.0","@testing-library/react":"^16.3.2","@types/qrcode-terminal":"^0.12.2","@xterm/addon-unicode11":"^0.8.0"},"_npmOperationalInternal":{"tmp":"tmp/open-claude-remote_0.3.0_1772904160369_0.2814003586325755","host":"s3://npm-registry-packages-npm-production"}},"0.3.4":{"name":"@caoruhua/open-claude-remote","version":"0.3.4","keywords":["claude","claude-code","remote","terminal","proxy","mobile"],"author":{"name":"caoruhua"},"license":"MIT","_id":"@caoruhua/open-claude-remote@0.3.4","maintainers":[{"name":"caoruhua","email":"tangzh.tom@gmail.com"}],"homepage":"https://github.com/StephenTowne/open-claude-remote#readme","bugs":{"url":"https://github.com/StephenTowne/open-claude-remote/issues"},"os":["darwin","linux"],"bin":{"claude-remote":"dist/backend/src/cli.js"},"dist":{"shasum":"f265b4d201fb392990c8f9daf19bc56e52bd839c","tarball":"https://registry.npmjs.org/@caoruhua/open-claude-remote/-/open-claude-remote-0.3.4.tgz","fileCount":287,"integrity":"sha512-GArWAlYjW3m57lWy/l37et8iaHcCTXdNkf7pRp5Fvnd6lifkSPyhTnYetICHmv1jA4etssvWObC7b2X9ZFC2iw==","signatures":[{"sig":"MEUCIEYKocQ+quUtBprw+/zirRGUCDFjr6r33i+AVyuH0ZcvAiEAtQQUHTncjsIp37ulmTlfMSSK5DXgrggZLiFxp8WiJXw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1476721},"main":"./dist/backend/src/index.js","pnpm":{"onlyBuiltDependencies":["esbuild","node-pty"]},"type":"module","types":"./dist/backend/src/index.d.ts","engines":{"node":">=20.0.0"},"gitHead":"94b534311f8455da28695dd723b849e17234ed6d","imports":{"#shared":"./shared/index.ts"},"scripts":{"dev":"concurrently --kill-others --handle-input -n backend,frontend -c blue,green \"tsx backend/src/index.ts\" \"cd frontend && vite\"","stop":"tsx backend/src/registry/stop-instances.ts","test":"vitest run","build":"tsc && tsc-alias && cd frontend && vite build","clean":"rm -rf dist frontend-dist","start":"node dist/backend/src/index.js","dev:cli":"tsx backend/src/cli.ts","test:unit":"vitest run --project backend backend/tests/unit --project frontend","test:watch":"vitest","test:backend":"vitest run --project backend","test:frontend":"vitest run --project frontend","prepublishOnly":"pnpm build","test:integration":"vitest run --project backend backend/tests/integration"},"_npmUser":{"name":"caoruhua","email":"tangzh.tom@gmail.com"},"repository":{"url":"git+https://github.com/StephenTowne/open-claude-remote.git","type":"git"},"_npmVersion":"11.6.2","description":"Remote control proxy for Claude Code CLI - control your PC terminal from mobile browser","directories":{},"_nodeVersion":"24.13.0","dependencies":{"ws":"^8.19.0","cors":"^2.8.6","pino":"^9.14.0","cookie":"^1.1.1","express":"^4.22.1","node-pty":"^1.1.0","web-push":"^3.6.7","qrcode-terminal":"^0.12.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","vite":"^6.4.1","jsdom":"^26.1.0","react":"^19.2.4","vitest":"^3.2.4","zustand":"^5.0.11","@types/ws":"^8.18.1","happy-dom":"^20.8.3","react-dom":"^19.2.4","tsc-alias":"^1.8.16","typescript":"^5.9.3","@types/cors":"^2.8.19","@types/node":"^22.19.15","pino-pretty":"^13.1.3","@types/react":"^19.2.14","@xterm/xterm":"^5.5.0","concurrently":"^9.2.1","@dnd-kit/core":"^6.3.1","@types/cookie":"^0.6.0","@types/express":"^5.0.6","@types/web-push":"^3.6.4","@types/react-dom":"^19.2.3","@xterm/addon-fit":"^0.10.0","@dnd-kit/sortable":"^8.0.0","@dnd-kit/utilities":"^3.2.2","@xterm/addon-webgl":"^0.18.0","@vitejs/plugin-react":"^4.7.0","@testing-library/react":"^16.3.2","@types/qrcode-terminal":"^0.12.2","@xterm/addon-unicode11":"^0.8.0"},"_npmOperationalInternal":{"tmp":"tmp/open-claude-remote_0.3.4_1772979811357_0.7450421314029145","host":"s3://npm-registry-packages-npm-production"}},"0.3.6":{"name":"@caoruhua/open-claude-remote","version":"0.3.6","keywords":["claude","claude-code","remote","terminal","proxy","mobile"],"author":{"name":"caoruhua"},"license":"MIT","_id":"@caoruhua/open-claude-remote@0.3.6","maintainers":[{"name":"caoruhua","email":"tangzh.tom@gmail.com"}],"homepage":"https://github.com/StephenTowne/open-claude-remote#readme","bugs":{"url":"https://github.com/StephenTowne/open-claude-remote/issues"},"os":["darwin","linux"],"bin":{"claude-remote":"dist/backend/src/cli.js"},"dist":{"shasum":"e868d2138e6e4b4283899dfa1f8a4fee8da3b860","tarball":"https://registry.npmjs.org/@caoruhua/open-claude-remote/-/open-claude-remote-0.3.6.tgz","fileCount":271,"integrity":"sha512-sVriTRFoqkCgx8zqF88LkgSNSAyEmi/NV1DjxWmg2tRxzSPClLpAeOVsJHq9a+8+BV6Efw3UxmFXiHDP0kmr9A==","signatures":[{"sig":"MEUCIQCMyYK+WqhjDjag1NwtZI75uYkEpArkJ3OPNTg110FMHQIgfXexwT2JP6wqrBfAlTAOYJZIsfizPdRf63lhbOvsQSw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1434576},"main":"./dist/backend/src/index.js","pnpm":{"onlyBuiltDependencies":["esbuild","node-pty"]},"type":"module","types":"./dist/backend/src/index.d.ts","engines":{"node":">=20.0.0"},"gitHead":"c3429907d680029090092c0f79f059675799fb0d","imports":{"#shared":"./shared/index.ts"},"scripts":{"dev":"concurrently --kill-others --handle-input -n backend,frontend -c blue,green \"tsx backend/src/index.ts\" \"cd frontend && vite\"","stop":"tsx backend/src/registry/stop-instances.ts","test":"vitest run","build":"tsc && tsc-alias && cd frontend && vite build","clean":"rm -rf dist frontend-dist","start":"node dist/backend/src/index.js","dev:cli":"tsx backend/src/cli.ts","test:unit":"vitest run --project backend backend/tests/unit --project frontend","test:watch":"vitest","test:backend":"vitest run --project backend","test:frontend":"vitest run --project frontend","prepublishOnly":"pnpm build","test:integration":"vitest run --project backend backend/tests/integration"},"_npmUser":{"name":"caoruhua","email":"tangzh.tom@gmail.com"},"repository":{"url":"git+https://github.com/StephenTowne/open-claude-remote.git","type":"git"},"_npmVersion":"11.6.2","description":"Remote control proxy for Claude Code CLI - control your PC terminal from mobile browser","directories":{},"_nodeVersion":"24.13.0","dependencies":{"ws":"^8.19.0","cors":"^2.8.6","pino":"^9.14.0","cookie":"^1.1.1","express":"^4.22.1","node-pty":"^1.1.0","web-push":"^3.6.7","qrcode-terminal":"^0.12.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","vite":"^6.4.1","jsdom":"^26.1.0","react":"^19.2.4","vitest":"^3.2.4","zustand":"^5.0.11","@types/ws":"^8.18.1","happy-dom":"^20.8.3","react-dom":"^19.2.4","tsc-alias":"^1.8.16","typescript":"^5.9.3","@types/cors":"^2.8.19","@types/node":"^22.19.15","pino-pretty":"^13.1.3","@types/react":"^19.2.14","@xterm/xterm":"^5.5.0","concurrently":"^9.2.1","@dnd-kit/core":"^6.3.1","@types/cookie":"^0.6.0","@types/express":"^5.0.6","@types/web-push":"^3.6.4","@types/react-dom":"^19.2.3","@xterm/addon-fit":"^0.10.0","@dnd-kit/sortable":"^8.0.0","@dnd-kit/utilities":"^3.2.2","@xterm/addon-webgl":"^0.18.0","@vitejs/plugin-react":"^4.7.0","@testing-library/react":"^16.3.2","@types/qrcode-terminal":"^0.12.2","@xterm/addon-unicode11":"^0.8.0"},"_npmOperationalInternal":{"tmp":"tmp/open-claude-remote_0.3.6_1773062186268_0.011312976657691376","host":"s3://npm-registry-packages-npm-production"}},"0.3.7":{"name":"@caoruhua/open-claude-remote","version":"0.3.7","keywords":["claude","claude-code","remote","terminal","proxy","mobile"],"author":{"name":"caoruhua"},"license":"MIT","_id":"@caoruhua/open-claude-remote@0.3.7","maintainers":[{"name":"caoruhua","email":"tangzh.tom@gmail.com"}],"homepage":"https://github.com/StephenTowne/open-claude-remote#readme","bugs":{"url":"https://github.com/StephenTowne/open-claude-remote/issues"},"os":["darwin","linux"],"bin":{"claude-remote":"dist/backend/src/cli.js"},"dist":{"shasum":"ab6e204e55011c25f0971cb6caeefd5c6d55d00e","tarball":"https://registry.npmjs.org/@caoruhua/open-claude-remote/-/open-claude-remote-0.3.7.tgz","fileCount":271,"integrity":"sha512-twIujyywb4i3chd8nDOikTrBP6ds0h2yCEENGs4xiCi+h7DZPBsSo8X83pgZL7uWt8M9hPvjgIHssk0TXk+Jwg==","signatures":[{"sig":"MEUCIAcdsCh+PJnhD9a6zb/gGb/V7z0X8zTo+CwjcRwn8ovrAiEAp/n5AR3G9Bxub6xc3c9UkSvANigD74B/DUeGdte8OWU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1435315},"main":"./dist/backend/src/index.js","pnpm":{"onlyBuiltDependencies":["esbuild","node-pty"]},"type":"module","types":"./dist/backend/src/index.d.ts","engines":{"node":">=20.0.0"},"gitHead":"c3429907d680029090092c0f79f059675799fb0d","imports":{"#shared":"./shared/index.ts"},"scripts":{"dev":"concurrently --kill-others --handle-input -n backend,frontend -c blue,green \"tsx backend/src/index.ts\" \"cd frontend && vite\"","stop":"tsx backend/src/registry/stop-instances.ts","test":"vitest run","build":"tsc && tsc-alias && cd frontend && vite build","clean":"rm -rf dist frontend-dist","start":"node dist/backend/src/index.js","dev:cli":"tsx backend/src/cli.ts","test:unit":"vitest run --project backend backend/tests/unit --project frontend","test:watch":"vitest","test:backend":"vitest run --project backend","test:frontend":"vitest run --project frontend","prepublishOnly":"pnpm build","test:integration":"vitest run --project backend backend/tests/integration"},"_npmUser":{"name":"caoruhua","email":"tangzh.tom@gmail.com"},"repository":{"url":"git+https://github.com/StephenTowne/open-claude-remote.git","type":"git"},"_npmVersion":"11.6.2","description":"Remote control proxy for Claude Code CLI - control your PC terminal from mobile browser","directories":{},"_nodeVersion":"24.13.0","dependencies":{"ws":"^8.19.0","cors":"^2.8.6","pino":"^9.14.0","cookie":"^1.1.1","express":"^4.22.1","node-pty":"^1.1.0","web-push":"^3.6.7","qrcode-terminal":"^0.12.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","vite":"^6.4.1","jsdom":"^26.1.0","react":"^19.2.4","vitest":"^3.2.4","zustand":"^5.0.11","@types/ws":"^8.18.1","happy-dom":"^20.8.3","react-dom":"^19.2.4","tsc-alias":"^1.8.16","typescript":"^5.9.3","@types/cors":"^2.8.19","@types/node":"^22.19.15","pino-pretty":"^13.1.3","@types/react":"^19.2.14","@xterm/xterm":"^5.5.0","concurrently":"^9.2.1","@dnd-kit/core":"^6.3.1","@types/cookie":"^0.6.0","@types/express":"^5.0.6","@types/web-push":"^3.6.4","@types/react-dom":"^19.2.3","@xterm/addon-fit":"^0.10.0","@dnd-kit/sortable":"^8.0.0","@dnd-kit/utilities":"^3.2.2","@xterm/addon-webgl":"^0.18.0","@vitejs/plugin-react":"^4.7.0","@testing-library/react":"^16.3.2","@types/qrcode-terminal":"^0.12.2","@xterm/addon-unicode11":"^0.8.0"},"_npmOperationalInternal":{"tmp":"tmp/open-claude-remote_0.3.7_1773062829192_0.4204385756242275","host":"s3://npm-registry-packages-npm-production"}},"1.0.0":{"name":"@caoruhua/open-claude-remote","version":"1.0.0","keywords":["claude","claude-code","remote","terminal","proxy","mobile"],"author":{"name":"caoruhua"},"license":"MIT","_id":"@caoruhua/open-claude-remote@1.0.0","maintainers":[{"name":"caoruhua","email":"tangzh.tom@gmail.com"}],"homepage":"https://github.com/StephenTowne/open-claude-remote#readme","bugs":{"url":"https://github.com/StephenTowne/open-claude-remote/issues"},"os":["darwin","linux"],"bin":{"claude-remote":"dist/backend/src/cli.js"},"dist":{"shasum":"da1d03287fb3bf3c00b574440adb5cc827212ead","tarball":"https://registry.npmjs.org/@caoruhua/open-claude-remote/-/open-claude-remote-1.0.0.tgz","fileCount":279,"integrity":"sha512-5nbeHJCcTrs9pJCjfC30KfSjzKWF7jg6QQi7sQH2USvjvNPSsHL6NV8tyu6S9idcowyxaWvLiEDUM9OoLRst3w==","signatures":[{"sig":"MEUCIHutPZR7UMxDdzFVpsZE7VmDWBzuolXHb9SHghZAA7yjAiEA5EFvvPZC8u1rZai7mM7AYYxCDWxEqWY9BNibe0GpquY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1875756},"main":"./dist/backend/src/index.js","pnpm":{"onlyBuiltDependencies":["esbuild","node-pty"]},"type":"module","types":"./dist/backend/src/index.d.ts","engines":{"node":">=20.0.0"},"gitHead":"a07a4cdcf3a6fcbda1c03aa61a584cde9730f8d6","imports":{"#shared":"./shared/index.ts"},"scripts":{"dev":"concurrently --kill-others --handle-input -n backend,frontend -c blue,green \"tsx backend/src/index.ts\" \"cd frontend && vite\"","stop":"tsx backend/src/registry/stop-instances.ts","test":"vitest run","build":"tsc && tsc-alias && cd frontend && vite build","clean":"rm -rf dist frontend-dist","start":"node dist/backend/src/index.js","dev:cli":"tsx backend/src/cli.ts","test:unit":"vitest run backend/tests/unit frontend/tests","test:watch":"vitest","test:backend":"vitest run backend/tests","test:frontend":"vitest run frontend/tests","prepublishOnly":"pnpm build","test:integration":"vitest run backend/tests/integration"},"_npmUser":{"name":"caoruhua","email":"tangzh.tom@gmail.com"},"repository":{"url":"git+https://github.com/StephenTowne/open-claude-remote.git","type":"git"},"_npmVersion":"11.6.2","description":"Remote control proxy for Claude Code CLI - control your PC terminal from mobile browser","directories":{},"_nodeVersion":"24.13.0","dependencies":{"ws":"^8.19.0","cors":"^2.8.6","pino":"^9.14.0","cookie":"^1.1.1","express":"^4.22.1","node-pty":"^1.1.0","web-push":"^3.6.7","qrcode-terminal":"^0.12.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","vite":"^6.4.1","jsdom":"^26.1.0","react":"^19.2.4","vitest":"^3.2.4","zustand":"^5.0.11","@types/ws":"^8.18.1","happy-dom":"^20.8.3","react-dom":"^19.2.4","tsc-alias":"^1.8.16","remark-gfm":"^4.0.1","typescript":"^5.9.3","@types/cors":"^2.8.19","@types/node":"^22.19.15","pino-pretty":"^13.1.3","@types/react":"^19.2.14","@xterm/xterm":"^5.5.0","concurrently":"^9.2.1","highlight.js":"^11.11.1","@dnd-kit/core":"^6.3.1","@types/cookie":"^0.6.0","@types/express":"^5.0.6","github-slugger":"^2.0.0","react-markdown":"^10.1.0","@types/web-push":"^3.6.4","@types/react-dom":"^19.2.3","@xterm/addon-fit":"^0.10.0","react-router-dom":"^7.5.2","rehype-highlight":"^7.0.2","@dnd-kit/sortable":"^8.0.0","@dnd-kit/utilities":"^3.2.2","@xterm/addon-webgl":"^0.18.0","@vitejs/plugin-react":"^4.7.0","@testing-library/react":"^16.3.2","@types/qrcode-terminal":"^0.12.2","@xterm/addon-unicode11":"^0.8.0","@testing-library/jest-dom":"^6.9.1"},"_npmOperationalInternal":{"tmp":"tmp/open-claude-remote_1.0.0_1773325456349_0.16466873651458602","host":"s3://npm-registry-packages-npm-production"}},"1.0.4":{"name":"@caoruhua/open-claude-remote","version":"1.0.4","keywords":["claude","claude-code","remote","terminal","proxy","mobile"],"author":{"name":"caoruhua"},"license":"MIT","_id":"@caoruhua/open-claude-remote@1.0.4","maintainers":[{"name":"caoruhua","email":"tangzh.tom@gmail.com"}],"homepage":"https://github.com/StephenTowne/open-claude-remote#readme","bugs":{"url":"https://github.com/StephenTowne/open-claude-remote/issues"},"os":["darwin","linux"],"bin":{"claude-remote":"dist/backend/src/cli.js"},"dist":{"shasum":"8ee4d6b61d83b1479e1ff489c2fe339e59105d5d","tarball":"https://registry.npmjs.org/@caoruhua/open-claude-remote/-/open-claude-remote-1.0.4.tgz","fileCount":279,"integrity":"sha512-5jn0H6qZ8mJ3RNrqum4zqbZAe9aOvuaaa/P3h7CXEri5e0d6FlNSUcL1cVQI5OLlkPSP+hI0Xp6/h9C16YMGzQ==","signatures":[{"sig":"MEQCICod1e7ejjCQR4Tyz+6pIXE+CkCH1qWEsdrYW18SvqGcAiB75SuHvDUzMTZmhN15hWeyq0g9BB2t/juhyspXlmlnoQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1882268},"main":"./dist/backend/src/index.js","pnpm":{"onlyBuiltDependencies":["esbuild","node-pty"]},"type":"module","types":"./dist/backend/src/index.d.ts","engines":{"node":">=20.0.0"},"gitHead":"19bca5dd46dc953ec771f0aeedf4f5acd2d18ca3","imports":{"#shared":"./shared/index.ts"},"scripts":{"dev":"concurrently --kill-others --handle-input -n backend,frontend -c blue,green \"tsx backend/src/index.ts\" \"cd frontend && vite\"","stop":"tsx backend/src/registry/stop-instances.ts","test":"vitest run","build":"tsc && tsc-alias && cd frontend && vite build","clean":"rm -rf dist frontend-dist","start":"node dist/backend/src/index.js","dev:cli":"tsx backend/src/cli.ts","test:unit":"vitest run backend/tests/unit frontend/tests","test:watch":"vitest","test:backend":"vitest run backend/tests","test:frontend":"vitest run frontend/tests","prepublishOnly":"pnpm build","test:integration":"vitest run backend/tests/integration"},"_npmUser":{"name":"caoruhua","email":"tangzh.tom@gmail.com"},"repository":{"url":"git+https://github.com/StephenTowne/open-claude-remote.git","type":"git"},"_npmVersion":"11.6.2","description":"Remote control proxy for Claude Code CLI - control your PC terminal from mobile browser","directories":{},"_nodeVersion":"24.13.0","dependencies":{"ws":"^8.19.0","cors":"^2.8.6","pino":"^9.14.0","cookie":"^1.1.1","express":"^4.22.1","node-pty":"^1.1.0","web-push":"^3.6.7","qrcode-terminal":"^0.12.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","vite":"^6.4.1","jsdom":"^26.1.0","react":"^19.2.4","vitest":"^3.2.4","zustand":"^5.0.11","@types/ws":"^8.18.1","happy-dom":"^20.8.3","react-dom":"^19.2.4","tsc-alias":"^1.8.16","remark-gfm":"^4.0.1","typescript":"^5.9.3","@types/cors":"^2.8.19","@types/node":"^22.19.15","pino-pretty":"^13.1.3","@types/react":"^19.2.14","@xterm/xterm":"^5.5.0","concurrently":"^9.2.1","highlight.js":"^11.11.1","@dnd-kit/core":"^6.3.1","@types/cookie":"^0.6.0","@types/express":"^5.0.6","github-slugger":"^2.0.0","react-markdown":"^10.1.0","@types/web-push":"^3.6.4","@types/react-dom":"^19.2.3","@xterm/addon-fit":"^0.10.0","react-router-dom":"^7.5.2","rehype-highlight":"^7.0.2","@dnd-kit/sortable":"^8.0.0","@dnd-kit/utilities":"^3.2.2","@xterm/addon-webgl":"^0.18.0","@vitejs/plugin-react":"^4.7.0","@testing-library/react":"^16.3.2","@types/qrcode-terminal":"^0.12.2","@xterm/addon-unicode11":"^0.8.0","@testing-library/jest-dom":"^6.9.1"},"_npmOperationalInternal":{"tmp":"tmp/open-claude-remote_1.0.4_1773407090113_0.14527279594167464","host":"s3://npm-registry-packages-npm-production"}},"1.0.5":{"name":"@caoruhua/open-claude-remote","version":"1.0.5","keywords":["claude","claude-code","remote","terminal","proxy","mobile"],"author":{"name":"caoruhua"},"license":"MIT","_id":"@caoruhua/open-claude-remote@1.0.5","maintainers":[{"name":"caoruhua","email":"tangzh.tom@gmail.com"}],"homepage":"https://github.com/StephenTowne/open-claude-remote#readme","bugs":{"url":"https://github.com/StephenTowne/open-claude-remote/issues"},"os":["darwin","linux"],"bin":{"claude-remote":"dist/backend/src/cli.js"},"dist":{"shasum":"4b74c284d78f7b75df1f496ab1279ddcf724f703","tarball":"https://registry.npmjs.org/@caoruhua/open-claude-remote/-/open-claude-remote-1.0.5.tgz","fileCount":279,"integrity":"sha512-5405Ukn6JRCE9EDvO7DJNKA3NtuVV3x1CqK4Jx35AuC77md31DUxrdQNzmHLF0AizE9qlS5IKND5k01lKW8lIw==","signatures":[{"sig":"MEUCICZLsyW0cQ2V2r8aXdXX+TCLblorJNtlP5TYwMDhlOkwAiEA4sJsnMcn0F9iGc5PpeNmxAhklLaJzIhcveYcMtxm8sY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1899242},"main":"./dist/backend/src/index.js","pnpm":{"onlyBuiltDependencies":["esbuild","node-pty"]},"type":"module","types":"./dist/backend/src/index.d.ts","engines":{"node":">=20.0.0"},"gitHead":"7dd67eea08e661dbf963c3c574b25173d8eb38e7","imports":{"#shared":"./shared/index.ts"},"scripts":{"dev":"concurrently --kill-others --handle-input -n backend,frontend -c blue,green \"tsx backend/src/index.ts\" \"cd frontend && vite\"","stop":"tsx backend/src/registry/stop-instances.ts","test":"vitest run","build":"tsc && tsc-alias && cd frontend && vite build","clean":"rm -rf dist frontend-dist","start":"node dist/backend/src/index.js","dev:cli":"tsx backend/src/cli.ts","test:unit":"vitest run backend/tests/unit frontend/tests","test:watch":"vitest","test:backend":"vitest run backend/tests","test:frontend":"vitest run frontend/tests","prepublishOnly":"pnpm build","test:integration":"vitest run backend/tests/integration"},"_npmUser":{"name":"caoruhua","email":"tangzh.tom@gmail.com"},"repository":{"url":"git+https://github.com/StephenTowne/open-claude-remote.git","type":"git"},"_npmVersion":"11.6.2","description":"Remote control proxy for Claude Code CLI - control your PC terminal from mobile browser","directories":{},"_nodeVersion":"24.13.0","dependencies":{"ws":"^8.19.0","cors":"^2.8.6","pino":"^9.14.0","cookie":"^1.1.1","express":"^4.22.1","node-pty":"^1.1.0","web-push":"^3.6.7","qrcode-terminal":"^0.12.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","vite":"^6.4.1","jsdom":"^26.1.0","react":"^19.2.4","vitest":"^3.2.4","zustand":"^5.0.11","@types/ws":"^8.18.1","happy-dom":"^20.8.3","react-dom":"^19.2.4","tsc-alias":"^1.8.16","remark-gfm":"^4.0.1","typescript":"^5.9.3","@types/cors":"^2.8.19","@types/node":"^22.19.15","pino-pretty":"^13.1.3","@types/react":"^19.2.14","@xterm/xterm":"^5.5.0","concurrently":"^9.2.1","highlight.js":"^11.11.1","@dnd-kit/core":"^6.3.1","@types/cookie":"^0.6.0","@types/express":"^5.0.6","github-slugger":"^2.0.0","react-markdown":"^10.1.0","@types/web-push":"^3.6.4","@types/react-dom":"^19.2.3","@xterm/addon-fit":"^0.10.0","react-router-dom":"^7.5.2","rehype-highlight":"^7.0.2","@dnd-kit/sortable":"^8.0.0","@dnd-kit/utilities":"^3.2.2","@xterm/addon-webgl":"^0.18.0","@vitejs/plugin-react":"^4.7.0","@testing-library/react":"^16.3.2","@types/qrcode-terminal":"^0.12.2","@xterm/addon-unicode11":"^0.8.0","@testing-library/jest-dom":"^6.9.1"},"_npmOperationalInternal":{"tmp":"tmp/open-claude-remote_1.0.5_1773474734831_0.2608450282158572","host":"s3://npm-registry-packages-npm-production"}},"1.0.6":{"name":"@caoruhua/open-claude-remote","version":"1.0.6","keywords":["claude","claude-code","remote","terminal","proxy","mobile"],"author":{"name":"caoruhua"},"license":"MIT","_id":"@caoruhua/open-claude-remote@1.0.6","maintainers":[{"name":"caoruhua","email":"tangzh.tom@gmail.com"}],"homepage":"https://github.com/StephenTowne/open-claude-remote#readme","bugs":{"url":"https://github.com/StephenTowne/open-claude-remote/issues"},"os":["darwin","linux"],"bin":{"claude-remote":"dist/backend/src/cli.js"},"dist":{"shasum":"3ce005d0258312401879ffb76efa975fe138f8cb","tarball":"https://registry.npmjs.org/@caoruhua/open-claude-remote/-/open-claude-remote-1.0.6.tgz","fileCount":275,"integrity":"sha512-/jg9yuh9XjMbpGFd72QiWK8iB29axILh7KCKMfwCsL/OL71x7gGD2rNQ0EVNje3lsv9ZL1o59ZQIajBj8oCmDw==","signatures":[{"sig":"MEYCIQCK1zg45DVuij1WwfE8iiV5+c3scMF8o5RpOw7PrKk9RQIhAIDOi5R/rpyejjWSB6tWPvWcNLxZRQzulIkZeH8+7VOQ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2077498},"main":"./dist/backend/src/index.js","pnpm":{"onlyBuiltDependencies":["esbuild","node-pty"]},"type":"module","types":"./dist/backend/src/index.d.ts","engines":{"node":">=20.0.0"},"gitHead":"aaef347efd16e07215a3369eccf82fd4f7e72a45","imports":{"#shared":"./shared/index.ts"},"scripts":{"dev":"concurrently --kill-others --handle-input -n backend,frontend -c blue,green \"tsx backend/src/index.ts\" \"cd frontend && vite\"","stop":"tsx backend/src/registry/stop-instances.ts","test":"vitest run","build":"tsc && tsc-alias && cd frontend && vite build","clean":"rm -rf dist frontend-dist","start":"node dist/backend/src/index.js","dev:cli":"tsx backend/src/cli.ts","test:unit":"vitest run backend/tests/unit frontend/tests","test:watch":"vitest","test:backend":"vitest run backend/tests","test:frontend":"vitest run frontend/tests","prepublishOnly":"pnpm build","test:integration":"vitest run backend/tests/integration"},"_npmUser":{"name":"caoruhua","email":"tangzh.tom@gmail.com"},"repository":{"url":"git+https://github.com/StephenTowne/open-claude-remote.git","type":"git"},"_npmVersion":"11.6.2","description":"Remote control proxy for Claude Code CLI - control your PC terminal from mobile browser","directories":{},"_nodeVersion":"24.13.0","dependencies":{"ws":"^8.19.0","cors":"^2.8.6","pino":"^9.14.0","cookie":"^1.1.1","express":"^4.22.1","node-pty":"^1.1.0","web-push":"^3.6.7","qrcode-terminal":"^0.12.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","vite":"^6.4.1","jsdom":"^26.1.0","react":"^19.2.4","vitest":"^3.2.4","zustand":"^5.0.11","@types/ws":"^8.18.1","happy-dom":"^20.8.3","react-dom":"^19.2.4","tsc-alias":"^1.8.16","rehype-raw":"^7.0.0","remark-gfm":"^4.0.1","typescript":"^5.9.3","@types/cors":"^2.8.19","@types/node":"^22.19.15","pino-pretty":"^13.1.3","@types/react":"^19.2.14","@xterm/xterm":"^5.5.0","concurrently":"^9.2.1","highlight.js":"^11.11.1","@dnd-kit/core":"^6.3.1","@types/cookie":"^0.6.0","@types/express":"^5.0.6","github-slugger":"^2.0.0","react-markdown":"^10.1.0","@types/web-push":"^3.6.4","@types/react-dom":"^19.2.3","@xterm/addon-fit":"^0.10.0","react-router-dom":"^7.5.2","rehype-highlight":"^7.0.2","@dnd-kit/sortable":"^8.0.0","@dnd-kit/utilities":"^3.2.2","@xterm/addon-webgl":"^0.18.0","@vitejs/plugin-react":"^4.7.0","@testing-library/react":"^16.3.2","@types/qrcode-terminal":"^0.12.2","@xterm/addon-unicode11":"^0.8.0","@testing-library/jest-dom":"^6.9.1"},"_npmOperationalInternal":{"tmp":"tmp/open-claude-remote_1.0.6_1773653847717_0.6361957511384526","host":"s3://npm-registry-packages-npm-production"}},"1.0.7":{"name":"@caoruhua/open-claude-remote","version":"1.0.7","keywords":["claude","claude-code","remote","terminal","proxy","mobile"],"author":{"name":"caoruhua"},"license":"MIT","_id":"@caoruhua/open-claude-remote@1.0.7","maintainers":[{"name":"caoruhua","email":"tangzh.tom@gmail.com"}],"homepage":"https://github.com/StephenTowne/open-claude-remote#readme","bugs":{"url":"https://github.com/StephenTowne/open-claude-remote/issues"},"os":["darwin","linux"],"bin":{"claude-remote":"dist/backend/src/cli.js"},"dist":{"shasum":"5810837e9dee73999fead4f9471bd4884aa9cbd0","tarball":"https://registry.npmjs.org/@caoruhua/open-claude-remote/-/open-claude-remote-1.0.7.tgz","fileCount":275,"integrity":"sha512-k5gN7LkkuyEcdGBU1Azh+/oSwQaybYOiGwF8mMorafJgiOOMYzVGgGC+sN1sToPqSp2hzRzZe6HeMvxlXnLbDA==","signatures":[{"sig":"MEUCIENGV4TSjnApOrHzJbwHwLerCOj6ueG3VpME6+Bf1CG3AiEA02uKwd3qNAeaWH0oOu+nvCP0JMpxJ2+WFMpXv4WbXrQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2077498},"main":"./dist/backend/src/index.js","pnpm":{"onlyBuiltDependencies":["esbuild","node-pty"]},"type":"module","types":"./dist/backend/src/index.d.ts","engines":{"node":">=20.0.0"},"gitHead":"0d58d6c77aff4612c16e1cb7361638e282cd9d7e","imports":{"#shared":"./shared/index.ts"},"scripts":{"dev":"concurrently --kill-others --handle-input -n backend,frontend -c blue,green \"tsx backend/src/index.ts\" \"cd frontend && vite\"","stop":"tsx backend/src/registry/stop-instances.ts","test":"vitest run","build":"tsc && tsc-alias && cd frontend && vite build","clean":"rm -rf dist frontend-dist","start":"node dist/backend/src/index.js","dev:cli":"tsx backend/src/cli.ts","test:unit":"vitest run backend/tests/unit frontend/tests","test:watch":"vitest","test:backend":"vitest run backend/tests","test:frontend":"vitest run frontend/tests","prepublishOnly":"pnpm build","test:integration":"vitest run backend/tests/integration"},"_npmUser":{"name":"caoruhua","email":"tangzh.tom@gmail.com"},"repository":{"url":"git+https://github.com/StephenTowne/open-claude-remote.git","type":"git"},"_npmVersion":"11.6.2","description":"Remote control proxy for Claude Code CLI - control your PC terminal from mobile browser","directories":{},"_nodeVersion":"24.13.0","dependencies":{"ws":"^8.19.0","cors":"^2.8.6","pino":"^9.14.0","cookie":"^1.1.1","express":"^4.22.1","node-pty":"^1.1.0","web-push":"^3.6.7","qrcode-terminal":"^0.12.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","vite":"^6.4.1","jsdom":"^26.1.0","react":"^19.2.4","vitest":"^3.2.4","zustand":"^5.0.11","@types/ws":"^8.18.1","happy-dom":"^20.8.3","react-dom":"^19.2.4","tsc-alias":"^1.8.16","rehype-raw":"^7.0.0","remark-gfm":"^4.0.1","typescript":"^5.9.3","@types/cors":"^2.8.19","@types/node":"^22.19.15","pino-pretty":"^13.1.3","@types/react":"^19.2.14","@xterm/xterm":"^5.5.0","concurrently":"^9.2.1","highlight.js":"^11.11.1","@dnd-kit/core":"^6.3.1","@types/cookie":"^0.6.0","@types/express":"^5.0.6","github-slugger":"^2.0.0","react-markdown":"^10.1.0","@types/web-push":"^3.6.4","@types/react-dom":"^19.2.3","@xterm/addon-fit":"^0.10.0","react-router-dom":"^7.5.2","rehype-highlight":"^7.0.2","@dnd-kit/sortable":"^8.0.0","@dnd-kit/utilities":"^3.2.2","@xterm/addon-webgl":"^0.18.0","@vitejs/plugin-react":"^4.7.0","@testing-library/react":"^16.3.2","@types/qrcode-terminal":"^0.12.2","@xterm/addon-unicode11":"^0.8.0","@testing-library/jest-dom":"^6.9.1"},"_npmOperationalInternal":{"tmp":"tmp/open-claude-remote_1.0.7_1773659023850_0.8031146966579941","host":"s3://npm-registry-packages-npm-production"}},"1.0.9":{"name":"@caoruhua/open-claude-remote","version":"1.0.9","keywords":["claude","claude-code","remote","terminal","proxy","mobile"],"author":{"name":"caoruhua"},"license":"MIT","_id":"@caoruhua/open-claude-remote@1.0.9","maintainers":[{"name":"caoruhua","email":"tangzh.tom@gmail.com"}],"homepage":"https://github.com/StephenTowne/open-claude-remote#readme","bugs":{"url":"https://github.com/StephenTowne/open-claude-remote/issues"},"os":["darwin","linux"],"bin":{"claude-remote":"dist/backend/src/cli.js"},"dist":{"shasum":"0f87ebb75773361050d9ae53c928dc39574ce43a","tarball":"https://registry.npmjs.org/@caoruhua/open-claude-remote/-/open-claude-remote-1.0.9.tgz","fileCount":283,"integrity":"sha512-ma6aOFl93dQ6Evr8DQJ1fr2lRoieoy5hQ5QheOn/Fdvs/mYX7Gqe+64/Mh2f2UxMXVykItJynuzSANGIS+Zz6Q==","signatures":[{"sig":"MEQCID6Lspt+6G6zeD74mkJBHRl5UiEp7xn2hOstknN56kkWAiBo1VSomXCz9jjUzDSO/zd43PotBvxrD1I43qE0VF7stQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2101649},"main":"./dist/backend/src/index.js","pnpm":{"onlyBuiltDependencies":["esbuild","node-pty"]},"type":"module","types":"./dist/backend/src/index.d.ts","engines":{"node":">=20.0.0"},"gitHead":"fa9252dfd48b7d0ef274cb8cb3e89375679ba4b1","imports":{"#shared":"./shared/index.ts"},"scripts":{"dev":"concurrently --kill-others --handle-input -n backend,frontend -c blue,green \"tsx backend/src/index.ts\" \"cd frontend && vite\"","stop":"tsx backend/src/registry/stop-instances.ts","test":"vitest run","build":"tsc && tsc-alias && cd frontend && vite build","clean":"rm -rf dist frontend-dist","start":"node dist/backend/src/index.js","dev:cli":"tsx backend/src/cli.ts","test:unit":"vitest run backend/tests/unit frontend/tests","test:watch":"vitest","test:backend":"vitest run backend/tests","test:frontend":"vitest run frontend/tests","prepublishOnly":"pnpm build","test:integration":"vitest run backend/tests/integration"},"_npmUser":{"name":"caoruhua","email":"tangzh.tom@gmail.com"},"repository":{"url":"git+https://github.com/StephenTowne/open-claude-remote.git","type":"git"},"_npmVersion":"11.6.2","description":"Remote control proxy for Claude Code CLI - control your PC terminal from mobile browser","directories":{},"_nodeVersion":"24.13.0","dependencies":{"ws":"^8.19.0","cors":"^2.8.6","pino":"^9.14.0","cookie":"^1.1.1","express":"^4.22.1","node-pty":"^1.1.0","web-push":"^3.6.7","qrcode-terminal":"^0.12.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","vite":"^6.4.1","jsdom":"^26.1.0","react":"^19.2.4","vitest":"^3.2.4","zustand":"^5.0.11","@types/ws":"^8.18.1","happy-dom":"^20.8.3","react-dom":"^19.2.4","tsc-alias":"^1.8.16","rehype-raw":"^7.0.0","remark-gfm":"^4.0.1","typescript":"^5.9.3","@types/cors":"^2.8.19","@types/node":"^22.19.15","pino-pretty":"^13.1.3","@types/react":"^19.2.14","@xterm/xterm":"^5.5.0","concurrently":"^9.2.1","highlight.js":"^11.11.1","@dnd-kit/core":"^6.3.1","@types/cookie":"^0.6.0","@types/express":"^5.0.6","github-slugger":"^2.0.0","react-markdown":"^10.1.0","@types/web-push":"^3.6.4","@types/react-dom":"^19.2.3","@xterm/addon-fit":"^0.10.0","react-router-dom":"^7.5.2","rehype-highlight":"^7.0.2","@dnd-kit/sortable":"^8.0.0","@dnd-kit/utilities":"^3.2.2","@xterm/addon-webgl":"^0.18.0","@vitejs/plugin-react":"^4.7.0","@testing-library/react":"^16.3.2","@types/qrcode-terminal":"^0.12.2","@xterm/addon-unicode11":"^0.8.0","@testing-library/jest-dom":"^6.9.1"},"_npmOperationalInternal":{"tmp":"tmp/open-claude-remote_1.0.9_1773739335297_0.5667213556397612","host":"s3://npm-registry-packages-npm-production"}},"1.3.6":{"name":"@caoruhua/open-claude-remote","version":"1.3.6","keywords":["claude","claude-code","remote","terminal","proxy","mobile"],"author":{"name":"caoruhua"},"license":"MIT","_id":"@caoruhua/open-claude-remote@1.3.6","maintainers":[{"name":"caoruhua","email":"tangzh.tom@gmail.com"}],"os":["darwin","linux"],"bin":{"claude-remote":"dist/backend/src/cli.js"},"npm":{"onlyBuiltDependencies":["esbuild","node-pty"]},"dist":{"shasum":"901ea2a87b2dc701d43f7128e4ca9bcd5c4ca193","tarball":"https://registry.npmjs.org/@caoruhua/open-claude-remote/-/open-claude-remote-1.3.6.tgz","fileCount":292,"integrity":"sha512-nJXochS6r2jd/vaIkj0uQZWGk/NeeJASNugJIIcxQGebX4fSk3NvQK5nQ0ofiMGSF/lIyGUe2JhSGVbjm2qy8w==","signatures":[{"sig":"MEQCIGtLAPjEl08aLNBgNV3xCAa6jaVbnUnc3YJtGp+oqaaYAiBeUx2sd0NFEw2Vi/ztTMEabHTxH/eohQBacs5JmTCv3w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2606618},"main":"./dist/backend/src/index.js","type":"module","types":"./dist/backend/src/index.d.ts","engines":{"node":">=20.0.0"},"gitHead":"66bac43d5cd0f3bc5f22b59da2d237de1a918315","imports":{"#shared":"./shared/index.ts"},"scripts":{"dev":"concurrently --kill-others --handle-input -n backend,frontend -c blue,green \"tsx backend/src/index.ts\" \"cd frontend && vite\"","stop":"tsx backend/src/registry/stop-instances.ts","test":"vitest run","build":"tsc && tsc-alias && cd frontend && vite build","clean":"rm -rf dist frontend-dist","start":"node dist/backend/src/index.js","dev:cli":"tsx backend/src/cli.ts","test:unit":"vitest run backend/tests/unit frontend/tests","test:watch":"vitest","publish:npm":"bash scripts/publish-npm.sh","test:backend":"vitest run backend/tests","test:frontend":"vitest run frontend/tests","prepublishOnly":"npm run build","publish:npm:dry":"bash scripts/publish-npm.sh --dry-run","test:integration":"vitest run backend/tests/integration"},"_npmUser":{"name":"caoruhua","email":"tangzh.tom@gmail.com"},"repository":{"url":"https://code.alipay.com/antlandscape/claude-remote.git","type":"git"},"_npmVersion":"11.6.2","description":"Remote control proxy for Claude Code CLI - control your PC terminal from mobile browser","directories":{},"_nodeVersion":"24.13.0","dependencies":{"ws":"^8.19.0","cors":"^2.8.6","pino":"^9.14.0","cookie":"^1.1.1","express":"^4.22.1","node-pty":"^1.1.0","web-push":"^3.6.7","pdfjs-dist":"^4.10.38","qrcode-terminal":"^0.12.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","vite":"^6.4.1","jsdom":"^26.1.0","react":"^19.2.4","vitest":"^3.2.4","zustand":"^5.0.11","@types/ws":"^8.18.1","happy-dom":"^20.8.3","react-dom":"^19.2.4","tsc-alias":"^1.8.16","rehype-raw":"^7.0.0","remark-gfm":"^4.0.1","typescript":"^5.9.3","@types/cors":"^2.8.19","@types/node":"^22.19.15","pino-pretty":"^13.1.3","@types/react":"^19.2.14","@xterm/xterm":"^5.5.0","concurrently":"^9.2.1","highlight.js":"^11.11.1","@dnd-kit/core":"^6.3.1","@types/cookie":"^0.6.0","@types/express":"^5.0.6","github-slugger":"^2.0.0","react-markdown":"^10.1.0","@types/web-push":"^3.6.4","@types/react-dom":"^19.2.3","@xterm/addon-fit":"^0.10.0","react-router-dom":"^7.5.2","rehype-highlight":"^7.0.2","@dnd-kit/sortable":"^8.0.0","@dnd-kit/utilities":"^3.2.2","@xterm/addon-webgl":"^0.18.0","@testing-library/dom":"^10.0.0","@vitejs/plugin-react":"^4.7.0","@testing-library/react":"^16.3.2","@types/qrcode-terminal":"^0.12.2","@xterm/addon-unicode11":"^0.8.0","@testing-library/jest-dom":"^6.9.1"},"_npmOperationalInternal":{"tmp":"tmp/open-claude-remote_1.3.6_1775482559129_0.4719509823221293","host":"s3://npm-registry-packages-npm-production"}},"1.3.7":{"name":"@caoruhua/open-claude-remote","version":"1.3.7","keywords":["claude","claude-code","remote","terminal","proxy","mobile"],"author":{"name":"caoruhua"},"license":"MIT","_id":"@caoruhua/open-claude-remote@1.3.7","maintainers":[{"name":"caoruhua","email":"tangzh.tom@gmail.com"}],"os":["darwin","linux"],"bin":{"claude-remote":"dist/backend/src/cli.js"},"npm":{"onlyBuiltDependencies":["esbuild","node-pty"]},"dist":{"shasum":"6dd436bc37b67ec39445f4e90846c6db4f2dcddf","tarball":"https://registry.npmjs.org/@caoruhua/open-claude-remote/-/open-claude-remote-1.3.7.tgz","fileCount":292,"integrity":"sha512-0maMVlHlGv5rj7a9G5h3rngokEh8totEwyFOs0w4EyyExtEMtGB7A7oMvaOPUUEMfUKaQJgK94HfGErwHdquAw==","signatures":[{"sig":"MEUCIQD7/0WTJ9Hugf43C3A9jKushDTC8d7IZQnZ92kvdKbiPQIgAxINz3ZFeVT/mSOf0OZkLN94n2YEStEP55sDHovZgbk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2609045},"main":"./dist/backend/src/index.js","type":"module","types":"./dist/backend/src/index.d.ts","engines":{"node":">=20.0.0"},"gitHead":"9b312436ad1aee59b406266b5267b748b733b872","imports":{"#shared":"./shared/index.ts"},"scripts":{"dev":"concurrently --kill-others --handle-input -n backend,frontend -c blue,green \"tsx backend/src/index.ts\" \"cd frontend && vite\"","stop":"tsx backend/src/registry/stop-instances.ts","test":"vitest run","build":"tsc && tsc-alias && cd frontend && vite build","clean":"rm -rf dist frontend-dist","start":"node dist/backend/src/index.js","dev:cli":"tsx backend/src/cli.ts","test:unit":"vitest run backend/tests/unit frontend/tests","test:watch":"vitest","publish:npm":"bash scripts/publish-npm.sh","test:backend":"vitest run backend/tests","test:frontend":"vitest run frontend/tests","prepublishOnly":"npm run build","publish:npm:dry":"bash scripts/publish-npm.sh --dry-run","test:integration":"vitest run backend/tests/integration"},"_npmUser":{"name":"caoruhua","email":"tangzh.tom@gmail.com"},"repository":{"url":"https://code.alipay.com/antlandscape/claude-remote.git","type":"git"},"_npmVersion":"11.6.2","description":"Remote control proxy for Claude Code CLI - control your PC terminal from mobile browser","directories":{},"_nodeVersion":"24.13.0","dependencies":{"ws":"^8.19.0","cors":"^2.8.6","pino":"^9.14.0","cookie":"^1.1.1","express":"^4.22.1","node-pty":"^1.1.0","web-push":"^3.6.7","pdfjs-dist":"^4.10.38","qrcode-terminal":"^0.12.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","vite":"^6.4.1","jsdom":"^26.1.0","react":"^19.2.4","vitest":"^3.2.4","zustand":"^5.0.11","@types/ws":"^8.18.1","happy-dom":"^20.8.3","react-dom":"^19.2.4","tsc-alias":"^1.8.16","rehype-raw":"^7.0.0","remark-gfm":"^4.0.1","typescript":"^5.9.3","@types/cors":"^2.8.19","@types/node":"^22.19.15","pino-pretty":"^13.1.3","@types/react":"^19.2.14","@xterm/xterm":"^5.5.0","concurrently":"^9.2.1","highlight.js":"^11.11.1","@dnd-kit/core":"^6.3.1","@types/cookie":"^0.6.0","@types/express":"^5.0.6","github-slugger":"^2.0.0","react-markdown":"^10.1.0","@types/web-push":"^3.6.4","@types/react-dom":"^19.2.3","@xterm/addon-fit":"^0.10.0","react-router-dom":"^7.5.2","rehype-highlight":"^7.0.2","@dnd-kit/sortable":"^8.0.0","@dnd-kit/utilities":"^3.2.2","@xterm/addon-webgl":"^0.18.0","@testing-library/dom":"^10.0.0","@vitejs/plugin-react":"^4.7.0","@testing-library/react":"^16.3.2","@types/qrcode-terminal":"^0.12.2","@xterm/addon-unicode11":"^0.8.0","@testing-library/jest-dom":"^6.9.1"},"_npmOperationalInternal":{"tmp":"tmp/open-claude-remote_1.3.7_1775486782347_0.16073874675408462","host":"s3://npm-registry-packages-npm-production"}},"1.4.0":{"name":"@caoruhua/open-claude-remote","version":"1.4.0","description":"Remote control proxy for Claude Code CLI - control your PC terminal from mobile browser","keywords":["claude","claude-code","remote","terminal","proxy","mobile"],"author":{"name":"caoruhua"},"license":"MIT","repository":{"type":"git","url":"https://code.alipay.com/antlandscape/claude-remote.git"},"type":"module","main":"./dist/backend/src/index.js","types":"./dist/backend/src/index.d.ts","bin":{"claude-remote":"dist/backend/src/cli.js"},"imports":{"#shared":"./shared/index.ts"},"scripts":{"dev":"concurrently --kill-others --handle-input -n backend,frontend -c blue,green \"tsx backend/src/index.ts\" \"cd frontend && vite\"","dev:cli":"tsx backend/src/cli.ts","build":"tsc && tsc-alias && cd frontend && vite build","start":"node dist/backend/src/index.js","test":"vitest run","test:unit":"vitest run backend/tests/unit frontend/tests","test:integration":"vitest run backend/tests/integration","test:backend":"vitest run backend/tests","test:frontend":"vitest run frontend/tests","test:watch":"vitest","stop":"tsx backend/src/registry/stop-instances.ts","clean":"rm -rf dist frontend-dist","publish:npm":"bash scripts/publish-npm.sh","publish:npm:dry":"bash scripts/publish-npm.sh --dry-run","prepublishOnly":"npm run build"},"dependencies":{"cookie":"^1.1.1","cors":"^2.8.6","express":"^4.22.1","node-pty":"^1.1.0","pdfjs-dist":"^4.10.38","pino":"^9.14.0","qrcode-terminal":"^0.12.0","web-push":"^3.6.7","ws":"^8.19.0"},"devDependencies":{"@dnd-kit/core":"^6.3.1","@dnd-kit/sortable":"^8.0.0","@dnd-kit/utilities":"^3.2.2","@testing-library/dom":"^10.0.0","@testing-library/jest-dom":"^6.9.1","@testing-library/react":"^16.3.2","@types/cookie":"^0.6.0","@types/cors":"^2.8.19","@types/express":"^5.0.6","@types/node":"^22.19.15","@types/qrcode-terminal":"^0.12.2","@types/react":"^19.2.14","@types/react-dom":"^19.2.3","@types/web-push":"^3.6.4","@types/ws":"^8.18.1","@vitejs/plugin-react":"^4.7.0","@xterm/addon-fit":"^0.10.0","@xterm/addon-unicode11":"^0.8.0","@xterm/addon-webgl":"^0.18.0","@xterm/xterm":"^5.5.0","concurrently":"^9.2.1","github-slugger":"^2.0.0","happy-dom":"^20.8.3","highlight.js":"^11.11.1","jsdom":"^26.1.0","pino-pretty":"^13.1.3","react":"^19.2.4","react-dom":"^19.2.4","react-markdown":"^10.1.0","react-router-dom":"^7.5.2","rehype-highlight":"^7.0.2","rehype-raw":"^7.0.0","remark-gfm":"^4.0.1","tsc-alias":"^1.8.16","tsx":"^4.21.0","typescript":"^5.9.3","vite":"^6.4.1","vitest":"^3.2.4","zustand":"^5.0.11"},"engines":{"node":">=20.0.0"},"os":["darwin","linux"],"npm":{"onlyBuiltDependencies":["esbuild","node-pty"]},"gitHead":"9d81162207c1c3e069a67da05a0d00fe07183db1","_id":"@caoruhua/open-claude-remote@1.4.0","_nodeVersion":"24.13.0","_npmVersion":"11.6.2","dist":{"integrity":"sha512-7N6PS8S6mta38Y4ErW9Am0G/z9ruDwNL7Od2kKWJ5iByBJbTMUyt4r4AsyJmGn+PYT4lIIvo75iusz6da9uc6w==","shasum":"f3d8bd7ea70470d5d5ba21969d58e6778aa56b3a","tarball":"https://registry.npmjs.org/@caoruhua/open-claude-remote/-/open-claude-remote-1.4.0.tgz","fileCount":292,"unpackedSize":2621581,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIEFa7ryktRDjCrHBZPrWadgqAnU1zB4u4DuLpXChi/SlAiEA0uy3afnImtzclJqT33cToJ+jo2CTybJ1Gq84Pc5t96Q="}]},"_npmUser":{"name":"caoruhua","email":"tangzh.tom@gmail.com"},"directories":{},"maintainers":[{"name":"caoruhua","email":"tangzh.tom@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/open-claude-remote_1.4.0_1775544948923_0.6726811095631311"},"_hasShrinkwrap":false}},"time":{"created":"2026-03-03T13:33:23.178Z","modified":"2026-04-07T06:55:49.228Z","0.1.0":"2026-03-03T13:33:23.448Z","0.1.3":"2026-03-05T14:50:19.867Z","0.1.4":"2026-03-05T15:11:40.463Z","0.1.5":"2026-03-06T08:59:56.545Z","0.1.6":"2026-03-06T15:27:52.882Z","0.1.7":"2026-03-06T15:35:53.993Z","0.2.3":"2026-03-07T03:57:58.397Z","0.2.4":"2026-03-07T10:23:54.071Z","0.3.0":"2026-03-07T17:22:40.578Z","0.3.4":"2026-03-08T14:23:31.598Z","0.3.6":"2026-03-09T13:16:26.462Z","0.3.7":"2026-03-09T13:27:09.352Z","1.0.0":"2026-03-12T14:24:16.586Z","1.0.4":"2026-03-13T13:04:50.343Z","1.0.5":"2026-03-14T07:52:15.051Z","1.0.6":"2026-03-16T09:37:27.909Z","1.0.7":"2026-03-16T11:03:44.033Z","1.0.9":"2026-03-17T09:22:15.521Z","1.3.6":"2026-04-06T13:35:59.347Z","1.3.7":"2026-04-06T14:46:22.547Z","1.4.0":"2026-04-07T06:55:49.119Z"},"author":{"name":"caoruhua"},"license":"MIT","keywords":["claude","claude-code","remote","terminal","proxy","mobile"],"repository":{"type":"git","url":"https://code.alipay.com/antlandscape/claude-remote.git"},"description":"Remote control proxy for Claude Code CLI - control your PC terminal from mobile browser","maintainers":[{"name":"caoruhua","email":"tangzh.tom@gmail.com"}],"readme":"# Claude Code Remote\n\n**Control Claude Code from your mobile browser over LAN.**\n\n[English](#english) | [中文](#中文)\n\n---\n\n<a name=\"english\"></a>\n## English\n\n**Control Claude Code from your mobile browser over LAN.**\n\nView terminal output, send commands, and approve tool calls from your phone — keep working even when you step away from your desktop.\n\n---\n\n## Quick Start\n\n### 1. Install\n\n```bashs\n# tnpm (recommended)\ntnpm install -g @alipay/open-claude-remote\n```\n\n### 2. Run\n\n```bash\nclaude-remote\n```\n\n### 3. Connect\n\nScan the QR code shown in your terminal with your phone. The auth token is auto-filled — you're ready to go.\n\n> Ensure Claude CLI is installed before running. See [Claude Code installation guide](https://docs.anthropic.com/en/docs/claude-code).\n\n---\n\n## Features\n\n### Terminal Sync\n- Real-time terminal output streamed to your phone\n- Full ANSI color rendering via xterm.js\n- 50K-line scrollback buffer, auto-restored on reconnect\n- **Multi-network support** — displays all available IPs (WiFi, VPN, Ethernet) on startup\n- LAN IP change notification with new connection URL\n- Smart auto-scroll with a \"scroll to bottom\" floating button — respects your scroll position when browsing history\n- **Tap-to-focus** — clicking anywhere in the terminal automatically focuses the input bar for a seamless typing experience\n- **Long-press to copy** — long-press the terminal to open a copy menu: \"Select Copy\" enters a plain text view for native text selection, \"Copy All\" copies the entire terminal output to clipboard\n\n### Multi-Network Access (WiFi + VPN)\n\nAccess Claude Code Remote from multiple network interfaces simultaneously:\n\n- **Automatic network detection** — discovers all available IPv4 interfaces on startup\n- **VPN support** — detects common VPN interfaces (WireGuard, Tailscale, ZeroTier, PPP, etc.)\n- **Custom CIDR ranges** — configure `customPrivateRanges` to add company-specific networks\n- **Network change notifications** — WebSocket `network_changed` events notify clients when interfaces change\n- **Unified CORS** — all detected IPs are automatically added to the CORS allowlist\n\nExample: When connected to both WiFi (192.168.x.x) and company VPN (30.x.x.x), both addresses are displayed on startup and accessible via the web UI.\n\n### Quick Actions\n- One-tap keys: Esc, Enter, Tab, arrows, Shift+Tab\n- Custom shortcuts (configurable in settings)\n- Preset commands (/clear, /compact, /resume, etc.)\n\n### First-time Guide\n- Interactive spotlight guide on first visit\n- Highlights key UI elements with coach marks\n- Auto-skips on subsequent visits\n\n### Markdown File Viewer\n- **Floating access** — tap the floating 📄 button in the top-right corner (below instance tabs) to browse all Markdown files (auto-refreshes every 5 seconds)\n- **Draggable position** — drag the button to reposition it anywhere on screen\n- **Long-press to hide** — press and hold the button to hide it (refresh to restore, or use Settings > Display)\n- **One-tap preview** — select a file to navigate to the Markdown viewer (browser back button returns to terminal)\n- **GFM rendering** — supports GitHub Flavored Markdown (tables, task lists, strikethrough)\n- **HTML rendering** — supports inline HTML tags (`<span style=\"color: red\">`, `<sub>`, `<sup>`, `<mark>`, etc.)\n- **Image enhancements** — lazy loading, click to preview (pinch zoom, double-tap to scale, swipe to close)\n- **Mobile-optimized** — 16px font size, 1.75 line height, 44px touch targets, horizontal scroll for code blocks\n- **Code highlighting** — syntax highlighting for code blocks using highlight.js\n- **Table of contents** — mobile: bottom drawer; desktop: right sidebar\n- **Reduced motion support** — respects `prefers-reduced-motion` accessibility setting\n- **Security** — only files within allowed workspace directories can be viewed\n\n### Image Viewer\n- **Browse from file selector** — open any image from the file browser to view it in full-screen mode\n- **Navigate between images** — swipe left/right or tap navigation arrows to browse all images in the current directory\n- **Keyboard navigation** — use ← → arrow keys to navigate between images\n- **Edge tap zones** — tap the left/right 15% of the screen to quickly go to previous/next image\n- **Zoom & pan** — double-tap to zoom, pinch gesture on mobile, drag to pan when zoomed in\n- **Contextual browsing** — navigation only shows images matching current filters (search, category, directory)\n- **Boundary indicators** — prev/next buttons disabled on first/last image with visual feedback\n\n### Multi-Instance\n- Run multiple `claude-remote` instances simultaneously in a single daemon process\n- Fixed port 8866 — all instances share same origin, no cross-port auth needed\n- Browser tab bar for switching — no re-authentication needed\n- Auto-switch when an instance goes offline\n- Spawn new instances from the web UI (\"+\" button)\n- Copy instance via long-press/right-click tab — pre-fills working directory, settings, and arguments\n- Rename instance via long-press/right-click tab — update instance display name on the fly\n- Close instance via long-press/right-click tab — terminate with confirmation dialog\n- `claude-remote attach <name|id>` to take over a web-spawned instance\n- `claude-remote stop` to stop the daemon and all instances\n\n### Window Resize Priority\n\nWhen multiple clients are connected, window size is controlled by the **most recently active client**:\n- The last client to connect or send input becomes the active controller\n- When a new client connects, it takes over window size control\n- This allows seamless switching between WebApp, Attach, and local terminal\n\n### Notifications\n\nGet notified when Claude is waiting for input. All notifications include the instance URL so you can quickly reconnect even if the IP changes.\n\n**Web Push** — works even when the browser is in the background or the screen is locked. Just allow notifications when prompted.\n\n**Channel Toggle** — each notification channel has a toggle switch in the settings. Toggle to enable/disable without deleting the configuration. Changes take effect immediately across all running instances.\n\n**DingTalk** — configure a DingTalk bot webhook to receive notifications on your team channel:\n\n```json\n{\n  \"notifications\": {\n    \"dingtalk\": {\n      \"webhookUrl\": \"https://oapi.dingtalk.com/robot/send?access_token=your-token\"\n    }\n  }\n}\n```\n\n> **Note**: Legacy config files with root-level `dingtalk` field are automatically migrated to `notifications.dingtalk` on first load.\n\n**Setup steps:**\n1. Open DingTalk group → Group Settings → Smart Group Assistant → Add Robot → Custom\n2. For security settings, select \"Custom Keywords\" and add `Claude` (the message title includes this keyword)\n3. Copy the Webhook URL to your config file or paste it in the Web UI settings\n\n**WeChat (Server酱³)** — configure Server酱³ to receive notifications on WeChat:\n\n```json\n{\n  \"notifications\": {\n    \"wechat_work\": {\n      \"sendKey\": \"SCTxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\"\n    }\n  }\n}\n```\n\n**Setup steps:**\n1. Visit [Server酱 Sendkey](https://sct.ftqq.com/sendkey) and sign in with WeChat\n2. Copy your SendKey (starts with `SCT`)\n3. Paste it in your config file or in the Web UI settings\n\n---\n\n## Usage\n\n```bash\n# Start Claude Code (starts daemon + first instance)\nclaude-remote\n\n# Pass arguments to Claude\nclaude-remote chat\nclaude-remote -- --dangerously-skip-permissions\n\n# Custom options\nclaude-remote --name my-project\nclaude-remote --token my-secret-token\n\n# Attach to an existing instance\nclaude-remote attach my-project  # by name\nclaude-remote attach 550e8400     # by instance ID prefix\n\n# List all running instances\nclaude-remote list\n\n# Show daemon status (PID, port, uptime, instance count, three-version info)\nclaude-remote status\n\n# Stop the daemon and all instances\nclaude-remote stop\n\n# Restart daemon and restore all instances (with session resume)\nclaude-remote restart\n\n# Headless mode (no local terminal, web UI only)\nclaude-remote --no-terminal\n\n# Check version\nclaude-remote --version\n\n# Update to latest version\nclaude-remote update\n```\n\n### Version Checks\n\n`claude-remote status` displays three versions with actionable advice:\n\n- **Installed** — CLI version on disk\n- **Daemon** — version cached by the running daemon (✓ or \"outdated\")\n- **Latest** — newest version on npm (✓ or \"new\")\n\nOn startup, a background npm check runs without blocking. If a newer version exists, a one-line hint is printed to stderr.\n\nAfter `claude-remote update`, the daemon is automatically restarted if no instances are running. If instances exist, you'll see a reminder to restart manually.\n\n### Stopping\n\n- **Single Ctrl+C** — sent to Claude Code (cancels current task)\n- **Double Ctrl+C** (within 500ms) — stops the proxy server\n\n---\n\n## Configuration\n\nConfig file: `~/.claude-remote/settings.json` (legacy `config.json` is auto-migrated)\n\n| Option | Type | Default | Description |\n|--------|------|---------|-------------|\n| `host` | string | \"0.0.0.0\" | Bind address |\n| `token` | string \\| null | null | Auth token; `null` = auto-generated shared token |\n| `claudeCommand` | string | \"claude\" | Claude CLI path |\n| `claudeArgs` | string[] | [] | Extra Claude CLI arguments (merged with CLI args, deduplicated) |\n| `claudeCwd` | string \\| null | null | Claude working directory; `null` = current dir |\n| `sessionTtlMs` | number | 86400000 | Session TTL in ms (default: 24h) |\n| `authRateLimit` | number | 20 | Auth rate limit (per minute per IP) |\n| `maxBufferLines` | number | 50000 | Output buffer max lines |\n| `instanceName` | string \\| null | (working dir name) | Instance name; defaults to working directory name if not set |\n| `shortcuts` | array | see below | Quick-input buttons |\n| `commands` | array | see below | Custom command buttons |\n| `workspaces` | string[] | [] | Allowed working directories for web-spawned instances |\n| `settingsDirs` | string[] | [\"~/.claude/\", \"~/.claude-remote/settings/\"] | Directories to scan for settings files |\n| `notifications` | object | — | Notification channels config (see below) |\n| `customPrivateRanges` | string[] | [] | Custom CIDR ranges for CORS allowlist (e.g., `[\"30.0.0.0/8\"]` for VPN networks) |\n\n> **Note**: Port is fixed at 8866. All instances run in a single daemon process.\n\n**Environment variable overrides:**\n\n| Variable | Description |\n|----------|-------------|\n| `PORT` | Override the default port (8866). Useful for E2E testing or running multiple daemons. |\n| `AUTH_TOKEN` | Override the auth token (highest priority, above CLI args and config file). |\n| `LOG_DIR` | Override log directory (default: `~/.claude-remote/logs/`) |\n\n**Notification channel config:**\n\n| Field | Type | Default | Description |\n|-------|------|---------|-------------|\n| `webhookUrl` | string | — | DingTalk webhook URL |\n| `sendKey` | string | — | Server酱³ SendKey (WeChat) |\n| `enabled` | boolean | true | Whether the channel is active |\n\n**Priority**: CLI args > config file > defaults (except `claudeArgs` which is merged)\n\n### Project-level Configuration\n\nShortcuts and commands are automatically saved per-project when configured through the Web UI with an active instance:\n\n- Configuration is stored in `<project-dir>/.claude-remote/settings.json`\n- When opening settings from an instance view, `shortcuts` and `commands` changes are saved to the project directory\n- When opening settings without an active instance, changes are saved to the global config (`~/.claude-remote/settings.json`)\n\nThis allows each project to have its own set of commands while sharing global settings like notifications.\n\n### Shortcuts\n\nQuick-input buttons displayed below the terminal.\n\n**Default shortcuts:**\n\n| Key | Data | Description |\n|-----|------|-------------|\n| Esc | `\\u001b` | ESC key |\n| Enter | `\\r` | Enter key |\n| Tab | `\\t` | Tab key |\n| ↑ | `\\u001b[A` | Up arrow |\n| ↓ | `\\u001b[B` | Down arrow |\n| ← | `\\u001b[D` | Left arrow |\n| → | `\\u001b[C` | Right arrow |\n| S-Tab | `\\u001b[Z` | Shift+Tab |\n| Ctrl+O | `\\u000f` | Ctrl+O |\n| Ctrl+E | `\\u0005` | Ctrl+E |\n\n**Custom example:**\n\n```json\n{\n  \"shortcuts\": [\n    { \"label\": \"Yes\", \"data\": \"y\", \"enabled\": true, \"desc\": \"Confirm\" },\n    { \"label\": \"Esc\", \"data\": \"\\u001b\", \"enabled\": true, \"desc\": \"Cancel (ESC)\" },\n    { \"label\": \"Ctrl+C\", \"data\": \"\\u0003\", \"enabled\": true, \"desc\": \"Interrupt\" }\n  ]\n}\n```\n\n| Field | Type | Description |\n|-------|------|-------------|\n| `label` | string | Button display text |\n| `data` | string | Data to send (supports escape sequences like `\\u001b` for ESC) |\n| `enabled` | boolean | Whether the button is active |\n| `desc` | string | Description (optional) |\n\n**Common escape values:**\n- `\\u001b` - ESC\n- `\\r` - Enter\n- `\\u0003` - Ctrl+C\n- `\\u0004` - Ctrl+D\n\n### Commands\n\nCustom command buttons in the shortcut bar.\n\n**Default commands:**\n\n| Command | Description |\n|---------|-------------|\n| /clear | Clear screen |\n| /compact | Compact conversation |\n| /resume | Resume session |\n| /stats | Statistics |\n| /exit | Exit |\n\n**Skills as Commands:**\n\nSkills defined in `~/.claude/skills/*/SKILL.md` or `<project>/.claude/skills/*/SKILL.md` are automatically converted to slash commands. For example, a skill named `finish-task` becomes `/finish-task` in the command bar.\n\n- Skills are scanned on each `/api/config` request\n- Project-level skills override global skills with the same name\n- User modifications (enabled, autoSend) are preserved across scans\n\n**Custom example:**\n\n```json\n{\n  \"commands\": [\n    { \"label\": \"/help\", \"command\": \"/help\", \"enabled\": true },\n    { \"label\": \"Git Status\", \"command\": \"git status\", \"enabled\": true, \"autoSend\": false }\n  ]\n}\n```\n\n| Field | Type | Default | Description |\n|-------|------|---------|-------------|\n| `label` | string | — | Button display text |\n| `command` | string | — | Command to execute |\n| `enabled` | boolean | — | Whether the button is active |\n| `autoSend` | boolean | `true` | `true` = send immediately, `false` = fill input box |\n\n> Commands starting with `/` are Claude Code slash commands. Other commands are executed in the terminal.\n\n### Workspaces\n\nRestrict which directories web-spawned instances can use:\n\n```json\n{\n  \"workspaces\": [\n    \"/home/user/projects/api\",\n    \"/home/user/projects/web\"\n  ]\n}\n```\n\nIf not configured, web-spawned instances can only select projects from existed claude instances\n\n### Settings Files\n\nWhen creating instances from the web UI, you can select a custom settings file to pass via `--settings`. Settings files must:\n\n1. Be named with `settings` prefix (e.g., `settings-project-a.json`, `settings.idea.json`)\n2. Be valid JSON files ending in `.json`\n3. Be located in one of the configured scan directories\n\n**Default scan directories:**\n- `~/.claude/` — Claude Code config directory\n- `~/.claude-remote/settings/` — Claude Remote custom settings\n\n**Custom directories:**\n\n```json\n{\n  \"settingsDirs\": [\n    \"~/.claude/\",\n    \"~/.claude-remote/settings/\",\n    \"~/my-custom-settings/\"\n  ]\n}\n```\n\n**Example settings file** (`~/.claude/settings-project-a.json`):\n\n```json\n{\n  \"env\": {\n    \"ANTHROPIC_BASE_URL\": \"https://api.anthropic.com\"\n  },\n  \"permissions\": {\n    \"allow\": [\"Bash(git:*)\", \"Bash(npm:*)\"]\n  }\n}\n```\n\n> **Note**: Port-numbered JSON files are automatically excluded from the settings file list.\n\n### Complete Example\n\n```json\n{\n  \"host\": \"0.0.0.0\",\n  \"token\": null,\n\n  \"claudeCommand\": \"claude\",\n  \"claudeArgs\": [\"--no-telemetry\"],\n  \"claudeCwd\": null,\n\n  \"sessionTtlMs\": 86400000,\n  \"authRateLimit\": 20,\n  \"maxBufferLines\": 50000,\n  \"instanceName\": null,\n\n  \"shortcuts\": [\n    { \"label\": \"Yes\", \"data\": \"y\", \"enabled\": true },\n    { \"label\": \"Esc\", \"data\": \"\\u001b\", \"enabled\": true },\n    { \"label\": \"Enter\", \"data\": \"\\r\", \"enabled\": true },\n    { \"label\": \"Ctrl+C\", \"data\": \"\\u0003\", \"enabled\": true }\n  ],\n\n  \"commands\": [\n    { \"label\": \"Git Status\", \"command\": \"git status\", \"enabled\": true },\n    { \"label\": \"Git Log\", \"command\": \"git log --oneline -10\", \"enabled\": true }\n  ],\n\n  \"workspaces\": [\n    \"/home/user/projects/api\",\n    \"/home/user/projects/web\"\n  ],\n\n  \"notifications\": {\n    \"dingtalk\": {\n      \"webhookUrl\": \"https://oapi.dingtalk.com/robot/send?access_token=your-token\"\n    }\n  }\n}\n```\n\n---\n\n## Security\n\n- **Token auth** — 32-byte random token, generated on first run\n- **Session cookie** — HttpOnly + SameSite=Lax, 24-hour TTL\n- **Network isolation** — binds to LAN IP only, no public exposure\n- **Rate limiting** — 20 auth attempts/min/IP\n- **Hook security** — accepts localhost requests only\n\n---\n\n## Troubleshooting\n\n### `node-pty` build failure\n\nInstall build tools:\n\n| OS | Command |\n|----|---------|\n| macOS | `xcode-select --install` |\n| Ubuntu/Debian | `sudo apt-get install build-essential python3` |\n| Fedora/RHEL | `sudo dnf groupinstall 'Development Tools'` |\n| Arch Linux | `sudo pacman -S base-devel python` |\n\n### QR code won't scan?\n\n1. Make sure your phone and PC are on the same network\n2. Manually open the URL shown in the terminal and enter the token\n\n### Phone can't connect?\n\n1. Check your PC firewall allows port 8866\n2. Verify the URL shows the correct LAN IP\n3. If using a VPN, try setting the `host` option explicitly\n\n---\n\n## Prerequisites\n\n- **Node.js** >= 20\n- **Claude Code CLI** — [installation guide](https://docs.anthropic.com/en/docs/claude-code)\n\n### Optional Dependencies\n\n- **LibreOffice** — Required for viewing PPTX files in the browser. The app will prompt you with installation instructions if you try to open a PPTX file without it.\n  - macOS: `brew install --cask libreoffice`\n  - Ubuntu/Debian: `sudo apt-get install -y libreoffice`\n  - Fedora/RHEL: `sudo dnf install -y libreoffice`\n\n---\n\n## Development\n\n**Source development:**\n\n```bash\n# Clone and install\ngit clone https://github.com/StephenTowne/open-claude-remote.git\ncd open-claude-remote\ntnpm install\n\n# Development mode (with hot reload)\ntnpm dev:cli\n\n# Production mode\ntnpm run build && npm link && claude-remote\n```\n\n**Project structure:**\n\n- Backend: `backend/src/` (Express + node-pty + WebSocket)\n- Frontend: `frontend/src/` (React + xterm.js)\n- Shared types: `shared/` (imported via `#shared` alias)\n- Tests: `tnpm test` (Vitest)\n- Build: `tnpm run build` (TypeScript + Vite)\n\n### Stop all instances\n\n```bash\ntnpm stop\n```\n\n---\n\n## License\n\nMIT\n\n---\n---\n\n<a name=\"中文\"></a>\n## 中文\n\n**通过局域网在手机浏览器中控制 Claude Code。**\n\n在手机上查看终端输出、发送命令、审批工具调用 — 即使离开桌面也能继续工作。\n\n---\n\n## 快速开始\n\n### 1. 安装\n\n```bash\n# tnpm（推荐）\ntnpm install -g @alipay/open-claude-remote\n```\n\n### 2. 运行\n\n```bash\nclaude-remote\n```\n\n### 3. 连接\n\n用手机扫描终端显示的二维码。认证令牌自动填充 — 就可以开始使用了。\n\n> 运行前请确保已安装 Claude CLI。参见 [Claude Code 安装指南](https://docs.anthropic.com/en/docs/claude-code)。\n\n---\n\n## 功能特性\n\n### 终端同步\n- 实时终端输出推送到手机\n- 通过 xterm.js 完整渲染 ANSI 颜色\n- 5万行滚动缓冲区，重连时自动恢复\n- **多网络支持** — 启动时显示所有可用 IP（WiFi、VPN、以太网）\n- 局域网 IP 变更通知，附带新连接地址\n- 智能自动滚动，配有\"滚动到底部\"悬浮按钮 — 浏览历史时尊重你的滚动位置\n- **点击聚焦** — 点击终端任意位置自动聚焦输入框，打字体验更流畅\n- **长按复制** — 长按终端区域弹出复制菜单：「选择复制」进入纯文本视图可原生选择文字，「复制全部」一键复制全部终端内容到剪贴板\n\n### 多网络访问（WiFi + VPN）\n\n同时从多个网络接口访问 Claude Code Remote：\n\n- **自动网络检测** — 启动时自动发现所有可用的 IPv4 接口\n- **VPN 支持** — 自动识别常见 VPN 接口（WireGuard、Tailscale、ZeroTier、PPP 等）\n- **自定义 CIDR 网段** — 配置 `customPrivateRanges` 添加公司特定网络\n- **网络变更通知** — WebSocket `network_changed` 事件在接口变化时通知客户端\n- **统一 CORS** — 所有检测到的 IP 自动添加到 CORS 白名单\n\n示例：当同时连接 WiFi（192.168.x.x）和公司 VPN（30.x.x.x）时，启动时会显示两个地址，都可以通过 Web UI 访问。\n\n### 快捷操作\n- 一键发送：Esc、Enter、Tab、方向键、Shift+Tab\n- 自定义快捷键（设置中配置）\n- 预设命令（/clear、/compact、/resume 等）\n\n### 新手引导\n- 首次访问时显示交互式高亮引导\n- 聚焦关键 UI 元素并显示提示标记\n- 后续访问自动跳过\n\n### Markdown 文件查看器\n- **悬浮按钮访问** — 点击右上角的悬浮 📄 按钮（实例标签栏下方）浏览所有 Markdown 文件（每 5 秒自动刷新）\n- **拖拽定位** — 可拖动按钮到屏幕任意位置\n- **长按隐藏** — 长按按钮可隐藏（刷新页面恢复，或通过设置>显示重新开启）\n- **一键预览** — 选择文件后导航到 Markdown 查看器（浏览器返回按钮回到终端）\n- **GFM 渲染** — 支持 GitHub 风格 Markdown（表格、任务列表、删除线）\n- **HTML 渲染** — 支持内联 HTML 标签（`<span style=\"color: red\">`、`<sub>`、`<sup>`、`<mark>` 等）\n- **图片增强** — 懒加载、点击预览（捏合缩放、双击放大、滑动关闭）\n- **移动端优化** — 16px 字体、1.75 行高、44px 触摸目标、代码块横向滚动\n- **代码高亮** — 使用 highlight.js 为代码块提供语法高亮\n- **目录导航** — 移动端：底部抽屉；桌面端：右侧边栏\n- **减少动画支持** — 尊重 `prefers-reduced-motion` 无障碍设置\n- **安全限制** — 仅允许查看工作目录白名单内的文件\n\n### 图片查看器\n- **从文件浏览器打开** — 在文件浏览器中打开任意图片，全屏查看\n- **图片间导航** — 左右滑动或点击导航箭头浏览当前目录下的所有图片\n- **键盘导航** — 使用 ← → 方向键在图片间切换\n- **边缘点击区域** — 点击屏幕左/右 15% 区域快速切换上一张/下一张\n- **缩放与拖动** — 双击缩放、移动端捏合手势、放大后可拖动查看\n- **上下文浏览** — 导航仅显示符合当前筛选条件的图片（搜索、分类、目录）\n- **边界提示** — 首张/末张图片时禁用上一张/下一张按钮并显示视觉反馈\n\n### 多实例支持\n- 在单个守护进程中同时运行多个 `claude-remote` 实例\n- 固定端口 8866 — 所有实例共享同源，无需跨端口认证\n- 浏览器标签栏切换 — 无需重新认证\n- 实例离线时自动切换\n- 从 Web UI 生成新实例（\"+\" 按钮）\n- 长按/右键标签复制实例 — 预填充工作目录、设置和参数\n- 长按/右键标签重命名实例 — 实时更新实例显示名称\n- 长按/右键标签关闭实例 — 确认后终止实例\n- `claude-remote attach <名称|ID>` 接管 Web 生成的实例\n- `claude-remote stop` 停止守护进程和所有实例\n\n### 窗口大小优先级\n\n当多个客户端连接时，窗口大小由**最后活跃的客户端**控制：\n- 最后连接或发送输入的客户端成为活跃控制方\n- 新客户端连接时会接管窗口大小控制\n- 这允许 WebApp、Attach 和本地终端之间无缝切换\n\n### 通知\n\n当 Claude 等待输入时收到通知。所有通知都包含实例 URL，即使 IP 变更也能快速重连。\n\n**Web 推送** — 即使浏览器在后台或屏幕锁定也能工作。只需在提示时允许通知即可。\n\n**渠道开关** — 每个通知渠道在设置中都有开关。切换即可启用/禁用，无需删除配置。更改立即生效于所有运行中的实例。\n\n**钉钉** — 配置钉钉机器人 webhook，在团队群中接收通知：\n\n```json\n{\n  \"notifications\": {\n    \"dingtalk\": {\n      \"webhookUrl\": \"https://oapi.dingtalk.com/robot/send?access_token=your-token\"\n    }\n  }\n}\n```\n\n> **注意**：旧版配置文件中的根级 `dingtalk` 字段会在首次加载时自动迁移到 `notifications.dingtalk`。\n\n**设置步骤：**\n1. 打开钉钉群 → 群设置 → 智能群助手 → 添加机器人 → 自定义\n2. 安全设置选择\"自定义关键词\"，添加 `Claude`（消息标题包含此关键词）\n3. 将 Webhook URL 复制到配置文件或粘贴到 Web UI 设置中\n\n**微信（Server酱³）** — 配置 Server酱³ 在微信中接收通知：\n\n```json\n{\n  \"notifications\": {\n    \"wechat_work\": {\n      \"sendKey\": \"SCTxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\"\n    }\n  }\n}\n```\n\n**设置步骤：**\n1. 访问 [Server酱 Sendkey](https://sct.ftqq.com/sendkey) 并用微信登录\n2. 复制你的 SendKey（以 `SCT` 开头）\n3. 粘贴到配置文件或 Web UI 设置中\n\n---\n\n## 使用方法\n\n```bash\n# 启动 Claude Code（启动守护进程 + 第一个实例）\nclaude-remote\n\n# 向 Claude 传递参数\nclaude-remote chat\nclaude-remote -- --dangerously-skip-permissions\n\n# 自定义选项\nclaude-remote --name my-project\nclaude-remote --token my-secret-token\n\n# 附加到现有实例\nclaude-remote attach my-project  # 按名称\nclaude-remote attach 550e8400     # 按实例 ID 前缀\n\n# 列出所有运行中的实例\nclaude-remote list\n\n# 显示守护进程状态（PID、端口、运行时间、实例数、三版本信息）\nclaude-remote status\n\n# 停止守护进程和所有实例\nclaude-remote stop\n\n# 重启守护进程并恢复所有实例（支持会话恢复）\nclaude-remote restart\n\n# 无头模式（无本地终端，仅 Web UI）\nclaude-remote --no-terminal\n\n# 查看版本\nclaude-remote --version\n\n# 更新到最新版本\nclaude-remote update\n```\n\n### 版本检查\n\n`claude-remote status` 显示三个版本及操作建议：\n\n- **Installed** — 磁盘上的 CLI 版本\n- **Daemon** — 运行中 daemon 缓存的版本（✓ 或 \"outdated\"）\n- **Latest** — npm 上的最新版本（✓ 或 \"new\"）\n\n启动时会后台检查 npm 新版本（不阻塞），如有更新会在 stderr 输出一行提示。\n\n执行 `claude-remote update` 后，如果没有运行中的实例，守护进程会自动重启。如有实例运行，会提示手动重启。\n\n### 停止运行\n\n- **单次 Ctrl+C** — 发送给 Claude Code（取消当前任务）\n- **双次 Ctrl+C**（500毫秒内）— 停止代理服务器\n\n---\n\n## 配置\n\n配置文件：`~/.claude-remote/settings.json`（旧版 `config.json` 会自动迁移）\n\n| 选项 | 类型 | 默认值 | 说明 |\n|------|------|--------|------|\n| `host` | string | \"0.0.0.0\" | 绑定地址 |\n| `token` | string \\| null | null | 认证令牌；`null` = 自动生成的共享令牌 |\n| `claudeCommand` | string | \"claude\" | Claude CLI 路径 |\n| `claudeArgs` | string[] | [] | 额外的 Claude CLI 参数（与 CLI 参数合并，去重） |\n| `claudeCwd` | string \\| null | null | Claude 工作目录；`null` = 当前目录 |\n| `sessionTtlMs` | number | 86400000 | 会话 TTL（毫秒，默认 24 小时） |\n| `authRateLimit` | number | 20 | 认证速率限制（每分钟每 IP） |\n| `maxBufferLines` | number | 50000 | 输出缓冲区最大行数 |\n| `instanceName` | string \\| null | 工作目录名 | 实例名称；未设置时默认为工作目录名 |\n| `shortcuts` | array | 见下文 | 快捷输入按钮 |\n| `commands` | array | 见下文 | 自定义命令按钮 |\n| `workspaces` | string[] | [] | Web 生成实例允许的工作目录 |\n| `settingsDirs` | string[] | [\"~/.claude/\", \"~/.claude-remote/settings/\"] | 设置文件扫描目录 |\n| `notifications` | object | — | 通知渠道配置（见下文） |\n| `customPrivateRanges` | string[] | [] | CORS 白名单的自定义 CIDR 网段（如 `[\"30.0.0.0/8\"]` 用于 VPN 网络） |\n\n> **注意**：端口固定为 8866。所有实例运行在单个守护进程中。\n\n**环境变量覆盖：**\n\n| 变量 | 说明 |\n|------|------|\n| `PORT` | 覆盖默认端口（8866）。用于 E2E 测试或运行多个守护进程。 |\n| `AUTH_TOKEN` | 覆盖认证 Token（最高优先级，高于 CLI 参数和配置文件）。 |\n| `LOG_DIR` | 覆盖日志目录（默认：`~/.claude-remote/logs/`） |\n\n**通知渠道配置：**\n\n| 字段 | 类型 | 默认值 | 说明 |\n|------|------|--------|------|\n| `webhookUrl` | string | — | 钉钉 webhook URL |\n| `sendKey` | string | — | Server酱³ SendKey（微信） |\n| `enabled` | boolean | true | 渠道是否启用 |\n\n**优先级**：CLI 参数 > 配置文件 > 默认值（`claudeArgs` 除外，它是合并的）\n\n### 项目级配置\n\n通过 Web UI 配置时，快捷键和命令会自动按项目保存：\n\n- 配置存储在 `<项目目录>/.claude-remote/settings.json`\n- 从实例视图打开设置时，`shortcuts` 和 `commands` 的变更会保存到项目目录\n- 没有活跃实例时打开设置，变更会保存到全局配置（`~/.claude-remote/settings.json`）\n\n这样每个项目可以有自己的一组命令，同时共享通知等全局设置。\n\n### 快捷键\n\n终端下方显示的快捷输入按钮。\n\n**默认快捷键：**\n\n| 按键 | 数据 | 说明 |\n|------|------|------|\n| Esc | `\\u001b` | ESC 键 |\n| Enter | `\\r` | 回车键 |\n| Tab | `\\t` | Tab 键 |\n| ↑ | `\\u001b[A` | 上箭头 |\n| ↓ | `\\u001b[B` | 下箭头 |\n| ← | `\\u001b[D` | 左箭头 |\n| → | `\\u001b[C` | 右箭头 |\n| S-Tab | `\\u001b[Z` | Shift+Tab |\n| Ctrl+O | `\\u000f` | Ctrl+O |\n| Ctrl+E | `\\u0005` | Ctrl+E |\n\n**自定义示例：**\n\n```json\n{\n  \"shortcuts\": [\n    { \"label\": \"Yes\", \"data\": \"y\", \"enabled\": true, \"desc\": \"确认\" },\n    { \"label\": \"Esc\", \"data\": \"\\u001b\", \"enabled\": true, \"desc\": \"取消 (ESC)\" },\n    { \"label\": \"Ctrl+C\", \"data\": \"\\u0003\", \"enabled\": true, \"desc\": \"中断\" }\n  ]\n}\n```\n\n| 字段 | 类型 | 说明 |\n|------|------|------|\n| `label` | string | 按钮显示文本 |\n| `data` | string | 发送的数据（支持转义序列，如 `\\u001b` 表示 ESC） |\n| `enabled` | boolean | 按钮是否启用 |\n| `desc` | string | 描述（可选） |\n\n**常用转义值：**\n- `\\u001b` - ESC\n- `\\r` - 回车\n- `\\u0003` - Ctrl+C\n- `\\u0004` - Ctrl+D\n\n### 命令\n\n快捷栏中的自定义命令按钮。\n\n**默认命令：**\n\n| 命令 | 说明 |\n|------|------|\n| /clear | 清屏 |\n| /compact | 压缩对话 |\n| /resume | 恢复会话 |\n| /stats | 统计信息 |\n| /exit | 退出 |\n\n**Skill 自动转换为命令：**\n\n定义在 `~/.claude/skills/*/SKILL.md` 或 `<项目>/.claude/skills/*/SKILL.md` 中的 Skill 会自动转换为斜杠命令。例如，名为 `finish-task` 的 Skill 会变成命令栏中的 `/finish-task`。\n\n- 每次请求 `/api/config` 时扫描 Skill\n- 项目级 Skill 覆盖同名的全局 Skill\n- 用户的修改（enabled、autoSend）在扫描时保留\n\n**自定义示例：**\n\n```json\n{\n  \"commands\": [\n    { \"label\": \"/help\", \"command\": \"/help\", \"enabled\": true },\n    { \"label\": \"Git 状态\", \"command\": \"git status\", \"enabled\": true, \"autoSend\": false }\n  ]\n}\n```\n\n| 字段 | 类型 | 默认值 | 说明 |\n|------|------|--------|------|\n| `label` | string | — | 按钮显示文本 |\n| `command` | string | — | 要执行的命令 |\n| `enabled` | boolean | — | 按钮是否启用 |\n| `autoSend` | boolean | `true` | `true` = 立即发送，`false` = 填入输入框 |\n\n> 以 `/` 开头的命令是 Claude Code 斜杠命令。其他命令在终端中执行。\n\n### 工作空间\n\n限制 Web 生成的实例可以使用哪些目录：\n\n```json\n{\n  \"workspaces\": [\n    \"/home/user/projects/api\",\n    \"/home/user/projects/web\"\n  ]\n}\n```\n\n如未配置，Web 生成的实例只能从已存在的 claude 实例中选择项目\n\n### 设置文件\n\n从 Web UI 创建实例时，可以选择自定义设置文件通过 `--settings` 传递。设置文件必须：\n\n1. 以 `settings` 为前缀命名（如 `settings-project-a.json`、`settings.idea.json`）\n2. 是有效的 `.json` 结尾的 JSON 文件\n3. 位于配置的扫描目录中\n\n**默认扫描目录：**\n- `~/.claude/` — Claude Code 配置目录\n- `~/.claude-remote/settings/` — Claude Remote 自定义设置\n\n**自定义目录：**\n\n```json\n{\n  \"settingsDirs\": [\n    \"~/.claude/\",\n    \"~/.claude-remote/settings/\",\n    \"~/my-custom-settings/\"\n  ]\n}\n```\n\n**设置文件示例**（`~/.claude/settings-project-a.json`）：\n\n```json\n{\n  \"env\": {\n    \"ANTHROPIC_BASE_URL\": \"https://api.anthropic.com\"\n  },\n  \"permissions\": {\n    \"allow\": [\"Bash(git:*)\", \"Bash(npm:*)\"]\n  }\n}\n```\n\n> **注意**：带端口号的 JSON 文件会自动从设置文件列表中排除。\n\n### 完整示例\n\n```json\n{\n  \"host\": \"0.0.0.0\",\n  \"token\": null,\n\n  \"claudeCommand\": \"claude\",\n  \"claudeArgs\": [\"--no-telemetry\"],\n  \"claudeCwd\": null,\n\n  \"sessionTtlMs\": 86400000,\n  \"authRateLimit\": 20,\n  \"maxBufferLines\": 50000,\n  \"instanceName\": null,\n\n  \"shortcuts\": [\n    { \"label\": \"Yes\", \"data\": \"y\", \"enabled\": true },\n    { \"label\": \"Esc\", \"data\": \"\\u001b\", \"enabled\": true },\n    { \"label\": \"Enter\", \"data\": \"\\r\", \"enabled\": true },\n    { \"label\": \"Ctrl+C\", \"data\": \"\\u0003\", \"enabled\": true }\n  ],\n\n  \"commands\": [\n    { \"label\": \"Git 状态\", \"command\": \"git status\", \"enabled\": true },\n    { \"label\": \"Git 日志\", \"command\": \"git log --oneline -10\", \"enabled\": true }\n  ],\n\n  \"workspaces\": [\n    \"/home/user/projects/api\",\n    \"/home/user/projects/web\"\n  ],\n\n  \"notifications\": {\n    \"dingtalk\": {\n      \"webhookUrl\": \"https://oapi.dingtalk.com/robot/send?access_token=your-token\"\n    }\n  }\n}\n```\n\n---\n\n## 安全性\n\n- **令牌认证** — 32 字节随机令牌，首次运行生成\n- **会话 Cookie** — HttpOnly + SameSite=Lax，24 小时 TTL\n- **网络隔离** — 仅绑定局域网 IP，无公网暴露\n- **速率限制** — 每个 IP 每分钟 20 次认证尝试\n- **Hook 安全** — 仅接受 localhost 请求\n\n---\n\n## 故障排除\n\n### `node-pty` 编译失败\n\n安装编译工具：\n\n| 操作系统 | 命令 |\n|---------|------|\n| macOS | `xcode-select --install` |\n| Ubuntu/Debian | `sudo apt-get install build-essential python3` |\n| Fedora/RHEL | `sudo dnf groupinstall 'Development Tools'` |\n| Arch Linux | `sudo pacman -S base-devel python` |\n\n### 二维码扫不了？\n\n1. 确保手机和 PC 在同一网络\n2. 手动打开终端显示的 URL 并输入令牌\n\n### 手机连不上？\n\n1. 检查 PC 防火墙允许端口 8866\n2. 验证 URL 显示正确的局域网 IP\n3. 如使用 VPN，尝试显式设置 `host` 选项\n\n---\n\n## 前置要求\n\n- **Node.js** >= 20\n- **Claude Code CLI** — [安装指南](https://docs.anthropic.com/en/docs/claude-code)\n\n---\n\n## 开发\n\n**源码开发：**\n\n```bash\n# 克隆并安装\ngit clone https://github.com/StephenTowne/open-claude-remote.git\ncd open-claude-remote\ntnpm install\n\n# 开发模式（热重载）\ntnpm dev:cli\n\n# 生产模式\ntnpm run build && npm link && claude-remote\n```\n\n**项目结构：**\n\n- 后端：`backend/src/`（Express + node-pty + WebSocket）\n- 前端：`frontend/src/`（React + xterm.js）\n- 共享类型：`shared/`（通过 `#shared` 别名导入）\n- 测试：`tnpm test`（Vitest）\n- 构建：`tnpm run build`（TypeScript + Vite）\n\n### 停止所有实例\n\n```bash\ntnpm stop\n```\n\n---\n\n## 许可证\n\nMIT","readmeFilename":"README.md"}