vercel-labs/skills

The open agent skills tool - npx skills

TypeScript★ 34,675+190 that day#4 on trending

Analyzed October 14, 2026 at 13e4063 (main) with jscpd v5 in 1.1s. Code duplication went from 5.7% on Sep 11 to 4.16% on Oct 14.

C61.7/100
Project health33,264 lines of code (M)
Duplication59
6.7% in typescript, bash, perl
Dead code93
0.6%
Complexity43
62.5%

The score is jscpd's own --health model: markup, data and text left out, tests kept. The numbers below are the trending scan's.

4.16%duplicated code · 722 of 17,342 lines
49clones in code
50code files of 144 scanned
6.54%duplicated over all files · 170 clones

The code number leaves out tests, fixtures, docs, examples, data files, styles, translations and vendored code.

Largest clones in the code

  • 52 lines in 2 placestypescript257 tokens
    668  skill: RemoteSkill,
    669  agentType: AgentType,
    670  options: { global?: boolean; cwd?: string; mode?: InstallMode; eveSubagent?: string } = {}
    671): Promise<InstallResult> {
    672  const agent = agents[agentType];
    673  const isGlobal = options.global ?? false;
    674  const cwd = options.cwd || process.cwd();
    675  const installMode = options.mode ?? 'symlink';
    676  const eveSubagent = options.eveSubagent;
    677
    

    First 10 of 52 lines.

  • 31 lines in 2 placestypescript188 tokens
    1090}
    1091
    1092const title = pc.green(`Installed ${skillCount} skill${skillCount !== 1 ? 's' : ''}`);
    1093p.note(resultLines.join('\n'), title);
    1094
    1095// Show symlink failure warning (only for symlink mode)
    1096if (symlinkFailures.length > 0) {
    1097  p.log.warn(pc.yellow(`Symlinks failed for: ${formatList(copiedAgents)}`));
    1098  p.log.message(
    1099    pc.dim(
    

    First 10 of 31 lines.

  • 23 lines in 2 placestypescript179 tokens
    762const validAgents = Object.keys(agents);
    763
    764if (options.agent?.includes('*')) {
    765  // --agent '*' selects all agents
    766  targetAgents = validAgents as AgentType[];
    767  p.log.info(`Installing to all ${targetAgents.length} agents`);
    768} else if (options.agent && options.agent.length > 0) {
    769  const invalidAgents = options.agent.filter((a) => !validAgents.includes(a));
    770
    771  if (invalidAgents.length > 0) {
    
    641const universalAgents = getUniversalAgents();
    642
    643if (options.agent?.includes('*')) {
    644  targetAgents = validAgents as AgentType[];
    645  p.log.info(`Installing to all ${targetAgents.length} agents`);
    646} else if (options.agent && options.agent.length > 0) {
    647  const invalidAgents = options.agent.filter((a) => !validAgents.includes(a));
    648  if (invalidAgents.length > 0) {
    649    p.log.error(`Invalid agents: ${invalidAgents.join(', ')}`);
    650    p.log.info(`Valid agents: ${validAgents.join(', ')}`);
    

    First 10 of 23 lines, the second copy on the right.

7 more
Largest clones over all files, tests and data included
  • 90 lines in 2 placestypescripttests467 tokens
    1import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
    2import { mkdtemp, mkdir, writeFile, rm, readFile } from 'node:fs/promises';
    3import { join } from 'node:path';
    4import { tmpdir } from 'node:os';
    5
    6// Isolate side-effecting UI / network deps so runAdd can run headless in CI.
    7vi.mock('@clack/prompts', () => {
    8  const noop = () => {};
    9  return {
    10    intro: noop,
    

    First 10 of 90 lines.

  • 60 lines in 2 placestypescripttests305 tokens
    7import { gzipSync } from 'node:zlib';
    8
    9vi.mock('@clack/prompts', () => {
    10  const noop = () => {};
    11  return {
    12    intro: noop,
    13    outro: noop,
    14    note: noop,
    15    confirm: vi.fn().mockResolvedValue(true),
    16    cancel: noop,
    

    First 10 of 60 lines.

  • 11 lines in 2 placestxtdocs and examples274 tokens
    19MIT License Copyright (c) 2025-Present [Bombshell contributors](https://bomb.sh/team)
    20
    21Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in t…
    22
    23The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
    24
    25THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR…
    26
    27
    28================================================================================
    

    First 10 of 11 lines.

  • 9 lines in 2 placestxtdocs and examples273 tokens
  • 52 lines in 2 placestypescript257 tokens
By format, code only
FormatFilesLinesClonesDuplicated linesDuplication
typescript4016,480497224.38%
bash9694000%
perl1168000%
By format, all files
FormatFilesLinesClonesDuplicated linesDuplication
typescript11132,4021652,2446.93%
txt111733429.06%
yaml94462296.5%
markdown71,087000%
bash11820000%
json2183000%
perl1168000%
text258000%

Trending appearances

DayRankStarsFilesLinesClonesAll filesCodeHealthCommit
Oct 14, 2026#434,675 (+190)14435,2811706.54%4.16%C 61.713e4063
Sep 11, 2026#1231,253 (+122)12730,6601567.13%5.7%—80feb48

Want this for your own project? Install jscpd and run jscpd ., or measure it the way the baselines were measured.