第三章 工具目录
本章覆盖第 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, symbol 或 line/character |
跳转到符号定义 |
code.references |
path, symbol 或 line/character, include_declaration(默认 false) |
查找符号的全部引用 / 调用点 |
code.hover |
path, line, character |
查看符号的类型 / 签名 / 文档 |
code.symbols |
path |
列出文件的符号大纲 |
code.workspace_symbols |
query |
全仓按名搜索符号 |
code.diagnostics |
path(可空) |
报告编译错误 / 警告;空 path 返回工作区聚合 |
code.call_hierarchy |
path, symbol 或 line/character, direction(incoming/outgoing) |
调用图 |
code.repo_map |
— | 项目骨架(文件树 + 各文件顶层符号),token 友好 |
code.rename |
path, symbol 或 line/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, symbol 或 line/character |
跳到接口 / 抽象方法的实现(LSP implementation) |
code.type_definition |
path, symbol 或 line/character |
跳到变量 / 表达式的类型定义(LSP typeDefinition) |
code.document_highlight |
path, symbol 或 line/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=false、files_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)、count、indexed_symbols、indexed_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 / info,confidence ∈ 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 后台任务请显式指定解释器。
