@di-code/coding-agent 0.1.2 → 0.1.3
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 +489 -143
- package/dist/cli.d.ts +1 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +15 -0
- package/dist/cli.js.map +1 -1
- package/dist/core/clipboard-image.d.ts +13 -0
- package/dist/core/clipboard-image.d.ts.map +1 -0
- package/dist/core/clipboard-image.js +99 -0
- package/dist/core/clipboard-image.js.map +1 -0
- package/dist/core/image-input.d.ts +13 -0
- package/dist/core/image-input.d.ts.map +1 -0
- package/dist/core/image-input.js +102 -0
- package/dist/core/image-input.js.map +1 -0
- package/dist/core/session.d.ts +3 -1
- package/dist/core/session.d.ts.map +1 -1
- package/dist/core/session.js +12 -4
- package/dist/core/session.js.map +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +8 -2
- package/dist/main.js.map +1 -1
- package/dist/modes/interactive-components.d.ts +1 -0
- package/dist/modes/interactive-components.d.ts.map +1 -1
- package/dist/modes/interactive-components.js +44 -20
- package/dist/modes/interactive-components.js.map +1 -1
- package/dist/modes/interactive-layout.d.ts +2 -1
- package/dist/modes/interactive-layout.d.ts.map +1 -1
- package/dist/modes/interactive-layout.js +17 -1
- package/dist/modes/interactive-layout.js.map +1 -1
- package/dist/modes/interactive-state.d.ts +12 -2
- package/dist/modes/interactive-state.d.ts.map +1 -1
- package/dist/modes/interactive-state.js +49 -2
- package/dist/modes/interactive-state.js.map +1 -1
- package/dist/modes/interactive.d.ts +8 -0
- package/dist/modes/interactive.d.ts.map +1 -1
- package/dist/modes/interactive.js +99 -4
- package/dist/modes/interactive.js.map +1 -1
- package/dist/provider-onboarding.d.ts.map +1 -1
- package/dist/provider-onboarding.js +7 -0
- package/dist/provider-onboarding.js.map +1 -1
- package/dist/startup.d.ts.map +1 -1
- package/dist/startup.js +50 -23
- package/dist/startup.js.map +1 -1
- package/dist/utils/syntax-highlight.d.ts +2 -0
- package/dist/utils/syntax-highlight.d.ts.map +1 -0
- package/dist/utils/syntax-highlight.js +55 -0
- package/dist/utils/syntax-highlight.js.map +1 -0
- package/package.json +8 -4
package/README.md
CHANGED
|
@@ -1,26 +1,207 @@
|
|
|
1
1
|
# @di-code/coding-agent
|
|
2
2
|
|
|
3
|
-
`@di-code/coding-agent` 是 [di-code](https://github.com/qddidi/di-code) 的可安装终端 AI
|
|
3
|
+
`@di-code/coding-agent` 是 [di-code](https://github.com/qddidi/di-code) 的可安装终端 AI 编码代理。安装后提供:
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
- `di-code`:面向人的交互式、单次输出和 JSON 事件 CLI;
|
|
6
|
+
- `di-code-rpc`:供 Node.js 宿主程序管理的 JSONL RPC 子进程入口;
|
|
7
|
+
- 内置的 `read`、`write`、`edit`、`bash` 工具、JSONL 会话、图片输入、上下文压缩;
|
|
8
|
+
- 可复用的 **Skills(技能指令)**、`AGENTS.md` 项目说明,以及插件扩展机制。
|
|
6
9
|
|
|
7
|
-
|
|
10
|
+
> **运行环境:**Node.js `>= 22.19.0`。真实 Provider 会产生网络请求和费用;首次体验可使用离线的 `faux` Provider。
|
|
11
|
+
|
|
12
|
+
## 目录
|
|
13
|
+
|
|
14
|
+
- [快速使用教程](#快速使用教程)
|
|
15
|
+
- [配置模型 Provider](#配置模型-provider)
|
|
16
|
+
- [日常使用](#日常使用)
|
|
17
|
+
- [交互模式](#交互模式)
|
|
18
|
+
- [会话、图片与内置工具](#会话图片与内置工具)
|
|
19
|
+
- [项目说明与 Skills](#项目说明与-skills)
|
|
20
|
+
- [插件](#插件)
|
|
21
|
+
- [自定义 Provider](#自定义-provider)
|
|
22
|
+
- [脚本和 RPC 集成](#脚本和-rpc-集成)
|
|
23
|
+
- [安全边界与故障排查](#安全边界与故障排查)
|
|
24
|
+
|
|
25
|
+
## 快速使用教程
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
### 方式一:使用首次配置向导
|
|
29
|
+
|
|
30
|
+
这是第一次使用时最简单的方式。先安装并进入项目目录:
|
|
8
31
|
|
|
9
32
|
```powershell
|
|
10
|
-
npm install @di-code/coding-agent
|
|
33
|
+
npm install -g @di-code/coding-agent
|
|
11
34
|
```
|
|
35
|
+
然后执行
|
|
36
|
+
|
|
37
|
+
```
|
|
38
|
+
di-code
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
在向导中依次完成:
|
|
42
|
+
|
|
43
|
+
1. **选择 Provider**:例如 `OpenAI`、`Anthropic`、`DeepSeek`、`Zhipu AI`;如果只想离线试用,选择 `Faux (offline)`。
|
|
44
|
+
2. **选择模型**:向导会列出当前 Provider 支持的模型,选择你有权限使用的模型。
|
|
45
|
+
3. **填写 API key**:选择真实 Provider 时,在隐藏输入框中粘贴对应的 key;输入内容不会显示在终端中。
|
|
46
|
+
4. **确认并开始对话**:向导完成后进入 interactive 模式,在底部输入框输入问题并按 `Enter`。
|
|
47
|
+
|
|
48
|
+
向导输入的 API key 只存在于当前进程内存,不会保存到 `.env`、`.di-code/settings.json`、会话文件或日志。退出后再次启动,如果没有环境变量或 settings 配置,向导会再次出现。
|
|
49
|
+
|
|
50
|
+
向导完成后可以直接这样使用:
|
|
51
|
+
|
|
52
|
+
```text
|
|
53
|
+
请先读取项目结构,然后告诉我应该从哪些文件开始修改。
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
### 方式二:直接用 `settings.json` 配置
|
|
57
|
+
|
|
58
|
+
如果你已经知道 Provider、`baseUrl`、模型和 API key,可以不使用向导,直接在**当前项目根目录**创建 `.di-code/settings.json`。这是配置私有网关、自定义模型或希望配置可复用时推荐的方式。
|
|
59
|
+
|
|
60
|
+
下面这个例子使用 OpenAI Responses 兼容接口。将示例中的 `baseUrl`、`apiKey` 和模型字段替换为实际值后即可使用:
|
|
61
|
+
|
|
12
62
|
|
|
13
|
-
|
|
63
|
+
`.di-code/settings.json`:
|
|
64
|
+
|
|
65
|
+
```json
|
|
66
|
+
{
|
|
67
|
+
"providers": {
|
|
68
|
+
"my-provider": {
|
|
69
|
+
"name": "My Coding Gateway",
|
|
70
|
+
"api": "openai-responses",
|
|
71
|
+
"baseUrl": "https://api.example.com/v1",
|
|
72
|
+
"apiKey": "your-api-key",
|
|
73
|
+
"models": [
|
|
74
|
+
{
|
|
75
|
+
"id": "my-coding-model",
|
|
76
|
+
"name": "My Coding Model",
|
|
77
|
+
"input": ["text", "image"],
|
|
78
|
+
"reasoning": true,
|
|
79
|
+
"contextWindow": 128000,
|
|
80
|
+
"maxTokens": 16384
|
|
81
|
+
}
|
|
82
|
+
]
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
```
|
|
87
|
+
默认使用第一个模型。可以添加多个模型然后使用`/model`切换
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
`settings.json` 中的 `apiKey` 可以直接填写字符串,**但不建议这样做**,因为它很容易被提交到 Git。更安全的写法是引用环境变量:
|
|
91
|
+
|
|
92
|
+
```json
|
|
93
|
+
{
|
|
94
|
+
"providers": {
|
|
95
|
+
"my-provider": {
|
|
96
|
+
"api": "openai-responses",
|
|
97
|
+
"baseUrl": "https://api.example.com/v1",
|
|
98
|
+
"apiKey": "$MY_CODING_API_KEY",
|
|
99
|
+
"models": [
|
|
100
|
+
{
|
|
101
|
+
"id": "my-coding-model",
|
|
102
|
+
"input": ["text"]
|
|
103
|
+
}
|
|
104
|
+
]
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
```
|
|
14
109
|
|
|
15
110
|
```powershell
|
|
16
|
-
|
|
111
|
+
$env:MY_CODING_API_KEY = "your-api-key"
|
|
112
|
+
$env:DI_CODE_PROVIDER = "my-provider"
|
|
113
|
+
di-code "检查当前项目的测试状态"
|
|
17
114
|
```
|
|
18
115
|
|
|
19
|
-
|
|
116
|
+
`settings.json` 中最重要的字段是:
|
|
117
|
+
|
|
118
|
+
| 字段 | 作用 |
|
|
119
|
+
| --- | --- |
|
|
120
|
+
| `providers` | Provider 配置对象,key 是 Provider ID |
|
|
121
|
+
| `api` | 接口类型:`openai-responses`、`deepseek-responses`、`zhipu-chat-completions` 或 `anthropic-messages` |
|
|
122
|
+
| `baseUrl` | Provider 的接口地址,必须是绝对的 `http` 或 `https` URL |
|
|
123
|
+
| `apiKey` | API key,推荐填写 `$ENV_VAR` 或 `${ENV_VAR}` |
|
|
124
|
+
| `models` | 自定义 Provider 必填的模型列表 |
|
|
125
|
+
| `models[].id` | 模型真实 ID,也就是 `DI_CODE_MODEL` 的值 |
|
|
126
|
+
| `models[].input` | 输入类型,填写 `text`、`image` 或两者 |
|
|
127
|
+
| `models[].reasoning` | 是否支持 reasoning/thinking 内容 |
|
|
128
|
+
| `models[].contextWindow` | 上下文 token 上限 |
|
|
129
|
+
| `models[].maxTokens` | 单次最大输出 token 数 |
|
|
130
|
+
|
|
131
|
+
`models` 可以配置多个模型,运行时用 `/model` 切换,或者修改 `DI_CODE_MODEL`:
|
|
20
132
|
|
|
21
|
-
|
|
133
|
+
```json
|
|
134
|
+
{
|
|
135
|
+
"providers": {
|
|
136
|
+
"my-provider": {
|
|
137
|
+
"api": "openai-responses",
|
|
138
|
+
"baseUrl": "https://api.example.com/v1",
|
|
139
|
+
"apiKey": "$MY_CODING_API_KEY",
|
|
140
|
+
"models": [
|
|
141
|
+
{ "id": "fast-model", "input": ["text"] },
|
|
142
|
+
{ "id": "strong-model", "input": ["text", "image"], "reasoning": true }
|
|
143
|
+
]
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
```
|
|
22
148
|
|
|
23
|
-
|
|
149
|
+
如果 `settings.json` 中只有一个 Provider,可以省略 `DI_CODE_PROVIDER`;如果有多个 Provider,则必须设置它。`DI_CODE_MODEL` 省略时使用该 Provider 模型列表的第一项。配置完成后,先用 print 模式验证:
|
|
150
|
+
|
|
151
|
+
```powershell
|
|
152
|
+
di-code --print "用一句话介绍当前项目"
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
出现 `Unknown model` 时,检查 `DI_CODE_MODEL` 是否与 `models[].id` 完全一致;出现 `Configured apiKey environment variable ... is not set` 时,检查环境变量名称是否拼写正确。
|
|
156
|
+
|
|
157
|
+
### 方式三:使用环境变量
|
|
158
|
+
|
|
159
|
+
如果使用内建 Provider,可以只设置环境变量,不创建 `settings.json`:
|
|
160
|
+
|
|
161
|
+
```powershell
|
|
162
|
+
$env:DI_CODE_PROVIDER = "openai"
|
|
163
|
+
$env:DI_CODE_MODEL = "gpt-4o"
|
|
164
|
+
$env:OPENAI_API_KEY = "your-api-key"
|
|
165
|
+
di-code --print "检查当前项目的目录结构"
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
确认 print 模式可以正常返回后,再运行 `di-code --interactive` 开始持续对话。
|
|
169
|
+
|
|
170
|
+
## 配置模型 Provider
|
|
171
|
+
|
|
172
|
+
日常使用推荐把凭据放在操作系统环境变量或未提交的项目 `.env` 中,**不要**把真实 API key 提交到 Git。全局安装的 `di-code` 读取当前进程环境变量;若使用项目 `.env`,请先通过你的 shell、秘密管理工具或启动脚本加载它。
|
|
173
|
+
|
|
174
|
+
PowerShell 临时配置 OpenAI:
|
|
175
|
+
|
|
176
|
+
```powershell
|
|
177
|
+
$env:DI_CODE_PROVIDER = "openai"
|
|
178
|
+
$env:DI_CODE_MODEL = "gpt-4o" # 可省略,使用该 Provider 的默认模型
|
|
179
|
+
$env:OPENAI_API_KEY = "your-api-key"
|
|
180
|
+
di-code "检查这个仓库的目录结构"
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
内建 Provider:
|
|
184
|
+
|
|
185
|
+
| Provider ID | 必需 API key 变量 | 可选 endpoint 覆盖变量 |
|
|
186
|
+
| --- | --- | --- |
|
|
187
|
+
| `openai` | `OPENAI_API_KEY` | `OPENAI_BASE_URL` |
|
|
188
|
+
| `anthropic` | `ANTHROPIC_API_KEY` | `ANTHROPIC_BASE_URL` |
|
|
189
|
+
| `deepseek` | `DEEPSEEK_API_KEY` | `DEEPSEEK_BASE_URL` |
|
|
190
|
+
| `zhipu` | `ZAI_API_KEY` | `ZHIPU_BASE_URL` |
|
|
191
|
+
| `faux` | 无 | 无(离线测试用) |
|
|
192
|
+
|
|
193
|
+
例如 DeepSeek:
|
|
194
|
+
|
|
195
|
+
```powershell
|
|
196
|
+
$env:DI_CODE_PROVIDER = "deepseek"
|
|
197
|
+
$env:DI_CODE_MODEL = "deepseek-v4-flash"
|
|
198
|
+
$env:DEEPSEEK_API_KEY = "your-api-key"
|
|
199
|
+
di-code "找出可能需要补测试的模块"
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
`DI_CODE_MODEL` 必须属于当前 Provider;省略时会使用内建默认模型或该 Provider 列表中的第一个模型。选错模型时,CLI 会列出可用 ID。
|
|
203
|
+
|
|
204
|
+
## 日常使用
|
|
24
205
|
|
|
25
206
|
```text
|
|
26
207
|
Usage: di-code [options] <prompt>
|
|
@@ -30,195 +211,360 @@ Options:
|
|
|
30
211
|
--mode <mode> 输出模式:print、json 或 interactive
|
|
31
212
|
--interactive 启动交互式终端模式
|
|
32
213
|
--continue, -c 继续最近修改的会话
|
|
33
|
-
--session <path> 创建或恢复 JSONL
|
|
214
|
+
--session <path> 创建或恢复 JSONL 会话(相对工作根目录)
|
|
215
|
+
--image <path> 附加本地图片;可重复传入
|
|
216
|
+
--skill <path> 加载一个 SKILL.md 文件或技能目录;可重复传入
|
|
217
|
+
--no-skills 不加载任何 Skill
|
|
218
|
+
--no-context-files 不发现或加载 AGENTS.md
|
|
219
|
+
--trust-project 信任当前项目的本地 Skills 和插件
|
|
220
|
+
--untrust-project 撤销当前项目的本地信任
|
|
221
|
+
plugin <action> 安装、列出、启用、禁用、更新或移除插件
|
|
34
222
|
-h, --help 显示帮助
|
|
35
223
|
-v, --version 显示版本
|
|
36
224
|
```
|
|
37
225
|
|
|
38
|
-
|
|
226
|
+
### 三种输出模式
|
|
39
227
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
di-code
|
|
43
|
-
di-code --
|
|
228
|
+
| 模式 | 适合场景 | 示例 |
|
|
229
|
+
| --- | --- | --- |
|
|
230
|
+
| `print`(默认) | 单次提问、shell 调用;stdout 只有最终文本 | `di-code "解释 package.json"` |
|
|
231
|
+
| `json` | 脚本或其他程序消费流式事件;每行一个 JSON 记录 | `di-code --mode json "运行测试并总结结果"` |
|
|
232
|
+
| `interactive` | 长时间结对编码、查看流式输出与工具状态 | `di-code --interactive` |
|
|
44
233
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
234
|
+
常用示例:
|
|
235
|
+
|
|
236
|
+
```powershell
|
|
237
|
+
# 只获得最终回答;错误写入 stderr,成功退出码为 0
|
|
238
|
+
di-code --print "列出主要模块及其职责"
|
|
48
239
|
|
|
49
|
-
#
|
|
50
|
-
di-code --mode json "
|
|
240
|
+
# JSONL 事件流。不要把这个模式的 stdout 当作普通文本解析
|
|
241
|
+
di-code --mode json "检查 TypeScript 配置"
|
|
51
242
|
|
|
52
|
-
#
|
|
243
|
+
# 显式进入持续对话
|
|
53
244
|
di-code --interactive
|
|
54
245
|
|
|
55
|
-
#
|
|
56
|
-
di-code --session .di-code\sessions\review.jsonl "
|
|
57
|
-
di-code --session .di-code\sessions\review.jsonl "
|
|
246
|
+
# 使用一个指定、可持续追加的会话
|
|
247
|
+
di-code --session .di-code\sessions\review.jsonl "审查当前改动"
|
|
248
|
+
di-code --session .di-code\sessions\review.jsonl "继续处理最高优先级问题"
|
|
58
249
|
|
|
59
|
-
#
|
|
250
|
+
# 恢复最近修改的会话
|
|
60
251
|
di-code --continue "继续上一次工作"
|
|
61
252
|
```
|
|
62
253
|
|
|
63
|
-
`--help` 和 `--version`
|
|
254
|
+
`--help` 和 `--version` 必须单独使用。非交互模式必须有 prompt;`--continue` 不能和 `--session` 一起使用;`--print` 不能和 `--mode json` 或 interactive 模式组合。
|
|
64
255
|
|
|
65
|
-
|
|
256
|
+
## 交互模式
|
|
66
257
|
|
|
67
|
-
|
|
258
|
+
运行 `di-code` 或 `di-code --interactive` 后,在底部输入框输入请求并按 `Enter`。生成过程中输入的新请求会排队,按顺序执行。
|
|
68
259
|
|
|
69
|
-
|
|
260
|
+
### Slash commands 与快捷键
|
|
70
261
|
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
在输入框中输入 `/`,再按 Tab 可以打开命令补全菜单:
|
|
262
|
+
输入 `/` 后按 `Tab` 可补全命令。
|
|
74
263
|
|
|
75
264
|
| 命令 | 作用 |
|
|
76
265
|
| --- | --- |
|
|
77
|
-
| `/help` |
|
|
78
|
-
| `/clear` |
|
|
79
|
-
| `/model` |
|
|
80
|
-
| `/session` |
|
|
81
|
-
| `/theme` |
|
|
82
|
-
| `/settings` |
|
|
83
|
-
| `/compact` |
|
|
84
|
-
| `/usage` |
|
|
85
|
-
| `/retry` |
|
|
86
|
-
|
|
87
|
-
|
|
266
|
+
| `/help` | 显示可用交互命令 |
|
|
267
|
+
| `/clear` | 仅清除屏幕可见消息,不删除会话文件 |
|
|
268
|
+
| `/model` | 切换当前 Provider 的模型 |
|
|
269
|
+
| `/session` | 选择或切换会话 |
|
|
270
|
+
| `/theme` | 选择 dark 或 light 主题 |
|
|
271
|
+
| `/settings` | 配置上下文压缩开关 |
|
|
272
|
+
| `/compact` | 立即压缩当前持久化会话的旧上下文 |
|
|
273
|
+
| `/usage` | 查看请求数、token、费用和上下文占用 |
|
|
274
|
+
| `/retry` | 重新提交最近失败或取消的 prompt |
|
|
275
|
+
|
|
276
|
+
| 按键 | 作用 |
|
|
277
|
+
| --- | --- |
|
|
278
|
+
| `Enter` | 发送当前 prompt |
|
|
279
|
+
| `Esc` | 取消当前模型请求;没有请求时关闭补全或选择器 |
|
|
280
|
+
| `Ctrl+C` | 退出并恢复终端状态 |
|
|
281
|
+
| `Ctrl+O` / `Ctrl+L` | 打开模型 / 会话选择器 |
|
|
282
|
+
| `Ctrl+T` / `Ctrl+S` | 打开主题 / 设置 |
|
|
283
|
+
| `Ctrl+R` | 重试最近失败的 prompt |
|
|
284
|
+
| `Tab` | 补全 slash command |
|
|
285
|
+
|
|
286
|
+
取消只停止当前请求,不会删除已经追加到磁盘的会话记录。之后可使用 `/retry` 再试一次。
|
|
287
|
+
|
|
288
|
+
## 会话、图片与内置工具
|
|
289
|
+
|
|
290
|
+
### 会话
|
|
291
|
+
|
|
292
|
+
交互式启动默认会在工作根目录的 `.di-code/sessions/` 创建版本化 JSONL 会话。记录为 append-only(只追加)格式;完整磁盘历史和发送给模型的压缩上下文分开保存。可通过 `/session`、`--session` 或 `--continue` 恢复它们。
|
|
293
|
+
|
|
294
|
+
会话可能包含你的 prompt、模型回答、工具结果和图片内容。不要在 prompt 或图片中提交不应保留在项目本地历史中的密钥或敏感材料。
|
|
295
|
+
|
|
296
|
+
### 图片
|
|
297
|
+
|
|
298
|
+
非交互模式使用 `--image`,可重复传入:
|
|
299
|
+
|
|
300
|
+
```powershell
|
|
301
|
+
di-code --image .\diagram.png "解释这张架构图"
|
|
302
|
+
di-code --image .\before.png --image .\after.webp "比较两张图"
|
|
303
|
+
```
|
|
304
|
+
|
|
305
|
+
只支持 PNG、JPEG、WebP、GIF;文件根据内容签名而不是扩展名校验。每条 prompt 最多 4 张、每张最多 5 MiB,并且当前模型必须声明支持图片输入。
|
|
306
|
+
|
|
307
|
+
交互模式中可输入 `@diagram.png`;有空格的路径使用 `@"architecture diagram.png"`。也可将图片拖入终端。读取剪贴板图片时,Windows 使用 `Alt+V`,macOS/Linux 使用 `Ctrl+V`。剪贴板临时文件放在 `.di-code/clipboard/`,发送、删除引用或退出后会清理。
|
|
308
|
+
|
|
309
|
+
### Agent 可调用的内置工具
|
|
310
|
+
|
|
311
|
+
模型可按任务需要调用以下工具;请在可信项目中运行,并在 prompt 中明确希望它执行或不执行的动作。
|
|
312
|
+
|
|
313
|
+
| 工具 | 功能 | 限制 |
|
|
314
|
+
| --- | --- | --- |
|
|
315
|
+
| `read` | 读取工作根目录中的 UTF-8 文本文件 | 最多 2,000 行、50 KiB;支持 `offset`、`limit` |
|
|
316
|
+
| `write` | 创建或完全覆盖 UTF-8 文件 | 自动创建父目录 |
|
|
317
|
+
| `edit` | 对文件做一次唯一的精确文本替换 | 找不到或匹配多处时拒绝写入;保留 BOM 和换行风格 |
|
|
318
|
+
| `bash` | 在工作根目录执行本地命令 | 默认 30 秒、最大 5 分钟;stdout/stderr 各截断至 50 KiB |
|
|
319
|
+
|
|
320
|
+
文件工具限制目标在工作根目录内并拒绝二进制文件。`bash` 在 Windows 使用 PowerShell,在其他平台使用 `/bin/sh`;它并不是操作系统级沙箱。模型和插件仍可能尝试执行危险操作,因此请审查任务和结果,并避免在包含无关敏感文件的目录运行。
|
|
321
|
+
|
|
322
|
+
## 项目说明与 Skills
|
|
323
|
+
|
|
324
|
+
### `AGENTS.md`:给 Agent 的项目规则
|
|
325
|
+
|
|
326
|
+
启动时,di-code 会在全局 Agent 目录,以及当前工作目录到文件系统根目录的祖先路径中发现 `AGENTS.md`(或 `AGENTS.MD`)。这些文件会作为项目上下文提供给模型,适合记录构建命令、代码风格、测试要求和目录约定。
|
|
327
|
+
|
|
328
|
+
项目文件是**不可信的上下文**,不能改变 CLI 的真实路径、权限或安全边界。临时忽略所有这类文件:
|
|
329
|
+
|
|
330
|
+
```powershell
|
|
331
|
+
di-code --no-context-files "只分析当前文件,不遵循项目说明"
|
|
332
|
+
```
|
|
333
|
+
|
|
334
|
+
### Skills:可按需加载的专业工作流
|
|
335
|
+
|
|
336
|
+
Skill 是带少量 YAML frontmatter 的 `SKILL.md` 文件。它不是可执行代码,而是一组可复用的 Markdown 指令,例如“如何发布版本”“如何处理数据库迁移”。默认情况下,模型看到 Skill 的名称和描述;任务匹配时,它会先用 `read` 读取完整 Skill,再按其步骤工作。
|
|
337
|
+
|
|
338
|
+
Skill 的发现位置和优先级如下:
|
|
339
|
+
|
|
340
|
+
1. `--skill <path>` 显式传入的文件或目录;
|
|
341
|
+
2. 已信任项目的 `.di-code/skills/` 与 `.pi/skills/`;
|
|
342
|
+
3. 用户全局目录 `~/.di-code/skills/`。
|
|
343
|
+
|
|
344
|
+
目录会递归查找名为 `SKILL.md` 的文件,跳过隐藏目录和 `node_modules`。同名时先发现的 Skill 生效;冲突和格式错误会产生诊断。项目 Skill 不会在项目未信任时加载。
|
|
345
|
+
|
|
346
|
+
创建项目 Skill:
|
|
88
347
|
|
|
89
348
|
```text
|
|
90
|
-
/
|
|
91
|
-
/
|
|
92
|
-
/
|
|
93
|
-
|
|
349
|
+
my-project/
|
|
350
|
+
.di-code/
|
|
351
|
+
skills/
|
|
352
|
+
release-check/
|
|
353
|
+
SKILL.md
|
|
94
354
|
```
|
|
95
355
|
|
|
96
|
-
|
|
356
|
+
`.di-code/skills/release-check/SKILL.md`:
|
|
97
357
|
|
|
98
|
-
|
|
358
|
+
```markdown
|
|
359
|
+
---
|
|
360
|
+
name: release-check
|
|
361
|
+
description: Verify the release checklist before publishing a package.
|
|
362
|
+
---
|
|
99
363
|
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
| `Ctrl+C` | 退出交互模式并恢复终端状态 |
|
|
105
|
-
| `Ctrl+O` | 打开模型选择器,与 `/model` 相同 |
|
|
106
|
-
| `Ctrl+L` | 打开会话选择器,与 `/session` 相同 |
|
|
107
|
-
| `Ctrl+T` | 打开主题选择器,与 `/theme` 相同 |
|
|
108
|
-
| `Ctrl+S` | 打开设置,与 `/settings` 相同 |
|
|
109
|
-
| `Ctrl+R` | 重试最近一次失败的 prompt,与 `/retry` 相同 |
|
|
110
|
-
| `Tab` | 补全斜杠命令;编辑普通文本时继续由编辑器处理 |
|
|
364
|
+
1. Read the unreleased changelog section.
|
|
365
|
+
2. Run the project test command before any release action.
|
|
366
|
+
3. Report failures; never publish unless the user explicitly asks.
|
|
367
|
+
```
|
|
111
368
|
|
|
112
|
-
|
|
369
|
+
规则:
|
|
113
370
|
|
|
114
|
-
|
|
371
|
+
- `name` 必填,最长 64 个字符,只能使用小写字母、数字和单连字符;
|
|
372
|
+
- `description` 必填,最长 1,024 个字符;
|
|
373
|
+
- 文件最大 256 KiB,首行和 frontmatter 结束行必须都是 `---`;
|
|
374
|
+
- 可加 `disable-model-invocation: true` 隐藏该 Skill,使模型不自动选择它,但用户仍可手动调用。
|
|
115
375
|
|
|
116
|
-
|
|
376
|
+
首次使用项目本地 Skill 或插件前,明确授予信任:
|
|
117
377
|
|
|
118
378
|
```powershell
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
379
|
+
Set-Location D:\work\my-project
|
|
380
|
+
di-code --trust-project --interactive
|
|
381
|
+
```
|
|
382
|
+
|
|
383
|
+
该决定保存在用户全局 Agent 目录中,并按当前项目路径生效。撤销:
|
|
384
|
+
|
|
385
|
+
```powershell
|
|
386
|
+
di-code --untrust-project --interactive
|
|
387
|
+
```
|
|
388
|
+
|
|
389
|
+
手动选择一个已加载 Skill 的语法为 `/skill:<name> [你的具体请求]`,可在普通 prompt 或交互输入框中使用:
|
|
390
|
+
|
|
391
|
+
```powershell
|
|
392
|
+
di-code "/skill:release-check 检查这个仓库是否已经满足发布前置条件"
|
|
123
393
|
```
|
|
124
394
|
|
|
125
|
-
|
|
395
|
+
或临时加载不属于项目目录的 Skill:
|
|
396
|
+
|
|
397
|
+
```powershell
|
|
398
|
+
di-code --skill D:\team-skills\release-check "按 release-check 流程检查"
|
|
399
|
+
di-code --no-skills "不要加载任何 Skill"
|
|
400
|
+
```
|
|
126
401
|
|
|
127
|
-
|
|
402
|
+
> Skill 是提示词上下文,不是权限机制。只把可信、准确的 Skill 放入全局目录或授予项目信任;Skill 中提及的相对路径以该 Skill 所在目录为基准。
|
|
128
403
|
|
|
129
|
-
|
|
404
|
+
## 插件
|
|
405
|
+
|
|
406
|
+
插件是与 di-code 运行在**同一 Node.js 进程**中的 JavaScript/TypeScript 代码。它可以注册:
|
|
407
|
+
|
|
408
|
+
1. 供模型调用的工具;
|
|
409
|
+
2. interactive 模式中的 slash command;
|
|
410
|
+
3. Agent 与会话生命周期事件处理器。
|
|
411
|
+
|
|
412
|
+
插件不是 MCP Server,也没有热重载、插件市场或真正的权限沙箱。manifest 的 `permissions` 是声明和审计信息,**不会**阻止插件访问文件、网络或子进程。因此,只安装或信任可信来源的插件。
|
|
413
|
+
|
|
414
|
+
### 使用项目本地插件
|
|
415
|
+
|
|
416
|
+
项目插件位置固定:
|
|
417
|
+
|
|
418
|
+
```text
|
|
419
|
+
<project>/.di-code/plugins/<plugin-id>/
|
|
420
|
+
plugin.json
|
|
421
|
+
src/index.ts
|
|
422
|
+
```
|
|
423
|
+
|
|
424
|
+
最小 `plugin.json`:
|
|
130
425
|
|
|
131
426
|
```json
|
|
132
427
|
{
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
"contextWindow": 200000,//可选,根据实际情况填写
|
|
144
|
-
"maxTokens": 32000 //可选
|
|
145
|
-
}]
|
|
146
|
-
}
|
|
147
|
-
}
|
|
428
|
+
"apiVersion": 1,
|
|
429
|
+
"id": "project-status",
|
|
430
|
+
"name": "Project Status",
|
|
431
|
+
"version": "0.1.0",
|
|
432
|
+
"entry": "./src/index.ts",
|
|
433
|
+
"permissions": {
|
|
434
|
+
"filesystem": "none",
|
|
435
|
+
"network": [],
|
|
436
|
+
"process": []
|
|
437
|
+
}
|
|
148
438
|
}
|
|
149
439
|
```
|
|
150
440
|
|
|
151
|
-
|
|
441
|
+
入口必须默认导出一个 factory 函数。项目插件仅在运行过 `di-code --trust-project --interactive` 后导入。插件工具名必须采用 `<plugin-id>__<tool-name>`,避免与内置工具或其他插件冲突。
|
|
152
442
|
|
|
153
|
-
|
|
443
|
+
完整的 TypeBox schema、工具、slash command、生命周期事件及安全责任,请阅读仓库文档:[插件使用指南](https://github.com/qddidi/di-code/blob/main/docs/%E6%8F%92%E4%BB%B6%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97.md)。
|
|
154
444
|
|
|
155
|
-
|
|
445
|
+
### 管理全局插件
|
|
156
446
|
|
|
157
|
-
|
|
447
|
+
全局托管插件安装在用户的 `~/.di-code/` 下,只有已启用的插件会在启动时加载:
|
|
158
448
|
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
449
|
+
```powershell
|
|
450
|
+
# 本地目录、npm 包或 git URL 都可以作为来源
|
|
451
|
+
di-code plugin install D:\work\my-plugin
|
|
452
|
+
di-code plugin install npm:@acme/di-code-project-status@1.0.0
|
|
453
|
+
di-code plugin install git:https://github.com/acme/di-code-project-status.git
|
|
454
|
+
|
|
455
|
+
# 查看 ID、启用状态和版本
|
|
456
|
+
di-code plugin list
|
|
457
|
+
|
|
458
|
+
di-code plugin disable project-status
|
|
459
|
+
di-code plugin enable project-status
|
|
460
|
+
di-code plugin update project-status
|
|
461
|
+
di-code plugin remove project-status
|
|
462
|
+
```
|
|
166
463
|
|
|
167
|
-
|
|
464
|
+
安装过程固定使用 `npm --ignore-scripts`,但这并不使插件本身安全:插件在加载时仍是本机代码。`plugin` 管理命令不需要配置 Provider。
|
|
168
465
|
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
| `name` | string | 默认等于 `id` |
|
|
173
|
-
| `api` | string | 默认继承 Provider 的 `api`;模型值优先 |
|
|
174
|
-
| `baseUrl` | string | 默认继承 Provider 的 `baseUrl`;模型值优先 |
|
|
175
|
-
| `input` | array | 默认 `["text"]`;可填 `"text"`、`"image"` 或两者 |
|
|
176
|
-
| `reasoning` | boolean | 默认 `false`,表示模型是否支持思考内容 |
|
|
177
|
-
| `contextWindow` | 正整数 | 默认 `128000`,模型上下文 token 上限 |
|
|
178
|
-
| `maxTokens` | 正整数 | 默认 `16384`,单次最大输出 token;也支持 `maxOutputTokens` |
|
|
179
|
-
| `cost.input` | 非负数 | 默认 `0`,美元/百万输入 token |
|
|
180
|
-
| `cost.output` | 非负数 | 默认 `0`,美元/百万输出 token |
|
|
181
|
-
| `cost.cacheRead` | 非负数 | 默认 `0`,美元/百万缓存读取 token |
|
|
182
|
-
| `cost.cacheWrite` | 非负数 | 默认 `0`,美元/百万缓存写入 token |
|
|
183
|
-
|
|
184
|
-
完整示例:
|
|
466
|
+
## 自定义 Provider
|
|
467
|
+
|
|
468
|
+
自定义 OpenAI Responses 兼容网关或私有模型时,在工作根目录创建 `.di-code/settings.json`。凭据推荐使用环境变量引用:
|
|
185
469
|
|
|
186
470
|
```json
|
|
187
471
|
{
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
472
|
+
"providers": {
|
|
473
|
+
"company-gateway": {
|
|
474
|
+
"name": "Company Gateway",
|
|
475
|
+
"api": "openai-responses",
|
|
476
|
+
"baseUrl": "https://gateway.example.com/v1",
|
|
477
|
+
"apiKey": "$COMPANY_GATEWAY_API_KEY",
|
|
478
|
+
"models": [
|
|
479
|
+
{
|
|
480
|
+
"id": "company-coder",
|
|
481
|
+
"name": "Company Coder",
|
|
482
|
+
"input": ["text", "image"],
|
|
483
|
+
"reasoning": true,
|
|
484
|
+
"contextWindow": 200000,
|
|
485
|
+
"maxTokens": 32000
|
|
486
|
+
}
|
|
487
|
+
]
|
|
488
|
+
}
|
|
489
|
+
}
|
|
490
|
+
}
|
|
491
|
+
```
|
|
492
|
+
|
|
493
|
+
然后设置 Provider、模型和凭据:
|
|
494
|
+
|
|
495
|
+
```powershell
|
|
496
|
+
$env:COMPANY_GATEWAY_API_KEY = "your-api-key"
|
|
497
|
+
$env:DI_CODE_PROVIDER = "company-gateway"
|
|
498
|
+
$env:DI_CODE_MODEL = "company-coder"
|
|
499
|
+
di-code "总结当前项目"
|
|
500
|
+
```
|
|
501
|
+
|
|
502
|
+
`api` 可为 `openai-responses`、`deepseek-responses`、`zhipu-chat-completions` 或 `anthropic-messages`。自定义 Provider 必须提供 `models`;每个模型可设置 `id`、`name`、`input`、`reasoning`、`contextWindow`、`maxTokens`(或 `maxOutputTokens`)及按美元/百万 token 计的 `cost`。
|
|
503
|
+
|
|
504
|
+
`apiKey` 支持 `$NAME` 或 `${NAME}` 环境变量引用。虽然可以直接写入字符串,但不要把 key 写到 `settings.json` 或提交到 Git。`baseUrl` 必须是绝对 `http`/`https` URL。
|
|
505
|
+
|
|
506
|
+
## 脚本和 RPC 集成
|
|
507
|
+
|
|
508
|
+
### 处理 CLI 退出码
|
|
509
|
+
|
|
510
|
+
脚本中可根据退出码处理结果:`0` 表示成功,`1` 表示参数错误、Provider 未配置或运行失败。print 模式的最终回答写 stdout;错误写 stderr,避免混入回答。
|
|
511
|
+
|
|
512
|
+
```powershell
|
|
513
|
+
di-code --print "生成变更摘要"
|
|
514
|
+
if ($LASTEXITCODE -ne 0) {
|
|
515
|
+
throw "di-code failed with exit code $LASTEXITCODE"
|
|
516
|
+
}
|
|
517
|
+
```
|
|
518
|
+
|
|
519
|
+
JSON 模式的 stdout 是逐行版本化事件,适合流式消费:
|
|
520
|
+
|
|
521
|
+
```powershell
|
|
522
|
+
di-code --mode json "检查测试状态" | ForEach-Object {
|
|
523
|
+
$event = $_ | ConvertFrom-Json
|
|
524
|
+
# 根据 $event.type 处理事件
|
|
212
525
|
}
|
|
213
526
|
```
|
|
214
527
|
|
|
215
|
-
|
|
528
|
+
### JSONL RPC
|
|
529
|
+
|
|
530
|
+
`di-code-rpc` 是供宿主程序启动的子进程入口,不是交互命令。它从 stdin 接收一行一个 JSON 请求,并从 stdout 写一行一个版本化响应或事件;stderr 仅用于诊断。
|
|
531
|
+
|
|
532
|
+
公开 RPC 方法:
|
|
533
|
+
|
|
534
|
+
| 方法 | 参数 | 结果 |
|
|
535
|
+
| --- | --- | --- |
|
|
536
|
+
| `get_state` | `{}` | Session ID、模型、是否正在生成、消息数 |
|
|
537
|
+
| `prompt` | `{ "message": "..." }` | 最终 `AssistantMessage`,中间事件另行输出 |
|
|
538
|
+
| `cancel` | `{ "requestId": "..." }` | 是否找到并取消该请求 |
|
|
539
|
+
|
|
540
|
+
Node.js 宿主从公开入口导入 SDK:
|
|
216
541
|
|
|
217
|
-
|
|
542
|
+
```ts
|
|
543
|
+
import { RpcClient, RPC_PROTOCOL_VERSION } from "@di-code/coding-agent/rpc";
|
|
544
|
+
```
|
|
218
545
|
|
|
219
|
-
|
|
546
|
+
需要监督子进程生命周期时,使用 `@di-code/orchestrator`,不要依赖 coding-agent 的内部文件路径。
|
|
220
547
|
|
|
221
|
-
##
|
|
548
|
+
## 安全边界与故障排查
|
|
222
549
|
|
|
223
|
-
-
|
|
224
|
-
-
|
|
550
|
+
- 在可信项目根目录运行;`bash` 不是沙箱,插件也没有沙箱。
|
|
551
|
+
- API key 只放环境变量或秘密管理工具。不要放入 prompt、Skill、插件源码、会话、图片或 Git。
|
|
552
|
+
- 项目 Skill 与插件默认不加载,直到执行 `--trust-project`;该开关是“是否导入项目本地代码/指令”的决定,不会赋予额外系统权限。
|
|
553
|
+
- Provider、模型、图片、配置和工具参数都会校验;外部项目内容和模型输出仍应视作不可信输入。
|
|
554
|
+
|
|
555
|
+
| 问题 | 优先检查 |
|
|
556
|
+
| --- | --- |
|
|
557
|
+
| `Provider is not configured` | 设置 `DI_CODE_PROVIDER` 及对应 API key;或在 TTY 中运行 `di-code` 使用向导;离线测试使用 `faux` |
|
|
558
|
+
| `Unknown model` | 确认 `DI_CODE_MODEL` 属于当前 `DI_CODE_PROVIDER` |
|
|
559
|
+
| 项目 Skill / 插件没有加载 | 目录是否为 `.di-code/skills` 或 `.di-code/plugins`,并运行 `di-code --trust-project --interactive` |
|
|
560
|
+
| `Unknown skill` | Skill 是否有正确 `SKILL.md` frontmatter,名称是否匹配 `/skill:<name>`;检查是否被 `--no-skills` 禁用 |
|
|
561
|
+
| `plugin_diagnostic` | 检查 `plugin.json`、默认导出、入口路径及 stderr 的 JSON 诊断;详见插件指南 |
|
|
562
|
+
| 图片被拒绝 | 确认格式、4 张/5 MiB 限制,以及模型 `input` 包含 `image` |
|
|
563
|
+
| 文件工具无法访问路径 | 从工作根目录启动,且目标未越出根目录;二进制文件不支持 |
|
|
564
|
+
|
|
565
|
+
## 相关链接
|
|
566
|
+
|
|
567
|
+
- 项目源码与完整开发文档:<https://github.com/qddidi/di-code>
|
|
568
|
+
- 插件详细指南:[GitHub 上的《插件使用指南》](https://github.com/qddidi/di-code/blob/main/docs/%E6%8F%92%E4%BB%B6%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97.md)
|
|
569
|
+
- 问题反馈:<https://github.com/qddidi/di-code/issues>
|
|
570
|
+
- 许可证:[MIT](https://github.com/qddidi/di-code/blob/main/LICENSE)
|