第三章 工具目錄

本章覆蓋第 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 初始化倉函式庫 詢問
git.add 暫存文件 詢問
git.commit 提交暫存內容 詢問
git.checkout 檢出分支 / 文件 詢問
git.diff 檢視差異 啟用
git.log 提交歷史 啟用
git.show 檢視某次提交詳情 啟用
git.blame 逐行溯源 啟用
git.stash 暫存 / 恢復工作現場 詢問
git.merge 合併分支 詢問
git.rebase 變基 詢問
git.worktree.create 建立 worktree 詢問
git.worktree.list 列出 worktree 啟用
git.worktree.remove 刪除 worktree 詢問
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 預算;階段 validate_args / policy_denied / needs_approval / connect / list_tools / ok;http / sse 位址指向本機 / 內網時 policy_denied,無限制模式除外) 啟用
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
as_text bool false 對被判定為二進位的文件強制按文字讀取

編碼識別:優先按 BOM 判定;無 BOM 時識別 GBK / GB18030 / UTF-16 等常見編碼,解碼為 UTF-8 後交付。grep 走同一套解碼。確屬二進位的文件預設拒讀(用 as_text 覆蓋)。

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 各自)

支持的 shell 語法(非無限制模式同樣可用):

語法 判定
&& / || / ; 串聯,| 管道 逐段各自過白名單;任一段不過 → 整條拒絕
> / >> 重定向 目標須落在工作區或已附加的可寫路徑內
cd 允許,仍圈禁在工作區內
  • samples/ 只攔執行,不攔讀取與作為參數傳入。
  • test.run / lint.run / sast.run 給出的命令走同一套護欄與同一個分詞器。
  • 路徑口徑:工作區內的絕對路徑與相對路徑走同一套判定,不再一律拒絕絕對路徑。
  • 白名單已含 cc 家族編譯器(cc / gcc / clang 等):寫出通道(-o / -MF 等)圈禁工作區內,危險旗標前綴攔截。
  • 命令名歸一化(Windows):大小寫與 .exe 後綴不影響白名單判定;被政策拒絕時錯誤訊息帶上命令與規則上下文。
  • 輸出編碼:Windows 下 GBK / UTF-16 輸出在匯聚點統一歸一為 UTF-8(fs.exec 與 fs.exec.tail 均覆蓋)。
  • 回顯:結果中的命令按原樣保留引號,不做空格重拼。
  • Windows 批處理(.bat / .cmd)參數帶專門的注入護欄。
  • 工作目錄不被劫持:工作區下的同名文件不會被解析成待執行程式。

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、§6.8.1)
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 內置語言(24 門,按 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 工作區根 限定子目錄

模型:按「模型路由策略」在已啟用且有 API Key 的瀾砥系列模型中選(預設效果優先);無可用瀾砥模型時用當前會話的 provider / model(隱式注入);本機模式下只用會話模型;兩者都拿不到時報錯。超時與輸出上限跟隨所選模型配置。檢索片段會發給所選模型。

傳回 answer + citations[](file / start_line / end_line / name)+ hit_count + model + provider + routed(是否為路由選中的瀾砥模型);檢索不到會直說、不編造。預設對擴充檢索結果做結構感知智慧重排(無需顯式 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 背景任務請顯式指定直譯器。