athola/precommit-setup
Configures pre-commit hooks for linting, type checking, formatting, and testing. Use when setting up a new project or adding quality gates to an existing one.
npx skills add https://github.com/athola/claude-night-market --skill precommit-setup
Configure a three-layer pre-commit quality system that
enforces linting, type checking, and testing before every
commit.
per-component quality checks
The system is organised in three layers, each with a
different cost / coverage tradeoff:
(50-200ms total). Lints and type-checks every staged file.
lint, typecheck, and test (10-30s total). Only the
components touched by the staged files are run.
structure and pattern checks (varies). Catches violations
that generic linters miss.
This layering keeps the fast feedback loop fast while still
catching the slow / project-specific bugs before they land.
The detailed configuration patterns are in modules; load
only the ones you need:
modules/standard-hooks.md: Layer 1 patterns forPython, Rust, and TypeScript (load when configuring base
linters).
modules/component-level-hooks.md: Layer 2 monoreposcripts and pre-commit wiring (load when project has
multiple components / plugins).
modules/validation-hooks.md: Layer 3 custom hooksand SKIP patterns (load when enforcing project conventions
beyond linting).
modules/ci-integration.md: GitHub Actions workflowplus a complete .pre-commit-config.yaml example (load
when wiring CI to mirror local checks).
modules/troubleshooting.md: timing tables, cacheclearing, hook-failure recovery (load when hooks are slow
or failing).
\\\`bash
python3 plugins/attune/scripts/attune_init.py \\
--lang python \\
--name my-project \\
--path .
mkdir -p scripts
chmod +x scripts/run-component-*.sh
\\\`
Create pyproject.toml with strict type checking:
\\\`toml
[tool.mypy]
python_version = "3.12"
warn_return_any = true
warn_unused_configs = true
disallow_untyped_defs = true
strict = true
[[tool.mypy.overrides]]
module = "plugins.*"
strict = true
\\\`
\\\`toml
[tool.pytest.ini_options]
testpaths = ["tests"]
pythonpath = ["src"]
addopts = [
"-v", # Verbose output
"--strict-markers", # Strict marker enforcement
"--cov=src", # Coverage for src/
"--cov-report=term", # Terminal coverage report
]
markers = [
"slow: marks tests as slow (deselect with '-m \\"not slow\\"')",
"integration: marks tests as integration tests",
]
\\\`
\\\`bash
uv sync --extra dev
uv run pre-commit install
uv run pre-commit run --all-files
git add .
git commit -m "feat: add feature"
\\\`
For full quality checks (CI/CD, monthly audits):
\\\`bash
set -e
echo "=== Running Full Quality Checks ==="
./scripts/run-component-lint.sh --all
./scripts/run-component-typecheck.sh --all
./scripts/run-component-tests.sh --all
echo "=== All Quality Checks Passed ==="
\\\`
Pre-commit hooks run in this fixed order; all must pass for
the commit to succeed:
Start with strict settings from the beginning: they are
easier to maintain over time. Configure type checking with
strict = true in pyproject.toml, set up testing early
(include pytest in pre-commit), and document the reason
whenever you must skip a hook.
Use a gradual adoption strategy. Start with global checks
(Layer 1), then add component-specific checks (Layer 2)
once legacy issues are resolved. Use --no-verify only for
true emergencies and document why.
Standardize per-component Makefiles for lint, typecheck,
and test targets. Centralize common settings in a root
pyproject.toml while allowing per-component overrides.
Automate change detection so commits stay fast, and use
progressive disclosure (summary first, detail on failure).
Skill(attune:project-init): Full project initializationSkill(attune:workflow-setup): GitHub Actions setupSkill(attune:makefile-generation): Generate componentMakefiles
Skill(pensive:shell-review): Audit shell scripts forexit-code and safety issues
hooks (formatting, linting), CI checks (tests, coverage),
and PR review gates (code quality, security).
.pre-commit-config.yaml exists at the project root with hooks covering at minimumLayer 1 (whitespace, YAML/TOML/JSON syntax, global linting).
uv run pre-commit run --all-files exits 0 after the configuration is installed,confirming all hooks pass on the current codebase state.
git commit with a staged change triggers the pre-commit hooks automatically (verifiedby uv run pre-commit install exit code 0 and presence of .git/hooks/pre-commit).
--no-verify bypass is absent from the project's documented workflows; if one isfound in existing scripts, it is flagged as a violation rather than silently accepted.
Take athola/precommit-setup from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.