@skybridge/devtools 0.0.0-dev.f9be176 → 0.0.0-dev.f9c577b

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.
@@ -0,0 +1,7 @@
1
+ import { type Router } from "express";
2
+ /**
3
+ * Dev-only router that drives the devtools Deploy button. Runs `@alpic-ai/sdk`
4
+ * in-process (no CLI spawning): `/status` is a plain request, deploy progress
5
+ * streams over SSE at `/events`.
6
+ */
7
+ export declare function createDeployRouter(): Router;
@@ -0,0 +1,206 @@
1
+ import express, {} from "express";
2
+ import { alpic } from "./alpic-sdk.js";
3
+ const errMessage = (err, fallback) => err instanceof Error ? err.message : fallback;
4
+ /**
5
+ * Dev-only router that drives the devtools Deploy button. Runs `@alpic-ai/sdk`
6
+ * in-process (no CLI spawning): `/status` is a plain request, deploy progress
7
+ * streams over SSE at `/events`.
8
+ */
9
+ export function createDeployRouter() {
10
+ const router = express.Router();
11
+ let state = { status: "idle" };
12
+ const subscribers = new Set();
13
+ const write = (res, s) => {
14
+ res.write(`event: state\ndata: ${JSON.stringify(s)}\n\n`);
15
+ };
16
+ const setState = (s) => {
17
+ state = s;
18
+ for (const res of subscribers) {
19
+ write(res, s);
20
+ }
21
+ };
22
+ const runDeploy = async (environmentId, teamId) => {
23
+ const startedAt = Date.now();
24
+ setState({ status: "deploying", startedAt, deploymentPageUrl: null });
25
+ let pageUrl = null;
26
+ try {
27
+ const result = await alpic.deployments.deploy({
28
+ environmentId,
29
+ teamId,
30
+ onProgress: (event) => {
31
+ if (event.type === "deploying" && event.deploymentPageUrl) {
32
+ pageUrl = event.deploymentPageUrl;
33
+ }
34
+ setState({
35
+ status: "deploying",
36
+ startedAt,
37
+ deploymentPageUrl: pageUrl,
38
+ });
39
+ },
40
+ });
41
+ if (result.status === "deployed") {
42
+ setState({
43
+ status: "deployed",
44
+ mcpServerUrl: result.mcpServerUrl,
45
+ deploymentPageUrl: result.deploymentPageUrl,
46
+ });
47
+ }
48
+ else {
49
+ setState({
50
+ status: "failed",
51
+ message: `Deployment ${result.status}.`,
52
+ deploymentPageUrl: result.deploymentPageUrl,
53
+ });
54
+ }
55
+ }
56
+ catch (err) {
57
+ setState({
58
+ status: "failed",
59
+ message: errMessage(err, "Deployment failed"),
60
+ deploymentPageUrl: pageUrl,
61
+ });
62
+ }
63
+ };
64
+ router.get("/__skybridge/deploy/status", async (_req, res) => {
65
+ try {
66
+ const whoami = await alpic.whoami();
67
+ if (whoami.method === "unauthenticated") {
68
+ res.json({ state: "signedOut" });
69
+ return;
70
+ }
71
+ const loaded = alpic.projects.loadConfig();
72
+ const cfg = loaded && (await alpic.projects.validateLink(loaded));
73
+ const staleConfig = loaded !== null && cfg === null;
74
+ if (!cfg) {
75
+ const teams = await alpic.api.teams.list.v1();
76
+ const team = teams[0];
77
+ if (!team) {
78
+ res.json({ state: "noTeam" });
79
+ return;
80
+ }
81
+ res.json({
82
+ state: "needsProject",
83
+ teams,
84
+ defaultTeamId: team.id,
85
+ staleConfig,
86
+ });
87
+ return;
88
+ }
89
+ let lastDeployGit = null;
90
+ let lastDeployStatus;
91
+ let lastDeployStartedAt;
92
+ let mcpServerUrl;
93
+ let deploymentPageUrl = null;
94
+ if (cfg.environmentId) {
95
+ try {
96
+ const latest = await alpic.deployments.getLatestForEnvironment(cfg.environmentId);
97
+ if (latest.sourceCommitId !== null) {
98
+ lastDeployGit = {
99
+ ref: latest.sourceRef,
100
+ commitMessage: latest.sourceCommitMessage,
101
+ author: latest.authorUsername,
102
+ };
103
+ }
104
+ lastDeployStatus = latest.status;
105
+ lastDeployStartedAt = latest.startedAt?.getTime();
106
+ deploymentPageUrl = latest.deploymentPageUrl;
107
+ if (latest.status === "deployed") {
108
+ const environment = await alpic.api.environments.get.v1({
109
+ environmentId: cfg.environmentId,
110
+ });
111
+ mcpServerUrl = environment.mcpServerUrl;
112
+ }
113
+ }
114
+ catch {
115
+ // no deployments yet — leave defaults
116
+ }
117
+ }
118
+ res.json({
119
+ state: "ready",
120
+ lastDeployGit,
121
+ lastDeployStatus,
122
+ lastDeployStartedAt,
123
+ mcpServerUrl,
124
+ deploymentPageUrl,
125
+ });
126
+ }
127
+ catch (err) {
128
+ res.status(502).json({
129
+ state: "error",
130
+ message: errMessage(err, "Alpic API unavailable"),
131
+ });
132
+ }
133
+ });
134
+ router.post("/__skybridge/deploy/project", async (req, res) => {
135
+ if (state.status === "deploying") {
136
+ res.status(409).json({ message: "A deployment is already in progress." });
137
+ return;
138
+ }
139
+ const name = typeof req.body?.name === "string" ? req.body.name.trim() : "";
140
+ const teamId = typeof req.body?.teamId === "string" ? req.body.teamId : "";
141
+ const teamName = typeof req.body?.teamName === "string" ? req.body.teamName : undefined;
142
+ if (!name || !teamId) {
143
+ res.status(400).json({ message: "name and teamId are required." });
144
+ return;
145
+ }
146
+ try {
147
+ const existing = await alpic.api.projects.list.v1({ teamId });
148
+ if (existing.some((p) => p.name === name)) {
149
+ res
150
+ .status(409)
151
+ .json({ message: `A project named "${name}" already exists.` });
152
+ return;
153
+ }
154
+ const cfg = await alpic.projects.createLinked({
155
+ name,
156
+ teamId,
157
+ teamName,
158
+ runtime: alpic.projects.detectRuntime() ?? "node24",
159
+ });
160
+ res.status(202).json({ ok: true });
161
+ void runDeploy(cfg.environmentId, cfg.teamId);
162
+ }
163
+ catch (err) {
164
+ res.status(502).json({
165
+ message: errMessage(err, "Failed to create project"),
166
+ });
167
+ }
168
+ });
169
+ router.post("/__skybridge/deploy/login", async (_req, res) => {
170
+ try {
171
+ await alpic.auth.login();
172
+ res.json({ ok: true });
173
+ }
174
+ catch (err) {
175
+ res.status(502).json({
176
+ message: errMessage(err, "Sign-in failed"),
177
+ });
178
+ }
179
+ });
180
+ router.post("/__skybridge/deploy", (_req, res) => {
181
+ if (state.status === "deploying") {
182
+ res.status(409).json({ message: "A deployment is already in progress." });
183
+ return;
184
+ }
185
+ const cfg = alpic.projects.loadConfig();
186
+ if (!cfg?.environmentId) {
187
+ res.status(409).json({ message: "No linked project to redeploy." });
188
+ return;
189
+ }
190
+ res.status(202).json({ ok: true });
191
+ void runDeploy(cfg.environmentId, cfg.teamId);
192
+ });
193
+ router.get("/__skybridge/deploy/events", (req, res) => {
194
+ res.setHeader("Content-Type", "text/event-stream");
195
+ res.setHeader("Cache-Control", "no-cache, no-transform");
196
+ res.setHeader("Connection", "keep-alive");
197
+ res.flushHeaders?.();
198
+ write(res, state);
199
+ subscribers.add(res);
200
+ req.on("close", () => {
201
+ subscribers.delete(res);
202
+ });
203
+ });
204
+ return router;
205
+ }
206
+ //# sourceMappingURL=deploy-router.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deploy-router.js","sourceRoot":"","sources":["../src/deploy-router.ts"],"names":[],"mappings":"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"}
@@ -9,8 +9,8 @@ import { type Router } from "express";
9
9
  *
10
10
  * if (env.NODE_ENV !== "production") {
11
11
  * app.use(await devtoolsStaticServer(server));
12
- * app.use(await widgetsDevServer());
13
- * ^^^^^^^^ Make sure to install the devtoolsStaticServer before the widgetsDevServer
12
+ * app.use(await viewsDevServer());
13
+ * ^^^^^^^^ Make sure to install the devtoolsStaticServer before the viewsDevServer
14
14
  * }
15
15
  */
16
16
  export declare const devtoolsStaticServer: () => Promise<Router>;
@@ -2,6 +2,20 @@ import path from "node:path";
2
2
  import { fileURLToPath } from "node:url";
3
3
  import cors from "cors";
4
4
  import express, {} from "express";
5
+ import { createDeployRouter } from "./deploy-router.js";
6
+ const detectPackageManager = () => {
7
+ const userAgent = process.env.npm_config_user_agent ?? "";
8
+ if (userAgent.startsWith("pnpm")) {
9
+ return "pnpm";
10
+ }
11
+ if (userAgent.startsWith("yarn")) {
12
+ return "yarn";
13
+ }
14
+ if (userAgent.startsWith("bun")) {
15
+ return "bun";
16
+ }
17
+ return "npm";
18
+ };
5
19
  /**
6
20
  * Serve the built devtools React app
7
21
  * This router serves static files from the devtools's dist directory.
@@ -12,14 +26,18 @@ import express, {} from "express";
12
26
  *
13
27
  * if (env.NODE_ENV !== "production") {
14
28
  * app.use(await devtoolsStaticServer(server));
15
- * app.use(await widgetsDevServer());
16
- * ^^^^^^^^ Make sure to install the devtoolsStaticServer before the widgetsDevServer
29
+ * app.use(await viewsDevServer());
30
+ * ^^^^^^^^ Make sure to install the devtoolsStaticServer before the viewsDevServer
17
31
  * }
18
32
  */
19
33
  export const devtoolsStaticServer = async () => {
20
34
  const router = express.Router();
21
35
  const distDir = path.dirname(fileURLToPath(import.meta.url));
22
36
  router.use(cors());
37
+ router.get("/__skybridge/devtools/project", (_req, res) => {
38
+ res.json({ packageManager: detectPackageManager() });
39
+ });
40
+ router.use(createDeployRouter());
23
41
  router.use(express.static(distDir));
24
42
  router.get("/", (_req, res, next) => {
25
43
  const indexHtmlPath = path.join(distDir, "index.html");
@@ -1 +1 @@
1
- {"version":3,"file":"devtoolsStaticServer.js","sourceRoot":"","sources":["../src/devtoolsStaticServer.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,OAAO,EAAE,EAAe,MAAM,SAAS,CAAC;AAE/C;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,KAAK,IAAqB,EAAE;IAC9D,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAEhC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAE7D,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;IACnB,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;IACpC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QAClC,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;QACvD,GAAG,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAC,KAAK,EAAE,EAAE;YACpC,IAAI,KAAK,EAAE,CAAC;gBACV,IAAI,CAAC,KAAK,CAAC,CAAC;YACd,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC"}
1
+ {"version":3,"file":"devtoolsStaticServer.js","sourceRoot":"","sources":["../src/devtoolsStaticServer.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,OAAO,EAAE,EAAe,MAAM,SAAS,CAAC;AAC/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAIxD,MAAM,oBAAoB,GAAG,GAAmB,EAAE;IAChD,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,EAAE,CAAC;IAC1D,IAAI,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QACjC,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,IAAI,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QACjC,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,IAAI,SAAS,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;QAChC,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AAEF;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,KAAK,IAAqB,EAAE;IAC9D,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAEhC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAE7D,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;IACnB,MAAM,CAAC,GAAG,CAAC,+BAA+B,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;QACxD,GAAG,CAAC,IAAI,CAAC,EAAE,cAAc,EAAE,oBAAoB,EAAE,EAAE,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IACH,MAAM,CAAC,GAAG,CAAC,kBAAkB,EAAE,CAAC,CAAC;IACjC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;IACpC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QAClC,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;QACvD,GAAG,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAC,KAAK,EAAE,EAAE;YACpC,IAAI,KAAK,EAAE,CAAC;gBACV,IAAI,CAAC,KAAK,CAAC,CAAC;YACd,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC"}
package/dist/favicon.ico CHANGED
Binary file
package/dist/index.html CHANGED
@@ -5,8 +5,8 @@
5
5
  <link rel="icon" type="image/svg+xml" href="/favicon.ico" />
6
6
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
7
7
  <title>Skybridge MCP devtools</title>
8
- <script type="module" crossorigin src="/assets/index-Bme5YgFF.js"></script>
9
- <link rel="stylesheet" crossorigin href="/assets/index-BS8tKQug.css">
8
+ <script type="module" crossorigin src="/assets/index-R5erQwQK.js"></script>
9
+ <link rel="stylesheet" crossorigin href="/assets/index-DAVIy1qN.css">
10
10
  </head>
11
11
  <body>
12
12
  <div id="root"></div>
@@ -0,0 +1,16 @@
1
+ <svg width="90" height="90" viewBox="0 0 90 90" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <title>Skybridge</title>
3
+ <g clip-path="url(#clip0_3933_970)">
4
+ <mask id="mask0_3933_970" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="0" y="0" width="90" height="90">
5
+ <path d="M90 0H0V90H90V0Z" fill="white"/>
6
+ </mask>
7
+ <g mask="url(#mask0_3933_970)">
8
+ <path d="M17.2704 89.9987C37.5976 24.3967 65.182 12.9084 89.9996 35.3807V84.1606C89.9996 87.3849 87.3858 89.9987 84.1615 89.9987H17.2704ZM84.1615 0C87.3858 0 89.9996 2.6139 89.9996 5.83819V30.9146C52.0566 -5.26767 14.9006 31.2366 0.000976562 57.6768V5.83819C0.00104114 2.6139 2.61486 2.23904e-08 5.83917 0H84.1615Z" fill="black"/>
9
+ </g>
10
+ </g>
11
+ <defs>
12
+ <clipPath id="clip0_3933_970">
13
+ <rect width="90" height="90" fill="white"/>
14
+ </clipPath>
15
+ </defs>
16
+ </svg>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@skybridge/devtools",
3
- "version": "0.0.0-dev.f9be176",
3
+ "version": "0.0.0-dev.f9c577b",
4
4
  "type": "module",
5
5
  "repository": {
6
6
  "type": "git",
@@ -16,65 +16,73 @@
16
16
  }
17
17
  },
18
18
  "dependencies": {
19
- "@base-ui/react": "^1.1.0",
20
- "@fontsource-variable/jetbrains-mono": "^5.2.8",
21
- "@microlink/react-json-view": "^1.27.1",
22
- "@modelcontextprotocol/sdk": "^1.25.3",
23
- "@rjsf/core": "^6.2.5",
24
- "@rjsf/shadcn": "^6.2.5",
25
- "@rjsf/utils": "^6.2.5",
26
- "@rjsf/validator-ajv8": "^6.2.5",
27
- "@tanstack/react-query": "^5.90.20",
28
- "ahooks": "^3.9.6",
29
- "class-variance-authority": "^0.7.1",
30
- "clsx": "^2.1.1",
31
- "cmdk": "^1.1.1",
19
+ "@alpic-ai/sdk": "^1.155.0",
20
+ "@t3-oss/env-core": "^0.13.11",
32
21
  "cors": "^2.8.6",
33
22
  "express": "^5.2.1",
34
- "framer-motion": "^12.29.2",
35
- "lodash-es": "^4.17.23",
36
- "lucide-react": "^0.563.0",
37
- "motion": "^12.29.2",
38
- "nuqs": "^2.8.6",
39
- "react": "^19.2.4",
40
- "react-dom": "^19.2.4",
41
- "react-resizable-panels": "^4.5.4",
42
- "shadcn": "^3.7.0",
43
- "shiki": "^3.21.0",
44
- "tailwind-merge": "^3.4.0",
45
- "tailwindcss": "^4.1.18",
46
- "tailwindcss-animate": "^1.0.7",
47
- "tw-animate-css": "^1.4.0",
48
- "zustand": "^5.0.10",
49
- "skybridge": "0.0.0-dev.f9be176"
23
+ "zod": "^4.4.3"
50
24
  },
51
25
  "devDependencies": {
52
- "@eslint/js": "^9.39.2",
53
- "@tailwindcss/vite": "^4.1.18",
26
+ "@alpic-ai/ui": "^1.155.0",
27
+ "@base-ui/react": "^1.6.0",
28
+ "@fontsource-variable/jetbrains-mono": "^5.3.0",
29
+ "@modelcontextprotocol/sdk": "^1.29.0",
30
+ "@playwright/test": "^1.61.1",
31
+ "@radix-ui/react-accordion": "^1.2.16",
32
+ "@radix-ui/react-tooltip": "^1.2.12",
33
+ "@rjsf/core": "^6.7.0",
34
+ "@rjsf/shadcn": "^6.7.0",
35
+ "@rjsf/utils": "^6.7.0",
36
+ "@rjsf/validator-ajv8": "^6.7.0",
37
+ "@tailwindcss/vite": "^4.3.3",
38
+ "@tanstack/react-query": "^5.101.2",
54
39
  "@total-typescript/tsconfig": "^1.0.4",
55
40
  "@types/cors": "^2.8.19",
56
41
  "@types/express": "^5.0.6",
57
42
  "@types/lodash-es": "^4.17.12",
58
- "@types/react": "^19.2.10",
43
+ "@types/react": "^19.2.17",
59
44
  "@types/react-dom": "^19.2.3",
60
- "@vitejs/plugin-react": "^5.1.2",
61
- "autoprefixer": "^10.4.23",
62
- "eslint": "^9.39.2",
63
- "eslint-plugin-react-hooks": "^7.0.1",
64
- "eslint-plugin-react-refresh": "^0.4.26",
65
- "globals": "^17.2.0",
66
- "postcss": "^8.5.6",
67
- "typescript": "~5.9.3",
68
- "typescript-eslint": "^8.54.0",
69
- "vite": "^7.3.1"
45
+ "@types/react-syntax-highlighter": "^15.5.13",
46
+ "@vitejs/plugin-react": "^6.0.3",
47
+ "ahooks": "^3.9.7",
48
+ "autoprefixer": "^10.5.4",
49
+ "class-variance-authority": "^0.7.1",
50
+ "clsx": "^2.1.1",
51
+ "cmdk": "^1.1.1",
52
+ "lodash-es": "^4.18.1",
53
+ "lucide-react": "^1.25.0",
54
+ "motion": "^12.42.2",
55
+ "nuqs": "^2.9.1",
56
+ "postcss": "^8.5.19",
57
+ "react": "^19.2.7",
58
+ "react-dom": "^19.2.7",
59
+ "react-resizable-panels": "^4.12.2",
60
+ "react-syntax-highlighter": "^16.1.1",
61
+ "shadcn": "^4.13.1",
62
+ "shiki": "^4.3.1",
63
+ "tailwind-merge": "^3.6.0",
64
+ "tailwindcss": "^4.3.3",
65
+ "tailwindcss-animate": "^1.0.7",
66
+ "tsx": "^4.23.1",
67
+ "tw-animate-css": "^1.4.0",
68
+ "typescript": "~6.0.3",
69
+ "vite": "^8.1.5",
70
+ "vitest": "^4.1.10",
71
+ "zustand": "^5.0.14",
72
+ "skybridge": "0.0.0-dev.f9c577b"
70
73
  },
71
74
  "scripts": {
72
75
  "dev": "vite",
73
76
  "build": "tsc -b && vite build && pnpm run build:server",
74
77
  "build:server": "tsc -p tsconfig.server.json",
75
- "test": "pnpm run test:type && pnpm run test:format",
76
- "test:type": "tsc --noEmit",
78
+ "test": "pnpm run test:format && pnpm run test:types && pnpm run test:unit",
79
+ "format": "biome check --write --error-on-warnings",
77
80
  "test:format": "biome ci",
78
- "preview": "vite preview"
81
+ "test:types": "tsc --noEmit -p e2e/tsconfig.json",
82
+ "test:unit": "vitest run",
83
+ "preview": "vite preview",
84
+ "e2e:fixture": "tsx ./e2e/fixtures/server.ts",
85
+ "test:e2e": "playwright test --config e2e/playwright.config.ts",
86
+ "test:e2e:install": "playwright install --with-deps chromium"
79
87
  }
80
88
  }