@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.
Files changed (322) hide show
  1. package/README.md +285 -295
  2. package/dist/backend/src/api/auth-routes.d.ts.map +1 -0
  3. package/dist/backend/src/api/auth-routes.js.map +1 -0
  4. package/dist/backend/src/api/config-routes.d.ts +7 -0
  5. package/dist/backend/src/api/config-routes.d.ts.map +1 -0
  6. package/dist/{api → backend/src/api}/config-routes.js +125 -13
  7. package/dist/backend/src/api/config-routes.js.map +1 -0
  8. package/dist/backend/src/api/health-routes.d.ts.map +1 -0
  9. package/dist/backend/src/api/health-routes.js.map +1 -0
  10. package/dist/backend/src/api/hook-routes.d.ts.map +1 -0
  11. package/dist/backend/src/api/hook-routes.js.map +1 -0
  12. package/dist/{api → backend/src/api}/instance-routes.d.ts +5 -1
  13. package/dist/backend/src/api/instance-routes.d.ts.map +1 -0
  14. package/dist/{api → backend/src/api}/instance-routes.js +5 -1
  15. package/dist/backend/src/api/instance-routes.js.map +1 -0
  16. package/dist/backend/src/api/push-routes.d.ts.map +1 -0
  17. package/dist/backend/src/api/push-routes.js.map +1 -0
  18. package/dist/{api → backend/src/api}/router.d.ts +7 -1
  19. package/dist/backend/src/api/router.d.ts.map +1 -0
  20. package/dist/{api → backend/src/api}/router.js +1 -1
  21. package/dist/backend/src/api/router.js.map +1 -0
  22. package/dist/backend/src/api/status-routes.d.ts.map +1 -0
  23. package/dist/backend/src/api/status-routes.js.map +1 -0
  24. package/dist/backend/src/attach.d.ts.map +1 -0
  25. package/dist/{attach.js → backend/src/attach.js} +11 -11
  26. package/dist/backend/src/attach.js.map +1 -0
  27. package/dist/backend/src/auth/auth-middleware.d.ts.map +1 -0
  28. package/dist/backend/src/auth/auth-middleware.js.map +1 -0
  29. package/dist/backend/src/auth/rate-limiter.d.ts.map +1 -0
  30. package/dist/backend/src/auth/rate-limiter.js.map +1 -0
  31. package/dist/backend/src/auth/token-generator.d.ts.map +1 -0
  32. package/dist/{auth → backend/src/auth}/token-generator.js +1 -1
  33. package/dist/backend/src/auth/token-generator.js.map +1 -0
  34. package/dist/{cli-utils.d.ts → backend/src/cli-utils.d.ts} +3 -3
  35. package/dist/backend/src/cli-utils.d.ts.map +1 -0
  36. package/dist/{cli-utils.js → backend/src/cli-utils.js} +49 -36
  37. package/dist/backend/src/cli-utils.js.map +1 -0
  38. package/dist/backend/src/cli.d.ts +22 -0
  39. package/dist/backend/src/cli.d.ts.map +1 -0
  40. package/dist/{cli.js → backend/src/cli.js} +21 -16
  41. package/dist/backend/src/cli.js.map +1 -0
  42. package/dist/{config.d.ts → backend/src/config.d.ts} +29 -5
  43. package/dist/backend/src/config.d.ts.map +1 -0
  44. package/dist/{config.js → backend/src/config.js} +198 -12
  45. package/dist/backend/src/config.js.map +1 -0
  46. package/dist/backend/src/deps/detector.d.ts +18 -0
  47. package/dist/backend/src/deps/detector.d.ts.map +1 -0
  48. package/dist/backend/src/deps/detector.js +49 -0
  49. package/dist/backend/src/deps/detector.js.map +1 -0
  50. package/dist/backend/src/deps/index.d.ts +14 -0
  51. package/dist/backend/src/deps/index.d.ts.map +1 -0
  52. package/dist/backend/src/deps/index.js +219 -0
  53. package/dist/backend/src/deps/index.js.map +1 -0
  54. package/dist/backend/src/deps/installer.d.ts +13 -0
  55. package/dist/backend/src/deps/installer.d.ts.map +1 -0
  56. package/dist/backend/src/deps/installer.js +113 -0
  57. package/dist/backend/src/deps/installer.js.map +1 -0
  58. package/dist/backend/src/deps/platform.d.ts +27 -0
  59. package/dist/backend/src/deps/platform.d.ts.map +1 -0
  60. package/dist/backend/src/deps/platform.js +154 -0
  61. package/dist/backend/src/deps/platform.js.map +1 -0
  62. package/dist/backend/src/deps/prompt.d.ts +51 -0
  63. package/dist/backend/src/deps/prompt.d.ts.map +1 -0
  64. package/dist/backend/src/deps/prompt.js +128 -0
  65. package/dist/backend/src/deps/prompt.js.map +1 -0
  66. package/dist/backend/src/deps/types.d.ts +40 -0
  67. package/dist/backend/src/deps/types.d.ts.map +1 -0
  68. package/dist/backend/src/deps/types.js +54 -0
  69. package/dist/backend/src/deps/types.js.map +1 -0
  70. package/dist/backend/src/hooks/hook-receiver.d.ts +39 -0
  71. package/dist/backend/src/hooks/hook-receiver.d.ts.map +1 -0
  72. package/dist/backend/src/hooks/hook-receiver.js +96 -0
  73. package/dist/backend/src/hooks/hook-receiver.js.map +1 -0
  74. package/dist/backend/src/hooks/hook-types.d.ts +165 -0
  75. package/dist/backend/src/hooks/hook-types.d.ts.map +1 -0
  76. package/dist/backend/src/hooks/hook-types.js +16 -0
  77. package/dist/backend/src/hooks/hook-types.js.map +1 -0
  78. package/dist/backend/src/index.d.ts.map +1 -0
  79. package/dist/{index.js → backend/src/index.js} +27 -32
  80. package/dist/backend/src/index.js.map +1 -0
  81. package/dist/backend/src/logger/logger.d.ts.map +1 -0
  82. package/dist/{logger → backend/src/logger}/logger.js +3 -5
  83. package/dist/{logger → backend/src/logger}/logger.js.map +1 -1
  84. package/dist/backend/src/notification/dingtalk-service.d.ts.map +1 -0
  85. package/dist/{notification → backend/src/notification}/dingtalk-service.js +1 -1
  86. package/dist/backend/src/notification/dingtalk-service.js.map +1 -0
  87. package/dist/backend/src/notification/notification-manager.d.ts +44 -0
  88. package/dist/backend/src/notification/notification-manager.d.ts.map +1 -0
  89. package/dist/backend/src/notification/notification-manager.js +94 -0
  90. package/dist/backend/src/notification/notification-manager.js.map +1 -0
  91. package/dist/backend/src/notification/notification-service-factory.d.ts +67 -0
  92. package/dist/backend/src/notification/notification-service-factory.d.ts.map +1 -0
  93. package/dist/backend/src/notification/notification-service-factory.js +146 -0
  94. package/dist/backend/src/notification/notification-service-factory.js.map +1 -0
  95. package/dist/backend/src/notification/wechat-work-service.d.ts +24 -0
  96. package/dist/backend/src/notification/wechat-work-service.d.ts.map +1 -0
  97. package/dist/backend/src/notification/wechat-work-service.js +88 -0
  98. package/dist/backend/src/notification/wechat-work-service.js.map +1 -0
  99. package/dist/backend/src/pty/output-buffer.d.ts.map +1 -0
  100. package/dist/backend/src/pty/output-buffer.js.map +1 -0
  101. package/dist/backend/src/pty/pty-manager.d.ts.map +1 -0
  102. package/dist/backend/src/pty/pty-manager.js.map +1 -0
  103. package/dist/backend/src/pty/types.d.ts.map +1 -0
  104. package/dist/{pty → backend/src/pty}/types.js.map +1 -1
  105. package/dist/backend/src/pty/virtual-pty.d.ts.map +1 -0
  106. package/dist/backend/src/pty/virtual-pty.js.map +1 -0
  107. package/dist/backend/src/push/push-service.d.ts.map +1 -0
  108. package/dist/backend/src/push/push-service.js.map +1 -0
  109. package/dist/{registry → backend/src/registry}/instance-registry.d.ts +1 -1
  110. package/dist/backend/src/registry/instance-registry.d.ts.map +1 -0
  111. package/dist/{registry → backend/src/registry}/instance-registry.js +1 -1
  112. package/dist/backend/src/registry/instance-registry.js.map +1 -0
  113. package/dist/backend/src/registry/instance-spawner.d.ts.map +1 -0
  114. package/dist/{registry → backend/src/registry}/instance-spawner.js +17 -5
  115. package/dist/backend/src/registry/instance-spawner.js.map +1 -0
  116. package/dist/backend/src/registry/port-finder.d.ts.map +1 -0
  117. package/dist/backend/src/registry/port-finder.js.map +1 -0
  118. package/dist/backend/src/registry/shared-token.d.ts.map +1 -0
  119. package/dist/backend/src/registry/shared-token.js.map +1 -0
  120. package/dist/{registry → backend/src/registry}/stop-instances.d.ts +1 -1
  121. package/dist/backend/src/registry/stop-instances.d.ts.map +1 -0
  122. package/dist/{registry → backend/src/registry}/stop-instances.js +1 -1
  123. package/dist/backend/src/registry/stop-instances.js.map +1 -0
  124. package/dist/{session → backend/src/session}/session-controller.d.ts +21 -6
  125. package/dist/backend/src/session/session-controller.d.ts.map +1 -0
  126. package/dist/{session → backend/src/session}/session-controller.js +108 -25
  127. package/dist/backend/src/session/session-controller.js.map +1 -0
  128. package/dist/backend/src/terminal/terminal-relay.d.ts.map +1 -0
  129. package/dist/backend/src/terminal/terminal-relay.js.map +1 -0
  130. package/dist/backend/src/utils/ansi-filter.d.ts.map +1 -0
  131. package/dist/backend/src/utils/ansi-filter.js.map +1 -0
  132. package/dist/backend/src/utils/file-lock.d.ts.map +1 -0
  133. package/dist/backend/src/utils/file-lock.js.map +1 -0
  134. package/dist/backend/src/utils/ip-monitor.d.ts.map +1 -0
  135. package/dist/backend/src/utils/ip-monitor.js.map +1 -0
  136. package/dist/backend/src/utils/network.d.ts.map +1 -0
  137. package/dist/backend/src/utils/network.js.map +1 -0
  138. package/dist/backend/src/utils/qrcode-banner.d.ts.map +1 -0
  139. package/dist/backend/src/utils/qrcode-banner.js.map +1 -0
  140. package/dist/backend/src/ws/ws-handler.d.ts.map +1 -0
  141. package/dist/backend/src/ws/ws-handler.js.map +1 -0
  142. package/dist/{ws → backend/src/ws}/ws-server.d.ts +1 -1
  143. package/dist/backend/src/ws/ws-server.d.ts.map +1 -0
  144. package/dist/{ws → backend/src/ws}/ws-server.js +2 -2
  145. package/dist/backend/src/ws/ws-server.js.map +1 -0
  146. package/dist/shared/constants.d.ts.map +1 -0
  147. package/dist/shared/constants.js.map +1 -0
  148. package/dist/shared/defaults.d.ts.map +1 -0
  149. package/dist/shared/defaults.js.map +1 -0
  150. package/{shared-dist → dist/shared}/index.d.ts +1 -0
  151. package/dist/shared/index.d.ts.map +1 -0
  152. package/{shared-dist → dist/shared}/index.js +1 -0
  153. package/dist/shared/index.js.map +1 -0
  154. package/{shared-dist → dist/shared}/instance.d.ts +13 -0
  155. package/dist/shared/instance.d.ts.map +1 -0
  156. package/dist/shared/instance.js.map +1 -0
  157. package/dist/shared/notification-types.d.ts +85 -0
  158. package/dist/shared/notification-types.d.ts.map +1 -0
  159. package/dist/shared/notification-types.js +92 -0
  160. package/dist/shared/notification-types.js.map +1 -0
  161. package/{shared-dist → dist/shared}/ws-protocol.d.ts +6 -1
  162. package/dist/shared/ws-protocol.d.ts.map +1 -0
  163. package/dist/shared/ws-protocol.js.map +1 -0
  164. package/frontend-dist/assets/index-DOeBWumG.js +152 -0
  165. package/frontend-dist/index.html +2 -2
  166. package/package.json +62 -27
  167. package/scripts/build.sh +21 -0
  168. package/scripts/dev.sh +11 -0
  169. package/scripts/fix-node-pty-permissions.js +47 -0
  170. package/scripts/git-hooks/pre-commit +258 -0
  171. package/scripts/stop.sh +5 -0
  172. package/dist/api/auth-routes.d.ts.map +0 -1
  173. package/dist/api/auth-routes.js.map +0 -1
  174. package/dist/api/config-routes.d.ts +0 -4
  175. package/dist/api/config-routes.d.ts.map +0 -1
  176. package/dist/api/config-routes.js.map +0 -1
  177. package/dist/api/health-routes.d.ts.map +0 -1
  178. package/dist/api/health-routes.js.map +0 -1
  179. package/dist/api/hook-routes.d.ts.map +0 -1
  180. package/dist/api/hook-routes.js.map +0 -1
  181. package/dist/api/instance-routes.d.ts.map +0 -1
  182. package/dist/api/instance-routes.js.map +0 -1
  183. package/dist/api/push-routes.d.ts.map +0 -1
  184. package/dist/api/push-routes.js.map +0 -1
  185. package/dist/api/router.d.ts.map +0 -1
  186. package/dist/api/router.js.map +0 -1
  187. package/dist/api/status-routes.d.ts.map +0 -1
  188. package/dist/api/status-routes.js.map +0 -1
  189. package/dist/attach.d.ts.map +0 -1
  190. package/dist/attach.js.map +0 -1
  191. package/dist/auth/auth-middleware.d.ts.map +0 -1
  192. package/dist/auth/auth-middleware.js.map +0 -1
  193. package/dist/auth/rate-limiter.d.ts.map +0 -1
  194. package/dist/auth/rate-limiter.js.map +0 -1
  195. package/dist/auth/token-generator.d.ts.map +0 -1
  196. package/dist/auth/token-generator.js.map +0 -1
  197. package/dist/cli-utils.d.ts.map +0 -1
  198. package/dist/cli-utils.js.map +0 -1
  199. package/dist/cli.d.ts +0 -21
  200. package/dist/cli.d.ts.map +0 -1
  201. package/dist/cli.js.map +0 -1
  202. package/dist/config.d.ts.map +0 -1
  203. package/dist/config.js.map +0 -1
  204. package/dist/hooks/hook-receiver.d.ts +0 -39
  205. package/dist/hooks/hook-receiver.d.ts.map +0 -1
  206. package/dist/hooks/hook-receiver.js +0 -46
  207. package/dist/hooks/hook-receiver.js.map +0 -1
  208. package/dist/index.d.ts.map +0 -1
  209. package/dist/index.js.map +0 -1
  210. package/dist/logger/logger.d.ts.map +0 -1
  211. package/dist/notification/dingtalk-service.d.ts.map +0 -1
  212. package/dist/notification/dingtalk-service.js.map +0 -1
  213. package/dist/pty/output-buffer.d.ts.map +0 -1
  214. package/dist/pty/output-buffer.js.map +0 -1
  215. package/dist/pty/pty-manager.d.ts.map +0 -1
  216. package/dist/pty/pty-manager.js.map +0 -1
  217. package/dist/pty/types.d.ts.map +0 -1
  218. package/dist/pty/virtual-pty.d.ts.map +0 -1
  219. package/dist/pty/virtual-pty.js.map +0 -1
  220. package/dist/push/push-service.d.ts.map +0 -1
  221. package/dist/push/push-service.js.map +0 -1
  222. package/dist/registry/instance-registry.d.ts.map +0 -1
  223. package/dist/registry/instance-registry.js.map +0 -1
  224. package/dist/registry/instance-spawner.d.ts.map +0 -1
  225. package/dist/registry/instance-spawner.js.map +0 -1
  226. package/dist/registry/port-finder.d.ts.map +0 -1
  227. package/dist/registry/port-finder.js.map +0 -1
  228. package/dist/registry/shared-token.d.ts.map +0 -1
  229. package/dist/registry/shared-token.js.map +0 -1
  230. package/dist/registry/stop-instances.d.ts.map +0 -1
  231. package/dist/registry/stop-instances.js.map +0 -1
  232. package/dist/session/session-controller.d.ts.map +0 -1
  233. package/dist/session/session-controller.js.map +0 -1
  234. package/dist/terminal/terminal-relay.d.ts.map +0 -1
  235. package/dist/terminal/terminal-relay.js.map +0 -1
  236. package/dist/utils/ansi-filter.d.ts.map +0 -1
  237. package/dist/utils/ansi-filter.js.map +0 -1
  238. package/dist/utils/file-lock.d.ts.map +0 -1
  239. package/dist/utils/file-lock.js.map +0 -1
  240. package/dist/utils/ip-monitor.d.ts.map +0 -1
  241. package/dist/utils/ip-monitor.js.map +0 -1
  242. package/dist/utils/network.d.ts.map +0 -1
  243. package/dist/utils/network.js.map +0 -1
  244. package/dist/utils/pid-file.d.ts +0 -10
  245. package/dist/utils/pid-file.d.ts.map +0 -1
  246. package/dist/utils/pid-file.js +0 -30
  247. package/dist/utils/pid-file.js.map +0 -1
  248. package/dist/utils/qrcode-banner.d.ts.map +0 -1
  249. package/dist/utils/qrcode-banner.js.map +0 -1
  250. package/dist/ws/ws-handler.d.ts.map +0 -1
  251. package/dist/ws/ws-handler.js.map +0 -1
  252. package/dist/ws/ws-server.d.ts.map +0 -1
  253. package/dist/ws/ws-server.js.map +0 -1
  254. package/frontend-dist/assets/index-BqqB1hYe.js +0 -141
  255. package/shared-dist/constants.d.ts.map +0 -1
  256. package/shared-dist/constants.js.map +0 -1
  257. package/shared-dist/defaults.d.ts.map +0 -1
  258. package/shared-dist/defaults.js.map +0 -1
  259. package/shared-dist/index.d.ts.map +0 -1
  260. package/shared-dist/index.js.map +0 -1
  261. package/shared-dist/instance.d.ts.map +0 -1
  262. package/shared-dist/instance.js.map +0 -1
  263. package/shared-dist/question-utils.d.ts +0 -15
  264. package/shared-dist/question-utils.d.ts.map +0 -1
  265. package/shared-dist/question-utils.js +0 -24
  266. package/shared-dist/question-utils.js.map +0 -1
  267. package/shared-dist/ws-protocol.d.ts.map +0 -1
  268. package/shared-dist/ws-protocol.js.map +0 -1
  269. /package/dist/{api → backend/src/api}/auth-routes.d.ts +0 -0
  270. /package/dist/{api → backend/src/api}/auth-routes.js +0 -0
  271. /package/dist/{api → backend/src/api}/health-routes.d.ts +0 -0
  272. /package/dist/{api → backend/src/api}/health-routes.js +0 -0
  273. /package/dist/{api → backend/src/api}/hook-routes.d.ts +0 -0
  274. /package/dist/{api → backend/src/api}/hook-routes.js +0 -0
  275. /package/dist/{api → backend/src/api}/push-routes.d.ts +0 -0
  276. /package/dist/{api → backend/src/api}/push-routes.js +0 -0
  277. /package/dist/{api → backend/src/api}/status-routes.d.ts +0 -0
  278. /package/dist/{api → backend/src/api}/status-routes.js +0 -0
  279. /package/dist/{attach.d.ts → backend/src/attach.d.ts} +0 -0
  280. /package/dist/{auth → backend/src/auth}/auth-middleware.d.ts +0 -0
  281. /package/dist/{auth → backend/src/auth}/auth-middleware.js +0 -0
  282. /package/dist/{auth → backend/src/auth}/rate-limiter.d.ts +0 -0
  283. /package/dist/{auth → backend/src/auth}/rate-limiter.js +0 -0
  284. /package/dist/{auth → backend/src/auth}/token-generator.d.ts +0 -0
  285. /package/dist/{index.d.ts → backend/src/index.d.ts} +0 -0
  286. /package/dist/{logger → backend/src/logger}/logger.d.ts +0 -0
  287. /package/dist/{notification → backend/src/notification}/dingtalk-service.d.ts +0 -0
  288. /package/dist/{pty → backend/src/pty}/output-buffer.d.ts +0 -0
  289. /package/dist/{pty → backend/src/pty}/output-buffer.js +0 -0
  290. /package/dist/{pty → backend/src/pty}/pty-manager.d.ts +0 -0
  291. /package/dist/{pty → backend/src/pty}/pty-manager.js +0 -0
  292. /package/dist/{pty → backend/src/pty}/types.d.ts +0 -0
  293. /package/dist/{pty → backend/src/pty}/types.js +0 -0
  294. /package/dist/{pty → backend/src/pty}/virtual-pty.d.ts +0 -0
  295. /package/dist/{pty → backend/src/pty}/virtual-pty.js +0 -0
  296. /package/dist/{push → backend/src/push}/push-service.d.ts +0 -0
  297. /package/dist/{push → backend/src/push}/push-service.js +0 -0
  298. /package/dist/{registry → backend/src/registry}/instance-spawner.d.ts +0 -0
  299. /package/dist/{registry → backend/src/registry}/port-finder.d.ts +0 -0
  300. /package/dist/{registry → backend/src/registry}/port-finder.js +0 -0
  301. /package/dist/{registry → backend/src/registry}/shared-token.d.ts +0 -0
  302. /package/dist/{registry → backend/src/registry}/shared-token.js +0 -0
  303. /package/dist/{terminal → backend/src/terminal}/terminal-relay.d.ts +0 -0
  304. /package/dist/{terminal → backend/src/terminal}/terminal-relay.js +0 -0
  305. /package/dist/{utils → backend/src/utils}/ansi-filter.d.ts +0 -0
  306. /package/dist/{utils → backend/src/utils}/ansi-filter.js +0 -0
  307. /package/dist/{utils → backend/src/utils}/file-lock.d.ts +0 -0
  308. /package/dist/{utils → backend/src/utils}/file-lock.js +0 -0
  309. /package/dist/{utils → backend/src/utils}/ip-monitor.d.ts +0 -0
  310. /package/dist/{utils → backend/src/utils}/ip-monitor.js +0 -0
  311. /package/dist/{utils → backend/src/utils}/network.d.ts +0 -0
  312. /package/dist/{utils → backend/src/utils}/network.js +0 -0
  313. /package/dist/{utils → backend/src/utils}/qrcode-banner.d.ts +0 -0
  314. /package/dist/{utils → backend/src/utils}/qrcode-banner.js +0 -0
  315. /package/dist/{ws → backend/src/ws}/ws-handler.d.ts +0 -0
  316. /package/dist/{ws → backend/src/ws}/ws-handler.js +0 -0
  317. /package/{shared-dist → dist/shared}/constants.d.ts +0 -0
  318. /package/{shared-dist → dist/shared}/constants.js +0 -0
  319. /package/{shared-dist → dist/shared}/defaults.d.ts +0 -0
  320. /package/{shared-dist → dist/shared}/defaults.js +0 -0
  321. /package/{shared-dist → dist/shared}/instance.js +0 -0
  322. /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
- **手机远程掌控 PC 终端的 Claude Code**
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
- ## 快速开始 (3 步)
9
+ ## Quick Start
10
10
 
11
- ### 0. 镜像配置(国内用户)
12
-
13
- 国内网络可能较慢,建议先配置淘宝镜像:
11
+ ### 1. Install
14
12
 
15
13
  ```bash
16
- cp .npmrc.example .npmrc
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
- ```bash
28
- git clone <repo-url> claude-code-remote
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
- ### Claude Code窗口自适应
35
+ ## Features
66
36
 
67
- **优先级**:WebApp(手机端)> Attach(PC 端)> PC 终端
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
- | 无客户端连接 | PC 终端 | 正常本地使用 |
72
- | WebApp 连接 | WebApp | 手机端调整窗口大小|
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
- - WebApp 在线时,Attach 客户端的 resize 请求会被忽略
78
- - Attach 连接后会自动同步 WebApp 设置的尺寸
79
- - 调整 WebApp 窗口大小,Attach 终端会跟随变化
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
- Claude 等待输入时,可通过多种方式收到提醒:
62
+ ### Window Resize Priority
84
63
 
85
- #### Web 推送通知(手机浏览器)
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
- 1. 手机浏览器访问 Web UI
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
- 配置钉钉群机器人 Webhook,即使手机不在身边也能收到提醒。
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
- "dingtalk": {
116
- "webhookUrl": "https://oapi.dingtalk.com/robot/send?access_token=your-token"
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
- ### Web UI 设置界面
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
- 1. 确保手机和 PC 在同一局域网
175
- 2. 手动访问终端显示的 URL,输入 Token
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
- 1. 检查 PC 防火墙是否放行端口(默认 3000)
180
- 2. 检查终端显示的 URL 是否为正确的局域网 IP
181
- 3. 如果使用 VPN,可能需要配置 `host` 选项(见下方配置说明)
182
-
183
- ### 如何配置 Hook(审批通知)?
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
- Hook 配置详情请参见 [ARCHITECTURE.md#routes](./ARCHITECTURE.md#5-routes)。
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
- # 直接运行(等同于 claude)
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
- # 接管 web 创建的实例
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
- # Web 创建实例(无终端模式)
214
- claude-remote --no-terminal # 不启动本地终端,仅提供 Web 界面
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
- - **Token 认证**:32 字节随机 Token,首次启动生成
233
- - **Session Cookie**:HttpOnly + SameSite=Lax,24 小时有效
234
- - **网络隔离**:仅绑定局域网 IP,无公网暴露
235
- - **速率限制**:认证接口 5 次/分钟/IP
236
- - **Hook 安全**:仅接受 localhost 请求
237
-
238
- ---
239
-
240
- ## 配置文件
241
-
242
- 配置文件位于 `~/.claude-remote/config.json`。项目根目录提供 `config.example.json` 作为模板:
243
-
244
- ```bash
245
- cp config.example.json ~/.claude-remote/config.json
246
- ```
247
-
248
- ### 完整配置项
249
-
250
- | 配置项 | 类型 | 默认值 | 说明 |
251
- |--------|------|--------|------|
252
- | `port` | number | 3000 | 服务监听端口(被占用自动递增) |
253
- | `host` | string | "0.0.0.0" | 绑定地址 |
254
- | `token` | string \| null | null | 认证 Token,`null` 自动生成共享 Token |
255
- | `claudeCommand` | string | "claude" | Claude CLI 命令路径(可用绝对路径) |
256
- | `claudeArgs` | string[] | [] | Claude CLI 额外参数 |
257
- | `claudeCwd` | string \| null | null | Claude 工作目录,`null` 使用当前目录 |
258
- | `sessionTtlMs` | number | 86400000 | Session 有效期(毫秒,默认 24 小时) |
259
- | `authRateLimit` | number | 20 | 认证速率限制(每分钟每 IP 次数) |
260
- | `maxBufferLines` | number | 10000 | 输出缓冲区最大行数 |
261
- | `instanceName` | string \| null | null | 实例名称,`null` 使用工作目录名 |
262
- | `shortcuts` | array | 见下方 | 快捷输入列表(缺失时 API 返回默认值,不写入文件) |
263
- | `commands` | array | 见下方 | 自定义命令列表(缺失时 API 返回默认值,不写入文件) |
264
- | `workspaces` | string[] | [] | 预设工作目录列表(Web 创建实例的白名单) |
265
- | `dingtalk` | object | - | 钉钉通知配置(见下方) |
266
-
267
- **优先级**:CLI 参数 > 配置文件 > 默认值
268
-
269
- ### 快捷输入 (shortcuts)
270
-
271
- 快捷输入显示在终端下方的快捷栏,用于快速发送常用按键或文本。
272
-
273
- **当配置文件中未定义 `shortcuts` 字段时,API 返回时自动填充以下默认值:**
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": "确认", "data": "y", "enabled": true, "desc": "确认操作" },
292
- { "label": "取消", "data": "\u001b", "enabled": true, "desc": "取消操作 (ESC)" },
293
- { "label": "继续", "data": "\r", "enabled": true, "desc": "继续执行 (Enter)" },
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 | 发送的数据(支持转义字符如 `\u001b` 表示 ESC |
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
- ### 自定义命令 (commands)
227
+ ### Commands
314
228
 
315
- 自定义命令显示在快捷栏的命令区域。
229
+ Custom command buttons in the shortcut bar.
316
230
 
317
- **当配置文件中未定义 `commands` 字段时,API 返回时自动填充以下默认值:**
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, "desc": "帮助说明" },
338
- { "label": "/clear", "command": "/clear", "enabled": true },
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`=点击直接发送,`false`=填入输入框 |
351
- | `desc` | string | - | 描述(可选) |
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
- ### 工作区白名单 (workspaces)
261
+ ### Workspaces
354
262
 
355
- 配置后,通过 Web 创建实例时只能选择这些目录:
263
+ Restrict which directories web-spawned instances can use:
356
264
 
357
265
  ```json
358
266
  {
359
267
  "workspaces": [
360
- "/Users/tom/projects/api",
361
- "/Users/tom/projects/web",
362
- "/Users/tom/projects/cli"
268
+ "/home/user/projects/api",
269
+ "/home/user/projects/web"
363
270
  ]
364
271
  }
365
272
  ```
366
273
 
367
- 若未配置,Web 创建实例时只能选择 home 目录下的项目。
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
- ### 钉钉通知 (dingtalk)
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
- 配置钉钉群机器人 Webhook,当 Claude 需要输入时发送通知到钉钉群:
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
- "dingtalk": {
376
- "webhookUrl": "https://oapi.dingtalk.com/robot/send?access_token=your-token"
377
- }
292
+ "settingsDirs": [
293
+ "~/.claude/",
294
+ "~/.claude-remote/settings/",
295
+ "~/my-custom-settings/"
296
+ ]
378
297
  }
379
298
  ```
380
299
 
381
- 获取 Webhook URL:
382
- 1. 打开钉钉群 → 群设置 → 智能群助手 → 添加机器人 → 自定义
383
- 2. 安全设置选择"自定义关键词",添加关键词 `Claude`(消息标题已包含此词)
384
- 3. 复制 Webhook URL 到配置文件
300
+ **Example settings file** (`~/.claude/settings-project-a.json`):
385
301
 
386
- 也可以在 Web UI 设置界面中配置(推荐)。
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": "确认", "data": "y", "enabled": true },
409
- { "label": "取消", "data": "\u001b", "enabled": true },
410
- { "label": "继续", "data": "\r", "enabled": true },
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
- "/Users/tom/projects/api",
421
- "/Users/tom/projects/web"
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
- - Node.js >= 20
431
- - pnpm >= 9
432
- - [Claude Code CLI](https://docs.anthropic.com/en/docs/claude-code) 已安装
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
- 参见 [ARCHITECTURE.md](./ARCHITECTURE.md),包含:
439
- - 技术栈详情
440
- - 架构分层
441
- - 数据流图
442
- - API 路由
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