@_davideast/stitch-mcp 0.5.2 → 0.5.3

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.
Files changed (126) hide show
  1. package/dist/chunk-22bymmh9.js +137 -0
  2. package/dist/chunk-22bymmh9.js.map +10 -0
  3. package/dist/chunk-387yyye2.js +248 -0
  4. package/dist/chunk-387yyye2.js.map +14 -0
  5. package/dist/chunk-3ff2k44g.js +19 -0
  6. package/dist/chunk-3ff2k44g.js.map +9 -0
  7. package/dist/chunk-46cay1zp.js +273 -0
  8. package/dist/chunk-46cay1zp.js.map +10 -0
  9. package/dist/chunk-48e1jpm8.js +167 -0
  10. package/dist/chunk-48e1jpm8.js.map +10 -0
  11. package/dist/chunk-4arzkk1s.js +69 -0
  12. package/dist/chunk-4arzkk1s.js.map +10 -0
  13. package/dist/chunk-4js7vw6h.js +415 -0
  14. package/dist/chunk-4js7vw6h.js.map +20 -0
  15. package/dist/chunk-4p1wfk3t.js +736 -0
  16. package/dist/chunk-4p1wfk3t.js.map +16 -0
  17. package/dist/chunk-4zg969tc.js +370 -0
  18. package/dist/chunk-4zg969tc.js.map +16 -0
  19. package/dist/chunk-5jjt7tgw.js +247 -0
  20. package/dist/chunk-5jjt7tgw.js.map +14 -0
  21. package/dist/chunk-5t2h8z2n.js +273 -0
  22. package/dist/chunk-5t2h8z2n.js.map +10 -0
  23. package/dist/chunk-5zy3et1m.js +759 -0
  24. package/dist/chunk-5zy3et1m.js.map +19 -0
  25. package/dist/chunk-6wvst7z8.js +125 -0
  26. package/dist/chunk-6wvst7z8.js.map +12 -0
  27. package/dist/chunk-8mm08arm.js +256 -0
  28. package/dist/chunk-8mm08arm.js.map +11 -0
  29. package/dist/chunk-8nv4wwv0.js +19 -0
  30. package/dist/chunk-8nv4wwv0.js.map +9 -0
  31. package/dist/chunk-9cjny9z2.js +19 -0
  32. package/dist/chunk-9cjny9z2.js.map +9 -0
  33. package/dist/chunk-9ggfw78s.js +19 -0
  34. package/dist/chunk-9ggfw78s.js.map +9 -0
  35. package/dist/chunk-9nyyn1hn.js +125 -0
  36. package/dist/chunk-9nyyn1hn.js.map +12 -0
  37. package/dist/chunk-9nzbvp6r.js +19 -0
  38. package/dist/chunk-9nzbvp6r.js.map +9 -0
  39. package/dist/chunk-a0gmbh8e.js +415 -0
  40. package/dist/chunk-a0gmbh8e.js.map +20 -0
  41. package/dist/chunk-acv998mp.js +941 -0
  42. package/dist/chunk-acv998mp.js.map +27 -0
  43. package/dist/chunk-cpjsvven.js +10 -0
  44. package/dist/chunk-cpjsvven.js.map +9 -0
  45. package/dist/chunk-dmrahbs1.js +31467 -0
  46. package/dist/chunk-dmrahbs1.js.map +245 -0
  47. package/dist/chunk-dts6851a.js +137 -0
  48. package/dist/chunk-dts6851a.js.map +10 -0
  49. package/dist/chunk-efd0rm6g.js +69 -0
  50. package/dist/chunk-efd0rm6g.js.map +10 -0
  51. package/dist/chunk-f1kjn6cd.js +16554 -0
  52. package/dist/chunk-f1kjn6cd.js.map +98 -0
  53. package/dist/chunk-f5f6ekgp.js +109 -0
  54. package/dist/chunk-f5f6ekgp.js.map +10 -0
  55. package/dist/chunk-fmewhfh3.js +137 -0
  56. package/dist/chunk-fmewhfh3.js.map +10 -0
  57. package/dist/chunk-fmhrn6cg.js +6382 -0
  58. package/dist/chunk-fmhrn6cg.js.map +109 -0
  59. package/dist/chunk-gh7dzfhb.js +256 -0
  60. package/dist/chunk-gh7dzfhb.js.map +11 -0
  61. package/dist/chunk-gwhtc0fe.js +370 -0
  62. package/dist/chunk-gwhtc0fe.js.map +16 -0
  63. package/dist/chunk-hc7sdwmn.js +449 -0
  64. package/dist/chunk-hc7sdwmn.js.map +17 -0
  65. package/dist/chunk-k4xwb3wp.js +44184 -0
  66. package/dist/chunk-k4xwb3wp.js.map +237 -0
  67. package/dist/chunk-k751yfm6.js +736 -0
  68. package/dist/chunk-k751yfm6.js.map +16 -0
  69. package/dist/chunk-kkc2tvar.js +19 -0
  70. package/dist/chunk-kkc2tvar.js.map +9 -0
  71. package/dist/chunk-kva47mgc.js +10 -0
  72. package/dist/chunk-kva47mgc.js.map +9 -0
  73. package/dist/chunk-nv2j020p.js +45210 -0
  74. package/dist/chunk-nv2j020p.js.map +258 -0
  75. package/dist/chunk-pdj9s41r.js +683 -0
  76. package/dist/chunk-pdj9s41r.js.map +17 -0
  77. package/dist/chunk-ppphsy4t.js +273 -0
  78. package/dist/chunk-ppphsy4t.js.map +10 -0
  79. package/dist/chunk-psmw9zpa.js +941 -0
  80. package/dist/chunk-psmw9zpa.js.map +27 -0
  81. package/dist/chunk-pz31v3ma.js +24 -0
  82. package/dist/chunk-pz31v3ma.js.map +9 -0
  83. package/dist/chunk-qbt0906e.js +1495 -0
  84. package/dist/chunk-qbt0906e.js.map +23 -0
  85. package/dist/chunk-rh3k09h7.js +19 -0
  86. package/dist/chunk-rh3k09h7.js.map +9 -0
  87. package/dist/chunk-saznae7w.js +10 -0
  88. package/dist/chunk-saznae7w.js.map +9 -0
  89. package/dist/chunk-sscqdg1j.js +69 -0
  90. package/dist/chunk-sscqdg1j.js.map +10 -0
  91. package/dist/chunk-stgj6y85.js +835 -0
  92. package/dist/chunk-stgj6y85.js.map +19 -0
  93. package/dist/chunk-t3tqmxyj.js +42 -0
  94. package/dist/chunk-t3tqmxyj.js.map +9 -0
  95. package/dist/chunk-v8ak35zd.js +94 -0
  96. package/dist/chunk-v8ak35zd.js.map +10 -0
  97. package/dist/chunk-w9acw256.js +167 -0
  98. package/dist/chunk-w9acw256.js.map +10 -0
  99. package/dist/chunk-wq60thjn.js +167 -0
  100. package/dist/chunk-wq60thjn.js.map +10 -0
  101. package/dist/chunk-wzkdeb8a.js +736 -0
  102. package/dist/chunk-wzkdeb8a.js.map +16 -0
  103. package/dist/chunk-xxv6j815.js +256 -0
  104. package/dist/chunk-xxv6j815.js.map +11 -0
  105. package/dist/chunk-yjnj35q8.js +1495 -0
  106. package/dist/chunk-yjnj35q8.js.map +23 -0
  107. package/dist/chunk-yvzzrczy.js +45206 -0
  108. package/dist/chunk-yvzzrczy.js.map +258 -0
  109. package/dist/chunk-ywax1akt.js +370 -0
  110. package/dist/chunk-ywax1akt.js.map +16 -0
  111. package/dist/chunk-zakq9pc0.js +4989 -0
  112. package/dist/chunk-zakq9pc0.js.map +65 -0
  113. package/dist/commands/doctor/command.js +1 -1
  114. package/dist/commands/doctor/steps/AdcProjectCheckStep.d.ts +8 -0
  115. package/dist/commands/init/command.js +1 -1
  116. package/dist/commands/logout/command.js +1 -1
  117. package/dist/commands/proxy/command.js +1 -1
  118. package/dist/commands/screens/command.js +2 -2
  119. package/dist/commands/serve/command.js +3 -3
  120. package/dist/commands/site/command.js +1 -1
  121. package/dist/commands/snapshot/command.js +1 -1
  122. package/dist/commands/tool/command.js +1 -1
  123. package/dist/commands/view/command.js +1 -1
  124. package/dist/index.js +4 -4
  125. package/dist/lib/server/AssetGateway.d.ts +12 -0
  126. package/package.json +1 -1
@@ -0,0 +1,370 @@
1
+ import {
2
+ SiteBuilder,
3
+ SiteManifest
4
+ } from "./chunk-k751yfm6.js";
5
+ import {
6
+ require_jsx_dev_runtime
7
+ } from "./chunk-krfqppg2.js";
8
+ import {
9
+ AssetGateway
10
+ } from "./chunk-k4xwb3wp.js";
11
+ import {
12
+ require_lib
13
+ } from "./chunk-abf1r0jh.js";
14
+ import {
15
+ render_default
16
+ } from "./chunk-7y4xzvkz.js";
17
+ import"./chunk-4jwmvjb4.js";
18
+ import {
19
+ fetchWithRetry
20
+ } from "./chunk-6gw9apqb.js";
21
+ import {
22
+ stitch
23
+ } from "./chunk-dmrahbs1.js";
24
+ import {
25
+ pLimit
26
+ } from "./chunk-a5xra9jn.js";
27
+ import"./chunk-nq68kghz.js";
28
+ import"./chunk-q6sv0243.js";
29
+ import"./chunk-3sfn889r.js";
30
+ import {
31
+ exports_external
32
+ } from "./chunk-c6ge431q.js";
33
+ import {
34
+ __toESM
35
+ } from "./chunk-9wyra8hs.js";
36
+
37
+ // src/lib/services/site/SiteService.ts
38
+ var import_fs_extra = __toESM(require_lib(), 1);
39
+ import path from "path";
40
+ class SiteService {
41
+ static toUIScreens(screens) {
42
+ return screens.filter((s) => s.htmlCode && s.htmlCode.downloadUrl).map((s) => ({
43
+ id: s.name,
44
+ title: s.title,
45
+ downloadUrl: s.htmlCode.downloadUrl,
46
+ status: "ignored",
47
+ route: ""
48
+ }));
49
+ }
50
+ static async generateSite(config, htmlContent, assetGateway, outputDir = ".") {
51
+ await import_fs_extra.default.ensureDir(path.join(outputDir, "src/pages"));
52
+ await import_fs_extra.default.ensureDir(path.join(outputDir, "src/layouts"));
53
+ await import_fs_extra.default.ensureDir(path.join(outputDir, "public/assets"));
54
+ const pkgJson = {
55
+ name: "stitch-site",
56
+ type: "module",
57
+ version: "0.0.1",
58
+ scripts: {
59
+ dev: "astro dev",
60
+ start: "astro dev",
61
+ build: "astro build",
62
+ preview: "astro preview",
63
+ astro: "astro"
64
+ },
65
+ dependencies: {
66
+ astro: "^5.0.0"
67
+ }
68
+ };
69
+ await import_fs_extra.default.writeJson(path.join(outputDir, "package.json"), pkgJson, { spaces: 2 });
70
+ const astroConfig = `import { defineConfig } from 'astro/config';
71
+ export default defineConfig({});`;
72
+ await import_fs_extra.default.writeFile(path.join(outputDir, "astro.config.mjs"), astroConfig);
73
+ const layout = `---
74
+ interface Props {
75
+ title: string;
76
+ }
77
+
78
+ const { title } = Astro.props;
79
+ ---
80
+
81
+ <!doctype html>
82
+ <html lang="en">
83
+ <head>
84
+ <meta charset="UTF-8" />
85
+ <meta name="description" content="Astro description" />
86
+ <meta name="viewport" content="width=device-width" />
87
+ <link rel="icon" type="image/svg+xml" href="/favicon.svg" />
88
+ <meta name="generator" content={Astro.generator} />
89
+ <title>{title}</title>
90
+ </head>
91
+ <body>
92
+ <slot />
93
+ </body>
94
+ </html>
95
+ `;
96
+ await import_fs_extra.default.writeFile(path.join(outputDir, "src/layouts/Layout.astro"), layout);
97
+ const limit = pLimit(10);
98
+ const tasks = config.routes.map((route) => limit(async () => {
99
+ if (route.status !== "included")
100
+ return;
101
+ const html = htmlContent.get(route.screenId);
102
+ if (!html) {
103
+ console.warn(`No HTML content found for screen ${route.screenId}`);
104
+ return;
105
+ }
106
+ const { html: rewrittenHtml, assets } = await assetGateway.rewriteHtmlForBuild(html);
107
+ const assetsDir = path.join(outputDir, "public/assets");
108
+ for (const asset of assets) {
109
+ await assetGateway.copyAssetTo(asset.url, path.join(assetsDir, asset.filename));
110
+ }
111
+ let filePath = route.route;
112
+ if (filePath === "/") {
113
+ filePath = "index";
114
+ } else {
115
+ if (filePath.startsWith("/"))
116
+ filePath = filePath.substring(1);
117
+ }
118
+ const fullPath = path.join(outputDir, "src/pages", `${filePath}.astro`);
119
+ await import_fs_extra.default.ensureDir(path.dirname(fullPath));
120
+ await import_fs_extra.default.writeFile(fullPath, rewrittenHtml);
121
+ }));
122
+ await Promise.all(tasks);
123
+ }
124
+ static slugify(text) {
125
+ return text.toString().toLowerCase().replace(/\s+/g, "-").replace(/[^\w\-]+/g, "").replace(/\-\-+/g, "-").replace(/^-+/, "").replace(/-+$/, "");
126
+ }
127
+ }
128
+
129
+ // src/commands/site/utils/suggestRoute.ts
130
+ var HOME_SLUGS = new Set(["home", "landing", "landing-page", "index"]);
131
+ function suggestRoute(title) {
132
+ const slug = title.toLowerCase().replace(/[^a-z0-9\s-]/g, "").trim().replace(/\s+/g, "-").replace(/-+/g, "-");
133
+ return HOME_SLUGS.has(slug) ? "/" : `/${slug}`;
134
+ }
135
+
136
+ // src/commands/site/list-screens/handler.ts
137
+ class ListScreensHandler {
138
+ client;
139
+ constructor(client) {
140
+ this.client = client;
141
+ }
142
+ async execute(input) {
143
+ try {
144
+ const project = this.client.project(input.projectId);
145
+ const sdkScreens = await project.screens();
146
+ const limit = pLimit(3);
147
+ const screens = await Promise.all(sdkScreens.map((s) => limit(async () => {
148
+ const htmlUrl = await s.getHtml().catch(() => null);
149
+ return {
150
+ screenId: s.screenId,
151
+ title: s.title ?? s.screenId,
152
+ suggestedRoute: suggestRoute(s.title ?? s.screenId),
153
+ hasHtml: htmlUrl !== null
154
+ };
155
+ })));
156
+ return { success: true, projectId: input.projectId, screens };
157
+ } catch (e) {
158
+ return {
159
+ success: false,
160
+ error: {
161
+ code: "SCREENS_FETCH_FAILED",
162
+ message: e.message,
163
+ recoverable: false
164
+ }
165
+ };
166
+ }
167
+ }
168
+ }
169
+
170
+ // src/commands/site/list-screens/spec.ts
171
+ var ListScreensInputSchema = exports_external.object({
172
+ projectId: exports_external.string().min(1, "projectId is required")
173
+ });
174
+ var ListScreensErrorCode = exports_external.enum([
175
+ "PROJECT_NOT_FOUND",
176
+ "SCREENS_FETCH_FAILED"
177
+ ]);
178
+
179
+ // src/commands/site/generate/handler.ts
180
+ class GenerateHandler {
181
+ client;
182
+ fetchHtml;
183
+ constructor(client, fetchHtml = fetchWithRetry) {
184
+ this.client = client;
185
+ this.fetchHtml = fetchHtml;
186
+ }
187
+ async execute(input) {
188
+ try {
189
+ const project = this.client.project(input.projectId);
190
+ const sdkScreens = await project.screens();
191
+ const screenMap = new Map(sdkScreens.map((s) => [s.screenId, s]));
192
+ const missingIds = input.routesJson.map((r) => r.screenId).filter((id) => !screenMap.has(id));
193
+ if (missingIds.length > 0) {
194
+ return {
195
+ success: false,
196
+ error: {
197
+ code: "SCREEN_NOT_FOUND",
198
+ message: `Screen IDs not found in project: ${missingIds.join(", ")}`,
199
+ hint: `Run stitch site -p ${input.projectId} --list-screens to see available screen IDs.`,
200
+ recoverable: true
201
+ }
202
+ };
203
+ }
204
+ const limit = pLimit(3);
205
+ const htmlContent = new Map;
206
+ const errors = [];
207
+ await Promise.all(input.routesJson.map((r) => limit(async () => {
208
+ const screen = screenMap.get(r.screenId);
209
+ try {
210
+ const htmlUrl = await screen.getHtml();
211
+ const html = htmlUrl ? await this.fetchHtml(htmlUrl) : "";
212
+ htmlContent.set(r.screenId, html);
213
+ } catch (e) {
214
+ errors.push(`${r.screenId}: ${e.message}`);
215
+ }
216
+ })));
217
+ if (errors.length > 0) {
218
+ return {
219
+ success: false,
220
+ error: {
221
+ code: "HTML_FETCH_FAILED",
222
+ message: `Failed to fetch HTML for screens: ${errors.join("; ")}`,
223
+ recoverable: false
224
+ }
225
+ };
226
+ }
227
+ const config = {
228
+ projectId: input.projectId,
229
+ routes: input.routesJson.map((r) => ({ screenId: r.screenId, route: r.route, status: "included" }))
230
+ };
231
+ const assetGateway = new AssetGateway;
232
+ await SiteService.generateSite(config, htmlContent, assetGateway, input.outputDir);
233
+ return {
234
+ success: true,
235
+ outputDir: input.outputDir,
236
+ pages: input.routesJson.map((r) => ({ screenId: r.screenId, route: r.route }))
237
+ };
238
+ } catch (e) {
239
+ return {
240
+ success: false,
241
+ error: {
242
+ code: "GENERATE_FAILED",
243
+ message: e.message,
244
+ recoverable: false
245
+ }
246
+ };
247
+ }
248
+ }
249
+ }
250
+
251
+ // src/commands/site/generate/spec.ts
252
+ var RouteEntrySchema = exports_external.object({
253
+ screenId: exports_external.string().min(1, "screenId is required"),
254
+ route: exports_external.string().startsWith("/", "route must start with /")
255
+ });
256
+ var RoutesJsonSchema = exports_external.string().transform((str, ctx) => {
257
+ try {
258
+ const parsed = JSON.parse(str);
259
+ const result = exports_external.array(RouteEntrySchema).safeParse(parsed);
260
+ if (!result.success) {
261
+ ctx.addIssue({ code: exports_external.ZodIssueCode.custom, message: result.error.issues[0]?.message ?? "Invalid routes array" });
262
+ return exports_external.NEVER;
263
+ }
264
+ return result.data;
265
+ } catch {
266
+ ctx.addIssue({ code: exports_external.ZodIssueCode.custom, message: "routes must be valid JSON" });
267
+ return exports_external.NEVER;
268
+ }
269
+ });
270
+ var GenerateInputSchema = exports_external.object({
271
+ projectId: exports_external.string().min(1, "projectId is required"),
272
+ routesJson: RoutesJsonSchema,
273
+ outputDir: exports_external.string().default(".")
274
+ });
275
+ var GenerateErrorCode = exports_external.enum([
276
+ "INVALID_ROUTES",
277
+ "SCREEN_NOT_FOUND",
278
+ "HTML_FETCH_FAILED",
279
+ "GENERATE_FAILED"
280
+ ]);
281
+
282
+ // src/commands/site/index.tsx
283
+ var jsx_dev_runtime = __toESM(require_jsx_dev_runtime(), 1);
284
+
285
+ class SiteCommandHandler {
286
+ client;
287
+ constructor(client = stitch) {
288
+ this.client = client;
289
+ }
290
+ async execute(options) {
291
+ if (options.listScreens) {
292
+ const input = ListScreensInputSchema.safeParse({ projectId: options.projectId });
293
+ if (!input.success) {
294
+ console.log(JSON.stringify({ success: false, error: { code: "INVALID_INPUT", message: input.error.issues[0]?.message } }, null, 2));
295
+ return;
296
+ }
297
+ const result = await new ListScreensHandler(this.client).execute(input.data);
298
+ console.log(JSON.stringify(result, null, 2));
299
+ return;
300
+ }
301
+ if (options.routes !== undefined) {
302
+ const input = GenerateInputSchema.safeParse({
303
+ projectId: options.projectId,
304
+ routesJson: options.routes,
305
+ outputDir: options.outputDir
306
+ });
307
+ if (!input.success) {
308
+ console.log(JSON.stringify({ success: false, error: { code: "INVALID_INPUT", message: input.error.issues[0]?.message } }, null, 2));
309
+ return;
310
+ }
311
+ const result = await new GenerateHandler(this.client).execute(input.data);
312
+ console.log(JSON.stringify(result, null, 2));
313
+ return;
314
+ }
315
+ if (options.export) {
316
+ const project = this.client.project(options.projectId);
317
+ const sdkScreens = await project.screens();
318
+ const uiScreens = await Promise.all(sdkScreens.map(async (s) => ({
319
+ id: s.screenId,
320
+ title: s.title ?? s.screenId,
321
+ status: "ignored",
322
+ route: "",
323
+ downloadUrl: await s.getHtml().catch(() => null)
324
+ })));
325
+ const validScreens = uiScreens.filter((s) => !!s.downloadUrl);
326
+ const siteManifest = new SiteManifest(options.projectId);
327
+ const saved = await siteManifest.load();
328
+ for (const screen of validScreens) {
329
+ const state = saved.get(screen.id);
330
+ if (state?.status)
331
+ screen.status = state.status;
332
+ if (state?.route)
333
+ screen.route = state.route;
334
+ }
335
+ const included = validScreens.filter((s) => s.status === "included");
336
+ const exportData = {
337
+ projectId: options.projectId,
338
+ routes: included.map((s) => ({
339
+ screenId: s.id,
340
+ route: s.route
341
+ }))
342
+ };
343
+ console.log(JSON.stringify(exportData, null, 2));
344
+ return;
345
+ }
346
+ let resultConfig = null;
347
+ let resultHtml;
348
+ const { waitUntilExit } = render_default(/* @__PURE__ */ jsx_dev_runtime.jsxDEV(SiteBuilder, {
349
+ projectId: options.projectId,
350
+ client: this.client,
351
+ onExit: (config, html) => {
352
+ resultConfig = config;
353
+ resultHtml = html;
354
+ }
355
+ }, undefined, false, undefined, this));
356
+ await waitUntilExit();
357
+ if (resultConfig && resultHtml) {
358
+ console.log("Generating site...");
359
+ const assetGateway = new AssetGateway;
360
+ const outputDir = options.outputDir || ".";
361
+ await SiteService.generateSite(resultConfig, resultHtml, assetGateway, outputDir);
362
+ console.log("Site generated successfully!");
363
+ } else {}
364
+ }
365
+ }
366
+ export {
367
+ SiteCommandHandler
368
+ };
369
+
370
+ //# debugId=38734F280B97272E64756E2164756E21
@@ -0,0 +1,16 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/lib/services/site/SiteService.ts", "../src/commands/site/utils/suggestRoute.ts", "../src/commands/site/list-screens/handler.ts", "../src/commands/site/list-screens/spec.ts", "../src/commands/site/generate/handler.ts", "../src/commands/site/generate/spec.ts", "../src/commands/site/index.tsx"],
4
+ "sourcesContent": [
5
+ "import type { RemoteScreen, SiteConfig, IAssetGateway, UIScreen } from './types.js';\nimport fs from 'fs-extra';\nimport path from 'path';\nimport pLimit from 'p-limit';\n\nexport class SiteService {\n static toUIScreens(screens: RemoteScreen[]): UIScreen[] {\n return screens\n .filter((s) => s.htmlCode && s.htmlCode.downloadUrl)\n .map((s) => ({\n id: s.name,\n title: s.title,\n downloadUrl: s.htmlCode!.downloadUrl!,\n status: 'ignored',\n route: '',\n }));\n }\n\n static async generateSite(\n config: SiteConfig,\n htmlContent: Map<string, string>,\n assetGateway: IAssetGateway,\n outputDir: string = '.'\n ): Promise<void> {\n // Scaffold\n await fs.ensureDir(path.join(outputDir, 'src/pages'));\n await fs.ensureDir(path.join(outputDir, 'src/layouts'));\n await fs.ensureDir(path.join(outputDir, 'public/assets'));\n\n // package.json\n const pkgJson = {\n name: \"stitch-site\",\n type: \"module\",\n version: \"0.0.1\",\n scripts: {\n \"dev\": \"astro dev\",\n \"start\": \"astro dev\",\n \"build\": \"astro build\",\n \"preview\": \"astro preview\",\n \"astro\": \"astro\"\n },\n dependencies: {\n \"astro\": \"^5.0.0\"\n }\n };\n await fs.writeJson(path.join(outputDir, 'package.json'), pkgJson, { spaces: 2 });\n\n // astro.config.mjs\n const astroConfig = `import { defineConfig } from 'astro/config';\nexport default defineConfig({});`;\n await fs.writeFile(path.join(outputDir, 'astro.config.mjs'), astroConfig);\n\n // src/layouts/Layout.astro\n const layout = `---\ninterface Props {\n\ttitle: string;\n}\n\nconst { title } = Astro.props;\n---\n\n<!doctype html>\n<html lang=\"en\">\n\t<head>\n\t\t<meta charset=\"UTF-8\" />\n\t\t<meta name=\"description\" content=\"Astro description\" />\n\t\t<meta name=\"viewport\" content=\"width=device-width\" />\n\t\t<link rel=\"icon\" type=\"image/svg+xml\" href=\"/favicon.svg\" />\n\t\t<meta name=\"generator\" content={Astro.generator} />\n\t\t<title>{title}</title>\n\t</head>\n\t<body>\n\t\t<slot />\n\t</body>\n</html>\n`;\n await fs.writeFile(path.join(outputDir, 'src/layouts/Layout.astro'), layout);\n\n // Process routes\n const limit = pLimit(10);\n const tasks = config.routes.map((route) =>\n limit(async () => {\n if (route.status !== 'included') return;\n\n const html = htmlContent.get(route.screenId);\n if (!html) {\n console.warn(`No HTML content found for screen ${route.screenId}`);\n return;\n }\n\n // Rewrite\n const { html: rewrittenHtml, assets } = await assetGateway.rewriteHtmlForBuild(html);\n\n // Copy assets\n const assetsDir = path.join(outputDir, 'public/assets');\n for (const asset of assets) {\n await assetGateway.copyAssetTo(asset.url, path.join(assetsDir, asset.filename));\n }\n\n let filePath = route.route;\n if (filePath === '/') {\n filePath = 'index';\n } else {\n // Remove leading slash\n if (filePath.startsWith('/')) filePath = filePath.substring(1);\n }\n\n const fullPath = path.join(outputDir, 'src/pages', `${filePath}.astro`);\n await fs.ensureDir(path.dirname(fullPath));\n await fs.writeFile(fullPath, rewrittenHtml);\n })\n );\n\n await Promise.all(tasks);\n }\n\n static slugify(text: string): string {\n return text.toString().toLowerCase()\n .replace(/\\s+/g, '-')\n .replace(/[^\\w\\-]+/g, '')\n .replace(/\\-\\-+/g, '-')\n .replace(/^-+/, '')\n .replace(/-+$/, '');\n }\n}\n",
6
+ "const HOME_SLUGS = new Set(['home', 'landing', 'landing-page', 'index']);\n\nexport function suggestRoute(title: string): string {\n const slug = title\n .toLowerCase()\n .replace(/[^a-z0-9\\s-]/g, '')\n .trim()\n .replace(/\\s+/g, '-')\n .replace(/-+/g, '-');\n return HOME_SLUGS.has(slug) ? '/' : `/${slug}`;\n}\n",
7
+ "import type { Stitch } from '@google/stitch-sdk';\nimport pLimit from 'p-limit';\nimport type { ListScreensSpec, ListScreensInput, ListScreensResult } from './spec.js';\nimport { suggestRoute } from '../utils/suggestRoute.js';\n\nexport class ListScreensHandler implements ListScreensSpec {\n constructor(private readonly client: Stitch) {}\n\n async execute(input: ListScreensInput): Promise<ListScreensResult> {\n try {\n const project = this.client.project(input.projectId);\n const sdkScreens = await project.screens();\n\n const limit = pLimit(3);\n const screens = await Promise.all(\n sdkScreens.map((s: any) => limit(async () => {\n const htmlUrl = await s.getHtml().catch(() => null);\n return {\n screenId: s.screenId,\n title: s.title ?? s.screenId,\n suggestedRoute: suggestRoute(s.title ?? s.screenId),\n hasHtml: htmlUrl !== null,\n };\n }))\n );\n\n return { success: true, projectId: input.projectId, screens };\n } catch (e: any) {\n return {\n success: false,\n error: {\n code: 'SCREENS_FETCH_FAILED',\n message: e.message,\n recoverable: false,\n },\n };\n }\n }\n}\n",
8
+ "import { z } from 'zod';\n\n// 1. INPUT\nexport const ListScreensInputSchema = z.object({\n projectId: z.string().min(1, 'projectId is required'),\n});\nexport type ListScreensInput = z.infer<typeof ListScreensInputSchema>;\n\n// 2. ERROR CODES\nexport const ListScreensErrorCode = z.enum([\n 'PROJECT_NOT_FOUND',\n 'SCREENS_FETCH_FAILED',\n]);\nexport type ListScreensErrorCode = z.infer<typeof ListScreensErrorCode>;\n\n// 3. RESULT\nexport type ListScreensSuccess = {\n success: true;\n projectId: string;\n screens: Array<{\n screenId: string;\n title: string;\n suggestedRoute: string;\n hasHtml: boolean;\n }>;\n};\n\nexport type ListScreensFailure = {\n success: false;\n error: {\n code: ListScreensErrorCode;\n message: string;\n recoverable: boolean;\n };\n};\n\nexport type ListScreensResult = ListScreensSuccess | ListScreensFailure;\n\n// 4. INTERFACE\nexport interface ListScreensSpec {\n execute(input: ListScreensInput): Promise<ListScreensResult>;\n}\n",
9
+ "import type { Stitch } from '@google/stitch-sdk';\nimport pLimit from 'p-limit';\nimport type { GenerateSpec, GenerateInput, GenerateResult } from './spec.js';\nimport { SiteService } from '../../../lib/services/site/SiteService.js';\nimport { AssetGateway } from '../../../lib/server/AssetGateway.js';\nimport { fetchWithRetry } from '../utils/fetchWithRetry.js';\n\nexport class GenerateHandler implements GenerateSpec {\n constructor(\n private readonly client: Stitch,\n private readonly fetchHtml: (url: string) => Promise<string> = fetchWithRetry,\n ) {}\n\n async execute(input: GenerateInput): Promise<GenerateResult> {\n try {\n const project = this.client.project(input.projectId);\n const sdkScreens = await project.screens();\n const screenMap = new Map(sdkScreens.map((s: any) => [s.screenId, s]));\n\n // Validate all requested screenIds exist\n const missingIds = input.routesJson\n .map(r => r.screenId)\n .filter(id => !screenMap.has(id));\n\n if (missingIds.length > 0) {\n return {\n success: false,\n error: {\n code: 'SCREEN_NOT_FOUND',\n message: `Screen IDs not found in project: ${missingIds.join(', ')}`,\n hint: `Run stitch site -p ${input.projectId} --list-screens to see available screen IDs.`,\n recoverable: true,\n },\n };\n }\n\n // Fetch HTML for each screen\n const limit = pLimit(3);\n const htmlContent = new Map<string, string>();\n const errors: string[] = [];\n\n await Promise.all(\n input.routesJson.map(r => limit(async () => {\n const screen = screenMap.get(r.screenId)!;\n try {\n const htmlUrl = await screen.getHtml();\n const html = htmlUrl ? await this.fetchHtml(htmlUrl) : '';\n htmlContent.set(r.screenId, html);\n } catch (e: any) {\n errors.push(`${r.screenId}: ${e.message}`);\n }\n }))\n );\n\n if (errors.length > 0) {\n return {\n success: false,\n error: {\n code: 'HTML_FETCH_FAILED',\n message: `Failed to fetch HTML for screens: ${errors.join('; ')}`,\n recoverable: false,\n },\n };\n }\n\n const config = {\n projectId: input.projectId,\n routes: input.routesJson.map(r => ({ screenId: r.screenId, route: r.route, status: 'included' as const })),\n };\n\n const assetGateway = new AssetGateway();\n await SiteService.generateSite(config, htmlContent, assetGateway, input.outputDir);\n\n return {\n success: true,\n outputDir: input.outputDir,\n pages: input.routesJson.map(r => ({ screenId: r.screenId, route: r.route })),\n };\n } catch (e: any) {\n return {\n success: false,\n error: {\n code: 'GENERATE_FAILED',\n message: e.message,\n recoverable: false,\n },\n };\n }\n }\n}\n",
10
+ "import { z } from 'zod';\n\n// 1. VALIDATION HELPERS\nconst RouteEntrySchema = z.object({\n screenId: z.string().min(1, 'screenId is required'),\n route: z.string().startsWith('/', 'route must start with /'),\n});\n\nconst RoutesJsonSchema = z.string().transform((str, ctx) => {\n try {\n const parsed = JSON.parse(str);\n const result = z.array(RouteEntrySchema).safeParse(parsed);\n if (!result.success) {\n ctx.addIssue({ code: z.ZodIssueCode.custom, message: result.error.issues[0]?.message ?? 'Invalid routes array' });\n return z.NEVER;\n }\n return result.data;\n } catch {\n ctx.addIssue({ code: z.ZodIssueCode.custom, message: 'routes must be valid JSON' });\n return z.NEVER;\n }\n});\n\n// 2. INPUT\nexport const GenerateInputSchema = z.object({\n projectId: z.string().min(1, 'projectId is required'),\n routesJson: RoutesJsonSchema,\n outputDir: z.string().default('.'),\n});\nexport type GenerateInput = z.infer<typeof GenerateInputSchema>;\n\n// 3. ERROR CODES\nexport const GenerateErrorCode = z.enum([\n 'INVALID_ROUTES',\n 'SCREEN_NOT_FOUND',\n 'HTML_FETCH_FAILED',\n 'GENERATE_FAILED',\n]);\nexport type GenerateErrorCode = z.infer<typeof GenerateErrorCode>;\n\n// 4. RESULT\nexport type GenerateSuccess = {\n success: true;\n outputDir: string;\n pages: Array<{ screenId: string; route: string }>;\n};\n\nexport type GenerateFailure = {\n success: false;\n error: {\n code: GenerateErrorCode;\n message: string;\n hint?: string;\n recoverable: boolean;\n };\n};\n\nexport type GenerateResult = GenerateSuccess | GenerateFailure;\n\n// 5. INTERFACE\nexport interface GenerateSpec {\n execute(input: GenerateInput): Promise<GenerateResult>;\n}\n",
11
+ "import React from 'react';\nimport { render } from 'ink';\nimport { stitch } from '@google/stitch-sdk';\nimport type { Stitch } from '@google/stitch-sdk';\nimport { SiteBuilder } from './ui/SiteBuilder.js';\nimport { SiteService } from '../../lib/services/site/SiteService.js';\nimport { AssetGateway } from '../../lib/server/AssetGateway.js';\nimport { SiteManifest } from './utils/SiteManifest.js';\nimport { ListScreensHandler } from './list-screens/handler.js';\nimport { ListScreensInputSchema } from './list-screens/spec.js';\nimport { GenerateHandler } from './generate/handler.js';\nimport { GenerateInputSchema } from './generate/spec.js';\nimport type { SiteConfig, UIScreen } from '../../lib/services/site/types.js';\n\ninterface SiteCommandOptions {\n projectId: string;\n outputDir?: string;\n export?: boolean;\n listScreens?: boolean;\n routes?: string;\n}\n\nexport class SiteCommandHandler {\n constructor(private client: Stitch = stitch) {}\n\n async execute(options: SiteCommandOptions) {\n if (options.listScreens) {\n const input = ListScreensInputSchema.safeParse({ projectId: options.projectId });\n if (!input.success) {\n console.log(JSON.stringify({ success: false, error: { code: 'INVALID_INPUT', message: input.error.issues[0]?.message } }, null, 2));\n return;\n }\n const result = await new ListScreensHandler(this.client).execute(input.data);\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n\n if (options.routes !== undefined) {\n const input = GenerateInputSchema.safeParse({\n projectId: options.projectId,\n routesJson: options.routes,\n outputDir: options.outputDir,\n });\n if (!input.success) {\n console.log(JSON.stringify({ success: false, error: { code: 'INVALID_INPUT', message: input.error.issues[0]?.message } }, null, 2));\n return;\n }\n const result = await new GenerateHandler(this.client).execute(input.data);\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n\n if (options.export) {\n const project = this.client.project(options.projectId);\n const sdkScreens = await project.screens();\n\n const uiScreens = await Promise.all(\n sdkScreens.map(async (s: any) => ({\n id: s.screenId,\n title: s.title ?? s.screenId,\n status: 'ignored' as const,\n route: '',\n downloadUrl: await s.getHtml().catch(() => null)\n }))\n ) as UIScreen[];\n\n const validScreens = uiScreens.filter(s => !!s.downloadUrl);\n\n const siteManifest = new SiteManifest(options.projectId);\n const saved = await siteManifest.load();\n for (const screen of validScreens) {\n const state = saved.get(screen.id);\n if (state?.status) screen.status = state.status;\n if (state?.route) screen.route = state.route;\n }\n\n const included = validScreens.filter(s => s.status === 'included');\n const exportData = {\n projectId: options.projectId,\n routes: included.map(s => ({\n screenId: s.id,\n route: s.route,\n })),\n };\n console.log(JSON.stringify(exportData, null, 2));\n return;\n }\n\n let resultConfig: SiteConfig | null = null;\n let resultHtml: Map<string, string> | undefined;\n\n const { waitUntilExit } = render(\n <SiteBuilder\n projectId={options.projectId}\n client={this.client}\n onExit={(config, html) => {\n resultConfig = config;\n resultHtml = html;\n }}\n />\n );\n\n await waitUntilExit();\n\n if (resultConfig && resultHtml) {\n console.log('Generating site...');\n const assetGateway = new AssetGateway();\n const outputDir = options.outputDir || '.';\n\n await SiteService.generateSite(\n resultConfig,\n resultHtml,\n assetGateway,\n outputDir\n );\n console.log('Site generated successfully!');\n } else {\n // console.log('Cancelled.');\n }\n }\n}\n"
12
+ ],
13
+ "mappings": "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",
14
+ "debugId": "38734F280B97272E64756E2164756E21",
15
+ "names": []
16
+ }