fix: harden destructive command matching

This commit is contained in:
Haoran
2026-08-26 15:07:59 +08:00
parent 44e33d0ec3
commit 1293797585
55 changed files with 3328 additions and 690 deletions

View File

@@ -102,18 +102,7 @@ agent_loop(history)
**PreToolUse / PostToolUse**, hooks before and after tool execution. s03's permission check logic is now wrapped as a PreToolUse hook, plus a logging hook and a large-output reminder:
```python
import re
DESTRUCTIVE_COMMAND_WORD = re.compile(
r"(?i)(?:^|[;&|()\n])\s*(?:rm|del)(?=\s|$|[;&|()])"
)
def contains_destructive_command(command: str) -> bool:
return bool(DESTRUCTIVE_COMMAND_WORD.search(command))
# PreToolUse: permission check (s03 logic, moved from loop to hook)
# PreToolUse: permission check (including the matcher inherited from s03)
def permission_hook(block):
if block.name == "bash":
command = block.input.get("command", "")
@@ -144,8 +133,6 @@ register_hook("PreToolUse", log_hook)
register_hook("PostToolUse", large_output_hook)
```
The inherited shell rule is case-insensitive and matches a complete `rm` or `del` command word only at the start of a command or after a shell separator. It does not match `model`, `delimiter`, or `echo del test.txt`.
**Stop** triggers when the loop is about to exit. The following hook prints a cleanup summary:
```python