ork-assess
Assess a code change, design, architecture, workflow, or competing options against explicit…
Confines file edits to one directory until lifted: an Edit, Write, MultiEdit and NotebookEdit hook refuses any path whose real location, symlinks followed, falls outside the frozen dir. Argument: the dir, or off. Use when a change must stay inside one package, module or worktree.
$ npx -y skills add yonatangross/orchestkit --skill freeze --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/freezeContext preview
The summary Claude sees to decide when to auto-load this skill.
Confines file edits to one directory until lifted: an Edit, Write, MultiEdit and NotebookEdit hook refuses any path whose real location, symlinks followed, falls outside the frozen dir. Argument: the dir, or off. Use when a change must stay inside one package, module or worktree.
name: freeze
license: MIT
compatibility: "Claude Code 2.1.277+."
description: "Confines file edits to one directory until lifted: an Edit, Write, MultiEdit and NotebookEdit hook refuses any path whose real location, symlinks followed, falls outside the frozen dir. Argument: the dir, or off. Use when a change must stay inside one package, module or worktree."
argument-hint: "<dir> | off"
context: inherit
user-invocable: true
disable-model-invocation: true
allowed-tools: "Bash(node *freeze-guard.mjs arm *) Read"
hooks:
PreToolUse:
- matcher: "Edit|Write|MultiEdit|NotebookEdit"
hooks:
- type: command
command: 'node "${CLAUDE_PLUGIN_ROOT}/skills/freeze/scripts/freeze-guard.mjs"'
metadata:
category: workflow-automation
version: "1.0.0"
author: "OrchestKit"
complexity: "low"
tags: "freeze, guard, scope, edit-fence, hooks, skill-scoped-hooks, symlink"State for this session:
!`node "${CLAUDE_SKILL_DIR}/scripts/freeze-guard.mjs" arm "${CLAUDE_PROJECT_DIR}" "${CLAUDE_SESSION_ID}" "$ARGUMENTS"`
The line above ran when the skill was invoked: it resolved the argument against the project dir, followed symlinks, and recorded the real path for this session in `.claude/state/freeze/<session-id>.json`. The argument is double-quoted, so a name with spaces or an apostrophe arrives as typed; a `$`, backtick or double quote in a dir name would be interpreted by the shell and is not supported. Report that line to the operator as it reads. If it says NOT changed, the freeze did not move; say so and stop.
Invoking this skill also registers a PreToolUse hook on `Edit|Write|MultiEdit|NotebookEdit` (the `hooks:` block above). Claude Code keeps a skill's hooks registered for the rest of the session, so the fence holds on every later turn. For each edit the hook resolves where the write would actually land and denies it (exit 2) when that is outside the frozen dir:
| Target | Verdict | |--------|---------| | `<frozen>/a.ts`, or a new file in a new subdir of `<frozen>` | allowed | | `<frozen>/../other/b.ts` | denied | | `<frozen>-evil/x.ts` (a prefix sibling) | denied | | `<frozen>/link/b.ts` where `link` points outside | denied, symlinks are followed | | `<frozen>/dangling.ts`, a link to a missing file outside | denied, the link is chased | | an edit call with no path | denied |
/ork:freeze src/hooks # fence edits to src/hooks /ork:freeze # show the current fence /ork:freeze off # lift it
Invoking again with another dir moves the fence; a dir that does not exist is refused and the previous fence stays.
The deny reason names the target and the frozen dir. Stop and ask the operator to widen or lift the freeze. Do not route the change through Bash (`sed -i`, `cat >`, `cp`) instead: the fence covers the edit tools only, and using Bash to get around it defeats the reason it was turned on.
with careful for destructive shell commands, or with a worktree for real isolation.
The fence is `scripts/freeze-guard.mjs` (Node, no dependencies); its cases live in `tests/unit/test-freeze-guard.mjs`.
The Complete AI Development Toolkit for Claude Code. 106 skills, 36 agents, 171 hooks. Install `ork` for stable (v9.x), or `ork-alpha` for the v10 line, which ships daily.
Repo: yonatangross/orchestkit
Assess a code change, design, architecture, workflow, or competing options against explicit…
Compare plausible implementation, architecture, product, or operational approaches before…
Map an unfamiliar codebase, feature, architecture, data flow, or operational path with…
Render an answer inline as compact ASCII or box-drawing art with semantic status icons. Use…
Make an approved, scoped change and prove the affected behavior. Use when a request asks to…
Review a pull request or branch for correctness, regressions, security, operational risk, and…