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
- Install something first: `ctx7 skills search <keyword>` then select, or `ctx7 skills add <repo>`
- Toggle the scope flag to match reality: try `ctx7 skills list --global` (or without it) and compare
- Manually verify the expected directory exists and is non-empty, e.g. `ls .claude/skills` or `ls ~/.agents/skills`
- 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
- Remember which scope you installed with — --global vs project lists different trees
- Pass the same IDE flags to list that you used for install
- Treat 'No skills installed' as an empty result, not a failure; branch your scripting on empty output
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
- No skills found in ${repo}
- No skills found matching "${query}"
- No matching skills found for your dependencies
- This skill contains potentially malicious content and cannot
- Review other skills from this repository carefully before in
AI-assisted analysis of upstash/context7@5284672feb (2026-08-18).
Data as JSON: /api/errors/bf9b10d3c76928e3.
Report an issue: GitHub.