claude/friendly-williamson-02ff6b #3
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "claude/friendly-williamson-02ff6b"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Wat: Per-product documentatie-feature (PBI-96) — elk product krijgt de 8-folder docs-tree die Scrum4Me zelf gebruikt (adr/, architecture/, patterns/, plans/, runbooks/, specs/, manual/, api/), per product configureerbaar via folder-toggles, beheerd via een in-app markdown-editor.
Hoe: DB-storage (product_docs + product_doc_logs), 5 server-actions (create/update/delete/toggle/list), 4 UI-pages onder /products/[id]/docs/ (INDEX + folder + viewer/editor + settings), sub-nav-integratie via ProductSubNav, en een herbruikbare MarkdownDocEditor (geëxtraheerd uit idea-md-editor.tsx — beide editors delen nu dezelfde stack).
Reviews verwerkt: P1 (delete-audit FK-race), P2 (frontmatter sync + last_updated normalisatie, disabled-folder semantiek), P3 (denormalized actor-velden + index). Audit-rapporten in docs/recommendations/.
Plan: docs/plans/PBI-96-product-docs.md
Audit: docs/recommendations/PBI-96-demo-audit-2026-05-16.md
Spec: docs/specs/dialogs/product-doc.md + docs/specs/functional.md §F-15
Stories (6 totaal, alle DONE)
Story Code Wat
A ST-1379 DB-schema + migratie + Zod-schemas + parser + frontmatter-serializer (P2-fix) + slug-helpers
B ST-1380 5 server-actions + rate-limit-keys + 28 tests (P1 + P2 volledig dekkend)
C ST-1381 MarkdownDocEditor-extractie + idea-md-editor refactor naar wrapper
D ST-1382 4 pages + 10 componenten + dialog-spec + DisabledFolderBanner
E ST-1383 /docs/settings + folder-toggle + ProductSubNav (Backlog/Sprint/Solo/Docs/Instellingen)
F ST-1384 Demo-policy audit + architecture-breadcrumb + functional-spec F-15
Verificatie
1022 tests groen (70 nieuw t.o.v. baseline 952). De pre-existing fail in tests/components/idea-timeline-merge.test.ts blijft buiten scope (DATABASE_URL niet beschikbaar in worktree-env; geen regressie).
Lint + typecheck schoon.
Schema valid (npx prisma format + validate).
Migration handmatig geschreven volgens claude_job-pattern; DEFAULT ARRAY[...]::ProductDocFolder[] vult bestaande producten automatisch (geen backfill).
Test plan (handmatige e2e — 10 stappen uit plan §Verificatie)
npm run dev → login als seed-user
Open product → tab Docs → INDEX toont 8 lege folders
"Nieuwe doc" in runbooks → save → viewer-redirect; check last_updated = today
Edit doc met user-supplied last_updated: 2020-01-01 → save → server-normalisatie overschrijft naar today
/docs/settings → toggle api uit → INDEX toont 7 folders; directe URL /docs/api → 200 met DisabledFolderBanner; flip terug → folder weer in INDEX
Yaml-fout introduceren → save geblokkeerd; error-box met line-info
Delete → confirm → doc weg; product_doc_logs heeft rij met type=DELETED, doc_id=null, metadata {folder, slug, title}
Andere user zonder ProductMember → directe URL → 404 (anti-enum)
Demo-user → docs lezen werkt, write-knoppen disabled met DemoTooltip; directe action-call → 403
ProductMember (niet-owner) → lezen + schrijven docs OK; /docs/settings read-only
npm run verify && npm run build groen
Bestanden gewijzigd (42 totaal)
Schema/migratie (2): prisma/schema.prisma, prisma/migrations/20260516100000_add_product_docs/migration.sql
Libs (7 nieuw): schemas + folder-mapper + parser + frontmatter-serializer + slug-helpers + server-helper + rate-limit-edit
Actions (1 nieuw): actions/product-docs.ts
Pages (4 nieuw): INDEX + settings + folder + folder/slug
Layout edit (1): hook
Componenten (12 nieuw): 10 in components/product-docs/ + 1 in components/products/ + 1 in components/shared/ (MarkdownDocEditor)
Refactor (1): idea-md-editor.tsx -146 / +31 (wrapper rond shared)
Tests (5 nieuw): 70 tests over schemas, slug, parser, frontmatter, shared editor, actions
Docs (6): plan, architecture-topical + breadcrumb, functional F-15, demo-audit, dialog-spec, INDEX-regen
- lib/product-doc-parser.ts: parseProductDocMd(md) → {ok, frontmatter, body} | {ok:false, errors[]} met line-info bij YAML-fouten. Pattern gespiegeld uit lib/idea-plan-parser.ts. - lib/product-doc-frontmatter.ts: setProductDocFrontmatterFields(md, patch) laat de server `last_updated` server-side normaliseren (P2-review-fix uit docs/recommendations/product-docs-storage-system-review-2026-05-16). Gebruikt yaml.parseDocument om field-ordering best-effort te behouden. - todayIsoDate() helper voor 'yyyy-mm-dd' string. - __tests__: 19 nieuwe tests groen — parse-success/fail-paden, en expliciete P2-coverage (vervangen + toevoegen last_updated, behoud overige velden + body). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>- app/(app)/products/[id]/docs/[folder]/[slug]/page.tsx: server-route die doc laadt (scope-checked via productAccessFilter), frontmatter parseert, en op basis van ?edit=1 viewer of editor toont. Fallback voor unparseable frontmatter toont errors + raw content in <pre>. - product-doc-viewer.tsx: server-component met frontmatter-kop (title + status-badge + audience/applies_to/last_updated meta) en body via <Markdown> (XSS-safe). - product-doc-editor.tsx: client-wrapper rond MarkdownDocEditor met parseProductDocMd validator + updateProductDocAction + cancelHref. - delete-product-doc-button.tsx: AlertDialog confirm + delete-action + DemoTooltip + redirect-na-success. Disabled in demo. - Edit-knop conditioneel verborgen bij disabled folder (T-1071 voegt banner toe); delete blijft altijd zichtbaar voor cleanup. - Button met `render={<Link/>}` ipv asChild (CLAUDE.md hardstop base-ui pattern). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>