# Changelog

## 2026-08-04

- Replaced eslint with oxlint in the web templates, and added oxfmt as its own
  layer — oxlint does no formatting, so dropping eslint without it silently
  loses the indent, quote and semicolon rules. `eslint.config.js` gave way to
  `.oxlintrc.json`, `.oxfmtrc.json` and a `pnpm-workspace.yaml` that skips
  `@parcel/watcher`'s build script, which otherwise halts `pnpm install` for
  approval.
- Fixed the parallel-linter recipes. The trailing `wait` never propagated a
  failure — `sh -c 'true & false & wait; echo $?'` prints 0 — so the recipes now
  collect each job's pid and OR the results. `djlint --reformat` takes a
  `|| true`, since it exits non-zero whenever it rewrites a file.
- Moved `@eslint/js` and `globals` out of `dependencies`, where they had been
  misfiled and propagated into at least one bootstrapped project.
- Replaced the inert `args`/`user-invocable` frontmatter with `argument-hint`.

## 2026-07-03

- Added a GitHub Actions CI template: one `ubuntu-latest` job that installs uv
  and just, syncs the locked environment, then runs `just lint-all` and
  `just test-all`.
- Added `[project.scripts]` for CLI entry points, and three standing decisions:
  templates target the single pinned Python version (a library needing more
  tests them in a CI matrix), and pre-commit stays out, since the justfile and
  CI already cover formatting and linting.
- Loosened the pinned dev dependencies to floors (`pytest-cov>=7.1.0`,
  `pytest-xdist[psutil]>=3.8.0`), and swapped `.tox` out of `.gitignore` for
  `dist/`, `.ruff_cache/`, `.pytest_cache/` and `*.egg-info/`.
- Fixed the SCSS stylelint globs to match `.scss` rather than `.css`, and the
  eslint globs to match `*.js` rather than `*js`.

## 2026-03-16

- Split the skill into four files: `SKILL.md` plus `core-templates.md`,
  `web-templates.md` and `migration-guide.md`. `SKILL.md` had grown past 800
  lines of inline templates.

## 2026-03-07

- Widened the ruff select list — `ASYNC`, `FA`, `FBT`, `PL`, `S`, `T20` — and
  made the ignore list carry its reasons: `S101` for asserts in tests, `PLR0913`
  and `PLR2004` as too noisy, `C901` as too rigid, `G004` because f-strings in
  logging are fine. Added `per-file-ignores` for `tests/**`.
- Gave the `.bootstrap` stamp a time as well as a date, from
  `date '+%Y-%m-%d %H:%M:%S'`.
- Fixed the granian invocation: `--factory` for a factory function, and
  `--host`/`--port` as separate flags rather than `--bind`.

## 2026-03-06

- Added granian as the WSGI server, replacing uWSGI and gunicorn — no C compiler
  in the Docker build, one binary for WSGI and ASGI.
- Added the re-bootstrap flow and the `.bootstrap` / `.bootstrap-skill` stamp: a
  dated snapshot of `SKILL.md`, diffed on the next run to show what moved.

## 2026-03-03

- Added dcat as the issue tracker, with a `CLAUDE.md` template carrying the
  workflow, and `.issues.lock` in `.gitignore`.

## 2026-02-26

- Added the `.gitignore` template.

## 2026-02-21

- Added the Dockerfile template: multi-stage Alpine on the official uv image,
  `uv sync --no-dev --no-install-project` for dependencies only, source loaded
  through `PYTHONPATH`.

## 2026-02-20

- Added the whole web-application half — djlint, eslint flat config, stylelint,
  optional vitest, and the parallel `fmt`/`lint` recipes — and banned `npm`
  alongside black, isort, mypy, bandit, tox and setuptools.

## 2026-02-16

- Added the skill: one `SKILL.md` for a uv, ruff, pyright, vulture and pytest
  stack, with a justfile and a src/ layout.
