个人博客4: Git 忽略规则优化+跨文件上下文补全功能开发
·
1. 本次改动总览
我在团队中主要负责渐进式上下文补全、大模型调用、漏洞解释生成、修复建议输出,是连接后端规则分析与前端插件 展示的核心环节。AI 模块的稳定性、准确率和响应速度,将直接决定项目最终能否达到可演示、可考核、可验收的标准。
上次说要写跨文件补全,但是没找到合适的项目,自己写了一个简单的python调用试试水。顺便改了一些git上的小问题 。本次主要完成两类工作:
- 工程治理:新增仓库根目录
.gitignore,并将已被跟踪的虚拟环境/缓存/编译产物从 Git 索引移除。 - 功能增强:在现有“文件内上下文补全”的基础上,增加“跨文件上下文补全”能力,支持在当前分析范围无明确漏洞时,继续自动检查被调用文件。
2. 我改动的文件和实现的功能
2.1 /.gitignore
改动内容
- 新增忽略规则:
backend/.venv/backend/**/__pycache__/*.pycvscode-extension/out/extension.jsvscode-extension/out/extension.js.map
为什么要改
- 就我个人而言,一开始没发现什么问题,但是队友跟我反映了一些配置文件没必要共享,提交后会与他们本地的文件冲突,所以做了gitinnore来筛选不需要的部分。也算是在项目中学到的开发技巧。
- 防止虚拟环境、Python 缓存、扩展编译产物进入版本库,减少噪音变更与误提交。
影响到的用户流程
- 开发者本地运行后,
git status更干净。 - 提交代码时不再混入无关构建文件与缓存文件。
关键代码
backend/.venv/
backend/**/__pycache__/
*.pyc
vscode-extension/out/extension.js
vscode-extension/out/extension.js.map
2.2 vscode-extension/src/extension.ts
新增跨文件补全触发流程
改动内容
- 在分析完成后新增触发判断:当未检出风险时,允许进入跨文件补全流程。
- 原始版本先支持
file模式;后续修复补上selection模式(当上下文已扩到全文仍无风险时也触发)。 - 现实代码中漏洞路径常跨文件,仅看当前文件可能“无结论”;需要用户确认后继续扩展分析范围。
影响到的用户流程
Analyze Current File无风险时:可弹出“是否跨文件补全”提示。Analyze Selection且上下文已扩到全文仍无风险时:同样可触发跨文件提示。
关键代码
if (
shouldOfferCrossFileCompletion({
mode,
language,
responseJson,
useExpandingContext
})
) {
await maybeRunCrossFileContextCompletion({
editor,
document,
output,
requestId,
backendUrl,
timeoutMs,
workspaceRoot
});
}
新增跨文件补全主函数
改动内容
- 新增
maybeRunCrossFileContextCompletion(...):- 先弹窗询问是否同意跨文件补全;
- 同意后定位相关文件;
- 若未找到相关文件则友好提示;
- 找到后逐个检查并汇总结果。
- 保持“用户可控”的分析体验,避免自动打开大量文件造成打扰。
影响到的用户流程
- 从“一次分析结束”升级为“可继续深挖调用链”的两阶段分析。
关键代码
const picked = await vscode.window.showInformationMessage(
`[CodeGuard 导师] 当前文件未发现明确漏洞。是否进行跨文件上下文补全,自动定位并检查被调用文件?请求编号:${args.requestId}`,
{ modal: false },
agree,
decline
);
if (picked !== agree) {
args.output.appendLine(`[CodeGuard 导师] [跨文件补全] 用户取消跨文件检查。请求编号:${args.requestId}`);
return;
}
新增跨文件关联发现与逐文件分析
改动内容
- 新增
findRelatedPythonFiles(...):- 解析当前文件调用标识;
- 结合
import/from ... import ...推断被调用模块; - 解析到文件路径并去重。
- 新增
runCrossFileAnalysis(...):- 自动打开相关文件;
- 调用后端继续分析;
- 记录命中风险文件。
- 当前 MVP 尚未接入完整跨文件污点引擎,先用“导入关系 + 调用痕迹”的轻量方式提升发现能力。
影响到的用户流程
- 用户同意后,插件会自动跳转并检查关联文件,最后返回“检查数 / 命中数 / 首条风险摘要”。
关键代码
for (const filePath of args.relatedFiles) {
const uri = vscode.Uri.file(filePath);
const doc = await vscode.workspace.openTextDocument(uri);
await vscode.window.showTextDocument(doc, { preview: true, preserveFocus: false });
const payload: AnalysisRequest = {
mode: "file",
language: normalizeLanguage(doc.languageId),
file_path: doc.uri.fsPath,
code: doc.getText(),
workspace_root: args.workspaceRoot
};
const response = await postAnalyzeRequest(args.backendUrl, payload, args.timeoutMs);
if (responseHasRisks(response)) {
riskHits.push({ filePath, response });
}
}
上下文扩展元数据结构化(为触发条件服务)
改动内容
- 在
annotateExpansionResult(...)中新增_codeguard_context_expansion_meta(结构化字段),例如stopped、最终窗口行号、迭代次数。 - 新增
shouldOfferCrossFileCompletion(...),以结构化字段判断selection模式是否“已扩到全文”。
为什么这样改
- 避免依赖中文文案字符串判断状态,提升逻辑稳定性和可维护性。
影响到的用户流程
selection场景的跨文件提示更准确,避免漏触发。
关键代码
return {
...base,
_codeguard_context_expansion: note,
_codeguard_context_expansion_meta: {
iterations: meta.iterations,
final_start_line: meta.finalStart1Based,
final_end_line: meta.finalEnd1Based,
total_lines: meta.totalLines,
stopped: meta.stopped
}
};
if (args.mode === "selection" && args.useExpandingContext) {
const meta = args.responseJson._codeguard_context_expansion_meta;
const stopped = (meta as Record<string, unknown>).stopped;
return stopped === "full_file";
}
3. 本次新增清单
- 新增跨文件上下文补全入口(无风险后的二次确认)。
- 新增 Python 关联文件推断(导入关系 + 调用名匹配)。
- 新增自动打开并分析相关文件流程。
- 新增跨文件结果反馈(命中与否、命中文件)。
- 新增上下文扩展结构化元数据用于稳定触发判断。
4. 验证建议
- 在 Python 文件执行
Analyze Current File,确保“无风险”后弹出跨文件补全提示。 - 在
Analyze Selection中选择短片段,走到“扩到全文仍无风险”,确认也会弹提示。 - 点击同意后,观察是否自动打开相关文件并输出跨文件检查日志。
- 检查
git status:不应再出现.venv、__pycache__、*.pyc与out/extension.js(.map)的新跟踪变化。
5. 风险与边界说明
- 当前跨文件定位是“轻量启发式”(import + 调用名),非完整调用图,可能存在漏召回或误召回。
- 当前只在 Python 主线上启用该能力,符合项目 MVP 范围。
- 若后续扩展到项目级扫描,建议将此流程下沉到后端统一做跨文件图分析。
6.新增功能截图





还有使用的测试代码(比较简陋,先跑通了最简单的方案,后面拿我原来的实验代码测试查找效果)
test.py没变化,可以参考上篇博客(个人博客3)
新增一个文件newfiletest.py

这里可以看到输出还有些问题,有些地方写的不够清楚,给的改动建议也太宽泛,后面需要再改改。下一篇应该是完善博客3和博客4的功能,之前的代码已经与主分支合并了,新代码依旧明天找个时间推送到git。
更多推荐

所有评论(0)