Visual Studio Code Agent 鉤子 (預覽)
鉤子可讓您在代理 (Agent) 工作階段的關鍵生命週期點執行自訂 Shell 指令。使用鉤子可以自動化工作流程、強制執行安全策略、驗證操作並與外部工具整合。
關於鉤子如何融入 AI 自訂架構的背景資訊,請參閱自訂概念。
本文說明如何在 VS Code 中設定並使用鉤子。
Agent 鉤子目前處於預覽階段。設定格式與行為在未來的版本中可能會有所變更。
您的組織可能已停用 VS Code 中的鉤子功能。詳情請洽詢您的管理員。請參閱企業原則以了解詳情。
使用 Agent 自訂編輯器(預覽)來集中探索、建立及管理您所有的代理自訂項目。請從命令面板執行 Chat: Open Customizations。
鉤子的設計適用於各種代理類型,包括本機代理、背景代理和雲端代理。每個鉤子都會接收結構化的 JSON 輸入,並可回傳 JSON 輸出以影響代理的行為。
為什麼要使用鉤子 (hooks)?
鉤子提供確定性的程式碼驅動自動化。與引導代理行為的指令或自訂提示詞不同,鉤子會在特定的生命週期點執行您的程式碼,並具有保證的結果。
-
強制執行安全策略:在危險指令(如
rm -rf或DROP TABLE)執行前將其封鎖,無論代理收到的提示詞是什麼。 -
自動化程式碼品質:在檔案修改後自動執行格式化程式、檢查工具或測試。
-
建立稽核追蹤:記錄每一次的工具呼叫、指令執行或檔案變更,以利合規性檢查與偵錯。
-
注入內容:添加專案特定的資訊、API 金鑰或環境詳細資料,以協助代理做出更好的決策。
-
控制核准:自動核准安全的操作,同時對敏感操作要求確認。
快速入門:您的第一個鉤子
下列範例建立了一個鉤子,在每次編輯檔案後執行 Prettier。請在您的工作區中建立一個 .github/hooks/format.json 檔案。
{
"hooks": {
"PostToolUse": [
{
"type": "command",
"command": "npx prettier --write \"$TOOL_INPUT_FILE_PATH\""
}
]
}
}
儲存此檔案後,VS Code 會自動載入該鉤子。下次代理編輯檔案時,Prettier 就會對變更後的檔案執行。請檢查 GitHub Copilot Chat Hooks 輸出頻道以驗證鉤子是否執行。
若要了解使用自訂指令碼的更複雜鉤子,請參閱使用情境。
鉤子生命週期事件
VS Code 支援八種鉤子事件,會在代理工作階段的特定時間點觸發。
| 鉤子事件 | 觸發時機 | 常見使用情境 |
|---|---|---|
SessionStart (工作階段開始) |
使用者提交新工作階段的第一個提示詞 | 初始化資源、記錄工作階段開始、驗證專案狀態 |
UserPromptSubmit (使用者提交提示) |
使用者提交提示詞 | 稽核使用者請求、注入系統內容 |
PreToolUse (工具使用前) |
代理呼叫任何工具之前 | 封鎖危險操作、要求核准、修改工具輸入 |
PostToolUse (工具使用後) |
工具成功完成後 | 執行格式化程式、記錄結果、觸發後續動作 |
PreCompact (壓縮前) |
對話內容壓縮之前 | 匯出重要內容、在截斷前儲存狀態 |
SubagentStart (子代理開始) |
子代理被生成 (Spawned) 時 | 追蹤巢狀代理使用量、初始化子代理資源 |
SubagentStop (子代理停止) |
子代理完成時 | 彙總結果、清理子代理資源 |
Stop (停止) |
代理工作階段結束時 | 產生報告、清理資源、發送通知 |
設定鉤子
鉤子是在儲存於工作區或使用者目錄中的 JSON 檔案中進行設定。
鉤子檔案位置
VS Code 會在下列位置搜尋鉤子設定檔:
在 Monorepo 中,請啟用 chat.useCustomizationsInParentRepositories 以從父儲存庫根目錄探索鉤子。進一步了解父儲存庫探索。
| 範圍 | 預設檔案位置 |
|---|---|
| 工作區 | .github/hooks/*.json |
| 工作區 (Claude 格式) | .claude/settings.json, .claude/settings.local.json |
| 使用者 (User) | ~/.copilot/hooks, ~/.claude/settings.json |
| 自訂代理程式 | .agent.md frontmatter 中的 hooks 欄位(請參閱代理範圍鉤子) |
| 外掛程式 | hooks.json 或 hooks/hooks.json,取決於外掛程式格式(請參閱外掛程式中的鉤子) |
針對同一事件類型,工作區鉤子的優先順序高於使用者鉤子。
使用 chat.hookFilesLocations 設定來自訂要載入哪些鉤子檔案。您可以指定資料夾路徑(VS Code 會載入資料夾中所有的 *.json 檔案)或個別 .json 檔案的路徑。僅支援相對路徑與波浪號 (~) 路徑。
預設值包含這些位置:
"chat.hookFilesLocations": {
".github/hooks": true,
".claude/settings.local.json": true,
".claude/settings.json": true,
"~/.claude/settings.json": true
}
若要新增自訂位置,請將項目加入此設定。
"chat.hookFilesLocations": {
"custom/hooks": true,
"~/my-hooks/security.json": true
}
將路徑設為 false 可停用從該位置載入鉤子(包括預設位置)。例如,若要停止從 Claude Code 設定檔載入鉤子:
"chat.hookFilesLocations": {
".claude/settings.json": false,
".claude/settings.local.json": false,
"~/.claude/settings.json": false
}
代理範圍鉤子 (Agent-scoped hooks)
代理範圍鉤子目前處於預覽階段。
您可以直接在自訂代理的 YAML frontmatter 中定義鉤子。代理範圍鉤子僅在該自訂代理處於作用中狀態(無論是由使用者選取或作為子代理呼叫)時執行。代理範圍鉤子會與針對相同事件設定的工作區或使用者層級鉤子並行執行。
若要啟用代理範圍鉤子,請將 chat.useCustomAgentHooks 設定為 true。
在代理 frontmatter 中新增一個 hooks 欄位,其結構與鉤子設定檔相同:將事件名稱對應至鉤子指令物件的陣列。
---
name: "Strict Formatter"
description: "Agent that auto-formats code after every edit"
hooks:
PostToolUse:
- type: command
command: "./scripts/format-changed-files.sh"
---
You are a code editing agent. After making changes, files are automatically formatted.
鉤子設定格式
建立一個包含 hooks 物件的 JSON 檔案,該物件包含每個事件類型的鉤子指令陣列。為了相容性,VS Code 使用與 Claude Code 和 Copilot CLI 相同的鉤子格式。
{
"hooks": {
"PreToolUse": [
{
"type": "command",
"command": "./scripts/validate-tool.sh",
"timeout": 15
}
],
"PostToolUse": [
{
"type": "command",
"command": "npx prettier --write \"$TOOL_INPUT_FILE_PATH\""
}
]
}
}
鉤子指令屬性
每個鉤子項目必須具有 type: "command" 以及至少一個指令屬性。
| 屬性 | 類型 | 說明 |
|---|---|---|
類型 |
string | 必須為 "command" |
命令 |
string | 預設執行的指令(跨平台) |
windows |
string | Windows 專用的指令覆寫 |
linux |
string | Linux 專用的指令覆寫 |
osx |
string | macOS 專用的指令覆寫 |
cwd |
string | 工作目錄(相對於儲存庫根目錄) |
環境變數 |
object | 額外的環境變數 |
timeout |
number | 逾時(秒,預設值:30) |
作業系統專用指令會根據擴充功能主機平台進行選擇。在遠端開發情境(SSH、容器、WSL)中,這可能與您的本機作業系統不同。
作業系統專用指令
為每個作業系統指定不同的指令
{
"hooks": {
"PostToolUse": [
{
"type": "command",
"command": "./scripts/format.sh",
"windows": "powershell -File scripts\\format.ps1",
"linux": "./scripts/format-linux.sh",
"osx": "./scripts/format-mac.sh"
}
]
}
}
執行服務會根據您的 OS 選擇適當的指令。如果未定義 OS 專用指令,則會回復使用 command 屬性。
鉤子輸入與輸出
鉤子透過標準輸入 (stdin) 和標準輸出 (stdout) 使用 JSON 與 VS Code 進行通訊。
常見輸入欄位
每個鉤子都會透過 stdin 接收一個包含這些常見欄位的 JSON 物件。
{
"timestamp": "2026-02-09T10:30:00.000Z",
"cwd": "/path/to/workspace",
"sessionId": "session-identifier",
"hookEventName": "PreToolUse",
"transcript_path": "/path/to/transcript.json"
}
常見輸出格式
鉤子可以透過 stdout 回傳 JSON 來影響代理行為。所有鉤子都支援這些輸出欄位:
{
"continue": true,
"stopReason": "Security policy violation",
"systemMessage": "Unit tests failed"
}
| 欄位 | 類型 | 說明 |
|---|---|---|
continue |
boolean | 設為 false 以停止處理(預設值:true) |
stopReason |
string | 當 continue 為 false 時的停止原因(顯示給使用者看) |
systemMessage |
string | 顯示給使用者的警告訊息 |
結束代碼 (Exit codes)
鉤子的結束代碼決定了 VS Code 如何處理結果。
| 結束代碼 | 行為 |
|---|---|
0 |
成功:將 stdout 解析為 JSON |
2 |
阻塞錯誤:停止處理並向模型顯示錯誤 |
| 其他 | 非阻塞警告:向使用者顯示警告,繼續處理 |
選擇回傳資料的方式
鉤子有幾種控制代理行為的方式:結束代碼、頂層輸出欄位 (continue, stopReason) 以及鉤子特定的輸出欄位 (hookSpecificOutput)。請依下列方式組合使用:
- 結束代碼 2 是封鎖操作最簡單的方法。鉤子的 stderr 會作為內容顯示給模型。不需要 JSON 輸出。
- JSON 輸出中的
continue: false會停止整個代理工作階段。使用stopReason告知使用者原因。這比封鎖單一工具呼叫更為嚴厲。 hookSpecificOutput提供針對每個鉤子事件的精細控制。例如,PreToolUse鉤子使用permissionDecision來允許、拒絕或要求確認單一工具呼叫,而無需停止工作階段。systemMessage無論其他決定為何,都會在聊天中向使用者顯示警告。
當多種控制機制同時使用時,限制最嚴格的機制會勝出。例如,如果一個鉤子回傳 continue: false 和 permissionDecision: "allow",工作階段仍然會停止。
PreToolUse (工具使用前)
PreToolUse 鉤子會在代理呼叫工具之前觸發。
PreToolUse 輸入
除了常見欄位外,PreToolUse 鉤子還會接收:
{
"tool_name": "editFiles",
"tool_input": { "files": ["src/main.ts"] },
"tool_use_id": "tool-123"
}
PreToolUse 輸出
PreToolUse 鉤子可以透過 hookSpecificOutput 物件控制工具執行。
{
"hookSpecificOutput": {
"hookEventName": "PreToolUse",
"permissionDecision": "deny",
"permissionDecisionReason": "Destructive command blocked by policy",
"updatedInput": { "files": ["src/safe.ts"] },
"additionalContext": "User has read-only access to production files"
}
}
| 欄位 | 值 | 說明 |
|---|---|---|
permissionDecision |
"allow", "deny", "ask" |
控制工具核准 |
permissionDecisionReason |
string | 顯示給使用者的原因 |
updatedInput |
object | 修改後的工具輸入(選填) |
additionalContext |
string | 提供給模型的額外內容 |
權限決定優先順序:當多個鉤子針對同一個工具呼叫執行時,限制最嚴格的決定勝出:
deny(最嚴格):封鎖工具執行ask:要求使用者確認allow(限制最少):自動核准執行
updatedInput 格式:若要判斷 updatedInput 的格式,請開啟代理記錄檔並找到記錄的工具結構描述 (Schema)。如果 updatedInput 不符合預期的結構描述,將會被忽略。
PostToolUse (工具使用後)
PostToolUse 鉤子會在工具成功完成後觸發。
PostToolUse 輸入
除了常見欄位外,PostToolUse 鉤子還會接收:
{
"tool_name": "editFiles",
"tool_input": { "files": ["src/main.ts"] },
"tool_use_id": "tool-123",
"tool_response": "File edited successfully"
}
PostToolUse 輸出
PostToolUse 鉤子可以為模型提供額外內容,或封鎖後續處理。
{
"decision": "block",
"reason": "Post-processing validation failed",
"hookSpecificOutput": {
"hookEventName": "PostToolUse",
"additionalContext": "The edited file has lint errors that need to be fixed"
}
}
| 欄位 | 值 | 說明 |
|---|---|---|
decision |
"block" |
封鎖後續處理(選填) |
reason |
string | 封鎖原因(顯示給模型) |
hookSpecificOutput.additionalContext |
string | 注入到對話中的額外內容 |
UserPromptSubmit (使用者提交提示)
UserPromptSubmit 鉤子會在使用者提交提示詞時觸發。
UserPromptSubmit 輸入
除了常見欄位外,UserPromptSubmit 鉤子還會接收包含使用者所提交文字的 prompt 欄位。
UserPromptSubmit 鉤子僅使用常見輸出格式。
SessionStart (工作階段開始)
SessionStart 鉤子會在新的代理工作階段開始時觸發。
SessionStart 輸入
除了常見欄位外,SessionStart 鉤子還會接收:
{
"source": "new"
}
| 欄位 | 類型 | 說明 |
|---|---|---|
source |
string | 工作階段開始的方式。目前皆為 "new"。 |
SessionStart 輸出
SessionStart 鉤子可以將額外內容注入到代理的對話中。
{
"hookSpecificOutput": {
"hookEventName": "SessionStart",
"additionalContext": "Project: my-app v2.1.0 | Branch: main | Node: v20.11.0"
}
}
| 欄位 | 類型 | 說明 |
|---|---|---|
additionalContext |
string | 加入代理對話的內容 |
Stop (停止)
Stop 鉤子會在代理工作階段結束時觸發。當針對自訂代理時,Stop 鉤子也會被視為 SubagentStop。
Stop 輸入
除了常見欄位外,Stop 鉤子還會接收:
{
"stop_hook_active": false
}
| 欄位 | 類型 | 說明 |
|---|---|---|
stop_hook_active |
boolean | 當代理因先前的停止鉤子而繼續執行時,此值為 true。請檢查此值以防止代理無限期執行。 |
Stop 輸出
Stop 鉤子可以防止代理停止。
{
"hookSpecificOutput": {
"hookEventName": "Stop",
"decision": "block",
"reason": "Run the test suite before finishing"
}
}
| 欄位 | 值 | 說明 |
|---|---|---|
decision |
"block" |
防止代理停止 |
reason |
string | 當決定為 "block" 時為必要欄位。告知代理為何應該繼續執行。 |
當 Stop 鉤子封鎖代理停止時,代理會繼續執行,且額外的回合會消耗 AI 點數。請務必檢查 stop_hook_active 欄位以防止代理無限期執行。
SubagentStart (子代理開始)
SubagentStart 鉤子會在子代理被生成時觸發。
SubagentStart 輸入
除了常見欄位外,SubagentStart 鉤子還會接收:
{
"agent_id": "subagent-456",
"agent_type": "Plan"
}
| 欄位 | 類型 | 說明 |
|---|---|---|
agent_id |
string | 子代理的唯一識別碼 |
agent_type |
string | 代理名稱(例如,內建代理為 "Plan" 或自訂代理名稱) |
SubagentStart 輸出
SubagentStart 鉤子可以將額外內容注入到子代理的對話中。
{
"hookSpecificOutput": {
"hookEventName": "SubagentStart",
"additionalContext": "This subagent should follow the project coding guidelines"
}
}
| 欄位 | 類型 | 說明 |
|---|---|---|
additionalContext |
string | 加入子代理對話的內容 |
SubagentStop (子代理停止)
SubagentStop 鉤子會在子代理完成時觸發。
SubagentStop 輸入
除了常見欄位外,SubagentStop 鉤子還會接收:
{
"agent_id": "subagent-456",
"agent_type": "Plan",
"stop_hook_active": false
}
| 欄位 | 類型 | 說明 |
|---|---|---|
agent_id |
string | 子代理的唯一識別碼 |
agent_type |
string | 代理名稱(例如,內建代理為 "Plan" 或自訂代理名稱) |
stop_hook_active |
boolean | 當子代理因先前的停止鉤子而繼續執行時,此值為 true。請檢查此值以防止子代理無限期執行。 |
SubagentStop 輸出
SubagentStop 鉤子可以防止子代理停止。
{
"decision": "block",
"reason": "Verify subagent results before completing"
}
| 欄位 | 值 | 說明 |
|---|---|---|
decision |
"block" |
防止子代理停止 |
reason |
string | 當決定為 "block" 時為必要欄位。告知子代理為何應該繼續執行。 |
PreCompact (壓縮前)
PreCompact 鉤子會在對話內容被壓縮前觸發。
PreCompact 輸入
除了常見欄位外,PreCompact 鉤子還會接收:
{
"trigger": "auto"
}
| 欄位 | 類型 | 說明 |
|---|---|---|
trigger |
string | 壓縮觸發的方式。當對話長度超過提示詞預算限制時,此值為 "auto"。 |
PreCompact 鉤子僅使用常見輸出格式。
透過 UI 設定鉤子
您可以透過互動式 UI 以幾種方式設定鉤子:
- 在聊天輸入框輸入
/hooks並按下 Enter。 - 開啟命令面板(⇧⌘P (Windows, Linux Ctrl+Shift+P))並執行 Chat: Configure Hooks。
- 選取聊天視圖頂部的 設定 圖示 (),然後選取 Hooks。
在設定鉤子選單中:
-
從清單中選取鉤子事件類型。
-
選擇現有的鉤子進行編輯,或選取 Add new hook 建立一個。
-
選取或建立鉤子設定檔。
該指令會在編輯器中開啟鉤子檔案,並將游標定位在指令欄位,準備進行編輯。
用 AI 產生鉤子
您可以使用 AI 來產生鉤子設定。在聊天中輸入 /create-hook 並描述您想要的自動化功能(例如:「在每次檔案編輯後執行 ESLint」)。代理會詢問澄清問題,並產生具有適當事件類型、指令和設定的鉤子設定檔。
使用情境
以下範例示範了常見的鉤子模式。
封鎖危險的終端機指令
建立一個 PreToolUse 鉤子以防止破壞性指令:
.github/hooks/security.json:
{
"hooks": {
"PreToolUse": [
{
"type": "command",
"command": "./scripts/block-dangerous.sh",
"timeoutSec": 5
}
]
}
}
scripts/block-dangerous.sh:
#!/bin/bash
INPUT=$(cat)
TOOL_NAME=$(echo "$INPUT" | jq -r '.tool_name')
TOOL_INPUT=$(echo "$INPUT" | jq -r '.tool_input')
if [ "$TOOL_NAME" = "runTerminalCommand" ]; then
COMMAND=$(echo "$TOOL_INPUT" | jq -r '.command // empty')
if echo "$COMMAND" | grep -qE '(rm\s+-rf|DROP\s+TABLE|DELETE\s+FROM)'; then
echo '{"hookSpecificOutput":{"permissionDecision":"deny","permissionDecisionReason":"Destructive command blocked by security policy"}}'
exit 0
fi
fi
echo '{"continue":true}'
編輯後自動格式化程式碼
在任何檔案修改後自動執行 Prettier:
.github/hooks/formatting.json:
{
"hooks": {
"PostToolUse": [
{
"type": "command",
"command": "./scripts/format-changed-files.sh",
"windows": "powershell -File scripts\\format-changed-files.ps1",
"timeout": 30
}
]
}
}
scripts/format-changed-files.sh:
#!/bin/bash
INPUT=$(cat)
TOOL_NAME=$(echo "$INPUT" | jq -r '.tool_name')
if [ "$TOOL_NAME" = "editFiles" ] || [ "$TOOL_NAME" = "createFile" ]; then
FILES=$(echo "$INPUT" | jq -r '.tool_input.files[]? // .tool_input.path // empty')
for FILE in $FILES; do
if [ -f "$FILE" ]; then
npx prettier --write "$FILE" 2>/dev/null
fi
done
fi
echo '{"continue":true}'
記錄工具使用以進行稽核
建立所有工具呼叫的稽核追蹤:
.github/hooks/audit.json:
{
"hooks": {
"PreToolUse": [
{
"type": "command",
"command": "./scripts/log-tool-use.sh",
"env": {
"AUDIT_LOG": ".github/hooks/audit.log"
}
}
]
}
}
scripts/log-tool-use.sh:
#!/bin/bash
INPUT=$(cat)
TIMESTAMP=$(echo "$INPUT" | jq -r '.timestamp')
TOOL_NAME=$(echo "$INPUT" | jq -r '.tool_name')
SESSION_ID=$(echo "$INPUT" | jq -r '.sessionId')
echo "[$TIMESTAMP] Session: $SESSION_ID, Tool: $TOOL_NAME" >> "${AUDIT_LOG:-audit.log}"
echo '{"continue":true}'
對特定工具要求核准
強制對修改基礎架構的工具進行手動確認:
.github/hooks/approval.json:
{
"hooks": {
"PreToolUse": [
{
"type": "command",
"command": "./scripts/require-approval.sh"
}
]
}
}
scripts/require-approval.sh:
#!/bin/bash
INPUT=$(cat)
TOOL_NAME=$(echo "$INPUT" | jq -r '.tool_name')
# Tools that should always require approval
SENSITIVE_TOOLS="runTerminalCommand|deleteFile|pushToGitHub"
if echo "$TOOL_NAME" | grep -qE "^($SENSITIVE_TOOLS)$"; then
echo '{"hookSpecificOutput":{"permissionDecision":"ask","permissionDecisionReason":"This operation requires manual approval"}}'
else
echo '{"hookSpecificOutput":{"permissionDecision":"allow"}}'
fi
在工作階段開始時注入專案內容
在工作階段開始時提供專案特定資訊:
.github/hooks/context.json:
{
"hooks": {
"SessionStart": [
{
"type": "command",
"command": "./scripts/inject-context.sh"
}
]
}
}
scripts/inject-context.sh:
#!/bin/bash
PROJECT_INFO=$(cat package.json 2>/dev/null | jq -r '.name + " v" + .version' || echo "Unknown project")
BRANCH=$(git branch --show-current 2>/dev/null || echo "unknown")
cat <<EOF
{
"hookSpecificOutput": {
"hookEventName": "SessionStart",
"additionalContext": "Project: $PROJECT_INFO | Branch: $BRANCH | Node: $(node -v 2>/dev/null || echo 'not installed')"
}
}
EOF
安全性
如果代理有權編輯鉤子執行的指令碼,那麼它就有能力在自己的執行過程中修改這些指令碼,並執行它所寫的程式碼。我們建議使用 chat.tools.edits.autoApprove 來禁止代理在未經手動核准的情況下編輯鉤子指令碼。
疑難排解
檢視鉤子診斷資訊
若要查看已載入哪些鉤子並檢查設定錯誤:
-
選取 View Logs 以檢視所有記錄檔。
-
搜尋 "Load Hooks" 以查看已載入的鉤子以及它們載入的位置。
檢視鉤子輸出
若要檢閱鉤子輸出與錯誤:
-
開啟 Output 面板。
-
從頻道清單中選取 GitHub Copilot Chat Hooks。
常見問題
鉤子未執行:驗證鉤子檔案是否位於 .github/hooks/ 並具有 .json 副檔名。檢查 type 屬性是否設為 "command"。
權限被拒錯誤:確保您的鉤子指令碼具有執行權限 (chmod +x script.sh)。
逾時錯誤:增加 timeout 值或最佳化您的鉤子指令碼。預設值為 30 秒。
JSON 解析錯誤:驗證您的鉤子指令碼是否輸出有效的 JSON 到 stdout。使用 jq 或 JSON 程式庫來建構輸出。
常見問題
VS Code 如何處理 Claude Code 鉤子設定?
VS Code 預設會從 .claude/settings.json、.claude/settings.local.json 和 ~/.claude/settings.json 讀取鉤子設定。VS Code 會解析 Claude Code 的鉤子設定格式,包括 Matcher 語法。目前,VS Code 會忽略 Matcher 值,因此鉤子會在所有工具呼叫時執行,而不管 Matcher 為何。
如果您要將 Claude Code 鉤子調整為 VS Code 使用,請注意下列差異:
- 工具輸入屬性名稱:Claude Code 使用 snake_case 作為工具輸入屬性(例如
tool_input.file_path),而 VS Code 工具使用 camelCase(例如tool_input.filePath)。請更新您的鉤子指令碼以讀取正確的屬性名稱。 - 工具名稱:Claude Code 和 VS Code 使用不同的工具名稱。例如,Claude Code 對檔案操作使用
Write和Edit,而 VS Code 使用如create_file和replace_string_in_file等工具名稱。請檢查tool_name輸入欄位中的工具名稱,並據此更新您的鉤子邏輯。 - Matchers 被忽略:如
"Edit|Write"等鉤子 Matchers 會被解析但不會被套用。所有鉤子都會在每個匹配事件上執行,而不管 Matcher 中的工具名稱為何。
VS Code 如何處理 Copilot CLI 鉤子設定?
VS Code 會解析 Copilot CLI 鉤子設定,並將 lowerCamelCase 鉤子事件名稱(如 preToolUse)轉換為 VS Code 使用的 PascalCase 格式 (PreToolUse)。bash 和 powershell 指令屬性會對應至作業系統專用指令:powershell 對應至 windows,而 bash 對應至 osx 和 linux。
安全性考量
鉤子以與 VS Code 相同的權限執行 Shell 指令。請務必仔細審查鉤子設定,特別是在使用來自不受信任來源的鉤子時。
-
審查鉤子指令碼:在啟用鉤子指令碼之前進行檢查,特別是在共用儲存庫中。
-
限制鉤子權限:使用最小權限原則。鉤子應該只能存取它們所需要的內容。
-
驗證輸入:鉤子指令碼會從代理接收輸入。請驗證並清理所有輸入,以防止注入攻擊。
-
保護憑證:切勿將秘密資訊硬編碼在鉤子指令碼中。請使用環境變數或安全憑證儲存庫。