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"
模板定义的是一个三 tab 的团队管理后台单页:Team Members / Team Details / Activity Log,加一行 KPI stat、成员表(avatar+角色+状态)、角色分布柱图、在线状态与活动 sparkline、Top contributors 面板。
- Tabs: Team Members / Team Details / Activity Log - KPI stat row - Member table (avatar + 角色 + 状态) - Role distribution bar chart - Online presence + activity sparklines - Top contributors panel
交互细节被显式列出:light/dark 切换、hover tooltip、click-to-zoom 面板,以及一个『CSV export 按钮 (前端实现)』——即导出走浏览器端生成,不经服务端。
- light/dark 切换, hover tooltip, click-to-zoom panels - CSV export 按钮 (前端实现)
意图定位为 FlowAI 美学的团队管理 admin 单页,即版式/配色随共享指令层走,本模板只负责后台信息架构。
【意图】FlowAI 美学的团队管理 admin 单页。
画布口径是桌面 1440(aspect_hint),选择器元数据 category=dashboard、scenario=operations,tags 为 flowai/team/members。
aspect_hint: "桌面 1440"
本 skill 的 example.html 只是一个 iframe 壳,指向 ./assets/template.html;该文件在 pin commit 里不存在,因此预览路由会把这份壳原样返回、iframe 404。
<iframe src="./assets/template.html" title="FlowAI Team Dashboard Example"></iframe>
2核心能力
3外部依赖
| 类型 | 依赖 |
|---|---|
| network | Tailwind / Google Fonts 由共享指令层强制(本模板 SKILL.md 未提 CDN;示例壳自身零外链) |
| network | FlowAI 品牌/美学参照(仅出现于正文命名,无端点位) |
4风险提醒 风险提醒:绿色 · 放心使用
- 预览破损:example.html 指向的 ./assets/template.html 在本 pin 不存在,picker/详情页会拉到 404 壳。 — example.html:<iframe src="./assets/template.html">
- 缺 example.md:没有样本输入,用户无法从仓库直接看到『喂什么内容能出这种后台』。 — skill 目录仅 SKILL.md + example.html(git ls-files 复核)
- 宿主侧:预览 iframe sandbox="allow-scripts allow-same-origin";若生成物含 light/dark、tooltip 等脚本,页面脚本在预览环境拥有宽松权限(宿主取舍)。 — sandbox="allow-scripts allow-same-origin"(next/src/components/preview-pane.tsx)
- 注入面:团队成员数据(可能含姓名/邮箱)会被逐字拼进 prompt 交给本地 agent。 — assemblePrompt 末尾直接拼接【用户内容】
5第二遍独立确认
- [ok] 三 tab / 布局宣称 — 重读 SKILL.md【布局】6 条与 JSON 引用逐字一致。
- [ok] 『CSV 导出前端实现』 — SKILL.md【设计细节】确写『CSV export 按钮 (前端实现)』;对目录做 createObjectURL/download=/Blob 扫描零命中——模板声明了该能力,实现由生成的页面自行承担。
- [discrepancy] 预览样张可用性 — example.html 仅含 <iframe src="./assets/template.html">,而该 pin 的 skill 目录(git ls-files 复核)只有 SKILL.md 与 example.html,无 assets 目录。结论:选择器/详情页预览会 404,样张缺失。
- [ok] featured/recommended 缺失的影响 — loader 只在 if (typeof fm.featured === "number") meta.featured = fm.featured; 时写 meta.featured,故本 skill 不进推荐位——与 README showcase(按 recommended 排的 8 个)中确无 flowai-team-dashboard 相互印证。
- [ok] 安全面 — 目录内 2 个文件无脚本/凭证/写盘/网络调用 token;示例壳无外链。
- [ok] meta 元数据 — GitHub API 实查 stars=8827、pushed_at=2026-09-15T03:36:24Z、license Apache-2.0。
- [unlocatable] 安装量 — 无公开安装量数据源,installs=null。
6结论
2b713fbcbced0b31…553ed98c28