googlarz/vibe-coder-kit/vibe-check
Claude Code and agent skill by googlarz/vibe-coder-kit
- community
- ext:[{"type":"hook","description":"Pre/post lifecycle hooks"}]
Checking that the SKILL.md file is still in the repository.
Pre-push security scan with plain-English explanations. Runs vibe-safe if installed, explains every finding, gives a clear verdict.
Install
npx vskill@latest install googlarz/vibe-coder-kit/vibe-checkSemi-extensibleMentions customization, but needs skill-specific knowledge. Read the extensible skills standard
SKILL.md
vibe-check
Pre-push security and sanity check for solo vibecoders. Translates technical security findings into plain English so you know exactly what's at risk and what to do.
Overview
Before you push code to GitHub, run vibe-check. It scans for the problems that can get you hacked, expose your users' data, or rack up surprise cloud bills — and it tells you what each problem means in plain language.
vibe-check wraps vibe-safe if it's installed. If not, it runs its own basic scan. Either way, every finding comes with:
- What the problem is
- What happens to you or your users if someone exploits it
- One concrete step to fix it
Process
This skill runs a silent automated scan, then translates every finding into plain English with a verdict — no technical knowledge needed to read the output.
Step 1 — Detect what's available
Check for vibe-safe in this order:
~/.claude/skills/vibe-safe/hooks/pre-commit(standard install path)vibe-safecommand on PATH./vibe-safe.shin the project root
If none found, proceed to inline checks. To install vibe-safe:
Step 2 — Run the scan
If vibe-safe is available: Run bash ~/.claude/skills/vibe-safe/hooks/pre-commit (or wherever it was found). Capture both the output and the exit code.
Parse the output:
vibe-safe: all N checks passed -- clear(exit 0) → show as✅ vibe-safe: all N checks passed — nothing to fix- Lines matching
vibe-safe: [description](exit 0) → warnings; translate each through the guide below - Any output + exit code 1 → STOP findings; translate each and mark the run as 🚨
For each vibe-safe: [description] line, strip the vibe-safe: prefix and match against the translation guide. The description IS the issue — your job is to add the RISK and FIX for it.
If vibe-safe is not available: Run the inline checks (see section below), then translate each finding.
Step 3 — .gitignore check (always)
On every scan, not just first-time:
- Does
.gitignoreexist? - Are
.env,node_modules,.DS_Store,*.log,*.sqlite,*.dblisted in it?
A .gitignore entry can be accidentally removed in any commit. Check every time.
If no .vibe/.check-history file exists, this is a first-time scan — note it in the report.
Step 4 — Report findings
For each finding, output exactly:
Then give the verdict (see below).
Step 5 — Record history
After every scan (clean or not), create or update .vibe/.check-history with today's result. This marks the project as previously scanned and tracks trends over time.
Create the directory if it doesn't exist — writing to .vibe/ will fail silently if the directory isn't there.
Append one line in this format:
Example: [2026-05-28] — ⚠️ Issues — missing .gitignore entry for .env, unpinned GitHub Action
Universal Scan Rules
Whether using vibe-safe or running greps manually — cap at 10 examples per finding, and apply the false positive rule: check each result in context before flagging. If any pattern returns more than 10 results: check the first 3 in context. If the first 3 are false positives, note "X pattern returned Y matches — none of the first 3 are real findings" and move on. Don't list all 50 matches — that's noise.
False positives are common. A password = getenv('PASSWORD') is safe — it's reading from an env variable, not hardcoding one. A password_reset_token variable name is not a hardcoded credential.
Translation Guide
This section is for Claude, not for you. If you're reading this as a user, skip to the Verdict section above — the scan runs silently and I'll translate every finding for you. You never need to read this table.
Claude: reference table — look up by keyword. Match the finding description from vibe-safe output and apply the plain-English explanation.
For anything not listed, apply the same format: explain what it is, what the real-world harm is, and what to do.
| Finding | Plain-English translation | |
|---|---|---|
STOP -- credential pattern found | A real password or API key is committed to the repo. Anyone who has ever cloned or forked this repo already has it — even if you delete it now, it's in git history. Rotate the credential immediately, then remove it from the code. | |
private key / cert file staged | A private key or certificate file is about to be committed. This is a credential — once in git history, it's compromised. Remove it immediately and rotate the key. | |
gitleaks | An entropy-based scanner found something that looks like a real credential. Even if it looks like a test value, rotate it — entropy scanners have very low false positive rates. | |
Missing .gitignore entry for .env | Your .env file — which contains your passwords and API keys — could get uploaded to GitHub. Anyone could read it. Add .env to your .gitignore right now. | |
Missing .gitignore | You have no .gitignore, which means Git will track everything including sensitive files and generated folders. Create one immediately. | |
node_modules not in .gitignore | Your node_modules folder (hundreds of megabytes of installed packages) could be uploaded to GitHub. It slows everyone down and wastes space. Add it to .gitignore. | |
.gitignore entries removed | Files that were previously excluded from git are now being tracked. If any were security-sensitive (env files, generated credentials), they may now be committed. Restore the entries. | |
STOP -- SQL string concatenation | User input is being pasted directly into a database query. An attacker can type special characters to read or delete your entire database. Use parameterized queries. | |
STOP -- shell: true / shell=True | A subprocess is being run with shell mode enabled, and user input may flow into it. An attacker can run any command on your server. Disable shell mode and validate input. | |
Command injection | Your code passes user input directly to a shell command. An attacker can run any command on your server. Never pass user input to shell commands; use a library that handles it safely. | |
eval( added | Your code runs a string as code. If that string comes from user input or an external source, an attacker can execute arbitrary commands. Replace with a safe alternative. | |
STOP -- Math.random() in auth | Your login or token generation uses a predictable random number generator. An attacker can predict the values. Use crypto.randomBytes() or equivalent. | |
STOP -- SSL verification disabled | HTTPS certificate checking was turned off. Your app will accept fake or expired certificates, making it trivially easy for an attacker to intercept traffic. Remove this. | |
Missing HTTPS / HTTP endpoint | Passwords and data sent over HTTP are visible to anyone on the same network (coffee shop, hotel Wi-Fi). Switch to HTTPS. | |
CORS wildcard | Your API accepts requests from any website. A malicious site can make requests on behalf of your users without their knowledge. Restrict to specific domains. | |
dangerouslySetInnerHTML / innerHTML = | Raw HTML is being written directly to the page. If any of that HTML comes from user input or an API, an attacker can inject scripts that run in your users' browsers. Use safe alternatives. | |
Directory traversal | A user could request files outside your intended folder — including system files or other users' data — by using ../ in a URL. Validate and restrict file paths. | |
possible sensitive data in log output | Passwords, tokens, or user data are being printed to logs. Anyone who can read your server logs — or a monitoring service — can see this. Remove the log statement. | |
Exposed stack trace / verbose error | When something breaks, your app shows the full technical error to the user. This tells attackers which libraries you use, where files live, and what's misconfigured. Show a friendly error to users and log the details privately. | |
jwt.sign...without expiresIn | Your login tokens never expire. If a token is stolen, the attacker has access forever. Add expiresIn when signing tokens. | |
jwt.verify...without algorithms whitelist | Your token verification accepts any algorithm, including none (no signature). An attacker can forge tokens. Specify algorithms: ['HS256'] or whichever you use. | |
auth token stored in localStorage | Login tokens stored in localStorage can be stolen by any JavaScript running on your page (including injected scripts). Use httpOnly cookies instead. | |
new route...has no rate limiting | A new API endpoint has no limit on how many requests a user can send. An attacker can hammer it indefinitely — to scrape data, brute-force passwords, or run up your bill. Add rate limiting. | |
admin/internal route...has no visible auth | An admin endpoint has no visible authentication check. Anyone who knows the URL can access it. Verify auth is enforced — either in this file or upstream middleware. | |
webhook route...no visible signature verification | Your webhook accepts any payload without checking it's really from the service that's supposed to send it. An attacker can send fake events. Verify the signature from the header. | |
helmet removed | A security library that sets protective HTTP headers was removed. Your app is now missing defenses against common browser-based attacks. Restore it or replace with equivalent headers. | |
GitHub Action not pinned to SHA | Your automated CI/CD runs code fetched from the internet at runtime. If that dependency gets hacked, your automation runs the malicious version. Pin to a specific commit hash. | |
npm audit / pip-audit / semgrep | A known security vulnerability was found in an installed package. The package has a published CVE — update or replace it. | |
STOP -- committing directly to main / master | You're working on the main branch. If something goes wrong, there's no safety net. Create a separate branch: git checkout -b feature/your-change. | |
SCOPE WARNING -- N files staged | More files changed than the developer contract allows. Review the list carefully — Claude may have modified things outside the intended scope. | |
possible missing await on async call | A database or API call result is probably a Promise object, not the actual data. The code looks like it works but is silently returning wrong values. Add await. | |
test added without assertions | A test was added but it doesn't actually check anything — it will always pass regardless of what the code does. Add at least one assertion. | |
coverage threshold lowered | The test coverage minimum was reduced — likely so CI would pass. This means less of your code is being tested. Restore the threshold and fix the underlying tests. | |
TODO / FIXME in implementation | Placeholder code was shipped instead of a real implementation. This usually means the feature is incomplete or a known problem was intentionally left unfixed. Address it before pushing. | |
commented-out code | Working code was commented out instead of deleted. This often means Claude wasn't sure whether to remove it. Review and decide: delete it or restore it. | |
rm -rf in committed script | A destructive shell command is in a script that will be committed. If this runs in production with the wrong path, it can delete critical files. Add explicit path validation. |
Inline Checks (when vibe-safe is not available)
This is the start of the file. Read the full SKILL.md on GitHub.
Security
- Security scanPassed, 100 of 100Pattern checks on the skill's files.
- Model reviewNot runA model review is scheduled for the next rescan.
Quality evaluation
- Task evaluationNot runNo evaluation yet. Run one in Skill Studio.
Source
- SKILL.md in the repositoryCheckingskills/vibe-check/SKILL.md
Popularity
- Repository stars
- 1
- 7-day trend score
- 3
Stars and forks are for the whole GitHub repository, not this skill alone. Not refreshed yet.
Extension points
hookPre/post lifecycle hooks
Works with
Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.
- Claude Code
- Cursor
- GitHub Copilot
- Windsurf
- Codex
- Gemini CLI
- Cline
- Amp
- Roo Code
- Goose
- Continue
- Kilo Code
- Junie
- Trae
- OpenHands
- Qwen Code
- AI Agent
- Tabnine Chat
- Sourcegraph Cody
- Amazon Q
- Firebase Genkit
- Sweep
- Devin
- Phind
- Mentat
- Claude Desktop
- Aider
- GPT Pilot
- Plandex
- bolt.new
- v0
- Replit Agent
- Anse
- TypingMind
- BetterChatGPT
- LibreChat
- Warp AI
- Pieces
- Fig AI
Embed badge
[](https://verified-skill.com/skills/googlarz/vibe-coder-kit/vibe-check)