Skip to main content
skill Claude Code CX Codex Cursor GitHub Copilot

freeze · garrytan — Claude Code skill: what it does, how to install

The skill blocks Edit, Write and NotebookEdit outside one directory. The hook returns a deny, not a warning.

Install into Claude Code · Skills CLI (Vercel) All methods and platforms ↓
npx skills add garrytan/gstack --skill freeze -a claude-code
Open on GitHub

What freeze does

The skill asks which folder is the boundary, then stores that path through freeze-state.sh. From then on every edit call passes through check-freeze.sh, which pulls file_path from the tool input (or notebook_path for a Jupyter notebook) and compares it against the boundary. No match, no edit: the hook answers with permissionDecision: deny.

It fails closed. A payload the hook cannot parse is denied, since a boundary that lets odd input through is not a boundary. Symlinks resolve through their final component, so a link sitting inside the folder but pointing elsewhere gets checked against its target. A trailing slash keeps /src from matching /src-old, and paths with spaces work. State lives in a file and outlives the conversation — ending or killing the session does not clear it.

Only the file-editing tools are hooked. Read, Bash, Glob and Grep behave as before, and that cuts both ways: sed or Set-Content from Bash will happily write outside the boundary. Read this as protection against accidental edits rather than a security wall. Run /unfreeze to drop the limit, /freeze again to move it.

What it helps with

  • keep an agent out of files beyond src/
  • hold an edit boundary across a long session
  • catch a stray write into a neighbouring package
  • verify that a symlink does not carry an edit out of the folder
  • lift the limit once work in the folder is done

Example prompts for the agent

  • `/freeze` and restrict edits to `packages/api/`
  • Lock editing to `src/` until the session ends
  • `/unfreeze` — we are done with the boundary

How to install freeze

1Skills CLI (Vercel)

npx skills add garrytan/gstack --skill freeze -a claude-code

2Manually: put the files in place

~/.claude/skills/freeze/SKILL.md

Copy the whole skill folder; for one project use .claude/skills/freeze/

From the same set12

The whole set →
gstack garrytan A router skill for the gstack suite. It picks the right gstack skill for your request and hands off to it. Claude Code CX Codex Cursor +1 24,100installs plan-design-review garrytan Senior product designer review for plans before implementation begins. It spots missing UX decisions and updates the plan document directly. Claude Code CX Codex Cursor +1 474installs qa garrytan Automate bug hunting in browser, API, CLI, jobs, workers, and webhooks. Searches code, runs commands, checks logs, and asks clarifying questions. Claude Code CX Codex Cursor +1 457installs cso garrytan Audits code and infrastructure for security findings, with reproduction and repair candidates in comprehensive mode. Use it when reviewing a project. Claude Code CX Codex Cursor +1 405installs qa-only garrytan Reports bugs across browser apps, APIs, CLI tools, and background workers without touching your codebase. Useful for verification runs before a release. Claude Code CX Codex Cursor +1 395installs careful garrytan Intercepts Bash and PowerShell commands before execution to catch destructive actions like forced git pushes or database drops. Useful when giving agents terminal access. Claude Code CX Codex Cursor +1 375installs plan-devex-review garrytan An interactive read of a plan from the developer's side: it flags where someone opening the project for the first time will stumble, and asks before editing. Claude Code CX Codex Cursor +1 347installs setup-browser-cookies garrytan This skill transfers cookies from your local Chromium browser into a headless browsing session. Use it to test authenticated sites without re-entering credentials each run. Claude Code CX Codex Cursor +1 342installs

Other versions of freeze

Similar

agent-memory-systems sickn33 Skill for designing agent memory with per-user and per-tenant isolation. Build RAG, conversation history, and vector stores so that one client's data stays separate from another. Claude Code CX Codex Cursor +1 2,000installs vision-analysis MiniMax-AI Describes images, extracts text, and reviews UI mockups using the MiniMax vision MCP tool. Handy when an agent needs to understand a screenshot or design file. Claude Code CX Codex Cursor +1 2,700installs sigma sanyuan0704 Personal tutor with level diagnosis, Socratic dialogue, and mastery gating. No direct answers — guides through questions until 80% threshold. Claude Code CX Codex Cursor +1 4,800installs hypothesis-generation K-Dense-AI Turns raw observations into testable hypotheses, rival explanations, and preregistration analysis plans without mistaking tentative claims for proven facts. Claude Code CX Codex Cursor +1 2,100installs simplify-code Hermes Agent (inspired by Claude Code /simplify) Reviews recent code changes through four parallel subagents and applies justified cleanup fixes. Use it after edits to simplify code that already works. Claude Code CX Codex Cursor +1 345installs draft-nda phuryn This skill drafts a detailed non-disclosure agreement between two parties, covering information types, jurisdiction, and marking sections that require legal review. Claude Code CX Codex Cursor +1 2,600installs setup-matt-pocock-skills Matt Pocock This skill configures a repository for Matt Pocock's engineering skills by setting its issue tracker, triage labels, and domain docs layout. Run it before using the other skills. Claude Code 1,052,851installs to-tickets Matt Pocock Turns a plan, spec, or conversation into small end-to-end tickets with explicit blockers. Use it to agree on the work breakdown before tickets go to a tracker. Claude Code 711,230installs

Questions about freeze

How do I install freeze in Claude Code?

With one command: npx skills add garrytan/gstack --skill freeze -a claude-code. It leaves the skill at ~/.claude/skills/freeze/SKILL.md.

What does freeze do?

It locks edits to a single directory: Edit, Write and NotebookEdit outside that path get denied by the hook. The boundary stays until /unfreeze.

Does it block edits made through Bash?

No. The hook covers the file-editing tools only, so sed or Set-Content run through Bash still change files past the boundary. It guards against accidental edits, not against a determined agent.

Source text

SKILL.md · MIT
---
name: freeze
version: 0.1.0
description: Restrict file edits to a specific directory for the session. (gstack)
triggers:
  - freeze edits to directory
  - lock editing scope
  - restrict file changes
allowed-tools:
  - Bash
  - Read
  - AskUserQuestion
hooks:
  PreToolUse:
    - matcher: "Edit"
      hooks:
        - type: command
          command: 'bash -c "exec bash \"$HOME/.claude/skills/gstack/freeze/bin/check-freeze.sh\""'
          statusMessage: "Checking freeze boundary..."
    - matcher: "Write"
      hooks:
        - type: command
          command: 'bash -c "exec bash \"$HOME/.claude/skills/gstack/freeze/bin/check-freeze.sh\""'
          statusMessage: "Checking freeze boundary..."
    - matcher: "NotebookEdit"
      hooks:
        - type: command
          command: 'bash -c "exec bash \"$HOME/.claude/skills/gstack/freeze/bin/check-freeze.sh\""'
          statusMessage: "Checking freeze boundary..."
---
<!-- AUTO-GENERATED from SKILL.md.tmpl — do not edit directly -->
<!-- Regenerate: bun run gen:skill-docs -->

# /freeze — Restrict Edits to a Directory

Lock file edits to a specific directory. Any Edit, Write or NotebookEdit
operation targeting a file outside the allowed path will be **blocked** (not
just warned).

```bash
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
```

## 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:

Set the user-selected boundary with the shared state writer. It resolves the physical absolute path and serializes replacement with investigation cleanup:
```bash
bash "$HOME/.claude/skills/gstack/freeze/bin/freeze-state.sh" set "<user-provided-path>"
```

Only report success if the helper succeeds. On `FREEZE_BUSY` or unexpected state, preserve it and ask the user to inspect recovery after any active writer finishes; never write or delete the state file directly.

Tell the user: "Edits are now restricted to `<path>/`. Any Edit, Write or
NotebookEdit outside this directory will be blocked. To change the boundary, run `/freeze`
again. To remove it, run `/unfreeze`."

## How it works

The hook reads `file_path` from the Edit/Write tool input JSON, or
`notebook_path` from a NotebookEdit (Jupyter notebook) call (shared
real-JSON extractor with /careful — one copy, sourced by both hooks), then
checks whether the path starts with the freeze directory. If not, it returns a
`hookSpecificOutput` payload with `permissionDecision: "deny"` to block the
operation (nested under `hookSpecificOutput` — Claude Code ignores a top-level
`permissionDecision`).

Polarity is fail-closed: a tool payload the hook cannot parse is DENIED, not
allowed — a boundary that fails open is not a boundary. A payload that parses
but has neither path field (a non-file tool) is allowed. A deny names the
tool, the path field, the boundary and `/unfreeze`. Symlinks are resolved
through their FINAL component, so an in-boundary symlink pointing outside the
boundary is checked against its target.

The freeze boundary persists until explicitly removed via the state file. The hook
script reads it on every Edit/Write/NotebookEdit invocation. Boundaries containing spaces
are supported.

## Notes

- The trailing `/` on the freeze directory prevents `/src` from matching `/src-old`
- Freeze applies to Edit, Write and NotebookEdit only — Read, Bash, PowerShell, Glob, Grep are unaffected
- This prevents accidental edits, not a security boundary — Bash or PowerShell commands like `sed` or `Set-Content` can still modify files outside the boundary
- To deactivate, run `/unfreeze`; ending or killing a conversation does not remove persisted state

© garrytan · MIT · garrytan/gstack

See also

Project sponsors

Companies that keep this analytics open
Gold sponsor

Impressions, clicks and code copies — open statistics. We keep the numbers public for the same reason NeBlask itself is public. Become a sponsor