21-Feb-2026 — Migrations and Errors: 1 feature, 4 fixes, 1 build change and 1 chore #116
build 484 — commit 8fcd499
enforce lint consistently across frontend and server, fix all violations (#116)
- Add lint:frontend, lint:server, and lint:all scripts to package.json
- Update .githooks/pre-push to run lint:all (frontend + server) before push
- Add lint step to GitHub Actions CI workflow before unit tests
- Add server/ts-gen/** and CLI implementation files to ESLint ignores
- Fix all 213 server-side violations across 75 files:
- Object.keys/values → keys/values from es-toolkit/compat
- Array.isArray → isArray from es-toolkit/compat
- typeof checks → isString/isObject/isNumber from es-toolkit/compat
- console.log → cliLogger.log in CLI scripts
- new Date() → dateTimeNow() from server/lib/shared/dates
- Inline comments removed, logic expressed through named constructs
- All for/while/do-while loops replaced with recursive or declarative equivalents
resolve 104 pre-existing ESLint violations to unblock pre-push hook
- Remove Object.entries() lint rule (entries() not exported by es-toolkit/compat)
- Replace Object.keys/values and Array.isArray with es-toolkit/compat equivalents
- Replace typeof string/number checks with isString/isNumber from es-toolkit/compat
- Rewrite imperative for/while loops declaratively (Array.from, reduce, for...of, recursion)
- Extract named functions in place of inline explanatory comments
- Fix broken imports and TypeScript errors from previous incomplete fix attempt
- All 585 frontend and 499 server tests pass
migrations: handle invalid Brevo API key
Skip Brevo migrations gracefully on 401 unauthorised responses instead of throwing. Added both Brevo migrations to the pre-applied list so they are not re-run on environments that have already applied them.
migrations: skip Brevo migrations gracefully when no API key is configured
Environments without a Brevo config document caused configuredBrevo() to throw when accessing .value on null, failing the migration instead of skipping it. Separated the config lookup from the main migration logic so missing config is handled gracefully.
errors: handle ChunkLoadError after deployments with auto-reload
Add custom ErrorHandler that detects ChunkLoadError (caused by stale chunk references after deployment) and triggers a page reload. Uses sessionStorage with a 10-second cooldown per path to prevent infinite reload loops.
add claude-swarm lifecycle management and timed git hooks
- Add @annix/claude-swarm 0.1.12 as devDependency
- Add dev/stop npm scripts backed by claude-swarm
- Add claude-swarm.sh launcher (npm-based, no pnpm)
- Add .claude-swarm/config.json: frontend (port 4200) and server (port 5001) with logs directed to cli-output/logs
- Add run-frontend.sh: wraps npm run serve
- Add run-server.sh: loads secrets from non-vcs/secrets/secrets.${NGX_APP}.env safely (handles & in URLs), sets runtime env vars, starts tsx watch server
- Replace pre-push hook with timed version using @annix/claude-swarm/timer.sh: lint -> frontend tests -> server tests with ms-precision timing summary