mcpField
F
freeze

freeze

github.com/garrytanAgent 工作流138.3k357 次安装今天更新
代码仓库

关于 freeze

gstack 技能可将文件编辑限制在用户选择的目录内。钩子会阻止边界外的 Edit、Write 和 NotebookEdit 操作,限制持续生效,直到移除。

主要功能

  1. 01按目录设置编辑边界
  2. 02阻止边界外的编辑
  3. 03解析路径及符号链接
  4. 04跨会话保留边界
  5. 05移除或更改边界

适用场景

  1. 01将编辑限制在项目子目录
  2. 02避免误改相邻文件
  3. 03确保笔记本编辑位于指定目录

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/garrytan/gstack --skill freeze

安装后在 Claude Code 中输入/freeze确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

SKILL.md.tmpl
bin/
check-freeze.sh
freeze-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;结束或终止对话不会移除已持久化的状态

评论

支持 Markdown