ctx7 0.2.2 → 0.2.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 CHANGED
@@ -9,7 +9,7 @@ import figlet from "figlet";
9
9
  import pc7 from "picocolors";
10
10
  import ora3 from "ora";
11
11
  import { readdir, rm as rm2 } from "fs/promises";
12
- import { join as join5 } from "path";
12
+ import { join as join6 } from "path";
13
13
 
14
14
  // src/utils/parse-input.ts
15
15
  function parseSkillInput(input2) {
@@ -138,6 +138,18 @@ async function searchSkills(query) {
138
138
  const response = await fetch(`${baseUrl}/api/v2/skills?${params}`);
139
139
  return await response.json();
140
140
  }
141
+ async function suggestSkills(dependencies, accessToken) {
142
+ const headers = { "Content-Type": "application/json" };
143
+ if (accessToken) {
144
+ headers["Authorization"] = `Bearer ${accessToken}`;
145
+ }
146
+ const response = await fetch(`${baseUrl}/api/v2/skills/suggest`, {
147
+ method: "POST",
148
+ headers,
149
+ body: JSON.stringify({ dependencies })
150
+ });
151
+ return await response.json();
152
+ }
141
153
  async function downloadSkill(project, skillName) {
142
154
  const skillData = await getSkill(project, skillName);
143
155
  if (skillData.error) {
@@ -1481,6 +1493,93 @@ async function generateCommand(options) {
1481
1493
 
1482
1494
  // src/commands/skill.ts
1483
1495
  import { homedir as homedir4 } from "os";
1496
+
1497
+ // src/utils/deps.ts
1498
+ import { readFile as readFile2 } from "fs/promises";
1499
+ import { join as join5 } from "path";
1500
+ async function readFileOrNull(path2) {
1501
+ try {
1502
+ return await readFile2(path2, "utf-8");
1503
+ } catch {
1504
+ return null;
1505
+ }
1506
+ }
1507
+ function isSkippedLocally(name) {
1508
+ return name.startsWith("@types/");
1509
+ }
1510
+ async function parsePackageJson(cwd) {
1511
+ const content = await readFileOrNull(join5(cwd, "package.json"));
1512
+ if (!content) return [];
1513
+ try {
1514
+ const pkg2 = JSON.parse(content);
1515
+ const names = /* @__PURE__ */ new Set();
1516
+ for (const key of Object.keys(pkg2.dependencies || {})) {
1517
+ if (!isSkippedLocally(key)) names.add(key);
1518
+ }
1519
+ for (const key of Object.keys(pkg2.devDependencies || {})) {
1520
+ if (!isSkippedLocally(key)) names.add(key);
1521
+ }
1522
+ return [...names];
1523
+ } catch {
1524
+ return [];
1525
+ }
1526
+ }
1527
+ async function parseRequirementsTxt(cwd) {
1528
+ const content = await readFileOrNull(join5(cwd, "requirements.txt"));
1529
+ if (!content) return [];
1530
+ const deps = [];
1531
+ for (const line of content.split("\n")) {
1532
+ const trimmed = line.trim();
1533
+ if (!trimmed || trimmed.startsWith("#") || trimmed.startsWith("-")) continue;
1534
+ const name = trimmed.split(/[=<>!~;@\s\[]/)[0].trim();
1535
+ if (name && !isSkippedLocally(name)) {
1536
+ deps.push(name);
1537
+ }
1538
+ }
1539
+ return deps;
1540
+ }
1541
+ async function parsePyprojectToml(cwd) {
1542
+ const content = await readFileOrNull(join5(cwd, "pyproject.toml"));
1543
+ if (!content) return [];
1544
+ const deps = [];
1545
+ const seen = /* @__PURE__ */ new Set();
1546
+ const projectDepsMatch = content.match(/\[project\]\s[\s\S]*?dependencies\s*=\s*\[([\s\S]*?)\]/);
1547
+ if (projectDepsMatch) {
1548
+ const entries = projectDepsMatch[1].match(/"([^"]+)"/g) || [];
1549
+ for (const entry of entries) {
1550
+ const name = entry.replace(/"/g, "").split(/[=<>!~;@\s\[]/)[0].trim();
1551
+ if (name && !isSkippedLocally(name) && !seen.has(name)) {
1552
+ seen.add(name);
1553
+ deps.push(name);
1554
+ }
1555
+ }
1556
+ }
1557
+ const poetryMatch = content.match(/\[tool\.poetry\.dependencies\]([\s\S]*?)(?:\n\[|$)/);
1558
+ if (poetryMatch) {
1559
+ const lines = poetryMatch[1].split("\n");
1560
+ for (const line of lines) {
1561
+ const match = line.match(/^(\S+)\s*=/);
1562
+ if (match) {
1563
+ const name = match[1].trim();
1564
+ if (name && !isSkippedLocally(name) && name !== "python" && !seen.has(name)) {
1565
+ seen.add(name);
1566
+ deps.push(name);
1567
+ }
1568
+ }
1569
+ }
1570
+ }
1571
+ return deps;
1572
+ }
1573
+ async function detectProjectDependencies(cwd) {
1574
+ const results = await Promise.all([
1575
+ parsePackageJson(cwd),
1576
+ parseRequirementsTxt(cwd),
1577
+ parsePyprojectToml(cwd)
1578
+ ]);
1579
+ return [...new Set(results.flat())];
1580
+ }
1581
+
1582
+ // src/commands/skill.ts
1484
1583
  function logInstallSummary(targets, targetDirs, skillNames) {
1485
1584
  log.blank();
1486
1585
  let dirIndex = 0;
@@ -1513,6 +1612,9 @@ function registerSkillCommands(program2) {
1513
1612
  skill.command("info").argument("<repository>", "GitHub repository (/owner/repo)").description("Show skills in a repository").action(async (project) => {
1514
1613
  await infoCommand(project);
1515
1614
  });
1615
+ skill.command("suggest").option("--global", "Install globally instead of current directory").option("--claude", "Claude Code (.claude/skills/)").option("--cursor", "Cursor (.cursor/skills/)").option("--codex", "Codex (.codex/skills/)").option("--opencode", "OpenCode (.opencode/skills/)").option("--amp", "Amp (.agents/skills/)").option("--antigravity", "Antigravity (.agent/skills/)").description("Suggest skills based on your project dependencies").action(async (options) => {
1616
+ await suggestCommand(options);
1617
+ });
1516
1618
  }
1517
1619
  function registerSkillAliases(program2) {
1518
1620
  program2.command("si", { hidden: true }).argument("<repository>", "GitHub repository (/owner/repo)").argument("[skill]", "Specific skill name to install").option("--all", "Install all skills without prompting").option("--global", "Install globally instead of current directory").option("--claude", "Claude Code (.claude/skills/)").option("--cursor", "Cursor (.cursor/skills/)").option("--codex", "Codex (.codex/skills/)").option("--opencode", "OpenCode (.opencode/skills/)").option("--amp", "Amp (.agents/skills/)").option("--antigravity", "Antigravity (.agent/skills/)").description("Install skills (alias for: skills install)").action(async (project, skillName, options) => {
@@ -1521,6 +1623,9 @@ function registerSkillAliases(program2) {
1521
1623
  program2.command("ss", { hidden: true }).argument("<keywords...>", "Search keywords").description("Search for skills (alias for: skills search)").action(async (keywords) => {
1522
1624
  await searchCommand(keywords.join(" "));
1523
1625
  });
1626
+ program2.command("ssg", { hidden: true }).option("--global", "Install globally instead of current directory").option("--claude", "Claude Code (.claude/skills/)").option("--cursor", "Cursor (.cursor/skills/)").option("--codex", "Codex (.codex/skills/)").option("--opencode", "OpenCode (.opencode/skills/)").option("--amp", "Amp (.agents/skills/)").option("--antigravity", "Antigravity (.agent/skills/)").description("Suggest skills (alias for: skills suggest)").action(async (options) => {
1627
+ await suggestCommand(options);
1628
+ });
1524
1629
  }
1525
1630
  async function installCommand(input2, skillName, options) {
1526
1631
  trackEvent("command", { name: "install" });
@@ -1652,7 +1757,7 @@ async function installCommand(input2, skillName, options) {
1652
1757
  }
1653
1758
  throw dirErr;
1654
1759
  }
1655
- const primarySkillDir = join5(primaryDir, skill.name);
1760
+ const primarySkillDir = join6(primaryDir, skill.name);
1656
1761
  for (const targetDir of symlinkDirs) {
1657
1762
  try {
1658
1763
  await symlinkSkill(skill.name, primarySkillDir, targetDir);
@@ -1680,7 +1785,7 @@ async function installCommand(input2, skillName, options) {
1680
1785
  log.blank();
1681
1786
  log.warn("Fix permissions with:");
1682
1787
  for (const dir of failedDirs) {
1683
- const parentDir = join5(dir, "..");
1788
+ const parentDir = join6(dir, "..");
1684
1789
  log.dim(` sudo chown -R $(whoami) "${parentDir}"`);
1685
1790
  }
1686
1791
  log.blank();
@@ -1793,7 +1898,7 @@ async function searchCommand(query) {
1793
1898
  }
1794
1899
  throw dirErr;
1795
1900
  }
1796
- const primarySkillDir = join5(primaryDir, skill.name);
1901
+ const primarySkillDir = join6(primaryDir, skill.name);
1797
1902
  for (const targetDir of symlinkDirs) {
1798
1903
  try {
1799
1904
  await symlinkSkill(skill.name, primarySkillDir, targetDir);
@@ -1821,7 +1926,7 @@ async function searchCommand(query) {
1821
1926
  log.blank();
1822
1927
  log.warn("Fix permissions with:");
1823
1928
  for (const dir of failedDirs) {
1824
- const parentDir = join5(dir, "..");
1929
+ const parentDir = join6(dir, "..");
1825
1930
  log.dim(` sudo chown -R $(whoami) "${parentDir}"`);
1826
1931
  }
1827
1932
  log.blank();
@@ -1840,7 +1945,7 @@ async function listCommand(options) {
1840
1945
  const idesToCheck = hasExplicitIdeOption(options) ? getSelectedIdes(options) : Object.keys(IDE_NAMES);
1841
1946
  const results = [];
1842
1947
  for (const ide of idesToCheck) {
1843
- const skillsDir = join5(baseDir, pathMap[ide]);
1948
+ const skillsDir = join6(baseDir, pathMap[ide]);
1844
1949
  try {
1845
1950
  const entries = await readdir(skillsDir, { withFileTypes: true });
1846
1951
  const skillFolders = entries.filter((e) => e.isDirectory() || e.isSymbolicLink()).map((e) => e.name);
@@ -1873,7 +1978,7 @@ async function removeCommand(name, options) {
1873
1978
  return;
1874
1979
  }
1875
1980
  const skillsDir = getTargetDirFromSelection(target.ide, target.scope);
1876
- const skillPath = join5(skillsDir, name);
1981
+ const skillPath = join6(skillsDir, name);
1877
1982
  try {
1878
1983
  await rm2(skillPath, { recursive: true });
1879
1984
  log.success(`Removed skill: ${name}`);
@@ -1925,13 +2030,169 @@ async function infoCommand(input2) {
1925
2030
  `
1926
2031
  );
1927
2032
  }
2033
+ async function suggestCommand(options) {
2034
+ trackEvent("command", { name: "suggest" });
2035
+ log.blank();
2036
+ const scanSpinner = ora3("Scanning project dependencies...").start();
2037
+ const deps = await detectProjectDependencies(process.cwd());
2038
+ if (deps.length === 0) {
2039
+ scanSpinner.warn(pc7.yellow("No dependencies detected"));
2040
+ log.info(`Try ${pc7.cyan("ctx7 skills search <keyword>")} to search manually`);
2041
+ return;
2042
+ }
2043
+ scanSpinner.succeed(`Found ${deps.length} dependencies`);
2044
+ const searchSpinner = ora3("Finding matching skills...").start();
2045
+ const tokens = loadTokens();
2046
+ const accessToken = tokens && !isTokenExpired(tokens) ? tokens.access_token : void 0;
2047
+ let data;
2048
+ try {
2049
+ data = await suggestSkills(deps, accessToken);
2050
+ } catch {
2051
+ searchSpinner.fail(pc7.red("Failed to connect to Context7"));
2052
+ return;
2053
+ }
2054
+ if (data.error) {
2055
+ searchSpinner.fail(pc7.red(`Error: ${data.message || data.error}`));
2056
+ return;
2057
+ }
2058
+ const skills = data.skills;
2059
+ if (skills.length === 0) {
2060
+ searchSpinner.warn(pc7.yellow("No matching skills found for your dependencies"));
2061
+ return;
2062
+ }
2063
+ searchSpinner.succeed(`Found ${skills.length} relevant skill(s)`);
2064
+ trackEvent("suggest_results", { depCount: deps.length, skillCount: skills.length });
2065
+ log.blank();
2066
+ const maxNameLen = Math.max(...skills.map((s) => s.name.length));
2067
+ const installsColWidth = 10;
2068
+ const trustColWidth = 12;
2069
+ const maxMatchedLen = Math.max(...skills.map((s) => s.matchedDep.length));
2070
+ const indexWidth = skills.length.toString().length;
2071
+ const choices = skills.map((s, index) => {
2072
+ const indexStr = pc7.dim(`${(index + 1).toString().padStart(indexWidth)}.`);
2073
+ const paddedName = s.name.padEnd(maxNameLen);
2074
+ const installsRaw = s.installCount ? String(s.installCount) : "-";
2075
+ const paddedInstalls = formatInstallCount(s.installCount, pc7.dim("-")) + " ".repeat(installsColWidth - installsRaw.length);
2076
+ const trustRaw = s.trustScore !== void 0 && s.trustScore >= 0 ? s.trustScore.toFixed(1) : "-";
2077
+ const trust = formatTrustScore(s.trustScore) + " ".repeat(trustColWidth - trustRaw.length);
2078
+ const matched = pc7.yellow(s.matchedDep.padEnd(maxMatchedLen));
2079
+ const skillLink = terminalLink(
2080
+ s.name,
2081
+ `https://context7.com/skills${s.project}/${s.name}`,
2082
+ pc7.white
2083
+ );
2084
+ const repoLink = terminalLink(s.project, `https://github.com${s.project}`, pc7.white);
2085
+ const metadataLines = [
2086
+ pc7.dim("\u2500".repeat(50)),
2087
+ "",
2088
+ `${pc7.yellow("Skill:")} ${skillLink}`,
2089
+ `${pc7.yellow("Repo:")} ${repoLink}`,
2090
+ `${pc7.yellow("Relevant:")} ${pc7.white(s.matchedDep)}`,
2091
+ `${pc7.yellow("Description:")}`,
2092
+ pc7.white(s.description || "No description")
2093
+ ];
2094
+ return {
2095
+ name: `${indexStr} ${paddedName} ${paddedInstalls}${trust}${matched}`,
2096
+ value: s,
2097
+ description: metadataLines.join("\n")
2098
+ };
2099
+ });
2100
+ const checkboxPrefixWidth = 3;
2101
+ const headerPad = " ".repeat(checkboxPrefixWidth + indexWidth + 1 + 1 + maxNameLen + 1);
2102
+ const headerLine = headerPad + pc7.dim("Installs".padEnd(installsColWidth)) + pc7.dim("Trust(0-10)".padEnd(trustColWidth)) + pc7.dim("Relevant");
2103
+ const message = "Select skills to install:\n" + headerLine;
2104
+ let selectedSkills;
2105
+ try {
2106
+ selectedSkills = await checkboxWithHover({
2107
+ message,
2108
+ choices,
2109
+ pageSize: 15,
2110
+ loop: false
2111
+ });
2112
+ } catch {
2113
+ log.warn("Installation cancelled");
2114
+ return;
2115
+ }
2116
+ if (selectedSkills.length === 0) {
2117
+ log.warn("No skills selected");
2118
+ return;
2119
+ }
2120
+ const targets = await promptForInstallTargets(options);
2121
+ if (!targets) {
2122
+ log.warn("Installation cancelled");
2123
+ return;
2124
+ }
2125
+ const targetDirs = getTargetDirs(targets);
2126
+ const installSpinner = ora3("Installing skills...").start();
2127
+ let permissionError = false;
2128
+ const failedDirs = /* @__PURE__ */ new Set();
2129
+ const installedSkills = [];
2130
+ for (const skill of selectedSkills) {
2131
+ try {
2132
+ installSpinner.text = `Downloading ${skill.name}...`;
2133
+ const downloadData = await downloadSkill(skill.project, skill.name);
2134
+ if (downloadData.error) {
2135
+ log.warn(`Failed to download ${skill.name}: ${downloadData.error}`);
2136
+ continue;
2137
+ }
2138
+ installSpinner.text = `Installing ${skill.name}...`;
2139
+ const [primaryDir, ...symlinkDirs] = targetDirs;
2140
+ try {
2141
+ await installSkillFiles(skill.name, downloadData.files, primaryDir);
2142
+ } catch (dirErr) {
2143
+ const error = dirErr;
2144
+ if (error.code === "EACCES" || error.code === "EPERM") {
2145
+ permissionError = true;
2146
+ failedDirs.add(primaryDir);
2147
+ }
2148
+ throw dirErr;
2149
+ }
2150
+ const primarySkillDir = join6(primaryDir, skill.name);
2151
+ for (const targetDir of symlinkDirs) {
2152
+ try {
2153
+ await symlinkSkill(skill.name, primarySkillDir, targetDir);
2154
+ } catch (dirErr) {
2155
+ const error = dirErr;
2156
+ if (error.code === "EACCES" || error.code === "EPERM") {
2157
+ permissionError = true;
2158
+ failedDirs.add(targetDir);
2159
+ }
2160
+ throw dirErr;
2161
+ }
2162
+ }
2163
+ installedSkills.push(`${skill.project}/${skill.name}`);
2164
+ } catch (err) {
2165
+ const error = err;
2166
+ if (error.code === "EACCES" || error.code === "EPERM") {
2167
+ continue;
2168
+ }
2169
+ const errMsg = err instanceof Error ? err.message : String(err);
2170
+ log.warn(`Failed to install ${skill.name}: ${errMsg}`);
2171
+ }
2172
+ }
2173
+ if (permissionError) {
2174
+ installSpinner.fail("Permission denied");
2175
+ log.blank();
2176
+ log.warn("Fix permissions with:");
2177
+ for (const dir of failedDirs) {
2178
+ const parentDir = join6(dir, "..");
2179
+ log.dim(` sudo chown -R $(whoami) "${parentDir}"`);
2180
+ }
2181
+ log.blank();
2182
+ return;
2183
+ }
2184
+ installSpinner.succeed(`Installed ${installedSkills.length} skill(s)`);
2185
+ trackEvent("suggest_install", { skills: installedSkills, ides: targets.ides });
2186
+ const installedNames = selectedSkills.map((s) => s.name);
2187
+ logInstallSummary(targets, targetDirs, installedNames);
2188
+ }
1928
2189
 
1929
2190
  // src/constants.ts
1930
2191
  import { readFileSync as readFileSync2 } from "fs";
1931
2192
  import { fileURLToPath } from "url";
1932
- import { dirname as dirname2, join as join6 } from "path";
2193
+ import { dirname as dirname2, join as join7 } from "path";
1933
2194
  var __dirname = dirname2(fileURLToPath(import.meta.url));
1934
- var pkg = JSON.parse(readFileSync2(join6(__dirname, "../package.json"), "utf-8"));
2195
+ var pkg = JSON.parse(readFileSync2(join7(__dirname, "../package.json"), "utf-8"));
1935
2196
  var VERSION = pkg.version;
1936
2197
  var NAME = pkg.name;
1937
2198
 
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/commands/skill.ts","../src/utils/parse-input.ts","../src/utils/github.ts","../src/utils/api.ts","../src/utils/logger.ts","../src/utils/ide.ts","../src/types.ts","../src/utils/prompts.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/constants.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport pc from \"picocolors\";\nimport figlet from \"figlet\";\nimport { registerSkillCommands, registerSkillAliases } from \"./commands/skill.js\";\nimport { registerAuthCommands, setAuthBaseUrl } from \"./commands/auth.js\";\nimport { setBaseUrl } from \"./utils/api.js\";\nimport { VERSION } from \"./constants.js\";\n\nconst brand = {\n primary: pc.green,\n dim: pc.dim,\n};\n\nconst program = new Command();\n\nprogram\n .name(\"ctx7\")\n .description(\"Context7 CLI - Manage AI coding skills and documentation context\")\n .version(VERSION)\n .option(\"--base-url <url>\")\n .hook(\"preAction\", (thisCommand) => {\n const opts = thisCommand.opts();\n if (opts.baseUrl) {\n setBaseUrl(opts.baseUrl);\n setAuthBaseUrl(opts.baseUrl);\n }\n })\n .addHelpText(\n \"after\",\n `\nExamples:\n ${brand.dim(\"# Search for skills\")}\n ${brand.primary(\"npx ctx7 skills search pdf\")}\n ${brand.primary(\"npx ctx7 skills search react hooks\")}\n\n ${brand.dim(\"# Install from a repository\")}\n ${brand.primary(\"npx ctx7 skills install /anthropics/skills\")}\n ${brand.primary(\"npx ctx7 skills install /anthropics/skills pdf\")}\n\n ${brand.dim(\"# Install to specific client\")}\n ${brand.primary(\"npx ctx7 skills install /anthropics/skills --cursor\")}\n ${brand.primary(\"npx ctx7 skills install /anthropics/skills --global\")}\n\n ${brand.dim(\"# List and manage installed skills\")}\n ${brand.primary(\"npx ctx7 skills list --claude\")}\n ${brand.primary(\"npx ctx7 skills remove pdf\")}\n\nVisit ${brand.primary(\"https://context7.com\")} to browse skills\n`\n );\n\nregisterSkillCommands(program);\nregisterSkillAliases(program);\nregisterAuthCommands(program);\n\nprogram.action(() => {\n console.log(\"\");\n const banner = figlet.textSync(\"Context7\", { font: \"ANSI Shadow\" });\n console.log(brand.primary(banner));\n console.log(brand.dim(\" The open agent skills ecosystem\"));\n console.log(\"\");\n\n console.log(\" Quick start:\");\n console.log(` ${brand.primary(\"npx ctx7 skills search pdf\")}`);\n console.log(` ${brand.primary(\"npx ctx7 skills install /anthropics/skills\")}`);\n console.log(\"\");\n\n console.log(` Run ${brand.primary(\"npx ctx7 --help\")} for all commands and options`);\n console.log(` Visit ${brand.primary(\"https://context7.com\")} to browse skills`);\n console.log(\"\");\n});\n\nprogram.parse();\n","import { Command } from \"commander\";\nimport pc from \"picocolors\";\nimport ora from \"ora\";\nimport { readdir, rm } from \"fs/promises\";\nimport { join } from \"path\";\n\nimport { parseSkillInput } from \"../utils/parse-input.js\";\nimport { listProjectSkills, searchSkills, downloadSkill, getSkill } from \"../utils/api.js\";\nimport { log } from \"../utils/logger.js\";\nimport {\n promptForInstallTargets,\n promptForSingleTarget,\n getTargetDirs,\n getTargetDirFromSelection,\n getSelectedIdes,\n hasExplicitIdeOption,\n} from \"../utils/ide.js\";\nimport {\n checkboxWithHover,\n terminalLink,\n formatInstallCount,\n formatTrustScore,\n} from \"../utils/prompts.js\";\nimport { installSkillFiles, symlinkSkill } from \"../utils/installer.js\";\nimport { trackEvent } from \"../utils/tracking.js\";\nimport { registerGenerateCommand } from \"./generate.js\";\nimport type {\n Skill,\n SkillSearchResult,\n AddOptions,\n ListOptions,\n RemoveOptions,\n InstallTargets,\n} from \"../types.js\";\nimport { IDE_NAMES, IDE_PATHS, IDE_GLOBAL_PATHS } from \"../types.js\";\nimport type { IDE, Scope } from \"../types.js\";\nimport { homedir } from \"os\";\n\nfunction logInstallSummary(\n targets: InstallTargets,\n targetDirs: string[],\n skillNames: string[]\n): void {\n log.blank();\n let dirIndex = 0;\n for (const ide of targets.ides) {\n for (let i = 0; i < targets.scopes.length; i++) {\n const dir = targetDirs[dirIndex++];\n log.dim(`${IDE_NAMES[ide]}: ${dir}`);\n for (const name of skillNames) {\n log.itemAdd(name);\n }\n }\n }\n log.blank();\n}\n\nexport function registerSkillCommands(program: Command): void {\n const skill = program.command(\"skills\").alias(\"skill\").description(\"Manage AI coding skills\");\n\n // Register generate subcommand\n registerGenerateCommand(skill);\n\n skill\n .command(\"install\")\n .alias(\"i\")\n .alias(\"add\")\n .argument(\"<repository>\", \"GitHub repository (/owner/repo)\")\n .argument(\"[skill]\", \"Specific skill name to install\")\n .option(\"--all\", \"Install all skills without prompting\")\n .option(\"--global\", \"Install globally instead of current directory\")\n .option(\"--claude\", \"Claude Code (.claude/skills/)\")\n .option(\"--cursor\", \"Cursor (.cursor/skills/)\")\n .option(\"--codex\", \"Codex (.codex/skills/)\")\n .option(\"--opencode\", \"OpenCode (.opencode/skills/)\")\n .option(\"--amp\", \"Amp (.agents/skills/)\")\n .option(\"--antigravity\", \"Antigravity (.agent/skills/)\")\n .description(\"Install skills from a repository\")\n .action(async (project: string, skillName: string | undefined, options: AddOptions) => {\n await installCommand(project, skillName, options);\n });\n\n skill\n .command(\"search\")\n .alias(\"s\")\n .argument(\"<keywords...>\", \"Search keywords\")\n .description(\"Search for skills across all indexed repositories\")\n .action(async (keywords: string[]) => {\n await searchCommand(keywords.join(\" \"));\n });\n\n skill\n .command(\"list\")\n .alias(\"ls\")\n .option(\"--global\", \"List global skills\")\n .option(\"--claude\", \"Claude Code (.claude/skills/)\")\n .option(\"--cursor\", \"Cursor (.cursor/skills/)\")\n .option(\"--codex\", \"Codex (.codex/skills/)\")\n .option(\"--opencode\", \"OpenCode (.opencode/skills/)\")\n .option(\"--amp\", \"Amp (.agents/skills/)\")\n .option(\"--antigravity\", \"Antigravity (.agent/skills/)\")\n .description(\"List installed skills\")\n .action(async (options: ListOptions) => {\n await listCommand(options);\n });\n\n skill\n .command(\"remove\")\n .alias(\"rm\")\n .alias(\"delete\")\n .argument(\"<name>\", \"Skill name to remove\")\n .option(\"--global\", \"Remove from global skills\")\n .option(\"--claude\", \"Claude Code (.claude/skills/)\")\n .option(\"--cursor\", \"Cursor (.cursor/skills/)\")\n .option(\"--codex\", \"Codex (.codex/skills/)\")\n .option(\"--opencode\", \"OpenCode (.opencode/skills/)\")\n .option(\"--amp\", \"Amp (.agents/skills/)\")\n .option(\"--antigravity\", \"Antigravity (.agent/skills/)\")\n .description(\"Remove an installed skill\")\n .action(async (name: string, options: RemoveOptions) => {\n await removeCommand(name, options);\n });\n\n skill\n .command(\"info\")\n .argument(\"<repository>\", \"GitHub repository (/owner/repo)\")\n .description(\"Show skills in a repository\")\n .action(async (project: string) => {\n await infoCommand(project);\n });\n}\n\nexport function registerSkillAliases(program: Command): void {\n program\n .command(\"si\", { hidden: true })\n .argument(\"<repository>\", \"GitHub repository (/owner/repo)\")\n .argument(\"[skill]\", \"Specific skill name to install\")\n .option(\"--all\", \"Install all skills without prompting\")\n .option(\"--global\", \"Install globally instead of current directory\")\n .option(\"--claude\", \"Claude Code (.claude/skills/)\")\n .option(\"--cursor\", \"Cursor (.cursor/skills/)\")\n .option(\"--codex\", \"Codex (.codex/skills/)\")\n .option(\"--opencode\", \"OpenCode (.opencode/skills/)\")\n .option(\"--amp\", \"Amp (.agents/skills/)\")\n .option(\"--antigravity\", \"Antigravity (.agent/skills/)\")\n .description(\"Install skills (alias for: skills install)\")\n .action(async (project: string, skillName: string | undefined, options: AddOptions) => {\n await installCommand(project, skillName, options);\n });\n\n program\n .command(\"ss\", { hidden: true })\n .argument(\"<keywords...>\", \"Search keywords\")\n .description(\"Search for skills (alias for: skills search)\")\n .action(async (keywords: string[]) => {\n await searchCommand(keywords.join(\" \"));\n });\n}\n\nasync function installCommand(\n input: string,\n skillName: string | undefined,\n options: AddOptions\n): Promise<void> {\n trackEvent(\"command\", { name: \"install\" });\n const parsed = parseSkillInput(input);\n if (!parsed) {\n log.error(`Invalid input format: ${input}`);\n log.info(`Expected: /owner/repo or full GitHub URL`);\n log.info(`Example: ctx7 skills install /anthropics/skills pdf`);\n log.blank();\n return;\n }\n const repo = `/${parsed.owner}/${parsed.repo}`;\n\n log.blank();\n const spinner = ora(`Fetching skills from ${repo}...`).start();\n\n let selectedSkills: (Skill & { project: string })[];\n\n // When a specific skill name is provided, fetch only that skill\n if (skillName) {\n spinner.text = `Fetching skill: ${skillName}...`;\n const skillData = await getSkill(repo, skillName);\n\n if (skillData.error || !skillData.name) {\n if (skillData.error === \"prompt_injection_detected\") {\n spinner.fail(pc.red(`Prompt injection detected in skill: ${skillName}`));\n log.warn(\"This skill contains potentially malicious content and cannot be installed.\");\n } else {\n spinner.fail(pc.red(`Skill not found: ${skillName}`));\n }\n return;\n }\n\n spinner.succeed(`Found skill: ${skillName}`);\n selectedSkills = [\n {\n name: skillData.name,\n description: skillData.description,\n url: skillData.url,\n project: repo,\n },\n ];\n } else {\n // Fetch all skills when no specific names provided\n const data = await listProjectSkills(repo);\n\n if (data.error) {\n spinner.fail(pc.red(`Error: ${data.message || data.error}`));\n return;\n }\n\n if (!data.skills || data.skills.length === 0) {\n spinner.warn(pc.yellow(`No skills found in ${repo}`));\n return;\n }\n\n const skillsWithRepo = data.skills\n .map((s) => ({ ...s, project: repo }))\n .sort((a, b) => (b.installCount ?? 0) - (a.installCount ?? 0));\n\n spinner.succeed(`Found ${data.skills.length} skill(s)`);\n\n if (data.blockedSkillsCount && data.blockedSkillsCount > 0) {\n log.blank();\n log.error(\n `${data.blockedSkillsCount} skill(s) blocked due to prompt injection and not shown.`\n );\n log.warn(\"Review other skills from this repository carefully before installing.\");\n }\n\n if (options.all || data.skills.length === 1) {\n selectedSkills = skillsWithRepo;\n } else {\n const indexWidth = data.skills.length.toString().length;\n const maxNameLen = Math.max(...data.skills.map((s) => s.name.length));\n const choices = skillsWithRepo.map((s, index) => {\n const indexStr = pc.dim(`${(index + 1).toString().padStart(indexWidth)}.`);\n const paddedName = s.name.padEnd(maxNameLen);\n const installs = formatInstallCount(s.installCount);\n\n // Build metadata panel shown when item is hovered\n const skillUrl = `https://context7.com/skills${s.project}/${s.name}`;\n const skillLink = terminalLink(s.name, skillUrl, pc.white);\n const repoLink = terminalLink(s.project, `https://github.com${s.project}`, pc.white);\n const metadataLines = [\n pc.dim(\"─\".repeat(50)),\n \"\",\n `${pc.yellow(\"Skill:\")} ${skillLink}`,\n `${pc.yellow(\"Repo:\")} ${repoLink}`,\n `${pc.yellow(\"Description:\")}`,\n pc.white(s.description || \"No description\"),\n ];\n\n return {\n name: installs ? `${indexStr} ${paddedName} ${installs}` : `${indexStr} ${paddedName}`,\n value: s,\n description: metadataLines.join(\"\\n\"),\n };\n });\n\n log.blank();\n\n // Align \"installs\" column header with the count values\n // \"? \" prefix = 2 chars, checkbox prefix \"❯◯ \" = 4 chars, index + dot + space, padded name + space\n const installsOffset = 4 + indexWidth + 1 + 1 + maxNameLen + 1 - 3;\n const message =\n \"Select skills:\" + \" \".repeat(Math.max(1, installsOffset - 14)) + pc.dim(\"installs\");\n\n try {\n selectedSkills = await checkboxWithHover({\n message,\n choices,\n pageSize: 15,\n loop: false,\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\n const indexWidth = data.results.length.toString().length;\n const maxNameLen = Math.max(...data.results.map((s) => s.name.length));\n const installsColWidth = 10;\n const choices = data.results.map((s, index) => {\n const indexStr = pc.dim(`${(index + 1).toString().padStart(indexWidth)}.`);\n const paddedName = s.name.padEnd(maxNameLen);\n const installsRaw = s.installCount ? String(s.installCount) : \"-\";\n const paddedInstalls =\n formatInstallCount(s.installCount, pc.dim(\"-\")) +\n \" \".repeat(installsColWidth - installsRaw.length);\n const trust = formatTrustScore(s.trustScore);\n\n const skillLink = terminalLink(\n s.name,\n `https://context7.com/skills${s.project}/${s.name}`,\n pc.white\n );\n const repoLink = terminalLink(s.project, `https://github.com${s.project}`, pc.white);\n const metadataLines = [\n pc.dim(\"─\".repeat(50)),\n \"\",\n `${pc.yellow(\"Skill:\")} ${skillLink}`,\n `${pc.yellow(\"Repo:\")} ${repoLink}`,\n `${pc.yellow(\"Description:\")}`,\n pc.white(s.description || \"No description\"),\n ];\n\n return {\n name: `${indexStr} ${paddedName} ${paddedInstalls}${trust}`,\n value: s,\n description: metadataLines.join(\"\\n\"),\n };\n });\n\n log.blank();\n\n const checkboxPrefixWidth = 3; // \"❯◯ \" or \" ◯ \"\n const headerPad = \" \".repeat(checkboxPrefixWidth + indexWidth + 1 + 1 + maxNameLen + 1);\n const headerLine =\n headerPad + pc.dim(\"Installs\".padEnd(installsColWidth)) + pc.dim(\"Trust(0-10)\");\n const message = \"Select skills to install:\\n\" + headerLine;\n\n let selectedSkills: SkillSearchResult[];\n try {\n selectedSkills = await checkboxWithHover({\n message,\n choices,\n pageSize: 15,\n loop: false,\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 pathMap = scope === \"global\" ? IDE_GLOBAL_PATHS : IDE_PATHS;\n const baseDir = scope === \"global\" ? homedir() : process.cwd();\n\n const idesToCheck: IDE[] = hasExplicitIdeOption(options)\n ? getSelectedIdes(options)\n : (Object.keys(IDE_NAMES) as IDE[]);\n\n const results: { ide: IDE; skills: string[] }[] = [];\n\n for (const ide of idesToCheck) {\n const skillsDir = join(baseDir, pathMap[ide]);\n try {\n const entries = await readdir(skillsDir, { withFileTypes: true });\n const skillFolders = entries\n .filter((e) => e.isDirectory() || e.isSymbolicLink())\n .map((e) => e.name);\n if (skillFolders.length > 0) {\n results.push({ ide, skills: skillFolders });\n }\n } catch {\n // Directory doesn't exist, skip\n }\n }\n\n if (results.length === 0) {\n log.warn(\"No skills installed\");\n return;\n }\n\n log.blank();\n\n for (const { ide, skills } of results) {\n const ideName = IDE_NAMES[ide];\n const path = pathMap[ide];\n log.plain(`${pc.bold(ideName)} ${pc.dim(path)}`);\n for (const skill of skills) {\n log.plain(` ${pc.green(skill)}`);\n }\n log.blank();\n }\n}\n\nasync function removeCommand(name: string, options: RemoveOptions): Promise<void> {\n trackEvent(\"command\", { name: \"remove\" });\n const target = await promptForSingleTarget(options);\n if (!target) {\n log.warn(\"Cancelled\");\n return;\n }\n\n const skillsDir = getTargetDirFromSelection(target.ide, target.scope);\n const skillPath = join(skillsDir, name);\n\n try {\n await rm(skillPath, { recursive: true });\n log.success(`Removed skill: ${name}`);\n } catch (err) {\n const error = err as NodeJS.ErrnoException;\n if (error.code === \"ENOENT\") {\n log.error(`Skill not found: ${name}`);\n } else if (error.code === \"EACCES\" || error.code === \"EPERM\") {\n log.error(`Permission denied. Try: sudo rm -rf \"${skillPath}\"`);\n } else {\n log.error(`Failed to remove skill: ${error.message}`);\n }\n }\n}\n\nasync function infoCommand(input: string): Promise<void> {\n trackEvent(\"command\", { name: \"info\" });\n const parsed = parseSkillInput(input);\n if (!parsed) {\n log.blank();\n log.error(`Invalid input format: ${input}`);\n log.info(`Expected: /owner/repo or full GitHub URL`);\n log.blank();\n return;\n }\n const repo = `/${parsed.owner}/${parsed.repo}`;\n\n log.blank();\n const spinner = ora(`Fetching skills from ${repo}...`).start();\n\n const data = await listProjectSkills(repo);\n\n if (data.error) {\n spinner.fail(pc.red(`Error: ${data.message || data.error}`));\n return;\n }\n\n if (!data.skills || data.skills.length === 0) {\n spinner.warn(pc.yellow(`No skills found in ${repo}`));\n return;\n }\n\n spinner.succeed(`Found ${data.skills.length} skill(s)`);\n\n log.blank();\n for (const skill of data.skills) {\n log.item(skill.name);\n log.dim(` ${skill.description || \"No description\"}`);\n log.dim(` URL: ${skill.url}`);\n log.blank();\n }\n\n log.plain(\n `${pc.bold(\"Quick commands:\")}\\n` +\n ` Install all: ${pc.cyan(`ctx7 skills install ${repo} --all`)}\\n` +\n ` Install one: ${pc.cyan(`ctx7 skills install ${repo} ${data.skills[0]?.name}`)}\\n`\n );\n}\n","export interface ParsedSkillInput {\n type: \"repo\" | \"url\";\n owner: string;\n repo: string;\n branch?: string;\n path?: string;\n}\n\nexport function parseSkillInput(input: string): ParsedSkillInput | null {\n const urlMatch = input.match(\n /(?:https?:\\/\\/)?github\\.com\\/([^\\/]+)\\/([^\\/]+)\\/tree\\/([^\\/]+)\\/(.+)/\n );\n if (urlMatch) {\n const [, owner, repo, branch, path] = urlMatch;\n return { type: \"url\", owner, repo, branch, path };\n }\n\n const shortMatch = input.match(/^\\/?([^\\/]+)\\/([^\\/]+)$/);\n if (shortMatch) {\n const [, owner, repo] = shortMatch;\n return { type: \"repo\", owner, repo };\n }\n\n return null;\n}\n","import type { SkillFile, Skill } from \"../types.js\";\n\nconst GITHUB_API = \"https://api.github.com\";\nconst GITHUB_RAW = \"https://raw.githubusercontent.com\";\n\ninterface GitHubTreeItem {\n path: string;\n mode: string;\n type: \"blob\" | \"tree\";\n sha: string;\n size?: number;\n url: string;\n}\n\ninterface GitHubTreeResponse {\n sha: string;\n url: string;\n tree: GitHubTreeItem[];\n truncated: boolean;\n}\n\nfunction parseGitHubUrl(url: string): {\n owner: string;\n repo: string;\n branch: string;\n path: string;\n} | null {\n try {\n const urlObj = new URL(url);\n const parts = urlObj.pathname.split(\"/\").filter(Boolean);\n\n // Handle raw.githubusercontent.com URLs\n // Format: https://raw.githubusercontent.com/owner/repo/refs/heads/branch/path/SKILL.md\n if (urlObj.hostname === \"raw.githubusercontent.com\") {\n if (parts.length < 5) return null;\n\n const owner = parts[0];\n const repo = parts[1];\n\n // Handle refs/heads/branch format\n if (parts[2] === \"refs\" && parts[3] === \"heads\") {\n const branch = parts[4];\n // Get directory path (exclude the filename like SKILL.md)\n const pathParts = parts.slice(5);\n // Remove the last part if it looks like a file (has extension)\n if (pathParts.length > 0 && pathParts[pathParts.length - 1].includes(\".\")) {\n pathParts.pop();\n }\n const path = pathParts.join(\"/\");\n return { owner, repo, branch, path };\n }\n\n // Handle direct branch format: owner/repo/branch/path\n const branch = parts[2];\n const pathParts = parts.slice(3);\n if (pathParts.length > 0 && pathParts[pathParts.length - 1].includes(\".\")) {\n pathParts.pop();\n }\n const path = pathParts.join(\"/\");\n return { owner, repo, branch, path };\n }\n\n // Handle github.com tree URLs\n // Format: https://github.com/owner/repo/tree/branch/path\n if (urlObj.hostname === \"github.com\") {\n if (parts.length < 4 || parts[2] !== \"tree\") return null;\n\n const owner = parts[0];\n const repo = parts[1];\n const branch = parts[3];\n const path = parts.slice(4).join(\"/\");\n\n return { owner, repo, branch, path };\n }\n\n return null;\n } catch {\n return null;\n }\n}\n\nexport async function downloadSkillFromGitHub(\n skill: Skill & { project: string }\n): Promise<{ files: SkillFile[]; error?: string }> {\n try {\n const parsed = parseGitHubUrl(skill.url);\n\n if (!parsed) {\n return { files: [], error: `Invalid GitHub URL: ${skill.url}` };\n }\n\n const { owner, repo, branch, path: skillPath } = parsed;\n\n const treeUrl = `${GITHUB_API}/repos/${owner}/${repo}/git/trees/${branch}?recursive=1`;\n const treeResponse = await fetch(treeUrl, {\n headers: {\n Accept: \"application/vnd.github.v3+json\",\n \"User-Agent\": \"context7-cli\",\n },\n });\n\n if (!treeResponse.ok) {\n return { files: [], error: `GitHub API error: ${treeResponse.status}` };\n }\n\n const treeData = (await treeResponse.json()) as GitHubTreeResponse;\n\n const skillFiles = treeData.tree.filter(\n (item) => item.type === \"blob\" && item.path.startsWith(skillPath + \"/\")\n );\n\n if (skillFiles.length === 0) {\n return { files: [], error: `No files found in ${skillPath}` };\n }\n\n const files: SkillFile[] = [];\n for (const item of skillFiles) {\n const rawUrl = `${GITHUB_RAW}/${owner}/${repo}/${branch}/${item.path}`;\n const fileResponse = await fetch(rawUrl);\n\n if (!fileResponse.ok) {\n console.warn(`Failed to fetch ${item.path}: ${fileResponse.status}`);\n continue;\n }\n\n const content = await fileResponse.text();\n const relativePath = item.path.slice(skillPath.length + 1);\n\n files.push({\n path: relativePath,\n content,\n });\n }\n\n return { files };\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n return { files: [], error: message };\n }\n}\n","import type {\n ListSkillsResponse,\n SingleSkillResponse,\n SearchResponse,\n DownloadResponse,\n LibrarySearchResponse,\n SkillQuestionsResponse,\n StructuredGenerateInput,\n GenerateStreamEvent,\n SkillQuotaResponse,\n} from \"../types.js\";\nimport { downloadSkillFromGitHub } from \"./github.js\";\n\nlet baseUrl = \"https://context7.com\";\n\nexport function getBaseUrl(): string {\n return baseUrl;\n}\n\nexport function setBaseUrl(url: string): void {\n baseUrl = url;\n}\n\nexport async function listProjectSkills(project: string): Promise<ListSkillsResponse> {\n const params = new URLSearchParams({ project });\n const response = await fetch(`${baseUrl}/api/v2/skills?${params}`);\n return (await response.json()) as ListSkillsResponse;\n}\n\nexport async function getSkill(project: string, skillName: string): Promise<SingleSkillResponse> {\n const params = new URLSearchParams({ project, skill: skillName });\n const response = await fetch(`${baseUrl}/api/v2/skills?${params}`);\n return (await response.json()) as SingleSkillResponse;\n}\n\nexport async function searchSkills(query: string): Promise<SearchResponse> {\n const params = new URLSearchParams({ query });\n const response = await fetch(`${baseUrl}/api/v2/skills?${params}`);\n return (await response.json()) as SearchResponse;\n}\n\nexport async function downloadSkill(project: string, skillName: string): Promise<DownloadResponse> {\n const skillData = await getSkill(project, skillName);\n\n if (skillData.error) {\n return {\n skill: { name: skillName, description: \"\", url: \"\", project },\n files: [],\n error: skillData.message || skillData.error,\n };\n }\n\n const skill = {\n name: skillData.name,\n description: skillData.description,\n url: skillData.url,\n project: skillData.project,\n };\n\n const { files, error } = await downloadSkillFromGitHub(skill);\n\n if (error) {\n return { skill, files: [], error };\n }\n\n return { skill, files };\n}\n\nexport interface GenerateSkillResponse {\n content: string;\n libraryName: string;\n error?: string;\n}\n\nexport async function searchLibraries(\n query: string,\n accessToken?: string\n): Promise<LibrarySearchResponse> {\n const params = new URLSearchParams({ query });\n const headers: Record<string, string> = {};\n if (accessToken) {\n headers[\"Authorization\"] = `Bearer ${accessToken}`;\n }\n const response = await fetch(`${baseUrl}/api/v2/libs/search?${params}`, { headers });\n return (await response.json()) as LibrarySearchResponse;\n}\n\nexport async function getSkillQuota(accessToken: string): Promise<SkillQuotaResponse> {\n const response = await fetch(`${baseUrl}/api/v2/skills/quota`, {\n headers: { Authorization: `Bearer ${accessToken}` },\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n return {\n used: 0,\n limit: 0,\n remaining: 0,\n tier: \"free\",\n resetDate: null,\n error: (errorData as { message?: string }).message || `HTTP error ${response.status}`,\n };\n }\n\n return (await response.json()) as SkillQuotaResponse;\n}\n\nexport async function getSkillQuestions(\n libraries: Array<{ id: string; name: string }>,\n motivation: string,\n accessToken?: string\n): Promise<SkillQuestionsResponse> {\n const headers: Record<string, string> = { \"Content-Type\": \"application/json\" };\n if (accessToken) {\n headers[\"Authorization\"] = `Bearer ${accessToken}`;\n }\n\n const response = await fetch(`${baseUrl}/api/v2/skills/questions`, {\n method: \"POST\",\n headers,\n body: JSON.stringify({ libraries, motivation }),\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n return {\n questions: [],\n error: (errorData as { message?: string }).message || `HTTP error ${response.status}`,\n };\n }\n\n return (await response.json()) as SkillQuestionsResponse;\n}\n\nexport async function generateSkillStructured(\n input: StructuredGenerateInput,\n onEvent?: (event: GenerateStreamEvent) => void,\n accessToken?: string\n): Promise<GenerateSkillResponse> {\n const headers: Record<string, string> = { \"Content-Type\": \"application/json\" };\n if (accessToken) {\n headers[\"Authorization\"] = `Bearer ${accessToken}`;\n }\n\n const response = await fetch(`${baseUrl}/api/v2/skills/generate`, {\n method: \"POST\",\n headers,\n body: JSON.stringify(input),\n });\n\n const libraryName = input.libraries[0]?.name || \"skill\";\n return handleGenerateResponse(response, libraryName, onEvent);\n}\n\nasync function handleGenerateResponse(\n response: Response,\n libraryName: string,\n onEvent?: (event: GenerateStreamEvent) => void\n): Promise<GenerateSkillResponse> {\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n return {\n content: \"\",\n libraryName,\n error: (errorData as { message?: string }).message || `HTTP error ${response.status}`,\n };\n }\n\n const reader = response.body?.getReader();\n if (!reader) {\n return { content: \"\", libraryName, error: \"No response body\" };\n }\n\n const decoder = new TextDecoder();\n let content = \"\";\n let finalLibraryName = libraryName;\n let error: string | undefined;\n let buffer = \"\"; // Buffer for incomplete lines across chunks\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n const chunk = decoder.decode(value, { stream: true });\n buffer += chunk;\n\n // Split by newline but keep track of incomplete lines\n const lines = buffer.split(\"\\n\");\n // Keep the last element (may be incomplete) in the buffer\n buffer = lines.pop() || \"\";\n\n for (const line of lines) {\n const trimmedLine = line.trim();\n if (!trimmedLine) continue;\n\n try {\n const data = JSON.parse(trimmedLine) as GenerateStreamEvent;\n\n if (onEvent) {\n onEvent(data);\n }\n\n if (data.type === \"complete\") {\n content = data.content || \"\";\n finalLibraryName = data.libraryName || libraryName;\n } else if (data.type === \"error\") {\n error = data.message;\n }\n } catch {\n // Ignore malformed JSON lines\n }\n }\n }\n\n // Process any remaining data in the buffer\n if (buffer.trim()) {\n try {\n const data = JSON.parse(buffer.trim()) as GenerateStreamEvent;\n if (onEvent) {\n onEvent(data);\n }\n if (data.type === \"complete\") {\n content = data.content || \"\";\n finalLibraryName = data.libraryName || libraryName;\n } else if (data.type === \"error\") {\n error = data.message;\n }\n } catch {\n // Ignore malformed JSON\n }\n }\n\n return { content, libraryName: finalLibraryName, error };\n}\n","import pc from \"picocolors\";\n\nexport const log = {\n info: (message: string) => console.log(pc.cyan(message)),\n success: (message: string) => console.log(pc.green(`✔ ${message}`)),\n warn: (message: string) => console.log(pc.yellow(`⚠ ${message}`)),\n error: (message: string) => console.log(pc.red(`✖ ${message}`)),\n dim: (message: string) => console.log(pc.dim(message)),\n item: (message: string) => console.log(pc.green(` ${message}`)),\n itemAdd: (message: string) => console.log(` ${pc.green(\"+\")} ${message}`),\n plain: (message: string) => console.log(message),\n blank: () => console.log(\"\"),\n};\n","import pc from \"picocolors\";\nimport { select, checkbox, confirm } from \"@inquirer/prompts\";\nimport { access } from \"fs/promises\";\nimport { join } from \"path\";\nimport { homedir } from \"os\";\n\nimport { log } from \"./logger.js\";\nimport type {\n IDE,\n IDEOptions,\n Scope,\n AddOptions,\n ListOptions,\n RemoveOptions,\n InstallTargets,\n} from \"../types.js\";\nimport { IDE_PATHS, IDE_GLOBAL_PATHS, IDE_NAMES, DEFAULT_CONFIG } from \"../types.js\";\nimport { dirname } from \"path\";\n\nexport function getSelectedIdes(options: IDEOptions): IDE[] {\n const ides: IDE[] = [];\n if (options.claude) ides.push(\"claude\");\n if (options.cursor) ides.push(\"cursor\");\n if (options.codex) ides.push(\"codex\");\n if (options.opencode) ides.push(\"opencode\");\n if (options.amp) ides.push(\"amp\");\n if (options.antigravity) ides.push(\"antigravity\");\n return ides;\n}\n\nexport function hasExplicitIdeOption(options: IDEOptions): boolean {\n return !!(\n options.claude ||\n options.cursor ||\n options.codex ||\n options.opencode ||\n options.amp ||\n options.antigravity\n );\n}\n\ninterface DetectedIdes {\n ides: IDE[];\n scope: Scope;\n}\n\nexport async function detectInstalledIdes(preferredScope?: Scope): Promise<DetectedIdes | null> {\n const allIdes = Object.keys(IDE_PATHS) as IDE[];\n\n if (preferredScope === \"global\") {\n const globalIdes: IDE[] = [];\n for (const ide of allIdes) {\n const detectionPath = dirname(IDE_GLOBAL_PATHS[ide]);\n const globalParent = join(homedir(), detectionPath);\n try {\n await access(globalParent);\n globalIdes.push(ide);\n } catch {}\n }\n if (globalIdes.length > 0) {\n return { ides: globalIdes, scope: \"global\" };\n }\n return null;\n }\n\n const projectIdes: IDE[] = [];\n for (const ide of allIdes) {\n const detectionPath = dirname(IDE_PATHS[ide]);\n const projectParent = join(process.cwd(), detectionPath);\n try {\n await access(projectParent);\n projectIdes.push(ide);\n } catch {}\n }\n\n if (projectIdes.length > 0) {\n return { ides: projectIdes, scope: \"project\" };\n }\n\n return null;\n}\n\nexport async function promptForInstallTargets(options: AddOptions): Promise<InstallTargets | null> {\n if (hasExplicitIdeOption(options)) {\n const ides = getSelectedIdes(options);\n const scope: Scope = options.global ? \"global\" : \"project\";\n return {\n ides: ides.length > 0 ? ides : [DEFAULT_CONFIG.defaultIde],\n scopes: [scope],\n };\n }\n\n const preferredScope: Scope | undefined = options.global ? \"global\" : undefined;\n const detected = await detectInstalledIdes(preferredScope);\n\n if (detected) {\n const scope: Scope = options.global ? \"global\" : detected.scope;\n const pathMap = scope === \"global\" ? IDE_GLOBAL_PATHS : IDE_PATHS;\n const baseDir = scope === \"global\" ? homedir() : process.cwd();\n\n const paths = detected.ides.map((ide) => join(baseDir, pathMap[ide]));\n const pathList = paths.join(\"\\n\");\n\n log.blank();\n let confirmed: boolean;\n try {\n confirmed = await confirm({\n message: `Install to detected location(s)?\\n${pc.dim(pathList)}`,\n default: true,\n });\n } catch {\n return null;\n }\n\n if (!confirmed) {\n log.warn(\"Installation cancelled\");\n return null;\n }\n\n return { ides: detected.ides, scopes: [scope] };\n }\n\n // No IDE detected - prompt user to select which client(s) to install for\n log.blank();\n\n const scope: Scope = options.global ? \"global\" : \"project\";\n const pathMap = scope === \"global\" ? IDE_GLOBAL_PATHS : IDE_PATHS;\n const baseDir = scope === \"global\" ? homedir() : process.cwd();\n\n const ideChoices = (Object.keys(IDE_NAMES) as IDE[]).map((ide) => ({\n name: `${IDE_NAMES[ide]} ${pc.dim(`(${pathMap[ide]})`)}`,\n value: ide,\n checked: ide === DEFAULT_CONFIG.defaultIde,\n }));\n\n let selectedIdes: IDE[];\n try {\n selectedIdes = await checkbox({\n message: `Which clients do you want to install the skill(s) for?\\n${pc.dim(baseDir)}`,\n choices: ideChoices,\n required: true,\n loop: false,\n theme: { style: { highlight: (text: string) => pc.green(text) } },\n });\n } catch {\n return null;\n }\n\n if (selectedIdes.length === 0) {\n log.warn(\"You must select at least one client\");\n return null;\n }\n\n return { ides: selectedIdes, scopes: [scope] };\n}\n\nexport async function promptForSingleTarget(\n options: ListOptions | RemoveOptions\n): Promise<{ ide: IDE; scope: Scope } | null> {\n if (hasExplicitIdeOption(options)) {\n const ides = getSelectedIdes(options);\n const ide = ides[0] || DEFAULT_CONFIG.defaultIde;\n const scope: Scope = options.global ? \"global\" : \"project\";\n return { ide, scope };\n }\n\n log.blank();\n\n const ideChoices = (Object.keys(IDE_NAMES) as IDE[]).map((ide) => ({\n name: `${IDE_NAMES[ide]} ${pc.dim(`(${IDE_PATHS[ide]})`)}`,\n value: ide,\n }));\n\n let selectedIde: IDE;\n try {\n selectedIde = await select({\n message: \"Which client?\",\n choices: ideChoices,\n default: DEFAULT_CONFIG.defaultIde,\n 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 // Prioritize Claude to receive original files (others get symlinks)\n const sortedIdes = [...targets.ides].sort((a, b) => {\n if (a === \"claude\") return -1;\n if (b === \"claude\") return 1;\n return 0;\n });\n\n const dirs: string[] = [];\n for (const ide of sortedIdes) {\n for (const scope of targets.scopes) {\n if (scope === \"global\") {\n dirs.push(join(homedir(), IDE_GLOBAL_PATHS[ide]));\n } else {\n dirs.push(join(process.cwd(), IDE_PATHS[ide]));\n }\n }\n }\n return dirs;\n}\n\nexport function getTargetDirFromSelection(ide: IDE, scope: Scope): string {\n if (scope === \"global\") {\n return join(homedir(), IDE_GLOBAL_PATHS[ide]);\n }\n return join(process.cwd(), IDE_PATHS[ide]);\n}\n","export interface SkillFile {\n path: string;\n content: string;\n}\n\nexport interface Skill {\n name: string;\n description: string;\n url: string;\n installCount?: number;\n trustScore?: number;\n}\n\nexport interface SkillSearchResult extends Skill {\n project: string;\n}\n\nexport interface ListSkillsResponse {\n project: string;\n skills: Skill[];\n blockedSkillsCount?: number;\n error?: string;\n message?: string;\n}\n\nexport interface SingleSkillResponse extends Skill {\n project: string;\n error?: string;\n message?: string;\n}\n\nexport interface SearchResponse {\n results: SkillSearchResult[];\n error?: string;\n message?: string;\n}\n\nexport interface DownloadResponse {\n skill: Skill & { project: string };\n files: SkillFile[];\n error?: string;\n}\n\n// Library search types\nexport interface LibrarySearchResult {\n id: string;\n title: string;\n description: string;\n branch: string;\n totalSnippets: number;\n totalTokens?: number;\n stars?: number;\n trustScore?: number;\n benchmarkScore?: number;\n versions?: string[];\n vip?: boolean;\n}\n\nexport interface LibrarySearchResponse {\n results: LibrarySearchResult[];\n error?: string;\n message?: string;\n}\n\n// Skill generation types\nexport interface SkillQuestion {\n question: string;\n options: string[];\n recommendedIndex: number;\n}\n\nexport interface SkillQuestionsResponse {\n questions: SkillQuestion[];\n error?: string;\n message?: string;\n}\n\nexport interface SkillAnswer {\n question: string;\n answer: string;\n}\n\nexport interface LibraryInput {\n id: string;\n name: string;\n}\n\nexport interface StructuredGenerateInput {\n motivation: string;\n libraries: LibraryInput[];\n answers: SkillAnswer[];\n feedback?: string;\n previousContent?: string;\n}\n\nexport interface ToolResultSnippet {\n title: string;\n content: string;\n}\n\nexport interface ProgressEvent {\n type: \"progress\";\n message: string;\n}\n\nexport interface ToolResultEvent {\n type: \"tool_result\";\n toolName: string;\n query: string;\n libraryId?: string;\n results: ToolResultSnippet[];\n}\n\nexport interface CompleteEvent {\n type: \"complete\";\n content: string;\n libraryName: string;\n}\n\nexport interface ErrorEvent {\n type: \"error\";\n message: string;\n}\n\nexport type GenerateStreamEvent = ProgressEvent | ToolResultEvent | CompleteEvent | ErrorEvent;\n\nexport type IDE = \"claude\" | \"cursor\" | \"codex\" | \"opencode\" | \"amp\" | \"antigravity\";\n\nexport type Scope = \"project\" | \"global\";\n\nexport interface IDEOptions {\n claude?: boolean;\n cursor?: boolean;\n codex?: boolean;\n opencode?: boolean;\n amp?: boolean;\n antigravity?: boolean;\n}\n\nexport interface ScopeOptions {\n global?: boolean;\n}\n\nexport type AddOptions = IDEOptions & ScopeOptions & { all?: boolean };\nexport type ListOptions = IDEOptions & ScopeOptions;\nexport type RemoveOptions = IDEOptions & ScopeOptions;\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 codex: \".codex/skills\",\n opencode: \".opencode/skills\",\n amp: \".agents/skills\",\n antigravity: \".agent/skills\",\n};\n\nexport const IDE_GLOBAL_PATHS: Record<IDE, string> = {\n claude: \".claude/skills\",\n cursor: \".cursor/skills\",\n codex: \".codex/skills\",\n opencode: \".config/opencode/skills\",\n amp: \".config/agents/skills\",\n antigravity: \".agent/skills\",\n};\n\nexport const IDE_NAMES: Record<IDE, string> = {\n claude: \"Claude Code\",\n cursor: \"Cursor\",\n codex: \"Codex\",\n opencode: \"OpenCode\",\n amp: \"Amp\",\n antigravity: \"Antigravity\",\n};\n\nexport interface C7Config {\n defaultIde: IDE;\n defaultScope: \"project\" | \"global\";\n}\n\nexport const DEFAULT_CONFIG: C7Config = {\n defaultIde: \"claude\",\n defaultScope: \"project\",\n};\n\nexport interface SkillQuotaResponse {\n used: number;\n limit: number;\n remaining: number;\n tier: \"free\" | \"pro\" | \"unlimited\";\n resetDate: string | null;\n message?: string;\n error?: string;\n}\n","import pc from \"picocolors\";\nimport { checkbox, type Separator } from \"@inquirer/prompts\";\nimport readline from \"readline\";\n\ntype CheckboxConfig<T> = Parameters<typeof checkbox<T>>[0];\ntype CheckboxChoice<T> = Exclude<CheckboxConfig<T>[\"choices\"][number], Separator | string>;\n\n/**\n * Creates a clickable terminal hyperlink using OSC 8 escape sequence.\n */\nexport function terminalLink(text: string, url: string, color?: (s: string) => string): string {\n const colorFn = color ?? ((s: string) => s);\n return `\\x1b]8;;${url}\\x07${colorFn(text)}\\x1b]8;;\\x07 ${pc.white(\"↗\")}`;\n}\n\n/**\n * Formats install count for display.\n */\nexport function formatInstallCount(count: number | undefined, placeholder = \"\"): string {\n if (count === undefined || count === 0) return placeholder;\n\n return pc.yellow(String(count));\n}\n\nexport function formatTrustScore(score: number | undefined): string {\n if (score === undefined || score < 0) return pc.dim(\"-\");\n\n if (score < 3) return pc.red(score.toFixed(1));\n return pc.yellow(score.toFixed(1));\n}\nexport interface CheckboxWithHoverOptions<T> {\n /** Function to extract display name from value. Defaults to (v) => v.name */\n getName?: (value: T) => string;\n}\n\nexport async function checkboxWithHover<T>(\n config: CheckboxConfig<T>,\n options?: CheckboxWithHoverOptions<T>\n): Promise<T[]> {\n const choices = config.choices.filter(\n (c): c is CheckboxChoice<T> =>\n typeof c === \"object\" && c !== null && !(\"type\" in c && c.type === \"separator\")\n );\n const values = choices.map((c) => c.value);\n const totalItems = values.length;\n let cursorPosition = 0;\n\n // Default getName assumes object has 'name' property\n const getName = options?.getName ?? ((v: T) => (v as { name: string }).name);\n\n const keypressHandler = (_str: string | undefined, key: readline.Key) => {\n if (key.name === \"up\" && cursorPosition > 0) {\n cursorPosition--;\n } else if (key.name === \"down\" && cursorPosition < totalItems - 1) {\n cursorPosition++;\n }\n };\n\n readline.emitKeypressEvents(process.stdin);\n process.stdin.on(\"keypress\", keypressHandler);\n\n const customConfig = {\n ...config,\n theme: {\n ...config.theme,\n style: {\n ...config.theme?.style,\n highlight: (text: string) => pc.green(text),\n renderSelectedChoices: (\n selected: CheckboxChoice<T>[],\n _allChoices: CheckboxChoice<T>[]\n ): string => {\n if (selected.length === 0) {\n return pc.dim(getName(values[cursorPosition]));\n }\n return selected.map((c) => getName(c.value)).join(\", \");\n },\n },\n },\n };\n\n try {\n const selected = await checkbox(customConfig);\n if (selected.length === 0) {\n return [values[cursorPosition]];\n }\n return selected;\n } finally {\n process.stdin.removeListener(\"keypress\", keypressHandler);\n }\n}\n","import { mkdir, writeFile, rm, symlink, lstat } from \"fs/promises\";\nimport { join } from \"path\";\n\nimport type { SkillFile } from \"../types.js\";\n\nexport async function installSkillFiles(\n skillName: string,\n files: SkillFile[],\n targetDir: string\n): Promise<void> {\n const skillDir = join(targetDir, skillName);\n\n for (const file of files) {\n const filePath = join(skillDir, file.path);\n const fileDir = join(filePath, \"..\");\n\n await mkdir(fileDir, { recursive: true });\n await writeFile(filePath, file.content);\n }\n}\n\nexport async function symlinkSkill(\n skillName: string,\n sourcePath: string,\n targetDir: string\n): Promise<void> {\n const targetPath = join(targetDir, skillName);\n\n try {\n const stats = await lstat(targetPath);\n if (stats.isSymbolicLink() || stats.isDirectory()) {\n await rm(targetPath, { recursive: true });\n }\n } catch {}\n\n await mkdir(targetDir, { recursive: true });\n await symlink(sourcePath, targetPath);\n}\n","import { getBaseUrl } from \"./api.js\";\n\nexport function trackEvent(event: string, data?: Record<string, unknown>): void {\n if (process.env.CTX7_TELEMETRY_DISABLED) return;\n fetch(`${getBaseUrl()}/api/v2/cli/events`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ event, data }),\n }).catch(() => {});\n}\n","import { Command } from \"commander\";\nimport pc from \"picocolors\";\nimport ora from \"ora\";\nimport { mkdir, writeFile, readFile, unlink } from \"fs/promises\";\nimport { join } from \"path\";\nimport { homedir } from \"os\";\nimport { spawn } from \"child_process\";\nimport { input, select } from \"@inquirer/prompts\";\n\nimport {\n searchLibraries,\n getSkillQuestions,\n generateSkillStructured,\n getSkillQuota,\n} from \"../utils/api.js\";\nimport { loadTokens, isTokenExpired } from \"../utils/auth.js\";\nimport { performLogin } from \"./auth.js\";\nimport { log } from \"../utils/logger.js\";\nimport { promptForInstallTargets, getTargetDirs } from \"../utils/ide.js\";\nimport selectOrInput from \"../utils/selectOrInput.js\";\nimport { checkboxWithHover, terminalLink } from \"../utils/prompts.js\";\nimport { trackEvent } from \"../utils/tracking.js\";\nimport type {\n GenerateOptions,\n LibrarySearchResult,\n SkillAnswer,\n StructuredGenerateInput,\n GenerateStreamEvent,\n ToolResultSnippet,\n} from \"../types.js\";\n\ninterface QueryLogEntry {\n query: string;\n libraryId?: string;\n results: ToolResultSnippet[];\n}\n\nexport function registerGenerateCommand(skillCommand: Command): void {\n skillCommand\n .command(\"generate\")\n .alias(\"gen\")\n .alias(\"g\")\n .option(\"-o, --output <dir>\", \"Output directory (default: current directory)\")\n .option(\"--all\", \"Generate for all detected IDEs\")\n .option(\"--global\", \"Generate in global skills directory\")\n .option(\"--claude\", \"Claude Code (.claude/skills/)\")\n .option(\"--cursor\", \"Cursor (.cursor/skills/)\")\n .option(\"--codex\", \"Codex (.codex/skills/)\")\n .option(\"--opencode\", \"OpenCode (.opencode/skills/)\")\n .option(\"--amp\", \"Amp (.agents/skills/)\")\n .option(\"--antigravity\", \"Antigravity (.agent/skills/)\")\n .description(\"Generate a skill for a library using AI\")\n .action(async (options: GenerateOptions) => {\n await generateCommand(options);\n });\n}\n\nasync function generateCommand(options: GenerateOptions): Promise<void> {\n trackEvent(\"command\", { name: \"generate\" });\n log.blank();\n\n let accessToken: string | null = null;\n const tokens = loadTokens();\n if (tokens && !isTokenExpired(tokens)) {\n accessToken = tokens.access_token;\n } else {\n log.info(\"Authentication required. Logging in...\");\n log.blank();\n accessToken = await performLogin();\n if (!accessToken) {\n log.error(\"Login failed. Please try again.\");\n return;\n }\n log.blank();\n }\n\n const initSpinner = ora().start();\n const quota = await getSkillQuota(accessToken);\n\n if (quota.error) {\n initSpinner.fail(pc.red(\"Failed to initialize\"));\n return;\n }\n\n if (quota.tier !== \"unlimited\" && quota.remaining < 1) {\n initSpinner.fail(pc.red(\"Weekly skill generation limit reached\"));\n log.blank();\n console.log(\n ` You've used ${pc.bold(pc.white(quota.used.toString()))}/${pc.bold(pc.white(quota.limit.toString()))} skill generations this week.`\n );\n console.log(\n ` Your quota resets on ${pc.yellow(new Date(quota.resetDate!).toLocaleDateString())}.`\n );\n log.blank();\n if (quota.tier === \"free\") {\n console.log(\n ` ${pc.yellow(\"Tip:\")} Upgrade to Pro for ${pc.bold(\"10\")} generations per week.`\n );\n console.log(` Visit ${pc.green(\"https://context7.com/dashboard\")} to upgrade.`);\n }\n return;\n }\n\n initSpinner.stop();\n initSpinner.clear();\n\n console.log(pc.bold(\"What should your agent become an expert at?\\n\"));\n console.log(\n pc.dim(\n \"Skills should encode best practices, constraints, and decision-making —\\nnot step-by-step tutorials or one-off tasks.\\n\"\n )\n );\n console.log(pc.yellow(\"Examples:\"));\n // prettier-ignore\n {\n console.log(pc.red(' ✕ \"Deploy a Next.js app to Vercel\"'));\n console.log(pc.green(' ✓ \"Best practices and constraints for deploying Next.js apps to Vercel\"'));\n log.blank();\n console.log(pc.red(' ✕ \"Use Tailwind for responsive design\"'));\n console.log(pc.green(' ✓ \"Responsive layout decision-making with Tailwind CSS\"'));\n log.blank();\n console.log(pc.red(' ✕ \"Build OAuth with NextAuth\"'));\n console.log(pc.green(' ✓ \"OAuth authentication patterns and pitfalls with NextAuth.js\"'));\n }\n log.blank();\n\n let motivation: string;\n try {\n motivation = await input({\n message: \"Describe the expertise:\",\n });\n\n if (!motivation.trim()) {\n log.warn(\"Expertise description is required\");\n return;\n }\n motivation = motivation.trim();\n } catch {\n log.warn(\"Generation cancelled\");\n return;\n }\n\n log.blank();\n console.log(\n pc.dim(\n \"To generate this skill, we will read relevant documentation and examples\\nfrom Context7.\\n\"\n )\n );\n console.log(\n pc.dim(\n \"These sources are used to:\\n• extract best practices and constraints\\n• compare patterns across official docs and examples\\n• avoid outdated or incorrect guidance\\n\"\n )\n );\n console.log(pc.dim(\"You can adjust which sources the skill is based on.\\n\"));\n\n const searchSpinner = ora(\"Finding relevant sources...\").start();\n const searchResult = await searchLibraries(motivation, accessToken);\n\n if (searchResult.error || !searchResult.results?.length) {\n searchSpinner.fail(pc.red(\"No sources found\"));\n log.warn(searchResult.message || \"Try a different description\");\n return;\n }\n\n searchSpinner.succeed(pc.green(`Found ${searchResult.results.length} relevant sources`));\n log.blank();\n\n let selectedLibraries: LibrarySearchResult[];\n try {\n const formatProjectId = (id: string) => {\n return id.startsWith(\"/\") ? id.slice(1) : id;\n };\n\n const isGitHubRepo = (id: string): boolean => {\n const cleanId = id.startsWith(\"/\") ? id.slice(1) : id;\n const parts = cleanId.split(\"/\");\n if (parts.length !== 2) return false;\n const nonGitHubPrefixes = [\"websites\", \"packages\", \"npm\", \"docs\", \"libraries\", \"llmstxt\"];\n return !nonGitHubPrefixes.includes(parts[0].toLowerCase());\n };\n\n const libraries = searchResult.results.slice(0, 5);\n const indexWidth = libraries.length.toString().length;\n const maxNameLen = Math.max(...libraries.map((lib) => lib.title.length));\n\n const libraryChoices = libraries.map((lib, index) => {\n const projectId = formatProjectId(lib.id);\n const isGitHub = isGitHubRepo(lib.id);\n const indexStr = pc.dim(`${(index + 1).toString().padStart(indexWidth)}.`);\n const paddedName = lib.title.padEnd(maxNameLen);\n\n const libUrl = `https://context7.com${lib.id}`;\n const libLink = terminalLink(lib.title, libUrl, pc.white);\n const sourceUrl = isGitHub\n ? `https://github.com/${projectId}`\n : `https://context7.com${lib.id}`;\n const repoLink = terminalLink(projectId, sourceUrl, pc.white);\n\n const starsLine =\n lib.stars && isGitHub ? [`${pc.yellow(\"Stars:\")} ${lib.stars.toLocaleString()}`] : [];\n\n const metadataLines = [\n pc.dim(\"─\".repeat(50)),\n \"\",\n `${pc.yellow(\"Library:\")} ${libLink}`,\n `${pc.yellow(\"Source:\")} ${repoLink}`,\n `${pc.yellow(\"Snippets:\")} ${lib.totalSnippets.toLocaleString()}`,\n ...starsLine,\n `${pc.yellow(\"Description:\")}`,\n pc.white(lib.description || \"No description\"),\n ];\n\n return {\n name: `${indexStr} ${paddedName} ${pc.dim(`(${projectId})`)}`,\n value: lib,\n description: metadataLines.join(\"\\n\"),\n };\n });\n\n selectedLibraries = await checkboxWithHover(\n {\n message: \"Select sources:\",\n choices: libraryChoices,\n pageSize: 10,\n loop: false,\n },\n { getName: (lib) => `${lib.title} (${formatProjectId(lib.id)})` }\n );\n\n if (!selectedLibraries || selectedLibraries.length === 0) {\n log.info(\"No sources selected. Try running the command again.\");\n return;\n }\n } catch {\n log.warn(\"Generation cancelled\");\n return;\n }\n\n log.blank();\n\n const questionsSpinner = ora(\n \"Preparing follow-up questions to clarify scope and constraints...\"\n ).start();\n const librariesInput = selectedLibraries.map((lib) => ({ id: lib.id, name: lib.title }));\n const questionsResult = await getSkillQuestions(librariesInput, motivation, accessToken);\n\n if (questionsResult.error || !questionsResult.questions?.length) {\n questionsSpinner.fail(pc.red(\"Failed to generate questions\"));\n log.warn(questionsResult.message || \"Please try again\");\n return;\n }\n\n questionsSpinner.succeed(pc.green(\"Questions prepared\"));\n log.blank();\n\n const answers: SkillAnswer[] = [];\n try {\n for (let i = 0; i < questionsResult.questions.length; i++) {\n const q = questionsResult.questions[i];\n const questionNum = i + 1;\n const totalQuestions = questionsResult.questions.length;\n\n const answer = await selectOrInput({\n message: `${pc.dim(`[${questionNum}/${totalQuestions}]`)} ${q.question}`,\n options: q.options,\n recommendedIndex: q.recommendedIndex,\n });\n\n answers.push({\n question: q.question,\n answer,\n });\n\n const linesToClear = 3 + q.options.length;\n process.stdout.write(`\\x1b[${linesToClear}A\\x1b[J`);\n\n const truncatedAnswer = answer.length > 50 ? answer.slice(0, 47) + \"...\" : answer;\n console.log(`${pc.green(\"✓\")} ${pc.dim(`[${questionNum}/${totalQuestions}]`)} ${q.question}`);\n console.log(` ${pc.cyan(truncatedAnswer)}`);\n log.blank();\n }\n } catch {\n log.warn(\"Generation cancelled\");\n return;\n }\n\n let generatedContent: string | null = null;\n let skillName: string = \"\";\n let feedback: string | undefined;\n let previewFile: string | null = null;\n let previewFileWritten = false;\n\n const cleanupPreviewFile = async () => {\n if (previewFile) {\n await unlink(previewFile).catch(() => {});\n }\n };\n\n const queryLog: QueryLogEntry[] = [];\n let genSpinner: ReturnType<typeof ora> | null = null;\n\n const formatQueryLogText = (): string => {\n if (queryLog.length === 0) return \"\";\n\n const lines: string[] = [];\n const latestEntry = queryLog[queryLog.length - 1];\n\n lines.push(\"\");\n\n for (const result of latestEntry.results.slice(0, 3)) {\n const cleanContent = result.content.replace(/Source:\\s*https?:\\/\\/[^\\s]+/gi, \"\").trim();\n if (cleanContent) {\n lines.push(` ${pc.yellow(\"•\")} ${pc.white(result.title)}`);\n const maxLen = 400;\n const content =\n cleanContent.length > maxLen ? cleanContent.slice(0, maxLen - 3) + \"...\" : cleanContent;\n const words = content.split(\" \");\n let currentLine = \" \";\n for (const word of words) {\n if (currentLine.length + word.length > 84) {\n lines.push(pc.dim(currentLine));\n currentLine = \" \" + word + \" \";\n } else {\n currentLine += word + \" \";\n }\n }\n if (currentLine.trim()) {\n lines.push(pc.dim(currentLine));\n }\n lines.push(\"\");\n }\n }\n\n return \"\\n\" + lines.join(\"\\n\");\n };\n\n let isGeneratingContent = false;\n let initialStatus = \"Reading selected Context7 sources to generate the skill...\";\n\n const handleStreamEvent = (event: GenerateStreamEvent) => {\n if (event.type === \"progress\") {\n if (genSpinner) {\n if (event.message.startsWith(\"Generating skill content...\") && !isGeneratingContent) {\n isGeneratingContent = true;\n if (queryLog.length > 0) {\n genSpinner.succeed(pc.green(`Read Context7 sources`));\n } else {\n genSpinner.succeed(pc.green(`Ready to generate`));\n }\n genSpinner = ora(\"Generating skill content...\").start();\n } else if (!isGeneratingContent) {\n genSpinner.text = initialStatus + formatQueryLogText();\n }\n }\n } else if (event.type === \"tool_result\") {\n queryLog.push({\n query: event.query,\n libraryId: event.libraryId,\n results: event.results,\n });\n if (genSpinner && !isGeneratingContent) {\n genSpinner.text = genSpinner.text.split(\"\\n\")[0] + formatQueryLogText();\n }\n }\n };\n\n while (true) {\n const generateInput: StructuredGenerateInput = {\n motivation,\n libraries: librariesInput,\n answers,\n feedback,\n previousContent: feedback && generatedContent ? generatedContent : undefined,\n };\n\n queryLog.length = 0;\n isGeneratingContent = false;\n previewFileWritten = false;\n initialStatus = feedback\n ? \"Regenerating skill with your feedback...\"\n : \"Reading selected Context7 sources to generate the skill...\";\n\n genSpinner = ora(initialStatus).start();\n\n const result = await generateSkillStructured(generateInput, handleStreamEvent, accessToken);\n\n if (result.error) {\n genSpinner.fail(pc.red(`Error: ${result.error}`));\n return;\n }\n\n if (!result.content) {\n genSpinner.fail(pc.red(\"No content generated\"));\n return;\n }\n\n genSpinner.succeed(pc.green(`Generated skill for \"${result.libraryName}\"`));\n generatedContent = result.content;\n skillName = result.libraryName.toLowerCase().replace(/[^a-z0-9-]/g, \"-\");\n\n const contentLines = generatedContent.split(\"\\n\");\n const previewLineCount = 20;\n const hasMoreLines = contentLines.length > previewLineCount;\n const previewContent = contentLines.slice(0, previewLineCount).join(\"\\n\");\n const remainingLines = contentLines.length - previewLineCount;\n\n const showPreview = () => {\n log.blank();\n console.log(pc.dim(\"━\".repeat(70)));\n console.log(pc.bold(`Generated Skill: `) + pc.green(pc.bold(skillName)));\n console.log(pc.dim(\"━\".repeat(70)));\n log.blank();\n console.log(previewContent);\n if (hasMoreLines) {\n log.blank();\n console.log(pc.dim(`... ${remainingLines} more lines`));\n }\n log.blank();\n console.log(pc.dim(\"━\".repeat(70)));\n log.blank();\n };\n\n const openInEditor = async () => {\n const previewDir = join(homedir(), \".context7\", \"previews\");\n await mkdir(previewDir, { recursive: true });\n previewFile = join(previewDir, `${skillName}.md`);\n if (!previewFileWritten) {\n await writeFile(previewFile, generatedContent!, \"utf-8\");\n previewFileWritten = true;\n }\n const editor = process.env.EDITOR || \"open\";\n await new Promise<void>((resolve) => {\n const child = spawn(editor, [previewFile!], {\n stdio: \"inherit\",\n shell: true,\n });\n child.on(\"close\", () => resolve());\n });\n };\n\n const syncFromPreviewFile = async () => {\n if (previewFile) {\n generatedContent = await readFile(previewFile, \"utf-8\");\n }\n };\n\n showPreview();\n\n await new Promise((resolve) => setTimeout(resolve, 100));\n\n try {\n let action: string;\n while (true) {\n const choices = [\n { name: `${pc.green(\"✓\")} Install skill (save locally)`, value: \"install\" },\n { name: `${pc.blue(\"⤢\")} Edit skill in editor`, value: \"view\" },\n { name: `${pc.yellow(\"✎\")} Request changes`, value: \"feedback\" },\n { name: `${pc.red(\"✕\")} Cancel`, value: \"cancel\" },\n ];\n\n action = await select({\n message: \"What would you like to do?\",\n choices,\n });\n\n if (action === \"view\") {\n await openInEditor();\n continue;\n }\n await syncFromPreviewFile();\n break;\n }\n\n if (action === \"install\") {\n break;\n } else if (action === \"cancel\") {\n await cleanupPreviewFile();\n log.warn(\"Generation cancelled\");\n return;\n } else if (action === \"feedback\") {\n trackEvent(\"gen_feedback\");\n feedback = await input({\n message: \"What changes would you like? (press Enter to skip)\",\n });\n\n if (!feedback.trim()) {\n feedback = undefined;\n }\n log.blank();\n }\n } catch {\n await cleanupPreviewFile();\n log.warn(\"Generation cancelled\");\n return;\n }\n }\n\n const targets = await promptForInstallTargets(options);\n if (!targets) {\n log.warn(\"Generation cancelled\");\n return;\n }\n\n const targetDirs = getTargetDirs(targets);\n\n const writeSpinner = ora(\"Writing skill files...\").start();\n\n let permissionError = false;\n const failedDirs: Set<string> = new Set();\n\n for (const targetDir of targetDirs) {\n let finalDir = targetDir;\n if (options.output && !targetDir.includes(\"/.config/\") && !targetDir.startsWith(homedir())) {\n finalDir = targetDir.replace(process.cwd(), options.output);\n }\n const skillDir = join(finalDir, skillName);\n const skillPath = join(skillDir, \"SKILL.md\");\n\n try {\n await mkdir(skillDir, { recursive: true });\n await writeFile(skillPath, generatedContent!, \"utf-8\");\n } catch (err) {\n const error = err as NodeJS.ErrnoException;\n if (error.code === \"EACCES\" || error.code === \"EPERM\") {\n permissionError = true;\n failedDirs.add(skillDir);\n } else {\n log.warn(`Failed to write to ${skillPath}: ${error.message}`);\n }\n }\n }\n\n if (permissionError) {\n writeSpinner.fail(pc.red(\"Permission denied\"));\n log.blank();\n console.log(pc.yellow(\"Fix permissions with:\"));\n for (const dir of failedDirs) {\n const parentDir = join(dir, \"..\");\n console.log(pc.dim(` sudo chown -R $(whoami) \"${parentDir}\"`));\n }\n log.blank();\n return;\n }\n\n writeSpinner.succeed(pc.green(`Created skill in ${targetDirs.length} location(s)`));\n trackEvent(\"gen_install\");\n\n log.blank();\n console.log(pc.green(\"Skill saved successfully\"));\n for (const targetDir of targetDirs) {\n console.log(pc.dim(` ${targetDir}/`) + pc.green(skillName));\n }\n log.blank();\n\n await cleanupPreviewFile();\n}\n","import * as crypto from \"crypto\";\nimport * as http from \"http\";\nimport * as fs from \"fs\";\nimport * as path from \"path\";\nimport * as os from \"os\";\n\nconst CONFIG_DIR = path.join(os.homedir(), \".context7\");\nconst CREDENTIALS_FILE = path.join(CONFIG_DIR, \"credentials.json\");\n\nexport interface TokenData {\n access_token: string;\n refresh_token?: string;\n token_type: string;\n expires_in?: number;\n expires_at?: number;\n scope?: string;\n}\n\nexport interface PKCEChallenge {\n codeVerifier: string;\n codeChallenge: string;\n}\n\nexport function generatePKCE(): PKCEChallenge {\n const codeVerifier = crypto.randomBytes(32).toString(\"base64url\");\n const codeChallenge = crypto.createHash(\"sha256\").update(codeVerifier).digest(\"base64url\");\n return { codeVerifier, codeChallenge };\n}\n\nexport function generateState(): string {\n return crypto.randomBytes(16).toString(\"base64url\");\n}\n\nfunction ensureConfigDir(): void {\n if (!fs.existsSync(CONFIG_DIR)) {\n fs.mkdirSync(CONFIG_DIR, { recursive: true, mode: 0o700 });\n }\n}\n\nexport function saveTokens(tokens: TokenData): void {\n ensureConfigDir();\n const data = {\n ...tokens,\n expires_at:\n tokens.expires_at ?? (tokens.expires_in ? Date.now() + tokens.expires_in * 1000 : undefined),\n };\n fs.writeFileSync(CREDENTIALS_FILE, JSON.stringify(data, null, 2), { mode: 0o600 });\n}\n\nexport function loadTokens(): TokenData | null {\n if (!fs.existsSync(CREDENTIALS_FILE)) {\n return null;\n }\n try {\n const data = JSON.parse(fs.readFileSync(CREDENTIALS_FILE, \"utf-8\"));\n return data as TokenData;\n } catch {\n return null;\n }\n}\n\nexport function clearTokens(): boolean {\n if (fs.existsSync(CREDENTIALS_FILE)) {\n fs.unlinkSync(CREDENTIALS_FILE);\n return true;\n }\n return false;\n}\n\nexport function isTokenExpired(tokens: TokenData): boolean {\n if (!tokens.expires_at) {\n return false;\n }\n return Date.now() > tokens.expires_at - 60000;\n}\n\nexport interface CallbackResult {\n code: string;\n state: string;\n}\n\n// Port for OAuth callback server - must match registered redirect URI\nconst CALLBACK_PORT = 52417;\n\nexport function createCallbackServer(expectedState: string): {\n port: Promise<number>;\n result: Promise<CallbackResult>;\n close: () => void;\n} {\n let resolvePort: (port: number) => void;\n let resolveResult: (result: CallbackResult) => void;\n let rejectResult: (error: Error) => void;\n let serverInstance: http.Server | null = null;\n\n const portPromise = new Promise<number>((resolve) => {\n resolvePort = resolve;\n });\n\n const resultPromise = new Promise<CallbackResult>((resolve, reject) => {\n resolveResult = resolve;\n rejectResult = reject;\n });\n\n const server = http.createServer((req, res) => {\n const url = new URL(req.url || \"/\", `http://localhost`);\n\n if (url.pathname === \"/callback\") {\n const code = url.searchParams.get(\"code\");\n const state = url.searchParams.get(\"state\");\n const error = url.searchParams.get(\"error\");\n const errorDescription = url.searchParams.get(\"error_description\");\n\n res.writeHead(200, { \"Content-Type\": \"text/html\" });\n\n if (error) {\n res.end(errorPage(errorDescription || error));\n serverInstance?.close();\n rejectResult(new Error(errorDescription || error));\n return;\n }\n\n if (!code || !state) {\n res.end(errorPage(\"Missing authorization code or state\"));\n serverInstance?.close();\n rejectResult(new Error(\"Missing authorization code or state\"));\n return;\n }\n\n if (state !== expectedState) {\n res.end(errorPage(\"State mismatch - possible CSRF attack\"));\n serverInstance?.close();\n rejectResult(new Error(\"State mismatch\"));\n return;\n }\n\n res.end(successPage());\n serverInstance?.close();\n resolveResult({ code, state });\n } else {\n res.writeHead(404);\n res.end(\"Not found\");\n }\n });\n\n serverInstance = server;\n\n server.on(\"error\", (err) => {\n rejectResult(err as Error);\n });\n\n server.listen(CALLBACK_PORT, \"127.0.0.1\", () => {\n resolvePort(CALLBACK_PORT);\n });\n\n const timeout = setTimeout(\n () => {\n server.close();\n rejectResult(new Error(\"Login timed out after 5 minutes\"));\n },\n 5 * 60 * 1000\n );\n\n return {\n port: portPromise,\n result: resultPromise,\n close: () => {\n clearTimeout(timeout);\n server.close();\n },\n };\n}\n\nfunction successPage(): string {\n return `<!DOCTYPE html>\n<html>\n <head><title>Login Successful</title></head>\n <body style=\"font-family: system-ui; display: flex; justify-content: center; align-items: center; height: 100vh; margin: 0; background: #f9fafb;\">\n <div style=\"text-align: center; padding: 2rem;\">\n <div style=\"width: 64px; height: 64px; background: #16a34a; border-radius: 50%; display: flex; align-items: center; justify-content: center; margin: 0 auto 1rem;\">\n <svg width=\"32\" height=\"32\" fill=\"none\" stroke=\"white\" stroke-width=\"3\" viewBox=\"0 0 24 24\">\n <path d=\"M5 13l4 4L19 7\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </div>\n <h1 style=\"color: #16a34a; margin: 0 0 0.5rem;\">Login Successful!</h1>\n <p style=\"color: #6b7280; margin: 0;\">You can close this window and return to the terminal.</p>\n </div>\n </body>\n</html>`;\n}\n\nfunction escapeHtml(text: string): string {\n return text\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/'/g, \"&#039;\");\n}\n\nfunction errorPage(message: string): string {\n const safeMessage = escapeHtml(message);\n return `<!DOCTYPE html>\n<html>\n <head><title>Login Failed</title></head>\n <body style=\"font-family: system-ui; display: flex; justify-content: center; align-items: center; height: 100vh; margin: 0; background: #f9fafb;\">\n <div style=\"text-align: center; padding: 2rem;\">\n <div style=\"width: 64px; height: 64px; background: #dc2626; border-radius: 50%; display: flex; align-items: center; justify-content: center; margin: 0 auto 1rem;\">\n <svg width=\"32\" height=\"32\" fill=\"none\" stroke=\"white\" stroke-width=\"3\" viewBox=\"0 0 24 24\">\n <path d=\"M6 18L18 6M6 6l12 12\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </div>\n <h1 style=\"color: #dc2626; margin: 0 0 0.5rem;\">Login Failed</h1>\n <p style=\"color: #6b7280; margin: 0;\">${safeMessage}</p>\n <p style=\"color: #9ca3af; margin: 1rem 0 0; font-size: 0.875rem;\">You can close this window.</p>\n </div>\n </body>\n</html>`;\n}\n\ninterface TokenErrorResponse {\n error?: string;\n error_description?: string;\n}\n\nexport async function exchangeCodeForTokens(\n baseUrl: string,\n code: string,\n codeVerifier: string,\n redirectUri: string,\n clientId: string\n): Promise<TokenData> {\n const response = await fetch(`${baseUrl}/api/oauth/token`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/x-www-form-urlencoded\" },\n body: new URLSearchParams({\n grant_type: \"authorization_code\",\n client_id: clientId,\n code,\n code_verifier: codeVerifier,\n redirect_uri: redirectUri,\n }).toString(),\n });\n\n if (!response.ok) {\n const err = (await response.json().catch(() => ({}))) as TokenErrorResponse;\n throw new Error(err.error_description || err.error || \"Failed to exchange code for tokens\");\n }\n\n return (await response.json()) as TokenData;\n}\n\nexport function buildAuthorizationUrl(\n baseUrl: string,\n clientId: string,\n redirectUri: string,\n codeChallenge: string,\n state: string\n): string {\n const url = new URL(`${baseUrl}/api/oauth/authorize`);\n url.searchParams.set(\"client_id\", clientId);\n url.searchParams.set(\"redirect_uri\", redirectUri);\n url.searchParams.set(\"code_challenge\", codeChallenge);\n url.searchParams.set(\"code_challenge_method\", \"S256\");\n url.searchParams.set(\"state\", state);\n url.searchParams.set(\"scope\", \"profile email\");\n url.searchParams.set(\"response_type\", \"code\");\n return url.toString();\n}\n","import { Command } from \"commander\";\nimport pc from \"picocolors\";\nimport ora from \"ora\";\nimport open from \"open\";\nimport {\n generatePKCE,\n generateState,\n createCallbackServer,\n exchangeCodeForTokens,\n saveTokens,\n loadTokens,\n clearTokens,\n buildAuthorizationUrl,\n isTokenExpired,\n} from \"../utils/auth.js\";\n\nimport { trackEvent } from \"../utils/tracking.js\";\n\nconst CLI_CLIENT_ID = \"2veBSofhicRBguUT\";\n\nlet baseUrl = \"https://context7.com\";\n\nexport function setAuthBaseUrl(url: string): void {\n baseUrl = url;\n}\n\nexport function registerAuthCommands(program: Command): void {\n program\n .command(\"login\")\n .description(\"Log in to Context7\")\n .option(\"--no-browser\", \"Don't open browser automatically\")\n .action(async (options) => {\n await loginCommand(options);\n });\n\n program\n .command(\"logout\")\n .description(\"Log out of Context7\")\n .action(() => {\n logoutCommand();\n });\n\n program\n .command(\"whoami\")\n .description(\"Show current login status\")\n .action(async () => {\n await whoamiCommand();\n });\n}\n\nexport async function performLogin(openBrowser = true): Promise<string | null> {\n const spinner = ora(\"Preparing login...\").start();\n\n try {\n const { codeVerifier, codeChallenge } = generatePKCE();\n const state = generateState();\n const callbackServer = createCallbackServer(state);\n const port = await callbackServer.port;\n const redirectUri = `http://localhost:${port}/callback`;\n const authUrl = buildAuthorizationUrl(\n baseUrl,\n CLI_CLIENT_ID,\n redirectUri,\n codeChallenge,\n state\n );\n\n spinner.stop();\n\n console.log(\"\");\n console.log(pc.bold(\"Opening browser to log in...\"));\n console.log(\"\");\n\n if (openBrowser) {\n await open(authUrl);\n console.log(pc.dim(\"If the browser didn't open, visit this URL:\"));\n } else {\n console.log(pc.dim(\"Open this URL in your browser:\"));\n }\n console.log(pc.cyan(authUrl));\n console.log(\"\");\n\n const waitingSpinner = ora(\"Waiting for login...\").start();\n\n try {\n const { code } = await callbackServer.result;\n waitingSpinner.text = \"Exchanging code for tokens...\";\n\n const tokens = await exchangeCodeForTokens(\n baseUrl,\n code,\n codeVerifier,\n redirectUri,\n CLI_CLIENT_ID\n );\n saveTokens(tokens);\n callbackServer.close();\n\n waitingSpinner.succeed(pc.green(\"Login successful!\"));\n return tokens.access_token;\n } catch (error) {\n callbackServer.close();\n waitingSpinner.fail(pc.red(\"Login failed\"));\n if (error instanceof Error) {\n console.error(pc.red(error.message));\n }\n return null;\n }\n } catch (error) {\n spinner.fail(pc.red(\"Login failed\"));\n if (error instanceof Error) {\n console.error(pc.red(error.message));\n }\n return null;\n }\n}\n\nasync function loginCommand(options: { browser: boolean }): Promise<void> {\n trackEvent(\"command\", { name: \"login\" });\n const existingTokens = loadTokens();\n if (existingTokens) {\n const expired = isTokenExpired(existingTokens);\n if (!expired || existingTokens.refresh_token) {\n console.log(pc.yellow(\"You are already logged in.\"));\n console.log(\n pc.dim(\"Run 'ctx7 logout' first if you want to log in with a different account.\")\n );\n return;\n }\n clearTokens();\n }\n\n const token = await performLogin(options.browser);\n if (!token) {\n process.exit(1);\n }\n console.log(\"\");\n console.log(pc.dim(\"You can now use authenticated Context7 features.\"));\n}\n\nfunction logoutCommand(): void {\n trackEvent(\"command\", { name: \"logout\" });\n if (clearTokens()) {\n console.log(pc.green(\"Logged out successfully.\"));\n } else {\n console.log(pc.yellow(\"You are not logged in.\"));\n }\n}\n\nasync function whoamiCommand(): Promise<void> {\n trackEvent(\"command\", { name: \"whoami\" });\n const tokens = loadTokens();\n\n if (!tokens) {\n console.log(pc.yellow(\"Not logged in.\"));\n console.log(pc.dim(\"Run 'ctx7 login' to authenticate.\"));\n return;\n }\n\n console.log(pc.green(\"Logged in\"));\n\n try {\n const userInfo = await fetchUserInfo(tokens.access_token);\n if (userInfo.name) {\n console.log(`${pc.dim(\"Name:\".padEnd(9))}${userInfo.name}`);\n }\n if (userInfo.email) {\n console.log(`${pc.dim(\"Email:\".padEnd(9))}${userInfo.email}`);\n }\n } catch {\n if (isTokenExpired(tokens) && !tokens.refresh_token) {\n console.log(pc.dim(\"(Session may be expired - run 'ctx7 login' to refresh)\"));\n }\n }\n}\n\ninterface UserInfo {\n sub?: string;\n name?: string;\n email?: string;\n picture?: string;\n}\n\nasync function fetchUserInfo(accessToken: string): Promise<UserInfo> {\n const response = await fetch(\"https://clerk.context7.com/oauth/userinfo\", {\n headers: {\n Authorization: `Bearer ${accessToken}`,\n },\n });\n\n if (!response.ok) {\n throw new Error(\"Failed to fetch user info\");\n }\n\n return (await response.json()) as UserInfo;\n}\n","import {\n createPrompt,\n useState,\n useKeypress,\n usePrefix,\n isEnterKey,\n isUpKey,\n isDownKey,\n} from \"@inquirer/core\";\nimport type { KeypressEvent } from \"@inquirer/core\";\nimport pc from \"picocolors\";\n\nexport interface SelectOrInputConfig {\n message: string;\n options: string[];\n recommendedIndex?: number;\n}\n\nfunction reorderOptions(options: string[], recommendedIndex: number): string[] {\n if (recommendedIndex === 0) return options;\n const reordered = [options[recommendedIndex]];\n for (let i = 0; i < options.length; i++) {\n if (i !== recommendedIndex) reordered.push(options[i]);\n }\n return reordered;\n}\n\nconst selectOrInput: (config: SelectOrInputConfig) => Promise<string> = createPrompt<\n string,\n SelectOrInputConfig\n>((config, done): string => {\n const { message, options: rawOptions, recommendedIndex = 0 } = config;\n const options = reorderOptions(rawOptions, recommendedIndex);\n const [cursor, setCursor] = useState(0);\n const [inputValue, setInputValue] = useState(\"\");\n\n const prefix = usePrefix({});\n\n useKeypress((key: KeypressEvent, rl) => {\n if (isUpKey(key)) {\n setCursor(Math.max(0, cursor - 1));\n return;\n }\n\n if (isDownKey(key)) {\n setCursor(Math.min(options.length, cursor + 1));\n return;\n }\n\n if (isEnterKey(key)) {\n if (cursor === options.length) {\n const finalValue = inputValue.trim();\n done(finalValue || options[0]);\n } else {\n done(options[cursor]);\n }\n return;\n }\n\n // Text input handling (only when on custom input line)\n if (cursor === options.length && key.name !== \"return\") {\n if ((key.name === \"w\" && key.ctrl) || key.name === \"backspace\") {\n if (key.name === \"w\" && key.ctrl) {\n const words = inputValue.trimEnd().split(/\\s+/);\n if (words.length > 0) {\n words.pop();\n setInputValue(\n words.join(\" \") + (inputValue.endsWith(\" \") && words.length > 0 ? \" \" : \"\")\n );\n }\n } else {\n setInputValue(inputValue.slice(0, -1));\n }\n } else if (key.name === \"u\" && key.ctrl) {\n setInputValue(\"\");\n } else if (key.name === \"space\") {\n setInputValue(inputValue + \" \");\n } else if (key.name && key.name.length === 1 && !key.ctrl) {\n setInputValue(inputValue + key.name);\n }\n } else if (rl.line) {\n rl.line = \"\";\n }\n });\n\n let output = `${prefix} ${pc.bold(message)}\\n\\n`;\n\n options.forEach((opt: string, idx: number) => {\n const isRecommended = idx === 0;\n const isCursor = idx === cursor;\n const number = pc.cyan(`${idx + 1}.`);\n const text = isRecommended ? `${opt} ${pc.green(\"✓ Recommended\")}` : opt;\n\n if (isCursor) {\n output += pc.cyan(`❯ ${number} ${text}\\n`);\n } else {\n output += ` ${number} ${text}\\n`;\n }\n });\n\n const isCustomCursor = cursor === options.length;\n if (isCustomCursor) {\n output += pc.cyan(`❯ ${pc.yellow(\"✎\")} ${inputValue || pc.dim(\"Type your own...\")}`);\n } else {\n output += ` ${pc.yellow(\"✎\")} ${pc.dim(\"Type your own...\")}`;\n }\n\n return output;\n});\n\nexport default selectOrInput;\n","import { readFileSync } from \"fs\";\nimport { fileURLToPath } from \"url\";\nimport { dirname, join } from \"path\";\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\nconst pkg = JSON.parse(readFileSync(join(__dirname, \"../package.json\"), \"utf-8\"));\n\nexport const VERSION: string = pkg.version;\nexport const NAME: string = pkg.name;\n"],"mappings":"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","names":["pc","pc","ora","rm","join","input","path","branch","pathParts","path","input","pc","scope","pathMap","baseDir","pc","pc","checkbox","join","pc","ora","mkdir","writeFile","join","homedir","select","baseUrl","pc","baseUrl","program","pc","pc","ora","pc","join","homedir","mkdir","writeFile","select","homedir","program","input","ora","pc","join","path","rm","readFileSync","dirname","join","pc"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/commands/skill.ts","../src/utils/parse-input.ts","../src/utils/github.ts","../src/utils/api.ts","../src/utils/logger.ts","../src/utils/ide.ts","../src/types.ts","../src/utils/prompts.ts","../src/utils/installer.ts","../src/utils/tracking.ts","../src/commands/generate.ts","../src/utils/auth.ts","../src/commands/auth.ts","../src/utils/selectOrInput.ts","../src/utils/deps.ts","../src/constants.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport pc from \"picocolors\";\nimport figlet from \"figlet\";\nimport { registerSkillCommands, registerSkillAliases } from \"./commands/skill.js\";\nimport { registerAuthCommands, setAuthBaseUrl } from \"./commands/auth.js\";\nimport { setBaseUrl } from \"./utils/api.js\";\nimport { VERSION } from \"./constants.js\";\n\nconst brand = {\n primary: pc.green,\n dim: pc.dim,\n};\n\nconst program = new Command();\n\nprogram\n .name(\"ctx7\")\n .description(\"Context7 CLI - Manage AI coding skills and documentation context\")\n .version(VERSION)\n .option(\"--base-url <url>\")\n .hook(\"preAction\", (thisCommand) => {\n const opts = thisCommand.opts();\n if (opts.baseUrl) {\n setBaseUrl(opts.baseUrl);\n setAuthBaseUrl(opts.baseUrl);\n }\n })\n .addHelpText(\n \"after\",\n `\nExamples:\n ${brand.dim(\"# Search for skills\")}\n ${brand.primary(\"npx ctx7 skills search pdf\")}\n ${brand.primary(\"npx ctx7 skills search react hooks\")}\n\n ${brand.dim(\"# Install from a repository\")}\n ${brand.primary(\"npx ctx7 skills install /anthropics/skills\")}\n ${brand.primary(\"npx ctx7 skills install /anthropics/skills pdf\")}\n\n ${brand.dim(\"# Install to specific client\")}\n ${brand.primary(\"npx ctx7 skills install /anthropics/skills --cursor\")}\n ${brand.primary(\"npx ctx7 skills install /anthropics/skills --global\")}\n\n ${brand.dim(\"# List and manage installed skills\")}\n ${brand.primary(\"npx ctx7 skills list --claude\")}\n ${brand.primary(\"npx ctx7 skills remove pdf\")}\n\nVisit ${brand.primary(\"https://context7.com\")} to browse skills\n`\n );\n\nregisterSkillCommands(program);\nregisterSkillAliases(program);\nregisterAuthCommands(program);\n\nprogram.action(() => {\n console.log(\"\");\n const banner = figlet.textSync(\"Context7\", { font: \"ANSI Shadow\" });\n console.log(brand.primary(banner));\n console.log(brand.dim(\" The open agent skills ecosystem\"));\n console.log(\"\");\n\n console.log(\" Quick start:\");\n console.log(` ${brand.primary(\"npx ctx7 skills search pdf\")}`);\n console.log(` ${brand.primary(\"npx ctx7 skills install /anthropics/skills\")}`);\n console.log(\"\");\n\n console.log(` Run ${brand.primary(\"npx ctx7 --help\")} for all commands and options`);\n console.log(` Visit ${brand.primary(\"https://context7.com\")} to browse skills`);\n console.log(\"\");\n});\n\nprogram.parse();\n","import { Command } from \"commander\";\nimport pc from \"picocolors\";\nimport ora from \"ora\";\nimport { readdir, rm } from \"fs/promises\";\nimport { join } from \"path\";\n\nimport { parseSkillInput } from \"../utils/parse-input.js\";\nimport {\n listProjectSkills,\n searchSkills,\n suggestSkills,\n downloadSkill,\n getSkill,\n} from \"../utils/api.js\";\nimport { log } from \"../utils/logger.js\";\nimport {\n promptForInstallTargets,\n promptForSingleTarget,\n getTargetDirs,\n getTargetDirFromSelection,\n getSelectedIdes,\n hasExplicitIdeOption,\n} from \"../utils/ide.js\";\nimport {\n checkboxWithHover,\n terminalLink,\n formatInstallCount,\n formatTrustScore,\n} from \"../utils/prompts.js\";\nimport { installSkillFiles, symlinkSkill } from \"../utils/installer.js\";\nimport { trackEvent } from \"../utils/tracking.js\";\nimport { registerGenerateCommand } from \"./generate.js\";\nimport type {\n Skill,\n SkillSearchResult,\n AddOptions,\n ListOptions,\n RemoveOptions,\n SuggestOptions,\n InstallTargets,\n} from \"../types.js\";\nimport { IDE_NAMES, IDE_PATHS, IDE_GLOBAL_PATHS } from \"../types.js\";\nimport type { IDE, Scope } from \"../types.js\";\nimport { homedir } from \"os\";\nimport { detectProjectDependencies } from \"../utils/deps.js\";\nimport { loadTokens, isTokenExpired } from \"../utils/auth.js\";\n\nfunction logInstallSummary(\n targets: InstallTargets,\n targetDirs: string[],\n skillNames: string[]\n): void {\n log.blank();\n let dirIndex = 0;\n for (const ide of targets.ides) {\n for (let i = 0; i < targets.scopes.length; i++) {\n const dir = targetDirs[dirIndex++];\n log.dim(`${IDE_NAMES[ide]}: ${dir}`);\n for (const name of skillNames) {\n log.itemAdd(name);\n }\n }\n }\n log.blank();\n}\n\nexport function registerSkillCommands(program: Command): void {\n const skill = program.command(\"skills\").alias(\"skill\").description(\"Manage AI coding skills\");\n\n // Register generate subcommand\n registerGenerateCommand(skill);\n\n skill\n .command(\"install\")\n .alias(\"i\")\n .alias(\"add\")\n .argument(\"<repository>\", \"GitHub repository (/owner/repo)\")\n .argument(\"[skill]\", \"Specific skill name to install\")\n .option(\"--all\", \"Install all skills without prompting\")\n .option(\"--global\", \"Install globally instead of current directory\")\n .option(\"--claude\", \"Claude Code (.claude/skills/)\")\n .option(\"--cursor\", \"Cursor (.cursor/skills/)\")\n .option(\"--codex\", \"Codex (.codex/skills/)\")\n .option(\"--opencode\", \"OpenCode (.opencode/skills/)\")\n .option(\"--amp\", \"Amp (.agents/skills/)\")\n .option(\"--antigravity\", \"Antigravity (.agent/skills/)\")\n .description(\"Install skills from a repository\")\n .action(async (project: string, skillName: string | undefined, options: AddOptions) => {\n await installCommand(project, skillName, options);\n });\n\n skill\n .command(\"search\")\n .alias(\"s\")\n .argument(\"<keywords...>\", \"Search keywords\")\n .description(\"Search for skills across all indexed repositories\")\n .action(async (keywords: string[]) => {\n await searchCommand(keywords.join(\" \"));\n });\n\n skill\n .command(\"list\")\n .alias(\"ls\")\n .option(\"--global\", \"List global skills\")\n .option(\"--claude\", \"Claude Code (.claude/skills/)\")\n .option(\"--cursor\", \"Cursor (.cursor/skills/)\")\n .option(\"--codex\", \"Codex (.codex/skills/)\")\n .option(\"--opencode\", \"OpenCode (.opencode/skills/)\")\n .option(\"--amp\", \"Amp (.agents/skills/)\")\n .option(\"--antigravity\", \"Antigravity (.agent/skills/)\")\n .description(\"List installed skills\")\n .action(async (options: ListOptions) => {\n await listCommand(options);\n });\n\n skill\n .command(\"remove\")\n .alias(\"rm\")\n .alias(\"delete\")\n .argument(\"<name>\", \"Skill name to remove\")\n .option(\"--global\", \"Remove from global skills\")\n .option(\"--claude\", \"Claude Code (.claude/skills/)\")\n .option(\"--cursor\", \"Cursor (.cursor/skills/)\")\n .option(\"--codex\", \"Codex (.codex/skills/)\")\n .option(\"--opencode\", \"OpenCode (.opencode/skills/)\")\n .option(\"--amp\", \"Amp (.agents/skills/)\")\n .option(\"--antigravity\", \"Antigravity (.agent/skills/)\")\n .description(\"Remove an installed skill\")\n .action(async (name: string, options: RemoveOptions) => {\n await removeCommand(name, options);\n });\n\n skill\n .command(\"info\")\n .argument(\"<repository>\", \"GitHub repository (/owner/repo)\")\n .description(\"Show skills in a repository\")\n .action(async (project: string) => {\n await infoCommand(project);\n });\n\n 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(\"--codex\", \"Codex (.codex/skills/)\")\n .option(\"--opencode\", \"OpenCode (.opencode/skills/)\")\n .option(\"--amp\", \"Amp (.agents/skills/)\")\n .option(\"--antigravity\", \"Antigravity (.agent/skills/)\")\n .description(\"Suggest skills based on your project dependencies\")\n .action(async (options: SuggestOptions) => {\n await suggestCommand(options);\n });\n}\n\nexport function registerSkillAliases(program: Command): void {\n program\n .command(\"si\", { hidden: true })\n .argument(\"<repository>\", \"GitHub repository (/owner/repo)\")\n .argument(\"[skill]\", \"Specific skill name to install\")\n .option(\"--all\", \"Install all skills without prompting\")\n .option(\"--global\", \"Install globally instead of current directory\")\n .option(\"--claude\", \"Claude Code (.claude/skills/)\")\n .option(\"--cursor\", \"Cursor (.cursor/skills/)\")\n .option(\"--codex\", \"Codex (.codex/skills/)\")\n .option(\"--opencode\", \"OpenCode (.opencode/skills/)\")\n .option(\"--amp\", \"Amp (.agents/skills/)\")\n .option(\"--antigravity\", \"Antigravity (.agent/skills/)\")\n .description(\"Install skills (alias for: skills install)\")\n .action(async (project: string, skillName: string | undefined, options: AddOptions) => {\n await installCommand(project, skillName, options);\n });\n\n program\n .command(\"ss\", { hidden: true })\n .argument(\"<keywords...>\", \"Search keywords\")\n .description(\"Search for skills (alias for: skills search)\")\n .action(async (keywords: string[]) => {\n await searchCommand(keywords.join(\" \"));\n });\n\n 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(\"--codex\", \"Codex (.codex/skills/)\")\n .option(\"--opencode\", \"OpenCode (.opencode/skills/)\")\n .option(\"--amp\", \"Amp (.agents/skills/)\")\n .option(\"--antigravity\", \"Antigravity (.agent/skills/)\")\n .description(\"Suggest skills (alias for: skills suggest)\")\n .action(async (options: SuggestOptions) => {\n await suggestCommand(options);\n });\n}\n\nasync function installCommand(\n input: string,\n skillName: string | undefined,\n options: AddOptions\n): Promise<void> {\n trackEvent(\"command\", { name: \"install\" });\n const parsed = parseSkillInput(input);\n if (!parsed) {\n log.error(`Invalid input format: ${input}`);\n log.info(`Expected: /owner/repo or full GitHub URL`);\n log.info(`Example: ctx7 skills install /anthropics/skills pdf`);\n log.blank();\n return;\n }\n const repo = `/${parsed.owner}/${parsed.repo}`;\n\n log.blank();\n const spinner = ora(`Fetching skills from ${repo}...`).start();\n\n let selectedSkills: (Skill & { project: string })[];\n\n // When a specific skill name is provided, fetch only that skill\n if (skillName) {\n spinner.text = `Fetching skill: ${skillName}...`;\n const skillData = await getSkill(repo, skillName);\n\n if (skillData.error || !skillData.name) {\n if (skillData.error === \"prompt_injection_detected\") {\n spinner.fail(pc.red(`Prompt injection detected in skill: ${skillName}`));\n log.warn(\"This skill contains potentially malicious content and cannot be installed.\");\n } else {\n spinner.fail(pc.red(`Skill not found: ${skillName}`));\n }\n return;\n }\n\n spinner.succeed(`Found skill: ${skillName}`);\n selectedSkills = [\n {\n name: skillData.name,\n description: skillData.description,\n url: skillData.url,\n project: repo,\n },\n ];\n } else {\n // Fetch all skills when no specific names provided\n const data = await listProjectSkills(repo);\n\n if (data.error) {\n spinner.fail(pc.red(`Error: ${data.message || data.error}`));\n return;\n }\n\n if (!data.skills || data.skills.length === 0) {\n spinner.warn(pc.yellow(`No skills found in ${repo}`));\n return;\n }\n\n const skillsWithRepo = data.skills\n .map((s) => ({ ...s, project: repo }))\n .sort((a, b) => (b.installCount ?? 0) - (a.installCount ?? 0));\n\n spinner.succeed(`Found ${data.skills.length} skill(s)`);\n\n if (data.blockedSkillsCount && data.blockedSkillsCount > 0) {\n log.blank();\n log.error(\n `${data.blockedSkillsCount} skill(s) blocked due to prompt injection and not shown.`\n );\n log.warn(\"Review other skills from this repository carefully before installing.\");\n }\n\n if (options.all || data.skills.length === 1) {\n selectedSkills = skillsWithRepo;\n } else {\n const indexWidth = data.skills.length.toString().length;\n const maxNameLen = Math.max(...data.skills.map((s) => s.name.length));\n const choices = skillsWithRepo.map((s, index) => {\n const indexStr = pc.dim(`${(index + 1).toString().padStart(indexWidth)}.`);\n const paddedName = s.name.padEnd(maxNameLen);\n const installs = formatInstallCount(s.installCount);\n\n // Build metadata panel shown when item is hovered\n const skillUrl = `https://context7.com/skills${s.project}/${s.name}`;\n const skillLink = terminalLink(s.name, skillUrl, pc.white);\n const repoLink = terminalLink(s.project, `https://github.com${s.project}`, pc.white);\n const metadataLines = [\n pc.dim(\"─\".repeat(50)),\n \"\",\n `${pc.yellow(\"Skill:\")} ${skillLink}`,\n `${pc.yellow(\"Repo:\")} ${repoLink}`,\n `${pc.yellow(\"Description:\")}`,\n pc.white(s.description || \"No description\"),\n ];\n\n return {\n name: installs ? `${indexStr} ${paddedName} ${installs}` : `${indexStr} ${paddedName}`,\n value: s,\n description: metadataLines.join(\"\\n\"),\n };\n });\n\n log.blank();\n\n // Align \"installs\" column header with the count values\n // \"? \" prefix = 2 chars, checkbox prefix \"❯◯ \" = 4 chars, index + dot + space, padded name + space\n const installsOffset = 4 + indexWidth + 1 + 1 + maxNameLen + 1 - 3;\n const message =\n \"Select skills:\" + \" \".repeat(Math.max(1, installsOffset - 14)) + pc.dim(\"installs\");\n\n try {\n selectedSkills = await checkboxWithHover({\n message,\n choices,\n pageSize: 15,\n loop: false,\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\n const indexWidth = data.results.length.toString().length;\n const maxNameLen = Math.max(...data.results.map((s) => s.name.length));\n const installsColWidth = 10;\n const choices = data.results.map((s, index) => {\n const indexStr = pc.dim(`${(index + 1).toString().padStart(indexWidth)}.`);\n const paddedName = s.name.padEnd(maxNameLen);\n const installsRaw = s.installCount ? String(s.installCount) : \"-\";\n const paddedInstalls =\n formatInstallCount(s.installCount, pc.dim(\"-\")) +\n \" \".repeat(installsColWidth - installsRaw.length);\n const trust = formatTrustScore(s.trustScore);\n\n const skillLink = terminalLink(\n s.name,\n `https://context7.com/skills${s.project}/${s.name}`,\n pc.white\n );\n const repoLink = terminalLink(s.project, `https://github.com${s.project}`, pc.white);\n const metadataLines = [\n pc.dim(\"─\".repeat(50)),\n \"\",\n `${pc.yellow(\"Skill:\")} ${skillLink}`,\n `${pc.yellow(\"Repo:\")} ${repoLink}`,\n `${pc.yellow(\"Description:\")}`,\n pc.white(s.description || \"No description\"),\n ];\n\n return {\n name: `${indexStr} ${paddedName} ${paddedInstalls}${trust}`,\n value: s,\n description: metadataLines.join(\"\\n\"),\n };\n });\n\n log.blank();\n\n const checkboxPrefixWidth = 3; // \"❯◯ \" or \" ◯ \"\n const headerPad = \" \".repeat(checkboxPrefixWidth + indexWidth + 1 + 1 + maxNameLen + 1);\n const headerLine =\n headerPad + pc.dim(\"Installs\".padEnd(installsColWidth)) + pc.dim(\"Trust(0-10)\");\n const message = \"Select skills to install:\\n\" + headerLine;\n\n let selectedSkills: SkillSearchResult[];\n try {\n selectedSkills = await checkboxWithHover({\n message,\n choices,\n pageSize: 15,\n loop: false,\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 pathMap = scope === \"global\" ? IDE_GLOBAL_PATHS : IDE_PATHS;\n const baseDir = scope === \"global\" ? homedir() : process.cwd();\n\n const idesToCheck: IDE[] = hasExplicitIdeOption(options)\n ? getSelectedIdes(options)\n : (Object.keys(IDE_NAMES) as IDE[]);\n\n const results: { ide: IDE; skills: string[] }[] = [];\n\n for (const ide of idesToCheck) {\n const skillsDir = join(baseDir, pathMap[ide]);\n try {\n const entries = await readdir(skillsDir, { withFileTypes: true });\n const skillFolders = entries\n .filter((e) => e.isDirectory() || e.isSymbolicLink())\n .map((e) => e.name);\n if (skillFolders.length > 0) {\n results.push({ ide, skills: skillFolders });\n }\n } catch {\n // Directory doesn't exist, skip\n }\n }\n\n if (results.length === 0) {\n log.warn(\"No skills installed\");\n return;\n }\n\n log.blank();\n\n for (const { ide, skills } of results) {\n const ideName = IDE_NAMES[ide];\n const path = pathMap[ide];\n log.plain(`${pc.bold(ideName)} ${pc.dim(path)}`);\n for (const skill of skills) {\n log.plain(` ${pc.green(skill)}`);\n }\n log.blank();\n }\n}\n\nasync function removeCommand(name: string, options: RemoveOptions): Promise<void> {\n trackEvent(\"command\", { name: \"remove\" });\n const target = await promptForSingleTarget(options);\n if (!target) {\n log.warn(\"Cancelled\");\n return;\n }\n\n const skillsDir = getTargetDirFromSelection(target.ide, target.scope);\n const skillPath = join(skillsDir, name);\n\n try {\n await rm(skillPath, { recursive: true });\n log.success(`Removed skill: ${name}`);\n } catch (err) {\n const error = err as NodeJS.ErrnoException;\n if (error.code === \"ENOENT\") {\n log.error(`Skill not found: ${name}`);\n } else if (error.code === \"EACCES\" || error.code === \"EPERM\") {\n log.error(`Permission denied. Try: sudo rm -rf \"${skillPath}\"`);\n } else {\n log.error(`Failed to remove skill: ${error.message}`);\n }\n }\n}\n\nasync function infoCommand(input: string): Promise<void> {\n trackEvent(\"command\", { name: \"info\" });\n const parsed = parseSkillInput(input);\n if (!parsed) {\n log.blank();\n log.error(`Invalid input format: ${input}`);\n log.info(`Expected: /owner/repo or full GitHub URL`);\n log.blank();\n return;\n }\n const repo = `/${parsed.owner}/${parsed.repo}`;\n\n log.blank();\n const spinner = ora(`Fetching skills from ${repo}...`).start();\n\n const data = await listProjectSkills(repo);\n\n if (data.error) {\n spinner.fail(pc.red(`Error: ${data.message || data.error}`));\n return;\n }\n\n if (!data.skills || data.skills.length === 0) {\n spinner.warn(pc.yellow(`No skills found in ${repo}`));\n return;\n }\n\n spinner.succeed(`Found ${data.skills.length} skill(s)`);\n\n log.blank();\n for (const skill of data.skills) {\n log.item(skill.name);\n log.dim(` ${skill.description || \"No description\"}`);\n log.dim(` URL: ${skill.url}`);\n log.blank();\n }\n\n log.plain(\n `${pc.bold(\"Quick commands:\")}\\n` +\n ` Install all: ${pc.cyan(`ctx7 skills install ${repo} --all`)}\\n` +\n ` Install one: ${pc.cyan(`ctx7 skills install ${repo} ${data.skills[0]?.name}`)}\\n`\n );\n}\n\nasync function suggestCommand(options: SuggestOptions): Promise<void> {\n trackEvent(\"command\", { name: \"suggest\" });\n log.blank();\n\n // Step 1: Detect dependencies\n const scanSpinner = ora(\"Scanning project dependencies...\").start();\n const deps = await detectProjectDependencies(process.cwd());\n\n if (deps.length === 0) {\n scanSpinner.warn(pc.yellow(\"No dependencies detected\"));\n log.info(`Try ${pc.cyan(\"ctx7 skills search <keyword>\")} to search manually`);\n return;\n }\n\n scanSpinner.succeed(`Found ${deps.length} dependencies`);\n\n // Step 2: Single API call to backend\n const searchSpinner = ora(\"Finding matching skills...\").start();\n\n const tokens = loadTokens();\n const accessToken = tokens && !isTokenExpired(tokens) ? tokens.access_token : undefined;\n\n let data;\n try {\n data = await suggestSkills(deps, accessToken);\n } catch {\n searchSpinner.fail(pc.red(\"Failed to connect to Context7\"));\n return;\n }\n\n if (data.error) {\n searchSpinner.fail(pc.red(`Error: ${data.message || data.error}`));\n return;\n }\n\n const skills = data.skills;\n\n if (skills.length === 0) {\n searchSpinner.warn(pc.yellow(\"No matching skills found for your dependencies\"));\n return;\n }\n\n searchSpinner.succeed(`Found ${skills.length} relevant skill(s)`);\n trackEvent(\"suggest_results\", { depCount: deps.length, skillCount: skills.length });\n\n log.blank();\n\n const maxNameLen = Math.max(...skills.map((s) => s.name.length));\n const installsColWidth = 10;\n const trustColWidth = 12;\n const maxMatchedLen = Math.max(...skills.map((s) => s.matchedDep.length));\n const indexWidth = skills.length.toString().length;\n\n const choices = skills.map((s, index) => {\n const indexStr = pc.dim(`${(index + 1).toString().padStart(indexWidth)}.`);\n const paddedName = s.name.padEnd(maxNameLen);\n const installsRaw = s.installCount ? String(s.installCount) : \"-\";\n const paddedInstalls =\n formatInstallCount(s.installCount, pc.dim(\"-\")) +\n \" \".repeat(installsColWidth - installsRaw.length);\n const trustRaw =\n s.trustScore !== undefined && s.trustScore >= 0 ? s.trustScore.toFixed(1) : \"-\";\n const trust = formatTrustScore(s.trustScore) + \" \".repeat(trustColWidth - trustRaw.length);\n const matched = pc.yellow(s.matchedDep.padEnd(maxMatchedLen));\n\n const skillLink = terminalLink(\n s.name,\n `https://context7.com/skills${s.project}/${s.name}`,\n pc.white\n );\n const repoLink = terminalLink(s.project, `https://github.com${s.project}`, pc.white);\n const metadataLines = [\n pc.dim(\"─\".repeat(50)),\n \"\",\n `${pc.yellow(\"Skill:\")} ${skillLink}`,\n `${pc.yellow(\"Repo:\")} ${repoLink}`,\n `${pc.yellow(\"Relevant:\")} ${pc.white(s.matchedDep)}`,\n `${pc.yellow(\"Description:\")}`,\n pc.white(s.description || \"No description\"),\n ];\n\n return {\n name: `${indexStr} ${paddedName} ${paddedInstalls}${trust}${matched}`,\n value: s,\n description: metadataLines.join(\"\\n\"),\n };\n });\n\n // Build header\n const checkboxPrefixWidth = 3; // \"❯◯ \" or \" ◯ \"\n const headerPad = \" \".repeat(checkboxPrefixWidth + indexWidth + 1 + 1 + maxNameLen + 1);\n const headerLine =\n headerPad +\n pc.dim(\"Installs\".padEnd(installsColWidth)) +\n pc.dim(\"Trust(0-10)\".padEnd(trustColWidth)) +\n pc.dim(\"Relevant\");\n const message = \"Select skills to install:\\n\" + headerLine;\n\n let selectedSkills: SkillSearchResult[];\n try {\n selectedSkills = await checkboxWithHover({\n message,\n choices,\n pageSize: 15,\n loop: false,\n });\n } catch {\n log.warn(\"Installation cancelled\");\n return;\n }\n\n if (selectedSkills.length === 0) {\n log.warn(\"No skills selected\");\n return;\n }\n\n // Step 4: Install (same pattern as searchCommand)\n const targets = await promptForInstallTargets(options);\n if (!targets) {\n log.warn(\"Installation cancelled\");\n return;\n }\n\n const targetDirs = getTargetDirs(targets);\n const installSpinner = ora(\"Installing skills...\").start();\n\n let permissionError = false;\n const failedDirs: Set<string> = new Set();\n const installedSkills: string[] = [];\n\n for (const skill of selectedSkills) {\n try {\n installSpinner.text = `Downloading ${skill.name}...`;\n const downloadData = await downloadSkill(skill.project, skill.name);\n\n if (downloadData.error) {\n log.warn(`Failed to download ${skill.name}: ${downloadData.error}`);\n continue;\n }\n\n installSpinner.text = `Installing ${skill.name}...`;\n\n const [primaryDir, ...symlinkDirs] = targetDirs;\n\n try {\n await installSkillFiles(skill.name, downloadData.files, primaryDir);\n } catch (dirErr) {\n const error = dirErr as NodeJS.ErrnoException;\n if (error.code === \"EACCES\" || error.code === \"EPERM\") {\n permissionError = true;\n failedDirs.add(primaryDir);\n }\n throw dirErr;\n }\n\n const primarySkillDir = join(primaryDir, skill.name);\n for (const targetDir of symlinkDirs) {\n try {\n await symlinkSkill(skill.name, primarySkillDir, targetDir);\n } catch (dirErr) {\n const error = dirErr as NodeJS.ErrnoException;\n if (error.code === \"EACCES\" || error.code === \"EPERM\") {\n permissionError = true;\n failedDirs.add(targetDir);\n }\n throw dirErr;\n }\n }\n\n installedSkills.push(`${skill.project}/${skill.name}`);\n } catch (err) {\n const error = err as NodeJS.ErrnoException;\n if (error.code === \"EACCES\" || error.code === \"EPERM\") {\n continue;\n }\n const errMsg = err instanceof Error ? err.message : String(err);\n log.warn(`Failed to install ${skill.name}: ${errMsg}`);\n }\n }\n\n if (permissionError) {\n installSpinner.fail(\"Permission denied\");\n log.blank();\n log.warn(\"Fix permissions with:\");\n for (const dir of failedDirs) {\n const parentDir = join(dir, \"..\");\n log.dim(` sudo chown -R $(whoami) \"${parentDir}\"`);\n }\n log.blank();\n return;\n }\n\n installSpinner.succeed(`Installed ${installedSkills.length} skill(s)`);\n trackEvent(\"suggest_install\", { skills: installedSkills, ides: targets.ides });\n\n const installedNames = selectedSkills.map((s) => s.name);\n logInstallSummary(targets, targetDirs, installedNames);\n}\n","export interface ParsedSkillInput {\n type: \"repo\" | \"url\";\n owner: string;\n repo: string;\n branch?: string;\n path?: string;\n}\n\nexport function parseSkillInput(input: string): ParsedSkillInput | null {\n const urlMatch = input.match(\n /(?:https?:\\/\\/)?github\\.com\\/([^\\/]+)\\/([^\\/]+)\\/tree\\/([^\\/]+)\\/(.+)/\n );\n if (urlMatch) {\n const [, owner, repo, branch, path] = urlMatch;\n return { type: \"url\", owner, repo, branch, path };\n }\n\n const shortMatch = input.match(/^\\/?([^\\/]+)\\/([^\\/]+)$/);\n if (shortMatch) {\n const [, owner, repo] = shortMatch;\n return { type: \"repo\", owner, repo };\n }\n\n return null;\n}\n","import type { SkillFile, Skill } from \"../types.js\";\n\nconst GITHUB_API = \"https://api.github.com\";\nconst GITHUB_RAW = \"https://raw.githubusercontent.com\";\n\ninterface GitHubTreeItem {\n path: string;\n mode: string;\n type: \"blob\" | \"tree\";\n sha: string;\n size?: number;\n url: string;\n}\n\ninterface GitHubTreeResponse {\n sha: string;\n url: string;\n tree: GitHubTreeItem[];\n truncated: boolean;\n}\n\nfunction parseGitHubUrl(url: string): {\n owner: string;\n repo: string;\n branch: string;\n path: string;\n} | null {\n try {\n const urlObj = new URL(url);\n const parts = urlObj.pathname.split(\"/\").filter(Boolean);\n\n // Handle raw.githubusercontent.com URLs\n // Format: https://raw.githubusercontent.com/owner/repo/refs/heads/branch/path/SKILL.md\n if (urlObj.hostname === \"raw.githubusercontent.com\") {\n if (parts.length < 5) return null;\n\n const owner = parts[0];\n const repo = parts[1];\n\n // Handle refs/heads/branch format\n if (parts[2] === \"refs\" && parts[3] === \"heads\") {\n const branch = parts[4];\n // Get directory path (exclude the filename like SKILL.md)\n const pathParts = parts.slice(5);\n // Remove the last part if it looks like a file (has extension)\n if (pathParts.length > 0 && pathParts[pathParts.length - 1].includes(\".\")) {\n pathParts.pop();\n }\n const path = pathParts.join(\"/\");\n return { owner, repo, branch, path };\n }\n\n // Handle direct branch format: owner/repo/branch/path\n const branch = parts[2];\n const pathParts = parts.slice(3);\n if (pathParts.length > 0 && pathParts[pathParts.length - 1].includes(\".\")) {\n pathParts.pop();\n }\n const path = pathParts.join(\"/\");\n return { owner, repo, branch, path };\n }\n\n // Handle github.com tree URLs\n // Format: https://github.com/owner/repo/tree/branch/path\n if (urlObj.hostname === \"github.com\") {\n if (parts.length < 4 || parts[2] !== \"tree\") return null;\n\n const owner = parts[0];\n const repo = parts[1];\n const branch = parts[3];\n const path = parts.slice(4).join(\"/\");\n\n return { owner, repo, branch, path };\n }\n\n return null;\n } catch {\n return null;\n }\n}\n\nexport async function downloadSkillFromGitHub(\n skill: Skill & { project: string }\n): Promise<{ files: SkillFile[]; error?: string }> {\n try {\n const parsed = parseGitHubUrl(skill.url);\n\n if (!parsed) {\n return { files: [], error: `Invalid GitHub URL: ${skill.url}` };\n }\n\n const { owner, repo, branch, path: skillPath } = parsed;\n\n const treeUrl = `${GITHUB_API}/repos/${owner}/${repo}/git/trees/${branch}?recursive=1`;\n const treeResponse = await fetch(treeUrl, {\n headers: {\n Accept: \"application/vnd.github.v3+json\",\n \"User-Agent\": \"context7-cli\",\n },\n });\n\n if (!treeResponse.ok) {\n return { files: [], error: `GitHub API error: ${treeResponse.status}` };\n }\n\n const treeData = (await treeResponse.json()) as GitHubTreeResponse;\n\n const skillFiles = treeData.tree.filter(\n (item) => item.type === \"blob\" && item.path.startsWith(skillPath + \"/\")\n );\n\n if (skillFiles.length === 0) {\n return { files: [], error: `No files found in ${skillPath}` };\n }\n\n const files: SkillFile[] = [];\n for (const item of skillFiles) {\n const rawUrl = `${GITHUB_RAW}/${owner}/${repo}/${branch}/${item.path}`;\n const fileResponse = await fetch(rawUrl);\n\n if (!fileResponse.ok) {\n console.warn(`Failed to fetch ${item.path}: ${fileResponse.status}`);\n continue;\n }\n\n const content = await fileResponse.text();\n const relativePath = item.path.slice(skillPath.length + 1);\n\n files.push({\n path: relativePath,\n content,\n });\n }\n\n return { files };\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n return { files: [], error: message };\n }\n}\n","import type {\n ListSkillsResponse,\n SingleSkillResponse,\n SearchResponse,\n SuggestResponse,\n DownloadResponse,\n LibrarySearchResponse,\n SkillQuestionsResponse,\n StructuredGenerateInput,\n GenerateStreamEvent,\n SkillQuotaResponse,\n} from \"../types.js\";\nimport { downloadSkillFromGitHub } from \"./github.js\";\n\nlet baseUrl = \"https://context7.com\";\n\nexport function getBaseUrl(): string {\n return baseUrl;\n}\n\nexport function setBaseUrl(url: string): void {\n baseUrl = url;\n}\n\nexport async function listProjectSkills(project: string): Promise<ListSkillsResponse> {\n const params = new URLSearchParams({ project });\n const response = await fetch(`${baseUrl}/api/v2/skills?${params}`);\n return (await response.json()) as ListSkillsResponse;\n}\n\nexport async function getSkill(project: string, skillName: string): Promise<SingleSkillResponse> {\n const params = new URLSearchParams({ project, skill: skillName });\n const response = await fetch(`${baseUrl}/api/v2/skills?${params}`);\n return (await response.json()) as SingleSkillResponse;\n}\n\nexport async function searchSkills(query: string): Promise<SearchResponse> {\n const params = new URLSearchParams({ query });\n const response = await fetch(`${baseUrl}/api/v2/skills?${params}`);\n return (await response.json()) as SearchResponse;\n}\n\nexport async function suggestSkills(\n dependencies: string[],\n accessToken?: string\n): Promise<SuggestResponse> {\n const headers: Record<string, string> = { \"Content-Type\": \"application/json\" };\n if (accessToken) {\n headers[\"Authorization\"] = `Bearer ${accessToken}`;\n }\n const response = await fetch(`${baseUrl}/api/v2/skills/suggest`, {\n method: \"POST\",\n headers,\n body: JSON.stringify({ dependencies }),\n });\n return (await response.json()) as SuggestResponse;\n}\n\nexport async function downloadSkill(project: string, skillName: string): Promise<DownloadResponse> {\n const skillData = await getSkill(project, skillName);\n\n if (skillData.error) {\n return {\n skill: { name: skillName, description: \"\", url: \"\", project },\n files: [],\n error: skillData.message || skillData.error,\n };\n }\n\n const skill = {\n name: skillData.name,\n description: skillData.description,\n url: skillData.url,\n project: skillData.project,\n };\n\n const { files, error } = await downloadSkillFromGitHub(skill);\n\n if (error) {\n return { skill, files: [], error };\n }\n\n return { skill, files };\n}\n\nexport interface GenerateSkillResponse {\n content: string;\n libraryName: string;\n error?: string;\n}\n\nexport async function searchLibraries(\n query: string,\n accessToken?: string\n): Promise<LibrarySearchResponse> {\n const params = new URLSearchParams({ query });\n const headers: Record<string, string> = {};\n if (accessToken) {\n headers[\"Authorization\"] = `Bearer ${accessToken}`;\n }\n const response = await fetch(`${baseUrl}/api/v2/libs/search?${params}`, { headers });\n return (await response.json()) as LibrarySearchResponse;\n}\n\nexport async function getSkillQuota(accessToken: string): Promise<SkillQuotaResponse> {\n const response = await fetch(`${baseUrl}/api/v2/skills/quota`, {\n headers: { Authorization: `Bearer ${accessToken}` },\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n return {\n used: 0,\n limit: 0,\n remaining: 0,\n tier: \"free\",\n resetDate: null,\n error: (errorData as { message?: string }).message || `HTTP error ${response.status}`,\n };\n }\n\n return (await response.json()) as SkillQuotaResponse;\n}\n\nexport async function getSkillQuestions(\n libraries: Array<{ id: string; name: string }>,\n motivation: string,\n accessToken?: string\n): Promise<SkillQuestionsResponse> {\n const headers: Record<string, string> = { \"Content-Type\": \"application/json\" };\n if (accessToken) {\n headers[\"Authorization\"] = `Bearer ${accessToken}`;\n }\n\n const response = await fetch(`${baseUrl}/api/v2/skills/questions`, {\n method: \"POST\",\n headers,\n body: JSON.stringify({ libraries, motivation }),\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n return {\n questions: [],\n error: (errorData as { message?: string }).message || `HTTP error ${response.status}`,\n };\n }\n\n return (await response.json()) as SkillQuestionsResponse;\n}\n\nexport async function generateSkillStructured(\n input: StructuredGenerateInput,\n onEvent?: (event: GenerateStreamEvent) => void,\n accessToken?: string\n): Promise<GenerateSkillResponse> {\n const headers: Record<string, string> = { \"Content-Type\": \"application/json\" };\n if (accessToken) {\n headers[\"Authorization\"] = `Bearer ${accessToken}`;\n }\n\n const response = await fetch(`${baseUrl}/api/v2/skills/generate`, {\n method: \"POST\",\n headers,\n body: JSON.stringify(input),\n });\n\n const libraryName = input.libraries[0]?.name || \"skill\";\n return handleGenerateResponse(response, libraryName, onEvent);\n}\n\nasync function handleGenerateResponse(\n response: Response,\n libraryName: string,\n onEvent?: (event: GenerateStreamEvent) => void\n): Promise<GenerateSkillResponse> {\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n return {\n content: \"\",\n libraryName,\n error: (errorData as { message?: string }).message || `HTTP error ${response.status}`,\n };\n }\n\n const reader = response.body?.getReader();\n if (!reader) {\n return { content: \"\", libraryName, error: \"No response body\" };\n }\n\n const decoder = new TextDecoder();\n let content = \"\";\n let finalLibraryName = libraryName;\n let error: string | undefined;\n let buffer = \"\"; // Buffer for incomplete lines across chunks\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n const chunk = decoder.decode(value, { stream: true });\n buffer += chunk;\n\n // Split by newline but keep track of incomplete lines\n const lines = buffer.split(\"\\n\");\n // Keep the last element (may be incomplete) in the buffer\n buffer = lines.pop() || \"\";\n\n for (const line of lines) {\n const trimmedLine = line.trim();\n if (!trimmedLine) continue;\n\n try {\n const data = JSON.parse(trimmedLine) as GenerateStreamEvent;\n\n if (onEvent) {\n onEvent(data);\n }\n\n if (data.type === \"complete\") {\n content = data.content || \"\";\n finalLibraryName = data.libraryName || libraryName;\n } else if (data.type === \"error\") {\n error = data.message;\n }\n } catch {\n // Ignore malformed JSON lines\n }\n }\n }\n\n // Process any remaining data in the buffer\n if (buffer.trim()) {\n try {\n const data = JSON.parse(buffer.trim()) as GenerateStreamEvent;\n if (onEvent) {\n onEvent(data);\n }\n if (data.type === \"complete\") {\n content = data.content || \"\";\n finalLibraryName = data.libraryName || libraryName;\n } else if (data.type === \"error\") {\n error = data.message;\n }\n } catch {\n // Ignore malformed JSON\n }\n }\n\n return { content, libraryName: finalLibraryName, error };\n}\n","import pc from \"picocolors\";\n\nexport const log = {\n info: (message: string) => console.log(pc.cyan(message)),\n success: (message: string) => console.log(pc.green(`✔ ${message}`)),\n warn: (message: string) => console.log(pc.yellow(`⚠ ${message}`)),\n error: (message: string) => console.log(pc.red(`✖ ${message}`)),\n dim: (message: string) => console.log(pc.dim(message)),\n item: (message: string) => console.log(pc.green(` ${message}`)),\n itemAdd: (message: string) => console.log(` ${pc.green(\"+\")} ${message}`),\n plain: (message: string) => console.log(message),\n blank: () => console.log(\"\"),\n};\n","import pc from \"picocolors\";\nimport { select, checkbox, confirm } from \"@inquirer/prompts\";\nimport { access } from \"fs/promises\";\nimport { join } from \"path\";\nimport { homedir } from \"os\";\n\nimport { log } from \"./logger.js\";\nimport type {\n IDE,\n IDEOptions,\n Scope,\n AddOptions,\n ListOptions,\n RemoveOptions,\n InstallTargets,\n} from \"../types.js\";\nimport { IDE_PATHS, IDE_GLOBAL_PATHS, IDE_NAMES, DEFAULT_CONFIG } from \"../types.js\";\nimport { dirname } from \"path\";\n\nexport function getSelectedIdes(options: IDEOptions): IDE[] {\n const ides: IDE[] = [];\n if (options.claude) ides.push(\"claude\");\n if (options.cursor) ides.push(\"cursor\");\n if (options.codex) ides.push(\"codex\");\n if (options.opencode) ides.push(\"opencode\");\n if (options.amp) ides.push(\"amp\");\n if (options.antigravity) ides.push(\"antigravity\");\n return ides;\n}\n\nexport function hasExplicitIdeOption(options: IDEOptions): boolean {\n return !!(\n options.claude ||\n options.cursor ||\n options.codex ||\n options.opencode ||\n options.amp ||\n options.antigravity\n );\n}\n\ninterface DetectedIdes {\n ides: IDE[];\n scope: Scope;\n}\n\nexport async function detectInstalledIdes(preferredScope?: Scope): Promise<DetectedIdes | null> {\n const allIdes = Object.keys(IDE_PATHS) as IDE[];\n\n if (preferredScope === \"global\") {\n const globalIdes: IDE[] = [];\n for (const ide of allIdes) {\n const detectionPath = dirname(IDE_GLOBAL_PATHS[ide]);\n const globalParent = join(homedir(), detectionPath);\n try {\n await access(globalParent);\n globalIdes.push(ide);\n } catch {}\n }\n if (globalIdes.length > 0) {\n return { ides: globalIdes, scope: \"global\" };\n }\n return null;\n }\n\n const projectIdes: IDE[] = [];\n for (const ide of allIdes) {\n const detectionPath = dirname(IDE_PATHS[ide]);\n const projectParent = join(process.cwd(), detectionPath);\n try {\n await access(projectParent);\n projectIdes.push(ide);\n } catch {}\n }\n\n if (projectIdes.length > 0) {\n return { ides: projectIdes, scope: \"project\" };\n }\n\n return null;\n}\n\nexport async function promptForInstallTargets(options: AddOptions): Promise<InstallTargets | null> {\n if (hasExplicitIdeOption(options)) {\n const ides = getSelectedIdes(options);\n const scope: Scope = options.global ? \"global\" : \"project\";\n return {\n ides: ides.length > 0 ? ides : [DEFAULT_CONFIG.defaultIde],\n scopes: [scope],\n };\n }\n\n const preferredScope: Scope | undefined = options.global ? \"global\" : undefined;\n const detected = await detectInstalledIdes(preferredScope);\n\n if (detected) {\n const scope: Scope = options.global ? \"global\" : detected.scope;\n const pathMap = scope === \"global\" ? IDE_GLOBAL_PATHS : IDE_PATHS;\n const baseDir = scope === \"global\" ? homedir() : process.cwd();\n\n const paths = detected.ides.map((ide) => join(baseDir, pathMap[ide]));\n const pathList = paths.join(\"\\n\");\n\n log.blank();\n let confirmed: boolean;\n try {\n confirmed = await confirm({\n message: `Install to detected location(s)?\\n${pc.dim(pathList)}`,\n default: true,\n });\n } catch {\n return null;\n }\n\n if (!confirmed) {\n log.warn(\"Installation cancelled\");\n return null;\n }\n\n return { ides: detected.ides, scopes: [scope] };\n }\n\n // No IDE detected - prompt user to select which client(s) to install for\n log.blank();\n\n const scope: Scope = options.global ? \"global\" : \"project\";\n const pathMap = scope === \"global\" ? IDE_GLOBAL_PATHS : IDE_PATHS;\n const baseDir = scope === \"global\" ? homedir() : process.cwd();\n\n const ideChoices = (Object.keys(IDE_NAMES) as IDE[]).map((ide) => ({\n name: `${IDE_NAMES[ide]} ${pc.dim(`(${pathMap[ide]})`)}`,\n value: ide,\n checked: ide === DEFAULT_CONFIG.defaultIde,\n }));\n\n let selectedIdes: IDE[];\n try {\n selectedIdes = await checkbox({\n message: `Which clients do you want to install the skill(s) for?\\n${pc.dim(baseDir)}`,\n choices: ideChoices,\n required: true,\n loop: false,\n theme: { style: { highlight: (text: string) => pc.green(text) } },\n });\n } catch {\n return null;\n }\n\n if (selectedIdes.length === 0) {\n log.warn(\"You must select at least one client\");\n return null;\n }\n\n return { ides: selectedIdes, scopes: [scope] };\n}\n\nexport async function promptForSingleTarget(\n options: ListOptions | RemoveOptions\n): Promise<{ ide: IDE; scope: Scope } | null> {\n if (hasExplicitIdeOption(options)) {\n const ides = getSelectedIdes(options);\n const ide = ides[0] || DEFAULT_CONFIG.defaultIde;\n const scope: Scope = options.global ? \"global\" : \"project\";\n return { ide, scope };\n }\n\n log.blank();\n\n const ideChoices = (Object.keys(IDE_NAMES) as IDE[]).map((ide) => ({\n name: `${IDE_NAMES[ide]} ${pc.dim(`(${IDE_PATHS[ide]})`)}`,\n value: ide,\n }));\n\n let selectedIde: IDE;\n try {\n selectedIde = await select({\n message: \"Which client?\",\n choices: ideChoices,\n default: DEFAULT_CONFIG.defaultIde,\n 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 // Prioritize Claude to receive original files (others get symlinks)\n const sortedIdes = [...targets.ides].sort((a, b) => {\n if (a === \"claude\") return -1;\n if (b === \"claude\") return 1;\n return 0;\n });\n\n const dirs: string[] = [];\n for (const ide of sortedIdes) {\n for (const scope of targets.scopes) {\n if (scope === \"global\") {\n dirs.push(join(homedir(), IDE_GLOBAL_PATHS[ide]));\n } else {\n dirs.push(join(process.cwd(), IDE_PATHS[ide]));\n }\n }\n }\n return dirs;\n}\n\nexport function getTargetDirFromSelection(ide: IDE, scope: Scope): string {\n if (scope === \"global\") {\n return join(homedir(), IDE_GLOBAL_PATHS[ide]);\n }\n return join(process.cwd(), IDE_PATHS[ide]);\n}\n","export interface SkillFile {\n path: string;\n content: string;\n}\n\nexport interface Skill {\n name: string;\n description: string;\n url: string;\n installCount?: number;\n trustScore?: number;\n}\n\nexport interface SkillSearchResult extends Skill {\n project: string;\n}\n\nexport interface ListSkillsResponse {\n project: string;\n skills: Skill[];\n blockedSkillsCount?: number;\n error?: string;\n message?: string;\n}\n\nexport interface SingleSkillResponse extends Skill {\n project: string;\n error?: string;\n message?: string;\n}\n\nexport interface SearchResponse {\n results: SkillSearchResult[];\n error?: string;\n message?: string;\n}\n\nexport interface DownloadResponse {\n skill: Skill & { project: string };\n files: SkillFile[];\n error?: string;\n}\n\n// Library search types\nexport interface LibrarySearchResult {\n id: string;\n title: string;\n description: string;\n branch: string;\n totalSnippets: number;\n totalTokens?: number;\n stars?: number;\n trustScore?: number;\n benchmarkScore?: number;\n versions?: string[];\n vip?: boolean;\n}\n\nexport interface LibrarySearchResponse {\n results: LibrarySearchResult[];\n error?: string;\n message?: string;\n}\n\n// Skill generation types\nexport interface SkillQuestion {\n question: string;\n options: string[];\n recommendedIndex: number;\n}\n\nexport interface SkillQuestionsResponse {\n questions: SkillQuestion[];\n error?: string;\n message?: string;\n}\n\nexport interface SkillAnswer {\n question: string;\n answer: string;\n}\n\nexport interface LibraryInput {\n id: string;\n name: string;\n}\n\nexport interface StructuredGenerateInput {\n motivation: string;\n libraries: LibraryInput[];\n answers: SkillAnswer[];\n feedback?: string;\n previousContent?: string;\n}\n\nexport interface ToolResultSnippet {\n title: string;\n content: string;\n}\n\nexport interface ProgressEvent {\n type: \"progress\";\n message: string;\n}\n\nexport interface ToolResultEvent {\n type: \"tool_result\";\n toolName: string;\n query: string;\n libraryId?: string;\n results: ToolResultSnippet[];\n}\n\nexport interface CompleteEvent {\n type: \"complete\";\n content: string;\n libraryName: string;\n}\n\nexport interface ErrorEvent {\n type: \"error\";\n message: string;\n}\n\nexport type GenerateStreamEvent = ProgressEvent | ToolResultEvent | CompleteEvent | ErrorEvent;\n\nexport type IDE = \"claude\" | \"cursor\" | \"codex\" | \"opencode\" | \"amp\" | \"antigravity\";\n\nexport type Scope = \"project\" | \"global\";\n\nexport interface IDEOptions {\n claude?: boolean;\n cursor?: boolean;\n codex?: boolean;\n opencode?: boolean;\n amp?: boolean;\n antigravity?: boolean;\n}\n\nexport interface ScopeOptions {\n global?: boolean;\n}\n\nexport type AddOptions = IDEOptions & ScopeOptions & { all?: boolean };\nexport type SuggestOptions = IDEOptions & ScopeOptions;\nexport type ListOptions = IDEOptions & ScopeOptions;\nexport type RemoveOptions = IDEOptions & ScopeOptions;\nexport type GenerateOptions = IDEOptions &\n ScopeOptions & {\n output?: string;\n all?: boolean;\n };\n\nexport interface InstallTargets {\n ides: IDE[];\n scopes: Scope[];\n}\n\nexport const IDE_PATHS: Record<IDE, string> = {\n claude: \".claude/skills\",\n cursor: \".cursor/skills\",\n codex: \".codex/skills\",\n opencode: \".opencode/skills\",\n amp: \".agents/skills\",\n antigravity: \".agent/skills\",\n};\n\nexport const IDE_GLOBAL_PATHS: Record<IDE, string> = {\n claude: \".claude/skills\",\n cursor: \".cursor/skills\",\n codex: \".codex/skills\",\n opencode: \".config/opencode/skills\",\n amp: \".config/agents/skills\",\n antigravity: \".agent/skills\",\n};\n\nexport const IDE_NAMES: Record<IDE, string> = {\n claude: \"Claude Code\",\n cursor: \"Cursor\",\n codex: \"Codex\",\n opencode: \"OpenCode\",\n amp: \"Amp\",\n antigravity: \"Antigravity\",\n};\n\nexport interface C7Config {\n defaultIde: IDE;\n defaultScope: \"project\" | \"global\";\n}\n\nexport const DEFAULT_CONFIG: C7Config = {\n defaultIde: \"claude\",\n defaultScope: \"project\",\n};\n\n// Suggest endpoint types\nexport interface SuggestSkill extends SkillSearchResult {\n matchedDep: string;\n}\n\nexport interface SuggestResponse {\n skills: SuggestSkill[];\n error?: string;\n message?: string;\n}\n\nexport interface SkillQuotaResponse {\n used: number;\n limit: number;\n remaining: number;\n tier: \"free\" | \"pro\" | \"unlimited\";\n resetDate: string | null;\n message?: string;\n error?: string;\n}\n","import pc from \"picocolors\";\nimport { checkbox, type Separator } from \"@inquirer/prompts\";\nimport readline from \"readline\";\n\ntype CheckboxConfig<T> = Parameters<typeof checkbox<T>>[0];\ntype CheckboxChoice<T> = Exclude<CheckboxConfig<T>[\"choices\"][number], Separator | string>;\n\n/**\n * Creates a clickable terminal hyperlink using OSC 8 escape sequence.\n */\nexport function terminalLink(text: string, url: string, color?: (s: string) => string): string {\n const colorFn = color ?? ((s: string) => s);\n return `\\x1b]8;;${url}\\x07${colorFn(text)}\\x1b]8;;\\x07 ${pc.white(\"↗\")}`;\n}\n\n/**\n * Formats install count for display.\n */\nexport function formatInstallCount(count: number | undefined, placeholder = \"\"): string {\n if (count === undefined || count === 0) return placeholder;\n\n return pc.yellow(String(count));\n}\n\nexport function formatTrustScore(score: number | undefined): string {\n if (score === undefined || score < 0) return pc.dim(\"-\");\n\n if (score < 3) return pc.red(score.toFixed(1));\n return pc.yellow(score.toFixed(1));\n}\nexport interface CheckboxWithHoverOptions<T> {\n /** Function to extract display name from value. Defaults to (v) => v.name */\n getName?: (value: T) => string;\n}\n\nexport async function checkboxWithHover<T>(\n config: CheckboxConfig<T>,\n options?: CheckboxWithHoverOptions<T>\n): Promise<T[]> {\n const choices = config.choices.filter(\n (c): c is CheckboxChoice<T> =>\n typeof c === \"object\" && c !== null && !(\"type\" in c && c.type === \"separator\")\n );\n const values = choices.map((c) => c.value);\n const totalItems = values.length;\n let cursorPosition = 0;\n\n // Default getName assumes object has 'name' property\n const getName = options?.getName ?? ((v: T) => (v as { name: string }).name);\n\n const keypressHandler = (_str: string | undefined, key: readline.Key) => {\n if (key.name === \"up\" && cursorPosition > 0) {\n cursorPosition--;\n } else if (key.name === \"down\" && cursorPosition < totalItems - 1) {\n cursorPosition++;\n }\n };\n\n readline.emitKeypressEvents(process.stdin);\n process.stdin.on(\"keypress\", keypressHandler);\n\n const customConfig = {\n ...config,\n theme: {\n ...config.theme,\n style: {\n ...config.theme?.style,\n highlight: (text: string) => pc.green(text),\n renderSelectedChoices: (\n selected: CheckboxChoice<T>[],\n _allChoices: CheckboxChoice<T>[]\n ): string => {\n if (selected.length === 0) {\n return pc.dim(getName(values[cursorPosition]));\n }\n return selected.map((c) => getName(c.value)).join(\", \");\n },\n },\n },\n };\n\n try {\n const selected = await checkbox(customConfig);\n if (selected.length === 0) {\n return [values[cursorPosition]];\n }\n return selected;\n } finally {\n process.stdin.removeListener(\"keypress\", keypressHandler);\n }\n}\n","import { mkdir, writeFile, rm, symlink, lstat } from \"fs/promises\";\nimport { join } from \"path\";\n\nimport type { SkillFile } from \"../types.js\";\n\nexport async function installSkillFiles(\n skillName: string,\n files: SkillFile[],\n targetDir: string\n): Promise<void> {\n const skillDir = join(targetDir, skillName);\n\n for (const file of files) {\n const filePath = join(skillDir, file.path);\n const fileDir = join(filePath, \"..\");\n\n await mkdir(fileDir, { recursive: true });\n await writeFile(filePath, file.content);\n }\n}\n\nexport async function symlinkSkill(\n skillName: string,\n sourcePath: string,\n targetDir: string\n): Promise<void> {\n const targetPath = join(targetDir, skillName);\n\n try {\n const stats = await lstat(targetPath);\n if (stats.isSymbolicLink() || stats.isDirectory()) {\n await rm(targetPath, { recursive: true });\n }\n } catch {}\n\n await mkdir(targetDir, { recursive: true });\n await symlink(sourcePath, targetPath);\n}\n","import { getBaseUrl } from \"./api.js\";\n\nexport function trackEvent(event: string, data?: Record<string, unknown>): void {\n if (process.env.CTX7_TELEMETRY_DISABLED) return;\n fetch(`${getBaseUrl()}/api/v2/cli/events`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ event, data }),\n }).catch(() => {});\n}\n","import { Command } from \"commander\";\nimport pc from \"picocolors\";\nimport ora from \"ora\";\nimport { mkdir, writeFile, readFile, unlink } from \"fs/promises\";\nimport { join } from \"path\";\nimport { homedir } from \"os\";\nimport { spawn } from \"child_process\";\nimport { input, select } from \"@inquirer/prompts\";\n\nimport {\n searchLibraries,\n getSkillQuestions,\n generateSkillStructured,\n getSkillQuota,\n} from \"../utils/api.js\";\nimport { loadTokens, isTokenExpired } from \"../utils/auth.js\";\nimport { performLogin } from \"./auth.js\";\nimport { log } from \"../utils/logger.js\";\nimport { promptForInstallTargets, getTargetDirs } from \"../utils/ide.js\";\nimport selectOrInput from \"../utils/selectOrInput.js\";\nimport { checkboxWithHover, terminalLink } from \"../utils/prompts.js\";\nimport { trackEvent } from \"../utils/tracking.js\";\nimport type {\n GenerateOptions,\n LibrarySearchResult,\n SkillAnswer,\n StructuredGenerateInput,\n GenerateStreamEvent,\n ToolResultSnippet,\n} from \"../types.js\";\n\ninterface QueryLogEntry {\n query: string;\n libraryId?: string;\n results: ToolResultSnippet[];\n}\n\nexport function registerGenerateCommand(skillCommand: Command): void {\n skillCommand\n .command(\"generate\")\n .alias(\"gen\")\n .alias(\"g\")\n .option(\"-o, --output <dir>\", \"Output directory (default: current directory)\")\n .option(\"--all\", \"Generate for all detected IDEs\")\n .option(\"--global\", \"Generate in global skills directory\")\n .option(\"--claude\", \"Claude Code (.claude/skills/)\")\n .option(\"--cursor\", \"Cursor (.cursor/skills/)\")\n .option(\"--codex\", \"Codex (.codex/skills/)\")\n .option(\"--opencode\", \"OpenCode (.opencode/skills/)\")\n .option(\"--amp\", \"Amp (.agents/skills/)\")\n .option(\"--antigravity\", \"Antigravity (.agent/skills/)\")\n .description(\"Generate a skill for a library using AI\")\n .action(async (options: GenerateOptions) => {\n await generateCommand(options);\n });\n}\n\nasync function generateCommand(options: GenerateOptions): Promise<void> {\n trackEvent(\"command\", { name: \"generate\" });\n log.blank();\n\n let accessToken: string | null = null;\n const tokens = loadTokens();\n if (tokens && !isTokenExpired(tokens)) {\n accessToken = tokens.access_token;\n } else {\n log.info(\"Authentication required. Logging in...\");\n log.blank();\n accessToken = await performLogin();\n if (!accessToken) {\n log.error(\"Login failed. Please try again.\");\n return;\n }\n log.blank();\n }\n\n const initSpinner = ora().start();\n const quota = await getSkillQuota(accessToken);\n\n if (quota.error) {\n initSpinner.fail(pc.red(\"Failed to initialize\"));\n return;\n }\n\n if (quota.tier !== \"unlimited\" && quota.remaining < 1) {\n initSpinner.fail(pc.red(\"Weekly skill generation limit reached\"));\n log.blank();\n console.log(\n ` You've used ${pc.bold(pc.white(quota.used.toString()))}/${pc.bold(pc.white(quota.limit.toString()))} skill generations this week.`\n );\n console.log(\n ` Your quota resets on ${pc.yellow(new Date(quota.resetDate!).toLocaleDateString())}.`\n );\n log.blank();\n if (quota.tier === \"free\") {\n console.log(\n ` ${pc.yellow(\"Tip:\")} Upgrade to Pro for ${pc.bold(\"10\")} generations per week.`\n );\n console.log(` Visit ${pc.green(\"https://context7.com/dashboard\")} to upgrade.`);\n }\n return;\n }\n\n initSpinner.stop();\n initSpinner.clear();\n\n console.log(pc.bold(\"What should your agent become an expert at?\\n\"));\n console.log(\n pc.dim(\n \"Skills should encode best practices, constraints, and decision-making —\\nnot step-by-step tutorials or one-off tasks.\\n\"\n )\n );\n console.log(pc.yellow(\"Examples:\"));\n // prettier-ignore\n {\n console.log(pc.red(' ✕ \"Deploy a Next.js app to Vercel\"'));\n console.log(pc.green(' ✓ \"Best practices and constraints for deploying Next.js apps to Vercel\"'));\n log.blank();\n console.log(pc.red(' ✕ \"Use Tailwind for responsive design\"'));\n console.log(pc.green(' ✓ \"Responsive layout decision-making with Tailwind CSS\"'));\n log.blank();\n console.log(pc.red(' ✕ \"Build OAuth with NextAuth\"'));\n console.log(pc.green(' ✓ \"OAuth authentication patterns and pitfalls with NextAuth.js\"'));\n }\n log.blank();\n\n let motivation: string;\n try {\n motivation = await input({\n message: \"Describe the expertise:\",\n });\n\n if (!motivation.trim()) {\n log.warn(\"Expertise description is required\");\n return;\n }\n motivation = motivation.trim();\n } catch {\n log.warn(\"Generation cancelled\");\n return;\n }\n\n log.blank();\n console.log(\n pc.dim(\n \"To generate this skill, we will read relevant documentation and examples\\nfrom Context7.\\n\"\n )\n );\n console.log(\n pc.dim(\n \"These sources are used to:\\n• extract best practices and constraints\\n• compare patterns across official docs and examples\\n• avoid outdated or incorrect guidance\\n\"\n )\n );\n console.log(pc.dim(\"You can adjust which sources the skill is based on.\\n\"));\n\n const searchSpinner = ora(\"Finding relevant sources...\").start();\n const searchResult = await searchLibraries(motivation, accessToken);\n\n if (searchResult.error || !searchResult.results?.length) {\n searchSpinner.fail(pc.red(\"No sources found\"));\n log.warn(searchResult.message || \"Try a different description\");\n return;\n }\n\n searchSpinner.succeed(pc.green(`Found ${searchResult.results.length} relevant sources`));\n log.blank();\n\n let selectedLibraries: LibrarySearchResult[];\n try {\n const formatProjectId = (id: string) => {\n return id.startsWith(\"/\") ? id.slice(1) : id;\n };\n\n const isGitHubRepo = (id: string): boolean => {\n const cleanId = id.startsWith(\"/\") ? id.slice(1) : id;\n const parts = cleanId.split(\"/\");\n if (parts.length !== 2) return false;\n const nonGitHubPrefixes = [\"websites\", \"packages\", \"npm\", \"docs\", \"libraries\", \"llmstxt\"];\n return !nonGitHubPrefixes.includes(parts[0].toLowerCase());\n };\n\n const libraries = searchResult.results.slice(0, 5);\n const indexWidth = libraries.length.toString().length;\n const maxNameLen = Math.max(...libraries.map((lib) => lib.title.length));\n\n const libraryChoices = libraries.map((lib, index) => {\n const projectId = formatProjectId(lib.id);\n const isGitHub = isGitHubRepo(lib.id);\n const indexStr = pc.dim(`${(index + 1).toString().padStart(indexWidth)}.`);\n const paddedName = lib.title.padEnd(maxNameLen);\n\n const libUrl = `https://context7.com${lib.id}`;\n const libLink = terminalLink(lib.title, libUrl, pc.white);\n const sourceUrl = isGitHub\n ? `https://github.com/${projectId}`\n : `https://context7.com${lib.id}`;\n const repoLink = terminalLink(projectId, sourceUrl, pc.white);\n\n const starsLine =\n lib.stars && isGitHub ? [`${pc.yellow(\"Stars:\")} ${lib.stars.toLocaleString()}`] : [];\n\n const metadataLines = [\n pc.dim(\"─\".repeat(50)),\n \"\",\n `${pc.yellow(\"Library:\")} ${libLink}`,\n `${pc.yellow(\"Source:\")} ${repoLink}`,\n `${pc.yellow(\"Snippets:\")} ${lib.totalSnippets.toLocaleString()}`,\n ...starsLine,\n `${pc.yellow(\"Description:\")}`,\n pc.white(lib.description || \"No description\"),\n ];\n\n return {\n name: `${indexStr} ${paddedName} ${pc.dim(`(${projectId})`)}`,\n value: lib,\n description: metadataLines.join(\"\\n\"),\n };\n });\n\n selectedLibraries = await checkboxWithHover(\n {\n message: \"Select sources:\",\n choices: libraryChoices,\n pageSize: 10,\n loop: false,\n },\n { getName: (lib) => `${lib.title} (${formatProjectId(lib.id)})` }\n );\n\n if (!selectedLibraries || selectedLibraries.length === 0) {\n log.info(\"No sources selected. Try running the command again.\");\n return;\n }\n } catch {\n log.warn(\"Generation cancelled\");\n return;\n }\n\n log.blank();\n\n const questionsSpinner = ora(\n \"Preparing follow-up questions to clarify scope and constraints...\"\n ).start();\n const librariesInput = selectedLibraries.map((lib) => ({ id: lib.id, name: lib.title }));\n const questionsResult = await getSkillQuestions(librariesInput, motivation, accessToken);\n\n if (questionsResult.error || !questionsResult.questions?.length) {\n questionsSpinner.fail(pc.red(\"Failed to generate questions\"));\n log.warn(questionsResult.message || \"Please try again\");\n return;\n }\n\n questionsSpinner.succeed(pc.green(\"Questions prepared\"));\n log.blank();\n\n const answers: SkillAnswer[] = [];\n try {\n for (let i = 0; i < questionsResult.questions.length; i++) {\n const q = questionsResult.questions[i];\n const questionNum = i + 1;\n const totalQuestions = questionsResult.questions.length;\n\n const answer = await selectOrInput({\n message: `${pc.dim(`[${questionNum}/${totalQuestions}]`)} ${q.question}`,\n options: q.options,\n recommendedIndex: q.recommendedIndex,\n });\n\n answers.push({\n question: q.question,\n answer,\n });\n\n const linesToClear = 3 + q.options.length;\n process.stdout.write(`\\x1b[${linesToClear}A\\x1b[J`);\n\n const truncatedAnswer = answer.length > 50 ? answer.slice(0, 47) + \"...\" : answer;\n console.log(`${pc.green(\"✓\")} ${pc.dim(`[${questionNum}/${totalQuestions}]`)} ${q.question}`);\n console.log(` ${pc.cyan(truncatedAnswer)}`);\n log.blank();\n }\n } catch {\n log.warn(\"Generation cancelled\");\n return;\n }\n\n let generatedContent: string | null = null;\n let skillName: string = \"\";\n let feedback: string | undefined;\n let previewFile: string | null = null;\n let previewFileWritten = false;\n\n const cleanupPreviewFile = async () => {\n if (previewFile) {\n await unlink(previewFile).catch(() => {});\n }\n };\n\n const queryLog: QueryLogEntry[] = [];\n let genSpinner: ReturnType<typeof ora> | null = null;\n\n const formatQueryLogText = (): string => {\n if (queryLog.length === 0) return \"\";\n\n const lines: string[] = [];\n const latestEntry = queryLog[queryLog.length - 1];\n\n lines.push(\"\");\n\n for (const result of latestEntry.results.slice(0, 3)) {\n const cleanContent = result.content.replace(/Source:\\s*https?:\\/\\/[^\\s]+/gi, \"\").trim();\n if (cleanContent) {\n lines.push(` ${pc.yellow(\"•\")} ${pc.white(result.title)}`);\n const maxLen = 400;\n const content =\n cleanContent.length > maxLen ? cleanContent.slice(0, maxLen - 3) + \"...\" : cleanContent;\n const words = content.split(\" \");\n let currentLine = \" \";\n for (const word of words) {\n if (currentLine.length + word.length > 84) {\n lines.push(pc.dim(currentLine));\n currentLine = \" \" + word + \" \";\n } else {\n currentLine += word + \" \";\n }\n }\n if (currentLine.trim()) {\n lines.push(pc.dim(currentLine));\n }\n lines.push(\"\");\n }\n }\n\n return \"\\n\" + lines.join(\"\\n\");\n };\n\n let isGeneratingContent = false;\n let initialStatus = \"Reading selected Context7 sources to generate the skill...\";\n\n const handleStreamEvent = (event: GenerateStreamEvent) => {\n if (event.type === \"progress\") {\n if (genSpinner) {\n if (event.message.startsWith(\"Generating skill content...\") && !isGeneratingContent) {\n isGeneratingContent = true;\n if (queryLog.length > 0) {\n genSpinner.succeed(pc.green(`Read Context7 sources`));\n } else {\n genSpinner.succeed(pc.green(`Ready to generate`));\n }\n genSpinner = ora(\"Generating skill content...\").start();\n } else if (!isGeneratingContent) {\n genSpinner.text = initialStatus + formatQueryLogText();\n }\n }\n } else if (event.type === \"tool_result\") {\n queryLog.push({\n query: event.query,\n libraryId: event.libraryId,\n results: event.results,\n });\n if (genSpinner && !isGeneratingContent) {\n genSpinner.text = genSpinner.text.split(\"\\n\")[0] + formatQueryLogText();\n }\n }\n };\n\n while (true) {\n const generateInput: StructuredGenerateInput = {\n motivation,\n libraries: librariesInput,\n answers,\n feedback,\n previousContent: feedback && generatedContent ? generatedContent : undefined,\n };\n\n queryLog.length = 0;\n isGeneratingContent = false;\n previewFileWritten = false;\n initialStatus = feedback\n ? \"Regenerating skill with your feedback...\"\n : \"Reading selected Context7 sources to generate the skill...\";\n\n genSpinner = ora(initialStatus).start();\n\n const result = await generateSkillStructured(generateInput, handleStreamEvent, accessToken);\n\n if (result.error) {\n genSpinner.fail(pc.red(`Error: ${result.error}`));\n return;\n }\n\n if (!result.content) {\n genSpinner.fail(pc.red(\"No content generated\"));\n return;\n }\n\n genSpinner.succeed(pc.green(`Generated skill for \"${result.libraryName}\"`));\n generatedContent = result.content;\n skillName = result.libraryName.toLowerCase().replace(/[^a-z0-9-]/g, \"-\");\n\n const contentLines = generatedContent.split(\"\\n\");\n const previewLineCount = 20;\n const hasMoreLines = contentLines.length > previewLineCount;\n const previewContent = contentLines.slice(0, previewLineCount).join(\"\\n\");\n const remainingLines = contentLines.length - previewLineCount;\n\n const showPreview = () => {\n log.blank();\n console.log(pc.dim(\"━\".repeat(70)));\n console.log(pc.bold(`Generated Skill: `) + pc.green(pc.bold(skillName)));\n console.log(pc.dim(\"━\".repeat(70)));\n log.blank();\n console.log(previewContent);\n if (hasMoreLines) {\n log.blank();\n console.log(pc.dim(`... ${remainingLines} more lines`));\n }\n log.blank();\n console.log(pc.dim(\"━\".repeat(70)));\n log.blank();\n };\n\n const openInEditor = async () => {\n const previewDir = join(homedir(), \".context7\", \"previews\");\n await mkdir(previewDir, { recursive: true });\n previewFile = join(previewDir, `${skillName}.md`);\n if (!previewFileWritten) {\n await writeFile(previewFile, generatedContent!, \"utf-8\");\n previewFileWritten = true;\n }\n const editor = process.env.EDITOR || \"open\";\n await new Promise<void>((resolve) => {\n const child = spawn(editor, [previewFile!], {\n stdio: \"inherit\",\n shell: true,\n });\n child.on(\"close\", () => resolve());\n });\n };\n\n const syncFromPreviewFile = async () => {\n if (previewFile) {\n generatedContent = await readFile(previewFile, \"utf-8\");\n }\n };\n\n showPreview();\n\n await new Promise((resolve) => setTimeout(resolve, 100));\n\n try {\n let action: string;\n while (true) {\n const choices = [\n { name: `${pc.green(\"✓\")} Install skill (save locally)`, value: \"install\" },\n { name: `${pc.blue(\"⤢\")} Edit skill in editor`, value: \"view\" },\n { name: `${pc.yellow(\"✎\")} Request changes`, value: \"feedback\" },\n { name: `${pc.red(\"✕\")} Cancel`, value: \"cancel\" },\n ];\n\n action = await select({\n message: \"What would you like to do?\",\n choices,\n });\n\n if (action === \"view\") {\n await openInEditor();\n continue;\n }\n await syncFromPreviewFile();\n break;\n }\n\n if (action === \"install\") {\n break;\n } else if (action === \"cancel\") {\n await cleanupPreviewFile();\n log.warn(\"Generation cancelled\");\n return;\n } else if (action === \"feedback\") {\n trackEvent(\"gen_feedback\");\n feedback = await input({\n message: \"What changes would you like? (press Enter to skip)\",\n });\n\n if (!feedback.trim()) {\n feedback = undefined;\n }\n log.blank();\n }\n } catch {\n await cleanupPreviewFile();\n log.warn(\"Generation cancelled\");\n return;\n }\n }\n\n const targets = await promptForInstallTargets(options);\n if (!targets) {\n log.warn(\"Generation cancelled\");\n return;\n }\n\n const targetDirs = getTargetDirs(targets);\n\n const writeSpinner = ora(\"Writing skill files...\").start();\n\n let permissionError = false;\n const failedDirs: Set<string> = new Set();\n\n for (const targetDir of targetDirs) {\n let finalDir = targetDir;\n if (options.output && !targetDir.includes(\"/.config/\") && !targetDir.startsWith(homedir())) {\n finalDir = targetDir.replace(process.cwd(), options.output);\n }\n const skillDir = join(finalDir, skillName);\n const skillPath = join(skillDir, \"SKILL.md\");\n\n try {\n await mkdir(skillDir, { recursive: true });\n await writeFile(skillPath, generatedContent!, \"utf-8\");\n } catch (err) {\n const error = err as NodeJS.ErrnoException;\n if (error.code === \"EACCES\" || error.code === \"EPERM\") {\n permissionError = true;\n failedDirs.add(skillDir);\n } else {\n log.warn(`Failed to write to ${skillPath}: ${error.message}`);\n }\n }\n }\n\n if (permissionError) {\n writeSpinner.fail(pc.red(\"Permission denied\"));\n log.blank();\n console.log(pc.yellow(\"Fix permissions with:\"));\n for (const dir of failedDirs) {\n const parentDir = join(dir, \"..\");\n console.log(pc.dim(` sudo chown -R $(whoami) \"${parentDir}\"`));\n }\n log.blank();\n return;\n }\n\n writeSpinner.succeed(pc.green(`Created skill in ${targetDirs.length} location(s)`));\n trackEvent(\"gen_install\");\n\n log.blank();\n console.log(pc.green(\"Skill saved successfully\"));\n for (const targetDir of targetDirs) {\n console.log(pc.dim(` ${targetDir}/`) + pc.green(skillName));\n }\n log.blank();\n\n await cleanupPreviewFile();\n}\n","import * as crypto from \"crypto\";\nimport * as http from \"http\";\nimport * as fs from \"fs\";\nimport * as path from \"path\";\nimport * as os from \"os\";\n\nconst CONFIG_DIR = path.join(os.homedir(), \".context7\");\nconst CREDENTIALS_FILE = path.join(CONFIG_DIR, \"credentials.json\");\n\nexport interface TokenData {\n access_token: string;\n refresh_token?: string;\n token_type: string;\n expires_in?: number;\n expires_at?: number;\n scope?: string;\n}\n\nexport interface PKCEChallenge {\n codeVerifier: string;\n codeChallenge: string;\n}\n\nexport function generatePKCE(): PKCEChallenge {\n const codeVerifier = crypto.randomBytes(32).toString(\"base64url\");\n const codeChallenge = crypto.createHash(\"sha256\").update(codeVerifier).digest(\"base64url\");\n return { codeVerifier, codeChallenge };\n}\n\nexport function generateState(): string {\n return crypto.randomBytes(16).toString(\"base64url\");\n}\n\nfunction ensureConfigDir(): void {\n if (!fs.existsSync(CONFIG_DIR)) {\n fs.mkdirSync(CONFIG_DIR, { recursive: true, mode: 0o700 });\n }\n}\n\nexport function saveTokens(tokens: TokenData): void {\n ensureConfigDir();\n const data = {\n ...tokens,\n expires_at:\n tokens.expires_at ?? (tokens.expires_in ? Date.now() + tokens.expires_in * 1000 : undefined),\n };\n fs.writeFileSync(CREDENTIALS_FILE, JSON.stringify(data, null, 2), { mode: 0o600 });\n}\n\nexport function loadTokens(): TokenData | null {\n if (!fs.existsSync(CREDENTIALS_FILE)) {\n return null;\n }\n try {\n const data = JSON.parse(fs.readFileSync(CREDENTIALS_FILE, \"utf-8\"));\n return data as TokenData;\n } catch {\n return null;\n }\n}\n\nexport function clearTokens(): boolean {\n if (fs.existsSync(CREDENTIALS_FILE)) {\n fs.unlinkSync(CREDENTIALS_FILE);\n return true;\n }\n return false;\n}\n\nexport function isTokenExpired(tokens: TokenData): boolean {\n if (!tokens.expires_at) {\n return false;\n }\n return Date.now() > tokens.expires_at - 60000;\n}\n\nexport interface CallbackResult {\n code: string;\n state: string;\n}\n\n// Port for OAuth callback server - must match registered redirect URI\nconst CALLBACK_PORT = 52417;\n\nexport function createCallbackServer(expectedState: string): {\n port: Promise<number>;\n result: Promise<CallbackResult>;\n close: () => void;\n} {\n let resolvePort: (port: number) => void;\n let resolveResult: (result: CallbackResult) => void;\n let rejectResult: (error: Error) => void;\n let serverInstance: http.Server | null = null;\n\n const portPromise = new Promise<number>((resolve) => {\n resolvePort = resolve;\n });\n\n const resultPromise = new Promise<CallbackResult>((resolve, reject) => {\n resolveResult = resolve;\n rejectResult = reject;\n });\n\n const server = http.createServer((req, res) => {\n const url = new URL(req.url || \"/\", `http://localhost`);\n\n if (url.pathname === \"/callback\") {\n const code = url.searchParams.get(\"code\");\n const state = url.searchParams.get(\"state\");\n const error = url.searchParams.get(\"error\");\n const errorDescription = url.searchParams.get(\"error_description\");\n\n res.writeHead(200, { \"Content-Type\": \"text/html\" });\n\n if (error) {\n res.end(errorPage(errorDescription || error));\n serverInstance?.close();\n rejectResult(new Error(errorDescription || error));\n return;\n }\n\n if (!code || !state) {\n res.end(errorPage(\"Missing authorization code or state\"));\n serverInstance?.close();\n rejectResult(new Error(\"Missing authorization code or state\"));\n return;\n }\n\n if (state !== expectedState) {\n res.end(errorPage(\"State mismatch - possible CSRF attack\"));\n serverInstance?.close();\n rejectResult(new Error(\"State mismatch\"));\n return;\n }\n\n res.end(successPage());\n serverInstance?.close();\n resolveResult({ code, state });\n } else {\n res.writeHead(404);\n res.end(\"Not found\");\n }\n });\n\n serverInstance = server;\n\n server.on(\"error\", (err) => {\n rejectResult(err as Error);\n });\n\n server.listen(CALLBACK_PORT, \"127.0.0.1\", () => {\n resolvePort(CALLBACK_PORT);\n });\n\n const timeout = setTimeout(\n () => {\n server.close();\n rejectResult(new Error(\"Login timed out after 5 minutes\"));\n },\n 5 * 60 * 1000\n );\n\n return {\n port: portPromise,\n result: resultPromise,\n close: () => {\n clearTimeout(timeout);\n server.close();\n },\n };\n}\n\nfunction successPage(): string {\n return `<!DOCTYPE html>\n<html>\n <head><title>Login Successful</title></head>\n <body style=\"font-family: system-ui; display: flex; justify-content: center; align-items: center; height: 100vh; margin: 0; background: #f9fafb;\">\n <div style=\"text-align: center; padding: 2rem;\">\n <div style=\"width: 64px; height: 64px; background: #16a34a; border-radius: 50%; display: flex; align-items: center; justify-content: center; margin: 0 auto 1rem;\">\n <svg width=\"32\" height=\"32\" fill=\"none\" stroke=\"white\" stroke-width=\"3\" viewBox=\"0 0 24 24\">\n <path d=\"M5 13l4 4L19 7\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </div>\n <h1 style=\"color: #16a34a; margin: 0 0 0.5rem;\">Login Successful!</h1>\n <p style=\"color: #6b7280; margin: 0;\">You can close this window and return to the terminal.</p>\n </div>\n </body>\n</html>`;\n}\n\nfunction escapeHtml(text: string): string {\n return text\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/'/g, \"&#039;\");\n}\n\nfunction errorPage(message: string): string {\n const safeMessage = escapeHtml(message);\n return `<!DOCTYPE html>\n<html>\n <head><title>Login Failed</title></head>\n <body style=\"font-family: system-ui; display: flex; justify-content: center; align-items: center; height: 100vh; margin: 0; background: #f9fafb;\">\n <div style=\"text-align: center; padding: 2rem;\">\n <div style=\"width: 64px; height: 64px; background: #dc2626; border-radius: 50%; display: flex; align-items: center; justify-content: center; margin: 0 auto 1rem;\">\n <svg width=\"32\" height=\"32\" fill=\"none\" stroke=\"white\" stroke-width=\"3\" viewBox=\"0 0 24 24\">\n <path d=\"M6 18L18 6M6 6l12 12\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </div>\n <h1 style=\"color: #dc2626; margin: 0 0 0.5rem;\">Login Failed</h1>\n <p style=\"color: #6b7280; margin: 0;\">${safeMessage}</p>\n <p style=\"color: #9ca3af; margin: 1rem 0 0; font-size: 0.875rem;\">You can close this window.</p>\n </div>\n </body>\n</html>`;\n}\n\ninterface TokenErrorResponse {\n error?: string;\n error_description?: string;\n}\n\nexport async function exchangeCodeForTokens(\n baseUrl: string,\n code: string,\n codeVerifier: string,\n redirectUri: string,\n clientId: string\n): Promise<TokenData> {\n const response = await fetch(`${baseUrl}/api/oauth/token`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/x-www-form-urlencoded\" },\n body: new URLSearchParams({\n grant_type: \"authorization_code\",\n client_id: clientId,\n code,\n code_verifier: codeVerifier,\n redirect_uri: redirectUri,\n }).toString(),\n });\n\n if (!response.ok) {\n const err = (await response.json().catch(() => ({}))) as TokenErrorResponse;\n throw new Error(err.error_description || err.error || \"Failed to exchange code for tokens\");\n }\n\n return (await response.json()) as TokenData;\n}\n\nexport function buildAuthorizationUrl(\n baseUrl: string,\n clientId: string,\n redirectUri: string,\n codeChallenge: string,\n state: string\n): string {\n const url = new URL(`${baseUrl}/api/oauth/authorize`);\n url.searchParams.set(\"client_id\", clientId);\n url.searchParams.set(\"redirect_uri\", redirectUri);\n url.searchParams.set(\"code_challenge\", codeChallenge);\n url.searchParams.set(\"code_challenge_method\", \"S256\");\n url.searchParams.set(\"state\", state);\n url.searchParams.set(\"scope\", \"profile email\");\n url.searchParams.set(\"response_type\", \"code\");\n return url.toString();\n}\n","import { Command } from \"commander\";\nimport pc from \"picocolors\";\nimport ora from \"ora\";\nimport open from \"open\";\nimport {\n generatePKCE,\n generateState,\n createCallbackServer,\n exchangeCodeForTokens,\n saveTokens,\n loadTokens,\n clearTokens,\n buildAuthorizationUrl,\n isTokenExpired,\n} from \"../utils/auth.js\";\n\nimport { trackEvent } from \"../utils/tracking.js\";\n\nconst CLI_CLIENT_ID = \"2veBSofhicRBguUT\";\n\nlet baseUrl = \"https://context7.com\";\n\nexport function setAuthBaseUrl(url: string): void {\n baseUrl = url;\n}\n\nexport function registerAuthCommands(program: Command): void {\n program\n .command(\"login\")\n .description(\"Log in to Context7\")\n .option(\"--no-browser\", \"Don't open browser automatically\")\n .action(async (options) => {\n await loginCommand(options);\n });\n\n program\n .command(\"logout\")\n .description(\"Log out of Context7\")\n .action(() => {\n logoutCommand();\n });\n\n program\n .command(\"whoami\")\n .description(\"Show current login status\")\n .action(async () => {\n await whoamiCommand();\n });\n}\n\nexport async function performLogin(openBrowser = true): Promise<string | null> {\n const spinner = ora(\"Preparing login...\").start();\n\n try {\n const { codeVerifier, codeChallenge } = generatePKCE();\n const state = generateState();\n const callbackServer = createCallbackServer(state);\n const port = await callbackServer.port;\n const redirectUri = `http://localhost:${port}/callback`;\n const authUrl = buildAuthorizationUrl(\n baseUrl,\n CLI_CLIENT_ID,\n redirectUri,\n codeChallenge,\n state\n );\n\n spinner.stop();\n\n console.log(\"\");\n console.log(pc.bold(\"Opening browser to log in...\"));\n console.log(\"\");\n\n if (openBrowser) {\n await open(authUrl);\n console.log(pc.dim(\"If the browser didn't open, visit this URL:\"));\n } else {\n console.log(pc.dim(\"Open this URL in your browser:\"));\n }\n console.log(pc.cyan(authUrl));\n console.log(\"\");\n\n const waitingSpinner = ora(\"Waiting for login...\").start();\n\n try {\n const { code } = await callbackServer.result;\n waitingSpinner.text = \"Exchanging code for tokens...\";\n\n const tokens = await exchangeCodeForTokens(\n baseUrl,\n code,\n codeVerifier,\n redirectUri,\n CLI_CLIENT_ID\n );\n saveTokens(tokens);\n callbackServer.close();\n\n waitingSpinner.succeed(pc.green(\"Login successful!\"));\n return tokens.access_token;\n } catch (error) {\n callbackServer.close();\n waitingSpinner.fail(pc.red(\"Login failed\"));\n if (error instanceof Error) {\n console.error(pc.red(error.message));\n }\n return null;\n }\n } catch (error) {\n spinner.fail(pc.red(\"Login failed\"));\n if (error instanceof Error) {\n console.error(pc.red(error.message));\n }\n return null;\n }\n}\n\nasync function loginCommand(options: { browser: boolean }): Promise<void> {\n trackEvent(\"command\", { name: \"login\" });\n const existingTokens = loadTokens();\n if (existingTokens) {\n const expired = isTokenExpired(existingTokens);\n if (!expired || existingTokens.refresh_token) {\n console.log(pc.yellow(\"You are already logged in.\"));\n console.log(\n pc.dim(\"Run 'ctx7 logout' first if you want to log in with a different account.\")\n );\n return;\n }\n clearTokens();\n }\n\n const token = await performLogin(options.browser);\n if (!token) {\n process.exit(1);\n }\n console.log(\"\");\n console.log(pc.dim(\"You can now use authenticated Context7 features.\"));\n}\n\nfunction logoutCommand(): void {\n trackEvent(\"command\", { name: \"logout\" });\n if (clearTokens()) {\n console.log(pc.green(\"Logged out successfully.\"));\n } else {\n console.log(pc.yellow(\"You are not logged in.\"));\n }\n}\n\nasync function whoamiCommand(): Promise<void> {\n trackEvent(\"command\", { name: \"whoami\" });\n const tokens = loadTokens();\n\n if (!tokens) {\n console.log(pc.yellow(\"Not logged in.\"));\n console.log(pc.dim(\"Run 'ctx7 login' to authenticate.\"));\n return;\n }\n\n console.log(pc.green(\"Logged in\"));\n\n try {\n const userInfo = await fetchUserInfo(tokens.access_token);\n if (userInfo.name) {\n console.log(`${pc.dim(\"Name:\".padEnd(9))}${userInfo.name}`);\n }\n if (userInfo.email) {\n console.log(`${pc.dim(\"Email:\".padEnd(9))}${userInfo.email}`);\n }\n } catch {\n if (isTokenExpired(tokens) && !tokens.refresh_token) {\n console.log(pc.dim(\"(Session may be expired - run 'ctx7 login' to refresh)\"));\n }\n }\n}\n\ninterface UserInfo {\n sub?: string;\n name?: string;\n email?: string;\n picture?: string;\n}\n\nasync function fetchUserInfo(accessToken: string): Promise<UserInfo> {\n const response = await fetch(\"https://clerk.context7.com/oauth/userinfo\", {\n headers: {\n Authorization: `Bearer ${accessToken}`,\n },\n });\n\n if (!response.ok) {\n throw new Error(\"Failed to fetch user info\");\n }\n\n return (await response.json()) as UserInfo;\n}\n","import {\n createPrompt,\n useState,\n useKeypress,\n usePrefix,\n isEnterKey,\n isUpKey,\n isDownKey,\n} from \"@inquirer/core\";\nimport type { KeypressEvent } from \"@inquirer/core\";\nimport pc from \"picocolors\";\n\nexport interface SelectOrInputConfig {\n message: string;\n options: string[];\n recommendedIndex?: number;\n}\n\nfunction reorderOptions(options: string[], recommendedIndex: number): string[] {\n if (recommendedIndex === 0) return options;\n const reordered = [options[recommendedIndex]];\n for (let i = 0; i < options.length; i++) {\n if (i !== recommendedIndex) reordered.push(options[i]);\n }\n return reordered;\n}\n\nconst selectOrInput: (config: SelectOrInputConfig) => Promise<string> = createPrompt<\n string,\n SelectOrInputConfig\n>((config, done): string => {\n const { message, options: rawOptions, recommendedIndex = 0 } = config;\n const options = reorderOptions(rawOptions, recommendedIndex);\n const [cursor, setCursor] = useState(0);\n const [inputValue, setInputValue] = useState(\"\");\n\n const prefix = usePrefix({});\n\n useKeypress((key: KeypressEvent, rl) => {\n if (isUpKey(key)) {\n setCursor(Math.max(0, cursor - 1));\n return;\n }\n\n if (isDownKey(key)) {\n setCursor(Math.min(options.length, cursor + 1));\n return;\n }\n\n if (isEnterKey(key)) {\n if (cursor === options.length) {\n const finalValue = inputValue.trim();\n done(finalValue || options[0]);\n } else {\n done(options[cursor]);\n }\n return;\n }\n\n // Text input handling (only when on custom input line)\n if (cursor === options.length && key.name !== \"return\") {\n if ((key.name === \"w\" && key.ctrl) || key.name === \"backspace\") {\n if (key.name === \"w\" && key.ctrl) {\n const words = inputValue.trimEnd().split(/\\s+/);\n if (words.length > 0) {\n words.pop();\n setInputValue(\n words.join(\" \") + (inputValue.endsWith(\" \") && words.length > 0 ? \" \" : \"\")\n );\n }\n } else {\n setInputValue(inputValue.slice(0, -1));\n }\n } else if (key.name === \"u\" && key.ctrl) {\n setInputValue(\"\");\n } else if (key.name === \"space\") {\n setInputValue(inputValue + \" \");\n } else if (key.name && key.name.length === 1 && !key.ctrl) {\n setInputValue(inputValue + key.name);\n }\n } else if (rl.line) {\n rl.line = \"\";\n }\n });\n\n let output = `${prefix} ${pc.bold(message)}\\n\\n`;\n\n options.forEach((opt: string, idx: number) => {\n const isRecommended = idx === 0;\n const isCursor = idx === cursor;\n const number = pc.cyan(`${idx + 1}.`);\n const text = isRecommended ? `${opt} ${pc.green(\"✓ Recommended\")}` : opt;\n\n if (isCursor) {\n output += pc.cyan(`❯ ${number} ${text}\\n`);\n } else {\n output += ` ${number} ${text}\\n`;\n }\n });\n\n const isCustomCursor = cursor === options.length;\n if (isCustomCursor) {\n output += pc.cyan(`❯ ${pc.yellow(\"✎\")} ${inputValue || pc.dim(\"Type your own...\")}`);\n } else {\n output += ` ${pc.yellow(\"✎\")} ${pc.dim(\"Type your own...\")}`;\n }\n\n return output;\n});\n\nexport default selectOrInput;\n","import { readFile } from \"fs/promises\";\nimport { join } from \"path\";\n\nasync function readFileOrNull(path: string): Promise<string | null> {\n try {\n return await readFile(path, \"utf-8\");\n } catch {\n return null;\n }\n}\n\n/** Basic client-side filter. The real SKIP_SET lives on the backend. */\nfunction isSkippedLocally(name: string): boolean {\n return name.startsWith(\"@types/\");\n}\n\nasync function parsePackageJson(cwd: string): Promise<string[]> {\n const content = await readFileOrNull(join(cwd, \"package.json\"));\n if (!content) return [];\n\n try {\n const pkg = JSON.parse(content);\n const names = new Set<string>();\n\n for (const key of Object.keys(pkg.dependencies || {})) {\n if (!isSkippedLocally(key)) names.add(key);\n }\n for (const key of Object.keys(pkg.devDependencies || {})) {\n if (!isSkippedLocally(key)) names.add(key);\n }\n\n return [...names];\n } catch {\n return [];\n }\n}\n\nasync function parseRequirementsTxt(cwd: string): Promise<string[]> {\n const content = await readFileOrNull(join(cwd, \"requirements.txt\"));\n if (!content) return [];\n\n const deps: string[] = [];\n for (const line of content.split(\"\\n\")) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith(\"#\") || trimmed.startsWith(\"-\")) continue;\n const name = trimmed.split(/[=<>!~;@\\s\\[]/)[0].trim();\n if (name && !isSkippedLocally(name)) {\n deps.push(name);\n }\n }\n return deps;\n}\n\nasync function parsePyprojectToml(cwd: string): Promise<string[]> {\n const content = await readFileOrNull(join(cwd, \"pyproject.toml\"));\n if (!content) return [];\n\n const deps: string[] = [];\n const seen = new Set<string>();\n\n const projectDepsMatch = content.match(/\\[project\\]\\s[\\s\\S]*?dependencies\\s*=\\s*\\[([\\s\\S]*?)\\]/);\n if (projectDepsMatch) {\n const entries = projectDepsMatch[1].match(/\"([^\"]+)\"/g) || [];\n for (const entry of entries) {\n const name = entry\n .replace(/\"/g, \"\")\n .split(/[=<>!~;@\\s\\[]/)[0]\n .trim();\n if (name && !isSkippedLocally(name) && !seen.has(name)) {\n seen.add(name);\n deps.push(name);\n }\n }\n }\n\n const poetryMatch = content.match(/\\[tool\\.poetry\\.dependencies\\]([\\s\\S]*?)(?:\\n\\[|$)/);\n if (poetryMatch) {\n const lines = poetryMatch[1].split(\"\\n\");\n for (const line of lines) {\n const match = line.match(/^(\\S+)\\s*=/);\n if (match) {\n const name = match[1].trim();\n if (name && !isSkippedLocally(name) && name !== \"python\" && !seen.has(name)) {\n seen.add(name);\n deps.push(name);\n }\n }\n }\n }\n\n return deps;\n}\n\nexport async function detectProjectDependencies(cwd: string): Promise<string[]> {\n const results = await Promise.all([\n parsePackageJson(cwd),\n parseRequirementsTxt(cwd),\n parsePyprojectToml(cwd),\n ]);\n\n return [...new Set(results.flat())];\n}\n","import { readFileSync } from \"fs\";\nimport { fileURLToPath } from \"url\";\nimport { dirname, join } from \"path\";\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\nconst pkg = JSON.parse(readFileSync(join(__dirname, \"../package.json\"), \"utf-8\"));\n\nexport const VERSION: string = pkg.version;\nexport const NAME: string = pkg.name;\n"],"mappings":"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","names":["pc","pc","ora","rm","join","input","path","branch","pathParts","path","input","pc","scope","pathMap","baseDir","pc","pc","checkbox","join","pc","ora","mkdir","writeFile","join","homedir","select","baseUrl","pc","baseUrl","program","pc","pc","ora","pc","join","homedir","mkdir","writeFile","select","homedir","readFile","join","path","pkg","program","input","ora","pc","join","homedir","path","rm","readFileSync","dirname","join","pc"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ctx7",
3
- "version": "0.2.2",
3
+ "version": "0.2.3",
4
4
  "description": "Context7 CLI - Manage AI coding skills and documentation context",
5
5
  "type": "module",
6
6
  "bin": {