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, {
正文用【布局】把落地页定成「居中单列」四段:brand logo + tagline + 大字 hero、邮箱 input 与 submit 合并成一个 pill、三个小卖点、底部 founders note + 社交链接。
- 邮箱捕获 input + submit 按钮 (合并成一个 pill)
装饰层用 SVG/CSS 内联实现:渐变 mesh / 噪点纹理 / 一颗星轨,且要求提交成功后给一个微动效(✓ + 文案变化)。
- 装饰: SVG 渐变 mesh / 噪点纹理 / 一颗星轨
示例的邮箱捕获是纯前端演示:submit 事件 preventDefault,校验通过后隐藏表单、给成功文案加 .visible,从不向任何后端提交。
this.style.display = 'none';
成功态是真实存在的 DOM 结构(role="status" 的段落 + .visible 类),不是模型即兴加的文案。
<p class="success-msg" id="success-msg" role="status">You're on the list! We'll be in touch.</p>
CLI 侧另有一条关键词直配通道:skills-matcher.ts 把用户内容里的关键词直接映射到该模板 id,命中即给 confidence=命中数×2+3,达到阈值 3 就走本地规则、不再让模型挑模板。
[["等候", "waitlist", "预发布", "coming soon", "即将上线", "预约"], "waitlist-page"],
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核心能力
3外部依赖
| 类型 | 依赖 |
|---|---|
| network | Google Fonts(Syne / DM Sans) |
| network | Google Fonts 静态资源域(preconnect) |
4风险提醒 风险提醒:绿色 · 放心使用
- 邮箱捕获是演示,不采集数据 — 示例表单 preventDefault 后只切成功态,无任何请求;若把它当真实等候名单页上线,会「显示成功但不记录任何邮箱」。需接入自家后端或表单服务才可用。
- 正文的「3 个小卖点」是固定数量 — 与全局指令「数量由内容驱动」存在张力:用户卖点多于 3 个时模型可能压缩或硬凑。
- 外链字体与 CDN — 示例引用 fonts.googleapis.com / fonts.gstatic.com(另有产品壳注入的 Tailwind CDN),产物在浏览器里会外发这些域;属产物/宿主行为,不计档。
- 表单脚本在预览 iframe 内可执行 — 宿主 sandbox 为 allow-scripts + allow-same-origin(产品壳行为)。
5第二遍独立确认
- [ok] skill 目录文件清单 — find 得 SKILL.md + example.html,无 scripts/references。
- [ok] 外部端点仅字体(示例侧) — SKILL.md 正文无 URL;example.html 仅 fonts.googleapis.com 的 css2 link 与 fonts.gstatic.com preconnect(另有产品壳注入的 Tailwind)。
- [ok] 「邮箱捕获」是否真的外发数据 — 示例脚本只 preventDefault + 切成功态,无 fetch/XHR/action 属性;判定为纯前端演示,已在 verdict.risks 写明「不采集数据」。
- [ok] 成功微动效是否落地 — 存在 .success-msg 与 .success-msg.visible 两态样式 + role="status" 段落 + 脚本切换,与正文「成功提交后给一个微动效 (✓ + 文案变化)」对应。
- [ok] 装饰图层是否为内联 SVG — 示例含 logo-svg / coil-row / grid-svg 三个内联 <svg>(含 xmlns="http://www.w3.org/2000/svg"),无外链图片。
- [ok] CLI 匹配器路由 — cli/src/skills-matcher.ts 存在 [["等候", "waitlist", "预发布", "coming soon", "即将上线", "预约"], "waitlist-page"] 行。
- [ok] 判级 green 自证 — 目录零脚本文件(示例内联 JS 属产物示例)、零凭证、零写盘;SKILL.md 未点名运行时接口 → green。
- [ok] official_desc 逐字 — meta.official_desc 取自 frontmatter description 原文。
6结论
f44cc710d83cf149…553ed98c28