第三章 工具目录

本章覆盖第 11–14 章:智能编程与安全分析工具的参数速查、外部工具服务接入字段与工具权限策略。


第十一节 智能编程工具

[!ref] 详解见用户手册「智能编程工具」节。

11.1 工具一览

工具 用途 默认权限
fs.read 读文件(按行 / 按字节) 启用
fs.write 覆盖写整个文件 询问
fs.patch 基于行号 + 校验哈希做精确替换 询问
fs.list 列目录 启用
fs.glob 通配符匹配文件名 启用
fs.grep 内容正则搜索 启用
fs.exec 同步执行命令 询问
fs.exec.start 启动后台命令,返回 session_id 询问
fs.exec.tail 拉取后台命令实时输出 启用
fs.exec.kill 终止后台命令 启用
fs.exec.list 列出当前后台命令 启用
time.now 获取当前时间(带时区) 启用
git.status 仓库状态 启用
git.branch 创建 / 切换分支 询问
git.init 初始化仓库 询问
web.bing Bing 搜索(RSS 端点) 启用
web.fetch 抓取指定 URL 并清洗为可阅读文本 启用
skill.list 列出当前可用技能 启用
skill.invoke 渲染并调用某个技能 启用
TodoWrite 写入 / 更新待办列表(最多 50 条) 启用
TaskWait 阻塞等待后台任务 / 子代理(默认 5min,最长 30min;支持 all / any 启用
SuggestTask AI 主动建议一个分外任务(卡片形式挂在消息流,不打断当前正事) 启用
DismissTask AI 撤回已过时的建议任务 启用
mcp.list_servers 列出所有 MCP server 启用
mcp.describe_server 查看某 server 详情(密钥脱敏) 启用
mcp.list_tools 查看某 server 暴露的工具 启用
mcp.test_server 真握手探活(30s 预算,含 4 阶段) 启用
mcp.add_server 新增 server(写类,两步制 confirm=true 询问
mcp.remove_server 删除 server(写类,两步制);默认 MCP 后端现在也可删(网关此前会拒删默认后端,已修复) 询问
mcp.toggle_server 启停 server(写类,两步制) 询问
mcp.import_config 批量导入;支持 Claude Desktop schema(写类,两步制) 询问
mcp.export_config 导出当前配置(密钥脱敏) 启用
PluginSearch 搜索插件市场目录(全局只读,无需工作区上下文) 启用
PluginList 列出已装 / 可装插件清单 启用
PluginInstall 安装插件并在当前工作区激活(写类,两步制:先返回 dry_run 预览 — 能力清单 / MCP 真实命令行 / 签名状态 / 来源溯源,confirm=true 才落地;签名校验沿用产品策略) 询问
PluginUninstall 卸载插件并同步清理工具配置残留(写类,两步制) 询问

11.2 通用返回字段

读取 / 搜索类工具的返回都包含:

字段 类型 说明
truncated bool 是否被软上限 / 硬上限截断
next_offset int 下次按行读的起始行号
next_byte_offset int 下次按字节读的起始字节
content_hash string 整文件内容指纹(写入校验用)
line_hashes array 行级指纹(patch 校验用);已去重,仅在需要时输出

结果瘦身(省 token / 额度):工作区工具的返回路径一律相对工作区根relPath),错误串出口剥除根路径前缀(不外泄绝对根),去除重复 line_hashes分页记账(next_offset 等)仅在 truncated=true 时才输出

11.3 read

参数 类型 默认 说明
path string 相对工作区根;必填
mode enum lines lines / bytes
offset int 0 起始行号 / 字节偏移
limit int 软上限 4096 字节上限;硬上限 256 KiB

11.4 write

参数 类型 默认 说明
path string 必填
content string 必填
expected_hash string 上次 read 返回的 content_hash;用于并发覆写校验(CAS)

11.5 patch

参数 类型 默认 说明
path string 必填
start_line int 1-based
end_line int 1-based,含
replacement string 新内容
verify_hashes array 该行号区间的 line_hashes;不匹配则拒绝

11.6 list

参数 类型 默认 说明
path string . 相对工作区根
pattern string * shell 风格通配
include_hidden bool false 是否包含隐藏文件
sort enum name name / mtime / size
limit int 4096 字节 单次返回总长度上限

11.7 glob

参数 类型 默认 说明
pattern string 通配符表达式
path string . 相对工作区根
sort enum mtime mtime / name
自动跳过 .git/ node_modules/ dist/ 不可解除

11.8 grep

参数 类型 默认 说明
pattern string RE2 正则
path string . 相对工作区根
path_glob string **/* 文件名过滤
case enum smart sensitive / insensitive / smart
context int 0 上下文行数
include_binary bool false 默认启发式跳过二进制

11.9 fs.exec / fs.exec.start

参数 类型 默认 说明
cmd string 必填
cwd string 工作区根 相对路径
timeout_seconds int 120 超过即终止
env object 追加环境变量
stdin string 选填
output_byte_limit int 4096 / 256 KiB 软上限 / 硬上限(stdout、stderr 各自)

11.10 fs.exec.tail / fs.exec.kill / fs.exec.list

工具 参数 说明
fs.exec.tail session_id, stream(stdout 默认 / stderr), byte_offset(opt), byte_limit(opt,默认 4096,硬上限 256 KiB) 按字节偏移续读输出;返回 status / exit_code / buffer_truncated / next_byte_offset
fs.exec.kill session_id, grace_seconds(opt) 终止会话;grace_seconds 先发 SIGTERM 等 N 秒再 SIGKILL,0 = 直接 SIGKILL(Windows 忽略)。Unix 整组终止,Windows 单杀头进程
fs.exec.list 当前所有后台会话列表

本地后台会话上限:最多 16 个并发;单会话磁盘日志 256 MiB(溢出丢尾);进程退出后日志可继续拉取,1 小时后 GC 回收;会话随 Interpreter 生命周期结束。

SSH 远端后台会话不受上述限制:状态与日志落在远端 <root>/.avlcode/sessions/,日志为完整文件(无 256 MiB 环形丢尾),且跨断线重连与应用重启存活(见 §22.4)。

11.11 web.bing / web.fetch

工具 参数 说明
web.bing query, top_k(默认 5) Bing RSS 搜索;返回标题 / 摘要 / URL
web.fetch url, format(md/txt/html) 抓取并清洗

11.12 code.* — 代码智能工具组(基于 LSP)

工具 参数 说明
code.definition path, symbolline/character 跳转到符号定义
code.references path, symbolline/character, include_declaration(默认 false) 查找符号的全部引用 / 调用点
code.hover path, line, character 查看符号的类型 / 签名 / 文档
code.symbols path 列出文件的符号大纲
code.workspace_symbols query 全仓按名搜索符号
code.diagnostics path(可空) 报告编译错误 / 警告;空 path 返回工作区聚合
code.call_hierarchy path, symbolline/character, direction(incoming/outgoing) 调用图
code.repo_map 项目骨架(文件树 + 各文件顶层符号),token 友好
code.rename path, symbolline/character, new_name 跨文件安全重命名(写盘)
code.code_action path, line, character, apply_title(可空) 不传 = 列出动作;传 = 应用对应快速修复(写盘)
code.lsp_status LSP server 池实时状态:运行中的 server / 工程 root / 存活 / 在线·空闲秒数 / 支持语言
code.search query(必填), limit(默认 20), path, refresh(默认 false), expand(默认 false) 非向量全库 RAG 检索(见 §11.12.3)
code.ask question(必填), limit(默认 12), path 全库 RAG 问答,复用会话模型(见 §11.12.3)
code.implementation path, symbolline/character 跳到接口 / 抽象方法的实现(LSP implementation)
code.type_definition path, symbolline/character 跳到变量 / 表达式的类型定义(LSP typeDefinition)
code.document_highlight path, symbolline/character 本文件内该符号的全部读 / 写 / 引用点,比全仓 references 轻量
code.completion path, line, character 该光标位置的补全候选
code.signature_help path, line, character 函数调用的形参签名 + 当前高亮参数(光标置于调用括号内)
code.formatting path, tab_size(默认 4), use_tabs(默认 false) 按 LSP 格式化整篇并写盘;无改动则不写

位置参数对外 1-based(对齐 fs.read 行模式 / cat -n);进 LSP 前由 interpret 层转 0-based。

能力降级:可选能力(implementation / type_definition / document_highlight / completion / signature_help / formatting 等)并非每个语言服务器都实现。是否支持按真实响应判定而非按 server 声明预判(避免声明缺失导致的误拒);判定为不支持后跨会话缓存,同一 server 不再重复试探。

11.12.1 内置语言(22 门,按 ID)

go · ts · py · c(cpp) · rust · java · deno · eslint(js 增强) · lua · bash · yaml · php · ruby · vue · zig · dart · kotlin · clojure · elixir · haskell · fsharp · csharp · gleam · astro

每门语言绑定一个 LSP 命令(gopls / typescript-language-server / pyright-langserver / clangd / rust-analyzer / jdtls / …);缺哪个按需自动下载go install / npm 等),并显示安装进度。

11.12.2 用户配置文件 lsp.yaml / lsp.json

工作区根目录 .avlcode/~/.avlcode/,按 lsp.yaml > lsp.yml > lsp.json 顺序取第一个存在的:

lsp:
  rust:
    disabled: true              # 禁用
  go:
    cmd: gopls                  # 覆盖启动命令
    args: ["-rpc.trace"]
    root_markers: ["go.mod", "go.work"]
  custom_lang:                  # 增加自定义 server
    extensions: [".myx"]
    cmd: my-langserver
    install_via: npm
    install_pkgs: [my-langserver]

热重载:文件 mtime/size 变更自动重读,不必重启工作区。服务器进程崩了 / SSH 掉线自动重启

11.12.3 全库 RAG 检索与问答(code.search / code.ask

非向量(零 embedding)符号级全库检索:BM25 + 标识符切分(驼峰 / 下划线 / 连字符)+ 中日韩二元切分(中文注释 / 中文提问同样能命中),纯本地、可离线。索引落 <base>/.avlcode/rag/symbols.jsonl(远程工作区仅内存),首建后按文件 mtime 增量同步(改 / 增 / 删)。仅索引定义类符号(函数 / 方法 / 类型 / 接口 / 常量等)。

索引文件数上限 4000(不可配)。超限时如实回报而非静默截断:结果里带 index_covers_all_files=falsefiles_not_indexed(未纳入索引的文件数)与 truncated_hint 可读提示,便于判断"没搜到"是真不存在还是没覆盖到。

code.search 参数

参数 类型 默认 说明
query string 必填,自然语言 / 关键词 / 符号名
limit int 20 返回命中数上限
path string 工作区根 限定子目录
refresh bool false 强制全量重建索引
expand bool false 结构重排:对头部命中跑 LSP 调用层级,被调用更多 = 更核心、排更前(更准但慢)

返回 hits[]file / start_line / end_line / name / kind / score / why[](命中的关键词)/ 可选 container·signature)、countindexed_symbolsindexed_files;空结果给 hint

code.ask 参数

参数 类型 默认 说明
question string 必填,自然语言问题
limit int 12 喂给合成的检索片段数
path string 工作区根 限定子目录

复用当前会话的 provider / model(隐式注入,未取到则回落 AVL-Zero)。返回 answer + citations[]file / start_line / end_line / name)+ hit_count + model;检索不到会直说、不编造。默认对扩展检索结果做结构感知智能重排(无需显式 expand)。

上限:索引文件数 ≤ 4000、全量构建超时 120s、每文件 ≤ 400 符号 / ≤ 4 MiB;结构重排取头部 8 条。增量刷新的作用域已修正(文件变更后不多刷、不漏刷)。

11.13 test.run — 测试运行 + 失败回灌

字段 类型 说明
framework string 可选;go / pytest / cargo / node(vitest / jest);留空 = 自动探测
path string 可选;限定范围(Go 包模式 ./pkg/... / pytest 目录或文件 / cargo 包名)
command string 可选;完整测试命令覆盖(如 go test -run TestFoo ./pkg
timeout_sec int 默认 300 秒

返回failures[](最多 50 条 {test, file, line, message}) + 一小段原始 tail;未知框架退回到退出码 + tail 兜底。plan(筹划)模式禁用(执行测试会产生写副作用);assess(评估)模式可用,以便验收阶段实际跑测试。

11.13.1 自检门禁(opt-in,泛化的多检查器)

粒度 默认 说明
自检门禁 G 设置 → 代码测试与自检 tab 配全局默认(~/.config/avlcode/checkgate-default.yaml
自检门禁 W 工作区 .avlcode/testgate.yaml;新会话默认值
自检门禁 S 继承 W 会话菜单的检查项勾选清单逐条覆盖;显示实际生效
仅在有编辑后跑 没改动文件的轮次跳过
连续注入上限 3 撞到即停门禁

testgate.yaml 结构

enabled: true
checks:                              # 检查器列表(可单选 / 组合)
  - name: test                       # test | diagnostics | lint | sast
    mode: block                      # block | report
    submode: changed                 # test: changed | full
    scope: changed                   # changed | workspace
  - name: lint
    mode: block
    submode: strict                  # lint: strict | lenient
    linters: [errcheck, govet]       # 子集(可选)
  - name: sast
    mode: report
    submode: quick                   # sast: quick | deep
    config: .semgrep.yml             # 离线规则(可选)
modes:                               # 按工作模式分别覆盖
  plan:    { enabled: false }
  prepare: { enabled: false }

11.13.2 CheckSpec 字段

字段 类型 说明
name enum test / diagnostics / lint / sast / testgen / judge
mode enum block(默认,注入强制修) / report(只通报不拦)
submode string test: changed / full;lint: strict / lenient;sast: quick / deep
scope enum changed(默认,改动文件) / workspace(全库)
path string 限定范围(可选)
linters array lint 子集(可选)
config string 自定义配置路径(sast .semgrep.yml 等)
timeout_sec int 单检查器超时

11.13.2a testgen — 改动缺测试自动补(opt-in)

  • 不在默认集:要显式把 testgen 加进 checks 才生效。
  • 覆盖语言:Go / Python / JavaScript / TypeScript;其它扩展名(.c / .java 等)不判定。
  • 测试文件本身与生成物跳过:避免「给测试写测试」「给 .pb.go 写测试」。
  • 存在性查询:经 zMCP 网关 fs.glob 查测试文件存在性(SSH 远端也正确)。
  • 3 次注入硬上限:复用 MaxTestGateRetries,误报最多纠缠 3 轮即停门禁。

11.13.2b judge — LLM 收尾自审(opt-in,默认 report

  • 独立 fresh-context 模型调用:复用 agentFacade.CompactSummaryStream不带 agent 自己的对话历史,消除自我合理化偏见。
  • 看什么:本轮目标 + diff,挑出机检抓不到的逻辑 / 语义 / 安全意图错。
  • few-shot 提示 + 当轮诊断背景注入到 prompt,判断更准、误报更少。
  • 门控judge 在所有便宜检查器之后、且仅当 block 检查器全绿时才跑。
  • 模型乱报 / JSON 脏 / 超时 → 非权威放行,绝不误拦。
  • 返回结构{ok: bool, issues: [{file, line, severity, confidence, message}]}severity ∈ error / warning / infoconfidence ∈ 0..1。block 模式下的 confidence / severity 阈值过滤为 Phase 2 计划。

11.13.3 lint.run — 静态检查(只读分析)

字段 类型 说明
linter string golangci-lint / eslint / ruff;留空 = 自动探测(go.mod → golangci-lint / .eslintrc·eslint.config → eslint / pyproject.toml·ruff.toml → ruff)
path string 范围(目录 / 文件 / Go 包模式 ./...
linters array 子集(如 golangci 的 errcheck / govet
submode string strict(警告也算失败) / lenient
config string 自定义配置文件路径
command string 完整命令覆盖
timeout_sec int 默认 180

返回findings[]{file, line, rule, severity, message}),与 test.run 同形。golangci-lint v1 / v2 JSON 输出参数已自适应。只读分析,plan / assess 模式可用。

11.13.4 sast.run — 安全静态分析(只读分析)

字段 类型 说明
path string 范围
submode string quick(限大文件加速) / deep(完整)
config string 规则配置;空 = --config auto(联网拉规则);离线请用本地 .semgrep.yml
command string 完整命令覆盖
timeout_sec int 默认 240

返回findings[] 同形。后端:semgrep。只读分析,plan / assess 模式可用。

11.14 tools.list / tools.describe / tools.load — 工具自省与按需加载

工具 参数 说明
tools.list prefix(可选) 列本会话可调用的工具(名 + 描述);可按命名空间过滤
tools.describe name(必填) 返回指定工具的完整 schema(描述 + 参数定义)
tools.load 分类名 按分类加载工具;不传时返回分类目录(每类一句话能力说明 + 工具名清单)

自省结果按本会话的实际可用性裁剪(受工具三态与分类延迟加载影响),返回的说明中会提示"表里看不见 ≠ 不存在,可先 tools.load"。这两个自省工具本身穿透子代理白名单恒可用,但输出仍按名单裁剪,且压不过用户设置的禁用清单。

11.14.1 工具分类延迟加载

默认开启(Settings.ToolLazyLoad,schema v9 起)。开关在智能体管理器 →「配置工具」Tab →「工具分类延迟加载」不在设置页

  • 常驻分类fs(读写 / glob / grep / exec)、tools(list / describe / load)、agent(委派 + EnterPlanMode / ExitPlanMode / TodoWrite)。
  • 16 个可延迟分类code / git / sec / vt / sbom / mcp / web / skill / test / lint / sast / market / plugin / gh / sys / time
  • 加载路径:① 隐式 —— 按新增 user 消息中的关键词预加载对应分类(中英关键词表);② 显式 —— tools.load 点名加载。会话中途新连的 MCP 后端分类自动放行。
  • 旁路:可见候选 ≤ 32 个时整表放行(子代理白名单模式通常走这条)。
  • 开启时系统提示词会注入一段说明,告知助手工具表是有意精简的、可按需加载。
  • 每个 MCP 服务可单独设置是否延迟(Settings.MCPLazyLoad,缺省跟随全局)—— 见 §13.1。

11.15 Python venv 自动感知

fs.exec / fs.exec.start 在工作区里跑 Python 相关命令时自动遵循工作区 venv:

来源 探测路径
标准 venv <工作区>/.venv / <工作区>/venv
conda env 目录下的 bin/python(含 Windows Scripts/python.exe
poetry poetry env info -p(项目外环境也支持)
pipenv pipenv --venv

机制:把首命令改写成 venv 里的绝对路径 + 注入 VIRTUAL_ENV / PATH。项目外发现缓存 5 分钟 / 探测超时 15 秒。全局关闭AVLCODE_DISABLE_VENV_AUTODETECT=1

pyright 语言服务(code.*)也接入 venv 感知,本地 + SSH 远端一致。

例外:SSH 远端的后台命令fs.exec.start)不做 venv 感知 —— venv 探测靠本机目录结构,在远端会探到错误的本地路径。远端跑 Python 后台任务请显式指定解释器。