hk
Use jdx/hk git hook manager to setup, configure, and manage git hooks and linters. Invoke when user asks to setup hk, configure hooks, add linters, or work with pre-commit/pre-push hooks.
- Category: discovered
- Tags: github, community
- Version: 1.0.0
- Author: walid
- Downloads: 0
- Updated: 2025-11-22
Download the latest version (v1.0.0) from this page.
SKILL.md
---
name: hk
description: Use jdx/hk git hook manager to setup, configure, and manage git hooks and linters. Invoke when user asks to setup hk, configure hooks, add linters, or work with pre-commit/pre-push hooks.
---
# hk - Git Hook Manager
You are an expert in using **hk**, a high-performance git hook manager and project linting tool created by jdx. This skill helps users set up, configure, and use hk in their projects.
## What is hk?
hk is a git hook manager with tight integration with linters, emphasizing performance through concurrency and file locking. It pairs excellently with mise-en-place for dependency management.
## Installation
When the user needs to install hk, recommend these methods in order:
1. **mise-en-place** (recommended): `mise use hk pkl`
- Also installs pkl (required for configuration)
2. **Homebrew**: `brew install hk`
3. **Cargo**: `cargo install hk`
4. **Aqua**: `aqua g -i jdx/hk`
## Project Setup
### Initial Setup
1. Initialize configuration:
```bash
hk init
```
This generates `hk.pkl` in the project root.
2. Install hooks into git:
```bash
hk install
```
This configures git to use hooks from `hk.pkl`.
### Configuration Structure
The `hk.pkl` file uses Apple's Pkl configuration language with this basic structure:
```pkl
amends "package://github.com/jdx/hk/releases/download/v1.20.0/hk@1.20.0#/Config.pkl"
linters {
["my-linter"] {
glob = "**/*.py"
check = "python -m pylint"
fix = "python -m black"
}
}
hooks {
["pre-commit"] {
steps {
["my-linter"] {}
}
}
}
```
## Core Concepts
### Linters
Linters define the actual checks and fixes to run. Key properties:
- **glob**: File patterns to match (e.g., `"**/*.ts"`, `"src/**/*.py"`)
- **check**: Read-only command to validate files (runs with `hk check`)
- **fix**: Command to automatically correct issues (runs with `hk fix`)
- **stage**: Glob patterns for files to stage after fixes
- **batch**: Enable parallel processing across file batches
- **exclusive**: Set to `true` to block concurrent execution
- **workspace_indicator**: File to identify workspace root (e.g., `"Cargo.toml"` for Rust)
### Hooks
Hooks define when linters execute. Available hooks:
- **pre-commit**: Runs before git commits
- **pre-push**: Runs before git pushes
- **fix**: Manual invocation via `hk fix`
- **check**: Manual invocation via `hk check`
Hook configuration options:
- `fix: bool` - Enable modification mode
- `stash: String` - Preserve unstaged changes ("git", "patch-file", "none")
- `steps` - Mapping of linters to execute
### Built-in Linters
hk provides many built-in linters accessible via the Builtins library:
```pkl
import "package://github.com/jdx/hk/releases/download/v1.20.0/hk@1.20.0#/Builtins.pkl"
linters = Builtins.linters
```
Common built-ins include: prettier, eslint, black, ruff, shellcheck, actionlint, and many more.
## Common Commands
| Command | Purpose | Usage |
|---------|---------|-------|
| `hk init` | Initialize new hk.pkl config | First-time setup |
| `hk install` | Configure git to use hk hooks | After creating/updating hk.pkl |
| `hk check` | Verify files without modification | CI/CD, pre-commit validation |
| `hk check --all` | Check all files in repo | CI/CD pipelines |
| `hk check --from-ref main` | Check changes since main branch | PR validation |
| `hk fix` | Fix issues and modify files | Local development |
| `hk run pre-commit` | Manually execute specific hook | Testing hook configuration |
| `hk run pre-commit --all` | Run hook on all files | Testing, CI |
## Configuration Examples
### Simple Python Linter
```pkl
linters {
["black"] {
glob = "**/*.py"
check = "black --check"
fix = "black"
}
}
hooks {
["pre-commit"] {
steps {
["black"] {}
}
}
}
```
### Using Built-in Linters
```pkl
import "package://github.com/jdx/hk/releases/download/v1.20.0/hk@1.20.0#/Builtins.pkl"
linters = Builtins.linters.toMap()
hooks {
["pre-commit"] {
steps {
["prettier"] {}
["eslint"] {}
}
}
}
```
### Multiple Hooks with Different Behavior
```pkl
linters {
["quick-lint"] {
glob = "src/**/*.ts"
check = "eslint"
}
["thorough-lint"] {
glob = "**/*.ts"
check = "eslint --max-warnings 0"
}
}
hooks {
["pre-commit"] {
steps {
["quick-lint"] {}
}
}
["pre-push"] {
steps {
["thorough-lint"] {}
}
}
}
```
### Conditional Steps
```pkl
linters {
["test"] {
glob = "**/*.test.ts"
check = "npm test"
condition = "git diff --cached --name-only | grep -q '.test.ts#39;"
}
}
```
## Advanced Features
### Global Configuration
Create `~/.hkrc.pkl` for settings shared across all projects:
```pkl
amends "package://github.com/jdx/hk/releases/download/v1.20.0/hk@1.20.0#/Config.pkl"
jobs = 8
fail_fast = false
exclude = [".git/**", "node_modules/**"]
```
### Environment Variables
Set environment variables for linters:
```pkl
env {
["NODE_ENV"] = "development"
}
linters {
["eslint"] {
glob = "**/*.js"
check = "eslint"
env {
["ESLINT_USE_FLAT_CONFIG"] = "true"
}
}
}
```
### Configuration Precedence
Settings merge from multiple sources (highest to lowest priority):
1. CLI flags: `--fail-fast`, `--jobs`
2. Environment variables: `HK_JOBS=8`
3. Git config (local/global)
4. User rc file: `~/.hkrc.pkl`
5. Project config: `hk.pkl`
6. Built-in defaults
## Integration with mise
hk works exceptionally well with mise-en-place:
```bash
# Install both tools
mise use hk pkl
# Use mise tasks for complex workflows
mise task add lint "hk check --all"
mise task add fix "hk fix"
```
## Best Practices
1. **Start Simple**: Begin with built-in linters, customize only when needed
2. **Use mise**: Manage hk and pkl versions with mise for consistency
3. **Check in CI**: Use `hk check --all` in CI to validate all files
4. **Incremental Checks**: Use `hk check --from-ref main` for PR validation
5. **Exclusive Steps**: Mark sequential operations as `exclusive = true`
6. **Test Hooks**: Run `hk run pre-commit --all` before pushing config changes
7. **Global Excludes**: Set common exclusions in `~/.hkrc.pkl`
8. **Workspace Awareness**: Use `workspace_indicator` for monorepos
## Troubleshooting
### Hook Not Running
```bash
# Reinstall hooks
hk install
# Verify git hook configuration
cat .git/hooks/pre-commit
```
### Performance Issues
```pkl
// Increase parallelism
jobs = 8
// Disable check before fix
check_first = false
```
### Linter Not Matching Files
```bash
# Test glob pattern
hk check --all --verbose
# Verify files exist
find . -name "*.py"
```
## When to Use This Skill
Invoke this skill when the user:
- Wants to set up git hooks in a project
- Needs to configure pre-commit or pre-push hooks
- Asks about managing linters or formatters
- Wants to improve code quality automation
- Mentions hk, git hooks, or linting workflows
- Needs to integrate linters with git workflow
## Instructions
When helping users with hk:
1. **Assess Current State**: Check if hk is installed and configured
2. **Understand Goals**: Ask what linters/hooks they want to set up
3. **Recommend Installation**: Suggest mise-based installation when possible
4. **Provide Config**: Create appropriate `hk.pkl` based on their project
5. **Test Setup**: Help run `hk check` or `hk fix` to verify configuration
6. **Document**: Explain what each configuration does and why
Always consider:
- Project language and existing tooling
- Whether they use mise-en-place
- CI/CD integration needs
- Team collaboration (project skills vs personal)
- Performance requirements (parallelism, exclusions)
## Additional Resources
For more details, see [reference.md](reference.md) for comprehensive configuration options and examples.