agentleFS
sd0xdevsd0xdev/sd0x-dev-flow/skills/precommit/SKILL.md

precommit

Skill192 starsChanged 36 days agoMITView on GitHub

Pre-commit checks — lint:fix -> build -> test

7 other projects use a version of this.

Adopted by

Most recently taken up by

The file

We split this skill into the rules it gives an agent

5 rules. 0 are common, 2 are distinctive, and 3 are very specific to this project.

  • 0

    Common

    Most of the 5 edited versions we read keep these.

  • 2

    Distinctive

    This author's own choices. Worth a look.

  • 3

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Distinctive:

    Run pre-commit checks: lint:fix -> build -> test

    line 34
  2. Very specific:

    Use Glob to check if .claude/scripts/precommit-runner.js exists in the project root.

    line 38
  3. Very specific:

    If runner emits ## Overall: ✅ PASS, use its output and skip to the Output section.

    line 41
  4. Very specific:

    If runner fails (## Overall: ❌ FAIL), treat as a real precommit failure (do not silently fallback).

    line 43
  5. Distinctive:

    After lint:fix completes, run git diff --name-only to capture auto-fixed files.

    line 72

“Common” is measured: kept by at least 6 in 10 of the 5 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

Pre-Commit Checks (Full)

Trigger

  • Keywords: precommit, pre-commit, lint and test, quality gate

When NOT to Use

  • Quick checks without build (use /precommit-fast)
  • Verification loop without lint:fix (use /verify)
  • Just running tests (run directly)

Workflow Steps

StepGoalSafetySkip if Missing
comment_blocksReject over-long comment blocks (@rules/docs-writing.md § Code Comments)read-onlyyes
lint-fixAuto-fix code style issuesread-writeyes
buildVerify compilation succeedsread-onlyyes
test-unitRun full test suiteread-onlyyes

Failure behavior: continue-all (run all steps, report all results)

comment_blocks is a policy step, and the asymmetry is deliberate (POLICY_STEPS in scripts/precommit-runner.js): it can FAIL the run, but it never counts as "validation ran". A run where policy was the only thing that executed still reports ⚠️ NO CHECKS RUN, so a repo whose real checks are pytest/cargo cannot bank a ✅ PASS on a passing comment scan alone. It runs first because it is static and cheap.

Task

Run pre-commit checks: lint:fix -> build -> test

Step 1: Check for runner script

Use Glob to check if .claude/scripts/precommit-runner.js exists in the project root.

  • Found → run: node .claude/scripts/precommit-runner.js --mode full --tail 80
    • If runner emits ## Overall: ✅ PASS, use its output and skip to the Output section.
    • If runner emits ## Overall: ⚠️ NO CHECKS RUN, do NOT treat it as a pass — fall through to Step 2 ecosystem detection so the project's real checks run. The marker means no project validation executed and no policy step failed — every validation step was a skip or unavailable, and any policy step (comment_blocks) either skipped or passed (a FAILING policy step is ❌ FAIL, never this marker — line 30's asymmetry) — whether because the repo declares no runnable checks or because the required tools were not available to the runner (which orchestrates the ecosystem table below itself: it detects pyproject.toml/Cargo.toml/go.mod/… and runs those checks as first-class steps). The runner self-notes its own verdict (review-state.js note precommit pass|fail); on ⚠️ NO CHECKS RUN it notes nothing — the slot is untouched and the reminder persists, which is the correct reading of "nothing validated".
    • If runner fails (## Overall: ❌ FAIL), treat as a real precommit failure (do not silently fallback).
  • NOT found → Auto-install attempt (see precommit-fast for identical auto-install logic), then fallback to Step 2.

Step 2: Fallback (no runner script)

Detect the project ecosystem to run steps manually.

Ecosystem detection:

ManifestEcosystemLint-fixBuildTest
package.jsonNode.js{pm} lint:fix{pm} build{pm} test:ci / test / test:fast / test:unit
pyproject.tomlPythonruff check --fix .—pytest tests/unit/
Cargo.tomlRustcargo clippy --fixcargo buildcargo test
go.modGogolangci-lint run --fixgo build ./...go test ./...
build.gradle / build.gradle.ktsJava (Gradle)./gradlew spotlessApply./gradlew build./gradlew test
pom.xmlJava (Maven)mvn spotless:applymvn compilemvn test
GemfileRubybundle exec rubocop -a—bundle exec rspec

How the runner executes this table (WB2b): a required tool missing from the environment (ruff, pytest, cargo, go, golangci-lint, mvn, bundle, the gradle wrapper — the runner never falls back to a global gradle) marks that step unavailable, which blocks ✅ PASS — incomplete validation must not let a sibling check mint the receipt. A repo-declared capability absent is an ordinary skip, but only on definitive non-membership evidence — never a manifest grep, and never an ambiguous probe failure (broken build config, broken task, network-dependent resolution), which stays unavailable: Ruby rubocop/rspec membership is read from Gemfile.lock text — rspec counts rspec or its executable provider rspec-core — after bundle check passes (a failing bundle check or unreadable lockfile is unavailable); Gradle spotless skips only on Gradle's own Task 'spotlessApply' not found diagnostic from gradlew help --task spotlessApply (a marker-less failure is unavailable — Gradle realizes tasks lazily, so a configured-but-broken task fails the probe exactly like an absent one); Maven spotless skips only on the No plugin found for prefix marker from mvn help:describe -Dplugin=spotless — any other failure is unavailable. All probes are bounded (PRECOMMIT_PROBE_TIMEOUT_MS, default 120s; output capped) and logged; a probe timeout is unavailable, never a skip. Python tests run pytest tests/unit/ when that directory exists, else bare pytest (config-driven discovery — a repo with no tests fails loudly on exit 5 instead of silently skipping). Clippy runs with --allow-dirty --allow-staged: precommit operates on a dirty tree by definition.

For Node.js projects, auto-detect package manager from lockfile.

Steppackage.json scriptIf missing
lint:fixlint:fixSkip with note
buildbuildSkip with note
testtest:ci → test → test:fast → test:unitSkip with note

After lint:fix completes, run git diff --name-only to capture auto-fixed files.

After a conclusive fallback run, self-note the outcome — the runner cannot see a run it did not perform, and the rounds count stays path-independent (a failure is a failure whichever engine ran it):

CHECKER=".claude/scripts/review-state.js"; [ -f "$CHECKER" ] || CHECKER="scripts/review-state.js"
node "$CHECKER" note precommit pass   # every executed check passed
node "$CHECKER" note precommit fail   # the checks ran and at least one failed

An inconclusive run (the checks could not execute at all) notes nothing — exactly like the runner's ⚠️ NO CHECKS RUN: the slot stays untouched and the reminder persists. The note is advisory; a failed note is reported and never fails the run.

Output

## Precommit (full)

## Results

| Step | Status | Notes |
|------|--------|-------|
| lint:fix | ✅/❌/⏭️/⛔ | ⏭️ = repo opted out (skip); ⛔ = required tool unavailable (blocks PASS) |
| build | ✅/❌/⏭️/⛔ | same legend |
| test | ✅/❌/⏭️/⛔ | same legend |

## Changed Files (after lint:fix)

- <files or "(none)">

## Overall: ✅ PASS / ❌ FAIL / ⚠️ NO CHECKS RUN (no project validation executed AND no policy step failed — validation steps all skipped/unavailable, policy steps skipped or passed; fall through to Step 2, needs human if nothing runnable exists)

## Checklist

- [ ] All available checks pass
- [ ] git status reviewed

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.