caoqianming
|
336db63a01
|
feat(rendering): 平台渲染层 rendering/ 统一三 skill docx + chromium md→pdf + bump 0.21.0
渲染从「各 skill 自带 render_docx.py」抽成平台能力:新建顶层 rendering/ 包,
bind-mount 进 /sandbox/rendering,各 skill 调 render.py 不再 bundle 渲染脚本
(符合 Skills 自包含/可 fork 标准,跨 skill import 会破坏 fork 故不走 skills/_shared)。
- common.py 叶子原语单一事实源(化学式白名单 CHEM_RE 原先三份逐字重复→收敛一处)
- docx_manuscript.py paper/proposal 配置化双 profile;docx_brief.py brief 富渲染复用 common
- pdf.py md→HTML→沙盒 chromium --print-to-pdf(不用 weasyprint:要 pango/cairo 原生库且不在镜像)
- render.py 统一 CLI --profile {brief,paper,proposal} --format {docx,pdf}
零回归:三 profile 重构前后 docx 解包 diff word/document.xml 字节完全一致。
守护测试 tests/test_rendering.py 5 项全过。chromium 冒烟 deploy/sandbox/probe_chromium_pdf.sh。
删 3 份 render_docx.py + 短命 skills/_shared/render_pdf.py;改 5 个 SKILL.md 调用到
render.py + 补反模式"渲染一律调 render.py、禁止手搓 weasyprint/pip 装包";brief 另删
research 索引滞后描述。requirements 加 markdown,pool.py 加 rendering 挂载。
部署须一次原子激活:/sandbox/rendering 挂载靠 pool.py(restart 重建容器生效)+
markdown 进镜像靠 requirements 触发整体重建——update.sh build→restart 顺序覆盖,
旧 render_docx 路径已删,勿只推代码不重建。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-06-23 13:07:19 +08:00 |
caoqianming
|
4f61b5fc56
|
feat(skill): brief 科研方向简报(三路检索 documents/research/web)+ 全局化学式下标修复 + bump 0.18.0
新增 brief skill:给定研究方向 + 时间窗,用三路真实数据(documents 内部库取全文 /
research 取近期 DOI 元数据 / web 取政策·会议·标准动向)产出文献计量趋势型简报。
六阶段:定题对齐 spec → 三路检索取数(中→英术语 + 跨源去重)→ 趋势分析(3-7 热点簇)
→ 逐段起草 → 引文核验(复用 paper 三层协议)→ 渲染验收。深度三档 flash/standard/deep。
自带 render_docx.py(简报专属版式):商务红主题 + 正文 [n]/[Wn] 引文上标并锚到文末
+ DOI/URL 可点击超链接 + TL;DR 卡片 + 标题信息带 + 页脚页码。
顺带修 zcbot 全局「角标」问题:水泥化学式在 docx 里平排数字(CO2/C3S/SO3...)是
paper/proposal 渲染器的老毛病。抽一份化学式下标白名单(长在前 + \b 防误伤
LC3/C595/Ca2+/2026,实测命中精确零误伤)统一补进 paper、proposal、brief 三个
render_docx.py 的 add_inline plain 分支(按"自包含 skill 脚本不跨 skill 引"的既有约定
各自复制同一份)。core/export_docx.py 是对话原文转录、非排版文档,不动。
文件:skills/brief/{SKILL.md, templates/{spec,brief_outline}.md,
references/{search_strategy,citation_verify}.md, scripts/{quality_check,render_docx}.py};
SKILL_LIST.md(16→17)+ PROGRESS.md 同步。bump 0.17.0 → 0.18.0。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-06-18 11:28:03 +08:00 |
caoqianming
|
8616ba2b56
|
Add task progress tool
|
2026-06-08 08:44:16 +08:00 |
caoqianming
|
7b09c77f76
|
fix(sandbox): docker 下 system prompt / SKILL 文档统一用容器路径
docker backend 下 shell/run_python/fs 工具全在容器里跑(<workspace>/users/<uid>
bind 到 /workspace),但喂给 LLM 的路径多处仍是宿主绝对路径(容器内不存在),
agent 据此 find 全空、瞎转到 pwd 才发现真身在 /workspace/<wd>。
- core/agent_builder.py::_build_system_prompt:docker 下 task_dir + 「宪法」
glob 范例换成容器路径 /workspace/<wd>,去掉容器里无意义的 cwd 行(cwd 恒等
task_dir);host 不变。修法同 LoadSkillTool 的 container_skills_dir 改写。
- skills 文档同类宿主路径残留清扫:patent 跨 skill 调 proposal 脚本由
<repo_root>/...(硬编码 D:/projects/zcbot)改兄弟相对 <skill_dir>/../proposal/...;
research fetch_pdf 范例硬编码 D:/... 改 <task_dir> 占位;patent/proposal/ppt
的 <task_dir> 举例的废弃旧布局 workspace/tasks/<task_id> 改 host/docker 双形态说明。
- ppt 图标缓存写进只读挂载修复(方案 A):种子图标库 <skill_dir>/assets/icons/
降为只读(glob 读),fetch_icon.py 新拉图标一律 -o <task_dir>/assets/icons/,
读路径改种子库 + 本 task 两处都 glob。docker 下 skills 是 :ro bind,旧写法必败;
host 下还顺带污染仓库工作树。脚本已 out.parent.mkdir,无需改。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-06-03 16:33:59 +08:00 |
caoqianming
|
d93cc1a949
|
Stage C Step 3 hotfix: exec_user 跟随 build_arg + 镜像装 mermaid-cli
Ubuntu dogfood 暴露两个真问题:
(1) uid 错配:DockerExecutor 写死 --user 1000:1000,但镜像 build 时
--build-arg HOST_UID=$(id -u) 跟随 host 实际 uid(腾讯云轻量 lighthouse
uid=1001),docker exec 进容器 uid=1000 → bind mount owner 1001 错配 →
写 /workspace/<wd>/ 全 EACCES,文件落 /tmp。
改 DEFAULT_EXEC_USER = "zcbot"(username,docker 自动查容器 /etc/passwd
拿 uid),无论 HOST_UID build 成 1000/1001/其他都跟 bind mount owner 对齐。
(2) proposal/patent skill 渲 mermaid 缺 Node:render_diagrams.py 调
shutil.which("mmdc") 容器没装 → 退 mermaid.ink → sandbox --internal
默 deny outbound API 也不通 → ASCII fallback 出 docx 没图。
Dockerfile 加 chromium + nodejs + npm + @mermaid-js/mermaid-cli,
+~400MB 接受成本(ASCII 不能用)。容器 chromium 缺 setuid sandbox +
/dev/shm 不够大会跪,镜像落 /sandbox/puppeteer-config.json
(--no-sandbox --disable-setuid-sandbox --disable-dev-shm-usage) +
ENV MERMAID_PUPPETEER_CONFIG;render_via_mmdc 改读 env 拼 -p 注入,
host 上跑 env 没设行为零变化。
PUPPETEER_SKIP_DOWNLOAD + PUPPETEER_EXECUTABLE_PATH 让 puppeteer 用
容器内 chromium 不下载自带 Chrome(省 ~300MB)。
NPM_REGISTRY build-arg 同 pip 同款(腾讯云内网 / 阿里 npmmirror)。
RUN.md 加 NPM_REGISTRY 段 + 故障兜底 3 行(EACCES uid 错配 / mmdc 报
launch chromium / npm 慢)。DESIGN 不动(纯 bug fix + skill 依赖)。
unittest discover 31/31 PASS。
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
2026-05-26 21:47:33 +08:00 |
caoqianming
|
d6af9a59fe
|
新增 patent skill + REVISIONS.md 修订日志机制
patent skill 写中国发明专利技术交底书,五阶段 workflow (素材摄取 → 挖点 → 检索 → spec → 逐章起草 → 自查渲染),BLOCKING 节奏同 proposal/ppt。复用 markitdown CLI + proposal scripts (render_diagrams/render_docx) + web_search/web_fetch + documents/research skill,零新增脚本;不实现 CNIPA 爬虫(维护成本高)。
REVISIONS.md 作为产物迭代 changelog,覆盖 proposal/patent/ppt 三个产物型 skill — spec = 宪法定调,REVISIONS = 每次卡点累加;单行 bullet 倒序追加,何时记/何时不记按 skill 领域定制(技术路线/区别特征/版式)。
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
2026-05-26 09:34:01 +08:00 |
caoqianming
|
c4fac2428b
|
skills+core(命名约定): task 级宪法文件 <date>-<short_id>-<name>.spec.md + spec_lock → spec 简化
同 working_dir 多 task 共享中间产物是设计意图(素材跨本子复用),
但 spec 这种 task 1:1 宪法文件必须隔离 — 否则两本子 spec 直接撞。
文件名三段式:
- task_short_id (task_id.hex[:8],永不变) 主锚 → glob *-<short_id>-*.spec.md 字典序最大 = current
- date 让"重定调"写新文件而非 edit 覆盖,旧版自然成历史快照
- task_name 作建时元数据,改 task.name 不 cascade(由 short_id 兜底定位)
约定由 core/agent_builder.py::_build_system_prompt 单点注入
(task_id / today 实际值嵌入,所有 skill SKILL.md 引用同一份)。
proposal / ppt SKILL.md 阶段一加"glob 检测已有 spec → 询问沿用/重定调"分支。
模板 templates/spec_lock.md → spec.md (git mv 保历史),_lock 后缀无信息量去掉。
未动:DB schema / PATCH /v1/tasks/{id} 改 name 入口 / 其他中间产物扁平共享
/ quality_check.py (--spec 接路径)。反方案(cascade rename / spec 入 PG /
物理 task 子目录)及"何时升级到 DB 化"信号见 DESIGN §7.9。
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
2026-05-20 14:03:21 +08:00 |
caoqianming
|
fafcb14d86
|
skill(proposal): mermaid 文件名 hash→caption + quality_check 加图相关 4 拦截 + SKILL.md 精简; web cache fix
用户报"图没渲染到 docx",诊断后修三件事(同一根因链):
- web/app.py /v1/files/download 加 Cache-Control: no-cache
Starlette FileResponse 只发 ETag/Last-Modified, 浏览器走启发式缓存,
workspace 文件改了 SPA 预览看不到新版
- quality_check 新 check_figures(): 4 条规则
1) figures/ 有 png 但 sections 0 个 ![]() 引用
2) fenced 代码块出现 box-drawing 字符 (┌─┐│└─┘ 等)
3) mermaid 块必须有首行 %% caption: <题>
4) 同 task 内 mermaid caption 不能撞名
- render_diagrams.py: hash → caption 命名
pass-1 验证 caption 完整 + 全 task 唯一, 缺/撞 退 2
pass-2 渲染落 fig_<sanitized>.png, 总是覆盖
- render_docx.py: mermaid 块按 caption 查 fig_<caption>.png
无 caption / 清洗空 / png 缺 → ASCII fallback
- SKILL.md ~193 → ~160 行:
插图段 49→22 行(压 matplotlib 细节 + 删类型选择展开)
反模式合并 ASCII/占位/手写图编号/缺 caption/撞名
删"为什么两段式"长说理段
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
2026-05-19 10:19:09 +08:00 |
caoqianming
|
d6fc004367
|
skill(proposal): mermaid 管线 + render_docx 图片插入 + 图题自动编号
新增 render_diagrams.py 把 ```mermaid``` 块预渲染到 figures/fig_<sha1>.png
(优先本地 mmdc, 回退 mermaid.ink 公网 API, 都失败留 WARN 不阻塞);
render_docx.py 加  识别 + mermaid 缓存查找, 缺缓存自动 ASCII fallback,
图题"图 N <caption>"全局自增, 替换原模板里的 [图 2-2 ...] 裸占位写法。
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
2026-05-18 21:37:16 +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
|
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
|
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
|
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
|
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
|
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
|
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
|
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 |