1实现原理 · 为什么它能做到
该 skill 不是可执行程序,而是 html-anything 的「模板」:一个目录(SKILL.md + example.html[/example.md]),由 loader.ts 在运行时扫盘读取——新增模板=新增目录,不需要改 TypeScript。
Adding a template = adding a folder. No TS code change required; the API
frontmatter 是给选择器/API 的元数据(zh_name/en_name/emoji/description/category/scenario/aspect_hint/featured/recommended/tags),由 fmToMeta() 映射成 SkillMeta;frontmatter 之后的正文才是给模型的规格。
zhName: fm.zh_name ?? fm.name ?? id,
生成时该模板正文被当成 prompt body:/api/convert 用 assemblePrompt() 把「全局设计指令 + 本模板正文 + 用户内容」拼成一段 prompt,交给宿主的本地 agent CLI,HTML 由 stdout 流式捕获。
prompt = assemblePrompt({ body: skill.body, content, format });
模板正文之上还压着一段全局前置指令(SHARED_DESIGN_DIRECTIVES),把技术与内容纪律统一加在每个模板之前——示例 HTML 里普遍出现的 CDN/字体外链就源自这里(宿主壳注入,不是模板自身要求)。
通过 CDN 引入 Tailwind v3 Play (https://cdn.tailwindcss.com) 与所需的 Google Fonts。
产物以 stdout 文本返回:全局指令显式禁止 agent 动用文件系统,落盘由前端负责——所以模板目录既无脚本也无写盘能力。
**禁止使用 Write / Edit / MultiEdit / Bash / Create / 任何文件系统工具**。
example.html 是随包预渲染示例:/api/templates/<id>/preview 原样按 text/html 返回给 iframe(选择器内联预览),/api/templates/<id>/example 另把 example.md + example.html 一起返回。
return new Response(skill.exampleHtml, {
正文用【布局】清单把页面钉成四块:季度 banner、3 个 objectives 列(每列一组 KR)、每条 KR 的进度条+数值+owner+状态 pill、右栏摘要。
- 3 个 objectives 列, 每个含一组 KR
示例把规格兑现成带三态状态机的静态看板:KR 行有进度条、owner avatar,状态 pill 有 on-track/at-risk/off-track 三种配色。
<span class="pill on-track"><span class="dot"></span>On track</span>
示例是零外链静态件:无 <script>、head 无 CDN/字体 link,字体走系统栈,双击即可离线打开。
--display: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
CLI 侧另有一条关键词直配通道:skills-matcher.ts 把用户内容里的关键词直接映射到该模板 id,命中即给 confidence=命中数×2+3,达到阈值 3 就走本地规则、不再让模型挑模板。
[["OKR", "KR", "关键结果", "objectives", "季度目标", "key results"], "team-okrs"],
CLI 兜底匹配用到的阈值常量:内容长度需超过 60 字符才启用 AI 摘要匹配;强信号阈值是 3。
const MIN_CONTENT_LENGTH_FOR_AI = 60;
宿主壳用 sandbox="allow-scripts allow-same-origin" 的 iframe 渲染示例/产物(允许脚本、允许同源)——这是产品壳取舍,写进风险,不参与本 skill 判级。
sandbox="allow-scripts allow-same-origin"
2核心能力
4风险提醒 风险提醒:绿色 · 放心使用
- 示例数据是虚构公司(Northwind) — 若用户内容为空或极少,模型可能照抄示例的 Q4 FY25/Devon Park 等占位信息;正文虽未要求,但对「先出个样子」的用法需自查数据真伪。
- 正文未规定数量随内容伸缩 — 与全局指令「内容驱动数量」叠加时,模型对 objectives/KR 数量的取舍无模板级约束,可能把用户的长清单压成 3 列。
- 预览 iframe 允许脚本与同源 — 宿主侧 sandbox="allow-scripts allow-same-origin"(template-picker.tsx)意味着示例/产物内脚本不被隔离,属产品壳取舍。
5第二遍独立确认
- [ok] skill 目录文件清单 — find 只有 SKILL.md + example.html,无 scripts/references/模板/数据文件。
- [ok] external_deps 为空 — 对两文件 grep 'https?://' 零命中;head 无 <link>、无 <script src>。
- [ok] 无脚本执行 — grep -c "<script" example.html = 0;SKILL.md 无任何命令行/脚本指令。
- [ok] frontmatter 字段与 loader 白名单对齐 — name/zh_name/en_name/emoji/description/category/scenario/aspect_hint/tags 全在 SkillFrontmatter 类型内,可被 parseFrontmatter 正确解析。
- [ok] 「3 个 objectives」与示例一致 — 示例 meta 行自述 3 objectives · 9 key results,页面含 9 条 KR(.kr 计数 9)。
- [ok] CLI 匹配器路由 — cli/src/skills-matcher.ts 存在 [["OKR", "KR", "关键结果", "objectives", "季度目标", "key results"], "team-okrs"] 行;测试 skills-matcher.test.ts 断言匹配到 team-okrs。
- [ok] 判级 green 自证 — 目录零脚本/零凭证/零写盘、无端点;宿主壳的 Tailwind/字体注入与 iframe sandbox 均写在 reason 说明中,不计档。
- [ok] official_desc 逐字 — meta.official_desc 取自 frontmatter description 原文「季度 banner + 3 个目标 + KR 进度条 + owner + 状态 pill」。
6结论
fe13926b690c2c2a…553ed98c28