-
Notifications
You must be signed in to change notification settings - Fork 0
Home
Welcome to the VibeGuard wiki.
VibeGuard is a security scanner for AI-generated code. It catches what "looks fine, ships fine" code tends to hide: missing input checks, hard-coded credentials, skipped login checks, silently swallowed exceptions, and the stub/placeholder patterns that AI assistants leave behind.
Current release: tool 0.3.3 / engine 0.3.1 (see Versioning).
| Surface | Use it | Default mode |
|---|---|---|
| VS Code Marketplace | While you write — inline diagnostics on save | fast |
| Open VSX | Same extension for VSCodium / Cursor / Gitpod / code-server | fast |
| Chrome Web Store | While you read — scan snippets on any page, or a GitHub PR diff | standard |
| GitHub Action | Before you merge — block risky PRs in CI | standard |
All four run the same analysis engine. Given the same engine version, the same input, and the same mode, the verdict is identical everywhere.
Two things still make one surface report differently from another, and neither is a bug:
-
Mode defaults differ. VS Code's on-save scan is
fast; every other surface isstandard, which runs rulesfastskips. A file can be clean on save and flag in CI. Setvibeguard.modetostandard, or useVibeGuard: Scan File(alwaysstandard). - What reaches the engine differs. VS Code passes a file, the CLI walks a directory, the Chrome extension joins the code blocks it extracted from a page. Same engine, different text in.
# .github/workflows/vibeguard.yml
- uses: actions/checkout@v4
with:
fetch-depth: 0 # required for diff scan
- uses: YUTAKONDO1205/VibeGuard@v0
with:
path: .
mode: standard
format: sarif
out: vibeguard.sarif
fail-on: high
- uses: github/codeql-action/upload-sarif@v3
if: always()
with:
sarif_file: vibeguard.sarif
category: vibeguardLocally (the CLI is not published to npm — clone the repo):
npm install && npm run build
node apps/cli/dist/index.js ./test_problem/test_problem.pytest_problem/ is one Python file that intentionally trips most rule families at once — the fastest way to see VibeGuard react.
71 single-file rules across 10 languages (including a C/C++/Arduino embedded layer), plus 4 cross-file rules behind --include-design-smells.
| Prefix | Coverage |
|---|---|
VG-INJ |
Injection — eval / SQL concatenation / innerHTML / pickle |
VG-AUTH |
Auth / TLS / placeholder auth — DEBUG bypass, verify=False, dummy_token
|
VG-SEC |
Hard-coded secrets — AWS keys, PEM, GitHub PAT, high-entropy strings |
VG-CRYPTO |
MD5/SHA1, Math.random, http://
|
VG-QUAL-001..004 |
General quality — CORS, swallowed exceptions, open redirect |
VG-QUAL-005..010 |
AI-trace heuristics — stubs, placeholder emails, mock data, debug=true, "for now" comments |
VG-FW |
Framework misconfiguration — Django DEBUG=True, app.run(debug=True)
|
VG-MEM |
C/C++ memory — gets, strcpy, memcpy sized from strlen
|
VG-EMB |
AI-generated embedded — hard-coded Wi-Fi/BLE creds, setInsecure(), auth-bypass flags |
VG-RTOS |
Interrupt / RTOS — forbidden calls in an ISR, shared ISR variable missing volatile
|
VG-SMELL / VG-AISC
|
Design smells and hallucinated APIs (cross-file, opt-in) |
The embedded layer is regex-and-lexical only — no tree-sitter — so it ships to all four channels. VG-EMB is the intended focus: valid C that is a security problem because of how AI writes firmware (a hard-coded SSID is legal C, so conventional embedded analyzers stay silent).
The README documents what is deliberately not detected and why — worth reading before filing a "why didn't it catch X" issue.
Every rule declares a default confidence, then the analyzer applies a context-window correction: a match inside a comment, docstring, or on a test/fixture path is down-ranked (never up-ranked; severity is untouched).
The correction is severity-gated — critical/high keep their declared confidence even in those contexts, and medium never drops below medium. Down-ranking is triage-noise reduction, not a security verdict, and anyone who can write the file can also choose where a pattern sits. See SEVERITY_CONFIDENCE_FLOOR in packages/rules/src/confidence.ts, and run node scripts/e6-confidence-eval.mjs for a side-by-side demonstration of both arms.
VibeGuard tracks two independent numbers. Reference the right one when reporting issues.
| Version | Bumps when | Current |
|---|---|---|
Tool version — package.json, CLI --version, SARIF tool.version
|
Any release: packaging, UX, docs, or detection | 0.3.3 |
Engine version — ENGINE_VERSION, every result as engineVersions.core
|
Only when detection behavior changes | 0.3.1 |
A third number, engineVersions['analysis-graph'] (0.3.0-alpha.1), appears only on scans that ran --include-design-smells.
Rule of thumb: compare two runs by engine version; report which build you installed by tool version. 0.3.1 is the first engine bump that is not purely additive — it corrects existing rules in both directions after a deep audit, so a file's verdict may differ from 0.3.0. Details in CHANGELOG.md.
VibeGuard never sends your code anywhere — all analysis is local. One caveat worth knowing: the Chrome extension's History stores the first 200 characters of each scanned snippet verbatim in chrome.storage.local, so a credential in those first 200 characters is stored as written. Clear wipes it. Full policy: PRIVACY.md.
- README — full CLI options, Action inputs/outputs, extension features
- docs/DESIGN.ja.md — design document (Japanese)
- docs/EVALUATION.md — evaluation methodology
- SECURITY.md — reporting a vulnerability
- Issues · Releases
MIT © 2026 KONDO YUTA (近藤 悠太)