Fence 1.0.0 — the compatibility promise
⚠️ Renamed: Leash is now Fence 🚧
Clean break, no compatibility shims. If you had leash installed:
leash uninstall --global # remove the old hooks (with the old binary)
brew uninstall leash # or: npm rm -g @hoophq/leash
brew install hoophq/tap/fence # or: npm install -g @hoophq/fence
fence init --globalState lives in ~/.fence now; project rule files are ./.fence.yaml. Installed packs: re-run fence add <pack>.
What 1.0 promises
1.0 is a compatibility promise, not a feature bar. The three public contracts — the rulepack schema, the registry index format, and the hook envelope — are frozen and versioned for all of 1.x (what that means). Rulepacks declare schema: 1; a pack needing newer vocabulary is refused whole on older binaries (skipped with an "upgrade fence" warning), never half-read.
New since 0.2.0
- Codex support — the same rulepacks now guard OpenAI Codex CLI with zero engine changes:
fence init codex, then trust the hook once via/hooksinside Codex. Shell commands andapply_patchedits are screened per file touched. fence uninstall [agent]— the exit door: removes exactly the hooks init added, preserves everything else.- A written threat model — what Fence defends against, what it deliberately doesn't, and the known evasion paths, honestly.
- Community scaffolding — CONTRIBUTING, SECURITY (private vulnerability reporting), and issue templates; the false-positive template is the one that matters most.
- Windows: honestly unsupported natively —
fence initsays so instead of half-working; WSL works today. #26 tracks native support.
Install: brew install hoophq/tap/fence · npm install -g @hoophq/fence · binaries below