{"record":{"id":"bf9b10d3c76928e3","repo":"upstash/context7","slug":"no-skills-installed","errorCode":null,"errorMessage":"No skills installed","messagePattern":"No skills installed","errorType":"console","errorClass":null,"httpStatus":null,"severity":"info","filePath":"packages/cli/src/commands/skill.ts","lineNumber":736,"sourceCode":"      }\n    }\n  }\n\n  if (options.json) {\n    const skills = results.flatMap((result) =>\n      result.skills.map((name) => ({\n        name,\n        path: join(result.dir, name),\n        source: result.source,\n      }))\n    );\n\n    console.log(JSON.stringify({ skills }, null, 2));\n    return;\n  }\n\n  if (results.length === 0) {\n    log.warn(\"No skills installed\");\n    return;\n  }\n\n  log.blank();\n\n  for (const { label, displayPath, skills } of results) {\n    log.plain(`${pc.bold(label)} ${pc.dim(displayPath)}`);\n    for (const skill of skills) {\n      log.plain(`  ${pc.green(skill)}`);\n    }\n    log.blank();\n  }\n}\n\nasync function removeCommand(name: string, options: RemoveOptions): Promise<void> {\n  trackEvent(\"command\", { name: \"remove\" });\n  const target = await promptForSingleTarget(options);\n  if (!target) {","sourceCodeStart":718,"sourceCodeEnd":754,"githubUrl":"https://github.com/upstash/context7/blob/5284672feb575908efead6fcf1b5e542f8d607bb/packages/cli/src/commands/skill.ts#L718-L754","documentation":"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.","triggerScenarios":"`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.","commonSituations":"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.","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)"],"exampleFix":"# before\n$ ctx7 skills list\nNo skills installed\n\n# after\n$ ctx7 skills list --global   # skills were installed with --global earlier","handlingStrategy":"validation","validationCode":"// Before expecting listed skills, verify the target directory has content\nimport { readdir } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nasync function hasInstalledSkills(skillsDir: string): Promise<boolean> {\n  try {\n    const entries = await readdir(skillsDir, { withFileTypes: true });\n    return entries.some((e) => e.isDirectory());\n  } catch {\n    return false; // dir missing -> nothing installed there\n  }\n}\nconst ok = await hasInstalledSkills(join(process.cwd(), \".claude\", \"skills\"));","typeGuard":null,"tryCatchPattern":null,"preventionTips":["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"],"tags":["cli","skills","empty-results","list"],"backgroundTag":"empty-search-results","analyzedSha":"5284672feb575908efead6fcf1b5e542f8d607bb","analyzedAt":"2026-08-18T18:00:18.510Z","schemaVersion":2},"datasetVersion":"2026-08-24T22:17:12.610Z"}