## Why Pre-commit config management was entirely manual — no skill existed to help create, modify, or validate `.pre-commit-config.yaml`, or to run, install, and maintain the pre-commit setup. These two skills close that gap with clear scope separation: authoring vs. execution. ## Implementation Notes - `pc-author` owns `.pre-commit-config.yaml` only (no hook publishing, no install). Runs `pre-commit validate-config` after every write. Shallow file-extension scan drives proactive hook recommendations; rev staleness is flagged against `references/hooks-by-language.md` rather than hardcoded versions. Remove path reverts on failure. - `pc-run` owns install, run, autoupdate, gc, and clean. Defaults to `--all-files`. Install warns about existing `.git/hooks/` files being overwritten by `-f`. Clean requires HITL confirmation. Failure interpretation delegates to `references/failure-patterns.md`. - Provenance wired to `plugins/kyberforge/docs/research/docs/pre-commit/`. - Both skills resolve via the existing `"skills/"` glob in `plugin.json`. ## Impact Two new slash commands available after `claude plugin install kyberforge@holocron`: `/pc-author` and `/pc-run`. Refs: #12 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01P87CiC58Ru2PPWYTeXtjHT
122 lines
4.9 KiB
Markdown
122 lines
4.9 KiB
Markdown
---
|
|
name: pc-run
|
|
description: >
|
|
Use when the user wants to run pre-commit hooks, install git hooks, update
|
|
hook versions, or maintain the pre-commit cache. Triggers on: "run
|
|
pre-commit", "run all hooks", "check everything passes", "install hooks",
|
|
"wire hooks into git", "update hook versions", "autoupdate", "bump revs",
|
|
"clean the cache", "rebuild environments", "gc", "why is my hook failing",
|
|
"hooks aren't running". Do not use for creating or editing
|
|
`.pre-commit-config.yaml` — use `pc-author` for that.
|
|
|
|
compatibility: Requires pre-commit installed and available on PATH.
|
|
|
|
metadata:
|
|
category: devtools
|
|
source_keys:
|
|
- context7-pre-commit-com
|
|
- pre-commit-com
|
|
|
|
allowed-tools: Bash Read
|
|
---
|
|
|
|
## Gotchas
|
|
|
|
- Hooks not running on `git commit` almost always means `pre-commit install` was never run in this clone. Git hooks are per-clone — they are not committed to the repo.
|
|
- When a hook modifies files (e.g. `trailing-whitespace`, `end-of-file-fixer`), the commit is blocked intentionally — the staged version is stale. The fix is `git add -u && git commit`. Do NOT call `pre-commit install -f` here; that is for overwriting existing hooks, not re-staging.
|
|
- `pre-commit autoupdate` modifies `.pre-commit-config.yaml` in-place. Re-read the file after calling it to show the user the updated `rev` values.
|
|
- The `SKIP` env var requires exact hook `id` values, comma-separated, no spaces: `SKIP=check-yaml,gitleaks git commit -m "msg"`. A space after the comma silently skips nothing.
|
|
- A stages mismatch — hook stage not installed — means the hook was added to the config but `pre-commit install` was not re-run with the correct `-t` flags. Hooks in stages not listed under `default_install_hook_types` will never fire.
|
|
|
|
## Route
|
|
|
|
Determine intent from the user's request, then execute the matching operation:
|
|
|
|
| User intent | Operation |
|
|
|---|---|
|
|
| "run", "check", "verify", "test hooks" | `pre-commit run --all-files` (default) |
|
|
| "staged", "simulate commit" | `pre-commit run` (staged files only) |
|
|
| "install", "set up hooks", "wire into git" | `pre-commit install` — see Install |
|
|
| "pre-create environments", "install-hooks", "warm cache" | `pre-commit install-hooks` — see Install |
|
|
| "remove hooks", "uninstall", "tear down pre-commit" | `pre-commit uninstall` |
|
|
| "autoupdate", "update versions", "bump revs" | `pre-commit autoupdate` |
|
|
| "gc", "garbage collect" | `pre-commit gc` |
|
|
| "clean", "wipe cache", "rebuild from scratch" | `pre-commit clean` — see Clean |
|
|
|
|
If the intent is ambiguous, default to `pre-commit run --all-files`.
|
|
|
|
## Run
|
|
|
|
Default: `pre-commit run --all-files`. Never silently run staged-only.
|
|
|
|
```bash
|
|
pre-commit run --all-files
|
|
```
|
|
|
|
**When hooks fail**, read the output and:
|
|
1. Identify which hook failed and the specific cause. Be concrete: "gitleaks blocked `config.json` (high-entropy string on line 12)", not just "gitleaks failed".
|
|
2. Suggest a concrete next step. Common patterns are in `references/failure-patterns.md`.
|
|
3. Do NOT auto-fix code files. Do NOT modify `.pre-commit-config.yaml`. Those are the user's or `pc-author`'s responsibility.
|
|
|
|
If the user asks to run only staged files: `pre-commit run` (no `--all-files`).
|
|
If the user names a specific hook: `pre-commit run <hook-id>`.
|
|
|
|
## Install
|
|
|
|
Only run when the user explicitly asks to install or set up hooks.
|
|
|
|
Before running, check for existing hook files:
|
|
|
|
```bash
|
|
ls .git/hooks/
|
|
```
|
|
|
|
If any hook files exist (e.g. a hand-written `pre-commit`), `pre-commit install` will refuse and exit with an error — it will not overwrite them without `-f`. If files are present, warn the user: "Existing hook files found at `.git/hooks/<names>`. Running `pre-commit install -f` will replace them permanently. Proceed?" Wait for confirmation before using `-f`.
|
|
|
|
```bash
|
|
pre-commit install
|
|
```
|
|
|
|
Re-run with `-t` flags when `default_install_hook_types` was changed or when hooks in non-default stages aren't firing:
|
|
|
|
```bash
|
|
pre-commit install -t pre-commit -t pre-push -t commit-msg
|
|
```
|
|
|
|
To pre-create all hook environments without running hooks (useful for CI warm-up or first-time setup):
|
|
|
|
```bash
|
|
pre-commit install-hooks
|
|
```
|
|
|
|
To remove pre-commit from `.git/hooks/` entirely:
|
|
|
|
```bash
|
|
pre-commit uninstall
|
|
```
|
|
|
|
## Autoupdate
|
|
|
|
```bash
|
|
pre-commit autoupdate
|
|
```
|
|
|
|
After it completes, read `.pre-commit-config.yaml` and report which `rev` values changed. If the user wants to pin to exact SHAs (for reproducibility): `pre-commit autoupdate --freeze`.
|
|
|
|
## Clean and GC
|
|
|
|
**`gc`** — removes only unused cached environments. Safe to run at any time:
|
|
```bash
|
|
pre-commit gc
|
|
```
|
|
|
|
**`clean`** — wipes the entire cache at `~/.cache/pre-commit`. All hook environments will be re-downloaded on next run. Require explicit confirmation before running:
|
|
|
|
> "This will wipe the entire pre-commit cache. All hook environments will be re-downloaded on next run. Proceed?"
|
|
|
|
Wait for the user to say yes before executing:
|
|
|
|
```bash
|
|
pre-commit clean
|
|
```
|