@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
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detector.js","sourceRoot":"","sources":["../../../../backend/src/deps/detector.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EACL,YAAY,EAGZ,iBAAiB,GAClB,MAAM,YAAY,CAAC;AAEpB,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAE1C;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,IAAoB;IACxD,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IAE/B,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC,GAAG,CAAC,YAAY,EAAE,GAAG,CAAC,SAAS,EAAE;YACtE,OAAO,EAAE,IAAI;SACd,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;QAC7B,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QAE7C,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;QAChD,CAAC;QAED,wBAAwB;QACxB,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC7D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IAC9B,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAAe,EAAE,UAAkB;IAClE,MAAM,KAAK,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;IACzC,MAAM,QAAQ,GAAG,iBAAiB,CAAC,UAAU,CAAC,CAAC;IAC/C,OAAO,KAAK,IAAI,QAAQ,CAAC;AAC3B,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB;IAGxC,MAAM,OAAO,GAAwC;QACnD,IAAI,EAAE,MAAM,eAAe,CAAC,MAAM,CAAC;QACnC,IAAI,EAAE,MAAM,eAAe,CAAC,MAAM,CAAC;QACnC,MAAM,EAAE,MAAM,eAAe,CAAC,QAAQ,CAAC;KACxC,CAAC;IAEF,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 依赖检测与安装入口模块
|
|
3
|
+
*/
|
|
4
|
+
import { type EnsureDepsResult } from './types.js';
|
|
5
|
+
/**
|
|
6
|
+
* 确保所有依赖已安装
|
|
7
|
+
*
|
|
8
|
+
* 检测顺序:Node.js → pnpm → Claude CLI
|
|
9
|
+
* 如有缺失,交互式提示用户确认后自动安装
|
|
10
|
+
*
|
|
11
|
+
* 静默模式:所有依赖已安装时不打印任何日志
|
|
12
|
+
*/
|
|
13
|
+
export declare function ensureDependencies(): Promise<EnsureDepsResult>;
|
|
14
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../backend/src/deps/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAgBH,OAAO,EAGL,KAAK,gBAAgB,EACtB,MAAM,YAAY,CAAC;AAuCpB;;;;;;;GAOG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,gBAAgB,CAAC,CAsDpE"}
|
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 依赖检测与安装入口模块
|
|
3
|
+
*/
|
|
4
|
+
import { checkDependency, checkNodeVersion, checkAllDependencies } from './detector.js';
|
|
5
|
+
import { installWithProgress, tryFallbackInstall } from './installer.js';
|
|
6
|
+
import { promptInstall, showAllReady, showCheckStart, showCheckStatus, showManualInstallHelp, } from './prompt.js';
|
|
7
|
+
import { detectPackageManager, getNodeInstallCommands, getPlatformHelp, } from './platform.js';
|
|
8
|
+
import { DEPENDENCIES, } from './types.js';
|
|
9
|
+
/**
|
|
10
|
+
* 静默检测所有依赖(不打印任何日志)
|
|
11
|
+
*/
|
|
12
|
+
async function checkAllDependenciesSilently() {
|
|
13
|
+
const results = await checkAllDependencies();
|
|
14
|
+
const missing = [];
|
|
15
|
+
// 检查每个依赖是否安装且版本符合要求
|
|
16
|
+
for (const name of ['node', 'pnpm', 'claude']) {
|
|
17
|
+
const result = results[name];
|
|
18
|
+
const dep = DEPENDENCIES[name];
|
|
19
|
+
if (!result.installed) {
|
|
20
|
+
missing.push(name);
|
|
21
|
+
continue;
|
|
22
|
+
}
|
|
23
|
+
// 检查版本是否满足最低要求
|
|
24
|
+
if (dep.minVersion) {
|
|
25
|
+
const version = result.version ?? 'unknown';
|
|
26
|
+
if (!checkNodeVersion(version, dep.minVersion)) {
|
|
27
|
+
missing.push(name);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return {
|
|
32
|
+
results,
|
|
33
|
+
allInstalled: missing.length === 0,
|
|
34
|
+
missing,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* 确保所有依赖已安装
|
|
39
|
+
*
|
|
40
|
+
* 检测顺序:Node.js → pnpm → Claude CLI
|
|
41
|
+
* 如有缺失,交互式提示用户确认后自动安装
|
|
42
|
+
*
|
|
43
|
+
* 静默模式:所有依赖已安装时不打印任何日志
|
|
44
|
+
*/
|
|
45
|
+
export async function ensureDependencies() {
|
|
46
|
+
const result = {
|
|
47
|
+
allInstalled: true,
|
|
48
|
+
installed: [],
|
|
49
|
+
failed: [],
|
|
50
|
+
};
|
|
51
|
+
// 1. 静默检测所有依赖
|
|
52
|
+
const { results, allInstalled, missing } = await checkAllDependenciesSilently();
|
|
53
|
+
// 2. 如果全部已安装,直接返回,不打印任何内容
|
|
54
|
+
if (allInstalled) {
|
|
55
|
+
return result;
|
|
56
|
+
}
|
|
57
|
+
// 3. 有缺失,显示检测日志并处理安装
|
|
58
|
+
showCheckStart();
|
|
59
|
+
// 重新显示已安装依赖的状态
|
|
60
|
+
for (const name of ['node', 'pnpm', 'claude']) {
|
|
61
|
+
const checkResult = results[name];
|
|
62
|
+
if (!missing.includes(name)) {
|
|
63
|
+
showCheckStatus(name, true, checkResult.version);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
// 4. 按顺序处理缺失的依赖
|
|
67
|
+
for (const name of missing) {
|
|
68
|
+
let handleResult;
|
|
69
|
+
switch (name) {
|
|
70
|
+
case 'node':
|
|
71
|
+
handleResult = await handleNodeDependency(results.node);
|
|
72
|
+
break;
|
|
73
|
+
case 'pnpm':
|
|
74
|
+
handleResult = await handlePnpmDependency(results.pnpm);
|
|
75
|
+
break;
|
|
76
|
+
case 'claude':
|
|
77
|
+
handleResult = await handleClaudeDependency(results.claude);
|
|
78
|
+
break;
|
|
79
|
+
}
|
|
80
|
+
if (!handleResult.success) {
|
|
81
|
+
result.allInstalled = false;
|
|
82
|
+
result.failed.push(name);
|
|
83
|
+
return result;
|
|
84
|
+
}
|
|
85
|
+
if (handleResult.newlyInstalled) {
|
|
86
|
+
result.installed.push(name);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
showAllReady();
|
|
90
|
+
return result;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* 处理 Node.js 依赖
|
|
94
|
+
*/
|
|
95
|
+
async function handleNodeDependency(preCheck) {
|
|
96
|
+
const check = preCheck ?? await checkDependency('node');
|
|
97
|
+
if (!check.installed) {
|
|
98
|
+
showCheckStatus('node', false);
|
|
99
|
+
return await installNode();
|
|
100
|
+
}
|
|
101
|
+
// 检查版本 - 安全地处理 version 可能为 undefined 的情况
|
|
102
|
+
const dep = DEPENDENCIES.node;
|
|
103
|
+
const version = check.version ?? 'unknown';
|
|
104
|
+
if (dep.minVersion && !checkNodeVersion(version, dep.minVersion)) {
|
|
105
|
+
showCheckStatus('node', false);
|
|
106
|
+
process.stderr.write(` ✗ Node.js ${version} (need >= ${dep.minVersion})\n`);
|
|
107
|
+
process.stderr.write(`\n[ERROR] Node.js ${dep.minVersion}+ is required. Current: ${version}\n`);
|
|
108
|
+
process.stderr.write(`Please upgrade: ${dep.helpUrl}\n`);
|
|
109
|
+
return { success: false, newlyInstalled: false };
|
|
110
|
+
}
|
|
111
|
+
// 已安装且版本符合,不打印(已在 ensureDependencies 中统一打印)
|
|
112
|
+
return { success: true, newlyInstalled: false };
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* 安装 Node.js
|
|
116
|
+
*/
|
|
117
|
+
async function installNode() {
|
|
118
|
+
const pkgManager = detectPackageManager();
|
|
119
|
+
const installCommands = getNodeInstallCommands(pkgManager);
|
|
120
|
+
if (installCommands.length === 0) {
|
|
121
|
+
showManualInstallHelp('node', DEPENDENCIES.node.helpUrl);
|
|
122
|
+
process.stderr.write(`\n${getPlatformHelp()}\n`);
|
|
123
|
+
return { success: false, newlyInstalled: false };
|
|
124
|
+
}
|
|
125
|
+
const confirmed = await promptInstall({
|
|
126
|
+
name: 'node',
|
|
127
|
+
installCommands,
|
|
128
|
+
helpUrl: DEPENDENCIES.node.helpUrl,
|
|
129
|
+
});
|
|
130
|
+
if (!confirmed) {
|
|
131
|
+
return { success: false, newlyInstalled: false };
|
|
132
|
+
}
|
|
133
|
+
const installResult = await installWithProgress('node', installCommands);
|
|
134
|
+
if (!installResult.success) {
|
|
135
|
+
return { success: false, newlyInstalled: false };
|
|
136
|
+
}
|
|
137
|
+
return { success: true, newlyInstalled: true };
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* 处理 pnpm 依赖
|
|
141
|
+
*/
|
|
142
|
+
async function handlePnpmDependency(preCheck) {
|
|
143
|
+
const check = preCheck ?? await checkDependency('pnpm');
|
|
144
|
+
if (!check.installed) {
|
|
145
|
+
showCheckStatus('pnpm', false);
|
|
146
|
+
return await installPnpm();
|
|
147
|
+
}
|
|
148
|
+
// 检查版本 - 安全地处理 version 可能为 undefined 的情况
|
|
149
|
+
const dep = DEPENDENCIES.pnpm;
|
|
150
|
+
const version = check.version ?? 'unknown';
|
|
151
|
+
if (dep.minVersion && !checkNodeVersion(version, dep.minVersion)) {
|
|
152
|
+
showCheckStatus('pnpm', false);
|
|
153
|
+
process.stderr.write(` ✗ pnpm ${version} (need >= ${dep.minVersion})\n`);
|
|
154
|
+
process.stderr.write(`\n[ERROR] pnpm ${dep.minVersion}+ is required. Current: ${version}\n`);
|
|
155
|
+
process.stderr.write(`Please upgrade: ${dep.helpUrl}\n`);
|
|
156
|
+
return { success: false, newlyInstalled: false };
|
|
157
|
+
}
|
|
158
|
+
// 已安装且版本符合,不打印(已在 ensureDependencies 中统一打印)
|
|
159
|
+
return { success: true, newlyInstalled: false };
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* 安装 pnpm
|
|
163
|
+
*/
|
|
164
|
+
async function installPnpm() {
|
|
165
|
+
const dep = DEPENDENCIES.pnpm;
|
|
166
|
+
const installCommands = dep.installCommands;
|
|
167
|
+
const confirmed = await promptInstall({
|
|
168
|
+
name: 'pnpm',
|
|
169
|
+
installCommands,
|
|
170
|
+
helpUrl: dep.helpUrl,
|
|
171
|
+
});
|
|
172
|
+
if (!confirmed) {
|
|
173
|
+
return { success: false, newlyInstalled: false };
|
|
174
|
+
}
|
|
175
|
+
// 尝试主安装方式
|
|
176
|
+
let installResult = await installWithProgress('pnpm', installCommands);
|
|
177
|
+
// 如果失败,尝试备用方式(npm install -g pnpm)
|
|
178
|
+
if (!installResult.success) {
|
|
179
|
+
process.stderr.write('\n[Fallback] Trying npm install -g pnpm...\n');
|
|
180
|
+
installResult = await tryFallbackInstall('pnpm');
|
|
181
|
+
}
|
|
182
|
+
if (!installResult.success) {
|
|
183
|
+
return { success: false, newlyInstalled: false };
|
|
184
|
+
}
|
|
185
|
+
return { success: true, newlyInstalled: true };
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* 处理 Claude CLI 依赖
|
|
189
|
+
*/
|
|
190
|
+
async function handleClaudeDependency(preCheck) {
|
|
191
|
+
const check = preCheck ?? await checkDependency('claude');
|
|
192
|
+
if (!check.installed) {
|
|
193
|
+
showCheckStatus('claude', false);
|
|
194
|
+
return await installClaude();
|
|
195
|
+
}
|
|
196
|
+
// 已安装,不打印(已在 ensureDependencies 中统一打印)
|
|
197
|
+
return { success: true, newlyInstalled: false };
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* 安装 Claude CLI
|
|
201
|
+
*/
|
|
202
|
+
async function installClaude() {
|
|
203
|
+
const dep = DEPENDENCIES.claude;
|
|
204
|
+
const installCommands = dep.installCommands;
|
|
205
|
+
const confirmed = await promptInstall({
|
|
206
|
+
name: 'claude',
|
|
207
|
+
installCommands,
|
|
208
|
+
helpUrl: dep.helpUrl,
|
|
209
|
+
});
|
|
210
|
+
if (!confirmed) {
|
|
211
|
+
return { success: false, newlyInstalled: false };
|
|
212
|
+
}
|
|
213
|
+
const installResult = await installWithProgress('claude', installCommands);
|
|
214
|
+
if (!installResult.success) {
|
|
215
|
+
return { success: false, newlyInstalled: false };
|
|
216
|
+
}
|
|
217
|
+
return { success: true, newlyInstalled: true };
|
|
218
|
+
}
|
|
219
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../backend/src/deps/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 依赖安装模块 - 实时输出安装进度
|
|
3
|
+
*/
|
|
4
|
+
import { type DependencyName, type InstallCommand, type InstallResult } from './types.js';
|
|
5
|
+
/**
|
|
6
|
+
* 执行安装命令,实时输出进度
|
|
7
|
+
*/
|
|
8
|
+
export declare function installWithProgress(name: DependencyName, commands: InstallCommand[]): Promise<InstallResult>;
|
|
9
|
+
/**
|
|
10
|
+
* 尝试使用备用安装方法(降级)
|
|
11
|
+
*/
|
|
12
|
+
export declare function tryFallbackInstall(name: DependencyName): Promise<InstallResult>;
|
|
13
|
+
//# sourceMappingURL=installer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"installer.d.ts","sourceRoot":"","sources":["../../../../backend/src/deps/installer.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAEL,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,aAAa,EACnB,MAAM,YAAY,CAAC;AAGpB;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,cAAc,EACpB,QAAQ,EAAE,cAAc,EAAE,GACzB,OAAO,CAAC,aAAa,CAAC,CA4CxB;AA0CD;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,cAAc,GACnB,OAAO,CAAC,aAAa,CAAC,CAiCxB"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 依赖安装模块 - 实时输出安装进度
|
|
3
|
+
*/
|
|
4
|
+
import { spawn } from 'node:child_process';
|
|
5
|
+
import { checkDependency } from './detector.js';
|
|
6
|
+
import { DEPENDENCIES, } from './types.js';
|
|
7
|
+
import { showCommand, showInstallStart, showStepFailure, showStepSuccess } from './prompt.js';
|
|
8
|
+
/**
|
|
9
|
+
* 执行安装命令,实时输出进度
|
|
10
|
+
*/
|
|
11
|
+
export async function installWithProgress(name, commands) {
|
|
12
|
+
showInstallStart(name);
|
|
13
|
+
// 跟踪是否有任意一个命令成功
|
|
14
|
+
let anySuccess = false;
|
|
15
|
+
for (const cmd of commands) {
|
|
16
|
+
showCommand(cmd.command, cmd.args);
|
|
17
|
+
const result = await runCommand(cmd);
|
|
18
|
+
if (result.success) {
|
|
19
|
+
showStepSuccess();
|
|
20
|
+
anySuccess = true;
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
showStepFailure(result.error ?? '');
|
|
24
|
+
// 继续尝试下一个命令(如 corepack 失败后尝试 npm install -g pnpm)
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
// Retry verification to allow PATH propagation after install
|
|
28
|
+
let check = { installed: false };
|
|
29
|
+
for (let attempt = 0; attempt < 3; attempt++) {
|
|
30
|
+
await new Promise((r) => setTimeout(r, 500));
|
|
31
|
+
check = await checkDependency(name);
|
|
32
|
+
if (check.installed)
|
|
33
|
+
break;
|
|
34
|
+
}
|
|
35
|
+
if (check.installed) {
|
|
36
|
+
showStepSuccess(`${DEPENDENCIES[name].displayName} ${check.version} installed`);
|
|
37
|
+
return { success: true, version: check.version };
|
|
38
|
+
}
|
|
39
|
+
if (anySuccess) {
|
|
40
|
+
// 命令执行成功但验证失败,可能需要重启终端
|
|
41
|
+
return {
|
|
42
|
+
success: false,
|
|
43
|
+
error: new Error('Installation succeeded but verification failed. You may need to restart your terminal.'),
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
return { success: false, error: new Error('All install commands failed') };
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* 运行单个命令
|
|
50
|
+
* 注意:不使用 spawn 的 timeout 选项,因为 Node.js < 20.6.0 不支持
|
|
51
|
+
*/
|
|
52
|
+
async function runCommand(cmd) {
|
|
53
|
+
return new Promise((resolve) => {
|
|
54
|
+
const timeout = cmd.timeout ?? 120000;
|
|
55
|
+
let timedOut = false;
|
|
56
|
+
// Windows 上需要 shell 来找到命令(如 winget)
|
|
57
|
+
// 但 args 是硬编码的,不存在注入风险
|
|
58
|
+
const proc = spawn(cmd.command, cmd.args, {
|
|
59
|
+
stdio: 'inherit', // 实时输出到终端
|
|
60
|
+
shell: process.platform === 'win32',
|
|
61
|
+
});
|
|
62
|
+
// 手动实现超时(兼容 Node.js < 20.6.0)
|
|
63
|
+
const timer = setTimeout(() => {
|
|
64
|
+
timedOut = true;
|
|
65
|
+
proc.kill('SIGTERM');
|
|
66
|
+
}, timeout);
|
|
67
|
+
proc.on('close', (code) => {
|
|
68
|
+
clearTimeout(timer);
|
|
69
|
+
if (timedOut) {
|
|
70
|
+
resolve({ success: false, error: 'Timeout' });
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
resolve({ success: code === 0 });
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
proc.on('error', (err) => {
|
|
77
|
+
clearTimeout(timer);
|
|
78
|
+
resolve({ success: false, error: err.message });
|
|
79
|
+
});
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* 尝试使用备用安装方法(降级)
|
|
84
|
+
*/
|
|
85
|
+
export async function tryFallbackInstall(name) {
|
|
86
|
+
const dep = DEPENDENCIES[name];
|
|
87
|
+
if (name === 'pnpm') {
|
|
88
|
+
// pnpm 备用方案:使用 npm 安装
|
|
89
|
+
showInstallStart(name);
|
|
90
|
+
showCommand('npm', ['install', '-g', 'pnpm@latest']);
|
|
91
|
+
const result = await runCommand({
|
|
92
|
+
command: 'npm',
|
|
93
|
+
args: ['install', '-g', 'pnpm@latest'],
|
|
94
|
+
timeout: 60000,
|
|
95
|
+
});
|
|
96
|
+
if (result.success) {
|
|
97
|
+
showStepSuccess();
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
showStepFailure(result.error);
|
|
101
|
+
}
|
|
102
|
+
// 验证安装
|
|
103
|
+
await new Promise((r) => setTimeout(r, 500));
|
|
104
|
+
const check = await checkDependency(name);
|
|
105
|
+
if (check.installed) {
|
|
106
|
+
showStepSuccess(`pnpm ${check.version} installed`);
|
|
107
|
+
return { success: true, version: check.version };
|
|
108
|
+
}
|
|
109
|
+
return { success: false, error: new Error('Fallback install failed') };
|
|
110
|
+
}
|
|
111
|
+
return { success: false, error: new Error('No fallback available') };
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=installer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"installer.js","sourceRoot":"","sources":["../../../../backend/src/deps/installer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 平台检测模块
|
|
3
|
+
*/
|
|
4
|
+
import type { InstallCommand } from './types.js';
|
|
5
|
+
export type Platform = 'darwin' | 'linux' | 'win32';
|
|
6
|
+
export type PackageManager = 'brew' | 'apt' | 'dnf' | 'winget' | 'choco' | 'none';
|
|
7
|
+
/**
|
|
8
|
+
* 检测当前平台
|
|
9
|
+
*/
|
|
10
|
+
export declare function detectPlatform(): Platform;
|
|
11
|
+
/**
|
|
12
|
+
* 检测 CPU 架构
|
|
13
|
+
*/
|
|
14
|
+
export declare function detectArch(): string;
|
|
15
|
+
/**
|
|
16
|
+
* 检测可用的包管理器
|
|
17
|
+
*/
|
|
18
|
+
export declare function detectPackageManager(): PackageManager;
|
|
19
|
+
/**
|
|
20
|
+
* 获取 Node.js 的安装命令
|
|
21
|
+
*/
|
|
22
|
+
export declare function getNodeInstallCommands(pkgManager: PackageManager): InstallCommand[];
|
|
23
|
+
/**
|
|
24
|
+
* 获取平台相关的帮助信息
|
|
25
|
+
*/
|
|
26
|
+
export declare function getPlatformHelp(): string;
|
|
27
|
+
//# sourceMappingURL=platform.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"platform.d.ts","sourceRoot":"","sources":["../../../../backend/src/deps/platform.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,MAAM,MAAM,QAAQ,GAAG,QAAQ,GAAG,OAAO,GAAG,OAAO,CAAC;AACpD,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,KAAK,GAAG,KAAK,GAAG,QAAQ,GAAG,OAAO,GAAG,MAAM,CAAC;AAElF;;GAEG;AACH,wBAAgB,cAAc,IAAI,QAAQ,CAEzC;AAED;;GAEG;AACH,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,cAAc,CAarD;AAwCD;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,cAAc,GAAG,cAAc,EAAE,CAwDnF;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,MAAM,CAkBxC"}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 平台检测模块
|
|
3
|
+
*/
|
|
4
|
+
import { execSync } from 'node:child_process';
|
|
5
|
+
import { arch as getArch, platform as getPlatform } from 'node:os';
|
|
6
|
+
/**
|
|
7
|
+
* 检测当前平台
|
|
8
|
+
*/
|
|
9
|
+
export function detectPlatform() {
|
|
10
|
+
return getPlatform();
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* 检测 CPU 架构
|
|
14
|
+
*/
|
|
15
|
+
export function detectArch() {
|
|
16
|
+
return getArch();
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* 检测可用的包管理器
|
|
20
|
+
*/
|
|
21
|
+
export function detectPackageManager() {
|
|
22
|
+
const platform = detectPlatform();
|
|
23
|
+
switch (platform) {
|
|
24
|
+
case 'darwin':
|
|
25
|
+
return detectDarwinPackageManager();
|
|
26
|
+
case 'linux':
|
|
27
|
+
return detectLinuxPackageManager();
|
|
28
|
+
case 'win32':
|
|
29
|
+
return detectWindowsPackageManager();
|
|
30
|
+
default:
|
|
31
|
+
return 'none';
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
function detectDarwinPackageManager() {
|
|
35
|
+
try {
|
|
36
|
+
execSync('which brew', { stdio: 'ignore' });
|
|
37
|
+
return 'brew';
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
return 'none';
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
function detectLinuxPackageManager() {
|
|
44
|
+
try {
|
|
45
|
+
// 使用 apt-get 而不是 apt,因为 apt 在某些系统上不是直接可执行的
|
|
46
|
+
execSync('which apt-get', { stdio: 'ignore' });
|
|
47
|
+
return 'apt';
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
try {
|
|
51
|
+
execSync('which dnf', { stdio: 'ignore' });
|
|
52
|
+
return 'dnf';
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
return 'none';
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
function detectWindowsPackageManager() {
|
|
60
|
+
try {
|
|
61
|
+
execSync('where winget', { stdio: 'ignore' });
|
|
62
|
+
return 'winget';
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
try {
|
|
66
|
+
execSync('where choco', { stdio: 'ignore' });
|
|
67
|
+
return 'choco';
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
return 'none';
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* 获取 Node.js 的安装命令
|
|
76
|
+
*/
|
|
77
|
+
export function getNodeInstallCommands(pkgManager) {
|
|
78
|
+
switch (pkgManager) {
|
|
79
|
+
case 'brew':
|
|
80
|
+
return [
|
|
81
|
+
{
|
|
82
|
+
command: 'brew',
|
|
83
|
+
args: ['install', 'node'],
|
|
84
|
+
description: 'Install Node.js via Homebrew',
|
|
85
|
+
timeout: 300000,
|
|
86
|
+
},
|
|
87
|
+
];
|
|
88
|
+
case 'apt':
|
|
89
|
+
return [
|
|
90
|
+
{
|
|
91
|
+
command: 'sudo',
|
|
92
|
+
args: ['apt-get', 'update'],
|
|
93
|
+
description: 'Update package list',
|
|
94
|
+
timeout: 120000,
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
command: 'sudo',
|
|
98
|
+
args: ['apt-get', 'install', '-y', 'nodejs', 'npm'],
|
|
99
|
+
description: 'Install Node.js via apt',
|
|
100
|
+
timeout: 300000,
|
|
101
|
+
},
|
|
102
|
+
];
|
|
103
|
+
case 'dnf':
|
|
104
|
+
return [
|
|
105
|
+
{
|
|
106
|
+
command: 'sudo',
|
|
107
|
+
args: ['dnf', 'install', '-y', 'nodejs'],
|
|
108
|
+
description: 'Install Node.js via dnf',
|
|
109
|
+
timeout: 300000,
|
|
110
|
+
},
|
|
111
|
+
];
|
|
112
|
+
case 'winget':
|
|
113
|
+
return [
|
|
114
|
+
{
|
|
115
|
+
command: 'winget',
|
|
116
|
+
args: ['install', '--id', 'OpenJS.NodeJS.LTS', '-e'],
|
|
117
|
+
description: 'Install Node.js LTS via winget',
|
|
118
|
+
timeout: 300000,
|
|
119
|
+
},
|
|
120
|
+
];
|
|
121
|
+
case 'choco':
|
|
122
|
+
return [
|
|
123
|
+
{
|
|
124
|
+
command: 'choco',
|
|
125
|
+
args: ['install', '-y', 'nodejs-lts'],
|
|
126
|
+
description: 'Install Node.js LTS via Chocolatey',
|
|
127
|
+
timeout: 300000,
|
|
128
|
+
},
|
|
129
|
+
];
|
|
130
|
+
default:
|
|
131
|
+
return [];
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* 获取平台相关的帮助信息
|
|
136
|
+
*/
|
|
137
|
+
export function getPlatformHelp() {
|
|
138
|
+
const platform = detectPlatform();
|
|
139
|
+
const pkgManager = detectPackageManager();
|
|
140
|
+
if (pkgManager !== 'none') {
|
|
141
|
+
return '';
|
|
142
|
+
}
|
|
143
|
+
switch (platform) {
|
|
144
|
+
case 'darwin':
|
|
145
|
+
return 'Install Homebrew first: /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"';
|
|
146
|
+
case 'linux':
|
|
147
|
+
return 'Install a package manager (apt, dnf) or use NodeSource: https://github.com/nodesource/distributions';
|
|
148
|
+
case 'win32':
|
|
149
|
+
return 'Install winget or Chocolatey, or download Node.js from https://nodejs.org/';
|
|
150
|
+
default:
|
|
151
|
+
return 'Visit https://nodejs.org/ to install Node.js';
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
//# sourceMappingURL=platform.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"platform.js","sourceRoot":"","sources":["../../../../backend/src/deps/platform.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,IAAI,IAAI,OAAO,EAAE,QAAQ,IAAI,WAAW,EAAE,MAAM,SAAS,CAAC;AAMnE;;GAEG;AACH,MAAM,UAAU,cAAc;IAC5B,OAAO,WAAW,EAAc,CAAC;AACnC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU;IACxB,OAAO,OAAO,EAAE,CAAC;AACnB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB;IAClC,MAAM,QAAQ,GAAG,cAAc,EAAE,CAAC;IAElC,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,QAAQ;YACX,OAAO,0BAA0B,EAAE,CAAC;QACtC,KAAK,OAAO;YACV,OAAO,yBAAyB,EAAE,CAAC;QACrC,KAAK,OAAO;YACV,OAAO,2BAA2B,EAAE,CAAC;QACvC;YACE,OAAO,MAAM,CAAC;IAClB,CAAC;AACH,CAAC;AAED,SAAS,0BAA0B;IACjC,IAAI,CAAC;QACH,QAAQ,CAAC,YAAY,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC5C,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,MAAM,CAAC;IAChB,CAAC;AACH,CAAC;AAED,SAAS,yBAAyB;IAChC,IAAI,CAAC;QACH,2CAA2C;QAC3C,QAAQ,CAAC,eAAe,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC/C,OAAO,KAAK,CAAC;IACf,CAAC;IAAC,MAAM,CAAC;QACP,IAAI,CAAC;YACH,QAAQ,CAAC,WAAW,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;YAC3C,OAAO,KAAK,CAAC;QACf,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,MAAM,CAAC;QAChB,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,2BAA2B;IAClC,IAAI,CAAC;QACH,QAAQ,CAAC,cAAc,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC9C,OAAO,QAAQ,CAAC;IAClB,CAAC;IAAC,MAAM,CAAC;QACP,IAAI,CAAC;YACH,QAAQ,CAAC,aAAa,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;YAC7C,OAAO,OAAO,CAAC;QACjB,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,MAAM,CAAC;QAChB,CAAC;IACH,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,UAA0B;IAC/D,QAAQ,UAAU,EAAE,CAAC;QACnB,KAAK,MAAM;YACT,OAAO;gBACL;oBACE,OAAO,EAAE,MAAM;oBACf,IAAI,EAAE,CAAC,SAAS,EAAE,MAAM,CAAC;oBACzB,WAAW,EAAE,8BAA8B;oBAC3C,OAAO,EAAE,MAAM;iBAChB;aACF,CAAC;QACJ,KAAK,KAAK;YACR,OAAO;gBACL;oBACE,OAAO,EAAE,MAAM;oBACf,IAAI,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC;oBAC3B,WAAW,EAAE,qBAAqB;oBAClC,OAAO,EAAE,MAAM;iBAChB;gBACD;oBACE,OAAO,EAAE,MAAM;oBACf,IAAI,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,CAAC;oBACnD,WAAW,EAAE,yBAAyB;oBACtC,OAAO,EAAE,MAAM;iBAChB;aACF,CAAC;QACJ,KAAK,KAAK;YACR,OAAO;gBACL;oBACE,OAAO,EAAE,MAAM;oBACf,IAAI,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,CAAC;oBACxC,WAAW,EAAE,yBAAyB;oBACtC,OAAO,EAAE,MAAM;iBAChB;aACF,CAAC;QACJ,KAAK,QAAQ;YACX,OAAO;gBACL;oBACE,OAAO,EAAE,QAAQ;oBACjB,IAAI,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,mBAAmB,EAAE,IAAI,CAAC;oBACpD,WAAW,EAAE,gCAAgC;oBAC7C,OAAO,EAAE,MAAM;iBAChB;aACF,CAAC;QACJ,KAAK,OAAO;YACV,OAAO;gBACL;oBACE,OAAO,EAAE,OAAO;oBAChB,IAAI,EAAE,CAAC,SAAS,EAAE,IAAI,EAAE,YAAY,CAAC;oBACrC,WAAW,EAAE,oCAAoC;oBACjD,OAAO,EAAE,MAAM;iBAChB;aACF,CAAC;QACJ;YACE,OAAO,EAAE,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe;IAC7B,MAAM,QAAQ,GAAG,cAAc,EAAE,CAAC;IAClC,MAAM,UAAU,GAAG,oBAAoB,EAAE,CAAC;IAE1C,IAAI,UAAU,KAAK,MAAM,EAAE,CAAC;QAC1B,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,QAAQ;YACX,OAAO,yHAAyH,CAAC;QACnI,KAAK,OAAO;YACV,OAAO,qGAAqG,CAAC;QAC/G,KAAK,OAAO;YACV,OAAO,4EAA4E,CAAC;QACtF;YACE,OAAO,8CAA8C,CAAC;IAC1D,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 交互式确认模块
|
|
3
|
+
*/
|
|
4
|
+
import { type DependencyName, type InstallCommand } from './types.js';
|
|
5
|
+
export interface PromptOptions {
|
|
6
|
+
name: DependencyName;
|
|
7
|
+
installCommands: InstallCommand[];
|
|
8
|
+
helpUrl: string;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* 显示安装确认提示
|
|
12
|
+
* @returns true 表示用户确认安装,false 表示取消
|
|
13
|
+
*/
|
|
14
|
+
export declare function promptInstall(options: PromptOptions): Promise<boolean>;
|
|
15
|
+
/**
|
|
16
|
+
* 显示安装失败提示,提供手动安装帮助
|
|
17
|
+
*/
|
|
18
|
+
export declare function showManualInstallHelp(name: DependencyName, helpUrl: string): void;
|
|
19
|
+
/**
|
|
20
|
+
* 显示安装开始信息
|
|
21
|
+
*/
|
|
22
|
+
export declare function showInstallStart(name: DependencyName): void;
|
|
23
|
+
/**
|
|
24
|
+
* 显示命令执行信息
|
|
25
|
+
*/
|
|
26
|
+
export declare function showCommand(cmd: string, args: string[]): void;
|
|
27
|
+
/**
|
|
28
|
+
* 显示步骤成功
|
|
29
|
+
*/
|
|
30
|
+
export declare function showStepSuccess(message?: string): void;
|
|
31
|
+
/**
|
|
32
|
+
* 显示步骤失败
|
|
33
|
+
*/
|
|
34
|
+
export declare function showStepFailure(message?: string): void;
|
|
35
|
+
/**
|
|
36
|
+
* 显示检测状态
|
|
37
|
+
*/
|
|
38
|
+
export declare function showCheckStatus(name: DependencyName, installed: boolean, version?: string): void;
|
|
39
|
+
/**
|
|
40
|
+
* 显示依赖检测开始
|
|
41
|
+
*/
|
|
42
|
+
export declare function showCheckStart(): void;
|
|
43
|
+
/**
|
|
44
|
+
* 显示所有依赖就绪
|
|
45
|
+
*/
|
|
46
|
+
export declare function showAllReady(): void;
|
|
47
|
+
/**
|
|
48
|
+
* 显示依赖安装失败
|
|
49
|
+
*/
|
|
50
|
+
export declare function showInstallFailed(failed: DependencyName[]): void;
|
|
51
|
+
//# sourceMappingURL=prompt.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../../../../backend/src/deps/prompt.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAgB,KAAK,cAAc,EAAE,KAAK,cAAc,EAAE,MAAM,YAAY,CAAC;AAEpF,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,cAAc,CAAC;IACrB,eAAe,EAAE,cAAc,EAAE,CAAC;IAClC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;GAGG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,CA+D5E;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,cAAc,EACpB,OAAO,EAAE,MAAM,GACd,IAAI,CAIN;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,cAAc,GAAG,IAAI,CAG3D;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAE7D;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,GAAE,MAAe,GAAG,IAAI,CAE9D;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,GAAE,MAAiB,GAAG,IAAI,CAEhE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,cAAc,EACpB,SAAS,EAAE,OAAO,EAClB,OAAO,CAAC,EAAE,MAAM,GACf,IAAI,CAON;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,IAAI,CAErC;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,IAAI,CAEnC;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,cAAc,EAAE,GAAG,IAAI,CAIhE"}
|