Admin-only worker-management UI (Next.js 16) — onderdeel van M16 platform split
  • TypeScript 98.5%
  • CSS 0.8%
  • PLpgSQL 0.3%
  • JavaScript 0.2%
  • Dockerfile 0.1%
Find a file
2026-10-04 21:32:46 +02:00
.claude fix(messages): tabel terug naar 90% en tijden altijd relatief 2026-08-06 08:57:57 +02:00
.forgejo/workflows ci(ST-1613): begrens Vitest-concurrency op gedeelde runner 2026-10-02 17:23:04 +02:00
__tests__ test(ST-1625): laat kleurasserties de Vis-tokens controleren 2026-10-04 12:42:34 +02:00
actions feat(queue): Jobs linkt via verzoek-id naar Messages (M41 G8b) 2026-10-02 19:51:37 +02:00
app fix(M42): lijstrijen geen pilvorm (tool-list, multi-select) 2026-10-04 13:48:15 +02:00
components fix(M42): codex-poolbadge onderscheidbaar van idea 2026-10-04 13:49:39 +02:00
docs docs(ST-054): §7.8-controle uitgevoerd — geen stille modelwissel 2026-10-04 21:26:56 +02:00
hooks feat(ST-056): persist local table sorting safely 2026-10-01 15:55:31 +02:00
lib feat(messages): leesbare afzender voor dispatch-antwoorden 2026-10-03 10:22:03 +02:00
prisma fix(docker): create prisma/ dir before shell-redirect of generated schema 2026-05-26 20:36:20 +02:00
public fix(push): handel pushsubscriptionchange af — stille doodsoorzaak 2026-08-10 18:42:11 +02:00
scripts docs(queue): document pinned review document delivery and verification 2026-09-14 16:38:45 +02:00
stores fix(jobs): preserve attribution through realtime updates 2026-08-21 09:23:44 +02:00
vendor fix(ST-054): use active registry models for Codex job settings 2026-10-01 02:08:01 +02:00
.dockerignore feat: Dockerfile + Vitest config + docs 2026-05-26 19:12:18 +02:00
.env.example fix(worker-insights): eigen DB-URL voor Worker Logs/Insights (ISS-30) 2026-09-26 10:07:54 +02:00
.gitignore fix(git): node_modules-symlink uit de index halen 2026-08-06 09:02:34 +02:00
.gitmodules feat: add scrum4me-shared submodule + Prisma generate pipeline 2026-05-26 18:43:03 +02:00
AGENTS.md docs: Scrum4Me-product-binding (methodiek + product_id) 2026-05-29 09:08:42 +02:00
CLAUDE.md docs: apply agent guide startup contract (T-156) 2026-09-30 19:13:26 +02:00
Dockerfile feat(ST-044): add workers about build metadata 2026-08-21 11:32:18 +02:00
eslint.config.mjs fix(messages): cancel open queue requests 2026-08-25 16:55:01 +02:00
instrumentation.ts feat(ST-053): show and sort last successful token use 2026-09-27 20:24:38 +02:00
next.config.ts feat(ST-044): add workers about build metadata 2026-08-21 11:32:18 +02:00
package-lock.json fix(ST-055): align table adapter with reviewed contract 2026-10-01 05:45:23 +02:00
package.json fix(ST-055): align table adapter with reviewed contract 2026-10-01 05:45:23 +02:00
postcss.config.mjs feat: add Tailwind v4 + MD3 theme tokens (mirror from Scrum4Me) 2026-05-26 18:40:59 +02:00
prisma.config.ts fix(prisma-config): remove invalid earlyAccess + add datasource override (match Scrum4Me pattern) 2026-05-26 18:55:14 +02:00
proxy.ts feat(push): service worker, browserkant en proxy-uitzondering 2026-08-10 17:07:28 +02:00
README.md docs(IDEA-213): document dispatch rollout recovery and acceptance 2026-09-20 17:58:01 +02:00
tailwind.config.ts feat: add Tailwind v4 + MD3 theme tokens (mirror from Scrum4Me) 2026-05-26 18:40:59 +02:00
tsconfig.json feat(workers): add product and idea selectors to manual jobs 2026-06-04 14:53:53 +02:00
vitest.config.ts test: smoke-test for ported shadcn primitives 2026-05-26 22:00:06 +02:00

scrum4me-workers

Admin-only worker-management UI op workers.jp-visser.nl. Onderdeel van M16 platform split — zie Scrum4Me docs/specs/2026-05-26-scrum4me-platform-split-design.md.

Stack

  • Next.js 16 (App Router) + React 19 + TypeScript strict
  • Tailwind v4 + MD3-tokens
  • Prisma 7 (prisma generate only — designated migrator is scrum4me-web)
  • iron-session 8 (cookie s4m_workers_session, host-only)
  • Vitest + jsdom
  • Deploy: Docker op scrum4me-server, achter Caddy reverse-proxy

Schema

Canonical Prisma schema komt uit vendor/scrum4me-shared (Git-submodule). scripts/gen-schema.sh wraps gen-consumer-schema.sh en strips url= / directUrl= (Prisma 7 prisma.config.ts owns connection URLs). postinstall en prebuild invoke deze pipeline automatisch.

Auth

Workers-app accepteert alleen:

  • bestaande Scrum4Me-users (User-tabel, bcrypt password)
  • met een UserRole-row waar role = 'ADMIN'
  • niet-demo (User.is_demo = false)

Promote een gebruiker tot admin in scrum4me-web container:

docker compose exec scrum4me-web npx tsx scripts/promote-admin.ts <username>

Automatische uitvoering (IDEA-213)

De Messages-pagina heeft twee ingangen: Naar watcher (het ongewijzigde directe queuepad) en Automatisch uitvoeren (de centrale dispatchservice). Alleen de tweede gebruikt onderstaande configuratie.

Variabele Eigenaar Betekenis
S4M_DISPATCH_URL operator van deze deployment Basis-URL van de dispatchservice, bijv. https://<host>/dispatch/v1. Expliciete configuratie: de app accepteert nooit een URL die uit een opdracht komt.
DISPATCH_WORKERS_ASSERTION_KEY operator; gedeeld met de dispatchservice HMAC-SHA-256-sleutel voor de kortlevende serverassertie (issuer scrum4me-workers, audience queue-dispatch-v1, 30 s).

DISPATCH_WORKERS_ASSERTION_KEY wordt als UTF-8-bytes gelezen en moet minstens 32 bytes lang zijn — let op: bytes, niet tekens. De waarde moet exact gelijk zijn aan die van de dispatchservice (mcp/src/dispatch/server.ts leest dezelfde variabele op dezelfde manier); één teken verschil laat iedere actie op 401 stuklopen. De sleutel blijft serverzijdig: de browser krijgt hem nooit, en hij geeft geen toegang tot gewone MCP-tools. Gebruik een eigen sleutel per omgeving en deel hem niet met DISPATCH_WEB_ASSERTION_KEY van de hoofdapp.

Twee voorwaarden die niet in env staan en toch blokkeren:

  • De workers-principal heeft een globale ADMIN-rol nodig. Iedere actie leest de gebruiker vers uit de database (demo-vlag én UserRole.role = 'ADMIN'); een cookie van vóór een degradatie koopt niets.
  • queue_dispatch_reply_addresses moet gevuld zijn voordat iemand kan indienen. De dialoog biedt alleen de voor die gebruiker geregistreerde, enabled antwoordadressen aan; is de lijst leeg, dan is er geen geldig reply_to en kan er dus niets verstuurd worden. Een productbeheerder registreert ze vooraf via POST /reply-addresses.

Met de feature uit (S4M_DISPATCH_URL leeg, of een sleutel korter dan 32 bytes): de Messages-pagina blijft gewoon werken en de knop Automatisch uitvoeren blijft zichtbaar, maar de dialoog meldt bij openen dat automatische uitvoering op deze omgeving niet geconfigureerd is en de verstuurknop is uitgeschakeld. De keuzelijsten (producten, antwoordadressen, documenten, taken) komen uit de modellendatabase en blijven werken; er gaat geen enkel HTTP-verzoek naar de dispatchservice. Dit is bewust een zichtbare toestand en geen exception: Next reduceert een niet-afgevangen server-action-fout in productie tot een digest, waardoor DISPATCH_NOT_CONFIGURED de beheerder nooit bereikt.

Dev

git submodule update --init --recursive
cp .env.example .env       # vul DATABASE_URL + WORKERS_SESSION_SECRET
npm install
npm run dev                 # http://localhost:3010

Verify

npm run verify   # lint + typecheck + test
npm run build    # next build standalone