# Daemon 重构设计方案 > 分支: `feat/integrate-5-branches` > 基于: `f41745cb` (= main `11bb3f62` 内容) > 日期: 2026-04-13 ## 一、问题概述 ### 1.1 命令结构散乱 当前后台进程相关的命令分布在三个不同的位置,没有统一的命名空间: | 命令 | 注册位置 | 入口 | |------|---------|------| | `claude daemon start/status/stop` | `cli.tsx` 快速路径 L203 | `daemon/main.ts` | | `claude ps` | `cli.tsx` 快速路径 L220 | `cli/bg.ts` | | `claude logs ` | `cli.tsx` 快速路径 L232 | `cli/bg.ts` | | `claude attach ` | `cli.tsx` 快速路径 L236 | `cli/bg.ts` | | `claude kill ` | `cli.tsx` 快速路径 L238 | `cli/bg.ts` | | `claude --bg` | `cli.tsx` 快速路径 L244 | `cli/bg.ts` | | `claude new/list/reply` | `cli.tsx` 快速路径 L250 | `cli/handlers/templateJobs.ts` | | `claude rollback` | `main.tsx` Commander.js L6525 | `cli/rollback.ts` | | `claude up` | `main.tsx` Commander.js L6511 | `cli/up.ts` | **问题**: - `ps/logs/attach/kill` 与 `daemon` 逻辑上都是后台进程管理,但互不关联 - 这些命令都**只有 CLI 入口**,REPL 里输入 `/daemon` 或 `/ps` 不存在 - `new/list/reply` 是模板任务系统的顶级命令,容易与其他命令冲突(特别是 `list`) ### 1.2 Windows 不支持 `--bg` 和 `attach` 硬依赖 tmux: - `bg.ts:handleBgFlag()` 第一步就检查 tmux,不可用直接报错退出 - `bg.ts:attachHandler()` 用 `tmux attach-session`,无 tmux 替代方案 - Windows (包括 VS Code 终端) 完全无法使用后台会话功能 ### 1.3 无 REPL 入口 对比 `/mcp` 的双注册模式: - **CLI**: `claude mcp serve/add/remove/list` (Commander.js, `main.tsx:5760`) - **REPL**: `/mcp enable/disable/reconnect` (slash command, `commands/mcp/index.ts`) `daemon`/`bg`/`job` 系列只有 CLI 快速路径,REPL 中完全不可用。 ## 二、目标 1. **层级化命令结构**: 参照 `/mcp` 模式,将后台管理收归 `/daemon`,模板任务收归 `/job` 2. **跨平台后台会话**: Windows / macOS / Linux 都能启动、附着、终止后台会话 3. **双注册**: CLI (`claude daemon ...`) + REPL (`/daemon ...`) 同时可用 4. **向后兼容**: 旧命令保留但输出 deprecation 提示 ## 三、命令结构设计 ### 3.1 `/daemon` — 后台进程管理 合并 daemon supervisor + bg sessions 为统一命名空间: ``` claude daemon ← CLI 入口 (cli.tsx 快速路径) /daemon ← REPL 入口 (slash command, local-jsx) 子命令: status 综合状态面板 (daemon + 所有会话) start [--dir ] 启动 daemon supervisor stop 停止 daemon bg [args...] 启动后台会话 attach [target] 附着到后台会话 logs [target] 查看会话日志 kill [target] 终止会话 (无参数) 等同于 status ``` **CLI 快速路径路由** (`cli.tsx`): ```typescript // 新: 统一入口 if (feature('DAEMON') && args[0] === 'daemon') { const sub = args[1] || 'status' switch (sub) { case 'start': case 'stop': case 'status': await daemonMain([sub, ...args.slice(2)]) break case 'bg': await bg.handleBgStart(args.slice(2)) break case 'attach': case 'logs': case 'kill': await bg[`${sub}Handler`](args[2]) break } } // 向后兼容 (deprecated) if (feature('BG_SESSIONS') && ['ps','logs','attach','kill'].includes(args[0])) { console.warn(`[deprecated] Use: claude daemon ${args[0] === 'ps' ? 'status' : args[0]}`) // ... delegate to daemon subcommand } ``` **REPL 斜杠命令** (`commands/daemon/index.ts`): ```typescript const daemon = { type: 'local-jsx', name: 'daemon', description: 'Manage background sessions and daemon', argumentHint: '[status|start|stop|bg|attach|logs|kill]', isEnabled: () => feature('DAEMON') || feature('BG_SESSIONS'), load: () => import('./daemon.js'), } satisfies Command ``` ### 3.2 `/job` — 模板任务管理 ``` claude job ← CLI 入口 /job ← REPL 入口 子命令: list 列出模板和活跃任务 new