Files
HomeAgent/cmd
HomeAgent Agent 3edab0fe68 refactor(homed): main() 696 行按启动阶段拆成 25 个阶段函数
main() 原本是一整条 696 行的启动脚本:日志、目录、记忆、配置、Lua、守护、
追踪、内核 API、文本记忆、LLM 源、文档/知识、人格、插件、Agent、ONNX、
IPC、心跳、关停全挤在一个函数里,变量跨 500 行互相引用。

现在 main() 只剩「顺序编排 + 就地交接」(**149 行**,低于 funlen 阈值 150):
  opt           := parseFlags()
  logDir        := setupLogging(opt.dataDir)
  agentWorkDir  := ensureDataDirs(opt.dataDir)
  mem, closeMem := initMemoryStack(opt.dataDir)
  ...
共 25 个阶段调用,实现体在同包 bootstrap.go(一一对应)。

零漂移保证:
  * 阶段体逐字取自原 main,只做机械替换(`*dataDir`→参数、`memIdx`→`mem.indexer`);
  * 原 main 的每个 defer 都换成一个在**同一位置**注册的 cleanup,
    LIFO 释放顺序不变;多资源阶段内部再按原注册顺序取反;
  * 语句级比对:原 main 的 525 条可执行语句全部有对应,无遗漏。
    仅 3 处为**有意**的结构改写(其余为同义替换):
      1. initLuaVM / initTextMemory:「启动成功才 defer Stop」改为
         「失败返回 no-op cleanup,成功返回 Stop」——调用点语义不变;
      2. startIPCServer:同上(用 started 标志保证失败时不 Stop);
      3. resolveBaseAPIKey:把三级兜底 API key 解析提成一个纯函数。
  * defaultPrompt 提为包级 const defaultSystemPrompt(不含版本号字面量)。

验证(A/B 实测,不是只跑编译):
  * go build ./... / go vet ./cmd/homed/ / go test ./cmd/... ./internal/agent/... ./internal/plugin/... 全绿
  * 重构前后二进制各起一次(-data 临时目录,SIGTERM 收尾),日志集合**完全一致**:
    63 个注册工具、同名插件全部 loaded、kernel ready、插件逆序关停、'stopped'
    —— 差异仅为并发加载插件的打印顺序。

全仓非测试 Go 函数现状:≥300 行 **0 个**,≥200 行 9 个,≥150 行 16 个。
2026-09-14 06:30:45 +08:00
..