@cloudbase/cli 2.11.0-beta.0 → 2.11.0

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 (616) hide show
  1. package/bin/ccr +2 -0
  2. package/bin/cloudbase +2 -0
  3. package/bin/cloudbase-mcp +2 -0
  4. package/bin/tcb +2 -0
  5. package/dist/standalone/cli.js +235287 -162247
  6. package/package.json +15 -132
  7. package/.augment-guidelines +0 -119
  8. package/.claude/settings.local.json +0 -6
  9. package/.clinerules/cloudbase-rules.mdc +0 -119
  10. package/.cursor/rules/cloudbase-rules.mdc +0 -119
  11. package/.editorconfig +0 -10
  12. package/.eslintignore +0 -8
  13. package/.eslintrc +0 -35
  14. package/.mcp.json +0 -11
  15. package/.prettierignore +0 -1
  16. package/.prettierrc.js +0 -29
  17. package/.vscode/launch.json +0 -26
  18. package/.yarnrc.yml +0 -1
  19. package/CLAUDE.md +0 -119
  20. package/LICENSE +0 -6
  21. package/bin/ccr.js +0 -3
  22. package/bin/cloudbase.js +0 -7
  23. package/bin/tcb.js +0 -339
  24. package/changelog.md +0 -6
  25. package/cloudbase-cli-2.7.8.tgz +0 -0
  26. package/cloudbaserc.json +0 -13
  27. package/jest.config.js +0 -17
  28. package/lib/auth/index.js +0 -18
  29. package/lib/auth/login.js +0 -97
  30. package/lib/auth/logout.js +0 -9
  31. package/lib/commands/account/index.js +0 -18
  32. package/lib/commands/account/login.js +0 -239
  33. package/lib/commands/account/logout.js +0 -45
  34. package/lib/commands/ag/base.js +0 -203
  35. package/lib/commands/ag/create.js +0 -301
  36. package/lib/commands/ag/debug/index.html +0 -699
  37. package/lib/commands/ag/delete.js +0 -200
  38. package/lib/commands/ag/deploy.js +0 -185
  39. package/lib/commands/ag/detail.js +0 -113
  40. package/lib/commands/ag/index.js +0 -22
  41. package/lib/commands/ag/list.js +0 -155
  42. package/lib/commands/ag/run.js +0 -644
  43. package/lib/commands/ai/index.js +0 -181
  44. package/lib/commands/cloudfunction/base.js +0 -348
  45. package/lib/commands/cloudfunction/index.js +0 -17
  46. package/lib/commands/cloudrun/base.js +0 -1015
  47. package/lib/commands/cloudrun/cloudrun-run-ui/index.html +0 -193
  48. package/lib/commands/cloudrun/index.js +0 -17
  49. package/lib/commands/common.js +0 -210
  50. package/lib/commands/config/delete.js +0 -61
  51. package/lib/commands/config/get.js +0 -58
  52. package/lib/commands/config/index.js +0 -21
  53. package/lib/commands/config/interface.js +0 -25
  54. package/lib/commands/config/list.js +0 -61
  55. package/lib/commands/config/set.js +0 -78
  56. package/lib/commands/constants.js +0 -11
  57. package/lib/commands/db/base.js +0 -377
  58. package/lib/commands/db/index.js +0 -17
  59. package/lib/commands/env/base.js +0 -116
  60. package/lib/commands/env/domain.js +0 -207
  61. package/lib/commands/env/index.js +0 -19
  62. package/lib/commands/env/login.js +0 -256
  63. package/lib/commands/framework/index.js +0 -179
  64. package/lib/commands/fun/base.js +0 -413
  65. package/lib/commands/fun/index.js +0 -17
  66. package/lib/commands/functions/alias/getRoute.js +0 -88
  67. package/lib/commands/functions/alias/index.js +0 -18
  68. package/lib/commands/functions/alias/setRoute.js +0 -90
  69. package/lib/commands/functions/code-download.js +0 -112
  70. package/lib/commands/functions/code-update.js +0 -85
  71. package/lib/commands/functions/concurrency/delete.js +0 -60
  72. package/lib/commands/functions/concurrency/index.js +0 -19
  73. package/lib/commands/functions/concurrency/list.js +0 -71
  74. package/lib/commands/functions/concurrency/set.js +0 -62
  75. package/lib/commands/functions/config-update.js +0 -92
  76. package/lib/commands/functions/copy.js +0 -71
  77. package/lib/commands/functions/delete.js +0 -91
  78. package/lib/commands/functions/deploy.js +0 -313
  79. package/lib/commands/functions/detail.js +0 -155
  80. package/lib/commands/functions/index.js +0 -33
  81. package/lib/commands/functions/invoke.js +0 -134
  82. package/lib/commands/functions/layer/bind.js +0 -188
  83. package/lib/commands/functions/layer/common.js +0 -13
  84. package/lib/commands/functions/layer/create.js +0 -82
  85. package/lib/commands/functions/layer/delete.js +0 -86
  86. package/lib/commands/functions/layer/download.js +0 -106
  87. package/lib/commands/functions/layer/index.js +0 -23
  88. package/lib/commands/functions/layer/list.js +0 -99
  89. package/lib/commands/functions/layer/sort.js +0 -92
  90. package/lib/commands/functions/list.js +0 -81
  91. package/lib/commands/functions/log.js +0 -148
  92. package/lib/commands/functions/run.js +0 -247
  93. package/lib/commands/functions/trigger-create.js +0 -88
  94. package/lib/commands/functions/trigger-delete.js +0 -110
  95. package/lib/commands/functions/version/index.js +0 -18
  96. package/lib/commands/functions/version/list.js +0 -86
  97. package/lib/commands/functions/version/publish.js +0 -60
  98. package/lib/commands/gateway/create.js +0 -114
  99. package/lib/commands/gateway/delete.js +0 -100
  100. package/lib/commands/gateway/domain.js +0 -187
  101. package/lib/commands/gateway/index.js +0 -21
  102. package/lib/commands/gateway/list.js +0 -96
  103. package/lib/commands/gateway/switch.js +0 -131
  104. package/lib/commands/helpers/index.js +0 -19
  105. package/lib/commands/helpers/init.js +0 -372
  106. package/lib/commands/helpers/new.js +0 -119
  107. package/lib/commands/helpers/open.js +0 -79
  108. package/lib/commands/hosting/hosting.js +0 -357
  109. package/lib/commands/hosting/index.js +0 -17
  110. package/lib/commands/index.js +0 -39
  111. package/lib/commands/lowcode/app.js +0 -385
  112. package/lib/commands/lowcode/comps.js +0 -382
  113. package/lib/commands/lowcode/index.js +0 -18
  114. package/lib/commands/lowcode/utils.js +0 -72
  115. package/lib/commands/pull/index.js +0 -17
  116. package/lib/commands/pull/pull.js +0 -94
  117. package/lib/commands/run/delete.js +0 -91
  118. package/lib/commands/run/image/common.js +0 -13
  119. package/lib/commands/run/image/delete.js +0 -84
  120. package/lib/commands/run/image/download.js +0 -79
  121. package/lib/commands/run/image/index.js +0 -21
  122. package/lib/commands/run/image/list.js +0 -97
  123. package/lib/commands/run/image/upload.js +0 -107
  124. package/lib/commands/run/index.js +0 -21
  125. package/lib/commands/run/list.js +0 -93
  126. package/lib/commands/run/service/config.js +0 -102
  127. package/lib/commands/run/service/deploy.js +0 -144
  128. package/lib/commands/run/service/index.js +0 -20
  129. package/lib/commands/run/service/list.js +0 -105
  130. package/lib/commands/run/service/update.js +0 -130
  131. package/lib/commands/run/standalonegateway/common.js +0 -13
  132. package/lib/commands/run/standalonegateway/create.js +0 -99
  133. package/lib/commands/run/standalonegateway/destroy.js +0 -75
  134. package/lib/commands/run/standalonegateway/index.js +0 -21
  135. package/lib/commands/run/standalonegateway/list.js +0 -71
  136. package/lib/commands/run/standalonegateway/package.js +0 -80
  137. package/lib/commands/run/standalonegateway/turn.js +0 -80
  138. package/lib/commands/run/version/common.js +0 -13
  139. package/lib/commands/run/version/create.js +0 -322
  140. package/lib/commands/run/version/delete.js +0 -83
  141. package/lib/commands/run/version/index.js +0 -21
  142. package/lib/commands/run/version/list.js +0 -102
  143. package/lib/commands/run/version/modify.js +0 -135
  144. package/lib/commands/run/version/update.js +0 -346
  145. package/lib/commands/runf/base.js +0 -432
  146. package/lib/commands/runf/index.js +0 -17
  147. package/lib/commands/self-update.js +0 -121
  148. package/lib/commands/smart.js +0 -111
  149. package/lib/commands/storage/index.js +0 -17
  150. package/lib/commands/storage/storage.js +0 -488
  151. package/lib/commands/third/index.js +0 -17
  152. package/lib/commands/third/thirdAttach.js +0 -67
  153. package/lib/commands/utils.js +0 -167
  154. package/lib/completion/index.js +0 -15
  155. package/lib/constant.js +0 -142
  156. package/lib/db/index.js +0 -66
  157. package/lib/decorators/captureError.js +0 -19
  158. package/lib/decorators/constants.js +0 -15
  159. package/lib/decorators/deprecate.js +0 -18
  160. package/lib/decorators/guard.js +0 -24
  161. package/lib/decorators/index.js +0 -25
  162. package/lib/decorators/injectParams.js +0 -47
  163. package/lib/decorators/params/common.js +0 -19
  164. package/lib/decorators/params/index.js +0 -25
  165. package/lib/env/domain.js +0 -27
  166. package/lib/env/index.js +0 -61
  167. package/lib/env/login.js +0 -63
  168. package/lib/error.js +0 -17
  169. package/lib/function/alias.js +0 -41
  170. package/lib/function/base.js +0 -238
  171. package/lib/function/code.js +0 -17
  172. package/lib/function/concurrency.js +0 -55
  173. package/lib/function/create.js +0 -62
  174. package/lib/function/delete.js +0 -40
  175. package/lib/function/index.js +0 -27
  176. package/lib/function/layer/attach.js +0 -50
  177. package/lib/function/layer/create.js +0 -52
  178. package/lib/function/layer/delete.js +0 -13
  179. package/lib/function/layer/download.js +0 -26
  180. package/lib/function/layer/index.js +0 -23
  181. package/lib/function/layer/list.js +0 -23
  182. package/lib/function/layer/sort.js +0 -14
  183. package/lib/function/trigger.js +0 -89
  184. package/lib/function/update.js +0 -33
  185. package/lib/function/version.js +0 -39
  186. package/lib/function/vpc.js +0 -22
  187. package/lib/gateway/index.js +0 -109
  188. package/lib/help.js +0 -44
  189. package/lib/hosting.js +0 -213
  190. package/lib/i18n/index.js +0 -73
  191. package/lib/index.js +0 -13
  192. package/lib/logger.js +0 -19
  193. package/lib/run/delete.js +0 -13
  194. package/lib/run/image/build.js +0 -28
  195. package/lib/run/image/delete.js +0 -13
  196. package/lib/run/image/index.js +0 -20
  197. package/lib/run/image/info.js +0 -20
  198. package/lib/run/image/list.js +0 -21
  199. package/lib/run/index.js +0 -23
  200. package/lib/run/list.js +0 -28
  201. package/lib/run/repo.js +0 -22
  202. package/lib/run/service/common.js +0 -258
  203. package/lib/run/service/config.js +0 -57
  204. package/lib/run/service/deployPackage.js +0 -72
  205. package/lib/run/service/index.js +0 -22
  206. package/lib/run/service/list.js +0 -25
  207. package/lib/run/service/showLogs.js +0 -96
  208. package/lib/run/service/update.js +0 -71
  209. package/lib/run/standalonegateway/create.js +0 -23
  210. package/lib/run/standalonegateway/destroy.js +0 -19
  211. package/lib/run/standalonegateway/index.js +0 -21
  212. package/lib/run/standalonegateway/list.js +0 -39
  213. package/lib/run/standalonegateway/package/index.js +0 -17
  214. package/lib/run/standalonegateway/package/list.js +0 -23
  215. package/lib/run/standalonegateway/turn/index.js +0 -18
  216. package/lib/run/standalonegateway/turn/off.js +0 -19
  217. package/lib/run/standalonegateway/turn/on.js +0 -19
  218. package/lib/run/version/create.js +0 -60
  219. package/lib/run/version/delete.js +0 -14
  220. package/lib/run/version/index.js +0 -22
  221. package/lib/run/version/list.js +0 -15
  222. package/lib/run/version/modify.js +0 -15
  223. package/lib/run/version/repo.js +0 -24
  224. package/lib/run/version/update.js +0 -50
  225. package/lib/storage.js +0 -94
  226. package/lib/third/index.js +0 -14
  227. package/lib/types.js +0 -12
  228. package/lib/utils/ai/banner.js +0 -91
  229. package/lib/utils/ai/claudeWindows.js +0 -64
  230. package/lib/utils/ai/config.js +0 -253
  231. package/lib/utils/ai/const.js +0 -178
  232. package/lib/utils/ai/ensureFiles.js +0 -16
  233. package/lib/utils/ai/env.js +0 -26
  234. package/lib/utils/ai/envLocalManager.js +0 -128
  235. package/lib/utils/ai/nodeVersion.js +0 -19
  236. package/lib/utils/ai/router.js +0 -1228
  237. package/lib/utils/ai/setup.js +0 -671
  238. package/lib/utils/auth.js +0 -17
  239. package/lib/utils/checkTcbrEnv.js +0 -65
  240. package/lib/utils/cli-table.js +0 -24
  241. package/lib/utils/commonParamsCheck.js +0 -49
  242. package/lib/utils/config.js +0 -50
  243. package/lib/utils/debug-logger.js +0 -31
  244. package/lib/utils/dts.js +0 -139
  245. package/lib/utils/env.js +0 -201
  246. package/lib/utils/fs/del.js +0 -11
  247. package/lib/utils/fs/index.js +0 -94
  248. package/lib/utils/function-packer.js +0 -74
  249. package/lib/utils/index.js +0 -38
  250. package/lib/utils/log.js +0 -74
  251. package/lib/utils/mcp-config-modifier.js +0 -220
  252. package/lib/utils/net/cloud-api-request.js +0 -56
  253. package/lib/utils/net/credential.js +0 -48
  254. package/lib/utils/net/http-request.js +0 -91
  255. package/lib/utils/net/index.js +0 -21
  256. package/lib/utils/net/manager-service.js +0 -38
  257. package/lib/utils/net/proxy.js +0 -9
  258. package/lib/utils/notice.js +0 -26
  259. package/lib/utils/output/highlight.js +0 -11
  260. package/lib/utils/output/index.js +0 -19
  261. package/lib/utils/output/link.js +0 -16
  262. package/lib/utils/output/loading.js +0 -59
  263. package/lib/utils/parallel.js +0 -54
  264. package/lib/utils/platform/index.js +0 -19
  265. package/lib/utils/platform/mac.js +0 -26
  266. package/lib/utils/platform/os.js +0 -59
  267. package/lib/utils/platform/port.js +0 -15
  268. package/lib/utils/progress-bar.js +0 -44
  269. package/lib/utils/prompt/index.js +0 -17
  270. package/lib/utils/prompt/select.js +0 -45
  271. package/lib/utils/report.js +0 -73
  272. package/lib/utils/reporter/agree.js +0 -20
  273. package/lib/utils/reporter/download.js +0 -26
  274. package/lib/utils/reporter/index.js +0 -19
  275. package/lib/utils/reporter/usage.js +0 -21
  276. package/lib/utils/store/auth.js +0 -46
  277. package/lib/utils/store/common.js +0 -8
  278. package/lib/utils/store/config.js +0 -35
  279. package/lib/utils/store/db.js +0 -65
  280. package/lib/utils/store/index.js +0 -21
  281. package/lib/utils/store/usage.js +0 -9
  282. package/lib/utils/tcbrApi/callTcbrApi.js +0 -30
  283. package/lib/utils/tcbrApi/index.js +0 -17
  284. package/lib/utils/template-manager.js +0 -431
  285. package/lib/utils/template.js +0 -116
  286. package/lib/utils/tools/common.js +0 -63
  287. package/lib/utils/tools/encoding.js +0 -13
  288. package/lib/utils/tools/index.js +0 -20
  289. package/lib/utils/tools/object.js +0 -28
  290. package/lib/utils/tools/time.js +0 -38
  291. package/lib/utils/tools/uid.js +0 -25
  292. package/lib/utils/url.js +0 -25
  293. package/lib/utils/validator.js +0 -72
  294. package/locales/README.md +0 -160
  295. package/locales/i18next-scanner.config.js +0 -206
  296. package/locales/index.js +0 -5
  297. package/locales/langs/en.json +0 -1235
  298. package/locales/langs/zh.json +0 -1235
  299. package/locales/mapping.json +0 -1235
  300. package/patches/@musistudio+claude-code-router+1.0.36.patch +0 -40
  301. package/post-install.js +0 -63
  302. package/rules/cloudbase-platform.mdc +0 -44
  303. package/rules/database.mdc +0 -25
  304. package/rules/miniprogram-development.mdc +0 -61
  305. package/rules/ui-design.mdc +0 -24
  306. package/rules/web-development.mdc +0 -44
  307. package/rules/workflows.mdc +0 -30
  308. package/runtime/nodejs/bootstrap.js +0 -255
  309. package/runtime/nodejs/runtime.js +0 -183
  310. package/specs/ag-command/design.md +0 -421
  311. package/specs/ag-command/doc.md +0 -204
  312. package/specs/ag-command/requirements.md +0 -173
  313. package/specs/ag-command/summary.md +0 -174
  314. package/specs/ag-command/tasks.md +0 -197
  315. package/specs/ag-command/usage-guide.md +0 -420
  316. package/specs/ai-cli-bootstrap/QWEN.md +0 -196
  317. package/specs/ai-cli-bootstrap/design.md +0 -185
  318. package/specs/ai-cli-bootstrap/requirements.md +0 -51
  319. package/specs/ai-cli-bootstrap/tasks.md +0 -70
  320. package/specs/ai-cli-bootstrap/technical-docs.md +0 -421
  321. package/specs/cli-install-upgrade/design.md +0 -207
  322. package/specs/cli-install-upgrade/requirements.md +0 -315
  323. package/specs/cli-install-upgrade/tasks.md +0 -120
  324. package/specs/codebuddy-integration/design.md +0 -152
  325. package/specs/codebuddy-integration/requirements.md +0 -85
  326. package/specs/codebuddy-integration/tasks.md +0 -159
  327. package/specs/mcp-global-bin/design.md +0 -57
  328. package/specs/mcp-global-bin/requirements.md +0 -43
  329. package/specs/mcp-global-bin/tasks.md +0 -54
  330. package/specs/ssl-fix/design.md +0 -93
  331. package/specs/ssl-fix/requirements.md +0 -47
  332. package/specs/ssl-fix/tasks.md +0 -65
  333. package/specs/tcb-pull-cnb-support/design.md +0 -137
  334. package/specs/tcb-pull-cnb-support/requirements.md +0 -56
  335. package/specs/tcb-pull-cnb-support/tasks.md +0 -101
  336. package/specs/tcb-pull-mcp-integration/design.md +0 -153
  337. package/specs/tcb-pull-mcp-integration/implementation-summary.md +0 -127
  338. package/specs/tcb-pull-mcp-integration/requirements.md +0 -68
  339. package/specs/tcb-pull-mcp-integration/tasks.md +0 -125
  340. package/specs/template-pull-command/design.md +0 -135
  341. package/specs/template-pull-command/implementation-summary.md +0 -160
  342. package/specs/template-pull-command/requirements.md +0 -73
  343. package/specs/template-pull-command/tasks.md +0 -101
  344. package/templates/html/loginFail.html +0 -90
  345. package/templates/html/loginSuccess.html +0 -86
  346. package/templates/server/node/_gitignore +0 -54
  347. package/templates/server/node/cloudbaserc.json +0 -10
  348. package/templates/server/node/index.js +0 -6
  349. package/templates/server/node/package.json +0 -9
  350. package/test-mcp-integration.js +0 -68
  351. package/tsconfig.json +0 -20
  352. package/tsconfig.test.json +0 -13
  353. package/types/auth/index.d.ts +0 -2
  354. package/types/auth/login.d.ts +0 -25
  355. package/types/auth/logout.d.ts +0 -1
  356. package/types/commands/account/index.d.ts +0 -2
  357. package/types/commands/account/login.d.ts +0 -15
  358. package/types/commands/account/logout.d.ts +0 -12
  359. package/types/commands/ag/base.d.ts +0 -44
  360. package/types/commands/ag/create.d.ts +0 -25
  361. package/types/commands/ag/delete.d.ts +0 -32
  362. package/types/commands/ag/deploy.d.ts +0 -31
  363. package/types/commands/ag/detail.d.ts +0 -28
  364. package/types/commands/ag/index.d.ts +0 -6
  365. package/types/commands/ag/list.d.ts +0 -35
  366. package/types/commands/ag/run.d.ts +0 -52
  367. package/types/commands/ai/index.d.ts +0 -23
  368. package/types/commands/cloudfunction/base.d.ts +0 -43
  369. package/types/commands/cloudfunction/index.d.ts +0 -1
  370. package/types/commands/cloudrun/base.d.ts +0 -170
  371. package/types/commands/cloudrun/index.d.ts +0 -1
  372. package/types/commands/common.d.ts +0 -38
  373. package/types/commands/config/delete.d.ts +0 -13
  374. package/types/commands/config/get.d.ts +0 -13
  375. package/types/commands/config/index.d.ts +0 -5
  376. package/types/commands/config/interface.d.ts +0 -17
  377. package/types/commands/config/list.d.ts +0 -13
  378. package/types/commands/config/set.d.ts +0 -13
  379. package/types/commands/constants.d.ts +0 -8
  380. package/types/commands/db/base.d.ts +0 -44
  381. package/types/commands/db/index.d.ts +0 -1
  382. package/types/commands/env/base.d.ts +0 -27
  383. package/types/commands/env/domain.d.ts +0 -53
  384. package/types/commands/env/index.d.ts +0 -3
  385. package/types/commands/env/login.d.ts +0 -47
  386. package/types/commands/framework/index.d.ts +0 -42
  387. package/types/commands/fun/base.d.ts +0 -43
  388. package/types/commands/fun/index.d.ts +0 -1
  389. package/types/commands/functions/alias/getRoute.d.ts +0 -13
  390. package/types/commands/functions/alias/index.d.ts +0 -2
  391. package/types/commands/functions/alias/setRoute.d.ts +0 -13
  392. package/types/commands/functions/code-download.d.ts +0 -18
  393. package/types/commands/functions/code-update.d.ts +0 -18
  394. package/types/commands/functions/concurrency/delete.d.ts +0 -13
  395. package/types/commands/functions/concurrency/index.d.ts +0 -3
  396. package/types/commands/functions/concurrency/list.d.ts +0 -13
  397. package/types/commands/functions/concurrency/set.d.ts +0 -13
  398. package/types/commands/functions/config-update.d.ts +0 -19
  399. package/types/commands/functions/copy.d.ts +0 -15
  400. package/types/commands/functions/delete.d.ts +0 -14
  401. package/types/commands/functions/deploy.d.ts +0 -22
  402. package/types/commands/functions/detail.d.ts +0 -16
  403. package/types/commands/functions/index.d.ts +0 -17
  404. package/types/commands/functions/invoke.d.ts +0 -15
  405. package/types/commands/functions/layer/bind.d.ts +0 -35
  406. package/types/commands/functions/layer/common.d.ts +0 -8
  407. package/types/commands/functions/layer/create.d.ts +0 -18
  408. package/types/commands/functions/layer/delete.d.ts +0 -18
  409. package/types/commands/functions/layer/download.d.ts +0 -18
  410. package/types/commands/functions/layer/index.d.ts +0 -7
  411. package/types/commands/functions/layer/list.d.ts +0 -19
  412. package/types/commands/functions/layer/sort.d.ts +0 -18
  413. package/types/commands/functions/list.d.ts +0 -14
  414. package/types/commands/functions/log.d.ts +0 -15
  415. package/types/commands/functions/run.d.ts +0 -17
  416. package/types/commands/functions/trigger-create.d.ts +0 -18
  417. package/types/commands/functions/trigger-delete.d.ts +0 -18
  418. package/types/commands/functions/version/index.d.ts +0 -2
  419. package/types/commands/functions/version/list.d.ts +0 -13
  420. package/types/commands/functions/version/publish.d.ts +0 -13
  421. package/types/commands/gateway/create.d.ts +0 -14
  422. package/types/commands/gateway/delete.d.ts +0 -14
  423. package/types/commands/gateway/domain.d.ts +0 -47
  424. package/types/commands/gateway/index.d.ts +0 -5
  425. package/types/commands/gateway/list.d.ts +0 -15
  426. package/types/commands/gateway/switch.d.ts +0 -31
  427. package/types/commands/helpers/index.d.ts +0 -3
  428. package/types/commands/helpers/init.d.ts +0 -22
  429. package/types/commands/helpers/new.d.ts +0 -17
  430. package/types/commands/helpers/open.d.ts +0 -11
  431. package/types/commands/hosting/hosting.d.ts +0 -66
  432. package/types/commands/hosting/index.d.ts +0 -1
  433. package/types/commands/index.d.ts +0 -23
  434. package/types/commands/lowcode/app.d.ts +0 -81
  435. package/types/commands/lowcode/comps.d.ts +0 -77
  436. package/types/commands/lowcode/index.d.ts +0 -2
  437. package/types/commands/lowcode/utils.d.ts +0 -9
  438. package/types/commands/pull/index.d.ts +0 -1
  439. package/types/commands/pull/pull.d.ts +0 -16
  440. package/types/commands/run/delete.d.ts +0 -13
  441. package/types/commands/run/image/common.d.ts +0 -8
  442. package/types/commands/run/image/delete.d.ts +0 -17
  443. package/types/commands/run/image/download.d.ts +0 -17
  444. package/types/commands/run/image/index.d.ts +0 -5
  445. package/types/commands/run/image/list.d.ts +0 -17
  446. package/types/commands/run/image/upload.d.ts +0 -17
  447. package/types/commands/run/index.d.ts +0 -5
  448. package/types/commands/run/list.d.ts +0 -13
  449. package/types/commands/run/service/config.d.ts +0 -14
  450. package/types/commands/run/service/deploy.d.ts +0 -13
  451. package/types/commands/run/service/index.d.ts +0 -4
  452. package/types/commands/run/service/list.d.ts +0 -13
  453. package/types/commands/run/service/update.d.ts +0 -13
  454. package/types/commands/run/standalonegateway/common.d.ts +0 -8
  455. package/types/commands/run/standalonegateway/create.d.ts +0 -17
  456. package/types/commands/run/standalonegateway/destroy.d.ts +0 -17
  457. package/types/commands/run/standalonegateway/index.d.ts +0 -5
  458. package/types/commands/run/standalonegateway/list.d.ts +0 -17
  459. package/types/commands/run/standalonegateway/package.d.ts +0 -17
  460. package/types/commands/run/standalonegateway/turn.d.ts +0 -17
  461. package/types/commands/run/version/common.d.ts +0 -8
  462. package/types/commands/run/version/create.d.ts +0 -17
  463. package/types/commands/run/version/delete.d.ts +0 -17
  464. package/types/commands/run/version/index.d.ts +0 -5
  465. package/types/commands/run/version/list.d.ts +0 -17
  466. package/types/commands/run/version/modify.d.ts +0 -17
  467. package/types/commands/run/version/update.d.ts +0 -17
  468. package/types/commands/runf/base.d.ts +0 -43
  469. package/types/commands/runf/index.d.ts +0 -1
  470. package/types/commands/self-update.d.ts +0 -24
  471. package/types/commands/smart.d.ts +0 -1
  472. package/types/commands/storage/index.d.ts +0 -1
  473. package/types/commands/storage/storage.d.ts +0 -106
  474. package/types/commands/third/index.d.ts +0 -1
  475. package/types/commands/third/thirdAttach.d.ts +0 -15
  476. package/types/commands/utils.d.ts +0 -28
  477. package/types/completion/index.d.ts +0 -4
  478. package/types/constant.d.ts +0 -71
  479. package/types/db/index.d.ts +0 -24
  480. package/types/decorators/captureError.d.ts +0 -1
  481. package/types/decorators/constants.d.ts +0 -11
  482. package/types/decorators/deprecate.d.ts +0 -4
  483. package/types/decorators/guard.d.ts +0 -5
  484. package/types/decorators/index.d.ts +0 -7
  485. package/types/decorators/injectParams.d.ts +0 -1
  486. package/types/decorators/params/common.d.ts +0 -4
  487. package/types/decorators/params/index.d.ts +0 -8
  488. package/types/env/domain.d.ts +0 -11
  489. package/types/env/index.d.ts +0 -12
  490. package/types/env/login.d.ts +0 -16
  491. package/types/error.d.ts +0 -20
  492. package/types/function/alias.d.ts +0 -3
  493. package/types/function/base.d.ts +0 -32
  494. package/types/function/code.d.ts +0 -8
  495. package/types/function/concurrency.d.ts +0 -4
  496. package/types/function/create.d.ts +0 -3
  497. package/types/function/delete.d.ts +0 -8
  498. package/types/function/index.d.ts +0 -11
  499. package/types/function/layer/attach.d.ts +0 -9
  500. package/types/function/layer/create.d.ts +0 -8
  501. package/types/function/layer/delete.d.ts +0 -5
  502. package/types/function/layer/download.d.ts +0 -7
  503. package/types/function/layer/index.d.ts +0 -7
  504. package/types/function/layer/list.d.ts +0 -10
  505. package/types/function/layer/sort.d.ts +0 -10
  506. package/types/function/trigger.d.ts +0 -5
  507. package/types/function/update.d.ts +0 -2
  508. package/types/function/version.d.ts +0 -3
  509. package/types/function/vpc.d.ts +0 -2
  510. package/types/gateway/index.d.ts +0 -18
  511. package/types/help.d.ts +0 -1
  512. package/types/hosting.d.ts +0 -35
  513. package/types/i18n/index.d.ts +0 -3
  514. package/types/index.d.ts +0 -4
  515. package/types/logger.d.ts +0 -3
  516. package/types/run/delete.d.ts +0 -2
  517. package/types/run/image/build.d.ts +0 -10
  518. package/types/run/image/delete.d.ts +0 -2
  519. package/types/run/image/index.d.ts +0 -4
  520. package/types/run/image/info.d.ts +0 -1
  521. package/types/run/image/list.d.ts +0 -3
  522. package/types/run/index.d.ts +0 -7
  523. package/types/run/list.d.ts +0 -2
  524. package/types/run/repo.d.ts +0 -5
  525. package/types/run/service/common.d.ts +0 -42
  526. package/types/run/service/config.d.ts +0 -23
  527. package/types/run/service/deployPackage.d.ts +0 -11
  528. package/types/run/service/index.d.ts +0 -6
  529. package/types/run/service/list.d.ts +0 -2
  530. package/types/run/service/showLogs.d.ts +0 -2
  531. package/types/run/service/update.d.ts +0 -3
  532. package/types/run/standalonegateway/create.d.ts +0 -2
  533. package/types/run/standalonegateway/destroy.d.ts +0 -2
  534. package/types/run/standalonegateway/index.d.ts +0 -5
  535. package/types/run/standalonegateway/list.d.ts +0 -2
  536. package/types/run/standalonegateway/package/index.d.ts +0 -1
  537. package/types/run/standalonegateway/package/list.d.ts +0 -2
  538. package/types/run/standalonegateway/turn/index.d.ts +0 -2
  539. package/types/run/standalonegateway/turn/off.d.ts +0 -2
  540. package/types/run/standalonegateway/turn/on.d.ts +0 -2
  541. package/types/run/version/create.d.ts +0 -10
  542. package/types/run/version/delete.d.ts +0 -2
  543. package/types/run/version/index.d.ts +0 -6
  544. package/types/run/version/list.d.ts +0 -2
  545. package/types/run/version/modify.d.ts +0 -2
  546. package/types/run/version/repo.d.ts +0 -10
  547. package/types/run/version/update.d.ts +0 -6
  548. package/types/storage.d.ts +0 -34
  549. package/types/third/index.d.ts +0 -1
  550. package/types/types.d.ts +0 -590
  551. package/types/utils/ai/banner.d.ts +0 -2
  552. package/types/utils/ai/claudeWindows.d.ts +0 -2
  553. package/types/utils/ai/config.d.ts +0 -89
  554. package/types/utils/ai/const.d.ts +0 -401
  555. package/types/utils/ai/ensureFiles.d.ts +0 -1
  556. package/types/utils/ai/env.d.ts +0 -2
  557. package/types/utils/ai/envLocalManager.d.ts +0 -23
  558. package/types/utils/ai/nodeVersion.d.ts +0 -2
  559. package/types/utils/ai/router.d.ts +0 -55
  560. package/types/utils/ai/setup.d.ts +0 -26
  561. package/types/utils/auth.d.ts +0 -3
  562. package/types/utils/checkTcbrEnv.d.ts +0 -3
  563. package/types/utils/cli-table.d.ts +0 -2
  564. package/types/utils/commonParamsCheck.d.ts +0 -3
  565. package/types/utils/config.d.ts +0 -27
  566. package/types/utils/debug-logger.d.ts +0 -1
  567. package/types/utils/dts.d.ts +0 -6
  568. package/types/utils/env.d.ts +0 -5
  569. package/types/utils/fs/del.d.ts +0 -1
  570. package/types/utils/fs/index.d.ts +0 -7
  571. package/types/utils/function-packer.d.ts +0 -18
  572. package/types/utils/index.d.ts +0 -22
  573. package/types/utils/log.d.ts +0 -22
  574. package/types/utils/mcp-config-modifier.d.ts +0 -7
  575. package/types/utils/net/cloud-api-request.d.ts +0 -9
  576. package/types/utils/net/credential.d.ts +0 -5
  577. package/types/utils/net/http-request.d.ts +0 -8
  578. package/types/utils/net/index.d.ts +0 -5
  579. package/types/utils/net/manager-service.d.ts +0 -4
  580. package/types/utils/net/proxy.d.ts +0 -1
  581. package/types/utils/notice.d.ts +0 -1
  582. package/types/utils/output/highlight.d.ts +0 -1
  583. package/types/utils/output/index.d.ts +0 -3
  584. package/types/utils/output/link.d.ts +0 -1
  585. package/types/utils/output/loading.d.ts +0 -18
  586. package/types/utils/parallel.d.ts +0 -11
  587. package/types/utils/platform/index.d.ts +0 -3
  588. package/types/utils/platform/mac.d.ts +0 -2
  589. package/types/utils/platform/os.d.ts +0 -2
  590. package/types/utils/platform/port.d.ts +0 -1
  591. package/types/utils/progress-bar.d.ts +0 -1
  592. package/types/utils/prompt/index.d.ts +0 -1
  593. package/types/utils/prompt/select.d.ts +0 -4
  594. package/types/utils/report.d.ts +0 -16
  595. package/types/utils/reporter/agree.d.ts +0 -1
  596. package/types/utils/reporter/download.d.ts +0 -1
  597. package/types/utils/reporter/index.d.ts +0 -3
  598. package/types/utils/reporter/usage.d.ts +0 -1
  599. package/types/utils/store/auth.d.ts +0 -8
  600. package/types/utils/store/common.d.ts +0 -2
  601. package/types/utils/store/config.d.ts +0 -8
  602. package/types/utils/store/db.d.ts +0 -17
  603. package/types/utils/store/index.d.ts +0 -5
  604. package/types/utils/store/usage.d.ts +0 -2
  605. package/types/utils/tcbrApi/callTcbrApi.d.ts +0 -1
  606. package/types/utils/tcbrApi/index.d.ts +0 -1
  607. package/types/utils/template-manager.d.ts +0 -27
  608. package/types/utils/template.d.ts +0 -8
  609. package/types/utils/tools/common.d.ts +0 -1
  610. package/types/utils/tools/encoding.d.ts +0 -1
  611. package/types/utils/tools/index.d.ts +0 -4
  612. package/types/utils/tools/object.d.ts +0 -1
  613. package/types/utils/tools/time.d.ts +0 -2
  614. package/types/utils/tools/uid.d.ts +0 -2
  615. package/types/utils/url.d.ts +0 -18
  616. package/types/utils/validator.d.ts +0 -9
@@ -1,1228 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || function (mod) {
19
- if (mod && mod.__esModule) return mod;
20
- var result = {};
21
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
- __setModuleDefault(result, mod);
23
- return result;
24
- };
25
- var __importDefault = (this && this.__importDefault) || function (mod) {
26
- return (mod && mod.__esModule) ? mod : { "default": mod };
27
- };
28
- Object.defineProperty(exports, "__esModule", { value: true });
29
- exports.AICommandRouter = void 0;
30
- const child_process_1 = require("child_process");
31
- const config_1 = require("./config");
32
- const error_1 = require("../../error");
33
- const inquirer_1 = __importDefault(require("inquirer"));
34
- const chalk_1 = __importDefault(require("chalk"));
35
- const output_1 = require("../output");
36
- const i18n_1 = require("../../i18n");
37
- const const_1 = require("./const");
38
- const utils_1 = require("../../commands/utils");
39
- const auth_1 = require("../../auth");
40
- const nodeVersion_1 = require("./nodeVersion");
41
- const claudeWindows_1 = require("./claudeWindows");
42
- const env_1 = require("./env");
43
- const url_1 = require("../url");
44
- const IDE_FILE_MAPPINGS = {
45
- cursor: [
46
- { path: '.cursor/rules/cloudbase-rules.mdc' },
47
- { path: '.cursor/mcp.json', isMcpConfig: true }
48
- ],
49
- windsurf: [{ path: '.windsurf/rules/cloudbase-rules.md' }],
50
- codebuddy: [{ path: '.rules/cloudbase-rules.md' }],
51
- 'claude-code': [{ path: 'CLAUDE.md' }, { path: '.mcp.json', isMcpConfig: true }],
52
- cline: [{ path: '.clinerules/cloudbase-rules.mdc' }],
53
- 'gemini-cli': [
54
- { path: '.gemini/GEMINI.md' },
55
- { path: '.gemini/settings.json', isMcpConfig: true }
56
- ],
57
- opencode: [{ path: '.opencode.json', isMcpConfig: true }],
58
- 'qwen-code': [{ path: '.qwen/QWEN.md' }, { path: '.qwen/settings.json', isMcpConfig: true }],
59
- 'baidu-comate': [
60
- { path: '.comate/rules/cloudbase-rules.mdr' },
61
- { path: '.comate/rules/cloudbaase-rules.mdr' },
62
- { path: '.comate/mcp.json', isMcpConfig: true }
63
- ],
64
- 'openai-codex-cli': [{ path: '.codex/config.toml', isMcpConfig: true }, { path: 'AGENTS.md' }],
65
- 'augment-code': [{ path: '.augment-guidelines' }],
66
- 'github-copilot': [{ path: '.github/copilot-instructions.md' }],
67
- roocode: [
68
- { path: '.roo/rules/cloudbaase-rules.md' },
69
- { path: '.roo/mcp.json', isMcpConfig: true }
70
- ],
71
- 'tongyi-lingma': [{ path: '.lingma/rules/cloudbaase-rules.md' }],
72
- trae: [{ path: '.trae/rules/cloudbase-rules.md' }],
73
- vscode: [{ path: '.vscode/mcp.json', isMcpConfig: true }, { path: '.vscode/settings.json' }],
74
- aider: [{ path: 'mcp.json', isMcpConfig: true }]
75
- };
76
- const MCP_CONFIG_SET = new Set(Object.values(IDE_FILE_MAPPINGS).reduce((acc, descriptors) => {
77
- for (const d of descriptors) {
78
- if (d.isMcpConfig)
79
- acc.push(d.path);
80
- }
81
- return acc;
82
- }, []));
83
- function inferConfigFormat(filePath) {
84
- return filePath.toLowerCase().endsWith('.toml') ? 'toml' : 'json';
85
- }
86
- class AICommandRouter {
87
- constructor() {
88
- this.configManager = new config_1.AIConfigManager();
89
- }
90
- async execute({ agent, addtionalArgs, log, template, useDefaultConfig }) {
91
- var _a;
92
- if ((0, config_1.isValidAgent)(agent) !== true) {
93
- log.error((0, i18n_1.t)('❌ 无效的 agent: {{agent}}', { agent }));
94
- return;
95
- }
96
- const config = await this.configManager.loadConfig();
97
- if (!config) {
98
- log.warn((0, i18n_1.t)("⚠️ 未检测到 AI ToolKit CLI 配置,请运行 'tcb ai --setup' 进行配置"));
99
- return;
100
- }
101
- const agentUpperCased = agent.toUpperCase();
102
- const agentConfig = (_a = config.agents) === null || _a === void 0 ? void 0 : _a[agent];
103
- if (!agentConfig) {
104
- log.warn((0, i18n_1.t)('⚠️ 未找到 {{agent}} 配置,请运行 tcb ai --setup 进行配置', { agent: agentUpperCased }));
105
- return;
106
- }
107
- log.info((0, i18n_1.t)('🚀 启动 {{agent}} AI CLI 工具', { agent: chalk_1.default.bold(agentUpperCased) }));
108
- try {
109
- await this.checkToolkitConfig({ agent, log, template, useDefaultConfig });
110
- }
111
- catch (e) {
112
- log.warn((0, i18n_1.t)('⚠️ 云开发功能检查失败,但 AI 工具仍可正常使用'));
113
- }
114
- const isValid = await this.validateAgentConfig(agent, agentConfig, log);
115
- if (!isValid) {
116
- log.warn((0, i18n_1.t)('⚠️ {{agent}} 配置无效,请重新配置', { agent: agent.toUpperCase() }));
117
- return;
118
- }
119
- this.executeAgentWithConfig(agent, agentConfig, this.parseArgs(addtionalArgs), log);
120
- }
121
- async checkToolkitConfig(checkOptions) {
122
- const { agent, log, template, useDefaultConfig } = checkOptions;
123
- const { missingFiles } = await this.configManager.checkToolkitConfig(agent);
124
- if (missingFiles.length > 0) {
125
- const skipTemplate = await this.checkSkipTemplateConfig();
126
- if (skipTemplate) {
127
- log.info((0, i18n_1.t)('🚫 已跳过模板下载,无法使用云开发 MCP 及 AI 规则。如需使用,请参考 tcb pull --help'));
128
- return;
129
- }
130
- log.log('');
131
- await this.downloadTemplate({ log, template, agent, useDefaultConfig });
132
- log.log('');
133
- }
134
- }
135
- async checkSkipTemplateConfig() {
136
- try {
137
- const fs = await Promise.resolve().then(() => __importStar(require('fs-extra')));
138
- const path = await Promise.resolve().then(() => __importStar(require('path')));
139
- const skipFile = path.join(process.cwd(), '.skip-template');
140
- return await fs.pathExists(skipFile);
141
- }
142
- catch {
143
- return false;
144
- }
145
- }
146
- async saveSkipTemplateConfig() {
147
- try {
148
- const fs = await Promise.resolve().then(() => __importStar(require('fs-extra')));
149
- const path = await Promise.resolve().then(() => __importStar(require('path')));
150
- const skipFile = path.join(process.cwd(), '.skip-template');
151
- await fs.writeFile(skipFile, new Date().toISOString());
152
- }
153
- catch (error) {
154
- }
155
- }
156
- async downloadTemplate(options) {
157
- const { log, template, agent, useDefaultConfig } = options;
158
- try {
159
- let templateType;
160
- if (template) {
161
- templateType = template;
162
- }
163
- else {
164
- if (useDefaultConfig) {
165
- templateType = 'rules';
166
- }
167
- else {
168
- const { templateType: selectedType } = await inquirer_1.default.prompt([
169
- {
170
- type: 'list',
171
- name: 'templateType',
172
- message: (0, i18n_1.t)('下载模板以获取完整的开发体验: {{hint}}', { hint: const_1.LIST_HINT }),
173
- choices: [
174
- { name: (0, i18n_1.t)('🟦 微信小程序 + CloudBase'), value: 'miniprogram' },
175
- { name: (0, i18n_1.t)('🚀 Web 应用 - React + CloudBase'), value: 'react' },
176
- { name: (0, i18n_1.t)('🟢 Web 应用 - Vue + CloudBase'), value: 'vue' },
177
- { name: (0, i18n_1.t)('🌈 跨端应用 - UniApp + CloudBase'), value: 'uniapp' },
178
- { name: (0, i18n_1.t)('🧩 只下载 AI 规则和配置'), value: 'rules' },
179
- { name: (0, i18n_1.t)('🚫 不下载模板'), value: 'none' }
180
- ],
181
- default: 'miniprogram'
182
- }
183
- ]);
184
- templateType = selectedType;
185
- }
186
- }
187
- if (templateType === 'none') {
188
- log.info((0, i18n_1.t)('🚫 跳过模板下载'));
189
- await this.saveSkipTemplateConfig();
190
- return;
191
- }
192
- log.info((0, i18n_1.t)('📦 正在下载并解压 {{templateType}} 模板...', { templateType }));
193
- await this.downloadAndExtractTemplate({ templateType, log, agent: agent, useDefaultConfig: useDefaultConfig || false });
194
- log.info((0, i18n_1.t)('✅ {{templateType}} 模板配置完成', { templateType }));
195
- }
196
- catch (error) {
197
- log.error((0, i18n_1.t)('❌ 配置失败: {{error}}', { error: error.message }));
198
- throw new error_1.CloudBaseError((0, i18n_1.t)('模板下载失败'), { original: error });
199
- }
200
- }
201
- async downloadAndExtractTemplate(options) {
202
- const fs = await Promise.resolve().then(() => __importStar(require('fs-extra')));
203
- const path = await Promise.resolve().then(() => __importStar(require('path')));
204
- const os = await Promise.resolve().then(() => __importStar(require('os')));
205
- const unzipper = await Promise.resolve().then(() => __importStar(require('unzipper')));
206
- const https = await Promise.resolve().then(() => __importStar(require('https')));
207
- let ConfigParser;
208
- const { templateType, log, agent, useDefaultConfig } = options;
209
- try {
210
- ConfigParser = (await Promise.resolve().then(() => __importStar(require('@cloudbase/toolbox')))).ConfigParser;
211
- }
212
- catch {
213
- ConfigParser = undefined;
214
- }
215
- const templateMap = {
216
- rules: {
217
- url: 'https://static.cloudbase.net/cloudbase-examples/web-cloudbase-project.zip'
218
- },
219
- react: {
220
- url: 'https://static.cloudbase.net/cloudbase-examples/web-cloudbase-react-template.zip'
221
- },
222
- vue: {
223
- url: 'https://static.cloudbase.net/cloudbase-examples/web-cloudbase-vue-template.zip'
224
- },
225
- miniprogram: {
226
- url: 'https://static.cloudbase.net/cloudbase-examples/miniprogram-cloudbase-miniprogram-template.zip'
227
- },
228
- uniapp: {
229
- url: 'https://static.cloudbase.net/cloudbase-examples/universal-cloudbase-uniapp-template.zip'
230
- }
231
- };
232
- const template = templateMap[templateType];
233
- if (!template)
234
- throw new error_1.CloudBaseError((0, i18n_1.t)('未知模板类型'));
235
- const tmpDir = os.tmpdir();
236
- const zipPath = path.join(tmpDir, `cloudbase-template-${templateType}-${Date.now()}.zip`);
237
- await new Promise((resolve, reject) => {
238
- const file = fs.createWriteStream(zipPath);
239
- https
240
- .get(template.url, (response) => {
241
- if (response.statusCode !== 200) {
242
- reject(new Error((0, i18n_1.t)('下载失败: {{statusCode}}', { statusCode: response.statusCode })));
243
- return;
244
- }
245
- response.pipe(file);
246
- file.on('finish', () => {
247
- file.close();
248
- resolve();
249
- });
250
- })
251
- .on('error', (err) => {
252
- fs.unlink(zipPath);
253
- reject(err);
254
- });
255
- });
256
- const extractDir = process.cwd();
257
- const zipStream = fs.createReadStream(zipPath).pipe(unzipper.Parse({ forceStream: true }));
258
- const agentDirs = ['.claude', '.codex', '.qwen', '.codebuddy', '.cursor'];
259
- for await (const entry of zipStream) {
260
- const entryPath = entry.path;
261
- const destPath = path.join(extractDir, entryPath);
262
- if (useDefaultConfig && agent) {
263
- const currentAgentDir = `.${agent}`;
264
- const isAgentDir = agentDirs.some(dir => entryPath.startsWith(dir + '/') || entryPath === dir);
265
- if (isAgentDir && !entryPath.startsWith(currentAgentDir + '/') && entryPath !== currentAgentDir) {
266
- log.debug && log.debug((0, i18n_1.t)('跳过不匹配的 agent 目录: {{entryPath}} (当前 agent: {{agent}})', { entryPath, agent }));
267
- entry.autodrain();
268
- continue;
269
- }
270
- }
271
- if (entry.type === 'Directory') {
272
- await fs.ensureDir(destPath);
273
- entry.autodrain();
274
- continue;
275
- }
276
- if (MCP_CONFIG_SET.has(entryPath)) {
277
- try {
278
- await this.mergeMcpConfig(entry, destPath, inferConfigFormat(entryPath), log);
279
- }
280
- catch (e) {
281
- log.warn((0, i18n_1.t)('MCP 配置合并失败 {{entryPath}}:{{error}},已跳过', { entryPath, error: e.message }));
282
- }
283
- continue;
284
- }
285
- if (entryPath === 'cloudbaserc.json' && (await fs.pathExists(destPath))) {
286
- try {
287
- const templateContent = await entry.buffer();
288
- const templateJson = JSON.parse(templateContent.toString('utf8'));
289
- const localJson = await fs.readJson(destPath);
290
- const deepMerge = (target, source) => {
291
- if (typeof target !== 'object' ||
292
- typeof source !== 'object' ||
293
- !target ||
294
- !source)
295
- return target;
296
- const result = { ...source, ...target };
297
- for (const key of Object.keys(source)) {
298
- if (key in target &&
299
- typeof target[key] === 'object' &&
300
- typeof source[key] === 'object') {
301
- result[key] = deepMerge(target[key], source[key]);
302
- }
303
- }
304
- return result;
305
- };
306
- let merged = deepMerge(localJson, templateJson);
307
- await fs.writeJson(destPath, merged, { spaces: 2 });
308
- }
309
- catch (e) {
310
- log.warn((0, i18n_1.t)('cloudbaserc.json 合并失败,已跳过: {{error}}', { error: e.message }));
311
- }
312
- continue;
313
- }
314
- if (await fs.pathExists(destPath)) {
315
- if (useDefaultConfig) {
316
- entry.autodrain();
317
- continue;
318
- }
319
- const { confirmOverwriteFile } = await inquirer_1.default.prompt([
320
- {
321
- type: 'confirm',
322
- name: 'confirmOverwriteFile',
323
- message: (0, i18n_1.t)('检测到已存在文件 {{entryPath}},是否覆盖? {{hint}}', {
324
- entryPath,
325
- hint: (0, const_1.getBooleanHint)(false)
326
- }),
327
- default: false
328
- }
329
- ]);
330
- if (!confirmOverwriteFile) {
331
- entry.autodrain();
332
- continue;
333
- }
334
- }
335
- await fs.ensureDir(path.dirname(destPath));
336
- await new Promise((res, rej) => {
337
- entry.pipe(fs.createWriteStream(destPath)).on('finish', res).on('error', rej);
338
- });
339
- }
340
- await fs.unlink(zipPath);
341
- await this.modifyMCPConfigs(extractDir, log);
342
- }
343
- getInstallCommand(agent) {
344
- switch (agent) {
345
- case 'claude':
346
- return {
347
- success: true,
348
- command: 'npm',
349
- args: ['install', '-g', '@anthropic-ai/claude-code'],
350
- message: 'macOS/Linux/WSL: curl -fsSL claude.ai/install.sh | bash\nWindows PowerShell: irm https://claude.ai/install.ps1 | iex'
351
- };
352
- case 'qwen':
353
- return {
354
- success: true,
355
- command: 'npm',
356
- args: ['install', '-g', '@qwen-code/qwen-code'],
357
- message: 'npm install -g @qwen-code/qwen-code'
358
- };
359
- case 'codex':
360
- return {
361
- success: true,
362
- command: 'npm',
363
- args: ['install', '-g', '@openai/codex-cli'],
364
- message: 'npm install -g @openai/codex-cli'
365
- };
366
- case 'gemini':
367
- return {
368
- success: true,
369
- command: 'npm',
370
- args: ['install', '-g', '@google/gemini-cli'],
371
- message: 'npm install -g @google/gemini-cli'
372
- };
373
- case 'codebuddy':
374
- return {
375
- success: true,
376
- command: 'npm',
377
- args: ['install', '-g', '@tencent-ai/codebuddy-code'],
378
- message: 'npm install -g @tencent-ai/codebuddy-code'
379
- };
380
- default:
381
- return { success: false, message: (0, i18n_1.t)('# 请查阅 {{agent}} 的官方安装文档', { agent }) };
382
- }
383
- }
384
- async executeCommand(command, args, env, log) {
385
- return new Promise((resolve, reject) => {
386
- const useShell = process.platform === 'win32';
387
- const child = (0, child_process_1.spawn)(command, args, {
388
- stdio: 'inherit',
389
- env,
390
- shell: useShell
391
- });
392
- child.on('close', (code) => {
393
- if (code === 0) {
394
- resolve();
395
- }
396
- else {
397
- const errorMsg = (0, i18n_1.t)('命令执行失败: {{command}} {{args}} (退出码: {{code}})', {
398
- command,
399
- args: args.join(' '),
400
- code
401
- });
402
- log.error((0, i18n_1.t)('❌ {{errorMsg}}', { errorMsg }));
403
- if (code === 127) {
404
- log.info((0, i18n_1.t)('💡 命令未找到,请检查是否正确安装'));
405
- log.info((0, i18n_1.t)('📦 安装命令: {{installCmd}}', { installCmd: this.getInstallCommand(command).message }));
406
- }
407
- else if (code === 1) {
408
- log.info((0, i18n_1.t)('💡 可能是参数错误或配置问题'));
409
- log.info((0, i18n_1.t)('🔧 请检查 API 密钥、模型名称等配置是否正确'));
410
- }
411
- if (command === 'ccr') {
412
- log.info((0, i18n_1.t)('🔧 请前往 {{logPath}} 查看日志', { logPath: const_1.CLAUDE_CODE_ROUTER_LOG_PATH }));
413
- }
414
- reject(new Error(errorMsg));
415
- }
416
- });
417
- child.on('error', (err) => {
418
- const errorMsg = (0, i18n_1.t)('启动失败: {{command}} ({{error}})', { command, error: err.message });
419
- log.error((0, i18n_1.t)('❌ {{errorMsg}}', { errorMsg }));
420
- if (err.message.includes('ENOENT')) {
421
- log.info((0, i18n_1.t)('💡 命令不存在,请先安装对应的 AI CLI 工具'));
422
- log.info((0, i18n_1.t)('📦 安装命令: {{installCmd}}', { installCmd: this.getInstallCommand(command).message }));
423
- }
424
- else if (err.message.includes('EACCES')) {
425
- log.info((0, i18n_1.t)('💡 权限不足,请检查文件权限或使用管理员权限'));
426
- }
427
- reject(new Error(errorMsg));
428
- });
429
- });
430
- }
431
- async isToolAvailable(command) {
432
- return new Promise((resolve) => {
433
- const child = (0, child_process_1.spawn)(command, ['--version'], {
434
- stdio: 'pipe',
435
- shell: true
436
- });
437
- child.on('close', (code) => {
438
- resolve(code === 0);
439
- });
440
- child.on('error', () => {
441
- resolve(false);
442
- });
443
- });
444
- }
445
- async validateAgentConfig(agent, agentConfig, log) {
446
- if (!agentConfig) {
447
- log.error((0, i18n_1.t)('❌ Agent 配置为空'));
448
- return false;
449
- }
450
- const validateResult = (0, const_1.getAgentConfigValidator)(agent)(agentConfig);
451
- if (validateResult.success === true) {
452
- log.debug((0, i18n_1.t)('✅ Agent 配置验证通过'));
453
- return true;
454
- }
455
- else {
456
- log.error((0, i18n_1.t)('❌ {{agent}} 配置无效: {{error}}', { agent, error: validateResult.error }));
457
- return false;
458
- }
459
- }
460
- async executeAgentWithConfig(agent, agentConfig, additionalArgs, log) {
461
- switch (agent) {
462
- case const_1.CLAUDE.value:
463
- try {
464
- if (agentConfig.type === 'cloudbase') {
465
- return await this.executeClaudeCloudbaseAgent(agentConfig, additionalArgs, log);
466
- }
467
- else if (agentConfig.type === 'custom') {
468
- return await this.executeClaudeAgent(agentConfig, additionalArgs, log);
469
- }
470
- else {
471
- return await this.executeNoneClaudeAgent(additionalArgs, log);
472
- }
473
- }
474
- catch (_) {
475
- (0, claudeWindows_1.claudeWindowsCheck)(log);
476
- return process.exit(1);
477
- }
478
- case const_1.QWEN.value:
479
- if (agentConfig.type === 'cloudbase') {
480
- return await this.executeQwenCloudbaseAgent(agentConfig, additionalArgs, log);
481
- }
482
- else if (agentConfig.type === 'custom') {
483
- return await this.executeQwenAgent(agentConfig, additionalArgs, log);
484
- }
485
- else {
486
- return await this.executeNoneQwenAgent(additionalArgs, log);
487
- }
488
- case const_1.CODEX.value:
489
- if (agentConfig.type === 'cloudbase') {
490
- return await this.executeCodexCloudbaseAgent(agentConfig, additionalArgs, log);
491
- }
492
- else if (agentConfig.type === 'custom') {
493
- return await this.executeCodexAgent(agentConfig, additionalArgs, log);
494
- }
495
- else {
496
- return await this.executeNoneCodexAgent(additionalArgs, log);
497
- }
498
- case const_1.AIDER.value:
499
- if (agentConfig.type === 'cloudbase') {
500
- return await this.executeAiderCloudbaseAgent(agentConfig, additionalArgs, log);
501
- }
502
- else {
503
- return await this.executeAiderAgent(agentConfig, additionalArgs, log);
504
- }
505
- case const_1.CURSOR.value:
506
- return await this.executeNoneCursorAgent(additionalArgs, log);
507
- case const_1.CODEBUDDY.value:
508
- if (agentConfig.type === 'custom') {
509
- return await this.executeCodebuddyAgent(agentConfig, additionalArgs, log);
510
- }
511
- else {
512
- return await this.executeNoneCodebuddyAgent(additionalArgs, log);
513
- }
514
- default:
515
- throw new Error((0, i18n_1.t)('不支持的 AI 工具: {{agent}}', { agent }));
516
- }
517
- }
518
- async executeClaudeAgent({ apiKey, baseUrl, model }, additionalArgs, log) {
519
- (0, nodeVersion_1.ensureNodeVersion)('v18.0.0', log);
520
- await this.ensureClaudeCode(log);
521
- await this.executeCommand('claude', additionalArgs, {
522
- ...process.env,
523
- ANTHROPIC_AUTH_TOKEN: apiKey,
524
- ANTHROPIC_BASE_URL: baseUrl,
525
- ANTHROPIC_MODEL: model
526
- }, log);
527
- }
528
- async executeNoneClaudeAgent(additionalArgs, log) {
529
- await this.ensureClaudeCode(log);
530
- await this.executeCommand('claude', additionalArgs, { ...process.env }, log);
531
- }
532
- async executeQwenAgent({ apiKey, baseUrl, model }, additionalArgs, log) {
533
- (0, nodeVersion_1.ensureNodeVersion)('v20.0.0', log);
534
- await this.ensureQwenCode(log);
535
- await this.executeCommand('qwen', additionalArgs, {
536
- ...process.env,
537
- OPENAI_API_KEY: apiKey,
538
- OPENAI_BASE_URL: baseUrl,
539
- OPENAI_MODEL: model
540
- }, log);
541
- }
542
- async executeNoneQwenAgent(additionalArgs, log) {
543
- await this.ensureQwenCode(log);
544
- await this.executeCommand('qwen', additionalArgs, { ...process.env }, log);
545
- }
546
- async executeQwenCloudbaseAgent({ provider, model }, additionalArgs, log) {
547
- (0, nodeVersion_1.ensureNodeVersion)('v20.0.0', log);
548
- await this.ensureQwenCode(log);
549
- const _envId = await (0, config_1.createConfigParser)().get('envId');
550
- await (0, auth_1.checkLogin)();
551
- const credential = await (0, utils_1.getCredential)({}, {});
552
- const envId = await (0, env_1.ensureValidEnv)(_envId, log);
553
- const accessToken = await (0, utils_1.rawFetchAccessToken)({
554
- envId,
555
- secretId: credential.secretId,
556
- secretKey: credential.secretKey,
557
- token: credential.token
558
- });
559
- if (!accessToken.access_token) {
560
- log.error((0, i18n_1.t)('获取云开发 Access Token 失败,请运行 tcb login 后再重试,{{token}}', {
561
- token: JSON.stringify(accessToken)
562
- }));
563
- process.exit(1);
564
- }
565
- const baseUrl = `${(0, url_1.getGatewayUrl)(envId)}/v1/ai/${provider}`;
566
- const apiKey = accessToken.access_token;
567
- await this.executeCommand('qwen', additionalArgs, {
568
- ...process.env,
569
- OPENAI_API_KEY: apiKey,
570
- OPENAI_BASE_URL: baseUrl,
571
- OPENAI_MODEL: model
572
- }, log);
573
- }
574
- async executeClaudeCloudbaseAgent({ provider, model, transformer }, additionalArgs, log) {
575
- (0, nodeVersion_1.ensureNodeVersion)('v18.19.0', log);
576
- await this.ensureClaudeCodeRouter(log);
577
- await this.ensureClaudeCode(log);
578
- await this.configureClaudeCodeRouter(provider, model, transformer, log);
579
- await this.restartClaudeCodeRouter(log);
580
- await this.executeCommand('ccr', ['code', ...additionalArgs], { ...process.env }, log);
581
- }
582
- async restartClaudeCodeRouter(log) {
583
- try {
584
- await this.executeCommand('ccr', ['restart'], process.env, log);
585
- }
586
- catch (e) {
587
- log.error((0, i18n_1.t)('执行 ccr restart 失败,尝试执行 ccr stop && ccr start'));
588
- await this.executeCommand('ccr', ['stop'], process.env, log);
589
- this.executeCommand('ccr', ['start'], process.env, log);
590
- const max = 3;
591
- let current = 0;
592
- while (current < max) {
593
- current++;
594
- if (current > max) {
595
- throw new Error((0, i18n_1.t)('ccr 重启完成失败,可前往 {{logPath}} 查看日志', { logPath: const_1.CLAUDE_CODE_ROUTER_LOG_PATH }));
596
- }
597
- log.info((0, i18n_1.t)('{{current}}/{{max}}等待 ccr 重启完成...', { current, max }));
598
- const isRunning = await this.isClaudeCodeRouterRunning();
599
- if (isRunning) {
600
- log.info((0, i18n_1.t)('ccr 重启完成'));
601
- break;
602
- }
603
- }
604
- }
605
- }
606
- async isClaudeCodeRouterRunning() {
607
- return new Promise((resolve) => {
608
- const child = (0, child_process_1.spawn)('ccr', ['status'], {
609
- stdio: 'pipe',
610
- env: process.env,
611
- shell: process.platform === 'win32'
612
- });
613
- child.stdout.on('data', (data) => {
614
- const str = data.toString();
615
- if (str.includes('Status: Running')) {
616
- resolve(true);
617
- child.kill();
618
- }
619
- });
620
- setTimeout(() => {
621
- resolve(false);
622
- child.kill();
623
- }, 3000);
624
- });
625
- }
626
- async configureClaudeCodeRouter(provider, model, transformer, log) {
627
- const fs = await Promise.resolve().then(() => __importStar(require('fs-extra')));
628
- const _envId = await (0, config_1.createConfigParser)().get('envId');
629
- await (0, auth_1.checkLogin)();
630
- const credential = await (0, utils_1.getCredential)({}, {});
631
- const envId = await (0, env_1.ensureValidEnv)(_envId, log);
632
- const accessToken = await (0, utils_1.rawFetchAccessToken)({
633
- envId,
634
- secretId: credential.secretId,
635
- secretKey: credential.secretKey,
636
- token: credential.token
637
- });
638
- if (!accessToken.access_token) {
639
- log.error((0, i18n_1.t)('获取云开发 Access Token 失败,请运行 tcb login 后再重试,{{token}}', {
640
- token: JSON.stringify(accessToken)
641
- }));
642
- process.exit(1);
643
- }
644
- const cloudbaseProvider = {
645
- name: 'cloudbase',
646
- api_base_url: `${(0, url_1.getGatewayUrl)(envId)}/v1/ai/${provider}/chat/completions`,
647
- api_key: accessToken.access_token,
648
- models: [model]
649
- };
650
- if (transformer && transformer.trim().length > 0) {
651
- cloudbaseProvider.transformer = { use: [transformer] };
652
- }
653
- await fs.ensureFile(const_1.CLAUDE_CODE_ROUTER_CONFIG_PATH);
654
- const claudeCodeRouterConfig = await fs.readFile(const_1.CLAUDE_CODE_ROUTER_CONFIG_PATH, 'utf-8');
655
- if (claudeCodeRouterConfig.trim().length === 0) {
656
- log.debug((0, i18n_1.t)('🛠️ claude-code-router 配置为空,写入 Cloudbase 配置...'));
657
- await fs.writeJson(const_1.CLAUDE_CODE_ROUTER_CONFIG_PATH, { Providers: [cloudbaseProvider] });
658
- log.debug((0, i18n_1.t)('✅ claude-code-router 配置完成'));
659
- }
660
- else {
661
- const config = safeParseJson(claudeCodeRouterConfig);
662
- if (!config) {
663
- const { shouldOverwrite } = await inquirer_1.default.prompt([
664
- {
665
- type: 'confirm',
666
- name: 'shouldOverwrite',
667
- message: (0, i18n_1.t)('claude-code-router 配置文件非合法 JSON ,是否覆盖? {{hint}}', { hint: (0, const_1.getBooleanHint)() })
668
- }
669
- ]);
670
- if (shouldOverwrite) {
671
- await fs.writeJson(const_1.CLAUDE_CODE_ROUTER_CONFIG_PATH, {
672
- Providers: [cloudbaseProvider]
673
- }, { spaces: 2 });
674
- log.debug((0, i18n_1.t)('✅ claude-code-router 配置完成'));
675
- }
676
- else {
677
- log.error((0, i18n_1.t)('❌ claude-code-router 配置文件非合法 JSON ,请手动修复'));
678
- process.exit(1);
679
- }
680
- }
681
- if (typeof config !== 'object' || config === null) {
682
- log.error((0, i18n_1.t)('❌ 未知 claude-code-router 配置文件格式请手动修复'));
683
- process.exit(1);
684
- }
685
- if (!('Providers' in config)) {
686
- config.Providers = [cloudbaseProvider];
687
- }
688
- if (!Array.isArray(config.Providers)) {
689
- log.error((0, i18n_1.t)('❌ claude-code-router 配置文件 Providers 字段非数组类型,请手动修复'));
690
- process.exit(1);
691
- }
692
- const providers = config.Providers;
693
- const index = providers.findIndex((p) => typeof p === 'object' && (p === null || p === void 0 ? void 0 : p.name) === 'cloudbase');
694
- if (index !== -1) {
695
- providers[index] = cloudbaseProvider;
696
- }
697
- else {
698
- providers.push(cloudbaseProvider);
699
- }
700
- if (!('Router' in config) ||
701
- typeof config.Router !== 'object' ||
702
- config.Router === null) {
703
- config.Router = {};
704
- }
705
- config.Router.default = `cloudbase,${model}`;
706
- config.Log = true;
707
- await fs.writeJson(const_1.CLAUDE_CODE_ROUTER_CONFIG_PATH, config, { spaces: 2 });
708
- log.debug((0, i18n_1.t)('✅ claude-code-router 配置完成'));
709
- }
710
- }
711
- parseArgs(args) {
712
- return args.filter((arg) => typeof arg === 'string' && arg.trim().length > 0);
713
- }
714
- async ensureClaudeCodeRouter(log) {
715
- const isAvailable = await new Promise((resolve) => {
716
- const child = (0, child_process_1.spawn)('ccr', ['--version'], {
717
- stdio: 'pipe',
718
- shell: true
719
- });
720
- child.stdout.on('data', (data) => {
721
- data.toString().includes('Usage: ccr [command]') && resolve(true);
722
- });
723
- child.on('close', (code) => {
724
- resolve(code === 0);
725
- });
726
- child.on('error', () => {
727
- resolve(false);
728
- });
729
- });
730
- if (isAvailable) {
731
- log.debug((0, i18n_1.t)('claude code router 已安装!'));
732
- }
733
- else {
734
- const { shouldInstall } = await inquirer_1.default.prompt([
735
- {
736
- type: 'confirm',
737
- name: 'shouldInstall',
738
- message: (0, i18n_1.t)('AI 开发缺少 claude code router 依赖,是否安装? {{hint}}', {
739
- hint: (0, const_1.getBooleanHint)(true)
740
- })
741
- }
742
- ]);
743
- if (shouldInstall) {
744
- await this.executeCommand('npm', ['install', '-g', '@musistudio/claude-code-router'], process.env, log);
745
- log.info((0, i18n_1.t)('✅ claude-code-router 安装完成'));
746
- }
747
- else {
748
- log.info((0, i18n_1.t)('❌ claude code router 未安装,请手动安装'));
749
- process.exit(1);
750
- }
751
- }
752
- }
753
- async ensureClaudeCode(log) {
754
- if (await this.isToolAvailable('claude')) {
755
- log.debug((0, i18n_1.t)('claude code 已安装!'));
756
- }
757
- else {
758
- const { shouldInstall } = await inquirer_1.default.prompt([
759
- {
760
- type: 'confirm',
761
- name: 'shouldInstall',
762
- message: (0, i18n_1.t)('AI 开发缺少 claude code 依赖,是否安装? {{hint}}', { hint: (0, const_1.getBooleanHint)(true) })
763
- }
764
- ]);
765
- if (shouldInstall) {
766
- const platform = process.platform;
767
- if (platform === 'win32') {
768
- await this.executeCommand('npm', ['install', '-g', '@anthropic-ai/claude-code'], process.env, log);
769
- }
770
- else {
771
- try {
772
- await this.executeCommand('sh', ['-c', 'curl -fsSL https://claude.ai/install.sh | bash'], process.env, log);
773
- }
774
- catch (error) {
775
- log.warn((0, i18n_1.t)('⚠️ curl 安装失败,尝试使用 npm 安装...'));
776
- try {
777
- await this.executeCommand('npm', ['install', '-g', '@anthropic-ai/claude-code'], process.env, log);
778
- }
779
- catch (npmError) {
780
- log.error((0, i18n_1.t)('❌ claude code 安装失败'));
781
- log.error((0, i18n_1.t)('请手动安装 claude code:'));
782
- log.error((0, i18n_1.t)('📖 安装文档: {{link}}', {
783
- link: (0, output_1.genClickableLink)('https://docs.anthropic.com/en/docs/claude-code/setup')
784
- }));
785
- process.exit(1);
786
- }
787
- }
788
- }
789
- log.info((0, i18n_1.t)('✅ claude code 安装完成'));
790
- }
791
- else {
792
- log.info((0, i18n_1.t)('❌ claude code 未安装,请手动安装'));
793
- log.info((0, i18n_1.t)('📖 安装文档: {{link}}', {
794
- link: (0, output_1.genClickableLink)('https://docs.anthropic.com/en/docs/claude-code/setup')
795
- }));
796
- process.exit(1);
797
- }
798
- }
799
- }
800
- async ensureQwenCode(log) {
801
- if (await this.isToolAvailable('qwen')) {
802
- log.debug((0, i18n_1.t)('qwen code 已安装!'));
803
- }
804
- else {
805
- const { shouldInstall } = await inquirer_1.default.prompt([
806
- {
807
- type: 'confirm',
808
- name: 'shouldInstall',
809
- message: (0, i18n_1.t)('AI 开发缺少 qwen code 依赖,是否安装? {{hint}}', { hint: (0, const_1.getBooleanHint)(true) })
810
- }
811
- ]);
812
- if (shouldInstall) {
813
- await this.executeCommand('npm', ['install', '-g', '@qwen-code/qwen-code'], process.env, log);
814
- log.info((0, i18n_1.t)('✅ qwen code 安装完成'));
815
- }
816
- else {
817
- log.info((0, i18n_1.t)('❌ qwen code 未安装,请手动安装'));
818
- process.exit(1);
819
- }
820
- }
821
- }
822
- async executeCodexAgent({ apiKey, baseUrl, model }, additionalArgs, log) {
823
- await this.ensureCodexCode(log);
824
- const codexArgs = [
825
- ...(model ? ['--config', `model=${model}`] : []),
826
- '--config',
827
- 'model_providers.custom.name=Custom OpenAI',
828
- ...(baseUrl ? ['--config', `model_providers.custom.base_url=${baseUrl}`] : []),
829
- '--config',
830
- 'model_providers.custom.env_key=OPENAI_API_KEY',
831
- '--config',
832
- 'model_provider=custom',
833
- ...additionalArgs
834
- ];
835
- await this.executeCommand('codex', codexArgs, {
836
- ...process.env,
837
- OPENAI_API_KEY: apiKey
838
- }, log);
839
- }
840
- async executeNoneCodexAgent(additionalArgs, log) {
841
- await this.ensureCodexCode(log);
842
- await this.executeCommand('codex', additionalArgs, { ...process.env }, log);
843
- }
844
- async executeCodexCloudbaseAgent({ provider, model }, additionalArgs, log) {
845
- await this.ensureCodexCode(log);
846
- const _envId = await (0, config_1.createConfigParser)().get('envId');
847
- await (0, auth_1.checkLogin)();
848
- const credential = await (0, utils_1.getCredential)({}, {});
849
- const envId = await (0, env_1.ensureValidEnv)(_envId, log);
850
- const accessToken = await (0, utils_1.rawFetchAccessToken)({
851
- envId,
852
- secretId: credential.secretId,
853
- secretKey: credential.secretKey,
854
- token: credential.token
855
- });
856
- if (!accessToken.access_token) {
857
- log.error((0, i18n_1.t)('获取云开发 Access Token 失败,请运行 tcb login 后再重试,{{token}}', {
858
- token: JSON.stringify(accessToken)
859
- }));
860
- process.exit(1);
861
- }
862
- const baseUrl = `${(0, url_1.getGatewayUrl)(envId)}/v1/ai/${provider}`;
863
- const apiKey = accessToken.access_token;
864
- const codexArgs = [
865
- '--config',
866
- `model=${model}`,
867
- '--config',
868
- 'model_providers.cloudbase.name=CloudBase AI',
869
- '--config',
870
- `model_providers.cloudbase.base_url=${baseUrl}`,
871
- '--config',
872
- 'model_providers.cloudbase.env_key=CLOUDBASE_ACCESS_TOKEN',
873
- '--config',
874
- 'model_provider=cloudbase',
875
- ...additionalArgs
876
- ];
877
- await this.executeCommand('codex', codexArgs, {
878
- ...process.env,
879
- CLOUDBASE_ACCESS_TOKEN: apiKey
880
- }, log);
881
- }
882
- async executeNoneCursorAgent(additionalArgs, log) {
883
- await this.ensureCursor(log);
884
- await this.executeCommand('cursor-agent', additionalArgs, { ...process.env }, log);
885
- }
886
- async ensureCursor(log) {
887
- if (await this.isToolAvailable('cursor-agent')) {
888
- log.debug((0, i18n_1.t)('Cursor CLI 已安装!'));
889
- }
890
- else {
891
- const { shouldInstall } = await inquirer_1.default.prompt([
892
- {
893
- type: 'confirm',
894
- name: 'shouldInstall',
895
- message: (0, i18n_1.t)('AI 开发缺少 Cursor CLI 依赖,是否安装? {{hint}}', { hint: (0, const_1.getBooleanHint)(true) })
896
- }
897
- ]);
898
- if (shouldInstall) {
899
- log.info((0, i18n_1.t)('正在安装 Cursor CLI...'));
900
- await this.executeCommand('sh', ['-c', 'curl https://cursor.com/install -fsS | bash'], process.env, log);
901
- log.info((0, i18n_1.t)('✅ Cursor CLI 安装完成'));
902
- }
903
- else {
904
- log.info((0, i18n_1.t)('❌ Cursor CLI 未安装,请手动安装'));
905
- process.exit(1);
906
- }
907
- }
908
- }
909
- async ensureCodexCode(log) {
910
- if (await this.isToolAvailable('codex')) {
911
- log.debug((0, i18n_1.t)('codex 已安装!'));
912
- }
913
- else {
914
- const { shouldInstall } = await inquirer_1.default.prompt([
915
- {
916
- type: 'confirm',
917
- name: 'shouldInstall',
918
- message: (0, i18n_1.t)('AI 开发缺少 codex 依赖,是否安装? {{hint}}', { hint: (0, const_1.getBooleanHint)(true) })
919
- }
920
- ]);
921
- if (shouldInstall) {
922
- await this.executeCommand('npm', ['install', '-g', '@openai/codex'], process.env, log);
923
- log.info((0, i18n_1.t)('✅ codex 安装完成'));
924
- }
925
- else {
926
- log.info((0, i18n_1.t)('❌ codex 未安装,请手动安装'));
927
- process.exit(1);
928
- }
929
- }
930
- }
931
- async executeAiderAgent(config, additionalArgs, log) {
932
- await this.ensureAider(log);
933
- const { apiKey, baseUrl, model } = config;
934
- const aiderArgs = ['--model', `openai/${model}`, ...additionalArgs];
935
- const env = {
936
- ...process.env,
937
- OPENAI_API_KEY: apiKey,
938
- OPENAI_API_BASE: baseUrl
939
- };
940
- await this.executeCommand('aider', aiderArgs, env, log);
941
- }
942
- async executeAiderCloudbaseAgent(config, additionalArgs, log) {
943
- await this.ensureAider(log);
944
- const { provider, model } = config;
945
- const _envId = await (0, config_1.createConfigParser)().get('envId');
946
- await (0, auth_1.checkLogin)();
947
- const credential = await (0, utils_1.getCredential)({}, {});
948
- const envId = await (0, env_1.ensureValidEnv)(_envId, log);
949
- const accessToken = await (0, utils_1.rawFetchAccessToken)({
950
- envId,
951
- secretId: credential.secretId,
952
- secretKey: credential.secretKey,
953
- token: credential.token
954
- });
955
- if (!accessToken.access_token) {
956
- log.error((0, i18n_1.t)('获取云开发 Access Token 失败,请运行 tcb login 后再重试,{{token}}', {
957
- token: JSON.stringify(accessToken)
958
- }));
959
- process.exit(1);
960
- }
961
- const baseUrl = `${(0, url_1.getGatewayUrl)(envId)}/v1/ai/${provider}`;
962
- const apiKey = accessToken.access_token;
963
- const aiderArgs = ['--model', `openai/${model}`, ...additionalArgs];
964
- const env = {
965
- ...process.env,
966
- OPENAI_API_KEY: apiKey,
967
- OPENAI_API_BASE: baseUrl
968
- };
969
- await this.executeCommand('aider', aiderArgs, env, log);
970
- }
971
- async ensureAider(log) {
972
- if (await this.isToolAvailable('aider')) {
973
- log.debug((0, i18n_1.t)('aider 已安装!'));
974
- }
975
- else {
976
- const { shouldInstall } = await inquirer_1.default.prompt([
977
- {
978
- type: 'confirm',
979
- name: 'shouldInstall',
980
- message: (0, i18n_1.t)('AI 开发缺少 aider 依赖,是否安装? {{hint}}', { hint: (0, const_1.getBooleanHint)(true) })
981
- }
982
- ]);
983
- if (shouldInstall) {
984
- log.info((0, i18n_1.t)('正在安装 aider...'));
985
- const platform = process.platform;
986
- if (platform === 'win32') {
987
- await this.executeCommand('powershell', ['-c', 'irm https://aider.chat/install.ps1 | iex'], process.env, log);
988
- }
989
- else {
990
- await this.executeCommand('sh', ['-c', 'curl -LsSf https://aider.chat/install.sh | sh'], process.env, log);
991
- }
992
- log.info((0, i18n_1.t)('✅ aider 安装完成'));
993
- }
994
- else {
995
- log.info((0, i18n_1.t)('❌ aider 未安装,请手动安装'));
996
- process.exit(1);
997
- }
998
- }
999
- }
1000
- async modifyMCPConfigs(extractDir, log) {
1001
- const fs = await Promise.resolve().then(() => __importStar(require('fs-extra')));
1002
- const path = await Promise.resolve().then(() => __importStar(require('path')));
1003
- try {
1004
- log.info((0, i18n_1.t)('🔧 正在修改 MCP 配置文件...'));
1005
- for (const [, files] of Object.entries(IDE_FILE_MAPPINGS)) {
1006
- for (const descriptor of files) {
1007
- if (!descriptor.isMcpConfig)
1008
- continue;
1009
- const filePath = path.join(extractDir, descriptor.path);
1010
- if (await fs.pathExists(filePath)) {
1011
- const format = inferConfigFormat(descriptor.path);
1012
- if (format === 'json') {
1013
- await this.modifyMCPJsonFile(filePath, log);
1014
- }
1015
- else if (format === 'toml') {
1016
- await this.modifyMCPTomlFile(filePath, log);
1017
- }
1018
- }
1019
- }
1020
- }
1021
- log.info((0, i18n_1.t)('✅ MCP 配置文件修改完成'));
1022
- }
1023
- catch (error) {
1024
- log.warn((0, i18n_1.t)('⚠️ MCP 配置文件修改失败: {{error}}', { error: error.message }));
1025
- }
1026
- }
1027
- async modifyMCPJsonFile(filePath, log) {
1028
- const fs = await Promise.resolve().then(() => __importStar(require('fs-extra')));
1029
- try {
1030
- const content = await fs.readFile(filePath, 'utf-8');
1031
- const config = JSON.parse(content);
1032
- let modified = false;
1033
- const modifyCommands = (obj) => {
1034
- if (typeof obj !== 'object' || obj === null) {
1035
- return obj;
1036
- }
1037
- if (Array.isArray(obj)) {
1038
- return obj.map((item) => modifyCommands(item));
1039
- }
1040
- const result = { ...obj };
1041
- if (result.command === 'npx' && Array.isArray(result.args)) {
1042
- const argsStr = result.args.join(' ');
1043
- if (argsStr.includes('npm-global-exec@latest') &&
1044
- argsStr.includes('@cloudbase/cloudbase-mcp@latest')) {
1045
- result.command = 'cloudbase-mcp';
1046
- result.args = [];
1047
- result.env = {
1048
- INTEGRATION_IDE: process.env.INTEGRATION_IDE || 'CloudBaseCLI'
1049
- };
1050
- modified = true;
1051
- log.debug((0, i18n_1.t)('修改配置文件 {{filePath}}: npx -> cloudbase-mcp', { filePath }));
1052
- }
1053
- }
1054
- for (const [key, value] of Object.entries(result)) {
1055
- result[key] = modifyCommands(value);
1056
- }
1057
- return result;
1058
- };
1059
- const modifiedConfig = modifyCommands(config);
1060
- if (modified) {
1061
- await fs.writeJson(filePath, modifiedConfig, { spaces: 2 });
1062
- log.debug((0, i18n_1.t)('✅ 已修改 {{filePath}}', { filePath }));
1063
- }
1064
- }
1065
- catch (error) {
1066
- log.warn((0, i18n_1.t)('⚠️ 修改配置文件 {{filePath}} 失败: {{error}}', { filePath, error: error.message }));
1067
- }
1068
- }
1069
- async modifyMCPTomlFile(filePath, log) {
1070
- const fs = await Promise.resolve().then(() => __importStar(require('fs-extra')));
1071
- const toml = await Promise.resolve().then(() => __importStar(require('toml')));
1072
- try {
1073
- const content = await fs.readFile(filePath, 'utf-8');
1074
- const config = toml.parse(content);
1075
- let modified = false;
1076
- const modifyCommands = (obj) => {
1077
- if (typeof obj !== 'object' || obj === null) {
1078
- return obj;
1079
- }
1080
- if (Array.isArray(obj)) {
1081
- return obj.map((item) => modifyCommands(item));
1082
- }
1083
- const result = { ...obj };
1084
- if (result.command === 'npx' && Array.isArray(result.args)) {
1085
- const argsStr = result.args.join(' ');
1086
- if (argsStr.includes('@cloudbase/cloudbase-mcp@latest')) {
1087
- result.command = 'cloudbase-mcp';
1088
- result.args = [];
1089
- result.env = {
1090
- INTEGRATION_IDE: process.env.INTEGRATION_IDE || 'CloudBaseCLI'
1091
- };
1092
- modified = true;
1093
- log.debug((0, i18n_1.t)('修改配置文件 {{filePath}}: npx -> cloudbase-mcp', { filePath }));
1094
- }
1095
- }
1096
- for (const [key, value] of Object.entries(result)) {
1097
- result[key] = modifyCommands(value);
1098
- }
1099
- return result;
1100
- };
1101
- const modifiedConfig = modifyCommands(config);
1102
- if (modified) {
1103
- const tomlString = this.objectToToml(modifiedConfig);
1104
- await fs.writeFile(filePath, tomlString, 'utf-8');
1105
- log.debug((0, i18n_1.t)('✅ 已修改 {{filePath}}', { filePath }));
1106
- }
1107
- }
1108
- catch (error) {
1109
- log.warn((0, i18n_1.t)('⚠️ 修改配置文件 {{filePath}} 失败: {{error}}', { filePath, error: error.message }));
1110
- }
1111
- }
1112
- async mergeMcpConfig(entry, destPath, format, log) {
1113
- const fs = await Promise.resolve().then(() => __importStar(require('fs-extra')));
1114
- const path = await Promise.resolve().then(() => __importStar(require('path')));
1115
- const incomingStr = (await entry.buffer()).toString('utf8');
1116
- const deepMerge = (target, source) => {
1117
- if (typeof target !== 'object' || typeof source !== 'object' || !target || !source) {
1118
- return target;
1119
- }
1120
- const result = Array.isArray(target) ? [...target] : { ...source, ...target };
1121
- for (const key of Object.keys(source)) {
1122
- if (key in target &&
1123
- typeof target[key] === 'object' &&
1124
- typeof source[key] === 'object') {
1125
- result[key] = deepMerge(target[key], source[key]);
1126
- }
1127
- }
1128
- return result;
1129
- };
1130
- await fs.ensureDir(path.dirname(destPath));
1131
- if (format === 'json') {
1132
- const incomingObj = JSON.parse(incomingStr);
1133
- if (await fs.pathExists(destPath)) {
1134
- const existingObj = await fs.readJson(destPath);
1135
- const merged = deepMerge(existingObj, incomingObj);
1136
- await fs.writeJson(destPath, merged, { spaces: 2 });
1137
- }
1138
- else {
1139
- await fs.writeJson(destPath, incomingObj, { spaces: 2 });
1140
- }
1141
- return;
1142
- }
1143
- const toml = await Promise.resolve().then(() => __importStar(require('toml')));
1144
- const incomingObj = toml.parse(incomingStr);
1145
- if (await fs.pathExists(destPath)) {
1146
- const existingStr = await fs.readFile(destPath, 'utf-8');
1147
- const existingObj = toml.parse(existingStr);
1148
- const merged = deepMerge(existingObj, incomingObj);
1149
- const out = this.objectToToml(merged);
1150
- await fs.writeFile(destPath, out, 'utf-8');
1151
- }
1152
- else {
1153
- const out = this.objectToToml(incomingObj);
1154
- await fs.writeFile(destPath, out, 'utf-8');
1155
- }
1156
- }
1157
- objectToToml(obj, prefix = '') {
1158
- const lines = [];
1159
- for (const [key, value] of Object.entries(obj)) {
1160
- const fullKey = prefix ? `${prefix}.${key}` : key;
1161
- if (typeof value === 'object' && value !== null && !Array.isArray(value)) {
1162
- lines.push(`[${fullKey}]`);
1163
- lines.push(this.objectToToml(value, fullKey));
1164
- }
1165
- else if (Array.isArray(value)) {
1166
- const arrayStr = value
1167
- .map((item) => {
1168
- if (typeof item === 'string') {
1169
- return `"${item}"`;
1170
- }
1171
- return item;
1172
- })
1173
- .join(', ');
1174
- lines.push(`${key} = [${arrayStr}]`);
1175
- }
1176
- else if (typeof value === 'string') {
1177
- lines.push(`${key} = "${value}"`);
1178
- }
1179
- else {
1180
- lines.push(`${key} = ${value}`);
1181
- }
1182
- }
1183
- return lines.join('\n');
1184
- }
1185
- async executeCodebuddyAgent({ apiKey }, additionalArgs, log) {
1186
- await this.ensureCodebuddy(log);
1187
- await this.executeCommand('codebuddy', additionalArgs, {
1188
- ...process.env,
1189
- ...(apiKey && { CODEBUDDY_API_KEY: apiKey })
1190
- }, log);
1191
- }
1192
- async executeNoneCodebuddyAgent(additionalArgs, log) {
1193
- await this.ensureCodebuddy(log);
1194
- await this.executeCommand('codebuddy', additionalArgs, { ...process.env }, log);
1195
- }
1196
- async ensureCodebuddy(log) {
1197
- if (await this.isToolAvailable('codebuddy')) {
1198
- log.debug((0, i18n_1.t)('codebuddy 已安装!'));
1199
- }
1200
- else {
1201
- const { shouldInstall } = await inquirer_1.default.prompt([
1202
- {
1203
- type: 'confirm',
1204
- name: 'shouldInstall',
1205
- message: (0, i18n_1.t)('AI 开发缺少 codebuddy 依赖,是否安装? {{hint}}', { hint: (0, const_1.getBooleanHint)(true) })
1206
- }
1207
- ]);
1208
- if (shouldInstall) {
1209
- await this.executeCommand('npm', ['install', '-g', '@tencent-ai/codebuddy-code'], process.env, log);
1210
- log.info((0, i18n_1.t)('✅ codebuddy 安装完成'));
1211
- }
1212
- else {
1213
- log.info((0, i18n_1.t)('❌ codebuddy 未安装,请手动安装'));
1214
- log.info((0, i18n_1.t)('📦 安装命令: npm install -g @tencent-ai/codebuddy-code'));
1215
- process.exit(1);
1216
- }
1217
- }
1218
- }
1219
- }
1220
- exports.AICommandRouter = AICommandRouter;
1221
- function safeParseJson(json) {
1222
- try {
1223
- return JSON.parse(json);
1224
- }
1225
- catch (_) {
1226
- return null;
1227
- }
1228
- }