Hmbown/CodeWhale · error · anyhow::Error
skill '{name}' exists in both project and global CodeWhale r
Error message
skill '{name}' exists in both project and global CodeWhale roots; specify --project or --global What it means
resolve_owned_skill_by_name found the skill in both the project and the global CodeWhale-owned roots and no explicit scope was given. Mutating would be ambiguous (which copy?), so it refuses and asks the caller to disambiguate. The unscoped name targeting a dual-installed skill is the input at fault.
Source
Thrown at crates/tui/src/skills/mutation.rs:509
&& s.source_kind == SkillSourceKind::CompatibleExternal
}) {
bail!(
"skill '{name}' exists only in a compatible external root; \
import it with /skills (refusing to write external harness directories)"
);
}
bail!("skill '{name}' not found in CodeWhale-owned project/global roots");
}
[only] => {
let DigestState::Known(digest) = &only.digest else {
bail!("skill '{name}' has unknown package digest; refusing mutation");
};
Ok(ResolvedOwnedSkill {
id: only.id.clone(),
digest: digest.clone(),
})
}
_ => bail!(
"skill '{name}' exists in both project and global CodeWhale roots; \
specify --project or --global"
),
}
}
fn find_audited_skill(
ctx: &MutationContext<'_>,
skill_id: &AuditedSkillId,
) -> Result<(AuditedSkill, PathBuf)> {
let snap = scan_with_configured(
ctx.workspace,
ctx.home,
ctx.configured_skills_dir,
SkillAuditMode::Compatible,
None,
);
let skill = snapView on GitHub (pinned to 0c42157ee5)
Solutions
- Re-run with --project or --global to select the target root
- Remove one of the two installations if only one copy is wanted
- Use the skill id for that specific root instead of the bare name
Defensive patterns
Strategy: validation
When it happens
Trigger: Thrown at crates/tui/src/skills/mutation.rs:509 when the library encounters an invalid state.
Common situations: See trigger scenarios.
AI-assisted analysis of Hmbown/CodeWhale@0c42157ee5 (2026-08-20).
Data as JSON: /api/errors/95f27b0ce48d0571.
Report an issue: GitHub.