第三章 工具目錄

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