diff --git a/src/specify_cli/extensions.py b/src/specify_cli/extensions.py index 871503f0ae..172f54718d 100644 --- a/src/specify_cli/extensions.py +++ b/src/specify_cli/extensions.py @@ -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" @@ -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 diff --git a/src/specify_cli/presets.py b/src/specify_cli/presets.py index c6e75ae790..74c7303ad2 100644 --- a/src/specify_cli/presets.py +++ b/src/specify_cli/presets.py @@ -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" diff --git a/tests/test_extensions.py b/tests/test_extensions.py index 153388a541..9835bee61f 100644 --- a/tests/test_extensions.py +++ b/tests/test_extensions.py @@ -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) @@ -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") + def test_version_satisfies_invalid(self): """Test invalid version strings.""" assert not version_satisfies("invalid", ">=1.0.0")