# 22 个文件、0 个 ERROR：怎么确认一个开源排版 Skill 真能用

> 一条 2.9 万浏览的推文说开源了公众号排版 Skill，但文末链接被折叠成短链。这篇记录完整的五步核查：推文还原、链接展开、仓库树核验、真实文件落盘、安全审计加冒烟测试——顺便查出推文说的 5 套主题实际是 6 套。

### TLDR

- **五步核查法**：推文还原 → 链接展开 → 仓库树核验 → 真实文件落盘 → 安全审计加冒烟测试。缺少任何一步，「能用」都只是转述。
- **链接这一关最容易被跳过**：推文正文里的仓库地址被折叠成 t.co 短链，文末真实 URL 抓取时被截断。最终靠一条微博转发坐实地址是 **github.com/isjiamu/gzh-design-skill**，署名「甲木 × 摸鱼小李」。
- **推文与仓库对不上账**：推文说「5 套预设风格」，仓库实装 **6 套主题**；推文称 Obsidian 插件是自己的，但该插件真实作者是 **Kianzzz**。两处都需要在使用时按仓库口径更正。
- **落盘与安全**：22 个核心文件落盘，源头检查 **ERROR×0、WARN×2**；四个脚本审计结论为无网络外联、无命令执行、无破坏性操作，仅本地写盘。
- **一个容易被误判的细节**：脚本里命中三处 http 开头的字符串，是 docx 的 XML 命名空间，不是网络请求。grep 命中不等于有风险。

### SRC

研究对象为 X 用户 @xilo2991 于 2026 年 8 月 27 日 09:50 发布的长推（浏览 2.9 万），核查撰写日期为 2026 年 8 月 7 日报道口径下的一次落地验证。真实仓库地址经微博转发 weibo.com/2194035935/R7IGZtYSl 佐证。仓库树、文件字节数、脚本内容与 LICENSE 均取自 GitHub 原始文件；安全审计为对已落盘脚本的定向扫描，结论为安装前静态检查，不构成对后续版本的安全承诺。AGPL-3.0 相关义务说明为本文对许可证文本的解读，具体合规问题请咨询专业律师。文中「判断：」段落为本文观点。

### BODY

<div class="sec"><div class="eyebrow"><span class="num">1</span>为什么不直接装</div>
<h2>验证一个 Skill，需要五步而不是一步</h2>

<p>看到一个开源工具，最常见的动作是「装上试试」。对 Agent Skill 这类会读本地文件、可能执行脚本的东西，这个动作太快了。</p>

<p>这次核查走的是一条五步链，每一步都在挡一类特定的错。</p>

<div class="jx">
  <div class="jx-h"><span>五步落地核查</span><span class="jx-note">每一步挡掉一类错误</span></div>
  <div class="jx-tl">
    <div class="jx-tl-row"><div class="jx-tl-t">第一步</div><div class="jx-tl-b"><div class="jx-tl-blk" style="background:#0a749a">推文还原<span class="m">挡掉：转述失真，把别人的说法当作者的说法</span></div></div></div>
    <div class="jx-tl-row"><div class="jx-tl-t">第二步</div><div class="jx-tl-b"><div class="jx-tl-blk" style="background:#2563eb">链接展开<span class="m">挡掉：短链折叠，指向错误仓库</span></div></div></div>
    <div class="jx-tl-row"><div class="jx-tl-t">第三步</div><div class="jx-tl-b"><div class="jx-tl-blk" style="background:#6d3fd4">仓库树核验<span class="m">挡掉：仓库存在但内容与描述不符</span></div></div></div>
    <div class="jx-tl-row"><div class="jx-tl-t">第四步</div><div class="jx-tl-b"><div class="jx-tl-blk" style="background:#b85c0a">真实文件落盘<span class="m">挡掉：只读 README 就下结论</span></div></div></div>
    <div class="jx-tl-row"><div class="jx-tl-t">第五步</div><div class="jx-tl-b"><div class="jx-tl-blk" style="background:#0d8a5f">安全审计 + 冒烟测试<span class="m">挡掉：脚本有外联或破坏性操作</span></div></div></div>
  </div>
</div>

<p>前三步是「它是它说的那个东西吗」，后两步是「它装上以后会不会出事、能不能跑」。五步缺一，结论就只能算传闻。</p>

<div class="keypoint">
  <strong>判断：</strong>对一个要长期放进工作流、还会被 Agent 自动调用的技能包来说，<strong>「能不能跑」和「是不是它」是两个独立问题，必须分开验证</strong>。绝大多数踩坑不是因为工具不好用，而是因为装的根本不是推荐里说的那个仓库——同名、复刻、搬运版本在开源站上比想象中多。
</div>

<div class="sec"><div class="eyebrow"><span class="num">2</span>链接这一关</div>
<h2>推文说的仓库，未必是那个仓库</h2>

<p>这条推文的正文，本身就是用这个 Skill 排出来的。问题出在链接：正文里的仓库地址被折叠成短链，指向 X 文章页；文末真实 URL 抓取时被截断。<strong>光看推文，你拿不到仓库地址。</strong></p>

<p>最后是靠一条微博转发坐实的：地址是 github.com/isjiamu/gzh-design-skill，仓库简介与推文描述（6 套模板、可生成新模板）吻合。</p>

<div class="jx">
  <div class="jx-h"><span>推文说法与实测对照</span><span class="jx-note">核查日期 2026-08-07</span></div>
  <table class="jx-mx">
    <tr><th></th><th class="c">推文 / 传闻</th><th class="a">实测结果</th></tr>
    <tr><th>仓库地址</th><td class="c">文末 URL 被截断</td><td class="a">isjiamu/gzh-design-skill，经微博转发坐实</td></tr>
    <tr><th>署名</th><td class="c">暗示为推文作者本人</td><td class="a">仓库署名「甲木 × 摸鱼小李」，归属待核实</td></tr>
    <tr><th>主题数量</th><td class="c">「5 套预设风格」</td><td class="a">仓库实装 6 套主题</td></tr>
    <tr><th>Obsidian 插件</th><td class="c">称自己做的</td><td class="a">真实作者为 Kianzzz，MIT 协议</td></tr>
    <tr><th>跨平台可用</th><td class="c">「在 WorkBuddy 里也能用」</td><td class="a">成立，README 列出多个 Agent 环境</td></tr>
  </table>
</div>

<p>两处出入值得记。一是<strong>「5 套」和「6 套」的差别</strong>——大概率写推文时第 6 套还没加。<strong>推文是某个时刻的快照，仓库是活的，以仓库为准。</strong></p>

<p>二是<strong>插件的归属</strong>。推文说「我做过一个 Obsidian 的排版插件」，而该插件在公开检索里指向另一位作者。这可能是同一人的不同账号，也可能不是。<strong>在坐实之前，引用时应该写「据 isjiamu/gzh-design-skill（甲木×摸鱼小李）」，而不是直接归给推文作者。</strong></p>

<div class="sec"><div class="eyebrow"><span class="num">3</span>落盘</div>
<h2>22 个文件，字节数对得上才算数</h2>

<p>仓库树看过了还不算完。落盘并核对字节数，能挡掉「README 写得很漂亮、实际文件是空的」这类情况。这次落盘的 22 个文件分五类：入口 SKILL.md（18.6KB）、主题库（theme-index 加 6 套主题，约 215KB）、辅助库（通用组件、归一化规则、主题生成器、回归用例）、四个脚本，以及预览模板与双语 README 等资源。</p>

<p>其中最有意思的是它的<strong>双关卡质量校验</strong>设计，这也是它区别于普通排版模板的地方。</p>

<div class="jx">
  <div class="jx-h"><span>四个脚本各自挡什么</span><span class="jx-note">据仓库文件整理</span></div>
  <table class="jx-mx">
    <tr><th></th><th class="b">作用</th><th class="c">挡掉的问题</th></tr>
    <tr><th>component_lint.py</th><td class="b">源头关卡，扫组件库反模式</td><td class="c">改了组件却没验证，坏样式进入产物</td></tr>
    <tr><th>validate_gzh_html.py</th><td class="b">产物关卡，查平台禁用项</td><td class="c">样式标签、脚本标签、class 与 id 属性等被平台吃掉</td></tr>
    <tr><th>wrap_preview.py</th><td class="b">生成带复制按钮的预览页</td><td class="c">复制时把按钮本身一起复制进去</td></tr>
    <tr><th>extract_docx.py</th><td class="b">零依赖把 Word 转 Markdown</td><td class="c">用 Word 起稿时格式丢失</td></tr>
  </table>
</div>

<p>关键在于：<strong>它不试图让模型「记住」平台限制，而是把限制写成确定性检查</strong>。模型记不住的，脚本记得住。</p>

<div class="sec"><div class="eyebrow"><span class="num">4</span>安全审计</div>
<h2>装之前该查的四件事</h2>

<p>对一个会被自动调用的脚本包，安装前的静态审计不是洁癖。这次定向扫了四项，结论是安全的。</p>

<div class="jx">
  <div class="jx-h"><span>安全扫描项</span><span class="jx-note">针对已落盘的四个脚本</span></div>
  <table class="jx-mx">
    <tr><th></th><th class="a">结果</th><th class="c">说明</th></tr>
    <tr><th>网络外联</th><td class="a">无</td><td class="c">未发现 urlopen、requests、socket 等调用</td></tr>
    <tr><th>命令执行</th><td class="a">无</td><td class="c">未发现 subprocess、os.system、eval、exec</td></tr>
    <tr><th>破坏性操作</th><td class="a">无</td><td class="c">未发现递归删除类调用</td></tr>
    <tr><th>文件写盘</th><td class="a">有，但合规</td><td class="c">docx 图片与预览页均写本地，无越权路径</td></tr>
  </table>
</div>

<p>这里有个值得单说的判断细节：扫描时命中了三处 http 开头的字符串，看起来像外联。实际检查后确认，那是 <strong>docx 文件的 XML 命名空间字符串，用于解析，不是网络请求</strong>。</p>

<div class="analogy">
  <div class="h">打个比方</div>
  <p>这像在行李箱里扫出一截电线就报警——电线确实在，但连的是吹风机。关键词扫描只告诉你「这里有个东西」，判断它是不是威胁得读上下文。<strong>自动化审计的误报往往比漏报更消耗注意力。</strong></p>
</div>

<p>还有一条容易被忽略的：仓库用的是 <strong>AGPL-3.0</strong>。本地个人使用没问题，但<strong>如果修改后分发，或者基于它做网络服务，就必须同样以 AGPL-3.0 开源并保留署名</strong>。这是协议义务，不是道德倡议。</p>

<div class="sec"><div class="eyebrow"><span class="num">5</span>冒烟与边界</div>
<h2>能用到什么程度，以及别拿它做什么</h2>

<p>冒烟测试跑的是源头关卡：检 11 个组件库，<strong>ERROR 为 0，WARN 为 2</strong>（两套主题里可接受的虚线占位边框）。项目自己定的规矩是 ERROR 不清零不算完成，所以这个结果算通过。</p>

<div class="jx">
  <div class="jx-h"><span>同类项目横向对比</span><span class="jx-note">均为公开仓库信息</span></div>
  <table class="jx-mx">
    <tr><th></th><th class="b">形态</th><th class="c">特点与取舍</th></tr>
    <tr><th>isjiamu/gzh-design-skill</th><td class="b">Agent Skill · AGPL-3.0</td><td class="c">不碰微信 API，无凭证风险；专注粘贴不掉格式</td></tr>
    <tr><th>Kianzzz/obsidian-wechat-publisher</th><td class="b">Obsidian 插件 · MIT</td><td class="c">插件内排版并发布到草稿箱，14 套主题</td></tr>
    <tr><th>iamzifei/wechat-article-publisher-skill</th><td class="b">Agent Skill · 调 API</td><td class="c">直发草稿箱，需密钥与 IP 白名单，属凭证类操作</td></tr>
    <tr><th>NeverSight/wechat-publisher</th><td class="b">Skill · Apache-2.0</td><td class="c">封装 wenyan-cli，多主题加图床，风格偏轻量</td></tr>
  </table>
</div>

<p>选型上，如果需求只是「排成粘贴不掉格式的 HTML」，<strong>不碰 API 的那一版风险最小</strong>。自动发布更省事，但要求把公众号密钥交给开源脚本、还要把服务器 IP 加进白名单——这是另一类风险，不该顺手就配。</p>

<div class="keypoint">
  <strong>判断：</strong>这个技能真正的价值不在「6 套主题好看」，而在<strong>把平台的隐性限制变成可执行的检查</strong>。主题随时能换，检查规则才能沉淀——排版质量不再依赖某次生成的运气。
</div>

<div class="srcline">
  <div class="h">信源与核查边界</div>
  推文为 X @xilo2991，2026-08-27 09:50 发布，浏览 2.9 万；仓库地址经微博转发 weibo.com/2194035935/R7IGZtYSl 佐证。文件、脚本与 LICENSE 取自 GitHub 原始文件，落盘 22 个并核对字节数。安全审计为安装前静态扫描，仅对当次落盘版本有效。<br><br>
  <strong>三处必须保留的边界：</strong>一、推文作者与仓库署名「甲木 × 摸鱼小李」、插件作者 Kianzzz 的关系<strong>未坐实</strong>，引用应按仓库口径署名。二、推文所述「5 套预设」与仓库实装「6 套主题」不一致，以仓库 theme-index 为准。三、AGPL-3.0 义务说明为本文对许可证文本的解读，不构成法律意见。文中「判断：」段落均为本文观点。
</div>

</div>
</div>
</div>
</div>
</div>

---

*来源：神机百见-具身解读 · https://www.shenjibailian.com/jiedu/article/gzh-typesetting-skill-audit/*
