EveryInc/compound-engineering-plugin · error · Error

No Codex skills were found under ${skillsRoot}

Error message

No Codex skills were found under ${skillsRoot}

What it means

After resolving the repo root, resolveCodexDevContext enumerates skills under <repoRoot>/skills via listSkills and requires at least one. If none are found it throws with the skills root in the message. The workflow has nothing to link otherwise, so an empty collection is treated as a broken checkout rather than a no-op.

Source

Thrown at src/dev/codex-dev.ts:214

  )
  const branchValue = trim(
    await checkedRun(runner, "git", ["branch", "--show-current"], { cwd: repoRoot, env }),
  )
  const head = trim(await checkedRun(runner, "git", ["rev-parse", "HEAD"], { cwd: repoRoot, env }))
  const status = trim(
    await checkedRun(runner, "git", ["status", "--porcelain=v1", "--untracked-files=all"], {
      cwd: repoRoot,
      env,
    }),
  )
  const lines = status ? status.split("\n") : []
  const untrackedCount = lines.filter((line) => line.startsWith("?? ")).length
  const modifiedCount = lines.length - untrackedCount

  const codexHome = resolveHomePath(env.CODEX_HOME || path.join(home, ".codex"), home)
  const skillsRoot = path.join(repoRoot, "skills")
  const skillNames = await listSkills(skillsRoot)
  if (skillNames.length === 0) throw new Error(`No Codex skills were found under ${skillsRoot}`)

  return {
    repoRoot,
    skillsRoot,
    codexHome,
    collectionPath: path.join(codexHome, "skills", "compound-engineering-local"),
    gitDir: path.resolve(gitDir),
    gitCommonDir: path.resolve(gitCommonDir),
    linkedWorktree: path.resolve(gitDir) !== path.resolve(gitCommonDir),
    branch: branchValue || null,
    head,
    modifiedCount,
    untrackedCount,
    skillNames,
    env: { ...env, CODEX_HOME: codexHome },
  }
}

View on GitHub (pinned to c9c10f8c75)

Solutions

  1. List what is actually there: ls skills/ — confirm it is empty or missing SKILL.md entries.
  2. Restore the skills directory: git restore skills/ or git submodule update --init if skills is a submodule.
  3. Re-clone the repository if the checkout is incomplete.
  4. git clean -xdn first to see if git clean removed them, then recover accordingly.

Example fix

// before
skills/          // empty
// after
git checkout main -- skills/ && ls skills/
ce-brainstorm/ ce-plan/ ...   // skill dirs restored
Defensive patterns

Strategy: validation

Validate before calling

import { readdir } from "node:fs/promises"
const entries = await readdir("skills", { withFileTypes: true })
if (!entries.some((e) => e.isDirectory())) {
  throw new Error("skills/ is empty — restore it: git restore skills/ or git submodule update --init")
}

Try / catch

try {
  await resolveCodexDevContext(cwd)
} catch (error) {
  if ((error as Error).message.startsWith("No Codex skills were found under")) {
    console.error("Checkout is incomplete; restore the skills/ directory from git")
  } else throw error
}

Prevention

When it happens

Trigger: The skills/ directory at the repo root is empty, contains no subdirectories that listSkills counts (e.g. none with SKILL.md if that is its criterion), or listSkills fails to see entries — thrown at src/dev/codex-dev.ts:214.

Common situations: A fresh or partially cloned checkout where skills/ is an empty submodule or was cleaned by git clean -fd; a worktree where untracked skill directories were never checked out; an experiment that moved all skills elsewhere.

Related errors


AI-assisted analysis of EveryInc/compound-engineering-plugin@c9c10f8c75 (2026-08-31). Data as JSON: /api/errors/7e05cc093d70ffe6. Report an issue: GitHub.