ctx7 0.1.0-canary.3 → 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";
@@ -412,28 +412,28 @@ function logInstallSummary(targets, targetDirs, skillNames) {
412
412
  }
413
413
  function registerSkillCommands(program2) {
414
414
  const skill = program2.command("skills").alias("skill").description("Manage AI coding skills");
415
- 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) => {
416
416
  await installCommand(project, skillNames, options);
417
417
  });
418
- skill.command("search").alias("s").argument("<query>", "Search query").description("Search for skills across all indexed projects").action(async (query) => {
419
- 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(" "));
420
420
  });
421
- 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) => {
422
422
  await listCommand(options);
423
423
  });
424
- 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) => {
425
425
  await removeCommand(name, options);
426
426
  });
427
- 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) => {
428
428
  await infoCommand(project);
429
429
  });
430
430
  }
431
431
  function registerSkillAliases(program2) {
432
- 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) => {
433
433
  await installCommand(project, skillNames, options);
434
434
  });
435
- program2.command("ss", { hidden: true }).argument("<query>", "Search query").description("Search for skills (alias for: skills search)").action(async (query) => {
436
- 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(" "));
437
437
  });
438
438
  }
439
439
  async function installCommand(input, skillNames, options) {
@@ -441,26 +441,26 @@ async function installCommand(input, skillNames, options) {
441
441
  if (!parsed) {
442
442
  log.error(`Invalid input format: ${input}`);
443
443
  log.info(`Expected: /owner/repo or full GitHub URL`);
444
- log.info(`To install specific skills, use: ctx7 skills install /owner/repo skill1 skill2`);
444
+ log.info(`Example: ctx7 skills install /anthropics/skills pdf`);
445
445
  log.blank();
446
446
  return;
447
447
  }
448
- const project = `/${parsed.owner}/${parsed.repo}`;
448
+ const repo = `/${parsed.owner}/${parsed.repo}`;
449
449
  log.blank();
450
- const spinner = ora(`Fetching skills from ${project}...`).start();
451
- const data = await listProjectSkills(project);
450
+ const spinner = ora(`Fetching skills from ${repo}...`).start();
451
+ const data = await listProjectSkills(repo);
452
452
  if (data.error) {
453
453
  spinner.fail(pc3.red(`Error: ${data.message || data.error}`));
454
454
  return;
455
455
  }
456
456
  if (!data.skills || data.skills.length === 0) {
457
- spinner.warn(pc3.yellow(`No skills found in ${project}`));
457
+ spinner.warn(pc3.yellow(`No skills found in ${repo}`));
458
458
  return;
459
459
  }
460
- const skillsWithProject = data.skills.map((s) => ({ ...s, project }));
460
+ const skillsWithRepo = data.skills.map((s) => ({ ...s, project: repo }));
461
461
  let selectedSkills;
462
462
  if (skillNames.length > 0) {
463
- selectedSkills = skillsWithProject.filter(
463
+ selectedSkills = skillsWithRepo.filter(
464
464
  (s) => skillNames.some((name) => s.name.toLowerCase() === name.toLowerCase())
465
465
  );
466
466
  const foundNames = selectedSkills.map((s) => s.name.toLowerCase());
@@ -475,11 +475,11 @@ async function installCommand(input, skillNames, options) {
475
475
  }
476
476
  } else if (options.all || data.skills.length === 1) {
477
477
  spinner.succeed(`Found ${data.skills.length} skill(s)`);
478
- selectedSkills = skillsWithProject;
478
+ selectedSkills = skillsWithRepo;
479
479
  } else {
480
480
  spinner.succeed(`Found ${data.skills.length} skill(s)`);
481
481
  const maxNameLen = Math.min(25, Math.max(...data.skills.map((s) => s.name.length)));
482
- const choices = skillsWithProject.map((s) => {
482
+ const choices = skillsWithRepo.map((s) => {
483
483
  const paddedName = s.name.padEnd(maxNameLen);
484
484
  const desc = s.description?.trim() ? s.description.slice(0, 60) + (s.description.length > 60 ? "..." : "") : "";
485
485
  return {
@@ -595,51 +595,26 @@ async function searchCommand(query) {
595
595
  return;
596
596
  }
597
597
  spinner.succeed(`Found ${data.results.length} skill(s)`);
598
- const groupedByProject = data.results.reduce(
599
- (acc, skill) => {
600
- if (!acc[skill.project]) acc[skill.project] = [];
601
- acc[skill.project].push(skill);
602
- return acc;
603
- },
604
- {}
605
- );
606
- const choices = [];
607
- const allSkills = data.results;
608
- const maxNameLen = Math.min(25, Math.max(...allSkills.map((s) => s.name.length)));
609
- for (const [project, skills] of Object.entries(groupedByProject)) {
610
- choices.push(new Separator(`
611
- ${pc3.bold(pc3.cyan(project))} ${pc3.dim(`(${skills.length})`)}`));
612
- if (skills.length > 1) {
613
- choices.push({
614
- name: pc3.italic(` \u21B3 Select all ${skills.length} skills from this repo`),
615
- value: { _selectAll: project }
616
- });
617
- }
618
- for (const s of skills) {
619
- const paddedName = s.name.padEnd(maxNameLen);
620
- const desc = s.description?.trim() ? s.description.slice(0, 60) + (s.description.length > 60 ? "..." : "") : "";
621
- choices.push({
622
- name: desc ? `${paddedName} ${pc3.dim(desc)}` : s.name,
623
- value: s
624
- });
625
- }
626
- }
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
+ });
627
608
  log.blank();
628
- let rawSelection;
609
+ let selectedSkills;
629
610
  try {
630
- rawSelection = await checkbox2({
631
- message: "Select skills:",
611
+ selectedSkills = await checkbox2({
612
+ message: "Select skills to install:",
632
613
  choices,
633
- pageSize: 18,
614
+ pageSize: 15,
634
615
  theme: {
635
616
  style: {
636
- renderSelectedChoices: (selected) => {
637
- return selected.map((c) => {
638
- const val = c.value;
639
- if ("_selectAll" in val) return `all from ${val._selectAll}`;
640
- return val.name;
641
- }).join(", ");
642
- }
617
+ renderSelectedChoices: (selected) => selected.map((c) => c.value.name).join(", ")
643
618
  }
644
619
  }
645
620
  });
@@ -647,17 +622,7 @@ ${pc3.bold(pc3.cyan(project))} ${pc3.dim(`(${skills.length})`)}`));
647
622
  log.warn("Installation cancelled");
648
623
  return;
649
624
  }
650
- const selectedSkills = [];
651
- for (const item of rawSelection) {
652
- if ("_selectAll" in item) {
653
- selectedSkills.push(...groupedByProject[item._selectAll]);
654
- } else {
655
- selectedSkills.push(item);
656
- }
657
- }
658
- const uniqueSkills = [
659
- ...new Map(selectedSkills.map((s) => [`${s.project}:${s.name}`, s])).values()
660
- ];
625
+ const uniqueSkills = selectedSkills;
661
626
  if (uniqueSkills.length === 0) {
662
627
  log.warn("No skills selected");
663
628
  return;
@@ -786,16 +751,16 @@ async function infoCommand(input) {
786
751
  log.blank();
787
752
  return;
788
753
  }
789
- const project = `/${parsed.owner}/${parsed.repo}`;
754
+ const repo = `/${parsed.owner}/${parsed.repo}`;
790
755
  log.blank();
791
- const spinner = ora(`Fetching skills from ${project}...`).start();
792
- const data = await listProjectSkills(project);
756
+ const spinner = ora(`Fetching skills from ${repo}...`).start();
757
+ const data = await listProjectSkills(repo);
793
758
  if (data.error) {
794
759
  spinner.fail(pc3.red(`Error: ${data.message || data.error}`));
795
760
  return;
796
761
  }
797
762
  if (!data.skills || data.skills.length === 0) {
798
- spinner.warn(pc3.yellow(`No skills found in ${project}`));
763
+ spinner.warn(pc3.yellow(`No skills found in ${repo}`));
799
764
  return;
800
765
  }
801
766
  spinner.succeed(`Found ${data.skills.length} skill(s)`);
@@ -808,8 +773,8 @@ async function infoCommand(input) {
808
773
  }
809
774
  log.plain(
810
775
  `${pc3.bold("Quick commands:")}
811
- Install all: ${pc3.cyan(`ctx7 skills install ${project} --all`)}
812
- 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}`)}
813
778
  `
814
779
  );
815
780
  }
@@ -834,7 +799,29 @@ program.name("ctx7").description("Context7 CLI - Manage AI coding skills and doc
834
799
  if (opts.baseUrl) {
835
800
  setBaseUrl(opts.baseUrl);
836
801
  }
837
- });
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
+ );
838
825
  registerSkillCommands(program);
839
826
  registerSkillAliases(program);
840
827
  program.action(() => {
@@ -843,21 +830,12 @@ program.action(() => {
843
830
  console.log(brand.primary(banner));
844
831
  console.log(brand.dim(" The open agent skills ecosystem"));
845
832
  console.log("");
846
- console.log(" Commands:");
847
- console.log(
848
- brand.primary(" ctx7 skills install <input>") + " Install skills from a repository"
849
- );
850
- console.log(brand.primary(" ctx7 skills search <query>") + " Search for skills");
851
- console.log(brand.primary(" ctx7 skills list") + " List installed skills");
852
- console.log(brand.primary(" ctx7 skills info <repo>") + " Show skill information");
853
- console.log(brand.primary(" ctx7 skills remove <name>") + " Remove a skill");
854
- console.log("");
855
- console.log(" Examples:");
856
- console.log(brand.dim(" ctx7 skills install /anthropics/skills"));
857
- console.log(brand.dim(" ctx7 skills install /anthropics/skills pdf --cursor"));
858
- 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")}`);
859
836
  console.log("");
860
- 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`);
861
839
  console.log("");
862
840
  });
863
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 // 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"]}
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.3",
3
+ "version": "0.1.0",
4
4
  "description": "Context7 CLI - Manage AI coding skills and documentation context",
5
5
  "type": "module",
6
6
  "bin": {