Clipping 微信公众号

别让 AI 写完代码就跑了:Hooks + Pre-commit,给 AI 编码装上刹车

by 吕昭波 原文 ↗
Created: 2026-06-05

公众号名称:沐然云计算

作者名称:吕昭波

发布时间:2026-06-04 23:38

“AI 写的代码又快又多,但合进去之后才发现——有人在 commit 里留下了云服务密钥,有人让 AI 把生产库的表给改了,还有个同事的 Prompt 里暴露了客户手机号。这些问题不是 AI 的错,是我们的流程没拦住。”

在AI Coding阶段容易被低估的功能就是 Hooks****机制——它不是让 AI 写得更快,而是让 AI 写得更安全。本文帮你在 AI 编码的五个关键时刻插入安全检查。

01 | 为什么光靠”人盯着”不够

AI 编码的速度是人的 5-10 倍。一个开发者在 IDE 里聊几句就能生成上百行代码。但问题也出在这里:

写得太快,快到人来不及检查。

传统的防线是这样的:代码写完了 → 提交 → PR → 人工 Review → 发现问题 → 打回修改。这条链路的平均时长是 2-4 小时。AI 呢?生成 100 行代码只要 30 秒。防线速度跟不上生成速度。

所以问题的本质不是”AI 写的代码质量差”,而是”旧流程的设计假设是代码生产速度慢”。当生产速度翻了 10 倍,你不应该在终点加更多审查者,而应该在过程中就装上自动刹车。

这就是 Pre-commit Hooks 和 Qoder Hooks 要解决的问题。

02 | 防线要装在五个关键时刻

很多AI IDE引入了 Hook 机制,允许在 AI Agent 执行流程中插入自定义脚本。五个关键时刻:

时机事件名能干什么能阻断吗
用户提交 Prompt 后UserPromptSubmit检查 Prompt 是否含敏感信息✅ 能阻断
工具调用前PreToolUse拦截危险命令(rm -rf 等)✅ 能阻断
工具调用后PostToolUse自动格式化代码、跑 Lint不阻断
工具调用失败后PostToolUseFailure记录日志、发送告警不阻断
Agent 停止时Stop保存对话历史、生成摘要不阻断

把这五个时刻和传统的 Git Pre-commit 结合起来,你就有了一张完整的拦截网:

写代码时      L0  写时约束(Spec、Rules)保存时        L1  IDE 检查(语法、类型)commit 时     L2  Pre-commit Hook(Lint、单元测试)━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━push 前       L3  Qoder Hook · 用户Prompt提交 → 敏感信息检查              L3  Qoder Hook · 工具调用前 → 危险命令拦截              L3  Qoder Hook · 工具调用后 → 自动格式化 + LintPR 时         L5  代码评审(AI Review + 人工 Review)上线前        L6  部署前扫描
写代码时      L0  写时约束(Spec、Rules)
保存时        L1  IDE 检查(语法、类型)
commit 时     L2  Pre-commit Hook(Lint、单元测试)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
push 前       L3  Qoder Hook · 用户Prompt提交 → 敏感信息检查
L3  Qoder Hook · 工具调用前 → 危险命令拦截
L3  Qoder Hook · 工具调用后 → 自动格式化 + Lint
PR 时         L5  代码评审(AI Review + 人工 Review)
上线前        L6  部署前扫描

**L2 和 L3 是”AI 编码场景”下最关键的两层。**传统的 L2(Pre-commit)只能拦住常规问题(格式、基础安全),但 AI 特有的风险——Prompt 泄露敏感数据、生成危险命令、写入不该写的路径——必须在 L3 层拦截。

03 | 三个最有用的 Hook 脚本

脚本一:拦截危险命令

AI 有时候会在写代码的过程中执行 Shell 命令。如果一个 Prompt 让它”清理一下临时文件”,它可能执行 rm -rf /tmp/cache。但这行命令如果少了 /tmp,后果不堪设想。

#!/bin/bash# 保存为 ~/.lingma/hooks/block-dangerous.sh# chmod +x ~/.lingma/hooks/block-dangerous.shinput=$(cat)command=$(echo "$input" | jq -r '.tool_input.command // ""')# 黑名单:这些命令不管什么参数都拦截if echo "$command" | grep -qE 'rm\s+-rf\s+/|DROP\s+TABLE|mkfs|dd\s+if=.*of='; then  echo "🚫 危险命令已被 Qoder Hook 拦截: $command" >&2  echo "如需执行此操作,请手动在终端中运行并确认。" >&2  exit 2fiexit 0
#!/bin/bash
# 保存为 ~/.lingma/hooks/block-dangerous.sh
# chmod +x ~/.lingma/hooks/block-dangerous.sh
input=$(cat)
command=$(echo "$input" | jq -r '.tool_input.command // ""')
# 黑名单:这些命令不管什么参数都拦截
if echo "$command" | grep -qE 'rm\s+-rf\s+/|DROP\s+TABLE|mkfs|dd\s+if=.*of='; then
echo "🚫 危险命令已被 Qoder Hook 拦截: $command" >&2
echo "如需执行此操作,请手动在终端中运行并确认。" >&2
exit 2
fi
exit 0

配置到 AI IDE:

{  "hooks": {    "PreToolUse": [      {        "matcher": "Bash",        "hooks": [          {            "type": "command",            "command": "~/.qoder/hooks/block-dangerous.sh"          }        ]      }    ]  }}
{
"hooks": {
"PreToolUse": [
{
"matcher": "Bash",
"hooks": [
{
"type": "command",
"command": "~/.qoder/hooks/block-dangerous.sh"
}
]
}
]
}
}

脚本二:Prompt 敏感信息检查

工程师有时候会在 Prompt 中粘贴包含客户数据的日志、带有 API Key 的配置文件、甚至数据库连接串。这些内容一旦上传到云端 AI 服务,就是合规事故。

#!/bin/bash# 保存为 ~/.lingma/hooks/check-prompt.shinput=$(cat)prompt=$(echo "$input" | jq -r '.prompt // ""')# 检测常见敏感信息模式patterns=(  'password\s*[:=]\s*\S+'  'api_key\s*[:=]\s*\S+'  'secret\s*[:=]\s*\S+'  'token\s*[:=]\s*\S+'  '1[3-9]\d{9}'  'AKIA[0-9A-Z]{16}')for pattern in "${patterns[@]}"; do  if echo "$prompt" | grep -qiE "$pattern"; then    echo "⚠️  你的 Prompt 可能包含敏感信息(匹配模式: $pattern)" >&2    echo "请检查并脱敏后重新提交。这会触发合规风险。" >&2    exit 2  fidoneexit 0
#!/bin/bash
# 保存为 ~/.lingma/hooks/check-prompt.sh
input=$(cat)
prompt=$(echo "$input" | jq -r '.prompt // ""')
# 检测常见敏感信息模式
patterns=(
'password\s*[:=]\s*\S+'
'api_key\s*[:=]\s*\S+'
'secret\s*[:=]\s*\S+'
'token\s*[:=]\s*\S+'
'1[3-9]\d{9}'
'AKIA[0-9A-Z]{16}'
)
for pattern in "${patterns[@]}"; do
if echo "$prompt" | grep -qiE "$pattern"; then
echo "⚠️  你的 Prompt 可能包含敏感信息(匹配模式: $pattern)" >&2
echo "请检查并脱敏后重新提交。这会触发合规风险。" >&2
exit 2
fi
done
exit 0

脚本三:自动格式化 AI 生成的代码

AI 生成的代码有时缩进、换行和项目的 ESLint 规则不一致。让 Hook 在 AI 写完文件后自动格式化:

#!/bin/bash# 保存为 .lingma/hooks/auto-format.shinput=$(cat)file=$(echo "$input" | jq -r '.tool_input.file_path // ""')# 只对前端项目生效if [[ "$file" == *.tsx ]] || [[ "$file" == *.ts ]] || [[ "$file" == *.js ]]; then  npx prettier --write "$file" 2>/dev/null  echo "✓ 已自动格式化: $file"fiexit 0
#!/bin/bash
# 保存为 .lingma/hooks/auto-format.sh
input=$(cat)
file=$(echo "$input" | jq -r '.tool_input.file_path // ""')
# 只对前端项目生效
if [[ "$file" == *.tsx ]] || [[ "$file" == *.ts ]] || [[ "$file" == *.js ]]; then
npx prettier --write "$file" 2>/dev/null
echo "✓ 已自动格式化: $file"
fi
exit 0

04 | Pre-commit 和 Hooks 怎么配合

Pre-commit 管”提交前的那一瞬间”,Hooks 管”AI 执行过程中的每一个关键节点”。两者不是替代关系,是上下游:

开发者写 Prompt → [UserPromptSubmit Hook: 检查敏感信息]    ↓AI 开始执行 → [PreToolUse Hook: 拦截危险命令]    ↓AI 写文件 → [PostToolUse Hook: 自动格式化]    ↓开发者 git add    ↓git commit → [Pre-commit Hook: Lint + 单元测试]    ↓git push → [CI 流水线]
开发者写 Prompt → [UserPromptSubmit Hook: 检查敏感信息]

AI 开始执行 → [PreToolUse Hook: 拦截危险命令]

AI 写文件 → [PostToolUse Hook: 自动格式化]

开发者 git add

git commit → [Pre-commit Hook: Lint + 单元测试]

git push → [CI 流水线]

一个完整的项目级 .pre-commit-config.yaml可能是这样的:

repos:  - repo: https://github.com/pre-commit/pre-commit-hooks    rev: v4.6.0    hooks:      - id: trailing-whitespace      - id: end-of-file-fixer      - id: check-yaml      - id: detect-private-key      - id: detect-aws-credentials  - repo: local    hooks:      - id: eslint        name: ESLint        entry: npx eslint --fix        language: system        types: [javascript]      - id: qoder-review        name: Qoder AI Review        entry: qodercli review --staged        language: system        pass_filenames: false
repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v4.6.0
hooks:
- id: trailing-whitespace
- id: end-of-file-fixer
- id: check-yaml
- id: detect-private-key
- id: detect-aws-credentials
- repo: local
hooks:
- id: eslint
name: ESLint
entry: npx eslint --fix
language: system
types: [javascript]
- id: qoder-review
name: Qoder AI Review
entry: qodercli review --staged
language: system
pass_filenames: false

配合 Qoder 的 settings.json,你给 AI 编码装了五道自动刹车。

05 | 从 Demo 到生产的最后一公里

很多团队卡在这里:Demo 跑通了,AI 确实能写代码。但要上生产,CTO 问的第一个问题就是——“安全吗?出了事谁负责?”

Hooks + Pre-commit 就是这个问题的答案。它不靠人盯着,不靠”我相信我的工程师不会犯错”,而是靠机制

而且这套体系的部署成本很低:三个脚本加起来不到 50 行,复制粘贴、改权限、重启 IDE,15 分钟搞定。投入 15 分钟,给所有 AI 生成的代码装上一套免疫系统。


内容效果不满意?点此反馈

输入关键词开始搜索