Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
9802729
docs: generate integrations reference from catalog
DyanGalih May 14, 2026
a7bb1a5
refactor: integrate table rendering into specify integration search -…
DyanGalih May 14, 2026
c01e149
fix: address Copilot review feedback on catalog_docs and integration_…
DyanGalih May 14, 2026
a75a317
fix: add sync test, INTEGRATIONS_REFERENCE_PATH constant, and fix naming
DyanGalih May 15, 2026
4c66437
revert: restore docs/reference/integrations.md to upstream/main; remo…
DyanGalih May 15, 2026
81aabab
fix: remove dead INTEGRATIONS_REFERENCE_PATH, drop URL-length padding…
DyanGalih May 15, 2026
af635d6
fix: send --markdown warnings/errors to stderr, rename test for clarity
DyanGalih May 15, 2026
214bb80
fix: detect stale doc-map keys, test _render_cell escaping, strengthe…
DyanGalih May 15, 2026
63372b2
refactor: promote _render_cell to public render_cell function
DyanGalih May 15, 2026
1e0d34b
test: mock registry and doc maps to avoid brittle live registry coupling
DyanGalih May 15, 2026
0219a74
refactor: flatten patches, remove unused imports, fix trailing whites…
DyanGalih May 15, 2026
79ca6c2
refactor: make validation non-fatal, fix context manager syntax, add …
DyanGalih May 15, 2026
748f982
fix: improve docstring clarity, test robustness, and exception handling
DyanGalih May 15, 2026
28890e1
fix: improve test assertions, disable warnings by default, enhance ex…
DyanGalih May 15, 2026
60431d6
fix: make CLI tests deterministic and improve config access resilience
DyanGalih May 15, 2026
de91ffb
fix: remove extra blank line, add stale keys validation, add regressi…
DyanGalih May 16, 2026
68d8972
Fix 5 remaining feedback items:
DyanGalih May 16, 2026
94fbe78
address all outstanding copilot review feedback on PR 2563
DyanGalih May 18, 2026
9e66eb9
Address Copilot feedback: escape URLs in markdown links, deduplicate …
DyanGalih May 18, 2026
3225612
Address 3 new Copilot feedback: add URL escaping test, fix parse_firs…
DyanGalih May 18, 2026
ceb4a34
Address 3 new Copilot feedback: escape id field, remove unused alias,…
DyanGalih May 18, 2026
d08d068
Address 3 new Copilot feedback: fix comment name, include all integra…
DyanGalih May 18, 2026
46495b8
Fix architectural issue: escape raw fields before composing Markdown …
DyanGalih May 18, 2026
71f2aff
Deduplicate _escape_url_for_markdown_link and add URL escaping test
DyanGalih May 18, 2026
716429d
Address 4 new Copilot feedback: add trailing newline, fix test helper…
DyanGalih May 18, 2026
c91aed4
Address 4 new Copilot feedback: make escape function public, fix erro…
DyanGalih May 18, 2026
02026a9
Update error message in test_missing_catalog_file for clarity
DyanGalih May 19, 2026
e231cea
Remove obsolete integrations sync test
DyanGalih May 20, 2026
2020367
keep integrations docs in sync
DyanGalih May 21, 2026
3377fc4
fix: allow prerelease spec-kit versions in compatibility checks
DyanGalih May 24, 2026
057259b
fix: isolate prerelease compatibility gate changes
DyanGalih May 24, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions src/specify_cli/extensions.py
Original file line number Diff line number Diff line change
Expand Up @@ -1112,7 +1112,7 @@ def check_compatibility(
# Parse version specifier (e.g., ">=0.1.0,<2.0.0")
try:
specifier = SpecifierSet(required)
if current not in specifier:
if not specifier.contains(current, prereleases=True):
raise CompatibilityError(
f"Extension requires spec-kit {required}, "
f"but {speckit_version} is installed.\n"
Expand Down Expand Up @@ -1568,7 +1568,7 @@ def version_satisfies(current: str, required: str) -> bool:
try:
current_ver = pkg_version.Version(current)
specifier = SpecifierSet(required)
return current_ver in specifier
return specifier.contains(current_ver, prereleases=True)
except (pkg_version.InvalidVersion, InvalidSpecifier):
return False

Expand Down
2 changes: 1 addition & 1 deletion src/specify_cli/presets.py
Original file line number Diff line number Diff line change
Expand Up @@ -572,7 +572,7 @@ def check_compatibility(

try:
specifier = SpecifierSet(required)
if current not in specifier:
if not specifier.contains(current, prereleases=True):
raise PresetCompatibilityError(
f"Preset requires spec-kit {required}, "
f"but {speckit_version} is installed.\n"
Expand Down
12 changes: 12 additions & 0 deletions tests/test_extensions.py
Original file line number Diff line number Diff line change
Expand Up @@ -750,6 +750,14 @@ def test_check_compatibility_invalid(self, extension_dir, project_dir):
with pytest.raises(CompatibilityError, match="Extension requires spec-kit"):
manager.check_compatibility(manifest, "0.0.1")

def test_check_compatibility_allows_prerelease_builds(self, extension_dir, project_dir):
"""Prerelease spec-kit builds should satisfy compatible version ranges."""
manager = ExtensionManager(project_dir)
manifest = ExtensionManifest(extension_dir / "extension.yml")

result = manager.check_compatibility(manifest, "0.8.8.dev0")
assert result is True

def test_install_from_directory(self, extension_dir, project_dir):
"""Test installing extension from directory."""
manager = ExtensionManager(project_dir)
Expand Down Expand Up @@ -1880,6 +1888,10 @@ def test_version_satisfies_complex(self):
assert version_satisfies("1.0.5", ">=1.0.0,!=1.0.3")
assert not version_satisfies("1.0.3", ">=1.0.0,!=1.0.3")

def test_version_satisfies_prerelease(self):
"""Prerelease builds should satisfy compatible lower bounds."""
assert version_satisfies("0.8.8.dev0", ">=0.2.0")
Comment on lines +1892 to +1893

def test_version_satisfies_invalid(self):
"""Test invalid version strings."""
assert not version_satisfies("invalid", ">=1.0.0")
Expand Down