mirror of
https://github.com/github/spec-kit.git
synced 2026-03-17 02:43:08 +00:00
* Initial plan * feat(extensions): implement multi-catalog stack support - Add CatalogEntry dataclass to represent catalog entries - Add get_active_catalogs() reading SPECKIT_CATALOG_URL, project config, user config, or built-in default stack (org-approved + community) - Add _load_catalog_config() to parse .specify/extension-catalogs.yml - Add _validate_catalog_url() HTTPS validation helper - Add _fetch_single_catalog() with per-URL caching, backward-compat for DEFAULT_CATALOG_URL - Add _get_merged_extensions() that merges all catalogs (priority wins on conflict) - Update search() and get_extension_info() to use merged results annotated with _catalog_name and _install_allowed - Update clear_cache() to also remove per-URL hash cache files - Add extension_catalogs CLI command to list active catalogs - Add catalog add/remove sub-commands for .specify/extension-catalogs.yml - Update extension_add to enforce install_allowed=false policy - Update extension_search to show source catalog per result - Update extension_info to show source catalog with install_allowed status - Add 13 new tests covering catalog stack, merge conflict resolution, install_allowed enforcement, and catalog metadata Co-authored-by: mnriem <15701806+mnriem@users.noreply.github.com> * docs: update RFC, user guide, and API reference for multi-catalog support - RFC: replace FUTURE FEATURE section with full implementation docs, add catalog stack resolution order, config file examples, merge conflict resolution, and install_allowed behavior - EXTENSION-USER-GUIDE.md: add multi-catalog section with CLI examples for catalogs/catalog-add/catalog-remove, update catalog config docs - EXTENSION-API-REFERENCE.md: add CatalogEntry class docs, update ExtensionCatalog docs with new methods and result annotations, add catalog CLI commands (catalogs, catalog add, catalog remove) Also fix extension_catalogs command to correctly show "Using built-in default catalog stack" when config file exists but has empty catalogs Co-authored-by: mnriem <15701806+mnriem@users.noreply.github.com> * Potential fix for pull request finding 'Empty except' Co-authored-by: Copilot Autofix powered by AI <223894421+github-code-quality[bot]@users.noreply.github.com> * fix: remove extraneous f-string prefixes (ruff F541) Remove f-prefix from strings with no placeholders in catalog_remove and extension_search commands. Co-authored-by: mnriem <15701806+mnriem@users.noreply.github.com> * fix: address PR review feedback for multi-catalog support - Rename 'org-approved' catalog to 'default' - Move 'catalogs' command to 'catalog list' for consistency - Add 'description' field to CatalogEntry dataclass - Add --description option to 'catalog add' CLI command - Align install_allowed default to False in _load_catalog_config - Add user-level config detection in catalog list footer - Fix _load_catalog_config docstring (document ValidationError) - Fix test isolation for test_search_by_tag, test_search_by_query, test_search_verified_only, test_get_extension_info - Update version to 0.1.14 and CHANGELOG - Update all docs (RFC, User Guide, API Reference) * fix: wrap _load_catalog_config() calls in catalog_list with try/except - Check SPECKIT_CATALOG_URL first (matching get_active_catalogs() resolution order) - Wrap both _load_catalog_config() calls in try/except ValidationError so a malformed config file cannot crash `specify extension catalog list` after the active catalogs have already been printed successfully Co-authored-by: mnriem <15701806+mnriem@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: mnriem <15701806+mnriem@users.noreply.github.com> Co-authored-by: Copilot Autofix powered by AI <223894421+github-code-quality[bot]@users.noreply.github.com>
971 lines
22 KiB
Markdown
971 lines
22 KiB
Markdown
# Extension User Guide
|
|
|
|
Complete guide for using Spec Kit extensions to enhance your workflow.
|
|
|
|
## Table of Contents
|
|
|
|
1. [Introduction](#introduction)
|
|
2. [Getting Started](#getting-started)
|
|
3. [Finding Extensions](#finding-extensions)
|
|
4. [Installing Extensions](#installing-extensions)
|
|
5. [Using Extensions](#using-extensions)
|
|
6. [Managing Extensions](#managing-extensions)
|
|
7. [Configuration](#configuration)
|
|
8. [Troubleshooting](#troubleshooting)
|
|
9. [Best Practices](#best-practices)
|
|
|
|
---
|
|
|
|
## Introduction
|
|
|
|
### What are Extensions?
|
|
|
|
Extensions are modular packages that add new commands and functionality to Spec Kit without bloating the core framework. They allow you to:
|
|
|
|
- **Integrate** with external tools (Jira, Linear, GitHub, etc.)
|
|
- **Automate** repetitive tasks with hooks
|
|
- **Customize** workflows for your team
|
|
- **Share** solutions across projects
|
|
|
|
### Why Use Extensions?
|
|
|
|
- **Clean Core**: Keeps spec-kit lightweight and focused
|
|
- **Optional Features**: Only install what you need
|
|
- **Community Driven**: Anyone can create and share extensions
|
|
- **Version Controlled**: Extensions are versioned independently
|
|
|
|
---
|
|
|
|
## Getting Started
|
|
|
|
### Prerequisites
|
|
|
|
- Spec Kit version 0.1.0 or higher
|
|
- A spec-kit project (directory with `.specify/` folder)
|
|
|
|
### Check Your Version
|
|
|
|
```bash
|
|
specify version
|
|
# Should show 0.1.0 or higher
|
|
```
|
|
|
|
### First Extension
|
|
|
|
Let's install the Jira extension as an example:
|
|
|
|
```bash
|
|
# 1. Search for the extension
|
|
specify extension search jira
|
|
|
|
# 2. Get detailed information
|
|
specify extension info jira
|
|
|
|
# 3. Install it
|
|
specify extension add jira
|
|
|
|
# 4. Configure it
|
|
vim .specify/extensions/jira/jira-config.yml
|
|
|
|
# 5. Use it
|
|
# (Commands are now available in Claude Code)
|
|
/speckit.jira.specstoissues
|
|
```
|
|
|
|
---
|
|
|
|
## Finding Extensions
|
|
|
|
`specify extension search` searches **all active catalogs** simultaneously, including the community catalog by default. Results are annotated with their source catalog and install status.
|
|
|
|
### Browse All Extensions
|
|
|
|
```bash
|
|
specify extension search
|
|
```
|
|
|
|
Shows all extensions across all active catalogs (default and community by default).
|
|
|
|
### Search by Keyword
|
|
|
|
```bash
|
|
# Search for "jira"
|
|
specify extension search jira
|
|
|
|
# Search for "issue tracking"
|
|
specify extension search issue
|
|
```
|
|
|
|
### Filter by Tag
|
|
|
|
```bash
|
|
# Find all issue-tracking extensions
|
|
specify extension search --tag issue-tracking
|
|
|
|
# Find all Atlassian tools
|
|
specify extension search --tag atlassian
|
|
```
|
|
|
|
### Filter by Author
|
|
|
|
```bash
|
|
# Extensions by Stats Perform
|
|
specify extension search --author "Stats Perform"
|
|
```
|
|
|
|
### Show Verified Only
|
|
|
|
```bash
|
|
# Only show verified extensions
|
|
specify extension search --verified
|
|
```
|
|
|
|
### Get Extension Details
|
|
|
|
```bash
|
|
# Detailed information
|
|
specify extension info jira
|
|
```
|
|
|
|
Shows:
|
|
|
|
- Description
|
|
- Requirements
|
|
- Commands provided
|
|
- Hooks available
|
|
- Links (documentation, repository, changelog)
|
|
- Installation status
|
|
|
|
---
|
|
|
|
## Installing Extensions
|
|
|
|
### Install from Catalog
|
|
|
|
```bash
|
|
# By name (from catalog)
|
|
specify extension add jira
|
|
```
|
|
|
|
This will:
|
|
|
|
1. Download the extension from GitHub
|
|
2. Validate the manifest
|
|
3. Check compatibility with your spec-kit version
|
|
4. Install to `.specify/extensions/jira/`
|
|
5. Register commands with your AI agent
|
|
6. Create config template
|
|
|
|
### Install from URL
|
|
|
|
```bash
|
|
# From GitHub release
|
|
specify extension add --from https://github.com/org/spec-kit-ext/archive/refs/tags/v1.0.0.zip
|
|
```
|
|
|
|
### Install from Local Directory (Development)
|
|
|
|
```bash
|
|
# For testing or development
|
|
specify extension add --dev /path/to/extension
|
|
```
|
|
|
|
### Installation Output
|
|
|
|
```text
|
|
✓ Extension installed successfully!
|
|
|
|
Jira Integration (v1.0.0)
|
|
Create Jira Epics, Stories, and Issues from spec-kit artifacts
|
|
|
|
Provided commands:
|
|
• speckit.jira.specstoissues - Create Jira hierarchy from spec and tasks
|
|
• speckit.jira.discover-fields - Discover Jira custom fields for configuration
|
|
• speckit.jira.sync-status - Sync task completion status to Jira
|
|
|
|
⚠ Configuration may be required
|
|
Check: .specify/extensions/jira/
|
|
```
|
|
|
|
---
|
|
|
|
## Using Extensions
|
|
|
|
### Using Extension Commands
|
|
|
|
Extensions add commands that appear in your AI agent (Claude Code):
|
|
|
|
```text
|
|
# In Claude Code
|
|
> /speckit.jira.specstoissues
|
|
|
|
# Or use short alias (if provided)
|
|
> /speckit.specstoissues
|
|
```
|
|
|
|
### Extension Configuration
|
|
|
|
Most extensions require configuration:
|
|
|
|
```bash
|
|
# 1. Find the config file
|
|
ls .specify/extensions/jira/
|
|
|
|
# 2. Copy template to config
|
|
cp .specify/extensions/jira/jira-config.template.yml \
|
|
.specify/extensions/jira/jira-config.yml
|
|
|
|
# 3. Edit configuration
|
|
vim .specify/extensions/jira/jira-config.yml
|
|
|
|
# 4. Use the extension
|
|
# (Commands will now work with your config)
|
|
```
|
|
|
|
### Extension Hooks
|
|
|
|
Some extensions provide hooks that execute after core commands:
|
|
|
|
**Example**: Jira extension hooks into `/speckit.tasks`
|
|
|
|
```text
|
|
# Run core command
|
|
> /speckit.tasks
|
|
|
|
# Output includes:
|
|
## Extension Hooks
|
|
|
|
**Optional Hook**: jira
|
|
Command: `/speckit.jira.specstoissues`
|
|
Description: Automatically create Jira hierarchy after task generation
|
|
|
|
Prompt: Create Jira issues from tasks?
|
|
To execute: `/speckit.jira.specstoissues`
|
|
```
|
|
|
|
You can then choose to run the hook or skip it.
|
|
|
|
---
|
|
|
|
## Managing Extensions
|
|
|
|
### List Installed Extensions
|
|
|
|
```bash
|
|
specify extension list
|
|
```
|
|
|
|
Output:
|
|
|
|
```text
|
|
Installed Extensions:
|
|
|
|
✓ Jira Integration (v1.0.0)
|
|
Create Jira Epics, Stories, and Issues from spec-kit artifacts
|
|
Commands: 3 | Hooks: 1 | Status: Enabled
|
|
```
|
|
|
|
### Update Extensions
|
|
|
|
```bash
|
|
# Check for updates (all extensions)
|
|
specify extension update
|
|
|
|
# Update specific extension
|
|
specify extension update jira
|
|
```
|
|
|
|
Output:
|
|
|
|
```text
|
|
🔄 Checking for updates...
|
|
|
|
Updates available:
|
|
|
|
• jira: 1.0.0 → 1.1.0
|
|
|
|
Update these extensions? [y/N]:
|
|
```
|
|
|
|
### Disable Extension Temporarily
|
|
|
|
```bash
|
|
# Disable without removing
|
|
specify extension disable jira
|
|
|
|
✓ Extension 'jira' disabled
|
|
|
|
Commands will no longer be available. Hooks will not execute.
|
|
To re-enable: specify extension enable jira
|
|
```
|
|
|
|
### Re-enable Extension
|
|
|
|
```bash
|
|
specify extension enable jira
|
|
|
|
✓ Extension 'jira' enabled
|
|
```
|
|
|
|
### Remove Extension
|
|
|
|
```bash
|
|
# Remove extension (with confirmation)
|
|
specify extension remove jira
|
|
|
|
# Keep configuration when removing
|
|
specify extension remove jira --keep-config
|
|
|
|
# Force removal (no confirmation)
|
|
specify extension remove jira --force
|
|
```
|
|
|
|
---
|
|
|
|
## Configuration
|
|
|
|
### Configuration Files
|
|
|
|
Extensions can have multiple configuration files:
|
|
|
|
```text
|
|
.specify/extensions/jira/
|
|
├── jira-config.yml # Main config (version controlled)
|
|
├── jira-config.local.yml # Local overrides (gitignored)
|
|
└── jira-config.template.yml # Template (reference)
|
|
```
|
|
|
|
### Configuration Layers
|
|
|
|
Configuration is merged in this order (highest priority last):
|
|
|
|
1. **Extension defaults** (from `extension.yml`)
|
|
2. **Project config** (`jira-config.yml`)
|
|
3. **Local overrides** (`jira-config.local.yml`)
|
|
4. **Environment variables** (`SPECKIT_JIRA_*`)
|
|
|
|
### Example: Jira Configuration
|
|
|
|
**Project config** (`.specify/extensions/jira/jira-config.yml`):
|
|
|
|
```yaml
|
|
project:
|
|
key: "MSATS"
|
|
|
|
defaults:
|
|
epic:
|
|
labels: ["spec-driven"]
|
|
```
|
|
|
|
**Local override** (`.specify/extensions/jira/jira-config.local.yml`):
|
|
|
|
```yaml
|
|
project:
|
|
key: "MYTEST" # Override for local development
|
|
```
|
|
|
|
**Environment variable**:
|
|
|
|
```bash
|
|
export SPECKIT_JIRA_PROJECT_KEY="DEVTEST"
|
|
```
|
|
|
|
Final resolved config uses `DEVTEST` from environment variable.
|
|
|
|
### Project-Wide Extension Settings
|
|
|
|
File: `.specify/extensions.yml`
|
|
|
|
```yaml
|
|
# Extensions installed in this project
|
|
installed:
|
|
- jira
|
|
- linear
|
|
|
|
# Global settings
|
|
settings:
|
|
auto_execute_hooks: true
|
|
|
|
# Hook configuration
|
|
hooks:
|
|
after_tasks:
|
|
- extension: jira
|
|
command: speckit.jira.specstoissues
|
|
enabled: true
|
|
optional: true
|
|
prompt: "Create Jira issues from tasks?"
|
|
```
|
|
|
|
### Core Environment Variables
|
|
|
|
In addition to extension-specific environment variables (`SPECKIT_{EXT_ID}_*`), spec-kit supports core environment variables:
|
|
|
|
| Variable | Description | Default |
|
|
|----------|-------------|---------|
|
|
| `SPECKIT_CATALOG_URL` | Override the full catalog stack with a single URL (backward compat) | Built-in default stack |
|
|
| `GH_TOKEN` / `GITHUB_TOKEN` | GitHub API token for downloads | None |
|
|
|
|
#### Example: Using a custom catalog for testing
|
|
|
|
```bash
|
|
# Point to a local or alternative catalog (replaces the full stack)
|
|
export SPECKIT_CATALOG_URL="http://localhost:8000/catalog.json"
|
|
|
|
# Or use a staging catalog
|
|
export SPECKIT_CATALOG_URL="https://example.com/staging/catalog.json"
|
|
```
|
|
|
|
---
|
|
|
|
## Extension Catalogs
|
|
|
|
Spec Kit uses a **catalog stack** — an ordered list of catalogs searched simultaneously. By default, two catalogs are active:
|
|
|
|
| Priority | Catalog | Install Allowed | Purpose |
|
|
|----------|---------|-----------------|---------|
|
|
| 1 | `catalog.json` (default) | ✅ Yes | Curated extensions available for installation |
|
|
| 2 | `catalog.community.json` (community) | ❌ No (discovery only) | Browse community extensions |
|
|
|
|
### Listing Active Catalogs
|
|
|
|
```bash
|
|
specify extension catalog list
|
|
```
|
|
|
|
### Adding a Catalog (Project-scoped)
|
|
|
|
```bash
|
|
# Add an internal catalog that allows installs
|
|
specify extension catalog add \
|
|
--name "internal" \
|
|
--priority 2 \
|
|
--install-allowed \
|
|
https://internal.company.com/spec-kit/catalog.json
|
|
|
|
# Add a discovery-only catalog
|
|
specify extension catalog add \
|
|
--name "partner" \
|
|
--priority 5 \
|
|
https://partner.example.com/spec-kit/catalog.json
|
|
```
|
|
|
|
This creates or updates `.specify/extension-catalogs.yml`.
|
|
|
|
### Removing a Catalog
|
|
|
|
```bash
|
|
specify extension catalog remove internal
|
|
```
|
|
|
|
### Manual Config File
|
|
|
|
You can also edit `.specify/extension-catalogs.yml` directly:
|
|
|
|
```yaml
|
|
catalogs:
|
|
- name: "default"
|
|
url: "https://raw.githubusercontent.com/github/spec-kit/main/extensions/catalog.json"
|
|
priority: 1
|
|
install_allowed: true
|
|
description: "Built-in catalog of installable extensions"
|
|
|
|
- name: "internal"
|
|
url: "https://internal.company.com/spec-kit/catalog.json"
|
|
priority: 2
|
|
install_allowed: true
|
|
description: "Internal company extensions"
|
|
|
|
- name: "community"
|
|
url: "https://raw.githubusercontent.com/github/spec-kit/main/extensions/catalog.community.json"
|
|
priority: 3
|
|
install_allowed: false
|
|
description: "Community-contributed extensions (discovery only)"
|
|
```
|
|
|
|
A user-level equivalent lives at `~/.specify/extension-catalogs.yml`. Project-level config takes full precedence when it contains one or more catalog entries. An empty `catalogs: []` list falls back to built-in defaults.
|
|
|
|
## Organization Catalog Customization
|
|
|
|
### Why Customize Your Catalog
|
|
|
|
Organizations customize their catalogs to:
|
|
|
|
- **Control available extensions** - Curate which extensions your team can install
|
|
- **Host private extensions** - Internal tools that shouldn't be public
|
|
- **Customize for compliance** - Meet security/audit requirements
|
|
- **Support air-gapped environments** - Work without internet access
|
|
|
|
### Setting Up a Custom Catalog
|
|
|
|
#### 1. Create Your Catalog File
|
|
|
|
Create a `catalog.json` file with your extensions:
|
|
|
|
```json
|
|
{
|
|
"schema_version": "1.0",
|
|
"updated_at": "2026-02-03T00:00:00Z",
|
|
"catalog_url": "https://your-org.com/spec-kit/catalog.json",
|
|
"extensions": {
|
|
"jira": {
|
|
"name": "Jira Integration",
|
|
"id": "jira",
|
|
"description": "Create Jira issues from spec-kit artifacts",
|
|
"author": "Your Organization",
|
|
"version": "2.1.0",
|
|
"download_url": "https://github.com/your-org/spec-kit-jira/archive/refs/tags/v2.1.0.zip",
|
|
"repository": "https://github.com/your-org/spec-kit-jira",
|
|
"license": "MIT",
|
|
"requires": {
|
|
"speckit_version": ">=0.1.0",
|
|
"tools": [
|
|
{"name": "atlassian-mcp-server", "required": true}
|
|
]
|
|
},
|
|
"provides": {
|
|
"commands": 3,
|
|
"hooks": 1
|
|
},
|
|
"tags": ["jira", "atlassian", "issue-tracking"],
|
|
"verified": true
|
|
},
|
|
"internal-tool": {
|
|
"name": "Internal Tool Integration",
|
|
"id": "internal-tool",
|
|
"description": "Connect to internal company systems",
|
|
"author": "Your Organization",
|
|
"version": "1.0.0",
|
|
"download_url": "https://internal.your-org.com/extensions/internal-tool-1.0.0.zip",
|
|
"repository": "https://github.internal.your-org.com/spec-kit-internal",
|
|
"license": "Proprietary",
|
|
"requires": {
|
|
"speckit_version": ">=0.1.0"
|
|
},
|
|
"provides": {
|
|
"commands": 2
|
|
},
|
|
"tags": ["internal", "proprietary"],
|
|
"verified": true
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
#### 2. Host the Catalog
|
|
|
|
Options for hosting your catalog:
|
|
|
|
| Method | URL Example | Use Case |
|
|
| ------ | ----------- | -------- |
|
|
| GitHub Pages | `https://your-org.github.io/spec-kit-catalog/catalog.json` | Public or org-visible |
|
|
| Internal web server | `https://internal.company.com/spec-kit/catalog.json` | Corporate network |
|
|
| S3/Cloud storage | `https://s3.amazonaws.com/your-bucket/catalog.json` | Cloud-hosted teams |
|
|
| Local file server | `http://localhost:8000/catalog.json` | Development/testing |
|
|
|
|
**Security requirement**: URLs must use HTTPS (except `localhost` for testing).
|
|
|
|
#### 3. Configure Your Environment
|
|
|
|
##### Option A: Catalog stack config file (recommended)
|
|
|
|
Add to `.specify/extension-catalogs.yml` in your project:
|
|
|
|
```yaml
|
|
catalogs:
|
|
- name: "my-org"
|
|
url: "https://your-org.com/spec-kit/catalog.json"
|
|
priority: 1
|
|
install_allowed: true
|
|
```
|
|
|
|
Or use the CLI:
|
|
|
|
```bash
|
|
specify extension catalog add \
|
|
--name "my-org" \
|
|
--install-allowed \
|
|
https://your-org.com/spec-kit/catalog.json
|
|
```
|
|
|
|
##### Option B: Environment variable (recommended for CI/CD, single-catalog)
|
|
|
|
```bash
|
|
# In ~/.bashrc, ~/.zshrc, or CI pipeline
|
|
export SPECKIT_CATALOG_URL="https://your-org.com/spec-kit/catalog.json"
|
|
```
|
|
|
|
#### 4. Verify Configuration
|
|
|
|
```bash
|
|
# List active catalogs
|
|
specify extension catalog list
|
|
|
|
# Search should now show your catalog's extensions
|
|
specify extension search
|
|
|
|
# Install from your catalog
|
|
specify extension add jira
|
|
```
|
|
|
|
### Catalog JSON Schema
|
|
|
|
Required fields for each extension entry:
|
|
|
|
| Field | Type | Required | Description |
|
|
| ----- | ---- | -------- | ----------- |
|
|
| `name` | string | Yes | Human-readable name |
|
|
| `id` | string | Yes | Unique identifier (lowercase, hyphens) |
|
|
| `version` | string | Yes | Semantic version (X.Y.Z) |
|
|
| `download_url` | string | Yes | URL to ZIP archive |
|
|
| `repository` | string | Yes | Source code URL |
|
|
| `description` | string | No | Brief description |
|
|
| `author` | string | No | Author/organization |
|
|
| `license` | string | No | SPDX license identifier |
|
|
| `requires.speckit_version` | string | No | Version constraint |
|
|
| `requires.tools` | array | No | Required external tools |
|
|
| `provides.commands` | number | No | Number of commands |
|
|
| `provides.hooks` | number | No | Number of hooks |
|
|
| `tags` | array | No | Search tags |
|
|
| `verified` | boolean | No | Verification status |
|
|
|
|
### Use Cases
|
|
|
|
#### Private/Internal Extensions
|
|
|
|
Host proprietary extensions that integrate with internal systems:
|
|
|
|
```json
|
|
{
|
|
"internal-auth": {
|
|
"name": "Internal SSO Integration",
|
|
"download_url": "https://artifactory.company.com/spec-kit/internal-auth-1.0.0.zip",
|
|
"verified": true
|
|
}
|
|
}
|
|
```
|
|
|
|
#### Curated Team Catalog
|
|
|
|
Limit which extensions your team can install:
|
|
|
|
```json
|
|
{
|
|
"extensions": {
|
|
"jira": { "..." },
|
|
"github": { "..." }
|
|
}
|
|
}
|
|
```
|
|
|
|
Only `jira` and `github` will appear in `specify extension search`.
|
|
|
|
#### Air-Gapped Environments
|
|
|
|
For networks without internet access:
|
|
|
|
1. Download extension ZIPs to internal file server
|
|
2. Create catalog pointing to internal URLs
|
|
3. Host catalog on internal web server
|
|
|
|
```json
|
|
{
|
|
"jira": {
|
|
"download_url": "https://files.internal/spec-kit/jira-2.1.0.zip"
|
|
}
|
|
}
|
|
```
|
|
|
|
#### Development/Testing
|
|
|
|
Test new extensions before publishing:
|
|
|
|
```bash
|
|
# Start local server
|
|
python -m http.server 8000 --directory ./my-catalog/
|
|
|
|
# Point spec-kit to local catalog
|
|
export SPECKIT_CATALOG_URL="http://localhost:8000/catalog.json"
|
|
|
|
# Test installation
|
|
specify extension add my-new-extension
|
|
```
|
|
|
|
### Combining with Direct Installation
|
|
|
|
You can still install extensions not in your catalog using `--from`:
|
|
|
|
```bash
|
|
# From catalog
|
|
specify extension add jira
|
|
|
|
# Direct URL (bypasses catalog)
|
|
specify extension add --from https://github.com/someone/spec-kit-ext/archive/v1.0.0.zip
|
|
|
|
# Local development
|
|
specify extension add --dev /path/to/extension
|
|
```
|
|
|
|
**Note**: Direct URL installation shows a security warning since the extension isn't from your configured catalog.
|
|
|
|
---
|
|
|
|
## Troubleshooting
|
|
|
|
### Extension Not Found
|
|
|
|
**Error**: `Extension 'jira' not found in catalog
|
|
|
|
**Solutions**:
|
|
|
|
1. Check spelling: `specify extension search jira`
|
|
2. Refresh catalog: `specify extension search --help`
|
|
3. Check internet connection
|
|
4. Extension may not be published yet
|
|
|
|
### Configuration Not Found
|
|
|
|
**Error**: `Jira configuration not found`
|
|
|
|
**Solutions**:
|
|
|
|
1. Check if extension is installed: `specify extension list`
|
|
2. Create config from template:
|
|
|
|
```bash
|
|
cp .specify/extensions/jira/jira-config.template.yml \
|
|
.specify/extensions/jira/jira-config.yml
|
|
```
|
|
|
|
3. Reinstall extension: `specify extension remove jira && specify extension add jira`
|
|
|
|
### Command Not Available
|
|
|
|
**Issue**: Extension command not appearing in AI agent
|
|
|
|
**Solutions**:
|
|
|
|
1. Check extension is enabled: `specify extension list`
|
|
2. Restart AI agent (Claude Code)
|
|
3. Check command file exists:
|
|
|
|
```bash
|
|
ls .claude/commands/speckit.jira.*.md
|
|
```
|
|
|
|
4. Reinstall extension
|
|
|
|
### Incompatible Version
|
|
|
|
**Error**: `Extension requires spec-kit >=0.2.0, but you have 0.1.0`
|
|
|
|
**Solutions**:
|
|
|
|
1. Upgrade spec-kit:
|
|
|
|
```bash
|
|
uv tool upgrade specify-cli
|
|
```
|
|
|
|
2. Install older version of extension:
|
|
|
|
```bash
|
|
specify extension add --from https://github.com/org/ext/archive/v1.0.0.zip
|
|
```
|
|
|
|
### MCP Tool Not Available
|
|
|
|
**Error**: `Tool 'jira-mcp-server/epic_create' not found`
|
|
|
|
**Solutions**:
|
|
|
|
1. Check MCP server is installed
|
|
2. Check AI agent MCP configuration
|
|
3. Restart AI agent
|
|
4. Check extension requirements: `specify extension info jira`
|
|
|
|
### Permission Denied
|
|
|
|
**Error**: `Permission denied` when accessing Jira
|
|
|
|
**Solutions**:
|
|
|
|
1. Check Jira credentials in MCP server config
|
|
2. Verify project permissions in Jira
|
|
3. Test MCP server connection independently
|
|
|
|
---
|
|
|
|
## Best Practices
|
|
|
|
### 1. Version Control
|
|
|
|
**Do commit**:
|
|
|
|
- `.specify/extensions.yml` (project extension config)
|
|
- `.specify/extensions/*/jira-config.yml` (project config)
|
|
|
|
**Don't commit**:
|
|
|
|
- `.specify/extensions/.cache/` (catalog cache)
|
|
- `.specify/extensions/.backup/` (config backups)
|
|
- `.specify/extensions/*/*.local.yml` (local overrides)
|
|
- `.specify/extensions/.registry` (installation state)
|
|
|
|
Add to `.gitignore`:
|
|
|
|
```gitignore
|
|
.specify/extensions/.cache/
|
|
.specify/extensions/.backup/
|
|
.specify/extensions/*/*.local.yml
|
|
.specify/extensions/.registry
|
|
```
|
|
|
|
### 2. Team Workflows
|
|
|
|
**For teams**:
|
|
|
|
1. Agree on which extensions to use
|
|
2. Commit extension configuration
|
|
3. Document extension usage in README
|
|
4. Keep extensions updated together
|
|
|
|
**Example README section**:
|
|
|
|
```markdown
|
|
## Extensions
|
|
|
|
This project uses:
|
|
- **jira** (v1.0.0) - Jira integration
|
|
- Config: `.specify/extensions/jira/jira-config.yml`
|
|
- Requires: jira-mcp-server
|
|
|
|
To install: `specify extension add jira`
|
|
```
|
|
|
|
### 3. Local Development
|
|
|
|
Use local config for development:
|
|
|
|
```yaml
|
|
# .specify/extensions/jira/jira-config.local.yml
|
|
project:
|
|
key: "DEVTEST" # Your test project
|
|
|
|
defaults:
|
|
task:
|
|
custom_fields:
|
|
customfield_10002: 1 # Lower story points for testing
|
|
```
|
|
|
|
### 4. Environment-Specific Config
|
|
|
|
Use environment variables for CI/CD:
|
|
|
|
```bash
|
|
# .github/workflows/deploy.yml
|
|
env:
|
|
SPECKIT_JIRA_PROJECT_KEY: ${{ secrets.JIRA_PROJECT }}
|
|
|
|
- name: Create Jira Issues
|
|
run: specify extension add jira && ...
|
|
```
|
|
|
|
### 5. Extension Updates
|
|
|
|
**Check for updates regularly**:
|
|
|
|
```bash
|
|
# Weekly or before major releases
|
|
specify extension update
|
|
```
|
|
|
|
**Pin versions for stability**:
|
|
|
|
```yaml
|
|
# .specify/extensions.yml
|
|
installed:
|
|
- id: jira
|
|
version: "1.0.0" # Pin to specific version
|
|
```
|
|
|
|
### 6. Minimal Extensions
|
|
|
|
Only install extensions you actively use:
|
|
|
|
- Reduces complexity
|
|
- Faster command loading
|
|
- Less configuration
|
|
|
|
### 7. Documentation
|
|
|
|
Document extension usage in your project:
|
|
|
|
```markdown
|
|
# PROJECT.md
|
|
|
|
## Working with Jira
|
|
|
|
After creating tasks, sync to Jira:
|
|
1. Run `/speckit.tasks` to generate tasks
|
|
2. Run `/speckit.jira.specstoissues` to create Jira issues
|
|
3. Run `/speckit.jira.sync-status` to update status
|
|
```
|
|
|
|
---
|
|
|
|
## FAQ
|
|
|
|
### Q: Can I use multiple extensions at once?
|
|
|
|
**A**: Yes! Extensions are designed to work together. Install as many as you need.
|
|
|
|
### Q: Do extensions slow down spec-kit?
|
|
|
|
**A**: No. Extensions are loaded on-demand and only when their commands are used.
|
|
|
|
### Q: Can I create private extensions?
|
|
|
|
**A**: Yes. Install with `--dev` or `--from` and keep private. Public catalog submission is optional.
|
|
|
|
### Q: How do I know if an extension is safe?
|
|
|
|
**A**: Look for the ✓ Verified badge. Verified extensions are reviewed by maintainers. Always review extension code before installing.
|
|
|
|
### Q: Can extensions modify spec-kit core?
|
|
|
|
**A**: No. Extensions can only add commands and hooks. They cannot modify core functionality.
|
|
|
|
### Q: What happens if two extensions have the same command name?
|
|
|
|
**A**: Extensions use namespaced commands (`speckit.{extension}.{command}`), so conflicts are very rare. The extension system will warn you if conflicts occur.
|
|
|
|
### Q: Can I contribute to existing extensions?
|
|
|
|
**A**: Yes! Most extensions are open source. Check the repository link in `specify extension info {extension}`.
|
|
|
|
### Q: How do I report extension bugs?
|
|
|
|
**A**: Go to the extension's repository (shown in `specify extension info`) and create an issue.
|
|
|
|
### Q: Can extensions work offline?
|
|
|
|
**A**: Once installed, extensions work offline. However, some extensions may require internet for their functionality (e.g., Jira requires Jira API access).
|
|
|
|
### Q: How do I backup my extension configuration?
|
|
|
|
**A**: Extension configs are in `.specify/extensions/{extension}/`. Back up this directory or commit configs to git.
|
|
|
|
---
|
|
|
|
## Support
|
|
|
|
- **Extension Issues**: Report to extension repository (see `specify extension info`)
|
|
- **Spec Kit Issues**: <https://github.com/statsperform/spec-kit/issues>
|
|
- **Extension Catalog**: <https://github.com/statsperform/spec-kit/tree/main/extensions>
|
|
- **Documentation**: See EXTENSION-DEVELOPMENT-GUIDE.md and EXTENSION-PUBLISHING-GUIDE.md
|
|
|
|
---
|
|
|
|
*Last Updated: 2026-01-28*
|
|
*Spec Kit Version: 0.1.0*
|