1实现原理 · 为什么它能做到
这个 skill 不是可执行程序,而是注入给本机 coding-agent CLI 的一段提示词:宿主取 SKILL.md 正文,前面压一段全站共享设计指令、后面接用户内容,拼成一条 prompt 交给已登录的 agent,再把 agent 的 stdout 当 HTML 取回。
【输入格式】: ${opts.format} 【用户内容】: ${opts.content}
共享指令层(不属于任何单个 skill,但每个模板都被它压着)把输出钉成『自包含单文件 HTML』,并明令禁止 agent 使用 Write/Edit/Bash 等文件系统工具,HTML 直接以对话正文流式输出。
- **禁止使用 Write / Edit / MultiEdit / Bash / Create / 任何文件系统工具**。不要把 HTML 写到任何 \`.html\` 文件里。前端直接捕获你的 stdout 文本, 文件落盘由前端负责。
SKILL.md 之外还有一条『内容驱动数量』覆盖规则:模板里写的任何页数/帧数/卡片数一律视为参考下限,实际数量由用户内容决定——防止 agent 用模板数字压缩用户内容。
- 模板只定义"可用版面 / 风格 / 配色 / 字体 / 组件库", **不定义** slide / 帧 / 卡片 / section 的数量。
加载约定是『一个 skill = 一个文件夹』:SKILL.md(YAML frontmatter 供选择器 + 正文即模板 prompt),可选 example.md(样本输入)与 example.html(可直接打开的预览样张);新增模板只需加目录,不改 TS 代码。
* SKILL.md — frontmatter (id, scenario, tags, …) + prompt body * example.md — (optional) sample input content * example.html — (optional) pre-rendered preview, shown inline in the picker
选择链路(CLI 侧)是三级漏斗:关键词强信号(每命中 1 词 2 分,阈值 3)→ 退化为 tags/scenario 打分 → 仍无把握就把用户内容前 800 字交给本地 agent 做一句话分类。
const CONFIDENCE_THRESHOLD = 3;
预览链路独立于生成:/api/templates/<id>/preview 把 example.html 原样以 text/html 返回给 iframe;前端 iframe 用 sandbox="allow-scripts allow-same-origin"。
sandbox="allow-scripts allow-same-origin"
模板是一份纯骨架(全篇 22 行):用 6 段固定版面把财务材料组织成单页报告——Masthead + 4 个 hero KPI、收入与烧钱两张图、P&L 概要表、5 条 top-line highlights、Outlook 段落、Methodology 折叠区。
【布局】 - Masthead (公司 + Q + 报告标题) + 4 个 hero KPI - Revenue chart + Burn chart (Chart.js / ECharts) - P&L 概要表 (zebra + sticky header) - Top-line highlights (5 条 bullet) - Outlook 段落 - Methodology 折叠区
意图被压成一句话:财务向单页报告,数字 + 图表 + 文字洞察——同时要求量化版面与文字解读,而非纯表格。
【意图】财务向单页报告, 数字 + 图表 + 文字洞察。
版面细节直接给实现选项:P&L 表要求 zebra 条纹 + sticky 表头(长表可滚动可读)。
- P&L 概要表 (zebra + sticky header)
首屏 KPI 数量被钉死为 4 个 hero KPI,与 Masthead(公司 + Q + 报告标题)同屏,保证翻开就是『哪家公司哪个季度、四个关键数』。
- Masthead (公司 + Q + 报告标题) + 4 个 hero KPI
本 skill 没有 example.md,预览样张 example.html 完全自包含:无任何外部 URL、无 <script>,图表用 CSS/SVG 手绘、字体走本机衬线栈。
--display: 'Iowan Old Style', 'Charter', 'Iowan', Georgia, serif;
2核心能力
3外部依赖
| 类型 | 依赖 |
|---|---|
| network | Tailwind 与 Google Fonts 由共享指令层强制(本模板 SKILL.md 未提任何 CDN;官方示例页零外链) |
| package | Chart.js / ECharts(SKILL.md 指定的图表方案;示例页未使用,改为手写 SVG/CSS) |
4风险提醒 风险提醒:绿色 · 放心使用
- 技术选型与示例不一致:SKILL.md 指定 Chart.js/ECharts,示例页却手绘 SVG——照 SKILL.md 改样式的人会与示例观感不一致。 — SKILL.md:Revenue chart + Burn chart (Chart.js / ECharts);example.html 无 script
- 宿主侧:预览 iframe sandbox="allow-scripts allow-same-origin"(宿主取舍,非本 skill 引入)。 — sandbox="allow-scripts allow-same-origin"(next/src/components/preview-pane.tsx)
- 注入面:财务原始材料(可能含未公开数据)被逐字拼进 prompt 交给本地 agent,无脱敏/转义层。 — assemblePrompt 末尾直接拼接【用户内容】
- 无 example.md:选择器示例区缺样本输入,用户少了一个『输入长什么样』的参照。 — skill 目录仅 SKILL.md + example.html
5第二遍独立确认
- [ok] 『6 段版面』宣称 — 重读 SKILL.md【布局】6 条与 JSON 引用逐字一致,无遗漏无夸大。
- [discrepancy] 图表库条目(Chart.js / ECharts) — SKILL.md 写 `Revenue chart + Burn chart (Chart.js / ECharts)`,但 example.html 无任何 <script>、无 CDN 引用,图表为 CSS/SVG 手绘——规范建议与示例实现不一致,已写入 risks。
- [ok] 『示例页零外链』结论 — 对 example.html 做 URL 正则扫描零命中、<script> 计数为 0,坐实自包含。
- [ok] 运行时机制 — 重读 loader.ts loadSkillFromDir / shared.ts assemblePrompt,与第一遍结论一致。
- [ok] 安全面 — skill 目录 2 个文件均无脚本/凭证/写盘/网络调用 token。
- [ok] meta 元数据 — GitHub API 实查:stars=8827、pushed_at=2026-09-15T03:36:24Z、license Apache-2.0。
- [unlocatable] 安装量 — 无公开安装量数据源,installs=null。
6结论
3d200da22fb65eba…553ed98c28