weapp-vite 7.4.0 → 7.6.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 (126) hide show
  1. package/README.md +59 -3
  2. package/THIRD_PARTY_NOTICES.md +60 -0
  3. package/bin/bootstrap.js +14 -1
  4. package/dist/action-B3YZMA-h.mjs +255 -0
  5. package/dist/action-BELcDNNv.mjs +139 -0
  6. package/dist/action-BOk3vGI7.mjs +1110 -0
  7. package/dist/action-DlC6JYpt.mjs +95 -0
  8. package/dist/action-zEDY7oh_.mjs +247 -0
  9. package/dist/adapters-CcHrsYaj.mjs +1 -0
  10. package/dist/analyze-DN79YOAH.mjs +184 -0
  11. package/dist/artifacts-BOyC9Fy-.mjs +106 -0
  12. package/dist/assets-C5_YYXNk.mjs +637 -0
  13. package/dist/auto-import-components/resolvers.mjs +1 -2
  14. package/dist/auto-import-presets/wevu-router.mjs +1 -2
  15. package/dist/auto-import-presets/wevu.mjs +1 -2
  16. package/dist/auto-routes.mjs +2 -1
  17. package/dist/budget-CTLOHwgI.d.mts +177 -0
  18. package/dist/budget-EOeEycc_.mjs +65 -0
  19. package/dist/builtProject-C29udgXY.mjs +541 -0
  20. package/dist/chunkStrategy-DY_LZIIe.mjs +1448 -0
  21. package/dist/classifier-DBJY__kg.mjs +88 -0
  22. package/dist/cli-acceptance.d.mts +1 -0
  23. package/dist/cli-acceptance.mjs +21 -0
  24. package/dist/cli.mjs +519 -5049
  25. package/dist/compatibility.mjs +1 -2
  26. package/dist/{config-Dbvj5yK7.d.mts → config-Bf6DWhyb.d.mts} +220 -76
  27. package/dist/config.d.mts +3 -3
  28. package/dist/config.mjs +1 -1
  29. package/dist/{constants-WOsG3Eqd.mjs → constants-DEZdcsMn.mjs} +1 -1
  30. package/dist/{createContext-UOEgeYnA.mjs → createCompilerContextInstance-aYwi8wQt.mjs} +36862 -32020
  31. package/dist/createContext-tApLtII-.mjs +15 -0
  32. package/dist/dashboard/analyze.d.mts +48 -0
  33. package/dist/dashboard/analyze.mjs +3 -0
  34. package/dist/dashboard/vite.d.mts +1 -1
  35. package/dist/dashboard.d.mts +3 -2
  36. package/dist/dashboard.mjs +1748 -1
  37. package/dist/dashboardTransport-C_Y6jMp-.mjs +16 -0
  38. package/dist/dashboardViteBridge-DCGR43aM.mjs +302 -0
  39. package/dist/dev-C2fgr_Xd.mjs +67 -0
  40. package/dist/devProvider-D-hTfsEO.mjs +3027 -0
  41. package/dist/docs/README.md +59 -3
  42. package/dist/docs/ai-workflows.md +4 -0
  43. package/dist/docs/doctor.md +38 -0
  44. package/dist/docs/getting-started.md +3 -1
  45. package/dist/docs/index.md +3 -1
  46. package/dist/docs/mcp.md +104 -1
  47. package/dist/docs/testing.md +29 -2
  48. package/dist/docs/troubleshooting.md +16 -0
  49. package/dist/docs/uni-app-component-libraries.md +8 -7
  50. package/dist/docs/upload.md +40 -3
  51. package/dist/docs/vite-plugin.md +171 -0
  52. package/dist/docs/vue-sfc.md +42 -0
  53. package/dist/docs/weapp-config.md +54 -0
  54. package/dist/docs/wevu-authoring.md +10 -0
  55. package/dist/doctor-worker.d.mts +1 -0
  56. package/dist/doctor-worker.mjs +60 -0
  57. package/dist/doctor.d.mts +144 -0
  58. package/dist/doctor.mjs +850 -0
  59. package/dist/engine-C66J0HLz.mjs +54 -0
  60. package/dist/eslint.mjs +1 -2
  61. package/dist/{file-giE9UMZa.mjs → file-CcIOmqhC.mjs} +58 -24
  62. package/dist/file-DtcteQ4G.mjs +1 -0
  63. package/dist/files-BqxFIPRp.mjs +45 -0
  64. package/dist/forwardConsole-B0Reo8Lf.mjs +511 -0
  65. package/dist/getInstance-BAIaU2y9.mjs +1 -0
  66. package/dist/getInstance-Dt9IQDKr.mjs +28 -0
  67. package/dist/history-BIiRCzbq.mjs +784 -0
  68. package/dist/i18n.d.mts +1 -1
  69. package/dist/index-D5rgBzYZ.d.mts +740 -0
  70. package/dist/index.d.mts +12 -10
  71. package/dist/index.mjs +3 -2
  72. package/dist/json.d.mts +1 -1
  73. package/dist/json.mjs +1 -2
  74. package/dist/lib-DjccSI1B.mjs +143 -0
  75. package/dist/lifecycle-C36WSbQS.mjs +413 -0
  76. package/dist/loadConfig-BWIsDXR4.mjs +59 -0
  77. package/dist/loadConfig-D-BpBgsk.mjs +1 -0
  78. package/dist/logBuildAppFinish-ChjwATMv.mjs +57 -0
  79. package/dist/logger-DGn5iEVN.mjs +1 -0
  80. package/dist/mcp-CYgX9HpO.mjs +86 -0
  81. package/dist/{mcp-BG6TliEg.mjs → mcp-Cj8Maqo6.mjs} +16 -7
  82. package/dist/mcp.d.mts +6 -3
  83. package/dist/mcp.mjs +1 -2
  84. package/dist/mcpClient-DVLvFLZv.mjs +287 -0
  85. package/dist/metadata-hwF7QRcS.mjs +59 -0
  86. package/dist/nodeEnv-BmH8UZPR.mjs +7 -0
  87. package/dist/openIde-CroqOgk5.mjs +648 -0
  88. package/dist/options-jqFwfD1G.mjs +34 -0
  89. package/dist/package-Cmakyy3J.mjs +4 -0
  90. package/dist/path-CYYIQGS7.mjs +44 -0
  91. package/dist/{platform-DTWs5QRi.mjs → platform-CnkySBKz.mjs} +1 -1
  92. package/dist/processCleanup-BQn2kTcK.mjs +19 -0
  93. package/dist/protocol-Cg6Jdlvb.mjs +141 -0
  94. package/dist/reader-sh_POQ9-.mjs +93 -0
  95. package/dist/realpathScope-Tf9mz-fh.mjs +23 -0
  96. package/dist/report-hyonPGbZ.mjs +107 -0
  97. package/dist/resolvedId-CiDl7SC1.mjs +60 -0
  98. package/dist/{resolvers-icNxkpcy.mjs → resolvers-Dod-euqX.mjs} +4 -1
  99. package/dist/resolvers.mjs +1 -2
  100. package/dist/runtime-CLUhQsdA.mjs +43 -0
  101. package/dist/{runtime-Ee2HY6gR.d.mts → runtime-DpVf714f.d.mts} +1 -1
  102. package/dist/runtime.d.mts +1 -1
  103. package/dist/runtime.mjs +1 -2
  104. package/dist/schematics-kO26eQRT.mjs +91 -0
  105. package/dist/session-D3zsdzIy.mjs +452 -0
  106. package/dist/test.d.mts +1 -0
  107. package/dist/test.mjs +204 -45
  108. package/dist/{types-CgZn5X6j.d.mts → types-D-kfuyVa.d.mts} +1 -2
  109. package/dist/types-D0FFexRF.d.mts +39 -0
  110. package/dist/types.d.mts +3 -3
  111. package/dist/{upload-D0RcEWrq.mjs → upload-DozK8UdN.mjs} +278 -15
  112. package/dist/upload-worker.mjs +136 -3
  113. package/dist/utils-Dy51PYAC.mjs +1034 -0
  114. package/dist/vite.d.mts +9 -0
  115. package/dist/vite.mjs +309 -0
  116. package/dist/volar.d.mts +2 -2
  117. package/dist/web-apis.mjs +1 -2
  118. package/dist/wxs-BT8btflA.mjs +112 -0
  119. package/dist/wxs-Z4VQDeJ_.mjs +1 -0
  120. package/package.json +80 -48
  121. package/dist/adapters-BwnMMIZR.mjs +0 -2
  122. package/dist/dashboard-BzaVesmQ.mjs +0 -558
  123. package/dist/file-D19nbDoN.mjs +0 -2
  124. package/dist/getInstance-CYF1vl5l.mjs +0 -2
  125. package/dist/index-DbqVupg0.d.mts +0 -246
  126. package/dist/logger-mt4mSTqV.mjs +0 -2
@@ -0,0 +1,59 @@
1
+ import { A as createCjsConfigLoadError, C as loadViteConfigFile, t as resolveWeappConfigFile } from "./utils-Dy51PYAC.mjs";
2
+ import process from "node:process";
3
+ import path from "pathe";
4
+ import { defu } from "@weapp-core/shared";
5
+ //#region src/cli/loadConfig.ts
6
+ async function loadConfig(configFile) {
7
+ const cwd = process.cwd();
8
+ let resolvedConfigFile = configFile;
9
+ if (resolvedConfigFile && !path.isAbsolute(resolvedConfigFile)) resolvedConfigFile = path.resolve(cwd, resolvedConfigFile);
10
+ const configEnv = {
11
+ command: "serve",
12
+ mode: "development"
13
+ };
14
+ let loaded;
15
+ try {
16
+ loaded = await loadViteConfigFile(configEnv, resolvedConfigFile, cwd, void 0, void 0, "runner");
17
+ } catch (error) {
18
+ const cjsError = createCjsConfigLoadError({
19
+ error,
20
+ configPath: resolvedConfigFile,
21
+ cwd
22
+ });
23
+ if (cjsError) throw cjsError;
24
+ throw error;
25
+ }
26
+ const weappConfigFilePath = await resolveWeappConfigFile({
27
+ root: cwd,
28
+ specified: resolvedConfigFile
29
+ });
30
+ let weappLoaded;
31
+ if (weappConfigFilePath) {
32
+ const normalizedWeappPath = path.resolve(weappConfigFilePath);
33
+ const normalizedLoadedPath = loaded?.path ? path.resolve(loaded.path) : void 0;
34
+ if (normalizedLoadedPath && normalizedLoadedPath === normalizedWeappPath) weappLoaded = loaded;
35
+ else try {
36
+ weappLoaded = await loadViteConfigFile(configEnv, weappConfigFilePath, cwd, void 0, void 0, "runner");
37
+ } catch (error) {
38
+ const cjsError = createCjsConfigLoadError({
39
+ error,
40
+ configPath: weappConfigFilePath,
41
+ cwd
42
+ });
43
+ if (cjsError) throw cjsError;
44
+ throw error;
45
+ }
46
+ }
47
+ if (!loaded && !weappLoaded) return;
48
+ const config = weappLoaded?.config ? defu(weappLoaded.config, loaded?.config ?? {}) : loaded?.config ?? {};
49
+ const dependencySet = /* @__PURE__ */ new Set();
50
+ for (const dependency of loaded?.dependencies ?? []) dependencySet.add(dependency);
51
+ for (const dependency of weappLoaded?.dependencies ?? []) dependencySet.add(dependency);
52
+ return {
53
+ config,
54
+ path: weappLoaded?.path ?? loaded?.path ?? resolvedConfigFile,
55
+ dependencies: Array.from(dependencySet)
56
+ };
57
+ }
58
+ //#endregion
59
+ export { loadConfig as t };
@@ -0,0 +1 @@
1
+ export { t as loadConfig } from "./loadConfig-BWIsDXR4.mjs";
@@ -0,0 +1,57 @@
1
+ import { s as getProjectConfigFileName } from "./utils-Dy51PYAC.mjs";
2
+ import { r as logger_default, t as colors } from "./logger-DGn5iEVN.mjs";
3
+ import process from "node:process";
4
+ import { resolveCommand } from "package-manager-detector/commands";
5
+ //#region src/cli/commands/build/completion.ts
6
+ function shouldScheduleCompletedProductionBuildExit(options, analyzeHandle) {
7
+ return process.env.VITEST !== "true" && process.env.NODE_ENV !== "test" && process.env.WEAPP_VITE_DISABLE_COMPLETED_BUILD_EXIT !== "1" && options.watch !== true && options.open !== true && analyzeHandle === void 0;
8
+ }
9
+ function scheduleCompletedProductionBuildExit(options, analyzeHandle) {
10
+ if (!shouldScheduleCompletedProductionBuildExit(options, analyzeHandle)) return;
11
+ setTimeout(() => {
12
+ if (process.exitCode === void 0 || process.exitCode === 0) process.exit(0);
13
+ }, 0).unref?.();
14
+ }
15
+ //#endregion
16
+ //#region src/cli/formatDuration.ts
17
+ /**
18
+ * 将毫秒耗时格式化为适合 CLI 展示的文本。
19
+ */
20
+ function formatDuration(durationMs) {
21
+ return `${durationMs}ms`;
22
+ }
23
+ //#endregion
24
+ //#region src/cli/logBuildAppFinish.ts
25
+ let logBuildAppFinishOnlyShowOnce = false;
26
+ function collectServerUrls(webServer) {
27
+ const urls = webServer?.resolvedUrls;
28
+ if (!urls) return [];
29
+ return [...urls.local ?? [], ...urls.network ?? []];
30
+ }
31
+ function logBuildAppFinish(configService, webServer, options = {}) {
32
+ if (logBuildAppFinishOnlyShowOnce) return;
33
+ const { skipMini = false, skipWeb = false, uiUrls = [] } = options;
34
+ const webUrls = skipWeb ? [] : collectServerUrls(webServer);
35
+ if (skipMini) {
36
+ logger_default.success("开发服务已就绪:");
37
+ if (webUrls.length > 0) logger_default.info(`Web:${colors.cyan(webUrls[0])}`);
38
+ else logger_default.info("Web:已启动");
39
+ logBuildAppFinishOnlyShowOnce = true;
40
+ return;
41
+ }
42
+ const { command, args } = resolveCommand(configService.packageManager.agent, "run", ["open"]) ?? {
43
+ command: "npm",
44
+ args: ["run", "open"]
45
+ };
46
+ const devCommand = `${command} ${args.join(" ")}`;
47
+ logger_default.success("开发服务已就绪:");
48
+ logger_default.info(`小程序:执行 ${colors.bold(colors.green(devCommand))},或手动导入 ${colors.green(getProjectConfigFileName(configService.platform))}`);
49
+ if (uiUrls.length > 0) logger_default.info(`UI:${colors.cyan(uiUrls[0])}`);
50
+ else if (!skipMini) logger_default.info("UI:未启用");
51
+ if (webUrls.length > 0) logger_default.info(`Web:${colors.cyan(webUrls[0])}`);
52
+ const projectConfigFileName = getProjectConfigFileName(configService.platform);
53
+ if (!uiUrls.length && !webUrls.length) logger_default.info(`提示:手动打开对应平台开发者工具,导入根目录(${colors.green(projectConfigFileName)} 文件所在目录)`);
54
+ logBuildAppFinishOnlyShowOnce = true;
55
+ }
56
+ //#endregion
57
+ export { formatDuration as n, scheduleCompletedProductionBuildExit as r, logBuildAppFinish as t };
@@ -0,0 +1 @@
1
+ export { configureLogger as n, default as r, colors as t } from "@weapp-core/logger";
@@ -0,0 +1,86 @@
1
+ import process from "node:process";
2
+ import path from "node:path";
3
+ import { writeFile } from "node:fs/promises";
4
+ //#region src/cli/commands/accept.ts
5
+ function registerAcceptCommand(cli) {
6
+ cli.command("accept [root]", "run deterministic mini-program acceptance without a model").option("--init", "create acceptance configuration without overwriting").option("--inspect", "inspect acceptance prerequisites without executing project code").option("--report <jobId>", "read a saved report and check source freshness").option("--acceptance-config <file>", "select an acceptance JSON configuration").option("--trust", "authorize the reviewed configuration for this invocation").option("--json", "write protocol data only to stdout").action(async (root = ".", options) => {
7
+ try {
8
+ const directory = path.resolve(root);
9
+ const { defaultVerification, detectProject, safePath } = await import("@weapp-vite/acceptance");
10
+ if (options.init) {
11
+ const target = await safePath(directory, options.acceptanceConfig ?? "weapp-acceptance.config.json");
12
+ const config = {
13
+ version: 1,
14
+ verification: defaultVerification(await detectProject(directory)),
15
+ acceptance: {
16
+ requiredChecks: ["build", "devtools"],
17
+ scenarios: [],
18
+ timeoutMs: 6e5
19
+ }
20
+ };
21
+ await writeFile(target, `${JSON.stringify(config, null, 2)}\n`, { flag: "wx" });
22
+ process.stdout.write(`${JSON.stringify({
23
+ created: target,
24
+ modelRequired: false
25
+ })}\n`);
26
+ return;
27
+ }
28
+ const { createRuntimeAcceptanceService } = await import("@weapp-vite/mcp");
29
+ const { connectMiniProgram, prepareAcceptanceProject, resolveAutomatorSessionOptions } = await import("weapp-ide-cli");
30
+ const service = await createRuntimeAcceptanceService(directory, {
31
+ trust: Boolean(options.trust && !options.inspect && !options.report),
32
+ configFile: options.acceptanceConfig
33
+ }, {
34
+ connectMiniProgram,
35
+ resolveSessionOptions: resolveAutomatorSessionOptions,
36
+ prepareProject: prepareAcceptanceProject
37
+ });
38
+ let jobId;
39
+ let cancelRequested = false;
40
+ const cancel = () => {
41
+ cancelRequested = true;
42
+ if (jobId) service.cancel(jobId);
43
+ };
44
+ process.once("SIGINT", cancel);
45
+ try {
46
+ let result;
47
+ if (options.inspect) result = await service.inspect();
48
+ else if (options.report) result = await service.report(options.report);
49
+ else {
50
+ let report = await service.start();
51
+ jobId = report.jobId;
52
+ if (cancelRequested) await service.cancel(jobId);
53
+ while (report.status === "running") {
54
+ await new Promise((resolve) => setTimeout(resolve, 100));
55
+ report = await service.report(jobId);
56
+ }
57
+ result = report;
58
+ }
59
+ process.stdout.write(`${JSON.stringify(result, null, options.json ? void 0 : 2)}\n`);
60
+ if ("passed" in result && (!result.passed || result.snapshot.stale)) process.exitCode = 1;
61
+ } finally {
62
+ process.off("SIGINT", cancel);
63
+ await service.close();
64
+ }
65
+ } catch (error) {
66
+ const message = error instanceof Error ? error.message : String(error);
67
+ if (options.json) process.stdout.write(`${JSON.stringify({
68
+ status: "failed",
69
+ passed: false,
70
+ reason: message
71
+ })}\n`);
72
+ else process.stderr.write(`${message}\n`);
73
+ process.exitCode = 1;
74
+ }
75
+ });
76
+ }
77
+ //#endregion
78
+ //#region src/cli/commands/mcp/index.ts
79
+ function registerMcpCommand(cli) {
80
+ cli.command("mcp [...args]", "start weapp-vite MCP server or manage MCP client onboarding").option("--transport <type>", "[string] stdio | streamable-http | command | http", { default: "stdio" }).option("--host <host>", "[string] streamable-http host").option("--port <port>", "[number] streamable-http port").option("--endpoint <path>", "[string] streamable-http endpoint path").option("--rest-endpoint <path>", "[string] streamable-http REST runtime endpoint path").option("--no-rest", "[boolean] disable streamable-http REST runtime endpoints").option("--unref", "[boolean] unref HTTP server to not block process exit").option("--url <url>", "[string] explicit HTTP MCP url").option("--workspace-root <path>", "[string] workspace root path, defaults to cwd").option("-y, --yes", "[boolean] write config without prompt").action(async (args, options) => {
81
+ const { runMcpCommand } = await import("./action-BELcDNNv.mjs");
82
+ return runMcpCommand(args, options);
83
+ });
84
+ }
85
+ //#endregion
86
+ export { registerAcceptCommand as n, registerMcpCommand as t };
@@ -1,8 +1,7 @@
1
- import { r as logger_default } from "./logger-mt4mSTqV.mjs";
1
+ import { r as logger_default } from "./logger-DGn5iEVN.mjs";
2
2
  import process from "node:process";
3
- import { connectMiniProgram } from "weapp-ide-cli";
3
+ import { DEFAULT_MCP_ENDPOINT, DEFAULT_MCP_HOST, DEFAULT_MCP_PORT, DEFAULT_RUNTIME_REST_ENDPOINT } from "@weapp-core/constants";
4
4
  import { determineAgent } from "@vercel/detect-agent";
5
- import { DEFAULT_MCP_ENDPOINT, DEFAULT_MCP_HOST, DEFAULT_MCP_PORT, DEFAULT_RUNTIME_REST_ENDPOINT, createWeappViteMcpServer, startWeappViteMcpServer } from "@weapp-vite/mcp";
6
5
  //#region src/aiEnvironment.ts
7
6
  const AI_ENV_KEYS = [
8
7
  "CODEX_HOME",
@@ -74,6 +73,11 @@ function resolveBooleanLikeEnv(value) {
74
73
  }
75
74
  //#endregion
76
75
  //#region src/mcp.ts
76
+ /** 创建服务时才加载 MCP 运行时;配置解析与公开常量保持同步。 */
77
+ async function createWeappViteMcpServer(options) {
78
+ const { createWeappViteMcpServer } = await import("@weapp-vite/mcp");
79
+ return createWeappViteMcpServer(options);
80
+ }
77
81
  function normalizeEndpoint(input) {
78
82
  const value = typeof input === "string" ? input.trim() : "";
79
83
  if (!value) return DEFAULT_MCP_ENDPOINT;
@@ -115,9 +119,14 @@ function resolveWeappMcpConfig(config, options = {}) {
115
119
  restEndpoint: record.restEndpoint === false ? false : normalizeEndpoint(record.restEndpoint ?? DEFAULT_RUNTIME_REST_ENDPOINT)
116
120
  };
117
121
  }
118
- async function startWeappViteMcpServer$1(options) {
119
- return startWeappViteMcpServer({
120
- runtimeHooks: { connectMiniProgram },
122
+ async function startWeappViteMcpServer(options) {
123
+ const [{ startWeappViteMcpServer: startMcpServer }, { connectMiniProgram, prepareAcceptanceProject, resolveAutomatorSessionOptions }] = await Promise.all([import("@weapp-vite/mcp"), import("weapp-ide-cli")]);
124
+ return startMcpServer({
125
+ runtimeHooks: {
126
+ connectMiniProgram,
127
+ resolveSessionOptions: resolveAutomatorSessionOptions,
128
+ prepareProject: prepareAcceptanceProject
129
+ },
121
130
  ...options,
122
131
  onReady: options?.onReady ?? ((message) => {
123
132
  logger_default.info(message);
@@ -125,4 +134,4 @@ async function startWeappViteMcpServer$1(options) {
125
134
  });
126
135
  }
127
136
  //#endregion
128
- export { createWeappViteMcpServer as a, startWeappViteMcpServer$1 as c, DEFAULT_RUNTIME_REST_ENDPOINT as i, detectAiDevelopmentEnvironment as l, DEFAULT_MCP_HOST as n, resolveProjectMcpPort as o, DEFAULT_MCP_PORT as r, resolveWeappMcpConfig as s, DEFAULT_MCP_ENDPOINT as t };
137
+ export { createWeappViteMcpServer as a, startWeappViteMcpServer as c, DEFAULT_RUNTIME_REST_ENDPOINT as i, detectAiDevelopmentEnvironment as l, DEFAULT_MCP_HOST as n, resolveProjectMcpPort as o, DEFAULT_MCP_PORT as r, resolveWeappMcpConfig as s, DEFAULT_MCP_ENDPOINT as t };
package/dist/mcp.d.mts CHANGED
@@ -1,6 +1,9 @@
1
- import { Wt as WeappMcpConfig } from "./config-Dbvj5yK7.mjs";
2
- import { CreateServerOptions, DEFAULT_MCP_ENDPOINT, DEFAULT_MCP_HOST, DEFAULT_MCP_PORT, DEFAULT_RUNTIME_REST_ENDPOINT, McpServerHandle, StartMcpServerOptions, createWeappViteMcpServer } from "@weapp-vite/mcp";
1
+ import { Ut as WeappMcpConfig } from "./config-Bf6DWhyb.mjs";
2
+ import { DEFAULT_MCP_ENDPOINT, DEFAULT_MCP_HOST, DEFAULT_MCP_PORT, DEFAULT_RUNTIME_REST_ENDPOINT } from "@weapp-core/constants";
3
+ import { CreateServerOptions, McpServerHandle, StartMcpServerOptions, createWeappViteMcpServer as createWeappViteMcpServer$1 } from "@weapp-vite/mcp";
3
4
  //#region src/mcp.d.ts
5
+ /** 创建服务时才加载 MCP 运行时;配置解析与公开常量保持同步。 */
6
+ export declare function createWeappViteMcpServer(options?: CreateServerOptions): ReturnType<typeof createWeappViteMcpServer$1>;
4
7
  export interface ResolvedWeappMcpConfig {
5
8
  agentName?: string;
6
9
  enabled: boolean;
@@ -22,4 +25,4 @@ export declare function resolveProjectMcpPort(projectRoot?: string): number;
22
25
  export declare function resolveWeappMcpConfig(config?: boolean | WeappMcpConfig, options?: ResolveWeappMcpConfigOptions): ResolvedWeappMcpConfig;
23
26
  export declare function startWeappViteMcpServer(options?: WeappViteMcpServerOptions): Promise<WeappViteMcpServerHandle>;
24
27
  //#endregion
25
- export { type CreateServerOptions, DEFAULT_MCP_ENDPOINT, DEFAULT_MCP_HOST, DEFAULT_MCP_PORT, DEFAULT_RUNTIME_REST_ENDPOINT, createWeappViteMcpServer };
28
+ export { type CreateServerOptions, DEFAULT_MCP_ENDPOINT, DEFAULT_MCP_HOST, DEFAULT_MCP_PORT, DEFAULT_RUNTIME_REST_ENDPOINT };
package/dist/mcp.mjs CHANGED
@@ -1,2 +1 @@
1
- import { a as createWeappViteMcpServer, c as startWeappViteMcpServer, i as DEFAULT_RUNTIME_REST_ENDPOINT, n as DEFAULT_MCP_HOST, o as resolveProjectMcpPort, r as DEFAULT_MCP_PORT, s as resolveWeappMcpConfig, t as DEFAULT_MCP_ENDPOINT } from "./mcp-BG6TliEg.mjs";
2
- export { DEFAULT_MCP_ENDPOINT, DEFAULT_MCP_HOST, DEFAULT_MCP_PORT, DEFAULT_RUNTIME_REST_ENDPOINT, createWeappViteMcpServer, resolveProjectMcpPort, resolveWeappMcpConfig, startWeappViteMcpServer };
1
+ export { t as DEFAULT_MCP_ENDPOINT, n as DEFAULT_MCP_HOST, r as DEFAULT_MCP_PORT, i as DEFAULT_RUNTIME_REST_ENDPOINT, a as createWeappViteMcpServer, o as resolveProjectMcpPort, s as resolveWeappMcpConfig, c as startWeappViteMcpServer } from "./mcp-Cj8Maqo6.mjs";
@@ -0,0 +1,287 @@
1
+ import process from "node:process";
2
+ import path from "pathe";
3
+ import { fs } from "@weapp-core/shared/fs";
4
+ import os from "node:os";
5
+ import { clearTimeout, setTimeout } from "node:timers";
6
+ //#region src/cli/mcpClient/shared.ts
7
+ const CODEX_BLOCK_PREFIX = "# >>> weapp-vite mcp ";
8
+ const CODEX_BLOCK_SUFFIX = " >>>";
9
+ const CODEX_BLOCK_END_PREFIX = "# <<< weapp-vite mcp ";
10
+ const CODEX_BLOCK_END_SUFFIX = " <<<";
11
+ const DEFAULT_HTTP_TIMEOUT_MS = 1500;
12
+ const WORKSPACE_FOLDER_TOKEN = "${workspaceFolder}";
13
+ const REG_CodexUrl = /^\s*url\s*=\s*"([^"]+)"/m;
14
+ const REG_CodexCommand = /^\s*command\s*=\s*"([^"]+)"/m;
15
+ const REG_CodexArgs = /^\s*args\s*=\s*\[([^\]]*)\]/m;
16
+ const REG_FirstTomlString = /"([^"]+)"/;
17
+ function resolveTargetWorkspaceRoot(target) {
18
+ if (target.client === "cursor") return path.dirname(path.dirname(target.configPath));
19
+ if (target.client === "claude-code") return path.dirname(target.configPath);
20
+ return process.cwd();
21
+ }
22
+ function escapeRegExp(value) {
23
+ return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
24
+ }
25
+ function renderTomlString(value) {
26
+ return JSON.stringify(value);
27
+ }
28
+ function sanitizeServerNameSegment(value) {
29
+ return value.trim().toLowerCase().replace(/[^a-z0-9-]+/g, "-").replace(/-{2,}/g, "-").replace(/^-|-$/g, "");
30
+ }
31
+ function resolveServerName(workspaceRoot) {
32
+ return `weapp-vite-${sanitizeServerNameSegment(path.basename(workspaceRoot)) || "project"}`;
33
+ }
34
+ function resolveNodeBinCommand() {
35
+ return process.execPath || "node";
36
+ }
37
+ function resolveProjectCliBin(workspaceRoot) {
38
+ return path.join(workspaceRoot, "node_modules", "weapp-vite", "bin", "weapp-vite.js");
39
+ }
40
+ function renderCommandArgs(args) {
41
+ return args.map(renderTomlString).join(", ");
42
+ }
43
+ function renderCodexBlock(serverName, entry) {
44
+ const startMarker = `${CODEX_BLOCK_PREFIX}${serverName}${CODEX_BLOCK_SUFFIX}`;
45
+ const endMarker = `${CODEX_BLOCK_END_PREFIX}${serverName}${CODEX_BLOCK_END_SUFFIX}`;
46
+ if (entry.url) return `${startMarker}
47
+ [mcp_servers.${serverName}]
48
+ url = ${renderTomlString(entry.url)}
49
+ ${endMarker}
50
+ `;
51
+ return `${startMarker}
52
+ [mcp_servers.${serverName}]
53
+ command = ${renderTomlString(entry.command ?? resolveNodeBinCommand())}
54
+ args = [${renderCommandArgs(entry.args ?? [])}]
55
+ ${endMarker}
56
+ `;
57
+ }
58
+ function renderJsonPreview(serverName, entry) {
59
+ return `${JSON.stringify({ mcpServers: { [serverName]: entry } }, null, 2)}
60
+ `;
61
+ }
62
+ function resolveCommandEntry(client, workspaceRoot) {
63
+ const binPath = resolveProjectCliBin(workspaceRoot);
64
+ if (client === "cursor") return {
65
+ command: "node",
66
+ args: [
67
+ `${WORKSPACE_FOLDER_TOKEN}/node_modules/weapp-vite/bin/weapp-vite.js`,
68
+ "mcp",
69
+ "--workspace-root",
70
+ WORKSPACE_FOLDER_TOKEN
71
+ ]
72
+ };
73
+ return {
74
+ command: resolveNodeBinCommand(),
75
+ args: [
76
+ binPath,
77
+ "mcp",
78
+ "--workspace-root",
79
+ workspaceRoot
80
+ ]
81
+ };
82
+ }
83
+ function resolveHttpEntry(client, url) {
84
+ if (client === "claude-code") return {
85
+ type: "http",
86
+ url
87
+ };
88
+ return { url };
89
+ }
90
+ function resolveConfigEntry(client, transport, workspaceRoot, url) {
91
+ return transport === "http" ? resolveHttpEntry(client, url ?? "") : resolveCommandEntry(client, workspaceRoot);
92
+ }
93
+ function resolveCodexBlockPattern(serverName) {
94
+ const startMarker = `${CODEX_BLOCK_PREFIX}${serverName}${CODEX_BLOCK_SUFFIX}`;
95
+ const endMarker = `${CODEX_BLOCK_END_PREFIX}${serverName}${CODEX_BLOCK_END_SUFFIX}`;
96
+ return new RegExp(`${escapeRegExp(startMarker)}[\\s\\S]*?${escapeRegExp(endMarker)}\\n?`, "g");
97
+ }
98
+ function upsertCodexManagedBlock(content, serverName, block) {
99
+ const withoutExisting = content.trimEnd().replace(resolveCodexBlockPattern(serverName), "").trimEnd();
100
+ if (!withoutExisting) return block;
101
+ return `${withoutExisting}\n\n${block}`;
102
+ }
103
+ function parseJsonConfig(content, configPath) {
104
+ if (!content.trim()) return {};
105
+ try {
106
+ return JSON.parse(content);
107
+ } catch (error) {
108
+ const message = error instanceof Error ? error.message : String(error);
109
+ throw new Error(`无法解析 MCP 配置文件 ${configPath}:${message}`);
110
+ }
111
+ }
112
+ function resolveTarget(client, workspaceRoot) {
113
+ const serverName = resolveServerName(workspaceRoot);
114
+ if (client === "codex") return {
115
+ client,
116
+ configPath: path.join(os.homedir(), ".codex", "config.toml"),
117
+ displayName: "Codex",
118
+ serverName
119
+ };
120
+ if (client === "claude-code") return {
121
+ client,
122
+ configPath: path.join(workspaceRoot, ".mcp.json"),
123
+ displayName: "Claude Code",
124
+ serverName
125
+ };
126
+ return {
127
+ client,
128
+ configPath: path.join(workspaceRoot, ".cursor", "mcp.json"),
129
+ displayName: "Cursor",
130
+ serverName
131
+ };
132
+ }
133
+ //#endregion
134
+ //#region src/cli/mcpClient/inspect.ts
135
+ async function probeHttpEndpoint(url) {
136
+ const controller = new AbortController();
137
+ const timer = setTimeout(() => {
138
+ controller.abort();
139
+ }, DEFAULT_HTTP_TIMEOUT_MS);
140
+ try {
141
+ return (await fetch(url, {
142
+ method: "GET",
143
+ signal: controller.signal
144
+ })).status > 0;
145
+ } catch {
146
+ return false;
147
+ } finally {
148
+ clearTimeout(timer);
149
+ controller.abort();
150
+ }
151
+ }
152
+ async function inspectJsonConfig(target) {
153
+ if (!await fs.pathExists(target.configPath)) return {
154
+ configExists: false,
155
+ configPath: target.configPath,
156
+ displayName: target.displayName,
157
+ issues: [`未找到配置文件:${target.configPath}`],
158
+ serverName: target.serverName
159
+ };
160
+ const entry = parseJsonConfig(await fs.readFile(target.configPath, "utf8"), target.configPath).mcpServers?.[target.serverName];
161
+ if (!entry) return {
162
+ configExists: true,
163
+ configPath: target.configPath,
164
+ displayName: target.displayName,
165
+ issues: [`配置文件中未找到服务器 ${target.serverName}`],
166
+ serverName: target.serverName
167
+ };
168
+ const transport = entry.url ? "http" : "command";
169
+ const issues = [];
170
+ let httpReachable;
171
+ if (transport === "command") {
172
+ const normalizedBin = (entry.args?.[0])?.replaceAll(WORKSPACE_FOLDER_TOKEN, resolveTargetWorkspaceRoot(target));
173
+ if (!normalizedBin || !await fs.pathExists(normalizedBin)) issues.push(`未找到本地 CLI 入口:${normalizedBin ?? "缺少 args[0]"}`);
174
+ } else if (entry.url) {
175
+ httpReachable = await probeHttpEndpoint(entry.url);
176
+ if (!httpReachable) issues.push(`HTTP MCP 地址不可达:${entry.url}`);
177
+ }
178
+ return {
179
+ configExists: true,
180
+ configPath: target.configPath,
181
+ displayName: target.displayName,
182
+ httpReachable,
183
+ issues,
184
+ serverName: target.serverName,
185
+ transport
186
+ };
187
+ }
188
+ async function inspectCodexConfig(target) {
189
+ if (!await fs.pathExists(target.configPath)) return {
190
+ configExists: false,
191
+ configPath: target.configPath,
192
+ displayName: target.displayName,
193
+ issues: [`未找到配置文件:${target.configPath}`],
194
+ serverName: target.serverName
195
+ };
196
+ const blockMatch = (await fs.readFile(target.configPath, "utf8")).match(resolveCodexBlockPattern(target.serverName));
197
+ if (!blockMatch?.[0]) return {
198
+ configExists: true,
199
+ configPath: target.configPath,
200
+ displayName: target.displayName,
201
+ issues: [`未找到 weapp-vite 生成的 Codex 配置区块:${target.serverName}`],
202
+ serverName: target.serverName
203
+ };
204
+ const block = blockMatch[0];
205
+ const issues = [];
206
+ const urlMatch = block.match(REG_CodexUrl);
207
+ const commandMatch = block.match(REG_CodexCommand);
208
+ const argsMatch = block.match(REG_CodexArgs);
209
+ if (urlMatch?.[1]) {
210
+ const reachable = await probeHttpEndpoint(urlMatch[1]);
211
+ if (!reachable) issues.push(`HTTP MCP 地址不可达:${urlMatch[1]}`);
212
+ return {
213
+ configExists: true,
214
+ configPath: target.configPath,
215
+ displayName: target.displayName,
216
+ httpReachable: reachable,
217
+ issues,
218
+ serverName: target.serverName,
219
+ transport: "http"
220
+ };
221
+ }
222
+ const binPath = (argsMatch?.[1]?.match(REG_FirstTomlString))?.[1];
223
+ if (!commandMatch?.[1]) issues.push("Codex 配置区块缺少 command 字段");
224
+ if (!binPath || !await fs.pathExists(binPath)) issues.push(`未找到本地 CLI 入口:${binPath ?? "缺少 args[0]"}`);
225
+ return {
226
+ configExists: true,
227
+ configPath: target.configPath,
228
+ displayName: target.displayName,
229
+ issues,
230
+ serverName: target.serverName,
231
+ transport: "command"
232
+ };
233
+ }
234
+ async function inspectMcpClientConfig(options) {
235
+ const target = resolveTarget(options.client, path.resolve(options.workspaceRoot));
236
+ if (target.client === "codex") return await inspectCodexConfig(target);
237
+ return await inspectJsonConfig(target);
238
+ }
239
+ //#endregion
240
+ //#region src/cli/mcpClient/plan.ts
241
+ function resolveSupportedMcpClient(input) {
242
+ if (input === "codex" || input === "claude-code" || input === "cursor") return input;
243
+ throw new Error(`不支持的 MCP 客户端:${input}。当前仅支持 codex、claude-code、cursor。`);
244
+ }
245
+ function buildMcpClientConfigPlan(options) {
246
+ const workspaceRoot = path.resolve(options.workspaceRoot);
247
+ const target = resolveTarget(options.client, workspaceRoot);
248
+ const entry = resolveConfigEntry(options.client, options.transport, workspaceRoot, options.url);
249
+ if (options.transport === "http" && !entry.url) throw new Error("HTTP 模式缺少 MCP 服务地址,请使用 --url 指定或在当前项目中检测到可用地址。");
250
+ return {
251
+ entry,
252
+ preview: target.client === "codex" ? renderCodexBlock(target.serverName, entry) : renderJsonPreview(target.serverName, entry),
253
+ target,
254
+ transport: options.transport
255
+ };
256
+ }
257
+ function formatMcpQuickStart(options) {
258
+ const suffix = options.transport === "http" && options.httpUrl ? ` --transport http --url ${options.httpUrl}` : "";
259
+ return [
260
+ "在 AI 工具中接入 weapp-vite MCP:",
261
+ ` - Codex: wv mcp init codex${suffix}`,
262
+ ` - Claude Code: wv mcp init claude-code${suffix}`,
263
+ ` - Cursor: wv mcp init cursor${suffix}`
264
+ ];
265
+ }
266
+ //#endregion
267
+ //#region src/cli/mcpClient/index.ts
268
+ async function writeMcpClientConfig(plan) {
269
+ await fs.ensureDir(path.dirname(plan.target.configPath));
270
+ const existing = await fs.readFile(plan.target.configPath, "utf8").catch(() => "");
271
+ if (plan.target.client === "codex") {
272
+ const nextContent = upsertCodexManagedBlock(existing, plan.target.serverName, plan.preview);
273
+ await fs.writeFile(plan.target.configPath, nextContent, "utf8");
274
+ return;
275
+ }
276
+ const parsed = parseJsonConfig(existing, plan.target.configPath);
277
+ const nextConfig = {
278
+ ...parsed,
279
+ mcpServers: {
280
+ ...parsed.mcpServers ?? {},
281
+ [plan.target.serverName]: plan.entry
282
+ }
283
+ };
284
+ await fs.writeFile(plan.target.configPath, `${JSON.stringify(nextConfig, null, 2)}\n`, "utf8");
285
+ }
286
+ //#endregion
287
+ export { inspectMcpClientConfig as a, resolveSupportedMcpClient as i, buildMcpClientConfigPlan as n, formatMcpQuickStart as r, writeMcpClientConfig as t };
@@ -0,0 +1,59 @@
1
+ import path from "pathe";
2
+ //#region src/analyze/subpackages/metadata.ts
3
+ const defaultTotalBudgetBytes = 20971520;
4
+ const defaultPackageBudgetBytes = 2097152;
5
+ const defaultWarningRatio = .85;
6
+ const defaultHistoryDir = ".weapp-vite/analyze-history";
7
+ const defaultHistoryLimit = 20;
8
+ function resolveBudgetValue(value, fallback) {
9
+ return typeof value === "number" && Number.isFinite(value) && value > 0 ? value : fallback;
10
+ }
11
+ function resolveHistoryLimit(value) {
12
+ return typeof value === "number" && Number.isFinite(value) && value > 0 ? Math.floor(value) : defaultHistoryLimit;
13
+ }
14
+ function resolveAnalyzeBudgets(configService) {
15
+ const budgets = configService.weappViteConfig.analyze?.budgets;
16
+ const legacyPackageBudget = configService.weappViteConfig.packageSizeWarningBytes;
17
+ const packageFallback = resolveBudgetValue(legacyPackageBudget, defaultPackageBudgetBytes);
18
+ const optionalBudget = (value) => typeof value === "number" && Number.isFinite(value) && value >= 0 ? value : void 0;
19
+ return {
20
+ totalBytes: resolveBudgetValue(budgets?.totalBytes, defaultTotalBudgetBytes),
21
+ mainBytes: resolveBudgetValue(budgets?.mainBytes, packageFallback),
22
+ subPackageBytes: resolveBudgetValue(budgets?.subPackageBytes, packageFallback),
23
+ independentBytes: resolveBudgetValue(budgets?.independentBytes, packageFallback),
24
+ runtimeBytes: optionalBudget(budgets?.runtimeBytes),
25
+ packageBytes: budgets?.packageBytes ? Object.fromEntries(Object.entries(budgets.packageBytes).filter(([, value]) => optionalBudget(value) !== void 0)) : void 0,
26
+ warningRatio: resolveBudgetValue(budgets?.warningRatio, defaultWarningRatio),
27
+ source: budgets ? "config" : "default"
28
+ };
29
+ }
30
+ function resolveAnalyzeHistoryMetadata(configService) {
31
+ const history = configService.weappViteConfig.analyze?.history;
32
+ if (history === false) return {
33
+ enabled: false,
34
+ dir: path.resolve(configService.cwd, defaultHistoryDir),
35
+ limit: defaultHistoryLimit
36
+ };
37
+ const historyConfig = typeof history === "object" && history ? history : {};
38
+ const rawDir = typeof historyConfig.dir === "string" && historyConfig.dir.trim() ? historyConfig.dir.trim() : defaultHistoryDir;
39
+ return {
40
+ enabled: historyConfig.enabled !== false,
41
+ dir: path.isAbsolute(rawDir) ? rawDir : path.resolve(configService.cwd, rawDir),
42
+ limit: resolveHistoryLimit(historyConfig.limit)
43
+ };
44
+ }
45
+ function createAnalyzeMetadata(configService, now = /* @__PURE__ */ new Date()) {
46
+ const history = resolveAnalyzeHistoryMetadata(configService);
47
+ const packageName = configService.packageJson?.name;
48
+ return {
49
+ projectName: typeof packageName === "string" && packageName.trim() ? packageName.trim() : path.basename(configService.cwd),
50
+ generatedAt: now.toISOString(),
51
+ budgets: resolveAnalyzeBudgets(configService),
52
+ history: {
53
+ ...history,
54
+ dir: configService.relativeCwd(history.dir)
55
+ }
56
+ };
57
+ }
58
+ //#endregion
59
+ export { resolveAnalyzeBudgets as n, resolveAnalyzeHistoryMetadata as r, createAnalyzeMetadata as t };
@@ -0,0 +1,7 @@
1
+ import process from "node:process";
2
+ //#region src/cli/nodeEnv.ts
3
+ function setCommandNodeEnv(nodeEnv) {
4
+ process.env.NODE_ENV = nodeEnv;
5
+ }
6
+ //#endregion
7
+ export { setCommandNodeEnv as t };