Files
projectbrain-Public/scripts/check-source-library-readiness.mjs
T

39 lines
2.9 KiB
JavaScript

#!/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");