Apache-2.0 · open source · zero telemetry

Define agent permissions once.
Enforce them everywhere.

One .ai/ source of truth compiles into native config for Claude Code, Codex, OpenCode, Cursor, and Kiro. Deny-over-allow, deterministic, and enforced in CI — so every agent plays by the same rules.

~/project — agentctl sync
# define your permissions once, in one place
$ npx @lab42/agentctl init
created .ai/config.yaml .ai/permissions.yaml

# compile to every runtime's native format
$ npx @lab42/agentctl sync
+ .claude/settings.json
+ .codex/config.toml + hooks/permission-policy.py
+ .cursor/rules/agentctl-permissions/
+ .kiro/settings/permissions.yaml
+ .opencode/opencode.json

# fail the build when configs drift
$ agentctl check
claude ✓ in sync cursor ✓ in sync
codex ✗ out of sync kiro ✓ in sync

One policy · five runtimes · no lock-in

Claude Code Codex CLI OpenCode Cursor Kiro
HOW IT WORKS

Write it once. Sync it out.

No per-tool copy-paste, no drift. Your permissions live in a runtime-neutral .ai/ directory and flow one direction into each agent's own format.

STEP 01

Declare

Set shell allow/deny globs and filesystem rules in .ai/permissions.yaml — with deny_over_allow precedence baked in.

STEP 02

Sync

Run agentctl sync. Pure-function adapters render settings.json, config.toml, hooks, and rules for each enabled runtime.

STEP 03

Enforce

Wire agentctl check into CI. It exits non-zero the moment a generated config drifts from your source of truth.

Source of truth · .ai/
config.yaml — runtimes, project
permissions.yaml — shell + fs rules
mcp.yaml — MCP servers (optional)
agentctl sync
Generated · native formats
.claude/settings.json
.codex/config.toml + hooks/
.cursor/rules/ · .kiro/ · .opencode/
WHY AGENTCTL

Guardrails, not guesswork.

Most tools sync instructions. agentctl governs what your agents are actually allowed to do — portably.

🛡️

Deny-over-allow by default

A single, predictable precedence model. Destructive shell, git, and API calls stay blocked across every runtime — no per-tool reasoning required.

🎯

Deterministic, one-way

Config flows only from .ai/ outward. Generated files are never read back, so output is reproducible and reviewable.

🔁

Drift detection for CI

agentctl check exits 1 the instant a runtime config falls out of sync — catch it in review, not in production.

📥

Reverse-import existing setups

agentctl scan detects your current .claude/, .cursor/, and more, and pulls them into one source.

🔌

MCP servers, declared once

Define Model Context Protocol servers in .ai/mcp.yaml; agentctl renders the right shape for every runtime that supports them.

🧩

Adapter architecture

Each runtime is a pure render function. Adding a new agent is one file — no rewrites, no coupling to the core.

HOW IT DIFFERS

Config sync tools stop at instructions.

agentctl treats permissions as the first-class artifact — the part that actually keeps agents safe.

agentctl Instruction-sync tools Runtime proxies
Governs what agents may do ● yes ○ instructions only ● yes
Deny-over-allow precedence ● built in ○ n/a ● varies
Runs at build time (no live proxy) ● yes ● yes ○ requires gateway
Multi-runtime native output ● 5 runtimes ● varies ○ single path
Drift check for CI ● exit 1 ○ rare ○ n/a
Fully local, no telemetry ● yes ● usually ○ often hosted
License Apache-2.0 mixed mixed / commercial

One source of truth. Every agent.

Set up your first synced permission set in under two minutes — no install, entirely on your machine.