全部技能 / 设计 / web-proto-brutalist
设计 · nexu-io/html-anything

web-proto-brutalist

Swiss industrial-print 风: 单字 grotesque、巨数字、ASCII 装饰

风险提醒:绿色 · 放心使用AI 侦查报告
作者 nexu-ioGitHub nexu-io/html-anything ↗Stars 8827许可 Apache-2.0(仓库根 LICENSE 文件;GitHub API license.spdx_id = Apache-2.0)commit 553ed98c28
agent 宿主通常会约束 skill 执行权限;风险提醒为 AI 侦查观点,不构成质量或安全保证。第三方 skill 仅作拆解与展示,安装使用风险自负,版权归原作者。

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

该 skill 不是可执行程序,而是 html-anything 的「模板」:一个目录(SKILL.md + example.html[/example.md]),由 loader.ts 在运行时扫盘读取——新增模板=新增目录,不需要改 TypeScript。

next/src/lib/templates/loader.ts
Adding a template = adding a folder. No TS code change required; the API
注:SKILLS_DIR 固定在应用 cwd 的 src/lib/templates/skills;listSkills() 遍历一级子目录并按 isValidBundledId 过滤,逐目录读 SKILL.md、解析 frontmatter,所以「选择器元数据」和「生成用 prompt 正文」出自同一份文件。

frontmatter 是给选择器/API 的元数据(zh_name/en_name/emoji/description/category/scenario/aspect_hint/featured/recommended/tags),由 fmToMeta() 映射成 SkillMeta;frontmatter 之后的正文才是给模型的规格。

next/src/lib/templates/loader.ts
zhName: fm.zh_name ?? fm.name ?? id,
注:id 取自目录名;example 元数据(example_id/name/format/tagline/desc/source_url)只在目录带 example.md/html 时才产出 SkillExampleMeta,body 被刻意排除在列表 API 之外(注释:Body is excluded so we can return the entire registry in one cheap fetch)。

生成时该模板正文被当成 prompt body:/api/convert 用 assemblePrompt() 把「全局设计指令 + 本模板正文 + 用户内容」拼成一段 prompt,交给宿主的本地 agent CLI,HTML 由 stdout 流式捕获。

next/src/app/api/convert/route.ts
prompt = assemblePrompt({ body: skill.body, content, format });
注:同路由另有 editFromHtml/editFromContent 的「最小化差异编辑」分支;模板正文在这条链路上只是字符串,没有求值、没有执行。

模板正文之上还压着一段全局前置指令(SHARED_DESIGN_DIRECTIVES),把技术与内容纪律统一加在每个模板之前——示例 HTML 里普遍出现的 CDN/字体外链就源自这里(宿主壳注入,不是模板自身要求)。

next/src/lib/templates/shared.ts
通过 CDN 引入 Tailwind v3 Play (https://cdn.tailwindcss.com) 与所需的 Google Fonts。
注:模板正文只负责风格/版面/组件,不重复这些硬要求;判级只算模板自身目录,该端点是宿主壳行为,写进 security.reason 自证。

产物以 stdout 文本返回:全局指令显式禁止 agent 动用文件系统,落盘由前端负责——所以模板目录既无脚本也无写盘能力。

next/src/lib/templates/shared.ts
**禁止使用 Write / Edit / MultiEdit / Bash / Create / 任何文件系统工具**。
注:原文续句要求「不要把 HTML 写到任何 .html 文件里……前端直接捕获你的 stdout 文本, 文件落盘由前端负责」;产物最终由前端写入任务记录与导出。

example.html 是随包预渲染示例:/api/templates/<id>/preview 原样按 text/html 返回给 iframe(选择器内联预览),/api/templates/<id>/example 另把 example.md + example.html 一起返回。

next/src/app/api/templates/[id]/preview/route.ts
return new Response(skill.exampleHtml, {
注:示例只作预览/文档,不参与生成 prompt(生成只用 SKILL.md 正文),因此它的外链不影响模板自身的能力边界。

正文把风格定义成四件可检查的事:newsprint 画布 + hairline 网格分隔、单体黑色 grotesque 标题、viewport-bleeding 巨数字、hazard-red 强调色 + ASCII 装饰。

next/src/lib/templates/skills/web-proto-brutalist/SKILL.md
- Newsprint canvas + hairline grid dividers
注:续条为「- Monolithic black grotesque 标题, viewport-bleeding 巨数字」「- Hazard-red accent + ASCII 装饰 (┌─┘ 等)」「- Sections 用极简数字编号」——四条都是排版级约束,不是形容词。

示例用 CSS 变量把风格固化成一套 token:--paper #F4F4F0(newsprint)、--hazard #E61919、Archivo Black 作 display、JetBrains Mono 作 meta。

next/src/lib/templates/skills/web-proto-brutalist/example.html
--hazard: #E61919;
注:正是「Swiss industrial print」的可执行翻译:纸感中性色 + 单一危险色 + 两种极端字重对比。

示例的 hazard 色被用作结构性分隔(hr.hazard 与 meta-row 的 1px 上边框),而非装饰性点缀。

next/src/lib/templates/skills/web-proto-brutalist/example.html
hr.hazard { border: 0; border-top: 1px solid var(--hazard); margin: 0; }
注:标题里的强调也走同一变量(.red { color: var(--hazard); }),保证「只有一个强调色」的纪律。

示例以方括号框体实现 ASCII 气质的装饰(.ascii-frame::before content: '[' / ::after content: ']'),并没有使用正文举例的 ┌─┘ 制表符。

next/src/lib/templates/skills/web-proto-brutalist/example.html
.ascii-frame::before { content: '['; color: var(--hazard); }
注:正文写「ASCII 装饰 (┌─┘ 等)」,示例落地为 [ … ] 方括号 + 网格线;属实现变体(同类语义,字符集不同),已记入确认表。

CLI 侧另有一条关键词直配通道:skills-matcher.ts 把用户内容里的关键词直接映射到该模板 id,命中即给 confidence=命中数×2+3,达到阈值 3 就走本地规则、不再让模型挑模板。

cli/src/skills-matcher.ts
[["brutalist", "工业", "粗野", "swiss", "industrial print"], "web-proto-brutalist"],
注:brutalist/工业/粗野/swiss/industrial print 直配该模板;与 web-proto-soft / web-proto-editorial 共用 design 场景加权。

CLI 兜底匹配用到的阈值常量:内容长度需超过 60 字符才启用 AI 摘要匹配;强信号阈值是 3。

cli/src/skills-matcher.ts
const MIN_CONTENT_LENGTH_FOR_AI = 60;
注:另有 SCENARIO_SIGNALS 按模板 scenario 给关键词加权、fallbackMatch 用 tags/zhName/description 打分,两层都失效才调用 agent 做摘要匹配。

宿主壳用 sandbox="allow-scripts allow-same-origin" 的 iframe 渲染示例/产物(允许脚本、允许同源)——这是产品壳取舍,写进风险,不参与本 skill 判级。

next/src/components/template-picker.tsx
sandbox="allow-scripts allow-same-origin"
注:preview-pane.tsx / deck-viewer.tsx 同款;示例 HTML 的内联 JS 只在浏览器预览时执行,skill 自身不执行任何脚本。

2核心能力

01Newsprint 画布 + hairline 网格分隔
02单体黑色 grotesque 标题 + viewport-bleeding 巨数字
03Hazard-red 强调色(结构性使用)
04ASCII 气质装饰框
05Section 极简数字编号
06等宽字体承载 meta 行(8ch 标签列)

3外部依赖

类型依赖
networkGoogle Fonts(Archivo Black / Archivo / JetBrains Mono)
networkGoogle Fonts 静态资源域(preconnect)

4风险提醒 风险提醒:绿色 · 放心使用

风险提醒:绿色 · 放心使用
  • ASCII 装饰未按正文示例实现 — 正文举例 ┌─┘ 制表符,示例用 [ ] 方括号 + 网格;若用户指名要制表符风格,需在提示里补一句,否则模型按示例走。
  • 强对比风格的可用性代价 — --ink #060606 on --paper #F4F4F0 对比极高,但巨数字/hairline 1px 网格在小屏上易拥挤,模板未给响应式约束。
  • 外链字体 — 示例引用 fonts.googleapis.com / fonts.gstatic.com(另有产品壳注入的 Tailwind CDN);属产物/宿主行为,不计档。
  • 单个强调色纪律依赖模型自觉 — 正文只写「Hazard-red accent」,未写「禁止第二个强调色」(对比 vfx-text-cursor 有明确负面约束),风格漂移时缺少护栏。
风险提醒:绿色,放心使用。判级对象=本 skill 目录(next/src/lib/templates/skills/web-proto-brutalist/),逐文件核对:零脚本、零凭证读取、零写盘;目录内出现的端点仅限 Google Fonts(Archivo Black / Archivo / JetBrains Mono)、Google Fonts 静态资源域(preconnect),且全部位于 example.html 这一「产物示例」;SKILL.md 正文只规定版面/风格/字体族名,未点名任何运行时外部接口,故为纯指令模板=green。宿主侧说明(不计档):html-anything 产品壳会经 assemblePrompt() 把正文拼进 prompt 并 spawn 本地 agent CLI,并注入 cdn.tailwindcss.com + Google Fonts 要求(next/src/lib/templates/shared.ts),预览 iframe 用 sandbox="allow-scripts allow-same-origin"(next/src/components/template-picker.tsx)。

5第二遍独立确认

  • [ok] skill 目录文件清单 — find 得 SKILL.md + example.html,无 scripts/references。
  • [ok] 无脚本执行 — grep -c "<script" example.html = 0。
  • [ok] 外部端点仅字体 — example.html 仅 fonts.googleapis.com css2 与 fonts.gstatic.com preconnect;SKILL.md 正文无 URL。
  • [discrepancy] ASCII 装饰的具体字符 — SKILL.md 写「ASCII 装饰 (┌─┘ 等)」,示例无 ┌/─/┘ 命中,改用 .ascii-frame 的 [ ] 方括号;属实现变体,语义(机械式框架标记)一致。
  • [ok] hazard 色是否真结构性使用 — --hazard 用于 hr.hazard 分隔线、.brand sup、.meta-row b、.ascii-frame 伪元素、.abstract 标签等结构位置,非纯点缀。
  • [ok] CLI 匹配器路由 — cli/src/skills-matcher.ts 存在 [["brutalist", "工业", "粗野", "swiss", "industrial print"], "web-proto-brutalist"] 行。
  • [ok] 判级 green 自证 — 目录零脚本文件、零凭证、零写盘;正文无运行时接口,端点仅见示例 → green。
  • [ok] official_desc 逐字 — meta.official_desc 取自 frontmatter description 原文「Swiss industrial-print 风: 单字 grotesque、巨数字、ASCII 装饰」。

6结论

  • 风格 token 化,复用成本低:改 --hazard/--display 即换皮,版面结构不动
  • 强调色纪律好:全页只有一个 hazard 红,且只用于结构线与强调字
  • 无脚本,纯静态:批处理截图/导出成本最低
  • 排版细节到位:meta 行用 8ch 网格对齐、等宽大写小字,工业印刷气质明确
  • 适合:适合有态度的产品官网/作品集/活动页、需要「权威、不讨好」气质的品牌页;也适合作为三种风格原型里的对照组(与 editorial/soft 并列展示)。
    不适合:不适合亲和力优先的消费级产品页、儿童/教育类、需要柔和渐变与圆角的场景;不适合信息层级靠卡片阴影区分的密集仪表盘。
    安装 agent 直装可复制
    ① 本站镜像 更新 2026-09-15
    方式 A · 人下载镜像包下载 web-proto-brutalist.tar.gz
    sha256: aa6036af392f1c58…
    方式 B · JSON 格式安装指南,复制给 agent
    安装指南
    agent 读 JSON 指南后会自动从本站下载安装,无需更多说明。
    ② 上游 GitHub · 原始来源
    能访问 GitHub?直接去上游安装(实时版,可能已更新)GitHub 原始 ↗
    本页镜像锁定 commit 553ed98c28;上游为实时仓库。
    来源信息 GitHub 原始
    作者 / 仓库nexu-io / nexu-io/html-anything
    Stars8827
    最近推送2026-09-15
    本 skill commit553ed98c28
    许可Apache-2.0(仓库根 LICENSE 文件;GitHub API license.spdx_id = Apache-2.0)
    本站信息
    收录日期2026-09-06
    分类设计
    侦查报告AI 侦查 · 2 遍 · 2026-09-06
    本站镜像与 GitHub 原始是不同来源:本站锁定 commit 快照经 /r2 分发;GitHub 为实时上游,内容可能已更新。
    同分类邻近