Update extension(s) to latest version.
(
extension: str = typer.Argument(None, help="Extension ID or name to update (or all)"),
)
| 999 | |
| 1000 | @extension_app.command("update") |
| 1001 | def extension_update( |
| 1002 | extension: str = typer.Argument(None, help="Extension ID or name to update (or all)"), |
| 1003 | ): |
| 1004 | """Update extension(s) to latest version.""" |
| 1005 | from . import ( |
| 1006 | ExtensionManager, |
| 1007 | ExtensionCatalog, |
| 1008 | ExtensionError, |
| 1009 | ValidationError, |
| 1010 | CommandRegistrar, |
| 1011 | HookExecutor, |
| 1012 | normalize_priority, |
| 1013 | ) |
| 1014 | from packaging import version as pkg_version |
| 1015 | |
| 1016 | project_root = _require_specify_project() |
| 1017 | manager = ExtensionManager(project_root) |
| 1018 | catalog = ExtensionCatalog(project_root) |
| 1019 | speckit_version = get_speckit_version() |
| 1020 | |
| 1021 | try: |
| 1022 | # Get list of extensions to update |
| 1023 | installed = manager.list_installed() |
| 1024 | if extension: |
| 1025 | # Update specific extension - resolve ID from argument (handles ambiguous names) |
| 1026 | extension_id, _ = _resolve_installed_extension(extension, installed, "update") |
| 1027 | extensions_to_update = [extension_id] |
| 1028 | else: |
| 1029 | # Update all extensions |
| 1030 | extensions_to_update = [ext["id"] for ext in installed] |
| 1031 | |
| 1032 | if not extensions_to_update: |
| 1033 | console.print("[yellow]No extensions installed[/yellow]") |
| 1034 | raise typer.Exit(0) |
| 1035 | |
| 1036 | console.print("🔄 Checking for updates...\n") |
| 1037 | |
| 1038 | updates_available = [] |
| 1039 | |
| 1040 | for ext_id in extensions_to_update: |
| 1041 | safe_ext_id = _escape_markup(str(ext_id)) |
| 1042 | # Get installed version |
| 1043 | metadata = manager.registry.get(ext_id) |
| 1044 | if metadata is None or not isinstance(metadata, dict) or "version" not in metadata: |
| 1045 | console.print(f"⚠ {safe_ext_id}: Registry entry corrupted or missing (skipping)") |
| 1046 | continue |
| 1047 | try: |
| 1048 | installed_version = pkg_version.Version(metadata["version"]) |
| 1049 | except pkg_version.InvalidVersion: |
| 1050 | console.print( |
| 1051 | f"⚠ {safe_ext_id}: Invalid installed version '{_escape_markup(str(metadata.get('version')))}' in registry (skipping)" |
| 1052 | ) |
| 1053 | continue |
| 1054 | |
| 1055 | # Get catalog info |
| 1056 | ext_info = catalog.get_extension_info(ext_id) |
| 1057 | if not ext_info: |
| 1058 | console.print(f"⚠ {safe_ext_id}: Not found in catalog (skipping)") |
nothing calls this directly
no test coverage detected