ctx7 0.5.1 → 0.5.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.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/commands/skill.ts","../src/utils/parse-input.ts","../src/utils/github.ts","../src/utils/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 - Fetch documentation context and configure Context7\")\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(\"# Configure Context7 for your coding agent\")}\n ${brand.primary(\"npx ctx7 setup\")}\n ${brand.primary(\"npx ctx7 setup --mcp\")}\n ${brand.primary(\"npx ctx7 setup --cli\")}\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`\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(\" Documentation context for AI coding agents\"));\n console.log(\"\");\n\n console.log(\" Quick start:\");\n console.log(` ${brand.primary(\"npx ctx7 setup\")}`);\n console.log(` ${brand.primary('npx ctx7 docs /facebook/react \"useEffect examples\"')}`);\n console.log(\"\");\n\n console.log(` Run ${brand.primary(\"npx ctx7 --help\")} for all commands and options`);\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\nconst SKILL_HUB_DEPRECATION_WARNING =\n \"Warning: Skill commands are deprecated and will stop working in the next major release.\";\n\n// TODO(deprecate-skills-phase-2): Delete this Skill Hub command tree once the\n// deprecated `ctx7 skills ...` compatibility window closes. Do not remove the\n// setup-installed Context7 skills with it.\nfunction warnSkillHubDeprecated(): void {\n console.error(pc.yellow(SKILL_HUB_DEPRECATION_WARNING));\n console.error(\"\");\n}\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\n .command(\"skills\", { hidden: true })\n .alias(\"skill\")\n .description(\"Manage AI coding skills\")\n .hook(\"preAction\", () => {\n warnSkillHubDeprecated();\n });\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(\"--json\", \"Output as JSON\")\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 warnSkillHubDeprecated();\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 warnSkillHubDeprecated();\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 warnSkillHubDeprecated();\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 = s.url || `https://github.com${s.project}`;\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(s.name, s.url || `https://github.com${s.project}`, 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} ${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: {\n label: string;\n displayPath: string;\n dir: string;\n source: string;\n skills: string[];\n }[] = [];\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, displayPath: dir, dir, source: ide, 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({\n label: UNIVERSAL_AGENTS_LABEL,\n displayPath: universalPath,\n dir: universalDir,\n source: \"universal\",\n skills: universalSkills,\n });\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({\n label: IDE_NAMES[ide],\n displayPath: pathMap[ide],\n dir,\n source: ide,\n skills,\n });\n }\n }\n }\n\n if (options.json) {\n const skills = results.flatMap((result) =>\n result.skills.map((name) => ({\n name,\n path: join(result.dir, name),\n source: result.source,\n }))\n );\n\n console.log(JSON.stringify({ skills }, null, 2));\n return;\n }\n\n if (results.length === 0) {\n log.warn(\"No skills installed\");\n return;\n }\n\n log.blank();\n\n for (const { label, displayPath, skills } of results) {\n log.plain(`${pc.bold(label)} ${pc.dim(displayPath)}`);\n for (const skill of skills) {\n log.plain(` ${pc.green(skill)}`);\n }\n log.blank();\n }\n}\n\nasync function removeCommand(name: string, options: RemoveOptions): Promise<void> {\n trackEvent(\"command\", { name: \"remove\" });\n const target = await promptForSingleTarget(options);\n if (!target) {\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(s.name, s.url || `https://github.com${s.project}`, 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(\"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\n// TODO(deprecate-skills-phase-2): Remove direct GitHub Skill Hub fallback when\n// deprecated `ctx7 skills install/info` commands are deleted.\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\n// TODO(deprecate-skills-phase-2): Remove the Skill Hub API helpers in this file\n// when deprecated `ctx7 skills ...` commands are deleted.\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\n// TODO(deprecate-skills-phase-2): Remove Skill Hub response types when\n// deprecated `ctx7 skills ...` commands are deleted. Keep setup skill directory\n// types below.\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 & { json?: boolean };\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\n// TODO(deprecate-skills-phase-2): Remove this deprecated Skill Hub generation\n// subcommand after legacy `ctx7 skills generate` support is dropped.\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 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\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. Returns null if no\n * tokens are stored or refresh fails. Pre-0.5 installs may have OAuth tokens\n * with a `refresh_token`; new installs hold long-lived API keys that never\n * expire and skip the refresh path entirely.\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\ninterface TokenErrorResponse {\n error?: string;\n error_description?: string;\n}\n\nexport interface DeviceAuthorizationResponse {\n device_code: string;\n user_code: string;\n verification_uri: string;\n verification_uri_complete?: string;\n expires_in: number;\n /** Optional per RFC 8628 §3.2; clients MUST default to 5s when absent. */\n interval?: number;\n}\n\nconst DEVICE_CODE_GRANT = \"urn:ietf:params:oauth:grant-type:device_code\";\n\n/** RFC 8628 §3.2 default poll interval when the server omits `interval`. */\nexport const DEFAULT_DEVICE_POLL_INTERVAL_SECONDS = 5;\n\nexport async function startDeviceAuthorization(\n baseUrl: string,\n clientId: string\n): Promise<DeviceAuthorizationResponse> {\n // Hostname is shown on the server's verification page so the user can confirm\n // that the device they're authorizing matches the one running the CLI\n // (RFC 8628 §5.4 phishing resistance). Best-effort.\n const params = new URLSearchParams({ client_id: clientId });\n try {\n const hostname = os.hostname();\n if (hostname) params.set(\"hostname\", hostname);\n } catch {\n // ignore\n }\n\n const response = await fetch(`${baseUrl}/api/oauth/device/code`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/x-www-form-urlencoded\" },\n body: params.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 start device authorization\");\n }\n\n return (await response.json()) as DeviceAuthorizationResponse;\n}\n\nexport interface PollDeviceTokenResult {\n status: \"approved\" | \"pending\" | \"slow_down\" | \"denied\" | \"expired\" | \"transient\";\n tokens?: TokenData;\n errorMessage?: string;\n}\n\nexport async function pollDeviceToken(\n baseUrl: string,\n clientId: string,\n deviceCode: string\n): Promise<PollDeviceTokenResult> {\n let response: Response;\n try {\n response = await fetch(`${baseUrl}/api/oauth/device/token`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/x-www-form-urlencoded\" },\n body: new URLSearchParams({\n grant_type: DEVICE_CODE_GRANT,\n device_code: deviceCode,\n client_id: clientId,\n }).toString(),\n });\n } catch (error) {\n // Network blip — keep polling.\n return {\n status: \"transient\",\n errorMessage: error instanceof Error ? error.message : \"network error\",\n };\n }\n\n if (response.ok) {\n const tokens = (await response.json()) as TokenData;\n return { status: \"approved\", tokens };\n }\n\n // Treat any 5xx as transient so a flaky backend doesn't end the user's session.\n if (response.status >= 500) {\n const err = (await response.json().catch(() => ({}))) as TokenErrorResponse;\n return {\n status: \"transient\",\n errorMessage: err.error_description || err.error || `HTTP ${response.status}`,\n };\n }\n\n const err = (await response.json().catch(() => ({}))) as TokenErrorResponse;\n switch (err.error) {\n case \"authorization_pending\":\n return { status: \"pending\" };\n case \"slow_down\":\n return { status: \"slow_down\" };\n case \"access_denied\":\n return { status: \"denied\" };\n case \"expired_token\":\n return { status: \"expired\" };\n default:\n throw new Error(err.error_description || err.error || \"Device token poll failed\");\n }\n}\n","import { Command } from \"commander\";\nimport pc from \"picocolors\";\nimport ora from \"ora\";\nimport open from \"open\";\nimport boxen from \"boxen\";\nimport {\n saveTokens,\n clearTokens,\n getValidAccessToken,\n startDeviceAuthorization,\n pollDeviceToken,\n DEFAULT_DEVICE_POLL_INTERVAL_SECONDS,\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\nfunction renderDeviceCodeBox(\n userCode: string,\n verificationUri: string,\n verificationUriComplete: string | undefined\n): string {\n const codeLine = `${pc.dim(\"Your one-time code:\")}\\n\\n ${pc.green(pc.bold(userCode))}`;\n // Per RFC 8628 §3.3, even when verification_uri_complete is available we\n // still show the bare verification_uri so users on screen readers / paper\n // can type it manually.\n const linkLine = verificationUriComplete\n ? `${pc.dim(\"Open this link to approve:\")}\\n${pc.cyan(verificationUriComplete)}\\n\\n${pc.dim(\"Or visit\")} ${pc.cyan(verificationUri)} ${pc.dim(\"and enter the code above.\")}`\n : `${pc.dim(\"Visit:\")} ${pc.cyan(verificationUri)}`;\n return boxen(`${codeLine}\\n\\n${linkLine}`, {\n title: \"Sign in to Context7\",\n titleAlignment: \"left\",\n padding: 1,\n margin: { top: 1, bottom: 1, left: 2, right: 2 },\n borderStyle: \"round\",\n borderColor: \"gray\",\n });\n}\n\n/** Prints a prompt and resolves on the next keypress. No-op when stdin isn't a TTY. */\nfunction waitForEnter(prompt: string): Promise<void> {\n if (!process.stdin.isTTY) return Promise.resolve();\n return new Promise<void>((resolve) => {\n process.stdout.write(` ${pc.dim(prompt)} `);\n const onData = (chunk: Buffer) => {\n // Ctrl-C\n if (chunk[0] === 0x03) {\n process.stdin.removeListener(\"data\", onData);\n process.stdin.setRawMode?.(false);\n process.stdin.pause();\n process.stdout.write(\"\\n\");\n process.exit(130);\n }\n process.stdin.removeListener(\"data\", onData);\n process.stdin.setRawMode?.(false);\n process.stdin.pause();\n process.stdout.write(\"\\n\");\n resolve();\n };\n process.stdin.setRawMode?.(true);\n process.stdin.resume();\n process.stdin.on(\"data\", onData);\n });\n}\n\nasync function announceIdentity(accessToken: string): Promise<string> {\n try {\n const whoami = await fetchWhoami(accessToken);\n const name = whoami.email || whoami.name;\n if (!name) return \"Login successful!\";\n const team = whoami.teamspace?.name;\n return team\n ? `Logged in as ${pc.bold(name)} ${pc.dim(`(${team})`)}`\n : `Logged in as ${pc.bold(name)}`;\n } catch {\n return \"Login successful!\";\n }\n}\n\nexport async function performLogin(openBrowser = true): Promise<string | null> {\n const spinner = ora(\"Preparing login...\").start();\n\n let authorization;\n try {\n authorization = await startDeviceAuthorization(baseUrl, CLI_CLIENT_ID);\n } catch (error) {\n spinner.fail(pc.red(\"Login failed\"));\n if (error instanceof Error) console.error(pc.red(error.message));\n return null;\n }\n\n spinner.stop();\n\n console.log(\n renderDeviceCodeBox(\n authorization.user_code,\n authorization.verification_uri,\n authorization.verification_uri_complete\n )\n );\n\n const target = authorization.verification_uri_complete ?? authorization.verification_uri;\n if (openBrowser) {\n await waitForEnter(\"Press Enter to open the browser, or Ctrl-C to quit...\");\n try {\n await open(target);\n } catch {\n console.log(pc.dim(` Couldn't open a browser — visit the link above manually.`));\n }\n } else {\n console.log(pc.dim(\" Open the link above in any browser to continue.\"));\n console.log(\"\");\n }\n\n const waitingSpinner = ora({ text: \"Waiting for authorization...\", indent: 2 }).start();\n\n const deadline = Date.now() + authorization.expires_in * 1000;\n let intervalMs = (authorization.interval ?? DEFAULT_DEVICE_POLL_INTERVAL_SECONDS) * 1000;\n\n while (Date.now() < deadline) {\n await new Promise((resolve) => setTimeout(resolve, intervalMs));\n try {\n const result = await pollDeviceToken(baseUrl, CLI_CLIENT_ID, authorization.device_code);\n if (result.status === \"approved\" && result.tokens) {\n saveTokens(result.tokens);\n const successText = await announceIdentity(result.tokens.access_token);\n waitingSpinner.succeed(pc.green(successText));\n return result.tokens.access_token;\n }\n if (result.status === \"slow_down\") {\n intervalMs += 5000;\n continue;\n }\n if (result.status === \"denied\") {\n waitingSpinner.fail(pc.red(\"Authorization denied.\"));\n return null;\n }\n if (result.status === \"expired\") {\n waitingSpinner.fail(pc.red(\"Code expired. Run login again.\"));\n return null;\n }\n if (result.status === \"transient\") {\n // RFC 8628 §3.5: client MUST unilaterally reduce polling frequency on\n // connection timeout. Apply +5s like slow_down so a flaky network or\n // 5xx burst doesn't keep hitting at the original cadence.\n intervalMs += 5000;\n continue;\n }\n // pending — keep polling at the current cadence.\n } catch (error) {\n waitingSpinner.fail(pc.red(\"Login failed\"));\n if (error instanceof Error) console.error(pc.red(error.message));\n return null;\n }\n }\n\n waitingSpinner.fail(pc.red(\"Code expired without approval.\"));\n return null;\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 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.antigravity) agents.push(\"antigravity\");\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(\"--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.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\" || agent.mcp.projectPaths.length === 0\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\" | \"antigravity\" | \"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 antigravity: \"Antigravity\",\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 // Antigravity is built on Gemini infrastructure and shares ~/.gemini/. Per\n // the official Codelabs guide, Antigravity 2.0/IDE/CLI read MCP servers from\n // ~/.gemini/config/mcp_config.json globally; there is no project-level MCP\n // config, so projectPaths is empty and setupAgent falls back to global.\n antigravity: {\n name: \"antigravity\",\n displayName: \"Antigravity\",\n mcp: {\n projectPaths: [],\n globalPaths: [join(homedir(), \".gemini\", \"config\", \"mcp_config.json\")],\n configKey: \"mcpServers\",\n buildEntry: (auth, transport) =>\n transport === \"stdio\" ? stdioEntry(auth) : withHeaders({ serverUrl: 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(), \".agent\", \"skills\") : join(\".agent\", \"skills\"),\n },\n detect: {\n projectPaths: [\".agent\"],\n globalPaths: [join(homedir(), \".gemini\", \"antigravity\"), join(homedir(), \".agent\")],\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 antigravity?: 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(\"--antigravity\", \"Remove from Antigravity\")\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.antigravity) agents.push(\"antigravity\");\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, --antigravity, 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 // Agents with no project-level MCP (e.g. Antigravity) only have a global\n // config — there's nothing to detect at project scope.\n if (scope === \"project\" && agent.mcp.projectPaths.length === 0) return false;\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 if (scope === \"project\" && agent.mcp.projectPaths.length === 0) {\n return { status: \"not found\", path: \"\" };\n }\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","baseUrl","hostname","err","pc","baseUrl","program","pc","resolve","pc","ora","pc","join","homedir","mkdir","writeFile","resolve","select","homedir","readFile","join","path","pkg","pc","program","input","ora","join","homedir","rm","pc","ora","select","mkdir","readFile","writeFile","dirname","join","access","join","homedir","access","readFile","writeFile","mkdir","dirname","readFile","access","mkdir","dirname","writeFile","pc","agents","program","ora","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/utils/storage-paths.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/utils/library-id.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 - Fetch documentation context and configure Context7\")\n .version(VERSION, \"-v, --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(\"# Configure Context7 for your coding agent\")}\n ${brand.primary(\"npx ctx7 setup\")}\n ${brand.primary(\"npx ctx7 setup --mcp\")}\n ${brand.primary(\"npx ctx7 setup --cli\")}\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`\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(\" Documentation context for AI coding agents\"));\n console.log(\"\");\n\n console.log(\" Quick start:\");\n console.log(` ${brand.primary(\"npx ctx7 setup\")}`);\n console.log(` ${brand.primary('npx ctx7 docs /facebook/react \"useEffect examples\"')}`);\n console.log(\"\");\n\n console.log(` Run ${brand.primary(\"npx ctx7 --help\")} for all commands and options`);\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\nconst SKILL_HUB_DEPRECATION_WARNING =\n \"Warning: Skill commands are deprecated and will stop working in the next major release.\";\n\n// TODO(deprecate-skills-phase-2): Delete this Skill Hub command tree once the\n// deprecated `ctx7 skills ...` compatibility window closes. Do not remove the\n// setup-installed Context7 skills with it.\nfunction warnSkillHubDeprecated(): void {\n console.error(pc.yellow(SKILL_HUB_DEPRECATION_WARNING));\n console.error(\"\");\n}\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\n .command(\"skills\", { hidden: true })\n .alias(\"skill\")\n .description(\"Manage AI coding skills\")\n .hook(\"preAction\", () => {\n warnSkillHubDeprecated();\n });\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(\"--json\", \"Output as JSON\")\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 warnSkillHubDeprecated();\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 warnSkillHubDeprecated();\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 warnSkillHubDeprecated();\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 = s.url || `https://github.com${s.project}`;\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(s.name, s.url || `https://github.com${s.project}`, 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} ${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: {\n label: string;\n displayPath: string;\n dir: string;\n source: string;\n skills: string[];\n }[] = [];\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, displayPath: dir, dir, source: ide, 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({\n label: UNIVERSAL_AGENTS_LABEL,\n displayPath: universalPath,\n dir: universalDir,\n source: \"universal\",\n skills: universalSkills,\n });\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({\n label: IDE_NAMES[ide],\n displayPath: pathMap[ide],\n dir,\n source: ide,\n skills,\n });\n }\n }\n }\n\n if (options.json) {\n const skills = results.flatMap((result) =>\n result.skills.map((name) => ({\n name,\n path: join(result.dir, name),\n source: result.source,\n }))\n );\n\n console.log(JSON.stringify({ skills }, null, 2));\n return;\n }\n\n if (results.length === 0) {\n log.warn(\"No skills installed\");\n return;\n }\n\n log.blank();\n\n for (const { label, displayPath, skills } of results) {\n log.plain(`${pc.bold(label)} ${pc.dim(displayPath)}`);\n for (const skill of skills) {\n log.plain(` ${pc.green(skill)}`);\n }\n log.blank();\n }\n}\n\nasync function removeCommand(name: string, options: RemoveOptions): Promise<void> {\n trackEvent(\"command\", { name: \"remove\" });\n const target = await promptForSingleTarget(options);\n if (!target) {\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(s.name, s.url || `https://github.com${s.project}`, 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(\"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 extractGitHubError(response: Response): Promise<string> {\n let detail = `HTTP ${response.status}`;\n try {\n const body = (await response.json()) as { message?: string };\n if (body.message) detail += `: ${body.message}`;\n } catch {}\n return detail;\n}\n\nasync function fetchRepoTree(\n owner: string,\n repo: string,\n branch: string,\n headers: Record<string, string>\n): Promise<GitHubTreeResponse | { error: string }> {\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 { error: await extractGitHubError(response) };\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 } | { error: string; status: number }> {\n const response = await fetch(`${GITHUB_API}/repos/${owner}/${repo}`, { headers });\n if (!response.ok) return { error: await extractGitHubError(response), 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\n// TODO(deprecate-skills-phase-2): Remove direct GitHub Skill Hub fallback when\n// deprecated `ctx7 skills install/info` commands are deleted.\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 (\"error\" in branchResult) {\n if (branchResult.status === 404) return { status: \"repo_not_found\" };\n return { status: \"error\", error: branchResult.error };\n }\n\n const treeData = await fetchRepoTree(owner, repo, branchResult.branch, headers);\n if (\"error\" in treeData) return { status: \"error\", error: treeData.error };\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 (\"error\" in treeData) {\n const hint =\n !ghHeaders[\"Authorization\"] && /403|429|rate/.test(treeData.error)\n ? \" — run `gh auth login` or set the GITHUB_TOKEN env var to increase rate limits\"\n : \"\";\n return { files: [], error: `GitHub API error: ${treeData.error}${hint}` };\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\n// TODO(deprecate-skills-phase-2): Remove the Skill Hub API helpers in this file\n// when deprecated `ctx7 skills ...` commands are deleted.\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\n// TODO(deprecate-skills-phase-2): Remove Skill Hub response types when\n// deprecated `ctx7 skills ...` commands are deleted. Keep setup skill directory\n// types below.\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 & { json?: boolean };\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 { getPreviewsDir } from \"../utils/storage-paths.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\n// TODO(deprecate-skills-phase-2): Remove this deprecated Skill Hub generation\n// subcommand after legacy `ctx7 skills generate` support is dropped.\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 = getPreviewsDir();\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 fs from \"fs\";\nimport * as os from \"os\";\nimport { CLI_CLIENT_ID } from \"../constants.js\";\nimport { getBaseUrl } from \"./api.js\";\nimport {\n CREDENTIALS_FILE_NAME,\n getConfigDir,\n getCredentialsFilePath,\n getLegacyFilePath,\n migrateLegacyFileSync,\n resolveReadPathSync,\n} from \"./storage-paths.js\";\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\nfunction ensureConfigDir(): void {\n const configDir = getConfigDir();\n if (!fs.existsSync(configDir)) {\n fs.mkdirSync(configDir, { recursive: true, mode: 0o700 });\n }\n}\n\n// Credentials must never be group/world-readable, even if a migrated or\n// pre-existing file carried looser permissions.\nconst CREDENTIALS_MODE = 0o600;\n\nexport function saveTokens(tokens: TokenData): void {\n const credentialsFile = getCredentialsFilePath();\n migrateLegacyFileSync(CREDENTIALS_FILE_NAME, credentialsFile, CREDENTIALS_MODE);\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(credentialsFile, JSON.stringify(data, null, 2), { mode: CREDENTIALS_MODE });\n // `mode` is ignored when the file already exists; enforce it explicitly.\n fs.chmodSync(credentialsFile, CREDENTIALS_MODE);\n}\n\nexport function loadTokens(): TokenData | null {\n const credentialsFile = resolveReadPathSync(\n CREDENTIALS_FILE_NAME,\n getCredentialsFilePath(),\n CREDENTIALS_MODE\n );\n if (!fs.existsSync(credentialsFile)) {\n return null;\n }\n try {\n const data = JSON.parse(fs.readFileSync(credentialsFile, \"utf-8\"));\n return data as TokenData;\n } catch {\n return null;\n }\n}\n\nexport function clearTokens(): boolean {\n const credentialsFile = getCredentialsFilePath();\n let removed = false;\n if (fs.existsSync(credentialsFile)) {\n fs.unlinkSync(credentialsFile);\n removed = true;\n }\n const legacyCredentialsFile = getLegacyFilePath(CREDENTIALS_FILE_NAME);\n if (fs.existsSync(legacyCredentialsFile)) {\n fs.unlinkSync(legacyCredentialsFile);\n removed = true;\n }\n return removed;\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. Returns null if no\n * tokens are stored or refresh fails. Pre-0.5 installs may have OAuth tokens\n * with a `refresh_token`; new installs hold long-lived API keys that never\n * expire and skip the refresh path entirely.\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\ninterface TokenErrorResponse {\n error?: string;\n error_description?: string;\n}\n\nexport interface DeviceAuthorizationResponse {\n device_code: string;\n user_code: string;\n verification_uri: string;\n verification_uri_complete?: string;\n expires_in: number;\n /** Optional per RFC 8628 §3.2; clients MUST default to 5s when absent. */\n interval?: number;\n}\n\nconst DEVICE_CODE_GRANT = \"urn:ietf:params:oauth:grant-type:device_code\";\n\n/** RFC 8628 §3.2 default poll interval when the server omits `interval`. */\nexport const DEFAULT_DEVICE_POLL_INTERVAL_SECONDS = 5;\n\nexport async function startDeviceAuthorization(\n baseUrl: string,\n clientId: string\n): Promise<DeviceAuthorizationResponse> {\n // Hostname is shown on the server's verification page so the user can confirm\n // that the device they're authorizing matches the one running the CLI\n // (RFC 8628 §5.4 phishing resistance). Best-effort.\n const params = new URLSearchParams({ client_id: clientId });\n try {\n const hostname = os.hostname();\n if (hostname) params.set(\"hostname\", hostname);\n } catch {\n // ignore\n }\n\n const response = await fetch(`${baseUrl}/api/oauth/device/code`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/x-www-form-urlencoded\" },\n body: params.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 start device authorization\");\n }\n\n return (await response.json()) as DeviceAuthorizationResponse;\n}\n\nexport interface PollDeviceTokenResult {\n status: \"approved\" | \"pending\" | \"slow_down\" | \"denied\" | \"expired\" | \"transient\";\n tokens?: TokenData;\n errorMessage?: string;\n}\n\nexport async function pollDeviceToken(\n baseUrl: string,\n clientId: string,\n deviceCode: string\n): Promise<PollDeviceTokenResult> {\n let response: Response;\n try {\n response = await fetch(`${baseUrl}/api/oauth/device/token`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/x-www-form-urlencoded\" },\n body: new URLSearchParams({\n grant_type: DEVICE_CODE_GRANT,\n device_code: deviceCode,\n client_id: clientId,\n }).toString(),\n });\n } catch (error) {\n // Network blip — keep polling.\n return {\n status: \"transient\",\n errorMessage: error instanceof Error ? error.message : \"network error\",\n };\n }\n\n if (response.ok) {\n const tokens = (await response.json()) as TokenData;\n return { status: \"approved\", tokens };\n }\n\n // Treat any 5xx as transient so a flaky backend doesn't end the user's session.\n if (response.status >= 500) {\n const err = (await response.json().catch(() => ({}))) as TokenErrorResponse;\n return {\n status: \"transient\",\n errorMessage: err.error_description || err.error || `HTTP ${response.status}`,\n };\n }\n\n const err = (await response.json().catch(() => ({}))) as TokenErrorResponse;\n switch (err.error) {\n case \"authorization_pending\":\n return { status: \"pending\" };\n case \"slow_down\":\n return { status: \"slow_down\" };\n case \"access_denied\":\n return { status: \"denied\" };\n case \"expired_token\":\n return { status: \"expired\" };\n default:\n throw new Error(err.error_description || err.error || \"Device token poll failed\");\n }\n}\n","import * as fs from \"fs\";\nimport { access, chmod, mkdir, rename } from \"fs/promises\";\nimport * as os from \"os\";\nimport * as path from \"path\";\n\nconst APP_DIR = \"context7\";\nconst LEGACY_DIR = \".context7\";\n\nexport const CREDENTIALS_FILE_NAME = \"credentials.json\";\nexport const UPDATE_STATE_FILE_NAME = \"cli-state.json\";\nexport const PREVIEWS_DIR_NAME = \"previews\";\n\n// Per the XDG Base Directory Spec, a relative (or empty) value must be ignored\n// and the default used instead.\nfunction xdgBase(envVar: string, ...defaultSegments: string[]): string {\n const value = process.env[envVar];\n const base =\n value && path.isAbsolute(value) ? value : path.join(os.homedir(), ...defaultSegments);\n return path.join(base, APP_DIR);\n}\n\nexport function getConfigDir(): string {\n return xdgBase(\"XDG_CONFIG_HOME\", \".config\");\n}\n\nexport function getStateDir(): string {\n return xdgBase(\"XDG_STATE_HOME\", \".local\", \"state\");\n}\n\nexport function getCacheDir(): string {\n return xdgBase(\"XDG_CACHE_HOME\", \".cache\");\n}\n\nexport function getCredentialsFilePath(): string {\n return path.join(getConfigDir(), CREDENTIALS_FILE_NAME);\n}\n\nexport function getUpdateStateFilePath(): string {\n return path.join(getStateDir(), UPDATE_STATE_FILE_NAME);\n}\n\nexport function getPreviewsDir(): string {\n return path.join(getCacheDir(), PREVIEWS_DIR_NAME);\n}\n\nexport function getLegacyFilePath(fileName: string): string {\n return path.join(os.homedir(), LEGACY_DIR, fileName);\n}\n\n/**\n * Best-effort move of a legacy `~/.context7/<file>` into its new XDG location.\n * `rename` preserves the source's permissions, so callers pass `mode` for\n * sensitive files (e.g. credentials) to re-assert a restrictive mode on the\n * migrated file. Failures (cross-device rename, permissions) are swallowed so\n * callers fall back to reading the legacy file rather than crashing.\n */\nexport function migrateLegacyFileSync(fileName: string, targetPath: string, mode?: number): void {\n const legacyPath = getLegacyFilePath(fileName);\n if (legacyPath === targetPath || fs.existsSync(targetPath) || !fs.existsSync(legacyPath)) {\n return;\n }\n\n try {\n fs.mkdirSync(path.dirname(targetPath), { recursive: true, mode: 0o700 });\n fs.renameSync(legacyPath, targetPath);\n if (mode !== undefined) {\n fs.chmodSync(targetPath, mode);\n }\n } catch {\n // Leave the legacy file in place; readers resolve to it via resolveReadPathSync.\n }\n}\n\nexport async function migrateLegacyFile(\n fileName: string,\n targetPath: string,\n mode?: number\n): Promise<void> {\n const legacyPath = getLegacyFilePath(fileName);\n if (legacyPath === targetPath || (await exists(targetPath)) || !(await exists(legacyPath))) {\n return;\n }\n\n try {\n await mkdir(path.dirname(targetPath), { recursive: true, mode: 0o700 });\n await rename(legacyPath, targetPath);\n if (mode !== undefined) {\n await chmod(targetPath, mode);\n }\n } catch {\n // Leave the legacy file in place; readers resolve to it via resolveReadPath.\n }\n}\n\n/**\n * Returns the path to read from: the XDG target after attempting migration,\n * or the legacy path if migration could not complete and the legacy file\n * still exists. New writes should always target `targetPath`.\n */\nexport function resolveReadPathSync(fileName: string, targetPath: string, mode?: number): string {\n migrateLegacyFileSync(fileName, targetPath, mode);\n if (fs.existsSync(targetPath)) {\n return targetPath;\n }\n const legacyPath = getLegacyFilePath(fileName);\n return fs.existsSync(legacyPath) ? legacyPath : targetPath;\n}\n\nexport async function resolveReadPath(\n fileName: string,\n targetPath: string,\n mode?: number\n): Promise<string> {\n await migrateLegacyFile(fileName, targetPath, mode);\n if (await exists(targetPath)) {\n return targetPath;\n }\n const legacyPath = getLegacyFilePath(fileName);\n return (await exists(legacyPath)) ? legacyPath : targetPath;\n}\n\nasync function exists(filePath: string): Promise<boolean> {\n try {\n await access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n","import { Command } from \"commander\";\nimport pc from \"picocolors\";\nimport ora from \"ora\";\nimport open from \"open\";\nimport boxen from \"boxen\";\nimport {\n saveTokens,\n clearTokens,\n getValidAccessToken,\n startDeviceAuthorization,\n pollDeviceToken,\n DEFAULT_DEVICE_POLL_INTERVAL_SECONDS,\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\nfunction renderDeviceCodeBox(\n userCode: string,\n verificationUri: string,\n verificationUriComplete: string | undefined\n): string {\n const codeLine = `${pc.dim(\"Your one-time code:\")}\\n\\n ${pc.green(pc.bold(userCode))}`;\n // Per RFC 8628 §3.3, even when verification_uri_complete is available we\n // still show the bare verification_uri so users on screen readers / paper\n // can type it manually.\n const linkLine = verificationUriComplete\n ? `${pc.dim(\"Open this link to approve:\")}\\n${pc.cyan(verificationUriComplete)}\\n\\n${pc.dim(\"Or visit\")} ${pc.cyan(verificationUri)} ${pc.dim(\"and enter the code above.\")}`\n : `${pc.dim(\"Visit:\")} ${pc.cyan(verificationUri)}`;\n return boxen(`${codeLine}\\n\\n${linkLine}`, {\n title: \"Sign in to Context7\",\n titleAlignment: \"left\",\n padding: 1,\n margin: { top: 1, bottom: 1, left: 2, right: 2 },\n borderStyle: \"round\",\n borderColor: \"gray\",\n });\n}\n\n/** Prints a prompt and resolves on the next keypress. No-op when stdin isn't a TTY. */\nfunction waitForEnter(prompt: string): Promise<void> {\n if (!process.stdin.isTTY) return Promise.resolve();\n return new Promise<void>((resolve) => {\n process.stdout.write(` ${pc.dim(prompt)} `);\n const onData = (chunk: Buffer) => {\n // Ctrl-C\n if (chunk[0] === 0x03) {\n process.stdin.removeListener(\"data\", onData);\n process.stdin.setRawMode?.(false);\n process.stdin.pause();\n process.stdout.write(\"\\n\");\n process.exit(130);\n }\n process.stdin.removeListener(\"data\", onData);\n process.stdin.setRawMode?.(false);\n process.stdin.pause();\n process.stdout.write(\"\\n\");\n resolve();\n };\n process.stdin.setRawMode?.(true);\n process.stdin.resume();\n process.stdin.on(\"data\", onData);\n });\n}\n\nasync function announceIdentity(accessToken: string): Promise<string> {\n try {\n const whoami = await fetchWhoami(accessToken);\n const name = whoami.email || whoami.name;\n if (!name) return \"Login successful!\";\n const team = whoami.teamspace?.name;\n return team\n ? `Logged in as ${pc.bold(name)} ${pc.dim(`(${team})`)}`\n : `Logged in as ${pc.bold(name)}`;\n } catch {\n return \"Login successful!\";\n }\n}\n\nexport async function performLogin(openBrowser = true): Promise<string | null> {\n const spinner = ora(\"Preparing login...\").start();\n\n let authorization;\n try {\n authorization = await startDeviceAuthorization(baseUrl, CLI_CLIENT_ID);\n } catch (error) {\n spinner.fail(pc.red(\"Login failed\"));\n if (error instanceof Error) console.error(pc.red(error.message));\n return null;\n }\n\n spinner.stop();\n\n console.log(\n renderDeviceCodeBox(\n authorization.user_code,\n authorization.verification_uri,\n authorization.verification_uri_complete\n )\n );\n\n const target = authorization.verification_uri_complete ?? authorization.verification_uri;\n if (openBrowser) {\n await waitForEnter(\"Press Enter to open the browser, or Ctrl-C to quit...\");\n try {\n await open(target);\n } catch {\n console.log(pc.dim(` Couldn't open a browser — visit the link above manually.`));\n }\n } else {\n console.log(pc.dim(\" Open the link above in any browser to continue.\"));\n console.log(\"\");\n }\n\n const waitingSpinner = ora({ text: \"Waiting for authorization...\", indent: 2 }).start();\n\n const deadline = Date.now() + authorization.expires_in * 1000;\n let intervalMs = (authorization.interval ?? DEFAULT_DEVICE_POLL_INTERVAL_SECONDS) * 1000;\n\n while (Date.now() < deadline) {\n await new Promise((resolve) => setTimeout(resolve, intervalMs));\n try {\n const result = await pollDeviceToken(baseUrl, CLI_CLIENT_ID, authorization.device_code);\n if (result.status === \"approved\" && result.tokens) {\n saveTokens(result.tokens);\n const successText = await announceIdentity(result.tokens.access_token);\n waitingSpinner.succeed(pc.green(successText));\n return result.tokens.access_token;\n }\n if (result.status === \"slow_down\") {\n intervalMs += 5000;\n continue;\n }\n if (result.status === \"denied\") {\n waitingSpinner.fail(pc.red(\"Authorization denied.\"));\n return null;\n }\n if (result.status === \"expired\") {\n waitingSpinner.fail(pc.red(\"Code expired. Run login again.\"));\n return null;\n }\n if (result.status === \"transient\") {\n // RFC 8628 §3.5: client MUST unilaterally reduce polling frequency on\n // connection timeout. Apply +5s like slow_down so a flaky network or\n // 5xx burst doesn't keep hitting at the original cadence.\n intervalMs += 5000;\n continue;\n }\n // pending — keep polling at the current cadence.\n } catch (error) {\n waitingSpinner.fail(pc.red(\"Login failed\"));\n if (error instanceof Error) console.error(pc.red(error.message));\n return null;\n }\n }\n\n waitingSpinner.fail(pc.red(\"Code expired without approval.\"));\n return null;\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 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.antigravity) agents.push(\"antigravity\");\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(\"--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.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\" || agent.mcp.projectPaths.length === 0\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\nfunction logSkillStatus(skillStatus: string, skillPath: string): void {\n const skillFailed = skillStatus.startsWith(\"failed:\");\n const skillIcon =\n skillStatus === \"installed\" ? pc.green(\"+\") : skillFailed ? pc.red(\"✖\") : pc.dim(\"~\");\n log.plain(` ${skillIcon} Skill ${skillFailed ? \"failed\" : skillStatus}`);\n log.plain(` ${pc.dim(skillPath)}`);\n if (skillFailed) {\n log.plain(` ${pc.red(skillStatus.slice(\"failed: \".length))}`);\n if (skillStatus.includes(\"EACCES\")) {\n log.plain(\n ` ${pc.yellow(\"tip:\")} fix permissions with: ${pc.cyan(`sudo chown -R $(whoami) ${dirname(dirname(skillPath))}`)}`\n );\n }\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 logSkillStatus(r.skillStatus, r.skillPath);\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 const agentDef = getAgent(agentName);\n installSpinner.text = `Setting up ${agentDef.displayName}...`;\n const r = await setupCliAgent(agentName, scope, downloadData);\n results.push({ agent: agentDef.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 logSkillStatus(r.skillStatus, r.skillPath);\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\" | \"antigravity\" | \"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 antigravity: \"Antigravity\",\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 // Antigravity is built on Gemini infrastructure and shares ~/.gemini/. Per\n // the official Codelabs guide, Antigravity 2.0/IDE/CLI read MCP servers from\n // ~/.gemini/config/mcp_config.json globally; there is no project-level MCP\n // config, so projectPaths is empty and setupAgent falls back to global.\n antigravity: {\n name: \"antigravity\",\n displayName: \"Antigravity\",\n mcp: {\n projectPaths: [],\n globalPaths: [join(homedir(), \".gemini\", \"config\", \"mcp_config.json\")],\n configKey: \"mcpServers\",\n buildEntry: (auth, transport) =>\n transport === \"stdio\" ? stdioEntry(auth) : withHeaders({ serverUrl: 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(), \".agent\", \"skills\") : join(\".agent\", \"skills\"),\n },\n detect: {\n projectPaths: [\".agent\"],\n globalPaths: [join(homedir(), \".gemini\", \"antigravity\"), join(homedir(), \".agent\")],\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 antigravity?: 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(\"--antigravity\", \"Remove from Antigravity\")\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.antigravity) agents.push(\"antigravity\");\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, --antigravity, 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 // Agents with no project-level MCP (e.g. Antigravity) only have a global\n // config — there's nothing to detect at project scope.\n if (scope === \"project\" && agent.mcp.projectPaths.length === 0) return false;\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 if (scope === \"project\" && agent.mcp.projectPaths.length === 0) {\n return { status: \"not found\", path: \"\" };\n }\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 { recoverLibraryId } from \"../utils/library-id.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 // Git Bash on Windows rewrites \"/owner/repo\" into a Windows path; recover it.\n libraryId = recoverLibraryId(libraryId);\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 if (process.platform === \"win32\") {\n log.info(\n `On Git Bash, prefix the ID with an extra slash to avoid path conversion: ctx7 docs \"//facebook/react\" \"<your question>\"`\n );\n }\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","/**\n * Recover a library ID that Git Bash mangled on Windows.\n *\n * Git Bash rewrites a leading-slash argument like \"/facebook/react\" into a\n * Windows path under the Git install dir, e.g. \"C:/Program Files/Git/facebook/react\".\n * We undo that so the \"/owner/repo\" format still works.\n */\nexport function recoverLibraryId(input: string): string {\n // \"//owner/repo\" is the Git Bash escape that skips conversion; collapse it.\n if (input.startsWith(\"//\")) return input.replace(/^\\/+/, \"/\");\n\n // Normal library ID, nothing to recover.\n if (input.startsWith(\"/\")) return input;\n\n // Only a drive-letter path (e.g. \"C:/...\") can be a mangled ID.\n if (!/^[A-Za-z]:[\\\\/]/.test(input)) return input;\n\n // Strip the Git install dir, keeping the \"/owner/repo[/version]\" tail.\n const normalized = input.replace(/\\\\/g, \"/\");\n const match = normalized.match(/^[A-Za-z]:\\/.*?\\/(?:Git|PortableGit|git-bash)\\/(.+)$/i);\n return match ? `/${match[1]}` : input;\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 { dirname } from \"path\";\nimport { mkdir, readFile, writeFile } from \"fs/promises\";\nimport { NAME, VERSION } from \"../constants.js\";\nimport {\n UPDATE_STATE_FILE_NAME,\n getUpdateStateFilePath,\n migrateLegacyFile,\n resolveReadPath,\n} from \"./storage-paths.js\";\n\nconst DEFAULT_CACHE_TTL_MS = 24 * 60 * 60 * 1000;\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 ?? getUpdateStateFilePath();\n}\n\n// Reads resolve to the legacy `~/.context7` file if migration could not move it.\nasync function readStateFilePath(stateFile?: string): Promise<string> {\n if (stateFile) {\n return stateFile;\n }\n return resolveReadPath(UPDATE_STATE_FILE_NAME, getUpdateStateFilePath());\n}\n\n// Writes always target the XDG path; migrate the legacy file first if present.\nasync function writeStateFilePath(stateFile?: string): Promise<string> {\n const path = getStateFilePath(stateFile);\n if (!stateFile) {\n await migrateLegacyFile(UPDATE_STATE_FILE_NAME, path);\n }\n return path;\n}\n\nasync function readUpdateState(stateFile?: string): Promise<UpdateState> {\n try {\n const raw = await readFile(await readStateFilePath(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 = await writeStateFilePath(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","fs","os","access","mkdir","baseUrl","hostname","err","pc","baseUrl","program","pc","resolve","pc","ora","pc","mkdir","join","writeFile","resolve","select","homedir","homedir","readFile","join","path","pkg","pc","program","input","ora","join","homedir","rm","pc","ora","select","mkdir","readFile","writeFile","dirname","join","access","join","homedir","access","readFile","writeFile","mkdir","dirname","readFile","access","mkdir","dirname","writeFile","pc","agents","program","ora","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","input","pc","ora","program","confirm","spawn","pc","dirname","mkdir","readFile","writeFile","path","readFile","mkdir","dirname","writeFile","program","resolve","spawn","pc","confirm","pc"]}