import fs from 'node:fs'; import path from 'node:path'; const root = path.resolve(new URL('..', import.meta.url).pathname); function read(relativePath) { return fs.readFileSync(path.join(root, relativePath), 'utf8'); } function assertIncludes(label, source, snippet) { if (!source.includes(snippet)) { throw new Error(`${label} is missing required guard snippet:\n${snippet}`); } } const serverSource = read('server.mjs'); const pagesSource = read('mindspace-pages.mjs'); const contractSource = read('mindspace-server-adapter-contract.mjs'); assertIncludes( 'server.mjs syncUserGeneratedPages', serverSource, 'await mindSpacePageSync.syncUserGeneratedPages(userId);', ); if (serverSource.includes("mindSpaceServerRuntime.adapterKind === 'remote'")) { throw new Error( 'server.mjs must not skip page sync in remote mode; use pageSyncService RPC instead', ); } assertIncludes( 'mindspace-server-adapter-contract.mjs', contractSource, "pageSyncService: Object.freeze(['syncUserGeneratedPages'])", ); assertIncludes( 'mindspace-pages.mjs', pagesSource, 'readPageContentWithWorkspaceFallback', ); assertIncludes( 'mindspace-pages.mjs workspace fallback', pagesSource, "snapshot.relative_path ?? null", ); const publicSiteBasesSource = read('src/utils/public-site-bases.mjs'); const publicUrlSource = read('src/utils/publicUrl.ts'); const buildRuntimeSource = read('scripts/build-portal-runtime.mjs'); assertIncludes( 'public-site-bases.mjs loopback guard', publicSiteBasesSource, 'isLoopbackPublicBase', ); assertIncludes( 'publicUrl.ts uses public-site-bases', publicUrlSource, "from './public-site-bases.mjs'", ); assertIncludes( 'build-portal-runtime.mjs production plaza default', buildRuntimeSource, 'https://plaza.tkmind.cn', ); console.log('mindspace page sync + thumbnail regression guards ok');