Cross-repo static analysis + actionable GitHub issue generator for AI agents
vibeCheck is a GitHub Action that runs static analysis on any repository and turns findings into actionable GitHub Issues designed to be resolved by AI coding agents.
| Example Issues |
|---|
Add vibeCheck to your repo - Enter your repo name and create a PR with the workflow file.
Create .github/workflows/vibecheck.yml in your repo:
name: vibeCheck
on:
workflow_dispatch: # Manual trigger via Actions tab
permissions:
contents: read
issues: write
security-events: write
jobs:
analyze:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- uses: WolffM/vibecheck@main
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
# severity_threshold: "medium" # default, adjust as needed
# confidence_threshold: "low" # defaultThat's it! To run vibeCheck:
- Go to your repo's Actions tab
- Click vibeCheck in the sidebar
- Click Run workflow
No secrets to configure—uses your repo's built-in GITHUB_TOKEN.
Customize the action in your workflow file:
- uses: WolffM/vibecheck@main
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
severity_threshold: "medium" # info | low | medium | high | critical
confidence_threshold: "medium" # low | medium | high
skip_issues: "false" # true for dry run
vibecheck_github_package_token: ${{ secrets.GITHUB_TOKEN }} # Optional: for private packages| Input | Description | Default |
|---|---|---|
github_token |
GitHub token for issue management | Required |
severity_threshold |
Min severity for issues | medium |
confidence_threshold |
Min confidence for issues | low |
skip_issues |
Skip issue creation (dry run) | false |
create_config_pr |
Create PR with generated configs | false |
vibecheck_github_package_token |
Token for private GitHub packages (e.g., @org/pkg) |
"" |
If your repository uses private packages from GitHub Package Registry (e.g., @yourorg/private-package), vibeCheck needs authentication to install them. Add the packages: read permission and pass the token:
permissions:
contents: read
issues: write
security-events: write
packages: read # Required for private packages
jobs:
analyze:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: WolffM/vibecheck@main
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
vibecheck_github_package_token: ${{ secrets.GITHUB_TOKEN }}Note: vibeCheck will continue running even if dependency installation fails. Tools that require dependencies (ESLint, TypeScript) will be gracefully skipped and noted in the results.
On first run, vibeCheck generates config files (.trunk/, etc.) that are lost after the workflow ends.
To persist these and speed up future runs, enable create_config_pr:
permissions:
contents: write # Required for pushing branch
pull-requests: write # Required for creating PR
issues: write
security-events: write
jobs:
analyze:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: WolffM/vibecheck@main
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
create_config_pr: "true" # Creates PR with .trunk/ etc.This creates a one-time PR adding the config files to your repo.
For fine-tuned control, create vibecheck.yml at your repository root:
version: 1
issues:
severity_threshold: "medium" # Only medium+ severity
confidence_threshold: "high" # Only high confidence
max_new_per_run: 10 # Limit new issues per run
close_resolved: true # Auto-close fixed issues
tools:
jscpd:
enabled: false # Disable duplicate detection
semgrep:
enabled: true # Always run security scanning
knip:
enabled: weekly # Run unused code detection weekly┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ Repo │───▶│ Trunk + │───▶│ Normalize │───▶│ Create │
│ Detection │ │ Tools │ │ Findings │ │ Issues │
└─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘
│ │
▼ ▼
┌─────────────┐ ┌─────────────┐
│ SARIF │ │ LLM JSON │
│ (Code Scan)│ │ (Artifacts)│
└─────────────┘ └─────────────┘
- Creation: Issues are created for findings meeting thresholds
- Deduplication: Fingerprints prevent duplicates across runs
- Updates: Existing issues get refreshed with latest evidence
- Closure: (Optional) Issues auto-close after N runs without the finding
Findings are fingerprinted using:
- Tool name
- Rule ID
- File path
- Line number (bucketed to ±20 lines)
- Normalized message
This allows vibeCheck to track issues across minor code changes.
| Tool | Purpose |
|---|---|
| Trunk | Meta-linter (ESLint, etc.) |
| TypeScript (tsc) | Type checking |
| jscpd | Duplicate code detection |
| dependency-cruiser | Circular dependencies |
| knip | Unused exports/files |
| Semgrep | Security scanning |
| Tool | Purpose |
|---|---|
| Ruff | Fast linting |
| Mypy | Type checking |
| Bandit | Security scanning |
| Tool | Purpose |
|---|---|
| PMD | Code analysis |
| SpotBugs | Bytecode bug detection |
| Tool | Purpose |
|---|---|
| Clippy | Linting (750+ lints) |
| cargo-audit | Dependency vulnerabilities |
| cargo-deny | Licenses, bans, advisories |
| Level | Description |
|---|---|
critical |
Security vulnerabilities, data loss risks |
high |
Type errors, circular dependencies, forbidden imports |
medium |
Code smells, unused code, complexity |
low |
Style issues, minor suggestions |
info |
Informational, purely stylistic preferences |
| Level | Description |
|---|---|
high |
Definite issues (type errors, exact duplicates) |
medium |
Likely issues, may need context |
low |
Suggestions, style preferences |
The default is severity >= medium and confidence >= low to balance signal-to-noise. Use low or info severity to see more findings, or high to reduce noise.
Each issue includes:
- Summary with tool, rule, severity, and confidence
- File location with clickable GitHub links
- Code snippets as evidence
- Suggested fix with acceptance criteria
- Hidden fingerprint for deduplication
| File | Description |
|---|---|
results.sarif |
SARIF 2.1.0 for GitHub Code Scanning |
results.llm.json |
Structured findings for AI agents |
Ensure your workflow has security-events: write permission:
permissions:
contents: read
security-events: write
issues: writeReduce noise by:
- Increasing
severity_thresholdtohigh - Reducing
max_new_per_run - Disabling noisy tools
Options:
- Fix the issue (recommended)
- Add inline suppression comment (tool-specific)
- Configure tool to ignore the rule
- Add path to tool's ignore list
vibeCheck detects monorepos via:
pnpm-workspace.yamlpackage.jsonworkspacesturbo.json/nx.json/lerna.json
Analysis runs at the repo root and covers all packages.
vibeCheck respects GitHub API limits:
- Issues are capped at
max_new_per_runper execution - API calls include small delays
- Use
GITHUB_TOKEN(not PAT) for repo-scoped limits
git clone https://github.com/WolffM/vibecheck.git
cd vibecheck
pnpm install
pnpm testMIT