mcpField
F
freeze

freeze

github.com/garrytanエージェントワークフロー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 を使用します。

  • 質問:「編集を制限するディレクトリを指定してください。このパス外のファイルは編集できなくなります。」
  • テキスト入力(複数選択ではありません) — ユーザーがパスを入力します。

ユーザーがディレクトリパスを指定したら:

共有ステートライターで、ユーザーが選択した境界を設定します。物理的な絶対パスを解決し、調査のクリーンアップと置換処理を直列化します。

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 を実行してください。会話を終了したり強制終了したりしても、永続化された状態は削除されません

コメント