bookworm-smart-assistant/skills/guardian/SKILL.md

136 lines
4.6 KiB
Markdown
Raw Permalink Normal View History

---
name: guardian
version: 1.0.0
description: |
统一安全守护技能。整合 freeze (目录编辑限制)、careful (破坏性命令警告)、
unfreeze (解除限制) 和 guard (全量安全模式) 四项能力为单一入口。
支持子命令: /guardian freeze [dir], /guardian unfreeze, /guardian careful,
/guardian status。
触发词: "guardian", "安全守护", "guard mode", "freeze", "careful",
"restrict edits", "safety mode", "lock down"。
maturity: stable
allowed-tools:
- Bash
- Read
- AskUserQuestion
hooks:
PreToolUse:
- matcher: "Bash"
hooks:
- type: command
command: "bash ${CLAUDE_SKILL_DIR}/../careful/bin/check-careful.sh"
statusMessage: "Checking for destructive commands..."
- matcher: "Edit"
hooks:
- type: command
command: "bash ${CLAUDE_SKILL_DIR}/../freeze/bin/check-freeze.sh"
statusMessage: "Checking freeze boundary..."
- matcher: "Write"
hooks:
- type: command
command: "bash ${CLAUDE_SKILL_DIR}/../freeze/bin/check-freeze.sh"
statusMessage: "Checking freeze boundary..."
---
# /guardian — 统一安全守护
整合编辑限制、破坏性命令警告、解除限制三大能力为单一入口。
## 子命令解析
根据用户输入的参数或关键词匹配子命令:
| 子命令 | 触发词 | 功能 |
|--------|--------|------|
| `freeze [dir]` | "freeze", "冻结", "限制编辑", "restrict" | 限制编辑到指定目录 |
| `unfreeze` | "unfreeze", "解冻", "解除限制", "unlock" | 解除编辑限制 |
| `careful` | "careful", "小心模式", "safety", "谨慎" | 启用破坏性命令警告 |
| `status` | "status", "状态", 无参数 | 显示当前守护状态 |
**无参数时**: 显示当前状态,然后询问用户要启用哪个模式。
## freeze — 限制编辑范围
询问用户要限制编辑到哪个目录:
- 使用 AskUserQuestion: "哪个目录应该限制编辑?此路径外的文件将被阻止编辑。"
- 文本输入模式 — 用户输入路径
用户提供路径后:
1. 解析为绝对路径:
```bash
FREEZE_DIR=$(cd "<user-provided-path>" 2>/dev/null && pwd)
echo "$FREEZE_DIR"
```
2. 确保尾部斜杠并保存到状态文件:
```bash
FREEZE_DIR="${FREEZE_DIR%/}/"
STATE_DIR="${CLAUDE_PLUGIN_DATA:-$HOME/.gstack}"
mkdir -p "$STATE_DIR"
echo "$FREEZE_DIR" > "$STATE_DIR/freeze-dir.txt"
echo "Freeze boundary set: $FREEZE_DIR"
```
告知用户: "**Guardian freeze 已激活** — 编辑限制为 `<path>/`。使用 `/guardian unfreeze` 解除。"
## unfreeze — 解除编辑限制
```bash
STATE_DIR="${CLAUDE_PLUGIN_DATA:-$HOME/.gstack}"
if [ -f "$STATE_DIR/freeze-dir.txt" ]; then
PREV=$(cat "$STATE_DIR/freeze-dir.txt")
rm -f "$STATE_DIR/freeze-dir.txt"
echo "Freeze boundary cleared (was: $PREV). Edits are now allowed everywhere."
else
echo "No freeze boundary was set."
fi
```
告知用户解除结果。
## careful — 破坏性命令警告
告知用户: "**Guardian careful 已激活** — 以下命令执行前会发出警告:"
| 模式 | 示例 | 风险 |
|------|------|------|
| `rm -rf` | `rm -rf /var/data` | 递归删除 |
| `DROP TABLE/DATABASE` | `DROP TABLE users;` | 数据丢失 |
| `TRUNCATE` | `TRUNCATE orders;` | 数据丢失 |
| `git push --force` | `git push -f origin main` | 历史重写 |
| `git reset --hard` | `git reset --hard HEAD~3` | 未提交工作丢失 |
| `kubectl delete` | `kubectl delete pod` | 生产影响 |
| `docker rm -f` / `docker system prune` | `docker system prune -a` | 容器/镜像丢失 |
安全例外 (不警告): `rm -rf node_modules/.next/dist/__pycache__/.cache/build/.turbo/coverage`
## status — 显示当前状态
```bash
STATE_DIR="${CLAUDE_PLUGIN_DATA:-$HOME/.gstack}"
echo "=== Guardian Status ==="
if [ -f "$STATE_DIR/freeze-dir.txt" ]; then
echo "Freeze: ACTIVE — $(cat "$STATE_DIR/freeze-dir.txt")"
else
echo "Freeze: INACTIVE"
fi
echo "Careful: ACTIVE (session-scoped, always on when /guardian is loaded)"
echo "========================"
```
## 工作原理
- **freeze** 通过状态文件 (`freeze-dir.txt`) 持久化hook 在每次 Edit/Write 时检查
- **careful** 通过 session-scoped hook 在每次 Bash 命令时检查
- 两者独立运作,互不依赖
- hook 脚本复用 `careful/bin/check-careful.sh``freeze/bin/check-freeze.sh`
## 注意事项
- freeze 仅限制 Edit/Write 工具 — Read、Bash、Glob、Grep 不受影响
- careful 防止意外操作,不是安全边界 — 用户可以 override 每个警告
- 会话结束时所有守护自动解除
- 依赖 `careful/``freeze/` 目录下的 hook 脚本