@ia-ccun/code-agent-cli 0.0.50 → 0.0.51-beta.2
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 +92 -12
- package/bin/cli.js +1 -2
- package/config/agent/agents/agent-example.md +88 -0
- package/config/agent/extensions/aicode-tips.ts +16 -1
- package/config/agent/extensions/bash-check.ts +1 -1
- package/config/agent/extensions/context-monitor.ts +1 -1
- package/config/agent/extensions/context.ts +3 -3
- package/config/agent/extensions/custom-footer.ts +3 -3
- package/config/agent/extensions/custom.ts +24 -20
- package/config/agent/extensions/error-monitor.ts +4 -3
- package/config/agent/extensions/msg-debug.ts +16 -1
- package/config/agent/extensions/review.ts +3 -3
- package/config/agent/extensions/working-msg.ts +2 -2
- package/config/agent/help.md +114 -19
- package/config/agent/settings.json +44 -5
- package/dist/index.d.ts +1 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -3
- package/dist/index.js.map +1 -1
- package/package.json +6 -5
- package/scripts/postinstall.js +5 -4
package/README.md
CHANGED
|
@@ -217,22 +217,48 @@ aicode-cli --list-models # 列出可用模型
|
|
|
217
217
|
|
|
218
218
|
### 创建自定义 Skill
|
|
219
219
|
|
|
220
|
-
在 `~/.aicode-cli/skills
|
|
220
|
+
在 `~/.aicode-cli/agent/skills/<skill-name>/` 目录下创建 `SKILL.md` 文件:
|
|
221
|
+
|
|
222
|
+
```bash
|
|
223
|
+
# 创建技能目录
|
|
224
|
+
mkdir -p ~/.aicode-cli/agent/skills/my-skill
|
|
225
|
+
|
|
226
|
+
# 创建 SKILL.md
|
|
227
|
+
cat > ~/.aicode-cli/agent/skills/my-skill/SKILL.md << 'EOF'
|
|
228
|
+
---
|
|
229
|
+
name: my-skill
|
|
230
|
+
description: "技能的简短描述。Use when 触发条件描述。"
|
|
231
|
+
metadata:
|
|
232
|
+
version: "1.0.0"
|
|
233
|
+
author: "your-name"
|
|
234
|
+
---
|
|
221
235
|
|
|
222
|
-
```markdown
|
|
223
236
|
# My Skill
|
|
224
237
|
|
|
225
238
|
## 描述
|
|
226
|
-
|
|
239
|
+
技能的详细说明
|
|
227
240
|
|
|
228
241
|
## 触发方式
|
|
229
|
-
|
|
242
|
+
`/skill:my-skill`
|
|
230
243
|
|
|
231
244
|
## 执行步骤
|
|
232
245
|
1. 步骤一
|
|
233
246
|
2. 步骤二
|
|
247
|
+
EOF
|
|
234
248
|
```
|
|
235
249
|
|
|
250
|
+
**字段说明:**
|
|
251
|
+
|
|
252
|
+
| 字段 | 必填 | 说明 |
|
|
253
|
+
|------|------|------|
|
|
254
|
+
| `name` | 是 | 技能标识符(小写+连字符),与目录名一致 |
|
|
255
|
+
| `description` | 是 | 触发条件描述,Agent 据此判断何时使用该技能 |
|
|
256
|
+
| `disable-model-invocation` | 否 | 设为 `true` 时禁止调用 LLM,纯本地执行 |
|
|
257
|
+
| `metadata.version` | 否 | 版本号 |
|
|
258
|
+
| `metadata.author` | 否 | 作者 |
|
|
259
|
+
|
|
260
|
+
> ⚠️ 文件名必须为 `SKILL.md`,且放在独立目录中(目录名与 `name` 一致)。
|
|
261
|
+
|
|
236
262
|
## 预置 Prompts
|
|
237
263
|
|
|
238
264
|
内置 Prompt 模板位于 `config/agent/prompts/`(打包在 npm 包中)
|
|
@@ -246,6 +272,68 @@ aicode-cli --list-models # 列出可用模型
|
|
|
246
272
|
| `/feat` | 功能开发 - 辅助功能开发 |
|
|
247
273
|
| `/workflow` | 工作流 - 执行复杂工作流 |
|
|
248
274
|
|
|
275
|
+
## 自定义 Agents
|
|
276
|
+
|
|
277
|
+
内置 Agent 示例位于 `config/agent/agents/`(打包在 npm 包中)
|
|
278
|
+
|
|
279
|
+
| Agent | 说明 |
|
|
280
|
+
|-------|------|
|
|
281
|
+
| `agent-example` | 示例 Agent - 展示如何创建自定义 subagent |
|
|
282
|
+
|
|
283
|
+
### 创建自定义 Agent
|
|
284
|
+
|
|
285
|
+
在 `~/.aicode-cli/agent/agents/` 目录下创建 `<name>.md` 文件:
|
|
286
|
+
|
|
287
|
+
```bash
|
|
288
|
+
# 创建 Agent 文件
|
|
289
|
+
cat > ~/.aicode-cli/agent/agents/my-agent.md << 'EOF'
|
|
290
|
+
---
|
|
291
|
+
name: my-agent
|
|
292
|
+
description: "自定义 Agent 的简短描述"
|
|
293
|
+
tools: "read,bash,write,edit"
|
|
294
|
+
model: "qwen3.5-35b-a3b"
|
|
295
|
+
---
|
|
296
|
+
|
|
297
|
+
# My Agent
|
|
298
|
+
|
|
299
|
+
## 角色
|
|
300
|
+
你是一个专业的代码优化助手...
|
|
301
|
+
|
|
302
|
+
## 能力
|
|
303
|
+
1. 代码分析
|
|
304
|
+
2. 性能优化
|
|
305
|
+
3. 重构建议
|
|
306
|
+
|
|
307
|
+
## 工作流程
|
|
308
|
+
1. 阅读代码
|
|
309
|
+
2. 分析问题
|
|
310
|
+
3. 提供建议
|
|
311
|
+
EOF
|
|
312
|
+
```
|
|
313
|
+
|
|
314
|
+
**字段说明:**
|
|
315
|
+
|
|
316
|
+
| 字段 | 必填 | 说明 |
|
|
317
|
+
|------|------|------|
|
|
318
|
+
| `name` | 是 | Agent 标识符(小写+连字符) |
|
|
319
|
+
| `description` | 是 | 功能描述,用户据此选择 Agent |
|
|
320
|
+
| `tools` | 否 | 逗号分隔的工具列表 |
|
|
321
|
+
| `model` | 否 | 指定使用的模型 |
|
|
322
|
+
|
|
323
|
+
### 使用 Agent
|
|
324
|
+
|
|
325
|
+
在对话中自然语言调用:
|
|
326
|
+
|
|
327
|
+
```
|
|
328
|
+
使用 my-agent 来优化这段代码
|
|
329
|
+
```
|
|
330
|
+
|
|
331
|
+
或配合 pi-subagents 使用:
|
|
332
|
+
|
|
333
|
+
```
|
|
334
|
+
/run my-agent "Review this implementation"
|
|
335
|
+
```
|
|
336
|
+
|
|
249
337
|
## 项目结构
|
|
250
338
|
|
|
251
339
|
```
|
|
@@ -265,11 +353,3 @@ aicode-cli --list-models # 列出可用模型
|
|
|
265
353
|
│ └── postinstall.js # 安装脚本
|
|
266
354
|
└── package.json
|
|
267
355
|
```
|
|
268
|
-
|
|
269
|
-
## 文档
|
|
270
|
-
|
|
271
|
-
更多功能请参考 [pi-coding-agent 文档](https://github.com/badlogic/pi-mono/tree/main/packages/coding-agent)
|
|
272
|
-
|
|
273
|
-
## License
|
|
274
|
-
|
|
275
|
-
MIT
|
package/bin/cli.js
CHANGED
|
@@ -193,8 +193,7 @@ async function checkForUpdates() {
|
|
|
193
193
|
}
|
|
194
194
|
checkForUpdates();
|
|
195
195
|
|
|
196
|
-
|
|
197
|
-
const piAgentPathUrl = new URL('../node_modules/@mariozechner/pi-coding-agent/dist/cli.js', import.meta.url);
|
|
196
|
+
const piAgentPathUrl = new URL('../node_modules/@earendil-works/pi-coding-agent/dist/cli.js', import.meta.url);
|
|
198
197
|
const piAgentPath = fileURLToPath(piAgentPathUrl); // 解码中文路径
|
|
199
198
|
|
|
200
199
|
// 获取本地版本号
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: agent-example
|
|
3
|
+
description: "示例 Agent - 展示如何创建自定义 subagent。可删除或复制此文件作为模板。"
|
|
4
|
+
tools: "read,bash,write,edit"
|
|
5
|
+
model: "qwen3.5-35b-a3b"
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# 示例 Agent
|
|
9
|
+
|
|
10
|
+
> 💡 这是一个自定义 subagent 示例,展示如何创建具有个性和能力的 Agent。
|
|
11
|
+
> 你可以复制此文件,修改 frontmatter 和下方内容来创建自己的 Agent。
|
|
12
|
+
|
|
13
|
+
## 角色
|
|
14
|
+
|
|
15
|
+
你是一个专业的代码优化助手,专注于提升代码质量和开发效率。
|
|
16
|
+
|
|
17
|
+
## 能力
|
|
18
|
+
|
|
19
|
+
1. **代码分析**:深入理解代码逻辑,识别潜在问题
|
|
20
|
+
2. **性能优化**:发现性能瓶颈,提供优化方案
|
|
21
|
+
3. **重构建议**:改善代码结构和可读性
|
|
22
|
+
4. **最佳实践**:推荐行业标准和设计模式
|
|
23
|
+
|
|
24
|
+
## 工作流程
|
|
25
|
+
|
|
26
|
+
1. 首先使用 `read` 工具阅读需要优化的代码
|
|
27
|
+
2. 分析问题并给出具体建议
|
|
28
|
+
3. 使用 `edit` 工具实施改进(需用户确认)
|
|
29
|
+
4. 使用 `bash` 工具验证修改结果
|
|
30
|
+
|
|
31
|
+
## 输出风格
|
|
32
|
+
|
|
33
|
+
- 简洁明了,避免冗长解释
|
|
34
|
+
- 使用 Markdown 格式展示代码变更
|
|
35
|
+
- 标注修改原因和预期效果
|
|
36
|
+
- 对重大变更提供回退方案
|
|
37
|
+
|
|
38
|
+
---
|
|
39
|
+
|
|
40
|
+
## 📖 创建自定义 Agent 指南
|
|
41
|
+
|
|
42
|
+
### 文件位置
|
|
43
|
+
|
|
44
|
+
| 类型 | 路径 |
|
|
45
|
+
|------|----------------------------------------|
|
|
46
|
+
| 用户级 | `~/.aicode-cli/agent/agents/<name>.md` |
|
|
47
|
+
| 项目级 | `.aicode-cli/agents/<name>.md` |
|
|
48
|
+
|
|
49
|
+
### 文件结构
|
|
50
|
+
|
|
51
|
+
Agent 文件必须是 `.md` 格式,包含 YAML frontmatter 和 Markdown body:
|
|
52
|
+
|
|
53
|
+
```markdown
|
|
54
|
+
---
|
|
55
|
+
name: my-agent # 必填:Agent 名称(小写+连字符)
|
|
56
|
+
description: "简短描述" # 必填:Agent 功能描述
|
|
57
|
+
tools: "read,bash,write" # 可选:允许使用的工具(逗号分隔)
|
|
58
|
+
model: "provider/model-id" # 可选:指定使用的模型
|
|
59
|
+
---
|
|
60
|
+
|
|
61
|
+
# Agent 标题
|
|
62
|
+
|
|
63
|
+
这里是 Agent 的 system prompt,定义:
|
|
64
|
+
- 角色定位
|
|
65
|
+
- 能力和职责
|
|
66
|
+
- 工作流程
|
|
67
|
+
- 输出风格
|
|
68
|
+
- 任何你希望 Agent 遵循的规则
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
### Frontmatter 字段说明
|
|
72
|
+
|
|
73
|
+
| 字段 | 必填 | 说明 |
|
|
74
|
+
|------|------|------|
|
|
75
|
+
| `name` | 是 | Agent 标识符,小写字母和连字符 |
|
|
76
|
+
| `description` | 是 | 功能描述,用户通过此描述选择 Agent |
|
|
77
|
+
| `tools` | 否 | 逗号分隔的工具列表,不填则使用默认工具集 |
|
|
78
|
+
| `model` | 否 | 指定模型,如 `qwen3.5-35b-a3b` |
|
|
79
|
+
|
|
80
|
+
### 使用方式
|
|
81
|
+
|
|
82
|
+
在对话中调用 subagent 时,aicode 会自动发现并使用这些自定义 Agent:
|
|
83
|
+
|
|
84
|
+
```
|
|
85
|
+
使用 agent-example 来优化这段代码
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
或在 settings.json 的 `subagents.agentOverrides` 中配置模型覆盖。
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* 技巧列表包含快捷键、命令使用及联系方式提示
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
|
-
import type { ExtensionAPI, ExtensionContext } from "@
|
|
9
|
+
import type { ExtensionAPI, ExtensionContext } from "@earendil-works/pi-coding-agent";
|
|
10
10
|
|
|
11
11
|
const AICODE_TIPS = [
|
|
12
12
|
"@ 快速搜索项目文件",
|
|
@@ -102,6 +102,21 @@ const AICODE_TIPS = [
|
|
|
102
102
|
"插话消息会打断 AI 正在执行的工具,等待响应",
|
|
103
103
|
"排队消息静默等待,AI 空闲时自动发送",
|
|
104
104
|
"可在 /settings 中调整消息发送模式和行为偏好",
|
|
105
|
+
// 记忆功能使用技巧
|
|
106
|
+
"💡 记忆功能自动记录会话中的关键经验,下次会话自动应用",
|
|
107
|
+
"💡 在对话中说'记住这个'可手动保存经验到记忆库",
|
|
108
|
+
"💡 记忆功能支持选择性注入 (selective),只注入相关记忆避免干扰",
|
|
109
|
+
"💡 说'忘记 XXX'可删除特定记忆条目",
|
|
110
|
+
"💡 记忆会在会话结束时自动整合优化,提炼更有价值的经验",
|
|
111
|
+
"💡 记忆功能示例:记住代码规范后,后续开发自动遵循该规范",
|
|
112
|
+
"💡 记忆功能示例:记录常见错误模式,主动避免重复犯错",
|
|
113
|
+
"💡 记忆功能示例:保存项目特定配置,新会话自动加载上下文",
|
|
114
|
+
// Subagent 使用方法
|
|
115
|
+
"🤖 说'使用 subagent 探索当前代码关于权限校验的实现'可快速定位相关代码",
|
|
116
|
+
"🤖 说'使用 subagent 为这个功能制定实施计划'可生成详细的开发步骤",
|
|
117
|
+
"🤖 说'使用 subagent 执行这个计划'可自动完成代码实现",
|
|
118
|
+
"🤖 说'使用 subagent 审查刚写的代码'可获得代码质量反馈",
|
|
119
|
+
"🤖 说'使用 subagent 给这个方案提点意见'可获得第二视角的评估建议",
|
|
105
120
|
// 联系方式提示
|
|
106
121
|
"⚠️ 任何疑问或需求可联系 xujianjiang,支持需求对接开发、系统集成与扩展",
|
|
107
122
|
"⚠️ 内网手册参考 UniDoc《2026.03 AICode Agent CLI 编码智能体使用手册》",
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
* 危险模式配置: config/agent/dangerous-patterns.json
|
|
11
11
|
*/
|
|
12
12
|
|
|
13
|
-
import type { ExtensionAPI } from "@
|
|
13
|
+
import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
|
|
14
14
|
import { readFileSync, existsSync } from "fs";
|
|
15
15
|
import { join } from "path";
|
|
16
16
|
import { homedir } from "os";
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
* - 100% : 阻止继续并强制提示压缩
|
|
15
15
|
*/
|
|
16
16
|
|
|
17
|
-
import type { ExtensionAPI, ExtensionContext, ToolResultEvent } from "@
|
|
17
|
+
import type { ExtensionAPI, ExtensionContext, ToolResultEvent } from "@earendil-works/pi-coding-agent";
|
|
18
18
|
|
|
19
19
|
interface ContextThresholds {
|
|
20
20
|
info: number; // 70%
|
|
@@ -9,9 +9,9 @@
|
|
|
9
9
|
* - current context window usage + session totals (tokens/cost)
|
|
10
10
|
*/
|
|
11
11
|
|
|
12
|
-
import type { ExtensionAPI, ExtensionCommandContext, ExtensionContext, ToolResultEvent } from "@
|
|
13
|
-
import { DynamicBorder } from "@
|
|
14
|
-
import { Container, Key, Text, matchesKey, type Component, type TUI } from "@
|
|
12
|
+
import type { ExtensionAPI, ExtensionCommandContext, ExtensionContext, ToolResultEvent } from "@earendil-works/pi-coding-agent";
|
|
13
|
+
import { DynamicBorder } from "@earendil-works/pi-coding-agent";
|
|
14
|
+
import { Container, Key, Text, matchesKey, type Component, type TUI } from "@earendil-works/pi-tui";
|
|
15
15
|
import os from "node:os";
|
|
16
16
|
import path from "node:path";
|
|
17
17
|
import fs from "node:fs/promises";
|
|
@@ -6,9 +6,9 @@
|
|
|
6
6
|
* [gold] [dim] [dim] [color ctx] [accent]
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
|
-
import type { AssistantMessage } from "@
|
|
10
|
-
import type { ExtensionAPI } from "@
|
|
11
|
-
import { truncateToWidth, visibleWidth } from "@
|
|
9
|
+
import type { AssistantMessage } from "@earendil-works/pi-ai";
|
|
10
|
+
import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
|
|
11
|
+
import { truncateToWidth, visibleWidth } from "@earendil-works/pi-tui";
|
|
12
12
|
|
|
13
13
|
function fmtTokens(n: number): string {
|
|
14
14
|
if (n < 1000) return n.toString();
|
|
@@ -8,9 +8,9 @@
|
|
|
8
8
|
* 可以拦截内置工具、注册自定义工具和命令
|
|
9
9
|
*/
|
|
10
10
|
|
|
11
|
-
import type { ExtensionAPI } from "@
|
|
12
|
-
import type { AssistantMessage } from "@
|
|
13
|
-
import { truncateToWidth, visibleWidth } from "@
|
|
11
|
+
import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
|
|
12
|
+
import type { AssistantMessage } from "@earendil-works/pi-ai";
|
|
13
|
+
import { truncateToWidth, visibleWidth } from "@earendil-works/pi-tui";
|
|
14
14
|
|
|
15
15
|
export default function (pi: ExtensionAPI) {
|
|
16
16
|
// === 记录开始时间 ===
|
|
@@ -23,25 +23,29 @@ export default function (pi: ExtensionAPI) {
|
|
|
23
23
|
// === 消息完成通知(只在最后一条显示)===
|
|
24
24
|
|
|
25
25
|
pi.on("agent_end", async (event, ctx) => {
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
26
|
+
try {
|
|
27
|
+
// 计算耗时
|
|
28
|
+
const elapsed = Date.now() - agentStartTime;
|
|
29
|
+
let timeStr: string;
|
|
30
|
+
if (elapsed < 1000) {
|
|
31
|
+
timeStr = `${elapsed}ms`;
|
|
32
|
+
} else if (elapsed < 60000) {
|
|
33
|
+
timeStr = `${(elapsed / 1000).toFixed(1)}s`;
|
|
34
|
+
} else {
|
|
35
|
+
const mins = Math.floor(elapsed / 60000);
|
|
36
|
+
const secs = Math.floor((elapsed % 60000) / 1000);
|
|
37
|
+
timeStr = `${mins}m ${secs}s`;
|
|
38
|
+
}
|
|
38
39
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
40
|
+
// 格式化完整时间
|
|
41
|
+
const now = new Date();
|
|
42
|
+
const timeStr2 = `${now.getFullYear()}-${String(now.getMonth() + 1).padStart(2, '0')}-${String(now.getDate()).padStart(2, '0')} ${String(now.getHours()).padStart(2, '0')}:${String(now.getMinutes()).padStart(2, '0')}:${String(now.getSeconds()).padStart(2, '0')}`;
|
|
42
43
|
|
|
43
|
-
|
|
44
|
-
|
|
44
|
+
// agent_end 表示一轮对话结束,显示完成提示
|
|
45
|
+
ctx.ui.notify(`${timeStr2} | ✨ 消息处理完成 (${timeStr})`, "info");
|
|
46
|
+
} catch (e) {
|
|
47
|
+
// 忽略错误(ctx 可能已过期)
|
|
48
|
+
}
|
|
45
49
|
});
|
|
46
50
|
|
|
47
51
|
// === 拦截工具调用 ===
|
|
@@ -3,15 +3,16 @@
|
|
|
3
3
|
*
|
|
4
4
|
* @author: xujianjiang
|
|
5
5
|
*
|
|
6
|
-
* Logs errors to
|
|
6
|
+
* Logs errors to ~/.aicode-cli/logs/aicode-error-YYYY-MM-DD.log
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
|
-
import type { ExtensionAPI } from "@
|
|
9
|
+
import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
|
|
10
10
|
import fs from "fs";
|
|
11
|
+
import os from "os";
|
|
11
12
|
import path from "path";
|
|
12
13
|
|
|
13
14
|
// Error log file configuration
|
|
14
|
-
const ERROR_LOG_DIR = path.resolve(
|
|
15
|
+
const ERROR_LOG_DIR = path.resolve(os.homedir(), ".aicode-cli", "logs");
|
|
15
16
|
const KEEP_DAYS = 2; // 保留最近2天
|
|
16
17
|
|
|
17
18
|
// 北京时间格式化函数 (UTC+8)
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
|
|
16
16
|
import { appendFileSync, existsSync, mkdirSync } from "node:fs";
|
|
17
17
|
import { join } from "node:path";
|
|
18
|
-
import type { ExtensionAPI } from "@
|
|
18
|
+
import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
|
|
19
19
|
|
|
20
20
|
// 北京时间格式化函数 (UTC+8)
|
|
21
21
|
function formatBeijingTime(date: Date = new Date()): string {
|
|
@@ -125,6 +125,21 @@ ${JSON.stringify({ ...payload, messages: filteredMessages }, null, 2)}
|
|
|
125
125
|
const timestamp = formatBeijingTime();
|
|
126
126
|
const { response, usage, cached } = event;
|
|
127
127
|
|
|
128
|
+
// Check if response is defined
|
|
129
|
+
if (!response) {
|
|
130
|
+
const logEntry = `
|
|
131
|
+
================================================================================
|
|
132
|
+
[${timestamp}] AFTER PROVIDER RESPONSE
|
|
133
|
+
================================================================================
|
|
134
|
+
Cached: ${cached ? "YES" : "NO"}
|
|
135
|
+
Error: Response is undefined
|
|
136
|
+
|
|
137
|
+
================================================================================
|
|
138
|
+
`;
|
|
139
|
+
appendFileSync(logFile, logEntry, "utf8");
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
|
|
128
143
|
const logEntry = `
|
|
129
144
|
================================================================================
|
|
130
145
|
[${timestamp}] AFTER PROVIDER RESPONSE
|
|
@@ -27,9 +27,9 @@
|
|
|
27
27
|
* Note: PR review requires a clean working tree (no uncommitted changes to tracked files).
|
|
28
28
|
*/
|
|
29
29
|
|
|
30
|
-
import type { ExtensionAPI, ExtensionContext, ExtensionCommandContext } from "@
|
|
31
|
-
import { DynamicBorder, BorderedLoader } from "@
|
|
32
|
-
import { Container, type SelectItem, SelectList, Text } from "@
|
|
30
|
+
import type { ExtensionAPI, ExtensionContext, ExtensionCommandContext } from "@earendil-works/pi-coding-agent";
|
|
31
|
+
import { DynamicBorder, BorderedLoader } from "@earendil-works/pi-coding-agent";
|
|
32
|
+
import { Container, type SelectItem, SelectList, Text } from "@earendil-works/pi-tui";
|
|
33
33
|
import path from "node:path";
|
|
34
34
|
import { promises as fs } from "node:fs";
|
|
35
35
|
|
|
@@ -5,8 +5,8 @@
|
|
|
5
5
|
* 自定义工作消息,格式类似 Claude Code: ✶ xxx… (时间 · tokens)
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
-
import type { ExtensionAPI, TurnEndEvent } from "@
|
|
9
|
-
import type { AssistantMessage } from "@
|
|
8
|
+
import type { ExtensionAPI, TurnEndEvent } from "@earendil-works/pi-coding-agent";
|
|
9
|
+
import type { AssistantMessage } from "@earendil-works/pi-ai";
|
|
10
10
|
|
|
11
11
|
// 主题色 #49bccf
|
|
12
12
|
const accentColor = "\x1b[38;2;73;188;207m";
|
package/config/agent/help.md
CHANGED
|
@@ -31,6 +31,8 @@ npm install -g @ia-ccun/code-agent-cli
|
|
|
31
31
|
|
|
32
32
|
```bash
|
|
33
33
|
aicode-cli
|
|
34
|
+
# 或
|
|
35
|
+
aicode
|
|
34
36
|
```
|
|
35
37
|
|
|
36
38
|
### 基本对话
|
|
@@ -66,6 +68,15 @@ Ctrl+Q
|
|
|
66
68
|
Enter
|
|
67
69
|
```
|
|
68
70
|
|
|
71
|
+
### Git Worktree 支持
|
|
72
|
+
|
|
73
|
+
使用 `/skill:using-git-worktrees` 在多工作区间高效切换:
|
|
74
|
+
|
|
75
|
+
```
|
|
76
|
+
/skill:using-git-worktrees
|
|
77
|
+
帮我创建一个新的 worktree 来开发登录功能
|
|
78
|
+
```
|
|
79
|
+
|
|
69
80
|
---
|
|
70
81
|
|
|
71
82
|
## 3. 核心命令
|
|
@@ -90,6 +101,13 @@ Enter
|
|
|
90
101
|
|
|
91
102
|
思考级别:`off` → `minimal` → `low` → `medium` → `high` → `xhigh`
|
|
92
103
|
|
|
104
|
+
### 技能相关
|
|
105
|
+
|
|
106
|
+
| 命令 | 说明 |
|
|
107
|
+
|------|------|
|
|
108
|
+
| `/skill:<name>` | 激活指定技能 |
|
|
109
|
+
| `/skills` | 列出所有可用技能 |
|
|
110
|
+
|
|
93
111
|
---
|
|
94
112
|
|
|
95
113
|
## 4. 快捷键
|
|
@@ -224,16 +242,71 @@ Skill 是预置的 AI 技能模块,针对特定场景优化。
|
|
|
224
242
|
|
|
225
243
|
### 可用 Skills
|
|
226
244
|
|
|
245
|
+
#### 代码开发
|
|
246
|
+
|
|
227
247
|
| Skill | 说明 | 激活方式 |
|
|
228
248
|
|-------|------|----------|
|
|
229
|
-
| code-review | 代码审查 | `/skill:code-review` |
|
|
230
|
-
|
|
|
231
|
-
|
|
|
232
|
-
|
|
|
233
|
-
|
|
|
234
|
-
|
|
|
235
|
-
|
|
236
|
-
|
|
249
|
+
| `code-review` | 代码审查 | `/skill:code-review` |
|
|
250
|
+
| `refactor` | 代码重构 | `/skill:refactor` |
|
|
251
|
+
| `unit-test` | 单元测试 | `/skill:unit-test` |
|
|
252
|
+
| `test-driven-development` | 测试驱动开发 | `/skill:test-driven-development` |
|
|
253
|
+
| `frontend-design` | 前端设计 | `/skill:frontend-design` |
|
|
254
|
+
| `owasp-security` | OWASP 安全编码 | `/skill:owasp-security` |
|
|
255
|
+
|
|
256
|
+
#### Git 相关
|
|
257
|
+
|
|
258
|
+
| Skill | 说明 | 激活方式 |
|
|
259
|
+
|-------|------|----------|
|
|
260
|
+
| `commit` | Git 提交消息生成 | `/skill:commit` |
|
|
261
|
+
| `using-git-worktrees` | Git Worktree 管理 | `/skill:using-git-worktrees` |
|
|
262
|
+
|
|
263
|
+
#### 数据分析
|
|
264
|
+
|
|
265
|
+
| Skill | 说明 | 激活方式 |
|
|
266
|
+
|-------|------|----------|
|
|
267
|
+
| `csv-data-summarizer` | CSV 数据分析 | `/skill:csv-data-summarizer` |
|
|
268
|
+
| `design-md` | Markdown 设计文档 | `/skill:design-md` |
|
|
269
|
+
|
|
270
|
+
#### UI/UX 设计
|
|
271
|
+
|
|
272
|
+
| Skill | 说明 | 激活方式 |
|
|
273
|
+
|-------|------|----------|
|
|
274
|
+
| `ui-ux-pro-max` | UI/UX 专业设计 | `/skill:ui-ux-pro-max` |
|
|
275
|
+
| `impeccable/*` | 完美界面系列技能 | `/skill:impeccable:polish` 等 |
|
|
276
|
+
|
|
277
|
+
#### 多媒体
|
|
278
|
+
|
|
279
|
+
| Skill | 说明 | 激活方式 |
|
|
280
|
+
|-------|------|----------|
|
|
281
|
+
| `video-generation` | 视频生成 | `/skill:video-generation` |
|
|
282
|
+
| `aliyun-tts` | 阿里云 TTS | `/skill:aliyun-tts` |
|
|
283
|
+
| `xiaomi-tts` | 小米 TTS | `/skill:xiaomi-tts` |
|
|
284
|
+
|
|
285
|
+
#### 写作与内容
|
|
286
|
+
|
|
287
|
+
| Skill | 说明 | 激活方式 |
|
|
288
|
+
|-------|------|----------|
|
|
289
|
+
| `khazix-writer` | 公众号长文写作 | `/skill:khazix-writer` |
|
|
290
|
+
| `hv-analysis` | 横纵分析法深度研究 | `/skill:hv-analysis` |
|
|
291
|
+
|
|
292
|
+
#### 开发流程
|
|
293
|
+
|
|
294
|
+
| Skill | 说明 | 激活方式 |
|
|
295
|
+
|-------|------|----------|
|
|
296
|
+
| `brainstorming` | 头脑风暴 | `/skill:brainstorming` |
|
|
297
|
+
| `writing-plans` | 编写实施计划 | `/skill:writing-plans` |
|
|
298
|
+
| `executing-plans` | 执行计划 | `/skill:executing-plans` |
|
|
299
|
+
| `dispatching-parallel-agents` | 并行任务分发 | `/skill:dispatching-parallel-agents` |
|
|
300
|
+
| `systematic-debugning` | 系统性调试 | `/skill:systematic-debugging` |
|
|
301
|
+
| `verification-before-completion` | 完成前验证 | `/skill:verification-before-completion` |
|
|
302
|
+
|
|
303
|
+
#### 技能管理
|
|
304
|
+
|
|
305
|
+
| Skill | 说明 | 激活方式 |
|
|
306
|
+
|-------|------|----------|
|
|
307
|
+
| `skill-creator` | 创建/编辑技能 | `/skill:skill-creator` |
|
|
308
|
+
| `session-learning` | 会话学习总结 | `/skill:session-learning` |
|
|
309
|
+
| `find-skills` | 查找技能 | `/skill:find-skills` |
|
|
237
310
|
|
|
238
311
|
### 使用方法
|
|
239
312
|
|
|
@@ -254,13 +327,11 @@ Prompt 是预置的工作流模板,用于特定任务。
|
|
|
254
327
|
|
|
255
328
|
| Prompt | 说明 |
|
|
256
329
|
|--------|------|
|
|
257
|
-
| `/bmad-init` | 初始化 BMAD 项目 |
|
|
258
330
|
| `/init-project` | 初始化新项目 |
|
|
259
331
|
| `/feat` | 新增功能开发流程 |
|
|
260
332
|
| `/git-commit` | Git 提交 |
|
|
261
|
-
| `/git-rollback` | Git 回滚 |
|
|
262
|
-
| `/git-worktree` | Git Worktree 管理 |
|
|
263
333
|
| `/workflow` | 复杂工作流 |
|
|
334
|
+
| `/code-simplifier` | 代码简化 |
|
|
264
335
|
|
|
265
336
|
### 使用示例
|
|
266
337
|
|
|
@@ -273,6 +344,9 @@ Prompt 是预置的工作流模板,用于特定任务。
|
|
|
273
344
|
|
|
274
345
|
# Git 提交
|
|
275
346
|
/git-commit
|
|
347
|
+
|
|
348
|
+
# 复杂工作流
|
|
349
|
+
/workflow
|
|
276
350
|
```
|
|
277
351
|
|
|
278
352
|
---
|
|
@@ -293,9 +367,11 @@ Prompt 是预置的工作流模板,用于特定任务。
|
|
|
293
367
|
|
|
294
368
|
| 主题 | 说明 |
|
|
295
369
|
|------|------|
|
|
296
|
-
|
|
|
297
|
-
|
|
298
|
-
|
|
370
|
+
| `catppuccin-mocha` | Catppuccin Mocha 暗色主题(推荐) |
|
|
371
|
+
|
|
372
|
+
### 自定义主题
|
|
373
|
+
|
|
374
|
+
主题文件位于 `~/.aicode-cli/agent/themes/`,可自定义颜色和样式。
|
|
299
375
|
|
|
300
376
|
---
|
|
301
377
|
|
|
@@ -320,6 +396,12 @@ Prompt 是预置的工作流模板,用于特定任务。
|
|
|
320
396
|
2. **先审后改**:重要修改前先让 AI 解释代码
|
|
321
397
|
3. **备份优先**:关键文件操作前手动备份
|
|
322
398
|
|
|
399
|
+
### Git 工作流
|
|
400
|
+
|
|
401
|
+
1. **使用 Worktree**:多分支并行开发时使用 Git Worktree
|
|
402
|
+
2. **规范提交**:使用 `/skill:commit` 生成规范提交消息
|
|
403
|
+
3. **代码审查**:重要变更使用 `/skill:code-review` 审查
|
|
404
|
+
|
|
323
405
|
---
|
|
324
406
|
|
|
325
407
|
## 10. 故障排除
|
|
@@ -328,10 +410,11 @@ Prompt 是预置的工作流模板,用于特定任务。
|
|
|
328
410
|
|
|
329
411
|
| 问题 | 解决方案 |
|
|
330
412
|
|------|----------|
|
|
331
|
-
| 启动慢 |
|
|
332
|
-
| 模型连接失败 | 核对 models.json
|
|
333
|
-
| 扩展不生效 | 运行 `/reload`
|
|
413
|
+
| 启动慢 | 检查网络连接,确认模型 API 可达 |
|
|
414
|
+
| 模型连接失败 | 核对 `models.json` 配置和 API Key |
|
|
415
|
+
| 扩展不生效 | 运行 `/reload` 重载配置 |
|
|
334
416
|
| Token 溢出 | 使用 `/clear` 清理上下文 |
|
|
417
|
+
| Skills 找不到 | 确认技能已安装到 `~/.aicode-cli/agent/skills/` |
|
|
335
418
|
|
|
336
419
|
### 详细模式
|
|
337
420
|
|
|
@@ -339,6 +422,12 @@ Prompt 是预置的工作流模板,用于特定任务。
|
|
|
339
422
|
aicode-cli --verbose
|
|
340
423
|
```
|
|
341
424
|
|
|
425
|
+
### 查看上下文
|
|
426
|
+
|
|
427
|
+
```bash
|
|
428
|
+
/context
|
|
429
|
+
```
|
|
430
|
+
|
|
342
431
|
---
|
|
343
432
|
|
|
344
433
|
## 附录
|
|
@@ -347,8 +436,8 @@ aicode-cli --verbose
|
|
|
347
436
|
|
|
348
437
|
| 变量 | 说明 |
|
|
349
438
|
|------|------|
|
|
350
|
-
| `AICODE_CLI_CONFIG_DIR` |
|
|
351
|
-
| `AICODE_CLI_CODING_AGENT_DIR` | Agent
|
|
439
|
+
| `AICODE_CLI_CONFIG_DIR` | 配置目录路径 |
|
|
440
|
+
| `AICODE_CLI_CODING_AGENT_DIR` | Agent 配置目录路径 |
|
|
352
441
|
|
|
353
442
|
### 命令行参数
|
|
354
443
|
|
|
@@ -359,6 +448,12 @@ aicode-cli --verbose
|
|
|
359
448
|
| `--model <name>` | 指定模型 |
|
|
360
449
|
| `--clear` | 启动时清理会话 |
|
|
361
450
|
|
|
451
|
+
### 相关资源
|
|
452
|
+
|
|
453
|
+
- **项目仓库**: https://github.com/ia-ccun/code-agent-cli
|
|
454
|
+
- **npm 包**: https://www.npmjs.com/package/@ia-ccun/code-agent-cli
|
|
455
|
+
- **pi-coding-agent**: 底层 Agent 框架
|
|
456
|
+
|
|
362
457
|
---
|
|
363
458
|
|
|
364
459
|
*世界那么哒 · AI 实践落地 @2026*
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"quietStartup":true,
|
|
3
|
+
"defaultProvider": "aicode",
|
|
4
|
+
"defaultModel": "qwen3.5-35b-a3b",
|
|
3
5
|
"theme":"light",
|
|
4
6
|
"extensions":[
|
|
5
7
|
"~/.aicode-cli/agent/extensions/bash-check.ts",
|
|
@@ -11,9 +13,46 @@
|
|
|
11
13
|
"~/.aicode-cli/agent/extensions/working-msg.ts"
|
|
12
14
|
],
|
|
13
15
|
"packages":[
|
|
14
|
-
"npm:pi-subagents",
|
|
15
|
-
"npm:pi-rewind",
|
|
16
|
-
"npm:pi-btw",
|
|
17
|
-
"npm:pi-mcp-adapter"
|
|
18
|
-
|
|
16
|
+
"npm:pi-subagents@0.17.1",
|
|
17
|
+
"npm:pi-rewind@0.5.0",
|
|
18
|
+
"npm:pi-btw@0.2.1",
|
|
19
|
+
"npm:pi-mcp-adapter@2.4.0",
|
|
20
|
+
"npm:@juicesharp/rpiv-todo",
|
|
21
|
+
"npm:@juicesharp/rpiv-ask-user-question",
|
|
22
|
+
"npm:@juicesharp/rpiv-advisor",
|
|
23
|
+
"npm:@samfp/pi-memory@1.1.1"
|
|
24
|
+
],
|
|
25
|
+
"memory": {
|
|
26
|
+
"localPath": "~/.aicode-cli/memory",
|
|
27
|
+
"lessonInjection": "selective",
|
|
28
|
+
"consolidationModel": "qwen3.5-35b-a3b"
|
|
29
|
+
},
|
|
30
|
+
"subagents": {
|
|
31
|
+
"agentOverrides": {
|
|
32
|
+
"scout": {
|
|
33
|
+
"model": "qwen3.5-35b-a3b"
|
|
34
|
+
},
|
|
35
|
+
"researcher": {
|
|
36
|
+
"model": "qwen3.5-35b-a3b"
|
|
37
|
+
},
|
|
38
|
+
"planner": {
|
|
39
|
+
"model": "qwen3.5-35b-a3b"
|
|
40
|
+
},
|
|
41
|
+
"worker": {
|
|
42
|
+
"model": "qwen3.5-35b-a3b"
|
|
43
|
+
},
|
|
44
|
+
"reviewer": {
|
|
45
|
+
"model": "qwen3.5-35b-a3b"
|
|
46
|
+
},
|
|
47
|
+
"context-builder": {
|
|
48
|
+
"model": "qwen3.5-35b-a3b"
|
|
49
|
+
},
|
|
50
|
+
"oracle": {
|
|
51
|
+
"model": "qwen3.5-35b-a3b"
|
|
52
|
+
},
|
|
53
|
+
"delegate": {
|
|
54
|
+
"model": "qwen3.5-35b-a3b"
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
19
58
|
}
|
package/dist/index.d.ts
CHANGED
|
@@ -2,9 +2,8 @@
|
|
|
2
2
|
* aicode-cli
|
|
3
3
|
* AI Coding Agent CLI
|
|
4
4
|
*
|
|
5
|
-
* 基于 @mariozechner/pi-coding-agent 的封装
|
|
6
5
|
*/
|
|
7
|
-
export * from '@
|
|
6
|
+
export * from '@earendil-works/pi-coding-agent';
|
|
8
7
|
export { defaultConfig, type AppConfig } from './config.js';
|
|
9
8
|
export { getConfig, getConfigDir, loadConfig } from './config-loader.js';
|
|
10
9
|
export { defaultBanner, generateBanner } from './banner.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,iCAAiC,CAAC;AAGhD,OAAO,EAAE,aAAa,EAAE,KAAK,SAAS,EAAE,MAAM,aAAa,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAGzE,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -2,10 +2,8 @@
|
|
|
2
2
|
* aicode-cli
|
|
3
3
|
* AI Coding Agent CLI
|
|
4
4
|
*
|
|
5
|
-
* 基于 @mariozechner/pi-coding-agent 的封装
|
|
6
5
|
*/
|
|
7
|
-
|
|
8
|
-
export * from '@mariozechner/pi-coding-agent';
|
|
6
|
+
export * from '@earendil-works/pi-coding-agent';
|
|
9
7
|
// 导出配置相关
|
|
10
8
|
export { defaultConfig } from './config.js';
|
|
11
9
|
export { getConfig, getConfigDir, loadConfig } from './config-loader.js';
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,iCAAiC,CAAC;AAEhD,SAAS;AACT,OAAO,EAAE,aAAa,EAAkB,MAAM,aAAa,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAEzE,YAAY;AACZ,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ia-ccun/code-agent-cli",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.51-beta.2",
|
|
4
4
|
"description": "AI Coding Agent CLI - 基于OpenClaw🦞底层Agent(pi)原理封装的编码智能体(供学习使用)。",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -35,10 +35,10 @@
|
|
|
35
35
|
"prepare": "husky"
|
|
36
36
|
},
|
|
37
37
|
"dependencies": {
|
|
38
|
-
"@
|
|
39
|
-
"@
|
|
40
|
-
"@
|
|
41
|
-
"@
|
|
38
|
+
"@earendil-works/pi-agent-core": "^0.74.0",
|
|
39
|
+
"@earendil-works/pi-ai": "^0.74.0",
|
|
40
|
+
"@earendil-works/pi-coding-agent": "^0.74.0",
|
|
41
|
+
"@earendil-works/pi-tui": "^0.74.0"
|
|
42
42
|
},
|
|
43
43
|
"overrides": {
|
|
44
44
|
"glob": "^11.0.0",
|
|
@@ -50,6 +50,7 @@
|
|
|
50
50
|
"@typescript-eslint/parser": "^8.57.0",
|
|
51
51
|
"eslint": "^10.0.3",
|
|
52
52
|
"husky": "^9.1.7",
|
|
53
|
+
"playwright": "^1.60.0",
|
|
53
54
|
"shx": "^0.4.0",
|
|
54
55
|
"typescript": "^5.7.2",
|
|
55
56
|
"typescript-eslint": "^8.57.0"
|
package/scripts/postinstall.js
CHANGED
|
@@ -21,7 +21,7 @@ const piDir = join(homeDir, '.pi');
|
|
|
21
21
|
// ============================================================================
|
|
22
22
|
// Fix pi-coding-agent APP_NAME
|
|
23
23
|
// ============================================================================
|
|
24
|
-
const piAgentPackageJson = join(__dirname, '..', 'node_modules', '@
|
|
24
|
+
const piAgentPackageJson = join(__dirname, '..', 'node_modules', '@earendil-works', 'pi-coding-agent', 'package.json');
|
|
25
25
|
if (existsSync(piAgentPackageJson)) {
|
|
26
26
|
try {
|
|
27
27
|
const piPkg = JSON.parse(readFileSync(piAgentPackageJson, 'utf-8'));
|
|
@@ -39,7 +39,7 @@ if (existsSync(piAgentPackageJson)) {
|
|
|
39
39
|
}
|
|
40
40
|
|
|
41
41
|
// Fix pi-coding-agent cli.js process.title
|
|
42
|
-
const piAgentCliJs = join(__dirname, '..', 'node_modules', '@
|
|
42
|
+
const piAgentCliJs = join(__dirname, '..', 'node_modules', '@earendil-works', 'pi-coding-agent', 'dist', 'cli.js');
|
|
43
43
|
if (existsSync(piAgentCliJs)) {
|
|
44
44
|
try {
|
|
45
45
|
let cliContent = readFileSync(piAgentCliJs, 'utf-8');
|
|
@@ -54,7 +54,7 @@ if (existsSync(piAgentCliJs)) {
|
|
|
54
54
|
}
|
|
55
55
|
|
|
56
56
|
// Fix pi-coding-agent config.js APP_NAME default
|
|
57
|
-
const piAgentConfigJs = join(__dirname, '..', 'node_modules', '@
|
|
57
|
+
const piAgentConfigJs = join(__dirname, '..', 'node_modules', '@earendil-works', 'pi-coding-agent', 'dist', 'config.js');
|
|
58
58
|
if (existsSync(piAgentConfigJs)) {
|
|
59
59
|
try {
|
|
60
60
|
let configContent = readFileSync(piAgentConfigJs, 'utf-8');
|
|
@@ -69,7 +69,7 @@ if (existsSync(piAgentConfigJs)) {
|
|
|
69
69
|
}
|
|
70
70
|
|
|
71
71
|
// Fix pi-coding-agent slash commands - change "Quit pi" to "Quit aicode-cli"
|
|
72
|
-
const slashCommandsJs = join(__dirname, '..', 'node_modules', '@
|
|
72
|
+
const slashCommandsJs = join(__dirname, '..', 'node_modules', '@earendil-works', 'pi-coding-agent', 'dist', 'core', 'slash-commands.js');
|
|
73
73
|
if (existsSync(slashCommandsJs)) {
|
|
74
74
|
try {
|
|
75
75
|
let content = readFileSync(slashCommandsJs, 'utf-8');
|
|
@@ -171,6 +171,7 @@ const FORCE_OVERWRITE_LIST = [
|
|
|
171
171
|
'SYSTEM.md',
|
|
172
172
|
'dangerous-patterns.json',
|
|
173
173
|
'settings.json',
|
|
174
|
+
'help.md',
|
|
174
175
|
'extensions/working-msg.ts',
|
|
175
176
|
'extensions/custom-footer.ts',
|
|
176
177
|
'extensions/custom.ts',
|