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 を使用します。
- 質問:「編集を制限するディレクトリを指定してください。このパス外のファイルは編集できなくなります。」
- テキスト入力(複数選択ではありません) — ユーザーがパスを入力します。
ユーザーがディレクトリパスを指定したら:
共有ステートライターで、ユーザーが選択した境界を設定します。物理的な絶対パスを解決し、調査のクリーンアップと置換処理を直列化します。
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_path を読み取ります(/careful と共有する実際の JSON 抽出処理で、コピーはひとつだけ、両方のフックから読み込まれます)。次に、パスが freeze ディレクトリで始まっているかを確認します。始まっていない場合は、操作をブロックするために permissionDecision: "deny" を含む hookSpecificOutput ペイロードを返します(permissionDecision がトップレベルにあると Claude Code は無視するため、hookSpecificOutput の下にネストされます)。
フェイルクローズの極性を採用しています。フックが解析できないツールペイロードは許可されず、拒否されます。フェイルオープンする境界は境界とはいえません。解析できてもパスフィールドがないペイロード(ファイルを扱わないツール)は許可されます。拒否メッセージには、ツール、パスフィールド、境界、/unfreeze が示されます。シンボリックリンクは最終コンポーネントまで解決されるため、境界内のシンボリックリンクが境界外を指している場合、リンク先に基づいて判定されます。
freeze 境界は、ステートファイルを使って明示的に解除されるまで維持されます。フックスクリプトは Edit/Write/NotebookEdit が呼び出されるたびにステートファイルを読み込みます。スペースを含む境界にも対応しています。
注意事項
- freeze ディレクトリの末尾に
/を付けることで、/srcが/src-oldに一致するのを防ぎます - Freeze が適用されるのは Edit、Write、NotebookEdit のみです。Read、Bash、PowerShell、Glob、Grep には影響しません
- これは誤編集を防ぐものであり、セキュリティ境界ではありません。
sedやSet-Contentのような Bash または PowerShell コマンドを使えば、境界外のファイルも変更できます - 解除するには
/unfreezeを実行してください。会話を終了したり強制終了したりしても、永続化された状態は削除されません