* Add modular extension system for Spec Kit Implement a complete extension system that allows third-party developers to extend Spec Kit functionality through plugins. ## Core Features - Extension discovery and loading from local and global directories - YAML-based extension manifest (extension.yml) with metadata and capabilities - Command extensions: custom slash commands with markdown templates - Hook system: pre/post hooks for generate, task, and sync operations - Extension catalog for discovering and installing community extensions - SPECKIT_CATALOG_URL environment variable for catalog URL override ## Installation Methods - Catalog install: `specify extension add <name>` - URL install: `specify extension add <name> --from <url>` - Dev install: `specify extension add --dev <path>` ## Implementation - ExtensionManager class for lifecycle management (load, enable, disable) - Support for extension dependencies and version constraints - Configuration layering (global → project → extension) - Hook conditions for conditional execution ## Documentation - RFC with design rationale and architecture decisions - API reference for extension developers - Development guide with examples - User guide for installing and managing extensions - Publishing guide for the extension catalog ## Included - Extension template for bootstrapping new extensions - Comprehensive test suite - Example catalog.json structure Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * Update Jira extension to v2.1.0 in catalog Adds 2-level mode support (Epic → Stories only). Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * Address PR review feedback - Fix Zip Slip vulnerability in ZIP extraction with path validation - Fix keep_config option to actually preserve config files on removal - Add URL validation for SPECKIT_CATALOG_URL (HTTPS required, localhost exception) - Add security warning when installing from custom URLs (--from flag) - Empty catalog.json so organizations can ship their own catalogs - Fix markdown linter errors (MD040: add language to code blocks) - Remove redundant import and fix unused variables in tests - Add comment explaining empty except clause for backwards compatibility Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * Add comprehensive organization catalog customization docs - Explain why default catalog is empty (org control) - Document how to create and host custom catalogs - Add catalog JSON schema reference - Include use cases: private extensions, curated catalogs, air-gapped environments - Add examples for combining catalog with direct installation Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * Fix test assertions for extension system data structures - Update test_config_backup_on_remove to use new subdirectory structure (.backup/test-ext/file.yml instead of .backup/test-ext-file.yml) - Update test_full_install_and_remove_workflow to handle registered_commands being a dict keyed by agent name instead of a flat list Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * Address Copilot review feedback - Fix localhost URL check to use parsed.hostname instead of netloc.startswith() This correctly handles URLs with ports like localhost:8080 - Fix YAML indentation error in config-template.yml (line 57) - Fix double space typo in example.md (line 172) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * Add catalog.example.json as reference for organizations The main catalog.json is intentionally empty so organizations can ship their own curated catalogs. This example file shows the expected schema and structure for creating organization-specific catalogs. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * Address remaining Copilot security and logic review feedback - Fix Zip Slip vulnerability by using relative_to() for safe path validation - Add HTTPS validation for extension download URLs - Backup both *-config.yml and *-config.local.yml files on remove - Normalize boolean values to lowercase for hook condition comparisons - Show non-default catalog warning only once per instance Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * Ignoring linter for extensions directory --------- Co-authored-by: iamaeroplane <michal.bachorik@gmail.com> Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com> Co-authored-by: Manfred Riem <manfred.riem@microsoft.com>
14 KiB
Changelog
All notable changes to the Specify CLI and templates are documented here.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
[0.1.0] - 2026-01-28
Added
-
Extension System: Introduced modular extension architecture for Spec Kit
- Extensions are self-contained packages that add commands and functionality without bloating core
- Extension manifest schema (
extension.yml) with validation - Extension registry (
.specify/extensions/.registry) for tracking installed extensions - Extension manager module (
src/specify_cli/extensions.py) for installation/removal - New CLI commands:
specify extension list- List installed extensionsspecify extension add- Install extension from local directory or URLspecify extension remove- Uninstall extensionspecify extension search- Search extension catalogspecify extension info- Show detailed extension information
- Semantic versioning compatibility checks
- Support for extension configuration files
- Command registration system for AI agents (Claude support initially)
- Added dependencies:
pyyaml>=6.0,packaging>=23.0
-
Extension Catalog: Extension discovery and distribution system
- Central catalog (
extensions/catalog.json) for published extensions - Extension catalog manager (
ExtensionCatalogclass) with:- Catalog fetching from GitHub
- 1-hour local caching for performance
- Search by query, tag, author, or verification status
- Extension info retrieval
- Catalog cache stored in
.specify/extensions/.cache/ - Search and info commands with rich console output
- Added 9 catalog-specific unit tests (100% pass rate)
- Central catalog (
-
Jira Extension: First official extension for Jira integration
- Extension ID:
jira - Version: 1.0.0
- Commands:
/speckit.jira.specstoissues- Create Jira hierarchy from spec and tasks/speckit.jira.discover-fields- Discover Jira custom fields/speckit.jira.sync-status- Sync task completion status
- Comprehensive documentation (README, usage guide, examples)
- MIT licensed
- Extension ID:
-
Hook System: Extension lifecycle hooks for automation
HookExecutorclass for managing extension hooks- Hooks registered in
.specify/extensions.yml - Hook registration during extension installation
- Hook unregistration during extension removal
- Support for optional and mandatory hooks
- Hook execution messages for AI agent integration
- Condition support for conditional hook execution (placeholder)
-
Extension Management: Advanced extension management commands
specify extension update- Check and update extensions to latest versionspecify extension enable- Enable a disabled extensionspecify extension disable- Disable extension without removing it- Version comparison with catalog
- Update notifications
- Preserve configuration during updates
-
Multi-Agent Support: Extensions now work with all supported AI agents (Phase 6)
- Automatic detection and registration for all agents in project
- Support for 16+ AI agents (Claude, Gemini, Copilot, Cursor, Qwen, and more)
- Agent-specific command formats (Markdown and TOML)
- Automatic argument placeholder conversion ($ARGUMENTS → {{args}})
- Commands registered for all detected agents during installation
- Multi-agent command unregistration on extension removal
CommandRegistrar.register_commands_for_agent()methodCommandRegistrar.register_commands_for_all_agents()method
-
Configuration Layers: Full configuration cascade system (Phase 6)
- Layer 1: Defaults from extension manifest (
extension.yml) - Layer 2: Project config (
.specify/extensions/{ext-id}/{ext-id}-config.yml) - Layer 3: Local config (
.specify/extensions/{ext-id}/local-config.yml, gitignored) - Layer 4: Environment variables (
SPECKIT_{EXT_ID}_{KEY}pattern) - Recursive config merging with proper precedence
ConfigManagerclass for programmatic config accessget_config(),get_value(),has_value()methods- Support for nested configuration paths with dot-notation
- Layer 1: Defaults from extension manifest (
-
Hook Condition Evaluation: Smart hook execution based on runtime conditions (Phase 6)
- Config conditions:
config.key.path is set,config.key == 'value',config.key != 'value' - Environment conditions:
env.VAR is set,env.VAR == 'value',env.VAR != 'value' - Automatic filtering of hooks based on condition evaluation
- Safe fallback behavior on evaluation errors
- Case-insensitive pattern matching
- Config conditions:
-
Hook Integration: Agent-level hook checking and execution (Phase 6)
check_hooks_for_event()method for AI agents to query hooks after core commands- Condition-aware hook filtering before execution
enable_hooks()anddisable_hooks()methods per extension- Formatted hook messages for agent display
execute_hook()method for hook execution information
-
Documentation Suite: Comprehensive documentation for users and developers
- EXTENSION-USER-GUIDE.md: Complete user guide with installation, usage, configuration, and troubleshooting
- EXTENSION-API-REFERENCE.md: Technical API reference with manifest schema, Python API, and CLI commands
- EXTENSION-PUBLISHING-GUIDE.md: Publishing guide for extension authors
- RFC-EXTENSION-SYSTEM.md: Extension architecture design document
-
Extension Template: Starter template in
extensions/template/for creating new extensions- Fully commented
extension.ymlmanifest template - Example command file with detailed explanations
- Configuration template with all options
- Complete project structure (README, LICENSE, CHANGELOG, .gitignore)
- EXAMPLE-README.md showing final documentation format
- Fully commented
-
Unit Tests: Comprehensive test suite with 39 tests covering all extension system components
- Test coverage: 83% of extension module code
- Test dependencies:
pytest>=7.0,pytest-cov>=4.0 - Configured pytest in
pyproject.toml
Changed
- Version bumped to 0.1.0 (minor release for new feature)
[0.0.22] - 2025-11-07
- Support for VS Code/Copilot agents, and moving away from prompts to proper agents with hand-offs.
- Move to use
AGENTS.mdfor Copilot workloads, since it's already supported out-of-the-box. - Adds support for the version command. (#486)
- Fixes potential bug with the
create-new-feature.ps1script that ignores existing feature branches when determining next feature number (#975) - Add graceful fallback and logging for GitHub API rate-limiting during template fetch (#970)
[0.0.21] - 2025-10-21
- Fixes #975 (thank you @fgalarraga).
- Adds support for Amp CLI.
- Adds support for VS Code hand-offs and moves prompts to be full-fledged chat modes.
- Adds support for
versioncommand (addresses #811 and #486, thank you @mcasalaina and @dentity007). - Adds support for rendering the rate limit errors from the CLI when encountered (#970, thank you @psmman).
[0.0.20] - 2025-10-14
Added
- Intelligent Branch Naming:
create-new-featurescripts now support--short-nameparameter for custom branch names- When
--short-nameprovided: Uses the custom name directly (cleaned and formatted) - When omitted: Automatically generates meaningful names using stop word filtering and length-based filtering
- Filters out common stop words (I, want, to, the, for, etc.)
- Removes words shorter than 3 characters (unless they're uppercase acronyms)
- Takes 3-4 most meaningful words from the description
- Enforces GitHub's 244-byte branch name limit with automatic truncation and warnings
- Examples:
- "I want to create user authentication" →
001-create-user-authentication - "Implement OAuth2 integration for API" →
001-implement-oauth2-integration-api - "Fix payment processing bug" →
001-fix-payment-processing - Very long descriptions are automatically truncated at word boundaries to stay within limits
- "I want to create user authentication" →
- Designed for AI agents to provide semantic short names while maintaining standalone usability
- When
Changed
- Enhanced help documentation for
create-new-feature.shandcreate-new-feature.ps1scripts with examples - Branch names now validated against GitHub's 244-byte limit with automatic truncation if needed
[0.0.19] - 2025-10-10
Added
- Support for CodeBuddy (thank you to @lispking for the contribution).
- You can now see Git-sourced errors in the Specify CLI.
Changed
- Fixed the path to the constitution in
plan.md(thank you to @lyzno1 for spotting). - Fixed backslash escapes in generated TOML files for Gemini (thank you to @hsin19 for the contribution).
- Implementation command now ensures that the correct ignore files are added (thank you to @sigent-amazon for the contribution).
[0.0.18] - 2025-10-06
Added
- Support for using
.as a shorthand for current directory inspecify init .command, equivalent to--hereflag but more intuitive for users. - Use the
/speckit.command prefix to easily discover Spec Kit-related commands. - Refactor the prompts and templates to simplify their capabilities and how they are tracked. No more polluting things with tests when they are not needed.
- Ensure that tasks are created per user story (simplifies testing and validation).
- Add support for Visual Studio Code prompt shortcuts and automatic script execution.
Changed
- All command files now prefixed with
speckit.(e.g.,speckit.specify.md,speckit.plan.md) for better discoverability and differentiation in IDE/CLI command palettes and file explorers
[0.0.17] - 2025-09-22
Added
- New
/clarifycommand template to surface up to 5 targeted clarification questions for an existing spec and persist answers into a Clarifications section in the spec. - New
/analyzecommand template providing a non-destructive cross-artifact discrepancy and alignment report (spec, clarifications, plan, tasks, constitution) inserted after/tasksand before/implement.- Note: Constitution rules are explicitly treated as non-negotiable; any conflict is a CRITICAL finding requiring artifact remediation, not weakening of principles.
[0.0.16] - 2025-09-22
Added
--forceflag forinitcommand to bypass confirmation when using--herein a non-empty directory and proceed with merging/overwriting files.
[0.0.15] - 2025-09-21
Added
- Support for Roo Code.
[0.0.14] - 2025-09-21
Changed
- Error messages are now shown consistently.
[0.0.13] - 2025-09-21
Added
- Support for Kilo Code. Thank you @shahrukhkhan489 with #394.
- Support for Auggie CLI. Thank you @hungthai1401 with #137.
- Agent folder security notice displayed after project provisioning completion, warning users that some agents may store credentials or auth tokens in their agent folders and recommending adding relevant folders to
.gitignoreto prevent accidental credential leakage.
Changed
- Warning displayed to ensure that folks are aware that they might need to add their agent folder to
.gitignore. - Cleaned up the
checkcommand output.
[0.0.12] - 2025-09-21
Changed
- Added additional context for OpenAI Codex users - they need to set an additional environment variable, as described in #417.
[0.0.11] - 2025-09-20
Added
- Codex CLI support (thank you @honjo-hiroaki-gtt for the contribution in #14)
- Codex-aware context update tooling (Bash and PowerShell) so feature plans refresh
AGENTS.mdalongside existing assistants without manual edits.
[0.0.10] - 2025-09-20
Fixed
- Addressed #378 where a GitHub token may be attached to the request when it was empty.
[0.0.9] - 2025-09-19
Changed
- Improved agent selector UI with cyan highlighting for agent keys and gray parentheses for full names
[0.0.8] - 2025-09-19
Added
- Windsurf IDE support as additional AI assistant option (thank you @raedkit for the work in #151)
- GitHub token support for API requests to handle corporate environments and rate limiting (contributed by @zryfish in #243)
Changed
- Updated README with Windsurf examples and GitHub token usage
- Enhanced release workflow to include Windsurf templates
[0.0.7] - 2025-09-18
Changed
- Updated command instructions in the CLI.
- Cleaned up the code to not render agent-specific information when it's generic.
[0.0.6] - 2025-09-17
Added
- opencode support as additional AI assistant option
[0.0.5] - 2025-09-17
Added
- Qwen Code support as additional AI assistant option
[0.0.4] - 2025-09-14
Added
- SOCKS proxy support for corporate environments via
httpx[socks]dependency
Fixed
N/A
Changed
N/A