@dimina-kit/devtools 0.1.0-dev.20260422094158

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 (301) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +562 -0
  3. package/dist/main/api.d.ts +21 -0
  4. package/dist/main/api.d.ts.map +1 -0
  5. package/dist/main/api.js +22 -0
  6. package/dist/main/api.js.map +1 -0
  7. package/dist/main/app/app.d.ts +15 -0
  8. package/dist/main/app/app.d.ts.map +1 -0
  9. package/dist/main/app/app.js +192 -0
  10. package/dist/main/app/app.js.map +1 -0
  11. package/dist/main/app/bootstrap.d.ts +14 -0
  12. package/dist/main/app/bootstrap.d.ts.map +1 -0
  13. package/dist/main/app/bootstrap.js +41 -0
  14. package/dist/main/app/bootstrap.js.map +1 -0
  15. package/dist/main/app/launch.d.ts +10 -0
  16. package/dist/main/app/launch.d.ts.map +1 -0
  17. package/dist/main/app/launch.js +28 -0
  18. package/dist/main/app/launch.js.map +1 -0
  19. package/dist/main/app/lifecycle.d.ts +2 -0
  20. package/dist/main/app/lifecycle.d.ts.map +1 -0
  21. package/dist/main/app/lifecycle.js +11 -0
  22. package/dist/main/app/lifecycle.js.map +1 -0
  23. package/dist/main/index.d.ts +2 -0
  24. package/dist/main/index.d.ts.map +1 -0
  25. package/dist/main/index.js +3 -0
  26. package/dist/main/index.js.map +1 -0
  27. package/dist/main/ipc/app.d.ts +3 -0
  28. package/dist/main/ipc/app.d.ts.map +1 -0
  29. package/dist/main/ipc/app.js +14 -0
  30. package/dist/main/ipc/app.js.map +1 -0
  31. package/dist/main/ipc/index.d.ts +9 -0
  32. package/dist/main/ipc/index.d.ts.map +1 -0
  33. package/dist/main/ipc/index.js +9 -0
  34. package/dist/main/ipc/index.js.map +1 -0
  35. package/dist/main/ipc/panels.d.ts +3 -0
  36. package/dist/main/ipc/panels.d.ts.map +1 -0
  37. package/dist/main/ipc/panels.js +39 -0
  38. package/dist/main/ipc/panels.js.map +1 -0
  39. package/dist/main/ipc/popover.d.ts +3 -0
  40. package/dist/main/ipc/popover.d.ts.map +1 -0
  41. package/dist/main/ipc/popover.js +13 -0
  42. package/dist/main/ipc/popover.js.map +1 -0
  43. package/dist/main/ipc/projects.d.ts +3 -0
  44. package/dist/main/ipc/projects.d.ts.map +1 -0
  45. package/dist/main/ipc/projects.js +15 -0
  46. package/dist/main/ipc/projects.js.map +1 -0
  47. package/dist/main/ipc/session.d.ts +3 -0
  48. package/dist/main/ipc/session.d.ts.map +1 -0
  49. package/dist/main/ipc/session.js +10 -0
  50. package/dist/main/ipc/session.js.map +1 -0
  51. package/dist/main/ipc/settings.d.ts +3 -0
  52. package/dist/main/ipc/settings.d.ts.map +1 -0
  53. package/dist/main/ipc/settings.js +61 -0
  54. package/dist/main/ipc/settings.js.map +1 -0
  55. package/dist/main/ipc/simulator.d.ts +3 -0
  56. package/dist/main/ipc/simulator.d.ts.map +1 -0
  57. package/dist/main/ipc/simulator.js +26 -0
  58. package/dist/main/ipc/simulator.js.map +1 -0
  59. package/dist/main/ipc/toolbar.d.ts +3 -0
  60. package/dist/main/ipc/toolbar.d.ts.map +1 -0
  61. package/dist/main/ipc/toolbar.js +10 -0
  62. package/dist/main/ipc/toolbar.js.map +1 -0
  63. package/dist/main/menu/index.d.ts +3 -0
  64. package/dist/main/menu/index.d.ts.map +1 -0
  65. package/dist/main/menu/index.js +65 -0
  66. package/dist/main/menu/index.js.map +1 -0
  67. package/dist/main/services/automation/exec.d.ts +9 -0
  68. package/dist/main/services/automation/exec.d.ts.map +1 -0
  69. package/dist/main/services/automation/exec.js +33 -0
  70. package/dist/main/services/automation/exec.js.map +1 -0
  71. package/dist/main/services/automation/handlers/app.d.ts +3 -0
  72. package/dist/main/services/automation/handlers/app.d.ts.map +1 -0
  73. package/dist/main/services/automation/handlers/app.js +132 -0
  74. package/dist/main/services/automation/handlers/app.js.map +1 -0
  75. package/dist/main/services/automation/handlers/element.d.ts +3 -0
  76. package/dist/main/services/automation/handlers/element.d.ts.map +1 -0
  77. package/dist/main/services/automation/handlers/element.js +151 -0
  78. package/dist/main/services/automation/handlers/element.js.map +1 -0
  79. package/dist/main/services/automation/handlers/page.d.ts +3 -0
  80. package/dist/main/services/automation/handlers/page.d.ts.map +1 -0
  81. package/dist/main/services/automation/handlers/page.js +66 -0
  82. package/dist/main/services/automation/handlers/page.js.map +1 -0
  83. package/dist/main/services/automation/handlers/tool.d.ts +3 -0
  84. package/dist/main/services/automation/handlers/tool.d.ts.map +1 -0
  85. package/dist/main/services/automation/handlers/tool.js +8 -0
  86. package/dist/main/services/automation/handlers/tool.js.map +1 -0
  87. package/dist/main/services/automation/index.d.ts +18 -0
  88. package/dist/main/services/automation/index.d.ts.map +1 -0
  89. package/dist/main/services/automation/index.js +95 -0
  90. package/dist/main/services/automation/index.js.map +1 -0
  91. package/dist/main/services/automation/registry.d.ts +6 -0
  92. package/dist/main/services/automation/registry.d.ts.map +1 -0
  93. package/dist/main/services/automation/registry.js +20 -0
  94. package/dist/main/services/automation/registry.js.map +1 -0
  95. package/dist/main/services/automation/shared.d.ts +24 -0
  96. package/dist/main/services/automation/shared.d.ts.map +1 -0
  97. package/dist/main/services/automation/shared.js +2 -0
  98. package/dist/main/services/automation/shared.js.map +1 -0
  99. package/dist/main/services/default-adapter.d.ts +3 -0
  100. package/dist/main/services/default-adapter.d.ts.map +1 -0
  101. package/dist/main/services/default-adapter.js +17 -0
  102. package/dist/main/services/default-adapter.js.map +1 -0
  103. package/dist/main/services/layout/index.d.ts +27 -0
  104. package/dist/main/services/layout/index.d.ts.map +1 -0
  105. package/dist/main/services/layout/index.js +49 -0
  106. package/dist/main/services/layout/index.js.map +1 -0
  107. package/dist/main/services/mcp/index.d.ts +15 -0
  108. package/dist/main/services/mcp/index.d.ts.map +1 -0
  109. package/dist/main/services/mcp/index.js +15 -0
  110. package/dist/main/services/mcp/index.js.map +1 -0
  111. package/dist/main/services/mcp/server.d.ts +10 -0
  112. package/dist/main/services/mcp/server.d.ts.map +1 -0
  113. package/dist/main/services/mcp/server.js +76 -0
  114. package/dist/main/services/mcp/server.js.map +1 -0
  115. package/dist/main/services/mcp/target-manager.d.ts +43 -0
  116. package/dist/main/services/mcp/target-manager.d.ts.map +1 -0
  117. package/dist/main/services/mcp/target-manager.js +165 -0
  118. package/dist/main/services/mcp/target-manager.js.map +1 -0
  119. package/dist/main/services/mcp/tool-registry.d.ts +14 -0
  120. package/dist/main/services/mcp/tool-registry.d.ts.map +1 -0
  121. package/dist/main/services/mcp/tool-registry.js +84 -0
  122. package/dist/main/services/mcp/tool-registry.js.map +1 -0
  123. package/dist/main/services/mcp/tools/context-tools.d.ts +15 -0
  124. package/dist/main/services/mcp/tools/context-tools.d.ts.map +1 -0
  125. package/dist/main/services/mcp/tools/context-tools.js +244 -0
  126. package/dist/main/services/mcp/tools/context-tools.js.map +1 -0
  127. package/dist/main/services/mcp/tools/simulator-tools.d.ts +14 -0
  128. package/dist/main/services/mcp/tools/simulator-tools.d.ts.map +1 -0
  129. package/dist/main/services/mcp/tools/simulator-tools.js +143 -0
  130. package/dist/main/services/mcp/tools/simulator-tools.js.map +1 -0
  131. package/dist/main/services/mcp/tools/workbench-tools.d.ts +7 -0
  132. package/dist/main/services/mcp/tools/workbench-tools.d.ts.map +1 -0
  133. package/dist/main/services/mcp/tools/workbench-tools.js +13 -0
  134. package/dist/main/services/mcp/tools/workbench-tools.js.map +1 -0
  135. package/dist/main/services/notifications/renderer-notifier.d.ts +80 -0
  136. package/dist/main/services/notifications/renderer-notifier.d.ts.map +1 -0
  137. package/dist/main/services/notifications/renderer-notifier.js +70 -0
  138. package/dist/main/services/notifications/renderer-notifier.js.map +1 -0
  139. package/dist/main/services/projects/index.d.ts +2 -0
  140. package/dist/main/services/projects/index.d.ts.map +1 -0
  141. package/dist/main/services/projects/index.js +6 -0
  142. package/dist/main/services/projects/index.js.map +1 -0
  143. package/dist/main/services/projects/project-repository.d.ts +28 -0
  144. package/dist/main/services/projects/project-repository.d.ts.map +1 -0
  145. package/dist/main/services/projects/project-repository.js +145 -0
  146. package/dist/main/services/projects/project-repository.js.map +1 -0
  147. package/dist/main/services/settings/index.d.ts +16 -0
  148. package/dist/main/services/settings/index.d.ts.map +1 -0
  149. package/dist/main/services/settings/index.js +46 -0
  150. package/dist/main/services/settings/index.js.map +1 -0
  151. package/dist/main/services/simulator/dir.d.ts +2 -0
  152. package/dist/main/services/simulator/dir.d.ts.map +1 -0
  153. package/dist/main/services/simulator/dir.js +5 -0
  154. package/dist/main/services/simulator/dir.js.map +1 -0
  155. package/dist/main/services/simulator/referer.d.ts +10 -0
  156. package/dist/main/services/simulator/referer.d.ts.map +1 -0
  157. package/dist/main/services/simulator/referer.js +20 -0
  158. package/dist/main/services/simulator/referer.js.map +1 -0
  159. package/dist/main/services/views/view-manager.d.ts +84 -0
  160. package/dist/main/services/views/view-manager.d.ts.map +1 -0
  161. package/dist/main/services/views/view-manager.js +254 -0
  162. package/dist/main/services/views/view-manager.js.map +1 -0
  163. package/dist/main/services/workbench-context.d.ts +59 -0
  164. package/dist/main/services/workbench-context.d.ts.map +1 -0
  165. package/dist/main/services/workbench-context.js +33 -0
  166. package/dist/main/services/workbench-context.js.map +1 -0
  167. package/dist/main/services/workspace/index.d.ts +2 -0
  168. package/dist/main/services/workspace/index.d.ts.map +1 -0
  169. package/dist/main/services/workspace/index.js +2 -0
  170. package/dist/main/services/workspace/index.js.map +1 -0
  171. package/dist/main/services/workspace/workspace-service.d.ts +49 -0
  172. package/dist/main/services/workspace/workspace-service.d.ts.map +1 -0
  173. package/dist/main/services/workspace/workspace-service.js +90 -0
  174. package/dist/main/services/workspace/workspace-service.js.map +1 -0
  175. package/dist/main/utils/logger.d.ts +15 -0
  176. package/dist/main/utils/logger.d.ts.map +1 -0
  177. package/dist/main/utils/logger.js +48 -0
  178. package/dist/main/utils/logger.js.map +1 -0
  179. package/dist/main/utils/paths.d.ts +6 -0
  180. package/dist/main/utils/paths.d.ts.map +1 -0
  181. package/dist/main/utils/paths.js +15 -0
  182. package/dist/main/utils/paths.js.map +1 -0
  183. package/dist/main/utils/theme.d.ts +10 -0
  184. package/dist/main/utils/theme.d.ts.map +1 -0
  185. package/dist/main/utils/theme.js +13 -0
  186. package/dist/main/utils/theme.js.map +1 -0
  187. package/dist/main/windows/main-window/create.d.ts +11 -0
  188. package/dist/main/windows/main-window/create.d.ts.map +1 -0
  189. package/dist/main/windows/main-window/create.js +67 -0
  190. package/dist/main/windows/main-window/create.js.map +1 -0
  191. package/dist/main/windows/main-window/events.d.ts +9 -0
  192. package/dist/main/windows/main-window/events.d.ts.map +1 -0
  193. package/dist/main/windows/main-window/events.js +18 -0
  194. package/dist/main/windows/main-window/events.js.map +1 -0
  195. package/dist/main/windows/main-window/index.d.ts +5 -0
  196. package/dist/main/windows/main-window/index.d.ts.map +1 -0
  197. package/dist/main/windows/main-window/index.js +3 -0
  198. package/dist/main/windows/main-window/index.js.map +1 -0
  199. package/dist/main/windows/settings-window/create.d.ts +3 -0
  200. package/dist/main/windows/settings-window/create.d.ts.map +1 -0
  201. package/dist/main/windows/settings-window/create.js +18 -0
  202. package/dist/main/windows/settings-window/create.js.map +1 -0
  203. package/dist/main/windows/settings-window/events.d.ts +3 -0
  204. package/dist/main/windows/settings-window/events.d.ts.map +1 -0
  205. package/dist/main/windows/settings-window/events.js +6 -0
  206. package/dist/main/windows/settings-window/events.js.map +1 -0
  207. package/dist/main/windows/settings-window/index.d.ts +3 -0
  208. package/dist/main/windows/settings-window/index.d.ts.map +1 -0
  209. package/dist/main/windows/settings-window/index.js +3 -0
  210. package/dist/main/windows/settings-window/index.js.map +1 -0
  211. package/dist/preload/instrumentation/app-data.d.ts +3 -0
  212. package/dist/preload/instrumentation/app-data.d.ts.map +1 -0
  213. package/dist/preload/instrumentation/app-data.js +103 -0
  214. package/dist/preload/instrumentation/app-data.js.map +1 -0
  215. package/dist/preload/instrumentation/console.d.ts +2 -0
  216. package/dist/preload/instrumentation/console.d.ts.map +1 -0
  217. package/dist/preload/instrumentation/console.js +54 -0
  218. package/dist/preload/instrumentation/console.js.map +1 -0
  219. package/dist/preload/instrumentation/disposable.d.ts +11 -0
  220. package/dist/preload/instrumentation/disposable.d.ts.map +1 -0
  221. package/dist/preload/instrumentation/disposable.js +15 -0
  222. package/dist/preload/instrumentation/disposable.js.map +1 -0
  223. package/dist/preload/instrumentation/index.d.ts +5 -0
  224. package/dist/preload/instrumentation/index.d.ts.map +1 -0
  225. package/dist/preload/instrumentation/index.js +5 -0
  226. package/dist/preload/instrumentation/index.js.map +1 -0
  227. package/dist/preload/instrumentation/storage.d.ts +2 -0
  228. package/dist/preload/instrumentation/storage.d.ts.map +1 -0
  229. package/dist/preload/instrumentation/storage.js +106 -0
  230. package/dist/preload/instrumentation/storage.js.map +1 -0
  231. package/dist/preload/instrumentation/wxml-extract.d.ts +11 -0
  232. package/dist/preload/instrumentation/wxml-extract.d.ts.map +1 -0
  233. package/dist/preload/instrumentation/wxml-extract.js +173 -0
  234. package/dist/preload/instrumentation/wxml-extract.js.map +1 -0
  235. package/dist/preload/instrumentation/wxml.d.ts +5 -0
  236. package/dist/preload/instrumentation/wxml.d.ts.map +1 -0
  237. package/dist/preload/instrumentation/wxml.js +223 -0
  238. package/dist/preload/instrumentation/wxml.js.map +1 -0
  239. package/dist/preload/runtime/bridge.d.ts +36 -0
  240. package/dist/preload/runtime/bridge.d.ts.map +1 -0
  241. package/dist/preload/runtime/bridge.js +151 -0
  242. package/dist/preload/runtime/bridge.js.map +1 -0
  243. package/dist/preload/runtime/host.d.ts +3 -0
  244. package/dist/preload/runtime/host.d.ts.map +1 -0
  245. package/dist/preload/runtime/host.js +28 -0
  246. package/dist/preload/runtime/host.js.map +1 -0
  247. package/dist/preload/shared/api-compat.d.ts +2 -0
  248. package/dist/preload/shared/api-compat.d.ts.map +1 -0
  249. package/dist/preload/shared/api-compat.js +196 -0
  250. package/dist/preload/shared/api-compat.js.map +1 -0
  251. package/dist/preload/shared/constants.d.ts +16 -0
  252. package/dist/preload/shared/constants.d.ts.map +1 -0
  253. package/dist/preload/shared/constants.js +16 -0
  254. package/dist/preload/shared/constants.js.map +1 -0
  255. package/dist/preload/shared/types.d.ts +34 -0
  256. package/dist/preload/shared/types.d.ts.map +1 -0
  257. package/dist/preload/shared/types.js +8 -0
  258. package/dist/preload/shared/types.js.map +1 -0
  259. package/dist/preload/windows/main.d.ts +7 -0
  260. package/dist/preload/windows/main.d.ts.map +1 -0
  261. package/dist/preload/windows/main.js +7 -0
  262. package/dist/preload/windows/main.js.map +1 -0
  263. package/dist/preload/windows/simulator.js +969 -0
  264. package/dist/preload/windows/simulator.js.map +7 -0
  265. package/dist/renderer/assets/index-kcmIQPCg.js +2 -0
  266. package/dist/renderer/assets/index-kcmIQPCg.js.map +1 -0
  267. package/dist/renderer/assets/input-B7sz4y1r.js +2 -0
  268. package/dist/renderer/assets/input-B7sz4y1r.js.map +1 -0
  269. package/dist/renderer/assets/ipc-transport-C9-PPTGn.css +1 -0
  270. package/dist/renderer/assets/ipc-transport-L_WD9x12.js +9 -0
  271. package/dist/renderer/assets/ipc-transport-L_WD9x12.js.map +1 -0
  272. package/dist/renderer/assets/popover-CzMIs2j4.js +2 -0
  273. package/dist/renderer/assets/popover-CzMIs2j4.js.map +1 -0
  274. package/dist/renderer/assets/select-BBXJVe8R.js +2 -0
  275. package/dist/renderer/assets/select-BBXJVe8R.js.map +1 -0
  276. package/dist/renderer/assets/settings-Db1pvrBJ.js +2 -0
  277. package/dist/renderer/assets/settings-Db1pvrBJ.js.map +1 -0
  278. package/dist/renderer/assets/settings-api-DJ1M-CNt.js +2 -0
  279. package/dist/renderer/assets/settings-api-DJ1M-CNt.js.map +1 -0
  280. package/dist/renderer/assets/workbenchSettings-BnQsvWkQ.js +8 -0
  281. package/dist/renderer/assets/workbenchSettings-BnQsvWkQ.js.map +1 -0
  282. package/dist/renderer/entries/main/index.html +15 -0
  283. package/dist/renderer/entries/popover/index.html +18 -0
  284. package/dist/renderer/entries/settings/index.html +15 -0
  285. package/dist/renderer/entries/workbench-settings/index.html +15 -0
  286. package/dist/shared/constants.d.ts +10 -0
  287. package/dist/shared/constants.d.ts.map +1 -0
  288. package/dist/shared/constants.js +10 -0
  289. package/dist/shared/constants.js.map +1 -0
  290. package/dist/shared/ipc-channels.d.ts +89 -0
  291. package/dist/shared/ipc-channels.d.ts.map +1 -0
  292. package/dist/shared/ipc-channels.js +102 -0
  293. package/dist/shared/ipc-channels.js.map +1 -0
  294. package/dist/shared/types.d.ts +89 -0
  295. package/dist/shared/types.d.ts.map +1 -0
  296. package/dist/shared/types.js +2 -0
  297. package/dist/shared/types.js.map +1 -0
  298. package/dist/simulator/assets/simulator-C1eHXnuq.js +9 -0
  299. package/dist/simulator/assets/simulator-C1eHXnuq.js.map +1 -0
  300. package/dist/simulator/simulator.html +164 -0
  301. package/package.json +204 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 EchoTechFE and dimina-kit contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,562 @@
1
+ # Dimina DevTools
2
+
3
+ 基于 Electron 的小程序模块化开发者工具。提供模拟器、Chrome DevTools 面板、WXML/AppData/Storage 面板、编译配置等功能。
4
+
5
+ 所有功能拆分为独立可导入的模块,第三方可按需组装,最大程度支持自定义。
6
+
7
+ ---
8
+
9
+ ## 三种接入方式
10
+
11
+ | 级别 | 入口 | 控制力 | 适合场景 |
12
+ | ------------ | ---------------------- | ------------------ | -------------------- |
13
+ | **零配置** | `launch()` | 无 | 直接运行 |
14
+ | **配置驱动** | `createWorkbenchApp()` | 开关模块、选择面板 | 简单定制 |
15
+ | **模块组装** | 单独 import 各模块 | 完全控制 | 深度定制、自定义 IPC |
16
+
17
+ ### 零配置
18
+
19
+ ```typescript
20
+ import { launch } from '@dimina-kit/devtools/launch'
21
+ launch()
22
+ ```
23
+
24
+ ### 配置驱动
25
+
26
+ ```typescript
27
+ import { createWorkbenchApp } from '@dimina-kit/devtools/app'
28
+
29
+ createWorkbenchApp({
30
+ appName: 'My DevTools',
31
+ adapter: myAdapter,
32
+ panels: ['console', 'storage'], // 只显示这两个内置面板
33
+ modules: { settings: false }, // 禁用设置面板模块
34
+ window: { width: 1400, height: 900 },
35
+ }).start()
36
+ ```
37
+
38
+ ### 宿主扩展(推荐用于品牌化 / 自定义功能)
39
+
40
+ 基于 `createWorkbenchApp()` 的配置驱动模式,通过 hooks 注入宿主逻辑,无需手动组装模块:
41
+
42
+ ```typescript
43
+ import { suppressEpipe } from '@dimina-kit/devtools/bootstrap'
44
+ import { createWorkbenchApp } from '@dimina-kit/devtools/app'
45
+ import { rendererDir } from '@dimina-kit/devtools/paths'
46
+ import { ipcMain, Menu } from 'electron'
47
+
48
+ suppressEpipe()
49
+
50
+ createWorkbenchApp({
51
+ appName: '我的开发工具',
52
+ adapter: myAdapter,
53
+ preloadPath: '/path/to/my-preload.js',
54
+ rendererDir,
55
+ apiNamespaces: ['my'],
56
+ brandingProvider: () => ({ appName: '我的开发工具' }),
57
+ toolbarActions: () => [
58
+ { id: 'deploy', label: '发布' },
59
+ { id: 'preview', label: '预览' },
60
+ ],
61
+ icon: '/path/to/icon.png',
62
+ menuBuilder: (mainWindow, ctx) => {
63
+ // 自定义菜单,ctx 是 WorkbenchContext
64
+ Menu.setApplicationMenu(/* ... */)
65
+ },
66
+ onSetup: ({ mainWindow, context }) => {
67
+ // 注册自定义 IPC handler
68
+ ipcMain.handle('toolbar:action:deploy', async () => {
69
+ // 通过 service 访问状态:context.workspace.getProjectPath()、context.workspace.hasActiveSession()
70
+ })
71
+ },
72
+ onBeforeClose: ({ context }) => {
73
+ // 窗口关闭前的自定义清理逻辑
74
+ // session 关闭和 view 销毁由框架自动处理
75
+ },
76
+ }).start()
77
+ ```
78
+
79
+ ### 模块组装(仅在需要完全控制时使用)
80
+
81
+ ```typescript
82
+ import { app, globalShortcut } from 'electron'
83
+ import path from 'path'
84
+ import { createMainWindow } from '@dimina-kit/devtools/create-window'
85
+ import { createWorkbenchContext } from '@dimina-kit/devtools/context'
86
+ import { registerSimulatorIpc } from '@dimina-kit/devtools/ipc-simulator'
87
+ import { registerPanelsIpc } from '@dimina-kit/devtools/ipc-panels'
88
+ import { registerToolbarIpc } from '@dimina-kit/devtools/ipc-toolbar'
89
+ import { registerPopoverIpc } from '@dimina-kit/devtools/ipc-popover'
90
+ import { registerProjectsIpc } from '@dimina-kit/devtools/ipc-projects'
91
+ import { registerSessionIpc } from '@dimina-kit/devtools/ipc-session'
92
+ // registerSettingsIpc 不需要,不导入
93
+ import { rendererDir, defaultPreloadPath } from '@dimina-kit/devtools/paths'
94
+
95
+ app.whenReady().then(() => {
96
+ const mainWindow = createMainWindow({
97
+ title: 'My DevTools',
98
+ indexHtml: path.join(rendererDir, 'index.html'),
99
+ })
100
+
101
+ const ctx = createWorkbenchContext({
102
+ mainWindow,
103
+ adapter: myAdapter,
104
+ preloadPath: defaultPreloadPath,
105
+ rendererDir,
106
+ })
107
+
108
+ registerProjectsIpc(ctx)
109
+ registerSessionIpc(ctx)
110
+ registerSimulatorIpc(ctx)
111
+ registerPanelsIpc(ctx)
112
+ registerToolbarIpc(ctx)
113
+ registerPopoverIpc(ctx)
114
+
115
+ // 添加自定义 IPC — 通过 ctx.workspace 访问会话状态
116
+ ipcMain.handle('my:action', () => {
117
+ console.log('current project:', ctx.workspace.getProjectPath())
118
+ })
119
+
120
+ mainWindow.on('resize', () => ctx.views.repositionAll())
121
+ mainWindow.on('close', async (e) => {
122
+ if (ctx.workspace.hasActiveSession()) {
123
+ e.preventDefault()
124
+ await ctx.workspace.closeProject()
125
+ ctx.notify.windowNavigateBack()
126
+ }
127
+ })
128
+ })
129
+
130
+ app.on('window-all-closed', () => {
131
+ globalShortcut.unregisterAll()
132
+ app.quit()
133
+ })
134
+ ```
135
+
136
+ ---
137
+
138
+ ## 目录结构
139
+
140
+ ```
141
+ src/
142
+ shared/
143
+ types.ts # 跨层共享类型
144
+ constants.ts # 跨层共享常量
145
+ ipc-channels.ts # IPC 频道名称常量
146
+ main/
147
+ api.ts # 公共 API 聚合入口(package main)
148
+ app/
149
+ launch.ts # 零配置入口
150
+ app.ts # createWorkbenchApp 工厂
151
+ bootstrap.ts # suppressEpipe / setupCdpPort
152
+ lifecycle.ts # Electron app 生命周期注册
153
+ windows/
154
+ main-window/ # 主窗口创建 + 事件接线
155
+ settings-window/ # 独立设置窗口
156
+ ipc/ # 只做 handler 注册,不写业务
157
+ index.ts # 聚合 register 函数导出
158
+ simulator.ts # simulator attach/detach/resize
159
+ panels.ts # panel:list / panel:eval / selectSimulator
160
+ toolbar.ts # 品牌 / 工具栏配置
161
+ popover.ts # 编译配置弹窗
162
+ settings.ts # 项目设置 + workbench 设置
163
+ projects.ts # 项目列表管理
164
+ session.ts # 编译会话 open/close/status
165
+ services/ # 按业务领域分,真正的业务能力
166
+ settings/ # 用户级 workbench 设置读写 + 主题应用
167
+ projects/ # 项目列表 CRUD(持久化)
168
+ layout/ # 布局常量 + bounds 计算
169
+ mcp/ # MCP server
170
+ automation/ # 自动化 WebSocket 服务
171
+ simulator/ # simulator dir / referer
172
+ workbench-context.ts # 共享状态类型 + 工厂 + 辅助函数
173
+ default-adapter.ts # 默认 CompilationAdapter
174
+ menu/ # 应用菜单
175
+ utils/paths.ts # rendererDir / defaultPreloadPath
176
+
177
+ preload/ # 按注入目标分
178
+ windows/ # contextBridge 类型 preload
179
+ main.ts # 主窗口 preload,可组合导出 install*Instrumentation
180
+ simulator.ts # simulator webview 的默认 preload
181
+ shared/ # preload 之间共享
182
+ api-compat.ts # setupApiCompatHook
183
+ constants.ts
184
+ types.ts
185
+ instrumentation/ # 注入到小程序 runtime 的探针
186
+ console.ts # 控制台拦截
187
+ storage.ts # localStorage 拦截
188
+ app-data.ts # Worker setData 拦截
189
+ wxml.ts # Vue 组件树提取
190
+ runtime/
191
+ bridge.ts # installSimulatorBridge
192
+ host.ts
193
+
194
+ renderer/
195
+ entries/ # 各窗口 HTML + React 挂载点
196
+ main/ popover/ settings/ workbench-settings/
197
+ modules/ # 先按窗口分,再按区域
198
+ main/
199
+ app/ # 主窗口 App 根
200
+ features/ # 主窗口内的业务区域
201
+ project-runtime/ # 项目视图 + 工具栏 + 右侧面板切换
202
+ right-panel/ # WXML / AppData / Storage 面板
203
+ popover/ settings/ workbench-settings/
204
+ shared/
205
+ components/ # UI 组件(ui / layout / json-viewer / ...)
206
+ lib/ # ipc / simulator-url / utils / ...
207
+
208
+ simulator/ # 小程序容器运行时(独立 webview 入口)
209
+ simulator.html
210
+ main.tsx
211
+ simulator-api.ts
212
+ simulator-api-storage.ts
213
+ simulator-api-device.ts
214
+ simulator-api-media.ts
215
+ simulator-api-fs.ts
216
+ ```
217
+
218
+ 渲染层使用 **React + shadcn/ui + Tailwind CSS**,通过 Vite 构建,产物输出到 `dist/renderer/`。
219
+
220
+ ---
221
+
222
+ ## 配置参考
223
+
224
+ ### WorkbenchConfig
225
+
226
+ `launch()` 和 `createWorkbenchApp()` 共用:
227
+
228
+ | 字段 | 类型 | 默认值 | 说明 |
229
+ | ------------------ | ----------------------- | ------------------- | ---------------------------------- |
230
+ | `appName` | `string` | `'Dimina DevTools'` | 窗口标题 |
231
+ | `adapter` | `CompilationAdapter` | 内置 | 项目编译适配器 |
232
+ | `panels` | `BuiltinPanelId[]` | 全部四个 | 显示哪些内置面板 |
233
+ | `preloadPath` | `string` | 内置 | 自定义 preload 脚本路径 |
234
+ | `apiNamespaces` | `string[]` | `[]` | 自定义 API 命名空间(如 `['qd']`) |
235
+ | `brandingProvider` | `() => { appName }` | — | 品牌信息 provider |
236
+ | `toolbarActions` | `() => ToolbarAction[]` | — | 工具栏动作按钮 provider |
237
+
238
+ ### WorkbenchAppConfig(扩展 WorkbenchConfig)
239
+
240
+ `createWorkbenchApp()` 额外支持:
241
+
242
+ | 字段 | 类型 | 默认值 | 说明 |
243
+ | --------------- | ------------------------------------------- | ----------- | ------------------------------------------------- |
244
+ | `modules` | `Partial<Record<BuiltinModuleId, boolean>>` | 全部 `true` | 开关 IPC 模块组 |
245
+ | `rendererDir` | `string` | 内置 | 自定义 renderer HTML 目录 |
246
+ | `icon` | `string` | — | 窗口/任务栏图标路径(macOS 使用 app bundle 图标) |
247
+ | `menuBuilder` | `(mainWindow, context) => void` | 内置菜单 | 自定义菜单构建器 |
248
+ | `onSetup` | `(instance) => void` | — | 窗口和 context 创建后的回调,用于注册自定义 IPC |
249
+ | `onBeforeClose` | `(instance) => void` | — | 窗口关闭前的回调,session 关闭由框架自动处理 |
250
+ | `window` | `WorkbenchWindowConfig` | — | 窗口尺寸覆盖 |
251
+
252
+ ### 内置面板 ID
253
+
254
+ `'wxml'` \| `'console'` \| `'appdata'` \| `'storage'`
255
+
256
+ ### 内置模块 ID
257
+
258
+ `'projects'` \| `'session'` \| `'simulator'` \| `'popover'` \| `'settings'`
259
+
260
+ ---
261
+
262
+ ## CompilationAdapter
263
+
264
+ 实现此接口接入自定义构建流程:
265
+
266
+ ```typescript
267
+ import type { CompilationAdapter } from '@dimina-kit/devtools/types'
268
+
269
+ const myAdapter: CompilationAdapter = {
270
+ async openProject(opts) {
271
+ // opts.projectPath — 小程序项目绝对路径
272
+ // opts.sourcemap — 是否生成 sourcemap
273
+ // opts.onRebuild — 热更新回调
274
+ // opts.onBuildError — 构建错误回调
275
+ return {
276
+ port: 3000,
277
+ appInfo: { appName: 'my-app' },
278
+ close: async () => {},
279
+ }
280
+ },
281
+ }
282
+ ```
283
+
284
+ ---
285
+
286
+ ## Preload Instrumentation
287
+
288
+ 模拟器 webview 注入 preload 脚本在全局安装 instrumentation。内置 preload(`preload/windows/simulator.ts`)组装了以下模块:
289
+
290
+ | Instrumentation | 捕获内容 |
291
+ | ----------------------------------------- | ----------------------------------------------- |
292
+ | Console (`installConsoleInstrumentation`) | `console.*`、`window.onerror`、未捕获 rejection |
293
+ | Storage (`installStorageInstrumentation`) | `localStorage.setItem/removeItem`、全量快照 |
294
+ | AppData (`installAppDataInstrumentation`) | Worker `type='u'` 消息、setData 调用 |
295
+ | WXML (`installWxmlInstrumentation`) | Vue 组件树提取、MutationObserver 自动更新 |
296
+
297
+ 所有 install\* 函数从 `@dimina-kit/devtools/preload` 统一导出,调用后通过 `installSimulatorBridge` 暴露的内部桥接通道把数据推到宿主。面板打开时调用 `panel:eval` 通过 `executeJavaScript` 拉取当前状态。
298
+
299
+ ### 自定义 Preload
300
+
301
+ 按需组合或追加自定义逻辑(`src/preload/windows/simulator.ts` 作为参考):
302
+
303
+ ```typescript
304
+ // my-preload.ts
305
+ import {
306
+ installSimulatorBridge,
307
+ installConsoleInstrumentation,
308
+ installStorageInstrumentation,
309
+ setupApiCompatHook,
310
+ } from '@dimina-kit/devtools/preload'
311
+ // 不需要 WXML/AppData,不导入
312
+
313
+ setupApiCompatHook()
314
+ installSimulatorBridge()
315
+ installConsoleInstrumentation()
316
+ installStorageInstrumentation()
317
+
318
+ // 自定义 hook
319
+ window.addEventListener('error', (e) => {
320
+ console.error('[my-preload]', e.message)
321
+ })
322
+ ```
323
+
324
+ 编译后传入路径:
325
+
326
+ ```typescript
327
+ launch({ preloadPath: '/absolute/path/to/my-preload.js' })
328
+ ```
329
+
330
+ ---
331
+
332
+ ## 模块导出一览
333
+
334
+ ```
335
+ @dimina-kit/devtools launch, createWorkbenchApp, buildDefaultMenu,
336
+ openSettingsWindow, suppressEpipe, setupCdpPort,
337
+ createWorkbenchContext, createMainWindow, ...
338
+ (api.ts 聚合了下方全部入口)
339
+ @dimina-kit/devtools/launch launch(config?), buildDefaultMenu, openSettingsWindow
340
+ @dimina-kit/devtools/app createWorkbenchApp(config?)
341
+ @dimina-kit/devtools/types TypeScript 类型定义
342
+ @dimina-kit/devtools/context createWorkbenchContext(opts),
343
+ hasBuiltinPanel(ctx, panelId), getDefaultTab(ctx)
344
+ @dimina-kit/devtools/create-window createMainWindow(opts)
345
+ @dimina-kit/devtools/view-manager createViewManager(ctx) → ViewManager
346
+ (attachSimulator, detachSimulator, showSimulator,
347
+ hideSimulator, showSettings, hideSettings,
348
+ showPopover, hidePopover, resize,
349
+ setVisible, repositionAll, disposeAll)
350
+ @dimina-kit/devtools/layout computeRightPanelBounds, computeSimulatorBounds,
351
+ computeSettingsBounds, computePopoverBounds,
352
+ setHeaderHeight, getRightX,
353
+ HEADER_H, SPLITTER_W, SETTINGS_W
354
+ @dimina-kit/devtools/projects listProjects, addProject, removeProject,
355
+ getCompileConfig, saveCompileConfig,
356
+ updateLastOpened
357
+ @dimina-kit/devtools/paths rendererDir, defaultPreloadPath,
358
+ getRendererDir, getPreloadDir, getRendererHtml
359
+ @dimina-kit/devtools/ipc-simulator registerSimulatorIpc(ctx)
360
+ @dimina-kit/devtools/ipc-panels registerPanelsIpc(ctx)
361
+ @dimina-kit/devtools/ipc-toolbar registerToolbarIpc(ctx)
362
+ @dimina-kit/devtools/ipc-popover registerPopoverIpc(ctx)
363
+ @dimina-kit/devtools/ipc-settings registerSettingsIpc(ctx)
364
+ @dimina-kit/devtools/ipc-projects registerProjectsIpc(ctx)
365
+ @dimina-kit/devtools/ipc-session registerSessionIpc(ctx), sendStatus(ctx, status, msg)
366
+ @dimina-kit/devtools/bootstrap suppressEpipe(), setupCdpPort()
367
+ @dimina-kit/devtools/workbench-settings loadWorkbenchSettings(), saveWorkbenchSettings(), applyTheme()
368
+ @dimina-kit/devtools/preload installConsoleInstrumentation,
369
+ installStorageInstrumentation,
370
+ installAppDataInstrumentation, sendAllAppData,
371
+ installWxmlInstrumentation, sendWxmlTree,
372
+ setupWxmlObserver, installSimulatorBridge,
373
+ setupApiCompatHook
374
+ @dimina-kit/devtools/simulator-dir simulatorDir
375
+ ```
376
+
377
+ ---
378
+
379
+ ## WorkbenchContext
380
+
381
+ `WorkbenchContext` 是所有 IPC 模块共享的状态入口。配置字段直接暴露,运行时状态通过三个 service 访问:
382
+
383
+ ```typescript
384
+ interface WorkbenchContext {
385
+ mainWindow: BrowserWindow
386
+ adapter: CompilationAdapter
387
+ preloadPath: string
388
+ rendererDir: string
389
+ panels: string[]
390
+ apiNamespaces: string[]
391
+ appName: string
392
+ toolbarActions?: () => Promise<ToolbarAction[]> | ToolbarAction[]
393
+ brandingProvider?: () => Promise<{ appName: string }> | { appName: string }
394
+ workbenchSettingsWindow: BrowserWindow | null
395
+
396
+ // ── Services(运行时状态封装在内部,通过方法访问)──
397
+ views: ViewManager // ctx.views.repositionAll(), ctx.views.getSimulatorWebContentsId(), ...
398
+ notify: RendererNotifier // ctx.notify.projectStatus(), ctx.notify.windowNavigateBack(), ...
399
+ workspace: WorkspaceService // ctx.workspace.getProjectPath(), ctx.workspace.hasActiveSession(), ...
400
+ }
401
+ ```
402
+
403
+ 会话和视图状态不再作为 ctx 的直接字段暴露,而是封装在对应 service 的私有闭包中:
404
+
405
+ | 旧写法 | 新写法 |
406
+ | ---------------------------- | ----------------------------------------------------------------- |
407
+ | `ctx.currentProjectPath` | `ctx.workspace.getProjectPath()` |
408
+ | `ctx.currentSession` | `ctx.workspace.getSession()` / `ctx.workspace.hasActiveSession()` |
409
+ | `ctx.simulatorWebContentsId` | `ctx.views.getSimulatorWebContentsId()` |
410
+ | `ctx.devToolsViewAdded` | `ctx.views.isSimulatorAdded()` |
411
+ | `ctx.lastSimWidth` | `ctx.views.getLastSimWidth()` |
412
+
413
+ ---
414
+
415
+ ## 整体架构
416
+
417
+ ### 视图层级(从上到下 = 从顶层到底层)
418
+
419
+ ```mermaid
420
+ flowchart TB
421
+ subgraph BW["BrowserWindow"]
422
+ direction TB
423
+ Z3["⑤ popoverView &nbsp;[z=3,顶层]<br/>entries/popover/index.html<br/>全屏透明遮罩 + 编译配置表单"]
424
+ Z2["④ settingsView &nbsp;[z=2]<br/>entries/settings/index.html<br/>固定宽度 320px,右侧对齐"]
425
+ Z1["② simulatorView &nbsp;[z=1]<br/>Chrome DevTools 面板"]
426
+ subgraph Z0["① mainWindow &nbsp;[z=0,底层]&nbsp;entries/main/index.html"]
427
+ direction LR
428
+ SIM["模拟器 &lt;webview&gt;<br/>拖拽分割线"]
429
+ PNL["WXML / AppData / Storage<br/>React 中直接渲染"]
430
+ end
431
+ Z3 -. 覆盖 .-> Z2
432
+ Z2 -. 覆盖 .-> Z1
433
+ Z1 -. 覆盖 .-> Z0
434
+ end
435
+ ```
436
+
437
+ 层级由 `addChildView()` 调用顺序决定,后添加的 View 在上层。内置面板(WXML / AppData / Storage)不使用独立 WebContentsView,直接在主窗口 React 中渲染;只有 Chrome DevTools / settings / popover 需要 View 覆盖。
438
+
439
+ ### 数据流
440
+
441
+ 内置面板采用**拉取式**数据流,避免长期订阅:
442
+
443
+ ```mermaid
444
+ sequenceDiagram
445
+ autonumber
446
+ actor User as 用户
447
+ participant UI as 面板 UI (React)
448
+ participant R as renderer
449
+ participant M as main<br/>ipc/panels.ts
450
+ participant P as preload<br/>instrumentation
451
+
452
+ User->>UI: 打开面板 / 刷新
453
+ UI->>R: invokeMain('panel:eval', expression)
454
+ R->>M: IPC: panel:eval
455
+ M->>P: webContents.executeJavaScript(expression)
456
+ Note over P: window 上已挂好取值函数
457
+ P-->>M: 结构化数据
458
+ M-->>R: 返回结果
459
+ R-->>UI: 渲染
460
+ ```
461
+
462
+ Console 输出等推送场景仍由 preload 通过 `installSimulatorBridge()` 经由 webview ipcRenderer 送至宿主,再由 renderer 分发到相应面板。
463
+
464
+ ---
465
+
466
+ ## IPC 通信总览
467
+
468
+ | 频道 | 方向 | 说明 |
469
+ | --------------------------------- | ----- | ---------------------------------------------- |
470
+ | `projects:list` | R→M | 获取项目列表 |
471
+ | `projects:add` | R→M | 添加项目 |
472
+ | `projects:remove` | R→M | 删除项目 |
473
+ | `dialog:openDirectory` | R→M | 打开目录选择对话框 |
474
+ | `project:open` | R→M | 编译并启动项目 |
475
+ | `project:close` | R→M | 停止编译,清理 View |
476
+ | `project:status` | M→R | 编译状态推送 |
477
+ | `project:getPages` | R→M | 读取 app.json pages |
478
+ | `project:getCompileConfig` | R→M | 读取编译配置 |
479
+ | `project:saveCompileConfig` | R→M | 保存编译配置 |
480
+ | `app:getPreloadPath` | R→M | 获取 preload 脚本路径 |
481
+ | `app:getBranding` | R→M | 读取品牌信息(`brandingProvider`) |
482
+ | `toolbar:getActions` | R→M | 读取自定义工具栏按钮 |
483
+ | `workbench:getPanelConfig` | R→M | 获取 panels 配置 |
484
+ | `workbench:getApiNamespaces` | R→M | 获取自定义 API namespaces |
485
+ | `simulator:attach` | R→M | 绑定 simulator webContents,创建 simulatorView |
486
+ | `simulator:detach` | R→M | 销毁所有 View |
487
+ | `simulator:resize` | R→M | 更新 View 位置(分割线拖动) |
488
+ | `simulator:setVisible` | R→M | 显示/隐藏 simulator 面板 |
489
+ | `workbench:reset` | R→M | 通知主窗口重置面板状态 |
490
+ | `panel:list` | R→M | 获取启用的内置面板列表 |
491
+ | `panel:eval` | R→M | 在 simulator webContents 执行 JS 并返回结果 |
492
+ | `panel:select` | R→M | 切换到指定内置面板 |
493
+ | `panel:selectSimulator` | R→M | 切换到 simulator tab |
494
+ | `popover:show` | R→M | 创建弹窗 |
495
+ | `popover:hide` | R→M | 销毁弹窗 |
496
+ | `popover:init` | M→P | 初始化弹窗数据 |
497
+ | `popover:relaunch` | P→M→R | 重新编译 |
498
+ | `popover:closed` | M→R | 弹窗关闭通知 |
499
+ | `settings:setVisible` | R→M | 显示/隐藏设置视图 |
500
+ | `settings:init` | M→P | 初始化设置面板 |
501
+ | `settings:configChanged` | P→M→R | 编译配置变更通知 |
502
+ | `settings:projectSettingsChanged` | P→M | 项目级设置(如 sourcemap)落盘 |
503
+ | `settings:closed` | M→R | 设置面板关闭通知 |
504
+ | `workbenchSettings:get` | R→M | 读取用户级 workbench 设置 |
505
+ | `workbenchSettings:save` | R→M | 保存 workbench 设置并应用主题 |
506
+ | `workbenchSettings:setTheme` | R→M | 仅切换主题 |
507
+ | `workbenchSettings:getCdpStatus` | R→M | 读取当前 CDP 端口状态 |
508
+ | `workbenchSettings:setVisible` | R→M | 打开/关闭独立设置窗口 |
509
+
510
+ R=渲染进程,M=主进程,P=子 WebContentsView
511
+
512
+ ---
513
+
514
+ ## 已知限制:Electron `chrome.devtools.panels.create()` 不可用
515
+
516
+ Electron 对 `chrome.devtools.panels.create()` 的支持**长期不稳定**。该 API 调用成功(无报错,返回 panel 对象),但面板 tab 永远不出现在 DevTools UI 中。
517
+
518
+ **影响范围**:从 Electron 7 到 39 均有报告([#23662](https://github.com/electron/electron/issues/23662)、[#41613](https://github.com/electron/electron/issues/41613)、[#48705](https://github.com/electron/electron/issues/48705)),非特定版本 bug,而是系统性实现缺陷。官方文档声称完全支持,但实际因竞态条件和实现不完整导致面板无法可靠渲染。Electron 团队无修复计划。
519
+
520
+ **当前方案**:内置面板(WXML / AppData / Storage)直接在主窗口 React 中渲染,通过 `panel:eval` IPC 调用 `webContents.executeJavaScript()` 从 simulator 拉取数据;Chrome DevTools 仍作为独立 `WebContentsView` 通过 `setDevToolsWebContents()` 挂载。面板切换由 renderer toolbar 的 tab 栏控制,主进程负责 simulator/settings/popover View 的创建、定位和显隐。详见 `src/main/ipc/panels.ts` 和 `src/main/ipc/simulator.ts`。
521
+
522
+ ---
523
+
524
+ ## 调试
525
+
526
+ - **Cmd+Shift+I** / **Ctrl+Shift+I** — 打开 mainWindow 的 Electron DevTools(调试 React 渲染层)
527
+ - 模拟器 webview 的 Chrome DevTools 在编译完成、`dom-ready` 后自动打开
528
+ - 开发模式(`!app.isPackaged`)下 mainWindow DevTools 自动以 detach 模式打开
529
+
530
+ ---
531
+
532
+ ## 开发
533
+
534
+ ```bash
535
+ pnpm build # 构建全部(main + preload + renderer)
536
+ pnpm build:main # 仅构建主进程 TypeScript
537
+ pnpm build:preload # 仅构建 preload TypeScript
538
+ pnpm build:renderer # Vite 构建渲染层
539
+ pnpm dev # Watch 模式 + Electron
540
+ pnpm check-types # 类型检查
541
+ pnpm test # 运行测试
542
+ ```
543
+
544
+ ---
545
+
546
+ ## 安全说明
547
+
548
+ - 本工具仅用于本地开发调试,不应部署到生产环境
549
+ - 为方便开发调试,BrowserWindow 启用了 `nodeIntegration` 并禁用了 `contextIsolation`,这在生产环境中存在安全风险
550
+ - 仅在受信任的本地开发环境中使用本工具
551
+ - 不要在 devtools 窗口中加载不受信任的远程内容
552
+ - 如需在非本地环境使用,请自行评估并加固安全配置
553
+
554
+ ### MCP Server 风险
555
+
556
+ 内置的 MCP server 默认关闭,由 `startMcpServer` 入口显式启动,或通过 workbench 设置中的 `mcp.enabled` 开启。开启后会在本机监听 SSE 端点,向任何可以连接到该端点的 MCP 客户端暴露一组工具,能力包括:在页面上下文执行任意 JS(`evaluate`)、读取 DOM 结构、截屏、拉取网络日志、触发导航等。
557
+
558
+ 由于 workbench 主窗口出于调试需要启用了 `nodeIntegration` 并关闭了 `contextIsolation`,通过 MCP 客户端执行的 `evaluate` 实际拥有 Node API 访问权限。换言之,开启 MCP 等同于允许已连接的本机 MCP 客户端在 DevTools 进程中执行 Node 代码,读写本机文件和启动子进程均在其能力范围内。
559
+
560
+ 因此仅在连接到可信的本机 MCP 客户端或被信任的 AI 工具时启用该功能;不要在公共 WiFi、共享机器或存在远程 SSH 端口转发的场景下开启,以免监听端口被非预期的客户端访问。
561
+
562
+ 作为收窄 RCE 面的默认策略,`workbench_evaluate` 已从 MCP 工具集中移除,workbench 只暴露只读诊断工具(截屏、console 日志、DOM、网络日志等)。`simulator_evaluate` 仍然保留,因为 simulator 使用 `<webview>`,默认 `nodeIntegration=false`,其 `evaluate` 仅在页面 JS 上下文执行,不具备 Node API 访问能力。
@@ -0,0 +1,21 @@
1
+ export { launch, buildDefaultMenu, openSettingsWindow } from './app/launch.js';
2
+ export { createWorkbenchApp } from './app/app.js';
3
+ export type { WorkbenchAppInstance } from './app/app.js';
4
+ export { suppressEpipe, setupCdpPort } from './app/bootstrap.js';
5
+ export { createWorkbenchContext, hasBuiltinPanel, getDefaultTab } from './services/workbench-context.js';
6
+ export type { WorkbenchContext, CreateContextOptions } from './services/workbench-context.js';
7
+ export { createMainWindow } from './windows/main-window/index.js';
8
+ export { createViewManager } from './services/views/view-manager.js';
9
+ export type { ViewManager } from './services/views/view-manager.js';
10
+ export { registerAppIpc } from './ipc/app.js';
11
+ export { registerSimulatorIpc } from './ipc/simulator.js';
12
+ export { registerPanelsIpc } from './ipc/panels.js';
13
+ export { registerPopoverIpc } from './ipc/popover.js';
14
+ export { registerSettingsIpc } from './ipc/settings.js';
15
+ export { registerProjectsIpc } from './ipc/projects.js';
16
+ export { registerSessionIpc } from './ipc/session.js';
17
+ export { registerToolbarIpc } from './ipc/toolbar.js';
18
+ export { rendererDir, defaultPreloadPath, getRendererDir, getPreloadDir, getRendererHtml } from './utils/paths.js';
19
+ export { simulatorDir } from './services/simulator/dir.js';
20
+ export type { WorkbenchConfig, WorkbenchAppConfig, CompilationAdapter, ProjectSession, ToolbarAction, BuiltinPanelId, BuiltinModuleId, } from '../shared/types.js';
21
+ //# sourceMappingURL=api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/main/api.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AAC9E,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AACjD,YAAY,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAA;AAGxD,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAGhE,OAAO,EAAE,sBAAsB,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAA;AACxG,YAAY,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAA;AAC7F,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAA;AACjE,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAA;AACpE,YAAY,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAA;AAGnE,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAC7C,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAA;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAA;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAA;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AACrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AAGrD,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,cAAc,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAClH,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAA;AAG1D,YAAY,EACV,eAAe,EACf,kBAAkB,EAClB,kBAAkB,EAClB,cAAc,EACd,aAAa,EACb,cAAc,EACd,eAAe,GAChB,MAAM,oBAAoB,CAAA"}
@@ -0,0 +1,22 @@
1
+ // ── Primary API ──────────────────────────────────────────────────────────
2
+ export { launch, buildDefaultMenu, openSettingsWindow } from './app/launch.js';
3
+ export { createWorkbenchApp } from './app/app.js';
4
+ // ── Bootstrap utilities ──────────────────────────────────────────────────
5
+ export { suppressEpipe, setupCdpPort } from './app/bootstrap.js';
6
+ // ── Context & views (for module-assembly consumers) ──────────────────────
7
+ export { createWorkbenchContext, hasBuiltinPanel, getDefaultTab } from './services/workbench-context.js';
8
+ export { createMainWindow } from './windows/main-window/index.js';
9
+ export { createViewManager } from './services/views/view-manager.js';
10
+ // ── IPC module registration ──────────────────────────────────────────────
11
+ export { registerAppIpc } from './ipc/app.js';
12
+ export { registerSimulatorIpc } from './ipc/simulator.js';
13
+ export { registerPanelsIpc } from './ipc/panels.js';
14
+ export { registerPopoverIpc } from './ipc/popover.js';
15
+ export { registerSettingsIpc } from './ipc/settings.js';
16
+ export { registerProjectsIpc } from './ipc/projects.js';
17
+ export { registerSessionIpc } from './ipc/session.js';
18
+ export { registerToolbarIpc } from './ipc/toolbar.js';
19
+ // ── Paths ────────────────────────────────────────────────────────────────
20
+ export { rendererDir, defaultPreloadPath, getRendererDir, getPreloadDir, getRendererHtml } from './utils/paths.js';
21
+ export { simulatorDir } from './services/simulator/dir.js';
22
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/main/api.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AAC9E,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AAGjD,4EAA4E;AAC5E,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAEhE,4EAA4E;AAC5E,OAAO,EAAE,sBAAsB,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAA;AAExG,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAA;AACjE,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAA;AAGpE,4EAA4E;AAC5E,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAC7C,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAA;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAA;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAA;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AACrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AAErD,4EAA4E;AAC5E,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,cAAc,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAClH,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAA"}
@@ -0,0 +1,15 @@
1
+ import { BrowserWindow } from 'electron';
2
+ import type { WorkbenchAppConfig } from '../../shared/types.js';
3
+ import { type WorkbenchContext } from '../services/workbench-context.js';
4
+ import { type AutomationServer } from '../services/automation/index.js';
5
+ export interface WorkbenchAppInstance {
6
+ mainWindow: BrowserWindow;
7
+ context: WorkbenchContext;
8
+ automationServer?: AutomationServer;
9
+ dispose: () => Promise<void>;
10
+ }
11
+ export declare function createWorkbenchApp(config?: WorkbenchAppConfig): {
12
+ setup: () => Promise<WorkbenchAppInstance>;
13
+ start: () => void;
14
+ };
15
+ //# sourceMappingURL=app.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../../../src/main/app/app.ts"],"names":[],"mappings":"AAEA,OAAO,EAAO,aAAa,EAAe,MAAM,UAAU,CAAA;AAG1D,OAAO,KAAK,EAAmB,kBAAkB,EAAE,MAAM,uBAAuB,CAAA;AAIhF,OAAO,EAA0B,KAAK,gBAAgB,EAAE,MAAM,kCAAkC,CAAA;AAahG,OAAO,EAAyB,KAAK,gBAAgB,EAAE,MAAM,iCAAiC,CAAA;AAyB9F,MAAM,WAAW,oBAAoB;IACnC,UAAU,EAAE,aAAa,CAAA;IACzB,OAAO,EAAE,gBAAgB,CAAA;IACzB,gBAAgB,CAAC,EAAE,gBAAgB,CAAA;IACnC,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAC7B;AAqID,wBAAgB,kBAAkB,CAAC,MAAM,GAAE,kBAAuB;iBAMxC,OAAO,CAAC,oBAAoB,CAAC;iBA8BnC,IAAI;EAYvB"}