- TypeScript 98.5%
- CSS 0.8%
- PLpgSQL 0.3%
- JavaScript 0.2%
- Dockerfile 0.1%
|
All checks were successful
CI / Verify (push) Successful in 3m38s
Reviewed-on: #130 |
||
|---|---|---|
| .claude | ||
| .forgejo/workflows | ||
| __tests__ | ||
| actions | ||
| app | ||
| components | ||
| docs | ||
| hooks | ||
| lib | ||
| prisma | ||
| public | ||
| scripts | ||
| stores | ||
| vendor | ||
| .dockerignore | ||
| .env.example | ||
| .gitignore | ||
| .gitmodules | ||
| AGENTS.md | ||
| CLAUDE.md | ||
| Dockerfile | ||
| eslint.config.mjs | ||
| instrumentation.ts | ||
| next.config.ts | ||
| package-lock.json | ||
| package.json | ||
| postcss.config.mjs | ||
| prisma.config.ts | ||
| proxy.ts | ||
| README.md | ||
| tailwind.config.ts | ||
| tsconfig.json | ||
| vitest.config.ts | ||
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 generateonly — 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 waarrole = '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 énUserRole.role = 'ADMIN'); een cookie van vóór een degradatie koopt niets. queue_dispatch_reply_addressesmoet 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 geldigreply_toen kan er dus niets verstuurd worden. Een productbeheerder registreert ze vooraf viaPOST /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