136 lines
4.6 KiB
Markdown
136 lines
4.6 KiB
Markdown
---
|
||
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 脚本
|