Your project trusts more than the code you wrote. Aguara checks the rest locally, before install or delegation: package versions, lockfiles, installed dependency trees, CI workflows, MCP configs, skills, AI agent tools.
Local by default · No SaaS account · No LLM calls
Aguara resolves the local evidence your project is about to trust, matches supported package references and agent surfaces against embedded detections, and emits a deterministic verdict your CI can gate on.
Aguara discovers every supported lockfile and installed package tree under the path. pnpm-lock.yaml works before install. node_modules and site-packages work after.
$ aguara check . ▸ pnpm-lock.yaml ▸ go.sum ▸ node_modules/
Supported package references are normalized and matched against embedded OSV.dev and OpenSSF malicious-package intelligence where exact-version coverage is available. No network call required.
$ aguara status snapshot: 2026-05-18 records: 47,318 source: OSV + OpenSSF
SARIF for GitHub Code Scanning. JSON for tooling. Markdown for PR summaries. Terminal for humans. --fail-on high gates CI.
$ aguara audit . --ci Audit complete · exit 1 → security.sarif
Each pillar maps to one of Aguara's analyzer families. Findings include severity, file location, the matched evidence, and remediation guidance.
Known malicious versions across npm/pnpm, PyPI, RubyGems, NuGet, Go, crates.io, Packagist, and Maven. Detects them from lockfiles before install where supported, and from installed package trees after install.
Instruction overrides, hidden instructions, authority claims, role switching, and poisoning of tool descriptions and MCP schema fields.
Unpinned npx/uvx, shell metacharacters in args, hardcoded secrets, host networking, Docker privileges, capability escalation.
pull_request_target chains, cache poisoning across fork boundaries, OIDC token harvest, mutable action refs, persisted-credentials checkouts on PR head refs.
Pick the path that matches how you ship security tooling. Every release is signed with Cosign keyless and ships an SPDX SBOM.
$ brew install garagon/tap/aguara $ aguara check .
Simplest local install on macOS or Linux. Auto-updates via brew upgrade.
$ docker run --rm \
-v "$PWD:/repo:ro" \
ghcr.io/garagon/aguara:0.18.2 \
check /repo
Multi-arch (linux/amd64 + linux/arm64), non-root UID 10001, digest-pinned base, image signed with cosign + SBOM + SLSA provenance.
$ curl -fsSL https://raw.githubusercontent.com/garagon/aguara/main/install.sh \ | VERSION=v0.18.2 sh $ aguara check .
Override location for CI / containers with INSTALL_DIR=/usr/local/bin. install.sh verifies SHA256 against the release's checksums.txt.
# .github/workflows/security.yml - uses: garagon/aguara@v0.18.2 with: path: . severity: medium fail-on: high format: sarif version: v0.18.2
Pin both the action ref and the version: input. The action ref pins the workflow wrapper. version: pins the Aguara binary.
$ go install github.com/garagon/aguara/cmd/aguara@v0.18.2 $ aguara version
For developers building from source. Requires Go 1.25+. Source builds report dev metadata; for signed releases use Homebrew, Docker, or the install script.
Aguara checks local package evidence: lockfiles before install where supported, and installed dependency trees after install. Strong exact-version malicious-package coverage is available for npm/pnpm, PyPI, RubyGems, and NuGet. Other ecosystems are parser-ready with coverage expanding as range-aware matching lands.
| Surface | Inputs | Current coverage |
|---|---|---|
| npm (incl. pnpm) | node_modules, pnpm .pnpm store, pnpm-lock.yaml | Strong malicious-package coverage. pnpm-lock.yaml works before install. |
| PyPI | site-packages, .pth, pip/uv caches | Strong malicious-package + persistence coverage |
| RubyGems | Gemfile.lock | Strong malicious-package coverage |
| NuGet | packages.lock.json, *.csproj, *.fsproj, *.vbproj | Strong exact-version malicious-package coverage |
| Go | go.sum, go.mod | Parser ready; limited exact-version embedded matches today |
| crates.io | Cargo.lock (public registry only) | Parser ready; range-aware OSV matching deferred |
| Packagist | composer.lock | Parser ready; range-aware OSV matching deferred |
| Maven / Gradle | pom.xml, gradle.lockfile, gradle/dependency-locks/* | Parser ready; range-aware OSV matching deferred |
Aguara stays focused on known compromised packages and high-confidence trust-point failures for AI-agent and supply-chain workflows. General CVE / range matching is a different problem.
mcp-aguara exposes the same Aguara scanner as an MCP server, so a compatible agent can request a local check before it trusts a third-party tool, a pasted config, or skill content. No network, no LLM, fast local scans.
aguara scan --auto
Discovers and scans every MCP config on this machine across 17 supported clients in one pass.
aguara scan .claude/skills --ci
Scan skill files for prompt injection, hidden instructions, and command execution.
go install github.com/garagon/mcp-aguara@latest
Install the MCP server, then claude mcp add aguara -- mcp-aguara wires it into the agent.
17 MCP clients auto-detected Claude Desktop · Cursor · VS Code · Cline · Windsurf · OpenClaw · OpenCode · Zed · Amp · Gemini CLI · Copilot CLI · Amazon Q · Claude Code · Roo Code · Kilo Code · BoltAI · JetBrains
SARIF lands directly in GitHub Code Scanning. JSON for custom tooling. Markdown for PR summaries. Terminal for humans. Pin both the action ref and the binary version.
# .github/workflows/security.yml name: Aguara on: pull_request: push: branches: [main] jobs: aguara: runs-on: ubuntu-latest permissions: contents: read security-events: write steps: - uses: actions/checkout@v4 - uses: garagon/aguara@v0.18.2 with: path: . severity: medium fail-on: high format: sarif version: v0.18.2
Inputs: path, severity, fail-on, format (sarif default), upload-sarif, version. SARIF upload requires security-events: write and is free for public repositories.
A security scanner that you cannot verify is just code you trust on faith. Every Aguara release ships with three things you can check.
Every release archive and Docker image is signed at the digest with Cosign. Verify the signer is the release GitHub Actions workflow at the tagged ref.
Every release ships a complete SPDX 2.3 software bill of materials. Container images carry the SBOM as a BuildKit attestation on the OCI index.
Container images include SLSA build provenance attestations so you can verify which workflow, which commit, and which runner produced the bits you ran.
$ VERSION=v0.18.2 $ ARCHIVE=aguara_${VERSION#v}_linux_amd64.tar.gz $ curl -fsSLO https://github.com/garagon/aguara/releases/download/${VERSION}/${ARCHIVE} $ curl -fsSLO https://github.com/garagon/aguara/releases/download/${VERSION}/checksums.txt $ curl -fsSLO https://github.com/garagon/aguara/releases/download/${VERSION}/checksums.txt.bundle $ cosign verify-blob \ --bundle checksums.txt.bundle \ --certificate-identity "https://github.com/garagon/aguara/.github/workflows/release.yml@refs/tags/${VERSION}" \ --certificate-oidc-issuer "https://token.actions.githubusercontent.com" \ checksums.txt $ sha256sum --check --ignore-missing checksums.txt
For the container image: cosign verify ghcr.io/garagon/aguara:0.18.2 with the matching --certificate-identity for docker.yml.
193 YAML pattern rules plus 26 analyzer-emitted detections for cases that need structure or correlation. CI results stay reproducible when the binary version is pinned.
Browse rules on GitHub →