@sudajs/cli 0.1.0 → 0.1.2
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/bin/suda.js +8 -1
- package/dist/index.js +122 -24
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/bin/suda.js
CHANGED
|
@@ -12,11 +12,18 @@ const devRunner = path.resolve(scriptDir, "suda-dev.js");
|
|
|
12
12
|
const distEntry = path.resolve(scriptDir, "../dist/index.js");
|
|
13
13
|
|
|
14
14
|
if (existsSync(sourceEntry)) {
|
|
15
|
+
// Run the CLI from its TypeScript sources via tsx, but DO NOT pass
|
|
16
|
+
// `--conditions=development` here. That flag is process-wide and would also
|
|
17
|
+
// affect how the CLI resolves third-party packages (e.g. `@sudajs/theme-engine`)
|
|
18
|
+
// when invoked against an *external* theme project, causing Node to try to
|
|
19
|
+
// import the engine's `src/*.ts` (which does not exist in published packages)
|
|
20
|
+
// instead of its built `dist/*.js`. We only want tsx to transpile the CLI's
|
|
21
|
+
// own TypeScript sources; package resolution must use normal exports.
|
|
15
22
|
const require = createRequire(import.meta.url);
|
|
16
23
|
const tsxLoader = require.resolve("tsx");
|
|
17
24
|
const result = spawnSync(
|
|
18
25
|
process.execPath,
|
|
19
|
-
["--
|
|
26
|
+
["--import", tsxLoader, devRunner, ...process.argv.slice(2)],
|
|
20
27
|
{
|
|
21
28
|
stdio: "inherit",
|
|
22
29
|
},
|
package/dist/index.js
CHANGED
|
@@ -61,14 +61,15 @@ Please open the following URL in your browser to authorize Suda CLI:
|
|
|
61
61
|
`);
|
|
62
62
|
console.log(`Your confirmation code is: ${userCode}
|
|
63
63
|
`);
|
|
64
|
-
console.log("Waiting for authorization...");
|
|
65
64
|
try {
|
|
66
65
|
const open = (await import('open')).default;
|
|
67
66
|
await open(authUrl);
|
|
68
67
|
} catch {
|
|
69
68
|
}
|
|
70
69
|
const pollInterval = (interval || 5) * 1e3;
|
|
71
|
-
const
|
|
70
|
+
const timeoutSeconds = expiresIn || 300;
|
|
71
|
+
const deadline = Date.now() + timeoutSeconds * 1e3;
|
|
72
|
+
console.log("Waiting for authorization...");
|
|
72
73
|
while (Date.now() < deadline) {
|
|
73
74
|
await new Promise((resolve) => setTimeout(resolve, pollInterval));
|
|
74
75
|
const pollRes = await fetch(`${baseUrl}/api/cli-auth/poll`, {
|
|
@@ -79,7 +80,7 @@ Please open the following URL in your browser to authorize Suda CLI:
|
|
|
79
80
|
const data = await pollRes.json();
|
|
80
81
|
if (pollRes.ok && data.status === "approved" && data.token) {
|
|
81
82
|
await writeAuthConfig({ sessionToken: data.token, host });
|
|
82
|
-
console.log("
|
|
83
|
+
console.log("Successfully authorized!");
|
|
83
84
|
return;
|
|
84
85
|
}
|
|
85
86
|
if (data.error === "authorization_pending") {
|
|
@@ -96,22 +97,29 @@ async function status() {
|
|
|
96
97
|
return;
|
|
97
98
|
}
|
|
98
99
|
const protocol = config.host.includes("localhost") || config.host.includes("127.0.0.1") ? "http" : "https";
|
|
100
|
+
let res;
|
|
99
101
|
try {
|
|
100
|
-
|
|
102
|
+
res = await fetch(`${protocol}://${config.host}/api/auth/get-session`, {
|
|
101
103
|
headers: {
|
|
102
104
|
Authorization: `Bearer ${config.sessionToken}`
|
|
103
105
|
}
|
|
104
106
|
});
|
|
105
|
-
if (res.ok) {
|
|
106
|
-
const session = await res.json();
|
|
107
|
-
console.log(`Logged in as ${session.user.email || session.user.name} on ${config.host}`);
|
|
108
|
-
} else {
|
|
109
|
-
console.log("Session expired or invalid. Please run `suda auth login` again.");
|
|
110
|
-
await clearAuthConfig();
|
|
111
|
-
}
|
|
112
107
|
} catch {
|
|
113
108
|
console.error(`Failed to connect to ${config.host}.`);
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
if (!res.ok) {
|
|
112
|
+
console.log("Session expired or invalid. Please run `suda auth login` again.");
|
|
113
|
+
await clearAuthConfig();
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
const session = await res.json();
|
|
117
|
+
if (!session?.user) {
|
|
118
|
+
console.log("Session expired or invalid. Please run `suda auth login` again.");
|
|
119
|
+
await clearAuthConfig();
|
|
120
|
+
return;
|
|
114
121
|
}
|
|
122
|
+
console.log(`Logged in as ${session.user.email || session.user.name} on ${config.host}`);
|
|
115
123
|
}
|
|
116
124
|
async function logout() {
|
|
117
125
|
const config = await readAuthConfig();
|
|
@@ -489,6 +497,7 @@ async function watchTheme(root, skipThemeBuild) {
|
|
|
489
497
|
const entryPoint = await findClientEntry(root);
|
|
490
498
|
await mkdir(path2.join(root, "dist"), { recursive: true });
|
|
491
499
|
const hostReactShimPlugin = createHostReactShimPlugin();
|
|
500
|
+
const watchLogPlugin = createWatchLogPlugin("runtime.client.js");
|
|
492
501
|
const context$1 = await context({
|
|
493
502
|
bundle: true,
|
|
494
503
|
entryPoints: [entryPoint],
|
|
@@ -497,7 +506,7 @@ async function watchTheme(root, skipThemeBuild) {
|
|
|
497
506
|
minify: false,
|
|
498
507
|
outfile: path2.join(root, "dist", "runtime.client.js"),
|
|
499
508
|
platform: "browser",
|
|
500
|
-
plugins: [hostReactShimPlugin],
|
|
509
|
+
plugins: [hostReactShimPlugin, watchLogPlugin],
|
|
501
510
|
sourcemap: true,
|
|
502
511
|
target: "es2022",
|
|
503
512
|
treeShaking: true
|
|
@@ -506,6 +515,27 @@ async function watchTheme(root, skipThemeBuild) {
|
|
|
506
515
|
console.log("watching theme runtime; press Ctrl+C to stop");
|
|
507
516
|
await new Promise(() => void 0);
|
|
508
517
|
}
|
|
518
|
+
function createWatchLogPlugin(label) {
|
|
519
|
+
return {
|
|
520
|
+
name: "suda-theme-watch-log",
|
|
521
|
+
setup(build) {
|
|
522
|
+
let firstBuild = true;
|
|
523
|
+
build.onEnd((result) => {
|
|
524
|
+
if (firstBuild) {
|
|
525
|
+
firstBuild = false;
|
|
526
|
+
return;
|
|
527
|
+
}
|
|
528
|
+
const errorCount = result.errors.length;
|
|
529
|
+
if (errorCount > 0) {
|
|
530
|
+
console.log(`rebuild failed (${errorCount} error${errorCount === 1 ? "" : "s"}): ${label}`);
|
|
531
|
+
return;
|
|
532
|
+
}
|
|
533
|
+
const stamp = (/* @__PURE__ */ new Date()).toLocaleTimeString();
|
|
534
|
+
console.log(`[${stamp}] rebuilt ${label}`);
|
|
535
|
+
});
|
|
536
|
+
}
|
|
537
|
+
};
|
|
538
|
+
}
|
|
509
539
|
function pickStarterPage(theme) {
|
|
510
540
|
const pages = theme.module.starterPages;
|
|
511
541
|
if (pages.length === 0) {
|
|
@@ -1133,14 +1163,35 @@ async function initTheme(target) {
|
|
|
1133
1163
|
name: `@suda-themes/${key}`,
|
|
1134
1164
|
version: "0.1.0",
|
|
1135
1165
|
private: true,
|
|
1166
|
+
packageManager: "pnpm@11.6.0",
|
|
1136
1167
|
type: "module",
|
|
1137
1168
|
main: "./dist/index.js",
|
|
1138
1169
|
types: "./dist/index.d.ts",
|
|
1139
1170
|
scripts: {
|
|
1140
|
-
build:
|
|
1141
|
-
|
|
1171
|
+
// `build:src` compiles TypeScript sources to dist/. `build` then runs
|
|
1172
|
+
// `suda theme build --skip-theme-build` so the CLI does not recurse
|
|
1173
|
+
// back into this script (it would otherwise see scripts.build and
|
|
1174
|
+
// call `pnpm run build` again, causing infinite recursion).
|
|
1175
|
+
"build:src": "tsc -p tsconfig.json",
|
|
1176
|
+
build: "pnpm run build:src && suda theme build --theme-root . --skip-theme-build",
|
|
1177
|
+
dev: "suda theme dev --theme-root . --skip-theme-build",
|
|
1178
|
+
typecheck: "tsc -p tsconfig.json --noEmit",
|
|
1179
|
+
validate: "suda theme validate --theme-root .",
|
|
1180
|
+
preview: "suda theme preview --theme-root ."
|
|
1181
|
+
},
|
|
1182
|
+
dependencies: {
|
|
1183
|
+
"@sudajs/theme-engine": "^0.1.1"
|
|
1184
|
+
},
|
|
1185
|
+
devDependencies: {
|
|
1186
|
+
"@puckeditor/core": "^0.21.2",
|
|
1187
|
+
"@sudajs/cli": "^0.1.0",
|
|
1188
|
+
"@types/node": "^22.0.0",
|
|
1189
|
+
"@types/react": "^19.0.0",
|
|
1190
|
+
"@types/react-dom": "^19.0.0",
|
|
1191
|
+
react: "^19.0.0",
|
|
1192
|
+
"react-dom": "^19.0.0",
|
|
1193
|
+
typescript: "^5.6.0"
|
|
1142
1194
|
},
|
|
1143
|
-
dependencies: { "@sudajs/theme-engine": "workspace:*" },
|
|
1144
1195
|
peerDependencies: {
|
|
1145
1196
|
"@puckeditor/core": "^0.21.2",
|
|
1146
1197
|
react: "^19.0.0",
|
|
@@ -1150,11 +1201,45 @@ async function initTheme(target) {
|
|
|
1150
1201
|
null,
|
|
1151
1202
|
2
|
|
1152
1203
|
)}
|
|
1204
|
+
`
|
|
1205
|
+
);
|
|
1206
|
+
await writeFile(
|
|
1207
|
+
path2.join(target, "pnpm-workspace.yaml"),
|
|
1208
|
+
`# Single-package workspace so pnpm 11 can apply per-project settings.
|
|
1209
|
+
# allowBuilds replaces the pre-v11 onlyBuiltDependencies list.
|
|
1210
|
+
allowBuilds:
|
|
1211
|
+
esbuild: true
|
|
1153
1212
|
`
|
|
1154
1213
|
);
|
|
1155
1214
|
await writeFile(
|
|
1156
1215
|
path2.join(target, "tsconfig.json"),
|
|
1157
|
-
|
|
1216
|
+
`${JSON.stringify(
|
|
1217
|
+
{
|
|
1218
|
+
compilerOptions: {
|
|
1219
|
+
target: "ES2022",
|
|
1220
|
+
lib: ["DOM", "DOM.Iterable", "ES2022"],
|
|
1221
|
+
module: "NodeNext",
|
|
1222
|
+
moduleResolution: "NodeNext",
|
|
1223
|
+
jsx: "react-jsx",
|
|
1224
|
+
rootDir: "src",
|
|
1225
|
+
outDir: "dist",
|
|
1226
|
+
declaration: true,
|
|
1227
|
+
declarationMap: true,
|
|
1228
|
+
sourceMap: true,
|
|
1229
|
+
strict: true,
|
|
1230
|
+
noUncheckedIndexedAccess: true,
|
|
1231
|
+
esModuleInterop: true,
|
|
1232
|
+
skipLibCheck: true,
|
|
1233
|
+
forceConsistentCasingInFileNames: true,
|
|
1234
|
+
resolveJsonModule: true,
|
|
1235
|
+
types: ["node"]
|
|
1236
|
+
},
|
|
1237
|
+
include: ["src"]
|
|
1238
|
+
},
|
|
1239
|
+
null,
|
|
1240
|
+
2
|
|
1241
|
+
)}
|
|
1242
|
+
`
|
|
1158
1243
|
);
|
|
1159
1244
|
await writeFile(
|
|
1160
1245
|
path2.join(target, "src", "manifest.ts"),
|
|
@@ -1515,6 +1600,7 @@ export { manifest, pageConfig, layoutConfig, defaultLayout, starterPages };
|
|
|
1515
1600
|
`# Suda Theme Agent Guide
|
|
1516
1601
|
|
|
1517
1602
|
This directory is a Suda theme source project generated by \`suda theme init\`.
|
|
1603
|
+
It is a **standalone** npm package \u2014 it does not depend on the SudaCloud monorepo.
|
|
1518
1604
|
|
|
1519
1605
|
## What to edit
|
|
1520
1606
|
|
|
@@ -1522,6 +1608,7 @@ This directory is a Suda theme source project generated by \`suda theme init\`.
|
|
|
1522
1608
|
- Add starter pages in \`src/templates.ts\` to show realistic section combinations.
|
|
1523
1609
|
- Keep shared site chrome in \`src/layout.tsx\`; \`PageOutlet\` is where page content renders.
|
|
1524
1610
|
- Keep \`src/index.tsx\` exporting the source \`ThemeModule\`. The final artifact is produced by \`suda theme build\`.
|
|
1611
|
+
- All relative imports under \`src/\` MUST include the \`.js\` extension (NodeNext ESM resolution).
|
|
1525
1612
|
|
|
1526
1613
|
## Page content rules
|
|
1527
1614
|
|
|
@@ -1534,9 +1621,11 @@ This directory is a Suda theme source project generated by \`suda theme init\`.
|
|
|
1534
1621
|
## Useful commands
|
|
1535
1622
|
|
|
1536
1623
|
\`\`\`bash
|
|
1537
|
-
|
|
1538
|
-
|
|
1539
|
-
suda theme
|
|
1624
|
+
pnpm install
|
|
1625
|
+
pnpm typecheck
|
|
1626
|
+
pnpm build # tsc + suda theme build --skip-theme-build
|
|
1627
|
+
pnpm validate
|
|
1628
|
+
pnpm preview
|
|
1540
1629
|
suda agent theme describe local --theme-root .
|
|
1541
1630
|
suda agent section schema --theme local --section Hero --theme-root .
|
|
1542
1631
|
suda agent page validate --theme local --input ./page.json --theme-root .
|
|
@@ -1554,14 +1643,23 @@ Read \`AGENTS.md\` first. It is the canonical guide for this Suda theme project.
|
|
|
1554
1643
|
path2.join(target, "README.md"),
|
|
1555
1644
|
`# ${key}
|
|
1556
1645
|
|
|
1557
|
-
A Suda theme scaffolded with \`suda theme init\`.
|
|
1646
|
+
A Suda theme scaffolded with \`suda theme init\`. This is a standalone
|
|
1647
|
+
package; it does not need to live inside the SudaCloud monorepo.
|
|
1648
|
+
|
|
1649
|
+
## Setup
|
|
1650
|
+
|
|
1651
|
+
\`\`\`bash
|
|
1652
|
+
pnpm install
|
|
1653
|
+
\`\`\`
|
|
1558
1654
|
|
|
1559
1655
|
## Develop
|
|
1560
1656
|
|
|
1561
1657
|
\`\`\`bash
|
|
1562
|
-
|
|
1563
|
-
suda theme
|
|
1564
|
-
|
|
1658
|
+
pnpm typecheck # type-check sources
|
|
1659
|
+
pnpm build # tsc + suda theme build (server bundle + client runtime + manifest)
|
|
1660
|
+
pnpm dev # watch the browser runtime
|
|
1661
|
+
pnpm preview # build and preview the home starter page
|
|
1662
|
+
pnpm validate # validate the dist artifact
|
|
1565
1663
|
\`\`\`
|
|
1566
1664
|
|
|
1567
1665
|
## Agent tooling
|
|
@@ -1575,7 +1673,7 @@ suda agent section schema --theme local --section Hero --theme-root .
|
|
|
1575
1673
|
## Publish
|
|
1576
1674
|
|
|
1577
1675
|
\`\`\`bash
|
|
1578
|
-
|
|
1676
|
+
pnpm build
|
|
1579
1677
|
suda theme screenshot # optional: capture dist/preview/desktop.png
|
|
1580
1678
|
suda theme publish
|
|
1581
1679
|
\`\`\`
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/auth.ts","../src/index.ts"],"names":["path","esbuild","context","esbuildContext"],"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 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\nexport async function login(host: string = \"app.sudayun.cn\") {\n const protocol = host.includes(\"localhost\") || host.includes(\"127.0.0.1\") ? \"http\" : \"https\";\n const baseUrl = `${protocol}://${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 console.log(\"Waiting for authorization...\");\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 deadline = Date.now() + (expiresIn || 900) * 1000;\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 const protocol = config.host.includes(\"localhost\") || config.host.includes(\"127.0.0.1\") ? \"http\" : \"https\";\n \n try {\n const res = await fetch(`${protocol}://${config.host}/api/auth/get-session`, {\n headers: {\n Authorization: `Bearer ${config.sessionToken}`,\n },\n });\n\n if (res.ok) {\n const session = (await res.json()) as { user: { email?: string; name?: string } };\n console.log(`Logged in as ${session.user.email || session.user.name} on ${config.host}`);\n } else {\n console.log(\"Session expired or invalid. Please run `suda auth login` again.\");\n await clearAuthConfig();\n }\n } catch {\n console.error(`Failed to connect to ${config.host}.`);\n }\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 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 path from \"node:path\";\nimport { 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 createAgentComponentSchemaOutput,\n createAgentPageSchemaOutput,\n createPageDataFromAgentContent,\n createThemeAgentManifest,\n findAgentSection,\n validateAgentPageContentWithManifest,\n} from \"@sudajs/theme-engine\";\nimport { ThemeRender, extractLayoutChrome } from \"@sudajs/theme-engine/server\";\nimport { Command } from \"commander\";\nimport { build as esbuild, context as esbuildContext, type Plugin } from \"esbuild\";\nimport { createElement } from \"react\";\nimport { renderToStaticMarkup } 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}\n\ninterface PublishOptions extends ThemeRootOptions {\n skipBuild?: boolean;\n bucket?: string;\n}\n\ninterface PreviewOptions extends ThemeRootOptions {\n port?: string;\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 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\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 { error?: string; message?: string };\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(process.env.XDG_CACHE_HOME ?? path.join(process.env.HOME ?? \".\", \".cache\"), \"suda\", \"agent\");\n}\n\nfunction cachedThemeManifestPath(themeKey: string, version: string): string {\n return path.join(agentCacheDir(), \"themes\", safeObjectKeyPart(themeKey), safeObjectKeyPart(version), \"agent-manifest.json\");\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 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\nasync function watchTheme(root: string, skipThemeBuild: boolean): Promise<void> {\n if (!skipThemeBuild) {\n await runThemePackageBuild(root);\n }\n\n await buildServerBundle(root);\n\n const entryPoint = await findClientEntry(root);\n await mkdir(path.join(root, \"dist\"), { recursive: true });\n const hostReactShimPlugin = createHostReactShimPlugin();\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],\n sourcemap: true,\n target: \"es2022\",\n treeShaking: true,\n });\n await context.watch();\n console.log(\"watching theme runtime; press Ctrl+C to stop\");\n await new Promise(() => undefined);\n}\n\ninterface PreviewServerHandle {\n url: string;\n port: number;\n close: () => Promise<void>;\n}\n\nfunction pickStarterPage(theme: ValidatedTheme): ThemeStarterPage | 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] ?? 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\nfunction renderStarterPageHtml(theme: ValidatedTheme, page: ThemeStarterPage): string {\n const chrome = extractLayoutChrome(theme.module.defaultLayout);\n const body = renderToStaticMarkup(\n createElement(ThemeRender, {\n theme: theme.module,\n pageData: page.data,\n layoutData: theme.module.defaultLayout,\n }),\n );\n const cssVarStyle = Object.entries(chrome.cssVariables)\n .map(([key, value]) => `${key}: ${value};`)\n .join(\" \");\n const stylesheetTag = theme.stylesheetPath\n ? '<link rel=\"stylesheet\" href=\"/styles.css\" />'\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\nasync function startPreviewServer(\n theme: ValidatedTheme,\n port: number,\n): Promise<PreviewServerHandle> {\n const { createServer } = await import(\"node:http\");\n const starterPage = pickStarterPage(theme);\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 if (!starterPage) {\n response.writeHead(404, { \"Content-Type\": \"text/plain; charset=utf-8\" });\n response.end(\"No starter page available for preview.\");\n return;\n }\n response.writeHead(200, { \"Content-Type\": \"text/html; charset=utf-8\" });\n response.end(renderStarterPageHtml(theme, starterPage));\n return;\n }\n\n if (pathname === \"/styles.css\" && theme.stylesheetPath) {\n response.writeHead(200, { \"Content-Type\": \"text/css; charset=utf-8\" });\n response.end(await readFile(theme.stylesheetPath));\n return;\n }\n\n const relativePath = pathname.replace(/^\\/+/, \"\");\n const filePath = path.resolve(theme.root, relativePath);\n const normalizedRoot = path.resolve(theme.root) + path.sep;\n if (!filePath.startsWith(normalizedRoot) || !(await pathExists(filePath))) {\n response.writeHead(404, { \"Content-Type\": \"text/plain; charset=utf-8\" });\n response.end(\"Not found\");\n return;\n }\n response.writeHead(200, { \"Content-Type\": contentTypeFor(relativePath) });\n response.end(await readFile(filePath));\n })().catch((error) => {\n response.writeHead(500, { \"Content-Type\": \"text/plain; charset=utf-8\" });\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\nasync function previewTheme(root: string, port: number): Promise<void> {\n const theme = await buildTheme(root, false);\n const handle = await startPreviewServer(theme, port);\n console.log(\n `previewing ${theme.module.manifest.key}@${theme.module.manifest.version} at ${handle.url}`,\n );\n await new Promise(() => undefined);\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>(path.join(root, \"dist\", \"agent-manifest.json\"));\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(path.join(agentCacheDir(), \"catalog.json\"), `${JSON.stringify(catalog, null, 2)}\\n`);\n return catalog.themes;\n}\n\nasync function fetchAgentManifest(\n themeKey: string,\n options: AgentThemeOptions,\n): Promise<ThemeAgentManifest> {\n if (options.themeRoot) {\n return loadLocalAgentManifest(resolveThemeRoot(options));\n }\n\n const auth = await requireCliBaseUrl();\n const version = options.version ?? \"latest\";\n const cachePath = cachedThemeManifestPath(themeKey, version);\n const cached = version === \"latest\" ? null : await readJsonIfExists<ThemeAgentManifest>(cachePath);\n if (cached) {\n return cached;\n }\n\n const url = new URL(`/api/cli/agent/themes/${encodeURIComponent(themeKey)}/${encodeURIComponent(version)}/schema`, auth.baseUrl);\n if (options.projectId) {\n url.searchParams.set(\"projectId\", options.projectId);\n }\n const result = await fetchJson<{ agentManifest: ThemeAgentManifest }>(url.href, { token: auth.token });\n const realVersion = result.agentManifest.manifest.version;\n const realCachePath = cachedThemeManifestPath(themeKey, 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\nfunction printJson(value: unknown): void {\n console.log(JSON.stringify(value, null, 2));\n}\n\nfunction createSectionSchema(manifest: ThemeAgentManifest, sectionType: string): 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(themeKey: string, input: string, options: AgentThemeOptions): 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\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_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 await writeFile(\n path.join(dist, \"manifest.json\"),\n `${JSON.stringify(theme.module.manifest, null, 2)}\\n`,\n );\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\")) {\n return \"application/javascript; 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 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 if (theme.stylesheetPath) {\n files.push({\n absolutePath: theme.stylesheetPath,\n relativePath: \"styles.css\",\n contentType: \"text/css; charset=utf-8\",\n });\n }\n return files;\n}\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\nasync function publishTheme(\n root: string,\n skipBuild: boolean,\n): Promise<void> {\n const theme = skipBuild ? await validateTheme(root) : await buildTheme(root, false);\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\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\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 files: files.map((f) => ({ relativePath: f.relativePath, contentType: f.contentType })),\n }),\n });\n\n if (!intentRes.ok) {\n const errorData = (await intentRes.json().catch(() => ({}))) as { error?: string };\n throw new Error(`Failed to get publish intent: ${errorData.error || intentRes.statusText}`);\n }\n\n const { urls } = (await intentRes.json()) as { urls: Array<{ relativePath: string; url: string }> };\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 digest = await checksum(files);\n const bundleArtifactRelative = \"dist/index.js\";\n const bundleArtifactExists = files.some((f) => f.relativePath === bundleArtifactRelative);\n if (!bundleArtifactExists) {\n throw new Error(`Missing ${bundleArtifactRelative} in theme artifacts.`);\n }\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 const errorData = (await completeRes.json().catch(() => ({}))) as { error?: string };\n throw new Error(`Failed to complete publish: ${errorData.error || completeRes.statusText}`);\n }\n\n console.log(`published ${key}@${version}`);\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 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 type: \"module\",\n main: \"./dist/index.js\",\n types: \"./dist/index.d.ts\",\n scripts: {\n build: \"tsc -p tsconfig.json\",\n typecheck: \"tsc -p tsconfig.json --noEmit\",\n },\n dependencies: { \"@sudajs/theme-engine\": \"workspace:*\" },\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 await writeFile(\n path.join(target, \"tsconfig.json\"),\n '{\\n \"extends\": \"@suda/tsconfig/node.json\",\\n \"compilerOptions\": { \"lib\": [\"DOM\", \"DOM.Iterable\", \"ES2022\"], \"jsx\": \"react-jsx\", \"rootDir\": \"src\", \"outDir\": \"dist\" },\\n \"include\": [\"src\"]\\n}\\n',\n );\n await writeFile(\n path.join(target, \"src\", \"manifest.ts\"),\n `import type { ThemeManifest } from \"@sudajs/theme-engine\";\\n\\nexport const manifest: ThemeManifest = {\\n key: \"${key}\",\\n name: \"${key}\",\\n version: \"0.1.0\",\\n categories: [\"other\"],\\n minEngineVersion: \"0.0.0\",\\n entry: \"dist/index.js\",\\n clientEntry: \"dist/runtime.client.js\",\\n};\\n`,\n );\n await writeFile(\n path.join(target, \"src\", \"sections.tsx\"),\n `import type { ComponentConfig } from \"@puckeditor/core\";\\n\\nexport const Hero: ComponentConfig = {\\n label: \"Hero\",\\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: ComponentConfig = {\\n label: \"Feature grid\",\\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: ComponentConfig = {\\n label: \"Testimonial\",\\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: ComponentConfig = {\\n label: \"Call to action\",\\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 { ComponentConfig, Config } from \"@puckeditor/core\";\\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: ComponentConfig = {\\n label: \"Header\",\\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: ComponentConfig = {\\n label: \"Page outlet\",\\n fields: {},\\n defaultProps: {},\\n render: (props: PuckExtras): ReactElement => <>{getPageSlot(props.puck?.metadata)}</>,\\n};\\n\\nexport const Footer: ComponentConfig = {\\n label: \"Footer\",\\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 { ThemeModule } from \"@sudajs/theme-engine\";\\n\\nimport { defaultLayout, layoutConfig, pageConfig } from \"./config.js\";\\nimport { manifest } from \"./manifest.js\";\\nimport { starterPages } from \"./templates.js\";\\n\\nconst theme: ThemeModule = {\\n manifest,\\n pageConfig,\\n layoutConfig,\\n defaultLayout,\\n starterPages,\\n};\\n\\nexport default theme;\\nexport { manifest, 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\\`.\\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\\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## Useful commands\\n\\n\\`\\`\\`bash\\nsuda theme build\\nsuda theme validate\\nsuda theme preview\\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\\`.\\n\\n## Develop\\n\\n\\`\\`\\`bash\\nsuda theme build\\nsuda theme dev # rebuild the browser runtime on change\\nsuda theme preview # build and preview the home starter page\\n\\`\\`\\`\\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\\nsuda theme 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 .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 });\n\n theme\n .command(\"dev\")\n .description(\"Watch and rebuild the browser runtime.\")\n .option(\"--theme-root <path>\", \"Theme source/artifact root.\")\n .option(\"--skip-theme-build\", \"Skip the theme package build script.\")\n .action(async (options: BuildOptions) => {\n await watchTheme(resolveThemeRoot(options), options.skipThemeBuild === true);\n });\n\n theme\n .command(\"preview\")\n .description(\"Build and serve the local theme artifact files.\")\n .option(\"--theme-root <path>\", \"Theme source/artifact root.\")\n .option(\"--port <port>\", \"Preview server port.\", \"4177\")\n .action(async (options: PreviewOptions) => {\n const port = Number(options.port ?? \"4177\");\n await previewTheme(resolveThemeRoot(options), Number.isFinite(port) ? port : 4177);\n });\n\n theme\n .command(\"screenshot\")\n .description(\n \"Capture a desktop preview screenshot of the home starter page using Playwright.\",\n )\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 .action(async (options: PublishOptions) => {\n await publishTheme(resolveThemeRoot(options), options.skipBuild === true);\n });\n\n const agent = program.command(\"agent\").description(\"Agent-friendly theme and page tooling.\");\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(createAgentPageSchemaOutput(manifest, { includeExample: options.example === true }));\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(createAgentPageSchemaOutput(manifest, { includeExample: options.example === true }));\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(\"--host <host>\", \"The SudaCloud workspace host to authenticate against.\", \"app.sudayun.cn\")\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","esbuild","context","esbuildContext"],"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 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\nexport async function login(host: string = \"app.sudayun.cn\") {\n const protocol = host.includes(\"localhost\") || host.includes(\"127.0.0.1\") ? \"http\" : \"https\";\n const baseUrl = `${protocol}://${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 const protocol = config.host.includes(\"localhost\") || config.host.includes(\"127.0.0.1\") ? \"http\" : \"https\";\n\n let res: Response;\n try {\n res = await fetch(`${protocol}://${config.host}/api/auth/get-session`, {\n headers: {\n Authorization: `Bearer ${config.sessionToken}`,\n },\n });\n } catch {\n console.error(`Failed to connect to ${config.host}.`);\n return;\n }\n\n if (!res.ok) {\n console.log(\"Session expired or invalid. Please run `suda auth login` again.\");\n await clearAuthConfig();\n return;\n }\n\n // better-auth's `/api/auth/get-session` returns HTTP 200 with body `null`\n // when the bearer token is unrecognized. Treat that as an invalid session\n // instead of crashing on `session.user`.\n const session = (await res.json()) as { user?: { email?: string; name?: string } } | null;\n if (!session?.user) {\n console.log(\"Session expired or invalid. Please run `suda auth login` again.\");\n await clearAuthConfig();\n return;\n }\n\n console.log(`Logged in as ${session.user.email || session.user.name} 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 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 path from \"node:path\";\nimport { 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 createAgentComponentSchemaOutput,\n createAgentPageSchemaOutput,\n createPageDataFromAgentContent,\n createThemeAgentManifest,\n findAgentSection,\n validateAgentPageContentWithManifest,\n} from \"@sudajs/theme-engine\";\nimport { ThemeRender, extractLayoutChrome } from \"@sudajs/theme-engine/server\";\nimport { Command } from \"commander\";\nimport { build as esbuild, context as esbuildContext, type Plugin } from \"esbuild\";\nimport { createElement } from \"react\";\nimport { renderToStaticMarkup } 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}\n\ninterface PublishOptions extends ThemeRootOptions {\n skipBuild?: boolean;\n bucket?: string;\n}\n\ninterface PreviewOptions extends ThemeRootOptions {\n port?: string;\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 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\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 { error?: string; message?: string };\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(process.env.XDG_CACHE_HOME ?? path.join(process.env.HOME ?? \".\", \".cache\"), \"suda\", \"agent\");\n}\n\nfunction cachedThemeManifestPath(themeKey: string, version: string): string {\n return path.join(agentCacheDir(), \"themes\", safeObjectKeyPart(themeKey), safeObjectKeyPart(version), \"agent-manifest.json\");\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 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\nasync function watchTheme(root: string, skipThemeBuild: boolean): Promise<void> {\n if (!skipThemeBuild) {\n await runThemePackageBuild(root);\n }\n\n await buildServerBundle(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 console.log(\"watching theme runtime; press Ctrl+C to stop\");\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(`rebuild failed (${errorCount} error${errorCount === 1 ? \"\" : \"s\"}): ${label}`);\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\nfunction pickStarterPage(theme: ValidatedTheme): ThemeStarterPage | 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] ?? 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\nfunction renderStarterPageHtml(theme: ValidatedTheme, page: ThemeStarterPage): string {\n const chrome = extractLayoutChrome(theme.module.defaultLayout);\n const body = renderToStaticMarkup(\n createElement(ThemeRender, {\n theme: theme.module,\n pageData: page.data,\n layoutData: theme.module.defaultLayout,\n }),\n );\n const cssVarStyle = Object.entries(chrome.cssVariables)\n .map(([key, value]) => `${key}: ${value};`)\n .join(\" \");\n const stylesheetTag = theme.stylesheetPath\n ? '<link rel=\"stylesheet\" href=\"/styles.css\" />'\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\nasync function startPreviewServer(\n theme: ValidatedTheme,\n port: number,\n): Promise<PreviewServerHandle> {\n const { createServer } = await import(\"node:http\");\n const starterPage = pickStarterPage(theme);\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 if (!starterPage) {\n response.writeHead(404, { \"Content-Type\": \"text/plain; charset=utf-8\" });\n response.end(\"No starter page available for preview.\");\n return;\n }\n response.writeHead(200, { \"Content-Type\": \"text/html; charset=utf-8\" });\n response.end(renderStarterPageHtml(theme, starterPage));\n return;\n }\n\n if (pathname === \"/styles.css\" && theme.stylesheetPath) {\n response.writeHead(200, { \"Content-Type\": \"text/css; charset=utf-8\" });\n response.end(await readFile(theme.stylesheetPath));\n return;\n }\n\n const relativePath = pathname.replace(/^\\/+/, \"\");\n const filePath = path.resolve(theme.root, relativePath);\n const normalizedRoot = path.resolve(theme.root) + path.sep;\n if (!filePath.startsWith(normalizedRoot) || !(await pathExists(filePath))) {\n response.writeHead(404, { \"Content-Type\": \"text/plain; charset=utf-8\" });\n response.end(\"Not found\");\n return;\n }\n response.writeHead(200, { \"Content-Type\": contentTypeFor(relativePath) });\n response.end(await readFile(filePath));\n })().catch((error) => {\n response.writeHead(500, { \"Content-Type\": \"text/plain; charset=utf-8\" });\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\nasync function previewTheme(root: string, port: number): Promise<void> {\n const theme = await buildTheme(root, false);\n const handle = await startPreviewServer(theme, port);\n console.log(\n `previewing ${theme.module.manifest.key}@${theme.module.manifest.version} at ${handle.url}`,\n );\n await new Promise(() => undefined);\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>(path.join(root, \"dist\", \"agent-manifest.json\"));\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(path.join(agentCacheDir(), \"catalog.json\"), `${JSON.stringify(catalog, null, 2)}\\n`);\n return catalog.themes;\n}\n\nasync function fetchAgentManifest(\n themeKey: string,\n options: AgentThemeOptions,\n): Promise<ThemeAgentManifest> {\n if (options.themeRoot) {\n return loadLocalAgentManifest(resolveThemeRoot(options));\n }\n\n const auth = await requireCliBaseUrl();\n const version = options.version ?? \"latest\";\n const cachePath = cachedThemeManifestPath(themeKey, version);\n const cached = version === \"latest\" ? null : await readJsonIfExists<ThemeAgentManifest>(cachePath);\n if (cached) {\n return cached;\n }\n\n const url = new URL(`/api/cli/agent/themes/${encodeURIComponent(themeKey)}/${encodeURIComponent(version)}/schema`, auth.baseUrl);\n if (options.projectId) {\n url.searchParams.set(\"projectId\", options.projectId);\n }\n const result = await fetchJson<{ agentManifest: ThemeAgentManifest }>(url.href, { token: auth.token });\n const realVersion = result.agentManifest.manifest.version;\n const realCachePath = cachedThemeManifestPath(themeKey, 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\nfunction printJson(value: unknown): void {\n console.log(JSON.stringify(value, null, 2));\n}\n\nfunction createSectionSchema(manifest: ThemeAgentManifest, sectionType: string): 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(themeKey: string, input: string, options: AgentThemeOptions): 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\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_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 await writeFile(\n path.join(dist, \"manifest.json\"),\n `${JSON.stringify(theme.module.manifest, null, 2)}\\n`,\n );\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\")) {\n return \"application/javascript; 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 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 if (theme.stylesheetPath) {\n files.push({\n absolutePath: theme.stylesheetPath,\n relativePath: \"styles.css\",\n contentType: \"text/css; charset=utf-8\",\n });\n }\n return files;\n}\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\nasync function publishTheme(\n root: string,\n skipBuild: boolean,\n): Promise<void> {\n const theme = skipBuild ? await validateTheme(root) : await buildTheme(root, false);\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\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\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 files: files.map((f) => ({ relativePath: f.relativePath, contentType: f.contentType })),\n }),\n });\n\n if (!intentRes.ok) {\n const errorData = (await intentRes.json().catch(() => ({}))) as { error?: string };\n throw new Error(`Failed to get publish intent: ${errorData.error || intentRes.statusText}`);\n }\n\n const { urls } = (await intentRes.json()) as { urls: Array<{ relativePath: string; url: string }> };\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 digest = await checksum(files);\n const bundleArtifactRelative = \"dist/index.js\";\n const bundleArtifactExists = files.some((f) => f.relativePath === bundleArtifactRelative);\n if (!bundleArtifactExists) {\n throw new Error(`Missing ${bundleArtifactRelative} in theme artifacts.`);\n }\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 const errorData = (await completeRes.json().catch(() => ({}))) as { error?: string };\n throw new Error(`Failed to complete publish: ${errorData.error || completeRes.statusText}`);\n }\n\n console.log(`published ${key}@${version}`);\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 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 preview: \"suda theme preview --theme-root .\",\n },\n dependencies: {\n \"@sudajs/theme-engine\": \"^0.1.1\",\n },\n devDependencies: {\n \"@puckeditor/core\": \"^0.21.2\",\n \"@sudajs/cli\": \"^0.1.0\",\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 `# Single-package workspace so pnpm 11 can apply per-project settings.\\n# allowBuilds replaces the pre-v11 onlyBuiltDependencies list.\\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 include: [\"src\"],\n },\n null,\n 2,\n )}\\n`,\n );\n await writeFile(\n path.join(target, \"src\", \"manifest.ts\"),\n `import type { ThemeManifest } from \"@sudajs/theme-engine\";\\n\\nexport const manifest: ThemeManifest = {\\n key: \"${key}\",\\n name: \"${key}\",\\n version: \"0.1.0\",\\n categories: [\"other\"],\\n minEngineVersion: \"0.0.0\",\\n entry: \"dist/index.js\",\\n clientEntry: \"dist/runtime.client.js\",\\n};\\n`,\n );\n await writeFile(\n path.join(target, \"src\", \"sections.tsx\"),\n `import type { ComponentConfig } from \"@puckeditor/core\";\\n\\nexport const Hero: ComponentConfig = {\\n label: \"Hero\",\\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: ComponentConfig = {\\n label: \"Feature grid\",\\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: ComponentConfig = {\\n label: \"Testimonial\",\\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: ComponentConfig = {\\n label: \"Call to action\",\\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 { ComponentConfig, Config } from \"@puckeditor/core\";\\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: ComponentConfig = {\\n label: \"Header\",\\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: ComponentConfig = {\\n label: \"Page outlet\",\\n fields: {},\\n defaultProps: {},\\n render: (props: PuckExtras): ReactElement => <>{getPageSlot(props.puck?.metadata)}</>,\\n};\\n\\nexport const Footer: ComponentConfig = {\\n label: \"Footer\",\\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 { ThemeModule } from \"@sudajs/theme-engine\";\\n\\nimport { defaultLayout, layoutConfig, pageConfig } from \"./config.js\";\\nimport { manifest } from \"./manifest.js\";\\nimport { starterPages } from \"./templates.js\";\\n\\nconst theme: ThemeModule = {\\n manifest,\\n pageConfig,\\n layoutConfig,\\n defaultLayout,\\n starterPages,\\n};\\n\\nexport default theme;\\nexport { manifest, 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## 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## Useful commands\\n\\n\\`\\`\\`bash\\npnpm install\\npnpm typecheck\\npnpm build # tsc + suda theme build --skip-theme-build\\npnpm validate\\npnpm preview\\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\\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\\npnpm preview # build and preview the home starter page\\npnpm validate # validate the dist artifact\\n\\`\\`\\`\\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 .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 });\n\n theme\n .command(\"dev\")\n .description(\"Watch and rebuild the browser runtime.\")\n .option(\"--theme-root <path>\", \"Theme source/artifact root.\")\n .option(\"--skip-theme-build\", \"Skip the theme package build script.\")\n .action(async (options: BuildOptions) => {\n await watchTheme(resolveThemeRoot(options), options.skipThemeBuild === true);\n });\n\n theme\n .command(\"preview\")\n .description(\"Build and serve the local theme artifact files.\")\n .option(\"--theme-root <path>\", \"Theme source/artifact root.\")\n .option(\"--port <port>\", \"Preview server port.\", \"4177\")\n .action(async (options: PreviewOptions) => {\n const port = Number(options.port ?? \"4177\");\n await previewTheme(resolveThemeRoot(options), Number.isFinite(port) ? port : 4177);\n });\n\n theme\n .command(\"screenshot\")\n .description(\n \"Capture a desktop preview screenshot of the home starter page using Playwright.\",\n )\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 .action(async (options: PublishOptions) => {\n await publishTheme(resolveThemeRoot(options), options.skipBuild === true);\n });\n\n const agent = program.command(\"agent\").description(\"Agent-friendly theme and page tooling.\");\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(createAgentPageSchemaOutput(manifest, { includeExample: options.example === true }));\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(createAgentPageSchemaOutput(manifest, { includeExample: options.example === true }));\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(\"--host <host>\", \"The SudaCloud workspace host to authenticate against.\", \"app.sudayun.cn\")\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"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sudajs/cli",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.2",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"bin": {
|
|
6
6
|
"suda": "./bin/suda.js"
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
"react": "^19.0.0",
|
|
32
32
|
"react-dom": "^19.0.0",
|
|
33
33
|
"zod": "^3.24.1",
|
|
34
|
-
"@sudajs/theme-engine": "0.1.
|
|
34
|
+
"@sudajs/theme-engine": "0.1.1"
|
|
35
35
|
},
|
|
36
36
|
"devDependencies": {
|
|
37
37
|
"@types/node": "^22.10.2",
|