Skip to content

新增 internal/repository,并在 runtime -> context 主链中条件化接入仓库上下文#430

Merged
phantom5099 merged 18 commits into1024XEngineer:mainfrom
phantom5099:main
Apr 24, 2026
Merged

新增 internal/repository,并在 runtime -> context 主链中条件化接入仓库上下文#430
phantom5099 merged 18 commits into1024XEngineer:mainfrom
phantom5099:main

Conversation

@phantom5099
Copy link
Copy Markdown
Collaborator

Summary

本次改动新增了专门的 internal/repository 模块,作为仓库级事实的统一落点,并在 runtime -> context 主链中接入一条受控、按需的 repository context 注入路径。

当前实现统一提供:

  • 结构化仓库摘要:Summary()
  • 受限的 changed-files 上下文:ChangedFiles()
  • 结构化定向检索:Retrieve()
  • runtime 侧条件化的仓库上下文注入

这次落地的是一个轻量事实层,不是代码智能平台。本次不会引入 LSP、向量检索、预索引,也不会把 repository 暴露成模型直接调用的工具。

背景问题

此前项目中的仓库感知能力比较分散:

  • internal/context/source_system.go 只内置了一小段 git 状态解析
  • 更完整的仓库事实没有明确的模块边界
  • changed-files 和 targeted retrieval 没有稳定的内建入口

这带来了几个具体问题:

  1. 仓库事实依赖零散的 git / 文件检索逻辑,缺少统一抽象。
  2. context 很容易继续膨胀成“发现事实 + 决定注入 + 渲染 prompt”的混合层。
  3. 后续如果要增强“当前改动相关上下文”或“快速定位最相关代码”的能力,没有清晰的落点。

主要改动

1. 新增 internal/repository

新增统一的仓库事实服务:

  • Summary(ctx, workdir)
  • ChangedFiles(ctx, workdir, opts)
  • Retrieve(ctx, workdir, query)

核心特性:

  • 只返回结构化结果
  • 所有输出都有上限
  • 统一暴露 Truncated
  • 内建工作区路径校验
  • symbol 检索采用 Go-first 的轻量实现

2. 将 git summary 责任从 context 中迁出

internal/context/source_system.go 不再直接执行和解析 git status

现在改为:

  • context 消费 repository.Summary
  • System State 仍由 context 负责渲染
  • 仓库事实发现逻辑不再混在 prompt 组装代码里

3. 为 context 增加 repository prompt section

context.BuildInput 新增了 repository 投影字段,context 在 runtime 显式传入数据时,会渲染独立的 Repository Context section。

这个 section 目前可承载:

  • changed files
  • targeted retrieval 结果

context 本身不决定是否拉取这些事实。

4. 在 runtime 中新增条件化 repository context 决策

runtime 现在会在构建当前轮上下文之前,判断是否值得注入 repository context。

当前策略:

  • 只有当用户消息明显指向“当前改动 / diff / review / fix”时,才尝试拉取 ChangedFiles
  • 只有小变更集才允许自动附带 snippet
  • 只有当用户消息包含明确锚点时,才会自动触发一次 Retrieve
    • 路径
    • 符号名
    • 被包裹的关键词
  • 每轮自动 retrieval 只允许一种模式,优先级固定为:
    • path > symbol > text

这样可以保证 repository context 只在高相关场景下注入,避免默认膨胀 prompt。

5. 复用现有 workspace 安全语义

新增 internal/security/workspace_paths.go,让 repository 的路径解析直接复用现有 workspace containment 和 symlink escape 语义,而不是自己维护第二套边界规则。

6. 更新文档

  • README.md 增加 internal/repository 说明
  • docs/repository-design.md 补充模块职责、边界、上限与非目标

收益

开发侧收益

  • 仓库事实有了统一、可测试的模块落点,不再把 git 和检索逻辑散落在多个模块中。
  • 职责边界更清晰:
    • repository 负责发现事实
    • runtime 负责决定何时使用事实
    • context 负责渲染事实
  • 后续增强 changed-files 工作流或 targeted retrieval 时,有明确扩展点,不需要继续污染 context 或别的层。
  • 测试更清晰,可以分别验证事实获取、runtime 决策和 prompt 渲染。
  • 不再保留旧 git 解析主链和新模块双轨并存的问题。

用户侧收益

  • 当任务明显和“当前工作区改动”相关时,agent 更容易理解这次改动集中在哪些文件。
  • 当用户给出明确路径、符号或关键词时,agent 能更快命中目标代码位置。
  • prompt 里的仓库信息更克制,不会默认把大量 diff 或搜索结果塞进每一轮。
  • review、debug、“这个实现在哪”这类任务的结果会更稳定、更贴近当前工作区状态。

设计约束

本次实现明确避免了几个问题:

  • 不默认在每一轮自动注入 changed-files 或 retrieval 结果
  • 不新增模型可直接调用的 repository tool
  • 不在新增 internal/repository 后继续保留零散 repo 解析旁路
  • 不在 security 之外再维护第二套 workspace 路径边界语义
  • 不做 LSP、预索引、向量检索等超前设计

测试验证

已通过:

  • go test ./internal/runtime/... ./internal/context/... ./internal/repository/... ./internal/security/...

同时也检查了:

  • go test ./...

当前全量测试状态:

  • 仍存在一个已有的 Windows 环境问题:internal/config/atomic_write_test.go
  • 失败表现为目录 fsync 时的 Access is denied
  • 本次改动没有引入新的全量失败项,失败仍停留在这条既有基线问题上

风险

主要风险:

  • 如果后续触发条件放宽,repository context 可能重新拉高 prompt 体积
  • 如果自动 retrieval 的锚点识别过宽,可能引入误命中噪声
  • 如果 repository 路径语义和 workspace 安全规则再次漂移,会重新产生碎片化

本次的控制方式:

  • 所有 repository 注入都由 runtime 条件化触发
  • snippet 有单独门槛和上限
  • 每轮自动 retrieval 只允许一种模式
  • repository 获取失败时,非致命错误统一降级为空 repository context
  • 路径校验复用 internal/security 的共享语义

后续建议

后续值得继续推进的方向:

  • 基于真实使用情况继续微调 runtime 的触发条件
  • 评估写工具成功后是否要在下一轮补一次 changed-files refresh
  • 评估某些显式 runtime workflow 是否适合直接消费 repository
  • 继续保持 context 的被动消费角色,不把 repository 取数逻辑再塞回去

@phantom5099
Copy link
Copy Markdown
Collaborator Author

@xgopilot 修复报错--- FAIL: TestRetrieveRejectsPathEscapeAndSymlinkEscape (0.00s)
repository_test.go:317: expected path traversal to be rejected
FAIL
coverage: 77.2% of statements
FAIL neo-code/internal/repository 0.017s
ok neo-code/internal/runtime 24.791s coverage: 92.4% of statements
ok neo-code/internal/runtime/approval 0.004s coverage: 100.0% of statements
ok neo-code/internal/runtime/controlplane 0.004s coverage: 91.0% of statements
ok neo-code/internal/runtime/streaming 0.003s coverage: 59.5% of statements
--- FAIL: TestResolveWorkspacePathRejectsTraversal (0.00s)
workspace_paths_test.go:35: expected traversal path to be rejected
FAIL
coverage: 92.2% of statements
FAIL neo-code/internal/security 0.017s

fennoai[bot]

This comment was marked as outdated.

@fennoai
Copy link
Copy Markdown

fennoai Bot commented Apr 23, 2026

修复结果

已修复 ..\\ 路径穿越未被拒绝的问题。

变更:

  • 修改 internal/security/workspace.goabsoluteWorkspaceTarget:在解析前统一将 \\ 规范为路径分隔符,再进入 filepath 解析流程。
  • 这样 ..\\outside.txt 在非 Windows 平台也会被按穿越路径处理并拒绝,repository.Retrieve(path)security.ResolveWorkspacePath 行为一致。

测试结果

已执行并通过:

  • go test ./internal/repository ./internal/security
  • go test ./internal/tools/bash
  • go test ./internal/runtime

提交与推送

未完成项:

View job run

phantom5099 and others added 3 commits April 23, 2026 21:44
…olution

Generated with [codeagent](https://github.com/qbox/codeagent)
Co-authored-by: phantom5099 <245659304+phantom5099@users.noreply.github.com>
fix(security): reject backslash traversal in workspace path resolution
@phantom5099
Copy link
Copy Markdown
Collaborator Author

/code 提高测试覆盖率至100%

@fennoai
Copy link
Copy Markdown

fennoai Bot commented Apr 23, 2026

结果

已完成一轮覆盖率提升并推送到当前工作分支。

已完成改动

  • 新增测试文件:
    • internal/repository/repository_additional_test.go
    • internal/runtime/repository_context_additional_test.go
  • 扩展测试文件:
    • internal/security/workspace_paths_test.go
    • internal/context/source_repository_test.go
    • internal/config/atomic_write_test.go

验证结果

  • go test ./internal/repository ./internal/runtime ./internal/security ./internal/context ./internal/config
  • go test ./...

关键包最新覆盖率:

  • internal/repository: 96.8%
  • internal/runtime: 93.1%
  • internal/context: 93.9%
  • internal/security: 92.6%
  • internal/config: 90.6%
  • internal/tools/bash: 89.1%

未完成项

  • 尚未达到“100%”目标。剩余盲区主要集中在少量极端/平台相关分支(例如部分路径规范化与 filepath.Rel/Abs 的错误分支),其中有几处在当前执行环境下接近不可触达。

View job run

xgopilot and others added 2 commits April 23, 2026 14:11
Generated with [codeagent](https://github.com/qbox/codeagent)
Co-authored-by: phantom5099 <245659304+phantom5099@users.noreply.github.com>
test: improve coverage for repository context branches
@phantom5099
Copy link
Copy Markdown
Collaborator Author

/simplify

@fennoai
Copy link
Copy Markdown

fennoai Bot commented Apr 23, 2026

完成情况

已按触发评论执行:先检查并评估未解决 review 评论,修复值得修复项,再调用 code-simplifier 做等价简化,最后提交并推送。

已修复问题

  1. walkWorkspaceFiles 缺少取消信号处理中断
  • 调整为 walkWorkspaceFiles(ctx, ...),在遍历入口、WalkDir 回调、以及检索内层循环都检查 ctx.Err() 并尽早返回。
  1. 检索读取缺少敏感/大文件防护
  • Retrieve 相关路径新增读取前过滤:
    • 敏感文件:.env.env.*、以及常见密钥扩展名(如 .key/.pem/.p12/.pfx/...
    • 大文件上限:maxRetrievalFileBytes
    • 二进制内容过滤:前缀探测
  • 过滤命中按“无结果”降级,不中断整轮检索。

简化结果(code-simplifier)

  • internal/repository/retrieve.go 提取公共逻辑(读取过滤与 hit 构造)以减少重复。
  • internal/repository/path.go 简化查询归一化流程。
  • 在测试中减少重复 Service 初始化样板,保持断言语义不变。

测试

已通过:

  • go test ./internal/repository/...
  • go test ./...

提交与推送

  • Commit: 19771cb
  • Push: fork-pr-430-1776951612(已推送到 fork 远端同名分支)

未完成项:无。

View job run

xgopilot and others added 2 commits April 23, 2026 14:23
Generated with [codeagent](https://github.com/qbox/codeagent)
Co-authored-by: phantom5099 <245659304+phantom5099@users.noreply.github.com>
fix(repository): cancel-aware walk and safer retrieval filters
@phantom5099
Copy link
Copy Markdown
Collaborator Author

@xgopilot 批判性review整个PR,分析所有潜在风险点,找出所有漏洞,确保每个地方的修改不是退步的,方案上的设计也不能碎片化,更不能妥协式兼容或兜底旧代码,不许输出正向表扬

@phantom5099
Copy link
Copy Markdown
Collaborator Author

/review 做一轮审查性review

fennoai[bot]

This comment was marked as outdated.

@phantom5099
Copy link
Copy Markdown
Collaborator Author

@xgopilot 批判性review整个PR,分析所有潜在风险点,找出所有漏洞,确保每个地方的修改不是退步的,方案上的设计也不能碎片化,更不能妥协式兼容或兜底旧代码,不许输出正向表扬

@phantom5099
Copy link
Copy Markdown
Collaborator Author

@xgopilot 批判性review整个PR,分析所有潜在风险点,找出所有漏洞,确保每个地方的修改不是退步的,方案上的设计也不能碎片化,更不能妥协式兼容或兜底旧代码,不许输出正向表扬

@phantom5099
Copy link
Copy Markdown
Collaborator Author

@xgopilot --- FAIL: TestResolveWorkspaceWalkPathFromRootUnknownTypeStillChecksSymlinkEscape (0.00s)
workspace_paths_test.go:117: expected unknown-type walk path to keep symlink escape protection
FAIL
coverage: 92.1% of statements 修复错误,顺便再进行一轮审查性review

xgopilot and others added 2 commits April 23, 2026 17:15
Generated with [codeagent](https://github.com/qbox/codeagent)
Co-authored-by: phantom5099 <245659304+phantom5099@users.noreply.github.com>
fix(security): keep symlink escape checks for unknown walk entries
@phantom5099
Copy link
Copy Markdown
Collaborator Author

@xgopilot 批判性review整个PR,分析所有潜在风险点,找出所有漏洞,确保每个地方的修改不是退步的,方案上的设计也不能碎片化,更不能妥协式兼容或兜底旧代码,不许输出正向表扬

@phantom5099
Copy link
Copy Markdown
Collaborator Author

phantom5099 commented Apr 24, 2026

@xgopilot 批判性review整个PR,分析所有潜在风险点,找出所有漏洞,确保每个地方的修改不是退步的,方案上的设计
碎片化,更不能妥协式兼容或兜底旧代码,不许输出正向表扬。

@phantom5099
Copy link
Copy Markdown
Collaborator Author

/code 修复错误:--- FAIL: TestRetrieveRejectsPathEscapeAndSymlinkEscape (0.00s)
repository_test.go:487: expected path traversal to be rejected
FAIL
coverage: 87.2% of statements
FAIL neo-code/internal/repository 0.029s
ok neo-code/internal/runtime 23.907s coverage: 92.9% of statements
ok neo-code/internal/runtime/approval (cached) coverage: 100.0% of statements
ok neo-code/internal/runtime/controlplane (cached) coverage: 91.0% of statements
ok neo-code/internal/runtime/streaming (cached) coverage: 59.5% of statements
--- FAIL: TestResolveWorkspacePathRejectsTraversal (0.00s)
workspace_paths_test.go:126: expected traversal path to be rejected
FAIL

@fennoai
Copy link
Copy Markdown

fennoai Bot commented Apr 24, 2026

已修复触发评论中的两个失败用例,根因是 traversal 检测仅识别 /../,未覆盖反斜杠分隔场景(如 ..\\)。

变更

  • internal/security/capability.go
    • hasTraversal 中增加 \\ -> / 归一化,再执行 traversal 判定。
  • internal/security/capability_test.go
    • 新增回归断言:hasTraversal("a\\..\\b") == true

验证

  • go test ./internal/security ./internal/repository -run 'TestRetrieveRejectsPathEscapeAndSymlinkEscape|TestResolveWorkspacePathRejectsTraversal|TestCapabilityLowLevelBranchCoverage'
  • go test ./internal/security/... ./internal/repository/...

提交与推送

  • Commit: 925a8d8
  • 已推送到当前 PR 分支:phantom5099:main

未做项:未执行全量 go test ./...(本次仅针对触发失败相关模块做回归验证)。

View job run

Generated with [codeagent](https://github.com/qbox/codeagent)
Co-authored-by: phantom5099 <245659304+phantom5099@users.noreply.github.com>
@phantom5099
Copy link
Copy Markdown
Collaborator Author

/review

Copy link
Copy Markdown

@fennoai fennoai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

已按四轮流程完成审查(代码质量、性能、安全、文档一致性),未发现需要提出的显著问题。

Comment thread docs/repository-design.md
@@ -0,0 +1,66 @@
# Repository 模块设计
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

已审阅本 PR 变更,当前未发现需要额外修正的问题。

@phantom5099 phantom5099 merged commit c922e65 into 1024XEngineer:main Apr 24, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants