weapp-vite 7.4.0 → 7.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (92) hide show
  1. package/README.md +51 -1
  2. package/bin/bootstrap.js +14 -1
  3. package/dist/adapters-CcHrsYaj.mjs +1 -0
  4. package/dist/analyze-ZJUvEdaY.mjs +248 -0
  5. package/dist/auto-import-components/resolvers.mjs +1 -2
  6. package/dist/auto-import-presets/wevu-router.mjs +1 -2
  7. package/dist/auto-import-presets/wevu.mjs +1 -2
  8. package/dist/auto-routes.mjs +2 -1
  9. package/dist/budget-BD7VqLCl.d.mts +178 -0
  10. package/dist/chunkStrategy-DRA5WpB-.mjs +1436 -0
  11. package/dist/cli-acceptance.d.mts +1 -0
  12. package/dist/cli-acceptance.mjs +21 -0
  13. package/dist/cli.mjs +1420 -1554
  14. package/dist/compatibility.mjs +1 -2
  15. package/dist/{config-Dbvj5yK7.d.mts → config-V0L-IAJf.d.mts} +87 -30
  16. package/dist/config.d.mts +2 -2
  17. package/dist/config.mjs +1 -1
  18. package/dist/{constants-WOsG3Eqd.mjs → constants-DEZdcsMn.mjs} +1 -1
  19. package/dist/{createContext-UOEgeYnA.mjs → createCompilerContextInstance-DJH_P_nZ.mjs} +31278 -32148
  20. package/dist/createContext-BqYzHhY9.mjs +12 -0
  21. package/dist/dashboard/analyze.d.mts +48 -0
  22. package/dist/dashboard/analyze.mjs +1 -0
  23. package/dist/dashboard/vite.d.mts +1 -1
  24. package/dist/dashboard-DvqF3Key.mjs +1842 -0
  25. package/dist/dashboard.d.mts +3 -2
  26. package/dist/dashboard.mjs +1 -2
  27. package/dist/dashboardViteBridge-Dy3nAD4m.mjs +299 -0
  28. package/dist/dev-fR5GiJRO.mjs +63 -0
  29. package/dist/devProvider-BGBkw28J.mjs +1050 -0
  30. package/dist/docs/README.md +51 -1
  31. package/dist/docs/ai-workflows.md +4 -0
  32. package/dist/docs/doctor.md +38 -0
  33. package/dist/docs/getting-started.md +3 -1
  34. package/dist/docs/index.md +3 -1
  35. package/dist/docs/mcp.md +94 -1
  36. package/dist/docs/testing.md +29 -2
  37. package/dist/docs/troubleshooting.md +8 -0
  38. package/dist/docs/uni-app-component-libraries.md +8 -7
  39. package/dist/docs/upload.md +40 -3
  40. package/dist/docs/vite-plugin.md +171 -0
  41. package/dist/docs/vue-sfc.md +19 -0
  42. package/dist/docs/weapp-config.md +54 -0
  43. package/dist/docs/wevu-authoring.md +10 -0
  44. package/dist/doctor-worker.d.mts +1 -0
  45. package/dist/doctor-worker.mjs +59 -0
  46. package/dist/doctor.d.mts +144 -0
  47. package/dist/doctor.mjs +848 -0
  48. package/dist/eslint.mjs +1 -2
  49. package/dist/file-DRb4eWqw.mjs +1 -0
  50. package/dist/{file-giE9UMZa.mjs → file-sC3jD7Fh.mjs} +15 -9
  51. package/dist/files-BqxFIPRp.mjs +45 -0
  52. package/dist/getInstance-DiGSzBNI.mjs +28 -0
  53. package/dist/getInstance-SiE6WZRh.mjs +1 -0
  54. package/dist/index-C9HjUX5c.d.mts +741 -0
  55. package/dist/index.d.mts +10 -8
  56. package/dist/index.mjs +3 -2
  57. package/dist/json.d.mts +1 -1
  58. package/dist/json.mjs +1 -2
  59. package/dist/lifecycle-BROTlwSL.mjs +320 -0
  60. package/dist/loadConfig-C3BQhz7F.mjs +59 -0
  61. package/dist/loadConfig-VGtBF4qm.mjs +1 -0
  62. package/dist/logger-DGn5iEVN.mjs +1 -0
  63. package/dist/{mcp-BG6TliEg.mjs → mcp-Cj8Maqo6.mjs} +16 -7
  64. package/dist/mcp-D3Yh24Cj.mjs +529 -0
  65. package/dist/mcp.d.mts +6 -3
  66. package/dist/mcp.mjs +1 -2
  67. package/dist/package-7swhyLmf.mjs +91 -0
  68. package/dist/path-doV773b7.mjs +103 -0
  69. package/dist/{platform-DTWs5QRi.mjs → platform-CnkySBKz.mjs} +1 -1
  70. package/dist/processCleanup-B6KA30Zc.mjs +77 -0
  71. package/dist/protocol-vg8HGJ4n.mjs +138 -0
  72. package/dist/{resolvers-icNxkpcy.mjs → resolvers-Dod-euqX.mjs} +4 -1
  73. package/dist/resolvers.mjs +1 -2
  74. package/dist/runtime.mjs +1 -2
  75. package/dist/session-PskhD-nZ.mjs +390 -0
  76. package/dist/test.d.mts +1 -0
  77. package/dist/test.mjs +201 -44
  78. package/dist/types.d.mts +2 -2
  79. package/dist/{upload-D0RcEWrq.mjs → upload-D4msblBf.mjs} +174 -15
  80. package/dist/upload-worker.mjs +136 -3
  81. package/dist/utils-CJSCgEj6.mjs +1094 -0
  82. package/dist/vite.d.mts +9 -0
  83. package/dist/vite.mjs +270 -0
  84. package/dist/volar.d.mts +2 -2
  85. package/dist/web-apis.mjs +1 -2
  86. package/package.json +67 -41
  87. package/dist/adapters-BwnMMIZR.mjs +0 -2
  88. package/dist/dashboard-BzaVesmQ.mjs +0 -558
  89. package/dist/file-D19nbDoN.mjs +0 -2
  90. package/dist/getInstance-CYF1vl5l.mjs +0 -2
  91. package/dist/index-DbqVupg0.d.mts +0 -246
  92. package/dist/logger-mt4mSTqV.mjs +0 -2
@@ -0,0 +1,171 @@
1
+ # 标准 Vite 插件与 Vite+
2
+
3
+ `weapp-vite/vite` 提供实验性的生产构建、classic 与 stateful 开发入口。当前阶段支持六平台单目标原生 JS/TS、Wevu Vue SFC 编译;微信另已验收 React、自动路由、自动组件、普通分包、独立分包、worker、微信插件双产物与 lib mode。主产物由宿主 Vite 的编译管线生成。
4
+
5
+ ## 配置
6
+
7
+ 项目使用 ESM(`package.json` 设置 `"type": "module"`),或将配置命名为 `vite.config.mts`:
8
+
9
+ ```ts
10
+ import { defineConfig } from 'vite'
11
+ import { weapp } from 'weapp-vite/vite'
12
+
13
+ export default defineConfig({
14
+ plugins: [weapp()],
15
+ weapp: {
16
+ platform: 'weapp',
17
+ srcRoot: 'src',
18
+ hmr: { runtime: 'classic' },
19
+ },
20
+ })
21
+ ```
22
+
23
+ 插件没有第二套配置参数。配置文件由宿主加载,插件不会自动发现或合并另一份 `weapp-vite.config.*`。迁移时把配置收敛到一个入口;需要拆文件时,在该入口显式导入。不要重复调用 `weapp()`,也不要把同一插件实例共享给两个活动宿主。
24
+
25
+ ```sh
26
+ vite build
27
+ vite dev
28
+ ```
29
+
30
+ `mode: 'test'` 仍可用于生产构建。测试识别依赖实际 Vitest 宿主标识,不根据 mode 猜测。只读取配置不会扫描小程序入口、生成支持文件或启动 IDE/MCP;`wv prepare` 继续负责类型支持文件。
31
+
32
+ ## Vite+
33
+
34
+ 配置中的 `defineConfig` 改为从 `vite-plus` 导入,然后使用 `vp build` / `vp dev`。Vite+ 消费项目须按官方迁移规则把 `vite` 指向配套 core,并确保 weapp-vite 的依赖也解析到同一宿主。例如 npm 项目:
35
+
36
+ ```json
37
+ {
38
+ "type": "module",
39
+ "devDependencies": {
40
+ "vite-plus": "1.0.0",
41
+ "vite": "npm:@voidzero-dev/vite-plus-core@1.0.0"
42
+ },
43
+ "overrides": {
44
+ "vite": "npm:@voidzero-dev/vite-plus-core@1.0.0"
45
+ }
46
+ }
47
+ ```
48
+
49
+ pnpm 使用项目级 `pnpm-workspace.yaml` 的 `overrides` 完成同样的 alias;不要只修改顶层依赖而留下 weapp-vite 内嵌的另一套 Vite。该组合对应 Vite 8.3.1 / Rolldown 1.2.11;Vite+ 项目验证线为 Node 24.11+,普通 weapp-vite 的 Node 范围不变。
50
+
51
+ ## 当前命令边界
52
+
53
+ | 命令 | 当前行为 |
54
+ | --- | --- |
55
+ | `vite build` / `vp build` | 实验性单目标小程序生产构建 |
56
+ | `wv dev` / `wv build` | 保留原有能力;显式插件不会重复安装编译器 |
57
+ | `vite dev` / `vp dev` | 实验性 classic / stateful 开发;由宿主管理启动、重启与关闭 |
58
+ | `vite build --watch` / `vp build --watch` | 实验性生产 watch:完整目标产物、入口增删与失败恢复 |
59
+ | `vp test` | 插件不启动小程序编译;mpcore 测试继续显式使用 artifact API |
60
+ | `wv prepare/open/upload/mcp` | 继续使用小程序专属命令 |
61
+ | `vp preview` | Vite 的 Web 预览,不是小程序二维码预览 |
62
+ | `vp pack` | 通用库打包,不替代小程序 lib mode |
63
+
64
+ 每次调用选择一个目标。纯 Web 使用 `weapp.platform: 'web'`;Web/小程序同宿主混合开发仍未开放。
65
+
66
+ 生产构建、build watch、classic 与实验性 stateful dev 已接入。脚手架支持与业务模板独立的 `--toolchain=wv|vite|vite-plus`,生成对应宿主脚本、显式配置入口和 Vite+ core alias;小程序专属命令继续使用 `wv`。任务缓存、Dashboard/MCP 会话复用和完整跨平台发布矩阵仍属于后续阶段。完整编译能力对齐继续由 #1097 追踪;高级目标限制是阶段边界。
67
+
68
+ ## classic 开发
69
+
70
+ `vite dev` / `vp dev` 由宿主负责服务器和配置重载,小程序会话复用现有增量编译调度,产物经 Vite/Rolldown 原生 write 落盘。首次完整产物就绪后才打印小程序就绪日志。脚本、模板、样式和页面增删会更新产物;语法错误修正后继续编译。宿主 `server.close()`(包括 middleware mode)会等待正在执行的构建再释放自有资源。
71
+
72
+ classic 模式不支持宿主 `experimental.bundledDev: true`,开启时会在启动前报错。classic 更新遵循完整重载语义,不承诺实例状态保持。`wv dev` 保留原有 HMR 选择和全部目标能力。
73
+
74
+ 同一宿主目前只编译一个小程序目标,暂不支持同时开发 Web。插件不会自动打开 IDE、启动 MCP 或上传。
75
+
76
+ ## 检查与排障
77
+
78
+ - 缺少入口:核对 `weapp.srcRoot`、`app.json`/`app.vue` 和宿主的 `root`。
79
+ - ESM 配置加载失败:使用 `type: module` 或 `.mts`,不依赖旧 CLI 的 runner 回退。
80
+ - 引擎加载失败:核对 Vite+ core alias 和实际解析路径;配套引擎缺失时会报错,不静默切换到其他 Rolldown。
81
+ - 类型检查:继续使用 `wv prepare`、`vue-tsc`/`tsc`、ESLint 与 stylelint;`vp check` 不能替代全部小程序规则。
82
+ - 缓存:开发服务、IDE、上传、MCP 与 runtime E2E 不应配置任务缓存。生产缓存的完整恢复与输入失效矩阵尚未验收。
83
+
84
+ 跟踪:[标准插件与 Vite+ 集成 #1097](https://github.com/weapp-vite/weapp-vite/issues/1097)。
85
+
86
+ ## 生产 watch
87
+
88
+ `vite build --watch` 与 `vp build --watch` 复用生产配置,每轮通过宿主 emit/write 发布当前目标的完整产物。支持脚本、模板、样式更新,页面增删和语法错误恢复;删除页面时清理对应的已拥有产物及 sourcemap。`emptyOutDir: false` 时保留其他工具写入的文件。关闭 watcher 会等待本轮写出和会话资源释放。
89
+
90
+ 这一路径不提供状态保持 HMR,也不自动重启配置文件。修改 Vite 配置或配置依赖后,按宿主 build watch 的语义重新启动命令;需要配置自动重启时使用 classic `vite dev` / `vp dev`。目标能力限制与插件生产构建一致。
91
+
92
+ ## 实验性 stateful 开发
93
+
94
+ 在同一顶层配置中设置 `weapp.hmr.runtime: 'stateful-experimental'`,继续使用 `vite dev` / `vp dev`。适配器安装在宿主的 client 环境,使用其配套 Rolldown DevEngine;不会另起一个 Vite 服务。无需手工开启 `experimental.bundledDev`,但宿主必须提供所需私有 API,能力检查失败会明确报错。
95
+
96
+ 该模式面向微信 WebView,需开启微信开发者工具热重载。当前宿主遇到 Skyline 或缺失私有 API 时明确报错,需显式改用 classic;独立 CLI 的自动降级行为保留。JS 安全补丁、模板与样式更新复用现有 stateful 协议;页面入口拓扑变化由宿主重新创建会话,配置依赖变化由宿主重新加载配置。关闭会等待本会话拥有的任务和引擎;不会关闭其他宿主实例。
97
+
98
+ 普通 Vite 与 Vite+ 均已验证原生 Page/Component 脚本补丁、样式更新、模板往返及 Wevu 本地/store 状态保持,包含 headless 可观察语义与真实微信 IDE。Vite+ 验收在严格安装的独立发布包依赖图中使用原生 `vp dev`;独立 `wv` 同时通过同组 headless 与真实微信 IDE 回归。当前结果覆盖这些定向场景,完整跨平台发布矩阵仍需持续验证。
99
+
100
+ middleware mode 支持构建与可等待关闭。运行小程序的 stateful 通信还需要消费方把 Vite middleware 挂载到可访问的 HTTP 服务,并配置对应端口;只创建 middleware 服务不会自动提供监听端点。
101
+
102
+ ## React
103
+
104
+ 注册同一个 `weapp()`,继续使用顶层 `weapp.react` 配置和既有 `@weapp-vite/react` 运行时。生产构建、classic、生产 watch 与实验性 stateful 共用 React 编译器;静态 TSX 在 stateful 下按既有规则重建会话,不承诺 React hooks 状态跨此类重载保持。
105
+
106
+ `renderMode: 'auto'` 可组合静态 WXML、动态模板与原生/Wevu 组件 bridge;`dynamic` 仍不支持原生组件 bridge。React Compiler 继续是可选 SWC 能力,其安装与降级规则不随宿主改变。模板输出使用共享的源码根与输出路径映射,支持自定义 `srcRoot` 和符号链接项目路径。
107
+
108
+ ## 独立分包
109
+
110
+ `app.json` 或 `app.vue` 中的 `subPackages[].independent`,以及顶层 `weapp.subPackages` 的配置沿用独立 CLI 语义。三入口共享独立子构建;子构建直接复用本次已加载的配置、CLI 覆盖与用户插件,不再次执行配置文件。
111
+
112
+ 每个子构建只生成内存产物,最终由主构建的 Vite/Rolldown 发布。classic、stateful 和原生生产 watch 由宿主调度子包更新,不为独立分包另外创建 watcher。生产 watch 支持独立脚本与模板依赖、语法错误恢复,以及删除分包后的陈旧产物清理。
113
+
114
+ stateful 下独立分包源码由宿主 watcher 驱动完整更新批次,不承诺子包 JS 状态保持;子包的 Vue、脚本和伴随资产无需进入主 DevEngine 模块图也能触发更新。
115
+
116
+ ## worker
117
+
118
+ 沿用 `app.json` 的 `workers` 与顶层 `weapp.worker.entry`,三入口使用同一子目标编译。原生 app builder 纳入 worker 环境,子目标复用已加载的配置和用户插件,返回内存产物;最终由主应用原生 emit/write 一次发布。
119
+
120
+ classic、stateful 和生产 watch 不为 worker 额外启动构建 watcher。输入归属主会话,包含 worker 依赖修改、错误恢复、新增导入以及关闭等待;从 app 配置移除 worker 后,生产 watch 清理旧输出。stateful 中 worker 变化触发完整更新,不承诺保留 worker 线程状态。
121
+
122
+ ## 微信插件项目
123
+
124
+ 三入口共用顶层 `weapp.pluginRoot` 与 `project.config.json` 的插件输出配置。生产构建通过 app builder 登记 `weapp_plugin` 环境,在主应用落盘后构建插件,复用本次已加载配置与用户转换插件。主应用、插件和插件 npm 全部完成后才报告成功。
125
+
126
+ 插件输出可放在主应用输出内部或同级目录,但不能等于或包含主应用输出目录。classic 与 stateful 宿主都保留独立的插件编译会话,由父会话负责关闭;插件 watcher 负责增量更新与入口拓扑重建,不承诺插件 JS 状态保持。生产 watch 支持共享依赖、编译失败恢复和插件页面移除。
127
+
128
+ 当前阶段不支持双产物的 `build.write: false`,会提前报错。npm 自定义回调和手工映射共用上述输出归属规则;真实插件 runtime 仍需按目标平台验收。
129
+
130
+ 手工 npm 关联从主 `packageJsonPath` 所在目录解析依赖,再按 Node 规则向上查找;递归依赖从所属父包解析。CLI 缓存跟踪所选 manifest 的依赖变化,回调的工程 `root` 和相对输出基准保持不变。外部父子映射迁移时,按整轮绝对文件归属差集删除旧文件,不会误删当前产物或用户文件。
131
+
132
+ ## 小程序组件库
133
+
134
+ 顶层 `weapp.lib` 直接用于 `wv build`、`vite build` 和 `vp build`。原生组件、Vue SFC、纯脚本入口及 `fileName` 输出映射沿用同一编译器,声明文件与 JS、JSON、模板和样式一起进入原生 bundle;`build.write: false` 返回包含声明的内存产物。
135
+
136
+ 生产 watch 追踪声明编译器发现的类型依赖,类型变更会重新生成声明。每轮声明编译使用独立 TypeScript 缓存,避免旧类型跨轮复用。classic `dev` 可用于组件库源码更新,开发模式沿用独立 CLI 不生成声明的规则;组件交互在消费它的小程序应用中验证。
137
+
138
+ `vp pack` 继续使用通用库打包语义;小程序库的模板、样式、JSON 和专属声明仍通过 `weapp.lib` 构建。
139
+
140
+
141
+ ## 六平台目标选择
142
+
143
+ 三入口共用顶层 `weapp.platform`,可选择 `weapp`、`alipay`、`tt`、`swan`、`jd`、`xhs`。启用 `weapp.multiPlatform` 时也可通过该字段指定本次目标,独立 CLI 继续接受 `--platform`。普通 Vite/Vite+ 命令不接受 `wv` 专属的 `--platform` 参数;多目标使用不同配置文件或任务,并确保输出目录独立。
144
+
145
+ ```ts
146
+ import { defineConfig } from 'vite'
147
+ import { weapp } from 'weapp-vite/vite'
148
+
149
+ export default defineConfig({
150
+ plugins: [weapp()],
151
+ weapp: {
152
+ platform: 'alipay',
153
+ srcRoot: 'src',
154
+ multiPlatform: true,
155
+ hmr: { runtime: 'classic' },
156
+ },
157
+ })
158
+ ```
159
+
160
+ 目录式平台项目配置从 `config/<platform>/` 读取,默认发布到 `dist/<platform>/`,小程序产物位于其 `dist/` 子目录。项目配置同样通过配套原生引擎写出,生产 watch 更新并清理本会话已拥有的文件;拒绝覆盖小程序编译输出的配置目录内容。目录式配置暂不支持 `build.write: false`,内联 `multiPlatform.projectConfigs` 可随主 bundle 返回内存产物。配置目录中的符号链接尚未开放。
161
+
162
+ 原生 TS 和 Vue SFC 的六平台生产构建、classic 更新,以及普通 Vite/Vite+ 的生产 watch 使用同一消费矩阵。stateful 仅开放微信;其他平台明确使用 classic。微信运行时使用 headless 与真实 IDE 验收;其他平台的构建/增量检查不代表各自真实 IDE runtime 均已通过,高级能力仍按平台分别验收。
163
+
164
+
165
+ ## 纯 Web 目标
166
+
167
+ 三入口都可在顶层设置 `weapp.platform: 'web'`,沿用 `weapp.web` 的源码根、输出目录和 runtime 配置;未指定 `weapp.web` 时使用 Web 默认值。普通 Vite 与 Vite+ 继续注册同一个 `weapp()`,独立 `wv` 无需注册插件,也无需再传 `--platform web`。显式 CLI `--platform` 覆盖配置目标。
168
+
169
+ 项目需保留既有 Web `index.html`,通过 `/@weapp-vite/web/entry` 启动 runtime。纯 Web 不要求小程序 `project.config.json`,默认输出 `dist/web`,不会同时生成小程序 bundle。原生生产构建、开发服务和插件生产 watch 使用宿主生命周期;Web 的浏览器 HMR 不启用微信 stateful 引擎。
170
+
171
+ 生产产物与 dev 服务均使用浏览器验证 Vue SFC、原生组件语义和交互。Web 测试只证明浏览器目标,不替代六个平台真实 IDE 验收。Web/小程序混合宿主仍会明确报错,后续需独立环境隔离后再开放。
@@ -124,6 +124,18 @@ defineOptions({ behaviors: [i18n.behavior] })
124
124
  <view class="br" />
125
125
  ```
126
126
 
127
+ ## 原生插槽与 `provide` / `inject`
128
+
129
+ `weapp.vue.template.scopedSlotsRequireProps` 默认 `false`,普通插槽仍使用增强方案。设为 `true` 时,无 scoped props 的内容保留原生 `<slot>`。
130
+
131
+ 微信目标下,编译后的 Wevu Provider 和 Leaf 使用默认 `setupLifecycle: 'attached'` 时,`<Provider><Leaf /></Provider>` 中的 Leaf 会在 setup 前同步关联最近的插槽承载者。Leaf 的 `inject()` 能取得 Provider 提供的原始对象、ref 和方法;点击调用 action 会更新双方共享状态。具名、普通节点包裹、嵌套和多实例场景遵循同一规则,卸载重建不会沿用旧上下文。
132
+
133
+ 这条协议不新增包装节点,不复制注入值,不修改原生 `Component.export` / `selectOwnerComponent()`。显式 `setupLifecycle: 'created'` 或 attached 前的公开实例恢复仍按原时机执行 setup,不提供该保证;未经 Wevu 编译的原生/第三方组件也不自动成为注入承载者。
134
+
135
+ 内层 Wevu Provider 即使使用过滤后的 `export()` / `expose()`,其普通模板子组件(含 Options API 局部注册别名)和原生插槽子组件仍共享内层上下文;外部选择器只看到该 Provider 的公开导出,内部父链不依赖公开导出对象。
136
+
137
+ 已验证环境:微信 DevTools Stable `2.02.2608080`(基础库 `3.17.2`、`3.13.2`)和 `2.02.2608060`(基础库 `3.17.2`),并保留 mpcore 回归;这些结果不代替其他版本组合或真机验证。其他小程序平台及 Web 目标不启用此协议,构建时裁剪其声明属性、事件接收与清理代码,不能由微信或 headless 结果推断支持。`false` / augmented 和实际 scoped props 继续使用既有增强插槽路径。
138
+
127
139
  ## 具名插槽透传 wrapper
128
140
 
129
141
  当你把当前组件的 `<slot />` 转发到子组件的具名插槽时:
@@ -350,3 +362,10 @@ defineOptions({ behaviors: [i18n.behavior] })
350
362
  - 需要更完整的编辑器提示说明:[`../volar.md`](../volar.md)
351
363
  - 需要运行时页面/组件/store 约束:[`wevu-authoring.md`](./wevu-authoring.md)
352
364
  - 需要项目级 `weapp` 配置:[`weapp-config.md`](./weapp-config.md)
365
+
366
+
367
+ ## JSON 合并读取页面声明
368
+
369
+ `weapp.json.mergeStrategy(target, source, ctx)` 可读取当前 SFC 页面的 `ctx.routeConfig`(`definePage` 的静态 `{ name, meta }`)和 `ctx.pageMeta`(`definePageMeta` 的完整静态对象)。元信息支持内联、外部脚本与规范导入别名,并贯穿编译阶段、`emit`、`merge-existing` 和 JSON-only HMR。
370
+
371
+ 可按 `typeof ctx.routeConfig?.meta?.title === 'string'` 映射 `navigationBarTitleText`。`pageMeta` 含动态变量、调用、展开或访问器时整个字段为 `undefined`;编译器不会执行表达式或返回部分对象。无声明以及非页面组件不提供这些字段。已有非法路由声明诊断保持有效。
@@ -14,6 +14,12 @@ export default defineConfig({
14
14
  })
15
15
  ```
16
16
 
17
+ ## 构建语法目标
18
+
19
+ 顶层 `build.target` 沿用 Vite 标准语义。若关闭 IDE 的 ES6 转 ES5 和增强编译后,真机调试上传在可选链(`?.`)处报 `Unexpected token .`,可设置 `build: { target: 'es2019' }` 并重新构建,由 Vite 降级语法。IDE 模拟器可运行不代表上传解析器支持相同语法;生成二维码也不代替目标设备上的功能验证。
20
+
21
+ `build.target` 不补齐运行时 API。完整配置边界见[构建与产物配置](https://vite.weapp.dev/config/build-and-output.html)。
22
+
17
23
  ## 高频配置项
18
24
 
19
25
  ### `srcRoot`
@@ -24,6 +30,8 @@ export default defineConfig({
24
30
 
25
31
  适合希望用约定生成页面路由的项目。启用后要保持 pages 目录与输出约定稳定。
26
32
 
33
+ `autoRoutes: { extensions: ['vue', 'tsx'] }` 只选择允许后缀的页面入口,声明提取、构建与增量更新使用同一选择;未配置或空数组保持原行为。`include` 仍匹配无扩展名 base。多个允许源码沿用 `ts/js/tsx/jsx/vue` 优先级;同名模板、JSON、样式和显式业务导入不会被过滤。
34
+
27
35
  ### `multiPlatform.projectConfigs`
28
36
 
29
37
  在一份配置中按 `weapp` / `alipay` / `tt` / `xhs` / `jd` / `swan` 提供原生项目字段,公共项用普通对象展开。没有显式 `targets` 时从映射键推导;完整示例见[上传速查](./upload.md#多平台与输出校验)。
@@ -160,6 +168,10 @@ const moduleExport = await import('../../packages/order/modules/price.ts')
160
168
 
161
169
  适合用目录扫描自动注册组件的项目。组件重名时要先解决命名冲突,不要让自动引入规则长期处于歧义状态。
162
170
 
171
+ 开发态下,目录扫描与文件监听使用一致的组件路径标识,Windows 路径分隔符不同不会形成两份注册记录。删除组件会移除注册;恢复文件或修改组件声明后,会重新判断是否满足注册条件。重建页面配置时,会重新计算自动生成的 `usingComponents`,移除失效的自动绑定,同时保留源码中显式声明的绑定。
172
+
173
+ 派生配置变化后,增量构建也会发布新的页面 JSON,包括清空配置时的 `{}`,不依赖变更文件是否为 JSON。
174
+
163
175
  ### `i18n`
164
176
 
165
177
  微信项目可以通过 `weapp.i18n` 启用由 `@weapp-vite/i18n` 提供核心语义的 locale 编译与运行时切换:
@@ -232,6 +244,8 @@ export default defineConfig({
232
244
 
233
245
  provider 的状态由 provider 自己维护,host 负责插件顺序、源码所有权冲突、依赖监听和产物生命周期。`weapp.tailwindcss` 仍然是内置 Tailwind adapter 的兼容门面;UnoCSS 等实现可以独立包的形式提供同一协议。
234
246
 
247
+ 源码转换的 `dependencies` 与该次转换内的 `context.addWatchFile(id)` 共同声明依赖;成功转换后替换该源码的依赖集合,由 Vite 的模块图传播失效。开发快照写出结束不会提前释放 controller,所属开发会话结束时只调用一次 `dispose`。状态保持 HMR 将已声明依赖的新增、修改、删除纳入冻结输入,provider 应读取 `request.sources`,不能读取后续保存的可变文件。
248
+
235
249
  微信状态保持 HMR 使用可选的 `controller.prepareHmr(request)` 协作:输入提供 `revision`、`changedFiles` 与固定的 `sources` 内容视图,返回本批次的 `assets`、`transformJavaScript`、依赖信息和资源释放方法。资产路径相对于输出目录;所有 Patch 共用该批次的编译状态。宿主通过 Vite/Rolldown 提交资产后才发布补丁,并在客户端执行回报后通知 DevEngine。开启 sourcemap 时,修改代码的转换必须同时返回映射。没有批次接口的内容 provider 使用完整构建回退。
236
250
 
237
251
  共享协议由实验包 `@weapp-vite/hmr` 提供,Tailwind 控制器委托 `@weapp-vite/tailwindcss` 和 `weapp-tailwindcss/core`。两个包均不创建 DevEngine、watcher 或直接写出产物,框架与宿主运行时仍由适配器拥有;现有配置和 `prepareHmr` 类型兼容。Taro 的实验适配保留其持久发布与应用确认两阶段,不改变 weapp-vite 在应用确认后通知 DevEngine 的语义。
@@ -288,6 +302,12 @@ export default defineConfig({
288
302
 
289
303
  微信构建会把 `preload` 合成为 `app.json.preloadRule`;手写的同一路由规则优先,其他平台不会生成微信专属字段。多条 glob 命中时选择具体程度最高的一条。需要检查静态跨分包跳转时,运行 `wv analyze --preload`;它只输出建议,不修改源码,并按触发页所属包汇总实际分包体积与共享的 2 MB 额度。
290
304
 
305
+ ### `wevu.preset`
306
+
307
+ `weapp.wevu.preset: 'performance'` 默认开启 patch、隐藏时暂停、`setData.diagnostics: 'fallback'`、开发态高频告警和自动 `setData.pick`。`weapp.wevu.defaults` 的同名字段优先;内建诊断没有 `devOnly` 限制,可显式设为 `'off'`。
308
+
309
+ 首次快照收集也可能记录 `needsFullSnapshot`;阶段日志不等于独立回退或物理调用。配置覆盖与计数边界见 [`wevu-authoring.md`](./wevu-authoring.md)。
310
+
291
311
  ### `vue.template.htmlTagToWxml`
292
312
 
293
313
  适合从 Web/Vue 模板迁移到小程序 `.vue` 的项目。开启后,会把常见 HTML 标签映射成小程序内置标签,例如 `div -> view`、`span -> text`、`img -> image`、`a -> navigator`,也包含 `br/hr` 这类容易在迁移时“消失”的标签。
@@ -514,6 +534,10 @@ export default defineConfig({
514
534
 
515
535
  不要在 `srcRoot`、路由来源、分包边界都没确认前就先调 chunk 策略。
516
536
 
537
+ ### `web`
538
+
539
+ Web 重新扫描项目期间,已扫描 Vue SFC 的模板、样式与脚本继续使用上一次成功扫描的完整快照。扫描成功后才切换到新版本;扫描失败会保留旧快照并报告错误,修复后可继续更新。同一文件的正斜杠与反斜杠路径共用缓存,不会混入尚未发布的磁盘内容。
540
+
517
541
  ### `hmr.runtime`
518
542
 
519
543
  默认值为 `auto`。微信项目会在 `wv dev` 启动时根据开发者工具设置自动选择 HMR 运行时,也可显式锁定状态保持型热更新:
@@ -530,6 +554,16 @@ export default defineConfig({
530
554
 
531
555
  安全的 JavaScript/Vue 更新会保留当前 Page/Component 实例、route/query、输入和可序列化 data/setup ref,并替换原生 Page、原生 Component 与 wevu 方法。CSS、资源、JSON/配置、不兼容模块图或补丁失败会回退完整构建与当前路由重载。
532
556
 
557
+ 入口拓扑更新先验证完整快照,再把仍符合源目录和声明依赖内容版本的快照一次性交给新宿主,避免重复编译。输入变化、依赖覆盖不足或固定输入批次无法验证时重新构建;快照失败时保留旧宿主,修复尚未进入旧图的新文件也能触发重试。会话关闭会取消未交接的候选。
558
+
559
+ Vue `<style module>` 会生成脚本中的类名映射,因此其内容、模块名称、`src` 及块增删都按脚本与样式共同更新处理,避免后续补丁引用未交付的样式模块。独立的普通 `<style>` 变化仍按纯样式处理;产物更新和真实 DevTools 已应用计算样式需要分别验收。
560
+
561
+ 样式合并按真实文件身份判断所有权:已由模块图处理的样式,即使又通过符号链接、目录连接或 Windows 路径别名被发现,也不会作为独立原生样式重复读取并合并。固定输入批次保持该批次的样式内容,不混入同一文件较新的磁盘保存;真正独立的原生同名样式仍参与输出,移除显式样式导入后仍保留原生样式回退。
562
+
563
+ 回退时,同一输出当前收集到的多个 sidecar 按收集顺序合并后一次发布,不会相互覆盖;指向同一真实文件的重复路径只保留一份。常规 HMR 更新按完整合并内容去重,而不是分别缓存每个片段。
564
+
565
+ 上述保证不涵盖原生样式文件删除事件对历史登记集合的清理;本次修复没有验证或改变该上游生命周期。
566
+
533
567
  `auto` 在 `project.private.config.json` 的 `setting.compileHotReLoad` 严格为 `true` 时选择 `stateful-experimental`,否则选择 `classic`;非微信平台也会回退到 `classic`。该判断只在启动时执行,修改开发者工具设置后需要重启 `wv dev`。启动日志会以 `HMR 模式` 和 `HMR 切换` 两行显示最终模式、选择来源,以及通过 DevTools 热重载开关或 `weapp.hmr.runtime` 切换模式的方法。显式配置通常优先,但 Skyline 兼容降级不受显式配置覆盖。
534
568
 
535
569
  状态保持模式目前只支持微信小程序 WebView,需要微信开发者工具开启服务端口和热重载。微信开发者工具暂不支持 Skyline 热重载;首次编译检测到任意生成的应用或页面 JSON 使用 `renderer: 'skyline'` 时,`wv dev` 会输出带官方兼容文档链接的警告,将当前项目私有配置中的 `setting.compileHotReLoad` 持久化为 `false`,并强制使用 `classic`,包括显式配置 `stateful-experimental` 的场景。其他私有配置字段不会改变,切回 WebView 后也不会自动重新开启热重载。需要既有写盘/刷新行为时显式配置 `classic`。
@@ -557,6 +591,10 @@ export default defineConfig({
557
591
 
558
592
  - `logLevel: 'default' | 'concise' | 'verbose'` 控制终端诊断详细程度。
559
593
  - `profileJson: boolean | string` 控制是否输出 JSONL profile,字符串表示自定义输出路径。
594
+ - JSONL v1 保留旧字段,增加 `sessionId` / `buildId` / `batchId` / `sourceEvents` 与时钟来源;按来源精确匹配编辑。失败记录只有 `elapsedMs`;无受影响入口的批次以 `incomplete` / `reason: no-affected-entries` 结束观测,不污染后续构建。未知版本、未完成或缺失阶段不能按零耗时统计。`buildCoreMs` 是残差估算,阶段可能重叠。
595
+ - `analyze --hmr-profile --json` 的 `inputCoverage` 提供输入覆盖计数;旧版无版本记录仍兼容,未关联样本不归给当前编辑。
596
+ - stateful JSONL 以 `pipeline: 'stateful'` 区分,记录源通知到批次接收、准备、提交等待、提交及发布阶段。`completionBoundary` 区分客户端交付确认与产物发布;缺失来源、失败或取消不能计为成功耗时。`timelines` 只累加互不重叠的外层时段,未知阶段及负残差保持 `null`,不把嵌套 hook 重复累加。
597
+ - 模板 benchmark 的预算使用外部 `wallMs`,缺失 profile 不再填充 `totalMs`。仓库 `verify:edit-sequence --engine weapp-classic|weapp-stateful` 默认以 512 个真实 SFC 页面比较长期编译宿主和逐步新进程基线,同时记录进程树 RSS、强制 GC 后 heap、GC 开销及资源/转换范围。完整页面 JS 由 mpcore 执行,此结果不能替代真实 IDE 验收;profile 开关语义与开销比较入口为 `scripts/editSequence/compareProfiles.ts`。
560
598
 
561
599
  ### `mcp`
562
600
 
@@ -875,3 +913,19 @@ export default defineConfig({
875
913
  `wxml-policy.json` 例如 `["debug-panel"]`。同一文件跨模板或阶段登记会去重;修改、删除、恢复触发完整模板重建与校验。局部构建保留未触及模板的依赖,成功完整构建清理失效登记。不要监听输出目录,也不要把一次读取的结果永久缓存而忽略规则更新。
876
914
 
877
915
  “最终”指框架管理的输出链完成后的模板,不保证覆盖任意排在该阶段之后的第三方 Vite 插件修改。不保证跨文件/分包回调顺序,不追踪任意文件读取、环境变量或网络响应;第一版不提供内置业务规则、跨文件全局校验、独立 CLI 或报告文件,也不能替代宿主完整语法和运行时检查。
916
+
917
+ ## Analyze 产物消费与预算
918
+
919
+ 小程序 `wv analyze --json --budget-check` 输出 schema v2 的 `artifacts.files`、`build` 与 `budgetChecks`,日志进入 stderr。每个物理文件保留路径、包归属、字节和 SHA-256;runtime 依据模块所属包分类,不依赖 chunk 名称。分包复制的 JS asset 仍保留原模块来源。
920
+
921
+ `weapp.analyze.budgets.runtimeBytes` 限制包含 runtime 模块的文件字节上界(包含混合 chunk 的业务部分);`packageBytes` 按分包 root 覆盖单包预算,主包键为 `__main__`。超限或缺少归因时 `--budget-check` 返回非零。
922
+
923
+ `estimatedBytes` 是按打包器长度分摊的模块估算,`unattributedBytes` 显式保留未知部分。单份共享文件计一次,真正的分包副本分别计入总包;runtime 和重复模块估算不能再加到总包上。旧的无版本报告仍保留兼容读取,但不能作为新 runtime 预算通过证据。
924
+
925
+ ## 构建目录与外部缓存
926
+
927
+ 默认清理策略适合构建器独占的输出目录。共享目录使用 `build.emptyOutDir: false` 时,构建上下文只清理它已登记的旧产物,不能删除新进程开始前由其他工具或外部缓存写入的未知文件。
928
+
929
+ 推荐 dev 输出到独立目录,Turbo 只缓存生产目录,dev 任务设置 `cache: false`、`persistent: true`。必须共用目录时,由缓存集成持久记录成功构建的 emitted 文件清单与内容摘要,恢复及清理仅针对该任务拥有的文件;用户改写或同名冲突必须保留并报告。不要把无条件清空输出目录加入 HMR 兜底逻辑。最终构建产物仍由 Vite/Rolldown emit/write 持久化。
930
+
931
+ 仓库组合回归入口为 `pnpm verify:edit-sequence --engine weapp-modes --require-clean --report .tmp/output-mode-sequence.json`,运行前重建 weapp-vite。它逐步比较模式切换、组件/页面/分包拓扑变化和旧缓存恢复后的完整生产文件,与独立进程基线按字节核对;共享目录额外检查用户文件保护。此项不是真实 IDE runtime 验收。
@@ -37,6 +37,16 @@ else if (import.meta.env.PLATFORM === 'web') {
37
37
 
38
38
  这类写法通常会导致时序错误或生命周期不触发。
39
39
 
40
+ ## performance 预设与 setData 诊断
41
+
42
+ `weapp.wevu.preset: 'performance'` 为 app/component 注入 `setData.strategy: 'patch'`、`suspendWhenHidden: true`、`diagnostics: 'fallback'` 和开发态 `highFrequencyWarning`,并默认启用 `autoSetDataPick`。`weapp.wevu.defaults` 的同名字段覆盖预设;`autoSetDataPick` 的显式布尔值也优先。
43
+
44
+ 内建 `diagnostics` 默认关闭,预设开启后没有 `devOnly` 限制,生产构建也可能输出日志。将 app/component 的 `setData.diagnostics` 设为 `'off'` 只关闭内建日志,自定义 `debug` 回调仍有效。
45
+
46
+ `needsFullSnapshot` 可能来自 patch 首次收集快照、变更路径无法定位,或此前提交失败后的恢复。首次收集仍可只下发差异,单条 reason 不证明失败或完整 payload;恢复须结合 `commitFailure`、revision 和成功结算判断。
47
+
48
+ 显式开启 `debugPhases: true` 后,同一 revision 会增加 prepare、dispatch、commit 记录,内建日志也会打印这些记录。按同一会话内的 `(phase.observerId, revision)` 关联更新,按 `phase.dispatch.id` 去重调用;将初始化与计时区间分开,不能从 warning 条数推导回退率或预设收益。宿主 heap 缺失时保留未完成的内存验收,不用 Node worker RSS 替代。
49
+
40
50
  ## 事件与双向绑定
41
51
 
42
52
  复杂表单或可复用字段组件优先使用 `bindModel` / `useBindModel`,不要让事件细节分散在大量不一致的自定义协议里。
@@ -0,0 +1 @@
1
+ export {}
@@ -0,0 +1,59 @@
1
+ import { t as createCompilerContext } from "./createContext-BqYzHhY9.mjs";
2
+ import { r as resolveAnalyzeBudgets, t as terminateStaleSassEmbeddedProcess } from "./processCleanup-B6KA30Zc.mjs";
3
+ import { r as readDoctorFiles } from "./files-BqxFIPRp.mjs";
4
+ import process from "node:process";
5
+ import path from "node:path";
6
+ import { randomUUID } from "node:crypto";
7
+ //#region src/doctor/buildWorker.ts
8
+ process.once("message", async (options) => {
9
+ try {
10
+ const outputRoot = path.join(options.cwd, ".weapp-vite", "doctor", options.target, randomUUID());
11
+ const limitations = /* @__PURE__ */ new Set();
12
+ const ctx = await createCompilerContext({
13
+ cwd: options.cwd,
14
+ configFile: options.configFile,
15
+ cliPlatform: options.target,
16
+ isDev: false,
17
+ mode: "production",
18
+ outputRoot,
19
+ inlineConfig: {
20
+ build: {
21
+ outDir: outputRoot,
22
+ emptyOutDir: true
23
+ },
24
+ plugins: [{
25
+ name: "weapp-vite-doctor-output-scope",
26
+ enforce: "post",
27
+ writeBundle(output) {
28
+ const relative = path.relative(outputRoot, path.resolve(output.dir ?? path.dirname(output.file ?? outputRoot)));
29
+ if (relative.startsWith("..") || path.isAbsolute(relative)) limitations.add("构建器输出包含快照根目录外的路径;不能证明产物覆盖完整。");
30
+ }
31
+ }]
32
+ },
33
+ syncSupportFiles: false,
34
+ preloadAppEntry: false,
35
+ emitDefaultAutoImportOutputs: false
36
+ });
37
+ if (path.resolve(ctx.configService.outDir) !== outputRoot || ctx.configService.platform !== options.target) throw new Error("实际编译目标或产物目录与 Doctor 请求不一致");
38
+ await ctx.buildService.build();
39
+ if (ctx.configService.weappViteConfig.npm?.buildOptions) limitations.add("自定义 npm.buildOptions 可改变输出目录;当前快照不证明目录外 npm 产物完整。");
40
+ const snapshot = {
41
+ files: await readDoctorFiles(outputRoot),
42
+ origin: "build",
43
+ freshness: "current-build",
44
+ capturedAt: (/* @__PURE__ */ new Date()).toISOString(),
45
+ budgets: resolveAnalyzeBudgets(ctx.configService),
46
+ sourceRoot: path.relative(options.cwd, ctx.configService.absoluteSrcRoot).split(path.sep).join("/"),
47
+ outputRoot: path.relative(options.cwd, outputRoot).split(path.sep).join("/"),
48
+ limitations: [...limitations]
49
+ };
50
+ terminateStaleSassEmbeddedProcess();
51
+ process.send?.({ snapshot }, () => process.exit(0));
52
+ } catch (error) {
53
+ process.stderr.write(`${error instanceof Error ? error.stack : String(error)}\n`);
54
+ terminateStaleSassEmbeddedProcess();
55
+ process.exit(2);
56
+ }
57
+ });
58
+ //#endregion
59
+ export {};
@@ -0,0 +1,144 @@
1
+ import { Xn as MpPlatform } from "./config-V0L-IAJf.mjs";
2
+ import { i as AnalyzeBudgetConfig } from "./budget-BD7VqLCl.mjs";
3
+ import { OperationDiagnostics } from "@weapp-vite/miniprogram-automator";
4
+ //#region src/doctor/types.d.ts
5
+ type DoctorLayer = 'project' | 'source' | 'artifact' | 'runtime';
6
+ interface DoctorCoverage {
7
+ target: string;
8
+ layer: DoctorLayer;
9
+ check: string;
10
+ status: 'complete' | 'incomplete' | 'not-requested';
11
+ reason?: string;
12
+ }
13
+ interface DoctorDiagnostic {
14
+ ruleId: string;
15
+ target: string;
16
+ layer: DoctorLayer;
17
+ severity: 'error' | 'warning';
18
+ message: string;
19
+ location?: {
20
+ file: string;
21
+ line?: number;
22
+ column?: number;
23
+ };
24
+ evidence: {
25
+ expected: string;
26
+ actual: string;
27
+ };
28
+ responsibility: {
29
+ owner: 'project' | 'framework' | 'platform' | 'unknown';
30
+ confidence: 'confirmed' | 'suspected';
31
+ };
32
+ suggestion: string;
33
+ fingerprint: string;
34
+ }
35
+ interface DoctorFile {
36
+ path: string;
37
+ size: number;
38
+ sha256: string;
39
+ text?: string;
40
+ }
41
+ interface DoctorArtifactSnapshot {
42
+ files: readonly DoctorFile[];
43
+ origin: 'build' | 'existing';
44
+ capturedAt: string;
45
+ /** 既有目录只证明当前字节,不证明来自当前源码。 */
46
+ freshness: 'current-build' | 'unverified';
47
+ budgets?: AnalyzeBudgetConfig;
48
+ /** 相对项目目录的实际编译源码目录。 */
49
+ sourceRoot?: string;
50
+ /** 相对项目目录的本轮输出目录。 */
51
+ outputRoot?: string;
52
+ limitations?: readonly string[];
53
+ }
54
+ interface DoctorRuntimeEvidence {
55
+ host: string;
56
+ deviceSystem?: string;
57
+ route: string;
58
+ provider: string;
59
+ checks: readonly string[];
60
+ /** false 表示已有部分事实,但请求的运行时探针没有全部完成。 */
61
+ complete?: boolean;
62
+ facts?: readonly DoctorRuntimeFact[];
63
+ bundle?: DoctorRuntimeBundle;
64
+ }
65
+ type DoctorRuntimeStage = 'cli-executable' | 'service-listener' | 'login-query' | 'login-state' | 'project-connection' | 'tool-info' | 'host-version' | 'sdk-version' | 'current-page' | 'session-release';
66
+ interface DoctorRuntimeFact {
67
+ stage: DoctorRuntimeStage;
68
+ status: 'passed' | 'failed' | 'unknown' | 'not-run';
69
+ code: string;
70
+ }
71
+ interface DoctorRuntimeProbeOptions {
72
+ /** 所有已请求探针的总预算,包含本次连接清理。 */
73
+ timeout?: number;
74
+ signal?: AbortSignal;
75
+ /** 只读检查的显式 CLI;仅 login 为 true 时执行原生查询。 */
76
+ cliPath?: string;
77
+ /** 显式允许原生 islogin,可能启动 IDE,必须同时指定 cliPath。 */
78
+ login?: boolean;
79
+ /** 只检查指定回环 TCP 端口,不据此认定监听者是微信 IDE。 */
80
+ servicePort?: number;
81
+ }
82
+ interface DoctorRuntimeBundle {
83
+ /** 仅含固定阶段、预算与资源类别,不包含原始错误文本。 */
84
+ operation?: OperationDiagnostics;
85
+ frameworkVersion: string;
86
+ nodeVersion: string;
87
+ versions: {
88
+ ide?: string;
89
+ sdk?: string;
90
+ };
91
+ configuration: {
92
+ target: string;
93
+ provider: string;
94
+ explicitCli: boolean;
95
+ explicitAutomatorPort: boolean;
96
+ explicitServicePort: boolean;
97
+ loginRequested: boolean;
98
+ };
99
+ lastSuccessfulStage?: DoctorRuntimeStage;
100
+ /** 只记录固定阶段与分类,不包含宿主原始输出、凭据或源码。 */
101
+ events: readonly DoctorRuntimeFact[];
102
+ reproduction: string;
103
+ }
104
+ interface DoctorReport {
105
+ schemaVersion: 1;
106
+ generatedAt: string;
107
+ targets: string[];
108
+ coverage: DoctorCoverage[];
109
+ diagnostics: DoctorDiagnostic[];
110
+ artifacts: Record<string, Omit<DoctorArtifactSnapshot, 'files'> & {
111
+ files: Array<Omit<DoctorFile, 'text'>>;
112
+ }>;
113
+ runtime: Record<string, DoctorRuntimeEvidence>;
114
+ exitCode: 0 | 1 | 2;
115
+ }
116
+ interface DoctorOptions {
117
+ cwd?: string;
118
+ targets?: readonly string[];
119
+ /** 静态检查的显式源码目录;不执行配置推断。 */
120
+ source?: string;
121
+ artifact?: string;
122
+ build?: boolean;
123
+ runtime?: boolean;
124
+ /** 连接已有 automator 会话的端口;省略时使用项目派生端口。 */
125
+ runtimePort?: number;
126
+ runtimeCliPath?: string;
127
+ runtimeLogin?: boolean;
128
+ runtimeServicePort?: number;
129
+ configFile?: string;
130
+ onBuildLog?: (text: string) => void;
131
+ }
132
+ interface DoctorAdapters {
133
+ build: (options: DoctorOptions, target: MpPlatform) => Promise<DoctorArtifactSnapshot>;
134
+ runtime: (cwd: string, target: MpPlatform, port?: number, options?: DoctorRuntimeProbeOptions) => Promise<DoctorRuntimeEvidence>;
135
+ }
136
+ //#endregion
137
+ //#region src/doctor/report.d.ts
138
+ export declare function formatDoctorReport(report: DoctorReport, format?: 'terminal' | 'json' | 'sarif'): string;
139
+ //#endregion
140
+ //#region src/doctor/index.d.ts
141
+ /** 分层收集事实;静态路径永不调用配置加载器、构建或宿主连接。 */
142
+ export declare function runDoctor(options?: DoctorOptions, adapters?: Partial<DoctorAdapters>): Promise<DoctorReport>;
143
+ //#endregion
144
+ export type { DoctorAdapters, DoctorArtifactSnapshot, DoctorCoverage, DoctorDiagnostic, DoctorFile, DoctorLayer, DoctorOptions, DoctorReport, DoctorRuntimeBundle, DoctorRuntimeEvidence, DoctorRuntimeFact, DoctorRuntimeProbeOptions, DoctorRuntimeStage };