ccman 2.1.7 → 3.0.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 (172) hide show
  1. package/README.md +103 -227
  2. package/dist/commands/claudecode/add.d.ts +3 -0
  3. package/dist/commands/claudecode/add.d.ts.map +1 -0
  4. package/dist/commands/claudecode/add.js +129 -0
  5. package/dist/commands/claudecode/add.js.map +1 -0
  6. package/dist/commands/claudecode/clone.d.ts +3 -0
  7. package/dist/commands/claudecode/clone.d.ts.map +1 -0
  8. package/dist/commands/claudecode/clone.js +71 -0
  9. package/dist/commands/claudecode/clone.js.map +1 -0
  10. package/dist/commands/claudecode/current.d.ts +3 -0
  11. package/dist/commands/claudecode/current.d.ts.map +1 -0
  12. package/dist/commands/claudecode/current.js +32 -0
  13. package/dist/commands/claudecode/current.js.map +1 -0
  14. package/dist/commands/claudecode/edit.d.ts +3 -0
  15. package/dist/commands/claudecode/edit.d.ts.map +1 -0
  16. package/dist/commands/claudecode/edit.js +94 -0
  17. package/dist/commands/claudecode/edit.js.map +1 -0
  18. package/dist/commands/claudecode/index.d.ts +6 -0
  19. package/dist/commands/claudecode/index.d.ts.map +1 -0
  20. package/dist/commands/claudecode/index.js +20 -0
  21. package/dist/commands/claudecode/index.js.map +1 -0
  22. package/dist/commands/claudecode/list.d.ts +3 -0
  23. package/dist/commands/claudecode/list.d.ts.map +1 -0
  24. package/dist/commands/claudecode/list.js +45 -0
  25. package/dist/commands/claudecode/list.js.map +1 -0
  26. package/dist/commands/claudecode/remove.d.ts +3 -0
  27. package/dist/commands/claudecode/remove.d.ts.map +1 -0
  28. package/dist/commands/claudecode/remove.js +75 -0
  29. package/dist/commands/claudecode/remove.js.map +1 -0
  30. package/dist/commands/claudecode/use.d.ts +3 -0
  31. package/dist/commands/claudecode/use.d.ts.map +1 -0
  32. package/dist/commands/claudecode/use.js +66 -0
  33. package/dist/commands/claudecode/use.js.map +1 -0
  34. package/dist/commands/codex/add.d.ts +3 -0
  35. package/dist/commands/codex/add.d.ts.map +1 -0
  36. package/dist/commands/codex/add.js +130 -0
  37. package/dist/commands/codex/add.js.map +1 -0
  38. package/dist/commands/codex/clone.d.ts +3 -0
  39. package/dist/commands/codex/clone.d.ts.map +1 -0
  40. package/dist/commands/codex/clone.js +71 -0
  41. package/dist/commands/codex/clone.js.map +1 -0
  42. package/dist/commands/codex/current.d.ts +3 -0
  43. package/dist/commands/codex/current.d.ts.map +1 -0
  44. package/dist/commands/codex/current.js +32 -0
  45. package/dist/commands/codex/current.js.map +1 -0
  46. package/dist/commands/codex/edit.d.ts +3 -0
  47. package/dist/commands/codex/edit.d.ts.map +1 -0
  48. package/dist/commands/codex/edit.js +94 -0
  49. package/dist/commands/codex/edit.js.map +1 -0
  50. package/dist/commands/codex/index.d.ts +6 -0
  51. package/dist/commands/codex/index.d.ts.map +1 -0
  52. package/dist/commands/codex/index.js +20 -0
  53. package/dist/commands/codex/index.js.map +1 -0
  54. package/dist/commands/codex/list.d.ts +3 -0
  55. package/dist/commands/codex/list.d.ts.map +1 -0
  56. package/dist/commands/codex/list.js +45 -0
  57. package/dist/commands/codex/list.js.map +1 -0
  58. package/dist/commands/codex/remove.d.ts +3 -0
  59. package/dist/commands/codex/remove.d.ts.map +1 -0
  60. package/dist/commands/codex/remove.js +75 -0
  61. package/dist/commands/codex/remove.js.map +1 -0
  62. package/dist/commands/codex/use.d.ts +3 -0
  63. package/dist/commands/codex/use.d.ts.map +1 -0
  64. package/dist/commands/codex/use.js +66 -0
  65. package/dist/commands/codex/use.js.map +1 -0
  66. package/dist/index.d.ts +2 -4
  67. package/dist/index.d.ts.map +1 -1
  68. package/dist/index.js +53 -19
  69. package/dist/index.js.map +1 -1
  70. package/dist/interactive.d.ts +36 -0
  71. package/dist/interactive.d.ts.map +1 -0
  72. package/dist/interactive.js +509 -0
  73. package/dist/interactive.js.map +1 -0
  74. package/dist/utils/file-check.d.ts +5 -0
  75. package/dist/utils/file-check.d.ts.map +1 -0
  76. package/dist/utils/file-check.js +14 -0
  77. package/dist/utils/file-check.js.map +1 -0
  78. package/dist/utils/logo.d.ts +2 -0
  79. package/dist/utils/logo.d.ts.map +1 -0
  80. package/dist/utils/logo.js +13 -0
  81. package/dist/utils/logo.js.map +1 -0
  82. package/package.json +28 -61
  83. package/LICENSE +0 -21
  84. package/README_en.md +0 -294
  85. package/dist/cli.d.ts +0 -3
  86. package/dist/cli.d.ts.map +0 -1
  87. package/dist/cli.js +0 -948
  88. package/dist/cli.js.map +0 -1
  89. package/dist/commands/lang.d.ts +0 -3
  90. package/dist/commands/lang.d.ts.map +0 -1
  91. package/dist/commands/lang.js +0 -99
  92. package/dist/commands/lang.js.map +0 -1
  93. package/dist/config/default-providers.d.ts +0 -34
  94. package/dist/config/default-providers.d.ts.map +0 -1
  95. package/dist/config/default-providers.js +0 -96
  96. package/dist/config/default-providers.js.map +0 -1
  97. package/dist/config/static-env.d.ts +0 -14
  98. package/dist/config/static-env.d.ts.map +0 -1
  99. package/dist/config/static-env.js +0 -17
  100. package/dist/config/static-env.js.map +0 -1
  101. package/dist/core/CCMConfigManager.d.ts +0 -64
  102. package/dist/core/CCMConfigManager.d.ts.map +0 -1
  103. package/dist/core/CCMConfigManager.js +0 -267
  104. package/dist/core/CCMConfigManager.js.map +0 -1
  105. package/dist/core/ClaudeConfigManager.d.ts +0 -36
  106. package/dist/core/ClaudeConfigManager.d.ts.map +0 -1
  107. package/dist/core/ClaudeConfigManager.js +0 -158
  108. package/dist/core/ClaudeConfigManager.js.map +0 -1
  109. package/dist/core/EnvironmentManager.d.ts +0 -27
  110. package/dist/core/EnvironmentManager.d.ts.map +0 -1
  111. package/dist/core/EnvironmentManager.js +0 -46
  112. package/dist/core/EnvironmentManager.js.map +0 -1
  113. package/dist/i18n/LanguageManager.d.ts +0 -43
  114. package/dist/i18n/LanguageManager.d.ts.map +0 -1
  115. package/dist/i18n/LanguageManager.js +0 -157
  116. package/dist/i18n/LanguageManager.js.map +0 -1
  117. package/dist/i18n/messages.d.ts +0 -95
  118. package/dist/i18n/messages.d.ts.map +0 -1
  119. package/dist/i18n/messages.js +0 -206
  120. package/dist/i18n/messages.js.map +0 -1
  121. package/dist/providers/ProviderManager.d.ts +0 -63
  122. package/dist/providers/ProviderManager.d.ts.map +0 -1
  123. package/dist/providers/ProviderManager.js +0 -350
  124. package/dist/providers/ProviderManager.js.map +0 -1
  125. package/dist/setup/checker.d.ts +0 -33
  126. package/dist/setup/checker.d.ts.map +0 -1
  127. package/dist/setup/checker.js +0 -169
  128. package/dist/setup/checker.js.map +0 -1
  129. package/dist/setup/installer.d.ts +0 -17
  130. package/dist/setup/installer.d.ts.map +0 -1
  131. package/dist/setup/installer.js +0 -108
  132. package/dist/setup/installer.js.map +0 -1
  133. package/dist/setup/planner.d.ts +0 -22
  134. package/dist/setup/planner.d.ts.map +0 -1
  135. package/dist/setup/planner.js +0 -213
  136. package/dist/setup/planner.js.map +0 -1
  137. package/dist/setup/strategies/base.d.ts +0 -26
  138. package/dist/setup/strategies/base.d.ts.map +0 -1
  139. package/dist/setup/strategies/base.js +0 -32
  140. package/dist/setup/strategies/base.js.map +0 -1
  141. package/dist/setup/strategies/node.d.ts +0 -9
  142. package/dist/setup/strategies/node.d.ts.map +0 -1
  143. package/dist/setup/strategies/node.js +0 -141
  144. package/dist/setup/strategies/node.js.map +0 -1
  145. package/dist/setup/strategies/nvm.d.ts +0 -9
  146. package/dist/setup/strategies/nvm.d.ts.map +0 -1
  147. package/dist/setup/strategies/nvm.js +0 -106
  148. package/dist/setup/strategies/nvm.js.map +0 -1
  149. package/dist/setup/strategies/volta.d.ts +0 -9
  150. package/dist/setup/strategies/volta.d.ts.map +0 -1
  151. package/dist/setup/strategies/volta.js +0 -111
  152. package/dist/setup/strategies/volta.js.map +0 -1
  153. package/dist/setup/types.d.ts +0 -95
  154. package/dist/setup/types.d.ts.map +0 -1
  155. package/dist/setup/types.js +0 -6
  156. package/dist/setup/types.js.map +0 -1
  157. package/dist/types/index.d.ts +0 -95
  158. package/dist/types/index.d.ts.map +0 -1
  159. package/dist/types/index.js +0 -7
  160. package/dist/types/index.js.map +0 -1
  161. package/dist/utils/command.d.ts +0 -33
  162. package/dist/utils/command.d.ts.map +0 -1
  163. package/dist/utils/command.js +0 -73
  164. package/dist/utils/command.js.map +0 -1
  165. package/dist/utils/env-config.d.ts +0 -27
  166. package/dist/utils/env-config.d.ts.map +0 -1
  167. package/dist/utils/env-config.js +0 -83
  168. package/dist/utils/env-config.js.map +0 -1
  169. package/dist/utils/version.d.ts +0 -5
  170. package/dist/utils/version.d.ts.map +0 -1
  171. package/dist/utils/version.js +0 -53
  172. package/dist/utils/version.js.map +0 -1
package/dist/cli.js DELETED
@@ -1,948 +0,0 @@
1
- #!/usr/bin/env node
2
- "use strict";
3
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
- if (k2 === undefined) k2 = k;
5
- var desc = Object.getOwnPropertyDescriptor(m, k);
6
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
- desc = { enumerable: true, get: function() { return m[k]; } };
8
- }
9
- Object.defineProperty(o, k2, desc);
10
- }) : (function(o, m, k, k2) {
11
- if (k2 === undefined) k2 = k;
12
- o[k2] = m[k];
13
- }));
14
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
15
- Object.defineProperty(o, "default", { enumerable: true, value: v });
16
- }) : function(o, v) {
17
- o["default"] = v;
18
- });
19
- var __importStar = (this && this.__importStar) || (function () {
20
- var ownKeys = function(o) {
21
- ownKeys = Object.getOwnPropertyNames || function (o) {
22
- var ar = [];
23
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
24
- return ar;
25
- };
26
- return ownKeys(o);
27
- };
28
- return function (mod) {
29
- if (mod && mod.__esModule) return mod;
30
- var result = {};
31
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
32
- __setModuleDefault(result, mod);
33
- return result;
34
- };
35
- })();
36
- var __importDefault = (this && this.__importDefault) || function (mod) {
37
- return (mod && mod.__esModule) ? mod : { "default": mod };
38
- };
39
- Object.defineProperty(exports, "__esModule", { value: true });
40
- const commander_1 = require("commander");
41
- const chalk_1 = __importDefault(require("chalk"));
42
- const inquirer_1 = __importDefault(require("inquirer"));
43
- const ProviderManager_1 = require("./providers/ProviderManager");
44
- const LanguageManager_1 = require("./i18n/LanguageManager");
45
- const lang_1 = require("./commands/lang");
46
- const version_1 = require("./utils/version");
47
- const default_providers_1 = require("./config/default-providers");
48
- const EnvironmentManager_1 = require("./core/EnvironmentManager");
49
- const program = new commander_1.Command();
50
- const providerManager = new ProviderManager_1.ProviderManager();
51
- const languageManager = new LanguageManager_1.LanguageManager();
52
- // 询问是否继续操作
53
- async function askToContinue() {
54
- const messages = await languageManager.getMessages();
55
- const answer = await inquirer_1.default.prompt([
56
- {
57
- type: 'confirm',
58
- name: 'continue',
59
- message: messages.forms.continueOperation,
60
- default: true
61
- }
62
- ]);
63
- return answer.continue;
64
- }
65
- // 交互式配置菜单
66
- async function showInteractiveMenu() {
67
- // 处理首次运行语言设置
68
- await languageManager.handleFirstRun();
69
- // 获取当前语言的消息
70
- const messages = await languageManager.getMessages();
71
- // 设置 Ctrl+C 优雅退出处理
72
- process.removeAllListeners('SIGINT');
73
- process.on('SIGINT', () => {
74
- console.log(chalk_1.default.yellow(messages.interruptMessage));
75
- process.exit(0);
76
- });
77
- try {
78
- let shouldContinue = true;
79
- while (shouldContinue) {
80
- await providerManager.init();
81
- const providers = await providerManager.listProviders();
82
- if (providers.length === 0) {
83
- console.log(chalk_1.default.yellow(messages.noProvidersFound));
84
- console.log(chalk_1.default.cyan('📝 选择一个预设供应商或手动配置:'));
85
- console.log();
86
- // 显示供应商选择菜单
87
- let providerChoice;
88
- do {
89
- providerChoice = await inquirer_1.default.prompt([
90
- {
91
- type: 'list',
92
- name: 'provider',
93
- message: '选择供应商:',
94
- choices: (0, default_providers_1.createProviderChoices)(),
95
- pageSize: 10
96
- }
97
- ]);
98
- } while (providerChoice.provider === 'separator');
99
- let answers;
100
- if (providerChoice.provider === 'custom') {
101
- // 手动输入
102
- answers = await inquirer_1.default.prompt([
103
- {
104
- type: 'input',
105
- name: 'name',
106
- message: messages.forms.providerName
107
- },
108
- {
109
- type: 'input',
110
- name: 'description',
111
- message: messages.forms.description,
112
- default: ''
113
- },
114
- {
115
- type: 'input',
116
- name: 'baseUrl',
117
- message: messages.forms.baseUrl
118
- },
119
- {
120
- type: 'password',
121
- name: 'apiKey',
122
- message: messages.forms.apiKey,
123
- mask: '*'
124
- }
125
- ]);
126
- }
127
- else {
128
- // 使用预设供应商
129
- const selectedProvider = providerChoice.provider;
130
- console.log(chalk_1.default.green(`已选择:${selectedProvider.name}`));
131
- console.log(`URL: ${chalk_1.default.cyan(selectedProvider.baseUrl)}`);
132
- console.log();
133
- answers = await inquirer_1.default.prompt([
134
- {
135
- type: 'input',
136
- name: 'name',
137
- message: '供应商名称:',
138
- default: selectedProvider.name
139
- },
140
- {
141
- type: 'input',
142
- name: 'description',
143
- message: '描述:',
144
- default: selectedProvider.description
145
- },
146
- {
147
- type: 'input',
148
- name: 'baseUrl',
149
- message: '基础URL:',
150
- default: selectedProvider.baseUrl
151
- },
152
- {
153
- type: 'password',
154
- name: 'apiKey',
155
- message: 'API密钥:',
156
- mask: '*'
157
- }
158
- ]);
159
- }
160
- const result = await providerManager.addProvider({
161
- name: answers.name,
162
- description: answers.description,
163
- baseUrl: answers.baseUrl,
164
- apiKey: answers.apiKey
165
- });
166
- if (result.success) {
167
- console.log(chalk_1.default.green(`✓ ${result.message}`));
168
- // 获取生成的provider ID并自动设为当前供应商
169
- const providerId = result.data?.providerId;
170
- if (providerId) {
171
- const useResult = await providerManager.useProvider(providerId);
172
- if (useResult.success) {
173
- console.log(chalk_1.default.green(`✓ ${useResult.message}`));
174
- }
175
- }
176
- }
177
- else {
178
- console.error(chalk_1.default.red(`✗ ${result.message}`));
179
- }
180
- console.log();
181
- shouldContinue = await askToContinue();
182
- continue;
183
- }
184
- const choices = providers.map(provider => ({
185
- name: `${provider.name} (${provider.id}) - ${provider.baseUrl}${provider.isCurrent ? ' [current]' : ''}`,
186
- value: provider.id
187
- }));
188
- const action = await inquirer_1.default.prompt([
189
- {
190
- type: 'list',
191
- name: 'action',
192
- message: messages.mainMenuTitle,
193
- choices: [
194
- { name: messages.mainMenuOptions.switchProvider, value: 'switch' },
195
- { name: messages.mainMenuOptions.addProvider, value: 'add' },
196
- { name: messages.mainMenuOptions.updateProvider, value: 'update' },
197
- { name: messages.mainMenuOptions.removeProvider, value: 'remove' },
198
- { name: messages.mainMenuOptions.showStatus, value: 'status' },
199
- new inquirer_1.default.Separator(),
200
- { name: messages.mainMenuOptions.doctor, value: 'doctor' },
201
- { name: messages.mainMenuOptions.setup, value: 'setup' },
202
- new inquirer_1.default.Separator(),
203
- { name: messages.mainMenuOptions.exit, value: 'exit' }
204
- ]
205
- }
206
- ]);
207
- if (action.action === 'exit') {
208
- console.log(chalk_1.default.cyan(messages.exitMessage));
209
- break;
210
- }
211
- switch (action.action) {
212
- case 'switch': {
213
- const switchAnswer = await inquirer_1.default.prompt([
214
- {
215
- type: 'list',
216
- name: 'id',
217
- message: 'Select provider:',
218
- choices
219
- }
220
- ]);
221
- const switchResult = await providerManager.useProvider(switchAnswer.id);
222
- if (switchResult.success) {
223
- console.log(chalk_1.default.green(`✓ ${switchResult.message}`));
224
- }
225
- else {
226
- console.error(chalk_1.default.red(`✗ ${switchResult.message}`));
227
- }
228
- console.log();
229
- shouldContinue = await askToContinue();
230
- break;
231
- }
232
- case 'add': {
233
- // 先让用户选择是使用预设供应商还是自定义
234
- let providerTypeAnswer;
235
- do {
236
- providerTypeAnswer = await inquirer_1.default.prompt([
237
- {
238
- type: 'list',
239
- name: 'providerChoice',
240
- message: '请选择供应商类型:',
241
- choices: (0, default_providers_1.createProviderChoices)()
242
- }
243
- ]);
244
- } while (providerTypeAnswer.providerChoice === 'separator');
245
- let addAnswers;
246
- if (providerTypeAnswer.providerChoice === 'custom') {
247
- // 用户选择自定义,手动输入所有信息
248
- addAnswers = await inquirer_1.default.prompt([
249
- { type: 'input', name: 'name', message: 'Provider name:' },
250
- { type: 'input', name: 'description', message: 'Description:' },
251
- { type: 'input', name: 'baseUrl', message: 'Base URL:' },
252
- { type: 'password', name: 'apiKey', message: 'API Key:', mask: '*' }
253
- ]);
254
- }
255
- else {
256
- // 用户选择了预设供应商,使用预设信息
257
- const selectedProvider = providerTypeAnswer.providerChoice;
258
- addAnswers = await inquirer_1.default.prompt([
259
- {
260
- type: 'input',
261
- name: 'name',
262
- message: 'Provider name:',
263
- default: selectedProvider.name
264
- },
265
- {
266
- type: 'input',
267
- name: 'description',
268
- message: 'Description:',
269
- default: selectedProvider.description
270
- },
271
- {
272
- type: 'input',
273
- name: 'baseUrl',
274
- message: 'Base URL:',
275
- default: selectedProvider.baseUrl
276
- },
277
- { type: 'password', name: 'apiKey', message: 'API Key:', mask: '*' }
278
- ]);
279
- }
280
- const addResult = await providerManager.addProvider(addAnswers);
281
- if (addResult.success) {
282
- console.log(chalk_1.default.green(`✓ ${addResult.message}`));
283
- // 获取生成的provider ID并询问是否设为当前供应商
284
- const providerId = addResult.data?.providerId;
285
- if (providerId) {
286
- const useAnswer = await inquirer_1.default.prompt([
287
- {
288
- type: 'confirm',
289
- name: 'useCurrent',
290
- message: `Set "${addAnswers.name}" as current provider?`,
291
- default: true
292
- }
293
- ]);
294
- if (useAnswer.useCurrent) {
295
- const useResult = await providerManager.useProvider(providerId);
296
- if (useResult.success) {
297
- console.log(chalk_1.default.green(`✓ ${useResult.message}`));
298
- }
299
- else {
300
- console.error(chalk_1.default.red(`✗ ${useResult.message}`));
301
- }
302
- }
303
- }
304
- }
305
- else {
306
- console.error(chalk_1.default.red(`✗ ${addResult.message}`));
307
- }
308
- console.log();
309
- shouldContinue = await askToContinue();
310
- break;
311
- }
312
- case 'update': {
313
- const updateIdAnswer = await inquirer_1.default.prompt([
314
- {
315
- type: 'list',
316
- name: 'id',
317
- message: 'Select provider to update:',
318
- choices
319
- }
320
- ]);
321
- const currentProvider = providers.find(p => p.id === updateIdAnswer.id);
322
- if (currentProvider) {
323
- const updateAnswers = await inquirer_1.default.prompt([
324
- { type: 'input', name: 'name', message: 'Provider name:', default: currentProvider.name },
325
- { type: 'input', name: 'description', message: 'Description:', default: currentProvider.description },
326
- { type: 'input', name: 'baseUrl', message: 'Base URL:', default: currentProvider.baseUrl },
327
- { type: 'password', name: 'apiKey', message: 'API Key (leave empty to keep current):', mask: '*' }
328
- ]);
329
- const updateOptions = {
330
- name: updateAnswers.name,
331
- description: updateAnswers.description,
332
- baseUrl: updateAnswers.baseUrl
333
- };
334
- if (updateAnswers.apiKey.trim()) {
335
- updateOptions.apiKey = updateAnswers.apiKey;
336
- }
337
- const updateResult = await providerManager.updateProvider(updateIdAnswer.id, updateOptions);
338
- if (updateResult.success) {
339
- console.log(chalk_1.default.green(`✓ ${updateResult.message}`));
340
- }
341
- else {
342
- console.error(chalk_1.default.red(`✗ ${updateResult.message}`));
343
- }
344
- }
345
- console.log();
346
- shouldContinue = await askToContinue();
347
- break;
348
- }
349
- case 'remove': {
350
- const removeAnswer = await inquirer_1.default.prompt([
351
- {
352
- type: 'list',
353
- name: 'id',
354
- message: 'Select provider to remove:',
355
- choices
356
- }
357
- ]);
358
- const confirmRemove = await inquirer_1.default.prompt([
359
- {
360
- type: 'confirm',
361
- name: 'confirm',
362
- message: `Are you sure you want to remove this provider?`,
363
- default: false
364
- }
365
- ]);
366
- if (confirmRemove.confirm) {
367
- const removeResult = await providerManager.removeProvider(removeAnswer.id);
368
- if (removeResult.success) {
369
- console.log(chalk_1.default.green(`✓ ${removeResult.message}`));
370
- }
371
- else {
372
- console.error(chalk_1.default.red(`✗ ${removeResult.message}`));
373
- }
374
- }
375
- else {
376
- console.log(chalk_1.default.yellow('Operation cancelled'));
377
- }
378
- console.log();
379
- shouldContinue = await askToContinue();
380
- break;
381
- }
382
- case 'status': {
383
- const stats = await providerManager.getStats();
384
- console.log();
385
- console.log(chalk_1.default.blue('CCM Status:'));
386
- console.log(`Total providers: ${stats.totalProviders}`);
387
- console.log(`Current provider: ${stats.currentProvider || 'None'}`);
388
- console.log(`Claude config: ${stats.claudeConfigPath}`);
389
- console.log(`CCM config: ${stats.ccmConfigPath}`);
390
- if (providers.length > 0) {
391
- console.log();
392
- console.log(chalk_1.default.blue('Recent providers:'));
393
- providers
394
- .filter(p => p.lastUsed)
395
- .slice(0, 3)
396
- .forEach(provider => {
397
- const marker = provider.isCurrent ? chalk_1.default.green('* ') : ' ';
398
- const name = provider.isCurrent ? chalk_1.default.green(provider.name) : provider.name;
399
- const lastUsed = new Date(provider.lastUsed).toLocaleDateString();
400
- console.log(`${marker}${name} (${lastUsed}, ${provider.usageCount} uses)`);
401
- });
402
- }
403
- console.log();
404
- console.log();
405
- shouldContinue = await askToContinue();
406
- break;
407
- }
408
- case 'doctor': {
409
- const envManager = new EnvironmentManager_1.EnvironmentManager();
410
- const checkResult = await envManager.checkEnvironment();
411
- console.log();
412
- console.log(chalk_1.default.blue(`🔍 ${messages.environment.checkTitle}`));
413
- console.log();
414
- // Claude Code 状态
415
- if (checkResult.claudeCode.installed) {
416
- console.log(chalk_1.default.green(`${messages.environment.claudeCode}: ✓ ${messages.environment.installed}`));
417
- if (checkResult.claudeCode.version) {
418
- console.log(` ${messages.environment.version}: ${checkResult.claudeCode.version}`);
419
- }
420
- if (checkResult.claudeCode.path) {
421
- console.log(` ${messages.environment.path}: ${checkResult.claudeCode.path}`);
422
- }
423
- }
424
- else {
425
- console.log(chalk_1.default.red(`${messages.environment.claudeCode}: ✗ ${messages.environment.notInstalled}`));
426
- }
427
- console.log();
428
- // Node.js 状态
429
- if (checkResult.node.installed) {
430
- const versionStatus = checkResult.node.versionValid ? chalk_1.default.green('✓') : chalk_1.default.yellow('⚠️');
431
- console.log(`${chalk_1.default.green(messages.environment.nodeJs + ':')} ${versionStatus} ${messages.environment.installed}`);
432
- console.log(` ${messages.environment.version}: ${checkResult.node.version}`);
433
- console.log(` ${messages.environment.required}: ${checkResult.requirements.nodeVersion}`);
434
- if (checkResult.node.path) {
435
- console.log(` ${messages.environment.path}: ${checkResult.node.path}`);
436
- }
437
- }
438
- else {
439
- console.log(chalk_1.default.red(`${messages.environment.nodeJs}: ✗ ${messages.environment.notInstalled}`));
440
- }
441
- console.log();
442
- // npm 状态
443
- if (checkResult.npm.installed) {
444
- console.log(chalk_1.default.green(`${messages.environment.npm}: ✓ ${messages.environment.installed}`));
445
- if (checkResult.npm.version) {
446
- console.log(` ${messages.environment.version}: ${checkResult.npm.version}`);
447
- }
448
- if (checkResult.npm.path) {
449
- console.log(` ${messages.environment.path}: ${checkResult.npm.path}`);
450
- }
451
- }
452
- else {
453
- console.log(chalk_1.default.yellow(`${messages.environment.npm}: ✗ ${messages.environment.notInstalled}`));
454
- }
455
- console.log();
456
- // 版本管理器
457
- const managers = [];
458
- if (checkResult.versionManagers.volta)
459
- managers.push('volta');
460
- if (checkResult.versionManagers.nvm)
461
- managers.push('nvm');
462
- if (managers.length > 0) {
463
- console.log(chalk_1.default.blue(`${messages.environment.versionManagers}:`));
464
- managers.forEach(m => console.log(` ✓ ${m}`));
465
- console.log();
466
- }
467
- // 问题列表
468
- if (checkResult.issues.length > 0) {
469
- console.log(chalk_1.default.yellow(`⚠️ ${messages.environment.issues}:`));
470
- checkResult.issues.forEach(issue => console.log(` - ${issue}`));
471
- console.log();
472
- }
473
- // 建议
474
- if (checkResult.suggestions.length > 0) {
475
- console.log(chalk_1.default.cyan(`💡 ${messages.environment.suggestions}:`));
476
- checkResult.suggestions.forEach(suggestion => console.log(` - ${suggestion}`));
477
- console.log();
478
- }
479
- // 总体状态
480
- if (checkResult.status === 'ready') {
481
- console.log(chalk_1.default.green(`✅ ${messages.environment.ready}`));
482
- }
483
- else if (checkResult.status === 'warning') {
484
- console.log(chalk_1.default.yellow(`⚠️ ${messages.environment.hasWarnings}`));
485
- }
486
- else {
487
- console.log(chalk_1.default.red(`❌ ${messages.environment.notReady}`));
488
- }
489
- console.log();
490
- console.log();
491
- shouldContinue = await askToContinue();
492
- break;
493
- }
494
- case 'setup': {
495
- const envManager = new EnvironmentManager_1.EnvironmentManager();
496
- console.log(chalk_1.default.blue(`🔍 ${messages.environment.checkingEnvironment}`));
497
- const checkResult = await envManager.checkEnvironment();
498
- console.log();
499
- console.log(`${messages.environment.environmentStatus}:`);
500
- console.log(` ${messages.environment.claudeCode}: ${checkResult.claudeCode.installed ? '✓' : '✗'}`);
501
- console.log(` ${messages.environment.nodeJs}: ${checkResult.node.installed && checkResult.node.versionValid ? '✓' : '✗'}`);
502
- console.log();
503
- if (checkResult.status === 'ready') {
504
- console.log(chalk_1.default.green(`✅ ${messages.environment.ready}!`));
505
- console.log(messages.environment.noSetupNeeded);
506
- }
507
- else {
508
- const plan = await envManager.generateInstallPlan(checkResult);
509
- if (plan.needsNode) {
510
- console.log(chalk_1.default.yellow(`⚠️ ${messages.environment.nodeJs} ${messages.environment.needsInstallOrUpgrade}`));
511
- console.log();
512
- console.log(`${messages.environment.availableOptions}:`);
513
- console.log();
514
- const optionChoices = plan.nodeOptions.map((opt, idx) => ({
515
- name: `${idx + 1}. ${opt.name}${opt.reason ? ` (${opt.reason})` : ''}`,
516
- value: idx,
517
- short: opt.name
518
- }));
519
- const optionAnswer = await inquirer_1.default.prompt([
520
- {
521
- type: 'list',
522
- name: 'option',
523
- message: messages.environment.selectMethod + ':',
524
- choices: optionChoices
525
- }
526
- ]);
527
- const selectedOption = plan.nodeOptions[optionAnswer.option];
528
- console.log();
529
- console.log(chalk_1.default.cyan(`${messages.environment.selected}: ${selectedOption.name}`));
530
- if (selectedOption.description) {
531
- console.log(chalk_1.default.gray(` ${selectedOption.description}`));
532
- }
533
- console.log();
534
- console.log(chalk_1.default.blue(`${messages.environment.installSteps}:`));
535
- selectedOption.steps.forEach((step, idx) => {
536
- console.log(` ${idx + 1}. ${step.description}`);
537
- console.log(chalk_1.default.gray(` $ ${step.command}`));
538
- });
539
- console.log();
540
- const confirmAnswer = await inquirer_1.default.prompt([
541
- {
542
- type: 'confirm',
543
- name: 'confirm',
544
- message: messages.environment.proceedInstall,
545
- default: true
546
- }
547
- ]);
548
- if (confirmAnswer.confirm) {
549
- const { Installer } = await Promise.resolve().then(() => __importStar(require('./setup/installer')));
550
- const installer = new Installer({ dryRun: true });
551
- await installer.executeSteps(selectedOption.steps);
552
- }
553
- else {
554
- console.log(chalk_1.default.yellow(messages.environment.installCancelled));
555
- }
556
- }
557
- if (plan.needsClaudeCode) {
558
- console.log();
559
- console.log(chalk_1.default.yellow(`⚠️ ${messages.environment.claudeCode} ${messages.environment.needsInstallOrUpgrade}`));
560
- console.log();
561
- console.log(chalk_1.default.blue(`${messages.environment.installSteps}:`));
562
- plan.claudeCodeSteps.forEach((step, idx) => {
563
- console.log(` ${idx + 1}. ${step.description}`);
564
- console.log(chalk_1.default.gray(` $ ${step.command}`));
565
- });
566
- console.log();
567
- const confirmAnswer = await inquirer_1.default.prompt([
568
- {
569
- type: 'confirm',
570
- name: 'confirm',
571
- message: messages.environment.proceedInstall,
572
- default: true
573
- }
574
- ]);
575
- if (confirmAnswer.confirm) {
576
- const { Installer } = await Promise.resolve().then(() => __importStar(require('./setup/installer')));
577
- const installer = new Installer({ dryRun: true });
578
- await installer.executeSteps(plan.claudeCodeSteps);
579
- }
580
- else {
581
- console.log(chalk_1.default.yellow(messages.environment.installCancelled));
582
- }
583
- }
584
- }
585
- console.log();
586
- shouldContinue = await askToContinue();
587
- break;
588
- }
589
- }
590
- } // while 循环结束
591
- }
592
- catch (error) {
593
- console.error(chalk_1.default.red(`✗ Error: ${error}`));
594
- process.exit(1);
595
- }
596
- finally {
597
- // 恢复原始的 SIGINT 处理器
598
- process.removeAllListeners('SIGINT');
599
- }
600
- }
601
- program
602
- .name('ccman')
603
- .description('Claude Code Manager - Manage Claude API configurations')
604
- .version((0, version_1.getPackageVersion)())
605
- .hook('preAction', () => {
606
- // 开发模式提示
607
- if (process.env.CCM_CONFIG_DIR || process.env.CLAUDE_CONFIG_PATH) {
608
- console.log(chalk_1.default.yellow('🔧 Development Mode:'));
609
- if (process.env.CCM_CONFIG_DIR) {
610
- console.log(chalk_1.default.yellow(` CCM Config: ${process.env.CCM_CONFIG_DIR}`));
611
- }
612
- if (process.env.CLAUDE_CONFIG_PATH) {
613
- console.log(chalk_1.default.yellow(` Claude Config: ${process.env.CLAUDE_CONFIG_PATH}`));
614
- }
615
- console.log();
616
- }
617
- })
618
- .action(async () => {
619
- // 默认无参数时进入交互菜单
620
- await showInteractiveMenu();
621
- });
622
- // 智能列表命令
623
- program
624
- .command('ls')
625
- .alias('list')
626
- .description('List provider configurations')
627
- .option('--current', 'Show only current provider details')
628
- .option('--brief', 'Show brief summary')
629
- .action(async (options) => {
630
- try {
631
- await providerManager.init();
632
- if (options?.current) {
633
- // 显示当前供应商详情
634
- const currentProvider = await providerManager.getCurrentProvider();
635
- if (!currentProvider) {
636
- console.log(chalk_1.default.yellow('No provider is currently active.'));
637
- console.log('Use "ccman use <id>" to activate a provider.');
638
- return;
639
- }
640
- console.log();
641
- console.log(chalk_1.default.green(`Current provider: ${currentProvider.config.name} (${currentProvider.id})`));
642
- console.log(`Description: ${currentProvider.config.description}`);
643
- console.log(`Base URL: ${currentProvider.config.config.env.ANTHROPIC_BASE_URL}`);
644
- console.log(`API Key: ${'*'.repeat(Math.min(currentProvider.config.config.env.ANTHROPIC_AUTH_TOKEN.length, 20))}`);
645
- console.log(`Usage count: ${currentProvider.config.metadata.usageCount} times`);
646
- console.log(`Last updated: ${new Date(currentProvider.config.metadata.updatedAt).toLocaleString()}`);
647
- console.log();
648
- return;
649
- }
650
- const providers = await providerManager.listProviders();
651
- const stats = await providerManager.getStats();
652
- // 显示状态和配置信息,不管是否有providers
653
- console.log();
654
- console.log(chalk_1.default.blue('CCM Status:'));
655
- console.log(`Total providers: ${stats.totalProviders}`);
656
- console.log(`Current provider: ${stats.currentProvider || 'None'}`);
657
- console.log(`Environment: ${stats.environment}`);
658
- console.log();
659
- console.log(chalk_1.default.blue('Configuration Files:'));
660
- console.log(`Claude config: ${chalk_1.default.cyan(stats.claudeConfigPath)}`);
661
- console.log(`CCM config: ${chalk_1.default.cyan(stats.ccmConfigFile)}`);
662
- console.log(`Providers dir: ${chalk_1.default.cyan(stats.providersDir)}`);
663
- console.log();
664
- if (providers.length === 0) {
665
- console.log(chalk_1.default.yellow('No provider configurations found. Use "ccman add" to create one.'));
666
- return;
667
- }
668
- if (options?.brief) {
669
- // 简洁模式
670
- providers.forEach(provider => {
671
- const marker = provider.isCurrent ? chalk_1.default.green('* ') : ' ';
672
- const name = provider.isCurrent ? chalk_1.default.green(provider.name) : provider.name;
673
- console.log(`${marker}${name} (${provider.id})`);
674
- });
675
- console.log();
676
- return;
677
- }
678
- // 详细显示providers信息
679
- console.log(chalk_1.default.blue('Providers:'));
680
- providers.forEach(provider => {
681
- const marker = provider.isCurrent ? chalk_1.default.green('* ') : ' ';
682
- const name = provider.isCurrent ? chalk_1.default.green(provider.name) : provider.name;
683
- console.log(`${marker}${name.padEnd(15)} ${provider.baseUrl}`);
684
- console.log(`${' '.repeat(17)} ${provider.description}`);
685
- if (provider.lastUsed) {
686
- const lastUsed = new Date(provider.lastUsed).toLocaleDateString();
687
- console.log(`${' '.repeat(17)} Last used: ${lastUsed}, Usage: ${provider.usageCount} times`);
688
- }
689
- console.log();
690
- });
691
- }
692
- catch (error) {
693
- console.error(chalk_1.default.red(`✗ Error: ${error}`));
694
- process.exit(1);
695
- }
696
- });
697
- // 添加供应商
698
- program
699
- .command('add-interactive')
700
- .alias('addi')
701
- .description('Add a new provider configuration interactively (with preset options)')
702
- .action(async () => {
703
- try {
704
- await providerManager.init();
705
- // 让用户选择预设供应商或自定义
706
- let providerTypeAnswer;
707
- do {
708
- providerTypeAnswer = await inquirer_1.default.prompt([
709
- {
710
- type: 'list',
711
- name: 'providerChoice',
712
- message: '请选择供应商类型:',
713
- choices: (0, default_providers_1.createProviderChoices)()
714
- }
715
- ]);
716
- } while (providerTypeAnswer.providerChoice === 'separator');
717
- let addAnswers;
718
- if (providerTypeAnswer.providerChoice === 'custom') {
719
- // 用户选择自定义,手动输入所有信息
720
- addAnswers = await inquirer_1.default.prompt([
721
- { type: 'input', name: 'name', message: 'Provider name:' },
722
- { type: 'input', name: 'description', message: 'Description:' },
723
- { type: 'input', name: 'baseUrl', message: 'Base URL:' },
724
- { type: 'password', name: 'apiKey', message: 'API Key:', mask: '*' }
725
- ]);
726
- }
727
- else {
728
- // 用户选择了预设供应商,使用预设信息
729
- const selectedProvider = providerTypeAnswer.providerChoice;
730
- addAnswers = await inquirer_1.default.prompt([
731
- {
732
- type: 'input',
733
- name: 'name',
734
- message: 'Provider name:',
735
- default: selectedProvider.name
736
- },
737
- {
738
- type: 'input',
739
- name: 'description',
740
- message: 'Description:',
741
- default: selectedProvider.description
742
- },
743
- {
744
- type: 'input',
745
- name: 'baseUrl',
746
- message: 'Base URL:',
747
- default: selectedProvider.baseUrl
748
- },
749
- { type: 'password', name: 'apiKey', message: 'API Key:', mask: '*' }
750
- ]);
751
- }
752
- const result = await providerManager.addProvider(addAnswers);
753
- if (result.success) {
754
- console.log(chalk_1.default.green(`✓ ${result.message}`));
755
- // 获取生成的provider ID
756
- const providerId = result.data?.providerId;
757
- // 询问是否设为当前供应商
758
- const currentProvider = await providerManager.getCurrentProvider();
759
- if (!currentProvider || currentProvider.config.name !== addAnswers.name) {
760
- const useAnswer = await inquirer_1.default.prompt([
761
- {
762
- type: 'confirm',
763
- name: 'useCurrent',
764
- message: `Set "${addAnswers.name}" as current provider?`,
765
- default: true
766
- }
767
- ]);
768
- if (useAnswer.useCurrent && providerId) {
769
- const useResult = await providerManager.useProvider(providerId);
770
- if (useResult.success) {
771
- console.log(chalk_1.default.green(`✓ ${useResult.message}`));
772
- }
773
- }
774
- }
775
- }
776
- else {
777
- console.error(chalk_1.default.red(`✗ ${result.message}`));
778
- }
779
- }
780
- catch (error) {
781
- console.error(chalk_1.default.red('Error adding provider:'), error instanceof Error ? error.message : error);
782
- process.exit(1);
783
- }
784
- });
785
- // 命令行添加供应商
786
- program
787
- .command('add <name> <baseUrl> [apiKey]')
788
- .description('Add a new provider configuration (command line mode)')
789
- .option('-d, --description <desc>', 'Provider description (defaults to provider name)')
790
- .action(async (name, baseUrl, apiKey, options) => {
791
- try {
792
- await providerManager.init();
793
- if (!apiKey) {
794
- const answer = await inquirer_1.default.prompt([
795
- {
796
- type: 'password',
797
- name: 'apiKey',
798
- message: 'Enter API Key:',
799
- mask: '*'
800
- }
801
- ]);
802
- apiKey = answer.apiKey;
803
- }
804
- const addOptions = {
805
- name,
806
- description: options?.description,
807
- baseUrl,
808
- apiKey: apiKey
809
- };
810
- const result = await providerManager.addProvider(addOptions);
811
- if (result.success) {
812
- console.log(chalk_1.default.green(`✓ ${result.message}`));
813
- // 获取生成的provider ID
814
- const providerId = result.data?.providerId;
815
- // 询问是否设为当前供应商
816
- const currentProvider = await providerManager.getCurrentProvider();
817
- if (!currentProvider || currentProvider.config.name !== name) {
818
- const useAnswer = await inquirer_1.default.prompt([
819
- {
820
- type: 'confirm',
821
- name: 'useCurrent',
822
- message: `Set "${name}" as current provider?`,
823
- default: true
824
- }
825
- ]);
826
- if (useAnswer.useCurrent && providerId) {
827
- const useResult = await providerManager.useProvider(providerId);
828
- if (useResult.success) {
829
- console.log(chalk_1.default.green(`✓ ${useResult.message}`));
830
- }
831
- else {
832
- console.error(chalk_1.default.red(`✗ ${useResult.message}`));
833
- }
834
- }
835
- }
836
- }
837
- else {
838
- console.error(chalk_1.default.red(`✗ ${result.message}`));
839
- process.exit(1);
840
- }
841
- }
842
- catch (error) {
843
- console.error(chalk_1.default.red(`✗ Error: ${error}`));
844
- process.exit(1);
845
- }
846
- });
847
- // 使用供应商
848
- program
849
- .command('use <id>')
850
- .description('Switch to a provider configuration')
851
- .action(async (id) => {
852
- try {
853
- await providerManager.init();
854
- const result = await providerManager.useProvider(id);
855
- if (result.success) {
856
- console.log(chalk_1.default.green(`✓ ${result.message}`));
857
- console.log(chalk_1.default.cyan('Claude Code configuration has been updated successfully!'));
858
- }
859
- else {
860
- console.error(chalk_1.default.red(`✗ ${result.message}`));
861
- process.exit(1);
862
- }
863
- }
864
- catch (error) {
865
- console.error(chalk_1.default.red(`✗ Error: ${error}`));
866
- process.exit(1);
867
- }
868
- });
869
- // 删除供应商
870
- program
871
- .command('rm <id>')
872
- .alias('remove')
873
- .description('Remove a provider configuration')
874
- .action(async (id) => {
875
- try {
876
- await providerManager.init();
877
- const providers = await providerManager.listProviders();
878
- const provider = providers.find(p => p.id === id);
879
- if (!provider) {
880
- console.error(chalk_1.default.red(`✗ Provider '${id}' not found`));
881
- process.exit(1);
882
- }
883
- const answer = await inquirer_1.default.prompt([
884
- {
885
- type: 'confirm',
886
- name: 'confirm',
887
- message: `Are you sure you want to remove provider "${provider.name}" (${id})?`,
888
- default: false
889
- }
890
- ]);
891
- if (answer.confirm) {
892
- const result = await providerManager.removeProvider(id);
893
- if (result.success) {
894
- console.log(chalk_1.default.green(`✓ ${result.message}`));
895
- }
896
- else {
897
- console.error(chalk_1.default.red(`✗ ${result.message}`));
898
- }
899
- }
900
- else {
901
- console.log(chalk_1.default.yellow('Operation cancelled'));
902
- }
903
- }
904
- catch (error) {
905
- console.error(chalk_1.default.red(`✗ Error: ${error}`));
906
- process.exit(1);
907
- }
908
- });
909
- // 清除所有配置
910
- program
911
- .command('clear')
912
- .alias('reset')
913
- .description('Clear all provider configurations (DESTRUCTIVE)')
914
- .action(async () => {
915
- try {
916
- const confirmAnswer = await inquirer_1.default.prompt([
917
- {
918
- type: 'confirm',
919
- name: 'confirmed',
920
- message: chalk_1.default.red('⚠️ This will remove ALL provider configurations. Are you sure?'),
921
- default: false
922
- }
923
- ]);
924
- if (!confirmAnswer.confirmed) {
925
- console.log(chalk_1.default.yellow('Operation cancelled.'));
926
- return;
927
- }
928
- await providerManager.init();
929
- const result = await providerManager.clearAll();
930
- if (result.success) {
931
- console.log(chalk_1.default.green(`✓ ${result.message}`));
932
- console.log(chalk_1.default.cyan('CCM has been reset to initial state.'));
933
- console.log(chalk_1.default.cyan('You can start fresh with: ccman'));
934
- }
935
- else {
936
- console.error(chalk_1.default.red(`✗ ${result.message}`));
937
- }
938
- }
939
- catch (error) {
940
- console.error(chalk_1.default.red(`✗ Error: ${error}`));
941
- process.exit(1);
942
- }
943
- });
944
- // 添加语言管理命令
945
- program.addCommand((0, lang_1.createLanguageCommands)());
946
- // 解析命令行参数
947
- program.parse(process.argv);
948
- //# sourceMappingURL=cli.js.map