@_davideast/stitch-mcp 0.3.2 → 0.5.0

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 (214) hide show
  1. package/README.md +54 -239
  2. package/dist/chunk-25wakzyb.js +137 -0
  3. package/dist/chunk-25wakzyb.js.map +10 -0
  4. package/dist/chunk-2cetsfw4.js +16531 -0
  5. package/dist/chunk-2cetsfw4.js.map +95 -0
  6. package/dist/chunk-2fcdwvrm.js +54 -0
  7. package/dist/chunk-2fcdwvrm.js.map +10 -0
  8. package/dist/chunk-2k7n0w2x.js +3980 -0
  9. package/dist/chunk-2k7n0w2x.js.map +16 -0
  10. package/dist/chunk-2kyqsrg2.js +403 -0
  11. package/dist/chunk-2kyqsrg2.js.map +10 -0
  12. package/dist/chunk-384jmtpy.js +11057 -0
  13. package/dist/chunk-384jmtpy.js.map +238 -0
  14. package/dist/chunk-3at4pjgn.js +22 -0
  15. package/dist/chunk-3at4pjgn.js.map +9 -0
  16. package/dist/chunk-3sfn889r.js +492 -0
  17. package/dist/chunk-3sfn889r.js.map +13 -0
  18. package/dist/chunk-45wx7tn7.js +94 -0
  19. package/dist/chunk-45wx7tn7.js.map +10 -0
  20. package/dist/chunk-48d17n29.js +10 -0
  21. package/dist/chunk-48d17n29.js.map +9 -0
  22. package/dist/chunk-4jwmvjb4.js +839 -0
  23. package/dist/chunk-4jwmvjb4.js.map +11 -0
  24. package/dist/chunk-4jygt4d6.js +14 -0
  25. package/dist/chunk-4jygt4d6.js.map +10 -0
  26. package/dist/chunk-4vxy1qce.js +68 -0
  27. package/dist/chunk-4vxy1qce.js.map +10 -0
  28. package/dist/chunk-7tx0wn04.js +11 -0
  29. package/dist/chunk-7tx0wn04.js.map +9 -0
  30. package/dist/chunk-7xh1y383.js +45188 -0
  31. package/dist/chunk-7xh1y383.js.map +258 -0
  32. package/dist/chunk-8yrtq2qs.js +18 -0
  33. package/dist/chunk-8yrtq2qs.js.map +9 -0
  34. package/dist/chunk-985f11w6.js +21 -0
  35. package/dist/chunk-985f11w6.js.map +9 -0
  36. package/dist/chunk-9tvppjaf.js +250 -0
  37. package/dist/chunk-9tvppjaf.js.map +14 -0
  38. package/dist/chunk-9wyra8hs.js +32 -0
  39. package/dist/chunk-9wyra8hs.js.map +9 -0
  40. package/dist/chunk-cwkb2wbe.js +733 -0
  41. package/dist/chunk-cwkb2wbe.js.map +16 -0
  42. package/dist/chunk-djhzzcgj.js +362 -0
  43. package/dist/chunk-djhzzcgj.js.map +13 -0
  44. package/dist/chunk-edp6faw2.js +7 -0
  45. package/dist/chunk-edp6faw2.js.map +9 -0
  46. package/dist/chunk-ezmw2j8c.js +14 -0
  47. package/dist/chunk-ezmw2j8c.js.map +9 -0
  48. package/dist/chunk-f2hq6bfv.js +22 -0
  49. package/dist/chunk-f2hq6bfv.js.map +10 -0
  50. package/dist/chunk-fwb4fnkp.js +31 -0
  51. package/dist/chunk-fwb4fnkp.js.map +10 -0
  52. package/dist/chunk-h18jrqed.js +9517 -0
  53. package/dist/chunk-h18jrqed.js.map +99 -0
  54. package/dist/chunk-hb3c6f6a.js +42 -0
  55. package/dist/chunk-hb3c6f6a.js.map +9 -0
  56. package/dist/chunk-jy2d17pr.js +252 -0
  57. package/dist/chunk-jy2d17pr.js.map +11 -0
  58. package/dist/chunk-kbtqrkwh.js +24 -0
  59. package/dist/chunk-kbtqrkwh.js.map +10 -0
  60. package/dist/chunk-knbnsf6s.js +92 -0
  61. package/dist/chunk-knbnsf6s.js.map +10 -0
  62. package/dist/chunk-mv9ssgmx.js +446 -0
  63. package/dist/chunk-mv9ssgmx.js.map +17 -0
  64. package/dist/chunk-nq68kghz.js +1647 -0
  65. package/dist/chunk-nq68kghz.js.map +10 -0
  66. package/dist/chunk-nthabjd9.js +3138 -0
  67. package/dist/chunk-nthabjd9.js.map +34 -0
  68. package/dist/chunk-nxpzt33t.js +278 -0
  69. package/dist/chunk-nxpzt33t.js.map +10 -0
  70. package/dist/chunk-pfyjtfex.js +172 -0
  71. package/dist/chunk-pfyjtfex.js.map +10 -0
  72. package/dist/chunk-q1nd6g0y.js +392 -0
  73. package/dist/chunk-q1nd6g0y.js.map +20 -0
  74. package/dist/chunk-q4js8r0z.js +4708 -0
  75. package/dist/chunk-q4js8r0z.js.map +29 -0
  76. package/dist/chunk-qv44tmn6.js +289 -0
  77. package/dist/chunk-qv44tmn6.js.map +13 -0
  78. package/dist/chunk-r2sg2nxa.js +20 -0
  79. package/dist/chunk-r2sg2nxa.js.map +9 -0
  80. package/dist/chunk-rp8wjzht.js +16959 -0
  81. package/dist/chunk-rp8wjzht.js.map +26 -0
  82. package/dist/chunk-rpxnm86e.js +372 -0
  83. package/dist/chunk-rpxnm86e.js.map +17 -0
  84. package/dist/chunk-sdp429xd.js +914 -0
  85. package/dist/chunk-sdp429xd.js.map +24 -0
  86. package/dist/chunk-t85nbjjb.js +113 -0
  87. package/dist/chunk-t85nbjjb.js.map +10 -0
  88. package/dist/chunk-tz7wnw4s.js +211 -0
  89. package/dist/chunk-tz7wnw4s.js.map +11 -0
  90. package/dist/chunk-v7117ywx.js +1477 -0
  91. package/dist/chunk-v7117ywx.js.map +23 -0
  92. package/dist/chunk-w8q7nsm7.js +2098 -0
  93. package/dist/chunk-w8q7nsm7.js.map +44 -0
  94. package/dist/chunk-wa64nz8b.js +47 -0
  95. package/dist/chunk-wa64nz8b.js.map +10 -0
  96. package/dist/chunk-wz8d5vzb.js +234 -0
  97. package/dist/chunk-wz8d5vzb.js.map +11 -0
  98. package/dist/chunk-ycfxp056.js +677 -0
  99. package/dist/chunk-ycfxp056.js.map +17 -0
  100. package/dist/chunk-z9d2xc83.js +3256 -0
  101. package/dist/chunk-z9d2xc83.js.map +84 -0
  102. package/dist/cli.js +111 -125552
  103. package/dist/cli.js.map +19 -0
  104. package/dist/commands/autoload.d.ts +2 -0
  105. package/dist/commands/doctor/command.d.ts +2 -1
  106. package/dist/commands/doctor/command.js +82 -0
  107. package/dist/commands/doctor/command.js.map +11 -0
  108. package/dist/commands/doctor/spec.d.ts +16 -8
  109. package/dist/commands/init/command.d.ts +2 -1
  110. package/dist/commands/init/command.js +98 -0
  111. package/dist/commands/init/command.js.map +11 -0
  112. package/dist/commands/init/spec.d.ts +29 -9
  113. package/dist/commands/logout/command.d.ts +2 -1
  114. package/dist/commands/logout/command.js +79 -0
  115. package/dist/commands/logout/command.js.map +11 -0
  116. package/dist/commands/logout/spec.d.ts +11 -0
  117. package/dist/commands/proxy/command.d.ts +2 -1
  118. package/dist/commands/proxy/command.js +56 -0
  119. package/dist/commands/proxy/command.js.map +11 -0
  120. package/dist/commands/proxy/spec.d.ts +15 -0
  121. package/dist/commands/screens/command.d.ts +2 -1
  122. package/dist/commands/screens/command.js +61 -0
  123. package/dist/commands/screens/command.js.map +11 -0
  124. package/dist/commands/screens/spec.d.ts +9 -0
  125. package/dist/commands/serve/command.d.ts +2 -1
  126. package/dist/commands/serve/command.js +65 -0
  127. package/dist/commands/serve/command.js.map +11 -0
  128. package/dist/commands/serve/spec.d.ts +9 -0
  129. package/dist/commands/site/command.d.ts +2 -1
  130. package/dist/commands/site/command.js +53 -0
  131. package/dist/commands/site/command.js.map +11 -0
  132. package/dist/commands/site/spec.d.ts +15 -0
  133. package/dist/commands/snapshot/command.d.ts +2 -1
  134. package/dist/commands/snapshot/command.js +59 -0
  135. package/dist/commands/snapshot/command.js.map +11 -0
  136. package/dist/commands/tool/command.d.ts +2 -1
  137. package/dist/commands/tool/command.js +79 -0
  138. package/dist/commands/tool/command.js.map +11 -0
  139. package/dist/commands/tool/handler.d.ts +17 -0
  140. package/dist/commands/tool/spec.d.ts +17 -0
  141. package/dist/commands/tool/steps/ValidateToolStep.d.ts +8 -0
  142. package/dist/commands/tool/virtual-tools/index.d.ts +1 -0
  143. package/dist/commands/tool/virtual-tools/list-tools.d.ts +2 -0
  144. package/dist/commands/view/command.d.ts +2 -1
  145. package/dist/commands/view/command.js +52 -0
  146. package/dist/commands/view/command.js.map +11 -0
  147. package/dist/commands/view/spec.d.ts +24 -0
  148. package/dist/framework/CommandDefinition.d.ts +2 -2
  149. package/dist/index.js +26 -21668
  150. package/dist/index.js.map +9 -0
  151. package/dist/lib/services/site/schemas.d.ts +8 -8
  152. package/dist/services/config/handler.d.ts +12 -0
  153. package/dist/services/config/spec.d.ts +82 -0
  154. package/dist/services/gcloud/auth.d.ts +28 -0
  155. package/dist/services/gcloud/core.d.ts +21 -0
  156. package/dist/services/gcloud/handler.d.ts +6 -18
  157. package/dist/services/gcloud/install.d.ts +23 -0
  158. package/dist/services/gcloud/projects.d.ts +15 -0
  159. package/dist/services/gcloud/spec.d.ts +32 -24
  160. package/dist/services/mcp-client/client.d.ts +0 -5
  161. package/dist/services/mcp-client/spec.d.ts +6 -6
  162. package/dist/services/mcp-config/spec.d.ts +12 -12
  163. package/dist/services/project/spec.d.ts +4 -4
  164. package/dist/services/proxy/spec.d.ts +3 -3
  165. package/dist/services/stitch/api.d.ts +10 -0
  166. package/dist/services/stitch/connection.d.ts +5 -0
  167. package/dist/services/stitch/handler.d.ts +5 -3
  168. package/dist/services/stitch/iam.d.ts +11 -0
  169. package/dist/services/stitch/spec.d.ts +6 -6
  170. package/dist/services/view/spec.d.ts +7 -7
  171. package/dist/src/cli.d.ts +1 -0
  172. package/dist/src/commands/doctor/handler.d.ts +9 -0
  173. package/dist/src/commands/doctor/handler.test.d.ts +1 -0
  174. package/dist/src/commands/doctor/spec.d.ts +130 -0
  175. package/dist/src/commands/doctor/spec.test.d.ts +1 -0
  176. package/dist/src/commands/init/handler.d.ts +17 -0
  177. package/dist/src/commands/init/handler.test.d.ts +1 -0
  178. package/dist/src/commands/init/spec.d.ts +88 -0
  179. package/dist/src/commands/init/spec.test.d.ts +1 -0
  180. package/dist/src/commands/proxy/handler.d.ts +7 -0
  181. package/dist/src/commands/proxy/handler.test.d.ts +1 -0
  182. package/dist/src/index.d.ts +13 -0
  183. package/dist/src/platform/detector.d.ts +29 -0
  184. package/dist/src/platform/paths.d.ts +20 -0
  185. package/dist/src/platform/shell.d.ts +26 -0
  186. package/dist/src/services/gcloud/handler.d.ts +48 -0
  187. package/dist/src/services/gcloud/handler.test.d.ts +1 -0
  188. package/dist/src/services/gcloud/spec.d.ts +405 -0
  189. package/dist/src/services/mcp-config/handler.d.ts +12 -0
  190. package/dist/src/services/mcp-config/handler.test.d.ts +1 -0
  191. package/dist/src/services/mcp-config/spec.d.ts +88 -0
  192. package/dist/src/services/mcp-config/spec.test.d.ts +1 -0
  193. package/dist/src/services/project/handler.d.ts +11 -0
  194. package/dist/src/services/project/handler.test.d.ts +1 -0
  195. package/dist/src/services/project/spec.d.ts +86 -0
  196. package/dist/src/services/project/spec.test.d.ts +1 -0
  197. package/dist/src/services/proxy/handler.d.ts +15 -0
  198. package/dist/src/services/proxy/handler.test.d.ts +1 -0
  199. package/dist/src/services/proxy/spec.d.ts +83 -0
  200. package/dist/src/services/proxy/spec.test.d.ts +1 -0
  201. package/dist/src/services/stitch/handler.d.ts +15 -0
  202. package/dist/src/services/stitch/handler.test.d.ts +1 -0
  203. package/dist/src/services/stitch/spec.d.ts +262 -0
  204. package/dist/src/services/stitch/spec.test.d.ts +1 -0
  205. package/dist/src/ui/spinner.d.ts +11 -0
  206. package/dist/src/ui/theme.d.ts +18 -0
  207. package/dist/src/ui/wizard.d.ts +24 -0
  208. package/dist/tests/mocks/shell.d.ts +2 -0
  209. package/dist/ui/JsonTree.d.ts +1 -1
  210. package/package.json +2 -2
  211. package/dist/commands/registry.d.ts +0 -2
  212. package/dist/ui/copy-behaviors/index.d.ts +0 -8
  213. package/dist/ui/serve-behaviors/index.d.ts +0 -7
  214. /package/dist/ui/navigation-behaviors/{index.d.ts → handler.d.ts} +0 -0
@@ -0,0 +1,278 @@
1
+ import {
2
+ require_jsx_dev_runtime
3
+ } from "./chunk-wz8d5vzb.js";
4
+ import {
5
+ Box_default,
6
+ Text,
7
+ use_app_default,
8
+ use_input_default
9
+ } from "./chunk-2cetsfw4.js";
10
+ import {
11
+ require_react
12
+ } from "./chunk-4jwmvjb4.js";
13
+ import {
14
+ StitchViteServer
15
+ } from "./chunk-7xh1y383.js";
16
+ import"./chunk-w8q7nsm7.js";
17
+ import {
18
+ downloadText
19
+ } from "./chunk-4vxy1qce.js";
20
+ import {
21
+ clipboardy_default
22
+ } from "./chunk-384jmtpy.js";
23
+ import"./chunk-mv9ssgmx.js";
24
+ import"./chunk-4jygt4d6.js";
25
+ import"./chunk-tz7wnw4s.js";
26
+ import"./chunk-3sfn889r.js";
27
+ import {
28
+ __toESM
29
+ } from "./chunk-9wyra8hs.js";
30
+
31
+ // src/commands/screens/ScreensView.tsx
32
+ var import_react = __toESM(require_react(), 1);
33
+ var jsx_dev_runtime = __toESM(require_jsx_dev_runtime(), 1);
34
+ import { spawn } from "child_process";
35
+ function ScreensView({ projectId, projectTitle, screens, client }) {
36
+ const { exit } = use_app_default();
37
+ const [selectedIndex, setSelectedIndex] = import_react.useState(0);
38
+ const [windowStart, setWindowStart] = import_react.useState(0);
39
+ const [status, setStatus] = import_react.useState("");
40
+ const [serverUrl, setServerUrl] = import_react.useState(null);
41
+ const serverRef = import_react.useRef(null);
42
+ const VIEW_HEIGHT = 10;
43
+ import_react.default.useEffect(() => {
44
+ if (selectedIndex < windowStart) {
45
+ setWindowStart(selectedIndex);
46
+ } else if (selectedIndex >= windowStart + VIEW_HEIGHT) {
47
+ setWindowStart(selectedIndex - VIEW_HEIGHT + 1);
48
+ }
49
+ }, [selectedIndex, windowStart, VIEW_HEIGHT]);
50
+ import_react.useEffect(() => {
51
+ return () => {
52
+ if (serverRef.current)
53
+ serverRef.current.stop();
54
+ };
55
+ }, []);
56
+ async function serveScreen(screen) {
57
+ if (!screen.hasCode || !screen.codeUrl) {
58
+ setStatus("No HTML to serve");
59
+ return;
60
+ }
61
+ setStatus("Preparing server...");
62
+ let srv = serverRef.current;
63
+ let url = serverUrl;
64
+ let justStarted = false;
65
+ if (!srv) {
66
+ srv = new StitchViteServer;
67
+ url = await srv.start(0);
68
+ serverRef.current = srv;
69
+ setServerUrl(url);
70
+ justStarted = true;
71
+ }
72
+ if (!url)
73
+ return;
74
+ try {
75
+ const html = await downloadText(screen.codeUrl);
76
+ const route = `/screens/${screen.screenId}`;
77
+ srv.mount(route, html);
78
+ const fullUrl = `${url}${route}`;
79
+ if (justStarted) {
80
+ const start = process.platform == "darwin" ? "open" : process.platform == "win32" ? "start" : "xdg-open";
81
+ if (process.platform === "win32") {
82
+ spawn("cmd", ["/c", "start", fullUrl], { detached: true, stdio: "ignore" }).unref();
83
+ } else {
84
+ spawn(start, [fullUrl], { detached: true, stdio: "ignore" }).unref();
85
+ }
86
+ } else {
87
+ srv.navigate(fullUrl);
88
+ }
89
+ setStatus(`Serving at ${fullUrl}`);
90
+ } catch (e) {
91
+ setStatus("Error serving screen");
92
+ }
93
+ }
94
+ use_input_default((input, key) => {
95
+ if (input === "q") {
96
+ exit();
97
+ return;
98
+ }
99
+ if (key.upArrow || input === "k") {
100
+ setSelectedIndex((prev) => Math.max(0, prev - 1));
101
+ setStatus("");
102
+ }
103
+ if (key.downArrow || input === "j") {
104
+ setSelectedIndex((prev) => Math.min(screens.length - 1, prev + 1));
105
+ setStatus("");
106
+ }
107
+ if (input === "c") {
108
+ const screen = screens[selectedIndex];
109
+ if (screen?.hasCode && screen.codeUrl) {
110
+ setStatus("Copying...");
111
+ downloadText(screen.codeUrl).then((code) => {
112
+ clipboardy_default.write(code);
113
+ setStatus("HTML copied!");
114
+ }).catch(() => setStatus("Failed to copy"));
115
+ } else {
116
+ setStatus("No HTML available");
117
+ }
118
+ }
119
+ if (input === "i") {
120
+ const screen = screens[selectedIndex];
121
+ if (screen?.hasImage) {
122
+ setStatus("Image copy not implemented");
123
+ } else {
124
+ setStatus("No image available");
125
+ }
126
+ }
127
+ if (input === "s") {
128
+ const screen = screens[selectedIndex];
129
+ if (screen) {
130
+ serveScreen(screen);
131
+ }
132
+ }
133
+ });
134
+ const visibleScreens = screens.slice(windowStart, windowStart + VIEW_HEIGHT);
135
+ return /* @__PURE__ */ jsx_dev_runtime.jsxDEV(Box_default, {
136
+ flexDirection: "column",
137
+ padding: 1,
138
+ children: [
139
+ /* @__PURE__ */ jsx_dev_runtime.jsxDEV(Text, {
140
+ bold: true,
141
+ children: [
142
+ projectTitle,
143
+ " (",
144
+ screens.length,
145
+ " screens)"
146
+ ]
147
+ }, undefined, true, undefined, this),
148
+ /* @__PURE__ */ jsx_dev_runtime.jsxDEV(Text, {
149
+ dimColor: true,
150
+ children: [
151
+ "projectId: ",
152
+ projectId
153
+ ]
154
+ }, undefined, true, undefined, this),
155
+ serverUrl && /* @__PURE__ */ jsx_dev_runtime.jsxDEV(Text, {
156
+ dimColor: true,
157
+ children: [
158
+ "Server: ",
159
+ /* @__PURE__ */ jsx_dev_runtime.jsxDEV(Text, {
160
+ color: "green",
161
+ children: serverUrl
162
+ }, undefined, false, undefined, this)
163
+ ]
164
+ }, undefined, true, undefined, this),
165
+ /* @__PURE__ */ jsx_dev_runtime.jsxDEV(Text, {
166
+ children: " "
167
+ }, undefined, false, undefined, this),
168
+ /* @__PURE__ */ jsx_dev_runtime.jsxDEV(Box_default, {
169
+ flexDirection: "column",
170
+ borderStyle: "single",
171
+ borderColor: "yellow",
172
+ paddingX: 1,
173
+ children: [
174
+ windowStart > 0 && /* @__PURE__ */ jsx_dev_runtime.jsxDEV(Text, {
175
+ dimColor: true,
176
+ children: [
177
+ "... ",
178
+ windowStart,
179
+ " more above ..."
180
+ ]
181
+ }, undefined, true, undefined, this),
182
+ visibleScreens.map((screen, index) => {
183
+ const absoluteIndex = windowStart + index;
184
+ const isSelected = absoluteIndex === selectedIndex;
185
+ const num = String(absoluteIndex + 1).padStart(2, " ");
186
+ const selector = isSelected ? "▸" : " ";
187
+ return /* @__PURE__ */ jsx_dev_runtime.jsxDEV(Box_default, {
188
+ flexDirection: "column",
189
+ children: [
190
+ /* @__PURE__ */ jsx_dev_runtime.jsxDEV(Box_default, {
191
+ justifyContent: "space-between",
192
+ children: [
193
+ /* @__PURE__ */ jsx_dev_runtime.jsxDEV(Box_default, {
194
+ children: [
195
+ /* @__PURE__ */ jsx_dev_runtime.jsxDEV(Text, {
196
+ dimColor: true,
197
+ children: num
198
+ }, undefined, false, undefined, this),
199
+ /* @__PURE__ */ jsx_dev_runtime.jsxDEV(Text, {
200
+ color: isSelected ? "cyan" : undefined,
201
+ children: [
202
+ " ",
203
+ selector,
204
+ " "
205
+ ]
206
+ }, undefined, true, undefined, this),
207
+ /* @__PURE__ */ jsx_dev_runtime.jsxDEV(Text, {
208
+ color: isSelected ? "cyan" : undefined,
209
+ bold: isSelected,
210
+ children: screen.title.slice(0, 28)
211
+ }, undefined, false, undefined, this)
212
+ ]
213
+ }, undefined, true, undefined, this),
214
+ /* @__PURE__ */ jsx_dev_runtime.jsxDEV(Box_default, {
215
+ children: [
216
+ /* @__PURE__ */ jsx_dev_runtime.jsxDEV(Text, {
217
+ dimColor: true,
218
+ children: "html"
219
+ }, undefined, false, undefined, this),
220
+ /* @__PURE__ */ jsx_dev_runtime.jsxDEV(Text, {
221
+ color: screen.hasCode ? "green" : "gray",
222
+ children: screen.hasCode ? "[✓]" : "[ ]"
223
+ }, undefined, false, undefined, this),
224
+ /* @__PURE__ */ jsx_dev_runtime.jsxDEV(Text, {
225
+ children: " "
226
+ }, undefined, false, undefined, this),
227
+ /* @__PURE__ */ jsx_dev_runtime.jsxDEV(Text, {
228
+ dimColor: true,
229
+ children: "img"
230
+ }, undefined, false, undefined, this),
231
+ /* @__PURE__ */ jsx_dev_runtime.jsxDEV(Text, {
232
+ color: screen.hasImage ? "green" : "gray",
233
+ children: screen.hasImage ? "[✓]" : "[ ]"
234
+ }, undefined, false, undefined, this)
235
+ ]
236
+ }, undefined, true, undefined, this)
237
+ ]
238
+ }, undefined, true, undefined, this),
239
+ /* @__PURE__ */ jsx_dev_runtime.jsxDEV(Text, {
240
+ dimColor: true,
241
+ color: "gray",
242
+ children: [
243
+ " screenId: ",
244
+ screen.screenId
245
+ ]
246
+ }, undefined, true, undefined, this),
247
+ /* @__PURE__ */ jsx_dev_runtime.jsxDEV(Text, {
248
+ children: " "
249
+ }, undefined, false, undefined, this)
250
+ ]
251
+ }, screen.screenId, true, undefined, this);
252
+ }),
253
+ windowStart + VIEW_HEIGHT < screens.length && /* @__PURE__ */ jsx_dev_runtime.jsxDEV(Text, {
254
+ dimColor: true,
255
+ children: [
256
+ "... ",
257
+ screens.length - (windowStart + VIEW_HEIGHT),
258
+ " more below ..."
259
+ ]
260
+ }, undefined, true, undefined, this)
261
+ ]
262
+ }, undefined, true, undefined, this),
263
+ /* @__PURE__ */ jsx_dev_runtime.jsxDEV(Text, {
264
+ dimColor: true,
265
+ children: "[c]opy html [i]mage [s]erve [q]uit"
266
+ }, undefined, false, undefined, this),
267
+ status && /* @__PURE__ */ jsx_dev_runtime.jsxDEV(Text, {
268
+ color: "yellow",
269
+ children: status
270
+ }, undefined, false, undefined, this)
271
+ ]
272
+ }, undefined, true, undefined, this);
273
+ }
274
+ export {
275
+ ScreensView
276
+ };
277
+
278
+ //# debugId=D62549CBA4CF5F8B64756E2164756E21
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/commands/screens/ScreensView.tsx"],
4
+ "sourcesContent": [
5
+ "import React, { useState, useEffect, useRef } from 'react';\nimport { Box, Text, useInput, useApp } from 'ink';\nimport type { StitchMCPClient } from '../../services/mcp-client/client.js';\nimport { downloadText } from '../../ui/copy-behaviors/clipboard.js';\nimport clipboard from 'clipboardy';\nimport { StitchViteServer } from '../../lib/server/vite/StitchViteServer.js';\nimport { spawn } from 'child_process';\n\ninterface Screen {\n screenId: string;\n title: string;\n hasCode: boolean;\n codeUrl: string | null;\n hasImage: boolean;\n}\n\ninterface ScreensViewProps {\n projectId: string;\n projectTitle: string;\n screens: Screen[];\n client: StitchMCPClient;\n}\n\nexport function ScreensView({ projectId, projectTitle, screens, client }: ScreensViewProps) {\n const { exit } = useApp();\n const [selectedIndex, setSelectedIndex] = useState(0);\n const [windowStart, setWindowStart] = useState(0);\n const [status, setStatus] = useState('');\n const [serverUrl, setServerUrl] = useState<string | null>(null);\n\n const serverRef = useRef<StitchViteServer | null>(null);\n\n const VIEW_HEIGHT = 10;\n\n // Helper to sync window with selection\n React.useEffect(() => {\n if (selectedIndex < windowStart) {\n setWindowStart(selectedIndex);\n } else if (selectedIndex >= windowStart + VIEW_HEIGHT) {\n setWindowStart(selectedIndex - VIEW_HEIGHT + 1);\n }\n }, [selectedIndex, windowStart, VIEW_HEIGHT]);\n\n useEffect(() => {\n return () => {\n if (serverRef.current) serverRef.current.stop();\n };\n }, []);\n\n async function serveScreen(screen: Screen) {\n if (!screen.hasCode || !screen.codeUrl) {\n setStatus('No HTML to serve');\n return;\n }\n\n setStatus('Preparing server...');\n let srv = serverRef.current;\n let url = serverUrl;\n let justStarted = false;\n\n if (!srv) {\n srv = new StitchViteServer();\n url = await srv.start(0);\n serverRef.current = srv;\n setServerUrl(url);\n justStarted = true;\n }\n\n if (!url) return; // Should not happen\n\n try {\n const html = await downloadText(screen.codeUrl);\n const route = `/screens/${screen.screenId}`;\n srv.mount(route, html);\n\n const fullUrl = `${url}${route}`;\n\n if (justStarted) {\n const start = (process.platform == 'darwin'? 'open': process.platform == 'win32'? 'start': 'xdg-open');\n if (process.platform === 'win32') {\n spawn('cmd', ['/c', 'start', fullUrl], { detached: true, stdio: 'ignore' }).unref();\n } else {\n spawn(start, [fullUrl], { detached: true, stdio: 'ignore' }).unref();\n }\n } else {\n srv.navigate(fullUrl);\n }\n setStatus(`Serving at ${fullUrl}`);\n } catch (e) {\n setStatus('Error serving screen');\n }\n }\n\n useInput((input, key) => {\n if (input === 'q') {\n exit();\n return;\n }\n\n if (key.upArrow || input === 'k') {\n setSelectedIndex(prev => Math.max(0, prev - 1));\n setStatus('');\n }\n\n if (key.downArrow || input === 'j') {\n setSelectedIndex(prev => Math.min(screens.length - 1, prev + 1));\n setStatus('');\n }\n\n // Copy code\n if (input === 'c') {\n const screen = screens[selectedIndex];\n if (screen?.hasCode && screen.codeUrl) {\n setStatus('Copying...');\n downloadText(screen.codeUrl)\n .then(code => {\n clipboard.write(code);\n setStatus('HTML copied!');\n })\n .catch(() => setStatus('Failed to copy'));\n } else {\n setStatus('No HTML available');\n }\n }\n\n // Copy image (placeholder)\n if (input === 'i') {\n const screen = screens[selectedIndex];\n if (screen?.hasImage) {\n setStatus('Image copy not implemented');\n } else {\n setStatus('No image available');\n }\n }\n\n // Serve\n if (input === 's') {\n const screen = screens[selectedIndex];\n if (screen) {\n serveScreen(screen);\n }\n }\n });\n\n const visibleScreens = screens.slice(windowStart, windowStart + VIEW_HEIGHT);\n\n return (\n <Box flexDirection=\"column\" padding={1}>\n {/* Header */}\n <Text bold>{projectTitle} ({screens.length} screens)</Text>\n <Text dimColor>projectId: {projectId}</Text>\n {serverUrl && <Text dimColor>Server: <Text color=\"green\">{serverUrl}</Text></Text>}\n <Text> </Text>\n\n {/* Screen List */}\n <Box flexDirection=\"column\" borderStyle=\"single\" borderColor=\"yellow\" paddingX={1}>\n {windowStart > 0 && <Text dimColor>... {windowStart} more above ...</Text>}\n\n {visibleScreens.map((screen, index) => {\n // Adjust index for absolute position\n const absoluteIndex = windowStart + index;\n const isSelected = absoluteIndex === selectedIndex;\n const num = String(absoluteIndex + 1).padStart(2, ' ');\n const selector = isSelected ? '▸' : ' ';\n\n return (\n <Box key={screen.screenId} flexDirection=\"column\">\n {/* Row 1: Title + Checkboxes */}\n <Box justifyContent=\"space-between\">\n <Box>\n <Text dimColor>{num}</Text>\n <Text color={isSelected ? 'cyan' : undefined}> {selector} </Text>\n <Text color={isSelected ? 'cyan' : undefined} bold={isSelected}>\n {screen.title.slice(0, 28)}\n </Text>\n </Box>\n <Box>\n <Text dimColor>html</Text>\n <Text color={screen.hasCode ? 'green' : 'gray'}>\n {screen.hasCode ? '[✓]' : '[ ]'}\n </Text>\n <Text> </Text>\n <Text dimColor>img</Text>\n <Text color={screen.hasImage ? 'green' : 'gray'}>\n {screen.hasImage ? '[✓]' : '[ ]'}\n </Text>\n </Box>\n </Box>\n {/* Row 2: screenId */}\n <Text dimColor color=\"gray\"> screenId: {screen.screenId}</Text>\n <Text> </Text>\n </Box>\n );\n })}\n\n {windowStart + VIEW_HEIGHT < screens.length && (\n <Text dimColor>... {screens.length - (windowStart + VIEW_HEIGHT)} more below ...</Text>\n )}\n </Box>\n\n {/* Footer */}\n <Text dimColor>[c]opy html [i]mage [s]erve [q]uit</Text>\n {status && <Text color=\"yellow\">{status}</Text>}\n </Box>\n );\n}\n"
6
+ ],
7
+ "mappings": "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",
8
+ "debugId": "D62549CBA4CF5F8B64756E2164756E21",
9
+ "names": []
10
+ }
@@ -0,0 +1,172 @@
1
+ import {
2
+ require_jsx_dev_runtime
3
+ } from "./chunk-wz8d5vzb.js";
4
+ import {
5
+ Box_default,
6
+ Text,
7
+ use_app_default,
8
+ use_input_default
9
+ } from "./chunk-2cetsfw4.js";
10
+ import {
11
+ require_react
12
+ } from "./chunk-4jwmvjb4.js";
13
+ import {
14
+ StitchViteServer
15
+ } from "./chunk-7xh1y383.js";
16
+ import"./chunk-w8q7nsm7.js";
17
+ import {
18
+ downloadText
19
+ } from "./chunk-4vxy1qce.js";
20
+ import"./chunk-384jmtpy.js";
21
+ import"./chunk-mv9ssgmx.js";
22
+ import"./chunk-4jygt4d6.js";
23
+ import"./chunk-tz7wnw4s.js";
24
+ import"./chunk-3sfn889r.js";
25
+ import {
26
+ __toESM
27
+ } from "./chunk-9wyra8hs.js";
28
+
29
+ // src/commands/serve/ServeView.tsx
30
+ var import_react = __toESM(require_react(), 1);
31
+ var jsx_dev_runtime = __toESM(require_jsx_dev_runtime(), 1);
32
+ import { spawn } from "child_process";
33
+ function ServeView({ projectId, projectTitle, screens }) {
34
+ const { exit } = use_app_default();
35
+ const [selectedIndex, setSelectedIndex] = import_react.useState(0);
36
+ const [serverUrl, setServerUrl] = import_react.useState(null);
37
+ const [status, setStatus] = import_react.useState("Starting server...");
38
+ const [server, setServer] = import_react.useState(null);
39
+ import_react.useEffect(() => {
40
+ const srv = new StitchViteServer;
41
+ setServer(srv);
42
+ let mounted = true;
43
+ async function init() {
44
+ try {
45
+ const url = await srv.start(0);
46
+ if (mounted)
47
+ setServerUrl(url);
48
+ await Promise.all(screens.map(async (screen) => {
49
+ try {
50
+ const html = await downloadText(screen.codeUrl);
51
+ srv.mount(`/screens/${screen.screenId}`, html);
52
+ } catch (e) {
53
+ console.error(`Failed to load ${screen.screenId}`);
54
+ }
55
+ }));
56
+ const indexHtml = `<!DOCTYPE html>
57
+ <html>
58
+ <head>
59
+ <title>${projectTitle}</title>
60
+ <style>
61
+ body { font-family: system-ui, sans-serif; max-width: 800px; margin: 40px auto; padding: 20px; background: #1a1a1a; color: #fff; }
62
+ ul { list-style: none; padding: 0; }
63
+ li { margin: 12px 0; padding: 16px; background: #252525; border-radius: 8px; }
64
+ a { color: #4fc3f7; text-decoration: none; font-size: 18px; display: block; }
65
+ a:hover { text-decoration: underline; }
66
+ </style>
67
+ </head>
68
+ <body>
69
+ <h1>${projectTitle}</h1>
70
+ <ul>
71
+ ${screens.map((s) => `<li>
72
+ <a href="/screens/${s.screenId}">${s.title}</a>
73
+ </li>`).join(`
74
+ `)}
75
+ </ul>
76
+ </body>
77
+ </html>`;
78
+ srv.mount("/", indexHtml);
79
+ if (mounted)
80
+ setStatus("Ready");
81
+ } catch (e) {
82
+ if (mounted)
83
+ setStatus(`Error: ${e.message}`);
84
+ }
85
+ }
86
+ init();
87
+ return () => {
88
+ mounted = false;
89
+ srv.stop();
90
+ };
91
+ }, []);
92
+ use_input_default((input, key) => {
93
+ if (input === "q") {
94
+ exit();
95
+ return;
96
+ }
97
+ if (key.upArrow || input === "k") {
98
+ setSelectedIndex((prev) => Math.max(0, prev - 1));
99
+ }
100
+ if (key.downArrow || input === "j") {
101
+ setSelectedIndex((prev) => Math.min(screens.length, prev + 1));
102
+ }
103
+ if (key.return && serverUrl) {
104
+ const start = process.platform == "darwin" ? "open" : process.platform == "win32" ? "start" : "xdg-open";
105
+ let target = serverUrl;
106
+ if (selectedIndex > 0) {
107
+ const screen = screens[selectedIndex - 1];
108
+ if (screen) {
109
+ target = `${serverUrl}/screens/${screen.screenId}`;
110
+ }
111
+ }
112
+ if (process.platform === "win32") {
113
+ spawn("cmd", ["/c", "start", target], { detached: true, stdio: "ignore" }).unref();
114
+ } else {
115
+ spawn(start, [target], { detached: true, stdio: "ignore" }).unref();
116
+ }
117
+ }
118
+ });
119
+ return /* @__PURE__ */ jsx_dev_runtime.jsxDEV(Box_default, {
120
+ flexDirection: "column",
121
+ padding: 1,
122
+ children: [
123
+ /* @__PURE__ */ jsx_dev_runtime.jsxDEV(Text, {
124
+ bold: true,
125
+ children: projectTitle
126
+ }, undefined, false, undefined, this),
127
+ /* @__PURE__ */ jsx_dev_runtime.jsxDEV(Text, {
128
+ color: "green",
129
+ children: serverUrl || "Starting..."
130
+ }, undefined, false, undefined, this),
131
+ /* @__PURE__ */ jsx_dev_runtime.jsxDEV(Text, {
132
+ children: status
133
+ }, undefined, false, undefined, this),
134
+ /* @__PURE__ */ jsx_dev_runtime.jsxDEV(Box_default, {
135
+ marginTop: 1,
136
+ flexDirection: "column",
137
+ children: [
138
+ /* @__PURE__ */ jsx_dev_runtime.jsxDEV(Text, {
139
+ color: selectedIndex === 0 ? "cyan" : undefined,
140
+ children: [
141
+ selectedIndex === 0 ? "> " : " ",
142
+ " Index (/)"
143
+ ]
144
+ }, undefined, true, undefined, this),
145
+ screens.map((s, i) => /* @__PURE__ */ jsx_dev_runtime.jsxDEV(Text, {
146
+ color: selectedIndex === i + 1 ? "cyan" : undefined,
147
+ children: [
148
+ selectedIndex === i + 1 ? "> " : " ",
149
+ " ",
150
+ s.title,
151
+ " (/screens/",
152
+ s.screenId,
153
+ ")"
154
+ ]
155
+ }, s.screenId, true, undefined, this))
156
+ ]
157
+ }, undefined, true, undefined, this),
158
+ /* @__PURE__ */ jsx_dev_runtime.jsxDEV(Box_default, {
159
+ marginTop: 1,
160
+ children: /* @__PURE__ */ jsx_dev_runtime.jsxDEV(Text, {
161
+ dimColor: true,
162
+ children: "[Enter] Open | [q] Quit"
163
+ }, undefined, false, undefined, this)
164
+ }, undefined, false, undefined, this)
165
+ ]
166
+ }, undefined, true, undefined, this);
167
+ }
168
+ export {
169
+ ServeView
170
+ };
171
+
172
+ //# debugId=F724BF91C05C95AB64756E2164756E21
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/commands/serve/ServeView.tsx"],
4
+ "sourcesContent": [
5
+ "import React, { useState, useEffect } from 'react';\nimport { Box, Text, useInput, useApp } from 'ink';\nimport { StitchViteServer } from '../../lib/server/vite/StitchViteServer.js';\nimport { downloadText } from '../../ui/copy-behaviors/clipboard.js';\nimport { spawn } from 'child_process';\n\ninterface CodeScreen {\n screenId: string;\n title: string;\n codeUrl: string;\n}\n\ninterface ServeViewProps {\n projectId: string;\n projectTitle: string;\n screens: CodeScreen[];\n}\n\nexport function ServeView({ projectId, projectTitle, screens }: ServeViewProps) {\n const { exit } = useApp();\n const [selectedIndex, setSelectedIndex] = useState(0);\n const [serverUrl, setServerUrl] = useState<string | null>(null);\n const [status, setStatus] = useState('Starting server...');\n const [server, setServer] = useState<StitchViteServer | null>(null);\n\n useEffect(() => {\n const srv = new StitchViteServer();\n setServer(srv);\n let mounted = true;\n\n async function init() {\n try {\n const url = await srv.start(0);\n if (mounted) setServerUrl(url);\n\n // Fetch and mount screens\n await Promise.all(screens.map(async (screen) => {\n try {\n const html = await downloadText(screen.codeUrl);\n srv.mount(`/screens/${screen.screenId}`, html);\n } catch (e) {\n console.error(`Failed to load ${screen.screenId}`);\n }\n }));\n\n // Generate Index\n const indexHtml = `<!DOCTYPE html>\n<html>\n<head>\n <title>${projectTitle}</title>\n <style>\n body { font-family: system-ui, sans-serif; max-width: 800px; margin: 40px auto; padding: 20px; background: #1a1a1a; color: #fff; }\n ul { list-style: none; padding: 0; }\n li { margin: 12px 0; padding: 16px; background: #252525; border-radius: 8px; }\n a { color: #4fc3f7; text-decoration: none; font-size: 18px; display: block; }\n a:hover { text-decoration: underline; }\n </style>\n</head>\n<body>\n <h1>${projectTitle}</h1>\n <ul>\n ${screens.map(s => `<li>\n <a href=\"/screens/${s.screenId}\">${s.title}</a>\n </li>`).join('\\n')}\n </ul>\n</body>\n</html>`;\n srv.mount('/', indexHtml);\n\n if (mounted) setStatus('Ready');\n } catch (e: any) {\n if (mounted) setStatus(`Error: ${e.message}`);\n }\n }\n\n init();\n\n return () => {\n mounted = false;\n srv.stop();\n };\n }, []);\n\n useInput((input, key) => {\n if (input === 'q') {\n exit();\n return;\n }\n\n if (key.upArrow || input === 'k') {\n setSelectedIndex(prev => Math.max(0, prev - 1));\n }\n if (key.downArrow || input === 'j') {\n setSelectedIndex(prev => Math.min(screens.length, prev + 1));\n }\n\n if (key.return && serverUrl) {\n const start = (process.platform == 'darwin'? 'open': process.platform == 'win32'? 'start': 'xdg-open');\n let target = serverUrl;\n if (selectedIndex > 0) {\n const screen = screens[selectedIndex - 1];\n if (screen) {\n target = `${serverUrl}/screens/${screen.screenId}`;\n }\n }\n if (process.platform === 'win32') {\n spawn('cmd', ['/c', 'start', target], { detached: true, stdio: 'ignore' }).unref();\n } else {\n spawn(start, [target], { detached: true, stdio: 'ignore' }).unref();\n }\n }\n });\n\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Text bold>{projectTitle}</Text>\n <Text color=\"green\">{serverUrl || 'Starting...'}</Text>\n <Text>{status}</Text>\n <Box marginTop={1} flexDirection=\"column\">\n <Text color={selectedIndex === 0 ? 'cyan' : undefined}>\n {selectedIndex === 0 ? '> ' : ' '} Index (/)\n </Text>\n {screens.map((s, i) => (\n <Text key={s.screenId} color={selectedIndex === i + 1 ? 'cyan' : undefined}>\n {selectedIndex === i + 1 ? '> ' : ' '} {s.title} (/screens/{s.screenId})\n </Text>\n ))}\n </Box>\n <Box marginTop={1}>\n <Text dimColor>[Enter] Open | [q] Quit</Text>\n </Box>\n </Box>\n );\n}\n"
6
+ ],
7
+ "mappings": "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",
8
+ "debugId": "F724BF91C05C95AB64756E2164756E21",
9
+ "names": []
10
+ }