@sudajs/cli 0.5.0 → 0.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +12 -6
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1530,11 +1530,13 @@ async function publishTheme(root, skipBuild, skipCheck, force) {
|
|
|
1530
1530
|
throw new Error(`Missing presigned URL for ${file.relativePath}`);
|
|
1531
1531
|
}
|
|
1532
1532
|
const body = await readFile(file.absolutePath);
|
|
1533
|
+
const uploadHeaders = { "Content-Type": file.contentType };
|
|
1534
|
+
if (urlObj.headers) {
|
|
1535
|
+
Object.assign(uploadHeaders, urlObj.headers);
|
|
1536
|
+
}
|
|
1533
1537
|
const putRes = await fetch(urlObj.url, {
|
|
1534
1538
|
method: "PUT",
|
|
1535
|
-
headers:
|
|
1536
|
-
"Content-Type": file.contentType
|
|
1537
|
-
},
|
|
1539
|
+
headers: uploadHeaders,
|
|
1538
1540
|
body
|
|
1539
1541
|
});
|
|
1540
1542
|
if (!putRes.ok) {
|
|
@@ -1638,12 +1640,10 @@ async function initTheme(target) {
|
|
|
1638
1640
|
typecheck: "tsc -p tsconfig.json --noEmit",
|
|
1639
1641
|
validate: "suda theme validate --theme-root ."
|
|
1640
1642
|
},
|
|
1641
|
-
dependencies: {
|
|
1642
|
-
"@sudajs/theme-engine": cliPackageVersions.themeEngine
|
|
1643
|
-
},
|
|
1644
1643
|
devDependencies: {
|
|
1645
1644
|
"@puckeditor/core": "^0.21.2",
|
|
1646
1645
|
"@sudajs/cli": cliPackageVersions.cli,
|
|
1646
|
+
"@sudajs/theme-engine": cliPackageVersions.themeEngine,
|
|
1647
1647
|
"@types/node": "^22.0.0",
|
|
1648
1648
|
"@types/react": "^19.0.0",
|
|
1649
1649
|
"@types/react-dom": "^19.0.0",
|
|
@@ -1653,6 +1653,12 @@ async function initTheme(target) {
|
|
|
1653
1653
|
},
|
|
1654
1654
|
peerDependencies: {
|
|
1655
1655
|
"@puckeditor/core": "^0.21.2",
|
|
1656
|
+
// Themes are consumed by hosts (workspace/site/worker) that already
|
|
1657
|
+
// ship a copy of `@sudajs/theme-engine`. Declaring it as a peer means
|
|
1658
|
+
// hosts can patch/minor-bump the engine without forcing every theme
|
|
1659
|
+
// to re-publish, while CLI/dev installs still get a working version
|
|
1660
|
+
// via devDependencies.
|
|
1661
|
+
"@sudajs/theme-engine": cliPackageVersions.themeEngine,
|
|
1656
1662
|
react: "^19.0.0",
|
|
1657
1663
|
"react-dom": "^19.0.0"
|
|
1658
1664
|
}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/auth.ts","../src/index.ts"],"names":["path","protocolForHost","esbuild","context","esbuildContext","require","theme"],"mappings":"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","file":"index.js","sourcesContent":["import fs from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\n\ninterface AuthConfig {\n /**\n * The `suda_<...>` API-token plaintext issued by `/api/cli-auth/poll` and\n * verified by the workspace `requireApiAuth` helper. The `sessionToken`\n * key name is a historical artefact; the value is the API token itself.\n */\n sessionToken: string;\n host: string;\n}\n\nfunction getConfigPath() {\n return path.join(os.homedir(), \".config\", \"suda\", \"config.json\");\n}\n\nexport async function readAuthConfig(): Promise<AuthConfig | null> {\n try {\n const configPath = getConfigPath();\n const content = await fs.readFile(configPath, \"utf-8\");\n return JSON.parse(content) as AuthConfig;\n } catch {\n return null;\n }\n}\n\nexport async function writeAuthConfig(config: AuthConfig): Promise<void> {\n const configPath = getConfigPath();\n await fs.mkdir(path.dirname(configPath), { recursive: true });\n await fs.chmod(path.dirname(configPath), 0o700).catch(() => undefined);\n await fs.writeFile(configPath, JSON.stringify(config, null, 2), { mode: 0o600 });\n}\n\nexport async function clearAuthConfig(): Promise<void> {\n const configPath = getConfigPath();\n try {\n await fs.unlink(configPath);\n } catch (err: unknown) {\n if (err instanceof Error && \"code\" in err && (err as { code: string }).code !== \"ENOENT\") {\n throw err;\n }\n }\n}\n\nfunction protocolForHost(host: string): \"http\" | \"https\" {\n return host.includes(\"localhost\") || host.includes(\"127.0.0.1\") ? \"http\" : \"https\";\n}\n\n/**\n * Thrown by {@link cliAuthFetch} when the workspace API rejects the stored\n * CLI token. Carries the structured `error` code returned by the server (see\n * `apps/workspace/server/lib/api-auth.ts`) so callers can distinguish\n * \"expired\" from \"revoked\" without parsing strings.\n */\nexport class CliAuthExpiredError extends Error {\n readonly code: \"token_invalid\" | \"token_revoked\" | \"token_expired\" | \"unauthorized\";\n constructor(\n code: CliAuthExpiredError[\"code\"],\n message: string,\n ) {\n super(message);\n this.name = \"CliAuthExpiredError\";\n this.code = code;\n }\n}\n\n/**\n * Wrapper around `fetch` that automatically attaches the stored CLI token,\n * detects expired/revoked sessions, clears the local config and surfaces a\n * friendly error message — matching the UX of `gh` / `shopify` CLIs where\n * a stale token says \"please run `gh auth login`\" instead of bubbling a\n * raw `Unauthorized`.\n */\nexport async function cliAuthFetch(\n pathname: string,\n init: RequestInit = {},\n): Promise<Response> {\n const config = await readAuthConfig();\n if (!config) {\n throw new CliAuthExpiredError(\n \"unauthorized\",\n \"Not logged in. Run `suda auth login` to authenticate first.\",\n );\n }\n const baseUrl = `${protocolForHost(config.host)}://${config.host}`;\n const headers = new Headers(init.headers);\n headers.set(\"Authorization\", `Bearer ${config.sessionToken}`);\n\n const res = await fetch(`${baseUrl}${pathname}`, { ...init, headers });\n if (res.status === 401) {\n const body = (await res.clone().json().catch(() => ({}))) as {\n error?: string;\n message?: string;\n };\n const code = (\n [\"token_invalid\", \"token_revoked\", \"token_expired\"].includes(body.error ?? \"\")\n ? (body.error as \"token_invalid\" | \"token_revoked\" | \"token_expired\")\n : \"unauthorized\"\n );\n // Wipe the local config so the next command immediately tells the user\n // to log in instead of pretending we still hold a session.\n await clearAuthConfig();\n throw new CliAuthExpiredError(\n code,\n body.message ??\n \"Authentication is no longer valid. Run `suda auth login` to authenticate again.\",\n );\n }\n return res;\n}\n\nexport async function login(host: string = \"app.sudayun.cn\") {\n const baseUrl = `${protocolForHost(host)}://${host}`;\n\n console.log(`Requesting device authorization from ${baseUrl}...`);\n\n const deviceRes = await fetch(`${baseUrl}/api/cli-auth/device`, {\n method: \"POST\",\n });\n\n if (!deviceRes.ok) {\n throw new Error(`Failed to initialize auth: ${deviceRes.statusText}`);\n }\n\n const { deviceCode, userCode, verificationUri, interval, expiresIn } = (await deviceRes.json()) as {\n deviceCode: string;\n userCode: string;\n verificationUri: string;\n expiresIn: number;\n interval: number;\n };\n\n const authUrl = `${verificationUri}?code=${userCode}`;\n console.log(`\\nPlease open the following URL in your browser to authorize Suda CLI:\\n`);\n console.log(` ${authUrl}\\n`);\n console.log(`Your confirmation code is: ${userCode}\\n`);\n // Try to open browser\n try {\n const open = (await import(\"open\")).default;\n await open(authUrl);\n } catch {\n // ignore\n }\n\n const pollInterval = (interval || 5) * 1000;\n const timeoutSeconds = expiresIn || 300;\n const deadline = Date.now() + timeoutSeconds * 1000;\n\n console.log(\"Waiting for authorization...\");\n\n while (Date.now() < deadline) {\n await new Promise((resolve) => setTimeout(resolve, pollInterval));\n\n const pollRes = await fetch(`${baseUrl}/api/cli-auth/poll`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ deviceCode }),\n });\n\n const data = (await pollRes.json()) as { status?: string; token?: string; error?: string };\n\n if (pollRes.ok && data.status === \"approved\" && data.token) {\n await writeAuthConfig({ sessionToken: data.token, host });\n console.log(\"Successfully authorized!\");\n return;\n }\n\n if (data.error === \"authorization_pending\") {\n continue;\n }\n\n throw new Error(`Authorization failed: ${data.error || \"Unknown error\"}`);\n }\n\n throw new Error(\"Authorization timed out.\");\n}\n\nexport async function status() {\n const config = await readAuthConfig();\n if (!config) {\n console.log(\"Not logged in. Run `suda auth login` to authenticate.\");\n return;\n }\n\n let res: Response;\n try {\n res = await cliAuthFetch(\"/api/cli-auth/whoami\");\n } catch (err) {\n if (err instanceof CliAuthExpiredError) {\n console.log(err.message);\n return;\n }\n console.error(`Failed to connect to ${config.host}.`);\n return;\n }\n\n if (!res.ok) {\n // `cliAuthFetch` already handled 401. Anything else here is unexpected\n // (5xx, etc.) — surface a generic message rather than silently dropping\n // the local credentials.\n console.error(\n `Failed to verify session (${res.status} ${res.statusText}). Try again later.`,\n );\n return;\n }\n\n const data = (await res.json()) as {\n user?: { email?: string | null; name?: string | null };\n };\n const label = data.user?.email ?? data.user?.name ?? \"your account\";\n console.log(`Logged in as ${label} on ${config.host}`);\n}\n\nexport async function logout() {\n const config = await readAuthConfig();\n if (!config) {\n console.log(\"Not logged in.\");\n return;\n }\n\n // Best-effort server-side revocation. We always clear the local config\n // afterwards so that even if the server is unreachable (offline, DNS issues,\n // self-hosted instance turned off) the user is genuinely \"logged out\" on\n // this machine. Mirrors `gh auth logout`'s behaviour: tell the server, then\n // wipe the credential.\n try {\n await cliAuthFetch(\"/api/cli-auth/revoke\", { method: \"POST\" });\n } catch (err) {\n if (err instanceof CliAuthExpiredError) {\n // Token was already invalid — `cliAuthFetch` already wiped the local\n // config in that case. Tell the user once and return.\n console.log(\"Logged out (token was already invalid).\");\n return;\n }\n console.warn(\n `Could not contact ${config.host} to revoke token. The token will be cleared locally only.`,\n );\n }\n\n await clearAuthConfig();\n console.log(\"Logged out successfully.\");\n}\n","#!/usr/bin/env node\n\nimport { createHash } from \"node:crypto\";\nimport { mkdir, readFile, readdir, stat, writeFile } from \"node:fs/promises\";\nimport { createRequire } from \"node:module\";\nimport path from \"node:path\";\nimport { fileURLToPath, pathToFileURL } from \"node:url\";\n\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport type {\n AgentComponentOutput,\n ThemeAgentManifest,\n ThemeModule,\n ThemeStarterPage,\n} from \"@sudajs/theme-engine\";\nimport {\n agentComponentOutputSchema,\n agentPageSchemaOutputSchema,\n agentValidationResultSchema,\n checkThemeModule,\n createAgentComponentSchemaOutput,\n createAgentPageSchemaOutput,\n createPageDataFromAgentContent,\n createThemeAgentManifest,\n findAgentSection,\n formatThemeCheckResult,\n validateAgentPageContentWithManifest,\n} from \"@sudajs/theme-engine\";\nimport type {\n extractLayoutChrome as extractLayoutChromeFn,\n ResolveAssetPathOptions,\n ResolvedTheme,\n resolveAssetPath as resolveAssetPathFn,\n ThemeRender as ThemeRenderFn,\n ThemeRenderMetadata,\n} from \"@sudajs/theme-engine/server\";\nimport { FileSystemThemeRegistry, themeManifestSchema } from \"@sudajs/theme-engine/server\";\nimport { Command } from \"commander\";\nimport { build as esbuild, context as esbuildContext, type Plugin } from \"esbuild\";\nimport type { createElement as createElementFn } from \"react\";\nimport type { renderToStaticMarkup as renderToStaticMarkupFn } from \"react-dom/server\";\nimport { z } from \"zod\";\n\ninterface ValidatedTheme {\n root: string;\n module: ThemeModule;\n serverEntryPath: string;\n clientEntryPath: string | null;\n stylesheetPath: string | null;\n}\n\ninterface UploadFile {\n absolutePath: string;\n relativePath: string;\n contentType: string;\n}\n\ninterface ThemeRootOptions {\n themeRoot?: string | undefined;\n}\n\ninterface BuildOptions extends ThemeRootOptions {\n skipThemeBuild?: boolean;\n skipCheck?: boolean;\n}\n\ninterface CheckOptions extends ThemeRootOptions {\n skipBuild?: boolean;\n}\n\ninterface PublishOptions extends ThemeRootOptions {\n skipBuild?: boolean;\n skipCheck?: boolean;\n bucket?: string;\n force?: boolean;\n}\n\ninterface AgentThemeOptions extends ThemeRootOptions {\n projectId?: string | undefined;\n version?: string | undefined;\n example?: boolean | undefined;\n}\n\ninterface AgentPageCreateOptions extends AgentThemeOptions {\n title: string;\n slug: string;\n theme: string;\n input: string;\n}\n\ninterface AgentProjectCreateOptions {\n name: string;\n siteDescription: string;\n}\n\ninterface AgentProjectSummary {\n projectId: string;\n name: string;\n defaultDomain: string | null;\n role: string;\n isOwner: boolean;\n activeThemeKey: string | null;\n activeThemeVersion: string | null;\n}\n\ninterface AgentProjectCreated {\n success: true;\n projectId: string;\n name: string;\n defaultDomain: string | null;\n dashboardUrl: string;\n}\n\ninterface ThemeCatalogItem {\n key: string;\n name: string;\n version: string;\n description?: string | null | undefined;\n categories?: string[] | undefined;\n preview?: string | undefined;\n active?: boolean | undefined;\n}\n\nconst createPageDraftOutputSchema = z.discriminatedUnion(\"status\", [\n z.object({\n status: z.literal(\"created\").describe(\"The page draft was created.\"),\n pageId: z.string().describe(\"New page id.\"),\n }),\n z.object({\n status: z.literal(\"invalid\").describe(\"The page content failed validation.\"),\n valid: z.literal(false),\n issues: z.array(\n z.object({\n path: z.string(),\n message: z.string(),\n }),\n ),\n }),\n]);\n\n// Mirrors apps/workspace/app/onboarding/constants.ts so external AI tools see\n// the same input bounds as the in-app onboarding form.\nconst PROJECT_NAME_MIN_LENGTH = 1;\nconst PROJECT_NAME_MAX_LENGTH = 80;\nconst PROJECT_DESCRIPTION_MIN_LENGTH = 1;\nconst PROJECT_DESCRIPTION_MAX_LENGTH = 300;\n\n// Single source of truth for the create_project input shape, reused by both\n// the MCP `create_project` tool and the `suda agent project create` command\n// so the two entry points cannot drift on bounds or trim semantics.\nconst createProjectInputSchema = z.object({\n name: z.string().trim().min(PROJECT_NAME_MIN_LENGTH).max(PROJECT_NAME_MAX_LENGTH),\n siteDescription: z\n .string()\n .trim()\n .min(PROJECT_DESCRIPTION_MIN_LENGTH)\n .max(PROJECT_DESCRIPTION_MAX_LENGTH),\n});\n\nconst projectSummarySchema = z.object({\n projectId: z.string(),\n name: z.string(),\n defaultDomain: z.string().nullable(),\n role: z.string(),\n isOwner: z.boolean(),\n activeThemeKey: z.string().nullable(),\n activeThemeVersion: z.string().nullable(),\n});\n\nconst listProjectsOutputSchema = z.object({\n projects: z.array(projectSummarySchema),\n});\n\nconst createProjectOutputSchema = z.object({\n projectId: z.string(),\n name: z.string(),\n defaultDomain: z.string().nullable(),\n dashboardUrl: z.string(),\n});\n\nfunction createHostReactShimPlugin(): Plugin {\n return {\n name: \"suda-host-react-shim\",\n setup(build) {\n build.onResolve({ filter: /^react$/ }, () => ({\n path: \"react-host-shim\",\n namespace: \"suda-shim\",\n }));\n build.onResolve({ filter: /^react\\/jsx-runtime$/ }, () => ({\n path: \"react-jsx-runtime-host-shim\",\n namespace: \"suda-shim\",\n }));\n build.onResolve({ filter: /^react-dom$/ }, () => ({\n path: \"react-dom-host-shim\",\n namespace: \"suda-shim\",\n }));\n build.onResolve({ filter: /^react-dom\\/client$/ }, () => ({\n path: \"react-dom-client-host-shim\",\n namespace: \"suda-shim\",\n }));\n build.onLoad({ filter: /^react-host-shim$/, namespace: \"suda-shim\" }, () => ({\n loader: \"js\",\n contents: `\nconst React = globalThis.__SUDA_REACT__;\nif (!React) {\n throw new Error(\"Missing host React runtime (__SUDA_REACT__).\");\n}\nexport default React;\nexport const {\n Children,\n Component,\n Fragment,\n Profiler,\n PureComponent,\n StrictMode,\n Suspense,\n cloneElement,\n createContext,\n createElement,\n createRef,\n forwardRef,\n isValidElement,\n lazy,\n memo,\n startTransition,\n use,\n useActionState,\n useCallback,\n useContext,\n useDeferredValue,\n useEffect,\n useId,\n useImperativeHandle,\n useInsertionEffect,\n useLayoutEffect,\n useMemo,\n useOptimistic,\n useReducer,\n useRef,\n useState,\n useSyncExternalStore,\n useTransition,\n version,\n} = React;\n`,\n }));\n build.onLoad(\n {\n filter: /^react-jsx-runtime-host-shim$/,\n namespace: \"suda-shim\",\n },\n () => ({\n loader: \"js\",\n contents: `\nconst runtime = globalThis.__SUDA_REACT_JSX_RUNTIME__;\nif (!runtime) {\n throw new Error(\"Missing host React JSX runtime (__SUDA_REACT_JSX_RUNTIME__).\");\n}\nexport const { Fragment, jsx, jsxs, jsxDEV } = runtime;\n`,\n }),\n );\n build.onLoad({ filter: /^react-dom-host-shim$/, namespace: \"suda-shim\" }, () => ({\n loader: \"js\",\n contents: `\nconst ReactDOM = globalThis.__SUDA_REACT_DOM__;\nif (!ReactDOM) {\n throw new Error(\"Missing host React DOM runtime (__SUDA_REACT_DOM__).\");\n}\nexport default ReactDOM;\nexport const {\n createPortal,\n flushSync,\n preconnect,\n prefetchDNS,\n preinit,\n preinitModule,\n preload,\n preloadModule,\n requestFormReset,\n unstable_batchedUpdates,\n useFormState,\n useFormStatus,\n version,\n} = ReactDOM;\n`,\n }));\n build.onLoad({ filter: /^react-dom-client-host-shim$/, namespace: \"suda-shim\" }, () => ({\n loader: \"js\",\n contents: `\nconst ReactDOMClient = globalThis.__SUDA_REACT_DOM_CLIENT__;\nif (!ReactDOMClient) {\n throw new Error(\"Missing host React DOM client runtime (__SUDA_REACT_DOM_CLIENT__).\");\n}\nexport default ReactDOMClient;\nexport const { createRoot, hydrateRoot, version } = ReactDOMClient;\n`,\n }));\n },\n };\n}\n\nfunction safeObjectKeyPart(value: string): string {\n return value.replace(/[^a-zA-Z0-9._-]/g, \"-\");\n}\n\nfunction createThemePrefix(themeKey: string, version: string): string {\n return `themes/${safeObjectKeyPart(themeKey)}/${safeObjectKeyPart(version)}`;\n}\n\nfunction createThemeObjectKey(themeKey: string, version: string, relativePath: string): string {\n const safeRelativePath = relativePath\n .replace(/^\\/+/, \"\")\n .split(\"/\")\n .map(safeObjectKeyPart)\n .filter(Boolean)\n .join(\"/\");\n\n return `${createThemePrefix(themeKey, version)}/${safeRelativePath}`;\n}\n\nimport { login, status, logout, readAuthConfig } from \"./auth\";\n\nfunction resolveThemeRoot(options: ThemeRootOptions): string {\n return path.resolve(options.themeRoot ?? process.cwd());\n}\n\nasync function pathExists(filePath: string): Promise<boolean> {\n try {\n await stat(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function readJson<T>(filePath: string): Promise<T> {\n const raw = await readFile(filePath, \"utf8\");\n return JSON.parse(raw) as T;\n}\n\nasync function readJsonIfExists<T>(filePath: string): Promise<T | null> {\n if (!(await pathExists(filePath))) {\n return null;\n }\n return readJson<T>(filePath);\n}\n\nfunction protocolForHost(host: string): \"http\" | \"https\" {\n return host.includes(\"localhost\") || host.includes(\"127.0.0.1\") ? \"http\" : \"https\";\n}\n\nasync function requireCliBaseUrl(): Promise<{ baseUrl: string; token: string }> {\n const config = await readAuthConfig();\n if (!config) {\n throw new Error(\"Not logged in. Run `suda auth login` to authenticate first.\");\n }\n return {\n baseUrl: `${protocolForHost(config.host)}://${config.host}`,\n token: config.sessionToken,\n };\n}\n\nasync function fetchJson<T>(\n url: string,\n options: RequestInit & { token?: string } = {},\n): Promise<T> {\n const headers = new Headers(options.headers);\n if (options.token) {\n headers.set(\"Authorization\", `Bearer ${options.token}`);\n }\n const response = await fetch(url, { ...options, headers });\n if (!response.ok) {\n const errorData = (await response.json().catch(() => ({}))) as {\n error?: string;\n message?: string;\n };\n throw new Error(errorData.message || errorData.error || response.statusText);\n }\n return (await response.json()) as T;\n}\n\nfunction agentCacheDir(): string {\n return path.join(\n process.env.XDG_CACHE_HOME ?? path.join(process.env.HOME ?? \".\", \".cache\"),\n \"suda\",\n \"agent\",\n );\n}\n\nfunction cachedThemeManifestPath(themeKey: string, version: string): string {\n return path.join(\n agentCacheDir(),\n \"themes\",\n safeObjectKeyPart(themeKey),\n safeObjectKeyPart(version),\n \"agent-manifest.json\",\n );\n}\n\nasync function loadThemeModule(serverEntryPath: string): Promise<ThemeModule> {\n const imported = (await import(`${pathToFileURL(serverEntryPath).href}?t=${Date.now()}`)) as {\n default?: ThemeModule;\n };\n\n if (!imported.default) {\n throw new Error(`${serverEntryPath} must export a default ThemeModule.`);\n }\n\n return imported.default;\n}\n\nfunction assertRecord(value: unknown, label: string): asserts value is Record<string, unknown> {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n throw new Error(`${label} must be an object.`);\n }\n}\n\nfunction validateThemeModule(module: ThemeModule): void {\n assertRecord(module.manifest, \"manifest\");\n const parsedManifest = themeManifestSchema.safeParse(module.manifest);\n if (!parsedManifest.success) {\n const issues = parsedManifest.error.issues\n .map((issue) => ` - ${issue.path.join(\".\") || \"<root>\"}: ${issue.message}`)\n .join(\"\\n\");\n throw new Error(`manifest does not satisfy the Suda theme contract:\\n${issues}`);\n }\n if (!module.manifest.key || !module.manifest.version || !module.manifest.name) {\n throw new Error(\"manifest.key, manifest.version and manifest.name are required.\");\n }\n if (module.manifest.entry !== \"dist/index.js\") {\n throw new Error('manifest.entry must be artifact-local: \"dist/index.js\".');\n }\n if (\n module.manifest.clientEntry !== undefined &&\n module.manifest.clientEntry !== \"dist/runtime.client.js\"\n ) {\n throw new Error(\n 'manifest.clientEntry must be artifact-local: \"dist/runtime.client.js\" when provided.',\n );\n }\n assertRecord(module.pageConfig?.components, \"pageConfig.components\");\n assertRecord(module.layoutConfig, \"layoutConfig\");\n assertRecord(module.defaultLayout, \"defaultLayout\");\n if (!Array.isArray(module.starterPages)) {\n throw new Error(\"starterPages must be an array.\");\n }\n}\n\nasync function validateTheme(root: string): Promise<ValidatedTheme> {\n const packageJsonPath = path.join(root, \"package.json\");\n const serverEntryPath = path.join(root, \"dist\", \"index.js\");\n const clientEntryPath = path.join(root, \"dist\", \"runtime.client.js\");\n const stylesheetPath = path.join(root, \"styles.css\");\n\n if (!(await pathExists(packageJsonPath))) {\n throw new Error(`Missing package.json in ${root}`);\n }\n if (!(await pathExists(serverEntryPath))) {\n throw new Error(`Missing ${serverEntryPath}. Run the theme package build first.`);\n }\n\n const module = await loadThemeModule(serverEntryPath);\n validateThemeModule(module);\n\n const result: ValidatedTheme = {\n root,\n module,\n serverEntryPath,\n clientEntryPath: null,\n stylesheetPath: null,\n };\n if (await pathExists(clientEntryPath)) {\n result.clientEntryPath = clientEntryPath;\n }\n if (await pathExists(stylesheetPath)) {\n result.stylesheetPath = stylesheetPath;\n }\n return result;\n}\n\nasync function runCommand(command: string, args: string[], cwd: string): Promise<void> {\n const { spawn } = await import(\"node:child_process\");\n await new Promise<void>((resolve, reject) => {\n const child = spawn(command, args, { cwd, stdio: \"inherit\" });\n child.on(\"error\", reject);\n child.on(\"exit\", (code) => {\n if (code === 0) {\n resolve();\n } else {\n reject(new Error(`${command} ${args.join(\" \")} exited with ${code ?? \"unknown\"}.`));\n }\n });\n });\n}\n\nasync function runThemePackageBuild(root: string): Promise<void> {\n const packageJson = await readJson<{ scripts?: Record<string, string> }>(\n path.join(root, \"package.json\"),\n );\n const buildScript = packageJson.scripts?.build;\n if (!buildScript || buildScript.includes(\"suda theme\") || buildScript.includes(\"suda-theme\")) {\n return;\n }\n await runCommand(\"pnpm\", [\"--dir\", root, \"run\", \"build\"], process.cwd());\n}\n\nasync function findClientEntry(root: string): Promise<string> {\n const candidates = [\n path.join(root, \"src\", \"runtime.client.tsx\"),\n path.join(root, \"src\", \"runtime.client.ts\"),\n ];\n for (const candidate of candidates) {\n if (await pathExists(candidate)) {\n return candidate;\n }\n }\n throw new Error(`Missing runtime entry. Add src/runtime.client.ts(x) in ${root}.`);\n}\n\nasync function findServerEntry(root: string): Promise<string> {\n const candidates = [path.join(root, \"src\", \"index.tsx\"), path.join(root, \"src\", \"index.ts\")];\n for (const candidate of candidates) {\n if (await pathExists(candidate)) {\n return candidate;\n }\n }\n throw new Error(`Missing server entry. Add src/index.ts(x) in ${root}.`);\n}\n\nasync function buildServerBundle(root: string): Promise<void> {\n const entryPoint = await findServerEntry(root);\n\n await esbuild({\n bundle: true,\n entryPoints: [entryPoint],\n external: [\n \"react\",\n \"react/jsx-runtime\",\n \"react-dom\",\n \"react-dom/*\",\n \"@puckeditor/core\",\n \"@puckeditor/core/*\",\n \"@sudajs/theme-engine\",\n \"@sudajs/theme-engine/*\",\n ],\n format: \"esm\",\n jsx: \"automatic\",\n minify: false,\n outfile: path.join(root, \"dist\", \"index.js\"),\n platform: \"node\",\n sourcemap: false,\n target: \"es2022\",\n treeShaking: true,\n });\n}\n\nasync function buildTheme(root: string, skipThemeBuild: boolean): Promise<ValidatedTheme> {\n if (!skipThemeBuild) {\n await runThemePackageBuild(root);\n }\n\n await buildServerBundle(root);\n\n const entryPoint = await findClientEntry(root);\n if (!(await pathExists(entryPoint))) {\n throw new Error(`Missing client entry: ${entryPoint}`);\n }\n\n await mkdir(path.join(root, \"dist\"), { recursive: true });\n const hostReactShimPlugin = createHostReactShimPlugin();\n await esbuild({\n bundle: true,\n entryPoints: [entryPoint],\n format: \"esm\",\n jsx: \"automatic\",\n minify: true,\n outfile: path.join(root, \"dist\", \"runtime.client.js\"),\n platform: \"browser\",\n plugins: [hostReactShimPlugin],\n sourcemap: false,\n target: \"es2022\",\n treeShaking: true,\n });\n\n const validated = await validateTheme(root);\n await writeThemeArtifacts(validated);\n return validateTheme(root);\n}\n\n/**\n * Runs the AI-metadata check on a built theme. Prints a human-readable report\n * via {@link formatThemeCheckResult} and returns whether errors were found, so\n * callers can decide whether to fail the build.\n */\nfunction runThemeCheck(theme: ValidatedTheme): boolean {\n const result = checkThemeModule(theme.module);\n const text = formatThemeCheckResult(result);\n if (result.ok) {\n console.log(text);\n } else {\n console.error(text);\n }\n return result.ok;\n}\n\nasync function watchTheme(root: string, skipThemeBuild: boolean, port: number): Promise<void> {\n if (!skipThemeBuild) {\n await runThemePackageBuild(root);\n }\n\n await buildServerBundle(root);\n const theme = await validateTheme(root);\n\n const entryPoint = await findClientEntry(root);\n await mkdir(path.join(root, \"dist\"), { recursive: true });\n const hostReactShimPlugin = createHostReactShimPlugin();\n const watchLogPlugin = createWatchLogPlugin(\"runtime.client.js\");\n\n const context = await esbuildContext({\n bundle: true,\n entryPoints: [entryPoint],\n format: \"esm\",\n jsx: \"automatic\",\n minify: false,\n outfile: path.join(root, \"dist\", \"runtime.client.js\"),\n platform: \"browser\",\n plugins: [hostReactShimPlugin, watchLogPlugin],\n sourcemap: true,\n target: \"es2022\",\n treeShaking: true,\n });\n await context.watch();\n\n const handle = await startPreviewServer(theme, port);\n console.log(`watching theme runtime; previewing at ${handle.url}`);\n await new Promise(() => undefined);\n}\n\n/**\n * Logs a single line whenever esbuild finishes a (re)build in watch mode.\n * Without this, `suda theme dev` runs silently after the initial bundle and\n * developers can only confirm rebuilds by checking dist/ mtimes.\n */\nfunction createWatchLogPlugin(label: string): Plugin {\n return {\n name: \"suda-theme-watch-log\",\n setup(build) {\n let firstBuild = true;\n build.onEnd((result) => {\n if (firstBuild) {\n firstBuild = false;\n return;\n }\n const errorCount = result.errors.length;\n if (errorCount > 0) {\n console.log(\n `rebuild failed (${errorCount} error${errorCount === 1 ? \"\" : \"s\"}): ${label}`,\n );\n return;\n }\n const stamp = new Date().toLocaleTimeString();\n console.log(`[${stamp}] rebuilt ${label}`);\n });\n },\n };\n}\n\ninterface PreviewServerHandle {\n url: string;\n port: number;\n close: () => Promise<void>;\n}\n\nconst PREVIEW_PUBLIC_BASE_PATH = \"/api/themes\";\n\nfunction pickStarterSlug(theme: ValidatedTheme): string | null {\n const pages = theme.module.starterPages;\n if (pages.length === 0) {\n return null;\n }\n return (pages.find((page) => page.isHome) ?? pages[0])?.slug ?? null;\n}\n\nfunction findStarterPage(theme: ValidatedTheme, slug: string): ThemeStarterPage | null {\n return theme.module.starterPages.find((page) => page.slug === slug) ?? null;\n}\n\nfunction escapeHtml(value: string): string {\n return value\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\"/g, \""\")\n .replace(/'/g, \"'\");\n}\n\n/**\n * Mirrors apps/site `resolveAssetUrl`. Themes reference asset values as\n * either absolute URLs, raw `themes/<key>/<version>/<rel>` paths, or other\n * relative strings. In dev we have no CDN, so theme-bundled paths go through\n * the local proxy and everything else falls back to itself.\n */\nfunction createPreviewAssetResolver(\n resolveAssetPath: (\n value: string | undefined,\n options?: ResolveAssetPathOptions,\n ) => string | undefined,\n): (value: string | undefined) => string | undefined {\n return (value) => {\n return resolveAssetPath(value, {\n legacyResolve: (key) => {\n if (key.startsWith(\"themes/\")) {\n return `${PREVIEW_PUBLIC_BASE_PATH}/${key.slice(\"themes/\".length)}`;\n }\n return undefined;\n },\n });\n };\n}\n\nfunction createPreviewThemeAssetUrl(\n themeKey: string,\n themeVersion: string,\n relativePath: string,\n): string {\n const normalizedRelativePath = relativePath.replace(/^\\/+/, \"\");\n return `${PREVIEW_PUBLIC_BASE_PATH}/${themeKey}/${themeVersion}/assets/${normalizedRelativePath}?v=${encodeURIComponent(themeVersion)}`;\n}\n\n/**\n * Theme-project-scoped renderer bundle. We deliberately resolve `react`,\n * `react-dom/server` and `@sudajs/theme-engine/server` through the theme\n * project's own `require` graph instead of the CLI's, because the theme\n * `dist/index.js` was already loaded against that copy of React. Importing\n * a different React instance from the CLI side would yield two React\n * dispatchers; client components inside the theme would call hooks against\n * the CLI's React (whose dispatcher is `null` outside a render), producing\n * `Cannot read properties of null (reading 'useState')`.\n */\ninterface ThemeRenderer {\n ThemeRender: typeof ThemeRenderFn;\n extractLayoutChrome: typeof extractLayoutChromeFn;\n resolveAssetPath: typeof resolveAssetPathFn;\n createElement: typeof createElementFn;\n renderToStaticMarkup: typeof renderToStaticMarkupFn;\n}\n\nasync function loadThemeScopedRenderer(themeRoot: string): Promise<ThemeRenderer> {\n // `require.resolve` from the theme's package.json forces Node to walk the\n // theme project's node_modules first. In the typical pnpm dev layout that\n // hoists a single React copy into the workspace, but in a multi-repo dev\n // setup (CLI repo + standalone theme repo) each repo has its own React,\n // so resolving from the theme side picks the same React instance that the\n // theme bundle's `dist/index.js` was loaded against.\n const themeRequire = createRequire(path.join(themeRoot, \"package.json\"));\n const reactPath = themeRequire.resolve(\"react\");\n const reactDomServerPath = themeRequire.resolve(\"react-dom/server\");\n const themeEngineServerPath = themeRequire.resolve(\"@sudajs/theme-engine/server\");\n\n const [reactModule, reactDomServerModule, themeEngineServerModule] = (await Promise.all([\n import(pathToFileURL(reactPath).href),\n import(pathToFileURL(reactDomServerPath).href),\n import(pathToFileURL(themeEngineServerPath).href),\n ])) as [\n { createElement: typeof createElementFn },\n { renderToStaticMarkup: typeof renderToStaticMarkupFn },\n {\n ThemeRender: typeof ThemeRenderFn;\n extractLayoutChrome: typeof extractLayoutChromeFn;\n resolveAssetPath: typeof resolveAssetPathFn;\n },\n ];\n\n return {\n ThemeRender: themeEngineServerModule.ThemeRender,\n extractLayoutChrome: themeEngineServerModule.extractLayoutChrome,\n resolveAssetPath: themeEngineServerModule.resolveAssetPath,\n createElement: reactModule.createElement,\n renderToStaticMarkup: reactDomServerModule.renderToStaticMarkup,\n };\n}\n\n/**\n * Renders a single starter page exactly the way `apps/site` renders a\n * project page: same `<ThemeRender>` tree, same `extractLayoutChrome`\n * stylesheet/customHead/customBody composition, same `metadata.resolveAssetUrl`\n * shape. The only differences with site are (a) we use SSR via\n * `renderToStaticMarkup` instead of Next.js streaming RSC and (b) the page\n * frame has a starter-page selector at the top.\n */\nfunction renderStarterPageHtml(\n theme: ValidatedTheme,\n resolved: ResolvedTheme,\n page: ThemeStarterPage,\n renderer: ThemeRenderer,\n): string {\n const chrome = renderer.extractLayoutChrome(theme.module.defaultLayout);\n const metadata: ThemeRenderMetadata = {\n resolveAssetUrl: createPreviewAssetResolver(renderer.resolveAssetPath),\n };\n const body = renderer.renderToStaticMarkup(\n renderer.createElement(renderer.ThemeRender, {\n theme: theme.module,\n pageData: page.data,\n layoutData: theme.module.defaultLayout,\n metadata,\n }),\n );\n const cssVarStyle = Object.entries(chrome.cssVariables)\n .map(([key, value]) => `${key}: ${value};`)\n .join(\" \");\n const stylesheetUrl = resolved.runtime?.stylesheet\n ? createPreviewThemeAssetUrl(\n theme.module.manifest.key,\n theme.module.manifest.version,\n resolved.runtime.stylesheet,\n )\n : null;\n const stylesheetTag = stylesheetUrl\n ? `<link rel=\"stylesheet\" href=\"${escapeHtml(stylesheetUrl)}\" />`\n : \"\";\n const customHead = chrome.customHeadCode ?? \"\";\n const customBody = chrome.customBodyCode ?? \"\";\n return [\n \"<!doctype html>\",\n '<html lang=\"en\">',\n \"<head>\",\n '<meta charset=\"utf-8\" />',\n '<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />',\n `<title>${escapeHtml(`${theme.module.manifest.name} — ${page.title}`)}</title>`,\n stylesheetTag,\n customHead,\n \"</head>\",\n `<body${cssVarStyle ? ` style=\"${cssVarStyle}\"` : \"\"}>`,\n body,\n customBody,\n \"</body>\",\n \"</html>\",\n ].join(\"\");\n}\n\n/** Top-level shell that lists starter pages and embeds the selected one in an iframe. */\nfunction renderPreviewShellHtml(theme: ValidatedTheme, activeSlug: string): string {\n const items = theme.module.starterPages\n .map((page) => {\n const slug = page.slug;\n const label = `${page.title}${page.isHome ? \" (home)\" : \"\"}`;\n const active = slug === activeSlug;\n const href = `/?page=${encodeURIComponent(slug)}`;\n const className = active ? \"suda-preview-tab suda-preview-tab--active\" : \"suda-preview-tab\";\n return `<a class=\"${className}\" href=\"${escapeHtml(href)}\" target=\"_self\">${escapeHtml(label)}</a>`;\n })\n .join(\"\");\n const frameSrc = `/pages/${encodeURIComponent(activeSlug)}`;\n return [\n \"<!doctype html>\",\n '<html lang=\"en\">',\n \"<head>\",\n '<meta charset=\"utf-8\" />',\n '<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />',\n `<title>${escapeHtml(theme.module.manifest.name)} — preview</title>`,\n \"<style>\",\n \"html,body{margin:0;height:100%;font-family:system-ui,sans-serif;background:#0b0d12;color:#e6e8ee;}\",\n \".suda-preview-bar{display:flex;flex-wrap:wrap;gap:.25rem;padding:.5rem .75rem;background:#0b0d12;border-bottom:1px solid #1f2330;position:sticky;top:0;z-index:10;}\",\n \".suda-preview-tab{display:inline-flex;align-items:center;padding:.35rem .75rem;border-radius:.5rem;font-size:.875rem;color:#c9cdd6;text-decoration:none;border:1px solid transparent;}\",\n \".suda-preview-tab:hover{background:#1a1d27;}\",\n \".suda-preview-tab--active{background:#222633;color:#fff;border-color:#2c3142;}\",\n \".suda-preview-frame{display:block;border:0;width:100%;height:calc(100vh - 2.5rem);background:#fff;}\",\n \"</style>\",\n \"</head>\",\n \"<body>\",\n `<nav class=\"suda-preview-bar\">${items}</nav>`,\n `<iframe class=\"suda-preview-frame\" src=\"${escapeHtml(frameSrc)}\" title=\"theme preview\"></iframe>`,\n \"</body>\",\n \"</html>\",\n ].join(\"\");\n}\n\nasync function startPreviewServer(\n theme: ValidatedTheme,\n port: number,\n): Promise<PreviewServerHandle> {\n const { createServer } = await import(\"node:http\");\n\n // Resolve react / react-dom/server / @sudajs/theme-engine/server through\n // the theme project's own require graph so SSR uses the same React copy\n // the theme `dist/index.js` will be loaded against (see `ThemeRenderer`\n // doc comment above).\n const renderer = await loadThemeScopedRenderer(theme.root);\n\n // Feed the registry the single pre-resolved artifact we already validated,\n // avoiding implicit loads of sibling theme directories (which would happen\n // if we passed `roots: [path.dirname(theme.root)]` and the user's theme repo\n // contained more than one theme).\n const registry = new FileSystemThemeRegistry({\n artifacts: [\n {\n rootPath: theme.root,\n serverEntryPath: theme.serverEntryPath,\n module: theme.module,\n },\n ],\n });\n const themeKey = theme.module.manifest.key;\n const themeVersion = theme.module.manifest.version;\n const assetPathPrefix = `${PREVIEW_PUBLIC_BASE_PATH}/${themeKey}/${themeVersion}/assets/`;\n const clientRuntimePrefix = `${PREVIEW_PUBLIC_BASE_PATH}/${themeKey}/${themeVersion}/runtime/client`;\n\n const server = createServer((request, response) => {\n void (async () => {\n const url = new URL(request.url ?? \"/\", `http://localhost:${port}`);\n const pathname = url.pathname;\n\n if (pathname === \"/\" || pathname === \"/index.html\") {\n const fallbackSlug = pickStarterSlug(theme);\n if (!fallbackSlug) {\n response.writeHead(404, { \"Content-Type\": \"text/plain; charset=utf-8\" });\n response.end(\"No starter pages declared by this theme.\");\n return;\n }\n const requested = url.searchParams.get(\"page\");\n const activeSlug =\n requested && findStarterPage(theme, requested) ? requested : fallbackSlug;\n response.writeHead(200, { \"Content-Type\": \"text/html; charset=utf-8\" });\n response.end(renderPreviewShellHtml(theme, activeSlug));\n return;\n }\n\n if (pathname.startsWith(\"/pages/\")) {\n const slug = decodeURIComponent(pathname.slice(\"/pages/\".length));\n const starter = findStarterPage(theme, slug);\n if (!starter) {\n response.writeHead(404, { \"Content-Type\": \"text/plain; charset=utf-8\" });\n response.end(`Unknown starter page: ${slug}`);\n return;\n }\n const resolved = await registry.resolve(themeKey, themeVersion);\n if (!resolved) {\n response.writeHead(500, { \"Content-Type\": \"text/plain; charset=utf-8\" });\n response.end(\"Failed to resolve theme via FileSystemThemeRegistry.\");\n return;\n }\n const html = renderStarterPageHtml(theme, resolved, starter, renderer);\n response.writeHead(200, { \"Content-Type\": \"text/html; charset=utf-8\" });\n response.end(html);\n return;\n }\n\n if (pathname.startsWith(assetPathPrefix)) {\n const relativePath = decodeURIComponent(pathname.slice(assetPathPrefix.length));\n const filePath = await registry.resolveAssetPath(themeKey, themeVersion, relativePath);\n if (!filePath) {\n response.writeHead(404, { \"Content-Type\": \"text/plain; charset=utf-8\" });\n response.end(\"Not found\");\n return;\n }\n const body = await readFile(filePath);\n response.writeHead(200, {\n \"Content-Type\": contentTypeFor(relativePath),\n \"Cache-Control\": \"no-cache\",\n });\n response.end(body);\n return;\n }\n\n if (pathname === clientRuntimePrefix) {\n const filePath = await registry.resolveClientEntryPath(themeKey, themeVersion);\n if (!filePath) {\n response.writeHead(404, { \"Content-Type\": \"text/plain; charset=utf-8\" });\n response.end(\"Theme has no client runtime bundle.\");\n return;\n }\n const body = await readFile(filePath);\n response.writeHead(200, {\n \"Content-Type\": \"application/javascript; charset=utf-8\",\n \"Cache-Control\": \"no-cache\",\n });\n response.end(body);\n return;\n }\n\n response.writeHead(404, { \"Content-Type\": \"text/plain; charset=utf-8\" });\n response.end(\"Not found\");\n })().catch((error) => {\n if (!response.headersSent) {\n response.writeHead(500, { \"Content-Type\": \"text/plain; charset=utf-8\" });\n }\n response.end(error instanceof Error ? error.message : \"Internal error\");\n });\n });\n\n await new Promise<void>((resolve, reject) => {\n const onError = (err: Error): void => {\n reject(err);\n };\n server.once(\"error\", onError);\n server.listen(port, () => {\n server.off(\"error\", onError);\n resolve();\n });\n });\n\n return {\n url: `http://localhost:${port}`,\n port,\n close: () =>\n new Promise<void>((resolve) => {\n server.close(() => {\n resolve();\n });\n }),\n };\n}\n\ninterface ScreenshotOptions extends ThemeRootOptions {\n output?: string;\n width?: string;\n height?: string;\n port?: string;\n skipBuild?: boolean;\n}\n\ninterface ResolvedScreenshotOptions {\n outputPath: string;\n viewport: { width: number; height: number };\n port: number;\n skipBuild: boolean;\n}\n\nconst DEFAULT_SCREENSHOT_RELATIVE = path.join(\"dist\", \"preview\", \"desktop.png\");\n\nfunction parsePositiveInt(value: string | undefined, fallback: number): number {\n if (!value) {\n return fallback;\n }\n const parsed = Number.parseInt(value, 10);\n return Number.isFinite(parsed) && parsed > 0 ? parsed : fallback;\n}\n\nfunction resolveScreenshotOptions(\n root: string,\n options: ScreenshotOptions,\n): ResolvedScreenshotOptions {\n return {\n outputPath: path.resolve(root, options.output ?? DEFAULT_SCREENSHOT_RELATIVE),\n viewport: {\n width: parsePositiveInt(options.width, 1280),\n height: parsePositiveInt(options.height, 800),\n },\n port: parsePositiveInt(options.port, 4178),\n skipBuild: options.skipBuild === true,\n };\n}\n\ninterface PlaywrightModule {\n chromium: {\n launch: (options?: { headless?: boolean }) => Promise<{\n newContext: (options: {\n viewport: { width: number; height: number };\n deviceScaleFactor?: number;\n }) => Promise<{\n newPage: () => Promise<{\n goto: (url: string, options?: { waitUntil?: string }) => Promise<unknown>;\n screenshot: (options: { path: string; fullPage?: boolean }) => Promise<unknown>;\n close: () => Promise<void>;\n }>;\n close: () => Promise<void>;\n }>;\n close: () => Promise<void>;\n }>;\n };\n}\n\nasync function loadPlaywright(): Promise<PlaywrightModule> {\n // Resolve module ids via runtime expressions so the optional dependency is not\n // required at type-check time. Either `playwright` or `@playwright/test` works.\n const candidates = [\"playwright\", \"@playwright/test\"];\n for (const id of candidates) {\n try {\n const mod: unknown = await import(/* @vite-ignore */ id);\n return mod as PlaywrightModule;\n } catch {\n // try next candidate\n }\n }\n throw new Error(\n \"Playwright is required for screenshot capture. Install it as a dev dependency: `pnpm add -D playwright && pnpm exec playwright install chromium`.\",\n );\n}\n\nasync function captureScreenshot(\n theme: ValidatedTheme,\n options: ResolvedScreenshotOptions,\n): Promise<void> {\n const playwright = await loadPlaywright();\n const handle = await startPreviewServer(theme, options.port);\n try {\n await mkdir(path.dirname(options.outputPath), { recursive: true });\n const browser = await playwright.chromium.launch({ headless: true });\n try {\n const context = await browser.newContext({\n viewport: options.viewport,\n deviceScaleFactor: 1,\n });\n const page = await context.newPage();\n await page.goto(handle.url, { waitUntil: \"networkidle\" });\n await page.screenshot({ path: options.outputPath, fullPage: false });\n await context.close();\n } finally {\n await browser.close();\n }\n } finally {\n await handle.close();\n }\n console.log(`captured ${path.relative(theme.root, options.outputPath)}`);\n}\n\nasync function screenshotTheme(root: string, options: ScreenshotOptions): Promise<void> {\n const resolved = resolveScreenshotOptions(root, options);\n const theme = resolved.skipBuild ? await validateTheme(root) : await buildTheme(root, false);\n await captureScreenshot(theme, resolved);\n}\n\nasync function loadLocalAgentManifest(root: string): Promise<ThemeAgentManifest> {\n const built = await readJsonIfExists<ThemeAgentManifest>(\n path.join(root, \"dist\", \"agent-manifest.json\"),\n );\n if (built) {\n return built;\n }\n throw new Error(\n `No agent manifest found at ${path.join(root, \"dist\", \"agent-manifest.json\")}. Run \"suda theme build\" first.`,\n );\n}\n\nasync function listAgentThemes(options: AgentThemeOptions): Promise<ThemeCatalogItem[]> {\n if (options.themeRoot) {\n const manifest = await loadLocalAgentManifest(resolveThemeRoot(options));\n return [\n {\n key: manifest.manifest.key,\n name: manifest.manifest.name,\n version: manifest.manifest.version,\n description: manifest.manifest.description ?? null,\n categories: manifest.manifest.categories,\n preview: manifest.manifest.preview,\n },\n ];\n }\n\n const auth = await requireCliBaseUrl();\n const url = new URL(\"/api/cli/agent/themes\", auth.baseUrl);\n if (options.projectId) {\n url.searchParams.set(\"projectId\", options.projectId);\n }\n const catalog = await fetchJson<{ themes: ThemeCatalogItem[] }>(url.href, { token: auth.token });\n await mkdir(agentCacheDir(), { recursive: true });\n await writeFile(\n path.join(agentCacheDir(), \"catalog.json\"),\n `${JSON.stringify(catalog, null, 2)}\\n`,\n );\n return catalog.themes;\n}\n\nasync function fetchAgentManifest(\n themeKey: string,\n options: AgentThemeOptions,\n): Promise<ThemeAgentManifest> {\n // 兼容用户输入 `--theme immgway@1.0.2` 的人机交互格式:\n // 在统一入口拆成内部使用的 themeKey + version,避免每个 action 重复解析。\n // 与 `--version` 同时使用且不一致时报冲突。\n const { key: parsedKey, version: parsedVersion } = parseThemeRef(themeKey);\n if (parsedVersion && options.version && parsedVersion !== options.version) {\n throw new Error(\n `Conflicting versions: --theme specifies \"${parsedVersion}\" but --version specifies \"${options.version}\". Pass only one.`,\n );\n }\n const resolvedKey = parsedKey;\n const resolvedOptions: AgentThemeOptions = parsedVersion\n ? { ...options, version: parsedVersion }\n : options;\n\n if (resolvedOptions.themeRoot) {\n return loadLocalAgentManifest(resolveThemeRoot(resolvedOptions));\n }\n\n const auth = await requireCliBaseUrl();\n const version = resolvedOptions.version ?? \"latest\";\n const cachePath = cachedThemeManifestPath(resolvedKey, version);\n const cached =\n version === \"latest\" ? null : await readJsonIfExists<ThemeAgentManifest>(cachePath);\n if (cached) {\n return cached;\n }\n\n const url = new URL(\n `/api/cli/agent/themes/${encodeURIComponent(resolvedKey)}/${encodeURIComponent(version)}/schema`,\n auth.baseUrl,\n );\n if (resolvedOptions.projectId) {\n url.searchParams.set(\"projectId\", resolvedOptions.projectId);\n }\n const result = await fetchJson<{ agentManifest: ThemeAgentManifest }>(url.href, {\n token: auth.token,\n });\n // 远程在主题或 schema 缺失时可能返回 `{ agentManifest: null }`(见\n // apps/workspace 的 cli/agent/_lib.ts)。直接把 null 传给后续 zod\n // 校验链会触发 `_zod` 这类底层异常,掩盖真实根因;这里抢先抛出可读错误。\n if (!result.agentManifest || !Array.isArray(result.agentManifest.sections)) {\n throw new Error(\n `Theme schema is not available for \"${resolvedKey}@${version}\". The theme may not be published, not active for the project, or its agent manifest is missing. Republish the theme or activate it before retrying.`,\n );\n }\n const realVersion = result.agentManifest.manifest.version;\n const realCachePath = cachedThemeManifestPath(resolvedKey, realVersion);\n await mkdir(path.dirname(realCachePath), { recursive: true });\n await writeFile(realCachePath, `${JSON.stringify(result.agentManifest, null, 2)}\\n`);\n return result.agentManifest;\n}\n\n/**\n * 解析人机交互的 `key@version` 格式。允许仅 `key`,也允许带 version。\n * 注意:theme key 现行约束不含 `@`,所以从右侧第一个 `@` 之后视为 version。\n *\n * Exported for unit-testing; not part of the CLI public surface.\n */\nexport function parseThemeRef(value: string): { key: string; version?: string } {\n const idx = value.lastIndexOf(\"@\");\n if (idx <= 0) {\n return { key: value };\n }\n const key = value.slice(0, idx);\n const version = value.slice(idx + 1);\n if (!version) {\n return { key };\n }\n return { key, version };\n}\n\nfunction printJson(value: unknown): void {\n console.log(JSON.stringify(value, null, 2));\n}\n\nfunction createSectionSchema(\n manifest: ThemeAgentManifest,\n sectionType: string,\n): AgentComponentOutput {\n const section = findAgentSection(manifest, sectionType);\n if (!section) {\n throw new Error(`Unknown section type \"${sectionType}\".`);\n }\n return createAgentComponentSchemaOutput(section, \"section\");\n}\n\nasync function validateAgentPage(\n themeKey: string,\n input: string,\n options: AgentThemeOptions,\n): Promise<void> {\n const manifest = await fetchAgentManifest(themeKey, options);\n const pageContent = await readJson<unknown>(path.resolve(input));\n const result = validateAgentPageContentWithManifest(pageContent, manifest);\n printJson(agentValidationResultSchema.parse(result));\n if (!result.valid) {\n process.exitCode = 1;\n }\n}\n\nasync function createAgentPage(options: AgentPageCreateOptions): Promise<void> {\n if (!options.projectId) {\n throw new Error(\"--project-id is required.\");\n }\n const pageContent = await readJson<unknown>(path.resolve(options.input));\n const manifest = await fetchAgentManifest(options.theme, options);\n const validation = validateAgentPageContentWithManifest(pageContent, manifest);\n if (!validation.valid) {\n printJson(agentValidationResultSchema.parse(validation));\n process.exitCode = 1;\n return;\n }\n const pageData = createPageDataFromAgentContent(pageContent);\n\n const auth = await requireCliBaseUrl();\n const response = await fetchJson<{ pageId: string }>(\n `${auth.baseUrl}/api/cli/agent/projects/${encodeURIComponent(options.projectId)}/pages`,\n {\n method: \"POST\",\n token: auth.token,\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n title: options.title,\n slug: options.slug,\n themeKey: manifest.manifest.key,\n themeVersion: manifest.manifest.version,\n data: pageData,\n }),\n },\n );\n printJson({ success: true, ...response });\n}\n\nasync function listAgentProjects(): Promise<AgentProjectSummary[]> {\n const auth = await requireCliBaseUrl();\n const result = await fetchJson<{ projects: AgentProjectSummary[] }>(\n `${auth.baseUrl}/api/cli/agent/projects`,\n { token: auth.token },\n );\n return result.projects;\n}\n\nasync function createAgentProject(\n options: AgentProjectCreateOptions,\n): Promise<AgentProjectCreated> {\n const auth = await requireCliBaseUrl();\n return fetchJson<AgentProjectCreated>(`${auth.baseUrl}/api/cli/agent/projects`, {\n method: \"POST\",\n token: auth.token,\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n name: options.name,\n siteDescription: options.siteDescription,\n }),\n });\n}\n\nfunction mcpStructured<T extends Record<string, unknown>>(summary: string, value: T) {\n return {\n content: [\n {\n type: \"text\" as const,\n text: summary,\n },\n ],\n structuredContent: value,\n };\n}\n\nasync function startMcpServer(): Promise<void> {\n const server = new McpServer({\n name: \"suda\",\n version: \"0.1.0\",\n });\n\n server.registerTool(\n \"list_projects\",\n {\n description:\n \"List Suda projects the current CLI user can access. ALWAYS call this first when the user asks to generate or edit a website. Flow: (1) If `projects` is empty, do NOT call this tool again; instead skip directly to gathering inputs and calling create_project (see its description). (2) If `projects` has one or more entries, you MUST ask the user which project to use before any further action — even if there is only a single project, present it and ask the user to confirm or pick a different one. Never auto-pick a project on the user's behalf.\",\n inputSchema: {},\n outputSchema: listProjectsOutputSchema.shape,\n },\n async () => {\n const structuredContent = listProjectsOutputSchema.parse({\n projects: await listAgentProjects(),\n });\n return mcpStructured(\"Suda projects accessible to the current user.\", structuredContent);\n },\n );\n\n server.registerTool(\n \"create_project\",\n {\n description:\n \"Create a new Suda project for the current user. Only call this after list_projects returned an empty list. Conversation flow before calling: (1) Ask the user for the website / brand name in one turn and capture it as `name`. (2) Ask the user for a business introduction; the user is allowed (and expected) to answer over multiple turns — keep asking follow-up questions and accumulating their answers until they confirm they are done, then concatenate the accumulated text into a single `siteDescription` (trimmed). Do not invent details the user did not provide. Do not call this tool until both fields are confirmed by the user. The project is created with the default theme and starter pages; no in-app AI site generation is triggered — drive page content afterwards via create_page_draft using the returned projectId.\",\n inputSchema: {\n name: createProjectInputSchema.shape.name.describe(\n \"Website or brand name confirmed by the user in a dedicated turn. Used as the project name and site title.\",\n ),\n siteDescription: createProjectInputSchema.shape.siteDescription.describe(\n \"Business introduction the user provided, possibly across multiple turns, then concatenated and trimmed. Captures what the site is about and who it serves. Used to seed default site metadata.\",\n ),\n },\n outputSchema: createProjectOutputSchema.shape,\n },\n async ({ name, siteDescription }) => {\n const result = await createAgentProject({ name, siteDescription });\n const structuredContent = createProjectOutputSchema.parse({\n projectId: result.projectId,\n name: result.name,\n defaultDomain: result.defaultDomain,\n dashboardUrl: result.dashboardUrl,\n });\n return mcpStructured(\"Created Suda project.\", structuredContent);\n },\n );\n\n server.registerTool(\n \"list_themes\",\n {\n description: \"List themes visible to the current Suda CLI user.\",\n inputSchema: {\n projectId: z.string().optional(),\n themeRoot: z.string().optional(),\n },\n outputSchema: {\n themes: z.array(\n z.object({\n key: z.string(),\n name: z.string(),\n version: z.string(),\n description: z.string().nullable().optional(),\n categories: z.array(z.string()).optional(),\n preview: z.string().optional(),\n active: z.boolean().optional(),\n }),\n ),\n },\n },\n async ({ projectId, themeRoot }) => {\n const structuredContent = { themes: await listAgentThemes({ projectId, themeRoot }) };\n return mcpStructured(\"Available Suda themes.\", structuredContent);\n },\n );\n\n server.registerTool(\n \"describe_theme\",\n {\n description: \"Return the raw Suda agent manifest for a theme.\",\n inputSchema: {\n theme: z.string(),\n version: z.string().optional(),\n projectId: z.string().optional(),\n themeRoot: z.string().optional(),\n },\n outputSchema: {\n agentManifest: z.unknown(),\n },\n },\n async ({ theme, version, projectId, themeRoot }) => {\n const structuredContent = {\n agentManifest: await fetchAgentManifest(theme, { version, projectId, themeRoot }),\n };\n return mcpStructured(\"Raw Suda theme agent manifest.\", structuredContent);\n },\n );\n\n server.registerTool(\n \"get_page_schema\",\n {\n description:\n \"Return the AI-first output schema for generating Suda page content, including all section schemas.\",\n inputSchema: {\n theme: z.string(),\n version: z.string().optional(),\n projectId: z.string().optional(),\n themeRoot: z.string().optional(),\n includeExample: z.boolean().optional(),\n },\n outputSchema: agentPageSchemaOutputSchema.shape,\n },\n async ({ theme, version, projectId, themeRoot, includeExample }) => {\n const manifest = await fetchAgentManifest(theme, { version, projectId, themeRoot });\n const structuredContent = createAgentPageSchemaOutput(manifest, {\n includeExample: includeExample === true,\n });\n return mcpStructured(\"AI-first Suda page content output schema.\", structuredContent);\n },\n );\n\n server.registerTool(\n \"get_section_schema\",\n {\n description: \"Return the AI-first output schema for one section component in a theme.\",\n inputSchema: {\n theme: z.string(),\n section: z.string(),\n version: z.string().optional(),\n projectId: z.string().optional(),\n themeRoot: z.string().optional(),\n },\n outputSchema: agentComponentOutputSchema.shape,\n },\n async ({ theme, section, version, projectId, themeRoot }) => {\n const manifest = await fetchAgentManifest(theme, { version, projectId, themeRoot });\n const structuredContent = createSectionSchema(manifest, section);\n return mcpStructured(\"AI-first Suda section output schema.\", structuredContent);\n },\n );\n\n server.registerTool(\n \"validate_page_config\",\n {\n description: \"Validate AI-generated Suda page content against a theme.\",\n inputSchema: {\n theme: z.string(),\n data: z.unknown(),\n version: z.string().optional(),\n projectId: z.string().optional(),\n themeRoot: z.string().optional(),\n },\n outputSchema: agentValidationResultSchema.shape,\n },\n async ({ theme, data, version, projectId, themeRoot }) => {\n const manifest = await fetchAgentManifest(theme, { version, projectId, themeRoot });\n const structuredContent = agentValidationResultSchema.parse(\n validateAgentPageContentWithManifest(data, manifest),\n );\n return mcpStructured(\"Suda page content validation result.\", structuredContent);\n },\n );\n\n server.registerTool(\n \"create_page_draft\",\n {\n description: \"Create a workspace page draft from AI-generated Suda page content.\",\n inputSchema: {\n projectId: z.string(),\n title: z.string(),\n slug: z.string(),\n theme: z.string(),\n data: z.unknown(),\n version: z.string().optional(),\n },\n outputSchema: createPageDraftOutputSchema,\n },\n async ({ projectId, title, slug, theme, data, version }) => {\n const manifest = await fetchAgentManifest(theme, { version, projectId });\n const validation = validateAgentPageContentWithManifest(data, manifest);\n if (!validation.valid) {\n return mcpStructured(\n \"Suda page content validation failed. Fix issues before creating a draft.\",\n createPageDraftOutputSchema.parse({\n status: \"invalid\",\n valid: false,\n issues: validation.issues,\n }),\n );\n }\n const auth = await requireCliBaseUrl();\n const response = await fetchJson<{ pageId: string }>(\n `${auth.baseUrl}/api/cli/agent/projects/${encodeURIComponent(projectId)}/pages`,\n {\n method: \"POST\",\n token: auth.token,\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n title,\n slug,\n themeKey: manifest.manifest.key,\n themeVersion: manifest.manifest.version,\n data: createPageDataFromAgentContent(data),\n }),\n },\n );\n return mcpStructured(\n \"Created Suda page draft.\",\n createPageDraftOutputSchema.parse({ status: \"created\", ...response }),\n );\n },\n );\n\n await server.connect(new StdioServerTransport());\n}\n\nasync function writeThemeArtifacts(theme: ValidatedTheme): Promise<void> {\n const dist = path.join(theme.root, \"dist\");\n const agentManifest = createThemeAgentManifest(theme.module);\n const manifestJson = `${JSON.stringify(theme.module.manifest, null, 2)}\\n`;\n await writeFile(path.join(dist, \"manifest.json\"), manifestJson);\n // Also write `manifest.json` to the theme root so the published artifact\n // exposes it at a CDN-friendly relative path (`themes/<k>/<v>/manifest.json`,\n // sibling of `styles.css`). The `dist/manifest.json` copy stays for worker /\n // local tooling that already reads it.\n await writeFile(path.join(theme.root, \"manifest.json\"), manifestJson);\n await writeFile(\n path.join(dist, \"starter-pages.json\"),\n `${JSON.stringify(theme.module.starterPages, null, 2)}\\n`,\n );\n await writeFile(\n path.join(dist, \"default-layout.json\"),\n `${JSON.stringify(theme.module.defaultLayout, null, 2)}\\n`,\n );\n await writeFile(\n path.join(dist, \"agent-manifest.json\"),\n `${JSON.stringify(agentManifest, null, 2)}\\n`,\n );\n}\n\nfunction contentTypeFor(relativePath: string): string {\n if (relativePath.endsWith(\".css\")) {\n return \"text/css; charset=utf-8\";\n }\n if (relativePath.endsWith(\".js\") || relativePath.endsWith(\".mjs\")) {\n return \"application/javascript; charset=utf-8\";\n }\n if (relativePath.endsWith(\".map\")) {\n return \"application/json; charset=utf-8\";\n }\n if (relativePath.endsWith(\".json\")) {\n return \"application/json; charset=utf-8\";\n }\n if (relativePath.endsWith(\".svg\")) {\n return \"image/svg+xml\";\n }\n if (relativePath.endsWith(\".png\")) {\n return \"image/png\";\n }\n if (relativePath.endsWith(\".jpg\") || relativePath.endsWith(\".jpeg\")) {\n return \"image/jpeg\";\n }\n if (relativePath.endsWith(\".webp\")) {\n return \"image/webp\";\n }\n if (relativePath.endsWith(\".avif\")) {\n return \"image/avif\";\n }\n if (relativePath.endsWith(\".gif\")) {\n return \"image/gif\";\n }\n if (relativePath.endsWith(\".ico\")) {\n return \"image/x-icon\";\n }\n if (relativePath.endsWith(\".woff2\")) {\n return \"font/woff2\";\n }\n if (relativePath.endsWith(\".woff\")) {\n return \"font/woff\";\n }\n if (relativePath.endsWith(\".ttf\")) {\n return \"font/ttf\";\n }\n if (relativePath.endsWith(\".otf\")) {\n return \"font/otf\";\n }\n if (relativePath.endsWith(\".mp4\")) {\n return \"video/mp4\";\n }\n if (relativePath.endsWith(\".webm\")) {\n return \"video/webm\";\n }\n if (relativePath.endsWith(\".txt\")) {\n return \"text/plain; charset=utf-8\";\n }\n if (relativePath.endsWith(\".xml\")) {\n return \"application/xml; charset=utf-8\";\n }\n return \"application/octet-stream\";\n}\n\nasync function collectFiles(root: string, directory: string): Promise<UploadFile[]> {\n const files: UploadFile[] = [];\n if (!(await pathExists(directory))) {\n return files;\n }\n\n const children = await readdir(directory, { withFileTypes: true });\n for (const child of children) {\n const absolutePath = path.join(directory, child.name);\n if (child.isDirectory()) {\n files.push(...(await collectFiles(root, absolutePath)));\n continue;\n }\n const relativePath = path.relative(root, absolutePath).replaceAll(path.sep, \"/\");\n files.push({\n absolutePath,\n relativePath,\n contentType: contentTypeFor(relativePath),\n });\n }\n return files;\n}\n\nasync function collectThemeArtifactFiles(theme: ValidatedTheme): Promise<UploadFile[]> {\n const files = await collectFiles(theme.root, path.join(theme.root, \"dist\"));\n const assetsFiles = await collectFiles(theme.root, path.join(theme.root, \"assets\"));\n files.push(...assetsFiles);\n if (theme.stylesheetPath) {\n files.push({\n absolutePath: theme.stylesheetPath,\n relativePath: \"styles.css\",\n contentType: \"text/css; charset=utf-8\",\n });\n }\n // Root-level `manifest.json` is the canonical CDN-facing manifest (sibling\n // of `styles.css`). `writeThemeArtifacts` writes it; collect it explicitly\n // because the recursive `collectFiles(theme.root, dist)` only walks the\n // `dist/` subdirectory.\n const rootManifestPath = path.join(theme.root, \"manifest.json\");\n if (await pathExists(rootManifestPath)) {\n files.push({\n absolutePath: rootManifestPath,\n relativePath: \"manifest.json\",\n contentType: \"application/json; charset=utf-8\",\n });\n }\n return files;\n}\n\n/**\n * Files that must exist on the published artifact for SudaCloud's SSR runtime\n * to load a theme. Mirrored on the server in\n * `apps/workspace/server/services/theme-publish-service.ts` as\n * `SSR_REQUIRED_ARTIFACTS`. Keep both lists in sync.\n */\nconst SSR_REQUIRED_ARTIFACTS = [\n \"dist/index.js\",\n \"dist/runtime.client.js\",\n \"manifest.json\",\n \"styles.css\",\n] as const;\n\nasync function checksum(files: UploadFile[]): Promise<string> {\n const hash = createHash(\"sha256\");\n for (const file of files.sort((a, b) => a.relativePath.localeCompare(b.relativePath))) {\n hash.update(file.relativePath);\n hash.update(await readFile(file.absolutePath));\n }\n return hash.digest(\"hex\");\n}\n\n/**\n * Format an unsuccessful HTTP response from the publish API into a single\n * human-readable string. The server returns `{ error, issues? }` where\n * `issues` is the raw `ZodError.issues` array (path + message) for 422\n * validation failures. Surfacing those keeps `Invalid request` from being\n * the only thing the user sees when the request body fails schema checks.\n */\nasync function formatHttpErrorBody(res: Response): Promise<string> {\n const fallback = `${res.status} ${res.statusText}`;\n const body = (await res.json().catch(() => null)) as {\n error?: string;\n issues?: Array<{ path?: Array<string | number>; message?: string }>;\n } | null;\n if (!body) {\n return fallback;\n }\n const message = body.error ?? fallback;\n if (Array.isArray(body.issues) && body.issues.length > 0) {\n const lines = body.issues.map((issue) => {\n const pathSegments = Array.isArray(issue.path) ? issue.path : [];\n const where = pathSegments.length > 0 ? pathSegments.join(\".\") : \"<root>\";\n return ` - ${where}: ${issue.message ?? \"invalid\"}`;\n });\n return `${message}\\n${lines.join(\"\\n\")}`;\n }\n return message;\n}\n\nasync function publishTheme(\n root: string,\n skipBuild: boolean,\n skipCheck: boolean,\n force: boolean,\n): Promise<void> {\n const theme = skipBuild ? await validateTheme(root) : await buildTheme(root, false);\n // Idempotently (re)write the theme artifacts (manifest.json at both\n // `dist/` and root, agent-manifest.json, etc.). `buildTheme` already does\n // this when `skipBuild === false`, but `--skip-build` would otherwise bypass\n // generation of the root-level `manifest.json` introduced in this release —\n // forcing every publish path through `writeThemeArtifacts` keeps the\n // CDN-facing artifact set (root `manifest.json`, sibling of `styles.css`)\n // consistent regardless of how the user invoked `publish`.\n await writeThemeArtifacts(theme);\n // Run the AI-metadata gate before uploading. `theme build` already runs it\n // when `skipBuild === false`, but skipping the check here would let\n // `--skip-build` bypass the contract entirely, and we want a single source\n // of truth for \"is this theme allowed to leave the developer's machine?\".\n if (!skipCheck) {\n const ok = runThemeCheck(theme);\n if (!ok) {\n throw new Error(\"AI metadata check failed. Fix the errors above or rerun with --skip-check.\");\n }\n }\n const files = await collectThemeArtifactFiles(theme);\n if (!theme.clientEntryPath) {\n throw new Error(\"Missing dist/runtime.client.js. Run `suda theme build` first.\");\n }\n // Assert the SSR contract before talking to the workspace API: the server\n // independently re-checks the same set with `HeadObject`, but failing\n // locally produces a clearer error and avoids burning a publish-intent.\n const collectedPaths = new Set(files.map((f) => f.relativePath));\n for (const required of SSR_REQUIRED_ARTIFACTS) {\n if (!collectedPaths.has(required)) {\n throw new Error(\n `Missing required SSR artifact: ${required}. Run \\`suda theme build\\` and ensure ${required === \"styles.css\" ? \"a `styles.css` file exists at the theme root\" : `\\`${required}\\` is generated`}.`,\n );\n }\n }\n\n const config = await readAuthConfig();\n if (!config) {\n throw new Error(\"Not logged in. Run `suda auth login` to authenticate first.\");\n }\n\n const baseUrl = `${protocolForHost(config.host)}://${config.host}`;\n const { key, version } = theme.module.manifest;\n const digest = await checksum(files);\n\n // `--force` is a development-only recovery path: tear down the previous\n // `themes/<key>/<version>/` prefix and DB row before going through the\n // normal publish-intent → upload → publish-complete flow. The CLI does\n // not hold S3 credentials; the workspace endpoint owns the cleanup.\n if (force) {\n const forceRes = await fetch(`${baseUrl}/api/cli/themes/publish-force`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${config.sessionToken}`,\n },\n body: JSON.stringify({ key, version }),\n });\n if (!forceRes.ok && forceRes.status !== 404) {\n throw new Error(`Failed to force-clear ${key}@${version}: ${await formatHttpErrorBody(forceRes)}`);\n }\n if (forceRes.ok) {\n const { deletedObjects } = (await forceRes.json()) as { deletedObjects?: number };\n console.log(\n `force-cleared ${key}@${version} (${deletedObjects ?? 0} objects removed). Republishing...`,\n );\n }\n }\n\n const intentRes = await fetch(`${baseUrl}/api/cli/themes/publish-intent`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${config.sessionToken}`,\n },\n body: JSON.stringify({\n key,\n version,\n checksum: digest,\n files: files.map((f) => ({ relativePath: f.relativePath, contentType: f.contentType })),\n }),\n });\n\n if (!intentRes.ok) {\n throw new Error(`Failed to get publish intent: ${await formatHttpErrorBody(intentRes)}`);\n }\n\n const { urls } = (await intentRes.json()) as {\n urls: Array<{ relativePath: string; url: string }>;\n };\n\n // Upload to S3 using presigned URLs\n for (const file of files) {\n const urlObj = urls.find((u) => u.relativePath === file.relativePath);\n if (!urlObj) {\n throw new Error(`Missing presigned URL for ${file.relativePath}`);\n }\n\n const body = await readFile(file.absolutePath);\n const putRes = await fetch(urlObj.url, {\n method: \"PUT\",\n headers: {\n \"Content-Type\": file.contentType,\n },\n body,\n });\n\n if (!putRes.ok) {\n throw new Error(`Failed to upload ${file.relativePath}: ${putRes.statusText}`);\n }\n console.log(`uploaded ${createThemeObjectKey(key, version, file.relativePath)}`);\n }\n\n const bundleArtifactRelative = \"dist/index.js\";\n // `bundleArtifactRelative` presence is already enforced above through\n // `SSR_REQUIRED_ARTIFACTS`; we still pass the literal string to the server\n // so it can read the bundle key without re-deriving it.\n\n const previewArtifactRelative = \"dist/preview/desktop.png\";\n const previewArtifactExists = await pathExists(path.join(theme.root, previewArtifactRelative));\n const agentManifest = createThemeAgentManifest(theme.module);\n\n const completeRes = await fetch(`${baseUrl}/api/cli/themes/publish-complete`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${config.sessionToken}`,\n },\n body: JSON.stringify({\n key,\n version,\n checksum: digest,\n manifest: theme.module.manifest,\n agentManifest,\n bundleArtifactRelative,\n previewArtifactRelative: previewArtifactExists ? previewArtifactRelative : undefined,\n }),\n });\n\n if (!completeRes.ok) {\n throw new Error(`Failed to complete publish: ${await formatHttpErrorBody(completeRes)}`);\n }\n\n console.log(`published ${key}@${version}`);\n}\n\ninterface CliPackageVersions {\n /** Caret-prefixed semver range to install for `@sudajs/theme-engine`. */\n themeEngine: string;\n /** Caret-prefixed semver range to install for `@sudajs/cli`. */\n cli: string;\n}\n\nlet cachedCliPackageVersions: CliPackageVersions | undefined;\n\n/**\n * Reads the CLI's own `package.json` so scaffolded themes pin to a\n * `@sudajs/theme-engine` whose types match the CLI invoking `theme init`.\n *\n * In the published CLI, `dependencies[\"@sudajs/theme-engine\"]` is already a\n * real semver range (changesets resolves `workspace:*` at publish time), so\n * we forward it verbatim. In the monorepo (`workspace:*`) we instead read\n * the live `@sudajs/theme-engine/package.json` so the scaffolded starter\n * pins to the version under development, which can diverge from the CLI's\n * own version after this release decoupled the two majors.\n */\nasync function readCliPackageVersions(): Promise<CliPackageVersions> {\n if (cachedCliPackageVersions) {\n return cachedCliPackageVersions;\n }\n const here = fileURLToPath(import.meta.url);\n // dist/index.js or src/index.ts → ../package.json\n const cliPkgPath = path.resolve(path.dirname(here), \"..\", \"package.json\");\n let cliRaw: string;\n try {\n cliRaw = await readFile(cliPkgPath, \"utf8\");\n } catch {\n // Should not happen in a real install, but stay resilient in tests.\n cachedCliPackageVersions = { themeEngine: \"*\", cli: \"*\" };\n return cachedCliPackageVersions;\n }\n const cliPkg = JSON.parse(cliRaw) as {\n version?: string;\n dependencies?: Record<string, string>;\n };\n const cliVersion = typeof cliPkg.version === \"string\" ? cliPkg.version : \"0.0.0\";\n const declaredEngine = cliPkg.dependencies?.[\"@sudajs/theme-engine\"];\n let themeEngine: string;\n if (declaredEngine && !declaredEngine.startsWith(\"workspace:\")) {\n // Published CLI tarball: changesets has already replaced workspace:* with\n // a real semver range, which is exactly what we want to forward.\n themeEngine = declaredEngine;\n } else {\n // Monorepo / development: resolve the engine's actual version from its\n // own package.json. The CLI version is NOT a safe fallback here — the\n // engine and CLI ship independent majors via separate changesets, so\n // `^${cliVersion}` could pin scaffolded themes to a non-existent or\n // incompatible engine release. We instead error out loudly so a broken\n // dev environment is fixed before generating a starter.\n let resolved: string | undefined;\n try {\n const require = createRequire(import.meta.url);\n const enginePkgPath = require.resolve(\"@sudajs/theme-engine/package.json\");\n const engineRaw = await readFile(enginePkgPath, \"utf8\");\n const engineVersion = (JSON.parse(engineRaw) as { version?: string }).version;\n if (typeof engineVersion === \"string\" && engineVersion.length > 0) {\n resolved = `^${engineVersion}`;\n }\n } catch {\n // fall through to the explicit error below\n }\n if (!resolved) {\n throw new Error(\n \"suda theme init: cannot determine the @sudajs/theme-engine version to scaffold. \" +\n \"The CLI's package.json declares it as `workspace:*` (monorepo dev mode) but \" +\n \"`@sudajs/theme-engine/package.json` could not be resolved from the CLI's runtime. \" +\n \"Run `pnpm install` and re-run from the monorepo root, or install a published \" +\n \"@sudajs/cli tarball (which pins a real semver range).\",\n );\n }\n themeEngine = resolved;\n }\n cachedCliPackageVersions = {\n themeEngine,\n cli: `^${cliVersion}`,\n };\n return cachedCliPackageVersions;\n}\n\nasync function initTheme(target: string): Promise<void> {\n const key = path\n .basename(target)\n .replace(/[^a-zA-Z0-9._-]/g, \"-\")\n .toLowerCase();\n // Pin scaffolded themes to the CLI's own dependency declarations so\n // `suda theme init` never produces a project that pulls in an older\n // `@sudajs/theme-engine` whose `SudaComponentConfig` type is out of sync\n // with the CLI's `theme check` requirements.\n const cliPackageVersions = await readCliPackageVersions();\n await mkdir(path.join(target, \"src\"), { recursive: true });\n await writeFile(\n path.join(target, \"package.json\"),\n `${JSON.stringify(\n {\n name: `@suda-themes/${key}`,\n version: \"0.1.0\",\n private: true,\n packageManager: \"pnpm@11.6.0\",\n type: \"module\",\n main: \"./dist/index.js\",\n types: \"./dist/index.d.ts\",\n scripts: {\n // `build:src` compiles TypeScript sources to dist/. `build` then runs\n // `suda theme build --skip-theme-build` so the CLI does not recurse\n // back into this script (it would otherwise see scripts.build and\n // call `pnpm run build` again, causing infinite recursion).\n \"build:src\": \"tsc -p tsconfig.json\",\n build: \"pnpm run build:src && suda theme build --theme-root . --skip-theme-build\",\n dev: \"suda theme dev --theme-root . --skip-theme-build\",\n typecheck: \"tsc -p tsconfig.json --noEmit\",\n validate: \"suda theme validate --theme-root .\",\n },\n dependencies: {\n \"@sudajs/theme-engine\": cliPackageVersions.themeEngine,\n },\n devDependencies: {\n \"@puckeditor/core\": \"^0.21.2\",\n \"@sudajs/cli\": cliPackageVersions.cli,\n \"@types/node\": \"^22.0.0\",\n \"@types/react\": \"^19.0.0\",\n \"@types/react-dom\": \"^19.0.0\",\n react: \"^19.0.0\",\n \"react-dom\": \"^19.0.0\",\n typescript: \"^5.6.0\",\n },\n peerDependencies: {\n \"@puckeditor/core\": \"^0.21.2\",\n react: \"^19.0.0\",\n \"react-dom\": \"^19.0.0\",\n },\n },\n null,\n 2,\n )}\\n`,\n );\n // pnpm 11 removed `pnpm.onlyBuiltDependencies` from `package.json` and the\n // `package.json#pnpm` overrides field; everything must live in\n // `pnpm-workspace.yaml`. Even a standalone single-package theme project\n // needs this file to allow esbuild's postinstall to run.\n await writeFile(\n path.join(target, \"pnpm-workspace.yaml\"),\n `# This is NOT a monorepo marker — it only exists because pnpm 11 moved\\n# project-level settings such as \\`allowBuilds\\` out of package.json. Without\\n# a \\`packages:\\` field this workspace contains just the current package, so\\n# the project remains a standalone single-package theme.\\n# See https://pnpm.io/settings and https://pnpm.io/pnpm-workspace_yaml.\\nallowBuilds:\\n esbuild: true\\n`,\n );\n await writeFile(\n path.join(target, \"tsconfig.json\"),\n `${JSON.stringify(\n {\n compilerOptions: {\n target: \"ES2022\",\n lib: [\"DOM\", \"DOM.Iterable\", \"ES2022\"],\n module: \"NodeNext\",\n moduleResolution: \"NodeNext\",\n jsx: \"react-jsx\",\n rootDir: \"src\",\n outDir: \"dist\",\n declaration: true,\n declarationMap: true,\n sourceMap: true,\n strict: true,\n noUncheckedIndexedAccess: true,\n esModuleInterop: true,\n skipLibCheck: true,\n forceConsistentCasingInFileNames: true,\n resolveJsonModule: true,\n types: [\"node\"],\n },\n // `package.json` is included so `src/index.tsx` can read its `version`\n // via `import pkg from \"../package.json\"`. tsc tolerates this with\n // rootDir pinned because the JSON is resolved as input but not emitted.\n include: [\"src\", \"package.json\"],\n },\n null,\n 2,\n )}\\n`,\n );\n await writeFile(\n path.join(target, \"src\", \"manifest.ts\"),\n `import type { ThemeSourceManifest } from \"@sudajs/theme-engine\";\\n\\n// Source-side manifest — version is intentionally omitted because the\\n// authoritative theme version lives in package.json. \\`src/index.tsx\\` reads\\n// package.json#version and merges it into the published ThemeManifest, so a\\n// single \\`pnpm changeset version\\` (or \\`npm version\\`) bumps everything.\\nexport const sourceManifest: ThemeSourceManifest = {\\n key: \"${key}\",\\n name: \"${key}\",\\n categories: [\"other\"],\\n minEngineVersion: \"0.0.0\",\\n entry: \"dist/index.js\",\\n clientEntry: \"dist/runtime.client.js\",\\n // Required. SudaCloud currently hosts SSR themes only; CSR/Hybrid postures\\n // are on the roadmap. Authoring \\`renderMode\\` is the contract a theme uses\\n // to declare which posture it expects from the host.\\n renderMode: \"ssr\",\\n};\\n`,\n );\n await writeFile(\n path.join(target, \"src\", \"theme-asset.ts\"),\n `import { createThemeAssetResolver } from \"@sudajs/theme-engine/runtime\";\\n\\nimport pkg from \"../package.json\" with { type: \"json\" };\\nimport { sourceManifest } from \"./manifest.js\";\\n\\nexport const themeAsset = createThemeAssetResolver(sourceManifest.key, pkg.version);\\n`,\n );\n await writeFile(\n path.join(target, \"src\", \"sections.tsx\"),\n `import type { SudaComponentConfig } from \"@sudajs/theme-engine\";\\n\\nexport const Hero: SudaComponentConfig = {\\n label: \"Hero\",\\n ai: {\\n instructions:\\n \"Primary page introduction used to communicate the main value proposition. \" +\\n \"Place near the beginning of landing, product, service, or campaign pages. \" +\\n \"Include one concise headline, supporting copy, and one primary call to action. \" +\\n \"Use at most once per page. Do not use for ordinary section headings or article content.\",\\n },\\n fields: {\\n eyebrow: { type: \"text\", label: \"Eyebrow\" },\\n title: { type: \"text\", label: \"Title\" },\\n description: { type: \"textarea\", label: \"Description\" },\\n primaryLabel: { type: \"text\", label: \"Primary button label\" },\\n primaryHref: { type: \"text\", label: \"Primary button link\" },\\n },\\n defaultProps: {\\n eyebrow: \"New theme\",\\n title: \"Build with SudaCloud\",\\n description: \"Edit this starter section in the visual editor.\",\\n primaryLabel: \"Get started\",\\n primaryHref: \"#contact\",\\n },\\n render: ({ eyebrow, title, description, primaryLabel, primaryHref }) => (\\n <section className=\"${key}-section ${key}-hero\">\\n <p className=\"${key}-eyebrow\">{eyebrow}</p>\\n <h1>{title}</h1>\\n <p>{description}</p>\\n <a className=\"${key}-button\" href={primaryHref}>{primaryLabel}</a>\\n </section>\\n ),\\n};\\n\\nexport const FeatureGrid: SudaComponentConfig = {\\n label: \"Feature grid\",\\n ai: {\\n instructions:\\n \"Section that lists 3–6 short feature or benefit cards explaining what the product or service offers. \" +\\n \"Place after the hero / introduction and before the final call-to-action. \" +\\n \"Use when the page needs to communicate multiple distinct value points; do not use for testimonials, FAQs, or step-by-step processes.\",\\n },\\n fields: {\\n title: { type: \"text\", label: \"Title\" },\\n description: { type: \"textarea\", label: \"Description\" },\\n features: {\\n type: \"array\",\\n label: \"Features\",\\n arrayFields: {\\n title: { type: \"text\", label: \"Title\" },\\n description: { type: \"textarea\", label: \"Description\" },\\n },\\n },\\n },\\n defaultProps: {\\n title: \"Everything you need to launch\",\\n description: \"Use this section to explain the core value of the project.\",\\n features: [\\n { title: \"Fast setup\", description: \"Start from a clean theme contract.\" },\\n { title: \"Visual editing\", description: \"Expose content fields through Puck.\" },\\n { title: \"Publish ready\", description: \"Build and publish with the Suda CLI.\" },\\n ],\\n },\\n render: ({ title, description, features = [] }) => (\\n <section className=\"${key}-section\">\\n <h2>{title}</h2>\\n <p>{description}</p>\\n <div className=\"${key}-grid\">\\n {features.map((feature: { title?: string; description?: string }, index: number) => (\\n <article className=\"${key}-card\" key={index}>\\n <h3>{feature.title}</h3>\\n <p>{feature.description}</p>\\n </article>\\n ))}\\n </div>\\n </section>\\n ),\\n};\\n\\nexport const Testimonial: SudaComponentConfig = {\\n label: \"Testimonial\",\\n ai: {\\n instructions:\\n \"Section that quotes a single customer or expert as social proof. \" +\\n \"Place mid-page after a feature or value section, or near the end before the final CTA. \" +\\n \"Do not invent quotes, names, or roles; only use content the user provides.\",\\n },\\n fields: {\\n quote: { type: \"textarea\", label: \"Quote\" },\\n author: { type: \"text\", label: \"Author\" },\\n role: { type: \"text\", label: \"Role\" },\\n },\\n defaultProps: {\\n quote: \"SudaCloud gives our team a practical editing workflow without giving up theme control.\",\\n author: \"Alex Chen\",\\n role: \"Founder\",\\n },\\n render: ({ quote, author, role }) => (\\n <section className=\"${key}-section ${key}-quote\">\\n <blockquote>{quote}</blockquote>\\n <p>{author} · {role}</p>\\n </section>\\n ),\\n};\\n\\nexport const CallToAction: SudaComponentConfig = {\\n label: \"Call to action\",\\n ai: {\\n instructions:\\n \"Closing conversion section that invites the visitor to take a specific action (sign up, contact, buy, etc.). \" +\\n \"Place near the end of the page, after supporting content. \" +\\n \"Use at most once per page. Do not use as the page's first introduction — the Hero component fills that role.\",\\n },\\n fields: {\\n title: { type: \"text\", label: \"Title\" },\\n description: { type: \"textarea\", label: \"Description\" },\\n buttonLabel: { type: \"text\", label: \"Button label\" },\\n buttonHref: { type: \"text\", label: \"Button link\" },\\n },\\n defaultProps: {\\n title: \"Ready to build your next page?\",\\n description: \"Use this section as the final conversion block.\",\\n buttonLabel: \"Contact us\",\\n buttonHref: \"#contact\",\\n },\\n render: ({ title, description, buttonLabel, buttonHref }) => (\\n <section className=\"${key}-section ${key}-cta\" id=\"contact\">\\n <h2>{title}</h2>\\n <p>{description}</p>\\n <a className=\"${key}-button\" href={buttonHref}>{buttonLabel}</a>\\n </section>\\n ),\\n};\\n\\nexport const SECTION_COMPONENTS = { Hero, FeatureGrid, Testimonial, CallToAction };\\n`,\n );\n await writeFile(\n path.join(target, \"src\", \"layout.tsx\"),\n `import { getPageSlot } from \"@sudajs/theme-engine/runtime\";\\nimport type { Config } from \"@puckeditor/core\";\\nimport type { SudaComponentConfig } from \"@sudajs/theme-engine\";\\nimport type { ReactElement, ReactNode } from \"react\";\\n\\ntype PuckExtras = { puck?: { metadata?: Record<string, unknown> } };\\n\\nexport const rootConfig: NonNullable<Config[\"root\"]> = {\\n fields: {\\n siteName: { type: \"text\", label: \"Site name\" },\\n },\\n defaultProps: { siteName: \"${key}\" },\\n render: ({ children, siteName }: { children?: ReactNode; siteName?: string }) => (\\n <div className=\"${key}-root\" data-site-name={siteName}>{children}</div>\\n ),\\n};\\n\\nexport const Header: SudaComponentConfig = {\\n label: \"Header\",\\n ai: {\\n instructions:\\n \"Site-wide header rendered at the top of every page. \" +\\n \"Place once at the top of the layout (not inside page content). \" +\\n \"Used for branding and primary navigation, not for promotional content.\",\\n },\\n fields: { siteName: { type: \"text\", label: \"Site name\" } },\\n defaultProps: { siteName: \"${key}\" },\\n render: ({ siteName }) => <header className=\"${key}-header\">{siteName}</header>,\\n};\\n\\nexport const PageOutlet: SudaComponentConfig = {\\n label: \"Page outlet\",\\n ai: {\\n exclude: true,\\n instructions:\\n \"Structural slot where each page's content is injected. \" +\\n \"Managed by the layout, never created or placed by AI.\",\\n },\\n fields: {},\\n defaultProps: {},\\n render: (props: PuckExtras): ReactElement => <>{getPageSlot(props.puck?.metadata)}</>,\\n};\\n\\nexport const Footer: SudaComponentConfig = {\\n label: \"Footer\",\\n ai: {\\n instructions:\\n \"Site-wide footer rendered at the bottom of every page. \" +\\n \"Place once at the end of the layout. \" +\\n \"Used for legal text, copyright, and secondary links — not for primary CTAs.\",\\n },\\n fields: { text: { type: \"text\", label: \"Text\" } },\\n defaultProps: { text: \"© ${key}\" },\\n render: ({ text }) => <footer className=\"${key}-footer\">{text}</footer>,\\n};\\n\\nexport const LAYOUT_COMPONENTS = { Header, PageOutlet, Footer };\\n`,\n );\n await writeFile(\n path.join(target, \"src\", \"config.ts\"),\n `import type { Config, Data } from \"@puckeditor/core\";\\n\\nimport { LAYOUT_COMPONENTS, rootConfig } from \"./layout.js\";\\nimport { SECTION_COMPONENTS } from \"./sections.js\";\\n\\nexport const pageConfig: Config = {\\n components: SECTION_COMPONENTS,\\n};\\n\\nexport const layoutConfig: Config = {\\n root: rootConfig,\\n components: LAYOUT_COMPONENTS,\\n};\\n\\nexport const defaultLayout: Data = {\\n root: { props: { siteName: \"${key}\" } },\\n content: [\\n { type: \"Header\", props: { id: \"Header-1\", siteName: \"${key}\" } },\\n { type: \"PageOutlet\", props: { id: \"PageOutlet-1\" } },\\n { type: \"Footer\", props: { id: \"Footer-1\", text: \"© ${key}\" } },\\n ],\\n};\\n`,\n );\n await writeFile(\n path.join(target, \"src\", \"templates.ts\"),\n `import type { ThemeStarterPage } from \"@sudajs/theme-engine\";\\n\\nexport const starterPages: ThemeStarterPage[] = [\\n {\\n slug: \"home\",\\n title: \"Home\",\\n isHome: true,\\n data: {\\n root: { props: {} },\\n content: [\\n {\\n type: \"Hero\",\\n props: {\\n id: \"Hero-1\",\\n eyebrow: \"Starter page\",\\n title: \"Welcome to ${key}\",\\n description: \"This page was generated by suda theme init.\",\\n primaryLabel: \"Explore features\",\\n primaryHref: \"#features\",\\n },\\n },\\n {\\n type: \"FeatureGrid\",\\n props: {\\n id: \"FeatureGrid-1\",\\n title: \"Designed for editable sites\",\\n description: \"Starter sections show agents and editors how this theme is structured.\",\\n features: [\\n { title: \"Typed fields\", description: \"Each section exposes a clear field schema.\" },\\n { title: \"Starter pages\", description: \"Templates show realistic section composition.\" },\\n { title: \"CLI workflow\", description: \"Build, validate, preview, and publish from one tool.\" },\\n ],\\n },\\n },\\n {\\n type: \"CallToAction\",\\n props: {\\n id: \"CallToAction-1\",\\n title: \"Launch your first page\",\\n description: \"Customize this starter template or let an agent generate a new draft.\",\\n buttonLabel: \"Get in touch\",\\n buttonHref: \"/contact\",\\n },\\n },\\n ],\\n },\\n },\\n {\\n slug: \"about\",\\n title: \"About\",\\n data: {\\n root: { props: {} },\\n content: [\\n {\\n type: \"Hero\",\\n props: {\\n id: \"Hero-About\",\\n eyebrow: \"About\",\\n title: \"A clean starting point for your story\",\\n description: \"Use this page to introduce the project, audience, and promise.\",\\n primaryLabel: \"Contact us\",\\n primaryHref: \"/contact\",\\n },\\n },\\n {\\n type: \"Testimonial\",\\n props: {\\n id: \"Testimonial-About\",\\n quote: \"This starter theme keeps the editable surface focused and predictable.\",\\n author: \"SudaCloud\",\\n role: \"Theme team\",\\n },\\n },\\n ],\\n },\\n },\\n {\\n slug: \"contact\",\\n title: \"Contact\",\\n data: {\\n root: { props: {} },\\n content: [\\n {\\n type: \"Hero\",\\n props: {\\n id: \"Hero-Contact\",\\n eyebrow: \"Contact\",\\n title: \"Let's talk\",\\n description: \"Tell visitors how to reach you and what happens next.\",\\n primaryLabel: \"Email us\",\\n primaryHref: \"mailto:hello@example.com\",\\n },\\n },\\n {\\n type: \"CallToAction\",\\n props: {\\n id: \"CallToAction-Contact\",\\n title: \"Start the conversation\",\\n description: \"Replace this copy with your preferred contact details or form link.\",\\n buttonLabel: \"Send an email\",\\n buttonHref: \"mailto:hello@example.com\",\\n },\\n },\\n ],\\n },\\n },\\n];\\n`,\n );\n await writeFile(\n path.join(target, \"src\", \"index.tsx\"),\n `import type { ThemeManifest, ThemeModule } from \"@sudajs/theme-engine\";\\n\\nimport pkg from \"../package.json\" with { type: \"json\" };\\nimport { defaultLayout, layoutConfig, pageConfig } from \"./config.js\";\\nimport { sourceManifest } from \"./manifest.js\";\\nimport { starterPages } from \"./templates.js\";\\n\\n// Single source of truth: theme version comes from package.json#version,\\n// merged into the source-side manifest. esbuild inlines the JSON import at\\n// build time, so the published \\`dist/index.js\\` is fully self-contained.\\nexport const manifest: ThemeManifest = { ...sourceManifest, version: pkg.version };\\n\\nconst theme: ThemeModule = {\\n manifest,\\n pageConfig,\\n layoutConfig,\\n defaultLayout,\\n starterPages,\\n};\\n\\nexport default theme;\\nexport { pageConfig, layoutConfig, defaultLayout, starterPages };\\n`,\n );\n await writeFile(\n path.join(target, \"src\", \"runtime.client.ts\"),\n '\"use client\";\\n\\nimport theme from \"./index.js\";\\n\\nexport default theme;\\n',\n );\n await writeFile(\n path.join(target, \"styles.css\"),\n `.${key}-root { font-family: Inter, ui-sans-serif, system-ui, sans-serif; color: #111827; background: #ffffff; }\\n.${key}-header, .${key}-footer { padding: 20px clamp(20px, 5vw, 64px); border-bottom: 1px solid #e5e7eb; }\\n.${key}-footer { border-top: 1px solid #e5e7eb; border-bottom: 0; color: #6b7280; }\\n.${key}-section { padding: 64px clamp(20px, 5vw, 64px); }\\n.${key}-hero { background: #f8fafc; }\\n.${key}-eyebrow { text-transform: uppercase; letter-spacing: 0.08em; font-size: 12px; color: #2563eb; font-weight: 700; }\\n.${key}-section h1 { max-width: 780px; font-size: clamp(40px, 7vw, 72px); line-height: 0.95; margin: 0 0 20px; }\\n.${key}-section h2 { max-width: 720px; font-size: 36px; line-height: 1.05; margin: 0 0 16px; }\\n.${key}-section p { max-width: 680px; line-height: 1.7; color: #4b5563; }\\n.${key}-button { display: inline-flex; align-items: center; min-height: 42px; padding: 0 18px; border-radius: 8px; background: #111827; color: #ffffff; text-decoration: none; font-weight: 700; }\\n.${key}-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); gap: 16px; margin-top: 28px; }\\n.${key}-card { border: 1px solid #e5e7eb; border-radius: 8px; padding: 20px; }\\n.${key}-quote blockquote { max-width: 780px; font-size: 28px; line-height: 1.25; margin: 0 0 16px; }\\n.${key}-cta { background: #111827; color: #ffffff; }\\n.${key}-cta p { color: #d1d5db; }\\n.${key}-cta .${key}-button { background: #ffffff; color: #111827; }\\n`,\n );\n await writeFile(path.join(target, \".gitignore\"), \"node_modules\\ndist\\n*.tsbuildinfo\\n\");\n await writeFile(\n path.join(target, \"AGENTS.md\"),\n `# Suda Theme Agent Guide\\n\\nThis directory is a Suda theme source project generated by \\`suda theme init\\`.\\nIt is a **standalone** npm package — it does not depend on the SudaCloud monorepo.\\n\\n## Render mode\\n\\nThis theme contract requires \\`renderMode: \"ssr\"\\` in the source manifest\\n(\\`src/manifest.ts\\`). SudaCloud's site runtime currently only supports SSR\\nthemes; CSR / Hybrid postures are on the roadmap. **Do not** introduce\\nclient-only entry points or assume browser-only globals at module scope —\\nthe theme bundle must execute in a Node SSR context.\\n\\n## What to edit\\n\\n- Add page sections in \\`src/sections.tsx\\` and register them in \\`SECTION_COMPONENTS\\`.\\n- Add starter pages in \\`src/templates.ts\\` to show realistic section combinations.\\n- Keep shared site chrome in \\`src/layout.tsx\\`; \\`PageOutlet\\` is where page content renders.\\n- Keep \\`src/index.tsx\\` exporting the source \\`ThemeModule\\`. The final artifact is produced by \\`suda theme build\\`.\\n- All relative imports under \\`src/\\` MUST include the \\`.js\\` extension (NodeNext ESM resolution).\\n\\n## Page content rules\\n\\n- Agent page files passed to \\`suda agent page validate/create\\` contain \\`content\\` and optional \\`zones\\` only.\\n- Every \\`content[]\\` item must use a section type from \\`SECTION_COMPONENTS\\`.\\n- Every \\`content[]\\` item must include \\`props.id\\`.\\n- Prefer editing section props over changing render code when generating pages.\\n- Do not edit files under \\`dist/\\`; they are generated.\\n\\n## AI metadata (required)\\n\\nEvery component (and zone-level layout component) **must** declare \\`ai.instructions\\`.\\nWithout it the page-generation agent has no way to know what the component is for,\\nand \\`suda theme check\\` (run automatically before publish) will fail.\\n\\n### Component-level \\`ai\\`\\n\\nEach \\`ComponentConfig\\` must include:\\n\\n\\`\\`\\`ts\\nimport type { SudaComponentConfig } from \"@sudajs/theme-engine\";\\n\\nexport const Hero: SudaComponentConfig = {\\n label: \"Hero\",\\n ai: {\\n instructions:\\n \"Primary page introduction used to communicate the main value proposition. \" +\\n \"Place near the beginning of landing or product pages. \" +\\n \"Include one primary CTA. Use at most once per page. \" +\\n \"Do not use for ordinary section headings or article content.\",\\n },\\n fields: { /* ... */ },\\n defaultProps: { /* ... */ },\\n render: (props) => /* ... */,\\n};\\n\\`\\`\\`\\n\\nA good \\`instructions\\` covers, in plain English:\\n\\n1. **Purpose** — what role this component plays on a page.\\n2. **Use when** — page types or scenarios where it should be selected.\\n3. **Avoid when** — situations that look similar but call for a different component.\\n4. **Placement** — where in the page it normally belongs (top, after features, near end, etc.).\\n5. **Frequency / composition** — how many times it can appear, what it must contain, and any adjacency rules.\\n\\nWrite executable, specific sentences (\\`Use when...\\`, \\`Place after...\\`, \\`Use at most once per page.\\`).\\nDo **not** describe styling (colors, fonts, spacing) — those belong to the design system.\\nDo **not** write vague filler like \"modern\", \"engaging\", \"beautiful\".\\n\\nIf two components look similar (e.g. Hero vs. PageHeader vs. SectionHeader),\\ntheir \\`instructions\\` must explicitly differentiate them, otherwise the agent\\nwill mix them up.\\n\\n### Hiding a component from AI\\n\\nUse \\`ai.exclude: true\\` for internal/debug components or anything the agent\\nshould never auto-create. Such components remain editable by humans:\\n\\n\\`\\`\\`ts\\nai: { exclude: true, instructions: \"Internal debug block; AI must not create it.\" }\\n\\`\\`\\`\\n\\n### Field-level \\`ai\\` (recommended, optional)\\n\\nField-level metadata sharpens the generated content but is **not required**.\\nUse it when a field's name and type alone don't fully convey the constraints:\\n\\n\\`\\`\\`ts\\nfields: {\\n title: {\\n type: \"text\",\\n ai: {\\n instructions:\\n \"Main value-proposition headline. 4–12 words, focus on the visitor benefit, \" +\\n \"do not repeat the eyebrow or description.\",\\n required: true,\\n },\\n },\\n imageUrl: {\\n type: \"text\",\\n ai: {\\n // Atomic values that cannot render correctly while half-streamed.\\n stream: false,\\n instructions: \"Image that supports the section topic. Avoid logos, screenshots, or unrelated decoration.\",\\n },\\n },\\n}\\n\\`\\`\\`\\n\\nSupported field-level keys: \\`instructions\\`, \\`required\\`, \\`exclude\\`, \\`stream\\`,\\n\\`bind\\` (delegate to a tool), and \\`schema\\` (only needed for \\`custom\\` / \\`external\\` /\\n\\`user\\` fields whose runtime shape can't be inferred).\\n\\n### Verifying\\n\\n\\`\\`\\`bash\\npnpm build # also runs the AI metadata check\\nsuda theme check # run the check on its own\\n\\`\\`\\`\\n\\nMissing component-level \\`ai.instructions\\` is reported as an **error** and blocks\\nthe build. Very short or label-repeating instructions are reported as\\n**warnings**.\\n\\n## Useful commands\\n\\n\\`\\`\\`bash\\npnpm install\\npnpm typecheck\\npnpm build # tsc + suda theme build --skip-theme-build (runs AI check)\\npnpm validate\\npnpm dev # watch and serve local theme artifact files\\nsuda theme check # AI metadata check only\\nsuda agent theme describe local --theme-root .\\nsuda agent section schema --theme local --section Hero --theme-root .\\nsuda agent page validate --theme local --input ./page.json --theme-root .\\n\\`\\`\\`\\n`,\n );\n await writeFile(\n path.join(target, \"CLAUDE.md\"),\n `# Claude Code\\n\\nRead \\`AGENTS.md\\` first. It is the canonical guide for this Suda theme project.\\n`,\n );\n await writeFile(\n path.join(target, \"README.md\"),\n `# ${key}\\n\\nA Suda theme scaffolded with \\`suda theme init\\`. This is a standalone\\npackage; it does not need to live inside the SudaCloud monorepo.\\n\\nThis theme targets SudaCloud's SSR runtime (\\`renderMode: \"ssr\"\\` in\\n\\`src/manifest.ts\\`); CSR / Hybrid postures are not yet supported by the\\nhost.\\n\\n## Setup\\n\\n\\`\\`\\`bash\\npnpm install\\n\\`\\`\\`\\n\\n## Develop\\n\\n\\`\\`\\`bash\\npnpm typecheck # type-check sources\\npnpm build # tsc + suda theme build (server bundle + client runtime + manifest)\\npnpm dev # watch the browser runtime and start preview server\\npnpm validate # validate the dist artifact\\n\\`\\`\\`\\n\\n> \\`renderMode\\` currently only accepts \\`\"ssr\"\\`. \\`suda theme validate\\` and\\n> \\`suda theme check\\` will reject manifests that omit it or set a different\\n> value.\\n\\n## Agent tooling\\n\\n\\`\\`\\`bash\\nsuda agent theme describe local --theme-root .\\nsuda agent page schema local --theme-root .\\nsuda agent section schema --theme local --section Hero --theme-root .\\n\\`\\`\\`\\n\\n## Publish\\n\\n\\`\\`\\`bash\\npnpm build\\nsuda theme screenshot # optional: capture dist/preview/desktop.png\\nsuda theme publish\\n\\`\\`\\`\\n`,\n );\n console.log(`created theme scaffold at ${target}`);\n}\n\nexport function buildProgram(): Command {\n const program = new Command();\n\n program\n .name(\"suda\")\n .description(\"Suda CLI for managing themes, sites, posts and AI tooling.\")\n .version(\"0.0.0\");\n\n const theme = program.command(\"theme\").description(\"Manage Suda theme artifacts.\");\n\n theme\n .command(\"init\")\n .description(\"Scaffold a new theme source directory.\")\n .argument(\"[dir]\", \"Theme directory to create.\", \"./theme\")\n .action(async (dir: string) => {\n await initTheme(path.resolve(dir));\n });\n\n theme\n .command(\"validate\")\n .description(\"Validate a built theme artifact.\")\n .option(\"--theme-root <path>\", \"Theme source/artifact root.\")\n .action(async (options: ThemeRootOptions) => {\n const result = await validateTheme(resolveThemeRoot(options));\n console.log(`valid ${result.module.manifest.key}@${result.module.manifest.version}`);\n if (!result.clientEntryPath) {\n console.warn(\n \"warning: dist/runtime.client.js is missing; editor runtime will not load until `suda theme build` runs.\",\n );\n }\n });\n\n theme\n .command(\"build\")\n .description(\"Build server dist (via package script) and browser runtime.\")\n .option(\"--theme-root <path>\", \"Theme source/artifact root.\")\n .option(\"--skip-theme-build\", \"Skip the theme package build script.\")\n .option(\"--skip-check\", \"Skip the AI metadata check that normally runs after build.\")\n .action(async (options: BuildOptions) => {\n const result = await buildTheme(resolveThemeRoot(options), options.skipThemeBuild === true);\n console.log(`built ${result.module.manifest.key}@${result.module.manifest.version}`);\n if (options.skipCheck !== true) {\n const ok = runThemeCheck(result);\n if (!ok) {\n throw new Error(\n \"AI metadata check failed. Fix the errors above or rerun with --skip-check.\",\n );\n }\n }\n });\n\n theme\n .command(\"check\")\n .description(\n \"Run AI metadata checks on a built theme without rebuilding. Reports missing component-level ai.instructions as errors and weak content as warnings.\",\n )\n .option(\"--theme-root <path>\", \"Theme source/artifact root.\")\n .action(async (options: CheckOptions) => {\n const theme = await validateTheme(resolveThemeRoot(options));\n const ok = runThemeCheck(theme);\n if (!ok) {\n process.exitCode = 1;\n }\n });\n\n theme\n .command(\"dev\")\n .description(\"Watch and rebuild the browser runtime, and serve the local theme artifact files.\")\n .option(\"--theme-root <path>\", \"Theme source/artifact root.\")\n .option(\"--skip-theme-build\", \"Skip the theme package build script.\")\n .option(\"--port <port>\", \"Preview server port.\", \"4177\")\n .action(async (options: BuildOptions & { port?: string }) => {\n const port = Number(options.port ?? \"4177\");\n await watchTheme(\n resolveThemeRoot(options),\n options.skipThemeBuild === true,\n Number.isFinite(port) ? port : 4177,\n );\n });\n\n theme\n .command(\"screenshot\")\n .description(\"Capture a desktop preview screenshot of the home starter page using Playwright.\")\n .option(\"--theme-root <path>\", \"Theme source/artifact root.\")\n .option(\"--output <path>\", \"Output PNG path relative to theme root.\")\n .option(\"--width <px>\", \"Viewport width in pixels.\", \"1280\")\n .option(\"--height <px>\", \"Viewport height in pixels.\", \"800\")\n .option(\"--port <port>\", \"Preview server port used during capture.\", \"4178\")\n .option(\"--skip-build\", \"Skip rebuilding the theme before capturing.\")\n .action(async (options: ScreenshotOptions) => {\n await screenshotTheme(resolveThemeRoot(options), options);\n });\n\n theme\n .command(\"publish\")\n .description(\"Upload artifact to S3 and upsert ThemePackage/ThemeVersion.\")\n .option(\"--theme-root <path>\", \"Theme source/artifact root.\")\n .option(\"--skip-build\", \"Publish existing dist files without rebuilding.\")\n .option(\"--skip-check\", \"Skip the AI metadata check that normally runs before upload.\")\n .option(\n \"--force\",\n \"Development recovery only: clear the existing themes/<key>/<version>/ prefix and ThemeVersion row before republishing. Re-published clients pinned to this version are unavailable until the new publish completes.\",\n )\n .action(async (options: PublishOptions) => {\n await publishTheme(\n resolveThemeRoot(options),\n options.skipBuild === true,\n options.skipCheck === true,\n options.force === true,\n );\n });\n\n const agent = program.command(\"agent\").description(\"Agent-friendly theme and page tooling.\");\n\n const agentProject = agent.command(\"project\").description(\"Manage Suda projects from the CLI.\");\n\n agentProject\n .command(\"list\")\n .description(\"List Suda projects the current CLI user can access.\")\n .action(async () => {\n const projects = await listAgentProjects();\n printJson({ projects });\n });\n\n agentProject\n .command(\"create\")\n .description(\n \"Create a new Suda project (mirrors onboarding). External AI should ask the user for a website name and short business description before calling this.\",\n )\n .requiredOption(\"--name <name>\", \"Website or brand name.\")\n .requiredOption(\n \"--site-description <description>\",\n \"Short business introduction used to seed default site metadata.\",\n )\n .action(async (options: { name: string; siteDescription: string }) => {\n // Reuse the shared zod schema so CLI flag validation matches the MCP\n // tool input bounds and the server-side `/api/cli/agent/projects` route.\n const parsed = createProjectInputSchema.safeParse({\n name: options.name,\n siteDescription: options.siteDescription,\n });\n if (!parsed.success) {\n const issue = parsed.error.issues[0];\n const field = issue?.path[0] === \"siteDescription\" ? \"--site-description\" : \"--name\";\n throw new Error(`${field}: ${issue?.message ?? \"invalid value\"}`);\n }\n\n const result = await createAgentProject(parsed.data);\n printJson(result);\n });\n\n const agentThemes = agent.command(\"themes\").description(\"Manage agent-visible themes.\");\n\n agentThemes\n .command(\"list\")\n .description(\"List themes visible to the current CLI user.\")\n .option(\"--project-id <projectId>\", \"Scope results to a project.\")\n .option(\"--theme-root <path>\", \"Describe a local theme instead of the remote catalog.\")\n .action(async (options: AgentThemeOptions) => {\n const themes = await listAgentThemes(options);\n printJson({ themes });\n });\n\n const agentTheme = agent.command(\"theme\").description(\"Inspect a single theme.\");\n\n agentTheme\n .command(\"describe\")\n .description(\"Describe a theme's AI-first page schema.\")\n .argument(\"<theme>\", \"Theme key.\")\n .option(\"--version <version>\", \"Theme version.\")\n .option(\"--project-id <projectId>\", \"Project scope.\")\n .option(\"--theme-root <path>\", \"Read a local theme.\")\n .option(\"--example\", \"Include example page content.\")\n .action(async (themeKey: string, options: AgentThemeOptions) => {\n const manifest = await fetchAgentManifest(themeKey, options);\n printJson(\n createAgentPageSchemaOutput(manifest, { includeExample: options.example === true }),\n );\n });\n\n const agentPage = agent.command(\"page\").description(\"AI-first page content tooling.\");\n\n agentPage\n .command(\"schema\")\n .description(\"Print the AI-first page content output schema for a theme.\")\n .argument(\"<theme>\", \"Theme key.\")\n .option(\"--version <version>\", \"Theme version.\")\n .option(\"--project-id <projectId>\", \"Project scope.\")\n .option(\"--theme-root <path>\", \"Read a local theme.\")\n .option(\"--example\", \"Include example page content.\")\n .action(async (themeKey: string, options: AgentThemeOptions) => {\n const manifest = await fetchAgentManifest(themeKey, options);\n printJson(\n createAgentPageSchemaOutput(manifest, { includeExample: options.example === true }),\n );\n });\n\n agentPage\n .command(\"validate\")\n .description(\"Validate an AI-generated Suda page content JSON document.\")\n .requiredOption(\"--theme <theme>\", \"Theme key.\")\n .requiredOption(\"--input <file>\", \"JSON file containing Suda page content.\")\n .option(\"--version <version>\", \"Theme version.\")\n .option(\"--project-id <projectId>\", \"Project scope.\")\n .option(\"--theme-root <path>\", \"Read a local theme.\")\n .action(async (options: AgentThemeOptions & { theme: string; input: string }) => {\n await validateAgentPage(options.theme, options.input, options);\n });\n\n agentPage\n .command(\"create\")\n .description(\"Create a workspace page draft from AI-generated Suda page content JSON.\")\n .requiredOption(\"--project-id <projectId>\", \"Project id.\")\n .requiredOption(\"--title <title>\", \"Page title.\")\n .requiredOption(\"--slug <slug>\", \"Page slug.\")\n .requiredOption(\"--theme <theme>\", \"Theme key.\")\n .requiredOption(\"--input <file>\", \"JSON file containing Suda page content.\")\n .option(\"--version <version>\", \"Theme version.\")\n .action(async (options: AgentPageCreateOptions) => {\n await createAgentPage(options);\n });\n\n const agentSection = agent.command(\"section\").description(\"Inspect a single section.\");\n\n agentSection\n .command(\"schema\")\n .description(\"Print one AI-first section output schema for a theme.\")\n .requiredOption(\"--theme <theme>\", \"Theme key.\")\n .requiredOption(\"--section <section>\", \"Section type.\")\n .option(\"--version <version>\", \"Theme version.\")\n .option(\"--project-id <projectId>\", \"Project scope.\")\n .option(\"--theme-root <path>\", \"Read a local theme.\")\n .action(async (options: AgentThemeOptions & { theme: string; section: string }) => {\n const manifest = await fetchAgentManifest(options.theme, options);\n printJson(createSectionSchema(manifest, options.section));\n });\n\n program\n .command(\"mcp\")\n .description(\"Run the Suda local MCP server over stdio.\")\n .action(async () => {\n await startMcpServer();\n });\n\n const authCmd = program.command(\"auth\").description(\"Manage Suda authentication.\");\n\n authCmd\n .command(\"login\")\n .description(\"Authenticate Suda CLI with a SudaCloud workspace.\")\n .option(\n \"--host <host>\",\n \"The SudaCloud workspace host to authenticate against.\",\n \"app.sudayun.cn\",\n )\n .action(async (options: { host: string }) => {\n await login(options.host);\n });\n\n authCmd\n .command(\"status\")\n .description(\"Check current authentication status.\")\n .action(async () => {\n await status();\n });\n\n authCmd\n .command(\"logout\")\n .description(\"Clear local authentication configuration.\")\n .action(async () => {\n await logout();\n });\n\n program.showHelpAfterError();\n\n return program;\n}\n\nexport async function main(): Promise<void> {\n const program = buildProgram();\n const argv = process.argv.filter((arg, index) => index < 2 || arg !== \"--\");\n await program.parseAsync(argv);\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/auth.ts","../src/index.ts"],"names":["path","protocolForHost","esbuild","context","esbuildContext","require","theme"],"mappings":"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","file":"index.js","sourcesContent":["import fs from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\n\ninterface AuthConfig {\n /**\n * The `suda_<...>` API-token plaintext issued by `/api/cli-auth/poll` and\n * verified by the workspace `requireApiAuth` helper. The `sessionToken`\n * key name is a historical artefact; the value is the API token itself.\n */\n sessionToken: string;\n host: string;\n}\n\nfunction getConfigPath() {\n return path.join(os.homedir(), \".config\", \"suda\", \"config.json\");\n}\n\nexport async function readAuthConfig(): Promise<AuthConfig | null> {\n try {\n const configPath = getConfigPath();\n const content = await fs.readFile(configPath, \"utf-8\");\n return JSON.parse(content) as AuthConfig;\n } catch {\n return null;\n }\n}\n\nexport async function writeAuthConfig(config: AuthConfig): Promise<void> {\n const configPath = getConfigPath();\n await fs.mkdir(path.dirname(configPath), { recursive: true });\n await fs.chmod(path.dirname(configPath), 0o700).catch(() => undefined);\n await fs.writeFile(configPath, JSON.stringify(config, null, 2), { mode: 0o600 });\n}\n\nexport async function clearAuthConfig(): Promise<void> {\n const configPath = getConfigPath();\n try {\n await fs.unlink(configPath);\n } catch (err: unknown) {\n if (err instanceof Error && \"code\" in err && (err as { code: string }).code !== \"ENOENT\") {\n throw err;\n }\n }\n}\n\nfunction protocolForHost(host: string): \"http\" | \"https\" {\n return host.includes(\"localhost\") || host.includes(\"127.0.0.1\") ? \"http\" : \"https\";\n}\n\n/**\n * Thrown by {@link cliAuthFetch} when the workspace API rejects the stored\n * CLI token. Carries the structured `error` code returned by the server (see\n * `apps/workspace/server/lib/api-auth.ts`) so callers can distinguish\n * \"expired\" from \"revoked\" without parsing strings.\n */\nexport class CliAuthExpiredError extends Error {\n readonly code: \"token_invalid\" | \"token_revoked\" | \"token_expired\" | \"unauthorized\";\n constructor(\n code: CliAuthExpiredError[\"code\"],\n message: string,\n ) {\n super(message);\n this.name = \"CliAuthExpiredError\";\n this.code = code;\n }\n}\n\n/**\n * Wrapper around `fetch` that automatically attaches the stored CLI token,\n * detects expired/revoked sessions, clears the local config and surfaces a\n * friendly error message — matching the UX of `gh` / `shopify` CLIs where\n * a stale token says \"please run `gh auth login`\" instead of bubbling a\n * raw `Unauthorized`.\n */\nexport async function cliAuthFetch(\n pathname: string,\n init: RequestInit = {},\n): Promise<Response> {\n const config = await readAuthConfig();\n if (!config) {\n throw new CliAuthExpiredError(\n \"unauthorized\",\n \"Not logged in. Run `suda auth login` to authenticate first.\",\n );\n }\n const baseUrl = `${protocolForHost(config.host)}://${config.host}`;\n const headers = new Headers(init.headers);\n headers.set(\"Authorization\", `Bearer ${config.sessionToken}`);\n\n const res = await fetch(`${baseUrl}${pathname}`, { ...init, headers });\n if (res.status === 401) {\n const body = (await res.clone().json().catch(() => ({}))) as {\n error?: string;\n message?: string;\n };\n const code = (\n [\"token_invalid\", \"token_revoked\", \"token_expired\"].includes(body.error ?? \"\")\n ? (body.error as \"token_invalid\" | \"token_revoked\" | \"token_expired\")\n : \"unauthorized\"\n );\n // Wipe the local config so the next command immediately tells the user\n // to log in instead of pretending we still hold a session.\n await clearAuthConfig();\n throw new CliAuthExpiredError(\n code,\n body.message ??\n \"Authentication is no longer valid. Run `suda auth login` to authenticate again.\",\n );\n }\n return res;\n}\n\nexport async function login(host: string = \"app.sudayun.cn\") {\n const baseUrl = `${protocolForHost(host)}://${host}`;\n\n console.log(`Requesting device authorization from ${baseUrl}...`);\n\n const deviceRes = await fetch(`${baseUrl}/api/cli-auth/device`, {\n method: \"POST\",\n });\n\n if (!deviceRes.ok) {\n throw new Error(`Failed to initialize auth: ${deviceRes.statusText}`);\n }\n\n const { deviceCode, userCode, verificationUri, interval, expiresIn } = (await deviceRes.json()) as {\n deviceCode: string;\n userCode: string;\n verificationUri: string;\n expiresIn: number;\n interval: number;\n };\n\n const authUrl = `${verificationUri}?code=${userCode}`;\n console.log(`\\nPlease open the following URL in your browser to authorize Suda CLI:\\n`);\n console.log(` ${authUrl}\\n`);\n console.log(`Your confirmation code is: ${userCode}\\n`);\n // Try to open browser\n try {\n const open = (await import(\"open\")).default;\n await open(authUrl);\n } catch {\n // ignore\n }\n\n const pollInterval = (interval || 5) * 1000;\n const timeoutSeconds = expiresIn || 300;\n const deadline = Date.now() + timeoutSeconds * 1000;\n\n console.log(\"Waiting for authorization...\");\n\n while (Date.now() < deadline) {\n await new Promise((resolve) => setTimeout(resolve, pollInterval));\n\n const pollRes = await fetch(`${baseUrl}/api/cli-auth/poll`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ deviceCode }),\n });\n\n const data = (await pollRes.json()) as { status?: string; token?: string; error?: string };\n\n if (pollRes.ok && data.status === \"approved\" && data.token) {\n await writeAuthConfig({ sessionToken: data.token, host });\n console.log(\"Successfully authorized!\");\n return;\n }\n\n if (data.error === \"authorization_pending\") {\n continue;\n }\n\n throw new Error(`Authorization failed: ${data.error || \"Unknown error\"}`);\n }\n\n throw new Error(\"Authorization timed out.\");\n}\n\nexport async function status() {\n const config = await readAuthConfig();\n if (!config) {\n console.log(\"Not logged in. Run `suda auth login` to authenticate.\");\n return;\n }\n\n let res: Response;\n try {\n res = await cliAuthFetch(\"/api/cli-auth/whoami\");\n } catch (err) {\n if (err instanceof CliAuthExpiredError) {\n console.log(err.message);\n return;\n }\n console.error(`Failed to connect to ${config.host}.`);\n return;\n }\n\n if (!res.ok) {\n // `cliAuthFetch` already handled 401. Anything else here is unexpected\n // (5xx, etc.) — surface a generic message rather than silently dropping\n // the local credentials.\n console.error(\n `Failed to verify session (${res.status} ${res.statusText}). Try again later.`,\n );\n return;\n }\n\n const data = (await res.json()) as {\n user?: { email?: string | null; name?: string | null };\n };\n const label = data.user?.email ?? data.user?.name ?? \"your account\";\n console.log(`Logged in as ${label} on ${config.host}`);\n}\n\nexport async function logout() {\n const config = await readAuthConfig();\n if (!config) {\n console.log(\"Not logged in.\");\n return;\n }\n\n // Best-effort server-side revocation. We always clear the local config\n // afterwards so that even if the server is unreachable (offline, DNS issues,\n // self-hosted instance turned off) the user is genuinely \"logged out\" on\n // this machine. Mirrors `gh auth logout`'s behaviour: tell the server, then\n // wipe the credential.\n try {\n await cliAuthFetch(\"/api/cli-auth/revoke\", { method: \"POST\" });\n } catch (err) {\n if (err instanceof CliAuthExpiredError) {\n // Token was already invalid — `cliAuthFetch` already wiped the local\n // config in that case. Tell the user once and return.\n console.log(\"Logged out (token was already invalid).\");\n return;\n }\n console.warn(\n `Could not contact ${config.host} to revoke token. The token will be cleared locally only.`,\n );\n }\n\n await clearAuthConfig();\n console.log(\"Logged out successfully.\");\n}\n","#!/usr/bin/env node\n\nimport { createHash } from \"node:crypto\";\nimport { mkdir, readFile, readdir, stat, writeFile } from \"node:fs/promises\";\nimport { createRequire } from \"node:module\";\nimport path from \"node:path\";\nimport { fileURLToPath, pathToFileURL } from \"node:url\";\n\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport type {\n AgentComponentOutput,\n ThemeAgentManifest,\n ThemeModule,\n ThemeStarterPage,\n} from \"@sudajs/theme-engine\";\nimport {\n agentComponentOutputSchema,\n agentPageSchemaOutputSchema,\n agentValidationResultSchema,\n checkThemeModule,\n createAgentComponentSchemaOutput,\n createAgentPageSchemaOutput,\n createPageDataFromAgentContent,\n createThemeAgentManifest,\n findAgentSection,\n formatThemeCheckResult,\n validateAgentPageContentWithManifest,\n} from \"@sudajs/theme-engine\";\nimport type {\n extractLayoutChrome as extractLayoutChromeFn,\n ResolveAssetPathOptions,\n ResolvedTheme,\n resolveAssetPath as resolveAssetPathFn,\n ThemeRender as ThemeRenderFn,\n ThemeRenderMetadata,\n} from \"@sudajs/theme-engine/server\";\nimport { FileSystemThemeRegistry, themeManifestSchema } from \"@sudajs/theme-engine/server\";\nimport { Command } from \"commander\";\nimport { build as esbuild, context as esbuildContext, type Plugin } from \"esbuild\";\nimport type { createElement as createElementFn } from \"react\";\nimport type { renderToStaticMarkup as renderToStaticMarkupFn } from \"react-dom/server\";\nimport { z } from \"zod\";\n\ninterface ValidatedTheme {\n root: string;\n module: ThemeModule;\n serverEntryPath: string;\n clientEntryPath: string | null;\n stylesheetPath: string | null;\n}\n\ninterface UploadFile {\n absolutePath: string;\n relativePath: string;\n contentType: string;\n}\n\ninterface ThemeRootOptions {\n themeRoot?: string | undefined;\n}\n\ninterface BuildOptions extends ThemeRootOptions {\n skipThemeBuild?: boolean;\n skipCheck?: boolean;\n}\n\ninterface CheckOptions extends ThemeRootOptions {\n skipBuild?: boolean;\n}\n\ninterface PublishOptions extends ThemeRootOptions {\n skipBuild?: boolean;\n skipCheck?: boolean;\n bucket?: string;\n force?: boolean;\n}\n\ninterface AgentThemeOptions extends ThemeRootOptions {\n projectId?: string | undefined;\n version?: string | undefined;\n example?: boolean | undefined;\n}\n\ninterface AgentPageCreateOptions extends AgentThemeOptions {\n title: string;\n slug: string;\n theme: string;\n input: string;\n}\n\ninterface AgentProjectCreateOptions {\n name: string;\n siteDescription: string;\n}\n\ninterface AgentProjectSummary {\n projectId: string;\n name: string;\n defaultDomain: string | null;\n role: string;\n isOwner: boolean;\n activeThemeKey: string | null;\n activeThemeVersion: string | null;\n}\n\ninterface AgentProjectCreated {\n success: true;\n projectId: string;\n name: string;\n defaultDomain: string | null;\n dashboardUrl: string;\n}\n\ninterface ThemeCatalogItem {\n key: string;\n name: string;\n version: string;\n description?: string | null | undefined;\n categories?: string[] | undefined;\n preview?: string | undefined;\n active?: boolean | undefined;\n}\n\nconst createPageDraftOutputSchema = z.discriminatedUnion(\"status\", [\n z.object({\n status: z.literal(\"created\").describe(\"The page draft was created.\"),\n pageId: z.string().describe(\"New page id.\"),\n }),\n z.object({\n status: z.literal(\"invalid\").describe(\"The page content failed validation.\"),\n valid: z.literal(false),\n issues: z.array(\n z.object({\n path: z.string(),\n message: z.string(),\n }),\n ),\n }),\n]);\n\n// Mirrors apps/workspace/app/onboarding/constants.ts so external AI tools see\n// the same input bounds as the in-app onboarding form.\nconst PROJECT_NAME_MIN_LENGTH = 1;\nconst PROJECT_NAME_MAX_LENGTH = 80;\nconst PROJECT_DESCRIPTION_MIN_LENGTH = 1;\nconst PROJECT_DESCRIPTION_MAX_LENGTH = 300;\n\n// Single source of truth for the create_project input shape, reused by both\n// the MCP `create_project` tool and the `suda agent project create` command\n// so the two entry points cannot drift on bounds or trim semantics.\nconst createProjectInputSchema = z.object({\n name: z.string().trim().min(PROJECT_NAME_MIN_LENGTH).max(PROJECT_NAME_MAX_LENGTH),\n siteDescription: z\n .string()\n .trim()\n .min(PROJECT_DESCRIPTION_MIN_LENGTH)\n .max(PROJECT_DESCRIPTION_MAX_LENGTH),\n});\n\nconst projectSummarySchema = z.object({\n projectId: z.string(),\n name: z.string(),\n defaultDomain: z.string().nullable(),\n role: z.string(),\n isOwner: z.boolean(),\n activeThemeKey: z.string().nullable(),\n activeThemeVersion: z.string().nullable(),\n});\n\nconst listProjectsOutputSchema = z.object({\n projects: z.array(projectSummarySchema),\n});\n\nconst createProjectOutputSchema = z.object({\n projectId: z.string(),\n name: z.string(),\n defaultDomain: z.string().nullable(),\n dashboardUrl: z.string(),\n});\n\nfunction createHostReactShimPlugin(): Plugin {\n return {\n name: \"suda-host-react-shim\",\n setup(build) {\n build.onResolve({ filter: /^react$/ }, () => ({\n path: \"react-host-shim\",\n namespace: \"suda-shim\",\n }));\n build.onResolve({ filter: /^react\\/jsx-runtime$/ }, () => ({\n path: \"react-jsx-runtime-host-shim\",\n namespace: \"suda-shim\",\n }));\n build.onResolve({ filter: /^react-dom$/ }, () => ({\n path: \"react-dom-host-shim\",\n namespace: \"suda-shim\",\n }));\n build.onResolve({ filter: /^react-dom\\/client$/ }, () => ({\n path: \"react-dom-client-host-shim\",\n namespace: \"suda-shim\",\n }));\n build.onLoad({ filter: /^react-host-shim$/, namespace: \"suda-shim\" }, () => ({\n loader: \"js\",\n contents: `\nconst React = globalThis.__SUDA_REACT__;\nif (!React) {\n throw new Error(\"Missing host React runtime (__SUDA_REACT__).\");\n}\nexport default React;\nexport const {\n Children,\n Component,\n Fragment,\n Profiler,\n PureComponent,\n StrictMode,\n Suspense,\n cloneElement,\n createContext,\n createElement,\n createRef,\n forwardRef,\n isValidElement,\n lazy,\n memo,\n startTransition,\n use,\n useActionState,\n useCallback,\n useContext,\n useDeferredValue,\n useEffect,\n useId,\n useImperativeHandle,\n useInsertionEffect,\n useLayoutEffect,\n useMemo,\n useOptimistic,\n useReducer,\n useRef,\n useState,\n useSyncExternalStore,\n useTransition,\n version,\n} = React;\n`,\n }));\n build.onLoad(\n {\n filter: /^react-jsx-runtime-host-shim$/,\n namespace: \"suda-shim\",\n },\n () => ({\n loader: \"js\",\n contents: `\nconst runtime = globalThis.__SUDA_REACT_JSX_RUNTIME__;\nif (!runtime) {\n throw new Error(\"Missing host React JSX runtime (__SUDA_REACT_JSX_RUNTIME__).\");\n}\nexport const { Fragment, jsx, jsxs, jsxDEV } = runtime;\n`,\n }),\n );\n build.onLoad({ filter: /^react-dom-host-shim$/, namespace: \"suda-shim\" }, () => ({\n loader: \"js\",\n contents: `\nconst ReactDOM = globalThis.__SUDA_REACT_DOM__;\nif (!ReactDOM) {\n throw new Error(\"Missing host React DOM runtime (__SUDA_REACT_DOM__).\");\n}\nexport default ReactDOM;\nexport const {\n createPortal,\n flushSync,\n preconnect,\n prefetchDNS,\n preinit,\n preinitModule,\n preload,\n preloadModule,\n requestFormReset,\n unstable_batchedUpdates,\n useFormState,\n useFormStatus,\n version,\n} = ReactDOM;\n`,\n }));\n build.onLoad({ filter: /^react-dom-client-host-shim$/, namespace: \"suda-shim\" }, () => ({\n loader: \"js\",\n contents: `\nconst ReactDOMClient = globalThis.__SUDA_REACT_DOM_CLIENT__;\nif (!ReactDOMClient) {\n throw new Error(\"Missing host React DOM client runtime (__SUDA_REACT_DOM_CLIENT__).\");\n}\nexport default ReactDOMClient;\nexport const { createRoot, hydrateRoot, version } = ReactDOMClient;\n`,\n }));\n },\n };\n}\n\nfunction safeObjectKeyPart(value: string): string {\n return value.replace(/[^a-zA-Z0-9._-]/g, \"-\");\n}\n\nfunction createThemePrefix(themeKey: string, version: string): string {\n return `themes/${safeObjectKeyPart(themeKey)}/${safeObjectKeyPart(version)}`;\n}\n\nfunction createThemeObjectKey(themeKey: string, version: string, relativePath: string): string {\n const safeRelativePath = relativePath\n .replace(/^\\/+/, \"\")\n .split(\"/\")\n .map(safeObjectKeyPart)\n .filter(Boolean)\n .join(\"/\");\n\n return `${createThemePrefix(themeKey, version)}/${safeRelativePath}`;\n}\n\nimport { login, status, logout, readAuthConfig } from \"./auth\";\n\nfunction resolveThemeRoot(options: ThemeRootOptions): string {\n return path.resolve(options.themeRoot ?? process.cwd());\n}\n\nasync function pathExists(filePath: string): Promise<boolean> {\n try {\n await stat(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function readJson<T>(filePath: string): Promise<T> {\n const raw = await readFile(filePath, \"utf8\");\n return JSON.parse(raw) as T;\n}\n\nasync function readJsonIfExists<T>(filePath: string): Promise<T | null> {\n if (!(await pathExists(filePath))) {\n return null;\n }\n return readJson<T>(filePath);\n}\n\nfunction protocolForHost(host: string): \"http\" | \"https\" {\n return host.includes(\"localhost\") || host.includes(\"127.0.0.1\") ? \"http\" : \"https\";\n}\n\nasync function requireCliBaseUrl(): Promise<{ baseUrl: string; token: string }> {\n const config = await readAuthConfig();\n if (!config) {\n throw new Error(\"Not logged in. Run `suda auth login` to authenticate first.\");\n }\n return {\n baseUrl: `${protocolForHost(config.host)}://${config.host}`,\n token: config.sessionToken,\n };\n}\n\nasync function fetchJson<T>(\n url: string,\n options: RequestInit & { token?: string } = {},\n): Promise<T> {\n const headers = new Headers(options.headers);\n if (options.token) {\n headers.set(\"Authorization\", `Bearer ${options.token}`);\n }\n const response = await fetch(url, { ...options, headers });\n if (!response.ok) {\n const errorData = (await response.json().catch(() => ({}))) as {\n error?: string;\n message?: string;\n };\n throw new Error(errorData.message || errorData.error || response.statusText);\n }\n return (await response.json()) as T;\n}\n\nfunction agentCacheDir(): string {\n return path.join(\n process.env.XDG_CACHE_HOME ?? path.join(process.env.HOME ?? \".\", \".cache\"),\n \"suda\",\n \"agent\",\n );\n}\n\nfunction cachedThemeManifestPath(themeKey: string, version: string): string {\n return path.join(\n agentCacheDir(),\n \"themes\",\n safeObjectKeyPart(themeKey),\n safeObjectKeyPart(version),\n \"agent-manifest.json\",\n );\n}\n\nasync function loadThemeModule(serverEntryPath: string): Promise<ThemeModule> {\n const imported = (await import(`${pathToFileURL(serverEntryPath).href}?t=${Date.now()}`)) as {\n default?: ThemeModule;\n };\n\n if (!imported.default) {\n throw new Error(`${serverEntryPath} must export a default ThemeModule.`);\n }\n\n return imported.default;\n}\n\nfunction assertRecord(value: unknown, label: string): asserts value is Record<string, unknown> {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n throw new Error(`${label} must be an object.`);\n }\n}\n\nfunction validateThemeModule(module: ThemeModule): void {\n assertRecord(module.manifest, \"manifest\");\n const parsedManifest = themeManifestSchema.safeParse(module.manifest);\n if (!parsedManifest.success) {\n const issues = parsedManifest.error.issues\n .map((issue) => ` - ${issue.path.join(\".\") || \"<root>\"}: ${issue.message}`)\n .join(\"\\n\");\n throw new Error(`manifest does not satisfy the Suda theme contract:\\n${issues}`);\n }\n if (!module.manifest.key || !module.manifest.version || !module.manifest.name) {\n throw new Error(\"manifest.key, manifest.version and manifest.name are required.\");\n }\n if (module.manifest.entry !== \"dist/index.js\") {\n throw new Error('manifest.entry must be artifact-local: \"dist/index.js\".');\n }\n if (\n module.manifest.clientEntry !== undefined &&\n module.manifest.clientEntry !== \"dist/runtime.client.js\"\n ) {\n throw new Error(\n 'manifest.clientEntry must be artifact-local: \"dist/runtime.client.js\" when provided.',\n );\n }\n assertRecord(module.pageConfig?.components, \"pageConfig.components\");\n assertRecord(module.layoutConfig, \"layoutConfig\");\n assertRecord(module.defaultLayout, \"defaultLayout\");\n if (!Array.isArray(module.starterPages)) {\n throw new Error(\"starterPages must be an array.\");\n }\n}\n\nasync function validateTheme(root: string): Promise<ValidatedTheme> {\n const packageJsonPath = path.join(root, \"package.json\");\n const serverEntryPath = path.join(root, \"dist\", \"index.js\");\n const clientEntryPath = path.join(root, \"dist\", \"runtime.client.js\");\n const stylesheetPath = path.join(root, \"styles.css\");\n\n if (!(await pathExists(packageJsonPath))) {\n throw new Error(`Missing package.json in ${root}`);\n }\n if (!(await pathExists(serverEntryPath))) {\n throw new Error(`Missing ${serverEntryPath}. Run the theme package build first.`);\n }\n\n const module = await loadThemeModule(serverEntryPath);\n validateThemeModule(module);\n\n const result: ValidatedTheme = {\n root,\n module,\n serverEntryPath,\n clientEntryPath: null,\n stylesheetPath: null,\n };\n if (await pathExists(clientEntryPath)) {\n result.clientEntryPath = clientEntryPath;\n }\n if (await pathExists(stylesheetPath)) {\n result.stylesheetPath = stylesheetPath;\n }\n return result;\n}\n\nasync function runCommand(command: string, args: string[], cwd: string): Promise<void> {\n const { spawn } = await import(\"node:child_process\");\n await new Promise<void>((resolve, reject) => {\n const child = spawn(command, args, { cwd, stdio: \"inherit\" });\n child.on(\"error\", reject);\n child.on(\"exit\", (code) => {\n if (code === 0) {\n resolve();\n } else {\n reject(new Error(`${command} ${args.join(\" \")} exited with ${code ?? \"unknown\"}.`));\n }\n });\n });\n}\n\nasync function runThemePackageBuild(root: string): Promise<void> {\n const packageJson = await readJson<{ scripts?: Record<string, string> }>(\n path.join(root, \"package.json\"),\n );\n const buildScript = packageJson.scripts?.build;\n if (!buildScript || buildScript.includes(\"suda theme\") || buildScript.includes(\"suda-theme\")) {\n return;\n }\n await runCommand(\"pnpm\", [\"--dir\", root, \"run\", \"build\"], process.cwd());\n}\n\nasync function findClientEntry(root: string): Promise<string> {\n const candidates = [\n path.join(root, \"src\", \"runtime.client.tsx\"),\n path.join(root, \"src\", \"runtime.client.ts\"),\n ];\n for (const candidate of candidates) {\n if (await pathExists(candidate)) {\n return candidate;\n }\n }\n throw new Error(`Missing runtime entry. Add src/runtime.client.ts(x) in ${root}.`);\n}\n\nasync function findServerEntry(root: string): Promise<string> {\n const candidates = [path.join(root, \"src\", \"index.tsx\"), path.join(root, \"src\", \"index.ts\")];\n for (const candidate of candidates) {\n if (await pathExists(candidate)) {\n return candidate;\n }\n }\n throw new Error(`Missing server entry. Add src/index.ts(x) in ${root}.`);\n}\n\nasync function buildServerBundle(root: string): Promise<void> {\n const entryPoint = await findServerEntry(root);\n\n await esbuild({\n bundle: true,\n entryPoints: [entryPoint],\n external: [\n \"react\",\n \"react/jsx-runtime\",\n \"react-dom\",\n \"react-dom/*\",\n \"@puckeditor/core\",\n \"@puckeditor/core/*\",\n \"@sudajs/theme-engine\",\n \"@sudajs/theme-engine/*\",\n ],\n format: \"esm\",\n jsx: \"automatic\",\n minify: false,\n outfile: path.join(root, \"dist\", \"index.js\"),\n platform: \"node\",\n sourcemap: false,\n target: \"es2022\",\n treeShaking: true,\n });\n}\n\nasync function buildTheme(root: string, skipThemeBuild: boolean): Promise<ValidatedTheme> {\n if (!skipThemeBuild) {\n await runThemePackageBuild(root);\n }\n\n await buildServerBundle(root);\n\n const entryPoint = await findClientEntry(root);\n if (!(await pathExists(entryPoint))) {\n throw new Error(`Missing client entry: ${entryPoint}`);\n }\n\n await mkdir(path.join(root, \"dist\"), { recursive: true });\n const hostReactShimPlugin = createHostReactShimPlugin();\n await esbuild({\n bundle: true,\n entryPoints: [entryPoint],\n format: \"esm\",\n jsx: \"automatic\",\n minify: true,\n outfile: path.join(root, \"dist\", \"runtime.client.js\"),\n platform: \"browser\",\n plugins: [hostReactShimPlugin],\n sourcemap: false,\n target: \"es2022\",\n treeShaking: true,\n });\n\n const validated = await validateTheme(root);\n await writeThemeArtifacts(validated);\n return validateTheme(root);\n}\n\n/**\n * Runs the AI-metadata check on a built theme. Prints a human-readable report\n * via {@link formatThemeCheckResult} and returns whether errors were found, so\n * callers can decide whether to fail the build.\n */\nfunction runThemeCheck(theme: ValidatedTheme): boolean {\n const result = checkThemeModule(theme.module);\n const text = formatThemeCheckResult(result);\n if (result.ok) {\n console.log(text);\n } else {\n console.error(text);\n }\n return result.ok;\n}\n\nasync function watchTheme(root: string, skipThemeBuild: boolean, port: number): Promise<void> {\n if (!skipThemeBuild) {\n await runThemePackageBuild(root);\n }\n\n await buildServerBundle(root);\n const theme = await validateTheme(root);\n\n const entryPoint = await findClientEntry(root);\n await mkdir(path.join(root, \"dist\"), { recursive: true });\n const hostReactShimPlugin = createHostReactShimPlugin();\n const watchLogPlugin = createWatchLogPlugin(\"runtime.client.js\");\n\n const context = await esbuildContext({\n bundle: true,\n entryPoints: [entryPoint],\n format: \"esm\",\n jsx: \"automatic\",\n minify: false,\n outfile: path.join(root, \"dist\", \"runtime.client.js\"),\n platform: \"browser\",\n plugins: [hostReactShimPlugin, watchLogPlugin],\n sourcemap: true,\n target: \"es2022\",\n treeShaking: true,\n });\n await context.watch();\n\n const handle = await startPreviewServer(theme, port);\n console.log(`watching theme runtime; previewing at ${handle.url}`);\n await new Promise(() => undefined);\n}\n\n/**\n * Logs a single line whenever esbuild finishes a (re)build in watch mode.\n * Without this, `suda theme dev` runs silently after the initial bundle and\n * developers can only confirm rebuilds by checking dist/ mtimes.\n */\nfunction createWatchLogPlugin(label: string): Plugin {\n return {\n name: \"suda-theme-watch-log\",\n setup(build) {\n let firstBuild = true;\n build.onEnd((result) => {\n if (firstBuild) {\n firstBuild = false;\n return;\n }\n const errorCount = result.errors.length;\n if (errorCount > 0) {\n console.log(\n `rebuild failed (${errorCount} error${errorCount === 1 ? \"\" : \"s\"}): ${label}`,\n );\n return;\n }\n const stamp = new Date().toLocaleTimeString();\n console.log(`[${stamp}] rebuilt ${label}`);\n });\n },\n };\n}\n\ninterface PreviewServerHandle {\n url: string;\n port: number;\n close: () => Promise<void>;\n}\n\nconst PREVIEW_PUBLIC_BASE_PATH = \"/api/themes\";\n\nfunction pickStarterSlug(theme: ValidatedTheme): string | null {\n const pages = theme.module.starterPages;\n if (pages.length === 0) {\n return null;\n }\n return (pages.find((page) => page.isHome) ?? pages[0])?.slug ?? null;\n}\n\nfunction findStarterPage(theme: ValidatedTheme, slug: string): ThemeStarterPage | null {\n return theme.module.starterPages.find((page) => page.slug === slug) ?? null;\n}\n\nfunction escapeHtml(value: string): string {\n return value\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\"/g, \""\")\n .replace(/'/g, \"'\");\n}\n\n/**\n * Mirrors apps/site `resolveAssetUrl`. Themes reference asset values as\n * either absolute URLs, raw `themes/<key>/<version>/<rel>` paths, or other\n * relative strings. In dev we have no CDN, so theme-bundled paths go through\n * the local proxy and everything else falls back to itself.\n */\nfunction createPreviewAssetResolver(\n resolveAssetPath: (\n value: string | undefined,\n options?: ResolveAssetPathOptions,\n ) => string | undefined,\n): (value: string | undefined) => string | undefined {\n return (value) => {\n return resolveAssetPath(value, {\n legacyResolve: (key) => {\n if (key.startsWith(\"themes/\")) {\n return `${PREVIEW_PUBLIC_BASE_PATH}/${key.slice(\"themes/\".length)}`;\n }\n return undefined;\n },\n });\n };\n}\n\nfunction createPreviewThemeAssetUrl(\n themeKey: string,\n themeVersion: string,\n relativePath: string,\n): string {\n const normalizedRelativePath = relativePath.replace(/^\\/+/, \"\");\n return `${PREVIEW_PUBLIC_BASE_PATH}/${themeKey}/${themeVersion}/assets/${normalizedRelativePath}?v=${encodeURIComponent(themeVersion)}`;\n}\n\n/**\n * Theme-project-scoped renderer bundle. We deliberately resolve `react`,\n * `react-dom/server` and `@sudajs/theme-engine/server` through the theme\n * project's own `require` graph instead of the CLI's, because the theme\n * `dist/index.js` was already loaded against that copy of React. Importing\n * a different React instance from the CLI side would yield two React\n * dispatchers; client components inside the theme would call hooks against\n * the CLI's React (whose dispatcher is `null` outside a render), producing\n * `Cannot read properties of null (reading 'useState')`.\n */\ninterface ThemeRenderer {\n ThemeRender: typeof ThemeRenderFn;\n extractLayoutChrome: typeof extractLayoutChromeFn;\n resolveAssetPath: typeof resolveAssetPathFn;\n createElement: typeof createElementFn;\n renderToStaticMarkup: typeof renderToStaticMarkupFn;\n}\n\nasync function loadThemeScopedRenderer(themeRoot: string): Promise<ThemeRenderer> {\n // `require.resolve` from the theme's package.json forces Node to walk the\n // theme project's node_modules first. In the typical pnpm dev layout that\n // hoists a single React copy into the workspace, but in a multi-repo dev\n // setup (CLI repo + standalone theme repo) each repo has its own React,\n // so resolving from the theme side picks the same React instance that the\n // theme bundle's `dist/index.js` was loaded against.\n const themeRequire = createRequire(path.join(themeRoot, \"package.json\"));\n const reactPath = themeRequire.resolve(\"react\");\n const reactDomServerPath = themeRequire.resolve(\"react-dom/server\");\n const themeEngineServerPath = themeRequire.resolve(\"@sudajs/theme-engine/server\");\n\n const [reactModule, reactDomServerModule, themeEngineServerModule] = (await Promise.all([\n import(pathToFileURL(reactPath).href),\n import(pathToFileURL(reactDomServerPath).href),\n import(pathToFileURL(themeEngineServerPath).href),\n ])) as [\n { createElement: typeof createElementFn },\n { renderToStaticMarkup: typeof renderToStaticMarkupFn },\n {\n ThemeRender: typeof ThemeRenderFn;\n extractLayoutChrome: typeof extractLayoutChromeFn;\n resolveAssetPath: typeof resolveAssetPathFn;\n },\n ];\n\n return {\n ThemeRender: themeEngineServerModule.ThemeRender,\n extractLayoutChrome: themeEngineServerModule.extractLayoutChrome,\n resolveAssetPath: themeEngineServerModule.resolveAssetPath,\n createElement: reactModule.createElement,\n renderToStaticMarkup: reactDomServerModule.renderToStaticMarkup,\n };\n}\n\n/**\n * Renders a single starter page exactly the way `apps/site` renders a\n * project page: same `<ThemeRender>` tree, same `extractLayoutChrome`\n * stylesheet/customHead/customBody composition, same `metadata.resolveAssetUrl`\n * shape. The only differences with site are (a) we use SSR via\n * `renderToStaticMarkup` instead of Next.js streaming RSC and (b) the page\n * frame has a starter-page selector at the top.\n */\nfunction renderStarterPageHtml(\n theme: ValidatedTheme,\n resolved: ResolvedTheme,\n page: ThemeStarterPage,\n renderer: ThemeRenderer,\n): string {\n const chrome = renderer.extractLayoutChrome(theme.module.defaultLayout);\n const metadata: ThemeRenderMetadata = {\n resolveAssetUrl: createPreviewAssetResolver(renderer.resolveAssetPath),\n };\n const body = renderer.renderToStaticMarkup(\n renderer.createElement(renderer.ThemeRender, {\n theme: theme.module,\n pageData: page.data,\n layoutData: theme.module.defaultLayout,\n metadata,\n }),\n );\n const cssVarStyle = Object.entries(chrome.cssVariables)\n .map(([key, value]) => `${key}: ${value};`)\n .join(\" \");\n const stylesheetUrl = resolved.runtime?.stylesheet\n ? createPreviewThemeAssetUrl(\n theme.module.manifest.key,\n theme.module.manifest.version,\n resolved.runtime.stylesheet,\n )\n : null;\n const stylesheetTag = stylesheetUrl\n ? `<link rel=\"stylesheet\" href=\"${escapeHtml(stylesheetUrl)}\" />`\n : \"\";\n const customHead = chrome.customHeadCode ?? \"\";\n const customBody = chrome.customBodyCode ?? \"\";\n return [\n \"<!doctype html>\",\n '<html lang=\"en\">',\n \"<head>\",\n '<meta charset=\"utf-8\" />',\n '<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />',\n `<title>${escapeHtml(`${theme.module.manifest.name} — ${page.title}`)}</title>`,\n stylesheetTag,\n customHead,\n \"</head>\",\n `<body${cssVarStyle ? ` style=\"${cssVarStyle}\"` : \"\"}>`,\n body,\n customBody,\n \"</body>\",\n \"</html>\",\n ].join(\"\");\n}\n\n/** Top-level shell that lists starter pages and embeds the selected one in an iframe. */\nfunction renderPreviewShellHtml(theme: ValidatedTheme, activeSlug: string): string {\n const items = theme.module.starterPages\n .map((page) => {\n const slug = page.slug;\n const label = `${page.title}${page.isHome ? \" (home)\" : \"\"}`;\n const active = slug === activeSlug;\n const href = `/?page=${encodeURIComponent(slug)}`;\n const className = active ? \"suda-preview-tab suda-preview-tab--active\" : \"suda-preview-tab\";\n return `<a class=\"${className}\" href=\"${escapeHtml(href)}\" target=\"_self\">${escapeHtml(label)}</a>`;\n })\n .join(\"\");\n const frameSrc = `/pages/${encodeURIComponent(activeSlug)}`;\n return [\n \"<!doctype html>\",\n '<html lang=\"en\">',\n \"<head>\",\n '<meta charset=\"utf-8\" />',\n '<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />',\n `<title>${escapeHtml(theme.module.manifest.name)} — preview</title>`,\n \"<style>\",\n \"html,body{margin:0;height:100%;font-family:system-ui,sans-serif;background:#0b0d12;color:#e6e8ee;}\",\n \".suda-preview-bar{display:flex;flex-wrap:wrap;gap:.25rem;padding:.5rem .75rem;background:#0b0d12;border-bottom:1px solid #1f2330;position:sticky;top:0;z-index:10;}\",\n \".suda-preview-tab{display:inline-flex;align-items:center;padding:.35rem .75rem;border-radius:.5rem;font-size:.875rem;color:#c9cdd6;text-decoration:none;border:1px solid transparent;}\",\n \".suda-preview-tab:hover{background:#1a1d27;}\",\n \".suda-preview-tab--active{background:#222633;color:#fff;border-color:#2c3142;}\",\n \".suda-preview-frame{display:block;border:0;width:100%;height:calc(100vh - 2.5rem);background:#fff;}\",\n \"</style>\",\n \"</head>\",\n \"<body>\",\n `<nav class=\"suda-preview-bar\">${items}</nav>`,\n `<iframe class=\"suda-preview-frame\" src=\"${escapeHtml(frameSrc)}\" title=\"theme preview\"></iframe>`,\n \"</body>\",\n \"</html>\",\n ].join(\"\");\n}\n\nasync function startPreviewServer(\n theme: ValidatedTheme,\n port: number,\n): Promise<PreviewServerHandle> {\n const { createServer } = await import(\"node:http\");\n\n // Resolve react / react-dom/server / @sudajs/theme-engine/server through\n // the theme project's own require graph so SSR uses the same React copy\n // the theme `dist/index.js` will be loaded against (see `ThemeRenderer`\n // doc comment above).\n const renderer = await loadThemeScopedRenderer(theme.root);\n\n // Feed the registry the single pre-resolved artifact we already validated,\n // avoiding implicit loads of sibling theme directories (which would happen\n // if we passed `roots: [path.dirname(theme.root)]` and the user's theme repo\n // contained more than one theme).\n const registry = new FileSystemThemeRegistry({\n artifacts: [\n {\n rootPath: theme.root,\n serverEntryPath: theme.serverEntryPath,\n module: theme.module,\n },\n ],\n });\n const themeKey = theme.module.manifest.key;\n const themeVersion = theme.module.manifest.version;\n const assetPathPrefix = `${PREVIEW_PUBLIC_BASE_PATH}/${themeKey}/${themeVersion}/assets/`;\n const clientRuntimePrefix = `${PREVIEW_PUBLIC_BASE_PATH}/${themeKey}/${themeVersion}/runtime/client`;\n\n const server = createServer((request, response) => {\n void (async () => {\n const url = new URL(request.url ?? \"/\", `http://localhost:${port}`);\n const pathname = url.pathname;\n\n if (pathname === \"/\" || pathname === \"/index.html\") {\n const fallbackSlug = pickStarterSlug(theme);\n if (!fallbackSlug) {\n response.writeHead(404, { \"Content-Type\": \"text/plain; charset=utf-8\" });\n response.end(\"No starter pages declared by this theme.\");\n return;\n }\n const requested = url.searchParams.get(\"page\");\n const activeSlug =\n requested && findStarterPage(theme, requested) ? requested : fallbackSlug;\n response.writeHead(200, { \"Content-Type\": \"text/html; charset=utf-8\" });\n response.end(renderPreviewShellHtml(theme, activeSlug));\n return;\n }\n\n if (pathname.startsWith(\"/pages/\")) {\n const slug = decodeURIComponent(pathname.slice(\"/pages/\".length));\n const starter = findStarterPage(theme, slug);\n if (!starter) {\n response.writeHead(404, { \"Content-Type\": \"text/plain; charset=utf-8\" });\n response.end(`Unknown starter page: ${slug}`);\n return;\n }\n const resolved = await registry.resolve(themeKey, themeVersion);\n if (!resolved) {\n response.writeHead(500, { \"Content-Type\": \"text/plain; charset=utf-8\" });\n response.end(\"Failed to resolve theme via FileSystemThemeRegistry.\");\n return;\n }\n const html = renderStarterPageHtml(theme, resolved, starter, renderer);\n response.writeHead(200, { \"Content-Type\": \"text/html; charset=utf-8\" });\n response.end(html);\n return;\n }\n\n if (pathname.startsWith(assetPathPrefix)) {\n const relativePath = decodeURIComponent(pathname.slice(assetPathPrefix.length));\n const filePath = await registry.resolveAssetPath(themeKey, themeVersion, relativePath);\n if (!filePath) {\n response.writeHead(404, { \"Content-Type\": \"text/plain; charset=utf-8\" });\n response.end(\"Not found\");\n return;\n }\n const body = await readFile(filePath);\n response.writeHead(200, {\n \"Content-Type\": contentTypeFor(relativePath),\n \"Cache-Control\": \"no-cache\",\n });\n response.end(body);\n return;\n }\n\n if (pathname === clientRuntimePrefix) {\n const filePath = await registry.resolveClientEntryPath(themeKey, themeVersion);\n if (!filePath) {\n response.writeHead(404, { \"Content-Type\": \"text/plain; charset=utf-8\" });\n response.end(\"Theme has no client runtime bundle.\");\n return;\n }\n const body = await readFile(filePath);\n response.writeHead(200, {\n \"Content-Type\": \"application/javascript; charset=utf-8\",\n \"Cache-Control\": \"no-cache\",\n });\n response.end(body);\n return;\n }\n\n response.writeHead(404, { \"Content-Type\": \"text/plain; charset=utf-8\" });\n response.end(\"Not found\");\n })().catch((error) => {\n if (!response.headersSent) {\n response.writeHead(500, { \"Content-Type\": \"text/plain; charset=utf-8\" });\n }\n response.end(error instanceof Error ? error.message : \"Internal error\");\n });\n });\n\n await new Promise<void>((resolve, reject) => {\n const onError = (err: Error): void => {\n reject(err);\n };\n server.once(\"error\", onError);\n server.listen(port, () => {\n server.off(\"error\", onError);\n resolve();\n });\n });\n\n return {\n url: `http://localhost:${port}`,\n port,\n close: () =>\n new Promise<void>((resolve) => {\n server.close(() => {\n resolve();\n });\n }),\n };\n}\n\ninterface ScreenshotOptions extends ThemeRootOptions {\n output?: string;\n width?: string;\n height?: string;\n port?: string;\n skipBuild?: boolean;\n}\n\ninterface ResolvedScreenshotOptions {\n outputPath: string;\n viewport: { width: number; height: number };\n port: number;\n skipBuild: boolean;\n}\n\nconst DEFAULT_SCREENSHOT_RELATIVE = path.join(\"dist\", \"preview\", \"desktop.png\");\n\nfunction parsePositiveInt(value: string | undefined, fallback: number): number {\n if (!value) {\n return fallback;\n }\n const parsed = Number.parseInt(value, 10);\n return Number.isFinite(parsed) && parsed > 0 ? parsed : fallback;\n}\n\nfunction resolveScreenshotOptions(\n root: string,\n options: ScreenshotOptions,\n): ResolvedScreenshotOptions {\n return {\n outputPath: path.resolve(root, options.output ?? DEFAULT_SCREENSHOT_RELATIVE),\n viewport: {\n width: parsePositiveInt(options.width, 1280),\n height: parsePositiveInt(options.height, 800),\n },\n port: parsePositiveInt(options.port, 4178),\n skipBuild: options.skipBuild === true,\n };\n}\n\ninterface PlaywrightModule {\n chromium: {\n launch: (options?: { headless?: boolean }) => Promise<{\n newContext: (options: {\n viewport: { width: number; height: number };\n deviceScaleFactor?: number;\n }) => Promise<{\n newPage: () => Promise<{\n goto: (url: string, options?: { waitUntil?: string }) => Promise<unknown>;\n screenshot: (options: { path: string; fullPage?: boolean }) => Promise<unknown>;\n close: () => Promise<void>;\n }>;\n close: () => Promise<void>;\n }>;\n close: () => Promise<void>;\n }>;\n };\n}\n\nasync function loadPlaywright(): Promise<PlaywrightModule> {\n // Resolve module ids via runtime expressions so the optional dependency is not\n // required at type-check time. Either `playwright` or `@playwright/test` works.\n const candidates = [\"playwright\", \"@playwright/test\"];\n for (const id of candidates) {\n try {\n const mod: unknown = await import(/* @vite-ignore */ id);\n return mod as PlaywrightModule;\n } catch {\n // try next candidate\n }\n }\n throw new Error(\n \"Playwright is required for screenshot capture. Install it as a dev dependency: `pnpm add -D playwright && pnpm exec playwright install chromium`.\",\n );\n}\n\nasync function captureScreenshot(\n theme: ValidatedTheme,\n options: ResolvedScreenshotOptions,\n): Promise<void> {\n const playwright = await loadPlaywright();\n const handle = await startPreviewServer(theme, options.port);\n try {\n await mkdir(path.dirname(options.outputPath), { recursive: true });\n const browser = await playwright.chromium.launch({ headless: true });\n try {\n const context = await browser.newContext({\n viewport: options.viewport,\n deviceScaleFactor: 1,\n });\n const page = await context.newPage();\n await page.goto(handle.url, { waitUntil: \"networkidle\" });\n await page.screenshot({ path: options.outputPath, fullPage: false });\n await context.close();\n } finally {\n await browser.close();\n }\n } finally {\n await handle.close();\n }\n console.log(`captured ${path.relative(theme.root, options.outputPath)}`);\n}\n\nasync function screenshotTheme(root: string, options: ScreenshotOptions): Promise<void> {\n const resolved = resolveScreenshotOptions(root, options);\n const theme = resolved.skipBuild ? await validateTheme(root) : await buildTheme(root, false);\n await captureScreenshot(theme, resolved);\n}\n\nasync function loadLocalAgentManifest(root: string): Promise<ThemeAgentManifest> {\n const built = await readJsonIfExists<ThemeAgentManifest>(\n path.join(root, \"dist\", \"agent-manifest.json\"),\n );\n if (built) {\n return built;\n }\n throw new Error(\n `No agent manifest found at ${path.join(root, \"dist\", \"agent-manifest.json\")}. Run \"suda theme build\" first.`,\n );\n}\n\nasync function listAgentThemes(options: AgentThemeOptions): Promise<ThemeCatalogItem[]> {\n if (options.themeRoot) {\n const manifest = await loadLocalAgentManifest(resolveThemeRoot(options));\n return [\n {\n key: manifest.manifest.key,\n name: manifest.manifest.name,\n version: manifest.manifest.version,\n description: manifest.manifest.description ?? null,\n categories: manifest.manifest.categories,\n preview: manifest.manifest.preview,\n },\n ];\n }\n\n const auth = await requireCliBaseUrl();\n const url = new URL(\"/api/cli/agent/themes\", auth.baseUrl);\n if (options.projectId) {\n url.searchParams.set(\"projectId\", options.projectId);\n }\n const catalog = await fetchJson<{ themes: ThemeCatalogItem[] }>(url.href, { token: auth.token });\n await mkdir(agentCacheDir(), { recursive: true });\n await writeFile(\n path.join(agentCacheDir(), \"catalog.json\"),\n `${JSON.stringify(catalog, null, 2)}\\n`,\n );\n return catalog.themes;\n}\n\nasync function fetchAgentManifest(\n themeKey: string,\n options: AgentThemeOptions,\n): Promise<ThemeAgentManifest> {\n // 兼容用户输入 `--theme immgway@1.0.2` 的人机交互格式:\n // 在统一入口拆成内部使用的 themeKey + version,避免每个 action 重复解析。\n // 与 `--version` 同时使用且不一致时报冲突。\n const { key: parsedKey, version: parsedVersion } = parseThemeRef(themeKey);\n if (parsedVersion && options.version && parsedVersion !== options.version) {\n throw new Error(\n `Conflicting versions: --theme specifies \"${parsedVersion}\" but --version specifies \"${options.version}\". Pass only one.`,\n );\n }\n const resolvedKey = parsedKey;\n const resolvedOptions: AgentThemeOptions = parsedVersion\n ? { ...options, version: parsedVersion }\n : options;\n\n if (resolvedOptions.themeRoot) {\n return loadLocalAgentManifest(resolveThemeRoot(resolvedOptions));\n }\n\n const auth = await requireCliBaseUrl();\n const version = resolvedOptions.version ?? \"latest\";\n const cachePath = cachedThemeManifestPath(resolvedKey, version);\n const cached =\n version === \"latest\" ? null : await readJsonIfExists<ThemeAgentManifest>(cachePath);\n if (cached) {\n return cached;\n }\n\n const url = new URL(\n `/api/cli/agent/themes/${encodeURIComponent(resolvedKey)}/${encodeURIComponent(version)}/schema`,\n auth.baseUrl,\n );\n if (resolvedOptions.projectId) {\n url.searchParams.set(\"projectId\", resolvedOptions.projectId);\n }\n const result = await fetchJson<{ agentManifest: ThemeAgentManifest }>(url.href, {\n token: auth.token,\n });\n // 远程在主题或 schema 缺失时可能返回 `{ agentManifest: null }`(见\n // apps/workspace 的 cli/agent/_lib.ts)。直接把 null 传给后续 zod\n // 校验链会触发 `_zod` 这类底层异常,掩盖真实根因;这里抢先抛出可读错误。\n if (!result.agentManifest || !Array.isArray(result.agentManifest.sections)) {\n throw new Error(\n `Theme schema is not available for \"${resolvedKey}@${version}\". The theme may not be published, not active for the project, or its agent manifest is missing. Republish the theme or activate it before retrying.`,\n );\n }\n const realVersion = result.agentManifest.manifest.version;\n const realCachePath = cachedThemeManifestPath(resolvedKey, realVersion);\n await mkdir(path.dirname(realCachePath), { recursive: true });\n await writeFile(realCachePath, `${JSON.stringify(result.agentManifest, null, 2)}\\n`);\n return result.agentManifest;\n}\n\n/**\n * 解析人机交互的 `key@version` 格式。允许仅 `key`,也允许带 version。\n * 注意:theme key 现行约束不含 `@`,所以从右侧第一个 `@` 之后视为 version。\n *\n * Exported for unit-testing; not part of the CLI public surface.\n */\nexport function parseThemeRef(value: string): { key: string; version?: string } {\n const idx = value.lastIndexOf(\"@\");\n if (idx <= 0) {\n return { key: value };\n }\n const key = value.slice(0, idx);\n const version = value.slice(idx + 1);\n if (!version) {\n return { key };\n }\n return { key, version };\n}\n\nfunction printJson(value: unknown): void {\n console.log(JSON.stringify(value, null, 2));\n}\n\nfunction createSectionSchema(\n manifest: ThemeAgentManifest,\n sectionType: string,\n): AgentComponentOutput {\n const section = findAgentSection(manifest, sectionType);\n if (!section) {\n throw new Error(`Unknown section type \"${sectionType}\".`);\n }\n return createAgentComponentSchemaOutput(section, \"section\");\n}\n\nasync function validateAgentPage(\n themeKey: string,\n input: string,\n options: AgentThemeOptions,\n): Promise<void> {\n const manifest = await fetchAgentManifest(themeKey, options);\n const pageContent = await readJson<unknown>(path.resolve(input));\n const result = validateAgentPageContentWithManifest(pageContent, manifest);\n printJson(agentValidationResultSchema.parse(result));\n if (!result.valid) {\n process.exitCode = 1;\n }\n}\n\nasync function createAgentPage(options: AgentPageCreateOptions): Promise<void> {\n if (!options.projectId) {\n throw new Error(\"--project-id is required.\");\n }\n const pageContent = await readJson<unknown>(path.resolve(options.input));\n const manifest = await fetchAgentManifest(options.theme, options);\n const validation = validateAgentPageContentWithManifest(pageContent, manifest);\n if (!validation.valid) {\n printJson(agentValidationResultSchema.parse(validation));\n process.exitCode = 1;\n return;\n }\n const pageData = createPageDataFromAgentContent(pageContent);\n\n const auth = await requireCliBaseUrl();\n const response = await fetchJson<{ pageId: string }>(\n `${auth.baseUrl}/api/cli/agent/projects/${encodeURIComponent(options.projectId)}/pages`,\n {\n method: \"POST\",\n token: auth.token,\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n title: options.title,\n slug: options.slug,\n themeKey: manifest.manifest.key,\n themeVersion: manifest.manifest.version,\n data: pageData,\n }),\n },\n );\n printJson({ success: true, ...response });\n}\n\nasync function listAgentProjects(): Promise<AgentProjectSummary[]> {\n const auth = await requireCliBaseUrl();\n const result = await fetchJson<{ projects: AgentProjectSummary[] }>(\n `${auth.baseUrl}/api/cli/agent/projects`,\n { token: auth.token },\n );\n return result.projects;\n}\n\nasync function createAgentProject(\n options: AgentProjectCreateOptions,\n): Promise<AgentProjectCreated> {\n const auth = await requireCliBaseUrl();\n return fetchJson<AgentProjectCreated>(`${auth.baseUrl}/api/cli/agent/projects`, {\n method: \"POST\",\n token: auth.token,\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n name: options.name,\n siteDescription: options.siteDescription,\n }),\n });\n}\n\nfunction mcpStructured<T extends Record<string, unknown>>(summary: string, value: T) {\n return {\n content: [\n {\n type: \"text\" as const,\n text: summary,\n },\n ],\n structuredContent: value,\n };\n}\n\nasync function startMcpServer(): Promise<void> {\n const server = new McpServer({\n name: \"suda\",\n version: \"0.1.0\",\n });\n\n server.registerTool(\n \"list_projects\",\n {\n description:\n \"List Suda projects the current CLI user can access. ALWAYS call this first when the user asks to generate or edit a website. Flow: (1) If `projects` is empty, do NOT call this tool again; instead skip directly to gathering inputs and calling create_project (see its description). (2) If `projects` has one or more entries, you MUST ask the user which project to use before any further action — even if there is only a single project, present it and ask the user to confirm or pick a different one. Never auto-pick a project on the user's behalf.\",\n inputSchema: {},\n outputSchema: listProjectsOutputSchema.shape,\n },\n async () => {\n const structuredContent = listProjectsOutputSchema.parse({\n projects: await listAgentProjects(),\n });\n return mcpStructured(\"Suda projects accessible to the current user.\", structuredContent);\n },\n );\n\n server.registerTool(\n \"create_project\",\n {\n description:\n \"Create a new Suda project for the current user. Only call this after list_projects returned an empty list. Conversation flow before calling: (1) Ask the user for the website / brand name in one turn and capture it as `name`. (2) Ask the user for a business introduction; the user is allowed (and expected) to answer over multiple turns — keep asking follow-up questions and accumulating their answers until they confirm they are done, then concatenate the accumulated text into a single `siteDescription` (trimmed). Do not invent details the user did not provide. Do not call this tool until both fields are confirmed by the user. The project is created with the default theme and starter pages; no in-app AI site generation is triggered — drive page content afterwards via create_page_draft using the returned projectId.\",\n inputSchema: {\n name: createProjectInputSchema.shape.name.describe(\n \"Website or brand name confirmed by the user in a dedicated turn. Used as the project name and site title.\",\n ),\n siteDescription: createProjectInputSchema.shape.siteDescription.describe(\n \"Business introduction the user provided, possibly across multiple turns, then concatenated and trimmed. Captures what the site is about and who it serves. Used to seed default site metadata.\",\n ),\n },\n outputSchema: createProjectOutputSchema.shape,\n },\n async ({ name, siteDescription }) => {\n const result = await createAgentProject({ name, siteDescription });\n const structuredContent = createProjectOutputSchema.parse({\n projectId: result.projectId,\n name: result.name,\n defaultDomain: result.defaultDomain,\n dashboardUrl: result.dashboardUrl,\n });\n return mcpStructured(\"Created Suda project.\", structuredContent);\n },\n );\n\n server.registerTool(\n \"list_themes\",\n {\n description: \"List themes visible to the current Suda CLI user.\",\n inputSchema: {\n projectId: z.string().optional(),\n themeRoot: z.string().optional(),\n },\n outputSchema: {\n themes: z.array(\n z.object({\n key: z.string(),\n name: z.string(),\n version: z.string(),\n description: z.string().nullable().optional(),\n categories: z.array(z.string()).optional(),\n preview: z.string().optional(),\n active: z.boolean().optional(),\n }),\n ),\n },\n },\n async ({ projectId, themeRoot }) => {\n const structuredContent = { themes: await listAgentThemes({ projectId, themeRoot }) };\n return mcpStructured(\"Available Suda themes.\", structuredContent);\n },\n );\n\n server.registerTool(\n \"describe_theme\",\n {\n description: \"Return the raw Suda agent manifest for a theme.\",\n inputSchema: {\n theme: z.string(),\n version: z.string().optional(),\n projectId: z.string().optional(),\n themeRoot: z.string().optional(),\n },\n outputSchema: {\n agentManifest: z.unknown(),\n },\n },\n async ({ theme, version, projectId, themeRoot }) => {\n const structuredContent = {\n agentManifest: await fetchAgentManifest(theme, { version, projectId, themeRoot }),\n };\n return mcpStructured(\"Raw Suda theme agent manifest.\", structuredContent);\n },\n );\n\n server.registerTool(\n \"get_page_schema\",\n {\n description:\n \"Return the AI-first output schema for generating Suda page content, including all section schemas.\",\n inputSchema: {\n theme: z.string(),\n version: z.string().optional(),\n projectId: z.string().optional(),\n themeRoot: z.string().optional(),\n includeExample: z.boolean().optional(),\n },\n outputSchema: agentPageSchemaOutputSchema.shape,\n },\n async ({ theme, version, projectId, themeRoot, includeExample }) => {\n const manifest = await fetchAgentManifest(theme, { version, projectId, themeRoot });\n const structuredContent = createAgentPageSchemaOutput(manifest, {\n includeExample: includeExample === true,\n });\n return mcpStructured(\"AI-first Suda page content output schema.\", structuredContent);\n },\n );\n\n server.registerTool(\n \"get_section_schema\",\n {\n description: \"Return the AI-first output schema for one section component in a theme.\",\n inputSchema: {\n theme: z.string(),\n section: z.string(),\n version: z.string().optional(),\n projectId: z.string().optional(),\n themeRoot: z.string().optional(),\n },\n outputSchema: agentComponentOutputSchema.shape,\n },\n async ({ theme, section, version, projectId, themeRoot }) => {\n const manifest = await fetchAgentManifest(theme, { version, projectId, themeRoot });\n const structuredContent = createSectionSchema(manifest, section);\n return mcpStructured(\"AI-first Suda section output schema.\", structuredContent);\n },\n );\n\n server.registerTool(\n \"validate_page_config\",\n {\n description: \"Validate AI-generated Suda page content against a theme.\",\n inputSchema: {\n theme: z.string(),\n data: z.unknown(),\n version: z.string().optional(),\n projectId: z.string().optional(),\n themeRoot: z.string().optional(),\n },\n outputSchema: agentValidationResultSchema.shape,\n },\n async ({ theme, data, version, projectId, themeRoot }) => {\n const manifest = await fetchAgentManifest(theme, { version, projectId, themeRoot });\n const structuredContent = agentValidationResultSchema.parse(\n validateAgentPageContentWithManifest(data, manifest),\n );\n return mcpStructured(\"Suda page content validation result.\", structuredContent);\n },\n );\n\n server.registerTool(\n \"create_page_draft\",\n {\n description: \"Create a workspace page draft from AI-generated Suda page content.\",\n inputSchema: {\n projectId: z.string(),\n title: z.string(),\n slug: z.string(),\n theme: z.string(),\n data: z.unknown(),\n version: z.string().optional(),\n },\n outputSchema: createPageDraftOutputSchema,\n },\n async ({ projectId, title, slug, theme, data, version }) => {\n const manifest = await fetchAgentManifest(theme, { version, projectId });\n const validation = validateAgentPageContentWithManifest(data, manifest);\n if (!validation.valid) {\n return mcpStructured(\n \"Suda page content validation failed. Fix issues before creating a draft.\",\n createPageDraftOutputSchema.parse({\n status: \"invalid\",\n valid: false,\n issues: validation.issues,\n }),\n );\n }\n const auth = await requireCliBaseUrl();\n const response = await fetchJson<{ pageId: string }>(\n `${auth.baseUrl}/api/cli/agent/projects/${encodeURIComponent(projectId)}/pages`,\n {\n method: \"POST\",\n token: auth.token,\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n title,\n slug,\n themeKey: manifest.manifest.key,\n themeVersion: manifest.manifest.version,\n data: createPageDataFromAgentContent(data),\n }),\n },\n );\n return mcpStructured(\n \"Created Suda page draft.\",\n createPageDraftOutputSchema.parse({ status: \"created\", ...response }),\n );\n },\n );\n\n await server.connect(new StdioServerTransport());\n}\n\nasync function writeThemeArtifacts(theme: ValidatedTheme): Promise<void> {\n const dist = path.join(theme.root, \"dist\");\n const agentManifest = createThemeAgentManifest(theme.module);\n const manifestJson = `${JSON.stringify(theme.module.manifest, null, 2)}\\n`;\n await writeFile(path.join(dist, \"manifest.json\"), manifestJson);\n // Also write `manifest.json` to the theme root so the published artifact\n // exposes it at a CDN-friendly relative path (`themes/<k>/<v>/manifest.json`,\n // sibling of `styles.css`). The `dist/manifest.json` copy stays for worker /\n // local tooling that already reads it.\n await writeFile(path.join(theme.root, \"manifest.json\"), manifestJson);\n await writeFile(\n path.join(dist, \"starter-pages.json\"),\n `${JSON.stringify(theme.module.starterPages, null, 2)}\\n`,\n );\n await writeFile(\n path.join(dist, \"default-layout.json\"),\n `${JSON.stringify(theme.module.defaultLayout, null, 2)}\\n`,\n );\n await writeFile(\n path.join(dist, \"agent-manifest.json\"),\n `${JSON.stringify(agentManifest, null, 2)}\\n`,\n );\n}\n\nfunction contentTypeFor(relativePath: string): string {\n if (relativePath.endsWith(\".css\")) {\n return \"text/css; charset=utf-8\";\n }\n if (relativePath.endsWith(\".js\") || relativePath.endsWith(\".mjs\")) {\n return \"application/javascript; charset=utf-8\";\n }\n if (relativePath.endsWith(\".map\")) {\n return \"application/json; charset=utf-8\";\n }\n if (relativePath.endsWith(\".json\")) {\n return \"application/json; charset=utf-8\";\n }\n if (relativePath.endsWith(\".svg\")) {\n return \"image/svg+xml\";\n }\n if (relativePath.endsWith(\".png\")) {\n return \"image/png\";\n }\n if (relativePath.endsWith(\".jpg\") || relativePath.endsWith(\".jpeg\")) {\n return \"image/jpeg\";\n }\n if (relativePath.endsWith(\".webp\")) {\n return \"image/webp\";\n }\n if (relativePath.endsWith(\".avif\")) {\n return \"image/avif\";\n }\n if (relativePath.endsWith(\".gif\")) {\n return \"image/gif\";\n }\n if (relativePath.endsWith(\".ico\")) {\n return \"image/x-icon\";\n }\n if (relativePath.endsWith(\".woff2\")) {\n return \"font/woff2\";\n }\n if (relativePath.endsWith(\".woff\")) {\n return \"font/woff\";\n }\n if (relativePath.endsWith(\".ttf\")) {\n return \"font/ttf\";\n }\n if (relativePath.endsWith(\".otf\")) {\n return \"font/otf\";\n }\n if (relativePath.endsWith(\".mp4\")) {\n return \"video/mp4\";\n }\n if (relativePath.endsWith(\".webm\")) {\n return \"video/webm\";\n }\n if (relativePath.endsWith(\".txt\")) {\n return \"text/plain; charset=utf-8\";\n }\n if (relativePath.endsWith(\".xml\")) {\n return \"application/xml; charset=utf-8\";\n }\n return \"application/octet-stream\";\n}\n\nasync function collectFiles(root: string, directory: string): Promise<UploadFile[]> {\n const files: UploadFile[] = [];\n if (!(await pathExists(directory))) {\n return files;\n }\n\n const children = await readdir(directory, { withFileTypes: true });\n for (const child of children) {\n const absolutePath = path.join(directory, child.name);\n if (child.isDirectory()) {\n files.push(...(await collectFiles(root, absolutePath)));\n continue;\n }\n const relativePath = path.relative(root, absolutePath).replaceAll(path.sep, \"/\");\n files.push({\n absolutePath,\n relativePath,\n contentType: contentTypeFor(relativePath),\n });\n }\n return files;\n}\n\nasync function collectThemeArtifactFiles(theme: ValidatedTheme): Promise<UploadFile[]> {\n const files = await collectFiles(theme.root, path.join(theme.root, \"dist\"));\n const assetsFiles = await collectFiles(theme.root, path.join(theme.root, \"assets\"));\n files.push(...assetsFiles);\n if (theme.stylesheetPath) {\n files.push({\n absolutePath: theme.stylesheetPath,\n relativePath: \"styles.css\",\n contentType: \"text/css; charset=utf-8\",\n });\n }\n // Root-level `manifest.json` is the canonical CDN-facing manifest (sibling\n // of `styles.css`). `writeThemeArtifacts` writes it; collect it explicitly\n // because the recursive `collectFiles(theme.root, dist)` only walks the\n // `dist/` subdirectory.\n const rootManifestPath = path.join(theme.root, \"manifest.json\");\n if (await pathExists(rootManifestPath)) {\n files.push({\n absolutePath: rootManifestPath,\n relativePath: \"manifest.json\",\n contentType: \"application/json; charset=utf-8\",\n });\n }\n return files;\n}\n\n/**\n * Files that must exist on the published artifact for SudaCloud's SSR runtime\n * to load a theme. Mirrored on the server in\n * `apps/workspace/server/services/theme-publish-service.ts` as\n * `SSR_REQUIRED_ARTIFACTS`. Keep both lists in sync.\n */\nconst SSR_REQUIRED_ARTIFACTS = [\n \"dist/index.js\",\n \"dist/runtime.client.js\",\n \"manifest.json\",\n \"styles.css\",\n] as const;\n\nasync function checksum(files: UploadFile[]): Promise<string> {\n const hash = createHash(\"sha256\");\n for (const file of files.sort((a, b) => a.relativePath.localeCompare(b.relativePath))) {\n hash.update(file.relativePath);\n hash.update(await readFile(file.absolutePath));\n }\n return hash.digest(\"hex\");\n}\n\n/**\n * Format an unsuccessful HTTP response from the publish API into a single\n * human-readable string. The server returns `{ error, issues? }` where\n * `issues` is the raw `ZodError.issues` array (path + message) for 422\n * validation failures. Surfacing those keeps `Invalid request` from being\n * the only thing the user sees when the request body fails schema checks.\n */\nasync function formatHttpErrorBody(res: Response): Promise<string> {\n const fallback = `${res.status} ${res.statusText}`;\n const body = (await res.json().catch(() => null)) as {\n error?: string;\n issues?: Array<{ path?: Array<string | number>; message?: string }>;\n } | null;\n if (!body) {\n return fallback;\n }\n const message = body.error ?? fallback;\n if (Array.isArray(body.issues) && body.issues.length > 0) {\n const lines = body.issues.map((issue) => {\n const pathSegments = Array.isArray(issue.path) ? issue.path : [];\n const where = pathSegments.length > 0 ? pathSegments.join(\".\") : \"<root>\";\n return ` - ${where}: ${issue.message ?? \"invalid\"}`;\n });\n return `${message}\\n${lines.join(\"\\n\")}`;\n }\n return message;\n}\n\nasync function publishTheme(\n root: string,\n skipBuild: boolean,\n skipCheck: boolean,\n force: boolean,\n): Promise<void> {\n const theme = skipBuild ? await validateTheme(root) : await buildTheme(root, false);\n // Idempotently (re)write the theme artifacts (manifest.json at both\n // `dist/` and root, agent-manifest.json, etc.). `buildTheme` already does\n // this when `skipBuild === false`, but `--skip-build` would otherwise bypass\n // generation of the root-level `manifest.json` introduced in this release —\n // forcing every publish path through `writeThemeArtifacts` keeps the\n // CDN-facing artifact set (root `manifest.json`, sibling of `styles.css`)\n // consistent regardless of how the user invoked `publish`.\n await writeThemeArtifacts(theme);\n // Run the AI-metadata gate before uploading. `theme build` already runs it\n // when `skipBuild === false`, but skipping the check here would let\n // `--skip-build` bypass the contract entirely, and we want a single source\n // of truth for \"is this theme allowed to leave the developer's machine?\".\n if (!skipCheck) {\n const ok = runThemeCheck(theme);\n if (!ok) {\n throw new Error(\"AI metadata check failed. Fix the errors above or rerun with --skip-check.\");\n }\n }\n const files = await collectThemeArtifactFiles(theme);\n if (!theme.clientEntryPath) {\n throw new Error(\"Missing dist/runtime.client.js. Run `suda theme build` first.\");\n }\n // Assert the SSR contract before talking to the workspace API: the server\n // independently re-checks the same set with `HeadObject`, but failing\n // locally produces a clearer error and avoids burning a publish-intent.\n const collectedPaths = new Set(files.map((f) => f.relativePath));\n for (const required of SSR_REQUIRED_ARTIFACTS) {\n if (!collectedPaths.has(required)) {\n throw new Error(\n `Missing required SSR artifact: ${required}. Run \\`suda theme build\\` and ensure ${required === \"styles.css\" ? \"a `styles.css` file exists at the theme root\" : `\\`${required}\\` is generated`}.`,\n );\n }\n }\n\n const config = await readAuthConfig();\n if (!config) {\n throw new Error(\"Not logged in. Run `suda auth login` to authenticate first.\");\n }\n\n const baseUrl = `${protocolForHost(config.host)}://${config.host}`;\n const { key, version } = theme.module.manifest;\n const digest = await checksum(files);\n\n // `--force` is a development-only recovery path: tear down the previous\n // `themes/<key>/<version>/` prefix and DB row before going through the\n // normal publish-intent → upload → publish-complete flow. The CLI does\n // not hold S3 credentials; the workspace endpoint owns the cleanup.\n if (force) {\n const forceRes = await fetch(`${baseUrl}/api/cli/themes/publish-force`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${config.sessionToken}`,\n },\n body: JSON.stringify({ key, version }),\n });\n if (!forceRes.ok && forceRes.status !== 404) {\n throw new Error(`Failed to force-clear ${key}@${version}: ${await formatHttpErrorBody(forceRes)}`);\n }\n if (forceRes.ok) {\n const { deletedObjects } = (await forceRes.json()) as { deletedObjects?: number };\n console.log(\n `force-cleared ${key}@${version} (${deletedObjects ?? 0} objects removed). Republishing...`,\n );\n }\n }\n\n const intentRes = await fetch(`${baseUrl}/api/cli/themes/publish-intent`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${config.sessionToken}`,\n },\n body: JSON.stringify({\n key,\n version,\n checksum: digest,\n files: files.map((f) => ({ relativePath: f.relativePath, contentType: f.contentType })),\n }),\n });\n\n if (!intentRes.ok) {\n throw new Error(`Failed to get publish intent: ${await formatHttpErrorBody(intentRes)}`);\n }\n\n const { urls } = (await intentRes.json()) as {\n urls: Array<{ relativePath: string; url: string; headers?: Record<string, string> }>;\n };\n\n // Upload to S3 using presigned URLs\n for (const file of files) {\n const urlObj = urls.find((u) => u.relativePath === file.relativePath);\n if (!urlObj) {\n throw new Error(`Missing presigned URL for ${file.relativePath}`);\n }\n\n const body = await readFile(file.absolutePath);\n const uploadHeaders: Record<string, string> = { \"Content-Type\": file.contentType };\n if (urlObj.headers) {\n Object.assign(uploadHeaders, urlObj.headers);\n }\n const putRes = await fetch(urlObj.url, {\n method: \"PUT\",\n headers: uploadHeaders,\n body,\n });\n\n if (!putRes.ok) {\n throw new Error(`Failed to upload ${file.relativePath}: ${putRes.statusText}`);\n }\n console.log(`uploaded ${createThemeObjectKey(key, version, file.relativePath)}`);\n }\n\n const bundleArtifactRelative = \"dist/index.js\";\n // `bundleArtifactRelative` presence is already enforced above through\n // `SSR_REQUIRED_ARTIFACTS`; we still pass the literal string to the server\n // so it can read the bundle key without re-deriving it.\n\n const previewArtifactRelative = \"dist/preview/desktop.png\";\n const previewArtifactExists = await pathExists(path.join(theme.root, previewArtifactRelative));\n const agentManifest = createThemeAgentManifest(theme.module);\n\n const completeRes = await fetch(`${baseUrl}/api/cli/themes/publish-complete`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${config.sessionToken}`,\n },\n body: JSON.stringify({\n key,\n version,\n checksum: digest,\n manifest: theme.module.manifest,\n agentManifest,\n bundleArtifactRelative,\n previewArtifactRelative: previewArtifactExists ? previewArtifactRelative : undefined,\n }),\n });\n\n if (!completeRes.ok) {\n throw new Error(`Failed to complete publish: ${await formatHttpErrorBody(completeRes)}`);\n }\n\n console.log(`published ${key}@${version}`);\n}\n\ninterface CliPackageVersions {\n /** Caret-prefixed semver range to install for `@sudajs/theme-engine`. */\n themeEngine: string;\n /** Caret-prefixed semver range to install for `@sudajs/cli`. */\n cli: string;\n}\n\nlet cachedCliPackageVersions: CliPackageVersions | undefined;\n\n/**\n * Reads the CLI's own `package.json` so scaffolded themes declare a caret\n * range for `@sudajs/theme-engine` whose types match the CLI invoking\n * `theme init`.\n *\n * Scaffolded themes list `@sudajs/theme-engine` under `peerDependencies` (so\n * hosts decide the runtime version) AND `devDependencies` (so local dev /\n * typecheck / build still works). Both entries reuse this same range.\n *\n * In the published CLI, `dependencies[\"@sudajs/theme-engine\"]` is already a\n * real semver range (changesets resolves `workspace:*` at publish time), so\n * we forward it verbatim. In the monorepo (`workspace:*`) we instead read\n * the live `@sudajs/theme-engine/package.json` so the scaffolded starter\n * pins to the version under development, which can diverge from the CLI's\n * own version after this release decoupled the two majors.\n */\nasync function readCliPackageVersions(): Promise<CliPackageVersions> {\n if (cachedCliPackageVersions) {\n return cachedCliPackageVersions;\n }\n const here = fileURLToPath(import.meta.url);\n // dist/index.js or src/index.ts → ../package.json\n const cliPkgPath = path.resolve(path.dirname(here), \"..\", \"package.json\");\n let cliRaw: string;\n try {\n cliRaw = await readFile(cliPkgPath, \"utf8\");\n } catch {\n // Should not happen in a real install, but stay resilient in tests.\n cachedCliPackageVersions = { themeEngine: \"*\", cli: \"*\" };\n return cachedCliPackageVersions;\n }\n const cliPkg = JSON.parse(cliRaw) as {\n version?: string;\n dependencies?: Record<string, string>;\n };\n const cliVersion = typeof cliPkg.version === \"string\" ? cliPkg.version : \"0.0.0\";\n const declaredEngine = cliPkg.dependencies?.[\"@sudajs/theme-engine\"];\n let themeEngine: string;\n if (declaredEngine && !declaredEngine.startsWith(\"workspace:\")) {\n // Published CLI tarball: changesets has already replaced workspace:* with\n // a real semver range, which is exactly what we want to forward.\n themeEngine = declaredEngine;\n } else {\n // Monorepo / development: resolve the engine's actual version from its\n // own package.json. The CLI version is NOT a safe fallback here — the\n // engine and CLI ship independent majors via separate changesets, so\n // `^${cliVersion}` could pin scaffolded themes to a non-existent or\n // incompatible engine release. We instead error out loudly so a broken\n // dev environment is fixed before generating a starter.\n let resolved: string | undefined;\n try {\n const require = createRequire(import.meta.url);\n const enginePkgPath = require.resolve(\"@sudajs/theme-engine/package.json\");\n const engineRaw = await readFile(enginePkgPath, \"utf8\");\n const engineVersion = (JSON.parse(engineRaw) as { version?: string }).version;\n if (typeof engineVersion === \"string\" && engineVersion.length > 0) {\n resolved = `^${engineVersion}`;\n }\n } catch {\n // fall through to the explicit error below\n }\n if (!resolved) {\n throw new Error(\n \"suda theme init: cannot determine the @sudajs/theme-engine version to scaffold. \" +\n \"The CLI's package.json declares it as `workspace:*` (monorepo dev mode) but \" +\n \"`@sudajs/theme-engine/package.json` could not be resolved from the CLI's runtime. \" +\n \"Run `pnpm install` and re-run from the monorepo root, or install a published \" +\n \"@sudajs/cli tarball (which pins a real semver range).\",\n );\n }\n themeEngine = resolved;\n }\n cachedCliPackageVersions = {\n themeEngine,\n cli: `^${cliVersion}`,\n };\n return cachedCliPackageVersions;\n}\n\nasync function initTheme(target: string): Promise<void> {\n const key = path\n .basename(target)\n .replace(/[^a-zA-Z0-9._-]/g, \"-\")\n .toLowerCase();\n // Pin scaffolded themes to the CLI's own dependency declarations so\n // `suda theme init` never produces a project that pulls in an older\n // `@sudajs/theme-engine` whose `SudaComponentConfig` type is out of sync\n // with the CLI's `theme check` requirements.\n const cliPackageVersions = await readCliPackageVersions();\n await mkdir(path.join(target, \"src\"), { recursive: true });\n await writeFile(\n path.join(target, \"package.json\"),\n `${JSON.stringify(\n {\n name: `@suda-themes/${key}`,\n version: \"0.1.0\",\n private: true,\n packageManager: \"pnpm@11.6.0\",\n type: \"module\",\n main: \"./dist/index.js\",\n types: \"./dist/index.d.ts\",\n scripts: {\n // `build:src` compiles TypeScript sources to dist/. `build` then runs\n // `suda theme build --skip-theme-build` so the CLI does not recurse\n // back into this script (it would otherwise see scripts.build and\n // call `pnpm run build` again, causing infinite recursion).\n \"build:src\": \"tsc -p tsconfig.json\",\n build: \"pnpm run build:src && suda theme build --theme-root . --skip-theme-build\",\n dev: \"suda theme dev --theme-root . --skip-theme-build\",\n typecheck: \"tsc -p tsconfig.json --noEmit\",\n validate: \"suda theme validate --theme-root .\",\n },\n devDependencies: {\n \"@puckeditor/core\": \"^0.21.2\",\n \"@sudajs/cli\": cliPackageVersions.cli,\n \"@sudajs/theme-engine\": cliPackageVersions.themeEngine,\n \"@types/node\": \"^22.0.0\",\n \"@types/react\": \"^19.0.0\",\n \"@types/react-dom\": \"^19.0.0\",\n react: \"^19.0.0\",\n \"react-dom\": \"^19.0.0\",\n typescript: \"^5.6.0\",\n },\n peerDependencies: {\n \"@puckeditor/core\": \"^0.21.2\",\n // Themes are consumed by hosts (workspace/site/worker) that already\n // ship a copy of `@sudajs/theme-engine`. Declaring it as a peer means\n // hosts can patch/minor-bump the engine without forcing every theme\n // to re-publish, while CLI/dev installs still get a working version\n // via devDependencies.\n \"@sudajs/theme-engine\": cliPackageVersions.themeEngine,\n react: \"^19.0.0\",\n \"react-dom\": \"^19.0.0\",\n },\n },\n null,\n 2,\n )}\\n`,\n );\n // pnpm 11 removed `pnpm.onlyBuiltDependencies` from `package.json` and the\n // `package.json#pnpm` overrides field; everything must live in\n // `pnpm-workspace.yaml`. Even a standalone single-package theme project\n // needs this file to allow esbuild's postinstall to run.\n await writeFile(\n path.join(target, \"pnpm-workspace.yaml\"),\n `# This is NOT a monorepo marker — it only exists because pnpm 11 moved\\n# project-level settings such as \\`allowBuilds\\` out of package.json. Without\\n# a \\`packages:\\` field this workspace contains just the current package, so\\n# the project remains a standalone single-package theme.\\n# See https://pnpm.io/settings and https://pnpm.io/pnpm-workspace_yaml.\\nallowBuilds:\\n esbuild: true\\n`,\n );\n await writeFile(\n path.join(target, \"tsconfig.json\"),\n `${JSON.stringify(\n {\n compilerOptions: {\n target: \"ES2022\",\n lib: [\"DOM\", \"DOM.Iterable\", \"ES2022\"],\n module: \"NodeNext\",\n moduleResolution: \"NodeNext\",\n jsx: \"react-jsx\",\n rootDir: \"src\",\n outDir: \"dist\",\n declaration: true,\n declarationMap: true,\n sourceMap: true,\n strict: true,\n noUncheckedIndexedAccess: true,\n esModuleInterop: true,\n skipLibCheck: true,\n forceConsistentCasingInFileNames: true,\n resolveJsonModule: true,\n types: [\"node\"],\n },\n // `package.json` is included so `src/index.tsx` can read its `version`\n // via `import pkg from \"../package.json\"`. tsc tolerates this with\n // rootDir pinned because the JSON is resolved as input but not emitted.\n include: [\"src\", \"package.json\"],\n },\n null,\n 2,\n )}\\n`,\n );\n await writeFile(\n path.join(target, \"src\", \"manifest.ts\"),\n `import type { ThemeSourceManifest } from \"@sudajs/theme-engine\";\\n\\n// Source-side manifest — version is intentionally omitted because the\\n// authoritative theme version lives in package.json. \\`src/index.tsx\\` reads\\n// package.json#version and merges it into the published ThemeManifest, so a\\n// single \\`pnpm changeset version\\` (or \\`npm version\\`) bumps everything.\\nexport const sourceManifest: ThemeSourceManifest = {\\n key: \"${key}\",\\n name: \"${key}\",\\n categories: [\"other\"],\\n minEngineVersion: \"0.0.0\",\\n entry: \"dist/index.js\",\\n clientEntry: \"dist/runtime.client.js\",\\n // Required. SudaCloud currently hosts SSR themes only; CSR/Hybrid postures\\n // are on the roadmap. Authoring \\`renderMode\\` is the contract a theme uses\\n // to declare which posture it expects from the host.\\n renderMode: \"ssr\",\\n};\\n`,\n );\n await writeFile(\n path.join(target, \"src\", \"theme-asset.ts\"),\n `import { createThemeAssetResolver } from \"@sudajs/theme-engine/runtime\";\\n\\nimport pkg from \"../package.json\" with { type: \"json\" };\\nimport { sourceManifest } from \"./manifest.js\";\\n\\nexport const themeAsset = createThemeAssetResolver(sourceManifest.key, pkg.version);\\n`,\n );\n await writeFile(\n path.join(target, \"src\", \"sections.tsx\"),\n `import type { SudaComponentConfig } from \"@sudajs/theme-engine\";\\n\\nexport const Hero: SudaComponentConfig = {\\n label: \"Hero\",\\n ai: {\\n instructions:\\n \"Primary page introduction used to communicate the main value proposition. \" +\\n \"Place near the beginning of landing, product, service, or campaign pages. \" +\\n \"Include one concise headline, supporting copy, and one primary call to action. \" +\\n \"Use at most once per page. Do not use for ordinary section headings or article content.\",\\n },\\n fields: {\\n eyebrow: { type: \"text\", label: \"Eyebrow\" },\\n title: { type: \"text\", label: \"Title\" },\\n description: { type: \"textarea\", label: \"Description\" },\\n primaryLabel: { type: \"text\", label: \"Primary button label\" },\\n primaryHref: { type: \"text\", label: \"Primary button link\" },\\n },\\n defaultProps: {\\n eyebrow: \"New theme\",\\n title: \"Build with SudaCloud\",\\n description: \"Edit this starter section in the visual editor.\",\\n primaryLabel: \"Get started\",\\n primaryHref: \"#contact\",\\n },\\n render: ({ eyebrow, title, description, primaryLabel, primaryHref }) => (\\n <section className=\"${key}-section ${key}-hero\">\\n <p className=\"${key}-eyebrow\">{eyebrow}</p>\\n <h1>{title}</h1>\\n <p>{description}</p>\\n <a className=\"${key}-button\" href={primaryHref}>{primaryLabel}</a>\\n </section>\\n ),\\n};\\n\\nexport const FeatureGrid: SudaComponentConfig = {\\n label: \"Feature grid\",\\n ai: {\\n instructions:\\n \"Section that lists 3–6 short feature or benefit cards explaining what the product or service offers. \" +\\n \"Place after the hero / introduction and before the final call-to-action. \" +\\n \"Use when the page needs to communicate multiple distinct value points; do not use for testimonials, FAQs, or step-by-step processes.\",\\n },\\n fields: {\\n title: { type: \"text\", label: \"Title\" },\\n description: { type: \"textarea\", label: \"Description\" },\\n features: {\\n type: \"array\",\\n label: \"Features\",\\n arrayFields: {\\n title: { type: \"text\", label: \"Title\" },\\n description: { type: \"textarea\", label: \"Description\" },\\n },\\n },\\n },\\n defaultProps: {\\n title: \"Everything you need to launch\",\\n description: \"Use this section to explain the core value of the project.\",\\n features: [\\n { title: \"Fast setup\", description: \"Start from a clean theme contract.\" },\\n { title: \"Visual editing\", description: \"Expose content fields through Puck.\" },\\n { title: \"Publish ready\", description: \"Build and publish with the Suda CLI.\" },\\n ],\\n },\\n render: ({ title, description, features = [] }) => (\\n <section className=\"${key}-section\">\\n <h2>{title}</h2>\\n <p>{description}</p>\\n <div className=\"${key}-grid\">\\n {features.map((feature: { title?: string; description?: string }, index: number) => (\\n <article className=\"${key}-card\" key={index}>\\n <h3>{feature.title}</h3>\\n <p>{feature.description}</p>\\n </article>\\n ))}\\n </div>\\n </section>\\n ),\\n};\\n\\nexport const Testimonial: SudaComponentConfig = {\\n label: \"Testimonial\",\\n ai: {\\n instructions:\\n \"Section that quotes a single customer or expert as social proof. \" +\\n \"Place mid-page after a feature or value section, or near the end before the final CTA. \" +\\n \"Do not invent quotes, names, or roles; only use content the user provides.\",\\n },\\n fields: {\\n quote: { type: \"textarea\", label: \"Quote\" },\\n author: { type: \"text\", label: \"Author\" },\\n role: { type: \"text\", label: \"Role\" },\\n },\\n defaultProps: {\\n quote: \"SudaCloud gives our team a practical editing workflow without giving up theme control.\",\\n author: \"Alex Chen\",\\n role: \"Founder\",\\n },\\n render: ({ quote, author, role }) => (\\n <section className=\"${key}-section ${key}-quote\">\\n <blockquote>{quote}</blockquote>\\n <p>{author} · {role}</p>\\n </section>\\n ),\\n};\\n\\nexport const CallToAction: SudaComponentConfig = {\\n label: \"Call to action\",\\n ai: {\\n instructions:\\n \"Closing conversion section that invites the visitor to take a specific action (sign up, contact, buy, etc.). \" +\\n \"Place near the end of the page, after supporting content. \" +\\n \"Use at most once per page. Do not use as the page's first introduction — the Hero component fills that role.\",\\n },\\n fields: {\\n title: { type: \"text\", label: \"Title\" },\\n description: { type: \"textarea\", label: \"Description\" },\\n buttonLabel: { type: \"text\", label: \"Button label\" },\\n buttonHref: { type: \"text\", label: \"Button link\" },\\n },\\n defaultProps: {\\n title: \"Ready to build your next page?\",\\n description: \"Use this section as the final conversion block.\",\\n buttonLabel: \"Contact us\",\\n buttonHref: \"#contact\",\\n },\\n render: ({ title, description, buttonLabel, buttonHref }) => (\\n <section className=\"${key}-section ${key}-cta\" id=\"contact\">\\n <h2>{title}</h2>\\n <p>{description}</p>\\n <a className=\"${key}-button\" href={buttonHref}>{buttonLabel}</a>\\n </section>\\n ),\\n};\\n\\nexport const SECTION_COMPONENTS = { Hero, FeatureGrid, Testimonial, CallToAction };\\n`,\n );\n await writeFile(\n path.join(target, \"src\", \"layout.tsx\"),\n `import { getPageSlot } from \"@sudajs/theme-engine/runtime\";\\nimport type { Config } from \"@puckeditor/core\";\\nimport type { SudaComponentConfig } from \"@sudajs/theme-engine\";\\nimport type { ReactElement, ReactNode } from \"react\";\\n\\ntype PuckExtras = { puck?: { metadata?: Record<string, unknown> } };\\n\\nexport const rootConfig: NonNullable<Config[\"root\"]> = {\\n fields: {\\n siteName: { type: \"text\", label: \"Site name\" },\\n },\\n defaultProps: { siteName: \"${key}\" },\\n render: ({ children, siteName }: { children?: ReactNode; siteName?: string }) => (\\n <div className=\"${key}-root\" data-site-name={siteName}>{children}</div>\\n ),\\n};\\n\\nexport const Header: SudaComponentConfig = {\\n label: \"Header\",\\n ai: {\\n instructions:\\n \"Site-wide header rendered at the top of every page. \" +\\n \"Place once at the top of the layout (not inside page content). \" +\\n \"Used for branding and primary navigation, not for promotional content.\",\\n },\\n fields: { siteName: { type: \"text\", label: \"Site name\" } },\\n defaultProps: { siteName: \"${key}\" },\\n render: ({ siteName }) => <header className=\"${key}-header\">{siteName}</header>,\\n};\\n\\nexport const PageOutlet: SudaComponentConfig = {\\n label: \"Page outlet\",\\n ai: {\\n exclude: true,\\n instructions:\\n \"Structural slot where each page's content is injected. \" +\\n \"Managed by the layout, never created or placed by AI.\",\\n },\\n fields: {},\\n defaultProps: {},\\n render: (props: PuckExtras): ReactElement => <>{getPageSlot(props.puck?.metadata)}</>,\\n};\\n\\nexport const Footer: SudaComponentConfig = {\\n label: \"Footer\",\\n ai: {\\n instructions:\\n \"Site-wide footer rendered at the bottom of every page. \" +\\n \"Place once at the end of the layout. \" +\\n \"Used for legal text, copyright, and secondary links — not for primary CTAs.\",\\n },\\n fields: { text: { type: \"text\", label: \"Text\" } },\\n defaultProps: { text: \"© ${key}\" },\\n render: ({ text }) => <footer className=\"${key}-footer\">{text}</footer>,\\n};\\n\\nexport const LAYOUT_COMPONENTS = { Header, PageOutlet, Footer };\\n`,\n );\n await writeFile(\n path.join(target, \"src\", \"config.ts\"),\n `import type { Config, Data } from \"@puckeditor/core\";\\n\\nimport { LAYOUT_COMPONENTS, rootConfig } from \"./layout.js\";\\nimport { SECTION_COMPONENTS } from \"./sections.js\";\\n\\nexport const pageConfig: Config = {\\n components: SECTION_COMPONENTS,\\n};\\n\\nexport const layoutConfig: Config = {\\n root: rootConfig,\\n components: LAYOUT_COMPONENTS,\\n};\\n\\nexport const defaultLayout: Data = {\\n root: { props: { siteName: \"${key}\" } },\\n content: [\\n { type: \"Header\", props: { id: \"Header-1\", siteName: \"${key}\" } },\\n { type: \"PageOutlet\", props: { id: \"PageOutlet-1\" } },\\n { type: \"Footer\", props: { id: \"Footer-1\", text: \"© ${key}\" } },\\n ],\\n};\\n`,\n );\n await writeFile(\n path.join(target, \"src\", \"templates.ts\"),\n `import type { ThemeStarterPage } from \"@sudajs/theme-engine\";\\n\\nexport const starterPages: ThemeStarterPage[] = [\\n {\\n slug: \"home\",\\n title: \"Home\",\\n isHome: true,\\n data: {\\n root: { props: {} },\\n content: [\\n {\\n type: \"Hero\",\\n props: {\\n id: \"Hero-1\",\\n eyebrow: \"Starter page\",\\n title: \"Welcome to ${key}\",\\n description: \"This page was generated by suda theme init.\",\\n primaryLabel: \"Explore features\",\\n primaryHref: \"#features\",\\n },\\n },\\n {\\n type: \"FeatureGrid\",\\n props: {\\n id: \"FeatureGrid-1\",\\n title: \"Designed for editable sites\",\\n description: \"Starter sections show agents and editors how this theme is structured.\",\\n features: [\\n { title: \"Typed fields\", description: \"Each section exposes a clear field schema.\" },\\n { title: \"Starter pages\", description: \"Templates show realistic section composition.\" },\\n { title: \"CLI workflow\", description: \"Build, validate, preview, and publish from one tool.\" },\\n ],\\n },\\n },\\n {\\n type: \"CallToAction\",\\n props: {\\n id: \"CallToAction-1\",\\n title: \"Launch your first page\",\\n description: \"Customize this starter template or let an agent generate a new draft.\",\\n buttonLabel: \"Get in touch\",\\n buttonHref: \"/contact\",\\n },\\n },\\n ],\\n },\\n },\\n {\\n slug: \"about\",\\n title: \"About\",\\n data: {\\n root: { props: {} },\\n content: [\\n {\\n type: \"Hero\",\\n props: {\\n id: \"Hero-About\",\\n eyebrow: \"About\",\\n title: \"A clean starting point for your story\",\\n description: \"Use this page to introduce the project, audience, and promise.\",\\n primaryLabel: \"Contact us\",\\n primaryHref: \"/contact\",\\n },\\n },\\n {\\n type: \"Testimonial\",\\n props: {\\n id: \"Testimonial-About\",\\n quote: \"This starter theme keeps the editable surface focused and predictable.\",\\n author: \"SudaCloud\",\\n role: \"Theme team\",\\n },\\n },\\n ],\\n },\\n },\\n {\\n slug: \"contact\",\\n title: \"Contact\",\\n data: {\\n root: { props: {} },\\n content: [\\n {\\n type: \"Hero\",\\n props: {\\n id: \"Hero-Contact\",\\n eyebrow: \"Contact\",\\n title: \"Let's talk\",\\n description: \"Tell visitors how to reach you and what happens next.\",\\n primaryLabel: \"Email us\",\\n primaryHref: \"mailto:hello@example.com\",\\n },\\n },\\n {\\n type: \"CallToAction\",\\n props: {\\n id: \"CallToAction-Contact\",\\n title: \"Start the conversation\",\\n description: \"Replace this copy with your preferred contact details or form link.\",\\n buttonLabel: \"Send an email\",\\n buttonHref: \"mailto:hello@example.com\",\\n },\\n },\\n ],\\n },\\n },\\n];\\n`,\n );\n await writeFile(\n path.join(target, \"src\", \"index.tsx\"),\n `import type { ThemeManifest, ThemeModule } from \"@sudajs/theme-engine\";\\n\\nimport pkg from \"../package.json\" with { type: \"json\" };\\nimport { defaultLayout, layoutConfig, pageConfig } from \"./config.js\";\\nimport { sourceManifest } from \"./manifest.js\";\\nimport { starterPages } from \"./templates.js\";\\n\\n// Single source of truth: theme version comes from package.json#version,\\n// merged into the source-side manifest. esbuild inlines the JSON import at\\n// build time, so the published \\`dist/index.js\\` is fully self-contained.\\nexport const manifest: ThemeManifest = { ...sourceManifest, version: pkg.version };\\n\\nconst theme: ThemeModule = {\\n manifest,\\n pageConfig,\\n layoutConfig,\\n defaultLayout,\\n starterPages,\\n};\\n\\nexport default theme;\\nexport { pageConfig, layoutConfig, defaultLayout, starterPages };\\n`,\n );\n await writeFile(\n path.join(target, \"src\", \"runtime.client.ts\"),\n '\"use client\";\\n\\nimport theme from \"./index.js\";\\n\\nexport default theme;\\n',\n );\n await writeFile(\n path.join(target, \"styles.css\"),\n `.${key}-root { font-family: Inter, ui-sans-serif, system-ui, sans-serif; color: #111827; background: #ffffff; }\\n.${key}-header, .${key}-footer { padding: 20px clamp(20px, 5vw, 64px); border-bottom: 1px solid #e5e7eb; }\\n.${key}-footer { border-top: 1px solid #e5e7eb; border-bottom: 0; color: #6b7280; }\\n.${key}-section { padding: 64px clamp(20px, 5vw, 64px); }\\n.${key}-hero { background: #f8fafc; }\\n.${key}-eyebrow { text-transform: uppercase; letter-spacing: 0.08em; font-size: 12px; color: #2563eb; font-weight: 700; }\\n.${key}-section h1 { max-width: 780px; font-size: clamp(40px, 7vw, 72px); line-height: 0.95; margin: 0 0 20px; }\\n.${key}-section h2 { max-width: 720px; font-size: 36px; line-height: 1.05; margin: 0 0 16px; }\\n.${key}-section p { max-width: 680px; line-height: 1.7; color: #4b5563; }\\n.${key}-button { display: inline-flex; align-items: center; min-height: 42px; padding: 0 18px; border-radius: 8px; background: #111827; color: #ffffff; text-decoration: none; font-weight: 700; }\\n.${key}-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); gap: 16px; margin-top: 28px; }\\n.${key}-card { border: 1px solid #e5e7eb; border-radius: 8px; padding: 20px; }\\n.${key}-quote blockquote { max-width: 780px; font-size: 28px; line-height: 1.25; margin: 0 0 16px; }\\n.${key}-cta { background: #111827; color: #ffffff; }\\n.${key}-cta p { color: #d1d5db; }\\n.${key}-cta .${key}-button { background: #ffffff; color: #111827; }\\n`,\n );\n await writeFile(path.join(target, \".gitignore\"), \"node_modules\\ndist\\n*.tsbuildinfo\\n\");\n await writeFile(\n path.join(target, \"AGENTS.md\"),\n `# Suda Theme Agent Guide\\n\\nThis directory is a Suda theme source project generated by \\`suda theme init\\`.\\nIt is a **standalone** npm package — it does not depend on the SudaCloud monorepo.\\n\\n## Render mode\\n\\nThis theme contract requires \\`renderMode: \"ssr\"\\` in the source manifest\\n(\\`src/manifest.ts\\`). SudaCloud's site runtime currently only supports SSR\\nthemes; CSR / Hybrid postures are on the roadmap. **Do not** introduce\\nclient-only entry points or assume browser-only globals at module scope —\\nthe theme bundle must execute in a Node SSR context.\\n\\n## What to edit\\n\\n- Add page sections in \\`src/sections.tsx\\` and register them in \\`SECTION_COMPONENTS\\`.\\n- Add starter pages in \\`src/templates.ts\\` to show realistic section combinations.\\n- Keep shared site chrome in \\`src/layout.tsx\\`; \\`PageOutlet\\` is where page content renders.\\n- Keep \\`src/index.tsx\\` exporting the source \\`ThemeModule\\`. The final artifact is produced by \\`suda theme build\\`.\\n- All relative imports under \\`src/\\` MUST include the \\`.js\\` extension (NodeNext ESM resolution).\\n\\n## Page content rules\\n\\n- Agent page files passed to \\`suda agent page validate/create\\` contain \\`content\\` and optional \\`zones\\` only.\\n- Every \\`content[]\\` item must use a section type from \\`SECTION_COMPONENTS\\`.\\n- Every \\`content[]\\` item must include \\`props.id\\`.\\n- Prefer editing section props over changing render code when generating pages.\\n- Do not edit files under \\`dist/\\`; they are generated.\\n\\n## AI metadata (required)\\n\\nEvery component (and zone-level layout component) **must** declare \\`ai.instructions\\`.\\nWithout it the page-generation agent has no way to know what the component is for,\\nand \\`suda theme check\\` (run automatically before publish) will fail.\\n\\n### Component-level \\`ai\\`\\n\\nEach \\`ComponentConfig\\` must include:\\n\\n\\`\\`\\`ts\\nimport type { SudaComponentConfig } from \"@sudajs/theme-engine\";\\n\\nexport const Hero: SudaComponentConfig = {\\n label: \"Hero\",\\n ai: {\\n instructions:\\n \"Primary page introduction used to communicate the main value proposition. \" +\\n \"Place near the beginning of landing or product pages. \" +\\n \"Include one primary CTA. Use at most once per page. \" +\\n \"Do not use for ordinary section headings or article content.\",\\n },\\n fields: { /* ... */ },\\n defaultProps: { /* ... */ },\\n render: (props) => /* ... */,\\n};\\n\\`\\`\\`\\n\\nA good \\`instructions\\` covers, in plain English:\\n\\n1. **Purpose** — what role this component plays on a page.\\n2. **Use when** — page types or scenarios where it should be selected.\\n3. **Avoid when** — situations that look similar but call for a different component.\\n4. **Placement** — where in the page it normally belongs (top, after features, near end, etc.).\\n5. **Frequency / composition** — how many times it can appear, what it must contain, and any adjacency rules.\\n\\nWrite executable, specific sentences (\\`Use when...\\`, \\`Place after...\\`, \\`Use at most once per page.\\`).\\nDo **not** describe styling (colors, fonts, spacing) — those belong to the design system.\\nDo **not** write vague filler like \"modern\", \"engaging\", \"beautiful\".\\n\\nIf two components look similar (e.g. Hero vs. PageHeader vs. SectionHeader),\\ntheir \\`instructions\\` must explicitly differentiate them, otherwise the agent\\nwill mix them up.\\n\\n### Hiding a component from AI\\n\\nUse \\`ai.exclude: true\\` for internal/debug components or anything the agent\\nshould never auto-create. Such components remain editable by humans:\\n\\n\\`\\`\\`ts\\nai: { exclude: true, instructions: \"Internal debug block; AI must not create it.\" }\\n\\`\\`\\`\\n\\n### Field-level \\`ai\\` (recommended, optional)\\n\\nField-level metadata sharpens the generated content but is **not required**.\\nUse it when a field's name and type alone don't fully convey the constraints:\\n\\n\\`\\`\\`ts\\nfields: {\\n title: {\\n type: \"text\",\\n ai: {\\n instructions:\\n \"Main value-proposition headline. 4–12 words, focus on the visitor benefit, \" +\\n \"do not repeat the eyebrow or description.\",\\n required: true,\\n },\\n },\\n imageUrl: {\\n type: \"text\",\\n ai: {\\n // Atomic values that cannot render correctly while half-streamed.\\n stream: false,\\n instructions: \"Image that supports the section topic. Avoid logos, screenshots, or unrelated decoration.\",\\n },\\n },\\n}\\n\\`\\`\\`\\n\\nSupported field-level keys: \\`instructions\\`, \\`required\\`, \\`exclude\\`, \\`stream\\`,\\n\\`bind\\` (delegate to a tool), and \\`schema\\` (only needed for \\`custom\\` / \\`external\\` /\\n\\`user\\` fields whose runtime shape can't be inferred).\\n\\n### Verifying\\n\\n\\`\\`\\`bash\\npnpm build # also runs the AI metadata check\\nsuda theme check # run the check on its own\\n\\`\\`\\`\\n\\nMissing component-level \\`ai.instructions\\` is reported as an **error** and blocks\\nthe build. Very short or label-repeating instructions are reported as\\n**warnings**.\\n\\n## Useful commands\\n\\n\\`\\`\\`bash\\npnpm install\\npnpm typecheck\\npnpm build # tsc + suda theme build --skip-theme-build (runs AI check)\\npnpm validate\\npnpm dev # watch and serve local theme artifact files\\nsuda theme check # AI metadata check only\\nsuda agent theme describe local --theme-root .\\nsuda agent section schema --theme local --section Hero --theme-root .\\nsuda agent page validate --theme local --input ./page.json --theme-root .\\n\\`\\`\\`\\n`,\n );\n await writeFile(\n path.join(target, \"CLAUDE.md\"),\n `# Claude Code\\n\\nRead \\`AGENTS.md\\` first. It is the canonical guide for this Suda theme project.\\n`,\n );\n await writeFile(\n path.join(target, \"README.md\"),\n `# ${key}\\n\\nA Suda theme scaffolded with \\`suda theme init\\`. This is a standalone\\npackage; it does not need to live inside the SudaCloud monorepo.\\n\\nThis theme targets SudaCloud's SSR runtime (\\`renderMode: \"ssr\"\\` in\\n\\`src/manifest.ts\\`); CSR / Hybrid postures are not yet supported by the\\nhost.\\n\\n## Setup\\n\\n\\`\\`\\`bash\\npnpm install\\n\\`\\`\\`\\n\\n## Develop\\n\\n\\`\\`\\`bash\\npnpm typecheck # type-check sources\\npnpm build # tsc + suda theme build (server bundle + client runtime + manifest)\\npnpm dev # watch the browser runtime and start preview server\\npnpm validate # validate the dist artifact\\n\\`\\`\\`\\n\\n> \\`renderMode\\` currently only accepts \\`\"ssr\"\\`. \\`suda theme validate\\` and\\n> \\`suda theme check\\` will reject manifests that omit it or set a different\\n> value.\\n\\n## Agent tooling\\n\\n\\`\\`\\`bash\\nsuda agent theme describe local --theme-root .\\nsuda agent page schema local --theme-root .\\nsuda agent section schema --theme local --section Hero --theme-root .\\n\\`\\`\\`\\n\\n## Publish\\n\\n\\`\\`\\`bash\\npnpm build\\nsuda theme screenshot # optional: capture dist/preview/desktop.png\\nsuda theme publish\\n\\`\\`\\`\\n`,\n );\n console.log(`created theme scaffold at ${target}`);\n}\n\nexport function buildProgram(): Command {\n const program = new Command();\n\n program\n .name(\"suda\")\n .description(\"Suda CLI for managing themes, sites, posts and AI tooling.\")\n .version(\"0.0.0\");\n\n const theme = program.command(\"theme\").description(\"Manage Suda theme artifacts.\");\n\n theme\n .command(\"init\")\n .description(\"Scaffold a new theme source directory.\")\n .argument(\"[dir]\", \"Theme directory to create.\", \"./theme\")\n .action(async (dir: string) => {\n await initTheme(path.resolve(dir));\n });\n\n theme\n .command(\"validate\")\n .description(\"Validate a built theme artifact.\")\n .option(\"--theme-root <path>\", \"Theme source/artifact root.\")\n .action(async (options: ThemeRootOptions) => {\n const result = await validateTheme(resolveThemeRoot(options));\n console.log(`valid ${result.module.manifest.key}@${result.module.manifest.version}`);\n if (!result.clientEntryPath) {\n console.warn(\n \"warning: dist/runtime.client.js is missing; editor runtime will not load until `suda theme build` runs.\",\n );\n }\n });\n\n theme\n .command(\"build\")\n .description(\"Build server dist (via package script) and browser runtime.\")\n .option(\"--theme-root <path>\", \"Theme source/artifact root.\")\n .option(\"--skip-theme-build\", \"Skip the theme package build script.\")\n .option(\"--skip-check\", \"Skip the AI metadata check that normally runs after build.\")\n .action(async (options: BuildOptions) => {\n const result = await buildTheme(resolveThemeRoot(options), options.skipThemeBuild === true);\n console.log(`built ${result.module.manifest.key}@${result.module.manifest.version}`);\n if (options.skipCheck !== true) {\n const ok = runThemeCheck(result);\n if (!ok) {\n throw new Error(\n \"AI metadata check failed. Fix the errors above or rerun with --skip-check.\",\n );\n }\n }\n });\n\n theme\n .command(\"check\")\n .description(\n \"Run AI metadata checks on a built theme without rebuilding. Reports missing component-level ai.instructions as errors and weak content as warnings.\",\n )\n .option(\"--theme-root <path>\", \"Theme source/artifact root.\")\n .action(async (options: CheckOptions) => {\n const theme = await validateTheme(resolveThemeRoot(options));\n const ok = runThemeCheck(theme);\n if (!ok) {\n process.exitCode = 1;\n }\n });\n\n theme\n .command(\"dev\")\n .description(\"Watch and rebuild the browser runtime, and serve the local theme artifact files.\")\n .option(\"--theme-root <path>\", \"Theme source/artifact root.\")\n .option(\"--skip-theme-build\", \"Skip the theme package build script.\")\n .option(\"--port <port>\", \"Preview server port.\", \"4177\")\n .action(async (options: BuildOptions & { port?: string }) => {\n const port = Number(options.port ?? \"4177\");\n await watchTheme(\n resolveThemeRoot(options),\n options.skipThemeBuild === true,\n Number.isFinite(port) ? port : 4177,\n );\n });\n\n theme\n .command(\"screenshot\")\n .description(\"Capture a desktop preview screenshot of the home starter page using Playwright.\")\n .option(\"--theme-root <path>\", \"Theme source/artifact root.\")\n .option(\"--output <path>\", \"Output PNG path relative to theme root.\")\n .option(\"--width <px>\", \"Viewport width in pixels.\", \"1280\")\n .option(\"--height <px>\", \"Viewport height in pixels.\", \"800\")\n .option(\"--port <port>\", \"Preview server port used during capture.\", \"4178\")\n .option(\"--skip-build\", \"Skip rebuilding the theme before capturing.\")\n .action(async (options: ScreenshotOptions) => {\n await screenshotTheme(resolveThemeRoot(options), options);\n });\n\n theme\n .command(\"publish\")\n .description(\"Upload artifact to S3 and upsert ThemePackage/ThemeVersion.\")\n .option(\"--theme-root <path>\", \"Theme source/artifact root.\")\n .option(\"--skip-build\", \"Publish existing dist files without rebuilding.\")\n .option(\"--skip-check\", \"Skip the AI metadata check that normally runs before upload.\")\n .option(\n \"--force\",\n \"Development recovery only: clear the existing themes/<key>/<version>/ prefix and ThemeVersion row before republishing. Re-published clients pinned to this version are unavailable until the new publish completes.\",\n )\n .action(async (options: PublishOptions) => {\n await publishTheme(\n resolveThemeRoot(options),\n options.skipBuild === true,\n options.skipCheck === true,\n options.force === true,\n );\n });\n\n const agent = program.command(\"agent\").description(\"Agent-friendly theme and page tooling.\");\n\n const agentProject = agent.command(\"project\").description(\"Manage Suda projects from the CLI.\");\n\n agentProject\n .command(\"list\")\n .description(\"List Suda projects the current CLI user can access.\")\n .action(async () => {\n const projects = await listAgentProjects();\n printJson({ projects });\n });\n\n agentProject\n .command(\"create\")\n .description(\n \"Create a new Suda project (mirrors onboarding). External AI should ask the user for a website name and short business description before calling this.\",\n )\n .requiredOption(\"--name <name>\", \"Website or brand name.\")\n .requiredOption(\n \"--site-description <description>\",\n \"Short business introduction used to seed default site metadata.\",\n )\n .action(async (options: { name: string; siteDescription: string }) => {\n // Reuse the shared zod schema so CLI flag validation matches the MCP\n // tool input bounds and the server-side `/api/cli/agent/projects` route.\n const parsed = createProjectInputSchema.safeParse({\n name: options.name,\n siteDescription: options.siteDescription,\n });\n if (!parsed.success) {\n const issue = parsed.error.issues[0];\n const field = issue?.path[0] === \"siteDescription\" ? \"--site-description\" : \"--name\";\n throw new Error(`${field}: ${issue?.message ?? \"invalid value\"}`);\n }\n\n const result = await createAgentProject(parsed.data);\n printJson(result);\n });\n\n const agentThemes = agent.command(\"themes\").description(\"Manage agent-visible themes.\");\n\n agentThemes\n .command(\"list\")\n .description(\"List themes visible to the current CLI user.\")\n .option(\"--project-id <projectId>\", \"Scope results to a project.\")\n .option(\"--theme-root <path>\", \"Describe a local theme instead of the remote catalog.\")\n .action(async (options: AgentThemeOptions) => {\n const themes = await listAgentThemes(options);\n printJson({ themes });\n });\n\n const agentTheme = agent.command(\"theme\").description(\"Inspect a single theme.\");\n\n agentTheme\n .command(\"describe\")\n .description(\"Describe a theme's AI-first page schema.\")\n .argument(\"<theme>\", \"Theme key.\")\n .option(\"--version <version>\", \"Theme version.\")\n .option(\"--project-id <projectId>\", \"Project scope.\")\n .option(\"--theme-root <path>\", \"Read a local theme.\")\n .option(\"--example\", \"Include example page content.\")\n .action(async (themeKey: string, options: AgentThemeOptions) => {\n const manifest = await fetchAgentManifest(themeKey, options);\n printJson(\n createAgentPageSchemaOutput(manifest, { includeExample: options.example === true }),\n );\n });\n\n const agentPage = agent.command(\"page\").description(\"AI-first page content tooling.\");\n\n agentPage\n .command(\"schema\")\n .description(\"Print the AI-first page content output schema for a theme.\")\n .argument(\"<theme>\", \"Theme key.\")\n .option(\"--version <version>\", \"Theme version.\")\n .option(\"--project-id <projectId>\", \"Project scope.\")\n .option(\"--theme-root <path>\", \"Read a local theme.\")\n .option(\"--example\", \"Include example page content.\")\n .action(async (themeKey: string, options: AgentThemeOptions) => {\n const manifest = await fetchAgentManifest(themeKey, options);\n printJson(\n createAgentPageSchemaOutput(manifest, { includeExample: options.example === true }),\n );\n });\n\n agentPage\n .command(\"validate\")\n .description(\"Validate an AI-generated Suda page content JSON document.\")\n .requiredOption(\"--theme <theme>\", \"Theme key.\")\n .requiredOption(\"--input <file>\", \"JSON file containing Suda page content.\")\n .option(\"--version <version>\", \"Theme version.\")\n .option(\"--project-id <projectId>\", \"Project scope.\")\n .option(\"--theme-root <path>\", \"Read a local theme.\")\n .action(async (options: AgentThemeOptions & { theme: string; input: string }) => {\n await validateAgentPage(options.theme, options.input, options);\n });\n\n agentPage\n .command(\"create\")\n .description(\"Create a workspace page draft from AI-generated Suda page content JSON.\")\n .requiredOption(\"--project-id <projectId>\", \"Project id.\")\n .requiredOption(\"--title <title>\", \"Page title.\")\n .requiredOption(\"--slug <slug>\", \"Page slug.\")\n .requiredOption(\"--theme <theme>\", \"Theme key.\")\n .requiredOption(\"--input <file>\", \"JSON file containing Suda page content.\")\n .option(\"--version <version>\", \"Theme version.\")\n .action(async (options: AgentPageCreateOptions) => {\n await createAgentPage(options);\n });\n\n const agentSection = agent.command(\"section\").description(\"Inspect a single section.\");\n\n agentSection\n .command(\"schema\")\n .description(\"Print one AI-first section output schema for a theme.\")\n .requiredOption(\"--theme <theme>\", \"Theme key.\")\n .requiredOption(\"--section <section>\", \"Section type.\")\n .option(\"--version <version>\", \"Theme version.\")\n .option(\"--project-id <projectId>\", \"Project scope.\")\n .option(\"--theme-root <path>\", \"Read a local theme.\")\n .action(async (options: AgentThemeOptions & { theme: string; section: string }) => {\n const manifest = await fetchAgentManifest(options.theme, options);\n printJson(createSectionSchema(manifest, options.section));\n });\n\n program\n .command(\"mcp\")\n .description(\"Run the Suda local MCP server over stdio.\")\n .action(async () => {\n await startMcpServer();\n });\n\n const authCmd = program.command(\"auth\").description(\"Manage Suda authentication.\");\n\n authCmd\n .command(\"login\")\n .description(\"Authenticate Suda CLI with a SudaCloud workspace.\")\n .option(\n \"--host <host>\",\n \"The SudaCloud workspace host to authenticate against.\",\n \"app.sudayun.cn\",\n )\n .action(async (options: { host: string }) => {\n await login(options.host);\n });\n\n authCmd\n .command(\"status\")\n .description(\"Check current authentication status.\")\n .action(async () => {\n await status();\n });\n\n authCmd\n .command(\"logout\")\n .description(\"Clear local authentication configuration.\")\n .action(async () => {\n await logout();\n });\n\n program.showHelpAfterError();\n\n return program;\n}\n\nexport async function main(): Promise<void> {\n const program = buildProgram();\n const argv = process.argv.filter((arg, index) => index < 2 || arg !== \"--\");\n await program.parseAsync(argv);\n}\n"]}
|