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, {
正文把周报定成固定结构的横滑 deck:Cover / Shipped / In flight / Blocked / Metrics / Asks / Thanks,每页承载一类状态信息。
- Blocked (红色 callout)
横滑由 CSS scroll-snap 实现:容器 overflow-x: auto + scroll-snap-type: x mandatory,每页 flex: 0 0 100vw + scroll-snap-align: start。
scroll-snap-type: x mandatory;
键盘左右切换与导航点由一段内联脚本实现:ArrowRight/PageDown 前进、ArrowLeft/PageUp 后退,滚动时同步 dot 的 active 类。
document.addEventListener('keydown', (e) => {
正文声明的「hash 同步」在示例中没有实现:示例无 location.hash/history 相关代码。
- 键盘左右切换, hash 同步
由于每页是顶层 <section class="slide">,宿主把它识别为 deck 并追加导出能力(PDF / PNG zip / PPTX)。
Cheap test — true if the document looks like a deck (has ≥1
CLI 侧另有一条关键词直配通道:skills-matcher.ts 把用户内容里的关键词直接映射到该模板 id,命中即给 confidence=命中数×2+3,达到阈值 3 就走本地规则、不再让模型挑模板。
[["周报", "weekly", "本周", "下周计划", "本周完成"], "weekly-update"],
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风险提醒 风险提醒:绿色 · 放心使用
- 正文的 hash 同步未在示例实现 — SKILL.md 写「- 键盘左右切换, hash 同步」,示例无 location.hash/history 代码;预期「刷新/分享能定位到某页」的用户会落空,需在提示中单独要求。
- 固定 7 种页型 vs 内容驱动数量的张力 — 用户内容若缺某些类别(如无 blocker),模型可能造空页凑结构;反之长内容可能被硬塞进 8 页。
- 横滑页在窄屏/触屏的可用性 — 每页固定 100vw,未给移动端降级;键盘导航在移动端无效(示例未做滑动手势)。
- 预览 iframe 允许脚本与同源 — 宿主侧 sandbox="allow-scripts allow-same-origin"(产品壳行为),示例导航脚本在预览中会执行。
5第二遍独立确认
- [ok] skill 目录文件清单 — find 得 SKILL.md + example.html,无 scripts/references。
- [ok] 外部端点为空 — 对两文件 grep 'https?://' 零命中;head 无 <link>/<script src>,字体走 Inter 系统栈。
- [discrepancy] 「hash 同步」是否实现 — SKILL.md 要求「键盘左右切换, hash 同步」,但 example.html 对 hash/location/history grep 零命中;只实现了 keydown(ArrowRight/PageDown/ArrowLeft/PageUp)与 dot 同步。
- [ok] 键盘翻页是否实现 — 示例脚本含 ArrowRight/PageDown → deck.scrollTo({left: window.innerWidth * next}) 与 ArrowLeft/PageUp 反向分支。
- [ok] 页型与示例页数是否对应 — 示例 8 个 <section class="slide">,覆盖 Cover/Shipped/In flight/Blocked/Metrics/Asks/Thanks 七型 + 收尾,与正文清单一致。
- [ok] 宿主 deck 识别与导出 — next/src/lib/deck.ts 注释「Cheap test — true if the document looks like a deck」并按 section.slide 切页;export-menu.tsx 提供 deck-pdf/deck-png-zip/deck-pptx 三个动作。
- [ok] CLI 匹配器路由 — cli/src/skills-matcher.ts 存在 [["周报", "weekly", "本周", "下周计划", "本周完成"], "weekly-update"] 行。
- [ok] 判级 green 自证 — 目录零脚本文件(示例内联导航脚本属产物示例)、零凭证、零写盘、零端点 → green。
6结论
89e6eddaef5be64f…553ed98c28