@delta1035/ccs-cli 1.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 (47) hide show
  1. package/README.md +174 -0
  2. package/USAGE.md +110 -0
  3. package/dist/commands/configCommands.d.ts +3 -0
  4. package/dist/commands/configCommands.d.ts.map +1 -0
  5. package/dist/commands/configCommands.js +149 -0
  6. package/dist/commands/configCommands.js.map +1 -0
  7. package/dist/commands/mcpCommands.d.ts +3 -0
  8. package/dist/commands/mcpCommands.d.ts.map +1 -0
  9. package/dist/commands/mcpCommands.js +129 -0
  10. package/dist/commands/mcpCommands.js.map +1 -0
  11. package/dist/commands/presetCommands.d.ts +3 -0
  12. package/dist/commands/presetCommands.d.ts.map +1 -0
  13. package/dist/commands/presetCommands.js +64 -0
  14. package/dist/commands/presetCommands.js.map +1 -0
  15. package/dist/commands/presets.d.ts +25 -0
  16. package/dist/commands/presets.d.ts.map +1 -0
  17. package/dist/commands/presets.js +88 -0
  18. package/dist/commands/presets.js.map +1 -0
  19. package/dist/commands/providerCommands.d.ts +3 -0
  20. package/dist/commands/providerCommands.d.ts.map +1 -0
  21. package/dist/commands/providerCommands.js +247 -0
  22. package/dist/commands/providerCommands.js.map +1 -0
  23. package/dist/commands/sessionCommands.d.ts +3 -0
  24. package/dist/commands/sessionCommands.d.ts.map +1 -0
  25. package/dist/commands/sessionCommands.js +146 -0
  26. package/dist/commands/sessionCommands.js.map +1 -0
  27. package/dist/commands/usageCommands.d.ts +3 -0
  28. package/dist/commands/usageCommands.d.ts.map +1 -0
  29. package/dist/commands/usageCommands.js +71 -0
  30. package/dist/commands/usageCommands.js.map +1 -0
  31. package/dist/core/providerService.d.ts +13 -0
  32. package/dist/core/providerService.d.ts.map +1 -0
  33. package/dist/core/providerService.js +180 -0
  34. package/dist/core/providerService.js.map +1 -0
  35. package/dist/database/db.d.ts +31 -0
  36. package/dist/database/db.d.ts.map +1 -0
  37. package/dist/database/db.js +126 -0
  38. package/dist/database/db.js.map +1 -0
  39. package/dist/index.d.ts +3 -0
  40. package/dist/index.d.ts.map +1 -0
  41. package/dist/index.js +51 -0
  42. package/dist/index.js.map +1 -0
  43. package/dist/types/index.d.ts +74 -0
  44. package/dist/types/index.d.ts.map +1 -0
  45. package/dist/types/index.js +4 -0
  46. package/dist/types/index.js.map +1 -0
  47. package/package.json +63 -0
package/README.md ADDED
@@ -0,0 +1,174 @@
1
+ # CCS CLI
2
+
3
+ 🤖 AI CLI Tool Manager - Switch between Claude, Codex, Gemini, and more
4
+
5
+ [![npm version](https://badge.fury.io/js/%40delta1035%2Fccs-cli.svg)](https://badge.fury.io/js/%40delta1035%2Fccs-cli)
6
+ [![License: ISC](https://img.shields.io/badge/License-ISC-blue.svg)](https://opensource.org/licenses/ISC)
7
+
8
+ ## ✨ Features
9
+
10
+ - **Multi-Provider Support**: Manage Claude Code, Codex, Gemini CLI, OpenCode, OpenClaw
11
+ - **One-Click Switching**: Instantly switch between different AI providers
12
+ - **50+ Provider Presets**: AWS Bedrock, NVIDIA NIM, OpenRouter, and more
13
+ - **Unified Configuration**: Manage MCP, Prompts, and Skills across all apps
14
+ - **Usage Tracking**: Monitor API calls and costs
15
+ - **Session Management**: Browse and restore conversation history
16
+
17
+ ## 🚀 Installation
18
+
19
+ ```bash
20
+ # Install globally via npm
21
+ npm install -g @delta1035/ccs-cli
22
+
23
+ # Or using yarn
24
+ yarn global add @delta1035/ccs-cli
25
+ ```
26
+
27
+ ## 📖 Usage
28
+
29
+ ### Basic Commands
30
+
31
+ ```bash
32
+ # Show help
33
+ ccs --help
34
+
35
+ # Show version
36
+ ccs --version
37
+ ```
38
+
39
+ ### Provider Management
40
+
41
+ ```bash
42
+ # List all providers
43
+ ccs provider list
44
+
45
+ # Add a new provider
46
+ ccs provider add
47
+
48
+ # Switch to a provider (by number, name, or ID)
49
+ ccs provider switch 1
50
+ ccs provider switch claude
51
+ ccs provider switch bd065723
52
+
53
+ # Remove a provider
54
+ ccs provider remove 1
55
+
56
+ # Show current provider
57
+ ccs provider current
58
+ ```
59
+
60
+ ### Preset Management
61
+
62
+ ```bash
63
+ # List available presets
64
+ ccs preset list
65
+
66
+ # Import a preset
67
+ ccs preset import
68
+ ```
69
+
70
+ ### Configuration Management
71
+
72
+ ```bash
73
+ # Show config directory
74
+ ccs config dir
75
+
76
+ # Export configuration
77
+ ccs config export
78
+
79
+ # Import configuration
80
+ ccs config import
81
+
82
+ # Reset configuration
83
+ ccs config reset
84
+ ```
85
+
86
+ ### Session Management
87
+
88
+ ```bash
89
+ # List sessions
90
+ ccs session list
91
+
92
+ # View session details
93
+ ccs session view
94
+
95
+ # Delete a session
96
+ ccs session delete
97
+
98
+ # Clear all sessions
99
+ ccs session clear
100
+ ```
101
+
102
+ ### MCP Configuration
103
+
104
+ ```bash
105
+ # List MCP configurations
106
+ ccs mcp list
107
+
108
+ # Add MCP configuration
109
+ ccs mcp add
110
+
111
+ # Remove MCP configuration
112
+ ccs mcp remove
113
+ ```
114
+
115
+ ### Usage Statistics
116
+
117
+ ```bash
118
+ # View usage statistics
119
+ ccs usage stats
120
+
121
+ # Show total cost
122
+ ccs usage cost
123
+
124
+ # Reset usage statistics
125
+ ccs usage reset
126
+ ```
127
+
128
+ ## 📁 Configuration Files
129
+
130
+ Configuration files are stored in `~/.cc-switch/`:
131
+
132
+ - `data.json` - Main data file
133
+ - `configs/` - AI tool configuration files
134
+ - `backups/` - Configuration backups
135
+
136
+ ## 🔧 Development
137
+
138
+ ```bash
139
+ # Clone the repository
140
+ git clone https://github.com/delta1035/cc-switch-cli.git
141
+ cd cc-switch-cli
142
+
143
+ # Install dependencies
144
+ npm install
145
+
146
+ # Build the project
147
+ npm run build
148
+
149
+ # Run in development mode
150
+ npm run dev
151
+
152
+ # Test the CLI
153
+ node dist/index.js --help
154
+ ```
155
+
156
+ ## 🤝 Contributing
157
+
158
+ Contributions are welcome! Please feel free to submit a Pull Request.
159
+
160
+ 1. Fork the repository
161
+ 2. Create your feature branch (`git checkout -b feature/amazing-feature`)
162
+ 3. Commit your changes (`git commit -m 'Add some amazing feature'`)
163
+ 4. Push to the branch (`git push origin feature/amazing-feature`)
164
+ 5. Open a Pull Request
165
+
166
+ ## 📝 License
167
+
168
+ ISC © [delta1035](https://github.com/delta1035)
169
+
170
+ ## 🙏 Acknowledgments
171
+
172
+ - Based on [farion1231/cc-switch](https://github.com/farion1231/cc-switch)
173
+ - Built with [Commander.js](https://github.com/tj/commander.js)
174
+ - Interactive prompts by [Inquirer.js](https://github.com/SBoudrias/Inquirer.js)
package/USAGE.md ADDED
@@ -0,0 +1,110 @@
1
+ # CC Switch CLI 使用说明
2
+
3
+ ## 切换提供商
4
+
5
+ 现在支持四种方式切换提供商:
6
+
7
+ ### 1. 通过序号切换(推荐)
8
+ ```bash
9
+ # 切换到第 1 个提供商
10
+ ccs provider switch 1
11
+
12
+ # 切换到第 4 个提供商
13
+ ccs provider switch 4
14
+ ```
15
+
16
+ ### 2. 通过名称切换
17
+ ```bash
18
+ # 通过完整名称
19
+ ccs provider switch "Claude Official"
20
+
21
+ # 通过部分名称(不区分大小写)
22
+ ccs provider switch claude
23
+ ccs provider switch xiaomi
24
+ ```
25
+
26
+ ### 3. 通过 ID 前缀切换(推荐)
27
+ ```bash
28
+ # 使用显示的 ID 前缀(前 8 个字符)
29
+ ccs provider switch bd065723
30
+ ccs provider switch 6df92add
31
+ ```
32
+
33
+ ### 4. 通过完整 ID 切换
34
+ ```bash
35
+ # 通过完整 UUID
36
+ ccs provider switch bd065723-4e5f-4a8b-9c1d-1234567890ab
37
+ ```
38
+
39
+ ### 4. 交互式选择
40
+ ```bash
41
+ # 不带参数,会显示选择列表
42
+ ccs provider switch
43
+ ```
44
+
45
+ ## 删除提供商
46
+
47
+ 同样支持三种方式:
48
+
49
+ ### 1. 通过序号删除
50
+ ```bash
51
+ ccs provider remove 2
52
+ ```
53
+
54
+ ### 2. 通过名称删除
55
+ ```bash
56
+ ccs provider remove "Codex Official"
57
+ ```
58
+
59
+ ### 3. 交互式选择
60
+ ```bash
61
+ ccs provider remove
62
+ ```
63
+
64
+ ## 查看提供商列表
65
+
66
+ ```bash
67
+ ccs provider list
68
+ ```
69
+
70
+ 输出示例:
71
+ ```
72
+ 📋 Available Providers:
73
+
74
+ 1. ✓ Claude Official (claude)
75
+ 2. ○ Codex Official (codex)
76
+ 3. ○ Gemini Official (gemini)
77
+ 4. ○ xiaomi (claude)
78
+ ```
79
+
80
+ - `✓` 表示当前启用的提供商
81
+ - `○` 表示未启用的提供商
82
+
83
+ ## 查看当前提供商
84
+
85
+ ```bash
86
+ ccs provider current
87
+ ```
88
+
89
+ 输出示例:
90
+ ```
91
+ 🎯 Current Provider:
92
+
93
+ Name: Claude Official
94
+ Type: claude
95
+ API Endpoint: https://api.anthropic.com/v1
96
+ Model: claude-3-5-sonnet-20241022
97
+ ```
98
+
99
+ ## 常见问题
100
+
101
+ ### Q: 为什么切换时显示 "Provider not found"?
102
+ A: 请先运行 `ccs provider list` 查看可用的提供商和它们的序号。
103
+
104
+ ### Q: 如何添加新的提供商?
105
+ A: 运行 `ccs provider add` 或 `ccs preset import`。
106
+
107
+ ### Q: 配置文件在哪里?
108
+ A: 配置文件存储在 `~/.ccs/` 目录下:
109
+ - `data.json` - 主数据文件
110
+ - `configs/` - 各 AI 工具的配置文件
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerConfigCommands(program: Command): void;
3
+ //# sourceMappingURL=configCommands.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"configCommands.d.ts","sourceRoot":"","sources":["../../src/commands/configCommands.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAuJ7D"}
@@ -0,0 +1,149 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.registerConfigCommands = registerConfigCommands;
7
+ const inquirer_1 = __importDefault(require("inquirer"));
8
+ const ora_1 = __importDefault(require("ora"));
9
+ const chalk_1 = __importDefault(require("chalk"));
10
+ const fs_1 = __importDefault(require("fs"));
11
+ const path_1 = __importDefault(require("path"));
12
+ const os_1 = __importDefault(require("os"));
13
+ function registerConfigCommands(program) {
14
+ const configCmd = program
15
+ .command('config')
16
+ .description('Manage configuration');
17
+ // 显示配置目录
18
+ configCmd
19
+ .command('dir')
20
+ .description('Show configuration directory')
21
+ .action(() => {
22
+ const homeDir = os_1.default.homedir();
23
+ const configDir = path_1.default.join(homeDir, '.cc-switch');
24
+ console.log(chalk_1.default.cyan(`Configuration directory: ${configDir}`));
25
+ });
26
+ // 导出配置
27
+ configCmd
28
+ .command('export')
29
+ .description('Export configuration to file')
30
+ .argument('[file]', 'Output file path')
31
+ .action(async (file) => {
32
+ const homeDir = os_1.default.homedir();
33
+ const configDir = path_1.default.join(homeDir, '.cc-switch');
34
+ if (!file) {
35
+ const answers = await inquirer_1.default.prompt([
36
+ {
37
+ type: 'input',
38
+ name: 'file',
39
+ message: 'Output file path:',
40
+ default: path_1.default.join(process.cwd(), 'cc-switch-config.json')
41
+ }
42
+ ]);
43
+ file = answers.file;
44
+ }
45
+ const spinner = (0, ora_1.default)('Exporting configuration...').start();
46
+ try {
47
+ // 收集所有配置文件
48
+ const configs = {};
49
+ const configFiles = [
50
+ 'cc-switch.db',
51
+ 'settings.json',
52
+ 'configs/claude-config.json',
53
+ 'configs/codex-config.json',
54
+ 'configs/gemini-config.json'
55
+ ];
56
+ for (const configFile of configFiles) {
57
+ const filePath = path_1.default.join(configDir, configFile);
58
+ if (fs_1.default.existsSync(filePath)) {
59
+ const content = fs_1.default.readFileSync(filePath, 'utf-8');
60
+ configs[configFile] = JSON.parse(content);
61
+ }
62
+ }
63
+ // 写入导出文件
64
+ fs_1.default.writeFileSync(file, JSON.stringify(configs, null, 2), 'utf-8');
65
+ spinner.succeed(`Configuration exported to: ${chalk_1.default.cyan(file)}`);
66
+ }
67
+ catch (error) {
68
+ spinner.fail(`Failed to export configuration: ${error}`);
69
+ }
70
+ });
71
+ // 导入配置
72
+ configCmd
73
+ .command('import')
74
+ .description('Import configuration from file')
75
+ .argument('[file]', 'Input file path')
76
+ .action(async (file) => {
77
+ if (!file) {
78
+ const answers = await inquirer_1.default.prompt([
79
+ {
80
+ type: 'input',
81
+ name: 'file',
82
+ message: 'Input file path:'
83
+ }
84
+ ]);
85
+ file = answers.file;
86
+ }
87
+ if (!fs_1.default.existsSync(file)) {
88
+ console.log(chalk_1.default.red(`File not found: ${file}`));
89
+ return;
90
+ }
91
+ const spinner = (0, ora_1.default)('Importing configuration...').start();
92
+ try {
93
+ const content = fs_1.default.readFileSync(file, 'utf-8');
94
+ const configs = JSON.parse(content);
95
+ const homeDir = os_1.default.homedir();
96
+ const configDir = path_1.default.join(homeDir, '.cc-switch');
97
+ // 确保配置目录存在
98
+ if (!fs_1.default.existsSync(configDir)) {
99
+ fs_1.default.mkdirSync(configDir, { recursive: true });
100
+ }
101
+ // 写入配置文件
102
+ for (const [configFile, data] of Object.entries(configs)) {
103
+ const filePath = path_1.default.join(configDir, configFile);
104
+ const dir = path_1.default.dirname(filePath);
105
+ if (!fs_1.default.existsSync(dir)) {
106
+ fs_1.default.mkdirSync(dir, { recursive: true });
107
+ }
108
+ fs_1.default.writeFileSync(filePath, JSON.stringify(data, null, 2), 'utf-8');
109
+ }
110
+ spinner.succeed('Configuration imported successfully');
111
+ }
112
+ catch (error) {
113
+ spinner.fail(`Failed to import configuration: ${error}`);
114
+ }
115
+ });
116
+ // 重置配置
117
+ configCmd
118
+ .command('reset')
119
+ .description('Reset configuration to defaults')
120
+ .action(async () => {
121
+ const confirm = await inquirer_1.default.prompt([
122
+ {
123
+ type: 'confirm',
124
+ name: 'confirm',
125
+ message: 'Are you sure you want to reset all configuration?',
126
+ default: false
127
+ }
128
+ ]);
129
+ if (!confirm.confirm) {
130
+ return;
131
+ }
132
+ const spinner = (0, ora_1.default)('Resetting configuration...').start();
133
+ try {
134
+ const homeDir = os_1.default.homedir();
135
+ const configDir = path_1.default.join(homeDir, '.cc-switch');
136
+ // 删除配置目录
137
+ if (fs_1.default.existsSync(configDir)) {
138
+ fs_1.default.rmSync(configDir, { recursive: true, force: true });
139
+ }
140
+ // 重新初始化
141
+ fs_1.default.mkdirSync(configDir, { recursive: true });
142
+ spinner.succeed('Configuration reset to defaults');
143
+ }
144
+ catch (error) {
145
+ spinner.fail(`Failed to reset configuration: ${error}`);
146
+ }
147
+ });
148
+ }
149
+ //# sourceMappingURL=configCommands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"configCommands.js","sourceRoot":"","sources":["../../src/commands/configCommands.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerMcpCommands(program: Command): void;
3
+ //# sourceMappingURL=mcpCommands.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcpCommands.d.ts","sourceRoot":"","sources":["../../src/commands/mcpCommands.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA8H1D"}
@@ -0,0 +1,129 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.registerMcpCommands = registerMcpCommands;
7
+ const inquirer_1 = __importDefault(require("inquirer"));
8
+ const ora_1 = __importDefault(require("ora"));
9
+ const chalk_1 = __importDefault(require("chalk"));
10
+ const db_1 = __importDefault(require("../database/db"));
11
+ const uuid_1 = require("uuid");
12
+ function registerMcpCommands(program) {
13
+ const mcpCmd = program
14
+ .command('mcp')
15
+ .description('Manage MCP (Model Context Protocol) configurations');
16
+ // 列出 MCP 配置
17
+ mcpCmd
18
+ .command('list')
19
+ .description('List all MCP configurations')
20
+ .action(() => {
21
+ const configs = db_1.default.getMcpConfigs();
22
+ if (configs.length === 0) {
23
+ console.log(chalk_1.default.yellow('No MCP configurations found'));
24
+ return;
25
+ }
26
+ console.log(chalk_1.default.bold('\n🔧 MCP Configurations:\n'));
27
+ configs.forEach((config, index) => {
28
+ console.log(` ${index + 1}. ${chalk_1.default.cyan(config.name)}`);
29
+ console.log(` Command: ${chalk_1.default.gray(config.command)}`);
30
+ if (config.args && config.args.length > 0) {
31
+ console.log(` Args: ${chalk_1.default.gray(config.args.join(', '))}`);
32
+ }
33
+ });
34
+ console.log('');
35
+ });
36
+ // 添加 MCP 配置
37
+ mcpCmd
38
+ .command('add')
39
+ .description('Add a new MCP configuration')
40
+ .action(async () => {
41
+ const answers = await inquirer_1.default.prompt([
42
+ {
43
+ type: 'input',
44
+ name: 'name',
45
+ message: 'MCP name:',
46
+ validate: (input) => input.length > 0 ? true : 'Name is required'
47
+ },
48
+ {
49
+ type: 'input',
50
+ name: 'command',
51
+ message: 'Command:',
52
+ validate: (input) => input.length > 0 ? true : 'Command is required'
53
+ },
54
+ {
55
+ type: 'input',
56
+ name: 'args',
57
+ message: 'Arguments (comma-separated):'
58
+ },
59
+ {
60
+ type: 'input',
61
+ name: 'env',
62
+ message: 'Environment variables (KEY=VALUE, comma-separated):'
63
+ }
64
+ ]);
65
+ const args = answers.args ? answers.args.split(',').map((a) => a.trim()) : [];
66
+ const env = {};
67
+ if (answers.env) {
68
+ answers.env.split(',').forEach((e) => {
69
+ const [key, value] = e.trim().split('=');
70
+ if (key && value) {
71
+ env[key] = value;
72
+ }
73
+ });
74
+ }
75
+ const spinner = (0, ora_1.default)('Adding MCP configuration...').start();
76
+ try {
77
+ const id = (0, uuid_1.v4)();
78
+ db_1.default.addMcpConfig({
79
+ id,
80
+ name: answers.name,
81
+ command: answers.command,
82
+ args,
83
+ env,
84
+ createdAt: new Date().toISOString()
85
+ });
86
+ spinner.succeed(`MCP configuration "${answers.name}" added successfully`);
87
+ }
88
+ catch (error) {
89
+ spinner.fail(`Failed to add MCP configuration: ${error}`);
90
+ }
91
+ });
92
+ // 删除 MCP 配置
93
+ mcpCmd
94
+ .command('remove')
95
+ .description('Remove an MCP configuration')
96
+ .argument('[name]', 'MCP name')
97
+ .action(async (name) => {
98
+ const configs = db_1.default.getMcpConfigs();
99
+ if (configs.length === 0) {
100
+ console.log(chalk_1.default.yellow('No MCP configurations found'));
101
+ return;
102
+ }
103
+ let configName = name;
104
+ if (!configName) {
105
+ const answers = await inquirer_1.default.prompt([
106
+ {
107
+ type: 'list',
108
+ name: 'config',
109
+ message: 'Select MCP configuration to remove:',
110
+ choices: configs.map(c => ({ name: c.name, value: c.name }))
111
+ }
112
+ ]);
113
+ configName = answers.config;
114
+ }
115
+ const confirm = await inquirer_1.default.prompt([
116
+ {
117
+ type: 'confirm',
118
+ name: 'confirm',
119
+ message: `Remove MCP configuration "${configName}"?`,
120
+ default: false
121
+ }
122
+ ]);
123
+ if (confirm.confirm && configName) {
124
+ db_1.default.deleteMcpConfig(configName);
125
+ console.log(chalk_1.default.green(`✓ MCP configuration "${configName}" removed`));
126
+ }
127
+ });
128
+ }
129
+ //# sourceMappingURL=mcpCommands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcpCommands.js","sourceRoot":"","sources":["../../src/commands/mcpCommands.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerPresetCommands(program: Command): void;
3
+ //# sourceMappingURL=presetCommands.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"presetCommands.d.ts","sourceRoot":"","sources":["../../src/commands/presetCommands.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAwD7D"}
@@ -0,0 +1,64 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.registerPresetCommands = registerPresetCommands;
7
+ const inquirer_1 = __importDefault(require("inquirer"));
8
+ const ora_1 = __importDefault(require("ora"));
9
+ const chalk_1 = __importDefault(require("chalk"));
10
+ const presets_1 = require("./presets");
11
+ function registerPresetCommands(program) {
12
+ const presetCmd = program
13
+ .command('preset')
14
+ .description('Manage provider presets');
15
+ // 列出预设
16
+ presetCmd
17
+ .command('list')
18
+ .description('List all provider presets')
19
+ .action(() => {
20
+ (0, presets_1.listPresets)();
21
+ });
22
+ // 导入预设
23
+ presetCmd
24
+ .command('import')
25
+ .description('Import a provider preset')
26
+ .argument('[name]', 'Preset name')
27
+ .action(async (name) => {
28
+ if (!name) {
29
+ const answers = await inquirer_1.default.prompt([
30
+ {
31
+ type: 'list',
32
+ name: 'preset',
33
+ message: 'Select preset to import:',
34
+ choices: presets_1.providerPresets.map(p => ({
35
+ name: `${p.name} (${p.type})`,
36
+ value: p.name
37
+ }))
38
+ }
39
+ ]);
40
+ name = answers.preset;
41
+ }
42
+ const preset = presets_1.providerPresets.find(p => p.name === name);
43
+ if (!preset) {
44
+ console.log(chalk_1.default.red(`Preset "${name}" not found`));
45
+ return;
46
+ }
47
+ const answers = await inquirer_1.default.prompt([
48
+ {
49
+ type: 'input',
50
+ name: 'apiKey',
51
+ message: 'API Key (optional):'
52
+ }
53
+ ]);
54
+ const spinner = (0, ora_1.default)('Importing preset...').start();
55
+ try {
56
+ (0, presets_1.importPreset)(name, answers.apiKey || undefined);
57
+ spinner.succeed(`Preset "${name}" imported successfully`);
58
+ }
59
+ catch (error) {
60
+ spinner.fail(`Failed to import preset: ${error}`);
61
+ }
62
+ });
63
+ }
64
+ //# sourceMappingURL=presetCommands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"presetCommands.js","sourceRoot":"","sources":["../../src/commands/presetCommands.ts"],"names":[],"mappings":";;;;;AAMA,wDAwDC;AA7DD,wDAAgC;AAChC,8CAAsB;AACtB,kDAA0B;AAC1B,uCAAuE;AAEvE,SAAgB,sBAAsB,CAAC,OAAgB;IACrD,MAAM,SAAS,GAAG,OAAO;SACtB,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,yBAAyB,CAAC,CAAC;IAE1C,OAAO;IACP,SAAS;SACN,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,2BAA2B,CAAC;SACxC,MAAM,CAAC,GAAG,EAAE;QACX,IAAA,qBAAW,GAAE,CAAC;IAChB,CAAC,CAAC,CAAC;IAEL,OAAO;IACP,SAAS;SACN,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,0BAA0B,CAAC;SACvC,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC;SACjC,MAAM,CAAC,KAAK,EAAE,IAAa,EAAE,EAAE;QAC9B,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,OAAO,GAAG,MAAM,kBAAQ,CAAC,MAAM,CAAC;gBACpC;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,QAAQ;oBACd,OAAO,EAAE,0BAA0B;oBACnC,OAAO,EAAE,yBAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;wBACjC,IAAI,EAAE,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,GAAG;wBAC7B,KAAK,EAAE,CAAC,CAAC,IAAI;qBACd,CAAC,CAAC;iBACJ;aACF,CAAC,CAAC;YACH,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC;QACxB,CAAC;QAED,MAAM,MAAM,GAAG,yBAAe,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;QAC1D,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,WAAW,IAAI,aAAa,CAAC,CAAC,CAAC;YACrD,OAAO;QACT,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,kBAAQ,CAAC,MAAM,CAAC;YACpC;gBACE,IAAI,EAAE,OAAO;gBACb,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,qBAAqB;aAC/B;SACF,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,IAAA,aAAG,EAAC,qBAAqB,CAAC,CAAC,KAAK,EAAE,CAAC;QACnD,IAAI,CAAC;YACH,IAAA,sBAAY,EAAC,IAAK,EAAE,OAAO,CAAC,MAAM,IAAI,SAAS,CAAC,CAAC;YACjD,OAAO,CAAC,OAAO,CAAC,WAAW,IAAI,yBAAyB,CAAC,CAAC;QAC5D,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CAAC,4BAA4B,KAAK,EAAE,CAAC,CAAC;QACpD,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}