为 AI 时代的开发者重建文档:CCC 文档站的建设实录(2)——AFDocs 规范落地与 Skills 搭建

引言

这篇文章延续此前两篇的脉络:

本文就是这个“下一步”的实录,主要包括两件事:

  1. 用一个新兴的规范草案—— AFDocs(Agent-Friendly Documentation Spec)——系统性地检验并补齐 CCC 文档站的 AI 友好度;
  2. 将单体的 SKILL.md 拆分成了 Hub + Spoke 架构,形成了一套完整的 CCC Skills。

一、意外的发现:一项面向 AI Agent 的文档规范草案

完成《建设实录(1)》里的工作后,我们的重心正式转向了 AI 发现(Discoverability)与 AI 消费(Consumption)。正当我们发愁该如何测试文档站点能否被 AI 识别和利用时,无意间看到了 Mintlify 新推出的检测工具 mintlify.com/score

它的定位很明确:“你的文档看起来不错,但 Agent 能读到吗?”—— 这不正是我们当下最想知道的事情吗! 它的工作原理是按照 Agent 实际读取文档的方式来打分:能不能找到页面、能不能解析内容、能不能用上读到的东西。这套打分标准的依据,就是它页面上提到的 AFDocs 标准

顺着链接查过去,发现这是一个 2026 年 5 月 8 日才发布的规范草案,开源在 GitHub 上,由 agent-ecosystem/agent-docs-spec 维护,当前版本为 v0.5.0,仍处于 Draft 阶段,并配有一个同名 CLI 工具 afdocs

该规范定义了 23 项检查、覆盖 7 大类目,用来衡量一个文档站对 AI Coding Agent 是否友好:

  • 能否发现文档(Content Discoverability)
  • 有没有可用的 Markdown 版本(Markdown Availability)
  • 页面会不会因为太大被截断(Page Size and Truncation Risk)
  • 内容结构是否规整(Content Structure)
  • URL 是否稳定(URL Stability)
  • 可观测性(Observability)
  • 鉴权处理(Authentication)等等。

CCC 文档站有幸成为该规范的早期受益者之一。

规范的来源也很有意思:它源于作者的实证研究——作者花了 10 多个小时,用 Claude 实际验证了 578 个编程场景下 Agent 访问文档的表现,系统梳理了 URL 失败模式、llms.txt 的发现路径、Markdown 相比 HTML 的优势,以及页面截断这几类问题的根源。换句话说,AFDocs 不是一份“应该怎么做”的理论建议,而是一份“我们观察到 Agent 实际是怎么被卡住的”故障清单。

docs.ckbccc.com 输进 Mintlify 的检测框,跑出来的结果让人挺受鼓舞:AFDocs 检查的重点,和我们在建设实录(1)里做的事情——llms.txt、逐页 Markdown 等——高度重合,说明我们的大方向没偏。但报告也明确指出了几个我们此前没有覆盖到的盲点,这就是接下来要讲的具体落地工作。


二、AFDocs 落地:具体改了什么

值得一提的是,AFDocs 提供了本地检测工具,可以在开发过程中反复迭代:

npx afdocs check <http://localhost:3000> --canonical-origin <https://docs.ckbccc.com> --format scorecard

这条命令会在本地开发环境下跑一遍全部检查,输出结构化的 scorecard。我们可以针对每一项 fail/warn 反复调整,直到指标满意后再推送到正式站点,大大提升了验证效率:

就这样,对照 AFDocs check 的报告结果,我们提交了一版改造 PR:ckb-devrel/ccc#420,主要包含三类改动。

1. 核心规范合规

  • 新增 /SKILL.md:作为面向 Agent 的操作指南入口(下一节详细展开);
  • 增强 llms.txt:补充分区索引,改善结构,让 Agent 不用一次性拉全文就能定位目标章节;
  • llms.txt 等端点加上 Cache-Control 头;
  • 实现基于 .md 后缀和内容协商的按页 Markdown 输出;
  • 在 layout 层嵌入一段面向爬虫/Agent 可发现的指令性元信息;
  • 更新文档页面结构,使其更符合 Agent 友好的组织方式。

2. 示例代码的可发现性

此前 Code Examples 页面里的示例代码,source 字段用的是仓库内的相对路径。这类路径只有在 Agent 已经拿到完整仓库上下文时才有意义——但很多时候 Agent 只是访问了文档页面,并没有整个仓库的上下文。我们把中英文两个版本的 code-examples.mdx 里的 source 字段,全部换成了 raw.githubusercontent.com 的绝对 URL。同时,我们在文档中增加了对 AI Agent 的引导说明:

这样 Agent 就可以直接抓取到示例源码,不再依赖仓库上下文。

3. Markdown 响应的元信息头

给每个页面的 Markdown 响应加上了标题、URL、GitHub 源文件链接,并把页面描述作为 blockquote 放在开头。这样 Agent 在拿到一段 Markdown 内容时,能立刻知道“这是哪个页面、从哪来、原始文件在哪”,而不是一段脱离上下文的纯文本。

这几类改动看起来琐碎,但正好对应 AFDocs 报告里反复强调的一件事:Agent 不会读你的导航结构,很多时候它拿到的就是一段孤立的文本,你得在这段文本本身里把上下文信息补全。


三、Skills:从一份单体文件,到 Hub + Spoke

1. 为什么要拆

第一个版本的 CCC Skill,是放在文档站 public 目录下的一份单体 SKILL.md。但完成后我们发现,这样一份全量的 SKILL 文件天然存在一个问题:CCC 覆盖的场景很多(钱包连接、交易组装、UDT、Spore……),内容会持续增长和迭代,单个文件一旦变得很长,就有被部分 AI 工具截断上下文的风险——truncation 恰好也是 AFDocs 报告里点名的一类问题。

拆分本身有几种可选方案,我们最终选择了目前比较主流的做法:把 Skill 文件迁到 ckb-devrel/ccc 主仓库,同时把文档站根目录的 skill.md 改造成一份索引文件,指向各个具体的 Skill。

这样设计的好处是可以覆盖到多种场景的开发者:装了本地 Skill 的开发者可以直接在编程工具里加载对应的 spoke;而在网页版、没有安装任何本地 skill 的场景下,skill.md 依然可以作为唯一入口被访问到(这一点会在下一节详细展开)。

现在 CCC 的 Skills 是一个 Hub + Spoke 结构,Hub 是 ckb-ccc-fundamentals(讲清 Cell 模型、包选择、交易处理、地址处理这些基础概念),围绕它的 6 个 spoke 分别是:

Skill 覆盖领域
ckb-ccc-fundamentals(Hub) CKB/CCC 基础概念、包选择、DeepWiki/Context7 查询方式
ckb-ccc-signer-setup 钱包连接(前端 Provider/Hooks)、后端私钥 Signer
ckb-ccc-transactions 交易组装、补齐输入与手续费、cell dep、链上查询
ckb-ccc-udt UDT/xUDT 代币的发行、转账
ckb-ccc-spore Spore 协议 NFT/DOB 的铸造、转让、销毁
ckb-ccc-playground CCC Playground 在线调试工具的使用
ckb-ccc-examples-finder 帮助定位/复用现成的 CCC 示例代码

安装方式仍然是一行命令:npx skills add ckb-devrel/ccc --all

2. 重点展开:playground 与 examples-finder

这两个是后加的 spoke,也是我个人认为比较能体现“skill 不只是 API 说明书”的两个例子。

ckb-ccc-playgroundlive.ckbccc.com 是一个零配置的浏览器内 CCC 运行环境。我自己写脚本验证某个特定功能时,经常直接在 Playground 里跑,而不是本地搭一个完整项目。这种用法对开发者非常高效,但如果不特意说明,很少有人会想到用它。所以我们专门做了一个 Skill,让 AI 在合适的场景下(比如用户只是想验证一个想法、调试一段代码)主动把 Playground 推荐给开发者,而不是默认让开发者去搭完整的本地工程。

ckb-ccc-examples-finder:解决的是另一个常见痛点——开发者不知道去哪找示例、找 Demo。很多时候他们直接去问 AI,而 AI 手头并没有“CCC 有哪些现成示例、分别在哪”这类结构化信息。这个 Skill 就是要让 AI 能够:要么直接引导开发者去正确的位置查找;要么自己去把示例找到、直接呈现给开发者;甚至可以进一步分析拿到的示例,重新组装出更贴合开发者具体需求的脚本。

下图是在 Devin 里的实测效果:


四、Prompt 模板:让不同起点的开发者都能用上 Skill

CKB 生态目前的开发者体量还很小,我们需要的不仅仅是服务好已经在用 Cursor / Claude Code 的老手,更重要的是把更多新开发者引导进来。这批新开发者中有相当一部分人,第一次接触 CKB 开发可能是通过某个 AI 驱动的网页应用构建器(纯聊天交互,构建网站/网页应用/移动应用),先直接把 MVP 聊出来,验证完想法之后,才会把代码下载到本地、换成正式的编程工具继续迭代。

这意味着 skill 的使用场景天然分成两类:

  • 纯网页对话场景:没有安装任何本地 Skill,此时唯一的入口就是那份 skill.md 索引文件(https://docs.ckbccc.com/skill.md),需要开发者(或者产品自身)显式把这个链接贴进对话里;
  • 已装 Skill 的 AI 编程工具场景:Cursor / Devin / Claude Code 等工具会根据 Skill 的 description 字段和任务的自然语言描述自动路由到对应 spoke,开发者不需要、也不应该被要求记住具体的 Skill 名字。

我们希望这两类开发者都能顺利用上 CCC 的知识库,网页对话构建 MVP 之后,本地继续迭代时 Skill 原生环境也能无缝接上。因此,我们在 CCC 的文档站点里对这两种使用场景均做了相应的指引。


五、效果:从检测分数到真实案例

1. AFDocs 检测分数

改造之前,docs.ckbccc.com 在 Mintlify Agent Score 上的得分是 92 分;PR #420 合并之后,分数提升到了 100/100(A+),在 30 项检查中通过了 24 项。

Mintlify 这个检测工具在 AFDocs 核心 23 项检查的基础上,又额外加了几类检查项,比如 Agent Skills、MCP Server。目前我们仍有 2 项 fail、1 项 warning。

其中 MCP Server 这一项 CCC 没有实施,是出于这样的考量:CCC 的代码和文档已经同步更新到 DeepWiki、Context7 等主流 AI 友好平台,这些平台均提供了各自的 MCP Server,AI 编程工具可以方便地配置使用。我们在测试中也验证过,当工具中配置了 DeepWiki 或 Context7 的 MCP Server 后,询问 CCC 相关问题能够正确调用并返回高准确率的回复。因此,我们决定不额外增加一个需要开发者单独配置的 MCP Server,而是充分利用已有的生态基础设施。

下图是我在 Devin 里问 AI:“给我解释一下 ccc 里的 tx.completeFeeBy 方法”之后 AI 的回复。可以清楚地看到它的搜索路径:由于我的 Devin 里配置了 DeepWiki 和 Context7 的 MCP,它先调用了 DeepWiki 的 MCP,请求失败(可能网络原因)后,又继续调用 Context7 的 MCP 服务来获取相关信息。

2. Skills 的早期数据

Skills 目前刚发布不久,我们还没有对外公开推广,skills.sh 上的安装数据也还很早期:

这部分数据现阶段更多是一个起点记录,而不是拿来证明什么,后续会持续跟踪。

3. 真实案例:AI 工具用上 Skill 前后

比起分数,更想拿出来分享的是几个实测案例,看看 AI 加上 Skill 前后的对比效果到底如何。

3.1 没有使用 Skill 时

首先,我们来看看没有使用 Skill 的情况下,AI 开发 Demo 的表现:

帮我写一个 React 网页应用,实现: 连接钱包后,可以发行一个 CKB 链上的 xUDT 代币,同时支持对该代币发起转账交易。

查看 AI 的执行过程:

结果:

3.2 用上 Skill 后

接下来,我们来看看当 AI 使用上 Skill 后,开发的 Demo 如何。

我们还是在 bolt.new 上做——使用相同的平台,前后对比的结果更有参考意义。与此前无 Skill 测试的提示词几乎一样,只是我们加了一句“请先访问 https://docs.ckbccc.com/skill.md”。

案例 1:xUDT 代币的发行与转账应用

请先访问 https://docs.ckbccc.com/skill.md ,然后帮我写一个应用,该应用的核心功能是发行xUDT代币,并支持转账xUDT。

这个提示词里,我刻意去掉了CKB、CCC等关键字,因为只要 AI 去加载我们的 Skill 索引文件,必然可以知道这些信息。

查看 AI 的执行过程:

可以看到,AI 正在按照我们设定的规则执行:

  • 首先去加载了 https://docs.ckbccc.com/skill.md 这个文件;
  • 读取内容后,它发现还需要加载 fundamentals、signer setup、transactions 以及 udt 这几个 Skill 才能完成需求;
  • 获取到相应的 Skill 文件后,它将这些内容放进自己的缓存中以便随时读取;
  • 根据 Skill 规范开始编写代码。

结果令人惊叹!主体功能一次通过,大家可以在这里体验xudt-token-issuance-kynx.bolt.host (testnet,仅用于演示)

加上了 Skill 之后,上面的应用生成得很成功,是巧合还是必然?为了进一步验证 AI 工具是否真的在使用我们的 Skill,我们又额外增加了一个案例 Demo 的测试。

案例 2:链上留言墙

请先访问 <https://docs.ckbccc.com/skill.md,然后用> CCC SDK 做一个 React 网页应用:
连接钱包后可以发一条短留言,留言内容写入一笔 CKB 交易的 cell data 里,永久上链;
首页按时间倒序展示所有留言和发送者地址。

同样,我们使用上面的提示词在 bolt.new 里执行,观察 AI 的执行流程是否符合预期,并验证最终应用是否可用。

AI 完全按照我们预想的方式在处理,而且它还做了一些额外的、我们的提示词里没有提到的工作来完善 Demo 的体验。看到效果的那一刻,我不禁感叹:装上了 Skill 的 AI 真的太强了。

这里预览:ckb-chain-message-wa-66g4.bolt.host

以上两个案例除了涉及钱包连接、交易组装这类在第一篇调研报告中被反复强调“AI 容易出错”的环节(capacity 计算、cell 占用逻辑等)之外,还涵盖了 UDT 的三步发行与转账,以及留言板里如何汇总查询链上记录等复杂场景。接入 Skill 之后,这些流程均一次跑通。这可能不算一个非常严谨、全面的测试,但作为方向性的验证,给了我们非常大的信心。

:warning: 上述预览链接仅用于演示 skill 的效果,请勿用于其他用途。

除了 bolt.new 以外,我们还在 Lovable、BASE44等平台上测试了使用 Skill 之后的效果。

也想借这个机会邀请社区一起来测试:如果你在用 Cursor / Claude Code / 网页版 AI 工具开发 CKB 应用,欢迎试试安装或引用 CCC 的 Skill,把你遇到的效果、踩到的坑反馈给我们。


六、方法论

下面是我们将 CCC 文档建站这两篇实录(建设文档站 + 补齐 AI 友好度)中的经验,提炼成的一份可复用的 checklist,供你参考:

  1. 先把文档做实,再谈 AI 友好:AI 可消费性建立在人类可读的高质量文档之上,顺序不能反。
  2. 借助行业规范或检测工具自查:用 AFDocsMintlify Agent Score 这类工具跑一遍现状,能发现很多凭经验想不到的盲点。
  3. 本地反复迭代,再部署上线npx afdocs check <本地地址> --canonical-origin <线上域名> 可以快速验证,避免每次改动都依赖线上环境。
  4. 让 Markdown 响应自带上下文:Agent 拿到的往往是脱离页面结构的一段文本,务必在响应中显式带标题、来源 URL、GitHub 源文件链接等元信息。
  5. 示例代码使用绝对 URL,不要依赖 Agent 已经拿到仓库上下文这一假设。
  6. 提前规划 Skill 的演进结构:内容会持续增长,采用 Hub + Spoke 或类似拆分方式,避免单体文件被截断。
  7. 兼顾两种用户场景:既照顾已安装本地 Skill 的开发者,也为纯网页对话用户(尤其是新上手用户)提供便捷的入口。
  8. 用真实案例验证效果:选择几个典型场景实测 AI 生成代码的成功率,比单纯看检测分数更有说服力。

后记

至此,CCC 文档站在“AI 发现”和“AI 消费”这两个方向上都完成了一轮系统性建设:AFDocs 规范草案把此前偏经验性的 AI 友好度工作,变成了一套可检测、可量化、可持续迭代的标准;Skills 生态则让这些沉淀下来的最佳实践,能够以 Agent 原生的方式被直接调用,而不只是“文档写得好、AI 自己去悟”。

不过这还不是终点。我们将持续改善文档与 Skill,补充更多可供参考的示例代码,以便更好地服务AI 时代的开发者

同时,如果你正在用 AI 工具开发 CKB / CCC 应用,欢迎试试 CCC 的 Skill,把你的体验和建议留在评论区。

参考链接

7 Likes

First of all, congratulations on this great result! It’s hard to estimate just how many future projects will benefit from the improvements based on this research. And it’s almost amusing how simple it can be—but you have to think of it first. Linking to the relevant code or GitHub in the meta/header sections of the pages. :eyes::grinning_face_with_smiling_eyes:

2 Likes