Catalog PyPI
PACKAGE EXPLORERView in registry

ai-guard-cli

PyPI

AI Code Quality Guard — detect common failure patterns in AI-generated code

aiai-generated-codecode-qualitylinterstatic-analysis
Versions collected1
Direct dependencies9From release 0.4.0
Last observed21 Oct, 10:51 UTC

README

Version 0.4.0 documentation

AIGuard

AI Code Quality Guard - catch the bugs AI leaves behind.

CI PyPI Python License: MIT Release

AI-generated code is "almost right" - it compiles, passes linting, follows conventions... but has subtle bugs that are harder to find than writing it yourself. 66% of developers say this is their #1 frustration with AI coding tools.

AIGuard is a static analysis tool that catches the specific patterns where AI-generated code goes wrong: shallow error handling, hallucinated imports, copy-paste duplication, missing validation, placeholder code disguised as complete - and now malicious content hidden in AI agent prompts and skill files.

AIGuard demo

$ aiguard scan ./src

src/api/handlers.py
  E       12  Bare 'except:' catches all exceptions including KeyboardInterrupt  AIG001
  W       34  Functions 'get_users' and 'get_admins' are 92% similar             AIG005
  W       67  Public function 'process' has 4 params but no input validation     AIG006

src/utils/helpers.py
  I       5   Variable 'data' is too generic - use a descriptive name            AIG010
  W       22  Function 'transform' has only 'pass' - placeholder code            AIG007

  ┌─────────────────── AI Code Health Score ───────────────────┐
  │  ████████████████████████████░░░░░░░░░░░░  72/100  ~       │
  └────────────────────────────────────────────────────────────┘

Prompt Security Scanner (NEW)

People blindly trust AI agent prompts, skills, and .md config files - but they can contain hidden malicious instructions. AIGuard now scans markdown files for threats that are invisible to human reviewers.

AIGuard Prompt Security Scanner demo

# Scan a prompt/skill file for hidden threats
aiguard scan agent-instructions.md

# Scan all markdown files in a directory
aiguard scan ./prompts/

What it catches:

  • Prompt injection - "ignore previous instructions", role hijacking, stealth commands
  • Hidden content - zero-width Unicode characters, invisible HTML (display:none), base64-encoded payloads
  • Data exfiltration - curl sending secrets, reading .ssh/.env/credentials, leaking $API_KEY
  • Dangerous commands - rm -rf, curl | bash, reverse shells, chmod 777, untrusted package installs

Installation / Package Name

  • PyPI package: ai-guard-cli
  • CLI command: aiguard

Quick Start

pip install ai-guard-cli
# Scan a directory
aiguard scan ./src

# Scan a single file
aiguard scan app.py

# Only scan changed lines (vs last commit)
aiguard scan --diff HEAD

# Only scan changed lines (vs main branch)
aiguard scan --diff main

# Only scan staged files (for pre-commit hooks)
aiguard scan --staged

# JSON output for CI pipelines
aiguard scan ./src --format json

# SARIF for GitHub Code Scanning
aiguard scan ./src --format sarif --output results.sarif

# Fail CI if score is below 70
aiguard scan ./src --fail-under 70

Detection Rules

Python Code Quality (AIG001-AIG010)

RuleNameWhat It CatchesSeverity
AIG001shallow-error-handlingBare except:, catching Exception, empty handlersError
AIG002tautological-codeif True, unreachable code after return, x == xWarning
AIG003over-commenting# Initialize the variable for x = 0 (AI loves this)Info
AIG004hallucinated-importsImports that don't exist in your environmentError
AIG005copy-paste-duplicationNear-identical functions with minor variationsWarning
AIG006missing-input-validationPublic functions with params but no guardsWarning
AIG007placeholder-codepass/.../NotImplementedError disguised as doneWarning
AIG008complex-one-linersNested comprehensions, chained ternariesWarning
AIG009unused-variablesAssigned but never referencedInfo
AIG010generic-namingdata, result, temp, val - meaningless namesInfo

Prompt Security (AIG011-AIG014)

RuleNameWhat It CatchesSeverity
AIG011prompt-injection"Ignore previous instructions", role hijacking, stealth commandsError
AIG012hidden-contentZero-width Unicode chars, invisible HTML, base64 payloads, suspicious commentsError
AIG013data-exfiltrationcurl/wget leaking secrets, reading .ssh/.env/credentialsError
AIG014dangerous-commandsrm -rf, curl | bash, reverse shells, chmod 777, untrusted installsError

List all rules:

aiguard list-rules

Configuration

Generate a config file:

aiguard init

This creates .aiguard.yml:

rules:
  AIG001:
    enabled: true
    severity: error
  AIG003:
    enabled: true
    max_comment_ratio: 0.6
  AIG005:
    enabled: true
    similarity_threshold: 0.85

ignore:
  - "tests/**"
  - "migrations/**"

score:
  fail_threshold: 60
  weights:
    error: 10
    warning: 3
    info: 1

Pre-commit Hook

Add AIGuard to your pre-commit config so it runs on every commit:

# .pre-commit-config.yaml
repos:
  - repo: https://github.com/GurjotSinghAulakh/aiguard
    rev: v0.4.0
    hooks:
      - id: aiguard                  # Python code quality
        args: ["--fail-under", "60"]
      - id: aiguard-prompt-scan      # Prompt/markdown security
        args: ["--fail-under", "80"]

Then install:

pip install pre-commit
pre-commit install

Now AIGuard runs automatically on every git commit - scanning Python code for quality issues and markdown files for hidden threats.

Diff Mode (Only Scan New Code)

The killer feature for existing projects - only flag issues in new or changed code, not the entire codebase:

# Issues introduced since last commit
aiguard scan --diff HEAD

# Issues introduced vs main branch (perfect for PR checks)
aiguard scan --diff main

# Issues in staged files only (same as pre-commit)
aiguard scan --staged

This means you can adopt AIGuard on any codebase without drowning in existing issues.

GitHub Actions

Add to your workflow:

# .github/workflows/aiguard.yml
name: AI Code Quality
on: [push, pull_request]

jobs:
  aiguard:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: GurjotSinghAulakh/aiguard@v1
        with:
          path: './src'
          fail-under: '70'

Findings appear as inline annotations on your PRs via GitHub Code Scanning (SARIF).

Output Formats

FormatUse CaseFlag
terminalLocal development (default)--format terminal
jsonCI pipelines, custom tooling--format json
sarifGitHub Code Scanning--format sarif

Writing Custom Rules (Plugins)

Create a detector in your own package:

from aiguard.detectors import register
from aiguard.detectors.base import BaseDetector
from aiguard.models import Finding, Language, Severity

@register
class MyCustomDetector(BaseDetector):
    rule_id = "CUSTOM001"
    rule_name = "my-custom-rule"
    description = "Detects my specific pattern"
    severity = Severity.WARNING
    languages = (Language.PYTHON,)

    def detect(self, source, ast_tree, file_path):
        findings = []
        # Your detection logic using ast_tree
        return findings

Register via entry points in your pyproject.toml:

[project.entry-points."aiguard.detectors"]
my_rule = "my_package:MyCustomDetector"

Why AIGuard?

Traditional linters (pylint, ruff, eslint) catch syntax-level issues. AI-generated code passes all of those. The bugs are at a higher level:

  • The error handling exists but is shallow (catches everything, does nothing)
  • The code works but is copy-pasted 5 times with minor changes
  • The function has parameters but never validates them
  • The import looks right but the package doesn't exist
  • The code looks complete but it's just pass with a docstring

AIGuard catches these patterns because they are specific to how AI generates code.

Contributing

We welcome contributions! See CONTRIBUTING.md for details.

Good first issues are labeled good first issue.

License

MIT License. See LICENSE for details.

Downloads & popularity

Awaiting observations

No metric observations yet

Download counts and popularity will appear here as the collector receives them.

Versions 1

Collected releases
VersionPublishedDirect dependenciesOpen version
0.4.010 Apr 20269

Package advisories

0
No matching advisories collected

This describes our collected data; it is not a security assessment.

Repository

PENDING
gurjotsinghaulakh/aiguard

Shared repository data · GitHub

License detected in repository
Not collected

Metadata history

Meaningful changes
Current collected state Current

Observed since 21 Oct, 10:51 UTC

No superseded metadata states collected. Unchanged observations do not create new revisions.

Record identity

package:722bb967f8a970f87611bc06063b375f6b369b5f8d81d767e98e3b1211d689c8