/shared-tooling-git-hooks
Husky v9 setup, lint-staged v16 patterns, commitlint with conventional commits, CI/production handling, monorepo setup, migration from v8
$ npx -y skills add agents-inc/skills --skill shared-tooling-git-hooks --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
- Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.
- You can call itInvoke it directly when you want it.
- Slash command
/shared-tooling-git-hooks
Context preview
The summary Claude sees to decide when to auto-load this skill.
Husky v9 setup, lint-staged v16 patterns, commitlint with conventional commits, CI/production handling, monorepo setup, migration from v8
SKILL.md
shared-tooling-git-hooks.SKILL.mdname: shared-tooling-git-hooks
description: Husky v9 setup, lint-staged v16 patterns, commitlint with conventional commits, CI/production handling, monorepo setup, migration from v8
Git Hooks
> **Quick Guide:** Husky v9 for git hooks with `"prepare": "husky"` (NOT `"husky install"`). lint-staged v16 for staged-only linting. commitlint for conventional commit messages. Pre-commit hooks should take < 10 seconds. Set `HUSKY=0` in CI/production.
---
<critical_requirements>
CRITICAL: Before Using This Skill
> **All code must follow project conventions in CLAUDE.md** (kebab-case, named exports, import ordering, `import type`, named constants)
**(You MUST use `"prepare": "husky"` in package.json - NOT the deprecated `"husky install"`)**
**(You MUST only lint staged files via lint-staged - NEVER lint the entire codebase in pre-commit)**
**(You MUST set `HUSKY=0` in CI/production environments to disable hooks)**
**(You MUST use plain hook files in `.husky/` directory - NO shebang lines or husky.sh sourcing in v9)**
**(You MUST keep pre-commit hooks under 10 seconds - move slow tasks to pre-push or CI)**
</critical_requirements>
---
**Auto-detection:** Husky, husky init, .husky/, pre-commit hook, lint-staged, commitlint, conventional commits, commit-msg hook, git hooks, prepare script
**When to use:**
- Setting up pre-commit hooks with Husky + lint-staged
- Configuring commit message validation with commitlint
- Migrating from Husky v8 to v9
- Configuring git hooks in monorepo setups
- Disabling hooks in CI/production environments
**When NOT to use:**
- Linter/formatter configuration itself (separate concern)
- CI/CD pipeline configuration (separate concern)
- Runtime application code (this is developer workflow tooling only)
**Key patterns covered:**
- Husky v9 setup and hook creation
- lint-staged v16 configuration patterns
- commitlint with conventional commits
- CI/production hook disabling
- Monorepo setup
- Migration from Husky v8 to v9
**Detailed Resources:**
- [examples/core.md](examples/core.md) - Setup, lint-staged config, commitlint, CI handling, monorepo, migration
- [reference.md](reference.md) - Decision frameworks, tool comparison, anti-patterns
---
<philosophy>
Philosophy
Git hooks are a **developer workflow tool** - they catch issues early while staying fast and non-blocking. The goal is fast feedback (< 10 seconds) on staged files only. Hooks are optional infrastructure; many projects work fine without them.
**When to use git hooks:**
- Team projects where code quality gates prevent CI failures
- Projects with established linting/formatting that should be enforced
- When you want fast feedback before code reaches CI
- Monorepos where running full lint is too slow
**When NOT to use:**
- Solo projects where you always remember to lint (overhead without benefit)
- Projects without established linting/formatting rules yet (set up linting first)
- When pre-commit hooks exceed 10 seconds (move to CI instead)
- CI-only projects where hooks add friction without value
</philosophy>
---
<patterns>
Core Patterns
Pattern 1: Husky v9 Setup
Husky v9 uses plain shell scripts in `.husky/` directory. No shebang lines needed. The `prepare` script auto-installs hooks for all team members.
# Full setup in 4 commands
bun add -D husky
bunx husky init # Creates .husky/ and adds "prepare": "husky" to package.json
bun add -D lint-staged
echo "bunx lint-staged" > .husky/pre-commit
**Key points:**
- `"prepare": "husky"` (NOT `"husky install"` - deprecated, will break in v10)
- Hook files are plain shell scripts (no shebang required in v9)
- `HUSKY=0` disables hooks (CI/production); `HUSKY=2` enables debug mode
- v9.1.1+ allows running package commands directly without npx/bunx
See [examples/core.md](examples/core.md) for full setup and package.json configuration.
---
Pattern 2: Pre-commit Hook with lint-staged
lint-staged v16 runs commands only on staged files. Uses `picomatch` for glob matching (replaced `micromatch`).
// lint-staged.config.mjs
export default {
"*.{ts,tsx}": ["eslint --fix", "prettier --write"],
"*.{css,scss}": ["prettier --write"],
};Type checking requires function syntax (runs on ALL files, not just staged):
// lint-staged.config.mjs — with type checking
export default {
"*.{ts,tsx}": ["eslint --fix", "prettier --write"],
"*.{ts,tsx,js,jsx}": () => "tsc --noEmit",
};**Why good:** Only staged files, auto-fix reduces manual work, fast feedback
**v16 breaking changes:** `--shell` flag removed (use shell scripts instead), requires Node.js 20.18+
See [examples/core.md](examples/core.md) for multiple file type patterns and v16 migration details.
---
Pattern 3: Commitlint with Conventional Commits
commitlint v20+ validates commit messages. ESM-native - use `.mjs` config extension.
bun add -D @commitlint/cli @commitlint/config-conventional
# .husky/commit-msg
bunx commitlint --edit $1
// commitlint.config.mjs (MUST be .mjs for Node v24 compatibility)
export default {
extends: ["@commitlint/config-conventional"],
};Format: `type(scope): description` - types: `feat`, `fix`, `docs`, `refactor`, `test`, `chore`, etc.
See [examples/core.md](examples/core.md) for v20 changes and advanced configuration.
---
Pattern 4: CI/Production Environment Handling
Disable Husky where hooks should not run.
# CI pipelines
HUSKY=0 npm install
# GitHub Actions
env:
HUSKY: 0
**Why:** Prevents hook installation failures when `devDependencies` not installed in production.
See [examples/core.md](examples/core.md) for conditional prepare script alternatives.
---
Pattern 5: Monorepo Setup
For monorepos where package.json is not at the repository root.
// apps/frontend/package.json
{
"scripts": {
"prepare": "cd ../.. && husky apps/frontend/.husky"
}
}**Key:** Navigate to repo
Read more
name: shared-tooling-git-hooks description: Husky v9 setup, lint-staged v16 patterns, commitlint with conventional commits, CI/production handling, monorepo setup, migration from v8
Git Hooks
> **Quick Guide:** Husky v9 for git hooks with `"prepare": "husky"` (NOT `"husky install"`). lint-staged v16 for staged-only linting. commitlint for conventional commit messages. Pre-commit hooks should take < 10 seconds. Set `HUSKY=0` in CI/production.
---
<critical_requirements>
CRITICAL: Before Using This Skill
> **All code must follow project conventions in CLAUDE.md** (kebab-case, named exports, import ordering, `import type`, named constants)
**(You MUST use `"prepare": "husky"` in package.json - NOT the deprecated `"husky install"`)**
**(You MUST only lint staged files via lint-staged - NEVER lint the entire codebase in pre-commit)**
**(You MUST set `HUSKY=0` in CI/production environments to disable hooks)**
**(You MUST use plain hook files in `.husky/` directory - NO shebang lines or husky.sh sourcing in v9)**
**(You MUST keep pre-commit hooks under 10 seconds - move slow tasks to pre-push or CI)**
</critical_requirements>
---
**Auto-detection:** Husky, husky init, .husky/, pre-commit hook, lint-staged, commitlint, conventional commits, commit-msg hook, git hooks, prepare script
**When to use:**
- Setting up pre-commit hooks with Husky + lint-staged
- Configuring commit message validation with commitlint
- Migrating from Husky v8 to v9
- Configuring git hooks in monorepo setups
- Disabling hooks in CI/production environments
**When NOT to use:**
- Linter/formatter configuration itself (separate concern)
- CI/CD pipeline configuration (separate concern)
- Runtime application code (this is developer workflow tooling only)
**Key patterns covered:**
- Husky v9 setup and hook creation
- lint-staged v16 configuration patterns
- commitlint with conventional commits
- CI/production hook disabling
- Monorepo setup
- Migration from Husky v8 to v9
**Detailed Resources:**
- [examples/core.md](examples/core.md) - Setup, lint-staged config, commitlint, CI handling, monorepo, migration
- [reference.md](reference.md) - Decision frameworks, tool comparison, anti-patterns
---
<philosophy>
Philosophy
Git hooks are a **developer workflow tool** - they catch issues early while staying fast and non-blocking. The goal is fast feedback (< 10 seconds) on staged files only. Hooks are optional infrastructure; many projects work fine without them.
**When to use git hooks:**
- Team projects where code quality gates prevent CI failures
- Projects with established linting/formatting that should be enforced
- When you want fast feedback before code reaches CI
- Monorepos where running full lint is too slow
**When NOT to use:**
- Solo projects where you always remember to lint (overhead without benefit)
- Projects without established linting/formatting rules yet (set up linting first)
- When pre-commit hooks exceed 10 seconds (move to CI instead)
- CI-only projects where hooks add friction without value
</philosophy>
---
<patterns>
Core Patterns
Pattern 1: Husky v9 Setup
Husky v9 uses plain shell scripts in `.husky/` directory. No shebang lines needed. The `prepare` script auto-installs hooks for all team members.
# Full setup in 4 commands bun add -D husky bunx husky init # Creates .husky/ and adds "prepare": "husky" to package.json bun add -D lint-staged echo "bunx lint-staged" > .husky/pre-commit
**Key points:**
- `"prepare": "husky"` (NOT `"husky install"` - deprecated, will break in v10)
- Hook files are plain shell scripts (no shebang required in v9)
- `HUSKY=0` disables hooks (CI/production); `HUSKY=2` enables debug mode
- v9.1.1+ allows running package commands directly without npx/bunx
See [examples/core.md](examples/core.md) for full setup and package.json configuration.
---
Pattern 2: Pre-commit Hook with lint-staged
lint-staged v16 runs commands only on staged files. Uses `picomatch` for glob matching (replaced `micromatch`).
// lint-staged.config.mjs
export default {
"*.{ts,tsx}": ["eslint --fix", "prettier --write"],
"*.{css,scss}": ["prettier --write"],
};Type checking requires function syntax (runs on ALL files, not just staged):
// lint-staged.config.mjs — with type checking
export default {
"*.{ts,tsx}": ["eslint --fix", "prettier --write"],
"*.{ts,tsx,js,jsx}": () => "tsc --noEmit",
};**Why good:** Only staged files, auto-fix reduces manual work, fast feedback
**v16 breaking changes:** `--shell` flag removed (use shell scripts instead), requires Node.js 20.18+
See [examples/core.md](examples/core.md) for multiple file type patterns and v16 migration details.
---
Pattern 3: Commitlint with Conventional Commits
commitlint v20+ validates commit messages. ESM-native - use `.mjs` config extension.
bun add -D @commitlint/cli @commitlint/config-conventional
# .husky/commit-msg bunx commitlint --edit $1
// commitlint.config.mjs (MUST be .mjs for Node v24 compatibility)
export default {
extends: ["@commitlint/config-conventional"],
};Format: `type(scope): description` - types: `feat`, `fix`, `docs`, `refactor`, `test`, `chore`, etc.
See [examples/core.md](examples/core.md) for v20 changes and advanced configuration.
---
Pattern 4: CI/Production Environment Handling
Disable Husky where hooks should not run.
# CI pipelines HUSKY=0 npm install # GitHub Actions env: HUSKY: 0
**Why:** Prevents hook installation failures when `devDependencies` not installed in production.
See [examples/core.md](examples/core.md) for conditional prepare script alternatives.
---
Pattern 5: Monorepo Setup
For monorepos where package.json is not at the repository root.
// apps/frontend/package.json
{
"scripts": {
"prepare": "cd ../.. && husky apps/frontend/.husky"
}
}**Key:** Navigate to repo
Showing the first part of this file.
The official skills marketplace for Agents Inc. 150+ skills covering everything from React and Prisma to Redis, ElevenLabs, and infrastructure tooling. Pick the skills that match your stack and install them via Claude Code. Need more control?
Repo: agents-inc/skills
Other skills on agents-inc-skills.
- /ai-infrastructure-huggingface-inference
Hugging Face Inference SDK patterns for TypeScript/Node.js — InferenceClient setup, chat completion, text generation, streaming, embeddings, image generation, audio transcription, translation, summarization, and Inference Endpoints
Open skill - /ai-infrastructure-litellm
LiteLLM proxy server setup, TypeScript client patterns via OpenAI SDK, model routing, fallbacks, load balancing, spend tracking, virtual keys, and production deployment
Open skill - /ai-infrastructure-modal
Serverless GPU compute platform for AI model deployment — web endpoints, GPU functions, model serving, and TypeScript client patterns
Open skill - /ai-infrastructure-ollama
Local LLM inference with the Ollama JavaScript client -- chat, streaming, tool calling, vision, embeddings, structured output, model management, and OpenAI-compatible endpoint
Open skill - /ai-infrastructure-replicate
Replicate SDK patterns for TypeScript/Node.js -- client setup, predictions, streaming, webhooks, file handling, model versioning, deployments, and training
Open skill - /ai-infrastructure-together-ai
Together AI SDK patterns for TypeScript — client setup, chat completions, streaming, structured output, function calling, embeddings, image generation, fine-tuning, and OpenAI-compatible endpoints
Open skill

