@_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.
- package/dist/{chunk-hb3c6f6a.js → chunk-001yk06v.js} +2 -2
- package/dist/chunk-0cd2xak4.js +31447 -0
- package/dist/chunk-0cd2xak4.js.map +245 -0
- package/dist/{chunk-9tvppjaf.js → chunk-13mqag7n.js} +8 -10
- package/dist/{chunk-9tvppjaf.js.map → chunk-13mqag7n.js.map} +2 -2
- package/dist/chunk-1dcffh2w.js +1481 -0
- package/dist/chunk-1dcffh2w.js.map +23 -0
- package/dist/{chunk-985f11w6.js → chunk-26cgk4dt.js} +6 -8
- package/dist/{chunk-8yrtq2qs.js.map → chunk-26cgk4dt.js.map} +1 -1
- package/dist/chunk-2kg77g4q.js +167 -0
- package/dist/chunk-2kg77g4q.js.map +10 -0
- package/dist/chunk-34w2wfyp.js +68 -0
- package/dist/chunk-34w2wfyp.js.map +10 -0
- package/dist/chunk-44tn9dxb.js +19 -0
- package/dist/{chunk-985f11w6.js.map → chunk-44tn9dxb.js.map} +1 -1
- package/dist/chunk-5204d23a.js +24 -0
- package/dist/{chunk-ezmw2j8c.js.map → chunk-5204d23a.js.map} +1 -1
- package/dist/{chunk-mv9ssgmx.js → chunk-54wv5ptt.js} +5 -5
- package/dist/{chunk-mv9ssgmx.js.map → chunk-54wv5ptt.js.map} +2 -2
- package/dist/chunk-5dghg77b.js +16970 -0
- package/dist/chunk-5dghg77b.js.map +26 -0
- package/dist/{chunk-r2sg2nxa.js → chunk-5f2htt6r.js} +6 -7
- package/dist/chunk-5f2htt6r.js.map +9 -0
- package/dist/chunk-6gw9apqb.js +20 -0
- package/dist/chunk-6gw9apqb.js.map +10 -0
- package/dist/chunk-7bt2055x.js +39 -0
- package/dist/chunk-7bt2055x.js.map +10 -0
- package/dist/chunk-7egq85x5.js +273 -0
- package/dist/chunk-7egq85x5.js.map +10 -0
- package/dist/chunk-7pf2vfq9.js +69 -0
- package/dist/chunk-7pf2vfq9.js.map +10 -0
- package/dist/{chunk-q1nd6g0y.js → chunk-7rrhk07q.js} +76 -53
- package/dist/chunk-7rrhk07q.js.map +20 -0
- package/dist/{chunk-7xh1y383.js → chunk-7xsar3mr.js} +2 -2
- package/dist/{chunk-7xh1y383.js.map → chunk-7xsar3mr.js.map} +1 -1
- package/dist/chunk-7y4xzvkz.js +19132 -0
- package/dist/chunk-7y4xzvkz.js.map +115 -0
- package/dist/chunk-7zy0vdv5.js +761 -0
- package/dist/chunk-7zy0vdv5.js.map +18 -0
- package/dist/chunk-8rt3pp6g.js +256 -0
- package/dist/{chunk-jy2d17pr.js.map → chunk-8rt3pp6g.js.map} +3 -3
- package/dist/chunk-98trrxk2.js +40 -0
- package/dist/chunk-98trrxk2.js.map +10 -0
- package/dist/chunk-a1mk24q9.js +31326 -0
- package/dist/chunk-a1mk24q9.js.map +245 -0
- package/dist/chunk-a5xra9jn.js +159 -0
- package/dist/chunk-a5xra9jn.js.map +11 -0
- package/dist/chunk-abf1r0jh.js +2118 -0
- package/dist/chunk-abf1r0jh.js.map +44 -0
- package/dist/{chunk-25wakzyb.js → chunk-ahw5kfbr.js} +5 -5
- package/dist/chunk-akd997ec.js +11061 -0
- package/dist/chunk-akd997ec.js.map +238 -0
- package/dist/chunk-by28t333.js +19 -0
- package/dist/chunk-by28t333.js.map +9 -0
- package/dist/{chunk-2k7n0w2x.js → chunk-c6ge431q.js} +2 -2
- package/dist/{chunk-2k7n0w2x.js.map → chunk-c6ge431q.js.map} +1 -1
- package/dist/{chunk-ycfxp056.js → chunk-cnmspfhx.js} +7 -11
- package/dist/chunk-cnmspfhx.js.map +17 -0
- package/dist/chunk-cwqdka8y.js +6382 -0
- package/dist/chunk-cwqdka8y.js.map +109 -0
- package/dist/chunk-dffwrtn3.js +673 -0
- package/dist/chunk-dffwrtn3.js.map +17 -0
- package/dist/chunk-dyp9t5wf.js +44109 -0
- package/dist/chunk-dyp9t5wf.js.map +237 -0
- package/dist/chunk-e9881zy4.js +39 -0
- package/dist/chunk-e9881zy4.js.map +10 -0
- package/dist/chunk-ezs0qz0b.js +24 -0
- package/dist/chunk-ezs0qz0b.js.map +9 -0
- package/dist/chunk-f6cq8r7x.js +736 -0
- package/dist/chunk-f6cq8r7x.js.map +16 -0
- package/dist/{chunk-45wx7tn7.js → chunk-gwnmywrp.js} +2 -2
- package/dist/chunk-gz78f003.js +94 -0
- package/dist/chunk-gz78f003.js.map +10 -0
- package/dist/chunk-j0y94q2c.js +10 -0
- package/dist/{chunk-nthabjd9.js → chunk-jyem6j6k.js} +1848 -3
- package/dist/chunk-jyem6j6k.js.map +65 -0
- package/dist/chunk-kad4d9sf.js +11 -0
- package/dist/chunk-kad4d9sf.js.map +9 -0
- package/dist/{chunk-wz8d5vzb.js → chunk-krfqppg2.js} +32 -2
- package/dist/{chunk-wz8d5vzb.js.map → chunk-krfqppg2.js.map} +5 -4
- package/dist/chunk-kw62yeqn.js +124 -0
- package/dist/chunk-kw62yeqn.js.map +12 -0
- package/dist/chunk-mbt1wx7n.js +43 -0
- package/dist/chunk-mbt1wx7n.js.map +10 -0
- package/dist/chunk-nzv6abbc.js +22 -0
- package/dist/chunk-nzv6abbc.js.map +9 -0
- package/dist/{chunk-cwkb2wbe.js → chunk-pjpdhh0f.js} +27 -24
- package/dist/chunk-pjpdhh0f.js.map +16 -0
- package/dist/chunk-py8fhw0k.js +941 -0
- package/dist/chunk-py8fhw0k.js.map +27 -0
- package/dist/chunk-q6sv0243.js +93 -0
- package/dist/chunk-q6sv0243.js.map +13 -0
- package/dist/chunk-r8n5m3xq.js +19 -0
- package/dist/chunk-r8n5m3xq.js.map +9 -0
- package/dist/{chunk-nxpzt33t.js → chunk-rcwtjara.js} +8 -13
- package/dist/chunk-rcwtjara.js.map +10 -0
- package/dist/{chunk-t85nbjjb.js → chunk-rfrcdsfc.js} +5 -9
- package/dist/chunk-rfrcdsfc.js.map +10 -0
- package/dist/chunk-rj2gqxxb.js +415 -0
- package/dist/chunk-rj2gqxxb.js.map +20 -0
- package/dist/{chunk-v7117ywx.js → chunk-rvq1vb70.js} +5 -7
- package/dist/{chunk-v7117ywx.js.map → chunk-rvq1vb70.js.map} +2 -2
- package/dist/chunk-smvqara3.js +370 -0
- package/dist/chunk-smvqara3.js.map +16 -0
- package/dist/{chunk-pfyjtfex.js → chunk-sp8zjpbf.js} +7 -12
- package/dist/chunk-sp8zjpbf.js.map +10 -0
- package/dist/{chunk-48d17n29.js → chunk-ssbg48ec.js} +1 -1
- package/dist/chunk-ssbg48ec.js.map +9 -0
- package/dist/chunk-st7q66e5.js +109 -0
- package/dist/chunk-st7q66e5.js.map +10 -0
- package/dist/{chunk-sdp429xd.js → chunk-sw7h7asn.js} +32 -8
- package/dist/chunk-sw7h7asn.js.map +27 -0
- package/dist/chunk-t092ehvp.js +50 -0
- package/dist/chunk-t092ehvp.js.map +9 -0
- package/dist/{chunk-2cetsfw4.js → chunk-t0xqfse1.js} +50 -9
- package/dist/{chunk-2cetsfw4.js.map → chunk-t0xqfse1.js.map} +8 -3
- package/dist/chunk-v1t5vys5.js +124 -0
- package/dist/chunk-v1t5vys5.js.map +12 -0
- package/dist/chunk-v78rg840.js +137 -0
- package/dist/chunk-v78rg840.js.map +10 -0
- package/dist/chunk-v7xskyzm.js +19 -0
- package/dist/chunk-v7xskyzm.js.map +9 -0
- package/dist/{chunk-jy2d17pr.js → chunk-vjshqjmh.js} +12 -8
- package/dist/chunk-vjshqjmh.js.map +11 -0
- package/dist/chunk-w8075wyx.js +40 -0
- package/dist/chunk-w8075wyx.js.map +10 -0
- package/dist/chunk-wn8mek6a.js +189 -0
- package/dist/chunk-wn8mek6a.js.map +11 -0
- package/dist/{chunk-2kyqsrg2.js → chunk-y447ymks.js} +364 -3
- package/dist/chunk-y447ymks.js.map +18 -0
- package/dist/chunk-yej34vkc.js +247 -0
- package/dist/chunk-yej34vkc.js.map +14 -0
- package/dist/commands/doctor/command.js +2 -2
- package/dist/commands/init/command.js +2 -2
- package/dist/commands/logout/command.js +2 -2
- package/dist/commands/proxy/command.js +4 -5
- package/dist/commands/proxy/command.js.map +3 -3
- package/dist/commands/proxy/handler.d.ts +27 -5
- package/dist/commands/registry.d.ts +2 -0
- package/dist/commands/screens/ScreensView.d.ts +1 -3
- package/dist/commands/screens/command.js +8 -10
- package/dist/commands/screens/command.js.map +3 -3
- package/dist/commands/screens/handler.d.ts +5 -6
- package/dist/commands/serve/command.js +60 -10
- package/dist/commands/serve/command.js.map +7 -5
- package/dist/commands/serve/handler.d.ts +6 -21
- package/dist/commands/serve/json-server/handler.d.ts +8 -0
- package/dist/commands/serve/json-server/spec.d.ts +32 -0
- package/dist/commands/serve/list-screens/handler.d.ts +7 -0
- package/dist/commands/serve/list-screens/spec.d.ts +33 -0
- package/dist/commands/serve/spec.d.ts +30 -0
- package/dist/commands/site/command.js +12 -6
- package/dist/commands/site/command.js.map +4 -4
- package/dist/commands/site/generate/handler.d.ts +8 -0
- package/dist/commands/site/generate/spec.d.ts +44 -0
- package/dist/commands/site/hooks/useProjectHydration.d.ts +2 -2
- package/dist/commands/site/index.d.ts +5 -3
- package/dist/commands/site/list-screens/handler.d.ts +7 -0
- package/dist/commands/site/list-screens/spec.d.ts +33 -0
- package/dist/commands/site/spec.d.ts +6 -0
- package/dist/commands/site/ui/SiteBuilder.d.ts +2 -2
- package/dist/commands/site/utils/fetchWithRetry.d.ts +10 -0
- package/dist/commands/site/utils/suggestRoute.d.ts +1 -0
- package/dist/commands/snapshot/command.js +2 -2
- package/dist/commands/tool/command.js +2 -2
- package/dist/commands/tool/command.js.map +2 -2
- package/dist/commands/tool/context.d.ts +3 -2
- package/dist/commands/tool/handler.d.ts +9 -10
- package/dist/commands/tool/spec.d.ts +3 -2
- package/dist/commands/view/command.js +2 -2
- package/dist/index.js +11 -13
- package/dist/index.js.map +1 -1
- package/dist/platform/browser.d.ts +8 -0
- package/dist/services/mcp-client/client.d.ts +5 -0
- package/dist/services/mcp-client/spec.d.ts +6 -6
- package/dist/services/proxy/spec.d.ts +3 -3
- package/dist/services/stitch-sdk/MockStitchSDK.d.ts +18 -0
- package/dist/services/view/handler.d.ts +3 -3
- package/dist/ui/copy-behaviors/index.d.ts +8 -0
- package/dist/ui/navigation-behaviors/index.d.ts +34 -0
- package/dist/ui/serve-behaviors/index.d.ts +7 -0
- package/package.json +2 -1
- package/dist/chunk-2fcdwvrm.js +0 -54
- package/dist/chunk-2fcdwvrm.js.map +0 -10
- package/dist/chunk-2kyqsrg2.js.map +0 -10
- package/dist/chunk-8yrtq2qs.js +0 -18
- package/dist/chunk-cwkb2wbe.js.map +0 -16
- package/dist/chunk-djhzzcgj.js +0 -362
- package/dist/chunk-djhzzcgj.js.map +0 -13
- package/dist/chunk-ezmw2j8c.js +0 -14
- package/dist/chunk-fwb4fnkp.js +0 -31
- package/dist/chunk-fwb4fnkp.js.map +0 -10
- package/dist/chunk-h18jrqed.js +0 -9517
- package/dist/chunk-h18jrqed.js.map +0 -99
- package/dist/chunk-knbnsf6s.js +0 -92
- package/dist/chunk-knbnsf6s.js.map +0 -10
- package/dist/chunk-nthabjd9.js.map +0 -34
- package/dist/chunk-nxpzt33t.js.map +0 -10
- package/dist/chunk-pfyjtfex.js.map +0 -10
- package/dist/chunk-q1nd6g0y.js.map +0 -20
- package/dist/chunk-q4js8r0z.js +0 -4708
- package/dist/chunk-q4js8r0z.js.map +0 -29
- package/dist/chunk-qv44tmn6.js +0 -289
- package/dist/chunk-qv44tmn6.js.map +0 -13
- package/dist/chunk-r2sg2nxa.js.map +0 -9
- package/dist/chunk-rpxnm86e.js +0 -372
- package/dist/chunk-rpxnm86e.js.map +0 -17
- package/dist/chunk-sdp429xd.js.map +0 -24
- package/dist/chunk-t85nbjjb.js.map +0 -10
- package/dist/chunk-wa64nz8b.js +0 -47
- package/dist/chunk-wa64nz8b.js.map +0 -10
- package/dist/chunk-ycfxp056.js.map +0 -17
- package/dist/chunk-z9d2xc83.js +0 -3256
- package/dist/chunk-z9d2xc83.js.map +0 -84
- package/dist/services/config/handler.d.ts +0 -12
- package/dist/services/config/spec.d.ts +0 -82
- package/dist/src/cli.d.ts +0 -1
- package/dist/src/commands/doctor/handler.d.ts +0 -9
- package/dist/src/commands/doctor/handler.test.d.ts +0 -1
- package/dist/src/commands/doctor/spec.d.ts +0 -130
- package/dist/src/commands/doctor/spec.test.d.ts +0 -1
- package/dist/src/commands/init/handler.d.ts +0 -17
- package/dist/src/commands/init/handler.test.d.ts +0 -1
- package/dist/src/commands/init/spec.d.ts +0 -88
- package/dist/src/commands/init/spec.test.d.ts +0 -1
- package/dist/src/commands/proxy/handler.d.ts +0 -7
- package/dist/src/commands/proxy/handler.test.d.ts +0 -1
- package/dist/src/index.d.ts +0 -13
- package/dist/src/platform/detector.d.ts +0 -29
- package/dist/src/platform/paths.d.ts +0 -20
- package/dist/src/platform/shell.d.ts +0 -26
- package/dist/src/services/gcloud/handler.d.ts +0 -48
- package/dist/src/services/gcloud/handler.test.d.ts +0 -1
- package/dist/src/services/gcloud/spec.d.ts +0 -405
- package/dist/src/services/mcp-config/handler.d.ts +0 -12
- package/dist/src/services/mcp-config/handler.test.d.ts +0 -1
- package/dist/src/services/mcp-config/spec.d.ts +0 -88
- package/dist/src/services/mcp-config/spec.test.d.ts +0 -1
- package/dist/src/services/project/handler.d.ts +0 -11
- package/dist/src/services/project/handler.test.d.ts +0 -1
- package/dist/src/services/project/spec.d.ts +0 -86
- package/dist/src/services/project/spec.test.d.ts +0 -1
- package/dist/src/services/proxy/handler.d.ts +0 -15
- package/dist/src/services/proxy/handler.test.d.ts +0 -1
- package/dist/src/services/proxy/spec.d.ts +0 -83
- package/dist/src/services/proxy/spec.test.d.ts +0 -1
- package/dist/src/services/stitch/handler.d.ts +0 -15
- package/dist/src/services/stitch/handler.test.d.ts +0 -1
- package/dist/src/services/stitch/spec.d.ts +0 -262
- package/dist/src/services/stitch/spec.test.d.ts +0 -1
- package/dist/src/ui/spinner.d.ts +0 -11
- package/dist/src/ui/theme.d.ts +0 -18
- package/dist/src/ui/wizard.d.ts +0 -24
- package/dist/tests/mocks/shell.d.ts +0 -2
- /package/dist/{chunk-hb3c6f6a.js.map → chunk-001yk06v.js.map} +0 -0
- /package/dist/{chunk-25wakzyb.js.map → chunk-ahw5kfbr.js.map} +0 -0
- /package/dist/{chunk-45wx7tn7.js.map → chunk-gwnmywrp.js.map} +0 -0
- /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
|
-
|
|
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=
|
|
764
|
+
//# debugId=FC4010CB548913D964756E2164756E21
|