feat: 巡检增强 / 拓扑大屏 / 远程 HTTP / portable 绿色打包
Some checks failed
AI automation / Route event (push) Has been cancelled
AI automation / Hand reopened issue to maintainers (push) Has been cancelled
AI automation / Clean source issue state (push) Has been cancelled
AI automation / Reconcile handoffs (push) Has been cancelled
AI automation / Classify issue (push) Has been cancelled
AI automation / Claude Code smoke (push) Has been cancelled
AI automation / Review issue follow-up (push) Has been cancelled
AI automation / Publish issue follow-up (push) Has been cancelled
AI automation / Implement with Claude Code (push) Has been cancelled
AI automation / Publish implement PR (push) Has been cancelled
AI automation / Continue queued issue comments (push) Has been cancelled
AI automation / Codex review loop (push) Has been cancelled
AI automation / Publish Codex fix (push) Has been cancelled
AI automation / Clear Codex dispatch marker (push) Has been cancelled
AI automation / Own PR re-request Codex (push) Has been cancelled
AI automation / External PR re-request Codex (push) Has been cancelled
AI automation / Poll Codex reaction / retry (push) Has been cancelled

巡检模块:巡检调度器改为轮询驱动,新增每日报告存储、告警规则独立
Store、设备 Store 解耦,_executeSnapshot 补齐 DEBUG 声明,巡检中心
与告警中心页增强。

拓扑大屏:MonitoringTopologyView 扩展分组/布局控制,
useMonitoringData 重构数据流。

远程 HTTP:新增 electron/remoteHttpServer.cjs,preload/api.cjs 暴露
IPC,registerBridges 注册 netcatty:http:open 桥。

portable 绿色打包:
- electron-builder.config.cjs 恢复原始白名单(61MB app.asar),
  收集器自动追踪运行时依赖;
- portableData.cjs 重写为 .portable 标记检测;
- scripts/migratePortableLocalStorage.cjs 离线脚本把 Local Storage
  的 http://localhost:5173 origin 批量迁移为 app://netcatty;
- scripts/scanWorkspaceDeps.cjs 扫描 workspace 运行时依赖。
This commit is contained in:
2026-10-19 21:11:57 +08:00
committed by trae-solo-agent
parent 336c3afd47
commit 2e71e03d71
34 changed files with 3012 additions and 230 deletions

View File

@@ -0,0 +1,48 @@
/**
* 扫描根 package.json + 所有 workspace 子包的 dependencies/optionalDependencies,
* 找出 workspace 子包引用但根 package.json 没声明的运行时依赖(hoist 到根 node_modules 了)。
*
* 这些包 electron-builder 收集器看不到(它只读根 package.json),
* 会导致打包后 MODULE_NOT_FOUND。需要加到根 package.json 里。
*/
const fs = require("node:fs");
const path = require("node:path");
const rootDir = path.resolve(__dirname, "..");
const rootPkg = JSON.parse(fs.readFileSync(path.join(rootDir, "package.json"), "utf-8"));
// workspace 配置
let globs = rootPkg.workspace || rootPkg.pnpm?.packages || ["packages/*"];
if (!Array.isArray(globs)) globs = ["packages/*"];
const rootRuntime = { ...rootPkg.dependencies, ...rootPkg.optionalDependencies };
const subRuntime = {}; // 子包独有的运行时依赖 → 版本
for (const g of globs) {
const dir = path.join(rootDir, g.replace("/*", ""));
if (!fs.existsSync(dir)) continue;
const entries = fs.readdirSync(dir, { withFileTypes: true });
for (const e of entries) {
if (!e.isDirectory()) continue;
const pkgPath = path.join(dir, e.name, "package.json");
if (!fs.existsSync(pkgPath)) continue;
const pkgJson = JSON.parse(fs.readFileSync(pkgPath, "utf-8"));
const deps = { ...pkgJson.dependencies, ...pkgJson.optionalDependencies };
for (const [name, version] of Object.entries(deps)) {
if (!rootRuntime[name] && !subRuntime[name]) {
subRuntime[name] = version;
}
}
}
}
const missingRootDeps = Object.keys(subRuntime);
console.log("子包独有的运行时依赖(根 package.json 没声明):");
console.log(" 数量:", missingRootDeps.length);
console.log(" 列表:", missingRootDeps.join(", "));
console.log("");
console.log("根 package.json 已有运行时依赖:", Object.keys(rootRuntime).length);
console.log("");
console.log("建议加到根 package.json.dependencies 的条目:");
console.log(JSON.stringify(subRuntime, null, 2));