第三章 工具目錄
本章覆蓋第 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 檢索(見 §7.12.3) |
code.ask |
question(必填), limit(預設 12), path |
全函式庫 RAG 問答,復用工作階段模型(見 §7.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 後台任務請顯式指定直譯器。
