ctx7 0.2.0 → 0.2.1
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 +36 -27
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -117,6 +117,9 @@ async function downloadSkillFromGitHub(skill) {
|
|
|
117
117
|
|
|
118
118
|
// src/utils/api.ts
|
|
119
119
|
var baseUrl = "https://context7.com";
|
|
120
|
+
function getBaseUrl() {
|
|
121
|
+
return baseUrl;
|
|
122
|
+
}
|
|
120
123
|
function setBaseUrl(url) {
|
|
121
124
|
baseUrl = url;
|
|
122
125
|
}
|
|
@@ -135,15 +138,6 @@ async function searchSkills(query) {
|
|
|
135
138
|
const response = await fetch(`${baseUrl}/api/v2/skills?${params}`);
|
|
136
139
|
return await response.json();
|
|
137
140
|
}
|
|
138
|
-
function trackInstalls(skills, ides) {
|
|
139
|
-
if (process.env.CTX7_TELEMETRY_DISABLED || !skills.length) return;
|
|
140
|
-
fetch(`${baseUrl}/api/v2/skills/track`, {
|
|
141
|
-
method: "POST",
|
|
142
|
-
headers: { "Content-Type": "application/json" },
|
|
143
|
-
body: JSON.stringify({ skills, ides })
|
|
144
|
-
}).catch(() => {
|
|
145
|
-
});
|
|
146
|
-
}
|
|
147
141
|
async function downloadSkill(project, skillName) {
|
|
148
142
|
const skillData = await getSkill(project, skillName);
|
|
149
143
|
if (skillData.error) {
|
|
@@ -531,19 +525,7 @@ function terminalLink(text, url, color) {
|
|
|
531
525
|
}
|
|
532
526
|
function formatInstallCount(count) {
|
|
533
527
|
if (count === void 0 || count === 0) return "";
|
|
534
|
-
|
|
535
|
-
if (count >= 1e3) {
|
|
536
|
-
display = `${Math.floor(count / 1e3)}k+`;
|
|
537
|
-
} else if (count >= 100) {
|
|
538
|
-
const hundreds = Math.floor(count / 100) * 100;
|
|
539
|
-
display = `${hundreds}+`;
|
|
540
|
-
} else if (count >= 10) {
|
|
541
|
-
const tens = Math.floor(count / 10) * 10;
|
|
542
|
-
display = `${tens}+`;
|
|
543
|
-
} else {
|
|
544
|
-
display = String(count);
|
|
545
|
-
}
|
|
546
|
-
return `\x1B[38;5;214m\u2193${display}\x1B[0m`;
|
|
528
|
+
return pc3.yellow(String(count));
|
|
547
529
|
}
|
|
548
530
|
async function checkboxWithHover(config, options) {
|
|
549
531
|
const choices = config.choices.filter(
|
|
@@ -614,6 +596,17 @@ async function symlinkSkill(skillName, sourcePath, targetDir) {
|
|
|
614
596
|
await symlink(sourcePath, targetPath);
|
|
615
597
|
}
|
|
616
598
|
|
|
599
|
+
// src/utils/tracking.ts
|
|
600
|
+
function trackEvent(event, data) {
|
|
601
|
+
if (process.env.CTX7_TELEMETRY_DISABLED) return;
|
|
602
|
+
fetch(`${getBaseUrl()}/api/v2/cli/events`, {
|
|
603
|
+
method: "POST",
|
|
604
|
+
headers: { "Content-Type": "application/json" },
|
|
605
|
+
body: JSON.stringify({ event, data })
|
|
606
|
+
}).catch(() => {
|
|
607
|
+
});
|
|
608
|
+
}
|
|
609
|
+
|
|
617
610
|
// src/commands/generate.ts
|
|
618
611
|
import pc5 from "picocolors";
|
|
619
612
|
import ora from "ora";
|
|
@@ -905,6 +898,7 @@ function registerGenerateCommand(skillCommand) {
|
|
|
905
898
|
});
|
|
906
899
|
}
|
|
907
900
|
async function generateCommand(options) {
|
|
901
|
+
trackEvent("command", { name: "generate" });
|
|
908
902
|
log.blank();
|
|
909
903
|
const tokens = loadTokens();
|
|
910
904
|
if (!tokens) {
|
|
@@ -1214,6 +1208,7 @@ async function generateCommand(options) {
|
|
|
1214
1208
|
log.warn("Generation cancelled");
|
|
1215
1209
|
return;
|
|
1216
1210
|
} else if (action === "feedback") {
|
|
1211
|
+
trackEvent("gen_feedback");
|
|
1217
1212
|
feedback = await input({
|
|
1218
1213
|
message: "What changes would you like? (press Enter to skip)"
|
|
1219
1214
|
});
|
|
@@ -1268,6 +1263,7 @@ async function generateCommand(options) {
|
|
|
1268
1263
|
return;
|
|
1269
1264
|
}
|
|
1270
1265
|
writeSpinner.succeed(pc5.green(`Created skill in ${targetDirs.length} location(s)`));
|
|
1266
|
+
trackEvent("gen_install");
|
|
1271
1267
|
log.blank();
|
|
1272
1268
|
console.log(pc5.green(pc5.bold("Skill saved successfully")));
|
|
1273
1269
|
for (const targetDir of targetDirs) {
|
|
@@ -1320,6 +1316,7 @@ function registerSkillAliases(program2) {
|
|
|
1320
1316
|
});
|
|
1321
1317
|
}
|
|
1322
1318
|
async function installCommand(input2, skillName, options) {
|
|
1319
|
+
trackEvent("command", { name: "install" });
|
|
1323
1320
|
const parsed = parseSkillInput(input2);
|
|
1324
1321
|
if (!parsed) {
|
|
1325
1322
|
log.error(`Invalid input format: ${input2}`);
|
|
@@ -1363,7 +1360,7 @@ async function installCommand(input2, skillName, options) {
|
|
|
1363
1360
|
spinner.warn(pc6.yellow(`No skills found in ${repo}`));
|
|
1364
1361
|
return;
|
|
1365
1362
|
}
|
|
1366
|
-
const skillsWithRepo = data.skills.map((s) => ({ ...s, project: repo }));
|
|
1363
|
+
const skillsWithRepo = data.skills.map((s) => ({ ...s, project: repo })).sort((a, b) => (b.installCount ?? 0) - (a.installCount ?? 0));
|
|
1367
1364
|
spinner.succeed(`Found ${data.skills.length} skill(s)`);
|
|
1368
1365
|
if (data.blockedSkillsCount && data.blockedSkillsCount > 0) {
|
|
1369
1366
|
log.blank();
|
|
@@ -1399,9 +1396,11 @@ async function installCommand(input2, skillName, options) {
|
|
|
1399
1396
|
};
|
|
1400
1397
|
});
|
|
1401
1398
|
log.blank();
|
|
1399
|
+
const installsOffset = 4 + indexWidth + 1 + 1 + maxNameLen + 1 - 3;
|
|
1400
|
+
const message = "Select skills:" + " ".repeat(Math.max(1, installsOffset - 14)) + pc6.dim("installs");
|
|
1402
1401
|
try {
|
|
1403
1402
|
selectedSkills = await checkboxWithHover({
|
|
1404
|
-
message
|
|
1403
|
+
message,
|
|
1405
1404
|
choices,
|
|
1406
1405
|
pageSize: 15,
|
|
1407
1406
|
loop: false
|
|
@@ -1481,11 +1480,12 @@ async function installCommand(input2, skillName, options) {
|
|
|
1481
1480
|
return;
|
|
1482
1481
|
}
|
|
1483
1482
|
installSpinner.succeed(`Installed ${installedSkills.length} skill(s)`);
|
|
1484
|
-
|
|
1483
|
+
trackEvent("install", { skills: installedSkills, ides: targets.ides });
|
|
1485
1484
|
const installedNames = selectedSkills.map((s) => s.name);
|
|
1486
1485
|
logInstallSummary(targets, targetDirs, installedNames);
|
|
1487
1486
|
}
|
|
1488
1487
|
async function searchCommand(query) {
|
|
1488
|
+
trackEvent("command", { name: "search" });
|
|
1489
1489
|
log.blank();
|
|
1490
1490
|
const spinner = ora2(`Searching for "${query}"...`).start();
|
|
1491
1491
|
let data;
|
|
@@ -1504,6 +1504,7 @@ async function searchCommand(query) {
|
|
|
1504
1504
|
return;
|
|
1505
1505
|
}
|
|
1506
1506
|
spinner.succeed(`Found ${data.results.length} skill(s)`);
|
|
1507
|
+
trackEvent("search_query", { query, resultCount: data.results.length });
|
|
1507
1508
|
const indexWidth = data.results.length.toString().length;
|
|
1508
1509
|
const maxNameLen = Math.max(...data.results.map((s) => s.name.length));
|
|
1509
1510
|
const choices = data.results.map((s, index) => {
|
|
@@ -1531,10 +1532,12 @@ async function searchCommand(query) {
|
|
|
1531
1532
|
};
|
|
1532
1533
|
});
|
|
1533
1534
|
log.blank();
|
|
1535
|
+
const installsOffset = 4 + indexWidth + 1 + 1 + maxNameLen + 1 - 3;
|
|
1536
|
+
const message = "Select skills to install:" + " ".repeat(Math.max(1, installsOffset - 25)) + pc6.dim("installs");
|
|
1534
1537
|
let selectedSkills;
|
|
1535
1538
|
try {
|
|
1536
1539
|
selectedSkills = await checkboxWithHover({
|
|
1537
|
-
message
|
|
1540
|
+
message,
|
|
1538
1541
|
choices,
|
|
1539
1542
|
pageSize: 15,
|
|
1540
1543
|
loop: false
|
|
@@ -1613,11 +1616,12 @@ async function searchCommand(query) {
|
|
|
1613
1616
|
return;
|
|
1614
1617
|
}
|
|
1615
1618
|
installSpinner.succeed(`Installed ${installedSkills.length} skill(s)`);
|
|
1616
|
-
|
|
1619
|
+
trackEvent("install", { skills: installedSkills, ides: targets.ides });
|
|
1617
1620
|
const installedNames = uniqueSkills.map((s) => s.name);
|
|
1618
1621
|
logInstallSummary(targets, targetDirs, installedNames);
|
|
1619
1622
|
}
|
|
1620
1623
|
async function listCommand(options) {
|
|
1624
|
+
trackEvent("command", { name: "list" });
|
|
1621
1625
|
const scope = options.global ? "global" : "project";
|
|
1622
1626
|
const pathMap = scope === "global" ? IDE_GLOBAL_PATHS : IDE_PATHS;
|
|
1623
1627
|
const baseDir = scope === "global" ? homedir4() : process.cwd();
|
|
@@ -1650,6 +1654,7 @@ async function listCommand(options) {
|
|
|
1650
1654
|
}
|
|
1651
1655
|
}
|
|
1652
1656
|
async function removeCommand(name, options) {
|
|
1657
|
+
trackEvent("command", { name: "remove" });
|
|
1653
1658
|
const target = await promptForSingleTarget(options);
|
|
1654
1659
|
if (!target) {
|
|
1655
1660
|
log.warn("Cancelled");
|
|
@@ -1672,6 +1677,7 @@ async function removeCommand(name, options) {
|
|
|
1672
1677
|
}
|
|
1673
1678
|
}
|
|
1674
1679
|
async function infoCommand(input2) {
|
|
1680
|
+
trackEvent("command", { name: "info" });
|
|
1675
1681
|
const parsed = parseSkillInput(input2);
|
|
1676
1682
|
if (!parsed) {
|
|
1677
1683
|
log.blank();
|
|
@@ -1729,6 +1735,7 @@ function registerAuthCommands(program2) {
|
|
|
1729
1735
|
});
|
|
1730
1736
|
}
|
|
1731
1737
|
async function loginCommand(options) {
|
|
1738
|
+
trackEvent("command", { name: "login" });
|
|
1732
1739
|
const existingTokens = loadTokens();
|
|
1733
1740
|
if (existingTokens) {
|
|
1734
1741
|
const expired = isTokenExpired(existingTokens);
|
|
@@ -1800,6 +1807,7 @@ async function loginCommand(options) {
|
|
|
1800
1807
|
}
|
|
1801
1808
|
}
|
|
1802
1809
|
function logoutCommand() {
|
|
1810
|
+
trackEvent("command", { name: "logout" });
|
|
1803
1811
|
if (clearTokens()) {
|
|
1804
1812
|
console.log(pc7.green("Logged out successfully."));
|
|
1805
1813
|
} else {
|
|
@@ -1807,6 +1815,7 @@ function logoutCommand() {
|
|
|
1807
1815
|
}
|
|
1808
1816
|
}
|
|
1809
1817
|
async function whoamiCommand() {
|
|
1818
|
+
trackEvent("command", { name: "whoami" });
|
|
1810
1819
|
const tokens = loadTokens();
|
|
1811
1820
|
if (!tokens) {
|
|
1812
1821
|
console.log(pc7.yellow("Not logged in."));
|
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/commands/generate.ts","../src/utils/auth.ts","../src/utils/selectOrInput.ts","../src/commands/auth.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 downloadSkill,\n getSkill,\n trackInstalls,\n} from \"../utils/api.js\";\nimport { log } from \"../utils/logger.js\";\nimport {\n promptForInstallTargets,\n promptForSingleTarget,\n getTargetDirs,\n getTargetDirFromSelection,\n getSelectedIdes,\n hasExplicitIdeOption,\n} from \"../utils/ide.js\";\nimport { checkboxWithHover, terminalLink, formatInstallCount } from \"../utils/prompts.js\";\nimport { installSkillFiles, symlinkSkill } from \"../utils/installer.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 const parsed = parseSkillInput(input);\n if (!parsed) {\n log.error(`Invalid input format: ${input}`);\n log.info(`Expected: /owner/repo or full GitHub URL`);\n log.info(`Example: ctx7 skills install /anthropics/skills pdf`);\n log.blank();\n return;\n }\n const repo = `/${parsed.owner}/${parsed.repo}`;\n\n log.blank();\n const spinner = ora(`Fetching skills from ${repo}...`).start();\n\n let selectedSkills: (Skill & { project: string })[];\n\n // When a specific skill name is provided, fetch only that skill\n if (skillName) {\n spinner.text = `Fetching skill: ${skillName}...`;\n const skillData = await getSkill(repo, skillName);\n\n if (skillData.error || !skillData.name) {\n if (skillData.error === \"prompt_injection_detected\") {\n spinner.fail(pc.red(`Prompt injection detected in skill: ${skillName}`));\n log.warn(\"This skill contains potentially malicious content and cannot be installed.\");\n } else {\n spinner.fail(pc.red(`Skill not found: ${skillName}`));\n }\n return;\n }\n\n spinner.succeed(`Found skill: ${skillName}`);\n selectedSkills = [\n {\n name: skillData.name,\n description: skillData.description,\n url: skillData.url,\n project: repo,\n },\n ];\n } else {\n // Fetch all skills when no specific names provided\n const data = await listProjectSkills(repo);\n\n if (data.error) {\n spinner.fail(pc.red(`Error: ${data.message || data.error}`));\n return;\n }\n\n if (!data.skills || data.skills.length === 0) {\n spinner.warn(pc.yellow(`No skills found in ${repo}`));\n return;\n }\n\n const skillsWithRepo = data.skills.map((s) => ({ ...s, project: repo }));\n\n spinner.succeed(`Found ${data.skills.length} skill(s)`);\n\n if (data.blockedSkillsCount && data.blockedSkillsCount > 0) {\n log.blank();\n log.error(\n `${data.blockedSkillsCount} skill(s) blocked due to prompt injection and not shown.`\n );\n log.warn(\"Review other skills from this repository carefully before installing.\");\n }\n\n if (options.all || data.skills.length === 1) {\n selectedSkills = skillsWithRepo;\n } else {\n const 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 try {\n selectedSkills = await checkboxWithHover({\n message: \"Select skills:\",\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 trackInstalls(installedSkills, targets.ides);\n\n const installedNames = selectedSkills.map((s) => s.name);\n logInstallSummary(targets, targetDirs, installedNames);\n}\n\nasync function searchCommand(query: string): Promise<void> {\n log.blank();\n const spinner = ora(`Searching for \"${query}\"...`).start();\n\n let data;\n try {\n data = await searchSkills(query);\n } catch (err) {\n spinner.fail(pc.red(`Error: ${err instanceof Error ? err.message : String(err)}`));\n return;\n }\n\n if (data.error) {\n spinner.fail(pc.red(`Error: ${data.message || data.error}`));\n return;\n }\n\n if (!data.results || data.results.length === 0) {\n spinner.warn(pc.yellow(`No skills found matching \"${query}\"`));\n return;\n }\n\n spinner.succeed(`Found ${data.results.length} skill(s)`);\n\n const indexWidth = data.results.length.toString().length;\n const maxNameLen = Math.max(...data.results.map((s) => s.name.length));\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 installs = formatInstallCount(s.installCount);\n\n // Build metadata panel shown when item is hovered\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: installs ? `${indexStr} ${paddedName} ${installs}` : `${indexStr} ${paddedName}`,\n value: s,\n description: metadataLines.join(\"\\n\"),\n };\n });\n\n log.blank();\n\n let selectedSkills: SkillSearchResult[];\n try {\n selectedSkills = await checkboxWithHover({\n message: \"Select skills to install:\",\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 trackInstalls(installedSkills, targets.ides);\n\n const installedNames = uniqueSkills.map((s) => s.name);\n logInstallSummary(targets, targetDirs, installedNames);\n}\n\nasync function listCommand(options: ListOptions): Promise<void> {\n const 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 const target = await promptForSingleTarget(options);\n if (!target) {\n log.warn(\"Cancelled\");\n return;\n }\n\n const skillsDir = getTargetDirFromSelection(target.ide, target.scope);\n const skillPath = join(skillsDir, name);\n\n try {\n await rm(skillPath, { recursive: true });\n log.success(`Removed skill: ${name}`);\n } catch (err) {\n const error = err as NodeJS.ErrnoException;\n if (error.code === \"ENOENT\") {\n log.error(`Skill not found: ${name}`);\n } else if (error.code === \"EACCES\" || error.code === \"EPERM\") {\n log.error(`Permission denied. Try: sudo rm -rf \"${skillPath}\"`);\n } else {\n log.error(`Failed to remove skill: ${error.message}`);\n }\n }\n}\n\nasync function infoCommand(input: string): Promise<void> {\n const parsed = parseSkillInput(input);\n if (!parsed) {\n log.blank();\n log.error(`Invalid input format: ${input}`);\n log.info(`Expected: /owner/repo or full GitHub URL`);\n log.blank();\n return;\n }\n const repo = `/${parsed.owner}/${parsed.repo}`;\n\n log.blank();\n const spinner = ora(`Fetching skills from ${repo}...`).start();\n\n const data = await listProjectSkills(repo);\n\n if (data.error) {\n spinner.fail(pc.red(`Error: ${data.message || data.error}`));\n return;\n }\n\n if (!data.skills || data.skills.length === 0) {\n spinner.warn(pc.yellow(`No skills found in ${repo}`));\n return;\n }\n\n spinner.succeed(`Found ${data.skills.length} skill(s)`);\n\n log.blank();\n for (const skill of data.skills) {\n log.item(skill.name);\n log.dim(` ${skill.description || \"No description\"}`);\n log.dim(` URL: ${skill.url}`);\n log.blank();\n }\n\n log.plain(\n `${pc.bold(\"Quick commands:\")}\\n` +\n ` Install all: ${pc.cyan(`ctx7 skills install ${repo} --all`)}\\n` +\n ` Install one: ${pc.cyan(`ctx7 skills install ${repo} ${data.skills[0]?.name}`)}\\n`\n );\n}\n","export interface ParsedSkillInput {\n type: \"repo\" | \"url\";\n owner: string;\n repo: string;\n branch?: string;\n path?: string;\n}\n\nexport function parseSkillInput(input: string): ParsedSkillInput | null {\n const urlMatch = input.match(\n /(?:https?:\\/\\/)?github\\.com\\/([^\\/]+)\\/([^\\/]+)\\/tree\\/([^\\/]+)\\/(.+)/\n );\n if (urlMatch) {\n const [, owner, repo, branch, path] = urlMatch;\n return { type: \"url\", owner, repo, branch, path };\n }\n\n const shortMatch = input.match(/^\\/?([^\\/]+)\\/([^\\/]+)$/);\n if (shortMatch) {\n const [, owner, repo] = shortMatch;\n return { type: \"repo\", owner, repo };\n }\n\n return null;\n}\n","import type { SkillFile, Skill } from \"../types.js\";\n\nconst GITHUB_API = \"https://api.github.com\";\nconst GITHUB_RAW = \"https://raw.githubusercontent.com\";\n\ninterface GitHubTreeItem {\n path: string;\n mode: string;\n type: \"blob\" | \"tree\";\n sha: string;\n size?: number;\n url: string;\n}\n\ninterface GitHubTreeResponse {\n sha: string;\n url: string;\n tree: GitHubTreeItem[];\n truncated: boolean;\n}\n\nfunction parseGitHubUrl(url: string): {\n owner: string;\n repo: string;\n branch: string;\n path: string;\n} | null {\n try {\n const urlObj = new URL(url);\n const parts = urlObj.pathname.split(\"/\").filter(Boolean);\n\n // Handle raw.githubusercontent.com URLs\n // Format: https://raw.githubusercontent.com/owner/repo/refs/heads/branch/path/SKILL.md\n if (urlObj.hostname === \"raw.githubusercontent.com\") {\n if (parts.length < 5) return null;\n\n const owner = parts[0];\n const repo = parts[1];\n\n // Handle refs/heads/branch format\n if (parts[2] === \"refs\" && parts[3] === \"heads\") {\n const branch = parts[4];\n // Get directory path (exclude the filename like SKILL.md)\n const pathParts = parts.slice(5);\n // Remove the last part if it looks like a file (has extension)\n if (pathParts.length > 0 && pathParts[pathParts.length - 1].includes(\".\")) {\n pathParts.pop();\n }\n const path = pathParts.join(\"/\");\n return { owner, repo, branch, path };\n }\n\n // Handle direct branch format: owner/repo/branch/path\n const branch = parts[2];\n const pathParts = parts.slice(3);\n if (pathParts.length > 0 && pathParts[pathParts.length - 1].includes(\".\")) {\n pathParts.pop();\n }\n const path = pathParts.join(\"/\");\n return { owner, repo, branch, path };\n }\n\n // Handle github.com tree URLs\n // Format: https://github.com/owner/repo/tree/branch/path\n if (urlObj.hostname === \"github.com\") {\n if (parts.length < 4 || parts[2] !== \"tree\") return null;\n\n const owner = parts[0];\n const repo = parts[1];\n const branch = parts[3];\n const path = parts.slice(4).join(\"/\");\n\n return { owner, repo, branch, path };\n }\n\n return null;\n } catch {\n return null;\n }\n}\n\nexport async function downloadSkillFromGitHub(\n skill: Skill & { project: string }\n): Promise<{ files: SkillFile[]; error?: string }> {\n try {\n const parsed = parseGitHubUrl(skill.url);\n\n if (!parsed) {\n return { files: [], error: `Invalid GitHub URL: ${skill.url}` };\n }\n\n const { owner, repo, branch, path: skillPath } = parsed;\n\n const treeUrl = `${GITHUB_API}/repos/${owner}/${repo}/git/trees/${branch}?recursive=1`;\n const treeResponse = await fetch(treeUrl, {\n headers: {\n Accept: \"application/vnd.github.v3+json\",\n \"User-Agent\": \"context7-cli\",\n },\n });\n\n if (!treeResponse.ok) {\n return { files: [], error: `GitHub API error: ${treeResponse.status}` };\n }\n\n const treeData = (await treeResponse.json()) as GitHubTreeResponse;\n\n const skillFiles = treeData.tree.filter(\n (item) => item.type === \"blob\" && item.path.startsWith(skillPath + \"/\")\n );\n\n if (skillFiles.length === 0) {\n return { files: [], error: `No files found in ${skillPath}` };\n }\n\n const files: SkillFile[] = [];\n for (const item of skillFiles) {\n const rawUrl = `${GITHUB_RAW}/${owner}/${repo}/${branch}/${item.path}`;\n const fileResponse = await fetch(rawUrl);\n\n if (!fileResponse.ok) {\n console.warn(`Failed to fetch ${item.path}: ${fileResponse.status}`);\n continue;\n }\n\n const content = await fileResponse.text();\n const relativePath = item.path.slice(skillPath.length + 1);\n\n files.push({\n path: relativePath,\n content,\n });\n }\n\n return { files };\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n return { files: [], error: message };\n }\n}\n","import type {\n ListSkillsResponse,\n SingleSkillResponse,\n SearchResponse,\n DownloadResponse,\n 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 setBaseUrl(url: string): void {\n baseUrl = url;\n}\n\nexport async function listProjectSkills(project: string): Promise<ListSkillsResponse> {\n const params = new URLSearchParams({ project });\n const response = await fetch(`${baseUrl}/api/v2/skills?${params}`);\n return (await response.json()) as ListSkillsResponse;\n}\n\nexport async function getSkill(project: string, skillName: string): Promise<SingleSkillResponse> {\n const params = new URLSearchParams({ project, skill: skillName });\n const response = await fetch(`${baseUrl}/api/v2/skills?${params}`);\n return (await response.json()) as SingleSkillResponse;\n}\n\nexport async function searchSkills(query: string): Promise<SearchResponse> {\n const params = new URLSearchParams({ query });\n const response = await fetch(`${baseUrl}/api/v2/skills?${params}`);\n return (await response.json()) as SearchResponse;\n}\n\nexport function trackInstalls(skills: string[], ides: string[]): void {\n if (process.env.CTX7_TELEMETRY_DISABLED || !skills.length) return;\n fetch(`${baseUrl}/api/v2/skills/track`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ skills, ides }),\n }).catch(() => {});\n}\n\nexport async function downloadSkill(project: string, skillName: string): Promise<DownloadResponse> {\n const skillData = await getSkill(project, skillName);\n\n if (skillData.error) {\n return {\n skill: { name: skillName, description: \"\", url: \"\", project },\n files: [],\n error: skillData.message || skillData.error,\n };\n }\n\n const skill = {\n name: skillData.name,\n description: skillData.description,\n url: skillData.url,\n project: skillData.project,\n };\n\n const { files, error } = await downloadSkillFromGitHub(skill);\n\n if (error) {\n return { skill, files: [], error };\n }\n\n return { skill, files };\n}\n\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}\n\nexport interface SkillSearchResult extends Skill {\n project: string;\n installCount?: number;\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`;\n}\n\n/**\n * Formats install count with rounded display showing highest round number.\n * Examples: 5→\"5\", 15→\"10+\", 67→\"50+\", 150→\"100+\", 350→\"300+\", 1500→\"1k+\"\n */\nexport function formatInstallCount(count: number | undefined): string {\n if (count === undefined || count === 0) return \"\";\n\n let display: string;\n if (count >= 1000) {\n display = `${Math.floor(count / 1000)}k+`;\n } else if (count >= 100) {\n const hundreds = Math.floor(count / 100) * 100;\n display = `${hundreds}+`;\n } else if (count >= 10) {\n const tens = Math.floor(count / 10) * 10;\n display = `${tens}+`;\n } else {\n display = String(count);\n }\n\n return `\\x1b[38;5;214m↓${display}\\x1b[0m`;\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 { Command } from \"commander\";\nimport pc from \"picocolors\";\nimport ora from \"ora\";\nimport { mkdir, writeFile } from \"fs/promises\";\nimport { join } from \"path\";\nimport { homedir } from \"os\";\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 { 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 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 log.blank();\n\n // Check authentication\n const tokens = loadTokens();\n if (!tokens) {\n log.error(\"Authentication required. Please run 'ctx7 login' first.\");\n return;\n }\n\n if (isTokenExpired(tokens)) {\n log.error(\"Session expired. Please run 'ctx7 login' to refresh.\");\n return;\n }\n\n const accessToken = tokens.access_token;\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(\"Skills teach agents best practices, design patterns, and domain expertise.\\n\")\n );\n console.log(pc.yellow(\"Examples:\"));\n console.log(pc.dim(' \"React component optimization and performance best practices\"'));\n console.log(pc.dim(' \"Responsive web design with Tailwind CSS\"'));\n console.log(pc.dim(' \"Writing effective landing page copy\"'));\n console.log(pc.dim(' \"Deploying Next.js apps to Vercel\"'));\n console.log(pc.dim(' \"OAuth authentication with NextAuth.js\"\\n'));\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 const searchSpinner = ora(\"Finding relevant libraries...\").start();\n const searchResult = await searchLibraries(motivation, accessToken);\n\n if (searchResult.error || !searchResult.results?.length) {\n searchSpinner.fail(pc.red(\"No libraries found\"));\n log.warn(searchResult.message || \"Try a different description\");\n return;\n }\n\n searchSpinner.succeed(pc.green(`Found ${searchResult.results.length} relevant libraries`));\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 repoLink = isGitHub\n ? terminalLink(projectId, `https://github.com/${projectId}`, pc.white)\n : pc.white(projectId);\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 libraries:\",\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 libraries 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(\"Preparing questions...\").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\n const libraryNames = selectedLibraries.map((lib) => lib.title).join(\", \");\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(pc.dim(`(${queryLog.length} ${queryLog.length === 1 ? \"query\" : \"queries\"})`));\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\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(`Queried documentation`));\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 = event.message + 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 const initialStatus = feedback\n ? \"Regenerating skill with your feedback...\"\n : `Generating skill for \"${libraryNames}\"...`;\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 showFullContent = () => {\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(generatedContent);\n log.blank();\n console.log(pc.dim(\"━\".repeat(70)));\n log.blank();\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`, value: \"install\" },\n ...(hasMoreLines ? [{ name: `${pc.blue(\"⤢\")} View full skill`, value: \"expand\" }] : []),\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 === \"expand\") {\n showFullContent();\n continue;\n }\n break;\n }\n\n if (action === \"install\") {\n break;\n } else if (action === \"cancel\") {\n log.warn(\"Generation cancelled\");\n return;\n } else if (action === \"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 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\n log.blank();\n console.log(pc.green(pc.bold(\"Skill saved successfully\")));\n for (const targetDir of targetDirs) {\n console.log(pc.dim(` ${targetDir}/`) + pc.green(skillName));\n }\n log.blank();\n}\n","import * as crypto from \"crypto\";\nimport * as http from \"http\";\nimport * as fs from \"fs\";\nimport * as path from \"path\";\nimport * as os from \"os\";\n\nconst CONFIG_DIR = path.join(os.homedir(), \".context7\");\nconst CREDENTIALS_FILE = path.join(CONFIG_DIR, \"credentials.json\");\n\nexport interface TokenData {\n access_token: string;\n refresh_token?: string;\n token_type: string;\n expires_in?: number;\n expires_at?: number;\n scope?: string;\n}\n\nexport interface PKCEChallenge {\n codeVerifier: string;\n codeChallenge: string;\n}\n\nexport function generatePKCE(): PKCEChallenge {\n const codeVerifier = crypto.randomBytes(32).toString(\"base64url\");\n const codeChallenge = crypto.createHash(\"sha256\").update(codeVerifier).digest(\"base64url\");\n return { codeVerifier, codeChallenge };\n}\n\nexport function generateState(): string {\n return crypto.randomBytes(16).toString(\"base64url\");\n}\n\nfunction ensureConfigDir(): void {\n if (!fs.existsSync(CONFIG_DIR)) {\n fs.mkdirSync(CONFIG_DIR, { recursive: true, mode: 0o700 });\n }\n}\n\nexport function saveTokens(tokens: TokenData): void {\n ensureConfigDir();\n const data = {\n ...tokens,\n expires_at:\n tokens.expires_at ?? (tokens.expires_in ? Date.now() + tokens.expires_in * 1000 : undefined),\n };\n fs.writeFileSync(CREDENTIALS_FILE, JSON.stringify(data, null, 2), { mode: 0o600 });\n}\n\nexport function loadTokens(): TokenData | null {\n if (!fs.existsSync(CREDENTIALS_FILE)) {\n return null;\n }\n try {\n const data = JSON.parse(fs.readFileSync(CREDENTIALS_FILE, \"utf-8\"));\n return data as TokenData;\n } catch {\n return null;\n }\n}\n\nexport function clearTokens(): boolean {\n if (fs.existsSync(CREDENTIALS_FILE)) {\n fs.unlinkSync(CREDENTIALS_FILE);\n return true;\n }\n return false;\n}\n\nexport function isTokenExpired(tokens: TokenData): boolean {\n if (!tokens.expires_at) {\n return false;\n }\n return Date.now() > tokens.expires_at - 60000;\n}\n\nexport interface CallbackResult {\n code: string;\n state: string;\n}\n\n// Port for OAuth callback server - must match registered redirect URI\nconst CALLBACK_PORT = 52417;\n\nexport function createCallbackServer(expectedState: string): {\n port: Promise<number>;\n result: Promise<CallbackResult>;\n close: () => void;\n} {\n let resolvePort: (port: number) => void;\n let resolveResult: (result: CallbackResult) => void;\n let rejectResult: (error: Error) => void;\n let serverInstance: http.Server | null = null;\n\n const portPromise = new Promise<number>((resolve) => {\n resolvePort = resolve;\n });\n\n const resultPromise = new Promise<CallbackResult>((resolve, reject) => {\n resolveResult = resolve;\n rejectResult = reject;\n });\n\n const server = http.createServer((req, res) => {\n const url = new URL(req.url || \"/\", `http://localhost`);\n\n if (url.pathname === \"/callback\") {\n const code = url.searchParams.get(\"code\");\n const state = url.searchParams.get(\"state\");\n const error = url.searchParams.get(\"error\");\n const errorDescription = url.searchParams.get(\"error_description\");\n\n res.writeHead(200, { \"Content-Type\": \"text/html\" });\n\n if (error) {\n res.end(errorPage(errorDescription || error));\n serverInstance?.close();\n rejectResult(new Error(errorDescription || error));\n return;\n }\n\n if (!code || !state) {\n res.end(errorPage(\"Missing authorization code or state\"));\n serverInstance?.close();\n rejectResult(new Error(\"Missing authorization code or state\"));\n return;\n }\n\n if (state !== expectedState) {\n res.end(errorPage(\"State mismatch - possible CSRF attack\"));\n serverInstance?.close();\n rejectResult(new Error(\"State mismatch\"));\n return;\n }\n\n res.end(successPage());\n serverInstance?.close();\n resolveResult({ code, state });\n } else {\n res.writeHead(404);\n res.end(\"Not found\");\n }\n });\n\n serverInstance = server;\n\n server.on(\"error\", (err) => {\n rejectResult(err as Error);\n });\n\n server.listen(CALLBACK_PORT, \"127.0.0.1\", () => {\n resolvePort(CALLBACK_PORT);\n });\n\n const timeout = setTimeout(\n () => {\n server.close();\n rejectResult(new Error(\"Login timed out after 5 minutes\"));\n },\n 5 * 60 * 1000\n );\n\n return {\n port: portPromise,\n result: resultPromise,\n close: () => {\n clearTimeout(timeout);\n server.close();\n },\n };\n}\n\nfunction successPage(): string {\n return `<!DOCTYPE html>\n<html>\n <head><title>Login Successful</title></head>\n <body style=\"font-family: system-ui; display: flex; justify-content: center; align-items: center; height: 100vh; margin: 0; background: #f9fafb;\">\n <div style=\"text-align: center; padding: 2rem;\">\n <div style=\"width: 64px; height: 64px; background: #16a34a; border-radius: 50%; display: flex; align-items: center; justify-content: center; margin: 0 auto 1rem;\">\n <svg width=\"32\" height=\"32\" fill=\"none\" stroke=\"white\" stroke-width=\"3\" viewBox=\"0 0 24 24\">\n <path d=\"M5 13l4 4L19 7\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </div>\n <h1 style=\"color: #16a34a; margin: 0 0 0.5rem;\">Login Successful!</h1>\n <p style=\"color: #6b7280; margin: 0;\">You can close this window and return to the terminal.</p>\n </div>\n </body>\n</html>`;\n}\n\nfunction escapeHtml(text: string): string {\n return text\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\"/g, \""\")\n .replace(/'/g, \"'\");\n}\n\nfunction errorPage(message: string): string {\n const safeMessage = escapeHtml(message);\n return `<!DOCTYPE html>\n<html>\n <head><title>Login Failed</title></head>\n <body style=\"font-family: system-ui; display: flex; justify-content: center; align-items: center; height: 100vh; margin: 0; background: #f9fafb;\">\n <div style=\"text-align: center; padding: 2rem;\">\n <div style=\"width: 64px; height: 64px; background: #dc2626; border-radius: 50%; display: flex; align-items: center; justify-content: center; margin: 0 auto 1rem;\">\n <svg width=\"32\" height=\"32\" fill=\"none\" stroke=\"white\" stroke-width=\"3\" viewBox=\"0 0 24 24\">\n <path d=\"M6 18L18 6M6 6l12 12\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </div>\n <h1 style=\"color: #dc2626; margin: 0 0 0.5rem;\">Login Failed</h1>\n <p style=\"color: #6b7280; margin: 0;\">${safeMessage}</p>\n <p style=\"color: #9ca3af; margin: 1rem 0 0; font-size: 0.875rem;\">You can close this window.</p>\n </div>\n </body>\n</html>`;\n}\n\ninterface TokenErrorResponse {\n error?: string;\n error_description?: string;\n}\n\nexport async function exchangeCodeForTokens(\n baseUrl: string,\n code: string,\n codeVerifier: string,\n redirectUri: string,\n clientId: string\n): Promise<TokenData> {\n const response = await fetch(`${baseUrl}/api/oauth/token`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/x-www-form-urlencoded\" },\n body: new URLSearchParams({\n grant_type: \"authorization_code\",\n client_id: clientId,\n code,\n code_verifier: codeVerifier,\n redirect_uri: redirectUri,\n }).toString(),\n });\n\n if (!response.ok) {\n const err = (await response.json().catch(() => ({}))) as TokenErrorResponse;\n throw new Error(err.error_description || err.error || \"Failed to exchange code for tokens\");\n }\n\n return (await response.json()) as TokenData;\n}\n\nexport function buildAuthorizationUrl(\n baseUrl: string,\n clientId: string,\n redirectUri: string,\n codeChallenge: string,\n state: string\n): string {\n const url = new URL(`${baseUrl}/api/oauth/authorize`);\n url.searchParams.set(\"client_id\", clientId);\n url.searchParams.set(\"redirect_uri\", redirectUri);\n url.searchParams.set(\"code_challenge\", codeChallenge);\n url.searchParams.set(\"code_challenge_method\", \"S256\");\n url.searchParams.set(\"state\", state);\n url.searchParams.set(\"scope\", \"profile email\");\n url.searchParams.set(\"response_type\", \"code\");\n return url.toString();\n}\n","import {\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\nconst selectOrInput: (config: SelectOrInputConfig) => Promise<string> = createPrompt<\n string,\n SelectOrInputConfig\n>((config, done): string => {\n const { message, options, recommendedIndex = 0 } = config;\n const [cursor, setCursor] = useState(recommendedIndex);\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[recommendedIndex]);\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 === recommendedIndex;\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 { 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\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\nasync function loginCommand(options: { browser: boolean }): Promise<void> {\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 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 (options.browser) {\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 console.log(\"\");\n console.log(pc.dim(\"You can now use authenticated Context7 features.\"));\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 process.exit(1);\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 process.exit(1);\n }\n}\n\nfunction logoutCommand(): void {\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 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 { 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","mkdir","writeFile","join","homedir","select","baseUrl","pc","pc","select","homedir","join","mkdir","writeFile","homedir","program","input","ora","pc","join","path","rm","pc","ora","baseUrl","program","pc","ora","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/utils/selectOrInput.ts","../src/commands/auth.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 { checkboxWithHover, terminalLink, formatInstallCount } 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 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 installs = formatInstallCount(s.installCount);\n\n // Build metadata panel shown when item is hovered\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: installs ? `${indexStr} ${paddedName} ${installs}` : `${indexStr} ${paddedName}`,\n value: s,\n description: metadataLines.join(\"\\n\"),\n };\n });\n\n log.blank();\n\n const installsOffset = 4 + indexWidth + 1 + 1 + maxNameLen + 1 - 3;\n const message =\n \"Select skills to install:\" + \" \".repeat(Math.max(1, installsOffset - 25)) + pc.dim(\"installs\");\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}\n\nexport interface SkillSearchResult extends Skill {\n project: string;\n installCount?: number;\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`;\n}\n\n/**\n * Formats install count for display.\n */\nexport function formatInstallCount(count: number | undefined): string {\n if (count === undefined || count === 0) return \"\";\n\n return pc.yellow(String(count));\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 } from \"fs/promises\";\nimport { join } from \"path\";\nimport { homedir } from \"os\";\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 { 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 // Check authentication\n const tokens = loadTokens();\n if (!tokens) {\n log.error(\"Authentication required. Please run 'ctx7 login' first.\");\n return;\n }\n\n if (isTokenExpired(tokens)) {\n log.error(\"Session expired. Please run 'ctx7 login' to refresh.\");\n return;\n }\n\n const accessToken = tokens.access_token;\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(\"Skills teach agents best practices, design patterns, and domain expertise.\\n\")\n );\n console.log(pc.yellow(\"Examples:\"));\n console.log(pc.dim(' \"React component optimization and performance best practices\"'));\n console.log(pc.dim(' \"Responsive web design with Tailwind CSS\"'));\n console.log(pc.dim(' \"Writing effective landing page copy\"'));\n console.log(pc.dim(' \"Deploying Next.js apps to Vercel\"'));\n console.log(pc.dim(' \"OAuth authentication with NextAuth.js\"\\n'));\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 const searchSpinner = ora(\"Finding relevant libraries...\").start();\n const searchResult = await searchLibraries(motivation, accessToken);\n\n if (searchResult.error || !searchResult.results?.length) {\n searchSpinner.fail(pc.red(\"No libraries found\"));\n log.warn(searchResult.message || \"Try a different description\");\n return;\n }\n\n searchSpinner.succeed(pc.green(`Found ${searchResult.results.length} relevant libraries`));\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 repoLink = isGitHub\n ? terminalLink(projectId, `https://github.com/${projectId}`, pc.white)\n : pc.white(projectId);\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 libraries:\",\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 libraries 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(\"Preparing questions...\").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\n const libraryNames = selectedLibraries.map((lib) => lib.title).join(\", \");\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(pc.dim(`(${queryLog.length} ${queryLog.length === 1 ? \"query\" : \"queries\"})`));\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\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(`Queried documentation`));\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 = event.message + 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 const initialStatus = feedback\n ? \"Regenerating skill with your feedback...\"\n : `Generating skill for \"${libraryNames}\"...`;\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 showFullContent = () => {\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(generatedContent);\n log.blank();\n console.log(pc.dim(\"━\".repeat(70)));\n log.blank();\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`, value: \"install\" },\n ...(hasMoreLines ? [{ name: `${pc.blue(\"⤢\")} View full skill`, value: \"expand\" }] : []),\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 === \"expand\") {\n showFullContent();\n continue;\n }\n break;\n }\n\n if (action === \"install\") {\n break;\n } else if (action === \"cancel\") {\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 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(pc.bold(\"Skill saved successfully\")));\n for (const targetDir of targetDirs) {\n console.log(pc.dim(` ${targetDir}/`) + pc.green(skillName));\n }\n log.blank();\n}\n","import * as crypto from \"crypto\";\nimport * as http from \"http\";\nimport * as fs from \"fs\";\nimport * as path from \"path\";\nimport * as os from \"os\";\n\nconst CONFIG_DIR = path.join(os.homedir(), \".context7\");\nconst CREDENTIALS_FILE = path.join(CONFIG_DIR, \"credentials.json\");\n\nexport interface TokenData {\n access_token: string;\n refresh_token?: string;\n token_type: string;\n expires_in?: number;\n expires_at?: number;\n scope?: string;\n}\n\nexport interface PKCEChallenge {\n codeVerifier: string;\n codeChallenge: string;\n}\n\nexport function generatePKCE(): PKCEChallenge {\n const codeVerifier = crypto.randomBytes(32).toString(\"base64url\");\n const codeChallenge = crypto.createHash(\"sha256\").update(codeVerifier).digest(\"base64url\");\n return { codeVerifier, codeChallenge };\n}\n\nexport function generateState(): string {\n return crypto.randomBytes(16).toString(\"base64url\");\n}\n\nfunction ensureConfigDir(): void {\n if (!fs.existsSync(CONFIG_DIR)) {\n fs.mkdirSync(CONFIG_DIR, { recursive: true, mode: 0o700 });\n }\n}\n\nexport function saveTokens(tokens: TokenData): void {\n ensureConfigDir();\n const data = {\n ...tokens,\n expires_at:\n tokens.expires_at ?? (tokens.expires_in ? Date.now() + tokens.expires_in * 1000 : undefined),\n };\n fs.writeFileSync(CREDENTIALS_FILE, JSON.stringify(data, null, 2), { mode: 0o600 });\n}\n\nexport function loadTokens(): TokenData | null {\n if (!fs.existsSync(CREDENTIALS_FILE)) {\n return null;\n }\n try {\n const data = JSON.parse(fs.readFileSync(CREDENTIALS_FILE, \"utf-8\"));\n return data as TokenData;\n } catch {\n return null;\n }\n}\n\nexport function clearTokens(): boolean {\n if (fs.existsSync(CREDENTIALS_FILE)) {\n fs.unlinkSync(CREDENTIALS_FILE);\n return true;\n }\n return false;\n}\n\nexport function isTokenExpired(tokens: TokenData): boolean {\n if (!tokens.expires_at) {\n return false;\n }\n return Date.now() > tokens.expires_at - 60000;\n}\n\nexport interface CallbackResult {\n code: string;\n state: string;\n}\n\n// Port for OAuth callback server - must match registered redirect URI\nconst CALLBACK_PORT = 52417;\n\nexport function createCallbackServer(expectedState: string): {\n port: Promise<number>;\n result: Promise<CallbackResult>;\n close: () => void;\n} {\n let resolvePort: (port: number) => void;\n let resolveResult: (result: CallbackResult) => void;\n let rejectResult: (error: Error) => void;\n let serverInstance: http.Server | null = null;\n\n const portPromise = new Promise<number>((resolve) => {\n resolvePort = resolve;\n });\n\n const resultPromise = new Promise<CallbackResult>((resolve, reject) => {\n resolveResult = resolve;\n rejectResult = reject;\n });\n\n const server = http.createServer((req, res) => {\n const url = new URL(req.url || \"/\", `http://localhost`);\n\n if (url.pathname === \"/callback\") {\n const code = url.searchParams.get(\"code\");\n const state = url.searchParams.get(\"state\");\n const error = url.searchParams.get(\"error\");\n const errorDescription = url.searchParams.get(\"error_description\");\n\n res.writeHead(200, { \"Content-Type\": \"text/html\" });\n\n if (error) {\n res.end(errorPage(errorDescription || error));\n serverInstance?.close();\n rejectResult(new Error(errorDescription || error));\n return;\n }\n\n if (!code || !state) {\n res.end(errorPage(\"Missing authorization code or state\"));\n serverInstance?.close();\n rejectResult(new Error(\"Missing authorization code or state\"));\n return;\n }\n\n if (state !== expectedState) {\n res.end(errorPage(\"State mismatch - possible CSRF attack\"));\n serverInstance?.close();\n rejectResult(new Error(\"State mismatch\"));\n return;\n }\n\n res.end(successPage());\n serverInstance?.close();\n resolveResult({ code, state });\n } else {\n res.writeHead(404);\n res.end(\"Not found\");\n }\n });\n\n serverInstance = server;\n\n server.on(\"error\", (err) => {\n rejectResult(err as Error);\n });\n\n server.listen(CALLBACK_PORT, \"127.0.0.1\", () => {\n resolvePort(CALLBACK_PORT);\n });\n\n const timeout = setTimeout(\n () => {\n server.close();\n rejectResult(new Error(\"Login timed out after 5 minutes\"));\n },\n 5 * 60 * 1000\n );\n\n return {\n port: portPromise,\n result: resultPromise,\n close: () => {\n clearTimeout(timeout);\n server.close();\n },\n };\n}\n\nfunction successPage(): string {\n return `<!DOCTYPE html>\n<html>\n <head><title>Login Successful</title></head>\n <body style=\"font-family: system-ui; display: flex; justify-content: center; align-items: center; height: 100vh; margin: 0; background: #f9fafb;\">\n <div style=\"text-align: center; padding: 2rem;\">\n <div style=\"width: 64px; height: 64px; background: #16a34a; border-radius: 50%; display: flex; align-items: center; justify-content: center; margin: 0 auto 1rem;\">\n <svg width=\"32\" height=\"32\" fill=\"none\" stroke=\"white\" stroke-width=\"3\" viewBox=\"0 0 24 24\">\n <path d=\"M5 13l4 4L19 7\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </div>\n <h1 style=\"color: #16a34a; margin: 0 0 0.5rem;\">Login Successful!</h1>\n <p style=\"color: #6b7280; margin: 0;\">You can close this window and return to the terminal.</p>\n </div>\n </body>\n</html>`;\n}\n\nfunction escapeHtml(text: string): string {\n return text\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\"/g, \""\")\n .replace(/'/g, \"'\");\n}\n\nfunction errorPage(message: string): string {\n const safeMessage = escapeHtml(message);\n return `<!DOCTYPE html>\n<html>\n <head><title>Login Failed</title></head>\n <body style=\"font-family: system-ui; display: flex; justify-content: center; align-items: center; height: 100vh; margin: 0; background: #f9fafb;\">\n <div style=\"text-align: center; padding: 2rem;\">\n <div style=\"width: 64px; height: 64px; background: #dc2626; border-radius: 50%; display: flex; align-items: center; justify-content: center; margin: 0 auto 1rem;\">\n <svg width=\"32\" height=\"32\" fill=\"none\" stroke=\"white\" stroke-width=\"3\" viewBox=\"0 0 24 24\">\n <path d=\"M6 18L18 6M6 6l12 12\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </div>\n <h1 style=\"color: #dc2626; margin: 0 0 0.5rem;\">Login Failed</h1>\n <p style=\"color: #6b7280; margin: 0;\">${safeMessage}</p>\n <p style=\"color: #9ca3af; margin: 1rem 0 0; font-size: 0.875rem;\">You can close this window.</p>\n </div>\n </body>\n</html>`;\n}\n\ninterface TokenErrorResponse {\n error?: string;\n error_description?: string;\n}\n\nexport async function exchangeCodeForTokens(\n baseUrl: string,\n code: string,\n codeVerifier: string,\n redirectUri: string,\n clientId: string\n): Promise<TokenData> {\n const response = await fetch(`${baseUrl}/api/oauth/token`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/x-www-form-urlencoded\" },\n body: new URLSearchParams({\n grant_type: \"authorization_code\",\n client_id: clientId,\n code,\n code_verifier: codeVerifier,\n redirect_uri: redirectUri,\n }).toString(),\n });\n\n if (!response.ok) {\n const err = (await response.json().catch(() => ({}))) as TokenErrorResponse;\n throw new Error(err.error_description || err.error || \"Failed to exchange code for tokens\");\n }\n\n return (await response.json()) as TokenData;\n}\n\nexport function buildAuthorizationUrl(\n baseUrl: string,\n clientId: string,\n redirectUri: string,\n codeChallenge: string,\n state: string\n): string {\n const url = new URL(`${baseUrl}/api/oauth/authorize`);\n url.searchParams.set(\"client_id\", clientId);\n url.searchParams.set(\"redirect_uri\", redirectUri);\n url.searchParams.set(\"code_challenge\", codeChallenge);\n url.searchParams.set(\"code_challenge_method\", \"S256\");\n url.searchParams.set(\"state\", state);\n url.searchParams.set(\"scope\", \"profile email\");\n url.searchParams.set(\"response_type\", \"code\");\n return url.toString();\n}\n","import {\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\nconst selectOrInput: (config: SelectOrInputConfig) => Promise<string> = createPrompt<\n string,\n SelectOrInputConfig\n>((config, done): string => {\n const { message, options, recommendedIndex = 0 } = config;\n const [cursor, setCursor] = useState(recommendedIndex);\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[recommendedIndex]);\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 === recommendedIndex;\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 { 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\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 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 (options.browser) {\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 console.log(\"\");\n console.log(pc.dim(\"You can now use authenticated Context7 features.\"));\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 process.exit(1);\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 process.exit(1);\n }\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 { 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","mkdir","writeFile","join","homedir","select","baseUrl","pc","pc","select","homedir","join","mkdir","writeFile","homedir","program","input","ora","pc","join","path","rm","pc","ora","baseUrl","program","pc","ora","readFileSync","dirname","join","pc"]}
|