内容创作 · nexu-io/html-anything

blog-post

杂志感长文, 含 masthead、hero、figures、pull quote、作者署名

L1 基础 · 登记来源即可V1 已固定Dual-pass Audit
Author nexu-ioGitHub nexu-io/html-anything ↗Stars 8827License Apache-2.0(仓库根 LICENSE:Apache License Version 2.0, January 2004;GitHub API spdx_id=Apache-2.0)Commit 553ed98c28
管控等级描述 skill 的能力与建议配套的管控措施,不代表质量或安全认证,也不表示可用或不可用。是否使用由用户和管理者决定。不同 agent 宿主对权限的约束各不相同,请勿假定宿主一定会提供安全兜底。第三方 skill 版权归原作者,使用风险由使用者自行承担。

1实现原理 · 为什么它能做到

模板本体没有可执行代码:loader 从 src/lib/templates/skills/<id>/SKILL.md 读入 frontmatter 与正文,正文(body)与 example 内容一起作为 LoadedSkill 返回。

next/src/lib/templates/loader.ts
const raw = safeRead(path.join(dir, "SKILL.md"));
这里在做什么:SKILL.md 是唯一行为来源——frontmatter 供选择器渲染(zh_name/emoji/aspect_hint/tags/example_* 等),正文整段即提示词;loader 不做语义校验,模板写什么就下发什么。

下发前宿主固定拼装 prompt:模板正文夹在共享设计指令 SHARED_DESIGN_DIRECTIVES 与【输入格式】/【用户内容】之间。

next/src/lib/templates/shared.ts
Wrap a per-template instruction body with the shared design directives and
这里在做什么:模板只定义「这一个交付物长什么样」(版式/节奏/组件),共享指令承担跨模板硬约束——单文件 HTML、禁止用文件工具、Tailwind 与 Google Fonts 走 CDN、内容真实性、中文盘古之白。

共享指令把硬约束写成对 agent 的显式禁令,并强制内容驱动数量(模板里的数字只作参考下限)。

next/src/lib/templates/shared.ts
**禁止使用 Write / Edit / MultiEdit / Bash / Create / 任何文件系统工具**。
同文件下文还有一条:输出的 slide / frame / card / section 数量完全由【用户内容】的实际长度和信息结构决定——这解释了为什么本类模板不因内容变长而失效:每段内容至少一张卡/一节,模板只提供版面池。

真正执行的是用户本机已安装并登录的编码 agent CLI:宿主 spawn 子进程,把 prompt 交给它,HTML 从 stdout 流式捕获。

next/src/lib/agents/invoke.ts
import { spawn, type ChildProcessWithoutNullStreams } from "node:child_process";
这里在做什么:模板 skill 只提供提示词,能力(含写代码、跑工具)来自宿主 CLI 的既有权限;skill 目录自身没有任何脚本入口,因此判级只看目录内资产(宿主行为不计档)。

/api/convert 是模板的执行路径:它把 skill.body 与用户内容组装成 prompt 后交给 invokeAgent。

next/src/app/api/convert/route.ts
prompt = assemblePrompt({ body: skill.body, content, format });
编辑模式另走 buildEditPrompt(最小化差异编辑,禁用文件工具、要求直接流式输出完整 HTML),因此本类模板的产物形态稳定:单文件 HTML、内联 CSS/SVG,外链仅字体与个别模板显式要求的图表库。

模板以 typography 优先的比例约束开头(70% 文字 / 20% 图 / 10% chrome),并要求 ≥600 字,直接排除短图文卡片类输入。

next/src/lib/templates/skills/blog-post/SKILL.md
【意图】≥ 600 字的真正的长文章, 排版以 typography 为主, 70% 文字 20% 图 10% chrome。
这里在做什么:用比例而非形容词定义「杂志感」——正文唱主角,图表与装饰占比被压低,避免模型给长文塞满卡片。

骨架固定为五段:Masthead → Hero → 单栏 65ch 正文 → Author bio 卡片 → Related posts 三卡。

next/src/lib/templates/skills/blog-post/SKILL.md
- Masthead (publication name + date)
同段列出正文容器宽度 65ch 与「含 figures, pull quotes, 行内引用」,即正文内部还有三类行内元素要求;与 hero 的元数据(作者署名 + 阅读时间)共同构成刊物形态。

三处排版细节被单独规定:pull quote(大号 serif 斜体 + 左侧色条)、figures 自带 italic caption、代码块圆角深底带语言标签。

next/src/lib/templates/skills/blog-post/SKILL.md
- Pull quote 用大号 serif 斜体 + 左侧色条
figures 的 caption 要 italic/smaller;代码块与 article-magazine 同规格,属同一设计语言的复用,跨模板观感一致。

示例产物用纯内联 CSS + 系统字族实现(无 Tailwind、无字体 CDN、全文零 URL),是该模板零外链路线的实现证据。

next/src/lib/templates/skills/blog-post/example.html
font-family: -apple-system, system-ui, sans-serif
这里在做什么:示例把杂志感做在排版细节上(Masthead 细线、lede、byline 头像占位、hero-figure、数字图块、blockquote),不依赖任何外部资源即可打开。

示例正文实现了 hero/lede/byline/hero-figure/pull quote/figures 等骨架元素,但未实现 SKILL.md 要求的 Author bio 卡片与 Related posts 三卡。

next/src/lib/templates/skills/blog-post/example.html
<figure class="numbers">
该 figure 是正文中的数字三连展示块(38ms → 4ms 等),属 figures 要求;但示例结尾直接是 endnote 招募卡,没有 bio / related posts 段落——记为 discrepancy,模板能力以 SKILL.md 为准。

2核心能力

01长文骨架:Masthead + Hero(大标题 + 副标 + 作者署名 + 阅读时间)
0265ch 单栏正文容器(含 figures、pull quotes、行内引用三类行内元素)
03Pull quote:大号 serif 斜体 + 左侧色条
04Figures 自带 caption(italic、更小字号)
05代码块:圆角 + 深色 + 语言标签(与 article-magazine 同规格)
06文末版式位:SKILL.md 要求 Author bio 卡片 + Related posts 3 张卡(示例未实现,见 verification)

4管控建议与判定依据

建议配套管控措施
面向 Agent
可自动加载
面向管理者
登记来源与版本
判定依据(文件路径与关键语句摘要)
  • SKILL.md: 纯提示词指令与规则文本,无脚本执行与外部影响
审计说明: 。判级只依据 skill 自身目录(仅 SKILL.md + example.html 两个文件,无 scripts/、无自带 CLI、无凭证读取、无写盘):无脚本入口、无自带 CLI、无凭证读取、无写盘指令;SKILL.md 正文未要求运行时引入任何外部端点(只写布局段、行内元素类型与字族风格,不含端点)。执行期不发生任何外发。目录内实际出现的端点仅存在于 example.html 零 URL、零 <script>(纯系统字族的内联 CSS)——目录内不存在网络端点,按批4 终版口径属**产物期引用**(生成的 HTML 由浏览器打开时拉取 CDN/字体,skill 执行时不抓取、不上报、不传素材),故不判级,仅在此列出端点;宿主壳(loader→assemblePrompt→本地 agent CLI spawn、预览 iframe sandbox)同属宿主行为,记入 verdict.risks。

5第二遍独立确认

  • [discrepancy] 示例覆盖度 vs SKILL.md 骨架 — SKILL.md 要求五段骨架,example.html 实现了 Masthead / Hero / 正文 / 三处细节,但缺 Author bio 卡片与 Related posts(3 张卡)——示例结尾为 .endnote 招募卡。详情页不宜把该示例当作模板完整形态。
  • [ok] 「零外链」判定 — blog-post/ 目录内 http(s) 命中数为 0,<script> 命中数为 0;字体为 -apple-system/system-ui/monospace 等系统字族,执行期与产物期均无外发。
  • [ok] 无 example.md 的后果 — 目录只有 SKILL.md + example.html;loader 的 metaFromDir 以 existsSync 判定 hasMd=false,选择器仍会因 hasHtml=true 生成 example 元数据,行为正常。
  • [ok] license / stars / commit 元数据 — GitHub API(api.github.com/repos/nexu-io/html-anything):spdx_id=Apache-2.0、stargazers_count=8827、pushed_at=2026-09-15T03:36:24Z;工作副本 git HEAD = 553ed98c283f9c0f489902d035416a972d6a9699(与任务表 pin 553ed98c283f 同源)。
  • [ok] skill.path 与目录资产面 — pin 目录内该路径存在且含 SKILL.md;目录内文件清单已用 glob 全量核对(含隐藏文件),无 scripts/、无 references/、无二进制资产(competitive-teardown 的 assets/ 为纯 HTML,另行记录)。

6结论

  • 用比例与字数下限定义长文,是最容易判定的意图声明之一(70% 文字 / 20% 图 / 10% chrome、≥600 字)。
  • 骨架与细节分工清楚:五段结构 + 三处排版细节(pull quote / figure caption / 代码块),模型无须自行设计页面。
  • 示例产物零外链零脚本、纯内联 CSS,离线可开,是排版驱动路线的干净样板。
  • 跨语种可用:模板为中文,示例产物为英文技术长文(Mira Hassan / Filebase),说明版式不绑语种。
  • 适合: 适合真正的长文交付:技术复盘、公司博客、深度评论、采访整理——尤其适合希望排版好看又离线可开的场景(示例为纯内联 CSS + 系统字族)。
    不适合: 不适合短内容或图文卡片(≥600 字与 65ch 单栏是硬约束);不适合需要多栏杂志版式或丰富交互的报告;不适合必须自带品牌字体/配色的场景(模板未规定字族,需用户另给要求)。
    Install Agent-Ready
    ① Verified Mirror 2026-09-15
    Option A · Direct DownloadDownload blog-post.tar.gz
    sha256: 95b69396ce0f37a7…
    Option B · Copy Guide for Agent
    install.json
    agent 读 JSON 指南后会自动从本站下载安装,无需更多说明。
    ② Upstream GitHub
    GitHub Repo ↗
    Pinned to commit 553ed98c28.