@_davideast/stitch-mcp 0.5.0 → 0.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (258) hide show
  1. package/dist/{chunk-hb3c6f6a.js → chunk-001yk06v.js} +2 -2
  2. package/dist/chunk-0cd2xak4.js +31447 -0
  3. package/dist/chunk-0cd2xak4.js.map +245 -0
  4. package/dist/{chunk-9tvppjaf.js → chunk-13mqag7n.js} +8 -10
  5. package/dist/{chunk-9tvppjaf.js.map → chunk-13mqag7n.js.map} +2 -2
  6. package/dist/chunk-1dcffh2w.js +1481 -0
  7. package/dist/chunk-1dcffh2w.js.map +23 -0
  8. package/dist/{chunk-985f11w6.js → chunk-26cgk4dt.js} +6 -8
  9. package/dist/{chunk-8yrtq2qs.js.map → chunk-26cgk4dt.js.map} +1 -1
  10. package/dist/chunk-2kg77g4q.js +167 -0
  11. package/dist/chunk-2kg77g4q.js.map +10 -0
  12. package/dist/chunk-34w2wfyp.js +68 -0
  13. package/dist/chunk-34w2wfyp.js.map +10 -0
  14. package/dist/chunk-44tn9dxb.js +19 -0
  15. package/dist/{chunk-985f11w6.js.map → chunk-44tn9dxb.js.map} +1 -1
  16. package/dist/chunk-5204d23a.js +24 -0
  17. package/dist/{chunk-ezmw2j8c.js.map → chunk-5204d23a.js.map} +1 -1
  18. package/dist/{chunk-mv9ssgmx.js → chunk-54wv5ptt.js} +5 -5
  19. package/dist/{chunk-mv9ssgmx.js.map → chunk-54wv5ptt.js.map} +2 -2
  20. package/dist/chunk-5dghg77b.js +16970 -0
  21. package/dist/chunk-5dghg77b.js.map +26 -0
  22. package/dist/{chunk-r2sg2nxa.js → chunk-5f2htt6r.js} +6 -7
  23. package/dist/chunk-5f2htt6r.js.map +9 -0
  24. package/dist/chunk-6gw9apqb.js +20 -0
  25. package/dist/chunk-6gw9apqb.js.map +10 -0
  26. package/dist/chunk-7bt2055x.js +39 -0
  27. package/dist/chunk-7bt2055x.js.map +10 -0
  28. package/dist/chunk-7egq85x5.js +273 -0
  29. package/dist/chunk-7egq85x5.js.map +10 -0
  30. package/dist/chunk-7pf2vfq9.js +69 -0
  31. package/dist/chunk-7pf2vfq9.js.map +10 -0
  32. package/dist/{chunk-q1nd6g0y.js → chunk-7rrhk07q.js} +76 -53
  33. package/dist/chunk-7rrhk07q.js.map +20 -0
  34. package/dist/{chunk-7xh1y383.js → chunk-7xsar3mr.js} +2 -2
  35. package/dist/{chunk-7xh1y383.js.map → chunk-7xsar3mr.js.map} +1 -1
  36. package/dist/chunk-7y4xzvkz.js +19132 -0
  37. package/dist/chunk-7y4xzvkz.js.map +115 -0
  38. package/dist/chunk-7zy0vdv5.js +761 -0
  39. package/dist/chunk-7zy0vdv5.js.map +18 -0
  40. package/dist/chunk-8rt3pp6g.js +256 -0
  41. package/dist/{chunk-jy2d17pr.js.map → chunk-8rt3pp6g.js.map} +3 -3
  42. package/dist/chunk-98trrxk2.js +40 -0
  43. package/dist/chunk-98trrxk2.js.map +10 -0
  44. package/dist/chunk-a1mk24q9.js +31326 -0
  45. package/dist/chunk-a1mk24q9.js.map +245 -0
  46. package/dist/chunk-a5xra9jn.js +159 -0
  47. package/dist/chunk-a5xra9jn.js.map +11 -0
  48. package/dist/chunk-abf1r0jh.js +2118 -0
  49. package/dist/chunk-abf1r0jh.js.map +44 -0
  50. package/dist/{chunk-25wakzyb.js → chunk-ahw5kfbr.js} +5 -5
  51. package/dist/chunk-akd997ec.js +11061 -0
  52. package/dist/chunk-akd997ec.js.map +238 -0
  53. package/dist/chunk-by28t333.js +19 -0
  54. package/dist/chunk-by28t333.js.map +9 -0
  55. package/dist/{chunk-2k7n0w2x.js → chunk-c6ge431q.js} +2 -2
  56. package/dist/{chunk-2k7n0w2x.js.map → chunk-c6ge431q.js.map} +1 -1
  57. package/dist/{chunk-ycfxp056.js → chunk-cnmspfhx.js} +7 -11
  58. package/dist/chunk-cnmspfhx.js.map +17 -0
  59. package/dist/chunk-cwqdka8y.js +6382 -0
  60. package/dist/chunk-cwqdka8y.js.map +109 -0
  61. package/dist/chunk-dffwrtn3.js +673 -0
  62. package/dist/chunk-dffwrtn3.js.map +17 -0
  63. package/dist/chunk-dyp9t5wf.js +44109 -0
  64. package/dist/chunk-dyp9t5wf.js.map +237 -0
  65. package/dist/chunk-e9881zy4.js +39 -0
  66. package/dist/chunk-e9881zy4.js.map +10 -0
  67. package/dist/chunk-ezs0qz0b.js +24 -0
  68. package/dist/chunk-ezs0qz0b.js.map +9 -0
  69. package/dist/chunk-f6cq8r7x.js +736 -0
  70. package/dist/chunk-f6cq8r7x.js.map +16 -0
  71. package/dist/{chunk-45wx7tn7.js → chunk-gwnmywrp.js} +2 -2
  72. package/dist/chunk-gz78f003.js +94 -0
  73. package/dist/chunk-gz78f003.js.map +10 -0
  74. package/dist/chunk-j0y94q2c.js +10 -0
  75. package/dist/{chunk-nthabjd9.js → chunk-jyem6j6k.js} +1848 -3
  76. package/dist/chunk-jyem6j6k.js.map +65 -0
  77. package/dist/chunk-kad4d9sf.js +11 -0
  78. package/dist/chunk-kad4d9sf.js.map +9 -0
  79. package/dist/{chunk-wz8d5vzb.js → chunk-krfqppg2.js} +32 -2
  80. package/dist/{chunk-wz8d5vzb.js.map → chunk-krfqppg2.js.map} +5 -4
  81. package/dist/chunk-kw62yeqn.js +124 -0
  82. package/dist/chunk-kw62yeqn.js.map +12 -0
  83. package/dist/chunk-mbt1wx7n.js +43 -0
  84. package/dist/chunk-mbt1wx7n.js.map +10 -0
  85. package/dist/chunk-nzv6abbc.js +22 -0
  86. package/dist/chunk-nzv6abbc.js.map +9 -0
  87. package/dist/{chunk-cwkb2wbe.js → chunk-pjpdhh0f.js} +27 -24
  88. package/dist/chunk-pjpdhh0f.js.map +16 -0
  89. package/dist/chunk-py8fhw0k.js +941 -0
  90. package/dist/chunk-py8fhw0k.js.map +27 -0
  91. package/dist/chunk-q6sv0243.js +93 -0
  92. package/dist/chunk-q6sv0243.js.map +13 -0
  93. package/dist/chunk-r8n5m3xq.js +19 -0
  94. package/dist/chunk-r8n5m3xq.js.map +9 -0
  95. package/dist/{chunk-nxpzt33t.js → chunk-rcwtjara.js} +8 -13
  96. package/dist/chunk-rcwtjara.js.map +10 -0
  97. package/dist/{chunk-t85nbjjb.js → chunk-rfrcdsfc.js} +5 -9
  98. package/dist/chunk-rfrcdsfc.js.map +10 -0
  99. package/dist/chunk-rj2gqxxb.js +415 -0
  100. package/dist/chunk-rj2gqxxb.js.map +20 -0
  101. package/dist/{chunk-v7117ywx.js → chunk-rvq1vb70.js} +5 -7
  102. package/dist/{chunk-v7117ywx.js.map → chunk-rvq1vb70.js.map} +2 -2
  103. package/dist/chunk-smvqara3.js +370 -0
  104. package/dist/chunk-smvqara3.js.map +16 -0
  105. package/dist/{chunk-pfyjtfex.js → chunk-sp8zjpbf.js} +7 -12
  106. package/dist/chunk-sp8zjpbf.js.map +10 -0
  107. package/dist/{chunk-48d17n29.js → chunk-ssbg48ec.js} +1 -1
  108. package/dist/chunk-ssbg48ec.js.map +9 -0
  109. package/dist/chunk-st7q66e5.js +109 -0
  110. package/dist/chunk-st7q66e5.js.map +10 -0
  111. package/dist/{chunk-sdp429xd.js → chunk-sw7h7asn.js} +32 -8
  112. package/dist/chunk-sw7h7asn.js.map +27 -0
  113. package/dist/chunk-t092ehvp.js +50 -0
  114. package/dist/chunk-t092ehvp.js.map +9 -0
  115. package/dist/{chunk-2cetsfw4.js → chunk-t0xqfse1.js} +50 -9
  116. package/dist/{chunk-2cetsfw4.js.map → chunk-t0xqfse1.js.map} +8 -3
  117. package/dist/chunk-v1t5vys5.js +124 -0
  118. package/dist/chunk-v1t5vys5.js.map +12 -0
  119. package/dist/chunk-v78rg840.js +137 -0
  120. package/dist/chunk-v78rg840.js.map +10 -0
  121. package/dist/chunk-v7xskyzm.js +19 -0
  122. package/dist/chunk-v7xskyzm.js.map +9 -0
  123. package/dist/{chunk-jy2d17pr.js → chunk-vjshqjmh.js} +12 -8
  124. package/dist/chunk-vjshqjmh.js.map +11 -0
  125. package/dist/chunk-w8075wyx.js +40 -0
  126. package/dist/chunk-w8075wyx.js.map +10 -0
  127. package/dist/chunk-wn8mek6a.js +189 -0
  128. package/dist/chunk-wn8mek6a.js.map +11 -0
  129. package/dist/{chunk-2kyqsrg2.js → chunk-y447ymks.js} +364 -3
  130. package/dist/chunk-y447ymks.js.map +18 -0
  131. package/dist/chunk-yej34vkc.js +247 -0
  132. package/dist/chunk-yej34vkc.js.map +14 -0
  133. package/dist/commands/doctor/command.js +2 -2
  134. package/dist/commands/init/command.js +2 -2
  135. package/dist/commands/logout/command.js +2 -2
  136. package/dist/commands/proxy/command.js +4 -5
  137. package/dist/commands/proxy/command.js.map +3 -3
  138. package/dist/commands/proxy/handler.d.ts +27 -5
  139. package/dist/commands/registry.d.ts +2 -0
  140. package/dist/commands/screens/ScreensView.d.ts +1 -3
  141. package/dist/commands/screens/command.js +8 -10
  142. package/dist/commands/screens/command.js.map +3 -3
  143. package/dist/commands/screens/handler.d.ts +5 -6
  144. package/dist/commands/serve/command.js +60 -10
  145. package/dist/commands/serve/command.js.map +7 -5
  146. package/dist/commands/serve/handler.d.ts +6 -21
  147. package/dist/commands/serve/json-server/handler.d.ts +8 -0
  148. package/dist/commands/serve/json-server/spec.d.ts +32 -0
  149. package/dist/commands/serve/list-screens/handler.d.ts +7 -0
  150. package/dist/commands/serve/list-screens/spec.d.ts +33 -0
  151. package/dist/commands/serve/spec.d.ts +30 -0
  152. package/dist/commands/site/command.js +12 -6
  153. package/dist/commands/site/command.js.map +4 -4
  154. package/dist/commands/site/generate/handler.d.ts +8 -0
  155. package/dist/commands/site/generate/spec.d.ts +44 -0
  156. package/dist/commands/site/hooks/useProjectHydration.d.ts +2 -2
  157. package/dist/commands/site/index.d.ts +5 -3
  158. package/dist/commands/site/list-screens/handler.d.ts +7 -0
  159. package/dist/commands/site/list-screens/spec.d.ts +33 -0
  160. package/dist/commands/site/spec.d.ts +6 -0
  161. package/dist/commands/site/ui/SiteBuilder.d.ts +2 -2
  162. package/dist/commands/site/utils/fetchWithRetry.d.ts +10 -0
  163. package/dist/commands/site/utils/suggestRoute.d.ts +1 -0
  164. package/dist/commands/snapshot/command.js +2 -2
  165. package/dist/commands/tool/command.js +2 -2
  166. package/dist/commands/tool/command.js.map +2 -2
  167. package/dist/commands/tool/context.d.ts +3 -2
  168. package/dist/commands/tool/handler.d.ts +9 -10
  169. package/dist/commands/tool/spec.d.ts +3 -2
  170. package/dist/commands/view/command.js +2 -2
  171. package/dist/index.js +11 -13
  172. package/dist/index.js.map +1 -1
  173. package/dist/platform/browser.d.ts +8 -0
  174. package/dist/services/mcp-client/client.d.ts +5 -0
  175. package/dist/services/mcp-client/spec.d.ts +6 -6
  176. package/dist/services/proxy/spec.d.ts +3 -3
  177. package/dist/services/stitch-sdk/MockStitchSDK.d.ts +18 -0
  178. package/dist/services/view/handler.d.ts +3 -3
  179. package/dist/ui/copy-behaviors/index.d.ts +8 -0
  180. package/dist/ui/navigation-behaviors/index.d.ts +34 -0
  181. package/dist/ui/serve-behaviors/index.d.ts +7 -0
  182. package/package.json +2 -1
  183. package/dist/chunk-2fcdwvrm.js +0 -54
  184. package/dist/chunk-2fcdwvrm.js.map +0 -10
  185. package/dist/chunk-2kyqsrg2.js.map +0 -10
  186. package/dist/chunk-8yrtq2qs.js +0 -18
  187. package/dist/chunk-cwkb2wbe.js.map +0 -16
  188. package/dist/chunk-djhzzcgj.js +0 -362
  189. package/dist/chunk-djhzzcgj.js.map +0 -13
  190. package/dist/chunk-ezmw2j8c.js +0 -14
  191. package/dist/chunk-fwb4fnkp.js +0 -31
  192. package/dist/chunk-fwb4fnkp.js.map +0 -10
  193. package/dist/chunk-h18jrqed.js +0 -9517
  194. package/dist/chunk-h18jrqed.js.map +0 -99
  195. package/dist/chunk-knbnsf6s.js +0 -92
  196. package/dist/chunk-knbnsf6s.js.map +0 -10
  197. package/dist/chunk-nthabjd9.js.map +0 -34
  198. package/dist/chunk-nxpzt33t.js.map +0 -10
  199. package/dist/chunk-pfyjtfex.js.map +0 -10
  200. package/dist/chunk-q1nd6g0y.js.map +0 -20
  201. package/dist/chunk-q4js8r0z.js +0 -4708
  202. package/dist/chunk-q4js8r0z.js.map +0 -29
  203. package/dist/chunk-qv44tmn6.js +0 -289
  204. package/dist/chunk-qv44tmn6.js.map +0 -13
  205. package/dist/chunk-r2sg2nxa.js.map +0 -9
  206. package/dist/chunk-rpxnm86e.js +0 -372
  207. package/dist/chunk-rpxnm86e.js.map +0 -17
  208. package/dist/chunk-sdp429xd.js.map +0 -24
  209. package/dist/chunk-t85nbjjb.js.map +0 -10
  210. package/dist/chunk-wa64nz8b.js +0 -47
  211. package/dist/chunk-wa64nz8b.js.map +0 -10
  212. package/dist/chunk-ycfxp056.js.map +0 -17
  213. package/dist/chunk-z9d2xc83.js +0 -3256
  214. package/dist/chunk-z9d2xc83.js.map +0 -84
  215. package/dist/services/config/handler.d.ts +0 -12
  216. package/dist/services/config/spec.d.ts +0 -82
  217. package/dist/src/cli.d.ts +0 -1
  218. package/dist/src/commands/doctor/handler.d.ts +0 -9
  219. package/dist/src/commands/doctor/handler.test.d.ts +0 -1
  220. package/dist/src/commands/doctor/spec.d.ts +0 -130
  221. package/dist/src/commands/doctor/spec.test.d.ts +0 -1
  222. package/dist/src/commands/init/handler.d.ts +0 -17
  223. package/dist/src/commands/init/handler.test.d.ts +0 -1
  224. package/dist/src/commands/init/spec.d.ts +0 -88
  225. package/dist/src/commands/init/spec.test.d.ts +0 -1
  226. package/dist/src/commands/proxy/handler.d.ts +0 -7
  227. package/dist/src/commands/proxy/handler.test.d.ts +0 -1
  228. package/dist/src/index.d.ts +0 -13
  229. package/dist/src/platform/detector.d.ts +0 -29
  230. package/dist/src/platform/paths.d.ts +0 -20
  231. package/dist/src/platform/shell.d.ts +0 -26
  232. package/dist/src/services/gcloud/handler.d.ts +0 -48
  233. package/dist/src/services/gcloud/handler.test.d.ts +0 -1
  234. package/dist/src/services/gcloud/spec.d.ts +0 -405
  235. package/dist/src/services/mcp-config/handler.d.ts +0 -12
  236. package/dist/src/services/mcp-config/handler.test.d.ts +0 -1
  237. package/dist/src/services/mcp-config/spec.d.ts +0 -88
  238. package/dist/src/services/mcp-config/spec.test.d.ts +0 -1
  239. package/dist/src/services/project/handler.d.ts +0 -11
  240. package/dist/src/services/project/handler.test.d.ts +0 -1
  241. package/dist/src/services/project/spec.d.ts +0 -86
  242. package/dist/src/services/project/spec.test.d.ts +0 -1
  243. package/dist/src/services/proxy/handler.d.ts +0 -15
  244. package/dist/src/services/proxy/handler.test.d.ts +0 -1
  245. package/dist/src/services/proxy/spec.d.ts +0 -83
  246. package/dist/src/services/proxy/spec.test.d.ts +0 -1
  247. package/dist/src/services/stitch/handler.d.ts +0 -15
  248. package/dist/src/services/stitch/handler.test.d.ts +0 -1
  249. package/dist/src/services/stitch/spec.d.ts +0 -262
  250. package/dist/src/services/stitch/spec.test.d.ts +0 -1
  251. package/dist/src/ui/spinner.d.ts +0 -11
  252. package/dist/src/ui/theme.d.ts +0 -18
  253. package/dist/src/ui/wizard.d.ts +0 -24
  254. package/dist/tests/mocks/shell.d.ts +0 -2
  255. /package/dist/{chunk-hb3c6f6a.js.map → chunk-001yk06v.js.map} +0 -0
  256. /package/dist/{chunk-25wakzyb.js.map → chunk-ahw5kfbr.js.map} +0 -0
  257. /package/dist/{chunk-45wx7tn7.js.map → chunk-gwnmywrp.js.map} +0 -0
  258. /package/dist/{chunk-48d17n29.js.map → chunk-j0y94q2c.js.map} +0 -0
@@ -0,0 +1,189 @@
1
+ import {
2
+ SiteBuilder,
3
+ SiteManifest
4
+ } from "./chunk-pjpdhh0f.js";
5
+ import {
6
+ require_jsx_dev_runtime
7
+ } from "./chunk-krfqppg2.js";
8
+ import {
9
+ render_default
10
+ } from "./chunk-t0xqfse1.js";
11
+ import"./chunk-4jwmvjb4.js";
12
+ import {
13
+ AssetGateway
14
+ } from "./chunk-7xsar3mr.js";
15
+ import {
16
+ require_lib
17
+ } from "./chunk-w8q7nsm7.js";
18
+ import"./chunk-6gw9apqb.js";
19
+ import {
20
+ stitch
21
+ } from "./chunk-a1mk24q9.js";
22
+ import {
23
+ pLimit
24
+ } from "./chunk-a5xra9jn.js";
25
+ import"./chunk-nq68kghz.js";
26
+ import"./chunk-54wv5ptt.js";
27
+ import"./chunk-3sfn889r.js";
28
+ import"./chunk-c6ge431q.js";
29
+ import {
30
+ __toESM
31
+ } from "./chunk-9wyra8hs.js";
32
+
33
+ // src/lib/services/site/SiteService.ts
34
+ var import_fs_extra = __toESM(require_lib(), 1);
35
+ import path from "path";
36
+ class SiteService {
37
+ static toUIScreens(screens) {
38
+ return screens.filter((s) => s.htmlCode && s.htmlCode.downloadUrl).map((s) => ({
39
+ id: s.name,
40
+ title: s.title,
41
+ downloadUrl: s.htmlCode.downloadUrl,
42
+ status: "ignored",
43
+ route: ""
44
+ }));
45
+ }
46
+ static async generateSite(config, htmlContent, assetGateway, outputDir = ".") {
47
+ await import_fs_extra.default.ensureDir(path.join(outputDir, "src/pages"));
48
+ await import_fs_extra.default.ensureDir(path.join(outputDir, "src/layouts"));
49
+ await import_fs_extra.default.ensureDir(path.join(outputDir, "public/assets"));
50
+ const pkgJson = {
51
+ name: "stitch-site",
52
+ type: "module",
53
+ version: "0.0.1",
54
+ scripts: {
55
+ dev: "astro dev",
56
+ start: "astro dev",
57
+ build: "astro build",
58
+ preview: "astro preview",
59
+ astro: "astro"
60
+ },
61
+ dependencies: {
62
+ astro: "^5.0.0"
63
+ }
64
+ };
65
+ await import_fs_extra.default.writeJson(path.join(outputDir, "package.json"), pkgJson, { spaces: 2 });
66
+ const astroConfig = `import { defineConfig } from 'astro/config';
67
+ export default defineConfig({});`;
68
+ await import_fs_extra.default.writeFile(path.join(outputDir, "astro.config.mjs"), astroConfig);
69
+ const layout = `---
70
+ interface Props {
71
+ title: string;
72
+ }
73
+
74
+ const { title } = Astro.props;
75
+ ---
76
+
77
+ <!doctype html>
78
+ <html lang="en">
79
+ <head>
80
+ <meta charset="UTF-8" />
81
+ <meta name="description" content="Astro description" />
82
+ <meta name="viewport" content="width=device-width" />
83
+ <link rel="icon" type="image/svg+xml" href="/favicon.svg" />
84
+ <meta name="generator" content={Astro.generator} />
85
+ <title>{title}</title>
86
+ </head>
87
+ <body>
88
+ <slot />
89
+ </body>
90
+ </html>
91
+ `;
92
+ await import_fs_extra.default.writeFile(path.join(outputDir, "src/layouts/Layout.astro"), layout);
93
+ const limit = pLimit(10);
94
+ const tasks = config.routes.map((route) => limit(async () => {
95
+ if (route.status !== "included")
96
+ return;
97
+ const html = htmlContent.get(route.screenId);
98
+ if (!html) {
99
+ console.warn(`No HTML content found for screen ${route.screenId}`);
100
+ return;
101
+ }
102
+ const { html: rewrittenHtml, assets } = await assetGateway.rewriteHtmlForBuild(html);
103
+ const assetsDir = path.join(outputDir, "public/assets");
104
+ for (const asset of assets) {
105
+ await assetGateway.copyAssetTo(asset.url, path.join(assetsDir, asset.filename));
106
+ }
107
+ let filePath = route.route;
108
+ if (filePath === "/") {
109
+ filePath = "index";
110
+ } else {
111
+ if (filePath.startsWith("/"))
112
+ filePath = filePath.substring(1);
113
+ }
114
+ const fullPath = path.join(outputDir, "src/pages", `${filePath}.astro`);
115
+ await import_fs_extra.default.ensureDir(path.dirname(fullPath));
116
+ await import_fs_extra.default.writeFile(fullPath, rewrittenHtml);
117
+ }));
118
+ await Promise.all(tasks);
119
+ }
120
+ static slugify(text) {
121
+ return text.toString().toLowerCase().replace(/\s+/g, "-").replace(/[^\w\-]+/g, "").replace(/\-\-+/g, "-").replace(/^-+/, "").replace(/-+$/, "");
122
+ }
123
+ }
124
+
125
+ // src/commands/site/index.tsx
126
+ var jsx_dev_runtime = __toESM(require_jsx_dev_runtime(), 1);
127
+
128
+ class SiteCommandHandler {
129
+ client;
130
+ constructor(client = stitch) {
131
+ this.client = client;
132
+ }
133
+ async execute(options) {
134
+ if (options.export) {
135
+ const project = this.client.project(options.projectId);
136
+ const sdkScreens = await project.screens();
137
+ const uiScreens = await Promise.all(sdkScreens.map(async (s) => ({
138
+ id: s.screenId,
139
+ title: s.title ?? s.screenId,
140
+ status: "ignored",
141
+ route: "",
142
+ downloadUrl: await s.getHtml().catch(() => null)
143
+ })));
144
+ const validScreens = uiScreens.filter((s) => !!s.downloadUrl);
145
+ const siteManifest = new SiteManifest(options.projectId);
146
+ const saved = await siteManifest.load();
147
+ for (const screen of validScreens) {
148
+ const state = saved.get(screen.id);
149
+ if (state?.status)
150
+ screen.status = state.status;
151
+ if (state?.route)
152
+ screen.route = state.route;
153
+ }
154
+ const included = validScreens.filter((s) => s.status === "included");
155
+ const exportData = {
156
+ projectId: options.projectId,
157
+ routes: included.map((s) => ({
158
+ screenId: s.id,
159
+ route: s.route
160
+ }))
161
+ };
162
+ console.log(JSON.stringify(exportData, null, 2));
163
+ return;
164
+ }
165
+ let resultConfig = null;
166
+ let resultHtml;
167
+ const { waitUntilExit } = render_default(/* @__PURE__ */ jsx_dev_runtime.jsxDEV(SiteBuilder, {
168
+ projectId: options.projectId,
169
+ client: this.client,
170
+ onExit: (config, html) => {
171
+ resultConfig = config;
172
+ resultHtml = html;
173
+ }
174
+ }, undefined, false, undefined, this));
175
+ await waitUntilExit();
176
+ if (resultConfig && resultHtml) {
177
+ console.log("Generating site...");
178
+ const assetGateway = new AssetGateway;
179
+ const outputDir = options.outputDir || ".";
180
+ await SiteService.generateSite(resultConfig, resultHtml, assetGateway, outputDir);
181
+ console.log("Site generated successfully!");
182
+ } else {}
183
+ }
184
+ }
185
+ export {
186
+ SiteCommandHandler
187
+ };
188
+
189
+ //# debugId=19687717CE98441C64756E2164756E21
@@ -0,0 +1,11 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/lib/services/site/SiteService.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
+ "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 type { SiteConfig, UIScreen } from '../../lib/services/site/types.js';\n\ninterface SiteCommandOptions {\n projectId: string;\n outputDir?: string;\n export?: boolean;\n}\n\nexport class SiteCommandHandler {\n constructor(private client: Stitch = stitch) {}\n\n async execute(options: SiteCommandOptions) {\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"
7
+ ],
8
+ "mappings": "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",
9
+ "debugId": "19687717CE98441C64756E2164756E21",
10
+ "names": []
11
+ }
@@ -1,6 +1,22 @@
1
+ import {
2
+ StitchHandler,
3
+ createSpinner
4
+ } from "./chunk-sw7h7asn.js";
5
+ import {
6
+ ConsoleUI,
7
+ GcloudHandler
8
+ } from "./chunk-cwqdka8y.js";
9
+ import {
10
+ runSteps
11
+ } from "./chunk-f2hq6bfv.js";
12
+ import {
13
+ icons,
14
+ theme
15
+ } from "./chunk-kbtqrkwh.js";
1
16
  import {
2
17
  __commonJS,
3
- __require
18
+ __require,
19
+ __toESM
4
20
  } from "./chunk-9wyra8hs.js";
5
21
 
6
22
  // node_modules/dotenv/package.json
@@ -398,6 +414,351 @@ var require_main = __commonJS((exports, module) => {
398
414
  module.exports = DotenvModule;
399
415
  });
400
416
 
401
- export { require_main };
417
+ // src/commands/doctor/handler.ts
418
+ var import_dotenv = __toESM(require_main(), 1);
419
+
420
+ // src/commands/doctor/steps/ApiKeyDetectedStep.ts
421
+ class ApiKeyDetectedStep {
422
+ id = "api-key-detected";
423
+ name = "Checking API Key...";
424
+ async shouldRun(context) {
425
+ return context.authMode === "apiKey";
426
+ }
427
+ async run(context) {
428
+ const apiKey = context.apiKey;
429
+ if (!apiKey || apiKey.trim().length === 0) {
430
+ const message2 = "STITCH_API_KEY is set but empty";
431
+ context.checks.push({
432
+ name: "API Key",
433
+ passed: false,
434
+ message: message2,
435
+ suggestion: "Set a valid API key in STITCH_API_KEY environment variable or in your .env file"
436
+ });
437
+ return { success: false, error: new Error(message2) };
438
+ }
439
+ const masked = apiKey.length > 7 ? `${apiKey.slice(0, 4)}...${apiKey.slice(-3)}` : "***";
440
+ const message = `Detected (${masked})`;
441
+ context.checks.push({
442
+ name: "API Key",
443
+ passed: true,
444
+ message
445
+ });
446
+ return { success: true, detail: message };
447
+ }
448
+ }
449
+
450
+ // src/commands/doctor/steps/GcloudCheckStep.ts
451
+ class GcloudCheckStep {
452
+ id = "gcloud-check";
453
+ name = "Checking Google Cloud CLI...";
454
+ async shouldRun(context) {
455
+ return context.authMode === "oauth";
456
+ }
457
+ async run(context) {
458
+ const gcloudResult = await context.gcloudService.ensureInstalled({
459
+ minVersion: "400.0.0",
460
+ forceLocal: false
461
+ });
462
+ if (gcloudResult.success) {
463
+ const message = `Installed (${gcloudResult.data.location}): v${gcloudResult.data.version}
464
+ Path: ${gcloudResult.data.path}`;
465
+ context.checks.push({
466
+ name: "Google Cloud CLI",
467
+ passed: true,
468
+ message
469
+ });
470
+ return { success: true, detail: message };
471
+ } else {
472
+ const message = "Not found or invalid version";
473
+ context.checks.push({
474
+ name: "Google Cloud CLI",
475
+ passed: false,
476
+ message,
477
+ suggestion: "Run: npx @_davideast/stitch-mcp init"
478
+ });
479
+ return { success: false, error: new Error(message) };
480
+ }
481
+ }
482
+ }
483
+
484
+ // src/commands/doctor/steps/AuthCheckStep.ts
485
+ class AuthCheckStep {
486
+ id = "auth-check";
487
+ name = "Checking user authentication...";
488
+ async shouldRun(context) {
489
+ return context.authMode === "oauth";
490
+ }
491
+ async run(context) {
492
+ const authResult = await context.gcloudService.authenticate({ skipIfActive: true });
493
+ if (authResult.success) {
494
+ const message = `Authenticated: ${authResult.data.account}`;
495
+ context.checks.push({
496
+ name: "User Authentication",
497
+ passed: true,
498
+ message
499
+ });
500
+ return { success: true, detail: message };
501
+ } else {
502
+ const message = "Not authenticated";
503
+ context.checks.push({
504
+ name: "User Authentication",
505
+ passed: false,
506
+ message,
507
+ suggestion: "Run: gcloud auth login"
508
+ });
509
+ return { success: false, error: new Error(message) };
510
+ }
511
+ }
512
+ }
513
+
514
+ // src/commands/doctor/steps/AdcCheckStep.ts
515
+ class AdcCheckStep {
516
+ id = "adc-check";
517
+ name = "Checking application credentials...";
518
+ async shouldRun(context) {
519
+ return context.authMode === "oauth";
520
+ }
521
+ async run(context) {
522
+ const adcResult = await context.gcloudService.authenticateADC({ skipIfActive: true });
523
+ if (adcResult.success) {
524
+ const message = "Present";
525
+ context.checks.push({
526
+ name: "Application Credentials",
527
+ passed: true,
528
+ message
529
+ });
530
+ return { success: true, detail: message };
531
+ } else {
532
+ const message = "Not configured";
533
+ context.checks.push({
534
+ name: "Application Credentials",
535
+ passed: false,
536
+ message,
537
+ suggestion: "Run: gcloud auth application-default login"
538
+ });
539
+ return { success: false, error: new Error(message) };
540
+ }
541
+ }
542
+ }
543
+
544
+ // src/commands/doctor/steps/ProjectCheckStep.ts
545
+ class ProjectCheckStep {
546
+ id = "project-check";
547
+ name = "Checking active project...";
548
+ async shouldRun(context) {
549
+ return context.authMode === "oauth";
550
+ }
551
+ async run(context) {
552
+ const projectId = await context.gcloudService.getProjectId();
553
+ if (projectId) {
554
+ const message = `Set: ${projectId}`;
555
+ context.checks.push({
556
+ name: "Active Project",
557
+ passed: true,
558
+ message
559
+ });
560
+ return { success: true, detail: message };
561
+ } else {
562
+ const message = "No project configured";
563
+ context.checks.push({
564
+ name: "Active Project",
565
+ passed: false,
566
+ message,
567
+ suggestion: "Run: npx @_davideast/stitch-mcp init"
568
+ });
569
+ return { success: false, error: new Error(message) };
570
+ }
571
+ }
572
+ }
573
+
574
+ // src/commands/doctor/steps/ApiKeyConnectionStep.ts
575
+ class ApiKeyConnectionStep {
576
+ id = "api-key-connection";
577
+ name = "Testing Stitch API...";
578
+ async shouldRun(context) {
579
+ if (context.authMode !== "apiKey")
580
+ return false;
581
+ const apiKeyCheck = context.checks.find((c) => c.name === "API Key");
582
+ return !!apiKeyCheck && apiKeyCheck.passed;
583
+ }
584
+ async run(context) {
585
+ const testResult = await context.stitchService.testConnectionWithApiKey({
586
+ apiKey: context.apiKey
587
+ });
588
+ if (testResult.success) {
589
+ const message = `Healthy (${testResult.data.statusCode})`;
590
+ context.checks.push({
591
+ name: "Stitch API",
592
+ passed: true,
593
+ message
594
+ });
595
+ return { success: true, detail: message };
596
+ } else {
597
+ const message = testResult.error.message;
598
+ context.checks.push({
599
+ name: "Stitch API",
600
+ passed: false,
601
+ message,
602
+ suggestion: testResult.error.suggestion,
603
+ details: testResult.error.details
604
+ });
605
+ return { success: false, error: new Error(message) };
606
+ }
607
+ }
608
+ }
609
+
610
+ // src/commands/doctor/steps/ApiCheckStep.ts
611
+ class ApiCheckStep {
612
+ id = "api-check";
613
+ name = "Testing Stitch API...";
614
+ async shouldRun(context) {
615
+ if (context.authMode !== "oauth")
616
+ return false;
617
+ const projectCheck = context.checks.find((c) => c.name === "Active Project");
618
+ return !!projectCheck && projectCheck.passed;
619
+ }
620
+ async run(context) {
621
+ const projectId = await context.gcloudService.getProjectId();
622
+ const accessToken = await context.gcloudService.getAccessToken();
623
+ if (projectId && accessToken) {
624
+ const testResult = await context.stitchService.testConnection({
625
+ projectId,
626
+ accessToken
627
+ });
628
+ if (testResult.success) {
629
+ const message = `Healthy (${testResult.data.statusCode})`;
630
+ context.checks.push({
631
+ name: "Stitch API",
632
+ passed: true,
633
+ message
634
+ });
635
+ return { success: true, detail: message };
636
+ } else {
637
+ const message = testResult.error.message;
638
+ context.checks.push({
639
+ name: "Stitch API",
640
+ passed: false,
641
+ message,
642
+ suggestion: testResult.error.suggestion,
643
+ details: testResult.error.details
644
+ });
645
+ return { success: false, error: new Error(message) };
646
+ }
647
+ } else {
648
+ const message = "Could not obtain access token";
649
+ context.checks.push({
650
+ name: "Stitch API",
651
+ passed: false,
652
+ message,
653
+ suggestion: "Re-run authentication"
654
+ });
655
+ return { success: false, error: new Error(message) };
656
+ }
657
+ }
658
+ }
659
+
660
+ // src/commands/doctor/handler.ts
661
+ class DoctorHandler {
662
+ gcloudService;
663
+ stitchService;
664
+ steps;
665
+ ui;
666
+ constructor(gcloudService = new GcloudHandler, stitchService = new StitchHandler, ui) {
667
+ this.gcloudService = gcloudService;
668
+ this.stitchService = stitchService;
669
+ this.ui = ui || new ConsoleUI;
670
+ this.steps = [
671
+ new ApiKeyDetectedStep,
672
+ new GcloudCheckStep,
673
+ new AuthCheckStep,
674
+ new AdcCheckStep,
675
+ new ProjectCheckStep,
676
+ new ApiKeyConnectionStep,
677
+ new ApiCheckStep
678
+ ];
679
+ }
680
+ async execute(input) {
681
+ import_dotenv.default.config({ quiet: true });
682
+ const apiKey = process.env.STITCH_API_KEY;
683
+ const context = {
684
+ input,
685
+ ui: this.ui,
686
+ gcloudService: this.gcloudService,
687
+ stitchService: this.stitchService,
688
+ authMode: apiKey ? "apiKey" : "oauth",
689
+ apiKey: apiKey || undefined,
690
+ checks: []
691
+ };
692
+ console.log(`
693
+ ${theme.blue("Stitch Doctor")}
694
+ `);
695
+ try {
696
+ let spinner;
697
+ await runSteps(this.steps, context, {
698
+ onBeforeStep: (step) => {
699
+ spinner = createSpinner();
700
+ spinner.start(step.name);
701
+ },
702
+ onAfterStep: (_step, result) => {
703
+ if (result.success) {
704
+ spinner.succeed(result.detail || "Passed");
705
+ } else {
706
+ spinner.fail(result.error?.message || "Failed");
707
+ }
708
+ return false;
709
+ }
710
+ });
711
+ const allPassed = context.checks.every((c) => c.passed);
712
+ console.log(`
713
+ ${theme.blue("─".repeat(60))}
714
+ `);
715
+ console.log(theme.blue(`Health Check Summary
716
+ `));
717
+ for (const check of context.checks) {
718
+ const icon = check.passed ? theme.green(icons.success) : theme.red(icons.error);
719
+ console.log(`${icon} ${check.name}: ${check.message}`);
720
+ if (check.suggestion && !check.passed) {
721
+ console.log(theme.gray(` → ${check.suggestion}`));
722
+ }
723
+ }
724
+ if (input.verbose) {
725
+ const failedChecksWithDetails = context.checks.filter((c) => !c.passed && c.details);
726
+ if (failedChecksWithDetails.length > 0) {
727
+ console.log(`
728
+ ${theme.blue("Detailed Error Information")}
729
+ `);
730
+ for (const check of failedChecksWithDetails) {
731
+ console.log(theme.yellow(`${check.name}:`));
732
+ console.log(theme.gray(check.details.split(`
733
+ `).map((line) => ` ${line}`).join(`
734
+ `)));
735
+ console.log("");
736
+ }
737
+ }
738
+ }
739
+ console.log(`
740
+ ${allPassed ? theme.green("All checks passed!") : theme.yellow("Some checks failed")}
741
+ `);
742
+ return {
743
+ success: true,
744
+ data: {
745
+ checks: context.checks,
746
+ allPassed
747
+ }
748
+ };
749
+ } catch (error) {
750
+ return {
751
+ success: false,
752
+ error: {
753
+ code: "UNKNOWN_ERROR",
754
+ message: error instanceof Error ? error.message : String(error),
755
+ recoverable: false
756
+ }
757
+ };
758
+ }
759
+ }
760
+ }
761
+
762
+ export { DoctorHandler };
402
763
 
403
- //# debugId=8AD4090A830BE76664756E2164756E21
764
+ //# debugId=FC4010CB548913D964756E2164756E21