Husky Test Coverage
Set up or verify Husky git hooks to ensure tests run and coverage thresholds are enforced on every commit.
Purpose
This skill automates the setup of:
- Husky git hooks for pre-commit testing
- Test runner detection (Jest, Vitest, Mocha)
- Coverage configuration with thresholds (default: 80%)
- Pre-commit hook that runs tests with coverage
- Configurable coverage enforcement (block or warn)
When to Use
This skill should be used when:
- Setting up test coverage enforcement for the first time
- Verifying existing Husky/test setup is correctly configured
- Ensuring coverage thresholds are met before commits
- Configuring pre-commit hooks for test coverage
- Adapting coverage setup to different test runners
Project Context Discovery
Before setting up test coverage, discover the project's context:
-
Check package.json:
- Review existing test scripts
- Detect test runner from dependencies (jest, vitest, mocha)
- Check for existing Husky installation
- Review existing coverage configuration
-
Identify Test Runner:
- Jest: Check for in dependencies, look for or
- Vitest: Check for in dependencies, look for or
- Mocha: Check for in dependencies, check for coverage tool (nyc, c8)
-
Check Coverage Configuration:
- Jest: Look for in jest.config.*
- Vitest: Look for in vitest.config.*
- Mocha: Look for or coverage config in package.json
-
Verify Existing Husky Setup:
- Check if directory exists
- Review existing pre-commit hook
- Check if Husky is in package.json dependencies
-
Detect Test Files:
- Scan for or files
- Verify tests exist before enforcing coverage
Quick Start
bash
# Basic setup (80% coverage threshold, blocks commits below threshold)
python3 ~/.claude/skills/husky-test-coverage/scripts/setup-husky-coverage.py \
--root /path/to/project
# Custom threshold (85%)
python3 ~/.claude/skills/husky-test-coverage/scripts/setup-husky-coverage.py \
--root /path/to/project \
--threshold 85
# Warn only (don't block commits)
python3 ~/.claude/skills/husky-test-coverage/scripts/setup-husky-coverage.py \
--root /path/to/project \
--no-fail-on-below
# Skip if no tests found
python3 ~/.claude/skills/husky-test-coverage/scripts/setup-husky-coverage.py \
--root /path/to/project \
--skip-if-no-tests
# Dry run to preview changes
python3 ~/.claude/skills/husky-test-coverage/scripts/setup-husky-coverage.py \
--root /path/to/project \
--dry-run
What Gets Configured
Husky Setup
- Installs Husky if not already present
- Initializes Husky ()
- Creates hook that runs tests with coverage
- Adds script to package.json (if missing)
Test Runner Detection
The skill automatically detects:
- Jest: Uses
jest --coverage --watchAll=false
in pre-commit hook
- Vitest: Uses in pre-commit hook
- Mocha: Uses or with mocha test command
Coverage Configuration
Jest:
- Creates or updates with
- Default thresholds: 80% lines, 75% branches, 80% functions, 80% statements
Vitest:
- Creates or updates with coverage thresholds
- Configures v8 coverage provider
- Sets same default thresholds as Jest
Mocha + nyc:
- Creates or updates with coverage thresholds
- Configures text, html, and lcov reporters
Pre-commit Hook
The created hook:
- Runs tests with coverage before every commit
- Fails the commit if coverage is below threshold (configurable)
- Can skip if no test files are found (optional)
Configuration Options
Command Line Arguments
- : Project root directory (required)
- : Coverage threshold percentage (default: 80)
- : Fail commit if coverage below threshold (default: true)
- : Allow commit even if coverage below threshold
- : Skip hook if no test files found
- : Show what would be done without making changes
Configuration File
Create
.husky-test-coverage.json
in project root:
json
{
"coverageThreshold": {
"lines": 80,
"branches": 75,
"functions": 80,
"statements": 80
},
"failOnCoverageBelowThreshold": true,
"skipIfNoTests": false
}
Package.json Configuration
json
{
"huskyTestCoverage": {
"threshold": 80,
"failOnBelow": true
}
}
Tech Stack Adaptation
Jest Projects
Detection:
- Checks for in dependencies
- Looks for or
Configuration:
- Updates or creates with coverage thresholds
- Pre-commit hook:
npm test -- --coverage --watchAll=false
Example jest.config.json:
json
{
"coverageThreshold": {
"global": {
"lines": 80,
"branches": 75,
"functions": 80,
"statements": 80
}
}
}
Vitest Projects
Detection:
- Checks for in dependencies
- Looks for or
Configuration:
- Updates or creates Vitest config with coverage thresholds
- Pre-commit hook:
npm test -- --coverage --run
Example vitest.config.ts:
typescript
import { defineConfig } from 'vitest/config'
export default defineConfig({
test: {
coverage: {
provider: 'v8',
reporter: ['text', 'json', 'html'],
thresholds: {
lines: 80,
branches: 75,
functions: 80,
statements: 80
}
}
}
})
Mocha Projects
Detection:
- Checks for in dependencies
- Checks for coverage tool ( or )
Configuration:
- Creates or updates for nyc
- Pre-commit hook:
nyc --reporter=text --reporter=html npm test
Example .nycrc.json:
json
{
"check-coverage": true,
"lines": 80,
"branches": 75,
"functions": 80,
"statements": 80,
"reporter": ["text", "text-summary", "html", "lcov"]
}
Package Manager Support
The skill automatically detects and uses:
Workflow
When using this skill:
-
Discover Project Context:
- Scan package.json for test runner and dependencies
- Check existing Husky configuration
- Review existing coverage config files
- Verify test files exist
-
Detect Test Runner:
- Identify Jest, Vitest, or Mocha
- Detect coverage tool (built-in or nyc/c8)
- Determine package manager
-
Setup or Verify Husky:
- Install Husky if missing
- Initialize Husky hooks
- Add prepare script if needed
-
Configure Coverage:
- Create or update coverage configuration
- Set coverage thresholds (default 80%)
- Configure appropriate reporters
-
Create Pre-commit Hook:
- Generate hook script with test command
- Configure to run tests with coverage
- Set enforcement behavior (block or warn)
-
Verify Setup:
- Review generated configuration
- Test hook with a commit
- Adjust thresholds if needed
Integration with Other Skills
This skill works alongside:
| Skill | How It Works Together |
|---|
| fullstack-workspace-init | Automatically invoked after scaffolding to set up 80% coverage threshold |
| linter-formatter-init | Both configure Husky; this skill focuses on test coverage, linter-formatter-init focuses on linting/formatting |
| testing-expert | Uses testing patterns and coverage targets from testing-expert skill |
Automatic Setup with fullstack-workspace-init
When using
to scaffold a new project, this skill is automatically applied with:
- Vitest as the test runner
- 80% coverage threshold
- Pre-commit hooks enabled
- GitHub Actions CI/CD integration
You don't need to run this skill separately if you used
.
Manual Integration
If adding to an existing project:
bash
python3 ~/.claude/skills/husky-test-coverage/scripts/setup-husky-coverage.py \
--root /path/to/project \
--threshold 80
Troubleshooting
Pre-commit hook not running
bash
# Reinstall Husky
npx husky install
chmod +x .husky/pre-commit
Coverage not being checked
- Verify test command includes coverage flag
- Check coverage configuration file exists and is correct
- Ensure coverage tool is installed (nyc/c8 for Mocha)
Hook fails even when tests pass
- Check coverage thresholds are achievable
- Review coverage report to see what's below threshold
- Consider adjusting thresholds or improving test coverage
Tests run but coverage not enforced
- Verify coverage configuration file has correct thresholds
- Check test runner supports coverage (Jest/Vitest have built-in, Mocha needs nyc/c8)
- Review pre-commit hook script for correct command
Multiple test runners detected
The skill uses the first detected runner in priority order: Vitest > Jest > Mocha
Best Practices
- Start with reasonable thresholds: Begin with 80% and adjust based on project needs
- Monitor coverage trends: Use coverage reports to identify gaps
- Incremental improvement: Gradually increase thresholds as coverage improves
- Consider context: Some files (utilities, configs) may not need high coverage
- Use with CI/CD: Pre-commit hooks catch issues early, but CI/CD provides final gate
- Team alignment: Ensure team understands coverage requirements and goals
Resources
When this skill is active, Claude will:
- Discover project test setup and configuration
- Detect test runner and coverage tool
- Set up or verify Husky installation
- Configure coverage thresholds appropriately
- Create pre-commit hook that enforces coverage
- Provide troubleshooting guidance when needed