Hmbown/CodeWhale · error

registry entry for '{name}' must not point to another regist

Error message

registry entry for '{name}' must not point to another registry

What it means

When a registry entry's own source string parses back into another Registry source, candidate_urls bails to prevent install/update cycles. Registry indirection is capped at one level by design: an entry must resolve to a GitHub repo or a direct URL. This is a registry data error, not client configuration.

Source

Thrown at crates/tui/src/skills/install.rs:1070

        InstallSource::DirectUrl(url) => Ok(UrlResolution::Resolved(vec![url.clone()])),
        InstallSource::Registry(name) => {
            match fetch_registry(network, registry_url).await? {
                RegistryFetchResult::Loaded(doc) => {
                    let entry = doc
                        .skills
                        .get(name)
                        .with_context(|| format!("skill '{name}' not found in registry"))?
                        .clone();
                    let inner = InstallSource::parse(&entry.source).with_context(|| {
                        format!(
                            "registry entry for '{name}' has invalid source: {}",
                            entry.source
                        )
                    })?;
                    // Recurse only one level — registry pointing at registry is
                    // disallowed to avoid cycles.
                    if matches!(inner, InstallSource::Registry(_)) {
                        bail!("registry entry for '{name}' must not point to another registry");
                    }
                    // Reuse this function for the inner source so GitHub fallback
                    // still applies.
                    Box::pin(candidate_urls(&inner, network, registry_url)).await
                }
                RegistryFetchResult::NeedsApproval(host) => Ok(UrlResolution::NeedsApproval(host)),
                RegistryFetchResult::Denied(host) => Ok(UrlResolution::Denied(host)),
            }
        }
    }
}

/// Download the first URL whose host the policy allows and which returns 2xx.
/// Returns `NeedsApproval` if every candidate hit `Prompt`, or `Denied` if every
/// candidate was denied.
async fn download_first_success(
    urls: &[String],
    network: &NetworkPolicy,

View on GitHub (pinned to 0c42157ee5)

Solutions

  1. Fix the registry entry's source to a concrete 'github:owner/repo' or https URL; the fix belongs in the registry data.
  2. If you operate the registry, lint entries by parsing each source and rejecting Registry-typed results.
  3. As an end user, install the underlying GitHub repo directly and skip the broken entry.

Example fix

# registry entry (before)
{"name": "pack", "source": "other-registry-name"}

# after
{"name": "pack", "source": "github:owner/pack"}
Defensive patterns

Strategy: try-catch

Type guard

fn registry_entry_is_concrete(entry: &RegistryEntry) -> bool {
    !matches!(
        InstallSource::parse(&entry.source),
        Ok(InstallSource::Registry(_))
    )
}

Try / catch

match skills::install::install(&spec, &skills_dir, &network).await {
    Err(err) if err.to_string().contains("must not point to another registry") => {
        // registry data bug: install the underlying repo directly instead
    }
    other => other?,
}

Prevention

When it happens

Trigger: The registry index contains an entry whose source field is a bare name (parsed as Registry) or another registry-style spec instead of 'github:...' or 'https://...'. Installing that entry fails right after the index is fetched.

Common situations: Registry authors nesting references expecting recursive resolution, URLs that lost their scheme and fell back to Registry classification in InstallSource::parse, and third-party registry forks with experimental entries.

Related errors


AI-assisted analysis of Hmbown/CodeWhale@0c42157ee5 (2026-08-20). Data as JSON: /api/errors/b3cdb209c4d94df9. Report an issue: GitHub.