import { z } from 'zod' // Velden die de gebruiker invult bij create/edit. Status wordt door // server-actions gezet (niet door client-input). export const ideaCreateSchema = z.object({ title: z.string().trim().min(1, 'Titel is verplicht').max(200, 'Maximaal 200 tekens'), description: z.string().max(4000, 'Maximaal 4000 tekens').optional().nullable(), product_id: z.string().cuid('Ongeldig product').optional().nullable(), }) export const ideaUpdateSchema = ideaCreateSchema.partial() export type IdeaCreateInput = z.infer export type IdeaUpdateInput = z.infer // --------------------------------------------------------------------------- // plan_md frontmatter — strict format dat door make-plan-job geproduceerd // wordt en door materializeIdeaPlanAction wordt geparseerd. Zie // docs/plans/M12-ideas.md "Plan-md formaat A". const verifyRequiredEnum = z.enum(['ALIGNED', 'ALIGNED_OR_PARTIAL', 'ANY']) // Task-level priority is geaccepteerd in het schema voor backward-compat, // maar wordt door `materializeIdeaPlanAction` genegeerd ten faveure van // story-priority. Reden: worker sorteert op `priority ASC, sort_order ASC` // — gemixte task-priorities binnen één story zouden de YAML-volgorde // verstoren. Auteurs hoeven het veld dus niet meer in te vullen. const planTaskSchema = z.object({ title: z.string().min(1).max(200), description: z.string().max(4000).optional(), implementation_plan: z.string().max(8000).optional(), priority: z.number().int().min(1).max(4).optional(), verify_required: verifyRequiredEnum.optional(), verify_only: z.boolean().optional(), }) const planStorySchema = z.object({ title: z.string().min(1).max(200), description: z.string().max(4000).optional(), acceptance_criteria: z.string().max(4000).optional(), priority: z.number().int().min(1).max(4), tasks: z.array(planTaskSchema).min(1, 'Story moet minimaal 1 taak hebben'), }) const planPbiSchema = z.object({ title: z.string().min(1).max(200), description: z.string().max(4000).optional(), priority: z.number().int().min(1).max(4), }) export const ideaPlanMdFrontmatterSchema = z.object({ pbi: planPbiSchema, stories: z.array(planStorySchema).min(1, 'Plan moet minimaal 1 story bevatten'), }) export type IdeaPlanFrontmatter = z.infer export type IdeaPlanStory = z.infer export type IdeaPlanTask = z.infer