This repository is a collection of reusable Taskfile.yml templates plus project automation. Agents should prefer using task (go-task) and uv for day-to-day workflows.
- Install toolchain:
task setup - Run all checks like CI:
task validate - List tasks:
task --list(ortask --list-all)
- Python:
3.11.5(see.python-version) - Node:
v24.11.1(see.nvmrc/.pre-commit-config.yaml)
TASK_X_REMOTE_TASKFILES=1: enables go-task remote includes (used by CI workflows)SONAR_URL/SONAR_TOKEN: required fortask sonar:scan
- Setup dependencies:
task setup(creates.envfrom.env.exampleif missing; also runstask git:setupwhich updates.gitignoreand setsgit config github.reviews) - Python deps only (no git config changes):
task uv:setup - Format everything (Prettier + Python formatting):
task prettier - Run CI-style validations (pre-commit on all files):
task validate - Repo dependency checks:
task check
- Run all hooks:
uv run pre-commit run --all-files - Run one hook:
uv run pre-commit run <hook-id> --all-files - Run one hook on specific files:
uv run pre-commit run <hook-id> --files path/to/file - Run hooks on changed files only:
uv run pre-commit run - Install hooks locally:
task uv:precommit
See .pre-commit-config.yaml for the authoritative list of hooks (codespell, commitlint, shellcheck, gitleaks, hadolint, markdown-link-check, ...).
Python is managed with uv (see pyproject.toml, .python-version, Taskfile.yml).
- Install Python deps:
task uv:setup(runsuv sync --all-groups) - Format Python:
task uv:fmt(oruv run ruff format ./) - Lint + types:
task uv:lint(ruff check + mypy) - Typecheck only:
task uv:mypy
Run a single test (or subset) directly with pytest:
- One file:
uv run pytest tests/test_file.py -q - One test:
uv run pytest tests/test_file.py::test_name -q - By keyword:
uv run pytest -k "keyword" -q - Stop on first failure:
uv run pytest -x - Run a single parameterized case:
uv run pytest tests/test_file.py -k "case_name" -q
Note: the repo currently contains little/no first-party Python code; these commands mainly support tooling and template validation.
Some templates define Go tasks (see src/go/Taskfile.yml). This repo's default branch does not ship a go.mod, so these apply when you add/include a Go module.
- Format:
task go:fmt - Lint:
task go:lint - Test:
task go:test - Build:
task go:build
Run a single Go test without Taskfile:
- One package:
go test ./path/to/pkg -run TestName -count=1 - One file's package tests (from that package dir):
go test -run TestName -count=1 - Subtest only:
go test ./path/to/pkg -run TestName/Subtest -count=1
- Build docs:
task docs:build - Serve docs:
task docs:serve
- Generate full changelog:
task changelog:generate - Generate next-tag changelog:
task changelog:next APP_TAG=0.1.0 - Generate tag-only notes (used by release workflow):
task changelog:tag APP_TAG=0.1.0
- Respect
.editorconfig(LF, final newline, trim whitespace; 2-space indents by default, 4 for Python, tabs for Makefiles). - Prefer small, composable tasks over monolithic scripts.
- Avoid adding new build systems; integrate via
Taskfile.yml+ pre-commit when possible.
- Use
version: "3"and start files with---when other Taskfiles do. - Naming:
namespace:verb(examples in rootTaskfile.yml:uv:setup,docs:serve). - Add
desc:for anything user-facing; keep descriptions action-oriented. - Use
preconditions:for required tools/vars (pattern used acrosssrc/*/Taskfile.yml). - Prefer
{{.CLI_ARGS}}passthrough for tasks meant to be extended from the CLI. - Keep YAML simple: 2-space indents, quote strings that contain
:or special chars.
- Formatting:
ruff format(configured inpyproject.toml, line length 90). - Linting:
ruff checkwith isort rules enabled (import sorting is enforced by Ruff). - Types:
mypyis strict (disallow_untyped_defs = true,strict = true). Add type annotations for new Python code; keep public APIs typed. - Imports: group stdlib / third-party / local; avoid unused imports (
pyrightand Ruff report them). - Naming: follow PEP 8 naming (ruff includes
N/ pep8-naming); usesnake_casefor functions/vars,CapWordsfor classes,UPPER_SNAKE_CASEfor constants. - Error handling: raise specific exceptions; avoid
except Exception: pass; usecontextlib/pathlibhelpers over manual try/finally where it improves clarity.
- ESLint config lives at
.ci/linters/.eslintrc.js(no semicolons, double quotes). - Avoid
any(warn); unused args must be prefixed with_. - Promises: no floating promises; use
await/returnintentionally. - Equality/blocks:
eqeqeqandcurlyare enforced.
- ShellCheck runs in pre-commit (
.pre-commit-config.yaml). - Prefer POSIX-ish shell for portability; quote variables; use
set -euo pipefailin new scripts unless there is a strong reason not to.
- Prettier formats
*.md(see.ci/linters/prettier.config.cjs). - Don’t add brittle external links in docs unless necessary;
markdown-link-checkruns in pre-commit.
- Commit messages must follow Conventional Commits; commitlint runs via pre-commit (config:
.ci/linters/.commitlintrc.json). - Optional helper config:
.goji.jsondefines allowed commit types/scopes. - Prefer non-interactive, reproducible commands in tasks; CI expects
task ...to work without prompting.
README.mdis generated; follow the banner at the top ofREADME.md(editprovision/generators/README.yaml, then runtask readme)..envis loaded by Taskfile (dotenv:inTaskfile.yml). Treat.envas secret; do not commit it.- CI linting is primarily
pre-commit; if you change formatting/lint configs, runtask validatebefore opening a PR. - Secrets scanning:
gitleaksruns in pre-commit (config:.ci/linters/.gitleaks.toml). - Commit messages are enforced via commitlint (config:
.ci/linters/.commitlintrc.json); Conventional Commits are expected (seedocs/contributing.md).
- Local agent skill prompts live in
.claude/skills/(e.g..claude/skills/release/).
- Commands catalog:
docs/commands.md - Testing notes:
docs/testing.md - Contributing + commit conventions:
docs/contributing.md - Environment variables:
docs/env-vars.md - Release process:
docs/releasing.md - Usage overview:
docs/usage.md - Troubleshooting:
docs/troubleshooting.md
- No
.cursor/rules/,.cursorrules, or.github/copilot-instructions.mdwere found in this repository at the time this file was created.