Skip to content
←INDEX / 提示詞庫
TUTORIAL/Claude Code/進階

Claude Code Hook 食譜:每次編輯後自動格式化+lint(PostToolUse)

用一段 PostToolUse hook,讓 Claude Code 每次 Edit/Write 完檔案就自動跑 formatter(Prettier/Black/gofmt)+linter,把「格式不一致」這件雜事從你的 code review 裡永久移除。

SakuyaPromptCraft 主筆 · 寫於 2026-06-08
AI 教學 / 腳本Claude Code進階≈ 401 tokens · 實際用量依工具與輸入而異
Last reviewed2026-06-08Read~10 MIN

01PROMPT

# 目標:Claude Code 每次編輯檔案後,自動格式化+lint
# 放到 .claude/settings.json(專案層級)或 ~/.claude/settings.json(全域)。
# 機制:PostToolUse hook 在 Edit / Write / MultiEdit 完成「之後」觸發,
#       hook 從 stdin 收到 JSON,裡面 tool_input.file_path 是剛被改的檔案。

{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Edit|Write|MultiEdit",
        "hooks": [
          {
            "type": "command",
            "command": "bash {{PROJECT_DIR}}/.claude/hooks/format-after-edit.sh"
          }
        ]
      }
    ]
  }
}

# ---- .claude/hooks/format-after-edit.sh ----
# chmod +x 後使用。依副檔名挑工具,找不到工具就安靜跳過(不要讓 hook 把流程弄爆)。
#!/usr/bin/env bash
set -euo pipefail

# 從 stdin 的 JSON 取出剛被編輯的檔案路徑
file=$(jq -r '.tool_input.file_path // empty')
[ -z "$file" ] && exit 0
[ ! -f "$file" ] && exit 0

case "$file" in
  *.ts|*.tsx|*.js|*.jsx|*.mjs|*.json|*.css|*.md)
    # JS/TS 系:先 format 再 lint --fix(工具不存在就略過)
    command -v {{PRETTIER_CMD}} >/dev/null 2>&1 && {{PRETTIER_CMD}} --write "$file" >/dev/null 2>&1 || true
    command -v {{ESLINT_CMD}}  >/dev/null 2>&1 && {{ESLINT_CMD}}  --fix "$file" >/dev/null 2>&1 || true
    ;;
  *.py)
    command -v {{PY_FORMATTER}} >/dev/null 2>&1 && {{PY_FORMATTER}} "$file" >/dev/null 2>&1 || true   # 例:black / ruff format
    command -v ruff >/dev/null 2>&1 && ruff check --fix "$file" >/dev/null 2>&1 || true
    ;;
  *.go)
    command -v gofmt >/dev/null 2>&1 && gofmt -w "$file" >/dev/null 2>&1 || true
    ;;
  *.rs)
    command -v rustfmt >/dev/null 2>&1 && rustfmt "$file" >/dev/null 2>&1 || true
    ;;
esac
exit 0
# 注意:PostToolUse 在工具已執行「之後」才跑,無法阻止編輯;
# 它的用途是「事後自動修好」,不是「事前攔截」。要攔截請用 PreToolUse。

把方括號 [ ] 內的變數換成你的內容,丟進 Claude Code。

◆ 直接開到工具Claude(記得貼)
RUN站內試跑 / TRY IT
▶ 站內試跑

不用離開網站,直接看這組 prompt 跑出來長怎樣(AI 即時生成,扣 1 點)。

SKILL安裝成 SKILL / INSTALL
安裝成 SKILLClaude Code Agent Skill

不只複製貼上 — 下載後放到 ~/.claude/skills/hook-auto-format-lint-after-edit/SKILL.md,之後每個 session 自動可用(觸發時自動載入)。

macOS / Linux
mkdir -p ~/.claude/skills/hook-auto-format-lint-after-edit && mv ~/Downloads/SKILL.md ~/.claude/skills/hook-auto-format-lint-after-edit/SKILL.md
Windows PowerShell
New-Item -ItemType Directory -Force "$env:USERPROFILE\.claude\skills\hook-auto-format-lint-after-edit" | Out-Null; Move-Item "$env:USERPROFILE\Downloads\SKILL.md" "$env:USERPROFILE\.claude\skills\hook-auto-format-lint-after-edit\SKILL.md"

02CONTEXT / 使用情境

## 這是什麼/解決什麼痛點 讓 AI 寫 code 最惱人的小事之一,就是「排版風格不一致」:它有時用 2 空白、有時 4 空白,import 順序、引號、結尾分號每次都不太一樣。結果你的 code review 一半時間在看 whitespace diff,git blame 也被無意義的格式變動洗版。這個 hook 食譜把「格式化+lint --fix」綁進 Claude Code 的生命週期:只要 AI 用 Edit / Write / MultiEdit 改了檔案,PostToolUse hook 就立刻對那個檔案跑 formatter 與 linter,等你看到 diff 時它「已經對齊」了。 ## 為什麼這來源值得用 Claude Code 的 hooks 是「由 harness 執行的確定性 shell 指令」,不是請 AI「記得格式化」——AI 會忘、hook 不會。本食譜的 PostToolUse 結構(`matcher` 鎖定 `Edit|Write`、`hooks[].type=command`、由 stdin 收 JSON 取 `tool_input.file_path`)直接取自 rohitg00/awesome-claude-code-toolkit 裡實際運作的 `auto-stage` PostToolUse hook;該 hook 原本是「編輯後自動 git stage」,我把同一套觸發機制改寫成「編輯後自動 format+lint」,是對同一個官方機制的忠實延伸,不是憑空杜撰。 ## 怎麼用(步驟) 1. 把上面的 JSON 併進 `.claude/settings.json`(只想對自己生效就放 `~/.claude/settings.json`)。 2. 建立 `.claude/hooks/format-after-edit.sh`,貼上腳本,`chmod +x` 給執行權限。 3. 確認機器上有 `jq`(hook 用它解析 stdin JSON)與你要的工具(prettier / eslint / black / ruff / gofmt …)。 4. 把 `{{PRETTIER_CMD}}`、`{{ESLINT_CMD}}`、`{{PY_FORMATTER}}` 換成你的實際指令(例:`npx prettier`、`npx eslint`、`black`)。 5. 在 Claude Code 裡用 `/hooks` 確認載入,然後叫 AI 隨便改一個檔案,觀察是否自動被格式化。 ## 要點 - **找不到工具就靜默跳過**(`|| true`):別讓 hook 因為某台機器沒裝某工具而中斷整個編輯流程。 - **只針對單一檔案跑**:用 `file_path` 對剛改的檔案 format,而不是全 repo,速度快、不污染其他檔案。 - **PostToolUse 無法阻止編輯**:它在工具執行「之後」才跑,定位是「事後自動修好」。要在危險動作發生前攔截,請改用 PreToolUse(見本站另一篇危險指令 guardrail 食譜)。 ## 何時用 團隊有共用 formatter/linter 設定、又常讓 Claude Code 大量改檔時最有感;個人專案想維持乾淨 git 歷史、讓每個 diff 都只有「真正的邏輯變動」也很適合。若你的 formatter 很慢(大型 mono-repo 全量跑),記得把它鎖在「單檔」而非全專案,避免每次編輯都卡住。 📎 來源:rohitg00/awesome-claude-code-toolkit(作者 Rohit Ghumare,Apache-2.0 授權)— 本篇 PostToolUse hook 結構取自其 auto-stage hook,繁中改寫並從「自動 git stage」延伸為「自動格式化+lint」,原始內容見上方連結。

04VARIABLES / 變數說明

01[PROJECT_DIR]

專案根目錄路徑,hook 腳本所在位置(也可用相對路徑 .claude/hooks/...)

02[PRETTIER_CMD]

Prettier 執行指令,例如 npx prettier 或 pnpm prettier

03[ESLINT_CMD]

ESLint 執行指令,例如 npx eslint 或 pnpm eslint

04[PY_FORMATTER]

Python formatter 指令,例如 black 或 ruff format

05RESOLVER · 變數代入器0 / 4

填下面的欄位,上方 prompt 會即時替換 [方括號] 內容。填好後按「複製組好的 prompt」直接丟進工具。

修飾
Assembled · 填剩餘變數…
# 目標:Claude Code 每次編輯檔案後,自動格式化+lint
# 放到 .claude/settings.json(專案層級)或 ~/.claude/settings.json(全域)。
# 機制:PostToolUse hook 在 Edit / Write / MultiEdit 完成「之後」觸發,
#       hook 從 stdin 收到 JSON,裡面 tool_input.file_path 是剛被改的檔案。

{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Edit|Write|MultiEdit",
        "hooks": [
          {
            "type": "command",
            "command": "bash {{PROJECT_DIR}}/.claude/hooks/format-after-edit.sh"
          }
        ]
      }
    ]
  }
}

# ---- .claude/hooks/format-after-edit.sh ----
# chmod +x 後使用。依副檔名挑工具,找不到工具就安靜跳過(不要讓 hook 把流程弄爆)。
#!/usr/bin/env bash
set -euo pipefail

# 從 stdin 的 JSON 取出剛被編輯的檔案路徑
file=$(jq -r '.tool_input.file_path // empty')
[ -z "$file" ] && exit 0
[ ! -f "$file" ] && exit 0

case "$file" in
  *.ts|*.tsx|*.js|*.jsx|*.mjs|*.json|*.css|*.md)
    # JS/TS 系:先 format 再 lint --fix(工具不存在就略過)
    command -v {{PRETTIER_CMD}} >/dev/null 2>&1 && {{PRETTIER_CMD}} --write "$file" >/dev/null 2>&1 || true
    command -v {{ESLINT_CMD}}  >/dev/null 2>&1 && {{ESLINT_CMD}}  --fix "$file" >/dev/null 2>&1 || true
    ;;
  *.py)
    command -v {{PY_FORMATTER}} >/dev/null 2>&1 && {{PY_FORMATTER}} "$file" >/dev/null 2>&1 || true   # 例:black / ruff format
    command -v ruff >/dev/null 2>&1 && ruff check --fix "$file" >/dev/null 2>&1 || true
    ;;
  *.go)
    command -v gofmt >/dev/null 2>&1 && gofmt -w "$file" >/dev/null 2>&1 || true
    ;;
  *.rs)
    command -v rustfmt >/dev/null 2>&1 && rustfmt "$file" >/dev/null 2>&1 || true
    ;;
esac
exit 0
# 注意:PostToolUse 在工具已執行「之後」才跑,無法阻止編輯;
# 它的用途是「事後自動修好」,不是「事前攔截」。要攔截請用 PreToolUse。
SOURCE / 來源歸屬
FAQ · 常見問題

「Claude Code Hook 食譜:每次編輯後自動格式化+lint(PostToolUse)」這組提示詞要怎麼用?

這組 prompt 專為 Claude Code 設計。把 prompt 內 4 個方括號 [變數] 換成你自己的內容,貼進 Claude Code 執行即可。難度中等,照變數說明填好後即可上手。

「Claude Code Hook 食譜:每次編輯後自動格式化+lint(PostToolUse)」是免費的嗎?

完整 prompt 免費開放閱讀,不用註冊;可保存瀏覽器收藏,登入後可一鍵複製與留言。

用 Claude Code 依這組 prompt 生成的成果可以商用嗎?

prompt 文字本身你可自由使用與修改。但 AI 生成物(圖/音樂/影片/文字)的商用授權,取決於你在 Claude Code 使用的方案與其官方服務條款,請以該工具的授權規範為準。

RELATED你可能也需要

PRO01
TUTORIALSuno v5.5FEATURED
r/SunoAI (anonymous studio engineer)2026-06-12

Suno 工程師思維:4 步驟做出不像 AI 的歌

5.0(1)

Studio engineer 視角拆解 Suno 致命弱點(油炸 vocals、高頻 artifact)+ 4 步驟 DAW workflow + Suno Studio 修音 prompt

高階
Read

免費02
TUTORIALClaude 4.5 SonnetFEATURED
r/ClaudeAI2026-05-14

5 個 6 月 stuck 下來的 Claude 每週 workflow

提案產生器 / 會議處理器 / 內容再利用 / 週五回顧 / 收工 reset — 試了 40 個只有這 5 個沒被丟掉、各省 30+ 分鐘 / 次。

進階
Read

PRO03
TUTORIALClaude 4.5 SonnetFEATURED
r/PromptEngineering2026-05-14

7 個跨 model A/B 測過的 prompt 技巧(不是 vibes)

六個月在 Claude / GPT-4 / Gemini 上用人工 rater A/B 測 200+ prompt 後寫的。包含 persona+constraint stacking / anti-example / role reversal QA / cognitive scaffold / emotional priming / uncertainty CoT / steelman first。

高階
Read

免費04
TUTORIALChatGPTFEATURED
r/ChatGPTPromptGenius2026-05-14

5 個信任檢查單行 prompt(沒有 role-play)

一年的 role-play system prompt + 14-step framework 後總結:真正改變品質的是 5 個單行 prompt。沒有 role、沒有 markdown、沒有「you are an expert」。

入門
Read

免費 · 全文開放閱讀

完整 prompt 已經開放.

免登入閱讀全文、保存瀏覽器收藏;登入後可一鍵複製與留言討論。不用信用卡。

不想註冊?

留個 email,下次有新 prompt 會寄一封簡短摘要給你。退訂一鍵、不轉賣。

每週一期,新上架提示詞 + 模型測試心得。每封信底部都有一鍵取消訂閱。

或訂 RSS feed(30 秒一次的人味選擇)

COMMENTS · 討論區0 則
登入 後可留言。還沒帳號?註冊
目前沒有留言。第一個說說你的經驗。
EMBED · 嵌入 blog / Note一行 iframe HTML、貼進文章即顯示此 prompt 卡片+

適合:部落格、Medium、Notion 公開頁、Substack — 任何支援 iframe / HTML 嵌入的地方。對方點「看完整」會回到本站、是 prompt 庫的免費 backlink。

<iframe src="https://prompt.luvai.net/embed/claude-code-hook-auto-format-lint-after-edit" width="100%" height="380" frameborder="0" style="border:1px solid #e0dcd0;border-radius:4px;" loading="lazy" title="PromptCraft Embed"></iframe>
預覽 embed →380px tall · responsive width
發現這個 prompt 過時 / 跑不動 / 有錯字? 回報給我們 →