ctx7 0.2.4 → 0.3.0
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/README.md +38 -0
- package/dist/index.js +351 -6
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
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/utils/prompts.ts","../src/types.ts","../src/utils/installer.ts","../src/utils/tracking.ts","../src/commands/generate.ts","../src/utils/auth.ts","../src/commands/auth.ts","../src/utils/selectOrInput.ts","../src/utils/deps.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 { registerAuthCommands, setAuthBaseUrl } from \"./commands/auth.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 setAuthBaseUrl(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);\nregisterAuthCommands(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 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 suggestSkills,\n downloadSkill,\n getSkill,\n} from \"../utils/api.js\";\nimport { log } from \"../utils/logger.js\";\nimport {\n promptForInstallTargets,\n promptForSingleTarget,\n getTargetDirs,\n getTargetDirFromSelection,\n getSelectedIdes,\n hasExplicitIdeOption,\n} from \"../utils/ide.js\";\nimport {\n checkboxWithHover,\n terminalLink,\n formatInstallCount,\n formatTrustScore,\n} from \"../utils/prompts.js\";\nimport { installSkillFiles, symlinkSkill } from \"../utils/installer.js\";\nimport { trackEvent } from \"../utils/tracking.js\";\nimport { registerGenerateCommand } from \"./generate.js\";\nimport type {\n Skill,\n SkillSearchResult,\n AddOptions,\n ListOptions,\n RemoveOptions,\n SuggestOptions,\n InstallTargets,\n Scope,\n} from \"../types.js\";\nimport {\n IDE_NAMES,\n IDE_PATHS,\n IDE_GLOBAL_PATHS,\n UNIVERSAL_SKILLS_PATH,\n UNIVERSAL_SKILLS_GLOBAL_PATH,\n UNIVERSAL_AGENTS_LABEL,\n VENDOR_SPECIFIC_AGENTS,\n} from \"../types.js\";\nimport { homedir } from \"os\";\nimport { detectProjectDependencies } from \"../utils/deps.js\";\nimport { loadTokens, isTokenExpired } from \"../utils/auth.js\";\n\nfunction logInstallSummary(\n targets: InstallTargets,\n targetDirs: string[],\n skillNames: string[]\n): void {\n log.blank();\n const hasUniversal = targets.ides.some((ide) => ide === \"universal\");\n const vendorIdes = targets.ides.filter((ide) => ide !== \"universal\");\n\n let dirIndex = 0;\n if (hasUniversal && dirIndex < targetDirs.length) {\n log.plain(`${pc.bold(\"Universal\")} ${pc.dim(targetDirs[dirIndex])}`);\n for (const name of skillNames) {\n log.itemAdd(name);\n }\n dirIndex++;\n }\n\n for (const ide of vendorIdes) {\n if (dirIndex >= targetDirs.length) break;\n log.plain(`${pc.bold(IDE_NAMES[ide])} ${pc.dim(targetDirs[dirIndex])}`);\n for (const name of skillNames) {\n log.itemAdd(name);\n }\n dirIndex++;\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 // Register generate subcommand\n registerGenerateCommand(skill);\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(\"--universal\", \"Universal (.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(\"--universal\", \"Universal (.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(\"--universal\", \"Universal (.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 skill\n .command(\"suggest\")\n .option(\"--global\", \"Install globally instead of current directory\")\n .option(\"--claude\", \"Claude Code (.claude/skills/)\")\n .option(\"--cursor\", \"Cursor (.cursor/skills/)\")\n .option(\"--universal\", \"Universal (.agents/skills/)\")\n .option(\"--antigravity\", \"Antigravity (.agent/skills/)\")\n .description(\"Suggest skills based on your project dependencies\")\n .action(async (options: SuggestOptions) => {\n await suggestCommand(options);\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(\"--universal\", \"Universal (.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 program\n .command(\"ssg\", { hidden: true })\n .option(\"--global\", \"Install globally instead of current directory\")\n .option(\"--claude\", \"Claude Code (.claude/skills/)\")\n .option(\"--cursor\", \"Cursor (.cursor/skills/)\")\n .option(\"--universal\", \"Universal (.agents/skills/)\")\n .option(\"--antigravity\", \"Antigravity (.agent/skills/)\")\n .description(\"Suggest skills (alias for: skills suggest)\")\n .action(async (options: SuggestOptions) => {\n await suggestCommand(options);\n });\n}\n\nasync function installCommand(\n input: string,\n skillName: string | undefined,\n options: AddOptions\n): Promise<void> {\n trackEvent(\"command\", { name: \"install\" });\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\n .map((s) => ({ ...s, project: repo }))\n .sort((a, b) => (b.installCount ?? 0) - (a.installCount ?? 0));\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 indexWidth = data.skills.length.toString().length;\n const maxNameLen = Math.max(...data.skills.map((s) => s.name.length));\n const installsColWidth = 10;\n const choices = skillsWithRepo.map((s, index) => {\n const indexStr = pc.dim(`${(index + 1).toString().padStart(indexWidth)}.`);\n const paddedName = s.name.padEnd(maxNameLen);\n const installsRaw = s.installCount ? String(s.installCount) : \"-\";\n const paddedInstalls =\n formatInstallCount(s.installCount, pc.dim(\"-\")) +\n \" \".repeat(installsColWidth - installsRaw.length);\n const trust = formatTrustScore(s.trustScore);\n\n const skillUrl = `https://context7.com/skills${s.project}/${s.name}`;\n const skillLink = terminalLink(s.name, skillUrl, pc.white);\n const repoLink = terminalLink(s.project, `https://github.com${s.project}`, pc.white);\n const metadataLines = [\n pc.dim(\"─\".repeat(50)),\n \"\",\n `${pc.yellow(\"Skill:\")} ${skillLink}`,\n `${pc.yellow(\"Repo:\")} ${repoLink}`,\n `${pc.yellow(\"Description:\")}`,\n pc.white(s.description || \"No description\"),\n ];\n\n return {\n name: `${indexStr} ${paddedName} ${paddedInstalls}${trust}`,\n value: s,\n description: metadataLines.join(\"\\n\"),\n };\n });\n\n log.blank();\n\n const checkboxPrefixWidth = 3;\n const headerPad = \" \".repeat(checkboxPrefixWidth + indexWidth + 1 + 1 + maxNameLen + 1);\n const headerLine =\n headerPad + pc.dim(\"Installs\".padEnd(installsColWidth)) + pc.dim(\"Trust(0-10)\");\n\n try {\n selectedSkills = await checkboxWithHover({\n message: `Select skills to install:\\n${headerLine}`,\n choices,\n pageSize: 15,\n loop: false,\n theme: {\n style: {\n message: (text: string, status: string) => {\n if (status === \"done\") return pc.dim(text.split(\"\\n\")[0]);\n return pc.bold(text);\n },\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 trackEvent(\"install\", { skills: installedSkills, ides: 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 trackEvent(\"command\", { name: \"search\" });\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 trackEvent(\"search_query\", { query, resultCount: data.results.length });\n log.blank();\n\n const indexWidth = data.results.length.toString().length;\n const maxNameLen = Math.max(...data.results.map((s) => s.name.length));\n const installsColWidth = 10;\n const choices = data.results.map((s, index) => {\n const indexStr = pc.dim(`${(index + 1).toString().padStart(indexWidth)}.`);\n const paddedName = s.name.padEnd(maxNameLen);\n const installsRaw = s.installCount ? String(s.installCount) : \"-\";\n const paddedInstalls =\n formatInstallCount(s.installCount, pc.dim(\"-\")) +\n \" \".repeat(installsColWidth - installsRaw.length);\n const trust = formatTrustScore(s.trustScore);\n\n const skillLink = terminalLink(\n s.name,\n `https://context7.com/skills${s.project}/${s.name}`,\n pc.white\n );\n const repoLink = terminalLink(s.project, `https://github.com${s.project}`, pc.white);\n const metadataLines = [\n pc.dim(\"─\".repeat(50)),\n \"\",\n `${pc.yellow(\"Skill:\")} ${skillLink}`,\n `${pc.yellow(\"Repo:\")} ${repoLink}`,\n `${pc.yellow(\"Description:\")}`,\n pc.white(s.description || \"No description\"),\n ];\n\n return {\n name: `${indexStr} ${paddedName} ${paddedInstalls}${trust}`,\n value: s,\n description: metadataLines.join(\"\\n\"),\n };\n });\n\n const checkboxPrefixWidth = 3; // \"❯◯ \" or \" ◯ \"\n const headerPad = \" \".repeat(checkboxPrefixWidth + indexWidth + 1 + 1 + maxNameLen + 1);\n const headerLine =\n headerPad + pc.dim(\"Installs\".padEnd(installsColWidth)) + pc.dim(\"Trust(0-10)\");\n\n let selectedSkills: SkillSearchResult[];\n try {\n selectedSkills = await checkboxWithHover({\n message: `Select skills to install:\\n${headerLine}`,\n choices,\n pageSize: 15,\n loop: false,\n theme: {\n style: {\n message: (text: string, status: string) => {\n if (status === \"done\") return pc.dim(text.split(\"\\n\")[0]);\n return pc.bold(text);\n },\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 trackEvent(\"install\", { skills: installedSkills, ides: 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 trackEvent(\"command\", { name: \"list\" });\n const scope: Scope = options.global ? \"global\" : \"project\";\n const baseDir = scope === \"global\" ? homedir() : process.cwd();\n\n const results: { label: string; path: string; skills: string[] }[] = [];\n\n // Helper to scan a skills directory\n async function scanDir(dir: string): Promise<string[]> {\n try {\n const entries = await readdir(dir, { withFileTypes: true });\n return entries.filter((e) => e.isDirectory() || e.isSymbolicLink()).map((e) => e.name);\n } catch {\n return [];\n }\n }\n\n if (hasExplicitIdeOption(options)) {\n // Explicit flag mode — check the specific IDE paths\n const ides = getSelectedIdes(options);\n for (const ide of ides) {\n const dir =\n ide === \"universal\"\n ? join(baseDir, scope === \"global\" ? UNIVERSAL_SKILLS_GLOBAL_PATH : UNIVERSAL_SKILLS_PATH)\n : join(baseDir, (scope === \"global\" ? IDE_GLOBAL_PATHS : IDE_PATHS)[ide]);\n const label = ide === \"universal\" ? UNIVERSAL_AGENTS_LABEL : IDE_NAMES[ide];\n const skills = await scanDir(dir);\n if (skills.length > 0) {\n results.push({ label, path: dir, skills });\n }\n }\n } else {\n // Default: check universal + vendor-specific\n const universalPath = scope === \"global\" ? UNIVERSAL_SKILLS_GLOBAL_PATH : UNIVERSAL_SKILLS_PATH;\n const universalDir = join(baseDir, universalPath);\n const universalSkills = await scanDir(universalDir);\n if (universalSkills.length > 0) {\n results.push({ label: UNIVERSAL_AGENTS_LABEL, path: universalPath, skills: universalSkills });\n }\n\n for (const ide of VENDOR_SPECIFIC_AGENTS) {\n const pathMap = scope === \"global\" ? IDE_GLOBAL_PATHS : IDE_PATHS;\n const dir = join(baseDir, pathMap[ide]);\n const skills = await scanDir(dir);\n if (skills.length > 0) {\n results.push({ label: IDE_NAMES[ide], path: pathMap[ide], skills });\n }\n }\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, path, skills } of results) {\n log.plain(`${pc.bold(label)} ${pc.dim(path)}`);\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) {\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 trackEvent(\"command\", { name: \"info\" });\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\nasync function suggestCommand(options: SuggestOptions): Promise<void> {\n trackEvent(\"command\", { name: \"suggest\" });\n log.blank();\n\n // Step 1: Detect dependencies\n const scanSpinner = ora(\"Scanning project dependencies...\").start();\n const deps = await detectProjectDependencies(process.cwd());\n\n if (deps.length === 0) {\n scanSpinner.warn(pc.yellow(\"No dependencies detected\"));\n log.info(`Try ${pc.cyan(\"ctx7 skills search <keyword>\")} to search manually`);\n return;\n }\n\n scanSpinner.succeed(`Found ${deps.length} dependencies`);\n\n // Step 2: Single API call to backend\n const searchSpinner = ora(\"Finding matching skills...\").start();\n\n const tokens = loadTokens();\n const accessToken = tokens && !isTokenExpired(tokens) ? tokens.access_token : undefined;\n\n let data;\n try {\n data = await suggestSkills(deps, accessToken);\n } catch {\n searchSpinner.fail(pc.red(\"Failed to connect to Context7\"));\n return;\n }\n\n if (data.error) {\n searchSpinner.fail(pc.red(`Error: ${data.message || data.error}`));\n return;\n }\n\n const skills = data.skills;\n\n if (skills.length === 0) {\n searchSpinner.warn(pc.yellow(\"No matching skills found for your dependencies\"));\n return;\n }\n\n searchSpinner.succeed(`Found ${skills.length} relevant skill(s)`);\n trackEvent(\"suggest_results\", { depCount: deps.length, skillCount: skills.length });\n log.blank();\n\n const maxNameLen = Math.max(...skills.map((s) => s.name.length));\n const installsColWidth = 10;\n const trustColWidth = 12;\n const maxMatchedLen = Math.max(...skills.map((s) => s.matchedDep.length));\n const indexWidth = skills.length.toString().length;\n\n const choices = skills.map((s, index) => {\n const indexStr = pc.dim(`${(index + 1).toString().padStart(indexWidth)}.`);\n const paddedName = s.name.padEnd(maxNameLen);\n const installsRaw = s.installCount ? String(s.installCount) : \"-\";\n const paddedInstalls =\n formatInstallCount(s.installCount, pc.dim(\"-\")) +\n \" \".repeat(installsColWidth - installsRaw.length);\n const trustRaw =\n s.trustScore !== undefined && s.trustScore >= 0 ? s.trustScore.toFixed(1) : \"-\";\n const trust = formatTrustScore(s.trustScore) + \" \".repeat(trustColWidth - trustRaw.length);\n const matched = pc.yellow(s.matchedDep.padEnd(maxMatchedLen));\n\n const skillLink = terminalLink(\n s.name,\n `https://context7.com/skills${s.project}/${s.name}`,\n pc.white\n );\n const repoLink = terminalLink(s.project, `https://github.com${s.project}`, pc.white);\n const metadataLines = [\n pc.dim(\"─\".repeat(50)),\n \"\",\n `${pc.yellow(\"Skill:\")} ${skillLink}`,\n `${pc.yellow(\"Repo:\")} ${repoLink}`,\n `${pc.yellow(\"Relevant:\")} ${pc.white(s.matchedDep)}`,\n `${pc.yellow(\"Description:\")}`,\n pc.white(s.description || \"No description\"),\n ];\n\n return {\n name: `${indexStr} ${paddedName} ${paddedInstalls}${trust}${matched}`,\n value: s,\n description: metadataLines.join(\"\\n\"),\n };\n });\n\n const checkboxPrefixWidth = 3; // \"❯◯ \" or \" ◯ \"\n const headerPad = \" \".repeat(checkboxPrefixWidth + indexWidth + 1 + 1 + maxNameLen + 1);\n const headerLine =\n headerPad +\n pc.dim(\"Installs\".padEnd(installsColWidth)) +\n pc.dim(\"Trust(0-10)\".padEnd(trustColWidth)) +\n pc.dim(\"Relevant\");\n\n let selectedSkills: SkillSearchResult[];\n try {\n selectedSkills = await checkboxWithHover({\n message: `Select skills to install:\\n${headerLine}`,\n choices,\n pageSize: 15,\n loop: false,\n theme: {\n style: {\n message: (text: string, status: string) => {\n if (status === \"done\") return pc.dim(text.split(\"\\n\")[0]);\n return pc.bold(text);\n },\n },\n },\n });\n } catch {\n log.warn(\"Installation cancelled\");\n return;\n }\n\n if (selectedSkills.length === 0) {\n log.warn(\"No skills selected\");\n return;\n }\n\n // Step 4: Install (same pattern as searchCommand)\n const targets = await promptForInstallTargets(options);\n if (!targets) {\n log.warn(\"Installation cancelled\");\n return;\n }\n\n const targetDirs = getTargetDirs(targets);\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 trackEvent(\"suggest_install\", { skills: installedSkills, ides: targets.ides });\n\n const installedNames = selectedSkills.map((s) => s.name);\n logInstallSummary(targets, targetDirs, installedNames);\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 SuggestResponse,\n DownloadResponse,\n LibrarySearchResponse,\n SkillQuestionsResponse,\n StructuredGenerateInput,\n GenerateStreamEvent,\n SkillQuotaResponse,\n} from \"../types.js\";\nimport { downloadSkillFromGitHub } from \"./github.js\";\n\nlet baseUrl = \"https://context7.com\";\n\nexport function getBaseUrl(): string {\n return baseUrl;\n}\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 async function suggestSkills(\n dependencies: string[],\n accessToken?: string\n): Promise<SuggestResponse> {\n const headers: Record<string, string> = { \"Content-Type\": \"application/json\" };\n if (accessToken) {\n headers[\"Authorization\"] = `Bearer ${accessToken}`;\n }\n const response = await fetch(`${baseUrl}/api/v2/skills/suggest`, {\n method: \"POST\",\n headers,\n body: JSON.stringify({ dependencies }),\n });\n return (await response.json()) as SuggestResponse;\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\nexport interface GenerateSkillResponse {\n content: string;\n libraryName: string;\n error?: string;\n}\n\nexport async function searchLibraries(\n query: string,\n accessToken?: string\n): Promise<LibrarySearchResponse> {\n const params = new URLSearchParams({ query });\n const headers: Record<string, string> = {};\n if (accessToken) {\n headers[\"Authorization\"] = `Bearer ${accessToken}`;\n }\n const response = await fetch(`${baseUrl}/api/v2/libs/search?${params}`, { headers });\n return (await response.json()) as LibrarySearchResponse;\n}\n\nexport async function getSkillQuota(accessToken: string): Promise<SkillQuotaResponse> {\n const response = await fetch(`${baseUrl}/api/v2/skills/quota`, {\n headers: { Authorization: `Bearer ${accessToken}` },\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n return {\n used: 0,\n limit: 0,\n remaining: 0,\n tier: \"free\",\n resetDate: null,\n error: (errorData as { message?: string }).message || `HTTP error ${response.status}`,\n };\n }\n\n return (await response.json()) as SkillQuotaResponse;\n}\n\nexport async function getSkillQuestions(\n libraries: Array<{ id: string; name: string }>,\n motivation: string,\n accessToken?: string\n): Promise<SkillQuestionsResponse> {\n const headers: Record<string, string> = { \"Content-Type\": \"application/json\" };\n if (accessToken) {\n headers[\"Authorization\"] = `Bearer ${accessToken}`;\n }\n\n const response = await fetch(`${baseUrl}/api/v2/skills/questions`, {\n method: \"POST\",\n headers,\n body: JSON.stringify({ libraries, motivation }),\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n return {\n questions: [],\n error: (errorData as { message?: string }).message || `HTTP error ${response.status}`,\n };\n }\n\n return (await response.json()) as SkillQuestionsResponse;\n}\n\nexport async function generateSkillStructured(\n input: StructuredGenerateInput,\n onEvent?: (event: GenerateStreamEvent) => void,\n accessToken?: string\n): Promise<GenerateSkillResponse> {\n const headers: Record<string, string> = { \"Content-Type\": \"application/json\" };\n if (accessToken) {\n headers[\"Authorization\"] = `Bearer ${accessToken}`;\n }\n\n const response = await fetch(`${baseUrl}/api/v2/skills/generate`, {\n method: \"POST\",\n headers,\n body: JSON.stringify(input),\n });\n\n const libraryName = input.libraries[0]?.name || \"skill\";\n return handleGenerateResponse(response, libraryName, onEvent);\n}\n\nasync function handleGenerateResponse(\n response: Response,\n libraryName: string,\n onEvent?: (event: GenerateStreamEvent) => void\n): Promise<GenerateSkillResponse> {\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n return {\n content: \"\",\n libraryName,\n error: (errorData as { message?: string }).message || `HTTP error ${response.status}`,\n };\n }\n\n const reader = response.body?.getReader();\n if (!reader) {\n return { content: \"\", libraryName, error: \"No response body\" };\n }\n\n const decoder = new TextDecoder();\n let content = \"\";\n let finalLibraryName = libraryName;\n let error: string | undefined;\n let buffer = \"\"; // Buffer for incomplete lines across chunks\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n const chunk = decoder.decode(value, { stream: true });\n buffer += chunk;\n\n // Split by newline but keep track of incomplete lines\n const lines = buffer.split(\"\\n\");\n // Keep the last element (may be incomplete) in the buffer\n buffer = lines.pop() || \"\";\n\n for (const line of lines) {\n const trimmedLine = line.trim();\n if (!trimmedLine) continue;\n\n try {\n const data = JSON.parse(trimmedLine) as GenerateStreamEvent;\n\n if (onEvent) {\n onEvent(data);\n }\n\n if (data.type === \"complete\") {\n content = data.content || \"\";\n finalLibraryName = data.libraryName || libraryName;\n } else if (data.type === \"error\") {\n error = data.message;\n }\n } catch {\n // Ignore malformed JSON lines\n }\n }\n }\n\n // Process any remaining data in the buffer\n if (buffer.trim()) {\n try {\n const data = JSON.parse(buffer.trim()) as GenerateStreamEvent;\n if (onEvent) {\n onEvent(data);\n }\n if (data.type === \"complete\") {\n content = data.content || \"\";\n finalLibraryName = data.libraryName || libraryName;\n } else if (data.type === \"error\") {\n error = data.message;\n }\n } catch {\n // Ignore malformed JSON\n }\n }\n\n return { content, libraryName: finalLibraryName, error };\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, confirm } from \"@inquirer/prompts\";\nimport { access } from \"fs/promises\";\nimport { join, dirname } from \"path\";\nimport { homedir } from \"os\";\n\nimport { log } from \"./logger.js\";\nimport { checkboxWithHover } from \"./prompts.js\";\nimport type {\n IDE,\n IDEOptions,\n Scope,\n AddOptions,\n ListOptions,\n RemoveOptions,\n InstallTargets,\n} from \"../types.js\";\nimport {\n IDE_PATHS,\n IDE_GLOBAL_PATHS,\n IDE_NAMES,\n UNIVERSAL_SKILLS_PATH,\n UNIVERSAL_SKILLS_GLOBAL_PATH,\n UNIVERSAL_AGENTS_LABEL,\n VENDOR_SPECIFIC_AGENTS,\n DEFAULT_CONFIG,\n} from \"../types.js\";\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.universal) ides.push(\"universal\");\n if (options.antigravity) ides.push(\"antigravity\");\n return ides;\n}\n\nexport function hasExplicitIdeOption(options: IDEOptions): boolean {\n return !!(options.claude || options.cursor || options.universal || options.antigravity);\n}\n\n/** Detect vendor-specific agents whose parent directory exists. */\nasync function detectVendorSpecificAgents(scope: Scope): Promise<IDE[]> {\n const baseDir = scope === \"global\" ? homedir() : process.cwd();\n const pathMap = scope === \"global\" ? IDE_GLOBAL_PATHS : IDE_PATHS;\n const detected: IDE[] = [];\n\n for (const ide of VENDOR_SPECIFIC_AGENTS) {\n const parentDir = dirname(pathMap[ide]);\n try {\n await access(join(baseDir, parentDir));\n detected.push(ide);\n } catch {}\n }\n\n return detected;\n}\n\nexport function getUniversalDir(scope: Scope): string {\n if (scope === \"global\") {\n return join(homedir(), UNIVERSAL_SKILLS_GLOBAL_PATH);\n }\n return join(process.cwd(), UNIVERSAL_SKILLS_PATH);\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 scope: Scope = options.global ? \"global\" : \"project\";\n const baseDir = scope === \"global\" ? homedir() : process.cwd();\n const pathMap = scope === \"global\" ? IDE_GLOBAL_PATHS : IDE_PATHS;\n const universalPath = scope === \"global\" ? UNIVERSAL_SKILLS_GLOBAL_PATH : UNIVERSAL_SKILLS_PATH;\n\n // Detect universal (.agents/) and vendor-specific agent directories\n const detectedVendor = await detectVendorSpecificAgents(scope);\n let hasUniversalDir = false;\n try {\n await access(join(baseDir, dirname(universalPath)));\n hasUniversalDir = true;\n } catch {}\n\n const detectedIdes: IDE[] = [\n ...(hasUniversalDir ? ([\"universal\"] as IDE[]) : []),\n ...detectedVendor,\n ];\n\n if (detectedIdes.length > 0) {\n // Detected — just confirm\n const pathLines: string[] = [];\n if (hasUniversalDir) {\n pathLines.push(join(baseDir, universalPath));\n }\n for (const ide of detectedVendor) {\n pathLines.push(join(baseDir, pathMap[ide]));\n }\n\n log.blank();\n\n let confirmed: boolean;\n try {\n confirmed = await confirm({\n message: `Install to detected location(s)?\\n${pc.dim(pathLines.join(\"\\n\"))}`,\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: detectedIdes, scopes: [scope] };\n }\n\n // Nothing detected — show checkbox to pick\n const universalLabel = `Universal \\u2014 ${UNIVERSAL_AGENTS_LABEL} ${pc.dim(`(${universalPath})`)}`;\n const choices: { name: string; value: IDE; checked: boolean }[] = [\n { name: universalLabel, value: \"universal\", checked: true },\n ];\n\n for (const ide of VENDOR_SPECIFIC_AGENTS) {\n choices.push({\n name: `${IDE_NAMES[ide]} ${pc.dim(`(${pathMap[ide]})`)}`,\n value: ide,\n checked: false,\n });\n }\n\n log.blank();\n\n let selectedIdes: IDE[];\n try {\n selectedIdes = await checkboxWithHover(\n {\n message: `Which agents do you want to install to?\\n${pc.dim(` ${baseDir}`)}`,\n choices,\n loop: false,\n theme: {\n style: {\n highlight: (text: string) => pc.green(text),\n message: (text: string, status: string) => {\n if (status === \"done\") return pc.dim(text.split(\"\\n\")[0]);\n return pc.bold(text);\n },\n },\n },\n },\n { getName: (ide: IDE) => IDE_NAMES[ide] }\n );\n } catch {\n return null;\n }\n\n // Universal is always included\n const ides: IDE[] = [\"universal\", ...selectedIdes.filter((ide) => ide !== \"universal\")];\n\n return { ides, 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 universalLabel = `Universal ${pc.dim(`(${UNIVERSAL_SKILLS_PATH})`)}`;\n const choices: { name: string; value: IDE }[] = [{ name: universalLabel, value: \"universal\" }];\n\n for (const ide of VENDOR_SPECIFIC_AGENTS) {\n choices.push({\n name: `${IDE_NAMES[ide]} ${pc.dim(`(${IDE_PATHS[ide]})`)}`,\n value: ide,\n });\n }\n\n let selectedIde: IDE;\n try {\n selectedIde = await select({\n message: \"Which location?\",\n choices,\n default: DEFAULT_CONFIG.defaultIde,\n loop: false,\n theme: { style: { highlight: (text: string) => pc.green(text) } },\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 loop: false,\n theme: { style: { highlight: (text: string) => pc.green(text) } },\n });\n } catch {\n return null;\n }\n }\n\n return { ide: selectedIde, scope: selectedScope };\n}\n\nexport function getTargetDirs(targets: InstallTargets): string[] {\n const hasUniversal = targets.ides.some((ide) => ide === \"universal\");\n const dirs: string[] = [];\n\n for (const scope of targets.scopes) {\n const baseDir = scope === \"global\" ? homedir() : process.cwd();\n\n if (hasUniversal) {\n const uniPath = scope === \"global\" ? UNIVERSAL_SKILLS_GLOBAL_PATH : UNIVERSAL_SKILLS_PATH;\n dirs.push(join(baseDir, uniPath));\n }\n\n for (const ide of targets.ides) {\n if (ide === \"universal\") continue;\n const pathMap = scope === \"global\" ? IDE_GLOBAL_PATHS : IDE_PATHS;\n dirs.push(join(baseDir, pathMap[ide]));\n }\n }\n\n return dirs;\n}\n\nexport function getTargetDirFromSelection(ide: IDE, scope: Scope): string {\n if (ide === \"universal\") {\n return getUniversalDir(scope);\n }\n if (scope === \"global\") {\n return join(homedir(), IDE_GLOBAL_PATHS[ide]);\n }\n return join(process.cwd(), IDE_PATHS[ide]);\n}\n","import pc from \"picocolors\";\nimport { checkbox, type Separator } from \"@inquirer/prompts\";\nimport readline from \"readline\";\n\ntype CheckboxConfig<T> = Parameters<typeof checkbox<T>>[0];\ntype CheckboxChoice<T> = Exclude<CheckboxConfig<T>[\"choices\"][number], Separator | string>;\n\n/**\n * Creates a clickable terminal hyperlink using OSC 8 escape sequence.\n */\nexport function terminalLink(text: string, url: string, color?: (s: string) => string): string {\n const colorFn = color ?? ((s: string) => s);\n return `\\x1b]8;;${url}\\x07${colorFn(text)}\\x1b]8;;\\x07 ${pc.white(\"↗\")}`;\n}\n\n/**\n * Formats install count for display.\n */\nexport function formatInstallCount(count: number | undefined, placeholder = \"\"): string {\n if (count === undefined || count === 0) return placeholder;\n\n return pc.yellow(String(count));\n}\n\nexport function formatTrustScore(score: number | undefined): string {\n if (score === undefined || score < 0) return pc.dim(\"-\");\n\n if (score < 3) return pc.red(score.toFixed(1));\n return pc.yellow(score.toFixed(1));\n}\nexport interface CheckboxWithHoverOptions<T> {\n /** Function to extract display name from value. Defaults to (v) => v.name */\n getName?: (value: T) => string;\n}\n\nexport async function checkboxWithHover<T>(\n config: CheckboxConfig<T>,\n options?: CheckboxWithHoverOptions<T>\n): Promise<T[]> {\n const choices = config.choices.filter(\n (c): c is CheckboxChoice<T> =>\n typeof c === \"object\" && c !== null && !(\"type\" in c && c.type === \"separator\")\n );\n const values = choices.map((c) => c.value);\n const totalItems = values.length;\n let cursorPosition = 0;\n\n // Default getName assumes object has 'name' property\n const getName = options?.getName ?? ((v: T) => (v as { name: string }).name);\n\n const keypressHandler = (_str: string | undefined, key: readline.Key) => {\n if (key.name === \"up\" && cursorPosition > 0) {\n cursorPosition--;\n } else if (key.name === \"down\" && cursorPosition < totalItems - 1) {\n cursorPosition++;\n }\n };\n\n readline.emitKeypressEvents(process.stdin);\n process.stdin.on(\"keypress\", keypressHandler);\n\n const customConfig = {\n ...config,\n theme: {\n ...config.theme,\n style: {\n ...config.theme?.style,\n highlight: (text: string) => pc.green(text),\n renderSelectedChoices: (\n selected: CheckboxChoice<T>[],\n _allChoices: CheckboxChoice<T>[]\n ): string => {\n if (selected.length === 0) {\n return pc.dim(getName(values[cursorPosition]));\n }\n return selected.map((c) => getName(c.value)).join(\", \");\n },\n },\n },\n };\n\n try {\n const selected = await checkbox(customConfig);\n if (selected.length === 0) {\n return [values[cursorPosition]];\n }\n return selected;\n } finally {\n process.stdin.removeListener(\"keypress\", keypressHandler);\n }\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 installCount?: number;\n trustScore?: number;\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\n// Library search types\nexport interface LibrarySearchResult {\n id: string;\n title: string;\n description: string;\n branch: string;\n totalSnippets: number;\n totalTokens?: number;\n stars?: number;\n trustScore?: number;\n benchmarkScore?: number;\n versions?: string[];\n vip?: boolean;\n}\n\nexport interface LibrarySearchResponse {\n results: LibrarySearchResult[];\n error?: string;\n message?: string;\n}\n\n// Skill generation types\nexport interface SkillQuestion {\n question: string;\n options: string[];\n recommendedIndex: number;\n}\n\nexport interface SkillQuestionsResponse {\n questions: SkillQuestion[];\n error?: string;\n message?: string;\n}\n\nexport interface SkillAnswer {\n question: string;\n answer: string;\n}\n\nexport interface LibraryInput {\n id: string;\n name: string;\n}\n\nexport interface StructuredGenerateInput {\n motivation: string;\n libraries: LibraryInput[];\n answers: SkillAnswer[];\n feedback?: string;\n previousContent?: string;\n}\n\nexport interface ToolResultSnippet {\n title: string;\n content: string;\n}\n\nexport interface ProgressEvent {\n type: \"progress\";\n message: string;\n}\n\nexport interface ToolResultEvent {\n type: \"tool_result\";\n toolName: string;\n query: string;\n libraryId?: string;\n results: ToolResultSnippet[];\n}\n\nexport interface CompleteEvent {\n type: \"complete\";\n content: string;\n libraryName: string;\n}\n\nexport interface ErrorEvent {\n type: \"error\";\n message: string;\n}\n\nexport type GenerateStreamEvent = ProgressEvent | ToolResultEvent | CompleteEvent | ErrorEvent;\n\nexport type IDE = \"claude\" | \"cursor\" | \"antigravity\" | \"universal\";\n\nexport type Scope = \"project\" | \"global\";\n\nexport interface IDEOptions {\n claude?: boolean;\n cursor?: boolean;\n universal?: boolean;\n antigravity?: boolean;\n}\n\nexport interface ScopeOptions {\n global?: boolean;\n}\n\nexport type AddOptions = IDEOptions & ScopeOptions & { all?: boolean };\nexport type SuggestOptions = IDEOptions & ScopeOptions;\nexport type ListOptions = IDEOptions & ScopeOptions;\nexport type RemoveOptions = IDEOptions & ScopeOptions;\nexport type GenerateOptions = IDEOptions &\n ScopeOptions & {\n output?: string;\n all?: boolean;\n };\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 antigravity: \".agent/skills\",\n universal: \".agents/skills\",\n};\n\nexport const IDE_GLOBAL_PATHS: Record<IDE, string> = {\n claude: \".claude/skills\",\n cursor: \".cursor/skills\",\n antigravity: \".agent/skills\",\n universal: \".config/agents/skills\",\n};\n\nexport const IDE_NAMES: Record<IDE, string> = {\n claude: \"Claude Code\",\n cursor: \"Cursor\",\n antigravity: \"Antigravity\",\n universal: \"Universal\",\n};\n\n// Universal .agents/skills standard\n// These agents read from .agents/skills/ natively — one install covers all of them.\nexport const UNIVERSAL_SKILLS_PATH = \".agents/skills\";\nexport const UNIVERSAL_SKILLS_GLOBAL_PATH = \".config/agents/skills\";\n\n// Display label for agents that read .agents/skills/ (includes agents beyond our IDE type)\nexport const UNIVERSAL_AGENTS_LABEL = \"Amp, Codex, Gemini CLI, GitHub Copilot, OpenCode + more\";\n\n// Agents that still require their own vendor-specific skill directory.\nexport const VENDOR_SPECIFIC_AGENTS: IDE[] = [\"claude\", \"cursor\", \"antigravity\"];\n\nexport interface C7Config {\n defaultIde: IDE;\n defaultScope: \"project\" | \"global\";\n}\n\nexport const DEFAULT_CONFIG: C7Config = {\n defaultIde: \"universal\",\n defaultScope: \"project\",\n};\n\n// Suggest endpoint types\nexport interface SuggestSkill extends SkillSearchResult {\n matchedDep: string;\n}\n\nexport interface SuggestResponse {\n skills: SuggestSkill[];\n error?: string;\n message?: string;\n}\n\nexport interface SkillQuotaResponse {\n used: number;\n limit: number;\n remaining: number;\n tier: \"free\" | \"pro\" | \"unlimited\";\n resetDate: string | null;\n message?: string;\n error?: string;\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 { getBaseUrl } from \"./api.js\";\n\nexport function trackEvent(event: string, data?: Record<string, unknown>): void {\n if (process.env.CTX7_TELEMETRY_DISABLED) return;\n fetch(`${getBaseUrl()}/api/v2/cli/events`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ event, data }),\n }).catch(() => {});\n}\n","import { Command } from \"commander\";\nimport pc from \"picocolors\";\nimport ora from \"ora\";\nimport { mkdir, writeFile, readFile, unlink } from \"fs/promises\";\nimport { join } from \"path\";\nimport { homedir } from \"os\";\nimport { spawn } from \"child_process\";\nimport { input, select } from \"@inquirer/prompts\";\n\nimport {\n searchLibraries,\n getSkillQuestions,\n generateSkillStructured,\n getSkillQuota,\n} from \"../utils/api.js\";\nimport { loadTokens, isTokenExpired } from \"../utils/auth.js\";\nimport { performLogin } from \"./auth.js\";\nimport { log } from \"../utils/logger.js\";\nimport { promptForInstallTargets, getTargetDirs } from \"../utils/ide.js\";\nimport selectOrInput from \"../utils/selectOrInput.js\";\nimport { checkboxWithHover, terminalLink } from \"../utils/prompts.js\";\nimport { trackEvent } from \"../utils/tracking.js\";\nimport type {\n GenerateOptions,\n LibrarySearchResult,\n SkillAnswer,\n StructuredGenerateInput,\n GenerateStreamEvent,\n ToolResultSnippet,\n} from \"../types.js\";\n\ninterface QueryLogEntry {\n query: string;\n libraryId?: string;\n results: ToolResultSnippet[];\n}\n\nexport function registerGenerateCommand(skillCommand: Command): void {\n skillCommand\n .command(\"generate\")\n .alias(\"gen\")\n .alias(\"g\")\n .option(\"-o, --output <dir>\", \"Output directory (default: current directory)\")\n .option(\"--all\", \"Generate for all detected IDEs\")\n .option(\"--global\", \"Generate in global skills directory\")\n .option(\"--claude\", \"Claude Code (.claude/skills/)\")\n .option(\"--cursor\", \"Cursor (.cursor/skills/)\")\n .option(\"--universal\", \"Universal (.agents/skills/)\")\n .option(\"--antigravity\", \"Antigravity (.agent/skills/)\")\n .description(\"Generate a skill for a library using AI\")\n .action(async (options: GenerateOptions) => {\n await generateCommand(options);\n });\n}\n\nasync function generateCommand(options: GenerateOptions): Promise<void> {\n trackEvent(\"command\", { name: \"generate\" });\n log.blank();\n\n let accessToken: string | null = null;\n const tokens = loadTokens();\n if (tokens && !isTokenExpired(tokens)) {\n accessToken = tokens.access_token;\n } else {\n log.info(\"Authentication required. Logging in...\");\n log.blank();\n accessToken = await performLogin();\n if (!accessToken) {\n log.error(\"Login failed. Please try again.\");\n return;\n }\n log.blank();\n }\n\n const initSpinner = ora().start();\n const quota = await getSkillQuota(accessToken);\n\n if (quota.error) {\n initSpinner.fail(pc.red(\"Failed to initialize\"));\n return;\n }\n\n if (quota.tier !== \"unlimited\" && quota.remaining < 1) {\n initSpinner.fail(pc.red(\"Weekly skill generation limit reached\"));\n log.blank();\n console.log(\n ` You've used ${pc.bold(pc.white(quota.used.toString()))}/${pc.bold(pc.white(quota.limit.toString()))} skill generations this week.`\n );\n console.log(\n ` Your quota resets on ${pc.yellow(new Date(quota.resetDate!).toLocaleDateString())}.`\n );\n log.blank();\n if (quota.tier === \"free\") {\n console.log(\n ` ${pc.yellow(\"Tip:\")} Upgrade to Pro for ${pc.bold(\"10\")} generations per week.`\n );\n console.log(` Visit ${pc.green(\"https://context7.com/dashboard\")} to upgrade.`);\n }\n return;\n }\n\n initSpinner.stop();\n initSpinner.clear();\n\n console.log(pc.bold(\"What should your agent become an expert at?\\n\"));\n console.log(\n pc.dim(\n \"Skills should encode best practices, constraints, and decision-making —\\nnot step-by-step tutorials or one-off tasks.\\n\"\n )\n );\n console.log(pc.yellow(\"Examples:\"));\n // prettier-ignore\n {\n console.log(pc.red(' ✕ \"Deploy a Next.js app to Vercel\"'));\n console.log(pc.green(' ✓ \"Best practices and constraints for deploying Next.js apps to Vercel\"'));\n log.blank();\n console.log(pc.red(' ✕ \"Use Tailwind for responsive design\"'));\n console.log(pc.green(' ✓ \"Responsive layout decision-making with Tailwind CSS\"'));\n log.blank();\n console.log(pc.red(' ✕ \"Build OAuth with NextAuth\"'));\n console.log(pc.green(' ✓ \"OAuth authentication patterns and pitfalls with NextAuth.js\"'));\n }\n log.blank();\n\n let motivation: string;\n try {\n motivation = await input({\n message: \"Describe the expertise:\",\n });\n\n if (!motivation.trim()) {\n log.warn(\"Expertise description is required\");\n return;\n }\n motivation = motivation.trim();\n } catch {\n log.warn(\"Generation cancelled\");\n return;\n }\n\n log.blank();\n console.log(\n pc.dim(\n \"To generate this skill, we will read relevant documentation and examples\\nfrom Context7.\\n\"\n )\n );\n console.log(\n pc.dim(\n \"These sources are used to:\\n• extract best practices and constraints\\n• compare patterns across official docs and examples\\n• avoid outdated or incorrect guidance\\n\"\n )\n );\n console.log(pc.dim(\"You can adjust which sources the skill is based on.\\n\"));\n\n const searchSpinner = ora(\"Finding relevant sources...\").start();\n const searchResult = await searchLibraries(motivation, accessToken);\n\n if (searchResult.error || !searchResult.results?.length) {\n searchSpinner.fail(pc.red(\"No sources found\"));\n log.warn(searchResult.message || \"Try a different description\");\n return;\n }\n\n searchSpinner.succeed(pc.green(`Found ${searchResult.results.length} relevant sources`));\n log.blank();\n\n let selectedLibraries: LibrarySearchResult[];\n try {\n const formatProjectId = (id: string) => {\n return id.startsWith(\"/\") ? id.slice(1) : id;\n };\n\n const isGitHubRepo = (id: string): boolean => {\n const cleanId = id.startsWith(\"/\") ? id.slice(1) : id;\n const parts = cleanId.split(\"/\");\n if (parts.length !== 2) return false;\n const nonGitHubPrefixes = [\"websites\", \"packages\", \"npm\", \"docs\", \"libraries\", \"llmstxt\"];\n return !nonGitHubPrefixes.includes(parts[0].toLowerCase());\n };\n\n const libraries = searchResult.results.slice(0, 5);\n const indexWidth = libraries.length.toString().length;\n const maxNameLen = Math.max(...libraries.map((lib) => lib.title.length));\n\n const libraryChoices = libraries.map((lib, index) => {\n const projectId = formatProjectId(lib.id);\n const isGitHub = isGitHubRepo(lib.id);\n const indexStr = pc.dim(`${(index + 1).toString().padStart(indexWidth)}.`);\n const paddedName = lib.title.padEnd(maxNameLen);\n\n const libUrl = `https://context7.com${lib.id}`;\n const libLink = terminalLink(lib.title, libUrl, pc.white);\n const sourceUrl = isGitHub\n ? `https://github.com/${projectId}`\n : `https://context7.com${lib.id}`;\n const repoLink = terminalLink(projectId, sourceUrl, pc.white);\n\n const starsLine =\n lib.stars && isGitHub ? [`${pc.yellow(\"Stars:\")} ${lib.stars.toLocaleString()}`] : [];\n\n const metadataLines = [\n pc.dim(\"─\".repeat(50)),\n \"\",\n `${pc.yellow(\"Library:\")} ${libLink}`,\n `${pc.yellow(\"Source:\")} ${repoLink}`,\n `${pc.yellow(\"Snippets:\")} ${lib.totalSnippets.toLocaleString()}`,\n ...starsLine,\n `${pc.yellow(\"Description:\")}`,\n pc.white(lib.description || \"No description\"),\n ];\n\n return {\n name: `${indexStr} ${paddedName} ${pc.dim(`(${projectId})`)}`,\n value: lib,\n description: metadataLines.join(\"\\n\"),\n };\n });\n\n selectedLibraries = await checkboxWithHover(\n {\n message: \"Select sources:\",\n choices: libraryChoices,\n pageSize: 10,\n loop: false,\n },\n { getName: (lib) => `${lib.title} (${formatProjectId(lib.id)})` }\n );\n\n if (!selectedLibraries || selectedLibraries.length === 0) {\n log.info(\"No sources selected. Try running the command again.\");\n return;\n }\n } catch {\n log.warn(\"Generation cancelled\");\n return;\n }\n\n log.blank();\n\n const questionsSpinner = ora(\n \"Preparing follow-up questions to clarify scope and constraints...\"\n ).start();\n const librariesInput = selectedLibraries.map((lib) => ({ id: lib.id, name: lib.title }));\n const questionsResult = await getSkillQuestions(librariesInput, motivation, accessToken);\n\n if (questionsResult.error || !questionsResult.questions?.length) {\n questionsSpinner.fail(pc.red(\"Failed to generate questions\"));\n log.warn(questionsResult.message || \"Please try again\");\n return;\n }\n\n questionsSpinner.succeed(pc.green(\"Questions prepared\"));\n log.blank();\n\n const answers: SkillAnswer[] = [];\n try {\n for (let i = 0; i < questionsResult.questions.length; i++) {\n const q = questionsResult.questions[i];\n const questionNum = i + 1;\n const totalQuestions = questionsResult.questions.length;\n\n const answer = await selectOrInput({\n message: `${pc.dim(`[${questionNum}/${totalQuestions}]`)} ${q.question}`,\n options: q.options,\n recommendedIndex: q.recommendedIndex,\n });\n\n answers.push({\n question: q.question,\n answer,\n });\n\n const linesToClear = 3 + q.options.length;\n process.stdout.write(`\\x1b[${linesToClear}A\\x1b[J`);\n\n const truncatedAnswer = answer.length > 50 ? answer.slice(0, 47) + \"...\" : answer;\n console.log(`${pc.green(\"✓\")} ${pc.dim(`[${questionNum}/${totalQuestions}]`)} ${q.question}`);\n console.log(` ${pc.cyan(truncatedAnswer)}`);\n log.blank();\n }\n } catch {\n log.warn(\"Generation cancelled\");\n return;\n }\n\n let generatedContent: string | null = null;\n let skillName: string = \"\";\n let feedback: string | undefined;\n let previewFile: string | null = null;\n let previewFileWritten = false;\n\n const cleanupPreviewFile = async () => {\n if (previewFile) {\n await unlink(previewFile).catch(() => {});\n }\n };\n\n const queryLog: QueryLogEntry[] = [];\n let genSpinner: ReturnType<typeof ora> | null = null;\n\n const formatQueryLogText = (): string => {\n if (queryLog.length === 0) return \"\";\n\n const lines: string[] = [];\n const latestEntry = queryLog[queryLog.length - 1];\n\n lines.push(\"\");\n\n for (const result of latestEntry.results.slice(0, 3)) {\n const cleanContent = result.content.replace(/Source:\\s*https?:\\/\\/[^\\s]+/gi, \"\").trim();\n if (cleanContent) {\n lines.push(` ${pc.yellow(\"•\")} ${pc.white(result.title)}`);\n const maxLen = 400;\n const content =\n cleanContent.length > maxLen ? cleanContent.slice(0, maxLen - 3) + \"...\" : cleanContent;\n const words = content.split(\" \");\n let currentLine = \" \";\n for (const word of words) {\n if (currentLine.length + word.length > 84) {\n lines.push(pc.dim(currentLine));\n currentLine = \" \" + word + \" \";\n } else {\n currentLine += word + \" \";\n }\n }\n if (currentLine.trim()) {\n lines.push(pc.dim(currentLine));\n }\n lines.push(\"\");\n }\n }\n\n return \"\\n\" + lines.join(\"\\n\");\n };\n\n let isGeneratingContent = false;\n let initialStatus = \"Reading selected Context7 sources to generate the skill...\";\n\n const handleStreamEvent = (event: GenerateStreamEvent) => {\n if (event.type === \"progress\") {\n if (genSpinner) {\n if (event.message.startsWith(\"Generating skill content...\") && !isGeneratingContent) {\n isGeneratingContent = true;\n if (queryLog.length > 0) {\n genSpinner.succeed(pc.green(`Read Context7 sources`));\n } else {\n genSpinner.succeed(pc.green(`Ready to generate`));\n }\n genSpinner = ora(\"Generating skill content...\").start();\n } else if (!isGeneratingContent) {\n genSpinner.text = initialStatus + formatQueryLogText();\n }\n }\n } else if (event.type === \"tool_result\") {\n queryLog.push({\n query: event.query,\n libraryId: event.libraryId,\n results: event.results,\n });\n if (genSpinner && !isGeneratingContent) {\n genSpinner.text = genSpinner.text.split(\"\\n\")[0] + formatQueryLogText();\n }\n }\n };\n\n while (true) {\n const generateInput: StructuredGenerateInput = {\n motivation,\n libraries: librariesInput,\n answers,\n feedback,\n previousContent: feedback && generatedContent ? generatedContent : undefined,\n };\n\n queryLog.length = 0;\n isGeneratingContent = false;\n previewFileWritten = false;\n initialStatus = feedback\n ? \"Regenerating skill with your feedback...\"\n : \"Reading selected Context7 sources to generate the skill...\";\n\n genSpinner = ora(initialStatus).start();\n\n const result = await generateSkillStructured(generateInput, handleStreamEvent, accessToken);\n\n if (result.error) {\n genSpinner.fail(pc.red(`Error: ${result.error}`));\n return;\n }\n\n if (!result.content) {\n genSpinner.fail(pc.red(\"No content generated\"));\n return;\n }\n\n genSpinner.succeed(pc.green(`Generated skill for \"${result.libraryName}\"`));\n generatedContent = result.content;\n skillName = result.libraryName.toLowerCase().replace(/[^a-z0-9-]/g, \"-\");\n\n const contentLines = generatedContent.split(\"\\n\");\n const previewLineCount = 20;\n const hasMoreLines = contentLines.length > previewLineCount;\n const previewContent = contentLines.slice(0, previewLineCount).join(\"\\n\");\n const remainingLines = contentLines.length - previewLineCount;\n\n const showPreview = () => {\n log.blank();\n console.log(pc.dim(\"━\".repeat(70)));\n console.log(pc.bold(`Generated Skill: `) + pc.green(pc.bold(skillName)));\n console.log(pc.dim(\"━\".repeat(70)));\n log.blank();\n console.log(previewContent);\n if (hasMoreLines) {\n log.blank();\n console.log(pc.dim(`... ${remainingLines} more lines`));\n }\n log.blank();\n console.log(pc.dim(\"━\".repeat(70)));\n log.blank();\n };\n\n const openInEditor = async () => {\n const previewDir = join(homedir(), \".context7\", \"previews\");\n await mkdir(previewDir, { recursive: true });\n previewFile = join(previewDir, `${skillName}.md`);\n if (!previewFileWritten) {\n await writeFile(previewFile, generatedContent!, \"utf-8\");\n previewFileWritten = true;\n }\n const editor = process.env.EDITOR || \"open\";\n await new Promise<void>((resolve) => {\n const child = spawn(editor, [previewFile!], {\n stdio: \"inherit\",\n shell: true,\n });\n child.on(\"close\", () => resolve());\n });\n };\n\n const syncFromPreviewFile = async () => {\n if (previewFile) {\n generatedContent = await readFile(previewFile, \"utf-8\");\n }\n };\n\n showPreview();\n\n await new Promise((resolve) => setTimeout(resolve, 100));\n\n try {\n let action: string;\n while (true) {\n const choices = [\n { name: `${pc.green(\"✓\")} Install skill (save locally)`, value: \"install\" },\n { name: `${pc.blue(\"⤢\")} Edit skill in editor`, value: \"view\" },\n { name: `${pc.yellow(\"✎\")} Request changes`, value: \"feedback\" },\n { name: `${pc.red(\"✕\")} Cancel`, value: \"cancel\" },\n ];\n\n action = await select({\n message: \"What would you like to do?\",\n choices,\n });\n\n if (action === \"view\") {\n await openInEditor();\n continue;\n }\n await syncFromPreviewFile();\n break;\n }\n\n if (action === \"install\") {\n break;\n } else if (action === \"cancel\") {\n await cleanupPreviewFile();\n log.warn(\"Generation cancelled\");\n return;\n } else if (action === \"feedback\") {\n trackEvent(\"gen_feedback\");\n feedback = await input({\n message: \"What changes would you like? (press Enter to skip)\",\n });\n\n if (!feedback.trim()) {\n feedback = undefined;\n }\n log.blank();\n }\n } catch {\n await cleanupPreviewFile();\n log.warn(\"Generation cancelled\");\n return;\n }\n }\n\n const targets = await promptForInstallTargets(options);\n if (!targets) {\n log.warn(\"Generation cancelled\");\n return;\n }\n\n const targetDirs = getTargetDirs(targets);\n\n const writeSpinner = ora(\"Writing skill files...\").start();\n\n let permissionError = false;\n const failedDirs: Set<string> = new Set();\n\n for (const targetDir of targetDirs) {\n let finalDir = targetDir;\n if (options.output && !targetDir.includes(\"/.config/\") && !targetDir.startsWith(homedir())) {\n finalDir = targetDir.replace(process.cwd(), options.output);\n }\n const skillDir = join(finalDir, skillName);\n const skillPath = join(skillDir, \"SKILL.md\");\n\n try {\n await mkdir(skillDir, { recursive: true });\n await writeFile(skillPath, generatedContent!, \"utf-8\");\n } catch (err) {\n const error = err as NodeJS.ErrnoException;\n if (error.code === \"EACCES\" || error.code === \"EPERM\") {\n permissionError = true;\n failedDirs.add(skillDir);\n } else {\n log.warn(`Failed to write to ${skillPath}: ${error.message}`);\n }\n }\n }\n\n if (permissionError) {\n writeSpinner.fail(pc.red(\"Permission denied\"));\n log.blank();\n console.log(pc.yellow(\"Fix permissions with:\"));\n for (const dir of failedDirs) {\n const parentDir = join(dir, \"..\");\n console.log(pc.dim(` sudo chown -R $(whoami) \"${parentDir}\"`));\n }\n log.blank();\n return;\n }\n\n writeSpinner.succeed(pc.green(`Created skill in ${targetDirs.length} location(s)`));\n trackEvent(\"gen_install\");\n\n log.blank();\n console.log(pc.green(\"Skill saved successfully\"));\n for (const targetDir of targetDirs) {\n console.log(pc.dim(` ${targetDir}/`) + pc.green(skillName));\n }\n log.blank();\n\n await cleanupPreviewFile();\n}\n","import * as crypto from \"crypto\";\nimport * as http from \"http\";\nimport * as fs from \"fs\";\nimport * as path from \"path\";\nimport * as os from \"os\";\n\nconst CONFIG_DIR = path.join(os.homedir(), \".context7\");\nconst CREDENTIALS_FILE = path.join(CONFIG_DIR, \"credentials.json\");\n\nexport interface TokenData {\n access_token: string;\n refresh_token?: string;\n token_type: string;\n expires_in?: number;\n expires_at?: number;\n scope?: string;\n}\n\nexport interface PKCEChallenge {\n codeVerifier: string;\n codeChallenge: string;\n}\n\nexport function generatePKCE(): PKCEChallenge {\n const codeVerifier = crypto.randomBytes(32).toString(\"base64url\");\n const codeChallenge = crypto.createHash(\"sha256\").update(codeVerifier).digest(\"base64url\");\n return { codeVerifier, codeChallenge };\n}\n\nexport function generateState(): string {\n return crypto.randomBytes(16).toString(\"base64url\");\n}\n\nfunction ensureConfigDir(): void {\n if (!fs.existsSync(CONFIG_DIR)) {\n fs.mkdirSync(CONFIG_DIR, { recursive: true, mode: 0o700 });\n }\n}\n\nexport function saveTokens(tokens: TokenData): void {\n ensureConfigDir();\n const data = {\n ...tokens,\n expires_at:\n tokens.expires_at ?? (tokens.expires_in ? Date.now() + tokens.expires_in * 1000 : undefined),\n };\n fs.writeFileSync(CREDENTIALS_FILE, JSON.stringify(data, null, 2), { mode: 0o600 });\n}\n\nexport function loadTokens(): TokenData | null {\n if (!fs.existsSync(CREDENTIALS_FILE)) {\n return null;\n }\n try {\n const data = JSON.parse(fs.readFileSync(CREDENTIALS_FILE, \"utf-8\"));\n return data as TokenData;\n } catch {\n return null;\n }\n}\n\nexport function clearTokens(): boolean {\n if (fs.existsSync(CREDENTIALS_FILE)) {\n fs.unlinkSync(CREDENTIALS_FILE);\n return true;\n }\n return false;\n}\n\nexport function isTokenExpired(tokens: TokenData): boolean {\n if (!tokens.expires_at) {\n return false;\n }\n return Date.now() > tokens.expires_at - 60000;\n}\n\nexport interface CallbackResult {\n code: string;\n state: string;\n}\n\n// Port for OAuth callback server - must match registered redirect URI\nconst CALLBACK_PORT = 52417;\n\nexport function createCallbackServer(expectedState: string): {\n port: Promise<number>;\n result: Promise<CallbackResult>;\n close: () => void;\n} {\n let resolvePort: (port: number) => void;\n let resolveResult: (result: CallbackResult) => void;\n let rejectResult: (error: Error) => void;\n let serverInstance: http.Server | null = null;\n\n const portPromise = new Promise<number>((resolve) => {\n resolvePort = resolve;\n });\n\n const resultPromise = new Promise<CallbackResult>((resolve, reject) => {\n resolveResult = resolve;\n rejectResult = reject;\n });\n\n const server = http.createServer((req, res) => {\n const url = new URL(req.url || \"/\", `http://localhost`);\n\n if (url.pathname === \"/callback\") {\n const code = url.searchParams.get(\"code\");\n const state = url.searchParams.get(\"state\");\n const error = url.searchParams.get(\"error\");\n const errorDescription = url.searchParams.get(\"error_description\");\n\n res.writeHead(200, { \"Content-Type\": \"text/html\" });\n\n if (error) {\n res.end(errorPage(errorDescription || error));\n serverInstance?.close();\n rejectResult(new Error(errorDescription || error));\n return;\n }\n\n if (!code || !state) {\n res.end(errorPage(\"Missing authorization code or state\"));\n serverInstance?.close();\n rejectResult(new Error(\"Missing authorization code or state\"));\n return;\n }\n\n if (state !== expectedState) {\n res.end(errorPage(\"State mismatch - possible CSRF attack\"));\n serverInstance?.close();\n rejectResult(new Error(\"State mismatch\"));\n return;\n }\n\n res.end(successPage());\n serverInstance?.close();\n resolveResult({ code, state });\n } else {\n res.writeHead(404);\n res.end(\"Not found\");\n }\n });\n\n serverInstance = server;\n\n server.on(\"error\", (err) => {\n rejectResult(err as Error);\n });\n\n server.listen(CALLBACK_PORT, \"127.0.0.1\", () => {\n resolvePort(CALLBACK_PORT);\n });\n\n const timeout = setTimeout(\n () => {\n server.close();\n rejectResult(new Error(\"Login timed out after 5 minutes\"));\n },\n 5 * 60 * 1000\n );\n\n return {\n port: portPromise,\n result: resultPromise,\n close: () => {\n clearTimeout(timeout);\n server.close();\n },\n };\n}\n\nfunction successPage(): string {\n return `<!DOCTYPE html>\n<html>\n <head><title>Login Successful</title></head>\n <body style=\"font-family: system-ui; display: flex; justify-content: center; align-items: center; height: 100vh; margin: 0; background: #f9fafb;\">\n <div style=\"text-align: center; padding: 2rem;\">\n <div style=\"width: 64px; height: 64px; background: #16a34a; border-radius: 50%; display: flex; align-items: center; justify-content: center; margin: 0 auto 1rem;\">\n <svg width=\"32\" height=\"32\" fill=\"none\" stroke=\"white\" stroke-width=\"3\" viewBox=\"0 0 24 24\">\n <path d=\"M5 13l4 4L19 7\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </div>\n <h1 style=\"color: #16a34a; margin: 0 0 0.5rem;\">Login Successful!</h1>\n <p style=\"color: #6b7280; margin: 0;\">You can close this window and return to the terminal.</p>\n </div>\n </body>\n</html>`;\n}\n\nfunction escapeHtml(text: string): string {\n return text\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\"/g, \""\")\n .replace(/'/g, \"'\");\n}\n\nfunction errorPage(message: string): string {\n const safeMessage = escapeHtml(message);\n return `<!DOCTYPE html>\n<html>\n <head><title>Login Failed</title></head>\n <body style=\"font-family: system-ui; display: flex; justify-content: center; align-items: center; height: 100vh; margin: 0; background: #f9fafb;\">\n <div style=\"text-align: center; padding: 2rem;\">\n <div style=\"width: 64px; height: 64px; background: #dc2626; border-radius: 50%; display: flex; align-items: center; justify-content: center; margin: 0 auto 1rem;\">\n <svg width=\"32\" height=\"32\" fill=\"none\" stroke=\"white\" stroke-width=\"3\" viewBox=\"0 0 24 24\">\n <path d=\"M6 18L18 6M6 6l12 12\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </div>\n <h1 style=\"color: #dc2626; margin: 0 0 0.5rem;\">Login Failed</h1>\n <p style=\"color: #6b7280; margin: 0;\">${safeMessage}</p>\n <p style=\"color: #9ca3af; margin: 1rem 0 0; font-size: 0.875rem;\">You can close this window.</p>\n </div>\n </body>\n</html>`;\n}\n\ninterface TokenErrorResponse {\n error?: string;\n error_description?: string;\n}\n\nexport async function exchangeCodeForTokens(\n baseUrl: string,\n code: string,\n codeVerifier: string,\n redirectUri: string,\n clientId: string\n): Promise<TokenData> {\n const response = await fetch(`${baseUrl}/api/oauth/token`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/x-www-form-urlencoded\" },\n body: new URLSearchParams({\n grant_type: \"authorization_code\",\n client_id: clientId,\n code,\n code_verifier: codeVerifier,\n redirect_uri: redirectUri,\n }).toString(),\n });\n\n if (!response.ok) {\n const err = (await response.json().catch(() => ({}))) as TokenErrorResponse;\n throw new Error(err.error_description || err.error || \"Failed to exchange code for tokens\");\n }\n\n return (await response.json()) as TokenData;\n}\n\nexport function buildAuthorizationUrl(\n baseUrl: string,\n clientId: string,\n redirectUri: string,\n codeChallenge: string,\n state: string\n): string {\n const url = new URL(`${baseUrl}/api/oauth/authorize`);\n url.searchParams.set(\"client_id\", clientId);\n url.searchParams.set(\"redirect_uri\", redirectUri);\n url.searchParams.set(\"code_challenge\", codeChallenge);\n url.searchParams.set(\"code_challenge_method\", \"S256\");\n url.searchParams.set(\"state\", state);\n url.searchParams.set(\"scope\", \"profile email\");\n url.searchParams.set(\"response_type\", \"code\");\n return url.toString();\n}\n","import { Command } from \"commander\";\nimport pc from \"picocolors\";\nimport ora from \"ora\";\nimport open from \"open\";\nimport {\n generatePKCE,\n generateState,\n createCallbackServer,\n exchangeCodeForTokens,\n saveTokens,\n loadTokens,\n clearTokens,\n buildAuthorizationUrl,\n isTokenExpired,\n} from \"../utils/auth.js\";\n\nimport { trackEvent } from \"../utils/tracking.js\";\n\nconst CLI_CLIENT_ID = \"2veBSofhicRBguUT\";\n\nlet baseUrl = \"https://context7.com\";\n\nexport function setAuthBaseUrl(url: string): void {\n baseUrl = url;\n}\n\nexport function registerAuthCommands(program: Command): void {\n program\n .command(\"login\")\n .description(\"Log in to Context7\")\n .option(\"--no-browser\", \"Don't open browser automatically\")\n .action(async (options) => {\n await loginCommand(options);\n });\n\n program\n .command(\"logout\")\n .description(\"Log out of Context7\")\n .action(() => {\n logoutCommand();\n });\n\n program\n .command(\"whoami\")\n .description(\"Show current login status\")\n .action(async () => {\n await whoamiCommand();\n });\n}\n\nexport async function performLogin(openBrowser = true): Promise<string | null> {\n const spinner = ora(\"Preparing login...\").start();\n\n try {\n const { codeVerifier, codeChallenge } = generatePKCE();\n const state = generateState();\n const callbackServer = createCallbackServer(state);\n const port = await callbackServer.port;\n const redirectUri = `http://localhost:${port}/callback`;\n const authUrl = buildAuthorizationUrl(\n baseUrl,\n CLI_CLIENT_ID,\n redirectUri,\n codeChallenge,\n state\n );\n\n spinner.stop();\n\n console.log(\"\");\n console.log(pc.bold(\"Opening browser to log in...\"));\n console.log(\"\");\n\n if (openBrowser) {\n await open(authUrl);\n console.log(pc.dim(\"If the browser didn't open, visit this URL:\"));\n } else {\n console.log(pc.dim(\"Open this URL in your browser:\"));\n }\n console.log(pc.cyan(authUrl));\n console.log(\"\");\n\n const waitingSpinner = ora(\"Waiting for login...\").start();\n\n try {\n const { code } = await callbackServer.result;\n waitingSpinner.text = \"Exchanging code for tokens...\";\n\n const tokens = await exchangeCodeForTokens(\n baseUrl,\n code,\n codeVerifier,\n redirectUri,\n CLI_CLIENT_ID\n );\n saveTokens(tokens);\n callbackServer.close();\n\n waitingSpinner.succeed(pc.green(\"Login successful!\"));\n return tokens.access_token;\n } catch (error) {\n callbackServer.close();\n waitingSpinner.fail(pc.red(\"Login failed\"));\n if (error instanceof Error) {\n console.error(pc.red(error.message));\n }\n return null;\n }\n } catch (error) {\n spinner.fail(pc.red(\"Login failed\"));\n if (error instanceof Error) {\n console.error(pc.red(error.message));\n }\n return null;\n }\n}\n\nasync function loginCommand(options: { browser: boolean }): Promise<void> {\n trackEvent(\"command\", { name: \"login\" });\n const existingTokens = loadTokens();\n if (existingTokens) {\n const expired = isTokenExpired(existingTokens);\n if (!expired || existingTokens.refresh_token) {\n console.log(pc.yellow(\"You are already logged in.\"));\n console.log(\n pc.dim(\"Run 'ctx7 logout' first if you want to log in with a different account.\")\n );\n return;\n }\n clearTokens();\n }\n\n const token = await performLogin(options.browser);\n if (!token) {\n process.exit(1);\n }\n console.log(\"\");\n console.log(pc.dim(\"You can now use authenticated Context7 features.\"));\n}\n\nfunction logoutCommand(): void {\n trackEvent(\"command\", { name: \"logout\" });\n if (clearTokens()) {\n console.log(pc.green(\"Logged out successfully.\"));\n } else {\n console.log(pc.yellow(\"You are not logged in.\"));\n }\n}\n\nasync function whoamiCommand(): Promise<void> {\n trackEvent(\"command\", { name: \"whoami\" });\n const tokens = loadTokens();\n\n if (!tokens) {\n console.log(pc.yellow(\"Not logged in.\"));\n console.log(pc.dim(\"Run 'ctx7 login' to authenticate.\"));\n return;\n }\n\n console.log(pc.green(\"Logged in\"));\n\n try {\n const userInfo = await fetchUserInfo(tokens.access_token);\n if (userInfo.name) {\n console.log(`${pc.dim(\"Name:\".padEnd(9))}${userInfo.name}`);\n }\n if (userInfo.email) {\n console.log(`${pc.dim(\"Email:\".padEnd(9))}${userInfo.email}`);\n }\n } catch {\n if (isTokenExpired(tokens) && !tokens.refresh_token) {\n console.log(pc.dim(\"(Session may be expired - run 'ctx7 login' to refresh)\"));\n }\n }\n}\n\ninterface UserInfo {\n sub?: string;\n name?: string;\n email?: string;\n picture?: string;\n}\n\nasync function fetchUserInfo(accessToken: string): Promise<UserInfo> {\n const response = await fetch(\"https://clerk.context7.com/oauth/userinfo\", {\n headers: {\n Authorization: `Bearer ${accessToken}`,\n },\n });\n\n if (!response.ok) {\n throw new Error(\"Failed to fetch user info\");\n }\n\n return (await response.json()) as UserInfo;\n}\n","import {\n createPrompt,\n useState,\n useKeypress,\n usePrefix,\n isEnterKey,\n isUpKey,\n isDownKey,\n} from \"@inquirer/core\";\nimport type { KeypressEvent } from \"@inquirer/core\";\nimport pc from \"picocolors\";\n\nexport interface SelectOrInputConfig {\n message: string;\n options: string[];\n recommendedIndex?: number;\n}\n\nfunction reorderOptions(options: string[], recommendedIndex: number): string[] {\n if (recommendedIndex === 0) return options;\n const reordered = [options[recommendedIndex]];\n for (let i = 0; i < options.length; i++) {\n if (i !== recommendedIndex) reordered.push(options[i]);\n }\n return reordered;\n}\n\nconst selectOrInput: (config: SelectOrInputConfig) => Promise<string> = createPrompt<\n string,\n SelectOrInputConfig\n>((config, done): string => {\n const { message, options: rawOptions, recommendedIndex = 0 } = config;\n const options = reorderOptions(rawOptions, recommendedIndex);\n const [cursor, setCursor] = useState(0);\n const [inputValue, setInputValue] = useState(\"\");\n\n const prefix = usePrefix({});\n\n useKeypress((key: KeypressEvent, rl) => {\n if (isUpKey(key)) {\n setCursor(Math.max(0, cursor - 1));\n return;\n }\n\n if (isDownKey(key)) {\n setCursor(Math.min(options.length, cursor + 1));\n return;\n }\n\n if (isEnterKey(key)) {\n if (cursor === options.length) {\n const finalValue = inputValue.trim();\n done(finalValue || options[0]);\n } else {\n done(options[cursor]);\n }\n return;\n }\n\n // Text input handling (only when on custom input line)\n if (cursor === options.length && key.name !== \"return\") {\n if ((key.name === \"w\" && key.ctrl) || key.name === \"backspace\") {\n if (key.name === \"w\" && key.ctrl) {\n const words = inputValue.trimEnd().split(/\\s+/);\n if (words.length > 0) {\n words.pop();\n setInputValue(\n words.join(\" \") + (inputValue.endsWith(\" \") && words.length > 0 ? \" \" : \"\")\n );\n }\n } else {\n setInputValue(inputValue.slice(0, -1));\n }\n } else if (key.name === \"u\" && key.ctrl) {\n setInputValue(\"\");\n } else if (key.name === \"space\") {\n setInputValue(inputValue + \" \");\n } else if (key.name && key.name.length === 1 && !key.ctrl) {\n setInputValue(inputValue + key.name);\n }\n } else if (rl.line) {\n rl.line = \"\";\n }\n });\n\n let output = `${prefix} ${pc.bold(message)}\\n\\n`;\n\n options.forEach((opt: string, idx: number) => {\n const isRecommended = idx === 0;\n const isCursor = idx === cursor;\n const number = pc.cyan(`${idx + 1}.`);\n const text = isRecommended ? `${opt} ${pc.green(\"✓ Recommended\")}` : opt;\n\n if (isCursor) {\n output += pc.cyan(`❯ ${number} ${text}\\n`);\n } else {\n output += ` ${number} ${text}\\n`;\n }\n });\n\n const isCustomCursor = cursor === options.length;\n if (isCustomCursor) {\n output += pc.cyan(`❯ ${pc.yellow(\"✎\")} ${inputValue || pc.dim(\"Type your own...\")}`);\n } else {\n output += ` ${pc.yellow(\"✎\")} ${pc.dim(\"Type your own...\")}`;\n }\n\n return output;\n});\n\nexport default selectOrInput;\n","import { readFile } from \"fs/promises\";\nimport { join } from \"path\";\n\nasync function readFileOrNull(path: string): Promise<string | null> {\n try {\n return await readFile(path, \"utf-8\");\n } catch {\n return null;\n }\n}\n\n/** Basic client-side filter. The real SKIP_SET lives on the backend. */\nfunction isSkippedLocally(name: string): boolean {\n return name.startsWith(\"@types/\");\n}\n\nasync function parsePackageJson(cwd: string): Promise<string[]> {\n const content = await readFileOrNull(join(cwd, \"package.json\"));\n if (!content) return [];\n\n try {\n const pkg = JSON.parse(content);\n const names = new Set<string>();\n\n for (const key of Object.keys(pkg.dependencies || {})) {\n if (!isSkippedLocally(key)) names.add(key);\n }\n for (const key of Object.keys(pkg.devDependencies || {})) {\n if (!isSkippedLocally(key)) names.add(key);\n }\n\n return [...names];\n } catch {\n return [];\n }\n}\n\nasync function parseRequirementsTxt(cwd: string): Promise<string[]> {\n const content = await readFileOrNull(join(cwd, \"requirements.txt\"));\n if (!content) return [];\n\n const deps: string[] = [];\n for (const line of content.split(\"\\n\")) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith(\"#\") || trimmed.startsWith(\"-\")) continue;\n const name = trimmed.split(/[=<>!~;@\\s\\[]/)[0].trim();\n if (name && !isSkippedLocally(name)) {\n deps.push(name);\n }\n }\n return deps;\n}\n\nasync function parsePyprojectToml(cwd: string): Promise<string[]> {\n const content = await readFileOrNull(join(cwd, \"pyproject.toml\"));\n if (!content) return [];\n\n const deps: string[] = [];\n const seen = new Set<string>();\n\n const projectDepsMatch = content.match(/\\[project\\]\\s[\\s\\S]*?dependencies\\s*=\\s*\\[([\\s\\S]*?)\\]/);\n if (projectDepsMatch) {\n const entries = projectDepsMatch[1].match(/\"([^\"]+)\"/g) || [];\n for (const entry of entries) {\n const name = entry\n .replace(/\"/g, \"\")\n .split(/[=<>!~;@\\s\\[]/)[0]\n .trim();\n if (name && !isSkippedLocally(name) && !seen.has(name)) {\n seen.add(name);\n deps.push(name);\n }\n }\n }\n\n const poetryMatch = content.match(/\\[tool\\.poetry\\.dependencies\\]([\\s\\S]*?)(?:\\n\\[|$)/);\n if (poetryMatch) {\n const lines = poetryMatch[1].split(\"\\n\");\n for (const line of lines) {\n const match = line.match(/^(\\S+)\\s*=/);\n if (match) {\n const name = match[1].trim();\n if (name && !isSkippedLocally(name) && name !== \"python\" && !seen.has(name)) {\n seen.add(name);\n deps.push(name);\n }\n }\n }\n }\n\n return deps;\n}\n\nexport async function detectProjectDependencies(cwd: string): Promise<string[]> {\n const results = await Promise.all([\n parsePackageJson(cwd),\n parseRequirementsTxt(cwd),\n parsePyprojectToml(cwd),\n ]);\n\n return [...new Set(results.flat())];\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","ora","rm","join","input","path","branch","pathParts","path","input","pc","pc","ides","scope","pc","join","pc","ora","mkdir","writeFile","join","homedir","select","baseUrl","pc","baseUrl","program","pc","pc","ora","pc","join","homedir","mkdir","writeFile","select","homedir","readFile","join","path","pkg","pc","program","input","ora","join","homedir","path","rm","readFileSync","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/utils/prompts.ts","../src/types.ts","../src/utils/installer.ts","../src/utils/tracking.ts","../src/commands/generate.ts","../src/utils/auth.ts","../src/commands/auth.ts","../src/utils/selectOrInput.ts","../src/utils/deps.ts","../src/commands/setup.ts","../src/setup/agents.ts","../src/setup/templates.ts","../src/setup/mcp-writer.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 { registerAuthCommands, setAuthBaseUrl } from \"./commands/auth.js\";\nimport { registerSetupCommand } from \"./commands/setup.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 setAuthBaseUrl(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);\nregisterAuthCommands(program);\nregisterSetupCommand(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 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 suggestSkills,\n downloadSkill,\n getSkill,\n} from \"../utils/api.js\";\nimport { log } from \"../utils/logger.js\";\nimport {\n promptForInstallTargets,\n promptForSingleTarget,\n getTargetDirs,\n getTargetDirFromSelection,\n getSelectedIdes,\n hasExplicitIdeOption,\n} from \"../utils/ide.js\";\nimport {\n checkboxWithHover,\n terminalLink,\n formatInstallCount,\n formatTrustScore,\n} from \"../utils/prompts.js\";\nimport { installSkillFiles, symlinkSkill } from \"../utils/installer.js\";\nimport { trackEvent } from \"../utils/tracking.js\";\nimport { registerGenerateCommand } from \"./generate.js\";\nimport type {\n Skill,\n SkillSearchResult,\n AddOptions,\n ListOptions,\n RemoveOptions,\n SuggestOptions,\n InstallTargets,\n Scope,\n} from \"../types.js\";\nimport {\n IDE_NAMES,\n IDE_PATHS,\n IDE_GLOBAL_PATHS,\n UNIVERSAL_SKILLS_PATH,\n UNIVERSAL_SKILLS_GLOBAL_PATH,\n UNIVERSAL_AGENTS_LABEL,\n VENDOR_SPECIFIC_AGENTS,\n} from \"../types.js\";\nimport { homedir } from \"os\";\nimport { detectProjectDependencies } from \"../utils/deps.js\";\nimport { loadTokens, isTokenExpired } from \"../utils/auth.js\";\n\nfunction logInstallSummary(\n targets: InstallTargets,\n targetDirs: string[],\n skillNames: string[]\n): void {\n log.blank();\n const hasUniversal = targets.ides.some((ide) => ide === \"universal\");\n const vendorIdes = targets.ides.filter((ide) => ide !== \"universal\");\n\n let dirIndex = 0;\n if (hasUniversal && dirIndex < targetDirs.length) {\n log.plain(`${pc.bold(\"Universal\")} ${pc.dim(targetDirs[dirIndex])}`);\n for (const name of skillNames) {\n log.itemAdd(name);\n }\n dirIndex++;\n }\n\n for (const ide of vendorIdes) {\n if (dirIndex >= targetDirs.length) break;\n log.plain(`${pc.bold(IDE_NAMES[ide])} ${pc.dim(targetDirs[dirIndex])}`);\n for (const name of skillNames) {\n log.itemAdd(name);\n }\n dirIndex++;\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 // Register generate subcommand\n registerGenerateCommand(skill);\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(\"--universal\", \"Universal (.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(\"--universal\", \"Universal (.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(\"--universal\", \"Universal (.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 skill\n .command(\"suggest\")\n .option(\"--global\", \"Install globally instead of current directory\")\n .option(\"--claude\", \"Claude Code (.claude/skills/)\")\n .option(\"--cursor\", \"Cursor (.cursor/skills/)\")\n .option(\"--universal\", \"Universal (.agents/skills/)\")\n .option(\"--antigravity\", \"Antigravity (.agent/skills/)\")\n .description(\"Suggest skills based on your project dependencies\")\n .action(async (options: SuggestOptions) => {\n await suggestCommand(options);\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(\"--universal\", \"Universal (.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 program\n .command(\"ssg\", { hidden: true })\n .option(\"--global\", \"Install globally instead of current directory\")\n .option(\"--claude\", \"Claude Code (.claude/skills/)\")\n .option(\"--cursor\", \"Cursor (.cursor/skills/)\")\n .option(\"--universal\", \"Universal (.agents/skills/)\")\n .option(\"--antigravity\", \"Antigravity (.agent/skills/)\")\n .description(\"Suggest skills (alias for: skills suggest)\")\n .action(async (options: SuggestOptions) => {\n await suggestCommand(options);\n });\n}\n\nasync function installCommand(\n input: string,\n skillName: string | undefined,\n options: AddOptions\n): Promise<void> {\n trackEvent(\"command\", { name: \"install\" });\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\n .map((s) => ({ ...s, project: repo }))\n .sort((a, b) => (b.installCount ?? 0) - (a.installCount ?? 0));\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 indexWidth = data.skills.length.toString().length;\n const maxNameLen = Math.max(...data.skills.map((s) => s.name.length));\n const installsColWidth = 10;\n const choices = skillsWithRepo.map((s, index) => {\n const indexStr = pc.dim(`${(index + 1).toString().padStart(indexWidth)}.`);\n const paddedName = s.name.padEnd(maxNameLen);\n const installsRaw = s.installCount ? String(s.installCount) : \"-\";\n const paddedInstalls =\n formatInstallCount(s.installCount, pc.dim(\"-\")) +\n \" \".repeat(installsColWidth - installsRaw.length);\n const trust = formatTrustScore(s.trustScore);\n\n const skillUrl = `https://context7.com/skills${s.project}/${s.name}`;\n const skillLink = terminalLink(s.name, skillUrl, pc.white);\n const repoLink = terminalLink(s.project, `https://github.com${s.project}`, pc.white);\n const metadataLines = [\n pc.dim(\"─\".repeat(50)),\n \"\",\n `${pc.yellow(\"Skill:\")} ${skillLink}`,\n `${pc.yellow(\"Repo:\")} ${repoLink}`,\n `${pc.yellow(\"Description:\")}`,\n pc.white(s.description || \"No description\"),\n ];\n\n return {\n name: `${indexStr} ${paddedName} ${paddedInstalls}${trust}`,\n value: s,\n description: metadataLines.join(\"\\n\"),\n };\n });\n\n log.blank();\n\n const checkboxPrefixWidth = 3;\n const headerPad = \" \".repeat(checkboxPrefixWidth + indexWidth + 1 + 1 + maxNameLen + 1);\n const headerLine =\n headerPad + pc.dim(\"Installs\".padEnd(installsColWidth)) + pc.dim(\"Trust(0-10)\");\n\n try {\n selectedSkills = await checkboxWithHover({\n message: `Select skills to install:\\n${headerLine}`,\n choices,\n pageSize: 15,\n loop: false,\n theme: {\n style: {\n message: (text: string, status: string) => {\n if (status === \"done\") return pc.dim(text.split(\"\\n\")[0]);\n return pc.bold(text);\n },\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 trackEvent(\"install\", { skills: installedSkills, ides: 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 trackEvent(\"command\", { name: \"search\" });\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 trackEvent(\"search_query\", { query, resultCount: data.results.length });\n log.blank();\n\n const indexWidth = data.results.length.toString().length;\n const maxNameLen = Math.max(...data.results.map((s) => s.name.length));\n const installsColWidth = 10;\n const choices = data.results.map((s, index) => {\n const indexStr = pc.dim(`${(index + 1).toString().padStart(indexWidth)}.`);\n const paddedName = s.name.padEnd(maxNameLen);\n const installsRaw = s.installCount ? String(s.installCount) : \"-\";\n const paddedInstalls =\n formatInstallCount(s.installCount, pc.dim(\"-\")) +\n \" \".repeat(installsColWidth - installsRaw.length);\n const trust = formatTrustScore(s.trustScore);\n\n const skillLink = terminalLink(\n s.name,\n `https://context7.com/skills${s.project}/${s.name}`,\n pc.white\n );\n const repoLink = terminalLink(s.project, `https://github.com${s.project}`, pc.white);\n const metadataLines = [\n pc.dim(\"─\".repeat(50)),\n \"\",\n `${pc.yellow(\"Skill:\")} ${skillLink}`,\n `${pc.yellow(\"Repo:\")} ${repoLink}`,\n `${pc.yellow(\"Description:\")}`,\n pc.white(s.description || \"No description\"),\n ];\n\n return {\n name: `${indexStr} ${paddedName} ${paddedInstalls}${trust}`,\n value: s,\n description: metadataLines.join(\"\\n\"),\n };\n });\n\n const checkboxPrefixWidth = 3; // \"❯◯ \" or \" ◯ \"\n const headerPad = \" \".repeat(checkboxPrefixWidth + indexWidth + 1 + 1 + maxNameLen + 1);\n const headerLine =\n headerPad + pc.dim(\"Installs\".padEnd(installsColWidth)) + pc.dim(\"Trust(0-10)\");\n\n let selectedSkills: SkillSearchResult[];\n try {\n selectedSkills = await checkboxWithHover({\n message: `Select skills to install:\\n${headerLine}`,\n choices,\n pageSize: 15,\n loop: false,\n theme: {\n style: {\n message: (text: string, status: string) => {\n if (status === \"done\") return pc.dim(text.split(\"\\n\")[0]);\n return pc.bold(text);\n },\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 trackEvent(\"install\", { skills: installedSkills, ides: 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 trackEvent(\"command\", { name: \"list\" });\n const scope: Scope = options.global ? \"global\" : \"project\";\n const baseDir = scope === \"global\" ? homedir() : process.cwd();\n\n const results: { label: string; path: string; skills: string[] }[] = [];\n\n // Helper to scan a skills directory\n async function scanDir(dir: string): Promise<string[]> {\n try {\n const entries = await readdir(dir, { withFileTypes: true });\n return entries.filter((e) => e.isDirectory() || e.isSymbolicLink()).map((e) => e.name);\n } catch {\n return [];\n }\n }\n\n if (hasExplicitIdeOption(options)) {\n // Explicit flag mode — check the specific IDE paths\n const ides = getSelectedIdes(options);\n for (const ide of ides) {\n const dir =\n ide === \"universal\"\n ? join(baseDir, scope === \"global\" ? UNIVERSAL_SKILLS_GLOBAL_PATH : UNIVERSAL_SKILLS_PATH)\n : join(baseDir, (scope === \"global\" ? IDE_GLOBAL_PATHS : IDE_PATHS)[ide]);\n const label = ide === \"universal\" ? UNIVERSAL_AGENTS_LABEL : IDE_NAMES[ide];\n const skills = await scanDir(dir);\n if (skills.length > 0) {\n results.push({ label, path: dir, skills });\n }\n }\n } else {\n // Default: check universal + vendor-specific\n const universalPath = scope === \"global\" ? UNIVERSAL_SKILLS_GLOBAL_PATH : UNIVERSAL_SKILLS_PATH;\n const universalDir = join(baseDir, universalPath);\n const universalSkills = await scanDir(universalDir);\n if (universalSkills.length > 0) {\n results.push({ label: UNIVERSAL_AGENTS_LABEL, path: universalPath, skills: universalSkills });\n }\n\n for (const ide of VENDOR_SPECIFIC_AGENTS) {\n const pathMap = scope === \"global\" ? IDE_GLOBAL_PATHS : IDE_PATHS;\n const dir = join(baseDir, pathMap[ide]);\n const skills = await scanDir(dir);\n if (skills.length > 0) {\n results.push({ label: IDE_NAMES[ide], path: pathMap[ide], skills });\n }\n }\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, path, skills } of results) {\n log.plain(`${pc.bold(label)} ${pc.dim(path)}`);\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) {\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 trackEvent(\"command\", { name: \"info\" });\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\nasync function suggestCommand(options: SuggestOptions): Promise<void> {\n trackEvent(\"command\", { name: \"suggest\" });\n log.blank();\n\n // Step 1: Detect dependencies\n const scanSpinner = ora(\"Scanning project dependencies...\").start();\n const deps = await detectProjectDependencies(process.cwd());\n\n if (deps.length === 0) {\n scanSpinner.warn(pc.yellow(\"No dependencies detected\"));\n log.info(`Try ${pc.cyan(\"ctx7 skills search <keyword>\")} to search manually`);\n return;\n }\n\n scanSpinner.succeed(`Found ${deps.length} dependencies`);\n\n // Step 2: Single API call to backend\n const searchSpinner = ora(\"Finding matching skills...\").start();\n\n const tokens = loadTokens();\n const accessToken = tokens && !isTokenExpired(tokens) ? tokens.access_token : undefined;\n\n let data;\n try {\n data = await suggestSkills(deps, accessToken);\n } catch {\n searchSpinner.fail(pc.red(\"Failed to connect to Context7\"));\n return;\n }\n\n if (data.error) {\n searchSpinner.fail(pc.red(`Error: ${data.message || data.error}`));\n return;\n }\n\n const skills = data.skills;\n\n if (skills.length === 0) {\n searchSpinner.warn(pc.yellow(\"No matching skills found for your dependencies\"));\n return;\n }\n\n searchSpinner.succeed(`Found ${skills.length} relevant skill(s)`);\n trackEvent(\"suggest_results\", { depCount: deps.length, skillCount: skills.length });\n log.blank();\n\n const maxNameLen = Math.max(...skills.map((s) => s.name.length));\n const installsColWidth = 10;\n const trustColWidth = 12;\n const maxMatchedLen = Math.max(...skills.map((s) => s.matchedDep.length));\n const indexWidth = skills.length.toString().length;\n\n const choices = skills.map((s, index) => {\n const indexStr = pc.dim(`${(index + 1).toString().padStart(indexWidth)}.`);\n const paddedName = s.name.padEnd(maxNameLen);\n const installsRaw = s.installCount ? String(s.installCount) : \"-\";\n const paddedInstalls =\n formatInstallCount(s.installCount, pc.dim(\"-\")) +\n \" \".repeat(installsColWidth - installsRaw.length);\n const trustRaw =\n s.trustScore !== undefined && s.trustScore >= 0 ? s.trustScore.toFixed(1) : \"-\";\n const trust = formatTrustScore(s.trustScore) + \" \".repeat(trustColWidth - trustRaw.length);\n const matched = pc.yellow(s.matchedDep.padEnd(maxMatchedLen));\n\n const skillLink = terminalLink(\n s.name,\n `https://context7.com/skills${s.project}/${s.name}`,\n pc.white\n );\n const repoLink = terminalLink(s.project, `https://github.com${s.project}`, pc.white);\n const metadataLines = [\n pc.dim(\"─\".repeat(50)),\n \"\",\n `${pc.yellow(\"Skill:\")} ${skillLink}`,\n `${pc.yellow(\"Repo:\")} ${repoLink}`,\n `${pc.yellow(\"Relevant:\")} ${pc.white(s.matchedDep)}`,\n `${pc.yellow(\"Description:\")}`,\n pc.white(s.description || \"No description\"),\n ];\n\n return {\n name: `${indexStr} ${paddedName} ${paddedInstalls}${trust}${matched}`,\n value: s,\n description: metadataLines.join(\"\\n\"),\n };\n });\n\n const checkboxPrefixWidth = 3; // \"❯◯ \" or \" ◯ \"\n const headerPad = \" \".repeat(checkboxPrefixWidth + indexWidth + 1 + 1 + maxNameLen + 1);\n const headerLine =\n headerPad +\n pc.dim(\"Installs\".padEnd(installsColWidth)) +\n pc.dim(\"Trust(0-10)\".padEnd(trustColWidth)) +\n pc.dim(\"Relevant\");\n\n let selectedSkills: SkillSearchResult[];\n try {\n selectedSkills = await checkboxWithHover({\n message: `Select skills to install:\\n${headerLine}`,\n choices,\n pageSize: 15,\n loop: false,\n theme: {\n style: {\n message: (text: string, status: string) => {\n if (status === \"done\") return pc.dim(text.split(\"\\n\")[0]);\n return pc.bold(text);\n },\n },\n },\n });\n } catch {\n log.warn(\"Installation cancelled\");\n return;\n }\n\n if (selectedSkills.length === 0) {\n log.warn(\"No skills selected\");\n return;\n }\n\n // Step 4: Install (same pattern as searchCommand)\n const targets = await promptForInstallTargets(options);\n if (!targets) {\n log.warn(\"Installation cancelled\");\n return;\n }\n\n const targetDirs = getTargetDirs(targets);\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 trackEvent(\"suggest_install\", { skills: installedSkills, ides: targets.ides });\n\n const installedNames = selectedSkills.map((s) => s.name);\n logInstallSummary(targets, targetDirs, installedNames);\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 SuggestResponse,\n DownloadResponse,\n LibrarySearchResponse,\n SkillQuestionsResponse,\n StructuredGenerateInput,\n GenerateStreamEvent,\n SkillQuotaResponse,\n} from \"../types.js\";\nimport { downloadSkillFromGitHub } from \"./github.js\";\n\nlet baseUrl = \"https://context7.com\";\n\nexport function getBaseUrl(): string {\n return baseUrl;\n}\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 async function suggestSkills(\n dependencies: string[],\n accessToken?: string\n): Promise<SuggestResponse> {\n const headers: Record<string, string> = { \"Content-Type\": \"application/json\" };\n if (accessToken) {\n headers[\"Authorization\"] = `Bearer ${accessToken}`;\n }\n const response = await fetch(`${baseUrl}/api/v2/skills/suggest`, {\n method: \"POST\",\n headers,\n body: JSON.stringify({ dependencies }),\n });\n return (await response.json()) as SuggestResponse;\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\nexport interface GenerateSkillResponse {\n content: string;\n libraryName: string;\n error?: string;\n}\n\nexport async function searchLibraries(\n query: string,\n accessToken?: string\n): Promise<LibrarySearchResponse> {\n const params = new URLSearchParams({ query });\n const headers: Record<string, string> = {};\n if (accessToken) {\n headers[\"Authorization\"] = `Bearer ${accessToken}`;\n }\n const response = await fetch(`${baseUrl}/api/v2/libs/search?${params}`, { headers });\n return (await response.json()) as LibrarySearchResponse;\n}\n\nexport async function getSkillQuota(accessToken: string): Promise<SkillQuotaResponse> {\n const response = await fetch(`${baseUrl}/api/v2/skills/quota`, {\n headers: { Authorization: `Bearer ${accessToken}` },\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n return {\n used: 0,\n limit: 0,\n remaining: 0,\n tier: \"free\",\n resetDate: null,\n error: (errorData as { message?: string }).message || `HTTP error ${response.status}`,\n };\n }\n\n return (await response.json()) as SkillQuotaResponse;\n}\n\nexport async function getSkillQuestions(\n libraries: Array<{ id: string; name: string }>,\n motivation: string,\n accessToken?: string\n): Promise<SkillQuestionsResponse> {\n const headers: Record<string, string> = { \"Content-Type\": \"application/json\" };\n if (accessToken) {\n headers[\"Authorization\"] = `Bearer ${accessToken}`;\n }\n\n const response = await fetch(`${baseUrl}/api/v2/skills/questions`, {\n method: \"POST\",\n headers,\n body: JSON.stringify({ libraries, motivation }),\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n return {\n questions: [],\n error: (errorData as { message?: string }).message || `HTTP error ${response.status}`,\n };\n }\n\n return (await response.json()) as SkillQuestionsResponse;\n}\n\nexport async function generateSkillStructured(\n input: StructuredGenerateInput,\n onEvent?: (event: GenerateStreamEvent) => void,\n accessToken?: string\n): Promise<GenerateSkillResponse> {\n const headers: Record<string, string> = { \"Content-Type\": \"application/json\" };\n if (accessToken) {\n headers[\"Authorization\"] = `Bearer ${accessToken}`;\n }\n\n const response = await fetch(`${baseUrl}/api/v2/skills/generate`, {\n method: \"POST\",\n headers,\n body: JSON.stringify(input),\n });\n\n const libraryName = input.libraries[0]?.name || \"skill\";\n return handleGenerateResponse(response, libraryName, onEvent);\n}\n\nasync function handleGenerateResponse(\n response: Response,\n libraryName: string,\n onEvent?: (event: GenerateStreamEvent) => void\n): Promise<GenerateSkillResponse> {\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n return {\n content: \"\",\n libraryName,\n error: (errorData as { message?: string }).message || `HTTP error ${response.status}`,\n };\n }\n\n const reader = response.body?.getReader();\n if (!reader) {\n return { content: \"\", libraryName, error: \"No response body\" };\n }\n\n const decoder = new TextDecoder();\n let content = \"\";\n let finalLibraryName = libraryName;\n let error: string | undefined;\n let buffer = \"\"; // Buffer for incomplete lines across chunks\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n const chunk = decoder.decode(value, { stream: true });\n buffer += chunk;\n\n // Split by newline but keep track of incomplete lines\n const lines = buffer.split(\"\\n\");\n // Keep the last element (may be incomplete) in the buffer\n buffer = lines.pop() || \"\";\n\n for (const line of lines) {\n const trimmedLine = line.trim();\n if (!trimmedLine) continue;\n\n try {\n const data = JSON.parse(trimmedLine) as GenerateStreamEvent;\n\n if (onEvent) {\n onEvent(data);\n }\n\n if (data.type === \"complete\") {\n content = data.content || \"\";\n finalLibraryName = data.libraryName || libraryName;\n } else if (data.type === \"error\") {\n error = data.message;\n }\n } catch {\n // Ignore malformed JSON lines\n }\n }\n }\n\n // Process any remaining data in the buffer\n if (buffer.trim()) {\n try {\n const data = JSON.parse(buffer.trim()) as GenerateStreamEvent;\n if (onEvent) {\n onEvent(data);\n }\n if (data.type === \"complete\") {\n content = data.content || \"\";\n finalLibraryName = data.libraryName || libraryName;\n } else if (data.type === \"error\") {\n error = data.message;\n }\n } catch {\n // Ignore malformed JSON\n }\n }\n\n return { content, libraryName: finalLibraryName, error };\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, confirm } from \"@inquirer/prompts\";\nimport { access } from \"fs/promises\";\nimport { join, dirname } from \"path\";\nimport { homedir } from \"os\";\n\nimport { log } from \"./logger.js\";\nimport { checkboxWithHover } from \"./prompts.js\";\nimport type {\n IDE,\n IDEOptions,\n Scope,\n AddOptions,\n ListOptions,\n RemoveOptions,\n InstallTargets,\n} from \"../types.js\";\nimport {\n IDE_PATHS,\n IDE_GLOBAL_PATHS,\n IDE_NAMES,\n UNIVERSAL_SKILLS_PATH,\n UNIVERSAL_SKILLS_GLOBAL_PATH,\n UNIVERSAL_AGENTS_LABEL,\n VENDOR_SPECIFIC_AGENTS,\n DEFAULT_CONFIG,\n} from \"../types.js\";\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.universal) ides.push(\"universal\");\n if (options.antigravity) ides.push(\"antigravity\");\n return ides;\n}\n\nexport function hasExplicitIdeOption(options: IDEOptions): boolean {\n return !!(options.claude || options.cursor || options.universal || options.antigravity);\n}\n\n/** Detect vendor-specific agents whose parent directory exists. */\nasync function detectVendorSpecificAgents(scope: Scope): Promise<IDE[]> {\n const baseDir = scope === \"global\" ? homedir() : process.cwd();\n const pathMap = scope === \"global\" ? IDE_GLOBAL_PATHS : IDE_PATHS;\n const detected: IDE[] = [];\n\n for (const ide of VENDOR_SPECIFIC_AGENTS) {\n const parentDir = dirname(pathMap[ide]);\n try {\n await access(join(baseDir, parentDir));\n detected.push(ide);\n } catch {}\n }\n\n return detected;\n}\n\nexport function getUniversalDir(scope: Scope): string {\n if (scope === \"global\") {\n return join(homedir(), UNIVERSAL_SKILLS_GLOBAL_PATH);\n }\n return join(process.cwd(), UNIVERSAL_SKILLS_PATH);\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 scope: Scope = options.global ? \"global\" : \"project\";\n const baseDir = scope === \"global\" ? homedir() : process.cwd();\n const pathMap = scope === \"global\" ? IDE_GLOBAL_PATHS : IDE_PATHS;\n const universalPath = scope === \"global\" ? UNIVERSAL_SKILLS_GLOBAL_PATH : UNIVERSAL_SKILLS_PATH;\n\n // Detect universal (.agents/) and vendor-specific agent directories\n const detectedVendor = await detectVendorSpecificAgents(scope);\n let hasUniversalDir = false;\n try {\n await access(join(baseDir, dirname(universalPath)));\n hasUniversalDir = true;\n } catch {}\n\n const detectedIdes: IDE[] = [\n ...(hasUniversalDir ? ([\"universal\"] as IDE[]) : []),\n ...detectedVendor,\n ];\n\n if (detectedIdes.length > 0) {\n // Detected — just confirm\n const pathLines: string[] = [];\n if (hasUniversalDir) {\n pathLines.push(join(baseDir, universalPath));\n }\n for (const ide of detectedVendor) {\n pathLines.push(join(baseDir, pathMap[ide]));\n }\n\n log.blank();\n\n let confirmed: boolean;\n try {\n confirmed = await confirm({\n message: `Install to detected location(s)?\\n${pc.dim(pathLines.join(\"\\n\"))}`,\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: detectedIdes, scopes: [scope] };\n }\n\n // Nothing detected — show checkbox to pick\n const universalLabel = `Universal \\u2014 ${UNIVERSAL_AGENTS_LABEL} ${pc.dim(`(${universalPath})`)}`;\n const choices: { name: string; value: IDE; checked: boolean }[] = [\n { name: universalLabel, value: \"universal\", checked: true },\n ];\n\n for (const ide of VENDOR_SPECIFIC_AGENTS) {\n choices.push({\n name: `${IDE_NAMES[ide]} ${pc.dim(`(${pathMap[ide]})`)}`,\n value: ide,\n checked: false,\n });\n }\n\n log.blank();\n\n let selectedIdes: IDE[];\n try {\n selectedIdes = await checkboxWithHover(\n {\n message: `Which agents do you want to install to?\\n${pc.dim(` ${baseDir}`)}`,\n choices,\n loop: false,\n theme: {\n style: {\n highlight: (text: string) => pc.green(text),\n message: (text: string, status: string) => {\n if (status === \"done\") return pc.dim(text.split(\"\\n\")[0]);\n return pc.bold(text);\n },\n },\n },\n },\n { getName: (ide: IDE) => IDE_NAMES[ide] }\n );\n } catch {\n return null;\n }\n\n // Universal is always included\n const ides: IDE[] = [\"universal\", ...selectedIdes.filter((ide) => ide !== \"universal\")];\n\n return { ides, 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 universalLabel = `Universal ${pc.dim(`(${UNIVERSAL_SKILLS_PATH})`)}`;\n const choices: { name: string; value: IDE }[] = [{ name: universalLabel, value: \"universal\" }];\n\n for (const ide of VENDOR_SPECIFIC_AGENTS) {\n choices.push({\n name: `${IDE_NAMES[ide]} ${pc.dim(`(${IDE_PATHS[ide]})`)}`,\n value: ide,\n });\n }\n\n let selectedIde: IDE;\n try {\n selectedIde = await select({\n message: \"Which location?\",\n choices,\n default: DEFAULT_CONFIG.defaultIde,\n loop: false,\n theme: { style: { highlight: (text: string) => pc.green(text) } },\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 loop: false,\n theme: { style: { highlight: (text: string) => pc.green(text) } },\n });\n } catch {\n return null;\n }\n }\n\n return { ide: selectedIde, scope: selectedScope };\n}\n\nexport function getTargetDirs(targets: InstallTargets): string[] {\n const hasUniversal = targets.ides.some((ide) => ide === \"universal\");\n const dirs: string[] = [];\n\n for (const scope of targets.scopes) {\n const baseDir = scope === \"global\" ? homedir() : process.cwd();\n\n if (hasUniversal) {\n const uniPath = scope === \"global\" ? UNIVERSAL_SKILLS_GLOBAL_PATH : UNIVERSAL_SKILLS_PATH;\n dirs.push(join(baseDir, uniPath));\n }\n\n for (const ide of targets.ides) {\n if (ide === \"universal\") continue;\n const pathMap = scope === \"global\" ? IDE_GLOBAL_PATHS : IDE_PATHS;\n dirs.push(join(baseDir, pathMap[ide]));\n }\n }\n\n return dirs;\n}\n\nexport function getTargetDirFromSelection(ide: IDE, scope: Scope): string {\n if (ide === \"universal\") {\n return getUniversalDir(scope);\n }\n if (scope === \"global\") {\n return join(homedir(), IDE_GLOBAL_PATHS[ide]);\n }\n return join(process.cwd(), IDE_PATHS[ide]);\n}\n","import pc from \"picocolors\";\nimport { checkbox, type Separator } from \"@inquirer/prompts\";\nimport readline from \"readline\";\n\ntype CheckboxConfig<T> = Parameters<typeof checkbox<T>>[0];\ntype CheckboxChoice<T> = Exclude<CheckboxConfig<T>[\"choices\"][number], Separator | string>;\n\n/**\n * Creates a clickable terminal hyperlink using OSC 8 escape sequence.\n */\nexport function terminalLink(text: string, url: string, color?: (s: string) => string): string {\n const colorFn = color ?? ((s: string) => s);\n return `\\x1b]8;;${url}\\x07${colorFn(text)}\\x1b]8;;\\x07 ${pc.white(\"↗\")}`;\n}\n\n/**\n * Formats install count for display.\n */\nexport function formatInstallCount(count: number | undefined, placeholder = \"\"): string {\n if (count === undefined || count === 0) return placeholder;\n\n return pc.yellow(String(count));\n}\n\nexport function formatTrustScore(score: number | undefined): string {\n if (score === undefined || score < 0) return pc.dim(\"-\");\n\n if (score < 3) return pc.red(score.toFixed(1));\n return pc.yellow(score.toFixed(1));\n}\nexport interface CheckboxWithHoverOptions<T> {\n /** Function to extract display name from value. Defaults to (v) => v.name */\n getName?: (value: T) => string;\n}\n\nexport async function checkboxWithHover<T>(\n config: CheckboxConfig<T>,\n options?: CheckboxWithHoverOptions<T>\n): Promise<T[]> {\n const choices = config.choices.filter(\n (c): c is CheckboxChoice<T> =>\n typeof c === \"object\" && c !== null && !(\"type\" in c && c.type === \"separator\")\n );\n const values = choices.map((c) => c.value);\n const totalItems = values.length;\n let cursorPosition = 0;\n\n // Default getName assumes object has 'name' property\n const getName = options?.getName ?? ((v: T) => (v as { name: string }).name);\n\n const keypressHandler = (_str: string | undefined, key: readline.Key) => {\n if (key.name === \"up\" && cursorPosition > 0) {\n cursorPosition--;\n } else if (key.name === \"down\" && cursorPosition < totalItems - 1) {\n cursorPosition++;\n }\n };\n\n readline.emitKeypressEvents(process.stdin);\n process.stdin.on(\"keypress\", keypressHandler);\n\n const customConfig = {\n ...config,\n theme: {\n ...config.theme,\n style: {\n ...config.theme?.style,\n highlight: (text: string) => pc.green(text),\n renderSelectedChoices: (\n selected: CheckboxChoice<T>[],\n _allChoices: CheckboxChoice<T>[]\n ): string => {\n if (selected.length === 0) {\n return pc.dim(getName(values[cursorPosition]));\n }\n return selected.map((c) => getName(c.value)).join(\", \");\n },\n },\n },\n };\n\n try {\n const selected = await checkbox(customConfig);\n if (selected.length === 0) {\n return [values[cursorPosition]];\n }\n return selected;\n } finally {\n process.stdin.removeListener(\"keypress\", keypressHandler);\n }\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 installCount?: number;\n trustScore?: number;\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\n// Library search types\nexport interface LibrarySearchResult {\n id: string;\n title: string;\n description: string;\n branch: string;\n totalSnippets: number;\n totalTokens?: number;\n stars?: number;\n trustScore?: number;\n benchmarkScore?: number;\n versions?: string[];\n vip?: boolean;\n}\n\nexport interface LibrarySearchResponse {\n results: LibrarySearchResult[];\n error?: string;\n message?: string;\n}\n\n// Skill generation types\nexport interface SkillQuestion {\n question: string;\n options: string[];\n recommendedIndex: number;\n}\n\nexport interface SkillQuestionsResponse {\n questions: SkillQuestion[];\n error?: string;\n message?: string;\n}\n\nexport interface SkillAnswer {\n question: string;\n answer: string;\n}\n\nexport interface LibraryInput {\n id: string;\n name: string;\n}\n\nexport interface StructuredGenerateInput {\n motivation: string;\n libraries: LibraryInput[];\n answers: SkillAnswer[];\n feedback?: string;\n previousContent?: string;\n}\n\nexport interface ToolResultSnippet {\n title: string;\n content: string;\n}\n\nexport interface ProgressEvent {\n type: \"progress\";\n message: string;\n}\n\nexport interface ToolResultEvent {\n type: \"tool_result\";\n toolName: string;\n query: string;\n libraryId?: string;\n results: ToolResultSnippet[];\n}\n\nexport interface CompleteEvent {\n type: \"complete\";\n content: string;\n libraryName: string;\n}\n\nexport interface ErrorEvent {\n type: \"error\";\n message: string;\n}\n\nexport type GenerateStreamEvent = ProgressEvent | ToolResultEvent | CompleteEvent | ErrorEvent;\n\nexport type IDE = \"claude\" | \"cursor\" | \"antigravity\" | \"universal\";\n\nexport type Scope = \"project\" | \"global\";\n\nexport interface IDEOptions {\n claude?: boolean;\n cursor?: boolean;\n universal?: boolean;\n antigravity?: boolean;\n}\n\nexport interface ScopeOptions {\n global?: boolean;\n}\n\nexport type AddOptions = IDEOptions & ScopeOptions & { all?: boolean };\nexport type SuggestOptions = IDEOptions & ScopeOptions;\nexport type ListOptions = IDEOptions & ScopeOptions;\nexport type RemoveOptions = IDEOptions & ScopeOptions;\nexport type GenerateOptions = IDEOptions &\n ScopeOptions & {\n output?: string;\n all?: boolean;\n };\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 antigravity: \".agent/skills\",\n universal: \".agents/skills\",\n};\n\nexport const IDE_GLOBAL_PATHS: Record<IDE, string> = {\n claude: \".claude/skills\",\n cursor: \".cursor/skills\",\n antigravity: \".agent/skills\",\n universal: \".config/agents/skills\",\n};\n\nexport const IDE_NAMES: Record<IDE, string> = {\n claude: \"Claude Code\",\n cursor: \"Cursor\",\n antigravity: \"Antigravity\",\n universal: \"Universal\",\n};\n\n// Universal .agents/skills standard\n// These agents read from .agents/skills/ natively — one install covers all of them.\nexport const UNIVERSAL_SKILLS_PATH = \".agents/skills\";\nexport const UNIVERSAL_SKILLS_GLOBAL_PATH = \".config/agents/skills\";\n\n// Display label for agents that read .agents/skills/ (includes agents beyond our IDE type)\nexport const UNIVERSAL_AGENTS_LABEL = \"Amp, Codex, Gemini CLI, GitHub Copilot, OpenCode + more\";\n\n// Agents that still require their own vendor-specific skill directory.\nexport const VENDOR_SPECIFIC_AGENTS: IDE[] = [\"claude\", \"cursor\", \"antigravity\"];\n\nexport interface C7Config {\n defaultIde: IDE;\n defaultScope: \"project\" | \"global\";\n}\n\nexport const DEFAULT_CONFIG: C7Config = {\n defaultIde: \"universal\",\n defaultScope: \"project\",\n};\n\n// Suggest endpoint types\nexport interface SuggestSkill extends SkillSearchResult {\n matchedDep: string;\n}\n\nexport interface SuggestResponse {\n skills: SuggestSkill[];\n error?: string;\n message?: string;\n}\n\nexport interface SkillQuotaResponse {\n used: number;\n limit: number;\n remaining: number;\n tier: \"free\" | \"pro\" | \"unlimited\";\n resetDate: string | null;\n message?: string;\n error?: string;\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 { getBaseUrl } from \"./api.js\";\n\nexport function trackEvent(event: string, data?: Record<string, unknown>): void {\n if (process.env.CTX7_TELEMETRY_DISABLED) return;\n fetch(`${getBaseUrl()}/api/v2/cli/events`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ event, data }),\n }).catch(() => {});\n}\n","import { Command } from \"commander\";\nimport pc from \"picocolors\";\nimport ora from \"ora\";\nimport { mkdir, writeFile, readFile, unlink } from \"fs/promises\";\nimport { join } from \"path\";\nimport { homedir } from \"os\";\nimport { spawn } from \"child_process\";\nimport { input, select } from \"@inquirer/prompts\";\n\nimport {\n searchLibraries,\n getSkillQuestions,\n generateSkillStructured,\n getSkillQuota,\n} from \"../utils/api.js\";\nimport { loadTokens, isTokenExpired } from \"../utils/auth.js\";\nimport { performLogin } from \"./auth.js\";\nimport { log } from \"../utils/logger.js\";\nimport { promptForInstallTargets, getTargetDirs } from \"../utils/ide.js\";\nimport selectOrInput from \"../utils/selectOrInput.js\";\nimport { checkboxWithHover, terminalLink } from \"../utils/prompts.js\";\nimport { trackEvent } from \"../utils/tracking.js\";\nimport type {\n GenerateOptions,\n LibrarySearchResult,\n SkillAnswer,\n StructuredGenerateInput,\n GenerateStreamEvent,\n ToolResultSnippet,\n} from \"../types.js\";\n\ninterface QueryLogEntry {\n query: string;\n libraryId?: string;\n results: ToolResultSnippet[];\n}\n\nexport function registerGenerateCommand(skillCommand: Command): void {\n skillCommand\n .command(\"generate\")\n .alias(\"gen\")\n .alias(\"g\")\n .option(\"-o, --output <dir>\", \"Output directory (default: current directory)\")\n .option(\"--all\", \"Generate for all detected IDEs\")\n .option(\"--global\", \"Generate in global skills directory\")\n .option(\"--claude\", \"Claude Code (.claude/skills/)\")\n .option(\"--cursor\", \"Cursor (.cursor/skills/)\")\n .option(\"--universal\", \"Universal (.agents/skills/)\")\n .option(\"--antigravity\", \"Antigravity (.agent/skills/)\")\n .description(\"Generate a skill for a library using AI\")\n .action(async (options: GenerateOptions) => {\n await generateCommand(options);\n });\n}\n\nasync function generateCommand(options: GenerateOptions): Promise<void> {\n trackEvent(\"command\", { name: \"generate\" });\n log.blank();\n\n let accessToken: string | null = null;\n const tokens = loadTokens();\n if (tokens && !isTokenExpired(tokens)) {\n accessToken = tokens.access_token;\n } else {\n log.info(\"Authentication required. Logging in...\");\n log.blank();\n accessToken = await performLogin();\n if (!accessToken) {\n log.error(\"Login failed. Please try again.\");\n return;\n }\n log.blank();\n }\n\n const initSpinner = ora().start();\n const quota = await getSkillQuota(accessToken);\n\n if (quota.error) {\n initSpinner.fail(pc.red(\"Failed to initialize\"));\n return;\n }\n\n if (quota.tier !== \"unlimited\" && quota.remaining < 1) {\n initSpinner.fail(pc.red(\"Weekly skill generation limit reached\"));\n log.blank();\n console.log(\n ` You've used ${pc.bold(pc.white(quota.used.toString()))}/${pc.bold(pc.white(quota.limit.toString()))} skill generations this week.`\n );\n console.log(\n ` Your quota resets on ${pc.yellow(new Date(quota.resetDate!).toLocaleDateString())}.`\n );\n log.blank();\n if (quota.tier === \"free\") {\n console.log(\n ` ${pc.yellow(\"Tip:\")} Upgrade to Pro for ${pc.bold(\"10\")} generations per week.`\n );\n console.log(` Visit ${pc.green(\"https://context7.com/dashboard\")} to upgrade.`);\n }\n return;\n }\n\n initSpinner.stop();\n initSpinner.clear();\n\n console.log(pc.bold(\"What should your agent become an expert at?\\n\"));\n console.log(\n pc.dim(\n \"Skills should encode best practices, constraints, and decision-making —\\nnot step-by-step tutorials or one-off tasks.\\n\"\n )\n );\n console.log(pc.yellow(\"Examples:\"));\n // prettier-ignore\n {\n console.log(pc.red(' ✕ \"Deploy a Next.js app to Vercel\"'));\n console.log(pc.green(' ✓ \"Best practices and constraints for deploying Next.js apps to Vercel\"'));\n log.blank();\n console.log(pc.red(' ✕ \"Use Tailwind for responsive design\"'));\n console.log(pc.green(' ✓ \"Responsive layout decision-making with Tailwind CSS\"'));\n log.blank();\n console.log(pc.red(' ✕ \"Build OAuth with NextAuth\"'));\n console.log(pc.green(' ✓ \"OAuth authentication patterns and pitfalls with NextAuth.js\"'));\n }\n log.blank();\n\n let motivation: string;\n try {\n motivation = await input({\n message: \"Describe the expertise:\",\n });\n\n if (!motivation.trim()) {\n log.warn(\"Expertise description is required\");\n return;\n }\n motivation = motivation.trim();\n } catch {\n log.warn(\"Generation cancelled\");\n return;\n }\n\n log.blank();\n console.log(\n pc.dim(\n \"To generate this skill, we will read relevant documentation and examples\\nfrom Context7.\\n\"\n )\n );\n console.log(\n pc.dim(\n \"These sources are used to:\\n• extract best practices and constraints\\n• compare patterns across official docs and examples\\n• avoid outdated or incorrect guidance\\n\"\n )\n );\n console.log(pc.dim(\"You can adjust which sources the skill is based on.\\n\"));\n\n const searchSpinner = ora(\"Finding relevant sources...\").start();\n const searchResult = await searchLibraries(motivation, accessToken);\n\n if (searchResult.error || !searchResult.results?.length) {\n searchSpinner.fail(pc.red(\"No sources found\"));\n log.warn(searchResult.message || \"Try a different description\");\n return;\n }\n\n searchSpinner.succeed(pc.green(`Found ${searchResult.results.length} relevant sources`));\n log.blank();\n\n let selectedLibraries: LibrarySearchResult[];\n try {\n const formatProjectId = (id: string) => {\n return id.startsWith(\"/\") ? id.slice(1) : id;\n };\n\n const isGitHubRepo = (id: string): boolean => {\n const cleanId = id.startsWith(\"/\") ? id.slice(1) : id;\n const parts = cleanId.split(\"/\");\n if (parts.length !== 2) return false;\n const nonGitHubPrefixes = [\"websites\", \"packages\", \"npm\", \"docs\", \"libraries\", \"llmstxt\"];\n return !nonGitHubPrefixes.includes(parts[0].toLowerCase());\n };\n\n const libraries = searchResult.results.slice(0, 5);\n const indexWidth = libraries.length.toString().length;\n const maxNameLen = Math.max(...libraries.map((lib) => lib.title.length));\n\n const libraryChoices = libraries.map((lib, index) => {\n const projectId = formatProjectId(lib.id);\n const isGitHub = isGitHubRepo(lib.id);\n const indexStr = pc.dim(`${(index + 1).toString().padStart(indexWidth)}.`);\n const paddedName = lib.title.padEnd(maxNameLen);\n\n const libUrl = `https://context7.com${lib.id}`;\n const libLink = terminalLink(lib.title, libUrl, pc.white);\n const sourceUrl = isGitHub\n ? `https://github.com/${projectId}`\n : `https://context7.com${lib.id}`;\n const repoLink = terminalLink(projectId, sourceUrl, pc.white);\n\n const starsLine =\n lib.stars && isGitHub ? [`${pc.yellow(\"Stars:\")} ${lib.stars.toLocaleString()}`] : [];\n\n const metadataLines = [\n pc.dim(\"─\".repeat(50)),\n \"\",\n `${pc.yellow(\"Library:\")} ${libLink}`,\n `${pc.yellow(\"Source:\")} ${repoLink}`,\n `${pc.yellow(\"Snippets:\")} ${lib.totalSnippets.toLocaleString()}`,\n ...starsLine,\n `${pc.yellow(\"Description:\")}`,\n pc.white(lib.description || \"No description\"),\n ];\n\n return {\n name: `${indexStr} ${paddedName} ${pc.dim(`(${projectId})`)}`,\n value: lib,\n description: metadataLines.join(\"\\n\"),\n };\n });\n\n selectedLibraries = await checkboxWithHover(\n {\n message: \"Select sources:\",\n choices: libraryChoices,\n pageSize: 10,\n loop: false,\n },\n { getName: (lib) => `${lib.title} (${formatProjectId(lib.id)})` }\n );\n\n if (!selectedLibraries || selectedLibraries.length === 0) {\n log.info(\"No sources selected. Try running the command again.\");\n return;\n }\n } catch {\n log.warn(\"Generation cancelled\");\n return;\n }\n\n log.blank();\n\n const questionsSpinner = ora(\n \"Preparing follow-up questions to clarify scope and constraints...\"\n ).start();\n const librariesInput = selectedLibraries.map((lib) => ({ id: lib.id, name: lib.title }));\n const questionsResult = await getSkillQuestions(librariesInput, motivation, accessToken);\n\n if (questionsResult.error || !questionsResult.questions?.length) {\n questionsSpinner.fail(pc.red(\"Failed to generate questions\"));\n log.warn(questionsResult.message || \"Please try again\");\n return;\n }\n\n questionsSpinner.succeed(pc.green(\"Questions prepared\"));\n log.blank();\n\n const answers: SkillAnswer[] = [];\n try {\n for (let i = 0; i < questionsResult.questions.length; i++) {\n const q = questionsResult.questions[i];\n const questionNum = i + 1;\n const totalQuestions = questionsResult.questions.length;\n\n const answer = await selectOrInput({\n message: `${pc.dim(`[${questionNum}/${totalQuestions}]`)} ${q.question}`,\n options: q.options,\n recommendedIndex: q.recommendedIndex,\n });\n\n answers.push({\n question: q.question,\n answer,\n });\n\n const linesToClear = 3 + q.options.length;\n process.stdout.write(`\\x1b[${linesToClear}A\\x1b[J`);\n\n const truncatedAnswer = answer.length > 50 ? answer.slice(0, 47) + \"...\" : answer;\n console.log(`${pc.green(\"✓\")} ${pc.dim(`[${questionNum}/${totalQuestions}]`)} ${q.question}`);\n console.log(` ${pc.cyan(truncatedAnswer)}`);\n log.blank();\n }\n } catch {\n log.warn(\"Generation cancelled\");\n return;\n }\n\n let generatedContent: string | null = null;\n let skillName: string = \"\";\n let feedback: string | undefined;\n let previewFile: string | null = null;\n let previewFileWritten = false;\n\n const cleanupPreviewFile = async () => {\n if (previewFile) {\n await unlink(previewFile).catch(() => {});\n }\n };\n\n const queryLog: QueryLogEntry[] = [];\n let genSpinner: ReturnType<typeof ora> | null = null;\n\n const formatQueryLogText = (): string => {\n if (queryLog.length === 0) return \"\";\n\n const lines: string[] = [];\n const latestEntry = queryLog[queryLog.length - 1];\n\n lines.push(\"\");\n\n for (const result of latestEntry.results.slice(0, 3)) {\n const cleanContent = result.content.replace(/Source:\\s*https?:\\/\\/[^\\s]+/gi, \"\").trim();\n if (cleanContent) {\n lines.push(` ${pc.yellow(\"•\")} ${pc.white(result.title)}`);\n const maxLen = 400;\n const content =\n cleanContent.length > maxLen ? cleanContent.slice(0, maxLen - 3) + \"...\" : cleanContent;\n const words = content.split(\" \");\n let currentLine = \" \";\n for (const word of words) {\n if (currentLine.length + word.length > 84) {\n lines.push(pc.dim(currentLine));\n currentLine = \" \" + word + \" \";\n } else {\n currentLine += word + \" \";\n }\n }\n if (currentLine.trim()) {\n lines.push(pc.dim(currentLine));\n }\n lines.push(\"\");\n }\n }\n\n return \"\\n\" + lines.join(\"\\n\");\n };\n\n let isGeneratingContent = false;\n let initialStatus = \"Reading selected Context7 sources to generate the skill...\";\n\n const handleStreamEvent = (event: GenerateStreamEvent) => {\n if (event.type === \"progress\") {\n if (genSpinner) {\n if (event.message.startsWith(\"Generating skill content...\") && !isGeneratingContent) {\n isGeneratingContent = true;\n if (queryLog.length > 0) {\n genSpinner.succeed(pc.green(`Read Context7 sources`));\n } else {\n genSpinner.succeed(pc.green(`Ready to generate`));\n }\n genSpinner = ora(\"Generating skill content...\").start();\n } else if (!isGeneratingContent) {\n genSpinner.text = initialStatus + formatQueryLogText();\n }\n }\n } else if (event.type === \"tool_result\") {\n queryLog.push({\n query: event.query,\n libraryId: event.libraryId,\n results: event.results,\n });\n if (genSpinner && !isGeneratingContent) {\n genSpinner.text = genSpinner.text.split(\"\\n\")[0] + formatQueryLogText();\n }\n }\n };\n\n while (true) {\n const generateInput: StructuredGenerateInput = {\n motivation,\n libraries: librariesInput,\n answers,\n feedback,\n previousContent: feedback && generatedContent ? generatedContent : undefined,\n };\n\n queryLog.length = 0;\n isGeneratingContent = false;\n previewFileWritten = false;\n initialStatus = feedback\n ? \"Regenerating skill with your feedback...\"\n : \"Reading selected Context7 sources to generate the skill...\";\n\n genSpinner = ora(initialStatus).start();\n\n const result = await generateSkillStructured(generateInput, handleStreamEvent, accessToken);\n\n if (result.error) {\n genSpinner.fail(pc.red(`Error: ${result.error}`));\n return;\n }\n\n if (!result.content) {\n genSpinner.fail(pc.red(\"No content generated\"));\n return;\n }\n\n genSpinner.succeed(pc.green(`Generated skill for \"${result.libraryName}\"`));\n generatedContent = result.content;\n skillName = result.libraryName.toLowerCase().replace(/[^a-z0-9-]/g, \"-\");\n\n const contentLines = generatedContent.split(\"\\n\");\n const previewLineCount = 20;\n const hasMoreLines = contentLines.length > previewLineCount;\n const previewContent = contentLines.slice(0, previewLineCount).join(\"\\n\");\n const remainingLines = contentLines.length - previewLineCount;\n\n const showPreview = () => {\n log.blank();\n console.log(pc.dim(\"━\".repeat(70)));\n console.log(pc.bold(`Generated Skill: `) + pc.green(pc.bold(skillName)));\n console.log(pc.dim(\"━\".repeat(70)));\n log.blank();\n console.log(previewContent);\n if (hasMoreLines) {\n log.blank();\n console.log(pc.dim(`... ${remainingLines} more lines`));\n }\n log.blank();\n console.log(pc.dim(\"━\".repeat(70)));\n log.blank();\n };\n\n const openInEditor = async () => {\n const previewDir = join(homedir(), \".context7\", \"previews\");\n await mkdir(previewDir, { recursive: true });\n previewFile = join(previewDir, `${skillName}.md`);\n if (!previewFileWritten) {\n await writeFile(previewFile, generatedContent!, \"utf-8\");\n previewFileWritten = true;\n }\n const editor = process.env.EDITOR || \"open\";\n await new Promise<void>((resolve) => {\n const child = spawn(editor, [previewFile!], {\n stdio: \"inherit\",\n shell: true,\n });\n child.on(\"close\", () => resolve());\n });\n };\n\n const syncFromPreviewFile = async () => {\n if (previewFile) {\n generatedContent = await readFile(previewFile, \"utf-8\");\n }\n };\n\n showPreview();\n\n await new Promise((resolve) => setTimeout(resolve, 100));\n\n try {\n let action: string;\n while (true) {\n const choices = [\n { name: `${pc.green(\"✓\")} Install skill (save locally)`, value: \"install\" },\n { name: `${pc.blue(\"⤢\")} Edit skill in editor`, value: \"view\" },\n { name: `${pc.yellow(\"✎\")} Request changes`, value: \"feedback\" },\n { name: `${pc.red(\"✕\")} Cancel`, value: \"cancel\" },\n ];\n\n action = await select({\n message: \"What would you like to do?\",\n choices,\n });\n\n if (action === \"view\") {\n await openInEditor();\n continue;\n }\n await syncFromPreviewFile();\n break;\n }\n\n if (action === \"install\") {\n break;\n } else if (action === \"cancel\") {\n await cleanupPreviewFile();\n log.warn(\"Generation cancelled\");\n return;\n } else if (action === \"feedback\") {\n trackEvent(\"gen_feedback\");\n feedback = await input({\n message: \"What changes would you like? (press Enter to skip)\",\n });\n\n if (!feedback.trim()) {\n feedback = undefined;\n }\n log.blank();\n }\n } catch {\n await cleanupPreviewFile();\n log.warn(\"Generation cancelled\");\n return;\n }\n }\n\n const targets = await promptForInstallTargets(options);\n if (!targets) {\n log.warn(\"Generation cancelled\");\n return;\n }\n\n const targetDirs = getTargetDirs(targets);\n\n const writeSpinner = ora(\"Writing skill files...\").start();\n\n let permissionError = false;\n const failedDirs: Set<string> = new Set();\n\n for (const targetDir of targetDirs) {\n let finalDir = targetDir;\n if (options.output && !targetDir.includes(\"/.config/\") && !targetDir.startsWith(homedir())) {\n finalDir = targetDir.replace(process.cwd(), options.output);\n }\n const skillDir = join(finalDir, skillName);\n const skillPath = join(skillDir, \"SKILL.md\");\n\n try {\n await mkdir(skillDir, { recursive: true });\n await writeFile(skillPath, generatedContent!, \"utf-8\");\n } catch (err) {\n const error = err as NodeJS.ErrnoException;\n if (error.code === \"EACCES\" || error.code === \"EPERM\") {\n permissionError = true;\n failedDirs.add(skillDir);\n } else {\n log.warn(`Failed to write to ${skillPath}: ${error.message}`);\n }\n }\n }\n\n if (permissionError) {\n writeSpinner.fail(pc.red(\"Permission denied\"));\n log.blank();\n console.log(pc.yellow(\"Fix permissions with:\"));\n for (const dir of failedDirs) {\n const parentDir = join(dir, \"..\");\n console.log(pc.dim(` sudo chown -R $(whoami) \"${parentDir}\"`));\n }\n log.blank();\n return;\n }\n\n writeSpinner.succeed(pc.green(`Created skill in ${targetDirs.length} location(s)`));\n trackEvent(\"gen_install\");\n\n log.blank();\n console.log(pc.green(\"Skill saved successfully\"));\n for (const targetDir of targetDirs) {\n console.log(pc.dim(` ${targetDir}/`) + pc.green(skillName));\n }\n log.blank();\n\n await cleanupPreviewFile();\n}\n","import * as crypto from \"crypto\";\nimport * as http from \"http\";\nimport * as fs from \"fs\";\nimport * as path from \"path\";\nimport * as os from \"os\";\n\nconst CONFIG_DIR = path.join(os.homedir(), \".context7\");\nconst CREDENTIALS_FILE = path.join(CONFIG_DIR, \"credentials.json\");\n\nexport interface TokenData {\n access_token: string;\n refresh_token?: string;\n token_type: string;\n expires_in?: number;\n expires_at?: number;\n scope?: string;\n}\n\nexport interface PKCEChallenge {\n codeVerifier: string;\n codeChallenge: string;\n}\n\nexport function generatePKCE(): PKCEChallenge {\n const codeVerifier = crypto.randomBytes(32).toString(\"base64url\");\n const codeChallenge = crypto.createHash(\"sha256\").update(codeVerifier).digest(\"base64url\");\n return { codeVerifier, codeChallenge };\n}\n\nexport function generateState(): string {\n return crypto.randomBytes(16).toString(\"base64url\");\n}\n\nfunction ensureConfigDir(): void {\n if (!fs.existsSync(CONFIG_DIR)) {\n fs.mkdirSync(CONFIG_DIR, { recursive: true, mode: 0o700 });\n }\n}\n\nexport function saveTokens(tokens: TokenData): void {\n ensureConfigDir();\n const data = {\n ...tokens,\n expires_at:\n tokens.expires_at ?? (tokens.expires_in ? Date.now() + tokens.expires_in * 1000 : undefined),\n };\n fs.writeFileSync(CREDENTIALS_FILE, JSON.stringify(data, null, 2), { mode: 0o600 });\n}\n\nexport function loadTokens(): TokenData | null {\n if (!fs.existsSync(CREDENTIALS_FILE)) {\n return null;\n }\n try {\n const data = JSON.parse(fs.readFileSync(CREDENTIALS_FILE, \"utf-8\"));\n return data as TokenData;\n } catch {\n return null;\n }\n}\n\nexport function clearTokens(): boolean {\n if (fs.existsSync(CREDENTIALS_FILE)) {\n fs.unlinkSync(CREDENTIALS_FILE);\n return true;\n }\n return false;\n}\n\nexport function isTokenExpired(tokens: TokenData): boolean {\n if (!tokens.expires_at) {\n return false;\n }\n return Date.now() > tokens.expires_at - 60000;\n}\n\nexport interface CallbackResult {\n code: string;\n state: string;\n}\n\n// Port for OAuth callback server - must match registered redirect URI\nconst CALLBACK_PORT = 52417;\n\nexport function createCallbackServer(expectedState: string): {\n port: Promise<number>;\n result: Promise<CallbackResult>;\n close: () => void;\n} {\n let resolvePort: (port: number) => void;\n let resolveResult: (result: CallbackResult) => void;\n let rejectResult: (error: Error) => void;\n let serverInstance: http.Server | null = null;\n\n const portPromise = new Promise<number>((resolve) => {\n resolvePort = resolve;\n });\n\n const resultPromise = new Promise<CallbackResult>((resolve, reject) => {\n resolveResult = resolve;\n rejectResult = reject;\n });\n\n const server = http.createServer((req, res) => {\n const url = new URL(req.url || \"/\", `http://localhost`);\n\n if (url.pathname === \"/callback\") {\n const code = url.searchParams.get(\"code\");\n const state = url.searchParams.get(\"state\");\n const error = url.searchParams.get(\"error\");\n const errorDescription = url.searchParams.get(\"error_description\");\n\n res.writeHead(200, { \"Content-Type\": \"text/html\" });\n\n if (error) {\n res.end(errorPage(errorDescription || error));\n serverInstance?.close();\n rejectResult(new Error(errorDescription || error));\n return;\n }\n\n if (!code || !state) {\n res.end(errorPage(\"Missing authorization code or state\"));\n serverInstance?.close();\n rejectResult(new Error(\"Missing authorization code or state\"));\n return;\n }\n\n if (state !== expectedState) {\n res.end(errorPage(\"State mismatch - possible CSRF attack\"));\n serverInstance?.close();\n rejectResult(new Error(\"State mismatch\"));\n return;\n }\n\n res.end(successPage());\n serverInstance?.close();\n resolveResult({ code, state });\n } else {\n res.writeHead(404);\n res.end(\"Not found\");\n }\n });\n\n serverInstance = server;\n\n server.on(\"error\", (err) => {\n rejectResult(err as Error);\n });\n\n server.listen(CALLBACK_PORT, \"127.0.0.1\", () => {\n resolvePort(CALLBACK_PORT);\n });\n\n const timeout = setTimeout(\n () => {\n server.close();\n rejectResult(new Error(\"Login timed out after 5 minutes\"));\n },\n 5 * 60 * 1000\n );\n\n return {\n port: portPromise,\n result: resultPromise,\n close: () => {\n clearTimeout(timeout);\n server.close();\n },\n };\n}\n\nfunction successPage(): string {\n return `<!DOCTYPE html>\n<html>\n <head><title>Login Successful</title></head>\n <body style=\"font-family: system-ui; display: flex; justify-content: center; align-items: center; height: 100vh; margin: 0; background: #f9fafb;\">\n <div style=\"text-align: center; padding: 2rem;\">\n <div style=\"width: 64px; height: 64px; background: #16a34a; border-radius: 50%; display: flex; align-items: center; justify-content: center; margin: 0 auto 1rem;\">\n <svg width=\"32\" height=\"32\" fill=\"none\" stroke=\"white\" stroke-width=\"3\" viewBox=\"0 0 24 24\">\n <path d=\"M5 13l4 4L19 7\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </div>\n <h1 style=\"color: #16a34a; margin: 0 0 0.5rem;\">Login Successful!</h1>\n <p style=\"color: #6b7280; margin: 0;\">You can close this window and return to the terminal.</p>\n </div>\n </body>\n</html>`;\n}\n\nfunction escapeHtml(text: string): string {\n return text\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\"/g, \""\")\n .replace(/'/g, \"'\");\n}\n\nfunction errorPage(message: string): string {\n const safeMessage = escapeHtml(message);\n return `<!DOCTYPE html>\n<html>\n <head><title>Login Failed</title></head>\n <body style=\"font-family: system-ui; display: flex; justify-content: center; align-items: center; height: 100vh; margin: 0; background: #f9fafb;\">\n <div style=\"text-align: center; padding: 2rem;\">\n <div style=\"width: 64px; height: 64px; background: #dc2626; border-radius: 50%; display: flex; align-items: center; justify-content: center; margin: 0 auto 1rem;\">\n <svg width=\"32\" height=\"32\" fill=\"none\" stroke=\"white\" stroke-width=\"3\" viewBox=\"0 0 24 24\">\n <path d=\"M6 18L18 6M6 6l12 12\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </div>\n <h1 style=\"color: #dc2626; margin: 0 0 0.5rem;\">Login Failed</h1>\n <p style=\"color: #6b7280; margin: 0;\">${safeMessage}</p>\n <p style=\"color: #9ca3af; margin: 1rem 0 0; font-size: 0.875rem;\">You can close this window.</p>\n </div>\n </body>\n</html>`;\n}\n\ninterface TokenErrorResponse {\n error?: string;\n error_description?: string;\n}\n\nexport async function exchangeCodeForTokens(\n baseUrl: string,\n code: string,\n codeVerifier: string,\n redirectUri: string,\n clientId: string\n): Promise<TokenData> {\n const response = await fetch(`${baseUrl}/api/oauth/token`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/x-www-form-urlencoded\" },\n body: new URLSearchParams({\n grant_type: \"authorization_code\",\n client_id: clientId,\n code,\n code_verifier: codeVerifier,\n redirect_uri: redirectUri,\n }).toString(),\n });\n\n if (!response.ok) {\n const err = (await response.json().catch(() => ({}))) as TokenErrorResponse;\n throw new Error(err.error_description || err.error || \"Failed to exchange code for tokens\");\n }\n\n return (await response.json()) as TokenData;\n}\n\nexport function buildAuthorizationUrl(\n baseUrl: string,\n clientId: string,\n redirectUri: string,\n codeChallenge: string,\n state: string\n): string {\n const url = new URL(`${baseUrl}/api/oauth/authorize`);\n url.searchParams.set(\"client_id\", clientId);\n url.searchParams.set(\"redirect_uri\", redirectUri);\n url.searchParams.set(\"code_challenge\", codeChallenge);\n url.searchParams.set(\"code_challenge_method\", \"S256\");\n url.searchParams.set(\"state\", state);\n url.searchParams.set(\"scope\", \"profile email\");\n url.searchParams.set(\"response_type\", \"code\");\n return url.toString();\n}\n","import { Command } from \"commander\";\nimport pc from \"picocolors\";\nimport ora from \"ora\";\nimport open from \"open\";\nimport {\n generatePKCE,\n generateState,\n createCallbackServer,\n exchangeCodeForTokens,\n saveTokens,\n loadTokens,\n clearTokens,\n buildAuthorizationUrl,\n isTokenExpired,\n} from \"../utils/auth.js\";\n\nimport { trackEvent } from \"../utils/tracking.js\";\n\nconst CLI_CLIENT_ID = \"2veBSofhicRBguUT\";\n\nlet baseUrl = \"https://context7.com\";\n\nexport function setAuthBaseUrl(url: string): void {\n baseUrl = url;\n}\n\nexport function registerAuthCommands(program: Command): void {\n program\n .command(\"login\")\n .description(\"Log in to Context7\")\n .option(\"--no-browser\", \"Don't open browser automatically\")\n .action(async (options) => {\n await loginCommand(options);\n });\n\n program\n .command(\"logout\")\n .description(\"Log out of Context7\")\n .action(() => {\n logoutCommand();\n });\n\n program\n .command(\"whoami\")\n .description(\"Show current login status\")\n .action(async () => {\n await whoamiCommand();\n });\n}\n\nexport async function performLogin(openBrowser = true): Promise<string | null> {\n const spinner = ora(\"Preparing login...\").start();\n\n try {\n const { codeVerifier, codeChallenge } = generatePKCE();\n const state = generateState();\n const callbackServer = createCallbackServer(state);\n const port = await callbackServer.port;\n const redirectUri = `http://localhost:${port}/callback`;\n const authUrl = buildAuthorizationUrl(\n baseUrl,\n CLI_CLIENT_ID,\n redirectUri,\n codeChallenge,\n state\n );\n\n spinner.stop();\n\n console.log(\"\");\n console.log(pc.bold(\"Opening browser to log in...\"));\n console.log(\"\");\n\n if (openBrowser) {\n await open(authUrl);\n console.log(pc.dim(\"If the browser didn't open, visit this URL:\"));\n } else {\n console.log(pc.dim(\"Open this URL in your browser:\"));\n }\n console.log(pc.cyan(authUrl));\n console.log(\"\");\n\n const waitingSpinner = ora(\"Waiting for login...\").start();\n\n try {\n const { code } = await callbackServer.result;\n waitingSpinner.text = \"Exchanging code for tokens...\";\n\n const tokens = await exchangeCodeForTokens(\n baseUrl,\n code,\n codeVerifier,\n redirectUri,\n CLI_CLIENT_ID\n );\n saveTokens(tokens);\n callbackServer.close();\n\n waitingSpinner.succeed(pc.green(\"Login successful!\"));\n return tokens.access_token;\n } catch (error) {\n callbackServer.close();\n waitingSpinner.fail(pc.red(\"Login failed\"));\n if (error instanceof Error) {\n console.error(pc.red(error.message));\n }\n return null;\n }\n } catch (error) {\n spinner.fail(pc.red(\"Login failed\"));\n if (error instanceof Error) {\n console.error(pc.red(error.message));\n }\n return null;\n }\n}\n\nasync function loginCommand(options: { browser: boolean }): Promise<void> {\n trackEvent(\"command\", { name: \"login\" });\n const existingTokens = loadTokens();\n if (existingTokens) {\n const expired = isTokenExpired(existingTokens);\n if (!expired || existingTokens.refresh_token) {\n console.log(pc.yellow(\"You are already logged in.\"));\n console.log(\n pc.dim(\"Run 'ctx7 logout' first if you want to log in with a different account.\")\n );\n return;\n }\n clearTokens();\n }\n\n const token = await performLogin(options.browser);\n if (!token) {\n process.exit(1);\n }\n console.log(\"\");\n console.log(pc.dim(\"You can now use authenticated Context7 features.\"));\n}\n\nfunction logoutCommand(): void {\n trackEvent(\"command\", { name: \"logout\" });\n if (clearTokens()) {\n console.log(pc.green(\"Logged out successfully.\"));\n } else {\n console.log(pc.yellow(\"You are not logged in.\"));\n }\n}\n\nasync function whoamiCommand(): Promise<void> {\n trackEvent(\"command\", { name: \"whoami\" });\n const tokens = loadTokens();\n\n if (!tokens) {\n console.log(pc.yellow(\"Not logged in.\"));\n console.log(pc.dim(\"Run 'ctx7 login' to authenticate.\"));\n return;\n }\n\n console.log(pc.green(\"Logged in\"));\n\n try {\n const userInfo = await fetchUserInfo(tokens.access_token);\n if (userInfo.name) {\n console.log(`${pc.dim(\"Name:\".padEnd(9))}${userInfo.name}`);\n }\n if (userInfo.email) {\n console.log(`${pc.dim(\"Email:\".padEnd(9))}${userInfo.email}`);\n }\n } catch {\n if (isTokenExpired(tokens) && !tokens.refresh_token) {\n console.log(pc.dim(\"(Session may be expired - run 'ctx7 login' to refresh)\"));\n }\n }\n}\n\ninterface UserInfo {\n sub?: string;\n name?: string;\n email?: string;\n picture?: string;\n}\n\nasync function fetchUserInfo(accessToken: string): Promise<UserInfo> {\n const response = await fetch(\"https://clerk.context7.com/oauth/userinfo\", {\n headers: {\n Authorization: `Bearer ${accessToken}`,\n },\n });\n\n if (!response.ok) {\n throw new Error(\"Failed to fetch user info\");\n }\n\n return (await response.json()) as UserInfo;\n}\n","import {\n createPrompt,\n useState,\n useKeypress,\n usePrefix,\n isEnterKey,\n isUpKey,\n isDownKey,\n} from \"@inquirer/core\";\nimport type { KeypressEvent } from \"@inquirer/core\";\nimport pc from \"picocolors\";\n\nexport interface SelectOrInputConfig {\n message: string;\n options: string[];\n recommendedIndex?: number;\n}\n\nfunction reorderOptions(options: string[], recommendedIndex: number): string[] {\n if (recommendedIndex === 0) return options;\n const reordered = [options[recommendedIndex]];\n for (let i = 0; i < options.length; i++) {\n if (i !== recommendedIndex) reordered.push(options[i]);\n }\n return reordered;\n}\n\nconst selectOrInput: (config: SelectOrInputConfig) => Promise<string> = createPrompt<\n string,\n SelectOrInputConfig\n>((config, done): string => {\n const { message, options: rawOptions, recommendedIndex = 0 } = config;\n const options = reorderOptions(rawOptions, recommendedIndex);\n const [cursor, setCursor] = useState(0);\n const [inputValue, setInputValue] = useState(\"\");\n\n const prefix = usePrefix({});\n\n useKeypress((key: KeypressEvent, rl) => {\n if (isUpKey(key)) {\n setCursor(Math.max(0, cursor - 1));\n return;\n }\n\n if (isDownKey(key)) {\n setCursor(Math.min(options.length, cursor + 1));\n return;\n }\n\n if (isEnterKey(key)) {\n if (cursor === options.length) {\n const finalValue = inputValue.trim();\n done(finalValue || options[0]);\n } else {\n done(options[cursor]);\n }\n return;\n }\n\n // Text input handling (only when on custom input line)\n if (cursor === options.length && key.name !== \"return\") {\n if ((key.name === \"w\" && key.ctrl) || key.name === \"backspace\") {\n if (key.name === \"w\" && key.ctrl) {\n const words = inputValue.trimEnd().split(/\\s+/);\n if (words.length > 0) {\n words.pop();\n setInputValue(\n words.join(\" \") + (inputValue.endsWith(\" \") && words.length > 0 ? \" \" : \"\")\n );\n }\n } else {\n setInputValue(inputValue.slice(0, -1));\n }\n } else if (key.name === \"u\" && key.ctrl) {\n setInputValue(\"\");\n } else if (key.name === \"space\") {\n setInputValue(inputValue + \" \");\n } else if (key.name && key.name.length === 1 && !key.ctrl) {\n setInputValue(inputValue + key.name);\n }\n } else if (rl.line) {\n rl.line = \"\";\n }\n });\n\n let output = `${prefix} ${pc.bold(message)}\\n\\n`;\n\n options.forEach((opt: string, idx: number) => {\n const isRecommended = idx === 0;\n const isCursor = idx === cursor;\n const number = pc.cyan(`${idx + 1}.`);\n const text = isRecommended ? `${opt} ${pc.green(\"✓ Recommended\")}` : opt;\n\n if (isCursor) {\n output += pc.cyan(`❯ ${number} ${text}\\n`);\n } else {\n output += ` ${number} ${text}\\n`;\n }\n });\n\n const isCustomCursor = cursor === options.length;\n if (isCustomCursor) {\n output += pc.cyan(`❯ ${pc.yellow(\"✎\")} ${inputValue || pc.dim(\"Type your own...\")}`);\n } else {\n output += ` ${pc.yellow(\"✎\")} ${pc.dim(\"Type your own...\")}`;\n }\n\n return output;\n});\n\nexport default selectOrInput;\n","import { readFile } from \"fs/promises\";\nimport { join } from \"path\";\n\nasync function readFileOrNull(path: string): Promise<string | null> {\n try {\n return await readFile(path, \"utf-8\");\n } catch {\n return null;\n }\n}\n\n/** Basic client-side filter. The real SKIP_SET lives on the backend. */\nfunction isSkippedLocally(name: string): boolean {\n return name.startsWith(\"@types/\");\n}\n\nasync function parsePackageJson(cwd: string): Promise<string[]> {\n const content = await readFileOrNull(join(cwd, \"package.json\"));\n if (!content) return [];\n\n try {\n const pkg = JSON.parse(content);\n const names = new Set<string>();\n\n for (const key of Object.keys(pkg.dependencies || {})) {\n if (!isSkippedLocally(key)) names.add(key);\n }\n for (const key of Object.keys(pkg.devDependencies || {})) {\n if (!isSkippedLocally(key)) names.add(key);\n }\n\n return [...names];\n } catch {\n return [];\n }\n}\n\nasync function parseRequirementsTxt(cwd: string): Promise<string[]> {\n const content = await readFileOrNull(join(cwd, \"requirements.txt\"));\n if (!content) return [];\n\n const deps: string[] = [];\n for (const line of content.split(\"\\n\")) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith(\"#\") || trimmed.startsWith(\"-\")) continue;\n const name = trimmed.split(/[=<>!~;@\\s\\[]/)[0].trim();\n if (name && !isSkippedLocally(name)) {\n deps.push(name);\n }\n }\n return deps;\n}\n\nasync function parsePyprojectToml(cwd: string): Promise<string[]> {\n const content = await readFileOrNull(join(cwd, \"pyproject.toml\"));\n if (!content) return [];\n\n const deps: string[] = [];\n const seen = new Set<string>();\n\n const projectDepsMatch = content.match(/\\[project\\]\\s[\\s\\S]*?dependencies\\s*=\\s*\\[([\\s\\S]*?)\\]/);\n if (projectDepsMatch) {\n const entries = projectDepsMatch[1].match(/\"([^\"]+)\"/g) || [];\n for (const entry of entries) {\n const name = entry\n .replace(/\"/g, \"\")\n .split(/[=<>!~;@\\s\\[]/)[0]\n .trim();\n if (name && !isSkippedLocally(name) && !seen.has(name)) {\n seen.add(name);\n deps.push(name);\n }\n }\n }\n\n const poetryMatch = content.match(/\\[tool\\.poetry\\.dependencies\\]([\\s\\S]*?)(?:\\n\\[|$)/);\n if (poetryMatch) {\n const lines = poetryMatch[1].split(\"\\n\");\n for (const line of lines) {\n const match = line.match(/^(\\S+)\\s*=/);\n if (match) {\n const name = match[1].trim();\n if (name && !isSkippedLocally(name) && name !== \"python\" && !seen.has(name)) {\n seen.add(name);\n deps.push(name);\n }\n }\n }\n }\n\n return deps;\n}\n\nexport async function detectProjectDependencies(cwd: string): Promise<string[]> {\n const results = await Promise.all([\n parsePackageJson(cwd),\n parseRequirementsTxt(cwd),\n parsePyprojectToml(cwd),\n ]);\n\n return [...new Set(results.flat())];\n}\n","import { Command } from \"commander\";\nimport pc from \"picocolors\";\nimport ora from \"ora\";\nimport { mkdir, writeFile } from \"fs/promises\";\nimport { dirname, join } from \"path\";\nimport { randomBytes } from \"crypto\";\n\nimport { log } from \"../utils/logger.js\";\nimport { checkboxWithHover } from \"../utils/prompts.js\";\nimport { trackEvent } from \"../utils/tracking.js\";\nimport { getBaseUrl } from \"../utils/api.js\";\nimport { performLogin } from \"./auth.js\";\nimport { loadTokens, isTokenExpired } from \"../utils/auth.js\";\nimport {\n type SetupAgent,\n type AuthOptions,\n SETUP_AGENT_NAMES,\n AUTH_MODE_LABELS,\n ALL_AGENT_NAMES,\n getAgent,\n detectAgents,\n} from \"../setup/agents.js\";\nimport { RULE_CONTENT } from \"../setup/templates.js\";\nimport {\n readJsonConfig,\n mergeServerEntry,\n mergeInstructions,\n writeJsonConfig,\n} from \"../setup/mcp-writer.js\";\n\ntype Scope = \"global\" | \"project\";\n\ninterface SetupOptions {\n claude?: boolean;\n cursor?: boolean;\n opencode?: boolean;\n project?: boolean;\n yes?: boolean;\n apiKey?: string;\n oauth?: boolean;\n}\n\nconst CHECKBOX_THEME = {\n style: {\n highlight: (text: string) => pc.green(text),\n disabledChoice: (text: string) => ` ${pc.dim(\"◯\")} ${pc.dim(text)}`,\n },\n};\n\nfunction getSelectedAgents(options: SetupOptions): SetupAgent[] {\n const agents: SetupAgent[] = [];\n if (options.claude) agents.push(\"claude\");\n if (options.cursor) agents.push(\"cursor\");\n if (options.opencode) agents.push(\"opencode\");\n return agents;\n}\n\nexport function registerSetupCommand(program: Command): void {\n program\n .command(\"setup\")\n .description(\"Set up Context7 MCP and rule for your AI coding agent\")\n .option(\"--claude\", \"Set up for Claude Code\")\n .option(\"--cursor\", \"Set up for Cursor\")\n .option(\"--opencode\", \"Set up for OpenCode\")\n .option(\"-p, --project\", \"Configure for current project instead of globally\")\n .option(\"-y, --yes\", \"Skip confirmation prompts\")\n .option(\"--api-key <key>\", \"Use API key authentication\")\n .option(\"--oauth\", \"Use OAuth endpoint (IDE handles auth flow)\")\n .action(async (options: SetupOptions) => {\n await setupCommand(options);\n });\n}\n\nasync function authenticateAndGenerateKey(): Promise<string | null> {\n const existingTokens = loadTokens();\n const accessToken =\n existingTokens && !isTokenExpired(existingTokens)\n ? existingTokens.access_token\n : await performLogin();\n\n if (!accessToken) return null;\n\n const spinner = ora(\"Configuring authentication...\").start();\n\n try {\n const response = await fetch(`${getBaseUrl()}/api/dashboard/api-keys`, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${accessToken}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ name: `ctx7-cli-${randomBytes(3).toString(\"hex\")}` }),\n });\n\n if (!response.ok) {\n const err = (await response.json().catch(() => ({}))) as { message?: string; error?: string };\n spinner.fail(\"Authentication failed\");\n log.error(err.message || err.error || `HTTP ${response.status}`);\n return null;\n }\n\n const result = (await response.json()) as { data: { apiKey: string } };\n spinner.succeed(\"Authenticated\");\n return result.data.apiKey;\n } catch (err) {\n spinner.fail(\"Authentication failed\");\n log.error(err instanceof Error ? err.message : String(err));\n return null;\n }\n}\n\nasync function resolveAuth(options: SetupOptions): Promise<AuthOptions | null> {\n if (options.apiKey) return { mode: \"api-key\", apiKey: options.apiKey };\n if (options.oauth) return { mode: \"oauth\" };\n\n const apiKey = await authenticateAndGenerateKey();\n if (!apiKey) return null;\n return { mode: \"api-key\", apiKey };\n}\n\nasync function isAlreadyConfigured(agentName: SetupAgent, scope: Scope): Promise<boolean> {\n const agent = getAgent(agentName);\n const mcpPath =\n scope === \"global\" ? agent.mcp.globalPath : join(process.cwd(), agent.mcp.projectPath);\n try {\n const existing = await readJsonConfig(mcpPath);\n const section = (existing[agent.mcp.configKey] as Record<string, unknown> | undefined) ?? {};\n return \"context7\" in section;\n } catch {\n return false;\n }\n}\n\nasync function promptAgents(scope: Scope): Promise<SetupAgent[] | null> {\n const choices = await Promise.all(\n ALL_AGENT_NAMES.map(async (name) => {\n const configured = await isAlreadyConfigured(name, scope);\n return {\n name: SETUP_AGENT_NAMES[name],\n value: name,\n disabled: configured ? \"(already configured)\" : false,\n };\n })\n );\n\n if (choices.every((c) => c.disabled)) {\n log.info(\"Context7 is already configured for all detected agents.\");\n return null;\n }\n\n try {\n return await checkboxWithHover(\n {\n message: \"Which agents do you want to set up?\",\n choices,\n loop: false,\n theme: CHECKBOX_THEME,\n },\n { getName: (a: SetupAgent) => SETUP_AGENT_NAMES[a] }\n );\n } catch {\n return null;\n }\n}\n\nasync function resolveAgents(options: SetupOptions, scope: Scope): Promise<SetupAgent[]> {\n const explicit = getSelectedAgents(options);\n if (explicit.length > 0) return explicit;\n\n const detected = await detectAgents(scope);\n\n if (detected.length > 0 && options.yes) return detected;\n\n log.blank();\n const selected = await promptAgents(scope);\n if (!selected) {\n log.warn(\"Setup cancelled\");\n return [];\n }\n return selected;\n}\n\nasync function setupAgent(\n agentName: SetupAgent,\n auth: AuthOptions,\n scope: Scope\n): Promise<{\n agent: string;\n mcpStatus: string;\n mcpPath: string;\n ruleStatus: string;\n rulePath: string;\n}> {\n const agent = getAgent(agentName);\n\n const mcpPath =\n scope === \"global\" ? agent.mcp.globalPath : join(process.cwd(), agent.mcp.projectPath);\n\n let mcpStatus: string;\n try {\n const existing = await readJsonConfig(mcpPath);\n const { config, alreadyExists } = mergeServerEntry(\n existing,\n agent.mcp.configKey,\n \"context7\",\n agent.mcp.buildEntry(auth)\n );\n\n if (alreadyExists) {\n mcpStatus = \"already configured\";\n } else {\n mcpStatus = `configured with ${AUTH_MODE_LABELS[auth.mode]}`;\n }\n\n const finalConfig = agent.rule.instructionsGlob\n ? mergeInstructions(config, agent.rule.instructionsGlob(scope))\n : config;\n\n if (finalConfig !== existing) {\n await writeJsonConfig(mcpPath, finalConfig);\n }\n } catch (err) {\n mcpStatus = `failed: ${err instanceof Error ? err.message : String(err)}`;\n }\n\n const rulePath =\n scope === \"global\"\n ? join(agent.rule.dir(\"global\"), agent.rule.filename)\n : join(process.cwd(), agent.rule.dir(\"project\"), agent.rule.filename);\n\n let ruleStatus: string;\n try {\n await mkdir(dirname(rulePath), { recursive: true });\n await writeFile(rulePath, RULE_CONTENT, \"utf-8\");\n ruleStatus = \"installed\";\n } catch (err) {\n ruleStatus = `failed: ${err instanceof Error ? err.message : String(err)}`;\n }\n\n return { agent: agent.displayName, mcpStatus, mcpPath, ruleStatus, rulePath };\n}\n\nasync function setupCommand(options: SetupOptions): Promise<void> {\n trackEvent(\"command\", { name: \"setup\" });\n\n const scope: Scope = options.project ? \"project\" : \"global\";\n const agents = await resolveAgents(options, scope);\n if (agents.length === 0) return;\n\n const auth = await resolveAuth(options);\n if (!auth) {\n log.warn(\"Setup cancelled\");\n return;\n }\n\n log.blank();\n const spinner = ora(\"Setting up Context7...\").start();\n\n const results = [];\n for (const agentName of agents) {\n spinner.text = `Setting up ${getAgent(agentName).displayName}...`;\n results.push(await setupAgent(agentName, auth, scope));\n }\n\n spinner.succeed(\"Context7 setup complete\");\n\n log.blank();\n for (const r of results) {\n log.plain(` ${pc.bold(r.agent)}`);\n const mcpIcon = r.mcpStatus.startsWith(\"configured\") ? pc.green(\"+\") : pc.dim(\"~\");\n log.plain(` ${mcpIcon} MCP server ${r.mcpStatus}`);\n log.plain(` ${pc.dim(r.mcpPath)}`);\n const ruleIcon = r.ruleStatus === \"installed\" ? pc.green(\"+\") : pc.dim(\"~\");\n log.plain(` ${ruleIcon} Rule ${r.ruleStatus}`);\n log.plain(` ${pc.dim(r.rulePath)}`);\n }\n log.blank();\n\n trackEvent(\"setup\", { agents, scope, authMode: auth.mode });\n}\n","import { access } from \"fs/promises\";\nimport { join } from \"path\";\nimport { homedir } from \"os\";\n\nexport type SetupAgent = \"claude\" | \"cursor\" | \"opencode\";\nexport type AuthMode = \"oauth\" | \"api-key\";\n\nexport interface AuthOptions {\n mode: AuthMode;\n apiKey?: string;\n}\n\nexport const SETUP_AGENT_NAMES: Record<SetupAgent, string> = {\n claude: \"Claude Code\",\n cursor: \"Cursor\",\n opencode: \"OpenCode\",\n};\n\nexport const AUTH_MODE_LABELS: Record<AuthMode, string> = {\n oauth: \"OAuth\",\n \"api-key\": \"API Key\",\n};\n\nconst MCP_BASE_URL = \"https://mcp.context7.com\";\n\nexport interface AgentConfig {\n name: SetupAgent;\n displayName: string;\n mcp: {\n projectPath: string;\n globalPath: string;\n configKey: string;\n buildEntry: (auth: AuthOptions) => Record<string, unknown>;\n };\n rule: {\n dir: (scope: \"project\" | \"global\") => string;\n filename: string;\n /** When set, the rule path is registered in the agent's config `instructions` array */\n instructionsGlob?: (scope: \"project\" | \"global\") => string;\n };\n detect: {\n projectPaths: string[];\n globalPaths: string[];\n };\n}\n\nfunction mcpUrl(auth: AuthOptions): string {\n return auth.mode === \"oauth\" ? `${MCP_BASE_URL}/mcp/oauth` : `${MCP_BASE_URL}/mcp`;\n}\n\nfunction withHeaders(base: Record<string, unknown>, auth: AuthOptions): Record<string, unknown> {\n if (auth.mode === \"api-key\" && auth.apiKey) {\n return { ...base, headers: { CONTEXT7_API_KEY: auth.apiKey } };\n }\n return base;\n}\n\nconst agents: Record<SetupAgent, AgentConfig> = {\n claude: {\n name: \"claude\",\n displayName: \"Claude Code\",\n mcp: {\n projectPath: \".mcp.json\",\n globalPath: join(homedir(), \".claude.json\"),\n configKey: \"mcpServers\",\n buildEntry: (auth) => withHeaders({ type: \"http\", url: mcpUrl(auth) }, auth),\n },\n rule: {\n dir: (scope) =>\n scope === \"global\" ? join(homedir(), \".claude\", \"rules\") : join(\".claude\", \"rules\"),\n filename: \"context7.md\",\n },\n detect: {\n projectPaths: [\".mcp.json\", \".claude\"],\n globalPaths: [join(homedir(), \".claude\")],\n },\n },\n\n cursor: {\n name: \"cursor\",\n displayName: \"Cursor\",\n mcp: {\n projectPath: join(\".cursor\", \"mcp.json\"),\n globalPath: join(homedir(), \".cursor\", \"mcp.json\"),\n configKey: \"mcpServers\",\n buildEntry: (auth) => withHeaders({ url: mcpUrl(auth) }, auth),\n },\n rule: {\n dir: (scope) =>\n scope === \"global\" ? join(homedir(), \".cursor\", \"rules\") : join(\".cursor\", \"rules\"),\n filename: \"context7.mdc\",\n },\n detect: {\n projectPaths: [\".cursor\"],\n globalPaths: [join(homedir(), \".cursor\")],\n },\n },\n\n opencode: {\n name: \"opencode\",\n displayName: \"OpenCode\",\n mcp: {\n projectPath: \".opencode.json\",\n globalPath: join(homedir(), \".config\", \"opencode\", \"opencode.json\"),\n configKey: \"mcp\",\n buildEntry: (auth) => withHeaders({ type: \"remote\", url: mcpUrl(auth), enabled: true }, auth),\n },\n rule: {\n dir: (scope) =>\n scope === \"global\"\n ? join(homedir(), \".config\", \"opencode\", \"rules\")\n : join(\".opencode\", \"rules\"),\n filename: \"context7.md\",\n instructionsGlob: (scope) =>\n scope === \"global\"\n ? join(homedir(), \".config\", \"opencode\", \"rules\", \"*.md\")\n : \".opencode/rules/*.md\",\n },\n detect: {\n projectPaths: [\".opencode.json\"],\n globalPaths: [join(homedir(), \".config\", \"opencode\")],\n },\n },\n};\n\nexport function getAgent(name: SetupAgent): AgentConfig {\n return agents[name];\n}\n\nexport const ALL_AGENT_NAMES: SetupAgent[] = Object.keys(agents) as SetupAgent[];\n\nasync function pathExists(p: string): Promise<boolean> {\n try {\n await access(p);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function detectAgents(scope: \"project\" | \"global\"): Promise<SetupAgent[]> {\n const detected: SetupAgent[] = [];\n\n for (const agent of Object.values(agents)) {\n const paths = scope === \"global\" ? agent.detect.globalPaths : agent.detect.projectPaths;\n for (const p of paths) {\n const fullPath = scope === \"global\" ? p : join(process.cwd(), p);\n if (await pathExists(fullPath)) {\n detected.push(agent.name);\n break;\n }\n }\n }\n\n return detected;\n}\n","export const RULE_CONTENT = `---\nalwaysApply: true\n---\n\nWhen working with libraries, frameworks, or APIs — use Context7 MCP to fetch current documentation instead of relying on training data. This includes setup questions, code generation, API references, and anything involving specific packages.\n\n## Steps\n\n1. Call \\`resolve-library-id\\` with the library name and the user's question\n2. Pick the best match — prefer exact names and version-specific IDs when a version is mentioned\n3. Call \\`query-docs\\` with the selected library ID and the user's question\n4. Answer using the fetched docs — include code examples and cite the version\n`;\n","import { readFile, writeFile, mkdir } from \"fs/promises\";\nimport { dirname } from \"path\";\n\nexport async function readJsonConfig(filePath: string): Promise<Record<string, unknown>> {\n let raw: string;\n try {\n raw = await readFile(filePath, \"utf-8\");\n } catch {\n return {};\n }\n\n raw = raw.trim();\n if (!raw) return {};\n\n return JSON.parse(raw) as Record<string, unknown>;\n}\n\nexport function mergeServerEntry(\n existing: Record<string, unknown>,\n configKey: string,\n serverName: string,\n entry: Record<string, unknown>\n): { config: Record<string, unknown>; alreadyExists: boolean } {\n const section = (existing[configKey] as Record<string, unknown> | undefined) ?? {};\n\n if (serverName in section) {\n return { config: existing, alreadyExists: true };\n }\n\n return {\n config: {\n ...existing,\n [configKey]: {\n ...section,\n [serverName]: entry,\n },\n },\n alreadyExists: false,\n };\n}\n\nexport function mergeInstructions(\n config: Record<string, unknown>,\n glob: string\n): Record<string, unknown> {\n const instructions = (config.instructions as string[] | undefined) ?? [];\n if (instructions.includes(glob)) return config;\n return { ...config, instructions: [...instructions, glob] };\n}\n\nexport async function writeJsonConfig(\n filePath: string,\n config: Record<string, unknown>\n): Promise<void> {\n await mkdir(dirname(filePath), { recursive: true });\n await writeFile(filePath, JSON.stringify(config, null, 2) + \"\\n\", \"utf-8\");\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","ora","rm","join","input","path","branch","pathParts","path","input","pc","pc","ides","scope","pc","join","pc","ora","mkdir","writeFile","join","homedir","select","baseUrl","pc","baseUrl","program","pc","pc","ora","pc","join","homedir","mkdir","writeFile","select","homedir","readFile","join","path","pkg","pc","program","input","ora","join","homedir","path","rm","pc","ora","mkdir","writeFile","dirname","join","randomBytes","access","join","homedir","readFile","writeFile","mkdir","dirname","pc","agents","program","ora","randomBytes","join","mkdir","dirname","writeFile","readFileSync","dirname","join","pc"]}
|