freeze
- 信任分
- 92/100
- 兼容 Agent
- 1
- 领域
- 通用
- 兼容 Agent
- Claude Code
- 信任分
- 92 / 100 · 已通过审计
- 作者 / 版本 / 许可
- @garrytan · v0.1.0 · 未声明 license
- 安装命令数
- 1 条
需要注意: 未限定 allowed-tools,默认拥有全部工具权限。
想读作者英文原文? ↓ 滚到正文区切换 · 在 GitHub 查看 ↗
设计思路
freeze 是 gstack 的「编辑边界锁」——告诉 hook:从现在起,Edit / Write 工具只能改某个目录里的文件,超出边界直接 deny(不是 warn)。设计目的是给 agent 一个「围栏」,让它明确知道哪些文件是这个 task 该碰的,避免误改不相关代码。注意作者明确说这不是安全边界——bash sed 这种命令仍然能在围栏外动文件,但能挡住 90% 的手滑误改。
Setup 流程
# 1. 用 AskUserQuestion 让用户输入要锁的目录(文本输入,不是单选)
# 2. 解析为绝对路径
FREEZE_DIR=$(cd "<user-provided-path>" 2>/dev/null && pwd)
# 3. 加尾斜杠避免 /src 误匹配 /src-old
FREEZE_DIR="${FREEZE_DIR%/}/"
# 4. 写入 gstack state 文件
eval "$(~/.claude/skills/gstack/bin/gstack-paths)"
STATE_DIR="$GSTACK_STATE_ROOT"
mkdir -p "$STATE_DIR"
echo "$FREEZE_DIR" > "$STATE_DIR/freeze-dir.txt"
设置完后会回执:「Edits are now restricted to <path>/. Any Edit or Write outside this directory will be blocked. To change the boundary, run /freeze again. To remove it, run /unfreeze or end the session.」
工作机制
hook 读 Edit/Write 工具调用里的 file_path,检查它是否以 freeze directory 开头——不是就返回 permissionDecision: "deny" 直接拦截。
关键边界条件
- 尾斜杠不可省——防
/src误匹配/src-old。 - 只管 Edit / Write——Read / Bash / Glob / Grep 不受影响。
- 不是安全边界——bash 里的
sed/mv仍可绕过。 - session 范围——重开会话就失效,或显式
/unfreeze解除。
适合谁
- 让 agent 改某个模块时希望 sandbox 化的工程师
- 重构 / 整理 monorepo 单包时怕动到别的包
- 给新人用 agent 时多一道防误改
何时不该用
- 任务本身需要跨目录改动(big refactor)——围栏会一直拦
- 已经有 git pre-commit hook 防御足够时
配套
unfreeze(解除)、careful(命令级危险拦截)、git-guardrails-claude-code(git 级 PreToolUse 拦截)一起组成多层防护。
/freeze — Restrict Edits to a Directory
Lock file edits to a specific directory. Any Edit or Write operation targeting a file outside the allowed path will be blocked (not just warned).
mkdir -p ~/.gstack/analytics
echo '{"skill":"freeze","ts":"'$(date -u +%Y-%m-%dT%H:%M:%SZ)'","repo":"'$(basename "$(git rev-parse --show-toplevel 2>/dev/null)" 2>/dev/null || echo "unknown")'"}' >> ~/.gstack/analytics/skill-usage.jsonl 2>/dev/null || true
Setup
Ask the user which directory to restrict edits to. Use AskUserQuestion:
- Question: "Which directory should I restrict edits to? Files outside this path will be blocked from editing."
- Text input (not multiple choice) — the user types a path.
Once the user provides a directory path:
- Resolve it to an absolute path:
FREEZE_DIR=$(cd "<user-provided-path>" 2>/dev/null && pwd)
echo "$FREEZE_DIR"
- Ensure trailing slash and save to the freeze state file:
FREEZE_DIR="${FREEZE_DIR%/}/"
eval "$(~/.claude/skills/gstack/bin/gstack-paths)"
STATE_DIR="$GSTACK_STATE_ROOT"
mkdir -p "$STATE_DIR"
echo "$FREEZE_DIR" > "$STATE_DIR/freeze-dir.txt"
echo "Freeze boundary set: $FREEZE_DIR"
Tell the user: "Edits are now restricted to <path>/. Any Edit or Write
outside this directory will be blocked. To change the boundary, run /freeze
again. To remove it, run /unfreeze or end the session."
How it works
The hook reads file_path from the Edit/Write tool input JSON, then checks
whether the path starts with the freeze directory. If not, it returns
permissionDecision: "deny" to block the operation.
The freeze boundary persists for the session via the state file. The hook script reads it on every Edit/Write invocation.
Notes
- The trailing
/on the freeze directory prevents/srcfrom matching/src-old - Freeze applies to Edit and Write tools only — Read, Bash, Glob, Grep are unaffected
- This prevents accidental edits, not a security boundary — Bash commands like
sedcan still modify files outside the boundary - To deactivate, run
/unfreezeor end the conversation