14 Commits

Author SHA1 Message Date
8a12744 ce55cfc6b3 feat(email): require verified approval email
Backfill approved legacy users with verified emails and replace the old unverified-email warning setting with a single approval email policy.
2026-05-06 22:12:23 +08:00
8a12744 6afc5817a7 feat(auth): require verified email for approval 2026-05-06 20:57:54 +08:00
8a12744 7f9ac0957c feat(admin): improve record management 2026-05-05 20:26:26 +08:00
8a12744 73d476bcea feat(email): add admin notification settings 2026-05-05 13:38:34 +08:00
8a12744 a780c1bf52 feat(email): extract notification templates 2026-05-05 12:18:18 +08:00
8a12744 344cfe4947 feat(tests): fix warning and correct path 2026-05-05 11:16:48 +08:00
8a12744 3ab845798d feat(backend): add automatic DB migrations
Add a lightweight migration runner with schema_migrations tracking, run pending migrations during backend startup before the scheduler, and keep a manual backend-migrate entrypoint.

The change also moves the existing lockout and task-thread-ID schema steps into shared migration modules, updates docs, and archives the OpenSpec change.
2026-05-05 01:36:58 +08:00
8a12744 e243dccfd7 feat(backend): harden task boundaries 2026-05-05 00:55:29 +08:00
8a12744 f939a50950 refactor(backend): adopt typed SQLAlchemy models 2026-05-04 22:05:33 +08:00
8a12744 d811c20932 feat(backend): replace Selenium with Playwright
BREAKING CHANGE: backend now requires Python 3.12 or newer.
2026-05-04 21:20:30 +08:00
8a12744 ab68f019c5 style(backend): apply ruff format 2026-05-03 18:14:23 +08:00
8a12744 738217d9c9 fix(backend): use jwt exception names 2026-05-03 18:10:55 +08:00
8a12744 f8dcf6e3d3 build(backend): manage dependencies with uv
BREAKING CHANGE: apps/backend/requirements.txt is no longer the backend dependency source. Use uv sync and uv run python main.py for backend setup and startup.
2026-05-03 17:19:27 +08:00
8a12744 d4d6f87730 refactor(structure): reorganize app layout
BREAKING CHANGE: root backend/frontend directories and old run/manage entrypoints were removed. Use apps/backend, apps/frontend, and python main.py commands instead.
2026-05-03 16:43:11 +08:00