关于 brand-adherence
Brand Adherence 是用于按参考品牌规范构建网页并检查一致性的设计工程技能。它指导提取设计系统与素材、逐项复用品牌值,并通过外部验证器评估成品页面。
主要功能
- 01分段提取品牌设计规范
- 02下载并使用品牌字体与素材
- 03按原值实现颜色和组件
- 04在桌面与移动尺寸检查页面
- 05调用验证器评估品牌一致性
适用场景
- 01依据现有品牌制作网页
- 02复用品牌字体、标志与图像
- 03检查页面是否偏离品牌规范
- 04根据验证结果修正页面样式
MCP 相关
依赖 Brand API MCP 提取品牌资料,并使用其验证工具检查成品页面。相关工具支持异步提取与验证结果查询。
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ taste-ai/ skills --skill brand-adherence安装后在 Claude Code 中输入/brand-adherence确认已加载。
详细介绍
品牌契合度
你是品牌自己的设计工程师。你会收到一个品牌参考和一个要构建的页面,然后交付页面,就像它是由品牌自己的团队打造的一样。衡量成功的方式只有一个:**了解该品牌的评审者不能发现你改动了任何设计令牌、组件或规则。**构图、层级和文案由你决定。其他一切都属于品牌。
**要求。**Brand API MCP、用于下载已捕获文件的 shell、用于保存文件的工作目录,以及一种能将完成的页面放到引擎可访问 URL 上的方法。MCP 包含这项技能的两部分:extract_brand、poll_brand_extraction 和 get_brand_extraction_result 用于获取品牌参考;verify_brand_adherence、poll_brand_adherence 和 get_brand_adherence_result 用于根据品牌参考评估你交付的页面。
这项技能旨在避免的唯一失败
完整提取结果约有 100 KB。若一次调用就请求全部内容,会超出工具输出上限:你得到的只有预览,以及一个指向运行环境自身存储的路径,而你手头的工具都无法打开它。于是你只能根据看到的那一部分进行设计。页面看起来似乎合理,但评审者会同时发现两个缺陷:品牌的字体虽有名称,却从未加载,因此所有标题都以备用字体呈现;而且品牌的真实标志和图像也缺失。以下所有步骤都是为了避免这种情况。
1. 分段获取提取结果,并在每段返回时保存
先获取品牌。extract_brand(url) 会返回一个 submission_id;将它作为 brand_submission_id 传给 poll_brand_extraction,持续轮询直到 status: "completed",然后再传给 get_brand_extraction_result。在掌握品牌信息之前编写的标记都只是猜测,之后你必然会将其推倒重来。
你可以直接使用公开可访问的 URL。不过,如果你在本地的 localhost 上运行服务器,就需要通过 Taste Labs SSH 隧道让服务器可以访问。这个隧道只有 Taste Labs
能够访问你的页面。要建立隧道,请按以下步骤操作:
SERVER_PORT=3000
CRAWL_ID=crawl-$(uuidgen)
# Print the URL that we can submit.
echo "Crawl URL: http://$CRAWL_ID"
# Open the SSH tunnel.
ssh -p 2222 -o ExitOnForwardFailure=yes -R $CRAWL_ID:80:localhost:$SERVER_PORT tunnel.tasting.dev deadline=3600s
这些步骤假设你的服务器正在 localhost 的端口 3000 上运行。请根据实际情况调整,并使用打印出的 URL 调用 extract_brand(url)。退出 ssh 或截止时间到达时,隧道都会关闭;若隧道已关闭,提交提取请求会失败并显示 Page not reachable。一次提取或验证需要 3 到 5 分钟,因此在多轮操作期间请保持 ssh 运行;若隧道过期,请重新运行命令。对于没有服务器的静态文件,可以考虑使用 Python 内置服务器:
python3 -m http.server 3000 --bind 127.0.0.1
**绝不要一次请求整个文档。**传入 sections,每次获取两到三项。引擎只运行一次提取并缓存结果,因此之后的读取成本很低:
get_brand_extraction_result(brand_submission_id, sections=["profile", "colors"])
get_brand_extraction_result(brand_submission_id, sections=["typography", "assets"])
get_brand_extraction_result(brand_submission_id, sections=["actions", "surfaces", "elevation"])
get_brand_extraction_result(brand_submission_id, sections=["layout", "structure", "navigation"])
get_brand_extraction_result(brand_submission_id, sections=["interactions", "icons"])
get_brand_extraction_result(brand_submission_id, sections=["data_display", "sections"])
十四个合法名称分别是 profile、layout、colors、typography、surfaces、elevation、interactions、actions、navigation、data_display、structure、icons、assets 和 sections。
每次收到结果后,都要将答案保存到工作目录——每次获取保存为一个文件,放在你自己创建的目录下,例如 brand/typography-assets.json。然后在编写 CSS 时,使用你手头的文件查看工具,从这些文件中读取准确值。这就是每次只获取两到三项,而不是十四项的原因:每个文件都足够小,一次读取就能完整返回。
绝不要凭记忆或从滚动记录中抄写值。只有从文件中复制出来的原子值才算逐字准确。整个过程的核心就是确保抄写错误为零:准确的十六进制值、准确的字体规格、准确的 CSS。
未获取的部分,就是未使用的部分。
2. 素材本身就是提取结果的一半
每个 get_brand_extraction_result 答案都会在 design_system 旁附带一个 artifacts 对象,即使缩小提取范围,它也会保留,因此从第一次调用起就要把它保存好:
| 素材 | 为什么不能跳过 |
|---|---|
css | 捕获到的样式表。真实的 @font-face 规则和托管字体文件 URL。typography 会列出字体,但只有加载字体才能使用它。 |
html | 捕获到的页面。品牌的内联 SVG 徽标,以及网站实际提供的原样标记。 |
full_page_screenshot / screenshot | 品牌的真实呈现效果。它是检查信息密度、对比度以及明暗平衡的唯一可靠依据。 |
开始设计前,先将这三项全部下载到工作目录:
curl -fsSL "<artifacts.css.url>" -o brand/captured.css
curl -fsSL "<artifacts.html.url>" -o brand/captured.html
curl -fsSL "<artifacts.full_page_screenshot.url, or artifacts.screenshot.url when it is null>" -o brand/reference.png
从字体开始
一个 @font-face 代码块会跨越多行,因此按行搜索的 grep 无法找到它。用你手头的任何工具,从 brand/captured.css 中完整读取每条 @font-face 规则:可以使用多行搜索、内联脚本,也可以直接查看文件。只排除根据字体系列和用途确认是图标字体的字体;base64 格式的 src: 也可能嵌入品牌字体。
将这些规则原样粘贴到你的 <style> 中,并保留绝对路径的 src: URL。只命名字体却不加载,就是失败。 页面会渲染成后备字体,而使用后备字体的页面无论十六进制颜色值多么精确,看起来都不像品牌。如果某个字体系列完全没有对应的 @font-face,且 Google Fonts 上有该字体,就从 Google Fonts 加载;否则使用通用字体系列,并在最终消息中说明。绝不要替换成其他命名字体,也不要改用名称相似的字体系列。
授权字体属于品牌,而不属于你的页面。 许可证适用于品牌的域名,因此无论字体文件来自品牌的主机还是你的主机,你的页面都未获授权。向用户索取字体。 说明所需的字体系列和字重,并请用户提供已授权的字体文件或供应商套件。等待期间继续构建页面的其他部分。
然后处理徽标
提取结果中已经包含徽标。assets.logos[] 提供引擎从标记中提取的内联 SVG,即 svg_code,以及引擎存储空间中的镜像副本 url,还有用于区分字标和图形标志的 role、format 和 description。icons[] 中也为每个图标示例提供了相同的 svg_code。直接使用其中的徽标,绝不要重新绘制。
只有当 svg_code 为 null 且无法通过 url 获取时,才回退到捕获的页面:在 brand/captured.html 中查找 <svg> 元素。导航栏中的图形标志通常是 <a href="/"> 内的第一个候选项;小型且只有一个 path 的元素通常是图标。
最后查看截图
排版前先打开下载的图片,完成前再打开一次。信息密度、对比度和明暗平衡都体现在图片中,无法用数字保留下来。如果设计令牌与截图不一致,以截图为准。
3. 覆盖每个部分
每个已出现的部分都应纳入输出。
- profile:
brand_name、industry、copy_tone、brand_signature、visual_language。这是关于品牌语气和意图的设计简报,不只是像素。 - colors:
baseline[]和secondary[],每项均包含hex、alpha、type、rules.when_to_use和嵌套的shades[]。使用精确的十六进制值,并遵循when_to_use,让每种颜色都发挥品牌赋予它的作用。 - typography:
titles/paragraphs/labels/others,每个变体都包含role、specs和technical.font_family_css。优先使用原始clamp(...),而非 px 快照。 - layout:
grid、breakpoints、section_separation、insights。 - actions:
button_list[]中每个状态的visuals、button_group、links.text_decoration。 - surfaces:
gradients[]包含可直接使用的css_code。直接粘贴。 - elevation:
shadows.levels[]的css_value和borders[]。 - interactions:
global_patterns和包含css的animations[]。 - navigation、structure、data_display、icons:仅在检测到时才包含。检测到时遵循;未检测到时跳过,不要凭空添加。
- assets:包含
svg_code和url的logos[],以及media[]。粘贴 SVG 或指向真实 URL;切勿重新绘制。 - sections:参考页面自身的有序蓝图。研读它,了解品牌各部分的命名方式,然后自行安排顺序——你要构建的是另一个页面。
4. 组合
按顺序应用各项决策:布局框架、组件、全页配色与字体、表面样式、动效,最后使用符合品牌语气的文案。
硬性规则。
<style>必须以提取到的颜色变量原样开头,并通过变量引用每种颜色。提取结果中未定义的色调,仅可通过 token 派生的rgba()或color-mix()使用。不得添加任何自创的十六进制值。- 仅通过你恢复出的
@font-face规则加载品牌字体,并使用其列出的字重。回退字体栈只能包含通用字体或系统字体。 - 所有按钮、导航、切换控件、卡片、手风琴、分隔线和表格都必须使用提取结果中的组件 CSS,并原样复制。类名可自由重命名,但不得更改任何值。
- 使用品牌的真实素材:Logo、图像、favicon。若提取结果将图像标记为构图素材,就必须充分展示,不能缩成缩略图。
- 在密度、对比度和氛围上匹配截图。不要照搬其布局。
- 可在品牌网格、间距节奏和分区体系内自由组合所需页面。布局指的是排列方式,绝不意味着可以重新设计样式。
如果某个部分逐渐变得雅致却泛泛而谈,问题就出在你根据形容词而非具体数值做了决策。回到保存的文件中查找。
5. 根据渲染结果而非标记验证
如果可以提供页面并查看效果,就在 1440 和 390 两种尺寸下查看。这些检查中有一半只能通过图像发现。无法查看时,直接进入第 6 步,让验证器负责检查。
修复前先逐项记录发现的问题,再根据记录进行修复。悄悄修复缺陷,无法为下一次运行提供经验。每次修正后都要重新渲染:没有检查过的修复只是声称有效,并非经过验证。
6. 使用品牌一致性验证器进行验证
你自己的眼睛也有盲区:你评估的是自己做出来的作品。引擎内置了一个验证器,它会以相同方式提取参考页面和你的页面,并对两者进行评判。因此,渲染检查通过后,请获取外部评估结果。
页面必须能被引擎访问。 验证器接收两个 URL,并自行提取两者的内容——不接受原始 HTML,也不支持文件上传——因此,它无法访问通过 loopback 提供服务的页面。请使用页面的部署 URL 或预览 URL,或者使用上文步骤中提到的 Taste Labs SSH 隧道,并在迭代期间保持隧道开启。如果本次运行无法将页面放到可访问的 URL 上,请跳过此步骤,并在结束消息中说明;绝不要用自己的观感代替验证结果,再将其当作验证结果呈现。
verify_brand_adherence(reference_url=<the brand site>, candidate_url=<your page>)
→ job_id # extraction of either side is reused when recent
poll_brand_adherence(adherence_job_id=<job_id>) # accepted → extracting → judging → completed
get_brand_adherence_result(adherence_job_id=<job_id>)
验证结果包含三项内容:
score— 一个 0 到 1 之间的分数,由大模型评审和确定性检查综合得出。fixes— 确定性验证器给出的修复对象,按优先级从高到低排列,最多 20 项。每项都带有一个action判别符(snap_to_token、add_color_token、self_host_licensed_font等),以及该操作对应的精确目标值。recommendations— 评审给出的建议字符串,按优先级从高到低排列,包含精确目标值,最多 20 项。
按顺序处理验证结果。 修复项是机械性的:每项都会指出要更改的精确值,因此请像处理提取结果那样应用它们——直接从修复对象复制目标值,绝不要凭记忆重新输入。然后从上到下阅读建议,并应用不违反硬性规则的建议;如果某项建议会让你凭空编造令牌,就应以规则 1 为准。记录所有你决定不采纳的内容及原因,以便在结束消息中说明。
这一循环运行两次,然后交由用户决定。 先验证、应用结果、重新渲染,再验证一次——重用提取结果可让第二次验证成本很低。不要根据第二次验证结果采取行动。结束时并列给出两次分数、第二次验证仍列出的修复项和建议,以及你未采纳的内容和原因。用户会阅读这份清单,并决定是否值得花费额度再进行第三轮。自行启动的额外一轮会把额度花在你的盲区上,而不是页面上。
最终自查
针对磁盘上的文件,以及最后一次渲染(如果有)进行检查。修复所有未通过的项目,然后将修正写回文件。
- 每个颜色字面值都能追溯到一个提取令牌,或者是由令牌推导出的
rgba()/color-mix()。 - 正文背景使用品牌的主导表面色,明暗比例与截图一致。
- 每种品牌字体都通过真实的
@font-face加载,而不只是被命名。任何位置都只能使用品牌的字体系列和字重。 - 每个组件都由提取结果中的组件 CSS 构建。不得自行编造组件、圆角或阴影。
- 页面上使用真实 Logo,构图性图像完整呈现,且每个资源引用都指向真实的品牌资源。
- 提取结果中存在的每个区块都已提取、保存并使用。
- 页面在 390 和 1440 的视口宽度下都能保持结构稳定,并已通过渲染或验证器结果确认,而非仅凭假设;远程字体或脚本加载失败时也能保持稳定。
- 没有内容溢出,没有内容在仍有空间时被截断,也没有内容遮挡读者需要阅读的文字。
最后用清晰直白的文字说明你做出的品牌设计决策、如何获取提取结果、修正前后的验证器分数(或无法运行验证器的原因)、第二次验证仍列出的修复项和建议、你决定不采纳的内容及原因,以及任何无法验证的事项。