()
| 313 | # ============================================================ |
| 314 | |
| 315 | def main(): |
| 316 | print("=" * 60) |
| 317 | print("Tutorial 08: Hook System 演示") |
| 318 | print("=" * 60) |
| 319 | |
| 320 | # --- 1. 允许型 Hook(退出码 0)--- |
| 321 | print("\n--- 场景 1: 允许型 Hook ---") |
| 322 | print(" Hook 命令: printf 'hook says hello'") |
| 323 | print(" 退出码: 0 → 允许执行") |
| 324 | |
| 325 | runner1 = HookRunner(HookConfig( |
| 326 | pre_tool_use=["printf 'pre-hook: checked tool'"], |
| 327 | post_tool_use=["printf 'post-hook: tool finished'"], |
| 328 | )) |
| 329 | |
| 330 | pre_result = runner1.run_pre_tool_use("bash", '{"command": "ls"}') |
| 331 | print(f" PreToolUse 结果: denied={pre_result.denied}, messages={pre_result.messages}") |
| 332 | |
| 333 | post_result = runner1.run_post_tool_use("bash", '{"command": "ls"}', "file1.py", False) |
| 334 | print(f" PostToolUse 结果: denied={post_result.denied}, messages={post_result.messages}") |
| 335 | |
| 336 | # --- 2. 拒绝型 Hook(退出码 2)--- |
| 337 | print("\n--- 场景 2: 拒绝型 Hook ---") |
| 338 | print(" Hook 命令: printf 'dangerous command blocked'; exit 2") |
| 339 | print(" 退出码: 2 → 拒绝执行") |
| 340 | |
| 341 | runner2 = HookRunner(HookConfig( |
| 342 | pre_tool_use=["printf 'dangerous command blocked'; exit 2"], |
| 343 | )) |
| 344 | |
| 345 | pre_result = runner2.run_pre_tool_use("bash", '{"command": "rm -rf /"}') |
| 346 | print(f" PreToolUse 结果: denied={pre_result.denied}, messages={pre_result.messages}") |
| 347 | |
| 348 | # --- 3. 多个 Hook 串联 --- |
| 349 | print("\n--- 场景 3: 多个 Hook 串联(第二个拒绝)---") |
| 350 | print(" Hook 1: printf 'first check ok' → exit 0") |
| 351 | print(" Hook 2: printf 'second check failed' → exit 2") |
| 352 | print(" Hook 3: printf 'never reached' → exit 0") |
| 353 | |
| 354 | runner3 = HookRunner(HookConfig( |
| 355 | pre_tool_use=[ |
| 356 | "printf 'first check ok'", |
| 357 | "printf 'second check failed'; exit 2", |
| 358 | "printf 'never reached'", # 这个不会执行! |
| 359 | ], |
| 360 | )) |
| 361 | |
| 362 | pre_result = runner3.run_pre_tool_use("bash", '{"command": "echo hello"}') |
| 363 | print(f" 结果: denied={pre_result.denied}") |
| 364 | print(f" 消息: {pre_result.messages}") |
| 365 | print(" 注意:第三个 hook 没有执行(因为第二个已经拒绝了)") |
| 366 | |
| 367 | # --- 4. Hook 读取环境变量 --- |
| 368 | print("\n--- 场景 4: Hook 读取环境变量 ---") |
| 369 | runner4 = HookRunner(HookConfig( |
| 370 | pre_tool_use=["printf \"tool=%s input=%s\" \"$HOOK_TOOL_NAME\" \"$HOOK_TOOL_INPUT\""], |
| 371 | )) |
| 372 |
no test coverage detected