@ia-ccun/code-agent-cli 0.0.52-release → 0.0.53

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.
Files changed (58) hide show
  1. package/config/agent/bin/README.md +102 -0
  2. package/config/agent/bin/fd.exe +0 -0
  3. package/config/agent/bin/rg.exe +0 -0
  4. package/config/agent/extensions/aicode-advisor.ts +13 -0
  5. package/config/agent/extensions/aicode-btw.ts +66 -14
  6. package/config/agent/extensions/aicode-cd.ts +834 -0
  7. package/config/agent/extensions/aicode-grillMe.ts +198 -0
  8. package/config/agent/extensions/aicode-pets.ts +362 -0
  9. package/config/agent/extensions/aicode-safety-guard.ts +552 -0
  10. package/config/agent/extensions/aicode-tips.ts +70 -16
  11. package/config/agent/extensions/aicode-todo-progress.ts +547 -0
  12. package/config/agent/extensions/custom.ts +93 -95
  13. package/config/agent/extensions/error-monitor.ts +1 -18
  14. package/config/agent/extensions/ponytail.ts +441 -0
  15. package/config/agent/extensions/tps.ts +87 -0
  16. package/config/agent/extensions/working-msg.ts +165 -50
  17. package/config/agent/help.md +0 -7
  18. package/config/agent/models.json +7 -7
  19. package/config/agent/settings.json +2 -1
  20. package/config/agent/skills/chroma/LICENSE +21 -0
  21. package/config/agent/skills/chroma/chroma-local/SKILL.md +165 -0
  22. package/config/agent/skills/chroma/chroma-local/cli.md +48 -0
  23. package/config/agent/skills/chroma/chroma-local/data-model.md +103 -0
  24. package/config/agent/skills/chroma/chroma-local/error-handling/python.md +166 -0
  25. package/config/agent/skills/chroma/chroma-local/error-handling/typescript.md +231 -0
  26. package/config/agent/skills/chroma/chroma-local/local-chroma/python.md +95 -0
  27. package/config/agent/skills/chroma/chroma-local/local-chroma/typescript.md +101 -0
  28. package/config/agent/skills/chroma/chroma-local/metadata/python.md +154 -0
  29. package/config/agent/skills/chroma/chroma-local/metadata/typescript.md +153 -0
  30. package/config/agent/skills/chroma/chroma-local/querying/python.md +147 -0
  31. package/config/agent/skills/chroma/chroma-local/querying/typescript.md +157 -0
  32. package/config/agent/skills/chroma/chroma-local/regex/python.md +69 -0
  33. package/config/agent/skills/chroma/chroma-local/regex/typescript.md +71 -0
  34. package/config/agent/skills/chroma/chroma-local/understanding-a-codebase.md +80 -0
  35. package/config/agent/skills/chroma/chroma-local/updating-deleting/python.md +159 -0
  36. package/config/agent/skills/chroma/chroma-local/updating-deleting/typescript.md +228 -0
  37. package/config/agent/skills/milvus-skill/LICENSE +202 -0
  38. package/config/agent/skills/milvus-skill/README.md +37 -0
  39. package/config/agent/skills/milvus-skill/SKILL.md +259 -0
  40. package/config/agent/skills/milvus-skill/references/collection.md +86 -0
  41. package/config/agent/skills/milvus-skill/references/database.md +24 -0
  42. package/config/agent/skills/milvus-skill/references/index.md +69 -0
  43. package/config/agent/skills/milvus-skill/references/partition.md +29 -0
  44. package/config/agent/skills/milvus-skill/references/patterns.md +150 -0
  45. package/config/agent/skills/milvus-skill/references/user-role.md +90 -0
  46. package/config/agent/skills/milvus-skill/references/vector.md +247 -0
  47. package/config/agent/skills/ponytail/SKILL.md +100 -0
  48. package/config/agent/skills/ponytail-audit/SKILL.md +40 -0
  49. package/config/agent/skills/ponytail-debt/SKILL.md +44 -0
  50. package/config/agent/skills/ponytail-help/SKILL.md +68 -0
  51. package/config/agent/skills/ponytail-review/SKILL.md +56 -0
  52. package/config/agent/skills/zread/README.md +115 -0
  53. package/config/agent/skills/zread/SKILL.md +103 -0
  54. package/config/agent/skills/zread/references/stdio-protocol.md +312 -0
  55. package/package.json +6 -5
  56. package/scripts/postinstall.js +58 -1
  57. package/config/agent/dangerous-patterns.json +0 -106
  58. package/config/agent/extensions/bash-check.ts +0 -227
@@ -1,227 +0,0 @@
1
- /**
2
- * @author: xujianjiang
3
- * Bash 命令危险检测扩展
4
- *
5
- * 放置位置: config/agent/extensions/
6
- * 安装后会复制到 ~/.aicode-cli/agent/extensions/
7
- *
8
- * 拦截危险 bash 命令,执行前需要用户回答数学题验证
9
- *
10
- * 危险模式配置: config/agent/dangerous-patterns.json
11
- */
12
-
13
- import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
14
- import { readFileSync, existsSync } from "fs";
15
- import { join } from "path";
16
- import { homedir } from "os";
17
-
18
- // === 加载 JSON 配置文件 ===
19
- interface DangerPattern {
20
- pattern: string;
21
- commandPrefix: string;
22
- name: string;
23
- risk: string;
24
- description: string;
25
- impact: string;
26
- explanation: string;
27
- }
28
-
29
- interface DangerPatternsConfig {
30
- patterns: DangerPattern[];
31
- }
32
-
33
- function loadDangerPatterns(): DangerPattern[] {
34
- const configPath = join(homedir(), ".aicode-cli", "agent", "dangerous-patterns.json");
35
-
36
- if (existsSync(configPath)) {
37
- try {
38
- const content = readFileSync(configPath, "utf-8");
39
- const config: DangerPatternsConfig = JSON.parse(content);
40
- return config.patterns || [];
41
- } catch (e) {
42
- console.error(`[bash-check] Failed to load config from ${configPath}:`, e);
43
- }
44
- }
45
-
46
- console.warn("[bash-check] No dangerous-patterns.json found, using empty patterns");
47
- return [];
48
- }
49
-
50
- // === 编译危险模式(同步加载)===
51
- const patterns = loadDangerPatterns();
52
- const compiledPatterns = patterns.map(p => ({
53
- ...p,
54
- compiled: new RegExp(p.pattern, ""),
55
- }));
56
-
57
- // === 生成数学验证题目 ===
58
- function generateMathProblem(): { question: string, answer: number } {
59
- const operators = ['+', '-'];
60
- const operator = operators[Math.floor(Math.random() * operators.length)];
61
- let a = Math.floor(Math.random() * 10) + 1;
62
- let b = Math.floor(Math.random() * 10) + 1;
63
-
64
- // 确保减法结果非负
65
- if (operator === '-' && a < b) {
66
- [a, b] = [b, a];
67
- }
68
-
69
- const question = `${a} ${operator} ${b} = ?`;
70
- const answer = operator === '+' ? a + b : a - b;
71
-
72
- return { question, answer };
73
- }
74
-
75
- export default function (pi: ExtensionAPI) {
76
- // === 拦截 bash 工具 - 检查危险操作 ===
77
- pi.on("tool_call", async (event, ctx) => {
78
- if (event.toolName !== "bash") return;
79
-
80
- let command = event.input.command || "";
81
-
82
- // 过滤掉 git commit -m 后面的 message 内容,只检查实际命令部分
83
- const commitMsgMatch = command.match(/^(git\s+commit\s+.*?-m\s+)(.*)$/s);
84
- if (commitMsgMatch) {
85
- // 只检查 -m 之前的命令部分,忽略 message 内容
86
- command = commitMsgMatch[1];
87
- }
88
-
89
- // 检查是否匹配危险模式
90
- for (const danger of compiledPatterns) {
91
- // 1. 首先检查命令是否以指定前缀开头
92
- const trimmedCmd = command.trim();
93
- if (!trimmedCmd.startsWith(danger.commandPrefix)) continue;
94
-
95
- // 2. 然后检查是否匹配危险模式(使用编译后的正则)
96
- if (!danger.compiled.test(command)) continue;
97
-
98
- // 解析命令中的路径参数
99
- const { readdirSync, statSync, existsSync } = await import("fs");
100
- const details: string[] = [];
101
-
102
- // 提取相关路径
103
- const pathMatch = command.match(/(['"])([^\1]+)\1|\S+(?=\s|$)/g);
104
- if (pathMatch) {
105
- for (const p of pathMatch) {
106
- const cleanPath = p.replace(/^['"]|['"]$/g, '').trim();
107
- if (cleanPath && cleanPath.length > 1 && cleanPath.length < 200) {
108
- try {
109
- if (existsSync(cleanPath)) {
110
- const stat = statSync(cleanPath);
111
- if (stat.isDirectory()) {
112
- const files = readdirSync(cleanPath);
113
- details.push(`📁 ${cleanPath}/ (${files.length} 个文件)`);
114
- } else {
115
- details.push(`📄 ${cleanPath}`);
116
- }
117
- }
118
- } catch (e) {
119
- // 忽略读取错误
120
- }
121
- }
122
- }
123
- }
124
-
125
- // 构建确认消息
126
- const truncatedCmd = command.length > 100 ? command.slice(0, 100) + '...' : command;
127
- const fileInfo = details.length > 0
128
- ? `\n\n🗂️ 将操作的文件:\n${details.slice(0, 5).join('\n')}${details.length > 5 ? `\n... 还有 ${details.length - 5} 个` : ''}`
129
- : '';
130
-
131
- // 让用户选择操作
132
- const choice = await ctx.ui.select(
133
- `${danger.risk} 危险操作检测: ${danger.name}`,
134
- [
135
- `⚠️ 强制执行 (${danger.name})`,
136
- "🔍 让 AI 解读此命令",
137
- "❌ 取消操作",
138
- ]
139
- );
140
-
141
- if (!choice) {
142
- ctx.ui.notify("⛔ 操作已取消", "warning");
143
- return { block: true, reason: "用户取消" };
144
- }
145
-
146
- if (choice.includes("取消")) {
147
- ctx.ui.notify("⛔ 操作已取消", "warning");
148
- return { block: true, reason: "用户取消" };
149
- }
150
-
151
- if (choice.includes("AI 解读")) {
152
- // 显示详细解释
153
- const explanation = `
154
- 📋 命令: ${danger.name}
155
-
156
- 📝 描述: ${danger.description}
157
-
158
- ⚠️ 风险等级: ${danger.risk}
159
-
160
- 💥 影响: ${danger.impact}
161
-
162
- 📖 详细解释:
163
- ${danger.explanation}
164
-
165
- 🗂️ 涉及路径:${fileInfo || '\n (无)'}`.trim();
166
-
167
- ctx.ui.notify(explanation, "info");
168
-
169
- // 解释后再让用户选择
170
- const confirmChoice = await ctx.ui.select(
171
- "请确认操作",
172
- [
173
- `⚠️ 我已了解风险,继续执行 (${danger.name})`,
174
- "❌ 取消操作",
175
- ]
176
- );
177
-
178
- if (!confirmChoice || confirmChoice.includes("取消")) {
179
- ctx.ui.notify("⛔ 操作已取消", "warning");
180
- return { block: true, reason: "用户取消" };
181
- }
182
-
183
- // 执行数学验证
184
- const mathProblem = generateMathProblem();
185
- const mathAnswer = await ctx.ui.input(
186
- `🔴 最终验证 - 请回答数学题\n\n⚠️ 命令: ${danger.name}\n\n${truncatedCmd}${fileInfo}\n\n📝 请计算: ${mathProblem.question}`,
187
- "输入答案后回车"
188
- );
189
-
190
- if (!mathAnswer) {
191
- ctx.ui.notify("⛔ 操作已取消", "warning");
192
- return { block: true, reason: "用户未输入答案" };
193
- }
194
-
195
- const userAnswer = parseInt(mathAnswer.trim(), 10);
196
- if (isNaN(userAnswer) || userAnswer !== mathProblem.answer) {
197
- ctx.ui.notify(`⛔ 答案错误!正确答案是: ${mathProblem.answer}`, "error");
198
- return { block: true, reason: "数学验证失败" };
199
- }
200
-
201
- ctx.ui.notify(`✅ 验证通过!执行: ${danger.name}`, "success");
202
- return;
203
- }
204
-
205
- // 直接执行 - 数学验证
206
- const mathProblem = generateMathProblem();
207
- const mathAnswer = await ctx.ui.input(
208
- `🔴 最终验证 - 请回答数学题\n\n⚠️ 命令: ${danger.name}\n\n${truncatedCmd}${fileInfo}\n\n📝 请计算: ${mathProblem.question}`,
209
- "输入答案后回车"
210
- );
211
-
212
- if (!mathAnswer) {
213
- ctx.ui.notify("⛔ 操作已取消", "warning");
214
- return { block: true, reason: "用户未输入答案" };
215
- }
216
-
217
- const userAnswer = parseInt(mathAnswer.trim(), 10);
218
- if (isNaN(userAnswer) || userAnswer !== mathProblem.answer) {
219
- ctx.ui.notify(`⛔ 答案错误!正确答案是: ${mathProblem.answer}`, "error");
220
- return { block: true, reason: "数学验证失败" };
221
- }
222
-
223
- ctx.ui.notify(`✅ 验证通过!执行: ${danger.name}`, "success");
224
- break;
225
- }
226
- });
227
- }