ctx7 0.1.0-canary.0 → 0.1.0-canary.2

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/README.md CHANGED
@@ -1,6 +1,8 @@
1
1
  # ctx7
2
2
 
3
- CLI for the Context7 Skills Registry - manage AI coding skills across different AI coding assistants.
3
+ CLI for the [Context7 Skills Registry](https://context7.com) - install and manage AI coding skills across different AI coding assistants.
4
+
5
+ Skills are reusable prompt instructions that enhance your AI coding assistant with specialized capabilities like working with specific frameworks, libraries, or coding patterns.
4
6
 
5
7
  ## Installation
6
8
 
@@ -12,63 +14,104 @@ npx ctx7
12
14
  npm install -g ctx7
13
15
  ```
14
16
 
17
+ ## Quick Start
18
+
19
+ ```bash
20
+ # Search for skills
21
+ ctx7 skills search pdf
22
+
23
+ # Install a skill
24
+ ctx7 skills install /anthropics/skills pdf
25
+
26
+ # List installed skills
27
+ ctx7 skills list --claude
28
+ ```
29
+
15
30
  ## Usage
16
31
 
17
32
  ### Install skills
18
33
 
34
+ Install skills from a project repository to your AI coding assistant's skills directory.
35
+
19
36
  ```bash
20
- # Install all skills from a project
21
- ctx7 skills install /owner/repo
37
+ # Install all skills from a project (interactive selection)
38
+ ctx7 skills install /anthropics/skills
22
39
 
23
- # Install specific skills
24
- ctx7 skills install /owner/repo skill-name
40
+ # Install a specific skill
41
+ ctx7 skills install /anthropics/skills pdf
42
+
43
+ # Install multiple skills at once
44
+ ctx7 skills install /anthropics/skills pdf commit
25
45
 
26
46
  # Install to a specific client
27
- ctx7 skills install /owner/repo --cursor
28
- ctx7 skills install /owner/repo --claude
47
+ ctx7 skills install /anthropics/skills pdf --cursor
48
+ ctx7 skills install /anthropics/skills pdf --claude
29
49
 
30
- # Install globally (home directory)
31
- ctx7 skills install /owner/repo --global
50
+ # Install globally (home directory instead of current project)
51
+ ctx7 skills install /anthropics/skills pdf --global
32
52
  ```
33
53
 
34
54
  ### Search for skills
35
55
 
56
+ Find skills across all indexed projects in the registry.
57
+
36
58
  ```bash
37
- ctx7 skills search <query>
59
+ ctx7 skills search pdf
60
+ ctx7 skills search typescript
61
+ ctx7 skills search react testing
38
62
  ```
39
63
 
40
64
  ### List installed skills
41
65
 
66
+ View skills installed in your project or globally.
67
+
42
68
  ```bash
43
69
  ctx7 skills list
44
70
  ctx7 skills list --claude
71
+ ctx7 skills list --cursor
45
72
  ctx7 skills list --global
46
73
  ```
47
74
 
48
75
  ### Show skill information
49
76
 
77
+ Get details about available skills in a project.
78
+
50
79
  ```bash
51
- ctx7 skills info /owner/repo
80
+ ctx7 skills info /anthropics/skills
52
81
  ```
53
82
 
54
83
  ### Remove a skill
55
84
 
85
+ Uninstall a skill from your project.
86
+
56
87
  ```bash
57
- ctx7 skills remove <skill-name>
88
+ ctx7 skills remove pdf
89
+ ctx7 skills remove pdf --claude
90
+ ctx7 skills remove pdf --global
58
91
  ```
59
92
 
60
93
  ## Supported Clients
61
94
 
62
- - Claude Code (`.claude/skills/`)
63
- - Cursor (`.cursor/skills/`)
64
- - Codex (`.codex/skills/`)
65
- - OpenCode (`.opencode/skill/`)
66
- - Amp (`.agents/skills/`)
67
- - Antigravity (`.agent/skills/`)
95
+ The CLI automatically detects which AI coding assistants you have installed and offers to install skills for them:
96
+
97
+ | Client | Skills Directory |
98
+ |--------|-----------------|
99
+ | Claude Code | `.claude/skills/` |
100
+ | Cursor | `.cursor/skills/` |
101
+ | Codex | `.codex/skills/` |
102
+ | OpenCode | `.opencode/skills/` |
103
+ | Amp | `.agents/skills/` |
104
+ | Antigravity | `.agent/skills/` |
68
105
 
69
106
  ## Shortcuts
70
107
 
108
+ For faster usage, the CLI provides short aliases:
109
+
71
110
  ```bash
72
- ctx7 si /owner/repo # skills install
73
- ctx7 ss <query> # skills search
111
+ ctx7 si /anthropics/skills pdf # skills install
112
+ ctx7 ss pdf # skills search
74
113
  ```
114
+
115
+ ## Learn More
116
+
117
+ Visit [context7.com](https://context7.com) to browse the skills registry and discover available skills.
package/dist/index.js CHANGED
@@ -19,18 +19,14 @@ function parseSkillInput(input) {
19
19
  );
20
20
  if (urlMatch) {
21
21
  const [, owner, repo, branch, path] = urlMatch;
22
- const skillName = path.split("/").pop();
23
- return { type: "url", owner, repo, branch, path, skillName };
22
+ return { type: "url", owner, repo, branch, path };
24
23
  }
25
- const shortMatch = input.match(/^\/?([^\/]+)\/([^\/]+)(?:\/(.+))?$/);
24
+ const shortMatch = input.match(/^\/?([^\/]+)\/([^\/]+)$/);
26
25
  if (shortMatch) {
27
- const [, owner, repo, skillName] = shortMatch;
28
- return { type: skillName ? "skill" : "repo", owner, repo, skillName };
26
+ const [, owner, repo] = shortMatch;
27
+ return { type: "repo", owner, repo };
29
28
  }
30
- throw new Error(
31
- `Invalid input format: ${input}
32
- Expected: /owner/repo, /owner/repo/skill, or full GitHub URL`
33
- );
29
+ return null;
34
30
  }
35
31
 
36
32
  // src/utils/github.ts
@@ -188,10 +184,18 @@ var IDE_PATHS = {
188
184
  claude: ".claude/skills",
189
185
  cursor: ".cursor/skills",
190
186
  codex: ".codex/skills",
191
- opencode: ".opencode/skill",
187
+ opencode: ".opencode/skills",
192
188
  amp: ".agents/skills",
193
189
  antigravity: ".agent/skills"
194
190
  };
191
+ var IDE_GLOBAL_PATHS = {
192
+ claude: ".claude/skills",
193
+ cursor: ".cursor/skills",
194
+ codex: ".codex/skills",
195
+ opencode: ".config/opencode/skills",
196
+ amp: ".config/agents/skills",
197
+ antigravity: ".agent/skills"
198
+ };
195
199
  var IDE_NAMES = {
196
200
  claude: "Claude Code",
197
201
  cursor: "Cursor",
@@ -206,24 +210,42 @@ var DEFAULT_CONFIG = {
206
210
  };
207
211
 
208
212
  // src/utils/ide.ts
209
- function getSelectedIde(options) {
210
- if (options.claude) return "claude";
211
- if (options.cursor) return "cursor";
212
- if (options.codex) return "codex";
213
- if (options.opencode) return "opencode";
214
- if (options.amp) return "amp";
215
- if (options.antigravity) return "antigravity";
216
- return null;
213
+ import { dirname } from "path";
214
+ function getSelectedIdes(options) {
215
+ const ides = [];
216
+ if (options.claude) ides.push("claude");
217
+ if (options.cursor) ides.push("cursor");
218
+ if (options.codex) ides.push("codex");
219
+ if (options.opencode) ides.push("opencode");
220
+ if (options.amp) ides.push("amp");
221
+ if (options.antigravity) ides.push("antigravity");
222
+ return ides;
217
223
  }
218
224
  function hasExplicitIdeOption(options) {
219
225
  return !!(options.claude || options.cursor || options.codex || options.opencode || options.amp || options.antigravity);
220
226
  }
221
- async function detectInstalledIdes() {
227
+ async function detectInstalledIdes(preferredScope) {
222
228
  const allIdes = Object.keys(IDE_PATHS);
229
+ if (preferredScope === "global") {
230
+ const globalIdes = [];
231
+ for (const ide of allIdes) {
232
+ const detectionPath = dirname(IDE_GLOBAL_PATHS[ide]);
233
+ const globalParent = join(homedir(), detectionPath);
234
+ try {
235
+ await access(globalParent);
236
+ globalIdes.push(ide);
237
+ } catch {
238
+ }
239
+ }
240
+ if (globalIdes.length > 0) {
241
+ return { ides: globalIdes, scope: "global" };
242
+ }
243
+ return null;
244
+ }
223
245
  const projectIdes = [];
224
246
  for (const ide of allIdes) {
225
- const idePath = IDE_PATHS[ide];
226
- const projectParent = join(process.cwd(), idePath.split("/")[0]);
247
+ const detectionPath = dirname(IDE_PATHS[ide]);
248
+ const projectParent = join(process.cwd(), detectionPath);
227
249
  try {
228
250
  await access(projectParent);
229
251
  projectIdes.push(ide);
@@ -233,35 +255,26 @@ async function detectInstalledIdes() {
233
255
  if (projectIdes.length > 0) {
234
256
  return { ides: projectIdes, scope: "project" };
235
257
  }
236
- const globalIdes = [];
237
- for (const ide of allIdes) {
238
- const idePath = IDE_PATHS[ide];
239
- const globalParent = join(homedir(), idePath.split("/")[0]);
240
- try {
241
- await access(globalParent);
242
- globalIdes.push(ide);
243
- } catch {
244
- }
245
- }
246
- if (globalIdes.length > 0) {
247
- return { ides: globalIdes, scope: "global" };
248
- }
249
258
  return null;
250
259
  }
251
260
  async function promptForInstallTargets(options) {
252
261
  if (hasExplicitIdeOption(options)) {
253
- const ide = getSelectedIde(options);
262
+ const ides = getSelectedIdes(options);
254
263
  const scope = options.global ? "global" : "project";
255
264
  return {
256
- ides: [ide || DEFAULT_CONFIG.defaultIde],
265
+ ides: ides.length > 0 ? ides : [DEFAULT_CONFIG.defaultIde],
257
266
  scopes: [scope]
258
267
  };
259
268
  }
260
- const detected = await detectInstalledIdes();
269
+ const preferredScope = options.global ? "global" : void 0;
270
+ const detected = await detectInstalledIdes(preferredScope);
261
271
  if (detected) {
262
- const scope = options.global ? "global" : "project";
272
+ const scope = options.global ? "global" : detected.scope;
263
273
  return { ides: detected.ides, scopes: [scope] };
264
274
  }
275
+ if (!options.global) {
276
+ return { ides: [DEFAULT_CONFIG.defaultIde], scopes: ["project"] };
277
+ }
265
278
  log.blank();
266
279
  const ideChoices = Object.keys(IDE_NAMES).map((ide) => ({
267
280
  name: `${IDE_NAMES[ide]} ${pc2.dim(`(${IDE_PATHS[ide]})`)}`,
@@ -287,7 +300,8 @@ async function promptForInstallTargets(options) {
287
300
  }
288
301
  async function promptForSingleTarget(options) {
289
302
  if (hasExplicitIdeOption(options)) {
290
- const ide = getSelectedIde(options) || DEFAULT_CONFIG.defaultIde;
303
+ const ides = getSelectedIdes(options);
304
+ const ide = ides[0] || DEFAULT_CONFIG.defaultIde;
291
305
  const scope = options.global ? "global" : "project";
292
306
  return { ide, scope };
293
307
  }
@@ -334,23 +348,21 @@ async function promptForSingleTarget(options) {
334
348
  function getTargetDirs(targets) {
335
349
  const dirs = [];
336
350
  for (const ide of targets.ides) {
337
- const idePath = IDE_PATHS[ide];
338
351
  for (const scope of targets.scopes) {
339
352
  if (scope === "global") {
340
- dirs.push(join(homedir(), idePath));
353
+ dirs.push(join(homedir(), IDE_GLOBAL_PATHS[ide]));
341
354
  } else {
342
- dirs.push(join(process.cwd(), idePath));
355
+ dirs.push(join(process.cwd(), IDE_PATHS[ide]));
343
356
  }
344
357
  }
345
358
  }
346
359
  return dirs;
347
360
  }
348
361
  function getTargetDirFromSelection(ide, scope) {
349
- const idePath = IDE_PATHS[ide];
350
362
  if (scope === "global") {
351
- return join(homedir(), idePath);
363
+ return join(homedir(), IDE_GLOBAL_PATHS[ide]);
352
364
  }
353
- return join(process.cwd(), idePath);
365
+ return join(process.cwd(), IDE_PATHS[ide]);
354
366
  }
355
367
 
356
368
  // src/utils/installer.ts
@@ -379,18 +391,32 @@ async function symlinkSkill(skillName, sourcePath, targetDir) {
379
391
  }
380
392
 
381
393
  // src/commands/skill.ts
394
+ function logInstallSummary(targets, targetDirs, skillNames) {
395
+ log.blank();
396
+ let dirIndex = 0;
397
+ for (const ide of targets.ides) {
398
+ for (let i = 0; i < targets.scopes.length; i++) {
399
+ const dir = targetDirs[dirIndex++];
400
+ log.dim(`${IDE_NAMES[ide]}: ${dir}`);
401
+ for (const name of skillNames) {
402
+ log.itemAdd(name);
403
+ }
404
+ }
405
+ }
406
+ log.blank();
407
+ }
382
408
  function registerSkillCommands(program2) {
383
409
  const skill = program2.command("skills").alias("skill").description("Manage AI coding skills");
384
- 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/skill/").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) => {
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) => {
385
411
  await installCommand(project, skillNames, options);
386
412
  });
387
413
  skill.command("search").alias("s").argument("<query>", "Search query").description("Search for skills across all indexed projects").action(async (query) => {
388
414
  await searchCommand(query);
389
415
  });
390
- 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/skill/").option("--amp", "List from .agents/skills/").option("--antigravity", "List from .agent/skills/").option("--global", "List global skills").description("List installed skills").action(async (options) => {
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) => {
391
417
  await listCommand(options);
392
418
  });
393
- 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/skill/").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) => {
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) => {
394
420
  await removeCommand(name, options);
395
421
  });
396
422
  skill.command("info").argument("<project>", "Project to show info for (/owner/repo)").description("Show information about skills in a project").action(async (project) => {
@@ -398,7 +424,7 @@ function registerSkillCommands(program2) {
398
424
  });
399
425
  }
400
426
  function registerSkillAliases(program2) {
401
- 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/skill/").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) => {
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) => {
402
428
  await installCommand(project, skillNames, options);
403
429
  });
404
430
  program2.command("ss", { hidden: true }).argument("<query>", "Search query").description("Search for skills (alias for: skills search)").action(async (query) => {
@@ -407,6 +433,13 @@ function registerSkillAliases(program2) {
407
433
  }
408
434
  async function installCommand(input, skillNames, options) {
409
435
  const parsed = parseSkillInput(input);
436
+ if (!parsed) {
437
+ log.error(`Invalid input format: ${input}`);
438
+ log.info(`Expected: /owner/repo or full GitHub URL`);
439
+ log.info(`To install specific skills, use: ctx7 skills install /owner/repo skill1 skill2`);
440
+ log.blank();
441
+ return;
442
+ }
410
443
  const project = `/${parsed.owner}/${parsed.repo}`;
411
444
  log.blank();
412
445
  const spinner = ora(`Fetching skills from ${project}...`).start();
@@ -443,19 +476,23 @@ async function installCommand(input, skillNames, options) {
443
476
  const maxNameLen = Math.min(25, Math.max(...data.skills.map((s) => s.name.length)));
444
477
  const choices = skillsWithProject.map((s) => {
445
478
  const paddedName = s.name.padEnd(maxNameLen);
446
- const desc = s.description?.trim() ? s.description.slice(0, 60) + (s.description.length > 60 ? "..." : "") : "No description";
479
+ const desc = s.description?.trim() ? s.description.slice(0, 60) + (s.description.length > 60 ? "..." : "") : "";
447
480
  return {
448
- name: `${paddedName} ${pc3.dim(desc)}`,
449
- value: s,
450
- short: s.name
481
+ name: desc ? `${paddedName} ${pc3.dim(desc)}` : s.name,
482
+ value: s
451
483
  };
452
484
  });
453
485
  log.blank();
454
486
  try {
455
487
  selectedSkills = await checkbox2({
456
- message: "Select skills to install (space to select, enter to confirm):",
488
+ message: "Select skills:",
457
489
  choices,
458
- pageSize: 15
490
+ pageSize: 15,
491
+ theme: {
492
+ style: {
493
+ renderSelectedChoices: (selected) => selected.map((c) => c.value.name).join(", ")
494
+ }
495
+ }
459
496
  });
460
497
  } catch {
461
498
  log.warn("Installation cancelled");
@@ -485,18 +522,18 @@ async function installCommand(input, skillNames, options) {
485
522
  continue;
486
523
  }
487
524
  installSpinner.text = `Installing ${skill.name}...`;
488
- const [primaryDir2, ...symlinkDirs] = targetDirs;
525
+ const [primaryDir, ...symlinkDirs] = targetDirs;
489
526
  try {
490
- await installSkillFiles(skill.name, downloadData.files, primaryDir2);
527
+ await installSkillFiles(skill.name, downloadData.files, primaryDir);
491
528
  } catch (dirErr) {
492
529
  const error = dirErr;
493
530
  if (error.code === "EACCES" || error.code === "EPERM") {
494
531
  permissionError = true;
495
- failedDirs.add(primaryDir2);
532
+ failedDirs.add(primaryDir);
496
533
  }
497
534
  throw dirErr;
498
535
  }
499
- const primarySkillDir = join3(primaryDir2, skill.name);
536
+ const primarySkillDir = join3(primaryDir, skill.name);
500
537
  for (const targetDir of symlinkDirs) {
501
538
  try {
502
539
  await symlinkSkill(skill.name, primarySkillDir, targetDir);
@@ -531,20 +568,8 @@ async function installCommand(input, skillNames, options) {
531
568
  return;
532
569
  }
533
570
  installSpinner.succeed(`Installed ${installedCount} skill(s)`);
534
- const [primaryDir, ...symlinkedDirs] = targetDirs;
535
571
  const installedNames = selectedSkills.map((s) => s.name);
536
- log.blank();
537
- log.dim(primaryDir);
538
- for (const name of installedNames) {
539
- log.itemAdd(name);
540
- }
541
- for (const dir of symlinkedDirs) {
542
- log.dim(dir);
543
- for (const name of installedNames) {
544
- log.itemAdd(name);
545
- }
546
- }
547
- log.blank();
572
+ logInstallSummary(targets, targetDirs, installedNames);
548
573
  }
549
574
  async function searchCommand(query) {
550
575
  log.blank();
@@ -580,18 +605,16 @@ async function searchCommand(query) {
580
605
  choices.push(new Separator(`
581
606
  ${pc3.bold(pc3.cyan(project))} ${pc3.dim(`(${skills.length})`)}`));
582
607
  if (skills.length > 1) {
583
- const skillNames = skills.map((s) => s.name).join(", ");
584
608
  choices.push({
585
609
  name: pc3.italic(` \u21B3 Select all ${skills.length} skills from this repo`),
586
- value: { _selectAll: project },
587
- short: skillNames
610
+ value: { _selectAll: project }
588
611
  });
589
612
  }
590
613
  for (const s of skills) {
591
614
  const paddedName = s.name.padEnd(maxNameLen);
592
- const desc = s.description?.trim() ? s.description.slice(0, 60) + (s.description.length > 60 ? "..." : "") : "No description";
615
+ const desc = s.description?.trim() ? s.description.slice(0, 60) + (s.description.length > 60 ? "..." : "") : "";
593
616
  choices.push({
594
- name: `${paddedName} ${pc3.dim(desc)}`,
617
+ name: desc ? `${paddedName} ${pc3.dim(desc)}` : s.name,
595
618
  value: s
596
619
  });
597
620
  }
@@ -600,9 +623,20 @@ ${pc3.bold(pc3.cyan(project))} ${pc3.dim(`(${skills.length})`)}`));
600
623
  let rawSelection;
601
624
  try {
602
625
  rawSelection = await checkbox2({
603
- message: "Select skills to install (space to select, enter to confirm):",
626
+ message: "Select skills:",
604
627
  choices,
605
- pageSize: 18
628
+ pageSize: 18,
629
+ theme: {
630
+ 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
+ }
638
+ }
639
+ }
606
640
  });
607
641
  } catch {
608
642
  log.warn("Installation cancelled");
@@ -642,18 +676,18 @@ ${pc3.bold(pc3.cyan(project))} ${pc3.dim(`(${skills.length})`)}`));
642
676
  continue;
643
677
  }
644
678
  installSpinner.text = `Installing ${skill.name}...`;
645
- const [primaryDir2, ...symlinkDirs] = targetDirs;
679
+ const [primaryDir, ...symlinkDirs] = targetDirs;
646
680
  try {
647
- await installSkillFiles(skill.name, downloadData.files, primaryDir2);
681
+ await installSkillFiles(skill.name, downloadData.files, primaryDir);
648
682
  } catch (dirErr) {
649
683
  const error = dirErr;
650
684
  if (error.code === "EACCES" || error.code === "EPERM") {
651
685
  permissionError = true;
652
- failedDirs.add(primaryDir2);
686
+ failedDirs.add(primaryDir);
653
687
  }
654
688
  throw dirErr;
655
689
  }
656
- const primarySkillDir = join3(primaryDir2, skill.name);
690
+ const primarySkillDir = join3(primaryDir, skill.name);
657
691
  for (const targetDir of symlinkDirs) {
658
692
  try {
659
693
  await symlinkSkill(skill.name, primarySkillDir, targetDir);
@@ -688,20 +722,8 @@ ${pc3.bold(pc3.cyan(project))} ${pc3.dim(`(${skills.length})`)}`));
688
722
  return;
689
723
  }
690
724
  installSpinner.succeed(`Installed ${installedCount} skill(s)`);
691
- const [primaryDir, ...symlinkedDirs] = targetDirs;
692
725
  const installedNames = uniqueSkills.map((s) => s.name);
693
- log.blank();
694
- log.dim(primaryDir);
695
- for (const name of installedNames) {
696
- log.itemAdd(name);
697
- }
698
- for (const dir of symlinkedDirs) {
699
- log.dim(dir);
700
- for (const name of installedNames) {
701
- log.itemAdd(name);
702
- }
703
- }
704
- log.blank();
726
+ logInstallSummary(targets, targetDirs, installedNames);
705
727
  }
706
728
  async function listCommand(options) {
707
729
  const target = await promptForSingleTarget(options);
@@ -712,7 +734,7 @@ async function listCommand(options) {
712
734
  const skillsDir = getTargetDirFromSelection(target.ide, target.scope);
713
735
  try {
714
736
  const entries = await readdir(skillsDir, { withFileTypes: true });
715
- const skillFolders = entries.filter((e) => e.isDirectory());
737
+ const skillFolders = entries.filter((e) => e.isDirectory() || e.isSymbolicLink());
716
738
  if (skillFolders.length === 0) {
717
739
  log.warn(`No skills installed in ${skillsDir}`);
718
740
  return;
@@ -752,6 +774,13 @@ async function removeCommand(name, options) {
752
774
  }
753
775
  async function infoCommand(input) {
754
776
  const parsed = parseSkillInput(input);
777
+ if (!parsed) {
778
+ log.blank();
779
+ log.error(`Invalid input format: ${input}`);
780
+ log.info(`Expected: /owner/repo or full GitHub URL`);
781
+ log.blank();
782
+ return;
783
+ }
755
784
  const project = `/${parsed.owner}/${parsed.repo}`;
756
785
  log.blank();
757
786
  const spinner = ora(`Fetching skills from ${project}...`).start();
@@ -783,8 +812,8 @@ async function infoCommand(input) {
783
812
  // src/constants.ts
784
813
  import { readFileSync } from "fs";
785
814
  import { fileURLToPath } from "url";
786
- import { dirname, join as join4 } from "path";
787
- var __dirname = dirname(fileURLToPath(import.meta.url));
815
+ import { dirname as dirname2, join as join4 } from "path";
816
+ var __dirname = dirname2(fileURLToPath(import.meta.url));
788
817
  var pkg = JSON.parse(readFileSync(join4(__dirname, "../package.json"), "utf-8"));
789
818
  var VERSION = pkg.version;
790
819
  var NAME = pkg.name;
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 { Skill, SkillSearchResult, AddOptions, ListOptions, RemoveOptions } from \"../types.js\";\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/skill/\")\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/skill/\")\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/skill/\")\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/skill/\")\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 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 : \"No description\";\n\n return {\n name: `${paddedName} ${pc.dim(desc)}`,\n value: s,\n short: s.name,\n };\n });\n\n log.blank();\n\n try {\n selectedSkills = await checkbox({\n message: \"Select skills to install (space to select, enter to confirm):\",\n choices,\n pageSize: 15,\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 [primaryDir, ...symlinkedDirs] = targetDirs;\n const installedNames = selectedSkills.map((s) => s.name);\n\n log.blank();\n log.dim(primaryDir);\n for (const name of installedNames) {\n log.itemAdd(name);\n }\n\n for (const dir of symlinkedDirs) {\n log.dim(dir);\n for (const name of installedNames) {\n log.itemAdd(name);\n }\n }\n\n log.blank();\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; short?: string } | 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 const skillNames = skills.map((s) => s.name).join(\", \");\n choices.push({\n name: pc.italic(` ↳ Select all ${skills.length} skills from this repo`),\n value: { _selectAll: project },\n short: skillNames,\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 : \"No description\";\n\n choices.push({\n name: `${paddedName} ${pc.dim(desc)}`,\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 to install (space to select, enter to confirm):\",\n choices,\n pageSize: 18,\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 [primaryDir, ...symlinkedDirs] = targetDirs;\n const installedNames = uniqueSkills.map((s) => s.name);\n\n log.blank();\n log.dim(primaryDir);\n for (const name of installedNames) {\n log.itemAdd(name);\n }\n\n for (const dir of symlinkedDirs) {\n log.dim(dir);\n for (const name of installedNames) {\n log.itemAdd(name);\n }\n }\n\n log.blank();\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());\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 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\" | \"skill\" | \"url\";\n owner: string;\n repo: string;\n skillName?: string;\n branch?: string;\n path?: string;\n}\n\nexport function parseSkillInput(input: string): ParsedSkillInput {\n const urlMatch = input.match(\n /(?:https?:\\/\\/)?github\\.com\\/([^\\/]+)\\/([^\\/]+)\\/tree\\/([^\\/]+)\\/(.+)/\n );\n if (urlMatch) {\n const [, owner, repo, branch, path] = urlMatch;\n const skillName = path.split(\"/\").pop();\n return { type: \"url\", owner, repo, branch, path, skillName };\n }\n\n const shortMatch = input.match(/^\\/?([^\\/]+)\\/([^\\/]+)(?:\\/(.+))?$/);\n if (shortMatch) {\n const [, owner, repo, skillName] = shortMatch;\n return { type: skillName ? \"skill\" : \"repo\", owner, repo, skillName };\n }\n\n throw new Error(\n `Invalid input format: ${input}\\n` +\n `Expected: /owner/repo, /owner/repo/skill, or full GitHub URL`\n );\n}\n\nexport function buildSkillId(owner: string, repo: string, skillName: string): string {\n return `/${owner}/${repo}/${skillName}`;\n}\n\nexport function buildRepoId(owner: string, repo: string): string {\n return `/${owner}/${repo}`;\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_NAMES, DEFAULT_CONFIG } from \"../types.js\";\n\nexport function getSelectedIde(options: IDEOptions): IDE | null {\n if (options.claude) return \"claude\";\n if (options.cursor) return \"cursor\";\n if (options.codex) return \"codex\";\n if (options.opencode) return \"opencode\";\n if (options.amp) return \"amp\";\n if (options.antigravity) return \"antigravity\";\n return null;\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(): Promise<DetectedIdes | null> {\n const allIdes = Object.keys(IDE_PATHS) as IDE[];\n\n const projectIdes: IDE[] = [];\n for (const ide of allIdes) {\n const idePath = IDE_PATHS[ide];\n const projectParent = join(process.cwd(), idePath.split(\"/\")[0]);\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 const globalIdes: IDE[] = [];\n for (const ide of allIdes) {\n const idePath = IDE_PATHS[ide];\n const globalParent = join(homedir(), idePath.split(\"/\")[0]);\n try {\n await access(globalParent);\n globalIdes.push(ide);\n } catch {}\n }\n\n if (globalIdes.length > 0) {\n return { ides: globalIdes, scope: \"global\" };\n }\n\n return null;\n}\n\nexport async function promptForInstallTargets(options: AddOptions): Promise<InstallTargets | null> {\n if (hasExplicitIdeOption(options)) {\n const ide = getSelectedIde(options);\n const scope: Scope = options.global ? \"global\" : \"project\";\n return {\n ides: [ide || DEFAULT_CONFIG.defaultIde],\n scopes: [scope],\n };\n }\n\n const detected = await detectInstalledIdes();\n\n if (detected) {\n const scope: Scope = options.global ? \"global\" : \"project\";\n return { ides: detected.ides, scopes: [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 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 ide = getSelectedIde(options) || 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 const idePath = IDE_PATHS[ide];\n for (const scope of targets.scopes) {\n if (scope === \"global\") {\n dirs.push(join(homedir(), idePath));\n } else {\n dirs.push(join(process.cwd(), idePath));\n }\n }\n }\n return dirs;\n}\n\nexport function getTargetDirFromSelection(ide: IDE, scope: Scope): string {\n const idePath = IDE_PATHS[ide];\n if (scope === \"global\") {\n return join(homedir(), idePath);\n }\n return join(process.cwd(), idePath);\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/skill\",\n amp: \".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","primaryDir","join","rm","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\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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ctx7",
3
- "version": "0.1.0-canary.0",
3
+ "version": "0.1.0-canary.2",
4
4
  "description": "Context7 CLI - Manage AI coding skills and documentation context",
5
5
  "type": "module",
6
6
  "bin": {
@@ -9,6 +9,16 @@
9
9
  "files": [
10
10
  "dist"
11
11
  ],
12
+ "scripts": {
13
+ "build": "tsup",
14
+ "dev": "tsup --watch",
15
+ "typecheck": "tsc --noEmit",
16
+ "lint": "eslint src --fix",
17
+ "lint:check": "eslint src",
18
+ "format": "prettier --write src",
19
+ "format:check": "prettier --check src",
20
+ "clean": "rm -rf dist node_modules"
21
+ },
12
22
  "dependencies": {
13
23
  "@inquirer/prompts": "^8.2.0",
14
24
  "commander": "^13.1.0",
@@ -49,15 +59,5 @@
49
59
  "homepage": "https://context7.com",
50
60
  "engines": {
51
61
  "node": ">=18"
52
- },
53
- "scripts": {
54
- "build": "tsup",
55
- "dev": "tsup --watch",
56
- "typecheck": "tsc --noEmit",
57
- "lint": "eslint src --fix",
58
- "lint:check": "eslint src",
59
- "format": "prettier --write src",
60
- "format:check": "prettier --check src",
61
- "clean": "rm -rf dist node_modules"
62
62
  }
63
- }
63
+ }
package/LICENSE DELETED
@@ -1,21 +0,0 @@
1
- The MIT License (MIT)
2
-
3
- Copyright (c) 2021 Upstash, Inc.
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.