import { readFileSync } from "node:fs"; import { cp } from "node:fs/promises"; import { dirname, join } from "node:path"; import { fileURLToPath } from "node:url"; function resolveToolsPackRoot(startDir: string): string { const maxDepth = 6; let current = startDir; for (let depth = 0; depth < maxDepth; depth += 1) { try { const raw = readFileSync(join(current, "package.json"), "utf8"); const parsed = JSON.parse(raw) as { name?: unknown }; if (parsed.name === "@open-design/tools-pack") { return current; } } catch { // Keep walking until we find the tools-pack package root. } const parent = dirname(current); if (parent === current) break; current = parent; } throw new Error(`tools-pack: unable to resolve package root from ${startDir}`); } export const toolsPackRoot = resolveToolsPackRoot(dirname(fileURLToPath(import.meta.url))); export const resourcesRoot = join(toolsPackRoot, "resources"); export const macResources = { entitlements: join(resourcesRoot, "mac", "entitlements.mac.plist"), entitlementsInherit: join(resourcesRoot, "mac", "entitlements.mac.inherit.plist"), icon: join(resourcesRoot, "mac", "icon.icns"), iconPng: join(resourcesRoot, "mac", "icon.png"), notarizeHook: join(resourcesRoot, "mac", "notarize.cjs"), webStandaloneAfterPackHook: join(resourcesRoot, "mac", "web-standalone-after-pack.cjs"), } as const; export const winResources = { icon: join(resourcesRoot, "win", "icon.ico"), } as const; export const linuxResources = { icon: join(resourcesRoot, "linux", "icon.png"), desktopTemplate: join(resourcesRoot, "linux", "open-design.desktop.template"), } as const; const BUNDLED_RESOURCE_TREES = [ { from: "skills", to: "skills" }, { from: "design-systems", to: "design-systems" }, { from: "craft", to: "craft" }, { from: join("assets", "frames"), to: "frames" }, { from: join("assets", "community-pets"), to: "community-pets" }, { from: "prompt-templates", to: "prompt-templates" }, ] as const; export async function copyBundledResourceTrees({ workspaceRoot, resourceRoot, }: { workspaceRoot: string; resourceRoot: string; }): Promise { for (const entry of BUNDLED_RESOURCE_TREES) { await cp(join(workspaceRoot, entry.from), join(resourceRoot, entry.to), { recursive: true, }); } }