Quickstart#

I Choose one installation route#

Universal CLI#

Install persistently from the public Git repository:

uv tool install git+https://gitlab.com/doering-ai/apps/gate.git
gate register
gate doctor

pipx users can install the same source:

pipx install git+https://gitlab.com/doering-ai/apps/gate.git
gate register
gate doctor

The default registration targets Claude Code user settings. Register the separate Codex pre-flight hook for the native spawn_agent fan-out boundary:

gate register --harness codex
gate doctor --harness codex
gate status --harness codex

Restart Codex after changing hooks configuration. Codex receives the pre-flight deny on spawn_agent; Claude alone has the start/stop notification layers.

Claude Code plugin#

Run these commands inside Claude Code:

/plugin marketplace add https://gitlab.com/doering-ai/apps/gate.git
/plugin install my-gate@my-gate
/reload-plugins
/plugin

Use the plugin manager’s Installed and Errors tabs to inspect plugin state. Do not also run register: duplicate hooks double notifications and can consume a one-off grant without allowing the launch.

II Verify the CLI route#

gate doctor
gate status

doctor checks Python, configuration syntax, the hook script, a desktop notifier, Claude Code settings JSON, and the grants store. A healthy persistent CLI install ends with 0 failure(s).. status reports settings-file registrations; Claude marketplace plugins remain visible in Claude Code’s plugin manager instead.

III See the decision path work#

selftest feeds synthetic hook payloads through the real gate logic. It launches no agents and suppresses desktop notifications.

$ gate selftest
[ok] unpinned workflow under heavy session denied
[ok] fully light-pinned workflow allowed
[ok] explicit heavy pin denied even under light session
[ok] unpinned workflow under light session allowed
[ok] explicit heavy Agent override denied
[ok] inherited Codex sol spawn denied
[ok] garbage payload ignored
[ok] grant honored (heavy Agent allowed)
[ok] grant exhausted (heavy Agent denied)
[ok] expired grant ignored (heavy Agent denied)
[ok] unwritable store fails closed (denied)

0 failure(s).

The examples in package docstrings also run as part of the test suite, so behavior changes cannot silently leave them stale.

IV What happens at launch time#

Situation

Outcome

Explicit opus, fable, or sol nested-agent pin

Denied before launch

Inherited Codex spawn_agent under gpt-5.6-sol

Denied before launch

Unpinned Claude workflow under a resolvable superheavy session

Denied before fan-out

Explicit sonnet, haiku, terra, or luna pin

Allowed

Allowlisted or one-off-granted launch

Allowed and normally notified

Launch visible only after it starts

Start notification, then stop-time ground truth

To remove settings-file registrations:

gate unregister

Plugin users uninstall from Claude Code:

/plugin uninstall my-gate@my-gate