# 实施进度 > 配合 `DESIGN.md` 阅读。本文件只记录 phase 状态、决策偏差、文件量、下一步。 最后更新:2026-05-08(REPL `/resume` + 懒创建 task_dir + 切换前空清理) --- ## 状态 | Phase | 标题 | 状态 | 备注 | |------|-----|-----|------| | 1 | 最小可用骨架 | ✅ | 全部验收点过 | | 2 | Skill 系统 + 三个 skill | ✅ | Anthropic 格式;coding/ppt/proposal | | 3 | Hybrid 范式 (run_python) | ✅ | subprocess + 敏感 env 过滤 | | 4 | 演化性能力 | 🟡 | Model Profile + Capability Probing ✅;版本化 prompts 未做 | | 5 | Eval Suite | ⏸ 不做 | 个人工具用 dogfooding 替代,probe 覆盖健康检查 | | 6 | 长任务工程化 | 🟡 | task + state.json + 中断恢复 ✅;context 压缩、双层记忆未做 | | 7 | 打磨 | ❌ | Docker 沙盒 / 更多 skill / Web UI | --- ## 已完成关键能力 **Phase 1-3**(2026 早期):骨架 + skill 系统 + run_python。所有工具基目录是用户当前 cwd(不是 zcbot 仓库本身),agent 操作的是用户项目。`tools/fs.py` 的 `edit` 用 CoreCoder 风格唯一匹配。`tools/run_python.py` 过滤 `*API_KEY *TOKEN *SECRET *PASSWORD *PRIVATE_KEY` 环境变量。三个 skill 中 `ppt/` 最完整(v3:商务红硬约束 + apply_brand 品牌条 + Iconify 图标库 + scripts:fetch_icon / quality_check / render_icon;素材摄取改用 markitdown CLI)。 **Phase 4**(2026-05-06): - `core/probe.py` + `cli.py probe` —— basic_chat / parallel_tools / thinking_mode / long_context 四项探测 - 真实 probe 跑通,**flash mismatch 发现**:yaml `parallel_tools: false` 但实测能并发(暂不自动改 yaml,需更多场景观察) - pro 全 ok **Phase 6 部分**(2026-05-06): - `core/task.py` + `workspace/tasks//{state.json, messages.json}` —— TaskState 跟 mode/desc/status/tokens/timestamps;`build_agent` 返 5 元组;`sync_task_tokens` 每轮后写回 - CLI 新增 `tasks` 子命令 + REPL `/status /done /abandon /desc`;`chat` 加 `--mode --desc` 选项 - 移除 legacy `workspace/sessions/` 兼容(单一布局) **TUI 打磨 + task_dir 落地**(2026-05-07): - assistant 文字走 `rich.markdown.Markdown`,粗体/列表/表格/代码块正常渲染(非流式) - thinking spinner 由 daemon 线程每 100ms 刷文案,显示实时耗时 + 累计 token;每轮 LLM 返回追加 dim 一行 `[in N out N t Xs]` 留痕 - system prompt 显式注入 `task_dir` 绝对路径,SKILL.md 里 `` 占位符**真正落地**;`spec_lock.md` / `sections/` / `slides/` / 最终 docx/pptx 全收敛到 `workspace/tasks//` - `.gitignore` 删 `sections/` `slides/` `spec_lock.md` 三条无锚 bandaid —— 现在写错位置 git status 立刻报红,不再靠 ignore 兜底 **REPL 内 task 切换 + 懒创建**(2026-05-08): - `/resume [last|]` REPL 命令,无参数列最近 10 个 task 表格让用户挑序号或 task_id;和 `/new` 对称,都在 REPL 内重建 (agent, session, sid, task_state, task_dir) 五元组。`tasks` 命令和 `/resume` 共用 `_list_task_rows` helper - **懒创建 task_dir**:`build_agent` 新建分支不再 `session.save()` / `task_state.save()` 占位,推迟到首条 user 消息触发的 `Session.append → save()`。启动 REPL 立刻 `/exit` 磁盘无痕,跨进程安全(没有"另一个 REPL 刚 build_agent 没说话就被本进程当空 task 删"的窗口) - `_cleanup_if_empty` 在切走前(`/exit /quit /new /resume` + Ctrl-C/EOF)守门。三条都满足才删 task_dir:① 无 user 消息 ② 目录在磁盘上 ③ 文件集 ⊆ `{messages.json}`(state.json 存在 = 用户跑过 `/done /abandon /desc` 留下显式痕迹,要保) --- ## 关键决策与偏差 | 项 | 决策 | 与设计差异 | |---|------|-----------| | 工具基目录 | 用户当前 cwd(读)+ task_dir(写) | system prompt 同时给 cwd 与 task_dir 绝对路径,SKILL.md `` 占位符指向 task_dir | | Workspace 用途 | `tasks//{state.json, messages.json}` | memory/ 待 Phase 6 双层记忆 | | Eval Suite | 不做 | 设计为团队场景;个人工具 dogfooding 替代 | | 版本化 prompt | 直接 `general_v1.md`,无 active.md 软链接 | Windows 软链接麻烦,真要切版本时再做 | | run_python 沙盒 | subprocess + env 过滤 | 阶段 1 设计如此;Docker 待 Phase 7 | --- ## 文件清单(代码量) ``` core/capabilities.py 71 core/llm.py 89 core/loop.py 158 ← +markdown 渲染 / spinner 显时长+token core/probe.py 243 ← Phase 4 core/session.py 77 core/skills.py 81 core/task.py 63 ← Phase 6 tools/base.py 34 tools/fs.py 182 tools/shell.py 94 tools/run_python.py 84 tools/skill_tool.py 45 main.py 185 ← Phase 6 task 装配 / +task_dir 注入 / -占位 save (懒创建) cli.py 358 ← +probe / +tasks / +/resume / +空 task 清理 ───────────────────────────────── Python 合计 ~1764 行 ``` 加上 skills/ppt 下的脚本(~600 行)、SKILL.md / references / config / prompts,总仓库约 2500 行可读源码。 --- ## 下一步候选(性价比排序) 1. **Phase 6 双层记忆**(~半天)—— `workspace/memory/core.md` 注 prompt,`extended/.md` 按需读 2. **Phase 6 context 三层压缩**(~1 天)—— 兜底用,V4 长上下文一般用不到 3. **小修打磨**(~半小时)—— `Session.save()` 改原子写(tmp + rename),防 surrogate 等异常 truncate 4. **Phase 7 Docker 沙盒**(~1 天)—— 替换 subprocess,run_python 安全升级 5. **Phase 7 更多 skill / 模型档案**(持续) 6. **Proposal mermaid 流程图预渲染**(~半天,看到第二张图再做)—— 现状是 ASCII 框图走 fenced code 透传 (新宋体 + Consolas + xml:space=preserve),中文与 box drawing 字符宽度对不齐时还是有错位。增强方案: ` ```mermaid ` 块在 `render_docx.py` 里调 `mmdc` (mermaid-cli) → PNG → `add_picture` 嵌入。依赖 Node.js + `npm i -g @mermaid-js/mermaid-cli`,首次配置略麻烦,所以等 ASCII 透传明显不够用再做