2025-10-29 21:16:09 -04:00
---
2025-10-18 09:14:10 -04:00
repos :
# General hooks for all files
- repo : https://github.com/pre-commit/pre-commit-hooks
rev : v4.6.0
hooks :
- id : trailing-whitespace
- id : end-of-file-fixer
- id : check-merge-conflict
- id : check-added-large-files
- id : check-yaml
- id : check-json
- id : check-toml
- id : mixed-line-ending
2026-06-19 17:00:57 -04:00
# Markdown linting
- repo : https://github.com/igorshubovych/markdownlint-cli
rev : v0.45.0
hooks :
- id : markdownlint
2026-07-02 07:21:18 -04:00
entry : bash -c 'if [ "${CI:-}" = "true" ]; then markdownlint "$@"; else markdownlint --fix "$@"; fi' --
2026-06-19 17:00:57 -04:00
files : \.(md|markdown)$
2025-10-18 09:14:10 -04:00
# TOML linting
- repo : https://github.com/macisamuele/language-formatters-pre-commit-hooks
rev : v2.14.0
hooks :
- id : pretty-format-toml
2026-07-02 07:21:18 -04:00
entry : bash -c 'if [ "${CI:-}" = "true" ]; then pretty-format-toml "$@"; else pretty-format-toml --autofix "$@"; fi' --
2025-10-18 09:14:10 -04:00
# Python backend linting and formatting with ruff
2025-10-19 21:35:02 -04:00
- repo : local
2025-10-18 09:14:10 -04:00
hooks :
# Linter
- id : ruff
2025-10-19 21:35:02 -04:00
name : ruff-lint
2026-07-02 07:21:18 -04:00
entry : bash -c 'cd backend && if [ "${CI:-}" = "true" ]; then uv run ruff check . --config=pyproject.toml; else uv run ruff check --fix . --config=pyproject.toml; fi'
2025-10-19 21:35:02 -04:00
language : system
2025-10-18 09:14:10 -04:00
files : ^backend/
2025-10-19 21:35:02 -04:00
types : [ python]
2025-10-30 10:02:17 -04:00
pass_filenames : false
2025-10-18 09:14:10 -04:00
# Formatter
- id : ruff-format
2025-10-19 21:35:02 -04:00
name : ruff-format
2026-07-02 07:21:18 -04:00
entry : bash -c 'cd backend && if [ "${CI:-}" = "true" ]; then uv run ruff format --check . --config=pyproject.toml; else uv run ruff format . --config=pyproject.toml; fi'
2025-10-19 21:35:02 -04:00
language : system
2025-10-18 09:14:10 -04:00
files : ^backend/
2025-10-19 21:35:02 -04:00
types : [ python]
2025-10-30 10:02:17 -04:00
pass_filenames : false
2025-10-18 09:14:10 -04:00
# Python type checking with pyright
2025-10-19 21:35:02 -04:00
- repo : local
2025-10-18 09:14:10 -04:00
hooks :
- id : pyright
2025-10-19 21:35:02 -04:00
name : pyright
2025-10-30 10:02:17 -04:00
entry : bash -c 'cd backend && uv run pyright . --project=.'
2025-10-19 21:35:02 -04:00
language : system
2025-10-18 09:14:10 -04:00
files : ^backend/
2025-10-19 21:35:02 -04:00
types : [ python]
pass_filenames : false
2025-10-18 09:14:10 -04:00
2026-04-08 09:45:49 -04:00
# Python docstring linting with pydoclint
2025-10-19 21:35:02 -04:00
- repo : local
2025-10-18 21:29:28 -04:00
hooks :
2026-04-08 09:45:49 -04:00
- id : pydoclint
name : pydoclint
entry : bash -c 'cd backend && uv run pydoclint --config=pyproject.toml src/'
2025-10-19 21:35:02 -04:00
language : system
2025-10-18 21:29:28 -04:00
files : ^backend/.*\.py$
2025-10-19 21:35:02 -04:00
types : [ python]
2025-10-30 10:02:17 -04:00
pass_filenames : false
2025-10-18 21:29:28 -04:00
2026-07-13 22:19:57 -04:00
- id : bandit
name : bandit
entry : bash -c 'cd backend && uv run bandit -q -r src/backend'
language : system
files : ^backend/src/backend/.*\.py$
types : [ python]
pass_filenames : false
2025-10-18 21:29:28 -04:00
# Custom hook to enforce no types in docstrings
- repo : local
hooks :
- id : no -docstring-types
name : Prohibit types in docstrings
entry : python scripts/check_no_docstring_types.py
language : system
files : ^backend/.*\.py$
pass_filenames : true
2025-10-18 09:14:10 -04:00
# Frontend linting and formatting
- repo : local
hooks :
2025-10-30 10:02:17 -04:00
# ESLint with auto-fix for pre-commit (CI uses --no-fix)
2025-10-18 09:14:10 -04:00
- id : eslint
name : eslint
2026-06-18 11:19:24 -04:00
entry : bash -c 'export PATH="$HOME/.local/share/mise/shims:$HOME/.local/bin:$PATH" && cd frontend && if [ "${CI:-}" = "true" ]; then corepack yarn eslint . --max-warnings=0; else corepack yarn eslint . --fix; fi'
2025-10-18 09:14:10 -04:00
language : system
files : ^frontend/.*\.(js|ts|vue)$
pass_filenames : false
2025-10-30 10:02:17 -04:00
# Prettier with auto-format for pre-commit (CI uses --check)
2025-10-18 09:14:10 -04:00
- id : prettier
name : prettier
2026-06-19 17:00:57 -04:00
entry : bash -c 'export PATH="$HOME/.local/share/mise/shims:$HOME/.local/bin:$PATH" && FILES=(); for file in "$@"; do FILES+=("$(realpath "$file")"); done && if [ "${CI:-}" = "true" ]; then corepack yarn --cwd frontend prettier --check "${FILES[@]}"; else corepack yarn --cwd frontend prettier --write "${FILES[@]}"; fi' --
2025-10-18 09:14:10 -04:00
language : system
2026-06-19 17:00:57 -04:00
files : \.(js|ts|vue|json|css|scss|md|markdown)$
pass_filenames : true
2025-10-18 21:31:34 -04:00
2025-10-30 10:02:17 -04:00
# TypeScript type checking (same as CI)
2025-10-18 21:31:34 -04:00
- id : typescript-check
name : typescript-check
2026-06-18 11:19:24 -04:00
entry : bash -c 'export PATH="$HOME/.local/share/mise/shims:$HOME/.local/bin:$PATH" && cd frontend && corepack yarn vue-tsc --noEmit'
2025-10-18 21:31:34 -04:00
language : system
files : ^frontend/.*\.(ts|vue)$
pass_filenames : false
2025-10-30 10:02:17 -04:00
# TSDoc linting with auto-fix for pre-commit (CI uses --no-fix)
2025-10-18 21:31:34 -04:00
- id : tsdoc-lint
name : tsdoc-lint
2026-06-18 11:19:24 -04:00
entry : bash -c 'export PATH="$HOME/.local/share/mise/shims:$HOME/.local/bin:$PATH" && cd frontend && if command -v yarn >/dev/null 2>&1; then if [ "${CI:-}" = "true" ]; then yarn eslint . --ext .ts,.vue --max-warnings=0; else yarn eslint . --ext .ts,.vue --fix; fi; else if [ "${CI:-}" = "true" ]; then corepack yarn eslint . --ext .ts,.vue --max-warnings=0; else corepack yarn eslint . --ext .ts,.vue --fix; fi; fi'
2025-10-18 21:31:34 -04:00
language : system
files : ^frontend/.*\.(ts|vue)$
pass_filenames : false