关于 freeze
gstack 技能可将文件编辑限制在用户选择的目录内。钩子会阻止边界外的 Edit、Write 和 NotebookEdit 操作,限制持续生效,直到移除。
主要功能
- 01按目录设置编辑边界
- 02阻止边界外的编辑
- 03解析路径及符号链接
- 04跨会话保留边界
- 05移除或更改边界
适用场景
- 01将编辑限制在项目子目录
- 02避免误改相邻文件
- 03确保笔记本编辑位于指定目录
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ garrytan/ gstack --skill freeze安装后在 Claude Code 中输入/freeze确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
SKILL.md.tmplbin/check-freeze.shfreeze-state.sh详细介绍
/freeze — 将编辑限制在某个目录
将文件编辑限制在指定目录。任何针对允许路径之外文件的 Edit、Write 或 NotebookEdit 操作都会被阻止(而不只是警告)。
GSTACK_STATE_ROOT=$(~/.claude/skills/gstack/bin/gstack-paths --get GSTACK_STATE_ROOT); : "${GSTACK_STATE_ROOT:?gstack-paths failed; reinstall with ./setup or /gstack-upgrade}"
mkdir -p "$GSTACK_STATE_ROOT"/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_STATE_ROOT"/analytics/skill-usage.jsonl 2>/dev/null || true
设置
询问用户要将编辑限制在哪个目录。使用 AskUserQuestion:
- 问题:"Which directory should I restrict edits to? Files outside this path will be blocked from editing."
- 文本输入(非多选)——用户输入路径。
用户提供目录路径后:
使用共享状态写入器设置用户选择的边界。它会解析物理绝对路径,并在串行化替换操作时清理调查状态:
bash "$HOME/.claude/skills/gstack/freeze/bin/freeze-state.sh" set "<user-provided-path>"
只有在辅助程序执行成功后才能报告成功。遇到 FREEZE_BUSY 或意外状态时,请保留该状态,并让用户在任何活动写入器完成后检查恢复情况;切勿直接写入或删除状态文件。
告诉用户:"编辑现已限制在 <path>/ 内。此目录之外的任何 Edit、Write 或
NotebookEdit 操作都会被阻止。要更改边界,请再次运行 /freeze。要移除边界,请运行 /unfreeze。"
工作原理
钩子从 Edit/Write 工具输入 JSON 中读取 file_path,或从 NotebookEdit(Jupyter notebook)调用中读取
notebook_path(与 /careful 共用的真实 JSON 提取器——只有一份,由两个钩子共同引用),然后
检查路径是否以 freeze 目录开头。如果不是,则返回带有
permissionDecision: "deny" 的 hookSpecificOutput 载荷,以阻止
该操作(嵌套在 hookSpecificOutput 中——Claude Code 会忽略顶层的 permissionDecision)。
该机制采用失败时默认拒绝策略:钩子无法解析的工具载荷会被拒绝,而非允许——失效时默认放行的边界就不是真正的边界。能够解析但没有路径字段的载荷(非文件工具)会被允许。拒绝信息会注明
工具、路径字段、边界和 /unfreeze。符号链接会解析其最终路径组成部分,因此,指向边界之外的边界内符号链接会按其目标路径进行检查。
freeze 边界会一直保留,直到通过状态文件明确移除。钩子脚本会在每次 Edit/Write/NotebookEdit 调用时读取该文件。支持包含空格的边界路径。
说明
- freeze 目录末尾的
/可避免/src匹配到/src-old - Freeze 仅适用于 Edit、Write 和 NotebookEdit;Read、Bash、PowerShell、Glob、Grep 不受影响
- 这可以防止意外编辑,但不是安全边界——仍可通过
sed或Set-Content等 Bash 或 PowerShell 命令修改边界之外的文件 - 要停用,请运行
/unfreeze;结束或终止对话不会移除已持久化的状态