minimal-agent 0.11.0 → 0.13.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/package.json +5 -1
- package/plugins/workflow-runner/plugin.js +27 -15
- package/plugins/workflow-runner/plugin.ts +34 -20
- package/plugins/workflow-runner/src/agentCommon.js +13 -12
- package/plugins/workflow-runner/src/agentCommon.ts +22 -13
- package/plugins/workflow-runner/src/expressions.js +29 -8
- package/plugins/workflow-runner/src/expressions.ts +28 -10
- package/plugins/workflow-runner/src/index.js +50 -20
- package/plugins/workflow-runner/src/index.ts +75 -31
- package/plugins/workflow-runner/src/multimodal.js +2 -1
- package/plugins/workflow-runner/src/multimodal.ts +2 -1
- package/plugins/workflow-runner/src/recovery.js +9 -2
- package/plugins/workflow-runner/src/recovery.ts +9 -2
- package/plugins/workflow-runner/src/runner.js +31 -5
- package/plugins/workflow-runner/src/runner.ts +33 -5
- package/plugins/workflow-runner/src/stepExecutors/assert.js +2 -1
- package/plugins/workflow-runner/src/stepExecutors/assert.ts +3 -1
- package/plugins/workflow-runner/src/stepExecutors/skill.js +5 -6
- package/plugins/workflow-runner/src/stepExecutors/skill.ts +12 -7
- package/plugins/workflow-runner/src/stepExecutors/tool.js +91 -61
- package/plugins/workflow-runner/src/stepExecutors/tool.ts +111 -71
- package/plugins/workflow-runner/src/stepExecutors/verify.js +6 -3
- package/plugins/workflow-runner/src/stepExecutors/verify.ts +7 -3
- package/plugins/workflow-runner/src/taskIdentity.js +197 -21
- package/plugins/workflow-runner/src/taskIdentity.ts +201 -20
- package/plugins/workflow-runner/src/toolRuntime.js +48 -0
- package/plugins/workflow-runner/src/toolRuntime.ts +64 -0
- package/plugins/workflow-runner/src/types.js +113 -7
- package/plugins/workflow-runner/src/types.ts +137 -14
- package/plugins/workflow-runner/src/workflowState.js +455 -54
- package/plugins/workflow-runner/src/workflowState.ts +508 -63
- package/plugins/workflow-runner/test/cli.e2e.test.ts +20 -0
- package/plugins/workflow-runner/test/context-files.test.ts +47 -16
- package/plugins/workflow-runner/test/e2eNewLayout.test.ts +314 -0
- package/plugins/workflow-runner/test/engineRobustness.test.ts +9 -1
- package/plugins/workflow-runner/test/expressions.test.ts +42 -0
- package/plugins/workflow-runner/test/hostCapability.test.ts +9 -3
- package/plugins/workflow-runner/test/illustrate.load.test.ts +2 -2
- package/plugins/workflow-runner/test/multimodal.test.ts +61 -10
- package/plugins/workflow-runner/test/parseWorkflowArgs.test.ts +19 -0
- package/plugins/workflow-runner/test/ppt.load.test.ts +15 -15
- package/plugins/workflow-runner/test/ralphLoop.e2e.test.ts +3 -2
- package/plugins/workflow-runner/test/research.load.test.ts +328 -0
- package/plugins/workflow-runner/test/runnerPreflight.test.ts +68 -11
- package/plugins/workflow-runner/test/stateLifecycle.test.ts +60 -12
- package/plugins/workflow-runner/test/taskArbitration.test.ts +19 -3
- package/plugins/workflow-runner/test/taskLifecycle.test.ts +61 -7
- package/plugins/workflow-runner/test/toolRuntimeIntegration.test.ts +168 -0
- package/plugins/workflow-runner/test/webppt.load.test.ts +4 -4
- package/plugins/workflow-runner/test/word.load.test.ts +9 -9
- package/skills/skill-creator/scripts/run_eval.py +3 -2
- package/src/cli/print.js +36 -4
- package/src/cli/print.ts +42 -4
- package/src/cli/streamJson.js +19 -4
- package/src/cli/streamJson.ts +17 -4
- package/src/config/configDefaults.js +25 -0
- package/src/config/configDefaults.ts +33 -0
- package/src/config/configFile.js +2 -21
- package/src/config/configFile.ts +11 -24
- package/src/config/configManagement.js +1 -1
- package/src/config/configManagement.ts +2 -2
- package/src/config/configService.js +24 -0
- package/src/config/configService.ts +23 -0
- package/src/context/compact.js +4 -0
- package/src/context/compact.ts +4 -0
- package/src/context/contextBundle.js +38 -13
- package/src/context/contextBundle.ts +47 -13
- package/src/harness/stallGuard.js +19 -4
- package/src/harness/stallGuard.ts +30 -7
- package/src/infra/verification.js +25 -18
- package/src/infra/verification.ts +50 -18
- package/src/loop.js +95 -11
- package/src/loop.ts +125 -16
- package/src/main.js +8 -1
- package/src/main.tsx +7 -1
- package/src/memory/constants.js +10 -0
- package/src/memory/constants.ts +13 -0
- package/src/memory/episodicMemory.js +274 -2
- package/src/memory/episodicMemory.ts +306 -1
- package/src/memory/fileStore.js +24 -4
- package/src/memory/fileStore.ts +22 -2
- package/src/memory/memoryService.js +79 -12
- package/src/memory/memoryService.ts +108 -9
- package/src/memory/repository.js +415 -85
- package/src/memory/repository.ts +437 -86
- package/src/memory/turnJournal.js +95 -0
- package/src/memory/turnJournal.ts +120 -0
- package/src/memory/types.ts +16 -0
- package/src/plugins/pluginApi.ts +30 -6
- package/src/plugins/pluginRunner.js +23 -8
- package/src/plugins/pluginRunner.ts +32 -13
- package/src/prompts/policyRegistry.js +55 -1
- package/src/prompts/policyRegistry.ts +55 -1
- package/src/prompts/promptAssembly.js +39 -7
- package/src/prompts/promptAssembly.ts +145 -59
- package/src/session/runAgentTurn.js +43 -21
- package/src/session/runAgentTurn.ts +68 -26
- package/src/session/runTurn.js +11 -46
- package/src/session/runTurn.ts +12 -46
- package/src/session/runtimeStore.js +149 -0
- package/src/session/runtimeStore.ts +197 -0
- package/src/session/sessionState.js +5 -0
- package/src/session/sessionState.ts +14 -0
- package/src/tools/advisor/advisor.js +76 -9
- package/src/tools/advisor/advisor.ts +79 -9
- package/src/tools/agent/agent.js +143 -14
- package/src/tools/agent/agent.ts +149 -14
- package/src/tools/agent/agentTaskService.js +60 -0
- package/src/tools/agent/agentTaskService.ts +113 -0
- package/src/tools/agent/agentTypes.js +5 -0
- package/src/tools/agent/agentTypes.ts +5 -0
- package/src/tools/bash/bash.js +80 -15
- package/src/tools/bash/bash.ts +83 -15
- package/src/tools/capabilities.js +5 -0
- package/src/tools/capabilities.ts +11 -1
- package/src/tools/edit/edit.js +7 -4
- package/src/tools/edit/edit.ts +7 -4
- package/src/tools/edit/multi-edit.js +4 -2
- package/src/tools/edit/multi-edit.ts +4 -2
- package/src/tools/glob/glob.js +156 -40
- package/src/tools/glob/glob.ts +185 -46
- package/src/tools/index.js +35 -17
- package/src/tools/index.ts +81 -20
- package/src/tools/lsp/lsp.js +165 -22
- package/src/tools/lsp/lsp.ts +206 -36
- package/src/tools/powershell/powershell.js +134 -27
- package/src/tools/powershell/powershell.ts +171 -30
- package/src/tools/presentresult/presentresult.js +10 -0
- package/src/tools/presentresult/presentresult.ts +10 -0
- package/src/tools/read/read.js +249 -29
- package/src/tools/read/read.ts +396 -59
- package/src/tools/shared/diffSummary.js +44 -0
- package/src/tools/shared/diffSummary.ts +63 -0
- package/src/tools/shared/fileActivity.js +2 -1
- package/src/tools/shared/fileActivity.ts +3 -0
- package/src/tools/shared/permanentDeleteGuard.js +57 -0
- package/src/tools/shared/permanentDeleteGuard.ts +71 -0
- package/src/tools/shared/toolOutputStore.js +97 -0
- package/src/tools/shared/toolOutputStore.ts +110 -0
- package/src/tools/skill/skill.js +86 -0
- package/src/tools/skill/skill.ts +94 -0
- package/src/tools/snip/snip.js +67 -0
- package/src/tools/snip/snip.ts +80 -0
- package/src/tools/tasks/backgroundTaskService.js +79 -28
- package/src/tools/tasks/backgroundTaskService.ts +165 -49
- package/src/tools/tasks/taskManagement.js +163 -0
- package/src/tools/tasks/taskManagement.ts +180 -0
- package/src/tools/tasks/taskOutput.js +64 -14
- package/src/tools/tasks/taskOutput.ts +102 -23
- package/src/tools/tasks/taskStop.js +48 -8
- package/src/tools/tasks/taskStop.ts +69 -9
- package/src/tools/tasks/taskStore.js +46 -0
- package/src/tools/tasks/taskStore.ts +77 -0
- package/src/tools/terminal/terminalCapture.js +167 -0
- package/src/tools/terminal/terminalCapture.ts +179 -0
- package/src/tools/trash/trash.js +233 -0
- package/src/tools/trash/trash.ts +283 -0
- package/src/tools/webbrowser/browserControl.js +5 -1
- package/src/tools/webbrowser/browserControl.ts +7 -1
- package/src/tools/webbrowser/webbrowser.js +8 -4
- package/src/tools/webbrowser/webbrowser.ts +8 -4
- package/src/tools/worktree/sessionWorktree.js +128 -0
- package/src/tools/worktree/sessionWorktree.ts +158 -0
- package/src/tools/write/write.js +6 -2
- package/src/tools/write/write.ts +6 -2
- package/src/types.ts +22 -4
- package/src/ui/hooks/useChat.js +31 -11
- package/src/ui/hooks/useChat.ts +31 -13
- package/src/web/protocol.ts +78 -3
- package/workflows/adaptive-research.yaml +5 -5
- package/workflows/book-review-short.yaml +5 -5
- package/workflows/e2e-write-greet.yaml +2 -2
- package/workflows/illustrate.yaml +12 -12
- package/workflows/plan.yaml +18 -18
- package/workflows/ppt.yaml +201 -201
- package/workflows/ralph-loop.yaml +3 -1
- package/workflows/research.md +449 -0
- package/workflows/research.yaml +873 -0
- package/workflows/webppt.yaml +47 -47
- package/workflows/word.yaml +80 -80
- package/workflows/youtube-shorts.yaml +25 -25
package/workflows/webppt.yaml
CHANGED
|
@@ -14,7 +14,7 @@ version: "0.1"
|
|
|
14
14
|
# 中间 scratch(draft/design/deck.html/img_plan/assets/export)故意不声明——收尾 cleanup 删;
|
|
15
15
|
# 声明进来会被「声明产物必须存在」判缺失而 halt。
|
|
16
16
|
artifacts:
|
|
17
|
-
- "
|
|
17
|
+
- "out/webppt/${session}/deck.pptx"
|
|
18
18
|
|
|
19
19
|
# 自愈:LLM/网络瞬态故障 in-run 重跑(端点会分钟级拥塞波,给恢复窗口)。
|
|
20
20
|
self_heal:
|
|
@@ -44,7 +44,7 @@ inputs:
|
|
|
44
44
|
description: "【高级·可选 --input】AI 生图张数控制:默认 -1=由设计文档内容自动定、不设上限;0=完全不生 AI 图(仅纯示意主题);N>0=显式上限 N 张。AI 图只花在真正需要画面的页(封面/章节氛围图、产品/物体/线条图/使用演示、文字与 HTML 都画不清的概念图),不是给内容偏少的页填空的拐杖。能用 HTML/CSS/SVG 表达的图形一律用 HTML、不占额度。"
|
|
45
45
|
- name: out
|
|
46
46
|
type: string
|
|
47
|
-
default: "
|
|
47
|
+
default: "out/webppt/${session}/deck.pptx"
|
|
48
48
|
description: "【高级·可选 --input】输出 PPTX 路径"
|
|
49
49
|
- name: image_intensity
|
|
50
50
|
type: enum
|
|
@@ -102,7 +102,7 @@ steps:
|
|
|
102
102
|
- id: stage_research
|
|
103
103
|
title: "阶段2/11·专业研究 + 撰写基础稿件"
|
|
104
104
|
agent: |
|
|
105
|
-
为主题「${inputs.topic}」做专业研究,产出一篇**知乎高赞深度长文式**的基础稿件,落到
|
|
105
|
+
为主题「${inputs.topic}」做专业研究,产出一篇**知乎高赞深度长文式**的基础稿件,落到 `out/webppt/${session}/build/draft.md`。
|
|
106
106
|
这篇稿件是后续整套 PPT 的**唯一内容源**——它薄,PPT 必然肤浅;它厚且有料,PPT 才立得住。
|
|
107
107
|
成败标准只有一个:**专业、有深度、有观点、有据可依,绝不灌水、绝不百科式罗列。**
|
|
108
108
|
|
|
@@ -121,7 +121,7 @@ steps:
|
|
|
121
121
|
- **专业 / 时效概念优先查权威英文 / 国际源**,消化后用中文转述;对 SEO 内容农场 / 软文保持警惕,宁可少引一条也不抄营销稿。
|
|
122
122
|
- **不要整段复制原文、不要编造来源或链接**。
|
|
123
123
|
|
|
124
|
-
## 四、按"知乎深度长文"结构成稿(用 Write 写
|
|
124
|
+
## 四、按"知乎深度长文"结构成稿(用 Write 写 `out/webppt/${session}/build/draft.md`)
|
|
125
125
|
简体中文、Markdown,**篇幅按主题复杂度自适应、深度优先:通常 2500–6000 字,宁长勿空**(不靠注水凑字)。结构:
|
|
126
126
|
1. **引子**:抛真问题 / 认知张力 / 反直觉点(不要"随着……的发展"套话)。
|
|
127
127
|
2. **核心论点(thesis)**:一句话立住全文判断。
|
|
@@ -135,7 +135,7 @@ steps:
|
|
|
135
135
|
完成后简述:字数、核心论点、几个论点小节、是否联网及覆盖了哪些时效信息。
|
|
136
136
|
allowed_tools: [WebSearch, WebFetch, Read, Write, Glob]
|
|
137
137
|
maxTurns: 24
|
|
138
|
-
done_when: "fileExists('
|
|
138
|
+
done_when: "fileExists('out/webppt/${session}/build/draft.md')"
|
|
139
139
|
# 地基步:稿件是后续全流程的唯一内容源。LLM 调用失败(如 minimax 端点拥塞/空闲超时)时**必须 halt 保留现场**,
|
|
140
140
|
# 不能 continue——否则没 draft.md 会让后面 5 个内容步全因 when=false 跳过、空手撞到导出步「假装推进、实则烂尾」。
|
|
141
141
|
# halt 后重跑按任务身份从本步续跑(错峰/网络恢复即可成)。max_retries 给 2 次 in-run 重试吸收瞬态拥塞。
|
|
@@ -149,9 +149,9 @@ steps:
|
|
|
149
149
|
# **保留 visual.{route,side,note} 字段名** → 下游 image_plan_lint.py(--outline 参数)直接吃 design.json,零适配。
|
|
150
150
|
- id: stage_design_doc
|
|
151
151
|
title: "阶段3/11·Web 页面设计文档(先设计后实现)"
|
|
152
|
-
when: "fileExists('
|
|
152
|
+
when: "fileExists('out/webppt/${session}/build/draft.md')"
|
|
153
153
|
agent: |
|
|
154
|
-
读
|
|
154
|
+
读 `out/webppt/${session}/build/draft.md`,产出一份**详细的 Web 页面设计文档**——这是后续"做网页"的唯一蓝图。
|
|
155
155
|
关键心态:**先把每一页设计清楚(装什么内容、用什么构图、每块怎么呈现、配什么图、背景什么变化),再去实现**。
|
|
156
156
|
不要在本步写 deck.html / 生图(那是后续阶段)。本步只产设计文档 + 配图计划。
|
|
157
157
|
|
|
@@ -221,9 +221,9 @@ steps:
|
|
|
221
221
|
**相邻页不要完全一样**;但不破坏色系一致(仍是同一 VI)。
|
|
222
222
|
|
|
223
223
|
## 五、产物(严格落这些路径)
|
|
224
|
-
1. 用 Write 写
|
|
224
|
+
1. 用 Write 写 `out/webppt/${session}/build/design.md`(人读):逐页 `## 第N页 · <标题>` + archetype + composition + key_point + 要点 +
|
|
225
225
|
各块 render + 配图说明 + 背景意图,便于人复核。
|
|
226
|
-
2. 用 Write 写
|
|
226
|
+
2. 用 Write 写 `out/webppt/${session}/build/design.json`(机读,**严格 JSON、无注释、无 ``` 包裹**):
|
|
227
227
|
- ⚠️ **必须写成紧凑单行 JSON:整份 `{...}` 一行写完,无缩进、无换行、键值间不留多余空格**——
|
|
228
228
|
大文档分行缩进会让一次 Write 的转义量翻倍、推理模型边想边写易写到一半截断(真机 doubao『Unterminated string』整步失败)。紧凑单行最稳。
|
|
229
229
|
- 字段精炼(key_point/points/evidence/note/prompt 都用短句,别灌长文);下面是**字段结构示例**(你产出时压成一整行,别照抄换行缩进):
|
|
@@ -232,7 +232,7 @@ steps:
|
|
|
232
232
|
- `archetype` ∈ cover|section|split|cards|metric|fullbleed|list;`composition` ∈ 左右|左中右|上下|上中下|四宫格|中心辐射|全幅浮层。
|
|
233
233
|
- `route` ∈ html|ai-A|ai-B|none;`side` ∈ left|right|top|bottom|full|none;`render` ∈ text|html+text|text+image|html+text+image。
|
|
234
234
|
- `key_point` 每页必填;`evidence` 内容页必填、封面/章节页可 [];route=ai-* 才需 visual.prompt。
|
|
235
|
-
3. 用 Write 写
|
|
235
|
+
3. 用 Write 写 `out/webppt/${session}/build/img_plan.json`(机读,配图计划):**条数 = route=ai-A/ai-B 的页数**
|
|
236
236
|
(`illustrations=${inputs.illustrations}`:-1=由内容定、0=不写此文件、N>0=不超 N),每条
|
|
237
237
|
`{"file":"img_K.png","aspect":"<由槽位定>","prompt":"<= 对应页 visual.prompt>"}`,K 从 1 连续编号。
|
|
238
238
|
(确无任何页需 AI 图——纯示意主题或 illustrations=0——则不写此文件。)
|
|
@@ -241,7 +241,7 @@ steps:
|
|
|
241
241
|
allowed_tools: [Read, Write, Glob]
|
|
242
242
|
maxTurns: 20
|
|
243
243
|
capture: design_notes
|
|
244
|
-
done_when: "fileExists('
|
|
244
|
+
done_when: "fileExists('out/webppt/${session}/build/design.md') && fileExists('out/webppt/${session}/build/design.json')"
|
|
245
245
|
onError: halt
|
|
246
246
|
# 重活步(读长 draft+layout+vi、出 16 页 JSON)拥塞下首字节延迟易撞空闲超时 → 给 2 次 in-run 重试吸收瞬态拥塞。
|
|
247
247
|
max_retries: 2
|
|
@@ -251,10 +251,10 @@ steps:
|
|
|
251
251
|
# 当场修订到位。不引入人工 pause(webppt 定位=一句话自动产出);不重跑研究,只打磨设计文档。
|
|
252
252
|
- id: stage_design_review
|
|
253
253
|
title: "阶段4/11·对抗评审设计文档(挑刺并修订定稿)"
|
|
254
|
-
when: "fileExists('
|
|
254
|
+
when: "fileExists('out/webppt/${session}/build/design.json')"
|
|
255
255
|
agent: |
|
|
256
256
|
你是一名挑剔的**设计评审 + 内容总监**,对刚产出的 Web 页面设计文档做**对抗式审查并当场修订定稿**。
|
|
257
|
-
先 Read
|
|
257
|
+
先 Read `out/webppt/${session}/build/design.md` 与 `out/webppt/${session}/build/design.json`,再 Read `out/webppt/${session}/build/draft.md` 与上文📌用户原始需求/补充要求。
|
|
258
258
|
|
|
259
259
|
## 第一遍:对照用户原始需求挑刺(列出缺陷清单)
|
|
260
260
|
逐条质问(默认从严,挑得出就是有问题):
|
|
@@ -298,7 +298,7 @@ steps:
|
|
|
298
298
|
# (design.json/deck.html 在磁盘,每轮 Read 即可,不靠 history 记忆);loop 级断点支持中断续跑。
|
|
299
299
|
- id: stage_build_loop
|
|
300
300
|
title: "阶段5/11·分批生成网页(每轮≤5页·页数闸门收口)"
|
|
301
|
-
when: "fileExists('
|
|
301
|
+
when: "fileExists('out/webppt/${session}/build/design.json')"
|
|
302
302
|
type: loop
|
|
303
303
|
max_iterations: 15
|
|
304
304
|
fresh_context: true
|
|
@@ -306,18 +306,18 @@ steps:
|
|
|
306
306
|
- id: build_batch
|
|
307
307
|
title: "阶段5/11·生成下一批页面"
|
|
308
308
|
agent: |
|
|
309
|
-
按设计文档**分批**生成 1920x1080 的 HTML deck(单文件
|
|
309
|
+
按设计文档**分批**生成 1920x1080 的 HTML deck(单文件 `out/webppt/${session}/build/deck.html`、自包含 CSS)。
|
|
310
310
|
**本轮只做一批(最多 5 页),做完即止**——大 deck 一次写完会撞轮数上限、半途烂尾,分批是为了稳。
|
|
311
311
|
|
|
312
312
|
动手前从系统提示「可用技能」里 ui-design 的【技能目录】Read `references/layout-composition.md`
|
|
313
313
|
(grid 结构化构图 + 三层语义化 HTML + 构图均衡),严格照其执行。
|
|
314
314
|
|
|
315
315
|
## 本轮步骤
|
|
316
|
-
1. **先查进度**(确定性):用 Bash 跑 `python <ui-design 目录>/scripts/deck_pages_check.py
|
|
317
|
-
- 它读
|
|
316
|
+
1. **先查进度**(确定性):用 Bash 跑 `python <ui-design 目录>/scripts/deck_pages_check.py out/webppt/${session}/build`。
|
|
317
|
+
- 它读 `out/webppt/${session}/build/design.json` 的页数 + 数 `out/webppt/${session}/build/deck.html` 已有 `<section class="slide">`,输出 `COMPLETE: …` 或 `MISSING: 6,7,8…`。
|
|
318
318
|
- 若输出 **COMPLETE**:deck 已齐,本轮无需生成。**在你回复的最后单独一行打印 `WEBPPT_BUILD_COMPLETE`**,然后结束。
|
|
319
|
-
2. **若 MISSING**:Read
|
|
320
|
-
Read
|
|
319
|
+
2. **若 MISSING**:Read `out/webppt/${session}/build/design.json` 拿到**缺页**(MISSING 列出的页号)的设计(archetype/composition/blocks.render/key_point/points/visual/background);
|
|
320
|
+
Read `out/webppt/${session}/build/deck.html`(若已存在)了解已有结构与**全局 CSS / VI 视觉系统**(保持一致)。
|
|
321
321
|
3. **生成缺页里的下一批(最多 5 页)**,每页一个 `<section class="slide" data-screen-label="NN ...">`(NN=该页 page 号两位数、含中文标题),
|
|
322
322
|
按设计实现:
|
|
323
323
|
- **deck 纵向流式(人可滚动审阅,像 PPT 导出的 PDF)**:`.slide` 容器用 **`position:relative`、每页 1920×1080 自上而下排开**
|
|
@@ -344,10 +344,10 @@ steps:
|
|
|
344
344
|
或 section `background-image:url("assets/img_K.png")` + scrim(B 路线全幅)。图现在还不存在(后续生成),照常引用。
|
|
345
345
|
- **封面标题铁律**:主标 ≤12 字保持一行,主标与副标分属不同 grid 行留足行距(防 Office 重折行压副标题)。
|
|
346
346
|
- **封面/章节文字对比度铁律(治浅底图白字看不清)**:氛围底图亮暗不可控(浅色模板 AI 底图常偏亮),**别默认白字靠弱 scrim**。浅色模板首选 **① 深字(`var(--ink)`) + 浅色磨砂文字板**(`background:rgba(255,255,255,.55);backdrop-filter:blur(6px)`);要白字则 **② scrim/板压到足够暗(不透明度 ≥ .72)**(见 §1.B 两套 CSS)。
|
|
347
|
-
4. **写入
|
|
347
|
+
4. **写入 `out/webppt/${session}/build/deck.html`**:首轮若文件不存在 → 新建含 `<head>` + 全局 CSS(§0.7 流式骨架:`body` 深色衬底 + `.slide{position:relative;width:1920px;height:1080px;margin:0 auto 40px}` 纵向排开 + VI 视觉系统 + `[hidden]{display:none!important}`)+ 本批 section;
|
|
348
348
|
后续轮 → 用 Edit 把本批 `<section>` 追加进 `</body>` 前(保持单文件自包含、CSS 不重复定义)。
|
|
349
349
|
5. **deck 卫生**:不要加 Tweaks/localStorage/postMessage/fitStage/翻页 nav/React/Babel(对导出无用、只干扰)。
|
|
350
|
-
6. 做完本批后**再跑一次 deck_pages_check.py
|
|
350
|
+
6. 做完本批后**再跑一次 deck_pages_check.py out/webppt/${session}/build**:若此时 COMPLETE,回复最后一行打印 `WEBPPT_BUILD_COMPLETE`;
|
|
351
351
|
否则打印 `WEBPPT_BUILD_MORE`(引擎据此进入下一轮继续生成缺页)。
|
|
352
352
|
|
|
353
353
|
完成后简述:本轮生成了哪几页、deck.html 现共几页、是否 COMPLETE。
|
|
@@ -365,22 +365,22 @@ steps:
|
|
|
365
365
|
# 的 visual.note,命中结构名词即回退 HTML/SVG 并从 img_plan 删该条。置于生图前,省下无效生图。
|
|
366
366
|
- id: stage_img_route_gate
|
|
367
367
|
title: "阶段6/11·配图分流闸门(结构图回退 HTML)"
|
|
368
|
-
when: "fileExists('
|
|
368
|
+
when: "fileExists('out/webppt/${session}/build/img_plan.json')"
|
|
369
369
|
agent: |
|
|
370
370
|
确保没有"本该 HTML/SVG 的结构图"被当 AI 图生。结构图(流程/架构/分层/树/决策树/并轨/对比/关系/时间线)
|
|
371
371
|
AI 画必糊、必错、无文字、不可编辑;HTML/SVG 才精确、可编辑、零成本。用 Bash 按序执行:
|
|
372
372
|
1. 跑确定性 lint(脚本在系统提示「可用技能」里 ui-design 的【技能目录】下;--outline 参数直接吃 design.json):
|
|
373
|
-
`python <ui-design 目录>/scripts/image_plan_lint.py
|
|
373
|
+
`python <ui-design 目录>/scripts/image_plan_lint.py out/webppt/${session}/build/img_plan.json --outline out/webppt/${session}/build/design.json -v`
|
|
374
374
|
它会逐条列出违规(命中 架构/分层/流程/决策树/并轨/对比… 等图表名词的 prompt/note)。
|
|
375
|
-
2. **只要列出违规**:对每条——用 Edit 在
|
|
375
|
+
2. **只要列出违规**:对每条——用 Edit 在 `out/webppt/${session}/build/deck.html` 里把该页那个结构**改用 HTML/SVG 画**
|
|
376
376
|
(流程/架构/分层/树/并轨/对比 用 div+CSS Grid 或 `<svg>`;离散视觉块导出器自动切层),
|
|
377
|
-
并从
|
|
377
|
+
并从 `out/webppt/${session}/build/img_plan.json` **删掉该条**;若该页本就需要氛围底图,可保留为**纯氛围 AI 图**(去掉 prompt/note 里的结构名词)。
|
|
378
378
|
改完**重跑第 1 步的 lint**,直到它打印 PASSED。
|
|
379
|
-
3. **lint PASSED 后**才 `touch
|
|
379
|
+
3. **lint PASSED 后**才 `touch out/webppt/${session}/build/img_route_ok`(没过别建这个哨兵)。
|
|
380
380
|
完成后报告:lint 是否 PASSED、回退了哪几页到 HTML、img_plan.json 现剩几条。
|
|
381
381
|
allowed_tools: [Bash, Read, Edit, Write, Glob]
|
|
382
382
|
maxTurns: 30
|
|
383
|
-
done_when: "fileExists('
|
|
383
|
+
done_when: "fileExists('out/webppt/${session}/build/img_route_ok')"
|
|
384
384
|
onError: halt
|
|
385
385
|
max_retries: 1
|
|
386
386
|
|
|
@@ -390,22 +390,22 @@ steps:
|
|
|
390
390
|
# B 路线全幅底图 → 背景层整页截图;A 路线半幅插图 → 中层逐元素切图(独立可编辑图片)。
|
|
391
391
|
- id: stage_gen_images
|
|
392
392
|
title: "阶段7/11·生成插图(按比例)"
|
|
393
|
-
when: "fileExists('
|
|
393
|
+
when: "fileExists('out/webppt/${session}/build/img_plan.json')"
|
|
394
394
|
agent: |
|
|
395
|
-
为 deck 生成 AI 插图,落到
|
|
396
|
-
1. 用 Read 读
|
|
395
|
+
为 deck 生成 AI 插图,落到 `out/webppt/${session}/build/assets/`。用 ai-image 技能的 generate.mjs 脚本。
|
|
396
|
+
1. 用 Read 读 `out/webppt/${session}/build/img_plan.json`:一个数组,每条 `{file, aspect, prompt}`。
|
|
397
397
|
2. 取 generate.mjs 的绝对路径:系统提示「可用技能」里 ai-image 后给出的【技能目录】+ `/scripts/generate.mjs`。
|
|
398
398
|
3. 对**每一条**,用 Bash 跑(**node 不是 bun**;prompt 整体加双引号):
|
|
399
|
-
`node "<ai-image 目录>/scripts/generate.mjs" --prompt "<该条 prompt>" --out
|
|
399
|
+
`node "<ai-image 目录>/scripts/generate.mjs" --prompt "<该条 prompt>" --out out/webppt/${session}/build/assets/<该条 file> --aspect <该条 aspect> --size 1K`
|
|
400
400
|
(`--size 1K` 够用:PPT 由导出端栅格化,deck 1920×1080,1K 清晰度完全够,2K 纯浪费。)
|
|
401
401
|
**调 Bash 时务必把 `timeout` 参数设为 `600000`(10 分钟)**:图像模型很慢(一张常要 1 分钟甚至更久),
|
|
402
402
|
Bash 默认 120s 会把没出图的进程掐断当超时。脚本成功打一行 `saved: ...`;过程往 stderr 打 `[ai-image] attempt …` 进度。
|
|
403
403
|
**逐张等其返回再发下一张**。
|
|
404
|
-
4. 全部生成后用 Glob 或 `ls
|
|
404
|
+
4. 全部生成后用 Glob 或 `ls out/webppt/${session}/build/assets/` 复核每个 file 都已落盘。
|
|
405
405
|
若某张失败,如实报告哪几张没成(不要伪造、不要把报错文本当提示词再发)。
|
|
406
406
|
allowed_tools: [Read, Bash, Glob]
|
|
407
407
|
maxTurns: 20
|
|
408
|
-
done_when: "fileExists('
|
|
408
|
+
done_when: "fileExists('out/webppt/${session}/build/assets/img_1.png')"
|
|
409
409
|
onError: continue
|
|
410
410
|
max_retries: 1
|
|
411
411
|
|
|
@@ -415,22 +415,22 @@ steps:
|
|
|
415
415
|
- id: stage_export
|
|
416
416
|
title: "阶段8/11·导出 PPTX + 构图闸门(重叠/夹带文本必清零·每页≤3次)"
|
|
417
417
|
agent: |
|
|
418
|
-
把
|
|
418
|
+
把 `out/webppt/${session}/build/deck.html` 导出为可编辑 PPTX,通过 OPC 合规 + 构图均衡两道校验。**只用绝对路径调脚本**——
|
|
419
419
|
从系统提示「可用技能」拿 `ui-design` 的【技能目录】(check_ui_artifact / export_pptx_from_html / layout_balance / deck_pages_check 都在这),
|
|
420
420
|
以及 `pptx` 的【技能目录】(**只用其中的 opc_check.py**)。
|
|
421
421
|
⚠️ 本工作流 PPT **全部由 ui-design 的 HTML 三层导出产出**;**不要**用 pptx 技能的 PptxGenJS / addShape / SVG 原生生成路径。
|
|
422
422
|
|
|
423
423
|
步骤(用 Bash 按序执行):
|
|
424
|
-
1. **页数兜底**:`python <ui-design 目录>/scripts/deck_pages_check.py
|
|
424
|
+
1. **页数兜底**:`python <ui-design 目录>/scripts/deck_pages_check.py out/webppt/${session}/build` 确认 COMPLETE;
|
|
425
425
|
若 MISSING(分批 loop 撞上限没做完),按 design.json 用 Edit 补齐缺页再继续。
|
|
426
|
-
2. 产物自检(**分层已自动,标注可选**):`python <ui-design 目录>/scripts/check_ui_artifact.py --for-pptx-export
|
|
426
|
+
2. 产物自检(**分层已自动,标注可选**):`python <ui-design 目录>/scripts/check_ui_artifact.py --for-pptx-export out/webppt/${session}/build/deck.html`
|
|
427
427
|
看有无阻断问题;分层由导出器 tagLayers 自动完成,「未标 foreground/text」提示属预期可忽略。
|
|
428
|
-
3. 确认 img_plan.json 里每个 `assets/img_K.png` 都已存在(Glob / `ls
|
|
428
|
+
3. 确认 img_plan.json 里每个 `assets/img_K.png` 都已存在(Glob / `ls out/webppt/${session}/build/assets/`);缺图则在 deck.html 换占位或去掉,避免空图。
|
|
429
429
|
4. **构图均衡闸门(HTML 层、廉价循环——必须先过这关,再导出 pptx)**:
|
|
430
430
|
**用 Node(不是 Bun)** 跑 measure-only:
|
|
431
|
-
`node <ui-design 目录>/scripts/export_pptx_from_html.mjs
|
|
432
|
-
它秒级量三层几何,写
|
|
433
|
-
然后判:`python <ui-design 目录>/scripts/layout_balance.py
|
|
431
|
+
`node <ui-design 目录>/scripts/export_pptx_from_html.mjs out/webppt/${session}/build/deck.html --measure-only --mode hybrid --width 1920 --height 1080 --workdir out/webppt/${session}/build/export`
|
|
432
|
+
它秒级量三层几何,写 `out/webppt/${session}/build/export/layout-report.json`(不截图/切图/打包)。
|
|
433
|
+
然后判:`python <ui-design 目录>/scripts/layout_balance.py out/webppt/${session}/build/export/layout-report.json -v`
|
|
434
434
|
构图门判定:**ERROR(必清零)= 内容相互叠加(重叠)+ 截图夹带文本(底图/切图带 HTML/SVG/伪元素文字,必不可有)+ 整页啥也没有**;
|
|
435
435
|
**WARNING(提示不拦)= 文本溢出/裁切 + 字号过小(屏上 <24px)+ 超出画布 + 文字对比度不足(深底深字等)+ 占空比族(已加回但宽松、有视觉即降级)**。每条带归一化坐标。
|
|
436
436
|
🚫 **改 deck.html 只准用 Edit(先 Read 取最新内容再 Edit;deck.html 较大、不会自动注入,必须先 Read)。绝对禁止用 Bash 的 `sed`/`awk`/`findstr`/`type`/PowerShell 等替换 HTML 文本**——
|
|
@@ -439,26 +439,26 @@ steps:
|
|
|
439
439
|
- **文字对比度不足(WARNING 但要顺手改)**:用 Edit 改 `<style>` 里的 CSS 变量或该页 class 的 `color`——深底转白/浅字、浅底转深墨字(绝不深底深字)。只改颜色几行、别动结构。
|
|
440
440
|
- **超出画布 / 字号过小(WARNING 但要改,别放任顶出/蚂蚁字)**:按 ① 精炼文案 → ② 长列表改 grid 两列 → ③ 拆页 的顺序处理;**绝不把字缩到 <24px**。
|
|
441
441
|
- **占空 WARNING**:可据「右/下半空」提示去满画布(双列/侧栏视觉),但别为"够不够满"反复改烧配额。
|
|
442
|
-
**只要还有 ERROR(重叠/截图夹带文本),就用 Edit 修
|
|
442
|
+
**只要还有 ERROR(重叠/截图夹带文本),就用 Edit 修 out/webppt/${session}/build/deck.html,重跑 measure-only + layout_balance**,直到 PASSED(WARNING 不阻塞导出,但对比度/超画布/字号过小要顺手改掉)。
|
|
443
443
|
⚠️ **闸门 PASSED 前绝不导出 pptx**——measure-only 秒级,反复全量导出 pptx 才是浪费。
|
|
444
444
|
🛑 **每页修改配额 + 绝不空手放弃(防反复改烧配额 / 防整步 halt——真实事故)**:对每个被判 ERROR 的页**最多修 3 次**(Edit + 重跑 measure-only);
|
|
445
|
-
**第 3 次修改后无条件 `touch
|
|
445
|
+
**第 3 次修改后无条件 `touch out/webppt/${session}/build/layout_ok` 继续导出**;**即便某些问题始终修不动,也必须 `touch layout_ok` 并完成导出 pptx——产出带残留问题的 pptx 远好过空手 halt**,报告里如实列出残留页。
|
|
446
446
|
修的手段(对照 layout-composition.md):
|
|
447
447
|
- **内容相互叠加(重叠)**:**① 先移动/重排躲开**(拉开间距·换槽位·调 grid·放大图形给标签让位)→ **② 精炼/精简该段文案使其更短** → **③ 缩小字体(单次最多 20%、仍 < 该页主标题)** → ④ 拆页/减项。**别一上来狂缩字**(字号已按阶梯放大、要保住)。
|
|
448
448
|
- 图被挤压:**绝不变形**——`object-position` 按热区裁切、或改槽位尺寸按新 aspect,别改 `<img>` 宽高比。
|
|
449
449
|
**复用已生成的同批插图**,重排版不重新生图。
|
|
450
|
-
5. **闸门 PASSED(或每页 3 次配额放行后)**:`touch
|
|
450
|
+
5. **闸门 PASSED(或每页 3 次配额放行后)**:`touch out/webppt/${session}/build/layout_ok`。
|
|
451
451
|
6. **导出一次 pptx**:
|
|
452
|
-
`node <ui-design 目录>/scripts/export_pptx_from_html.mjs
|
|
452
|
+
`node <ui-design 目录>/scripts/export_pptx_from_html.mjs out/webppt/${session}/build/deck.html --out ${inputs.out} --mode ${inputs.mode} --width 1920 --height 1080 --workdir out/webppt/${session}/build/export`
|
|
453
453
|
7. OPC 校验:`python <pptx 目录>/scripts/opc_check.py ${inputs.out}` 确认通过;不通过按 `--repack ${inputs.out}.tmp` + `mv -f` 修回再校。
|
|
454
454
|
**最终输出目录只留 ${inputs.out} 一个 pptx**,带 `fixed`/`.tmp` 的中间 pptx 一律 `rm -f`。
|
|
455
|
-
8. 视觉复核(best-effort):有 `soffice` 就 `soffice --headless --convert-to pdf --outdir
|
|
455
|
+
8. 视觉复核(best-effort):有 `soffice` 就 `soffice --headless --convert-to pdf --outdir out/webppt/${session}/build/export ${inputs.out}` 转图看几页;没有就跳过。
|
|
456
456
|
|
|
457
457
|
完成后报告:输出路径、模式、页数、可编辑性、OPC 结果、**layout_balance 最终是否 PASSED(或每页 3 次配额放行后仍残留哪几页)**。
|
|
458
458
|
allowed_tools: [Bash, Read, Edit, Glob, Grep]
|
|
459
459
|
# 闸门只查重叠+溢出 + 每页≤3次配额放行(重叠不可妥协),轮数便宜但给足 200——宁可配额放行也别撞顶 halt。
|
|
460
460
|
maxTurns: 200
|
|
461
|
-
done_when: "fileExists(inputs.out) && fileExists('
|
|
461
|
+
done_when: "fileExists(inputs.out) && fileExists('out/webppt/${session}/build/layout_ok')"
|
|
462
462
|
onError: halt
|
|
463
463
|
max_retries: 1
|
|
464
464
|
|
|
@@ -476,7 +476,7 @@ steps:
|
|
|
476
476
|
when: "fileExists(inputs.out)"
|
|
477
477
|
tool: Bash
|
|
478
478
|
args:
|
|
479
|
-
command: "rm -rf
|
|
479
|
+
command: "rm -rf out/webppt/${session}/build"
|
|
480
480
|
onError: continue
|
|
481
481
|
|
|
482
482
|
# ---------- 完成报告(echo,确定性、零 LLM 复述) ----------
|