dsh-ppt-studio 1.1.5 → 1.2.1

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.
Files changed (94) hide show
  1. package/README.md +4 -1
  2. package/docs/00-/350/256/276/350/256/241/346/272/220.md +4 -0
  3. package/docs/02-/346/212/200/346/234/257/346/212/245/345/221/212.md +114 -1
  4. package/docs/03-/346/233/264/346/226/260/346/227/245/345/277/227.md +159 -0
  5. package/docs/05-/350/277/255/344/273/243/346/265/201/347/250/213.md +23 -0
  6. package/docs/06-/350/257/204/345/256/241/344/270/216/346/265/213/350/257/225.md +2 -1
  7. package/docs/07-/345/244/215/346/235/202/345/233/276/350/203/275/345/212/233/347/253/213/351/241/271/344/270/216/351/243/216/351/231/251/347/231/273/350/256/260.md +319 -0
  8. package/docs/08-/351/230/266/346/256/265A/350/256/276/350/256/241/350/257/264/346/230/216-/347/273/223/346/236/204/345/205/263/347/263/273/344/270/216/345/233/276/344/270/223/345/261/236/346/240/241/351/252/214.md +306 -0
  9. package/docs/09-/344/273/243/347/240/201/345/234/260/345/233/276/344/270/216/346/250/241/345/235/227/350/201/214/350/264/243.md +148 -0
  10. package/docs/10-/345/256/277/344/270/273/350/200/246/345/220/210/347/202/271/346/270/205/345/215/225.md +49 -0
  11. package/docs/11-/346/234/257/350/257/255/350/241/250.md +42 -0
  12. package/docs/12-/345/244/215/346/235/202/345/233/276/351/200/232/350/267/257/347/232/204/351/200/211/346/213/251/344/270/216/351/252/214/346/224/266.md +65 -0
  13. package/docs/13-/345/217/221/347/211/210/345/207/206/345/244/207/350/256/241/345/210/222.md +79 -0
  14. package/docs/14-/345/217/221/345/270/203/346/270/205/345/215/225/357/274/210/350/215/211/347/250/277/357/274/211.md +57 -0
  15. package/docs/15-1.2.0 /345/217/221/345/270/203/346/212/245/345/221/212.md" +46 -0
  16. package/docs/17-/346/211/213/347/224/27313/351/241/265/350/255/246/345/221/212/351/200/220/346/235/241/345/244/204/347/275/256.md +102 -0
  17. package/examples/fx/fx-pro/preview/layout.json +12 -0
  18. package/examples/fx/fx-pro/preview/measured.json +1 -1
  19. package/examples/fx/fx-pro.pptx +0 -0
  20. package/examples/fx/seed.pptx +0 -0
  21. package/examples/fx/single.pptx +0 -0
  22. package/examples/fx/spliced.pptx +0 -0
  23. package/examples/smoke/imported/preview-rt/layout.json +3 -0
  24. package/examples/smoke/imported/source.pptx +0 -0
  25. package/examples/smoke/out-smoke.pptx +0 -0
  26. package/examples/smoke/preview/layout.json +3 -0
  27. package/lib/group-render.js +177 -0
  28. package/lib/msrender.js +27 -12
  29. package/lib/pptd/blocks.js +52 -0
  30. package/lib/pptd/export-pptx.js +266 -11
  31. package/lib/pptd/layout.js +54 -3
  32. package/lib/pptd/line-rules.js +259 -0
  33. package/lib/pptd/line-text-rule.js +90 -0
  34. package/lib/pptd/relations.js +615 -0
  35. package/lib/pptd/render-html.js +19 -1
  36. package/lib/pptd/route-geometry.js +120 -0
  37. package/lib/pptd/schema.js +146 -11
  38. package/lib/pptd/style-profile.js +133 -0
  39. package/lib/scaffold.js +54 -1
  40. package/lib/tools.js +20 -2
  41. package/lib/verify.js +69 -1
  42. package/package.json +20 -3
  43. package/scripts/audit-manual-facts.mjs +15 -3
  44. package/scripts/bench-diagram-scale.mjs +165 -0
  45. package/scripts/check-generators.mjs +22 -0
  46. package/scripts/check-lib-sync.mjs +33 -0
  47. package/scripts/check-line-text.mjs +30 -0
  48. package/scripts/check-package.mjs +60 -0
  49. package/scripts/check-removed-traces.mjs +37 -0
  50. package/scripts/check-syntax.mjs +44 -0
  51. package/scripts/check-unknown-keys.mjs +114 -0
  52. package/scripts/fixtures/handdrawn-baseline.json +177 -0
  53. package/scripts/fixtures/prompt-cost-baseline.json +178 -0
  54. package/scripts/handdrawn-option-probe.mjs +78 -0
  55. package/scripts/probe-prompt-cost.mjs +127 -0
  56. package/scripts/red-probe.mjs +75 -0
  57. package/scripts/render-group.mjs +72 -0
  58. package/scripts/smoke.mjs +191 -20
  59. package/scripts/test-fast.mjs +108 -0
  60. package/scripts/test-map.mjs +162 -0
  61. package/scripts/test-release.mjs +64 -0
  62. package/scripts/verify-diagram-relations.mjs +405 -0
  63. package/scripts/verify-handdrawn.mjs +115 -0
  64. package/scripts/verify-handwritten.mjs +203 -0
  65. package/scripts/verify-preset-scope.mjs +1 -1
  66. package/scripts/verify-primitives.mjs +714 -0
  67. package/scripts/verify-products.mjs +37 -0
  68. package/scripts/verify-shape.mjs +84 -0
  69. package/scripts/visual-pair-batch.mjs +77 -0
  70. package/skills/ppt-studio-diagram/SKILL.md +30 -0
  71. package/skills/ppt-studio-diagram/capability-matrix.md +22 -0
  72. package/skills/ppt-studio-diagram/composition.md +22 -0
  73. package/skills/ppt-studio-diagram/mechanisms.md +141 -0
  74. package/skills/ppt-studio-diagram/pitfalls.md +97 -0
  75. package/skills/ppt-studio-diagram/routing.md +17 -0
  76. package/skills/ppt-studio-diagram/text-and-spacing.md +16 -0
  77. package/skills/ppt-studio-diagram/verify.md +50 -0
  78. package/skills/ppt-studio-diagram-compare/SKILL.md +38 -0
  79. package/skills/ppt-studio-diagram-flow/SKILL.md +38 -0
  80. package/skills/ppt-studio-diagram-funnel/SKILL.md +39 -0
  81. package/skills/ppt-studio-diagram-layers/SKILL.md +32 -0
  82. package/skills/ppt-studio-diagram-loop/SKILL.md +39 -0
  83. package/skills/ppt-studio-diagram-matrix/SKILL.md +37 -0
  84. package/skills/ppt-studio-diagram-sequence/SKILL.md +31 -0
  85. package/skills/ppt-studio-diagram-state/SKILL.md +48 -0
  86. package/skills/ppt-studio-diagram-steps-ring/SKILL.md +38 -0
  87. package/skills/ppt-studio-diagram-swimlane/SKILL.md +37 -0
  88. package/skills/ppt-studio-diagram-timeline/SKILL.md +38 -0
  89. package/skills/ppt-studio-diagram-tree/SKILL.md +38 -0
  90. package/skills/ppt-studio-manual/SKILL.md +2 -2
  91. package/templates/academic-white/preview.png +0 -0
  92. package/templates/business-blue/preview.png +0 -0
  93. package/templates/pitch-bold/preview.png +0 -0
  94. package/templates/tech-dark/preview.png +0 -0
@@ -0,0 +1,38 @@
1
+ ---
2
+ name: ppt-studio-diagram-compare
3
+ description: 左右对比:双列容器 + 中缝;两侧要点等宽对齐,用对比标记而不是堆字。
4
+ whenToUse: 左右对比、双栏方案比对——需要画这类图时加载;先读 skills/ppt-studio-diagram/mechanisms.md
5
+ ---
6
+ # 左右对比(compare)· 手画配方
7
+
8
+ > **优先级**:用户指令 > 本手册经验值 > 工具默认。本手册给的是启发式与反例,**不定义任何门禁数值**;
9
+
10
+ ## 骨架
11
+ 两块等宽面板(A/B)各"标题 + 要点卡";中间一个**窄**标记。
12
+
13
+ ## 配方数值
14
+ 面板 roundRect 380×300 @ y=150、x=80/500(间隙 40);面板标题 16pt bold @ 内顶 (x+20,y+18)。
15
+ 要点卡 roundRect 340×44,内缩进 20,首卡 y=216、间距 54,文字 13pt。
16
+ 中间标记**宽 36**(必须落进 40px 间隙;56px 会压面板)11pt 主色。
17
+
18
+ ## 专属坑
19
+ 1. 两侧要点数不等时,短侧留白比硬凑好。
20
+ 2. 面板底色要区别于页面底色(浅紫/浅玫),否则像一堆散卡。
21
+
22
+ ## 验收清单
23
+ - [ ] 门禁 0 错;[ ] 标记不压面板;[ ] 两侧要点数一致或明显有意不等。
24
+
25
+ ## 本族应调用的机制(先读 mechanisms.md)
26
+
27
+ - **连边一律 `attach: {from:{ref,side}, to:{ref,side}}`**,不手算像素(含斜边形状 ⇒ 引擎接到真实斜边)。
28
+ - 容器(分组/泳道/面板/背景带)**必须把内部元素写进 `contains`**;只声明**相邻层**。
29
+ - 折线交给引擎**自动正交化**;刻意斜段(环/放射/漏斗)写 `role: decoration` 或 `roleReason` 声明。
30
+ - 箭头前直段 ≥18px 由引擎自动保证;修不了会由 `arrow-end-short-run` 报出 ⇒ **必须读警告**。
31
+ - 收工前**逐条解释本页每一条警告**(见 verify.md 铁律之二)。
32
+
33
+
34
+ ## 收工自检(逐条过)
35
+
36
+ - 门禁 0 错;本页**每一条警告**都有处置结论(见 `verify.md` 铁律之二)。
37
+ - 连线端点与图形边重合(优先 `attach`,不手算像素);箭头前直段 ≥18px、折线只用轴对齐段。
38
+ - 容器/分组把内部元素写进 `contains`;刻意穿过或刻意留空用 `roleReason` 说明(不许掩盖真缺陷)。
@@ -0,0 +1,38 @@
1
+ ---
2
+ name: ppt-studio-diagram-flow
3
+ description: 流程图:单行/单列顺序 + 轴对齐连线;回边(如抽检不合格)走车道间隙并带标签。
4
+ whenToUse: 流程、步骤链(顺序 + 回边)——需要画这类图时加载;先读 skills/ppt-studio-diagram/mechanisms.md
5
+ ---
6
+ # 流程图(flow)· 手画配方
7
+
8
+ > **优先级**:用户指令 > 本手册经验值 > 工具默认。本手册给的是启发式与反例,**不定义任何门禁数值**;
9
+
10
+ ## 骨架
11
+ 横向流程:起止 roundRect、中间 rect;末步 accent;**异常分支用回边并标条件**。
12
+
13
+ ## 配方数值
14
+ 节点 150×64 @ y=208,x=60 起、间距 22(5 个正好排满 60..898);节点文字 14pt bold 白字居中。
15
+ 主链箭头 accent 宽 2、端点贴卡边。
16
+ 回边:自前一步**底边**下探到 y=360 车道 → 左行 → 上扎目标步底边;虚线 + 末端箭头;条件标签放车道**上方**(y=332)。
17
+
18
+ ## 专属坑
19
+ 1. 回边竖管与标签必须分离(标签独占车道上方的行)。
20
+ 2. 分支多时改用"菱形节点 + 两条出边",别把回边画在流程带中间。
21
+
22
+ ## 验收清单
23
+ - [ ] 门禁 0 错;[ ] 主链方向一致;[ ] 回边有明确条件标签。
24
+
25
+ ## 本族应调用的机制(先读 mechanisms.md)
26
+
27
+ - **连边一律 `attach: {from:{ref,side}, to:{ref,side}}`**,不手算像素(含斜边形状 ⇒ 引擎接到真实斜边)。
28
+ - 容器(分组/泳道/面板/背景带)**必须把内部元素写进 `contains`**;只声明**相邻层**。
29
+ - 折线交给引擎**自动正交化**;刻意斜段(环/放射/漏斗)写 `role: decoration` 或 `roleReason` 声明。
30
+ - 箭头前直段 ≥18px 由引擎自动保证;修不了会由 `arrow-end-short-run` 报出 ⇒ **必须读警告**。
31
+ - 收工前**逐条解释本页每一条警告**(见 verify.md 铁律之二)。
32
+
33
+
34
+ ## 收工自检(逐条过)
35
+
36
+ - 门禁 0 错;本页**每一条警告**都有处置结论(见 `verify.md` 铁律之二)。
37
+ - 连线端点与图形边重合(优先 `attach`,不手算像素);箭头前直段 ≥18px、折线只用轴对齐段。
38
+ - 容器/分组把内部元素写进 `contains`;刻意穿过或刻意留空用 `roleReason` 说明(不许掩盖真缺陷)。
@@ -0,0 +1,39 @@
1
+ ---
2
+ name: ppt-studio-diagram-funnel
3
+ description: 漏斗/金字塔:custGeom 真梯形逐段收窄(段间严丝合缝);段内标签声明在段内。
4
+ whenToUse: 漏斗、金字塔(custGeom 梯形逐段收窄)——需要画这类图时加载;先读 skills/ppt-studio-diagram/mechanisms.md
5
+ ---
6
+ # 漏斗(funnel)· 手画配方
7
+
8
+ > **优先级**:用户指令 > 本手册经验值 > 工具默认。本手册给的是启发式与反例,**不定义任何门禁数值**;
9
+
10
+ ## 骨架
11
+ 用 **custGeom 梯形**逐段收窄(矩形堆叠是台阶,不是漏斗)。
12
+
13
+ ## 配方数值
14
+ 段 bounds [80, 148+i×70, 800, 70];段内标签**限宽** = min(上宽,下宽) − 60 且居中。
15
+ 示例上/下宽:760→560→360→200→100(末段 accent)。
16
+ path:w:800、h:70;moveTo[(800−wTop)/2,0] → lnTo[(800+wTop)/2,0] → lnTo[(800+wBot)/2,70] → lnTo[(800−wBot)/2,70] → close。
17
+
18
+ ## 专属坑
19
+ 1. 段间边界相接(下段上宽 = 上段下宽),相接不算重叠。
20
+ 2. 标签必须落在梯形内部 ⇒ 必须限宽。
21
+ 3. 段太薄时宁可省略段内文字。
22
+
23
+ ## 验收清单
24
+ - [ ] 门禁 0 错;[ ] 两侧斜边连续;[ ] 每段文字在梯形内。
25
+
26
+ ## 本族应调用的机制(先读 mechanisms.md)
27
+
28
+ - **连边一律 `attach: {from:{ref,side}, to:{ref,side}}`**,不手算像素(含斜边形状 ⇒ 引擎接到真实斜边)。
29
+ - 容器(分组/泳道/面板/背景带)**必须把内部元素写进 `contains`**;只声明**相邻层**。
30
+ - 折线交给引擎**自动正交化**;刻意斜段(环/放射/漏斗)写 `role: decoration` 或 `roleReason` 声明。
31
+ - 箭头前直段 ≥18px 由引擎自动保证;修不了会由 `arrow-end-short-run` 报出 ⇒ **必须读警告**。
32
+ - 收工前**逐条解释本页每一条警告**(见 verify.md 铁律之二)。
33
+
34
+
35
+ ## 收工自检(逐条过)
36
+
37
+ - 门禁 0 错;本页**每一条警告**都有处置结论(见 `verify.md` 铁律之二)。
38
+ - 连线端点与图形边重合(优先 `attach`,不手算像素);箭头前直段 ≥18px、折线只用轴对齐段。
39
+ - 容器/分组把内部元素写进 `contains`;刻意穿过或刻意留空用 `roleReason` 说明(不许掩盖真缺陷)。
@@ -0,0 +1,32 @@
1
+ ---
2
+ name: ppt-studio-diagram-layers
3
+ description: 分层架构:层芯片 + 层带 + 居中箭头;层内一行排布,层间关系用标签写清。
4
+ whenToUse: 分层架构、技术栈(层芯片 + 层带)——需要画这类图时加载;先读 skills/ppt-studio-diagram/mechanisms.md
5
+ ---
6
+ # 分层架构(layers)· 手画配方
7
+
8
+ > **优先级**:用户指令 > 本手册经验值 > 工具默认。本手册给的是启发式与反例,**不定义任何门禁数值**;
9
+
10
+ ## 骨架
11
+ 左侧**层标签芯片**(窄条)+ 右侧**层内容带**(长条,软填充),自上而下 N 层;层间用竖直箭头表示"上行/下行"。
12
+ - 标题 (60,34);层带 x=150,w=740,h=72,y=130 起,层距 88。
13
+ - 层芯片:x=70,w=70,h=72,fill 主色,白字 13pt(竖排或居中均可)。
14
+ - 层带:fill 暖白/浅紫(如 #EDE9FE),**必须把芯片与带内卡片写进 contains**。
15
+ - 带内卡片:白底 roundRect(h=44,y=层带+14),文字 12pt 深色;一个带放 1–2 张。
16
+ - 层间箭头:从上一带底边中点到下一带顶边,**端点正好落在带边**,宽 2,主色。
17
+
18
+ ## 专属坑
19
+ 1. **带内卡片压带边**:卡片要留 14px 内边距;带内卡片也各写自己的 contains。
20
+ 2. **层间箭头穿过带**:箭头只在带与带之间的空隙里,不要跨带。
21
+ 3. 层数 ≥5 时把 h 压到 62、层距压到 74,否则底部溢出安全区。
22
+
23
+ ## 验收清单
24
+ - [ ] 每层"芯片 + 带 + 带内卡片"三层包含关系都声明;[ ] 层间箭头两端贴带边;
25
+ - [ ] 看图能一眼数清层数;[ ] 带内文字对比度 ≥3:1(浅底用深字)。
26
+
27
+
28
+ ## 收工自检(逐条过)
29
+
30
+ - 门禁 0 错;本页**每一条警告**都有处置结论(见 `verify.md` 铁律之二)。
31
+ - 连线端点与图形边重合(优先 `attach`,不手算像素);箭头前直段 ≥18px、折线只用轴对齐段。
32
+ - 容器/分组把内部元素写进 `contains`;刻意穿过或刻意留空用 `roleReason` 说明(不许掩盖真缺陷)。
@@ -0,0 +1,39 @@
1
+ ---
2
+ name: ppt-studio-diagram-loop
3
+ description: 闭环反馈:环形排布 + 环外折线;斜段属设计意图,用 roleReason 声明;环内连线要顺。
4
+ whenToUse: 闭环、反馈回路(环形排布 + 环外折线)——需要画这类图时加载;先读 skills/ppt-studio-diagram/mechanisms.md
5
+ ---
6
+ # 闭环(loop)· 手画配方
7
+
8
+ > **优先级**:用户指令 > 本手册经验值 > 工具默认。本手册给的是启发式与反例,**不定义任何门禁数值**;
9
+
10
+ ## 骨架
11
+ N 个步骤卡沿**椭圆环**分布,箭头沿环指向下一步;环心留空(放文字会被线压)。
12
+
13
+ ## 配方数值
14
+ 中心 (480,320),rx=250、ry=132;卡 170×52;角度 = −90° + i×(360/N)。
15
+ 卡 x = 480 + rx·cosθ − 85,y = 320 + ry·sinθ − 26。
16
+ 箭头沿"卡心→下一卡心"方向,从**卡边**裁剪(off≈96)到下一卡卡边;高亮其中一步。
17
+
18
+ ## 专属坑
19
+ 1. 端点必须落在卡边(落卡内 ⇒ 门禁报"卡 × 线")。
20
+ 2. 环心留白;必须有中心文字时把箭头改走环外侧。
21
+ 3. N≥5 时 rx 加到 270、卡宽降到 150。
22
+
23
+ ## 验收清单
24
+ - [ ] 门禁 0 错;[ ] 箭头首尾接成环;[ ] 环心无遮挡。
25
+
26
+ ## 本族应调用的机制(先读 mechanisms.md)
27
+
28
+ - **连边一律 `attach: {from:{ref,side}, to:{ref,side}}`**,不手算像素(含斜边形状 ⇒ 引擎接到真实斜边)。
29
+ - 容器(分组/泳道/面板/背景带)**必须把内部元素写进 `contains`**;只声明**相邻层**。
30
+ - 折线交给引擎**自动正交化**;刻意斜段(环/放射/漏斗)写 `role: decoration` 或 `roleReason` 声明。
31
+ - 箭头前直段 ≥18px 由引擎自动保证;修不了会由 `arrow-end-short-run` 报出 ⇒ **必须读警告**。
32
+ - 收工前**逐条解释本页每一条警告**(见 verify.md 铁律之二)。
33
+
34
+
35
+ ## 收工自检(逐条过)
36
+
37
+ - 门禁 0 错;本页**每一条警告**都有处置结论(见 `verify.md` 铁律之二)。
38
+ - 连线端点与图形边重合(优先 `attach`,不手算像素);箭头前直段 ≥18px、折线只用轴对齐段。
39
+ - 容器/分组把内部元素写进 `contains`;刻意穿过或刻意留空用 `roleReason` 说明(不许掩盖真缺陷)。
@@ -0,0 +1,37 @@
1
+ ---
2
+ name: ppt-studio-diagram-matrix
3
+ description: 矩阵/象限:行列网格 + 表头(cols/rowLabels/colLabels),每格一张卡,表头与轴说明写清。
4
+ whenToUse: 矩阵、象限、行列网格 + 表头——需要画这类图时加载;先读 skills/ppt-studio-diagram/mechanisms.md
5
+ ---
6
+ # 矩阵(matrix)· 手画配方
7
+
8
+
9
+ > **优先级**:用户指令 > 本手册经验值 > 工具默认。
10
+ ## 骨架
11
+ **列 = 处置力度,行 = 频次**;每个条目独占一格(别用通用象限名代替处置档,否则丢信息维度)。
12
+
13
+ ## 配方数值
14
+ 列头 14pt bold @ y=158、宽 230 居中;行标 13pt bold @ x=60、宽 90、行内垂直居中。
15
+ 格 roundRect 230×120:列 x=160/410/660,行 y=190/330;最高优先级那格用 accent,其余主色;格内 15pt bold 白字。
16
+
17
+ ## 专属坑
18
+ 1. 每格写进自身 contains;若用外层容器,容器要登记所有格。
19
+ 2. 3 列 × 230 已是安全区上限。
20
+
21
+ ## 验收清单
22
+ - [ ] 门禁 0 错;[ ] 列头/行标齐备;[ ] 高亮唯一。
23
+
24
+ ## 本族应调用的机制(先读 mechanisms.md)
25
+
26
+ - **连边一律 `attach: {from:{ref,side}, to:{ref,side}}`**,不手算像素(含斜边形状 ⇒ 引擎接到真实斜边)。
27
+ - 容器(分组/泳道/面板/背景带)**必须把内部元素写进 `contains`**;只声明**相邻层**。
28
+ - 折线交给引擎**自动正交化**;刻意斜段(环/放射/漏斗)写 `role: decoration` 或 `roleReason` 声明。
29
+ - 箭头前直段 ≥18px 由引擎自动保证;修不了会由 `arrow-end-short-run` 报出 ⇒ **必须读警告**。
30
+ - 收工前**逐条解释本页每一条警告**(见 verify.md 铁律之二)。
31
+
32
+
33
+ ## 收工自检(逐条过)
34
+
35
+ - 门禁 0 错;本页**每一条警告**都有处置结论(见 `verify.md` 铁律之二)。
36
+ - 连线端点与图形边重合(优先 `attach`,不手算像素);箭头前直段 ≥18px、折线只用轴对齐段。
37
+ - 容器/分组把内部元素写进 `contains`;刻意穿过或刻意留空用 `roleReason` 说明(不许掩盖真缺陷)。
@@ -0,0 +1,31 @@
1
+ ---
2
+ name: ppt-studio-diagram-sequence
3
+ description: 时序图:参与者盒 + 生命线 + 水平消息箭头;生命线用虚线与窄矩形,标签用白底芯片遮罩。
4
+ whenToUse: 时序、消息序列(生命线 + 水平消息箭头)——需要画这类图时加载;先读 skills/ppt-studio-diagram/mechanisms.md
5
+ ---
6
+ # 时序图(sequence)· 手画配方
7
+
8
+ > **优先级**:用户指令 > 本手册经验值 > 工具默认。本手册给的是启发式与反例,**不定义任何门禁数值**;
9
+
10
+ ## 骨架
11
+ 顶部一排**参与者头卡**(等宽)+ 每人一条**虚线生命线**(垂直到页底)+ 自上而下的**消息箭头**(实线,标签在箭头上方)。
12
+ - 标题 (60,34);头卡 w=170,h=48,y=110,x=70 起,间距 35(4 人占 70..890)。
13
+ - 生命线:从头卡底边中点到 y=470,`dash: dash`,颜色 #94A3B8,宽 1。
14
+ - 消息:y=200/245/290/335/380 逐条下移;从发送者生命线到接收者生命线,**端点正好落在生命线上**,end 箭头;
15
+ 标签放在箭头**上方 6px**、居中于两端之间,宽 = |x2−x1|,11pt。
16
+ - 自环消息(自己给自己):向右折 30px 再回来(三折线),标签放右侧。
17
+
18
+ ## 专属坑
19
+ 1. **箭头压生命线**:箭头端点落在线上即可,不要越过。
20
+ 2. **标签互相压**:相邻两条消息的 y 至少差 40;标签只占箭头正上方一行。
21
+ 3. **消息方向看错**:箭头必须在**接收者**那一端(`arrow: true` + points 的终点是接收者)。
22
+
23
+ ## 验收清单
24
+ - [ ] 每条消息能读出"谁→谁、什么消息";[ ] 生命线不被文字压;[ ] 头和生命线同一条 x 中心。
25
+
26
+
27
+ ## 收工自检(逐条过)
28
+
29
+ - 门禁 0 错;本页**每一条警告**都有处置结论(见 `verify.md` 铁律之二)。
30
+ - 连线端点与图形边重合(优先 `attach`,不手算像素);箭头前直段 ≥18px、折线只用轴对齐段。
31
+ - 容器/分组把内部元素写进 `contains`;刻意穿过或刻意留空用 `roleReason` 说明(不许掩盖真缺陷)。
@@ -0,0 +1,48 @@
1
+ ---
2
+ name: ppt-studio-diagram-state
3
+ description: 状态机:BFS 分层 + 列间走廊 + 转移总线(回边不做特例);每条转移都要有标签。
4
+ whenToUse: 状态机、状态转移(分层 + 转移总线)——需要画这类图时加载;先读 skills/ppt-studio-diagram/mechanisms.md
5
+ ---
6
+ # 状态机(state)· 手画配方
7
+
8
+ > **优先级**:用户指令 > 本手册经验值 > 工具默认。本手册给的是启发式与反例,**不定义任何门禁数值**;
9
+
10
+ ## 骨架
11
+ 横向一行状态卡 + 卡间箭头 + **回边(返工/异常)走卡片外侧车道**;或竖向一列(见下)。
12
+ - 5 状态:卡 150×84,y=240,x=60 起,间距 20 ⇒ 卡心 y=282,卡底 y=324。
13
+ - 卡内:标题 16pt bold(居中或齐左)+ 副标题 11pt 灰;**卡内文字必须写进卡的 `contains`**。
14
+ - 卡间:短箭头,端点**正好落在卡右边到下一卡左边**,y=卡心;颜色取 accent,宽 1.5–2。
15
+ - 回边:从源卡**下边**出 → 下垂到 **y=400 车道** → 左行 → 上扎到目标卡**下边**;虚线 + 末端箭头。
16
+ - 回边标签放在**车道上方**(如 y=372,高 20),**绝不放车道上**(会压线)。
17
+
18
+ ## 标签(最容易漏)
19
+ **主链每条转移都要标签**,放在箭头**上方**(y = 卡顶 − 28),宽 80 居中于箭头中点;只标回边不标主链 ⇒ 内容就丢了(实测)。
20
+
21
+ ## 竖向变体(状态多、副标题长时更好看)
22
+ 一列 5 卡(470×68 / gap 26 / x=300);内联编号圆徽 24px @ (x+16, y+12);标题 x+50/y+10 16pt bold;副标题 x+50/y+38 11pt;卡间用**向下**箭头 3px;回边走左侧 x−40 虚线。
23
+ > 实测:这一版观感明显好于横向行(层级清楚、留白够)。优先考虑竖向。
24
+
25
+ ## 该族专属坑
26
+ 1. **回边竖管压标签带**:竖管必须让开卡下标签带;把车道整体下移(≥ 标签带高 + 8px)。
27
+ 2. **回边端点画在卡内**(如 x+6)⇒ 门禁报 `unexpected-overlap`;端点必须**落在卡边**。
28
+ 3. **箭头值只有** `true|false|'end'|'both'`;`'start'` 非法。
29
+ 4. 自环/回边**不要跨过卡片区**;多回边时按 18px 递增错开车道。
30
+
31
+ ## 验收清单
32
+ - [ ] `verifyDeck` 0 错;[ ] 每条边都能**用眼睛指出**从哪张卡到哪张卡;
33
+ - [ ] 回边车道不压任何文字;[ ] 卡内文字不溢出(长标签要缩字号或加宽卡)。
34
+
35
+ ## 本族应调用的机制(先读 mechanisms.md)
36
+
37
+ - **连边一律 `attach: {from:{ref,side}, to:{ref,side}}`**,不手算像素(含斜边形状 ⇒ 引擎接到真实斜边)。
38
+ - 容器(分组/泳道/面板/背景带)**必须把内部元素写进 `contains`**;只声明**相邻层**。
39
+ - 折线交给引擎**自动正交化**;刻意斜段(环/放射/漏斗)写 `role: decoration` 或 `roleReason` 声明。
40
+ - 箭头前直段 ≥18px 由引擎自动保证;修不了会由 `arrow-end-short-run` 报出 ⇒ **必须读警告**。
41
+ - 收工前**逐条解释本页每一条警告**(见 verify.md 铁律之二)。
42
+
43
+
44
+ ## 收工自检(逐条过)
45
+
46
+ - 门禁 0 错;本页**每一条警告**都有处置结论(见 `verify.md` 铁律之二)。
47
+ - 连线端点与图形边重合(优先 `attach`,不手算像素);箭头前直段 ≥18px、折线只用轴对齐段。
48
+ - 容器/分组把内部元素写进 `contains`;刻意穿过或刻意留空用 `roleReason` 说明(不许掩盖真缺陷)。
@@ -0,0 +1,38 @@
1
+ ---
2
+ name: ppt-studio-diagram-steps-ring
3
+ description: 步骤环:真圆 + 圆周编号点(更雅,优先)或卡片环(更快);点与圆同心、标签留 ≥24px。
4
+ whenToUse: 步骤环(真圆+编号点 或 卡片环)——需要画这类图时加载;先读 skills/ppt-studio-diagram/mechanisms.md
5
+ ---
6
+ # 步骤环(steps-ring)· 手画配方
7
+
8
+ > **优先级**:用户指令 > 本手册经验值 > 工具默认。本手册给的是启发式与反例,**不定义任何门禁数值**;
9
+
10
+ ## 两种画法
11
+ 1. **卡片环**(快):N 张卡沿椭圆分布 + 沿环直箭头(数值见 loop.md)。
12
+ 2. **真圆 + 编号点**(更雅,旧版用的,**优先**):ellipse 浅填充+主色描边 + 圆周上编号小圆点 + 圆外标签。
13
+
14
+ ## 真圆数值
15
+ 圆 ellipse 中心 (480,300)、r=190 ⇒ bounds [290,110,380,380];fill 浅紫、line 主色 1.5。
16
+ 编号点 ellipse 46×46 在圆周(角度 = −90° + i×360/N),点内序号 bold 白字;标签在半径+70 处 12pt。
17
+
18
+ ## 专属坑
19
+ 1. 编号点写进圆的 contains,或干脆都不声明 contains(避免"未真正包含")。
20
+ 2. 标签与编号点至少留 24px。
21
+
22
+ ## 验收清单
23
+ - [ ] 门禁 0 错;[ ] 序号顺序可读;[ ] 圆与点同心。
24
+
25
+ ## 本族应调用的机制(先读 mechanisms.md)
26
+
27
+ - **连边一律 `attach: {from:{ref,side}, to:{ref,side}}`**,不手算像素(含斜边形状 ⇒ 引擎接到真实斜边)。
28
+ - 容器(分组/泳道/面板/背景带)**必须把内部元素写进 `contains`**;只声明**相邻层**。
29
+ - 折线交给引擎**自动正交化**;刻意斜段(环/放射/漏斗)写 `role: decoration` 或 `roleReason` 声明。
30
+ - 箭头前直段 ≥18px 由引擎自动保证;修不了会由 `arrow-end-short-run` 报出 ⇒ **必须读警告**。
31
+ - 收工前**逐条解释本页每一条警告**(见 verify.md 铁律之二)。
32
+
33
+
34
+ ## 收工自检(逐条过)
35
+
36
+ - 门禁 0 错;本页**每一条警告**都有处置结论(见 `verify.md` 铁律之二)。
37
+ - 连线端点与图形边重合(优先 `attach`,不手算像素);箭头前直段 ≥18px、折线只用轴对齐段。
38
+ - 容器/分组把内部元素写进 `contains`;刻意穿过或刻意留空用 `roleReason` 说明(不许掩盖真缺陷)。
@@ -0,0 +1,37 @@
1
+ ---
2
+ name: ppt-studio-diagram-swimlane
3
+ description: 复杂图配方(swimlane):按 ppt-studio-diagram 总纲选用,含骨架/数值/专属坑/验收清单。
4
+ whenToUse: 需要画这一类复杂图时加载;先读 ppt-studio-diagram(何时调用哪个机制 / 验证纪律 / 坑表)。
5
+ ---
6
+ # 泳道图(swimlane)· 手画配方
7
+
8
+ > **优先级**:用户指令 > 本手册经验值 > 工具默认。本手册给的是启发式与反例,**不定义任何门禁数值**;
9
+
10
+ ## 骨架
11
+ 左泳道名芯片 + 右侧泳道带;任务卡按角色落到对应道;跨道连线允许穿带(**必须声明**)。
12
+
13
+ ## 配方数值
14
+ 芯片 roundRect 96×72 @ x=60;道 i 的 y=156+i×84。带 rect 780×72 @ x=156(同 y),奇数道浅紫、偶数道白底。
15
+ 任务卡 roundRect 110×44(文字 11pt bold),首卡 x=176、间距 124。
16
+
17
+ ## 专属坑
18
+ 1. **带的 contains 要列出本道全部任务卡与其文字**(否则报"背景压内容")。
19
+ 2. 跨道连线只把**真正相交**的对写进 expectedOverlaps(过声明会产生 declared-stale 噪音)。
20
+
21
+ ## 验收清单
22
+ - [ ] 门禁 0 错;[ ] 归属一眼可辨;[ ] 声明清单无 stale。
23
+
24
+ ## 本族应调用的机制(先读 mechanisms.md)
25
+
26
+ - **连边一律 `attach: {from:{ref,side}, to:{ref,side}}`**,不手算像素(含斜边形状 ⇒ 引擎接到真实斜边)。
27
+ - 容器(分组/泳道/面板/背景带)**必须把内部元素写进 `contains`**;只声明**相邻层**。
28
+ - 折线交给引擎**自动正交化**;刻意斜段(环/放射/漏斗)写 `role: decoration` 或 `roleReason` 声明。
29
+ - 箭头前直段 ≥18px 由引擎自动保证;修不了会由 `arrow-end-short-run` 报出 ⇒ **必须读警告**。
30
+ - 收工前**逐条解释本页每一条警告**(见 verify.md 铁律之二)。
31
+
32
+
33
+ ## 收工自检(逐条过)
34
+
35
+ - 门禁 0 错;本页**每一条警告**都有处置结论(见 `verify.md` 铁律之二)。
36
+ - 连线端点与图形边重合(优先 `attach`,不手算像素);箭头前直段 ≥18px、折线只用轴对齐段。
37
+ - 容器/分组把内部元素写进 `contains`;刻意穿过或刻意留空用 `roleReason` 说明(不许掩盖真缺陷)。
@@ -0,0 +1,38 @@
1
+ ---
2
+ name: ppt-studio-diagram-timeline
3
+ description: 时间轴/里程碑:水平主轴 + 圆点 + 上下交替标签;轴说明与关键里程碑的高亮取舍。
4
+ whenToUse: 时间轴、里程碑(水平轴 + 上下交替标签)——需要画这类图时加载;先读 skills/ppt-studio-diagram/mechanisms.md
5
+ ---
6
+ # 时间轴(timeline)· 手画配方
7
+
8
+ > **优先级**:用户指令 > 本手册经验值 > 工具默认。本手册给的是启发式与反例,**不定义任何门禁数值**;
9
+
10
+ ## 骨架
11
+ 水平主轴 + 等距里程碑点 + 标签**上下交替**。
12
+
13
+ ## 配方数值
14
+ 主轴 line @ y=300、x 70→890、宽 3;里程碑 ellipse 18×18,x=90 起、间距 156。
15
+ 标签宽 140 居中:名称 14pt bold + 说明 11pt 灰;奇数在上(y=300−96),偶数在下(y=300+34);刻度短线 1px。
16
+ **只高亮一个**关键节点(accent)。
17
+
18
+ ## 专属坑
19
+ 1. 6 个以上要缩间距或改两行;标签超 140 宽会互压。
20
+ 2. 全部高亮 = 没有重点。
21
+
22
+ ## 验收清单
23
+ - [ ] 门禁 0 错;[ ] 标签不重叠;[ ] 高亮唯一。
24
+
25
+ ## 本族应调用的机制(先读 mechanisms.md)
26
+
27
+ - **连边一律 `attach: {from:{ref,side}, to:{ref,side}}`**,不手算像素(含斜边形状 ⇒ 引擎接到真实斜边)。
28
+ - 容器(分组/泳道/面板/背景带)**必须把内部元素写进 `contains`**;只声明**相邻层**。
29
+ - 折线交给引擎**自动正交化**;刻意斜段(环/放射/漏斗)写 `role: decoration` 或 `roleReason` 声明。
30
+ - 箭头前直段 ≥18px 由引擎自动保证;修不了会由 `arrow-end-short-run` 报出 ⇒ **必须读警告**。
31
+ - 收工前**逐条解释本页每一条警告**(见 verify.md 铁律之二)。
32
+
33
+
34
+ ## 收工自检(逐条过)
35
+
36
+ - 门禁 0 错;本页**每一条警告**都有处置结论(见 `verify.md` 铁律之二)。
37
+ - 连线端点与图形边重合(优先 `attach`,不手算像素);箭头前直段 ≥18px、折线只用轴对齐段。
38
+ - 容器/分组把内部元素写进 `contains`;刻意穿过或刻意留空用 `roleReason` 说明(不许掩盖真缺陷)。
@@ -0,0 +1,38 @@
1
+ ---
2
+ name: ppt-studio-diagram-tree
3
+ description: 层级树/组织图:根居中、一级一行、叶一行;正交折线 + 箭头;同组子树要有分组容器。
4
+ whenToUse: 层级树、组织图、分组子树(正交折线 + 分组容器)——需要画这类图时加载;先读 skills/ppt-studio-diagram/mechanisms.md
5
+ ---
6
+ # 层级树(tree)· 手画配方
7
+
8
+ > **优先级**:用户指令 > 本手册经验值 > 工具默认。本手册给的是启发式与反例,**不定义任何门禁数值**;
9
+
10
+ ## 骨架
11
+ 根居顶中 → 一级一行 → 叶一行;连线用**正交折线 + 箭头**。
12
+
13
+ ## 配方数值(安全区 60..900 / 60..480)
14
+ 根 roundRect 200×64 @ (380,124);一级 170×52 @ y=258(x=90/395/700);叶 150×48 @ y=380。
15
+ 连线自根底边 y=188 起 → 主干 y=220 → 落到子节点顶边;**arrow: true**。
16
+
17
+ ## 专属坑
18
+ 1. 同组子树应加**分组容器**(旧版胜过手画版之处);容器要把内部所有元素写进 contains,连线穿容器按纪律精确声明。
19
+ 2. 父盒加高后子文本要一起重排,否则 contains 不成立。
20
+ 3. 连线端点落在**卡边**,不要落在卡内。
21
+
22
+ ## 验收清单
23
+ - [ ] 门禁 0 错;[ ] 每条连线有箭头且贴边;[ ] 组容器登记了内部元素。
24
+
25
+ ## 本族应调用的机制(先读 mechanisms.md)
26
+
27
+ - **连边一律 `attach: {from:{ref,side}, to:{ref,side}}`**,不手算像素(含斜边形状 ⇒ 引擎接到真实斜边)。
28
+ - 容器(分组/泳道/面板/背景带)**必须把内部元素写进 `contains`**;只声明**相邻层**。
29
+ - 折线交给引擎**自动正交化**;刻意斜段(环/放射/漏斗)写 `role: decoration` 或 `roleReason` 声明。
30
+ - 箭头前直段 ≥18px 由引擎自动保证;修不了会由 `arrow-end-short-run` 报出 ⇒ **必须读警告**。
31
+ - 收工前**逐条解释本页每一条警告**(见 verify.md 铁律之二)。
32
+
33
+
34
+ ## 收工自检(逐条过)
35
+
36
+ - 门禁 0 错;本页**每一条警告**都有处置结论(见 `verify.md` 铁律之二)。
37
+ - 连线端点与图形边重合(优先 `attach`,不手算像素);箭头前直段 ≥18px、折线只用轴对齐段。
38
+ - 容器/分组把内部元素写进 `contains`;刻意穿过或刻意留空用 `roleReason` 说明(不许掩盖真缺陷)。
@@ -48,7 +48,7 @@ DSH 上做 PPT 的工作区:说需求 → 四类任务工作流 → 「数字
48
48
  - 元素通用:`elementId`(页内唯一)、`elementType: text|shape|line|image|table|chart`、`bounds: [x,y,w,h]`(line 可省,由 points 推导)、`role: background|content|decoration`。
49
49
  - text:`content: {text, style: "$name" 或内联样式键}`;**样式键必须在 content 内**。
50
50
  - shape:`kind: rect|roundRect|ellipse|triangle + prst(箭头/菱形/五边形/flowchart…) + custGeom path`;`fill #hex | {color,alpha} | {type: gradient, stops: [{pos,color,alpha}], angle}`;`line {color,width}`;`rotation`。
51
- - line:`points: [[x1,y1],[x2,y2]]`(**每条只有两点**,多点折线不支持——时间轴/折线拆成首尾相接的多条 line);`arrow: true`(箭头在第二个点那一端)。
51
+ - line:`points: [[x1,y1],…]`(≥2 点,>2 点为折线);`arrow: true|'both'`;`line.dash`;`attach` 可锚到元素边(阶段 A)。
52
52
  - image:`src: "media/xx.png"`;`fit: cover|contain|fill`。
53
53
  - table:`cols: [列名...]`、`rows: [[..]]`、`header: true|false`。
54
54
  - chart:`chart: {type: bar|line|pie, data: {cols: [列名…], rows: [[…]]}, series: [{name,x,y}](多系列时显式写), colors}`。
@@ -97,7 +97,7 @@ DSH 上做 PPT 的工作区:说需求 → 四类任务工作流 → 「数字
97
97
  ## 7. 开发维护(仅改插件时用)
98
98
 
99
99
  - 改码:`src/` → `node scripts/build.mjs` → **重启 host**(插件经 agent preset 会话装配;`dev_reload_package` 只覆盖注入器装配包,且注入器 junction 已存在时会指向旧安装根)。
100
- - 回归:`node scripts/smoke.mjs`(303 断言)→ `node scripts/preflight-1.0.mjs`(发布预检)→ `node scripts/regression-real.mjs`。
100
+ - 回归:`node scripts/smoke.mjs`(322 断言)→ `node scripts/preflight-1.0.mjs`(发布预检)→ `node scripts/regression-real.mjs`。
101
101
  - 跨层验证纪律:**预览层与成品层必须互相验证**——`ppt_render`+`ppt_verify` 只管 HTML/估算层,OOXML 层靠 `ppt_export` 的 parity 自证(表/图/线方向)+ `ppt_visual` 真渲染抽检;只跑单层会漏掉"预览对、成品错"(2026-09-14 连线方向事故)。
102
102
  - 文档链:改需求/决策 → docs/01;改机制 → docs/02;每次 → docs/03;验收 → docs/04;发布前 → docs/06。
103
103
  - 装配:**默认装法是 npm 包名**(`dsh plugin --profile <p> add dsh-ppt-studio`,profile 级、随 profile 启动装配;**桌面端**在插件管理里填同一个包名 `dsh-ppt-studio`;GitHub Release 的资产 URL 与 `scripts/install*.mjs` 是离线/归档备选)。装完**必须重启 host**。排查:`dsh plugin --profile web list` → `dsh --profile web --dump-config` 找 `ppt-studio` 行。preset 插件行只在"离线 junction"场景用,与 bundle 装法**互斥**。
Binary file
Binary file
Binary file