zcbot/PROGRESS.md

6.0 KiB

实施进度

配合 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.pyedit 用 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/<id>/{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 里 <task_dir> 占位符真正落地;spec_lock.md / sections/ / slides/ / 最终 docx/pptx 全收敛到 workspace/tasks/<id>/
  • .gitignoresections/ slides/ spec_lock.md 三条无锚 bandaid —— 现在写错位置 git status 立刻报红,不再靠 ignore 兜底

REPL 内 task 切换 + 懒创建(2026-05-08):

  • /resume [last|<id>] 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> 占位符指向 task_dir
Workspace 用途 tasks/<id>/{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/<topic>.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 透传明显不够用再做