ctx7 0.4.1 → 0.4.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +266 -129
- package/dist/index.js.map +1 -1
- package/package.json +2 -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/constants.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/commands/remove.ts","../src/commands/docs.ts","../src/commands/upgrade.ts","../src/utils/update-check.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 { registerRemoveCommand } from \"./commands/remove.js\";\nimport { registerDocsCommands } from \"./commands/docs.js\";\nimport { maybeShowUpgradeNotice, registerUpgradeCommand } from \"./commands/upgrade.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 .hook(\"preAction\", async (_thisCommand, actionCommand) => {\n await maybeShowUpgradeNotice({\n actionName: actionCommand.name(),\n argv: process.argv,\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\n ${brand.dim(\"# Remove Context7 setup\")}\n ${brand.primary(\"npx ctx7 remove --cursor\")}\n ${brand.primary(\"npx ctx7 remove --cursor --all\")}\n ${brand.primary(\"npx ctx7 remove --cursor --cli\")}\n ${brand.primary(\"npx ctx7 remove --claude --mcp\")}\n\n ${brand.dim(\"# Query library documentation\")}\n ${brand.primary('npx ctx7 library react \"how to use hooks\"')}\n ${brand.primary('npx ctx7 docs /facebook/react \"useEffect examples\"')}\n\nVisit ${brand.primary(\"https://context7.com\")} to browse skills\n`\n );\n\nregisterSkillCommands(program);\nregisterSkillAliases(program);\nregisterAuthCommands(program);\nregisterSetupCommand(program);\nregisterRemoveCommand(program);\nregisterDocsCommands(program);\nregisterUpgradeCommand(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\nawait program.parseAsync();\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 formatPopularity,\n formatTrust,\n formatInstallRange,\n getTrustLabel,\n} from \"../utils/prompts.js\";\nimport { installSkillFiles, symlinkSkill } from \"../utils/installer.js\";\nimport { listSkillsFromGitHub, getSkillFromGitHub } from \"../utils/github.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(\"--all-agents\", \"Install to all supported agent locations\")\n .option(\"-y, --yes\", \"Skip confirmation prompts\")\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(\"--all-agents\", \"Install to all supported agent locations\")\n .option(\"-y, --yes\", \"Skip confirmation prompts\")\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 return;\n }\n\n spinner.text = `Fetching skill from GitHub: ${skillName}...`;\n const ghResult = await getSkillFromGitHub(repo, skillName);\n if (ghResult.status === \"repo_not_found\") {\n spinner.fail(pc.red(`Repository not found: ${repo}`));\n return;\n }\n if (ghResult.status !== \"ok\" || !ghResult.skill) {\n spinner.fail(pc.red(`Skill not found: ${skillName}`));\n return;\n }\n\n spinner.succeed(`Found skill: ${skillName}`);\n selectedSkills = [ghResult.skill];\n } else {\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 }\n } else {\n // Fetch all skills when no specific names provided\n let data = await listProjectSkills(repo);\n\n if ((data.error || !data.skills || data.skills.length === 0) && !data.blockedSkillsCount) {\n spinner.text = `Fetching skills from GitHub...`;\n const ghResult = await listSkillsFromGitHub(repo);\n if (ghResult.status === \"repo_not_found\") {\n spinner.fail(pc.red(`Repository not found: ${repo}`));\n return;\n }\n if (ghResult.status === \"ok\" && ghResult.skills.length > 0) {\n data = { project: repo, skills: ghResult.skills };\n }\n }\n\n if (data.error && (!data.skills || data.skills.length === 0)) {\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 popularityColWidth = 13;\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 popularity = formatPopularity(s.installCount) + \" \".repeat(popularityColWidth - 4);\n const trust = formatTrust(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(\"Installs:\")} ${pc.white(formatInstallRange(s.installCount))}`,\n `${pc.yellow(\"Trust:\")} ${s.trustScore !== undefined && s.trustScore >= 0 ? pc.white(s.trustScore.toFixed(1)) : pc.dim(\"-\")}`,\n `${pc.yellow(\"Description:\")}`,\n pc.white(s.description || \"No description\"),\n ];\n\n return {\n name: `${indexStr} ${paddedName} ${popularity}${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(\"Popularity\".padEnd(popularityColWidth)) + pc.dim(\"Trust\");\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 nameWithRepo = (s: SkillSearchResult) => `${s.name} ${pc.dim(`(${s.project})`)}`;\n const nameWithRepoLen = (s: SkillSearchResult) => `${s.name} (${s.project})`.length;\n const maxNameLen = Math.max(...data.results.map(nameWithRepoLen));\n const popularityColWidth = 13;\n const choices = data.results.map((s, index) => {\n const indexStr = pc.dim(`${(index + 1).toString().padStart(indexWidth)}.`);\n const rawLen = nameWithRepoLen(s);\n const displayName = nameWithRepo(s) + \" \".repeat(maxNameLen - rawLen);\n const popularity = formatPopularity(s.installCount) + \" \".repeat(popularityColWidth - 4);\n const trust = formatTrust(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(\"Installs:\")} ${pc.white(formatInstallRange(s.installCount))}`,\n `${pc.yellow(\"Trust:\")} ${s.trustScore !== undefined && s.trustScore >= 0 ? pc.white(s.trustScore.toFixed(1)) : pc.dim(\"-\")}`,\n `${pc.yellow(\"Description:\")}`,\n pc.white(s.description || \"No description\"),\n ];\n\n return {\n name: `${indexStr} ${displayName} ${popularity}${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 = headerPad + pc.dim(\"Popularity\".padEnd(popularityColWidth)) + pc.dim(\"Trust\");\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 nameWithRepo = (s: SkillSearchResult) => `${s.name} ${pc.dim(`(${s.project})`)}`;\n const nameWithRepoLen = (s: SkillSearchResult) => `${s.name} (${s.project})`.length;\n const maxNameLen = Math.max(...skills.map(nameWithRepoLen));\n const popularityColWidth = 13;\n const trustColWidth = 8;\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 rawLen = nameWithRepoLen(s);\n const displayName = nameWithRepo(s) + \" \".repeat(maxNameLen - rawLen);\n const popularity = formatPopularity(s.installCount) + \" \".repeat(popularityColWidth - 4);\n const trustLabel = getTrustLabel(s.trustScore);\n const trust = formatTrust(s.trustScore) + \" \".repeat(trustColWidth - trustLabel.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(\"Installs:\")} ${pc.white(formatInstallRange(s.installCount))}`,\n `${pc.yellow(\"Trust:\")} ${s.trustScore !== undefined && s.trustScore >= 0 ? pc.white(s.trustScore.toFixed(1)) : pc.dim(\"-\")}`,\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} ${displayName} ${popularity}${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(\"Popularity\".padEnd(popularityColWidth)) +\n pc.dim(\"Trust\".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 { execSync } from \"node:child_process\";\nimport 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\nfunction getGitHubToken(): string | undefined {\n const envToken = process.env.GITHUB_TOKEN || process.env.GH_TOKEN;\n if (envToken) return envToken;\n try {\n return execSync(\"gh auth token\", { stdio: [\"pipe\", \"pipe\", \"ignore\"] })\n .toString()\n .trim();\n } catch {\n return undefined;\n }\n}\n\nfunction parseSkillFrontmatter(content: string): { name: string; description: string } | null {\n const frontmatterMatch = content.match(/^---\\s*\\n([\\s\\S]*?)\\n---/);\n if (!frontmatterMatch) return null;\n\n const frontmatter = frontmatterMatch[1];\n\n const nameMatch = frontmatter.match(/^name:\\s*(.+)$/m);\n if (!nameMatch) return null;\n const name = nameMatch[1]\n .trim()\n .replace(/^[\"']|[\"']$/g, \"\")\n .toLowerCase();\n\n let description = \"\";\n const multiLineMatch = frontmatter.match(/^description:\\s*([|>])-?\\s*$/m);\n\n if (multiLineMatch) {\n const descLineIndex = frontmatter.indexOf(\"description:\");\n const lines = frontmatter.slice(descLineIndex).split(\"\\n\").slice(1);\n const indentedLines: string[] = [];\n for (const line of lines) {\n if (line.trim() === \"\") {\n indentedLines.push(\"\");\n continue;\n }\n if (/^\\s+/.test(line)) {\n indentedLines.push(line);\n } else {\n break;\n }\n }\n const firstNonEmpty = indentedLines.find((l) => l.trim().length > 0);\n const indent = firstNonEmpty?.match(/^(\\s+)/)?.[1].length ?? 0;\n description = indentedLines\n .map((line) => line.slice(indent))\n .join(\" \")\n .replace(/\\s+/g, \" \")\n .trim();\n } else {\n const singleMatch = frontmatter.match(/^description:\\s*(.+)$/m);\n if (singleMatch) {\n const value = singleMatch[1].trim();\n if (![\"|\", \">\", \"|-\", \">-\"].includes(value)) {\n description = value.replace(/^[\"']|[\"']$/g, \"\");\n }\n }\n }\n\n if (!description) return null;\n return { name, description };\n}\n\nfunction getGitHubHeaders(): Record<string, string> {\n const ghToken = getGitHubToken();\n return {\n Accept: \"application/vnd.github.v3+json\",\n \"User-Agent\": \"context7-cli\",\n ...(ghToken && { Authorization: `token ${ghToken}` }),\n };\n}\n\nasync function fetchRepoTree(\n owner: string,\n repo: string,\n branch: string,\n headers: Record<string, string>\n): Promise<GitHubTreeResponse | null> {\n const treeUrl = `${GITHUB_API}/repos/${owner}/${repo}/git/trees/${branch}?recursive=1`;\n const response = await fetch(treeUrl, { headers });\n if (!response.ok) return null;\n return (await response.json()) as GitHubTreeResponse;\n}\n\nasync function fetchDefaultBranch(\n owner: string,\n repo: string,\n headers: Record<string, string>\n): Promise<{ branch: string } | { status: number }> {\n const response = await fetch(`${GITHUB_API}/repos/${owner}/${repo}`, { headers });\n if (!response.ok) return { status: response.status };\n const data = (await response.json()) as { default_branch: string };\n return { branch: data.default_branch };\n}\n\ntype GitHubSkillsResult =\n | { status: \"ok\"; skills: (Skill & { project: string })[] }\n | { status: \"repo_not_found\" }\n | { status: \"error\"; error: string };\n\nexport async function listSkillsFromGitHub(project: string): Promise<GitHubSkillsResult> {\n try {\n const parts = project.split(\"/\").filter(Boolean);\n if (parts.length < 2) return { status: \"error\", error: \"Invalid project format\" };\n const [owner, repo] = parts;\n\n const headers = getGitHubHeaders();\n const branchResult = await fetchDefaultBranch(owner, repo, headers);\n if (\"status\" in branchResult) return { status: \"repo_not_found\" };\n\n const treeData = await fetchRepoTree(owner, repo, branchResult.branch, headers);\n if (!treeData) return { status: \"error\", error: \"Could not fetch repository tree\" };\n\n const skillMdFiles = treeData.tree.filter(\n (item) => item.type === \"blob\" && item.path.toLowerCase().endsWith(\"skill.md\")\n );\n\n const skills: (Skill & { project: string })[] = [];\n for (const item of skillMdFiles) {\n const rawUrl = `${GITHUB_RAW}/${owner}/${repo}/${branchResult.branch}/${item.path}`;\n const response = await fetch(rawUrl, { headers });\n if (!response.ok) continue;\n\n const content = await response.text();\n const meta = parseSkillFrontmatter(content);\n if (!meta) continue;\n\n const skillDir = item.path.split(\"/\").slice(0, -1).join(\"/\");\n skills.push({\n name: meta.name,\n description: meta.description,\n url: `https://github.com/${owner}/${repo}/tree/${branchResult.branch}/${skillDir}`,\n project,\n });\n }\n\n return { status: \"ok\", skills };\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n return { status: \"error\", error: message };\n }\n}\n\nexport async function getSkillFromGitHub(\n project: string,\n skillName: string\n): Promise<GitHubSkillsResult & { skill?: Skill & { project: string } }> {\n const result = await listSkillsFromGitHub(project);\n if (result.status !== \"ok\") return result;\n const skill = result.skills.find((s) => s.name === skillName.toLowerCase());\n return { ...result, skill };\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 ghHeaders = getGitHubHeaders();\n\n const treeData = await fetchRepoTree(owner, repo, branch, ghHeaders);\n if (!treeData) {\n return { files: [], error: `GitHub API error` };\n }\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, { headers: ghHeaders });\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 // Reject paths that attempt directory traversal\n if (relativePath.includes(\"..\")) {\n console.warn(`Skipping file with unsafe path: ${item.path}`);\n continue;\n }\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 { 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;\nexport const CLI_CLIENT_ID = \"2veBSofhicRBguUT\";\n","import type {\n ListSkillsResponse,\n SingleSkillResponse,\n SearchResponse,\n SuggestResponse,\n DownloadResponse,\n LibrarySearchResponse,\n SkillQuestionsResponse,\n StructuredGenerateInput,\n GenerateStreamEvent,\n SkillQuotaResponse,\n ContextResponse,\n} from \"../types.js\";\nimport { downloadSkillFromGitHub, getSkillFromGitHub } from \"./github.js\";\nimport { VERSION } from \"../constants.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 // handle private repo skills with env var\n const ghResult = await getSkillFromGitHub(project, skillName);\n if (ghResult.status !== \"ok\" || !ghResult.skill) {\n return {\n skill: { name: skillName, description: \"\", url: \"\", project },\n files: [],\n error: skillData.message || skillData.error,\n };\n }\n\n const { files, error } = await downloadSkillFromGitHub(ghResult.skill);\n if (error) {\n return { skill: ghResult.skill, files: [], error };\n }\n return { skill: ghResult.skill, files };\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\nfunction getAuthHeaders(accessToken?: string): Record<string, string> {\n const headers: Record<string, string> = {\n \"X-Context7-Source\": \"cli\",\n \"X-Context7-Client-IDE\": \"ctx7-cli\",\n \"X-Context7-Client-Version\": VERSION,\n \"X-Context7-Transport\": \"cli\",\n };\n const apiKey = process.env.CONTEXT7_API_KEY;\n if (apiKey) {\n headers[\"Authorization\"] = `Bearer ${apiKey}`;\n } else if (accessToken) {\n headers[\"Authorization\"] = `Bearer ${accessToken}`;\n }\n return headers;\n}\n\nexport async function resolveLibrary(\n libraryName: string,\n query?: string,\n accessToken?: string\n): Promise<LibrarySearchResponse> {\n const params = new URLSearchParams({ libraryName });\n if (query) {\n params.set(\"query\", query);\n }\n\n const response = await fetch(`${baseUrl}/api/v2/libs/search?${params}`, {\n headers: getAuthHeaders(accessToken),\n });\n\n if (!response.ok) {\n const errorData = (await response.json().catch(() => ({}))) as {\n error?: string;\n message?: string;\n };\n return {\n results: [],\n error: errorData.error || `HTTP error ${response.status}`,\n message: errorData.message,\n };\n }\n\n return (await response.json()) as LibrarySearchResponse;\n}\n\nexport interface GetContextOptions {\n type?: \"json\" | \"txt\";\n}\n\nexport async function getLibraryContext(\n libraryId: string,\n query: string,\n options?: GetContextOptions,\n accessToken?: string\n): Promise<ContextResponse | string> {\n const params = new URLSearchParams({ libraryId, query });\n if (options?.type) {\n params.set(\"type\", options.type);\n }\n const headers = getAuthHeaders(accessToken);\n const response = await fetch(`${baseUrl}/api/v2/context?${params}`, {\n headers,\n });\n\n if (!response.ok) {\n const errorData = (await response.json().catch(() => ({}))) as {\n error?: string;\n message?: string;\n redirectUrl?: string;\n };\n\n if (response.status === 301 && errorData.redirectUrl) {\n return {\n codeSnippets: [],\n infoSnippets: [],\n error: errorData.error || \"library_redirected\",\n message: errorData.message,\n redirectUrl: errorData.redirectUrl,\n };\n }\n\n return {\n codeSnippets: [],\n infoSnippets: [],\n error: errorData.error || `HTTP error ${response.status}`,\n message: errorData.message,\n };\n }\n\n if (options?.type === \"txt\") {\n return await response.text();\n }\n\n return (await response.json()) as ContextResponse;\n}\n","import pc from \"picocolors\";\n\nconst ANSI_PATTERN = /\\x1B(?:[@-Z\\\\-_]|\\[[0-?]*[ -/]*[@-~])/g;\n\nfunction visibleLength(text: string): number {\n return text.replace(ANSI_PATTERN, \"\").length;\n}\n\nfunction padVisible(text: string, width: number): string {\n const padding = Math.max(0, width - visibleLength(text));\n return text + \" \".repeat(padding);\n}\n\nexport function box(lines: string[], color: (message: string) => string = pc.green): void {\n const contentWidth = Math.max(...lines.map((line) => visibleLength(line)), 0);\n const top = color(`┌${\"─\".repeat(contentWidth + 2)}┐`);\n const bottom = color(`└${\"─\".repeat(contentWidth + 2)}┘`);\n\n console.log(top);\n for (const line of lines) {\n console.log(color(\"│ \") + padVisible(line, contentWidth) + color(\" │\"));\n }\n console.log(bottom);\n}\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 box,\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 if (options.allAgents) {\n return [\"universal\", ...VENDOR_SPECIFIC_AGENTS];\n }\n\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 !!(\n options.allAgents ||\n options.claude ||\n options.cursor ||\n options.universal ||\n options.antigravity\n );\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(\n options: AddOptions,\n forceUniversal = true\n): 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 if (options.yes) {\n confirmed = true;\n } else {\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\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 {\n name: `${IDE_NAMES[\"claude\"]} ${pc.dim(`(${pathMap[\"claude\"]})`)}`,\n value: \"claude\" as IDE,\n checked: false,\n },\n { name: universalLabel, value: \"universal\", checked: false },\n ];\n\n for (const ide of VENDOR_SPECIFIC_AGENTS.filter((ide) => ide !== \"claude\")) {\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 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 const ides: IDE[] = forceUniversal\n ? [\"universal\", ...selectedIdes.filter((ide) => ide !== \"universal\")]\n : selectedIdes;\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 }[] = [\n { name: `${IDE_NAMES[\"claude\"]} ${pc.dim(`(${IDE_PATHS[\"claude\"]})`)}`, value: \"claude\" },\n { name: universalLabel, value: \"universal\" },\n ];\n\n for (const ide of VENDOR_SPECIFIC_AGENTS.filter((ide) => ide !== \"claude\")) {\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 into a popularity star rating (4 stars).\n * 0/unknown → ☆☆☆☆, <100 → ★☆☆☆, <500 → ★★☆☆, <1000 → ★★★☆, 1000+ → ★★★★\n */\nexport function formatPopularity(count: number | undefined): string {\n const filled = \"★\";\n const empty = \"☆\";\n const max = 4;\n let stars: number;\n if (count === undefined || count === 0) stars = 0;\n else if (count < 100) stars = 1;\n else if (count < 500) stars = 2;\n else if (count < 1000) stars = 3;\n else stars = 4;\n\n const filledPart = filled.repeat(stars);\n const emptyPart = empty.repeat(max - stars);\n if (stars === 0) return pc.dim(emptyPart);\n return pc.yellow(filledPart) + pc.dim(emptyPart);\n}\n\n/**\n * Returns the install count as a human-readable range string.\n */\nexport function formatInstallRange(count: number | undefined): string {\n if (count === undefined || count === 0) return \"Unknown\";\n if (count < 100) return \"<100\";\n if (count < 500) return \"<500\";\n if (count < 1000) return \"<1,000\";\n return \"1,000+\";\n}\n\n/**\n * Formats trust score as High / Medium / Low label.\n * Uses MCP reputation thresholds: >=7 High, >=4 Medium, <4 Low.\n */\nexport function formatTrust(score: number | undefined): string {\n if (score === undefined || score < 0) return pc.dim(\"-\");\n if (score >= 7) return pc.green(\"High\");\n if (score >= 4) return pc.yellow(\"Medium\");\n return pc.red(\"Low\");\n}\n\n/**\n * Returns the raw trust label string (uncolored) for width calculations.\n */\nexport function getTrustLabel(score: number | undefined): string {\n if (score === undefined || score < 0) return \"-\";\n if (score >= 7) return \"High\";\n if (score >= 4) return \"Medium\";\n return \"Low\";\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 = choices.findIndex((c) => !c.disabled);\n if (cursorPosition < 0) 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\") {\n let next = cursorPosition - 1;\n while (next >= 0 && choices[next].disabled) next--;\n if (next >= 0) cursorPosition = next;\n } else if (key.name === \"down\") {\n let next = cursorPosition + 1;\n while (next < totalItems && choices[next].disabled) next++;\n if (next < totalItems) cursorPosition = next;\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 answer: (text: string) => pc.green(text),\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}\n\nexport interface LibrarySearchResponse {\n results: LibrarySearchResult[];\n searchFilterApplied?: boolean;\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 allAgents?: boolean;\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; yes?: 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: \".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 = \".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\nexport interface CodeExample {\n language: string;\n code: string;\n}\n\nexport interface CodeSnippet {\n codeTitle: string;\n codeDescription: string;\n codeLanguage: string;\n codeTokens: number;\n codeId: string;\n pageTitle: string;\n codeList: CodeExample[];\n}\n\nexport interface InfoSnippet {\n pageId?: string;\n breadcrumb?: string;\n content: string;\n contentTokens: number;\n}\n\nexport interface ContextResponse {\n codeSnippets: CodeSnippet[];\n infoSnippets: InfoSnippet[];\n error?: string;\n message?: string;\n redirectUrl?: string;\n}\n","import { mkdir, writeFile, rm, symlink, lstat } from \"fs/promises\";\nimport { join, resolve, dirname } 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 = resolve(targetDir, skillName);\n\n for (const file of files) {\n const filePath = resolve(skillDir, file.path);\n\n // Prevent directory traversal — resolved path must stay within skillDir\n if (\n !filePath.startsWith(skillDir + \"/\") &&\n !filePath.startsWith(skillDir + \"\\\\\") &&\n filePath !== skillDir\n ) {\n throw new Error(`Skill file path \"${file.path}\" resolves outside the target directory`);\n }\n\n const fileDir = dirname(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 if (searchResult.searchFilterApplied) {\n log.warn(\n \"Your results only include libraries matching your teamspace's library filters. To adjust quality thresholds or blocked libraries, update your filters at https://context7.com/dashboard?tab=policies\"\n );\n log.blank();\n }\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 });\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\";\nimport { CLI_CLIENT_ID } from \"../constants.js\";\nimport { getBaseUrl } from \"./api.js\";\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\nasync function refreshAccessToken(refreshToken: string): Promise<TokenData> {\n const response = await fetch(`${getBaseUrl()}/api/oauth/token`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/x-www-form-urlencoded\" },\n body: new URLSearchParams({\n grant_type: \"refresh_token\",\n client_id: CLI_CLIENT_ID,\n refresh_token: refreshToken,\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 refresh token\");\n }\n\n return (await response.json()) as TokenData;\n}\n\n/**\n * Returns a valid access token, refreshing if expired.\n * Returns null if no tokens exist or refresh fails.\n */\nexport async function getValidAccessToken(): Promise<string | null> {\n const tokens = loadTokens();\n if (!tokens) return null;\n\n if (!isTokenExpired(tokens)) {\n return tokens.access_token;\n }\n\n if (!tokens.refresh_token) {\n return null;\n }\n\n try {\n const newTokens = await refreshAccessToken(tokens.refresh_token);\n saveTokens(newTokens);\n return newTokens.access_token;\n } catch {\n return null;\n }\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 clearTokens,\n buildAuthorizationUrl,\n getValidAccessToken,\n} from \"../utils/auth.js\";\n\nimport { trackEvent } from \"../utils/tracking.js\";\nimport { CLI_CLIENT_ID } from \"../constants.js\";\nimport { getBaseUrl } from \"../utils/api.js\";\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 existingToken = await getValidAccessToken();\n if (existingToken) {\n console.log(pc.yellow(\"You are already logged in.\"));\n console.log(pc.dim(\"Run 'ctx7 logout' first if you want to log in with a different account.\"));\n return;\n }\n clearTokens();\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 accessToken = await getValidAccessToken();\n\n if (!accessToken) {\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 whoami = await fetchWhoami(accessToken);\n if (whoami.name) {\n console.log(`${pc.dim(\"Name:\".padEnd(13))}${whoami.name}`);\n }\n if (whoami.email) {\n console.log(`${pc.dim(\"Email:\".padEnd(13))}${whoami.email}`);\n }\n if (whoami.teamspace) {\n console.log(`${pc.dim(\"Teamspace:\".padEnd(13))}${whoami.teamspace.name}`);\n }\n } catch {\n console.log(pc.dim(\"(Session may be expired - run 'ctx7 login' to refresh)\"));\n }\n}\n\ninterface WhoamiResponse {\n success: boolean;\n name: string | null;\n email: string | null;\n teamspace: { id: string; name: string } | null;\n}\n\nasync function fetchWhoami(accessToken: string): Promise<WhoamiResponse> {\n const response = await fetch(`${getBaseUrl()}/api/dashboard/whoami`, {\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 WhoamiResponse;\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 { select } from \"@inquirer/prompts\";\nimport { mkdir, readFile, 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, downloadSkill } from \"../utils/api.js\";\nimport { installSkillFiles } from \"../utils/installer.js\";\nimport { performLogin } from \"./auth.js\";\nimport { saveTokens, getValidAccessToken } 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 { customizeSkillFilesForAgent, getRuleContent } from \"../setup/templates.js\";\nimport {\n readJsonConfig,\n mergeServerEntry,\n writeJsonConfig,\n resolveMcpPath,\n appendTomlServer,\n} from \"../setup/mcp-writer.js\";\n\ntype Scope = \"global\" | \"project\";\ntype SetupMode = \"mcp\" | \"cli\";\n\ninterface SetupOptions {\n claude?: boolean;\n cursor?: boolean;\n universal?: boolean;\n antigravity?: boolean;\n opencode?: boolean;\n codex?: boolean;\n gemini?: boolean;\n project?: boolean;\n yes?: boolean;\n apiKey?: string;\n oauth?: boolean;\n cli?: boolean;\n mcp?: 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 if (options.codex) agents.push(\"codex\");\n if (options.gemini) agents.push(\"gemini\");\n return agents;\n}\n\nexport function registerSetupCommand(program: Command): void {\n program\n .command(\"setup\")\n .description(\"Set up Context7 for your AI coding agent\")\n .option(\"--claude\", \"Set up for Claude Code\")\n .option(\"--cursor\", \"Set up for Cursor\")\n .option(\"--universal\", \"Set up for Universal (.agents/skills)\")\n .option(\"--antigravity\", \"Set up for Antigravity (.agent/skills)\")\n .option(\"--opencode\", \"Set up for OpenCode\")\n .option(\"--codex\", \"Set up for Codex\")\n .option(\"--gemini\", \"Set up for Gemini CLI\")\n .option(\"--mcp\", \"Set up MCP server mode\")\n .option(\"--cli\", \"Set up CLI + Skills mode (no MCP server)\")\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 accessToken = (await getValidAccessToken()) ?? (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 resolveMode(options: SetupOptions): Promise<SetupMode> {\n if (options.cli) return \"cli\";\n if (options.mcp || options.yes || options.oauth || options.apiKey) return \"mcp\";\n\n return select<SetupMode>({\n message: \"How should your agent access Context7?\",\n choices: [\n {\n name: `MCP server\\n ${pc.dim(\"Agent calls Context7 tools via MCP protocol to retrieve up-to-date library docs\")}`,\n value: \"mcp\" as SetupMode,\n },\n {\n name: `CLI + Skills\\n ${pc.dim(\"Installs a find-docs skill that guides your agent to fetch up-to-date library docs using \")}${pc.dim(pc.bold(\"ctx7\"))}${pc.dim(\" CLI commands\")}`,\n value: \"cli\" as SetupMode,\n },\n ],\n theme: {\n style: {\n highlight: (text: string) => pc.green(text),\n answer: (text: string) => pc.green(text.split(\"\\n\")[0].trim()),\n },\n },\n });\n}\n\nasync function resolveCliAuth(apiKey?: string): Promise<void> {\n if (apiKey) {\n saveTokens({ access_token: apiKey, token_type: \"bearer\" });\n log.blank();\n log.plain(`${pc.green(\"✔\")} Authenticated`);\n return;\n }\n\n const validToken = await getValidAccessToken();\n if (validToken) {\n log.blank();\n log.plain(`${pc.green(\"✔\")} Authenticated`);\n return;\n }\n\n await performLogin();\n}\n\nasync function promptAgents(): Promise<SetupAgent[] | null> {\n const choices = ALL_AGENT_NAMES.map((name) => ({\n name: SETUP_AGENT_NAMES[name],\n value: name,\n }));\n\n const message = \"Which agents do you want to set up?\";\n\n try {\n return await checkboxWithHover(\n {\n message,\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();\n if (!selected) {\n log.warn(\"Setup cancelled\");\n return [];\n }\n return selected;\n}\n\n/** Install a rule for an agent, handling both \"file\" (standalone) and \"append\" (AGENTS.md) types. */\nasync function installRule(\n agentName: SetupAgent,\n mode: SetupMode,\n scope: Scope\n): Promise<{ status: string; path: string }> {\n const agent = getAgent(agentName);\n const rule = agent.rule;\n const content = await getRuleContent(mode, agentName);\n\n if (rule.kind === \"file\") {\n const ruleDir =\n scope === \"global\" ? rule.dir(\"global\") : join(process.cwd(), rule.dir(\"project\"));\n const rulePath = join(ruleDir, rule.filename);\n await mkdir(dirname(rulePath), { recursive: true });\n await writeFile(rulePath, content, \"utf-8\");\n return { status: \"installed\", path: rulePath };\n }\n\n const filePath =\n scope === \"global\" ? rule.file(\"global\") : join(process.cwd(), rule.file(\"project\"));\n const escapedMarker = rule.sectionMarker.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n const section = `${rule.sectionMarker}\\n${content}${rule.sectionMarker}`;\n\n let existing = \"\";\n try {\n existing = await readFile(filePath, \"utf-8\");\n } catch {\n // File doesn't exist yet\n }\n\n if (existing.includes(rule.sectionMarker)) {\n const regex = new RegExp(`${escapedMarker}\\\\n[\\\\s\\\\S]*?${escapedMarker}`);\n const updated = existing.replace(regex, section);\n await writeFile(filePath, updated, \"utf-8\");\n return { status: \"updated\", path: filePath };\n }\n\n const separator =\n existing.length > 0 && !existing.endsWith(\"\\n\") ? \"\\n\\n\" : existing.length > 0 ? \"\\n\" : \"\";\n await mkdir(dirname(filePath), { recursive: true });\n await writeFile(filePath, existing + separator + section + \"\\n\", \"utf-8\");\n return { status: \"installed\", path: filePath };\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 skillStatus: string;\n skillPath: string;\n}> {\n const agent = getAgent(agentName);\n\n const mcpCandidates =\n scope === \"global\"\n ? agent.mcp.globalPaths\n : agent.mcp.projectPaths.map((p) => join(process.cwd(), p));\n const mcpPath = await resolveMcpPath(mcpCandidates);\n\n let mcpStatus: string;\n try {\n if (mcpPath.endsWith(\".toml\")) {\n const { alreadyExists } = await appendTomlServer(\n mcpPath,\n \"context7\",\n agent.mcp.buildEntry(auth)\n );\n mcpStatus = alreadyExists\n ? `reconfigured with ${AUTH_MODE_LABELS[auth.mode]}`\n : `configured with ${AUTH_MODE_LABELS[auth.mode]}`;\n } else {\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 mcpStatus = alreadyExists\n ? `reconfigured with ${AUTH_MODE_LABELS[auth.mode]}`\n : `configured with ${AUTH_MODE_LABELS[auth.mode]}`;\n await writeJsonConfig(mcpPath, config);\n }\n } catch (err) {\n mcpStatus = `failed: ${err instanceof Error ? err.message : String(err)}`;\n }\n\n let ruleStatus: string;\n let rulePath: string;\n try {\n const result = await installRule(agentName, \"mcp\", scope);\n ruleStatus = result.status;\n rulePath = result.path;\n } catch (err) {\n ruleStatus = `failed: ${err instanceof Error ? err.message : String(err)}`;\n rulePath = \"\";\n }\n\n const skillDir =\n scope === \"global\"\n ? agent.skill.dir(\"global\")\n : join(process.cwd(), agent.skill.dir(\"project\"));\n const skillPath = join(skillDir, agent.skill.name, \"SKILL.md\");\n\n let skillStatus: string;\n try {\n const downloadData = await downloadSkill(\"/upstash/context7\", agent.skill.name);\n if (downloadData.error || downloadData.files.length === 0) {\n throw new Error(downloadData.error || \"no files\");\n }\n await installSkillFiles(agent.skill.name, downloadData.files, skillDir);\n skillStatus = \"installed\";\n } catch (err) {\n skillStatus = `failed: ${err instanceof Error ? err.message : String(err)}`;\n }\n\n return {\n agent: agent.displayName,\n mcpStatus,\n mcpPath,\n ruleStatus,\n rulePath,\n skillStatus,\n skillPath,\n };\n}\n\nasync function setupMcp(agents: SetupAgent[], options: SetupOptions, scope: Scope): Promise<void> {\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 =\n r.mcpStatus.startsWith(\"configured\") || r.mcpStatus.startsWith(\"reconfigured\")\n ? pc.green(\"+\")\n : 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 const skillIcon = r.skillStatus === \"installed\" ? pc.green(\"+\") : pc.dim(\"~\");\n log.plain(` ${skillIcon} Skill ${r.skillStatus}`);\n log.plain(` ${pc.dim(r.skillPath)}`);\n if (r.skillStatus.includes(\"EACCES\")) {\n log.plain(\n ` ${pc.yellow(\"tip:\")} fix permissions with: ${pc.cyan(`sudo chown -R $(whoami) ${dirname(dirname(r.skillPath))}`)}`\n );\n }\n }\n log.blank();\n\n trackEvent(\"setup\", { agents, scope, authMode: auth.mode });\n trackEvent(\"install\", { skills: [\"/upstash/context7/context7-mcp\"], ides: agents });\n}\n\nasync function setupCliAgent(\n agentName: SetupAgent,\n scope: Scope,\n downloadData: { files: Array<{ path: string; content: string }> }\n): Promise<{ skillPath: string; skillStatus: string; rulePath: string; ruleStatus: string }> {\n const agent = getAgent(agentName);\n\n const skillDir =\n scope === \"global\"\n ? agent.skill.dir(\"global\")\n : join(process.cwd(), agent.skill.dir(\"project\"));\n let skillStatus: string;\n try {\n const files = customizeSkillFilesForAgent(agentName, \"find-docs\", downloadData.files);\n await installSkillFiles(\"find-docs\", files, skillDir);\n skillStatus = \"installed\";\n } catch (err) {\n skillStatus = `failed: ${err instanceof Error ? err.message : String(err)}`;\n }\n const skillPath = join(skillDir, \"find-docs\");\n\n let ruleStatus: string;\n let rulePath: string;\n try {\n const result = await installRule(agentName, \"cli\", scope);\n ruleStatus = result.status;\n rulePath = result.path;\n } catch (err) {\n ruleStatus = `failed: ${err instanceof Error ? err.message : String(err)}`;\n rulePath = \"\";\n }\n\n return { skillPath, skillStatus, rulePath, ruleStatus };\n}\n\nasync function setupCli(options: SetupOptions): Promise<void> {\n await resolveCliAuth(options.apiKey);\n\n const scope: Scope = options.project ? \"project\" : \"global\";\n const agents = await resolveAgents(options, scope);\n if (agents.length === 0) return;\n\n log.blank();\n const spinner = ora(\"Downloading find-docs skill...\").start();\n\n const downloadData = await downloadSkill(\"/upstash/context7\", \"find-docs\");\n if (downloadData.error || downloadData.files.length === 0) {\n spinner.fail(`Failed to download find-docs skill: ${downloadData.error || \"no files\"}`);\n return;\n }\n\n spinner.succeed(\"Downloaded find-docs skill\");\n\n const installSpinner = ora(\"Installing...\").start();\n const results: Array<{\n agent: string;\n skillPath: string;\n skillStatus: string;\n rulePath: string;\n ruleStatus: string;\n }> = [];\n\n for (const agentName of agents) {\n installSpinner.text = `Setting up ${getAgent(agentName).displayName}...`;\n const r = await setupCliAgent(agentName, scope, downloadData);\n results.push({ agent: getAgent(agentName).displayName, ...r });\n }\n\n installSpinner.succeed(\"Context7 CLI setup complete\");\n\n log.blank();\n for (const r of results) {\n log.plain(` ${pc.bold(r.agent)}`);\n const skillIcon = r.skillStatus === \"installed\" ? pc.green(\"+\") : pc.dim(\"~\");\n log.plain(` ${skillIcon} Skill ${r.skillStatus}`);\n log.plain(` ${pc.dim(r.skillPath)}`);\n if (r.skillStatus.includes(\"EACCES\")) {\n log.plain(\n ` ${pc.yellow(\"tip:\")} fix permissions with: ${pc.cyan(`sudo chown -R $(whoami) ${dirname(dirname(r.skillPath))}`)}`\n );\n }\n const ruleIcon =\n r.ruleStatus === \"installed\" || r.ruleStatus === \"updated\" ? 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\", { mode: \"cli\" });\n trackEvent(\"install\", { skills: [\"/upstash/context7/find-docs\"], ides: agents });\n}\n\nasync function setupCommand(options: SetupOptions): Promise<void> {\n trackEvent(\"command\", { name: \"setup\" });\n\n try {\n const mode = await resolveMode(options);\n if (mode === \"mcp\") {\n const scope: Scope = options.project ? \"project\" : \"global\";\n const agents = await resolveAgents(options, scope);\n if (agents.length === 0) return;\n await setupMcp(agents, options, scope);\n } else {\n await setupCli(options);\n }\n } catch (err) {\n if (err instanceof Error && err.name === \"ExitPromptError\") process.exit(0);\n throw err;\n }\n}\n","import { access } from \"fs/promises\";\nimport { join } from \"path\";\nimport { homedir } from \"os\";\n\nexport type SetupAgent = \"claude\" | \"cursor\" | \"opencode\" | \"codex\" | \"gemini\";\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 codex: \"Codex\",\n gemini: \"Gemini CLI\",\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 type RuleType =\n | {\n kind: \"file\";\n dir: (scope: \"project\" | \"global\") => string;\n filename: string;\n }\n | { kind: \"append\"; file: (scope: \"project\" | \"global\") => string; sectionMarker: string };\n\nexport interface AgentConfig {\n name: SetupAgent;\n displayName: string;\n mcp: {\n projectPaths: string[];\n globalPaths: string[];\n configKey: string;\n buildEntry: (auth: AuthOptions) => Record<string, unknown>;\n };\n rule: RuleType;\n skill: {\n name: string;\n dir: (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 projectPaths: [\".mcp.json\"],\n globalPaths: [join(homedir(), \".claude.json\")],\n configKey: \"mcpServers\",\n buildEntry: (auth) => withHeaders({ type: \"http\", url: mcpUrl(auth) }, auth),\n },\n rule: {\n kind: \"file\",\n dir: (scope) =>\n scope === \"global\" ? join(homedir(), \".claude\", \"rules\") : join(\".claude\", \"rules\"),\n filename: \"context7.md\",\n },\n skill: {\n name: \"context7-mcp\",\n dir: (scope) =>\n scope === \"global\" ? join(homedir(), \".claude\", \"skills\") : join(\".claude\", \"skills\"),\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 projectPaths: [join(\".cursor\", \"mcp.json\")],\n globalPaths: [join(homedir(), \".cursor\", \"mcp.json\")],\n configKey: \"mcpServers\",\n buildEntry: (auth) => withHeaders({ url: mcpUrl(auth) }, auth),\n },\n rule: {\n kind: \"file\",\n dir: (scope) =>\n scope === \"global\" ? join(homedir(), \".cursor\", \"rules\") : join(\".cursor\", \"rules\"),\n filename: \"context7.mdc\",\n },\n skill: {\n name: \"context7-mcp\",\n dir: (scope) =>\n scope === \"global\" ? join(homedir(), \".cursor\", \"skills\") : join(\".cursor\", \"skills\"),\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 projectPaths: [\"opencode.json\", \"opencode.jsonc\", \".opencode.json\", \".opencode.jsonc\"],\n globalPaths: [\n join(homedir(), \".config\", \"opencode\", \"opencode.json\"),\n join(homedir(), \".config\", \"opencode\", \"opencode.jsonc\"),\n join(homedir(), \".config\", \"opencode\", \".opencode.json\"),\n join(homedir(), \".config\", \"opencode\", \".opencode.jsonc\"),\n ],\n configKey: \"mcp\",\n buildEntry: (auth) => withHeaders({ type: \"remote\", url: mcpUrl(auth), enabled: true }, auth),\n },\n rule: {\n kind: \"append\",\n file: (scope) =>\n scope === \"global\" ? join(homedir(), \".config\", \"opencode\", \"AGENTS.md\") : \"AGENTS.md\",\n sectionMarker: \"<!-- context7 -->\",\n },\n skill: {\n name: \"context7-mcp\",\n dir: (scope) =>\n scope === \"global\" ? join(homedir(), \".agents\", \"skills\") : join(\".agents\", \"skills\"),\n },\n detect: {\n projectPaths: [\"opencode.json\", \"opencode.jsonc\", \".opencode.json\", \".opencode.jsonc\"],\n globalPaths: [join(homedir(), \".config\", \"opencode\")],\n },\n },\n\n codex: {\n name: \"codex\",\n displayName: \"Codex\",\n mcp: {\n projectPaths: [join(\".codex\", \"config.toml\")],\n globalPaths: [join(homedir(), \".codex\", \"config.toml\")],\n configKey: \"mcp_servers\",\n buildEntry: (auth) => {\n const entry: Record<string, unknown> = { type: \"http\", url: mcpUrl(auth) };\n if (auth.mode === \"api-key\" && auth.apiKey) {\n entry.headers = { CONTEXT7_API_KEY: auth.apiKey };\n }\n return entry;\n },\n },\n rule: {\n kind: \"append\",\n file: (scope) => (scope === \"global\" ? join(homedir(), \".codex\", \"AGENTS.md\") : \"AGENTS.md\"),\n sectionMarker: \"<!-- context7 -->\",\n },\n skill: {\n name: \"context7-mcp\",\n dir: (scope) =>\n scope === \"global\" ? join(homedir(), \".agents\", \"skills\") : join(\".agents\", \"skills\"),\n },\n detect: {\n projectPaths: [\".codex\"],\n globalPaths: [join(homedir(), \".codex\")],\n },\n },\n\n gemini: {\n name: \"gemini\",\n displayName: \"Gemini CLI\",\n mcp: {\n projectPaths: [join(\".gemini\", \"settings.json\")],\n globalPaths: [join(homedir(), \".gemini\", \"settings.json\")],\n configKey: \"mcpServers\",\n buildEntry: (auth) => withHeaders({ httpUrl: mcpUrl(auth) }, auth),\n },\n rule: {\n kind: \"append\",\n file: (scope) => (scope === \"global\" ? join(homedir(), \".gemini\", \"GEMINI.md\") : \"GEMINI.md\"),\n sectionMarker: \"<!-- context7 -->\",\n },\n skill: {\n name: \"context7-mcp\",\n dir: (scope) =>\n scope === \"global\" ? join(homedir(), \".gemini\", \"skills\") : join(\".gemini\", \"skills\"),\n },\n detect: {\n projectPaths: [\".gemini\"],\n globalPaths: [join(homedir(), \".gemini\")],\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","const GITHUB_RAW_URLS = [\n \"https://raw.githubusercontent.com/upstash/context7/master/rules\",\n \"https://raw.githubusercontent.com/upstash/context7/main/rules\",\n];\n\nconst FALLBACK_MCP = `Use Context7 MCP to fetch current documentation whenever the user asks about a library, framework, SDK, API, CLI tool, or cloud service -- even well-known ones like React, Next.js, Prisma, Express, Tailwind, Django, or Spring Boot. This includes API syntax, configuration, version migration, library-specific debugging, setup instructions, and CLI tool usage. Use even when you think you know the answer -- your training data may not reflect recent changes. Prefer this over web search for library docs.\n\nDo not use for: refactoring, writing scripts from scratch, debugging business logic, code review, or general programming concepts.\n\n## Steps\n\n1. \\`resolve-library-id\\` with the library name and the user's question. Use the official library name with proper punctuation (e.g., \"Next.js\" not \"nextjs\", \"Customer.io\" not \"customerio\", \"Three.js\" not \"threejs\")\n2. Pick the best match by: exact name match, description relevance, code snippet count, source reputation (High/Medium preferred), and benchmark score (higher is better). Use version-specific IDs when the user mentions a version\n3. \\`query-docs\\` with the selected library ID and the user's full question (not single words)\n4. Answer using the fetched docs\n`;\n\nconst FALLBACK_CLI = `Use the \\`ctx7\\` CLI to fetch current documentation whenever the user asks about a library, framework, SDK, API, CLI tool, or cloud service -- even well-known ones like React, Next.js, Prisma, Express, Tailwind, Django, or Spring Boot. This includes API syntax, configuration, version migration, library-specific debugging, setup instructions, and CLI tool usage. Use even when you think you know the answer -- your training data may not reflect recent changes. Prefer this over web search for library docs.\n\nDo not use for: refactoring, writing scripts from scratch, debugging business logic, code review, or general programming concepts.\n\n## Steps\n\n1. Resolve library: \\`npx ctx7@latest library <name> \"<user's question>\"\\`\n2. Pick the best match by: exact name match, description relevance, code snippet count, source reputation (High/Medium preferred), and benchmark score (higher is better). If results don't look right, try the full name with punctuation (e.g., \"next.js\" not \"nextjs\")\n3. Fetch docs: \\`npx ctx7@latest docs <libraryId> \"<user's question>\"\\`\n4. Answer using the fetched documentation\n\nYou MUST call \\`library\\` first to get a valid ID (format: \\`/org/project\\`) unless the user provides one directly. Use the user's full question as the query -- specific and detailed queries return better results than vague single words. Do not run more than 3 commands per question. Do not include sensitive information (API keys, passwords, credentials) in queries.\n\nFor version-specific docs, use \\`/org/project/version\\` from the \\`library\\` output (e.g., \\`/vercel/next.js/v14.3.0\\`).\n\nIf a command fails with a quota error, inform the user and suggest \\`npx ctx7@latest login\\` or setting \\`CONTEXT7_API_KEY\\` env var for higher limits. Do not silently fall back to training data.\n`;\n\nconst CURSOR_FRONTMATTER = `---\\nalwaysApply: true\\n---\\n\\n`;\nconst CODEX_CLI_SANDBOX_GUIDANCE = `Run Context7 CLI requests outside Codex's default sandbox. If a Context7 CLI command fails with DNS or network errors such as ENOTFOUND, host resolution failures, or fetch failed, rerun it outside the sandbox instead of retrying inside the sandbox.`;\n\nexport type RuleMode = \"mcp\" | \"cli\";\n\nasync function fetchRule(filename: string, fallback: string): Promise<string> {\n for (const base of GITHUB_RAW_URLS) {\n try {\n const res = await fetch(`${base}/${filename}`);\n if (res.ok) return await res.text();\n } catch {\n continue;\n }\n }\n return fallback;\n}\n\nexport async function getRuleContent(mode: RuleMode, agent: string): Promise<string> {\n const [filename, fallback] =\n mode === \"mcp\" ? [\"context7-mcp.md\", FALLBACK_MCP] : [\"context7-cli.md\", FALLBACK_CLI];\n let body = await fetchRule(filename, fallback);\n\n if (mode === \"cli\" && agent === \"codex\" && !body.includes(CODEX_CLI_SANDBOX_GUIDANCE)) {\n body = `${body.trimEnd()}\\n${CODEX_CLI_SANDBOX_GUIDANCE}\\n`;\n }\n\n return agent === \"cursor\" ? `${CURSOR_FRONTMATTER}${body}` : body;\n}\n\nexport function customizeSkillFilesForAgent(\n agent: string,\n skillName: string,\n files: Array<{ path: string; content: string }>\n): Array<{ path: string; content: string }> {\n if (agent !== \"codex\" || skillName !== \"find-docs\") {\n return files;\n }\n\n return files.map((file) => {\n if (file.path !== \"SKILL.md\" || file.content.includes(CODEX_CLI_SANDBOX_GUIDANCE)) {\n return file;\n }\n\n const marker = \"## Step 1: Resolve a Library\";\n const guidance = `${CODEX_CLI_SANDBOX_GUIDANCE}\\n\\n`;\n\n if (file.content.includes(marker)) {\n return {\n ...file,\n content: file.content.replace(marker, `${guidance}${marker}`),\n };\n }\n\n const separator = file.content.endsWith(\"\\n\") ? \"\\n\" : \"\\n\\n\";\n return {\n ...file,\n content: `${file.content}${separator}${CODEX_CLI_SANDBOX_GUIDANCE}\\n`,\n };\n });\n}\n","import { access, readFile, writeFile, mkdir } from \"fs/promises\";\nimport { dirname } from \"path\";\n\nfunction stripJsonComments(text: string): string {\n let result = \"\";\n let i = 0;\n while (i < text.length) {\n if (text[i] === '\"') {\n const start = i++;\n while (i < text.length && text[i] !== '\"') {\n if (text[i] === \"\\\\\") i++;\n i++;\n }\n result += text.slice(start, ++i);\n } else if (text[i] === \"/\" && text[i + 1] === \"/\") {\n i += 2;\n while (i < text.length && text[i] !== \"\\n\") i++;\n } else if (text[i] === \"/\" && text[i + 1] === \"*\") {\n i += 2;\n while (i < text.length && !(text[i] === \"*\" && text[i + 1] === \"/\")) i++;\n i += 2;\n } else {\n result += text[i++];\n }\n }\n return result;\n}\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(stripJsonComments(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 const alreadyExists = serverName in section;\n\n return {\n config: {\n ...existing,\n [configKey]: {\n ...section,\n [serverName]: entry,\n },\n },\n alreadyExists,\n };\n}\n\nexport function removeServerEntry(\n existing: Record<string, unknown>,\n configKey: string,\n serverName: string\n): { config: Record<string, unknown>; removed: boolean } {\n const section = existing[configKey];\n if (!section || typeof section !== \"object\" || Array.isArray(section)) {\n return { config: existing, removed: false };\n }\n\n const current = section as Record<string, unknown>;\n if (!(serverName in current)) {\n return { config: existing, removed: false };\n }\n\n const rest = Object.fromEntries(Object.entries(current).filter(([key]) => key !== serverName));\n const next = { ...existing };\n\n if (Object.keys(rest).length === 0) {\n delete next[configKey];\n } else {\n next[configKey] = rest;\n }\n\n return { config: next, removed: true };\n}\n\nexport async function resolveMcpPath(candidates: string[]): Promise<string> {\n for (const candidate of candidates) {\n try {\n await access(candidate);\n return candidate;\n } catch {}\n }\n return candidates[0];\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\nexport async function readTomlServerExists(filePath: string, serverName: string): Promise<boolean> {\n try {\n const raw = await readFile(filePath, \"utf-8\");\n return raw.includes(`[mcp_servers.${serverName}]`);\n } catch {\n return false;\n }\n}\n\nexport function buildTomlServerBlock(serverName: string, entry: Record<string, unknown>): string {\n const lines: string[] = [`[mcp_servers.${serverName}]`];\n const headers = entry.headers as Record<string, string> | undefined;\n\n for (const [key, value] of Object.entries(entry)) {\n if (key === \"headers\") continue;\n lines.push(`${key} = ${JSON.stringify(value)}`);\n }\n\n if (headers && Object.keys(headers).length > 0) {\n lines.push(\"\");\n lines.push(`[mcp_servers.${serverName}.http_headers]`);\n for (const [key, value] of Object.entries(headers)) {\n lines.push(`${key} = ${JSON.stringify(value)}`);\n }\n }\n\n return lines.join(\"\\n\") + \"\\n\";\n}\n\nexport async function appendTomlServer(\n filePath: string,\n serverName: string,\n entry: Record<string, unknown>\n): Promise<{ alreadyExists: boolean }> {\n const block = buildTomlServerBlock(serverName, entry);\n\n let existing = \"\";\n try {\n existing = await readFile(filePath, \"utf-8\");\n } catch {}\n\n const sectionHeader = `[mcp_servers.${serverName}]`;\n const alreadyExists = existing.includes(sectionHeader);\n\n if (alreadyExists) {\n const subPrefix = `[mcp_servers.${serverName}.`;\n const startIdx = existing.indexOf(sectionHeader);\n const rest = existing.slice(startIdx + sectionHeader.length);\n\n let endOffset = rest.length;\n const re = /^\\[/gm;\n let m;\n while ((m = re.exec(rest)) !== null) {\n const lineEnd = rest.indexOf(\"\\n\", m.index);\n const line = rest.slice(m.index, lineEnd === -1 ? undefined : lineEnd);\n if (!line.startsWith(subPrefix)) {\n endOffset = m.index;\n break;\n }\n }\n\n const rawBefore = existing.slice(0, startIdx).replace(/\\n+$/, \"\");\n const rawAfter = existing\n .slice(startIdx + sectionHeader.length + endOffset)\n .replace(/^\\n+/, \"\");\n const before = rawBefore.length > 0 ? rawBefore + \"\\n\\n\" : \"\";\n const after = rawAfter.length > 0 ? \"\\n\" + rawAfter : \"\";\n const content = before + block + after;\n await mkdir(dirname(filePath), { recursive: true });\n await writeFile(filePath, content, \"utf-8\");\n } else {\n const separator =\n existing.length > 0 && !existing.endsWith(\"\\n\") ? \"\\n\\n\" : existing.length > 0 ? \"\\n\" : \"\";\n await mkdir(dirname(filePath), { recursive: true });\n await writeFile(filePath, existing + separator + block, \"utf-8\");\n }\n\n return { alreadyExists };\n}\n\nexport async function removeTomlServer(\n filePath: string,\n serverName: string\n): Promise<{ removed: boolean }> {\n let existing = \"\";\n try {\n existing = await readFile(filePath, \"utf-8\");\n } catch {\n return { removed: false };\n }\n\n const sectionHeader = `[mcp_servers.${serverName}]`;\n const startIdx = existing.indexOf(sectionHeader);\n if (startIdx === -1) {\n return { removed: false };\n }\n\n const subPrefix = `[mcp_servers.${serverName}.`;\n const rest = existing.slice(startIdx + sectionHeader.length);\n\n let endOffset = rest.length;\n const re = /^\\[/gm;\n let match: RegExpExecArray | null;\n while ((match = re.exec(rest)) !== null) {\n const lineEnd = rest.indexOf(\"\\n\", match.index);\n const line = rest.slice(match.index, lineEnd === -1 ? undefined : lineEnd);\n if (!line.startsWith(subPrefix)) {\n endOffset = match.index;\n break;\n }\n }\n\n const rawBefore = existing.slice(0, startIdx).replace(/\\n+$/, \"\");\n const rawAfter = existing.slice(startIdx + sectionHeader.length + endOffset).replace(/^\\n+/, \"\");\n const content = [rawBefore, rawAfter].filter(Boolean).join(\"\\n\\n\");\n\n await mkdir(dirname(filePath), { recursive: true });\n await writeFile(filePath, content.length > 0 ? `${content}\\n` : \"\", \"utf-8\");\n return { removed: true };\n}\n","import { Command } from \"commander\";\nimport pc from \"picocolors\";\nimport ora from \"ora\";\nimport { checkboxWithHover } from \"../utils/prompts.js\";\nimport { log } from \"../utils/logger.js\";\nimport { trackEvent } from \"../utils/tracking.js\";\nimport { ALL_AGENT_NAMES, SETUP_AGENT_NAMES, getAgent, type SetupAgent } from \"../setup/agents.js\";\nimport {\n readJsonConfig,\n readTomlServerExists,\n removeServerEntry,\n writeJsonConfig,\n resolveMcpPath,\n removeTomlServer,\n} from \"../setup/mcp-writer.js\";\nimport { join } from \"path\";\nimport { access, readFile, rm, writeFile } from \"fs/promises\";\n\ntype Scope = \"global\" | \"project\";\ntype UninstallMode = \"mcp\" | \"cli\";\n\ninterface UninstallOptions {\n claude?: boolean;\n cursor?: boolean;\n opencode?: boolean;\n codex?: boolean;\n gemini?: boolean;\n project?: boolean;\n yes?: boolean;\n all?: boolean;\n cli?: boolean;\n mcp?: boolean;\n}\n\ninterface CleanupStatus {\n status: string;\n path: string;\n}\n\ninterface SkillCleanupStatus extends CleanupStatus {\n name: string;\n}\n\ninterface AgentCleanupResult {\n agent: string;\n mcp?: CleanupStatus;\n rule?: CleanupStatus;\n skills?: SkillCleanupStatus[];\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\nconst CONTEXT7_SECTION_MARKER = \"<!-- context7 -->\";\nconst MODE_SKILLS: Record<UninstallMode, readonly string[]> = {\n mcp: [\"context7-mcp\"],\n cli: [\"find-docs\"],\n};\n\nconst MODE_LABELS: Record<UninstallMode, string> = {\n mcp: \"MCP\",\n cli: \"CLI + Skills\",\n};\n\nexport function registerRemoveCommand(program: Command): void {\n program\n .command(\"remove\")\n .alias(\"uninstall\")\n .description(\"Remove Context7 setup from your AI coding agent\")\n .option(\"--claude\", \"Remove from Claude Code\")\n .option(\"--cursor\", \"Remove from Cursor\")\n .option(\"--opencode\", \"Remove from OpenCode\")\n .option(\"--codex\", \"Remove from Codex\")\n .option(\"--gemini\", \"Remove from Gemini CLI\")\n .option(\"--all\", \"Remove both MCP setup and CLI + Skills setup\")\n .option(\"--mcp\", \"Remove MCP setup\")\n .option(\"--cli\", \"Remove CLI + Skills setup\")\n .option(\"-p, --project\", \"Remove from the current project instead of global config\")\n .option(\"-y, --yes\", \"Skip confirmation prompts\")\n .action(async (options: UninstallOptions) => {\n await removeCommand(options);\n });\n}\n\nfunction getSelectedAgents(options: UninstallOptions): 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 if (options.codex) agents.push(\"codex\");\n if (options.gemini) agents.push(\"gemini\");\n return agents;\n}\n\nasync function promptAgents(detected: SetupAgent[]): Promise<SetupAgent[] | null> {\n const choices = detected.map((name) => ({\n name: SETUP_AGENT_NAMES[name],\n value: name,\n }));\n\n if (detected.length > 0) {\n log.dim(`Detected: ${detected.map((agent) => SETUP_AGENT_NAMES[agent]).join(\", \")}`);\n }\n\n try {\n return await checkboxWithHover(\n {\n message: \"Which agents do you want to remove Context7 setup from?\",\n choices,\n loop: false,\n theme: CHECKBOX_THEME,\n },\n { getName: (agent: SetupAgent) => SETUP_AGENT_NAMES[agent] }\n );\n } catch {\n return null;\n }\n}\n\nasync function promptModes(modes: UninstallMode[]): Promise<UninstallMode[] | null> {\n const choices = modes.map((mode) => ({\n name: MODE_LABELS[mode],\n value: mode,\n }));\n\n try {\n return await checkboxWithHover(\n {\n message: \"Which Context7 setup modes do you want to remove?\",\n choices,\n loop: false,\n theme: CHECKBOX_THEME,\n },\n { getName: (mode: UninstallMode) => MODE_LABELS[mode] }\n );\n } catch {\n return null;\n }\n}\n\nasync function resolveAgents(options: UninstallOptions, scope: Scope): Promise<SetupAgent[]> {\n const explicit = getSelectedAgents(options);\n if (explicit.length > 0) return explicit;\n\n const detected = await detectConfiguredAgents(scope);\n if (detected.length > 0 && options.yes) return detected;\n\n if (detected.length === 0) {\n log.warn(\n \"No Context7 setup detected. Pass --claude, --cursor, --opencode, --codex, or --gemini.\"\n );\n return [];\n }\n\n log.blank();\n const selected = await promptAgents(detected);\n if (!selected) {\n log.warn(\"Remove cancelled\");\n return [];\n }\n\n return selected;\n}\n\nfunction resolveFlagModes(options: UninstallOptions): UninstallMode[] {\n if (options.all) return [\"mcp\", \"cli\"];\n\n const selected: UninstallMode[] = [];\n\n if (options.mcp) selected.push(\"mcp\");\n if (options.cli) selected.push(\"cli\");\n\n return selected.length > 0 ? selected : [\"mcp\", \"cli\"];\n}\n\nasync function pathExists(path: string): Promise<boolean> {\n try {\n await access(path);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function hasMcpConfig(agentName: SetupAgent, scope: Scope): Promise<boolean> {\n const agent = getAgent(agentName);\n const candidates =\n scope === \"global\"\n ? agent.mcp.globalPaths\n : agent.mcp.projectPaths.map((path) => join(process.cwd(), path));\n const mcpPath = await resolveMcpPath(candidates);\n\n if (mcpPath.endsWith(\".toml\")) {\n return readTomlServerExists(mcpPath, \"context7\");\n }\n\n const existing = await readJsonConfig(mcpPath);\n const section = existing[agent.mcp.configKey];\n return (\n !!section && typeof section === \"object\" && !Array.isArray(section) && \"context7\" in section\n );\n}\n\nasync function hasRule(agentName: SetupAgent, scope: Scope): Promise<boolean> {\n const agent = getAgent(agentName);\n const rule = agent.rule;\n\n if (rule.kind === \"file\") {\n const ruleDir =\n scope === \"global\" ? rule.dir(\"global\") : join(process.cwd(), rule.dir(\"project\"));\n return pathExists(join(ruleDir, rule.filename));\n }\n\n const filePath =\n scope === \"global\" ? rule.file(\"global\") : join(process.cwd(), rule.file(\"project\"));\n\n try {\n const existing = await readFile(filePath, \"utf-8\");\n return existing.includes(CONTEXT7_SECTION_MARKER);\n } catch {\n return false;\n }\n}\n\nasync function hasSkill(agentName: SetupAgent, scope: Scope, skillName: string): Promise<boolean> {\n const agent = getAgent(agentName);\n const skillsDir =\n scope === \"global\"\n ? agent.skill.dir(\"global\")\n : join(process.cwd(), agent.skill.dir(\"project\"));\n return pathExists(join(skillsDir, skillName));\n}\n\nasync function detectAvailableModes(agents: SetupAgent[], scope: Scope): Promise<UninstallMode[]> {\n let hasMcpArtifacts = false;\n let hasCliArtifacts = false;\n let hasRuleArtifacts = false;\n\n for (const agent of agents) {\n hasMcpArtifacts =\n hasMcpArtifacts ||\n (await hasMcpConfig(agent, scope)) ||\n (await hasSkill(agent, scope, MODE_SKILLS.mcp[0]));\n hasCliArtifacts = hasCliArtifacts || (await hasSkill(agent, scope, MODE_SKILLS.cli[0]));\n hasRuleArtifacts = hasRuleArtifacts || (await hasRule(agent, scope));\n }\n\n const modes: UninstallMode[] = [];\n if (hasMcpArtifacts) modes.push(\"mcp\");\n if (hasCliArtifacts) modes.push(\"cli\");\n\n if (modes.length === 0 && hasRuleArtifacts) {\n return [\"mcp\", \"cli\"];\n }\n\n return modes;\n}\n\nasync function hasAnyContext7Artifacts(agent: SetupAgent, scope: Scope): Promise<boolean> {\n return (\n (await hasMcpConfig(agent, scope)) ||\n (await hasRule(agent, scope)) ||\n (await hasSkill(agent, scope, MODE_SKILLS.mcp[0])) ||\n (await hasSkill(agent, scope, MODE_SKILLS.cli[0]))\n );\n}\n\nasync function detectConfiguredAgents(scope: Scope): Promise<SetupAgent[]> {\n const detected: SetupAgent[] = [];\n\n for (const agent of ALL_AGENT_NAMES) {\n if (await hasAnyContext7Artifacts(agent, scope)) {\n detected.push(agent);\n }\n }\n\n return detected;\n}\n\nasync function resolveModes(\n options: UninstallOptions,\n agents: SetupAgent[],\n scope: Scope\n): Promise<UninstallMode[]> {\n if (options.all || options.mcp || options.cli) {\n return resolveFlagModes(options);\n }\n\n const detectedModes = await detectAvailableModes(agents, scope);\n if (detectedModes.length <= 1) {\n return detectedModes.length === 1 ? detectedModes : [\"mcp\", \"cli\"];\n }\n\n if (options.yes) {\n return detectedModes;\n }\n\n log.blank();\n const selected = await promptModes(detectedModes);\n if (!selected) {\n log.warn(\"Remove cancelled\");\n return [];\n }\n\n return selected;\n}\n\nasync function uninstallMcp(agentName: SetupAgent, scope: Scope): Promise<CleanupStatus> {\n const agent = getAgent(agentName);\n const mcpCandidates =\n scope === \"global\"\n ? agent.mcp.globalPaths\n : agent.mcp.projectPaths.map((path) => join(process.cwd(), path));\n const mcpPath = await resolveMcpPath(mcpCandidates);\n\n try {\n if (mcpPath.endsWith(\".toml\")) {\n const { removed } = await removeTomlServer(mcpPath, \"context7\");\n return { status: removed ? \"removed\" : \"not found\", path: mcpPath };\n }\n\n const existing = await readJsonConfig(mcpPath);\n const { config, removed } = removeServerEntry(existing, agent.mcp.configKey, \"context7\");\n if (removed) {\n await writeJsonConfig(mcpPath, config);\n }\n return { status: removed ? \"removed\" : \"not found\", path: mcpPath };\n } catch (err) {\n return { status: `failed: ${err instanceof Error ? err.message : String(err)}`, path: mcpPath };\n }\n}\n\nasync function uninstallRule(agentName: SetupAgent, scope: Scope): Promise<CleanupStatus> {\n const agent = getAgent(agentName);\n const rule = agent.rule;\n\n if (rule.kind === \"file\") {\n const rulePath =\n scope === \"global\" ? rule.dir(\"global\") : join(process.cwd(), rule.dir(\"project\"));\n const targetPath = join(rulePath, rule.filename);\n\n try {\n await rm(targetPath);\n return { status: \"removed\", path: targetPath };\n } catch (err) {\n const error = err as NodeJS.ErrnoException;\n if (error.code === \"ENOENT\") return { status: \"not found\", path: targetPath };\n return { status: `failed: ${error.message}`, path: targetPath };\n }\n }\n\n const filePath =\n scope === \"global\" ? rule.file(\"global\") : join(process.cwd(), rule.file(\"project\"));\n\n try {\n const existing = await readFile(filePath, \"utf-8\");\n if (!existing.includes(CONTEXT7_SECTION_MARKER)) {\n return { status: \"not found\", path: filePath };\n }\n\n const escapedMarker = CONTEXT7_SECTION_MARKER.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n const updated = existing\n .replace(new RegExp(`\\\\n?${escapedMarker}\\\\n[\\\\s\\\\S]*?${escapedMarker}\\\\n?`, \"m\"), \"\")\n .replace(/\\n{3,}/g, \"\\n\\n\")\n .replace(/^\\n+/, \"\")\n .trimEnd();\n\n if (updated.length === 0) {\n await rm(filePath);\n } else {\n await writeFile(filePath, `${updated}\\n`, \"utf-8\");\n }\n\n return { status: \"removed\", path: filePath };\n } catch (err) {\n const error = err as NodeJS.ErrnoException;\n if (error.code === \"ENOENT\") return { status: \"not found\", path: filePath };\n return { status: `failed: ${error.message}`, path: filePath };\n }\n}\n\nasync function uninstallSkills(\n agentName: SetupAgent,\n scope: Scope,\n skillNames: readonly string[]\n): Promise<SkillCleanupStatus[]> {\n const agent = getAgent(agentName);\n const skillsDir =\n scope === \"global\"\n ? agent.skill.dir(\"global\")\n : join(process.cwd(), agent.skill.dir(\"project\"));\n\n const results: SkillCleanupStatus[] = [];\n\n for (const skillName of skillNames) {\n const skillPath = join(skillsDir, skillName);\n try {\n await rm(skillPath, { recursive: true });\n results.push({ name: skillName, status: \"removed\", path: skillPath });\n } catch (err) {\n const error = err as NodeJS.ErrnoException;\n if (error.code === \"ENOENT\") {\n results.push({ name: skillName, status: \"not found\", path: skillPath });\n } else {\n results.push({ name: skillName, status: `failed: ${error.message}`, path: skillPath });\n }\n }\n }\n\n return results;\n}\n\nasync function uninstallAgent(\n agentName: SetupAgent,\n scope: Scope,\n modes: UninstallMode[]\n): Promise<AgentCleanupResult> {\n const result: AgentCleanupResult = { agent: getAgent(agentName).displayName };\n const skillNames = Array.from(new Set(modes.flatMap((mode) => [...MODE_SKILLS[mode]])));\n const shouldRemoveRule = modes.includes(\"mcp\") || modes.includes(\"cli\");\n\n if (modes.includes(\"mcp\")) {\n result.mcp = await uninstallMcp(agentName, scope);\n }\n\n if (shouldRemoveRule) {\n result.rule = await uninstallRule(agentName, scope);\n }\n\n if (skillNames.length > 0) {\n result.skills = await uninstallSkills(agentName, scope, skillNames);\n }\n\n return result;\n}\n\nfunction iconForStatus(status: string): string {\n if (status === \"removed\") return pc.green(\"-\");\n if (status === \"not found\") return pc.dim(\"~\");\n return pc.red(\"!\");\n}\n\nfunction printResults(results: AgentCleanupResult[], modes: UninstallMode[]): void {\n log.blank();\n const shouldPrintRule = modes.includes(\"mcp\") || modes.includes(\"cli\");\n let hasVisibleResults = false;\n\n for (const result of results) {\n const visibleSkills = result.skills?.filter((skill) => skill.status !== \"not found\") ?? [];\n const showMcp = modes.includes(\"mcp\") && result.mcp && result.mcp.status !== \"not found\";\n const showRule = shouldPrintRule && result.rule && result.rule.status !== \"not found\";\n\n if (!showMcp && !showRule && visibleSkills.length === 0) {\n continue;\n }\n\n hasVisibleResults = true;\n log.plain(` ${pc.bold(result.agent)}`);\n\n if (showMcp && result.mcp) {\n log.plain(` ${iconForStatus(result.mcp.status)} MCP config ${result.mcp.status}`);\n log.plain(` ${pc.dim(result.mcp.path)}`);\n }\n\n if (showRule && result.rule) {\n log.plain(` ${iconForStatus(result.rule.status)} Rule ${result.rule.status}`);\n log.plain(` ${pc.dim(result.rule.path)}`);\n }\n\n for (const skill of visibleSkills) {\n log.plain(` ${iconForStatus(skill.status)} Skill ${skill.name} ${skill.status}`);\n log.plain(` ${pc.dim(skill.path)}`);\n }\n }\n\n if (hasVisibleResults) {\n log.blank();\n } else {\n log.plain(` ${pc.dim(\"No matching Context7 setup was found to remove.\")}`);\n log.blank();\n }\n}\n\nasync function removeCommand(options: UninstallOptions): Promise<void> {\n trackEvent(\"command\", { name: \"remove\" });\n\n const scope: Scope = options.project ? \"project\" : \"global\";\n const agents = await resolveAgents(options, scope);\n if (agents.length === 0) return;\n const modes = await resolveModes(options, agents, scope);\n if (modes.length === 0) return;\n\n log.blank();\n const spinner = ora(\"Removing Context7 setup...\").start();\n\n const results: AgentCleanupResult[] = [];\n for (const agentName of agents) {\n spinner.text = `Cleaning up ${getAgent(agentName).displayName}...`;\n results.push(await uninstallAgent(agentName, scope, modes));\n }\n\n spinner.succeed(\"Context7 cleanup complete\");\n printResults(results, modes);\n\n trackEvent(\"remove\", { agents, scope, modes });\n}\n","import { Command } from \"commander\";\nimport pc from \"picocolors\";\nimport ora from \"ora\";\n\nimport { resolveLibrary, getLibraryContext } from \"../utils/api.js\";\nimport { log } from \"../utils/logger.js\";\nimport { trackEvent } from \"../utils/tracking.js\";\nimport { loadTokens, isTokenExpired } from \"../utils/auth.js\";\nimport type { LibrarySearchResult, ContextResponse } from \"../types.js\";\n\nconst isTTY = process.stdout.isTTY;\n\nfunction getReputationLabel(score: number | undefined): \"High\" | \"Medium\" | \"Low\" | \"Unknown\" {\n if (score === undefined || score < 0) return \"Unknown\";\n if (score >= 7) return \"High\";\n if (score >= 4) return \"Medium\";\n return \"Low\";\n}\n\nfunction getAccessToken(): string | undefined {\n const tokens = loadTokens();\n if (!tokens || isTokenExpired(tokens)) return undefined;\n return tokens.access_token;\n}\n\nfunction formatLibraryResult(lib: LibrarySearchResult, index: number): string {\n const lines: string[] = [];\n lines.push(`${pc.dim(`${index + 1}.`)} ${pc.bold(`Title: ${lib.title}`)}`);\n lines.push(` ${pc.cyan(`Context7-compatible library ID: ${lib.id}`)}`);\n\n if (lib.description) {\n lines.push(` ${pc.dim(`Description: ${lib.description}`)}`);\n }\n\n if (lib.totalSnippets) {\n lines.push(` ${pc.dim(`Code Snippets: ${lib.totalSnippets}`)}`);\n }\n if (lib.trustScore !== undefined) {\n lines.push(` ${pc.dim(`Source Reputation: ${getReputationLabel(lib.trustScore)}`)}`);\n }\n if (lib.benchmarkScore !== undefined && lib.benchmarkScore > 0) {\n lines.push(` ${pc.dim(`Benchmark Score: ${lib.benchmarkScore}`)}`);\n }\n if (lib.versions && lib.versions.length > 0) {\n lines.push(` ${pc.dim(`Versions: ${lib.versions.join(\", \")}`)}`);\n }\n\n return lines.join(\"\\n\");\n}\n\nasync function resolveCommand(\n library: string,\n query: string | undefined,\n options: { json?: boolean }\n): Promise<void> {\n trackEvent(\"command\", { name: \"library\" });\n\n const spinner = isTTY ? ora(`Searching for \"${library}\"...`).start() : null;\n const accessToken = getAccessToken();\n\n let data;\n try {\n data = await resolveLibrary(library, query, accessToken);\n } catch (err) {\n spinner?.fail(`Error: ${err instanceof Error ? err.message : String(err)}`);\n if (!spinner) log.error(err instanceof Error ? err.message : String(err));\n process.exitCode = 1;\n return;\n }\n\n if (data.error) {\n spinner?.fail(data.message || data.error);\n if (!spinner) log.error(data.message || data.error);\n process.exitCode = 1;\n return;\n }\n\n if (!data.results || data.results.length === 0) {\n spinner?.warn(`No libraries found matching \"${library}\"`);\n if (!spinner) log.warn(`No libraries found matching \"${library}\"`);\n return;\n }\n\n const results = data.results;\n\n spinner?.stop();\n\n if (options.json) {\n console.log(JSON.stringify(results, null, 2));\n return;\n }\n\n log.blank();\n\n if (data.searchFilterApplied) {\n log.warn(\n \"Your results only include libraries matching your teamspace's library filters. To adjust quality thresholds or blocked libraries, update your filters at https://context7.com/dashboard?tab=policies\"\n );\n log.blank();\n }\n\n for (let i = 0; i < results.length; i++) {\n log.plain(formatLibraryResult(results[i], i));\n log.blank();\n }\n\n if (isTTY && results.length > 0) {\n const best = results[0];\n log.plain(\n `${pc.bold(\"Quick command:\")}\\n` + ` ${pc.cyan(`ctx7 docs \"${best.id}\" \"<your question>\"`)}`\n );\n log.blank();\n }\n}\n\nasync function queryCommand(\n libraryId: string,\n query: string,\n options: { json?: boolean }\n): Promise<void> {\n trackEvent(\"command\", { name: \"docs\" });\n\n if (!libraryId.startsWith(\"/\") || !/^\\/[^/]+\\/[^/]/.test(libraryId)) {\n log.error(`Invalid library ID: \"${libraryId}\"`);\n log.info(`Expected format: /owner/repo or /owner/repo/version (e.g., /facebook/react)`);\n log.info(`Run \"ctx7 library <name>\" to find the correct ID`);\n process.exitCode = 1;\n return;\n }\n\n const accessToken = getAccessToken();\n\n const spinner = isTTY ? ora(`Fetching docs for \"${libraryId}\"...`).start() : null;\n const outputType = options.json ? \"json\" : \"txt\";\n\n let result;\n try {\n result = await getLibraryContext(libraryId, query, { type: outputType }, accessToken);\n } catch (err) {\n spinner?.fail(`Error: ${err instanceof Error ? err.message : String(err)}`);\n if (!spinner) log.error(err instanceof Error ? err.message : String(err));\n process.exitCode = 1;\n return;\n }\n\n if (typeof result === \"string\") {\n spinner?.stop();\n console.log(result);\n return;\n }\n\n const ctx = result as ContextResponse;\n\n if (ctx.error) {\n if (ctx.redirectUrl) {\n spinner?.warn(\"Library has been redirected\");\n if (!spinner) log.warn(\"Library has been redirected\");\n log.info(`New ID: ${pc.cyan(ctx.redirectUrl)}`);\n log.info(`Run: ${pc.cyan(`ctx7 docs \"${ctx.redirectUrl}\" \"${query}\"`)}`);\n process.exitCode = 1;\n return;\n }\n\n spinner?.fail(ctx.message || ctx.error);\n if (!spinner) log.error(ctx.message || ctx.error);\n process.exitCode = 1;\n return;\n }\n\n const total = (ctx.codeSnippets?.length || 0) + (ctx.infoSnippets?.length || 0);\n if (total === 0) {\n spinner?.warn(`No documentation found for: \"${query}\"`);\n if (!spinner) log.warn(`No documentation found for: \"${query}\"`);\n return;\n }\n\n spinner?.stop();\n\n if (options.json) {\n console.log(JSON.stringify(ctx, null, 2));\n return;\n }\n\n log.blank();\n\n if (ctx.codeSnippets) {\n for (const snippet of ctx.codeSnippets) {\n log.plain(pc.bold(snippet.codeTitle));\n if (snippet.codeDescription) log.dim(snippet.codeDescription);\n log.blank();\n for (const code of snippet.codeList) {\n log.plain(\"```\" + code.language);\n log.plain(code.code);\n log.plain(\"```\");\n log.blank();\n }\n }\n }\n\n if (ctx.infoSnippets) {\n for (const snippet of ctx.infoSnippets) {\n if (snippet.breadcrumb) log.plain(pc.bold(snippet.breadcrumb));\n log.plain(snippet.content);\n log.blank();\n }\n }\n}\n\nexport function registerDocsCommands(program: Command): void {\n program\n .command(\"library\")\n .argument(\"<name>\", \"Library name to search for\")\n .argument(\"[query]\", \"Question or task for relevance ranking\")\n .option(\"--json\", \"Output as JSON\")\n .description(\"Resolve a library name to a Context7 library ID\")\n .action(async (name: string, query: string | undefined, options: { json?: boolean }) => {\n await resolveCommand(name, query, options);\n });\n\n program\n .command(\"docs\")\n .argument(\"<libraryId>\", \"Context7 library ID (e.g., /facebook/react)\")\n .argument(\"<query>\", \"Question or task to get docs for\")\n .option(\"--json\", \"Output as JSON\")\n .description(\"Query documentation for a library\")\n .action(async (libraryId: string, query: string, options: { json?: boolean }) => {\n await queryCommand(libraryId, query, options);\n });\n}\n","import { confirm } from \"@inquirer/prompts\";\nimport { spawn } from \"child_process\";\nimport { Command } from \"commander\";\nimport pc from \"picocolors\";\nimport { VERSION } from \"../constants.js\";\nimport { log } from \"../utils/logger.js\";\nimport { trackEvent } from \"../utils/tracking.js\";\nimport {\n checkForUpdates,\n getUpgradePlan,\n markUpdateNotificationShown,\n shouldShowUpdateNotification,\n shouldSkipUpdateNotifier,\n type UpgradePlan,\n} from \"../utils/update-check.js\";\n\ninterface UpgradeOptions {\n yes?: boolean;\n check?: boolean;\n}\n\nexport function registerUpgradeCommand(program: Command): void {\n program\n .command(\"upgrade\")\n .description(\"Check for a newer ctx7 version and upgrade when possible\")\n .option(\"-y, --yes\", \"Run the suggested upgrade command without prompting\")\n .option(\"--check\", \"Only check for updates without running the upgrade command\")\n .action(async (options: UpgradeOptions) => {\n await upgradeCommand(options);\n });\n}\n\nfunction runCommand(command: string, args: string[]): Promise<number | null> {\n return new Promise((resolve, reject) => {\n const child = spawn(command, args, {\n stdio: \"inherit\",\n shell: process.platform === \"win32\",\n });\n\n child.on(\"error\", reject);\n child.on(\"close\", (code) => resolve(code));\n });\n}\n\nexport async function runUpgradePlan(plan: UpgradePlan): Promise<number | null> {\n return runCommand(plan.command, plan.args);\n}\n\nfunction showUpgradeFailureHelp(plan: UpgradePlan): void {\n log.info(`Try rerunning: ${pc.cyan(plan.displayCommand)}`);\n\n const isGlobalNpmInstall =\n (plan.installMethod === \"npm-global\" || plan.installMethod === \"unknown\") &&\n plan.command === \"npm\" &&\n plan.args.includes(\"-g\");\n const isGlobalAltInstall =\n (plan.installMethod === \"pnpm-global\" || plan.installMethod === \"bun-global\") &&\n plan.args.includes(\"-g\");\n\n if (isGlobalNpmInstall) {\n log.dim(\n \"If this failed due to permissions, your global npm directory may require elevated privileges on this machine.\"\n );\n } else if (isGlobalAltInstall) {\n log.dim(\n \"If this failed due to permissions, your global package manager install location may require additional privileges on this machine.\"\n );\n }\n}\n\nexport async function maybeShowUpgradeNotice(\n options: {\n actionName?: string;\n argv?: string[];\n isInteractive?: boolean;\n } = {}\n): Promise<void> {\n const actionName = options.actionName ?? \"\";\n const argv = options.argv ?? process.argv;\n const isInteractive =\n options.isInteractive ?? Boolean(process.stdout.isTTY && process.stdin.isTTY);\n\n if (!isInteractive || shouldSkipUpdateNotifier(argv) || actionName === \"upgrade\") {\n return;\n }\n\n const info = await checkForUpdates();\n if (!info || !info.updateAvailable || !(await shouldShowUpdateNotification(info))) {\n return;\n }\n\n log.blank();\n if (info.upgradePlan.needsExplicitVersion) {\n log.box([\n `${pc.white(pc.bold(\"Update available:\"))} ${pc.green(pc.bold(`v${info.currentVersion}`))} ${pc.dim(\"->\")} ${pc.green(pc.bold(`v${info.latestVersion}`))}`,\n `${pc.white(\"Use\")} ${pc.yellow(pc.bold(info.upgradePlan.displayCommand))} ${pc.white(\"to run the latest version\")}`,\n ]);\n await markUpdateNotificationShown(info.latestVersion);\n log.blank();\n return;\n }\n\n if (!info.upgradePlan.canRun) {\n log.box([\n `${pc.white(pc.bold(\"Update available:\"))} ${pc.green(pc.bold(`v${info.currentVersion}`))} ${pc.dim(\"->\")} ${pc.green(pc.bold(`v${info.latestVersion}`))}`,\n `${pc.white(\"Run\")} ${pc.yellow(pc.bold(\"ctx7 upgrade\"))} ${pc.white(\"for update steps\")}`,\n `${pc.white(\"Or run\")} ${pc.yellow(info.upgradePlan.displayCommand)}`,\n ]);\n await markUpdateNotificationShown(info.latestVersion);\n log.blank();\n return;\n }\n\n log.box([\n `${pc.white(pc.bold(\"Update available:\"))} ${pc.green(pc.bold(`v${info.currentVersion}`))} ${pc.dim(\"->\")} ${pc.green(pc.bold(`v${info.latestVersion}`))}`,\n `${pc.white(\"Run\")} ${pc.yellow(pc.bold(\"ctx7 upgrade\"))} ${pc.white(\"to update now\")}`,\n `${pc.white(\"Or run\")} ${pc.yellow(info.upgradePlan.displayCommand)}`,\n ]);\n await markUpdateNotificationShown(info.latestVersion);\n log.blank();\n}\n\nasync function upgradeCommand(options: UpgradeOptions): Promise<void> {\n trackEvent(\"command\", { name: \"upgrade\" });\n\n const info = await checkForUpdates({ force: true });\n const plan = info?.upgradePlan ?? getUpgradePlan();\n\n if (!info) {\n log.warn(\"Couldn't check for updates right now.\");\n log.info(`Try again later or run ${pc.cyan(plan.displayCommand)} manually.`);\n return;\n }\n\n if (!info.updateAvailable) {\n log.success(`ctx7 is up to date (${pc.bold(`v${VERSION}`)})`);\n return;\n }\n\n log.blank();\n log.info(\n `Update available: ${pc.bold(`v${info.currentVersion}`)} ${pc.dim(\"->\")} ${pc.bold(`v${info.latestVersion}`)}`\n );\n\n if (plan.needsExplicitVersion) {\n log.info(`You're using an ephemeral runner (${plan.installMethod}).`);\n log.info(`Use ${pc.cyan(plan.displayCommand)} to run the latest version immediately.`);\n log.info(`Or install globally with ${pc.cyan(\"npm install -g ctx7@latest\")}.`);\n return;\n }\n\n if (!plan.canRun) {\n log.info(`Run ${pc.cyan(plan.displayCommand)} to update your installed version.`);\n return;\n }\n\n log.info(`Upgrade command: ${pc.cyan(plan.displayCommand)}`);\n\n if (options.check) {\n return;\n }\n\n let shouldRun = options.yes ?? false;\n if (!shouldRun && process.stdout.isTTY) {\n shouldRun = await confirm({\n message: `Run ${plan.displayCommand} now?`,\n default: true,\n });\n }\n\n if (!shouldRun) {\n log.dim(\"Upgrade skipped.\");\n return;\n }\n\n log.blank();\n const exitCode = await runUpgradePlan(plan);\n\n if (exitCode === 0) {\n log.blank();\n log.success(\"Upgrade complete.\");\n log.info(`Run ${pc.cyan(\"ctx7 --version\")} to verify the installed version.`);\n return;\n }\n\n log.blank();\n log.error(`Upgrade command exited with code ${exitCode ?? \"unknown\"}.`);\n showUpgradeFailureHelp(plan);\n process.exitCode = 1;\n}\n","import { homedir } from \"os\";\nimport { dirname, join } from \"path\";\nimport { mkdir, readFile, writeFile } from \"fs/promises\";\nimport { NAME, VERSION } from \"../constants.js\";\n\nconst DEFAULT_CACHE_TTL_MS = 24 * 60 * 60 * 1000;\nconst UPDATE_STATE_FILE = join(homedir(), \".context7\", \"cli-state.json\");\n\nexport type InstallMethod =\n | \"npm-global\"\n | \"pnpm-global\"\n | \"bun-global\"\n | \"npx\"\n | \"pnpm-dlx\"\n | \"bunx\"\n | \"unknown\";\n\ninterface UpdateState {\n latestVersion?: string;\n lastCheckedAt?: number;\n notifiedVersion?: string;\n lastNotifiedAt?: number;\n}\n\nexport interface UpgradePlan {\n installMethod: InstallMethod;\n command: string;\n args: string[];\n displayCommand: string;\n canRun: boolean;\n needsExplicitVersion: boolean;\n}\n\nexport interface UpdateInfo {\n currentVersion: string;\n latestVersion: string;\n updateAvailable: boolean;\n installMethod: InstallMethod;\n upgradePlan: UpgradePlan;\n}\n\ninterface CheckForUpdatesOptions {\n force?: boolean;\n now?: number;\n cacheTtlMs?: number;\n stateFile?: string;\n}\n\nfunction getStateFilePath(stateFile?: string): string {\n return stateFile ?? UPDATE_STATE_FILE;\n}\n\nasync function readUpdateState(stateFile?: string): Promise<UpdateState> {\n try {\n const raw = await readFile(getStateFilePath(stateFile), \"utf-8\");\n return JSON.parse(raw) as UpdateState;\n } catch {\n return {};\n }\n}\n\nasync function writeUpdateState(state: UpdateState, stateFile?: string): Promise<void> {\n const path = getStateFilePath(stateFile);\n await mkdir(dirname(path), { recursive: true });\n await writeFile(path, JSON.stringify(state, null, 2) + \"\\n\", \"utf-8\");\n}\n\nexport function compareVersions(a: string, b: string): number {\n const normalize = (version: string): number[] =>\n version\n .split(\"-\", 1)[0]\n .split(\".\")\n .map((part) => Number.parseInt(part, 10) || 0);\n\n const left = normalize(a);\n const right = normalize(b);\n const max = Math.max(left.length, right.length);\n\n for (let i = 0; i < max; i++) {\n const diff = (left[i] ?? 0) - (right[i] ?? 0);\n if (diff !== 0) return diff;\n }\n\n return 0;\n}\n\nexport function detectInstallMethod(env: NodeJS.ProcessEnv = process.env): InstallMethod {\n const execPath = env.npm_execpath?.toLowerCase() ?? \"\";\n const npmCommand = env.npm_command?.toLowerCase() ?? \"\";\n const userAgent = env.npm_config_user_agent?.toLowerCase() ?? \"\";\n\n if (execPath.includes(\"pnpm\") && npmCommand === \"dlx\") return \"pnpm-dlx\";\n if (execPath.includes(\"pnpm\")) return \"pnpm-global\";\n if (execPath.includes(\"bun\") && npmCommand === \"x\") return \"bunx\";\n if (execPath.includes(\"bun\")) return \"bun-global\";\n if (execPath.includes(\"npm\") && npmCommand === \"exec\") return \"npx\";\n if (execPath.includes(\"npm\")) return \"npm-global\";\n\n if (userAgent.startsWith(\"pnpm/\")) return \"pnpm-global\";\n if (userAgent.startsWith(\"bun/\")) return \"bun-global\";\n if (userAgent.startsWith(\"npm/\")) return \"npm-global\";\n\n return \"unknown\";\n}\n\nexport function getUpgradePlan(\n installMethod = detectInstallMethod(),\n packageName = NAME\n): UpgradePlan {\n switch (installMethod) {\n case \"pnpm-global\":\n return {\n installMethod,\n command: \"pnpm\",\n args: [\"add\", \"-g\", `${packageName}@latest`],\n displayCommand: `pnpm add -g ${packageName}@latest`,\n canRun: true,\n needsExplicitVersion: false,\n };\n case \"bun-global\":\n return {\n installMethod,\n command: \"bun\",\n args: [\"add\", \"-g\", `${packageName}@latest`],\n displayCommand: `bun add -g ${packageName}@latest`,\n canRun: true,\n needsExplicitVersion: false,\n };\n case \"npx\":\n return {\n installMethod,\n command: \"npx\",\n args: [`${packageName}@latest`],\n displayCommand: `npx ${packageName}@latest <command>`,\n canRun: false,\n needsExplicitVersion: true,\n };\n case \"pnpm-dlx\":\n return {\n installMethod,\n command: \"pnpm\",\n args: [\"dlx\", `${packageName}@latest`],\n displayCommand: `pnpm dlx ${packageName}@latest <command>`,\n canRun: false,\n needsExplicitVersion: true,\n };\n case \"bunx\":\n return {\n installMethod,\n command: \"bunx\",\n args: [`${packageName}@latest`],\n displayCommand: `bunx ${packageName}@latest <command>`,\n canRun: false,\n needsExplicitVersion: true,\n };\n case \"unknown\":\n return {\n installMethod,\n command: \"npm\",\n args: [\"install\", \"-g\", `${packageName}@latest`],\n displayCommand: `npm install -g ${packageName}@latest`,\n canRun: false,\n needsExplicitVersion: false,\n };\n case \"npm-global\":\n default:\n return {\n installMethod: \"npm-global\",\n command: \"npm\",\n args: [\"install\", \"-g\", `${packageName}@latest`],\n displayCommand: `npm install -g ${packageName}@latest`,\n canRun: true,\n needsExplicitVersion: false,\n };\n }\n}\n\nasync function fetchLatestVersion(packageName = NAME): Promise<string | null> {\n try {\n const response = await fetch(\n `https://registry.npmjs.org/${encodeURIComponent(packageName)}/latest`,\n {\n headers: { Accept: \"application/json\" },\n signal: AbortSignal.timeout(1500),\n }\n );\n\n if (!response.ok) return null;\n\n const data = (await response.json()) as { version?: unknown };\n return typeof data.version === \"string\" ? data.version : null;\n } catch {\n return null;\n }\n}\n\nexport async function checkForUpdates(\n options: CheckForUpdatesOptions = {}\n): Promise<UpdateInfo | null> {\n const now = options.now ?? Date.now();\n const cacheTtlMs = options.cacheTtlMs ?? DEFAULT_CACHE_TTL_MS;\n const stateFile = options.stateFile;\n const state = await readUpdateState(stateFile);\n const isStale =\n options.force ||\n !state.lastCheckedAt ||\n now - state.lastCheckedAt >= cacheTtlMs ||\n !state.latestVersion;\n\n let latestVersion = state.latestVersion ?? null;\n\n if (isStale) {\n const fetchedVersion = await fetchLatestVersion();\n if (fetchedVersion) {\n latestVersion = fetchedVersion;\n await writeUpdateState(\n {\n ...state,\n latestVersion: fetchedVersion,\n lastCheckedAt: now,\n },\n stateFile\n );\n }\n }\n\n if (!latestVersion) return null;\n\n const installMethod = detectInstallMethod();\n\n return {\n currentVersion: VERSION,\n latestVersion,\n updateAvailable: compareVersions(latestVersion, VERSION) > 0,\n installMethod,\n upgradePlan: getUpgradePlan(installMethod),\n };\n}\n\nexport async function shouldShowUpdateNotification(\n info: UpdateInfo,\n options: { now?: number; stateFile?: string; cooldownMs?: number } = {}\n): Promise<boolean> {\n if (!info.updateAvailable) return false;\n\n const now = options.now ?? Date.now();\n const cooldownMs = options.cooldownMs ?? DEFAULT_CACHE_TTL_MS;\n const state = await readUpdateState(options.stateFile);\n\n if (\n state.notifiedVersion === info.latestVersion &&\n state.lastNotifiedAt &&\n now - state.lastNotifiedAt < cooldownMs\n ) {\n return false;\n }\n\n return true;\n}\n\nexport async function markUpdateNotificationShown(\n latestVersion: string,\n options: { now?: number; stateFile?: string } = {}\n): Promise<void> {\n const now = options.now ?? Date.now();\n const state = await readUpdateState(options.stateFile);\n await writeUpdateState(\n {\n ...state,\n notifiedVersion: latestVersion,\n lastNotifiedAt: now,\n },\n options.stateFile\n );\n}\n\nexport function shouldSkipUpdateNotifier(argv = process.argv): boolean {\n return argv.includes(\"--json\") || argv.includes(\"-v\") || argv.includes(\"--version\");\n}\n"],"mappings":"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","names":["pc","pc","ora","rm","join","input","path","branch","pathParts","path","files","error","input","pc","join","dirname","pc","dirname","join","ides","scope","pc","ide","join","dirname","pc","ora","mkdir","writeFile","join","homedir","select","resolve","baseUrl","pc","baseUrl","program","pc","pc","ora","pc","join","homedir","mkdir","writeFile","resolve","select","homedir","readFile","join","path","pkg","pc","program","input","ora","join","homedir","path","rm","pc","ora","select","mkdir","readFile","writeFile","dirname","join","randomBytes","access","join","homedir","access","readFile","writeFile","mkdir","dirname","pc","agents","program","ora","randomBytes","select","join","mkdir","dirname","writeFile","readFile","pc","ora","join","access","readFile","rm","writeFile","CHECKBOX_THEME","pc","program","removeCommand","getSelectedAgents","agents","promptAgents","resolveAgents","pathExists","path","removed","ora","pc","ora","pc","ora","program","confirm","spawn","pc","homedir","dirname","join","mkdir","readFile","writeFile","join","homedir","readFile","path","mkdir","dirname","writeFile","program","resolve","spawn","pc","confirm","pc"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/commands/skill.ts","../src/utils/parse-input.ts","../src/utils/github.ts","../src/utils/skill-name.ts","../src/constants.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/commands/remove.ts","../src/commands/docs.ts","../src/commands/upgrade.ts","../src/utils/update-check.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 { registerRemoveCommand } from \"./commands/remove.js\";\nimport { registerDocsCommands } from \"./commands/docs.js\";\nimport { maybeShowUpgradeNotice, registerUpgradeCommand } from \"./commands/upgrade.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 .hook(\"preAction\", async (_thisCommand, actionCommand) => {\n await maybeShowUpgradeNotice({\n actionName: actionCommand.name(),\n argv: process.argv,\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\n ${brand.dim(\"# Remove Context7 setup\")}\n ${brand.primary(\"npx ctx7 remove --cursor\")}\n ${brand.primary(\"npx ctx7 remove --cursor --all\")}\n ${brand.primary(\"npx ctx7 remove --cursor --cli\")}\n ${brand.primary(\"npx ctx7 remove --claude --mcp\")}\n\n ${brand.dim(\"# Query library documentation\")}\n ${brand.primary('npx ctx7 library react \"how to use hooks\"')}\n ${brand.primary('npx ctx7 docs /facebook/react \"useEffect examples\"')}\n\nVisit ${brand.primary(\"https://context7.com\")} to browse skills\n`\n );\n\nregisterSkillCommands(program);\nregisterSkillAliases(program);\nregisterAuthCommands(program);\nregisterSetupCommand(program);\nregisterRemoveCommand(program);\nregisterDocsCommands(program);\nregisterUpgradeCommand(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\nawait program.parseAsync();\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 formatPopularity,\n formatTrust,\n formatInstallRange,\n getTrustLabel,\n} from \"../utils/prompts.js\";\nimport { installSkillFiles, symlinkSkill } from \"../utils/installer.js\";\nimport { assertSkillNameInRoot } from \"../utils/skill-name.js\";\nimport { listSkillsFromGitHub, getSkillFromGitHub } from \"../utils/github.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(\"--all-agents\", \"Install to all supported agent locations\")\n .option(\"-y, --yes\", \"Skip confirmation prompts\")\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(\"--all-agents\", \"Install to all supported agent locations\")\n .option(\"-y, --yes\", \"Skip confirmation prompts\")\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 return;\n }\n\n spinner.text = `Fetching skill from GitHub: ${skillName}...`;\n const ghResult = await getSkillFromGitHub(repo, skillName);\n if (ghResult.status === \"repo_not_found\") {\n spinner.fail(pc.red(`Repository not found: ${repo}`));\n return;\n }\n if (ghResult.status !== \"ok\" || !ghResult.skill) {\n spinner.fail(pc.red(`Skill not found: ${skillName}`));\n return;\n }\n\n spinner.succeed(`Found skill: ${skillName}`);\n selectedSkills = [ghResult.skill];\n } else {\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 }\n } else {\n // Fetch all skills when no specific names provided\n let data = await listProjectSkills(repo);\n\n if ((data.error || !data.skills || data.skills.length === 0) && !data.blockedSkillsCount) {\n spinner.text = `Fetching skills from GitHub...`;\n const ghResult = await listSkillsFromGitHub(repo);\n if (ghResult.status === \"repo_not_found\") {\n spinner.fail(pc.red(`Repository not found: ${repo}`));\n return;\n }\n if (ghResult.status === \"ok\" && ghResult.skills.length > 0) {\n data = { project: repo, skills: ghResult.skills };\n }\n }\n\n if (data.error && (!data.skills || data.skills.length === 0)) {\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 popularityColWidth = 13;\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 popularity = formatPopularity(s.installCount) + \" \".repeat(popularityColWidth - 4);\n const trust = formatTrust(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(\"Installs:\")} ${pc.white(formatInstallRange(s.installCount))}`,\n `${pc.yellow(\"Trust:\")} ${s.trustScore !== undefined && s.trustScore >= 0 ? pc.white(s.trustScore.toFixed(1)) : pc.dim(\"-\")}`,\n `${pc.yellow(\"Description:\")}`,\n pc.white(s.description || \"No description\"),\n ];\n\n return {\n name: `${indexStr} ${paddedName} ${popularity}${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(\"Popularity\".padEnd(popularityColWidth)) + pc.dim(\"Trust\");\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 nameWithRepo = (s: SkillSearchResult) => `${s.name} ${pc.dim(`(${s.project})`)}`;\n const nameWithRepoLen = (s: SkillSearchResult) => `${s.name} (${s.project})`.length;\n const maxNameLen = Math.max(...data.results.map(nameWithRepoLen));\n const popularityColWidth = 13;\n const choices = data.results.map((s, index) => {\n const indexStr = pc.dim(`${(index + 1).toString().padStart(indexWidth)}.`);\n const rawLen = nameWithRepoLen(s);\n const displayName = nameWithRepo(s) + \" \".repeat(maxNameLen - rawLen);\n const popularity = formatPopularity(s.installCount) + \" \".repeat(popularityColWidth - 4);\n const trust = formatTrust(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(\"Installs:\")} ${pc.white(formatInstallRange(s.installCount))}`,\n `${pc.yellow(\"Trust:\")} ${s.trustScore !== undefined && s.trustScore >= 0 ? pc.white(s.trustScore.toFixed(1)) : pc.dim(\"-\")}`,\n `${pc.yellow(\"Description:\")}`,\n pc.white(s.description || \"No description\"),\n ];\n\n return {\n name: `${indexStr} ${displayName} ${popularity}${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 = headerPad + pc.dim(\"Popularity\".padEnd(popularityColWidth)) + pc.dim(\"Trust\");\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 let skillPath: string;\n try {\n skillPath = assertSkillNameInRoot(skillsDir, name);\n } catch {\n log.error(`Invalid skill name: ${name}`);\n return;\n }\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 nameWithRepo = (s: SkillSearchResult) => `${s.name} ${pc.dim(`(${s.project})`)}`;\n const nameWithRepoLen = (s: SkillSearchResult) => `${s.name} (${s.project})`.length;\n const maxNameLen = Math.max(...skills.map(nameWithRepoLen));\n const popularityColWidth = 13;\n const trustColWidth = 8;\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 rawLen = nameWithRepoLen(s);\n const displayName = nameWithRepo(s) + \" \".repeat(maxNameLen - rawLen);\n const popularity = formatPopularity(s.installCount) + \" \".repeat(popularityColWidth - 4);\n const trustLabel = getTrustLabel(s.trustScore);\n const trust = formatTrust(s.trustScore) + \" \".repeat(trustColWidth - trustLabel.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(\"Installs:\")} ${pc.white(formatInstallRange(s.installCount))}`,\n `${pc.yellow(\"Trust:\")} ${s.trustScore !== undefined && s.trustScore >= 0 ? pc.white(s.trustScore.toFixed(1)) : pc.dim(\"-\")}`,\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} ${displayName} ${popularity}${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(\"Popularity\".padEnd(popularityColWidth)) +\n pc.dim(\"Trust\".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 { execSync } from \"node:child_process\";\nimport type { SkillFile, Skill } from \"../types.js\";\nimport { isSafeSkillName } from \"./skill-name.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\nfunction getGitHubToken(): string | undefined {\n const envToken = process.env.GITHUB_TOKEN || process.env.GH_TOKEN;\n if (envToken) return envToken;\n try {\n return execSync(\"gh auth token\", { stdio: [\"pipe\", \"pipe\", \"ignore\"] })\n .toString()\n .trim();\n } catch {\n return undefined;\n }\n}\n\nfunction parseSkillFrontmatter(content: string): { name: string; description: string } | null {\n const frontmatterMatch = content.match(/^---\\s*\\n([\\s\\S]*?)\\n---/);\n if (!frontmatterMatch) return null;\n\n const frontmatter = frontmatterMatch[1];\n\n const nameMatch = frontmatter.match(/^name:\\s*(.+)$/m);\n if (!nameMatch) return null;\n const name = nameMatch[1].trim().replace(/^[\"']|[\"']$/g, \"\");\n if (!isSafeSkillName(name)) return null;\n\n let description = \"\";\n const multiLineMatch = frontmatter.match(/^description:\\s*([|>])-?\\s*$/m);\n\n if (multiLineMatch) {\n const descLineIndex = frontmatter.indexOf(\"description:\");\n const lines = frontmatter.slice(descLineIndex).split(\"\\n\").slice(1);\n const indentedLines: string[] = [];\n for (const line of lines) {\n if (line.trim() === \"\") {\n indentedLines.push(\"\");\n continue;\n }\n if (/^\\s+/.test(line)) {\n indentedLines.push(line);\n } else {\n break;\n }\n }\n const firstNonEmpty = indentedLines.find((l) => l.trim().length > 0);\n const indent = firstNonEmpty?.match(/^(\\s+)/)?.[1].length ?? 0;\n description = indentedLines\n .map((line) => line.slice(indent))\n .join(\" \")\n .replace(/\\s+/g, \" \")\n .trim();\n } else {\n const singleMatch = frontmatter.match(/^description:\\s*(.+)$/m);\n if (singleMatch) {\n const value = singleMatch[1].trim();\n if (![\"|\", \">\", \"|-\", \">-\"].includes(value)) {\n description = value.replace(/^[\"']|[\"']$/g, \"\");\n }\n }\n }\n\n if (!description) return null;\n return { name, description };\n}\n\nfunction getGitHubHeaders(): Record<string, string> {\n const ghToken = getGitHubToken();\n return {\n Accept: \"application/vnd.github.v3+json\",\n \"User-Agent\": \"context7-cli\",\n ...(ghToken && { Authorization: `token ${ghToken}` }),\n };\n}\n\nasync function fetchRepoTree(\n owner: string,\n repo: string,\n branch: string,\n headers: Record<string, string>\n): Promise<GitHubTreeResponse | null> {\n const treeUrl = `${GITHUB_API}/repos/${owner}/${repo}/git/trees/${branch}?recursive=1`;\n const response = await fetch(treeUrl, { headers });\n if (!response.ok) return null;\n return (await response.json()) as GitHubTreeResponse;\n}\n\nasync function fetchDefaultBranch(\n owner: string,\n repo: string,\n headers: Record<string, string>\n): Promise<{ branch: string } | { status: number }> {\n const response = await fetch(`${GITHUB_API}/repos/${owner}/${repo}`, { headers });\n if (!response.ok) return { status: response.status };\n const data = (await response.json()) as { default_branch: string };\n return { branch: data.default_branch };\n}\n\ntype GitHubSkillsResult =\n | { status: \"ok\"; skills: (Skill & { project: string })[] }\n | { status: \"repo_not_found\" }\n | { status: \"error\"; error: string };\n\nexport async function listSkillsFromGitHub(project: string): Promise<GitHubSkillsResult> {\n try {\n const parts = project.split(\"/\").filter(Boolean);\n if (parts.length < 2) return { status: \"error\", error: \"Invalid project format\" };\n const [owner, repo] = parts;\n\n const headers = getGitHubHeaders();\n const branchResult = await fetchDefaultBranch(owner, repo, headers);\n if (\"status\" in branchResult) return { status: \"repo_not_found\" };\n\n const treeData = await fetchRepoTree(owner, repo, branchResult.branch, headers);\n if (!treeData) return { status: \"error\", error: \"Could not fetch repository tree\" };\n\n const skillMdFiles = treeData.tree.filter(\n (item) => item.type === \"blob\" && item.path.toLowerCase().endsWith(\"skill.md\")\n );\n\n const skills: (Skill & { project: string })[] = [];\n for (const item of skillMdFiles) {\n const rawUrl = `${GITHUB_RAW}/${owner}/${repo}/${branchResult.branch}/${item.path}`;\n const response = await fetch(rawUrl, { headers });\n if (!response.ok) continue;\n\n const content = await response.text();\n const meta = parseSkillFrontmatter(content);\n if (!meta) continue;\n\n const skillDir = item.path.split(\"/\").slice(0, -1).join(\"/\");\n skills.push({\n name: meta.name,\n description: meta.description,\n url: `https://github.com/${owner}/${repo}/tree/${branchResult.branch}/${skillDir}`,\n project,\n });\n }\n\n return { status: \"ok\", skills };\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n return { status: \"error\", error: message };\n }\n}\n\nexport async function getSkillFromGitHub(\n project: string,\n skillName: string\n): Promise<GitHubSkillsResult & { skill?: Skill & { project: string } }> {\n const result = await listSkillsFromGitHub(project);\n if (result.status !== \"ok\") return result;\n const skill = result.skills.find((s) => s.name.toLowerCase() === skillName.toLowerCase());\n return { ...result, skill };\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 ghHeaders = getGitHubHeaders();\n\n const treeData = await fetchRepoTree(owner, repo, branch, ghHeaders);\n if (!treeData) {\n return { files: [], error: `GitHub API error` };\n }\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, { headers: ghHeaders });\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 // Reject paths that attempt directory traversal\n if (relativePath.includes(\"..\")) {\n console.warn(`Skipping file with unsafe path: ${item.path}`);\n continue;\n }\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 { resolve, dirname, basename } from \"path\";\n\nconst SAFE_NAME = /^[a-zA-Z0-9][a-zA-Z0-9._-]*$/;\n\nexport function isSafeSkillName(name: string): boolean {\n if (typeof name !== \"string\") return false;\n if (name.length === 0 || name.length > 128) return false;\n if (name === \".\" || name === \"..\") return false;\n if (name.includes(\"\\0\")) return false;\n if (!SAFE_NAME.test(name)) return false;\n return true;\n}\n\nexport function assertSkillNameInRoot(skillsRoot: string, skillName: string): string {\n if (!isSafeSkillName(skillName)) {\n throw new Error(`Unsafe skill name: ${JSON.stringify(skillName)}`);\n }\n const root = resolve(skillsRoot);\n const target = resolve(root, skillName);\n if (dirname(target) !== root || basename(target) !== skillName) {\n throw new Error(`Skill name \"${skillName}\" escapes the skills root`);\n }\n return target;\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;\nexport const CLI_CLIENT_ID = \"2veBSofhicRBguUT\";\n","import type {\n ListSkillsResponse,\n SingleSkillResponse,\n SearchResponse,\n SuggestResponse,\n DownloadResponse,\n LibrarySearchResponse,\n SkillQuestionsResponse,\n StructuredGenerateInput,\n GenerateStreamEvent,\n SkillQuotaResponse,\n ContextResponse,\n} from \"../types.js\";\nimport { downloadSkillFromGitHub, getSkillFromGitHub } from \"./github.js\";\nimport { VERSION } from \"../constants.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 // handle private repo skills with env var\n const ghResult = await getSkillFromGitHub(project, skillName);\n if (ghResult.status !== \"ok\" || !ghResult.skill) {\n return {\n skill: { name: skillName, description: \"\", url: \"\", project },\n files: [],\n error: skillData.message || skillData.error,\n };\n }\n\n const { files, error } = await downloadSkillFromGitHub(ghResult.skill);\n if (error) {\n return { skill: ghResult.skill, files: [], error };\n }\n return { skill: ghResult.skill, files };\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\nfunction getAuthHeaders(accessToken?: string): Record<string, string> {\n const headers: Record<string, string> = {\n \"X-Context7-Source\": \"cli\",\n \"X-Context7-Client-IDE\": \"ctx7-cli\",\n \"X-Context7-Client-Version\": VERSION,\n \"X-Context7-Transport\": \"cli\",\n };\n const apiKey = process.env.CONTEXT7_API_KEY;\n if (apiKey) {\n headers[\"Authorization\"] = `Bearer ${apiKey}`;\n } else if (accessToken) {\n headers[\"Authorization\"] = `Bearer ${accessToken}`;\n }\n return headers;\n}\n\nexport async function resolveLibrary(\n libraryName: string,\n query?: string,\n accessToken?: string\n): Promise<LibrarySearchResponse> {\n const params = new URLSearchParams({ libraryName });\n if (query) {\n params.set(\"query\", query);\n }\n\n const response = await fetch(`${baseUrl}/api/v2/libs/search?${params}`, {\n headers: getAuthHeaders(accessToken),\n });\n\n if (!response.ok) {\n const errorData = (await response.json().catch(() => ({}))) as {\n error?: string;\n message?: string;\n };\n return {\n results: [],\n error: errorData.error || `HTTP error ${response.status}`,\n message: errorData.message,\n };\n }\n\n return (await response.json()) as LibrarySearchResponse;\n}\n\nexport interface GetContextOptions {\n type?: \"json\" | \"txt\";\n}\n\nexport async function getLibraryContext(\n libraryId: string,\n query: string,\n options?: GetContextOptions,\n accessToken?: string\n): Promise<ContextResponse | string> {\n const params = new URLSearchParams({ libraryId, query });\n if (options?.type) {\n params.set(\"type\", options.type);\n }\n const headers = getAuthHeaders(accessToken);\n const response = await fetch(`${baseUrl}/api/v2/context?${params}`, {\n headers,\n });\n\n if (!response.ok) {\n const errorData = (await response.json().catch(() => ({}))) as {\n error?: string;\n message?: string;\n redirectUrl?: string;\n };\n\n if (response.status === 301 && errorData.redirectUrl) {\n return {\n codeSnippets: [],\n infoSnippets: [],\n error: errorData.error || \"library_redirected\",\n message: errorData.message,\n redirectUrl: errorData.redirectUrl,\n };\n }\n\n return {\n codeSnippets: [],\n infoSnippets: [],\n error: errorData.error || `HTTP error ${response.status}`,\n message: errorData.message,\n };\n }\n\n if (options?.type === \"txt\") {\n return await response.text();\n }\n\n return (await response.json()) as ContextResponse;\n}\n","import pc from \"picocolors\";\n\nconst ANSI_PATTERN = /\\x1B(?:[@-Z\\\\-_]|\\[[0-?]*[ -/]*[@-~])/g;\n\nfunction visibleLength(text: string): number {\n return text.replace(ANSI_PATTERN, \"\").length;\n}\n\nfunction padVisible(text: string, width: number): string {\n const padding = Math.max(0, width - visibleLength(text));\n return text + \" \".repeat(padding);\n}\n\nexport function box(lines: string[], color: (message: string) => string = pc.green): void {\n const contentWidth = Math.max(...lines.map((line) => visibleLength(line)), 0);\n const top = color(`┌${\"─\".repeat(contentWidth + 2)}┐`);\n const bottom = color(`└${\"─\".repeat(contentWidth + 2)}┘`);\n\n console.log(top);\n for (const line of lines) {\n console.log(color(\"│ \") + padVisible(line, contentWidth) + color(\" │\"));\n }\n console.log(bottom);\n}\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 box,\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 if (options.allAgents) {\n return [\"universal\", ...VENDOR_SPECIFIC_AGENTS];\n }\n\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 !!(\n options.allAgents ||\n options.claude ||\n options.cursor ||\n options.universal ||\n options.antigravity\n );\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(\n options: AddOptions,\n forceUniversal = true\n): 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 if (options.yes) {\n confirmed = true;\n } else {\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\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 {\n name: `${IDE_NAMES[\"claude\"]} ${pc.dim(`(${pathMap[\"claude\"]})`)}`,\n value: \"claude\" as IDE,\n checked: false,\n },\n { name: universalLabel, value: \"universal\", checked: false },\n ];\n\n for (const ide of VENDOR_SPECIFIC_AGENTS.filter((ide) => ide !== \"claude\")) {\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 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 const ides: IDE[] = forceUniversal\n ? [\"universal\", ...selectedIdes.filter((ide) => ide !== \"universal\")]\n : selectedIdes;\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 }[] = [\n { name: `${IDE_NAMES[\"claude\"]} ${pc.dim(`(${IDE_PATHS[\"claude\"]})`)}`, value: \"claude\" },\n { name: universalLabel, value: \"universal\" },\n ];\n\n for (const ide of VENDOR_SPECIFIC_AGENTS.filter((ide) => ide !== \"claude\")) {\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 into a popularity star rating (4 stars).\n * 0/unknown → ☆☆☆☆, <100 → ★☆☆☆, <500 → ★★☆☆, <1000 → ★★★☆, 1000+ → ★★★★\n */\nexport function formatPopularity(count: number | undefined): string {\n const filled = \"★\";\n const empty = \"☆\";\n const max = 4;\n let stars: number;\n if (count === undefined || count === 0) stars = 0;\n else if (count < 100) stars = 1;\n else if (count < 500) stars = 2;\n else if (count < 1000) stars = 3;\n else stars = 4;\n\n const filledPart = filled.repeat(stars);\n const emptyPart = empty.repeat(max - stars);\n if (stars === 0) return pc.dim(emptyPart);\n return pc.yellow(filledPart) + pc.dim(emptyPart);\n}\n\n/**\n * Returns the install count as a human-readable range string.\n */\nexport function formatInstallRange(count: number | undefined): string {\n if (count === undefined || count === 0) return \"Unknown\";\n if (count < 100) return \"<100\";\n if (count < 500) return \"<500\";\n if (count < 1000) return \"<1,000\";\n return \"1,000+\";\n}\n\n/**\n * Formats trust score as High / Medium / Low label.\n * Uses MCP reputation thresholds: >=7 High, >=4 Medium, <4 Low.\n */\nexport function formatTrust(score: number | undefined): string {\n if (score === undefined || score < 0) return pc.dim(\"-\");\n if (score >= 7) return pc.green(\"High\");\n if (score >= 4) return pc.yellow(\"Medium\");\n return pc.red(\"Low\");\n}\n\n/**\n * Returns the raw trust label string (uncolored) for width calculations.\n */\nexport function getTrustLabel(score: number | undefined): string {\n if (score === undefined || score < 0) return \"-\";\n if (score >= 7) return \"High\";\n if (score >= 4) return \"Medium\";\n return \"Low\";\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 = choices.findIndex((c) => !c.disabled);\n if (cursorPosition < 0) 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\") {\n let next = cursorPosition - 1;\n while (next >= 0 && choices[next].disabled) next--;\n if (next >= 0) cursorPosition = next;\n } else if (key.name === \"down\") {\n let next = cursorPosition + 1;\n while (next < totalItems && choices[next].disabled) next++;\n if (next < totalItems) cursorPosition = next;\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 answer: (text: string) => pc.green(text),\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}\n\nexport interface LibrarySearchResponse {\n results: LibrarySearchResult[];\n searchFilterApplied?: boolean;\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 allAgents?: boolean;\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; yes?: 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: \".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 = \".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\nexport interface CodeExample {\n language: string;\n code: string;\n}\n\nexport interface CodeSnippet {\n codeTitle: string;\n codeDescription: string;\n codeLanguage: string;\n codeTokens: number;\n codeId: string;\n pageTitle: string;\n codeList: CodeExample[];\n}\n\nexport interface InfoSnippet {\n pageId?: string;\n breadcrumb?: string;\n content: string;\n contentTokens: number;\n}\n\nexport interface ContextResponse {\n codeSnippets: CodeSnippet[];\n infoSnippets: InfoSnippet[];\n error?: string;\n message?: string;\n redirectUrl?: string;\n}\n","import { mkdir, writeFile, rm, symlink, lstat } from \"fs/promises\";\nimport { resolve, dirname } from \"path\";\n\nimport type { SkillFile } from \"../types.js\";\nimport { assertSkillNameInRoot } from \"./skill-name.js\";\n\nexport async function installSkillFiles(\n skillName: string,\n files: SkillFile[],\n skillsRoot: string\n): Promise<void> {\n const skillDir = assertSkillNameInRoot(skillsRoot, skillName);\n\n for (const file of files) {\n const filePath = resolve(skillDir, file.path);\n\n // Prevent directory traversal — resolved path must stay within skillDir\n if (\n !filePath.startsWith(skillDir + \"/\") &&\n !filePath.startsWith(skillDir + \"\\\\\") &&\n filePath !== skillDir\n ) {\n throw new Error(`Skill file path \"${file.path}\" resolves outside the target directory`);\n }\n\n const fileDir = dirname(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 skillsRoot: string\n): Promise<void> {\n const targetPath = assertSkillNameInRoot(skillsRoot, 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(skillsRoot, { 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 if (searchResult.searchFilterApplied) {\n log.warn(\n \"Your results only include libraries matching your teamspace's library filters. To adjust quality thresholds or blocked libraries, update your filters at https://context7.com/dashboard?tab=policies\"\n );\n log.blank();\n }\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 });\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\";\nimport { CLI_CLIENT_ID } from \"../constants.js\";\nimport { getBaseUrl } from \"./api.js\";\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\nasync function refreshAccessToken(refreshToken: string): Promise<TokenData> {\n const response = await fetch(`${getBaseUrl()}/api/oauth/token`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/x-www-form-urlencoded\" },\n body: new URLSearchParams({\n grant_type: \"refresh_token\",\n client_id: CLI_CLIENT_ID,\n refresh_token: refreshToken,\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 refresh token\");\n }\n\n return (await response.json()) as TokenData;\n}\n\n/**\n * Returns a valid access token, refreshing if expired.\n * Returns null if no tokens exist or refresh fails.\n */\nexport async function getValidAccessToken(): Promise<string | null> {\n const tokens = loadTokens();\n if (!tokens) return null;\n\n if (!isTokenExpired(tokens)) {\n return tokens.access_token;\n }\n\n if (!tokens.refresh_token) {\n return null;\n }\n\n try {\n const newTokens = await refreshAccessToken(tokens.refresh_token);\n saveTokens(newTokens);\n return newTokens.access_token;\n } catch {\n return null;\n }\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 clearTokens,\n buildAuthorizationUrl,\n getValidAccessToken,\n} from \"../utils/auth.js\";\n\nimport { trackEvent } from \"../utils/tracking.js\";\nimport { CLI_CLIENT_ID } from \"../constants.js\";\nimport { getBaseUrl } from \"../utils/api.js\";\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 existingToken = await getValidAccessToken();\n if (existingToken) {\n console.log(pc.yellow(\"You are already logged in.\"));\n console.log(pc.dim(\"Run 'ctx7 logout' first if you want to log in with a different account.\"));\n return;\n }\n clearTokens();\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 accessToken = await getValidAccessToken();\n\n if (!accessToken) {\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 whoami = await fetchWhoami(accessToken);\n if (whoami.name) {\n console.log(`${pc.dim(\"Name:\".padEnd(13))}${whoami.name}`);\n }\n if (whoami.email) {\n console.log(`${pc.dim(\"Email:\".padEnd(13))}${whoami.email}`);\n }\n if (whoami.teamspace) {\n console.log(`${pc.dim(\"Teamspace:\".padEnd(13))}${whoami.teamspace.name}`);\n }\n } catch {\n console.log(pc.dim(\"(Session may be expired - run 'ctx7 login' to refresh)\"));\n }\n}\n\ninterface WhoamiResponse {\n success: boolean;\n name: string | null;\n email: string | null;\n teamspace: { id: string; name: string } | null;\n}\n\nasync function fetchWhoami(accessToken: string): Promise<WhoamiResponse> {\n const response = await fetch(`${getBaseUrl()}/api/dashboard/whoami`, {\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 WhoamiResponse;\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 { select } from \"@inquirer/prompts\";\nimport { mkdir, readFile, 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, downloadSkill } from \"../utils/api.js\";\nimport { installSkillFiles } from \"../utils/installer.js\";\nimport { performLogin } from \"./auth.js\";\nimport { saveTokens, getValidAccessToken } from \"../utils/auth.js\";\nimport {\n type SetupAgent,\n type AuthOptions,\n type Transport,\n SETUP_AGENT_NAMES,\n AUTH_MODE_LABELS,\n ALL_AGENT_NAMES,\n getAgent,\n detectAgents,\n} from \"../setup/agents.js\";\nimport { customizeSkillFilesForAgent, getRuleContent } from \"../setup/templates.js\";\nimport {\n readJsonConfig,\n mergeServerEntry,\n writeJsonConfig,\n resolveMcpPath,\n appendTomlServer,\n readTomlServerEntry,\n isStdioContext7Entry,\n patchStdioApiKey,\n getJsonServerEntry,\n} from \"../setup/mcp-writer.js\";\n\ntype Scope = \"global\" | \"project\";\ntype SetupMode = \"mcp\" | \"cli\";\n\ninterface SetupOptions {\n claude?: boolean;\n cursor?: boolean;\n universal?: boolean;\n antigravity?: boolean;\n opencode?: boolean;\n codex?: boolean;\n gemini?: boolean;\n project?: boolean;\n yes?: boolean;\n apiKey?: string;\n oauth?: boolean;\n cli?: boolean;\n mcp?: boolean;\n stdio?: boolean;\n}\n\nfunction resolveTransport(options: SetupOptions): Transport {\n return options.stdio ? \"stdio\" : \"http\";\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 if (options.codex) agents.push(\"codex\");\n if (options.gemini) agents.push(\"gemini\");\n return agents;\n}\n\nexport function registerSetupCommand(program: Command): void {\n program\n .command(\"setup\")\n .description(\"Set up Context7 for your AI coding agent\")\n .option(\"--claude\", \"Set up for Claude Code\")\n .option(\"--cursor\", \"Set up for Cursor\")\n .option(\"--universal\", \"Set up for Universal (.agents/skills)\")\n .option(\"--antigravity\", \"Set up for Antigravity (.agent/skills)\")\n .option(\"--opencode\", \"Set up for OpenCode\")\n .option(\"--codex\", \"Set up for Codex\")\n .option(\"--gemini\", \"Set up for Gemini CLI\")\n .option(\"--mcp\", \"Set up MCP server mode\")\n .option(\"--cli\", \"Set up CLI + Skills mode (no MCP server)\")\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 .option(\"--stdio\", \"Configure the MCP server as a local stdio process (default: HTTP)\")\n .action(async (options: SetupOptions) => {\n await setupCommand(options);\n });\n}\n\nasync function authenticateAndGenerateKey(): Promise<string | null> {\n const accessToken = (await getValidAccessToken()) ?? (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 resolveMode(options: SetupOptions): Promise<SetupMode> {\n if (options.cli) return \"cli\";\n if (options.mcp || options.yes || options.oauth || options.apiKey || options.stdio) return \"mcp\";\n\n return select<SetupMode>({\n message: \"How should your agent access Context7?\",\n choices: [\n {\n name: `MCP server\\n ${pc.dim(\"Agent calls Context7 tools via MCP protocol to retrieve up-to-date library docs\")}`,\n value: \"mcp\" as SetupMode,\n },\n {\n name: `CLI + Skills\\n ${pc.dim(\"Installs a find-docs skill that guides your agent to fetch up-to-date library docs using \")}${pc.dim(pc.bold(\"ctx7\"))}${pc.dim(\" CLI commands\")}`,\n value: \"cli\" as SetupMode,\n },\n ],\n theme: {\n style: {\n highlight: (text: string) => pc.green(text),\n answer: (text: string) => pc.green(text.split(\"\\n\")[0].trim()),\n },\n },\n });\n}\n\nasync function resolveCliAuth(apiKey?: string): Promise<void> {\n if (apiKey) {\n saveTokens({ access_token: apiKey, token_type: \"bearer\" });\n log.blank();\n log.plain(`${pc.green(\"✔\")} Authenticated`);\n return;\n }\n\n const validToken = await getValidAccessToken();\n if (validToken) {\n log.blank();\n log.plain(`${pc.green(\"✔\")} Authenticated`);\n return;\n }\n\n await performLogin();\n}\n\nasync function promptAgents(): Promise<SetupAgent[] | null> {\n const choices = ALL_AGENT_NAMES.map((name) => ({\n name: SETUP_AGENT_NAMES[name],\n value: name,\n }));\n\n const message = \"Which agents do you want to set up?\";\n\n try {\n return await checkboxWithHover(\n {\n message,\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();\n if (!selected) {\n log.warn(\"Setup cancelled\");\n return [];\n }\n return selected;\n}\n\n/** Install a rule for an agent, handling both \"file\" (standalone) and \"append\" (AGENTS.md) types. */\nasync function installRule(\n agentName: SetupAgent,\n mode: SetupMode,\n scope: Scope\n): Promise<{ status: string; path: string }> {\n const agent = getAgent(agentName);\n const rule = agent.rule;\n const content = await getRuleContent(mode, agentName);\n\n if (rule.kind === \"file\") {\n const ruleDir =\n scope === \"global\" ? rule.dir(\"global\") : join(process.cwd(), rule.dir(\"project\"));\n const rulePath = join(ruleDir, rule.filename);\n await mkdir(dirname(rulePath), { recursive: true });\n await writeFile(rulePath, content, \"utf-8\");\n return { status: \"installed\", path: rulePath };\n }\n\n const filePath =\n scope === \"global\" ? rule.file(\"global\") : join(process.cwd(), rule.file(\"project\"));\n const escapedMarker = rule.sectionMarker.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n const section = `${rule.sectionMarker}\\n${content}${rule.sectionMarker}`;\n\n let existing = \"\";\n try {\n existing = await readFile(filePath, \"utf-8\");\n } catch {\n // File doesn't exist yet\n }\n\n if (existing.includes(rule.sectionMarker)) {\n const regex = new RegExp(`${escapedMarker}\\\\n[\\\\s\\\\S]*?${escapedMarker}`);\n const updated = existing.replace(regex, section);\n await writeFile(filePath, updated, \"utf-8\");\n return { status: \"updated\", path: filePath };\n }\n\n const separator =\n existing.length > 0 && !existing.endsWith(\"\\n\") ? \"\\n\\n\" : existing.length > 0 ? \"\\n\" : \"\";\n await mkdir(dirname(filePath), { recursive: true });\n await writeFile(filePath, existing + separator + section + \"\\n\", \"utf-8\");\n return { status: \"installed\", path: filePath };\n}\n\n/**\n * For stdio transport, preserve an existing `@upstash/context7-mcp` invocation\n * (e.g., `@upstash/context7-mcp@latest` or a user-pinned version) and only\n * swap the `--api-key` value. Falls back to the agent's canonical shape when\n * no existing stdio entry is detected. HTTP transport always uses the\n * canonical shape.\n */\nfunction resolveEntryToWrite(\n agent: ReturnType<typeof getAgent>,\n auth: AuthOptions,\n transport: Transport,\n existingEntry: Record<string, unknown> | undefined\n): Record<string, unknown> {\n if (transport === \"stdio\" && existingEntry && isStdioContext7Entry(existingEntry)) {\n const apiKey = auth.mode === \"api-key\" ? auth.apiKey : undefined;\n return patchStdioApiKey(existingEntry, apiKey);\n }\n return agent.mcp.buildEntry(auth, transport);\n}\n\nasync function setupAgent(\n agentName: SetupAgent,\n auth: AuthOptions,\n transport: Transport,\n scope: Scope\n): Promise<{\n agent: string;\n mcpStatus: string;\n mcpPath: string;\n ruleStatus: string;\n rulePath: string;\n skillStatus: string;\n skillPath: string;\n}> {\n const agent = getAgent(agentName);\n\n const mcpCandidates =\n scope === \"global\"\n ? agent.mcp.globalPaths\n : agent.mcp.projectPaths.map((p) => join(process.cwd(), p));\n const mcpPath = await resolveMcpPath(mcpCandidates);\n\n let mcpStatus: string;\n try {\n if (mcpPath.endsWith(\".toml\")) {\n const existingTomlEntry =\n transport === \"stdio\" ? await readTomlServerEntry(mcpPath, \"context7\") : undefined;\n const entry = resolveEntryToWrite(agent, auth, transport, existingTomlEntry);\n const { alreadyExists } = await appendTomlServer(mcpPath, \"context7\", entry);\n mcpStatus = alreadyExists\n ? `reconfigured with ${AUTH_MODE_LABELS[auth.mode]}`\n : `configured with ${AUTH_MODE_LABELS[auth.mode]}`;\n } else {\n const existing = await readJsonConfig(mcpPath);\n const existingJsonEntry =\n transport === \"stdio\"\n ? getJsonServerEntry(existing, agent.mcp.configKey, \"context7\")\n : undefined;\n const entry = resolveEntryToWrite(agent, auth, transport, existingJsonEntry);\n const { config, alreadyExists } = mergeServerEntry(\n existing,\n agent.mcp.configKey,\n \"context7\",\n entry\n );\n mcpStatus = alreadyExists\n ? `reconfigured with ${AUTH_MODE_LABELS[auth.mode]}`\n : `configured with ${AUTH_MODE_LABELS[auth.mode]}`;\n await writeJsonConfig(mcpPath, config);\n }\n } catch (err) {\n mcpStatus = `failed: ${err instanceof Error ? err.message : String(err)}`;\n }\n\n let ruleStatus: string;\n let rulePath: string;\n try {\n const result = await installRule(agentName, \"mcp\", scope);\n ruleStatus = result.status;\n rulePath = result.path;\n } catch (err) {\n ruleStatus = `failed: ${err instanceof Error ? err.message : String(err)}`;\n rulePath = \"\";\n }\n\n const skillDir =\n scope === \"global\"\n ? agent.skill.dir(\"global\")\n : join(process.cwd(), agent.skill.dir(\"project\"));\n const skillPath = join(skillDir, agent.skill.name, \"SKILL.md\");\n\n let skillStatus: string;\n try {\n const downloadData = await downloadSkill(\"/upstash/context7\", agent.skill.name);\n if (downloadData.error || downloadData.files.length === 0) {\n throw new Error(downloadData.error || \"no files\");\n }\n await installSkillFiles(agent.skill.name, downloadData.files, skillDir);\n skillStatus = \"installed\";\n } catch (err) {\n skillStatus = `failed: ${err instanceof Error ? err.message : String(err)}`;\n }\n\n return {\n agent: agent.displayName,\n mcpStatus,\n mcpPath,\n ruleStatus,\n rulePath,\n skillStatus,\n skillPath,\n };\n}\n\nasync function setupMcp(agents: SetupAgent[], options: SetupOptions, scope: Scope): Promise<void> {\n const transport = resolveTransport(options);\n if (transport === \"stdio\" && options.oauth) {\n log.error(\"--stdio is incompatible with --oauth (OAuth uses the hosted HTTP endpoint).\");\n return;\n }\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, transport, 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 =\n r.mcpStatus.startsWith(\"configured\") || r.mcpStatus.startsWith(\"reconfigured\")\n ? pc.green(\"+\")\n : 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 const skillIcon = r.skillStatus === \"installed\" ? pc.green(\"+\") : pc.dim(\"~\");\n log.plain(` ${skillIcon} Skill ${r.skillStatus}`);\n log.plain(` ${pc.dim(r.skillPath)}`);\n if (r.skillStatus.includes(\"EACCES\")) {\n log.plain(\n ` ${pc.yellow(\"tip:\")} fix permissions with: ${pc.cyan(`sudo chown -R $(whoami) ${dirname(dirname(r.skillPath))}`)}`\n );\n }\n }\n log.blank();\n\n trackEvent(\"setup\", { agents, scope, authMode: auth.mode });\n trackEvent(\"install\", { skills: [\"/upstash/context7/context7-mcp\"], ides: agents });\n}\n\nasync function setupCliAgent(\n agentName: SetupAgent,\n scope: Scope,\n downloadData: { files: Array<{ path: string; content: string }> }\n): Promise<{ skillPath: string; skillStatus: string; rulePath: string; ruleStatus: string }> {\n const agent = getAgent(agentName);\n\n const skillDir =\n scope === \"global\"\n ? agent.skill.dir(\"global\")\n : join(process.cwd(), agent.skill.dir(\"project\"));\n let skillStatus: string;\n try {\n const files = customizeSkillFilesForAgent(agentName, \"find-docs\", downloadData.files);\n await installSkillFiles(\"find-docs\", files, skillDir);\n skillStatus = \"installed\";\n } catch (err) {\n skillStatus = `failed: ${err instanceof Error ? err.message : String(err)}`;\n }\n const skillPath = join(skillDir, \"find-docs\");\n\n let ruleStatus: string;\n let rulePath: string;\n try {\n const result = await installRule(agentName, \"cli\", scope);\n ruleStatus = result.status;\n rulePath = result.path;\n } catch (err) {\n ruleStatus = `failed: ${err instanceof Error ? err.message : String(err)}`;\n rulePath = \"\";\n }\n\n return { skillPath, skillStatus, rulePath, ruleStatus };\n}\n\nasync function setupCli(options: SetupOptions): Promise<void> {\n await resolveCliAuth(options.apiKey);\n\n const scope: Scope = options.project ? \"project\" : \"global\";\n const agents = await resolveAgents(options, scope);\n if (agents.length === 0) return;\n\n log.blank();\n const spinner = ora(\"Downloading find-docs skill...\").start();\n\n const downloadData = await downloadSkill(\"/upstash/context7\", \"find-docs\");\n if (downloadData.error || downloadData.files.length === 0) {\n spinner.fail(`Failed to download find-docs skill: ${downloadData.error || \"no files\"}`);\n return;\n }\n\n spinner.succeed(\"Downloaded find-docs skill\");\n\n const installSpinner = ora(\"Installing...\").start();\n const results: Array<{\n agent: string;\n skillPath: string;\n skillStatus: string;\n rulePath: string;\n ruleStatus: string;\n }> = [];\n\n for (const agentName of agents) {\n installSpinner.text = `Setting up ${getAgent(agentName).displayName}...`;\n const r = await setupCliAgent(agentName, scope, downloadData);\n results.push({ agent: getAgent(agentName).displayName, ...r });\n }\n\n installSpinner.succeed(\"Context7 CLI setup complete\");\n\n log.blank();\n for (const r of results) {\n log.plain(` ${pc.bold(r.agent)}`);\n const skillIcon = r.skillStatus === \"installed\" ? pc.green(\"+\") : pc.dim(\"~\");\n log.plain(` ${skillIcon} Skill ${r.skillStatus}`);\n log.plain(` ${pc.dim(r.skillPath)}`);\n if (r.skillStatus.includes(\"EACCES\")) {\n log.plain(\n ` ${pc.yellow(\"tip:\")} fix permissions with: ${pc.cyan(`sudo chown -R $(whoami) ${dirname(dirname(r.skillPath))}`)}`\n );\n }\n const ruleIcon =\n r.ruleStatus === \"installed\" || r.ruleStatus === \"updated\" ? 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\", { mode: \"cli\" });\n trackEvent(\"install\", { skills: [\"/upstash/context7/find-docs\"], ides: agents });\n}\n\nasync function setupCommand(options: SetupOptions): Promise<void> {\n trackEvent(\"command\", { name: \"setup\" });\n\n try {\n const mode = await resolveMode(options);\n if (mode === \"mcp\") {\n const scope: Scope = options.project ? \"project\" : \"global\";\n const agents = await resolveAgents(options, scope);\n if (agents.length === 0) return;\n await setupMcp(agents, options, scope);\n } else {\n await setupCli(options);\n }\n } catch (err) {\n if (err instanceof Error && err.name === \"ExitPromptError\") process.exit(0);\n throw err;\n }\n}\n","import { access } from \"fs/promises\";\nimport { join } from \"path\";\nimport { homedir } from \"os\";\n\nexport type SetupAgent = \"claude\" | \"cursor\" | \"opencode\" | \"codex\" | \"gemini\";\nexport type AuthMode = \"oauth\" | \"api-key\";\nexport type Transport = \"http\" | \"stdio\";\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 codex: \"Codex\",\n gemini: \"Gemini CLI\",\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\";\nexport const STDIO_PACKAGE = \"@upstash/context7-mcp\";\n\nfunction stdioArgs(auth: AuthOptions): string[] {\n const args = [\"-y\", STDIO_PACKAGE];\n if (auth.mode === \"api-key\" && auth.apiKey) {\n args.push(\"--api-key\", auth.apiKey);\n }\n return args;\n}\n\nfunction stdioEntry(auth: AuthOptions): Record<string, unknown> {\n return { command: \"npx\", args: stdioArgs(auth) };\n}\n\nfunction claudeConfigDir(): string {\n return process.env.CLAUDE_CONFIG_DIR || join(homedir(), \".claude\");\n}\n\nfunction claudeGlobalMcpPath(): string {\n if (process.env.CLAUDE_CONFIG_DIR) {\n return join(claudeConfigDir(), \".claude.json\");\n }\n return join(homedir(), \".claude.json\");\n}\n\nexport type RuleType =\n | {\n kind: \"file\";\n dir: (scope: \"project\" | \"global\") => string;\n filename: string;\n }\n | { kind: \"append\"; file: (scope: \"project\" | \"global\") => string; sectionMarker: string };\n\nexport interface AgentConfig {\n name: SetupAgent;\n displayName: string;\n mcp: {\n projectPaths: string[];\n globalPaths: string[];\n configKey: string;\n buildEntry: (auth: AuthOptions, transport: Transport) => Record<string, unknown>;\n };\n rule: RuleType;\n skill: {\n name: string;\n dir: (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 projectPaths: [\".mcp.json\"],\n get globalPaths() {\n return [claudeGlobalMcpPath()];\n },\n configKey: \"mcpServers\",\n buildEntry: (auth, transport) =>\n transport === \"stdio\"\n ? stdioEntry(auth)\n : withHeaders({ type: \"http\", url: mcpUrl(auth) }, auth),\n },\n rule: {\n kind: \"file\",\n dir: (scope) =>\n scope === \"global\" ? join(claudeConfigDir(), \"rules\") : join(\".claude\", \"rules\"),\n filename: \"context7.md\",\n },\n skill: {\n name: \"context7-mcp\",\n dir: (scope) =>\n scope === \"global\" ? join(claudeConfigDir(), \"skills\") : join(\".claude\", \"skills\"),\n },\n detect: {\n projectPaths: [\".mcp.json\", \".claude\"],\n get globalPaths() {\n return [claudeConfigDir()];\n },\n },\n },\n\n cursor: {\n name: \"cursor\",\n displayName: \"Cursor\",\n mcp: {\n projectPaths: [join(\".cursor\", \"mcp.json\")],\n globalPaths: [join(homedir(), \".cursor\", \"mcp.json\")],\n configKey: \"mcpServers\",\n buildEntry: (auth, transport) =>\n transport === \"stdio\" ? stdioEntry(auth) : withHeaders({ url: mcpUrl(auth) }, auth),\n },\n rule: {\n kind: \"file\",\n dir: (scope) =>\n scope === \"global\" ? join(homedir(), \".cursor\", \"rules\") : join(\".cursor\", \"rules\"),\n filename: \"context7.mdc\",\n },\n skill: {\n name: \"context7-mcp\",\n dir: (scope) =>\n scope === \"global\" ? join(homedir(), \".cursor\", \"skills\") : join(\".cursor\", \"skills\"),\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 projectPaths: [\"opencode.json\", \"opencode.jsonc\", \".opencode.json\", \".opencode.jsonc\"],\n globalPaths: [\n join(homedir(), \".config\", \"opencode\", \"opencode.json\"),\n join(homedir(), \".config\", \"opencode\", \"opencode.jsonc\"),\n join(homedir(), \".config\", \"opencode\", \".opencode.json\"),\n join(homedir(), \".config\", \"opencode\", \".opencode.jsonc\"),\n ],\n configKey: \"mcp\",\n buildEntry: (auth, transport) =>\n transport === \"stdio\"\n ? { type: \"local\", command: [\"npx\", ...stdioArgs(auth)], enabled: true }\n : withHeaders({ type: \"remote\", url: mcpUrl(auth), enabled: true }, auth),\n },\n rule: {\n kind: \"append\",\n file: (scope) =>\n scope === \"global\" ? join(homedir(), \".config\", \"opencode\", \"AGENTS.md\") : \"AGENTS.md\",\n sectionMarker: \"<!-- context7 -->\",\n },\n skill: {\n name: \"context7-mcp\",\n dir: (scope) =>\n scope === \"global\" ? join(homedir(), \".agents\", \"skills\") : join(\".agents\", \"skills\"),\n },\n detect: {\n projectPaths: [\"opencode.json\", \"opencode.jsonc\", \".opencode.json\", \".opencode.jsonc\"],\n globalPaths: [join(homedir(), \".config\", \"opencode\")],\n },\n },\n\n codex: {\n name: \"codex\",\n displayName: \"Codex\",\n mcp: {\n projectPaths: [join(\".codex\", \"config.toml\")],\n globalPaths: [join(homedir(), \".codex\", \"config.toml\")],\n configKey: \"mcp_servers\",\n buildEntry: (auth, transport) =>\n transport === \"stdio\"\n ? stdioEntry(auth)\n : withHeaders({ type: \"http\", url: mcpUrl(auth) }, auth),\n },\n rule: {\n kind: \"append\",\n file: (scope) => (scope === \"global\" ? join(homedir(), \".codex\", \"AGENTS.md\") : \"AGENTS.md\"),\n sectionMarker: \"<!-- context7 -->\",\n },\n skill: {\n name: \"context7-mcp\",\n dir: (scope) =>\n scope === \"global\" ? join(homedir(), \".agents\", \"skills\") : join(\".agents\", \"skills\"),\n },\n detect: {\n projectPaths: [\".codex\"],\n globalPaths: [join(homedir(), \".codex\")],\n },\n },\n\n gemini: {\n name: \"gemini\",\n displayName: \"Gemini CLI\",\n mcp: {\n projectPaths: [join(\".gemini\", \"settings.json\")],\n globalPaths: [join(homedir(), \".gemini\", \"settings.json\")],\n configKey: \"mcpServers\",\n buildEntry: (auth, transport) =>\n transport === \"stdio\" ? stdioEntry(auth) : withHeaders({ httpUrl: mcpUrl(auth) }, auth),\n },\n rule: {\n kind: \"append\",\n file: (scope) => (scope === \"global\" ? join(homedir(), \".gemini\", \"GEMINI.md\") : \"GEMINI.md\"),\n sectionMarker: \"<!-- context7 -->\",\n },\n skill: {\n name: \"context7-mcp\",\n dir: (scope) =>\n scope === \"global\" ? join(homedir(), \".gemini\", \"skills\") : join(\".gemini\", \"skills\"),\n },\n detect: {\n projectPaths: [\".gemini\"],\n globalPaths: [join(homedir(), \".gemini\")],\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","const GITHUB_RAW_URLS = [\n \"https://raw.githubusercontent.com/upstash/context7/master/rules\",\n \"https://raw.githubusercontent.com/upstash/context7/main/rules\",\n];\n\nconst FALLBACK_MCP = `Use Context7 MCP to fetch current documentation whenever the user asks about a library, framework, SDK, API, CLI tool, or cloud service -- even well-known ones like React, Next.js, Prisma, Express, Tailwind, Django, or Spring Boot. This includes API syntax, configuration, version migration, library-specific debugging, setup instructions, and CLI tool usage. Use even when you think you know the answer -- your training data may not reflect recent changes. Prefer this over web search for library docs.\n\nDo not use for: refactoring, writing scripts from scratch, debugging business logic, code review, or general programming concepts.\n\n## Steps\n\n1. \\`resolve-library-id\\` with the library name and the user's question. Use the official library name with proper punctuation (e.g., \"Next.js\" not \"nextjs\", \"Customer.io\" not \"customerio\", \"Three.js\" not \"threejs\")\n2. Pick the best match by: exact name match, description relevance, code snippet count, source reputation (High/Medium preferred), and benchmark score (higher is better). Use version-specific IDs when the user mentions a version\n3. \\`query-docs\\` with the selected library ID and the user's full question (not single words)\n4. Answer using the fetched docs\n`;\n\nconst FALLBACK_CLI = `Use the \\`ctx7\\` CLI to fetch current documentation whenever the user asks about a library, framework, SDK, API, CLI tool, or cloud service -- even well-known ones like React, Next.js, Prisma, Express, Tailwind, Django, or Spring Boot. This includes API syntax, configuration, version migration, library-specific debugging, setup instructions, and CLI tool usage. Use even when you think you know the answer -- your training data may not reflect recent changes. Prefer this over web search for library docs.\n\nDo not use for: refactoring, writing scripts from scratch, debugging business logic, code review, or general programming concepts.\n\n## Steps\n\n1. Resolve library: \\`npx ctx7@latest library <name> \"<user's question>\"\\`\n2. Pick the best match by: exact name match, description relevance, code snippet count, source reputation (High/Medium preferred), and benchmark score (higher is better). If results don't look right, try the full name with punctuation (e.g., \"next.js\" not \"nextjs\")\n3. Fetch docs: \\`npx ctx7@latest docs <libraryId> \"<user's question>\"\\`\n4. Answer using the fetched documentation\n\nYou MUST call \\`library\\` first to get a valid ID (format: \\`/org/project\\`) unless the user provides one directly. Use the user's full question as the query -- specific and detailed queries return better results than vague single words. Do not run more than 3 commands per question. Do not include sensitive information (API keys, passwords, credentials) in queries.\n\nFor version-specific docs, use \\`/org/project/version\\` from the \\`library\\` output (e.g., \\`/vercel/next.js/v14.3.0\\`).\n\nIf a command fails with a quota error, inform the user and suggest \\`npx ctx7@latest login\\` or setting \\`CONTEXT7_API_KEY\\` env var for higher limits. Do not silently fall back to training data.\n`;\n\nconst CURSOR_FRONTMATTER = `---\\nalwaysApply: true\\n---\\n\\n`;\nconst CODEX_CLI_SANDBOX_GUIDANCE = `Run Context7 CLI requests outside Codex's default sandbox. If a Context7 CLI command fails with DNS or network errors such as ENOTFOUND, host resolution failures, or fetch failed, rerun it outside the sandbox instead of retrying inside the sandbox.`;\n\nexport type RuleMode = \"mcp\" | \"cli\";\n\nasync function fetchRule(filename: string, fallback: string): Promise<string> {\n for (const base of GITHUB_RAW_URLS) {\n try {\n const res = await fetch(`${base}/${filename}`);\n if (res.ok) return await res.text();\n } catch {\n continue;\n }\n }\n return fallback;\n}\n\nexport async function getRuleContent(mode: RuleMode, agent: string): Promise<string> {\n const [filename, fallback] =\n mode === \"mcp\" ? [\"context7-mcp.md\", FALLBACK_MCP] : [\"context7-cli.md\", FALLBACK_CLI];\n let body = await fetchRule(filename, fallback);\n\n if (mode === \"cli\" && agent === \"codex\" && !body.includes(CODEX_CLI_SANDBOX_GUIDANCE)) {\n body = `${body.trimEnd()}\\n${CODEX_CLI_SANDBOX_GUIDANCE}\\n`;\n }\n\n return agent === \"cursor\" ? `${CURSOR_FRONTMATTER}${body}` : body;\n}\n\nexport function customizeSkillFilesForAgent(\n agent: string,\n skillName: string,\n files: Array<{ path: string; content: string }>\n): Array<{ path: string; content: string }> {\n if (agent !== \"codex\" || skillName !== \"find-docs\") {\n return files;\n }\n\n return files.map((file) => {\n if (file.path !== \"SKILL.md\" || file.content.includes(CODEX_CLI_SANDBOX_GUIDANCE)) {\n return file;\n }\n\n const marker = \"## Step 1: Resolve a Library\";\n const guidance = `${CODEX_CLI_SANDBOX_GUIDANCE}\\n\\n`;\n\n if (file.content.includes(marker)) {\n return {\n ...file,\n content: file.content.replace(marker, `${guidance}${marker}`),\n };\n }\n\n const separator = file.content.endsWith(\"\\n\") ? \"\\n\" : \"\\n\\n\";\n return {\n ...file,\n content: `${file.content}${separator}${CODEX_CLI_SANDBOX_GUIDANCE}\\n`,\n };\n });\n}\n","import { access, readFile, writeFile, mkdir } from \"fs/promises\";\nimport { dirname } from \"path\";\nimport { STDIO_PACKAGE } from \"./agents.js\";\n\nfunction stripJsonComments(text: string): string {\n let result = \"\";\n let i = 0;\n while (i < text.length) {\n if (text[i] === '\"') {\n const start = i++;\n while (i < text.length && text[i] !== '\"') {\n if (text[i] === \"\\\\\") i++;\n i++;\n }\n result += text.slice(start, ++i);\n } else if (text[i] === \"/\" && text[i + 1] === \"/\") {\n i += 2;\n while (i < text.length && text[i] !== \"\\n\") i++;\n } else if (text[i] === \"/\" && text[i + 1] === \"*\") {\n i += 2;\n while (i < text.length && !(text[i] === \"*\" && text[i + 1] === \"/\")) i++;\n i += 2;\n } else {\n result += text[i++];\n }\n }\n return result;\n}\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(stripJsonComments(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 const alreadyExists = serverName in section;\n\n return {\n config: {\n ...existing,\n [configKey]: {\n ...section,\n [serverName]: entry,\n },\n },\n alreadyExists,\n };\n}\n\nexport function removeServerEntry(\n existing: Record<string, unknown>,\n configKey: string,\n serverName: string\n): { config: Record<string, unknown>; removed: boolean } {\n const section = existing[configKey];\n if (!section || typeof section !== \"object\" || Array.isArray(section)) {\n return { config: existing, removed: false };\n }\n\n const current = section as Record<string, unknown>;\n if (!(serverName in current)) {\n return { config: existing, removed: false };\n }\n\n const rest = Object.fromEntries(Object.entries(current).filter(([key]) => key !== serverName));\n const next = { ...existing };\n\n if (Object.keys(rest).length === 0) {\n delete next[configKey];\n } else {\n next[configKey] = rest;\n }\n\n return { config: next, removed: true };\n}\n\nexport async function resolveMcpPath(candidates: string[]): Promise<string> {\n for (const candidate of candidates) {\n try {\n await access(candidate);\n return candidate;\n } catch {}\n }\n return candidates[0];\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\nexport async function readTomlServerExists(filePath: string, serverName: string): Promise<boolean> {\n try {\n const raw = await readFile(filePath, \"utf-8\");\n return raw.includes(`[mcp_servers.${serverName}]`);\n } catch {\n return false;\n }\n}\n\n/**\n * Reads the top-level `[mcp_servers.<serverName>]` block from a TOML config\n * file and parses its key-value lines into a JS object. Handles string and\n * array values (TOML array syntax is JSON-compatible). Sub-tables like\n * `[mcp_servers.<serverName>.http_headers]` are ignored. Returns undefined\n * if the file or section is missing.\n */\nexport async function readTomlServerEntry(\n filePath: string,\n serverName: string\n): Promise<Record<string, unknown> | undefined> {\n let raw: string;\n try {\n raw = await readFile(filePath, \"utf-8\");\n } catch {\n return undefined;\n }\n\n const sectionHeader = `[mcp_servers.${serverName}]`;\n const startIdx = raw.indexOf(sectionHeader);\n if (startIdx === -1) return undefined;\n\n // The top-level table's values live between its header and the next `[...]`\n // header (whether that's a sub-table like `[mcp_servers.foo.http_headers]`\n // or an unrelated section). Sub-table values belong to the sub-table, not\n // here, so excluding them is correct.\n const rest = raw.slice(startIdx + sectionHeader.length);\n const nextHeader = /^\\[/m.exec(rest);\n const block = nextHeader ? rest.slice(0, nextHeader.index) : rest;\n\n const entry: Record<string, unknown> = {};\n const lineRe = /^([A-Za-z_][\\w-]*)\\s*=\\s*(.+?)\\s*$/gm;\n let lineMatch: RegExpExecArray | null;\n while ((lineMatch = lineRe.exec(block)) !== null) {\n const [, key, valueText] = lineMatch;\n try {\n entry[key] = JSON.parse(valueText);\n } catch {\n // Skip values we can't parse as JSON (e.g., bare TOML numbers like 20)\n }\n }\n return Object.keys(entry).length > 0 ? entry : undefined;\n}\n\n/**\n * True when `entry` looks like a stdio invocation of `@upstash/context7-mcp`\n * (either `command: \"npx\", args: [..., \"@upstash/context7-mcp\", ...]` or\n * OpenCode-style `command: [\"npx\", ..., \"@upstash/context7-mcp\", ...]`).\n */\nexport function isStdioContext7Entry(entry: unknown): entry is Record<string, unknown> {\n if (!entry || typeof entry !== \"object\") return false;\n const e = entry as Record<string, unknown>;\n const refs = (s: unknown) => typeof s === \"string\" && s.includes(STDIO_PACKAGE);\n\n if (Array.isArray(e.command)) {\n return (e.command as unknown[]).some(refs);\n }\n if (typeof e.command === \"string\" && Array.isArray(e.args)) {\n return (e.args as unknown[]).some(refs);\n }\n return false;\n}\n\n/**\n * Extracts an existing per-server entry from an in-memory JSON config\n * (e.g., the object returned by `readJsonConfig`). Returns `undefined`\n * when the section, server, or entry shape is missing.\n */\nexport function getJsonServerEntry(\n config: Record<string, unknown>,\n configKey: string,\n serverName: string\n): Record<string, unknown> | undefined {\n const section = config[configKey];\n if (!section || typeof section !== \"object\") return undefined;\n const entry = (section as Record<string, unknown>)[serverName];\n return entry && typeof entry === \"object\" ? (entry as Record<string, unknown>) : undefined;\n}\n\nfunction stripApiKeyPair(args: string[]): string[] {\n const result: string[] = [];\n for (let i = 0; i < args.length; i++) {\n if (args[i] === \"--api-key\") {\n i++; // skip the value too\n continue;\n }\n result.push(args[i]);\n }\n return result;\n}\n\n/**\n * Returns a copy of `entry` with any existing `--api-key <value>` pair\n * removed from args (or array-form command), then a new `--api-key <apiKey>`\n * appended when `apiKey` is provided. All other fields — including the\n * package specifier (e.g., `@upstash/context7-mcp@latest`) — are preserved.\n */\nexport function patchStdioApiKey(\n entry: Record<string, unknown>,\n apiKey: string | undefined\n): Record<string, unknown> {\n if (Array.isArray(entry.command)) {\n const cmd = stripApiKeyPair(entry.command as string[]);\n if (apiKey) cmd.push(\"--api-key\", apiKey);\n return { ...entry, command: cmd };\n }\n const args = Array.isArray(entry.args) ? stripApiKeyPair(entry.args as string[]) : [];\n if (apiKey) args.push(\"--api-key\", apiKey);\n return { ...entry, args };\n}\n\nexport function buildTomlServerBlock(serverName: string, entry: Record<string, unknown>): string {\n const lines: string[] = [`[mcp_servers.${serverName}]`];\n const headers = entry.headers as Record<string, string> | undefined;\n\n for (const [key, value] of Object.entries(entry)) {\n if (key === \"headers\") continue;\n lines.push(`${key} = ${JSON.stringify(value)}`);\n }\n\n if (headers && Object.keys(headers).length > 0) {\n lines.push(\"\");\n lines.push(`[mcp_servers.${serverName}.http_headers]`);\n for (const [key, value] of Object.entries(headers)) {\n lines.push(`${key} = ${JSON.stringify(value)}`);\n }\n }\n\n return lines.join(\"\\n\") + \"\\n\";\n}\n\nexport async function appendTomlServer(\n filePath: string,\n serverName: string,\n entry: Record<string, unknown>\n): Promise<{ alreadyExists: boolean }> {\n const block = buildTomlServerBlock(serverName, entry);\n\n let existing = \"\";\n try {\n existing = await readFile(filePath, \"utf-8\");\n } catch {}\n\n const sectionHeader = `[mcp_servers.${serverName}]`;\n const alreadyExists = existing.includes(sectionHeader);\n\n if (alreadyExists) {\n const subPrefix = `[mcp_servers.${serverName}.`;\n const startIdx = existing.indexOf(sectionHeader);\n const rest = existing.slice(startIdx + sectionHeader.length);\n\n let endOffset = rest.length;\n const re = /^\\[/gm;\n let m;\n while ((m = re.exec(rest)) !== null) {\n const lineEnd = rest.indexOf(\"\\n\", m.index);\n const line = rest.slice(m.index, lineEnd === -1 ? undefined : lineEnd);\n if (!line.startsWith(subPrefix)) {\n endOffset = m.index;\n break;\n }\n }\n\n const rawBefore = existing.slice(0, startIdx).replace(/\\n+$/, \"\");\n const rawAfter = existing\n .slice(startIdx + sectionHeader.length + endOffset)\n .replace(/^\\n+/, \"\");\n const before = rawBefore.length > 0 ? rawBefore + \"\\n\\n\" : \"\";\n const after = rawAfter.length > 0 ? \"\\n\" + rawAfter : \"\";\n const content = before + block + after;\n await mkdir(dirname(filePath), { recursive: true });\n await writeFile(filePath, content, \"utf-8\");\n } else {\n const separator =\n existing.length > 0 && !existing.endsWith(\"\\n\") ? \"\\n\\n\" : existing.length > 0 ? \"\\n\" : \"\";\n await mkdir(dirname(filePath), { recursive: true });\n await writeFile(filePath, existing + separator + block, \"utf-8\");\n }\n\n return { alreadyExists };\n}\n\nexport async function removeTomlServer(\n filePath: string,\n serverName: string\n): Promise<{ removed: boolean }> {\n let existing = \"\";\n try {\n existing = await readFile(filePath, \"utf-8\");\n } catch {\n return { removed: false };\n }\n\n const sectionHeader = `[mcp_servers.${serverName}]`;\n const startIdx = existing.indexOf(sectionHeader);\n if (startIdx === -1) {\n return { removed: false };\n }\n\n const subPrefix = `[mcp_servers.${serverName}.`;\n const rest = existing.slice(startIdx + sectionHeader.length);\n\n let endOffset = rest.length;\n const re = /^\\[/gm;\n let match: RegExpExecArray | null;\n while ((match = re.exec(rest)) !== null) {\n const lineEnd = rest.indexOf(\"\\n\", match.index);\n const line = rest.slice(match.index, lineEnd === -1 ? undefined : lineEnd);\n if (!line.startsWith(subPrefix)) {\n endOffset = match.index;\n break;\n }\n }\n\n const rawBefore = existing.slice(0, startIdx).replace(/\\n+$/, \"\");\n const rawAfter = existing.slice(startIdx + sectionHeader.length + endOffset).replace(/^\\n+/, \"\");\n const content = [rawBefore, rawAfter].filter(Boolean).join(\"\\n\\n\");\n\n await mkdir(dirname(filePath), { recursive: true });\n await writeFile(filePath, content.length > 0 ? `${content}\\n` : \"\", \"utf-8\");\n return { removed: true };\n}\n","import { Command } from \"commander\";\nimport pc from \"picocolors\";\nimport ora from \"ora\";\nimport { checkboxWithHover } from \"../utils/prompts.js\";\nimport { log } from \"../utils/logger.js\";\nimport { trackEvent } from \"../utils/tracking.js\";\nimport { ALL_AGENT_NAMES, SETUP_AGENT_NAMES, getAgent, type SetupAgent } from \"../setup/agents.js\";\nimport {\n readJsonConfig,\n readTomlServerExists,\n removeServerEntry,\n writeJsonConfig,\n resolveMcpPath,\n removeTomlServer,\n} from \"../setup/mcp-writer.js\";\nimport { join } from \"path\";\nimport { access, readFile, rm, writeFile } from \"fs/promises\";\n\ntype Scope = \"global\" | \"project\";\ntype UninstallMode = \"mcp\" | \"cli\";\n\ninterface UninstallOptions {\n claude?: boolean;\n cursor?: boolean;\n opencode?: boolean;\n codex?: boolean;\n gemini?: boolean;\n project?: boolean;\n yes?: boolean;\n all?: boolean;\n cli?: boolean;\n mcp?: boolean;\n}\n\ninterface CleanupStatus {\n status: string;\n path: string;\n}\n\ninterface SkillCleanupStatus extends CleanupStatus {\n name: string;\n}\n\ninterface AgentCleanupResult {\n agent: string;\n mcp?: CleanupStatus;\n rule?: CleanupStatus;\n skills?: SkillCleanupStatus[];\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\nconst CONTEXT7_SECTION_MARKER = \"<!-- context7 -->\";\nconst MODE_SKILLS: Record<UninstallMode, readonly string[]> = {\n mcp: [\"context7-mcp\"],\n cli: [\"find-docs\"],\n};\n\nconst MODE_LABELS: Record<UninstallMode, string> = {\n mcp: \"MCP\",\n cli: \"CLI + Skills\",\n};\n\nexport function registerRemoveCommand(program: Command): void {\n program\n .command(\"remove\")\n .alias(\"uninstall\")\n .description(\"Remove Context7 setup from your AI coding agent\")\n .option(\"--claude\", \"Remove from Claude Code\")\n .option(\"--cursor\", \"Remove from Cursor\")\n .option(\"--opencode\", \"Remove from OpenCode\")\n .option(\"--codex\", \"Remove from Codex\")\n .option(\"--gemini\", \"Remove from Gemini CLI\")\n .option(\"--all\", \"Remove both MCP setup and CLI + Skills setup\")\n .option(\"--mcp\", \"Remove MCP setup\")\n .option(\"--cli\", \"Remove CLI + Skills setup\")\n .option(\"-p, --project\", \"Remove from the current project instead of global config\")\n .option(\"-y, --yes\", \"Skip confirmation prompts\")\n .action(async (options: UninstallOptions) => {\n await removeCommand(options);\n });\n}\n\nfunction getSelectedAgents(options: UninstallOptions): 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 if (options.codex) agents.push(\"codex\");\n if (options.gemini) agents.push(\"gemini\");\n return agents;\n}\n\nasync function promptAgents(detected: SetupAgent[]): Promise<SetupAgent[] | null> {\n const choices = detected.map((name) => ({\n name: SETUP_AGENT_NAMES[name],\n value: name,\n }));\n\n if (detected.length > 0) {\n log.dim(`Detected: ${detected.map((agent) => SETUP_AGENT_NAMES[agent]).join(\", \")}`);\n }\n\n try {\n return await checkboxWithHover(\n {\n message: \"Which agents do you want to remove Context7 setup from?\",\n choices,\n loop: false,\n theme: CHECKBOX_THEME,\n },\n { getName: (agent: SetupAgent) => SETUP_AGENT_NAMES[agent] }\n );\n } catch {\n return null;\n }\n}\n\nasync function promptModes(modes: UninstallMode[]): Promise<UninstallMode[] | null> {\n const choices = modes.map((mode) => ({\n name: MODE_LABELS[mode],\n value: mode,\n }));\n\n try {\n return await checkboxWithHover(\n {\n message: \"Which Context7 setup modes do you want to remove?\",\n choices,\n loop: false,\n theme: CHECKBOX_THEME,\n },\n { getName: (mode: UninstallMode) => MODE_LABELS[mode] }\n );\n } catch {\n return null;\n }\n}\n\nasync function resolveAgents(options: UninstallOptions, scope: Scope): Promise<SetupAgent[]> {\n const explicit = getSelectedAgents(options);\n if (explicit.length > 0) return explicit;\n\n const detected = await detectConfiguredAgents(scope);\n if (detected.length > 0 && options.yes) return detected;\n\n if (detected.length === 0) {\n log.warn(\n \"No Context7 setup detected. Pass --claude, --cursor, --opencode, --codex, or --gemini.\"\n );\n return [];\n }\n\n log.blank();\n const selected = await promptAgents(detected);\n if (!selected) {\n log.warn(\"Remove cancelled\");\n return [];\n }\n\n return selected;\n}\n\nfunction resolveFlagModes(options: UninstallOptions): UninstallMode[] {\n if (options.all) return [\"mcp\", \"cli\"];\n\n const selected: UninstallMode[] = [];\n\n if (options.mcp) selected.push(\"mcp\");\n if (options.cli) selected.push(\"cli\");\n\n return selected.length > 0 ? selected : [\"mcp\", \"cli\"];\n}\n\nasync function pathExists(path: string): Promise<boolean> {\n try {\n await access(path);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function hasMcpConfig(agentName: SetupAgent, scope: Scope): Promise<boolean> {\n const agent = getAgent(agentName);\n const candidates =\n scope === \"global\"\n ? agent.mcp.globalPaths\n : agent.mcp.projectPaths.map((path) => join(process.cwd(), path));\n const mcpPath = await resolveMcpPath(candidates);\n\n if (mcpPath.endsWith(\".toml\")) {\n return readTomlServerExists(mcpPath, \"context7\");\n }\n\n let existing: Record<string, unknown>;\n try {\n existing = await readJsonConfig(mcpPath);\n } catch (err) {\n log.warn(\n `Skipped ${mcpPath}: could not parse (${err instanceof Error ? err.message : String(err)})`\n );\n return false;\n }\n const section = existing[agent.mcp.configKey];\n return (\n !!section && typeof section === \"object\" && !Array.isArray(section) && \"context7\" in section\n );\n}\n\nasync function hasRule(agentName: SetupAgent, scope: Scope): Promise<boolean> {\n const agent = getAgent(agentName);\n const rule = agent.rule;\n\n if (rule.kind === \"file\") {\n const ruleDir =\n scope === \"global\" ? rule.dir(\"global\") : join(process.cwd(), rule.dir(\"project\"));\n return pathExists(join(ruleDir, rule.filename));\n }\n\n const filePath =\n scope === \"global\" ? rule.file(\"global\") : join(process.cwd(), rule.file(\"project\"));\n\n try {\n const existing = await readFile(filePath, \"utf-8\");\n return existing.includes(CONTEXT7_SECTION_MARKER);\n } catch {\n return false;\n }\n}\n\nasync function hasSkill(agentName: SetupAgent, scope: Scope, skillName: string): Promise<boolean> {\n const agent = getAgent(agentName);\n const skillsDir =\n scope === \"global\"\n ? agent.skill.dir(\"global\")\n : join(process.cwd(), agent.skill.dir(\"project\"));\n return pathExists(join(skillsDir, skillName));\n}\n\nasync function detectAvailableModes(agents: SetupAgent[], scope: Scope): Promise<UninstallMode[]> {\n let hasMcpArtifacts = false;\n let hasCliArtifacts = false;\n let hasRuleArtifacts = false;\n\n for (const agent of agents) {\n hasMcpArtifacts =\n hasMcpArtifacts ||\n (await hasMcpConfig(agent, scope)) ||\n (await hasSkill(agent, scope, MODE_SKILLS.mcp[0]));\n hasCliArtifacts = hasCliArtifacts || (await hasSkill(agent, scope, MODE_SKILLS.cli[0]));\n hasRuleArtifacts = hasRuleArtifacts || (await hasRule(agent, scope));\n }\n\n const modes: UninstallMode[] = [];\n if (hasMcpArtifacts) modes.push(\"mcp\");\n if (hasCliArtifacts) modes.push(\"cli\");\n\n if (modes.length === 0 && hasRuleArtifacts) {\n return [\"mcp\", \"cli\"];\n }\n\n return modes;\n}\n\nasync function hasAnyContext7Artifacts(agent: SetupAgent, scope: Scope): Promise<boolean> {\n return (\n (await hasMcpConfig(agent, scope)) ||\n (await hasRule(agent, scope)) ||\n (await hasSkill(agent, scope, MODE_SKILLS.mcp[0])) ||\n (await hasSkill(agent, scope, MODE_SKILLS.cli[0]))\n );\n}\n\nasync function detectConfiguredAgents(scope: Scope): Promise<SetupAgent[]> {\n const detected: SetupAgent[] = [];\n\n for (const agent of ALL_AGENT_NAMES) {\n if (await hasAnyContext7Artifacts(agent, scope)) {\n detected.push(agent);\n }\n }\n\n return detected;\n}\n\nasync function resolveModes(\n options: UninstallOptions,\n agents: SetupAgent[],\n scope: Scope\n): Promise<UninstallMode[]> {\n if (options.all || options.mcp || options.cli) {\n return resolveFlagModes(options);\n }\n\n const detectedModes = await detectAvailableModes(agents, scope);\n if (detectedModes.length <= 1) {\n return detectedModes.length === 1 ? detectedModes : [\"mcp\", \"cli\"];\n }\n\n if (options.yes) {\n return detectedModes;\n }\n\n log.blank();\n const selected = await promptModes(detectedModes);\n if (!selected) {\n log.warn(\"Remove cancelled\");\n return [];\n }\n\n return selected;\n}\n\nasync function uninstallMcp(agentName: SetupAgent, scope: Scope): Promise<CleanupStatus> {\n const agent = getAgent(agentName);\n const mcpCandidates =\n scope === \"global\"\n ? agent.mcp.globalPaths\n : agent.mcp.projectPaths.map((path) => join(process.cwd(), path));\n const mcpPath = await resolveMcpPath(mcpCandidates);\n\n try {\n if (mcpPath.endsWith(\".toml\")) {\n const { removed } = await removeTomlServer(mcpPath, \"context7\");\n return { status: removed ? \"removed\" : \"not found\", path: mcpPath };\n }\n\n const existing = await readJsonConfig(mcpPath);\n const { config, removed } = removeServerEntry(existing, agent.mcp.configKey, \"context7\");\n if (removed) {\n await writeJsonConfig(mcpPath, config);\n }\n return { status: removed ? \"removed\" : \"not found\", path: mcpPath };\n } catch (err) {\n return { status: `failed: ${err instanceof Error ? err.message : String(err)}`, path: mcpPath };\n }\n}\n\nasync function uninstallRule(agentName: SetupAgent, scope: Scope): Promise<CleanupStatus> {\n const agent = getAgent(agentName);\n const rule = agent.rule;\n\n if (rule.kind === \"file\") {\n const rulePath =\n scope === \"global\" ? rule.dir(\"global\") : join(process.cwd(), rule.dir(\"project\"));\n const targetPath = join(rulePath, rule.filename);\n\n try {\n await rm(targetPath);\n return { status: \"removed\", path: targetPath };\n } catch (err) {\n const error = err as NodeJS.ErrnoException;\n if (error.code === \"ENOENT\") return { status: \"not found\", path: targetPath };\n return { status: `failed: ${error.message}`, path: targetPath };\n }\n }\n\n const filePath =\n scope === \"global\" ? rule.file(\"global\") : join(process.cwd(), rule.file(\"project\"));\n\n try {\n const existing = await readFile(filePath, \"utf-8\");\n if (!existing.includes(CONTEXT7_SECTION_MARKER)) {\n return { status: \"not found\", path: filePath };\n }\n\n const escapedMarker = CONTEXT7_SECTION_MARKER.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n const updated = existing\n .replace(new RegExp(`\\\\n?${escapedMarker}\\\\n[\\\\s\\\\S]*?${escapedMarker}\\\\n?`, \"m\"), \"\")\n .replace(/\\n{3,}/g, \"\\n\\n\")\n .replace(/^\\n+/, \"\")\n .trimEnd();\n\n if (updated.length === 0) {\n await rm(filePath);\n } else {\n await writeFile(filePath, `${updated}\\n`, \"utf-8\");\n }\n\n return { status: \"removed\", path: filePath };\n } catch (err) {\n const error = err as NodeJS.ErrnoException;\n if (error.code === \"ENOENT\") return { status: \"not found\", path: filePath };\n return { status: `failed: ${error.message}`, path: filePath };\n }\n}\n\nasync function uninstallSkills(\n agentName: SetupAgent,\n scope: Scope,\n skillNames: readonly string[]\n): Promise<SkillCleanupStatus[]> {\n const agent = getAgent(agentName);\n const skillsDir =\n scope === \"global\"\n ? agent.skill.dir(\"global\")\n : join(process.cwd(), agent.skill.dir(\"project\"));\n\n const results: SkillCleanupStatus[] = [];\n\n for (const skillName of skillNames) {\n const skillPath = join(skillsDir, skillName);\n try {\n await rm(skillPath, { recursive: true });\n results.push({ name: skillName, status: \"removed\", path: skillPath });\n } catch (err) {\n const error = err as NodeJS.ErrnoException;\n if (error.code === \"ENOENT\") {\n results.push({ name: skillName, status: \"not found\", path: skillPath });\n } else {\n results.push({ name: skillName, status: `failed: ${error.message}`, path: skillPath });\n }\n }\n }\n\n return results;\n}\n\nasync function uninstallAgent(\n agentName: SetupAgent,\n scope: Scope,\n modes: UninstallMode[]\n): Promise<AgentCleanupResult> {\n const result: AgentCleanupResult = { agent: getAgent(agentName).displayName };\n const skillNames = Array.from(new Set(modes.flatMap((mode) => [...MODE_SKILLS[mode]])));\n const shouldRemoveRule = modes.includes(\"mcp\") || modes.includes(\"cli\");\n\n if (modes.includes(\"mcp\")) {\n result.mcp = await uninstallMcp(agentName, scope);\n }\n\n if (shouldRemoveRule) {\n result.rule = await uninstallRule(agentName, scope);\n }\n\n if (skillNames.length > 0) {\n result.skills = await uninstallSkills(agentName, scope, skillNames);\n }\n\n return result;\n}\n\nfunction iconForStatus(status: string): string {\n if (status === \"removed\") return pc.green(\"-\");\n if (status === \"not found\") return pc.dim(\"~\");\n return pc.red(\"!\");\n}\n\nfunction printResults(results: AgentCleanupResult[], modes: UninstallMode[]): void {\n log.blank();\n const shouldPrintRule = modes.includes(\"mcp\") || modes.includes(\"cli\");\n let hasVisibleResults = false;\n\n for (const result of results) {\n const visibleSkills = result.skills?.filter((skill) => skill.status !== \"not found\") ?? [];\n const showMcp = modes.includes(\"mcp\") && result.mcp && result.mcp.status !== \"not found\";\n const showRule = shouldPrintRule && result.rule && result.rule.status !== \"not found\";\n\n if (!showMcp && !showRule && visibleSkills.length === 0) {\n continue;\n }\n\n hasVisibleResults = true;\n log.plain(` ${pc.bold(result.agent)}`);\n\n if (showMcp && result.mcp) {\n log.plain(` ${iconForStatus(result.mcp.status)} MCP config ${result.mcp.status}`);\n log.plain(` ${pc.dim(result.mcp.path)}`);\n }\n\n if (showRule && result.rule) {\n log.plain(` ${iconForStatus(result.rule.status)} Rule ${result.rule.status}`);\n log.plain(` ${pc.dim(result.rule.path)}`);\n }\n\n for (const skill of visibleSkills) {\n log.plain(` ${iconForStatus(skill.status)} Skill ${skill.name} ${skill.status}`);\n log.plain(` ${pc.dim(skill.path)}`);\n }\n }\n\n if (hasVisibleResults) {\n log.blank();\n } else {\n log.plain(` ${pc.dim(\"No matching Context7 setup was found to remove.\")}`);\n log.blank();\n }\n}\n\nasync function removeCommand(options: UninstallOptions): Promise<void> {\n trackEvent(\"command\", { name: \"remove\" });\n\n const scope: Scope = options.project ? \"project\" : \"global\";\n const agents = await resolveAgents(options, scope);\n if (agents.length === 0) return;\n const modes = await resolveModes(options, agents, scope);\n if (modes.length === 0) return;\n\n log.blank();\n const spinner = ora(\"Removing Context7 setup...\").start();\n\n const results: AgentCleanupResult[] = [];\n for (const agentName of agents) {\n spinner.text = `Cleaning up ${getAgent(agentName).displayName}...`;\n results.push(await uninstallAgent(agentName, scope, modes));\n }\n\n spinner.succeed(\"Context7 cleanup complete\");\n printResults(results, modes);\n\n trackEvent(\"remove\", { agents, scope, modes });\n}\n","import { Command } from \"commander\";\nimport pc from \"picocolors\";\nimport ora from \"ora\";\n\nimport { resolveLibrary, getLibraryContext } from \"../utils/api.js\";\nimport { log } from \"../utils/logger.js\";\nimport { trackEvent } from \"../utils/tracking.js\";\nimport { loadTokens, isTokenExpired } from \"../utils/auth.js\";\nimport type { LibrarySearchResult, ContextResponse } from \"../types.js\";\n\nconst isTTY = process.stdout.isTTY;\n\nfunction getReputationLabel(score: number | undefined): \"High\" | \"Medium\" | \"Low\" | \"Unknown\" {\n if (score === undefined || score < 0) return \"Unknown\";\n if (score >= 7) return \"High\";\n if (score >= 4) return \"Medium\";\n return \"Low\";\n}\n\nfunction getAccessToken(): string | undefined {\n const tokens = loadTokens();\n if (!tokens || isTokenExpired(tokens)) return undefined;\n return tokens.access_token;\n}\n\nfunction formatLibraryResult(lib: LibrarySearchResult, index: number): string {\n const lines: string[] = [];\n lines.push(`${pc.dim(`${index + 1}.`)} ${pc.bold(`Title: ${lib.title}`)}`);\n lines.push(` ${pc.cyan(`Context7-compatible library ID: ${lib.id}`)}`);\n\n if (lib.description) {\n lines.push(` ${pc.dim(`Description: ${lib.description}`)}`);\n }\n\n if (lib.totalSnippets) {\n lines.push(` ${pc.dim(`Code Snippets: ${lib.totalSnippets}`)}`);\n }\n if (lib.trustScore !== undefined) {\n lines.push(` ${pc.dim(`Source Reputation: ${getReputationLabel(lib.trustScore)}`)}`);\n }\n if (lib.benchmarkScore !== undefined && lib.benchmarkScore > 0) {\n lines.push(` ${pc.dim(`Benchmark Score: ${lib.benchmarkScore}`)}`);\n }\n if (lib.versions && lib.versions.length > 0) {\n lines.push(` ${pc.dim(`Versions: ${lib.versions.join(\", \")}`)}`);\n }\n\n return lines.join(\"\\n\");\n}\n\nasync function resolveCommand(\n library: string,\n query: string | undefined,\n options: { json?: boolean }\n): Promise<void> {\n trackEvent(\"command\", { name: \"library\" });\n\n const spinner = isTTY ? ora(`Searching for \"${library}\"...`).start() : null;\n const accessToken = getAccessToken();\n\n let data;\n try {\n data = await resolveLibrary(library, query, accessToken);\n } catch (err) {\n spinner?.fail(`Error: ${err instanceof Error ? err.message : String(err)}`);\n if (!spinner) log.error(err instanceof Error ? err.message : String(err));\n process.exitCode = 1;\n return;\n }\n\n if (data.error) {\n spinner?.fail(data.message || data.error);\n if (!spinner) log.error(data.message || data.error);\n process.exitCode = 1;\n return;\n }\n\n if (!data.results || data.results.length === 0) {\n spinner?.warn(`No libraries found matching \"${library}\"`);\n if (!spinner) log.warn(`No libraries found matching \"${library}\"`);\n return;\n }\n\n const results = data.results;\n\n spinner?.stop();\n\n if (options.json) {\n console.log(JSON.stringify(results, null, 2));\n return;\n }\n\n log.blank();\n\n if (data.searchFilterApplied) {\n log.warn(\n \"Your results only include libraries matching your teamspace's library filters. To adjust quality thresholds or blocked libraries, update your filters at https://context7.com/dashboard?tab=policies\"\n );\n log.blank();\n }\n\n for (let i = 0; i < results.length; i++) {\n log.plain(formatLibraryResult(results[i], i));\n log.blank();\n }\n\n if (isTTY && results.length > 0) {\n const best = results[0];\n log.plain(\n `${pc.bold(\"Quick command:\")}\\n` + ` ${pc.cyan(`ctx7 docs \"${best.id}\" \"<your question>\"`)}`\n );\n log.blank();\n }\n}\n\nasync function queryCommand(\n libraryId: string,\n query: string,\n options: { json?: boolean }\n): Promise<void> {\n trackEvent(\"command\", { name: \"docs\" });\n\n if (!libraryId.startsWith(\"/\") || !/^\\/[^/]+\\/[^/]/.test(libraryId)) {\n log.error(`Invalid library ID: \"${libraryId}\"`);\n log.info(`Expected format: /owner/repo or /owner/repo/version (e.g., /facebook/react)`);\n log.info(`Run \"ctx7 library <name>\" to find the correct ID`);\n process.exitCode = 1;\n return;\n }\n\n const accessToken = getAccessToken();\n\n const spinner = isTTY ? ora(`Fetching docs for \"${libraryId}\"...`).start() : null;\n const outputType = options.json ? \"json\" : \"txt\";\n\n let result;\n try {\n result = await getLibraryContext(libraryId, query, { type: outputType }, accessToken);\n } catch (err) {\n spinner?.fail(`Error: ${err instanceof Error ? err.message : String(err)}`);\n if (!spinner) log.error(err instanceof Error ? err.message : String(err));\n process.exitCode = 1;\n return;\n }\n\n if (typeof result === \"string\") {\n spinner?.stop();\n console.log(result);\n return;\n }\n\n const ctx = result as ContextResponse;\n\n if (ctx.error) {\n if (ctx.redirectUrl) {\n spinner?.warn(\"Library has been redirected\");\n if (!spinner) log.warn(\"Library has been redirected\");\n log.info(`New ID: ${pc.cyan(ctx.redirectUrl)}`);\n log.info(`Run: ${pc.cyan(`ctx7 docs \"${ctx.redirectUrl}\" \"${query}\"`)}`);\n process.exitCode = 1;\n return;\n }\n\n spinner?.fail(ctx.message || ctx.error);\n if (!spinner) log.error(ctx.message || ctx.error);\n process.exitCode = 1;\n return;\n }\n\n const total = (ctx.codeSnippets?.length || 0) + (ctx.infoSnippets?.length || 0);\n if (total === 0) {\n spinner?.warn(`No documentation found for: \"${query}\"`);\n if (!spinner) log.warn(`No documentation found for: \"${query}\"`);\n return;\n }\n\n spinner?.stop();\n\n if (options.json) {\n console.log(JSON.stringify(ctx, null, 2));\n return;\n }\n\n log.blank();\n\n if (ctx.codeSnippets) {\n for (const snippet of ctx.codeSnippets) {\n log.plain(pc.bold(snippet.codeTitle));\n if (snippet.codeDescription) log.dim(snippet.codeDescription);\n log.blank();\n for (const code of snippet.codeList) {\n log.plain(\"```\" + code.language);\n log.plain(code.code);\n log.plain(\"```\");\n log.blank();\n }\n }\n }\n\n if (ctx.infoSnippets) {\n for (const snippet of ctx.infoSnippets) {\n if (snippet.breadcrumb) log.plain(pc.bold(snippet.breadcrumb));\n log.plain(snippet.content);\n log.blank();\n }\n }\n}\n\nexport function registerDocsCommands(program: Command): void {\n program\n .command(\"library\")\n .argument(\"<name>\", \"Library name to search for\")\n .argument(\"[query]\", \"Question or task for relevance ranking\")\n .option(\"--json\", \"Output as JSON\")\n .description(\"Resolve a library name to a Context7 library ID\")\n .action(async (name: string, query: string | undefined, options: { json?: boolean }) => {\n await resolveCommand(name, query, options);\n });\n\n program\n .command(\"docs\")\n .argument(\"<libraryId>\", \"Context7 library ID (e.g., /facebook/react)\")\n .argument(\"<query>\", \"Question or task to get docs for\")\n .option(\"--json\", \"Output as JSON\")\n .description(\"Query documentation for a library\")\n .action(async (libraryId: string, query: string, options: { json?: boolean }) => {\n await queryCommand(libraryId, query, options);\n });\n}\n","import { confirm } from \"@inquirer/prompts\";\nimport { spawn } from \"child_process\";\nimport { Command } from \"commander\";\nimport pc from \"picocolors\";\nimport { VERSION } from \"../constants.js\";\nimport { log } from \"../utils/logger.js\";\nimport { trackEvent } from \"../utils/tracking.js\";\nimport {\n checkForUpdates,\n getUpgradePlan,\n markUpdateNotificationShown,\n shouldShowUpdateNotification,\n shouldSkipUpdateNotifier,\n type UpgradePlan,\n} from \"../utils/update-check.js\";\n\ninterface UpgradeOptions {\n yes?: boolean;\n check?: boolean;\n}\n\nexport function registerUpgradeCommand(program: Command): void {\n program\n .command(\"upgrade\")\n .description(\"Check for a newer ctx7 version and upgrade when possible\")\n .option(\"-y, --yes\", \"Run the suggested upgrade command without prompting\")\n .option(\"--check\", \"Only check for updates without running the upgrade command\")\n .action(async (options: UpgradeOptions) => {\n await upgradeCommand(options);\n });\n}\n\nfunction runCommand(command: string, args: string[]): Promise<number | null> {\n return new Promise((resolve, reject) => {\n const child = spawn(command, args, {\n stdio: \"inherit\",\n shell: process.platform === \"win32\",\n });\n\n child.on(\"error\", reject);\n child.on(\"close\", (code) => resolve(code));\n });\n}\n\nexport async function runUpgradePlan(plan: UpgradePlan): Promise<number | null> {\n return runCommand(plan.command, plan.args);\n}\n\nfunction showUpgradeFailureHelp(plan: UpgradePlan): void {\n log.info(`Try rerunning: ${pc.cyan(plan.displayCommand)}`);\n\n const isGlobalNpmInstall =\n (plan.installMethod === \"npm-global\" || plan.installMethod === \"unknown\") &&\n plan.command === \"npm\" &&\n plan.args.includes(\"-g\");\n const isGlobalAltInstall =\n (plan.installMethod === \"pnpm-global\" || plan.installMethod === \"bun-global\") &&\n plan.args.includes(\"-g\");\n\n if (isGlobalNpmInstall) {\n log.dim(\n \"If this failed due to permissions, your global npm directory may require elevated privileges on this machine.\"\n );\n } else if (isGlobalAltInstall) {\n log.dim(\n \"If this failed due to permissions, your global package manager install location may require additional privileges on this machine.\"\n );\n }\n}\n\nexport async function maybeShowUpgradeNotice(\n options: {\n actionName?: string;\n argv?: string[];\n isInteractive?: boolean;\n } = {}\n): Promise<void> {\n const actionName = options.actionName ?? \"\";\n const argv = options.argv ?? process.argv;\n const isInteractive =\n options.isInteractive ?? Boolean(process.stdout.isTTY && process.stdin.isTTY);\n\n if (!isInteractive || shouldSkipUpdateNotifier(argv) || actionName === \"upgrade\") {\n return;\n }\n\n const info = await checkForUpdates();\n if (!info || !info.updateAvailable || !(await shouldShowUpdateNotification(info))) {\n return;\n }\n\n log.blank();\n if (info.upgradePlan.needsExplicitVersion) {\n log.box([\n `${pc.white(pc.bold(\"Update available:\"))} ${pc.green(pc.bold(`v${info.currentVersion}`))} ${pc.dim(\"->\")} ${pc.green(pc.bold(`v${info.latestVersion}`))}`,\n `${pc.white(\"Use\")} ${pc.yellow(pc.bold(info.upgradePlan.displayCommand))} ${pc.white(\"to run the latest version\")}`,\n ]);\n await markUpdateNotificationShown(info.latestVersion);\n log.blank();\n return;\n }\n\n if (!info.upgradePlan.canRun) {\n log.box([\n `${pc.white(pc.bold(\"Update available:\"))} ${pc.green(pc.bold(`v${info.currentVersion}`))} ${pc.dim(\"->\")} ${pc.green(pc.bold(`v${info.latestVersion}`))}`,\n `${pc.white(\"Run\")} ${pc.yellow(pc.bold(\"ctx7 upgrade\"))} ${pc.white(\"for update steps\")}`,\n `${pc.white(\"Or run\")} ${pc.yellow(info.upgradePlan.displayCommand)}`,\n ]);\n await markUpdateNotificationShown(info.latestVersion);\n log.blank();\n return;\n }\n\n log.box([\n `${pc.white(pc.bold(\"Update available:\"))} ${pc.green(pc.bold(`v${info.currentVersion}`))} ${pc.dim(\"->\")} ${pc.green(pc.bold(`v${info.latestVersion}`))}`,\n `${pc.white(\"Run\")} ${pc.yellow(pc.bold(\"ctx7 upgrade\"))} ${pc.white(\"to update now\")}`,\n `${pc.white(\"Or run\")} ${pc.yellow(info.upgradePlan.displayCommand)}`,\n ]);\n await markUpdateNotificationShown(info.latestVersion);\n log.blank();\n}\n\nasync function upgradeCommand(options: UpgradeOptions): Promise<void> {\n trackEvent(\"command\", { name: \"upgrade\" });\n\n const info = await checkForUpdates({ force: true });\n const plan = info?.upgradePlan ?? getUpgradePlan();\n\n if (!info) {\n log.warn(\"Couldn't check for updates right now.\");\n log.info(`Try again later or run ${pc.cyan(plan.displayCommand)} manually.`);\n return;\n }\n\n if (!info.updateAvailable) {\n log.success(`ctx7 is up to date (${pc.bold(`v${VERSION}`)})`);\n return;\n }\n\n log.blank();\n log.info(\n `Update available: ${pc.bold(`v${info.currentVersion}`)} ${pc.dim(\"->\")} ${pc.bold(`v${info.latestVersion}`)}`\n );\n\n if (plan.needsExplicitVersion) {\n log.info(`You're using an ephemeral runner (${plan.installMethod}).`);\n log.info(`Use ${pc.cyan(plan.displayCommand)} to run the latest version immediately.`);\n log.info(`Or install globally with ${pc.cyan(\"npm install -g ctx7@latest\")}.`);\n return;\n }\n\n if (!plan.canRun) {\n log.info(`Run ${pc.cyan(plan.displayCommand)} to update your installed version.`);\n return;\n }\n\n log.info(`Upgrade command: ${pc.cyan(plan.displayCommand)}`);\n\n if (options.check) {\n return;\n }\n\n let shouldRun = options.yes ?? false;\n if (!shouldRun && process.stdout.isTTY) {\n shouldRun = await confirm({\n message: `Run ${plan.displayCommand} now?`,\n default: true,\n });\n }\n\n if (!shouldRun) {\n log.dim(\"Upgrade skipped.\");\n return;\n }\n\n log.blank();\n const exitCode = await runUpgradePlan(plan);\n\n if (exitCode === 0) {\n log.blank();\n log.success(\"Upgrade complete.\");\n log.info(`Run ${pc.cyan(\"ctx7 --version\")} to verify the installed version.`);\n return;\n }\n\n log.blank();\n log.error(`Upgrade command exited with code ${exitCode ?? \"unknown\"}.`);\n showUpgradeFailureHelp(plan);\n process.exitCode = 1;\n}\n","import { homedir } from \"os\";\nimport { dirname, join } from \"path\";\nimport { mkdir, readFile, writeFile } from \"fs/promises\";\nimport { NAME, VERSION } from \"../constants.js\";\n\nconst DEFAULT_CACHE_TTL_MS = 24 * 60 * 60 * 1000;\nconst UPDATE_STATE_FILE = join(homedir(), \".context7\", \"cli-state.json\");\n\nexport type InstallMethod =\n | \"npm-global\"\n | \"pnpm-global\"\n | \"bun-global\"\n | \"npx\"\n | \"pnpm-dlx\"\n | \"bunx\"\n | \"unknown\";\n\ninterface UpdateState {\n latestVersion?: string;\n lastCheckedAt?: number;\n notifiedVersion?: string;\n lastNotifiedAt?: number;\n}\n\nexport interface UpgradePlan {\n installMethod: InstallMethod;\n command: string;\n args: string[];\n displayCommand: string;\n canRun: boolean;\n needsExplicitVersion: boolean;\n}\n\nexport interface UpdateInfo {\n currentVersion: string;\n latestVersion: string;\n updateAvailable: boolean;\n installMethod: InstallMethod;\n upgradePlan: UpgradePlan;\n}\n\ninterface CheckForUpdatesOptions {\n force?: boolean;\n now?: number;\n cacheTtlMs?: number;\n stateFile?: string;\n}\n\nfunction getStateFilePath(stateFile?: string): string {\n return stateFile ?? UPDATE_STATE_FILE;\n}\n\nasync function readUpdateState(stateFile?: string): Promise<UpdateState> {\n try {\n const raw = await readFile(getStateFilePath(stateFile), \"utf-8\");\n return JSON.parse(raw) as UpdateState;\n } catch {\n return {};\n }\n}\n\nasync function writeUpdateState(state: UpdateState, stateFile?: string): Promise<void> {\n const path = getStateFilePath(stateFile);\n await mkdir(dirname(path), { recursive: true });\n await writeFile(path, JSON.stringify(state, null, 2) + \"\\n\", \"utf-8\");\n}\n\nexport function compareVersions(a: string, b: string): number {\n const normalize = (version: string): number[] =>\n version\n .split(\"-\", 1)[0]\n .split(\".\")\n .map((part) => Number.parseInt(part, 10) || 0);\n\n const left = normalize(a);\n const right = normalize(b);\n const max = Math.max(left.length, right.length);\n\n for (let i = 0; i < max; i++) {\n const diff = (left[i] ?? 0) - (right[i] ?? 0);\n if (diff !== 0) return diff;\n }\n\n return 0;\n}\n\nexport function detectInstallMethod(env: NodeJS.ProcessEnv = process.env): InstallMethod {\n const execPath = env.npm_execpath?.toLowerCase() ?? \"\";\n const npmCommand = env.npm_command?.toLowerCase() ?? \"\";\n const userAgent = env.npm_config_user_agent?.toLowerCase() ?? \"\";\n\n if (execPath.includes(\"pnpm\") && npmCommand === \"dlx\") return \"pnpm-dlx\";\n if (execPath.includes(\"pnpm\")) return \"pnpm-global\";\n if (execPath.includes(\"bun\") && npmCommand === \"x\") return \"bunx\";\n if (execPath.includes(\"bun\")) return \"bun-global\";\n if (execPath.includes(\"npm\") && npmCommand === \"exec\") return \"npx\";\n if (execPath.includes(\"npm\")) return \"npm-global\";\n\n if (userAgent.startsWith(\"pnpm/\")) return \"pnpm-global\";\n if (userAgent.startsWith(\"bun/\")) return \"bun-global\";\n if (userAgent.startsWith(\"npm/\")) return \"npm-global\";\n\n return \"unknown\";\n}\n\nexport function getUpgradePlan(\n installMethod = detectInstallMethod(),\n packageName = NAME\n): UpgradePlan {\n switch (installMethod) {\n case \"pnpm-global\":\n return {\n installMethod,\n command: \"pnpm\",\n args: [\"add\", \"-g\", `${packageName}@latest`],\n displayCommand: `pnpm add -g ${packageName}@latest`,\n canRun: true,\n needsExplicitVersion: false,\n };\n case \"bun-global\":\n return {\n installMethod,\n command: \"bun\",\n args: [\"add\", \"-g\", `${packageName}@latest`],\n displayCommand: `bun add -g ${packageName}@latest`,\n canRun: true,\n needsExplicitVersion: false,\n };\n case \"npx\":\n return {\n installMethod,\n command: \"npx\",\n args: [`${packageName}@latest`],\n displayCommand: `npx ${packageName}@latest <command>`,\n canRun: false,\n needsExplicitVersion: true,\n };\n case \"pnpm-dlx\":\n return {\n installMethod,\n command: \"pnpm\",\n args: [\"dlx\", `${packageName}@latest`],\n displayCommand: `pnpm dlx ${packageName}@latest <command>`,\n canRun: false,\n needsExplicitVersion: true,\n };\n case \"bunx\":\n return {\n installMethod,\n command: \"bunx\",\n args: [`${packageName}@latest`],\n displayCommand: `bunx ${packageName}@latest <command>`,\n canRun: false,\n needsExplicitVersion: true,\n };\n case \"unknown\":\n return {\n installMethod,\n command: \"npm\",\n args: [\"install\", \"-g\", `${packageName}@latest`],\n displayCommand: `npm install -g ${packageName}@latest`,\n canRun: false,\n needsExplicitVersion: false,\n };\n case \"npm-global\":\n default:\n return {\n installMethod: \"npm-global\",\n command: \"npm\",\n args: [\"install\", \"-g\", `${packageName}@latest`],\n displayCommand: `npm install -g ${packageName}@latest`,\n canRun: true,\n needsExplicitVersion: false,\n };\n }\n}\n\nasync function fetchLatestVersion(packageName = NAME): Promise<string | null> {\n try {\n const response = await fetch(\n `https://registry.npmjs.org/${encodeURIComponent(packageName)}/latest`,\n {\n headers: { Accept: \"application/json\" },\n signal: AbortSignal.timeout(1500),\n }\n );\n\n if (!response.ok) return null;\n\n const data = (await response.json()) as { version?: unknown };\n return typeof data.version === \"string\" ? data.version : null;\n } catch {\n return null;\n }\n}\n\nexport async function checkForUpdates(\n options: CheckForUpdatesOptions = {}\n): Promise<UpdateInfo | null> {\n const now = options.now ?? Date.now();\n const cacheTtlMs = options.cacheTtlMs ?? DEFAULT_CACHE_TTL_MS;\n const stateFile = options.stateFile;\n const state = await readUpdateState(stateFile);\n const isStale =\n options.force ||\n !state.lastCheckedAt ||\n now - state.lastCheckedAt >= cacheTtlMs ||\n !state.latestVersion;\n\n let latestVersion = state.latestVersion ?? null;\n\n if (isStale) {\n const fetchedVersion = await fetchLatestVersion();\n if (fetchedVersion) {\n latestVersion = fetchedVersion;\n await writeUpdateState(\n {\n ...state,\n latestVersion: fetchedVersion,\n lastCheckedAt: now,\n },\n stateFile\n );\n }\n }\n\n if (!latestVersion) return null;\n\n const installMethod = detectInstallMethod();\n\n return {\n currentVersion: VERSION,\n latestVersion,\n updateAvailable: compareVersions(latestVersion, VERSION) > 0,\n installMethod,\n upgradePlan: getUpgradePlan(installMethod),\n };\n}\n\nexport async function shouldShowUpdateNotification(\n info: UpdateInfo,\n options: { now?: number; stateFile?: string; cooldownMs?: number } = {}\n): Promise<boolean> {\n if (!info.updateAvailable) return false;\n\n const now = options.now ?? Date.now();\n const cooldownMs = options.cooldownMs ?? DEFAULT_CACHE_TTL_MS;\n const state = await readUpdateState(options.stateFile);\n\n if (\n state.notifiedVersion === info.latestVersion &&\n state.lastNotifiedAt &&\n now - state.lastNotifiedAt < cooldownMs\n ) {\n return false;\n }\n\n return true;\n}\n\nexport async function markUpdateNotificationShown(\n latestVersion: string,\n options: { now?: number; stateFile?: string } = {}\n): Promise<void> {\n const now = options.now ?? Date.now();\n const state = await readUpdateState(options.stateFile);\n await writeUpdateState(\n {\n ...state,\n notifiedVersion: latestVersion,\n lastNotifiedAt: now,\n },\n options.stateFile\n );\n}\n\nexport function shouldSkipUpdateNotifier(argv = process.argv): boolean {\n return argv.includes(\"--json\") || argv.includes(\"-v\") || argv.includes(\"--version\");\n}\n"],"mappings":"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","names":["pc","pc","ora","rm","join","input","path","branch","pathParts","path","dirname","files","error","input","pc","join","dirname","pc","dirname","join","ides","scope","pc","ide","resolve","dirname","resolve","dirname","pc","ora","mkdir","writeFile","join","homedir","select","resolve","baseUrl","pc","baseUrl","program","pc","pc","ora","pc","join","homedir","mkdir","writeFile","resolve","select","homedir","readFile","join","path","pkg","pc","program","input","ora","join","homedir","path","rm","pc","ora","select","mkdir","readFile","writeFile","dirname","join","randomBytes","access","join","homedir","access","readFile","writeFile","mkdir","dirname","readFile","access","mkdir","dirname","writeFile","pc","agents","program","ora","randomBytes","select","join","mkdir","dirname","writeFile","readFile","pc","ora","join","access","readFile","rm","writeFile","CHECKBOX_THEME","pc","program","removeCommand","getSelectedAgents","agents","promptAgents","resolveAgents","pathExists","path","removed","ora","pc","ora","pc","ora","program","confirm","spawn","pc","homedir","dirname","join","mkdir","readFile","writeFile","join","homedir","readFile","path","mkdir","dirname","writeFile","program","resolve","spawn","pc","confirm","pc"]}
|