Skip to content

Commit 005370e

Browse files
Merge branch 'main' into add-status-command
2 parents 2256f53 + bef9c2c commit 005370e

4 files changed

Lines changed: 91 additions & 0 deletions

File tree

extensions/README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ The following community-contributed extensions are available in [`catalog.commun
7272

7373
| Extension | Purpose | URL |
7474
|-----------|---------|-----|
75+
| Archive Extension | Archive merged features into main project memory. | [spec-kit-archive](https://github.com/stn1slv/spec-kit-archive) |
7576
| 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) |
7677
| 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) |
7778
| 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
8081
| 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) |
8182
| 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) |
8283
| Ralph Loop | Autonomous implementation loop using AI agent CLI | [spec-kit-ralph](https://github.com/Rubiss/spec-kit-ralph) |
84+
| Reconcile Extension | Reconcile implementation drift by surgically updating feature artifacts. | [spec-kit-reconcile](https://github.com/stn1slv/spec-kit-reconcile) |
8385
| 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) |
8486
| 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) |
8587
| 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) |

extensions/catalog.community.json

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,37 @@
33
"updated_at": "2026-03-16T00:00:00Z",
44
"catalog_url": "https://raw.githubusercontent.com/github/spec-kit/main/extensions/catalog.community.json",
55
"extensions": {
6+
"archive": {
7+
"name": "Archive Extension",
8+
"id": "archive",
9+
"description": "Archive merged features into main project memory, resolving gaps and conflicts.",
10+
"author": "Stanislav Deviatov",
11+
"version": "1.0.0",
12+
"download_url": "https://github.com/stn1slv/spec-kit-archive/archive/refs/tags/v1.0.0.zip",
13+
"repository": "https://github.com/stn1slv/spec-kit-archive",
14+
"homepage": "https://github.com/stn1slv/spec-kit-archive",
15+
"documentation": "https://github.com/stn1slv/spec-kit-archive/blob/main/README.md",
16+
"changelog": "https://github.com/stn1slv/spec-kit-archive/blob/main/CHANGELOG.md",
17+
"license": "MIT",
18+
"requires": {
19+
"speckit_version": ">=0.1.0"
20+
},
21+
"provides": {
22+
"commands": 1,
23+
"hooks": 0
24+
},
25+
"tags": [
26+
"archive",
27+
"memory",
28+
"merge",
29+
"changelog"
30+
],
31+
"verified": false,
32+
"downloads": 0,
33+
"stars": 0,
34+
"created_at": "2026-03-14T00:00:00Z",
35+
"updated_at": "2026-03-14T00:00:00Z"
36+
},
637
"azure-devops": {
738
"name": "Azure DevOps Integration",
839
"id": "azure-devops",
@@ -250,6 +281,37 @@
250281
"created_at": "2026-03-09T00:00:00Z",
251282
"updated_at": "2026-03-09T00:00:00Z"
252283
},
284+
"reconcile": {
285+
"name": "Reconcile Extension",
286+
"id": "reconcile",
287+
"description": "Reconcile implementation drift by surgically updating the feature's own spec, plan, and tasks.",
288+
"author": "Stanislav Deviatov",
289+
"version": "1.0.0",
290+
"download_url": "https://github.com/stn1slv/spec-kit-reconcile/archive/refs/tags/v1.0.0.zip",
291+
"repository": "https://github.com/stn1slv/spec-kit-reconcile",
292+
"homepage": "https://github.com/stn1slv/spec-kit-reconcile",
293+
"documentation": "https://github.com/stn1slv/spec-kit-reconcile/blob/main/README.md",
294+
"changelog": "https://github.com/stn1slv/spec-kit-reconcile/blob/main/CHANGELOG.md",
295+
"license": "MIT",
296+
"requires": {
297+
"speckit_version": ">=0.1.0"
298+
},
299+
"provides": {
300+
"commands": 1,
301+
"hooks": 0
302+
},
303+
"tags": [
304+
"reconcile",
305+
"drift",
306+
"tasks",
307+
"remediation"
308+
],
309+
"verified": false,
310+
"downloads": 0,
311+
"stars": 0,
312+
"created_at": "2026-03-14T00:00:00Z",
313+
"updated_at": "2026-03-14T00:00:00Z"
314+
},
253315
"retrospective": {
254316
"name": "Retrospective Extension",
255317
"id": "retrospective",

src/specify_cli/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2576,6 +2576,7 @@ def extension_list(
25762576
status_color = "green" if ext["enabled"] else "red"
25772577

25782578
console.print(f" [{status_color}]{status_icon}[/{status_color}] [bold]{ext['name']}[/bold] (v{ext['version']})")
2579+
console.print(f" [dim]{ext['id']}[/dim]")
25792580
console.print(f" {ext['description']}")
25802581
console.print(f" Commands: {ext['command_count']} | Hooks: {ext['hook_count']} | Status: {'Enabled' if ext['enabled'] else 'Disabled'}")
25812582
console.print()

tests/test_extensions.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2337,3 +2337,29 @@ def test_update_failure_rolls_back_registry_hooks_and_commands(self, tmp_path):
23372337

23382338
for cmd_file in command_files:
23392339
assert cmd_file.exists(), f"Expected command file to be restored after rollback: {cmd_file}"
2340+
2341+
2342+
class TestExtensionListCLI:
2343+
"""Test extension list CLI output format."""
2344+
2345+
def test_list_shows_extension_id(self, extension_dir, project_dir):
2346+
"""extension list should display the extension ID."""
2347+
from typer.testing import CliRunner
2348+
from unittest.mock import patch
2349+
from specify_cli import app
2350+
2351+
runner = CliRunner()
2352+
2353+
# Install the extension using the manager
2354+
manager = ExtensionManager(project_dir)
2355+
manager.install_from_directory(extension_dir, "0.1.0", register_commands=False)
2356+
2357+
with patch.object(Path, "cwd", return_value=project_dir):
2358+
result = runner.invoke(app, ["extension", "list"])
2359+
2360+
assert result.exit_code == 0, result.output
2361+
# Verify the extension ID is shown in the output
2362+
assert "test-ext" in result.output
2363+
# Verify name and version are also shown
2364+
assert "Test Extension" in result.output
2365+
assert "1.0.0" in result.output

0 commit comments

Comments
 (0)