refactor(cli): decouple daemon native deps from CLI global install — closes #41 #42
Reference in New Issue
Block a user
Delete Branch "refactor/decouple-daemon-from-cli"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
What
将
@uncaged/nerve-daemon从 CLI 的运行时依赖解耦,改为从 workspace 的node_modules动态加载。全局安装的 CLI 不再包含 native C++ addon(better-sqlite3),避免 Node 版本升级后 ABI 不兼容且无法 rebuild 的问题。Why
当前 CLI 直接静态 import daemon,导致 better-sqlite3 被编译到 pnpm global store。
pnpm -g rebuild不支持,Node 版本变更后 native addon 直接坏掉且无法修复。Changes
packages/cli/package.json@uncaged/nerve-daemon从 dependencies 移到 devDependenciespackages/cli/src/workspace-daemon.tspackages/cli/src/daemon-bootstrap.tspackages/cli/src/run-foreground-kernel.tspackages/cli/src/daemon-types.tspackages/cli/src/commands/start.tsloadDaemonModule(),后台 spawndaemon-bootstrap.jspackages/cli/src/commands/init.ts@uncaged/nerve-daemon依赖 + 安装后 rebuild better-sqlite3packages/cli/src/commands/workflow.tsloadDaemonModule()packages/cli/src/__tests__/workflow.test.tspackages/cli/src/index.tspackages/cli/tsup.config.ts@uncaged/nerve-daemonpnpm-lock.yamlRef
🔄 REQUEST_CHANGES
架构方向完全正确,CLI 和 daemon 的解耦做得很干净。但有一个 blocker:
🔴 Critical
1.
tsup.config.ts有未解决的 merge conflict markers两个都需要——
banner给 CLI shebang,external做解耦。合并而非二选一。🟡 Should Fix
2.
process.exit(1)在 library 函数里assertWorkspaceDaemonInstalled作为公开 API 直接process.exit(1)不合适,应该 throw Error 让调用方决定。3.
dist/index.js硬编码路径getDaemonEntryPath里硬编码了 daemon 的构建输出路径,如果 daemon 改 build 配置会静默失败。考虑读 daemon 的package.json的main/exports字段。4.
sleep(1500)启动检查任意延迟不可靠。快机器上 daemon 可能 1.5s 后才 crash,慢机器上可能还没启动。考虑轮询 IPC socket。
5.
daemon-types.ts类型镜像可能 drift和实际 daemon 导出没有编译期校验。考虑加个
satisfies断言测试。🟢 亮点
daemon-bootstrap.ts独立入口避免重入 CLI parser,好模式nerve init自动安装 + rebuild better-sqlite3,用户体验好— 小墨 🖊️
✅ APPROVED — Re-review passed
5/5 修复确认:
🔴 1. ✅ tsup.config.ts —
banner+external都保留了🟡 2. ✅
assertWorkspaceDaemonInstalled改为 throw Error(runForegroundKernelSession和openStore里的process.exit是 CLI command handler 内部用的,可以接受)🟡 3. ✅ 读
package.jsonmain 字段,fallbackdist/index.js🟡 4. ✅ IPC socket 轮询(200ms 间隔,5s 超时)
🟡 5. ✅
daemon-types.test.ts双向expectTypeOf断言⚠️ 两个小建议留 follow-up:
import(url) as Promise<DaemonModule>可以加个 runtime shape check— 小墨 🖊️