Community Migration
jingjing2222/react-native-nitro-geolocation
Migrate React Native apps from @react-native-community/geolocation to react-native-nitro-geolocation.
Compares two folders function by function with jscpd --compare, across languages if needed, and explains which functions match and which have no counterpart.
$ npx skills add kucherenko/jscpd --skill compare-codebases -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install kucherenko/jscpd compare-codebases --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/kucherenko/jscpd.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/compare-codebases .claude/skills/compare-codebases && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "compare-codebases" agent skill from https://github.com/kucherenko/jscpd/tree/master/skills/compare-codebases into .claude/skills/compare-codebases/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "compare-codebases", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/kucherenko/jscpd/tree/master/skills/compare-codebasesType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add kucherenko/jscpd --skill compare-codebases -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install kucherenko/jscpd compare-codebases --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/kucherenko/jscpd.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/compare-codebases .agents/skills/compare-codebases && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "compare-codebases" agent skill from https://github.com/kucherenko/jscpd/tree/master/skills/compare-codebases into .agents/skills/compare-codebases/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "compare-codebases", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add kucherenko/jscpd --skill compare-codebases -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install kucherenko/jscpd compare-codebases --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/kucherenko/jscpd.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/compare-codebases .cursor/skills/compare-codebases && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "compare-codebases" agent skill from https://github.com/kucherenko/jscpd/tree/master/skills/compare-codebases into .cursor/skills/compare-codebases/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "compare-codebases", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/kucherenko/jscpd.git --path skills/compare-codebases--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add kucherenko/jscpd --skill compare-codebases -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install kucherenko/jscpd compare-codebases --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/kucherenko/jscpd.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/compare-codebases .gemini/skills/compare-codebases && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "compare-codebases" agent skill from https://github.com/kucherenko/jscpd/tree/master/skills/compare-codebases into .gemini/skills/compare-codebases/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "compare-codebases", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install kucherenko/jscpd compare-codebasesInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add kucherenko/jscpd --skill compare-codebases -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/kucherenko/jscpd.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/compare-codebases .github/skills/compare-codebases && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "compare-codebases" agent skill from https://github.com/kucherenko/jscpd/tree/master/skills/compare-codebases into .github/skills/compare-codebases/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "compare-codebases", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add kucherenko/jscpd --skill compare-codebases -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install kucherenko/jscpd compare-codebases --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/kucherenko/jscpd.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/compare-codebases .opencode/skills/compare-codebases && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "compare-codebases" agent skill from https://github.com/kucherenko/jscpd/tree/master/skills/compare-codebases into .opencode/skills/compare-codebases/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "compare-codebases", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
compare-codebasesCompares two folders function by function with jscpd --compare, across languages if needed, and explains which functions match and which have no counterpart.
jscpd --compare pairs each function in one folder with the function in the other that does the same job, and lists the functions on either side that have no match. The folders can use one language or two, for example Python and TypeScript or Kotlin and Swift. Functions are turned into vectors by a code embedding model that runs inside jscpd, so matching works even when names and structure differ.
Pairing needs each function to be the other's closest match and to clear a similarity threshold that is stricter within one language than across two; a feature written twice on one side can yield two pairs. Very short functions are left out of this step, governed by min-tokens and min-lines settings. The skill explains how the comparison works and how to run it well, and points porting work to a code-migration skill and the wider tool to a jscpd skill.
6 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 324bb57. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
npxFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use npx, which can reach the network depending on how they are called.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Codebase Comparison with jscpd loads about 3.2k tokens when it runs. Until then it costs about 100 tokens; SKILL.md has 1,796 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from kucherenko/jscpd at commit 324bb57, republished under its MIT licence (© kucherenko). 1,796 words, ~3,202 tokens.
.claude/skills/compare-codebases/SKILL.md (or your agent's skills folder).jscpd --compare A B pairs every function of folder A with the function of folder B that does the same job, and lists the functions of each folder that have no counterpart. The two folders may be in one language or in two (Python and TypeScript, Kotlin and Swift, Java and Rust). This skill explains how the comparison works and how to run one well. For porting code with the comparison as the progress measure, use the code-migration skill; for the rest of jscpd, the jscpd skill.
jscpd finds the functions of JavaScript, TypeScript, JSX, TSX, Vue, Svelte, Astro, Python, Rust, Go, Java, Kotlin, C#, C, C++, PHP, Ruby, Scala and Swift files in both folders. It turns the code of each function into a vector with a code embedding model that runs inside jscpd (CodeRankEmbed by default), so two functions that do the same job point the same way even when their languages, names and structure differ. Functions of one folder are never compared with each other.
Functions pair in two steps:
--min-tokens (30 with --compare) or --min-lines (5) stay out of this step, because a short function resembles too many others.encodeBinary, encode_binary, _encode_binary; the test title rounds cents and rounds_cents), when their similarity reaches the medium level (0.5625 across languages with CodeRankEmbed). A name pair skips the closest-match and stand-out checks of the first step, so it needs more than that step's threshold; otherwise every load and init of two codebases would pair. Size does not matter here, so a short port is found. A name pair has to stay within modules the first step linked. A module is the folder right under the deepest folder all files of a side share (notification in android/notification/…), and a file that sits higher than the rest, such as a build script, does not move that folder up. Two modules link when one holds the most of the other's pairs, counted for code and for tests separately. So checkPermissions of one plugin does not pair with its namesake in another.Each pair gets a level on the scale of the model, because a cosine that is high for one model is low for another:
| Level | With CodeRankEmbed, across languages | Meaning |
|---|---|---|
high | 0.7125 and up | almost always the same function |
medium | 0.5625 to 0.7125 | usually the same function, restructured |
low | 0.4125 to 0.5625 | read both: related code pairs here too |
jscpd measures tests and code apart, in two blocks of the report, and pairs a test only with a test. It tells a test by the conventions of its language:
*_test.go, test_*.py, *.test.ts, *.spec.js, *Tests.swift or *_spec.rb;tests/, __tests__/, spec/, src/test/ (where Java, Kotlin and Scala keep their tests) or MyAppTests/, the compared folder's own name included;#[cfg(test)] module or under #[test];it('rounds cents', () => …).When neither side has a test that counts (see below), the report has one block and no headings.
Totals count the functions of at least --min-tokens tokens and --min-lines lines; smaller ones appear only as partners. Declarations without a body (TypeScript overloads, the functions of a .d.ts file, interface and abstract methods) take no part. Anonymous functions (callbacks, closures) take no part either, except JavaScript and TypeScript test cases. A test case such as it('rounds cents', () => …) goes by its title, and so do those written with test, specify, fit, xit, xtest or bench, with .only, .skip or .each(table) after them. Suites and hooks stay anonymous. jscpd does not compare types, constants, SQL or UI markup.
app/src/main/java and ios/Sources, not the two repository roots. Build output, vendored code, installed packages and generated files dilute the result, and a vendored dependency tree can turn a run of seconds into one of tens of minutes, since every function in it is embedded. Inside a git repository jscpd skips what .gitignore excludes; outside one, or for folders the .gitignore misses, pass them with --ignore (--ignore "**/vendor/**,**/target/**,**/node_modules/**"). When a side has no .gitignore entries for such folders, suggest them to the user.app/ and app/android/ is refused.ios/<module> and android/<module>). Modules steer the name step, so matching folder names help.--ignore "**/__tests__/**,**/*.test.*,**/test/**". When they ask about the tests alone, pass the two test folders as the paths, or pick the test files with --pattern.The first run needs the model (548 MB). Ask the user before downloading it:
npx jscpd --semantic-downloadjscpd caches the vectors per pair of folders, so later runs embed only the functions whose code changed.
npx jscpd --compare billing-py/ billing-ts/ 71% 5 of 7 functions in billing-py/ have a counterpart in billing-ts/
80% 4 of 5 functions in billing-ts/ have a counterpart in billing-py/
billing-py/
file paired similarity counterpart
billing.py 4 / 5 0.89 billing.ts
shipping.py 1 / 2 0.91 shipping.ts
billing-ts/
file paired similarity counterpart
billing.ts 3 / 4 0.89 billing.py
shipping.ts 1 / 1 0.91 shipping.py
Paired under other names (1):
billing-py/ billing-ts/ similarity
billing.py:28 tax_for_region billing.ts:27 salesTax 0.87 high
Only in billing-py/ (2):
billing.py (1)
46 due_date 6 lines
shipping.py (1)
18 estimate_delivery_days 8 lines
Only in billing-ts/ (1):
billing.ts (1)
39 toCurrency 8 linesCode block and a Tests block, each with everything below. The two top lines of a block give the share of each folder's functions (or tests) that have a counterpart in the other.low pairs, as in 0.62, 1 low), and the file on the other side that holds most of its counterparts.high), yellow (medium) and red (low), and the shares are green when complete, yellow when partial and red when nothing is paired. Pass --no-colors when you parse the console output, or read the JSON report instead.<folder> has no functions yet. Check the path and the languages before concluding anything else.npx jscpd --compare billing-py/ billing-ts/ -r console-fullconsole-full adds every pair with its similarity and level, and marks the pairs found by name. Before reporting the comparison as reliable, read a sample:
high pairs, to confirm the pairing works on this code;low pair, since related code pairs there too (a client call and the endpoint it calls, a function counting UTF-8 bytes and one converting a string to them);by name, since a same-named function can do something else.When a sample pair is wrong, say which one and why.
A function in an "Only in" list is either missing on the other side, or its counterpart was not recognized. Before calling it missing, search the other folder: in its counterpart file, under other names, as part of a larger function, or replaced by a library or platform call. The known gaps in pairing:
new, Kotlin's constructor, Swift's init) pair only when their code is similar enough;add_history for _finder_penalty_add_history);Functions that exist on one side only by design are expected: platform glue (an iOS delegate callback, an Android notification channel), helpers a language needs and another does not, features one side dropped.
For the user, summarize in a few lines: the two percentages, the notable renamed pairs, the low pairs you checked and what you found, and the real gaps on each side, grouped by file or module. For a person who wants to explore the result, write the migration map, -r html: one offline page that draws both sides as dependency graphs with the pairs bridging them, and lists the same pairs as a table on a second tab. For a document or an issue, write the Markdown report and attach or paste it:
npx jscpd --compare billing-py/ billing-ts/ -r markdown -o .jscpd-compareFor your own processing, read the JSON report (-r json, written to jscpd-compare.json). It has a code and a tests section of the same shape. Each has sides[0] and sides[1], each with path, functions, matched, percentage, files (file, functions, matched, counterpart, similarity, lowPairs) unmatched (file, name, start, end) and readyToPort (the unmatched functions whose callees all have a counterpart, each with its number of callers), and pairs, each with a, b, similarity, level, renamed and matchedBy. Paths are relative to each folder. Write reports outside the repository or add the folder to .gitignore.
--min-tokens and --min-lines set which functions count. Raise them to focus on substantial functions.--ignore and --format narrow the files, for example to leave out tests or build scripts.--semantic-model picks another model, and --semantic-url an OpenAI-compatible embeddings API; npx jscpd --semantic-models lists the models with calibrated thresholds. --semantic-threshold and --semantic-same-threshold move the thresholds; change them only after reading pairs on both sides of the new value.--semantic-rebuild-cache embeds everything again, which is needed only when the cache is suspect.Keep the folders, their order, the options and the model the same when you compare runs over time, or the numbers stop being comparable. The exit code is 0 whatever the result.
high. Only tests and reading the code catch drift.© kucherenko, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in skills/compare-codebases of kucherenko/jscpd.
Open the folder on GitHubat commit 324bb57
Codebase Comparison with jscpd next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Codebase Comparison with jscpd this skillkucherenko/jscpd | 6.3k | — | ~3.2k | Automated safety check: Pass | MIT | |
| Community Migrationjingjing2222/react-native-nitro-geolocation | 116 | — | ~3.5k | Automated safety check: Pass | MIT | |
| Commit PRsamuelclay/NewsBlur | 7.6k | — | ~4.1k | Automated safety check: Pass | MIT | |
| Code Guidelinesgetsentry/sentry-react-native | 1.8k | — | ~3.2k | Automated safety check: Pass | MIT | |
| ExecuTorch Build Guidepytorch/executorch | 5.1k | — | ~2.3k | Automated safety check: Notes | Custom licence | |
| CanvasBitterbot-AI/bitterbot-desktop | 2.5k | — | ~1.4k | Automated safety check: Pass | MIT |
jingjing2222/react-native-nitro-geolocation
Migrate React Native apps from @react-native-community/geolocation to react-native-nitro-geolocation.
samuelclay/NewsBlur
A skill your agent uses when the user runs /commit-pr, says "commit and push", "open a PR", "ship this", asks to update an existing PR with new changes, or asks to resolve PR review comments in the…
getsentry/sentry-react-native
Enforce Sentry React Native SDK code guidelines for implementation, refactoring, and review.
pytorch/executorch
Builds ExecuTorch from source: the Python package, C++ runtime, model runners, Android and iOS cross-compilation and backend-specific builds, with environment checks.
Bitterbot-AI/bitterbot-desktop
Display and control HTML content on connected Bitterbot nodes (Mac, iOS, Android) via the canvas host server.
redhat-et/ripwire
Rules for writing and converting formatted output in ripwire's C++ source with its emit helpers, keeping every printed byte identical to the old printf output.
kucherenko/jscpd
Measures a code port between languages or frameworks with jscpd's function-level comparison, porting tests before code and tracking what is left unmatched.
kucherenko/jscpd
A three-part cleanup guided by jscpd: measure health, then fix duplicated code, remove dead code and simplify the most complex files, finishing by re-measuring the score.
kucherenko/jscpd
Removes copy-paste duplication found by jscpd, starting with exact clones and hotspots, then renamed and near-miss copies, using proven refactoring strategies.
kucherenko/jscpd
Finds duplicated code in 220+ languages with jscpd, reports exact, renamed and near-miss clones in a compact agent-friendly format and measures duplication.
Categories
Compares two folders function by function with jscpd --compare, across languages if needed, and explains which functions match and which have no counterpart. jscpd --compare pairs each function in one folder with the function in the other that does the same job, and lists the functions on either side that have no match. The folders can use one language or two, for example Python and TypeScript or Kotlin and Swift.
Codebase Comparison with jscpd fits situations like: finding which functions one implementation has that the other lacks; measuring how far a port from one language to another has progressed; checking whether the iOS and Android versions of an app match; locating the function in one folder that corresponds to a function in the other.
Run `npx skills add kucherenko/jscpd --skill compare-codebases -a claude-code`. Or copy the skill folder (skills/compare-codebases in kucherenko/jscpd) into .claude/skills/compare-codebases in your project. Claude Code loads it when a task matches its description.
Run `npx skills add kucherenko/jscpd --skill compare-codebases -a codex`. Or copy the skill folder (skills/compare-codebases in kucherenko/jscpd) into .agents/skills/compare-codebases in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add kucherenko/jscpd --skill compare-codebases -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/compare-codebases, .gemini/skills/compare-codebases, .github/skills/compare-codebases and .opencode/skills/compare-codebases in your project.
Going by SKILL.md and its folder, Codebase Comparison with jscpd needs the command-line tools its instructions call (npx). Our summary lists: jscpd with the compare option available.
SKILL.md contains no URLs. Its commands use npx, which can reach the network depending on how they are called. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Codebase Comparison with jscpd is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 3.2k tokens (SKILL.md is roughly 13k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Codebase Comparison with jscpd: Community Migration (jingjing2222/react-native-nitro-geolocation, 116 stars), Commit PR (samuelclay/NewsBlur, 7.6k stars), Code Guidelines (getsentry/sentry-react-native, 1.8k stars) and ExecuTorch Build Guide (pytorch/executorch, 5.1k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
kucherenko (a GitHub user) maintains it in kucherenko/jscpd, which has 6,345 GitHub stars. The repository holds 5 skills in this directory. The repository was last updated on October 6, 2026.
Source: kucherenko/jscpd on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.