From a230af3dba01fe0b273b276c04e5472301e95cd8 Mon Sep 17 00:00:00 2001 From: pr-relay Date: Sun, 16 Aug 2026 11:10:31 +0000 Subject: [PATCH] fix: skip literal preflight for git semver ranges --- src/apm_cli/commands/install.py | 7 ++++-- .../commands/test_install_resolve_refs.py | 23 +++++++++++++++++++ 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/src/apm_cli/commands/install.py b/src/apm_cli/commands/install.py index 69da1da8a..6b3981d4b 100644 --- a/src/apm_cli/commands/install.py +++ b/src/apm_cli/commands/install.py @@ -442,8 +442,11 @@ def warning_handler(msg): already_in_deps = identity in existing_identities verbose = bool(logger and logger.verbose) - # An already-known registry identity also skips the probe. - if existing_source_is_registry or should_skip_github_probe_for_dep( + # Semver constraints must be resolved by the git semver resolver before + # any exact-ref probe. Registry-backed identities keep their own check. + if dep_ref.ref_kind == "semver": + package_accessible = True + elif existing_source_is_registry or should_skip_github_probe_for_dep( dep_ref, default_registry ): ref_ok, ref_err = validate_registry_ref(dep_ref) diff --git a/tests/unit/commands/test_install_resolve_refs.py b/tests/unit/commands/test_install_resolve_refs.py index 8846cb3f0..8fb756f40 100644 --- a/tests/unit/commands/test_install_resolve_refs.py +++ b/tests/unit/commands/test_install_resolve_refs.py @@ -183,6 +183,29 @@ def test_existing_unpinned_dependency_is_updated_when_cli_supplies_ref(self, moc assert changed is True assert current_deps == ["danielmeppiel/genesis#v0.4.0"] + @patch("apm_cli.commands.install._validate_package_exists") + @patch("apm_cli.commands.install.DependencyReference") + def test_git_semver_range_skips_literal_ref_preflight(self, mock_dep_cls, mock_validate): + ref = _make_dep_ref( + "owner/repo/packages/skill#>=1.0.0", + "github.com/owner/repo/packages/skill", + ) + ref.ref_kind = "semver" + mock_dep_cls.parse.return_value = ref + mock_dep_cls.is_local_path.return_value = False + _disable_gitlab_direct_probe(mock_dep_cls) + + valid, invalid, validated, _mkt, _entries, _changed = _resolve_package_references( + ["owner/repo/packages/skill#>=1.0.0"], + [], + set(), + ) + + mock_validate.assert_not_called() + assert invalid == [] + assert valid == [("owner/repo/packages/skill#>=1.0.0", False)] + assert validated == ["owner/repo/packages/skill#>=1.0.0"] + class TestResolvePackageReferencesInvalidInput: """Invalid packages must not mutate the identity set."""