ctx7 0.1.3 → 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -481,7 +481,12 @@ async function installCommand(input, skillName, options) {
481
481
  spinner.text = `Fetching skill: ${skillName}...`;
482
482
  const skillData = await getSkill(repo, skillName);
483
483
  if (skillData.error || !skillData.name) {
484
- spinner.fail(pc3.red(`Skill not found: ${skillName}`));
484
+ if (skillData.error === "prompt_injection_detected") {
485
+ spinner.fail(pc3.red(`Prompt injection detected in skill: ${skillName}`));
486
+ log.warn("This skill contains potentially malicious content and cannot be installed.");
487
+ } else {
488
+ spinner.fail(pc3.red(`Skill not found: ${skillName}`));
489
+ }
485
490
  return;
486
491
  }
487
492
  spinner.succeed(`Found skill: ${skillName}`);
@@ -504,11 +509,17 @@ async function installCommand(input, skillName, options) {
504
509
  return;
505
510
  }
506
511
  const skillsWithRepo = data.skills.map((s) => ({ ...s, project: repo }));
512
+ spinner.succeed(`Found ${data.skills.length} skill(s)`);
513
+ if (data.blockedSkillsCount && data.blockedSkillsCount > 0) {
514
+ log.blank();
515
+ log.error(
516
+ `${data.blockedSkillsCount} skill(s) blocked due to prompt injection and not shown.`
517
+ );
518
+ log.warn("Review other skills from this repository carefully before installing.");
519
+ }
507
520
  if (options.all || data.skills.length === 1) {
508
- spinner.succeed(`Found ${data.skills.length} skill(s)`);
509
521
  selectedSkills = skillsWithRepo;
510
522
  } else {
511
- spinner.succeed(`Found ${data.skills.length} skill(s)`);
512
523
  const maxNameLen = Math.min(25, Math.max(...data.skills.map((s) => s.name.length)));
513
524
  const choices = skillsWithRepo.map((s) => {
514
525
  const paddedName = s.name.padEnd(maxNameLen);
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/commands/skill.ts","../src/utils/parse-input.ts","../src/utils/github.ts","../src/utils/api.ts","../src/utils/logger.ts","../src/utils/ide.ts","../src/types.ts","../src/utils/installer.ts","../src/constants.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport pc from \"picocolors\";\nimport figlet from \"figlet\";\nimport { registerSkillCommands, registerSkillAliases } from \"./commands/skill.js\";\nimport { setBaseUrl } from \"./utils/api.js\";\nimport { VERSION } from \"./constants.js\";\n\nconst brand = {\n primary: pc.green,\n dim: pc.dim,\n};\n\nconst program = new Command();\n\nprogram\n .name(\"ctx7\")\n .description(\"Context7 CLI - Manage AI coding skills and documentation context\")\n .version(VERSION)\n .option(\"--base-url <url>\")\n .hook(\"preAction\", (thisCommand) => {\n const opts = thisCommand.opts();\n if (opts.baseUrl) {\n setBaseUrl(opts.baseUrl);\n }\n })\n .addHelpText(\n \"after\",\n `\nExamples:\n ${brand.dim(\"# Search for skills\")}\n ${brand.primary(\"npx ctx7 skills search pdf\")}\n ${brand.primary(\"npx ctx7 skills search react hooks\")}\n\n ${brand.dim(\"# Install from a repository\")}\n ${brand.primary(\"npx ctx7 skills install /anthropics/skills\")}\n ${brand.primary(\"npx ctx7 skills install /anthropics/skills pdf\")}\n\n ${brand.dim(\"# Install to specific client\")}\n ${brand.primary(\"npx ctx7 skills install /anthropics/skills --cursor\")}\n ${brand.primary(\"npx ctx7 skills install /anthropics/skills --global\")}\n\n ${brand.dim(\"# List and manage installed skills\")}\n ${brand.primary(\"npx ctx7 skills list --claude\")}\n ${brand.primary(\"npx ctx7 skills remove pdf\")}\n\nVisit ${brand.primary(\"https://context7.com\")} to browse skills\n`\n );\n\nregisterSkillCommands(program);\nregisterSkillAliases(program);\n\nprogram.action(() => {\n console.log(\"\");\n const banner = figlet.textSync(\"Context7\", { font: \"ANSI Shadow\" });\n console.log(brand.primary(banner));\n console.log(brand.dim(\" The open agent skills ecosystem\"));\n console.log(\"\");\n\n console.log(\" Quick start:\");\n console.log(` ${brand.primary(\"npx ctx7 skills search pdf\")}`);\n console.log(` ${brand.primary(\"npx ctx7 skills install /anthropics/skills\")}`);\n console.log(\"\");\n\n console.log(` Run ${brand.primary(\"npx ctx7 --help\")} for all commands and options`);\n console.log(` Visit ${brand.primary(\"https://context7.com\")} to browse skills`);\n console.log(\"\");\n});\n\nprogram.parse();\n","import { Command } from \"commander\";\nimport pc from \"picocolors\";\nimport { checkbox } from \"@inquirer/prompts\";\nimport ora from \"ora\";\nimport { readdir, rm } from \"fs/promises\";\nimport { join } from \"path\";\n\nimport { parseSkillInput } from \"../utils/parse-input.js\";\nimport {\n listProjectSkills,\n searchSkills,\n downloadSkill,\n getSkill,\n trackInstalls,\n} from \"../utils/api.js\";\nimport { log } from \"../utils/logger.js\";\nimport {\n promptForInstallTargets,\n promptForSingleTarget,\n getTargetDirs,\n getTargetDirFromSelection,\n} from \"../utils/ide.js\";\nimport { installSkillFiles, symlinkSkill } from \"../utils/installer.js\";\nimport type {\n Skill,\n SkillSearchResult,\n AddOptions,\n ListOptions,\n RemoveOptions,\n InstallTargets,\n} from \"../types.js\";\nimport { IDE_NAMES } from \"../types.js\";\n\nfunction logInstallSummary(\n targets: InstallTargets,\n targetDirs: string[],\n skillNames: string[]\n): void {\n log.blank();\n let dirIndex = 0;\n for (const ide of targets.ides) {\n for (let i = 0; i < targets.scopes.length; i++) {\n const dir = targetDirs[dirIndex++];\n log.dim(`${IDE_NAMES[ide]}: ${dir}`);\n for (const name of skillNames) {\n log.itemAdd(name);\n }\n }\n }\n log.blank();\n}\n\nexport function registerSkillCommands(program: Command): void {\n const skill = program.command(\"skills\").alias(\"skill\").description(\"Manage AI coding skills\");\n\n skill\n .command(\"install\")\n .alias(\"i\")\n .alias(\"add\")\n .argument(\"<repository>\", \"GitHub repository (/owner/repo)\")\n .argument(\"[skill]\", \"Specific skill name to install\")\n .option(\"--all\", \"Install all skills without prompting\")\n .option(\"--global\", \"Install globally instead of current directory\")\n .option(\"--claude\", \"Claude Code (.claude/skills/)\")\n .option(\"--cursor\", \"Cursor (.cursor/skills/)\")\n .option(\"--codex\", \"Codex (.codex/skills/)\")\n .option(\"--opencode\", \"OpenCode (.opencode/skills/)\")\n .option(\"--amp\", \"Amp (.agents/skills/)\")\n .option(\"--antigravity\", \"Antigravity (.agent/skills/)\")\n .description(\"Install skills from a repository\")\n .action(async (project: string, skillName: string | undefined, options: AddOptions) => {\n await installCommand(project, skillName, options);\n });\n\n skill\n .command(\"search\")\n .alias(\"s\")\n .argument(\"<keywords...>\", \"Search keywords\")\n .description(\"Search for skills across all indexed repositories\")\n .action(async (keywords: string[]) => {\n await searchCommand(keywords.join(\" \"));\n });\n\n skill\n .command(\"list\")\n .alias(\"ls\")\n .option(\"--global\", \"List global skills\")\n .option(\"--claude\", \"Claude Code (.claude/skills/)\")\n .option(\"--cursor\", \"Cursor (.cursor/skills/)\")\n .option(\"--codex\", \"Codex (.codex/skills/)\")\n .option(\"--opencode\", \"OpenCode (.opencode/skills/)\")\n .option(\"--amp\", \"Amp (.agents/skills/)\")\n .option(\"--antigravity\", \"Antigravity (.agent/skills/)\")\n .description(\"List installed skills\")\n .action(async (options: ListOptions) => {\n await listCommand(options);\n });\n\n skill\n .command(\"remove\")\n .alias(\"rm\")\n .alias(\"delete\")\n .argument(\"<name>\", \"Skill name to remove\")\n .option(\"--global\", \"Remove from global skills\")\n .option(\"--claude\", \"Claude Code (.claude/skills/)\")\n .option(\"--cursor\", \"Cursor (.cursor/skills/)\")\n .option(\"--codex\", \"Codex (.codex/skills/)\")\n .option(\"--opencode\", \"OpenCode (.opencode/skills/)\")\n .option(\"--amp\", \"Amp (.agents/skills/)\")\n .option(\"--antigravity\", \"Antigravity (.agent/skills/)\")\n .description(\"Remove an installed skill\")\n .action(async (name: string, options: RemoveOptions) => {\n await removeCommand(name, options);\n });\n\n skill\n .command(\"info\")\n .argument(\"<repository>\", \"GitHub repository (/owner/repo)\")\n .description(\"Show skills in a repository\")\n .action(async (project: string) => {\n await infoCommand(project);\n });\n}\n\nexport function registerSkillAliases(program: Command): void {\n program\n .command(\"si\", { hidden: true })\n .argument(\"<repository>\", \"GitHub repository (/owner/repo)\")\n .argument(\"[skill]\", \"Specific skill name to install\")\n .option(\"--all\", \"Install all skills without prompting\")\n .option(\"--global\", \"Install globally instead of current directory\")\n .option(\"--claude\", \"Claude Code (.claude/skills/)\")\n .option(\"--cursor\", \"Cursor (.cursor/skills/)\")\n .option(\"--codex\", \"Codex (.codex/skills/)\")\n .option(\"--opencode\", \"OpenCode (.opencode/skills/)\")\n .option(\"--amp\", \"Amp (.agents/skills/)\")\n .option(\"--antigravity\", \"Antigravity (.agent/skills/)\")\n .description(\"Install skills (alias for: skills install)\")\n .action(async (project: string, skillName: string | undefined, options: AddOptions) => {\n await installCommand(project, skillName, options);\n });\n\n program\n .command(\"ss\", { hidden: true })\n .argument(\"<keywords...>\", \"Search keywords\")\n .description(\"Search for skills (alias for: skills search)\")\n .action(async (keywords: string[]) => {\n await searchCommand(keywords.join(\" \"));\n });\n}\n\nasync function installCommand(\n input: string,\n skillName: string | undefined,\n options: AddOptions\n): Promise<void> {\n const parsed = parseSkillInput(input);\n if (!parsed) {\n log.error(`Invalid input format: ${input}`);\n log.info(`Expected: /owner/repo or full GitHub URL`);\n log.info(`Example: ctx7 skills install /anthropics/skills pdf`);\n log.blank();\n return;\n }\n const repo = `/${parsed.owner}/${parsed.repo}`;\n\n log.blank();\n const spinner = ora(`Fetching skills from ${repo}...`).start();\n\n let selectedSkills: (Skill & { project: string })[];\n\n // When a specific skill name is provided, fetch only that skill\n if (skillName) {\n spinner.text = `Fetching skill: ${skillName}...`;\n const skillData = await getSkill(repo, skillName);\n\n if (skillData.error || !skillData.name) {\n spinner.fail(pc.red(`Skill not found: ${skillName}`));\n return;\n }\n\n spinner.succeed(`Found skill: ${skillName}`);\n selectedSkills = [\n {\n name: skillData.name,\n description: skillData.description,\n url: skillData.url,\n project: repo,\n },\n ];\n } else {\n // Fetch all skills when no specific names provided\n const data = await listProjectSkills(repo);\n\n if (data.error) {\n spinner.fail(pc.red(`Error: ${data.message || data.error}`));\n return;\n }\n\n if (!data.skills || data.skills.length === 0) {\n spinner.warn(pc.yellow(`No skills found in ${repo}`));\n return;\n }\n\n const skillsWithRepo = data.skills.map((s) => ({ ...s, project: repo }));\n\n if (options.all || data.skills.length === 1) {\n spinner.succeed(`Found ${data.skills.length} skill(s)`);\n selectedSkills = skillsWithRepo;\n } else {\n spinner.succeed(`Found ${data.skills.length} skill(s)`);\n const maxNameLen = Math.min(25, Math.max(...data.skills.map((s) => s.name.length)));\n const choices = skillsWithRepo.map((s) => {\n const paddedName = s.name.padEnd(maxNameLen);\n const desc = s.description?.trim()\n ? s.description.slice(0, 60) + (s.description.length > 60 ? \"...\" : \"\")\n : \"\";\n\n return {\n name: desc ? `${paddedName} ${pc.dim(desc)}` : s.name,\n value: s,\n };\n });\n\n log.blank();\n\n try {\n selectedSkills = await checkbox({\n message: \"Select skills:\",\n choices,\n pageSize: 15,\n theme: {\n style: {\n renderSelectedChoices: (selected: Array<{ name?: string; value: unknown }>) =>\n selected.map((c) => (c.value as { name: string }).name).join(\", \"),\n },\n },\n });\n } catch {\n log.warn(\"Installation cancelled\");\n return;\n }\n }\n }\n\n if (selectedSkills.length === 0) {\n log.warn(\"No skills selected\");\n return;\n }\n\n const targets = await promptForInstallTargets(options);\n if (!targets) {\n log.warn(\"Installation cancelled\");\n return;\n }\n\n const targetDirs = getTargetDirs(targets);\n\n const installSpinner = ora(\"Installing skills...\").start();\n\n let permissionError = false;\n const failedDirs: Set<string> = new Set();\n const installedSkills: string[] = [];\n\n for (const skill of selectedSkills) {\n try {\n installSpinner.text = `Downloading ${skill.name}...`;\n const downloadData = await downloadSkill(skill.project, skill.name);\n\n if (downloadData.error) {\n log.warn(`Failed to download ${skill.name}: ${downloadData.error}`);\n continue;\n }\n\n installSpinner.text = `Installing ${skill.name}...`;\n\n const [primaryDir, ...symlinkDirs] = targetDirs;\n\n try {\n await installSkillFiles(skill.name, downloadData.files, primaryDir);\n } catch (dirErr) {\n const error = dirErr as NodeJS.ErrnoException;\n if (error.code === \"EACCES\" || error.code === \"EPERM\") {\n permissionError = true;\n failedDirs.add(primaryDir);\n }\n throw dirErr;\n }\n\n const primarySkillDir = join(primaryDir, skill.name);\n for (const targetDir of symlinkDirs) {\n try {\n await symlinkSkill(skill.name, primarySkillDir, targetDir);\n } catch (dirErr) {\n const error = dirErr as NodeJS.ErrnoException;\n if (error.code === \"EACCES\" || error.code === \"EPERM\") {\n permissionError = true;\n failedDirs.add(targetDir);\n }\n throw dirErr;\n }\n }\n\n installedSkills.push(`${skill.project}/${skill.name}`);\n } catch (err) {\n const error = err as NodeJS.ErrnoException;\n if (error.code === \"EACCES\" || error.code === \"EPERM\") {\n continue;\n }\n const errMsg = err instanceof Error ? err.message : String(err);\n log.warn(`Failed to install ${skill.name}: ${errMsg}`);\n }\n }\n\n if (permissionError) {\n installSpinner.fail(\"Permission denied\");\n log.blank();\n log.warn(\"Fix permissions with:\");\n for (const dir of failedDirs) {\n const parentDir = join(dir, \"..\");\n log.dim(` sudo chown -R $(whoami) \"${parentDir}\"`);\n }\n log.blank();\n return;\n }\n\n installSpinner.succeed(`Installed ${installedSkills.length} skill(s)`);\n trackInstalls(installedSkills, targets.ides);\n\n const installedNames = selectedSkills.map((s) => s.name);\n logInstallSummary(targets, targetDirs, installedNames);\n}\n\nasync function searchCommand(query: string): Promise<void> {\n log.blank();\n const spinner = ora(`Searching for \"${query}\"...`).start();\n\n let data;\n try {\n data = await searchSkills(query);\n } catch (err) {\n spinner.fail(pc.red(`Error: ${err instanceof Error ? err.message : String(err)}`));\n return;\n }\n\n if (data.error) {\n spinner.fail(pc.red(`Error: ${data.message || data.error}`));\n return;\n }\n\n if (!data.results || data.results.length === 0) {\n spinner.warn(pc.yellow(`No skills found matching \"${query}\"`));\n return;\n }\n\n spinner.succeed(`Found ${data.results.length} skill(s)`);\n\n const maxNameLen = Math.min(25, Math.max(...data.results.map((s) => s.name.length)));\n const choices = data.results.map((s) => {\n const paddedName = s.name.padEnd(maxNameLen);\n const repoName = pc.dim(`(${s.project})`);\n const desc = s.description?.trim()\n ? s.description.slice(0, 50) + (s.description.length > 50 ? \"...\" : \"\")\n : \"\";\n\n return {\n name: desc ? `${paddedName} ${repoName} ${pc.dim(desc)}` : `${paddedName} ${repoName}`,\n value: s,\n };\n });\n\n log.blank();\n\n let selectedSkills: SkillSearchResult[];\n try {\n selectedSkills = await checkbox({\n message: \"Select skills to install:\",\n choices,\n pageSize: 15,\n theme: {\n style: {\n renderSelectedChoices: (selected: Array<{ name?: string; value: unknown }>) =>\n selected.map((c) => (c.value as SkillSearchResult).name).join(\", \"),\n },\n },\n });\n } catch {\n log.warn(\"Installation cancelled\");\n return;\n }\n\n const uniqueSkills = selectedSkills;\n\n if (uniqueSkills.length === 0) {\n log.warn(\"No skills selected\");\n return;\n }\n\n const targets = await promptForInstallTargets({});\n if (!targets) {\n log.warn(\"Installation cancelled\");\n return;\n }\n\n const targetDirs = getTargetDirs(targets);\n\n const installSpinner = ora(\"Installing skills...\").start();\n\n let permissionError = false;\n const failedDirs: Set<string> = new Set();\n const installedSkills: string[] = [];\n\n for (const skill of uniqueSkills) {\n try {\n installSpinner.text = `Downloading ${skill.name}...`;\n const downloadData = await downloadSkill(skill.project, skill.name);\n\n if (downloadData.error) {\n log.warn(`Failed to download ${skill.name}: ${downloadData.error}`);\n continue;\n }\n\n installSpinner.text = `Installing ${skill.name}...`;\n\n const [primaryDir, ...symlinkDirs] = targetDirs;\n\n try {\n await installSkillFiles(skill.name, downloadData.files, primaryDir);\n } catch (dirErr) {\n const error = dirErr as NodeJS.ErrnoException;\n if (error.code === \"EACCES\" || error.code === \"EPERM\") {\n permissionError = true;\n failedDirs.add(primaryDir);\n }\n throw dirErr;\n }\n\n const primarySkillDir = join(primaryDir, skill.name);\n for (const targetDir of symlinkDirs) {\n try {\n await symlinkSkill(skill.name, primarySkillDir, targetDir);\n } catch (dirErr) {\n const error = dirErr as NodeJS.ErrnoException;\n if (error.code === \"EACCES\" || error.code === \"EPERM\") {\n permissionError = true;\n failedDirs.add(targetDir);\n }\n throw dirErr;\n }\n }\n\n installedSkills.push(`${skill.project}/${skill.name}`);\n } catch (err) {\n const error = err as NodeJS.ErrnoException;\n if (error.code === \"EACCES\" || error.code === \"EPERM\") {\n continue;\n }\n const errMsg = err instanceof Error ? err.message : String(err);\n log.warn(`Failed to install ${skill.name}: ${errMsg}`);\n }\n }\n\n if (permissionError) {\n installSpinner.fail(\"Permission denied\");\n log.blank();\n log.warn(\"Fix permissions with:\");\n for (const dir of failedDirs) {\n const parentDir = join(dir, \"..\");\n log.dim(` sudo chown -R $(whoami) \"${parentDir}\"`);\n }\n log.blank();\n return;\n }\n\n installSpinner.succeed(`Installed ${installedSkills.length} skill(s)`);\n trackInstalls(installedSkills, targets.ides);\n\n const installedNames = uniqueSkills.map((s) => s.name);\n logInstallSummary(targets, targetDirs, installedNames);\n}\n\nasync function listCommand(options: ListOptions): Promise<void> {\n const target = await promptForSingleTarget(options);\n if (!target) {\n log.warn(\"Cancelled\");\n return;\n }\n\n const skillsDir = getTargetDirFromSelection(target.ide, target.scope);\n\n try {\n const entries = await readdir(skillsDir, { withFileTypes: true });\n const skillFolders = entries.filter((e) => e.isDirectory() || e.isSymbolicLink());\n\n if (skillFolders.length === 0) {\n log.warn(`No skills installed in ${skillsDir}`);\n return;\n }\n\n log.info(`\\n◆ Installed skills (${skillsDir}):`);\n\n for (const folder of skillFolders) {\n log.item(folder.name);\n }\n\n log.success(`${skillFolders.length} skill(s) installed\\n`);\n } catch {\n log.warn(`No skills directory found at ${skillsDir}`);\n }\n}\n\nasync function removeCommand(name: string, options: RemoveOptions): Promise<void> {\n const target = await promptForSingleTarget(options);\n if (!target) {\n log.warn(\"Cancelled\");\n return;\n }\n\n const skillsDir = getTargetDirFromSelection(target.ide, target.scope);\n const skillPath = join(skillsDir, name);\n\n try {\n await rm(skillPath, { recursive: true });\n log.success(`Removed skill: ${name}`);\n } catch (err) {\n const error = err as NodeJS.ErrnoException;\n if (error.code === \"ENOENT\") {\n log.error(`Skill not found: ${name}`);\n } else if (error.code === \"EACCES\" || error.code === \"EPERM\") {\n log.error(`Permission denied. Try: sudo rm -rf \"${skillPath}\"`);\n } else {\n log.error(`Failed to remove skill: ${error.message}`);\n }\n }\n}\n\nasync function infoCommand(input: string): Promise<void> {\n const parsed = parseSkillInput(input);\n if (!parsed) {\n log.blank();\n log.error(`Invalid input format: ${input}`);\n log.info(`Expected: /owner/repo or full GitHub URL`);\n log.blank();\n return;\n }\n const repo = `/${parsed.owner}/${parsed.repo}`;\n\n log.blank();\n const spinner = ora(`Fetching skills from ${repo}...`).start();\n\n const data = await listProjectSkills(repo);\n\n if (data.error) {\n spinner.fail(pc.red(`Error: ${data.message || data.error}`));\n return;\n }\n\n if (!data.skills || data.skills.length === 0) {\n spinner.warn(pc.yellow(`No skills found in ${repo}`));\n return;\n }\n\n spinner.succeed(`Found ${data.skills.length} skill(s)`);\n\n log.blank();\n for (const skill of data.skills) {\n log.item(skill.name);\n log.dim(` ${skill.description || \"No description\"}`);\n log.dim(` URL: ${skill.url}`);\n log.blank();\n }\n\n log.plain(\n `${pc.bold(\"Quick commands:\")}\\n` +\n ` Install all: ${pc.cyan(`ctx7 skills install ${repo} --all`)}\\n` +\n ` Install one: ${pc.cyan(`ctx7 skills install ${repo} ${data.skills[0]?.name}`)}\\n`\n );\n}\n","export interface ParsedSkillInput {\n type: \"repo\" | \"url\";\n owner: string;\n repo: string;\n branch?: string;\n path?: string;\n}\n\nexport function parseSkillInput(input: string): ParsedSkillInput | null {\n const urlMatch = input.match(\n /(?:https?:\\/\\/)?github\\.com\\/([^\\/]+)\\/([^\\/]+)\\/tree\\/([^\\/]+)\\/(.+)/\n );\n if (urlMatch) {\n const [, owner, repo, branch, path] = urlMatch;\n return { type: \"url\", owner, repo, branch, path };\n }\n\n const shortMatch = input.match(/^\\/?([^\\/]+)\\/([^\\/]+)$/);\n if (shortMatch) {\n const [, owner, repo] = shortMatch;\n return { type: \"repo\", owner, repo };\n }\n\n return null;\n}\n","import type { SkillFile, Skill } from \"../types.js\";\n\nconst GITHUB_API = \"https://api.github.com\";\nconst GITHUB_RAW = \"https://raw.githubusercontent.com\";\n\ninterface GitHubTreeItem {\n path: string;\n mode: string;\n type: \"blob\" | \"tree\";\n sha: string;\n size?: number;\n url: string;\n}\n\ninterface GitHubTreeResponse {\n sha: string;\n url: string;\n tree: GitHubTreeItem[];\n truncated: boolean;\n}\n\nfunction parseGitHubUrl(url: string): {\n owner: string;\n repo: string;\n branch: string;\n path: string;\n} | null {\n try {\n const urlObj = new URL(url);\n const parts = urlObj.pathname.split(\"/\").filter(Boolean);\n\n // Handle raw.githubusercontent.com URLs\n // Format: https://raw.githubusercontent.com/owner/repo/refs/heads/branch/path/SKILL.md\n if (urlObj.hostname === \"raw.githubusercontent.com\") {\n if (parts.length < 5) return null;\n\n const owner = parts[0];\n const repo = parts[1];\n\n // Handle refs/heads/branch format\n if (parts[2] === \"refs\" && parts[3] === \"heads\") {\n const branch = parts[4];\n // Get directory path (exclude the filename like SKILL.md)\n const pathParts = parts.slice(5);\n // Remove the last part if it looks like a file (has extension)\n if (pathParts.length > 0 && pathParts[pathParts.length - 1].includes(\".\")) {\n pathParts.pop();\n }\n const path = pathParts.join(\"/\");\n return { owner, repo, branch, path };\n }\n\n // Handle direct branch format: owner/repo/branch/path\n const branch = parts[2];\n const pathParts = parts.slice(3);\n if (pathParts.length > 0 && pathParts[pathParts.length - 1].includes(\".\")) {\n pathParts.pop();\n }\n const path = pathParts.join(\"/\");\n return { owner, repo, branch, path };\n }\n\n // Handle github.com tree URLs\n // Format: https://github.com/owner/repo/tree/branch/path\n if (urlObj.hostname === \"github.com\") {\n if (parts.length < 4 || parts[2] !== \"tree\") return null;\n\n const owner = parts[0];\n const repo = parts[1];\n const branch = parts[3];\n const path = parts.slice(4).join(\"/\");\n\n return { owner, repo, branch, path };\n }\n\n return null;\n } catch {\n return null;\n }\n}\n\nexport async function downloadSkillFromGitHub(\n skill: Skill & { project: string }\n): Promise<{ files: SkillFile[]; error?: string }> {\n try {\n const parsed = parseGitHubUrl(skill.url);\n\n if (!parsed) {\n return { files: [], error: `Invalid GitHub URL: ${skill.url}` };\n }\n\n const { owner, repo, branch, path: skillPath } = parsed;\n\n const treeUrl = `${GITHUB_API}/repos/${owner}/${repo}/git/trees/${branch}?recursive=1`;\n const treeResponse = await fetch(treeUrl, {\n headers: {\n Accept: \"application/vnd.github.v3+json\",\n \"User-Agent\": \"context7-cli\",\n },\n });\n\n if (!treeResponse.ok) {\n return { files: [], error: `GitHub API error: ${treeResponse.status}` };\n }\n\n const treeData = (await treeResponse.json()) as GitHubTreeResponse;\n\n const skillFiles = treeData.tree.filter(\n (item) => item.type === \"blob\" && item.path.startsWith(skillPath + \"/\")\n );\n\n if (skillFiles.length === 0) {\n return { files: [], error: `No files found in ${skillPath}` };\n }\n\n const files: SkillFile[] = [];\n for (const item of skillFiles) {\n const rawUrl = `${GITHUB_RAW}/${owner}/${repo}/${branch}/${item.path}`;\n const fileResponse = await fetch(rawUrl);\n\n if (!fileResponse.ok) {\n console.warn(`Failed to fetch ${item.path}: ${fileResponse.status}`);\n continue;\n }\n\n const content = await fileResponse.text();\n const relativePath = item.path.slice(skillPath.length + 1);\n\n files.push({\n path: relativePath,\n content,\n });\n }\n\n return { files };\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n return { files: [], error: message };\n }\n}\n","import type {\n ListSkillsResponse,\n SingleSkillResponse,\n SearchResponse,\n DownloadResponse,\n} from \"../types.js\";\nimport { downloadSkillFromGitHub } from \"./github.js\";\n\nlet baseUrl = \"https://context7.com\";\n\nexport function setBaseUrl(url: string): void {\n baseUrl = url;\n}\n\nexport async function listProjectSkills(project: string): Promise<ListSkillsResponse> {\n const params = new URLSearchParams({ project });\n const response = await fetch(`${baseUrl}/api/v2/skills?${params}`);\n return (await response.json()) as ListSkillsResponse;\n}\n\nexport async function getSkill(project: string, skillName: string): Promise<SingleSkillResponse> {\n const params = new URLSearchParams({ project, skill: skillName });\n const response = await fetch(`${baseUrl}/api/v2/skills?${params}`);\n return (await response.json()) as SingleSkillResponse;\n}\n\nexport async function searchSkills(query: string): Promise<SearchResponse> {\n const params = new URLSearchParams({ query });\n const response = await fetch(`${baseUrl}/api/v2/skills?${params}`);\n return (await response.json()) as SearchResponse;\n}\n\nexport function trackInstalls(skills: string[], ides: string[]): void {\n if (process.env.CTX7_TELEMETRY_DISABLED || !skills.length) return;\n fetch(`${baseUrl}/api/v2/skills/track`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ skills, ides }),\n }).catch(() => {});\n}\n\nexport async function downloadSkill(project: string, skillName: string): Promise<DownloadResponse> {\n const skillData = await getSkill(project, skillName);\n\n if (skillData.error) {\n return {\n skill: { name: skillName, description: \"\", url: \"\", project },\n files: [],\n error: skillData.message || skillData.error,\n };\n }\n\n const skill = {\n name: skillData.name,\n description: skillData.description,\n url: skillData.url,\n project: skillData.project,\n };\n\n const { files, error } = await downloadSkillFromGitHub(skill);\n\n if (error) {\n return { skill, files: [], error };\n }\n\n return { skill, files };\n}\n","import pc from \"picocolors\";\n\nexport const log = {\n info: (message: string) => console.log(pc.cyan(message)),\n success: (message: string) => console.log(pc.green(`✔ ${message}`)),\n warn: (message: string) => console.log(pc.yellow(`⚠ ${message}`)),\n error: (message: string) => console.log(pc.red(`✖ ${message}`)),\n dim: (message: string) => console.log(pc.dim(message)),\n item: (message: string) => console.log(pc.green(` ${message}`)),\n itemAdd: (message: string) => console.log(` ${pc.green(\"+\")} ${message}`),\n plain: (message: string) => console.log(message),\n blank: () => console.log(\"\"),\n};\n","import pc from \"picocolors\";\nimport { select, checkbox, confirm } from \"@inquirer/prompts\";\nimport { access } from \"fs/promises\";\nimport { join } from \"path\";\nimport { homedir } from \"os\";\n\nimport { log } from \"./logger.js\";\nimport type {\n IDE,\n IDEOptions,\n Scope,\n AddOptions,\n ListOptions,\n RemoveOptions,\n InstallTargets,\n} from \"../types.js\";\nimport { IDE_PATHS, IDE_GLOBAL_PATHS, IDE_NAMES, DEFAULT_CONFIG } from \"../types.js\";\nimport { dirname } from \"path\";\n\nexport function getSelectedIdes(options: IDEOptions): IDE[] {\n const ides: IDE[] = [];\n if (options.claude) ides.push(\"claude\");\n if (options.cursor) ides.push(\"cursor\");\n if (options.codex) ides.push(\"codex\");\n if (options.opencode) ides.push(\"opencode\");\n if (options.amp) ides.push(\"amp\");\n if (options.antigravity) ides.push(\"antigravity\");\n return ides;\n}\n\nexport function hasExplicitIdeOption(options: IDEOptions): boolean {\n return !!(\n options.claude ||\n options.cursor ||\n options.codex ||\n options.opencode ||\n options.amp ||\n options.antigravity\n );\n}\n\ninterface DetectedIdes {\n ides: IDE[];\n scope: Scope;\n}\n\nexport async function detectInstalledIdes(preferredScope?: Scope): Promise<DetectedIdes | null> {\n const allIdes = Object.keys(IDE_PATHS) as IDE[];\n\n if (preferredScope === \"global\") {\n const globalIdes: IDE[] = [];\n for (const ide of allIdes) {\n const detectionPath = dirname(IDE_GLOBAL_PATHS[ide]);\n const globalParent = join(homedir(), detectionPath);\n try {\n await access(globalParent);\n globalIdes.push(ide);\n } catch {}\n }\n if (globalIdes.length > 0) {\n return { ides: globalIdes, scope: \"global\" };\n }\n return null;\n }\n\n const projectIdes: IDE[] = [];\n for (const ide of allIdes) {\n const detectionPath = dirname(IDE_PATHS[ide]);\n const projectParent = join(process.cwd(), detectionPath);\n try {\n await access(projectParent);\n projectIdes.push(ide);\n } catch {}\n }\n\n if (projectIdes.length > 0) {\n return { ides: projectIdes, scope: \"project\" };\n }\n\n return null;\n}\n\nexport async function promptForInstallTargets(options: AddOptions): Promise<InstallTargets | null> {\n if (hasExplicitIdeOption(options)) {\n const ides = getSelectedIdes(options);\n const scope: Scope = options.global ? \"global\" : \"project\";\n return {\n ides: ides.length > 0 ? ides : [DEFAULT_CONFIG.defaultIde],\n scopes: [scope],\n };\n }\n\n const preferredScope: Scope | undefined = options.global ? \"global\" : undefined;\n const detected = await detectInstalledIdes(preferredScope);\n\n if (detected) {\n const scope: Scope = options.global ? \"global\" : detected.scope;\n const pathMap = scope === \"global\" ? IDE_GLOBAL_PATHS : IDE_PATHS;\n const baseDir = scope === \"global\" ? homedir() : process.cwd();\n\n const paths = detected.ides.map((ide) => join(baseDir, pathMap[ide]));\n const pathList = paths.join(\"\\n\");\n\n log.blank();\n let confirmed: boolean;\n try {\n confirmed = await confirm({\n message: `Install to detected location(s)?\\n${pc.dim(pathList)}`,\n default: true,\n });\n } catch {\n return null;\n }\n\n if (!confirmed) {\n log.warn(\"Installation cancelled\");\n return null;\n }\n\n return { ides: detected.ides, scopes: [scope] };\n }\n\n // No IDE detected - prompt user to select which client(s) to install for\n log.blank();\n\n const scope: Scope = options.global ? \"global\" : \"project\";\n const pathMap = scope === \"global\" ? IDE_GLOBAL_PATHS : IDE_PATHS;\n const baseDir = scope === \"global\" ? homedir() : process.cwd();\n\n const ideChoices = (Object.keys(IDE_NAMES) as IDE[]).map((ide) => ({\n name: `${IDE_NAMES[ide]} ${pc.dim(`(${pathMap[ide]})`)}`,\n value: ide,\n checked: ide === DEFAULT_CONFIG.defaultIde,\n }));\n\n let selectedIdes: IDE[];\n try {\n selectedIdes = await checkbox({\n message: `Which clients do you want to install the skill(s) for?\\n${pc.dim(baseDir)}`,\n choices: ideChoices,\n required: true,\n });\n } catch {\n return null;\n }\n\n if (selectedIdes.length === 0) {\n log.warn(\"You must select at least one client\");\n return null;\n }\n\n return { ides: selectedIdes, scopes: [scope] };\n}\n\nexport async function promptForSingleTarget(\n options: ListOptions | RemoveOptions\n): Promise<{ ide: IDE; scope: Scope } | null> {\n if (hasExplicitIdeOption(options)) {\n const ides = getSelectedIdes(options);\n const ide = ides[0] || DEFAULT_CONFIG.defaultIde;\n const scope: Scope = options.global ? \"global\" : \"project\";\n return { ide, scope };\n }\n\n log.blank();\n\n const ideChoices = (Object.keys(IDE_NAMES) as IDE[]).map((ide) => ({\n name: `${IDE_NAMES[ide]} ${pc.dim(`(${IDE_PATHS[ide]})`)}`,\n value: ide,\n }));\n\n let selectedIde: IDE;\n try {\n selectedIde = await select({\n message: \"Which client?\",\n choices: ideChoices,\n default: DEFAULT_CONFIG.defaultIde,\n });\n } catch {\n return null;\n }\n\n let selectedScope: Scope;\n if (options.global !== undefined) {\n selectedScope = options.global ? \"global\" : \"project\";\n } else {\n try {\n selectedScope = await select({\n message: \"Which scope?\",\n choices: [\n {\n name: `Project ${pc.dim(\"(current directory)\")}`,\n value: \"project\" as Scope,\n },\n {\n name: `Global ${pc.dim(\"(home directory)\")}`,\n value: \"global\" as Scope,\n },\n ],\n default: DEFAULT_CONFIG.defaultScope,\n });\n } catch {\n return null;\n }\n }\n\n return { ide: selectedIde, scope: selectedScope };\n}\n\nexport function getTargetDirs(targets: InstallTargets): string[] {\n // Prioritize Claude to receive original files (others get symlinks)\n const sortedIdes = [...targets.ides].sort((a, b) => {\n if (a === \"claude\") return -1;\n if (b === \"claude\") return 1;\n return 0;\n });\n\n const dirs: string[] = [];\n for (const ide of sortedIdes) {\n for (const scope of targets.scopes) {\n if (scope === \"global\") {\n dirs.push(join(homedir(), IDE_GLOBAL_PATHS[ide]));\n } else {\n dirs.push(join(process.cwd(), IDE_PATHS[ide]));\n }\n }\n }\n return dirs;\n}\n\nexport function getTargetDirFromSelection(ide: IDE, scope: Scope): string {\n if (scope === \"global\") {\n return join(homedir(), IDE_GLOBAL_PATHS[ide]);\n }\n return join(process.cwd(), IDE_PATHS[ide]);\n}\n","export interface SkillFile {\n path: string;\n content: string;\n}\n\nexport interface Skill {\n name: string;\n description: string;\n url: string;\n}\n\nexport interface SkillSearchResult extends Skill {\n project: string;\n}\n\nexport interface ListSkillsResponse {\n project: string;\n skills: Skill[];\n error?: string;\n message?: string;\n}\n\nexport interface SingleSkillResponse extends Skill {\n project: string;\n error?: string;\n message?: string;\n}\n\nexport interface SearchResponse {\n results: SkillSearchResult[];\n error?: string;\n message?: string;\n}\n\nexport interface DownloadResponse {\n skill: Skill & { project: string };\n files: SkillFile[];\n error?: string;\n}\n\nexport type IDE = \"claude\" | \"cursor\" | \"codex\" | \"opencode\" | \"amp\" | \"antigravity\";\n\nexport type Scope = \"project\" | \"global\";\n\nexport interface IDEOptions {\n claude?: boolean;\n cursor?: boolean;\n codex?: boolean;\n opencode?: boolean;\n amp?: boolean;\n antigravity?: boolean;\n}\n\nexport interface ScopeOptions {\n global?: boolean;\n}\n\nexport type AddOptions = IDEOptions & ScopeOptions & { all?: boolean };\nexport type ListOptions = IDEOptions & ScopeOptions;\nexport type RemoveOptions = IDEOptions & ScopeOptions;\n\nexport interface InstallTargets {\n ides: IDE[];\n scopes: Scope[];\n}\n\nexport const IDE_PATHS: Record<IDE, string> = {\n claude: \".claude/skills\",\n cursor: \".cursor/skills\",\n codex: \".codex/skills\",\n opencode: \".opencode/skills\",\n amp: \".agents/skills\",\n antigravity: \".agent/skills\",\n};\n\nexport const IDE_GLOBAL_PATHS: Record<IDE, string> = {\n claude: \".claude/skills\",\n cursor: \".cursor/skills\",\n codex: \".codex/skills\",\n opencode: \".config/opencode/skills\",\n amp: \".config/agents/skills\",\n antigravity: \".agent/skills\",\n};\n\nexport const IDE_NAMES: Record<IDE, string> = {\n claude: \"Claude Code\",\n cursor: \"Cursor\",\n codex: \"Codex\",\n opencode: \"OpenCode\",\n amp: \"Amp\",\n antigravity: \"Antigravity\",\n};\n\nexport interface C7Config {\n defaultIde: IDE;\n defaultScope: \"project\" | \"global\";\n}\n\nexport const DEFAULT_CONFIG: C7Config = {\n defaultIde: \"claude\",\n defaultScope: \"project\",\n};\n","import { mkdir, writeFile, rm, symlink, lstat } from \"fs/promises\";\nimport { join } from \"path\";\n\nimport type { SkillFile } from \"../types.js\";\n\nexport async function installSkillFiles(\n skillName: string,\n files: SkillFile[],\n targetDir: string\n): Promise<void> {\n const skillDir = join(targetDir, skillName);\n\n for (const file of files) {\n const filePath = join(skillDir, file.path);\n const fileDir = join(filePath, \"..\");\n\n await mkdir(fileDir, { recursive: true });\n await writeFile(filePath, file.content);\n }\n}\n\nexport async function symlinkSkill(\n skillName: string,\n sourcePath: string,\n targetDir: string\n): Promise<void> {\n const targetPath = join(targetDir, skillName);\n\n try {\n const stats = await lstat(targetPath);\n if (stats.isSymbolicLink() || stats.isDirectory()) {\n await rm(targetPath, { recursive: true });\n }\n } catch {}\n\n await mkdir(targetDir, { recursive: true });\n await symlink(sourcePath, targetPath);\n}\n","import { readFileSync } from \"fs\";\nimport { fileURLToPath } from \"url\";\nimport { dirname, join } from \"path\";\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\nconst pkg = JSON.parse(readFileSync(join(__dirname, \"../package.json\"), \"utf-8\"));\n\nexport const VERSION: string = pkg.version;\nexport const NAME: string = pkg.name;\n"],"mappings":"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","names":["pc","pc","checkbox","rm","join","branch","pathParts","path","pc","scope","pathMap","baseDir","pc","join","program","pc","checkbox","join","rm","dirname","join","pc"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/commands/skill.ts","../src/utils/parse-input.ts","../src/utils/github.ts","../src/utils/api.ts","../src/utils/logger.ts","../src/utils/ide.ts","../src/types.ts","../src/utils/installer.ts","../src/constants.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport pc from \"picocolors\";\nimport figlet from \"figlet\";\nimport { registerSkillCommands, registerSkillAliases } from \"./commands/skill.js\";\nimport { setBaseUrl } from \"./utils/api.js\";\nimport { VERSION } from \"./constants.js\";\n\nconst brand = {\n primary: pc.green,\n dim: pc.dim,\n};\n\nconst program = new Command();\n\nprogram\n .name(\"ctx7\")\n .description(\"Context7 CLI - Manage AI coding skills and documentation context\")\n .version(VERSION)\n .option(\"--base-url <url>\")\n .hook(\"preAction\", (thisCommand) => {\n const opts = thisCommand.opts();\n if (opts.baseUrl) {\n setBaseUrl(opts.baseUrl);\n }\n })\n .addHelpText(\n \"after\",\n `\nExamples:\n ${brand.dim(\"# Search for skills\")}\n ${brand.primary(\"npx ctx7 skills search pdf\")}\n ${brand.primary(\"npx ctx7 skills search react hooks\")}\n\n ${brand.dim(\"# Install from a repository\")}\n ${brand.primary(\"npx ctx7 skills install /anthropics/skills\")}\n ${brand.primary(\"npx ctx7 skills install /anthropics/skills pdf\")}\n\n ${brand.dim(\"# Install to specific client\")}\n ${brand.primary(\"npx ctx7 skills install /anthropics/skills --cursor\")}\n ${brand.primary(\"npx ctx7 skills install /anthropics/skills --global\")}\n\n ${brand.dim(\"# List and manage installed skills\")}\n ${brand.primary(\"npx ctx7 skills list --claude\")}\n ${brand.primary(\"npx ctx7 skills remove pdf\")}\n\nVisit ${brand.primary(\"https://context7.com\")} to browse skills\n`\n );\n\nregisterSkillCommands(program);\nregisterSkillAliases(program);\n\nprogram.action(() => {\n console.log(\"\");\n const banner = figlet.textSync(\"Context7\", { font: \"ANSI Shadow\" });\n console.log(brand.primary(banner));\n console.log(brand.dim(\" The open agent skills ecosystem\"));\n console.log(\"\");\n\n console.log(\" Quick start:\");\n console.log(` ${brand.primary(\"npx ctx7 skills search pdf\")}`);\n console.log(` ${brand.primary(\"npx ctx7 skills install /anthropics/skills\")}`);\n console.log(\"\");\n\n console.log(` Run ${brand.primary(\"npx ctx7 --help\")} for all commands and options`);\n console.log(` Visit ${brand.primary(\"https://context7.com\")} to browse skills`);\n console.log(\"\");\n});\n\nprogram.parse();\n","import { Command } from \"commander\";\nimport pc from \"picocolors\";\nimport { checkbox } from \"@inquirer/prompts\";\nimport ora from \"ora\";\nimport { readdir, rm } from \"fs/promises\";\nimport { join } from \"path\";\n\nimport { parseSkillInput } from \"../utils/parse-input.js\";\nimport {\n listProjectSkills,\n searchSkills,\n downloadSkill,\n getSkill,\n trackInstalls,\n} from \"../utils/api.js\";\nimport { log } from \"../utils/logger.js\";\nimport {\n promptForInstallTargets,\n promptForSingleTarget,\n getTargetDirs,\n getTargetDirFromSelection,\n} from \"../utils/ide.js\";\nimport { installSkillFiles, symlinkSkill } from \"../utils/installer.js\";\nimport type {\n Skill,\n SkillSearchResult,\n AddOptions,\n ListOptions,\n RemoveOptions,\n InstallTargets,\n} from \"../types.js\";\nimport { IDE_NAMES } from \"../types.js\";\n\nfunction logInstallSummary(\n targets: InstallTargets,\n targetDirs: string[],\n skillNames: string[]\n): void {\n log.blank();\n let dirIndex = 0;\n for (const ide of targets.ides) {\n for (let i = 0; i < targets.scopes.length; i++) {\n const dir = targetDirs[dirIndex++];\n log.dim(`${IDE_NAMES[ide]}: ${dir}`);\n for (const name of skillNames) {\n log.itemAdd(name);\n }\n }\n }\n log.blank();\n}\n\nexport function registerSkillCommands(program: Command): void {\n const skill = program.command(\"skills\").alias(\"skill\").description(\"Manage AI coding skills\");\n\n skill\n .command(\"install\")\n .alias(\"i\")\n .alias(\"add\")\n .argument(\"<repository>\", \"GitHub repository (/owner/repo)\")\n .argument(\"[skill]\", \"Specific skill name to install\")\n .option(\"--all\", \"Install all skills without prompting\")\n .option(\"--global\", \"Install globally instead of current directory\")\n .option(\"--claude\", \"Claude Code (.claude/skills/)\")\n .option(\"--cursor\", \"Cursor (.cursor/skills/)\")\n .option(\"--codex\", \"Codex (.codex/skills/)\")\n .option(\"--opencode\", \"OpenCode (.opencode/skills/)\")\n .option(\"--amp\", \"Amp (.agents/skills/)\")\n .option(\"--antigravity\", \"Antigravity (.agent/skills/)\")\n .description(\"Install skills from a repository\")\n .action(async (project: string, skillName: string | undefined, options: AddOptions) => {\n await installCommand(project, skillName, options);\n });\n\n skill\n .command(\"search\")\n .alias(\"s\")\n .argument(\"<keywords...>\", \"Search keywords\")\n .description(\"Search for skills across all indexed repositories\")\n .action(async (keywords: string[]) => {\n await searchCommand(keywords.join(\" \"));\n });\n\n skill\n .command(\"list\")\n .alias(\"ls\")\n .option(\"--global\", \"List global skills\")\n .option(\"--claude\", \"Claude Code (.claude/skills/)\")\n .option(\"--cursor\", \"Cursor (.cursor/skills/)\")\n .option(\"--codex\", \"Codex (.codex/skills/)\")\n .option(\"--opencode\", \"OpenCode (.opencode/skills/)\")\n .option(\"--amp\", \"Amp (.agents/skills/)\")\n .option(\"--antigravity\", \"Antigravity (.agent/skills/)\")\n .description(\"List installed skills\")\n .action(async (options: ListOptions) => {\n await listCommand(options);\n });\n\n skill\n .command(\"remove\")\n .alias(\"rm\")\n .alias(\"delete\")\n .argument(\"<name>\", \"Skill name to remove\")\n .option(\"--global\", \"Remove from global skills\")\n .option(\"--claude\", \"Claude Code (.claude/skills/)\")\n .option(\"--cursor\", \"Cursor (.cursor/skills/)\")\n .option(\"--codex\", \"Codex (.codex/skills/)\")\n .option(\"--opencode\", \"OpenCode (.opencode/skills/)\")\n .option(\"--amp\", \"Amp (.agents/skills/)\")\n .option(\"--antigravity\", \"Antigravity (.agent/skills/)\")\n .description(\"Remove an installed skill\")\n .action(async (name: string, options: RemoveOptions) => {\n await removeCommand(name, options);\n });\n\n skill\n .command(\"info\")\n .argument(\"<repository>\", \"GitHub repository (/owner/repo)\")\n .description(\"Show skills in a repository\")\n .action(async (project: string) => {\n await infoCommand(project);\n });\n}\n\nexport function registerSkillAliases(program: Command): void {\n program\n .command(\"si\", { hidden: true })\n .argument(\"<repository>\", \"GitHub repository (/owner/repo)\")\n .argument(\"[skill]\", \"Specific skill name to install\")\n .option(\"--all\", \"Install all skills without prompting\")\n .option(\"--global\", \"Install globally instead of current directory\")\n .option(\"--claude\", \"Claude Code (.claude/skills/)\")\n .option(\"--cursor\", \"Cursor (.cursor/skills/)\")\n .option(\"--codex\", \"Codex (.codex/skills/)\")\n .option(\"--opencode\", \"OpenCode (.opencode/skills/)\")\n .option(\"--amp\", \"Amp (.agents/skills/)\")\n .option(\"--antigravity\", \"Antigravity (.agent/skills/)\")\n .description(\"Install skills (alias for: skills install)\")\n .action(async (project: string, skillName: string | undefined, options: AddOptions) => {\n await installCommand(project, skillName, options);\n });\n\n program\n .command(\"ss\", { hidden: true })\n .argument(\"<keywords...>\", \"Search keywords\")\n .description(\"Search for skills (alias for: skills search)\")\n .action(async (keywords: string[]) => {\n await searchCommand(keywords.join(\" \"));\n });\n}\n\nasync function installCommand(\n input: string,\n skillName: string | undefined,\n options: AddOptions\n): Promise<void> {\n const parsed = parseSkillInput(input);\n if (!parsed) {\n log.error(`Invalid input format: ${input}`);\n log.info(`Expected: /owner/repo or full GitHub URL`);\n log.info(`Example: ctx7 skills install /anthropics/skills pdf`);\n log.blank();\n return;\n }\n const repo = `/${parsed.owner}/${parsed.repo}`;\n\n log.blank();\n const spinner = ora(`Fetching skills from ${repo}...`).start();\n\n let selectedSkills: (Skill & { project: string })[];\n\n // When a specific skill name is provided, fetch only that skill\n if (skillName) {\n spinner.text = `Fetching skill: ${skillName}...`;\n const skillData = await getSkill(repo, skillName);\n\n if (skillData.error || !skillData.name) {\n if (skillData.error === \"prompt_injection_detected\") {\n spinner.fail(pc.red(`Prompt injection detected in skill: ${skillName}`));\n log.warn(\"This skill contains potentially malicious content and cannot be installed.\");\n } else {\n spinner.fail(pc.red(`Skill not found: ${skillName}`));\n }\n return;\n }\n\n spinner.succeed(`Found skill: ${skillName}`);\n selectedSkills = [\n {\n name: skillData.name,\n description: skillData.description,\n url: skillData.url,\n project: repo,\n },\n ];\n } else {\n // Fetch all skills when no specific names provided\n const data = await listProjectSkills(repo);\n\n if (data.error) {\n spinner.fail(pc.red(`Error: ${data.message || data.error}`));\n return;\n }\n\n if (!data.skills || data.skills.length === 0) {\n spinner.warn(pc.yellow(`No skills found in ${repo}`));\n return;\n }\n\n const skillsWithRepo = data.skills.map((s) => ({ ...s, project: repo }));\n\n spinner.succeed(`Found ${data.skills.length} skill(s)`);\n\n if (data.blockedSkillsCount && data.blockedSkillsCount > 0) {\n log.blank();\n log.error(\n `${data.blockedSkillsCount} skill(s) blocked due to prompt injection and not shown.`\n );\n log.warn(\"Review other skills from this repository carefully before installing.\");\n }\n\n if (options.all || data.skills.length === 1) {\n selectedSkills = skillsWithRepo;\n } else {\n const maxNameLen = Math.min(25, Math.max(...data.skills.map((s) => s.name.length)));\n const choices = skillsWithRepo.map((s) => {\n const paddedName = s.name.padEnd(maxNameLen);\n const desc = s.description?.trim()\n ? s.description.slice(0, 60) + (s.description.length > 60 ? \"...\" : \"\")\n : \"\";\n\n return {\n name: desc ? `${paddedName} ${pc.dim(desc)}` : s.name,\n value: s,\n };\n });\n\n log.blank();\n\n try {\n selectedSkills = await checkbox({\n message: \"Select skills:\",\n choices,\n pageSize: 15,\n theme: {\n style: {\n renderSelectedChoices: (selected: Array<{ name?: string; value: unknown }>) =>\n selected.map((c) => (c.value as { name: string }).name).join(\", \"),\n },\n },\n });\n } catch {\n log.warn(\"Installation cancelled\");\n return;\n }\n }\n }\n\n if (selectedSkills.length === 0) {\n log.warn(\"No skills selected\");\n return;\n }\n\n const targets = await promptForInstallTargets(options);\n if (!targets) {\n log.warn(\"Installation cancelled\");\n return;\n }\n\n const targetDirs = getTargetDirs(targets);\n\n const installSpinner = ora(\"Installing skills...\").start();\n\n let permissionError = false;\n const failedDirs: Set<string> = new Set();\n const installedSkills: string[] = [];\n\n for (const skill of selectedSkills) {\n try {\n installSpinner.text = `Downloading ${skill.name}...`;\n const downloadData = await downloadSkill(skill.project, skill.name);\n\n if (downloadData.error) {\n log.warn(`Failed to download ${skill.name}: ${downloadData.error}`);\n continue;\n }\n\n installSpinner.text = `Installing ${skill.name}...`;\n\n const [primaryDir, ...symlinkDirs] = targetDirs;\n\n try {\n await installSkillFiles(skill.name, downloadData.files, primaryDir);\n } catch (dirErr) {\n const error = dirErr as NodeJS.ErrnoException;\n if (error.code === \"EACCES\" || error.code === \"EPERM\") {\n permissionError = true;\n failedDirs.add(primaryDir);\n }\n throw dirErr;\n }\n\n const primarySkillDir = join(primaryDir, skill.name);\n for (const targetDir of symlinkDirs) {\n try {\n await symlinkSkill(skill.name, primarySkillDir, targetDir);\n } catch (dirErr) {\n const error = dirErr as NodeJS.ErrnoException;\n if (error.code === \"EACCES\" || error.code === \"EPERM\") {\n permissionError = true;\n failedDirs.add(targetDir);\n }\n throw dirErr;\n }\n }\n\n installedSkills.push(`${skill.project}/${skill.name}`);\n } catch (err) {\n const error = err as NodeJS.ErrnoException;\n if (error.code === \"EACCES\" || error.code === \"EPERM\") {\n continue;\n }\n const errMsg = err instanceof Error ? err.message : String(err);\n log.warn(`Failed to install ${skill.name}: ${errMsg}`);\n }\n }\n\n if (permissionError) {\n installSpinner.fail(\"Permission denied\");\n log.blank();\n log.warn(\"Fix permissions with:\");\n for (const dir of failedDirs) {\n const parentDir = join(dir, \"..\");\n log.dim(` sudo chown -R $(whoami) \"${parentDir}\"`);\n }\n log.blank();\n return;\n }\n\n installSpinner.succeed(`Installed ${installedSkills.length} skill(s)`);\n trackInstalls(installedSkills, targets.ides);\n\n const installedNames = selectedSkills.map((s) => s.name);\n logInstallSummary(targets, targetDirs, installedNames);\n}\n\nasync function searchCommand(query: string): Promise<void> {\n log.blank();\n const spinner = ora(`Searching for \"${query}\"...`).start();\n\n let data;\n try {\n data = await searchSkills(query);\n } catch (err) {\n spinner.fail(pc.red(`Error: ${err instanceof Error ? err.message : String(err)}`));\n return;\n }\n\n if (data.error) {\n spinner.fail(pc.red(`Error: ${data.message || data.error}`));\n return;\n }\n\n if (!data.results || data.results.length === 0) {\n spinner.warn(pc.yellow(`No skills found matching \"${query}\"`));\n return;\n }\n\n spinner.succeed(`Found ${data.results.length} skill(s)`);\n\n const maxNameLen = Math.min(25, Math.max(...data.results.map((s) => s.name.length)));\n const choices = data.results.map((s) => {\n const paddedName = s.name.padEnd(maxNameLen);\n const repoName = pc.dim(`(${s.project})`);\n const desc = s.description?.trim()\n ? s.description.slice(0, 50) + (s.description.length > 50 ? \"...\" : \"\")\n : \"\";\n\n return {\n name: desc ? `${paddedName} ${repoName} ${pc.dim(desc)}` : `${paddedName} ${repoName}`,\n value: s,\n };\n });\n\n log.blank();\n\n let selectedSkills: SkillSearchResult[];\n try {\n selectedSkills = await checkbox({\n message: \"Select skills to install:\",\n choices,\n pageSize: 15,\n theme: {\n style: {\n renderSelectedChoices: (selected: Array<{ name?: string; value: unknown }>) =>\n selected.map((c) => (c.value as SkillSearchResult).name).join(\", \"),\n },\n },\n });\n } catch {\n log.warn(\"Installation cancelled\");\n return;\n }\n\n const uniqueSkills = selectedSkills;\n\n if (uniqueSkills.length === 0) {\n log.warn(\"No skills selected\");\n return;\n }\n\n const targets = await promptForInstallTargets({});\n if (!targets) {\n log.warn(\"Installation cancelled\");\n return;\n }\n\n const targetDirs = getTargetDirs(targets);\n\n const installSpinner = ora(\"Installing skills...\").start();\n\n let permissionError = false;\n const failedDirs: Set<string> = new Set();\n const installedSkills: string[] = [];\n\n for (const skill of uniqueSkills) {\n try {\n installSpinner.text = `Downloading ${skill.name}...`;\n const downloadData = await downloadSkill(skill.project, skill.name);\n\n if (downloadData.error) {\n log.warn(`Failed to download ${skill.name}: ${downloadData.error}`);\n continue;\n }\n\n installSpinner.text = `Installing ${skill.name}...`;\n\n const [primaryDir, ...symlinkDirs] = targetDirs;\n\n try {\n await installSkillFiles(skill.name, downloadData.files, primaryDir);\n } catch (dirErr) {\n const error = dirErr as NodeJS.ErrnoException;\n if (error.code === \"EACCES\" || error.code === \"EPERM\") {\n permissionError = true;\n failedDirs.add(primaryDir);\n }\n throw dirErr;\n }\n\n const primarySkillDir = join(primaryDir, skill.name);\n for (const targetDir of symlinkDirs) {\n try {\n await symlinkSkill(skill.name, primarySkillDir, targetDir);\n } catch (dirErr) {\n const error = dirErr as NodeJS.ErrnoException;\n if (error.code === \"EACCES\" || error.code === \"EPERM\") {\n permissionError = true;\n failedDirs.add(targetDir);\n }\n throw dirErr;\n }\n }\n\n installedSkills.push(`${skill.project}/${skill.name}`);\n } catch (err) {\n const error = err as NodeJS.ErrnoException;\n if (error.code === \"EACCES\" || error.code === \"EPERM\") {\n continue;\n }\n const errMsg = err instanceof Error ? err.message : String(err);\n log.warn(`Failed to install ${skill.name}: ${errMsg}`);\n }\n }\n\n if (permissionError) {\n installSpinner.fail(\"Permission denied\");\n log.blank();\n log.warn(\"Fix permissions with:\");\n for (const dir of failedDirs) {\n const parentDir = join(dir, \"..\");\n log.dim(` sudo chown -R $(whoami) \"${parentDir}\"`);\n }\n log.blank();\n return;\n }\n\n installSpinner.succeed(`Installed ${installedSkills.length} skill(s)`);\n trackInstalls(installedSkills, targets.ides);\n\n const installedNames = uniqueSkills.map((s) => s.name);\n logInstallSummary(targets, targetDirs, installedNames);\n}\n\nasync function listCommand(options: ListOptions): Promise<void> {\n const target = await promptForSingleTarget(options);\n if (!target) {\n log.warn(\"Cancelled\");\n return;\n }\n\n const skillsDir = getTargetDirFromSelection(target.ide, target.scope);\n\n try {\n const entries = await readdir(skillsDir, { withFileTypes: true });\n const skillFolders = entries.filter((e) => e.isDirectory() || e.isSymbolicLink());\n\n if (skillFolders.length === 0) {\n log.warn(`No skills installed in ${skillsDir}`);\n return;\n }\n\n log.info(`\\n◆ Installed skills (${skillsDir}):`);\n\n for (const folder of skillFolders) {\n log.item(folder.name);\n }\n\n log.success(`${skillFolders.length} skill(s) installed\\n`);\n } catch {\n log.warn(`No skills directory found at ${skillsDir}`);\n }\n}\n\nasync function removeCommand(name: string, options: RemoveOptions): Promise<void> {\n const target = await promptForSingleTarget(options);\n if (!target) {\n log.warn(\"Cancelled\");\n return;\n }\n\n const skillsDir = getTargetDirFromSelection(target.ide, target.scope);\n const skillPath = join(skillsDir, name);\n\n try {\n await rm(skillPath, { recursive: true });\n log.success(`Removed skill: ${name}`);\n } catch (err) {\n const error = err as NodeJS.ErrnoException;\n if (error.code === \"ENOENT\") {\n log.error(`Skill not found: ${name}`);\n } else if (error.code === \"EACCES\" || error.code === \"EPERM\") {\n log.error(`Permission denied. Try: sudo rm -rf \"${skillPath}\"`);\n } else {\n log.error(`Failed to remove skill: ${error.message}`);\n }\n }\n}\n\nasync function infoCommand(input: string): Promise<void> {\n const parsed = parseSkillInput(input);\n if (!parsed) {\n log.blank();\n log.error(`Invalid input format: ${input}`);\n log.info(`Expected: /owner/repo or full GitHub URL`);\n log.blank();\n return;\n }\n const repo = `/${parsed.owner}/${parsed.repo}`;\n\n log.blank();\n const spinner = ora(`Fetching skills from ${repo}...`).start();\n\n const data = await listProjectSkills(repo);\n\n if (data.error) {\n spinner.fail(pc.red(`Error: ${data.message || data.error}`));\n return;\n }\n\n if (!data.skills || data.skills.length === 0) {\n spinner.warn(pc.yellow(`No skills found in ${repo}`));\n return;\n }\n\n spinner.succeed(`Found ${data.skills.length} skill(s)`);\n\n log.blank();\n for (const skill of data.skills) {\n log.item(skill.name);\n log.dim(` ${skill.description || \"No description\"}`);\n log.dim(` URL: ${skill.url}`);\n log.blank();\n }\n\n log.plain(\n `${pc.bold(\"Quick commands:\")}\\n` +\n ` Install all: ${pc.cyan(`ctx7 skills install ${repo} --all`)}\\n` +\n ` Install one: ${pc.cyan(`ctx7 skills install ${repo} ${data.skills[0]?.name}`)}\\n`\n );\n}\n","export interface ParsedSkillInput {\n type: \"repo\" | \"url\";\n owner: string;\n repo: string;\n branch?: string;\n path?: string;\n}\n\nexport function parseSkillInput(input: string): ParsedSkillInput | null {\n const urlMatch = input.match(\n /(?:https?:\\/\\/)?github\\.com\\/([^\\/]+)\\/([^\\/]+)\\/tree\\/([^\\/]+)\\/(.+)/\n );\n if (urlMatch) {\n const [, owner, repo, branch, path] = urlMatch;\n return { type: \"url\", owner, repo, branch, path };\n }\n\n const shortMatch = input.match(/^\\/?([^\\/]+)\\/([^\\/]+)$/);\n if (shortMatch) {\n const [, owner, repo] = shortMatch;\n return { type: \"repo\", owner, repo };\n }\n\n return null;\n}\n","import type { SkillFile, Skill } from \"../types.js\";\n\nconst GITHUB_API = \"https://api.github.com\";\nconst GITHUB_RAW = \"https://raw.githubusercontent.com\";\n\ninterface GitHubTreeItem {\n path: string;\n mode: string;\n type: \"blob\" | \"tree\";\n sha: string;\n size?: number;\n url: string;\n}\n\ninterface GitHubTreeResponse {\n sha: string;\n url: string;\n tree: GitHubTreeItem[];\n truncated: boolean;\n}\n\nfunction parseGitHubUrl(url: string): {\n owner: string;\n repo: string;\n branch: string;\n path: string;\n} | null {\n try {\n const urlObj = new URL(url);\n const parts = urlObj.pathname.split(\"/\").filter(Boolean);\n\n // Handle raw.githubusercontent.com URLs\n // Format: https://raw.githubusercontent.com/owner/repo/refs/heads/branch/path/SKILL.md\n if (urlObj.hostname === \"raw.githubusercontent.com\") {\n if (parts.length < 5) return null;\n\n const owner = parts[0];\n const repo = parts[1];\n\n // Handle refs/heads/branch format\n if (parts[2] === \"refs\" && parts[3] === \"heads\") {\n const branch = parts[4];\n // Get directory path (exclude the filename like SKILL.md)\n const pathParts = parts.slice(5);\n // Remove the last part if it looks like a file (has extension)\n if (pathParts.length > 0 && pathParts[pathParts.length - 1].includes(\".\")) {\n pathParts.pop();\n }\n const path = pathParts.join(\"/\");\n return { owner, repo, branch, path };\n }\n\n // Handle direct branch format: owner/repo/branch/path\n const branch = parts[2];\n const pathParts = parts.slice(3);\n if (pathParts.length > 0 && pathParts[pathParts.length - 1].includes(\".\")) {\n pathParts.pop();\n }\n const path = pathParts.join(\"/\");\n return { owner, repo, branch, path };\n }\n\n // Handle github.com tree URLs\n // Format: https://github.com/owner/repo/tree/branch/path\n if (urlObj.hostname === \"github.com\") {\n if (parts.length < 4 || parts[2] !== \"tree\") return null;\n\n const owner = parts[0];\n const repo = parts[1];\n const branch = parts[3];\n const path = parts.slice(4).join(\"/\");\n\n return { owner, repo, branch, path };\n }\n\n return null;\n } catch {\n return null;\n }\n}\n\nexport async function downloadSkillFromGitHub(\n skill: Skill & { project: string }\n): Promise<{ files: SkillFile[]; error?: string }> {\n try {\n const parsed = parseGitHubUrl(skill.url);\n\n if (!parsed) {\n return { files: [], error: `Invalid GitHub URL: ${skill.url}` };\n }\n\n const { owner, repo, branch, path: skillPath } = parsed;\n\n const treeUrl = `${GITHUB_API}/repos/${owner}/${repo}/git/trees/${branch}?recursive=1`;\n const treeResponse = await fetch(treeUrl, {\n headers: {\n Accept: \"application/vnd.github.v3+json\",\n \"User-Agent\": \"context7-cli\",\n },\n });\n\n if (!treeResponse.ok) {\n return { files: [], error: `GitHub API error: ${treeResponse.status}` };\n }\n\n const treeData = (await treeResponse.json()) as GitHubTreeResponse;\n\n const skillFiles = treeData.tree.filter(\n (item) => item.type === \"blob\" && item.path.startsWith(skillPath + \"/\")\n );\n\n if (skillFiles.length === 0) {\n return { files: [], error: `No files found in ${skillPath}` };\n }\n\n const files: SkillFile[] = [];\n for (const item of skillFiles) {\n const rawUrl = `${GITHUB_RAW}/${owner}/${repo}/${branch}/${item.path}`;\n const fileResponse = await fetch(rawUrl);\n\n if (!fileResponse.ok) {\n console.warn(`Failed to fetch ${item.path}: ${fileResponse.status}`);\n continue;\n }\n\n const content = await fileResponse.text();\n const relativePath = item.path.slice(skillPath.length + 1);\n\n files.push({\n path: relativePath,\n content,\n });\n }\n\n return { files };\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n return { files: [], error: message };\n }\n}\n","import type {\n ListSkillsResponse,\n SingleSkillResponse,\n SearchResponse,\n DownloadResponse,\n} from \"../types.js\";\nimport { downloadSkillFromGitHub } from \"./github.js\";\n\nlet baseUrl = \"https://context7.com\";\n\nexport function setBaseUrl(url: string): void {\n baseUrl = url;\n}\n\nexport async function listProjectSkills(project: string): Promise<ListSkillsResponse> {\n const params = new URLSearchParams({ project });\n const response = await fetch(`${baseUrl}/api/v2/skills?${params}`);\n return (await response.json()) as ListSkillsResponse;\n}\n\nexport async function getSkill(project: string, skillName: string): Promise<SingleSkillResponse> {\n const params = new URLSearchParams({ project, skill: skillName });\n const response = await fetch(`${baseUrl}/api/v2/skills?${params}`);\n return (await response.json()) as SingleSkillResponse;\n}\n\nexport async function searchSkills(query: string): Promise<SearchResponse> {\n const params = new URLSearchParams({ query });\n const response = await fetch(`${baseUrl}/api/v2/skills?${params}`);\n return (await response.json()) as SearchResponse;\n}\n\nexport function trackInstalls(skills: string[], ides: string[]): void {\n if (process.env.CTX7_TELEMETRY_DISABLED || !skills.length) return;\n fetch(`${baseUrl}/api/v2/skills/track`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ skills, ides }),\n }).catch(() => {});\n}\n\nexport async function downloadSkill(project: string, skillName: string): Promise<DownloadResponse> {\n const skillData = await getSkill(project, skillName);\n\n if (skillData.error) {\n return {\n skill: { name: skillName, description: \"\", url: \"\", project },\n files: [],\n error: skillData.message || skillData.error,\n };\n }\n\n const skill = {\n name: skillData.name,\n description: skillData.description,\n url: skillData.url,\n project: skillData.project,\n };\n\n const { files, error } = await downloadSkillFromGitHub(skill);\n\n if (error) {\n return { skill, files: [], error };\n }\n\n return { skill, files };\n}\n","import pc from \"picocolors\";\n\nexport const log = {\n info: (message: string) => console.log(pc.cyan(message)),\n success: (message: string) => console.log(pc.green(`✔ ${message}`)),\n warn: (message: string) => console.log(pc.yellow(`⚠ ${message}`)),\n error: (message: string) => console.log(pc.red(`✖ ${message}`)),\n dim: (message: string) => console.log(pc.dim(message)),\n item: (message: string) => console.log(pc.green(` ${message}`)),\n itemAdd: (message: string) => console.log(` ${pc.green(\"+\")} ${message}`),\n plain: (message: string) => console.log(message),\n blank: () => console.log(\"\"),\n};\n","import pc from \"picocolors\";\nimport { select, checkbox, confirm } from \"@inquirer/prompts\";\nimport { access } from \"fs/promises\";\nimport { join } from \"path\";\nimport { homedir } from \"os\";\n\nimport { log } from \"./logger.js\";\nimport type {\n IDE,\n IDEOptions,\n Scope,\n AddOptions,\n ListOptions,\n RemoveOptions,\n InstallTargets,\n} from \"../types.js\";\nimport { IDE_PATHS, IDE_GLOBAL_PATHS, IDE_NAMES, DEFAULT_CONFIG } from \"../types.js\";\nimport { dirname } from \"path\";\n\nexport function getSelectedIdes(options: IDEOptions): IDE[] {\n const ides: IDE[] = [];\n if (options.claude) ides.push(\"claude\");\n if (options.cursor) ides.push(\"cursor\");\n if (options.codex) ides.push(\"codex\");\n if (options.opencode) ides.push(\"opencode\");\n if (options.amp) ides.push(\"amp\");\n if (options.antigravity) ides.push(\"antigravity\");\n return ides;\n}\n\nexport function hasExplicitIdeOption(options: IDEOptions): boolean {\n return !!(\n options.claude ||\n options.cursor ||\n options.codex ||\n options.opencode ||\n options.amp ||\n options.antigravity\n );\n}\n\ninterface DetectedIdes {\n ides: IDE[];\n scope: Scope;\n}\n\nexport async function detectInstalledIdes(preferredScope?: Scope): Promise<DetectedIdes | null> {\n const allIdes = Object.keys(IDE_PATHS) as IDE[];\n\n if (preferredScope === \"global\") {\n const globalIdes: IDE[] = [];\n for (const ide of allIdes) {\n const detectionPath = dirname(IDE_GLOBAL_PATHS[ide]);\n const globalParent = join(homedir(), detectionPath);\n try {\n await access(globalParent);\n globalIdes.push(ide);\n } catch {}\n }\n if (globalIdes.length > 0) {\n return { ides: globalIdes, scope: \"global\" };\n }\n return null;\n }\n\n const projectIdes: IDE[] = [];\n for (const ide of allIdes) {\n const detectionPath = dirname(IDE_PATHS[ide]);\n const projectParent = join(process.cwd(), detectionPath);\n try {\n await access(projectParent);\n projectIdes.push(ide);\n } catch {}\n }\n\n if (projectIdes.length > 0) {\n return { ides: projectIdes, scope: \"project\" };\n }\n\n return null;\n}\n\nexport async function promptForInstallTargets(options: AddOptions): Promise<InstallTargets | null> {\n if (hasExplicitIdeOption(options)) {\n const ides = getSelectedIdes(options);\n const scope: Scope = options.global ? \"global\" : \"project\";\n return {\n ides: ides.length > 0 ? ides : [DEFAULT_CONFIG.defaultIde],\n scopes: [scope],\n };\n }\n\n const preferredScope: Scope | undefined = options.global ? \"global\" : undefined;\n const detected = await detectInstalledIdes(preferredScope);\n\n if (detected) {\n const scope: Scope = options.global ? \"global\" : detected.scope;\n const pathMap = scope === \"global\" ? IDE_GLOBAL_PATHS : IDE_PATHS;\n const baseDir = scope === \"global\" ? homedir() : process.cwd();\n\n const paths = detected.ides.map((ide) => join(baseDir, pathMap[ide]));\n const pathList = paths.join(\"\\n\");\n\n log.blank();\n let confirmed: boolean;\n try {\n confirmed = await confirm({\n message: `Install to detected location(s)?\\n${pc.dim(pathList)}`,\n default: true,\n });\n } catch {\n return null;\n }\n\n if (!confirmed) {\n log.warn(\"Installation cancelled\");\n return null;\n }\n\n return { ides: detected.ides, scopes: [scope] };\n }\n\n // No IDE detected - prompt user to select which client(s) to install for\n log.blank();\n\n const scope: Scope = options.global ? \"global\" : \"project\";\n const pathMap = scope === \"global\" ? IDE_GLOBAL_PATHS : IDE_PATHS;\n const baseDir = scope === \"global\" ? homedir() : process.cwd();\n\n const ideChoices = (Object.keys(IDE_NAMES) as IDE[]).map((ide) => ({\n name: `${IDE_NAMES[ide]} ${pc.dim(`(${pathMap[ide]})`)}`,\n value: ide,\n checked: ide === DEFAULT_CONFIG.defaultIde,\n }));\n\n let selectedIdes: IDE[];\n try {\n selectedIdes = await checkbox({\n message: `Which clients do you want to install the skill(s) for?\\n${pc.dim(baseDir)}`,\n choices: ideChoices,\n required: true,\n });\n } catch {\n return null;\n }\n\n if (selectedIdes.length === 0) {\n log.warn(\"You must select at least one client\");\n return null;\n }\n\n return { ides: selectedIdes, scopes: [scope] };\n}\n\nexport async function promptForSingleTarget(\n options: ListOptions | RemoveOptions\n): Promise<{ ide: IDE; scope: Scope } | null> {\n if (hasExplicitIdeOption(options)) {\n const ides = getSelectedIdes(options);\n const ide = ides[0] || DEFAULT_CONFIG.defaultIde;\n const scope: Scope = options.global ? \"global\" : \"project\";\n return { ide, scope };\n }\n\n log.blank();\n\n const ideChoices = (Object.keys(IDE_NAMES) as IDE[]).map((ide) => ({\n name: `${IDE_NAMES[ide]} ${pc.dim(`(${IDE_PATHS[ide]})`)}`,\n value: ide,\n }));\n\n let selectedIde: IDE;\n try {\n selectedIde = await select({\n message: \"Which client?\",\n choices: ideChoices,\n default: DEFAULT_CONFIG.defaultIde,\n });\n } catch {\n return null;\n }\n\n let selectedScope: Scope;\n if (options.global !== undefined) {\n selectedScope = options.global ? \"global\" : \"project\";\n } else {\n try {\n selectedScope = await select({\n message: \"Which scope?\",\n choices: [\n {\n name: `Project ${pc.dim(\"(current directory)\")}`,\n value: \"project\" as Scope,\n },\n {\n name: `Global ${pc.dim(\"(home directory)\")}`,\n value: \"global\" as Scope,\n },\n ],\n default: DEFAULT_CONFIG.defaultScope,\n });\n } catch {\n return null;\n }\n }\n\n return { ide: selectedIde, scope: selectedScope };\n}\n\nexport function getTargetDirs(targets: InstallTargets): string[] {\n // Prioritize Claude to receive original files (others get symlinks)\n const sortedIdes = [...targets.ides].sort((a, b) => {\n if (a === \"claude\") return -1;\n if (b === \"claude\") return 1;\n return 0;\n });\n\n const dirs: string[] = [];\n for (const ide of sortedIdes) {\n for (const scope of targets.scopes) {\n if (scope === \"global\") {\n dirs.push(join(homedir(), IDE_GLOBAL_PATHS[ide]));\n } else {\n dirs.push(join(process.cwd(), IDE_PATHS[ide]));\n }\n }\n }\n return dirs;\n}\n\nexport function getTargetDirFromSelection(ide: IDE, scope: Scope): string {\n if (scope === \"global\") {\n return join(homedir(), IDE_GLOBAL_PATHS[ide]);\n }\n return join(process.cwd(), IDE_PATHS[ide]);\n}\n","export interface SkillFile {\n path: string;\n content: string;\n}\n\nexport interface Skill {\n name: string;\n description: string;\n url: string;\n}\n\nexport interface SkillSearchResult extends Skill {\n project: string;\n}\n\nexport interface ListSkillsResponse {\n project: string;\n skills: Skill[];\n blockedSkillsCount?: number;\n error?: string;\n message?: string;\n}\n\nexport interface SingleSkillResponse extends Skill {\n project: string;\n error?: string;\n message?: string;\n}\n\nexport interface SearchResponse {\n results: SkillSearchResult[];\n error?: string;\n message?: string;\n}\n\nexport interface DownloadResponse {\n skill: Skill & { project: string };\n files: SkillFile[];\n error?: string;\n}\n\nexport type IDE = \"claude\" | \"cursor\" | \"codex\" | \"opencode\" | \"amp\" | \"antigravity\";\n\nexport type Scope = \"project\" | \"global\";\n\nexport interface IDEOptions {\n claude?: boolean;\n cursor?: boolean;\n codex?: boolean;\n opencode?: boolean;\n amp?: boolean;\n antigravity?: boolean;\n}\n\nexport interface ScopeOptions {\n global?: boolean;\n}\n\nexport type AddOptions = IDEOptions & ScopeOptions & { all?: boolean };\nexport type ListOptions = IDEOptions & ScopeOptions;\nexport type RemoveOptions = IDEOptions & ScopeOptions;\n\nexport interface InstallTargets {\n ides: IDE[];\n scopes: Scope[];\n}\n\nexport const IDE_PATHS: Record<IDE, string> = {\n claude: \".claude/skills\",\n cursor: \".cursor/skills\",\n codex: \".codex/skills\",\n opencode: \".opencode/skills\",\n amp: \".agents/skills\",\n antigravity: \".agent/skills\",\n};\n\nexport const IDE_GLOBAL_PATHS: Record<IDE, string> = {\n claude: \".claude/skills\",\n cursor: \".cursor/skills\",\n codex: \".codex/skills\",\n opencode: \".config/opencode/skills\",\n amp: \".config/agents/skills\",\n antigravity: \".agent/skills\",\n};\n\nexport const IDE_NAMES: Record<IDE, string> = {\n claude: \"Claude Code\",\n cursor: \"Cursor\",\n codex: \"Codex\",\n opencode: \"OpenCode\",\n amp: \"Amp\",\n antigravity: \"Antigravity\",\n};\n\nexport interface C7Config {\n defaultIde: IDE;\n defaultScope: \"project\" | \"global\";\n}\n\nexport const DEFAULT_CONFIG: C7Config = {\n defaultIde: \"claude\",\n defaultScope: \"project\",\n};\n","import { mkdir, writeFile, rm, symlink, lstat } from \"fs/promises\";\nimport { join } from \"path\";\n\nimport type { SkillFile } from \"../types.js\";\n\nexport async function installSkillFiles(\n skillName: string,\n files: SkillFile[],\n targetDir: string\n): Promise<void> {\n const skillDir = join(targetDir, skillName);\n\n for (const file of files) {\n const filePath = join(skillDir, file.path);\n const fileDir = join(filePath, \"..\");\n\n await mkdir(fileDir, { recursive: true });\n await writeFile(filePath, file.content);\n }\n}\n\nexport async function symlinkSkill(\n skillName: string,\n sourcePath: string,\n targetDir: string\n): Promise<void> {\n const targetPath = join(targetDir, skillName);\n\n try {\n const stats = await lstat(targetPath);\n if (stats.isSymbolicLink() || stats.isDirectory()) {\n await rm(targetPath, { recursive: true });\n }\n } catch {}\n\n await mkdir(targetDir, { recursive: true });\n await symlink(sourcePath, targetPath);\n}\n","import { readFileSync } from \"fs\";\nimport { fileURLToPath } from \"url\";\nimport { dirname, join } from \"path\";\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\nconst pkg = JSON.parse(readFileSync(join(__dirname, \"../package.json\"), \"utf-8\"));\n\nexport const VERSION: string = pkg.version;\nexport const NAME: string = pkg.name;\n"],"mappings":"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","names":["pc","pc","checkbox","rm","join","branch","pathParts","path","pc","scope","pathMap","baseDir","pc","join","program","pc","checkbox","join","rm","dirname","join","pc"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ctx7",
3
- "version": "0.1.3",
3
+ "version": "0.1.4",
4
4
  "description": "Context7 CLI - Manage AI coding skills and documentation context",
5
5
  "type": "module",
6
6
  "bin": {