@caoruhua/open-claude-remote 0.1.0 → 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +285 -295
- package/dist/backend/src/api/auth-routes.d.ts.map +1 -0
- package/dist/backend/src/api/auth-routes.js.map +1 -0
- package/dist/backend/src/api/config-routes.d.ts +7 -0
- package/dist/backend/src/api/config-routes.d.ts.map +1 -0
- package/dist/{api → backend/src/api}/config-routes.js +125 -13
- package/dist/backend/src/api/config-routes.js.map +1 -0
- package/dist/backend/src/api/health-routes.d.ts.map +1 -0
- package/dist/backend/src/api/health-routes.js.map +1 -0
- package/dist/backend/src/api/hook-routes.d.ts.map +1 -0
- package/dist/backend/src/api/hook-routes.js.map +1 -0
- package/dist/{api → backend/src/api}/instance-routes.d.ts +5 -1
- package/dist/backend/src/api/instance-routes.d.ts.map +1 -0
- package/dist/{api → backend/src/api}/instance-routes.js +5 -1
- package/dist/backend/src/api/instance-routes.js.map +1 -0
- package/dist/backend/src/api/push-routes.d.ts.map +1 -0
- package/dist/backend/src/api/push-routes.js.map +1 -0
- package/dist/{api → backend/src/api}/router.d.ts +7 -1
- package/dist/backend/src/api/router.d.ts.map +1 -0
- package/dist/{api → backend/src/api}/router.js +1 -1
- package/dist/backend/src/api/router.js.map +1 -0
- package/dist/backend/src/api/status-routes.d.ts.map +1 -0
- package/dist/backend/src/api/status-routes.js.map +1 -0
- package/dist/backend/src/attach.d.ts.map +1 -0
- package/dist/{attach.js → backend/src/attach.js} +11 -11
- package/dist/backend/src/attach.js.map +1 -0
- package/dist/backend/src/auth/auth-middleware.d.ts.map +1 -0
- package/dist/backend/src/auth/auth-middleware.js.map +1 -0
- package/dist/backend/src/auth/rate-limiter.d.ts.map +1 -0
- package/dist/backend/src/auth/rate-limiter.js.map +1 -0
- package/dist/backend/src/auth/token-generator.d.ts.map +1 -0
- package/dist/{auth → backend/src/auth}/token-generator.js +1 -1
- package/dist/backend/src/auth/token-generator.js.map +1 -0
- package/dist/{cli-utils.d.ts → backend/src/cli-utils.d.ts} +3 -3
- package/dist/backend/src/cli-utils.d.ts.map +1 -0
- package/dist/{cli-utils.js → backend/src/cli-utils.js} +49 -36
- package/dist/backend/src/cli-utils.js.map +1 -0
- package/dist/backend/src/cli.d.ts +22 -0
- package/dist/backend/src/cli.d.ts.map +1 -0
- package/dist/{cli.js → backend/src/cli.js} +21 -16
- package/dist/backend/src/cli.js.map +1 -0
- package/dist/{config.d.ts → backend/src/config.d.ts} +29 -5
- package/dist/backend/src/config.d.ts.map +1 -0
- package/dist/{config.js → backend/src/config.js} +198 -12
- package/dist/backend/src/config.js.map +1 -0
- package/dist/backend/src/deps/detector.d.ts +18 -0
- package/dist/backend/src/deps/detector.d.ts.map +1 -0
- package/dist/backend/src/deps/detector.js +49 -0
- package/dist/backend/src/deps/detector.js.map +1 -0
- package/dist/backend/src/deps/index.d.ts +14 -0
- package/dist/backend/src/deps/index.d.ts.map +1 -0
- package/dist/backend/src/deps/index.js +219 -0
- package/dist/backend/src/deps/index.js.map +1 -0
- package/dist/backend/src/deps/installer.d.ts +13 -0
- package/dist/backend/src/deps/installer.d.ts.map +1 -0
- package/dist/backend/src/deps/installer.js +113 -0
- package/dist/backend/src/deps/installer.js.map +1 -0
- package/dist/backend/src/deps/platform.d.ts +27 -0
- package/dist/backend/src/deps/platform.d.ts.map +1 -0
- package/dist/backend/src/deps/platform.js +154 -0
- package/dist/backend/src/deps/platform.js.map +1 -0
- package/dist/backend/src/deps/prompt.d.ts +51 -0
- package/dist/backend/src/deps/prompt.d.ts.map +1 -0
- package/dist/backend/src/deps/prompt.js +128 -0
- package/dist/backend/src/deps/prompt.js.map +1 -0
- package/dist/backend/src/deps/types.d.ts +40 -0
- package/dist/backend/src/deps/types.d.ts.map +1 -0
- package/dist/backend/src/deps/types.js +54 -0
- package/dist/backend/src/deps/types.js.map +1 -0
- package/dist/backend/src/hooks/hook-receiver.d.ts +39 -0
- package/dist/backend/src/hooks/hook-receiver.d.ts.map +1 -0
- package/dist/backend/src/hooks/hook-receiver.js +96 -0
- package/dist/backend/src/hooks/hook-receiver.js.map +1 -0
- package/dist/backend/src/hooks/hook-types.d.ts +165 -0
- package/dist/backend/src/hooks/hook-types.d.ts.map +1 -0
- package/dist/backend/src/hooks/hook-types.js +16 -0
- package/dist/backend/src/hooks/hook-types.js.map +1 -0
- package/dist/backend/src/index.d.ts.map +1 -0
- package/dist/{index.js → backend/src/index.js} +27 -32
- package/dist/backend/src/index.js.map +1 -0
- package/dist/backend/src/logger/logger.d.ts.map +1 -0
- package/dist/{logger → backend/src/logger}/logger.js +3 -5
- package/dist/{logger → backend/src/logger}/logger.js.map +1 -1
- package/dist/backend/src/notification/dingtalk-service.d.ts.map +1 -0
- package/dist/{notification → backend/src/notification}/dingtalk-service.js +1 -1
- package/dist/backend/src/notification/dingtalk-service.js.map +1 -0
- package/dist/backend/src/notification/notification-manager.d.ts +44 -0
- package/dist/backend/src/notification/notification-manager.d.ts.map +1 -0
- package/dist/backend/src/notification/notification-manager.js +94 -0
- package/dist/backend/src/notification/notification-manager.js.map +1 -0
- package/dist/backend/src/notification/notification-service-factory.d.ts +67 -0
- package/dist/backend/src/notification/notification-service-factory.d.ts.map +1 -0
- package/dist/backend/src/notification/notification-service-factory.js +146 -0
- package/dist/backend/src/notification/notification-service-factory.js.map +1 -0
- package/dist/backend/src/notification/wechat-work-service.d.ts +24 -0
- package/dist/backend/src/notification/wechat-work-service.d.ts.map +1 -0
- package/dist/backend/src/notification/wechat-work-service.js +88 -0
- package/dist/backend/src/notification/wechat-work-service.js.map +1 -0
- package/dist/backend/src/pty/output-buffer.d.ts.map +1 -0
- package/dist/backend/src/pty/output-buffer.js.map +1 -0
- package/dist/backend/src/pty/pty-manager.d.ts.map +1 -0
- package/dist/backend/src/pty/pty-manager.js.map +1 -0
- package/dist/backend/src/pty/types.d.ts.map +1 -0
- package/dist/{pty → backend/src/pty}/types.js.map +1 -1
- package/dist/backend/src/pty/virtual-pty.d.ts.map +1 -0
- package/dist/backend/src/pty/virtual-pty.js.map +1 -0
- package/dist/backend/src/push/push-service.d.ts.map +1 -0
- package/dist/backend/src/push/push-service.js.map +1 -0
- package/dist/{registry → backend/src/registry}/instance-registry.d.ts +1 -1
- package/dist/backend/src/registry/instance-registry.d.ts.map +1 -0
- package/dist/{registry → backend/src/registry}/instance-registry.js +1 -1
- package/dist/backend/src/registry/instance-registry.js.map +1 -0
- package/dist/backend/src/registry/instance-spawner.d.ts.map +1 -0
- package/dist/{registry → backend/src/registry}/instance-spawner.js +17 -5
- package/dist/backend/src/registry/instance-spawner.js.map +1 -0
- package/dist/backend/src/registry/port-finder.d.ts.map +1 -0
- package/dist/backend/src/registry/port-finder.js.map +1 -0
- package/dist/backend/src/registry/shared-token.d.ts.map +1 -0
- package/dist/backend/src/registry/shared-token.js.map +1 -0
- package/dist/{registry → backend/src/registry}/stop-instances.d.ts +1 -1
- package/dist/backend/src/registry/stop-instances.d.ts.map +1 -0
- package/dist/{registry → backend/src/registry}/stop-instances.js +1 -1
- package/dist/backend/src/registry/stop-instances.js.map +1 -0
- package/dist/{session → backend/src/session}/session-controller.d.ts +21 -6
- package/dist/backend/src/session/session-controller.d.ts.map +1 -0
- package/dist/{session → backend/src/session}/session-controller.js +108 -25
- package/dist/backend/src/session/session-controller.js.map +1 -0
- package/dist/backend/src/terminal/terminal-relay.d.ts.map +1 -0
- package/dist/backend/src/terminal/terminal-relay.js.map +1 -0
- package/dist/backend/src/utils/ansi-filter.d.ts.map +1 -0
- package/dist/backend/src/utils/ansi-filter.js.map +1 -0
- package/dist/backend/src/utils/file-lock.d.ts.map +1 -0
- package/dist/backend/src/utils/file-lock.js.map +1 -0
- package/dist/backend/src/utils/ip-monitor.d.ts.map +1 -0
- package/dist/backend/src/utils/ip-monitor.js.map +1 -0
- package/dist/backend/src/utils/network.d.ts.map +1 -0
- package/dist/backend/src/utils/network.js.map +1 -0
- package/dist/backend/src/utils/qrcode-banner.d.ts.map +1 -0
- package/dist/backend/src/utils/qrcode-banner.js.map +1 -0
- package/dist/backend/src/ws/ws-handler.d.ts.map +1 -0
- package/dist/backend/src/ws/ws-handler.js.map +1 -0
- package/dist/{ws → backend/src/ws}/ws-server.d.ts +1 -1
- package/dist/backend/src/ws/ws-server.d.ts.map +1 -0
- package/dist/{ws → backend/src/ws}/ws-server.js +2 -2
- package/dist/backend/src/ws/ws-server.js.map +1 -0
- package/dist/shared/constants.d.ts.map +1 -0
- package/dist/shared/constants.js.map +1 -0
- package/dist/shared/defaults.d.ts.map +1 -0
- package/dist/shared/defaults.js.map +1 -0
- package/{shared-dist → dist/shared}/index.d.ts +1 -0
- package/dist/shared/index.d.ts.map +1 -0
- package/{shared-dist → dist/shared}/index.js +1 -0
- package/dist/shared/index.js.map +1 -0
- package/{shared-dist → dist/shared}/instance.d.ts +13 -0
- package/dist/shared/instance.d.ts.map +1 -0
- package/dist/shared/instance.js.map +1 -0
- package/dist/shared/notification-types.d.ts +85 -0
- package/dist/shared/notification-types.d.ts.map +1 -0
- package/dist/shared/notification-types.js +92 -0
- package/dist/shared/notification-types.js.map +1 -0
- package/{shared-dist → dist/shared}/ws-protocol.d.ts +6 -1
- package/dist/shared/ws-protocol.d.ts.map +1 -0
- package/dist/shared/ws-protocol.js.map +1 -0
- package/frontend-dist/assets/index-DOeBWumG.js +152 -0
- package/frontend-dist/index.html +2 -2
- package/package.json +62 -27
- package/scripts/build.sh +21 -0
- package/scripts/dev.sh +11 -0
- package/scripts/fix-node-pty-permissions.js +47 -0
- package/scripts/git-hooks/pre-commit +258 -0
- package/scripts/stop.sh +5 -0
- package/dist/api/auth-routes.d.ts.map +0 -1
- package/dist/api/auth-routes.js.map +0 -1
- package/dist/api/config-routes.d.ts +0 -4
- package/dist/api/config-routes.d.ts.map +0 -1
- package/dist/api/config-routes.js.map +0 -1
- package/dist/api/health-routes.d.ts.map +0 -1
- package/dist/api/health-routes.js.map +0 -1
- package/dist/api/hook-routes.d.ts.map +0 -1
- package/dist/api/hook-routes.js.map +0 -1
- package/dist/api/instance-routes.d.ts.map +0 -1
- package/dist/api/instance-routes.js.map +0 -1
- package/dist/api/push-routes.d.ts.map +0 -1
- package/dist/api/push-routes.js.map +0 -1
- package/dist/api/router.d.ts.map +0 -1
- package/dist/api/router.js.map +0 -1
- package/dist/api/status-routes.d.ts.map +0 -1
- package/dist/api/status-routes.js.map +0 -1
- package/dist/attach.d.ts.map +0 -1
- package/dist/attach.js.map +0 -1
- package/dist/auth/auth-middleware.d.ts.map +0 -1
- package/dist/auth/auth-middleware.js.map +0 -1
- package/dist/auth/rate-limiter.d.ts.map +0 -1
- package/dist/auth/rate-limiter.js.map +0 -1
- package/dist/auth/token-generator.d.ts.map +0 -1
- package/dist/auth/token-generator.js.map +0 -1
- package/dist/cli-utils.d.ts.map +0 -1
- package/dist/cli-utils.js.map +0 -1
- package/dist/cli.d.ts +0 -21
- package/dist/cli.d.ts.map +0 -1
- package/dist/cli.js.map +0 -1
- package/dist/config.d.ts.map +0 -1
- package/dist/config.js.map +0 -1
- package/dist/hooks/hook-receiver.d.ts +0 -39
- package/dist/hooks/hook-receiver.d.ts.map +0 -1
- package/dist/hooks/hook-receiver.js +0 -46
- package/dist/hooks/hook-receiver.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/logger/logger.d.ts.map +0 -1
- package/dist/notification/dingtalk-service.d.ts.map +0 -1
- package/dist/notification/dingtalk-service.js.map +0 -1
- package/dist/pty/output-buffer.d.ts.map +0 -1
- package/dist/pty/output-buffer.js.map +0 -1
- package/dist/pty/pty-manager.d.ts.map +0 -1
- package/dist/pty/pty-manager.js.map +0 -1
- package/dist/pty/types.d.ts.map +0 -1
- package/dist/pty/virtual-pty.d.ts.map +0 -1
- package/dist/pty/virtual-pty.js.map +0 -1
- package/dist/push/push-service.d.ts.map +0 -1
- package/dist/push/push-service.js.map +0 -1
- package/dist/registry/instance-registry.d.ts.map +0 -1
- package/dist/registry/instance-registry.js.map +0 -1
- package/dist/registry/instance-spawner.d.ts.map +0 -1
- package/dist/registry/instance-spawner.js.map +0 -1
- package/dist/registry/port-finder.d.ts.map +0 -1
- package/dist/registry/port-finder.js.map +0 -1
- package/dist/registry/shared-token.d.ts.map +0 -1
- package/dist/registry/shared-token.js.map +0 -1
- package/dist/registry/stop-instances.d.ts.map +0 -1
- package/dist/registry/stop-instances.js.map +0 -1
- package/dist/session/session-controller.d.ts.map +0 -1
- package/dist/session/session-controller.js.map +0 -1
- package/dist/terminal/terminal-relay.d.ts.map +0 -1
- package/dist/terminal/terminal-relay.js.map +0 -1
- package/dist/utils/ansi-filter.d.ts.map +0 -1
- package/dist/utils/ansi-filter.js.map +0 -1
- package/dist/utils/file-lock.d.ts.map +0 -1
- package/dist/utils/file-lock.js.map +0 -1
- package/dist/utils/ip-monitor.d.ts.map +0 -1
- package/dist/utils/ip-monitor.js.map +0 -1
- package/dist/utils/network.d.ts.map +0 -1
- package/dist/utils/network.js.map +0 -1
- package/dist/utils/pid-file.d.ts +0 -10
- package/dist/utils/pid-file.d.ts.map +0 -1
- package/dist/utils/pid-file.js +0 -30
- package/dist/utils/pid-file.js.map +0 -1
- package/dist/utils/qrcode-banner.d.ts.map +0 -1
- package/dist/utils/qrcode-banner.js.map +0 -1
- package/dist/ws/ws-handler.d.ts.map +0 -1
- package/dist/ws/ws-handler.js.map +0 -1
- package/dist/ws/ws-server.d.ts.map +0 -1
- package/dist/ws/ws-server.js.map +0 -1
- package/frontend-dist/assets/index-BqqB1hYe.js +0 -141
- package/shared-dist/constants.d.ts.map +0 -1
- package/shared-dist/constants.js.map +0 -1
- package/shared-dist/defaults.d.ts.map +0 -1
- package/shared-dist/defaults.js.map +0 -1
- package/shared-dist/index.d.ts.map +0 -1
- package/shared-dist/index.js.map +0 -1
- package/shared-dist/instance.d.ts.map +0 -1
- package/shared-dist/instance.js.map +0 -1
- package/shared-dist/question-utils.d.ts +0 -15
- package/shared-dist/question-utils.d.ts.map +0 -1
- package/shared-dist/question-utils.js +0 -24
- package/shared-dist/question-utils.js.map +0 -1
- package/shared-dist/ws-protocol.d.ts.map +0 -1
- package/shared-dist/ws-protocol.js.map +0 -1
- /package/dist/{api → backend/src/api}/auth-routes.d.ts +0 -0
- /package/dist/{api → backend/src/api}/auth-routes.js +0 -0
- /package/dist/{api → backend/src/api}/health-routes.d.ts +0 -0
- /package/dist/{api → backend/src/api}/health-routes.js +0 -0
- /package/dist/{api → backend/src/api}/hook-routes.d.ts +0 -0
- /package/dist/{api → backend/src/api}/hook-routes.js +0 -0
- /package/dist/{api → backend/src/api}/push-routes.d.ts +0 -0
- /package/dist/{api → backend/src/api}/push-routes.js +0 -0
- /package/dist/{api → backend/src/api}/status-routes.d.ts +0 -0
- /package/dist/{api → backend/src/api}/status-routes.js +0 -0
- /package/dist/{attach.d.ts → backend/src/attach.d.ts} +0 -0
- /package/dist/{auth → backend/src/auth}/auth-middleware.d.ts +0 -0
- /package/dist/{auth → backend/src/auth}/auth-middleware.js +0 -0
- /package/dist/{auth → backend/src/auth}/rate-limiter.d.ts +0 -0
- /package/dist/{auth → backend/src/auth}/rate-limiter.js +0 -0
- /package/dist/{auth → backend/src/auth}/token-generator.d.ts +0 -0
- /package/dist/{index.d.ts → backend/src/index.d.ts} +0 -0
- /package/dist/{logger → backend/src/logger}/logger.d.ts +0 -0
- /package/dist/{notification → backend/src/notification}/dingtalk-service.d.ts +0 -0
- /package/dist/{pty → backend/src/pty}/output-buffer.d.ts +0 -0
- /package/dist/{pty → backend/src/pty}/output-buffer.js +0 -0
- /package/dist/{pty → backend/src/pty}/pty-manager.d.ts +0 -0
- /package/dist/{pty → backend/src/pty}/pty-manager.js +0 -0
- /package/dist/{pty → backend/src/pty}/types.d.ts +0 -0
- /package/dist/{pty → backend/src/pty}/types.js +0 -0
- /package/dist/{pty → backend/src/pty}/virtual-pty.d.ts +0 -0
- /package/dist/{pty → backend/src/pty}/virtual-pty.js +0 -0
- /package/dist/{push → backend/src/push}/push-service.d.ts +0 -0
- /package/dist/{push → backend/src/push}/push-service.js +0 -0
- /package/dist/{registry → backend/src/registry}/instance-spawner.d.ts +0 -0
- /package/dist/{registry → backend/src/registry}/port-finder.d.ts +0 -0
- /package/dist/{registry → backend/src/registry}/port-finder.js +0 -0
- /package/dist/{registry → backend/src/registry}/shared-token.d.ts +0 -0
- /package/dist/{registry → backend/src/registry}/shared-token.js +0 -0
- /package/dist/{terminal → backend/src/terminal}/terminal-relay.d.ts +0 -0
- /package/dist/{terminal → backend/src/terminal}/terminal-relay.js +0 -0
- /package/dist/{utils → backend/src/utils}/ansi-filter.d.ts +0 -0
- /package/dist/{utils → backend/src/utils}/ansi-filter.js +0 -0
- /package/dist/{utils → backend/src/utils}/file-lock.d.ts +0 -0
- /package/dist/{utils → backend/src/utils}/file-lock.js +0 -0
- /package/dist/{utils → backend/src/utils}/ip-monitor.d.ts +0 -0
- /package/dist/{utils → backend/src/utils}/ip-monitor.js +0 -0
- /package/dist/{utils → backend/src/utils}/network.d.ts +0 -0
- /package/dist/{utils → backend/src/utils}/network.js +0 -0
- /package/dist/{utils → backend/src/utils}/qrcode-banner.d.ts +0 -0
- /package/dist/{utils → backend/src/utils}/qrcode-banner.js +0 -0
- /package/dist/{ws → backend/src/ws}/ws-handler.d.ts +0 -0
- /package/dist/{ws → backend/src/ws}/ws-handler.js +0 -0
- /package/{shared-dist → dist/shared}/constants.d.ts +0 -0
- /package/{shared-dist → dist/shared}/constants.js +0 -0
- /package/{shared-dist → dist/shared}/defaults.d.ts +0 -0
- /package/{shared-dist → dist/shared}/defaults.js +0 -0
- /package/{shared-dist → dist/shared}/instance.js +0 -0
- /package/{shared-dist → dist/shared}/ws-protocol.js +0 -0
package/README.md
CHANGED
|
@@ -1,393 +1,318 @@
|
|
|
1
1
|
# Claude Code Remote
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
**Control Claude Code from your mobile browser over LAN.**
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
View terminal output, send commands, and approve tool calls from your phone — keep working even when you step away from your desktop.
|
|
6
6
|
|
|
7
7
|
---
|
|
8
8
|
|
|
9
|
-
##
|
|
9
|
+
## Quick Start
|
|
10
10
|
|
|
11
|
-
###
|
|
12
|
-
|
|
13
|
-
国内网络可能较慢,建议先配置淘宝镜像:
|
|
11
|
+
### 1. Install
|
|
14
12
|
|
|
15
13
|
```bash
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
或手动设置:
|
|
20
|
-
|
|
21
|
-
```bash
|
|
22
|
-
pnpm config set registry https://registry.npmmirror.com
|
|
23
|
-
```
|
|
24
|
-
|
|
25
|
-
### 1. 安装
|
|
14
|
+
# npm
|
|
15
|
+
npm install -g @caoruhua/open-claude-remote
|
|
26
16
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
cd claude-code-remote
|
|
30
|
-
./install.sh
|
|
17
|
+
# pnpm (recommended)
|
|
18
|
+
pnpm add -g @caoruhua/open-claude-remote
|
|
31
19
|
```
|
|
32
20
|
|
|
33
|
-
### 2.
|
|
21
|
+
### 2. Run
|
|
34
22
|
|
|
35
23
|
```bash
|
|
36
24
|
claude-remote
|
|
37
25
|
```
|
|
38
26
|
|
|
39
|
-
### 3.
|
|
40
|
-
|
|
41
|
-
PC 终端显示 ASCII 二维码 → 手机扫码 → 自动填充 Token → 开始使用
|
|
42
|
-
|
|
43
|
-
---
|
|
27
|
+
### 3. Connect
|
|
44
28
|
|
|
45
|
-
|
|
29
|
+
Scan the QR code shown in your terminal with your phone. The auth token is auto-filled — you're ready to go.
|
|
46
30
|
|
|
47
|
-
|
|
48
|
-
- PC 终端完整输出实时同步到手机
|
|
49
|
-
- 支持 ANSI 颜色渲染
|
|
50
|
-
- 10K 行历史记录,重连自动恢复
|
|
51
|
-
- **IP 变化通知**:PC 局域网 IP 变化时自动通知,提供新连接地址
|
|
31
|
+
> On first run, `claude-remote` will automatically check for and install missing dependencies (pnpm, Claude CLI). Hooks are also configured automatically — no manual setup needed.
|
|
52
32
|
|
|
53
|
-
|
|
54
|
-
- 一键发送 Esc、方向键、Ctrl+C 等
|
|
55
|
-
- 自定义快捷键(在设置中配置)
|
|
56
|
-
- 预设常用命令(/help, /clear 等)
|
|
57
|
-
|
|
58
|
-
### 多实例管理
|
|
59
|
-
- 启动多个claude-remote
|
|
60
|
-
- 浏览器网页打开,顶部Tab切换无需重新认证
|
|
61
|
-
- 实例掉线自动切换到下一个
|
|
62
|
-
- **Web 创建实例**:通过 UI 创建新实例(点击 Tab 栏的 "+" 按钮,工作目录限制`workspaces`白名单和已启动实例的工作目录)
|
|
63
|
-
- **PC Attach**:`claude-remote attach <port|name>` 接管 web 创建的实例
|
|
33
|
+
---
|
|
64
34
|
|
|
65
|
-
|
|
35
|
+
## Features
|
|
66
36
|
|
|
67
|
-
|
|
37
|
+
### Terminal Sync
|
|
38
|
+
- Real-time terminal output streamed to your phone
|
|
39
|
+
- Full ANSI color rendering via xterm.js
|
|
40
|
+
- 10K-line scrollback buffer, auto-restored on reconnect
|
|
41
|
+
- LAN IP change notification with new connection URL
|
|
42
|
+
- Smart auto-scroll with a "scroll to bottom" floating button
|
|
68
43
|
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
| 仅 Attach 连接 | Attach | PC 端 attach 接管尺寸 |
|
|
74
|
-
| WebApp + Attach | WebApp | 手机端为主控,PC 端跟随 |
|
|
44
|
+
### Quick Actions
|
|
45
|
+
- One-tap keys: Esc, Enter, Tab, arrows, Shift+Tab
|
|
46
|
+
- Custom shortcuts (configurable in settings)
|
|
47
|
+
- Preset commands (/clear, /compact, /resume, etc.)
|
|
75
48
|
|
|
76
|
-
|
|
77
|
-
-
|
|
78
|
-
-
|
|
79
|
-
-
|
|
49
|
+
### First-time Guide
|
|
50
|
+
- Interactive spotlight guide on first visit
|
|
51
|
+
- Highlights key UI elements with coach marks
|
|
52
|
+
- Auto-skips on subsequent visits
|
|
80
53
|
|
|
81
|
-
###
|
|
54
|
+
### Multi-Instance
|
|
55
|
+
- Run multiple `claude-remote` instances simultaneously
|
|
56
|
+
- Browser tab bar for switching — no re-authentication needed
|
|
57
|
+
- Auto-switch when an instance goes offline
|
|
58
|
+
- Spawn new instances from the web UI ("+" button)
|
|
59
|
+
- Copy instance via long-press/right-click tab — pre-fills working directory, settings, and arguments
|
|
60
|
+
- `claude-remote attach <port|name>` to take over a web-spawned instance
|
|
82
61
|
|
|
83
|
-
|
|
62
|
+
### Window Resize Priority
|
|
84
63
|
|
|
85
|
-
|
|
64
|
+
When multiple clients are connected, window size is controlled by:
|
|
65
|
+
**WebApp (mobile) > Attach (PC) > PC Terminal**
|
|
86
66
|
|
|
87
|
-
|
|
67
|
+
| Scenario | Controller | Behavior |
|
|
68
|
+
|----------|-----------|----------|
|
|
69
|
+
| No client connected | PC Terminal | Normal local usage |
|
|
70
|
+
| WebApp only | WebApp | Mobile controls window size |
|
|
71
|
+
| Attach only | Attach | PC attach controls size |
|
|
72
|
+
| WebApp + Attach | WebApp | Mobile is primary, PC follows |
|
|
88
73
|
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
2. 浏览器会自动请求通知权限,点击"允许"
|
|
92
|
-
3. 后台自动完成订阅,无需手动配置
|
|
74
|
+
- Attach resize requests are ignored when WebApp is online
|
|
75
|
+
- Attach auto-syncs to WebApp's window size on connect
|
|
93
76
|
|
|
94
|
-
|
|
95
|
-
- 浏览器使用 Push API 订阅服务器
|
|
96
|
-
- p256dh 密钥由浏览器自动生成(65 字节 ECDH 公钥)
|
|
97
|
-
- 订阅数据存储在 `~/.claude-remote/push-subscriptions.json`
|
|
77
|
+
### Notifications
|
|
98
78
|
|
|
99
|
-
|
|
100
|
-
- 确保浏览器已授予通知权限
|
|
101
|
-
- 清理无效订阅:`rm ~/.claude-remote/push-subscriptions.json`,然后重新访问 Web UI
|
|
79
|
+
Get notified when Claude is waiting for input. All notifications include the instance URL so you can quickly reconnect even if the IP changes.
|
|
102
80
|
|
|
103
|
-
|
|
81
|
+
**Web Push** — works even when the browser is in the background or the screen is locked. Just allow notifications when prompted.
|
|
104
82
|
|
|
105
|
-
|
|
83
|
+
**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.
|
|
106
84
|
|
|
107
|
-
|
|
108
|
-
1. 打开钉钉群 → 群设置 → 智能群助手 → 添加机器人 → 自定义
|
|
109
|
-
2. 安全设置选择"自定义关键词",添加关键词 `Claude`(消息标题已包含此词)
|
|
110
|
-
3. 复制 Webhook URL
|
|
111
|
-
4. 在 Web UI 设置界面 → 钉钉 Tab 中粘贴,或直接写入配置文件:
|
|
85
|
+
**DingTalk** — configure a DingTalk bot webhook to receive notifications on your team channel:
|
|
112
86
|
|
|
113
87
|
```json
|
|
114
88
|
{
|
|
115
|
-
"
|
|
116
|
-
"
|
|
89
|
+
"notifications": {
|
|
90
|
+
"dingtalk": {
|
|
91
|
+
"webhookUrl": "https://oapi.dingtalk.com/robot/send?access_token=your-token"
|
|
92
|
+
}
|
|
117
93
|
}
|
|
118
94
|
}
|
|
119
95
|
```
|
|
120
96
|
|
|
121
|
-
|
|
122
|
-
- 可视化配置快捷键
|
|
123
|
-
- 命令管理(自动补足 `/` 前缀)
|
|
124
|
-
- 配置即时生效
|
|
125
|
-
|
|
126
|
-
---
|
|
127
|
-
|
|
128
|
-
## 常见问题
|
|
129
|
-
|
|
130
|
-
### 安装失败排查
|
|
131
|
-
|
|
132
|
-
#### 网络超时/连接失败
|
|
133
|
-
|
|
134
|
-
配置淘宝镜像:
|
|
135
|
-
|
|
136
|
-
```bash
|
|
137
|
-
cp .npmrc.example .npmrc
|
|
138
|
-
pnpm install
|
|
139
|
-
```
|
|
140
|
-
|
|
141
|
-
#### node-pty 编译失败
|
|
142
|
-
|
|
143
|
-
安装编译工具:
|
|
144
|
-
|
|
145
|
-
| 系统 | 命令 |
|
|
146
|
-
|------|------|
|
|
147
|
-
| macOS | `xcode-select --install` |
|
|
148
|
-
| Ubuntu/Debian | `sudo apt-get install build-essential python3` |
|
|
149
|
-
| Fedora/RHEL | `sudo dnf groupinstall 'Development Tools'` |
|
|
150
|
-
| Arch Linux | `sudo pacman -S base-devel python` |
|
|
151
|
-
|
|
152
|
-
#### pnpm 未找到
|
|
153
|
-
|
|
154
|
-
```bash
|
|
155
|
-
npm install -g pnpm@latest
|
|
156
|
-
# 或使用 corepack
|
|
157
|
-
corepack enable && corepack prepare pnpm@latest --activate
|
|
158
|
-
```
|
|
159
|
-
|
|
160
|
-
#### 清理缓存后重试
|
|
161
|
-
|
|
162
|
-
```bash
|
|
163
|
-
pnpm store prune
|
|
164
|
-
rm -rf node_modules pnpm-lock.yaml
|
|
165
|
-
pnpm install
|
|
166
|
-
```
|
|
167
|
-
|
|
168
|
-
### 找不到 `claude-remote` 命令?
|
|
169
|
-
|
|
170
|
-
确保已执行 `pnpm link -g`,或使用 `node backend/dist/cli.js` 直接运行。
|
|
171
|
-
|
|
172
|
-
### 二维码扫不出来?
|
|
97
|
+
> **Note**: Legacy config files with root-level `dingtalk` field are automatically migrated to `notifications.dingtalk` on first load.
|
|
173
98
|
|
|
174
|
-
|
|
175
|
-
|
|
99
|
+
**Setup steps:**
|
|
100
|
+
1. Open DingTalk group → Group Settings → Smart Group Assistant → Add Robot → Custom
|
|
101
|
+
2. For security settings, select "Custom Keywords" and add `Claude` (the message title includes this keyword)
|
|
102
|
+
3. Copy the Webhook URL to your config file or paste it in the Web UI settings
|
|
176
103
|
|
|
177
|
-
|
|
104
|
+
**WeChat (Server酱³)** — configure Server酱³ to receive notifications on WeChat:
|
|
178
105
|
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
```bash
|
|
188
|
-
./scripts/setup-hooks.sh
|
|
106
|
+
```json
|
|
107
|
+
{
|
|
108
|
+
"notifications": {
|
|
109
|
+
"wechat_work": {
|
|
110
|
+
"sendKey": "SCTxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
189
114
|
```
|
|
190
115
|
|
|
191
|
-
|
|
116
|
+
**Setup steps:**
|
|
117
|
+
1. Visit [Server酱 Sendkey](https://sct.ftqq.com/sendkey) and sign in with WeChat
|
|
118
|
+
2. Copy your SendKey (starts with `SCT`)
|
|
119
|
+
3. Paste it in your config file or in the Web UI settings
|
|
192
120
|
|
|
193
121
|
---
|
|
194
122
|
|
|
195
|
-
##
|
|
123
|
+
## Usage
|
|
196
124
|
|
|
197
125
|
```bash
|
|
198
|
-
#
|
|
126
|
+
# Start Claude Code
|
|
199
127
|
claude-remote
|
|
200
128
|
|
|
201
|
-
#
|
|
129
|
+
# Pass arguments to Claude
|
|
202
130
|
claude-remote chat
|
|
203
131
|
claude-remote -- --dangerously-skip-permissions
|
|
204
132
|
|
|
205
|
-
#
|
|
133
|
+
# Custom options
|
|
206
134
|
claude-remote --port 8080
|
|
207
135
|
claude-remote --name my-project
|
|
136
|
+
claude-remote --token my-secret-token
|
|
208
137
|
|
|
209
|
-
#
|
|
210
|
-
claude-remote attach 3001 #
|
|
211
|
-
claude-remote attach my-project #
|
|
138
|
+
# Attach to a web-spawned instance
|
|
139
|
+
claude-remote attach 3001 # by port
|
|
140
|
+
claude-remote attach my-project # by name
|
|
212
141
|
|
|
213
|
-
#
|
|
214
|
-
claude-remote --no-terminal
|
|
142
|
+
# Headless mode (no local terminal, web UI only)
|
|
143
|
+
claude-remote --no-terminal
|
|
215
144
|
```
|
|
216
145
|
|
|
217
|
-
###
|
|
218
|
-
|
|
219
|
-
- 单次 Ctrl+C:发送给 Claude Code(取消当前任务)
|
|
220
|
-
- **两次 Ctrl+C(间隔 < 500ms)**:停止代理层
|
|
146
|
+
### Stopping
|
|
221
147
|
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
```bash
|
|
225
|
-
pnpm stop
|
|
226
|
-
```
|
|
148
|
+
- **Single Ctrl+C** — sent to Claude Code (cancels current task)
|
|
149
|
+
- **Double Ctrl+C** (within 500ms) — stops the proxy server
|
|
227
150
|
|
|
228
151
|
---
|
|
229
152
|
|
|
230
|
-
##
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
|
255
|
-
|
|
256
|
-
| `
|
|
257
|
-
| `
|
|
258
|
-
| `
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
|
276
|
-
|
|
277
|
-
| Esc | `\u001b` | ESC 键 |
|
|
278
|
-
| Enter | `\r` | 回车键 |
|
|
279
|
-
| Tab | `\t` | Tab 键 |
|
|
280
|
-
| ↑ | `\u001b[A` | 上箭头 |
|
|
281
|
-
| ↓ | `\u001b[B` | 下箭头 |
|
|
282
|
-
| ← | `\u001b[D` | 左箭头 |
|
|
283
|
-
| → | `\u001b[C` | 右箭头 |
|
|
153
|
+
## Configuration
|
|
154
|
+
|
|
155
|
+
Config file: `~/.claude-remote/config.json`
|
|
156
|
+
|
|
157
|
+
| Option | Type | Default | Description |
|
|
158
|
+
|--------|------|---------|-------------|
|
|
159
|
+
| `port` | number | 3000 | Server port (auto-increments if busy) |
|
|
160
|
+
| `host` | string | "0.0.0.0" | Bind address |
|
|
161
|
+
| `token` | string \| null | null | Auth token; `null` = auto-generated shared token |
|
|
162
|
+
| `claudeCommand` | string | "claude" | Claude CLI path |
|
|
163
|
+
| `claudeArgs` | string[] | [] | Extra Claude CLI arguments |
|
|
164
|
+
| `claudeCwd` | string \| null | null | Claude working directory; `null` = current dir |
|
|
165
|
+
| `sessionTtlMs` | number | 86400000 | Session TTL in ms (default: 24h) |
|
|
166
|
+
| `authRateLimit` | number | 20 | Auth rate limit (per minute per IP) |
|
|
167
|
+
| `maxBufferLines` | number | 10000 | Output buffer max lines |
|
|
168
|
+
| `instanceName` | string \| null | null | Instance name; `null` = working dir name |
|
|
169
|
+
| `shortcuts` | array | see below | Quick-input buttons |
|
|
170
|
+
| `commands` | array | see below | Custom command buttons |
|
|
171
|
+
| `workspaces` | string[] | [] | Allowed working directories for web-spawned instances |
|
|
172
|
+
| `settingsDirs` | string[] | ["~/.claude/", "~/.claude-remote/settings/"] | Directories to scan for settings files |
|
|
173
|
+
| `notifications` | object | — | Notification channels config (see below) |
|
|
174
|
+
|
|
175
|
+
**Notification channel config:**
|
|
176
|
+
|
|
177
|
+
| Field | Type | Default | Description |
|
|
178
|
+
|-------|------|---------|-------------|
|
|
179
|
+
| `webhookUrl` | string | — | DingTalk webhook URL |
|
|
180
|
+
| `sendKey` | string | — | Server酱³ SendKey (WeChat) |
|
|
181
|
+
| `enabled` | boolean | true | Whether the channel is active |
|
|
182
|
+
|
|
183
|
+
**Priority**: CLI args > config file > defaults
|
|
184
|
+
|
|
185
|
+
### Shortcuts
|
|
186
|
+
|
|
187
|
+
Quick-input buttons displayed below the terminal.
|
|
188
|
+
|
|
189
|
+
**Default shortcuts:**
|
|
190
|
+
|
|
191
|
+
| Key | Data | Description |
|
|
192
|
+
|-----|------|-------------|
|
|
193
|
+
| Esc | `\u001b` | ESC key |
|
|
194
|
+
| Enter | `\r` | Enter key |
|
|
195
|
+
| Tab | `\t` | Tab key |
|
|
196
|
+
| ↑ | `\u001b[A` | Up arrow |
|
|
197
|
+
| ↓ | `\u001b[B` | Down arrow |
|
|
198
|
+
| ← | `\u001b[D` | Left arrow |
|
|
199
|
+
| → | `\u001b[C` | Right arrow |
|
|
284
200
|
| S-Tab | `\u001b[Z` | Shift+Tab |
|
|
285
201
|
|
|
286
|
-
|
|
202
|
+
**Custom example:**
|
|
287
203
|
|
|
288
204
|
```json
|
|
289
205
|
{
|
|
290
206
|
"shortcuts": [
|
|
291
|
-
{ "label": "
|
|
292
|
-
{ "label": "
|
|
293
|
-
{ "label": "
|
|
294
|
-
{ "label": "Ctrl+C", "data": "\u0003", "enabled": true, "desc": "中断当前操作" },
|
|
295
|
-
{ "label": "是的", "data": "yes", "enabled": false, "desc": "完整 yes 输入" }
|
|
207
|
+
{ "label": "Yes", "data": "y", "enabled": true, "desc": "Confirm" },
|
|
208
|
+
{ "label": "Esc", "data": "\u001b", "enabled": true, "desc": "Cancel (ESC)" },
|
|
209
|
+
{ "label": "Ctrl+C", "data": "\u0003", "enabled": true, "desc": "Interrupt" }
|
|
296
210
|
]
|
|
297
211
|
}
|
|
298
212
|
```
|
|
299
213
|
|
|
300
|
-
|
|
|
301
|
-
|
|
302
|
-
| `label` | string |
|
|
303
|
-
| `data` | string |
|
|
304
|
-
| `enabled` | boolean |
|
|
305
|
-
| `desc` | string |
|
|
214
|
+
| Field | Type | Description |
|
|
215
|
+
|-------|------|-------------|
|
|
216
|
+
| `label` | string | Button display text |
|
|
217
|
+
| `data` | string | Data to send (supports escape sequences like `\u001b` for ESC) |
|
|
218
|
+
| `enabled` | boolean | Whether the button is active |
|
|
219
|
+
| `desc` | string | Description (optional) |
|
|
306
220
|
|
|
307
|
-
|
|
308
|
-
- `\u001b` - ESC
|
|
309
|
-
- `\r` - Enter
|
|
221
|
+
**Common escape values:**
|
|
222
|
+
- `\u001b` - ESC
|
|
223
|
+
- `\r` - Enter
|
|
310
224
|
- `\u0003` - Ctrl+C
|
|
311
225
|
- `\u0004` - Ctrl+D
|
|
312
226
|
|
|
313
|
-
###
|
|
227
|
+
### Commands
|
|
314
228
|
|
|
315
|
-
|
|
229
|
+
Custom command buttons in the shortcut bar.
|
|
316
230
|
|
|
317
|
-
|
|
231
|
+
**Default commands:**
|
|
318
232
|
|
|
319
|
-
|
|
|
320
|
-
|
|
321
|
-
| /clear |
|
|
322
|
-
| /compact |
|
|
323
|
-
| /resume |
|
|
324
|
-
| /stats |
|
|
325
|
-
| /exit |
|
|
326
|
-
| /commit-commands:commit | Git 提交 |
|
|
327
|
-
| /feature-dev:feature-dev | 功能开发 |
|
|
328
|
-
| /auto-doc | 自动文档 |
|
|
329
|
-
| /code-review-expert | 代码审查 |
|
|
330
|
-
| /systematic-debugging | 系统调试 |
|
|
233
|
+
| Command | Description |
|
|
234
|
+
|---------|-------------|
|
|
235
|
+
| /clear | Clear screen |
|
|
236
|
+
| /compact | Compact conversation |
|
|
237
|
+
| /resume | Resume session |
|
|
238
|
+
| /stats | Statistics |
|
|
239
|
+
| /exit | Exit |
|
|
331
240
|
|
|
332
|
-
|
|
241
|
+
**Custom example:**
|
|
333
242
|
|
|
334
243
|
```json
|
|
335
244
|
{
|
|
336
245
|
"commands": [
|
|
337
|
-
{ "label": "/help", "command": "/help", "enabled": true
|
|
338
|
-
{ "label": "
|
|
339
|
-
{ "label": "Git Status", "command": "git status", "enabled": true, "autoSend": false, "desc": "填入输入框编辑后发送" },
|
|
340
|
-
{ "label": "/feature-dev:feature-dev", "command": "/feature-dev:feature-dev", "enabled": false, "desc": "启动feature-dev SKILL" }
|
|
246
|
+
{ "label": "/help", "command": "/help", "enabled": true },
|
|
247
|
+
{ "label": "Git Status", "command": "git status", "enabled": true, "autoSend": false }
|
|
341
248
|
]
|
|
342
249
|
}
|
|
343
250
|
```
|
|
344
251
|
|
|
345
|
-
|
|
|
346
|
-
|
|
347
|
-
| `label` | string |
|
|
348
|
-
| `command` | string |
|
|
349
|
-
| `enabled` | boolean |
|
|
350
|
-
| `autoSend` | boolean | `true` | `true
|
|
351
|
-
|
|
252
|
+
| Field | Type | Default | Description |
|
|
253
|
+
|-------|------|---------|-------------|
|
|
254
|
+
| `label` | string | — | Button display text |
|
|
255
|
+
| `command` | string | — | Command to execute |
|
|
256
|
+
| `enabled` | boolean | — | Whether the button is active |
|
|
257
|
+
| `autoSend` | boolean | `true` | `true` = send immediately, `false` = fill input box |
|
|
258
|
+
|
|
259
|
+
> Commands starting with `/` are Claude Code slash commands. Other commands are executed in the terminal.
|
|
352
260
|
|
|
353
|
-
###
|
|
261
|
+
### Workspaces
|
|
354
262
|
|
|
355
|
-
|
|
263
|
+
Restrict which directories web-spawned instances can use:
|
|
356
264
|
|
|
357
265
|
```json
|
|
358
266
|
{
|
|
359
267
|
"workspaces": [
|
|
360
|
-
"/
|
|
361
|
-
"/
|
|
362
|
-
"/Users/tom/projects/cli"
|
|
268
|
+
"/home/user/projects/api",
|
|
269
|
+
"/home/user/projects/web"
|
|
363
270
|
]
|
|
364
271
|
}
|
|
365
272
|
```
|
|
366
273
|
|
|
367
|
-
|
|
274
|
+
If not configured, web-spawned instances can only select projects from existed claude instances
|
|
275
|
+
|
|
276
|
+
### Settings Files
|
|
277
|
+
|
|
278
|
+
When creating instances from the web UI, you can select a custom settings file to pass via `--settings`. Settings files must:
|
|
368
279
|
|
|
369
|
-
|
|
280
|
+
1. Be named with `settings` prefix (e.g., `settings-project-a.json`, `settings.idea.json`)
|
|
281
|
+
2. Be valid JSON files ending in `.json`
|
|
282
|
+
3. Be located in one of the configured scan directories
|
|
370
283
|
|
|
371
|
-
|
|
284
|
+
**Default scan directories:**
|
|
285
|
+
- `~/.claude/` — Claude Code config directory
|
|
286
|
+
- `~/.claude-remote/settings/` — Claude Remote custom settings
|
|
287
|
+
|
|
288
|
+
**Custom directories:**
|
|
372
289
|
|
|
373
290
|
```json
|
|
374
291
|
{
|
|
375
|
-
"
|
|
376
|
-
"
|
|
377
|
-
|
|
292
|
+
"settingsDirs": [
|
|
293
|
+
"~/.claude/",
|
|
294
|
+
"~/.claude-remote/settings/",
|
|
295
|
+
"~/my-custom-settings/"
|
|
296
|
+
]
|
|
378
297
|
}
|
|
379
298
|
```
|
|
380
299
|
|
|
381
|
-
|
|
382
|
-
1. 打开钉钉群 → 群设置 → 智能群助手 → 添加机器人 → 自定义
|
|
383
|
-
2. 安全设置选择"自定义关键词",添加关键词 `Claude`(消息标题已包含此词)
|
|
384
|
-
3. 复制 Webhook URL 到配置文件
|
|
300
|
+
**Example settings file** (`~/.claude/settings-project-a.json`):
|
|
385
301
|
|
|
386
|
-
|
|
302
|
+
```json
|
|
303
|
+
{
|
|
304
|
+
"env": {
|
|
305
|
+
"ANTHROPIC_BASE_URL": "https://api.anthropic.com"
|
|
306
|
+
},
|
|
307
|
+
"permissions": {
|
|
308
|
+
"allow": ["Bash(git:*)", "Bash(npm:*)"]
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
```
|
|
387
312
|
|
|
388
|
-
>
|
|
313
|
+
> **Note**: Files like `3000.json` (port configs) are automatically excluded from the settings file list.
|
|
389
314
|
|
|
390
|
-
###
|
|
315
|
+
### Complete Example
|
|
391
316
|
|
|
392
317
|
```json
|
|
393
318
|
{
|
|
@@ -405,9 +330,9 @@ cp config.example.json ~/.claude-remote/config.json
|
|
|
405
330
|
"instanceName": null,
|
|
406
331
|
|
|
407
332
|
"shortcuts": [
|
|
408
|
-
{ "label": "
|
|
409
|
-
{ "label": "
|
|
410
|
-
{ "label": "
|
|
333
|
+
{ "label": "Yes", "data": "y", "enabled": true },
|
|
334
|
+
{ "label": "Esc", "data": "\u001b", "enabled": true },
|
|
335
|
+
{ "label": "Enter", "data": "\r", "enabled": true },
|
|
411
336
|
{ "label": "Ctrl+C", "data": "\u0003", "enabled": true }
|
|
412
337
|
],
|
|
413
338
|
|
|
@@ -417,33 +342,98 @@ cp config.example.json ~/.claude-remote/config.json
|
|
|
417
342
|
],
|
|
418
343
|
|
|
419
344
|
"workspaces": [
|
|
420
|
-
"/
|
|
421
|
-
"/
|
|
422
|
-
]
|
|
345
|
+
"/home/user/projects/api",
|
|
346
|
+
"/home/user/projects/web"
|
|
347
|
+
],
|
|
348
|
+
|
|
349
|
+
"notifications": {
|
|
350
|
+
"dingtalk": {
|
|
351
|
+
"webhookUrl": "https://oapi.dingtalk.com/robot/send?access_token=your-token"
|
|
352
|
+
}
|
|
353
|
+
}
|
|
423
354
|
}
|
|
424
355
|
```
|
|
425
356
|
|
|
426
357
|
---
|
|
427
358
|
|
|
428
|
-
##
|
|
359
|
+
## Security
|
|
429
360
|
|
|
430
|
-
-
|
|
431
|
-
-
|
|
432
|
-
-
|
|
361
|
+
- **Token auth** — 32-byte random token, generated on first run
|
|
362
|
+
- **Session cookie** — HttpOnly + SameSite=Lax, 24-hour TTL
|
|
363
|
+
- **Network isolation** — binds to LAN IP only, no public exposure
|
|
364
|
+
- **Rate limiting** — 20 auth attempts/min/IP
|
|
365
|
+
- **Hook security** — accepts localhost requests only
|
|
433
366
|
|
|
434
367
|
---
|
|
435
368
|
|
|
436
|
-
##
|
|
369
|
+
## Troubleshooting
|
|
370
|
+
|
|
371
|
+
### `node-pty` build failure
|
|
372
|
+
|
|
373
|
+
Install build tools:
|
|
437
374
|
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
-
|
|
441
|
-
-
|
|
442
|
-
|
|
443
|
-
-
|
|
375
|
+
| OS | Command |
|
|
376
|
+
|----|---------|
|
|
377
|
+
| macOS | `xcode-select --install` |
|
|
378
|
+
| Ubuntu/Debian | `sudo apt-get install build-essential python3` |
|
|
379
|
+
| Fedora/RHEL | `sudo dnf groupinstall 'Development Tools'` |
|
|
380
|
+
| Arch Linux | `sudo pacman -S base-devel python` |
|
|
381
|
+
|
|
382
|
+
### QR code won't scan?
|
|
383
|
+
|
|
384
|
+
1. Make sure your phone and PC are on the same network
|
|
385
|
+
2. Manually open the URL shown in the terminal and enter the token
|
|
386
|
+
|
|
387
|
+
### Phone can't connect?
|
|
388
|
+
|
|
389
|
+
1. Check your PC firewall allows the port (default: 3000)
|
|
390
|
+
2. Verify the URL shows the correct LAN IP
|
|
391
|
+
3. If using a VPN, try setting the `host` option explicitly
|
|
392
|
+
|
|
393
|
+
---
|
|
394
|
+
|
|
395
|
+
## Prerequisites
|
|
396
|
+
|
|
397
|
+
- **Node.js** >= 20
|
|
398
|
+
- **Claude Code CLI** — [installation guide](https://docs.anthropic.com/en/docs/claude-code)
|
|
399
|
+
|
|
400
|
+
> `pnpm` and Claude CLI will be auto-installed on first run if missing.
|
|
401
|
+
|
|
402
|
+
---
|
|
403
|
+
|
|
404
|
+
## Development
|
|
405
|
+
|
|
406
|
+
**Source development:**
|
|
407
|
+
|
|
408
|
+
```bash
|
|
409
|
+
# Clone and install
|
|
410
|
+
git clone https://github.com/StephenTowne/open-claude-remote.git
|
|
411
|
+
cd open-claude-remote
|
|
412
|
+
pnpm install
|
|
413
|
+
|
|
414
|
+
# Development mode (with hot reload)
|
|
415
|
+
pnpm dev:cli
|
|
416
|
+
|
|
417
|
+
# Production mode
|
|
418
|
+
pnpm build && pnpm link -g && claude-remote
|
|
419
|
+
```
|
|
420
|
+
|
|
421
|
+
**Project structure:**
|
|
422
|
+
|
|
423
|
+
- Backend: `backend/src/` (Express + node-pty + WebSocket)
|
|
424
|
+
- Frontend: `frontend/src/` (React + xterm.js)
|
|
425
|
+
- Shared types: `shared/` (imported via `#shared` alias)
|
|
426
|
+
- Tests: `pnpm test` (Vitest)
|
|
427
|
+
- Build: `pnpm build` (TypeScript + Vite)
|
|
428
|
+
|
|
429
|
+
### Stop all instances
|
|
430
|
+
|
|
431
|
+
```bash
|
|
432
|
+
pnpm stop
|
|
433
|
+
```
|
|
444
434
|
|
|
445
435
|
---
|
|
446
436
|
|
|
447
437
|
## License
|
|
448
438
|
|
|
449
|
-
MIT
|
|
439
|
+
MIT
|