utils/.github/workflows
Krzysztof kuhy Rudnicki 128ede438e ts_config: @kuhyx/ts-config, the one lint/TS bar every TypeScript repo extends
Evil Martians' "ten anti-AI-slop moves" as a package: strict tsconfig base
(noUncheckedIndexedAccess, exactOptionalPropertyTypes), type-checked
typescript-eslint strict+stylistic, unicorn/sonarjs/perfectionist, behaviour
rules for tests (expect-expect, no-focused-tests), React (hooks, @eslint-react,
jsx-a11y strict, you-might-not-need-an-effect), Playwright, and layer
boundaries via eslint-plugin-boundaries 7 with the article's default policies.
Knip / jscpd / Stryker bases; Stryker carries no break threshold on purpose.

Plugins are dependencies, not devDependencies: a flat config imports them from
this package's own node_modules, so a consumer installing from the git tag
gets them or the lint cannot run. No build step, so the tag needs no prepare.

test/fixture is a mini repo with one planted violation per rule family;
test/expected.js names the rule that must catch each, and the suite runs the
real CLI over it (in a child process -- v8 coverage merges natively-loaded
and transformed copies of the same module into "uncovered"). 35 tests, 100%
branch coverage on the factories.

eslint/fast.js is the type-free subset for a per-edit hook: 0.52 s cold on
one file, measured against 1.28 s for base() without types -- importing a
plugin is the cost, so it loads none, nor base.js which imports them.

Probed under ESLint 10: jsx-a11y 6.10.2 (peer says <=9) and boundaries 7.2.0
both run; the fixture pins that.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DnAYyNH1Sm4iJNidfYbrZJ
2026-09-16 21:40:08 +02:00
..
crdt-sync-dart-tests.yml crdt_sync_dart: latest stable + exact pins, 100% coverage, CI for both crdt_sync packages 2026-08-28 12:32:24 +02:00
crdt-sync-flutter-tests.yml crdt_sync_dart: latest stable + exact pins, 100% coverage, CI for both crdt_sync packages 2026-08-28 12:32:24 +02:00
crdt-sync-precommit.yml Cache .mypy_cache so mypy stops re-analysing the stdlib every run 2026-09-12 18:28:58 +02:00
crdt-sync-tests.yml Cache pre-commit hooks per package, and pip, so CI stops reinstalling 2026-09-12 18:16:51 +02:00
dependency-freshness.yml Refuse to overwrite utils' own checker with the delegate shim 2026-08-28 16:02:34 +02:00
design-system-tests.yml Wire design_system into CI, and drop EmptyState's speculative action slot 2026-08-14 23:08:59 +02:00
file-length.yml One Python per repo, always the newest, and the gate that enforces it 2026-08-28 20:58:19 +02:00
freedays-precommit.yml Cache .mypy_cache so mypy stops re-analysing the stdlib every run 2026-09-12 18:28:58 +02:00
freedays-tests.yml Cache pre-commit hooks per package, and pip, so CI stops reinstalling 2026-09-12 18:16:51 +02:00
gatelock-precommit.yml Cache .mypy_cache so mypy stops re-analysing the stdlib every run 2026-09-12 18:28:58 +02:00
gatelock-tests.yml Cache pre-commit hooks per package, and pip, so CI stops reinstalling 2026-09-12 18:16:51 +02:00
github-device-auth-tests.yml github_device_auth: extract the GitHub device flow from four apps 2026-08-15 15:57:19 +02:00
md-naming.yml Add the shared markdown-naming gate and migrate utils' own docs 2026-08-24 15:53:12 +02:00
music-theory-tests.yml music_theory: music theory from first principles, as code you can hear 2026-09-11 18:29:13 +02:00
palette-drift.yml One Python per repo, always the newest, and the gate that enforces it 2026-08-28 20:58:19 +02:00
shared-gates-tests.yml file_length: repo-local .file-length-exempt list, fail-closed, package tested to 100% 2026-09-12 18:53:19 +02:00
sync-settings-ui-tests.yml Add sync_settings_ui: shared Firebase-only sync settings screen 2026-08-12 23:10:17 +02:00
ts-config-tests.yml ts_config: @kuhyx/ts-config, the one lint/TS bar every TypeScript repo extends 2026-09-16 21:40:08 +02:00
ts-core-tests.yml Move ts_core and web_ui to vitest 5, React 19.3 and pnpm 12 2026-09-12 17:52:30 +02:00
web-ui-tests.yml Move ts_core and web_ui to vitest 5, React 19.3 and pnpm 12 2026-09-12 17:52:30 +02:00