caoqianming
514d36c481
core(§7 Phase G G3): chat 只读页 + markdown + tool 折叠
...
- web/app.py 加 _get_md() 单例 MarkdownIt(gfm-like + linkify +
breaks,html=False 禁内联 HTML 防 XSS),fenced code 走 pygments
_pygments_highlight 回调(codehilite cssclass)。
- load_chat_messages(tid):PG idx asc 读 messages。
build_chat_blocks(messages):system / tool 不入 block(tool 内嵌进
assistant.tool_call.result),user / assistant text 走 md 渲染,
orphan tool_call → [no result]。_args_preview 60 字截断,
_pretty_json 解析失败 fallback 原串。
- /tasks/{id} 渲染 chat.html;删 task_placeholder.html。
- chat.html:.msg 卡片(user 浅蓝 / assistant 白底),tool_call 用
<details> 默认折叠(无 JS,浏览器原生);summary 显示 tool 名 +
args 前 60 字预览,展开看 args_pretty + result。
- CSS 加 .body 内 markdown 元素样式(table / blockquote / code / pre
/ strikethrough)+ .codehilite 浅色 token 配色(keyword/string/
comment/function/number/operator,余下黑色)。
- requirements: markdown-it-py[linkify] / mdit-py-plugins / pygments。
Smoke 28 路径全绿(in-process Starlette TestClient):4 display
blocks aggregation + GFM 特性(table/fence/autolink/strikethrough/
bold)+ tool 配对(命中 + orphan [no result])+ HTML 含 <details>/
tool-badge/codehilite/<s> + 空 task 文案 + invalid UUID 404 + util
单测(args_preview/pretty_json/render_md 边界)。版本 0.2 → 0.3。
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-15 08:38:31 +08:00
caoqianming
80a658eba4
core(§7 Phase G G2): task list 页 + /tasks/{id} 占位
...
- web/app.py 加 list_tasks(limit, status):PG tasks + messages count,
updated_at 降序,返回模板友好 dict。Web 与 cli.py 数据形状不一致
(CLI 用 tuple,Web 用 dict),不预付抽象,等真有 schema 同步成本
再抽。
- / 路由换成 task 列表,支持 ?status=active|completed|abandoned
filter(无效值静默降级 all)。/tasks/{task_id} 占位路由:UUID 解析
失败 → 404,DB 不存在 → 404,有效则渲 task_placeholder.html(G3 来填
消息流)。
- Linux portability:_norm_path() 显示前 replace('\','/') 把 Win
存的 backslash 归一,Win Path.resolve()-str → "D:/..." 显示;Linux
forward-slash 原路通过。Path.as_posix() 在 Linux 读 Win backslash
串时不归一,所以选 replace 而非 as_posix。
- 模板 home.html 表格(id/updated/status/mode/model/msgs/tokens/desc-dir)
+ status badge 配色(active 绿 / completed 蓝 / abandoned 灰) +
filter 表单 + 空态文案。task_placeholder.html 渲染 G3 提示。CSS
tabular-nums 数字对齐 / hover 高亮 / accent-soft note。
Smoke 18 路径全绿(in-process Starlette TestClient):3 task seed
(active/completed/abandoned)+ Win\Linux 双路径形态 → / 渲染对、
status filter 正反向、garbage status 静默 all、UUID 占位、notauuid
404、ghost UUID 404、limit 生效、/healthz 不退化。版本 0.1 → 0.2。
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-14 15:52:11 +08:00
caoqianming
91202b6172
core(§7 Phase G G1): Web UI 脚手架 + cli.py web 子命令
...
- web/ 新包:app.py FastAPI 工厂(/ + /healthz + /static),Jinja2
base.html / home.html,minimal style.css。HTMX + HTMX-SSE 走 CDN
(无 node 链路,与 §5 Less Scaffolding 一致)。
- cli.py 加 web --host --port --reload 子命令,默认 127.0.0.1:8765,
本地形态 sentinel user 无 auth(Phase D 才上 OIDC)。
- requirements: fastapi / uvicorn[standard] / jinja2 / python-multipart
(multipart 为 G5 文件上传留)。
- Starlette 新签名踩坑:TemplateResponse(request, name, context),
旧式塞 context 里会让 jinja 用 dict 当 cache key 炸 unhashable,记
RUN.md 故障兜底。
- Linux portability:模板 path 显示约定 .as_posix();SSE 头 G4 上时
带 X-Accel-Buffering: no(nginx 反代友好)。`cli.py web` 在
.venv/Scripts/python.exe(Win)/ .venv/bin/python(Linux)走同一路径。
Smoke 四路径(in-process via Starlette TestClient)全绿:/healthz →
"ok" / / → 1063B(title + static + version)/ /static/style.css →
1624B / /nonexistent → 404。`cli.py web --help` 子命令注册 OK。
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-14 13:37:54 +08:00
caoqianming
e8dbfa57a5
core(§7 B Step 6): no-subtask 前缀嵌套校验
...
- core/storage/utils.py 加 check_no_subtask + NoSubtaskError;PG LIKE
双向(new LIKE existing/% OR existing LIKE new/%),同 task_dir
允许(同项目多对话),空 / whitespace 跳过。
- 分隔符容差:SQL replace(task_dir, '\', '/') 把存的 Windows 反斜杠
与新值统一到 '/' 再比;backslash 通过 bind 参数传,绕开 SQL 转义。
- main.py::build_agent 在 resolve_task_id 后、TaskState 构造前调,
if not resume 单层闸 —— resume 跳过(改名走未来 Folder API cascade).
- cli.py 三处 build_agent 调用现有 try/except 直接接住 NoSubtaskError.
- PROGRESS / RUN 同步:Step 6 完工,故障兜底加一条 NoSubtaskError 处理.
Smoke(9 路径 + e2e 3 分支)全绿。§7 B 完工(Step 5 取消)。
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-14 11:59:37 +08:00
caoqianming
2b3692c8bf
core(§7 B Step 4): --task-dir 双形态 + RUN.md 运行手册
...
- CLI `chat --task-dir <path>` 让用户显式指定项目目录(§7.1 task-primary +
dir 副视图心智模型落地);留空走默认派生 workspace/tasks/<uuid>/。
- main.py::resolve_task_id 加 task_dir_arg;resume 时从 PG tasks.task_dir
读,空则降级默认派生。新增 is_managed_task_dir(td, ws) 判断 task_dir
是否在默认模板下。
- cli.py::_cleanup_if_empty 拿 workspace_dir 作保护开关 —— 用户自指定的
task_dir 绝不 rmtree(可能含用户已有素材);DB 行该删还是删。
- core/export_docx.py::export_chat_to_docx 重构:task_id 升一等参数(从
task_dir.name 提取改入参传入),task_dir 留空时自动从 PG 读;cli /export
与 cli.py export 子命令均改走 _resolve_uuid_or_prefix + task_id 直传。
- 新建 RUN.md(运行手册):env / 初始化 / 日常命令 / 故障兜底 / 关键路径。
- CLAUDE.md 加 RUN.md 维护规则(三文档边界:DESIGN=为什么 / PROGRESS=做到哪
/ RUN=怎么跑),对外行为改动同步更 RUN。
Smoke 4 路径:default-derived(managed=True, cleanup rmtree)/ --task-dir
(managed=False, FS preserved)/ resume reads DB task_dir / export 自动 PG
查路径,全绿。
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-14 11:38:05 +08:00
caoqianming
aeecc7f0f3
core(§7 B Step 3): TaskState ORM + Web UI 设计 (Phase G)
...
- TaskState dataclass 改 PG-backed:save() → upsert_task (INSERT ON CONFLICT
DO UPDATE,显式刷 updated_at);load(task_id) → SELECT。state.json 全面
废除,task_dir 只承担 skill 产物。
- TaskState 字段去 cwd / 加 task_dir(对齐 §7 SaaS task_dir-as-identity);
cwd 只在 session.meta 内存视图保留(展示用)。
- core/storage/utils.py 新增 upsert_task / update_task;ORM-level UPDATE
自带 onupdate=func.now(),DO UPDATE 需显式 set。
- session.py Session.append 的 ensure 调用补传 mode/description/
reasoning_effort,避免首次 INSERT 后 _list_task_rows 看到空 meta。
- sync_task_tokens 改成 update_task 单字段 UPDATE,避免无谓全字段 UPSERT。
- cli.py _list_task_rows 全字段从 PG 读,status 过滤走 SQL WHERE;
_cleanup_if_empty 去 state.json 特例(任何 FS 文件/子目录都算实质痕迹)。
- core/export_docx.py meta 走 TaskState.load(tid),CWD 字段从 meta 表移除。
- DESIGN.md 追加 Phase G(Web UI 简洁版,FastAPI + Jinja2 + HTMX + SSE),
排在 §7.7 D 后;§7.9 补 server-render 不上 SPA 的取舍 4 条。
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-14 11:25:53 +08:00
caoqianming
4f87bf14ee
core(§7 B Step 2): Session ORM — messages 走 PG, task_id 切 UUID
...
Session 重写
- messages 落 PG `messages` 表(append-only, idx 严格递增, jsonb payload)
- system prompt 不入库(每次 build_agent 重建到 messages[0],memory 演化即时生效)
- Session.load(task_id, system_prompt=...) 从 DB 读历史
- Session.task_exists / n_user_msgs 工具
Storage utils
- ensure_local_task_row: 首条消息前 INSERT ... ON CONFLICT DO NOTHING
打底 tasks 行(Step 3 后由 TaskState.save 接管字段更新)
task_id 切 UUID
- resolve_task_id(workspace, arg, resume): UUID + 前缀匹配,'last' 从 PG
按 updated_at 取最近
- 显示一律截前 8 位;完整 UUID 在 /id /status 保留
- 旧 workspace 老 task(时间戳格式)**不做兼容**
CLI 适配
- _cleanup_if_empty 双检查:DB messages count + FS 产物
- _list_task_rows: PG tasks ORDER BY updated_at + state.json 兜底字段
- _task_has_messages: /export 检查改 DB
- core/export_docx.py: messages 从 PG 读,state.json 留作 meta
Step 5 (migrate-from-fs) 取消。
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-14 10:55:50 +08:00
caoqianming
5fbf3746be
docs(CLAUDE.md): 加文档维护规则 — 每步更 PROGRESS,必要时改 DESIGN
...
明确 PROGRESS / DESIGN 分工:工程笔记进 PROGRESS,架构 /
心智模型 / 取舍决策才动 DESIGN。避免把实施细节沉淀成"设计"。
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-14 10:43:02 +08:00
caoqianming
425ea59937
core(§7 B Step 1): Storage 基建 — SQLAlchemy ORM + alembic + db CLI
...
- core/storage/{engine,models}.py: 5 表 ORM(users/tasks/messages/runs/
usage_events)+ session_scope 上下文 + 本地 sentinel user 初始化
- alembic 初版 migration 0001_initial_schema: messages.payload GIN
索引 + tasks (user_id, task_dir) 复合索引 + pgcrypto 扩展兜底
- cli.py: db upgrade/downgrade/current 子命令组;ZCBOT_DB_URL 未设
给 ASCII 报错 + exit 2(避开 Windows GBK 控制台编码问题)
- requirements: +sqlalchemy>=2.0 +psycopg[binary]>=3.1 +alembic>=1.13
- DB URL 来自环境变量 ZCBOT_DB_URL,不引导 docker(用户给测试库地址)
已在远端测试 PG 跑通 db upgrade head + db current。Session/TaskState
ORM 接入留 Step 2-3。
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-14 10:41:44 +08:00
caoqianming
55dc8eb99d
design: §7.1 改 task-primary + dir 副视图心智模型
...
原"Folder-centric"标题误导,实际产品形态是 task list 扁平视图为主、
dir tree 为辅,两视图正交查同一份数据(dir 不是 task 的父容器)。
- §7.1 重写心智模型,加双视图对照表 + Mac Finder 类比
- §7.1 明写 task_dir 留空 vs 指定的产品语义(一次性对话 vs 项目化)
- §7.1 空 dir(只上传素材未开 task)行为
- §7.2 API 顺序调整,tasks 前置,加分组注释
- §7.0/§7.6 task_dir 行同步统一为"留空派生/指定路径"二分
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-14 09:15:25 +08:00
caoqianming
efe4a91c33
design: 精简 DESIGN/PROGRESS (-177 行)
...
DESIGN 520→351,PROGRESS 88→80。砍 §7 内部重复说理与 SQL 示例,
合并 §6/§7.8 风险表,压缩 §3 字段表与启动顺序;load-bearing 细节
(rename `old/%` 前缀、ModelCapabilities 字段、阶段估时)全部保留。
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-14 08:52:23 +08:00
caoqianming
b4df60062e
design: 更新设计
2026-05-14 08:46:53 +08:00
caoqianming
4560a95fac
docs: 加 CLAUDE.md (开发环境笔记)
...
记录 .venv 位置, 提醒用 .venv/Scripts/python.exe 跑脚本 ——
全局 python 没装 litellm 等依赖, 直接报 ModuleNotFoundError.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-11 15:14:05 +08:00
caoqianming
e4a48fbb53
core: Session/TaskState 原子写 + Phase 6 双层记忆
...
- core.session.atomic_write_text (tmp + fsync + os.replace) 接管 Session/
TaskState 落盘, 中途异常不留 0 字节; _cleanup_if_empty 放过 *.tmp 孤儿
- core/memory.py: workspace/memory/{core.md, extended/} 双层记忆.
core.md 注 system prompt, extended/*.md 索引(标题+绝对路径)注 prompt,
内容靠 read 工具按需拉
- _build_system_prompt 从 build_agent 里提出来, new 和 resume 都走同一段,
resume 时覆盖 messages[0] -> memory 演化即时生效
- PROGRESS/DESIGN 同步: §7 platform track 行 + A 阶段完成 + 双层记忆/原子写
+ 文件清单到 2429 行
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-11 15:13:56 +08:00
caoqianming
375bb2999c
core: loop 事件流化 (sink 接口, §7 A 阶段)
...
loop 不直接 console.print —— 改成 sink.emit({type, ...}),sink 决定怎么呈现。
新增 ConsoleEventSink 接管 spinner / [in N out N] / assistant 文本 / tool>(args) / 结果预览,
CLI 行为零回归。后续接 SSE 时只换 sink 实现,loop 不动。
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-11 14:59:32 +08:00
caoqianming
f6c3492514
design: 加 §7 Core/Platform 切分草案 (SaaS 化方向)
...
讨论后定的方案:把 core 包成独立 HTTP/SSE service,平台只做 BFF+UI+Auth+Billing。
数据归属、/v1 接口、Postgres+本地文件存储、Docker 沙盒、6 步代码改造、5 阶段落地路线。
status=design,personal-tool track 不受影响。
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-11 14:59:23 +08:00
caoqianming
263cdb974a
proposal: 阶段二每段卡点附"下一段要点预告"
...
让用户在下一段动笔前就能改方向, 比读完正文再返工便宜一个量级。
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-08 16:11:18 +08:00
caoqianming
b86c051290
cli+core: 加 task 对话导出为 .docx
...
- core/export_docx.py: 渲染 messages.json 为对话稿,左排小字 + 角色配色
(user/assistant/tool/tool_call/reasoning),meta 信息表置文档开头,tool
结果默认前 1000 + 中间省略 + 后 500
- cli.py: 加 `export <task_id>` 子命令(支持 last / -o / --include-system /
--no-reasoning / --tool-head / --tool-tail)与 REPL `/export [<id>]`
- 默认跳过 system prompt(信息密度低),默认带 reasoning_content(观察价值高)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-08 14:42:45 +08:00
caoqianming
ae93016442
cli: REPL /resume 切 task + 懒创建 task_dir + 切走前空清理
...
- 加 /resume [last|<id>] REPL 命令,无参数列最近 10 个表格让用户挑;
和 /new 对称,都在 REPL 内重建五元组。tasks 命令复用 _list_task_rows
- main.py 新建分支不再 session.save() / task_state.save() 占位 ——
推迟到首条 user 消息触发的 Session.append → save() 才物化 task_dir。
启动 REPL 立刻 /exit 磁盘无痕,跨进程也安全
- _cleanup_if_empty 在 /exit /quit /new /resume + Ctrl-C/EOF 守门:
无 user 消息 + 目录在磁盘上 + 文件集 ⊆ {messages.json} 才删,
state.json 存在(/done /abandon /desc 留下的显式痕迹)就保
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-08 09:55:56 +08:00
caoqianming
56e414e046
proposal: 阶段二两段式 + render_docx 透传 fenced 代码块
...
- SKILL.md 阶段二改两段式: 先列 3-6 条要点 → 用户确认 → 再起草 → 用户确认。关键章节 (立项依据/研究方案/技术路线/考核指标) 一段一卡。一次性出全文容易把错方向推到底,要点阶段拦得早
- render_docx.py 支持 ```...``` 围栏: 中文新宋体 + 西文 Consolas + 行距 1.0 + 不缩进 + xml:space=preserve。原先 ASCII 流程图被当散文段落合并,框完全错位
- PROGRESS.md backlog 加 mermaid 预渲染 (mmdc → PNG → add_picture),等 ASCII 透传不够用再做
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-08 08:58:18 +08:00
caoqianming
f4432cca20
添加col.ps1到gitignore
2026-05-08 08:03:49 +08:00
caoqianming
a32cb049bc
ppt+proposal: 素材摄取改用 markitdown, 删自研 source_to_md
...
ppt/proposal 的"素材 → Markdown"逻辑此前各写一份 (source_to_md.py
内联 pypdf/python-docx/openpyxl), 改用微软 markitdown CLI 统一替换:
表格/标题/列表保留更好, 同时多覆盖 xlsx/url/html/csv 等格式。
- requirements.txt: 加 markitdown[pdf,docx,pptx,xlsx]
- skills/ppt/SKILL.md: 资源行改成 markitdown 说明
- skills/proposal/SKILL.md: 阶段零 32 行 Python 代码 → 4 行 CLI
- skills/ppt/scripts/source_to_md.py: 删除 (157 行)
- PROGRESS.md: scripts 列表同步
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-08 08:03:07 +08:00
caoqianming
72d2b64c40
core/ui: 抽出语义化 console 主题, 调用方去硬编码颜色
...
新增 core/ui.py 集中定义 Rich Theme:
- 语义样式名: user / assistant / tool / ok / warn / err / info / muted / accent
- 在黑底终端上 readable, 弱化用 grey 而非 dim, 强调走 bright_*
- make_console() 统一应用主题, 以后改主题只动这一处
cli.py / main.py / core/loop.py 把内联的 [red] [green] [blue] [yellow]
[cyan] [dim] 等替换为语义样式; 调用 make_console() 取代 Console()。
2026-05-07 16:10:11 +08:00
caoqianming
647d92f532
proposal+ppt: 路径用 <skill_dir>, 补 spec_lock 模板与 --spec 覆盖度检查
...
按代码评审建议改的 5 项:
1. 所有脚本/资源路径改成相对 <skill_dir> (load_skill 头里的绝对路径),
不再假设 cwd 是 zcbot 仓库根。proposal+ppt 的 SKILL.md / icons.md /
INDEX.md 都改了。
2. quality_check.py REQUIRED_SECTIONS 给 key_rd 补上 11_team /
12_budget / 13_appendix —— 之前模板有但检查没到, 缺团队/预算/附件
也会显示结构完整。
3. 新增 templates/spec_lock.md, 把"八条对齐"固化成可复制字段
(含考核指标矩阵表 + TODO 列表 + 引文清单), 阶段二/三都从这里读。
4. quality_check.py 加 --spec <spec_lock.md> 选项, 解析 spec 中的
考核指标矩阵, 关键词模糊匹配 sections, 提示哪些指南指标在正文
未充分覆盖。SKILL.md 阶段三命令同步。
5. SKILL.md 新增"阶段零: 摄取素材", 用 run_python + pypdf/python-docx/
openpyxl 把 PDF/DOCX/XLSX 转成 source/*.md, 不再要新脚本。同时
把 spec_lock 字段引用改写到模板。
顺带:
- proposal SKILL.md 明确 7 类基金里只有 3 类 (key_rd/major_project/
nsfc_joint_fund) 有完整章节模板, 其它 4 类复用骨架, 差异查 fund_types.md
- ppt SKILL.md 阶段三命令路径错误 (python scripts/quality_check.py)
顺带修了
2026-05-07 16:05:44 +08:00
caoqianming
d1f39f05f5
proposal skill 精简: 2888 -> 1712 行 (-41%)
...
- 删 references/typography.md (90% 已被 render_docx.py 吸收, 剩下进 SKILL 硬规则)
- 删 references/section_templates.md (与 templates/ 大量重叠, 4 个核心 pattern 折进 SKILL "章节骨架速查")
- fund_types.md / review_redlines.md / citation_gbt7714.md / budget_rules.md
全部去散文留骨架: 表格 / 清单 / 示例 优先, 解释性段落只留必要的
- templates/{key_rd,major_project,nsfc_joint_fund}.md 删冗长写作提示, 只留章节骨架 + 字数预算 + 必填字段
- 脚本逻辑不动, render_docx.py 仅去 docstring 中的 typography.md 引用
2026-05-07 15:32:07 +08:00
caoqianming
3869089a44
DESIGN/PROGRESS: 同步 TUI 打磨 + task_dir 落地
...
DESIGN: 目录树补全 task_dir 内的 skill 产物;启动顺序 #5 加 task_dir 注入;
3.1 主循环增补 markdown 渲染、spinner 实时耗时/token、每轮成本行。
PROGRESS: 加 2026-05-07 条目;工具基目录决策更新;loop/main 行数刷新。
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-07 14:20:59 +08:00
caoqianming
bb9e92bb84
让 <task_dir> 真正落地: 产物收敛到 workspace/tasks/<id>/
...
之前 SKILL.md 反复说 <task_dir>/spec_lock.md / <task_dir>/sections/,但代码里没把
task_dir 暴露给 agent,只给了 cwd——导致 spec_lock.md 落到 skills/proposal/、
sections/ 落到 repo 根。两者被 .gitignore 通配规则盖住,问题被掩盖。
- main.py system prompt 里显式注入 task_dir 绝对路径 + 强约束(只写 task_dir,不写
cwd / skills/ / repo 根)。SKILL 里的 <task_dir> 占位符明确指向这个值。
- skills/proposal/SKILL.md + skills/ppt/SKILL.md 的「工作目录约定」前面加一句解释
<task_dir> 来自 system prompt。
- .gitignore 删掉 sections/ slides/ spec_lock.md 这三条无锚 bandaid——workspace/
已经覆盖正确路径下的产物;repo 根再写错了要靠 git status 立刻报红,不再靠 ignore
兜底。
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-07 14:18:35 +08:00
caoqianming
61ff98bb79
loop: thinking spinner 显示耗时 + 累计 token,每轮回打成本一行
...
spinner 文本由后台 daemon 线程每 100ms 用 status.update() 刷新,显示
'thinking... 1.3s ctx 12,345 tok'。每轮 LLM 返回后追加一行 dim
'[in N out N t Xs]',留痕便于回看本轮成本。全 ASCII。
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-07 14:05:44 +08:00
caoqianming
8995a898ba
proposal/render_docx: 加目录 + 内联 md 解析 + 列表分行
...
修复实测三个问题:
1. 加目录页 (Word TOC 域 + 改用 builtin Heading 1/2/3 样式才能被索引)
2. 内联解析 **加粗** / *斜体* / `等宽`,不再以字面量进入正文与表格
3. [N] 引文 / 1./2. / 一、 / (一) 等列表项各自独立成段,
不再被散文合并器吃掉换行
顺带:
- 直接修改 Normal/Heading style 的 rFonts 让样式继承字体
- 标题 Heading 1/2 强制黑体, 字色覆盖 builtin 蓝色
- 表格 cells 也走内联解析, 解决单元格 ** 残留
2026-05-07 13:41:47 +08:00
caoqianming
80f9934f8f
loop: 用 rich.Markdown 渲染 assistant 输出
...
之前 console.print(f"...{content}") 只解析 [tag] 标签,不识别 **bold**、表格、列表
等 markdown 语法,LLM 回复会以原文显示。改成单独打印前缀后再 console.print(Markdown(content))。
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-07 11:19:46 +08:00
caoqianming
950aa5aadc
添加忽略文件
2026-05-07 11:06:28 +08:00
caoqianming
2b1e2143f1
proposal skill v2: 6 类基金分型 + 3 套章节模板 + 渐进披露
...
参考重大专项任务书 / NSFC 联合基金 2026 / 重点研发"区块链"申报书
3 份真实 docx,从 80 行 SKILL.md 拆成 13 文件 (~2.6k 行):
- references/{fund_types,section_templates,review_redlines,citation_gbt7714,budget_rules,typography}.md
- templates/{key_rd,major_project,nsfc_joint_fund}.md
- scripts/{render_docx,word_count,quality_check}.py
核心补强:任务书/申报书/申请书结构差异、字数预算硬约束、考核指标
量化要求、间接费用台阶比例、GB/T 7714 文献规范、字体行距等排版硬规则。
2026-05-07 08:50:19 +08:00
caoqianming
a25fcbc703
精简 DESIGN/PROGRESS:对齐当前实现,去掉落地前的设想
...
- DESIGN.md 1140 → 212 行:删 v1/v2 比较、Eval Suite 章节、Phase
roadmap、长代码草图、技术栈清单(在 requirements.txt)、超长附录
- PROGRESS.md 185 → 82 行:删超细分的 ppt v3 描述、重复测试列表
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-06 16:26:19 +08:00
caoqianming
dbb778fe10
Phase 4 + 6: capability probe + task 概念 / state.json
...
- core/probe.py + cli.py probe: basic_chat / parallel_tools /
thinking_mode / long_context 四项实测对账 yaml;不进启动路径
- core/task.py + main.py: workspace/tasks/<id>/{state.json, messages.json},
TaskState 跟 mode/desc/status/tokens/timestamps;build_agent 返 5 元组
- cli.py tasks 子命令 + REPL /status /done /abandon /desc;chat 加
--mode/--desc 选项;移除 legacy workspace/sessions/ 兼容
Phase 5 evals 评估后决定不做:个人工具用 dogfooding 判断模型升级,
probe 已覆盖健康检查;造作 case 没区分度,维护成本不划算。
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-06 16:21:17 +08:00
caoqianming
235d43bc1d
入库商务红 tabler 图标种子集 (9 PNG + 4 SVG)
...
种子集覆盖商务汇报常用概念: target / brain / chart-bar / users / trophy /
alert-triangle / cpu / building-factory / cloud-network / database。
所有文件按 <set>_<name>_<colorhex>[_<sizepx>] 规约命名 (4 个原裸名 SVG 已规整)。
累计 < 40KB, 协作者克隆即用, 离线/CDN 异常时仍可用; 新场景再 fetch_icon.py 拉。
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-06 13:19:43 +08:00
caoqianming
38fbee9d9e
修三处 v3 遗留: Iconify 不触发 / mkdir -p 误创目录 / 平台无知
...
- skills/ppt/SKILL.md: 八条对齐第 7 项默认值从 "MSO_SHAPE 几何形状 (无外部图片资源)"
改成 "Iconify tabler 集 (描边商务图标, 主色染色, fetch_icon.py 缓存到 assets/icons/)"。
阶段二每页流程加一步"图标先于版式": 先 glob 本地, 没就 fetch, 再做页。
根因: v3 砍了 icons.md 里 MSO_SHAPE 当业务图标的部分, 但 SKILL.md 默认值没同步,
模型把它写进 spec_lock 后阶段二永远不会触发 Iconify 拉取
- tools/shell.py: Windows 下拦截 `mkdir -p X [Y...]`, 走 os.makedirs(exist_ok=True)。
根因: cmd.exe 的 mkdir 不识别 -p flag, 把 -p 当字面目录名创建
- prompts/system/general_v1.md: 加 "## 平台" 段, 提醒 Windows + cmd 环境下用
run_python os.makedirs 而非 shell mkdir -p。行为前置防御 + shell.py 工具层后置兜底
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-06 13:12:17 +08:00
caoqianming
0971a500e7
PPT skill v3: 红色硬约束 + 品牌条 + 强制尾页 + Iconify 图标库
...
修复上一轮生成的实际问题: 模型擅自把红色换成蓝色 / 内页全裸白 / 缺 Q&A 尾页;
并补齐"个性化图标"能力 (此前只有 MSO_SHAPE + unicode 字形,业务概念图标缺位)。
- SKILL.md: 红色主题改硬约束 + ⛔ BLOCKING 八条对齐 (bundled 推荐, 等用户拍板),
封面/尾页改强制项, 不算在 5-8 页正文预算内
- layouts.md: 加 apply_brand(slide, kind) 4 模式品牌条 (cover/inner/section/end),
9 个版式起手必调, 消灭裸白页
- 图标库: 新增 fetch_icon.py 走 Iconify CDN (tabler/lucide/heroicons 等 150+ 集),
主题色染色, 缓存到 assets/icons/, 配 INDEX.md 推荐清单
- icons.md: 移除 MSO_SHAPE 当业务图标的部分 (PENTAGON/LIGHTNING_BOLT 等视觉陈旧),
三层降级 → 两层 (Iconify / unicode 兜底); MSO_SHAPE 退为 layouts.md helper 内部原语
- canvas_presets.md 并入 design_principles.md §0 (减少零碎文件)
- .gitignore: spec_lock.md 与根目录 *.pptx 不入库 (PPT skill 工作产物)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-06 12:23:06 +08:00
caoqianming
3a66849953
Initial import: zcbot personal task agent
...
DESIGN.md / PROGRESS.md 落地 Phase 1-3:
- core/: LiteLLM 封装 + ReAct loop + 会话持久化 + Anthropic skill registry
- tools/: read/write/edit/glob/grep/shell/run_python/load_skill (Hybrid 范式)
- skills/coding | proposal: WHY+WHAT 风格 SKILL.md
- skills/ppt: 完整渐进披露 (SKILL + 4 references + 3 scripts)
· 借鉴 hugohe3/ppt-master 的两阶段 + spec lock 思路
· MSO_SHAPE 图标体系 + 安全区 + 越界检测
· 默认商务红主题 (#C00000 / #E15554 / #FFC107)
- config/models/: DeepSeek V4 flash/pro 档案
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-06 11:02:59 +08:00