1实现原理 · 为什么它能做到
本 skill 不是可执行程序,而是一段纯文本提示词模板:宿主用正则解析 SKILL.md 的 YAML frontmatter,把正文 body 作为提示词主体加载。
const { fm, body } = parseFrontmatter(raw);
模板正文不会单独执行,而是被拼进最终 prompt 的"模板段":共享设计指令 + 本模板正文 + 用户内容。
prompt = assemblePrompt({ body: skill.body, content, format });
全局"内容驱动数量"规则覆盖模板里的任何数字:模板只定义版面/风格/配色/组件库,不定义输出长度。
数量**完全由【用户内容】的实际长度和信息结构决定**
产物形态被全局硬约束:单文件 HTML、纯 HTML 无围栏、第一个字符必须是 <、且不得写文件(由前端捕获 stdout)。
不要用 markdown 代码围栏包裹, 不要任何解释性文字
frontmatter 的元数据驱动选择器呈现(中文名/英文名/emoji/描述/分类/场景/画幅/标签/示例元数据)。
zhName: fm.zh_name ?? fm.name ?? id,
随包示例资产经两条只读 API 暴露给前端:example.html 原样返回进 iframe,example.md 作为"预览"按钮的输入内容。
verbatim so it can be loaded into an
生效链(宿主行为,非本模板代码):宿主 spawn 本机已登录的 agent CLI,把拼好的 prompt 经 stdin 送入,从 stdout 流式回收 HTML。
child.stdin.write(opts.prompt);
这是 9 份里规格最密的一份:画布、设备摆位、材质色、反射、光斑、动画全部给到可执行参数,模型只需按参数落地,几乎无自由发挥空间。
- **画布**: 1920×1080, 暖灰渐变背景
屏幕内容的两种来源在模板里分流:文本走"自动渲染 mock app 界面",HTML 走"原样嵌入",并明确不用 iframe/srcdoc 而用 div+Tailwind,避免嵌套文档出问题。
用户提供的是 HTML → 原样嵌入屏幕 div 内
动画被显式设计为可关闭:@keyframes turntable 做 rotateY -12 ↔ 12 的 8s 往复,并允许按 prefers-reduced-motion 关闭。
@keyframes turntable
2核心能力
3外部依赖
| 类型 | 依赖 |
|---|---|
| network | Tailwind Play CDN(共享指令对产物的要求) |
| network | jsdelivr CDN(可选:图表/动画脚本) |
| network | Google Fonts(共享指令指定) |
| cli | 本机 coding-agent CLI(宿主检测 PATH 并 spawn) |
| network | 随包示例 example.html 的外链(产物示例) |
| network | 示例出处标注(frontmatter,非运行时请求) |
4风险提醒 风险提醒:绿色 · 放心使用
- 用户内容逐字拼进 prompt,无隔离标记 → 指令注入面 — assemblePrompt 把用户内容直接接在 ‘【用户内容】:’ 之后,模板正文在前、用户内容在后且无分隔;宿主侧 agent 以高权限运行(claude 为 --permission-mode bypassPermissions),注入若生效即为高权限落地。
- 宿主环境变量全量透传给被 spawn 的 CLI — argv.ts envFor 以 ‘const base = { ...process.env };’ 构造子进程环境:shell 里存在的一切变量(含各类 *_API_KEY)都会随 agent 进程可见。属宿主行为,非本模板代码。
- 预览 iframe 允许脚本且同源 — 产物/示例经 sandbox="allow-scripts allow-same-origin"(template-picker.tsx:544 与 preview-pane.tsx:297)加载;同源 + 允许脚本意味着产物内 JS 可达宿主页面上下文。本模板的 example.html 不含 <script>,风险来自将来生成的产物。
- 产物运行期外链第三方 CDN — 共享指令要求 <head> 引 cdn.tailwindcss.com(必要时 jsdelivr / Google Fonts):断网或 CDN 变更会让产物外观退化;CDN 被投毒则脚本进入产物执行环境,模板侧无 SRI/完整性校验。
5第二遍独立确认
- [ok] skill 目录资产面(脚本 / references / 数据 / 模板) — 目录实为 3 个文件:SKILL.md 与 example.html、example.md;无 scripts/、无 references 目录、无任何可执行文件(.sh/.py/.js/.mjs/.ts 零命中)。
- [ok] 「无脚本、无网络、无凭证、无写盘」的反例搜索 — 对目录递归 token 扫描(api[_-]?key|token|secret|\.env|process\.env|child_process|fetch\(|curl |wget |npm |npx |exec\(|subprocess|writeFile|fs\.):零命中;SKILL.md 另按 http|CDN|cdn|font|API|api|fetch|Google|script 扫描,仅命中 font-semibold / font-black 这类字重类名,无端点。
- [ok] 官方描述 vs 实际能力(有无夸大) — frontmatter description(iPhone + MacBook 仿 GLTF 静态展架, 屏幕内嵌真实 HTML 内容, 玻璃镜头折射, 360° 转盘构图)与正文一致:描述承诺的版式要素都能在正文找到对应条目,未见正文未支持的越界承诺。
- [ok] 外部资源/工具条目逐条回源 — external_deps 中的仓库级条目(Tailwind Play CDN / jsdelivr / Google Fonts / 本机 agent CLI)逐条回到 shared.ts 与 argv.ts 原文取证;本模板另有 example.html 的 cdn.tailwindcss.com 外链,已在该 example.html 原文中定位。
- [ok] 宿主执行链(供 security.reason / verdict.risks 使用,不参与判级) — prompt 经 stdin 送入被 spawn 的本机 CLI(invoke.ts),HTML 从 stdout 分流捕获;claude 参数含 --permission-mode bypassPermissions、envFor 透传 process.env;预览 iframe sandbox="allow-scripts allow-same-origin"(template-picker.tsx:544 / preview-pane.tsx:297)。
- [ok] 路径与 commit 一致性 — 工作副本 /var/ytdown/skills-portal/spy-repos/html-anything 的 git HEAD = 553ed98c283f9c0f489902d035416a972d6a9699(与任务表 pin 一致);skill.path=next/src/lib/templates/skills/mockup-device-3d 下确有 SKILL.md,全仓无第二份同名模板。
- [ok] "屏幕内嵌用户 HTML"是否等于外部内容注入 — SKILL.md 说的"原样嵌入屏幕 div 内"是把用户提供的 HTML 渲染进产物里的 <div class="screen">(同页同上下文),不是把远端页面抓进 skill;目录内无抓取代码。风险仍在产物侧(嵌入脚本与会话同域执行),已写入 verdict.risks。
- [ok] example_source_url 会不会被运行时请求 — loader.ts 仅把它当字符串放进 meta.example.source(fm.example_source_url ? {...} 分支),preview / example 两个路由只做 loadSkill + 返回 JSON 或 HTML;全仓未见对该 URL 的 fetch。
6结论
26cd54243c71eab9…553ed98c28