Static repository guardrails for agent-touched codebases.
Project description
agent-guard
Static repository guardrails for agent-touched codebases.
agent-policydecides whether an agent should do something.agent-guardchecks whether the repository content still obeys the rules.
Status: 0.1.1 alpha. The current MVP ships four scanners: api, content, path, and digest.
Why
agent-guard exists to enforce fail-closed static checks around agent-operated repositories without pulling in a full control plane.
The current extracted scanners are intentionally narrow:
api: scan repository text files for URLs, allow approved API patterns, fail on forbidden API patternscontent: scan Markdown or other configured text files for dangerous instruction patternspath: scan repository path names for private artifacts, env files, and other publish-time leaksdigest: verify SHA-256 pins for governance docs and safety-critical scripts- return stable JSON or text output for local hooks and CI
It does not manage approvals, logs, state, or UI. Those belong in higher layers.
Install
pip install yui-agent-guard
From a source checkout, install the package in editable mode:
pip install -e .
Requires Python 3.11+. The only runtime dependency is PyYAML.
Quick start
API surface guard:
agent-guard api check --root . --policy examples/architecture_policy.yaml
Content security guard:
agent-guard content check --repo-root . --policy examples/content_security_policy.yaml --mode registered --scan-dir skills
Path-name guard:
agent-guard path check --root . --policy examples/ai_resilience_path_policy.yaml
Digest guard:
agent-guard digest check --root . --policy digest_policy.yaml
JSON mode is stable and intended for CI/wrappers:
agent-guard api check --root . --policy examples/architecture_policy.yaml --json
agent-guard content check --repo-root . --policy examples/content_security_policy.yaml --mode registered --scan-dir skills --json
agent-guard path check --root . --policy examples/ai_resilience_path_policy.yaml --json
agent-guard digest check --root . --policy digest_policy.yaml --json
CI gate recipe
For ai-resilience-style repositories, use agent-guard as the static half of
the publication gate and pair it with a runtime approval wrapper such as
agent-policy. A practical final gate runs all three static checks:
agent-guard path check --root . --policy .agent-guard/path-policy.yaml --json
agent-guard digest check --root . --policy .agent-guard/constitution-digest-policy.yaml --json
agent-guard content check --repo-root . --policy .agent-guard/content-policy.yaml --mode registered --scan-dir . --json
Recommended split:
path: blocks leak-prone names before content is even read, includingartifacts/private/, bypass corpora, red-team logs, and.env*files.digest: pins governance documents and verifier scripts that must not drift silently.content: detects unsafe instruction drift in Markdown, scripts, and other configured text surfaces.
Keep explicit git-history checks in the repository workflow for material that
must never have been tracked, such as bypass corpora and private artifacts.
agent-guard checks the current tree; git log --diff-filter=A --name-only
checks historical contamination.
Current scanners
API guard
The API guard scans configured paths for URLs and compares them against allow/deny regex lists.
Typical use case:
- keep a CLI-first repository from silently drifting into direct inference API calls
It returns:
- exit
0on clean - exit
1on violation - exit
2on configuration/runtime error
Content guard
The content guard scans configured text content for forbidden regex patterns.
Supported modes:
registered: scan a configured directory under the repopreregister: scan explicit file or directory targetsnew: scan changed files from git diff, optionally including untracked files
new mode uses two behaviors: with --since-ref, it scans files changed between that ref and HEAD; without --since-ref, it scans the current working tree diff and can optionally include untracked files.
Typical use cases:
- keep dangerous install instructions out of skills docs
- block hardcoded credential-like strings in agent-authored Markdown
- catch destructive command suggestions before they spread
It returns:
- exit
0on clean - exit
1on violation - exit
2on configuration/runtime error
Path guard
The path guard scans file and directory names under configured roots. It uses
allowlist-first matching so narrow exceptions such as .env.example can be
allowed while broader deny patterns still block .env, .env.local, and
.env.evil.
Typical use cases:
- keep
artifacts/private/out of publishable repository paths - block bypass corpus files and red-team session logs by name
- catch env-file leaks even when contents are ignored or unreadable
It returns:
- exit
0on clean - exit
1on violation - exit
2on configuration/runtime error
Digest guard
The digest guard verifies pinned SHA-256 values for files that should not
drift silently. Each check names a repository-relative path, an expected
digest, and an optional start_line when only the content body should be
hashed.
Typical use cases:
- detect unreviewed edits to governance documents
- pin verifier scripts that protect publication or release gates
- preserve B9-style constitution integrity checks without shell-specific logic
It returns:
- exit
0on clean - exit
1on violation - exit
2on configuration/runtime error
Example policies
API guard policy
scan:
include:
- src
- scripts
exclude:
- scripts/build_instructions.sh
policy:
allowed_api_patterns:
- "^https://ntfy\.sh/"
forbidden_api_patterns:
- "^https://api\.openai\.com/"
- "^https://api\.anthropic\.com/"
A ready-to-run copy lives in examples/architecture_policy.yaml.
Content guard policy
file_globs:
- "**/*.md"
exclude_globs:
- "archive/**"
forbidden_patterns:
- id: pipe_to_shell
severity: high
pattern: '(?i)curl\s+[^\n|]+\|\s*(bash|sh)\b'
message: "pipe-to-shell pattern is forbidden"
exclude_globs:
- "fixtures/red-team/**"
A ready-to-run copy lives in examples/content_security_policy.yaml.
Content rules may define per-rule include_globs / exclude_globs. Use this
when a repository contains intentional adversarial fixtures that should stay
scannable for secrets but should not fail dangerous-command rules. For narrow
documented examples, append an inline suppression such as
# agent-guard: allow pipe_to_shell or # agent-guard: allow all on the same
line.
Path guard policy
scan:
include:
- "."
exclude:
- ".git"
- ".venv"
- "node_modules"
policy:
allowed_path_patterns:
- "(^|/)\\.env\\.example$"
forbidden_path_patterns:
- id: private_artifacts
severity: high
pattern: "(^|/)artifacts/private(/|$)"
message: "private artifact directory must stay outside published/tracked paths"
A ready-to-run ai-resilience-style copy lives in
examples/ai_resilience_path_policy.yaml.
Digest guard policy
checks:
- id: constitution_full
path: agent-constitution-v0.md
sha256: "<64-char lowercase sha256>"
- id: constitution_content
path: agent-constitution-v0.md
sha256: "<64-char lowercase sha256>"
start_line: 15
CLI
agent-guard api check --root <repo> --policy <yaml> [--json]
agent-guard content check --repo-root <repo> --policy <yaml> --mode <registered|preregister|new> [--scan-dir <dir>] [--targets <paths...>] [--since-ref <ref>] [--no-untracked] [--json]
agent-guard path check --root <repo> --policy <yaml> [--json]
agent-guard digest check --root <repo> --policy <yaml> [--json]
Roadmap
Planned next steps:
- shared result envelope helpers across scanners
- optional pre-commit examples
Releases
Tag-driven. Pushing a vX.Y.Z annotated tag triggers
.github/workflows/release.yml, which first
verifies that the tag matches [project].version in pyproject.toml, checks
that the version is not already present on PyPI, then builds the sdist + wheel
and publishes to PyPI via Trusted Publishing (OIDC). No maintainer-side PyPI
token is required once the PyPI project environment is configured. Manual
workflow_dispatch with publish=false is a build-only dry run; it skips the
publish job. Manual publish=true must be run against a v* tag ref; running
it from a branch fails before build.
License
MIT.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file yui_agent_guard-0.1.1.tar.gz.
File metadata
- Download URL: yui_agent_guard-0.1.1.tar.gz
- Upload date:
- Size: 21.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a2cd5f5fac44a554f027b880dd9f694fee94bbe104fb08be2ed3999e2fca5a94
|
|
| MD5 |
d46b672b0b6c7075349f02257729fbd8
|
|
| BLAKE2b-256 |
6429145ff0094c46c2c4cf651c76671b270ce265713e3bb7ac0d749d03ed1b2b
|
Provenance
The following attestation bundles were made for yui_agent_guard-0.1.1.tar.gz:
Publisher:
release.yml on yui-stingray/agent-guard
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
yui_agent_guard-0.1.1.tar.gz -
Subject digest:
a2cd5f5fac44a554f027b880dd9f694fee94bbe104fb08be2ed3999e2fca5a94 - Sigstore transparency entry: 1410090957
- Sigstore integration time:
-
Permalink:
yui-stingray/agent-guard@69d50c6960756773e0853b49e6dff77f79b4124d -
Branch / Tag:
refs/tags/v0.1.1 - Owner: https://github.com/yui-stingray
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@69d50c6960756773e0853b49e6dff77f79b4124d -
Trigger Event:
push
-
Statement type:
File details
Details for the file yui_agent_guard-0.1.1-py3-none-any.whl.
File metadata
- Download URL: yui_agent_guard-0.1.1-py3-none-any.whl
- Upload date:
- Size: 16.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
baeb3437e268922bacd95557b54a1e8cd524a2e2c3759bc47f30d1ddfe87723a
|
|
| MD5 |
a84c67e54b90fa46eb851042b422e3fc
|
|
| BLAKE2b-256 |
96110a124818b82fff7f9c05986b1e19817b4f20fd323f58e0e828b7164ef150
|
Provenance
The following attestation bundles were made for yui_agent_guard-0.1.1-py3-none-any.whl:
Publisher:
release.yml on yui-stingray/agent-guard
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
yui_agent_guard-0.1.1-py3-none-any.whl -
Subject digest:
baeb3437e268922bacd95557b54a1e8cd524a2e2c3759bc47f30d1ddfe87723a - Sigstore transparency entry: 1410091037
- Sigstore integration time:
-
Permalink:
yui-stingray/agent-guard@69d50c6960756773e0853b49e6dff77f79b4124d -
Branch / Tag:
refs/tags/v0.1.1 - Owner: https://github.com/yui-stingray
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@69d50c6960756773e0853b49e6dff77f79b4124d -
Trigger Event:
push
-
Statement type: