1. 本次改动总览

我在团队中主要负责渐进式上下文补全、大模型调用、漏洞解释生成、修复建议输出,是连接后端规则分析与前端插件 展示的核心环节。AI 模块的稳定性、准确率和响应速度,将直接决定项目最终能否达到可演示、可考核、可验收的标准。

上次说要写跨文件补全,但是没找到合适的项目,自己写了一个简单的python调用试试水。顺便改了一些git上的小问题  。本次主要完成两类工作:

  1. 工程治理:新增仓库根目录 .gitignore,并将已被跟踪的虚拟环境/缓存/编译产物从 Git 索引移除。
  2. 功能增强:在现有“文件内上下文补全”的基础上,增加“跨文件上下文补全”能力,支持在当前分析范围无明确漏洞时,继续自动检查被调用文件。

2. 我改动的文件和实现的功能

2.1 /.gitignore

改动内容

  • 新增忽略规则:
    • backend/.venv/
    • backend/**/__pycache__/
    • *.pyc
    • vscode-extension/out/extension.js
    • vscode-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. 验证建议

  1. 在 Python 文件执行 Analyze Current File,确保“无风险”后弹出跨文件补全提示。
  2. 在 Analyze Selection 中选择短片段,走到“扩到全文仍无风险”,确认也会弹提示。
  3. 点击同意后,观察是否自动打开相关文件并输出跨文件检查日志。
  4. 检查 git status:不应再出现 .venv__pycache__*.pyc 与 out/extension.js(.map) 的新跟踪变化。

5. 风险与边界说明

  • 当前跨文件定位是“轻量启发式”(import + 调用名),非完整调用图,可能存在漏召回或误召回。
  • 当前只在 Python 主线上启用该能力,符合项目 MVP 范围。
  • 若后续扩展到项目级扫描,建议将此流程下沉到后端统一做跨文件图分析。

6.新增功能截图

还有使用的测试代码(比较简陋,先跑通了最简单的方案,后面拿我原来的实验代码测试查找效果)

test.py没变化,可以参考上篇博客(个人博客3)

新增一个文件newfiletest.py

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

Logo

欢迎加入 MCP 技术社区!与志同道合者携手前行,一同解锁 MCP 技术的无限可能!

更多推荐