diff --git a/extensions/README.md b/extensions/README.md index 673564fe..f38cf1b1 100644 --- a/extensions/README.md +++ b/extensions/README.md @@ -72,6 +72,7 @@ The following community-contributed extensions are available in [`catalog.commun | Extension | Purpose | URL | |-----------|---------|-----| +| Archive Extension | Archive merged features into main project memory. | [spec-kit-archive](https://github.com/stn1slv/spec-kit-archive) | | Azure DevOps Integration | Sync user stories and tasks to Azure DevOps work items using OAuth authentication | [spec-kit-azure-devops](https://github.com/pragya247/spec-kit-azure-devops) | | Cleanup Extension | Post-implementation quality gate that reviews changes, fixes small issues (scout rule), creates tasks for medium issues, and generates analysis for large issues | [spec-kit-cleanup](https://github.com/dsrednicki/spec-kit-cleanup) | | DocGuard — CDD Enforcement | Canonical-Driven Development enforcement. Generates, validates, scores, and traces project documentation against 92 automated checks with config-aware traceability, quality labels, and AI-ready fix prompts. Zero dependencies. | [spec-kit-docguard](https://github.com/raccioly/docguard) | @@ -80,6 +81,7 @@ The following community-contributed extensions are available in [`catalog.commun | Project Health Check | Diagnose a Spec Kit project and report health issues across structure, agents, features, scripts, extensions, and git | [spec-kit-doctor](https://github.com/KhawarHabibKhan/spec-kit-doctor) | | Project Status | Show current SDD workflow progress — active feature, artifact status, task completion, workflow phase, and extensions summary | [spec-kit-status](https://github.com/KhawarHabibKhan/spec-kit-status) | | Ralph Loop | Autonomous implementation loop using AI agent CLI | [spec-kit-ralph](https://github.com/Rubiss/spec-kit-ralph) | +| Reconcile Extension | Reconcile implementation drift by surgically updating feature artifacts. | [spec-kit-reconcile](https://github.com/stn1slv/spec-kit-reconcile) | | Retrospective Extension | Post-implementation retrospective with spec adherence scoring, drift analysis, and human-gated spec updates | [spec-kit-retrospective](https://github.com/emi-dm/spec-kit-retrospective) | | Review Extension | Post-implementation comprehensive code review with specialized agents for code quality, comments, tests, error handling, type design, and simplification | [spec-kit-review](https://github.com/ismaelJimenez/spec-kit-review) | | Spec Sync | Detect and resolve drift between specs and implementation. AI-assisted resolution with human approval | [spec-kit-sync](https://github.com/bgervin/spec-kit-sync) | diff --git a/extensions/catalog.community.json b/extensions/catalog.community.json index 65537356..01cf5a67 100644 --- a/extensions/catalog.community.json +++ b/extensions/catalog.community.json @@ -3,6 +3,37 @@ "updated_at": "2026-03-16T00:00:00Z", "catalog_url": "https://raw.githubusercontent.com/github/spec-kit/main/extensions/catalog.community.json", "extensions": { + "archive": { + "name": "Archive Extension", + "id": "archive", + "description": "Archive merged features into main project memory, resolving gaps and conflicts.", + "author": "Stanislav Deviatov", + "version": "1.0.0", + "download_url": "https://github.com/stn1slv/spec-kit-archive/archive/refs/tags/v1.0.0.zip", + "repository": "https://github.com/stn1slv/spec-kit-archive", + "homepage": "https://github.com/stn1slv/spec-kit-archive", + "documentation": "https://github.com/stn1slv/spec-kit-archive/blob/main/README.md", + "changelog": "https://github.com/stn1slv/spec-kit-archive/blob/main/CHANGELOG.md", + "license": "MIT", + "requires": { + "speckit_version": ">=0.1.0" + }, + "provides": { + "commands": 1, + "hooks": 0 + }, + "tags": [ + "archive", + "memory", + "merge", + "changelog" + ], + "verified": false, + "downloads": 0, + "stars": 0, + "created_at": "2026-03-14T00:00:00Z", + "updated_at": "2026-03-14T00:00:00Z" + }, "azure-devops": { "name": "Azure DevOps Integration", "id": "azure-devops", @@ -250,6 +281,37 @@ "created_at": "2026-03-09T00:00:00Z", "updated_at": "2026-03-09T00:00:00Z" }, + "reconcile": { + "name": "Reconcile Extension", + "id": "reconcile", + "description": "Reconcile implementation drift by surgically updating the feature's own spec, plan, and tasks.", + "author": "Stanislav Deviatov", + "version": "1.0.0", + "download_url": "https://github.com/stn1slv/spec-kit-reconcile/archive/refs/tags/v1.0.0.zip", + "repository": "https://github.com/stn1slv/spec-kit-reconcile", + "homepage": "https://github.com/stn1slv/spec-kit-reconcile", + "documentation": "https://github.com/stn1slv/spec-kit-reconcile/blob/main/README.md", + "changelog": "https://github.com/stn1slv/spec-kit-reconcile/blob/main/CHANGELOG.md", + "license": "MIT", + "requires": { + "speckit_version": ">=0.1.0" + }, + "provides": { + "commands": 1, + "hooks": 0 + }, + "tags": [ + "reconcile", + "drift", + "tasks", + "remediation" + ], + "verified": false, + "downloads": 0, + "stars": 0, + "created_at": "2026-03-14T00:00:00Z", + "updated_at": "2026-03-14T00:00:00Z" + }, "retrospective": { "name": "Retrospective Extension", "id": "retrospective", diff --git a/src/specify_cli/__init__.py b/src/specify_cli/__init__.py index a45535ae..8509db7e 100644 --- a/src/specify_cli/__init__.py +++ b/src/specify_cli/__init__.py @@ -2576,6 +2576,7 @@ def extension_list( status_color = "green" if ext["enabled"] else "red" console.print(f" [{status_color}]{status_icon}[/{status_color}] [bold]{ext['name']}[/bold] (v{ext['version']})") + console.print(f" [dim]{ext['id']}[/dim]") console.print(f" {ext['description']}") console.print(f" Commands: {ext['command_count']} | Hooks: {ext['hook_count']} | Status: {'Enabled' if ext['enabled'] else 'Disabled'}") console.print() diff --git a/tests/test_extensions.py b/tests/test_extensions.py index 6299abbb..61a3e1c9 100644 --- a/tests/test_extensions.py +++ b/tests/test_extensions.py @@ -2337,3 +2337,29 @@ class TestExtensionUpdateCLI: for cmd_file in command_files: assert cmd_file.exists(), f"Expected command file to be restored after rollback: {cmd_file}" + + +class TestExtensionListCLI: + """Test extension list CLI output format.""" + + def test_list_shows_extension_id(self, extension_dir, project_dir): + """extension list should display the extension ID.""" + from typer.testing import CliRunner + from unittest.mock import patch + from specify_cli import app + + runner = CliRunner() + + # Install the extension using the manager + manager = ExtensionManager(project_dir) + manager.install_from_directory(extension_dir, "0.1.0", register_commands=False) + + with patch.object(Path, "cwd", return_value=project_dir): + result = runner.invoke(app, ["extension", "list"]) + + assert result.exit_code == 0, result.output + # Verify the extension ID is shown in the output + assert "test-ext" in result.output + # Verify name and version are also shown + assert "Test Extension" in result.output + assert "1.0.0" in result.output