home / skills / meriley / claude-code-skills / quality-check

quality-check skill

/skills/quality-check

npx playbooks add skill meriley/claude-code-skills --skill quality-check

Review the files below or copy the command above to add this skill to your agents.

Files (4)
SKILL.md
8.4 KB
---
name: quality-check
description: ⚠️ MANDATORY - Automatically invoked by safe-commit. Runs language-specific linting, formatting, static analysis, and type checking. Treats linter issues as build failures that MUST be fixed before commit. Auto-fixes when possible. NEVER run linters manually.
version: 1.0.2
---

# Code Quality Check Skill

## ⚠️ MANDATORY SKILL - AUTO-INVOKED BY SAFE-COMMIT

## Purpose

Enforce code quality standards through automated linting, formatting, and static analysis. Ensures code meets project conventions before committing.

**CRITICAL:** This skill is automatically invoked by safe-commit. NEVER run linters manually.

## 🚫 COMMIT BLOCKING RULE - ZERO TOLERANCE

**Commits are FORBIDDEN unless the LATEST quality check run shows ZERO issues.**

This means:

1. If quality check finds errors → FIX THEM
2. After fixing → RERUN quality check (MANDATORY)
3. If rerun finds errors → FIX AND RERUN AGAIN
4. Repeat until clean pass
5. **Only after a clean pass may you proceed to commit**

**The last quality check output MUST show all checks passing. No exceptions.**

## CRITICAL: Full Repository Scope

**All quality checks run on the ENTIRE repository:**

- `ruff check .` - ALL Python files
- `eslint .` - ALL JS/TS files
- `golangci-lint run ./...` - ALL Go files

**You MUST fix ALL issues found, not just those in files you modified.**
**Whoever runs quality-check is responsible for fixing discovered issues.**

## 🚫 NEVER DO THIS

- ❌ Running `eslint` or `npm run lint` manually before commit
- ❌ Running `golangci-lint run` manually before commit
- ❌ Running `flake8` or `black` manually before commit
- ❌ Running linters outside of this skill during commit workflow

**Let safe-commit invoke this skill automatically. Manual linting before commit is REDUNDANT and FORBIDDEN.**

---

## ⚠️ SKILL GUARD - READ BEFORE RUNNING LINTERS MANUALLY

**Before using Bash tool to run linters, answer these questions:**

### ❓ Are you about to run `npm run lint` or `eslint`?

→ **STOP.** Are you doing this before commit? If YES, use safe-commit instead (it invokes this skill).

### ❓ Are you about to run `golangci-lint run`?

→ **STOP.** Are you doing this before commit? If YES, use safe-commit instead (it invokes this skill).

### ❓ Are you about to run `flake8`, `black`, or `mypy`?

→ **STOP.** Are you doing this before commit? If YES, use safe-commit instead (it invokes this skill).

### ❓ Are you about to run `prettier --check` or formatting tools?

→ **STOP.** Are you doing this before commit? If YES, use safe-commit instead (it invokes this skill).

### ❓ Are you checking code quality before committing?

→ **STOP.** Invoke safe-commit skill (it will invoke this skill automatically).

**IF YOU RUN LINTERS MANUALLY BEFORE COMMIT, YOU ARE CREATING REDUNDANCY AND WASTING TIME.**

When to run linters manually:

- ✅ During development/refinement (not for commit)
- ✅ When user explicitly requests quality check

When NOT to run linters manually:

- ❌ Before commit (use safe-commit instead)
- ❌ As part of commit workflow (use safe-commit instead)

**Safe-commit invokes this skill automatically. Don't duplicate the work.**

---

## Philosophy

**CRITICAL: Treat linter issues as syntax errors, not warnings.**

- All linter issues MUST be fixed before commit
- No exceptions unless explicitly approved by user
- Auto-fix when tools support it
- Manual fix when auto-fix unavailable

## ⚠️ CRITICAL: Rerun Policy - ZERO TOLERANCE (All Languages)

**Assuming fixes resolved all errors is FORBIDDEN.**

This applies to ALL auto-fix operations in ANY language:

- ESLint --fix, Prettier --write (Node.js/TypeScript)
- gofmt -w, golangci-lint --fix (Go)
- ruff --fix, ruff format, black, isort (Python)
- cargo fmt, cargo clippy --fix (Rust)
- spotless:apply (Java)

### After ANY Fix (Auto or Manual):

1. **MUST rerun the same check** to verify fix succeeded
2. **MUST NOT proceed** until rerun passes
3. **MUST NOT assume** any fix caught everything
4. **MUST repeat** fix → rerun cycle until clean

### The Fix-Rerun Loop (MANDATORY)

```
while (quality_check_has_errors) {
    fix_errors();           // Auto-fix or manual
    rerun_quality_check();  // ALWAYS rerun after fixing
}
// Only exit loop when rerun shows ZERO errors
```

### Why This Matters

- Auto-fix tools don't catch 100% of issues
- Manual fixes can introduce new issues
- Some fixes reveal previously hidden issues
- Proceeding without verification can commit broken code
- **Commits with quality issues pollute the codebase**

### Example (WRONG) - Applies to ALL Languages

```
❌ Found 5 linting errors
❌ Running auto-fix...
❌ "Fixed! Proceeding to commit..."  ← FORBIDDEN - DID NOT RERUN
```

### Example (ALSO WRONG) - Manual Fix Without Rerun

```
❌ Found 3 type errors
❌ [Manually fixed the code]
❌ "Fixed! Proceeding to commit..."  ← FORBIDDEN - DID NOT RERUN
```

### Example (CORRECT) - Full Fix-Rerun Loop

```
✅ Found 5 linting errors
✅ Running auto-fix...
✅ Re-running lint check...          ← MANDATORY RERUN
✅ Found 1 remaining error (requires manual fix)
✅ [Fix manually]
✅ Re-running lint check...          ← MANDATORY RERUN AGAIN
✅ All checks pass. Safe to proceed.
```

## Workflow (Quick Summary)

### Core Steps

1. **Detect Languages**: Check for package.json, go.mod, requirements.txt, Cargo.toml, etc.
2. **Run Standard Checks**: Linting, formatting, type checking, static analysis (auto-fix when possible)
3. **Run Deep Audits**: Language-specific skills (control-flow-check, type-safety-audit, n-plus-one-detection)
4. **Handle Results**: Report pass/auto-fix/fail, provide specific error locations and fixes
5. **Verify Multi-Language**: All languages must pass before commit

### Language Support

- **Node.js/TypeScript**: ESLint, Prettier, tsc, npm audit
- **Go**: gofmt, go vet, golangci-lint, go mod tidy
- **Python**: ruff (lint+format), mypy | fallback: black, flake8, isort
- **Rust**: rustfmt, clippy
- **Java**: Maven/Gradle spotless, checkstyle

**For detailed language-specific commands and checks:**

```
Read `~/.claude/skills/quality-check/references/LANGUAGE-CHECKS.md`
```

Use when: Need specific tool commands, troubleshooting linter issues, or setting up new language

**For deep audit integration (control-flow, type-safety, N+1 detection):**

```
Read `~/.claude/skills/quality-check/references/DEEP-AUDITS.md`
```

Use when: Running language-specific deep audits or integrating specialized checks

**For result handling and reporting patterns:**

```
Read `~/.claude/skills/quality-check/references/RESULT-HANDLING.md`
```

Use when: Formatting output, handling auto-fix scenarios, or reporting manual fix requirements

---

## Integration with Other Skills

This skill is invoked by:

- **`safe-commit`** - Before committing changes
- **`create-pr`** - Before creating pull requests

## Best Practices

1. **Run in parallel** - Multiple languages? Check simultaneously
2. **Auto-fix first** - Always attempt auto-fix before asking user
3. **Be specific** - Show exact file, line, and error
4. **Suggest solutions** - Don't just report errors, help fix them
5. **Verify fixes** - Re-run checks after auto-fixing
6. **No skip option** - Quality checks are mandatory

## Tool Installation Detection

Before running tools, check if they're available:

```bash
# Example for Node.js:
if ! command -v eslint &> /dev/null; then
    echo "ESLint not found. Install with: npm install -D eslint"
    exit 1
fi
```

**If tool missing:**

- Report missing tool
- Provide installation command
- Ask user to install or use project's package.json scripts

## Configuration Detection

Check for project-specific configuration:

- `.eslintrc.js`, `.eslintrc.json` (ESLint)
- `.prettierrc`, `prettier.config.js` (Prettier)
- `.golangci.yml` (golangci-lint)
- `pyproject.toml` (Python tools)
- `.editorconfig` (Cross-language)

**Use project config when available**, otherwise use sensible defaults.

## Handling Make/NPM Scripts

If project has quality scripts in Makefile or package.json:

```bash
# Check for make target:
make lint
make fmt

# Check for npm script:
npm run lint
npm run format
```

**Prefer project scripts** over direct tool invocation when available.

## Emergency Override

Only if user explicitly states "skip quality checks" or "I acknowledge quality issues":

1. Document the override in output
2. List specific issues being ignored
3. Suggest creating follow-up ticket
4. Proceed with commit

**This should be RARE - quality checks exist for good reason.**