dsh-ppt-studio 1.1.0
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.
- package/LICENSE +21 -0
- package/README.md +480 -0
- package/agent-presets/ppt/agent.cordis.yml +308 -0
- package/agent-presets/ppt/preset.yml +3 -0
- package/cordis.patch.yml +29 -0
- package/docs/00-/350/256/276/350/256/241/346/272/220.md +537 -0
- package/docs/01-/351/234/200/346/261/202/344/270/216/347/233/256/346/240/207.md +136 -0
- package/docs/02-/346/212/200/346/234/257/346/212/245/345/221/212.md +483 -0
- package/docs/03-/346/233/264/346/226/260/346/227/245/345/277/227.md +2898 -0
- package/docs/04-/350/267/257/347/272/277/345/233/276/344/270/216/351/207/214/347/250/213/347/242/221.md +113 -0
- package/docs/05-/350/277/255/344/273/243/346/265/201/347/250/213.md +210 -0
- package/docs/06-/350/257/204/345/256/241/344/270/216/346/265/213/350/257/225.md +296 -0
- package/docs/fidelity-report.md +225 -0
- package/examples/fx/fx-mini/deck.yaml +39 -0
- package/examples/fx/fx-mini/pages/01.yaml +6 -0
- package/examples/fx/fx-mini/pages/02.yaml +2 -0
- package/examples/fx/fx-mini/pages/03.yaml +6 -0
- package/examples/fx/fx-pro/deck.yaml +48 -0
- package/examples/fx/fx-pro/pages/01_cover.yaml +40 -0
- package/examples/fx/fx-pro/pages/02_arch.yaml +55 -0
- package/examples/fx/fx-pro/pages/03_table.yaml +20 -0
- package/examples/fx/fx-pro/pages/04_chart.yaml +40 -0
- package/examples/fx/fx-pro/pages/05_timeline.yaml +71 -0
- package/examples/fx/fx-pro/pages/06_longtext.yaml +13 -0
- package/examples/fx/fx-pro/pages/07_safearea.yaml +33 -0
- package/examples/fx/fx-pro/pages/08_contrast.yaml +22 -0
- package/examples/fx/fx-pro/pages/09_custgeom.yaml +32 -0
- package/examples/fx/fx-pro/pages/10_numbers.yaml +25 -0
- package/examples/fx/fx-pro/pages/11_section.yaml +20 -0
- package/examples/fx/fx-pro/pages/12_summary.yaml +57 -0
- package/examples/fx/fx-pro/preview/01_pages_01_cover.html +1 -0
- package/examples/fx/fx-pro/preview/02_pages_02_arch.html +3 -0
- package/examples/fx/fx-pro/preview/03_pages_03_table.html +1 -0
- package/examples/fx/fx-pro/preview/04_pages_04_chart.html +3 -0
- package/examples/fx/fx-pro/preview/05_pages_05_timeline.html +2 -0
- package/examples/fx/fx-pro/preview/06_pages_06_longtext.html +4 -0
- package/examples/fx/fx-pro/preview/07_pages_07_safearea.html +2 -0
- package/examples/fx/fx-pro/preview/08_pages_08_contrast.html +1 -0
- package/examples/fx/fx-pro/preview/09_pages_09_custgeom.html +1 -0
- package/examples/fx/fx-pro/preview/10_pages_10_numbers.html +1 -0
- package/examples/fx/fx-pro/preview/11_pages_11_section.html +1 -0
- package/examples/fx/fx-pro/preview/12_pages_12_summary.html +1 -0
- package/examples/fx/fx-pro/preview/deck.html +10 -0
- package/examples/fx/fx-pro/preview/layout.json +2325 -0
- package/examples/fx/fx-pro/preview/measured.json +814 -0
- package/examples/fx/fx-pro.pptx +0 -0
- package/examples/fx/ren-single/01.png +0 -0
- package/examples/fx/ren-spliced/01.png +0 -0
- package/examples/fx/ren-spliced/03.png +0 -0
- package/examples/fx/seed.pptx +0 -0
- package/examples/fx/single.pptx +0 -0
- package/examples/fx/spliced.pptx +0 -0
- package/examples/smoke/deck.yaml +26 -0
- package/examples/smoke/imported/deck.yaml +30 -0
- package/examples/smoke/imported/import-styles.json +126 -0
- package/examples/smoke/imported/pages/slide_01.yaml +31 -0
- package/examples/smoke/imported/pages/slide_02.yaml +38 -0
- package/examples/smoke/imported/pages/slide_03.yaml +55 -0
- package/examples/smoke/imported/preview-rt/01_pages_slide_01.html +1 -0
- package/examples/smoke/imported/preview-rt/02_pages_slide_02.html +1 -0
- package/examples/smoke/imported/preview-rt/03_pages_slide_03.html +1 -0
- package/examples/smoke/imported/preview-rt/deck.html +1 -0
- package/examples/smoke/imported/preview-rt/layout.json +434 -0
- package/examples/smoke/imported/reference/previews/01.png +0 -0
- package/examples/smoke/imported/reference/previews/02.png +0 -0
- package/examples/smoke/imported/reference/previews/03.png +0 -0
- package/examples/smoke/imported/source.pptx +0 -0
- package/examples/smoke/media-test.png +0 -0
- package/examples/smoke/out-smoke.pptx +0 -0
- package/examples/smoke/pages/01_cover.yaml +27 -0
- package/examples/smoke/pages/02_content.yaml +42 -0
- package/examples/smoke/pages/03_chart.yaml +35 -0
- package/examples/smoke/preview/01_pages_01_cover.html +1 -0
- package/examples/smoke/preview/02_pages_02_content.html +1 -0
- package/examples/smoke/preview/03_pages_03_chart.html +1 -0
- package/examples/smoke/preview/deck.html +1 -0
- package/examples/smoke/preview/layout.json +378 -0
- package/lib/autodeclare.js +40 -0
- package/lib/commands.js +161 -0
- package/lib/crosscheck.js +300 -0
- package/lib/imgmeta.js +55 -0
- package/lib/index.js +239 -0
- package/lib/measurement.js +209 -0
- package/lib/msrender.js +123 -0
- package/lib/pptd/export-pptx.js +686 -0
- package/lib/pptd/import-pptx.js +774 -0
- package/lib/pptd/layout.js +209 -0
- package/lib/pptd/render-html.js +254 -0
- package/lib/pptd/schema.js +518 -0
- package/lib/pptd/svgCharts.js +147 -0
- package/lib/pptxPy.js +205 -0
- package/lib/preset-delivery.js +195 -0
- package/lib/preview-server.js +164 -0
- package/lib/router.js +165 -0
- package/lib/scaffold.js +315 -0
- package/lib/skill.js +174 -0
- package/lib/splice.js +219 -0
- package/lib/state.js +88 -0
- package/lib/surgical.js +369 -0
- package/lib/templates.js +400 -0
- package/lib/tools.js +955 -0
- package/lib/verify.js +828 -0
- package/lib/xmljs.js +112 -0
- package/lib/zips.js +117 -0
- package/package.json +81 -0
- package/scripts/audit-manual-facts.mjs +294 -0
- package/scripts/audit-template-fidelity.mjs +162 -0
- package/scripts/bench-m2.mjs +48 -0
- package/scripts/build-templates.mjs +63 -0
- package/scripts/build.mjs +14 -0
- package/scripts/build.sh +7 -0
- package/scripts/check-lib-freshness.mjs +70 -0
- package/scripts/check-preset.mjs +189 -0
- package/scripts/check-tracked-lf.mjs +84 -0
- package/scripts/dbg-import.mjs +13 -0
- package/scripts/dbg-media.mjs +10 -0
- package/scripts/dbg-tpl-inventory.mjs +23 -0
- package/scripts/dump-workflow-baseline.mjs +38 -0
- package/scripts/e2e-1.0.mjs +129 -0
- package/scripts/eval-skills-blind.mjs +91 -0
- package/scripts/eval-skills-score.mjs +129 -0
- package/scripts/export-orig-templates.ps1 +17 -0
- package/scripts/fixtures/workflow-baseline.json +300 -0
- package/scripts/fixtures.mjs +501 -0
- package/scripts/import-user-templates.mjs +60 -0
- package/scripts/install-desktop.mjs +312 -0
- package/scripts/install.mjs +209 -0
- package/scripts/migrate-templates-dualtrack.mjs +71 -0
- package/scripts/preflight-1.0.mjs +198 -0
- package/scripts/probe-asset-freshness.mjs +57 -0
- package/scripts/probe-effect-semantics.mjs +69 -0
- package/scripts/probe-reparse-safety.mjs +32 -0
- package/scripts/rebuild-templates-c11.mjs +69 -0
- package/scripts/regression-real.mjs +84 -0
- package/scripts/release-sync.mjs +425 -0
- package/scripts/shot-templates.mjs +49 -0
- package/scripts/smoke.mjs +2512 -0
- package/scripts/verify-bundle-install.mjs +281 -0
- package/scripts/verify-fresh-install.mjs +260 -0
- package/skills/ppt-studio-copy/SKILL.md +139 -0
- package/skills/ppt-studio-craft/SKILL.md +171 -0
- package/skills/ppt-studio-data/SKILL.md +173 -0
- package/skills/ppt-studio-manual/SKILL.md +104 -0
- package/templates/academic-white/deck.yaml +24 -0
- package/templates/academic-white/pages/_chart.yaml +43 -0
- package/templates/academic-white/pages/_compare.yaml +37 -0
- package/templates/academic-white/pages/_content.yaml +35 -0
- package/templates/academic-white/pages/_cover.yaml +28 -0
- package/templates/academic-white/pages/_ending.yaml +28 -0
- package/templates/academic-white/pages/_flow.yaml +61 -0
- package/templates/academic-white/preview.png +0 -0
- package/templates/academic-white/template.yaml +14 -0
- package/templates/business-blue/deck.yaml +28 -0
- package/templates/business-blue/pages/_chart.yaml +36 -0
- package/templates/business-blue/pages/_compare.yaml +45 -0
- package/templates/business-blue/pages/_content.yaml +80 -0
- package/templates/business-blue/pages/_cover.yaml +39 -0
- package/templates/business-blue/pages/_ending.yaml +32 -0
- package/templates/business-blue/pages/_flow.yaml +87 -0
- package/templates/business-blue/preview.png +0 -0
- package/templates/business-blue/template.yaml +14 -0
- package/templates/pitch-bold/deck.yaml +23 -0
- package/templates/pitch-bold/pages/_chart.yaml +32 -0
- package/templates/pitch-bold/pages/_compare.yaml +36 -0
- package/templates/pitch-bold/pages/_content.yaml +58 -0
- package/templates/pitch-bold/pages/_cover.yaml +31 -0
- package/templates/pitch-bold/pages/_ending.yaml +27 -0
- package/templates/pitch-bold/pages/_flow.yaml +46 -0
- package/templates/pitch-bold/preview.png +0 -0
- package/templates/pitch-bold/template.yaml +14 -0
- package/templates/tech-dark/deck.yaml +24 -0
- package/templates/tech-dark/pages/_chart.yaml +27 -0
- package/templates/tech-dark/pages/_compare.yaml +38 -0
- package/templates/tech-dark/pages/_content.yaml +51 -0
- package/templates/tech-dark/pages/_cover.yaml +30 -0
- package/templates/tech-dark/pages/_ending.yaml +25 -0
- package/templates/tech-dark/pages/_flow.yaml +80 -0
- package/templates/tech-dark/preview.png +0 -0
- package/templates/tech-dark/template.yaml +14 -0
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
# 01 · 需求与目标(活文档 · 每次迭代先读)
|
|
2
|
+
|
|
3
|
+
> 本文件回答"我们为什么做这个插件、要做到什么程度、已经走到哪、哪些地方可能打架"。
|
|
4
|
+
> 决策源:`docs/00-设计源.md`(537 行设计文档 + 决策记录表)。
|
|
5
|
+
> 更新约定:任何改变需求/目标/约束的改动,必须同时更新本文件与 `docs/03-更新日志.md`。
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 1. 初始需求(用户原话要点,2026-08 至 2026-09 逐步明确)
|
|
10
|
+
|
|
11
|
+
| # | 需求 | 形态 |
|
|
12
|
+
|---|---|---|
|
|
13
|
+
| R1 | 在 DeepSeek Harness 上做一个 **PPT 插件**:agent preset「PPT 工作室」= shipped **standard 预设全量功能** + 一条插件行 | 预设形态 |
|
|
14
|
+
| R2 | 用户提出 **PPT 相关任务**时进入**专用 PPT 工作流**;非 PPT 任务行为与标准模式完全一致 | 路由(双通道:语义 + `/ppt` 命令) |
|
|
15
|
+
| R3 | **四类任务全兼容**(差异化亮点):从头(from-scratch)/ 补完(augment)/ 修改(edit)/ 总结(summarize) | 任务形态 |
|
|
16
|
+
| R4 | **核心质量要求**(用户原话):"避免元素区块冲突"——即元素互相压盖/出界/溢出必须被防住 | 布局工程 |
|
|
17
|
+
| R5 | 复杂场景(长 deck 50+ 页 / 多源内容 / 严谨内容)要能做,且质量要可验证 | 审计门禁 |
|
|
18
|
+
| R6 | 用户提供的参考模板/素材要被尊重(风格与模板参考) | 素材/风格 |
|
|
19
|
+
| R7 | 交付物 = 可编辑 .pptx(+ 中间层工程),导出引擎可用性探测 | 交付 |
|
|
20
|
+
| R8 | 与现有生态(paper2ppt / PaperSpine)独立共存 | 边界 |
|
|
21
|
+
|
|
22
|
+
## 2. 目标(长期不变)
|
|
23
|
+
|
|
24
|
+
1. **一个可验证的 PPT 生产工作流**:产出质量由"数字门禁 + 视觉审阅"双轨保证,而不是靠运气。
|
|
25
|
+
2. **四类任务同一个中间层(PPTD)**:deck.yaml + pages/*.yaml + media/ 是唯一事实源,引擎可插拔。
|
|
26
|
+
3. **迭代友好**:每次改动有回归(smoke 断言集)、有文档(本目录)、有版本(semver + git)。
|
|
27
|
+
4. **元目标**:从"熟练工才能用得顺"进化到"人人可用"(用户测试反馈 3.3 的一句话总结)。
|
|
28
|
+
|
|
29
|
+
## 3. 演进脉络(已完成里程碑 → 目的)
|
|
30
|
+
|
|
31
|
+
| 版本 | 目的 | 主要内容 | 验证 |
|
|
32
|
+
|---|---|---|---|
|
|
33
|
+
| v0.1(MVP) | 跑通"中间层 → 渲染/校验/导出/导入"主链路 | pptd schema / render-html / verify / export-pptx / import-pptx / zips / xmljs;路由与命令面;preset 装配 | 初版 smoke |
|
|
34
|
+
| v0.2(P2–P12 修复) | 真实文件兼容 + 布局模型从"0 容忍"演进为**设计意图声明制** | 导入 P2 媒体丢失(UTF-16 WPS)/ P5 元素 ID 去重 / P6 截图缓存 / P9 roundRect+rotation / P10 箭头 marker / P12 中文换行禁则;`expectedOverlaps` 声明制、`role: decoration`、`overlapMode: lenient`;美学建议层(8 条非门禁)| 12→21 断言 |
|
|
35
|
+
| v0.2.x(Quick + 引擎 auto) | 低 token 快交付 + 明确引擎语义 | `/ppt quick` 语义/命令双触发;`engine auto=pptd` 写死并写入提示词/工具 | 25 断言 |
|
|
36
|
+
| v0.3.0(背景 + 本次反馈) | 背景图全链路 + 解决真实任务反馈的 8 个 ★ | 背景 image/solid 渲染/导出(p:bg)/导入三层识别;**safeArea**(D5);**autoDeclare 一键声明**(D2);**保守度量 + 导出阈值统一 + minFontSize 下限**(D4/E2);**out 绝对路径**(E1);**line bounds 自动推导**(D1);**ppt_schema/ppt_new**(B2);对比度/孤字建议(D6/D7) | 47 断言 + 19 页真实 deck 回归 |
|
|
37
|
+
|
|
38
|
+
**演进主线**(为什么每一步这么做):
|
|
39
|
+
- 先保主链路可跑 → 再用真实文件(WPS)逼出兼容性问题 → 用真实任务(产能 PPT 19 页)逼出**工具摩擦**(声明成本、度量偏差、安全区、自述缺失)→ 每个摩擦做"插件级修复",**不改用户工作流习惯**(声明制保留,只是给一键生成)。
|
|
40
|
+
- 原则:**严格性(错误门禁)不可降**;**使用成本必须降**。两者冲突时优先保严格性,用自动化降低成本。
|
|
41
|
+
|
|
42
|
+
## 4. 关键设计决策(已定,勿轻易推翻;推翻 = 必须更新本文件)
|
|
43
|
+
|
|
44
|
+
1. **中间层 = 自定义 PPTD v1**(独立实现,不依赖 Kimi 逆向生态)。
|
|
45
|
+
2. **重叠合法性 = 设计意图声明制**(expectedOverlaps 对照),不是元素类型制;**内容互压(content-collision)永远不可豁免**。
|
|
46
|
+
3. **双轨审阅**:数字门禁(render→verify,ERROR 清零)+ 视觉审阅(shot + read_image);估算档已被证明会漏报 → 视觉审阅不可省。
|
|
47
|
+
4. **引擎 auto = pptd(主引擎,图表矢量拼绘)**;python-pptx 仅显式指定或 pptd 硬失败时使用。
|
|
48
|
+
5. **样式只用 theme token**;**字号下限 = 用户指令**(2026-09-06 用户拍板:插件不设默认下限——用户给出最小字号 → 写入 theme.minFontSize 并严格执行,导出缩字不得低于它;未给下限不设强制,auto-fit 仅 60% 原字号防荒谬保底、绝不升字)。
|
|
49
|
+
6. **Aesthetic `[·]` 建议永远不是门禁**(用户要求审美改进不得引入冲突错误)。
|
|
50
|
+
7. 产物 = 中间层项目 + .pptx;`1px = 1pt`;尺寸默认 960×540。
|
|
51
|
+
8. 预设 = standard 全量 + 本插件人格(**不含插件行**)。装配**唯一**走 profile bundle;预设由插件激活时向 `agentPresets` 注册表**声明**(2026-09-24 适配 DSH 0.1.7:宿主已删除磁盘预设目录发现,`--isolate` 明确拒绝)。
|
|
52
|
+
9. **内置制作技能按"介质"分派,且纯增量(2026-09-14 用户提出、当轮落地)**:
|
|
53
|
+
- 门禁类不可协商的规则 → 工作流铁律(`system-prompt/assemble` 注入);
|
|
54
|
+
- 版式配方 → 模板母版(机器可验证的几何),不写成散文;
|
|
55
|
+
- 判断类手艺(叙事/图表/文案)→ 自研 skill,**按需加载**(描述常驻、正文按需),统一 `ppt-studio-*` 前缀;
|
|
56
|
+
- 通用能力(去 AI 味等)→ **互操作优先**:用用户已装的同类技能,本插件只兜底,不复制别人的内容。
|
|
57
|
+
- 硬边界:技能**不得**定义门禁数值、**不得**改既有铁律;工作流提示词只允许"只增不改"地加指引行(由逐行超集断言守住);
|
|
58
|
+
技能缺失或 `skills` 服务缺位时插件必须完整可用。来源选择上**自研而不 vendor**:第三方内容的许可/陈旧/与门禁冲突/不可验证四类风险,
|
|
59
|
+
加上本仓库已三次吃过"副本漂移"(预设副本、本机 skill 副本、安装根副本)。
|
|
60
|
+
|
|
61
|
+
10. **讲稿通道 = pptx 备注页;图表配色保持建议级(2026-09-14 用户确认"处理那三件事"后落地)**:
|
|
62
|
+
- **讲稿**:页面 `notes:`(非空字符串)→ 导出生成标准备注页(notesSlide + notesMaster,`parity.notes{Exp,Out}` 自证);
|
|
63
|
+
**没有 `notes:` 的页不产生任何备注部件**(老工程产物逐字节不变);`ppt_import` 读回 `notes:`(可编辑往返)。
|
|
64
|
+
播放/计时(放映设置)**不在**插件范围。`ppt_splice` 替换页时保留**源文件该页既有**的备注关系。
|
|
65
|
+
- **图表配色**:`chart.colors` **显式**写了主题外颜色 → `[·] aesthetic-theme` 建议;不写(用内置调色板)不提示。
|
|
66
|
+
**刻意不门禁化**:改 `fillColorsOf`/`themeConformance` 会给既有工程与模板凭空新增 ERROR,而 `theme-conformance` 不可声明 = 让老用户变差。
|
|
67
|
+
- **冻结提示词行的变更程序**(本轮实例:`router.js` 字号下限那行括注错位):用户确认 → 只改那一行 → `dump-workflow-baseline.mjs` 重建
|
|
68
|
+
→ **逐行 diff 审查**(本轮实测:相对 HEAD 只有 5 条"改后的溢出行" + 5 条此前漏进基线的技能指引行,无其它漂移)。
|
|
69
|
+
|
|
70
|
+
11. **安装/装配:支持"标准姿势" `dsh plugin add`,与预设行是替代关系(2026-09-14 用户要求"别人能用 npm / dsh plugin 装,我们能不能做到")**:
|
|
71
|
+
- 机制(已从 harness 源码核实):`dsh plugin --profile <p> <args>` = **薄 pnpm 转发器**(在 profile 目录跑 pnpm)→ 再按**已安装状态**核对
|
|
72
|
+
`dsh.profile.bundles`——**声明了 `dsh.bundle.patch` 的依赖自动进层栈**。所以"能不能装"取决于包自己有没有这个声明(我们此前没有)。
|
|
73
|
+
- 落地方案:package.json 加 `dsh.bundle.patch` + 仓库根 `cordis.patch.yml`(insert 一行 `ppt-studio`);该文件必须进 `files` 才会随包发布。
|
|
74
|
+
- **两条路径互斥**:① bundle 行 = **profile 级**(该 profile 所有会话都具备能力,工作流仍按意图触发);② preset 行 = **会话级**(仅"PPT 工作室"预设,带人格)。
|
|
75
|
+
两者都装会在同进程挂两次 → 插件内加**装配防重**(首个生效 + 明确告警),但纪律要求二选一(README §0.7)。
|
|
76
|
+
- **不发布到 npm registry**(2026-09-14 用户决定"算了,只要确保能用 `dsh plugin` 一键安装"):保持 `private: true`;
|
|
77
|
+
一键安装的规格 = **GitHub Release 的 tgz URL**(`dsh plugin --profile web add https://github.com/zbsph/dsh-ppt-studio/releases/download/v1.0.0/dsh-external-dsh-ppt-studio-1.0.0.tgz`),不需要 npm 账号。
|
|
78
|
+
将来若要发布:删 `private` + 加 `publishConfig.access=public` + `npm login && npm publish`(README §10 有步骤)。
|
|
79
|
+
**包名是单一事实源**:改名必须同步 `cordis.patch.yml` 与预设插件行,三处由 smoke 断言钉住(漏一处 = "装了不生效/预设挂不上"的静默失败)。
|
|
80
|
+
|
|
81
|
+
12. **Cordis `ctx.effect` 语义(2026-09-14 用真库探针实测,纠正了本仓库两处理解错误)**:
|
|
82
|
+
`ctx.effect(cb)` **立即执行 cb**,并以 **cb 的返回值**为 disposer(不是"把 cb 当清理函数")。
|
|
83
|
+
影响:① 新增的装配防重必须写成 `ctx.effect(() => () => { count-- })`(写成 `() => { count-- }` 等于当场递减、防重失效——smoke §40 行为断言当场抓到);
|
|
84
|
+
② **preview-server 的路由 refcount 一直是失效的**:清理体写在 cb 体内 ⇒ 注册当刻就把计数减回 0 并置 `cancelled = true`,
|
|
85
|
+
文档承诺的"首个注册者真注册、最后卸载者真卸载"从未成立(路由注册后立即被取消)。已按真语义修正(cleanup 放进返回函数)。
|
|
86
|
+
③ 之所以长期没被发现:smoke 里的假 ctx 把 effect 语义写反了(defer cb),**假契约掩盖了真 bug**——假 ctx 已按真语义重写。
|
|
87
|
+
|
|
88
|
+
## 5. 冲突与待确认清单(第 2 号请求:可能冲突的地方,需讨论拍板)
|
|
89
|
+
|
|
90
|
+
> 状态图例:🟢 已定无冲突 | 🟡 有张力但已用默认折衷 | 🔴 真冲突,需讨论。
|
|
91
|
+
|
|
92
|
+
| ID | 冲突/张力 | 双方立场 | 当前实现(缩略) | 我的建议默认 |
|
|
93
|
+
|---|---|---|---|---|
|
|
94
|
+
| **C1** 🔴→🟢 **引擎自动回退链**:设计文档说"三引擎 + 自动兜底(python 缺失→pptxgenjs)";实现只做 `auto=pptd`,python-pptx 仅显式指定。若 pptd 硬失败,没有自动回退,只有报错。 | 设计:可用性优先(出活优先)/ 实现:质量优先(从不静默降级到表格) | **已定(2026-09-04 用户拍板:实现自动回退链)**:auto=pptd 优先;pptd 硬失败 → 有 python-pptx 则兜底并在报告**醒目标注降级**(绝不静默)+ 报失败原因;显式指定引擎不自动回退 | 实现完成(v0.3.1) |
|
|
95
|
+
| **C2** 🔴→🟢 **autoDeclare 是否会掩盖真实问题**:一键声明把"卡片上放文字"全部写成预期重叠,模型可能偷懒把**意外重叠**也声明掉,导致门禁失去意义。 | 声明制成本 vs 声明制严格性 | 只处理 warning 级(content-collision 不可声明,是唯一硬底线);叠着视觉审阅 | **已定(用户拍板:audit 禁用 autoDeclare)**:audit 质量档下 `ppt_verify autoDeclare=true` 直接拒绝并提示(v0.3.1 实现;audit 档完整门禁见路线图 M1) |
|
|
96
|
+
| **C3** 🔴→🟢 **safeArea 与"故意放在页眉/页脚带的元素"冲突**:模板页脚带常被用户放 logo/角标水印,`out-of-page` 会把它判错。 | 安全区=绝对门禁 / 装饰性页脚元素也合法 | **已定(用户 2026-09-04 提议并拍板:出界分级声明制,v0.3.2)**:与重叠声明制同构——超**页面边界**=永远 ERROR 不可声明;超**安全区**(模板带内)=声明制(`expectedOutOfSafeArea` 逐元素手工声明,命中 ✓ 预期出界 / 未命中 ERROR);**回滚 v0.3.1 的"decoration 豁免出界"**(装饰性声明只豁免重叠);声明 id 必须存在于本页(防呆) | 实现完成(v0.3.2) |
|
|
97
|
+
| **C11** 🟡 **出血设计(bleed)**:大色块/图片有意超出页面边界(放映裁切呈现延伸感)在部分模板中合法,但 v0.3.2 定为"超页面=永远不可声明"。 | 绝对门禁 / 出血自由度 | 不支持;超页一律 ERROR | 待真实任务遇到 bleed 需求再议(届时加 `expectedOutOfPage` 或明确设计规范);记入冲突清单防遗忘 |
|
|
98
|
+
| **C12** 🔴→🟢 **导入样式断层 vs "风格一致"改造**(P0-1):导入只有几何+文本,用户"改原稿一页求风格一致"必须手工挖 XML(本测试 3 轮脚本)。 | 内容保真(原设计)/ 视觉保真(真实需求) | **已定(用户测试反馈 P0-1 → 实现)**:导入全量映射样式(fill/line/字体/斜体/对齐/行高/schemeClr),渐变归一主色 + stops 保留 import-styles.json;deck.yaml 写 theme 聚合建议块 | 实现完成(v0.4.0) |
|
|
99
|
+
| **C13** 🔴→🟢 **声明制成本 vs 嵌套架构图**(P0-2):三层嵌套要求声明所有层对(45 对,1/3 是传递对)。 | 声明严格性 / 实用成本 | **已定:声明闭包**——相邻层声明,隔层由包含关系传递自动通过(45→30 对);autoDeclare 为默认推荐 | 实现完成(v0.4.0) |
|
|
100
|
+
| **C14** 🟡 **启发式建议的信噪比**(P1-1/P1-2/P2-4/P2-5):对比度取错层、90+ 条对齐噪声、线框页密度误报、贴边无提示。 | 建议有用性 vs 实现复杂度 | 已修:对比度 z-order 最上层 + contrastExempt;near-align 同区块+线豁免;density 按内容元素;贴边 <4px 建议清单 | 实现完成(v0.4.0);"区块语义/意图锚定"深度版留 M3 |
|
|
101
|
+
| **C15** 🟡 **`role` 变更算不算"内容互压声明豁免"的漏洞**(2026-09-14 全面自检时,独立评审把 `ppt-studio-data` §2 的路径 B/C 判为 blocker):把压着文字的 chart 标成 `role: background`(+`expectedOverlaps` 声明)或 `role: decoration`,都能让 `[✗] content-collision` 消失——与决策 2"内容互压永远不可豁免"表面上冲突。 | 决策 2 的严格性(不许声明遮蔽互压)vs `role` 作为**层叠语义声明**的完整性(与"文字压图片需声明"同构;SCHEMA_REF 亦把 decoration 定义为"只豁免重叠",C3 已把"豁免出界"回滚) | **保持门禁语义不变,收紧手册口径**:`role` 只改"层叠分类",不改变"文字压图"这一事实。判据写成**这张图承不承载结论**——承载 → 只能路径 A(标签移出图框);纯衬底/纯装饰 → B/C 才算设计决定。手册同时明写"**`role` 不是消错开关**:翻转 role 只为让报错消失 = 在输出上打补丁"(craft §9-8 已禁),§7 报错表也改成"先判图角色再选路径"。 | 不改门禁(改 = 影响既有工程与模板);`ppt-studio-data` §2/§7/§8 已按上口径落地。若后续仍观察到"翻转 role 逃门禁",再讨论是否把 `role` 变更纳入声明审计 |
|
|
102
|
+
| **C4** 🟡 | **保守度量 vs 误报成本**:0.6em 系数让"实际装得下"的文本也可能被 verify 报溢出 → 逼模型放大容器/缩字。 | 防漏报(用户 D4 反馈)vs 防误报 | 偏宽系数 + 统一阈值 | 保持保守;**实测档(渲染回读)上线后改双档并报**(估算=门禁底线,实测=复核),路线图 R1 |
|
|
103
|
+
| **C5** 🟢 | **minFontSize 全局 vs 个别小字号**:caption 注释 10pt 在部分页合理,但历史上按"中文最小 12pt 铁律"做过默认。**已定(2026-09-06 用户拍板)**:插件**不设默认下限**——下限来源 = 用户指令(给出 → theme.minFontSize 严格执行;未给出 → 不强制,auto-fit 60% 保底防荒谬)。页级覆盖字段未做(待定)。 | 严格(用户指令)vs 灵活 | 主题级 minFontSize(显式才生效;缺省 null) | 保持主题级设置;页级覆盖按需再加 |
|
|
104
|
+
| **C6** 🟡 | **quality 三档 vs 现状**:state 里有 quick/standard/audit,但 audit 档的门禁(预览 PNG/设计报告/证据链)未实现。 | 设计(audit 硬门禁)vs 实现(只快/标准) | quick + standard 语义已落地;audit=空 | audit 档先降级为"standard + 强制视觉审阅 + 导出回读断言"(下一里程碑),完整证据链再议 |
|
|
105
|
+
| **C7** 🟡 | **导入保真度**:"内容保真、版式可从新"(已定)vs 真实工程期望"复刻版式"(用户 A2 提到模板研究)。 | 版式可从新 / 复刻模板 | 导入 = 几何近似(roundRect 保留、渐变→纯色、chart→占位) | 保持所定;"复刻"需求走"导入成 deck → 人工/模型按模板重排版",不做布局逆推自动化 |
|
|
106
|
+
| **C8** 🟢 | 总结任务产出形态 | markdown 默认 / docx+pdf 可选 | 现状:总结走通用能力(未特殊化) | 未实现,路线图低优先 |
|
|
107
|
+
| **C9** 🟢 | 跨页数据对账 / 证据状态(设计决策 527 行) | 已定"首版基础版" | **未实现** | 路线图 M3(长期),不阻塞 |
|
|
108
|
+
| **C10** 🟢 | Quick 模式跳过视觉审阅 vs "质量底线" | 低 token / 质量 | 数字门禁全跑 + 交付标注"未经视觉审阅" | 已定,不改 |
|
|
109
|
+
|
|
110
|
+
## 6. D 系列讨论结论(2026-09-04 用户认可,按倾向落地)
|
|
111
|
+
|
|
112
|
+
| # | 决策 | 落地状态 |
|
|
113
|
+
|---|---|---|
|
|
114
|
+
| D1 | autoDeclare 后模型必须**意图自证**(输出声明清单,每对附一句意图;说不清的对子必须修而不是声明) | 已入提示词/SCHEMA_REF(v0.3.2) |
|
|
115
|
+
| D2 | audit 档第一版 = standard + 禁 autoDeclare + 强制视觉审阅 + **导出回读断言**(页数/尺寸/最小字号≥minFontSize) | 禁 autoDeclare(v0.3.1)+ 回读断言+提示词(v0.3.2);完整"证据链"留 M3 |
|
|
116
|
+
| D3 | 实测档(M2)与估算档关系:**实测=终审、估算=预检**;无浏览器/路径失败降级估算+标注"未实测" | 决策记录(v0.3.2),M2 实现 |
|
|
117
|
+
| D4 | safeArea **智能探测**:导入时检测跨页页眉/页脚带,以**注释**写入建议值(不自动启用) | 实现完成(v0.3.2):detectBands 跨页重复元素带探测 |
|
|
118
|
+
| D5 | 性能:先量化基准再决策(不无数据做缓存/并发) | 记录;基准进技术报告 §6(M4) |
|
|
119
|
+
| D6 | 发布:v1.0 前保持本地注入器闭环;评测集过审后再开源(release 流水线已备) | **已改(2026-09-05 用户决策)**:三轮真实端到端(萨尔浒/AIC5/产能)视为过审,**v1.0.0 定版**;评测集(M5)与 GitHub 发布为 1.0.0 后路线(tag 已打,远程就绪后 `dev_release_plugin` 一键) |
|
|
120
|
+
| D7 | 模板**双轨制**(v0.9.0 用户拍板):模板 = 骨架层(YAML 母版,机器可验证、无 Office 可用)+ 真相层(原始 pptx + Office 整页真渲染 + styleAudit 审计缓存);"按模板做" = "参考用户给的 ppt 制作"(先看真身再创作)。候选 A 由此缓解 | 实现完成(v0.9.0);候选 A 本体暂缓 |
|
|
121
|
+
| D8 | **参考双轨 + 候选 A**(v0.9.1 用户拍板):① 参考类任务(做新/补完/修改/总结)与模板同通道——import 自动带参考层(source.pptx + COM 整页渲染 + referenceSource),先看真身再创作(修正 v0.9.0 "模板比参考更强"的逻辑矛盾);② 候选 A 本体(常见 prst 形状直通 + 渐变双 stop 闭环)实现;custGeom/弧带归候选 C | 实现完成(v0.9.1) |
|
|
122
|
+
| D9 | **手术模式(v0.10.0 用户拍板,候选 B)**:以模板 .pptx 为底版做"结构精确贴模板"(单页文本/表格槽替换 + 未动页内容哈希验证 + 重打包);与双轨互补(双轨=像,手术=贴);老用户无感(新工具/可选字段,既有路径零改动);v1 边界诚实声明(grpSp/新增页/rels 增量留 v1.1) | 实现完成(v0.10.0) |
|
|
123
|
+
| D10 | **候选 C(v0.11.0 用户拍板)**:custGeom 自定义几何闭环(导入/渲染/导出三端直通,commands:moveTo/lnTo/quadBezTo/cubicBezTo/arcTo/close)+ alpha 透明度(solid/渐变 stop)+ 非 rect 形状内文本提取(`_shapeText`);母版层装饰/组合内图片细节为诚实边界(双轨+手术仍是保真正解) | 实现完成(v0.11.0) |
|
|
124
|
+
| D11 | **M2/M3 批次(v0.12/v0.13.0 用户授命,无限制时间预算)**:M2 文本实测档(浏览器真测量 + 实测=终审/估算=预检交叉,默认关闭保老行为)+ M3(themeRef 断言($ref 缺失报错——防静默字面 $xxx)、跨页对账 + 证据核查表 v1(source 标注 grounded/unmapped)、整览 PNG);D5 基准先行(100 页实测进 §6) | 实现完成(v0.12.0/v0.13.0)。**M3 的"跨页对账 + grounded/unmapped"部分已于 2026-09-18 实测证伪并重写**(见 D13) |
|
|
125
|
+
| D12 | **发布到 npm(v1.0.3,2026-09-18 用户拍板 + dsh-web 维护者建议)**:包名改为**无 scope** 的 `dsh-ppt-studio`(现已可用;社区 59 条里 40+ 条同样是 `dsh-*` 无 scope 名,带 scope 的多为个人用户名),去掉 `private: true`,发布公开包;GitHub Release 的 tgz 资产**保留**为离线/归档通道(同源同字节)。理由:npm 让"一条命令"更短(`dsh plugin add dsh-ppt-studio`)、升级只需改版本号,且创意工坊条目的 `npm` 字段可按名安装。**否决的备选**:`@dsh-external/…`(该 scope 在 npm 上不属于我们)、`@linxin666/…`(需维护者授权——不必要地依赖他人) | 实现完成(v1.0.3,`npm publish` + 干净 HOME 真装验证) |
|
|
126
|
+
| D13 | **M3 重写(v1.0.3,2026-09-18 用户质疑后实测证伪)**:`ppt_crosscheck` 不再做机器判定(删掉跨页数字分组与 grounded/unmapped 伪状态),改为**审阅材料包 + 审阅协议**——工具只汇总全页正文/素材清单/协议,判定(一致/冲突/无来源支撑/无法核实)交审阅者,**默认独立子代理、用户禁止子代理时必须自审并标注**;无外部素材时只能判"无法核实" | 实现完成(v1.0.3);理由与实测证据见 docs/02 §2.17 与 docs/03 |
|
|
127
|
+
| D14 | **模板参考政策(v1.0.6,2026-09-18 用户拍板)**:按来源优先级决定参考谁——① **用户给了自己的模板,或任务是对既有 ppt 补完/修改 ⇒ 只参考用户那份,内置模板不参与(也不当风格种子)**;② 用户**明确要求**用内置模板 ⇒ 由用户挑或按主题适配度挑一套;③ 用户没提模板 ⇒ **默认按题材自己设计风格**,内置模板不作兜底,只有**明显贴合**题材时才参考(低优先级)。反对的是"没主意就拿现成模板凑"(历史题材套商务蓝只会更差) | 实现完成(v1.0.6):提示词 6b 与快速模式第 2 条重写、`ppt_templates` 描述收窄、答疑手册顺序修正、README(给人看)补政策说明;提示词基线有意重落一次(旧句留档于 docs/03) |
|
|
128
|
+
| D15 | **本地模板库管理(v1.0.6,2026-09-18 用户提出并落地)**:用户交 .pptx(模板或成品皆可)即可入库、可删除,形成**每个用户自己的本地模板库**。实现:用户层目录 `<dshHome>/ppt-studio/templates/`(**在 node_modules 之外**——原实现写进插件包目录,升级会被 pnpm 覆盖,这是本轮修掉的坑);`listTemplates` 合并随包层与用户层(带 `source: bundled|user`,用户层优先并可覆盖同名随包项);`ppt_template_add` 直接吃 .pptx(内部先 import,自动留真相层);新增 `ppt_template_remove`(**拒删随包**,只允许删自建);`registerTemplate` 加防呆:拒绝写进随包目录 | 实现完成(v1.0.6):5 条 smoke 断言(用户层在包外 / 入库出现在清单 / 可物化 / 删除生效 / 随包拒删)+ README §3 与答疑手册补用法 |
|
|
129
|
+
|
|
130
|
+
## 7. 更新日志(新增条目见 docs/03-更新日志.md)
|
|
131
|
+
|
|
132
|
+
- 2026-09-04:v0.3.0 发布(背景全链路 + 8 项反馈修复);建立 docs/ 档案库、git 版本控制、真实回归脚本。
|
|
133
|
+
- 2026-09-04:v0.3.1(C1 自动回退链 / C2 audit 禁 autoDeclare / C3 初版 decoration 豁免出界)。
|
|
134
|
+
- 2026-09-04:v0.3.2(C3 修订为**出界分级声明制**,回滚 decoration 豁免出界;D1–D6 落地;audit 回读断言;导入 safeArea 探测)。
|
|
135
|
+
- 2026-09-04:v0.4.0(新测试反馈 P0-1/P0-2/P1-1/P1-2/P2-1..P2-5 全部落地:导入保样式+styles.json+theme 聚合、声明闭包、对比度 z-order+contrastExempt、对齐区块化+线豁免、line 2 点校验、贴边清单、density 分层、ppt_new 架构页模板、改一页路径引导)。
|
|
136
|
+
- 2026-09-05:v0.14.5 → v1.0.0(预览路由根治、autodeclare 真修复、保真交付 splice/slice、度量/校验五处修正、自包含测试体系 + 手册 + 内置 skill;发布前评审 docs/06)。
|