@aipack-ai/cli 0.0.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/README.md +210 -0
- package/dist/chunk-DWPSBSRO.js +1402 -0
- package/dist/chunk-DWPSBSRO.js.map +1 -0
- package/dist/cli.d.ts +4 -0
- package/dist/cli.js +8 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.d.ts +179 -0
- package/dist/index.js +59 -0
- package/dist/index.js.map +1 -0
- package/package.json +48 -0
package/README.md
ADDED
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
# @aipack-ai/cli
|
|
2
|
+
|
|
3
|
+
基于 [`@aipack-ai/agent`](../agent) 的终端 AI 编程助手。支持交互 REPL、非交互管道与 JSON 事件流三种模式,内置文件读写与 shell 工具,默认权限策略对正常操作零打断、仅危险命令需确认。
|
|
4
|
+
|
|
5
|
+
```bash
|
|
6
|
+
npm install -g @aipack-ai/cli
|
|
7
|
+
aipack "帮我看看这个项目"
|
|
8
|
+
```
|
|
9
|
+
|
|
10
|
+
## 快速开始
|
|
11
|
+
|
|
12
|
+
```bash
|
|
13
|
+
# 任选一个提供商设置 API Key
|
|
14
|
+
export DEEPSEEK_API_KEY=sk-xxx
|
|
15
|
+
|
|
16
|
+
# 交互模式(REPL)
|
|
17
|
+
aipack
|
|
18
|
+
|
|
19
|
+
# 非交互:单次提问(支持管道)
|
|
20
|
+
aipack -p "总结 README.md"
|
|
21
|
+
cat src/index.ts | aipack -p "这段代码有什么问题?"
|
|
22
|
+
|
|
23
|
+
# 指定模型(provider/id 组合写法)
|
|
24
|
+
aipack --model deepseek/deepseek-chat "你好"
|
|
25
|
+
aipack --model anthropic/claude-sonnet-4-20250514 "重构这个函数"
|
|
26
|
+
|
|
27
|
+
# 附带文件上下文(图片自动走多模态通道)
|
|
28
|
+
aipack @package.json "分析依赖"
|
|
29
|
+
aipack @screenshot.png "这个报错怎么修"
|
|
30
|
+
|
|
31
|
+
# 继续当前目录最近的会话
|
|
32
|
+
aipack -c "我们刚才聊到哪里了?"
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## 三种运行模式
|
|
36
|
+
|
|
37
|
+
| 模式 | 用法 | 说明 |
|
|
38
|
+
|------|------|------|
|
|
39
|
+
| 交互(默认) | `aipack` | REPL,支持斜杠命令、Ctrl+C 中断运行(双击退出) |
|
|
40
|
+
| 非交互 | `aipack -p "..."` | 处理一次提示后退出;回复写 stdout(可管道),工具信息写 stderr |
|
|
41
|
+
| JSON 事件流 | `aipack --mode json "..."` | 全部流式事件按 JSON 行输出,供程序消费 |
|
|
42
|
+
|
|
43
|
+
JSON 模式输出示例:
|
|
44
|
+
|
|
45
|
+
```json
|
|
46
|
+
{"type":"text","content":"你好","timestamp":1730000000000}
|
|
47
|
+
{"type":"tool_start","toolName":"bash","timestamp":1730000000100}
|
|
48
|
+
{"type":"tool_end","isError":false,"timestamp":1730000000300}
|
|
49
|
+
{"type":"done","timestamp":1730000000400}
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
## 命令行选项
|
|
53
|
+
|
|
54
|
+
### 模型
|
|
55
|
+
|
|
56
|
+
| 选项 | 说明 |
|
|
57
|
+
|------|------|
|
|
58
|
+
| `--provider <名称>` | 提供商:openai / deepseek / anthropic / google / groq / moonshot ... |
|
|
59
|
+
| `--model <id>` | 模型 ID,支持 `provider/id` 组合写法;目录外模型自动按提供商 API 推断 |
|
|
60
|
+
| `--api-key <key>` | 覆盖环境变量 |
|
|
61
|
+
| `--thinking <级别>` | 思考级别:off / minimal / low / medium / high / max |
|
|
62
|
+
| `--list-models [搜索]` | 列出内置模型目录(标注 API Key 配置状态) |
|
|
63
|
+
|
|
64
|
+
未指定模型时自动探测第一个已配置 `*_API_KEY` 的提供商并使用其默认模型。
|
|
65
|
+
|
|
66
|
+
### 会话
|
|
67
|
+
|
|
68
|
+
| 选项 | 说明 |
|
|
69
|
+
|------|------|
|
|
70
|
+
| `-c, --continue` | 继续当前目录最近的会话 |
|
|
71
|
+
| `-r, --resume` | 列出当前目录历史会话供选择 |
|
|
72
|
+
| `--session <key>` | 使用指定会话 |
|
|
73
|
+
| `-n, --name <名称>` | 为新会话命名 |
|
|
74
|
+
| `--session-dir <目录>` | 自定义会话存储目录 |
|
|
75
|
+
| `--no-session` | 临时会话,不持久化 |
|
|
76
|
+
|
|
77
|
+
会话按工作目录分组存储于 `~/.aipack/cli-sessions/<cwd编码>/`。
|
|
78
|
+
|
|
79
|
+
### 工具与权限
|
|
80
|
+
|
|
81
|
+
| 选项 | 说明 |
|
|
82
|
+
|------|------|
|
|
83
|
+
| `-t, --tools <列表>` | 工具白名单(逗号分隔) |
|
|
84
|
+
| `-xt, --exclude-tools <列表>` | 工具黑名单 |
|
|
85
|
+
| `-nt, --no-tools` | 禁用全部工具 |
|
|
86
|
+
| `--safe` | 保守模式:写文件与 shell 全部人工确认 |
|
|
87
|
+
|
|
88
|
+
内置工具:
|
|
89
|
+
|
|
90
|
+
| 工具 | 能力 | 说明 |
|
|
91
|
+
|------|------|------|
|
|
92
|
+
| `read` | `fs:read` | 读文件,支持 offset/limit,超长截断 |
|
|
93
|
+
| `write` | `fs:write` | 写文件,自动建父目录 |
|
|
94
|
+
| `edit` | `fs:write` | 精确替换(oldString 唯一匹配) |
|
|
95
|
+
| `bash` | `shell:exec` | 执行 shell 命令,60s 超时,输出截断 |
|
|
96
|
+
|
|
97
|
+
所有文件工具限制在工作区内(越界路径直接拒绝)。
|
|
98
|
+
|
|
99
|
+
### 其他
|
|
100
|
+
|
|
101
|
+
| 选项 | 说明 |
|
|
102
|
+
|------|------|
|
|
103
|
+
| `--system-prompt <文本>` | 替换默认系统提示词 |
|
|
104
|
+
| `--append-system-prompt <文本>` | 追加系统提示词(可多次) |
|
|
105
|
+
| `-h, --help` / `-v, --version` | 帮助 / 版本 |
|
|
106
|
+
|
|
107
|
+
## 默认权限策略
|
|
108
|
+
|
|
109
|
+
正常操作零打断,仅真正危险的命令需确认:
|
|
110
|
+
|
|
111
|
+
| 操作 | 默认行为 |
|
|
112
|
+
|------|---------|
|
|
113
|
+
| 读文件 | 静默放行 |
|
|
114
|
+
| 写文件 / 编辑 | 静默放行(工作区越界防护兜底) |
|
|
115
|
+
| bash 普通命令 | 静默放行 |
|
|
116
|
+
| bash 危险命令 | 弹出选择器,标注危险原因 |
|
|
117
|
+
|
|
118
|
+
危险命令识别:`sudo` 提权、`rm -rf /` `rm -rf ~`(根/家目录递归删除)、`mkfs` / `dd of=/dev/` / `> /dev/sdX`(磁盘写入)、`curl ... \| sh`(管道执行远程脚本)、`chmod -R 777 /`、`shutdown` / `reboot`、fork 炸弹。指定子目录的正常删除(如 `rm -rf dist`)不受影响。
|
|
119
|
+
|
|
120
|
+
确认时使用**方向键选择器**(非输入式):
|
|
121
|
+
|
|
122
|
+
```
|
|
123
|
+
? 危险命令(提权执行):sudo rm -rf /usr/local/foo
|
|
124
|
+
❯ 允许
|
|
125
|
+
总是允许(本会话)
|
|
126
|
+
拒绝
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
选择"总是允许"后,同一能力本会话内不再重复询问。
|
|
130
|
+
|
|
131
|
+
## 交互模式斜杠命令
|
|
132
|
+
|
|
133
|
+
| 命令 | 说明 |
|
|
134
|
+
|------|------|
|
|
135
|
+
| `/model [provider/id]` | 切换模型(无参显示当前) |
|
|
136
|
+
| `/thinking <级别>` | 调整思考级别 |
|
|
137
|
+
| `/system <文本>` | 替换系统提示词 |
|
|
138
|
+
| `/session` | 当前会话信息 |
|
|
139
|
+
| `/sessions` | 列出历史会话 |
|
|
140
|
+
| `/clear` | 清空当前会话(仅内存) |
|
|
141
|
+
| `/approvals` | 列出未决审批单 |
|
|
142
|
+
| `/approve <id>` / `/deny <id>` | 结算审批单 |
|
|
143
|
+
| `/help` / `/quit` | 帮助 / 退出 |
|
|
144
|
+
|
|
145
|
+
## approvals 子命令(跨进程审批)
|
|
146
|
+
|
|
147
|
+
配合 `aipack.config.js` 的 `approvals.enabled: true` 使用。运行中的进程产生 pending 审批单落盘后,可在另一个终端结算:
|
|
148
|
+
|
|
149
|
+
```bash
|
|
150
|
+
aipack approvals list # 列出未决审批单
|
|
151
|
+
aipack approvals approve <id> # 批准
|
|
152
|
+
aipack approvals deny <id> # 驳回
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
## 配置文件 `aipack.config.js`
|
|
156
|
+
|
|
157
|
+
放在项目根目录(可选):
|
|
158
|
+
|
|
159
|
+
```js
|
|
160
|
+
export default {
|
|
161
|
+
// 异步审批(默认关闭:内联确认)
|
|
162
|
+
approvals: {
|
|
163
|
+
enabled: true,
|
|
164
|
+
// 触发审批的能力(默认 ['fs:write', 'shell:exec'])
|
|
165
|
+
capabilities: ['shell:exec'],
|
|
166
|
+
},
|
|
167
|
+
// 自定义权限规则(优先于内置规则)
|
|
168
|
+
permissionRules: [
|
|
169
|
+
{ toolName: 'write', decision: 'confirm' }, // write 工具全部确认
|
|
170
|
+
{ permission: 'fs:write', decision: 'allow' }, // 按能力放行
|
|
171
|
+
],
|
|
172
|
+
};
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
优先级:`approvals`(pending) > `--safe`(confirm) > 智能默认;`permissionRules` 永远最先匹配。
|
|
176
|
+
|
|
177
|
+
## 环境变量
|
|
178
|
+
|
|
179
|
+
| 变量 | 说明 |
|
|
180
|
+
|------|------|
|
|
181
|
+
| `<PROVIDER>_API_KEY` | 提供商 API Key,如 `DEEPSEEK_API_KEY`、`OPENAI_API_KEY`、`ANTHROPIC_API_KEY` |
|
|
182
|
+
| `AIPACK_CONFIG_DIR` | 配置目录(默认 `~/.aipack`) |
|
|
183
|
+
|
|
184
|
+
## 可编程 API
|
|
185
|
+
|
|
186
|
+
```ts
|
|
187
|
+
import { parseArgs, buildRuntime, runPrintMode, BUILTIN_TOOLS, isDangerousCommand } from '@aipack-ai/cli';
|
|
188
|
+
|
|
189
|
+
const args = parseArgs(['-p', '你好']);
|
|
190
|
+
const built = await buildRuntime({ args, cwd: process.cwd() });
|
|
191
|
+
// built.runtime → @aipack-ai/agent Runtime
|
|
192
|
+
// built.sessionKey / built.storage / built.approvalManager
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
## 开发
|
|
196
|
+
|
|
197
|
+
```bash
|
|
198
|
+
pnpm build:cli # 构建(自动先构建 agent)
|
|
199
|
+
pnpm --filter @aipack-ai/cli typecheck
|
|
200
|
+
pnpm cli:dev # tsx 直跑源码
|
|
201
|
+
pnpm cli # 运行构建产物
|
|
202
|
+
|
|
203
|
+
# 冒烟
|
|
204
|
+
pnpm cli --list-models
|
|
205
|
+
printf '/help\n/quit\n' | pnpm cli
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
## License
|
|
209
|
+
|
|
210
|
+
MIT
|