Why: ADR-0015 established that Microsoft APM (apm.yml + .apm/) should replace this repo's hand-authored plugin.json/marketplace.json model, with those files becoming compiled output of `apm pack` instead of files edited by hand via the (now-retired) plugin-author/marketplace-author skills. Issue #90 was the deferred execution of that decision, gated on #88 (apm tooling) and #89 (apm-native agent-author/skill-author routing). Implementation notes: - All six plugins (bin, core, git, gitea, kyberforge, lint) now carry apm.yml + .apm/{skills,agents,hooks} as their authoring source. Skills moved with a plain git mv (content-identical across targets). Agents were re-authored, not moved: per ADR-0016, .apm/agents/*.agent.md compiles verbatim to both Claude and Copilot, so plugin-scope agents now carry only name/description/model/source_keys -- no tools: field, no Claude-only knobs (isolation, maxTurns, effort, memory, permissionMode). - Root apm.yml registers all 7 marketplace packages (6 local plus mattpocock-skills as a remote entry) under versioning: per_package, matching this repo's existing independent-plugin-versioning practice. - .claude-plugin/marketplace.json and every plugin's plugin.json are now apm-pack-compiled output, verified against the prior hand-maintained content: same names/descriptions/versions/licenses/authors, only cosmetic serialization differences (JSON key order, owner email vs. url, Unicode escaping). - plugin-author and marketplace-author are retired now that apm-based authoring fully replaces their job; kyberforge bumped 1.3.1 -> 1.4.0 for that removal, and the root marketplace catalog bumped 0.3.1 -> 0.3.2 to match, per the version-bump convention now documented in apm-workflow's reference docs instead of a dedicated script (apm has no native version-bump automation). - Fixed hardcoded pre-.apm/ path assumptions across .pre-commit-config.yaml, .pre-commit-hooks.yaml, scripts/check-scope-walkup-sync.sh, scripts/sync-vale-styles.sh, scripts/check-vale-style-sync.sh, six plugins' root plugin.json (stale skills/hooks/agents pointer fields that check-manifests.sh validates), and several tests/*.bats and tests/*.sh fixtures -- including a bats REPO_ROOT relative-path depth bug (10 files, one extra .apm/ directory level to walk up) and a vale probe-path isolation regression introduced mid-fix. - Corrected empirically-wrong assumptions surfaced this session in apm-workflow/apm-install's own reference docs: `apm marketplace package add` does not accept local paths (only owner/repo remote shorthand -- local packages are registered by editing apm.yml's marketplace.packages[] directly); `apm compile` is a consumer-side AGENTS.md/CLAUDE.md generator, not the plugin.json producer, and hard-fails on skill/agent-only packages without --clean; `apm plugin init <name>` nests a stray subdirectory when run with a positional name arg from inside a same-named directory; no native Copilot marketplace output profile exists; .mcp.json is merged into the compiled plugin.json content-aware and target-scoped, with no dependencies.mcp entry needed for simple passthrough; pipx is the correct pip fallback on externally-managed Python environments. - Renamed agent-author's copilot.agent.md template asset to copilot.agent.md.template so apm compile's recursive *.agent.md glob stops misparsing the placeholder template as a real agent primitive. Impact: plugin.json and marketplace.json are compiled artifacts from here on -- editing them by hand is no longer the workflow; edit apm.yml/.apm/ and run apm pack. CONTEXT.md's Plugin/Plugin marketplace glossary entries reflect this. ADR-0001 is marked superseded, ADR-0006 moot, and ADR-0010 updated for the new .apm/agents/ path (project/user scope unaffected, per ADR-0016). Full local verification: claude plugin validate --strict on all 6 plugins, apm audit --ci, apm marketplace check, check-manifests.sh, and the full test suite (165/165 bats, 13/13 shell scripts) all pass clean. Fixes: #90 Refs: #88, #89 ADR: 0015 ADR: 0016 Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Ub96PyaSRD9BHPktotj1pC
124 lines
5.6 KiB
Markdown
124 lines
5.6 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.
|
|
- Never use `git commit --no-verify` (or `-n`) to bypass a failing hook. Hooks are the automated QA gate; bypassing them breaks the pipeline. Diagnose and fix the failure instead — see the hook-specific guidance below and in `references/failure-patterns.md`.
|
|
- 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) |
|
|
| "CI", "changed files only", "diff range" | `pre-commit run --from-ref <base> --to-ref <head>` — prefer this over `--all-files` on large repos |
|
|
| "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` does NOT refuse or error — it defaults to migration mode, which runs the existing hook and pre-commit's hooks both. Only `-f` replaces the existing hook file outright, and that replacement is not reversible via `pre-commit uninstall` — uninstall only removes pre-commit from `.git/hooks/`, it does not restore whatever hand-written hook `-f` overwrote. If files are present, tell the user: "Existing hook files found at `.git/hooks/<names>`. Plain `pre-commit install` will run both; `pre-commit install -f` will overwrite them permanently instead. Proceed with plain install, or overwrite?" 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
|
|
```
|