promptfigure 0.3.0 → 0.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,45 @@
1
+ # 安装这个技能(AI Agent Skill)
2
+
3
+ > **版本 1.6.11**(2026-09-24)。下载页:https://promptfigure.top/skill 。查最新版:`curl -s https://promptfigure.top/downloads/promptfigure-api.version.json`;本地已装版本看 `SKILL.md` frontmatter 的 `version`。版本语义:主版本=接口不兼容改动(需重读 SKILL.md),次版本=新增能力,修订号=勘误。
4
+
5
+ 把 `promptfigure-api/` 整个文件夹放进你的 AI 工具的技能目录即可:
6
+
7
+ | 工具 | 技能目录(复制到此处) |
8
+ |---|---|
9
+ | Claude Code | `~/.claude/skills/promptfigure-api/` |
10
+ | Claude Desktop(Agent Skills) | 设置 → Skills → 导入本 zip,或放 `~/.claude/skills/` |
11
+ | WorkBuddy / OpenClaw | `~/.workbuddy/skills/promptfigure-api/` |
12
+ | Codex / Cursor / Cline 等任意 Agent | 无技能目录的,把 `SKILL.md` 内容追加到 `AGENTS.md` / `CLAUDE.md` / 规则文件末尾 |
13
+
14
+ 安装后对 AI 说「帮我用 promptFigure 画一张 XXX 图」,它会自动读取 `SKILL.md` 并按流程执行:
15
+ 注册/登录 → 拿 key(或复用你已有的 `PROMPTFIGURE_KEY`)→ 调 API 出图。
16
+
17
+ ## 本包还附带本地插件(plugin/)
18
+
19
+ 一个 zip 两样东西:根目录的 `SKILL.md` 是纯 REST 技能(上面的装法即用);
20
+ `plugin/` 是本地插件(`pf` CLI + promptfigure-local skill + 托盘)。想要「文档只读预览 /
21
+ 锚点定位 / GUI 审批 / 本地规则层 / 矢量导出」这些本机能力时再装它:
22
+
23
+ ```bash
24
+ cd plugin && npm install && npm link # 之后 pf 命令全局可用
25
+ ```
26
+
27
+ 详见 [PLUGIN.md](PLUGIN.md);纯 REST 用户完全不用碰 plugin/。
28
+
29
+ ## 需要准备
30
+
31
+ - 一个账号:https://promptfigure.top 注册(邮箱 + 密码 ≥8 位,无需邮箱验证)
32
+ - 余额:控制台充值($1 起整数,每满 $50 赠 $1);API 按次计费 standard $0.02 / premium $0.15
33
+ - API key:控制台「API 密钥」创建,`pf_` 开头明文只显示一次
34
+
35
+ ## 保持最新
36
+
37
+ 技能会过期。程序化查最新版本(不用下载整个包):
38
+
39
+ ```bash
40
+ curl -s https://promptfigure.top/downloads/promptfigure-api.version.json
41
+ ```
42
+
43
+ 本地 `version` 低于线上 `version` → 到下载页取最新包:https://promptfigure.top/skill
44
+ (直链:https://promptfigure.top/downloads/promptfigure-api.zip ,或 GitHub Release 资产 promptfigure-api-1.6.11.zip)
45
+ 安装说明与 API 文档:https://promptfigure.top/docs/zh-CN/api
@@ -1,10 +1,10 @@
1
1
  ---
2
2
  name: promptfigure-api
3
3
  description: 用 promptFigure 生成科研/学术配图(流程图、机制图、管线图、技术路线图、图形摘要),以及优化已有图表、整文批量升级(数据图本地重绘 + 示意图 AI 重构 + 可编辑矢量版 + 追溯台账)。当用户要「画一张图」「生成论文配图/示意图/机制图/graphical abstract」「把论文里的图变好看/变高级」「批量优化整篇文章的图」「要可编辑的矢量图/PPT 版」、给了 PDF/WPS/Word 文稿要配图或要主动建议插图位、或要配置 promptFigure API key、或要用 REST 接口批量出图时使用。走 https://promptfigure.top 的 /api/v1/generate,Bearer pf_ key 鉴权,返回 base64 PNG。强制学术字体规范(图内无衬线、禁手写/花体)与上下文蒸馏规则(原文段落绝不直接进 prompt,先蒸馏成实体/结构/图种三清单再组装)。网页端有多轮问询/二次确认,API 端一次性提交——所以要把用户绘图意图一次说清楚,服务端负责润色成完整示意。
4
- version: 1.6.8
4
+ version: 1.6.11
5
5
  license: MIT
6
6
  metadata:
7
- version: "1.6.8"
7
+ version: "1.6.11"
8
8
  author: promptFigure (zhangmask)
9
9
  homepage: https://promptfigure.top
10
10
  repository: https://github.com/zhangmask/promptfigure-skill
@@ -22,7 +22,7 @@ metadata:
22
22
  **整个流程里唯一花钱的动作是 API 调用**。所有迭代都在本地免费环节完成:
23
23
 
24
24
  ```
25
- 阶段 0 意图确认(对用户)→ 阶段 1 写提示词 → 阶段 2 提示词审核 → 阶段 3 API 出图 → 阶段 4 成图审核 → 阶段 5 可编辑矢量版(可选,交付后必问用户)
25
+ 阶段 0 意图确认(对用户)→ 阶段 1 写提示词 → 阶段 2 提示词审核 → 阶段 3 API 出图 → 阶段 4 成图审核 → 阶段 6 每轮交付与台账(每轮结束必交)→ 阶段 5 可编辑矢量版(可选,最终成稿时必问用户)
26
26
  ↑__________ 打回/不满意只回到这里改 prompt,免费 __________↑
27
27
  ```
28
28
 
@@ -44,18 +44,34 @@ metadata:
44
44
  1. 🔴 **比赛 / 数学建模 / 学术会议竞赛**:默认建议**不做**,以速度为准——这些场景交 PNG 就够,矢量版是时间黑洞,别为它赌提交时限
45
45
  2. **时间充裕**(用户明确表示不赶、或场景是期刊/课设/长期维护的图):做。全部用**用户本地的工具或代码**完成,不调用 promptFigure API、不消耗任何额度
46
46
 
47
- **做法(三条红线 + 一条推荐路)**:
47
+ **做法(两条红线 + 一条首选路 + 一条退路)**:
48
48
 
49
- - 🔴 **禁止描摹矢量**:vtracer / potrace /「位图转 SVG 路径」之类一律不用——描摹出来的文字全是路径,不可编辑、不可搜索,越改越错。描摹矢量和「可编辑矢量」是两种东西,别拿描摹滥竽充数
50
- - 🔴 **必须是可编辑矢量**:每个元素是独立对象——PPT 形状、独立 SVG 元素/分组、Illustrator 图层都行。验收标准一句话:**用户能改,你的(宿主 AI)也能改**——后续微调是改对象属性,不是重画
51
- - 🔴 **文字保持文本**:标签必须是可编辑文本(无衬线,遵循图内字体规范),不许转路径
52
- - **推荐路**:拿最终确认版图,用本地代码/工具**照着画一遍**——如 python-pptx 生成形状化 PPTX、或写结构化 SVG(每个模块/箭头/标签一个元素),画完与确认版逐项比对、不一致就改,迭代到一致为止。参考做法:<https://github.com/icebird1998/scientific-illustifier>(宿主自行阅读,按本机工具链取舍)
53
- - 宿主没有本地矢量工具链(没有 python-pptx / 没有矢量软件 / 跑不动)时:**明示用户「做不了可编辑矢量版」**,交付确认版 PNG 收尾——仍然不许用描摹顶替
49
+ - 🔴 **必须是可编辑矢量**:每个元素是独立对象——PPT 形状、独立 SVG 元素/分组、Illustrator/Inkscape 图层都行。验收标准一句话:**用户能改,你的(宿主 AI)也能改**——后续微调是改对象属性,不是重画
50
+ - 🔴 **编辑必须用图层分离的工具**:在 PPT/WPS/Illustrator/Inkscape 里按「图层/组合」组织——每个模块、箭头、标签各自独立成层(PPT 用单独形状或组合、SVG 用 `<g>` 分组、位图软件用独立图层),禁止把所有元素糊成一个扁平对象或直接在扁平层上改像素
51
+ - **首选路——比照着重绘**:拿最终确认版图,用本地代码/工具**照着画一遍**——如 python-pptx 生成形状化 PPTX、或写结构化 SVG(每个模块/箭头/标签一个元素),画完与确认版逐项比对、不一致就改,迭代到一致为止。参考做法:<https://github.com/icebird1998/scientific-illustifier>(宿主自行阅读,按本机工具链取舍)
52
+ - **退路——描摹**:本机没有可编程矢量工具链、或时间紧时,可以用 vtracer 等把最终版描摹成矢量(`pf export svg` 即此路)。但必须**先核对再交付**:① 数值/标签与最终版一致(数据图数值差不多即可,但刻度对应关系要对);② 比例、模块对应关系正确;③ 交付时明确告知「描摹产物,文字已变为路径、不可直接编辑,改内容需回到重绘或重出图」——不许把描摹件当「可编辑矢量」宣称
53
+ - 宿主连描摹工具都没有时:**明示用户「做不了矢量版」**,交付确认版 PNG 收尾
54
54
 
55
55
  **交付物**:矢量文件 + 一句「哪些元素可以直接改」(如「每个方框、箭头、文字都是独立形状,可拖动/改字/改色」);`pf-ledger.md` 补一行,标注本地生成、零 API 消耗。
56
56
 
57
57
  ---
58
58
 
59
+ ## 🔴 阶段 6:每轮交付与台账(每轮结束必交,用户随时可查)
60
+
61
+ 每次出图 / 优化 / 批处理结束,在用户工作目录建 `promptfigure-out/`,**每轮交付一个新版本文件夹**(v1 → v2 → v3…),协议全文见 `references/deliverables-ledger.md`,五条硬性要求:
62
+
63
+ 1. **本轮清单**:round-vN.md 列出本轮每张图——图种 / 档位 / 版本 / 本机真实路径 / 插入位置
64
+ 2. **插入位置(两段边界)**:每张图标出插在原文哪两段之间——**上一段最后一句 + 「……」 + 下一段第一句**,用户一眼定位
65
+ 3. **上下文与引用**:用了哪几段明确到 §¶;上下文只放**首句 + 「……」 + 尾句**;用了本地表格/数据/代码文件一律给**引用链接不内联内容**
66
+ 4. **图片版本**:文件名带 `-vN`,旧版永不覆盖,随时可回溯对比
67
+ 5. **两份演进文档**:`paper-with-figures.md`(原文结构 + 已插图,无关段落省略,每次更新同一个)与 `final/paper-final.md`(最终论文版本,附按用户文档格式的可打开副本:Word→docx、LaTeX→tex、WPS→docx)
68
+
69
+ **最终成稿流程**(用户说「定稿」时):先提醒核对数据是否更新 → 用户确认后才 premium 定稿 → 定稿后必问矢量图(提醒:本地 AI 重绘、token 贵、速度慢,比赛/数模默认不做;确认做则按元素分层重绘成可编辑矢量,应用按用户偏好)。
70
+
71
+ 🔴 **CLI 优先**:全程走 `pf`(或 REST 直连)沉淀状态,GUI 只留给人看图和点审批——插件的门禁与留痕都挂在 CLI 上。
72
+
73
+ ---
74
+
59
75
  ## 🔴 草稿策略:低文字密度 + 科研风格基线(2026-09-25 实测定规)
60
76
 
61
77
  standard 档的乱码率随**卡面文字量**上升:实测说明性小字是乱码重灾区
@@ -270,5 +286,6 @@ curl -s https://promptfigure.top/downloads/promptfigure-api.version.json
270
286
  | `references/api-contract.md` | 完整契约、网页工作流 4 步、多语言示例、批处理、WAF |
271
287
  | `references/troubleshooting.md` | 润色失败、WAF 403、balance 滞后、出图质量差 |
272
288
  | `references/document-workflow.md` | 用户给了 `.tex` / `.docx` / `.md` 文稿要配图:怎么定位插图位、从上下文写 prompt、插回文档;LaTeX 编译环境探测与官方下载指引(MiKTeX/TeX Live/TinyTeX/Tectonic/Overleaf) |
289
+ | `references/deliverables-ledger.md` | **每轮交付**:round-vN.md 清单/插入位置/上下文引用、paper-with-figures.md 演进版、final/ 最终论文版本与格式副本、最终成稿流程 |
273
290
  | `references/figure-upgrade-workflow.md` | 用户要**优化已有图表**或**整文批量升级**:结果图数据溯源+本地重绘、示意图 AI 升级、结构组合、单图精修/整文批处理两种模式、figure-ledger.json 追溯台账 |
274
291
  | `references/proactive-upgrade.md` | 用户给的是 **PDF/WPS**(非 LaTeX)、说不出哪里插图要你**主动建议**、要从**原始数据**推演配图、或想参考顶会/SCI 论文的图学风格:PDF 解析、MCM 插图位惯例、四步管线(分析→推演→提示词→迭代)、refs/ 风格库与合规红线 |
@@ -0,0 +1,119 @@
1
+ # 每轮交付与台账(round deliverables & ledger)
2
+
3
+ > 场景:每次用 promptFigure 出图 / 优化图片 / 整文批处理结束后,宿主 AI 必须按本文件产出结构化交付。
4
+ > 目的:用户随时能回答三个问题——**这轮做了什么图、图插在原文哪里、用了什么上下文/数据**。
5
+ > 🔴 本文件是硬性协议:缺任何一项 = 交付不完整。CLI 优先——全程用 `pf` 命令沉淀状态,GUI 只留给人「看一眼 / 点审批」。
6
+
7
+ ---
8
+
9
+ ## 0. CLI 优先原则(2026-09-25 定规)
10
+
11
+ - 出图、核验、审批、定稿全链路都有 CLI:`pf open → craft → render → qa → review resolve → premium`,**能用 CLI 就用 CLI**
12
+ - GUI 只用于两件事:人亲眼看图、人点审批。插件的门禁与留痕都挂在 CLI 上,走 CLI 的每一步都可审计
13
+ - 每轮结束的交付目录里,路径一律引用**用户本机真实路径**(相对当前交付目录优先,跨目录用绝对路径),禁止只给「见图库」这类指不到文件的话
14
+
15
+ ---
16
+
17
+ ## 1. 交付目录结构(每一轮 = 一个新文件夹)
18
+
19
+ 在**用户当前工作目录**(论文旁边)建 `promptfigure-out/`,每轮交付新建递增版本文件夹:
20
+
21
+ ```
22
+ promptfigure-out/
23
+ ├── v1/ ← 第 1 轮交付(每次交付新建一个,v1 → v2 → v3…)
24
+ │ ├── round-v1.md ← 本轮反馈(见 §2 必含项)
25
+ │ └── figures/ ← 本轮产出的图(文件名带版本号)
26
+ │ ├── fig-method-v1.png
27
+ │ └── fig-method-v2.png ← 改版后重新出,旧版保留可回溯
28
+ ├── v2/round-v2.md ← 第 2 轮……
29
+ ├── paper-with-figures.md ← 不断演进的「论文 + 已插图」版(见 §3)
30
+ └── final/ ← 最终论文版本(见 §4,仅最终成稿时建)
31
+ ├── paper-final.md
32
+ └── paper-final.docx ← 格式副本,按用户原文档格式(见 §4)
33
+ ```
34
+
35
+ - 版本号判断:`ls promptfigure-out/` 取最大 N + 1;用户已有自己的目录约定时听用户的
36
+ - `figures/` 里的图**永不覆盖**:同一张图的每个版本都是独立文件(`-v1/-v2/…`),旧版要能随时打开对比
37
+
38
+ ---
39
+
40
+ ## 2. round-vN.md 必含项(本轮反馈)
41
+
42
+ 模板(每轮照此填,没有的项目写「无」并说明原因,禁止静默省略):
43
+
44
+ ```markdown
45
+ # 第 N 轮交付 · YYYY-MM-DD HH:mm
46
+
47
+ ## 本轮清单
48
+ | # | 图 | 图种 | 档位 | 版本 | 本机路径 | 插入位置(§¶) | 状态 |
49
+ |---|---|---|---|---|---|---|---|
50
+ | 1 | 方法流程图 | pipeline | premium | v2 | figures/fig-method-v2.png | §2 ¶1 ↔ §2 ¶2 之间 | 已审批 |
51
+
52
+ ## 插入位置(图放在原文哪两段之间)
53
+ 逐张图给出——**上一段最后一句 + 「……」 + 下一段第一句**,让用户一眼定位:
54
+
55
+ > ……la optimización por enjambre de partículas ajusta automáticamente los principales parámetros.……La estrategia de aumento de datos incluye recorte aleatorio, jitter de color y deformación elástica.
56
+ > (图 1 插在上述两句之间,即 §2 ¶1 末 ↔ §2 ¶2 首)
57
+
58
+ - 自然段为粒度(¶),不用句号硬切;原文没有下一段时注明「§2 段末,文末」
59
+
60
+ ## 所用上下文(只放首尾句,中间省略)
61
+ - 原文上下文:「首句……尾句」(禁止整段贴入;用了哪几段就列哪几条,§¶ 标清楚)
62
+ - 引用范围声明:本次生成具体使用了 §2 ¶1–¶2(明确到段,供用户核对)
63
+
64
+ ## 数据与引用
65
+ - 本地表格/数据文件:[table1.csv](../data/table1.csv)、[run_exp2.m](../code/run_exp2.m) —— **只给引用链接,不内联内容**
66
+ - 参考图:refDataUrl(本地图 /path/to/ref.png)或 refUrl(https://…);用了就标,没用写「无」
67
+
68
+ ## 优化前 → 优化后(仅「优化已有图」任务)
69
+ | 图 | 优化前 | 优化后 | 改了什么 | 所用上下文(首尾句) |
70
+ |---|---|---|---|---|
71
+ | 原图1(曲线组) | figures/orig/fig1-old.png | figures/fig1-v1.png | 色板改语义化、字号 8pt、去 3D | 「首句……尾句」 |
72
+ ```
73
+
74
+ **三条填写铁律**:
75
+ 1. **上下文只放首句 + 尾句,中间一律省略号**——整段进 MD 会让用户无法快速审阅,也让版本 diff 爆炸
76
+ 2. **表格 / 代码 / 数据文件一律引用链接,禁止内联内容**——内联会让 MD 迅速腐烂、版本更新时无法对账;要「看见这轮用了什么」,点链接就是
77
+ 3. **每张图必须看得到版本**(文件名 `-vN` + 清单里的版本列 + 状态列)——版本是回溯和 diff 的唯一坐标
78
+
79
+ ---
80
+
81
+ ## 3. paper-with-figures.md(不断演进的呈现版)
82
+
83
+ - 结构 = 用户原文的章节树;**本轮涉及的段落**照录,**不涉及的段落**一律省略为一行:`……(§3 全文见原文)`
84
+ - 每张图插在自己的插入位置(§2 ¶1 ↔ ¶2 之间),图片用相对路径引用 vN 文件夹里的真实文件
85
+ - 每次交付**更新同一个文件**(或在文件名带版本 `paper-with-figures.vN.md` 保留历史)——用户随时打开这一个文件就能看到「论文现在长什么样」
86
+
87
+ ---
88
+
89
+ ## 4. final/ 最终论文版本
90
+
91
+ 用户要求「最终成稿 / 定稿」时才建,包含:
92
+
93
+ 1. `final/paper-final.md`——最终呈现版(全部已审批图就位、引用与上下文清单汇总)
94
+ 2. `final/paper-final.<用户格式>`——**格式副本,按用户原文档格式来**:
95
+ - Word/.docx → 交付 .docx(有 pandoc/docx 工具就用;无工具要明说「做不了格式副本,交付 MD」)
96
+ - LaTeX/.tex → 交付 .tex(图用 `\includegraphics` 引用真实路径,结构可编译)
97
+ - WPS → 交付 .docx(WPS 可直接打开)
98
+ - 🔴 **副本必须能正常打开**:交付前自己验证(文件非零、结构完整、能找到图);验证不了就明说,禁止交一个打不开的坏副本
99
+
100
+ ---
101
+
102
+ ## 5. 最终成稿流程(用户说「定稿 / 最终版」时按此走)
103
+
104
+ 1. **先提醒核对**:提醒用户「数据有没有更新?要不要重新跑一次核验?」——用户明确确认后,才进入 premium 最终定稿
105
+ 2. **确认高级定稿**:向用户复述「将消耗 premium 档额度出高清定稿,N 张」并取得确认;未确认不动手
106
+ 3. **定稿后问矢量图**(衔接 SKILL.md 阶段 5):
107
+ - 提醒成本:矢量图由**用户自己的 AI 本地重绘**,token 消耗大、速度慢
108
+ - 🔴 **比赛 / 数学建模 / 学术会议竞赛:默认不做**,速度优先;只有时间充裕才做
109
+ 4. **用户确认做矢量图时**:首选**比照着重绘**——拿最终版用本地工具照着画,每个模块、箭头、标签独立成对象;🔴 **必须用支持图层分离的工具编辑**:PPT/WPS 用单独形状或组合、SVG 用 `<g>` 分组、Illustrator/Inkscape 用独立图层——一把糊成扁平对象 = 不可编辑,返工。应用按用户主要偏好来(PPT / WPS / 其他)。**退路=描摹**(vtracer 等):先核对数值与比例(数值差不多即可、对应关系必须对),交付时明确告知「描摹件、文字已变路径不可直接编辑」——不许当可编辑矢量宣称
110
+
111
+ ---
112
+
113
+ ## 6. 自检清单(每轮交付前过一遍)
114
+
115
+ - [ ] 版本文件夹新建(vN 递增)、图带版本号、旧版未覆盖
116
+ - [ ] round-vN.md 五项齐:清单 / 插入位置(两段边界句)/ 上下文(首尾句)/ 数据引用(链接)/ 优化前后(如适用)
117
+ - [ ] paper-with-figures.md 已更新到含本轮所有图
118
+ - [ ] 路径全部指得到真实文件(md 里的链接点得开)
119
+ - [ ] final/ 仅在最终成稿时出现,格式副本已验证可打开
@@ -10,14 +10,16 @@
10
10
 
11
11
  | 需求 | 判据 | 路线 |
12
12
  |---|---|---|
13
- | **A1. 结果图美化**(曲线/柱状/热图/箱线…) | 图上带**精确数值**(刻度、柱高、数据点) | 🔴 **绝不走 AI 生图**。数据溯源 + 本地重绘(§3)——AI 画图模型必画错数字,坐标必须是真数据 |
13
+ | **A1. 结果图美化**(曲线/柱状/热图/箱线…) | 图上带**精确数值**(刻度、柱高、数据点) | 照最终结果重绘(§3):以我们最终给出的成图为基准重绘——期刊图大多也不是 MATLAB 原生生成的;**验收 = 数值与基准一致(差不多即可)+ 比例/对应关系正确**。能拿到原始数据就优先溯源(更稳),拿不到就以最终版成图逐点核对 |
14
14
  | **A2. 示意图升级**(用户已画的结构/流程/机制图,嫌丑) | 图上只有方块、箭头、标签,无数值 | AI 升级:结构照搬 + 视觉升级指令(§4.2),可选参考图 |
15
15
  | **A3. 结构组合**(多张小图合并成一张大图) | 多张 A1 或 A2 要拼版 | A1 部分本地 matplotlib subplot 拼版;A2 部分合并成一个多 panel prompt(§4.1) |
16
16
  | **B. 代码画不出的图**(流程图/机制图/神经网络图/算法示意) | 用户只能嘴上说 | promptFigure API(§4),本技能的主场 |
17
17
 
18
18
  **一句话分流:数字支撑 → 本地画;结构故事 → API 画;一张图里混着两者 → 拆开,各走各的,最后拼版。**
19
19
 
20
- > 🔴 **「把终稿变成可编辑矢量/PPT 版」不属于以上任何一类**——那不是 matplotlib 的活,也不是出图 API 的活。走 `SKILL.md` **阶段 5**:终稿交付后先问用户要不要,比赛/数模默认不做(速度优先),时间充裕才由**宿主 AI 用本地的矢量工具/代码照着重绘**(禁止描摹,必须每个元素可编辑)。§3 的 matplotlib 只负责 A1 数据图的真数据重绘(防数字造假),不碰任何矢量转换。
20
+ > 🔴 **每轮结束必须交付台账**:新建 `promptfigure-out/vN/round-vN.md`——本轮清单(图种/档位/版本/本机路径/插入位置)、每张图的插入位置(上段末句 + …… + 下段首句)、所用上下文(只放首尾句)、数据文件只给引用链接;「优化前 → 优化后」对比也落在这里。全文协议见 `deliverables-ledger.md`。
21
+
22
+ > 🔴 **「把终稿变成可编辑矢量/PPT 版」不属于以上任何一类**——走 `SKILL.md` **阶段 5**:终稿交付后先问用户要不要,比赛/数模默认不做(速度优先),时间充裕才做。**首选**宿主 AI 比照最终版用本地工具重绘(每元素独立对象、用图层分离工具编辑);**退路**可描摹,但须先核对数值/比例并告知「描摹件文字不可编辑」。§3 的本地重绘 = 数据图的美化路径,不碰矢量转换。
21
23
 
22
24
  ---
23
25
 
@@ -79,9 +81,14 @@ SKILL.md 的「零反问」铁律**约束的是对 API 的出图过程**——
79
81
 
80
82
  ---
81
83
 
82
- ## 3. 代码图数据溯源(A1 类的唯一正路)
84
+ ## 3. 数据图美化(照最终结果重绘)
83
85
 
84
- > 本节 = **A1 数据图专用**(曲线/柱状/热图等带真数值的图)。用 matplotlib 的唯一理由是「坐标必须是真数据」;它不是通用美化手段,更不是矢量转换手段——「照终稿做可编辑矢量版」见 `SKILL.md` 阶段 5。
86
+ > 本节 = **A1 数据图专用**(曲线/柱状/热图等带真数值的图)。2026-09-25 松口(原规则太死):
87
+ > **数据图照我们最终给出的成图重绘即可**——期刊图大多也不是 MATLAB 原生生成的,只要
88
+ > **① 数值与最终版一致(差不多即可)② 比例与对应关系正确**,就达标。能拿到原始数据
89
+ > (脚本/数据文件)时优先按真数据画(更稳、更精确);拿不到就以最终版成图为基准逐点
90
+ > 核对,核对记录写进 round-vN.md。matplotlib 只是美化手段,不是矢量转换手段——
91
+ > 「照终稿做可编辑矢量版」见 `SKILL.md` 阶段 5。
85
92
 
86
93
  **为什么必须溯源**:结果图上的文字往往很小,视觉模型抄轴刻度、抄数据点**必然出错**;靠 OCR 抄数出来的图是假的。唯一可靠路径是找到原始数据,用真数据重绘。
87
94
 
@@ -81,10 +81,10 @@ pf doctor # 体检:TeX 引擎 / API key / 本地服务 / 当前
81
81
  pf audit # 审计一键可查:绕门记录(craft.forced/gate_bypass/review.forced)+ 计费兜底
82
82
  # 每条带理由;接手别人项目/怀疑历史版本可信度时先跑它
83
83
  pf export svg <figId> # 最新版 PNG → 可缩放 SVG(vtracer 描摹,draft/high 两档)
84
- # ⚠️ 描摹 ≠ 可编辑矢量:文字全变路径,不可编辑不可搜索
85
- # 要「每个元素都能改」的可编辑矢量版(PPT 形状/独立 SVG 元素),
86
- # 让宿主 AI 用本地工具照终稿重绘(如 python-pptx/结构化 SVG,
87
- # 参考 github.com/icebird1998/scientific-illustifier)——禁止拿本命令的输出顶替
84
+ # ⚠️ 描摹件:文字全变路径、不可直接编辑——仅作退路。交付前必须核对
85
+ # 数值与比例(数值差不多即可、对应关系必须对),并告知用户是描摹件
86
+ # 首选:让宿主 AI 比照终稿用本地工具重绘(python-pptx 形状 / 结构化 SVG),
87
+ # 每元素独立成对象,用图层分离的工具编辑(参考 github.com/icebird1998/scientific-illustifier)
88
88
  # 首次用报缺依赖时:npm i @visioncortex/vtracer(纯 WASM 可商用)
89
89
  ```
90
90
 
@@ -375,6 +375,37 @@ pf craft --at "§3.2 ¶2" --figure-type pipeline \
375
375
  - **路径写法**:Git Bash 的 `/c/...`、Windows 的 `C:\...`、POSIX 的 `/home/...` 都能用;
376
376
  但 craft --out 建议用相对路径(当前目录下),最不容易踩环境差异。
377
377
 
378
+ ## 每轮交付与台账(每轮结束必交,CLI 优先)
379
+
380
+ **CLI 优先**:出图、核验、审批、定稿全走 `pf` 命令(`pf next` 永远告诉你下一步);
381
+ GUI 只留给人两件事——亲眼看图、点审批。插件的门禁与留痕都挂在 CLI 上,
382
+ 走 CLI 的每一步在 `events.jsonl` 里可审计;无头环境(SSH/容器/CI)本来就全 CLI。
383
+
384
+ 每轮交付在**用户工作目录**建 `promptfigure-out/`,每轮一个新版本文件夹 `vN/`(v1 → v2…):
385
+
386
+ ```
387
+ promptfigure-out/
388
+ ├── vN/
389
+ │ ├── round-vN.md ← 本轮反馈(下面的必含项)
390
+ │ └── figures/ ← 本轮图(副本或引用,文件名带 -vN)
391
+ ├── paper-with-figures.md ← 论文+已插图的演进版(无关段落省略,每次更新同一个)
392
+ └── final/paper-final.md + 格式副本 ← 最终论文版本(定稿时才建)
393
+ ```
394
+
395
+ **round-vN.md 必含**(与 promptfigure-api skill 的 deliverables-ledger.md 同一协议):
396
+ 1. **本轮清单**:每张图——figureId / 图种 / 档位 / 版本 / 本机真实路径(本插件即
397
+ `~/.promptfigure/projects/<docId>/figures/<figureId>/vN.png`)/ 插入位置(§¶)
398
+ 2. **插入位置(两段边界)**:上一段最后一句 + 「……」 + 下一段第一句,用户一眼定位
399
+ 3. **所用上下文**:用了哪几段明确到 §¶;上下文只放**首句 + 「……」 + 尾句**;
400
+ 数据/表格/代码文件一律给引用链接,不内联内容
401
+ 4. **图片版本**:每张图的每个版本独立文件(vN),旧版永不覆盖
402
+ 5. **优化前→优化后**(优化任务):原图路径 vs 新图路径 + 改了什么 + 所用上下文(首尾句)
403
+
404
+ **最终成稿流程**(用户说「定稿」):提醒核对数据是否更新 → 用户确认后才 premium 定稿 →
405
+ 定稿后必问矢量图(本地 AI 重绘、token 贵、速度慢;比赛/数模默认不做;确认做则按元素
406
+ 分层重绘成可编辑矢量,PPT/WPS 按用户偏好)——完整协议见 promptfigure-api skill 的
407
+ `references/deliverables-ledger.md`。
408
+
378
409
  ## 事件回放
379
410
 
380
411
  `~/.promptfigure/projects/<docId>/events.jsonl` 只追加不改写 —— 审批历史、
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "promptfigure",
3
- "version": "0.2.0",
3
+ "version": "0.3.2",
4
4
  "description": "promptFigure 本地插件:为论文配科研图(锚点定位 + 出图 + 审批闭环),随包附带 promptfigure-api / promptfigure-local 两个 skill",
5
5
  "skills": "./skills/"
6
6
  }
@@ -0,0 +1,45 @@
1
+ # 安装这个技能(AI Agent Skill)
2
+
3
+ > **版本 1.6.11**(2026-09-24)。下载页:https://promptfigure.top/skill 。查最新版:`curl -s https://promptfigure.top/downloads/promptfigure-api.version.json`;本地已装版本看 `SKILL.md` frontmatter 的 `version`。版本语义:主版本=接口不兼容改动(需重读 SKILL.md),次版本=新增能力,修订号=勘误。
4
+
5
+ 把 `promptfigure-api/` 整个文件夹放进你的 AI 工具的技能目录即可:
6
+
7
+ | 工具 | 技能目录(复制到此处) |
8
+ |---|---|
9
+ | Claude Code | `~/.claude/skills/promptfigure-api/` |
10
+ | Claude Desktop(Agent Skills) | 设置 → Skills → 导入本 zip,或放 `~/.claude/skills/` |
11
+ | WorkBuddy / OpenClaw | `~/.workbuddy/skills/promptfigure-api/` |
12
+ | Codex / Cursor / Cline 等任意 Agent | 无技能目录的,把 `SKILL.md` 内容追加到 `AGENTS.md` / `CLAUDE.md` / 规则文件末尾 |
13
+
14
+ 安装后对 AI 说「帮我用 promptFigure 画一张 XXX 图」,它会自动读取 `SKILL.md` 并按流程执行:
15
+ 注册/登录 → 拿 key(或复用你已有的 `PROMPTFIGURE_KEY`)→ 调 API 出图。
16
+
17
+ ## 本包还附带本地插件(plugin/)
18
+
19
+ 一个 zip 两样东西:根目录的 `SKILL.md` 是纯 REST 技能(上面的装法即用);
20
+ `plugin/` 是本地插件(`pf` CLI + promptfigure-local skill + 托盘)。想要「文档只读预览 /
21
+ 锚点定位 / GUI 审批 / 本地规则层 / 矢量导出」这些本机能力时再装它:
22
+
23
+ ```bash
24
+ cd plugin && npm install && npm link # 之后 pf 命令全局可用
25
+ ```
26
+
27
+ 详见 [PLUGIN.md](PLUGIN.md);纯 REST 用户完全不用碰 plugin/。
28
+
29
+ ## 需要准备
30
+
31
+ - 一个账号:https://promptfigure.top 注册(邮箱 + 密码 ≥8 位,无需邮箱验证)
32
+ - 余额:控制台充值($1 起整数,每满 $50 赠 $1);API 按次计费 standard $0.02 / premium $0.15
33
+ - API key:控制台「API 密钥」创建,`pf_` 开头明文只显示一次
34
+
35
+ ## 保持最新
36
+
37
+ 技能会过期。程序化查最新版本(不用下载整个包):
38
+
39
+ ```bash
40
+ curl -s https://promptfigure.top/downloads/promptfigure-api.version.json
41
+ ```
42
+
43
+ 本地 `version` 低于线上 `version` → 到下载页取最新包:https://promptfigure.top/skill
44
+ (直链:https://promptfigure.top/downloads/promptfigure-api.zip ,或 GitHub Release 资产 promptfigure-api-1.6.11.zip)
45
+ 安装说明与 API 文档:https://promptfigure.top/docs/zh-CN/api
@@ -1,10 +1,10 @@
1
1
  ---
2
2
  name: promptfigure-api
3
3
  description: 用 promptFigure 生成科研/学术配图(流程图、机制图、管线图、技术路线图、图形摘要),以及优化已有图表、整文批量升级(数据图本地重绘 + 示意图 AI 重构 + 可编辑矢量版 + 追溯台账)。当用户要「画一张图」「生成论文配图/示意图/机制图/graphical abstract」「把论文里的图变好看/变高级」「批量优化整篇文章的图」「要可编辑的矢量图/PPT 版」、给了 PDF/WPS/Word 文稿要配图或要主动建议插图位、或要配置 promptFigure API key、或要用 REST 接口批量出图时使用。走 https://promptfigure.top 的 /api/v1/generate,Bearer pf_ key 鉴权,返回 base64 PNG。强制学术字体规范(图内无衬线、禁手写/花体)与上下文蒸馏规则(原文段落绝不直接进 prompt,先蒸馏成实体/结构/图种三清单再组装)。网页端有多轮问询/二次确认,API 端一次性提交——所以要把用户绘图意图一次说清楚,服务端负责润色成完整示意。
4
- version: 1.6.8
4
+ version: 1.6.11
5
5
  license: MIT
6
6
  metadata:
7
- version: "1.6.8"
7
+ version: "1.6.11"
8
8
  author: promptFigure (zhangmask)
9
9
  homepage: https://promptfigure.top
10
10
  repository: https://github.com/zhangmask/promptfigure-skill
@@ -22,7 +22,7 @@ metadata:
22
22
  **整个流程里唯一花钱的动作是 API 调用**。所有迭代都在本地免费环节完成:
23
23
 
24
24
  ```
25
- 阶段 0 意图确认(对用户)→ 阶段 1 写提示词 → 阶段 2 提示词审核 → 阶段 3 API 出图 → 阶段 4 成图审核 → 阶段 5 可编辑矢量版(可选,交付后必问用户)
25
+ 阶段 0 意图确认(对用户)→ 阶段 1 写提示词 → 阶段 2 提示词审核 → 阶段 3 API 出图 → 阶段 4 成图审核 → 阶段 6 每轮交付与台账(每轮结束必交)→ 阶段 5 可编辑矢量版(可选,最终成稿时必问用户)
26
26
  ↑__________ 打回/不满意只回到这里改 prompt,免费 __________↑
27
27
  ```
28
28
 
@@ -44,18 +44,34 @@ metadata:
44
44
  1. 🔴 **比赛 / 数学建模 / 学术会议竞赛**:默认建议**不做**,以速度为准——这些场景交 PNG 就够,矢量版是时间黑洞,别为它赌提交时限
45
45
  2. **时间充裕**(用户明确表示不赶、或场景是期刊/课设/长期维护的图):做。全部用**用户本地的工具或代码**完成,不调用 promptFigure API、不消耗任何额度
46
46
 
47
- **做法(三条红线 + 一条推荐路)**:
47
+ **做法(两条红线 + 一条首选路 + 一条退路)**:
48
48
 
49
- - 🔴 **禁止描摹矢量**:vtracer / potrace /「位图转 SVG 路径」之类一律不用——描摹出来的文字全是路径,不可编辑、不可搜索,越改越错。描摹矢量和「可编辑矢量」是两种东西,别拿描摹滥竽充数
50
- - 🔴 **必须是可编辑矢量**:每个元素是独立对象——PPT 形状、独立 SVG 元素/分组、Illustrator 图层都行。验收标准一句话:**用户能改,你的(宿主 AI)也能改**——后续微调是改对象属性,不是重画
51
- - 🔴 **文字保持文本**:标签必须是可编辑文本(无衬线,遵循图内字体规范),不许转路径
52
- - **推荐路**:拿最终确认版图,用本地代码/工具**照着画一遍**——如 python-pptx 生成形状化 PPTX、或写结构化 SVG(每个模块/箭头/标签一个元素),画完与确认版逐项比对、不一致就改,迭代到一致为止。参考做法:<https://github.com/icebird1998/scientific-illustifier>(宿主自行阅读,按本机工具链取舍)
53
- - 宿主没有本地矢量工具链(没有 python-pptx / 没有矢量软件 / 跑不动)时:**明示用户「做不了可编辑矢量版」**,交付确认版 PNG 收尾——仍然不许用描摹顶替
49
+ - 🔴 **必须是可编辑矢量**:每个元素是独立对象——PPT 形状、独立 SVG 元素/分组、Illustrator/Inkscape 图层都行。验收标准一句话:**用户能改,你的(宿主 AI)也能改**——后续微调是改对象属性,不是重画
50
+ - 🔴 **编辑必须用图层分离的工具**:在 PPT/WPS/Illustrator/Inkscape 里按「图层/组合」组织——每个模块、箭头、标签各自独立成层(PPT 用单独形状或组合、SVG 用 `<g>` 分组、位图软件用独立图层),禁止把所有元素糊成一个扁平对象或直接在扁平层上改像素
51
+ - **首选路——比照着重绘**:拿最终确认版图,用本地代码/工具**照着画一遍**——如 python-pptx 生成形状化 PPTX、或写结构化 SVG(每个模块/箭头/标签一个元素),画完与确认版逐项比对、不一致就改,迭代到一致为止。参考做法:<https://github.com/icebird1998/scientific-illustifier>(宿主自行阅读,按本机工具链取舍)
52
+ - **退路——描摹**:本机没有可编程矢量工具链、或时间紧时,可以用 vtracer 等把最终版描摹成矢量(`pf export svg` 即此路)。但必须**先核对再交付**:① 数值/标签与最终版一致(数据图数值差不多即可,但刻度对应关系要对);② 比例、模块对应关系正确;③ 交付时明确告知「描摹产物,文字已变为路径、不可直接编辑,改内容需回到重绘或重出图」——不许把描摹件当「可编辑矢量」宣称
53
+ - 宿主连描摹工具都没有时:**明示用户「做不了矢量版」**,交付确认版 PNG 收尾
54
54
 
55
55
  **交付物**:矢量文件 + 一句「哪些元素可以直接改」(如「每个方框、箭头、文字都是独立形状,可拖动/改字/改色」);`pf-ledger.md` 补一行,标注本地生成、零 API 消耗。
56
56
 
57
57
  ---
58
58
 
59
+ ## 🔴 阶段 6:每轮交付与台账(每轮结束必交,用户随时可查)
60
+
61
+ 每次出图 / 优化 / 批处理结束,在用户工作目录建 `promptfigure-out/`,**每轮交付一个新版本文件夹**(v1 → v2 → v3…),协议全文见 `references/deliverables-ledger.md`,五条硬性要求:
62
+
63
+ 1. **本轮清单**:round-vN.md 列出本轮每张图——图种 / 档位 / 版本 / 本机真实路径 / 插入位置
64
+ 2. **插入位置(两段边界)**:每张图标出插在原文哪两段之间——**上一段最后一句 + 「……」 + 下一段第一句**,用户一眼定位
65
+ 3. **上下文与引用**:用了哪几段明确到 §¶;上下文只放**首句 + 「……」 + 尾句**;用了本地表格/数据/代码文件一律给**引用链接不内联内容**
66
+ 4. **图片版本**:文件名带 `-vN`,旧版永不覆盖,随时可回溯对比
67
+ 5. **两份演进文档**:`paper-with-figures.md`(原文结构 + 已插图,无关段落省略,每次更新同一个)与 `final/paper-final.md`(最终论文版本,附按用户文档格式的可打开副本:Word→docx、LaTeX→tex、WPS→docx)
68
+
69
+ **最终成稿流程**(用户说「定稿」时):先提醒核对数据是否更新 → 用户确认后才 premium 定稿 → 定稿后必问矢量图(提醒:本地 AI 重绘、token 贵、速度慢,比赛/数模默认不做;确认做则按元素分层重绘成可编辑矢量,应用按用户偏好)。
70
+
71
+ 🔴 **CLI 优先**:全程走 `pf`(或 REST 直连)沉淀状态,GUI 只留给人看图和点审批——插件的门禁与留痕都挂在 CLI 上。
72
+
73
+ ---
74
+
59
75
  ## 🔴 草稿策略:低文字密度 + 科研风格基线(2026-09-25 实测定规)
60
76
 
61
77
  standard 档的乱码率随**卡面文字量**上升:实测说明性小字是乱码重灾区
@@ -270,5 +286,6 @@ curl -s https://promptfigure.top/downloads/promptfigure-api.version.json
270
286
  | `references/api-contract.md` | 完整契约、网页工作流 4 步、多语言示例、批处理、WAF |
271
287
  | `references/troubleshooting.md` | 润色失败、WAF 403、balance 滞后、出图质量差 |
272
288
  | `references/document-workflow.md` | 用户给了 `.tex` / `.docx` / `.md` 文稿要配图:怎么定位插图位、从上下文写 prompt、插回文档;LaTeX 编译环境探测与官方下载指引(MiKTeX/TeX Live/TinyTeX/Tectonic/Overleaf) |
289
+ | `references/deliverables-ledger.md` | **每轮交付**:round-vN.md 清单/插入位置/上下文引用、paper-with-figures.md 演进版、final/ 最终论文版本与格式副本、最终成稿流程 |
273
290
  | `references/figure-upgrade-workflow.md` | 用户要**优化已有图表**或**整文批量升级**:结果图数据溯源+本地重绘、示意图 AI 升级、结构组合、单图精修/整文批处理两种模式、figure-ledger.json 追溯台账 |
274
291
  | `references/proactive-upgrade.md` | 用户给的是 **PDF/WPS**(非 LaTeX)、说不出哪里插图要你**主动建议**、要从**原始数据**推演配图、或想参考顶会/SCI 论文的图学风格:PDF 解析、MCM 插图位惯例、四步管线(分析→推演→提示词→迭代)、refs/ 风格库与合规红线 |
@@ -0,0 +1,119 @@
1
+ # 每轮交付与台账(round deliverables & ledger)
2
+
3
+ > 场景:每次用 promptFigure 出图 / 优化图片 / 整文批处理结束后,宿主 AI 必须按本文件产出结构化交付。
4
+ > 目的:用户随时能回答三个问题——**这轮做了什么图、图插在原文哪里、用了什么上下文/数据**。
5
+ > 🔴 本文件是硬性协议:缺任何一项 = 交付不完整。CLI 优先——全程用 `pf` 命令沉淀状态,GUI 只留给人「看一眼 / 点审批」。
6
+
7
+ ---
8
+
9
+ ## 0. CLI 优先原则(2026-09-25 定规)
10
+
11
+ - 出图、核验、审批、定稿全链路都有 CLI:`pf open → craft → render → qa → review resolve → premium`,**能用 CLI 就用 CLI**
12
+ - GUI 只用于两件事:人亲眼看图、人点审批。插件的门禁与留痕都挂在 CLI 上,走 CLI 的每一步都可审计
13
+ - 每轮结束的交付目录里,路径一律引用**用户本机真实路径**(相对当前交付目录优先,跨目录用绝对路径),禁止只给「见图库」这类指不到文件的话
14
+
15
+ ---
16
+
17
+ ## 1. 交付目录结构(每一轮 = 一个新文件夹)
18
+
19
+ 在**用户当前工作目录**(论文旁边)建 `promptfigure-out/`,每轮交付新建递增版本文件夹:
20
+
21
+ ```
22
+ promptfigure-out/
23
+ ├── v1/ ← 第 1 轮交付(每次交付新建一个,v1 → v2 → v3…)
24
+ │ ├── round-v1.md ← 本轮反馈(见 §2 必含项)
25
+ │ └── figures/ ← 本轮产出的图(文件名带版本号)
26
+ │ ├── fig-method-v1.png
27
+ │ └── fig-method-v2.png ← 改版后重新出,旧版保留可回溯
28
+ ├── v2/round-v2.md ← 第 2 轮……
29
+ ├── paper-with-figures.md ← 不断演进的「论文 + 已插图」版(见 §3)
30
+ └── final/ ← 最终论文版本(见 §4,仅最终成稿时建)
31
+ ├── paper-final.md
32
+ └── paper-final.docx ← 格式副本,按用户原文档格式(见 §4)
33
+ ```
34
+
35
+ - 版本号判断:`ls promptfigure-out/` 取最大 N + 1;用户已有自己的目录约定时听用户的
36
+ - `figures/` 里的图**永不覆盖**:同一张图的每个版本都是独立文件(`-v1/-v2/…`),旧版要能随时打开对比
37
+
38
+ ---
39
+
40
+ ## 2. round-vN.md 必含项(本轮反馈)
41
+
42
+ 模板(每轮照此填,没有的项目写「无」并说明原因,禁止静默省略):
43
+
44
+ ```markdown
45
+ # 第 N 轮交付 · YYYY-MM-DD HH:mm
46
+
47
+ ## 本轮清单
48
+ | # | 图 | 图种 | 档位 | 版本 | 本机路径 | 插入位置(§¶) | 状态 |
49
+ |---|---|---|---|---|---|---|---|
50
+ | 1 | 方法流程图 | pipeline | premium | v2 | figures/fig-method-v2.png | §2 ¶1 ↔ §2 ¶2 之间 | 已审批 |
51
+
52
+ ## 插入位置(图放在原文哪两段之间)
53
+ 逐张图给出——**上一段最后一句 + 「……」 + 下一段第一句**,让用户一眼定位:
54
+
55
+ > ……la optimización por enjambre de partículas ajusta automáticamente los principales parámetros.……La estrategia de aumento de datos incluye recorte aleatorio, jitter de color y deformación elástica.
56
+ > (图 1 插在上述两句之间,即 §2 ¶1 末 ↔ §2 ¶2 首)
57
+
58
+ - 自然段为粒度(¶),不用句号硬切;原文没有下一段时注明「§2 段末,文末」
59
+
60
+ ## 所用上下文(只放首尾句,中间省略)
61
+ - 原文上下文:「首句……尾句」(禁止整段贴入;用了哪几段就列哪几条,§¶ 标清楚)
62
+ - 引用范围声明:本次生成具体使用了 §2 ¶1–¶2(明确到段,供用户核对)
63
+
64
+ ## 数据与引用
65
+ - 本地表格/数据文件:[table1.csv](../data/table1.csv)、[run_exp2.m](../code/run_exp2.m) —— **只给引用链接,不内联内容**
66
+ - 参考图:refDataUrl(本地图 /path/to/ref.png)或 refUrl(https://…);用了就标,没用写「无」
67
+
68
+ ## 优化前 → 优化后(仅「优化已有图」任务)
69
+ | 图 | 优化前 | 优化后 | 改了什么 | 所用上下文(首尾句) |
70
+ |---|---|---|---|---|
71
+ | 原图1(曲线组) | figures/orig/fig1-old.png | figures/fig1-v1.png | 色板改语义化、字号 8pt、去 3D | 「首句……尾句」 |
72
+ ```
73
+
74
+ **三条填写铁律**:
75
+ 1. **上下文只放首句 + 尾句,中间一律省略号**——整段进 MD 会让用户无法快速审阅,也让版本 diff 爆炸
76
+ 2. **表格 / 代码 / 数据文件一律引用链接,禁止内联内容**——内联会让 MD 迅速腐烂、版本更新时无法对账;要「看见这轮用了什么」,点链接就是
77
+ 3. **每张图必须看得到版本**(文件名 `-vN` + 清单里的版本列 + 状态列)——版本是回溯和 diff 的唯一坐标
78
+
79
+ ---
80
+
81
+ ## 3. paper-with-figures.md(不断演进的呈现版)
82
+
83
+ - 结构 = 用户原文的章节树;**本轮涉及的段落**照录,**不涉及的段落**一律省略为一行:`……(§3 全文见原文)`
84
+ - 每张图插在自己的插入位置(§2 ¶1 ↔ ¶2 之间),图片用相对路径引用 vN 文件夹里的真实文件
85
+ - 每次交付**更新同一个文件**(或在文件名带版本 `paper-with-figures.vN.md` 保留历史)——用户随时打开这一个文件就能看到「论文现在长什么样」
86
+
87
+ ---
88
+
89
+ ## 4. final/ 最终论文版本
90
+
91
+ 用户要求「最终成稿 / 定稿」时才建,包含:
92
+
93
+ 1. `final/paper-final.md`——最终呈现版(全部已审批图就位、引用与上下文清单汇总)
94
+ 2. `final/paper-final.<用户格式>`——**格式副本,按用户原文档格式来**:
95
+ - Word/.docx → 交付 .docx(有 pandoc/docx 工具就用;无工具要明说「做不了格式副本,交付 MD」)
96
+ - LaTeX/.tex → 交付 .tex(图用 `\includegraphics` 引用真实路径,结构可编译)
97
+ - WPS → 交付 .docx(WPS 可直接打开)
98
+ - 🔴 **副本必须能正常打开**:交付前自己验证(文件非零、结构完整、能找到图);验证不了就明说,禁止交一个打不开的坏副本
99
+
100
+ ---
101
+
102
+ ## 5. 最终成稿流程(用户说「定稿 / 最终版」时按此走)
103
+
104
+ 1. **先提醒核对**:提醒用户「数据有没有更新?要不要重新跑一次核验?」——用户明确确认后,才进入 premium 最终定稿
105
+ 2. **确认高级定稿**:向用户复述「将消耗 premium 档额度出高清定稿,N 张」并取得确认;未确认不动手
106
+ 3. **定稿后问矢量图**(衔接 SKILL.md 阶段 5):
107
+ - 提醒成本:矢量图由**用户自己的 AI 本地重绘**,token 消耗大、速度慢
108
+ - 🔴 **比赛 / 数学建模 / 学术会议竞赛:默认不做**,速度优先;只有时间充裕才做
109
+ 4. **用户确认做矢量图时**:首选**比照着重绘**——拿最终版用本地工具照着画,每个模块、箭头、标签独立成对象;🔴 **必须用支持图层分离的工具编辑**:PPT/WPS 用单独形状或组合、SVG 用 `<g>` 分组、Illustrator/Inkscape 用独立图层——一把糊成扁平对象 = 不可编辑,返工。应用按用户主要偏好来(PPT / WPS / 其他)。**退路=描摹**(vtracer 等):先核对数值与比例(数值差不多即可、对应关系必须对),交付时明确告知「描摹件、文字已变路径不可直接编辑」——不许当可编辑矢量宣称
110
+
111
+ ---
112
+
113
+ ## 6. 自检清单(每轮交付前过一遍)
114
+
115
+ - [ ] 版本文件夹新建(vN 递增)、图带版本号、旧版未覆盖
116
+ - [ ] round-vN.md 五项齐:清单 / 插入位置(两段边界句)/ 上下文(首尾句)/ 数据引用(链接)/ 优化前后(如适用)
117
+ - [ ] paper-with-figures.md 已更新到含本轮所有图
118
+ - [ ] 路径全部指得到真实文件(md 里的链接点得开)
119
+ - [ ] final/ 仅在最终成稿时出现,格式副本已验证可打开
@@ -10,14 +10,16 @@
10
10
 
11
11
  | 需求 | 判据 | 路线 |
12
12
  |---|---|---|
13
- | **A1. 结果图美化**(曲线/柱状/热图/箱线…) | 图上带**精确数值**(刻度、柱高、数据点) | 🔴 **绝不走 AI 生图**。数据溯源 + 本地重绘(§3)——AI 画图模型必画错数字,坐标必须是真数据 |
13
+ | **A1. 结果图美化**(曲线/柱状/热图/箱线…) | 图上带**精确数值**(刻度、柱高、数据点) | 照最终结果重绘(§3):以我们最终给出的成图为基准重绘——期刊图大多也不是 MATLAB 原生生成的;**验收 = 数值与基准一致(差不多即可)+ 比例/对应关系正确**。能拿到原始数据就优先溯源(更稳),拿不到就以最终版成图逐点核对 |
14
14
  | **A2. 示意图升级**(用户已画的结构/流程/机制图,嫌丑) | 图上只有方块、箭头、标签,无数值 | AI 升级:结构照搬 + 视觉升级指令(§4.2),可选参考图 |
15
15
  | **A3. 结构组合**(多张小图合并成一张大图) | 多张 A1 或 A2 要拼版 | A1 部分本地 matplotlib subplot 拼版;A2 部分合并成一个多 panel prompt(§4.1) |
16
16
  | **B. 代码画不出的图**(流程图/机制图/神经网络图/算法示意) | 用户只能嘴上说 | promptFigure API(§4),本技能的主场 |
17
17
 
18
18
  **一句话分流:数字支撑 → 本地画;结构故事 → API 画;一张图里混着两者 → 拆开,各走各的,最后拼版。**
19
19
 
20
- > 🔴 **「把终稿变成可编辑矢量/PPT 版」不属于以上任何一类**——那不是 matplotlib 的活,也不是出图 API 的活。走 `SKILL.md` **阶段 5**:终稿交付后先问用户要不要,比赛/数模默认不做(速度优先),时间充裕才由**宿主 AI 用本地的矢量工具/代码照着重绘**(禁止描摹,必须每个元素可编辑)。§3 的 matplotlib 只负责 A1 数据图的真数据重绘(防数字造假),不碰任何矢量转换。
20
+ > 🔴 **每轮结束必须交付台账**:新建 `promptfigure-out/vN/round-vN.md`——本轮清单(图种/档位/版本/本机路径/插入位置)、每张图的插入位置(上段末句 + …… + 下段首句)、所用上下文(只放首尾句)、数据文件只给引用链接;「优化前 → 优化后」对比也落在这里。全文协议见 `deliverables-ledger.md`。
21
+
22
+ > 🔴 **「把终稿变成可编辑矢量/PPT 版」不属于以上任何一类**——走 `SKILL.md` **阶段 5**:终稿交付后先问用户要不要,比赛/数模默认不做(速度优先),时间充裕才做。**首选**宿主 AI 比照最终版用本地工具重绘(每元素独立对象、用图层分离工具编辑);**退路**可描摹,但须先核对数值/比例并告知「描摹件文字不可编辑」。§3 的本地重绘 = 数据图的美化路径,不碰矢量转换。
21
23
 
22
24
  ---
23
25
 
@@ -79,9 +81,14 @@ SKILL.md 的「零反问」铁律**约束的是对 API 的出图过程**——
79
81
 
80
82
  ---
81
83
 
82
- ## 3. 代码图数据溯源(A1 类的唯一正路)
84
+ ## 3. 数据图美化(照最终结果重绘)
83
85
 
84
- > 本节 = **A1 数据图专用**(曲线/柱状/热图等带真数值的图)。用 matplotlib 的唯一理由是「坐标必须是真数据」;它不是通用美化手段,更不是矢量转换手段——「照终稿做可编辑矢量版」见 `SKILL.md` 阶段 5。
86
+ > 本节 = **A1 数据图专用**(曲线/柱状/热图等带真数值的图)。2026-09-25 松口(原规则太死):
87
+ > **数据图照我们最终给出的成图重绘即可**——期刊图大多也不是 MATLAB 原生生成的,只要
88
+ > **① 数值与最终版一致(差不多即可)② 比例与对应关系正确**,就达标。能拿到原始数据
89
+ > (脚本/数据文件)时优先按真数据画(更稳、更精确);拿不到就以最终版成图为基准逐点
90
+ > 核对,核对记录写进 round-vN.md。matplotlib 只是美化手段,不是矢量转换手段——
91
+ > 「照终稿做可编辑矢量版」见 `SKILL.md` 阶段 5。
85
92
 
86
93
  **为什么必须溯源**:结果图上的文字往往很小,视觉模型抄轴刻度、抄数据点**必然出错**;靠 OCR 抄数出来的图是假的。唯一可靠路径是找到原始数据,用真数据重绘。
87
94
 
@@ -81,10 +81,10 @@ pf doctor # 体检:TeX 引擎 / API key / 本地服务 / 当前
81
81
  pf audit # 审计一键可查:绕门记录(craft.forced/gate_bypass/review.forced)+ 计费兜底
82
82
  # 每条带理由;接手别人项目/怀疑历史版本可信度时先跑它
83
83
  pf export svg <figId> # 最新版 PNG → 可缩放 SVG(vtracer 描摹,draft/high 两档)
84
- # ⚠️ 描摹 ≠ 可编辑矢量:文字全变路径,不可编辑不可搜索
85
- # 要「每个元素都能改」的可编辑矢量版(PPT 形状/独立 SVG 元素),
86
- # 让宿主 AI 用本地工具照终稿重绘(如 python-pptx/结构化 SVG,
87
- # 参考 github.com/icebird1998/scientific-illustifier)——禁止拿本命令的输出顶替
84
+ # ⚠️ 描摹件:文字全变路径、不可直接编辑——仅作退路。交付前必须核对
85
+ # 数值与比例(数值差不多即可、对应关系必须对),并告知用户是描摹件
86
+ # 首选:让宿主 AI 比照终稿用本地工具重绘(python-pptx 形状 / 结构化 SVG),
87
+ # 每元素独立成对象,用图层分离的工具编辑(参考 github.com/icebird1998/scientific-illustifier)
88
88
  # 首次用报缺依赖时:npm i @visioncortex/vtracer(纯 WASM 可商用)
89
89
  ```
90
90
 
@@ -375,6 +375,37 @@ pf craft --at "§3.2 ¶2" --figure-type pipeline \
375
375
  - **路径写法**:Git Bash 的 `/c/...`、Windows 的 `C:\...`、POSIX 的 `/home/...` 都能用;
376
376
  但 craft --out 建议用相对路径(当前目录下),最不容易踩环境差异。
377
377
 
378
+ ## 每轮交付与台账(每轮结束必交,CLI 优先)
379
+
380
+ **CLI 优先**:出图、核验、审批、定稿全走 `pf` 命令(`pf next` 永远告诉你下一步);
381
+ GUI 只留给人两件事——亲眼看图、点审批。插件的门禁与留痕都挂在 CLI 上,
382
+ 走 CLI 的每一步在 `events.jsonl` 里可审计;无头环境(SSH/容器/CI)本来就全 CLI。
383
+
384
+ 每轮交付在**用户工作目录**建 `promptfigure-out/`,每轮一个新版本文件夹 `vN/`(v1 → v2…):
385
+
386
+ ```
387
+ promptfigure-out/
388
+ ├── vN/
389
+ │ ├── round-vN.md ← 本轮反馈(下面的必含项)
390
+ │ └── figures/ ← 本轮图(副本或引用,文件名带 -vN)
391
+ ├── paper-with-figures.md ← 论文+已插图的演进版(无关段落省略,每次更新同一个)
392
+ └── final/paper-final.md + 格式副本 ← 最终论文版本(定稿时才建)
393
+ ```
394
+
395
+ **round-vN.md 必含**(与 promptfigure-api skill 的 deliverables-ledger.md 同一协议):
396
+ 1. **本轮清单**:每张图——figureId / 图种 / 档位 / 版本 / 本机真实路径(本插件即
397
+ `~/.promptfigure/projects/<docId>/figures/<figureId>/vN.png`)/ 插入位置(§¶)
398
+ 2. **插入位置(两段边界)**:上一段最后一句 + 「……」 + 下一段第一句,用户一眼定位
399
+ 3. **所用上下文**:用了哪几段明确到 §¶;上下文只放**首句 + 「……」 + 尾句**;
400
+ 数据/表格/代码文件一律给引用链接,不内联内容
401
+ 4. **图片版本**:每张图的每个版本独立文件(vN),旧版永不覆盖
402
+ 5. **优化前→优化后**(优化任务):原图路径 vs 新图路径 + 改了什么 + 所用上下文(首尾句)
403
+
404
+ **最终成稿流程**(用户说「定稿」):提醒核对数据是否更新 → 用户确认后才 premium 定稿 →
405
+ 定稿后必问矢量图(本地 AI 重绘、token 贵、速度慢;比赛/数模默认不做;确认做则按元素
406
+ 分层重绘成可编辑矢量,PPT/WPS 按用户偏好)——完整协议见 promptfigure-api skill 的
407
+ `references/deliverables-ledger.md`。
408
+
378
409
  ## 事件回放
379
410
 
380
411
  `~/.promptfigure/projects/<docId>/events.jsonl` 只追加不改写 —— 审批历史、
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "promptfigure",
3
- "version": "0.3.0",
3
+ "version": "0.3.2",
4
4
  "description": "promptFigure 本地插件:在你的 AI 宿主(Codex / Claude Code 等)里为论文配科研图。开文档(LaTeX 本地编译)、画锚点、本地规则层组装提示词、调出图、收审批。npm 安装即附带 promptfigure-local / promptfigure-api 两个 Agent Skill。",
5
5
  "type": "module",
6
6
  "bin": {
@@ -0,0 +1,45 @@
1
+ # 安装这个技能(AI Agent Skill)
2
+
3
+ > **版本 1.6.11**(2026-09-24)。下载页:https://promptfigure.top/skill 。查最新版:`curl -s https://promptfigure.top/downloads/promptfigure-api.version.json`;本地已装版本看 `SKILL.md` frontmatter 的 `version`。版本语义:主版本=接口不兼容改动(需重读 SKILL.md),次版本=新增能力,修订号=勘误。
4
+
5
+ 把 `promptfigure-api/` 整个文件夹放进你的 AI 工具的技能目录即可:
6
+
7
+ | 工具 | 技能目录(复制到此处) |
8
+ |---|---|
9
+ | Claude Code | `~/.claude/skills/promptfigure-api/` |
10
+ | Claude Desktop(Agent Skills) | 设置 → Skills → 导入本 zip,或放 `~/.claude/skills/` |
11
+ | WorkBuddy / OpenClaw | `~/.workbuddy/skills/promptfigure-api/` |
12
+ | Codex / Cursor / Cline 等任意 Agent | 无技能目录的,把 `SKILL.md` 内容追加到 `AGENTS.md` / `CLAUDE.md` / 规则文件末尾 |
13
+
14
+ 安装后对 AI 说「帮我用 promptFigure 画一张 XXX 图」,它会自动读取 `SKILL.md` 并按流程执行:
15
+ 注册/登录 → 拿 key(或复用你已有的 `PROMPTFIGURE_KEY`)→ 调 API 出图。
16
+
17
+ ## 本包还附带本地插件(plugin/)
18
+
19
+ 一个 zip 两样东西:根目录的 `SKILL.md` 是纯 REST 技能(上面的装法即用);
20
+ `plugin/` 是本地插件(`pf` CLI + promptfigure-local skill + 托盘)。想要「文档只读预览 /
21
+ 锚点定位 / GUI 审批 / 本地规则层 / 矢量导出」这些本机能力时再装它:
22
+
23
+ ```bash
24
+ cd plugin && npm install && npm link # 之后 pf 命令全局可用
25
+ ```
26
+
27
+ 详见 [PLUGIN.md](PLUGIN.md);纯 REST 用户完全不用碰 plugin/。
28
+
29
+ ## 需要准备
30
+
31
+ - 一个账号:https://promptfigure.top 注册(邮箱 + 密码 ≥8 位,无需邮箱验证)
32
+ - 余额:控制台充值($1 起整数,每满 $50 赠 $1);API 按次计费 standard $0.02 / premium $0.15
33
+ - API key:控制台「API 密钥」创建,`pf_` 开头明文只显示一次
34
+
35
+ ## 保持最新
36
+
37
+ 技能会过期。程序化查最新版本(不用下载整个包):
38
+
39
+ ```bash
40
+ curl -s https://promptfigure.top/downloads/promptfigure-api.version.json
41
+ ```
42
+
43
+ 本地 `version` 低于线上 `version` → 到下载页取最新包:https://promptfigure.top/skill
44
+ (直链:https://promptfigure.top/downloads/promptfigure-api.zip ,或 GitHub Release 资产 promptfigure-api-1.6.11.zip)
45
+ 安装说明与 API 文档:https://promptfigure.top/docs/zh-CN/api
@@ -1,10 +1,10 @@
1
1
  ---
2
2
  name: promptfigure-api
3
3
  description: 用 promptFigure 生成科研/学术配图(流程图、机制图、管线图、技术路线图、图形摘要),以及优化已有图表、整文批量升级(数据图本地重绘 + 示意图 AI 重构 + 可编辑矢量版 + 追溯台账)。当用户要「画一张图」「生成论文配图/示意图/机制图/graphical abstract」「把论文里的图变好看/变高级」「批量优化整篇文章的图」「要可编辑的矢量图/PPT 版」、给了 PDF/WPS/Word 文稿要配图或要主动建议插图位、或要配置 promptFigure API key、或要用 REST 接口批量出图时使用。走 https://promptfigure.top 的 /api/v1/generate,Bearer pf_ key 鉴权,返回 base64 PNG。强制学术字体规范(图内无衬线、禁手写/花体)与上下文蒸馏规则(原文段落绝不直接进 prompt,先蒸馏成实体/结构/图种三清单再组装)。网页端有多轮问询/二次确认,API 端一次性提交——所以要把用户绘图意图一次说清楚,服务端负责润色成完整示意。
4
- version: 1.6.8
4
+ version: 1.6.11
5
5
  license: MIT
6
6
  metadata:
7
- version: "1.6.8"
7
+ version: "1.6.11"
8
8
  author: promptFigure (zhangmask)
9
9
  homepage: https://promptfigure.top
10
10
  repository: https://github.com/zhangmask/promptfigure-skill
@@ -22,7 +22,7 @@ metadata:
22
22
  **整个流程里唯一花钱的动作是 API 调用**。所有迭代都在本地免费环节完成:
23
23
 
24
24
  ```
25
- 阶段 0 意图确认(对用户)→ 阶段 1 写提示词 → 阶段 2 提示词审核 → 阶段 3 API 出图 → 阶段 4 成图审核 → 阶段 5 可编辑矢量版(可选,交付后必问用户)
25
+ 阶段 0 意图确认(对用户)→ 阶段 1 写提示词 → 阶段 2 提示词审核 → 阶段 3 API 出图 → 阶段 4 成图审核 → 阶段 6 每轮交付与台账(每轮结束必交)→ 阶段 5 可编辑矢量版(可选,最终成稿时必问用户)
26
26
  ↑__________ 打回/不满意只回到这里改 prompt,免费 __________↑
27
27
  ```
28
28
 
@@ -44,18 +44,34 @@ metadata:
44
44
  1. 🔴 **比赛 / 数学建模 / 学术会议竞赛**:默认建议**不做**,以速度为准——这些场景交 PNG 就够,矢量版是时间黑洞,别为它赌提交时限
45
45
  2. **时间充裕**(用户明确表示不赶、或场景是期刊/课设/长期维护的图):做。全部用**用户本地的工具或代码**完成,不调用 promptFigure API、不消耗任何额度
46
46
 
47
- **做法(三条红线 + 一条推荐路)**:
47
+ **做法(两条红线 + 一条首选路 + 一条退路)**:
48
48
 
49
- - 🔴 **禁止描摹矢量**:vtracer / potrace /「位图转 SVG 路径」之类一律不用——描摹出来的文字全是路径,不可编辑、不可搜索,越改越错。描摹矢量和「可编辑矢量」是两种东西,别拿描摹滥竽充数
50
- - 🔴 **必须是可编辑矢量**:每个元素是独立对象——PPT 形状、独立 SVG 元素/分组、Illustrator 图层都行。验收标准一句话:**用户能改,你的(宿主 AI)也能改**——后续微调是改对象属性,不是重画
51
- - 🔴 **文字保持文本**:标签必须是可编辑文本(无衬线,遵循图内字体规范),不许转路径
52
- - **推荐路**:拿最终确认版图,用本地代码/工具**照着画一遍**——如 python-pptx 生成形状化 PPTX、或写结构化 SVG(每个模块/箭头/标签一个元素),画完与确认版逐项比对、不一致就改,迭代到一致为止。参考做法:<https://github.com/icebird1998/scientific-illustifier>(宿主自行阅读,按本机工具链取舍)
53
- - 宿主没有本地矢量工具链(没有 python-pptx / 没有矢量软件 / 跑不动)时:**明示用户「做不了可编辑矢量版」**,交付确认版 PNG 收尾——仍然不许用描摹顶替
49
+ - 🔴 **必须是可编辑矢量**:每个元素是独立对象——PPT 形状、独立 SVG 元素/分组、Illustrator/Inkscape 图层都行。验收标准一句话:**用户能改,你的(宿主 AI)也能改**——后续微调是改对象属性,不是重画
50
+ - 🔴 **编辑必须用图层分离的工具**:在 PPT/WPS/Illustrator/Inkscape 里按「图层/组合」组织——每个模块、箭头、标签各自独立成层(PPT 用单独形状或组合、SVG 用 `<g>` 分组、位图软件用独立图层),禁止把所有元素糊成一个扁平对象或直接在扁平层上改像素
51
+ - **首选路——比照着重绘**:拿最终确认版图,用本地代码/工具**照着画一遍**——如 python-pptx 生成形状化 PPTX、或写结构化 SVG(每个模块/箭头/标签一个元素),画完与确认版逐项比对、不一致就改,迭代到一致为止。参考做法:<https://github.com/icebird1998/scientific-illustifier>(宿主自行阅读,按本机工具链取舍)
52
+ - **退路——描摹**:本机没有可编程矢量工具链、或时间紧时,可以用 vtracer 等把最终版描摹成矢量(`pf export svg` 即此路)。但必须**先核对再交付**:① 数值/标签与最终版一致(数据图数值差不多即可,但刻度对应关系要对);② 比例、模块对应关系正确;③ 交付时明确告知「描摹产物,文字已变为路径、不可直接编辑,改内容需回到重绘或重出图」——不许把描摹件当「可编辑矢量」宣称
53
+ - 宿主连描摹工具都没有时:**明示用户「做不了矢量版」**,交付确认版 PNG 收尾
54
54
 
55
55
  **交付物**:矢量文件 + 一句「哪些元素可以直接改」(如「每个方框、箭头、文字都是独立形状,可拖动/改字/改色」);`pf-ledger.md` 补一行,标注本地生成、零 API 消耗。
56
56
 
57
57
  ---
58
58
 
59
+ ## 🔴 阶段 6:每轮交付与台账(每轮结束必交,用户随时可查)
60
+
61
+ 每次出图 / 优化 / 批处理结束,在用户工作目录建 `promptfigure-out/`,**每轮交付一个新版本文件夹**(v1 → v2 → v3…),协议全文见 `references/deliverables-ledger.md`,五条硬性要求:
62
+
63
+ 1. **本轮清单**:round-vN.md 列出本轮每张图——图种 / 档位 / 版本 / 本机真实路径 / 插入位置
64
+ 2. **插入位置(两段边界)**:每张图标出插在原文哪两段之间——**上一段最后一句 + 「……」 + 下一段第一句**,用户一眼定位
65
+ 3. **上下文与引用**:用了哪几段明确到 §¶;上下文只放**首句 + 「……」 + 尾句**;用了本地表格/数据/代码文件一律给**引用链接不内联内容**
66
+ 4. **图片版本**:文件名带 `-vN`,旧版永不覆盖,随时可回溯对比
67
+ 5. **两份演进文档**:`paper-with-figures.md`(原文结构 + 已插图,无关段落省略,每次更新同一个)与 `final/paper-final.md`(最终论文版本,附按用户文档格式的可打开副本:Word→docx、LaTeX→tex、WPS→docx)
68
+
69
+ **最终成稿流程**(用户说「定稿」时):先提醒核对数据是否更新 → 用户确认后才 premium 定稿 → 定稿后必问矢量图(提醒:本地 AI 重绘、token 贵、速度慢,比赛/数模默认不做;确认做则按元素分层重绘成可编辑矢量,应用按用户偏好)。
70
+
71
+ 🔴 **CLI 优先**:全程走 `pf`(或 REST 直连)沉淀状态,GUI 只留给人看图和点审批——插件的门禁与留痕都挂在 CLI 上。
72
+
73
+ ---
74
+
59
75
  ## 🔴 草稿策略:低文字密度 + 科研风格基线(2026-09-25 实测定规)
60
76
 
61
77
  standard 档的乱码率随**卡面文字量**上升:实测说明性小字是乱码重灾区
@@ -270,5 +286,6 @@ curl -s https://promptfigure.top/downloads/promptfigure-api.version.json
270
286
  | `references/api-contract.md` | 完整契约、网页工作流 4 步、多语言示例、批处理、WAF |
271
287
  | `references/troubleshooting.md` | 润色失败、WAF 403、balance 滞后、出图质量差 |
272
288
  | `references/document-workflow.md` | 用户给了 `.tex` / `.docx` / `.md` 文稿要配图:怎么定位插图位、从上下文写 prompt、插回文档;LaTeX 编译环境探测与官方下载指引(MiKTeX/TeX Live/TinyTeX/Tectonic/Overleaf) |
289
+ | `references/deliverables-ledger.md` | **每轮交付**:round-vN.md 清单/插入位置/上下文引用、paper-with-figures.md 演进版、final/ 最终论文版本与格式副本、最终成稿流程 |
273
290
  | `references/figure-upgrade-workflow.md` | 用户要**优化已有图表**或**整文批量升级**:结果图数据溯源+本地重绘、示意图 AI 升级、结构组合、单图精修/整文批处理两种模式、figure-ledger.json 追溯台账 |
274
291
  | `references/proactive-upgrade.md` | 用户给的是 **PDF/WPS**(非 LaTeX)、说不出哪里插图要你**主动建议**、要从**原始数据**推演配图、或想参考顶会/SCI 论文的图学风格:PDF 解析、MCM 插图位惯例、四步管线(分析→推演→提示词→迭代)、refs/ 风格库与合规红线 |
@@ -0,0 +1,119 @@
1
+ # 每轮交付与台账(round deliverables & ledger)
2
+
3
+ > 场景:每次用 promptFigure 出图 / 优化图片 / 整文批处理结束后,宿主 AI 必须按本文件产出结构化交付。
4
+ > 目的:用户随时能回答三个问题——**这轮做了什么图、图插在原文哪里、用了什么上下文/数据**。
5
+ > 🔴 本文件是硬性协议:缺任何一项 = 交付不完整。CLI 优先——全程用 `pf` 命令沉淀状态,GUI 只留给人「看一眼 / 点审批」。
6
+
7
+ ---
8
+
9
+ ## 0. CLI 优先原则(2026-09-25 定规)
10
+
11
+ - 出图、核验、审批、定稿全链路都有 CLI:`pf open → craft → render → qa → review resolve → premium`,**能用 CLI 就用 CLI**
12
+ - GUI 只用于两件事:人亲眼看图、人点审批。插件的门禁与留痕都挂在 CLI 上,走 CLI 的每一步都可审计
13
+ - 每轮结束的交付目录里,路径一律引用**用户本机真实路径**(相对当前交付目录优先,跨目录用绝对路径),禁止只给「见图库」这类指不到文件的话
14
+
15
+ ---
16
+
17
+ ## 1. 交付目录结构(每一轮 = 一个新文件夹)
18
+
19
+ 在**用户当前工作目录**(论文旁边)建 `promptfigure-out/`,每轮交付新建递增版本文件夹:
20
+
21
+ ```
22
+ promptfigure-out/
23
+ ├── v1/ ← 第 1 轮交付(每次交付新建一个,v1 → v2 → v3…)
24
+ │ ├── round-v1.md ← 本轮反馈(见 §2 必含项)
25
+ │ └── figures/ ← 本轮产出的图(文件名带版本号)
26
+ │ ├── fig-method-v1.png
27
+ │ └── fig-method-v2.png ← 改版后重新出,旧版保留可回溯
28
+ ├── v2/round-v2.md ← 第 2 轮……
29
+ ├── paper-with-figures.md ← 不断演进的「论文 + 已插图」版(见 §3)
30
+ └── final/ ← 最终论文版本(见 §4,仅最终成稿时建)
31
+ ├── paper-final.md
32
+ └── paper-final.docx ← 格式副本,按用户原文档格式(见 §4)
33
+ ```
34
+
35
+ - 版本号判断:`ls promptfigure-out/` 取最大 N + 1;用户已有自己的目录约定时听用户的
36
+ - `figures/` 里的图**永不覆盖**:同一张图的每个版本都是独立文件(`-v1/-v2/…`),旧版要能随时打开对比
37
+
38
+ ---
39
+
40
+ ## 2. round-vN.md 必含项(本轮反馈)
41
+
42
+ 模板(每轮照此填,没有的项目写「无」并说明原因,禁止静默省略):
43
+
44
+ ```markdown
45
+ # 第 N 轮交付 · YYYY-MM-DD HH:mm
46
+
47
+ ## 本轮清单
48
+ | # | 图 | 图种 | 档位 | 版本 | 本机路径 | 插入位置(§¶) | 状态 |
49
+ |---|---|---|---|---|---|---|---|
50
+ | 1 | 方法流程图 | pipeline | premium | v2 | figures/fig-method-v2.png | §2 ¶1 ↔ §2 ¶2 之间 | 已审批 |
51
+
52
+ ## 插入位置(图放在原文哪两段之间)
53
+ 逐张图给出——**上一段最后一句 + 「……」 + 下一段第一句**,让用户一眼定位:
54
+
55
+ > ……la optimización por enjambre de partículas ajusta automáticamente los principales parámetros.……La estrategia de aumento de datos incluye recorte aleatorio, jitter de color y deformación elástica.
56
+ > (图 1 插在上述两句之间,即 §2 ¶1 末 ↔ §2 ¶2 首)
57
+
58
+ - 自然段为粒度(¶),不用句号硬切;原文没有下一段时注明「§2 段末,文末」
59
+
60
+ ## 所用上下文(只放首尾句,中间省略)
61
+ - 原文上下文:「首句……尾句」(禁止整段贴入;用了哪几段就列哪几条,§¶ 标清楚)
62
+ - 引用范围声明:本次生成具体使用了 §2 ¶1–¶2(明确到段,供用户核对)
63
+
64
+ ## 数据与引用
65
+ - 本地表格/数据文件:[table1.csv](../data/table1.csv)、[run_exp2.m](../code/run_exp2.m) —— **只给引用链接,不内联内容**
66
+ - 参考图:refDataUrl(本地图 /path/to/ref.png)或 refUrl(https://…);用了就标,没用写「无」
67
+
68
+ ## 优化前 → 优化后(仅「优化已有图」任务)
69
+ | 图 | 优化前 | 优化后 | 改了什么 | 所用上下文(首尾句) |
70
+ |---|---|---|---|---|
71
+ | 原图1(曲线组) | figures/orig/fig1-old.png | figures/fig1-v1.png | 色板改语义化、字号 8pt、去 3D | 「首句……尾句」 |
72
+ ```
73
+
74
+ **三条填写铁律**:
75
+ 1. **上下文只放首句 + 尾句,中间一律省略号**——整段进 MD 会让用户无法快速审阅,也让版本 diff 爆炸
76
+ 2. **表格 / 代码 / 数据文件一律引用链接,禁止内联内容**——内联会让 MD 迅速腐烂、版本更新时无法对账;要「看见这轮用了什么」,点链接就是
77
+ 3. **每张图必须看得到版本**(文件名 `-vN` + 清单里的版本列 + 状态列)——版本是回溯和 diff 的唯一坐标
78
+
79
+ ---
80
+
81
+ ## 3. paper-with-figures.md(不断演进的呈现版)
82
+
83
+ - 结构 = 用户原文的章节树;**本轮涉及的段落**照录,**不涉及的段落**一律省略为一行:`……(§3 全文见原文)`
84
+ - 每张图插在自己的插入位置(§2 ¶1 ↔ ¶2 之间),图片用相对路径引用 vN 文件夹里的真实文件
85
+ - 每次交付**更新同一个文件**(或在文件名带版本 `paper-with-figures.vN.md` 保留历史)——用户随时打开这一个文件就能看到「论文现在长什么样」
86
+
87
+ ---
88
+
89
+ ## 4. final/ 最终论文版本
90
+
91
+ 用户要求「最终成稿 / 定稿」时才建,包含:
92
+
93
+ 1. `final/paper-final.md`——最终呈现版(全部已审批图就位、引用与上下文清单汇总)
94
+ 2. `final/paper-final.<用户格式>`——**格式副本,按用户原文档格式来**:
95
+ - Word/.docx → 交付 .docx(有 pandoc/docx 工具就用;无工具要明说「做不了格式副本,交付 MD」)
96
+ - LaTeX/.tex → 交付 .tex(图用 `\includegraphics` 引用真实路径,结构可编译)
97
+ - WPS → 交付 .docx(WPS 可直接打开)
98
+ - 🔴 **副本必须能正常打开**:交付前自己验证(文件非零、结构完整、能找到图);验证不了就明说,禁止交一个打不开的坏副本
99
+
100
+ ---
101
+
102
+ ## 5. 最终成稿流程(用户说「定稿 / 最终版」时按此走)
103
+
104
+ 1. **先提醒核对**:提醒用户「数据有没有更新?要不要重新跑一次核验?」——用户明确确认后,才进入 premium 最终定稿
105
+ 2. **确认高级定稿**:向用户复述「将消耗 premium 档额度出高清定稿,N 张」并取得确认;未确认不动手
106
+ 3. **定稿后问矢量图**(衔接 SKILL.md 阶段 5):
107
+ - 提醒成本:矢量图由**用户自己的 AI 本地重绘**,token 消耗大、速度慢
108
+ - 🔴 **比赛 / 数学建模 / 学术会议竞赛:默认不做**,速度优先;只有时间充裕才做
109
+ 4. **用户确认做矢量图时**:首选**比照着重绘**——拿最终版用本地工具照着画,每个模块、箭头、标签独立成对象;🔴 **必须用支持图层分离的工具编辑**:PPT/WPS 用单独形状或组合、SVG 用 `<g>` 分组、Illustrator/Inkscape 用独立图层——一把糊成扁平对象 = 不可编辑,返工。应用按用户主要偏好来(PPT / WPS / 其他)。**退路=描摹**(vtracer 等):先核对数值与比例(数值差不多即可、对应关系必须对),交付时明确告知「描摹件、文字已变路径不可直接编辑」——不许当可编辑矢量宣称
110
+
111
+ ---
112
+
113
+ ## 6. 自检清单(每轮交付前过一遍)
114
+
115
+ - [ ] 版本文件夹新建(vN 递增)、图带版本号、旧版未覆盖
116
+ - [ ] round-vN.md 五项齐:清单 / 插入位置(两段边界句)/ 上下文(首尾句)/ 数据引用(链接)/ 优化前后(如适用)
117
+ - [ ] paper-with-figures.md 已更新到含本轮所有图
118
+ - [ ] 路径全部指得到真实文件(md 里的链接点得开)
119
+ - [ ] final/ 仅在最终成稿时出现,格式副本已验证可打开
@@ -10,14 +10,16 @@
10
10
 
11
11
  | 需求 | 判据 | 路线 |
12
12
  |---|---|---|
13
- | **A1. 结果图美化**(曲线/柱状/热图/箱线…) | 图上带**精确数值**(刻度、柱高、数据点) | 🔴 **绝不走 AI 生图**。数据溯源 + 本地重绘(§3)——AI 画图模型必画错数字,坐标必须是真数据 |
13
+ | **A1. 结果图美化**(曲线/柱状/热图/箱线…) | 图上带**精确数值**(刻度、柱高、数据点) | 照最终结果重绘(§3):以我们最终给出的成图为基准重绘——期刊图大多也不是 MATLAB 原生生成的;**验收 = 数值与基准一致(差不多即可)+ 比例/对应关系正确**。能拿到原始数据就优先溯源(更稳),拿不到就以最终版成图逐点核对 |
14
14
  | **A2. 示意图升级**(用户已画的结构/流程/机制图,嫌丑) | 图上只有方块、箭头、标签,无数值 | AI 升级:结构照搬 + 视觉升级指令(§4.2),可选参考图 |
15
15
  | **A3. 结构组合**(多张小图合并成一张大图) | 多张 A1 或 A2 要拼版 | A1 部分本地 matplotlib subplot 拼版;A2 部分合并成一个多 panel prompt(§4.1) |
16
16
  | **B. 代码画不出的图**(流程图/机制图/神经网络图/算法示意) | 用户只能嘴上说 | promptFigure API(§4),本技能的主场 |
17
17
 
18
18
  **一句话分流:数字支撑 → 本地画;结构故事 → API 画;一张图里混着两者 → 拆开,各走各的,最后拼版。**
19
19
 
20
- > 🔴 **「把终稿变成可编辑矢量/PPT 版」不属于以上任何一类**——那不是 matplotlib 的活,也不是出图 API 的活。走 `SKILL.md` **阶段 5**:终稿交付后先问用户要不要,比赛/数模默认不做(速度优先),时间充裕才由**宿主 AI 用本地的矢量工具/代码照着重绘**(禁止描摹,必须每个元素可编辑)。§3 的 matplotlib 只负责 A1 数据图的真数据重绘(防数字造假),不碰任何矢量转换。
20
+ > 🔴 **每轮结束必须交付台账**:新建 `promptfigure-out/vN/round-vN.md`——本轮清单(图种/档位/版本/本机路径/插入位置)、每张图的插入位置(上段末句 + …… + 下段首句)、所用上下文(只放首尾句)、数据文件只给引用链接;「优化前 → 优化后」对比也落在这里。全文协议见 `deliverables-ledger.md`。
21
+
22
+ > 🔴 **「把终稿变成可编辑矢量/PPT 版」不属于以上任何一类**——走 `SKILL.md` **阶段 5**:终稿交付后先问用户要不要,比赛/数模默认不做(速度优先),时间充裕才做。**首选**宿主 AI 比照最终版用本地工具重绘(每元素独立对象、用图层分离工具编辑);**退路**可描摹,但须先核对数值/比例并告知「描摹件文字不可编辑」。§3 的本地重绘 = 数据图的美化路径,不碰矢量转换。
21
23
 
22
24
  ---
23
25
 
@@ -79,9 +81,14 @@ SKILL.md 的「零反问」铁律**约束的是对 API 的出图过程**——
79
81
 
80
82
  ---
81
83
 
82
- ## 3. 代码图数据溯源(A1 类的唯一正路)
84
+ ## 3. 数据图美化(照最终结果重绘)
83
85
 
84
- > 本节 = **A1 数据图专用**(曲线/柱状/热图等带真数值的图)。用 matplotlib 的唯一理由是「坐标必须是真数据」;它不是通用美化手段,更不是矢量转换手段——「照终稿做可编辑矢量版」见 `SKILL.md` 阶段 5。
86
+ > 本节 = **A1 数据图专用**(曲线/柱状/热图等带真数值的图)。2026-09-25 松口(原规则太死):
87
+ > **数据图照我们最终给出的成图重绘即可**——期刊图大多也不是 MATLAB 原生生成的,只要
88
+ > **① 数值与最终版一致(差不多即可)② 比例与对应关系正确**,就达标。能拿到原始数据
89
+ > (脚本/数据文件)时优先按真数据画(更稳、更精确);拿不到就以最终版成图为基准逐点
90
+ > 核对,核对记录写进 round-vN.md。matplotlib 只是美化手段,不是矢量转换手段——
91
+ > 「照终稿做可编辑矢量版」见 `SKILL.md` 阶段 5。
85
92
 
86
93
  **为什么必须溯源**:结果图上的文字往往很小,视觉模型抄轴刻度、抄数据点**必然出错**;靠 OCR 抄数出来的图是假的。唯一可靠路径是找到原始数据,用真数据重绘。
87
94
 
@@ -81,10 +81,10 @@ pf doctor # 体检:TeX 引擎 / API key / 本地服务 / 当前
81
81
  pf audit # 审计一键可查:绕门记录(craft.forced/gate_bypass/review.forced)+ 计费兜底
82
82
  # 每条带理由;接手别人项目/怀疑历史版本可信度时先跑它
83
83
  pf export svg <figId> # 最新版 PNG → 可缩放 SVG(vtracer 描摹,draft/high 两档)
84
- # ⚠️ 描摹 ≠ 可编辑矢量:文字全变路径,不可编辑不可搜索
85
- # 要「每个元素都能改」的可编辑矢量版(PPT 形状/独立 SVG 元素),
86
- # 让宿主 AI 用本地工具照终稿重绘(如 python-pptx/结构化 SVG,
87
- # 参考 github.com/icebird1998/scientific-illustifier)——禁止拿本命令的输出顶替
84
+ # ⚠️ 描摹件:文字全变路径、不可直接编辑——仅作退路。交付前必须核对
85
+ # 数值与比例(数值差不多即可、对应关系必须对),并告知用户是描摹件
86
+ # 首选:让宿主 AI 比照终稿用本地工具重绘(python-pptx 形状 / 结构化 SVG),
87
+ # 每元素独立成对象,用图层分离的工具编辑(参考 github.com/icebird1998/scientific-illustifier)
88
88
  # 首次用报缺依赖时:npm i @visioncortex/vtracer(纯 WASM 可商用)
89
89
  ```
90
90
 
@@ -375,6 +375,37 @@ pf craft --at "§3.2 ¶2" --figure-type pipeline \
375
375
  - **路径写法**:Git Bash 的 `/c/...`、Windows 的 `C:\...`、POSIX 的 `/home/...` 都能用;
376
376
  但 craft --out 建议用相对路径(当前目录下),最不容易踩环境差异。
377
377
 
378
+ ## 每轮交付与台账(每轮结束必交,CLI 优先)
379
+
380
+ **CLI 优先**:出图、核验、审批、定稿全走 `pf` 命令(`pf next` 永远告诉你下一步);
381
+ GUI 只留给人两件事——亲眼看图、点审批。插件的门禁与留痕都挂在 CLI 上,
382
+ 走 CLI 的每一步在 `events.jsonl` 里可审计;无头环境(SSH/容器/CI)本来就全 CLI。
383
+
384
+ 每轮交付在**用户工作目录**建 `promptfigure-out/`,每轮一个新版本文件夹 `vN/`(v1 → v2…):
385
+
386
+ ```
387
+ promptfigure-out/
388
+ ├── vN/
389
+ │ ├── round-vN.md ← 本轮反馈(下面的必含项)
390
+ │ └── figures/ ← 本轮图(副本或引用,文件名带 -vN)
391
+ ├── paper-with-figures.md ← 论文+已插图的演进版(无关段落省略,每次更新同一个)
392
+ └── final/paper-final.md + 格式副本 ← 最终论文版本(定稿时才建)
393
+ ```
394
+
395
+ **round-vN.md 必含**(与 promptfigure-api skill 的 deliverables-ledger.md 同一协议):
396
+ 1. **本轮清单**:每张图——figureId / 图种 / 档位 / 版本 / 本机真实路径(本插件即
397
+ `~/.promptfigure/projects/<docId>/figures/<figureId>/vN.png`)/ 插入位置(§¶)
398
+ 2. **插入位置(两段边界)**:上一段最后一句 + 「……」 + 下一段第一句,用户一眼定位
399
+ 3. **所用上下文**:用了哪几段明确到 §¶;上下文只放**首句 + 「……」 + 尾句**;
400
+ 数据/表格/代码文件一律给引用链接,不内联内容
401
+ 4. **图片版本**:每张图的每个版本独立文件(vN),旧版永不覆盖
402
+ 5. **优化前→优化后**(优化任务):原图路径 vs 新图路径 + 改了什么 + 所用上下文(首尾句)
403
+
404
+ **最终成稿流程**(用户说「定稿」):提醒核对数据是否更新 → 用户确认后才 premium 定稿 →
405
+ 定稿后必问矢量图(本地 AI 重绘、token 贵、速度慢;比赛/数模默认不做;确认做则按元素
406
+ 分层重绘成可编辑矢量,PPT/WPS 按用户偏好)——完整协议见 promptfigure-api skill 的
407
+ `references/deliverables-ledger.md`。
408
+
378
409
  ## 事件回放
379
410
 
380
411
  `~/.promptfigure/projects/<docId>/events.jsonl` 只追加不改写 —— 审批历史、
package/src/craft.mjs CHANGED
@@ -547,6 +547,8 @@ export function craftPrompt(input = {}) {
547
547
 
548
548
  // —— 5.5) 多轮精修块:上一版核验出的缺陷逐条拼接为硬性修正(2026-09-21 定规)——
549
549
  // 不重掷骰子:上一版画对的部分原样保留,本块只钉死上一版的失败点。
550
+ // 🔴 2026-09-25 双智能体实测:修正文本此前无护栏,被图模型当卡面文字印上图
551
+ // (实测 "Q2/Baseline" 字样上图;宿主被迫整体弃用 --fixes)。护栏=显式声明非图面文字。
550
552
  const fixList = String(fixes || "")
551
553
  .split(/[;;]/)
552
554
  .map((s) => s.trim())
@@ -554,8 +556,8 @@ export function craftPrompt(input = {}) {
554
556
  if (fixList.length) {
555
557
  promptParts.push(
556
558
  lang === "zh"
557
- ? `上一版修正(逐条都是硬性要求,必须全部满足):${fixList.map((f, i) => `(${i + 1}) ${f}`).join(";")}。`
558
- : `Corrections from the previous attempt — each is a HARD requirement, satisfy all of them: ${fixList.map((f, i) => `(${i + 1}) ${f}`).join("; ")}.`
559
+ ? `上一版修正(以下全部是生成约束,**不是图面文字,严禁印到图上**;逐条必须满足):${fixList.map((f, i) => `(${i + 1}) ${f}`).join(";")}。`
560
+ : `Corrections from the previous attempt — these are GENERATION CONSTRAINTS ONLY, **never print them onto the figure**; each is a HARD requirement, satisfy all of them: ${fixList.map((f, i) => `(${i + 1}) ${f}`).join("; ")}.`
559
561
  );
560
562
  }
561
563
 
package/src/server.mjs CHANGED
@@ -121,6 +121,24 @@ export function startServer({ port, registerDaemon = true }) {
121
121
  const body = await readBody(req);
122
122
  if (body.token !== guiToken) return json(res, 403, { error: "bad session token" });
123
123
  const doc = u.searchParams.get("doc");
124
+ // 🔴 QA 门禁对齐 CLI(2026-09-25 双智能体实测发现的放水后门):
125
+ // GUI 通过审批此前不查 QA——AI 可以自己先点通过再补 QA,CLI 的硬闸被 GUI 绕过。
126
+ // 现在 approve 与 CLI 同尺:最新版 QA 通过 + 量化依据 + 图文件存在,缺一拒绝。
127
+ // 驳回/反馈不受限(它们不是放水动作)。
128
+ if (body.status === "approved") {
129
+ const meta = readMeta(doc);
130
+ const fig = meta?.figures?.[body.figureId];
131
+ if (fig) {
132
+ const { qaState, isQuantifiedNote } = await import("./quality.mjs");
133
+ const qs = qaState(fig);
134
+ if (!qs.fresh || qs.verdict !== "pass" || !isQuantifiedNote(qs.qa?.note)) {
135
+ return json(res, 409, {
136
+ error: "qa_required",
137
+ message: `图 ${body.figureId} 还没有通过的 QA 核验记录——先在终端跑 pf qa ${body.figureId} 亲眼核验并 --pass 写回,再来通过审批`,
138
+ });
139
+ }
140
+ }
141
+ }
124
142
  const r = setStatus(doc, body.figureId, body.status, body.note, "user");
125
143
  return json(res, 200, { ok: true, review: r });
126
144
  }
package/web/app.js CHANGED
@@ -407,21 +407,27 @@ function paintFigures() {
407
407
  // ---------- 审批控件(侧栏卡片与浮层共用 —— 审批永远针对具体的图) ----------
408
408
  function reviewControls(f) {
409
409
  const rev = state.review[f.figureId] || { status: "pending", note: "" };
410
+ const byLabel = rev.by === "ai" ? '<span class="by-ai" title="这条判定是 AI 写的,不是你——请自己看一眼图再改判">⚠ AI 判定</span>'
411
+ : rev.by === "user" ? '<span class="by-user" title="你本人点的">本人</span>' : "";
410
412
  const box = document.createElement("div");
411
413
  box.className = "review-ctl";
412
414
  box.innerHTML = `
413
- <div class="meta">${badgeOf(rev.status)} <b>${escapeHtml(f.figureId)}</b> @${escapeHtml(f.at)} · ${escapeHtml(latestVer(f).model)}${f.versions.length > 1 ? ` · ${f.versions.length} 版` : ""}</div>
415
+ <div class="meta">${badgeOf(rev.status)} <b>${escapeHtml(f.figureId)}</b> @${escapeHtml(f.at)} · ${escapeHtml(latestVer(f).model)}${f.versions.length > 1 ? ` · ${f.versions.length} 版` : ""}${byLabel ? ` · 审批来源 ${byLabel}` : ""}</div>
414
416
  ${rev.note ? `<div class="meta">意见:${escapeHtml(rev.note)}</div>` : ""}
415
- <textarea class="note-box" placeholder="哪里不对?(可选,AI 会读到)"></textarea>
417
+ <textarea class="note-box" placeholder="写哪里不对或建议(AI 会读到;点「驳回」请写具体缺陷)"></textarea>
416
418
  <div class="btn-row">
417
419
  <button class="btn ok" data-act="approve">通过</button>
418
420
  <button class="btn no" data-act="reject">驳回</button>
419
421
  </div>
422
+ <div class="btn-hint">通过后 AI 才能出高清定稿 · 驳回 = AI 按意见重画 · 反馈 = 只提建议、图仍待你审批</div>
420
423
  <div class="btn-row"><button class="btn ghost" data-act="feedback">提交反馈给 AI</button></div>`;
421
424
  box.querySelectorAll("[data-act]").forEach((btn) => {
422
425
  btn.onclick = async () => {
423
426
  const note = box.querySelector(".note-box").value.trim();
424
427
  const act = btn.dataset.act;
428
+ // 驳回不带意见 = AI 只能盲改(精修状态机拿不到具体缺陷)——拦一道
429
+ if (act === "reject" && !note &&
430
+ !confirm("驳回但没写意见 —— AI 只能盲改。\n建议在上方写清楚哪里不对;确定要空意见驳回?")) return;
425
431
  const status = act === "approve" ? "approved" : act === "feedback" ? "pending" : "rejected";
426
432
  const resp = await fetch(`/api/review?doc=${DOC}`, {
427
433
  method: "POST",
@@ -429,8 +435,8 @@ function reviewControls(f) {
429
435
  body: JSON.stringify({ token: TOKEN, figureId: f.figureId, status, note }),
430
436
  });
431
437
  const data = await resp.json();
432
- if (!resp.ok) return toast("提交失败:" + (data.error || resp.status));
433
- toast(act === "approve" ? "已通过,AI 可以出定稿了" : act === "feedback" ? "反馈已提交,AI 会读到" : "已驳回");
438
+ if (!resp.ok) return toast((data.message || data.error) ? "提交失败:" + (data.message || data.error) : "提交失败:" + resp.status);
439
+ toast(act === "approve" ? "已通过,AI 会接着出高清版" : act === "feedback" ? "反馈已提交,AI 会读到" : "已驳回,AI 会按你的意见重画");
434
440
  await loadState(); paintAll();
435
441
  // 审批队列开着 → 这张已离开队列,原位自动落到下一张
436
442
  if (!$("#queue").classList.contains("hidden")) renderQueue();
package/web/style.css CHANGED
@@ -136,6 +136,11 @@ main { flex: 1; display: flex; min-height: 0; }
136
136
  .btn.no { background: var(--red-line); color: #fff; }
137
137
  .btn.no:hover { filter: brightness(1.08); }
138
138
  .btn.ghost { background: #eef1f6; color: var(--ink); }
139
+ /* 审批按钮后果说明(三个按钮的区别一眼可见,别让用户猜) */
140
+ .btn-hint { font-size: 11px; color: var(--ink2); margin-top: 6px; line-height: 1.5; }
141
+ /* 审批来源:AI 自批的图必须让人一眼看出来(监督闭环) */
142
+ .by-ai { background: #fde8e8; color: #9b2c2c; border-radius: 8px; padding: 0 6px; font-weight: 600; }
143
+ .by-user { background: #e8f3ec; color: #1c6b3a; border-radius: 8px; padding: 0 6px; }
139
144
 
140
145
  .evt { font-size: 12px; padding: 6px 0; border-bottom: 1px dashed var(--line); color: var(--ink2); }
141
146
  .evt b { color: var(--ink); font-weight: 600; }