Skip to content

Commit c86b891

Browse files
mnriemCopilot
authored andcommitted
docs: Document dual-catalog system for extensions (github#1689)
* docs: Document dual-catalog system for extensions - Clarify distinction between catalog.json (curated) and catalog.community.json (reference) - Update EXTENSION-DEVELOPMENT-GUIDE.md to explain community catalog submission - Update EXTENSION-PUBLISHING-GUIDE.md with dual-catalog workflow - Update EXTENSION-USER-GUIDE.md with catalog selection guidance - Expand README.md with comprehensive catalog explanation - Update RFC-EXTENSION-SYSTEM.md with dual-catalog design and current implementation - Change GitHub references from statsperform to github - Add SPECKIT_CATALOG_URL environment variable documentation This clarifies how organizations can curate their own catalog while browsing community-contributed extensions for discovery. * Update extensions/README.md Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update extensions/README.md Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update extensions/README.md Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
1 parent 4db04be commit c86b891

File tree

5 files changed

+221
-33
lines changed

5 files changed

+221
-33
lines changed

extensions/EXTENSION-DEVELOPMENT-GUIDE.md

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -456,18 +456,20 @@ Users install with:
456456
specify extension add --from https://github.com/.../spec-kit-my-ext-1.0.0.zip
457457
```
458458

459-
### Option 3: Extension Catalog (Future)
459+
### Option 3: Community Reference Catalog
460460

461-
Submit to official catalog:
461+
Submit to the community catalog for public discovery:
462462

463463
1. **Fork** spec-kit repository
464-
2. **Add entry** to `extensions/catalog.json`
465-
3. **Create PR**
466-
4. **After merge**, users can install with:
467-
468-
```bash
469-
specify extension add my-ext # No URL needed!
470-
```
464+
2. **Add entry** to `extensions/catalog.community.json`
465+
3. **Update** `extensions/README.md` with your extension
466+
4. **Create PR** following the [Extension Publishing Guide](EXTENSION-PUBLISHING-GUIDE.md)
467+
5. **After merge**, your extension becomes available:
468+
- Users can browse `catalog.community.json` to discover your extension
469+
- Users copy the entry to their own `catalog.json`
470+
- Users install with: `specify extension add my-ext` (from their catalog)
471+
472+
See the [Extension Publishing Guide](EXTENSION-PUBLISHING-GUIDE.md) for detailed submission instructions.
471473

472474
---
473475

extensions/EXTENSION-PUBLISHING-GUIDE.md

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -129,26 +129,32 @@ specify extension add --from https://github.com/your-org/spec-kit-your-extension
129129

130130
## Submit to Catalog
131131

132+
### Understanding the Catalogs
133+
134+
Spec Kit uses a dual-catalog system. For details about how catalogs work, see the main [Extensions README](README.md#extension-catalogs).
135+
136+
**For extension publishing**: All community extensions should be added to `catalog.community.json`. Users browse this catalog and copy extensions they trust into their own `catalog.json`.
137+
132138
### 1. Fork the spec-kit Repository
133139

134140
```bash
135141
# Fork on GitHub
136-
# https://github.com/statsperform/spec-kit/fork
142+
# https://github.com/github/spec-kit/fork
137143
138144
# Clone your fork
139145
git clone https://github.com/YOUR-USERNAME/spec-kit.git
140146
cd spec-kit
141147
```
142148

143-
### 2. Add Extension to Catalog
149+
### 2. Add Extension to Community Catalog
144150

145-
Edit `extensions/catalog.json` and add your extension:
151+
Edit `extensions/catalog.community.json` and add your extension:
146152

147153
```json
148154
{
149155
"schema_version": "1.0",
150156
"updated_at": "2026-01-28T15:54:00Z",
151-
"catalog_url": "https://raw.githubusercontent.com/statsperform/spec-kit/main/extensions/catalog.json",
157+
"catalog_url": "https://raw.githubusercontent.com/github/spec-kit/main/extensions/catalog.community.json",
152158
"extensions": {
153159
"your-extension": {
154160
"name": "Your Extension Name",
@@ -198,15 +204,25 @@ Edit `extensions/catalog.json` and add your extension:
198204
- Use current timestamp for `created_at` and `updated_at`
199205
- Update the top-level `updated_at` to current time
200206

201-
### 3. Submit Pull Request
207+
### 3. Update Extensions README
208+
209+
Add your extension to the Available Extensions table in `extensions/README.md`:
210+
211+
```markdown
212+
| Your Extension Name | Brief description of what it does | [repo-name](https://github.com/your-org/spec-kit-your-extension) |
213+
```
214+
215+
Insert your extension in alphabetical order in the table.
216+
217+
### 4. Submit Pull Request
202218

203219
```bash
204220
# Create a branch
205221
git checkout -b add-your-extension
206222
207223
# Commit your changes
208-
git add extensions/catalog.json
209-
git commit -m "Add your-extension to catalog
224+
git add extensions/catalog.community.json extensions/README.md
225+
git commit -m "Add your-extension to community catalog
210226
211227
- Extension ID: your-extension
212228
- Version: 1.0.0
@@ -218,7 +234,7 @@ git commit -m "Add your-extension to catalog
218234
git push origin add-your-extension
219235
220236
# Create Pull Request on GitHub
221-
# https://github.com/statsperform/spec-kit/compare
237+
# https://github.com/github/spec-kit/compare
222238
```
223239

224240
**Pull Request Template**:
@@ -243,6 +259,8 @@ Brief description of what your extension does.
243259
- [x] Extension tested on real project
244260
- [x] All commands working
245261
- [x] No security vulnerabilities
262+
- [x] Added to extensions/catalog.community.json
263+
- [x] Added to extensions/README.md Available Extensions table
246264
247265
### Testing
248266
Tested on:

extensions/EXTENSION-USER-GUIDE.md

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -76,13 +76,15 @@ vim .specify/extensions/jira/jira-config.yml
7676

7777
## Finding Extensions
7878

79+
**Note**: By default, `specify extension search` uses your organization's catalog (`catalog.json`). If the catalog is empty, you won't see any results. See [Extension Catalogs](#extension-catalogs) to learn how to populate your catalog from the community reference catalog.
80+
7981
### Browse All Extensions
8082

8183
```bash
8284
specify extension search
8385
```
8486

85-
Shows all available extensions in the catalog.
87+
Shows all extensions in your organization's catalog.
8688

8789
### Search by Keyword
8890

@@ -415,11 +417,15 @@ export SPECKIT_CATALOG_URL="https://example.com/staging/catalog.json"
415417

416418
---
417419

420+
## Extension Catalogs
421+
422+
For information about how Spec Kit's dual-catalog system works (`catalog.json` vs `catalog.community.json`), see the main [Extensions README](README.md#extension-catalogs).
423+
418424
## Organization Catalog Customization
419425

420-
### Why the Default Catalog is Empty
426+
### Why Customize Your Catalog
421427

422-
The default spec-kit catalog ships empty by design. This allows organizations to:
428+
Organizations customize their `catalog.json` to:
423429

424430
- **Control available extensions** - Curate which extensions your team can install
425431
- **Host private extensions** - Internal tools that shouldn't be public

extensions/README.md

Lines changed: 109 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,74 @@
1-
# Spec Kit Community Extensions
1+
# Spec Kit Extensions
22

3-
Community-contributed extensions for [Spec Kit](https://github.com/github/spec-kit).
3+
Extension system for [Spec Kit](https://github.com/github/spec-kit) - add new functionality without bloating the core framework.
44

5-
## Available Extensions
5+
## Extension Catalogs
6+
7+
Spec Kit provides two catalog files with different purposes:
8+
9+
### Your Catalog (`catalog.json`)
10+
11+
- **Purpose**: Default upstream catalog of extensions used by the Spec Kit CLI
12+
- **Default State**: Empty by design in the upstream project - you or your organization populate a fork/copy with extensions you trust
13+
- **Location (upstream)**: `extensions/catalog.json` in the GitHub-hosted spec-kit repo
14+
- **CLI Default**: The `specify extension` commands use the upstream catalog URL by default, unless overridden
15+
- **Org Catalog**: Point `SPECKIT_CATALOG_URL` at your organization's fork or hosted catalog JSON to use it instead of the upstream default
16+
- **Customization**: Copy entries from the community catalog into your org catalog, or add your own extensions directly
17+
18+
**Example override:**
19+
```bash
20+
# Override the default upstream catalog with your organization's catalog
21+
export SPECKIT_CATALOG_URL="https://your-org.com/spec-kit/catalog.json"
22+
specify extension search # Now uses your organization's catalog instead of the upstream default
23+
```
24+
25+
### Community Reference Catalog (`catalog.community.json`)
26+
27+
- **Purpose**: Browse available community-contributed extensions
28+
- **Status**: Active - contains extensions submitted by the community
29+
- **Location**: `extensions/catalog.community.json`
30+
- **Usage**: Reference catalog for discovering available extensions
31+
- **Submission**: Open to community contributions via Pull Request
32+
33+
**How It Works:**
34+
35+
## Making Extensions Available
36+
37+
You control which extensions your team can discover and install:
38+
39+
### Option 1: Curated Catalog (Recommended for Organizations)
40+
41+
Populate your `catalog.json` with approved extensions:
42+
43+
1. **Discover** extensions from various sources:
44+
- Browse `catalog.community.json` for community extensions
45+
- Find private/internal extensions in your organization's repos
46+
- Discover extensions from trusted third parties
47+
2. **Review** extensions and choose which ones you want to make available
48+
3. **Add** those extension entries to your own `catalog.json`
49+
4. **Team members** can now discover and install them:
50+
- `specify extension search` shows your curated catalog
51+
- `specify extension add <name>` installs from your catalog
52+
53+
**Benefits**: Full control over available extensions, team consistency, organizational approval workflow
54+
55+
**Example**: Copy an entry from `catalog.community.json` to your `catalog.json`, then your team can discover and install it by name.
56+
57+
### Option 2: Direct URLs (For Ad-hoc Use)
58+
59+
Skip catalog curation - team members install directly using URLs:
60+
61+
```bash
62+
specify extension add --from https://github.com/org/spec-kit-ext/archive/refs/tags/v1.0.0.zip
63+
```
64+
65+
**Benefits**: Quick for one-off testing or private extensions
66+
67+
**Tradeoff**: Extensions installed this way won't appear in `specify extension search` for other team members unless you also add them to your `catalog.json`.
68+
69+
## Available Community Extensions
70+
71+
The following community-contributed extensions are available in [`catalog.community.json`](catalog.community.json):
672

773
| Extension | Purpose | URL |
874
|-----------|---------|-----|
@@ -11,4 +77,43 @@ Community-contributed extensions for [Spec Kit](https://github.com/github/spec-k
1177

1278
## Adding Your Extension
1379

14-
See the [Extension Publishing Guide](EXTENSION-PUBLISHING-GUIDE.md) for instructions on how to submit your extension to the community catalog.
80+
### Submission Process
81+
82+
To add your extension to the community catalog:
83+
84+
1. **Prepare your extension** following the [Extension Development Guide](EXTENSION-DEVELOPMENT-GUIDE.md)
85+
2. **Create a GitHub release** for your extension
86+
3. **Submit a Pull Request** that:
87+
- Adds your extension to `extensions/catalog.community.json`
88+
- Updates this README with your extension in the Available Extensions table
89+
4. **Wait for review** - maintainers will review and merge if criteria are met
90+
91+
See the [Extension Publishing Guide](EXTENSION-PUBLISHING-GUIDE.md) for detailed step-by-step instructions.
92+
93+
### Submission Checklist
94+
95+
Before submitting, ensure:
96+
97+
- ✅ Valid `extension.yml` manifest
98+
- ✅ Complete README with installation and usage instructions
99+
- ✅ LICENSE file included
100+
- ✅ GitHub release created with semantic version (e.g., v1.0.0)
101+
- ✅ Extension tested on a real project
102+
- ✅ All commands working as documented
103+
104+
## Installing Extensions
105+
Once extensions are available (either in your catalog or via direct URL), install them:
106+
107+
```bash
108+
# From your curated catalog (by name)
109+
specify extension search # See what's in your catalog
110+
specify extension add <extension-name> # Install by name
111+
112+
# Direct from URL (bypasses catalog)
113+
specify extension add --from https://github.com/<org>/<repo>/archive/refs/tags/<version>.zip
114+
115+
# List installed extensions
116+
specify extension list
117+
```
118+
119+
For more information, see the [Extension User Guide](EXTENSION-USER-GUIDE.md).

extensions/RFC-EXTENSION-SYSTEM.md

Lines changed: 66 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -858,11 +858,41 @@ def should_execute_hook(hook: dict, config: dict) -> bool:
858858

859859
## Extension Discovery & Catalog
860860

861-
### Central Catalog
861+
### Dual Catalog System
862+
863+
Spec Kit uses two catalog files with different purposes:
864+
865+
#### User Catalog (`catalog.json`)
862866

863867
**URL**: `https://raw.githubusercontent.com/github/spec-kit/main/extensions/catalog.json`
864868

865-
**Format**:
869+
- **Purpose**: Organization's curated catalog of approved extensions
870+
- **Default State**: Empty by design - users populate with extensions they trust
871+
- **Usage**: Default catalog used by `specify extension` CLI commands
872+
- **Control**: Organizations maintain their own fork/version for their teams
873+
874+
#### Community Reference Catalog (`catalog.community.json`)
875+
876+
**URL**: `https://raw.githubusercontent.com/github/spec-kit/main/extensions/catalog.community.json`
877+
878+
- **Purpose**: Reference catalog of available community-contributed extensions
879+
- **Verification**: Community extensions may have `verified: false` initially
880+
- **Status**: Active - open for community contributions
881+
- **Submission**: Via Pull Request following the Extension Publishing Guide
882+
- **Usage**: Browse to discover extensions, then copy to your `catalog.json`
883+
884+
**How It Works:**
885+
886+
1. **Discover**: Browse `catalog.community.json` to find available extensions
887+
2. **Review**: Evaluate extensions for security, quality, and organizational fit
888+
3. **Curate**: Copy approved extension entries from community catalog to your `catalog.json`
889+
4. **Install**: Use `specify extension add <name>` (pulls from your curated catalog)
890+
891+
This approach gives organizations full control over which extensions are available to their teams while maintaining a shared community resource for discovery.
892+
893+
### Catalog Format
894+
895+
**Format** (same for both catalogs):
866896

867897
```json
868898
{
@@ -931,25 +961,52 @@ specify extension info jira
931961

932962
### Custom Catalogs
933963

934-
Organizations can host private catalogs:
964+
**⚠️ FUTURE FEATURE - NOT YET IMPLEMENTED**
965+
966+
The following catalog management commands are proposed design concepts but are not yet available in the current implementation:
935967

936968
```bash
937-
# Add custom catalog
969+
# Add custom catalog (FUTURE - NOT AVAILABLE)
938970
specify extension add-catalog https://internal.company.com/spec-kit/catalog.json
939971
940-
# Set as default
972+
# Set as default (FUTURE - NOT AVAILABLE)
941973
specify extension set-catalog --default https://internal.company.com/spec-kit/catalog.json
942974
943-
# List catalogs
975+
# List catalogs (FUTURE - NOT AVAILABLE)
944976
specify extension catalogs
945977
```
946978

947-
**Catalog priority**:
979+
**Proposed catalog priority** (future design):
948980

949-
1. Project-specific catalog (`.specify/extension-catalogs.yml`)
950-
2. User-level catalog (`~/.specify/extension-catalogs.yml`)
981+
1. Project-specific catalog (`.specify/extension-catalogs.yml`) - *not implemented*
982+
2. User-level catalog (`~/.specify/extension-catalogs.yml`) - *not implemented*
951983
3. Default GitHub catalog
952984

985+
#### Current Implementation: SPECKIT_CATALOG_URL
986+
987+
**The currently available method** for using custom catalogs is the `SPECKIT_CATALOG_URL` environment variable:
988+
989+
```bash
990+
# Point to your organization's catalog
991+
export SPECKIT_CATALOG_URL="https://internal.company.com/spec-kit/catalog.json"
992+
993+
# All extension commands now use your custom catalog
994+
specify extension search # Uses custom catalog
995+
specify extension add jira # Installs from custom catalog
996+
```
997+
998+
**Requirements:**
999+
- URL must use HTTPS (HTTP only allowed for localhost testing)
1000+
- Catalog must follow the standard catalog.json schema
1001+
- Must be publicly accessible or accessible within your network
1002+
1003+
**Example for testing:**
1004+
```bash
1005+
# Test with localhost during development
1006+
export SPECKIT_CATALOG_URL="http://localhost:8000/catalog.json"
1007+
specify extension search
1008+
```
1009+
9531010
---
9541011

9551012
## CLI Commands

0 commit comments

Comments
 (0)