import bcrypt from "bcryptjs"; import { PrismaClient } from "../lib/generated/prisma/client"; import { PrismaBetterSqlite3 } from "@prisma/adapter-better-sqlite3"; import { readFileSync, mkdirSync, copyFileSync, existsSync } from "fs"; import path from "path"; const adapter = new PrismaBetterSqlite3({ url: process.env.DATABASE_URL || "file:./prisma/data/marketing.db", }); const prisma = new PrismaClient({ adapter }); function readKnowledgeFile(filename: string): string | null { const filePath = path.join(__dirname, "..", "pipeline", "knowledge", filename); try { return readFileSync(filePath, "utf-8"); } catch { console.warn(`Knowledge file not found: ${filePath}`); return null; } } async function main() { // Seed admin user const email = process.env.ADMIN_EMAIL || "admin@localhost"; const password = process.env.ADMIN_PASSWORD || "admin123"; await prisma.user.upsert({ where: { email }, update: {}, create: { email, password: await bcrypt.hash(password, 12), name: "Admin", }, }); console.log(`Admin user created: ${email}`); // Seed honeyDue app const brandIdentity = readKnowledgeFile("brand_identity.md"); const productInfo = readKnowledgeFile("product_campaign.md"); const platformGuidelines = readKnowledgeFile("platform_guidelines.md"); const app = await prisma.app.upsert({ where: { slug: "honeydue" }, update: { brandIdentity, productInfo, platformGuidelines, }, create: { name: "honeyDue", slug: "honeydue", description: "Home maintenance tracking app", primaryColor: "#0079FF", accentColor: "#FF9400", darkBg: "#1a1a2e", brandIdentity, productInfo, platformGuidelines, }, }); console.log(`App created: ${app.name} (${app.slug})`); // Backfill existing campaigns with appId const updated = await prisma.campaign.updateMany({ where: { appId: null }, data: { appId: app.id }, }); console.log(`Backfilled ${updated.count} campaigns with appId`); // Copy assets to pipeline/apps/honeydue/ const pipelineRoot = path.join(__dirname, "..", "pipeline"); const appAssetsDir = path.join(pipelineRoot, "apps", "honeydue"); const screenshotsDir = path.join(appAssetsDir, "screenshots"); mkdirSync(screenshotsDir, { recursive: true }); const assetsToCopy = [ { src: path.join(pipelineRoot, "assets", "icon.png"), dest: path.join(appAssetsDir, "icon.png") }, { src: path.join(pipelineRoot, "assets", "phone.png"), dest: path.join(appAssetsDir, "phone.png") }, { src: path.join(pipelineRoot, "assets", "screenshots", "tasks_overdue.png"), dest: path.join(screenshotsDir, "tasks_overdue.png") }, ]; for (const { src, dest } of assetsToCopy) { if (existsSync(src)) { copyFileSync(src, dest); console.log(`Copied ${path.basename(src)} → apps/honeydue/`); } else { console.warn(`Asset not found: ${src}`); } } } main() .catch((e) => { console.error(e); process.exit(1); }) .finally(() => prisma.$disconnect());