|
28 | 28 |
|
29 | 29 | from .._init_options import is_ai_skills_enabled |
30 | 30 | from .._invocation_style import is_dollar_skills_agent, is_slash_skills_agent |
31 | | -from .._utils import dump_frontmatter, relative_extension_path_violation |
| 31 | +from .._utils import dump_frontmatter, relative_extension_path_violation, version_satisfies |
32 | 32 | from ..catalogs import CatalogEntry as BaseCatalogEntry |
33 | 33 | from ..catalogs import CatalogStackBase |
34 | 34 | from ..shared_infra import verify_archive_sha256 |
@@ -1279,20 +1279,21 @@ def check_compatibility( |
1279 | 1279 | CompatibilityError: If extension is incompatible |
1280 | 1280 | """ |
1281 | 1281 | required = manifest.requires_speckit_version |
1282 | | - current = pkg_version.Version(speckit_version) |
1283 | 1282 |
|
1284 | 1283 | # Parse version specifier (e.g., ">=0.1.0,<2.0.0") |
1285 | 1284 | try: |
1286 | | - specifier = SpecifierSet(required) |
1287 | | - if not specifier.contains(current, prereleases=True): |
1288 | | - raise CompatibilityError( |
1289 | | - f"Extension requires spec-kit {required}, " |
1290 | | - f"but {speckit_version} is installed.\n" |
1291 | | - f"Upgrade spec-kit with: {REINSTALL_COMMAND}" |
1292 | | - ) |
| 1285 | + SpecifierSet(required) # Just to validate |
1293 | 1286 | except InvalidSpecifier: |
1294 | 1287 | raise CompatibilityError(f"Invalid version specifier: {required}") |
1295 | 1288 |
|
| 1289 | + if not version_satisfies(speckit_version, required): |
| 1290 | + raise CompatibilityError( |
| 1291 | + f"Extension requires spec-kit {required}, " |
| 1292 | + f"but {speckit_version} is installed.\n" |
| 1293 | + f"Upgrade spec-kit with: {REINSTALL_COMMAND}" |
| 1294 | + ) |
| 1295 | + raise CompatibilityError(f"Invalid version specifier: {required}") |
| 1296 | + |
1296 | 1297 | return True |
1297 | 1298 |
|
1298 | 1299 | def install_from_directory( |
@@ -1871,22 +1872,6 @@ def get_extension(self, extension_id: str) -> Optional[ExtensionManifest]: |
1871 | 1872 | return None |
1872 | 1873 |
|
1873 | 1874 |
|
1874 | | -def version_satisfies(current: str, required: str) -> bool: |
1875 | | - """Check if current version satisfies required version specifier. |
1876 | | -
|
1877 | | - Args: |
1878 | | - current: Current version (e.g., "0.1.5") |
1879 | | - required: Required version specifier (e.g., ">=0.1.0,<2.0.0") |
1880 | | -
|
1881 | | - Returns: |
1882 | | - True if version satisfies requirement |
1883 | | - """ |
1884 | | - try: |
1885 | | - current_ver = pkg_version.Version(current) |
1886 | | - specifier = SpecifierSet(required) |
1887 | | - return specifier.contains(current_ver, prereleases=True) |
1888 | | - except (pkg_version.InvalidVersion, InvalidSpecifier): |
1889 | | - return False |
1890 | 1875 |
|
1891 | 1876 |
|
1892 | 1877 | class CommandRegistrar: |
|
0 commit comments