Files
2026-07-13 21:37:00 +08:00

8.6 KiB
Raw Permalink Blame History

name, description, version
name description version
Writing Hookify Rules 当用户要求「创建 hookify 规则」「编写 hook 规则」「配置 hookify」「添加 hookify 规则」或需要了解 hookify 规则语法与模式方面的指导时,应使用本技能。 0.1.0

编写 Hookify 规则

概述

Hookify 规则是带有 YAML frontmatter 的 markdown 文件,用于定义需要监控的模式以及在匹配到这些模式时显示的消息。规则存储在 .claude/hookify.{rule-name}.local.md 文件中。

规则文件格式

基本结构

---
name: rule-identifier
enabled: true
event: bash|file|stop|prompt|all
pattern: regex-pattern-here
---

当此规则触发时向 Claude 显示的消息。
可以包含 markdown 格式、警告、建议等内容。

Frontmatter 字段

name(必填):规则的唯一标识符

  • 使用 kebab-case 命名:warn-dangerous-rmblock-console-log
  • 应具有描述性且面向操作
  • 以动词开头:warn、prevent、block、require、check

enabled(必填):用于激活/停用的布尔值

  • true:规则处于活动状态
  • false:规则被禁用(不会触发)
  • 可在不删除规则的情况下切换

event(必填):触发哪个 hook 事件

  • bashBash 工具命令
  • fileEdit、Write、MultiEdit 工具
  • stop:当代理要停止时
  • prompt:当用户提交提示时
  • all:所有事件

action(可选):规则匹配时执行的操作

  • warn:显示消息但允许操作(默认值)
  • block:阻止操作(PreToolUse)或停止会话(Stop 事件)
  • 如果省略,默认值为 warn

pattern(简单格式):要匹配的正则表达式模式

  • 用于简单的单条件规则
  • 针对命令(bash)或新文本(file)进行匹配
  • 使用 Python 正则表达式语法

示例:

event: bash
pattern: rm\s+-rf

高级格式(多条件)

适用于包含多个条件的复杂规则:

---
name: warn-env-file-edits
enabled: true
event: file
conditions:
  - field: file_path
    operator: regex_match
    pattern: \.env$
  - field: new_text
    operator: contains
    pattern: API_KEY
---

你正在向 .env 文件添加 API 密钥。请确保此文件已在 .gitignore 中!

条件字段:

  • field:要检查的字段
    • 对于 bashcommand
    • 对于 filefile_pathnew_textold_textcontent
  • operator:匹配方式
    • regex_match:正则表达式模式匹配
    • contains:子字符串检查
    • equals:精确匹配
    • not_contains:子字符串不得出现
    • starts_with:前缀检查
    • ends_with:后缀检查
  • pattern:要匹配的模式或字符串

所有条件必须同时满足,规则才会触发。

消息正文

frontmatter 之后的 markdown 内容将在规则触发时显示给 Claude。

良好的消息:

  • 说明检测到了什么
  • 解释为什么有问题
  • 建议替代方案或最佳实践
  • 使用格式提高清晰度(加粗、列表等)

示例:

⚠️ **检测到 Console.log**

你正在向生产代码中添加 console.log。

**为什么这很重要:**
- 调试日志不应发布到生产环境
- Console.log 可能暴露敏感数据
- 影响浏览器性能

**替代方案:**
- 使用合适的日志库
- 在提交前删除
- 使用条件调试构建

事件类型指南

bash 事件

匹配 Bash 命令模式:

---
event: bash
pattern: sudo\s+|rm\s+-rf|chmod\s+777
---

检测到危险命令!

常见模式:

  • 危险命令:rm\s+-rfdd\s+if=mkfs
  • 权限提升:sudo\s+su\s+
  • 权限问题:chmod\s+777chown\s+root

file 事件

匹配 Edit/Write/MultiEdit 操作:

---
event: file
pattern: console\.log\(|eval\(|innerHTML\s*=
---

检测到可能有问题的代码模式!

在不同字段上匹配:

---
event: file
conditions:
  - field: file_path
    operator: regex_match
    pattern: \.tsx?$
  - field: new_text
    operator: regex_match
    pattern: console\.log\(
---

TypeScript 文件中的 Console.log

常见模式:

  • 调试代码:console\.log\(debuggerprint\(
  • 安全风险:eval\(innerHTML\s*=dangerouslySetInnerHTML
  • 敏感文件:\.env$credentials\.pem$
  • 生成的文件:node_modules/dist/build/

stop 事件

匹配代理要停止时(完成检查):

---
event: stop
pattern: .*
---

停止前,请确认:
- [ ] 测试已运行
- [ ] 构建成功
- [ ] 文档已更新

适用场景:

  • 关于必需步骤的提醒
  • 完成检查清单
  • 流程强制执行

prompt 事件

匹配用户提示内容(高级用法):

---
event: prompt
conditions:
  - field: user_prompt
    operator: contains
    pattern: deploy to production
---

生产环境部署检查清单:
- [ ] 测试通过?
- [ ] 团队审核通过?
- [ ] 监控已就绪?

模式编写技巧

正则表达式基础

字面字符: 大多数字符匹配自身

  • rm 匹配 "rm"
  • console.log 匹配 "console.log"

特殊字符需要转义:

  • .(任意字符)→ \.(字面点号)
  • ( )\( \)(字面括号)
  • [ ]\[ \](字面方括号)

常用元字符:

  • \s — 空白字符(空格、制表符、换行符)
  • \d — 数字(0-9
  • \w — 单词字符(a-z、A-Z、0-9、_)
  • . — 任意字符
  • + — 一个或多个
  • * — 零个或多个
  • ? — 零个或一个
  • | — 逻辑或

示例:

rm\s+-rf         匹配:rm -rf、rm  -rf
console\.log\(   匹配:console.log(
(eval|exec)\(    匹配:eval( 或 exec(
chmod\s+777      匹配:chmod 777、chmod  777
API_KEY\s*=      匹配:API_KEY=、API_KEY =

测试模式

在使用前测试正则表达式模式:

python3 -c "import re; print(re.search(r'your_pattern', 'test text'))"

或使用在线正则表达式测试工具(使用 Python 语法的 regex101.com)。

常见陷阱

过于宽泛:

pattern: log    # 会匹配 "log"、"login"、"dialog"、"catalog"

更好的写法:console\.log\(|logger\.

过于具体:

pattern: rm -rf /tmp  # 只匹配精确路径

更好的写法:rm\s+-rf

转义问题:

  • YAML 带引号字符串:"pattern" 需要使用双反斜杠 \\s
  • YAML 不带引号:pattern: \s 直接使用即可
  • 建议: 在 YAML 中使用不带引号的模式

文件组织

存放位置: 所有规则放在 .claude/ 目录下 命名规范: .claude/hookify.{描述性名称}.local.md Gitignore.claude/*.local.md 添加到 .gitignore

良好的命名:

  • hookify.dangerous-rm.local.md
  • hookify.console-log.local.md
  • hookify.require-tests.local.md
  • hookify.sensitive-files.local.md

不良的命名:

  • hookify.rule1.local.md(缺乏描述性)
  • hookify.md(缺少 .local
  • danger.local.md(缺少 hookify 前缀)

工作流程

创建规则

  1. 识别需要禁止的行为
  2. 确定涉及哪个工具(Bash、Edit 等)
  3. 选择事件类型(bash、file、stop 等)
  4. 编写正则表达式模式
  5. 在项目根目录创建 .claude/hookify.{名称}.local.md 文件
  6. 立即测试——规则会在下次使用工具时动态读取

优化规则

  1. 编辑 .local.md 文件
  2. 调整模式或消息
  3. 立即测试——更改会在下次使用工具时生效

禁用规则

临时禁用: 在 frontmatter 中设置 enabled: false 永久删除: 删除 .local.md 文件

示例

请参阅 ${CLAUDE_PLUGIN_ROOT}/examples/ 获取完整示例:

  • dangerous-rm.local.md — 阻止危险的 rm 命令
  • console-log-warning.local.md — 警告 console.log
  • sensitive-files-warning.local.md — 警告编辑 .env 文件

快速参考

最简可行规则:

---
name: my-rule
enabled: true
event: bash
pattern: dangerous_command
---

此处为警告消息

带条件的规则:

---
name: my-rule
enabled: true
event: file
conditions:
  - field: file_path
    operator: regex_match
    pattern: \.ts$
  - field: new_text
    operator: contains
    pattern: any
---

警告消息

事件类型:

  • bash — Bash 命令
  • file — 文件编辑
  • stop — 完成检查
  • prompt — 用户输入
  • all — 所有事件

字段选项:

  • Bashcommand
  • Filefile_pathnew_textold_textcontent
  • Promptuser_prompt

运算符:

  • regex_matchcontainsequalsnot_containsstarts_withends_with