#!/usr/bin/env node import fs from "node:fs"; import path from "node:path"; const root = process.cwd(); const read = (file) => fs.readFileSync(path.join(root, file), "utf8"); const exists = (file) => fs.existsSync(path.join(root, file)); const failures = []; const requireFile = (file, reason) => { if (!exists(file)) failures.push(`${file}: ${reason}`); }; const requireIncludes = (file, needle, reason) => { if (!exists(file) || !read(file).includes(needle)) failures.push(`${file}: ${reason}`); }; requireFile("src/features/source-library/pages/SourceLibrary.tsx", "Source Library page must exist."); requireFile("src/shared/lib/projectSourceCommands.ts", "Source intake commands must exist."); requireFile("src/shared/lib/projectOperatingStep.ts", "Shared project operating-step helper must exist."); requireIncludes("src/app/routes.tsx", 'path="/projects/:projectId/source-library"', "Source Library route must be registered."); requireIncludes("src/shared/lib/navigation.tsx", "Source Library", "Navigation should expose Source Library."); requireIncludes("src/shared/lib/model.ts", "ProjectSourceItem", "Project model must preserve original source material."); requireIncludes("src/shared/lib/model.ts", "ProjectSourceAsset", "Project model must preserve extracted media/document assets."); requireIncludes("src/shared/lib/safeData.ts", "sourceLibrary: asArray", "Runtime normalization should keep sourceLibrary arrays safe."); requireIncludes("src/shared/lib/safeData.ts", "mediaAssets: asArray", "Runtime normalization should keep mediaAssets arrays safe."); requireIncludes("src/shared/contexts/ProjectContext.tsx", "addProjectSource", "ProjectContext should create source-library items."); requireIncludes("src/shared/contexts/ProjectContext.tsx", "promoteSourceToReview", "ProjectContext should promote sources to Review Queue."); requireIncludes("src/shared/lib/projectSourceCommands.ts", "const inferAssets", "Source intake should extract media/document asset candidates."); requireIncludes("src/shared/lib/projectSourceCommands.ts", "mediaAssets: [...assets", "Extracted source assets should persist with project media."); requireIncludes("src/features/operations/pages/CaptureCenter.tsx", "Source Library", "Capture Center should link to Source Library."); requireIncludes("src/features/operations/pages/DocumentationHub.tsx", "Source-backed documentation intake", "Documentation Hub should make the source/docs link visible."); requireIncludes("src/shared/lib/projectOperatingStep.ts", "Nieuwe opdracht geven", "The shared next-step layer should allow direct assignments without mandatory extra sources."); requireIncludes("src/shared/components/ProjectFlowRail.tsx", "source-library", "Project flow rail should include the source-library step."); if (failures.length) { console.error("ProjectBrain source library readiness: FAIL"); failures.forEach((failure) => console.error(`- ${failure}`)); process.exit(1); } console.log("ProjectBrain source library readiness: PASS");