@dimina-kit/devtools 0.3.1-dev.20260518114324 → 0.3.2-dev.20260522085907

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 (89) hide show
  1. package/README.md +33 -71
  2. package/dist/main/app/app.js +5 -0
  3. package/dist/main/app/bootstrap.js +2 -1
  4. package/dist/main/app/launch.d.ts +1 -1
  5. package/dist/main/app/launch.js +6 -7
  6. package/dist/main/index.bundle.js +306 -317
  7. package/dist/main/ipc/panels.js +3 -5
  8. package/dist/main/ipc/projects.d.ts +1 -1
  9. package/dist/main/ipc/projects.js +5 -5
  10. package/dist/main/ipc/settings.d.ts +1 -1
  11. package/dist/main/ipc/settings.js +14 -1
  12. package/dist/main/ipc/simulator.d.ts +1 -1
  13. package/dist/main/ipc/simulator.js +1 -10
  14. package/dist/main/services/automation/exec.d.ts +2 -0
  15. package/dist/main/services/automation/exec.js +7 -9
  16. package/dist/main/services/automation/handlers/app.js +37 -51
  17. package/dist/main/services/automation/handlers/element.js +27 -41
  18. package/dist/main/services/default-adapter.js +3 -3
  19. package/dist/main/services/mcp/index.d.ts +1 -0
  20. package/dist/main/services/mcp/index.js +1 -0
  21. package/dist/main/services/mcp/server.js +5 -0
  22. package/dist/main/services/mcp/status.d.ts +10 -0
  23. package/dist/main/services/mcp/status.js +14 -0
  24. package/dist/main/services/mcp/target-manager.js +2 -1
  25. package/dist/main/services/notifications/renderer-notifier.d.ts +3 -3
  26. package/dist/main/services/notifications/renderer-notifier.js +3 -6
  27. package/dist/main/services/projects/local-provider.js +3 -3
  28. package/dist/main/services/projects/project-repository.d.ts +0 -1
  29. package/dist/main/services/settings/index.js +2 -1
  30. package/dist/main/services/simulator-storage/index.js +47 -77
  31. package/dist/main/services/views/view-manager.d.ts +3 -7
  32. package/dist/main/services/views/view-manager.js +20 -27
  33. package/dist/main/services/window-service.d.ts +3 -3
  34. package/dist/main/services/workbench-context.d.ts +3 -6
  35. package/dist/main/services/workbench-context.js +1 -3
  36. package/dist/main/services/workspace/workspace-service.js +8 -24
  37. package/dist/main/utils/theme.d.ts +24 -0
  38. package/dist/main/utils/theme.js +38 -1
  39. package/dist/preload/index.d.ts +5 -2
  40. package/dist/preload/index.js +3 -2
  41. package/dist/preload/instrumentation/app-data.d.ts +32 -2
  42. package/dist/preload/instrumentation/app-data.js +187 -172
  43. package/dist/preload/instrumentation/index.d.ts +2 -2
  44. package/dist/preload/instrumentation/index.js +2 -2
  45. package/dist/preload/instrumentation/wxml.d.ts +16 -4
  46. package/dist/preload/instrumentation/wxml.js +188 -178
  47. package/dist/preload/miniapp-snapshot/host.d.ts +12 -0
  48. package/dist/preload/miniapp-snapshot/host.js +117 -0
  49. package/dist/preload/miniapp-snapshot/types.d.ts +62 -0
  50. package/dist/preload/miniapp-snapshot/types.js +15 -0
  51. package/dist/preload/runtime/bridge.js +5 -24
  52. package/dist/preload/runtime/custom-apis.d.ts +1 -1
  53. package/dist/preload/runtime/custom-apis.js +3 -7
  54. package/dist/preload/shared/expose.d.ts +15 -0
  55. package/dist/preload/shared/expose.js +33 -0
  56. package/dist/preload/shared/page-iframe.d.ts +3 -0
  57. package/dist/preload/shared/page-iframe.js +6 -0
  58. package/dist/preload/shared/types.d.ts +2 -0
  59. package/dist/preload/windows/simulator.js +400 -348
  60. package/dist/renderer/assets/constants-DI382mTP.js +2 -0
  61. package/dist/renderer/assets/index-D8VFYBh-.js +46 -0
  62. package/dist/renderer/assets/{input-DqVQNCx_.js → input-CoWcfa8u.js} +2 -2
  63. package/dist/renderer/assets/ipc-transport-Cd2xPrsa.js +9 -0
  64. package/dist/renderer/assets/popover-Nq5gT9DO.js +2 -0
  65. package/dist/renderer/assets/select-By5KH-UG.js +2 -0
  66. package/dist/renderer/assets/{settings-BFNfnYvU.js → settings-Dj_N70qR.js} +2 -2
  67. package/dist/renderer/assets/settings-api-Do0_Smq1.js +2 -0
  68. package/dist/renderer/assets/workbenchSettings-CazSLGYt.js +8 -0
  69. package/dist/renderer/entries/main/index.html +5 -4
  70. package/dist/renderer/entries/popover/index.html +5 -4
  71. package/dist/renderer/entries/settings/index.html +4 -4
  72. package/dist/renderer/entries/workbench-settings/index.html +4 -3
  73. package/dist/shared/ipc-channels.d.ts +4 -12
  74. package/dist/shared/ipc-channels.js +10 -14
  75. package/dist/shared/simulator-route.d.ts +72 -0
  76. package/dist/shared/simulator-route.js +169 -0
  77. package/dist/shared/types.d.ts +2 -10
  78. package/dist/simulator/assets/simulator-DJCozrU5.js +9 -0
  79. package/dist/simulator/simulator.html +6 -43
  80. package/package.json +4 -4
  81. package/dist/preload/instrumentation/disposable.d.ts +0 -11
  82. package/dist/preload/instrumentation/disposable.js +0 -15
  83. package/dist/renderer/assets/index-Czz_bp6b.js +0 -46
  84. package/dist/renderer/assets/ipc-transport-CCHrCtDr.js +0 -9
  85. package/dist/renderer/assets/popover-BRg4XI_w.js +0 -2
  86. package/dist/renderer/assets/select-CvILHHZU.js +0 -2
  87. package/dist/renderer/assets/settings-api-DOAgmBst.js +0 -2
  88. package/dist/renderer/assets/workbenchSettings-DjVMgMMH.js +0 -8
  89. package/dist/simulator/assets/simulator-DL6kOCq-.js +0 -9
package/README.md CHANGED
@@ -206,9 +206,12 @@ src/
206
206
  types.ts
207
207
  instrumentation/ # 注入到小程序 runtime 的探针
208
208
  console.ts # 控制台拦截
209
- app-data.ts # Worker setData 拦截
210
- wxml.ts # Vue 组件树提取 + WXML 高亮 overlay
209
+ app-data.ts # Worker setData 拦截 → createAppDataSource
210
+ wxml.ts # Vue 组件树提取 createWxmlSource
211
211
  disposable.ts # instrumentation 共用的清理工具
212
+ miniapp-snapshot/ # 面板数据统一快照框架(docs/miniapp-snapshot.md)
213
+ types.ts # MiniappSnapshotSource / SnapshotEnvelope
214
+ host.ts # createMiniappSnapshotHost → push/pull/__miniappSnapshot
212
215
  runtime/
213
216
  bridge.ts # installSimulatorBridge → window.__simulatorData
214
217
  custom-apis.ts # installCustomApisBridge → window.__diminaCustomApis
@@ -444,11 +447,13 @@ const myAdapter: CompilationAdapter = {
444
447
 
445
448
  ### 按需:instrumentation
446
449
 
447
- | Instrumentation | 捕获内容 | 数据通道 |
450
+ Console 是独立 instrumentation;AppData WXML 已迁移到 **miniappSnapshot** 框架——各自实现一个 `MiniappSnapshotSource`,由 `MiniappSnapshotHost` 统一负责推送 / 拉取 / reload 重同步(详见 `docs/miniapp-snapshot.md`)。
451
+
452
+ | 探针 | 捕获内容 | 数据通道 |
448
453
  | --- | --- | --- |
449
- | `installConsoleInstrumentation` | `console.*`、`window.onerror`、未捕获 rejection | IPC sendToHost |
450
- | `installAppDataInstrumentation` | Worker `type='u'` 消息、setData 调用 | IPC sendToHost + 写入 bridge state |
451
- | `installWxmlInstrumentation` | Vue 组件树提取、MutationObserver 自动更新 | IPC sendToHost + 写入 bridge state |
454
+ | `installConsoleInstrumentation()` | `console.*`、`window.onerror`、未捕获 rejection | `sendToHost` |
455
+ | `createAppDataSource()` | Worker `ub` 消息、setData / page init | miniappSnapshot 框架(`miniapp-snapshot:push`) |
456
+ | `createWxmlSource()` | Vue 组件树提取、MutationObserver 自动更新 | miniappSnapshot 框架(`miniapp-snapshot:push`) |
452
457
 
453
458
  > Storage 面板的数据由主进程通过 CDP `DOMStorage` 域抓取(`src/main/services/simulator-storage`),**不需要 preload 侧 instrumentation**。
454
459
 
@@ -464,8 +469,9 @@ import {
464
469
  installSimulatorBridge,
465
470
  installCustomApisBridge,
466
471
  installConsoleInstrumentation,
467
- installAppDataInstrumentation,
468
- installWxmlInstrumentation,
472
+ createMiniappSnapshotHost,
473
+ createAppDataSource,
474
+ createWxmlSource,
469
475
  setupApiCompatHook,
470
476
  } from '@dimina-kit/devtools/preload'
471
477
 
@@ -474,12 +480,16 @@ setupApiCompatHook()
474
480
  installSimulatorBridge()
475
481
  installCustomApisBridge() // 若用到 registerSimulatorApi,必装
476
482
 
477
- // 2. instrumentation(按需)
483
+ // 2. Console instrumentation(按需)
478
484
  installConsoleInstrumentation()
479
- installAppDataInstrumentation()
480
- installWxmlInstrumentation()
481
485
 
482
- // 3. 自定义 hook
486
+ // 3. miniappSnapshot 框架:注册面板数据源后 install()
487
+ const snapshotHost = createMiniappSnapshotHost()
488
+ snapshotHost.register(createAppDataSource())
489
+ snapshotHost.register(createWxmlSource())
490
+ snapshotHost.install()
491
+
492
+ // 4. 自定义 hook
483
493
  window.addEventListener('error', (e) => {
484
494
  console.error('[my-preload]', e.message)
485
495
  })
@@ -559,9 +569,8 @@ dispose()
559
569
  @dimina-kit/devtools/preload installSimulatorBridge,
560
570
  installCustomApisBridge,
561
571
  installConsoleInstrumentation,
562
- installAppDataInstrumentation, sendAllAppData,
563
- installWxmlInstrumentation, sendWxmlTree,
564
- setupWxmlObserver,
572
+ createMiniappSnapshotHost,
573
+ createAppDataSource, createWxmlSource,
565
574
  setupApiCompatHook
566
575
  (storage 面板数据由主进程 CDP 抓取,无 preload 侧 hook)
567
576
  ```
@@ -613,17 +622,11 @@ interface WorkbenchContext {
613
622
  }
614
623
  ```
615
624
 
616
- 会话和视图状态封装在对应 service 的私有闭包中,通过方法访问:
625
+ 会话和视图状态封装在对应 service 的私有闭包中,通过方法访问,例如:
617
626
 
618
- | 旧写法 | 新写法 |
619
- | ---------------------------- | ----------------------------------------------------------------- |
620
- | `ctx.currentProjectPath` | `ctx.workspace.getProjectPath()` |
621
- | `ctx.currentSession` | `ctx.workspace.getSession()` / `ctx.workspace.hasActiveSession()` |
622
- | `ctx.simulatorWebContentsId` | `ctx.views.getSimulatorWebContentsId()` |
623
- | `ctx.devToolsViewAdded` | `ctx.views.isSimulatorAdded()` |
624
- | `ctx.lastSimWidth` | `ctx.views.getLastSimWidth()` |
625
- | `ctx.mainWindow` | `ctx.windows.mainWindow` |
626
- | `ctx.workbenchSettingsWindow`| `ctx.windows.settingsWindow` |
627
+ - `ctx.workspace.getProjectPath()` / `ctx.workspace.getSession()` / `ctx.workspace.hasActiveSession()`
628
+ - `ctx.views.getSimulatorWebContentsId()` / `ctx.views.isSimulatorAdded()` / `ctx.views.getLastSimWidth()`
629
+ - `ctx.windows.mainWindow` / `ctx.windows.settingsWindow`
627
630
 
628
631
  ---
629
632
 
@@ -653,13 +656,14 @@ flowchart TB
653
656
 
654
657
  ### 数据流
655
658
 
656
- 按面板拆分,分**三条独立路径**:
659
+ 按面板 / 场景拆分:
657
660
 
658
661
  | 面板 / 场景 | 模式 | 路径 |
659
662
  | --- | --- | --- |
660
- | Console / AppData / WXML 树 | 推送 | preload instrumentation 通过 `runtime/host.ts:sendToHost` webview `ipcRenderer.sendToHost` 推到宿主 → renderer 监听 `ipc-message` 分发 |
663
+ | Console | 推送 | `installConsoleInstrumentation` `runtime/host.ts:sendToHost` webview `ipcRenderer.sendToHost` 推到宿主 → renderer 监听 `ipc-message` |
664
+ | AppData / WXML 树 | 推送 + 拉取 | **miniappSnapshot 框架**:preload `MiniappSnapshotHost` 经 `miniapp-snapshot:push` 推全量快照,renderer `useMiniappSnapshot` 整份投影;面板「刷新」走 `miniapp-snapshot:pull`(详见 `docs/miniapp-snapshot.md`) |
661
665
  | Storage | 拉取 + 推送 | renderer `ipcInvoke(SimulatorStorageChannel.GetSnapshot)` → 主进程 CDP `DOMStorage` 域;变更事件由主进程通过 `SimulatorStorageChannel.Event` 推回 renderer |
662
- | 元素选区 / `Page.getData` / MCP overview | 拉取 | 主进程 `webContents.executeJavaScript(...)` 或 `Runtime.evaluate(...)` 读 `window.__simulatorData.*`(由 `installSimulatorBridge` 暴露) |
666
+ | 元素选区 / `Page.getData` / MCP overview | 拉取 | 主进程 `webContents.executeJavaScript(...)` 或 `Runtime.evaluate(...)` 读 `window.__simulatorData.*`(由 `installSimulatorBridge` 暴露);面板快照亦可经 `window.__miniappSnapshot.get(id)` 同步读取(由 `MiniappSnapshotHost` 暴露) |
663
667
 
664
668
  > `src/main/ipc/panels.ts` 暴露 `panel:eval` handler 供外部 host 自定义面板复用,内置 renderer 不消费它。
665
669
 
@@ -667,49 +671,7 @@ flowchart TB
667
671
 
668
672
  ## IPC 通信总览
669
673
 
670
- | 频道 | 方向 | 说明 |
671
- | --------------------------------- | ----- | ---------------------------------------------- |
672
- | `projects:list` | R→M | 获取项目列表 |
673
- | `projects:add` | R→M | 添加项目 |
674
- | `projects:remove` | R→M | 删除项目 |
675
- | `dialog:openDirectory` | R→M | 打开目录选择对话框 |
676
- | `project:open` | R→M | 编译并启动项目 |
677
- | `project:close` | R→M | 停止编译,清理 View |
678
- | `project:status` | M→R | 编译状态推送 |
679
- | `project:getPages` | R→M | 读取 app.json pages |
680
- | `project:getCompileConfig` | R→M | 读取编译配置 |
681
- | `project:saveCompileConfig` | R→M | 保存编译配置 |
682
- | `app:getPreloadPath` | R→M | 获取 preload 脚本路径 |
683
- | `app:getBranding` | R→M | 读取品牌信息(`brandingProvider`) |
684
- | `toolbar:getActions` | R→M | 读取自定义工具栏按钮 |
685
- | `workbench:getPanelConfig` | R→M | 获取 panels 配置 |
686
- | `workbench:getApiNamespaces` | R→M | 获取自定义 API namespaces |
687
- | `simulator:attach` | R→M | 绑定 simulator webContents,创建 simulatorView |
688
- | `simulator:detach` | R→M | 销毁所有 View |
689
- | `simulator:resize` | R→M | 更新 View 位置(分割线拖动) |
690
- | `simulator:setVisible` | R→M | 显示/隐藏 simulator 面板 |
691
- | `workbench:reset` | R→M | 通知主窗口重置面板状态 |
692
- | `panel:list` | R→M | 获取启用的内置面板列表 |
693
- | `panel:eval` | R→M | 在 simulator webContents 执行 JS 并返回结果 |
694
- | `panel:select` | R→M | 切换到指定内置面板 |
695
- | `panel:selectSimulator` | R→M | 切换到 simulator tab |
696
- | `popover:show` | R→M | 创建弹窗 |
697
- | `popover:hide` | R→M | 销毁弹窗 |
698
- | `popover:init` | M→P | 初始化弹窗数据 |
699
- | `popover:relaunch` | P→M→R | 重新编译 |
700
- | `popover:closed` | M→R | 弹窗关闭通知 |
701
- | `settings:setVisible` | R→M | 显示/隐藏设置视图 |
702
- | `settings:init` | M→P | 初始化设置面板 |
703
- | `settings:configChanged` | P→M→R | 编译配置变更通知 |
704
- | `settings:projectSettingsChanged` | P→M | 项目级设置(如 sourcemap)落盘 |
705
- | `settings:closed` | M→R | 设置面板关闭通知 |
706
- | `workbenchSettings:get` | R→M | 读取用户级 workbench 设置 |
707
- | `workbenchSettings:save` | R→M | 保存 workbench 设置并应用主题 |
708
- | `workbenchSettings:setTheme` | R→M | 仅切换主题 |
709
- | `workbenchSettings:getCdpStatus` | R→M | 读取当前 CDP 端口状态 |
710
- | `workbenchSettings:setVisible` | R→M | 打开/关闭独立设置窗口 |
711
-
712
- R=渲染进程,M=主进程,P=子 WebContentsView
674
+ IPC 频道名常量集中定义在 `src/shared/ipc-channels.ts`,按域分组(`SimulatorChannel` / `ProjectChannel` / `PanelChannel` / `WorkbenchSettingsChannel` 等)。该文件是频道清单的唯一真相源;此处不再维护手抄表,以免与代码漂移。
713
675
 
714
676
  ---
715
677
 
@@ -3,6 +3,7 @@ import { app, BrowserWindow, nativeImage } from 'electron';
3
3
  import fs from 'fs';
4
4
  import path from 'path';
5
5
  import { rendererDir as defaultRendererDir, defaultPreloadPath } from '../utils/paths.js';
6
+ import { installThemeBackgroundSync } from '../utils/theme.js';
6
7
  import { registerAppLifecycle } from './lifecycle.js';
7
8
  import { createMainWindow, wireMainWindowEvents } from '../windows/main-window/index.js';
8
9
  import { createWorkbenchContext } from '../services/workbench-context.js';
@@ -198,6 +199,10 @@ export function createWorkbenchApp(config = {}) {
198
199
  const mainWindow = createConfiguredMainWindow(config, rendererDir);
199
200
  const context = createContext(config, mainWindow, rendererDir);
200
201
  context.registry.add(registerAppIpc(context));
202
+ // One process-wide listener that re-syncs every window's native
203
+ // backgroundColor on theme change — windows otherwise keep the stale
204
+ // creation-time color (see installThemeBackgroundSync).
205
+ context.registry.add(installThemeBackgroundSync());
201
206
  registerBuiltinModules(config, context);
202
207
  installMenu(config, mainWindow, context);
203
208
  const instance = {
@@ -1,4 +1,5 @@
1
1
  import { app } from 'electron';
2
+ import { DEFAULT_CDP_PORT } from '../../shared/constants.js';
2
3
  import { loadWorkbenchSettings } from '../services/settings/index.js';
3
4
  /**
4
5
  * Suppress EPIPE errors on stdout/stderr.
@@ -35,7 +36,7 @@ export function setupCdpPort() {
35
36
  app.commandLine.appendSwitch('remote-debugging-port', String(settings.cdp.port));
36
37
  }
37
38
  else if (!app.isPackaged) {
38
- app.commandLine.appendSwitch('remote-debugging-port', String(settings.cdp.port || 9222));
39
+ app.commandLine.appendSwitch('remote-debugging-port', String(settings.cdp.port || DEFAULT_CDP_PORT));
39
40
  }
40
41
  }
41
42
  //# sourceMappingURL=bootstrap.js.map
@@ -6,5 +6,5 @@ import type { WorkbenchContext } from '../services/workbench-context.js';
6
6
  */
7
7
  export declare function launch(config?: WorkbenchConfig): Promise<void>;
8
8
  export declare function buildDefaultMenu(ctx: WorkbenchContext): void;
9
- export declare function openSettingsWindow(ctx: Pick<WorkbenchContext, 'workbenchSettingsWindow' | 'mainWindow' | 'rendererDir' | 'notify' | 'windows'>): Promise<void>;
9
+ export declare function openSettingsWindow(ctx: Pick<WorkbenchContext, 'rendererDir' | 'notify' | 'windows'>): Promise<void>;
10
10
  //# sourceMappingURL=launch.d.ts.map
@@ -13,18 +13,17 @@ export function buildDefaultMenu(ctx) {
13
13
  installAppMenu(ctx);
14
14
  }
15
15
  export async function openSettingsWindow(ctx) {
16
- if (!ctx.workbenchSettingsWindow || ctx.workbenchSettingsWindow.isDestroyed()) {
17
- const win = await createSettingsWindow(ctx.mainWindow, ctx.rendererDir);
18
- ctx.workbenchSettingsWindow = win;
16
+ let win = ctx.windows.settingsWindow;
17
+ if (!win || win.isDestroyed()) {
18
+ win = await createSettingsWindow(ctx.windows.mainWindow, ctx.rendererDir);
19
19
  ctx.windows.setSettingsWindow(win);
20
20
  wireSettingsWindowEvents(win, () => {
21
- ctx.workbenchSettingsWindow = null;
22
21
  ctx.windows.setSettingsWindow(null);
23
22
  });
24
23
  }
25
- ctx.workbenchSettingsWindow.show();
26
- ctx.workbenchSettingsWindow.focus();
27
- ctx.notify.workbenchSettingsInit(ctx.workbenchSettingsWindow, {
24
+ win.show();
25
+ win.focus();
26
+ ctx.notify.workbenchSettingsInit(win, {
28
27
  settings: loadWorkbenchSettings(),
29
28
  });
30
29
  }