| name | code-quality |
| description | Code quality and verification: codebase metrics, post-implementation cleanup, and pre-commit verification pipeline. |
| version | 1.0.0 |
| author | Hermes Agent Curator |
| license | MIT |
| platforms | ["linux","macos","windows"] |
| metadata | {"hermes":{"tags":["code-quality","code-review","verification","metrics","static-analysis","linting","security","cleanup"],"related_skills":["test-driven-development","development-workflow","github-code-review"]}} |
Code Quality & Verification
Three complementary tools for ensuring code quality at different stages of development:
| Mode | When | Tool | What it does |
|---|
| Codebase Metrics | Explore/adopt a repo | pygount | Analyze LOC, language breakdown, code-vs-comment ratios |
| Simplify Code | After implementing changes | 3 parallel subagents | Clean up recent changes for reuse, quality, efficiency |
| Pre-Commit Verification | Before git commit | Automated pipeline | Security scan, quality gates, independent reviewer, auto-fix |
Section 1: Codebase Metrics (pygount)
Analyze repositories for lines of code, language breakdown, file counts, and code-vs-comment ratios.
When to Use
- User asks for LOC (lines of code) count
- User wants a language breakdown of a repo
- User asks about codebase size or composition
- General "how big is this repo" questions
Prerequisites
pip install --break-system-packages pygount 2>/dev/null || pip install pygount
Basic Summary
cd /path/to/repo
pygount --format=summary \
--folders-to-skip=".git,node_modules,venv,.venv,__pycache__,.cache,dist,build,.next,.tox,.eggs,*.egg-info" \
.
IMPORTANT: Always use --folders-to-skip to exclude dependency/build directories, otherwise pygount will crawl them and hang.
Common Folder Exclusions
--folders-to-skip=".git,venv,.venv,__pycache__,.cache,dist,build,.tox,.eggs,.mypy_cache"
--folders-to-skip=".git,node_modules,dist,build,.next,.cache,.turbo,coverage"
Filter by Language
pygount --suffix=py --format=summary .
pygount --suffix=py,yaml,yml --format=summary .
Output Formats
pygount --format=summary .
pygount --format=json .
Interpreting Results
The summary table columns: Language, Files, Code (executable lines), Comment (documentation lines), % (percentage of total).
Special pseudo-languages: __empty__ (empty files), __binary__ (binary), __generated__ (auto-generated), __duplicate__ (identical content), __unknown__ (unrecognized types).
Pitfalls
- Always exclude .git, node_modules, venv — without
--folders-to-skip, pygount crawls everything and may hang
- Markdown shows 0 code lines — pygount classifies all Markdown as comments, not code (expected)
- JSON files show low code counts — use
wc -l for accurate JSON line counts
- Large monorepos — use
--suffix to target specific languages rather than scanning everything
Section 2: Simplify Code — Parallel Review & Cleanup
Review recent code changes with three focused reviewers running in parallel, aggregate findings, and apply fixes.
Core principle: Three narrow reviewers beat one broad reviewer. Each deeply searches the codebase for a single class of problem.
When to Use
- "simplify" / "simplify my changes" / "review my code"
- "/simplify" (Claude Code habit)
Optional modifiers: Focus (reuse/quality/efficiency), Dry run (report only), Scope (last commit / staged / specific file)
Phase 1 — Identify Changes
git diff
git diff HEAD
git diff --staged
git diff HEAD~1
git diff main...HEAD
git diff -- src/foo.py
Phase 2 — Launch Three Reviewers
Use delegate_task batch mode — pass all three tasks in one tasks array:
Reviewer 1 — Code Reuse: Search for code that duplicates existing functionality. Check utility modules, shared helpers, adjacent files for existing functions to reuse.
Reviewer 2 — Code Quality: Look for redundant state, parameter sprawl, copy-paste-with-variation, leaky abstractions, stringly-typed code.
Reviewer 3 — Efficiency: Look for unnecessary work, missed concurrency, hot-path bloat, TOCTOU anti-patterns, memory issues, overly broad reads.
Each gets the complete diff plus repo path and toolsets [terminal, file, search].
Phase 3 — Aggregate and Apply
- Merge findings, dedup overlaps
- Discard false positives
- Resolve conflicts: correctness > user's focus > readability > micro-perf
- Apply fixes with
patch/write_file (or dry run)
- Verify: run targeted tests + linter
- Summarize what changed and what was skipped
Pitfalls
- Don't fan out wider than ~3 reviewers
- Give the WHOLE diff to each reviewer
- Require
file:line evidence from reviewers
- Keep edits scoped to what the diff touched
- Check AGENTS.md / CLAUDE.md for project conventions
Section 3: Pre-Commit Verification
Automated verification pipeline before code lands. Static scans, baseline-aware quality gates, an independent reviewer subagent, and an auto-fix loop.
Core principle: No agent should verify its own work. Fresh context finds what you miss.
When to Use
- After implementing a feature or bug fix, before
git commit or git push
- When user says "commit", "push", "ship", "done", "verify", or "review before merge"
- After completing a task with 2+ file edits in a git repo
Skip for: documentation-only changes, pure config tweaks, or explicit "skip verification".
Step 1 — Get the Diff
git diff --cached
If empty, try git diff then git diff HEAD~1 HEAD. If diff exceeds 15K chars, split by file.
Step 2 — Static Security Scan
Scan added lines for hardcoded secrets, shell injection, dangerous eval/exec, unsafe deserialization, SQL injection:
git diff --cached | grep "^+" | grep -iE "(api_key|secret|password|token|passwd)\s*=\s*['\"][^'\"]{6,}['\"]"
git diff --cached | grep "^+" | grep -E "os\.system\(|subprocess.*shell=True"
git diff --cached | grep "^+" | grep -E "\beval\(|\bexec\("
git diff --cached | grep "^+" | grep -E "pickle\.loads?\("
git diff --cached | grep "^+" | grep -E "execute\(f\"|\.format\(.*SELECT|\.format\(.*INSERT"
Step 3 — Baseline Tests and Linting
Detect the project language and run appropriate tools. Capture baseline BEFORE changes (stash changes, run, pop). Only NEW failures block commit.
Test frameworks (auto-detect):
python -m pytest --tb=no -q 2>&1 | tail -5
npm test -- --passWithNoTests 2>&1 | tail -5
cargo test 2>&1 | tail -5
go test ./... 2>&1 | tail -5
Linting (run only if installed):
which ruff && ruff check . 2>&1 | tail -10
which npx && npx eslint . 2>&1 | tail -10
cargo clippy -- -D warnings 2>&1 | tail -10
Step 4 — Self-Review Checklist
Step 5 — Independent Reviewer Subagent
Call delegate_task with the diff and static scan results. The reviewer gets ONLY the diff. Fail-closed: returns JSON verdict with passed boolean, security_concerns, logic_errors, suggestions.
delegate_task(
goal="""Review this diff. Return ONLY JSON:
{"passed": true/false, "security_concerns": [], "logic_errors": [], "suggestions": [], "summary": "..."}
FAIL-CLOSED: security_concerns non-empty → passed=false; logic_errors non-empty → passed=false.
Cannot parse diff → passed=false.""",
context="Independent code review. Return only JSON verdict.",
toolsets=["terminal"]
)
Step 6 — Evaluate Results
All passed: Proceed to commit.
Any failures: Report what failed, then proceed to auto-fix.
Step 7 — Auto-Fix Loop
Maximum 2 fix-and-reverify cycles. Spawn a fix agent that fixes ONLY the reported issues:
delegate_task(
goal="Fix ONLY the reported issues. Do not refactor, rename, or add features.",
context="Fix only reported issues.",
toolsets=["terminal", "file"]
)
After fix agent completes, re-run Steps 1-6. Passed → commit. Failed after 2 attempts → escalate to user.
Step 8 — Commit
git add -A && git commit -m "[verified] <description>"
Common Pattern Reference
cursor.execute(f"SELECT * FROM users WHERE id = {user_id}")
cursor.execute("SELECT * FROM users WHERE id = ?", (user_id,))
os.system(f"ls {user_input}")
subprocess.run(["ls", user_input], check=True)
element.innerHTML = userInput;
element.textContent = userInput;
Pitfalls
- Empty diff — check
git status, tell user nothing to verify
- Large diff (>15K chars) — split by file, review each separately
- delegate_task returns non-JSON — retry once, then treat as FAIL
- No test framework — skip regression check, reviewer verdict still runs
- Lint tools not installed — skip silently
- Auto-fix introduces new issues — counts as new failure, cycle continues
When to Use Each Section
| Situation | Use |
|---|
| "How big is this repo?" / language breakdown | Codebase Metrics (pygount) |
| "Simplify my changes" / "Review my recent code" | Simplify Code (3-agent cleanup) |
| Before committing / "Verify before push" | Pre-Commit Verification pipeline |
| Full quality workflow | Run Simplify Code first, then Pre-Commit Verification |