Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -162,6 +162,9 @@ jobs:
- name: Install dependencies
run: pnpm install --frozen-lockfile

- name: Validate PPT Live generated-file contract
run: pnpm run test:ppt-live

- name: Validate GitHub config
run: pnpm run check:github-config

Expand Down
3 changes: 3 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
"i18n:generate": "node scripts/generate-i18n-contract.mjs",
"i18n:contract:test": "node --test scripts/i18n-contract.test.mjs",
"i18n:contract:test:ci": "cross-env BITFUN_I18N_CONTRACT_TEST_PROFILE=ci node --test scripts/i18n-contract.test.mjs",
"test:ppt-live": "node --test src/crates/contracts/product-domains/src/miniapp/builtin/assets/ppt-live/test/*.test.mjs",
"i18n:audit": "node scripts/i18n-audit.mjs",
"theme:color-audit": "node scripts/audit-theme-colors.mjs",
"theme:color-audit:mobile": "node scripts/audit-theme-colors.mjs --root src/mobile-web/src --baseline scripts/theme-color-governance-baseline.mobile-web.json",
Expand Down Expand Up @@ -106,6 +107,8 @@
},
"packageManager": "pnpm@10.15.0+sha512.486ebc259d3e999a4e8691ce03b5cac4a71cbeca39372a9b762cb500cfdf0873e2cb16abe3d951b1ee2cf012503f027b98b6584e4df22524e0c7450d9ec7aa7b",
"dependencies": {
"jszip": "^3.10.1",
"pdf-lib": "^1.17.1",
"pnpm": "^10.32.1",
"pptxgenjs": "^4.0.1"
}
Expand Down
35 changes: 35 additions & 0 deletions pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

10 changes: 5 additions & 5 deletions src/crates/assembly/core/builtin_skills/ppt-design/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,10 @@ license: MIT

## 项目约定

`{{ppt_project_dir}}` 为当前 deck 根目录,**只在此目录读写**。
Agent 启动时的**当前工作区根目录就是当前 deck 根目录**,不是待替换的模板变量,也不是工作区下另建的同名子目录。所有交付路径都相对当前工作区根目录,且**只在此工作区读写**。

- **页文件**:`slides/slide-01.html` …(两位数编号,与 `outline[].slide_id` 对应)
- **大纲**:`project.json` → `outline[]`:`{ id, title, bullets[], slide_id }`
- **大纲**:`project.json` → `outline[]`:`{ id, title, bullets[], slide_id }`;规划时 `status: "planning"`,仅在全部引用页面完整写入后改为 `status: "complete"`
- **品牌图**:`brand/`

## 核心原则(严格遵守)
Expand Down Expand Up @@ -64,7 +64,7 @@ license: MIT
| 既要复杂视觉又要可改字 pptx | **不可兼得**——说明限制;保留 1920 演讲版或另做简化 960 版 |

```
{{ppt_project_dir}}/
当前工作区根目录/
├── project.json # outline[], slide_order[], style, assumptions
├── brand/
├── slides/slide-XX.html
Expand Down Expand Up @@ -161,10 +161,10 @@ DNA 与样例 → `references/design-styles.md`。

## 工作流

1. **假设 + 纲**:更新 `project.json` 的 `outline[]` / `slide_order`;顺带识别可能受益于图表、图示或更强视觉表达的页面,先不批量写 HTML。**若主题涉及技术方案/工程/系统/项目分析,必须在 outline 阶段就识别出哪些页是「系统组成」「处理流程」「多角色协作」「根因分析」,并标注用架构图/流程图/泳道图/因果链**(参考上方「技术方案类内容的特别触发」)。
1. **假设 + 纲**:先写 `project.json`,设置 `status: "planning"` 并完成 `outline[]` / `slide_order`,再开始任何 `slides/slide-NN.html`;顺带识别可能受益于图表、图示或更强视觉表达的页面,先不批量写 HTML。**若主题涉及技术方案/工程/系统/项目分析,必须在 outline 阶段就识别出哪些页是「系统组成」「处理流程」「多角色协作」「根因分析」,并标注用架构图/流程图/泳道图/因果链**(参考上方「技术方案类内容的特别触发」)。
2. **≥5 页先打样**:做 2 页视觉差异最大的 showcase,定 grammar 再批量(见 slide-decks.md)。
3. **逐页 HTML**:封面 `slide-01`(标题/副标题/作者或日期)→ 按 outline 生成其余页;根据内容与风格自由选择图表、图示、文字、图片或混合构图,每页完整内联 CSS。**写每页时一次写对**:写之前先做垂直预算心算(见「防溢出预算」),写的时候同时遵守四条 OOXML 硬约束(文字用 p/h\* 包裹、纯色无渐变、背景/边框只在 DIV、不用 background-image),写完即止。
4. **禁止事后审计**:所有页面写完后**不得**再回头逐页 Read → Edit 返工,也不得用 Grep 批量检查约束。约束在写时遵守,不事后补救。写完最后一页后直接输出完成总结即可
4. **有界完成检查**:最后一页写完后仅检查一次生成文件协议:`outline[].slide_id` 与 `slide_order` 一一对应、每个 `slides/slide-NN.html` 存在且完整。只补写缺失或不完整文件,不做逐页内容审计,不用 Grep 批量检查设计约束;全部满足后将 `project.json.status` 改为 `"complete"` 并结束
5. **改稿范围**(输入里若有 `scope`):
- `deck`:可改 outline 与任意 `slides/*.html`
- `current_slide` / `slide_index`:**只改指定页**,不动其他 slide 文件
Expand Down
24 changes: 13 additions & 11 deletions src/crates/contracts/product-domains/src/miniapp/builtin.rs
Original file line number Diff line number Diff line change
Expand Up @@ -151,7 +151,7 @@ pub const BUILTIN_APPS: &[BuiltinMiniAppBundle] = &[
},
BuiltinMiniAppBundle {
id: "builtin-ppt-live",
version: 203,
version: 217,
meta_json: include_str!("builtin/assets/ppt-live/meta.json"),
html: include_str!("builtin/assets/ppt-live/index.html"),
css: include_str!("builtin/assets/ppt-live/style.css"),
Expand Down Expand Up @@ -560,20 +560,22 @@ mod tests {
);
assert!(app.ui_js.contains("Unsupported PPT Live action"));
// A single cowork agent turn loads the ppt-design skill and produces
// the whole deck end to end. The prompt is intentionally minimal — the
// skill owns all design rules via progressive disclosure.
// the whole deck end to end. Prompt construction is isolated from the
// host adapter so its generated-file contract can be tested directly.
let adapter_source = include_str!("builtin/assets/ppt-live/src/bitfun-backend-adapter.js");
let prompt_source = include_str!("builtin/assets/ppt-live/src/agent-prompt.js");
assert!(adapter_source.contains("sessionId: options.sessionId"));
assert!(adapter_source.contains("user::bitfun-system::ppt-design"));
assert!(adapter_source.contains("buildAgentPrompt"));
assert!(prompt_source.contains("user::bitfun-system::ppt-design"));
assert!(prompt_source.contains("export function buildAgentPrompt"));
assert!(!adapter_source.contains("app.ai"));
assert!(!adapter_source.contains("installFallbackBackend"));
// The prompt must delegate design rules to the skill, not restate them.
assert!(!adapter_source.contains("EDITABLE_PPTX_HARD_RULES"));
assert!(!adapter_source.contains("PPT_DESIGN_REQUIRED_REFERENCES"));
assert!(!adapter_source.contains("comparisons -> tables/matrices"));
assert!(!adapter_source.contains("Design quality bar"));
assert!(!adapter_source.contains("Müller-Brockmann"));
assert!(!prompt_source.contains("EDITABLE_PPTX_HARD_RULES"));
assert!(!prompt_source.contains("PPT_DESIGN_REQUIRED_REFERENCES"));
assert!(!prompt_source.contains("comparisons -> tables/matrices"));
assert!(!prompt_source.contains("Design quality bar"));
assert!(!prompt_source.contains("Müller-Brockmann"));
assert!(app.ui_js.contains("Unknown MiniApp agent session"));
// Generation follows the ppt-design skill's native file protocol: the
// agent works inside a deck project directory under the app's appdata
Expand All @@ -599,8 +601,8 @@ mod tests {
assert!(!meta["permissions"]["ai"]["enabled"]
.as_bool()
.unwrap_or(true));
// The single cowork agent turn loads the ppt-design skill itself.
assert!(adapter_source.contains("user::bitfun-system::ppt-design"));
// The single cowork agent turn loads the stable ppt-design skill key.
assert!(prompt_source.contains("user::bitfun-system::ppt-design"));
let ppt_live_source = include_str!("builtin/assets/ppt-live/ui.js");
// Single-turn cowork generation: one agent turn produces the whole deck.
assert!(ppt_live_source.contains("runCoworkDeckGeneration"));
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"schemaVersion": 1,
"id": "builtin-ppt-live",
"version": 203
"version": 217
}
Loading
Loading