@acip/cli 1.5.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 +368 -0
- package/bin/acip.js +3 -0
- package/dist/commands/call.d.ts +3 -0
- package/dist/commands/call.d.ts.map +1 -0
- package/dist/commands/call.js +65 -0
- package/dist/commands/call.js.map +1 -0
- package/dist/commands/config.d.ts +3 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +144 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/deploy.d.ts +3 -0
- package/dist/commands/deploy.d.ts.map +1 -0
- package/dist/commands/deploy.js +280 -0
- package/dist/commands/deploy.js.map +1 -0
- package/dist/commands/dev.d.ts +3 -0
- package/dist/commands/dev.d.ts.map +1 -0
- package/dist/commands/dev.js +218 -0
- package/dist/commands/dev.js.map +1 -0
- package/dist/commands/doctor.d.ts +3 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +289 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/init.d.ts +3 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +80 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/inspect.d.ts +3 -0
- package/dist/commands/inspect.d.ts.map +1 -0
- package/dist/commands/inspect.js +69 -0
- package/dist/commands/inspect.js.map +1 -0
- package/dist/commands/list.d.ts +3 -0
- package/dist/commands/list.d.ts.map +1 -0
- package/dist/commands/list.js +118 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/monitor.d.ts +3 -0
- package/dist/commands/monitor.d.ts.map +1 -0
- package/dist/commands/monitor.js +51 -0
- package/dist/commands/monitor.js.map +1 -0
- package/dist/commands/new.d.ts +3 -0
- package/dist/commands/new.d.ts.map +1 -0
- package/dist/commands/new.js +252 -0
- package/dist/commands/new.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +79 -0
- package/dist/index.js.map +1 -0
- package/dist/utils/project.d.ts +13 -0
- package/dist/utils/project.d.ts.map +1 -0
- package/dist/utils/project.js +149 -0
- package/dist/utils/project.js.map +1 -0
- package/package.json +87 -0
- package/templates/.env.example.template +9 -0
- package/templates/.gitignore.template +31 -0
- package/templates/README.md.template +33 -0
- package/templates/advanced/src/components/assistant.js.template +66 -0
- package/templates/advanced/src/components/assistant.ts.template +71 -0
- package/templates/advanced/src/index.js.template +45 -0
- package/templates/advanced/src/index.ts.template +45 -0
- package/templates/basic/src/config/index.js.template +28 -0
- package/templates/basic/src/config/index.ts.template +28 -0
- package/templates/basic/src/index.js.template +29 -0
- package/templates/basic/src/index.ts.template +29 -0
- package/templates/package.json.template +21 -0
- package/templates/tsconfig.json.template +17 -0
package/README.md
ADDED
|
@@ -0,0 +1,368 @@
|
|
|
1
|
+
# @acip/cli
|
|
2
|
+
|
|
3
|
+
ACIP命令行工具 - 用于Adaptive Contextual Intelligence Protocol的官方CLI
|
|
4
|
+
|
|
5
|
+
## 安装
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
# 使用npm全局安装
|
|
9
|
+
npm install -g @acip/cli
|
|
10
|
+
|
|
11
|
+
# 或使用pnpm (推荐)
|
|
12
|
+
pnpm add -g @acip/cli
|
|
13
|
+
|
|
14
|
+
# 在项目内安装
|
|
15
|
+
npm install --save-dev @acip/cli
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## 快速开始
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
# 创建新的ACIP项目
|
|
22
|
+
acip init my-acip-project
|
|
23
|
+
|
|
24
|
+
# 进入项目目录
|
|
25
|
+
cd my-acip-project
|
|
26
|
+
|
|
27
|
+
# 安装依赖
|
|
28
|
+
npm install
|
|
29
|
+
|
|
30
|
+
# 启动开发服务器
|
|
31
|
+
acip dev
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
## 命令列表
|
|
35
|
+
|
|
36
|
+
### `acip init [项目名称]`
|
|
37
|
+
|
|
38
|
+
初始化一个新的ACIP项目。
|
|
39
|
+
|
|
40
|
+
**选项:**
|
|
41
|
+
- `--typescript` - 使用TypeScript (默认)
|
|
42
|
+
- `--javascript` - 使用JavaScript
|
|
43
|
+
- `-f, --force` - 覆盖已存在的文件
|
|
44
|
+
- `--skip-prompts` - 跳过所有提示并使用默认值
|
|
45
|
+
- `-t, --template <名称>` - 指定模板 (basic | advanced)
|
|
46
|
+
|
|
47
|
+
**示例:**
|
|
48
|
+
```bash
|
|
49
|
+
# 创建TypeScript项目
|
|
50
|
+
acip init my-project
|
|
51
|
+
|
|
52
|
+
# 创建JavaScript项目
|
|
53
|
+
acip init my-project --javascript
|
|
54
|
+
|
|
55
|
+
# 使用高级模板
|
|
56
|
+
acip init my-project --template advanced
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
### `acip new <类型> [名称]`
|
|
60
|
+
|
|
61
|
+
创建新的资源 (component, model, tool, config)。
|
|
62
|
+
|
|
63
|
+
**选项:**
|
|
64
|
+
- `-d, --directory <目录>` - 目标目录
|
|
65
|
+
- `--ts` - 使用TypeScript (默认)
|
|
66
|
+
- `--js` - 使用JavaScript
|
|
67
|
+
|
|
68
|
+
**示例:**
|
|
69
|
+
```bash
|
|
70
|
+
# 创建组件
|
|
71
|
+
acip new component MyComponent
|
|
72
|
+
|
|
73
|
+
# 创建模型
|
|
74
|
+
acip new model GPTModel
|
|
75
|
+
|
|
76
|
+
# 创建工具
|
|
77
|
+
acip new tool SearchTool
|
|
78
|
+
|
|
79
|
+
# 创建配置文件
|
|
80
|
+
acip new config DatabaseConfig
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
### `acip config`
|
|
84
|
+
|
|
85
|
+
管理ACIP配置。
|
|
86
|
+
|
|
87
|
+
**子命令:**
|
|
88
|
+
- `acip config get <key>` - 获取配置值
|
|
89
|
+
- `acip config set <key> <value>` - 设置配置值
|
|
90
|
+
- `acip config list` - 列出所有配置
|
|
91
|
+
- `acip config delete <key>` - 删除配置值
|
|
92
|
+
|
|
93
|
+
**选项:**
|
|
94
|
+
- `-g, --global` - 使用全局配置
|
|
95
|
+
|
|
96
|
+
**示例:**
|
|
97
|
+
```bash
|
|
98
|
+
# 设置API密钥
|
|
99
|
+
acip config set apiKey YOUR_API_KEY
|
|
100
|
+
|
|
101
|
+
# 设置默认模型
|
|
102
|
+
acip config set defaultModel gpt-4
|
|
103
|
+
|
|
104
|
+
# 查看所有配置
|
|
105
|
+
acip config list
|
|
106
|
+
|
|
107
|
+
# 获取特定配置
|
|
108
|
+
acip config get apiKey
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
### `acip dev`
|
|
112
|
+
|
|
113
|
+
启动开发服务器。
|
|
114
|
+
|
|
115
|
+
**选项:**
|
|
116
|
+
- `-p, --port <端口>` - 服务器端口 (默认: 3000)
|
|
117
|
+
- `-h, --host <主机>` - 服务器主机 (默认: localhost)
|
|
118
|
+
- `--https` - 使用HTTPS
|
|
119
|
+
- `-o, --open` - 在浏览器中打开
|
|
120
|
+
- `--no-watch` - 禁用文件监听
|
|
121
|
+
|
|
122
|
+
**示例:**
|
|
123
|
+
```bash
|
|
124
|
+
# 使用默认配置启动
|
|
125
|
+
acip dev
|
|
126
|
+
|
|
127
|
+
# 指定端口
|
|
128
|
+
acip dev --port 8080
|
|
129
|
+
|
|
130
|
+
# 使用HTTPS并自动打开浏览器
|
|
131
|
+
acip dev --https --open
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
### `acip deploy [环境]`
|
|
135
|
+
|
|
136
|
+
部署ACIP应用。
|
|
137
|
+
|
|
138
|
+
**环境:**
|
|
139
|
+
- `production` - 生产环境 (默认)
|
|
140
|
+
- `staging` - 预发布环境
|
|
141
|
+
- `development` - 开发环境
|
|
142
|
+
|
|
143
|
+
**选项:**
|
|
144
|
+
- `--dry-run` - 模拟部署,不做实际更改
|
|
145
|
+
- `--verbose` - 显示详细输出
|
|
146
|
+
- `--config <路径>` - 部署配置文件路径
|
|
147
|
+
- `--force` - 强制部署,忽略警告
|
|
148
|
+
- `--no-build` - 跳过构建步骤
|
|
149
|
+
|
|
150
|
+
**示例:**
|
|
151
|
+
```bash
|
|
152
|
+
# 部署到生产环境
|
|
153
|
+
acip deploy production
|
|
154
|
+
|
|
155
|
+
# 部署到预发布环境
|
|
156
|
+
acip deploy staging
|
|
157
|
+
|
|
158
|
+
# 模拟部署
|
|
159
|
+
acip deploy --dry-run
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
### `acip doctor`
|
|
163
|
+
|
|
164
|
+
诊断ACIP开发环境。
|
|
165
|
+
|
|
166
|
+
**选项:**
|
|
167
|
+
- `--verbose` - 显示详细输出
|
|
168
|
+
|
|
169
|
+
**检查项目:**
|
|
170
|
+
- Node.js版本
|
|
171
|
+
- 包管理器 (npm/pnpm)
|
|
172
|
+
- TypeScript
|
|
173
|
+
- 当前项目状态
|
|
174
|
+
- ACIP core模块
|
|
175
|
+
- 环境变量
|
|
176
|
+
- 网络连接
|
|
177
|
+
|
|
178
|
+
**示例:**
|
|
179
|
+
```bash
|
|
180
|
+
# 运行诊断
|
|
181
|
+
acip doctor
|
|
182
|
+
|
|
183
|
+
# 显示详细信息
|
|
184
|
+
acip doctor --verbose
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
### `acip list [类型]` / `acip ls [类型]`
|
|
188
|
+
|
|
189
|
+
列出项目资源。
|
|
190
|
+
|
|
191
|
+
**类型:**
|
|
192
|
+
- `components` - 组件
|
|
193
|
+
- `models` - 模型
|
|
194
|
+
- `tools` - 工具
|
|
195
|
+
- `config` - 配置
|
|
196
|
+
|
|
197
|
+
**选项:**
|
|
198
|
+
- `-v, --verbose` - 显示详细信息
|
|
199
|
+
- `-j, --json` - 以JSON格式输出
|
|
200
|
+
|
|
201
|
+
**示例:**
|
|
202
|
+
```bash
|
|
203
|
+
# 列出所有资源
|
|
204
|
+
acip list
|
|
205
|
+
|
|
206
|
+
# 只列出组件
|
|
207
|
+
acip list components
|
|
208
|
+
|
|
209
|
+
# 以JSON格式输出
|
|
210
|
+
acip list --json
|
|
211
|
+
|
|
212
|
+
# 显示详细信息
|
|
213
|
+
acip ls --verbose
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
## 项目结构
|
|
217
|
+
|
|
218
|
+
使用`acip init`创建的项目具有以下结构:
|
|
219
|
+
|
|
220
|
+
```
|
|
221
|
+
my-acip-project/
|
|
222
|
+
├── src/
|
|
223
|
+
│ ├── components/ # ACIP组件
|
|
224
|
+
│ ├── models/ # AI模型配置
|
|
225
|
+
│ ├── tools/ # 工具定义
|
|
226
|
+
│ ├── config/ # 配置文件
|
|
227
|
+
│ ├── utils/ # 工具函数
|
|
228
|
+
│ └── index.ts # 入口文件
|
|
229
|
+
├── public/ # 静态资源
|
|
230
|
+
├── tests/ # 测试文件
|
|
231
|
+
├── package.json # 项目配置
|
|
232
|
+
├── tsconfig.json # TypeScript配置
|
|
233
|
+
├── .env.example # 环境变量示例
|
|
234
|
+
├── .gitignore # Git忽略文件
|
|
235
|
+
└── README.md # 项目说明
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
## 环境变量
|
|
239
|
+
|
|
240
|
+
在项目根目录创建`.env`文件:
|
|
241
|
+
|
|
242
|
+
```env
|
|
243
|
+
# API密钥
|
|
244
|
+
ACIP_API_KEY=your_api_key_here
|
|
245
|
+
|
|
246
|
+
# 默认AI模型
|
|
247
|
+
DEFAULT_MODEL_ID=gpt-4
|
|
248
|
+
|
|
249
|
+
# 应用配置
|
|
250
|
+
APP_PORT=3000
|
|
251
|
+
NODE_ENV=development
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
## 配置文件
|
|
255
|
+
|
|
256
|
+
CLI工具的配置存储在:
|
|
257
|
+
- **macOS/Linux**: `~/.config/acip/config.json`
|
|
258
|
+
- **Windows**: `%APPDATA%\acip\config.json`
|
|
259
|
+
|
|
260
|
+
## 开发
|
|
261
|
+
|
|
262
|
+
### 本地开发
|
|
263
|
+
|
|
264
|
+
```bash
|
|
265
|
+
# 克隆仓库
|
|
266
|
+
git clone https://github.com/your-org/acip.git
|
|
267
|
+
cd acip/packages/cli
|
|
268
|
+
|
|
269
|
+
# 安装依赖
|
|
270
|
+
pnpm install
|
|
271
|
+
|
|
272
|
+
# 构建
|
|
273
|
+
pnpm build
|
|
274
|
+
|
|
275
|
+
# 运行开发模式
|
|
276
|
+
pnpm dev
|
|
277
|
+
|
|
278
|
+
# 运行测试
|
|
279
|
+
pnpm test
|
|
280
|
+
|
|
281
|
+
# 代码检查
|
|
282
|
+
pnpm lint
|
|
283
|
+
```
|
|
284
|
+
|
|
285
|
+
### 测试
|
|
286
|
+
|
|
287
|
+
```bash
|
|
288
|
+
# 运行所有测试
|
|
289
|
+
pnpm test
|
|
290
|
+
|
|
291
|
+
# 运行测试并生成覆盖率报告
|
|
292
|
+
pnpm test --coverage
|
|
293
|
+
|
|
294
|
+
# 监听模式
|
|
295
|
+
pnpm test --watch
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
### 代码规范
|
|
299
|
+
|
|
300
|
+
```bash
|
|
301
|
+
# 检查代码规范
|
|
302
|
+
pnpm lint
|
|
303
|
+
|
|
304
|
+
# 自动修复代码规范问题
|
|
305
|
+
pnpm lint:fix
|
|
306
|
+
```
|
|
307
|
+
|
|
308
|
+
## 故障排除
|
|
309
|
+
|
|
310
|
+
### 命令未找到
|
|
311
|
+
|
|
312
|
+
如果安装后无法运行`acip`命令:
|
|
313
|
+
|
|
314
|
+
1. 确保npm全局bin目录在PATH中:
|
|
315
|
+
```bash
|
|
316
|
+
npm config get prefix
|
|
317
|
+
```
|
|
318
|
+
|
|
319
|
+
2. 将输出路径添加到PATH环境变量
|
|
320
|
+
|
|
321
|
+
### Node版本错误
|
|
322
|
+
|
|
323
|
+
ACIP CLI需要Node.js >= 18.0.0:
|
|
324
|
+
|
|
325
|
+
```bash
|
|
326
|
+
# 检查Node版本
|
|
327
|
+
node --version
|
|
328
|
+
|
|
329
|
+
# 升级Node (使用nvm)
|
|
330
|
+
nvm install 18
|
|
331
|
+
nvm use 18
|
|
332
|
+
```
|
|
333
|
+
|
|
334
|
+
### 依赖安装失败
|
|
335
|
+
|
|
336
|
+
```bash
|
|
337
|
+
# 清除缓存
|
|
338
|
+
npm cache clean --force
|
|
339
|
+
|
|
340
|
+
# 删除node_modules和package-lock.json
|
|
341
|
+
rm -rf node_modules package-lock.json
|
|
342
|
+
|
|
343
|
+
# 重新安装
|
|
344
|
+
npm install
|
|
345
|
+
```
|
|
346
|
+
|
|
347
|
+
## 贡献
|
|
348
|
+
|
|
349
|
+
欢迎贡献! 请查看[贡献指南](../../CONTRIBUTING.md)。
|
|
350
|
+
|
|
351
|
+
## 许可证
|
|
352
|
+
|
|
353
|
+
MIT © ACIP Team
|
|
354
|
+
|
|
355
|
+
## 链接
|
|
356
|
+
|
|
357
|
+
- [ACIP文档](https://acip.dev/docs)
|
|
358
|
+
- [GitHub仓库](https://github.com/your-org/acip)
|
|
359
|
+
- [问题追踪](https://github.com/your-org/acip/issues)
|
|
360
|
+
- [更新日志](./CHANGELOG.md)
|
|
361
|
+
|
|
362
|
+
## 支持
|
|
363
|
+
|
|
364
|
+
如遇问题,请:
|
|
365
|
+
1. 运行`acip doctor`诊断环境
|
|
366
|
+
2. 查看[文档](https://acip.dev/docs)
|
|
367
|
+
3. 搜索或提交[Issue](https://github.com/your-org/acip/issues)
|
|
368
|
+
4. 加入[Discord社区](https://discord.gg/acip)
|
package/bin/acip.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"call.d.ts","sourceRoot":"","sources":["../../src/commands/call.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAWpC,MAAM,CAAC,OAAO,UAAU,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAuD1D"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { NodeClient, NodeType, PriorityLevel } from '@acip/core';
|
|
3
|
+
export default function callCommand(program) {
|
|
4
|
+
program
|
|
5
|
+
.command('call <deviceId> <target> <action>')
|
|
6
|
+
.description('Send an abstract control command to a node')
|
|
7
|
+
.option('-g, --gateway <url>', 'Gateway URL', 'ws://localhost:51000/acip-node/admin-panel/auth=')
|
|
8
|
+
.option('-p, --priority <level>', 'QoS Priority (critical_rt, high, normal, low, background)', 'normal')
|
|
9
|
+
.option('-m, --params <json>', 'Command parameters as JSON string', '{}')
|
|
10
|
+
.option('-j, --json', 'Output as JSON')
|
|
11
|
+
.action(async (deviceId, target, action, options) => {
|
|
12
|
+
console.log(chalk.blue(`[CLI] Connecting to Gateway at ${options.gateway}...`));
|
|
13
|
+
const client = new NodeClient({
|
|
14
|
+
nodeType: NodeType.AdminPanel,
|
|
15
|
+
nodeName: 'ACIP-CLI-Caller',
|
|
16
|
+
gatewayUrl: options.gateway || 'ws://localhost:51000/acip-node/admin-panel/auth='
|
|
17
|
+
});
|
|
18
|
+
try {
|
|
19
|
+
await client.connect();
|
|
20
|
+
console.log(chalk.green(`[CLI] Connected. Sending command to ${deviceId}: ${target}.${action}`));
|
|
21
|
+
// 解析参数
|
|
22
|
+
let params = {};
|
|
23
|
+
try {
|
|
24
|
+
params = JSON.parse(options.params || '{}');
|
|
25
|
+
}
|
|
26
|
+
catch (e) {
|
|
27
|
+
console.error(chalk.red(`[CLI] Error: Invalid JSON parameters: ${options.params}`));
|
|
28
|
+
process.exit(1);
|
|
29
|
+
}
|
|
30
|
+
// 映射优先级
|
|
31
|
+
const priority = mapPriority(options.priority || 'normal');
|
|
32
|
+
// 真实发送逻辑 (v1.2.0 基础设施化)
|
|
33
|
+
// 我们将 deviceId 作为 target 传递给网关,网关会根据 target 路由
|
|
34
|
+
const response = await client.sendCommand({
|
|
35
|
+
target: deviceId, // 路由目标
|
|
36
|
+
action: `${target}.${action}`, // 实际动作
|
|
37
|
+
params,
|
|
38
|
+
expiresAt: Date.now() + 10000, // 10 秒有效期
|
|
39
|
+
}, priority);
|
|
40
|
+
if (options.json) {
|
|
41
|
+
console.log(JSON.stringify(response, null, 2));
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
console.log(chalk.bold.green(`[CLI] Command executed successfully!`));
|
|
45
|
+
console.log(chalk.dim(`[CLI] Response: ${JSON.stringify(response, null, 2)}`));
|
|
46
|
+
}
|
|
47
|
+
await client.disconnect();
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
console.error(chalk.red(`[CLI] Error: ${error instanceof Error ? error.message : String(error)}`));
|
|
51
|
+
process.exit(1);
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
function mapPriority(level) {
|
|
56
|
+
switch (level.toLowerCase()) {
|
|
57
|
+
case 'critical_rt': return PriorityLevel.CriticalRT;
|
|
58
|
+
case 'high': return PriorityLevel.High;
|
|
59
|
+
case 'normal': return PriorityLevel.Normal;
|
|
60
|
+
case 'low': return PriorityLevel.Low;
|
|
61
|
+
case 'background': return PriorityLevel.Background;
|
|
62
|
+
default: return PriorityLevel.Normal;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=call.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"call.js","sourceRoot":"","sources":["../../src/commands/call.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAkBpC,MAAM,CAAC,OAAO,UAAU,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAgJ5D"}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import Conf from 'conf';
|
|
3
|
+
export default function configCommand(program) {
|
|
4
|
+
// 创建配置存储实例
|
|
5
|
+
const config = new Conf({
|
|
6
|
+
projectName: 'acip',
|
|
7
|
+
schema: {
|
|
8
|
+
apiKey: {
|
|
9
|
+
type: 'string'
|
|
10
|
+
},
|
|
11
|
+
defaultModel: {
|
|
12
|
+
type: 'string',
|
|
13
|
+
default: 'gpt-4'
|
|
14
|
+
},
|
|
15
|
+
telemetryEnabled: {
|
|
16
|
+
type: 'boolean',
|
|
17
|
+
default: true
|
|
18
|
+
},
|
|
19
|
+
// 用户自定义配置
|
|
20
|
+
userSettings: {
|
|
21
|
+
type: 'object',
|
|
22
|
+
default: {}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
// Helper function to validate config key
|
|
27
|
+
function isValidConfigKey(key) {
|
|
28
|
+
return ['apiKey', 'defaultModel', 'telemetryEnabled', 'userSettings'].includes(key);
|
|
29
|
+
}
|
|
30
|
+
program
|
|
31
|
+
.command('config')
|
|
32
|
+
.description('Manage ACIP configuration')
|
|
33
|
+
.option('-g, --global', 'Use global configuration', false)
|
|
34
|
+
.action(async (options) => {
|
|
35
|
+
// 显示可用的配置命令帮助
|
|
36
|
+
console.log(chalk.blue('ACIP Configuration Management\n'));
|
|
37
|
+
console.log('Usage:');
|
|
38
|
+
console.log(' acip config get <key> Get a configuration value');
|
|
39
|
+
console.log(' acip config set <key> <value> Set a configuration value');
|
|
40
|
+
console.log(' acip config list List all configuration values');
|
|
41
|
+
console.log(' acip config delete <key> Delete a configuration value\n');
|
|
42
|
+
console.log('Examples:');
|
|
43
|
+
console.log(' acip config get apiKey');
|
|
44
|
+
console.log(' acip config set defaultModel gpt-4');
|
|
45
|
+
console.log(' acip config list');
|
|
46
|
+
console.log(' acip config delete telemetryEnabled\n');
|
|
47
|
+
console.log(chalk.dim('Use --global (-g) flag to access global configuration'));
|
|
48
|
+
});
|
|
49
|
+
// 获取配置
|
|
50
|
+
program
|
|
51
|
+
.command('config:get <key>')
|
|
52
|
+
.description('Get a configuration value')
|
|
53
|
+
.option('-g, --global', 'Use global configuration', false)
|
|
54
|
+
.action((key, options) => {
|
|
55
|
+
try {
|
|
56
|
+
if (!isValidConfigKey(key)) {
|
|
57
|
+
console.log(chalk.yellow(`Invalid configuration key: '${key}'`));
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
const value = config.get(key);
|
|
61
|
+
if (value === undefined) {
|
|
62
|
+
console.log(chalk.yellow(`Configuration key '${key}' not found.`));
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
if (typeof value === 'object') {
|
|
66
|
+
console.log(JSON.stringify(value, null, 2));
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
console.log(value);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
console.error(chalk.red('Error reading configuration:'), error instanceof Error ? error.message : String(error));
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
// 设置配置
|
|
78
|
+
program
|
|
79
|
+
.command('config:set <key> <value>')
|
|
80
|
+
.description('Set a configuration value')
|
|
81
|
+
.option('-g, --global', 'Use global configuration', false)
|
|
82
|
+
.action((key, value, options) => {
|
|
83
|
+
try {
|
|
84
|
+
if (!isValidConfigKey(key)) {
|
|
85
|
+
console.log(chalk.yellow(`Invalid configuration key: '${key}'`));
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
// 尝试解析为JSON,如果失败则保持为字符串
|
|
89
|
+
let parsedValue;
|
|
90
|
+
try {
|
|
91
|
+
parsedValue = JSON.parse(value);
|
|
92
|
+
}
|
|
93
|
+
catch (e) {
|
|
94
|
+
parsedValue = value;
|
|
95
|
+
}
|
|
96
|
+
config.set(key, parsedValue);
|
|
97
|
+
console.log(chalk.green(`Configuration '${key}' set successfully.`));
|
|
98
|
+
}
|
|
99
|
+
catch (error) {
|
|
100
|
+
console.error(chalk.red('Error setting configuration:'), error instanceof Error ? error.message : String(error));
|
|
101
|
+
}
|
|
102
|
+
});
|
|
103
|
+
// 列出所有配置
|
|
104
|
+
program
|
|
105
|
+
.command('config:list')
|
|
106
|
+
.description('List all configuration values')
|
|
107
|
+
.option('-g, --global', 'Use global configuration', false)
|
|
108
|
+
.action((options) => {
|
|
109
|
+
try {
|
|
110
|
+
const allConfig = config.store;
|
|
111
|
+
console.log(chalk.blue('Current Configuration:'));
|
|
112
|
+
console.log(JSON.stringify(allConfig, null, 2));
|
|
113
|
+
// 显示配置文件路径
|
|
114
|
+
console.log(chalk.dim(`\nConfiguration stored at: ${config.path}`));
|
|
115
|
+
}
|
|
116
|
+
catch (error) {
|
|
117
|
+
console.error(chalk.red('Error listing configuration:'), error instanceof Error ? error.message : String(error));
|
|
118
|
+
}
|
|
119
|
+
});
|
|
120
|
+
// 删除配置
|
|
121
|
+
program
|
|
122
|
+
.command('config:delete <key>')
|
|
123
|
+
.description('Delete a configuration value')
|
|
124
|
+
.option('-g, --global', 'Use global configuration', false)
|
|
125
|
+
.action((key, options) => {
|
|
126
|
+
try {
|
|
127
|
+
if (!isValidConfigKey(key)) {
|
|
128
|
+
console.log(chalk.yellow(`Invalid configuration key: '${key}'`));
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
if (config.has(key)) {
|
|
132
|
+
config.delete(key);
|
|
133
|
+
console.log(chalk.green(`Configuration '${key}' deleted successfully.`));
|
|
134
|
+
}
|
|
135
|
+
else {
|
|
136
|
+
console.log(chalk.yellow(`Configuration key '${key}' not found.`));
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
catch (error) {
|
|
140
|
+
console.error(chalk.red('Error deleting configuration:'), error instanceof Error ? error.message : String(error));
|
|
141
|
+
}
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../../src/commands/deploy.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAuBpC,MAAM,CAAC,OAAO,UAAU,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAiE5D"}
|