From 4f81fc298f40b5ca6958f8135c960e2ffe0412db Mon Sep 17 00:00:00 2001 From: Stanislav Deviatov Date: Mon, 16 Mar 2026 13:46:06 +0100 Subject: [PATCH 1/2] feat(extensions): add Archive and Reconcile extensions to community catalog (#1844) * feat(extensions): add reconcile and archive to community catalog * Update extension link text and add changelogs Normalize extension link text in extensions/README.md (replace `[@stn1slv]` with `spec-kit-archive` and `spec-kit-reconcile`) and add CHANGELOG URLs to the corresponding entries in extensions/catalog.community.json for the Archive and Reconcile extensions. --------- Co-authored-by: Stanislav Deviatov --- extensions/README.md | 2 + extensions/catalog.community.json | 64 ++++++++++++++++++++++++++++++- 2 files changed, 65 insertions(+), 1 deletion(-) diff --git a/extensions/README.md b/extensions/README.md index 30fc7ca6..bbbb078e 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) | @@ -79,6 +80,7 @@ The following community-contributed extensions are available in [`catalog.commun | Jira Integration | Create Jira Epics, Stories, and Issues from spec-kit specifications and task breakdowns with configurable hierarchy and custom field support | [spec-kit-jira](https://github.com/mbachorik/spec-kit-jira) | | 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) | | 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 dc0e82a0..5c09339c 100644 --- a/extensions/catalog.community.json +++ b/extensions/catalog.community.json @@ -1,8 +1,39 @@ { "schema_version": "1.0", - "updated_at": "2026-03-13T12:00:00Z", + "updated_at": "2026-03-14T00: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", From bef9c2cb5984332f1190b3e2db6196315344f6aa Mon Sep 17 00:00:00 2001 From: Michal Bachorik Date: Mon, 16 Mar 2026 14:41:10 +0100 Subject: [PATCH 2/2] fix(extensions): show extension ID in list output (#1843) Display the extension ID below the name in `specify extension list` output. This allows users to easily copy the ID when disambiguation is needed. Fixes #1832 Co-authored-by: iamaeroplane Co-authored-by: Claude Opus 4.5 --- src/specify_cli/__init__.py | 1 + tests/test_extensions.py | 26 ++++++++++++++++++++++++++ 2 files changed, 27 insertions(+) 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