@gird/ccli 2.20.0 → 2.21.0
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 +2 -0
- package/dist/agent/ai.js.map +1 -1
- package/dist/agent/providers/anthropic.js +112 -4
- package/dist/agent/providers/anthropic.js.map +1 -1
- package/dist/agent/rag/db.js +142 -0
- package/dist/agent/rag/db.js.map +1 -0
- package/dist/agent/rag/embedding.js +135 -0
- package/dist/agent/rag/embedding.js.map +1 -0
- package/dist/agent/rag/indexer.js +104 -0
- package/dist/agent/rag/indexer.js.map +1 -0
- package/dist/agent/rag/parser.js +75 -0
- package/dist/agent/rag/parser.js.map +1 -0
- package/dist/agent/rag/search.js +47 -0
- package/dist/agent/rag/search.js.map +1 -0
- package/dist/cli/args/index.js +8 -0
- package/dist/cli/args/index.js.map +1 -1
- package/dist/cli/run/index.js +8 -5
- package/dist/cli/run/index.js.map +1 -1
- package/dist/cli/run/task.js +168 -31
- package/dist/cli/run/task.js.map +1 -1
- package/dist/cli/slash/config/account.js +2 -0
- package/dist/cli/slash/config/account.js.map +1 -1
- package/dist/cli/slash/index.js +8 -0
- package/dist/cli/slash/index.js.map +1 -1
- package/dist/cli/slash/system/help.js +2 -0
- package/dist/cli/slash/system/help.js.map +1 -1
- package/dist/cli/slash/system/indexer.js +25 -0
- package/dist/cli/slash/system/indexer.js.map +1 -0
- package/dist/cli/slash/system/upgrade.js +13 -0
- package/dist/cli/slash/system/upgrade.js.map +1 -0
- package/dist/cli/upgrade.js +90 -0
- package/dist/cli/upgrade.js.map +1 -0
- package/dist/config/config.js +137 -4
- package/dist/config/config.js.map +1 -1
- package/dist/config/project-context.js +135 -0
- package/dist/config/project-context.js.map +1 -0
- package/dist/harness/index.js +8 -2
- package/dist/harness/index.js.map +1 -1
- package/dist/index.js +12 -0
- package/dist/index.js.map +1 -1
- package/dist/server/webui-content.js +2 -0
- package/dist/server/webui-content.js.map +1 -0
- package/dist/server/webui.js +15 -4
- package/dist/server/webui.js.map +1 -1
- package/dist/tools/fs/list-dir.js +75 -25
- package/dist/tools/fs/list-dir.js.map +1 -1
- package/dist/tools/index.js +2 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/rag/search.js +65 -0
- package/dist/tools/rag/search.js.map +1 -0
- package/dist/tools/shared.js.map +1 -1
- package/package.json +3 -1
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { codebaseSearch } from '../../agent/rag/search.js';
|
|
2
|
+
import { grepTool } from '../fs/grep.js';
|
|
3
|
+
import { loadConfig } from '../../config/config.js';
|
|
4
|
+
export const codebaseSearchTool = {
|
|
5
|
+
name: 'codebase_search',
|
|
6
|
+
description: '通过自然语言描述搜索项目代码库。它会在本地通过向量数据库模糊定位最匹配的类、函数、变量定义,' +
|
|
7
|
+
'并通过 SQLite 反查定义源码,结合 Ripgrep 全局符号引用分析,返回包含定义和调用关系的代码脉络。' +
|
|
8
|
+
'在分析大型项目结构、理清调用脉络、定位复杂功能定义时,此工具非常高效。',
|
|
9
|
+
parameters: {
|
|
10
|
+
type: 'object',
|
|
11
|
+
properties: {
|
|
12
|
+
query: {
|
|
13
|
+
type: 'string',
|
|
14
|
+
description: '自然语言查询词,例如 “处理 Web UI 网页加载的函数”、“API 鉴权逻辑” 或 “JWT token 验证的类”',
|
|
15
|
+
},
|
|
16
|
+
},
|
|
17
|
+
required: ['query'],
|
|
18
|
+
},
|
|
19
|
+
async run({ query }, ctx) {
|
|
20
|
+
if (!ctx) {
|
|
21
|
+
return '错误: 缺乏 ToolContext 运行上下文,无法连接数据库。';
|
|
22
|
+
}
|
|
23
|
+
const cwd = ctx.cwd || process.cwd();
|
|
24
|
+
const configResult = loadConfig(cwd);
|
|
25
|
+
if (!configResult.ok) {
|
|
26
|
+
return `检索失败: ${configResult.message}`;
|
|
27
|
+
}
|
|
28
|
+
const config = configResult.config;
|
|
29
|
+
// 1. 调用向量检索定位符号
|
|
30
|
+
let results;
|
|
31
|
+
try {
|
|
32
|
+
results = await codebaseSearch(query, config, cwd, 3, ctx.os);
|
|
33
|
+
}
|
|
34
|
+
catch (e) {
|
|
35
|
+
return `检索失败: ${e.message}。请确认您的 API Key 有效,且已经运行过 /index-code 指令扫描了项目。`;
|
|
36
|
+
}
|
|
37
|
+
if (results.length === 0) {
|
|
38
|
+
return `未能在代码符号库中找到与 “${query}” 语义相近的定义。建议提示用户确认是否运行过 /index-code 建立了大纲向量索引。`;
|
|
39
|
+
}
|
|
40
|
+
const output = ['🔍 codebase_search 语义检索结果:\n'];
|
|
41
|
+
for (const item of results) {
|
|
42
|
+
output.push(`🎯 最佳命中符号定义:`);
|
|
43
|
+
output.push(`在文件 \`${item.filePath}\` 中发现 \`${item.name}\` (${item.type}, 第 ${item.startLine}-${item.endLine} 行,相关度: ${Math.round(item.similarity * 100)}%):`);
|
|
44
|
+
output.push('```typescript');
|
|
45
|
+
output.push(item.code);
|
|
46
|
+
output.push('```\n');
|
|
47
|
+
// 2. 联动 grep 查找所有调用该符号的全局点
|
|
48
|
+
output.push(`🔗 该符号的全局引用与调用位置 (Ripgrep 检索):`);
|
|
49
|
+
try {
|
|
50
|
+
// 用单词边界精确检索
|
|
51
|
+
const grepResult = await grepTool.run({
|
|
52
|
+
pattern: `\\b${item.name}\\b`,
|
|
53
|
+
path: '.'
|
|
54
|
+
}, ctx);
|
|
55
|
+
output.push(typeof grepResult === 'string' ? grepResult : grepResult.output);
|
|
56
|
+
}
|
|
57
|
+
catch (e) {
|
|
58
|
+
output.push(`(获取调用关系失败: ${e.message})`);
|
|
59
|
+
}
|
|
60
|
+
output.push('\n----------------------------------------\n');
|
|
61
|
+
}
|
|
62
|
+
return output.join('\n');
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
//# sourceMappingURL=search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../../src/tools/rag/search.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/shared.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/tools/shared.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/tools/shared.ts"],"names":[],"mappings":"AAAA;;GAEG;AA8EH,8BAA8B;AAC9B,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,CAAC;AAEnC,eAAe;AACf,MAAM,UAAU,SAAS,CAAC,IAAY;IAClC,OAAO,IAAI,CAAC,MAAM,GAAG,cAAc;QAC/B,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,cAAc,CAAC,GAAG,YAAY;QAC9C,CAAC,CAAC,IAAI,CAAC;AACf,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gird/ccli",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.21.0",
|
|
4
4
|
"description": "CCLI —— 一步一步从零实现的代理型(Agentic)终端 AI 编程助手",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -14,6 +14,7 @@
|
|
|
14
14
|
"scripts": {
|
|
15
15
|
"prebuild": "rm -rf dist",
|
|
16
16
|
"build": "tsc -p tsconfig.json && cp src/server/webui.html dist/server/webui.html && chmod +x dist/index.js",
|
|
17
|
+
"build:native": "node scripts/build-native.mjs",
|
|
17
18
|
"dev": "tsx src/index.ts",
|
|
18
19
|
"start": "node dist/index.js",
|
|
19
20
|
"typecheck": "tsc --noEmit -p tsconfig.json",
|
|
@@ -45,6 +46,7 @@
|
|
|
45
46
|
},
|
|
46
47
|
"devDependencies": {
|
|
47
48
|
"@types/node": "^25.9.3",
|
|
49
|
+
"esbuild": "^0.28.1",
|
|
48
50
|
"tsx": "^4.22.4",
|
|
49
51
|
"typescript": "^6.0.3"
|
|
50
52
|
},
|