-
Notifications
You must be signed in to change notification settings - Fork 7.6k
feat: Integration catalog — discovery, versioning, and community distribution #2130
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Open
Copilot
wants to merge
2
commits into
main
Choose a base branch
from
copilot/add-integration-catalog
base: main
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Open
Changes from all commits
Commits
Show all changes
2 commits
Select commit
Hold shift + click to select a range
File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,135 @@ | ||
| # Contributing to the Integration Catalog | ||
|
|
||
| This guide covers adding integrations to both the **built-in** and **community** catalogs. | ||
|
|
||
| ## Adding a Built-In Integration | ||
|
|
||
| Built-in integrations are maintained by the Spec Kit core team and ship with the CLI. | ||
|
|
||
| ### Checklist | ||
|
|
||
| 1. **Create the integration subpackage** under `src/specify_cli/integrations/<name>/` | ||
| 2. **Implement the integration class** extending `MarkdownIntegration`, `TomlIntegration`, or `SkillsIntegration` | ||
| 3. **Register the integration** in `src/specify_cli/integrations/__init__.py` | ||
| 4. **Add tests** under `tests/integrations/test_integration_<name>.py` | ||
| 5. **Add a catalog entry** in `integrations/catalog.json` | ||
| 6. **Update documentation** in `AGENTS.md` and `README.md` | ||
|
|
||
| ### Catalog Entry Format | ||
|
|
||
| Add your integration to `integrations/catalog.json`: | ||
|
|
||
| ```json | ||
| { | ||
| "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"] | ||
| } | ||
| } | ||
| ``` | ||
|
|
||
| ## Adding a Community Integration | ||
|
|
||
| Community integrations are contributed by external developers and listed in `integrations/catalog.community.json` for discovery. | ||
|
|
||
| ### Prerequisites | ||
|
|
||
| 1. **Working integration** — tested with `specify integration install` | ||
| 2. **Public repository** — hosted on GitHub or similar | ||
| 3. **`integration.yml` descriptor** — valid descriptor file (see below) | ||
| 4. **Documentation** — README with usage instructions | ||
| 5. **License** — open source license file | ||
|
|
||
| ### `integration.yml` Descriptor | ||
|
|
||
| Every community integration must include an `integration.yml`: | ||
|
|
||
| ```yaml | ||
| 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 | ||
| ``` | ||
|
|
||
| ### Descriptor Validation Rules | ||
|
|
||
| | Field | Rule | | ||
| |-------|------| | ||
| | `schema_version` | Must be `"1.0"` | | ||
| | `integration.id` | Lowercase alphanumeric + hyphens (`^[a-z0-9-]+$`) | | ||
| | `integration.version` | Valid semantic version | | ||
| | `requires.speckit_version` | PEP 440 version specifier | | ||
| | `provides` | Must include at least one command or script | | ||
| | `provides.commands[].name` | String identifier | | ||
| | `provides.commands[].file` | Relative path to template file | | ||
|
|
||
| ### Submitting to the Community Catalog | ||
|
|
||
| 1. **Fork** the [spec-kit repository](https://github.com/github/spec-kit) | ||
| 2. **Add your entry** to `integrations/catalog.community.json`: | ||
|
|
||
| ```json | ||
| { | ||
| "my-agent": { | ||
| "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", | ||
| "tags": ["cli"] | ||
| } | ||
| } | ||
| ``` | ||
|
|
||
| 3. **Open a pull request** with: | ||
| - Your catalog entry | ||
| - Link to your integration repository | ||
| - Confirmation that `integration.yml` is valid | ||
|
|
||
| ### Version Updates | ||
|
|
||
| To update your integration version in the catalog: | ||
|
|
||
| 1. Release a new version of your integration | ||
| 2. Open a PR updating the `version` field in `catalog.community.json` | ||
| 3. Ensure backward compatibility or document breaking changes | ||
|
|
||
| ## Upgrade Workflow | ||
|
|
||
| The `specify integration upgrade` command supports diff-aware upgrades: | ||
|
|
||
| 1. **Hash comparison** — the manifest records SHA-256 hashes of all installed files | ||
| 2. **Modified file detection** — files changed since installation are flagged | ||
| 3. **Safe default** — modified files are preserved unless `--force` is used | ||
| 4. **Clean reinstall** — unmodified files are replaced with the latest version | ||
|
|
||
| ```bash | ||
| # Upgrade current integration (blocks if files are modified) | ||
| specify integration upgrade | ||
|
|
||
| # Force upgrade (overwrites modified files) | ||
| specify integration upgrade --force | ||
| ``` | ||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,110 @@ | ||
| # Spec Kit Integration Catalog | ||
|
|
||
| The integration catalog enables discovery, versioning, and distribution of AI agent integrations for Spec Kit. | ||
|
|
||
| ## Catalog Files | ||
|
|
||
| ### Built-In Catalog (`catalog.json`) | ||
|
|
||
| Contains integrations that ship with Spec Kit. These are maintained by the core team and always installable. | ||
|
|
||
| ### Community Catalog (`catalog.community.json`) | ||
|
|
||
| Community-contributed integrations. Listed for discovery only — users install from the source repositories. | ||
|
|
||
| ## CLI Commands | ||
|
|
||
| ```bash | ||
| # List built-in integrations (default) | ||
| specify integration list | ||
|
|
||
| # Browse full catalog (built-in + community) | ||
| specify integration list --catalog | ||
|
|
||
| # Install an integration | ||
| specify integration install copilot | ||
|
|
||
| # Upgrade the current integration (diff-aware) | ||
| specify integration upgrade | ||
|
|
||
| # Upgrade with force (overwrite modified files) | ||
| specify integration upgrade --force | ||
| ``` | ||
|
|
||
| ## Integration Descriptor (`integration.yml`) | ||
|
|
||
| Each integration can include an `integration.yml` descriptor that documents its metadata, requirements, and provided commands/scripts: | ||
|
|
||
| ```yaml | ||
| schema_version: "1.0" | ||
| integration: | ||
| id: "my-agent" | ||
| name: "My Agent" | ||
| version: "1.0.0" | ||
| description: "Integration for My Agent" | ||
| author: "my-org" | ||
| repository: "https://github.com/my-org/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" | ||
| - name: "speckit.plan" | ||
| file: "templates/speckit.plan.md" | ||
| scripts: | ||
| - update-context.sh | ||
| - update-context.ps1 | ||
| ``` | ||
|
|
||
| ## Catalog Schema | ||
|
|
||
| Both catalog files follow the same JSON schema: | ||
|
|
||
| ```json | ||
| { | ||
| "schema_version": "1.0", | ||
| "updated_at": "2026-04-08T00:00:00Z", | ||
| "catalog_url": "https://...", | ||
| "integrations": { | ||
| "my-agent": { | ||
| "id": "my-agent", | ||
| "name": "My Agent", | ||
| "version": "1.0.0", | ||
| "description": "Integration for My Agent", | ||
| "author": "my-org", | ||
| "repository": "https://github.com/my-org/speckit-my-agent", | ||
| "tags": ["cli"] | ||
| } | ||
| } | ||
| } | ||
| ``` | ||
|
|
||
| ### Required Fields | ||
|
|
||
| | Field | Type | Description | | ||
| |-------|------|-------------| | ||
| | `schema_version` | string | Must be `"1.0"` | | ||
| | `updated_at` | string | ISO 8601 timestamp | | ||
| | `integrations` | object | Map of integration ID → metadata | | ||
|
|
||
| ### Integration Entry Fields | ||
|
|
||
| | Field | Type | Required | Description | | ||
| |-------|------|----------|-------------| | ||
| | `id` | string | Yes | Unique ID (lowercase alphanumeric + hyphens) | | ||
| | `name` | string | Yes | Human-readable display name | | ||
| | `version` | string | Yes | Semantic version | | ||
| | `description` | string | Yes | One-line description | | ||
| | `author` | string | No | Author name or organization | | ||
| | `repository` | string | No | Source repository URL | | ||
| | `tags` | array | No | Searchable tags (e.g., `["cli", "ide"]`) | | ||
|
|
||
| ## Contributing | ||
|
|
||
| See [CONTRIBUTING.md](CONTRIBUTING.md) for how to add integrations to the community catalog. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,6 @@ | ||
| { | ||
| "schema_version": "1.0", | ||
| "updated_at": "2026-04-08T00:00:00Z", | ||
| "catalog_url": "https://raw.githubusercontent.com/github/spec-kit/main/integrations/catalog.community.json", | ||
| "integrations": {} | ||
| } |
Oops, something went wrong.
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The upgrade workflow documentation is internally inconsistent: it says modified files are "preserved unless
--forceis used" but the example directly below says upgrade "blocks if files are modified" (and the tests/code implement blocking). Align this section with the actual behavior.