v1.3.0
One hook per agent 🚧
A Claude Code plugin can register a Fence hook of its own — the Hoop plugin ships one. On a machine with both the plugin and a fence init install, Fence evaluated every tool call twice: same verdict, doubled latency, every "🚧 Fence allowed this" notice printed twice.
fence init now detects an enabled plugin that already runs the Fence hook and installs only the status line — the piece no plugin can provide — and removes a duplicate hook an earlier init left behind. Detection deliberately fails toward installing: a false negative merely duplicates work, but a false positive would leave you unguarded, so every uncertainty resolves to "install it". A --global install always writes the hooks, since any single project can disable a plugin out from under it.
New flags
fence init --statusline-only— write just the status line, never the hooksfence init --force-hooks— install Fence's own hook even beside a plugin'sfence uninstall --hooks-only— remove the hooks, keep the status line (plainuninstallstill removes both)
Upgrading
If you run both the Hoop plugin and a fence init install, upgrade and re-run fence init once — it removes the duplicate and keeps your status line. /hoop:doctor (plugin ≥ 0.7.2) now detects real duplicates only and recommends the version-appropriate fix.
Changelog
- ad839ea init: stand down when a Claude Code plugin already runs the Fence hook
- efad8c2 fix:
--globalinit never stands down (a project could disable the plugin and be left unguarded) - f2811e1 fix: reject
--statusline-only/--force-hooksfor agents without a status line - ba403f0 fix: wrapper-script detection requires an actual invocation line, not a mention
- 0e6278a, 607abb9 ci: GitHub→Linear issue sync
Full diff: v1.2.0...v1.3.0