Spec Kit 集成目录开发指南:从内置集成到社区目录的完整贡献流程
本篇基于 Spec Kit 仓库的 集成目录贡献指南,系统讲解如何将 AI Agent 集成(如 Copilot、Claude Code、Gemini CLI 等)贡献到 Spec Kit 的内置目录或社区目录。读完本文,你将掌握两类集成各自的落地清单、catalog.json 目录条目格式、integration.yml 描述文件的字段规范与校验规则,以及 specify integration upgrade 的 diff 感知升级机制在源码中的实际实现。
集成生态的两种形态:内置集成与社区集成
Spec Kit 通过 specify integration 子命令族将 Spec-Driven 开发的命令模板分发到不同 AI 助手。贡献指南明确区分了两条路径(见 integrations/CONTRIBUTING.md):
- 内置集成(Built-In):由 Spec Kit 核心团队维护,随 CLI 一起发布,用户开箱即装;
- 社区集成(Community):由外部开发者贡献,登记在 integrations/catalog.community.json 中供发现,用户从集成自身的源仓库安装。
从源码结构看,内置集成全部注册在 INTEGRATION_REGISTRY 这个全局字典中。_register() 函数在注册时做了两道防线:空 key 抛 ValueError、重复 key 抛 KeyError(注册实现)。_register_builtins() 目前按字母序导入了 39 个集成模块并逐一注册,覆盖 agy、claude、copilot、gemini、cursor_agent、kiro_cli 等主流工具。
一个值得注意的命名约定:用户面向的集成 key 保留连字符(如 cursor-agent、kiro-cli,与实际 CLI 工具/二进制名一致),而包目录必须使用 Python 合法的包名——即连字符替换为下划线(cursor-agent → cursor_agent/,kiro-cli → kiro_cli/)。该约定在 init.py 的文档字符串 中有明确说明。
新增内置集成的六步清单
贡献指南给出的内置集成落地清单如下,每一步都能在当前仓库中找到对应落点:
- 创建集成的子包:位于
src/specify_cli/integrations/<package_dir>/。<package_dir>在无连字符时与集成 key 一致(如gemini),有连字符时将连字符替换为下划线(如 keycursor-agent→ 目录cursor_agent/)——因为 Python 包名不允许连字符; - 实现集成类:继承
MarkdownIntegration、TomlIntegration或SkillsIntegration三者之一; - 注册集成:在
src/specify_cli/integrations/__init__.py中导入并调用_register(...); - 添加测试:位于
tests/integrations/test_integration_<package_dir>.py(仓库中已有如 test_integration_claude.py、test_integration_gemini.py 等 30 余个同构测试文件可参照); - 添加目录条目:写入 integrations/catalog.json;
- 更新文档:同步修改
AGENTS.md与README.md。
三种基类分别对应哪种安装形态
base.py 的模块文档说明了三种基类的定位:
| 基类 | 适用形态 | 说明 |
|---|---|---|
MarkdownIntegration |
标准 Markdown 命令格式 | 最常见情况,子类只需设置三个类属性即可 |
TomlIntegration |
TOML 命令格式 | 适用于 Gemini、Tabnine 等以 TOML 存储命令的 Agent |
SkillsIntegration |
以 Agent Skill 形式安装命令 | 采用 speckit-<name>/SKILL.md 布局 |
base.py 还定义了 IntegrationOption 数据类,用于声明集成接受的 --integration-options 选项(如 --commands-dir、布尔标志 --skills),包括 is_flag、required、default、help 等字段。此外,base.py 中维护了 _CORE_COMMAND_TEMPLATE_ORDER 常量,规定了核心命令模板(analyze、clarify、constitution、implement、converge、plan、checklist、specify、tasks、taskstoissues)的安装排序——新增内置集成时,其命令安装行为会自动对齐这一顺序。
catalog.json 条目格式
内置目录条目添加在 integrations/catalog.json 顶层 integrations 键下,标准格式如下:
{
"schema_version": "1.0",
"integrations": {
"my-agent": {
"id": "my-agent",
"name": "My Agent",
"version": "1.0.0",
"description": "Integration for My Agent",
"author": "spec-kit-core",
"repository": "https://github.com/github/spec-kit",
"tags": ["cli"]
}
}
}
对照真实仓库中的 catalog.json,各字段取值有明确模式:核心团队维护的条目 author 统一为 spec-kit-core,repository 指向 spec-kit 仓库本体;tags 用于标注集成类别,例如 Claude Code 是 ["cli", "anthropic"]、Cline 是 ["ide"]、Droid 是 ["cli", "skills", "factory"]。顶层还包含 updated_at(ISO 8601 时间戳)与 catalog_url 元数据字段,如 integrations/README.md 的 Schema 一节所列。
新增社区集成的前置条件
社区集成由外部开发者贡献,指南列出了五项前置条件:
- 可用的集成 —— 已通过
specify integration install实测; - 公开仓库 —— 托管在 GitHub 或同类平台;
integration.yml描述文件 —— 格式有效的描述符(下文详述);- 文档 —— 含使用说明的 README;
- 开源许可证文件。
integration.yml 描述文件
每个社区集成必须包含 integration.yml,完整示例如下:
schema_version: "1.0"
integration:
id: "my-agent"
name: "My Agent"
version: "1.0.0"
description: "Integration for My Agent"
author: "your-name"
repository: "https://github.com/your-name/speckit-my-agent"
license: "MIT"
requires:
speckit_version: ">=0.6.0"
tools:
- name: "my-agent"
version: ">=1.0.0"
required: true
provides:
commands:
- name: "speckit.specify"
file: "templates/speckit.specify.md"
scripts:
- update-context.sh
描述文件校验规则
| 字段 | 规则 |
|---|---|
schema_version |
必须为 "1.0" |
integration.id |
小写字母数字 + 连字符(^[a-z0-9-]+$) |
integration.version |
合法 PEP 440 版本(用 packaging.version.Version() 解析) |
requires.speckit_version |
必填字段;需给出 >=0.6.0 之类的版本约束(当前校验仅检查其存在且非空) |
provides |
至少包含一个命令或脚本 |
provides.commands[].name |
字符串标识符 |
provides.commands[].file |
指向模板文件的相对路径 |
这些规则并非纸面约定,而是有真实的源码实现。catalog.py 中的 _validate() 方法 逐条执行上述校验:
schema_version不等于1.0时抛出 "Unsupported schema version" 错误(L722-L726);integration下的id、name、version、description四个字段缺一不可且必须为字符串(L728-L741);id不匹配正则^[a-z0-9-]+$时报 "must be lowercase alphanumeric with hyphens only"(L743-L747);version通过pkg_version.Version()解析,失败即视为非法 PEP 440 版本(L749-L754);requires.speckit_version缺失或为空字符串直接报错(L761-L768),印证了贡献指南中"当前校验仅检查存在性"的说明;provides中commands与scripts全空时报 "Integration must provide at least one command or script"(L801-L804);每个 command 条目必须同时带非空的name与file。
另外,catalog.py 还实现了描述文件内容的 SHA-256 指纹(get_hash 方法 返回 sha256:<hexdigest> 格式),用于后续比对描述文件是否变更。
提交到社区目录的流程
- Fork spec-kit 仓库;
- 在 integrations/catalog.community.json 的
integrations键下添加你的条目(格式与内置目录一致,author填个人/组织名,repository指向你的集成仓库); - 提交 Pull Request,内容需包含:你的目录条目、集成仓库链接、以及
integration.yml有效性确认。
版本更新
当你需要更新集成版本时:
- 发布集成的新版本;
- 提交 PR 更新
catalog.community.json中对应条目的version字段; - 保证向后兼容,或明确记录破坏性变更。
Upgrade 工作流:diff 感知升级的源码剖析
贡献指南的最后一节描述了 specify integration upgrade 的四个机制:
- 哈希比对 —— manifest 记录所有已安装文件的 SHA-256 哈希;
- 修改文件检测 —— 自安装以来被修改的文件会被标记;
- 安全默认 —— 只要有任何已安装文件被修改,升级即被阻断;
- 强制重装 —— 传入
--force才会用最新版本覆盖被修改的文件。
# 升级当前集成(若文件被修改则阻断)
specify integration upgrade
# 强制升级(覆盖被修改的文件)
specify integration upgrade --force
源码层面的对应实现非常清晰。哈希基础设施位于 manifest.py:模块文档明确指出"卸载时只删除哈希仍匹配的文件",IntegrationManifest 内部维护 rel_path → sha256 hex 的映射(L129),安装时逐个记录文件内容哈希(L162),check_modified() 则对每个已记录文件重新计算 SHA-256 并与期望值比对(L300-L313)。
CLI 命令本体是 _migrate_commands.py 中的 integration_upgrade。其执行链为:
- 解析目标 key:参数缺省时取当前已安装集成;未安装或 key 不在已安装列表中则直接报错退出(L604-L617);
- 从
.specify/integrations/<key>.manifest.json加载 manifest,manifest 不存在时提示改为执行specify integration install <key>(L619-L623); - 调用
old_manifest.check_modified()检测修改文件;若存在修改且未传--force,逐行列出被修改文件并提示"Use --force to overwrite modified files, or resolve manually",然后以非零码退出(L631-L638); - 未阻断时继续按脚本类型(
--script sh/ps/py)与--integration-options重建安装参数完成重装。
同文件的 uninstall 命令也复用了同一套哈希保护逻辑——默认保留被修改的文件,仅在 --force 下才删除它们(_install_commands.py L220-L326),即"安全默认"策略贯穿了安装、升级、卸载的完整生命周期。
贡献前检查清单
综合本文各节,提交集成 PR 前可以按以下顺序自检:
- 内置集成:子包目录名与 key 的连字符/下划线转换正确;集成类继承了三种基类之一且三个类属性已设置;
_register调用已加入__init__.py;tests/integrations/下存在同构测试;catalog.json 条目字段齐全(id/name/version/description/author/repository/tags);AGENTS.md与README.md已同步更新。 - 社区集成:集成可通过
specify integration install实测;integration.yml能通过 catalog.py 的校验逻辑(schema_version为"1.0"、id 符合^[a-z0-9-]+$、version 符合 PEP 440、requires.speckit_version非空、provides至少含一个命令或脚本);catalog.community.json 条目已添加;README 与许可证齐备。 - 版本更新:确认新版本向后兼容,或在 PR 中明确记录破坏性变更,并知晓
upgrade --force是用户覆盖本地修改的唯一途径。
以上流程均基于当前仓库的实际代码与文档,适用前提是使用支持 specify integration 命令族的 Spec Kit CLI 版本;目录 Schema 当前固定为 schema_version "1.0"。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0622
Hy4-previewHy4 preview 是由腾讯混元团队研发的新一代混合专家(MoE)旗舰模型。模型总参数量 770B,每个 token 激活 49B,主干共包含78层,第一层采用标准 FFN,其余 77 层均为 MoE 结构,每层包含 256 个路由专家与 1 个共享专家,每个 token 激活 top-8 路由专家及共享专家。主干之外原生内置 1 层 MTP(总参数量 10B,激活 0.7B)以支持投机解码。Python00
GLM-5.3GLM-5.3 与 GLM-5.2 使用相同的基座模型——所有提升均来自后训练。与 GLM-5.2 相比,它在复杂编程和长程任务上的表现显著提升。Jinja00
GLM-5.3-FlashGLM-5.3-Flash (320B-A18B),是GLM-5系列的首个原生多模态模型。320B总参数,能力超过GLM-5.2Jinja00
Spark-X2.5-4BSpark-X2.5-4B 旨在让强大的 AI 更实用、更高效、更易获得。在广泛日常任务中表现强劲,涵盖对话、写作、翻译、推理、编码、工具调用以及智能体工作流,并在同等规模的开源模型中取得领先成绩。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00
Spark-X2.5-1.7BSpark-X2.5-1.7B 旨在让强大的 AI 更加实用、高效且易于获取。这些模型在广泛的日常任务中表现出色,涵盖对话、写作、翻译、推理、编程、工具调用和智能体工作流,并在同等规模的开源模型中取得领先结果。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00