upstash/context7 · info

No skills installed

Error message

No skills installed

What it means

Emitted by the skills list command when the aggregated `results` array is empty — the CLI scanned every selected IDE/scope skills directory (.claude/skills, .cursor/skills, .agents/skills, ...) and found no installed skills to display. It is a warn-level early return, not a failure: the JSON output branch above it already returned for `--json`, so this is the human-readable 'nothing here yet' path.

Source

Thrown at packages/cli/src/commands/skill.ts:736

      }
    }
  }

  if (options.json) {
    const skills = results.flatMap((result) =>
      result.skills.map((name) => ({
        name,
        path: join(result.dir, name),
        source: result.source,
      }))
    );

    console.log(JSON.stringify({ skills }, null, 2));
    return;
  }

  if (results.length === 0) {
    log.warn("No skills installed");
    return;
  }

  log.blank();

  for (const { label, displayPath, skills } of results) {
    log.plain(`${pc.bold(label)} ${pc.dim(displayPath)}`);
    for (const skill of skills) {
      log.plain(`  ${pc.green(skill)}`);
    }
    log.blank();
  }
}

async function removeCommand(name: string, options: RemoveOptions): Promise<void> {
  trackEvent("command", { name: "remove" });
  const target = await promptForSingleTarget(options);
  if (!target) {

View on GitHub (pinned to 5284672feb)

Solutions

  1. Install something first: `ctx7 skills search <keyword>` then select, or `ctx7 skills add <repo>`
  2. Toggle the scope flag to match reality: try `ctx7 skills list --global` (or without it) and compare
  3. Manually verify the expected directory exists and is non-empty, e.g. `ls .claude/skills` or `ls ~/.agents/skills`
  4. If skills live in an IDE path you did not select, re-run list with that IDE's flag (--claude, --cursor, --universal, --antigravity)

Example fix

# before
$ ctx7 skills list
No skills installed

# after
$ ctx7 skills list --global   # skills were installed with --global earlier
Defensive patterns

Strategy: validation

Validate before calling

// Before expecting listed skills, verify the target directory has content
import { readdir } from "node:fs/promises";
import { join } from "node:path";
async function hasInstalledSkills(skillsDir: string): Promise<boolean> {
  try {
    const entries = await readdir(skillsDir, { withFileTypes: true });
    return entries.some((e) => e.isDirectory());
  } catch {
    return false; // dir missing -> nothing installed there
  }
}
const ok = await hasInstalledSkills(join(process.cwd(), ".claude", "skills"));

Prevention

When it happens

Trigger: `ctx7 skills list` in a fresh project where nothing was ever installed; listing with `--global` while skills were only installed at project scope (or vice versa); passing IDE flags (--claude/--cursor/...) that do not match where the skills actually live.

Common situations: New machine or newly cloned repo before any `ctx7 skills add`; user forgets they installed with --global last time; skills manually placed in a non-standard directory the CLI does not scan.

Related errors


AI-assisted analysis of upstash/context7@5284672feb (2026-08-18). Data as JSON: /api/errors/bf9b10d3c76928e3. Report an issue: GitHub.