@gird/ccli 2.1.0 → 2.1.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.
Files changed (44) hide show
  1. package/README.md +11 -0
  2. package/dist/agent/ai.js +246 -0
  3. package/dist/agent/ai.js.map +1 -0
  4. package/dist/cli/args.js.map +1 -0
  5. package/dist/{repl.js → cli/repl.js} +35 -7
  6. package/dist/cli/repl.js.map +1 -0
  7. package/dist/cli/session.js +169 -0
  8. package/dist/cli/session.js.map +1 -0
  9. package/dist/cli/slash.js +243 -0
  10. package/dist/cli/slash.js.map +1 -0
  11. package/dist/config/config.js.map +1 -0
  12. package/dist/config/env.js.map +1 -0
  13. package/dist/index.js +5 -5
  14. package/dist/index.js.map +1 -1
  15. package/dist/tools/bash.js +89 -0
  16. package/dist/tools/bash.js.map +1 -0
  17. package/dist/tools/edit-file.js +67 -0
  18. package/dist/tools/edit-file.js.map +1 -0
  19. package/dist/tools/grep.js +83 -0
  20. package/dist/tools/grep.js.map +1 -0
  21. package/dist/tools/index.js +63 -0
  22. package/dist/tools/index.js.map +1 -0
  23. package/dist/tools/list-dir.js +33 -0
  24. package/dist/tools/list-dir.js.map +1 -0
  25. package/dist/tools/read-file.js +43 -0
  26. package/dist/tools/read-file.js.map +1 -0
  27. package/dist/tools/shared.js +12 -0
  28. package/dist/tools/shared.js.map +1 -0
  29. package/dist/tools/write-file.js +38 -0
  30. package/dist/tools/write-file.js.map +1 -0
  31. package/package.json +5 -3
  32. package/dist/ai.js +0 -82
  33. package/dist/ai.js.map +0 -1
  34. package/dist/args.js.map +0 -1
  35. package/dist/config.js.map +0 -1
  36. package/dist/env.js.map +0 -1
  37. package/dist/repl.js.map +0 -1
  38. package/dist/slash.js +0 -93
  39. package/dist/slash.js.map +0 -1
  40. package/dist/tools.js +0 -405
  41. package/dist/tools.js.map +0 -1
  42. /package/dist/{args.js → cli/args.js} +0 -0
  43. /package/dist/{config.js → config/config.js} +0 -0
  44. /package/dist/{env.js → config/env.js} +0 -0
package/dist/tools.js DELETED
@@ -1,405 +0,0 @@
1
- /**
2
- * 工具(Tools)—— 让模型能「做事」,而不只是「说话」。
3
- *
4
- * 每个工具声明三样东西:名字、给模型看的说明、参数的 JSON Schema。
5
- * 模型据此决定「要不要调用、传什么参数」;我们负责真正执行并把结果回传。
6
- *
7
- * 工具分两类:
8
- * 只读勘探(无副作用,直接放行):read_file / list_dir / grep
9
- * 有副作用(执行前需用户确认):write_file / edit_file / bash
10
- */
11
- import { spawn } from 'node:child_process';
12
- import { readFileSync, readdirSync, statSync, writeFileSync, mkdirSync, } from 'node:fs';
13
- import { resolve, join, relative, dirname } from 'node:path';
14
- // —— 一些体量上限,避免把过多内容塞进上下文 —— //
15
- /** read_file 一次默认最多读多少行 */
16
- const DEFAULT_LINES = 2000;
17
- /** 单行过长时截断到多少字符(应对压缩过的代码) */
18
- const MAX_LINE_CHARS = 1000;
19
- /** grep 最多返回多少条命中 */
20
- const MAX_MATCHES = 200;
21
- /** grep 跳过的目录 */
22
- const SKIP_DIRS = new Set(['node_modules', '.git', 'dist', '.ccli']);
23
- /** 单行过长则截断。 */
24
- function clampLine(line) {
25
- return line.length > MAX_LINE_CHARS
26
- ? line.slice(0, MAX_LINE_CHARS) + ' …(行过长已截断)'
27
- : line;
28
- }
29
- const readFileTool = {
30
- name: 'read_file',
31
- description: '读取文本文件内容(带行号)。默认从第 1 行读,最多读若干行;文件很大时用 offset/limit 分页续读。需要查看代码或文件真实内容时使用,不要凭空猜测。',
32
- parameters: {
33
- type: 'object',
34
- properties: {
35
- path: {
36
- type: 'string',
37
- description: '要读取的文件路径,相对(相对当前工作目录)或绝对均可',
38
- },
39
- offset: {
40
- type: 'integer',
41
- description: '起始行号(从 1 开始),默认 1。用于分页续读大文件',
42
- },
43
- limit: {
44
- type: 'integer',
45
- description: `最多读取的行数,默认 ${DEFAULT_LINES}`,
46
- },
47
- },
48
- required: ['path'],
49
- },
50
- async run({ path, offset = 1, limit = DEFAULT_LINES, }) {
51
- const abs = resolve(process.cwd(), path);
52
- const lines = readFileSync(abs, 'utf8').split('\n');
53
- const start = Math.max(1, Math.floor(offset)); // 1-based 起始行
54
- const slice = lines.slice(start - 1, start - 1 + Math.max(1, limit));
55
- const end = start - 1 + slice.length; // 实际读到的最后一行号
56
- const body = slice
57
- .map((line, i) => `${start + i}\t${clampLine(line)}`)
58
- .join('\n');
59
- // 还有后续内容 → 提示模型如何续读
60
- const footer = end < lines.length
61
- ? `\n…(共 ${lines.length} 行,还剩 ${lines.length - end} 行,用 offset=${end + 1} 续读)`
62
- : '';
63
- return body + footer;
64
- },
65
- };
66
- const listDirTool = {
67
- name: 'list_dir',
68
- description: '列出某个目录下的文件与子目录(子目录名带结尾斜杠 /)。用于了解项目结构、决定接下来读哪个文件。',
69
- parameters: {
70
- type: 'object',
71
- properties: {
72
- path: {
73
- type: 'string',
74
- description: '目录路径,默认当前工作目录(.)',
75
- },
76
- },
77
- required: [],
78
- },
79
- async run({ path = '.' }) {
80
- const abs = resolve(process.cwd(), path);
81
- const entries = readdirSync(abs, { withFileTypes: true });
82
- if (entries.length === 0)
83
- return '(空目录)';
84
- // 目录在前、文件在后,各自按名字排序
85
- const dirs = entries
86
- .filter((e) => e.isDirectory())
87
- .map((e) => e.name + '/')
88
- .sort();
89
- const files = entries
90
- .filter((e) => !e.isDirectory())
91
- .map((e) => e.name)
92
- .sort();
93
- return [...dirs, ...files].join('\n');
94
- },
95
- };
96
- /** 递归遍历目录下的所有文件(跳过 SKIP_DIRS)。 */
97
- function* walkFiles(dir) {
98
- let entries;
99
- try {
100
- entries = readdirSync(dir, { withFileTypes: true });
101
- }
102
- catch {
103
- return; // 读不了的目录直接跳过
104
- }
105
- for (const e of entries) {
106
- const full = join(dir, e.name);
107
- if (e.isDirectory()) {
108
- if (!SKIP_DIRS.has(e.name))
109
- yield* walkFiles(full);
110
- }
111
- else {
112
- yield full;
113
- }
114
- }
115
- }
116
- const grepTool = {
117
- name: 'grep',
118
- description: '在文件内容里按正则表达式搜索,返回命中的「文件:行号: 该行内容」。用于在项目里定位符号/关键字,比逐个读文件高效。path 为目录时递归搜索(自动跳过 node_modules/.git/dist)。',
119
- parameters: {
120
- type: 'object',
121
- properties: {
122
- pattern: {
123
- type: 'string',
124
- description: '正则表达式(JavaScript 语法)',
125
- },
126
- path: {
127
- type: 'string',
128
- description: '搜索范围:文件或目录,默认当前目录(.)',
129
- },
130
- },
131
- required: ['pattern'],
132
- },
133
- async run({ pattern, path = '.', }) {
134
- let re;
135
- try {
136
- re = new RegExp(pattern);
137
- }
138
- catch (e) {
139
- return `错误:非法正则表达式 ${pattern}(${e?.message})`;
140
- }
141
- const absRoot = resolve(process.cwd(), path);
142
- const files = statSync(absRoot).isDirectory()
143
- ? [...walkFiles(absRoot)]
144
- : [absRoot];
145
- const out = [];
146
- for (const f of files) {
147
- let text;
148
- try {
149
- text = readFileSync(f, 'utf8');
150
- }
151
- catch {
152
- continue; // 读不了就跳过
153
- }
154
- if (text.includes("\u0000"))
155
- continue; // 含 NUL 字符,疑似二进制,跳过
156
- const rel = relative(process.cwd(), f);
157
- const flines = text.split('\n');
158
- for (let i = 0; i < flines.length; i++) {
159
- if (re.test(flines[i])) {
160
- out.push(`${rel}:${i + 1}: ${clampLine(flines[i].trim())}`);
161
- if (out.length >= MAX_MATCHES) {
162
- out.push(`…(已达 ${MAX_MATCHES} 条上限,请缩小范围或细化正则)`);
163
- return out.join('\n');
164
- }
165
- }
166
- }
167
- }
168
- return out.length > 0 ? out.join('\n') : `没有匹配 “${pattern}” 的行。`;
169
- },
170
- };
171
- /** 预览写入内容时,最多展示多少行。 */
172
- const PREVIEW_LINES = 30;
173
- const writeFileTool = {
174
- name: 'write_file',
175
- description: '创建新文件或覆盖已有文件的全部内容。父目录不存在会自动创建。这是破坏性操作,执行前会请用户确认。',
176
- parameters: {
177
- type: 'object',
178
- properties: {
179
- path: {
180
- type: 'string',
181
- description: '要写入的文件路径,相对或绝对均可',
182
- },
183
- content: {
184
- type: 'string',
185
- description: '要写入的完整文件内容(会覆盖原内容)',
186
- },
187
- },
188
- required: ['path', 'content'],
189
- },
190
- needsConfirm: true,
191
- preview({ path, content }) {
192
- const lines = content.split('\n');
193
- const head = lines.slice(0, PREVIEW_LINES).join('\n');
194
- const more = lines.length > PREVIEW_LINES
195
- ? `\n…(共 ${lines.length} 行,仅预览前 ${PREVIEW_LINES} 行)`
196
- : '';
197
- return `写入文件:${path}(${content.length} 字符,${lines.length} 行)\n--- 内容预览 ---\n${head}${more}`;
198
- },
199
- async run({ path, content, }) {
200
- const abs = resolve(process.cwd(), path);
201
- mkdirSync(dirname(abs), { recursive: true }); // 父目录不存在则创建
202
- writeFileSync(abs, content, 'utf8');
203
- return `已写入 ${path}(${content.length} 字符)`;
204
- },
205
- };
206
- // —— 文件编辑工具 —— //
207
- const editFileTool = {
208
- name: 'edit_file',
209
- description: '对已有文件做局部精确替换。old_text 必须在文件中唯一且精确匹配(含缩进/空白)。' +
210
- '用于修改文件的某一部分,比 write_file 覆盖整个文件更安全。' +
211
- '执行前会请用户确认。',
212
- parameters: {
213
- type: 'object',
214
- properties: {
215
- path: {
216
- type: 'string',
217
- description: '要编辑的文件路径(相对或绝对)',
218
- },
219
- old_text: {
220
- type: 'string',
221
- description: '要替换的原文(必须在文件中精确且唯一匹配)',
222
- },
223
- new_text: {
224
- type: 'string',
225
- description: '替换后的新文本',
226
- },
227
- replace_all: {
228
- type: 'boolean',
229
- description: '是否替换所有出现(默认 false)',
230
- },
231
- },
232
- required: ['path', 'old_text', 'new_text'],
233
- },
234
- needsConfirm: true,
235
- preview({ path, old_text, new_text, }) {
236
- return [
237
- `编辑文件:${path}`,
238
- '--- 原内容 ---',
239
- old_text,
240
- '--- 新内容 ---',
241
- new_text,
242
- ].join('\n');
243
- },
244
- async run({ path, old_text, new_text, replace_all, }) {
245
- const abs = resolve(process.cwd(), path);
246
- let text;
247
- try {
248
- text = readFileSync(abs, 'utf8');
249
- }
250
- catch (e) {
251
- return `错误:无法读取文件 ${path}(${e?.message ?? e})`;
252
- }
253
- if (old_text === new_text) {
254
- return '错误:old_text 与 new_text 相同,无需替换';
255
- }
256
- const count = text.split(old_text).length - 1;
257
- if (count === 0) {
258
- return ('错误:在文件中未找到 old_text。' +
259
- '请先 read_file 确认精确内容(含缩进和空白)。');
260
- }
261
- if (count > 1 && !replace_all) {
262
- return `错误:old_text 出现了 ${count} 次,不唯一。请提供更多上下文,或设 replace_all=true。`;
263
- }
264
- const updated = replace_all
265
- ? text.split(old_text).join(new_text)
266
- : text.replace(old_text, new_text);
267
- writeFileSync(abs, updated, 'utf8');
268
- return `已编辑 ${path}(替换 ${replace_all ? count : 1} 处)`;
269
- },
270
- };
271
- // —— bash 执行工具 —— //
272
- /** bash 默认超时 120s,最大 600s。 */
273
- const BASH_DEFAULT_TIMEOUT = 120_000;
274
- const BASH_MAX_TIMEOUT = 600_000;
275
- /** 命令输出上限,避免把海量输出塞进上下文。 */
276
- const BASH_MAX_OUTPUT = 30_000;
277
- const bashTool = {
278
- name: 'bash',
279
- description: '在当前工作目录执行 shell 命令。用于运行测试、构建、git、安装依赖等。' +
280
- '不要用它读写文件——请用 read_file / write_file。避免交互式命令。' +
281
- '执行前会请用户确认。',
282
- parameters: {
283
- type: 'object',
284
- properties: {
285
- command: {
286
- type: 'string',
287
- description: '要执行的 shell 命令',
288
- },
289
- description: {
290
- type: 'string',
291
- description: '对该命令用途的一句话说明(可选)',
292
- },
293
- timeout: {
294
- type: 'integer',
295
- description: `超时毫秒数(默认 ${BASH_DEFAULT_TIMEOUT},最大 ${BASH_MAX_TIMEOUT})`,
296
- },
297
- },
298
- required: ['command'],
299
- },
300
- needsConfirm: true,
301
- preview({ command, description, }) {
302
- const lines = [`$ ${command}`];
303
- if (description)
304
- lines.push(`说明:${description}`);
305
- return lines.join('\n');
306
- },
307
- async run({ command, timeout, }) {
308
- const cmd = String(command || '');
309
- if (!cmd)
310
- return '错误:command 不能为空';
311
- const limit = Math.min(Math.max(1, timeout ?? BASH_DEFAULT_TIMEOUT), BASH_MAX_TIMEOUT);
312
- const shell = process.env.SHELL || '/bin/bash';
313
- return new Promise((resolve) => {
314
- const child = spawn(shell, ['-c', cmd], {
315
- cwd: process.cwd(),
316
- env: process.env,
317
- });
318
- let stdout = '';
319
- let stderr = '';
320
- let killed = false;
321
- const timer = setTimeout(() => {
322
- killed = true;
323
- child.kill('SIGKILL');
324
- }, limit);
325
- child.stdout.on('data', (d) => {
326
- stdout += d.toString();
327
- if (stdout.length > BASH_MAX_OUTPUT) {
328
- stdout = stdout.slice(0, BASH_MAX_OUTPUT);
329
- }
330
- });
331
- child.stderr.on('data', (d) => {
332
- stderr += d.toString();
333
- if (stderr.length > BASH_MAX_OUTPUT) {
334
- stderr = stderr.slice(0, BASH_MAX_OUTPUT);
335
- }
336
- });
337
- child.on('error', (e) => {
338
- clearTimeout(timer);
339
- resolve(`错误:命令启动失败:${e.message}`);
340
- });
341
- child.on('close', (code) => {
342
- clearTimeout(timer);
343
- const combined = [stdout, stderr].filter(Boolean).join('\n');
344
- const body = combined.trim() || '(无输出)';
345
- const truncated = stdout.length >= BASH_MAX_OUTPUT ||
346
- stderr.length >= BASH_MAX_OUTPUT
347
- ? '\n…(输出已截断)'
348
- : '';
349
- if (killed) {
350
- resolve(`错误:命令执行超时(${limit}ms)被终止。\n部分输出:\n${body.slice(0, 2000)}`);
351
- return;
352
- }
353
- const exitNote = code === 0 ? '' : `\n[退出码 ${code}]`;
354
- resolve(`${body}${truncated}${exitNote}`);
355
- });
356
- });
357
- },
358
- };
359
- /** 已注册的工具集合(后续步骤在此追加)。 */
360
- export const tools = [
361
- readFileTool,
362
- listDirTool,
363
- grepTool,
364
- writeFileTool,
365
- editFileTool,
366
- bashTool,
367
- ];
368
- /** 按名字取工具(供代理循环做「是否需确认」判断)。 */
369
- export function getTool(name) {
370
- return tools.find((t) => t.name === name);
371
- }
372
- /** 转成 OpenAI function-calling 需要的工具定义数组。 */
373
- export function toolDefs() {
374
- return tools.map((t) => ({
375
- type: 'function',
376
- function: {
377
- name: t.name,
378
- description: t.description,
379
- parameters: t.parameters,
380
- },
381
- }));
382
- }
383
- /**
384
- * 按名字执行工具,返回给模型的文本结果。
385
- * 任何错误都转成文本返回(让模型看到失败原因并自行决定下一步),而不是抛异常。
386
- */
387
- export async function executeTool(name, argsJson) {
388
- const tool = tools.find((t) => t.name === name);
389
- if (!tool)
390
- return `错误:未知工具 ${name}`;
391
- let args;
392
- try {
393
- args = JSON.parse(argsJson || '{}');
394
- }
395
- catch {
396
- return `错误:参数不是合法 JSON:${argsJson}`;
397
- }
398
- try {
399
- return await tool.run(args);
400
- }
401
- catch (e) {
402
- return `错误:${e?.message ?? String(e)}`;
403
- }
404
- }
405
- //# sourceMappingURL=tools.js.map
package/dist/tools.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"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"}
File without changes
File without changes
File without changes