ctx7 0.1.0-canary.2 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -7,7 +7,7 @@ import figlet from "figlet";
7
7
 
8
8
  // src/commands/skill.ts
9
9
  import pc3 from "picocolors";
10
- import { checkbox as checkbox2, Separator } from "@inquirer/prompts";
10
+ import { checkbox as checkbox2 } from "@inquirer/prompts";
11
11
  import ora from "ora";
12
12
  import { readdir, rm as rm2 } from "fs/promises";
13
13
  import { join as join3 } from "path";
@@ -346,8 +346,13 @@ async function promptForSingleTarget(options) {
346
346
  return { ide: selectedIde, scope: selectedScope };
347
347
  }
348
348
  function getTargetDirs(targets) {
349
+ const sortedIdes = [...targets.ides].sort((a, b) => {
350
+ if (a === "claude") return -1;
351
+ if (b === "claude") return 1;
352
+ return 0;
353
+ });
349
354
  const dirs = [];
350
- for (const ide of targets.ides) {
355
+ for (const ide of sortedIdes) {
351
356
  for (const scope of targets.scopes) {
352
357
  if (scope === "global") {
353
358
  dirs.push(join(homedir(), IDE_GLOBAL_PATHS[ide]));
@@ -407,28 +412,28 @@ function logInstallSummary(targets, targetDirs, skillNames) {
407
412
  }
408
413
  function registerSkillCommands(program2) {
409
414
  const skill = program2.command("skills").alias("skill").description("Manage AI coding skills");
410
- skill.command("install").alias("i").alias("add").argument("<project>", "Project (/owner/repo)").argument("[skills...]", "Specific skill names to install").option("--all", "Install all skills without prompting").option("--claude", "Install to .claude/skills/ (default)").option("--cursor", "Install to .cursor/skills/").option("--codex", "Install to .codex/skills/").option("--opencode", "Install to .opencode/skills/").option("--amp", "Install to .agents/skills/").option("--antigravity", "Install to .agent/skills/").option("--global", "Install globally instead of project-level").description("Install skills from a project").action(async (project, skillNames, options) => {
415
+ skill.command("install").alias("i").alias("add").argument("<repository>", "GitHub repository (/owner/repo)").argument("[skills...]", "Specific skill names to install").option("--all", "Install all skills without prompting").option("--global", "Install globally instead of current directory").option("--claude", "Claude Code (.claude/skills/)").option("--cursor", "Cursor (.cursor/skills/)").option("--codex", "Codex (.codex/skills/)").option("--opencode", "OpenCode (.opencode/skills/)").option("--amp", "Amp (.agents/skills/)").option("--antigravity", "Antigravity (.agent/skills/)").description("Install skills from a repository").action(async (project, skillNames, options) => {
411
416
  await installCommand(project, skillNames, options);
412
417
  });
413
- skill.command("search").alias("s").argument("<query>", "Search query").description("Search for skills across all indexed projects").action(async (query) => {
414
- await searchCommand(query);
418
+ skill.command("search").alias("s").argument("<keywords...>", "Search keywords").description("Search for skills across all indexed repositories").action(async (keywords) => {
419
+ await searchCommand(keywords.join(" "));
415
420
  });
416
- skill.command("list").alias("ls").option("--claude", "List from .claude/skills/").option("--cursor", "List from .cursor/skills/").option("--codex", "List from .codex/skills/").option("--opencode", "List from .opencode/skills/").option("--amp", "List from .agents/skills/").option("--antigravity", "List from .agent/skills/").option("--global", "List global skills").description("List installed skills").action(async (options) => {
421
+ skill.command("list").alias("ls").option("--global", "List global skills").option("--claude", "Claude Code (.claude/skills/)").option("--cursor", "Cursor (.cursor/skills/)").option("--codex", "Codex (.codex/skills/)").option("--opencode", "OpenCode (.opencode/skills/)").option("--amp", "Amp (.agents/skills/)").option("--antigravity", "Antigravity (.agent/skills/)").description("List installed skills").action(async (options) => {
417
422
  await listCommand(options);
418
423
  });
419
- skill.command("remove").alias("rm").alias("delete").argument("<name>", "Skill name to remove").option("--claude", "Remove from .claude/skills/").option("--cursor", "Remove from .cursor/skills/").option("--codex", "Remove from .codex/skills/").option("--opencode", "Remove from .opencode/skills/").option("--amp", "Remove from .agents/skills/").option("--antigravity", "Remove from .agent/skills/").option("--global", "Remove from global skills").description("Remove an installed skill").action(async (name, options) => {
424
+ skill.command("remove").alias("rm").alias("delete").argument("<name>", "Skill name to remove").option("--global", "Remove from global skills").option("--claude", "Claude Code (.claude/skills/)").option("--cursor", "Cursor (.cursor/skills/)").option("--codex", "Codex (.codex/skills/)").option("--opencode", "OpenCode (.opencode/skills/)").option("--amp", "Amp (.agents/skills/)").option("--antigravity", "Antigravity (.agent/skills/)").description("Remove an installed skill").action(async (name, options) => {
420
425
  await removeCommand(name, options);
421
426
  });
422
- skill.command("info").argument("<project>", "Project to show info for (/owner/repo)").description("Show information about skills in a project").action(async (project) => {
427
+ skill.command("info").argument("<repository>", "GitHub repository (/owner/repo)").description("Show skills in a repository").action(async (project) => {
423
428
  await infoCommand(project);
424
429
  });
425
430
  }
426
431
  function registerSkillAliases(program2) {
427
- program2.command("si", { hidden: true }).argument("<project>", "Project (/owner/repo)").argument("[skills...]", "Specific skill names to install").option("--all", "Install all skills without prompting").option("--claude", "Install to .claude/skills/ (default)").option("--cursor", "Install to .cursor/skills/").option("--codex", "Install to .codex/skills/").option("--opencode", "Install to .opencode/skills/").option("--amp", "Install to .agents/skills/").option("--antigravity", "Install to .agent/skills/").option("--global", "Install globally instead of project-level").description("Install skills (alias for: skills install)").action(async (project, skillNames, options) => {
432
+ program2.command("si", { hidden: true }).argument("<repository>", "GitHub repository (/owner/repo)").argument("[skills...]", "Specific skill names to install").option("--all", "Install all skills without prompting").option("--global", "Install globally instead of current directory").option("--claude", "Claude Code (.claude/skills/)").option("--cursor", "Cursor (.cursor/skills/)").option("--codex", "Codex (.codex/skills/)").option("--opencode", "OpenCode (.opencode/skills/)").option("--amp", "Amp (.agents/skills/)").option("--antigravity", "Antigravity (.agent/skills/)").description("Install skills (alias for: skills install)").action(async (project, skillNames, options) => {
428
433
  await installCommand(project, skillNames, options);
429
434
  });
430
- program2.command("ss", { hidden: true }).argument("<query>", "Search query").description("Search for skills (alias for: skills search)").action(async (query) => {
431
- await searchCommand(query);
435
+ program2.command("ss", { hidden: true }).argument("<keywords...>", "Search keywords").description("Search for skills (alias for: skills search)").action(async (keywords) => {
436
+ await searchCommand(keywords.join(" "));
432
437
  });
433
438
  }
434
439
  async function installCommand(input, skillNames, options) {
@@ -436,26 +441,26 @@ async function installCommand(input, skillNames, options) {
436
441
  if (!parsed) {
437
442
  log.error(`Invalid input format: ${input}`);
438
443
  log.info(`Expected: /owner/repo or full GitHub URL`);
439
- log.info(`To install specific skills, use: ctx7 skills install /owner/repo skill1 skill2`);
444
+ log.info(`Example: ctx7 skills install /anthropics/skills pdf`);
440
445
  log.blank();
441
446
  return;
442
447
  }
443
- const project = `/${parsed.owner}/${parsed.repo}`;
448
+ const repo = `/${parsed.owner}/${parsed.repo}`;
444
449
  log.blank();
445
- const spinner = ora(`Fetching skills from ${project}...`).start();
446
- const data = await listProjectSkills(project);
450
+ const spinner = ora(`Fetching skills from ${repo}...`).start();
451
+ const data = await listProjectSkills(repo);
447
452
  if (data.error) {
448
453
  spinner.fail(pc3.red(`Error: ${data.message || data.error}`));
449
454
  return;
450
455
  }
451
456
  if (!data.skills || data.skills.length === 0) {
452
- spinner.warn(pc3.yellow(`No skills found in ${project}`));
457
+ spinner.warn(pc3.yellow(`No skills found in ${repo}`));
453
458
  return;
454
459
  }
455
- const skillsWithProject = data.skills.map((s) => ({ ...s, project }));
460
+ const skillsWithRepo = data.skills.map((s) => ({ ...s, project: repo }));
456
461
  let selectedSkills;
457
462
  if (skillNames.length > 0) {
458
- selectedSkills = skillsWithProject.filter(
463
+ selectedSkills = skillsWithRepo.filter(
459
464
  (s) => skillNames.some((name) => s.name.toLowerCase() === name.toLowerCase())
460
465
  );
461
466
  const foundNames = selectedSkills.map((s) => s.name.toLowerCase());
@@ -470,11 +475,11 @@ async function installCommand(input, skillNames, options) {
470
475
  }
471
476
  } else if (options.all || data.skills.length === 1) {
472
477
  spinner.succeed(`Found ${data.skills.length} skill(s)`);
473
- selectedSkills = skillsWithProject;
478
+ selectedSkills = skillsWithRepo;
474
479
  } else {
475
480
  spinner.succeed(`Found ${data.skills.length} skill(s)`);
476
481
  const maxNameLen = Math.min(25, Math.max(...data.skills.map((s) => s.name.length)));
477
- const choices = skillsWithProject.map((s) => {
482
+ const choices = skillsWithRepo.map((s) => {
478
483
  const paddedName = s.name.padEnd(maxNameLen);
479
484
  const desc = s.description?.trim() ? s.description.slice(0, 60) + (s.description.length > 60 ? "..." : "") : "";
480
485
  return {
@@ -590,51 +595,26 @@ async function searchCommand(query) {
590
595
  return;
591
596
  }
592
597
  spinner.succeed(`Found ${data.results.length} skill(s)`);
593
- const groupedByProject = data.results.reduce(
594
- (acc, skill) => {
595
- if (!acc[skill.project]) acc[skill.project] = [];
596
- acc[skill.project].push(skill);
597
- return acc;
598
- },
599
- {}
600
- );
601
- const choices = [];
602
- const allSkills = data.results;
603
- const maxNameLen = Math.min(25, Math.max(...allSkills.map((s) => s.name.length)));
604
- for (const [project, skills] of Object.entries(groupedByProject)) {
605
- choices.push(new Separator(`
606
- ${pc3.bold(pc3.cyan(project))} ${pc3.dim(`(${skills.length})`)}`));
607
- if (skills.length > 1) {
608
- choices.push({
609
- name: pc3.italic(` \u21B3 Select all ${skills.length} skills from this repo`),
610
- value: { _selectAll: project }
611
- });
612
- }
613
- for (const s of skills) {
614
- const paddedName = s.name.padEnd(maxNameLen);
615
- const desc = s.description?.trim() ? s.description.slice(0, 60) + (s.description.length > 60 ? "..." : "") : "";
616
- choices.push({
617
- name: desc ? `${paddedName} ${pc3.dim(desc)}` : s.name,
618
- value: s
619
- });
620
- }
621
- }
598
+ const maxNameLen = Math.min(25, Math.max(...data.results.map((s) => s.name.length)));
599
+ const choices = data.results.map((s) => {
600
+ const paddedName = s.name.padEnd(maxNameLen);
601
+ const repoName = pc3.dim(`(${s.project})`);
602
+ const desc = s.description?.trim() ? s.description.slice(0, 50) + (s.description.length > 50 ? "..." : "") : "";
603
+ return {
604
+ name: desc ? `${paddedName} ${repoName} ${pc3.dim(desc)}` : `${paddedName} ${repoName}`,
605
+ value: s
606
+ };
607
+ });
622
608
  log.blank();
623
- let rawSelection;
609
+ let selectedSkills;
624
610
  try {
625
- rawSelection = await checkbox2({
626
- message: "Select skills:",
611
+ selectedSkills = await checkbox2({
612
+ message: "Select skills to install:",
627
613
  choices,
628
- pageSize: 18,
614
+ pageSize: 15,
629
615
  theme: {
630
616
  style: {
631
- renderSelectedChoices: (selected) => {
632
- return selected.map((c) => {
633
- const val = c.value;
634
- if ("_selectAll" in val) return `all from ${val._selectAll}`;
635
- return val.name;
636
- }).join(", ");
637
- }
617
+ renderSelectedChoices: (selected) => selected.map((c) => c.value.name).join(", ")
638
618
  }
639
619
  }
640
620
  });
@@ -642,17 +622,7 @@ ${pc3.bold(pc3.cyan(project))} ${pc3.dim(`(${skills.length})`)}`));
642
622
  log.warn("Installation cancelled");
643
623
  return;
644
624
  }
645
- const selectedSkills = [];
646
- for (const item of rawSelection) {
647
- if ("_selectAll" in item) {
648
- selectedSkills.push(...groupedByProject[item._selectAll]);
649
- } else {
650
- selectedSkills.push(item);
651
- }
652
- }
653
- const uniqueSkills = [
654
- ...new Map(selectedSkills.map((s) => [`${s.project}:${s.name}`, s])).values()
655
- ];
625
+ const uniqueSkills = selectedSkills;
656
626
  if (uniqueSkills.length === 0) {
657
627
  log.warn("No skills selected");
658
628
  return;
@@ -781,16 +751,16 @@ async function infoCommand(input) {
781
751
  log.blank();
782
752
  return;
783
753
  }
784
- const project = `/${parsed.owner}/${parsed.repo}`;
754
+ const repo = `/${parsed.owner}/${parsed.repo}`;
785
755
  log.blank();
786
- const spinner = ora(`Fetching skills from ${project}...`).start();
787
- const data = await listProjectSkills(project);
756
+ const spinner = ora(`Fetching skills from ${repo}...`).start();
757
+ const data = await listProjectSkills(repo);
788
758
  if (data.error) {
789
759
  spinner.fail(pc3.red(`Error: ${data.message || data.error}`));
790
760
  return;
791
761
  }
792
762
  if (!data.skills || data.skills.length === 0) {
793
- spinner.warn(pc3.yellow(`No skills found in ${project}`));
763
+ spinner.warn(pc3.yellow(`No skills found in ${repo}`));
794
764
  return;
795
765
  }
796
766
  spinner.succeed(`Found ${data.skills.length} skill(s)`);
@@ -803,8 +773,8 @@ async function infoCommand(input) {
803
773
  }
804
774
  log.plain(
805
775
  `${pc3.bold("Quick commands:")}
806
- Install all: ${pc3.cyan(`ctx7 skills install ${project} --all`)}
807
- Install one: ${pc3.cyan(`ctx7 skills install ${project} ${data.skills[0]?.name}`)}
776
+ Install all: ${pc3.cyan(`ctx7 skills install ${repo} --all`)}
777
+ Install one: ${pc3.cyan(`ctx7 skills install ${repo} ${data.skills[0]?.name}`)}
808
778
  `
809
779
  );
810
780
  }
@@ -829,7 +799,29 @@ program.name("ctx7").description("Context7 CLI - Manage AI coding skills and doc
829
799
  if (opts.baseUrl) {
830
800
  setBaseUrl(opts.baseUrl);
831
801
  }
832
- });
802
+ }).addHelpText(
803
+ "after",
804
+ `
805
+ Examples:
806
+ ${brand.dim("# Search for skills")}
807
+ ${brand.primary("npx ctx7 skills search pdf")}
808
+ ${brand.primary("npx ctx7 skills search react hooks")}
809
+
810
+ ${brand.dim("# Install from a repository")}
811
+ ${brand.primary("npx ctx7 skills install /anthropics/skills")}
812
+ ${brand.primary("npx ctx7 skills install /anthropics/skills pdf")}
813
+
814
+ ${brand.dim("# Install to specific client")}
815
+ ${brand.primary("npx ctx7 skills install /anthropics/skills --cursor")}
816
+ ${brand.primary("npx ctx7 skills install /anthropics/skills --global")}
817
+
818
+ ${brand.dim("# List and manage installed skills")}
819
+ ${brand.primary("npx ctx7 skills list --claude")}
820
+ ${brand.primary("npx ctx7 skills remove pdf")}
821
+
822
+ Visit ${brand.primary("https://context7.com")} to browse skills
823
+ `
824
+ );
833
825
  registerSkillCommands(program);
834
826
  registerSkillAliases(program);
835
827
  program.action(() => {
@@ -838,21 +830,12 @@ program.action(() => {
838
830
  console.log(brand.primary(banner));
839
831
  console.log(brand.dim(" The open agent skills ecosystem"));
840
832
  console.log("");
841
- console.log(" Commands:");
842
- console.log(
843
- brand.primary(" ctx7 skills install <input>") + " Install skills from a repository"
844
- );
845
- console.log(brand.primary(" ctx7 skills search <query>") + " Search for skills");
846
- console.log(brand.primary(" ctx7 skills list") + " List installed skills");
847
- console.log(brand.primary(" ctx7 skills info <repo>") + " Show skill information");
848
- console.log(brand.primary(" ctx7 skills remove <name>") + " Remove a skill");
849
- console.log("");
850
- console.log(" Examples:");
851
- console.log(brand.dim(" ctx7 skills install /anthropics/skills"));
852
- console.log(brand.dim(" ctx7 skills install /anthropics/skills pdf --cursor"));
853
- console.log(brand.dim(" ctx7 skills search pdf"));
833
+ console.log(" Quick start:");
834
+ console.log(` ${brand.primary("npx ctx7 skills search pdf")}`);
835
+ console.log(` ${brand.primary("npx ctx7 skills install /anthropics/skills")}`);
854
836
  console.log("");
855
- console.log(` Run ${brand.primary("ctx7 --help")} for more information`);
837
+ console.log(` Run ${brand.primary("npx ctx7 --help")} for all commands and options`);
838
+ console.log(` Visit ${brand.primary("https://context7.com")} to browse skills`);
856
839
  console.log("");
857
840
  });
858
841
  program.parse();
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/installer.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 { 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 }\n });\n\nregisterSkillCommands(program);\nregisterSkillAliases(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 console.log(\" Commands:\");\n console.log(\n brand.primary(\" ctx7 skills install <input>\") + \" Install skills from a repository\"\n );\n console.log(brand.primary(\" ctx7 skills search <query>\") + \" Search for skills\");\n console.log(brand.primary(\" ctx7 skills list\") + \" List installed skills\");\n console.log(brand.primary(\" ctx7 skills info <repo>\") + \" Show skill information\");\n console.log(brand.primary(\" ctx7 skills remove <name>\") + \" Remove a skill\");\n console.log(\"\");\n console.log(\" Examples:\");\n console.log(brand.dim(\" ctx7 skills install /anthropics/skills\"));\n console.log(brand.dim(\" ctx7 skills install /anthropics/skills pdf --cursor\"));\n console.log(brand.dim(\" ctx7 skills search pdf\"));\n console.log(\"\");\n console.log(` Run ${brand.primary(\"ctx7 --help\")} for more information`);\n console.log(\"\");\n});\n\nprogram.parse();\n","import { Command } from \"commander\";\nimport pc from \"picocolors\";\nimport { checkbox, Separator } from \"@inquirer/prompts\";\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 } from \"../utils/api.js\";\nimport { log } from \"../utils/logger.js\";\nimport {\n promptForInstallTargets,\n promptForSingleTarget,\n getTargetDirs,\n getTargetDirFromSelection,\n} from \"../utils/ide.js\";\nimport { installSkillFiles, symlinkSkill } from \"../utils/installer.js\";\nimport type {\n Skill,\n SkillSearchResult,\n AddOptions,\n ListOptions,\n RemoveOptions,\n InstallTargets,\n} from \"../types.js\";\nimport { IDE_NAMES } from \"../types.js\";\n\nfunction logInstallSummary(\n targets: InstallTargets,\n targetDirs: string[],\n skillNames: string[]\n): void {\n log.blank();\n let dirIndex = 0;\n for (const ide of targets.ides) {\n for (let i = 0; i < targets.scopes.length; i++) {\n const dir = targetDirs[dirIndex++];\n log.dim(`${IDE_NAMES[ide]}: ${dir}`);\n for (const name of skillNames) {\n log.itemAdd(name);\n }\n }\n }\n log.blank();\n}\n\nexport function registerSkillCommands(program: Command): void {\n const skill = program.command(\"skills\").alias(\"skill\").description(\"Manage AI coding skills\");\n\n skill\n .command(\"install\")\n .alias(\"i\")\n .alias(\"add\")\n .argument(\"<project>\", \"Project (/owner/repo)\")\n .argument(\"[skills...]\", \"Specific skill names to install\")\n .option(\"--all\", \"Install all skills without prompting\")\n .option(\"--claude\", \"Install to .claude/skills/ (default)\")\n .option(\"--cursor\", \"Install to .cursor/skills/\")\n .option(\"--codex\", \"Install to .codex/skills/\")\n .option(\"--opencode\", \"Install to .opencode/skills/\")\n .option(\"--amp\", \"Install to .agents/skills/\")\n .option(\"--antigravity\", \"Install to .agent/skills/\")\n .option(\"--global\", \"Install globally instead of project-level\")\n .description(\"Install skills from a project\")\n .action(async (project: string, skillNames: string[], options: AddOptions) => {\n await installCommand(project, skillNames, options);\n });\n\n skill\n .command(\"search\")\n .alias(\"s\")\n .argument(\"<query>\", \"Search query\")\n .description(\"Search for skills across all indexed projects\")\n .action(async (query: string) => {\n await searchCommand(query);\n });\n\n skill\n .command(\"list\")\n .alias(\"ls\")\n .option(\"--claude\", \"List from .claude/skills/\")\n .option(\"--cursor\", \"List from .cursor/skills/\")\n .option(\"--codex\", \"List from .codex/skills/\")\n .option(\"--opencode\", \"List from .opencode/skills/\")\n .option(\"--amp\", \"List from .agents/skills/\")\n .option(\"--antigravity\", \"List from .agent/skills/\")\n .option(\"--global\", \"List global 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(\"--claude\", \"Remove from .claude/skills/\")\n .option(\"--cursor\", \"Remove from .cursor/skills/\")\n .option(\"--codex\", \"Remove from .codex/skills/\")\n .option(\"--opencode\", \"Remove from .opencode/skills/\")\n .option(\"--amp\", \"Remove from .agents/skills/\")\n .option(\"--antigravity\", \"Remove from .agent/skills/\")\n .option(\"--global\", \"Remove from global 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(\"<project>\", \"Project to show info for (/owner/repo)\")\n .description(\"Show information about skills in a project\")\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(\"<project>\", \"Project (/owner/repo)\")\n .argument(\"[skills...]\", \"Specific skill names to install\")\n .option(\"--all\", \"Install all skills without prompting\")\n .option(\"--claude\", \"Install to .claude/skills/ (default)\")\n .option(\"--cursor\", \"Install to .cursor/skills/\")\n .option(\"--codex\", \"Install to .codex/skills/\")\n .option(\"--opencode\", \"Install to .opencode/skills/\")\n .option(\"--amp\", \"Install to .agents/skills/\")\n .option(\"--antigravity\", \"Install to .agent/skills/\")\n .option(\"--global\", \"Install globally instead of project-level\")\n .description(\"Install skills (alias for: skills install)\")\n .action(async (project: string, skillNames: string[], options: AddOptions) => {\n await installCommand(project, skillNames, options);\n });\n\n program\n .command(\"ss\", { hidden: true })\n .argument(\"<query>\", \"Search query\")\n .description(\"Search for skills (alias for: skills search)\")\n .action(async (query: string) => {\n await searchCommand(query);\n });\n}\n\nasync function installCommand(\n input: string,\n skillNames: string[],\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(`To install specific skills, use: ctx7 skills install /owner/repo skill1 skill2`);\n log.blank();\n return;\n }\n const project = `/${parsed.owner}/${parsed.repo}`;\n\n log.blank();\n const spinner = ora(`Fetching skills from ${project}...`).start();\n\n const data = await listProjectSkills(project);\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 ${project}`));\n return;\n }\n\n const skillsWithProject = data.skills.map((s) => ({ ...s, project }));\n\n let selectedSkills: (Skill & { project: string })[];\n\n if (skillNames.length > 0) {\n selectedSkills = skillsWithProject.filter((s) =>\n skillNames.some((name) => s.name.toLowerCase() === name.toLowerCase())\n );\n\n const foundNames = selectedSkills.map((s) => s.name.toLowerCase());\n const notFound = skillNames.filter((name) => !foundNames.includes(name.toLowerCase()));\n\n if (selectedSkills.length === 0) {\n spinner.fail(pc.red(`Skills not found: ${skillNames.join(\", \")}`));\n return;\n }\n\n spinner.succeed(`Found ${selectedSkills.length} of ${skillNames.length} requested skill(s)`);\n\n if (notFound.length > 0) {\n log.warn(`Not found: ${notFound.join(\", \")}`);\n }\n } else if (options.all || data.skills.length === 1) {\n spinner.succeed(`Found ${data.skills.length} skill(s)`);\n selectedSkills = skillsWithProject;\n } else {\n spinner.succeed(`Found ${data.skills.length} skill(s)`);\n const maxNameLen = Math.min(25, Math.max(...data.skills.map((s) => s.name.length)));\n const choices = skillsWithProject.map((s) => {\n const paddedName = s.name.padEnd(maxNameLen);\n const desc = s.description?.trim()\n ? s.description.slice(0, 60) + (s.description.length > 60 ? \"...\" : \"\")\n : \"\";\n\n return {\n name: desc ? `${paddedName} ${pc.dim(desc)}` : s.name,\n value: s,\n };\n });\n\n log.blank();\n\n try {\n selectedSkills = await checkbox({\n message: \"Select skills:\",\n choices,\n pageSize: 15,\n theme: {\n style: {\n renderSelectedChoices: (selected: Array<{ name?: string; value: unknown }>) =>\n selected.map((c) => (c.value as { name: string }).name).join(\", \"),\n },\n },\n });\n } catch {\n log.warn(\"Installation cancelled\");\n return;\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 installedCount = 0;\n let permissionError = false;\n const failedDirs: Set<string> = new Set();\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 installedCount++;\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 ${installedCount} skill(s)`);\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 groupedByProject = data.results.reduce(\n (acc, skill) => {\n if (!acc[skill.project]) acc[skill.project] = [];\n acc[skill.project].push(skill);\n return acc;\n },\n {} as Record<string, SkillSearchResult[]>\n );\n\n type ChoiceValue = SkillSearchResult | { _selectAll: string };\n const choices: Array<{ name: string; value: ChoiceValue } | Separator> = [];\n const allSkills = data.results;\n const maxNameLen = Math.min(25, Math.max(...allSkills.map((s) => s.name.length)));\n\n for (const [project, skills] of Object.entries(groupedByProject)) {\n choices.push(new Separator(`\\n${pc.bold(pc.cyan(project))} ${pc.dim(`(${skills.length})`)}`));\n\n if (skills.length > 1) {\n choices.push({\n name: pc.italic(` ↳ Select all ${skills.length} skills from this repo`),\n value: { _selectAll: project },\n });\n }\n\n for (const s of skills) {\n const paddedName = s.name.padEnd(maxNameLen);\n const desc = s.description?.trim()\n ? s.description.slice(0, 60) + (s.description.length > 60 ? \"...\" : \"\")\n : \"\";\n\n choices.push({\n name: desc ? `${paddedName} ${pc.dim(desc)}` : s.name,\n value: s,\n });\n }\n }\n\n log.blank();\n\n let rawSelection: ChoiceValue[];\n try {\n rawSelection = await checkbox({\n message: \"Select skills:\",\n choices,\n pageSize: 18,\n theme: {\n style: {\n renderSelectedChoices: (selected: Array<{ name?: string; value: unknown }>) => {\n return selected\n .map((c) => {\n const val = c.value as ChoiceValue;\n if (\"_selectAll\" in val) return `all from ${val._selectAll}`;\n return val.name;\n })\n .join(\", \");\n },\n },\n },\n });\n } catch {\n log.warn(\"Installation cancelled\");\n return;\n }\n\n const selectedSkills: SkillSearchResult[] = [];\n for (const item of rawSelection) {\n if (\"_selectAll\" in item) {\n selectedSkills.push(...groupedByProject[item._selectAll]);\n } else {\n selectedSkills.push(item);\n }\n }\n\n const uniqueSkills = [\n ...new Map(selectedSkills.map((s) => [`${s.project}:${s.name}`, s])).values(),\n ];\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 installedCount = 0;\n let permissionError = false;\n const failedDirs: Set<string> = new Set();\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 installedCount++;\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 ${installedCount} skill(s)`);\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 target = await promptForSingleTarget(options);\n if (!target) {\n log.warn(\"Cancelled\");\n return;\n }\n\n const skillsDir = getTargetDirFromSelection(target.ide, target.scope);\n\n try {\n const entries = await readdir(skillsDir, { withFileTypes: true });\n const skillFolders = entries.filter((e) => e.isDirectory() || e.isSymbolicLink());\n\n if (skillFolders.length === 0) {\n log.warn(`No skills installed in ${skillsDir}`);\n return;\n }\n\n log.info(`\\n◆ Installed skills (${skillsDir}):`);\n\n for (const folder of skillFolders) {\n log.item(folder.name);\n }\n\n log.success(`${skillFolders.length} skill(s) installed\\n`);\n } catch {\n log.warn(`No skills directory found at ${skillsDir}`);\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 project = `/${parsed.owner}/${parsed.repo}`;\n\n log.blank();\n const spinner = ora(`Fetching skills from ${project}...`).start();\n\n const data = await listProjectSkills(project);\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 ${project}`));\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 ${project} --all`)}\\n` +\n ` Install one: ${pc.cyan(`ctx7 skills install ${project} ${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} 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 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","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 } 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 return { ides: detected.ides, scopes: [scope] };\n }\n\n if (!options.global) {\n return { ides: [DEFAULT_CONFIG.defaultIde], scopes: [\"project\"] };\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 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 choices: ideChoices,\n required: true,\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 const selectedScopes: Scope[] = options.global ? [\"global\"] : [\"project\"];\n\n return { ides: selectedIdes, scopes: selectedScopes };\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 });\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 });\n } catch {\n return null;\n }\n }\n\n return { ide: selectedIde, scope: selectedScope };\n}\n\nexport function getTargetDirs(targets: InstallTargets): string[] {\n const dirs: string[] = [];\n for (const ide of targets.ides) {\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}\n\nexport interface SkillSearchResult extends Skill {\n project: string;\n}\n\nexport interface ListSkillsResponse {\n project: string;\n skills: Skill[];\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\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;\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","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 { 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","checkbox","rm","join","branch","pathParts","path","pc","pc","join","program","pc","checkbox","join","rm","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/installer.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 { 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 }\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);\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 { checkbox } from \"@inquirer/prompts\";\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 } from \"../utils/api.js\";\nimport { log } from \"../utils/logger.js\";\nimport {\n promptForInstallTargets,\n promptForSingleTarget,\n getTargetDirs,\n getTargetDirFromSelection,\n} from \"../utils/ide.js\";\nimport { installSkillFiles, symlinkSkill } from \"../utils/installer.js\";\nimport type {\n Skill,\n SkillSearchResult,\n AddOptions,\n ListOptions,\n RemoveOptions,\n InstallTargets,\n} from \"../types.js\";\nimport { IDE_NAMES } from \"../types.js\";\n\nfunction logInstallSummary(\n targets: InstallTargets,\n targetDirs: string[],\n skillNames: string[]\n): void {\n log.blank();\n let dirIndex = 0;\n for (const ide of targets.ides) {\n for (let i = 0; i < targets.scopes.length; i++) {\n const dir = targetDirs[dirIndex++];\n log.dim(`${IDE_NAMES[ide]}: ${dir}`);\n for (const name of skillNames) {\n log.itemAdd(name);\n }\n }\n }\n log.blank();\n}\n\nexport function registerSkillCommands(program: Command): void {\n const skill = program.command(\"skills\").alias(\"skill\").description(\"Manage AI coding skills\");\n\n skill\n .command(\"install\")\n .alias(\"i\")\n .alias(\"add\")\n .argument(\"<repository>\", \"GitHub repository (/owner/repo)\")\n .argument(\"[skills...]\", \"Specific skill names 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, skillNames: string[], options: AddOptions) => {\n await installCommand(project, skillNames, 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(\"[skills...]\", \"Specific skill names 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, skillNames: string[], options: AddOptions) => {\n await installCommand(project, skillNames, 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 skillNames: string[],\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 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 let selectedSkills: (Skill & { project: string })[];\n\n if (skillNames.length > 0) {\n selectedSkills = skillsWithRepo.filter((s) =>\n skillNames.some((name) => s.name.toLowerCase() === name.toLowerCase())\n );\n\n const foundNames = selectedSkills.map((s) => s.name.toLowerCase());\n const notFound = skillNames.filter((name) => !foundNames.includes(name.toLowerCase()));\n\n if (selectedSkills.length === 0) {\n spinner.fail(pc.red(`Skills not found: ${skillNames.join(\", \")}`));\n return;\n }\n\n spinner.succeed(`Found ${selectedSkills.length} of ${skillNames.length} requested skill(s)`);\n\n if (notFound.length > 0) {\n log.warn(`Not found: ${notFound.join(\", \")}`);\n }\n } else if (options.all || data.skills.length === 1) {\n spinner.succeed(`Found ${data.skills.length} skill(s)`);\n selectedSkills = skillsWithRepo;\n } else {\n spinner.succeed(`Found ${data.skills.length} skill(s)`);\n const maxNameLen = Math.min(25, Math.max(...data.skills.map((s) => s.name.length)));\n const choices = skillsWithRepo.map((s) => {\n const paddedName = s.name.padEnd(maxNameLen);\n const desc = s.description?.trim()\n ? s.description.slice(0, 60) + (s.description.length > 60 ? \"...\" : \"\")\n : \"\";\n\n return {\n name: desc ? `${paddedName} ${pc.dim(desc)}` : s.name,\n value: s,\n };\n });\n\n log.blank();\n\n try {\n selectedSkills = await checkbox({\n message: \"Select skills:\",\n choices,\n pageSize: 15,\n theme: {\n style: {\n renderSelectedChoices: (selected: Array<{ name?: string; value: unknown }>) =>\n selected.map((c) => (c.value as { name: string }).name).join(\", \"),\n },\n },\n });\n } catch {\n log.warn(\"Installation cancelled\");\n return;\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 installedCount = 0;\n let permissionError = false;\n const failedDirs: Set<string> = new Set();\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 installedCount++;\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 ${installedCount} skill(s)`);\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 maxNameLen = Math.min(25, Math.max(...data.results.map((s) => s.name.length)));\n const choices = data.results.map((s) => {\n const paddedName = s.name.padEnd(maxNameLen);\n const repoName = pc.dim(`(${s.project})`);\n const desc = s.description?.trim()\n ? s.description.slice(0, 50) + (s.description.length > 50 ? \"...\" : \"\")\n : \"\";\n\n return {\n name: desc ? `${paddedName} ${repoName} ${pc.dim(desc)}` : `${paddedName} ${repoName}`,\n value: s,\n };\n });\n\n log.blank();\n\n let selectedSkills: SkillSearchResult[];\n try {\n selectedSkills = await checkbox({\n message: \"Select skills to install:\",\n choices,\n pageSize: 15,\n theme: {\n style: {\n renderSelectedChoices: (selected: Array<{ name?: string; value: unknown }>) =>\n selected.map((c) => (c.value as SkillSearchResult).name).join(\", \"),\n },\n },\n });\n } catch {\n log.warn(\"Installation cancelled\");\n return;\n }\n\n const uniqueSkills = selectedSkills;\n\n if (uniqueSkills.length === 0) {\n log.warn(\"No skills selected\");\n return;\n }\n\n const targets = await promptForInstallTargets({});\n if (!targets) {\n log.warn(\"Installation cancelled\");\n return;\n }\n\n const targetDirs = getTargetDirs(targets);\n\n const installSpinner = ora(\"Installing skills...\").start();\n\n let installedCount = 0;\n let permissionError = false;\n const failedDirs: Set<string> = new Set();\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 installedCount++;\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 ${installedCount} skill(s)`);\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 target = await promptForSingleTarget(options);\n if (!target) {\n log.warn(\"Cancelled\");\n return;\n }\n\n const skillsDir = getTargetDirFromSelection(target.ide, target.scope);\n\n try {\n const entries = await readdir(skillsDir, { withFileTypes: true });\n const skillFolders = entries.filter((e) => e.isDirectory() || e.isSymbolicLink());\n\n if (skillFolders.length === 0) {\n log.warn(`No skills installed in ${skillsDir}`);\n return;\n }\n\n log.info(`\\n◆ Installed skills (${skillsDir}):`);\n\n for (const folder of skillFolders) {\n log.item(folder.name);\n }\n\n log.success(`${skillFolders.length} skill(s) installed\\n`);\n } catch {\n log.warn(`No skills directory found at ${skillsDir}`);\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} 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 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","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 } 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 return { ides: detected.ides, scopes: [scope] };\n }\n\n if (!options.global) {\n return { ides: [DEFAULT_CONFIG.defaultIde], scopes: [\"project\"] };\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 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 choices: ideChoices,\n required: true,\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 const selectedScopes: Scope[] = options.global ? [\"global\"] : [\"project\"];\n\n return { ides: selectedIdes, scopes: selectedScopes };\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 });\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 });\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}\n\nexport interface SkillSearchResult extends Skill {\n project: string;\n}\n\nexport interface ListSkillsResponse {\n project: string;\n skills: Skill[];\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\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;\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","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 { 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","checkbox","rm","join","branch","pathParts","path","pc","pc","join","program","pc","checkbox","join","rm","dirname","join","pc"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ctx7",
3
- "version": "0.1.0-canary.2",
3
+ "version": "0.1.0",
4
4
  "description": "Context7 CLI - Manage AI coding skills and documentation context",
5
5
  "type": "module",
6
6
  "bin": {