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 = snap

View on GitHub (pinned to 0c42157ee5)

Solutions

  1. Re-run with --project or --global to select the target root
  2. Remove one of the two installations if only one copy is wanted
  3. 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.