Agent skill
universal-quality-gate
Multi-language code quality gate with auto-detection and linters.
Install this agent skill to your Project
npx add-skill https://github.com/notque/claude-code-toolkit/tree/main/skills/universal-quality-gate
SKILL.md
Universal Quality Gate Skill
Language-agnostic code quality checking system. Automatically detects project languages via marker files and runs appropriate linters, formatters, and static analysis tools for each detected language.
Overview
This skill implements a Detect, Check, Report pattern for multi-language code quality enforcement:
- Auto-detect languages by scanning for marker files (go.mod, package.json, pyproject.toml, Cargo.toml, etc.)
- Run language-specific lint, format, type-check, and security tools
- Report complete results with graceful degradation for unavailable tools
Key Principles:
- Read repository CLAUDE.md files first — Project instructions override default behaviors
- Only run configured tools — Do not add new tools, languages, or checks unless explicitly requested. Keep quality checks focused on what is already defined in language_registry.json.
- Show complete output — Display full linter output, never summarize as "no issues"
- Graceful degradation — Skip unavailable tools without failing the entire gate
- Fail only on required tools — Only return non-zero exit if required tool failures occur
Supported Languages
| Language | Marker Files | Tools |
|---|---|---|
| Python | pyproject.toml, requirements.txt | ruff, mypy, bandit |
| Go | go.mod | gofmt, golangci-lint, go vet |
| JavaScript | package.json | eslint, biome |
| TypeScript | tsconfig.json | tsc, eslint, biome |
| Rust | Cargo.toml | clippy, cargo fmt |
| Ruby | Gemfile | rubocop |
| Java | pom.xml, build.gradle | PMD |
| Shell | *.sh, *.bash | shellcheck |
| YAML | *.yml, *.yaml | yamllint |
| Markdown | *.md | markdownlint |
Instructions
Step 1: Execute Quality Gate
Run the quality gate check against the current project:
python3 ~/.claude/skills/universal-quality-gate/scripts/run_quality_gate.py
This command automatically:
- Detects all languages in the project by scanning for marker files
- Runs language-specific tools for each detected language
- Reports full output with file paths and line numbers
- Returns zero exit code if all required tools pass
Step 2: Choose Your Flow
For pre-commit validation (fastest):
python3 ~/.claude/skills/universal-quality-gate/scripts/run_quality_gate.py --staged
Checks only git-staged files, enabling rapid feedback on recent changes.
For auto-fixing (when issues are found):
python3 ~/.claude/skills/universal-quality-gate/scripts/run_quality_gate.py --fix
Auto-corrects fixable issues (formatting, imports, etc.), then re-run Step 1 to verify.
For focused checking (single language):
python3 ~/.claude/skills/universal-quality-gate/scripts/run_quality_gate.py --lang python
Narrows scope when debugging language-specific issues.
For verbose details:
python3 ~/.claude/skills/universal-quality-gate/scripts/run_quality_gate.py -v
Shows expanded diagnostic output for troubleshooting.
Step 3: Interpret Results
PASSED output:
============================================================
Quality Gate: PASSED
============================================================
Languages: python, javascript
Files: 15
Tool Results:
[+] python/lint: passed
[+] python/format: passed
[-] python/typecheck: skipped (Optional tool not installed)
[+] javascript/lint: passed
[+] javascript/format: passed
Quality gate passed: 4/5 tools OK (1 skipped)
Gate passes when all required tools succeed. Skipped optional tools do not block.
FAILED output:
============================================================
Quality Gate: FAILED
============================================================
Languages: python, go
Files: 8
Tool Results:
[X] python/lint: FAILED
hooks/example.py:42:1: F841 local variable 'x' is assigned but never used
hooks/example.py:56:1: F401 'os' imported but unused
[+] python/format: passed
[+] go/format: passed
[X] go/lint: FAILED
main.go:15:2: S1000: should use for range instead of for select
Pattern Matches:
[WARNING] hooks/example.py:78: Silent exception handler - add explanatory comment
Quality gate failed: 2 tool(s) reported issues, 1 error pattern(s)
Review marked failures [X] first. Pattern matches [WARNING] are informational.
Step 4: Resolve Issues
For auto-fixable issues:
- Run
python3 ~/.claude/skills/universal-quality-gate/scripts/run_quality_gate.py --fix - Review changes with
git diffto verify correctness - Re-run Step 1 to confirm all checks pass
- Commit with message documenting the fixes
For manual fixes:
- Review each issue line-by-line in the output
- Edit files to correct the reported problems
- Re-run Step 1 to verify fixes
- Commit changes
Step 5: Commit
Once quality gate passes with zero required-tool failures:
- Run project tests to catch logic regressions
- Commit with descriptive message
- Proceed to PR/merge workflow
Common Workflows
Pre-commit validation (fastest path):
python3 ~/.claude/skills/universal-quality-gate/scripts/run_quality_gate.py --staged
# If fails → fix issues → re-run
# If passes → git commit
Full repo audit:
python3 ~/.claude/skills/universal-quality-gate/scripts/run_quality_gate.py
# Review all findings by language
# Fix by category: required failures → warnings → patterns
# Re-run after each batch of fixes
Language-specific validation:
python3 ~/.claude/skills/universal-quality-gate/scripts/run_quality_gate.py --lang python
# Use when debugging a specific language's toolchain
# Narrows output and speeds iteration
Extending with New Languages
To add language support without editing the script, modify the language registry:
// hooks/lib/language_registry.json
{
"new_language": {
"extensions": [".ext"],
"markers": ["config.file"],
"tools": {
"lint": {
"cmd": "linter {files}",
"fix_cmd": "linter --fix {files}",
"description": "Language linter",
"required": true
}
}
}
}
The quality gate script automatically detects and uses new registry entries on next run.
Error Handling
Error: "No files to check"
Cause: No changed files detected or no language markers found in project Solution:
- Verify you are in the correct project directory
- Check that marker files exist (go.mod, package.json, pyproject.toml, etc.)
- If checking staged files with
--staged, ensure files are staged withgit add - For empty projects, this is expected behavior — add source files first
Error: "Tool not found" / "Required tool not installed"
Cause: A required linter tool is not installed on the system Solution:
- Identify which tool is missing from the output (e.g., golangci-lint, ruff)
- Install the tool using your package manager:
- Python:
pip install ruff mypy bandit - Go:
go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest - JavaScript:
npm install --save-dev eslint biome - Rust:
cargo install clippy(usually pre-installed with rustup)
- Python:
- Re-run the quality gate to verify installation
- Alternative: Mark the tool as optional in
language_registry.jsonif you cannot install it
Error: "Command timed out"
Cause: Tool taking longer than 60-second timeout (usually large file sets or performance issues) Solution:
- Use
--stagedto check only changed files instead of the entire project - Use
--langto check one language at a time - Check for generated files or very large files causing slowdown — add them to .gitignore
- Verify your system has adequate disk I/O (slow disks can cause timeouts)
Error: "Configuration file conflict"
Cause: Multiple conflicting linter configurations in the project (e.g., .eslintrc and biome.json) Solution:
- Check which tools the project actually uses (review package.json, go.mod, etc.)
- Identify the unused tool in
language_registry.json - Mark it as optional or disable it by removing it from the registry
- Consult the project's CLAUDE.md for tool preferences — project preferences override defaults
- Re-run to confirm conflict is resolved
Pattern Match Warnings (not failures)
Pattern Matches like "Silent exception handler" or "Debug print" are informational warnings. They do not fail the gate. Review them and decide whether to fix:
[WARNING]entries identify anti-patterns but don't block commits- Use
--no-patternsto skip pattern scanning if these are not relevant - Manually fix patterns that represent actual problems in your code
Graceful Degradation (Skipped Tools)
When a tool is marked optional and not installed:
- Tool appears as
[-] language/tool: skipped (Optional tool not installed) - Gate still passes because the tool is not required
- If you need that tool's checks, install it and re-run
Architecture
hooks/lib/
quality_gate.py # Shared core library
language_registry.json # Language configurations
skills/universal-quality-gate/
SKILL.md # This file
scripts/
run_quality_gate.py # Skill entry point (thin wrapper)
This skill uses the shared quality gate library from hooks/lib/ for on-demand code quality checking.
References
Multi-language linting: Language configurations in hooks/lib/language_registry.json
Related skills:
- Use
code-lintingfor single-language lint/format tasks - Use
systematic-code-reviewfor comprehensive code review beyond linting - Use
test-driven-developmentfor full validation with tests
Key principle: Quality gates catch syntax and style issues. They do not replace:
- Unit and integration tests (logic errors, race conditions)
- Code review (architectural problems, API design)
- Domain-specific validation (business logic, performance)
Recommended Agent Skills
Expand your agent's capabilities with these related and highly-rated skills.
voice-writer
Unified voice content generation pipeline with mandatory validation and joy-check. 9-phase pipeline: LOAD, GROUND, GENERATE, VALIDATE, REFINE, JOY-CHECK, OUTPUT, CLEANUP. Use when writing articles, blog posts, or any content that uses a voice profile. Use for "write article", "blog post", "write in voice", "generate content", "draft article", "write about".
image-auditor
Non-destructive image validation for accessibility and health.
video-editing
Video editing pipeline: cut footage, assemble clips via FFmpeg and Remotion.
comment-quality
Review and fix temporal references in code comments.
e2e-testing
Playwright-based end-to-end testing workflow.
anti-ai-editor
Remove AI-sounding patterns from content.
Didn't find tool you were looking for?