CLI Reference Open-Core
The Intutic CLI provides workspace management, harness detection, config sync, and trace querying.
Installation
# Install workspace CLI globally
npm install -g @intutic/cli
# Install or run native Rust proxy gateway
npm install -g @intutic/proxy
npx @intutic/proxyGlobal options
All commands support:
| Option | Description |
|---|---|
--version | Show CLI version |
--help | Show help for command |
intutic init
Initialize workspace — detect harnesses, configure sync.
intutic init [options]Options:
| Option | Description |
|---|---|
--dev | Use local control plane (http://localhost:3001) |
What it does:
- Scans the workspace for all harness config files
- Creates a workspace on the control plane
- Generates a virtual API key (
vk_*) - Writes governance config into each detected harness file
intutic setup
Guided setup wizard — detect harnesses, configure a provider credential, verify it, and optionally choose a judge model, in one interactive flow. Unlike intutic init, this command prompts; it is the interactive counterpart, not a replacement — init stays flag-driven and safe for CI. See the cohort wizard guide for a full narrative walkthrough of every step.
intutic setup [options]Options:
| Option | Description |
|---|---|
--dev | Use local control plane (http://localhost:3001) |
What it does:
- Detects harnesses in the current workspace (same detection
intutic inituses) - Asks whether to configure a provider against a connected workspace or locally (no control plane — writes a
.intutic.envfile instead) - Picks a provider from the registry (
intutic credentials listshows the same set) and prompts for its credential fields - Verifies the credential against the provider's own API before saving — a 401/403 asks for confirmation before proceeding anyway; a rate-limited or unreachable response is reported but does not block
- Saves the credential (
PUT /api/v1/workspace/provider-credentials/:provider, same routeintutic credentials sethits) or writes the local env file - Optionally picks a judge model from Intutic's model catalog (or a custom name), saves it (same route the dashboard's Settings → LLM Judge panel uses), and — in connected mode — runs the same test round-trip the panel's own Test button does, reporting which stage (shape/provider/completion) it reached
Examples:
# Connected to Intutic (requires `intutic login` first)
intutic setup
# Against a local control plane
intutic setup --devintutic judge configure
Generate the local artifacts an on-prem LLM-as-judge needs: a litellm_config.yaml, an env block, and a Helm values snippet. Writes files only — it never calls a remote API, since local_judge is deliberately not remotely configurable (see the self-hosted gateway's local judge). See On-Prem Judge Setup for the full walkthrough.
intutic judge configure [options]Options:
| Option | Description |
|---|---|
--out <path> | Where to write litellm_config.yaml (default: ./litellm_config.yaml) |
What it does:
- Prompts for a judge model — from the model catalog (any provider, not filtered to ones Intutic's managed gateway can route to, since a local LiteLLM instance can serve anything) or a custom model reference
- Writes a
litellm_config.yamlmodel_listentry in the same shapeinfra/compose/litellm_config.yaml's hand-written example uses - Prints the env block (
INTUTIC_GATEWAY_LOCAL_JUDGE,LITELLM_LOCAL_URL,LITELLM_LOCAL_API_KEY,LITELLM_LOCAL_JUDGE_MODEL) for Docker/bare-metal deployments - Prints the Helm values snippet (
proxy.localJudge,litellm.enabled,litellm.judgeModel) fortools/helm/intutic-gateway
Example:
intutic judge configure --out ./infra/compose/litellm_config.yamlintutic login
Authenticate with the Intutic control plane.
intutic login [options]Options:
| Option | Description |
|---|---|
--api-key <key> | Authenticate with an API key (vk_*) |
--dev | Use local control plane (http://localhost:3001) |
Examples:
# Browser-based login
intutic login
# API key login
intutic login --api-key vk_abc123def456
# Local dev
intutic login --devintutic logout
Clear stored credentials.
intutic logoutNo options. Removes locally stored authentication tokens.
intutic status
Show workspace status — auth, harnesses, sync state.
intutic statusNo options. Displays:
- Current authentication state
- Detected harnesses and their config paths
- Sync state (last sync timestamp, any errors)
intutic whoami
Show current authenticated identity.
intutic whoami [options]Options:
| Option | Description |
|---|---|
--dev | Use local control plane (http://localhost:3001) |
intutic connect
Start sync daemon — bidirectional config sync with control plane.
intutic connect [options]Options:
| Option | Description | Default |
|---|---|---|
--dev | Use local control plane (http://localhost:3001) | — |
--interval <ms> | Poll interval in milliseconds | 30000 |
Examples:
# Default (30s poll)
intutic connect
# 10 second poll interval
intutic connect --interval 10000
# Local dev with fast polling
intutic connect --dev --interval 5000The daemon runs in the foreground. Use Ctrl+C to stop.
Bidirectional Config Capture: When running, the sync daemon polls the workspace settings. If FF_CONFIG_CAPTURE=true is enabled, it periodically reads and hashes all detected harness configuration files (e.g. .cursorrules, CLAUDE.md, .clinerules) every N iterations (set by CONFIG_CAPTURE_INTERVAL, defaulting to 5, which corresponds to ~2.5 minutes on a 30s interval). It uploads these rule snapshots to the control plane, enabling visual audit trails, config diff histories, and rollback triggers in the dashboard.
intutic traces list
List execution traces for the workspace.
intutic traces list [options]Options:
| Option | Description | Default |
|---|---|---|
--limit <n> | Number of traces to show (1–100) | 20 |
--since <duration> | Time window: 30m, 24h, 7d | 24h |
--action <type> | Filter by enforcement action | (all) |
--model <name> | Filter by model name | (all) |
--json | Output as JSON instead of table | false |
--dev | Use local control plane (http://localhost:3001) | — |
Enforcement action filter values: BYPASS, ENHANCE, HIJACK, KILL
Examples:
# Last 20 traces from past 24 hours
intutic traces list
# All KILL actions from the past week
intutic traces list --action KILL --since 7d
# JSON output for scripting
intutic traces list --json --limit 100
# Filter by model
intutic traces list --model claude-4-sonnetintutic traces inspect <trace_id>
Show full detail of a single trace.
intutic traces inspect <trace_id> [options]Arguments:
| Argument | Description |
|---|---|
trace_id | The trace ID to inspect (e.g., tr_abc123) |
Options:
| Option | Description |
|---|---|
--dev | Use local control plane (http://localhost:3001) |
Example:
intutic traces inspect tr_abc123Returns full trace detail including token counts, costs, compliance scores, anomaly data, and corrective prompt card.
intutic skill list
Discover and list local workspace rule/skill files.
intutic skill listWhat it does: Scans the current workspace root for active harness rules configurations, including .cursorrules, CLAUDE.md, .windsurfrules, .clauderules, and rules.md.
intutic skill audit
Audit local rules/skills for security leakage or unsafe command patterns.
intutic skill auditWhat it does: Performs static analysis on active rules and instructions to find potential vulnerabilities, such as hardcoded API credentials or wildcard file operations (e.g. rm -rf *).
intutic loop start
Register and start an active loop execution session.
intutic loop start [options]Options:
| Option | Description | Default |
|---|---|---|
--name <name> | Unique name identifier for the loop run | (required) |
--budget <limit> | Maximum token spend budget in USD (e.g. 5.00) | (none) |
--sops <sops> | Comma-separated local SOP folder names or option indices | — |
--auto-judge | Enable automatic E2E judging for the loop | — |
--dev | Use local control plane | — |
intutic loop exec
Execute an agent command wrapped with loop budget boundaries.
intutic loop exec [options] -- <command> [args...]Options:
| Option | Description | Default |
|---|---|---|
--name <name> | Unique name identifier for the loop run | (generated) |
--budget <limit> | Maximum token spend budget in USD (e.g. 5.00) | (none) |
--sops <sops> | Comma-separated local SOP folder names or option indices | — |
--auto-judge | Enable automatic E2E judging for the loop | — |
--dev | Use local control plane | — |
Example:
intutic loop exec --name "npm-build" --budget 1.50 -- npm run buildintutic loop list
List loop runs and cost accounting details for the workspace.
intutic loop list [options]intutic loop complete <loop_run_id>
Mark a running loop as successfully completed.
intutic loop complete <loop_run_id> [options]intutic loop kill <loop_run_id>
Kill an active loop and prevent subsequent API requests.
intutic loop kill <loop_run_id> [options]intutic policy enable <policy_id>
Enable a compliance policy.
intutic policy enable <policy_id> [options]Options:
| Option | Description |
|---|---|
--dev | Use local control plane (http://localhost:3001) |
intutic policy disable <policy_id>
Disable a compliance policy.
intutic policy disable <policy_id> [options]Options:
| Option | Description |
|---|---|
--dev | Use local control plane (http://localhost:3001) |
intutic policy rollback <policy_id>
Rollback a compliance policy to a specific version.
intutic policy rollback <policy_id> --version <v> [options]Options:
| Option | Description |
|---|---|
--version <v> | Target version number (required) |
--dev | Use local control plane (http://localhost:3001) |
intutic policy export
Export workspace compliance policies to stdout as a JSON array.
intutic policy export --all [options]Options:
| Option | Description |
|---|---|
--all | Export all policies |
--dev | Use local control plane (http://localhost:3001) |
intutic policy test
Run dry-run WASM policy evaluation locally.
intutic policy test --wasm <path> --mock <path>Options:
| Option | Description |
|---|---|
--wasm <path> | Path to compiled WebAssembly rule binary (required) |
--mock <path> | Path to mock JSON request context file (required) |
intutic policy compile
Compile an AssemblyScript rule to WASM (wraps asc).
intutic policy compile [options]Options:
| Option | Description | Default |
|---|---|---|
--src <path> | Rule source entry file | assembly/index.ts |
--out <path> | Output .wasm path | build/rule.wasm |
--debug | Include debug info and source maps | false |
What it does: Shells out to npx --no-install asc <src> -o <out> --optimize --exportRuntime, creating the output directory if needed. With --debug it also passes --debug --sourceMap. If asc is not available, install it with pnpm add -D assemblyscript assemblyscript-json.
intutic policy install
Validate and install a compiled WASM rule into the local proxy rules dir.
intutic policy install --wasm <path> [options]Options:
| Option | Description | Default |
|---|---|---|
--wasm <path> | Path to compiled WebAssembly rule binary (required) | — |
--name <name> | Rule name | (the file name) |
--priority <NN> | Evaluation priority — lower runs first | 100 |
What it does:
- Instantiates the rule and evaluates it against a built-in allow-mock context — a rule that fails to instantiate or evaluate is not installed
- Writes it as
{priority}_{name}.wasminto the local rules dir —INTUTIC_WASM_DIRif set, otherwise~/.intutic/wasm - Prints the destination path, priority, and SHA-256 of the installed binary
The proxy picks up local rule changes within ~5s on the next request. If your proxy config.yaml sets intutic_settings.wasm_local_dir, make sure it matches this path (or set INTUTIC_WASM_DIR for both).
intutic policy list-local
List WASM rules installed in the local proxy rules dir.
intutic policy list-localNo options. For each .wasm file in the local rules dir (INTUTIC_WASM_DIR, defaulting to ~/.intutic/wasm) it prints the rule name, priority, size, mtime, and a SHA-256 prefix.
intutic doctor
Diagnose workspace health — proxy, auth, daemon, configs, logs.
intutic doctorNo options. Runs seven checks in order, each printing ✓ or ✗ plus a one-line remediation on failure:
- Proxy reachable (
http://127.0.0.1:4000/health) - Control plane auth (via stored credentials)
- Sync daemon running (PID file or process scan)
- Harness config files intact (SHA-256 drift check)
- Daemon log readable (
~/.intutic/daemon.log) - Valkey connectivity (proxy
/health, falling back to a TCP probe on port 6379) - CA cert trust (
~/.intutic/ca.crtplus the OS trust store)
intutic budget
Check remaining daily/monthly budget and list active loops.
intutic budget [options]Options:
| Option | Description |
|---|---|
--dev | Use local control plane (http://localhost:3001) |
What it does: Fetches cloud budget status (daily and monthly spend, percentages used, remaining budget, alert flag), prints the local spending cap configured in ~/.intutic/config.json (default $10.00), and lists all ACTIVE loop runs with their token spend and budget limit. Without stored credentials it runs in standalone (offline) mode and reports only the local cap.
intutic credentials list
Provisioning status for every provider in the credential registry — see Provider Keys.
intutic credentials list [options]Options:
| Option | Description |
|---|---|
--json | Output as JSON instead of a report |
--dev | Use local control plane (http://localhost:3001) |
Each provider is reported with whether it is live (the gateway actually routes to it) or not yet routable (the key is stored, but nothing forwards to it yet), plus whether a key is currently provisioned and its last-4 preview.
intutic credentials set <provider>
Provision or rotate a workspace's own upstream provider key.
intutic credentials set <provider> --field key=value [--field key=value ...] [options]Options:
| Option | Description |
|---|---|
--field <key=value> | A credential field; repeat for multi-field providers |
--json | Output as JSON instead of a report |
--dev | Use local control plane (http://localhost:3001) |
Examples:
# A single-key provider
intutic credentials set anthropic --field apiKey=sk-ant-...
# A multi-field provider (Azure OpenAI)
intutic credentials set azure_openai \
--field apiKey=sk-... \
--field endpoint=https://your-resource.openai.azure.com \
--field deployment=gpt-4If BYO-key enforcement is on for your gateway, requests for a provider with no provisioned key fail with 402 byok_required until one is set here.
intutic credentials unset <provider>
Remove a provisioned provider credential.
intutic credentials unset <provider> [options]Options:
| Option | Description |
|---|---|
--dev | Use local control plane (http://localhost:3001) |
If BYO-key enforcement is on, requests for this provider are refused after this until a new key is provisioned.
intutic sops push <name>
Push a local offline SOP folder to the central workspace — one control-plane SOP per file, each carrying its own declared front matter.
intutic sops push <name> [options]Arguments:
| Argument | Description |
|---|---|
name | Folder name under .intutic/sops/ in the workspace root |
Options:
| Option | Description |
|---|---|
--dev | Use local control plane (http://localhost:3001) |
--org | Push as an org-wide floor instead of a workspace SOP |
What it does: For every .md file in .intutic/sops/<name>/, parses title:/risk_tier:/version: front matter (falling back to the file's first # heading, then the file name, for title; to MEDIUM for an unstated risk tier) and creates one workspace SOP per file, front matter stripped from the uploaded body. Fails if the folder is missing or contains no markdown. See GitOps for SOPs for the full push/pull/status flow and what does not round-trip (declarative enforcement keys like deny_tools: have no control-plane column).
intutic sops pull
Pull every workspace SOP from the control plane into .intutic/sops/<slug>.md.
intutic sops pull [options]Options:
| Option | Description |
|---|---|
--dev | Use local control plane (http://localhost:3001) |
--force | Overwrite locally-modified files instead of refusing them |
What it does: Writes one file per SOP, with title:/risk_tier:/version: front matter reconstructed and a content_hash: marker recording the body's hash. Refuses to overwrite a file whose recorded hash no longer matches its current body (a local edit since the last pull) unless --force is passed; a file with no recorded hash at all is treated as unverifiable and always requires --force. See GitOps for SOPs.
intutic sops status
Show drift between .intutic/sops/*.md and the control plane. Read-only.
intutic sops status [options]Options:
| Option | Description |
|---|---|
--dev | Use local control plane (http://localhost:3001) |
What it does: For each local file, matched by title against the workspace's control-plane SOPs, reports in-sync, local-ahead (edited locally, not yet pushed), remote-ahead (control plane moved on, safe to pull), diverged (no recorded pull hash and no match either — can't tell "never pulled" from "edited long ago"), or push-only (no matching title on the control plane yet). See GitOps for SOPs.
intutic exec
Execute a command wrapped with Intutic proxy environment variables.
intutic exec -- <command> [args...]
intutic exec --sandbox -- <command> [args...]Arguments:
| Argument | Description |
|---|---|
command... | Command and arguments to execute (e.g. -- claude) |
Options:
| Option | Description |
|---|---|
--sandbox [kind] | Run the agent in an isolated sandbox instead of directly on the host. kind is oci (default) or firecracker. See Sandboxed Execution for what each backend actually isolates and requires. |
--sandbox-image <image> | Sandbox image — must contain the agent, nftables, and capsh. Default: intutic/sandbox:latest. |
--sandbox-memory <size> | Sandbox memory cap, e.g. 2g. Default: 2g. |
--sandbox-cpus <n> | Sandbox CPU cap. Default: 2. |
--sandbox-pids <n> | Sandbox max process count. Default: 512. |
--sandbox-allow <cidrs> | Comma-separated extra destination CIDRs the sandbox may reach beyond the proxy and DNS. |
If the workspace's sandbox requirement is set to Require (Settings → Security → Sandboxed Execution) and --sandbox is omitted, the command refuses to run rather than executing ungoverned on the host.
What it does: Injects the proxy environment into the child process, then spawns it with inherited stdio and exits with the child's exit code. The injected variables cover the competing SDK conventions:
| Variable | Consumers |
|---|---|
OPENAI_API_BASE | LiteLLM, LangChain, CrewAI, ADK, Aider |
OPENAI_BASE_URL | OpenAI Python SDK v1+, Pydantic-AI, Agent SDK |
OPENAI_API_BASE_URL | OpenWebUI |
OPENAI_HOST | Goose (host only, no /v1) |
ANTHROPIC_BASE_URL | Claude Code, Anthropic SDK (host only) |
OPENAI_API_KEY / ANTHROPIC_API_KEY / INTUTIC_API_KEY | API key for all of the above |
Requires intutic login first. In dev mode the proxy is http://localhost:4000, otherwise http://localhost:4000.
Examples:
intutic exec -- claude
intutic exec -- aider --model openai/gpt-4o
intutic exec -- python my_agent.pyintutic enforce
Manage the mandatory default-deny egress firewall — makes the governing proxy non-optional by dropping outbound traffic to everything except the proxy, DNS, and operator-declared infrastructure. Where Network Egress Control governs traffic the proxy sees, intutic enforce closes the gap where an agent simply doesn't route through the proxy at all: with it applied, there is no other way out.
intutic enforce <action> [options]Actions:
| Action | Privilege | What it does |
|---|---|---|
generate | None | Prints the platform firewall ruleset without applying it. |
apply | Root | Applies the default-deny egress firewall. All egress except the proxy, DNS, and --allow infrastructure is dropped. |
remove | Root | Removes the Intutic egress firewall. |
status | None | Reports whether the egress firewall is currently applied. |
report | None | Reports the locally recorded enforcement state (firewall, CA-trust, system-hooks posture) to the control plane. For when apply/remove ran elevated and couldn't reach stored credentials. |
Options (apply/remove/status/generate):
| Option | Description |
|---|---|
--port <port> | The proxy's listener port to permit. Default: 4000. |
--uid <uid> | uid the proxy runs as, exempted from the deny. Defaults to the current user. |
--allow <cidrs> | Comma-separated extra destination CIDRs to permit (control plane, private registries, etc.). |
--no-dns | Also deny outbound DNS — only if a local resolver serves the host. |
--platform <os> | Target ruleset platform: linux, macos, or windows. Defaults to the current OS. |
What it does:
Implemented in the intutic-proxy binary's own enforce subcommand (platform-aware: nftables or iptables on Linux, pf on macOS); the CLI command is a thin, discoverable wrapper around it. apply/remove change the host firewall and need root — re-run with sudo if it fails with a permission error. After a successful apply/remove, the CLI re-queries status while still elevated and best-effort reports the result to the control plane, so an admin can see whether enforcement is actually active on a given machine without SSHing into it.
Examples:
# See what would be applied, without changing anything
intutic enforce generate
# Apply, permitting an internal package registry too
sudo intutic enforce apply --allow 10.0.0.0/8,registry.internal.corp
# Check whether it's currently active
intutic enforce status
# Remove it
sudo intutic enforce removeintutic daemon install
Install sync-daemon as a system service (auto-starts on login, restarts on any exit).
intutic daemon install --workspace-id <id> --api-key <key> [options]Also available as the top-level shortcut intutic install-daemon.
Options:
| Option | Description | Default |
|---|---|---|
--workspace-id <id> | Workspace ID, e.g. wk_xxxx (required) | — |
--api-key <key> | Workspace API key, e.g. vk_xxxx (required) | — |
--control-plane-url <url> | Control plane URL | https://your-control-plane.example |
--binary-path <path> | Path to the intutic CLI binary | (current process) |
--dry-run | Print what would be done without writing files | — |
--system | Install as a system-level service (LaunchDaemon on macOS, systemd system unit on Linux) | — |
Service files written:
- macOS:
~/Library/LaunchAgents/ai.intutic.sync-daemon.plist(KeepAlive: true) - Linux:
~/.config/systemd/user/intutic-sync-daemon.service(Restart=always)
Because the service restarts on any exit, stopping it requires intutic daemon stop, intutic daemon uninstall, or launchctl unload.
intutic daemon uninstall
Remove the sync-daemon system service and stop it permanently.
intutic daemon uninstall [options]Also available as the top-level shortcut intutic uninstall-daemon.
Options:
| Option | Description |
|---|---|
--dry-run | Print what would be done without writing files |
--system | Uninstall the system-level service |
intutic daemon status
Show sync-daemon system service status.
intutic daemon statusNo options.
intutic daemon start
Start and load the sync-daemon system service.
intutic daemon startNo options.
intutic daemon stop
Stop and unload the sync-daemon system service.
intutic daemon stopNo options.
intutic rollback
List or restore file pre-images captured when a guard flagged a call and let it proceed (TD-328). This is the restore half of the mechanism — the capture half runs automatically inside the generated harness hook when a warn-tier guard fires, if capture is enabled.
intutic rollback # list captured pre-images
intutic rollback --id <id> # restore oneOptions:
| Option | Description |
|---|---|
--list | List captured pre-images. The default when --id is omitted. |
--id <id> | Restore the named pre-image. |
Capture is opt-in and narrowly scoped — set "captureRollbackPreImages": true in .intutic/config.json. It's off by default because it stores copies of flagged files locally. It only captures on the warn enforcement tier: a KILLed call never executes (nothing to revert), and a require-tier violation is refused before it runs — capture exists for the one case where a call was flagged and allowed to proceed anyway, so there's a "before" worth keeping. Bounded to 2 MiB per file and 50 retained entries.
What it does:
- With no
--id: lists every captured pre-image (id, capture time, tool, target path, byte size or "file did not exist") and prints the restore command for each. - With
--id <id>: restores exactly that pre-image and nothing else — there is no--alland no implicit "latest". Before restoring, the current contents of the target are themselves captured as a new pre-image, so the restore is itself undoable. The restore is appended to the same.intutic/events/hook-events.jsonllog the gate writes to (tool_reverted), so the audit trail reads "flagged → allowed → reverted", not a file that silently changed back. If the pre-image's stored blob was evicted by the retention ceiling, the command refuses rather than performing a partial restore.
Examples:
# See what's available to restore
intutic rollback
# Restore a specific one (id comes from the list above)
intutic rollback --id a1b2c3d4e5f60718