skills/fund-slides/SKILL.md
wangyitong a65adcc2e5 Initial commit: merged, deduplicated, and vetted skill collection
Sources: extracted from two upstream archives (skill-repo, skills-main),
merged with the following policy:

- 15 broken symlinks (pointing to /Users/jameslee/.cc-switch/skills or
  ../../.agents/skills on a foreign machine) discarded
- 3 real name collisions with identical content (ai-pair, ifind-http-api,
  zhipu-websearch) kept as one copy
- Functional overlaps deduped keeping the strongest variant:
  - docx family: kept docx (official, full toolchain) + docx-cn
    (GB/T 9704 Chinese official-document constants),
    dropped docx_writer (no scripts, name collided with docx)
  - humanizer family: kept humanizer-zh (6 zh reference docs),
    dropped humanizer (en, redundant for CN workflow)
- Skills that only ran in a foreign environment removed:
  ablemind-ops, app-publish, hlb-design-system, openclaw-adj-skill,
  claude-driver
- alphapai excluded from this public repo because its SKILL.md hard-coded
  live credentials

Result: 25 skills, 572 files, ~7.5 MB.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-13 14:47:12 +08:00

308 lines
13 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
name: fund-slides
description: Create animation-rich HTML presentations from any content. Provides intelligent content-to-visual mapping -- given information of any type, selects the optimal slide layout, chart, and animation. Zero-dependency single HTML files with Chinese font support and ECharts inline integration. Use when the user wants to build a presentation, convert a PPT/PPTX to web, or create slides.
---
# Frontend Slides
将任意内容转化为零依赖、动画丰富的 HTML 演示文稿。
本技能不关心内容从哪来、用什么分析框架 -- 它只做一件事:**给定一块信息,选择最佳的视觉呈现方式。**
## Core Principles
1. **Content-Agnostic** -- 技能不决定"展示什么",只决定"怎么展示"。研究逻辑由用户或上游技能负责。
2. **Zero Dependencies** -- 单 HTML 文件CSS/JS 全部内联。需要图表时ECharts 库直接内嵌在 HTML 的 `<script>` 标签中(通过 WebFetch 下载 echarts.min.js 后内联),确保离线可用。
3. **Show, Don't Tell** -- 生成可视化预览让用户选择风格,而非要求用户用语言描述偏好。
4. **Viewport Fitting (NON-NEGOTIABLE)** -- 每张 slide 精确适配 100vh。禁止滚动。内容超限时拆分。
5. **No Emoji** -- 禁止任何 emoji。用 CSS 形状、SVG 图标或文字替代。
6. **Chinese Font Required** -- 每份演示文稿必须包含中文字体回退链。
## Design Aesthetics
杜绝"AI 味"。每份演示文稿都应有定制感。
- 字体:选择有辨识度的字体,避免 Arial/Inter/Roboto。所有字号用 `clamp()`
- 配色:主色 + 锐利强调色避免均匀分布。CSS 变量保持一致。
- 动画:聚焦高影响力时刻 -- 入场交错显现优于零散微交互。
- 背景:渐变/图案/纹理营造层次,而非纯色。
## Viewport Fitting Rules
适用于每张 slide 的不变量:
- `.slide`: `height: 100vh; height: 100dvh; overflow: hidden;`
- 所有字号: `clamp(min, preferred, max)` -- 禁止固定 px/rem
- 所有间距: `clamp()` 或视口单位
- 图片: `max-height: min(50vh, 400px)`
- 断点: 700px, 600px, 500px (height), 600px (width)
- `prefers-reduced-motion` 支持
- CSS 函数取反用 `calc(-1 * clamp(...))` -- 禁止 `-clamp()`
---
## Phase 0: Detect Mode
- **Mode A: 新建** -- 用户提供内容(文本/数据/图片),从零创建。进入 Phase 1。
- **Mode B: PPT 转换** -- 转换 .pptx 文件。进入 Phase 4。
- **Mode C: 增强** -- 改进现有 HTML 演示文稿。遵循 Mode C 规则。
### Mode C: 修改规则
1. 添加内容前统计现有元素,对照密度限制
2. 任何修改后验证: `overflow: hidden`、`clamp()` 字号、图片 max-height
3. 将要溢出时主动拆分并告知用户
---
## Phase 1: Content Discovery
**目标:理解用户有什么内容,而非告诉用户应该有什么内容。**
通过一次 AskUserQuestion 收集信息:
**问题 1 -- 内容来源** (header: "内容"):
你的内容是什么形式?选项:
- "内容已就绪" -- 有完整的文字/数据/图表素材
- "有粗略笔记" -- 有要点但未整理
- "仅有主题" -- 只有主题,需要协助组织结构
**问题 2 -- 长度** (header: "长度"):
大约多少页?选项:简短 5-10 / 中等 10-20 / 较长 20+
**问题 3 -- 图表需求** (header: "图表"):
是否需要数据图表?选项:
- "ECharts (推荐)" -- 折线/柱状/饼图/K线/瀑布图,内嵌到 HTML 中,离线可用
- "简单 SVG" -- 更轻量,适合简单图表
- "不需要"
**问题 4 -- 在线编辑** (header: "编辑"):
是否需要浏览器内编辑文字?选项:是(推荐) / 否
然后请用户提供内容。
### Step 1.2: Content Analysis
**用户提供内容后,读取 [content-mapping.md](content-mapping.md) 进行内容分析:**
1. **识别** -- 将用户内容拆解为独立信息块
2. **分类** -- 对每块内容标注信息类型(数值指标 / 时序趋势 / 结构构成 / 对比关系 / 叙事论点 / 时间序列 / 风险评估)
3. **映射** -- 为每块内容匹配最佳视觉形式KPI卡片 / 图表 / 表格 / 分栏 / 列表 / 时间线 / 对比卡片)
4. **排序** -- 组织 slide 顺序(概览 -> 核心内容 -> 结论)
5. **呈现给用户确认** -- 展示映射结果表格
示例输出:
```
Slide 大纲:
| # | 内容 | 信息类型 | 视觉形式 |
|---|------|---------|---------|
| 1 | 标题与主题 | -- | 标题页 |
| 2 | 6 个核心财务指标 | 少量关键指标 | KPI 卡片网格 |
| 3 | 2019-2024 营收趋势 | 时间序列 | 柱线混合图 |
| 4 | 收入构成 + 解读 | 构成 + 论点 | 图文分栏 (饼图+要点) |
| 5 | 三条核心优势 | 论点+支撑 | 标题+要点列表 |
| ... | ... | ... | ... |
```
通过 AskUserQuestion 确认 (header: "大纲"): "这个 slide 大纲是否合适?" 选项:合适 / 调整
### Step 1.4: 状态暂存(防止跨 Phase 遗忘)
确认大纲后,**必须**将分析结果写入 `.slide-plan.md`,格式如下:
```markdown
# Slide Plan
- 预设: [所选预设名称]
- 图表方案: [ECharts / SVG / 无]
- 编辑模式: [是 / 否]
- 需读取的 references: [列出 Phase 3 需要的文件]
| # | 内容摘要 | 类型 | 视觉形式 | 需要的 CSS class |
|---|---------|------|---------|----------------|
| 1 | ... | ... | ... | ... |
```
Phase 3 生成前**必须先读取此文件**,确保不会遗忘 Phase 1 的分析结果。
### Step 1.3: Image Evaluation (如有)
如果用户提供了图片:扫描 -> 查看 -> 评估可用性 -> 融入大纲。
---
## Phase 2: Style Discovery
**"看效果选风格"环节。**
### Step 2.0: 风格路径
询问 (header: "风格"):
- "给我看几个选项"(推荐)-- 基于感受生成 3 个预览
- "我知道我想要什么" -- 直接从预设列表选择
### Step 2.1: 感受选择
询问 (header: "感受", multiSelect: true, max 2):
- 专业/可信 -- 机构感、值得信赖
- 自信/有力 -- 创新、大胆
- 沉稳/专注 -- 清晰、深思熟虑
- 高端/精致 -- 优雅、令人难忘
### Step 2.2: 生成 3 个风格预览
读取 [STYLE_PRESETS.md](STYLE_PRESETS.md) 获取 15 个可用预设。根据感受从中选择 3 个差异化预设生成单页预览。
| 感受 | 建议预设(按适配度排序) |
|------|------------------------|
| 专业/可信 | Research Formal, Swiss Modern, Notebook Tabs, Data Dashboard |
| 自信/有力 | Roadshow Elegance, Bold Signal, Electric Studio |
| 沉稳/专注 | Paper & Ink, Data Dashboard, Swiss Modern |
| 高端/精致 | Roadshow Elegance, Dark Botanical, Vintage Editorial |
保存预览到 `.claude-design/slide-previews/`,自动打开。
### Step 2.3: 用户选择
询问 (header: "风格选择"): 哪个风格选项A / B / C / 混合
---
## Phase 3: Generate Presentation
### Step 3.0: 读取状态 + 防护模板
1. **读取 `.slide-plan.md`** -- 恢复 Phase 1 的分析结果(类型、视觉形式、需要的文件)
2. **复制 [references/safe-base-template.html](references/safe-base-template.html) 作为起点** -- 此模板已内置 viewport-base.css、中文字体、A 股配色、formatCN、SlidePresentation 控制器。在此基础上添加内容,**不要删除模板中的任何 CSS 变量或 JS 函数**。
### Step 3.1: 按需读取参考文件
根据 `.slide-plan.md` 中列出的 references 读取:
1. **[STYLE_PRESETS.md](STYLE_PRESETS.md)** -- 获取所选风格的配色、字体、签名元素,覆盖模板中的 SLOT: THEME 变量
2. **(按需)** [references/charts-base.md](references/charts-base.md) + 对应的 charts-trend/composition/matrix/flow -- 按 `.slide-plan.md` 列出的图表类型读取
3. **(按需)** [references/financial-layouts.md](references/financial-layouts.md) -- 如有 KPI/表格/时间线/对比等布局
4. **(按需)** [references/animation-patterns.md](references/animation-patterns.md) -- 高级动画效果
5. **(按需)** [references/html-template.md](references/html-template.md) -- 编辑功能等 JS 参考
### Step 3.1.5: ECharts 内联(如需图表)
如果 `.slide-plan.md` 中图表方案为 ECharts**必须**将 ECharts 库内嵌到 HTML 中:
1. 读取本地文件 [references/echarts.min.js](references/echarts.min.js)~1MB已预存在 skill 目录中)
2. 将完整内容包裹在 `<script>/* ECharts v5 */...内容...</script>`
3. 放入模板的 `<!-- SLOT: ECHARTS INLINE -->` 位置
4. **禁止使用 `<script src="...">` 外部引用** -- 最终 HTML 必须离线可用
### Step 3.2: 生成 slide 内容
在 safe-base-template.html 的 `<!-- SLOT: SLIDES -->` 位置添加 slide。每张 slide 的视觉形式严格按 `.slide-plan.md` 执行。
**slide 结构由 Phase 1 的 content-mapping 结果驱动,而非固定模板。每份演示文稿的页面组合都应该不同。**
---
## Phase 3.5: 代码完整性自检(生成后必须执行)
输出最终 HTML 前,逐项检查以下清单。任何一项失败,修复后再继续。
- [ ] `<html lang="zh-CN">` 已设置
- [ ] safe-base-template 的核心 CSS 完整保留(搜索 `scroll-snap-type` 确认存在)
- [ ] 所有 `font-size:` 使用 `clamp()`(搜索 `font-size:`,确认无固定 px/rem 值)
- [ ] `formatCN` 函数已内嵌(如有数字数据)
- [ ] 无 emoji 字符(涨跌用 `.trend-up` / `.trend-down` CSS 类)
- [ ] 每个 `.slide` 继承了 `overflow: hidden`(来自 safe-base-template
- [ ] 中文字体已加载Google Fonts link 包含 `Noto+Sans+SC``Noto+Serif+SC`
- [ ] `--color-positive: #dc2626``--color-negative: #16a34a` 存在A 股默认)
- [ ] **零外部依赖**:无 `<script src="...">` 外部引用(如有 ECharts确认是内联 `<script>` 而非 CDN
**如有任何项失败,修复后再继续。不要跳过自检。**
---
## Phase 4: PPT Conversion
1. 运行 `python scripts/extract-pptx.py <input.pptx> <output_dir>`
2. 展示提取结果,与用户确认
3. 进入 Phase 2 选择风格
4. 生成 HTML保留原始内容和图片
---
## Phase 5: Delivery
1. 删除 `.claude-design/slide-previews/`
2. `open [filename].html`
3. 告知:文件位置、风格、页数、导航方式、自定义方法
4. **如需通过飞书发送给用户**,使用 message 工具:
```javascript
message({
action: "send",
channel: "feishu",
path: "/home/core/.openclaw/workspace/output/presentation.html",
filename: "presentation.html",
caption: "基金分析演示文稿"
})
```
---
## Fallback: 降级模式
当内容超过 15 页、或包含 3 种以上图表类型、或模型多次生成失败时,切换到简化路径:
**布局限制为 3 种:**
- KPI 卡片网格(指标页)
- 图文分栏(解读页)
- 标题 + 要点列表(论述页)
**风格固定为 Data Dashboard** 最简洁的预设,最低出错概率。
**功能限制:**
- 不使用 inline editing
- 动画只用 fade-in`.reveal` 类)
- 图表只用柱状图和折线图(不用旭日图/桑基图等复杂类型)
- 不使用自定义导航sidebar/nav-dots
**分步生成:** 先生成前 3 页预览,确认正确后再生成剩余页面。避免一次生成全部后发现基础层有错。
---
## File Map
```
fund-slides/
SKILL.md ← 入口(始终加载)
content-mapping.md ← 信息类型→视觉形式映射 + 强制检查清单
STYLE_PRESETS.md ← 15 个视觉预设
references/
safe-base-template.html ← 防护性基础模板Phase 3 起点,内置全部安全层)
echarts.min.js ← ECharts v5 库(~1MB生成时内联到 HTML
viewport-base.css ← 响应式 CSS + CJK + 全局 A 股配色 + 趋势箭头
animation-patterns.md ← 动画模式
charts-base.md ← ECharts 基础设施 + 速查表 + SVG
charts-trend.md ← 折线/面积/柱状图
charts-composition.md ← 饼图/玫瑰/Treemap/旭日图
charts-matrix.md ← 热力图/雷达/散点图
charts-flow.md ← 瀑布/K线/漏斗/桑基图
financial-layouts.md ← KPI/表格/时间线/对比布局
html-template.md ← HTML 结构 + JS 功能
scripts/
extract-pptx.py ← PPT 内容提取Phase 4
```
| File | When to Read |
|------|-------------|
| content-mapping.md | **MANDATORY** Phase 1.2(强制检查清单) |
| STYLE_PRESETS.md | **MANDATORY** Phase 2 + Phase 3.1 |
| references/safe-base-template.html | **MANDATORY** Phase 3.0(复制为起点) |
| references/charts-base.md | Phase 3.1 -- 含图表时(基础设施 + 速查表) |
| references/charts-trend.md | Phase 3.1 -- 含折线/面积/柱状图时 |
| references/charts-composition.md | Phase 3.1 -- 含饼图/玫瑰/Treemap/旭日图时 |
| references/charts-matrix.md | Phase 3.1 -- 含热力图/雷达/散点图时 |
| references/charts-flow.md | Phase 3.1 -- 含瀑布/K线/漏斗/桑基图时 |
| references/financial-layouts.md | Phase 3.1 -- 含 KPI/表格/时间线/对比时 |
| references/animation-patterns.md | Phase 3.1 -- 高级动画时 |
| references/html-template.md | Phase 3.1 -- 编辑功能等 JS 参考 |