@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.
- package/README.md +174 -0
- package/USAGE.md +110 -0
- package/dist/commands/configCommands.d.ts +3 -0
- package/dist/commands/configCommands.d.ts.map +1 -0
- package/dist/commands/configCommands.js +149 -0
- package/dist/commands/configCommands.js.map +1 -0
- package/dist/commands/mcpCommands.d.ts +3 -0
- package/dist/commands/mcpCommands.d.ts.map +1 -0
- package/dist/commands/mcpCommands.js +129 -0
- package/dist/commands/mcpCommands.js.map +1 -0
- package/dist/commands/presetCommands.d.ts +3 -0
- package/dist/commands/presetCommands.d.ts.map +1 -0
- package/dist/commands/presetCommands.js +64 -0
- package/dist/commands/presetCommands.js.map +1 -0
- package/dist/commands/presets.d.ts +25 -0
- package/dist/commands/presets.d.ts.map +1 -0
- package/dist/commands/presets.js +88 -0
- package/dist/commands/presets.js.map +1 -0
- package/dist/commands/providerCommands.d.ts +3 -0
- package/dist/commands/providerCommands.d.ts.map +1 -0
- package/dist/commands/providerCommands.js +247 -0
- package/dist/commands/providerCommands.js.map +1 -0
- package/dist/commands/sessionCommands.d.ts +3 -0
- package/dist/commands/sessionCommands.d.ts.map +1 -0
- package/dist/commands/sessionCommands.js +146 -0
- package/dist/commands/sessionCommands.js.map +1 -0
- package/dist/commands/usageCommands.d.ts +3 -0
- package/dist/commands/usageCommands.d.ts.map +1 -0
- package/dist/commands/usageCommands.js +71 -0
- package/dist/commands/usageCommands.js.map +1 -0
- package/dist/core/providerService.d.ts +13 -0
- package/dist/core/providerService.d.ts.map +1 -0
- package/dist/core/providerService.js +180 -0
- package/dist/core/providerService.js.map +1 -0
- package/dist/database/db.d.ts +31 -0
- package/dist/database/db.d.ts.map +1 -0
- package/dist/database/db.js +126 -0
- package/dist/database/db.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +51 -0
- package/dist/index.js.map +1 -0
- package/dist/types/index.d.ts +74 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +4 -0
- package/dist/types/index.js.map +1 -0
- 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
|
+
[](https://badge.fury.io/js/%40delta1035%2Fccs-cli)
|
|
6
|
+
[](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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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"}
|