zeroclaw-labs/zeroclaw · error · anyhow::Error

Skill source must be a directory: {}

Error message

Skill source must be a directory: {}

What it means

Error "Skill source must be a directory: {}" thrown in zeroclaw-labs/zeroclaw.

Source

Thrown at crates/zeroclaw-runtime/src/skills/audit.rs:48

    }
}

pub fn audit_skill_directory(skill_dir: &Path) -> Result<SkillAuditReport> {
    audit_skill_directory_with_options(skill_dir, SkillAuditOptions::default())
}

pub fn audit_skill_directory_with_options(
    skill_dir: &Path,
    options: SkillAuditOptions,
) -> Result<SkillAuditReport> {
    if !skill_dir.exists() {
        bail!(
            "Skill source does not exist: {}",
            skill_dir.display().to_string()
        );
    }
    if !skill_dir.is_dir() {
        bail!(
            "Skill source must be a directory: {}",
            skill_dir.display().to_string()
        );
    }

    let canonical_root = skill_dir
        .canonicalize()
        .with_context(|| format!("failed to canonicalize {}", skill_dir.display().to_string()))?;
    let mut report = SkillAuditReport::default();

    let has_canonical = canonical_root.join(SKILL_MANIFEST_FILENAME).is_file();
    let has_deprecated = SKILL_DEPRECATED_MANIFESTS
        .iter()
        .any(|name| canonical_root.join(name).is_file());
    if !has_canonical && !has_deprecated {
        report.findings.push(format!(
            "Skill root must include {SKILL_MANIFEST_FILENAME} (canonical) or one of {SKILL_DEPRECATED_MANIFESTS:?} (deprecated) for deterministic auditing.",
        ));

View on GitHub (pinned to 88bb9c8533)

Solutions

  1. Point the skill source at a directory containing SKILL.md, not a file.

When it happens

Trigger: Thrown at crates/zeroclaw-runtime/src/skills/audit.rs:48 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of zeroclaw-labs/zeroclaw@88bb9c8533 (2026-08-23). Data as JSON: /api/errors/9e5283b7fe5768c4. Report an issue: GitHub.