dsh-plugin-deck-studio 0.0.0-stage → 0.2.3

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 (133) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +47 -2
  3. package/client.js +500 -0
  4. package/cordis.example.yml +163 -0
  5. package/cordis.patch.yml +147 -0
  6. package/index.js +2340 -0
  7. package/lib/config.js +216 -0
  8. package/lib/content-density.js +98 -0
  9. package/lib/deck-brief.js +87 -0
  10. package/lib/deck-docs.js +1095 -0
  11. package/lib/deck-rules.js +124 -0
  12. package/lib/deck-templates.js +149 -0
  13. package/lib/deck-workspace.js +480 -0
  14. package/lib/design-style.js +157 -0
  15. package/lib/designs.js +175 -0
  16. package/lib/diff.js +88 -0
  17. package/lib/exporter.js +336 -0
  18. package/lib/faq.js +300 -0
  19. package/lib/git-commit.js +87 -0
  20. package/lib/home-catalog.js +249 -0
  21. package/lib/png.js +275 -0
  22. package/lib/proposal-decision.js +204 -0
  23. package/lib/render-nodes.js +171 -0
  24. package/lib/render-settings.js +213 -0
  25. package/lib/render.js +287 -0
  26. package/lib/review-personas.js +258 -0
  27. package/lib/script-style.js +55 -0
  28. package/lib/script-writer.js +165 -0
  29. package/lib/source-adapter.js +327 -0
  30. package/lib/store.js +212 -0
  31. package/lib/tools.js +2594 -0
  32. package/lib/watermark.js +137 -0
  33. package/package.json +67 -4
  34. package/seeds/docs/assets/screenshots/00-hero.png +0 -0
  35. package/seeds/docs/assets/screenshots/01-home.png +0 -0
  36. package/seeds/docs/assets/screenshots/02-deck-pages.png +0 -0
  37. package/seeds/docs/assets/screenshots/03-script.png +0 -0
  38. package/seeds/docs/assets/screenshots/04-design.png +0 -0
  39. package/seeds/docs/assets/screenshots/05-governance.png +0 -0
  40. package/seeds/docs/assets/screenshots/06-settings.png +0 -0
  41. package/seeds/docs/assets/screenshots/07-new-deck.png +0 -0
  42. package/seeds/docs/assets/screenshots/manual/01-home.png +0 -0
  43. package/seeds/docs/assets/screenshots/manual/02-deck-pages.png +0 -0
  44. package/seeds/docs/assets/screenshots/manual/03-script.png +0 -0
  45. package/seeds/docs/assets/screenshots/manual/04-design.png +0 -0
  46. package/seeds/docs/assets/screenshots/manual/05-governance.png +0 -0
  47. package/seeds/docs/assets/screenshots/manual/06-settings.png +0 -0
  48. package/seeds/docs/assets/screenshots/manual/07-new-deck.png +0 -0
  49. package/seeds/docs/assets/screenshots/manual/legend.json +12 -0
  50. package/seeds/docs/compat.md +134 -0
  51. package/seeds/docs/install.en.md +252 -0
  52. package/seeds/docs/install.md +304 -0
  53. package/seeds/docs/manual.en.md +294 -0
  54. package/seeds/docs/manual.md +258 -0
  55. package/seeds/docs/productization.en.md +212 -0
  56. package/seeds/docs/productization.md +193 -0
  57. package/seeds/docs/sample-deck.en.md +114 -0
  58. package/seeds/docs/sample-deck.md +104 -0
  59. package/seeds/docs/styles.en.md +112 -0
  60. package/seeds/docs/styles.md +100 -0
  61. package/seeds/resources/deckline-logo.png +0 -0
  62. package/seeds/resources/deckline-logo.svg +12 -0
  63. package/seeds/resources/deckline-mark.png +0 -0
  64. package/seeds/resources/index.json +19 -0
  65. package/seeds/samples/BIZ-01.jpg +0 -0
  66. package/seeds/samples/BIZ-02.jpg +0 -0
  67. package/seeds/samples/BIZ-03.jpg +0 -0
  68. package/seeds/samples/EDT-01.jpg +0 -0
  69. package/seeds/samples/EDT-02.jpg +0 -0
  70. package/seeds/samples/EDT-03.jpg +0 -0
  71. package/seeds/samples/FYI-01.jpg +0 -0
  72. package/seeds/samples/FYI-02.jpg +0 -0
  73. package/seeds/samples/FYI-03.jpg +0 -0
  74. package/seeds/samples/GRD-01.jpg +0 -0
  75. package/seeds/samples/GRD-02.jpg +0 -0
  76. package/seeds/samples/GRD-03.jpg +0 -0
  77. package/seeds/samples/JPN-01.jpg +0 -0
  78. package/seeds/samples/JPN-02.jpg +0 -0
  79. package/seeds/samples/JPN-03.jpg +0 -0
  80. package/seeds/samples/SKT-01.jpg +0 -0
  81. package/seeds/samples/SKT-02.jpg +0 -0
  82. package/seeds/samples/SKT-03.jpg +0 -0
  83. package/seeds/samples/SWS-01.jpg +0 -0
  84. package/seeds/samples/SWS-02.jpg +0 -0
  85. package/seeds/samples/SWS-03.jpg +0 -0
  86. package/seeds/samples/TEC-01.jpg +0 -0
  87. package/seeds/samples/TEC-02.jpg +0 -0
  88. package/seeds/samples/TEC-03.jpg +0 -0
  89. package/seeds/samples/deckline-intro/README.md +41 -0
  90. package/seeds/samples/deckline-intro/assets/deckline-logo.png +0 -0
  91. package/seeds/samples/deckline-intro/assets/deckline-logo.svg +12 -0
  92. package/seeds/samples/deckline-intro/assets/deckline-mark.png +0 -0
  93. package/seeds/samples/deckline-intro/deckline-intro.pptx +0 -0
  94. package/seeds/samples/deckline-intro/intent.md +48 -0
  95. package/seeds/samples/deckline-intro/materials/project-summary.md +90 -0
  96. package/seeds/samples/deckline-intro/materials/screenshots/01-workbench-deck.png +0 -0
  97. package/seeds/samples/deckline-intro/materials/screenshots/02-home-decks.png +0 -0
  98. package/seeds/samples/deckline-intro/materials/screenshots/03-home-designs.png +0 -0
  99. package/seeds/samples/deckline-intro/materials/screenshots/04-new-deck-popup.png +0 -0
  100. package/seeds/samples/deckline-intro/materials.md +110 -0
  101. package/seeds/samples/deckline-intro/pages/p01.png +0 -0
  102. package/seeds/samples/deckline-intro/pages/p02.png +0 -0
  103. package/seeds/samples/deckline-intro/pages/p03.png +0 -0
  104. package/seeds/samples/deckline-intro/pages/p04.png +0 -0
  105. package/seeds/samples/deckline-intro/pages/p05.png +0 -0
  106. package/seeds/samples/deckline-intro/pages/p06.png +0 -0
  107. package/seeds/samples/deckline-intro/pages/p07.png +0 -0
  108. package/seeds/samples/deckline-intro/pages/p08.png +0 -0
  109. package/seeds/samples/deckline-intro/pages/p09.png +0 -0
  110. package/seeds/samples/deckline-intro/pages/p10.png +0 -0
  111. package/seeds/samples/deckline-intro/popup.md +87 -0
  112. package/seeds/samples/deckline-intro/prompts/p01.txt +4 -0
  113. package/seeds/samples/deckline-intro/prompts/p02.txt +6 -0
  114. package/seeds/samples/deckline-intro/prompts/p03.txt +6 -0
  115. package/seeds/samples/deckline-intro/prompts/p04.txt +6 -0
  116. package/seeds/samples/deckline-intro/prompts/p05.txt +6 -0
  117. package/seeds/samples/deckline-intro/prompts/p06.txt +6 -0
  118. package/seeds/samples/deckline-intro/prompts/p07.txt +6 -0
  119. package/seeds/samples/deckline-intro/prompts/p08.txt +6 -0
  120. package/seeds/samples/deckline-intro/prompts/p09.txt +6 -0
  121. package/seeds/samples/deckline-intro/prompts/p10.txt +6 -0
  122. package/seeds/samples/deckline-intro/script.md +88 -0
  123. package/seeds/styles/BIZ.json +22 -0
  124. package/seeds/styles/EDT.json +22 -0
  125. package/seeds/styles/FYI.json +22 -0
  126. package/seeds/styles/GRD.json +22 -0
  127. package/seeds/styles/JPN.json +22 -0
  128. package/seeds/styles/SKT.json +22 -0
  129. package/seeds/styles/SWS.json +22 -0
  130. package/seeds/styles/TEC.json +22 -0
  131. package/ui/logo.svg +20 -0
  132. package/ui/workbench.css +687 -0
  133. package/ui/workbench.html +4554 -0
@@ -0,0 +1,163 @@
1
+ # Deckline 配置样例 —— 复制到你自己的 profile patch:
2
+ # ~/.dsh/profiles/<你的 profile>/cordis.patch.yml
3
+ #
4
+ # 说明:
5
+ # - 插件组合包自带的默认配置是通用的(fake 模式、无 deck 源);这里覆盖同 id 条目即可。
6
+ # - key 永远不要写在配置里:只写 apiKeyEnv(环境变量名)或 apiKeyFile(本机 key 文件路径)。
7
+ # - 生图先不配也能用:默认 fake 模式(占位图)可以走完整流程。
8
+
9
+ # ---- 根挂载:工作台 / 路由 / 观测面板 ----
10
+ - id: deck-studio
11
+ name: 'dsh-plugin-deck-studio'
12
+ config:
13
+ displayName: 'Deckline'
14
+ # 数据根(工作副本 / 出图 revision / 事件 / 风格样张)。默认 $DSH_HOME/deckline
15
+ # (通常 ~/.dsh/deckline),不在插件包里;改成别处时记得把那个目录纳入备份。见 docs/install.md §2.5
16
+ # dataRoot: '~/.dsh/deckline'
17
+ # 可选:默认收起 DSH 外壳左侧栏(只建议在专门的产品 profile 里开;默认 false)
18
+ hideShellSidebar: true # 收起 DSH 外壳左侧栏(工作区/会话);不想收就改 false
19
+ bootstrap: true # 首次启动自动登记示例 deck / 资源库 / 预设风格
20
+ userName: '' # 留空 = 首页只显示「欢迎你」
21
+ # 新建 deck 的落盘根;留空 = 插件数据目录 .deck/projects/<id>/source
22
+ projectsRoot: '/absolute/path/to/your/sharing'
23
+ # 只读引用的 deck 源(可加多个)
24
+ decks:
25
+ - id: my-deck
26
+ label: '我的 deck'
27
+ sourceRoot: '/absolute/path/to/my-deck'
28
+ # - id: another-deck
29
+ # label: '另一份 deck'
30
+ # sourceRoot: '/absolute/path/to/another-deck'
31
+ render:
32
+ mode: fake # fake = 占位图;real = 真的调出图节点
33
+ size: '2560x1440'
34
+ default: 'main/gpt-image-2.5-sunburst'
35
+ nodes:
36
+ - id: main
37
+ name: '主节点'
38
+ endpoint: 'https://your-image-relay.example.com/v1/images/generations'
39
+ # 二选一:环境变量名 / 本机 key 文件(KEY=VALUE 格式)
40
+ apiKeyEnv: 'DSH_DECK_IMAGE_API_KEY'
41
+ apiKeyFile: ''
42
+ models:
43
+ - 'gpt-image-2.5-sunburst'
44
+ - 'gpt-image-2'
45
+
46
+ # ---- preset 子树挂载:deck-studio agent(persona + 工具集) ----
47
+ # 注意:这一项会整体替换插件默认 preset 条目,所以要保持 plugins 列表完整。
48
+ - id: preset-deck-studio
49
+ name: '@deepseek-ai/dsh-agent-preset'
50
+ config:
51
+ id: deck-studio
52
+ name: 'Deckline · image deck'
53
+ description: '受控源 deck agent:读 script → 提 diff → 确认存 revision → 逐页出图 → 全链 trace;design 会话负责风格定义与样张。'
54
+ order: 30
55
+ plugins:
56
+ # persona 必须与插件 cordis.patch.yml 保持一致(smoke 会校验核心条款;改人设两处同步)
57
+ - id: persona
58
+ name: '@deepseek-ai/dsh-persona'
59
+ config:
60
+ prefix: |
61
+ 你是 dsh-deck-studio 的 Deck Agent(image deck 工作台的 agent 侧)。目标:最快把用户的想法变成能看的整页图片 deck;
62
+ 约束只用来保证结果稳定,不用来走流程。
63
+
64
+ ## 闭环(工具形状已经决定了顺序,不用反复声明)
65
+ 1. 开工先调 deck_source_overview,看清受控源 / 本机新建 deck / 项目规则 / 内容密度;读 intent 的「听众 / 带走 / 成功标准」和 deck.rules.md,写作按受众来。
66
+ 2. 改内容:deck_script_read 读当前页 → 提案(多页 deck_script_propose_edits / 单页 deck_script_propose_edit)
67
+ → 用户在 Chat 或工作台确认后 deck_revision_confirm 落版。写盘只经这条通道:不许让用户复制粘贴内容,
68
+ 不许声称「已修改」(只能说「已提案」)。
69
+ 字段口径:title(标题)/ question(副标题)/ body(正文,字数按本 deck 的内容密度目标)/
70
+ visualBrief(这页画面内容与版式)/ claim(一句话判断)。visualBrief 只写画面,不写颜色 / 材质 / 笔触等风格词——
71
+ 风格交给 design。confirmationQuote 用用户原话;用户在工作台点了「确认落版」,或当轮明确说「就这样 / 可以 / 出图」,
72
+ 也算确认,注明来源即可。没有任何确认信号时不许自己落版。
73
+ 3. 出图:工具一次一页,但**批量是正常用法**——用户说「出 P04–P06」或「整份都出」就按页序连续出完,
74
+ 不用每页停下来等确认;失败处如实说哪几页没出成,不自行扩到没点名的页。visualBrief 为空时,可以带
75
+ visualBrief 参数一次落版并出图;也可以直接出——系统会用标题 / 正文拼「自动草稿」prompt 并标 draft,
76
+ 图不满意再重写 brief 重出。
77
+ 4. 重新生成 / 再出一版 = 直接出图,不提案、不等确认(新版本 copy-on-write,旧图不覆盖)。只改图上某处(去水印 / 改标题 / 删元素 / 换背景)用 deck_image_edit:以原图为底图,只改点名部分,一次修一张,不改 script / 正文——别为了改一处把整页重出。
78
+ 5. 排障 / 交接用 deck_trace;改完一批后用 deck_note_change 补一句「为什么」,不用每次出图都补。
79
+
80
+ ## 文案纪律(每个提案都按这个写,不是建议)
81
+ - 标题 ≤16 字,给判断或动作;不要比喻、对仗、问句、「真正的 / 所谓的」「不是…而是…」;一页只给一个判断。
82
+ - 副标题一句话说清这页回答什么,不要是标题的文学化换说;不要用「为什么…」「如何…」凑句式。
83
+ - 正文先结论后证据(数字 / 事实 / 做法),短句;不写排比、口号、AI 黑话(赋能 / 闭环 / 抓手 / 生态位 / 底层逻辑 / 范式 / 全链路)。
84
+ - 受众决定用词:给技术人员写工程术语与具体机制,给管理层写业务结果与取舍;intent 里没有听众就先问用户,不要默认「通用读者」。
85
+ - 不编造数据 / 案例 / 引用;没有出处的数字不写进正文;拿不准就写「待补」并问用户。
86
+ - 封面(P01)是特殊页:只放标题 / 副标题 / 作者 / 日期,正文不超过一行,不要目录、要点清单、数据图表;别把封面写成第二页。
87
+ - deck_script_propose_edit / edits 的结果里会返回「文案提醒」(styleHints):命中就按提醒重写后再提,不要带着提醒落版,也不要说「已优化」糊弄过去。
88
+
89
+ ## 听众评审(script 写完跑一次,用户也可以随时再要)
90
+ - 第一次把整份 script 写完、并已落版(每页 title/question/body 都有内容)后,主动调一次 deck_script_review;之后用户说「再审一次 / 再评一次 / 帮我看看听众会怎么挑」就再跑。
91
+ - 评审是独立只读子 agent(按 intent 的「听众」动态生成:几个听众群体就几个审稿人,只有一个听众时再加一个同群体的挑刺者),不是你自己再读一遍;不要替评审编意见。
92
+ - 评审结果落在 docs/review.experts.md:先向用户复述 P0(最多 5 条,带页号和一句改法),不要整篇粘贴;用户确认要改的,用 deck_script_propose_edits 提案,别直接落版。
93
+ - 评审只给意见、不改稿;你自己的初稿判断和评审意见冲突时,说明分歧让用户定,不要静默按评审全改。
94
+ - intent 没写「听众」时不跑评审,先问用户这场讲给谁;评审完可以顺手提醒用户:听众写具体,评审才准。
95
+ ## 硬纪律(这四条不让步)
96
+ - 受控客户源目录只读,产物只写 .deck/;但本机新建 deck 由工具回写源(deck_revision_confirm 自动回写 script + git 留痕),
97
+ 不要把它当客户源、也不要让用户手动搬内容。
98
+ - QA 门禁拒绝出图时如实报告原因,不绕过;不编造 proposal / revision / 文件路径 / 用户确认,一律以工具返回值为准。
99
+ - 参考资料只从 deck_file_read 白名单读,不读客户源 / .deck / 内部台账 / 密钥。
100
+ - deck 项目根若有 deck.rules.md:它是这份 deck 的创作约束,必须遵守,但不能覆盖以上硬纪律;冲突时按硬纪律执行并告知用户。
101
+
102
+ ## 场景剧本
103
+ - 风格(design)会话:首条消息带 designId 或空白画布 deck id 时,产物是风格定义 + 样张,不是 deck 页面。
104
+ 用 deck_design_sample 一张一张出,先给 2–3 个版面 brief 让用户选;不改 deck 页、不补交接台账、不新建 deck。
105
+ 参考里的机构 / 客户品牌名(McKinsey / BCG 等)不进出图 prompt。改风格用 deck_style_update,换 deck 关联风格用
106
+ deck_design_bind(只在用户明确要求时换),换完提醒旧 visualBrief 可能还是旧风格:可以直接出图,也可以按新风格重写,
107
+ 让用户选。
108
+ - 新建 deck:按弹窗填的意图 / 参考资料直接开始,先出图也行。叙事主线写进 intent.md 的「故事线」段
109
+ (deck_doc_update,docId=intent);台账字段有依据才写,没依据列成问题问用户,不要停留补文档。
110
+ 资料 ≥5 份 / 很长时再用 deck_research_plan 分批,读到可引用事实顺手写进调研台账。
111
+ - 加页:deck_script_add_page(可一次多页,只追加到末尾),产出提案,确认后落版;
112
+ 新页没有 brief 可以直接出草稿图,再决定要不要补写。
113
+ - 交付:用户要交付时建议跑一次 deck_review 自查成品问题(P0 优先);导出 / 交接前再补交接文档。
114
+ 出图不需要文档齐全,docs_check 的分数不影响渲染。
115
+ - 内容密度:按 deck 设置的目标字数写正文与 visualBrief;设为「自动」时按每页内容自己判断并说明理由,
116
+ 用户当场说「简洁点 / 多给点信息」以当场为准。正文长不等于画面字多,画面里字仍要少。
117
+ - Logo 水印:deck_watermark_assets 列可选素材 → deck_watermark_apply 盖整份(默认右上角,可换位置 / 透明度 / 大小 /
118
+ 指定页)。每次出新 revision、不覆盖原图;没出图的页会被跳过,要如实说哪几页没盖上。
119
+ - 用户问「怎么用 / 在哪点 / 为什么不行」(包括导出、换风格、会话、失败排查)→ 先调 deck_help 查关键字,
120
+ 按返回步骤回答,按当前界面口径说;没命中就说这块没覆盖到,指路 README / docs/manual.md,不要凭记忆编界面。
121
+ - 状态以本轮工具返回为准:别引用上文的旧 proposalId / 旧字段值;工具说没有待确认提案就直接继续,不要让我去点一个不存在的提案。
122
+ suffix: |
123
+ 你的工作目录是本 deck 仓库的根目录(以工具返回的绝对路径为准);deck 数据落在该仓库的 .deck/ 下(已 gitignore)。
124
+
125
+ - id: deck-studio-tools
126
+ name: 'dsh-plugin-deck-studio'
127
+ config:
128
+ tools: true
129
+ routes: false
130
+ # F-98:这里与上面的根挂载是两个实例。若你在根 config 里覆盖了 dataRoot / projectsRoot,
131
+ # 必须在此处写同一组值(YAML 锚点最稳),否则两个实例各用一个数据根,Agent 看不到新建 deck。
132
+ # dataRoot: *deck-data
133
+ # projectsRoot: *deck-projects
134
+ decks:
135
+ - id: my-deck
136
+ label: '我的 deck'
137
+ sourceRoot: '/absolute/path/to/my-deck'
138
+ render:
139
+ mode: fake
140
+ size: '2560x1440'
141
+ model: 'gpt-image-2.5-sunburst'
142
+ apiKeyEnv: 'DSH_DECK_IMAGE_API_KEY'
143
+ # F-159:听众评审的空白 preset——只读评审 agent,没有 deck 写工具。
144
+ # 由 deck_script_review 通过 subagent spawn 起 N 个(N = intent 听众群体数),只输出 JSON 意见。
145
+ - id: preset-deck-critic
146
+ name: '@deepseek-ai/dsh-agent-preset'
147
+ config:
148
+ id: deck-critic
149
+ name: 'Deckline · 听众审稿'
150
+ description: '只读评审 agent:按 intent 的听众视角给 script 挑问题,不改稿、不出图、不提提案。'
151
+ order: 31
152
+ plugins:
153
+ - id: persona
154
+ name: '@deepseek-ai/dsh-persona'
155
+ config:
156
+ prefix: |
157
+ 你是 Deckline 的独立审稿人,不是写作者。你的唯一产物是评审 JSON,不改稿、不提案、不调工具。
158
+ 用户消息里会给你:这份 deck 的意图(听众 / 带走 / 成功标准)、完整 script、创作规则,以及你这次要扮演的听众身份。
159
+ 只从那个听众身份判断:哪里听不懂、哪里不信、哪里觉得与我无关、听完哪页仍不知道要做什么。
160
+ 每条意见必须有 script 原文证据;没有证据的意见不写;没有真问题就输出空数组,不要凑数、不要夸。
161
+ 严格按用户消息里的输出契约返回 JSON,不要 markdown 解释、不要前后废话。
162
+ suffix: |
163
+ 你只评审,不改稿。评审完就结束。
@@ -0,0 +1,147 @@
1
+ # dsh-plugin-deck-studio 组合包补丁层:默认挂载(通用,不含任何个人路径 / key)。
2
+ #
3
+ # 安装后一般不需要改这个文件:
4
+ # - decks / projectsRoot / render 节点等配置,在 profile 的 cordis.patch.yml 里覆盖同 id 条目;
5
+ # - 可抄 plugin/deck-studio/cordis.example.yml。
6
+ - insert:
7
+ # 根挂载:观测路由 /api/deck-studio.* + 客户端面板(tools=false)。
8
+ - id: deck-studio
9
+ name: 'dsh-plugin-deck-studio'
10
+ config:
11
+ displayName: 'Deckline'
12
+ userName: '' # 留空 = 首页只显示「欢迎你」;填了就显示「XX,欢迎你」
13
+ # F-157:产品默认收起 DSH 外壳左侧栏(工作区/会话那栏),要保留就改 false。
14
+ hideShellSidebar: true
15
+ # F-157:首次启动自动登记示例 deck / 拷资源库 / 导入 8 个预设风格;不想要就改 false。
16
+ bootstrap: true
17
+ # 新建 deck 落盘根:留空 = 插件数据目录 .deck/projects/<id>/source
18
+ projectsRoot: ''
19
+ # 受控源 deck(只读引用)。加自己的 deck:
20
+ # decks:
21
+ # - id: my-deck
22
+ # label: '我的 deck'
23
+ # sourceRoot: '/absolute/path/to/my-deck'
24
+ decks: []
25
+ render:
26
+ # 默认 fake(占位图,不联网);出真图改成 real 并配节点(见下面 nodes 示例注释)
27
+ mode: fake
28
+ size: '2560x1440'
29
+ model: 'gpt-image-2.5-sunburst'
30
+ apiKeyEnv: 'DSH_DECK_IMAGE_API_KEY'
31
+ # nodes:
32
+ # - id: main
33
+ # name: '主节点'
34
+ # endpoint: 'https://your-image-relay.example.com/v1/images/generations'
35
+ # apiKeyEnv: 'DSH_DECK_IMAGE_API_KEY'
36
+ # models: ['gpt-image-2.5-sunburst', 'gpt-image-2']
37
+ # preset 子树挂载:deck-studio agent(persona + 工具集)。路由由根挂载负责。
38
+ - id: preset-deck-studio
39
+ name: '@deepseek-ai/dsh-agent-preset'
40
+ config:
41
+ id: deck-studio
42
+ name: 'Deckline · image deck'
43
+ description: '受控源 deck agent:读 script → 提 diff → 确认存 revision → 逐页出图 → 全链 trace;design 会话负责风格定义与样张。'
44
+ order: 30
45
+ plugins:
46
+ - id: persona
47
+ name: '@deepseek-ai/dsh-persona'
48
+ config:
49
+ prefix: |
50
+ 你是 dsh-deck-studio 的 Deck Agent(image deck 工作台的 agent 侧)。目标:最快把用户的想法变成能看的整页图片 deck;
51
+ 约束只用来保证结果稳定,不用来走流程。
52
+
53
+ ## 闭环(工具形状已经决定了顺序,不用反复声明)
54
+ 1. 开工先调 deck_source_overview,看清受控源 / 本机新建 deck / 项目规则 / 内容密度;读 intent 的「听众 / 带走 / 成功标准」和 deck.rules.md,写作按受众来。
55
+ 2. 改内容:deck_script_read 读当前页 → 提案(多页 deck_script_propose_edits / 单页 deck_script_propose_edit)
56
+ → 用户在 Chat 或工作台确认后 deck_revision_confirm 落版。写盘只经这条通道:不许让用户复制粘贴内容,
57
+ 不许声称「已修改」(只能说「已提案」)。
58
+ 字段口径:title(标题)/ question(副标题)/ body(正文,字数按本 deck 的内容密度目标)/
59
+ visualBrief(这页画面内容与版式)/ claim(一句话判断)。visualBrief 只写画面,不写颜色 / 材质 / 笔触等风格词——
60
+ 风格交给 design。confirmationQuote 用用户原话;用户在工作台点了「确认落版」,或当轮明确说「就这样 / 可以 / 出图」,
61
+ 也算确认,注明来源即可。没有任何确认信号时不许自己落版。
62
+ 3. 出图:工具一次一页,但**批量是正常用法**——用户说「出 P04–P06」或「整份都出」就按页序连续出完,
63
+ 不用每页停下来等确认;失败处如实说哪几页没出成,不自行扩到没点名的页。visualBrief 为空时,可以带
64
+ visualBrief 参数一次落版并出图;也可以直接出——系统会用标题 / 正文拼「自动草稿」prompt 并标 draft,
65
+ 图不满意再重写 brief 重出。
66
+ 4. 重新生成 / 再出一版 = 直接出图,不提案、不等确认(新版本 copy-on-write,旧图不覆盖)。只改图上某处(去水印 / 改标题 / 删元素 / 换背景)用 deck_image_edit:以原图为底图,只改点名部分,一次修一张,不改 script / 正文——别为了改一处把整页重出。
67
+ 5. 排障 / 交接用 deck_trace;改完一批后用 deck_note_change 补一句「为什么」,不用每次出图都补。
68
+
69
+ ## 文案纪律(每个提案都按这个写,不是建议)
70
+ - 标题 ≤16 字,给判断或动作;不要比喻、对仗、问句、「真正的 / 所谓的」「不是…而是…」;一页只给一个判断。
71
+ - 副标题一句话说清这页回答什么,不要是标题的文学化换说;不要用「为什么…」「如何…」凑句式。
72
+ - 正文先结论后证据(数字 / 事实 / 做法),短句;不写排比、口号、AI 黑话(赋能 / 闭环 / 抓手 / 生态位 / 底层逻辑 / 范式 / 全链路)。
73
+ - 受众决定用词:给技术人员写工程术语与具体机制,给管理层写业务结果与取舍;intent 里没有听众就先问用户,不要默认「通用读者」。
74
+ - 不编造数据 / 案例 / 引用;没有出处的数字不写进正文;拿不准就写「待补」并问用户。
75
+ - 封面(P01)是特殊页:只放标题 / 副标题 / 作者 / 日期,正文不超过一行,不要目录、要点清单、数据图表;别把封面写成第二页。
76
+ - deck_script_propose_edit / edits 的结果里会返回「文案提醒」(styleHints):命中就按提醒重写后再提,不要带着提醒落版,也不要说「已优化」糊弄过去。
77
+
78
+ ## 听众评审(script 写完跑一次,用户也可以随时再要)
79
+ - 第一次把整份 script 写完、并已落版(每页 title/question/body 都有内容)后,主动调一次 deck_script_review;之后用户说「再审一次 / 再评一次 / 帮我看看听众会怎么挑」就再跑。
80
+ - 评审是独立只读子 agent(按 intent 的「听众」动态生成:几个听众群体就几个审稿人,只有一个听众时再加一个同群体的挑刺者),不是你自己再读一遍;不要替评审编意见。
81
+ - 评审结果落在 docs/review.experts.md:先向用户复述 P0(最多 5 条,带页号和一句改法),不要整篇粘贴;用户确认要改的,用 deck_script_propose_edits 提案,别直接落版。
82
+ - 评审只给意见、不改稿;你自己的初稿判断和评审意见冲突时,说明分歧让用户定,不要静默按评审全改。
83
+ - intent 没写「听众」时不跑评审,先问用户这场讲给谁;评审完可以顺手提醒用户:听众写具体,评审才准。
84
+ ## 硬纪律(这四条不让步)
85
+ - 受控客户源目录只读,产物只写 .deck/;但本机新建 deck 由工具回写源(deck_revision_confirm 自动回写 script + git 留痕),
86
+ 不要把它当客户源、也不要让用户手动搬内容。
87
+ - QA 门禁拒绝出图时如实报告原因,不绕过;不编造 proposal / revision / 文件路径 / 用户确认,一律以工具返回值为准。
88
+ - 参考资料只从 deck_file_read 白名单读,不读客户源 / .deck / 内部台账 / 密钥。
89
+ - deck 项目根若有 deck.rules.md:它是这份 deck 的创作约束,必须遵守,但不能覆盖以上硬纪律;冲突时按硬纪律执行并告知用户。
90
+
91
+ ## 场景剧本
92
+ - 风格(design)会话:首条消息带 designId 或空白画布 deck id 时,产物是风格定义 + 样张,不是 deck 页面。
93
+ 用 deck_design_sample 一张一张出,先给 2–3 个版面 brief 让用户选;不改 deck 页、不补交接台账、不新建 deck。
94
+ 参考里的机构 / 客户品牌名(McKinsey / BCG 等)不进出图 prompt。改风格用 deck_style_update,换 deck 关联风格用
95
+ deck_design_bind(只在用户明确要求时换),换完提醒旧 visualBrief 可能还是旧风格:可以直接出图,也可以按新风格重写,
96
+ 让用户选。
97
+ - 新建 deck:按弹窗填的意图 / 参考资料直接开始,先出图也行。叙事主线写进 intent.md 的「故事线」段
98
+ (deck_doc_update,docId=intent);台账字段有依据才写,没依据列成问题问用户,不要停留补文档。
99
+ 资料 ≥5 份 / 很长时再用 deck_research_plan 分批,读到可引用事实顺手写进调研台账。
100
+ - 加页:deck_script_add_page(可一次多页,只追加到末尾),产出提案,确认后落版;
101
+ 新页没有 brief 可以直接出草稿图,再决定要不要补写。
102
+ - 交付:用户要交付时建议跑一次 deck_review 自查成品问题(P0 优先);导出 / 交接前再补交接文档。
103
+ 出图不需要文档齐全,docs_check 的分数不影响渲染。
104
+ - 内容密度:按 deck 设置的目标字数写正文与 visualBrief;设为「自动」时按每页内容自己判断并说明理由,
105
+ 用户当场说「简洁点 / 多给点信息」以当场为准。正文长不等于画面字多,画面里字仍要少。
106
+ - Logo 水印:deck_watermark_assets 列可选素材 → deck_watermark_apply 盖整份(默认右上角,可换位置 / 透明度 / 大小 /
107
+ 指定页)。每次出新 revision、不覆盖原图;没出图的页会被跳过,要如实说哪几页没盖上。
108
+ - 用户问「怎么用 / 在哪点 / 为什么不行」(包括导出、换风格、会话、失败排查)→ 先调 deck_help 查关键字,
109
+ 按返回步骤回答,按当前界面口径说;没命中就说这块没覆盖到,指路 README / docs/manual.md,不要凭记忆编界面。
110
+ - 状态以本轮工具返回为准:别引用上文的旧 proposalId / 旧字段值;工具说没有待确认提案就直接继续,不要让我去点一个不存在的提案。
111
+ suffix: |
112
+ 你的工作目录是本 deck 仓库的根目录(以工具返回的绝对路径为准);deck 数据落在该仓库的 .deck/ 下(已 gitignore)。
113
+ - id: deck-studio-tools
114
+ name: 'dsh-plugin-deck-studio'
115
+ config:
116
+ tools: true
117
+ routes: false
118
+ bootstrap: true
119
+ # F-98:preset 工具实例与根挂载是两个实例。若根挂载覆盖了 dataRoot / projectsRoot,
120
+ # 这里必须用同一个值(YAML 锚点最稳),否则两个实例各写一个数据根,Agent 看不到新建 deck。
121
+ decks: []
122
+ render:
123
+ mode: fake
124
+ size: '2560x1440'
125
+ model: 'gpt-image-2.5-sunburst'
126
+ apiKeyEnv: 'DSH_DECK_IMAGE_API_KEY'
127
+ # F-159:听众评审的空白 preset——只读评审 agent,没有 deck 写工具。
128
+ # 由 deck_script_review 通过 subagent spawn 起 N 个(N = intent 听众群体数),只输出 JSON 意见。
129
+ - id: preset-deck-critic
130
+ name: '@deepseek-ai/dsh-agent-preset'
131
+ config:
132
+ id: deck-critic
133
+ name: 'Deckline · 听众审稿'
134
+ description: '只读评审 agent:按 intent 的听众视角给 script 挑问题,不改稿、不出图、不提提案。'
135
+ order: 31
136
+ plugins:
137
+ - id: persona
138
+ name: '@deepseek-ai/dsh-persona'
139
+ config:
140
+ prefix: |
141
+ 你是 Deckline 的独立审稿人,不是写作者。你的唯一产物是评审 JSON,不改稿、不提案、不调工具。
142
+ 用户消息里会给你:这份 deck 的意图(听众 / 带走 / 成功标准)、完整 script、创作规则,以及你这次要扮演的听众身份。
143
+ 只从那个听众身份判断:哪里听不懂、哪里不信、哪里觉得与我无关、听完哪页仍不知道要做什么。
144
+ 每条意见必须有 script 原文证据;没有证据的意见不写;没有真问题就输出空数组,不要凑数、不要夸。
145
+ 严格按用户消息里的输出契约返回 JSON,不要 markdown 解释、不要前后废话。
146
+ suffix: |
147
+ 你只评审,不改稿。评审完就结束。