pumpkinai-config 1.4.1 → 1.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/claude-api.js +22 -4
- package/claude-ide.js +254 -0
- package/claude-setup.js +22 -4
- package/codex-api.js +19 -1
- package/codex-setup.js +19 -1
- package/package.json +9 -5
- package/claude-fix.js +0 -138
- package/claude-network.js +0 -372
- package/codex-network.js +0 -307
- package/main-config.js +0 -371
package/main-config.js
DELETED
|
@@ -1,371 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* PumpkinAI 一键安装配置工具
|
|
5
|
-
* 整合 Claude Code 和 Codex 的安装配置
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
// 颜色输出
|
|
9
|
-
const colors = {
|
|
10
|
-
red: '\x1b[31m',
|
|
11
|
-
green: '\x1b[32m',
|
|
12
|
-
yellow: '\x1b[33m',
|
|
13
|
-
blue: '\x1b[34m',
|
|
14
|
-
magenta: '\x1b[35m',
|
|
15
|
-
cyan: '\x1b[36m',
|
|
16
|
-
reset: '\x1b[0m',
|
|
17
|
-
dim: '\x1b[2m',
|
|
18
|
-
bright: '\x1b[1m'
|
|
19
|
-
};
|
|
20
|
-
|
|
21
|
-
function log(message, color = 'reset') {
|
|
22
|
-
console.log(`${colors[color]}${message}${colors.reset}`);
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
// 主菜单选项
|
|
26
|
-
const mainMenuOptions = [
|
|
27
|
-
{ name: 'Claude Code', desc: 'Anthropic Claude AI 编程助手' },
|
|
28
|
-
{ name: 'Codex', desc: 'OpenAI Codex 编程助手' },
|
|
29
|
-
{ name: '退出', desc: '' }
|
|
30
|
-
];
|
|
31
|
-
|
|
32
|
-
// Claude Code 子菜单选项
|
|
33
|
-
const claudeSubMenuOptions = [
|
|
34
|
-
{ name: '按请求计费套餐', desc: 'API地址: https://code.ppchat.vip' },
|
|
35
|
-
{ name: '按token计费套餐', desc: 'API地址: https://new.aicode.us.com' },
|
|
36
|
-
{ name: '报错修复', desc: '' }
|
|
37
|
-
];
|
|
38
|
-
|
|
39
|
-
// Codex 子菜单选项
|
|
40
|
-
const codexSubMenuOptions = [
|
|
41
|
-
{ name: '按请求计费套餐', desc: 'API地址: https://code.ppchat.vip/v1' },
|
|
42
|
-
{ name: '按量token计费套餐', desc: 'API地址: https://new.aicode.us.com/v1' },
|
|
43
|
-
{ name: '报错修复', desc: '' }
|
|
44
|
-
];
|
|
45
|
-
|
|
46
|
-
// 报错修复子菜单选项 (Claude)
|
|
47
|
-
const fixSubMenuOptions = [
|
|
48
|
-
{ name: '彻底重新安装', desc: '删除所有配置并重装 Claude Code' },
|
|
49
|
-
{ name: '网络修复', desc: '切换API域名 (主域名/备用域名)' }
|
|
50
|
-
];
|
|
51
|
-
|
|
52
|
-
// 报错修复子菜单选项 (Codex)
|
|
53
|
-
const codexFixSubMenuOptions = [
|
|
54
|
-
{ name: '网络修复', desc: '切换API域名 (主域名/备用域名)' }
|
|
55
|
-
];
|
|
56
|
-
|
|
57
|
-
// 脚本映射
|
|
58
|
-
const scriptMap = {
|
|
59
|
-
'Claude Code': {
|
|
60
|
-
'按请求计费套餐': './claude-setup.js',
|
|
61
|
-
'按量token计费套餐': './claude-api.js'
|
|
62
|
-
},
|
|
63
|
-
'Codex': {
|
|
64
|
-
'按请求计费套餐': './codex-setup.js',
|
|
65
|
-
'按token计费套餐': './codex-api.js'
|
|
66
|
-
}
|
|
67
|
-
};
|
|
68
|
-
|
|
69
|
-
let selectedIndex = 0;
|
|
70
|
-
let currentMenu = 'main'; // 'main', 'claude_sub', 'codex_sub', 'fix_sub', 'codex_fix_sub'
|
|
71
|
-
|
|
72
|
-
// 显示 Logo
|
|
73
|
-
function showLogo() {
|
|
74
|
-
console.log(' \x1b[38;5;208m██████╗ \x1b[38;5;214m██╗ ██╗\x1b[38;5;220m███╗ ███╗\x1b[38;5;226m██████╗ \x1b[38;5;190m██╗ ██╗\x1b[38;5;154m██╗\x1b[38;5;118m███╗ ██╗\x1b[0m');
|
|
75
|
-
console.log(' \x1b[38;5;208m██╔══██╗\x1b[38;5;214m██║ ██║\x1b[38;5;220m████╗ ████║\x1b[38;5;226m██╔══██╗\x1b[38;5;190m██║ ██╔╝\x1b[38;5;154m██║\x1b[38;5;118m████╗ ██║\x1b[0m');
|
|
76
|
-
console.log(' \x1b[38;5;208m██████╔╝\x1b[38;5;214m██║ ██║\x1b[38;5;220m██╔████╔██║\x1b[38;5;226m██████╔╝\x1b[38;5;190m█████╔╝ \x1b[38;5;154m██║\x1b[38;5;118m██╔██╗ ██║\x1b[0m');
|
|
77
|
-
console.log(' \x1b[38;5;208m██╔═══╝ \x1b[38;5;214m██║ ██║\x1b[38;5;220m██║╚██╔╝██║\x1b[38;5;226m██╔═══╝ \x1b[38;5;190m██╔═██╗ \x1b[38;5;154m██║\x1b[38;5;118m██║╚██╗██║\x1b[0m');
|
|
78
|
-
console.log(' \x1b[38;5;208m██║ \x1b[38;5;214m╚██████╔╝\x1b[38;5;220m██║ ╚═╝ ██║\x1b[38;5;226m██║ \x1b[38;5;190m██║ ██╗\x1b[38;5;154m██║\x1b[38;5;118m██║ ╚████║\x1b[0m');
|
|
79
|
-
console.log(' \x1b[38;5;208m╚═╝ \x1b[38;5;214m ╚═════╝ \x1b[38;5;220m╚═╝ ╚═╝\x1b[38;5;226m╚═╝ \x1b[38;5;190m╚═╝ ╚═╝\x1b[38;5;154m╚═╝\x1b[38;5;118m╚═╝ ╚═══╝\x1b[0m');
|
|
80
|
-
log('\n PumpkinAI 一键配置工具', 'magenta');
|
|
81
|
-
log(' ' + '='.repeat(54), 'cyan');
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
// 渲染通用菜单
|
|
85
|
-
function renderGenericMenu(title, options) {
|
|
86
|
-
console.clear();
|
|
87
|
-
log('\n', 'reset');
|
|
88
|
-
showLogo();
|
|
89
|
-
log('', 'reset');
|
|
90
|
-
|
|
91
|
-
log(` ${title}\n`, 'cyan');
|
|
92
|
-
|
|
93
|
-
options.forEach((option, index) => {
|
|
94
|
-
const isSelected = index === selectedIndex;
|
|
95
|
-
const prefix = isSelected ? ' ▶ ' : ' ';
|
|
96
|
-
const nameColor = isSelected ? '\x1b[1m\x1b[33m' : '\x1b[0m';
|
|
97
|
-
const descColor = isSelected ? '\x1b[36m' : '\x1b[2m';
|
|
98
|
-
const numLabel = `${index + 1}. `;
|
|
99
|
-
|
|
100
|
-
console.log(`${prefix}${nameColor}${numLabel}${option.name}\x1b[0m`);
|
|
101
|
-
if (option.desc) {
|
|
102
|
-
console.log(` ${descColor}${option.desc}\x1b[0m`);
|
|
103
|
-
}
|
|
104
|
-
console.log('');
|
|
105
|
-
});
|
|
106
|
-
|
|
107
|
-
log(' ' + '='.repeat(54), 'cyan');
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
// 渲染当前菜单
|
|
111
|
-
function renderMenu() {
|
|
112
|
-
switch (currentMenu) {
|
|
113
|
-
case 'main':
|
|
114
|
-
renderGenericMenu('请选择要配置的工具 (↑↓选择, Enter确认):', mainMenuOptions);
|
|
115
|
-
break;
|
|
116
|
-
case 'claude_sub':
|
|
117
|
-
renderGenericMenu('Claude Code - 请选择购买的套餐 (↑↓选择, Enter确认, ESC返回):', claudeSubMenuOptions);
|
|
118
|
-
break;
|
|
119
|
-
case 'codex_sub':
|
|
120
|
-
renderGenericMenu('Codex - 请选择购买的套餐 (↑↓选择, Enter确认, ESC返回):', codexSubMenuOptions);
|
|
121
|
-
break;
|
|
122
|
-
case 'fix_sub':
|
|
123
|
-
renderGenericMenu('Claude 报错修复 - 请选择操作 (↑↓选择, Enter确认, ESC返回):', fixSubMenuOptions);
|
|
124
|
-
break;
|
|
125
|
-
case 'codex_fix_sub':
|
|
126
|
-
renderGenericMenu('Codex 报错修复 - 请选择操作 (↑↓选择, Enter确认, ESC返回):', codexFixSubMenuOptions);
|
|
127
|
-
break;
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
// 获取当前菜单选项
|
|
132
|
-
function getCurrentOptions() {
|
|
133
|
-
switch (currentMenu) {
|
|
134
|
-
case 'main': return mainMenuOptions;
|
|
135
|
-
case 'claude_sub': return claudeSubMenuOptions;
|
|
136
|
-
case 'codex_sub': return codexSubMenuOptions;
|
|
137
|
-
case 'fix_sub': return fixSubMenuOptions;
|
|
138
|
-
case 'codex_fix_sub': return codexFixSubMenuOptions;
|
|
139
|
-
default: return mainMenuOptions;
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
// 处理主菜单选择
|
|
145
|
-
function handleMainMenuSelection() {
|
|
146
|
-
const selected = mainMenuOptions[selectedIndex];
|
|
147
|
-
|
|
148
|
-
if (selected.name === '退出') {
|
|
149
|
-
console.clear();
|
|
150
|
-
process.exit(0);
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
if (selected.name === 'Claude Code') {
|
|
154
|
-
currentMenu = 'claude_sub';
|
|
155
|
-
} else {
|
|
156
|
-
currentMenu = 'codex_sub';
|
|
157
|
-
}
|
|
158
|
-
selectedIndex = 0;
|
|
159
|
-
renderMenu();
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
// 处理 Claude Code 子菜单选择
|
|
163
|
-
async function handleClaudeSubMenuSelection() {
|
|
164
|
-
const selected = claudeSubMenuOptions[selectedIndex];
|
|
165
|
-
|
|
166
|
-
if (selected.name === '报错修复') {
|
|
167
|
-
currentMenu = 'fix_sub';
|
|
168
|
-
selectedIndex = 0;
|
|
169
|
-
renderMenu();
|
|
170
|
-
return false;
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
// 执行对应脚本
|
|
174
|
-
const scriptPath = scriptMap['Claude Code'][selected.name];
|
|
175
|
-
console.clear();
|
|
176
|
-
log(`\n[启动] 正在运行 Claude Code (${selected.name}) 配置...\n`, 'green');
|
|
177
|
-
|
|
178
|
-
try {
|
|
179
|
-
const script = require(scriptPath);
|
|
180
|
-
await script.main();
|
|
181
|
-
return true;
|
|
182
|
-
} catch (error) {
|
|
183
|
-
log(`\n[错误] ${error.message}`, 'red');
|
|
184
|
-
process.exit(1);
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
// 处理 Codex 子菜单选择
|
|
189
|
-
async function handleCodexSubMenuSelection() {
|
|
190
|
-
const selected = codexSubMenuOptions[selectedIndex];
|
|
191
|
-
|
|
192
|
-
if (selected.name === '报错修复') {
|
|
193
|
-
currentMenu = 'codex_fix_sub';
|
|
194
|
-
selectedIndex = 0;
|
|
195
|
-
renderMenu();
|
|
196
|
-
return false;
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
// 执行对应脚本
|
|
200
|
-
const scriptPath = scriptMap['Codex'][selected.name];
|
|
201
|
-
console.clear();
|
|
202
|
-
log(`\n[启动] 正在运行 Codex (${selected.name}) 配置...\n`, 'green');
|
|
203
|
-
|
|
204
|
-
try {
|
|
205
|
-
const script = require(scriptPath);
|
|
206
|
-
await script.main();
|
|
207
|
-
return true;
|
|
208
|
-
} catch (error) {
|
|
209
|
-
log(`\n[错误] ${error.message}`, 'red');
|
|
210
|
-
process.exit(1);
|
|
211
|
-
}
|
|
212
|
-
}
|
|
213
|
-
|
|
214
|
-
// 处理 Claude 报错修复子菜单选择
|
|
215
|
-
async function handleFixSubMenuSelection() {
|
|
216
|
-
const selected = fixSubMenuOptions[selectedIndex];
|
|
217
|
-
|
|
218
|
-
if (selected.name === '彻底重新安装') {
|
|
219
|
-
// 调用 claude-fix.js 中的修复功能
|
|
220
|
-
const claudeFix = require('./claude-fix.js');
|
|
221
|
-
await claudeFix.main();
|
|
222
|
-
currentMenu = 'claude_sub';
|
|
223
|
-
selectedIndex = 0;
|
|
224
|
-
return false;
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
if (selected.name === '网络修复') {
|
|
228
|
-
// 调用 claude-network.js 中的网络修复功能
|
|
229
|
-
const claudeNetwork = require('./claude-network.js');
|
|
230
|
-
await claudeNetwork.main();
|
|
231
|
-
currentMenu = 'fix_sub';
|
|
232
|
-
selectedIndex = 0;
|
|
233
|
-
return false;
|
|
234
|
-
}
|
|
235
|
-
|
|
236
|
-
return false;
|
|
237
|
-
}
|
|
238
|
-
|
|
239
|
-
// 处理 Codex 报错修复子菜单选择
|
|
240
|
-
async function handleCodexFixSubMenuSelection() {
|
|
241
|
-
const selected = codexFixSubMenuOptions[selectedIndex];
|
|
242
|
-
|
|
243
|
-
if (selected.name === '网络修复') {
|
|
244
|
-
// 调用 codex-network.js 中的网络修复功能
|
|
245
|
-
const codexNetwork = require('./codex-network.js');
|
|
246
|
-
await codexNetwork.main();
|
|
247
|
-
currentMenu = 'codex_fix_sub';
|
|
248
|
-
selectedIndex = 0;
|
|
249
|
-
return false;
|
|
250
|
-
}
|
|
251
|
-
|
|
252
|
-
return false;
|
|
253
|
-
}
|
|
254
|
-
|
|
255
|
-
// 处理子菜单选择
|
|
256
|
-
async function handleSubMenuSelection() {
|
|
257
|
-
switch (currentMenu) {
|
|
258
|
-
case 'claude_sub':
|
|
259
|
-
return await handleClaudeSubMenuSelection();
|
|
260
|
-
case 'codex_sub':
|
|
261
|
-
return await handleCodexSubMenuSelection();
|
|
262
|
-
case 'fix_sub':
|
|
263
|
-
return await handleFixSubMenuSelection();
|
|
264
|
-
case 'codex_fix_sub':
|
|
265
|
-
return await handleCodexFixSubMenuSelection();
|
|
266
|
-
default:
|
|
267
|
-
return false;
|
|
268
|
-
}
|
|
269
|
-
}
|
|
270
|
-
|
|
271
|
-
// 主函数
|
|
272
|
-
async function main() {
|
|
273
|
-
// 启用原始模式以捕获按键
|
|
274
|
-
if (process.stdin.isTTY) {
|
|
275
|
-
process.stdin.setRawMode(true);
|
|
276
|
-
}
|
|
277
|
-
process.stdin.resume();
|
|
278
|
-
process.stdin.setEncoding('utf8');
|
|
279
|
-
|
|
280
|
-
renderMenu();
|
|
281
|
-
|
|
282
|
-
return new Promise((resolve) => {
|
|
283
|
-
const handleKeyPress = async (key) => {
|
|
284
|
-
const options = getCurrentOptions();
|
|
285
|
-
|
|
286
|
-
// Ctrl+C 退出
|
|
287
|
-
if (key === '\u0003') {
|
|
288
|
-
console.clear();
|
|
289
|
-
process.exit(0);
|
|
290
|
-
}
|
|
291
|
-
|
|
292
|
-
// ESC 返回上级菜单
|
|
293
|
-
if (key === '\u001b') {
|
|
294
|
-
if (currentMenu === 'fix_sub') {
|
|
295
|
-
currentMenu = 'claude_sub';
|
|
296
|
-
selectedIndex = 0;
|
|
297
|
-
renderMenu();
|
|
298
|
-
return;
|
|
299
|
-
} else if (currentMenu === 'codex_fix_sub') {
|
|
300
|
-
currentMenu = 'codex_sub';
|
|
301
|
-
selectedIndex = 0;
|
|
302
|
-
renderMenu();
|
|
303
|
-
return;
|
|
304
|
-
} else if (currentMenu === 'claude_sub' || currentMenu === 'codex_sub') {
|
|
305
|
-
currentMenu = 'main';
|
|
306
|
-
selectedIndex = 0;
|
|
307
|
-
renderMenu();
|
|
308
|
-
return;
|
|
309
|
-
}
|
|
310
|
-
}
|
|
311
|
-
|
|
312
|
-
// 上箭头
|
|
313
|
-
if (key === '\u001b[A' || key === 'k') {
|
|
314
|
-
selectedIndex = selectedIndex > 0 ? selectedIndex - 1 : options.length - 1;
|
|
315
|
-
renderMenu();
|
|
316
|
-
}
|
|
317
|
-
|
|
318
|
-
// 下箭头
|
|
319
|
-
if (key === '\u001b[B' || key === 'j') {
|
|
320
|
-
selectedIndex = selectedIndex < options.length - 1 ? selectedIndex + 1 : 0;
|
|
321
|
-
renderMenu();
|
|
322
|
-
}
|
|
323
|
-
|
|
324
|
-
// Enter 确认
|
|
325
|
-
if (key === '\r' || key === '\n') {
|
|
326
|
-
if (currentMenu === 'main') {
|
|
327
|
-
handleMainMenuSelection();
|
|
328
|
-
} else {
|
|
329
|
-
if (process.stdin.isTTY) {
|
|
330
|
-
process.stdin.setRawMode(false);
|
|
331
|
-
}
|
|
332
|
-
process.stdin.removeAllListeners('data');
|
|
333
|
-
const done = await handleSubMenuSelection();
|
|
334
|
-
if (done) {
|
|
335
|
-
resolve();
|
|
336
|
-
} else {
|
|
337
|
-
// 重新启用监听
|
|
338
|
-
if (process.stdin.isTTY) {
|
|
339
|
-
process.stdin.setRawMode(true);
|
|
340
|
-
}
|
|
341
|
-
process.stdin.on('data', handleKeyPress);
|
|
342
|
-
renderMenu();
|
|
343
|
-
}
|
|
344
|
-
}
|
|
345
|
-
}
|
|
346
|
-
|
|
347
|
-
// 数字键快捷选择
|
|
348
|
-
const num = parseInt(key);
|
|
349
|
-
if (num >= 1 && num <= options.length - 1) {
|
|
350
|
-
selectedIndex = num - 1;
|
|
351
|
-
renderMenu();
|
|
352
|
-
}
|
|
353
|
-
if (key === '0') {
|
|
354
|
-
selectedIndex = options.length - 1;
|
|
355
|
-
renderMenu();
|
|
356
|
-
}
|
|
357
|
-
};
|
|
358
|
-
|
|
359
|
-
process.stdin.on('data', handleKeyPress);
|
|
360
|
-
});
|
|
361
|
-
}
|
|
362
|
-
|
|
363
|
-
// 如果直接运行此脚本
|
|
364
|
-
if (require.main === module) {
|
|
365
|
-
main().catch(error => {
|
|
366
|
-
log(`\n[错误] ${error.message}`, 'red');
|
|
367
|
-
process.exit(1);
|
|
368
|
-
});
|
|
369
|
-
}
|
|
370
|
-
|
|
371
|
-
module.exports = { main };
|