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
- Fix the registry entry's source to a concrete 'github:owner/repo' or https URL; the fix belongs in the registry data.
- If you operate the registry, lint entries by parsing each source and rejecting Registry-typed results.
- 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
- If you publish a registry, lint every entry's source field with InstallSource::parse.
- Registry entries must carry 'github:owner/repo' or full https URLs, never bare names.
- Report nested-registry entries to the registry maintainer instead of working around them client-side.
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
- skill '{name}' was imported locally (spec '{}') and cannot b
- invalid registry url: {registry_url}
- registry source '{name}' cannot be fetched as a plain tarbal
- install source must not be empty
- github source must be 'github:owner/repo' (got {spec})
AI-assisted analysis of Hmbown/CodeWhale@0c42157ee5 (2026-08-20).
Data as JSON: /api/errors/b3cdb209c4d94df9.
Report an issue: GitHub.