dsh-ppt 0.3.0 → 0.4.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.
package/lib/types.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  /** dsh-ppt 的公共类型。 */
2
2
  export type PptThemeId = 'swiss' | 'velvet' | 'data' | 'soft' | 'bold';
3
3
  export type PptLanguage = 'zh' | 'en' | 'bilingual';
4
- export type PptSlideLayout = 'cover' | 'section' | 'bullets' | 'statement' | 'closing';
4
+ export type PptSlideLayout = 'cover' | 'section' | 'bullets' | 'statement' | 'quote' | 'table' | 'closing';
5
5
  export interface PptSlideSpec {
6
6
  layout?: PptSlideLayout;
7
7
  title?: string;
@@ -9,9 +9,13 @@ export interface PptSlideSpec {
9
9
  kicker?: string;
10
10
  text?: string;
11
11
  bullets?: string[];
12
+ /** 表格页数据;第一行作为表头。 */
13
+ rows?: Array<Array<string | number>>;
14
+ /** 演讲者备注;写入 HTML 备注面板与 PPTX 原生备注页。 */
15
+ notes?: string;
12
16
  }
13
17
  export interface PptConfig {
14
- /** 默认输出目录;调用 ppt_create 时可用 outputDir 覆盖。默认当前工作目录。 */
18
+ /** 默认输出目录;调用 ppt_create 时可用 outputDir 覆盖。相对路径按会话工作目录解析。 */
15
19
  outputDir?: string;
16
20
  /** 单次生成幻灯片上限,默认 60(3–120)。 */
17
21
  maxSlides?: number;
@@ -28,8 +32,12 @@ export interface PptCreateArgs {
28
32
  slides?: PptSlideSpec[];
29
33
  theme?: string;
30
34
  lang?: string;
35
+ /** 页间转场与要点入场动画:on(默认)/ off。 */
36
+ motion?: 'on' | 'off';
31
37
  outputDir?: string;
32
38
  fileName?: string;
39
+ /** 是否覆盖同名三件套;默认 false,同名时自动选择唯一后缀。 */
40
+ overwrite?: boolean;
33
41
  }
34
42
  export interface PptThemeInfo {
35
43
  id: string;
package/package.json CHANGED
@@ -1,70 +1,70 @@
1
- {
2
- "name": "dsh-ppt",
3
- "version": "0.3.0",
4
- "description": "DSH 演示文稿技能 + 工具插件:一句话或一篇 Markdown 文档 → 完整演示文稿(独立 HTML 网页放映 + 可编辑 PPTX 导出),内置 5 套视觉主题,可配置默认主题/语言,中英双语,SKILL.md 双格式跨 harness。",
5
- "type": "module",
6
- "main": "lib/index.js",
7
- "types": "lib/index.d.ts",
8
- "exports": {
9
- ".": {
10
- "types": "./lib/index.d.ts",
11
- "default": "./lib/index.js"
12
- },
13
- "./skills/*": "./skills/*",
14
- "./deck-core": "./skills/dsh-ppt/scripts/deck-core.mjs",
15
- "./build-deck": "./skills/dsh-ppt/scripts/build-deck.mjs",
16
- "./cordis.patch.yml": "./cordis.patch.yml",
17
- "./package.json": "./package.json"
18
- },
19
- "files": [
20
- "lib",
21
- "skills",
22
- "cordis.patch.yml",
23
- "README.md",
24
- "README.en.md",
25
- "CHANGELOG.md",
26
- "LICENSE"
27
- ],
28
- "scripts": {
29
- "build": "tsc -p tsconfig.json",
30
- "typecheck": "tsc -p tsconfig.json --noEmit",
31
- "test": "pnpm run build && node --test \"test/*.test.mjs\"",
32
- "test:core": "node --test \"test/*.test.mjs\"",
33
- "smoke:cli": "node skills/dsh-ppt/scripts/build-deck.mjs --title \"DSH PPT Smoke\" --content @smoke/sample-deck.md --theme data --lang zh --out .smoke-deck"
34
- },
35
- "dsh": {
36
- "bundle": {
37
- "patch": "./cordis.patch.yml"
38
- }
39
- },
40
- "keywords": [
41
- "dsh",
42
- "deepseek-harness",
43
- "dsh-plugin",
44
- "plugin",
45
- "skills",
46
- "ppt",
47
- "pptx",
48
- "presentation",
49
- "slides",
50
- "html"
51
- ],
52
- "license": "MIT",
53
- "engines": {
54
- "node": ">=22"
55
- },
56
- "devDependencies": {
57
- "@types/node": "^24.0.0",
58
- "typescript": "^5.6.0"
59
- },
60
- "repository": {
61
- "type": "git",
62
- "url": "git+https://github.com/STARDUSTLC666/dsh-ppt.git"
63
- },
64
- "bugs": {
65
- "url": "https://github.com/STARDUSTLC666/dsh-ppt/issues"
66
- },
67
- "homepage": "https://github.com/STARDUSTLC666/dsh-ppt#readme",
68
- "author": "stardustlc",
69
- "packageManager": "pnpm@11.7.0"
70
- }
1
+ {
2
+ "name": "dsh-ppt",
3
+ "version": "0.4.1",
4
+ "description": "DSH 演示文稿技能 + 工具插件:一句话或一篇 Markdown 文档 → 完整演示文稿(独立 HTML 网页放映 + 可编辑 PPTX 导出),内置 5 套视觉主题与页间转场/要点入场动画(motion 可关),可配置默认主题/语言,中英双语,SKILL.md 薄路由 + references 按需装载,跨 harness。",
5
+ "type": "module",
6
+ "main": "lib/index.js",
7
+ "types": "lib/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./lib/index.d.ts",
11
+ "default": "./lib/index.js"
12
+ },
13
+ "./skills/*": "./skills/*",
14
+ "./deck-core": "./skills/dsh-ppt/scripts/deck-core.mjs",
15
+ "./build-deck": "./skills/dsh-ppt/scripts/build-deck.mjs",
16
+ "./cordis.patch.yml": "./cordis.patch.yml",
17
+ "./package.json": "./package.json"
18
+ },
19
+ "files": [
20
+ "lib",
21
+ "skills",
22
+ "cordis.patch.yml",
23
+ "README.md",
24
+ "README.en.md",
25
+ "CHANGELOG.md",
26
+ "LICENSE"
27
+ ],
28
+ "scripts": {
29
+ "build": "tsc -p tsconfig.json",
30
+ "typecheck": "tsc -p tsconfig.json --noEmit",
31
+ "test": "pnpm run build && node --test \"test/*.test.mjs\"",
32
+ "test:core": "node --test \"test/*.test.mjs\"",
33
+ "smoke:cli": "node skills/dsh-ppt/scripts/build-deck.mjs --title \"DSH PPT Smoke\" --content @smoke/sample-deck.md --theme data --lang zh --out .smoke-deck"
34
+ },
35
+ "dsh": {
36
+ "bundle": {
37
+ "patch": "./cordis.patch.yml"
38
+ }
39
+ },
40
+ "keywords": [
41
+ "dsh",
42
+ "deepseek-harness",
43
+ "dsh-plugin",
44
+ "plugin",
45
+ "skills",
46
+ "ppt",
47
+ "pptx",
48
+ "presentation",
49
+ "slides",
50
+ "html"
51
+ ],
52
+ "license": "MIT",
53
+ "engines": {
54
+ "node": ">=22"
55
+ },
56
+ "devDependencies": {
57
+ "@types/node": "^24.0.0",
58
+ "typescript": "^5.6.0"
59
+ },
60
+ "repository": {
61
+ "type": "git",
62
+ "url": "git+https://github.com/STARDUSTLC666/dsh-ppt.git"
63
+ },
64
+ "bugs": {
65
+ "url": "https://github.com/STARDUSTLC666/dsh-ppt/issues"
66
+ },
67
+ "homepage": "https://github.com/STARDUSTLC666/dsh-ppt#readme",
68
+ "author": "stardustlc",
69
+ "packageManager": "pnpm@11.7.0"
70
+ }
@@ -1,101 +1,59 @@
1
1
  ---
2
2
  name: dsh-ppt
3
- description: "Turn one sentence or a Markdown document into a complete, presentation-ready deck: a standalone HTML web slideshow plus an editable PPTX export, with 5 built-in visual themes (Swiss Pulse / Velvet Standard / Data Drift / Soft Signal / Maximalist Type) and bilingual Chinese/English support. Use when the user asks for a PPT, slides, deck, keynote, 演示文稿, 幻灯片, 汇报, 提案, 路演, 培训材料, or wants to turn a document into a presentation. 中文:把一句话或一篇文档变成完整演示文稿(HTML 网页放映 + PPTX 导出),内置 5 套视觉主题,中英双语。"
3
+ description: "Turn one sentence or a Markdown document into a complete, presentation-ready deck: a standalone HTML web slideshow plus an editable PPTX export, with 5 built-in visual themes (Swiss Pulse / Velvet Standard / Data Drift / Soft Signal / Maximalist Type), slide transitions + bullet entrance animations (motion, on by default), and bilingual Chinese/English support. Use when the user asks for a PPT, slides, deck, keynote, 演示文稿, 幻灯片, 汇报, 提案, 路演, 培训材料, or wants to turn a document into a presentation. 中文:把一句话或一篇文档变成完整演示文稿(HTML 网页放映 + PPTX 导出),内置 5 套视觉主题、页间转场与要点入场动画,中英双语。"
4
4
  compatibility: "DSH plugin runs in-process with zero runtime dependencies. The standalone CLI needs Node.js >= 20. Cross-harness: copy this skill directory into any Agent Skills directory."
5
5
  allowed-tools: "Bash, Read, Write, Edit"
6
6
  ---
7
7
 
8
8
  # dsh-ppt
9
9
 
10
- 一句话或一篇文档 → 完整演示文稿:**独立 HTML 网页放映 + 可编辑 PPTX**。这是从内容到成品的完整 SOP;DSH 内安装插件后调用 `ppt_create` / `ppt_themes` 工具,其他 harness 复制本目录并运行 `scripts/build-deck.mjs`。
10
+ 一句话或一篇文档 → 完整演示文稿:**独立 HTML 网页放映 + 可编辑 PPTX**。本文件只做路由与纪律;具体规则按需读取 `references/`。
11
11
 
12
12
  ## 触发条件
13
13
 
14
- - 用户要求做 PPT、幻灯片、演示文稿、deck、keynote、汇报、提案、路演、培训材料。
15
- - 用户给了一句话、一段文字或一篇 Markdown 文档,希望变成可放映/可分享的演示。
16
- - 用户提到导出 PPTX 或网页版幻灯片。
14
+ 用户要做 PPT / 幻灯片 / 演示文稿 / deck / 汇报 / 提案 / 路演 / 培训材料,或给一句话、一段文字、一篇 Markdown 想变成可放映的演示。
17
15
 
18
- ## 核心流水线(每次执行)
16
+ ## 执行纪律(每次都要遵守)
19
17
 
20
- 1. **Probe 需求**:读入用户的句子/文档。确定听众、目标(说服/汇报/教学/发布)、语气与情绪基调。一句话输入不要反问,直接按发布场景推断并产出完整内容。
21
- 2. **Outline 大纲**:产出 5–12 页大纲。每页只讲一个观点;页型组合固定为:封面 → 问题/背景 → 方案/论点(3–6 页)→ 证据/案例 → 行动号召 → 结束页。每页要点不超过 6 条,每条不超过 20 字(中文)或 12 词(英文)。
22
- 3. **Theme 主题**:调用 `ppt_themes`(DSH)或 `node scripts/build-deck.mjs --list-themes`(跨 harness)选择视觉主题。情绪 → 主题映射见 `references/themes.md`;默认 `data`(技术/AI),高管汇报用 `velvet`,数据报表用 `swiss`,温暖叙事用 `soft`,大声量发布用 `bold`。
23
- 4. **Build 生成**:
24
- - DSH 内:调用 `ppt_create`,把大纲写成 Markdown 传 `content`(推荐),或直接传结构化 `slides`。
25
- - 跨 harness:`node <skill-dir>/scripts/build-deck.mjs --title "标题" --content deck.md --theme data --lang zh --out dist`
26
- - 输出三件套:`*.html`(双击即放映)、`*.pptx`(可编辑)、`*.json`(manifest)。
27
- 5. **Verify 校验**:确认 HTML 页数与大纲一致、标题/要点无截断;PPTX 文件头为 `PK`(zip)。DSH 内用文件工具读取确认;跨 harness 用 `unzip -l deck.pptx | grep presentation.xml` 或 PowerShell `Expand-Archive` 抽查。
28
- 6. **Deliver 交付**:给用户三个绝对路径,并说明:HTML 浏览器直接打开(方向键翻页、F 全屏、G 总览、S 演讲者备注、P 打印/另存 PDF);PPTX 用 PowerPoint / WPS / Keynote 打开(备注在演示者视图可见)。
29
-
30
- ## 内容写作规则
31
-
32
- - 一句话输入也要「完整」:封面 = 标题 + 那句话;核心观点页 = 原句放大;结束页 = 谢谢/行动号召。若用户要求更丰富,先自行扩写成 6–10 页大纲再构建。
33
18
  - 一页一个观点;标题是判断句,不是名词短语。
34
- - 正文用短句;先结论后理由;数字和对比比形容词更有说服力。
35
- - 中英双语:`lang` 只决定界面文字(页码/主题标签/结束页),**内容语言由你撰写**。要求双语时,优先每页中文标题 + 英文副标题,或直接生成两份 deck(`--lang zh` 与 `--lang en`)。
36
- - 更多规则见 `references/copywriting.md`。
37
-
38
- ## Markdown 进阶语法(自动识别)
39
-
40
- - **表格**:`| 列 | 列 |` 连续行(第二行 `| --- | --- |` 分隔线)→ 独立 `table` 页(主题色表头,限 9 行 8 列)。数据对比优先用表格,别堆要点。
41
- - **金句**:`>` 引用块 → 独立 `quote` 页;最后一行写 `—— 出处` 会成为署名。
42
- - **演讲者备注**:`<!-- 备注: 这页要讲的内容 -->`(或 `<!-- note: ... -->`)附着到该页。备注不进正文:HTML 放映按 `S` 呼出备注面板,PPTX 写入原生备注(演示者视图可见)。为汇报/演讲类 deck 主动写备注(口径、数据出处、应答预案)。
43
-
44
- ## 主题选择
45
-
46
- 内置 5 套主题(源自 hyperframes 视觉风格库):
47
-
48
- | 主题 ID | 名称 | 情绪 | 适用 |
49
- | --- | --- | --- | --- |
50
- | `data` | 数据漂移 | 未来/沉浸 | AI、技术发布、研究(默认) |
51
- | `swiss` | 瑞士脉冲 | 精准/理性 | 数据、SaaS、开发者工具 |
52
- | `velvet` | 天鹅绒标准 | 高级/克制 | 高管汇报、品牌、融资路演 |
53
- | `soft` | 柔和信号 | 温暖/人本 | 品牌故事、培训、个人分享 |
54
- | `bold` | 极繁大字 | 大声/动能 | 产品发布、活动、大事件 |
55
-
56
- 完整色板与反模式见 `references/themes.md`。
19
+ - 内容语言由你撰写;`lang` 只决定界面文字。
20
+ - 先选主题再构建;不确定就用默认 `data`。
21
+ - 交付前逐项过一遍文末「质量门禁」。
57
22
 
58
- ## 视觉引擎复用(hyperframes)
23
+ ## 核心流水线
59
24
 
60
- 如果 `hyperframes` 技能已安装,生成前先读它的 `visual-styles.md` / `house-style.md` 作为视觉判断依据;本技能的 5 套主题就是把其中 Swiss Pulse / Velvet Standard / Data Drift / Soft Signal / Maximalist Type 五套风格落成确定性 HTML+PPTX 实现。需要高级动画视频版时,才转用 hyperframes;普通演示不要上视频引擎。
61
-
62
- ## 结构化 slides(高级用法)
63
-
64
- `ppt_create` `slides` 与 CLI `--slides` 接受 JSON 数组:
65
-
66
- ```json
67
- [
68
- { "layout": "cover", "title": "标题", "subtitle": "副标题", "kicker": "开场", "notes": "开场先自我介绍 30 秒" },
69
- { "layout": "section", "kicker": "01", "title": "背景" },
70
- { "layout": "bullets", "title": "三个论点", "bullets": ["论点一", "论点二", "论点三"] },
71
- { "layout": "table", "title": "业绩对比", "rows": [["大区", "营收"], ["华东", "1.2 亿"]], "notes": "强调华东增速" },
72
- { "layout": "quote", "title": "慢就是快。", "subtitle": "创始人" },
73
- { "layout": "statement", "title": "核心观点一句话", "subtitle": "支撑说明" },
74
- { "layout": "closing", "title": "谢谢", "subtitle": "行动号召" }
75
- ]
76
- ```
77
-
78
- `layout` 仅限 `cover | section | bullets | statement | quote | table | closing`;每页可选 `notes`(演讲者备注),`table` 页用 `rows`(首行为表头)。Markdown 输入不够精确时,用结构化 slides 重写。
25
+ 1. **Probe 需求**:读入用户的句子/文档,确定听众、目标、语气。一句话输入不要反问,直接按发布场景推断。
26
+ 2. **Outline 大纲**:产出 5–12 页大纲(封面 → 问题/背景 → 方案/论点 3–6 页 → 证据 → 行动号召 → 结束页)。
27
+ 写大纲与正文前先读 `references/copywriting.md`。
28
+ 3. **Theme 主题**:调 `ppt_themes`(DSH)或 `node scripts/build-deck.mjs --list-themes`(跨 harness)。
29
+ 拿不准选哪套时读 `references/themes.md` 的情绪决策树。
30
+ 4. **Build 生成**:
31
+ - DSH 内:调 `ppt_create`,大纲写成 Markdown 传 `content`(推荐),或传结构化 `slides`。
32
+ - 跨 harness:`node <skill-dir>/scripts/build-deck.mjs --title "标题" --content deck.md --theme data --lang zh --out dist`。
33
+ - 动效默认开(页间转场 + 要点逐条入场);严肃/打印场景传 `motion: 'off'`。
34
+ 用表格 / 金句 / 备注 / 结构化 slides 前读 `references/syntax.md`。
35
+ 5. **Verify 校验**:确认 HTML 页数与大纲一致、标题无截断、PPTX 文件头为 `PK`。
36
+ 6. **Deliver 交付**:给用户三个绝对路径,说明 HTML 直接放映(← 翻页 · F 全屏 · G 总览 · S 备注 · P 打印),PPTX 用 PowerPoint / WPS / Keynote 打开(备注在演示者视图可见,bullets 页放映时逐条点击出现)。
37
+
38
+ ## 按需装载索引
39
+
40
+ | 何时读 | 文件 | 内容 |
41
+ | --- | --- | --- |
42
+ | 写大纲 / 正文前 | `references/copywriting.md` | 叙事骨架、单页规则、双语规则 |
43
+ | 选主题拿不准 | `references/themes.md` | 5 套主题色板 + 情绪决策树 |
44
+ | 用表格/金句/备注/结构化 slides | `references/syntax.md` | Markdown 解析、进阶语法、slides JSON、motion 开关 |
45
+ | 交付异常 | `references/troubleshooting.md` | 症状 → 处理对照表 |
79
46
 
80
47
  ## 质量门禁(交付前逐项确认)
81
48
 
82
49
  - [ ] 页数 3–60,首屏是封面,末屏是结束页。
83
- - [ ] 每页有明确标题;bullets 页 1–8 条。
50
+ - [ ] 每页有明确标题;bullets 页 1–8 条,中文每条 ≤ 20 字、英文 ≤ 12 词。
84
51
  - [ ] HTML 与 PPTX 使用同一主题,配色一致。
85
52
  - [ ] 主题色对比度足够(深底浅字或浅底深字)。
86
53
  - [ ] 中文内容无错别字;英文标题用 Title Case。
54
+ - [ ] 最后一页有可执行的行动号召,不只是「谢谢」。
87
55
  - [ ] 文件已写到用户工作区,路径为绝对路径。
88
56
 
89
- ## 故障排查
90
-
91
- | 症状 | 处理 |
92
- | --- | --- |
93
- | `ppt_create` 不存在 | 本插件未安装;用 `node <skill-dir>/scripts/build-deck.mjs` 裸 CLI 生成同样三件套 |
94
- | 未知主题 | `ppt_themes` 或 `--list-themes` 看可用 ID;不要猜 |
95
- | 内容超过 60 页 | 合并论点,或拆成多个 deck;`maxSlides` 默认 60 |
96
- | PPTX 打不开 | 确认文件完整(zip 头 `PK`);Office 首次打开空白版式属正常,编辑视图可用 |
97
- | 双语界面 | `lang: bilingual` 只双语化界面;内容双语由 agent 在写作阶段完成 |
98
-
99
57
  ## 跨 harness 安装
100
58
 
101
59
  把整个 `dsh-ppt` 技能目录复制到目标 agent 的技能目录即可(只依赖 Node 20+):
@@ -30,18 +30,9 @@
30
30
  - 英文标题用 Title Case;术语首现给中文+英文,如「检索增强生成(RAG)」。
31
31
  - 双语时不要逐句直译,按目标语言习惯重写。
32
32
 
33
- ## Markdown 输入规范
34
-
35
- `ppt_create` `build-deck.mjs` 按以下规则解析 Markdown:
36
-
37
- - 第一个 `# 标题` 会成为封面标题;其后的段落/列表成为封面副标题来源。
38
- - 每个 `## 小节`(或更深标题)生成一页:
39
- - 有 `- ` / `* ` / `1.` 列表 → `bullets` 页;
40
- - 无列表且无正文 → `section` 过渡页;
41
- - 有正文段落 → 正文拆句后作为 bullets。
42
- - 没有标题的纯文本:第一段第一句为封面副标题,后续段落按 5 句一组拆成要点页。
43
- - 只有一句话:自动生成「封面 → 核心观点 → 结束页」三页。
44
- - 需要更精细控制时使用结构化 `slides` JSON,不要和 Markdown 混用。
33
+ ## Markdown 与结构化输入
34
+
35
+ 解析规则、表格/金句/备注语法与结构化 `slides` JSON `syntax.md`。
45
36
 
46
37
  ## 示例
47
38
 
@@ -0,0 +1,44 @@
1
+ # dsh-ppt 输入语法参考(Markdown / 结构化 slides / 动效)
2
+
3
+ 只在需要查具体语法时读本文件;常规流程在 SKILL.md。
4
+
5
+ ## Markdown 解析规则
6
+
7
+ `ppt_create` 与 `build-deck.mjs` 按以下规则解析 Markdown:
8
+
9
+ - 第一个 `# 标题` 会成为封面标题;其后的段落/列表成为封面副标题来源。
10
+ - 每个 `## 小节`(或更深标题)生成一页:
11
+ - 有 `- ` / `* ` / `1.` 列表 → `bullets` 页;
12
+ - 无列表且无正文 → `section` 过渡页;
13
+ - 有正文段落 → 正文拆句后作为 bullets。
14
+ - 没有标题的纯文本:第一段第一句为封面副标题,后续段落按 5 句一组拆成要点页。
15
+ - 只有一句话:自动生成「封面 → 核心观点 → 结束页」三页。
16
+ - 需要更精细控制时使用结构化 `slides` JSON,不要和 Markdown 混用。
17
+
18
+ ## 进阶语法(自动识别)
19
+
20
+ - **表格**:`| 列 | 列 |` 连续行(第二行 `| --- | --- |` 分隔线)→ 独立 `table` 页(主题色表头,限 9 行 8 列)。数据对比优先用表格,别堆要点。
21
+ - **金句**:`>` 引用块 → 独立 `quote` 页;最后一行写 `—— 出处` 会成为署名。
22
+ - **演讲者备注**:`<!-- 备注: 这页要讲的内容 -->`(或 `<!-- note: ... -->`)附着到该页。备注不进正文:HTML 放映按 `S` 呼出备注面板,PPTX 写入原生备注(演示者视图可见)。为汇报/演讲类 deck 主动写备注(口径、数据出处、应答预案)。
23
+
24
+ ## 结构化 slides(高级用法)
25
+
26
+ `ppt_create` 的 `slides` 与 CLI `--slides` 接受 JSON 数组:
27
+
28
+ ```json
29
+ [
30
+ { "layout": "cover", "title": "标题", "subtitle": "副标题", "kicker": "开场", "notes": "开场先自我介绍 30 秒" },
31
+ { "layout": "section", "kicker": "01", "title": "背景" },
32
+ { "layout": "bullets", "title": "三个论点", "bullets": ["论点一", "论点二", "论点三"] },
33
+ { "layout": "table", "title": "业绩对比", "rows": [["大区", "营收"], ["华东", "1.2 亿"]], "notes": "强调华东增速" },
34
+ { "layout": "quote", "title": "慢就是快。", "subtitle": "创始人" },
35
+ { "layout": "statement", "title": "核心观点一句话", "subtitle": "支撑说明" },
36
+ { "layout": "closing", "title": "谢谢", "subtitle": "行动号召" }
37
+ ]
38
+ ```
39
+
40
+ `layout` 仅限 `cover | section | bullets | statement | quote | table | closing`;每页可选 `notes`(演讲者备注),`table` 页用 `rows`(首行为表头)。Markdown 输入不够精确时,用结构化 slides 重写。
41
+
42
+ ## 动效(motion)
43
+
44
+ 默认 `motion: on`:HTML 放映有页间淡入与要点逐条入场;PPTX 每页原生淡入转场,`bullets` 页的要点按「点击一次出现一条」放映。交付严肃/打印场景或用户明确要静态时传 `motion: 'off'`(CLI `--motion off`),产物不含任何动画代码。
@@ -53,3 +53,7 @@
53
53
  5. 情绪是大音量/发布会 → `bold`
54
54
 
55
55
  无法判断时用 `data`,不要自造主题 ID。
56
+
57
+ ## 视觉引擎复用(hyperframes)
58
+
59
+ 如果 `hyperframes` 技能已安装,生成前先读它的 `visual-styles.md` / `house-style.md` 作为视觉判断依据;本技能的 5 套主题就是把其中 Swiss Pulse / Velvet Standard / Data Drift / Soft Signal / Maximalist Type 五套风格落成确定性 HTML+PPTX 实现。需要高级动画视频版时,才转用 hyperframes;普通演示不要上视频引擎。
@@ -0,0 +1,13 @@
1
+ # dsh-ppt 故障排查
2
+
3
+ 只在交付异常时读本文件。
4
+
5
+ | 症状 | 处理 |
6
+ | --- | --- |
7
+ | `ppt_create` 不存在 | 本插件未安装;用 `node <skill-dir>/scripts/build-deck.mjs` 裸 CLI 生成同样三件套 |
8
+ | 未知主题 | `ppt_themes` 或 `--list-themes` 看可用 ID;不要猜 |
9
+ | 内容超过 60 页 | 合并论点,或拆成多个 deck;`maxSlides` 默认 60 |
10
+ | PPTX 打不开 | 确认文件完整(zip 头 `PK`);Office 首次打开空白版式属正常,编辑视图可用 |
11
+ | 双语界面 | `lang: bilingual` 只双语化界面;内容双语由 agent 在写作阶段完成 |
12
+ | 放映没有动画 | `motion` 被设为 `off`;默认 `on` 时 HTML 有转场、PPTX 要点逐条点击出现 |
13
+ | HTML 打印要点缺失 | 打印样式已强制显示全部要点;若仍缺失检查浏览器是否屏蔽了动画样式 |
@@ -16,7 +16,7 @@ import { resolve as resolvePath } from 'node:path'
16
16
  import { pathToFileURL } from 'node:url'
17
17
  import { buildDeck, listThemes, THEME_IDS, DEFAULT_THEME } from './deck-core.mjs'
18
18
 
19
- const HELP = `dsh-ppt v0.1.0 —— 一句话 / 一篇文档 → HTML 放映 + PPTX 导出
19
+ const HELP = `dsh-ppt —— 一句话 / 一篇文档 → HTML 放映 + PPTX 导出
20
20
 
21
21
  用法:
22
22
  node build-deck.mjs --title <标题> --content <Markdown 或文件路径> [选项]
@@ -27,8 +27,10 @@ const HELP = `dsh-ppt v0.1.0 —— 一句话 / 一篇文档 → HTML 放映 + P
27
27
  --slides <json> 结构化 slides JSON(可选,与 --content 二选一)
28
28
  --theme <id> 视觉主题:${THEME_IDS.join(' / ')}(默认 ${DEFAULT_THEME})
29
29
  --lang <id> 界面语言:zh / en / bilingual(默认 zh)
30
+ --motion <on|off> 页间转场与要点入场动画(默认 on;off 产出纯静态)
30
31
  --out <dir> 输出目录(默认当前目录)
31
32
  --file <name> 文件名前缀(默认取标题)
33
+ --overwrite 显式覆盖同名三件套(默认自动追加 -1/-2…)
32
34
  --list-themes 列出内置主题
33
35
  --help 显示本帮助
34
36
 
@@ -39,7 +41,7 @@ const HELP = `dsh-ppt v0.1.0 —— 一句话 / 一篇文档 → HTML 放映 + P
39
41
  `
40
42
 
41
43
  export function parseArgv(argv) {
42
- const args = { content: '', slides: null, lang: 'zh', theme: DEFAULT_THEME, out: '.', file: '', title: '' }
44
+ const args = { content: '', slides: null, lang: 'zh', theme: DEFAULT_THEME, motion: undefined, out: '.', file: '', title: '', overwrite: false }
43
45
  const positional = []
44
46
  for (let i = 0; i < argv.length; i += 1) {
45
47
  const raw = String(argv[i])
@@ -54,11 +56,13 @@ export function parseArgv(argv) {
54
56
  }
55
57
  if (key === '--help' || key === '-h') args.help = true
56
58
  else if (key === '--list-themes') args.listThemes = true
59
+ else if (key === '--overwrite') args.overwrite = true
57
60
  else if (key === '--title') args.title = nextValue()
58
61
  else if (key === '--content') args.content = nextValue()
59
62
  else if (key === '--slides') args.slides = JSON.parse(nextValue())
60
63
  else if (key === '--theme') args.theme = nextValue()
61
64
  else if (key === '--lang') args.lang = nextValue()
65
+ else if (key === '--motion') args.motion = nextValue()
62
66
  else if (key === '--out') args.out = nextValue()
63
67
  else if (key === '--file') args.file = nextValue()
64
68
  else positional.push(raw)
@@ -105,8 +109,10 @@ export async function main(argv = process.argv.slice(2), io = {}) {
105
109
  slides,
106
110
  theme: args.theme,
107
111
  lang: args.lang,
112
+ motion: args.motion,
108
113
  outputDir: resolvePath(args.out || '.'),
109
114
  fileName: args.file,
115
+ overwrite: args.overwrite,
110
116
  }
111
117
  const result = buildDeck(options)
112
118
  log('dsh-ppt 已生成 ' + result.slideCount + ' 页演示文稿:')