import fs from 'node:fs';
import path from 'node:path';
import { fileURLToPath } from 'node:url';
import { createServer } from 'vite';
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
const repoRoot = path.resolve(__dirname, '..');
const webUiRoot = path.join(repoRoot, 'src/web-ui');
const outputPath = path.join(
repoRoot,
'src/apps/desktop/src/generated/startup_appearance_bootstrap.json',
);
const appearancePromptSnapshotOutputPath = path.join(
repoRoot,
'src/crates/assembly/core/src/agentic/tools/implementations/generated/appearance_prompt_snapshots.json',
);
const checkOnly = process.argv.includes('--check');
function normalizeGeneratedText(content) {
return String(content).replace(/\r\n?/g, '\n');
}
const server = await createServer({
root: webUiRoot,
logLevel: 'error',
appType: 'custom',
server: { middlewareMode: true },
optimizeDeps: {
entries: [],
noDiscovery: true,
},
});
try {
const [
{ builtinAppearancePalettes },
{ createStartupAppearanceBootstrapManifest },
{ createAppearancePromptSnapshotManifest },
] = await Promise.all([
server.ssrLoadModule('/src/infrastructure/appearance/builtins/palettes.ts'),
server.ssrLoadModule('/src/infrastructure/appearance/builtins/startupAppearanceBootstrap.ts'),
server.ssrLoadModule('/src/infrastructure/appearance/builtins/appearancePromptSnapshots.ts'),
]);
const generatedFiles = [
{
label: 'Startup appearance bootstrap manifest',
outputPath,
content: `${JSON.stringify(createStartupAppearanceBootstrapManifest(builtinAppearancePalettes), null, 2)}\n`,
},
{
label: 'Appearance prompt snapshot manifest',
outputPath: appearancePromptSnapshotOutputPath,
content: `${JSON.stringify(createAppearancePromptSnapshotManifest(builtinAppearancePalettes), null, 2)}\n`,
},
];
for (const generatedFile of generatedFiles) {
const currentContent = fs.existsSync(generatedFile.outputPath)
? fs.readFileSync(generatedFile.outputPath, 'utf8')
: null;
if (checkOnly) {
const currentContentForCheck = currentContent == null
? null
: normalizeGeneratedText(currentContent);
if (currentContentForCheck !== normalizeGeneratedText(generatedFile.content)) {
console.error(
`${generatedFile.label} is stale. Run \`pnpm run generate-startup-appearance-bootstrap\`.`,
);
process.exitCode = 1;
}
} else {
fs.mkdirSync(path.dirname(generatedFile.outputPath), { recursive: true });
fs.writeFileSync(generatedFile.outputPath, generatedFile.content, 'utf8');
console.log(`Generated ${path.relative(repoRoot, generatedFile.outputPath).replace(/\\/g, '/')}`);
}
}
} finally {
await server.close();
}