Skip to main content

Developer-first AI safety checks: prompt-policy lint, secret scanning, and log scanning with PII detection. Zero-dep CLI + GitHub Action + Claude Skill + Cursor Rule.

Project description

wrg-devguard

PyPI version Python Downloads CI CodeQL License: MIT

Developer-first AI safety checks: prompt-policy lint + secret scanning.

Zero-dependency Python CLI that scans a repository for two classes of issues before your PR lands:

  1. Leaked secrets — API keys, private keys, tokens, common credential formats in tracked files.
  2. Prompt-policy violations — deny-listed patterns in prompts, system messages, and AI-facing text assets (configurable via JSON policy).

Ships as:

  • A Python package (pip install wrg-devguard)
  • A GitHub Action (drop-in composite action for any repo)
  • A Claude Code skill (.claude/skills/wrg-devguard/)
  • A Cursor rule (.cursor/rules/wrg-devguard.mdc)

No external dependencies in the core scanner (stdlib only). Optional [yaml] extra for YAML policy files. Optional bandit subcommand for Python security scanning.

Install

pip install wrg-devguard

For YAML policy support:

pip install "wrg-devguard[yaml]"

Quick start

# Run both checks and fail on any high-severity finding
wrg-devguard check --path . --fail-on error

# Scan only for leaked secrets
wrg-devguard scan-secrets --path .

# Lint AI-facing text assets against a policy
wrg-devguard lint-policy --path . --profile strict

# Emit a JSON report for CI
wrg-devguard check --path . --json-out wrg-devguard-report.json

GitHub Action

# .github/workflows/security.yml
name: security
on: [pull_request, push]

jobs:
  wrg-devguard:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: yakuphanycl/wrg-devguard@v1
        with:
          profile: strict
          fail-on: error

See action.yml for all inputs.

GitHub Actions Marketplace

3-line quickstart (drop into any .github/workflows/*.yml):

- uses: yakuphanycl/wrg-devguard@v1
  with:
    path: .
    fail-on: error

Inputs

Name Required Default Description
path no . Root path to scan
fail-on no error Fail threshold: error, warn, none
format no text Report format: text, json, sarif
profile no baseline Policy profile: baseline or strict
allowlist no empty Optional path to allowlist JSON
python-version no 3.12 Python version installed by the action
version no latest Pip version spec (e.g. ==0.1.1)

Outputs

Name Description
findings-count Total number of findings produced by the scan
report-path Path to the generated report (empty when format: text)

Use cases

1. PR check — block any error-severity finding:

name: security
on: pull_request
jobs:
  scan:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: yakuphanycl/wrg-devguard@v1
        with:
          path: .
          fail-on: error

2. Scheduled audit — emit SARIF, never fail the job, upload to code-scanning:

name: weekly-audit
on:
  schedule:
    - cron: '0 6 * * 1'
jobs:
  scan:
    runs-on: ubuntu-latest
    permissions:
      security-events: write
    steps:
      - uses: actions/checkout@v4
      - id: dg
        uses: yakuphanycl/wrg-devguard@v1
        with:
          format: sarif
          fail-on: none
      - uses: github/codeql-action/upload-sarif@v3
        with:
          sarif_file: ${{ steps.dg.outputs.report-path }}

3. Monorepo path filter — scan only one app, warn-level threshold:

- uses: yakuphanycl/wrg-devguard@v1
  with:
    path: apps/payments
    profile: strict
    fail-on: warn
    format: json

Pinning

  • @v1 — moving major tag, fast-forwards on every minor/patch release
  • @v1.0.0 — immutable release tag (recommended for reproducible CI)

See the Marketplace listing for the latest published versions.

Claude Code skill

Drop the skill into your workspace:

mkdir -p .claude/skills/wrg-devguard
curl -L https://raw.githubusercontent.com/yakuphanycl/wrg-devguard/main/.claude/skills/wrg-devguard/SKILL.md \
  -o .claude/skills/wrg-devguard/SKILL.md

Claude Code will surface the skill automatically when you ask things like "scan for secrets", "is this safe to commit", or "check for leaks".

Cursor rule

Drop the rule into your workspace:

mkdir -p .cursor/rules
curl -L https://raw.githubusercontent.com/yakuphanycl/wrg-devguard/main/.cursor/rules/wrg-devguard.mdc \
  -o .cursor/rules/wrg-devguard.mdc

Cursor will apply the rule before suggesting any git commit command.

Policy file

Default lookup order:

  1. --policy <path> argument if provided
  2. .wrg/policy.json at the repo root
  3. Built-in defaults

Profiles:

  • baseline → PR-friendly baseline (recommended for CI, default)
  • strict → stricter local/release audits (use --profile strict)

Place custom policies in .wrg/policy.json (JSON) or .wrg/policy.yaml (requires [yaml] extra).

Commands

wrg-devguard profiles                           # list available profiles
wrg-devguard lint-policy --path .               # policy lint only
wrg-devguard scan-secrets --path .              # secret scan only
wrg-devguard check --path .                     # both, single JSON report
wrg-devguard check --path . --profile strict
wrg-devguard check --path . --json-out report.json
wrg-devguard check --path . --fail-on warning
wrg-devguard check --path . --allowlist .wrg/allowlist.json
wrg-devguard bandit --path src/                 # optional: bandit wrapper

Exit codes

  • 0 — no findings above threshold
  • 1 — findings at or above --fail-on threshold
  • 2 — configuration or input error

Output schema

The forthcoming scan-logs subcommand (v0.2.0) emits a frozen JSON contract documented at schemas/log_scan_result.schema.json.

Consumers (the GitHub Action, the Control Center log viewer, future CI integrations) parse against this schema. Highlights:

  • schema_version: "1" (frozen for the v0.2.0 line).
  • source: one of manual, ci, cc-endpoint. v0.2.0 ships manual only.
  • findings[].pattern_id: stable <NAMESPACE>-<NNN> identifiers (AWS-001, EMAIL-001, etc.). Patterns are versioned by ID — superseded patterns get a new ID, never reuse.
  • findings[].redacted_excerpt: producers MUST middle-mask the matched value. Raw secrets never appear in the output.
  • Categories and severities are open-enum-friendly: consumers should accept unknown values gracefully (treat as a generic finding) so v0.3.0 additions don't break v0.2.0 readers.

Validation tests live at tests/schemas/test_log_scan_result_schema.py (28 cases covering self-validation, fixture acceptance, and malformed-payload rejection). To run them locally:

pip install -e ".[dev]"
pytest tests/schemas/ -v

Why another secret scanner?

  • Zero runtime deps — the core scanner is stdlib only, so pip install is instant and works in any sandbox.
  • Policy lint in the same tool — most scanners only do secrets. We also catch prompt-policy violations (deny-listed patterns, hardcoded system prompts, PII in AI-facing text).
  • AI-native UX — ships with a Claude skill and a Cursor rule so the scanner runs automatically inside your AI coding assistant, not just in CI.
  • Stable JSON schemacheck --json-out emits a versioned schema that never breaks.

Development

git clone https://github.com/yakuphanycl/wrg-devguard.git
cd wrg-devguard
pip install -e ".[dev]"
pytest -q

License

MIT. See LICENSE.

Contributing

Issues and PRs welcome. For substantial changes, open an issue first to discuss scope.


Part of the WinstonRedGuard ecosystem. The monorepo at apps/wrg_devguard/ is the canonical source; this repo is a distribution mirror kept in sync on every release.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

wrg_devguard-0.2.0.tar.gz (38.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

wrg_devguard-0.2.0-py3-none-any.whl (25.1 kB view details)

Uploaded Python 3

File details

Details for the file wrg_devguard-0.2.0.tar.gz.

File metadata

  • Download URL: wrg_devguard-0.2.0.tar.gz
  • Upload date:
  • Size: 38.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for wrg_devguard-0.2.0.tar.gz
Algorithm Hash digest
SHA256 ffff0e2d0b53ec39b27534f4e5a02ce213e733b93134c1d150d916f990a66ac5
MD5 b52e90849ce0bbf60bef06171eba4e23
BLAKE2b-256 c7801ead5a8af31ea7a4cd4648f696a3b7a6bcd3c80b1683b0fe3735c1b34d35

See more details on using hashes here.

Provenance

The following attestation bundles were made for wrg_devguard-0.2.0.tar.gz:

Publisher: publish.yml on yakuphanycl/wrg-devguard

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file wrg_devguard-0.2.0-py3-none-any.whl.

File metadata

  • Download URL: wrg_devguard-0.2.0-py3-none-any.whl
  • Upload date:
  • Size: 25.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for wrg_devguard-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 4cfdc17e4ce42091c0b2032edd5b9d8ae9728b8460103b855656bce74c9f98bf
MD5 cec8dc0c6fd6591b9a06620449495c71
BLAKE2b-256 4d676a036ac9396318946fb706849912bf0841c3df6fd10b97ab997d2a646a2d

See more details on using hashes here.

Provenance

The following attestation bundles were made for wrg_devguard-0.2.0-py3-none-any.whl:

Publisher: publish.yml on yakuphanycl/wrg-devguard

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page