Context Hub 多版本 API 文档机制详解:从 versioned-api 目录结构到 chub 版本解析原理
【免费下载链接】context-hub项目地址https://gitcode.com/gh_mirrors/co/context-hub点击查看免费下载本文以 Context Hub 仓库中的多版本文档测试样例 v1/DOC.md 为线索系统讲解 Context Hubchub CLI如何组织、构建、检索与获取按版本划分的 API 文档包括多版本目录的布局规范、frontmatter 元数据约定、recommendedVersion的确定规则以及chub get --version的底层解析逻辑。读完本文你将能独立为第三方 API 编写多版本文档并理解 Agent 通过 chub 拉取指定版本文档时的完整调用链。一、多版本文档的定位为什么需要按版本维护文档编码 Agent 在调用第三方 API 时最容易犯的错误是凭训练数据中的记忆去猜测 API 形态而真实 API 往往随版本演进发生破坏性变更breaking changes。Context Hub 的解决方案是把文档做成版本化、按语言划分的 Markdown 内容Agent 先chub get拉取当前版本文档再据此写代码参见 README.md 与 get-api-docs 技能。当同一个 API 存在多个不兼容的大版本如 v1、v2时就不能再用单一文档而要为每个版本单独维护一份DOC.md。仓库中的versioned-api样例正是为了演示并测试这一机制而存在的它在 cli/test/fixtures/acme/docs/versioned-api/ 下同时存放 v1、v2 两个版本目录二者共享同一个 frontmattername: versioned-api而metadata.versions分别声明为1.0.0与2.0.0。二、逐字段解剖 v1 文档frontmatter 与正文先看关联文档 v1/DOC.md 的完整内容--- name: versioned-api description: A test API with multiple versions metadata: languages: javascript versions: 1.0.0 revision: 1 updated-on: 2025-01-01 source: community tags: test,versioned --- # Versioned API v1 This is version 1.0.0 of the API documentation. ## Usage javascript const client new AcmeClient({ version: v1 });这份文档由两部分组成YAML frontmatter 元数据 Markdown 正文。结合 [build.js](https://link.gitcode.com/i/a79507a91ee147ce115429432cffa2e9) 的解析逻辑parseFrontmatter 见 [frontmatter.js](https://link.gitcode.com/i/43bafb9a7db3983b888dec6aac4063aa)各字段的作用如下 | 字段 | 必填 | 说明 | |------|------|------| | name | 是 | 文档条目名与 author 一起构成唯一 ID如 acme/versioned-api同一 API 的多个版本必须使用**相同**的 namebuild 才会把它们聚合成一个条目 | | description | 建议 | 搜索摘要用于 chub search 的结果展示与 BM25 索引 | | metadata.languages | 是 | 文档适用的语言逗号分隔如 javascript缺失会导致 build 报错 missing metadata.languages in frontmatter | | metadata.versions | 是 | 版本号逗号分隔如 1.0.0缺失同样导致 build 报错 | | metadata.revision | 否 | 内容修订序号该样例为 1 | | metadata.updated-on | 否 | 文档更新日期缺省时 build 会回退到构建当天的日期 | | metadata.source | 否 | 内容来源缺省时回退为 community样例显式声明 community | | metadata.tags | 否 | 逗号分隔的标签用于 chub search --tags 过滤 | 正文部分则是常规 Markdown标题 # Versioned API v1、版本说明、以及一个可直接运行的 JavaScript 用法示例 javascript const client new AcmeClient({ version: v1 });该示例通过构造参数指定version: v1与本文档声明versions: 1.0.0一一对应体现了文档版本号与 SDK 客户端版本参数保持一致的编写惯例。三、多版本目录的组织规范官方内容规范在 content-guide.md 的 Multi-version docs 一节给出了明确约定当 API 存在跨大版本的破坏性变更时为每个版本建一个子目录每个子目录放一份DOC.mdauthor/docs/entry-name/ v1/ DOC.md # versions: 1.0.0 v2/ DOC.md # versions: 2.0.0versioned-api样例完全遵循该布局v1 目录声明1.0.0v2 目录声明2.0.0二者name相同均为versioned-api。这样 build 时就会把它们合并为同一个 registry 条目而不是两个独立文档。仓库中真实内容的同款示例是 content/openai/docs/chat/按语言拆分为go1.3.0、javascript6.27.0、python2.26.0三个变体共用openai/chat这个 ID。规范还支持多版本 × 多语言的组合嵌套author/docs/entry-name/ v1/ javascript/ DOC.md python/ DOC.md v2/ javascript/ DOC.md python/ DOC.md四、build 阶段如何聚合版本从目录到 registry执行chub build content-dir时build.js 的discoverAuthor函数会递归扫描每个 author 目录下的所有DOC.md/SKILL.md并完成版本聚合。关键逻辑以 build.js 为准可以概括为四步按 name 分组以 frontmatter 的name为 key把多个版本目录下的DOC.md归并到同一个docsMap 项中按语言收集版本每个语言下维护一个版本数组遍历metadata.languages与metadata.versions的组合为每个语言, 版本生成一条{ version, path, files, size, lastUpdated }记录版本降序排序versions.sort((a, b) b.version.localeCompare(a.version, undefined, { numeric: true }))——注释明确说明这是简单字符串排序对 semver 足够用确定推荐版本recommendedVersion直接取排序后数组的第一个即数值意义下的最高版本作为 Agent 不指定版本时的默认值。因此对versioned-api而言build 后 registry 中会出现id: acme/versioned-api languages: - language: javascript recommendedVersion: 2.0.0 versions: - version: 2.0.0 # path: acme/docs/versioned-api/v2 - version: 1.0.0 # path: acme/docs/versioned-api/v1这一行为在端到端测试 e2e.test.js 中有明确断言acme/versioned-api的 javascript 语言下应有 2 个版本且recommendedVersion为2.0.0。需要说明的是这种排序方式对标准 semver如1.0.0、2.0.0是正确的从源码注释看项目有意选择了足够用的简单字符串排序而非完整 semver 比较。五、get 阶段的版本解析原理resolveDocPath当 Agent 执行chub get acme/versioned-api --lang js [--version X]时版本解析发生在 registry.js 的resolveDocPath函数中其决策树如下未指定--version优先使用langObj.recommendedVersion对应的版本若推荐版本记录不存在则回退到该语言版本数组的第一个元素langObj.versions?.[0]。这就是默认拿到最新文档的机制指定--version在langObj.versions中精确匹配v.version version命中则返回该版本的path随后 resolveEntryFile 拼接出path/DOC.md未命中则返回versionNotFound: true并携带available该语言所有可用版本列表。错误信息最终由 get.js 输出例如Version 99.0.0 not found for acme/versioned-api. Available versions: 2.0.0, 1.0.0此外--lang的解析也值得一提用户可用js、py、ts、rb、cs等别名normalize.js 会将其统一映射为javascript、python等全称后再做匹配若文档存在多个语言变体而未指定--lang则返回needsLanguage提示并列出可用语言get.js。六、实战搜索与获取指定版本文档结合 get-api-docs 技能 的完整工作流多版本文档的典型用法如下# 1. 搜索可用文档可加 --json 便于程序解析 chub search acme versioned --json # 2. 获取推荐最新版本——不传 --version 时默认拿到 v2 chub get acme/versioned-api --lang js # 3. 显式指定历史版本 chub get acme/versioned-api --lang js --version 1.0.0 # 4. 版本不存在时CLI 会列出可用版本 chub get acme/versioned-api --lang js --version 99.0.0执行第 2 步时输出内容即为 v2/DOC.md 的正文# Versioned API v2、version 2.0.0执行第 3 步时输出内容才是本文主角 v1/DOC.md# Versioned API v1、version 1.0.0与const client new AcmeClient({ version: v1 });。这些行为均有端到端测试背书e2e.test.js默认获取推荐版本chub get acme/versioned-api --lang js输出包含Versioned API v2指定版本--version 1.0.0输出包含Versioned API v1不存在的版本--version 99.0.0报错并列出2.0.0、1.0.0。七、编写多版本文档的实操建议结合上述机制为第三方 API 编写多版本文档时应遵循以下几点每个大版本一个目录目录名使用v1、v2等可读形式版本号写入metadata.versions如1.0.0所有版本目录共享同一name否则 build 会把它们当作互相独立的文档条目确保metadata.languages与metadata.versions都非空否则 build.js 会直接报错拒绝构建正文与版本号保持一致文档标题、示例代码中的版本参数如AcmeClient({ version: v1 })要与 frontmatter 声明的版本对应避免 Agent 拿到 v1 文档却写出 v2 的调用代码把最新版本作为默认build 自动以最高版本为recommendedVersionAgent 不传--version时永远拿到最新文档因此维护者应确保最新版本目录内容更新、准确组合多语言时嵌套语言目录v1/javascript/、v1/python/并在每个DOC.md中各自声明languages与versions。八、可继续深入阅读的仓库路径本文主角文档v1/DOC.md 与同条目的 v2/DOC.md多版本目录规范docs/content-guide.mdbuild 聚合与推荐版本逻辑cli/src/commands/build.js版本解析核心函数cli/src/lib/registry.js--version/--lang命令行入口cli/src/commands/get.js多版本端到端测试cli/test/e2e.test.js真实多语言版本化内容示例content/openai/docs/chat/赞分享【免费下载链接】context-hub项目地址https://gitcode.com/gh_mirrors/co/context-hub点击查看免费下载相关推荐Parabol性能优化如何应对大规模团队并发会议场景Parabol性能优化如何应对大规模团队并发会议场景 Parabol作为一款免费的在线敏捷回顾会议工具在支持大规模团队并发会议时面临着诸多性能挑战。本文将深Context Hubchub完全指南为 Coding Agent 提供可信、可版本化、可自我进化的 API 文档服务Context Hubchub完全指南为 Coding Agent 提供可信、可版本化、可自我进化的 API 文档服务 导读 Context HubCLTypeGraphQL类型文档版本控制多版本API文档管理TypeGraphQL类型文档版本控制多版本API文档管理 随着TypeGraphQL项目的快速迭代多版本API文档的管理成为开发者面临的重要挑战。本文将详后端GraphQLAPI设计创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

WinForm角色权限设计实战:五表RBAC动态菜单与反射窗体实现

WinForm角色权限设计实战:五表RBAC动态菜单与反射窗体实现

简介:这份C# WinForm角色权限菜单源码包,面向需要在Windows桌面应用中实现权限控制的开发者,提供了一套基于角色的动态菜单完整解决方案。核心设计思路是让权限与角色绑定,用户通过分配角色自动获得对应操作权限,从而大…

2026/10/13 12:49:58 阅读更多 →
侯捷 C++ 系列课程与陈硕 Linux 网络编程视频:InterviewGuide 收录的 C++ 求职进阶资源全解析

侯捷 C++ 系列课程与陈硕 Linux 网络编程视频:InterviewGuide 收录的 C++ 求职进阶资源全解析

教程 【免费下载链接】InterviewGuide 🔥🔥「InterviewGuide」是阿秀从校园->职场多年计算机自学过程的记录以及学弟学妹们计算机校招&秋招经验总结文章的汇总,包括但不限于C/C 、Golang、JavaScript、Vue、操作系统、数据结构、计算机…

2026/10/13 12:49:58 阅读更多 →
Forest Pack 7真实感植被布设核心原理与避坑指南

Forest Pack 7真实感植被布设核心原理与避坑指南

简介:本资源是3ds Max用户必备的Forest Pack 7官方帮助文档PDF,面向建筑可视化、游戏场景与影视特效领域的中高级三维设计师,解决大规模自然环境(如森林、草地、岩石群、人群等)高效建模与智能散布的技术难点。文档全面…

2026/10/13 12:49:58 阅读更多 →

最新新闻

机器学习入门四大实战项目:手写数字识别、声呐分类、垃圾短信识别与鸢尾花分类

机器学习入门四大实战项目:手写数字识别、声呐分类、垃圾短信识别与鸢尾花分类

简介:这份资源面向零基础或刚接触机器学习的小白学习者,围绕四个经典入门项目展开:手写数字识别、声呐目标分类、垃圾短信识别与鸢尾花分类,帮助读者在动手实践中理解分类任务的完整流程与常见算法思路。压缩包共13个文件&#xf…

2026/10/13 13:35:16 阅读更多 →
贪吃蛇AI实战:从状态编码到DQN训练,避开绕圈与撞墙的坑

贪吃蛇AI实战:从状态编码到DQN训练,避开绕圈与撞墙的坑

简介:这份资源是一套用 C/C 编写的贪吃蛇游戏人工智能实现,面向对游戏 AI、路径搜索与强化学习感兴趣的开发者与学习者,帮助理解如何让蛇在自动寻路中尽可能吃满整张地图。压缩包共 57 个文件,以 34 个 Python 源码为主&#xff0…

2026/10/13 13:35:16 阅读更多 →
GDAL 2.3.1 Windows预编译包使用指南:环境配置、格式转换与避坑实践

GDAL 2.3.1 Windows预编译包使用指南:环境配置、格式转换与避坑实践

简介:本资源为自行编译的 GDAL 2.3.1 Windows 64 位版本压缩包,面向从事 GIS、遥感影像处理与空间数据转换的开发者及研究人员。GDAL 是支持 GeoTIFF、JPEG、HDF4、HDF5、ECW、MrSID 等多种栅格与矢量格式的开源地理空间库,自行编译便于按需选…

2026/10/13 13:35:16 阅读更多 →
内网自建Git服务实战:CentOS 8 + Apache HTTP协议搭建轻量代码托管

内网自建Git服务实战:CentOS 8 + Apache HTTP协议搭建轻量代码托管

1. 为什么要在内网自建 Git 服务1.1 从一次代码托管迁移说起前段时间帮一个做嵌入式开发的小团队整理代码仓库,他们之前一直把代码放在公共托管平台上,项目本身不涉及什么敏感内容,但问题是每次拉取和推送都要走外网,办公室的网络…

2026/10/13 13:35:16 阅读更多 →
MySQL分区表详解:从原理到实操,一次讲透分区裁剪与选型

MySQL分区表详解:从原理到实操,一次讲透分区裁剪与选型

MySQL 分区表这功能,早年在社区里的评价一直两极分化。一边是"一张大表拆成小表,查询快到飞起"的爽文故事,另一边是"分区表性能还不如普通表、坑多得防不胜防"的劝退帖。两种说法我都见过,自己也踩过不少。做…

2026/10/13 13:35:16 阅读更多 →
数据结构期末试卷拆解:高频考点与手写算法提分策略

数据结构期末试卷拆解:高频考点与手写算法提分策略

简介:湖北大学《数据结构》2022—2023学年第一学期期末试卷(A卷),面向计算机相关专业本科生,适合期末复习、考研自测及教学参考。试卷为闭卷考试,覆盖判断分析题、简答题与应用分析题,重点涉及带…

2026/10/13 13:34:15 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →