Generate .pre-commit-config.yaml from language and framework presets
Project description
pc-init
Generate a pre-commit or prek .pre-commit-config.yaml for your project from curated language and framework presets — so you get the right linters, formatters, and quality tools wired up with a single command instead of copying configs between repos.
Works with prek and pre-commit
Motivation
Every new repository needs a .pre-commit-config.yaml.
Each language and framework has its own recommended linters, formatters, and quality tools, each with its own hook URL and revision.
pc-init encodes those choices in version-controlled presets so you run one command instead of copying configs and looking up hook URLs.
The bundled presets pin specific hook revisions — run pre-commit autoupdate or prek autoupdate after generation to pull in the latest versions.
Awesome Pre-commit Hooks
The curated hooks bundled with pc-init are also published as a standalone reference at awesome-pre-commit-hooks — a browsable list of every hook organised by language and framework.
Installation
uv tool install pc-init
Quickstart
In an existing repository, let pc-init detect what's there and generate a config in one command:
cd my-project
pc-init --detect
Or specify languages and frameworks explicitly:
pc-init --lang py --framework django
Then install the hooks:
pre-commit install
# or
prek install
Usage
Usage: pc-init [OPTIONS] COMMAND [ARGS]...
Generate a .pre-commit-config.yaml for your project.
Options:
--lang TEXT Language preset to include (repeatable, or
comma-delimited: --lang=py,js). Run `pc-init list` to
see supported values from the active catalog.
--framework TEXT Framework preset to layer on top of language baselines
(repeatable, or comma-delimited: --framework=react,django).
Run `pc-init list` to see supported values from the
active catalog.
--force Overwrite existing .pre-commit-config.yaml without
prompting.
--detect Auto-detect languages and frameworks from the current
directory and merge them with any explicitly supplied
--lang/--framework values.
--output TEXT Output file path. [default: .pre-commit-config.yaml]
--presets TEXT Preset catalog to use. Accepts a local directory path or
a git repository URL (https://, git@, git://, ssh://).
The directory / repo root must contain lang/ and
framework/ subdirectories. Defaults to the bundled
presets.
--version Show version and exit.
--help Show this message and exit.
Commands:
list List available language and framework presets in the active catalog.
List available presets
Run pc-init list to discover all supported languages and frameworks in the active catalog (bundled or custom):
pc-init list
Languages:
docker, go, img, js, md, nb, py, ru, sh, sql, tf, toml, ts, yaml
Frameworks:
django, git, k8s, react, sphinx
Use --presets to list what a custom catalog provides:
pc-init list --presets /path/to/my-presets
pc-init list --presets https://github.com/org/my-presets
Supported presets
Languages — pass as --lang:
| ID | Language |
|---|---|
py |
Python |
js |
JavaScript |
go |
Go |
ru |
Rust |
sh |
Shell / Bash |
ts |
TypeScript |
nb |
Jupyter Notebooks |
md |
Markdown |
img |
Images |
docker |
Docker |
sql |
SQL |
tf |
Terraform |
toml |
TOML |
yaml |
YAML |
Language aliases python, javascript, typescript, rust, golang, shell, bash, image, notebook, jupyter, dockerfile, and terraform are also accepted.
Frameworks — pass as --framework:
| ID | Framework |
|---|---|
react |
React |
django |
Django |
sphinx |
Sphinx documentation |
git |
Commit message linting |
k8s |
Kubernetes |
Auto-detecting languages and frameworks
--detect scans the current directory, infers languages from file extensions and frameworks from indicator files, and uses the results exactly as if you had passed them with --lang and --framework.
pc-init --detect
Detected languages: md, py, yaml, sh, js
Detected frameworks: git
Generated .pre-commit-config.yaml with languages: md, py, yaml, sh, js and frameworks: git
Detected values are merged with any explicitly supplied flags — duplicates are dropped:
pc-init --detect --lang sql # adds sql on top of whatever is detected
If the file already exists and differs, the suggested overwrite command uses explicit --lang and --framework values so the re-run is fully deterministic:
Run with --force to overwrite '.pre-commit-config.yaml'.
Try: pc-init --lang=md,py,yaml,sh,js --framework=git --force
Language detection is based on file extensions (common vendored directories such as .git, node_modules, .venv, __pycache__, and dist are skipped):
| Extension(s) | Language |
|---|---|
.py, .pyi |
py |
.js, .mjs, .cjs, .jsx |
js |
.ts, .tsx |
ts |
.go |
go |
.rs |
ru |
.sh, .bash |
sh |
.sql |
sql |
.tf, .tfvars |
tf |
.md, .markdown |
md |
.ipynb |
nb |
.yaml, .yml |
yaml |
.r |
r |
.png, .jpg, .jpeg, .gif, .webp, .svg |
img |
Dockerfile (filename) |
docker |
Framework detection is based on indicator files:
| Indicator | Framework |
|---|---|
manage.py at the repo root |
django |
package.json with react in dependencies or devDependencies |
react |
conf.py (root or docs/) containing sphinx |
sphinx |
Any .yaml/.yml file outside .github/ containing apiVersion: and kind: |
k8s |
.github/workflows/ directory with at least one .yml file |
git |
Language suggestions for frameworks
Some framework presets declare the languages they are typically used with.
If none of your --lang selections match, pc-init prints an informational note and a ready-to-run command that adds the missing languages:
Note: preset 'react' recommends adding: --lang=js,ts
Try: pc-init --lang=go,js,ts --framework=react
The suggested command preserves your existing --lang values so it is safe to run with --force — no hooks you already selected will be removed.
Pass --recommended to apply all suggestions automatically in a single run:
pc-init --lang go --framework react --recommended
You can also omit --lang entirely when using --recommended with at least one framework — the recommended languages are used as the starting set:
pc-init --framework django --recommended
Examples
Auto-detect everything:
pc-init --detect
Auto-detect and add an extra language:
pc-init --detect --lang sql
Python project:
pc-init --lang py
JavaScript project with React:
pc-init --lang js --framework react
Python + Django, overwriting an existing config:
pc-init --lang py --framework django --force
Multiple languages (two equivalent forms):
pc-init --lang py --lang js
pc-init --lang=py,js
Django project, letting pc-init pick the language automatically:
pc-init --framework django --recommended
Custom presets
Point --presets at a local directory or a git repository that contains lang/ and framework/ subdirectories in the same layout as the bundled presets.
Local directory:
pc-init --lang py --presets /path/to/my-presets
Git repository:
pc-init --lang py --presets https://github.com/org/my-presets
Check the config files
To check the config files with pre-commit and prek for a specific language or framework:
pre-commit validate-config lang/py/preset.yaml
prek validate-config lang/py/preset.yaml
Update bundled presets
Update a config file with the command:
pre-commit autoupdate lang/py/preset.yaml
prek autoupdate lang/py/preset.yaml
Check and update all presets
To pull the latest hook revisions into all bundled preset files:
find . -name "preset*.yaml" | xargs -I{} prek validate-config {}
find . -name "preset*.yaml" | xargs -I{} prek autoupdate -c {}
find . -name "preset*.yaml" | xargs -I{} pre-commit validate-config {}
find . -name "preset*.yaml" | xargs -I{} pre-commit autoupdate -c {}
Contributing
See CONTRIBUTING.md for development setup, preset guidelines, and the pull request checklist.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file pc_init-0.4.0.tar.gz.
File metadata
- Download URL: pc_init-0.4.0.tar.gz
- Upload date:
- Size: 39.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b6ad7a33e16d9939a785698046426c411ed934f8808fa78bbf0c96cba9699f3c
|
|
| MD5 |
bf920b9058a93a51877e1876e4e9745d
|
|
| BLAKE2b-256 |
2abded62c81d89cf0ae59449a8f7e3920e501c2350367025c00ffa5a2e894a2a
|
Provenance
The following attestation bundles were made for pc_init-0.4.0.tar.gz:
Publisher:
test-build-publish.yml on cleder/gpc-init
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
pc_init-0.4.0.tar.gz -
Subject digest:
b6ad7a33e16d9939a785698046426c411ed934f8808fa78bbf0c96cba9699f3c - Sigstore transparency entry: 1971580871
- Sigstore integration time:
-
Permalink:
cleder/gpc-init@1c46641c566adb7f59ff6937bb94f7dcb69fb77c -
Branch / Tag:
refs/heads/main - Owner: https://github.com/cleder
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
test-build-publish.yml@1c46641c566adb7f59ff6937bb94f7dcb69fb77c -
Trigger Event:
push
-
Statement type:
File details
Details for the file pc_init-0.4.0-py3-none-any.whl.
File metadata
- Download URL: pc_init-0.4.0-py3-none-any.whl
- Upload date:
- Size: 42.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
bb79532805d3d7a3bca01c246ad8eff96e34b77ca3ca999e651f2bc642d03bcf
|
|
| MD5 |
4b56ae4c80deb6a694ba2c48866ca164
|
|
| BLAKE2b-256 |
fddde236d9f731fe30afced34e4c0c661d42e0af68cd5fe116b5f06d94d189b3
|
Provenance
The following attestation bundles were made for pc_init-0.4.0-py3-none-any.whl:
Publisher:
test-build-publish.yml on cleder/gpc-init
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
pc_init-0.4.0-py3-none-any.whl -
Subject digest:
bb79532805d3d7a3bca01c246ad8eff96e34b77ca3ca999e651f2bc642d03bcf - Sigstore transparency entry: 1971580973
- Sigstore integration time:
-
Permalink:
cleder/gpc-init@1c46641c566adb7f59ff6937bb94f7dcb69fb77c -
Branch / Tag:
refs/heads/main - Owner: https://github.com/cleder
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
test-build-publish.yml@1c46641c566adb7f59ff6937bb94f7dcb69fb77c -
Trigger Event:
push
-
Statement type: