AgenticCLI
▮ shipguardis the security scanner your coding agent runs before every commit.$ npm i -g @agenticcli/shipguard

Quick Start

ShipGuard runs locally and gates your release with deterministic exit codes. No account, runs on your machine — install and scan in under 30 seconds. Tuned for Next.js + Supabase / Firebase apps that ship to Vercel.

Install

$npm i -g @agenticcli/shipguard

Or run once without installing: npx @agenticcli/shipguard scan.

Source code on GitHub →

Quick start

Scaffold a policy file, then run your first scan:

quickstart
dev in ~/checkout on ⎇ main ❯ shipguard init
✓ ShipGuard initialized · created shipguard.policy.yml
dev in ~/checkout on ⎇ main ❯ shipguard scan --changed --strict
ShipGuard v0.10.0 — scanning 12 changed files
CRITICAL secrets:hardcoded-api-key
src/lib/openai.ts:12
HIGH auth:supabase-rls-disabled
supabase/migrations/0007.sql:3
Risk Score: 78/100 HIGH RISK
Status: BLOCKED — exit 1
In CI, run a full scan (shipguard scan --strict). --changed reads the changed files in your working tree, so it is for local runs, pre-commit hooks and agent loops, not for a fresh CI checkout.

Setup in your agent: Claude Code setup guide, Codex setup guide, Cursor setup guide.

Commands

commandwhat it does
shipguard initcreate shipguard.policy.yml and .shipguard/
shipguard scanrun all enabled checks on the repo
scan --changedonly scan files changed in your working tree (local, pre-commit and agent loops, not CI)
scan --reportwrite a Markdown report to .shipguard/reports/
scan --strictexit 1 on any high / critical finding (for CI)
scan --jsonemit machine-readable findings for agents

Exit codes

codemeaningaction
exit 0scan completed — verdict is in the JSON "recommendation" fieldread recommendation, then ship or fix
exit 1blocked — only with --strict, and only if a finding is blockingfix and re-scan
exit 2config errorcheck shipguard.policy.yml
exit 3runtime errorfile an issue

CI integration

ci
# .github/workflows/gate.yml
- uses: actions/checkout@v4
- run: npx @agenticcli/shipguard scan --strict
CI runs a full scan, so the default checkout is enough and fetch-depth: 0 is not needed. Never use --changed in CI; keep it for local runs, pre-commit hooks and agent loops.

Choosing a scanner? See how ShipGuard compares with other scanners.

Guides: where the gate fits

Policy file

Optional shipguard.policy.yml at the project root controls which findings block, which warn, and which paths to ignore:

shipguard.policy.yml
version: 1
block:
- hardcoded_secret
- payment_webhook_without_signature_check
- supabase_rls_disabled
warn:
- missing_input_validation
ignore:
paths: ["node_modules/**", ".next/**"]

Telemetry

Your code never leaves your machine. Published builds (0.10.0 and later) send three kinds of small pseudonymous usage ping: one after each scan, one the first time ShipGuard runs on an install (never in CI), and one after a successful shipguard login. Opt out of all three with SHIPGUARD_TELEMETRY=0 or DO_NOT_TRACK=1 or shipguard telemetry disable. They include no file names, paths, repo names, findings, secrets or code. They are not linked to your account. More in our privacy policy.

For agents

ShipGuard is agent-native: --json emits machine-readable findings, and exit codes gate autonomously. Point your agent at /llms.txt or the /agents page for the full machine-readable map and fix loop.

agent fix loop
$ shipguard scan --changed --json | your-agent fix