docs: reorganize documentation into docs/ folder, separate v4/v5 docs
- Split the overloaded README.md into focused docs:
- docs/typescript.md: v4 (Node.js) CLI, reporters, API, config
- docs/rust.md: v5 (Rust) CLI, reporters, blame, differences from v4
- docs/ai-ready.md: AI reporter, agent skills, MCP server
- docs/api.md: Programming APIs (TypeScript and Rust)
- docs/packages.md: Monorepo package and crate overview
- Trim README.md to a concise entry point with links to docs/
- Slim down rust/README.md, rust/jscpd/README.md, rust/npm/README.md:
remove duplicated content, link to docs/rust.md for details
- Fix factual errors verified against actual CLI output:
- Format count: 223 (v5) and 224 (v4), not '225+'
- Reporter output filenames: jscpd-report.* not cpd.*
- --max-size: no default in v5 (not 512KB)
- --formats-exts: same hyphenated form in both v4 and v5
- --no-gitignore: same flag name in both v4 and v5
- Update rust/jscpd/package.json: add 'cpd' bin so jscpd@5
installs both jscpd and cpd commands
- Update crate versions in rust/README.md to match source (0.1.3/0.1.4)
2026-06-08 12:57:38 +02:00
# jscpd v5 (Rust Engine)
chore: make master v5-only
Everything belonging to the v4 TypeScript engine moves to the master-v4
branch: apps/, packages/, build-utils/, changesets, pnpm workspace, turbo,
the Node.js CI workflow and the ts-* release jobs. What remains is the
Rust workspace under rust/, the npm wrapper and platform packages, the
GitHub Action, Docker image, flake, skills, benchmark and fixtures/.
- rust.yml gains a smoke job that runs the release binary against
fixtures/ (json, sarif, html) and asserts clones and reporters
- release.yml keeps only the Rust jobs; pnpm removed from every workflow;
audit.yml keeps cargo audit + cargo deny; dependabot drops the root npm entry
- root package.json becomes a thin private package depending on the exact
jscpd@5 version so the pre-commit hook keeps installing the binary;
sync-version.mjs keeps it in step
- .pre-commit-hooks.yaml used v4-only flags that the v5 CLI rejects; fixed
- FORMATS.md is now generated from the Rust tokenizer (224 formats)
- README, docs, CONTRIBUTING, SECURITY, package and crate descriptions,
benchmark and skills rewritten for v5 on its own terms: no v5-vs-v4 speed
multipliers anywhere, a single "Looking for v4?" pointer to master-v4
2026-09-02 10:15:10 +02:00
jscpd v5 is a Rust engine shipped as a self-contained binary: no runtime required, same CLI flags, reporters and `.jscpd.json` config as the earlier Node.js versions.
docs: reorganize documentation into docs/ folder, separate v4/v5 docs
- Split the overloaded README.md into focused docs:
- docs/typescript.md: v4 (Node.js) CLI, reporters, API, config
- docs/rust.md: v5 (Rust) CLI, reporters, blame, differences from v4
- docs/ai-ready.md: AI reporter, agent skills, MCP server
- docs/api.md: Programming APIs (TypeScript and Rust)
- docs/packages.md: Monorepo package and crate overview
- Trim README.md to a concise entry point with links to docs/
- Slim down rust/README.md, rust/jscpd/README.md, rust/npm/README.md:
remove duplicated content, link to docs/rust.md for details
- Fix factual errors verified against actual CLI output:
- Format count: 223 (v5) and 224 (v4), not '225+'
- Reporter output filenames: jscpd-report.* not cpd.*
- --max-size: no default in v5 (not 512KB)
- --formats-exts: same hyphenated form in both v4 and v5
- --no-gitignore: same flag name in both v4 and v5
- Update rust/jscpd/package.json: add 'cpd' bin so jscpd@5
installs both jscpd and cpd commands
- Update crate versions in rust/README.md to match source (0.1.3/0.1.4)
2026-06-08 12:57:38 +02:00
chore: make master v5-only
Everything belonging to the v4 TypeScript engine moves to the master-v4
branch: apps/, packages/, build-utils/, changesets, pnpm workspace, turbo,
the Node.js CI workflow and the ts-* release jobs. What remains is the
Rust workspace under rust/, the npm wrapper and platform packages, the
GitHub Action, Docker image, flake, skills, benchmark and fixtures/.
- rust.yml gains a smoke job that runs the release binary against
fixtures/ (json, sarif, html) and asserts clones and reporters
- release.yml keeps only the Rust jobs; pnpm removed from every workflow;
audit.yml keeps cargo audit + cargo deny; dependabot drops the root npm entry
- root package.json becomes a thin private package depending on the exact
jscpd@5 version so the pre-commit hook keeps installing the binary;
sync-version.mjs keeps it in step
- .pre-commit-hooks.yaml used v4-only flags that the v5 CLI rejects; fixed
- FORMATS.md is now generated from the Rust tokenizer (224 formats)
- README, docs, CONTRIBUTING, SECURITY, package and crate descriptions,
benchmark and skills rewritten for v5 on its own terms: no v5-vs-v4 speed
multipliers anywhere, a single "Looking for v4?" pointer to master-v4
2026-09-02 10:15:10 +02:00
It is distributed under three names:
docs: reorganize documentation into docs/ folder, separate v4/v5 docs
- Split the overloaded README.md into focused docs:
- docs/typescript.md: v4 (Node.js) CLI, reporters, API, config
- docs/rust.md: v5 (Rust) CLI, reporters, blame, differences from v4
- docs/ai-ready.md: AI reporter, agent skills, MCP server
- docs/api.md: Programming APIs (TypeScript and Rust)
- docs/packages.md: Monorepo package and crate overview
- Trim README.md to a concise entry point with links to docs/
- Slim down rust/README.md, rust/jscpd/README.md, rust/npm/README.md:
remove duplicated content, link to docs/rust.md for details
- Fix factual errors verified against actual CLI output:
- Format count: 223 (v5) and 224 (v4), not '225+'
- Reporter output filenames: jscpd-report.* not cpd.*
- --max-size: no default in v5 (not 512KB)
- --formats-exts: same hyphenated form in both v4 and v5
- --no-gitignore: same flag name in both v4 and v5
- Update rust/jscpd/package.json: add 'cpd' bin so jscpd@5
installs both jscpd and cpd commands
- Update crate versions in rust/README.md to match source (0.1.3/0.1.4)
2026-06-08 12:57:38 +02:00
| Package | Installs commands | Notes |
|---------|-------------------|-------|
chore: make master v5-only
Everything belonging to the v4 TypeScript engine moves to the master-v4
branch: apps/, packages/, build-utils/, changesets, pnpm workspace, turbo,
the Node.js CI workflow and the ts-* release jobs. What remains is the
Rust workspace under rust/, the npm wrapper and platform packages, the
GitHub Action, Docker image, flake, skills, benchmark and fixtures/.
- rust.yml gains a smoke job that runs the release binary against
fixtures/ (json, sarif, html) and asserts clones and reporters
- release.yml keeps only the Rust jobs; pnpm removed from every workflow;
audit.yml keeps cargo audit + cargo deny; dependabot drops the root npm entry
- root package.json becomes a thin private package depending on the exact
jscpd@5 version so the pre-commit hook keeps installing the binary;
sync-version.mjs keeps it in step
- .pre-commit-hooks.yaml used v4-only flags that the v5 CLI rejects; fixed
- FORMATS.md is now generated from the Rust tokenizer (224 formats)
- README, docs, CONTRIBUTING, SECURITY, package and crate descriptions,
benchmark and skills rewritten for v5 on its own terms: no v5-vs-v4 speed
multipliers anywhere, a single "Looking for v4?" pointer to master-v4
2026-09-02 10:15:10 +02:00
| [`jscpd` ](https://www.npmjs.com/package/jscpd ) | `jscpd` | Default install; installs the `jscpd` command |
docs: reorganize documentation into docs/ folder, separate v4/v5 docs
- Split the overloaded README.md into focused docs:
- docs/typescript.md: v4 (Node.js) CLI, reporters, API, config
- docs/rust.md: v5 (Rust) CLI, reporters, blame, differences from v4
- docs/ai-ready.md: AI reporter, agent skills, MCP server
- docs/api.md: Programming APIs (TypeScript and Rust)
- docs/packages.md: Monorepo package and crate overview
- Trim README.md to a concise entry point with links to docs/
- Slim down rust/README.md, rust/jscpd/README.md, rust/npm/README.md:
remove duplicated content, link to docs/rust.md for details
- Fix factual errors verified against actual CLI output:
- Format count: 223 (v5) and 224 (v4), not '225+'
- Reporter output filenames: jscpd-report.* not cpd.*
- --max-size: no default in v5 (not 512KB)
- --formats-exts: same hyphenated form in both v4 and v5
- --no-gitignore: same flag name in both v4 and v5
- Update rust/jscpd/package.json: add 'cpd' bin so jscpd@5
installs both jscpd and cpd commands
- Update crate versions in rust/README.md to match source (0.1.3/0.1.4)
2026-06-08 12:57:38 +02:00
| [`cpd` ](https://www.npmjs.com/package/cpd ) | `cpd` | Lighter package, shorter command only |
docs(readme): fix jscpd@5 bin claim and refresh npm README
The jscpd@5 npm package only installs the [1mClone found (actionscript)[22m
- [1m[32mactionscript/file1.as[39m[22m [1:1 - 30:10] (30 lines, 127 tokens)
actionscript/file2.as [1:1 - 30:10]
[1mClone found (ada)[22m
- [1m[32mada/file1.ada[39m[22m [1:1 - 21:12] (21 lines, 103 tokens)
ada/file2.ada [1:1 - 21:12]
[1mClone found (antlr4)[22m
- [1m[32mantlr4/file1.g4[39m[22m [1:1 - 21:27] (21 lines, 82 tokens)
antlr4/file2.g4 [1:1 - 21:27]
[1mClone found (apex)[22m
- [1m[32mapex/file1.cls[39m[22m [1:29 - 24:18] (24 lines, 115 tokens)
apex/file2.cls [1:29 - 24:18]
[1mClone found (apl)[22m
- [1m[32mapl/file1.apl[39m[22m [1:1 - 20:54] (20 lines, 252 tokens)
apl/file2.apl [1:1 - 20:54]
[1mClone found (css)[22m
- [1m[32mastro/component1.astro:css[39m[22m [76:3 - 161:4] (86 lines, 364 tokens)
astro/component2.astro:css [76:3 - 161:4]
[1mClone found (css)[22m
- [1m[32mastro/component1.astro:css[39m[22m [79:23 - 124:12] (46 lines, 194 tokens)
svelte/component1.svelte:css [116:28 - 161:12]
[1mClone found (html)[22m
- [1m[32mastro/component1.astro:html[39m[22m [1:1 - 162:9] (162 lines, 246 tokens)
astro/component2.astro:html [1:1 - 162:9]
[1mClone found (html)[22m
- [1m[32mastro/component1.astro:html[39m[22m [27:1 - 33:8] (7 lines, 67 tokens)
svelte/component1.svelte:html [64:1 - 70:8]
[1mClone found (javascript)[22m
- [1m[32mastro/component1.astro:javascript[39m[22m [58:3 - 72:4] (15 lines, 111 tokens)
astro/component2.astro:javascript [58:3 - 72:4]
[1mClone found (typescript)[22m
- [1m[32mastro/component1.astro:typescript[39m[22m [2:1 - 24:4] (23 lines, 153 tokens)
astro/component2.astro:typescript [2:1 - 24:4]
[1mClone found (awk)[22m
- [1m[32mawk/file1.awk[39m[22m [1:1 - 23:33] (23 lines, 75 tokens)
awk/file2.awk [1:1 - 23:33]
[1mClone found (basic)[22m
- [1m[32mbasic/file1.bas[39m[22m [1:1 - 18:4] (18 lines, 100 tokens)
basic/file2.bas [1:1 - 18:4]
[1mClone found (bicep)[22m
- [1m[32mbicep/file1.bicep[39m[22m [1:1 - 27:9] (27 lines, 78 tokens)
bicep/file2.bicep [1:1 - 27:9]
[1mClone found (brainfuck)[22m
- [1m[32mbrainfuck/file1.b[39m[22m [1:1 - 26:77] (26 lines, 268 tokens)
brainfuck/file1.bf [1:1 - 26:77]
[1mClone found (brainfuck)[22m
- [1m[32mbrainfuck/file1.b[39m[22m [1:1 - 41:59] (41 lines, 439 tokens)
brainfuck/file2.b [1:1 - 41:59]
[1mClone found (brainfuck)[22m
- [1m[32mbrainfuck/file1.b[39m[22m [1:1 - 41:59] (41 lines, 439 tokens)
brainfuck/file2.bf [1:1 - 41:59]
[1mClone found (brainfuck)[22m
- [1m[32mbrainfuck/file1.b[39m[22m [33:1 - 41:59] (9 lines, 143 tokens)
brainfuck/file1.bf [28:1 - 36:59]
[1mClone found (cfml)[22m
- [1m[32mcfml/file1.cfm[39m[22m [4:20 - 21:2] (18 lines, 85 tokens)
cfml/file2.cfm [4:18 - 21:2]
[1mClone found (cfscript)[22m
- [1m[32mcfscript/file1.cfc[39m[22m [1:1 - 28:11] (28 lines, 161 tokens)
cfscript/file2.cfc [1:1 - 28:11]
[1mClone found (c)[22m
- [1m[32mclike/file1.c[39m[22m [1:1 - 17:4] (17 lines, 258 tokens)
clike/file2.c [1:1 - 17:4]
[1mClone found (c)[22m
- [1m[32mclike/file1.c[39m[22m [8:3 - 19:2] (12 lines, 81 tokens)
clike/file2.c [18:3 - 29:2]
[1mClone found (cpp)[22m
- [1m[32mclike/file1.cpp[39m[22m [1:1 - 88:7] (88 lines, 757 tokens)
clike/file2.cpp [1:1 - 88:7]
[1mClone found (cpp)[22m
- [1m[32mclike/file1.cpp[39m[22m [24:5 - 43:51] (20 lines, 208 tokens)
clike/file1.cpp [45:5 - 64:51]
[1mClone found (csharp)[22m
- [1m[32mclike/file1.cs[39m[22m [1:1 - 91:19] (91 lines, 235 tokens)
clike/file2.cs [1:1 - 91:19]
[1mClone found (csharp)[22m
- [1m[32mclike/file1.cs[39m[22m [103:9 - 185:2] (83 lines, 302 tokens)
clike/file2.cs [93:9 - 175:2]
[1mClone found (c-header)[22m
- [1m[32mclike/file1.h[39m[22m [1:1 - 17:4] (17 lines, 258 tokens)
clike/file2.h [1:1 - 17:4]
[1mClone found (c-header)[22m
- [1m[32mclike/file1.h[39m[22m [8:3 - 19:2] (12 lines, 81 tokens)
clike/file2.h [18:3 - 29:2]
[1mClone found (cpp-header)[22m
- [1m[32mclike/file1.hpp[39m[22m [1:1 - 88:7] (88 lines, 757 tokens)
clike/file2.hpp [1:1 - 88:7]
[1mClone found (cpp-header)[22m
- [1m[32mclike/file1.hpp[39m[22m [24:5 - 43:51] (20 lines, 208 tokens)
clike/file1.hpp [45:5 - 64:51]
[1mClone found (java)[22m
- [1m[32mclike/file1.java[39m[22m [1:1 - 186:6] (186 lines, 6601 tokens)
clike/file2.java [1:1 - 186:6]
[1mClone found (java)[22m
- [1m[32mclike/file1.java[39m[22m [182:51 - 221:2] (40 lines, 786 tokens)
clike/file2.java [194:52 - 233:2]
[1mClone found (kotlin)[22m
- [1m[32mclike/file1.kt[39m[22m [1:1 - 33:6] (33 lines, 186 tokens)
clike/file2.kt [1:1 - 33:6]
[1mClone found (kotlin)[22m
- [1m[32mclike/file1.kt[39m[22m [38:5 - 53:2] (16 lines, 64 tokens)
clike/file2.kt [38:5 - 53:2]
[1mClone found (scala)[22m
- [1m[32mclike/file1.scala[39m[22m [1:1 - 29:2] (29 lines, 848 tokens)
clike/file2.scala [1:1 - 29:2]
[1mClone found (clojure)[22m
- [1m[32mclojure/file1.clj[39m[22m [2:3 - 20:23] (19 lines, 139 tokens)
clojure/file2.clj [2:3 - 20:23]
[1mClone found (cmake)[22m
- [1m[32mcmake/file1.cmake[39m[22m [1:1 - 21:14] (21 lines, 128 tokens)
cmake/file2.cmake [1:1 - 21:14]
[1mClone found (coffeescript)[22m
- [1m[32mcoffeescript/file1.coffee[39m[22m [1:1 - 13:22] (13 lines, 75 tokens)
coffeescript/file2.coffee [3:1 - 15:22]
[1mClone found (coffeescript)[22m
- [1m[32mcoffeescript/file1.coffee[39m[22m [16:1 - 44:21] (29 lines, 144 tokens)
coffeescript/file1.coffee [46:1 - 74:21]
[1mClone found (lisp)[22m
- [1m[32mcommonlisp/file1.el[39m[22m [1:1 - 50:23] (50 lines, 289 tokens)
commonlisp/file2.el [1:1 - 50:23]
[1mClone found (crystal)[22m
- [1m[32mcrystal/file1.cr[39m[22m [1:1 - 29:4] (29 lines, 97 tokens)
crystal/file2.cr [1:1 - 29:4]
[1mClone found (css)[22m
- [1m[32mcss/file1.css[39m[22m [1:1 - 25:2] (25 lines, 237 tokens)
css/file10.css [1:1 - 25:2]
[1mClone found (css)[22m
- [1m[32mcss/file1.css[39m[22m [1:1 - 19:36] (19 lines, 192 tokens)
css/file2.css [1:1 - 19:36]
[1mClone found (less)[22m
- [1m[32mcss/file1.less[39m[22m [1:1 - 19:36] (19 lines, 192 tokens)
css/file2.less [1:1 - 19:36]
[1mClone found (less)[22m
- [1m[32mcss/file1.less[39m[22m [14:35 - 25:2] (12 lines, 90 tokens)
css/file1.less [24:5 - 36:2]
[1mClone found (scss)[22m
- [1m[32mcss/file1.scss[39m[22m [1:1 - 53:2] (53 lines, 324 tokens)
css/file2.scss [1:1 - 53:2]
[1mClone found (csv)[22m
- [1m[32mcsv/file1.csv[39m[22m [1:1 - 9:56] (9 lines, 163 tokens)
csv/file2.csv [1:1 - 9:56]
[1mClone found (d)[22m
- [1m[32md/file1.d[39m[22m [1:1 - 169:6] (169 lines, 1135 tokens)
d/file2.d [1:1 - 169:6]
[1mClone found (dart)[22m
- [1m[32mdart/file1.dart[39m[22m [1:1 - 89:4] (89 lines, 403 tokens)
dart/file2.dart [1:1 - 89:4]
[1mClone found (dart)[22m
- [1m[32mdart/file1.dart[39m[22m [118:15 - 148:2] (31 lines, 119 tokens)
dart/file2.dart [88:6 - 118:2]
[1mClone found (diff)[22m
- [1m[32mdiff/file1.diff[39m[22m [1:1 - 62:7] (62 lines, 435 tokens)
diff/file2.diff [1:1 - 62:7]
[1mClone found (dot)[22m
- [1m[32mdot/file1.dot[39m[22m [1:1 - 18:21] (18 lines, 91 tokens)
dot/file2.dot [1:1 - 18:21]
[1mClone found (eiffel)[22m
- [1m[32meiffel/file1.e[39m[22m [1:1 - 46:11] (46 lines, 130 tokens)
eiffel/file2.e [1:1 - 46:11]
[1mClone found (elm)[22m
- [1m[32melm/file1.elm[39m[22m [1:1 - 47:23] (47 lines, 155 tokens)
elm/file2.elm [1:1 - 47:23]
[1mClone found (erlang)[22m
- [1m[32merlang/file1.erl[39m[22m [1:1 - 121:7] (121 lines, 837 tokens)
erlang/file2.erl [1:1 - 121:7]
[1mClone found (javascript)[22m
- [1m[32mfolder1/file_1.js[39m[22m [4:1 - 55:3] (52 lines, 339 tokens)
javascript/file_1.cjs [4:1 - 55:3]
[1mClone found (javascript)[22m
- [1m[32mfolder1/file_1.js[39m[22m [4:1 - 55:3] (52 lines, 339 tokens)
javascript/file_1.js [4:1 - 55:3]
[1mClone found (javascript)[22m
- [1m[32mfolder1/file_1.js[39m[22m [4:1 - 55:3] (52 lines, 339 tokens)
javascript/file_1.mjs [4:1 - 55:3]
[1mClone found (javascript)[22m
- [1m[32mfolder1/file_1.js[39m[22m [4:1 - 55:3] (52 lines, 339 tokens)
javascript/file_3.js [1:1 - 52:3]
[1mClone found (javascript)[22m
- [1m[32mfolder1/file_1.js[39m[22m [28:1 - 55:3] (28 lines, 169 tokens)
folder2/file_2.js [1:1 - 28:3]
[1mClone found (javascript)[22m
- [1m[32mfolder1/file_1.js[39m[22m [28:1 - 55:3] (28 lines, 169 tokens)
folder2/file_2.js [29:1 - 56:3]
[1mClone found (fortran)[22m
- [1m[32mfortran/file1.f[39m[22m [1:7 - 37:21] (37 lines, 182 tokens)
fortran/file2.f [1:7 - 37:21]
[1mClone found (gdscript)[22m
- [1m[32mgdscript/file1.gd[39m[22m [22:1 - 46:18] (25 lines, 135 tokens)
gdscript/file2.gd [22:1 - 46:18]
[1mClone found (gettext)[22m
- [1m[32mgettext/file1.po[39m[22m [13:1 - 64:7] (52 lines, 82 tokens)
gettext/file2.po [13:1 - 64:7]
[1mClone found (gherkin)[22m
- [1m[32mgherkin/file1.feature[39m[22m [1:1 - 16:26] (16 lines, 83 tokens)
gherkin/file2.feature [1:1 - 16:26]
[1mClone found (ignore)[22m
- [1m[32mgitignore/file1.gitignore[39m[22m [1:1 - 84:16] (84 lines, 234 tokens)
gitignore/file2.gitignore [1:1 - 84:16]
[1mClone found (go)[22m
- [1m[32mgo/file1.go[39m[22m [1:1 - 30:5] (30 lines, 134 tokens)
go/file2.go [1:1 - 31:5]
[1mClone found (graphql)[22m
- [1m[32mgraphql/file1.graphql[39m[22m [1:1 - 25:5] (25 lines, 143 tokens)
graphql/file2.graphql [1:1 - 25:5]
[1mClone found (groovy)[22m
- [1m[32mgroovy/file1.groovy[39m[22m [1:1 - 41:6] (41 lines, 188 tokens)
groovy/file2.groovy [1:1 - 41:6]
[1mClone found (haml)[22m
- [1m[32mhaml/file1.haml[39m[22m [1:1 - 23:18] (23 lines, 118 tokens)
haml/file2.haml [1:1 - 23:18]
[1mClone found (handlebars)[22m
- [1m[32mhandlebars/file1.hbs[39m[22m [1:1 - 28:27] (28 lines, 218 tokens)
handlebars/file2.hbs [1:1 - 28:27]
[1mClone found (haskell)[22m
- [1m[32mhaskell-literate/file1.lhs[39m[22m [1:1 - 31:2] (31 lines, 182 tokens)
haskell-literate/file2.lhs [1:1 - 31:2]
[1mClone found (haskell)[22m
- [1m[32mhaskell/file1.hs[39m[22m [1:1 - 173:34] (173 lines, 902 tokens)
haskell/file2.hs [1:1 - 173:34]
[1mClone found (haskell)[22m
- [1m[32mhaskell/file1.hs[39m[22m [190:1 - 204:33] (15 lines, 99 tokens)
haskell/file2.hs [175:1 - 189:33]
[1mClone found (haxe)[22m
- [1m[32mhaxe/file1.hx[39m[22m [1:1 - 62:76] (62 lines, 334 tokens)
haxe/file2.hx [1:1 - 62:2]
[1mClone found (haxe)[22m
- [1m[32mhaxe/file1.hx[39m[22m [6:3 - 47:9] (42 lines, 244 tokens)
haxe/file1.hx [47:3 - 88:9]
[1mClone found (haxe)[22m
- [1m[32mhaxe/file1.hxml[39m[22m [3:1 - 14:10] (12 lines, 56 tokens)
haxe/file2.hxml [1:1 - 12:10]
[1mClone found (hcl)[22m
- [1m[32mhcl/file1.tf[39m[22m [1:1 - 37:9] (37 lines, 85 tokens)
hcl/file2.tf [1:1 - 37:9]
[1mClone found (aspnet)[22m
- [1m[32mhtmlembedded/file1.aspx[39m[22m [7:18 - 16:35] (10 lines, 67 tokens)
htmlembedded/file2.aspx [7:21 - 16:35]
[1mClone found (aspnet)[22m
- [1m[32mhtmlembedded/file1.aspx[39m[22m [18:53 - 36:30] (19 lines, 173 tokens)
htmlembedded/file2.aspx [18:60 - 36:30]
[1mClone found (aspnet)[22m
- [1m[32mhtmlembedded/file1.aspx[39m[22m [37:95 - 47:8] (11 lines, 56 tokens)
htmlembedded/file2.aspx [44:98 - 54:8]
[1mClone found (markup)[22m
- [1m[32mhtmlmixed/file1.htm[39m[22m [1:1 - 24:7] (24 lines, 191 tokens)
htmlmixed/file2.htm [1:1 - 24:7]
[1mClone found (markup)[22m
- [1m[32mhtmlmixed/file1.htm[39m[22m [1:1 - 24:7] (24 lines, 191 tokens)
ignore/file2.htm [1:1 - 24:7]
[1mClone found (markup)[22m
- [1m[32mhtmlmixed/file1.html[39m[22m [1:1 - 16:2] (16 lines, 91 tokens)
htmlmixed/file2.html [1:1 - 16:2]
[1mClone found (prolog)[22m
- [1m[32midl/file1.pro[39m[22m [1:1 - 28:22] (28 lines, 176 tokens)
idl/file2.pro [1:1 - 28:22]
[1mClone found (idris)[22m
- [1m[32midris/file1.idr[39m[22m [1:1 - 35:3] (35 lines, 208 tokens)
idris/file2.idr [1:1 - 35:3]
[1mClone found (txt)[22m
- [1m[32mignore-case/file2.txt[39m[22m [1:1 - 12:55] (12 lines, 85 tokens)
text/file1.txt [1:1 - 12:55]
[1mClone found (txt)[22m
- [1m[32mignore-case/file2.txt[39m[22m [1:1 - 61:63] (61 lines, 350 tokens)
text/file2.txt [1:1 - 61:63]
[1mClone found (typescript)[22m
- [1m[32mjavascript/file1.cts[39m[22m [1:1 - 263:4] (263 lines, 1318 tokens)
javascript/file1.mts [1:1 - 263:4]
[1mClone found (typescript)[22m
- [1m[32mjavascript/file1.cts[39m[22m [1:1 - 263:4] (263 lines, 1318 tokens)
javascript/file1.ts [1:1 - 263:4]
[1mClone found (typescript)[22m
- [1m[32mjavascript/file1.cts[39m[22m [1:1 - 66:24] (66 lines, 531 tokens)
javascript/file2.cts [48:1 - 113:24]
[1mClone found (typescript)[22m
- [1m[32mjavascript/file1.cts[39m[22m [74:1 - 263:4] (190 lines, 787 tokens)
javascript/file2.cts [187:1 - 376:4]
[1mClone found (javascript)[22m
- [1m[32mjavascript/file1.js[39m[22m [5:1 - 24:2] (20 lines, 94 tokens)
javascript/file2.js [5:1 - 27:2]
[1mClone found (json)[22m
- [1m[32mjavascript/file1.json[39m[22m [4:53 - 21:22] (18 lines, 64 tokens)
javascript/file2.json [4:70 - 21:22]
[1mClone found (json)[22m
- [1m[32mjavascript/file1.json[39m[22m [22:22 - 43:2] (22 lines, 70 tokens)
javascript/file2.json [22:22 - 43:2]
[1mClone found (typescript)[22m
- [1m[32mjavascript/file2.cts[39m[22m [109:38 - 209:24] (101 lines, 297 tokens)
javascript/file2.mts [109:38 - 209:24]
[1mClone found (javascript)[22m
- [1m[32mjavascript/file_4.js[39m[22m [15:2 - 42:43] (28 lines, 98 tokens)
javascript/file_4.js [56:74 - 83:43]
[1mClone found (json5)[22m
- [1m[32mjson5/file1.json5[39m[22m [1:1 - 31:5] (31 lines, 93 tokens)
json5/file2.json5 [1:1 - 31:5]
[1mClone found (jsx)[22m
- [1m[32mjsx/file1.jsx[39m[22m [1:1 - 21:46] (21 lines, 99 tokens)
jsx/file2.jsx [1:1 - 21:46]
[1mClone found (tsx)[22m
- [1m[32mjsx/file1.tsx[39m[22m [1:1 - 35:2] (35 lines, 143 tokens)
jsx/file2.tsx [1:1 - 35:2]
[1mClone found (julia)[22m
- [1m[32mjulia/file1.jl[39m[22m [1:1 - 30:4] (30 lines, 194 tokens)
julia/file2.jl [1:1 - 30:4]
[1mClone found (latex)[22m
- [1m[32mlatex/file1.tex[39m[22m [1:1 - 26:13] (26 lines, 149 tokens)
latex/file2.tex [1:1 - 26:13]
[1mClone found (lilypond)[22m
- [1m[32mlilypond/file1.ly[39m[22m [1:1 - 19:10] (19 lines, 63 tokens)
lilypond/file2.ly [1:1 - 19:10]
[1mClone found (linker-script)[22m
- [1m[32mlinker-script/file1.ld[39m[22m [1:1 - 47:4] (47 lines, 256 tokens)
linker-script/file2.ld [1:1 - 47:4]
[1mClone found (livescript)[22m
- [1m[32mlivescript/file1.ls[39m[22m [1:1 - 31:24] (31 lines, 145 tokens)
livescript/file2.ls [1:1 - 31:24]
[1mClone found (llvm)[22m
- [1m[32mllvm/file1.ll[39m[22m [1:1 - 35:2] (35 lines, 215 tokens)
llvm/file2.ll [1:1 - 35:2]
[1mClone found (log)[22m
- [1m[32mlog/file1.log[39m[22m [1:1 - 13:11] (13 lines, 262 tokens)
log/file2.log [1:1 - 13:11]
[1mClone found (lua)[22m
- [1m[32mlua/file1.lua[39m[22m [1:1 - 46:4] (46 lines, 193 tokens)
lua/file2.lua [1:1 - 46:4]
[1mClone found (markdown)[22m
- [1m[32mmarkdown/file1.md:markdown[39m[22m [2:1 - 176:3] (175 lines, 1238 tokens)
markdown/file2.md:markdown [7:1 - 181:3]
[1mClone found (markdown)[22m
- [1m[32mmarkdown/file1.md:markdown[39m[22m [176:1 - 193:86] (18 lines, 100 tokens)
markdown/file2.md:markdown [196:1 - 213:86]
[1mClone found (text)[22m
- [1m[32mmarkdown/file1.md:text[39m[22m [156:1 - 166:11] (11 lines, 69 tokens)
markdown/file2.md:text [161:1 - 171:11]
[1mClone found (yaml)[22m
- [1m[32mmarkdown/file1.md:yaml[39m[22m [53:1 - 81:10] (29 lines, 60 tokens)
markdown/file2.md:yaml [58:1 - 86:10]
[1mClone found (markdown)[22m
- [1m[32mmarkdown/file3.md:markdown[39m[22m [27:85 - 98:66] (72 lines, 69 tokens)
markdown/file4.md:markdown [27:89 - 98:66]
[1mClone found (python)[22m
- [1m[32mmarkdown/file3.md:python[39m[22m [72:1 - 91:6] (20 lines, 137 tokens)
markdown/file4.md:python [72:1 - 91:6]
[1mClone found (typescript)[22m
- [1m[32mmarkdown/file3.md:typescript[39m[22m [34:1 - 64:2] (31 lines, 156 tokens)
markdown/file4.md:typescript [34:1 - 64:2]
[1mClone found (wolfram)[22m
- [1m[32mmathematica/file1.wl[39m[22m [1:1 - 17:3] (17 lines, 127 tokens)
mathematica/file2.wl [1:1 - 17:3]
[1mClone found (fsharp)[22m
- [1m[32mmllike/file1.fs[39m[22m [1:1 - 35:6] (35 lines, 193 tokens)
mllike/file2.fs [1:1 - 35:6]
[1mClone found (ocaml)[22m
- [1m[32mmllike/file1.ml[39m[22m [1:1 - 30:18] (30 lines, 150 tokens)
mllike/file2.ml [1:1 - 30:18]
[1mClone found (ocaml)[22m
- [1m[32mmllike/file1.mli[39m[22m [1:1 - 29:20] (29 lines, 186 tokens)
mllike/file2.mli [1:1 - 29:20]
[1mClone found (ocaml)[22m
- [1m[32mmllike/file1.mll[39m[22m [1:1 - 24:20] (24 lines, 104 tokens)
mllike/file2.mll [1:1 - 24:20]
[1mClone found (nsis)[22m
- [1m[32mnsis/file1.nsi[39m[22m [1:1 - 29:25] (29 lines, 71 tokens)
nsis/file2.nsi [1:1 - 29:25]
[1mClone found (c-header)[22m
- [1m[32mobjective-c/file_1.h[39m[22m [1:1 - 33:2] (33 lines, 385 tokens)
objective-c/file_2.h [1:1 - 33:2]
[1mClone found (objectivec)[22m
- [1m[32mobjective-c/file_1.m[39m[22m [1:1 - 12:35] (12 lines, 311 tokens)
objective-c/file_2.m [1:1 - 12:35]
[1mClone found (objectivec)[22m
- [1m[32mobjective-c/file_1.m[39m[22m [14:1 - 64:5] (51 lines, 216 tokens)
objective-c/file_2.m [38:1 - 88:5]
[1mClone found (javascript)[22m
- [1m[32mone-file/one-file.js[39m[22m [1:1 - 28:6] (28 lines, 165 tokens)
one-file/one-file.js [32:1 - 59:6]
[1mClone found (openqasm)[22m
- [1m[32mopenqasm/file1.qasm[39m[22m [5:1 - 23:7] (19 lines, 92 tokens)
openqasm/file2.qasm [23:1 - 41:7]
[1mClone found (oz)[22m
- [1m[32moz/file1.oz[39m[22m [1:1 - 37:20] (37 lines, 141 tokens)
oz/file2.oz [1:1 - 37:20]
[1mClone found (pascal)[22m
- [1m[32mpascal/file1.pas[39m[22m [1:1 - 37:5] (37 lines, 203 tokens)
pascal/file2.pas [1:1 - 37:5]
[1mClone found (perl)[22m
- [1m[32mperl/file1.pl[39m[22m [1:1 - 121:31] (121 lines, 331 tokens)
perl/file2.pl [1:1 - 121:31]
[1mClone found (perl)[22m
- [1m[32mperl/file1.pm[39m[22m [1:1 - 143:4] (143 lines, 586 tokens)
perl/file2.pm [1:1 - 143:4]
[1mClone found (perl)[22m
- [1m[32mperl/file1.pm[39m[22m [143:3 - 155:3] (13 lines, 54 tokens)
perl/file2.pm [176:3 - 188:3]
[1mClone found (php)[22m
- [1m[32mphp/file1.php[39m[22m [1:1 - 51:20] (51 lines, 295 tokens)
php/file2.php [1:1 - 51:20]
[1mClone found (plant-uml)[22m
- [1m[32mplant-uml/file1.puml[39m[22m [1:1 - 52:40] (52 lines, 181 tokens)
plant-uml/file2.puml [1:1 - 52:40]
[1mClone found (plsql)[22m
- [1m[32mplsql/file1.plsql[39m[22m [1:1 - 56:12] (56 lines, 191 tokens)
plsql/file2.plsql [1:1 - 56:12]
[1mClone found (plsql)[22m
- [1m[32mplsql/file1.plsql[39m[22m [70:20 - 85:2] (16 lines, 53 tokens)
plsql/file2.plsql [71:25 - 86:2]
[1mClone found (powerquery)[22m
- [1m[32mpowerquery/file1.pq[39m[22m [1:1 - 41:7] (41 lines, 210 tokens)
powerquery/file2.pq [1:1 - 41:7]
[1mClone found (powershell)[22m
- [1m[32mpowershell/file1.ps1[39m[22m [1:1 - 41:2] (41 lines, 168 tokens)
powershell/file2.ps1 [1:1 - 41:2]
[1mClone found (ini)[22m
- [1m[32mproperties/file1.ini[39m[22m [1:1 - 27:7] (27 lines, 79 tokens)
properties/file2.ini [1:1 - 27:7]
[1mClone found (properties)[22m
- [1m[32mproperties/file1.properties[39m[22m [1:1 - 22:11] (22 lines, 114 tokens)
properties/file2.properties [1:1 - 22:11]
[1mClone found (protobuf)[22m
- [1m[32mprotobuf/file1.proto[39m[22m [1:1 - 40:8] (40 lines, 115 tokens)
protobuf/file2.proto [1:1 - 40:8]
[1mClone found (pug)[22m
- [1m[32mpug/file1.pug[39m[22m [1:1 - 234:21] (234 lines, 1037 tokens)
pug/file2.pug [1:1 - 234:21]
[1mClone found (pug)[22m
- [1m[32mpug/file1.pug[39m[22m [239:36 - 291:67] (53 lines, 212 tokens)
pug/file2.pug [231:30 - 283:67]
[1mClone found (puppet)[22m
- [1m[32mpuppet/file1.pp[39m[22m [1:1 - 39:4] (39 lines, 131 tokens)
puppet/file2.pp [1:1 - 39:4]
[1mClone found (puppet)[22m
- [1m[32mpuppet/file1.pp[39m[22m [44:32 - 64:2] (21 lines, 83 tokens)
puppet/file2.pp [38:38 - 58:2]
[1mClone found (purescript)[22m
- [1m[32mpurescript/file1.purs[39m[22m [1:1 - 44:7] (44 lines, 265 tokens)
purescript/file2.purs [1:1 - 44:7]
[1mClone found (purescript)[22m
- [1m[32mpurescript/file1.purs[39m[22m [47:41 - 53:44] (7 lines, 50 tokens)
purescript/file2.purs [47:40 - 53:44]
[1mClone found (python)[22m
- [1m[32mpython/file1.py[39m[22m [1:1 - 24:13] (24 lines, 67 tokens)
python/file2.py [1:1 - 24:13]
[1mClone found (q)[22m
- [1m[32mq/file1.q[39m[22m [1:1 - 30:2] (30 lines, 378 tokens)
q/file2.q [1:1 - 30:2]
[1mClone found (qsharp)[22m
- [1m[32mqsharp/file1.qs[39m[22m [2:32 - 11:6] (10 lines, 50 tokens)
qsharp/file2.qs [2:29 - 11:6]
[1mClone found (r)[22m
- [1m[32mr/file1.r[39m[22m [1:1 - 64:9] (64 lines, 427 tokens)
r/file2.r [1:1 - 64:9]
[1mClone found (racket)[22m
- [1m[32mracket/file1.rkt[39m[22m [1:1 - 38:3] (38 lines, 286 tokens)
racket/file2.rkt [1:1 - 38:3]
[1mClone found (rescript)[22m
- [1m[32mrescript/file1.res[39m[22m [1:1 - 38:2] (38 lines, 200 tokens)
rescript/file2.res [1:1 - 38:2]
[1mClone found (robotframework)[22m
- [1m[32mrobotframework/file1.robot[39m[22m [1:1 - 27:45] (27 lines, 143 tokens)
robotframework/file2.robot [1:1 - 27:45]
[1mClone found (robotframework)[22m
- [1m[32mrobotframework/file1.robot[39m[22m [45:1 - 62:23] (18 lines, 80 tokens)
robotframework/file2.robot [51:1 - 68:23]
[1mClone found (ruby)[22m
- [1m[32mruby/file1.rb[39m[22m [1:1 - 40:4] (40 lines, 96 tokens)
ruby/file2.rb [1:1 - 40:4]
[1mClone found (rust)[22m
- [1m[32mrust/file1.rs[39m[22m [1:1 - 131:3] (131 lines, 857 tokens)
rust/file2.rs [1:1 - 132:3]
[1mClone found (rust)[22m
- [1m[32mrust/file1.rs[39m[22m [199:50 - 204:2] (6 lines, 51 tokens)
rust/file1.rs [255:53 - 260:2]
[1mClone found (rust)[22m
- [1m[32mrust/file1.rs[39m[22m [232:93 - 239:64] (8 lines, 58 tokens)
rust/file1.rs [247:47 - 254:64]
[1mClone found (rust)[22m
- [1m[32mrust/file1.rs[39m[22m [239:57 - 416:2] (178 lines, 1285 tokens)
rust/file2.rs [123:52 - 301:2]
[1mClone found (rust)[22m
- [1m[32mrust/file1.rs[39m[22m [263:28 - 273:12] (11 lines, 80 tokens)
rust/file1.rs [335:21 - 345:12]
[1mClone found (rust)[22m
- [1m[32mrust/file1.rs[39m[22m [319:60 - 332:2] (14 lines, 114 tokens)
rust/file1.rs [371:96 - 384:2]
[1mClone found (sas)[22m
- [1m[32msas/file1.sas[39m[22m [1:1 - 59:4] (59 lines, 444 tokens)
sas/file2.sas [1:1 - 59:4]
[1mClone found (sass)[22m
- [1m[32msass/file1.sass[39m[22m [1:1 - 19:17] (19 lines, 89 tokens)
sass/file2.sass [1:1 - 19:17]
[1mClone found (sass)[22m
- [1m[32msass/file1.sass[39m[22m [3:1 - 17:43] (15 lines, 82 tokens)
sass/file1.sass [19:1 - 33:43]
[1mClone found (sass)[22m
- [1m[32msass/file1.sass[39m[22m [5:1 - 24:45] (20 lines, 102 tokens)
sass/file2.sass [24:1 - 48:33]
[1mClone found (scheme)[22m
- [1m[32mscheme/file1.scm[39m[22m [1:1 - 33:23] (33 lines, 225 tokens)
scheme/file2.scm [1:1 - 33:23]
[1mClone found (bash)[22m
- [1m[32mshebang/build[39m[22m [1:1 - 32:2] (32 lines, 86 tokens)
shebang/deploy [1:1 - 32:2]
[1mClone found (bash)[22m
- [1m[32mshebang/build[39m[22m [1:1 - 32:2] (32 lines, 86 tokens)
shell/file1.sh [1:1 - 32:2]
[1mClone found (bash)[22m
- [1m[32mshebang/build[39m[22m [1:1 - 32:2] (32 lines, 86 tokens)
shell/file2.sh [1:1 - 32:2]
[1mClone found (python)[22m
- [1m[32mshebang/process[39m[22m [1:1 - 32:4] (32 lines, 159 tokens)
shebang/transform [1:1 - 32:4]
[1mClone found (smalltalk)[22m
- [1m[32msmalltalk/file1.st[39m[22m [1:1 - 45:2] (45 lines, 146 tokens)
smalltalk/file2.st [1:1 - 45:2]
[1mClone found (smarty)[22m
- [1m[32msmarty/file1.tpl[39m[22m [1:1 - 43:18] (43 lines, 286 tokens)
smarty/file2.tpl [1:1 - 43:18]
[1mClone found (solidity)[22m
- [1m[32msolidity/file1.sol[39m[22m [25:61 - 55:13] (31 lines, 168 tokens)
solidity/file2.sol [29:54 - 59:13]
[1mClone found (soy)[22m
- [1m[32msoy/file1.soy[39m[22m [1:1 - 49:27] (49 lines, 346 tokens)
soy/file2.soy [1:1 - 49:27]
[1mClone found (sparql)[22m
- [1m[32msparql/file1.rq[39m[22m [1:1 - 11:9] (11 lines, 65 tokens)
sparql/file2.rq [1:1 - 11:9]
[1mClone found (sql)[22m
- [1m[32msql/file1.sql[39m[22m [3:1 - 41:46] (39 lines, 214 tokens)
sql/file2.sql [3:1 - 41:46]
[1mClone found (stylus)[22m
- [1m[32mstylus/file1.styl[39m[22m [1:1 - 53:20] (53 lines, 201 tokens)
stylus/file2.styl [1:1 - 53:20]
[1mClone found (css)[22m
- [1m[32msvelte/component1.svelte:css[39m[22m [112:3 - 230:4] (119 lines, 507 tokens)
svelte/component2.svelte:css [112:3 - 230:4]
[1mClone found (html)[22m
- [1m[32msvelte/component1.svelte:html[39m[22m [1:1 - 231:9] (231 lines, 350 tokens)
svelte/component2.svelte:html [1:1 - 231:9]
[1mClone found (javascript)[22m
- [1m[32msvelte/component1.svelte:javascript[39m[22m [2:3 - 61:6] (60 lines, 286 tokens)
svelte/component2.svelte:javascript [2:3 - 61:6]
[1mClone found (swift)[22m
- [1m[32mswift/file1.swift[39m[22m [9:1 - 29:6] (21 lines, 73 tokens)
swift/file2.swift [2:1 - 22:6]
[1mClone found (tap)[22m
- [1m[32mtap/file1.tap[39m[22m [1:1 - 35:8] (35 lines, 202 tokens)
tap/file2.tap [1:1 - 35:8]
[1mClone found (tcl)[22m
- [1m[32mtcl/file1.tcl[39m[22m [1:1 - 45:2] (45 lines, 263 tokens)
tcl/file2.tcl [1:1 - 45:2]
[1mClone found (textile)[22m
- [1m[32mtextile/file1.textile[39m[22m [1:1 - 51:4] (51 lines, 236 tokens)
textile/file2.textile [1:1 - 51:4]
[1mClone found (toml)[22m
- [1m[32mtoml/file1.toml[39m[22m [1:1 - 39:19] (39 lines, 100 tokens)
toml/file2.toml [1:1 - 39:19]
[1mClone found (tt2)[22m
- [1m[32mtt2/file1.tt2[39m[22m [1:1 - 38:14] (38 lines, 299 tokens)
tt2/file2.tt2 [1:1 - 38:14]
[1mClone found (tt2)[22m
- [1m[32mtt2/file1.tt2[39m[22m [42:21 - 52:25] (11 lines, 54 tokens)
tt2/file2.tt2 [42:86 - 52:25]
[1mClone found (turtle)[22m
- [1m[32mturtle/file1.ttl[39m[22m [1:1 - 36:17] (36 lines, 212 tokens)
turtle/file2.ttl [1:1 - 36:17]
[1mClone found (twig)[22m
- [1m[32mtwig/file_1.twig[39m[22m [1:1 - 23:3] (23 lines, 167 tokens)
twig/file_2.twig [1:1 - 23:3]
[1mClone found (twig)[22m
- [1m[32mtwig/file_1.twig[39m[22m [13:20 - 25:9] (13 lines, 65 tokens)
twig/file_1.twig [16:8 - 28:9]
[1mClone found (twig)[22m
- [1m[32mtwig/file_1.twig[39m[22m [19:8 - 29:15] (11 lines, 54 tokens)
twig/file_2.twig [22:8 - 32:15]
[1mClone found (unrealscript)[22m
- [1m[32munrealscript/file1.uc[39m[22m [1:1 - 56:6] (56 lines, 161 tokens)
unrealscript/file2.uc [1:1 - 56:6]
[1mClone found (vbnet)[22m
- [1m[32mvb/file1.vb[39m[22m [1:1 - 29:17] (29 lines, 163 tokens)
vb/file2.vb [1:1 - 29:17]
[1mClone found (velocity)[22m
- [1m[32mvelocity/file1.vtl[39m[22m [1:1 - 41:25] (41 lines, 264 tokens)
velocity/file2.vtl [1:1 - 41:25]
[1mClone found (verilog)[22m
- [1m[32mverilog/file1.v[39m[22m [1:1 - 40:10] (40 lines, 163 tokens)
verilog/file2.v [1:1 - 40:10]
[1mClone found (vhdl)[22m
- [1m[32mvhdl/file1.vhd[39m[22m [1:1 - 32:18] (32 lines, 179 tokens)
vhdl/file2.vhd [1:1 - 32:18]
[1mClone found (typescript)[22m
- [1m[32mvue/app1.vue:typescript[39m[22m [5:1 - 33:4] (29 lines, 128 tokens)
vue/app2.vue:typescript [5:1 - 33:4]
[1mClone found (javascript)[22m
- [1m[32mvue/file.js[39m[22m [1:1 - 28:2] (28 lines, 210 tokens)
vue/file1.vue:javascript [125:3 - 152:4]
[1mClone found (html)[22m
- [1m[32mvue/file1.vue:html[39m[22m [1:1 - 10:9] (10 lines, 99 tokens)
vue/file2.vue:html [1:1 - 10:9]
[1mClone found (javascript)[22m
- [1m[32mvue/file1.vue:javascript[39m[22m [120:3 - 261:4] (142 lines, 817 tokens)
vue/file2.vue:javascript [99:3 - 240:4]
[1mClone found (scss)[22m
- [1m[32mvue/file1.vue:scss[39m[22m [13:3 - 75:6] (63 lines, 402 tokens)
vue/file2.vue:scss [13:3 - 75:6]
[1mClone found (scss)[22m
- [1m[32mvue/file1.vue:scss[39m[22m [95:5 - 117:4] (23 lines, 149 tokens)
vue/file2.vue:scss [74:5 - 96:4]
[1mClone found (wgsl)[22m
- [1m[32mwgsl/file1.wgsl[39m[22m [1:1 - 45:3] (45 lines, 274 tokens)
wgsl/file2.wgsl [1:1 - 45:3]
[1mClone found (wgsl)[22m
- [1m[32mwgsl/file1.wgsl[39m[22m [51:42 - 59:6] (9 lines, 66 tokens)
wgsl/file2.wgsl [55:47 - 63:6]
[1mClone found (markup)[22m
- [1m[32mxml/file1.svg[39m[22m [1:1 - 88:2] (88 lines, 392 tokens)
xml/file2.svg [1:1 - 87:6]
[1mClone found (markup)[22m
- [1m[32mxml/file1.xsl[39m[22m [1:1 - 43:6] (43 lines, 316 tokens)
xml/file2.xsl [1:1 - 43:2]
[1mClone found (markup)[22m
- [1m[32mxml/file1.xsl[39m[22m [20:15 - 35:6] (16 lines, 133 tokens)
xml/file1.xsl [32:137 - 47:2]
[1mClone found (xquery)[22m
- [1m[32mxquery/file1.xquery[39m[22m [1:1 - 31:22] (31 lines, 222 tokens)
xquery/file2.xquery [1:1 - 31:22]
[1mClone found (yaml)[22m
- [1m[32myaml/file1.yml[39m[22m [1:1 - 18:23] (18 lines, 132 tokens)
yaml/file2.yml [1:1 - 18:23]
[1mClone found (c)[22m
- [1m[32mz80/file1.z80[39m[22m [1:1 - 14:25] (14 lines, 60 tokens)
z80/file2.z80 [1:1 - 14:25]
[1mClone found (zig)[22m
- [1m[32mzig/file1.zig[39m[22m [1:1 - 43:10] (43 lines, 259 tokens)
zig/file2.zig [1:1 - 43:10]
[1mClone found (zig)[22m
- [1m[32mzig/file1.zig[39m[22m [42:45 - 52:23] (11 lines, 52 tokens)
zig/file2.zig [47:45 - 57:23]
[90m┌────────────────┬────────────────┬─────────────┬──────────────┬──────────────┬──────────────────┬───────────────────┐[39m
[90m│[39m[31m Format [39m[90m│[39m[31m Files analyzed [39m[90m│[39m[31m Total lines [39m[90m│[39m[31m Total tokens [39m[90m│[39m[31m Clones found [39m[90m│[39m[31m Duplicated lines [39m[90m│[39m[31m Duplicated tokens [39m[90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m actionscript [90m│[39m 2 [90m│[39m 75 [90m│[39m 302 [90m│[39m 1 [90m│[39m 29 (38.67%) [90m│[39m 127 (42.05%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m ada [90m│[39m 2 [90m│[39m 74 [90m│[39m 408 [90m│[39m 1 [90m│[39m 20 (27.03%) [90m│[39m 103 (25.25%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m antlr4 [90m│[39m 2 [90m│[39m 48 [90m│[39m 216 [90m│[39m 1 [90m│[39m 20 (41.67%) [90m│[39m 82 (37.96%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m apex [90m│[39m 2 [90m│[39m 84 [90m│[39m 451 [90m│[39m 1 [90m│[39m 23 (27.38%) [90m│[39m 115 (25.50%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m apl [90m│[39m 2 [90m│[39m 47 [90m│[39m 554 [90m│[39m 1 [90m│[39m 19 (40.43%) [90m│[39m 252 (45.49%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m aspnet [90m│[39m 2 [90m│[39m 101 [90m│[39m 854 [90m│[39m 3 [90m│[39m 37 (36.63%) [90m│[39m 296 (34.66%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m astro [90m│[39m 2 [90m│[39m 324 [90m│[39m 950 [90m│[39m 0 [90m│[39m 0 (0.00%) [90m│[39m 0 (0.00%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m awk [90m│[39m 2 [90m│[39m 62 [90m│[39m 205 [90m│[39m 1 [90m│[39m 22 (35.48%) [90m│[39m 75 (36.59%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m bash [90m│[39m 4 [90m│[39m 158 [90m│[39m 418 [90m│[39m 3 [90m│[39m 93 (58.86%) [90m│[39m 258 (61.72%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m basic [90m│[39m 2 [90m│[39m 47 [90m│[39m 331 [90m│[39m 1 [90m│[39m 17 (36.17%) [90m│[39m 100 (30.21%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m bicep [90m│[39m 2 [90m│[39m 81 [90m│[39m 251 [90m│[39m 1 [90m│[39m 26 (32.10%) [90m│[39m 78 (31.08%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m brainfuck [90m│[39m 4 [90m│[39m 159 [90m│[39m 1728 [90m│[39m 4 [90m│[39m 113 (71.07%) [90m│[39m 1289 (74.59%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m c [90m│[39m 5 [90m│[39m 105 [90m│[39m 1060 [90m│[39m 3 [90m│[39m 40 (38.10%) [90m│[39m 399 (37.64%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m c-header [90m│[39m 4 [90m│[39m 149 [90m│[39m 2091 [90m│[39m 3 [90m│[39m 59 (39.60%) [90m│[39m 724 (34.62%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m cfml [90m│[39m 2 [90m│[39m 107 [90m│[39m 671 [90m│[39m 1 [90m│[39m 17 (15.89%) [90m│[39m 85 (12.67%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m cfscript [90m│[39m 2 [90m│[39m 69 [90m│[39m 437 [90m│[39m 1 [90m│[39m 27 (39.13%) [90m│[39m 161 (36.84%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m clojure [90m│[39m 2 [90m│[39m 46 [90m│[39m 374 [90m│[39m 1 [90m│[39m 18 (39.13%) [90m│[39m 139 (37.17%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m cmake [90m│[39m 2 [90m│[39m 52 [90m│[39m 311 [90m│[39m 1 [90m│[39m 20 (38.46%) [90m│[39m 128 (41.16%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m coffeescript [90m│[39m 2 [90m│[39m 92 [90m│[39m 447 [90m│[39m 2 [90m│[39m 40 (43.48%) [90m│[39m 219 (48.99%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m cpp [90m│[39m 2 [90m│[39m 176 [90m│[39m 1514 [90m│[39m 2 [90m│[39m 106 (60.23%) [90m│[39m 965 (63.74%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m cpp-header [90m│[39m 2 [90m│[39m 176 [90m│[39m 1514 [90m│[39m 2 [90m│[39m 106 (60.23%) [90m│[39m 965 (63.74%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m crystal [90m│[39m 2 [90m│[39m 70 [90m│[39m 222 [90m│[39m 1 [90m│[39m 28 (40.00%) [90m│[39m 97 (43.69%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m csharp [90m│[39m 2 [90m│[39m 360 [90m│[39m 1099 [90m│[39m 2 [90m│[39m 172 (47.78%) [90m│[39m 537 (48.86%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m css [90m│[39m 8 [90m│[39m 875 [90m│[39m 2536 [90m│[39m 5 [90m│[39m 290 (33.14%) [90m│[39m 1494 (58.91%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m csv [90m│[39m 2 [90m│[39m 22 [90m│[39m 400 [90m│[39m 1 [90m│[39m 8 (36.36%) [90m│[39m 163 (40.75%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m d [90m│[39m 2 [90m│[39m 338 [90m│[39m 2270 [90m│[39m 1 [90m│[39m 168 (49.70%) [90m│[39m 1135 (50.00%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m dart [90m│[39m 2 [90m│[39m 266 [90m│[39m 1178 [90m│[39m 2 [90m│[39m 118 (44.36%) [90m│[39m 522 (44.31%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m diff [90m│[39m 2 [90m│[39m 146 [90m│[39m 1082 [90m│[39m 1 [90m│[39m 61 (41.78%) [90m│[39m 435 (40.20%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m dot [90m│[39m 2 [90m│[39m 46 [90m│[39m 243 [90m│[39m 1 [90m│[39m 17 (36.96%) [90m│[39m 91 (37.45%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m eiffel [90m│[39m 2 [90m│[39m 126 [90m│[39m 380 [90m│[39m 1 [90m│[39m 45 (35.71%) [90m│[39m 130 (34.21%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m elm [90m│[39m 2 [90m│[39m 110 [90m│[39m 411 [90m│[39m 1 [90m│[39m 46 (41.82%) [90m│[39m 155 (37.71%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m erlang [90m│[39m 2 [90m│[39m 242 [90m│[39m 1674 [90m│[39m 1 [90m│[39m 120 (49.59%) [90m│[39m 837 (50.00%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m fortran [90m│[39m 2 [90m│[39m 93 [90m│[39m 469 [90m│[39m 1 [90m│[39m 36 (38.71%) [90m│[39m 182 (38.81%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m fsharp [90m│[39m 2 [90m│[39m 82 [90m│[39m 462 [90m│[39m 1 [90m│[39m 34 (41.46%) [90m│[39m 193 (41.77%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m gdscript [90m│[39m 2 [90m│[39m 96 [90m│[39m 458 [90m│[39m 1 [90m│[39m 24 (25.00%) [90m│[39m 135 (29.48%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m gettext [90m│[39m 2 [90m│[39m 220 [90m│[39m 356 [90m│[39m 1 [90m│[39m 51 (23.18%) [90m│[39m 82 (23.03%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m gherkin [90m│[39m 2 [90m│[39m 75 [90m│[39m 434 [90m│[39m 1 [90m│[39m 15 (20.00%) [90m│[39m 83 (19.12%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m go [90m│[39m 2 [90m│[39m 65 [90m│[39m 305 [90m│[39m 1 [90m│[39m 29 (44.62%) [90m│[39m 134 (43.93%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m graphql [90m│[39m 2 [90m│[39m 134 [90m│[39m 499 [90m│[39m 1 [90m│[39m 24 (17.91%) [90m│[39m 143 (28.66%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m groovy [90m│[39m 2 [90m│[39m 96 [90m│[39m 422 [90m│[39m 1 [90m│[39m 40 (41.67%) [90m│[39m 188 (44.55%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m haml [90m│[39m 2 [90m│[39m 52 [90m│[39m 276 [90m│[39m 1 [90m│[39m 22 (42.31%) [90m│[39m 118 (42.75%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m handlebars [90m│[39m 2 [90m│[39m 72 [90m│[39m 555 [90m│[39m 1 [90m│[39m 27 (37.50%) [90m│[39m 218 (39.28%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m haskell [90m│[39m 4 [90m│[39m 459 [90m│[39m 2536 [90m│[39m 3 [90m│[39m 216 (47.06%) [90m│[39m 1183 (46.65%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m haxe [90m│[39m 4 [90m│[39m 191 [90m│[39m 1035 [90m│[39m 3 [90m│[39m 113 (59.16%) [90m│[39m 634 (61.26%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m hcl [90m│[39m 2 [90m│[39m 119 [90m│[39m 313 [90m│[39m 1 [90m│[39m 36 (30.25%) [90m│[39m 85 (27.16%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m html [90m│[39m 6 [90m│[39m 1289 [90m│[39m 1390 [90m│[39m 4 [90m│[39m 406 (31.50%) [90m│[39m 762 (54.82%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m idris [90m│[39m 2 [90m│[39m 88 [90m│[39m 581 [90m│[39m 1 [90m│[39m 34 (38.64%) [90m│[39m 208 (35.80%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m ignore [90m│[39m 2 [90m│[39m 191 [90m│[39m 523 [90m│[39m 1 [90m│[39m 83 (43.46%) [90m│[39m 234 (44.74%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m ini [90m│[39m 2 [90m│[39m 58 [90m│[39m 172 [90m│[39m 1 [90m│[39m 26 (44.83%) [90m│[39m 79 (45.93%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m java [90m│[39m 2 [90m│[39m 454 [90m│[39m 15064 [90m│[39m 2 [90m│[39m 224 (49.34%) [90m│[39m 7387 (49.04%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m javascript [90m│[39m 23 [90m│[39m 1580 [90m│[39m 6985 [90m│[39m 13 [90m│[39m 572 (36.20%) [90m│[39m 3475 (49.75%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m json [90m│[39m 4 [90m│[39m 134 [90m│[39m 460 [90m│[39m 2 [90m│[39m 38 (28.36%) [90m│[39m 134 (29.13%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m json5 [90m│[39m 2 [90m│[39m 104 [90m│[39m 307 [90m│[39m 1 [90m│[39m 30 (28.85%) [90m│[39m 93 (30.29%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m jsx [90m│[39m 2 [90m│[39m 73 [90m│[39m 296 [90m│[39m 1 [90m│[39m 20 (27.40%) [90m│[39m 99 (33.45%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m julia [90m│[39m 2 [90m│[39m 76 [90m│[39m 557 [90m│[39m 1 [90m│[39m 29 (38.16%) [90m│[39m 194 (34.83%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m kotlin [90m│[39m 2 [90m│[39m 106 [90m│[39m 550 [90m│[39m 2 [90m│[39m 47 (44.34%) [90m│[39m 250 (45.45%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m latex [90m│[39m 2 [90m│[39m 88 [90m│[39m 557 [90m│[39m 1 [90m│[39m 25 (28.41%) [90m│[39m 149 (26.75%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m less [90m│[39m 2 [90m│[39m 56 [90m│[39m 518 [90m│[39m 2 [90m│[39m 29 (51.79%) [90m│[39m 282 (54.44%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m lilypond [90m│[39m 2 [90m│[39m 100 [90m│[39m 307 [90m│[39m 1 [90m│[39m 18 (18.00%) [90m│[39m 63 (20.52%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m linker-script [90m│[39m 2 [90m│[39m 133 [90m│[39m 683 [90m│[39m 1 [90m│[39m 46 (34.59%) [90m│[39m 256 (37.48%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m lisp [90m│[39m 2 [90m│[39m 106 [90m│[39m 608 [90m│[39m 1 [90m│[39m 49 (46.23%) [90m│[39m 289 (47.53%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m livescript [90m│[39m 2 [90m│[39m 68 [90m│[39m 344 [90m│[39m 1 [90m│[39m 30 (44.12%) [90m│[39m 145 (42.15%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m llvm [90m│[39m 2 [90m│[39m 132 [90m│[39m 850 [90m│[39m 1 [90m│[39m 34 (25.76%) [90m│[39m 215 (25.29%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m log [90m│[39m 2 [90m│[39m 30 [90m│[39m 666 [90m│[39m 1 [90m│[39m 12 (40.00%) [90m│[39m 262 (39.34%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m lua [90m│[39m 2 [90m│[39m 106 [90m│[39m 450 [90m│[39m 1 [90m│[39m 45 (42.45%) [90m│[39m 193 (42.89%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m markdown [90m│[39m 4 [90m│[39m 536 [90m│[39m 929 [90m│[39m 3 [90m│[39m 262 (48.88%) [90m│[39m 1407 (151.45%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m markup [90m│[39m 11 [90m│[39m 478 [90m│[39m 2795 [90m│[39m 6 [90m│[39m 205 (42.89%) [90m│[39m 1314 (47.01%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m nsis [90m│[39m 2 [90m│[39m 68 [90m│[39m 172 [90m│[39m 1 [90m│[39m 28 (41.18%) [90m│[39m 71 (41.28%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m objectivec [90m│[39m 2 [90m│[39m 152 [90m│[39m 1463 [90m│[39m 2 [90m│[39m 61 (40.13%) [90m│[39m 527 (36.02%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m ocaml [90m│[39m 6 [90m│[39m 186 [90m│[39m 1052 [90m│[39m 3 [90m│[39m 80 (43.01%) [90m│[39m 440 (41.83%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m openqasm [90m│[39m 2 [90m│[39m 87 [90m│[39m 346 [90m│[39m 1 [90m│[39m 18 (20.69%) [90m│[39m 92 (26.59%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m oz [90m│[39m 2 [90m│[39m 94 [90m│[39m 357 [90m│[39m 1 [90m│[39m 36 (38.30%) [90m│[39m 141 (39.50%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m pascal [90m│[39m 2 [90m│[39m 106 [90m│[39m 561 [90m│[39m 1 [90m│[39m 36 (33.96%) [90m│[39m 203 (36.19%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m perl [90m│[39m 4 [90m│[39m 609 [90m│[39m 2272 [90m│[39m 3 [90m│[39m 274 (44.99%) [90m│[39m 971 (42.74%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m php [90m│[39m 2 [90m│[39m 143 [90m│[39m 785 [90m│[39m 1 [90m│[39m 50 (34.97%) [90m│[39m 295 (37.58%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m plant-uml [90m│[39m 2 [90m│[39m 120 [90m│[39m 422 [90m│[39m 1 [90m│[39m 51 (42.50%) [90m│[39m 181 (42.89%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m plsql [90m│[39m 2 [90m│[39m 171 [90m│[39m 598 [90m│[39m 2 [90m│[39m 70 (40.94%) [90m│[39m 244 (40.80%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m powerquery [90m│[39m 2 [90m│[39m 112 [90m│[39m 538 [90m│[39m 1 [90m│[39m 40 (35.71%) [90m│[39m 210 (39.03%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m powershell [90m│[39m 2 [90m│[39m 98 [90m│[39m 404 [90m│[39m 1 [90m│[39m 40 (40.82%) [90m│[39m 168 (41.58%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m prolog [90m│[39m 2 [90m│[39m 64 [90m│[39m 429 [90m│[39m 1 [90m│[39m 27 (42.19%) [90m│[39m 176 (41.03%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m properties [90m│[39m 2 [90m│[39m 48 [90m│[39m 250 [90m│[39m 1 [90m│[39m 21 (43.75%) [90m│[39m 114 (45.60%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m protobuf [90m│[39m 2 [90m│[39m 205 [90m│[39m 680 [90m│[39m 1 [90m│[39m 39 (19.02%) [90m│[39m 115 (16.91%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m pug [90m│[39m 2 [90m│[39m 574 [90m│[39m 2512 [90m│[39m 2 [90m│[39m 285 (49.65%) [90m│[39m 1249 (49.72%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m puppet [90m│[39m 2 [90m│[39m 122 [90m│[39m 446 [90m│[39m 2 [90m│[39m 58 (47.54%) [90m│[39m 214 (47.98%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m purescript [90m│[39m 2 [90m│[39m 115 [90m│[39m 797 [90m│[39m 2 [90m│[39m 49 (42.61%) [90m│[39m 315 (39.52%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m python [90m│[39m 6 [90m│[39m 323 [90m│[39m 911 [90m│[39m 3 [90m│[39m 73 (22.60%) [90m│[39m 363 (39.85%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m q [90m│[39m 2 [90m│[39m 78 [90m│[39m 997 [90m│[39m 1 [90m│[39m 29 (37.18%) [90m│[39m 378 (37.91%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m qsharp [90m│[39m 2 [90m│[39m 102 [90m│[39m 408 [90m│[39m 1 [90m│[39m 9 (8.82%) [90m│[39m 50 (12.25%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m r [90m│[39m 2 [90m│[39m 128 [90m│[39m 854 [90m│[39m 1 [90m│[39m 63 (49.22%) [90m│[39m 427 (50.00%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m racket [90m│[39m 2 [90m│[39m 100 [90m│[39m 760 [90m│[39m 1 [90m│[39m 37 (37.00%) [90m│[39m 286 (37.63%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m rescript [90m│[39m 2 [90m│[39m 115 [90m│[39m 776 [90m│[39m 1 [90m│[39m 37 (32.17%) [90m│[39m 200 (25.77%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m robotframework [90m│[39m 2 [90m│[39m 130 [90m│[39m 630 [90m│[39m 2 [90m│[39m 43 (33.08%) [90m│[39m 223 (35.40%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m ruby [90m│[39m 2 [90m│[39m 80 [90m│[39m 192 [90m│[39m 1 [90m│[39m 39 (48.75%) [90m│[39m 96 (50.00%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m rust [90m│[39m 2 [90m│[39m 717 [90m│[39m 5128 [90m│[39m 6 [90m│[39m 342 (47.70%) [90m│[39m 2445 (47.68%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m sas [90m│[39m 2 [90m│[39m 152 [90m│[39m 1174 [90m│[39m 1 [90m│[39m 58 (38.16%) [90m│[39m 444 (37.82%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m sass [90m│[39m 2 [90m│[39m 93 [90m│[39m 383 [90m│[39m 3 [90m│[39m 51 (54.84%) [90m│[39m 273 (71.28%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m scala [90m│[39m 2 [90m│[39m 58 [90m│[39m 1696 [90m│[39m 1 [90m│[39m 28 (48.28%) [90m│[39m 848 (50.00%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m scheme [90m│[39m 2 [90m│[39m 70 [90m│[39m 498 [90m│[39m 1 [90m│[39m 32 (45.71%) [90m│[39m 225 (45.18%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m scss [90m│[39m 4 [90m│[39m 360 [90m│[39m 2065 [90m│[39m 3 [90m│[39m 136 (37.78%) [90m│[39m 875 (42.37%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m smalltalk [90m│[39m 2 [90m│[39m 102 [90m│[39m 351 [90m│[39m 1 [90m│[39m 44 (43.14%) [90m│[39m 146 (41.60%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m smarty [90m│[39m 2 [90m│[39m 92 [90m│[39m 652 [90m│[39m 1 [90m│[39m 42 (45.65%) [90m│[39m 286 (43.87%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m solidity [90m│[39m 2 [90m│[39m 155 [90m│[39m 939 [90m│[39m 1 [90m│[39m 30 (19.35%) [90m│[39m 168 (17.89%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m soy [90m│[39m 2 [90m│[39m 106 [90m│[39m 841 [90m│[39m 1 [90m│[39m 48 (45.28%) [90m│[39m 346 (41.14%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m sparql [90m│[39m 2 [90m│[39m 54 [90m│[39m 296 [90m│[39m 1 [90m│[39m 10 (18.52%) [90m│[39m 65 (21.96%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m sql [90m│[39m 2 [90m│[39m 102 [90m│[39m 525 [90m│[39m 1 [90m│[39m 38 (37.25%) [90m│[39m 214 (40.76%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m stylus [90m│[39m 2 [90m│[39m 129 [90m│[39m 494 [90m│[39m 1 [90m│[39m 52 (40.31%) [90m│[39m 201 (40.69%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m svelte [90m│[39m 2 [90m│[39m 462 [90m│[39m 1586 [90m│[39m 0 [90m│[39m 0 (0.00%) [90m│[39m 0 (0.00%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m swift [90m│[39m 2 [90m│[39m 58 [90m│[39m 175 [90m│[39m 1 [90m│[39m 20 (34.48%) [90m│[39m 73 (41.71%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m tap [90m│[39m 2 [90m│[39m 98 [90m│[39m 562 [90m│[39m 1 [90m│[39m 34 (34.69%) [90m│[39m 202 (35.94%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m tcl [90m│[39m 2 [90m│[39m 106 [90m│[39m 600 [90m│[39m 1 [90m│[39m 44 (41.51%) [90m│[39m 263 (43.83%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m text [90m│[39m 2 [90m│[39m 354 [90m│[39m 143 [90m│[39m 1 [90m│[39m 10 (2.82%) [90m│[39m 69 (48.25%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m textile [90m│[39m 2 [90m│[39m 106 [90m│[39m 495 [90m│[39m 1 [90m│[39m 50 (47.17%) [90m│[39m 236 (47.68%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m toml [90m│[39m 2 [90m│[39m 91 [90m│[39m 229 [90m│[39m 1 [90m│[39m 38 (41.76%) [90m│[39m 100 (43.67%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m tsx [90m│[39m 2 [90m│[39m 76 [90m│[39m 310 [90m│[39m 1 [90m│[39m 34 (44.74%) [90m│[39m 143 (46.13%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m tt2 [90m│[39m 2 [90m│[39m 104 [90m│[39m 803 [90m│[39m 2 [90m│[39m 47 (45.19%) [90m│[39m 353 (43.96%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m turtle [90m│[39m 2 [90m│[39m 90 [90m│[39m 520 [90m│[39m 1 [90m│[39m 35 (38.89%) [90m│[39m 212 (40.77%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m twig [90m│[39m 2 [90m│[39m 61 [90m│[39m 424 [90m│[39m 3 [90m│[39m 44 (72.13%) [90m│[39m 286 (67.45%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m txt [90m│[39m 4 [90m│[39m 146 [90m│[39m 870 [90m│[39m 2 [90m│[39m 71 (48.63%) [90m│[39m 435 (50.00%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m typescript [90m│[39m 12 [90m│[39m 2159 [90m│[39m 9379 [90m│[39m 8 [90m│[39m 958 (44.37%) [90m│[39m 4688 (49.98%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m unrealscript [90m│[39m 2 [90m│[39m 166 [90m│[39m 520 [90m│[39m 1 [90m│[39m 55 (33.13%) [90m│[39m 161 (30.96%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m vbnet [90m│[39m 2 [90m│[39m 72 [90m│[39m 378 [90m│[39m 1 [90m│[39m 28 (38.89%) [90m│[39m 163 (43.12%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m velocity [90m│[39m 2 [90m│[39m 88 [90m│[39m 576 [90m│[39m 1 [90m│[39m 40 (45.45%) [90m│[39m 264 (45.83%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m verilog [90m│[39m 2 [90m│[39m 104 [90m│[39m 430 [90m│[39m 1 [90m│[39m 39 (37.50%) [90m│[39m 163 (37.91%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m vhdl [90m│[39m 2 [90m│[39m 98 [90m│[39m 546 [90m│[39m 1 [90m│[39m 31 (31.63%) [90m│[39m 179 (32.78%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m vue [90m│[39m 4 [90m│[39m 587 [90m│[39m 3333 [90m│[39m 0 [90m│[39m 0 (0.00%) [90m│[39m 0 (0.00%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m wgsl [90m│[39m 2 [90m│[39m 127 [90m│[39m 928 [90m│[39m 2 [90m│[39m 52 (40.94%) [90m│[39m 340 (36.64%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m wolfram [90m│[39m 2 [90m│[39m 85 [90m│[39m 697 [90m│[39m 1 [90m│[39m 16 (18.82%) [90m│[39m 127 (18.22%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m xquery [90m│[39m 2 [90m│[39m 80 [90m│[39m 640 [90m│[39m 1 [90m│[39m 30 (37.50%) [90m│[39m 222 (34.69%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m yaml [90m│[39m 6 [90m│[39m 262 [90m│[39m 554 [90m│[39m 2 [90m│[39m 45 (17.18%) [90m│[39m 192 (34.66%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m zig [90m│[39m 2 [90m│[39m 130 [90m│[39m 827 [90m│[39m 2 [90m│[39m 52 (40.00%) [90m│[39m 311 (37.61%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m [1mTotal:[22m [90m│[39m 347 [90m│[39m 24603 [90m│[39m 130473 [90m│[39m 212 [90m│[39m 9133 (37.12%) [90m│[39m 56491 (43.30%) [90m│[39m
[90m└────────────────┴────────────────┴─────────────┴──────────────┴──────────────┴──────────────────┴───────────────────┘[39m
[90mFound 212 clones.[39m
[90mtime: 42.279ms[39m
[90m💡 Auto-refactor with AI: [1m[39mnpx skills add https://github.com/kucherenko/jscpd --skill dry-refactoring[90m[22m
[90m🎩 New: Gangsta Agents — discipline your AI coding → gangsta.page[39m
[90m💖 Support jscpd project → https://opencollective.com/jscpd[39m command (bin field
declares only jscpd). The [1mClone found (actionscript)[22m
- [1m[32mactionscript/file1.as[39m[22m [1:1 - 30:10] (30 lines, 127 tokens)
actionscript/file2.as [1:1 - 30:10]
[1mClone found (ada)[22m
- [1m[32mada/file1.ada[39m[22m [1:1 - 21:12] (21 lines, 103 tokens)
ada/file2.ada [1:1 - 21:12]
[1mClone found (antlr4)[22m
- [1m[32mantlr4/file1.g4[39m[22m [1:1 - 21:27] (21 lines, 82 tokens)
antlr4/file2.g4 [1:1 - 21:27]
[1mClone found (apex)[22m
- [1m[32mapex/file1.cls[39m[22m [1:29 - 24:18] (24 lines, 115 tokens)
apex/file2.cls [1:29 - 24:18]
[1mClone found (apl)[22m
- [1m[32mapl/file1.apl[39m[22m [1:1 - 20:54] (20 lines, 252 tokens)
apl/file2.apl [1:1 - 20:54]
[1mClone found (css)[22m
- [1m[32mastro/component1.astro:css[39m[22m [76:3 - 161:4] (86 lines, 364 tokens)
astro/component2.astro:css [76:3 - 161:4]
[1mClone found (css)[22m
- [1m[32mastro/component1.astro:css[39m[22m [79:23 - 124:12] (46 lines, 194 tokens)
svelte/component1.svelte:css [116:28 - 161:12]
[1mClone found (html)[22m
- [1m[32mastro/component1.astro:html[39m[22m [1:1 - 162:9] (162 lines, 246 tokens)
astro/component2.astro:html [1:1 - 162:9]
[1mClone found (html)[22m
- [1m[32mastro/component1.astro:html[39m[22m [27:1 - 33:8] (7 lines, 67 tokens)
svelte/component1.svelte:html [64:1 - 70:8]
[1mClone found (javascript)[22m
- [1m[32mastro/component1.astro:javascript[39m[22m [58:3 - 72:4] (15 lines, 111 tokens)
astro/component2.astro:javascript [58:3 - 72:4]
[1mClone found (typescript)[22m
- [1m[32mastro/component1.astro:typescript[39m[22m [2:1 - 24:4] (23 lines, 153 tokens)
astro/component2.astro:typescript [2:1 - 24:4]
[1mClone found (awk)[22m
- [1m[32mawk/file1.awk[39m[22m [1:1 - 23:33] (23 lines, 75 tokens)
awk/file2.awk [1:1 - 23:33]
[1mClone found (basic)[22m
- [1m[32mbasic/file1.bas[39m[22m [1:1 - 18:4] (18 lines, 100 tokens)
basic/file2.bas [1:1 - 18:4]
[1mClone found (bicep)[22m
- [1m[32mbicep/file1.bicep[39m[22m [1:1 - 27:9] (27 lines, 78 tokens)
bicep/file2.bicep [1:1 - 27:9]
[1mClone found (brainfuck)[22m
- [1m[32mbrainfuck/file1.b[39m[22m [1:1 - 26:77] (26 lines, 268 tokens)
brainfuck/file1.bf [1:1 - 26:77]
[1mClone found (brainfuck)[22m
- [1m[32mbrainfuck/file1.b[39m[22m [1:1 - 41:59] (41 lines, 439 tokens)
brainfuck/file2.b [1:1 - 41:59]
[1mClone found (brainfuck)[22m
- [1m[32mbrainfuck/file1.b[39m[22m [1:1 - 41:59] (41 lines, 439 tokens)
brainfuck/file2.bf [1:1 - 41:59]
[1mClone found (brainfuck)[22m
- [1m[32mbrainfuck/file1.b[39m[22m [33:1 - 41:59] (9 lines, 143 tokens)
brainfuck/file1.bf [28:1 - 36:59]
[1mClone found (cfml)[22m
- [1m[32mcfml/file1.cfm[39m[22m [4:20 - 21:2] (18 lines, 85 tokens)
cfml/file2.cfm [4:18 - 21:2]
[1mClone found (cfscript)[22m
- [1m[32mcfscript/file1.cfc[39m[22m [1:1 - 28:11] (28 lines, 161 tokens)
cfscript/file2.cfc [1:1 - 28:11]
[1mClone found (c)[22m
- [1m[32mclike/file1.c[39m[22m [1:1 - 17:4] (17 lines, 258 tokens)
clike/file2.c [1:1 - 17:4]
[1mClone found (c)[22m
- [1m[32mclike/file1.c[39m[22m [8:3 - 19:2] (12 lines, 81 tokens)
clike/file2.c [18:3 - 29:2]
[1mClone found (cpp)[22m
- [1m[32mclike/file1.cpp[39m[22m [1:1 - 88:7] (88 lines, 757 tokens)
clike/file2.cpp [1:1 - 88:7]
[1mClone found (cpp)[22m
- [1m[32mclike/file1.cpp[39m[22m [24:5 - 43:51] (20 lines, 208 tokens)
clike/file1.cpp [45:5 - 64:51]
[1mClone found (csharp)[22m
- [1m[32mclike/file1.cs[39m[22m [1:1 - 91:19] (91 lines, 235 tokens)
clike/file2.cs [1:1 - 91:19]
[1mClone found (csharp)[22m
- [1m[32mclike/file1.cs[39m[22m [103:9 - 185:2] (83 lines, 302 tokens)
clike/file2.cs [93:9 - 175:2]
[1mClone found (c-header)[22m
- [1m[32mclike/file1.h[39m[22m [1:1 - 17:4] (17 lines, 258 tokens)
clike/file2.h [1:1 - 17:4]
[1mClone found (c-header)[22m
- [1m[32mclike/file1.h[39m[22m [8:3 - 19:2] (12 lines, 81 tokens)
clike/file2.h [18:3 - 29:2]
[1mClone found (cpp-header)[22m
- [1m[32mclike/file1.hpp[39m[22m [1:1 - 88:7] (88 lines, 757 tokens)
clike/file2.hpp [1:1 - 88:7]
[1mClone found (cpp-header)[22m
- [1m[32mclike/file1.hpp[39m[22m [24:5 - 43:51] (20 lines, 208 tokens)
clike/file1.hpp [45:5 - 64:51]
[1mClone found (java)[22m
- [1m[32mclike/file1.java[39m[22m [1:1 - 186:6] (186 lines, 6601 tokens)
clike/file2.java [1:1 - 186:6]
[1mClone found (java)[22m
- [1m[32mclike/file1.java[39m[22m [182:51 - 221:2] (40 lines, 786 tokens)
clike/file2.java [194:52 - 233:2]
[1mClone found (kotlin)[22m
- [1m[32mclike/file1.kt[39m[22m [1:1 - 33:6] (33 lines, 186 tokens)
clike/file2.kt [1:1 - 33:6]
[1mClone found (kotlin)[22m
- [1m[32mclike/file1.kt[39m[22m [38:5 - 53:2] (16 lines, 64 tokens)
clike/file2.kt [38:5 - 53:2]
[1mClone found (scala)[22m
- [1m[32mclike/file1.scala[39m[22m [1:1 - 29:2] (29 lines, 848 tokens)
clike/file2.scala [1:1 - 29:2]
[1mClone found (clojure)[22m
- [1m[32mclojure/file1.clj[39m[22m [2:3 - 20:23] (19 lines, 139 tokens)
clojure/file2.clj [2:3 - 20:23]
[1mClone found (cmake)[22m
- [1m[32mcmake/file1.cmake[39m[22m [1:1 - 21:14] (21 lines, 128 tokens)
cmake/file2.cmake [1:1 - 21:14]
[1mClone found (coffeescript)[22m
- [1m[32mcoffeescript/file1.coffee[39m[22m [1:1 - 13:22] (13 lines, 75 tokens)
coffeescript/file2.coffee [3:1 - 15:22]
[1mClone found (coffeescript)[22m
- [1m[32mcoffeescript/file1.coffee[39m[22m [16:1 - 44:21] (29 lines, 144 tokens)
coffeescript/file1.coffee [46:1 - 74:21]
[1mClone found (lisp)[22m
- [1m[32mcommonlisp/file1.el[39m[22m [1:1 - 50:23] (50 lines, 289 tokens)
commonlisp/file2.el [1:1 - 50:23]
[1mClone found (crystal)[22m
- [1m[32mcrystal/file1.cr[39m[22m [1:1 - 29:4] (29 lines, 97 tokens)
crystal/file2.cr [1:1 - 29:4]
[1mClone found (css)[22m
- [1m[32mcss/file1.css[39m[22m [1:1 - 25:2] (25 lines, 237 tokens)
css/file10.css [1:1 - 25:2]
[1mClone found (css)[22m
- [1m[32mcss/file1.css[39m[22m [1:1 - 19:36] (19 lines, 192 tokens)
css/file2.css [1:1 - 19:36]
[1mClone found (less)[22m
- [1m[32mcss/file1.less[39m[22m [1:1 - 19:36] (19 lines, 192 tokens)
css/file2.less [1:1 - 19:36]
[1mClone found (less)[22m
- [1m[32mcss/file1.less[39m[22m [14:35 - 25:2] (12 lines, 90 tokens)
css/file1.less [24:5 - 36:2]
[1mClone found (scss)[22m
- [1m[32mcss/file1.scss[39m[22m [1:1 - 53:2] (53 lines, 324 tokens)
css/file2.scss [1:1 - 53:2]
[1mClone found (csv)[22m
- [1m[32mcsv/file1.csv[39m[22m [1:1 - 9:56] (9 lines, 163 tokens)
csv/file2.csv [1:1 - 9:56]
[1mClone found (d)[22m
- [1m[32md/file1.d[39m[22m [1:1 - 169:6] (169 lines, 1135 tokens)
d/file2.d [1:1 - 169:6]
[1mClone found (dart)[22m
- [1m[32mdart/file1.dart[39m[22m [1:1 - 89:4] (89 lines, 403 tokens)
dart/file2.dart [1:1 - 89:4]
[1mClone found (dart)[22m
- [1m[32mdart/file1.dart[39m[22m [118:15 - 148:2] (31 lines, 119 tokens)
dart/file2.dart [88:6 - 118:2]
[1mClone found (diff)[22m
- [1m[32mdiff/file1.diff[39m[22m [1:1 - 62:7] (62 lines, 435 tokens)
diff/file2.diff [1:1 - 62:7]
[1mClone found (dot)[22m
- [1m[32mdot/file1.dot[39m[22m [1:1 - 18:21] (18 lines, 91 tokens)
dot/file2.dot [1:1 - 18:21]
[1mClone found (eiffel)[22m
- [1m[32meiffel/file1.e[39m[22m [1:1 - 46:11] (46 lines, 130 tokens)
eiffel/file2.e [1:1 - 46:11]
[1mClone found (elm)[22m
- [1m[32melm/file1.elm[39m[22m [1:1 - 47:23] (47 lines, 155 tokens)
elm/file2.elm [1:1 - 47:23]
[1mClone found (erlang)[22m
- [1m[32merlang/file1.erl[39m[22m [1:1 - 121:7] (121 lines, 837 tokens)
erlang/file2.erl [1:1 - 121:7]
[1mClone found (javascript)[22m
- [1m[32mfolder1/file_1.js[39m[22m [4:1 - 55:3] (52 lines, 339 tokens)
javascript/file_1.cjs [4:1 - 55:3]
[1mClone found (javascript)[22m
- [1m[32mfolder1/file_1.js[39m[22m [4:1 - 55:3] (52 lines, 339 tokens)
javascript/file_1.js [4:1 - 55:3]
[1mClone found (javascript)[22m
- [1m[32mfolder1/file_1.js[39m[22m [4:1 - 55:3] (52 lines, 339 tokens)
javascript/file_1.mjs [4:1 - 55:3]
[1mClone found (javascript)[22m
- [1m[32mfolder1/file_1.js[39m[22m [4:1 - 55:3] (52 lines, 339 tokens)
javascript/file_3.js [1:1 - 52:3]
[1mClone found (javascript)[22m
- [1m[32mfolder1/file_1.js[39m[22m [28:1 - 55:3] (28 lines, 169 tokens)
folder2/file_2.js [1:1 - 28:3]
[1mClone found (javascript)[22m
- [1m[32mfolder1/file_1.js[39m[22m [28:1 - 55:3] (28 lines, 169 tokens)
folder2/file_2.js [29:1 - 56:3]
[1mClone found (fortran)[22m
- [1m[32mfortran/file1.f[39m[22m [1:7 - 37:21] (37 lines, 182 tokens)
fortran/file2.f [1:7 - 37:21]
[1mClone found (gdscript)[22m
- [1m[32mgdscript/file1.gd[39m[22m [22:1 - 46:18] (25 lines, 135 tokens)
gdscript/file2.gd [22:1 - 46:18]
[1mClone found (gettext)[22m
- [1m[32mgettext/file1.po[39m[22m [13:1 - 64:7] (52 lines, 82 tokens)
gettext/file2.po [13:1 - 64:7]
[1mClone found (gherkin)[22m
- [1m[32mgherkin/file1.feature[39m[22m [1:1 - 16:26] (16 lines, 83 tokens)
gherkin/file2.feature [1:1 - 16:26]
[1mClone found (ignore)[22m
- [1m[32mgitignore/file1.gitignore[39m[22m [1:1 - 84:16] (84 lines, 234 tokens)
gitignore/file2.gitignore [1:1 - 84:16]
[1mClone found (go)[22m
- [1m[32mgo/file1.go[39m[22m [1:1 - 30:5] (30 lines, 134 tokens)
go/file2.go [1:1 - 31:5]
[1mClone found (graphql)[22m
- [1m[32mgraphql/file1.graphql[39m[22m [1:1 - 25:5] (25 lines, 143 tokens)
graphql/file2.graphql [1:1 - 25:5]
[1mClone found (groovy)[22m
- [1m[32mgroovy/file1.groovy[39m[22m [1:1 - 41:6] (41 lines, 188 tokens)
groovy/file2.groovy [1:1 - 41:6]
[1mClone found (haml)[22m
- [1m[32mhaml/file1.haml[39m[22m [1:1 - 23:18] (23 lines, 118 tokens)
haml/file2.haml [1:1 - 23:18]
[1mClone found (handlebars)[22m
- [1m[32mhandlebars/file1.hbs[39m[22m [1:1 - 28:27] (28 lines, 218 tokens)
handlebars/file2.hbs [1:1 - 28:27]
[1mClone found (haskell)[22m
- [1m[32mhaskell-literate/file1.lhs[39m[22m [1:1 - 31:2] (31 lines, 182 tokens)
haskell-literate/file2.lhs [1:1 - 31:2]
[1mClone found (haskell)[22m
- [1m[32mhaskell/file1.hs[39m[22m [1:1 - 173:34] (173 lines, 902 tokens)
haskell/file2.hs [1:1 - 173:34]
[1mClone found (haskell)[22m
- [1m[32mhaskell/file1.hs[39m[22m [190:1 - 204:33] (15 lines, 99 tokens)
haskell/file2.hs [175:1 - 189:33]
[1mClone found (haxe)[22m
- [1m[32mhaxe/file1.hx[39m[22m [1:1 - 62:76] (62 lines, 334 tokens)
haxe/file2.hx [1:1 - 62:2]
[1mClone found (haxe)[22m
- [1m[32mhaxe/file1.hx[39m[22m [6:3 - 47:9] (42 lines, 244 tokens)
haxe/file1.hx [47:3 - 88:9]
[1mClone found (haxe)[22m
- [1m[32mhaxe/file1.hxml[39m[22m [3:1 - 14:10] (12 lines, 56 tokens)
haxe/file2.hxml [1:1 - 12:10]
[1mClone found (hcl)[22m
- [1m[32mhcl/file1.tf[39m[22m [1:1 - 37:9] (37 lines, 85 tokens)
hcl/file2.tf [1:1 - 37:9]
[1mClone found (aspnet)[22m
- [1m[32mhtmlembedded/file1.aspx[39m[22m [7:18 - 16:35] (10 lines, 67 tokens)
htmlembedded/file2.aspx [7:21 - 16:35]
[1mClone found (aspnet)[22m
- [1m[32mhtmlembedded/file1.aspx[39m[22m [18:53 - 36:30] (19 lines, 173 tokens)
htmlembedded/file2.aspx [18:60 - 36:30]
[1mClone found (aspnet)[22m
- [1m[32mhtmlembedded/file1.aspx[39m[22m [37:95 - 47:8] (11 lines, 56 tokens)
htmlembedded/file2.aspx [44:98 - 54:8]
[1mClone found (markup)[22m
- [1m[32mhtmlmixed/file1.htm[39m[22m [1:1 - 24:7] (24 lines, 191 tokens)
htmlmixed/file2.htm [1:1 - 24:7]
[1mClone found (markup)[22m
- [1m[32mhtmlmixed/file1.htm[39m[22m [1:1 - 24:7] (24 lines, 191 tokens)
ignore/file2.htm [1:1 - 24:7]
[1mClone found (markup)[22m
- [1m[32mhtmlmixed/file1.html[39m[22m [1:1 - 16:2] (16 lines, 91 tokens)
htmlmixed/file2.html [1:1 - 16:2]
[1mClone found (prolog)[22m
- [1m[32midl/file1.pro[39m[22m [1:1 - 28:22] (28 lines, 176 tokens)
idl/file2.pro [1:1 - 28:22]
[1mClone found (idris)[22m
- [1m[32midris/file1.idr[39m[22m [1:1 - 35:3] (35 lines, 208 tokens)
idris/file2.idr [1:1 - 35:3]
[1mClone found (txt)[22m
- [1m[32mignore-case/file2.txt[39m[22m [1:1 - 12:55] (12 lines, 85 tokens)
text/file1.txt [1:1 - 12:55]
[1mClone found (txt)[22m
- [1m[32mignore-case/file2.txt[39m[22m [1:1 - 61:63] (61 lines, 350 tokens)
text/file2.txt [1:1 - 61:63]
[1mClone found (typescript)[22m
- [1m[32mjavascript/file1.cts[39m[22m [1:1 - 263:4] (263 lines, 1318 tokens)
javascript/file1.mts [1:1 - 263:4]
[1mClone found (typescript)[22m
- [1m[32mjavascript/file1.cts[39m[22m [1:1 - 263:4] (263 lines, 1318 tokens)
javascript/file1.ts [1:1 - 263:4]
[1mClone found (typescript)[22m
- [1m[32mjavascript/file1.cts[39m[22m [1:1 - 66:24] (66 lines, 531 tokens)
javascript/file2.cts [48:1 - 113:24]
[1mClone found (typescript)[22m
- [1m[32mjavascript/file1.cts[39m[22m [74:1 - 263:4] (190 lines, 787 tokens)
javascript/file2.cts [187:1 - 376:4]
[1mClone found (javascript)[22m
- [1m[32mjavascript/file1.js[39m[22m [5:1 - 24:2] (20 lines, 94 tokens)
javascript/file2.js [5:1 - 27:2]
[1mClone found (json)[22m
- [1m[32mjavascript/file1.json[39m[22m [4:53 - 21:22] (18 lines, 64 tokens)
javascript/file2.json [4:70 - 21:22]
[1mClone found (json)[22m
- [1m[32mjavascript/file1.json[39m[22m [22:22 - 43:2] (22 lines, 70 tokens)
javascript/file2.json [22:22 - 43:2]
[1mClone found (typescript)[22m
- [1m[32mjavascript/file2.cts[39m[22m [109:38 - 209:24] (101 lines, 297 tokens)
javascript/file2.mts [109:38 - 209:24]
[1mClone found (javascript)[22m
- [1m[32mjavascript/file_4.js[39m[22m [15:2 - 42:43] (28 lines, 98 tokens)
javascript/file_4.js [56:74 - 83:43]
[1mClone found (json5)[22m
- [1m[32mjson5/file1.json5[39m[22m [1:1 - 31:5] (31 lines, 93 tokens)
json5/file2.json5 [1:1 - 31:5]
[1mClone found (jsx)[22m
- [1m[32mjsx/file1.jsx[39m[22m [1:1 - 21:46] (21 lines, 99 tokens)
jsx/file2.jsx [1:1 - 21:46]
[1mClone found (tsx)[22m
- [1m[32mjsx/file1.tsx[39m[22m [1:1 - 35:2] (35 lines, 143 tokens)
jsx/file2.tsx [1:1 - 35:2]
[1mClone found (julia)[22m
- [1m[32mjulia/file1.jl[39m[22m [1:1 - 30:4] (30 lines, 194 tokens)
julia/file2.jl [1:1 - 30:4]
[1mClone found (latex)[22m
- [1m[32mlatex/file1.tex[39m[22m [1:1 - 26:13] (26 lines, 149 tokens)
latex/file2.tex [1:1 - 26:13]
[1mClone found (lilypond)[22m
- [1m[32mlilypond/file1.ly[39m[22m [1:1 - 19:10] (19 lines, 63 tokens)
lilypond/file2.ly [1:1 - 19:10]
[1mClone found (linker-script)[22m
- [1m[32mlinker-script/file1.ld[39m[22m [1:1 - 47:4] (47 lines, 256 tokens)
linker-script/file2.ld [1:1 - 47:4]
[1mClone found (livescript)[22m
- [1m[32mlivescript/file1.ls[39m[22m [1:1 - 31:24] (31 lines, 145 tokens)
livescript/file2.ls [1:1 - 31:24]
[1mClone found (llvm)[22m
- [1m[32mllvm/file1.ll[39m[22m [1:1 - 35:2] (35 lines, 215 tokens)
llvm/file2.ll [1:1 - 35:2]
[1mClone found (log)[22m
- [1m[32mlog/file1.log[39m[22m [1:1 - 13:11] (13 lines, 262 tokens)
log/file2.log [1:1 - 13:11]
[1mClone found (lua)[22m
- [1m[32mlua/file1.lua[39m[22m [1:1 - 46:4] (46 lines, 193 tokens)
lua/file2.lua [1:1 - 46:4]
[1mClone found (markdown)[22m
- [1m[32mmarkdown/file1.md:markdown[39m[22m [2:1 - 176:3] (175 lines, 1238 tokens)
markdown/file2.md:markdown [7:1 - 181:3]
[1mClone found (markdown)[22m
- [1m[32mmarkdown/file1.md:markdown[39m[22m [176:1 - 193:86] (18 lines, 100 tokens)
markdown/file2.md:markdown [196:1 - 213:86]
[1mClone found (text)[22m
- [1m[32mmarkdown/file1.md:text[39m[22m [156:1 - 166:11] (11 lines, 69 tokens)
markdown/file2.md:text [161:1 - 171:11]
[1mClone found (yaml)[22m
- [1m[32mmarkdown/file1.md:yaml[39m[22m [53:1 - 81:10] (29 lines, 60 tokens)
markdown/file2.md:yaml [58:1 - 86:10]
[1mClone found (markdown)[22m
- [1m[32mmarkdown/file3.md:markdown[39m[22m [27:85 - 98:66] (72 lines, 69 tokens)
markdown/file4.md:markdown [27:89 - 98:66]
[1mClone found (python)[22m
- [1m[32mmarkdown/file3.md:python[39m[22m [72:1 - 91:6] (20 lines, 137 tokens)
markdown/file4.md:python [72:1 - 91:6]
[1mClone found (typescript)[22m
- [1m[32mmarkdown/file3.md:typescript[39m[22m [34:1 - 64:2] (31 lines, 156 tokens)
markdown/file4.md:typescript [34:1 - 64:2]
[1mClone found (wolfram)[22m
- [1m[32mmathematica/file1.wl[39m[22m [1:1 - 17:3] (17 lines, 127 tokens)
mathematica/file2.wl [1:1 - 17:3]
[1mClone found (fsharp)[22m
- [1m[32mmllike/file1.fs[39m[22m [1:1 - 35:6] (35 lines, 193 tokens)
mllike/file2.fs [1:1 - 35:6]
[1mClone found (ocaml)[22m
- [1m[32mmllike/file1.ml[39m[22m [1:1 - 30:18] (30 lines, 150 tokens)
mllike/file2.ml [1:1 - 30:18]
[1mClone found (ocaml)[22m
- [1m[32mmllike/file1.mli[39m[22m [1:1 - 29:20] (29 lines, 186 tokens)
mllike/file2.mli [1:1 - 29:20]
[1mClone found (ocaml)[22m
- [1m[32mmllike/file1.mll[39m[22m [1:1 - 24:20] (24 lines, 104 tokens)
mllike/file2.mll [1:1 - 24:20]
[1mClone found (nsis)[22m
- [1m[32mnsis/file1.nsi[39m[22m [1:1 - 29:25] (29 lines, 71 tokens)
nsis/file2.nsi [1:1 - 29:25]
[1mClone found (c-header)[22m
- [1m[32mobjective-c/file_1.h[39m[22m [1:1 - 33:2] (33 lines, 385 tokens)
objective-c/file_2.h [1:1 - 33:2]
[1mClone found (objectivec)[22m
- [1m[32mobjective-c/file_1.m[39m[22m [1:1 - 12:35] (12 lines, 311 tokens)
objective-c/file_2.m [1:1 - 12:35]
[1mClone found (objectivec)[22m
- [1m[32mobjective-c/file_1.m[39m[22m [14:1 - 64:5] (51 lines, 216 tokens)
objective-c/file_2.m [38:1 - 88:5]
[1mClone found (javascript)[22m
- [1m[32mone-file/one-file.js[39m[22m [1:1 - 28:6] (28 lines, 165 tokens)
one-file/one-file.js [32:1 - 59:6]
[1mClone found (openqasm)[22m
- [1m[32mopenqasm/file1.qasm[39m[22m [5:1 - 23:7] (19 lines, 92 tokens)
openqasm/file2.qasm [23:1 - 41:7]
[1mClone found (oz)[22m
- [1m[32moz/file1.oz[39m[22m [1:1 - 37:20] (37 lines, 141 tokens)
oz/file2.oz [1:1 - 37:20]
[1mClone found (pascal)[22m
- [1m[32mpascal/file1.pas[39m[22m [1:1 - 37:5] (37 lines, 203 tokens)
pascal/file2.pas [1:1 - 37:5]
[1mClone found (perl)[22m
- [1m[32mperl/file1.pl[39m[22m [1:1 - 121:31] (121 lines, 331 tokens)
perl/file2.pl [1:1 - 121:31]
[1mClone found (perl)[22m
- [1m[32mperl/file1.pm[39m[22m [1:1 - 143:4] (143 lines, 586 tokens)
perl/file2.pm [1:1 - 143:4]
[1mClone found (perl)[22m
- [1m[32mperl/file1.pm[39m[22m [143:3 - 155:3] (13 lines, 54 tokens)
perl/file2.pm [176:3 - 188:3]
[1mClone found (php)[22m
- [1m[32mphp/file1.php[39m[22m [1:1 - 51:20] (51 lines, 295 tokens)
php/file2.php [1:1 - 51:20]
[1mClone found (plant-uml)[22m
- [1m[32mplant-uml/file1.puml[39m[22m [1:1 - 52:40] (52 lines, 181 tokens)
plant-uml/file2.puml [1:1 - 52:40]
[1mClone found (plsql)[22m
- [1m[32mplsql/file1.plsql[39m[22m [1:1 - 56:12] (56 lines, 191 tokens)
plsql/file2.plsql [1:1 - 56:12]
[1mClone found (plsql)[22m
- [1m[32mplsql/file1.plsql[39m[22m [70:20 - 85:2] (16 lines, 53 tokens)
plsql/file2.plsql [71:25 - 86:2]
[1mClone found (powerquery)[22m
- [1m[32mpowerquery/file1.pq[39m[22m [1:1 - 41:7] (41 lines, 210 tokens)
powerquery/file2.pq [1:1 - 41:7]
[1mClone found (powershell)[22m
- [1m[32mpowershell/file1.ps1[39m[22m [1:1 - 41:2] (41 lines, 168 tokens)
powershell/file2.ps1 [1:1 - 41:2]
[1mClone found (ini)[22m
- [1m[32mproperties/file1.ini[39m[22m [1:1 - 27:7] (27 lines, 79 tokens)
properties/file2.ini [1:1 - 27:7]
[1mClone found (properties)[22m
- [1m[32mproperties/file1.properties[39m[22m [1:1 - 22:11] (22 lines, 114 tokens)
properties/file2.properties [1:1 - 22:11]
[1mClone found (protobuf)[22m
- [1m[32mprotobuf/file1.proto[39m[22m [1:1 - 40:8] (40 lines, 115 tokens)
protobuf/file2.proto [1:1 - 40:8]
[1mClone found (pug)[22m
- [1m[32mpug/file1.pug[39m[22m [1:1 - 234:21] (234 lines, 1037 tokens)
pug/file2.pug [1:1 - 234:21]
[1mClone found (pug)[22m
- [1m[32mpug/file1.pug[39m[22m [239:36 - 291:67] (53 lines, 212 tokens)
pug/file2.pug [231:30 - 283:67]
[1mClone found (puppet)[22m
- [1m[32mpuppet/file1.pp[39m[22m [1:1 - 39:4] (39 lines, 131 tokens)
puppet/file2.pp [1:1 - 39:4]
[1mClone found (puppet)[22m
- [1m[32mpuppet/file1.pp[39m[22m [44:32 - 64:2] (21 lines, 83 tokens)
puppet/file2.pp [38:38 - 58:2]
[1mClone found (purescript)[22m
- [1m[32mpurescript/file1.purs[39m[22m [1:1 - 44:7] (44 lines, 265 tokens)
purescript/file2.purs [1:1 - 44:7]
[1mClone found (purescript)[22m
- [1m[32mpurescript/file1.purs[39m[22m [47:41 - 53:44] (7 lines, 50 tokens)
purescript/file2.purs [47:40 - 53:44]
[1mClone found (python)[22m
- [1m[32mpython/file1.py[39m[22m [1:1 - 24:13] (24 lines, 67 tokens)
python/file2.py [1:1 - 24:13]
[1mClone found (q)[22m
- [1m[32mq/file1.q[39m[22m [1:1 - 30:2] (30 lines, 378 tokens)
q/file2.q [1:1 - 30:2]
[1mClone found (qsharp)[22m
- [1m[32mqsharp/file1.qs[39m[22m [2:32 - 11:6] (10 lines, 50 tokens)
qsharp/file2.qs [2:29 - 11:6]
[1mClone found (r)[22m
- [1m[32mr/file1.r[39m[22m [1:1 - 64:9] (64 lines, 427 tokens)
r/file2.r [1:1 - 64:9]
[1mClone found (racket)[22m
- [1m[32mracket/file1.rkt[39m[22m [1:1 - 38:3] (38 lines, 286 tokens)
racket/file2.rkt [1:1 - 38:3]
[1mClone found (rescript)[22m
- [1m[32mrescript/file1.res[39m[22m [1:1 - 38:2] (38 lines, 200 tokens)
rescript/file2.res [1:1 - 38:2]
[1mClone found (robotframework)[22m
- [1m[32mrobotframework/file1.robot[39m[22m [1:1 - 27:45] (27 lines, 143 tokens)
robotframework/file2.robot [1:1 - 27:45]
[1mClone found (robotframework)[22m
- [1m[32mrobotframework/file1.robot[39m[22m [45:1 - 62:23] (18 lines, 80 tokens)
robotframework/file2.robot [51:1 - 68:23]
[1mClone found (ruby)[22m
- [1m[32mruby/file1.rb[39m[22m [1:1 - 40:4] (40 lines, 96 tokens)
ruby/file2.rb [1:1 - 40:4]
[1mClone found (rust)[22m
- [1m[32mrust/file1.rs[39m[22m [1:1 - 131:3] (131 lines, 857 tokens)
rust/file2.rs [1:1 - 132:3]
[1mClone found (rust)[22m
- [1m[32mrust/file1.rs[39m[22m [199:50 - 204:2] (6 lines, 51 tokens)
rust/file1.rs [255:53 - 260:2]
[1mClone found (rust)[22m
- [1m[32mrust/file1.rs[39m[22m [232:93 - 239:64] (8 lines, 58 tokens)
rust/file1.rs [247:47 - 254:64]
[1mClone found (rust)[22m
- [1m[32mrust/file1.rs[39m[22m [239:57 - 416:2] (178 lines, 1285 tokens)
rust/file2.rs [123:52 - 301:2]
[1mClone found (rust)[22m
- [1m[32mrust/file1.rs[39m[22m [263:28 - 273:12] (11 lines, 80 tokens)
rust/file1.rs [335:21 - 345:12]
[1mClone found (rust)[22m
- [1m[32mrust/file1.rs[39m[22m [319:60 - 332:2] (14 lines, 114 tokens)
rust/file1.rs [371:96 - 384:2]
[1mClone found (sas)[22m
- [1m[32msas/file1.sas[39m[22m [1:1 - 59:4] (59 lines, 444 tokens)
sas/file2.sas [1:1 - 59:4]
[1mClone found (sass)[22m
- [1m[32msass/file1.sass[39m[22m [1:1 - 19:17] (19 lines, 89 tokens)
sass/file2.sass [1:1 - 19:17]
[1mClone found (sass)[22m
- [1m[32msass/file1.sass[39m[22m [3:1 - 17:43] (15 lines, 82 tokens)
sass/file1.sass [19:1 - 33:43]
[1mClone found (sass)[22m
- [1m[32msass/file1.sass[39m[22m [5:1 - 24:45] (20 lines, 102 tokens)
sass/file2.sass [24:1 - 48:33]
[1mClone found (scheme)[22m
- [1m[32mscheme/file1.scm[39m[22m [1:1 - 33:23] (33 lines, 225 tokens)
scheme/file2.scm [1:1 - 33:23]
[1mClone found (bash)[22m
- [1m[32mshebang/build[39m[22m [1:1 - 32:2] (32 lines, 86 tokens)
shebang/deploy [1:1 - 32:2]
[1mClone found (bash)[22m
- [1m[32mshebang/build[39m[22m [1:1 - 32:2] (32 lines, 86 tokens)
shell/file1.sh [1:1 - 32:2]
[1mClone found (bash)[22m
- [1m[32mshebang/build[39m[22m [1:1 - 32:2] (32 lines, 86 tokens)
shell/file2.sh [1:1 - 32:2]
[1mClone found (python)[22m
- [1m[32mshebang/process[39m[22m [1:1 - 32:4] (32 lines, 159 tokens)
shebang/transform [1:1 - 32:4]
[1mClone found (smalltalk)[22m
- [1m[32msmalltalk/file1.st[39m[22m [1:1 - 45:2] (45 lines, 146 tokens)
smalltalk/file2.st [1:1 - 45:2]
[1mClone found (smarty)[22m
- [1m[32msmarty/file1.tpl[39m[22m [1:1 - 43:18] (43 lines, 286 tokens)
smarty/file2.tpl [1:1 - 43:18]
[1mClone found (solidity)[22m
- [1m[32msolidity/file1.sol[39m[22m [25:61 - 55:13] (31 lines, 168 tokens)
solidity/file2.sol [29:54 - 59:13]
[1mClone found (soy)[22m
- [1m[32msoy/file1.soy[39m[22m [1:1 - 49:27] (49 lines, 346 tokens)
soy/file2.soy [1:1 - 49:27]
[1mClone found (sparql)[22m
- [1m[32msparql/file1.rq[39m[22m [1:1 - 11:9] (11 lines, 65 tokens)
sparql/file2.rq [1:1 - 11:9]
[1mClone found (sql)[22m
- [1m[32msql/file1.sql[39m[22m [3:1 - 41:46] (39 lines, 214 tokens)
sql/file2.sql [3:1 - 41:46]
[1mClone found (stylus)[22m
- [1m[32mstylus/file1.styl[39m[22m [1:1 - 53:20] (53 lines, 201 tokens)
stylus/file2.styl [1:1 - 53:20]
[1mClone found (css)[22m
- [1m[32msvelte/component1.svelte:css[39m[22m [112:3 - 230:4] (119 lines, 507 tokens)
svelte/component2.svelte:css [112:3 - 230:4]
[1mClone found (html)[22m
- [1m[32msvelte/component1.svelte:html[39m[22m [1:1 - 231:9] (231 lines, 350 tokens)
svelte/component2.svelte:html [1:1 - 231:9]
[1mClone found (javascript)[22m
- [1m[32msvelte/component1.svelte:javascript[39m[22m [2:3 - 61:6] (60 lines, 286 tokens)
svelte/component2.svelte:javascript [2:3 - 61:6]
[1mClone found (swift)[22m
- [1m[32mswift/file1.swift[39m[22m [9:1 - 29:6] (21 lines, 73 tokens)
swift/file2.swift [2:1 - 22:6]
[1mClone found (tap)[22m
- [1m[32mtap/file1.tap[39m[22m [1:1 - 35:8] (35 lines, 202 tokens)
tap/file2.tap [1:1 - 35:8]
[1mClone found (tcl)[22m
- [1m[32mtcl/file1.tcl[39m[22m [1:1 - 45:2] (45 lines, 263 tokens)
tcl/file2.tcl [1:1 - 45:2]
[1mClone found (textile)[22m
- [1m[32mtextile/file1.textile[39m[22m [1:1 - 51:4] (51 lines, 236 tokens)
textile/file2.textile [1:1 - 51:4]
[1mClone found (toml)[22m
- [1m[32mtoml/file1.toml[39m[22m [1:1 - 39:19] (39 lines, 100 tokens)
toml/file2.toml [1:1 - 39:19]
[1mClone found (tt2)[22m
- [1m[32mtt2/file1.tt2[39m[22m [1:1 - 38:14] (38 lines, 299 tokens)
tt2/file2.tt2 [1:1 - 38:14]
[1mClone found (tt2)[22m
- [1m[32mtt2/file1.tt2[39m[22m [42:21 - 52:25] (11 lines, 54 tokens)
tt2/file2.tt2 [42:86 - 52:25]
[1mClone found (turtle)[22m
- [1m[32mturtle/file1.ttl[39m[22m [1:1 - 36:17] (36 lines, 212 tokens)
turtle/file2.ttl [1:1 - 36:17]
[1mClone found (twig)[22m
- [1m[32mtwig/file_1.twig[39m[22m [1:1 - 23:3] (23 lines, 167 tokens)
twig/file_2.twig [1:1 - 23:3]
[1mClone found (twig)[22m
- [1m[32mtwig/file_1.twig[39m[22m [13:20 - 25:9] (13 lines, 65 tokens)
twig/file_1.twig [16:8 - 28:9]
[1mClone found (twig)[22m
- [1m[32mtwig/file_1.twig[39m[22m [19:8 - 29:15] (11 lines, 54 tokens)
twig/file_2.twig [22:8 - 32:15]
[1mClone found (unrealscript)[22m
- [1m[32munrealscript/file1.uc[39m[22m [1:1 - 56:6] (56 lines, 161 tokens)
unrealscript/file2.uc [1:1 - 56:6]
[1mClone found (vbnet)[22m
- [1m[32mvb/file1.vb[39m[22m [1:1 - 29:17] (29 lines, 163 tokens)
vb/file2.vb [1:1 - 29:17]
[1mClone found (velocity)[22m
- [1m[32mvelocity/file1.vtl[39m[22m [1:1 - 41:25] (41 lines, 264 tokens)
velocity/file2.vtl [1:1 - 41:25]
[1mClone found (verilog)[22m
- [1m[32mverilog/file1.v[39m[22m [1:1 - 40:10] (40 lines, 163 tokens)
verilog/file2.v [1:1 - 40:10]
[1mClone found (vhdl)[22m
- [1m[32mvhdl/file1.vhd[39m[22m [1:1 - 32:18] (32 lines, 179 tokens)
vhdl/file2.vhd [1:1 - 32:18]
[1mClone found (typescript)[22m
- [1m[32mvue/app1.vue:typescript[39m[22m [5:1 - 33:4] (29 lines, 128 tokens)
vue/app2.vue:typescript [5:1 - 33:4]
[1mClone found (javascript)[22m
- [1m[32mvue/file.js[39m[22m [1:1 - 28:2] (28 lines, 210 tokens)
vue/file1.vue:javascript [125:3 - 152:4]
[1mClone found (html)[22m
- [1m[32mvue/file1.vue:html[39m[22m [1:1 - 10:9] (10 lines, 99 tokens)
vue/file2.vue:html [1:1 - 10:9]
[1mClone found (javascript)[22m
- [1m[32mvue/file1.vue:javascript[39m[22m [120:3 - 261:4] (142 lines, 817 tokens)
vue/file2.vue:javascript [99:3 - 240:4]
[1mClone found (scss)[22m
- [1m[32mvue/file1.vue:scss[39m[22m [13:3 - 75:6] (63 lines, 402 tokens)
vue/file2.vue:scss [13:3 - 75:6]
[1mClone found (scss)[22m
- [1m[32mvue/file1.vue:scss[39m[22m [95:5 - 117:4] (23 lines, 149 tokens)
vue/file2.vue:scss [74:5 - 96:4]
[1mClone found (wgsl)[22m
- [1m[32mwgsl/file1.wgsl[39m[22m [1:1 - 45:3] (45 lines, 274 tokens)
wgsl/file2.wgsl [1:1 - 45:3]
[1mClone found (wgsl)[22m
- [1m[32mwgsl/file1.wgsl[39m[22m [51:42 - 59:6] (9 lines, 66 tokens)
wgsl/file2.wgsl [55:47 - 63:6]
[1mClone found (markup)[22m
- [1m[32mxml/file1.svg[39m[22m [1:1 - 88:2] (88 lines, 392 tokens)
xml/file2.svg [1:1 - 87:6]
[1mClone found (markup)[22m
- [1m[32mxml/file1.xsl[39m[22m [1:1 - 43:6] (43 lines, 316 tokens)
xml/file2.xsl [1:1 - 43:2]
[1mClone found (markup)[22m
- [1m[32mxml/file1.xsl[39m[22m [20:15 - 35:6] (16 lines, 133 tokens)
xml/file1.xsl [32:137 - 47:2]
[1mClone found (xquery)[22m
- [1m[32mxquery/file1.xquery[39m[22m [1:1 - 31:22] (31 lines, 222 tokens)
xquery/file2.xquery [1:1 - 31:22]
[1mClone found (yaml)[22m
- [1m[32myaml/file1.yml[39m[22m [1:1 - 18:23] (18 lines, 132 tokens)
yaml/file2.yml [1:1 - 18:23]
[1mClone found (c)[22m
- [1m[32mz80/file1.z80[39m[22m [1:1 - 14:25] (14 lines, 60 tokens)
z80/file2.z80 [1:1 - 14:25]
[1mClone found (zig)[22m
- [1m[32mzig/file1.zig[39m[22m [1:1 - 43:10] (43 lines, 259 tokens)
zig/file2.zig [1:1 - 43:10]
[1mClone found (zig)[22m
- [1m[32mzig/file1.zig[39m[22m [42:45 - 52:23] (11 lines, 52 tokens)
zig/file2.zig [47:45 - 57:23]
[90m┌────────────────┬────────────────┬─────────────┬──────────────┬──────────────┬──────────────────┬───────────────────┐[39m
[90m│[39m[31m Format [39m[90m│[39m[31m Files analyzed [39m[90m│[39m[31m Total lines [39m[90m│[39m[31m Total tokens [39m[90m│[39m[31m Clones found [39m[90m│[39m[31m Duplicated lines [39m[90m│[39m[31m Duplicated tokens [39m[90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m actionscript [90m│[39m 2 [90m│[39m 75 [90m│[39m 302 [90m│[39m 1 [90m│[39m 29 (38.67%) [90m│[39m 127 (42.05%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m ada [90m│[39m 2 [90m│[39m 74 [90m│[39m 408 [90m│[39m 1 [90m│[39m 20 (27.03%) [90m│[39m 103 (25.25%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m antlr4 [90m│[39m 2 [90m│[39m 48 [90m│[39m 216 [90m│[39m 1 [90m│[39m 20 (41.67%) [90m│[39m 82 (37.96%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m apex [90m│[39m 2 [90m│[39m 84 [90m│[39m 451 [90m│[39m 1 [90m│[39m 23 (27.38%) [90m│[39m 115 (25.50%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m apl [90m│[39m 2 [90m│[39m 47 [90m│[39m 554 [90m│[39m 1 [90m│[39m 19 (40.43%) [90m│[39m 252 (45.49%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m aspnet [90m│[39m 2 [90m│[39m 101 [90m│[39m 854 [90m│[39m 3 [90m│[39m 37 (36.63%) [90m│[39m 296 (34.66%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m astro [90m│[39m 2 [90m│[39m 324 [90m│[39m 950 [90m│[39m 0 [90m│[39m 0 (0.00%) [90m│[39m 0 (0.00%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m awk [90m│[39m 2 [90m│[39m 62 [90m│[39m 205 [90m│[39m 1 [90m│[39m 22 (35.48%) [90m│[39m 75 (36.59%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m bash [90m│[39m 4 [90m│[39m 158 [90m│[39m 418 [90m│[39m 3 [90m│[39m 93 (58.86%) [90m│[39m 258 (61.72%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m basic [90m│[39m 2 [90m│[39m 47 [90m│[39m 331 [90m│[39m 1 [90m│[39m 17 (36.17%) [90m│[39m 100 (30.21%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m bicep [90m│[39m 2 [90m│[39m 81 [90m│[39m 251 [90m│[39m 1 [90m│[39m 26 (32.10%) [90m│[39m 78 (31.08%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m brainfuck [90m│[39m 4 [90m│[39m 159 [90m│[39m 1728 [90m│[39m 4 [90m│[39m 113 (71.07%) [90m│[39m 1289 (74.59%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m c [90m│[39m 5 [90m│[39m 105 [90m│[39m 1060 [90m│[39m 3 [90m│[39m 40 (38.10%) [90m│[39m 399 (37.64%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m c-header [90m│[39m 4 [90m│[39m 149 [90m│[39m 2091 [90m│[39m 3 [90m│[39m 59 (39.60%) [90m│[39m 724 (34.62%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m cfml [90m│[39m 2 [90m│[39m 107 [90m│[39m 671 [90m│[39m 1 [90m│[39m 17 (15.89%) [90m│[39m 85 (12.67%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m cfscript [90m│[39m 2 [90m│[39m 69 [90m│[39m 437 [90m│[39m 1 [90m│[39m 27 (39.13%) [90m│[39m 161 (36.84%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m clojure [90m│[39m 2 [90m│[39m 46 [90m│[39m 374 [90m│[39m 1 [90m│[39m 18 (39.13%) [90m│[39m 139 (37.17%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m cmake [90m│[39m 2 [90m│[39m 52 [90m│[39m 311 [90m│[39m 1 [90m│[39m 20 (38.46%) [90m│[39m 128 (41.16%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m coffeescript [90m│[39m 2 [90m│[39m 92 [90m│[39m 447 [90m│[39m 2 [90m│[39m 40 (43.48%) [90m│[39m 219 (48.99%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m cpp [90m│[39m 2 [90m│[39m 176 [90m│[39m 1514 [90m│[39m 2 [90m│[39m 106 (60.23%) [90m│[39m 965 (63.74%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m cpp-header [90m│[39m 2 [90m│[39m 176 [90m│[39m 1514 [90m│[39m 2 [90m│[39m 106 (60.23%) [90m│[39m 965 (63.74%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m crystal [90m│[39m 2 [90m│[39m 70 [90m│[39m 222 [90m│[39m 1 [90m│[39m 28 (40.00%) [90m│[39m 97 (43.69%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m csharp [90m│[39m 2 [90m│[39m 360 [90m│[39m 1099 [90m│[39m 2 [90m│[39m 172 (47.78%) [90m│[39m 537 (48.86%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m css [90m│[39m 8 [90m│[39m 875 [90m│[39m 2536 [90m│[39m 5 [90m│[39m 290 (33.14%) [90m│[39m 1494 (58.91%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m csv [90m│[39m 2 [90m│[39m 22 [90m│[39m 400 [90m│[39m 1 [90m│[39m 8 (36.36%) [90m│[39m 163 (40.75%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m d [90m│[39m 2 [90m│[39m 338 [90m│[39m 2270 [90m│[39m 1 [90m│[39m 168 (49.70%) [90m│[39m 1135 (50.00%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m dart [90m│[39m 2 [90m│[39m 266 [90m│[39m 1178 [90m│[39m 2 [90m│[39m 118 (44.36%) [90m│[39m 522 (44.31%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m diff [90m│[39m 2 [90m│[39m 146 [90m│[39m 1082 [90m│[39m 1 [90m│[39m 61 (41.78%) [90m│[39m 435 (40.20%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m dot [90m│[39m 2 [90m│[39m 46 [90m│[39m 243 [90m│[39m 1 [90m│[39m 17 (36.96%) [90m│[39m 91 (37.45%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m eiffel [90m│[39m 2 [90m│[39m 126 [90m│[39m 380 [90m│[39m 1 [90m│[39m 45 (35.71%) [90m│[39m 130 (34.21%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m elm [90m│[39m 2 [90m│[39m 110 [90m│[39m 411 [90m│[39m 1 [90m│[39m 46 (41.82%) [90m│[39m 155 (37.71%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m erlang [90m│[39m 2 [90m│[39m 242 [90m│[39m 1674 [90m│[39m 1 [90m│[39m 120 (49.59%) [90m│[39m 837 (50.00%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m fortran [90m│[39m 2 [90m│[39m 93 [90m│[39m 469 [90m│[39m 1 [90m│[39m 36 (38.71%) [90m│[39m 182 (38.81%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m fsharp [90m│[39m 2 [90m│[39m 82 [90m│[39m 462 [90m│[39m 1 [90m│[39m 34 (41.46%) [90m│[39m 193 (41.77%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m gdscript [90m│[39m 2 [90m│[39m 96 [90m│[39m 458 [90m│[39m 1 [90m│[39m 24 (25.00%) [90m│[39m 135 (29.48%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m gettext [90m│[39m 2 [90m│[39m 220 [90m│[39m 356 [90m│[39m 1 [90m│[39m 51 (23.18%) [90m│[39m 82 (23.03%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m gherkin [90m│[39m 2 [90m│[39m 75 [90m│[39m 434 [90m│[39m 1 [90m│[39m 15 (20.00%) [90m│[39m 83 (19.12%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m go [90m│[39m 2 [90m│[39m 65 [90m│[39m 305 [90m│[39m 1 [90m│[39m 29 (44.62%) [90m│[39m 134 (43.93%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m graphql [90m│[39m 2 [90m│[39m 134 [90m│[39m 499 [90m│[39m 1 [90m│[39m 24 (17.91%) [90m│[39m 143 (28.66%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m groovy [90m│[39m 2 [90m│[39m 96 [90m│[39m 422 [90m│[39m 1 [90m│[39m 40 (41.67%) [90m│[39m 188 (44.55%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m haml [90m│[39m 2 [90m│[39m 52 [90m│[39m 276 [90m│[39m 1 [90m│[39m 22 (42.31%) [90m│[39m 118 (42.75%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m handlebars [90m│[39m 2 [90m│[39m 72 [90m│[39m 555 [90m│[39m 1 [90m│[39m 27 (37.50%) [90m│[39m 218 (39.28%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m haskell [90m│[39m 4 [90m│[39m 459 [90m│[39m 2536 [90m│[39m 3 [90m│[39m 216 (47.06%) [90m│[39m 1183 (46.65%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m haxe [90m│[39m 4 [90m│[39m 191 [90m│[39m 1035 [90m│[39m 3 [90m│[39m 113 (59.16%) [90m│[39m 634 (61.26%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m hcl [90m│[39m 2 [90m│[39m 119 [90m│[39m 313 [90m│[39m 1 [90m│[39m 36 (30.25%) [90m│[39m 85 (27.16%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m html [90m│[39m 6 [90m│[39m 1289 [90m│[39m 1390 [90m│[39m 4 [90m│[39m 406 (31.50%) [90m│[39m 762 (54.82%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m idris [90m│[39m 2 [90m│[39m 88 [90m│[39m 581 [90m│[39m 1 [90m│[39m 34 (38.64%) [90m│[39m 208 (35.80%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m ignore [90m│[39m 2 [90m│[39m 191 [90m│[39m 523 [90m│[39m 1 [90m│[39m 83 (43.46%) [90m│[39m 234 (44.74%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m ini [90m│[39m 2 [90m│[39m 58 [90m│[39m 172 [90m│[39m 1 [90m│[39m 26 (44.83%) [90m│[39m 79 (45.93%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m java [90m│[39m 2 [90m│[39m 454 [90m│[39m 15064 [90m│[39m 2 [90m│[39m 224 (49.34%) [90m│[39m 7387 (49.04%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m javascript [90m│[39m 23 [90m│[39m 1580 [90m│[39m 6985 [90m│[39m 13 [90m│[39m 572 (36.20%) [90m│[39m 3475 (49.75%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m json [90m│[39m 4 [90m│[39m 134 [90m│[39m 460 [90m│[39m 2 [90m│[39m 38 (28.36%) [90m│[39m 134 (29.13%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m json5 [90m│[39m 2 [90m│[39m 104 [90m│[39m 307 [90m│[39m 1 [90m│[39m 30 (28.85%) [90m│[39m 93 (30.29%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m jsx [90m│[39m 2 [90m│[39m 73 [90m│[39m 296 [90m│[39m 1 [90m│[39m 20 (27.40%) [90m│[39m 99 (33.45%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m julia [90m│[39m 2 [90m│[39m 76 [90m│[39m 557 [90m│[39m 1 [90m│[39m 29 (38.16%) [90m│[39m 194 (34.83%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m kotlin [90m│[39m 2 [90m│[39m 106 [90m│[39m 550 [90m│[39m 2 [90m│[39m 47 (44.34%) [90m│[39m 250 (45.45%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m latex [90m│[39m 2 [90m│[39m 88 [90m│[39m 557 [90m│[39m 1 [90m│[39m 25 (28.41%) [90m│[39m 149 (26.75%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m less [90m│[39m 2 [90m│[39m 56 [90m│[39m 518 [90m│[39m 2 [90m│[39m 29 (51.79%) [90m│[39m 282 (54.44%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m lilypond [90m│[39m 2 [90m│[39m 100 [90m│[39m 307 [90m│[39m 1 [90m│[39m 18 (18.00%) [90m│[39m 63 (20.52%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m linker-script [90m│[39m 2 [90m│[39m 133 [90m│[39m 683 [90m│[39m 1 [90m│[39m 46 (34.59%) [90m│[39m 256 (37.48%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m lisp [90m│[39m 2 [90m│[39m 106 [90m│[39m 608 [90m│[39m 1 [90m│[39m 49 (46.23%) [90m│[39m 289 (47.53%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m livescript [90m│[39m 2 [90m│[39m 68 [90m│[39m 344 [90m│[39m 1 [90m│[39m 30 (44.12%) [90m│[39m 145 (42.15%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m llvm [90m│[39m 2 [90m│[39m 132 [90m│[39m 850 [90m│[39m 1 [90m│[39m 34 (25.76%) [90m│[39m 215 (25.29%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m log [90m│[39m 2 [90m│[39m 30 [90m│[39m 666 [90m│[39m 1 [90m│[39m 12 (40.00%) [90m│[39m 262 (39.34%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m lua [90m│[39m 2 [90m│[39m 106 [90m│[39m 450 [90m│[39m 1 [90m│[39m 45 (42.45%) [90m│[39m 193 (42.89%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m markdown [90m│[39m 4 [90m│[39m 536 [90m│[39m 929 [90m│[39m 3 [90m│[39m 262 (48.88%) [90m│[39m 1407 (151.45%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m markup [90m│[39m 11 [90m│[39m 478 [90m│[39m 2795 [90m│[39m 6 [90m│[39m 205 (42.89%) [90m│[39m 1314 (47.01%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m nsis [90m│[39m 2 [90m│[39m 68 [90m│[39m 172 [90m│[39m 1 [90m│[39m 28 (41.18%) [90m│[39m 71 (41.28%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m objectivec [90m│[39m 2 [90m│[39m 152 [90m│[39m 1463 [90m│[39m 2 [90m│[39m 61 (40.13%) [90m│[39m 527 (36.02%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m ocaml [90m│[39m 6 [90m│[39m 186 [90m│[39m 1052 [90m│[39m 3 [90m│[39m 80 (43.01%) [90m│[39m 440 (41.83%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m openqasm [90m│[39m 2 [90m│[39m 87 [90m│[39m 346 [90m│[39m 1 [90m│[39m 18 (20.69%) [90m│[39m 92 (26.59%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m oz [90m│[39m 2 [90m│[39m 94 [90m│[39m 357 [90m│[39m 1 [90m│[39m 36 (38.30%) [90m│[39m 141 (39.50%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m pascal [90m│[39m 2 [90m│[39m 106 [90m│[39m 561 [90m│[39m 1 [90m│[39m 36 (33.96%) [90m│[39m 203 (36.19%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m perl [90m│[39m 4 [90m│[39m 609 [90m│[39m 2272 [90m│[39m 3 [90m│[39m 274 (44.99%) [90m│[39m 971 (42.74%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m php [90m│[39m 2 [90m│[39m 143 [90m│[39m 785 [90m│[39m 1 [90m│[39m 50 (34.97%) [90m│[39m 295 (37.58%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m plant-uml [90m│[39m 2 [90m│[39m 120 [90m│[39m 422 [90m│[39m 1 [90m│[39m 51 (42.50%) [90m│[39m 181 (42.89%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m plsql [90m│[39m 2 [90m│[39m 171 [90m│[39m 598 [90m│[39m 2 [90m│[39m 70 (40.94%) [90m│[39m 244 (40.80%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m powerquery [90m│[39m 2 [90m│[39m 112 [90m│[39m 538 [90m│[39m 1 [90m│[39m 40 (35.71%) [90m│[39m 210 (39.03%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m powershell [90m│[39m 2 [90m│[39m 98 [90m│[39m 404 [90m│[39m 1 [90m│[39m 40 (40.82%) [90m│[39m 168 (41.58%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m prolog [90m│[39m 2 [90m│[39m 64 [90m│[39m 429 [90m│[39m 1 [90m│[39m 27 (42.19%) [90m│[39m 176 (41.03%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m properties [90m│[39m 2 [90m│[39m 48 [90m│[39m 250 [90m│[39m 1 [90m│[39m 21 (43.75%) [90m│[39m 114 (45.60%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m protobuf [90m│[39m 2 [90m│[39m 205 [90m│[39m 680 [90m│[39m 1 [90m│[39m 39 (19.02%) [90m│[39m 115 (16.91%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m pug [90m│[39m 2 [90m│[39m 574 [90m│[39m 2512 [90m│[39m 2 [90m│[39m 285 (49.65%) [90m│[39m 1249 (49.72%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m puppet [90m│[39m 2 [90m│[39m 122 [90m│[39m 446 [90m│[39m 2 [90m│[39m 58 (47.54%) [90m│[39m 214 (47.98%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m purescript [90m│[39m 2 [90m│[39m 115 [90m│[39m 797 [90m│[39m 2 [90m│[39m 49 (42.61%) [90m│[39m 315 (39.52%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m python [90m│[39m 6 [90m│[39m 323 [90m│[39m 911 [90m│[39m 3 [90m│[39m 73 (22.60%) [90m│[39m 363 (39.85%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m q [90m│[39m 2 [90m│[39m 78 [90m│[39m 997 [90m│[39m 1 [90m│[39m 29 (37.18%) [90m│[39m 378 (37.91%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m qsharp [90m│[39m 2 [90m│[39m 102 [90m│[39m 408 [90m│[39m 1 [90m│[39m 9 (8.82%) [90m│[39m 50 (12.25%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m r [90m│[39m 2 [90m│[39m 128 [90m│[39m 854 [90m│[39m 1 [90m│[39m 63 (49.22%) [90m│[39m 427 (50.00%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m racket [90m│[39m 2 [90m│[39m 100 [90m│[39m 760 [90m│[39m 1 [90m│[39m 37 (37.00%) [90m│[39m 286 (37.63%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m rescript [90m│[39m 2 [90m│[39m 115 [90m│[39m 776 [90m│[39m 1 [90m│[39m 37 (32.17%) [90m│[39m 200 (25.77%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m robotframework [90m│[39m 2 [90m│[39m 130 [90m│[39m 630 [90m│[39m 2 [90m│[39m 43 (33.08%) [90m│[39m 223 (35.40%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m ruby [90m│[39m 2 [90m│[39m 80 [90m│[39m 192 [90m│[39m 1 [90m│[39m 39 (48.75%) [90m│[39m 96 (50.00%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m rust [90m│[39m 2 [90m│[39m 717 [90m│[39m 5128 [90m│[39m 6 [90m│[39m 342 (47.70%) [90m│[39m 2445 (47.68%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m sas [90m│[39m 2 [90m│[39m 152 [90m│[39m 1174 [90m│[39m 1 [90m│[39m 58 (38.16%) [90m│[39m 444 (37.82%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m sass [90m│[39m 2 [90m│[39m 93 [90m│[39m 383 [90m│[39m 3 [90m│[39m 51 (54.84%) [90m│[39m 273 (71.28%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m scala [90m│[39m 2 [90m│[39m 58 [90m│[39m 1696 [90m│[39m 1 [90m│[39m 28 (48.28%) [90m│[39m 848 (50.00%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m scheme [90m│[39m 2 [90m│[39m 70 [90m│[39m 498 [90m│[39m 1 [90m│[39m 32 (45.71%) [90m│[39m 225 (45.18%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m scss [90m│[39m 4 [90m│[39m 360 [90m│[39m 2065 [90m│[39m 3 [90m│[39m 136 (37.78%) [90m│[39m 875 (42.37%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m smalltalk [90m│[39m 2 [90m│[39m 102 [90m│[39m 351 [90m│[39m 1 [90m│[39m 44 (43.14%) [90m│[39m 146 (41.60%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m smarty [90m│[39m 2 [90m│[39m 92 [90m│[39m 652 [90m│[39m 1 [90m│[39m 42 (45.65%) [90m│[39m 286 (43.87%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m solidity [90m│[39m 2 [90m│[39m 155 [90m│[39m 939 [90m│[39m 1 [90m│[39m 30 (19.35%) [90m│[39m 168 (17.89%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m soy [90m│[39m 2 [90m│[39m 106 [90m│[39m 841 [90m│[39m 1 [90m│[39m 48 (45.28%) [90m│[39m 346 (41.14%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m sparql [90m│[39m 2 [90m│[39m 54 [90m│[39m 296 [90m│[39m 1 [90m│[39m 10 (18.52%) [90m│[39m 65 (21.96%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m sql [90m│[39m 2 [90m│[39m 102 [90m│[39m 525 [90m│[39m 1 [90m│[39m 38 (37.25%) [90m│[39m 214 (40.76%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m stylus [90m│[39m 2 [90m│[39m 129 [90m│[39m 494 [90m│[39m 1 [90m│[39m 52 (40.31%) [90m│[39m 201 (40.69%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m svelte [90m│[39m 2 [90m│[39m 462 [90m│[39m 1586 [90m│[39m 0 [90m│[39m 0 (0.00%) [90m│[39m 0 (0.00%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m swift [90m│[39m 2 [90m│[39m 58 [90m│[39m 175 [90m│[39m 1 [90m│[39m 20 (34.48%) [90m│[39m 73 (41.71%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m tap [90m│[39m 2 [90m│[39m 98 [90m│[39m 562 [90m│[39m 1 [90m│[39m 34 (34.69%) [90m│[39m 202 (35.94%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m tcl [90m│[39m 2 [90m│[39m 106 [90m│[39m 600 [90m│[39m 1 [90m│[39m 44 (41.51%) [90m│[39m 263 (43.83%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m text [90m│[39m 2 [90m│[39m 354 [90m│[39m 143 [90m│[39m 1 [90m│[39m 10 (2.82%) [90m│[39m 69 (48.25%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m textile [90m│[39m 2 [90m│[39m 106 [90m│[39m 495 [90m│[39m 1 [90m│[39m 50 (47.17%) [90m│[39m 236 (47.68%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m toml [90m│[39m 2 [90m│[39m 91 [90m│[39m 229 [90m│[39m 1 [90m│[39m 38 (41.76%) [90m│[39m 100 (43.67%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m tsx [90m│[39m 2 [90m│[39m 76 [90m│[39m 310 [90m│[39m 1 [90m│[39m 34 (44.74%) [90m│[39m 143 (46.13%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m tt2 [90m│[39m 2 [90m│[39m 104 [90m│[39m 803 [90m│[39m 2 [90m│[39m 47 (45.19%) [90m│[39m 353 (43.96%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m turtle [90m│[39m 2 [90m│[39m 90 [90m│[39m 520 [90m│[39m 1 [90m│[39m 35 (38.89%) [90m│[39m 212 (40.77%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m twig [90m│[39m 2 [90m│[39m 61 [90m│[39m 424 [90m│[39m 3 [90m│[39m 44 (72.13%) [90m│[39m 286 (67.45%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m txt [90m│[39m 4 [90m│[39m 146 [90m│[39m 870 [90m│[39m 2 [90m│[39m 71 (48.63%) [90m│[39m 435 (50.00%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m typescript [90m│[39m 12 [90m│[39m 2159 [90m│[39m 9379 [90m│[39m 8 [90m│[39m 958 (44.37%) [90m│[39m 4688 (49.98%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m unrealscript [90m│[39m 2 [90m│[39m 166 [90m│[39m 520 [90m│[39m 1 [90m│[39m 55 (33.13%) [90m│[39m 161 (30.96%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m vbnet [90m│[39m 2 [90m│[39m 72 [90m│[39m 378 [90m│[39m 1 [90m│[39m 28 (38.89%) [90m│[39m 163 (43.12%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m velocity [90m│[39m 2 [90m│[39m 88 [90m│[39m 576 [90m│[39m 1 [90m│[39m 40 (45.45%) [90m│[39m 264 (45.83%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m verilog [90m│[39m 2 [90m│[39m 104 [90m│[39m 430 [90m│[39m 1 [90m│[39m 39 (37.50%) [90m│[39m 163 (37.91%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m vhdl [90m│[39m 2 [90m│[39m 98 [90m│[39m 546 [90m│[39m 1 [90m│[39m 31 (31.63%) [90m│[39m 179 (32.78%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m vue [90m│[39m 4 [90m│[39m 587 [90m│[39m 3333 [90m│[39m 0 [90m│[39m 0 (0.00%) [90m│[39m 0 (0.00%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m wgsl [90m│[39m 2 [90m│[39m 127 [90m│[39m 928 [90m│[39m 2 [90m│[39m 52 (40.94%) [90m│[39m 340 (36.64%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m wolfram [90m│[39m 2 [90m│[39m 85 [90m│[39m 697 [90m│[39m 1 [90m│[39m 16 (18.82%) [90m│[39m 127 (18.22%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m xquery [90m│[39m 2 [90m│[39m 80 [90m│[39m 640 [90m│[39m 1 [90m│[39m 30 (37.50%) [90m│[39m 222 (34.69%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m yaml [90m│[39m 6 [90m│[39m 262 [90m│[39m 554 [90m│[39m 2 [90m│[39m 45 (17.18%) [90m│[39m 192 (34.66%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m zig [90m│[39m 2 [90m│[39m 130 [90m│[39m 827 [90m│[39m 2 [90m│[39m 52 (40.00%) [90m│[39m 311 (37.61%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m [1mTotal:[22m [90m│[39m 347 [90m│[39m 24603 [90m│[39m 130473 [90m│[39m 212 [90m│[39m 9133 (37.12%) [90m│[39m 56491 (43.30%) [90m│[39m
[90m└────────────────┴────────────────┴─────────────┴──────────────┴──────────────┴──────────────────┴───────────────────┘[39m
[90mFound 212 clones.[39m
[90mtime: 22.771ms[39m
[90m💡 Auto-refactor with AI: [1m[39mnpx skills add https://github.com/kucherenko/jscpd --skill dry-refactoring[90m[22m
[90m🎩 New: Gangsta Agents — discipline your AI coding → gangsta.page[39m
[90m💖 Support jscpd project → https://opencollective.com/jscpd[39m command comes from the separate [1mClone found (actionscript)[22m
- [1m[32mactionscript/file1.as[39m[22m [1:1 - 30:10] (30 lines, 127 tokens)
actionscript/file2.as [1:1 - 30:10]
[1mClone found (ada)[22m
- [1m[32mada/file1.ada[39m[22m [1:1 - 21:12] (21 lines, 103 tokens)
ada/file2.ada [1:1 - 21:12]
[1mClone found (antlr4)[22m
- [1m[32mantlr4/file1.g4[39m[22m [1:1 - 21:27] (21 lines, 82 tokens)
antlr4/file2.g4 [1:1 - 21:27]
[1mClone found (apex)[22m
- [1m[32mapex/file1.cls[39m[22m [1:29 - 24:18] (24 lines, 115 tokens)
apex/file2.cls [1:29 - 24:18]
[1mClone found (apl)[22m
- [1m[32mapl/file1.apl[39m[22m [1:1 - 20:54] (20 lines, 252 tokens)
apl/file2.apl [1:1 - 20:54]
[1mClone found (css)[22m
- [1m[32mastro/component1.astro:css[39m[22m [76:3 - 161:4] (86 lines, 364 tokens)
astro/component2.astro:css [76:3 - 161:4]
[1mClone found (css)[22m
- [1m[32mastro/component1.astro:css[39m[22m [79:23 - 124:12] (46 lines, 194 tokens)
svelte/component1.svelte:css [116:28 - 161:12]
[1mClone found (html)[22m
- [1m[32mastro/component1.astro:html[39m[22m [1:1 - 162:9] (162 lines, 246 tokens)
astro/component2.astro:html [1:1 - 162:9]
[1mClone found (html)[22m
- [1m[32mastro/component1.astro:html[39m[22m [27:1 - 33:8] (7 lines, 67 tokens)
svelte/component1.svelte:html [64:1 - 70:8]
[1mClone found (javascript)[22m
- [1m[32mastro/component1.astro:javascript[39m[22m [58:3 - 72:4] (15 lines, 111 tokens)
astro/component2.astro:javascript [58:3 - 72:4]
[1mClone found (typescript)[22m
- [1m[32mastro/component1.astro:typescript[39m[22m [2:1 - 24:4] (23 lines, 153 tokens)
astro/component2.astro:typescript [2:1 - 24:4]
[1mClone found (awk)[22m
- [1m[32mawk/file1.awk[39m[22m [1:1 - 23:33] (23 lines, 75 tokens)
awk/file2.awk [1:1 - 23:33]
[1mClone found (basic)[22m
- [1m[32mbasic/file1.bas[39m[22m [1:1 - 18:4] (18 lines, 100 tokens)
basic/file2.bas [1:1 - 18:4]
[1mClone found (bicep)[22m
- [1m[32mbicep/file1.bicep[39m[22m [1:1 - 27:9] (27 lines, 78 tokens)
bicep/file2.bicep [1:1 - 27:9]
[1mClone found (brainfuck)[22m
- [1m[32mbrainfuck/file1.b[39m[22m [1:1 - 26:77] (26 lines, 268 tokens)
brainfuck/file1.bf [1:1 - 26:77]
[1mClone found (brainfuck)[22m
- [1m[32mbrainfuck/file1.b[39m[22m [1:1 - 41:59] (41 lines, 439 tokens)
brainfuck/file2.b [1:1 - 41:59]
[1mClone found (brainfuck)[22m
- [1m[32mbrainfuck/file1.b[39m[22m [1:1 - 41:59] (41 lines, 439 tokens)
brainfuck/file2.bf [1:1 - 41:59]
[1mClone found (brainfuck)[22m
- [1m[32mbrainfuck/file1.b[39m[22m [33:1 - 41:59] (9 lines, 143 tokens)
brainfuck/file1.bf [28:1 - 36:59]
[1mClone found (cfml)[22m
- [1m[32mcfml/file1.cfm[39m[22m [4:20 - 21:2] (18 lines, 85 tokens)
cfml/file2.cfm [4:18 - 21:2]
[1mClone found (cfscript)[22m
- [1m[32mcfscript/file1.cfc[39m[22m [1:1 - 28:11] (28 lines, 161 tokens)
cfscript/file2.cfc [1:1 - 28:11]
[1mClone found (c)[22m
- [1m[32mclike/file1.c[39m[22m [1:1 - 17:4] (17 lines, 258 tokens)
clike/file2.c [1:1 - 17:4]
[1mClone found (c)[22m
- [1m[32mclike/file1.c[39m[22m [8:3 - 19:2] (12 lines, 81 tokens)
clike/file2.c [18:3 - 29:2]
[1mClone found (cpp)[22m
- [1m[32mclike/file1.cpp[39m[22m [1:1 - 88:7] (88 lines, 757 tokens)
clike/file2.cpp [1:1 - 88:7]
[1mClone found (cpp)[22m
- [1m[32mclike/file1.cpp[39m[22m [24:5 - 43:51] (20 lines, 208 tokens)
clike/file1.cpp [45:5 - 64:51]
[1mClone found (csharp)[22m
- [1m[32mclike/file1.cs[39m[22m [1:1 - 91:19] (91 lines, 235 tokens)
clike/file2.cs [1:1 - 91:19]
[1mClone found (csharp)[22m
- [1m[32mclike/file1.cs[39m[22m [103:9 - 185:2] (83 lines, 302 tokens)
clike/file2.cs [93:9 - 175:2]
[1mClone found (c-header)[22m
- [1m[32mclike/file1.h[39m[22m [1:1 - 17:4] (17 lines, 258 tokens)
clike/file2.h [1:1 - 17:4]
[1mClone found (c-header)[22m
- [1m[32mclike/file1.h[39m[22m [8:3 - 19:2] (12 lines, 81 tokens)
clike/file2.h [18:3 - 29:2]
[1mClone found (cpp-header)[22m
- [1m[32mclike/file1.hpp[39m[22m [1:1 - 88:7] (88 lines, 757 tokens)
clike/file2.hpp [1:1 - 88:7]
[1mClone found (cpp-header)[22m
- [1m[32mclike/file1.hpp[39m[22m [24:5 - 43:51] (20 lines, 208 tokens)
clike/file1.hpp [45:5 - 64:51]
[1mClone found (java)[22m
- [1m[32mclike/file1.java[39m[22m [1:1 - 186:6] (186 lines, 6601 tokens)
clike/file2.java [1:1 - 186:6]
[1mClone found (java)[22m
- [1m[32mclike/file1.java[39m[22m [182:51 - 221:2] (40 lines, 786 tokens)
clike/file2.java [194:52 - 233:2]
[1mClone found (kotlin)[22m
- [1m[32mclike/file1.kt[39m[22m [1:1 - 33:6] (33 lines, 186 tokens)
clike/file2.kt [1:1 - 33:6]
[1mClone found (kotlin)[22m
- [1m[32mclike/file1.kt[39m[22m [38:5 - 53:2] (16 lines, 64 tokens)
clike/file2.kt [38:5 - 53:2]
[1mClone found (scala)[22m
- [1m[32mclike/file1.scala[39m[22m [1:1 - 29:2] (29 lines, 848 tokens)
clike/file2.scala [1:1 - 29:2]
[1mClone found (clojure)[22m
- [1m[32mclojure/file1.clj[39m[22m [2:3 - 20:23] (19 lines, 139 tokens)
clojure/file2.clj [2:3 - 20:23]
[1mClone found (cmake)[22m
- [1m[32mcmake/file1.cmake[39m[22m [1:1 - 21:14] (21 lines, 128 tokens)
cmake/file2.cmake [1:1 - 21:14]
[1mClone found (coffeescript)[22m
- [1m[32mcoffeescript/file1.coffee[39m[22m [1:1 - 13:22] (13 lines, 75 tokens)
coffeescript/file2.coffee [3:1 - 15:22]
[1mClone found (coffeescript)[22m
- [1m[32mcoffeescript/file1.coffee[39m[22m [16:1 - 44:21] (29 lines, 144 tokens)
coffeescript/file1.coffee [46:1 - 74:21]
[1mClone found (lisp)[22m
- [1m[32mcommonlisp/file1.el[39m[22m [1:1 - 50:23] (50 lines, 289 tokens)
commonlisp/file2.el [1:1 - 50:23]
[1mClone found (crystal)[22m
- [1m[32mcrystal/file1.cr[39m[22m [1:1 - 29:4] (29 lines, 97 tokens)
crystal/file2.cr [1:1 - 29:4]
[1mClone found (css)[22m
- [1m[32mcss/file1.css[39m[22m [1:1 - 25:2] (25 lines, 237 tokens)
css/file10.css [1:1 - 25:2]
[1mClone found (css)[22m
- [1m[32mcss/file1.css[39m[22m [1:1 - 19:36] (19 lines, 192 tokens)
css/file2.css [1:1 - 19:36]
[1mClone found (less)[22m
- [1m[32mcss/file1.less[39m[22m [1:1 - 19:36] (19 lines, 192 tokens)
css/file2.less [1:1 - 19:36]
[1mClone found (less)[22m
- [1m[32mcss/file1.less[39m[22m [14:35 - 25:2] (12 lines, 90 tokens)
css/file1.less [24:5 - 36:2]
[1mClone found (scss)[22m
- [1m[32mcss/file1.scss[39m[22m [1:1 - 53:2] (53 lines, 324 tokens)
css/file2.scss [1:1 - 53:2]
[1mClone found (csv)[22m
- [1m[32mcsv/file1.csv[39m[22m [1:1 - 9:56] (9 lines, 163 tokens)
csv/file2.csv [1:1 - 9:56]
[1mClone found (d)[22m
- [1m[32md/file1.d[39m[22m [1:1 - 169:6] (169 lines, 1135 tokens)
d/file2.d [1:1 - 169:6]
[1mClone found (dart)[22m
- [1m[32mdart/file1.dart[39m[22m [1:1 - 89:4] (89 lines, 403 tokens)
dart/file2.dart [1:1 - 89:4]
[1mClone found (dart)[22m
- [1m[32mdart/file1.dart[39m[22m [118:15 - 148:2] (31 lines, 119 tokens)
dart/file2.dart [88:6 - 118:2]
[1mClone found (diff)[22m
- [1m[32mdiff/file1.diff[39m[22m [1:1 - 62:7] (62 lines, 435 tokens)
diff/file2.diff [1:1 - 62:7]
[1mClone found (dot)[22m
- [1m[32mdot/file1.dot[39m[22m [1:1 - 18:21] (18 lines, 91 tokens)
dot/file2.dot [1:1 - 18:21]
[1mClone found (eiffel)[22m
- [1m[32meiffel/file1.e[39m[22m [1:1 - 46:11] (46 lines, 130 tokens)
eiffel/file2.e [1:1 - 46:11]
[1mClone found (elm)[22m
- [1m[32melm/file1.elm[39m[22m [1:1 - 47:23] (47 lines, 155 tokens)
elm/file2.elm [1:1 - 47:23]
[1mClone found (erlang)[22m
- [1m[32merlang/file1.erl[39m[22m [1:1 - 121:7] (121 lines, 837 tokens)
erlang/file2.erl [1:1 - 121:7]
[1mClone found (javascript)[22m
- [1m[32mfolder1/file_1.js[39m[22m [4:1 - 55:3] (52 lines, 339 tokens)
javascript/file_1.cjs [4:1 - 55:3]
[1mClone found (javascript)[22m
- [1m[32mfolder1/file_1.js[39m[22m [4:1 - 55:3] (52 lines, 339 tokens)
javascript/file_1.js [4:1 - 55:3]
[1mClone found (javascript)[22m
- [1m[32mfolder1/file_1.js[39m[22m [4:1 - 55:3] (52 lines, 339 tokens)
javascript/file_1.mjs [4:1 - 55:3]
[1mClone found (javascript)[22m
- [1m[32mfolder1/file_1.js[39m[22m [4:1 - 55:3] (52 lines, 339 tokens)
javascript/file_3.js [1:1 - 52:3]
[1mClone found (javascript)[22m
- [1m[32mfolder1/file_1.js[39m[22m [28:1 - 55:3] (28 lines, 169 tokens)
folder2/file_2.js [1:1 - 28:3]
[1mClone found (javascript)[22m
- [1m[32mfolder1/file_1.js[39m[22m [28:1 - 55:3] (28 lines, 169 tokens)
folder2/file_2.js [29:1 - 56:3]
[1mClone found (fortran)[22m
- [1m[32mfortran/file1.f[39m[22m [1:7 - 37:21] (37 lines, 182 tokens)
fortran/file2.f [1:7 - 37:21]
[1mClone found (gdscript)[22m
- [1m[32mgdscript/file1.gd[39m[22m [22:1 - 46:18] (25 lines, 135 tokens)
gdscript/file2.gd [22:1 - 46:18]
[1mClone found (gettext)[22m
- [1m[32mgettext/file1.po[39m[22m [13:1 - 64:7] (52 lines, 82 tokens)
gettext/file2.po [13:1 - 64:7]
[1mClone found (gherkin)[22m
- [1m[32mgherkin/file1.feature[39m[22m [1:1 - 16:26] (16 lines, 83 tokens)
gherkin/file2.feature [1:1 - 16:26]
[1mClone found (ignore)[22m
- [1m[32mgitignore/file1.gitignore[39m[22m [1:1 - 84:16] (84 lines, 234 tokens)
gitignore/file2.gitignore [1:1 - 84:16]
[1mClone found (go)[22m
- [1m[32mgo/file1.go[39m[22m [1:1 - 30:5] (30 lines, 134 tokens)
go/file2.go [1:1 - 31:5]
[1mClone found (graphql)[22m
- [1m[32mgraphql/file1.graphql[39m[22m [1:1 - 25:5] (25 lines, 143 tokens)
graphql/file2.graphql [1:1 - 25:5]
[1mClone found (groovy)[22m
- [1m[32mgroovy/file1.groovy[39m[22m [1:1 - 41:6] (41 lines, 188 tokens)
groovy/file2.groovy [1:1 - 41:6]
[1mClone found (haml)[22m
- [1m[32mhaml/file1.haml[39m[22m [1:1 - 23:18] (23 lines, 118 tokens)
haml/file2.haml [1:1 - 23:18]
[1mClone found (handlebars)[22m
- [1m[32mhandlebars/file1.hbs[39m[22m [1:1 - 28:27] (28 lines, 218 tokens)
handlebars/file2.hbs [1:1 - 28:27]
[1mClone found (haskell)[22m
- [1m[32mhaskell-literate/file1.lhs[39m[22m [1:1 - 31:2] (31 lines, 182 tokens)
haskell-literate/file2.lhs [1:1 - 31:2]
[1mClone found (haskell)[22m
- [1m[32mhaskell/file1.hs[39m[22m [1:1 - 173:34] (173 lines, 902 tokens)
haskell/file2.hs [1:1 - 173:34]
[1mClone found (haskell)[22m
- [1m[32mhaskell/file1.hs[39m[22m [190:1 - 204:33] (15 lines, 99 tokens)
haskell/file2.hs [175:1 - 189:33]
[1mClone found (haxe)[22m
- [1m[32mhaxe/file1.hx[39m[22m [1:1 - 62:76] (62 lines, 334 tokens)
haxe/file2.hx [1:1 - 62:2]
[1mClone found (haxe)[22m
- [1m[32mhaxe/file1.hx[39m[22m [6:3 - 47:9] (42 lines, 244 tokens)
haxe/file1.hx [47:3 - 88:9]
[1mClone found (haxe)[22m
- [1m[32mhaxe/file1.hxml[39m[22m [3:1 - 14:10] (12 lines, 56 tokens)
haxe/file2.hxml [1:1 - 12:10]
[1mClone found (hcl)[22m
- [1m[32mhcl/file1.tf[39m[22m [1:1 - 37:9] (37 lines, 85 tokens)
hcl/file2.tf [1:1 - 37:9]
[1mClone found (aspnet)[22m
- [1m[32mhtmlembedded/file1.aspx[39m[22m [7:18 - 16:35] (10 lines, 67 tokens)
htmlembedded/file2.aspx [7:21 - 16:35]
[1mClone found (aspnet)[22m
- [1m[32mhtmlembedded/file1.aspx[39m[22m [18:53 - 36:30] (19 lines, 173 tokens)
htmlembedded/file2.aspx [18:60 - 36:30]
[1mClone found (aspnet)[22m
- [1m[32mhtmlembedded/file1.aspx[39m[22m [37:95 - 47:8] (11 lines, 56 tokens)
htmlembedded/file2.aspx [44:98 - 54:8]
[1mClone found (markup)[22m
- [1m[32mhtmlmixed/file1.htm[39m[22m [1:1 - 24:7] (24 lines, 191 tokens)
htmlmixed/file2.htm [1:1 - 24:7]
[1mClone found (markup)[22m
- [1m[32mhtmlmixed/file1.htm[39m[22m [1:1 - 24:7] (24 lines, 191 tokens)
ignore/file2.htm [1:1 - 24:7]
[1mClone found (markup)[22m
- [1m[32mhtmlmixed/file1.html[39m[22m [1:1 - 16:2] (16 lines, 91 tokens)
htmlmixed/file2.html [1:1 - 16:2]
[1mClone found (prolog)[22m
- [1m[32midl/file1.pro[39m[22m [1:1 - 28:22] (28 lines, 176 tokens)
idl/file2.pro [1:1 - 28:22]
[1mClone found (idris)[22m
- [1m[32midris/file1.idr[39m[22m [1:1 - 35:3] (35 lines, 208 tokens)
idris/file2.idr [1:1 - 35:3]
[1mClone found (txt)[22m
- [1m[32mignore-case/file2.txt[39m[22m [1:1 - 12:55] (12 lines, 85 tokens)
text/file1.txt [1:1 - 12:55]
[1mClone found (txt)[22m
- [1m[32mignore-case/file2.txt[39m[22m [1:1 - 61:63] (61 lines, 350 tokens)
text/file2.txt [1:1 - 61:63]
[1mClone found (typescript)[22m
- [1m[32mjavascript/file1.cts[39m[22m [1:1 - 263:4] (263 lines, 1318 tokens)
javascript/file1.mts [1:1 - 263:4]
[1mClone found (typescript)[22m
- [1m[32mjavascript/file1.cts[39m[22m [1:1 - 263:4] (263 lines, 1318 tokens)
javascript/file1.ts [1:1 - 263:4]
[1mClone found (typescript)[22m
- [1m[32mjavascript/file1.cts[39m[22m [1:1 - 66:24] (66 lines, 531 tokens)
javascript/file2.cts [48:1 - 113:24]
[1mClone found (typescript)[22m
- [1m[32mjavascript/file1.cts[39m[22m [74:1 - 263:4] (190 lines, 787 tokens)
javascript/file2.cts [187:1 - 376:4]
[1mClone found (javascript)[22m
- [1m[32mjavascript/file1.js[39m[22m [5:1 - 24:2] (20 lines, 94 tokens)
javascript/file2.js [5:1 - 27:2]
[1mClone found (json)[22m
- [1m[32mjavascript/file1.json[39m[22m [4:53 - 21:22] (18 lines, 64 tokens)
javascript/file2.json [4:70 - 21:22]
[1mClone found (json)[22m
- [1m[32mjavascript/file1.json[39m[22m [22:22 - 43:2] (22 lines, 70 tokens)
javascript/file2.json [22:22 - 43:2]
[1mClone found (typescript)[22m
- [1m[32mjavascript/file2.cts[39m[22m [109:38 - 209:24] (101 lines, 297 tokens)
javascript/file2.mts [109:38 - 209:24]
[1mClone found (javascript)[22m
- [1m[32mjavascript/file_4.js[39m[22m [15:2 - 42:43] (28 lines, 98 tokens)
javascript/file_4.js [56:74 - 83:43]
[1mClone found (json5)[22m
- [1m[32mjson5/file1.json5[39m[22m [1:1 - 31:5] (31 lines, 93 tokens)
json5/file2.json5 [1:1 - 31:5]
[1mClone found (jsx)[22m
- [1m[32mjsx/file1.jsx[39m[22m [1:1 - 21:46] (21 lines, 99 tokens)
jsx/file2.jsx [1:1 - 21:46]
[1mClone found (tsx)[22m
- [1m[32mjsx/file1.tsx[39m[22m [1:1 - 35:2] (35 lines, 143 tokens)
jsx/file2.tsx [1:1 - 35:2]
[1mClone found (julia)[22m
- [1m[32mjulia/file1.jl[39m[22m [1:1 - 30:4] (30 lines, 194 tokens)
julia/file2.jl [1:1 - 30:4]
[1mClone found (latex)[22m
- [1m[32mlatex/file1.tex[39m[22m [1:1 - 26:13] (26 lines, 149 tokens)
latex/file2.tex [1:1 - 26:13]
[1mClone found (lilypond)[22m
- [1m[32mlilypond/file1.ly[39m[22m [1:1 - 19:10] (19 lines, 63 tokens)
lilypond/file2.ly [1:1 - 19:10]
[1mClone found (linker-script)[22m
- [1m[32mlinker-script/file1.ld[39m[22m [1:1 - 47:4] (47 lines, 256 tokens)
linker-script/file2.ld [1:1 - 47:4]
[1mClone found (livescript)[22m
- [1m[32mlivescript/file1.ls[39m[22m [1:1 - 31:24] (31 lines, 145 tokens)
livescript/file2.ls [1:1 - 31:24]
[1mClone found (llvm)[22m
- [1m[32mllvm/file1.ll[39m[22m [1:1 - 35:2] (35 lines, 215 tokens)
llvm/file2.ll [1:1 - 35:2]
[1mClone found (log)[22m
- [1m[32mlog/file1.log[39m[22m [1:1 - 13:11] (13 lines, 262 tokens)
log/file2.log [1:1 - 13:11]
[1mClone found (lua)[22m
- [1m[32mlua/file1.lua[39m[22m [1:1 - 46:4] (46 lines, 193 tokens)
lua/file2.lua [1:1 - 46:4]
[1mClone found (markdown)[22m
- [1m[32mmarkdown/file1.md:markdown[39m[22m [2:1 - 176:3] (175 lines, 1238 tokens)
markdown/file2.md:markdown [7:1 - 181:3]
[1mClone found (markdown)[22m
- [1m[32mmarkdown/file1.md:markdown[39m[22m [176:1 - 193:86] (18 lines, 100 tokens)
markdown/file2.md:markdown [196:1 - 213:86]
[1mClone found (text)[22m
- [1m[32mmarkdown/file1.md:text[39m[22m [156:1 - 166:11] (11 lines, 69 tokens)
markdown/file2.md:text [161:1 - 171:11]
[1mClone found (yaml)[22m
- [1m[32mmarkdown/file1.md:yaml[39m[22m [53:1 - 81:10] (29 lines, 60 tokens)
markdown/file2.md:yaml [58:1 - 86:10]
[1mClone found (markdown)[22m
- [1m[32mmarkdown/file3.md:markdown[39m[22m [27:85 - 98:66] (72 lines, 69 tokens)
markdown/file4.md:markdown [27:89 - 98:66]
[1mClone found (python)[22m
- [1m[32mmarkdown/file3.md:python[39m[22m [72:1 - 91:6] (20 lines, 137 tokens)
markdown/file4.md:python [72:1 - 91:6]
[1mClone found (typescript)[22m
- [1m[32mmarkdown/file3.md:typescript[39m[22m [34:1 - 64:2] (31 lines, 156 tokens)
markdown/file4.md:typescript [34:1 - 64:2]
[1mClone found (wolfram)[22m
- [1m[32mmathematica/file1.wl[39m[22m [1:1 - 17:3] (17 lines, 127 tokens)
mathematica/file2.wl [1:1 - 17:3]
[1mClone found (fsharp)[22m
- [1m[32mmllike/file1.fs[39m[22m [1:1 - 35:6] (35 lines, 193 tokens)
mllike/file2.fs [1:1 - 35:6]
[1mClone found (ocaml)[22m
- [1m[32mmllike/file1.ml[39m[22m [1:1 - 30:18] (30 lines, 150 tokens)
mllike/file2.ml [1:1 - 30:18]
[1mClone found (ocaml)[22m
- [1m[32mmllike/file1.mli[39m[22m [1:1 - 29:20] (29 lines, 186 tokens)
mllike/file2.mli [1:1 - 29:20]
[1mClone found (ocaml)[22m
- [1m[32mmllike/file1.mll[39m[22m [1:1 - 24:20] (24 lines, 104 tokens)
mllike/file2.mll [1:1 - 24:20]
[1mClone found (nsis)[22m
- [1m[32mnsis/file1.nsi[39m[22m [1:1 - 29:25] (29 lines, 71 tokens)
nsis/file2.nsi [1:1 - 29:25]
[1mClone found (c-header)[22m
- [1m[32mobjective-c/file_1.h[39m[22m [1:1 - 33:2] (33 lines, 385 tokens)
objective-c/file_2.h [1:1 - 33:2]
[1mClone found (objectivec)[22m
- [1m[32mobjective-c/file_1.m[39m[22m [1:1 - 12:35] (12 lines, 311 tokens)
objective-c/file_2.m [1:1 - 12:35]
[1mClone found (objectivec)[22m
- [1m[32mobjective-c/file_1.m[39m[22m [14:1 - 64:5] (51 lines, 216 tokens)
objective-c/file_2.m [38:1 - 88:5]
[1mClone found (javascript)[22m
- [1m[32mone-file/one-file.js[39m[22m [1:1 - 28:6] (28 lines, 165 tokens)
one-file/one-file.js [32:1 - 59:6]
[1mClone found (openqasm)[22m
- [1m[32mopenqasm/file1.qasm[39m[22m [5:1 - 23:7] (19 lines, 92 tokens)
openqasm/file2.qasm [23:1 - 41:7]
[1mClone found (oz)[22m
- [1m[32moz/file1.oz[39m[22m [1:1 - 37:20] (37 lines, 141 tokens)
oz/file2.oz [1:1 - 37:20]
[1mClone found (pascal)[22m
- [1m[32mpascal/file1.pas[39m[22m [1:1 - 37:5] (37 lines, 203 tokens)
pascal/file2.pas [1:1 - 37:5]
[1mClone found (perl)[22m
- [1m[32mperl/file1.pl[39m[22m [1:1 - 121:31] (121 lines, 331 tokens)
perl/file2.pl [1:1 - 121:31]
[1mClone found (perl)[22m
- [1m[32mperl/file1.pm[39m[22m [1:1 - 143:4] (143 lines, 586 tokens)
perl/file2.pm [1:1 - 143:4]
[1mClone found (perl)[22m
- [1m[32mperl/file1.pm[39m[22m [143:3 - 155:3] (13 lines, 54 tokens)
perl/file2.pm [176:3 - 188:3]
[1mClone found (php)[22m
- [1m[32mphp/file1.php[39m[22m [1:1 - 51:20] (51 lines, 295 tokens)
php/file2.php [1:1 - 51:20]
[1mClone found (plant-uml)[22m
- [1m[32mplant-uml/file1.puml[39m[22m [1:1 - 52:40] (52 lines, 181 tokens)
plant-uml/file2.puml [1:1 - 52:40]
[1mClone found (plsql)[22m
- [1m[32mplsql/file1.plsql[39m[22m [1:1 - 56:12] (56 lines, 191 tokens)
plsql/file2.plsql [1:1 - 56:12]
[1mClone found (plsql)[22m
- [1m[32mplsql/file1.plsql[39m[22m [70:20 - 85:2] (16 lines, 53 tokens)
plsql/file2.plsql [71:25 - 86:2]
[1mClone found (powerquery)[22m
- [1m[32mpowerquery/file1.pq[39m[22m [1:1 - 41:7] (41 lines, 210 tokens)
powerquery/file2.pq [1:1 - 41:7]
[1mClone found (powershell)[22m
- [1m[32mpowershell/file1.ps1[39m[22m [1:1 - 41:2] (41 lines, 168 tokens)
powershell/file2.ps1 [1:1 - 41:2]
[1mClone found (ini)[22m
- [1m[32mproperties/file1.ini[39m[22m [1:1 - 27:7] (27 lines, 79 tokens)
properties/file2.ini [1:1 - 27:7]
[1mClone found (properties)[22m
- [1m[32mproperties/file1.properties[39m[22m [1:1 - 22:11] (22 lines, 114 tokens)
properties/file2.properties [1:1 - 22:11]
[1mClone found (protobuf)[22m
- [1m[32mprotobuf/file1.proto[39m[22m [1:1 - 40:8] (40 lines, 115 tokens)
protobuf/file2.proto [1:1 - 40:8]
[1mClone found (pug)[22m
- [1m[32mpug/file1.pug[39m[22m [1:1 - 234:21] (234 lines, 1037 tokens)
pug/file2.pug [1:1 - 234:21]
[1mClone found (pug)[22m
- [1m[32mpug/file1.pug[39m[22m [239:36 - 291:67] (53 lines, 212 tokens)
pug/file2.pug [231:30 - 283:67]
[1mClone found (puppet)[22m
- [1m[32mpuppet/file1.pp[39m[22m [1:1 - 39:4] (39 lines, 131 tokens)
puppet/file2.pp [1:1 - 39:4]
[1mClone found (puppet)[22m
- [1m[32mpuppet/file1.pp[39m[22m [44:32 - 64:2] (21 lines, 83 tokens)
puppet/file2.pp [38:38 - 58:2]
[1mClone found (purescript)[22m
- [1m[32mpurescript/file1.purs[39m[22m [1:1 - 44:7] (44 lines, 265 tokens)
purescript/file2.purs [1:1 - 44:7]
[1mClone found (purescript)[22m
- [1m[32mpurescript/file1.purs[39m[22m [47:41 - 53:44] (7 lines, 50 tokens)
purescript/file2.purs [47:40 - 53:44]
[1mClone found (python)[22m
- [1m[32mpython/file1.py[39m[22m [1:1 - 24:13] (24 lines, 67 tokens)
python/file2.py [1:1 - 24:13]
[1mClone found (q)[22m
- [1m[32mq/file1.q[39m[22m [1:1 - 30:2] (30 lines, 378 tokens)
q/file2.q [1:1 - 30:2]
[1mClone found (qsharp)[22m
- [1m[32mqsharp/file1.qs[39m[22m [2:32 - 11:6] (10 lines, 50 tokens)
qsharp/file2.qs [2:29 - 11:6]
[1mClone found (r)[22m
- [1m[32mr/file1.r[39m[22m [1:1 - 64:9] (64 lines, 427 tokens)
r/file2.r [1:1 - 64:9]
[1mClone found (racket)[22m
- [1m[32mracket/file1.rkt[39m[22m [1:1 - 38:3] (38 lines, 286 tokens)
racket/file2.rkt [1:1 - 38:3]
[1mClone found (rescript)[22m
- [1m[32mrescript/file1.res[39m[22m [1:1 - 38:2] (38 lines, 200 tokens)
rescript/file2.res [1:1 - 38:2]
[1mClone found (robotframework)[22m
- [1m[32mrobotframework/file1.robot[39m[22m [1:1 - 27:45] (27 lines, 143 tokens)
robotframework/file2.robot [1:1 - 27:45]
[1mClone found (robotframework)[22m
- [1m[32mrobotframework/file1.robot[39m[22m [45:1 - 62:23] (18 lines, 80 tokens)
robotframework/file2.robot [51:1 - 68:23]
[1mClone found (ruby)[22m
- [1m[32mruby/file1.rb[39m[22m [1:1 - 40:4] (40 lines, 96 tokens)
ruby/file2.rb [1:1 - 40:4]
[1mClone found (rust)[22m
- [1m[32mrust/file1.rs[39m[22m [1:1 - 131:3] (131 lines, 857 tokens)
rust/file2.rs [1:1 - 132:3]
[1mClone found (rust)[22m
- [1m[32mrust/file1.rs[39m[22m [199:50 - 204:2] (6 lines, 51 tokens)
rust/file1.rs [255:53 - 260:2]
[1mClone found (rust)[22m
- [1m[32mrust/file1.rs[39m[22m [232:93 - 239:64] (8 lines, 58 tokens)
rust/file1.rs [247:47 - 254:64]
[1mClone found (rust)[22m
- [1m[32mrust/file1.rs[39m[22m [239:57 - 416:2] (178 lines, 1285 tokens)
rust/file2.rs [123:52 - 301:2]
[1mClone found (rust)[22m
- [1m[32mrust/file1.rs[39m[22m [263:28 - 273:12] (11 lines, 80 tokens)
rust/file1.rs [335:21 - 345:12]
[1mClone found (rust)[22m
- [1m[32mrust/file1.rs[39m[22m [319:60 - 332:2] (14 lines, 114 tokens)
rust/file1.rs [371:96 - 384:2]
[1mClone found (sas)[22m
- [1m[32msas/file1.sas[39m[22m [1:1 - 59:4] (59 lines, 444 tokens)
sas/file2.sas [1:1 - 59:4]
[1mClone found (sass)[22m
- [1m[32msass/file1.sass[39m[22m [1:1 - 19:17] (19 lines, 89 tokens)
sass/file2.sass [1:1 - 19:17]
[1mClone found (sass)[22m
- [1m[32msass/file1.sass[39m[22m [3:1 - 17:43] (15 lines, 82 tokens)
sass/file1.sass [19:1 - 33:43]
[1mClone found (sass)[22m
- [1m[32msass/file1.sass[39m[22m [5:1 - 24:45] (20 lines, 102 tokens)
sass/file2.sass [24:1 - 48:33]
[1mClone found (scheme)[22m
- [1m[32mscheme/file1.scm[39m[22m [1:1 - 33:23] (33 lines, 225 tokens)
scheme/file2.scm [1:1 - 33:23]
[1mClone found (bash)[22m
- [1m[32mshebang/build[39m[22m [1:1 - 32:2] (32 lines, 86 tokens)
shebang/deploy [1:1 - 32:2]
[1mClone found (bash)[22m
- [1m[32mshebang/build[39m[22m [1:1 - 32:2] (32 lines, 86 tokens)
shell/file1.sh [1:1 - 32:2]
[1mClone found (bash)[22m
- [1m[32mshebang/build[39m[22m [1:1 - 32:2] (32 lines, 86 tokens)
shell/file2.sh [1:1 - 32:2]
[1mClone found (python)[22m
- [1m[32mshebang/process[39m[22m [1:1 - 32:4] (32 lines, 159 tokens)
shebang/transform [1:1 - 32:4]
[1mClone found (smalltalk)[22m
- [1m[32msmalltalk/file1.st[39m[22m [1:1 - 45:2] (45 lines, 146 tokens)
smalltalk/file2.st [1:1 - 45:2]
[1mClone found (smarty)[22m
- [1m[32msmarty/file1.tpl[39m[22m [1:1 - 43:18] (43 lines, 286 tokens)
smarty/file2.tpl [1:1 - 43:18]
[1mClone found (solidity)[22m
- [1m[32msolidity/file1.sol[39m[22m [25:61 - 55:13] (31 lines, 168 tokens)
solidity/file2.sol [29:54 - 59:13]
[1mClone found (soy)[22m
- [1m[32msoy/file1.soy[39m[22m [1:1 - 49:27] (49 lines, 346 tokens)
soy/file2.soy [1:1 - 49:27]
[1mClone found (sparql)[22m
- [1m[32msparql/file1.rq[39m[22m [1:1 - 11:9] (11 lines, 65 tokens)
sparql/file2.rq [1:1 - 11:9]
[1mClone found (sql)[22m
- [1m[32msql/file1.sql[39m[22m [3:1 - 41:46] (39 lines, 214 tokens)
sql/file2.sql [3:1 - 41:46]
[1mClone found (stylus)[22m
- [1m[32mstylus/file1.styl[39m[22m [1:1 - 53:20] (53 lines, 201 tokens)
stylus/file2.styl [1:1 - 53:20]
[1mClone found (css)[22m
- [1m[32msvelte/component1.svelte:css[39m[22m [112:3 - 230:4] (119 lines, 507 tokens)
svelte/component2.svelte:css [112:3 - 230:4]
[1mClone found (html)[22m
- [1m[32msvelte/component1.svelte:html[39m[22m [1:1 - 231:9] (231 lines, 350 tokens)
svelte/component2.svelte:html [1:1 - 231:9]
[1mClone found (javascript)[22m
- [1m[32msvelte/component1.svelte:javascript[39m[22m [2:3 - 61:6] (60 lines, 286 tokens)
svelte/component2.svelte:javascript [2:3 - 61:6]
[1mClone found (swift)[22m
- [1m[32mswift/file1.swift[39m[22m [9:1 - 29:6] (21 lines, 73 tokens)
swift/file2.swift [2:1 - 22:6]
[1mClone found (tap)[22m
- [1m[32mtap/file1.tap[39m[22m [1:1 - 35:8] (35 lines, 202 tokens)
tap/file2.tap [1:1 - 35:8]
[1mClone found (tcl)[22m
- [1m[32mtcl/file1.tcl[39m[22m [1:1 - 45:2] (45 lines, 263 tokens)
tcl/file2.tcl [1:1 - 45:2]
[1mClone found (textile)[22m
- [1m[32mtextile/file1.textile[39m[22m [1:1 - 51:4] (51 lines, 236 tokens)
textile/file2.textile [1:1 - 51:4]
[1mClone found (toml)[22m
- [1m[32mtoml/file1.toml[39m[22m [1:1 - 39:19] (39 lines, 100 tokens)
toml/file2.toml [1:1 - 39:19]
[1mClone found (tt2)[22m
- [1m[32mtt2/file1.tt2[39m[22m [1:1 - 38:14] (38 lines, 299 tokens)
tt2/file2.tt2 [1:1 - 38:14]
[1mClone found (tt2)[22m
- [1m[32mtt2/file1.tt2[39m[22m [42:21 - 52:25] (11 lines, 54 tokens)
tt2/file2.tt2 [42:86 - 52:25]
[1mClone found (turtle)[22m
- [1m[32mturtle/file1.ttl[39m[22m [1:1 - 36:17] (36 lines, 212 tokens)
turtle/file2.ttl [1:1 - 36:17]
[1mClone found (twig)[22m
- [1m[32mtwig/file_1.twig[39m[22m [1:1 - 23:3] (23 lines, 167 tokens)
twig/file_2.twig [1:1 - 23:3]
[1mClone found (twig)[22m
- [1m[32mtwig/file_1.twig[39m[22m [13:20 - 25:9] (13 lines, 65 tokens)
twig/file_1.twig [16:8 - 28:9]
[1mClone found (twig)[22m
- [1m[32mtwig/file_1.twig[39m[22m [19:8 - 29:15] (11 lines, 54 tokens)
twig/file_2.twig [22:8 - 32:15]
[1mClone found (unrealscript)[22m
- [1m[32munrealscript/file1.uc[39m[22m [1:1 - 56:6] (56 lines, 161 tokens)
unrealscript/file2.uc [1:1 - 56:6]
[1mClone found (vbnet)[22m
- [1m[32mvb/file1.vb[39m[22m [1:1 - 29:17] (29 lines, 163 tokens)
vb/file2.vb [1:1 - 29:17]
[1mClone found (velocity)[22m
- [1m[32mvelocity/file1.vtl[39m[22m [1:1 - 41:25] (41 lines, 264 tokens)
velocity/file2.vtl [1:1 - 41:25]
[1mClone found (verilog)[22m
- [1m[32mverilog/file1.v[39m[22m [1:1 - 40:10] (40 lines, 163 tokens)
verilog/file2.v [1:1 - 40:10]
[1mClone found (vhdl)[22m
- [1m[32mvhdl/file1.vhd[39m[22m [1:1 - 32:18] (32 lines, 179 tokens)
vhdl/file2.vhd [1:1 - 32:18]
[1mClone found (typescript)[22m
- [1m[32mvue/app1.vue:typescript[39m[22m [5:1 - 33:4] (29 lines, 128 tokens)
vue/app2.vue:typescript [5:1 - 33:4]
[1mClone found (javascript)[22m
- [1m[32mvue/file.js[39m[22m [1:1 - 28:2] (28 lines, 210 tokens)
vue/file1.vue:javascript [125:3 - 152:4]
[1mClone found (html)[22m
- [1m[32mvue/file1.vue:html[39m[22m [1:1 - 10:9] (10 lines, 99 tokens)
vue/file2.vue:html [1:1 - 10:9]
[1mClone found (javascript)[22m
- [1m[32mvue/file1.vue:javascript[39m[22m [120:3 - 261:4] (142 lines, 817 tokens)
vue/file2.vue:javascript [99:3 - 240:4]
[1mClone found (scss)[22m
- [1m[32mvue/file1.vue:scss[39m[22m [13:3 - 75:6] (63 lines, 402 tokens)
vue/file2.vue:scss [13:3 - 75:6]
[1mClone found (scss)[22m
- [1m[32mvue/file1.vue:scss[39m[22m [95:5 - 117:4] (23 lines, 149 tokens)
vue/file2.vue:scss [74:5 - 96:4]
[1mClone found (wgsl)[22m
- [1m[32mwgsl/file1.wgsl[39m[22m [1:1 - 45:3] (45 lines, 274 tokens)
wgsl/file2.wgsl [1:1 - 45:3]
[1mClone found (wgsl)[22m
- [1m[32mwgsl/file1.wgsl[39m[22m [51:42 - 59:6] (9 lines, 66 tokens)
wgsl/file2.wgsl [55:47 - 63:6]
[1mClone found (markup)[22m
- [1m[32mxml/file1.svg[39m[22m [1:1 - 88:2] (88 lines, 392 tokens)
xml/file2.svg [1:1 - 87:6]
[1mClone found (markup)[22m
- [1m[32mxml/file1.xsl[39m[22m [1:1 - 43:6] (43 lines, 316 tokens)
xml/file2.xsl [1:1 - 43:2]
[1mClone found (markup)[22m
- [1m[32mxml/file1.xsl[39m[22m [20:15 - 35:6] (16 lines, 133 tokens)
xml/file1.xsl [32:137 - 47:2]
[1mClone found (xquery)[22m
- [1m[32mxquery/file1.xquery[39m[22m [1:1 - 31:22] (31 lines, 222 tokens)
xquery/file2.xquery [1:1 - 31:22]
[1mClone found (yaml)[22m
- [1m[32myaml/file1.yml[39m[22m [1:1 - 18:23] (18 lines, 132 tokens)
yaml/file2.yml [1:1 - 18:23]
[1mClone found (c)[22m
- [1m[32mz80/file1.z80[39m[22m [1:1 - 14:25] (14 lines, 60 tokens)
z80/file2.z80 [1:1 - 14:25]
[1mClone found (zig)[22m
- [1m[32mzig/file1.zig[39m[22m [1:1 - 43:10] (43 lines, 259 tokens)
zig/file2.zig [1:1 - 43:10]
[1mClone found (zig)[22m
- [1m[32mzig/file1.zig[39m[22m [42:45 - 52:23] (11 lines, 52 tokens)
zig/file2.zig [47:45 - 57:23]
[90m┌────────────────┬────────────────┬─────────────┬──────────────┬──────────────┬──────────────────┬───────────────────┐[39m
[90m│[39m[31m Format [39m[90m│[39m[31m Files analyzed [39m[90m│[39m[31m Total lines [39m[90m│[39m[31m Total tokens [39m[90m│[39m[31m Clones found [39m[90m│[39m[31m Duplicated lines [39m[90m│[39m[31m Duplicated tokens [39m[90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m actionscript [90m│[39m 2 [90m│[39m 75 [90m│[39m 302 [90m│[39m 1 [90m│[39m 29 (38.67%) [90m│[39m 127 (42.05%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m ada [90m│[39m 2 [90m│[39m 74 [90m│[39m 408 [90m│[39m 1 [90m│[39m 20 (27.03%) [90m│[39m 103 (25.25%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m antlr4 [90m│[39m 2 [90m│[39m 48 [90m│[39m 216 [90m│[39m 1 [90m│[39m 20 (41.67%) [90m│[39m 82 (37.96%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m apex [90m│[39m 2 [90m│[39m 84 [90m│[39m 451 [90m│[39m 1 [90m│[39m 23 (27.38%) [90m│[39m 115 (25.50%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m apl [90m│[39m 2 [90m│[39m 47 [90m│[39m 554 [90m│[39m 1 [90m│[39m 19 (40.43%) [90m│[39m 252 (45.49%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m aspnet [90m│[39m 2 [90m│[39m 101 [90m│[39m 854 [90m│[39m 3 [90m│[39m 37 (36.63%) [90m│[39m 296 (34.66%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m astro [90m│[39m 2 [90m│[39m 324 [90m│[39m 950 [90m│[39m 0 [90m│[39m 0 (0.00%) [90m│[39m 0 (0.00%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m awk [90m│[39m 2 [90m│[39m 62 [90m│[39m 205 [90m│[39m 1 [90m│[39m 22 (35.48%) [90m│[39m 75 (36.59%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m bash [90m│[39m 4 [90m│[39m 158 [90m│[39m 418 [90m│[39m 3 [90m│[39m 93 (58.86%) [90m│[39m 258 (61.72%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m basic [90m│[39m 2 [90m│[39m 47 [90m│[39m 331 [90m│[39m 1 [90m│[39m 17 (36.17%) [90m│[39m 100 (30.21%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m bicep [90m│[39m 2 [90m│[39m 81 [90m│[39m 251 [90m│[39m 1 [90m│[39m 26 (32.10%) [90m│[39m 78 (31.08%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m brainfuck [90m│[39m 4 [90m│[39m 159 [90m│[39m 1728 [90m│[39m 4 [90m│[39m 113 (71.07%) [90m│[39m 1289 (74.59%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m c [90m│[39m 5 [90m│[39m 105 [90m│[39m 1060 [90m│[39m 3 [90m│[39m 40 (38.10%) [90m│[39m 399 (37.64%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m c-header [90m│[39m 4 [90m│[39m 149 [90m│[39m 2091 [90m│[39m 3 [90m│[39m 59 (39.60%) [90m│[39m 724 (34.62%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m cfml [90m│[39m 2 [90m│[39m 107 [90m│[39m 671 [90m│[39m 1 [90m│[39m 17 (15.89%) [90m│[39m 85 (12.67%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m cfscript [90m│[39m 2 [90m│[39m 69 [90m│[39m 437 [90m│[39m 1 [90m│[39m 27 (39.13%) [90m│[39m 161 (36.84%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m clojure [90m│[39m 2 [90m│[39m 46 [90m│[39m 374 [90m│[39m 1 [90m│[39m 18 (39.13%) [90m│[39m 139 (37.17%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m cmake [90m│[39m 2 [90m│[39m 52 [90m│[39m 311 [90m│[39m 1 [90m│[39m 20 (38.46%) [90m│[39m 128 (41.16%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m coffeescript [90m│[39m 2 [90m│[39m 92 [90m│[39m 447 [90m│[39m 2 [90m│[39m 40 (43.48%) [90m│[39m 219 (48.99%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m cpp [90m│[39m 2 [90m│[39m 176 [90m│[39m 1514 [90m│[39m 2 [90m│[39m 106 (60.23%) [90m│[39m 965 (63.74%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m cpp-header [90m│[39m 2 [90m│[39m 176 [90m│[39m 1514 [90m│[39m 2 [90m│[39m 106 (60.23%) [90m│[39m 965 (63.74%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m crystal [90m│[39m 2 [90m│[39m 70 [90m│[39m 222 [90m│[39m 1 [90m│[39m 28 (40.00%) [90m│[39m 97 (43.69%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m csharp [90m│[39m 2 [90m│[39m 360 [90m│[39m 1099 [90m│[39m 2 [90m│[39m 172 (47.78%) [90m│[39m 537 (48.86%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m css [90m│[39m 8 [90m│[39m 875 [90m│[39m 2536 [90m│[39m 5 [90m│[39m 290 (33.14%) [90m│[39m 1494 (58.91%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m csv [90m│[39m 2 [90m│[39m 22 [90m│[39m 400 [90m│[39m 1 [90m│[39m 8 (36.36%) [90m│[39m 163 (40.75%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m d [90m│[39m 2 [90m│[39m 338 [90m│[39m 2270 [90m│[39m 1 [90m│[39m 168 (49.70%) [90m│[39m 1135 (50.00%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m dart [90m│[39m 2 [90m│[39m 266 [90m│[39m 1178 [90m│[39m 2 [90m│[39m 118 (44.36%) [90m│[39m 522 (44.31%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m diff [90m│[39m 2 [90m│[39m 146 [90m│[39m 1082 [90m│[39m 1 [90m│[39m 61 (41.78%) [90m│[39m 435 (40.20%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m dot [90m│[39m 2 [90m│[39m 46 [90m│[39m 243 [90m│[39m 1 [90m│[39m 17 (36.96%) [90m│[39m 91 (37.45%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m eiffel [90m│[39m 2 [90m│[39m 126 [90m│[39m 380 [90m│[39m 1 [90m│[39m 45 (35.71%) [90m│[39m 130 (34.21%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m elm [90m│[39m 2 [90m│[39m 110 [90m│[39m 411 [90m│[39m 1 [90m│[39m 46 (41.82%) [90m│[39m 155 (37.71%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m erlang [90m│[39m 2 [90m│[39m 242 [90m│[39m 1674 [90m│[39m 1 [90m│[39m 120 (49.59%) [90m│[39m 837 (50.00%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m fortran [90m│[39m 2 [90m│[39m 93 [90m│[39m 469 [90m│[39m 1 [90m│[39m 36 (38.71%) [90m│[39m 182 (38.81%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m fsharp [90m│[39m 2 [90m│[39m 82 [90m│[39m 462 [90m│[39m 1 [90m│[39m 34 (41.46%) [90m│[39m 193 (41.77%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m gdscript [90m│[39m 2 [90m│[39m 96 [90m│[39m 458 [90m│[39m 1 [90m│[39m 24 (25.00%) [90m│[39m 135 (29.48%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m gettext [90m│[39m 2 [90m│[39m 220 [90m│[39m 356 [90m│[39m 1 [90m│[39m 51 (23.18%) [90m│[39m 82 (23.03%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m gherkin [90m│[39m 2 [90m│[39m 75 [90m│[39m 434 [90m│[39m 1 [90m│[39m 15 (20.00%) [90m│[39m 83 (19.12%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m go [90m│[39m 2 [90m│[39m 65 [90m│[39m 305 [90m│[39m 1 [90m│[39m 29 (44.62%) [90m│[39m 134 (43.93%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m graphql [90m│[39m 2 [90m│[39m 134 [90m│[39m 499 [90m│[39m 1 [90m│[39m 24 (17.91%) [90m│[39m 143 (28.66%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m groovy [90m│[39m 2 [90m│[39m 96 [90m│[39m 422 [90m│[39m 1 [90m│[39m 40 (41.67%) [90m│[39m 188 (44.55%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m haml [90m│[39m 2 [90m│[39m 52 [90m│[39m 276 [90m│[39m 1 [90m│[39m 22 (42.31%) [90m│[39m 118 (42.75%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m handlebars [90m│[39m 2 [90m│[39m 72 [90m│[39m 555 [90m│[39m 1 [90m│[39m 27 (37.50%) [90m│[39m 218 (39.28%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m haskell [90m│[39m 4 [90m│[39m 459 [90m│[39m 2536 [90m│[39m 3 [90m│[39m 216 (47.06%) [90m│[39m 1183 (46.65%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m haxe [90m│[39m 4 [90m│[39m 191 [90m│[39m 1035 [90m│[39m 3 [90m│[39m 113 (59.16%) [90m│[39m 634 (61.26%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m hcl [90m│[39m 2 [90m│[39m 119 [90m│[39m 313 [90m│[39m 1 [90m│[39m 36 (30.25%) [90m│[39m 85 (27.16%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m html [90m│[39m 6 [90m│[39m 1289 [90m│[39m 1390 [90m│[39m 4 [90m│[39m 406 (31.50%) [90m│[39m 762 (54.82%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m idris [90m│[39m 2 [90m│[39m 88 [90m│[39m 581 [90m│[39m 1 [90m│[39m 34 (38.64%) [90m│[39m 208 (35.80%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m ignore [90m│[39m 2 [90m│[39m 191 [90m│[39m 523 [90m│[39m 1 [90m│[39m 83 (43.46%) [90m│[39m 234 (44.74%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m ini [90m│[39m 2 [90m│[39m 58 [90m│[39m 172 [90m│[39m 1 [90m│[39m 26 (44.83%) [90m│[39m 79 (45.93%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m java [90m│[39m 2 [90m│[39m 454 [90m│[39m 15064 [90m│[39m 2 [90m│[39m 224 (49.34%) [90m│[39m 7387 (49.04%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m javascript [90m│[39m 23 [90m│[39m 1580 [90m│[39m 6985 [90m│[39m 13 [90m│[39m 572 (36.20%) [90m│[39m 3475 (49.75%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m json [90m│[39m 4 [90m│[39m 134 [90m│[39m 460 [90m│[39m 2 [90m│[39m 38 (28.36%) [90m│[39m 134 (29.13%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m json5 [90m│[39m 2 [90m│[39m 104 [90m│[39m 307 [90m│[39m 1 [90m│[39m 30 (28.85%) [90m│[39m 93 (30.29%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m jsx [90m│[39m 2 [90m│[39m 73 [90m│[39m 296 [90m│[39m 1 [90m│[39m 20 (27.40%) [90m│[39m 99 (33.45%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m julia [90m│[39m 2 [90m│[39m 76 [90m│[39m 557 [90m│[39m 1 [90m│[39m 29 (38.16%) [90m│[39m 194 (34.83%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m kotlin [90m│[39m 2 [90m│[39m 106 [90m│[39m 550 [90m│[39m 2 [90m│[39m 47 (44.34%) [90m│[39m 250 (45.45%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m latex [90m│[39m 2 [90m│[39m 88 [90m│[39m 557 [90m│[39m 1 [90m│[39m 25 (28.41%) [90m│[39m 149 (26.75%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m less [90m│[39m 2 [90m│[39m 56 [90m│[39m 518 [90m│[39m 2 [90m│[39m 29 (51.79%) [90m│[39m 282 (54.44%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m lilypond [90m│[39m 2 [90m│[39m 100 [90m│[39m 307 [90m│[39m 1 [90m│[39m 18 (18.00%) [90m│[39m 63 (20.52%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m linker-script [90m│[39m 2 [90m│[39m 133 [90m│[39m 683 [90m│[39m 1 [90m│[39m 46 (34.59%) [90m│[39m 256 (37.48%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m lisp [90m│[39m 2 [90m│[39m 106 [90m│[39m 608 [90m│[39m 1 [90m│[39m 49 (46.23%) [90m│[39m 289 (47.53%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m livescript [90m│[39m 2 [90m│[39m 68 [90m│[39m 344 [90m│[39m 1 [90m│[39m 30 (44.12%) [90m│[39m 145 (42.15%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m llvm [90m│[39m 2 [90m│[39m 132 [90m│[39m 850 [90m│[39m 1 [90m│[39m 34 (25.76%) [90m│[39m 215 (25.29%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m log [90m│[39m 2 [90m│[39m 30 [90m│[39m 666 [90m│[39m 1 [90m│[39m 12 (40.00%) [90m│[39m 262 (39.34%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m lua [90m│[39m 2 [90m│[39m 106 [90m│[39m 450 [90m│[39m 1 [90m│[39m 45 (42.45%) [90m│[39m 193 (42.89%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m markdown [90m│[39m 4 [90m│[39m 536 [90m│[39m 929 [90m│[39m 3 [90m│[39m 262 (48.88%) [90m│[39m 1407 (151.45%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m markup [90m│[39m 11 [90m│[39m 478 [90m│[39m 2795 [90m│[39m 6 [90m│[39m 205 (42.89%) [90m│[39m 1314 (47.01%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m nsis [90m│[39m 2 [90m│[39m 68 [90m│[39m 172 [90m│[39m 1 [90m│[39m 28 (41.18%) [90m│[39m 71 (41.28%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m objectivec [90m│[39m 2 [90m│[39m 152 [90m│[39m 1463 [90m│[39m 2 [90m│[39m 61 (40.13%) [90m│[39m 527 (36.02%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m ocaml [90m│[39m 6 [90m│[39m 186 [90m│[39m 1052 [90m│[39m 3 [90m│[39m 80 (43.01%) [90m│[39m 440 (41.83%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m openqasm [90m│[39m 2 [90m│[39m 87 [90m│[39m 346 [90m│[39m 1 [90m│[39m 18 (20.69%) [90m│[39m 92 (26.59%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m oz [90m│[39m 2 [90m│[39m 94 [90m│[39m 357 [90m│[39m 1 [90m│[39m 36 (38.30%) [90m│[39m 141 (39.50%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m pascal [90m│[39m 2 [90m│[39m 106 [90m│[39m 561 [90m│[39m 1 [90m│[39m 36 (33.96%) [90m│[39m 203 (36.19%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m perl [90m│[39m 4 [90m│[39m 609 [90m│[39m 2272 [90m│[39m 3 [90m│[39m 274 (44.99%) [90m│[39m 971 (42.74%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m php [90m│[39m 2 [90m│[39m 143 [90m│[39m 785 [90m│[39m 1 [90m│[39m 50 (34.97%) [90m│[39m 295 (37.58%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m plant-uml [90m│[39m 2 [90m│[39m 120 [90m│[39m 422 [90m│[39m 1 [90m│[39m 51 (42.50%) [90m│[39m 181 (42.89%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m plsql [90m│[39m 2 [90m│[39m 171 [90m│[39m 598 [90m│[39m 2 [90m│[39m 70 (40.94%) [90m│[39m 244 (40.80%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m powerquery [90m│[39m 2 [90m│[39m 112 [90m│[39m 538 [90m│[39m 1 [90m│[39m 40 (35.71%) [90m│[39m 210 (39.03%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m powershell [90m│[39m 2 [90m│[39m 98 [90m│[39m 404 [90m│[39m 1 [90m│[39m 40 (40.82%) [90m│[39m 168 (41.58%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m prolog [90m│[39m 2 [90m│[39m 64 [90m│[39m 429 [90m│[39m 1 [90m│[39m 27 (42.19%) [90m│[39m 176 (41.03%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m properties [90m│[39m 2 [90m│[39m 48 [90m│[39m 250 [90m│[39m 1 [90m│[39m 21 (43.75%) [90m│[39m 114 (45.60%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m protobuf [90m│[39m 2 [90m│[39m 205 [90m│[39m 680 [90m│[39m 1 [90m│[39m 39 (19.02%) [90m│[39m 115 (16.91%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m pug [90m│[39m 2 [90m│[39m 574 [90m│[39m 2512 [90m│[39m 2 [90m│[39m 285 (49.65%) [90m│[39m 1249 (49.72%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m puppet [90m│[39m 2 [90m│[39m 122 [90m│[39m 446 [90m│[39m 2 [90m│[39m 58 (47.54%) [90m│[39m 214 (47.98%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m purescript [90m│[39m 2 [90m│[39m 115 [90m│[39m 797 [90m│[39m 2 [90m│[39m 49 (42.61%) [90m│[39m 315 (39.52%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m python [90m│[39m 6 [90m│[39m 323 [90m│[39m 911 [90m│[39m 3 [90m│[39m 73 (22.60%) [90m│[39m 363 (39.85%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m q [90m│[39m 2 [90m│[39m 78 [90m│[39m 997 [90m│[39m 1 [90m│[39m 29 (37.18%) [90m│[39m 378 (37.91%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m qsharp [90m│[39m 2 [90m│[39m 102 [90m│[39m 408 [90m│[39m 1 [90m│[39m 9 (8.82%) [90m│[39m 50 (12.25%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m r [90m│[39m 2 [90m│[39m 128 [90m│[39m 854 [90m│[39m 1 [90m│[39m 63 (49.22%) [90m│[39m 427 (50.00%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m racket [90m│[39m 2 [90m│[39m 100 [90m│[39m 760 [90m│[39m 1 [90m│[39m 37 (37.00%) [90m│[39m 286 (37.63%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m rescript [90m│[39m 2 [90m│[39m 115 [90m│[39m 776 [90m│[39m 1 [90m│[39m 37 (32.17%) [90m│[39m 200 (25.77%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m robotframework [90m│[39m 2 [90m│[39m 130 [90m│[39m 630 [90m│[39m 2 [90m│[39m 43 (33.08%) [90m│[39m 223 (35.40%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m ruby [90m│[39m 2 [90m│[39m 80 [90m│[39m 192 [90m│[39m 1 [90m│[39m 39 (48.75%) [90m│[39m 96 (50.00%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m rust [90m│[39m 2 [90m│[39m 717 [90m│[39m 5128 [90m│[39m 6 [90m│[39m 342 (47.70%) [90m│[39m 2445 (47.68%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m sas [90m│[39m 2 [90m│[39m 152 [90m│[39m 1174 [90m│[39m 1 [90m│[39m 58 (38.16%) [90m│[39m 444 (37.82%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m sass [90m│[39m 2 [90m│[39m 93 [90m│[39m 383 [90m│[39m 3 [90m│[39m 51 (54.84%) [90m│[39m 273 (71.28%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m scala [90m│[39m 2 [90m│[39m 58 [90m│[39m 1696 [90m│[39m 1 [90m│[39m 28 (48.28%) [90m│[39m 848 (50.00%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m scheme [90m│[39m 2 [90m│[39m 70 [90m│[39m 498 [90m│[39m 1 [90m│[39m 32 (45.71%) [90m│[39m 225 (45.18%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m scss [90m│[39m 4 [90m│[39m 360 [90m│[39m 2065 [90m│[39m 3 [90m│[39m 136 (37.78%) [90m│[39m 875 (42.37%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m smalltalk [90m│[39m 2 [90m│[39m 102 [90m│[39m 351 [90m│[39m 1 [90m│[39m 44 (43.14%) [90m│[39m 146 (41.60%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m smarty [90m│[39m 2 [90m│[39m 92 [90m│[39m 652 [90m│[39m 1 [90m│[39m 42 (45.65%) [90m│[39m 286 (43.87%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m solidity [90m│[39m 2 [90m│[39m 155 [90m│[39m 939 [90m│[39m 1 [90m│[39m 30 (19.35%) [90m│[39m 168 (17.89%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m soy [90m│[39m 2 [90m│[39m 106 [90m│[39m 841 [90m│[39m 1 [90m│[39m 48 (45.28%) [90m│[39m 346 (41.14%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m sparql [90m│[39m 2 [90m│[39m 54 [90m│[39m 296 [90m│[39m 1 [90m│[39m 10 (18.52%) [90m│[39m 65 (21.96%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m sql [90m│[39m 2 [90m│[39m 102 [90m│[39m 525 [90m│[39m 1 [90m│[39m 38 (37.25%) [90m│[39m 214 (40.76%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m stylus [90m│[39m 2 [90m│[39m 129 [90m│[39m 494 [90m│[39m 1 [90m│[39m 52 (40.31%) [90m│[39m 201 (40.69%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m svelte [90m│[39m 2 [90m│[39m 462 [90m│[39m 1586 [90m│[39m 0 [90m│[39m 0 (0.00%) [90m│[39m 0 (0.00%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m swift [90m│[39m 2 [90m│[39m 58 [90m│[39m 175 [90m│[39m 1 [90m│[39m 20 (34.48%) [90m│[39m 73 (41.71%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m tap [90m│[39m 2 [90m│[39m 98 [90m│[39m 562 [90m│[39m 1 [90m│[39m 34 (34.69%) [90m│[39m 202 (35.94%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m tcl [90m│[39m 2 [90m│[39m 106 [90m│[39m 600 [90m│[39m 1 [90m│[39m 44 (41.51%) [90m│[39m 263 (43.83%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m text [90m│[39m 2 [90m│[39m 354 [90m│[39m 143 [90m│[39m 1 [90m│[39m 10 (2.82%) [90m│[39m 69 (48.25%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m textile [90m│[39m 2 [90m│[39m 106 [90m│[39m 495 [90m│[39m 1 [90m│[39m 50 (47.17%) [90m│[39m 236 (47.68%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m toml [90m│[39m 2 [90m│[39m 91 [90m│[39m 229 [90m│[39m 1 [90m│[39m 38 (41.76%) [90m│[39m 100 (43.67%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m tsx [90m│[39m 2 [90m│[39m 76 [90m│[39m 310 [90m│[39m 1 [90m│[39m 34 (44.74%) [90m│[39m 143 (46.13%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m tt2 [90m│[39m 2 [90m│[39m 104 [90m│[39m 803 [90m│[39m 2 [90m│[39m 47 (45.19%) [90m│[39m 353 (43.96%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m turtle [90m│[39m 2 [90m│[39m 90 [90m│[39m 520 [90m│[39m 1 [90m│[39m 35 (38.89%) [90m│[39m 212 (40.77%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m twig [90m│[39m 2 [90m│[39m 61 [90m│[39m 424 [90m│[39m 3 [90m│[39m 44 (72.13%) [90m│[39m 286 (67.45%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m txt [90m│[39m 4 [90m│[39m 146 [90m│[39m 870 [90m│[39m 2 [90m│[39m 71 (48.63%) [90m│[39m 435 (50.00%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m typescript [90m│[39m 12 [90m│[39m 2159 [90m│[39m 9379 [90m│[39m 8 [90m│[39m 958 (44.37%) [90m│[39m 4688 (49.98%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m unrealscript [90m│[39m 2 [90m│[39m 166 [90m│[39m 520 [90m│[39m 1 [90m│[39m 55 (33.13%) [90m│[39m 161 (30.96%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m vbnet [90m│[39m 2 [90m│[39m 72 [90m│[39m 378 [90m│[39m 1 [90m│[39m 28 (38.89%) [90m│[39m 163 (43.12%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m velocity [90m│[39m 2 [90m│[39m 88 [90m│[39m 576 [90m│[39m 1 [90m│[39m 40 (45.45%) [90m│[39m 264 (45.83%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m verilog [90m│[39m 2 [90m│[39m 104 [90m│[39m 430 [90m│[39m 1 [90m│[39m 39 (37.50%) [90m│[39m 163 (37.91%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m vhdl [90m│[39m 2 [90m│[39m 98 [90m│[39m 546 [90m│[39m 1 [90m│[39m 31 (31.63%) [90m│[39m 179 (32.78%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m vue [90m│[39m 4 [90m│[39m 587 [90m│[39m 3333 [90m│[39m 0 [90m│[39m 0 (0.00%) [90m│[39m 0 (0.00%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m wgsl [90m│[39m 2 [90m│[39m 127 [90m│[39m 928 [90m│[39m 2 [90m│[39m 52 (40.94%) [90m│[39m 340 (36.64%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m wolfram [90m│[39m 2 [90m│[39m 85 [90m│[39m 697 [90m│[39m 1 [90m│[39m 16 (18.82%) [90m│[39m 127 (18.22%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m xquery [90m│[39m 2 [90m│[39m 80 [90m│[39m 640 [90m│[39m 1 [90m│[39m 30 (37.50%) [90m│[39m 222 (34.69%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m yaml [90m│[39m 6 [90m│[39m 262 [90m│[39m 554 [90m│[39m 2 [90m│[39m 45 (17.18%) [90m│[39m 192 (34.66%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m zig [90m│[39m 2 [90m│[39m 130 [90m│[39m 827 [90m│[39m 2 [90m│[39m 52 (40.00%) [90m│[39m 311 (37.61%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m [1mTotal:[22m [90m│[39m 347 [90m│[39m 24603 [90m│[39m 130473 [90m│[39m 212 [90m│[39m 9133 (37.12%) [90m│[39m 56491 (43.30%) [90m│[39m
[90m└────────────────┴────────────────┴─────────────┴──────────────┴──────────────┴──────────────────┴───────────────────┘[39m
[90mFound 212 clones.[39m
[90mtime: 23.314ms[39m
[90m💡 Auto-refactor with AI: [1m[39mnpx skills add https://github.com/kucherenko/jscpd --skill dry-refactoring[90m[22m
[90m🎩 New: Gangsta Agents — discipline your AI coding → gangsta.page[39m
[90m💖 Support jscpd project → https://opencollective.com/jscpd[39m
npm package or from . Corrected this false claim
across all docs and rewrote rust/jscpd/README.md (the README npm
publishes as jscpd@5): added badges, supported-formats summary, CI
snippet, links section, and v4 differences table.
2026-06-22 18:35:46 +02:00
| [`jscpd` (crates.io) ](https://crates.io/crates/jscpd ) | `jscpd` **and ** `cpd` | Rust-native install; both binaries |
docs: reorganize documentation into docs/ folder, separate v4/v5 docs
- Split the overloaded README.md into focused docs:
- docs/typescript.md: v4 (Node.js) CLI, reporters, API, config
- docs/rust.md: v5 (Rust) CLI, reporters, blame, differences from v4
- docs/ai-ready.md: AI reporter, agent skills, MCP server
- docs/api.md: Programming APIs (TypeScript and Rust)
- docs/packages.md: Monorepo package and crate overview
- Trim README.md to a concise entry point with links to docs/
- Slim down rust/README.md, rust/jscpd/README.md, rust/npm/README.md:
remove duplicated content, link to docs/rust.md for details
- Fix factual errors verified against actual CLI output:
- Format count: 223 (v5) and 224 (v4), not '225+'
- Reporter output filenames: jscpd-report.* not cpd.*
- --max-size: no default in v5 (not 512KB)
- --formats-exts: same hyphenated form in both v4 and v5
- --no-gitignore: same flag name in both v4 and v5
- Update rust/jscpd/package.json: add 'cpd' bin so jscpd@5
installs both jscpd and cpd commands
- Update crate versions in rust/README.md to match source (0.1.3/0.1.4)
2026-06-08 12:57:38 +02:00
docs(readme): fix jscpd@5 bin claim and refresh npm README
The jscpd@5 npm package only installs the [1mClone found (actionscript)[22m
- [1m[32mactionscript/file1.as[39m[22m [1:1 - 30:10] (30 lines, 127 tokens)
actionscript/file2.as [1:1 - 30:10]
[1mClone found (ada)[22m
- [1m[32mada/file1.ada[39m[22m [1:1 - 21:12] (21 lines, 103 tokens)
ada/file2.ada [1:1 - 21:12]
[1mClone found (antlr4)[22m
- [1m[32mantlr4/file1.g4[39m[22m [1:1 - 21:27] (21 lines, 82 tokens)
antlr4/file2.g4 [1:1 - 21:27]
[1mClone found (apex)[22m
- [1m[32mapex/file1.cls[39m[22m [1:29 - 24:18] (24 lines, 115 tokens)
apex/file2.cls [1:29 - 24:18]
[1mClone found (apl)[22m
- [1m[32mapl/file1.apl[39m[22m [1:1 - 20:54] (20 lines, 252 tokens)
apl/file2.apl [1:1 - 20:54]
[1mClone found (css)[22m
- [1m[32mastro/component1.astro:css[39m[22m [76:3 - 161:4] (86 lines, 364 tokens)
astro/component2.astro:css [76:3 - 161:4]
[1mClone found (css)[22m
- [1m[32mastro/component1.astro:css[39m[22m [79:23 - 124:12] (46 lines, 194 tokens)
svelte/component1.svelte:css [116:28 - 161:12]
[1mClone found (html)[22m
- [1m[32mastro/component1.astro:html[39m[22m [1:1 - 162:9] (162 lines, 246 tokens)
astro/component2.astro:html [1:1 - 162:9]
[1mClone found (html)[22m
- [1m[32mastro/component1.astro:html[39m[22m [27:1 - 33:8] (7 lines, 67 tokens)
svelte/component1.svelte:html [64:1 - 70:8]
[1mClone found (javascript)[22m
- [1m[32mastro/component1.astro:javascript[39m[22m [58:3 - 72:4] (15 lines, 111 tokens)
astro/component2.astro:javascript [58:3 - 72:4]
[1mClone found (typescript)[22m
- [1m[32mastro/component1.astro:typescript[39m[22m [2:1 - 24:4] (23 lines, 153 tokens)
astro/component2.astro:typescript [2:1 - 24:4]
[1mClone found (awk)[22m
- [1m[32mawk/file1.awk[39m[22m [1:1 - 23:33] (23 lines, 75 tokens)
awk/file2.awk [1:1 - 23:33]
[1mClone found (basic)[22m
- [1m[32mbasic/file1.bas[39m[22m [1:1 - 18:4] (18 lines, 100 tokens)
basic/file2.bas [1:1 - 18:4]
[1mClone found (bicep)[22m
- [1m[32mbicep/file1.bicep[39m[22m [1:1 - 27:9] (27 lines, 78 tokens)
bicep/file2.bicep [1:1 - 27:9]
[1mClone found (brainfuck)[22m
- [1m[32mbrainfuck/file1.b[39m[22m [1:1 - 26:77] (26 lines, 268 tokens)
brainfuck/file1.bf [1:1 - 26:77]
[1mClone found (brainfuck)[22m
- [1m[32mbrainfuck/file1.b[39m[22m [1:1 - 41:59] (41 lines, 439 tokens)
brainfuck/file2.b [1:1 - 41:59]
[1mClone found (brainfuck)[22m
- [1m[32mbrainfuck/file1.b[39m[22m [1:1 - 41:59] (41 lines, 439 tokens)
brainfuck/file2.bf [1:1 - 41:59]
[1mClone found (brainfuck)[22m
- [1m[32mbrainfuck/file1.b[39m[22m [33:1 - 41:59] (9 lines, 143 tokens)
brainfuck/file1.bf [28:1 - 36:59]
[1mClone found (cfml)[22m
- [1m[32mcfml/file1.cfm[39m[22m [4:20 - 21:2] (18 lines, 85 tokens)
cfml/file2.cfm [4:18 - 21:2]
[1mClone found (cfscript)[22m
- [1m[32mcfscript/file1.cfc[39m[22m [1:1 - 28:11] (28 lines, 161 tokens)
cfscript/file2.cfc [1:1 - 28:11]
[1mClone found (c)[22m
- [1m[32mclike/file1.c[39m[22m [1:1 - 17:4] (17 lines, 258 tokens)
clike/file2.c [1:1 - 17:4]
[1mClone found (c)[22m
- [1m[32mclike/file1.c[39m[22m [8:3 - 19:2] (12 lines, 81 tokens)
clike/file2.c [18:3 - 29:2]
[1mClone found (cpp)[22m
- [1m[32mclike/file1.cpp[39m[22m [1:1 - 88:7] (88 lines, 757 tokens)
clike/file2.cpp [1:1 - 88:7]
[1mClone found (cpp)[22m
- [1m[32mclike/file1.cpp[39m[22m [24:5 - 43:51] (20 lines, 208 tokens)
clike/file1.cpp [45:5 - 64:51]
[1mClone found (csharp)[22m
- [1m[32mclike/file1.cs[39m[22m [1:1 - 91:19] (91 lines, 235 tokens)
clike/file2.cs [1:1 - 91:19]
[1mClone found (csharp)[22m
- [1m[32mclike/file1.cs[39m[22m [103:9 - 185:2] (83 lines, 302 tokens)
clike/file2.cs [93:9 - 175:2]
[1mClone found (c-header)[22m
- [1m[32mclike/file1.h[39m[22m [1:1 - 17:4] (17 lines, 258 tokens)
clike/file2.h [1:1 - 17:4]
[1mClone found (c-header)[22m
- [1m[32mclike/file1.h[39m[22m [8:3 - 19:2] (12 lines, 81 tokens)
clike/file2.h [18:3 - 29:2]
[1mClone found (cpp-header)[22m
- [1m[32mclike/file1.hpp[39m[22m [1:1 - 88:7] (88 lines, 757 tokens)
clike/file2.hpp [1:1 - 88:7]
[1mClone found (cpp-header)[22m
- [1m[32mclike/file1.hpp[39m[22m [24:5 - 43:51] (20 lines, 208 tokens)
clike/file1.hpp [45:5 - 64:51]
[1mClone found (java)[22m
- [1m[32mclike/file1.java[39m[22m [1:1 - 186:6] (186 lines, 6601 tokens)
clike/file2.java [1:1 - 186:6]
[1mClone found (java)[22m
- [1m[32mclike/file1.java[39m[22m [182:51 - 221:2] (40 lines, 786 tokens)
clike/file2.java [194:52 - 233:2]
[1mClone found (kotlin)[22m
- [1m[32mclike/file1.kt[39m[22m [1:1 - 33:6] (33 lines, 186 tokens)
clike/file2.kt [1:1 - 33:6]
[1mClone found (kotlin)[22m
- [1m[32mclike/file1.kt[39m[22m [38:5 - 53:2] (16 lines, 64 tokens)
clike/file2.kt [38:5 - 53:2]
[1mClone found (scala)[22m
- [1m[32mclike/file1.scala[39m[22m [1:1 - 29:2] (29 lines, 848 tokens)
clike/file2.scala [1:1 - 29:2]
[1mClone found (clojure)[22m
- [1m[32mclojure/file1.clj[39m[22m [2:3 - 20:23] (19 lines, 139 tokens)
clojure/file2.clj [2:3 - 20:23]
[1mClone found (cmake)[22m
- [1m[32mcmake/file1.cmake[39m[22m [1:1 - 21:14] (21 lines, 128 tokens)
cmake/file2.cmake [1:1 - 21:14]
[1mClone found (coffeescript)[22m
- [1m[32mcoffeescript/file1.coffee[39m[22m [1:1 - 13:22] (13 lines, 75 tokens)
coffeescript/file2.coffee [3:1 - 15:22]
[1mClone found (coffeescript)[22m
- [1m[32mcoffeescript/file1.coffee[39m[22m [16:1 - 44:21] (29 lines, 144 tokens)
coffeescript/file1.coffee [46:1 - 74:21]
[1mClone found (lisp)[22m
- [1m[32mcommonlisp/file1.el[39m[22m [1:1 - 50:23] (50 lines, 289 tokens)
commonlisp/file2.el [1:1 - 50:23]
[1mClone found (crystal)[22m
- [1m[32mcrystal/file1.cr[39m[22m [1:1 - 29:4] (29 lines, 97 tokens)
crystal/file2.cr [1:1 - 29:4]
[1mClone found (css)[22m
- [1m[32mcss/file1.css[39m[22m [1:1 - 25:2] (25 lines, 237 tokens)
css/file10.css [1:1 - 25:2]
[1mClone found (css)[22m
- [1m[32mcss/file1.css[39m[22m [1:1 - 19:36] (19 lines, 192 tokens)
css/file2.css [1:1 - 19:36]
[1mClone found (less)[22m
- [1m[32mcss/file1.less[39m[22m [1:1 - 19:36] (19 lines, 192 tokens)
css/file2.less [1:1 - 19:36]
[1mClone found (less)[22m
- [1m[32mcss/file1.less[39m[22m [14:35 - 25:2] (12 lines, 90 tokens)
css/file1.less [24:5 - 36:2]
[1mClone found (scss)[22m
- [1m[32mcss/file1.scss[39m[22m [1:1 - 53:2] (53 lines, 324 tokens)
css/file2.scss [1:1 - 53:2]
[1mClone found (csv)[22m
- [1m[32mcsv/file1.csv[39m[22m [1:1 - 9:56] (9 lines, 163 tokens)
csv/file2.csv [1:1 - 9:56]
[1mClone found (d)[22m
- [1m[32md/file1.d[39m[22m [1:1 - 169:6] (169 lines, 1135 tokens)
d/file2.d [1:1 - 169:6]
[1mClone found (dart)[22m
- [1m[32mdart/file1.dart[39m[22m [1:1 - 89:4] (89 lines, 403 tokens)
dart/file2.dart [1:1 - 89:4]
[1mClone found (dart)[22m
- [1m[32mdart/file1.dart[39m[22m [118:15 - 148:2] (31 lines, 119 tokens)
dart/file2.dart [88:6 - 118:2]
[1mClone found (diff)[22m
- [1m[32mdiff/file1.diff[39m[22m [1:1 - 62:7] (62 lines, 435 tokens)
diff/file2.diff [1:1 - 62:7]
[1mClone found (dot)[22m
- [1m[32mdot/file1.dot[39m[22m [1:1 - 18:21] (18 lines, 91 tokens)
dot/file2.dot [1:1 - 18:21]
[1mClone found (eiffel)[22m
- [1m[32meiffel/file1.e[39m[22m [1:1 - 46:11] (46 lines, 130 tokens)
eiffel/file2.e [1:1 - 46:11]
[1mClone found (elm)[22m
- [1m[32melm/file1.elm[39m[22m [1:1 - 47:23] (47 lines, 155 tokens)
elm/file2.elm [1:1 - 47:23]
[1mClone found (erlang)[22m
- [1m[32merlang/file1.erl[39m[22m [1:1 - 121:7] (121 lines, 837 tokens)
erlang/file2.erl [1:1 - 121:7]
[1mClone found (javascript)[22m
- [1m[32mfolder1/file_1.js[39m[22m [4:1 - 55:3] (52 lines, 339 tokens)
javascript/file_1.cjs [4:1 - 55:3]
[1mClone found (javascript)[22m
- [1m[32mfolder1/file_1.js[39m[22m [4:1 - 55:3] (52 lines, 339 tokens)
javascript/file_1.js [4:1 - 55:3]
[1mClone found (javascript)[22m
- [1m[32mfolder1/file_1.js[39m[22m [4:1 - 55:3] (52 lines, 339 tokens)
javascript/file_1.mjs [4:1 - 55:3]
[1mClone found (javascript)[22m
- [1m[32mfolder1/file_1.js[39m[22m [4:1 - 55:3] (52 lines, 339 tokens)
javascript/file_3.js [1:1 - 52:3]
[1mClone found (javascript)[22m
- [1m[32mfolder1/file_1.js[39m[22m [28:1 - 55:3] (28 lines, 169 tokens)
folder2/file_2.js [1:1 - 28:3]
[1mClone found (javascript)[22m
- [1m[32mfolder1/file_1.js[39m[22m [28:1 - 55:3] (28 lines, 169 tokens)
folder2/file_2.js [29:1 - 56:3]
[1mClone found (fortran)[22m
- [1m[32mfortran/file1.f[39m[22m [1:7 - 37:21] (37 lines, 182 tokens)
fortran/file2.f [1:7 - 37:21]
[1mClone found (gdscript)[22m
- [1m[32mgdscript/file1.gd[39m[22m [22:1 - 46:18] (25 lines, 135 tokens)
gdscript/file2.gd [22:1 - 46:18]
[1mClone found (gettext)[22m
- [1m[32mgettext/file1.po[39m[22m [13:1 - 64:7] (52 lines, 82 tokens)
gettext/file2.po [13:1 - 64:7]
[1mClone found (gherkin)[22m
- [1m[32mgherkin/file1.feature[39m[22m [1:1 - 16:26] (16 lines, 83 tokens)
gherkin/file2.feature [1:1 - 16:26]
[1mClone found (ignore)[22m
- [1m[32mgitignore/file1.gitignore[39m[22m [1:1 - 84:16] (84 lines, 234 tokens)
gitignore/file2.gitignore [1:1 - 84:16]
[1mClone found (go)[22m
- [1m[32mgo/file1.go[39m[22m [1:1 - 30:5] (30 lines, 134 tokens)
go/file2.go [1:1 - 31:5]
[1mClone found (graphql)[22m
- [1m[32mgraphql/file1.graphql[39m[22m [1:1 - 25:5] (25 lines, 143 tokens)
graphql/file2.graphql [1:1 - 25:5]
[1mClone found (groovy)[22m
- [1m[32mgroovy/file1.groovy[39m[22m [1:1 - 41:6] (41 lines, 188 tokens)
groovy/file2.groovy [1:1 - 41:6]
[1mClone found (haml)[22m
- [1m[32mhaml/file1.haml[39m[22m [1:1 - 23:18] (23 lines, 118 tokens)
haml/file2.haml [1:1 - 23:18]
[1mClone found (handlebars)[22m
- [1m[32mhandlebars/file1.hbs[39m[22m [1:1 - 28:27] (28 lines, 218 tokens)
handlebars/file2.hbs [1:1 - 28:27]
[1mClone found (haskell)[22m
- [1m[32mhaskell-literate/file1.lhs[39m[22m [1:1 - 31:2] (31 lines, 182 tokens)
haskell-literate/file2.lhs [1:1 - 31:2]
[1mClone found (haskell)[22m
- [1m[32mhaskell/file1.hs[39m[22m [1:1 - 173:34] (173 lines, 902 tokens)
haskell/file2.hs [1:1 - 173:34]
[1mClone found (haskell)[22m
- [1m[32mhaskell/file1.hs[39m[22m [190:1 - 204:33] (15 lines, 99 tokens)
haskell/file2.hs [175:1 - 189:33]
[1mClone found (haxe)[22m
- [1m[32mhaxe/file1.hx[39m[22m [1:1 - 62:76] (62 lines, 334 tokens)
haxe/file2.hx [1:1 - 62:2]
[1mClone found (haxe)[22m
- [1m[32mhaxe/file1.hx[39m[22m [6:3 - 47:9] (42 lines, 244 tokens)
haxe/file1.hx [47:3 - 88:9]
[1mClone found (haxe)[22m
- [1m[32mhaxe/file1.hxml[39m[22m [3:1 - 14:10] (12 lines, 56 tokens)
haxe/file2.hxml [1:1 - 12:10]
[1mClone found (hcl)[22m
- [1m[32mhcl/file1.tf[39m[22m [1:1 - 37:9] (37 lines, 85 tokens)
hcl/file2.tf [1:1 - 37:9]
[1mClone found (aspnet)[22m
- [1m[32mhtmlembedded/file1.aspx[39m[22m [7:18 - 16:35] (10 lines, 67 tokens)
htmlembedded/file2.aspx [7:21 - 16:35]
[1mClone found (aspnet)[22m
- [1m[32mhtmlembedded/file1.aspx[39m[22m [18:53 - 36:30] (19 lines, 173 tokens)
htmlembedded/file2.aspx [18:60 - 36:30]
[1mClone found (aspnet)[22m
- [1m[32mhtmlembedded/file1.aspx[39m[22m [37:95 - 47:8] (11 lines, 56 tokens)
htmlembedded/file2.aspx [44:98 - 54:8]
[1mClone found (markup)[22m
- [1m[32mhtmlmixed/file1.htm[39m[22m [1:1 - 24:7] (24 lines, 191 tokens)
htmlmixed/file2.htm [1:1 - 24:7]
[1mClone found (markup)[22m
- [1m[32mhtmlmixed/file1.htm[39m[22m [1:1 - 24:7] (24 lines, 191 tokens)
ignore/file2.htm [1:1 - 24:7]
[1mClone found (markup)[22m
- [1m[32mhtmlmixed/file1.html[39m[22m [1:1 - 16:2] (16 lines, 91 tokens)
htmlmixed/file2.html [1:1 - 16:2]
[1mClone found (prolog)[22m
- [1m[32midl/file1.pro[39m[22m [1:1 - 28:22] (28 lines, 176 tokens)
idl/file2.pro [1:1 - 28:22]
[1mClone found (idris)[22m
- [1m[32midris/file1.idr[39m[22m [1:1 - 35:3] (35 lines, 208 tokens)
idris/file2.idr [1:1 - 35:3]
[1mClone found (txt)[22m
- [1m[32mignore-case/file2.txt[39m[22m [1:1 - 12:55] (12 lines, 85 tokens)
text/file1.txt [1:1 - 12:55]
[1mClone found (txt)[22m
- [1m[32mignore-case/file2.txt[39m[22m [1:1 - 61:63] (61 lines, 350 tokens)
text/file2.txt [1:1 - 61:63]
[1mClone found (typescript)[22m
- [1m[32mjavascript/file1.cts[39m[22m [1:1 - 263:4] (263 lines, 1318 tokens)
javascript/file1.mts [1:1 - 263:4]
[1mClone found (typescript)[22m
- [1m[32mjavascript/file1.cts[39m[22m [1:1 - 263:4] (263 lines, 1318 tokens)
javascript/file1.ts [1:1 - 263:4]
[1mClone found (typescript)[22m
- [1m[32mjavascript/file1.cts[39m[22m [1:1 - 66:24] (66 lines, 531 tokens)
javascript/file2.cts [48:1 - 113:24]
[1mClone found (typescript)[22m
- [1m[32mjavascript/file1.cts[39m[22m [74:1 - 263:4] (190 lines, 787 tokens)
javascript/file2.cts [187:1 - 376:4]
[1mClone found (javascript)[22m
- [1m[32mjavascript/file1.js[39m[22m [5:1 - 24:2] (20 lines, 94 tokens)
javascript/file2.js [5:1 - 27:2]
[1mClone found (json)[22m
- [1m[32mjavascript/file1.json[39m[22m [4:53 - 21:22] (18 lines, 64 tokens)
javascript/file2.json [4:70 - 21:22]
[1mClone found (json)[22m
- [1m[32mjavascript/file1.json[39m[22m [22:22 - 43:2] (22 lines, 70 tokens)
javascript/file2.json [22:22 - 43:2]
[1mClone found (typescript)[22m
- [1m[32mjavascript/file2.cts[39m[22m [109:38 - 209:24] (101 lines, 297 tokens)
javascript/file2.mts [109:38 - 209:24]
[1mClone found (javascript)[22m
- [1m[32mjavascript/file_4.js[39m[22m [15:2 - 42:43] (28 lines, 98 tokens)
javascript/file_4.js [56:74 - 83:43]
[1mClone found (json5)[22m
- [1m[32mjson5/file1.json5[39m[22m [1:1 - 31:5] (31 lines, 93 tokens)
json5/file2.json5 [1:1 - 31:5]
[1mClone found (jsx)[22m
- [1m[32mjsx/file1.jsx[39m[22m [1:1 - 21:46] (21 lines, 99 tokens)
jsx/file2.jsx [1:1 - 21:46]
[1mClone found (tsx)[22m
- [1m[32mjsx/file1.tsx[39m[22m [1:1 - 35:2] (35 lines, 143 tokens)
jsx/file2.tsx [1:1 - 35:2]
[1mClone found (julia)[22m
- [1m[32mjulia/file1.jl[39m[22m [1:1 - 30:4] (30 lines, 194 tokens)
julia/file2.jl [1:1 - 30:4]
[1mClone found (latex)[22m
- [1m[32mlatex/file1.tex[39m[22m [1:1 - 26:13] (26 lines, 149 tokens)
latex/file2.tex [1:1 - 26:13]
[1mClone found (lilypond)[22m
- [1m[32mlilypond/file1.ly[39m[22m [1:1 - 19:10] (19 lines, 63 tokens)
lilypond/file2.ly [1:1 - 19:10]
[1mClone found (linker-script)[22m
- [1m[32mlinker-script/file1.ld[39m[22m [1:1 - 47:4] (47 lines, 256 tokens)
linker-script/file2.ld [1:1 - 47:4]
[1mClone found (livescript)[22m
- [1m[32mlivescript/file1.ls[39m[22m [1:1 - 31:24] (31 lines, 145 tokens)
livescript/file2.ls [1:1 - 31:24]
[1mClone found (llvm)[22m
- [1m[32mllvm/file1.ll[39m[22m [1:1 - 35:2] (35 lines, 215 tokens)
llvm/file2.ll [1:1 - 35:2]
[1mClone found (log)[22m
- [1m[32mlog/file1.log[39m[22m [1:1 - 13:11] (13 lines, 262 tokens)
log/file2.log [1:1 - 13:11]
[1mClone found (lua)[22m
- [1m[32mlua/file1.lua[39m[22m [1:1 - 46:4] (46 lines, 193 tokens)
lua/file2.lua [1:1 - 46:4]
[1mClone found (markdown)[22m
- [1m[32mmarkdown/file1.md:markdown[39m[22m [2:1 - 176:3] (175 lines, 1238 tokens)
markdown/file2.md:markdown [7:1 - 181:3]
[1mClone found (markdown)[22m
- [1m[32mmarkdown/file1.md:markdown[39m[22m [176:1 - 193:86] (18 lines, 100 tokens)
markdown/file2.md:markdown [196:1 - 213:86]
[1mClone found (text)[22m
- [1m[32mmarkdown/file1.md:text[39m[22m [156:1 - 166:11] (11 lines, 69 tokens)
markdown/file2.md:text [161:1 - 171:11]
[1mClone found (yaml)[22m
- [1m[32mmarkdown/file1.md:yaml[39m[22m [53:1 - 81:10] (29 lines, 60 tokens)
markdown/file2.md:yaml [58:1 - 86:10]
[1mClone found (markdown)[22m
- [1m[32mmarkdown/file3.md:markdown[39m[22m [27:85 - 98:66] (72 lines, 69 tokens)
markdown/file4.md:markdown [27:89 - 98:66]
[1mClone found (python)[22m
- [1m[32mmarkdown/file3.md:python[39m[22m [72:1 - 91:6] (20 lines, 137 tokens)
markdown/file4.md:python [72:1 - 91:6]
[1mClone found (typescript)[22m
- [1m[32mmarkdown/file3.md:typescript[39m[22m [34:1 - 64:2] (31 lines, 156 tokens)
markdown/file4.md:typescript [34:1 - 64:2]
[1mClone found (wolfram)[22m
- [1m[32mmathematica/file1.wl[39m[22m [1:1 - 17:3] (17 lines, 127 tokens)
mathematica/file2.wl [1:1 - 17:3]
[1mClone found (fsharp)[22m
- [1m[32mmllike/file1.fs[39m[22m [1:1 - 35:6] (35 lines, 193 tokens)
mllike/file2.fs [1:1 - 35:6]
[1mClone found (ocaml)[22m
- [1m[32mmllike/file1.ml[39m[22m [1:1 - 30:18] (30 lines, 150 tokens)
mllike/file2.ml [1:1 - 30:18]
[1mClone found (ocaml)[22m
- [1m[32mmllike/file1.mli[39m[22m [1:1 - 29:20] (29 lines, 186 tokens)
mllike/file2.mli [1:1 - 29:20]
[1mClone found (ocaml)[22m
- [1m[32mmllike/file1.mll[39m[22m [1:1 - 24:20] (24 lines, 104 tokens)
mllike/file2.mll [1:1 - 24:20]
[1mClone found (nsis)[22m
- [1m[32mnsis/file1.nsi[39m[22m [1:1 - 29:25] (29 lines, 71 tokens)
nsis/file2.nsi [1:1 - 29:25]
[1mClone found (c-header)[22m
- [1m[32mobjective-c/file_1.h[39m[22m [1:1 - 33:2] (33 lines, 385 tokens)
objective-c/file_2.h [1:1 - 33:2]
[1mClone found (objectivec)[22m
- [1m[32mobjective-c/file_1.m[39m[22m [1:1 - 12:35] (12 lines, 311 tokens)
objective-c/file_2.m [1:1 - 12:35]
[1mClone found (objectivec)[22m
- [1m[32mobjective-c/file_1.m[39m[22m [14:1 - 64:5] (51 lines, 216 tokens)
objective-c/file_2.m [38:1 - 88:5]
[1mClone found (javascript)[22m
- [1m[32mone-file/one-file.js[39m[22m [1:1 - 28:6] (28 lines, 165 tokens)
one-file/one-file.js [32:1 - 59:6]
[1mClone found (openqasm)[22m
- [1m[32mopenqasm/file1.qasm[39m[22m [5:1 - 23:7] (19 lines, 92 tokens)
openqasm/file2.qasm [23:1 - 41:7]
[1mClone found (oz)[22m
- [1m[32moz/file1.oz[39m[22m [1:1 - 37:20] (37 lines, 141 tokens)
oz/file2.oz [1:1 - 37:20]
[1mClone found (pascal)[22m
- [1m[32mpascal/file1.pas[39m[22m [1:1 - 37:5] (37 lines, 203 tokens)
pascal/file2.pas [1:1 - 37:5]
[1mClone found (perl)[22m
- [1m[32mperl/file1.pl[39m[22m [1:1 - 121:31] (121 lines, 331 tokens)
perl/file2.pl [1:1 - 121:31]
[1mClone found (perl)[22m
- [1m[32mperl/file1.pm[39m[22m [1:1 - 143:4] (143 lines, 586 tokens)
perl/file2.pm [1:1 - 143:4]
[1mClone found (perl)[22m
- [1m[32mperl/file1.pm[39m[22m [143:3 - 155:3] (13 lines, 54 tokens)
perl/file2.pm [176:3 - 188:3]
[1mClone found (php)[22m
- [1m[32mphp/file1.php[39m[22m [1:1 - 51:20] (51 lines, 295 tokens)
php/file2.php [1:1 - 51:20]
[1mClone found (plant-uml)[22m
- [1m[32mplant-uml/file1.puml[39m[22m [1:1 - 52:40] (52 lines, 181 tokens)
plant-uml/file2.puml [1:1 - 52:40]
[1mClone found (plsql)[22m
- [1m[32mplsql/file1.plsql[39m[22m [1:1 - 56:12] (56 lines, 191 tokens)
plsql/file2.plsql [1:1 - 56:12]
[1mClone found (plsql)[22m
- [1m[32mplsql/file1.plsql[39m[22m [70:20 - 85:2] (16 lines, 53 tokens)
plsql/file2.plsql [71:25 - 86:2]
[1mClone found (powerquery)[22m
- [1m[32mpowerquery/file1.pq[39m[22m [1:1 - 41:7] (41 lines, 210 tokens)
powerquery/file2.pq [1:1 - 41:7]
[1mClone found (powershell)[22m
- [1m[32mpowershell/file1.ps1[39m[22m [1:1 - 41:2] (41 lines, 168 tokens)
powershell/file2.ps1 [1:1 - 41:2]
[1mClone found (ini)[22m
- [1m[32mproperties/file1.ini[39m[22m [1:1 - 27:7] (27 lines, 79 tokens)
properties/file2.ini [1:1 - 27:7]
[1mClone found (properties)[22m
- [1m[32mproperties/file1.properties[39m[22m [1:1 - 22:11] (22 lines, 114 tokens)
properties/file2.properties [1:1 - 22:11]
[1mClone found (protobuf)[22m
- [1m[32mprotobuf/file1.proto[39m[22m [1:1 - 40:8] (40 lines, 115 tokens)
protobuf/file2.proto [1:1 - 40:8]
[1mClone found (pug)[22m
- [1m[32mpug/file1.pug[39m[22m [1:1 - 234:21] (234 lines, 1037 tokens)
pug/file2.pug [1:1 - 234:21]
[1mClone found (pug)[22m
- [1m[32mpug/file1.pug[39m[22m [239:36 - 291:67] (53 lines, 212 tokens)
pug/file2.pug [231:30 - 283:67]
[1mClone found (puppet)[22m
- [1m[32mpuppet/file1.pp[39m[22m [1:1 - 39:4] (39 lines, 131 tokens)
puppet/file2.pp [1:1 - 39:4]
[1mClone found (puppet)[22m
- [1m[32mpuppet/file1.pp[39m[22m [44:32 - 64:2] (21 lines, 83 tokens)
puppet/file2.pp [38:38 - 58:2]
[1mClone found (purescript)[22m
- [1m[32mpurescript/file1.purs[39m[22m [1:1 - 44:7] (44 lines, 265 tokens)
purescript/file2.purs [1:1 - 44:7]
[1mClone found (purescript)[22m
- [1m[32mpurescript/file1.purs[39m[22m [47:41 - 53:44] (7 lines, 50 tokens)
purescript/file2.purs [47:40 - 53:44]
[1mClone found (python)[22m
- [1m[32mpython/file1.py[39m[22m [1:1 - 24:13] (24 lines, 67 tokens)
python/file2.py [1:1 - 24:13]
[1mClone found (q)[22m
- [1m[32mq/file1.q[39m[22m [1:1 - 30:2] (30 lines, 378 tokens)
q/file2.q [1:1 - 30:2]
[1mClone found (qsharp)[22m
- [1m[32mqsharp/file1.qs[39m[22m [2:32 - 11:6] (10 lines, 50 tokens)
qsharp/file2.qs [2:29 - 11:6]
[1mClone found (r)[22m
- [1m[32mr/file1.r[39m[22m [1:1 - 64:9] (64 lines, 427 tokens)
r/file2.r [1:1 - 64:9]
[1mClone found (racket)[22m
- [1m[32mracket/file1.rkt[39m[22m [1:1 - 38:3] (38 lines, 286 tokens)
racket/file2.rkt [1:1 - 38:3]
[1mClone found (rescript)[22m
- [1m[32mrescript/file1.res[39m[22m [1:1 - 38:2] (38 lines, 200 tokens)
rescript/file2.res [1:1 - 38:2]
[1mClone found (robotframework)[22m
- [1m[32mrobotframework/file1.robot[39m[22m [1:1 - 27:45] (27 lines, 143 tokens)
robotframework/file2.robot [1:1 - 27:45]
[1mClone found (robotframework)[22m
- [1m[32mrobotframework/file1.robot[39m[22m [45:1 - 62:23] (18 lines, 80 tokens)
robotframework/file2.robot [51:1 - 68:23]
[1mClone found (ruby)[22m
- [1m[32mruby/file1.rb[39m[22m [1:1 - 40:4] (40 lines, 96 tokens)
ruby/file2.rb [1:1 - 40:4]
[1mClone found (rust)[22m
- [1m[32mrust/file1.rs[39m[22m [1:1 - 131:3] (131 lines, 857 tokens)
rust/file2.rs [1:1 - 132:3]
[1mClone found (rust)[22m
- [1m[32mrust/file1.rs[39m[22m [199:50 - 204:2] (6 lines, 51 tokens)
rust/file1.rs [255:53 - 260:2]
[1mClone found (rust)[22m
- [1m[32mrust/file1.rs[39m[22m [232:93 - 239:64] (8 lines, 58 tokens)
rust/file1.rs [247:47 - 254:64]
[1mClone found (rust)[22m
- [1m[32mrust/file1.rs[39m[22m [239:57 - 416:2] (178 lines, 1285 tokens)
rust/file2.rs [123:52 - 301:2]
[1mClone found (rust)[22m
- [1m[32mrust/file1.rs[39m[22m [263:28 - 273:12] (11 lines, 80 tokens)
rust/file1.rs [335:21 - 345:12]
[1mClone found (rust)[22m
- [1m[32mrust/file1.rs[39m[22m [319:60 - 332:2] (14 lines, 114 tokens)
rust/file1.rs [371:96 - 384:2]
[1mClone found (sas)[22m
- [1m[32msas/file1.sas[39m[22m [1:1 - 59:4] (59 lines, 444 tokens)
sas/file2.sas [1:1 - 59:4]
[1mClone found (sass)[22m
- [1m[32msass/file1.sass[39m[22m [1:1 - 19:17] (19 lines, 89 tokens)
sass/file2.sass [1:1 - 19:17]
[1mClone found (sass)[22m
- [1m[32msass/file1.sass[39m[22m [3:1 - 17:43] (15 lines, 82 tokens)
sass/file1.sass [19:1 - 33:43]
[1mClone found (sass)[22m
- [1m[32msass/file1.sass[39m[22m [5:1 - 24:45] (20 lines, 102 tokens)
sass/file2.sass [24:1 - 48:33]
[1mClone found (scheme)[22m
- [1m[32mscheme/file1.scm[39m[22m [1:1 - 33:23] (33 lines, 225 tokens)
scheme/file2.scm [1:1 - 33:23]
[1mClone found (bash)[22m
- [1m[32mshebang/build[39m[22m [1:1 - 32:2] (32 lines, 86 tokens)
shebang/deploy [1:1 - 32:2]
[1mClone found (bash)[22m
- [1m[32mshebang/build[39m[22m [1:1 - 32:2] (32 lines, 86 tokens)
shell/file1.sh [1:1 - 32:2]
[1mClone found (bash)[22m
- [1m[32mshebang/build[39m[22m [1:1 - 32:2] (32 lines, 86 tokens)
shell/file2.sh [1:1 - 32:2]
[1mClone found (python)[22m
- [1m[32mshebang/process[39m[22m [1:1 - 32:4] (32 lines, 159 tokens)
shebang/transform [1:1 - 32:4]
[1mClone found (smalltalk)[22m
- [1m[32msmalltalk/file1.st[39m[22m [1:1 - 45:2] (45 lines, 146 tokens)
smalltalk/file2.st [1:1 - 45:2]
[1mClone found (smarty)[22m
- [1m[32msmarty/file1.tpl[39m[22m [1:1 - 43:18] (43 lines, 286 tokens)
smarty/file2.tpl [1:1 - 43:18]
[1mClone found (solidity)[22m
- [1m[32msolidity/file1.sol[39m[22m [25:61 - 55:13] (31 lines, 168 tokens)
solidity/file2.sol [29:54 - 59:13]
[1mClone found (soy)[22m
- [1m[32msoy/file1.soy[39m[22m [1:1 - 49:27] (49 lines, 346 tokens)
soy/file2.soy [1:1 - 49:27]
[1mClone found (sparql)[22m
- [1m[32msparql/file1.rq[39m[22m [1:1 - 11:9] (11 lines, 65 tokens)
sparql/file2.rq [1:1 - 11:9]
[1mClone found (sql)[22m
- [1m[32msql/file1.sql[39m[22m [3:1 - 41:46] (39 lines, 214 tokens)
sql/file2.sql [3:1 - 41:46]
[1mClone found (stylus)[22m
- [1m[32mstylus/file1.styl[39m[22m [1:1 - 53:20] (53 lines, 201 tokens)
stylus/file2.styl [1:1 - 53:20]
[1mClone found (css)[22m
- [1m[32msvelte/component1.svelte:css[39m[22m [112:3 - 230:4] (119 lines, 507 tokens)
svelte/component2.svelte:css [112:3 - 230:4]
[1mClone found (html)[22m
- [1m[32msvelte/component1.svelte:html[39m[22m [1:1 - 231:9] (231 lines, 350 tokens)
svelte/component2.svelte:html [1:1 - 231:9]
[1mClone found (javascript)[22m
- [1m[32msvelte/component1.svelte:javascript[39m[22m [2:3 - 61:6] (60 lines, 286 tokens)
svelte/component2.svelte:javascript [2:3 - 61:6]
[1mClone found (swift)[22m
- [1m[32mswift/file1.swift[39m[22m [9:1 - 29:6] (21 lines, 73 tokens)
swift/file2.swift [2:1 - 22:6]
[1mClone found (tap)[22m
- [1m[32mtap/file1.tap[39m[22m [1:1 - 35:8] (35 lines, 202 tokens)
tap/file2.tap [1:1 - 35:8]
[1mClone found (tcl)[22m
- [1m[32mtcl/file1.tcl[39m[22m [1:1 - 45:2] (45 lines, 263 tokens)
tcl/file2.tcl [1:1 - 45:2]
[1mClone found (textile)[22m
- [1m[32mtextile/file1.textile[39m[22m [1:1 - 51:4] (51 lines, 236 tokens)
textile/file2.textile [1:1 - 51:4]
[1mClone found (toml)[22m
- [1m[32mtoml/file1.toml[39m[22m [1:1 - 39:19] (39 lines, 100 tokens)
toml/file2.toml [1:1 - 39:19]
[1mClone found (tt2)[22m
- [1m[32mtt2/file1.tt2[39m[22m [1:1 - 38:14] (38 lines, 299 tokens)
tt2/file2.tt2 [1:1 - 38:14]
[1mClone found (tt2)[22m
- [1m[32mtt2/file1.tt2[39m[22m [42:21 - 52:25] (11 lines, 54 tokens)
tt2/file2.tt2 [42:86 - 52:25]
[1mClone found (turtle)[22m
- [1m[32mturtle/file1.ttl[39m[22m [1:1 - 36:17] (36 lines, 212 tokens)
turtle/file2.ttl [1:1 - 36:17]
[1mClone found (twig)[22m
- [1m[32mtwig/file_1.twig[39m[22m [1:1 - 23:3] (23 lines, 167 tokens)
twig/file_2.twig [1:1 - 23:3]
[1mClone found (twig)[22m
- [1m[32mtwig/file_1.twig[39m[22m [13:20 - 25:9] (13 lines, 65 tokens)
twig/file_1.twig [16:8 - 28:9]
[1mClone found (twig)[22m
- [1m[32mtwig/file_1.twig[39m[22m [19:8 - 29:15] (11 lines, 54 tokens)
twig/file_2.twig [22:8 - 32:15]
[1mClone found (unrealscript)[22m
- [1m[32munrealscript/file1.uc[39m[22m [1:1 - 56:6] (56 lines, 161 tokens)
unrealscript/file2.uc [1:1 - 56:6]
[1mClone found (vbnet)[22m
- [1m[32mvb/file1.vb[39m[22m [1:1 - 29:17] (29 lines, 163 tokens)
vb/file2.vb [1:1 - 29:17]
[1mClone found (velocity)[22m
- [1m[32mvelocity/file1.vtl[39m[22m [1:1 - 41:25] (41 lines, 264 tokens)
velocity/file2.vtl [1:1 - 41:25]
[1mClone found (verilog)[22m
- [1m[32mverilog/file1.v[39m[22m [1:1 - 40:10] (40 lines, 163 tokens)
verilog/file2.v [1:1 - 40:10]
[1mClone found (vhdl)[22m
- [1m[32mvhdl/file1.vhd[39m[22m [1:1 - 32:18] (32 lines, 179 tokens)
vhdl/file2.vhd [1:1 - 32:18]
[1mClone found (typescript)[22m
- [1m[32mvue/app1.vue:typescript[39m[22m [5:1 - 33:4] (29 lines, 128 tokens)
vue/app2.vue:typescript [5:1 - 33:4]
[1mClone found (javascript)[22m
- [1m[32mvue/file.js[39m[22m [1:1 - 28:2] (28 lines, 210 tokens)
vue/file1.vue:javascript [125:3 - 152:4]
[1mClone found (html)[22m
- [1m[32mvue/file1.vue:html[39m[22m [1:1 - 10:9] (10 lines, 99 tokens)
vue/file2.vue:html [1:1 - 10:9]
[1mClone found (javascript)[22m
- [1m[32mvue/file1.vue:javascript[39m[22m [120:3 - 261:4] (142 lines, 817 tokens)
vue/file2.vue:javascript [99:3 - 240:4]
[1mClone found (scss)[22m
- [1m[32mvue/file1.vue:scss[39m[22m [13:3 - 75:6] (63 lines, 402 tokens)
vue/file2.vue:scss [13:3 - 75:6]
[1mClone found (scss)[22m
- [1m[32mvue/file1.vue:scss[39m[22m [95:5 - 117:4] (23 lines, 149 tokens)
vue/file2.vue:scss [74:5 - 96:4]
[1mClone found (wgsl)[22m
- [1m[32mwgsl/file1.wgsl[39m[22m [1:1 - 45:3] (45 lines, 274 tokens)
wgsl/file2.wgsl [1:1 - 45:3]
[1mClone found (wgsl)[22m
- [1m[32mwgsl/file1.wgsl[39m[22m [51:42 - 59:6] (9 lines, 66 tokens)
wgsl/file2.wgsl [55:47 - 63:6]
[1mClone found (markup)[22m
- [1m[32mxml/file1.svg[39m[22m [1:1 - 88:2] (88 lines, 392 tokens)
xml/file2.svg [1:1 - 87:6]
[1mClone found (markup)[22m
- [1m[32mxml/file1.xsl[39m[22m [1:1 - 43:6] (43 lines, 316 tokens)
xml/file2.xsl [1:1 - 43:2]
[1mClone found (markup)[22m
- [1m[32mxml/file1.xsl[39m[22m [20:15 - 35:6] (16 lines, 133 tokens)
xml/file1.xsl [32:137 - 47:2]
[1mClone found (xquery)[22m
- [1m[32mxquery/file1.xquery[39m[22m [1:1 - 31:22] (31 lines, 222 tokens)
xquery/file2.xquery [1:1 - 31:22]
[1mClone found (yaml)[22m
- [1m[32myaml/file1.yml[39m[22m [1:1 - 18:23] (18 lines, 132 tokens)
yaml/file2.yml [1:1 - 18:23]
[1mClone found (c)[22m
- [1m[32mz80/file1.z80[39m[22m [1:1 - 14:25] (14 lines, 60 tokens)
z80/file2.z80 [1:1 - 14:25]
[1mClone found (zig)[22m
- [1m[32mzig/file1.zig[39m[22m [1:1 - 43:10] (43 lines, 259 tokens)
zig/file2.zig [1:1 - 43:10]
[1mClone found (zig)[22m
- [1m[32mzig/file1.zig[39m[22m [42:45 - 52:23] (11 lines, 52 tokens)
zig/file2.zig [47:45 - 57:23]
[90m┌────────────────┬────────────────┬─────────────┬──────────────┬──────────────┬──────────────────┬───────────────────┐[39m
[90m│[39m[31m Format [39m[90m│[39m[31m Files analyzed [39m[90m│[39m[31m Total lines [39m[90m│[39m[31m Total tokens [39m[90m│[39m[31m Clones found [39m[90m│[39m[31m Duplicated lines [39m[90m│[39m[31m Duplicated tokens [39m[90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m actionscript [90m│[39m 2 [90m│[39m 75 [90m│[39m 302 [90m│[39m 1 [90m│[39m 29 (38.67%) [90m│[39m 127 (42.05%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m ada [90m│[39m 2 [90m│[39m 74 [90m│[39m 408 [90m│[39m 1 [90m│[39m 20 (27.03%) [90m│[39m 103 (25.25%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m antlr4 [90m│[39m 2 [90m│[39m 48 [90m│[39m 216 [90m│[39m 1 [90m│[39m 20 (41.67%) [90m│[39m 82 (37.96%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m apex [90m│[39m 2 [90m│[39m 84 [90m│[39m 451 [90m│[39m 1 [90m│[39m 23 (27.38%) [90m│[39m 115 (25.50%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m apl [90m│[39m 2 [90m│[39m 47 [90m│[39m 554 [90m│[39m 1 [90m│[39m 19 (40.43%) [90m│[39m 252 (45.49%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m aspnet [90m│[39m 2 [90m│[39m 101 [90m│[39m 854 [90m│[39m 3 [90m│[39m 37 (36.63%) [90m│[39m 296 (34.66%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m astro [90m│[39m 2 [90m│[39m 324 [90m│[39m 950 [90m│[39m 0 [90m│[39m 0 (0.00%) [90m│[39m 0 (0.00%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m awk [90m│[39m 2 [90m│[39m 62 [90m│[39m 205 [90m│[39m 1 [90m│[39m 22 (35.48%) [90m│[39m 75 (36.59%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m bash [90m│[39m 4 [90m│[39m 158 [90m│[39m 418 [90m│[39m 3 [90m│[39m 93 (58.86%) [90m│[39m 258 (61.72%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m basic [90m│[39m 2 [90m│[39m 47 [90m│[39m 331 [90m│[39m 1 [90m│[39m 17 (36.17%) [90m│[39m 100 (30.21%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m bicep [90m│[39m 2 [90m│[39m 81 [90m│[39m 251 [90m│[39m 1 [90m│[39m 26 (32.10%) [90m│[39m 78 (31.08%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m brainfuck [90m│[39m 4 [90m│[39m 159 [90m│[39m 1728 [90m│[39m 4 [90m│[39m 113 (71.07%) [90m│[39m 1289 (74.59%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m c [90m│[39m 5 [90m│[39m 105 [90m│[39m 1060 [90m│[39m 3 [90m│[39m 40 (38.10%) [90m│[39m 399 (37.64%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m c-header [90m│[39m 4 [90m│[39m 149 [90m│[39m 2091 [90m│[39m 3 [90m│[39m 59 (39.60%) [90m│[39m 724 (34.62%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m cfml [90m│[39m 2 [90m│[39m 107 [90m│[39m 671 [90m│[39m 1 [90m│[39m 17 (15.89%) [90m│[39m 85 (12.67%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m cfscript [90m│[39m 2 [90m│[39m 69 [90m│[39m 437 [90m│[39m 1 [90m│[39m 27 (39.13%) [90m│[39m 161 (36.84%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m clojure [90m│[39m 2 [90m│[39m 46 [90m│[39m 374 [90m│[39m 1 [90m│[39m 18 (39.13%) [90m│[39m 139 (37.17%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m cmake [90m│[39m 2 [90m│[39m 52 [90m│[39m 311 [90m│[39m 1 [90m│[39m 20 (38.46%) [90m│[39m 128 (41.16%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m coffeescript [90m│[39m 2 [90m│[39m 92 [90m│[39m 447 [90m│[39m 2 [90m│[39m 40 (43.48%) [90m│[39m 219 (48.99%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m cpp [90m│[39m 2 [90m│[39m 176 [90m│[39m 1514 [90m│[39m 2 [90m│[39m 106 (60.23%) [90m│[39m 965 (63.74%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m cpp-header [90m│[39m 2 [90m│[39m 176 [90m│[39m 1514 [90m│[39m 2 [90m│[39m 106 (60.23%) [90m│[39m 965 (63.74%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m crystal [90m│[39m 2 [90m│[39m 70 [90m│[39m 222 [90m│[39m 1 [90m│[39m 28 (40.00%) [90m│[39m 97 (43.69%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m csharp [90m│[39m 2 [90m│[39m 360 [90m│[39m 1099 [90m│[39m 2 [90m│[39m 172 (47.78%) [90m│[39m 537 (48.86%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m css [90m│[39m 8 [90m│[39m 875 [90m│[39m 2536 [90m│[39m 5 [90m│[39m 290 (33.14%) [90m│[39m 1494 (58.91%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m csv [90m│[39m 2 [90m│[39m 22 [90m│[39m 400 [90m│[39m 1 [90m│[39m 8 (36.36%) [90m│[39m 163 (40.75%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m d [90m│[39m 2 [90m│[39m 338 [90m│[39m 2270 [90m│[39m 1 [90m│[39m 168 (49.70%) [90m│[39m 1135 (50.00%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m dart [90m│[39m 2 [90m│[39m 266 [90m│[39m 1178 [90m│[39m 2 [90m│[39m 118 (44.36%) [90m│[39m 522 (44.31%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m diff [90m│[39m 2 [90m│[39m 146 [90m│[39m 1082 [90m│[39m 1 [90m│[39m 61 (41.78%) [90m│[39m 435 (40.20%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m dot [90m│[39m 2 [90m│[39m 46 [90m│[39m 243 [90m│[39m 1 [90m│[39m 17 (36.96%) [90m│[39m 91 (37.45%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m eiffel [90m│[39m 2 [90m│[39m 126 [90m│[39m 380 [90m│[39m 1 [90m│[39m 45 (35.71%) [90m│[39m 130 (34.21%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m elm [90m│[39m 2 [90m│[39m 110 [90m│[39m 411 [90m│[39m 1 [90m│[39m 46 (41.82%) [90m│[39m 155 (37.71%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m erlang [90m│[39m 2 [90m│[39m 242 [90m│[39m 1674 [90m│[39m 1 [90m│[39m 120 (49.59%) [90m│[39m 837 (50.00%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m fortran [90m│[39m 2 [90m│[39m 93 [90m│[39m 469 [90m│[39m 1 [90m│[39m 36 (38.71%) [90m│[39m 182 (38.81%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m fsharp [90m│[39m 2 [90m│[39m 82 [90m│[39m 462 [90m│[39m 1 [90m│[39m 34 (41.46%) [90m│[39m 193 (41.77%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m gdscript [90m│[39m 2 [90m│[39m 96 [90m│[39m 458 [90m│[39m 1 [90m│[39m 24 (25.00%) [90m│[39m 135 (29.48%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m gettext [90m│[39m 2 [90m│[39m 220 [90m│[39m 356 [90m│[39m 1 [90m│[39m 51 (23.18%) [90m│[39m 82 (23.03%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m gherkin [90m│[39m 2 [90m│[39m 75 [90m│[39m 434 [90m│[39m 1 [90m│[39m 15 (20.00%) [90m│[39m 83 (19.12%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m go [90m│[39m 2 [90m│[39m 65 [90m│[39m 305 [90m│[39m 1 [90m│[39m 29 (44.62%) [90m│[39m 134 (43.93%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m graphql [90m│[39m 2 [90m│[39m 134 [90m│[39m 499 [90m│[39m 1 [90m│[39m 24 (17.91%) [90m│[39m 143 (28.66%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m groovy [90m│[39m 2 [90m│[39m 96 [90m│[39m 422 [90m│[39m 1 [90m│[39m 40 (41.67%) [90m│[39m 188 (44.55%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m haml [90m│[39m 2 [90m│[39m 52 [90m│[39m 276 [90m│[39m 1 [90m│[39m 22 (42.31%) [90m│[39m 118 (42.75%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m handlebars [90m│[39m 2 [90m│[39m 72 [90m│[39m 555 [90m│[39m 1 [90m│[39m 27 (37.50%) [90m│[39m 218 (39.28%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m haskell [90m│[39m 4 [90m│[39m 459 [90m│[39m 2536 [90m│[39m 3 [90m│[39m 216 (47.06%) [90m│[39m 1183 (46.65%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m haxe [90m│[39m 4 [90m│[39m 191 [90m│[39m 1035 [90m│[39m 3 [90m│[39m 113 (59.16%) [90m│[39m 634 (61.26%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m hcl [90m│[39m 2 [90m│[39m 119 [90m│[39m 313 [90m│[39m 1 [90m│[39m 36 (30.25%) [90m│[39m 85 (27.16%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m html [90m│[39m 6 [90m│[39m 1289 [90m│[39m 1390 [90m│[39m 4 [90m│[39m 406 (31.50%) [90m│[39m 762 (54.82%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m idris [90m│[39m 2 [90m│[39m 88 [90m│[39m 581 [90m│[39m 1 [90m│[39m 34 (38.64%) [90m│[39m 208 (35.80%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m ignore [90m│[39m 2 [90m│[39m 191 [90m│[39m 523 [90m│[39m 1 [90m│[39m 83 (43.46%) [90m│[39m 234 (44.74%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m ini [90m│[39m 2 [90m│[39m 58 [90m│[39m 172 [90m│[39m 1 [90m│[39m 26 (44.83%) [90m│[39m 79 (45.93%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m java [90m│[39m 2 [90m│[39m 454 [90m│[39m 15064 [90m│[39m 2 [90m│[39m 224 (49.34%) [90m│[39m 7387 (49.04%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m javascript [90m│[39m 23 [90m│[39m 1580 [90m│[39m 6985 [90m│[39m 13 [90m│[39m 572 (36.20%) [90m│[39m 3475 (49.75%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m json [90m│[39m 4 [90m│[39m 134 [90m│[39m 460 [90m│[39m 2 [90m│[39m 38 (28.36%) [90m│[39m 134 (29.13%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m json5 [90m│[39m 2 [90m│[39m 104 [90m│[39m 307 [90m│[39m 1 [90m│[39m 30 (28.85%) [90m│[39m 93 (30.29%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m jsx [90m│[39m 2 [90m│[39m 73 [90m│[39m 296 [90m│[39m 1 [90m│[39m 20 (27.40%) [90m│[39m 99 (33.45%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m julia [90m│[39m 2 [90m│[39m 76 [90m│[39m 557 [90m│[39m 1 [90m│[39m 29 (38.16%) [90m│[39m 194 (34.83%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m kotlin [90m│[39m 2 [90m│[39m 106 [90m│[39m 550 [90m│[39m 2 [90m│[39m 47 (44.34%) [90m│[39m 250 (45.45%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m latex [90m│[39m 2 [90m│[39m 88 [90m│[39m 557 [90m│[39m 1 [90m│[39m 25 (28.41%) [90m│[39m 149 (26.75%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m less [90m│[39m 2 [90m│[39m 56 [90m│[39m 518 [90m│[39m 2 [90m│[39m 29 (51.79%) [90m│[39m 282 (54.44%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m lilypond [90m│[39m 2 [90m│[39m 100 [90m│[39m 307 [90m│[39m 1 [90m│[39m 18 (18.00%) [90m│[39m 63 (20.52%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m linker-script [90m│[39m 2 [90m│[39m 133 [90m│[39m 683 [90m│[39m 1 [90m│[39m 46 (34.59%) [90m│[39m 256 (37.48%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m lisp [90m│[39m 2 [90m│[39m 106 [90m│[39m 608 [90m│[39m 1 [90m│[39m 49 (46.23%) [90m│[39m 289 (47.53%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m livescript [90m│[39m 2 [90m│[39m 68 [90m│[39m 344 [90m│[39m 1 [90m│[39m 30 (44.12%) [90m│[39m 145 (42.15%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m llvm [90m│[39m 2 [90m│[39m 132 [90m│[39m 850 [90m│[39m 1 [90m│[39m 34 (25.76%) [90m│[39m 215 (25.29%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m log [90m│[39m 2 [90m│[39m 30 [90m│[39m 666 [90m│[39m 1 [90m│[39m 12 (40.00%) [90m│[39m 262 (39.34%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m lua [90m│[39m 2 [90m│[39m 106 [90m│[39m 450 [90m│[39m 1 [90m│[39m 45 (42.45%) [90m│[39m 193 (42.89%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m markdown [90m│[39m 4 [90m│[39m 536 [90m│[39m 929 [90m│[39m 3 [90m│[39m 262 (48.88%) [90m│[39m 1407 (151.45%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m markup [90m│[39m 11 [90m│[39m 478 [90m│[39m 2795 [90m│[39m 6 [90m│[39m 205 (42.89%) [90m│[39m 1314 (47.01%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m nsis [90m│[39m 2 [90m│[39m 68 [90m│[39m 172 [90m│[39m 1 [90m│[39m 28 (41.18%) [90m│[39m 71 (41.28%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m objectivec [90m│[39m 2 [90m│[39m 152 [90m│[39m 1463 [90m│[39m 2 [90m│[39m 61 (40.13%) [90m│[39m 527 (36.02%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m ocaml [90m│[39m 6 [90m│[39m 186 [90m│[39m 1052 [90m│[39m 3 [90m│[39m 80 (43.01%) [90m│[39m 440 (41.83%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m openqasm [90m│[39m 2 [90m│[39m 87 [90m│[39m 346 [90m│[39m 1 [90m│[39m 18 (20.69%) [90m│[39m 92 (26.59%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m oz [90m│[39m 2 [90m│[39m 94 [90m│[39m 357 [90m│[39m 1 [90m│[39m 36 (38.30%) [90m│[39m 141 (39.50%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m pascal [90m│[39m 2 [90m│[39m 106 [90m│[39m 561 [90m│[39m 1 [90m│[39m 36 (33.96%) [90m│[39m 203 (36.19%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m perl [90m│[39m 4 [90m│[39m 609 [90m│[39m 2272 [90m│[39m 3 [90m│[39m 274 (44.99%) [90m│[39m 971 (42.74%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m php [90m│[39m 2 [90m│[39m 143 [90m│[39m 785 [90m│[39m 1 [90m│[39m 50 (34.97%) [90m│[39m 295 (37.58%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m plant-uml [90m│[39m 2 [90m│[39m 120 [90m│[39m 422 [90m│[39m 1 [90m│[39m 51 (42.50%) [90m│[39m 181 (42.89%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m plsql [90m│[39m 2 [90m│[39m 171 [90m│[39m 598 [90m│[39m 2 [90m│[39m 70 (40.94%) [90m│[39m 244 (40.80%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m powerquery [90m│[39m 2 [90m│[39m 112 [90m│[39m 538 [90m│[39m 1 [90m│[39m 40 (35.71%) [90m│[39m 210 (39.03%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m powershell [90m│[39m 2 [90m│[39m 98 [90m│[39m 404 [90m│[39m 1 [90m│[39m 40 (40.82%) [90m│[39m 168 (41.58%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m prolog [90m│[39m 2 [90m│[39m 64 [90m│[39m 429 [90m│[39m 1 [90m│[39m 27 (42.19%) [90m│[39m 176 (41.03%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m properties [90m│[39m 2 [90m│[39m 48 [90m│[39m 250 [90m│[39m 1 [90m│[39m 21 (43.75%) [90m│[39m 114 (45.60%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m protobuf [90m│[39m 2 [90m│[39m 205 [90m│[39m 680 [90m│[39m 1 [90m│[39m 39 (19.02%) [90m│[39m 115 (16.91%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m pug [90m│[39m 2 [90m│[39m 574 [90m│[39m 2512 [90m│[39m 2 [90m│[39m 285 (49.65%) [90m│[39m 1249 (49.72%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m puppet [90m│[39m 2 [90m│[39m 122 [90m│[39m 446 [90m│[39m 2 [90m│[39m 58 (47.54%) [90m│[39m 214 (47.98%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m purescript [90m│[39m 2 [90m│[39m 115 [90m│[39m 797 [90m│[39m 2 [90m│[39m 49 (42.61%) [90m│[39m 315 (39.52%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m python [90m│[39m 6 [90m│[39m 323 [90m│[39m 911 [90m│[39m 3 [90m│[39m 73 (22.60%) [90m│[39m 363 (39.85%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m q [90m│[39m 2 [90m│[39m 78 [90m│[39m 997 [90m│[39m 1 [90m│[39m 29 (37.18%) [90m│[39m 378 (37.91%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m qsharp [90m│[39m 2 [90m│[39m 102 [90m│[39m 408 [90m│[39m 1 [90m│[39m 9 (8.82%) [90m│[39m 50 (12.25%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m r [90m│[39m 2 [90m│[39m 128 [90m│[39m 854 [90m│[39m 1 [90m│[39m 63 (49.22%) [90m│[39m 427 (50.00%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m racket [90m│[39m 2 [90m│[39m 100 [90m│[39m 760 [90m│[39m 1 [90m│[39m 37 (37.00%) [90m│[39m 286 (37.63%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m rescript [90m│[39m 2 [90m│[39m 115 [90m│[39m 776 [90m│[39m 1 [90m│[39m 37 (32.17%) [90m│[39m 200 (25.77%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m robotframework [90m│[39m 2 [90m│[39m 130 [90m│[39m 630 [90m│[39m 2 [90m│[39m 43 (33.08%) [90m│[39m 223 (35.40%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m ruby [90m│[39m 2 [90m│[39m 80 [90m│[39m 192 [90m│[39m 1 [90m│[39m 39 (48.75%) [90m│[39m 96 (50.00%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m rust [90m│[39m 2 [90m│[39m 717 [90m│[39m 5128 [90m│[39m 6 [90m│[39m 342 (47.70%) [90m│[39m 2445 (47.68%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m sas [90m│[39m 2 [90m│[39m 152 [90m│[39m 1174 [90m│[39m 1 [90m│[39m 58 (38.16%) [90m│[39m 444 (37.82%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m sass [90m│[39m 2 [90m│[39m 93 [90m│[39m 383 [90m│[39m 3 [90m│[39m 51 (54.84%) [90m│[39m 273 (71.28%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m scala [90m│[39m 2 [90m│[39m 58 [90m│[39m 1696 [90m│[39m 1 [90m│[39m 28 (48.28%) [90m│[39m 848 (50.00%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m scheme [90m│[39m 2 [90m│[39m 70 [90m│[39m 498 [90m│[39m 1 [90m│[39m 32 (45.71%) [90m│[39m 225 (45.18%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m scss [90m│[39m 4 [90m│[39m 360 [90m│[39m 2065 [90m│[39m 3 [90m│[39m 136 (37.78%) [90m│[39m 875 (42.37%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m smalltalk [90m│[39m 2 [90m│[39m 102 [90m│[39m 351 [90m│[39m 1 [90m│[39m 44 (43.14%) [90m│[39m 146 (41.60%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m smarty [90m│[39m 2 [90m│[39m 92 [90m│[39m 652 [90m│[39m 1 [90m│[39m 42 (45.65%) [90m│[39m 286 (43.87%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m solidity [90m│[39m 2 [90m│[39m 155 [90m│[39m 939 [90m│[39m 1 [90m│[39m 30 (19.35%) [90m│[39m 168 (17.89%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m soy [90m│[39m 2 [90m│[39m 106 [90m│[39m 841 [90m│[39m 1 [90m│[39m 48 (45.28%) [90m│[39m 346 (41.14%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m sparql [90m│[39m 2 [90m│[39m 54 [90m│[39m 296 [90m│[39m 1 [90m│[39m 10 (18.52%) [90m│[39m 65 (21.96%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m sql [90m│[39m 2 [90m│[39m 102 [90m│[39m 525 [90m│[39m 1 [90m│[39m 38 (37.25%) [90m│[39m 214 (40.76%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m stylus [90m│[39m 2 [90m│[39m 129 [90m│[39m 494 [90m│[39m 1 [90m│[39m 52 (40.31%) [90m│[39m 201 (40.69%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m svelte [90m│[39m 2 [90m│[39m 462 [90m│[39m 1586 [90m│[39m 0 [90m│[39m 0 (0.00%) [90m│[39m 0 (0.00%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m swift [90m│[39m 2 [90m│[39m 58 [90m│[39m 175 [90m│[39m 1 [90m│[39m 20 (34.48%) [90m│[39m 73 (41.71%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m tap [90m│[39m 2 [90m│[39m 98 [90m│[39m 562 [90m│[39m 1 [90m│[39m 34 (34.69%) [90m│[39m 202 (35.94%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m tcl [90m│[39m 2 [90m│[39m 106 [90m│[39m 600 [90m│[39m 1 [90m│[39m 44 (41.51%) [90m│[39m 263 (43.83%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m text [90m│[39m 2 [90m│[39m 354 [90m│[39m 143 [90m│[39m 1 [90m│[39m 10 (2.82%) [90m│[39m 69 (48.25%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m textile [90m│[39m 2 [90m│[39m 106 [90m│[39m 495 [90m│[39m 1 [90m│[39m 50 (47.17%) [90m│[39m 236 (47.68%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m toml [90m│[39m 2 [90m│[39m 91 [90m│[39m 229 [90m│[39m 1 [90m│[39m 38 (41.76%) [90m│[39m 100 (43.67%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m tsx [90m│[39m 2 [90m│[39m 76 [90m│[39m 310 [90m│[39m 1 [90m│[39m 34 (44.74%) [90m│[39m 143 (46.13%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m tt2 [90m│[39m 2 [90m│[39m 104 [90m│[39m 803 [90m│[39m 2 [90m│[39m 47 (45.19%) [90m│[39m 353 (43.96%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m turtle [90m│[39m 2 [90m│[39m 90 [90m│[39m 520 [90m│[39m 1 [90m│[39m 35 (38.89%) [90m│[39m 212 (40.77%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m twig [90m│[39m 2 [90m│[39m 61 [90m│[39m 424 [90m│[39m 3 [90m│[39m 44 (72.13%) [90m│[39m 286 (67.45%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m txt [90m│[39m 4 [90m│[39m 146 [90m│[39m 870 [90m│[39m 2 [90m│[39m 71 (48.63%) [90m│[39m 435 (50.00%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m typescript [90m│[39m 12 [90m│[39m 2159 [90m│[39m 9379 [90m│[39m 8 [90m│[39m 958 (44.37%) [90m│[39m 4688 (49.98%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m unrealscript [90m│[39m 2 [90m│[39m 166 [90m│[39m 520 [90m│[39m 1 [90m│[39m 55 (33.13%) [90m│[39m 161 (30.96%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m vbnet [90m│[39m 2 [90m│[39m 72 [90m│[39m 378 [90m│[39m 1 [90m│[39m 28 (38.89%) [90m│[39m 163 (43.12%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m velocity [90m│[39m 2 [90m│[39m 88 [90m│[39m 576 [90m│[39m 1 [90m│[39m 40 (45.45%) [90m│[39m 264 (45.83%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m verilog [90m│[39m 2 [90m│[39m 104 [90m│[39m 430 [90m│[39m 1 [90m│[39m 39 (37.50%) [90m│[39m 163 (37.91%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m vhdl [90m│[39m 2 [90m│[39m 98 [90m│[39m 546 [90m│[39m 1 [90m│[39m 31 (31.63%) [90m│[39m 179 (32.78%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m vue [90m│[39m 4 [90m│[39m 587 [90m│[39m 3333 [90m│[39m 0 [90m│[39m 0 (0.00%) [90m│[39m 0 (0.00%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m wgsl [90m│[39m 2 [90m│[39m 127 [90m│[39m 928 [90m│[39m 2 [90m│[39m 52 (40.94%) [90m│[39m 340 (36.64%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m wolfram [90m│[39m 2 [90m│[39m 85 [90m│[39m 697 [90m│[39m 1 [90m│[39m 16 (18.82%) [90m│[39m 127 (18.22%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m xquery [90m│[39m 2 [90m│[39m 80 [90m│[39m 640 [90m│[39m 1 [90m│[39m 30 (37.50%) [90m│[39m 222 (34.69%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m yaml [90m│[39m 6 [90m│[39m 262 [90m│[39m 554 [90m│[39m 2 [90m│[39m 45 (17.18%) [90m│[39m 192 (34.66%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m zig [90m│[39m 2 [90m│[39m 130 [90m│[39m 827 [90m│[39m 2 [90m│[39m 52 (40.00%) [90m│[39m 311 (37.61%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m [1mTotal:[22m [90m│[39m 347 [90m│[39m 24603 [90m│[39m 130473 [90m│[39m 212 [90m│[39m 9133 (37.12%) [90m│[39m 56491 (43.30%) [90m│[39m
[90m└────────────────┴────────────────┴─────────────┴──────────────┴──────────────┴──────────────────┴───────────────────┘[39m
[90mFound 212 clones.[39m
[90mtime: 42.279ms[39m
[90m💡 Auto-refactor with AI: [1m[39mnpx skills add https://github.com/kucherenko/jscpd --skill dry-refactoring[90m[22m
[90m🎩 New: Gangsta Agents — discipline your AI coding → gangsta.page[39m
[90m💖 Support jscpd project → https://opencollective.com/jscpd[39m command (bin field
declares only jscpd). The [1mClone found (actionscript)[22m
- [1m[32mactionscript/file1.as[39m[22m [1:1 - 30:10] (30 lines, 127 tokens)
actionscript/file2.as [1:1 - 30:10]
[1mClone found (ada)[22m
- [1m[32mada/file1.ada[39m[22m [1:1 - 21:12] (21 lines, 103 tokens)
ada/file2.ada [1:1 - 21:12]
[1mClone found (antlr4)[22m
- [1m[32mantlr4/file1.g4[39m[22m [1:1 - 21:27] (21 lines, 82 tokens)
antlr4/file2.g4 [1:1 - 21:27]
[1mClone found (apex)[22m
- [1m[32mapex/file1.cls[39m[22m [1:29 - 24:18] (24 lines, 115 tokens)
apex/file2.cls [1:29 - 24:18]
[1mClone found (apl)[22m
- [1m[32mapl/file1.apl[39m[22m [1:1 - 20:54] (20 lines, 252 tokens)
apl/file2.apl [1:1 - 20:54]
[1mClone found (css)[22m
- [1m[32mastro/component1.astro:css[39m[22m [76:3 - 161:4] (86 lines, 364 tokens)
astro/component2.astro:css [76:3 - 161:4]
[1mClone found (css)[22m
- [1m[32mastro/component1.astro:css[39m[22m [79:23 - 124:12] (46 lines, 194 tokens)
svelte/component1.svelte:css [116:28 - 161:12]
[1mClone found (html)[22m
- [1m[32mastro/component1.astro:html[39m[22m [1:1 - 162:9] (162 lines, 246 tokens)
astro/component2.astro:html [1:1 - 162:9]
[1mClone found (html)[22m
- [1m[32mastro/component1.astro:html[39m[22m [27:1 - 33:8] (7 lines, 67 tokens)
svelte/component1.svelte:html [64:1 - 70:8]
[1mClone found (javascript)[22m
- [1m[32mastro/component1.astro:javascript[39m[22m [58:3 - 72:4] (15 lines, 111 tokens)
astro/component2.astro:javascript [58:3 - 72:4]
[1mClone found (typescript)[22m
- [1m[32mastro/component1.astro:typescript[39m[22m [2:1 - 24:4] (23 lines, 153 tokens)
astro/component2.astro:typescript [2:1 - 24:4]
[1mClone found (awk)[22m
- [1m[32mawk/file1.awk[39m[22m [1:1 - 23:33] (23 lines, 75 tokens)
awk/file2.awk [1:1 - 23:33]
[1mClone found (basic)[22m
- [1m[32mbasic/file1.bas[39m[22m [1:1 - 18:4] (18 lines, 100 tokens)
basic/file2.bas [1:1 - 18:4]
[1mClone found (bicep)[22m
- [1m[32mbicep/file1.bicep[39m[22m [1:1 - 27:9] (27 lines, 78 tokens)
bicep/file2.bicep [1:1 - 27:9]
[1mClone found (brainfuck)[22m
- [1m[32mbrainfuck/file1.b[39m[22m [1:1 - 26:77] (26 lines, 268 tokens)
brainfuck/file1.bf [1:1 - 26:77]
[1mClone found (brainfuck)[22m
- [1m[32mbrainfuck/file1.b[39m[22m [1:1 - 41:59] (41 lines, 439 tokens)
brainfuck/file2.b [1:1 - 41:59]
[1mClone found (brainfuck)[22m
- [1m[32mbrainfuck/file1.b[39m[22m [1:1 - 41:59] (41 lines, 439 tokens)
brainfuck/file2.bf [1:1 - 41:59]
[1mClone found (brainfuck)[22m
- [1m[32mbrainfuck/file1.b[39m[22m [33:1 - 41:59] (9 lines, 143 tokens)
brainfuck/file1.bf [28:1 - 36:59]
[1mClone found (cfml)[22m
- [1m[32mcfml/file1.cfm[39m[22m [4:20 - 21:2] (18 lines, 85 tokens)
cfml/file2.cfm [4:18 - 21:2]
[1mClone found (cfscript)[22m
- [1m[32mcfscript/file1.cfc[39m[22m [1:1 - 28:11] (28 lines, 161 tokens)
cfscript/file2.cfc [1:1 - 28:11]
[1mClone found (c)[22m
- [1m[32mclike/file1.c[39m[22m [1:1 - 17:4] (17 lines, 258 tokens)
clike/file2.c [1:1 - 17:4]
[1mClone found (c)[22m
- [1m[32mclike/file1.c[39m[22m [8:3 - 19:2] (12 lines, 81 tokens)
clike/file2.c [18:3 - 29:2]
[1mClone found (cpp)[22m
- [1m[32mclike/file1.cpp[39m[22m [1:1 - 88:7] (88 lines, 757 tokens)
clike/file2.cpp [1:1 - 88:7]
[1mClone found (cpp)[22m
- [1m[32mclike/file1.cpp[39m[22m [24:5 - 43:51] (20 lines, 208 tokens)
clike/file1.cpp [45:5 - 64:51]
[1mClone found (csharp)[22m
- [1m[32mclike/file1.cs[39m[22m [1:1 - 91:19] (91 lines, 235 tokens)
clike/file2.cs [1:1 - 91:19]
[1mClone found (csharp)[22m
- [1m[32mclike/file1.cs[39m[22m [103:9 - 185:2] (83 lines, 302 tokens)
clike/file2.cs [93:9 - 175:2]
[1mClone found (c-header)[22m
- [1m[32mclike/file1.h[39m[22m [1:1 - 17:4] (17 lines, 258 tokens)
clike/file2.h [1:1 - 17:4]
[1mClone found (c-header)[22m
- [1m[32mclike/file1.h[39m[22m [8:3 - 19:2] (12 lines, 81 tokens)
clike/file2.h [18:3 - 29:2]
[1mClone found (cpp-header)[22m
- [1m[32mclike/file1.hpp[39m[22m [1:1 - 88:7] (88 lines, 757 tokens)
clike/file2.hpp [1:1 - 88:7]
[1mClone found (cpp-header)[22m
- [1m[32mclike/file1.hpp[39m[22m [24:5 - 43:51] (20 lines, 208 tokens)
clike/file1.hpp [45:5 - 64:51]
[1mClone found (java)[22m
- [1m[32mclike/file1.java[39m[22m [1:1 - 186:6] (186 lines, 6601 tokens)
clike/file2.java [1:1 - 186:6]
[1mClone found (java)[22m
- [1m[32mclike/file1.java[39m[22m [182:51 - 221:2] (40 lines, 786 tokens)
clike/file2.java [194:52 - 233:2]
[1mClone found (kotlin)[22m
- [1m[32mclike/file1.kt[39m[22m [1:1 - 33:6] (33 lines, 186 tokens)
clike/file2.kt [1:1 - 33:6]
[1mClone found (kotlin)[22m
- [1m[32mclike/file1.kt[39m[22m [38:5 - 53:2] (16 lines, 64 tokens)
clike/file2.kt [38:5 - 53:2]
[1mClone found (scala)[22m
- [1m[32mclike/file1.scala[39m[22m [1:1 - 29:2] (29 lines, 848 tokens)
clike/file2.scala [1:1 - 29:2]
[1mClone found (clojure)[22m
- [1m[32mclojure/file1.clj[39m[22m [2:3 - 20:23] (19 lines, 139 tokens)
clojure/file2.clj [2:3 - 20:23]
[1mClone found (cmake)[22m
- [1m[32mcmake/file1.cmake[39m[22m [1:1 - 21:14] (21 lines, 128 tokens)
cmake/file2.cmake [1:1 - 21:14]
[1mClone found (coffeescript)[22m
- [1m[32mcoffeescript/file1.coffee[39m[22m [1:1 - 13:22] (13 lines, 75 tokens)
coffeescript/file2.coffee [3:1 - 15:22]
[1mClone found (coffeescript)[22m
- [1m[32mcoffeescript/file1.coffee[39m[22m [16:1 - 44:21] (29 lines, 144 tokens)
coffeescript/file1.coffee [46:1 - 74:21]
[1mClone found (lisp)[22m
- [1m[32mcommonlisp/file1.el[39m[22m [1:1 - 50:23] (50 lines, 289 tokens)
commonlisp/file2.el [1:1 - 50:23]
[1mClone found (crystal)[22m
- [1m[32mcrystal/file1.cr[39m[22m [1:1 - 29:4] (29 lines, 97 tokens)
crystal/file2.cr [1:1 - 29:4]
[1mClone found (css)[22m
- [1m[32mcss/file1.css[39m[22m [1:1 - 25:2] (25 lines, 237 tokens)
css/file10.css [1:1 - 25:2]
[1mClone found (css)[22m
- [1m[32mcss/file1.css[39m[22m [1:1 - 19:36] (19 lines, 192 tokens)
css/file2.css [1:1 - 19:36]
[1mClone found (less)[22m
- [1m[32mcss/file1.less[39m[22m [1:1 - 19:36] (19 lines, 192 tokens)
css/file2.less [1:1 - 19:36]
[1mClone found (less)[22m
- [1m[32mcss/file1.less[39m[22m [14:35 - 25:2] (12 lines, 90 tokens)
css/file1.less [24:5 - 36:2]
[1mClone found (scss)[22m
- [1m[32mcss/file1.scss[39m[22m [1:1 - 53:2] (53 lines, 324 tokens)
css/file2.scss [1:1 - 53:2]
[1mClone found (csv)[22m
- [1m[32mcsv/file1.csv[39m[22m [1:1 - 9:56] (9 lines, 163 tokens)
csv/file2.csv [1:1 - 9:56]
[1mClone found (d)[22m
- [1m[32md/file1.d[39m[22m [1:1 - 169:6] (169 lines, 1135 tokens)
d/file2.d [1:1 - 169:6]
[1mClone found (dart)[22m
- [1m[32mdart/file1.dart[39m[22m [1:1 - 89:4] (89 lines, 403 tokens)
dart/file2.dart [1:1 - 89:4]
[1mClone found (dart)[22m
- [1m[32mdart/file1.dart[39m[22m [118:15 - 148:2] (31 lines, 119 tokens)
dart/file2.dart [88:6 - 118:2]
[1mClone found (diff)[22m
- [1m[32mdiff/file1.diff[39m[22m [1:1 - 62:7] (62 lines, 435 tokens)
diff/file2.diff [1:1 - 62:7]
[1mClone found (dot)[22m
- [1m[32mdot/file1.dot[39m[22m [1:1 - 18:21] (18 lines, 91 tokens)
dot/file2.dot [1:1 - 18:21]
[1mClone found (eiffel)[22m
- [1m[32meiffel/file1.e[39m[22m [1:1 - 46:11] (46 lines, 130 tokens)
eiffel/file2.e [1:1 - 46:11]
[1mClone found (elm)[22m
- [1m[32melm/file1.elm[39m[22m [1:1 - 47:23] (47 lines, 155 tokens)
elm/file2.elm [1:1 - 47:23]
[1mClone found (erlang)[22m
- [1m[32merlang/file1.erl[39m[22m [1:1 - 121:7] (121 lines, 837 tokens)
erlang/file2.erl [1:1 - 121:7]
[1mClone found (javascript)[22m
- [1m[32mfolder1/file_1.js[39m[22m [4:1 - 55:3] (52 lines, 339 tokens)
javascript/file_1.cjs [4:1 - 55:3]
[1mClone found (javascript)[22m
- [1m[32mfolder1/file_1.js[39m[22m [4:1 - 55:3] (52 lines, 339 tokens)
javascript/file_1.js [4:1 - 55:3]
[1mClone found (javascript)[22m
- [1m[32mfolder1/file_1.js[39m[22m [4:1 - 55:3] (52 lines, 339 tokens)
javascript/file_1.mjs [4:1 - 55:3]
[1mClone found (javascript)[22m
- [1m[32mfolder1/file_1.js[39m[22m [4:1 - 55:3] (52 lines, 339 tokens)
javascript/file_3.js [1:1 - 52:3]
[1mClone found (javascript)[22m
- [1m[32mfolder1/file_1.js[39m[22m [28:1 - 55:3] (28 lines, 169 tokens)
folder2/file_2.js [1:1 - 28:3]
[1mClone found (javascript)[22m
- [1m[32mfolder1/file_1.js[39m[22m [28:1 - 55:3] (28 lines, 169 tokens)
folder2/file_2.js [29:1 - 56:3]
[1mClone found (fortran)[22m
- [1m[32mfortran/file1.f[39m[22m [1:7 - 37:21] (37 lines, 182 tokens)
fortran/file2.f [1:7 - 37:21]
[1mClone found (gdscript)[22m
- [1m[32mgdscript/file1.gd[39m[22m [22:1 - 46:18] (25 lines, 135 tokens)
gdscript/file2.gd [22:1 - 46:18]
[1mClone found (gettext)[22m
- [1m[32mgettext/file1.po[39m[22m [13:1 - 64:7] (52 lines, 82 tokens)
gettext/file2.po [13:1 - 64:7]
[1mClone found (gherkin)[22m
- [1m[32mgherkin/file1.feature[39m[22m [1:1 - 16:26] (16 lines, 83 tokens)
gherkin/file2.feature [1:1 - 16:26]
[1mClone found (ignore)[22m
- [1m[32mgitignore/file1.gitignore[39m[22m [1:1 - 84:16] (84 lines, 234 tokens)
gitignore/file2.gitignore [1:1 - 84:16]
[1mClone found (go)[22m
- [1m[32mgo/file1.go[39m[22m [1:1 - 30:5] (30 lines, 134 tokens)
go/file2.go [1:1 - 31:5]
[1mClone found (graphql)[22m
- [1m[32mgraphql/file1.graphql[39m[22m [1:1 - 25:5] (25 lines, 143 tokens)
graphql/file2.graphql [1:1 - 25:5]
[1mClone found (groovy)[22m
- [1m[32mgroovy/file1.groovy[39m[22m [1:1 - 41:6] (41 lines, 188 tokens)
groovy/file2.groovy [1:1 - 41:6]
[1mClone found (haml)[22m
- [1m[32mhaml/file1.haml[39m[22m [1:1 - 23:18] (23 lines, 118 tokens)
haml/file2.haml [1:1 - 23:18]
[1mClone found (handlebars)[22m
- [1m[32mhandlebars/file1.hbs[39m[22m [1:1 - 28:27] (28 lines, 218 tokens)
handlebars/file2.hbs [1:1 - 28:27]
[1mClone found (haskell)[22m
- [1m[32mhaskell-literate/file1.lhs[39m[22m [1:1 - 31:2] (31 lines, 182 tokens)
haskell-literate/file2.lhs [1:1 - 31:2]
[1mClone found (haskell)[22m
- [1m[32mhaskell/file1.hs[39m[22m [1:1 - 173:34] (173 lines, 902 tokens)
haskell/file2.hs [1:1 - 173:34]
[1mClone found (haskell)[22m
- [1m[32mhaskell/file1.hs[39m[22m [190:1 - 204:33] (15 lines, 99 tokens)
haskell/file2.hs [175:1 - 189:33]
[1mClone found (haxe)[22m
- [1m[32mhaxe/file1.hx[39m[22m [1:1 - 62:76] (62 lines, 334 tokens)
haxe/file2.hx [1:1 - 62:2]
[1mClone found (haxe)[22m
- [1m[32mhaxe/file1.hx[39m[22m [6:3 - 47:9] (42 lines, 244 tokens)
haxe/file1.hx [47:3 - 88:9]
[1mClone found (haxe)[22m
- [1m[32mhaxe/file1.hxml[39m[22m [3:1 - 14:10] (12 lines, 56 tokens)
haxe/file2.hxml [1:1 - 12:10]
[1mClone found (hcl)[22m
- [1m[32mhcl/file1.tf[39m[22m [1:1 - 37:9] (37 lines, 85 tokens)
hcl/file2.tf [1:1 - 37:9]
[1mClone found (aspnet)[22m
- [1m[32mhtmlembedded/file1.aspx[39m[22m [7:18 - 16:35] (10 lines, 67 tokens)
htmlembedded/file2.aspx [7:21 - 16:35]
[1mClone found (aspnet)[22m
- [1m[32mhtmlembedded/file1.aspx[39m[22m [18:53 - 36:30] (19 lines, 173 tokens)
htmlembedded/file2.aspx [18:60 - 36:30]
[1mClone found (aspnet)[22m
- [1m[32mhtmlembedded/file1.aspx[39m[22m [37:95 - 47:8] (11 lines, 56 tokens)
htmlembedded/file2.aspx [44:98 - 54:8]
[1mClone found (markup)[22m
- [1m[32mhtmlmixed/file1.htm[39m[22m [1:1 - 24:7] (24 lines, 191 tokens)
htmlmixed/file2.htm [1:1 - 24:7]
[1mClone found (markup)[22m
- [1m[32mhtmlmixed/file1.htm[39m[22m [1:1 - 24:7] (24 lines, 191 tokens)
ignore/file2.htm [1:1 - 24:7]
[1mClone found (markup)[22m
- [1m[32mhtmlmixed/file1.html[39m[22m [1:1 - 16:2] (16 lines, 91 tokens)
htmlmixed/file2.html [1:1 - 16:2]
[1mClone found (prolog)[22m
- [1m[32midl/file1.pro[39m[22m [1:1 - 28:22] (28 lines, 176 tokens)
idl/file2.pro [1:1 - 28:22]
[1mClone found (idris)[22m
- [1m[32midris/file1.idr[39m[22m [1:1 - 35:3] (35 lines, 208 tokens)
idris/file2.idr [1:1 - 35:3]
[1mClone found (txt)[22m
- [1m[32mignore-case/file2.txt[39m[22m [1:1 - 12:55] (12 lines, 85 tokens)
text/file1.txt [1:1 - 12:55]
[1mClone found (txt)[22m
- [1m[32mignore-case/file2.txt[39m[22m [1:1 - 61:63] (61 lines, 350 tokens)
text/file2.txt [1:1 - 61:63]
[1mClone found (typescript)[22m
- [1m[32mjavascript/file1.cts[39m[22m [1:1 - 263:4] (263 lines, 1318 tokens)
javascript/file1.mts [1:1 - 263:4]
[1mClone found (typescript)[22m
- [1m[32mjavascript/file1.cts[39m[22m [1:1 - 263:4] (263 lines, 1318 tokens)
javascript/file1.ts [1:1 - 263:4]
[1mClone found (typescript)[22m
- [1m[32mjavascript/file1.cts[39m[22m [1:1 - 66:24] (66 lines, 531 tokens)
javascript/file2.cts [48:1 - 113:24]
[1mClone found (typescript)[22m
- [1m[32mjavascript/file1.cts[39m[22m [74:1 - 263:4] (190 lines, 787 tokens)
javascript/file2.cts [187:1 - 376:4]
[1mClone found (javascript)[22m
- [1m[32mjavascript/file1.js[39m[22m [5:1 - 24:2] (20 lines, 94 tokens)
javascript/file2.js [5:1 - 27:2]
[1mClone found (json)[22m
- [1m[32mjavascript/file1.json[39m[22m [4:53 - 21:22] (18 lines, 64 tokens)
javascript/file2.json [4:70 - 21:22]
[1mClone found (json)[22m
- [1m[32mjavascript/file1.json[39m[22m [22:22 - 43:2] (22 lines, 70 tokens)
javascript/file2.json [22:22 - 43:2]
[1mClone found (typescript)[22m
- [1m[32mjavascript/file2.cts[39m[22m [109:38 - 209:24] (101 lines, 297 tokens)
javascript/file2.mts [109:38 - 209:24]
[1mClone found (javascript)[22m
- [1m[32mjavascript/file_4.js[39m[22m [15:2 - 42:43] (28 lines, 98 tokens)
javascript/file_4.js [56:74 - 83:43]
[1mClone found (json5)[22m
- [1m[32mjson5/file1.json5[39m[22m [1:1 - 31:5] (31 lines, 93 tokens)
json5/file2.json5 [1:1 - 31:5]
[1mClone found (jsx)[22m
- [1m[32mjsx/file1.jsx[39m[22m [1:1 - 21:46] (21 lines, 99 tokens)
jsx/file2.jsx [1:1 - 21:46]
[1mClone found (tsx)[22m
- [1m[32mjsx/file1.tsx[39m[22m [1:1 - 35:2] (35 lines, 143 tokens)
jsx/file2.tsx [1:1 - 35:2]
[1mClone found (julia)[22m
- [1m[32mjulia/file1.jl[39m[22m [1:1 - 30:4] (30 lines, 194 tokens)
julia/file2.jl [1:1 - 30:4]
[1mClone found (latex)[22m
- [1m[32mlatex/file1.tex[39m[22m [1:1 - 26:13] (26 lines, 149 tokens)
latex/file2.tex [1:1 - 26:13]
[1mClone found (lilypond)[22m
- [1m[32mlilypond/file1.ly[39m[22m [1:1 - 19:10] (19 lines, 63 tokens)
lilypond/file2.ly [1:1 - 19:10]
[1mClone found (linker-script)[22m
- [1m[32mlinker-script/file1.ld[39m[22m [1:1 - 47:4] (47 lines, 256 tokens)
linker-script/file2.ld [1:1 - 47:4]
[1mClone found (livescript)[22m
- [1m[32mlivescript/file1.ls[39m[22m [1:1 - 31:24] (31 lines, 145 tokens)
livescript/file2.ls [1:1 - 31:24]
[1mClone found (llvm)[22m
- [1m[32mllvm/file1.ll[39m[22m [1:1 - 35:2] (35 lines, 215 tokens)
llvm/file2.ll [1:1 - 35:2]
[1mClone found (log)[22m
- [1m[32mlog/file1.log[39m[22m [1:1 - 13:11] (13 lines, 262 tokens)
log/file2.log [1:1 - 13:11]
[1mClone found (lua)[22m
- [1m[32mlua/file1.lua[39m[22m [1:1 - 46:4] (46 lines, 193 tokens)
lua/file2.lua [1:1 - 46:4]
[1mClone found (markdown)[22m
- [1m[32mmarkdown/file1.md:markdown[39m[22m [2:1 - 176:3] (175 lines, 1238 tokens)
markdown/file2.md:markdown [7:1 - 181:3]
[1mClone found (markdown)[22m
- [1m[32mmarkdown/file1.md:markdown[39m[22m [176:1 - 193:86] (18 lines, 100 tokens)
markdown/file2.md:markdown [196:1 - 213:86]
[1mClone found (text)[22m
- [1m[32mmarkdown/file1.md:text[39m[22m [156:1 - 166:11] (11 lines, 69 tokens)
markdown/file2.md:text [161:1 - 171:11]
[1mClone found (yaml)[22m
- [1m[32mmarkdown/file1.md:yaml[39m[22m [53:1 - 81:10] (29 lines, 60 tokens)
markdown/file2.md:yaml [58:1 - 86:10]
[1mClone found (markdown)[22m
- [1m[32mmarkdown/file3.md:markdown[39m[22m [27:85 - 98:66] (72 lines, 69 tokens)
markdown/file4.md:markdown [27:89 - 98:66]
[1mClone found (python)[22m
- [1m[32mmarkdown/file3.md:python[39m[22m [72:1 - 91:6] (20 lines, 137 tokens)
markdown/file4.md:python [72:1 - 91:6]
[1mClone found (typescript)[22m
- [1m[32mmarkdown/file3.md:typescript[39m[22m [34:1 - 64:2] (31 lines, 156 tokens)
markdown/file4.md:typescript [34:1 - 64:2]
[1mClone found (wolfram)[22m
- [1m[32mmathematica/file1.wl[39m[22m [1:1 - 17:3] (17 lines, 127 tokens)
mathematica/file2.wl [1:1 - 17:3]
[1mClone found (fsharp)[22m
- [1m[32mmllike/file1.fs[39m[22m [1:1 - 35:6] (35 lines, 193 tokens)
mllike/file2.fs [1:1 - 35:6]
[1mClone found (ocaml)[22m
- [1m[32mmllike/file1.ml[39m[22m [1:1 - 30:18] (30 lines, 150 tokens)
mllike/file2.ml [1:1 - 30:18]
[1mClone found (ocaml)[22m
- [1m[32mmllike/file1.mli[39m[22m [1:1 - 29:20] (29 lines, 186 tokens)
mllike/file2.mli [1:1 - 29:20]
[1mClone found (ocaml)[22m
- [1m[32mmllike/file1.mll[39m[22m [1:1 - 24:20] (24 lines, 104 tokens)
mllike/file2.mll [1:1 - 24:20]
[1mClone found (nsis)[22m
- [1m[32mnsis/file1.nsi[39m[22m [1:1 - 29:25] (29 lines, 71 tokens)
nsis/file2.nsi [1:1 - 29:25]
[1mClone found (c-header)[22m
- [1m[32mobjective-c/file_1.h[39m[22m [1:1 - 33:2] (33 lines, 385 tokens)
objective-c/file_2.h [1:1 - 33:2]
[1mClone found (objectivec)[22m
- [1m[32mobjective-c/file_1.m[39m[22m [1:1 - 12:35] (12 lines, 311 tokens)
objective-c/file_2.m [1:1 - 12:35]
[1mClone found (objectivec)[22m
- [1m[32mobjective-c/file_1.m[39m[22m [14:1 - 64:5] (51 lines, 216 tokens)
objective-c/file_2.m [38:1 - 88:5]
[1mClone found (javascript)[22m
- [1m[32mone-file/one-file.js[39m[22m [1:1 - 28:6] (28 lines, 165 tokens)
one-file/one-file.js [32:1 - 59:6]
[1mClone found (openqasm)[22m
- [1m[32mopenqasm/file1.qasm[39m[22m [5:1 - 23:7] (19 lines, 92 tokens)
openqasm/file2.qasm [23:1 - 41:7]
[1mClone found (oz)[22m
- [1m[32moz/file1.oz[39m[22m [1:1 - 37:20] (37 lines, 141 tokens)
oz/file2.oz [1:1 - 37:20]
[1mClone found (pascal)[22m
- [1m[32mpascal/file1.pas[39m[22m [1:1 - 37:5] (37 lines, 203 tokens)
pascal/file2.pas [1:1 - 37:5]
[1mClone found (perl)[22m
- [1m[32mperl/file1.pl[39m[22m [1:1 - 121:31] (121 lines, 331 tokens)
perl/file2.pl [1:1 - 121:31]
[1mClone found (perl)[22m
- [1m[32mperl/file1.pm[39m[22m [1:1 - 143:4] (143 lines, 586 tokens)
perl/file2.pm [1:1 - 143:4]
[1mClone found (perl)[22m
- [1m[32mperl/file1.pm[39m[22m [143:3 - 155:3] (13 lines, 54 tokens)
perl/file2.pm [176:3 - 188:3]
[1mClone found (php)[22m
- [1m[32mphp/file1.php[39m[22m [1:1 - 51:20] (51 lines, 295 tokens)
php/file2.php [1:1 - 51:20]
[1mClone found (plant-uml)[22m
- [1m[32mplant-uml/file1.puml[39m[22m [1:1 - 52:40] (52 lines, 181 tokens)
plant-uml/file2.puml [1:1 - 52:40]
[1mClone found (plsql)[22m
- [1m[32mplsql/file1.plsql[39m[22m [1:1 - 56:12] (56 lines, 191 tokens)
plsql/file2.plsql [1:1 - 56:12]
[1mClone found (plsql)[22m
- [1m[32mplsql/file1.plsql[39m[22m [70:20 - 85:2] (16 lines, 53 tokens)
plsql/file2.plsql [71:25 - 86:2]
[1mClone found (powerquery)[22m
- [1m[32mpowerquery/file1.pq[39m[22m [1:1 - 41:7] (41 lines, 210 tokens)
powerquery/file2.pq [1:1 - 41:7]
[1mClone found (powershell)[22m
- [1m[32mpowershell/file1.ps1[39m[22m [1:1 - 41:2] (41 lines, 168 tokens)
powershell/file2.ps1 [1:1 - 41:2]
[1mClone found (ini)[22m
- [1m[32mproperties/file1.ini[39m[22m [1:1 - 27:7] (27 lines, 79 tokens)
properties/file2.ini [1:1 - 27:7]
[1mClone found (properties)[22m
- [1m[32mproperties/file1.properties[39m[22m [1:1 - 22:11] (22 lines, 114 tokens)
properties/file2.properties [1:1 - 22:11]
[1mClone found (protobuf)[22m
- [1m[32mprotobuf/file1.proto[39m[22m [1:1 - 40:8] (40 lines, 115 tokens)
protobuf/file2.proto [1:1 - 40:8]
[1mClone found (pug)[22m
- [1m[32mpug/file1.pug[39m[22m [1:1 - 234:21] (234 lines, 1037 tokens)
pug/file2.pug [1:1 - 234:21]
[1mClone found (pug)[22m
- [1m[32mpug/file1.pug[39m[22m [239:36 - 291:67] (53 lines, 212 tokens)
pug/file2.pug [231:30 - 283:67]
[1mClone found (puppet)[22m
- [1m[32mpuppet/file1.pp[39m[22m [1:1 - 39:4] (39 lines, 131 tokens)
puppet/file2.pp [1:1 - 39:4]
[1mClone found (puppet)[22m
- [1m[32mpuppet/file1.pp[39m[22m [44:32 - 64:2] (21 lines, 83 tokens)
puppet/file2.pp [38:38 - 58:2]
[1mClone found (purescript)[22m
- [1m[32mpurescript/file1.purs[39m[22m [1:1 - 44:7] (44 lines, 265 tokens)
purescript/file2.purs [1:1 - 44:7]
[1mClone found (purescript)[22m
- [1m[32mpurescript/file1.purs[39m[22m [47:41 - 53:44] (7 lines, 50 tokens)
purescript/file2.purs [47:40 - 53:44]
[1mClone found (python)[22m
- [1m[32mpython/file1.py[39m[22m [1:1 - 24:13] (24 lines, 67 tokens)
python/file2.py [1:1 - 24:13]
[1mClone found (q)[22m
- [1m[32mq/file1.q[39m[22m [1:1 - 30:2] (30 lines, 378 tokens)
q/file2.q [1:1 - 30:2]
[1mClone found (qsharp)[22m
- [1m[32mqsharp/file1.qs[39m[22m [2:32 - 11:6] (10 lines, 50 tokens)
qsharp/file2.qs [2:29 - 11:6]
[1mClone found (r)[22m
- [1m[32mr/file1.r[39m[22m [1:1 - 64:9] (64 lines, 427 tokens)
r/file2.r [1:1 - 64:9]
[1mClone found (racket)[22m
- [1m[32mracket/file1.rkt[39m[22m [1:1 - 38:3] (38 lines, 286 tokens)
racket/file2.rkt [1:1 - 38:3]
[1mClone found (rescript)[22m
- [1m[32mrescript/file1.res[39m[22m [1:1 - 38:2] (38 lines, 200 tokens)
rescript/file2.res [1:1 - 38:2]
[1mClone found (robotframework)[22m
- [1m[32mrobotframework/file1.robot[39m[22m [1:1 - 27:45] (27 lines, 143 tokens)
robotframework/file2.robot [1:1 - 27:45]
[1mClone found (robotframework)[22m
- [1m[32mrobotframework/file1.robot[39m[22m [45:1 - 62:23] (18 lines, 80 tokens)
robotframework/file2.robot [51:1 - 68:23]
[1mClone found (ruby)[22m
- [1m[32mruby/file1.rb[39m[22m [1:1 - 40:4] (40 lines, 96 tokens)
ruby/file2.rb [1:1 - 40:4]
[1mClone found (rust)[22m
- [1m[32mrust/file1.rs[39m[22m [1:1 - 131:3] (131 lines, 857 tokens)
rust/file2.rs [1:1 - 132:3]
[1mClone found (rust)[22m
- [1m[32mrust/file1.rs[39m[22m [199:50 - 204:2] (6 lines, 51 tokens)
rust/file1.rs [255:53 - 260:2]
[1mClone found (rust)[22m
- [1m[32mrust/file1.rs[39m[22m [232:93 - 239:64] (8 lines, 58 tokens)
rust/file1.rs [247:47 - 254:64]
[1mClone found (rust)[22m
- [1m[32mrust/file1.rs[39m[22m [239:57 - 416:2] (178 lines, 1285 tokens)
rust/file2.rs [123:52 - 301:2]
[1mClone found (rust)[22m
- [1m[32mrust/file1.rs[39m[22m [263:28 - 273:12] (11 lines, 80 tokens)
rust/file1.rs [335:21 - 345:12]
[1mClone found (rust)[22m
- [1m[32mrust/file1.rs[39m[22m [319:60 - 332:2] (14 lines, 114 tokens)
rust/file1.rs [371:96 - 384:2]
[1mClone found (sas)[22m
- [1m[32msas/file1.sas[39m[22m [1:1 - 59:4] (59 lines, 444 tokens)
sas/file2.sas [1:1 - 59:4]
[1mClone found (sass)[22m
- [1m[32msass/file1.sass[39m[22m [1:1 - 19:17] (19 lines, 89 tokens)
sass/file2.sass [1:1 - 19:17]
[1mClone found (sass)[22m
- [1m[32msass/file1.sass[39m[22m [3:1 - 17:43] (15 lines, 82 tokens)
sass/file1.sass [19:1 - 33:43]
[1mClone found (sass)[22m
- [1m[32msass/file1.sass[39m[22m [5:1 - 24:45] (20 lines, 102 tokens)
sass/file2.sass [24:1 - 48:33]
[1mClone found (scheme)[22m
- [1m[32mscheme/file1.scm[39m[22m [1:1 - 33:23] (33 lines, 225 tokens)
scheme/file2.scm [1:1 - 33:23]
[1mClone found (bash)[22m
- [1m[32mshebang/build[39m[22m [1:1 - 32:2] (32 lines, 86 tokens)
shebang/deploy [1:1 - 32:2]
[1mClone found (bash)[22m
- [1m[32mshebang/build[39m[22m [1:1 - 32:2] (32 lines, 86 tokens)
shell/file1.sh [1:1 - 32:2]
[1mClone found (bash)[22m
- [1m[32mshebang/build[39m[22m [1:1 - 32:2] (32 lines, 86 tokens)
shell/file2.sh [1:1 - 32:2]
[1mClone found (python)[22m
- [1m[32mshebang/process[39m[22m [1:1 - 32:4] (32 lines, 159 tokens)
shebang/transform [1:1 - 32:4]
[1mClone found (smalltalk)[22m
- [1m[32msmalltalk/file1.st[39m[22m [1:1 - 45:2] (45 lines, 146 tokens)
smalltalk/file2.st [1:1 - 45:2]
[1mClone found (smarty)[22m
- [1m[32msmarty/file1.tpl[39m[22m [1:1 - 43:18] (43 lines, 286 tokens)
smarty/file2.tpl [1:1 - 43:18]
[1mClone found (solidity)[22m
- [1m[32msolidity/file1.sol[39m[22m [25:61 - 55:13] (31 lines, 168 tokens)
solidity/file2.sol [29:54 - 59:13]
[1mClone found (soy)[22m
- [1m[32msoy/file1.soy[39m[22m [1:1 - 49:27] (49 lines, 346 tokens)
soy/file2.soy [1:1 - 49:27]
[1mClone found (sparql)[22m
- [1m[32msparql/file1.rq[39m[22m [1:1 - 11:9] (11 lines, 65 tokens)
sparql/file2.rq [1:1 - 11:9]
[1mClone found (sql)[22m
- [1m[32msql/file1.sql[39m[22m [3:1 - 41:46] (39 lines, 214 tokens)
sql/file2.sql [3:1 - 41:46]
[1mClone found (stylus)[22m
- [1m[32mstylus/file1.styl[39m[22m [1:1 - 53:20] (53 lines, 201 tokens)
stylus/file2.styl [1:1 - 53:20]
[1mClone found (css)[22m
- [1m[32msvelte/component1.svelte:css[39m[22m [112:3 - 230:4] (119 lines, 507 tokens)
svelte/component2.svelte:css [112:3 - 230:4]
[1mClone found (html)[22m
- [1m[32msvelte/component1.svelte:html[39m[22m [1:1 - 231:9] (231 lines, 350 tokens)
svelte/component2.svelte:html [1:1 - 231:9]
[1mClone found (javascript)[22m
- [1m[32msvelte/component1.svelte:javascript[39m[22m [2:3 - 61:6] (60 lines, 286 tokens)
svelte/component2.svelte:javascript [2:3 - 61:6]
[1mClone found (swift)[22m
- [1m[32mswift/file1.swift[39m[22m [9:1 - 29:6] (21 lines, 73 tokens)
swift/file2.swift [2:1 - 22:6]
[1mClone found (tap)[22m
- [1m[32mtap/file1.tap[39m[22m [1:1 - 35:8] (35 lines, 202 tokens)
tap/file2.tap [1:1 - 35:8]
[1mClone found (tcl)[22m
- [1m[32mtcl/file1.tcl[39m[22m [1:1 - 45:2] (45 lines, 263 tokens)
tcl/file2.tcl [1:1 - 45:2]
[1mClone found (textile)[22m
- [1m[32mtextile/file1.textile[39m[22m [1:1 - 51:4] (51 lines, 236 tokens)
textile/file2.textile [1:1 - 51:4]
[1mClone found (toml)[22m
- [1m[32mtoml/file1.toml[39m[22m [1:1 - 39:19] (39 lines, 100 tokens)
toml/file2.toml [1:1 - 39:19]
[1mClone found (tt2)[22m
- [1m[32mtt2/file1.tt2[39m[22m [1:1 - 38:14] (38 lines, 299 tokens)
tt2/file2.tt2 [1:1 - 38:14]
[1mClone found (tt2)[22m
- [1m[32mtt2/file1.tt2[39m[22m [42:21 - 52:25] (11 lines, 54 tokens)
tt2/file2.tt2 [42:86 - 52:25]
[1mClone found (turtle)[22m
- [1m[32mturtle/file1.ttl[39m[22m [1:1 - 36:17] (36 lines, 212 tokens)
turtle/file2.ttl [1:1 - 36:17]
[1mClone found (twig)[22m
- [1m[32mtwig/file_1.twig[39m[22m [1:1 - 23:3] (23 lines, 167 tokens)
twig/file_2.twig [1:1 - 23:3]
[1mClone found (twig)[22m
- [1m[32mtwig/file_1.twig[39m[22m [13:20 - 25:9] (13 lines, 65 tokens)
twig/file_1.twig [16:8 - 28:9]
[1mClone found (twig)[22m
- [1m[32mtwig/file_1.twig[39m[22m [19:8 - 29:15] (11 lines, 54 tokens)
twig/file_2.twig [22:8 - 32:15]
[1mClone found (unrealscript)[22m
- [1m[32munrealscript/file1.uc[39m[22m [1:1 - 56:6] (56 lines, 161 tokens)
unrealscript/file2.uc [1:1 - 56:6]
[1mClone found (vbnet)[22m
- [1m[32mvb/file1.vb[39m[22m [1:1 - 29:17] (29 lines, 163 tokens)
vb/file2.vb [1:1 - 29:17]
[1mClone found (velocity)[22m
- [1m[32mvelocity/file1.vtl[39m[22m [1:1 - 41:25] (41 lines, 264 tokens)
velocity/file2.vtl [1:1 - 41:25]
[1mClone found (verilog)[22m
- [1m[32mverilog/file1.v[39m[22m [1:1 - 40:10] (40 lines, 163 tokens)
verilog/file2.v [1:1 - 40:10]
[1mClone found (vhdl)[22m
- [1m[32mvhdl/file1.vhd[39m[22m [1:1 - 32:18] (32 lines, 179 tokens)
vhdl/file2.vhd [1:1 - 32:18]
[1mClone found (typescript)[22m
- [1m[32mvue/app1.vue:typescript[39m[22m [5:1 - 33:4] (29 lines, 128 tokens)
vue/app2.vue:typescript [5:1 - 33:4]
[1mClone found (javascript)[22m
- [1m[32mvue/file.js[39m[22m [1:1 - 28:2] (28 lines, 210 tokens)
vue/file1.vue:javascript [125:3 - 152:4]
[1mClone found (html)[22m
- [1m[32mvue/file1.vue:html[39m[22m [1:1 - 10:9] (10 lines, 99 tokens)
vue/file2.vue:html [1:1 - 10:9]
[1mClone found (javascript)[22m
- [1m[32mvue/file1.vue:javascript[39m[22m [120:3 - 261:4] (142 lines, 817 tokens)
vue/file2.vue:javascript [99:3 - 240:4]
[1mClone found (scss)[22m
- [1m[32mvue/file1.vue:scss[39m[22m [13:3 - 75:6] (63 lines, 402 tokens)
vue/file2.vue:scss [13:3 - 75:6]
[1mClone found (scss)[22m
- [1m[32mvue/file1.vue:scss[39m[22m [95:5 - 117:4] (23 lines, 149 tokens)
vue/file2.vue:scss [74:5 - 96:4]
[1mClone found (wgsl)[22m
- [1m[32mwgsl/file1.wgsl[39m[22m [1:1 - 45:3] (45 lines, 274 tokens)
wgsl/file2.wgsl [1:1 - 45:3]
[1mClone found (wgsl)[22m
- [1m[32mwgsl/file1.wgsl[39m[22m [51:42 - 59:6] (9 lines, 66 tokens)
wgsl/file2.wgsl [55:47 - 63:6]
[1mClone found (markup)[22m
- [1m[32mxml/file1.svg[39m[22m [1:1 - 88:2] (88 lines, 392 tokens)
xml/file2.svg [1:1 - 87:6]
[1mClone found (markup)[22m
- [1m[32mxml/file1.xsl[39m[22m [1:1 - 43:6] (43 lines, 316 tokens)
xml/file2.xsl [1:1 - 43:2]
[1mClone found (markup)[22m
- [1m[32mxml/file1.xsl[39m[22m [20:15 - 35:6] (16 lines, 133 tokens)
xml/file1.xsl [32:137 - 47:2]
[1mClone found (xquery)[22m
- [1m[32mxquery/file1.xquery[39m[22m [1:1 - 31:22] (31 lines, 222 tokens)
xquery/file2.xquery [1:1 - 31:22]
[1mClone found (yaml)[22m
- [1m[32myaml/file1.yml[39m[22m [1:1 - 18:23] (18 lines, 132 tokens)
yaml/file2.yml [1:1 - 18:23]
[1mClone found (c)[22m
- [1m[32mz80/file1.z80[39m[22m [1:1 - 14:25] (14 lines, 60 tokens)
z80/file2.z80 [1:1 - 14:25]
[1mClone found (zig)[22m
- [1m[32mzig/file1.zig[39m[22m [1:1 - 43:10] (43 lines, 259 tokens)
zig/file2.zig [1:1 - 43:10]
[1mClone found (zig)[22m
- [1m[32mzig/file1.zig[39m[22m [42:45 - 52:23] (11 lines, 52 tokens)
zig/file2.zig [47:45 - 57:23]
[90m┌────────────────┬────────────────┬─────────────┬──────────────┬──────────────┬──────────────────┬───────────────────┐[39m
[90m│[39m[31m Format [39m[90m│[39m[31m Files analyzed [39m[90m│[39m[31m Total lines [39m[90m│[39m[31m Total tokens [39m[90m│[39m[31m Clones found [39m[90m│[39m[31m Duplicated lines [39m[90m│[39m[31m Duplicated tokens [39m[90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m actionscript [90m│[39m 2 [90m│[39m 75 [90m│[39m 302 [90m│[39m 1 [90m│[39m 29 (38.67%) [90m│[39m 127 (42.05%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m ada [90m│[39m 2 [90m│[39m 74 [90m│[39m 408 [90m│[39m 1 [90m│[39m 20 (27.03%) [90m│[39m 103 (25.25%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m antlr4 [90m│[39m 2 [90m│[39m 48 [90m│[39m 216 [90m│[39m 1 [90m│[39m 20 (41.67%) [90m│[39m 82 (37.96%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m apex [90m│[39m 2 [90m│[39m 84 [90m│[39m 451 [90m│[39m 1 [90m│[39m 23 (27.38%) [90m│[39m 115 (25.50%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m apl [90m│[39m 2 [90m│[39m 47 [90m│[39m 554 [90m│[39m 1 [90m│[39m 19 (40.43%) [90m│[39m 252 (45.49%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m aspnet [90m│[39m 2 [90m│[39m 101 [90m│[39m 854 [90m│[39m 3 [90m│[39m 37 (36.63%) [90m│[39m 296 (34.66%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m astro [90m│[39m 2 [90m│[39m 324 [90m│[39m 950 [90m│[39m 0 [90m│[39m 0 (0.00%) [90m│[39m 0 (0.00%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m awk [90m│[39m 2 [90m│[39m 62 [90m│[39m 205 [90m│[39m 1 [90m│[39m 22 (35.48%) [90m│[39m 75 (36.59%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m bash [90m│[39m 4 [90m│[39m 158 [90m│[39m 418 [90m│[39m 3 [90m│[39m 93 (58.86%) [90m│[39m 258 (61.72%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m basic [90m│[39m 2 [90m│[39m 47 [90m│[39m 331 [90m│[39m 1 [90m│[39m 17 (36.17%) [90m│[39m 100 (30.21%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m bicep [90m│[39m 2 [90m│[39m 81 [90m│[39m 251 [90m│[39m 1 [90m│[39m 26 (32.10%) [90m│[39m 78 (31.08%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m brainfuck [90m│[39m 4 [90m│[39m 159 [90m│[39m 1728 [90m│[39m 4 [90m│[39m 113 (71.07%) [90m│[39m 1289 (74.59%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m c [90m│[39m 5 [90m│[39m 105 [90m│[39m 1060 [90m│[39m 3 [90m│[39m 40 (38.10%) [90m│[39m 399 (37.64%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m c-header [90m│[39m 4 [90m│[39m 149 [90m│[39m 2091 [90m│[39m 3 [90m│[39m 59 (39.60%) [90m│[39m 724 (34.62%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m cfml [90m│[39m 2 [90m│[39m 107 [90m│[39m 671 [90m│[39m 1 [90m│[39m 17 (15.89%) [90m│[39m 85 (12.67%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m cfscript [90m│[39m 2 [90m│[39m 69 [90m│[39m 437 [90m│[39m 1 [90m│[39m 27 (39.13%) [90m│[39m 161 (36.84%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m clojure [90m│[39m 2 [90m│[39m 46 [90m│[39m 374 [90m│[39m 1 [90m│[39m 18 (39.13%) [90m│[39m 139 (37.17%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m cmake [90m│[39m 2 [90m│[39m 52 [90m│[39m 311 [90m│[39m 1 [90m│[39m 20 (38.46%) [90m│[39m 128 (41.16%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m coffeescript [90m│[39m 2 [90m│[39m 92 [90m│[39m 447 [90m│[39m 2 [90m│[39m 40 (43.48%) [90m│[39m 219 (48.99%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m cpp [90m│[39m 2 [90m│[39m 176 [90m│[39m 1514 [90m│[39m 2 [90m│[39m 106 (60.23%) [90m│[39m 965 (63.74%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m cpp-header [90m│[39m 2 [90m│[39m 176 [90m│[39m 1514 [90m│[39m 2 [90m│[39m 106 (60.23%) [90m│[39m 965 (63.74%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m crystal [90m│[39m 2 [90m│[39m 70 [90m│[39m 222 [90m│[39m 1 [90m│[39m 28 (40.00%) [90m│[39m 97 (43.69%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m csharp [90m│[39m 2 [90m│[39m 360 [90m│[39m 1099 [90m│[39m 2 [90m│[39m 172 (47.78%) [90m│[39m 537 (48.86%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m css [90m│[39m 8 [90m│[39m 875 [90m│[39m 2536 [90m│[39m 5 [90m│[39m 290 (33.14%) [90m│[39m 1494 (58.91%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m csv [90m│[39m 2 [90m│[39m 22 [90m│[39m 400 [90m│[39m 1 [90m│[39m 8 (36.36%) [90m│[39m 163 (40.75%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m d [90m│[39m 2 [90m│[39m 338 [90m│[39m 2270 [90m│[39m 1 [90m│[39m 168 (49.70%) [90m│[39m 1135 (50.00%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m dart [90m│[39m 2 [90m│[39m 266 [90m│[39m 1178 [90m│[39m 2 [90m│[39m 118 (44.36%) [90m│[39m 522 (44.31%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m diff [90m│[39m 2 [90m│[39m 146 [90m│[39m 1082 [90m│[39m 1 [90m│[39m 61 (41.78%) [90m│[39m 435 (40.20%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m dot [90m│[39m 2 [90m│[39m 46 [90m│[39m 243 [90m│[39m 1 [90m│[39m 17 (36.96%) [90m│[39m 91 (37.45%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m eiffel [90m│[39m 2 [90m│[39m 126 [90m│[39m 380 [90m│[39m 1 [90m│[39m 45 (35.71%) [90m│[39m 130 (34.21%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m elm [90m│[39m 2 [90m│[39m 110 [90m│[39m 411 [90m│[39m 1 [90m│[39m 46 (41.82%) [90m│[39m 155 (37.71%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m erlang [90m│[39m 2 [90m│[39m 242 [90m│[39m 1674 [90m│[39m 1 [90m│[39m 120 (49.59%) [90m│[39m 837 (50.00%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m fortran [90m│[39m 2 [90m│[39m 93 [90m│[39m 469 [90m│[39m 1 [90m│[39m 36 (38.71%) [90m│[39m 182 (38.81%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m fsharp [90m│[39m 2 [90m│[39m 82 [90m│[39m 462 [90m│[39m 1 [90m│[39m 34 (41.46%) [90m│[39m 193 (41.77%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m gdscript [90m│[39m 2 [90m│[39m 96 [90m│[39m 458 [90m│[39m 1 [90m│[39m 24 (25.00%) [90m│[39m 135 (29.48%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m gettext [90m│[39m 2 [90m│[39m 220 [90m│[39m 356 [90m│[39m 1 [90m│[39m 51 (23.18%) [90m│[39m 82 (23.03%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m gherkin [90m│[39m 2 [90m│[39m 75 [90m│[39m 434 [90m│[39m 1 [90m│[39m 15 (20.00%) [90m│[39m 83 (19.12%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m go [90m│[39m 2 [90m│[39m 65 [90m│[39m 305 [90m│[39m 1 [90m│[39m 29 (44.62%) [90m│[39m 134 (43.93%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m graphql [90m│[39m 2 [90m│[39m 134 [90m│[39m 499 [90m│[39m 1 [90m│[39m 24 (17.91%) [90m│[39m 143 (28.66%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m groovy [90m│[39m 2 [90m│[39m 96 [90m│[39m 422 [90m│[39m 1 [90m│[39m 40 (41.67%) [90m│[39m 188 (44.55%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m haml [90m│[39m 2 [90m│[39m 52 [90m│[39m 276 [90m│[39m 1 [90m│[39m 22 (42.31%) [90m│[39m 118 (42.75%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m handlebars [90m│[39m 2 [90m│[39m 72 [90m│[39m 555 [90m│[39m 1 [90m│[39m 27 (37.50%) [90m│[39m 218 (39.28%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m haskell [90m│[39m 4 [90m│[39m 459 [90m│[39m 2536 [90m│[39m 3 [90m│[39m 216 (47.06%) [90m│[39m 1183 (46.65%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m haxe [90m│[39m 4 [90m│[39m 191 [90m│[39m 1035 [90m│[39m 3 [90m│[39m 113 (59.16%) [90m│[39m 634 (61.26%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m hcl [90m│[39m 2 [90m│[39m 119 [90m│[39m 313 [90m│[39m 1 [90m│[39m 36 (30.25%) [90m│[39m 85 (27.16%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m html [90m│[39m 6 [90m│[39m 1289 [90m│[39m 1390 [90m│[39m 4 [90m│[39m 406 (31.50%) [90m│[39m 762 (54.82%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m idris [90m│[39m 2 [90m│[39m 88 [90m│[39m 581 [90m│[39m 1 [90m│[39m 34 (38.64%) [90m│[39m 208 (35.80%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m ignore [90m│[39m 2 [90m│[39m 191 [90m│[39m 523 [90m│[39m 1 [90m│[39m 83 (43.46%) [90m│[39m 234 (44.74%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m ini [90m│[39m 2 [90m│[39m 58 [90m│[39m 172 [90m│[39m 1 [90m│[39m 26 (44.83%) [90m│[39m 79 (45.93%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m java [90m│[39m 2 [90m│[39m 454 [90m│[39m 15064 [90m│[39m 2 [90m│[39m 224 (49.34%) [90m│[39m 7387 (49.04%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m javascript [90m│[39m 23 [90m│[39m 1580 [90m│[39m 6985 [90m│[39m 13 [90m│[39m 572 (36.20%) [90m│[39m 3475 (49.75%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m json [90m│[39m 4 [90m│[39m 134 [90m│[39m 460 [90m│[39m 2 [90m│[39m 38 (28.36%) [90m│[39m 134 (29.13%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m json5 [90m│[39m 2 [90m│[39m 104 [90m│[39m 307 [90m│[39m 1 [90m│[39m 30 (28.85%) [90m│[39m 93 (30.29%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m jsx [90m│[39m 2 [90m│[39m 73 [90m│[39m 296 [90m│[39m 1 [90m│[39m 20 (27.40%) [90m│[39m 99 (33.45%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m julia [90m│[39m 2 [90m│[39m 76 [90m│[39m 557 [90m│[39m 1 [90m│[39m 29 (38.16%) [90m│[39m 194 (34.83%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m kotlin [90m│[39m 2 [90m│[39m 106 [90m│[39m 550 [90m│[39m 2 [90m│[39m 47 (44.34%) [90m│[39m 250 (45.45%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m latex [90m│[39m 2 [90m│[39m 88 [90m│[39m 557 [90m│[39m 1 [90m│[39m 25 (28.41%) [90m│[39m 149 (26.75%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m less [90m│[39m 2 [90m│[39m 56 [90m│[39m 518 [90m│[39m 2 [90m│[39m 29 (51.79%) [90m│[39m 282 (54.44%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m lilypond [90m│[39m 2 [90m│[39m 100 [90m│[39m 307 [90m│[39m 1 [90m│[39m 18 (18.00%) [90m│[39m 63 (20.52%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m linker-script [90m│[39m 2 [90m│[39m 133 [90m│[39m 683 [90m│[39m 1 [90m│[39m 46 (34.59%) [90m│[39m 256 (37.48%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m lisp [90m│[39m 2 [90m│[39m 106 [90m│[39m 608 [90m│[39m 1 [90m│[39m 49 (46.23%) [90m│[39m 289 (47.53%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m livescript [90m│[39m 2 [90m│[39m 68 [90m│[39m 344 [90m│[39m 1 [90m│[39m 30 (44.12%) [90m│[39m 145 (42.15%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m llvm [90m│[39m 2 [90m│[39m 132 [90m│[39m 850 [90m│[39m 1 [90m│[39m 34 (25.76%) [90m│[39m 215 (25.29%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m log [90m│[39m 2 [90m│[39m 30 [90m│[39m 666 [90m│[39m 1 [90m│[39m 12 (40.00%) [90m│[39m 262 (39.34%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m lua [90m│[39m 2 [90m│[39m 106 [90m│[39m 450 [90m│[39m 1 [90m│[39m 45 (42.45%) [90m│[39m 193 (42.89%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m markdown [90m│[39m 4 [90m│[39m 536 [90m│[39m 929 [90m│[39m 3 [90m│[39m 262 (48.88%) [90m│[39m 1407 (151.45%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m markup [90m│[39m 11 [90m│[39m 478 [90m│[39m 2795 [90m│[39m 6 [90m│[39m 205 (42.89%) [90m│[39m 1314 (47.01%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m nsis [90m│[39m 2 [90m│[39m 68 [90m│[39m 172 [90m│[39m 1 [90m│[39m 28 (41.18%) [90m│[39m 71 (41.28%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m objectivec [90m│[39m 2 [90m│[39m 152 [90m│[39m 1463 [90m│[39m 2 [90m│[39m 61 (40.13%) [90m│[39m 527 (36.02%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m ocaml [90m│[39m 6 [90m│[39m 186 [90m│[39m 1052 [90m│[39m 3 [90m│[39m 80 (43.01%) [90m│[39m 440 (41.83%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m openqasm [90m│[39m 2 [90m│[39m 87 [90m│[39m 346 [90m│[39m 1 [90m│[39m 18 (20.69%) [90m│[39m 92 (26.59%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m oz [90m│[39m 2 [90m│[39m 94 [90m│[39m 357 [90m│[39m 1 [90m│[39m 36 (38.30%) [90m│[39m 141 (39.50%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m pascal [90m│[39m 2 [90m│[39m 106 [90m│[39m 561 [90m│[39m 1 [90m│[39m 36 (33.96%) [90m│[39m 203 (36.19%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m perl [90m│[39m 4 [90m│[39m 609 [90m│[39m 2272 [90m│[39m 3 [90m│[39m 274 (44.99%) [90m│[39m 971 (42.74%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m php [90m│[39m 2 [90m│[39m 143 [90m│[39m 785 [90m│[39m 1 [90m│[39m 50 (34.97%) [90m│[39m 295 (37.58%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m plant-uml [90m│[39m 2 [90m│[39m 120 [90m│[39m 422 [90m│[39m 1 [90m│[39m 51 (42.50%) [90m│[39m 181 (42.89%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m plsql [90m│[39m 2 [90m│[39m 171 [90m│[39m 598 [90m│[39m 2 [90m│[39m 70 (40.94%) [90m│[39m 244 (40.80%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m powerquery [90m│[39m 2 [90m│[39m 112 [90m│[39m 538 [90m│[39m 1 [90m│[39m 40 (35.71%) [90m│[39m 210 (39.03%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m powershell [90m│[39m 2 [90m│[39m 98 [90m│[39m 404 [90m│[39m 1 [90m│[39m 40 (40.82%) [90m│[39m 168 (41.58%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m prolog [90m│[39m 2 [90m│[39m 64 [90m│[39m 429 [90m│[39m 1 [90m│[39m 27 (42.19%) [90m│[39m 176 (41.03%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m properties [90m│[39m 2 [90m│[39m 48 [90m│[39m 250 [90m│[39m 1 [90m│[39m 21 (43.75%) [90m│[39m 114 (45.60%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m protobuf [90m│[39m 2 [90m│[39m 205 [90m│[39m 680 [90m│[39m 1 [90m│[39m 39 (19.02%) [90m│[39m 115 (16.91%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m pug [90m│[39m 2 [90m│[39m 574 [90m│[39m 2512 [90m│[39m 2 [90m│[39m 285 (49.65%) [90m│[39m 1249 (49.72%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m puppet [90m│[39m 2 [90m│[39m 122 [90m│[39m 446 [90m│[39m 2 [90m│[39m 58 (47.54%) [90m│[39m 214 (47.98%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m purescript [90m│[39m 2 [90m│[39m 115 [90m│[39m 797 [90m│[39m 2 [90m│[39m 49 (42.61%) [90m│[39m 315 (39.52%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m python [90m│[39m 6 [90m│[39m 323 [90m│[39m 911 [90m│[39m 3 [90m│[39m 73 (22.60%) [90m│[39m 363 (39.85%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m q [90m│[39m 2 [90m│[39m 78 [90m│[39m 997 [90m│[39m 1 [90m│[39m 29 (37.18%) [90m│[39m 378 (37.91%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m qsharp [90m│[39m 2 [90m│[39m 102 [90m│[39m 408 [90m│[39m 1 [90m│[39m 9 (8.82%) [90m│[39m 50 (12.25%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m r [90m│[39m 2 [90m│[39m 128 [90m│[39m 854 [90m│[39m 1 [90m│[39m 63 (49.22%) [90m│[39m 427 (50.00%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m racket [90m│[39m 2 [90m│[39m 100 [90m│[39m 760 [90m│[39m 1 [90m│[39m 37 (37.00%) [90m│[39m 286 (37.63%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m rescript [90m│[39m 2 [90m│[39m 115 [90m│[39m 776 [90m│[39m 1 [90m│[39m 37 (32.17%) [90m│[39m 200 (25.77%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m robotframework [90m│[39m 2 [90m│[39m 130 [90m│[39m 630 [90m│[39m 2 [90m│[39m 43 (33.08%) [90m│[39m 223 (35.40%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m ruby [90m│[39m 2 [90m│[39m 80 [90m│[39m 192 [90m│[39m 1 [90m│[39m 39 (48.75%) [90m│[39m 96 (50.00%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m rust [90m│[39m 2 [90m│[39m 717 [90m│[39m 5128 [90m│[39m 6 [90m│[39m 342 (47.70%) [90m│[39m 2445 (47.68%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m sas [90m│[39m 2 [90m│[39m 152 [90m│[39m 1174 [90m│[39m 1 [90m│[39m 58 (38.16%) [90m│[39m 444 (37.82%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m sass [90m│[39m 2 [90m│[39m 93 [90m│[39m 383 [90m│[39m 3 [90m│[39m 51 (54.84%) [90m│[39m 273 (71.28%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m scala [90m│[39m 2 [90m│[39m 58 [90m│[39m 1696 [90m│[39m 1 [90m│[39m 28 (48.28%) [90m│[39m 848 (50.00%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m scheme [90m│[39m 2 [90m│[39m 70 [90m│[39m 498 [90m│[39m 1 [90m│[39m 32 (45.71%) [90m│[39m 225 (45.18%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m scss [90m│[39m 4 [90m│[39m 360 [90m│[39m 2065 [90m│[39m 3 [90m│[39m 136 (37.78%) [90m│[39m 875 (42.37%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m smalltalk [90m│[39m 2 [90m│[39m 102 [90m│[39m 351 [90m│[39m 1 [90m│[39m 44 (43.14%) [90m│[39m 146 (41.60%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m smarty [90m│[39m 2 [90m│[39m 92 [90m│[39m 652 [90m│[39m 1 [90m│[39m 42 (45.65%) [90m│[39m 286 (43.87%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m solidity [90m│[39m 2 [90m│[39m 155 [90m│[39m 939 [90m│[39m 1 [90m│[39m 30 (19.35%) [90m│[39m 168 (17.89%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m soy [90m│[39m 2 [90m│[39m 106 [90m│[39m 841 [90m│[39m 1 [90m│[39m 48 (45.28%) [90m│[39m 346 (41.14%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m sparql [90m│[39m 2 [90m│[39m 54 [90m│[39m 296 [90m│[39m 1 [90m│[39m 10 (18.52%) [90m│[39m 65 (21.96%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m sql [90m│[39m 2 [90m│[39m 102 [90m│[39m 525 [90m│[39m 1 [90m│[39m 38 (37.25%) [90m│[39m 214 (40.76%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m stylus [90m│[39m 2 [90m│[39m 129 [90m│[39m 494 [90m│[39m 1 [90m│[39m 52 (40.31%) [90m│[39m 201 (40.69%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m svelte [90m│[39m 2 [90m│[39m 462 [90m│[39m 1586 [90m│[39m 0 [90m│[39m 0 (0.00%) [90m│[39m 0 (0.00%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m swift [90m│[39m 2 [90m│[39m 58 [90m│[39m 175 [90m│[39m 1 [90m│[39m 20 (34.48%) [90m│[39m 73 (41.71%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m tap [90m│[39m 2 [90m│[39m 98 [90m│[39m 562 [90m│[39m 1 [90m│[39m 34 (34.69%) [90m│[39m 202 (35.94%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m tcl [90m│[39m 2 [90m│[39m 106 [90m│[39m 600 [90m│[39m 1 [90m│[39m 44 (41.51%) [90m│[39m 263 (43.83%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m text [90m│[39m 2 [90m│[39m 354 [90m│[39m 143 [90m│[39m 1 [90m│[39m 10 (2.82%) [90m│[39m 69 (48.25%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m textile [90m│[39m 2 [90m│[39m 106 [90m│[39m 495 [90m│[39m 1 [90m│[39m 50 (47.17%) [90m│[39m 236 (47.68%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m toml [90m│[39m 2 [90m│[39m 91 [90m│[39m 229 [90m│[39m 1 [90m│[39m 38 (41.76%) [90m│[39m 100 (43.67%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m tsx [90m│[39m 2 [90m│[39m 76 [90m│[39m 310 [90m│[39m 1 [90m│[39m 34 (44.74%) [90m│[39m 143 (46.13%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m tt2 [90m│[39m 2 [90m│[39m 104 [90m│[39m 803 [90m│[39m 2 [90m│[39m 47 (45.19%) [90m│[39m 353 (43.96%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m turtle [90m│[39m 2 [90m│[39m 90 [90m│[39m 520 [90m│[39m 1 [90m│[39m 35 (38.89%) [90m│[39m 212 (40.77%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m twig [90m│[39m 2 [90m│[39m 61 [90m│[39m 424 [90m│[39m 3 [90m│[39m 44 (72.13%) [90m│[39m 286 (67.45%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m txt [90m│[39m 4 [90m│[39m 146 [90m│[39m 870 [90m│[39m 2 [90m│[39m 71 (48.63%) [90m│[39m 435 (50.00%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m typescript [90m│[39m 12 [90m│[39m 2159 [90m│[39m 9379 [90m│[39m 8 [90m│[39m 958 (44.37%) [90m│[39m 4688 (49.98%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m unrealscript [90m│[39m 2 [90m│[39m 166 [90m│[39m 520 [90m│[39m 1 [90m│[39m 55 (33.13%) [90m│[39m 161 (30.96%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m vbnet [90m│[39m 2 [90m│[39m 72 [90m│[39m 378 [90m│[39m 1 [90m│[39m 28 (38.89%) [90m│[39m 163 (43.12%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m velocity [90m│[39m 2 [90m│[39m 88 [90m│[39m 576 [90m│[39m 1 [90m│[39m 40 (45.45%) [90m│[39m 264 (45.83%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m verilog [90m│[39m 2 [90m│[39m 104 [90m│[39m 430 [90m│[39m 1 [90m│[39m 39 (37.50%) [90m│[39m 163 (37.91%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m vhdl [90m│[39m 2 [90m│[39m 98 [90m│[39m 546 [90m│[39m 1 [90m│[39m 31 (31.63%) [90m│[39m 179 (32.78%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m vue [90m│[39m 4 [90m│[39m 587 [90m│[39m 3333 [90m│[39m 0 [90m│[39m 0 (0.00%) [90m│[39m 0 (0.00%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m wgsl [90m│[39m 2 [90m│[39m 127 [90m│[39m 928 [90m│[39m 2 [90m│[39m 52 (40.94%) [90m│[39m 340 (36.64%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m wolfram [90m│[39m 2 [90m│[39m 85 [90m│[39m 697 [90m│[39m 1 [90m│[39m 16 (18.82%) [90m│[39m 127 (18.22%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m xquery [90m│[39m 2 [90m│[39m 80 [90m│[39m 640 [90m│[39m 1 [90m│[39m 30 (37.50%) [90m│[39m 222 (34.69%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m yaml [90m│[39m 6 [90m│[39m 262 [90m│[39m 554 [90m│[39m 2 [90m│[39m 45 (17.18%) [90m│[39m 192 (34.66%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m zig [90m│[39m 2 [90m│[39m 130 [90m│[39m 827 [90m│[39m 2 [90m│[39m 52 (40.00%) [90m│[39m 311 (37.61%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m [1mTotal:[22m [90m│[39m 347 [90m│[39m 24603 [90m│[39m 130473 [90m│[39m 212 [90m│[39m 9133 (37.12%) [90m│[39m 56491 (43.30%) [90m│[39m
[90m└────────────────┴────────────────┴─────────────┴──────────────┴──────────────┴──────────────────┴───────────────────┘[39m
[90mFound 212 clones.[39m
[90mtime: 22.771ms[39m
[90m💡 Auto-refactor with AI: [1m[39mnpx skills add https://github.com/kucherenko/jscpd --skill dry-refactoring[90m[22m
[90m🎩 New: Gangsta Agents — discipline your AI coding → gangsta.page[39m
[90m💖 Support jscpd project → https://opencollective.com/jscpd[39m command comes from the separate [1mClone found (actionscript)[22m
- [1m[32mactionscript/file1.as[39m[22m [1:1 - 30:10] (30 lines, 127 tokens)
actionscript/file2.as [1:1 - 30:10]
[1mClone found (ada)[22m
- [1m[32mada/file1.ada[39m[22m [1:1 - 21:12] (21 lines, 103 tokens)
ada/file2.ada [1:1 - 21:12]
[1mClone found (antlr4)[22m
- [1m[32mantlr4/file1.g4[39m[22m [1:1 - 21:27] (21 lines, 82 tokens)
antlr4/file2.g4 [1:1 - 21:27]
[1mClone found (apex)[22m
- [1m[32mapex/file1.cls[39m[22m [1:29 - 24:18] (24 lines, 115 tokens)
apex/file2.cls [1:29 - 24:18]
[1mClone found (apl)[22m
- [1m[32mapl/file1.apl[39m[22m [1:1 - 20:54] (20 lines, 252 tokens)
apl/file2.apl [1:1 - 20:54]
[1mClone found (css)[22m
- [1m[32mastro/component1.astro:css[39m[22m [76:3 - 161:4] (86 lines, 364 tokens)
astro/component2.astro:css [76:3 - 161:4]
[1mClone found (css)[22m
- [1m[32mastro/component1.astro:css[39m[22m [79:23 - 124:12] (46 lines, 194 tokens)
svelte/component1.svelte:css [116:28 - 161:12]
[1mClone found (html)[22m
- [1m[32mastro/component1.astro:html[39m[22m [1:1 - 162:9] (162 lines, 246 tokens)
astro/component2.astro:html [1:1 - 162:9]
[1mClone found (html)[22m
- [1m[32mastro/component1.astro:html[39m[22m [27:1 - 33:8] (7 lines, 67 tokens)
svelte/component1.svelte:html [64:1 - 70:8]
[1mClone found (javascript)[22m
- [1m[32mastro/component1.astro:javascript[39m[22m [58:3 - 72:4] (15 lines, 111 tokens)
astro/component2.astro:javascript [58:3 - 72:4]
[1mClone found (typescript)[22m
- [1m[32mastro/component1.astro:typescript[39m[22m [2:1 - 24:4] (23 lines, 153 tokens)
astro/component2.astro:typescript [2:1 - 24:4]
[1mClone found (awk)[22m
- [1m[32mawk/file1.awk[39m[22m [1:1 - 23:33] (23 lines, 75 tokens)
awk/file2.awk [1:1 - 23:33]
[1mClone found (basic)[22m
- [1m[32mbasic/file1.bas[39m[22m [1:1 - 18:4] (18 lines, 100 tokens)
basic/file2.bas [1:1 - 18:4]
[1mClone found (bicep)[22m
- [1m[32mbicep/file1.bicep[39m[22m [1:1 - 27:9] (27 lines, 78 tokens)
bicep/file2.bicep [1:1 - 27:9]
[1mClone found (brainfuck)[22m
- [1m[32mbrainfuck/file1.b[39m[22m [1:1 - 26:77] (26 lines, 268 tokens)
brainfuck/file1.bf [1:1 - 26:77]
[1mClone found (brainfuck)[22m
- [1m[32mbrainfuck/file1.b[39m[22m [1:1 - 41:59] (41 lines, 439 tokens)
brainfuck/file2.b [1:1 - 41:59]
[1mClone found (brainfuck)[22m
- [1m[32mbrainfuck/file1.b[39m[22m [1:1 - 41:59] (41 lines, 439 tokens)
brainfuck/file2.bf [1:1 - 41:59]
[1mClone found (brainfuck)[22m
- [1m[32mbrainfuck/file1.b[39m[22m [33:1 - 41:59] (9 lines, 143 tokens)
brainfuck/file1.bf [28:1 - 36:59]
[1mClone found (cfml)[22m
- [1m[32mcfml/file1.cfm[39m[22m [4:20 - 21:2] (18 lines, 85 tokens)
cfml/file2.cfm [4:18 - 21:2]
[1mClone found (cfscript)[22m
- [1m[32mcfscript/file1.cfc[39m[22m [1:1 - 28:11] (28 lines, 161 tokens)
cfscript/file2.cfc [1:1 - 28:11]
[1mClone found (c)[22m
- [1m[32mclike/file1.c[39m[22m [1:1 - 17:4] (17 lines, 258 tokens)
clike/file2.c [1:1 - 17:4]
[1mClone found (c)[22m
- [1m[32mclike/file1.c[39m[22m [8:3 - 19:2] (12 lines, 81 tokens)
clike/file2.c [18:3 - 29:2]
[1mClone found (cpp)[22m
- [1m[32mclike/file1.cpp[39m[22m [1:1 - 88:7] (88 lines, 757 tokens)
clike/file2.cpp [1:1 - 88:7]
[1mClone found (cpp)[22m
- [1m[32mclike/file1.cpp[39m[22m [24:5 - 43:51] (20 lines, 208 tokens)
clike/file1.cpp [45:5 - 64:51]
[1mClone found (csharp)[22m
- [1m[32mclike/file1.cs[39m[22m [1:1 - 91:19] (91 lines, 235 tokens)
clike/file2.cs [1:1 - 91:19]
[1mClone found (csharp)[22m
- [1m[32mclike/file1.cs[39m[22m [103:9 - 185:2] (83 lines, 302 tokens)
clike/file2.cs [93:9 - 175:2]
[1mClone found (c-header)[22m
- [1m[32mclike/file1.h[39m[22m [1:1 - 17:4] (17 lines, 258 tokens)
clike/file2.h [1:1 - 17:4]
[1mClone found (c-header)[22m
- [1m[32mclike/file1.h[39m[22m [8:3 - 19:2] (12 lines, 81 tokens)
clike/file2.h [18:3 - 29:2]
[1mClone found (cpp-header)[22m
- [1m[32mclike/file1.hpp[39m[22m [1:1 - 88:7] (88 lines, 757 tokens)
clike/file2.hpp [1:1 - 88:7]
[1mClone found (cpp-header)[22m
- [1m[32mclike/file1.hpp[39m[22m [24:5 - 43:51] (20 lines, 208 tokens)
clike/file1.hpp [45:5 - 64:51]
[1mClone found (java)[22m
- [1m[32mclike/file1.java[39m[22m [1:1 - 186:6] (186 lines, 6601 tokens)
clike/file2.java [1:1 - 186:6]
[1mClone found (java)[22m
- [1m[32mclike/file1.java[39m[22m [182:51 - 221:2] (40 lines, 786 tokens)
clike/file2.java [194:52 - 233:2]
[1mClone found (kotlin)[22m
- [1m[32mclike/file1.kt[39m[22m [1:1 - 33:6] (33 lines, 186 tokens)
clike/file2.kt [1:1 - 33:6]
[1mClone found (kotlin)[22m
- [1m[32mclike/file1.kt[39m[22m [38:5 - 53:2] (16 lines, 64 tokens)
clike/file2.kt [38:5 - 53:2]
[1mClone found (scala)[22m
- [1m[32mclike/file1.scala[39m[22m [1:1 - 29:2] (29 lines, 848 tokens)
clike/file2.scala [1:1 - 29:2]
[1mClone found (clojure)[22m
- [1m[32mclojure/file1.clj[39m[22m [2:3 - 20:23] (19 lines, 139 tokens)
clojure/file2.clj [2:3 - 20:23]
[1mClone found (cmake)[22m
- [1m[32mcmake/file1.cmake[39m[22m [1:1 - 21:14] (21 lines, 128 tokens)
cmake/file2.cmake [1:1 - 21:14]
[1mClone found (coffeescript)[22m
- [1m[32mcoffeescript/file1.coffee[39m[22m [1:1 - 13:22] (13 lines, 75 tokens)
coffeescript/file2.coffee [3:1 - 15:22]
[1mClone found (coffeescript)[22m
- [1m[32mcoffeescript/file1.coffee[39m[22m [16:1 - 44:21] (29 lines, 144 tokens)
coffeescript/file1.coffee [46:1 - 74:21]
[1mClone found (lisp)[22m
- [1m[32mcommonlisp/file1.el[39m[22m [1:1 - 50:23] (50 lines, 289 tokens)
commonlisp/file2.el [1:1 - 50:23]
[1mClone found (crystal)[22m
- [1m[32mcrystal/file1.cr[39m[22m [1:1 - 29:4] (29 lines, 97 tokens)
crystal/file2.cr [1:1 - 29:4]
[1mClone found (css)[22m
- [1m[32mcss/file1.css[39m[22m [1:1 - 25:2] (25 lines, 237 tokens)
css/file10.css [1:1 - 25:2]
[1mClone found (css)[22m
- [1m[32mcss/file1.css[39m[22m [1:1 - 19:36] (19 lines, 192 tokens)
css/file2.css [1:1 - 19:36]
[1mClone found (less)[22m
- [1m[32mcss/file1.less[39m[22m [1:1 - 19:36] (19 lines, 192 tokens)
css/file2.less [1:1 - 19:36]
[1mClone found (less)[22m
- [1m[32mcss/file1.less[39m[22m [14:35 - 25:2] (12 lines, 90 tokens)
css/file1.less [24:5 - 36:2]
[1mClone found (scss)[22m
- [1m[32mcss/file1.scss[39m[22m [1:1 - 53:2] (53 lines, 324 tokens)
css/file2.scss [1:1 - 53:2]
[1mClone found (csv)[22m
- [1m[32mcsv/file1.csv[39m[22m [1:1 - 9:56] (9 lines, 163 tokens)
csv/file2.csv [1:1 - 9:56]
[1mClone found (d)[22m
- [1m[32md/file1.d[39m[22m [1:1 - 169:6] (169 lines, 1135 tokens)
d/file2.d [1:1 - 169:6]
[1mClone found (dart)[22m
- [1m[32mdart/file1.dart[39m[22m [1:1 - 89:4] (89 lines, 403 tokens)
dart/file2.dart [1:1 - 89:4]
[1mClone found (dart)[22m
- [1m[32mdart/file1.dart[39m[22m [118:15 - 148:2] (31 lines, 119 tokens)
dart/file2.dart [88:6 - 118:2]
[1mClone found (diff)[22m
- [1m[32mdiff/file1.diff[39m[22m [1:1 - 62:7] (62 lines, 435 tokens)
diff/file2.diff [1:1 - 62:7]
[1mClone found (dot)[22m
- [1m[32mdot/file1.dot[39m[22m [1:1 - 18:21] (18 lines, 91 tokens)
dot/file2.dot [1:1 - 18:21]
[1mClone found (eiffel)[22m
- [1m[32meiffel/file1.e[39m[22m [1:1 - 46:11] (46 lines, 130 tokens)
eiffel/file2.e [1:1 - 46:11]
[1mClone found (elm)[22m
- [1m[32melm/file1.elm[39m[22m [1:1 - 47:23] (47 lines, 155 tokens)
elm/file2.elm [1:1 - 47:23]
[1mClone found (erlang)[22m
- [1m[32merlang/file1.erl[39m[22m [1:1 - 121:7] (121 lines, 837 tokens)
erlang/file2.erl [1:1 - 121:7]
[1mClone found (javascript)[22m
- [1m[32mfolder1/file_1.js[39m[22m [4:1 - 55:3] (52 lines, 339 tokens)
javascript/file_1.cjs [4:1 - 55:3]
[1mClone found (javascript)[22m
- [1m[32mfolder1/file_1.js[39m[22m [4:1 - 55:3] (52 lines, 339 tokens)
javascript/file_1.js [4:1 - 55:3]
[1mClone found (javascript)[22m
- [1m[32mfolder1/file_1.js[39m[22m [4:1 - 55:3] (52 lines, 339 tokens)
javascript/file_1.mjs [4:1 - 55:3]
[1mClone found (javascript)[22m
- [1m[32mfolder1/file_1.js[39m[22m [4:1 - 55:3] (52 lines, 339 tokens)
javascript/file_3.js [1:1 - 52:3]
[1mClone found (javascript)[22m
- [1m[32mfolder1/file_1.js[39m[22m [28:1 - 55:3] (28 lines, 169 tokens)
folder2/file_2.js [1:1 - 28:3]
[1mClone found (javascript)[22m
- [1m[32mfolder1/file_1.js[39m[22m [28:1 - 55:3] (28 lines, 169 tokens)
folder2/file_2.js [29:1 - 56:3]
[1mClone found (fortran)[22m
- [1m[32mfortran/file1.f[39m[22m [1:7 - 37:21] (37 lines, 182 tokens)
fortran/file2.f [1:7 - 37:21]
[1mClone found (gdscript)[22m
- [1m[32mgdscript/file1.gd[39m[22m [22:1 - 46:18] (25 lines, 135 tokens)
gdscript/file2.gd [22:1 - 46:18]
[1mClone found (gettext)[22m
- [1m[32mgettext/file1.po[39m[22m [13:1 - 64:7] (52 lines, 82 tokens)
gettext/file2.po [13:1 - 64:7]
[1mClone found (gherkin)[22m
- [1m[32mgherkin/file1.feature[39m[22m [1:1 - 16:26] (16 lines, 83 tokens)
gherkin/file2.feature [1:1 - 16:26]
[1mClone found (ignore)[22m
- [1m[32mgitignore/file1.gitignore[39m[22m [1:1 - 84:16] (84 lines, 234 tokens)
gitignore/file2.gitignore [1:1 - 84:16]
[1mClone found (go)[22m
- [1m[32mgo/file1.go[39m[22m [1:1 - 30:5] (30 lines, 134 tokens)
go/file2.go [1:1 - 31:5]
[1mClone found (graphql)[22m
- [1m[32mgraphql/file1.graphql[39m[22m [1:1 - 25:5] (25 lines, 143 tokens)
graphql/file2.graphql [1:1 - 25:5]
[1mClone found (groovy)[22m
- [1m[32mgroovy/file1.groovy[39m[22m [1:1 - 41:6] (41 lines, 188 tokens)
groovy/file2.groovy [1:1 - 41:6]
[1mClone found (haml)[22m
- [1m[32mhaml/file1.haml[39m[22m [1:1 - 23:18] (23 lines, 118 tokens)
haml/file2.haml [1:1 - 23:18]
[1mClone found (handlebars)[22m
- [1m[32mhandlebars/file1.hbs[39m[22m [1:1 - 28:27] (28 lines, 218 tokens)
handlebars/file2.hbs [1:1 - 28:27]
[1mClone found (haskell)[22m
- [1m[32mhaskell-literate/file1.lhs[39m[22m [1:1 - 31:2] (31 lines, 182 tokens)
haskell-literate/file2.lhs [1:1 - 31:2]
[1mClone found (haskell)[22m
- [1m[32mhaskell/file1.hs[39m[22m [1:1 - 173:34] (173 lines, 902 tokens)
haskell/file2.hs [1:1 - 173:34]
[1mClone found (haskell)[22m
- [1m[32mhaskell/file1.hs[39m[22m [190:1 - 204:33] (15 lines, 99 tokens)
haskell/file2.hs [175:1 - 189:33]
[1mClone found (haxe)[22m
- [1m[32mhaxe/file1.hx[39m[22m [1:1 - 62:76] (62 lines, 334 tokens)
haxe/file2.hx [1:1 - 62:2]
[1mClone found (haxe)[22m
- [1m[32mhaxe/file1.hx[39m[22m [6:3 - 47:9] (42 lines, 244 tokens)
haxe/file1.hx [47:3 - 88:9]
[1mClone found (haxe)[22m
- [1m[32mhaxe/file1.hxml[39m[22m [3:1 - 14:10] (12 lines, 56 tokens)
haxe/file2.hxml [1:1 - 12:10]
[1mClone found (hcl)[22m
- [1m[32mhcl/file1.tf[39m[22m [1:1 - 37:9] (37 lines, 85 tokens)
hcl/file2.tf [1:1 - 37:9]
[1mClone found (aspnet)[22m
- [1m[32mhtmlembedded/file1.aspx[39m[22m [7:18 - 16:35] (10 lines, 67 tokens)
htmlembedded/file2.aspx [7:21 - 16:35]
[1mClone found (aspnet)[22m
- [1m[32mhtmlembedded/file1.aspx[39m[22m [18:53 - 36:30] (19 lines, 173 tokens)
htmlembedded/file2.aspx [18:60 - 36:30]
[1mClone found (aspnet)[22m
- [1m[32mhtmlembedded/file1.aspx[39m[22m [37:95 - 47:8] (11 lines, 56 tokens)
htmlembedded/file2.aspx [44:98 - 54:8]
[1mClone found (markup)[22m
- [1m[32mhtmlmixed/file1.htm[39m[22m [1:1 - 24:7] (24 lines, 191 tokens)
htmlmixed/file2.htm [1:1 - 24:7]
[1mClone found (markup)[22m
- [1m[32mhtmlmixed/file1.htm[39m[22m [1:1 - 24:7] (24 lines, 191 tokens)
ignore/file2.htm [1:1 - 24:7]
[1mClone found (markup)[22m
- [1m[32mhtmlmixed/file1.html[39m[22m [1:1 - 16:2] (16 lines, 91 tokens)
htmlmixed/file2.html [1:1 - 16:2]
[1mClone found (prolog)[22m
- [1m[32midl/file1.pro[39m[22m [1:1 - 28:22] (28 lines, 176 tokens)
idl/file2.pro [1:1 - 28:22]
[1mClone found (idris)[22m
- [1m[32midris/file1.idr[39m[22m [1:1 - 35:3] (35 lines, 208 tokens)
idris/file2.idr [1:1 - 35:3]
[1mClone found (txt)[22m
- [1m[32mignore-case/file2.txt[39m[22m [1:1 - 12:55] (12 lines, 85 tokens)
text/file1.txt [1:1 - 12:55]
[1mClone found (txt)[22m
- [1m[32mignore-case/file2.txt[39m[22m [1:1 - 61:63] (61 lines, 350 tokens)
text/file2.txt [1:1 - 61:63]
[1mClone found (typescript)[22m
- [1m[32mjavascript/file1.cts[39m[22m [1:1 - 263:4] (263 lines, 1318 tokens)
javascript/file1.mts [1:1 - 263:4]
[1mClone found (typescript)[22m
- [1m[32mjavascript/file1.cts[39m[22m [1:1 - 263:4] (263 lines, 1318 tokens)
javascript/file1.ts [1:1 - 263:4]
[1mClone found (typescript)[22m
- [1m[32mjavascript/file1.cts[39m[22m [1:1 - 66:24] (66 lines, 531 tokens)
javascript/file2.cts [48:1 - 113:24]
[1mClone found (typescript)[22m
- [1m[32mjavascript/file1.cts[39m[22m [74:1 - 263:4] (190 lines, 787 tokens)
javascript/file2.cts [187:1 - 376:4]
[1mClone found (javascript)[22m
- [1m[32mjavascript/file1.js[39m[22m [5:1 - 24:2] (20 lines, 94 tokens)
javascript/file2.js [5:1 - 27:2]
[1mClone found (json)[22m
- [1m[32mjavascript/file1.json[39m[22m [4:53 - 21:22] (18 lines, 64 tokens)
javascript/file2.json [4:70 - 21:22]
[1mClone found (json)[22m
- [1m[32mjavascript/file1.json[39m[22m [22:22 - 43:2] (22 lines, 70 tokens)
javascript/file2.json [22:22 - 43:2]
[1mClone found (typescript)[22m
- [1m[32mjavascript/file2.cts[39m[22m [109:38 - 209:24] (101 lines, 297 tokens)
javascript/file2.mts [109:38 - 209:24]
[1mClone found (javascript)[22m
- [1m[32mjavascript/file_4.js[39m[22m [15:2 - 42:43] (28 lines, 98 tokens)
javascript/file_4.js [56:74 - 83:43]
[1mClone found (json5)[22m
- [1m[32mjson5/file1.json5[39m[22m [1:1 - 31:5] (31 lines, 93 tokens)
json5/file2.json5 [1:1 - 31:5]
[1mClone found (jsx)[22m
- [1m[32mjsx/file1.jsx[39m[22m [1:1 - 21:46] (21 lines, 99 tokens)
jsx/file2.jsx [1:1 - 21:46]
[1mClone found (tsx)[22m
- [1m[32mjsx/file1.tsx[39m[22m [1:1 - 35:2] (35 lines, 143 tokens)
jsx/file2.tsx [1:1 - 35:2]
[1mClone found (julia)[22m
- [1m[32mjulia/file1.jl[39m[22m [1:1 - 30:4] (30 lines, 194 tokens)
julia/file2.jl [1:1 - 30:4]
[1mClone found (latex)[22m
- [1m[32mlatex/file1.tex[39m[22m [1:1 - 26:13] (26 lines, 149 tokens)
latex/file2.tex [1:1 - 26:13]
[1mClone found (lilypond)[22m
- [1m[32mlilypond/file1.ly[39m[22m [1:1 - 19:10] (19 lines, 63 tokens)
lilypond/file2.ly [1:1 - 19:10]
[1mClone found (linker-script)[22m
- [1m[32mlinker-script/file1.ld[39m[22m [1:1 - 47:4] (47 lines, 256 tokens)
linker-script/file2.ld [1:1 - 47:4]
[1mClone found (livescript)[22m
- [1m[32mlivescript/file1.ls[39m[22m [1:1 - 31:24] (31 lines, 145 tokens)
livescript/file2.ls [1:1 - 31:24]
[1mClone found (llvm)[22m
- [1m[32mllvm/file1.ll[39m[22m [1:1 - 35:2] (35 lines, 215 tokens)
llvm/file2.ll [1:1 - 35:2]
[1mClone found (log)[22m
- [1m[32mlog/file1.log[39m[22m [1:1 - 13:11] (13 lines, 262 tokens)
log/file2.log [1:1 - 13:11]
[1mClone found (lua)[22m
- [1m[32mlua/file1.lua[39m[22m [1:1 - 46:4] (46 lines, 193 tokens)
lua/file2.lua [1:1 - 46:4]
[1mClone found (markdown)[22m
- [1m[32mmarkdown/file1.md:markdown[39m[22m [2:1 - 176:3] (175 lines, 1238 tokens)
markdown/file2.md:markdown [7:1 - 181:3]
[1mClone found (markdown)[22m
- [1m[32mmarkdown/file1.md:markdown[39m[22m [176:1 - 193:86] (18 lines, 100 tokens)
markdown/file2.md:markdown [196:1 - 213:86]
[1mClone found (text)[22m
- [1m[32mmarkdown/file1.md:text[39m[22m [156:1 - 166:11] (11 lines, 69 tokens)
markdown/file2.md:text [161:1 - 171:11]
[1mClone found (yaml)[22m
- [1m[32mmarkdown/file1.md:yaml[39m[22m [53:1 - 81:10] (29 lines, 60 tokens)
markdown/file2.md:yaml [58:1 - 86:10]
[1mClone found (markdown)[22m
- [1m[32mmarkdown/file3.md:markdown[39m[22m [27:85 - 98:66] (72 lines, 69 tokens)
markdown/file4.md:markdown [27:89 - 98:66]
[1mClone found (python)[22m
- [1m[32mmarkdown/file3.md:python[39m[22m [72:1 - 91:6] (20 lines, 137 tokens)
markdown/file4.md:python [72:1 - 91:6]
[1mClone found (typescript)[22m
- [1m[32mmarkdown/file3.md:typescript[39m[22m [34:1 - 64:2] (31 lines, 156 tokens)
markdown/file4.md:typescript [34:1 - 64:2]
[1mClone found (wolfram)[22m
- [1m[32mmathematica/file1.wl[39m[22m [1:1 - 17:3] (17 lines, 127 tokens)
mathematica/file2.wl [1:1 - 17:3]
[1mClone found (fsharp)[22m
- [1m[32mmllike/file1.fs[39m[22m [1:1 - 35:6] (35 lines, 193 tokens)
mllike/file2.fs [1:1 - 35:6]
[1mClone found (ocaml)[22m
- [1m[32mmllike/file1.ml[39m[22m [1:1 - 30:18] (30 lines, 150 tokens)
mllike/file2.ml [1:1 - 30:18]
[1mClone found (ocaml)[22m
- [1m[32mmllike/file1.mli[39m[22m [1:1 - 29:20] (29 lines, 186 tokens)
mllike/file2.mli [1:1 - 29:20]
[1mClone found (ocaml)[22m
- [1m[32mmllike/file1.mll[39m[22m [1:1 - 24:20] (24 lines, 104 tokens)
mllike/file2.mll [1:1 - 24:20]
[1mClone found (nsis)[22m
- [1m[32mnsis/file1.nsi[39m[22m [1:1 - 29:25] (29 lines, 71 tokens)
nsis/file2.nsi [1:1 - 29:25]
[1mClone found (c-header)[22m
- [1m[32mobjective-c/file_1.h[39m[22m [1:1 - 33:2] (33 lines, 385 tokens)
objective-c/file_2.h [1:1 - 33:2]
[1mClone found (objectivec)[22m
- [1m[32mobjective-c/file_1.m[39m[22m [1:1 - 12:35] (12 lines, 311 tokens)
objective-c/file_2.m [1:1 - 12:35]
[1mClone found (objectivec)[22m
- [1m[32mobjective-c/file_1.m[39m[22m [14:1 - 64:5] (51 lines, 216 tokens)
objective-c/file_2.m [38:1 - 88:5]
[1mClone found (javascript)[22m
- [1m[32mone-file/one-file.js[39m[22m [1:1 - 28:6] (28 lines, 165 tokens)
one-file/one-file.js [32:1 - 59:6]
[1mClone found (openqasm)[22m
- [1m[32mopenqasm/file1.qasm[39m[22m [5:1 - 23:7] (19 lines, 92 tokens)
openqasm/file2.qasm [23:1 - 41:7]
[1mClone found (oz)[22m
- [1m[32moz/file1.oz[39m[22m [1:1 - 37:20] (37 lines, 141 tokens)
oz/file2.oz [1:1 - 37:20]
[1mClone found (pascal)[22m
- [1m[32mpascal/file1.pas[39m[22m [1:1 - 37:5] (37 lines, 203 tokens)
pascal/file2.pas [1:1 - 37:5]
[1mClone found (perl)[22m
- [1m[32mperl/file1.pl[39m[22m [1:1 - 121:31] (121 lines, 331 tokens)
perl/file2.pl [1:1 - 121:31]
[1mClone found (perl)[22m
- [1m[32mperl/file1.pm[39m[22m [1:1 - 143:4] (143 lines, 586 tokens)
perl/file2.pm [1:1 - 143:4]
[1mClone found (perl)[22m
- [1m[32mperl/file1.pm[39m[22m [143:3 - 155:3] (13 lines, 54 tokens)
perl/file2.pm [176:3 - 188:3]
[1mClone found (php)[22m
- [1m[32mphp/file1.php[39m[22m [1:1 - 51:20] (51 lines, 295 tokens)
php/file2.php [1:1 - 51:20]
[1mClone found (plant-uml)[22m
- [1m[32mplant-uml/file1.puml[39m[22m [1:1 - 52:40] (52 lines, 181 tokens)
plant-uml/file2.puml [1:1 - 52:40]
[1mClone found (plsql)[22m
- [1m[32mplsql/file1.plsql[39m[22m [1:1 - 56:12] (56 lines, 191 tokens)
plsql/file2.plsql [1:1 - 56:12]
[1mClone found (plsql)[22m
- [1m[32mplsql/file1.plsql[39m[22m [70:20 - 85:2] (16 lines, 53 tokens)
plsql/file2.plsql [71:25 - 86:2]
[1mClone found (powerquery)[22m
- [1m[32mpowerquery/file1.pq[39m[22m [1:1 - 41:7] (41 lines, 210 tokens)
powerquery/file2.pq [1:1 - 41:7]
[1mClone found (powershell)[22m
- [1m[32mpowershell/file1.ps1[39m[22m [1:1 - 41:2] (41 lines, 168 tokens)
powershell/file2.ps1 [1:1 - 41:2]
[1mClone found (ini)[22m
- [1m[32mproperties/file1.ini[39m[22m [1:1 - 27:7] (27 lines, 79 tokens)
properties/file2.ini [1:1 - 27:7]
[1mClone found (properties)[22m
- [1m[32mproperties/file1.properties[39m[22m [1:1 - 22:11] (22 lines, 114 tokens)
properties/file2.properties [1:1 - 22:11]
[1mClone found (protobuf)[22m
- [1m[32mprotobuf/file1.proto[39m[22m [1:1 - 40:8] (40 lines, 115 tokens)
protobuf/file2.proto [1:1 - 40:8]
[1mClone found (pug)[22m
- [1m[32mpug/file1.pug[39m[22m [1:1 - 234:21] (234 lines, 1037 tokens)
pug/file2.pug [1:1 - 234:21]
[1mClone found (pug)[22m
- [1m[32mpug/file1.pug[39m[22m [239:36 - 291:67] (53 lines, 212 tokens)
pug/file2.pug [231:30 - 283:67]
[1mClone found (puppet)[22m
- [1m[32mpuppet/file1.pp[39m[22m [1:1 - 39:4] (39 lines, 131 tokens)
puppet/file2.pp [1:1 - 39:4]
[1mClone found (puppet)[22m
- [1m[32mpuppet/file1.pp[39m[22m [44:32 - 64:2] (21 lines, 83 tokens)
puppet/file2.pp [38:38 - 58:2]
[1mClone found (purescript)[22m
- [1m[32mpurescript/file1.purs[39m[22m [1:1 - 44:7] (44 lines, 265 tokens)
purescript/file2.purs [1:1 - 44:7]
[1mClone found (purescript)[22m
- [1m[32mpurescript/file1.purs[39m[22m [47:41 - 53:44] (7 lines, 50 tokens)
purescript/file2.purs [47:40 - 53:44]
[1mClone found (python)[22m
- [1m[32mpython/file1.py[39m[22m [1:1 - 24:13] (24 lines, 67 tokens)
python/file2.py [1:1 - 24:13]
[1mClone found (q)[22m
- [1m[32mq/file1.q[39m[22m [1:1 - 30:2] (30 lines, 378 tokens)
q/file2.q [1:1 - 30:2]
[1mClone found (qsharp)[22m
- [1m[32mqsharp/file1.qs[39m[22m [2:32 - 11:6] (10 lines, 50 tokens)
qsharp/file2.qs [2:29 - 11:6]
[1mClone found (r)[22m
- [1m[32mr/file1.r[39m[22m [1:1 - 64:9] (64 lines, 427 tokens)
r/file2.r [1:1 - 64:9]
[1mClone found (racket)[22m
- [1m[32mracket/file1.rkt[39m[22m [1:1 - 38:3] (38 lines, 286 tokens)
racket/file2.rkt [1:1 - 38:3]
[1mClone found (rescript)[22m
- [1m[32mrescript/file1.res[39m[22m [1:1 - 38:2] (38 lines, 200 tokens)
rescript/file2.res [1:1 - 38:2]
[1mClone found (robotframework)[22m
- [1m[32mrobotframework/file1.robot[39m[22m [1:1 - 27:45] (27 lines, 143 tokens)
robotframework/file2.robot [1:1 - 27:45]
[1mClone found (robotframework)[22m
- [1m[32mrobotframework/file1.robot[39m[22m [45:1 - 62:23] (18 lines, 80 tokens)
robotframework/file2.robot [51:1 - 68:23]
[1mClone found (ruby)[22m
- [1m[32mruby/file1.rb[39m[22m [1:1 - 40:4] (40 lines, 96 tokens)
ruby/file2.rb [1:1 - 40:4]
[1mClone found (rust)[22m
- [1m[32mrust/file1.rs[39m[22m [1:1 - 131:3] (131 lines, 857 tokens)
rust/file2.rs [1:1 - 132:3]
[1mClone found (rust)[22m
- [1m[32mrust/file1.rs[39m[22m [199:50 - 204:2] (6 lines, 51 tokens)
rust/file1.rs [255:53 - 260:2]
[1mClone found (rust)[22m
- [1m[32mrust/file1.rs[39m[22m [232:93 - 239:64] (8 lines, 58 tokens)
rust/file1.rs [247:47 - 254:64]
[1mClone found (rust)[22m
- [1m[32mrust/file1.rs[39m[22m [239:57 - 416:2] (178 lines, 1285 tokens)
rust/file2.rs [123:52 - 301:2]
[1mClone found (rust)[22m
- [1m[32mrust/file1.rs[39m[22m [263:28 - 273:12] (11 lines, 80 tokens)
rust/file1.rs [335:21 - 345:12]
[1mClone found (rust)[22m
- [1m[32mrust/file1.rs[39m[22m [319:60 - 332:2] (14 lines, 114 tokens)
rust/file1.rs [371:96 - 384:2]
[1mClone found (sas)[22m
- [1m[32msas/file1.sas[39m[22m [1:1 - 59:4] (59 lines, 444 tokens)
sas/file2.sas [1:1 - 59:4]
[1mClone found (sass)[22m
- [1m[32msass/file1.sass[39m[22m [1:1 - 19:17] (19 lines, 89 tokens)
sass/file2.sass [1:1 - 19:17]
[1mClone found (sass)[22m
- [1m[32msass/file1.sass[39m[22m [3:1 - 17:43] (15 lines, 82 tokens)
sass/file1.sass [19:1 - 33:43]
[1mClone found (sass)[22m
- [1m[32msass/file1.sass[39m[22m [5:1 - 24:45] (20 lines, 102 tokens)
sass/file2.sass [24:1 - 48:33]
[1mClone found (scheme)[22m
- [1m[32mscheme/file1.scm[39m[22m [1:1 - 33:23] (33 lines, 225 tokens)
scheme/file2.scm [1:1 - 33:23]
[1mClone found (bash)[22m
- [1m[32mshebang/build[39m[22m [1:1 - 32:2] (32 lines, 86 tokens)
shebang/deploy [1:1 - 32:2]
[1mClone found (bash)[22m
- [1m[32mshebang/build[39m[22m [1:1 - 32:2] (32 lines, 86 tokens)
shell/file1.sh [1:1 - 32:2]
[1mClone found (bash)[22m
- [1m[32mshebang/build[39m[22m [1:1 - 32:2] (32 lines, 86 tokens)
shell/file2.sh [1:1 - 32:2]
[1mClone found (python)[22m
- [1m[32mshebang/process[39m[22m [1:1 - 32:4] (32 lines, 159 tokens)
shebang/transform [1:1 - 32:4]
[1mClone found (smalltalk)[22m
- [1m[32msmalltalk/file1.st[39m[22m [1:1 - 45:2] (45 lines, 146 tokens)
smalltalk/file2.st [1:1 - 45:2]
[1mClone found (smarty)[22m
- [1m[32msmarty/file1.tpl[39m[22m [1:1 - 43:18] (43 lines, 286 tokens)
smarty/file2.tpl [1:1 - 43:18]
[1mClone found (solidity)[22m
- [1m[32msolidity/file1.sol[39m[22m [25:61 - 55:13] (31 lines, 168 tokens)
solidity/file2.sol [29:54 - 59:13]
[1mClone found (soy)[22m
- [1m[32msoy/file1.soy[39m[22m [1:1 - 49:27] (49 lines, 346 tokens)
soy/file2.soy [1:1 - 49:27]
[1mClone found (sparql)[22m
- [1m[32msparql/file1.rq[39m[22m [1:1 - 11:9] (11 lines, 65 tokens)
sparql/file2.rq [1:1 - 11:9]
[1mClone found (sql)[22m
- [1m[32msql/file1.sql[39m[22m [3:1 - 41:46] (39 lines, 214 tokens)
sql/file2.sql [3:1 - 41:46]
[1mClone found (stylus)[22m
- [1m[32mstylus/file1.styl[39m[22m [1:1 - 53:20] (53 lines, 201 tokens)
stylus/file2.styl [1:1 - 53:20]
[1mClone found (css)[22m
- [1m[32msvelte/component1.svelte:css[39m[22m [112:3 - 230:4] (119 lines, 507 tokens)
svelte/component2.svelte:css [112:3 - 230:4]
[1mClone found (html)[22m
- [1m[32msvelte/component1.svelte:html[39m[22m [1:1 - 231:9] (231 lines, 350 tokens)
svelte/component2.svelte:html [1:1 - 231:9]
[1mClone found (javascript)[22m
- [1m[32msvelte/component1.svelte:javascript[39m[22m [2:3 - 61:6] (60 lines, 286 tokens)
svelte/component2.svelte:javascript [2:3 - 61:6]
[1mClone found (swift)[22m
- [1m[32mswift/file1.swift[39m[22m [9:1 - 29:6] (21 lines, 73 tokens)
swift/file2.swift [2:1 - 22:6]
[1mClone found (tap)[22m
- [1m[32mtap/file1.tap[39m[22m [1:1 - 35:8] (35 lines, 202 tokens)
tap/file2.tap [1:1 - 35:8]
[1mClone found (tcl)[22m
- [1m[32mtcl/file1.tcl[39m[22m [1:1 - 45:2] (45 lines, 263 tokens)
tcl/file2.tcl [1:1 - 45:2]
[1mClone found (textile)[22m
- [1m[32mtextile/file1.textile[39m[22m [1:1 - 51:4] (51 lines, 236 tokens)
textile/file2.textile [1:1 - 51:4]
[1mClone found (toml)[22m
- [1m[32mtoml/file1.toml[39m[22m [1:1 - 39:19] (39 lines, 100 tokens)
toml/file2.toml [1:1 - 39:19]
[1mClone found (tt2)[22m
- [1m[32mtt2/file1.tt2[39m[22m [1:1 - 38:14] (38 lines, 299 tokens)
tt2/file2.tt2 [1:1 - 38:14]
[1mClone found (tt2)[22m
- [1m[32mtt2/file1.tt2[39m[22m [42:21 - 52:25] (11 lines, 54 tokens)
tt2/file2.tt2 [42:86 - 52:25]
[1mClone found (turtle)[22m
- [1m[32mturtle/file1.ttl[39m[22m [1:1 - 36:17] (36 lines, 212 tokens)
turtle/file2.ttl [1:1 - 36:17]
[1mClone found (twig)[22m
- [1m[32mtwig/file_1.twig[39m[22m [1:1 - 23:3] (23 lines, 167 tokens)
twig/file_2.twig [1:1 - 23:3]
[1mClone found (twig)[22m
- [1m[32mtwig/file_1.twig[39m[22m [13:20 - 25:9] (13 lines, 65 tokens)
twig/file_1.twig [16:8 - 28:9]
[1mClone found (twig)[22m
- [1m[32mtwig/file_1.twig[39m[22m [19:8 - 29:15] (11 lines, 54 tokens)
twig/file_2.twig [22:8 - 32:15]
[1mClone found (unrealscript)[22m
- [1m[32munrealscript/file1.uc[39m[22m [1:1 - 56:6] (56 lines, 161 tokens)
unrealscript/file2.uc [1:1 - 56:6]
[1mClone found (vbnet)[22m
- [1m[32mvb/file1.vb[39m[22m [1:1 - 29:17] (29 lines, 163 tokens)
vb/file2.vb [1:1 - 29:17]
[1mClone found (velocity)[22m
- [1m[32mvelocity/file1.vtl[39m[22m [1:1 - 41:25] (41 lines, 264 tokens)
velocity/file2.vtl [1:1 - 41:25]
[1mClone found (verilog)[22m
- [1m[32mverilog/file1.v[39m[22m [1:1 - 40:10] (40 lines, 163 tokens)
verilog/file2.v [1:1 - 40:10]
[1mClone found (vhdl)[22m
- [1m[32mvhdl/file1.vhd[39m[22m [1:1 - 32:18] (32 lines, 179 tokens)
vhdl/file2.vhd [1:1 - 32:18]
[1mClone found (typescript)[22m
- [1m[32mvue/app1.vue:typescript[39m[22m [5:1 - 33:4] (29 lines, 128 tokens)
vue/app2.vue:typescript [5:1 - 33:4]
[1mClone found (javascript)[22m
- [1m[32mvue/file.js[39m[22m [1:1 - 28:2] (28 lines, 210 tokens)
vue/file1.vue:javascript [125:3 - 152:4]
[1mClone found (html)[22m
- [1m[32mvue/file1.vue:html[39m[22m [1:1 - 10:9] (10 lines, 99 tokens)
vue/file2.vue:html [1:1 - 10:9]
[1mClone found (javascript)[22m
- [1m[32mvue/file1.vue:javascript[39m[22m [120:3 - 261:4] (142 lines, 817 tokens)
vue/file2.vue:javascript [99:3 - 240:4]
[1mClone found (scss)[22m
- [1m[32mvue/file1.vue:scss[39m[22m [13:3 - 75:6] (63 lines, 402 tokens)
vue/file2.vue:scss [13:3 - 75:6]
[1mClone found (scss)[22m
- [1m[32mvue/file1.vue:scss[39m[22m [95:5 - 117:4] (23 lines, 149 tokens)
vue/file2.vue:scss [74:5 - 96:4]
[1mClone found (wgsl)[22m
- [1m[32mwgsl/file1.wgsl[39m[22m [1:1 - 45:3] (45 lines, 274 tokens)
wgsl/file2.wgsl [1:1 - 45:3]
[1mClone found (wgsl)[22m
- [1m[32mwgsl/file1.wgsl[39m[22m [51:42 - 59:6] (9 lines, 66 tokens)
wgsl/file2.wgsl [55:47 - 63:6]
[1mClone found (markup)[22m
- [1m[32mxml/file1.svg[39m[22m [1:1 - 88:2] (88 lines, 392 tokens)
xml/file2.svg [1:1 - 87:6]
[1mClone found (markup)[22m
- [1m[32mxml/file1.xsl[39m[22m [1:1 - 43:6] (43 lines, 316 tokens)
xml/file2.xsl [1:1 - 43:2]
[1mClone found (markup)[22m
- [1m[32mxml/file1.xsl[39m[22m [20:15 - 35:6] (16 lines, 133 tokens)
xml/file1.xsl [32:137 - 47:2]
[1mClone found (xquery)[22m
- [1m[32mxquery/file1.xquery[39m[22m [1:1 - 31:22] (31 lines, 222 tokens)
xquery/file2.xquery [1:1 - 31:22]
[1mClone found (yaml)[22m
- [1m[32myaml/file1.yml[39m[22m [1:1 - 18:23] (18 lines, 132 tokens)
yaml/file2.yml [1:1 - 18:23]
[1mClone found (c)[22m
- [1m[32mz80/file1.z80[39m[22m [1:1 - 14:25] (14 lines, 60 tokens)
z80/file2.z80 [1:1 - 14:25]
[1mClone found (zig)[22m
- [1m[32mzig/file1.zig[39m[22m [1:1 - 43:10] (43 lines, 259 tokens)
zig/file2.zig [1:1 - 43:10]
[1mClone found (zig)[22m
- [1m[32mzig/file1.zig[39m[22m [42:45 - 52:23] (11 lines, 52 tokens)
zig/file2.zig [47:45 - 57:23]
[90m┌────────────────┬────────────────┬─────────────┬──────────────┬──────────────┬──────────────────┬───────────────────┐[39m
[90m│[39m[31m Format [39m[90m│[39m[31m Files analyzed [39m[90m│[39m[31m Total lines [39m[90m│[39m[31m Total tokens [39m[90m│[39m[31m Clones found [39m[90m│[39m[31m Duplicated lines [39m[90m│[39m[31m Duplicated tokens [39m[90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m actionscript [90m│[39m 2 [90m│[39m 75 [90m│[39m 302 [90m│[39m 1 [90m│[39m 29 (38.67%) [90m│[39m 127 (42.05%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m ada [90m│[39m 2 [90m│[39m 74 [90m│[39m 408 [90m│[39m 1 [90m│[39m 20 (27.03%) [90m│[39m 103 (25.25%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m antlr4 [90m│[39m 2 [90m│[39m 48 [90m│[39m 216 [90m│[39m 1 [90m│[39m 20 (41.67%) [90m│[39m 82 (37.96%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m apex [90m│[39m 2 [90m│[39m 84 [90m│[39m 451 [90m│[39m 1 [90m│[39m 23 (27.38%) [90m│[39m 115 (25.50%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m apl [90m│[39m 2 [90m│[39m 47 [90m│[39m 554 [90m│[39m 1 [90m│[39m 19 (40.43%) [90m│[39m 252 (45.49%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m aspnet [90m│[39m 2 [90m│[39m 101 [90m│[39m 854 [90m│[39m 3 [90m│[39m 37 (36.63%) [90m│[39m 296 (34.66%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m astro [90m│[39m 2 [90m│[39m 324 [90m│[39m 950 [90m│[39m 0 [90m│[39m 0 (0.00%) [90m│[39m 0 (0.00%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m awk [90m│[39m 2 [90m│[39m 62 [90m│[39m 205 [90m│[39m 1 [90m│[39m 22 (35.48%) [90m│[39m 75 (36.59%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m bash [90m│[39m 4 [90m│[39m 158 [90m│[39m 418 [90m│[39m 3 [90m│[39m 93 (58.86%) [90m│[39m 258 (61.72%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m basic [90m│[39m 2 [90m│[39m 47 [90m│[39m 331 [90m│[39m 1 [90m│[39m 17 (36.17%) [90m│[39m 100 (30.21%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m bicep [90m│[39m 2 [90m│[39m 81 [90m│[39m 251 [90m│[39m 1 [90m│[39m 26 (32.10%) [90m│[39m 78 (31.08%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m brainfuck [90m│[39m 4 [90m│[39m 159 [90m│[39m 1728 [90m│[39m 4 [90m│[39m 113 (71.07%) [90m│[39m 1289 (74.59%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m c [90m│[39m 5 [90m│[39m 105 [90m│[39m 1060 [90m│[39m 3 [90m│[39m 40 (38.10%) [90m│[39m 399 (37.64%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m c-header [90m│[39m 4 [90m│[39m 149 [90m│[39m 2091 [90m│[39m 3 [90m│[39m 59 (39.60%) [90m│[39m 724 (34.62%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m cfml [90m│[39m 2 [90m│[39m 107 [90m│[39m 671 [90m│[39m 1 [90m│[39m 17 (15.89%) [90m│[39m 85 (12.67%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m cfscript [90m│[39m 2 [90m│[39m 69 [90m│[39m 437 [90m│[39m 1 [90m│[39m 27 (39.13%) [90m│[39m 161 (36.84%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m clojure [90m│[39m 2 [90m│[39m 46 [90m│[39m 374 [90m│[39m 1 [90m│[39m 18 (39.13%) [90m│[39m 139 (37.17%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m cmake [90m│[39m 2 [90m│[39m 52 [90m│[39m 311 [90m│[39m 1 [90m│[39m 20 (38.46%) [90m│[39m 128 (41.16%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m coffeescript [90m│[39m 2 [90m│[39m 92 [90m│[39m 447 [90m│[39m 2 [90m│[39m 40 (43.48%) [90m│[39m 219 (48.99%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m cpp [90m│[39m 2 [90m│[39m 176 [90m│[39m 1514 [90m│[39m 2 [90m│[39m 106 (60.23%) [90m│[39m 965 (63.74%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m cpp-header [90m│[39m 2 [90m│[39m 176 [90m│[39m 1514 [90m│[39m 2 [90m│[39m 106 (60.23%) [90m│[39m 965 (63.74%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m crystal [90m│[39m 2 [90m│[39m 70 [90m│[39m 222 [90m│[39m 1 [90m│[39m 28 (40.00%) [90m│[39m 97 (43.69%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m csharp [90m│[39m 2 [90m│[39m 360 [90m│[39m 1099 [90m│[39m 2 [90m│[39m 172 (47.78%) [90m│[39m 537 (48.86%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m css [90m│[39m 8 [90m│[39m 875 [90m│[39m 2536 [90m│[39m 5 [90m│[39m 290 (33.14%) [90m│[39m 1494 (58.91%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m csv [90m│[39m 2 [90m│[39m 22 [90m│[39m 400 [90m│[39m 1 [90m│[39m 8 (36.36%) [90m│[39m 163 (40.75%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m d [90m│[39m 2 [90m│[39m 338 [90m│[39m 2270 [90m│[39m 1 [90m│[39m 168 (49.70%) [90m│[39m 1135 (50.00%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m dart [90m│[39m 2 [90m│[39m 266 [90m│[39m 1178 [90m│[39m 2 [90m│[39m 118 (44.36%) [90m│[39m 522 (44.31%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m diff [90m│[39m 2 [90m│[39m 146 [90m│[39m 1082 [90m│[39m 1 [90m│[39m 61 (41.78%) [90m│[39m 435 (40.20%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m dot [90m│[39m 2 [90m│[39m 46 [90m│[39m 243 [90m│[39m 1 [90m│[39m 17 (36.96%) [90m│[39m 91 (37.45%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m eiffel [90m│[39m 2 [90m│[39m 126 [90m│[39m 380 [90m│[39m 1 [90m│[39m 45 (35.71%) [90m│[39m 130 (34.21%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m elm [90m│[39m 2 [90m│[39m 110 [90m│[39m 411 [90m│[39m 1 [90m│[39m 46 (41.82%) [90m│[39m 155 (37.71%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m erlang [90m│[39m 2 [90m│[39m 242 [90m│[39m 1674 [90m│[39m 1 [90m│[39m 120 (49.59%) [90m│[39m 837 (50.00%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m fortran [90m│[39m 2 [90m│[39m 93 [90m│[39m 469 [90m│[39m 1 [90m│[39m 36 (38.71%) [90m│[39m 182 (38.81%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m fsharp [90m│[39m 2 [90m│[39m 82 [90m│[39m 462 [90m│[39m 1 [90m│[39m 34 (41.46%) [90m│[39m 193 (41.77%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m gdscript [90m│[39m 2 [90m│[39m 96 [90m│[39m 458 [90m│[39m 1 [90m│[39m 24 (25.00%) [90m│[39m 135 (29.48%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m gettext [90m│[39m 2 [90m│[39m 220 [90m│[39m 356 [90m│[39m 1 [90m│[39m 51 (23.18%) [90m│[39m 82 (23.03%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m gherkin [90m│[39m 2 [90m│[39m 75 [90m│[39m 434 [90m│[39m 1 [90m│[39m 15 (20.00%) [90m│[39m 83 (19.12%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m go [90m│[39m 2 [90m│[39m 65 [90m│[39m 305 [90m│[39m 1 [90m│[39m 29 (44.62%) [90m│[39m 134 (43.93%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m graphql [90m│[39m 2 [90m│[39m 134 [90m│[39m 499 [90m│[39m 1 [90m│[39m 24 (17.91%) [90m│[39m 143 (28.66%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m groovy [90m│[39m 2 [90m│[39m 96 [90m│[39m 422 [90m│[39m 1 [90m│[39m 40 (41.67%) [90m│[39m 188 (44.55%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m haml [90m│[39m 2 [90m│[39m 52 [90m│[39m 276 [90m│[39m 1 [90m│[39m 22 (42.31%) [90m│[39m 118 (42.75%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m handlebars [90m│[39m 2 [90m│[39m 72 [90m│[39m 555 [90m│[39m 1 [90m│[39m 27 (37.50%) [90m│[39m 218 (39.28%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m haskell [90m│[39m 4 [90m│[39m 459 [90m│[39m 2536 [90m│[39m 3 [90m│[39m 216 (47.06%) [90m│[39m 1183 (46.65%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m haxe [90m│[39m 4 [90m│[39m 191 [90m│[39m 1035 [90m│[39m 3 [90m│[39m 113 (59.16%) [90m│[39m 634 (61.26%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m hcl [90m│[39m 2 [90m│[39m 119 [90m│[39m 313 [90m│[39m 1 [90m│[39m 36 (30.25%) [90m│[39m 85 (27.16%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m html [90m│[39m 6 [90m│[39m 1289 [90m│[39m 1390 [90m│[39m 4 [90m│[39m 406 (31.50%) [90m│[39m 762 (54.82%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m idris [90m│[39m 2 [90m│[39m 88 [90m│[39m 581 [90m│[39m 1 [90m│[39m 34 (38.64%) [90m│[39m 208 (35.80%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m ignore [90m│[39m 2 [90m│[39m 191 [90m│[39m 523 [90m│[39m 1 [90m│[39m 83 (43.46%) [90m│[39m 234 (44.74%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m ini [90m│[39m 2 [90m│[39m 58 [90m│[39m 172 [90m│[39m 1 [90m│[39m 26 (44.83%) [90m│[39m 79 (45.93%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m java [90m│[39m 2 [90m│[39m 454 [90m│[39m 15064 [90m│[39m 2 [90m│[39m 224 (49.34%) [90m│[39m 7387 (49.04%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m javascript [90m│[39m 23 [90m│[39m 1580 [90m│[39m 6985 [90m│[39m 13 [90m│[39m 572 (36.20%) [90m│[39m 3475 (49.75%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m json [90m│[39m 4 [90m│[39m 134 [90m│[39m 460 [90m│[39m 2 [90m│[39m 38 (28.36%) [90m│[39m 134 (29.13%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m json5 [90m│[39m 2 [90m│[39m 104 [90m│[39m 307 [90m│[39m 1 [90m│[39m 30 (28.85%) [90m│[39m 93 (30.29%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m jsx [90m│[39m 2 [90m│[39m 73 [90m│[39m 296 [90m│[39m 1 [90m│[39m 20 (27.40%) [90m│[39m 99 (33.45%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m julia [90m│[39m 2 [90m│[39m 76 [90m│[39m 557 [90m│[39m 1 [90m│[39m 29 (38.16%) [90m│[39m 194 (34.83%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m kotlin [90m│[39m 2 [90m│[39m 106 [90m│[39m 550 [90m│[39m 2 [90m│[39m 47 (44.34%) [90m│[39m 250 (45.45%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m latex [90m│[39m 2 [90m│[39m 88 [90m│[39m 557 [90m│[39m 1 [90m│[39m 25 (28.41%) [90m│[39m 149 (26.75%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m less [90m│[39m 2 [90m│[39m 56 [90m│[39m 518 [90m│[39m 2 [90m│[39m 29 (51.79%) [90m│[39m 282 (54.44%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m lilypond [90m│[39m 2 [90m│[39m 100 [90m│[39m 307 [90m│[39m 1 [90m│[39m 18 (18.00%) [90m│[39m 63 (20.52%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m linker-script [90m│[39m 2 [90m│[39m 133 [90m│[39m 683 [90m│[39m 1 [90m│[39m 46 (34.59%) [90m│[39m 256 (37.48%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m lisp [90m│[39m 2 [90m│[39m 106 [90m│[39m 608 [90m│[39m 1 [90m│[39m 49 (46.23%) [90m│[39m 289 (47.53%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m livescript [90m│[39m 2 [90m│[39m 68 [90m│[39m 344 [90m│[39m 1 [90m│[39m 30 (44.12%) [90m│[39m 145 (42.15%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m llvm [90m│[39m 2 [90m│[39m 132 [90m│[39m 850 [90m│[39m 1 [90m│[39m 34 (25.76%) [90m│[39m 215 (25.29%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m log [90m│[39m 2 [90m│[39m 30 [90m│[39m 666 [90m│[39m 1 [90m│[39m 12 (40.00%) [90m│[39m 262 (39.34%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m lua [90m│[39m 2 [90m│[39m 106 [90m│[39m 450 [90m│[39m 1 [90m│[39m 45 (42.45%) [90m│[39m 193 (42.89%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m markdown [90m│[39m 4 [90m│[39m 536 [90m│[39m 929 [90m│[39m 3 [90m│[39m 262 (48.88%) [90m│[39m 1407 (151.45%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m markup [90m│[39m 11 [90m│[39m 478 [90m│[39m 2795 [90m│[39m 6 [90m│[39m 205 (42.89%) [90m│[39m 1314 (47.01%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m nsis [90m│[39m 2 [90m│[39m 68 [90m│[39m 172 [90m│[39m 1 [90m│[39m 28 (41.18%) [90m│[39m 71 (41.28%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m objectivec [90m│[39m 2 [90m│[39m 152 [90m│[39m 1463 [90m│[39m 2 [90m│[39m 61 (40.13%) [90m│[39m 527 (36.02%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m ocaml [90m│[39m 6 [90m│[39m 186 [90m│[39m 1052 [90m│[39m 3 [90m│[39m 80 (43.01%) [90m│[39m 440 (41.83%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m openqasm [90m│[39m 2 [90m│[39m 87 [90m│[39m 346 [90m│[39m 1 [90m│[39m 18 (20.69%) [90m│[39m 92 (26.59%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m oz [90m│[39m 2 [90m│[39m 94 [90m│[39m 357 [90m│[39m 1 [90m│[39m 36 (38.30%) [90m│[39m 141 (39.50%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m pascal [90m│[39m 2 [90m│[39m 106 [90m│[39m 561 [90m│[39m 1 [90m│[39m 36 (33.96%) [90m│[39m 203 (36.19%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m perl [90m│[39m 4 [90m│[39m 609 [90m│[39m 2272 [90m│[39m 3 [90m│[39m 274 (44.99%) [90m│[39m 971 (42.74%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m php [90m│[39m 2 [90m│[39m 143 [90m│[39m 785 [90m│[39m 1 [90m│[39m 50 (34.97%) [90m│[39m 295 (37.58%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m plant-uml [90m│[39m 2 [90m│[39m 120 [90m│[39m 422 [90m│[39m 1 [90m│[39m 51 (42.50%) [90m│[39m 181 (42.89%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m plsql [90m│[39m 2 [90m│[39m 171 [90m│[39m 598 [90m│[39m 2 [90m│[39m 70 (40.94%) [90m│[39m 244 (40.80%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m powerquery [90m│[39m 2 [90m│[39m 112 [90m│[39m 538 [90m│[39m 1 [90m│[39m 40 (35.71%) [90m│[39m 210 (39.03%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m powershell [90m│[39m 2 [90m│[39m 98 [90m│[39m 404 [90m│[39m 1 [90m│[39m 40 (40.82%) [90m│[39m 168 (41.58%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m prolog [90m│[39m 2 [90m│[39m 64 [90m│[39m 429 [90m│[39m 1 [90m│[39m 27 (42.19%) [90m│[39m 176 (41.03%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m properties [90m│[39m 2 [90m│[39m 48 [90m│[39m 250 [90m│[39m 1 [90m│[39m 21 (43.75%) [90m│[39m 114 (45.60%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m protobuf [90m│[39m 2 [90m│[39m 205 [90m│[39m 680 [90m│[39m 1 [90m│[39m 39 (19.02%) [90m│[39m 115 (16.91%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m pug [90m│[39m 2 [90m│[39m 574 [90m│[39m 2512 [90m│[39m 2 [90m│[39m 285 (49.65%) [90m│[39m 1249 (49.72%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m puppet [90m│[39m 2 [90m│[39m 122 [90m│[39m 446 [90m│[39m 2 [90m│[39m 58 (47.54%) [90m│[39m 214 (47.98%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m purescript [90m│[39m 2 [90m│[39m 115 [90m│[39m 797 [90m│[39m 2 [90m│[39m 49 (42.61%) [90m│[39m 315 (39.52%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m python [90m│[39m 6 [90m│[39m 323 [90m│[39m 911 [90m│[39m 3 [90m│[39m 73 (22.60%) [90m│[39m 363 (39.85%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m q [90m│[39m 2 [90m│[39m 78 [90m│[39m 997 [90m│[39m 1 [90m│[39m 29 (37.18%) [90m│[39m 378 (37.91%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m qsharp [90m│[39m 2 [90m│[39m 102 [90m│[39m 408 [90m│[39m 1 [90m│[39m 9 (8.82%) [90m│[39m 50 (12.25%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m r [90m│[39m 2 [90m│[39m 128 [90m│[39m 854 [90m│[39m 1 [90m│[39m 63 (49.22%) [90m│[39m 427 (50.00%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m racket [90m│[39m 2 [90m│[39m 100 [90m│[39m 760 [90m│[39m 1 [90m│[39m 37 (37.00%) [90m│[39m 286 (37.63%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m rescript [90m│[39m 2 [90m│[39m 115 [90m│[39m 776 [90m│[39m 1 [90m│[39m 37 (32.17%) [90m│[39m 200 (25.77%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m robotframework [90m│[39m 2 [90m│[39m 130 [90m│[39m 630 [90m│[39m 2 [90m│[39m 43 (33.08%) [90m│[39m 223 (35.40%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m ruby [90m│[39m 2 [90m│[39m 80 [90m│[39m 192 [90m│[39m 1 [90m│[39m 39 (48.75%) [90m│[39m 96 (50.00%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m rust [90m│[39m 2 [90m│[39m 717 [90m│[39m 5128 [90m│[39m 6 [90m│[39m 342 (47.70%) [90m│[39m 2445 (47.68%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m sas [90m│[39m 2 [90m│[39m 152 [90m│[39m 1174 [90m│[39m 1 [90m│[39m 58 (38.16%) [90m│[39m 444 (37.82%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m sass [90m│[39m 2 [90m│[39m 93 [90m│[39m 383 [90m│[39m 3 [90m│[39m 51 (54.84%) [90m│[39m 273 (71.28%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m scala [90m│[39m 2 [90m│[39m 58 [90m│[39m 1696 [90m│[39m 1 [90m│[39m 28 (48.28%) [90m│[39m 848 (50.00%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m scheme [90m│[39m 2 [90m│[39m 70 [90m│[39m 498 [90m│[39m 1 [90m│[39m 32 (45.71%) [90m│[39m 225 (45.18%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m scss [90m│[39m 4 [90m│[39m 360 [90m│[39m 2065 [90m│[39m 3 [90m│[39m 136 (37.78%) [90m│[39m 875 (42.37%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m smalltalk [90m│[39m 2 [90m│[39m 102 [90m│[39m 351 [90m│[39m 1 [90m│[39m 44 (43.14%) [90m│[39m 146 (41.60%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m smarty [90m│[39m 2 [90m│[39m 92 [90m│[39m 652 [90m│[39m 1 [90m│[39m 42 (45.65%) [90m│[39m 286 (43.87%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m solidity [90m│[39m 2 [90m│[39m 155 [90m│[39m 939 [90m│[39m 1 [90m│[39m 30 (19.35%) [90m│[39m 168 (17.89%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m soy [90m│[39m 2 [90m│[39m 106 [90m│[39m 841 [90m│[39m 1 [90m│[39m 48 (45.28%) [90m│[39m 346 (41.14%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m sparql [90m│[39m 2 [90m│[39m 54 [90m│[39m 296 [90m│[39m 1 [90m│[39m 10 (18.52%) [90m│[39m 65 (21.96%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m sql [90m│[39m 2 [90m│[39m 102 [90m│[39m 525 [90m│[39m 1 [90m│[39m 38 (37.25%) [90m│[39m 214 (40.76%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m stylus [90m│[39m 2 [90m│[39m 129 [90m│[39m 494 [90m│[39m 1 [90m│[39m 52 (40.31%) [90m│[39m 201 (40.69%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m svelte [90m│[39m 2 [90m│[39m 462 [90m│[39m 1586 [90m│[39m 0 [90m│[39m 0 (0.00%) [90m│[39m 0 (0.00%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m swift [90m│[39m 2 [90m│[39m 58 [90m│[39m 175 [90m│[39m 1 [90m│[39m 20 (34.48%) [90m│[39m 73 (41.71%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m tap [90m│[39m 2 [90m│[39m 98 [90m│[39m 562 [90m│[39m 1 [90m│[39m 34 (34.69%) [90m│[39m 202 (35.94%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m tcl [90m│[39m 2 [90m│[39m 106 [90m│[39m 600 [90m│[39m 1 [90m│[39m 44 (41.51%) [90m│[39m 263 (43.83%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m text [90m│[39m 2 [90m│[39m 354 [90m│[39m 143 [90m│[39m 1 [90m│[39m 10 (2.82%) [90m│[39m 69 (48.25%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m textile [90m│[39m 2 [90m│[39m 106 [90m│[39m 495 [90m│[39m 1 [90m│[39m 50 (47.17%) [90m│[39m 236 (47.68%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m toml [90m│[39m 2 [90m│[39m 91 [90m│[39m 229 [90m│[39m 1 [90m│[39m 38 (41.76%) [90m│[39m 100 (43.67%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m tsx [90m│[39m 2 [90m│[39m 76 [90m│[39m 310 [90m│[39m 1 [90m│[39m 34 (44.74%) [90m│[39m 143 (46.13%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m tt2 [90m│[39m 2 [90m│[39m 104 [90m│[39m 803 [90m│[39m 2 [90m│[39m 47 (45.19%) [90m│[39m 353 (43.96%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m turtle [90m│[39m 2 [90m│[39m 90 [90m│[39m 520 [90m│[39m 1 [90m│[39m 35 (38.89%) [90m│[39m 212 (40.77%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m twig [90m│[39m 2 [90m│[39m 61 [90m│[39m 424 [90m│[39m 3 [90m│[39m 44 (72.13%) [90m│[39m 286 (67.45%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m txt [90m│[39m 4 [90m│[39m 146 [90m│[39m 870 [90m│[39m 2 [90m│[39m 71 (48.63%) [90m│[39m 435 (50.00%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m typescript [90m│[39m 12 [90m│[39m 2159 [90m│[39m 9379 [90m│[39m 8 [90m│[39m 958 (44.37%) [90m│[39m 4688 (49.98%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m unrealscript [90m│[39m 2 [90m│[39m 166 [90m│[39m 520 [90m│[39m 1 [90m│[39m 55 (33.13%) [90m│[39m 161 (30.96%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m vbnet [90m│[39m 2 [90m│[39m 72 [90m│[39m 378 [90m│[39m 1 [90m│[39m 28 (38.89%) [90m│[39m 163 (43.12%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m velocity [90m│[39m 2 [90m│[39m 88 [90m│[39m 576 [90m│[39m 1 [90m│[39m 40 (45.45%) [90m│[39m 264 (45.83%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m verilog [90m│[39m 2 [90m│[39m 104 [90m│[39m 430 [90m│[39m 1 [90m│[39m 39 (37.50%) [90m│[39m 163 (37.91%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m vhdl [90m│[39m 2 [90m│[39m 98 [90m│[39m 546 [90m│[39m 1 [90m│[39m 31 (31.63%) [90m│[39m 179 (32.78%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m vue [90m│[39m 4 [90m│[39m 587 [90m│[39m 3333 [90m│[39m 0 [90m│[39m 0 (0.00%) [90m│[39m 0 (0.00%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m wgsl [90m│[39m 2 [90m│[39m 127 [90m│[39m 928 [90m│[39m 2 [90m│[39m 52 (40.94%) [90m│[39m 340 (36.64%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m wolfram [90m│[39m 2 [90m│[39m 85 [90m│[39m 697 [90m│[39m 1 [90m│[39m 16 (18.82%) [90m│[39m 127 (18.22%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m xquery [90m│[39m 2 [90m│[39m 80 [90m│[39m 640 [90m│[39m 1 [90m│[39m 30 (37.50%) [90m│[39m 222 (34.69%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m yaml [90m│[39m 6 [90m│[39m 262 [90m│[39m 554 [90m│[39m 2 [90m│[39m 45 (17.18%) [90m│[39m 192 (34.66%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m zig [90m│[39m 2 [90m│[39m 130 [90m│[39m 827 [90m│[39m 2 [90m│[39m 52 (40.00%) [90m│[39m 311 (37.61%) [90m│[39m
[90m├────────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤[39m
[90m│[39m [1mTotal:[22m [90m│[39m 347 [90m│[39m 24603 [90m│[39m 130473 [90m│[39m 212 [90m│[39m 9133 (37.12%) [90m│[39m 56491 (43.30%) [90m│[39m
[90m└────────────────┴────────────────┴─────────────┴──────────────┴──────────────┴──────────────────┴───────────────────┘[39m
[90mFound 212 clones.[39m
[90mtime: 23.314ms[39m
[90m💡 Auto-refactor with AI: [1m[39mnpx skills add https://github.com/kucherenko/jscpd --skill dry-refactoring[90m[22m
[90m🎩 New: Gangsta Agents — discipline your AI coding → gangsta.page[39m
[90m💖 Support jscpd project → https://opencollective.com/jscpd[39m
npm package or from . Corrected this false claim
across all docs and rewrote rust/jscpd/README.md (the README npm
publishes as jscpd@5): added badges, supported-formats summary, CI
snippet, links section, and v4 differences table.
2026-06-22 18:35:46 +02:00
All three install the identical Rust binary and accept the same CLI options. Only the crates.io install exposes both command names from a single package.
docs: reorganize documentation into docs/ folder, separate v4/v5 docs
- Split the overloaded README.md into focused docs:
- docs/typescript.md: v4 (Node.js) CLI, reporters, API, config
- docs/rust.md: v5 (Rust) CLI, reporters, blame, differences from v4
- docs/ai-ready.md: AI reporter, agent skills, MCP server
- docs/api.md: Programming APIs (TypeScript and Rust)
- docs/packages.md: Monorepo package and crate overview
- Trim README.md to a concise entry point with links to docs/
- Slim down rust/README.md, rust/jscpd/README.md, rust/npm/README.md:
remove duplicated content, link to docs/rust.md for details
- Fix factual errors verified against actual CLI output:
- Format count: 223 (v5) and 224 (v4), not '225+'
- Reporter output filenames: jscpd-report.* not cpd.*
- --max-size: no default in v5 (not 512KB)
- --formats-exts: same hyphenated form in both v4 and v5
- --no-gitignore: same flag name in both v4 and v5
- Update rust/jscpd/package.json: add 'cpd' bin so jscpd@5
installs both jscpd and cpd commands
- Update crate versions in rust/README.md to match source (0.1.3/0.1.4)
2026-06-08 12:57:38 +02:00
## Performance
chore: make master v5-only
Everything belonging to the v4 TypeScript engine moves to the master-v4
branch: apps/, packages/, build-utils/, changesets, pnpm workspace, turbo,
the Node.js CI workflow and the ts-* release jobs. What remains is the
Rust workspace under rust/, the npm wrapper and platform packages, the
GitHub Action, Docker image, flake, skills, benchmark and fixtures/.
- rust.yml gains a smoke job that runs the release binary against
fixtures/ (json, sarif, html) and asserts clones and reporters
- release.yml keeps only the Rust jobs; pnpm removed from every workflow;
audit.yml keeps cargo audit + cargo deny; dependabot drops the root npm entry
- root package.json becomes a thin private package depending on the exact
jscpd@5 version so the pre-commit hook keeps installing the binary;
sync-version.mjs keeps it in step
- .pre-commit-hooks.yaml used v4-only flags that the v5 CLI rejects; fixed
- FORMATS.md is now generated from the Rust tokenizer (224 formats)
- README, docs, CONTRIBUTING, SECURITY, package and crate descriptions,
benchmark and skills rewritten for v5 on its own terms: no v5-vs-v4 speed
multipliers anywhere, a single "Looking for v4?" pointer to master-v4
2026-09-02 10:15:10 +02:00
A comparison against other copy/paste detectors (jscpd-rs, Duplo, Fallow, Simian, PMD CPD) on the repository's `fixtures/` corpus — timing, detection counts, cross-format detection and AI-token efficiency — is in [benchmark/BENCHMARK.md ](../benchmark/BENCHMARK.md ).
docs: reorganize documentation into docs/ folder, separate v4/v5 docs
- Split the overloaded README.md into focused docs:
- docs/typescript.md: v4 (Node.js) CLI, reporters, API, config
- docs/rust.md: v5 (Rust) CLI, reporters, blame, differences from v4
- docs/ai-ready.md: AI reporter, agent skills, MCP server
- docs/api.md: Programming APIs (TypeScript and Rust)
- docs/packages.md: Monorepo package and crate overview
- Trim README.md to a concise entry point with links to docs/
- Slim down rust/README.md, rust/jscpd/README.md, rust/npm/README.md:
remove duplicated content, link to docs/rust.md for details
- Fix factual errors verified against actual CLI output:
- Format count: 223 (v5) and 224 (v4), not '225+'
- Reporter output filenames: jscpd-report.* not cpd.*
- --max-size: no default in v5 (not 512KB)
- --formats-exts: same hyphenated form in both v4 and v5
- --no-gitignore: same flag name in both v4 and v5
- Update rust/jscpd/package.json: add 'cpd' bin so jscpd@5
installs both jscpd and cpd commands
- Update crate versions in rust/README.md to match source (0.1.3/0.1.4)
2026-06-08 12:57:38 +02:00
## Installation
``` bash
chore: make master v5-only
Everything belonging to the v4 TypeScript engine moves to the master-v4
branch: apps/, packages/, build-utils/, changesets, pnpm workspace, turbo,
the Node.js CI workflow and the ts-* release jobs. What remains is the
Rust workspace under rust/, the npm wrapper and platform packages, the
GitHub Action, Docker image, flake, skills, benchmark and fixtures/.
- rust.yml gains a smoke job that runs the release binary against
fixtures/ (json, sarif, html) and asserts clones and reporters
- release.yml keeps only the Rust jobs; pnpm removed from every workflow;
audit.yml keeps cargo audit + cargo deny; dependabot drops the root npm entry
- root package.json becomes a thin private package depending on the exact
jscpd@5 version so the pre-commit hook keeps installing the binary;
sync-version.mjs keeps it in step
- .pre-commit-hooks.yaml used v4-only flags that the v5 CLI rejects; fixed
- FORMATS.md is now generated from the Rust tokenizer (224 formats)
- README, docs, CONTRIBUTING, SECURITY, package and crate descriptions,
benchmark and skills rewritten for v5 on its own terms: no v5-vs-v4 speed
multipliers anywhere, a single "Looking for v4?" pointer to master-v4
2026-09-02 10:15:10 +02:00
# npm — installs the jscpd command
npm install -g jscpd
docs: reorganize documentation into docs/ folder, separate v4/v5 docs
- Split the overloaded README.md into focused docs:
- docs/typescript.md: v4 (Node.js) CLI, reporters, API, config
- docs/rust.md: v5 (Rust) CLI, reporters, blame, differences from v4
- docs/ai-ready.md: AI reporter, agent skills, MCP server
- docs/api.md: Programming APIs (TypeScript and Rust)
- docs/packages.md: Monorepo package and crate overview
- Trim README.md to a concise entry point with links to docs/
- Slim down rust/README.md, rust/jscpd/README.md, rust/npm/README.md:
remove duplicated content, link to docs/rust.md for details
- Fix factual errors verified against actual CLI output:
- Format count: 223 (v5) and 224 (v4), not '225+'
- Reporter output filenames: jscpd-report.* not cpd.*
- --max-size: no default in v5 (not 512KB)
- --formats-exts: same hyphenated form in both v4 and v5
- --no-gitignore: same flag name in both v4 and v5
- Update rust/jscpd/package.json: add 'cpd' bin so jscpd@5
installs both jscpd and cpd commands
- Update crate versions in rust/README.md to match source (0.1.3/0.1.4)
2026-06-08 12:57:38 +02:00
jscpd /path/to/code
# npm — installs only the cpd command (lighter)
npm install -g cpd
cpd /path/to/code
# crates.io — Rust-native install (exposes both jscpd and cpd commands)
cargo install jscpd
jscpd /path/to/code
cpd /path/to/code
2026-06-14 14:38:52 +02:00
# Nix — run without installing
nix run github:kucherenko/jscpd -- /path/to/code
# Nix — install permanently
nix profile install github:kucherenko/jscpd
# Homebrew (macOS/Linux)
brew install jscpd
feat(release): publish jscpd platform wheels to PyPI
Closes #1037.
Adds rust/scripts/build-pypi-wheels.py, which repacks the eight
jscpd-<platform>.tar.gz release tarballs into platform wheels: the same
binary under <pkg>.data/scripts/ as both `jscpd` and `cpd`, one wheel
per target, stdlib only, no maturin and no recompilation. glibc wheels
take their manylinux floor from the GLIBC_x.y symbols in the binary
(manylinux_2_34 today), musl builds are static so they tag as
musllinux_1_2, macOS and Windows use the Rust minimums. Semver
pre-releases map to PEP 440 (5.3.0-beta.1 -> 5.3.0b1); other labels
fail rather than guess.
release.yml gains a rust-publish-pypi job after the npm publish: it
takes the binary artifacts from this run, refills any missing target
from the published npm platform package (resumed releases, or a version
already on npm), builds the wheels, pip-installs the matching one and
checks `jscpd --version` and `cpd --version`, then uploads with PyPI
trusted publishing (environment `pypi`, no token, skip-existing). The
detect job treats a version missing from PyPI as pending, so the wheels
for the current release publish on the next push to master without a
new release commit. The GitHub release lists the PyPI package and waits
on the upload the same way it waits on crates.io and npm.
Docs: PyPI in the README install table and packages table, rust/README
and docs/rust.md install sections, and a `language: python` pre-commit
option in docs/ci-and-hooks.md so the hook no longer needs Node.js.
Claude-Session: https://claude.ai/code/session_01WztdFKZAwW9b51iJe9zhtV
2026-09-10 13:56:08 +02:00
# PyPI — platform wheels with the same binary (pip, pipx, uv)
pip install jscpd
uvx jscpd /path/to/code
docs: reorganize documentation into docs/ folder, separate v4/v5 docs
- Split the overloaded README.md into focused docs:
- docs/typescript.md: v4 (Node.js) CLI, reporters, API, config
- docs/rust.md: v5 (Rust) CLI, reporters, blame, differences from v4
- docs/ai-ready.md: AI reporter, agent skills, MCP server
- docs/api.md: Programming APIs (TypeScript and Rust)
- docs/packages.md: Monorepo package and crate overview
- Trim README.md to a concise entry point with links to docs/
- Slim down rust/README.md, rust/jscpd/README.md, rust/npm/README.md:
remove duplicated content, link to docs/rust.md for details
- Fix factual errors verified against actual CLI output:
- Format count: 223 (v5) and 224 (v4), not '225+'
- Reporter output filenames: jscpd-report.* not cpd.*
- --max-size: no default in v5 (not 512KB)
- --formats-exts: same hyphenated form in both v4 and v5
- --no-gitignore: same flag name in both v4 and v5
- Update rust/jscpd/package.json: add 'cpd' bin so jscpd@5
installs both jscpd and cpd commands
- Update crate versions in rust/README.md to match source (0.1.3/0.1.4)
2026-06-08 12:57:38 +02:00
```
chore: apply audit fixes across repo, crates, npm wrapper and pipelines
Rust / crates.io
- report the invoked binary name in --version/--help (jscpd vs cpd)
- add repository, documentation, keywords, categories to all crates
- exclude tests/ from the jscpd crate package; add cargo-binstall metadata
- expand the crates.io README and render it on docs.rs
npm
- add funding field to jscpd, cpd and jscpd@4 packages
- add jscpd-linux-arm64-musl platform package and clearer unsupported-platform error
- enable provenance for the v4 changeset publish
Pipelines
- rust.yml: windows-latest in the matrix, drop dead schedule guard
- release.yml: cosign-sign release assets, floating v5 tag, LICENSE in tarballs,
invoke the new docker.yml (GHCR multi-arch image) after each release
- audit.yml: nightly cargo audit, cargo deny and pnpm audit
- Dockerfile: multi-stage image from release binaries (distroless), mcp target for Glama
Docs / community
- README: shields badges, single primary install per OS, GitHub Action snippet,
link to jscpd.dev, v5.1 features, 15 reporters, 224 formats, 8 platforms
- docs: @v5 action tag, Docker usage, baseline section, current crate versions
- YAML issue forms with engine selector, config.yml, CODEOWNERS
- remove stale .github/CONTRIBUTING.md stub, custom.md, TODO.md; untrack rust/jscpd-report.json
- examples: mark as v4 API, add a Rust cpd-finder example
2026-09-02 09:57:06 +02:00
The npm packages ship prebuilt binaries for 8 platforms — no Node.js runtime is required, the binary is self-contained:
| Platform | npm package | Rust target |
|----------|-------------|-------------|
| macOS arm64 | `jscpd-darwin-arm64` | `aarch64-apple-darwin` |
| macOS x64 | `jscpd-darwin-x64` | `x86_64-apple-darwin` |
| Linux arm64 (glibc) | `jscpd-linux-arm64-gnu` | `aarch64-unknown-linux-gnu` |
| Linux arm64 (musl) | `jscpd-linux-arm64-musl` | `aarch64-unknown-linux-musl` |
| Linux x64 (glibc) | `jscpd-linux-x64-gnu` | `x86_64-unknown-linux-gnu` |
| Linux x64 (musl) | `jscpd-linux-x64-musl` | `x86_64-unknown-linux-musl` |
| Windows arm64 | `jscpd-windows-arm64-msvc` | `aarch64-pc-windows-msvc` |
| Windows x64 | `jscpd-windows-x64-msvc` | `x86_64-pc-windows-msvc` |
The same binaries are attached to every [GitHub Release ](https://github.com/kucherenko/jscpd/releases ) as `jscpd-<platform>.tar.gz` with a `checksums.txt` and SLSA provenance, and packaged as a multi-arch Docker image at `ghcr.io/kucherenko/jscpd` (see [CI docs ](ci-and-hooks.md#docker )).
docs: reorganize documentation into docs/ folder, separate v4/v5 docs
- Split the overloaded README.md into focused docs:
- docs/typescript.md: v4 (Node.js) CLI, reporters, API, config
- docs/rust.md: v5 (Rust) CLI, reporters, blame, differences from v4
- docs/ai-ready.md: AI reporter, agent skills, MCP server
- docs/api.md: Programming APIs (TypeScript and Rust)
- docs/packages.md: Monorepo package and crate overview
- Trim README.md to a concise entry point with links to docs/
- Slim down rust/README.md, rust/jscpd/README.md, rust/npm/README.md:
remove duplicated content, link to docs/rust.md for details
- Fix factual errors verified against actual CLI output:
- Format count: 223 (v5) and 224 (v4), not '225+'
- Reporter output filenames: jscpd-report.* not cpd.*
- --max-size: no default in v5 (not 512KB)
- --formats-exts: same hyphenated form in both v4 and v5
- --no-gitignore: same flag name in both v4 and v5
- Update rust/jscpd/package.json: add 'cpd' bin so jscpd@5
installs both jscpd and cpd commands
- Update crate versions in rust/README.md to match source (0.1.3/0.1.4)
2026-06-08 12:57:38 +02:00
## CLI Usage
chore: make master v5-only
Everything belonging to the v4 TypeScript engine moves to the master-v4
branch: apps/, packages/, build-utils/, changesets, pnpm workspace, turbo,
the Node.js CI workflow and the ts-* release jobs. What remains is the
Rust workspace under rust/, the npm wrapper and platform packages, the
GitHub Action, Docker image, flake, skills, benchmark and fixtures/.
- rust.yml gains a smoke job that runs the release binary against
fixtures/ (json, sarif, html) and asserts clones and reporters
- release.yml keeps only the Rust jobs; pnpm removed from every workflow;
audit.yml keeps cargo audit + cargo deny; dependabot drops the root npm entry
- root package.json becomes a thin private package depending on the exact
jscpd@5 version so the pre-commit hook keeps installing the binary;
sync-version.mjs keeps it in step
- .pre-commit-hooks.yaml used v4-only flags that the v5 CLI rejects; fixed
- FORMATS.md is now generated from the Rust tokenizer (224 formats)
- README, docs, CONTRIBUTING, SECURITY, package and crate descriptions,
benchmark and skills rewritten for v5 on its own terms: no v5-vs-v4 speed
multipliers anywhere, a single "Looking for v4?" pointer to master-v4
2026-09-02 10:15:10 +02:00
The `jscpd` command is available after installing `jscpd` from npm; the `cpd` command is available after installing either `cpd` (npm) or `jscpd` (crates.io). Both commands accept the same options and are identical:
docs: reorganize documentation into docs/ folder, separate v4/v5 docs
- Split the overloaded README.md into focused docs:
- docs/typescript.md: v4 (Node.js) CLI, reporters, API, config
- docs/rust.md: v5 (Rust) CLI, reporters, blame, differences from v4
- docs/ai-ready.md: AI reporter, agent skills, MCP server
- docs/api.md: Programming APIs (TypeScript and Rust)
- docs/packages.md: Monorepo package and crate overview
- Trim README.md to a concise entry point with links to docs/
- Slim down rust/README.md, rust/jscpd/README.md, rust/npm/README.md:
remove duplicated content, link to docs/rust.md for details
- Fix factual errors verified against actual CLI output:
- Format count: 223 (v5) and 224 (v4), not '225+'
- Reporter output filenames: jscpd-report.* not cpd.*
- --max-size: no default in v5 (not 512KB)
- --formats-exts: same hyphenated form in both v4 and v5
- --no-gitignore: same flag name in both v4 and v5
- Update rust/jscpd/package.json: add 'cpd' bin so jscpd@5
installs both jscpd and cpd commands
- Update crate versions in rust/README.md to match source (0.1.3/0.1.4)
2026-06-08 12:57:38 +02:00
``` bash
jscpd [ OPTIONS] [ PATH] ...
2026-09-17 18:37:20 +02:00
jscpd [ OPTIONS] [ PATH] ...
docs: reorganize documentation into docs/ folder, separate v4/v5 docs
- Split the overloaded README.md into focused docs:
- docs/typescript.md: v4 (Node.js) CLI, reporters, API, config
- docs/rust.md: v5 (Rust) CLI, reporters, blame, differences from v4
- docs/ai-ready.md: AI reporter, agent skills, MCP server
- docs/api.md: Programming APIs (TypeScript and Rust)
- docs/packages.md: Monorepo package and crate overview
- Trim README.md to a concise entry point with links to docs/
- Slim down rust/README.md, rust/jscpd/README.md, rust/npm/README.md:
remove duplicated content, link to docs/rust.md for details
- Fix factual errors verified against actual CLI output:
- Format count: 223 (v5) and 224 (v4), not '225+'
- Reporter output filenames: jscpd-report.* not cpd.*
- --max-size: no default in v5 (not 512KB)
- --formats-exts: same hyphenated form in both v4 and v5
- --no-gitignore: same flag name in both v4 and v5
- Update rust/jscpd/package.json: add 'cpd' bin so jscpd@5
installs both jscpd and cpd commands
- Update crate versions in rust/README.md to match source (0.1.3/0.1.4)
2026-06-08 12:57:38 +02:00
```
### Options
| Option | Short | Description | Default |
|--------|-------|-------------|---------|
| `--min-tokens` | `-k` | Minimum tokens in a clone | 50 |
| `--min-lines` | `-l` | Minimum lines in a clone | 5 |
| `--max-lines` | `-x` | Maximum source file lines | — |
| `--max-size` | `-z` | Skip files larger than SIZE (e.g. `1kb` , `1mb` , `100kb` ) | no limit |
| `--mode` | `-m` | Detection mode: `mild` , `weak` , `strict` | `mild` |
2026-09-05 09:15:58 +02:00
| `--ignore-pattern` | | Comma-separated regular expressions; source text matched by a pattern is excluded from clone detection. See [Ignoring source regions ](#ignoring-source-regions ) | — |
2026-06-08 14:20:05 +02:00
| `--workers` | | Number of worker threads for parallel tokenization/detection | auto (all CPU cores) |
docs: reorganize documentation into docs/ folder, separate v4/v5 docs
- Split the overloaded README.md into focused docs:
- docs/typescript.md: v4 (Node.js) CLI, reporters, API, config
- docs/rust.md: v5 (Rust) CLI, reporters, blame, differences from v4
- docs/ai-ready.md: AI reporter, agent skills, MCP server
- docs/api.md: Programming APIs (TypeScript and Rust)
- docs/packages.md: Monorepo package and crate overview
- Trim README.md to a concise entry point with links to docs/
- Slim down rust/README.md, rust/jscpd/README.md, rust/npm/README.md:
remove duplicated content, link to docs/rust.md for details
- Fix factual errors verified against actual CLI output:
- Format count: 223 (v5) and 224 (v4), not '225+'
- Reporter output filenames: jscpd-report.* not cpd.*
- --max-size: no default in v5 (not 512KB)
- --formats-exts: same hyphenated form in both v4 and v5
- --no-gitignore: same flag name in both v4 and v5
- Update rust/jscpd/package.json: add 'cpd' bin so jscpd@5
installs both jscpd and cpd commands
- Update crate versions in rust/README.md to match source (0.1.3/0.1.4)
2026-06-08 12:57:38 +02:00
| `--no-colors` | | Disable ANSI color output | off |
| `--absolute` | `-a` | Use absolute paths in reports | off |
fix(walk): report symlinked files by their walked path and scan each file once
With `--follow-symlinks` the source id was the canonical path, so a file
reached through a link showed up as an absolute path outside the scan
root, `--ignore` (matched on the walked path) and the report disagreed
about its name, and a file reachable through two paths was two sources
(a file symlink next to its target even became a clone of itself).
The walked path, anchored at the canonical scan root, is now the id:
what reports show, what `--ignore` matches, what `--absolute` prints.
The canonical path travels alongside (`DiscoveredFile::real_path`,
`PreparedSource::real_path`) for reading the file and for the
`--skip-local` / `--skip-isolated` prefix checks. When links are
followed, files whose canonical path was already seen are dropped; the
entry that is the real file wins, else the first walked path.
Docs: `--follow-symlinks` row in the option table, the v4 default in the
migration table and README. Fixture `fixtures/follow-symlinks-demo`.
Closes #1059
Claude-Session: https://claude.ai/code/session_01WztdFKZAwW9b51iJe9zhtV
2026-09-14 20:35:29 +02:00
| `--follow-symlinks` | | Follow symbolic links while walking. A file reached through a link is reported by the path it was found at (relative to the scan root, like any other file), and a file reachable through several paths is scanned once. v4 followed links by default | off |
docs: reorganize documentation into docs/ folder, separate v4/v5 docs
- Split the overloaded README.md into focused docs:
- docs/typescript.md: v4 (Node.js) CLI, reporters, API, config
- docs/rust.md: v5 (Rust) CLI, reporters, blame, differences from v4
- docs/ai-ready.md: AI reporter, agent skills, MCP server
- docs/api.md: Programming APIs (TypeScript and Rust)
- docs/packages.md: Monorepo package and crate overview
- Trim README.md to a concise entry point with links to docs/
- Slim down rust/README.md, rust/jscpd/README.md, rust/npm/README.md:
remove duplicated content, link to docs/rust.md for details
- Fix factual errors verified against actual CLI output:
- Format count: 223 (v5) and 224 (v4), not '225+'
- Reporter output filenames: jscpd-report.* not cpd.*
- --max-size: no default in v5 (not 512KB)
- --formats-exts: same hyphenated form in both v4 and v5
- --no-gitignore: same flag name in both v4 and v5
- Update rust/jscpd/package.json: add 'cpd' bin so jscpd@5
installs both jscpd and cpd commands
- Update crate versions in rust/README.md to match source (0.1.3/0.1.4)
2026-06-08 12:57:38 +02:00
| `--ignore-case` | | Ignore case of symbols in code (experimental) | off |
feat: Type-2 clone detection (--ignore-identifiers, --ignore-literals, --ignore-annotations)
Closes #998.
Three opt-in flags (config keys ignoreIdentifiers, ignoreLiterals,
ignoreAnnotations) normalize token classes before hashing so that blocks
which differ only in names, values or annotations are detected:
- identifiers hash as `$id`; keywords are kept (the JS/TS tokenizer
classifies them, other languages use a built-in common-keyword list)
- string literals hash as `$str`, numeric literals as `$num`
- `@Name`, `@a.b.Name` and `@Name(...)` runs are dropped in Java, Kotlin,
Scala, Groovy, Python, Dart, Swift, JavaScript and TypeScript
Each clone now carries `kind: exact | renamed`. DetectionToken gains a
raw_hash (equal to hash unless normalization rewrote the token); the
PreparedSource materializes raw hashes only when a token was normalized,
and the detector compares raw hashes over the matched run to classify a
pair. A dropped annotation salts the raw hash of the token before it, so a
pair differing only in annotations inside the matched run is `renamed`.
Reporters: console prints `Clone found (fmt, renamed)`, ai appends
`(renamed)`, json adds "kind", sarif uses rule jscpd/similar-code (declared
only when referenced), codeclimate the same check_name. Default runs are
unchanged apart from the additive "kind": "exact" JSON field.
Also: GitHub Action inputs, docs section, fixtures/type2-demo with a README
of runnable commands, unit tests in tokenizer/core/reporter, CLI flag
tests, and a binary-level integration test.
2026-09-05 11:06:23 +02:00
| `--ignore-identifiers` | | Treat all identifiers as equal, so clones that differ only in variable, function or type names are found. See [Type-2 clones ](#type-2-clones-renamed-identifiers-literals-and-annotations ) | off |
| `--ignore-literals` | | Treat all string literals as equal and all numeric literals as equal | off |
| `--ignore-annotations` | | Skip annotations and decorators (`@Name` , `@Name(...)` ) before detection | off |
feat: near-miss clone merging with --max-gap-lines (Type-3, stage 1 of #999)
Off by default (0). When set to N, clones of the same file pair whose
fragments follow each other in both files with at most N unmatched lines
between them are merged into one clone of kind `similar`, with `tokens` =
matched tokens and `similarity` = matched tokens over the tokens of the
longer merged span. Adjacent exact windows that share a boundary token are
counted once; chains merge transitively; overlapping or reordered fragments
never merge. The pass runs after every other filter and returns its input
untouched at 0, so default output is unchanged.
Reporting: console `Clone found (fmt, similar ~0.91)`, ai `[~0.91]`, JSON
"kind"/"similarity" (rounded to three decimals), SARIF rule
jscpd/near-miss-code with a similarity property (declared only when
referenced), Code Climate check_name.
Config key maxGapLines (kebab alias), GitHub Action input max-gap-lines,
docs section, fixtures/type3-demo with a README of runnable commands, unit
tests for the merge pass and reporters, and a binary-level integration test.
2026-09-06 08:55:12 +02:00
| `--max-gap-lines` | | Merge clones of one file pair separated by at most N unmatched lines in both files into one near-miss clone reported as `similar` . See [Type-3 clones ](#type-3-clones-near-miss-merging-with---max-gap-lines ) | 0 (off) |
2026-09-06 18:01:38 +02:00
| `--similarity` | | Report JavaScript/TypeScript function pairs whose syntax-tree similarity reaches RATIO, a number in `(0, 1]` , as `similar` clones; `1` means exact matches only. See [function similarity ](#function-level-similarity-with---similarity ) | 1 (off) |
feat(cli): --dashboard with duplication, complexity and dead code
--dashboard prints one screen: project size and largest formats,
duplication with clones per kind and the most duplicated files, total and
mean complexity with the most complex files, and dead code by category
with the largest findings (JavaScript, TypeScript, Python). The dead-code
scan runs beside clone detection; --summary-top sets the rows per list.
Data formats (JSON, YAML, TOML, CSV, ...) join markdown at complexity 0,
so a lock file's version ranges no longer top the complexity ranking.
Docs for --kind, --complexity and --dashboard; fixtures/dashboard-demo,
plus --kind and --complexity sections in the type3 and summary demos.
2026-09-17 18:15:45 +02:00
| `--kind` | | Report only clones of these kinds, comma-separated: `exact` , `renamed` , `similar` , `gap` , `ast` . See [Filtering by kind ](#filtering-by-kind-with---kind ) | all |
docs: reorganize documentation into docs/ folder, separate v4/v5 docs
- Split the overloaded README.md into focused docs:
- docs/typescript.md: v4 (Node.js) CLI, reporters, API, config
- docs/rust.md: v5 (Rust) CLI, reporters, blame, differences from v4
- docs/ai-ready.md: AI reporter, agent skills, MCP server
- docs/api.md: Programming APIs (TypeScript and Rust)
- docs/packages.md: Monorepo package and crate overview
- Trim README.md to a concise entry point with links to docs/
- Slim down rust/README.md, rust/jscpd/README.md, rust/npm/README.md:
remove duplicated content, link to docs/rust.md for details
- Fix factual errors verified against actual CLI output:
- Format count: 223 (v5) and 224 (v4), not '225+'
- Reporter output filenames: jscpd-report.* not cpd.*
- --max-size: no default in v5 (not 512KB)
- --formats-exts: same hyphenated form in both v4 and v5
- --no-gitignore: same flag name in both v4 and v5
- Update rust/jscpd/package.json: add 'cpd' bin so jscpd@5
installs both jscpd and cpd commands
- Update crate versions in rust/README.md to match source (0.1.3/0.1.4)
2026-06-08 12:57:38 +02:00
| `--formats-exts` | | Custom format-to-extension mapping (e.g. `javascript:es,es6;dart:dt` ) | — |
| `--formats-names` | | Custom format-to-filename mapping | — |
feat(rust): add --cross-formats for cross-format clone detection (#810)
Detect duplicates across related formats via format equivalence groups
sharing one comparison pool, e.g. --cross-formats "javascript,typescript"
or the js-ts preset (javascript,jsx,typescript,tsx).
When a group mixes TypeScript with JavaScript, TS files are compared with
erasable type-only syntax stripped from the detection token stream (type
annotations, generics, interface/type declarations, as/satisfies, ?/!
markers, access modifiers, implements clauses, type-only imports/exports,
overload signatures, declare statements) so that
`function f(a: number): void` matches `function f(a)`. Stripping is
AST-driven (oxc_ast_visit over the already-parsed program) and only drops
tokens, so reported clone positions always reference the original source.
- cpd-tokenizer: new ts_strip module, tokenize_js_stripped,
TokenizeOptions.strip_types_formats (empty by default)
- cpd-finder: RunConfig.cross_formats, build_pools() pool grouping,
strip-set computation for TS-family formats grouped with JS
- cpd: --cross-formats flag, crossFormats config field (string,
array-of-strings, or array-of-arrays), js-ts preset, overlap merging,
unknown-format warnings, --debug output
- docs: rust.md option + Cross-Format Groups section, CHANGELOG entry
- tests: tokenizer strip tests, pool unit tests, cross-pool core test,
cpd-finder integration tests, CLI parse/config tests, e2e binary tests
with fixtures; default behavior unchanged (golden parity intact)
Non-erasable TS syntax with runtime semantics (enum, non-declare
namespace, parameter properties, import =, export =) is left intact and
will not cross-match. Cross-format clones are attributed to one member
format in per-format statistics.
Closes #810
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-23 08:44:08 +02:00
| `--cross-formats` | | Detect clones across formats: `;` -separated groups of `,` -separated formats (e.g. `javascript,typescript` ). Preset `js-ts` = `javascript,jsx,typescript,tsx` | — |
docs: reorganize documentation into docs/ folder, separate v4/v5 docs
- Split the overloaded README.md into focused docs:
- docs/typescript.md: v4 (Node.js) CLI, reporters, API, config
- docs/rust.md: v5 (Rust) CLI, reporters, blame, differences from v4
- docs/ai-ready.md: AI reporter, agent skills, MCP server
- docs/api.md: Programming APIs (TypeScript and Rust)
- docs/packages.md: Monorepo package and crate overview
- Trim README.md to a concise entry point with links to docs/
- Slim down rust/README.md, rust/jscpd/README.md, rust/npm/README.md:
remove duplicated content, link to docs/rust.md for details
- Fix factual errors verified against actual CLI output:
- Format count: 223 (v5) and 224 (v4), not '225+'
- Reporter output filenames: jscpd-report.* not cpd.*
- --max-size: no default in v5 (not 512KB)
- --formats-exts: same hyphenated form in both v4 and v5
- --no-gitignore: same flag name in both v4 and v5
- Update rust/jscpd/package.json: add 'cpd' bin so jscpd@5
installs both jscpd and cpd commands
- Update crate versions in rust/README.md to match source (0.1.3/0.1.4)
2026-06-08 12:57:38 +02:00
| `--list` | | List all supported formats and exit | — |
| `--skip-local` | | Skip clones where both fragments are in the same directory | off |
2026-08-17 19:37:21 +02:00
| `--skip-isolated` | | Skip clones between different folders of the same isolation group: `,` -separated groups of `\|` -separated folders (e.g. `packages/a\|packages/b` ). Useful in monorepos where teams own separate packages | — |
chore: apply audit fixes across repo, crates, npm wrapper and pipelines
Rust / crates.io
- report the invoked binary name in --version/--help (jscpd vs cpd)
- add repository, documentation, keywords, categories to all crates
- exclude tests/ from the jscpd crate package; add cargo-binstall metadata
- expand the crates.io README and render it on docs.rs
npm
- add funding field to jscpd, cpd and jscpd@4 packages
- add jscpd-linux-arm64-musl platform package and clearer unsupported-platform error
- enable provenance for the v4 changeset publish
Pipelines
- rust.yml: windows-latest in the matrix, drop dead schedule guard
- release.yml: cosign-sign release assets, floating v5 tag, LICENSE in tarballs,
invoke the new docker.yml (GHCR multi-arch image) after each release
- audit.yml: nightly cargo audit, cargo deny and pnpm audit
- Dockerfile: multi-stage image from release binaries (distroless), mcp target for Glama
Docs / community
- README: shields badges, single primary install per OS, GitHub Action snippet,
link to jscpd.dev, v5.1 features, 15 reporters, 224 formats, 8 platforms
- docs: @v5 action tag, Docker usage, baseline section, current crate versions
- YAML issue forms with engine selector, config.yml, CODEOWNERS
- remove stale .github/CONTRIBUTING.md stub, custom.md, TODO.md; untrack rust/jscpd-report.json
- examples: mark as v4 API, add a Rust cpd-finder example
2026-09-02 09:57:06 +02:00
| `--baseline` | | Clone baseline file (e.g. `.jscpd-baseline.json` ): clones whose fingerprint is absent from it are reported as new. See [Baseline ](#baseline ) | — |
| `--update-baseline` | | Rewrite the baseline file from the current run, creating it if missing (requires `--baseline` ) | off |
| `--fail-on-new-clones` | | Exit 1 when more than N new clones are found (`--fail-on-new-clones` alone means N=0; requires `--baseline` or `--baseline-from-ref` ) | — |
feat(cli): non-zero exit for unknown format, missing path, failed reporter; add --fail-on-empty
Closes #1047.
Four situations used to write an empty report and exit 0, so a CI job
that checks only the exit code saw a green run:
- `--format` naming a format that is not supported (a warning since #964)
is now `Error: --format: 'x' is not a supported format`, exit 1. Names
introduced through --formats-exts or --formats-names stay accepted.
- A scan path that does not exist is `Error: path does not exist: <p>`,
exit 1, before anything runs.
- A reporter that fails to write its output still prints the existing
`Reporter '<name>' error: ...` line; the run now ends with
`ERROR: a reporter failed to write its output` and exit 1, after the
other reporters have run.
- A scan that analyzes no files (paths exist, but nothing matched the
--format/--ignore/--pattern filters or every file was below
--min-tokens) prints `Warning: jscpd analyzed no files` and still
exits 0, so an intentionally empty tree passes. The new
`--fail-on-empty` flag (config key `failOnEmpty`, action input
`fail-on-empty`) makes it exit 1. Reports are written before the check.
Docs: an "Exit codes" section in docs/rust.md, option rows in
docs/rust.md and docs/ci-and-hooks.md, a README feature bullet.
Fixtures: fixtures/fail-on-empty-demo with a `code/` clone pair, a
`nothing/` comment-only file, and a README quoting every command's
output and exit code. Tests: the #964 warning test becomes an error
test, plus integration tests for each new exit path and for the config
key; 531 tests pass, clippy clean.
Claude-Session: https://claude.ai/code/session_01WztdFKZAwW9b51iJe9zhtV
2026-09-11 08:45:09 +02:00
| `--fail-on-empty` | | Exit 1 when the scan analyzes no files: the paths exist but nothing matched the `--format` , `--ignore` and `--pattern` filters, or every file was below `--min-tokens` . See [Exit codes ](#exit-codes ) | off |
chore: apply audit fixes across repo, crates, npm wrapper and pipelines
Rust / crates.io
- report the invoked binary name in --version/--help (jscpd vs cpd)
- add repository, documentation, keywords, categories to all crates
- exclude tests/ from the jscpd crate package; add cargo-binstall metadata
- expand the crates.io README and render it on docs.rs
npm
- add funding field to jscpd, cpd and jscpd@4 packages
- add jscpd-linux-arm64-musl platform package and clearer unsupported-platform error
- enable provenance for the v4 changeset publish
Pipelines
- rust.yml: windows-latest in the matrix, drop dead schedule guard
- release.yml: cosign-sign release assets, floating v5 tag, LICENSE in tarballs,
invoke the new docker.yml (GHCR multi-arch image) after each release
- audit.yml: nightly cargo audit, cargo deny and pnpm audit
- Dockerfile: multi-stage image from release binaries (distroless), mcp target for Glama
Docs / community
- README: shields badges, single primary install per OS, GitHub Action snippet,
link to jscpd.dev, v5.1 features, 15 reporters, 224 formats, 8 platforms
- docs: @v5 action tag, Docker usage, baseline section, current crate versions
- YAML issue forms with engine selector, config.yml, CODEOWNERS
- remove stale .github/CONTRIBUTING.md stub, custom.md, TODO.md; untrack rust/jscpd-report.json
- examples: mark as v4 API, add a Rust cpd-finder example
2026-09-02 09:57:06 +02:00
| `--baseline-from-ref` | | Compare against an ephemeral baseline built from a git ref's tree (e.g. `origin/main` ). Conflicts with `--baseline` | — |
2026-08-13 10:19:41 +02:00
| `--sarif-error-tokens` | | Report SARIF results as `error` for clones with at least this many tokens (smaller clones stay `warning` ). When overall duplication exceeds `--threshold` , all SARIF results become `error` regardless of size. | — (all `warning` ) |
docs: reorganize documentation into docs/ folder, separate v4/v5 docs
- Split the overloaded README.md into focused docs:
- docs/typescript.md: v4 (Node.js) CLI, reporters, API, config
- docs/rust.md: v5 (Rust) CLI, reporters, blame, differences from v4
- docs/ai-ready.md: AI reporter, agent skills, MCP server
- docs/api.md: Programming APIs (TypeScript and Rust)
- docs/packages.md: Monorepo package and crate overview
- Trim README.md to a concise entry point with links to docs/
- Slim down rust/README.md, rust/jscpd/README.md, rust/npm/README.md:
remove duplicated content, link to docs/rust.md for details
- Fix factual errors verified against actual CLI output:
- Format count: 223 (v5) and 224 (v4), not '225+'
- Reporter output filenames: jscpd-report.* not cpd.*
- --max-size: no default in v5 (not 512KB)
- --formats-exts: same hyphenated form in both v4 and v5
- --no-gitignore: same flag name in both v4 and v5
- Update rust/jscpd/package.json: add 'cpd' bin so jscpd@5
installs both jscpd and cpd commands
- Update crate versions in rust/README.md to match source (0.1.3/0.1.4)
2026-06-08 12:57:38 +02:00
| `--min-duplicated-lines` | | Minimum percentage of duplication to report (0-100) | 0 |
feat(rust): MCP server over stdio transport (--mcp)
Closes the gap reported in #891: the HTTP-only jscpd-server cannot be
used by MCP clients that spawn and manage a stdio process themselves
(Claude Desktop/Code, Cursor, APM, ...). The Rust binary now serves the
Model Context Protocol directly:
cpd --mcp /path/to/project
Transport & protocol:
- newline-delimited JSON-RPC 2.0 on stdin/stdout; stdout carries
protocol messages only, logging goes to stderr; exits 0 on stdin EOF
- protocol revision 2025-06-18, accepting 2025-03-26 and 2024-11-05
clients via version negotiation; ping, tools/list, tools/call;
notifications ignored; parse errors reported (-32700) without
killing the session
Tools (mirroring the HTTP jscpd-server):
- check_duplication(code, format) — checks a snippet against the
scanned project; results are compact JSON in a text content block
with file/snippet line ranges; unknown formats and sub-threshold
snippets produce informative results
- get_statistics() — files, clones, full Statistics of the last scan
- check_current_directory() — re-scan the configured paths
Performance: the project is scanned once at startup and cached as
detection-ready token hashes (PreparedSource pools per format /
cross-format group), so snippet checks only tokenize the snippet and
run one pool detection — milliseconds even on large codebases. All
standard detection options (--min-tokens, --format, --cross-formats,
--ignore, ...) apply to the scan and to snippet checks.
Supporting refactor in cpd-finder: orchestrate::run() split into
build_thread_pool() + prepare_scan_in() (walk + tokenize, returning
PreparedScan) so the MCP server can keep prepared sources around;
run() behavior is unchanged and detect_prepared is untouched.
strip_types_formats made pub for snippet tokenization parity;
PreparedSource now derives Clone. hyperfine A/B vs a master-built
baseline shows no regression on the normal CLI path (39.0ms vs
41.2ms, within noise).
Tests: 12 unit tests for the protocol handler and tools, plus 2
end-to-end tests that spawn the real binary and drive a full stdio
session (initialize → tools/list → tools/call → EOF), asserting
stdout is protocol-only. Full workspace suite green.
Docs: docs/ai-ready.md MCP section restructured into stdio (Rust v5)
and Streamable HTTP (Node v4) transports with client config examples;
docs/rust.md options table; root README; rust/CHANGELOG.md 5.0.16.
The jscpd-server (Node) stdio subcommand asked for literally in #891
can follow separately; this provides the stdio transport via the v5
binary that ships with jscpd@5.
Refs #891
2026-08-14 19:56:52 +02:00
| `--mcp` | | Serve the [Model Context Protocol over stdio ](ai-ready.md#stdio-transport-rust-v5 ): scan PATHs once, then expose `check_duplication` / `get_statistics` / `check_current_directory` tools to MCP clients | off |
feat(rust): opt-in --summary codebase report — top files/folders by tokens, lines, size, complexity
Adds a refactoring-hotspot summary computed from data the detector
already holds in memory, appended to the run output when requested:
- --summary enable the summary block (also `summary` in .jscpd.json)
- --summary-top <n> entries per list (default 10, `summaryTop`)
- --summary-by <m> ranking metric: tokens|lines|size|complexity (`summaryBy`)
Output: top-N files (tokens, lines, size, complexity estimate, dup%)
strictly ranked by the chosen metric — every row carries all metrics —
plus a top-N folder rollup (direct-parent aggregation, each file counted
once). totalFiles/totalFolders always report pre-truncation counts.
Complexity is a language-agnostic cyclomatic estimate: 1 + decision-point
tokens (if/elif/elsif/elseif/unless/for/foreach/while/until/case/cond/
when/catch/rescue/except/andalso/orelse/&&/||/and/or/?/??), matched
ASCII-case-insensitively so uppercase-keyword languages (SQL, PL/SQL,
Fortran, COBOL, BASIC) count too. Verified across all 157 fixture
languages.
Reporter integration:
- console / console-full: aligned tables after the normal output
- ai: compact one-line-per-entry block (LLM-token-efficient)
- json: additive `summary` key, absent when the flag is off — schema
unchanged for existing consumers
Performance: the only unconditional change is capturing the file's byte
size from the existing mmap; all summary work runs post-detection and
only when --summary is set. hyperfine A/B vs master baseline shows
identical times without the flag (39.8ms vs 40.2ms) and ~2ms summary
cost when enabled.
New: cpd-core/src/summary.rs (model + computation, 14 unit tests),
cpd-reporter/src/summary_render.rs. ReportContext gains an optional
summary reference (ReportContext::new is unchanged; with_summary added).
SourceFile gains a serde-defaulted `bytes` field. 6 new CLI integration
tests; full workspace suite green.
Follow-ups tracked in #934: HTML report section, TypeScript parity port.
Refs #934
2026-08-14 17:13:45 +02:00
| `--summary` | | Print a codebase summary: top files and folders by tokens, lines, size, and a complexity estimate. See [Summary ](#summary ) | off |
| `--summary-top` | | Number of entries in each summary top list | 10 |
| `--summary-by` | | Summary sort metric: `tokens` , `lines` , `size` , `complexity` | `tokens` |
feat(cli): --dashboard with duplication, complexity and dead code
--dashboard prints one screen: project size and largest formats,
duplication with clones per kind and the most duplicated files, total and
mean complexity with the most complex files, and dead code by category
with the largest findings (JavaScript, TypeScript, Python). The dead-code
scan runs beside clone detection; --summary-top sets the rows per list.
Data formats (JSON, YAML, TOML, CSV, ...) join markdown at complexity 0,
so a lock file's version ranges no longer top the complexity ranking.
Docs for --kind, --complexity and --dashboard; fixtures/dashboard-demo,
plus --kind and --complexity sections in the type3 and summary demos.
2026-09-17 18:15:45 +02:00
| `--complexity` | | Print the summary tables ranked by complexity without running clone detection. See [Complexity only ](#complexity-only ) | off |
feat(cli): project health score, --health, dashboard JSON
One 0-100 score with an A-E grade, shown on top of --dashboard and alone
with --health.
- Dimensions are shares of the code lines, so size cancels out:
duplication (jscpd's percentage over code files), dead code, and the
share of code in complex files (complexity 50+). Prose and data files
are not counted.
- Each share is scored on a half-life curve (100 at zero, 50 at one
half-life), calibrated on 42 open-source projects so the median project
scores 75 per dimension; shares are mixed with a 2000-line prior so one
finding does not sink a small project.
- Sub-scores combine as a weighted geometric mean. A dimension that
cannot be measured is left out and named, and dead code weighs as much
as the share of the code it could read.
- --health-input FILE and the health config object add metrics from
other tools (a ready score, or a value with a half-life) and tune the
built-in half-lives and weights.
- Reporters: console badge, ai one-liner, json (jscpd-health.json,
jscpd-dashboard.json with every dashboard section) and badge
(jscpd-health-badge.svg). Exit gates apply as in the dashboard.
CpdClone::matched_lines moves to cpd-core so statistics and health count
duplicated lines the same way.
2026-09-18 09:23:58 +02:00
| `--dashboard` | | Print one screen with the health score, project size, duplication, complexity and dead code. See [Dashboard ](#dashboard ) | off |
| `--health` | | Print only the project health badge: one 0-100 score with a grade. See [Health score ](#health-score ) | off |
| `--health-input` | | JSON file with metrics from other tools (coverage, tests, security) to include in the health score | — |
feat(cli): --history, duplication trend over git history
Closes #1002 (the --history half; --ratchet is deliberately not
implemented, the report shows the headroom instead).
`jscpd src --history v5.0.0..HEAD` (or `--history-since 2026-01-01`)
lists the commits with `git log`, checks each one out into a temporary
detached worktree (the --baseline-from-ref machinery, now shared through
baseline_ref::map_scan_paths), scans it with the run's own configuration
and keeps the totals; the current run is the series' last point.
`--history-every N` keeps every Nth commit counted from the newest,
`--history-limit N` (default 30) samples a long series evenly keeping
both ends. Nothing runs unless one of the flags is given.
Output: the console reporter appends a sparkline of the duplication
percentage, a table (commit, date, files, lines, clones, dup lines,
dup%, change, subject) with the change column red when duplication rose
and green when it fell, the overall trend line, and, when --threshold is
set and the latest value is under it, the headroom with the value the
threshold could be tightened to. The json reporter adds a `history`
object; the ai reporter prints one compact line per point. Other
reporters are unchanged.
New cpd_core::history (model, sparkline, change/headroom helpers with
unit tests), cpd::history (git log parsing, sampling, worktree scans),
cpd_reporter::history_render. Config keys history / historySince /
historyEvery / historyLimit; action input `history`. Integration tests
build a four-commit repo with fixed dates and check the JSON series,
the console block, every/limit thinning and the error paths. 969
workspace tests pass, clippy clean.
Docs: History section and option rows in docs/rust.md, README bullet,
action input row, fixtures/history-demo/README.md with a script that
builds the demo repository and the expected output.
Claude-Session: https://claude.ai/code/session_01WztdFKZAwW9b51iJe9zhtV
2026-09-12 07:50:18 +02:00
| `--history` | | Duplication trend over git history: scan every commit in RANGE (e.g. `v5.0.0..HEAD` ) with the same configuration and print a sparkline and a table. See [History ](#history ) | — |
| `--history-since` | | Select commits since DATE (e.g. `2026-01-01` ); alone it walks `HEAD` , with `--history` it bounds the range | — |
| `--history-every` | | Keep every Nth commit of the series, counted from the newest | 1 |
| `--history-limit` | | Maximum number of commits in the series, sampled evenly with both ends kept | 30 |
docs: reorganize documentation into docs/ folder, separate v4/v5 docs
- Split the overloaded README.md into focused docs:
- docs/typescript.md: v4 (Node.js) CLI, reporters, API, config
- docs/rust.md: v5 (Rust) CLI, reporters, blame, differences from v4
- docs/ai-ready.md: AI reporter, agent skills, MCP server
- docs/api.md: Programming APIs (TypeScript and Rust)
- docs/packages.md: Monorepo package and crate overview
- Trim README.md to a concise entry point with links to docs/
- Slim down rust/README.md, rust/jscpd/README.md, rust/npm/README.md:
remove duplicated content, link to docs/rust.md for details
- Fix factual errors verified against actual CLI output:
- Format count: 223 (v5) and 224 (v4), not '225+'
- Reporter output filenames: jscpd-report.* not cpd.*
- --max-size: no default in v5 (not 512KB)
- --formats-exts: same hyphenated form in both v4 and v5
- --no-gitignore: same flag name in both v4 and v5
- Update rust/jscpd/package.json: add 'cpd' bin so jscpd@5
installs both jscpd and cpd commands
- Update crate versions in rust/README.md to match source (0.1.3/0.1.4)
2026-06-08 12:57:38 +02:00
| `--silent` | `-s` | Suppress console output | off |
2026-09-08 09:49:59 +02:00
| `--no-tips` | | Suppress tips and promotional messages. Tips are also skipped automatically when stdout is not a terminal (a pipe, a file, a CI log) or when `CI` or `JSCPD_NO_TIPS` is set; `NO_COLOR` only removes the colours | off |
docs: reorganize documentation into docs/ folder, separate v4/v5 docs
- Split the overloaded README.md into focused docs:
- docs/typescript.md: v4 (Node.js) CLI, reporters, API, config
- docs/rust.md: v5 (Rust) CLI, reporters, blame, differences from v4
- docs/ai-ready.md: AI reporter, agent skills, MCP server
- docs/api.md: Programming APIs (TypeScript and Rust)
- docs/packages.md: Monorepo package and crate overview
- Trim README.md to a concise entry point with links to docs/
- Slim down rust/README.md, rust/jscpd/README.md, rust/npm/README.md:
remove duplicated content, link to docs/rust.md for details
- Fix factual errors verified against actual CLI output:
- Format count: 223 (v5) and 224 (v4), not '225+'
- Reporter output filenames: jscpd-report.* not cpd.*
- --max-size: no default in v5 (not 512KB)
- --formats-exts: same hyphenated form in both v4 and v5
- --no-gitignore: same flag name in both v4 and v5
- Update rust/jscpd/package.json: add 'cpd' bin so jscpd@5
installs both jscpd and cpd commands
- Update crate versions in rust/README.md to match source (0.1.3/0.1.4)
2026-06-08 12:57:38 +02:00
| `--version` | `-V` | Print version | — |
| `--help` | `-h` | Print help | — |
### Reporters
chore: apply audit fixes across repo, crates, npm wrapper and pipelines
Rust / crates.io
- report the invoked binary name in --version/--help (jscpd vs cpd)
- add repository, documentation, keywords, categories to all crates
- exclude tests/ from the jscpd crate package; add cargo-binstall metadata
- expand the crates.io README and render it on docs.rs
npm
- add funding field to jscpd, cpd and jscpd@4 packages
- add jscpd-linux-arm64-musl platform package and clearer unsupported-platform error
- enable provenance for the v4 changeset publish
Pipelines
- rust.yml: windows-latest in the matrix, drop dead schedule guard
- release.yml: cosign-sign release assets, floating v5 tag, LICENSE in tarballs,
invoke the new docker.yml (GHCR multi-arch image) after each release
- audit.yml: nightly cargo audit, cargo deny and pnpm audit
- Dockerfile: multi-stage image from release binaries (distroless), mcp target for Glama
Docs / community
- README: shields badges, single primary install per OS, GitHub Action snippet,
link to jscpd.dev, v5.1 features, 15 reporters, 224 formats, 8 platforms
- docs: @v5 action tag, Docker usage, baseline section, current crate versions
- YAML issue forms with engine selector, config.yml, CODEOWNERS
- remove stale .github/CONTRIBUTING.md stub, custom.md, TODO.md; untrack rust/jscpd-report.json
- examples: mark as v4 API, add a Rust cpd-finder example
2026-09-02 09:57:06 +02:00
15 built-in reporters:
docs: reorganize documentation into docs/ folder, separate v4/v5 docs
- Split the overloaded README.md into focused docs:
- docs/typescript.md: v4 (Node.js) CLI, reporters, API, config
- docs/rust.md: v5 (Rust) CLI, reporters, blame, differences from v4
- docs/ai-ready.md: AI reporter, agent skills, MCP server
- docs/api.md: Programming APIs (TypeScript and Rust)
- docs/packages.md: Monorepo package and crate overview
- Trim README.md to a concise entry point with links to docs/
- Slim down rust/README.md, rust/jscpd/README.md, rust/npm/README.md:
remove duplicated content, link to docs/rust.md for details
- Fix factual errors verified against actual CLI output:
- Format count: 223 (v5) and 224 (v4), not '225+'
- Reporter output filenames: jscpd-report.* not cpd.*
- --max-size: no default in v5 (not 512KB)
- --formats-exts: same hyphenated form in both v4 and v5
- --no-gitignore: same flag name in both v4 and v5
- Update rust/jscpd/package.json: add 'cpd' bin so jscpd@5
installs both jscpd and cpd commands
- Update crate versions in rust/README.md to match source (0.1.3/0.1.4)
2026-06-08 12:57:38 +02:00
| Reporter | Output |
|----------|--------|
| `console` | Clone list + statistics table (default) |
| `console-full` | Clone list with source snippets; with `--blame` shows side-by-side author comparison |
| `json` | `report/jscpd-report.json` |
| `xml` | `report/jscpd-report.xml` |
| `csv` | `report/jscpd-report.csv` |
| `html` | `report/jscpd-report.html` |
| `markdown` | `report/jscpd-report.md` |
| `badge` | `report/jscpd-badge.svg` + `report/jscpd-lines-badge.svg` |
| `sarif` | `report/jscpd-report.sarif` (GitHub Code Scanning) |
chore: apply audit fixes across repo, crates, npm wrapper and pipelines
Rust / crates.io
- report the invoked binary name in --version/--help (jscpd vs cpd)
- add repository, documentation, keywords, categories to all crates
- exclude tests/ from the jscpd crate package; add cargo-binstall metadata
- expand the crates.io README and render it on docs.rs
npm
- add funding field to jscpd, cpd and jscpd@4 packages
- add jscpd-linux-arm64-musl platform package and clearer unsupported-platform error
- enable provenance for the v4 changeset publish
Pipelines
- rust.yml: windows-latest in the matrix, drop dead schedule guard
- release.yml: cosign-sign release assets, floating v5 tag, LICENSE in tarballs,
invoke the new docker.yml (GHCR multi-arch image) after each release
- audit.yml: nightly cargo audit, cargo deny and pnpm audit
- Dockerfile: multi-stage image from release binaries (distroless), mcp target for Glama
Docs / community
- README: shields badges, single primary install per OS, GitHub Action snippet,
link to jscpd.dev, v5.1 features, 15 reporters, 224 formats, 8 platforms
- docs: @v5 action tag, Docker usage, baseline section, current crate versions
- YAML issue forms with engine selector, config.yml, CODEOWNERS
- remove stale .github/CONTRIBUTING.md stub, custom.md, TODO.md; untrack rust/jscpd-report.json
- examples: mark as v4 API, add a Rust cpd-finder example
2026-09-02 09:57:06 +02:00
| `codeclimate` (alias `gitlab` ) | `report/gl-code-quality-report.json` — CodeClimate issue format, ready for GitLab `artifacts:reports:codequality` |
| `openmetrics` | `report/jscpd-metrics.txt` — OpenMetrics text format, ready for GitLab `artifacts:reports:metrics` |
docs: reorganize documentation into docs/ folder, separate v4/v5 docs
- Split the overloaded README.md into focused docs:
- docs/typescript.md: v4 (Node.js) CLI, reporters, API, config
- docs/rust.md: v5 (Rust) CLI, reporters, blame, differences from v4
- docs/ai-ready.md: AI reporter, agent skills, MCP server
- docs/api.md: Programming APIs (TypeScript and Rust)
- docs/packages.md: Monorepo package and crate overview
- Trim README.md to a concise entry point with links to docs/
- Slim down rust/README.md, rust/jscpd/README.md, rust/npm/README.md:
remove duplicated content, link to docs/rust.md for details
- Fix factual errors verified against actual CLI output:
- Format count: 223 (v5) and 224 (v4), not '225+'
- Reporter output filenames: jscpd-report.* not cpd.*
- --max-size: no default in v5 (not 512KB)
- --formats-exts: same hyphenated form in both v4 and v5
- --no-gitignore: same flag name in both v4 and v5
- Update rust/jscpd/package.json: add 'cpd' bin so jscpd@5
installs both jscpd and cpd commands
- Update crate versions in rust/README.md to match source (0.1.3/0.1.4)
2026-06-08 12:57:38 +02:00
| `ai` | Token-efficient output for LLM pipelines |
| `xcode` | Xcode-compatible warnings |
| `threshold` | Exit 1 if duplication percentage exceeds `--threshold` |
| `silent` | No console output |
fix(xml): replace characters XML cannot carry, escape paths once
Closes #375.
A snippet containing a NUL, an ANSI escape, a form feed or any other
control byte made the xml report unparseable: XML 1.0 has no way to
represent those characters, not even inside CDATA, so xmllint stopped at
"PCDATA invalid Char value 27" and every parser refused the file. The
reporter now replaces every character outside XML's Char production
(tab, LF, CR and U+0020 and up, minus U+FFFE/U+FFFF) with U+FFFD in
snippets and in path attributes. The existing "]]>" split is kept.
Path attributes were also escaped twice: quick-xml escapes attribute
values on its own, so the reporter's escape_xml() turned "r&d" into
"r&amp;d". The manual escape is gone and the sanitized path goes in
raw.
Tests parse the generated report to the end with quick-xml and check:
control characters become U+FFFD and none survive, a "]]>" round-trips
through the split sections, a path with & < " > is escaped exactly once
and reads back unchanged, and legal text is left borrowed.
Fixtures: fixtures/xml-report-demo with a clone whose body holds real
escape bytes, a form feed and a "]]>" literal; the README shows the
xmllint and Python checks. Verified the published 5.2.0 fails xmllint
on it and the fixed binary passes.
Claude-Session: https://claude.ai/code/session_01WztdFKZAwW9b51iJe9zhtV
2026-09-13 07:44:22 +02:00
The `xml` report is always well-formed XML 1.0: a `]]>` inside a snippet is split across two CDATA sections, and characters XML cannot represent at all (NUL, ANSI escapes, form feeds and other control bytes, U+FFFE/U+FFFF) are replaced with U+FFFD in snippets and file paths, so `xmllint` and XML parsers accept reports built from files that contain them. See [`fixtures/xml-report-demo` ](../fixtures/xml-report-demo/README.md ).
chore: make master v5-only
Everything belonging to the v4 TypeScript engine moves to the master-v4
branch: apps/, packages/, build-utils/, changesets, pnpm workspace, turbo,
the Node.js CI workflow and the ts-* release jobs. What remains is the
Rust workspace under rust/, the npm wrapper and platform packages, the
GitHub Action, Docker image, flake, skills, benchmark and fixtures/.
- rust.yml gains a smoke job that runs the release binary against
fixtures/ (json, sarif, html) and asserts clones and reporters
- release.yml keeps only the Rust jobs; pnpm removed from every workflow;
audit.yml keeps cargo audit + cargo deny; dependabot drops the root npm entry
- root package.json becomes a thin private package depending on the exact
jscpd@5 version so the pre-commit hook keeps installing the binary;
sync-version.mjs keeps it in step
- .pre-commit-hooks.yaml used v4-only flags that the v5 CLI rejects; fixed
- FORMATS.md is now generated from the Rust tokenizer (224 formats)
- README, docs, CONTRIBUTING, SECURITY, package and crate descriptions,
benchmark and skills rewritten for v5 on its own terms: no v5-vs-v4 speed
multipliers anywhere, a single "Looking for v4?" pointer to master-v4
2026-09-02 10:15:10 +02:00
File reporters write into the `--output` directory (default `report/` ) using the `jscpd-report.*` prefix (e.g. `jscpd-report.json` , `jscpd-report.sarif` ).
docs: reorganize documentation into docs/ folder, separate v4/v5 docs
- Split the overloaded README.md into focused docs:
- docs/typescript.md: v4 (Node.js) CLI, reporters, API, config
- docs/rust.md: v5 (Rust) CLI, reporters, blame, differences from v4
- docs/ai-ready.md: AI reporter, agent skills, MCP server
- docs/api.md: Programming APIs (TypeScript and Rust)
- docs/packages.md: Monorepo package and crate overview
- Trim README.md to a concise entry point with links to docs/
- Slim down rust/README.md, rust/jscpd/README.md, rust/npm/README.md:
remove duplicated content, link to docs/rust.md for details
- Fix factual errors verified against actual CLI output:
- Format count: 223 (v5) and 224 (v4), not '225+'
- Reporter output filenames: jscpd-report.* not cpd.*
- --max-size: no default in v5 (not 512KB)
- --formats-exts: same hyphenated form in both v4 and v5
- --no-gitignore: same flag name in both v4 and v5
- Update rust/jscpd/package.json: add 'cpd' bin so jscpd@5
installs both jscpd and cpd commands
- Update crate versions in rust/README.md to match source (0.1.3/0.1.4)
2026-06-08 12:57:38 +02:00
feat(rust): opt-in --summary codebase report — top files/folders by tokens, lines, size, complexity
Adds a refactoring-hotspot summary computed from data the detector
already holds in memory, appended to the run output when requested:
- --summary enable the summary block (also `summary` in .jscpd.json)
- --summary-top <n> entries per list (default 10, `summaryTop`)
- --summary-by <m> ranking metric: tokens|lines|size|complexity (`summaryBy`)
Output: top-N files (tokens, lines, size, complexity estimate, dup%)
strictly ranked by the chosen metric — every row carries all metrics —
plus a top-N folder rollup (direct-parent aggregation, each file counted
once). totalFiles/totalFolders always report pre-truncation counts.
Complexity is a language-agnostic cyclomatic estimate: 1 + decision-point
tokens (if/elif/elsif/elseif/unless/for/foreach/while/until/case/cond/
when/catch/rescue/except/andalso/orelse/&&/||/and/or/?/??), matched
ASCII-case-insensitively so uppercase-keyword languages (SQL, PL/SQL,
Fortran, COBOL, BASIC) count too. Verified across all 157 fixture
languages.
Reporter integration:
- console / console-full: aligned tables after the normal output
- ai: compact one-line-per-entry block (LLM-token-efficient)
- json: additive `summary` key, absent when the flag is off — schema
unchanged for existing consumers
Performance: the only unconditional change is capturing the file's byte
size from the existing mmap; all summary work runs post-detection and
only when --summary is set. hyperfine A/B vs master baseline shows
identical times without the flag (39.8ms vs 40.2ms) and ~2ms summary
cost when enabled.
New: cpd-core/src/summary.rs (model + computation, 14 unit tests),
cpd-reporter/src/summary_render.rs. ReportContext gains an optional
summary reference (ReportContext::new is unchanged; with_summary added).
SourceFile gains a serde-defaulted `bytes` field. 6 new CLI integration
tests; full workspace suite green.
Follow-ups tracked in #934: HTML report section, TypeScript parity port.
Refs #934
2026-08-14 17:13:45 +02:00
### Summary
`--summary` appends a codebase summary to the run output — the statistics jscpd already collects while scanning, aggregated to answer "where should I refactor first":
```
Summary (by tokens; 321 files, 129 folders analyzed)
Top files:
TOKENS LINES SIZE CX DUP% PATH
2052 363 11.4K 80 0.0 files.ts
...
Top folders:
FILES TOKENS LINES SIZE CX PATH
8 5264 843 26.5K 15 src/core
...
```
- **Top files** lists the top `--summary-top` files ranked by the `--summary-by` metric. Every row carries all metrics, so re-ranking by another lens is a `--summary-by size` (or `lines` , `complexity` ) away.
- **Top folders** aggregates files into their direct parent directory (each file counted exactly once; no cumulative ancestor totals).
feat(summary): count complexity per function, the way each language branches
The CX column was one path per file plus every branch keyword the token
stream showed, and on the generic tokenizer that list was partly
unreachable: it splits punctuation into single characters, so the && and ||
entries never matched outside JavaScript and ?? counted twice. Measured
against lizard on ten GitHub-trending projects in nine languages, CX ranked
files with a median Spearman correlation of 0.83 and put their size at 0.75
of lizard's.
- Adjacent punctuation is joined before matching, so short-circuit
operators count in every language.
- Per-language rules: Rust match arms count by their =>, less one per match
since N arms are N paths; Swift adds guard and Go select. Where ? also
marks an optional (TypeScript, JavaScript, Swift, Kotlin, Groovy, C#) it
counts only as a ternary, told apart from String? and x?.y by being
written in the open; ?: is Elvis only in Kotlin and Groovy.
- One path per function: by declaring keyword (def, fn, func, function, fun,
and => for arrow functions), and in C, C++, Java, Objective-C and C# by the
head(args) { shape told apart from if (...) {. Languages with neither keep
the per-file baseline.
- The body of a """ or ''' string no longer counts. The line-based tokenizer
leaves its quotes in adjacent literals, and an odd number of triple quotes
in such a run opens or closes the string, which handles the PEP 257
opener """Summary. that a pair-of-tokens check read backwards. This is
limited to languages where """ is a delimiter: where a doubled quote is an
escape (C#, VB.NET, SQL, Pascal) it swallowed a 413-branch C# file.
- A keyword-shaped word the file binds as a name - case = 3, x.case,
f(case, when) - is not a branch in that file.
On the same ten projects the median correlation rose to 0.92 and the ratio
to 1.00, and every project improved. Where CX and lizard still differ they
differ on purpose: lizard counts a match once whatever its arms, and does
not count ??.
Detection, tokenization and clone output are untouched: the fixtures corpus
reports the same 248 clones. fixtures/summary-demo has one file per language
whose complexity can be counted by hand, and every CX value matches it.
2026-09-17 12:36:55 +02:00
- **CX** is a cyclomatic-complexity estimate computed from the token stream, without parsing: one path per function plus one per branch. For folders it is the per-file mean.
- *Branches* are the decision-point tokens `if` , `elif` /`elsif` /`elseif` , `unless` , `for` , `foreach` , `while` , `until` , `case` , `cond` , `when` , `catch` , `rescue` , `except` , `and` , `or` , `andalso` , `orelse` , `&&` , `||` , `?` and `??` , matched case-insensitively so uppercase-keyword languages (SQL, PL/SQL, Fortran, COBOL, BASIC) count too. Some languages add their own: each Rust `match` arm (every `=>` , less one per `match` , since three arms are three paths), Swift's `guard` , Go's `select` . Where `?` also marks an optional — TypeScript, JavaScript, Swift, Kotlin, Groovy, C# — it counts only when it opens a ternary, not in `String?` or `x?.y` .
- *Functions* are counted by their declaring keyword (`def` , `fn` , `func` , `function` , `fun` , and `=>` for JavaScript arrow functions) and, in C, C++, Java, Objective-C and C#, by the `head(args) {` shape told apart from an `if (…) {` . A language with neither keeps a baseline of one path per file.
- *Not counted:* the body of a `"""` or `'''` string in the languages that have one (Python, Kotlin, Scala, Groovy, Swift, Java, Julia, Elixir, Dart), so a docstring saying "if the value is big" is not three branches; and a keyword-shaped word the file itself binds as a name — `case = 3` , `x.case` , `f(case, when)` .
Languages that branch without such tokens (Smalltalk `ifTrue:` messages, Prolog clauses) still read low, so treat CX as a ranking signal first. See [`fixtures/summary-demo` ](../fixtures/summary-demo/README.md ) for one file per language whose complexity can be counted by hand.
feat(rust): opt-in --summary codebase report — top files/folders by tokens, lines, size, complexity
Adds a refactoring-hotspot summary computed from data the detector
already holds in memory, appended to the run output when requested:
- --summary enable the summary block (also `summary` in .jscpd.json)
- --summary-top <n> entries per list (default 10, `summaryTop`)
- --summary-by <m> ranking metric: tokens|lines|size|complexity (`summaryBy`)
Output: top-N files (tokens, lines, size, complexity estimate, dup%)
strictly ranked by the chosen metric — every row carries all metrics —
plus a top-N folder rollup (direct-parent aggregation, each file counted
once). totalFiles/totalFolders always report pre-truncation counts.
Complexity is a language-agnostic cyclomatic estimate: 1 + decision-point
tokens (if/elif/elsif/elseif/unless/for/foreach/while/until/case/cond/
when/catch/rescue/except/andalso/orelse/&&/||/and/or/?/??), matched
ASCII-case-insensitively so uppercase-keyword languages (SQL, PL/SQL,
Fortran, COBOL, BASIC) count too. Verified across all 157 fixture
languages.
Reporter integration:
- console / console-full: aligned tables after the normal output
- ai: compact one-line-per-entry block (LLM-token-efficient)
- json: additive `summary` key, absent when the flag is off — schema
unchanged for existing consumers
Performance: the only unconditional change is capturing the file's byte
size from the existing mmap; all summary work runs post-detection and
only when --summary is set. hyperfine A/B vs master baseline shows
identical times without the flag (39.8ms vs 40.2ms) and ~2ms summary
cost when enabled.
New: cpd-core/src/summary.rs (model + computation, 14 unit tests),
cpd-reporter/src/summary_render.rs. ReportContext gains an optional
summary reference (ReportContext::new is unchanged; with_summary added).
SourceFile gains a serde-defaulted `bytes` field. 6 new CLI integration
tests; full workspace suite green.
Follow-ups tracked in #934: HTML report section, TypeScript parity port.
Refs #934
2026-08-14 17:13:45 +02:00
- **DUP%** is the share of the file's lines covered by detected clone fragments (both fragments of a clone count toward their files; display is capped at 100%).
The summary is fully opt-in and computed after detection from data already in memory, so runs without `--summary` are unaffected. It integrates with:
- `console` / `console-full` — the block shown above
- `ai` — a compact, LLM-token-efficient variant (one line per file/folder)
- `json` — an additive `summary` key in `jscpd-report.json` (absent when the flag is off, so the schema is unchanged for existing consumers)
Config file equivalents: `"summary": true` , `"summaryTop": 10` , `"summaryBy": "tokens"` .
``` bash
# Refactoring hotspots: biggest files by tokens plus duplication share
2026-09-17 18:37:20 +02:00
jscpd ./src --summary
feat(rust): opt-in --summary codebase report — top files/folders by tokens, lines, size, complexity
Adds a refactoring-hotspot summary computed from data the detector
already holds in memory, appended to the run output when requested:
- --summary enable the summary block (also `summary` in .jscpd.json)
- --summary-top <n> entries per list (default 10, `summaryTop`)
- --summary-by <m> ranking metric: tokens|lines|size|complexity (`summaryBy`)
Output: top-N files (tokens, lines, size, complexity estimate, dup%)
strictly ranked by the chosen metric — every row carries all metrics —
plus a top-N folder rollup (direct-parent aggregation, each file counted
once). totalFiles/totalFolders always report pre-truncation counts.
Complexity is a language-agnostic cyclomatic estimate: 1 + decision-point
tokens (if/elif/elsif/elseif/unless/for/foreach/while/until/case/cond/
when/catch/rescue/except/andalso/orelse/&&/||/and/or/?/??), matched
ASCII-case-insensitively so uppercase-keyword languages (SQL, PL/SQL,
Fortran, COBOL, BASIC) count too. Verified across all 157 fixture
languages.
Reporter integration:
- console / console-full: aligned tables after the normal output
- ai: compact one-line-per-entry block (LLM-token-efficient)
- json: additive `summary` key, absent when the flag is off — schema
unchanged for existing consumers
Performance: the only unconditional change is capturing the file's byte
size from the existing mmap; all summary work runs post-detection and
only when --summary is set. hyperfine A/B vs master baseline shows
identical times without the flag (39.8ms vs 40.2ms) and ~2ms summary
cost when enabled.
New: cpd-core/src/summary.rs (model + computation, 14 unit tests),
cpd-reporter/src/summary_render.rs. ReportContext gains an optional
summary reference (ReportContext::new is unchanged; with_summary added).
SourceFile gains a serde-defaulted `bytes` field. 6 new CLI integration
tests; full workspace suite green.
Follow-ups tracked in #934: HTML report section, TypeScript parity port.
Refs #934
2026-08-14 17:13:45 +02:00
# Agent-friendly: compact clone list + compact summary
2026-09-17 18:37:20 +02:00
jscpd ./src --summary --reporters ai --no-tips
feat(rust): opt-in --summary codebase report — top files/folders by tokens, lines, size, complexity
Adds a refactoring-hotspot summary computed from data the detector
already holds in memory, appended to the run output when requested:
- --summary enable the summary block (also `summary` in .jscpd.json)
- --summary-top <n> entries per list (default 10, `summaryTop`)
- --summary-by <m> ranking metric: tokens|lines|size|complexity (`summaryBy`)
Output: top-N files (tokens, lines, size, complexity estimate, dup%)
strictly ranked by the chosen metric — every row carries all metrics —
plus a top-N folder rollup (direct-parent aggregation, each file counted
once). totalFiles/totalFolders always report pre-truncation counts.
Complexity is a language-agnostic cyclomatic estimate: 1 + decision-point
tokens (if/elif/elsif/elseif/unless/for/foreach/while/until/case/cond/
when/catch/rescue/except/andalso/orelse/&&/||/and/or/?/??), matched
ASCII-case-insensitively so uppercase-keyword languages (SQL, PL/SQL,
Fortran, COBOL, BASIC) count too. Verified across all 157 fixture
languages.
Reporter integration:
- console / console-full: aligned tables after the normal output
- ai: compact one-line-per-entry block (LLM-token-efficient)
- json: additive `summary` key, absent when the flag is off — schema
unchanged for existing consumers
Performance: the only unconditional change is capturing the file's byte
size from the existing mmap; all summary work runs post-detection and
only when --summary is set. hyperfine A/B vs master baseline shows
identical times without the flag (39.8ms vs 40.2ms) and ~2ms summary
cost when enabled.
New: cpd-core/src/summary.rs (model + computation, 14 unit tests),
cpd-reporter/src/summary_render.rs. ReportContext gains an optional
summary reference (ReportContext::new is unchanged; with_summary added).
SourceFile gains a serde-defaulted `bytes` field. 6 new CLI integration
tests; full workspace suite green.
Follow-ups tracked in #934: HTML report section, TypeScript parity port.
Refs #934
2026-08-14 17:13:45 +02:00
# Focus on the most complex files, top 5 lists, machine-readable
2026-09-17 18:37:20 +02:00
jscpd ./src --summary --summary-by complexity --summary-top 5 --reporters json
feat(rust): opt-in --summary codebase report — top files/folders by tokens, lines, size, complexity
Adds a refactoring-hotspot summary computed from data the detector
already holds in memory, appended to the run output when requested:
- --summary enable the summary block (also `summary` in .jscpd.json)
- --summary-top <n> entries per list (default 10, `summaryTop`)
- --summary-by <m> ranking metric: tokens|lines|size|complexity (`summaryBy`)
Output: top-N files (tokens, lines, size, complexity estimate, dup%)
strictly ranked by the chosen metric — every row carries all metrics —
plus a top-N folder rollup (direct-parent aggregation, each file counted
once). totalFiles/totalFolders always report pre-truncation counts.
Complexity is a language-agnostic cyclomatic estimate: 1 + decision-point
tokens (if/elif/elsif/elseif/unless/for/foreach/while/until/case/cond/
when/catch/rescue/except/andalso/orelse/&&/||/and/or/?/??), matched
ASCII-case-insensitively so uppercase-keyword languages (SQL, PL/SQL,
Fortran, COBOL, BASIC) count too. Verified across all 157 fixture
languages.
Reporter integration:
- console / console-full: aligned tables after the normal output
- ai: compact one-line-per-entry block (LLM-token-efficient)
- json: additive `summary` key, absent when the flag is off — schema
unchanged for existing consumers
Performance: the only unconditional change is capturing the file's byte
size from the existing mmap; all summary work runs post-detection and
only when --summary is set. hyperfine A/B vs master baseline shows
identical times without the flag (39.8ms vs 40.2ms) and ~2ms summary
cost when enabled.
New: cpd-core/src/summary.rs (model + computation, 14 unit tests),
cpd-reporter/src/summary_render.rs. ReportContext gains an optional
summary reference (ReportContext::new is unchanged; with_summary added).
SourceFile gains a serde-defaulted `bytes` field. 6 new CLI integration
tests; full workspace suite green.
Follow-ups tracked in #934: HTML report section, TypeScript parity port.
Refs #934
2026-08-14 17:13:45 +02:00
```
feat(cli): --dashboard with duplication, complexity and dead code
--dashboard prints one screen: project size and largest formats,
duplication with clones per kind and the most duplicated files, total and
mean complexity with the most complex files, and dead code by category
with the largest findings (JavaScript, TypeScript, Python). The dead-code
scan runs beside clone detection; --summary-top sets the rows per list.
Data formats (JSON, YAML, TOML, CSV, ...) join markdown at complexity 0,
so a lock file's version ranges no longer top the complexity ranking.
Docs for --kind, --complexity and --dashboard; fixtures/dashboard-demo,
plus --kind and --complexity sections in the type3 and summary demos.
2026-09-17 18:15:45 +02:00
### Complexity only
2026-09-18 08:11:44 +02:00
`--complexity` answers the complexity half of the summary without the clone run: files are walked and tokenized with the same filters, complexity is counted, and detection never starts (about 2.5 times faster than a clone run on a 565 MB `node_modules` ). The tables are the ones above, ranked by complexity unless `--summary-by` or the `summaryBy` config key names another metric, and without the `DUP%` column. Reporters: `console` , `ai` (compact) and `json` , which writes `jscpd-complexity.json` with the same `summary` object as the clone report. It cannot be combined with `--dead-code` or `--dashboard` .
feat(cli): --dashboard with duplication, complexity and dead code
--dashboard prints one screen: project size and largest formats,
duplication with clones per kind and the most duplicated files, total and
mean complexity with the most complex files, and dead code by category
with the largest findings (JavaScript, TypeScript, Python). The dead-code
scan runs beside clone detection; --summary-top sets the rows per list.
Data formats (JSON, YAML, TOML, CSV, ...) join markdown at complexity 0,
so a lock file's version ranges no longer top the complexity ranking.
Docs for --kind, --complexity and --dashboard; fixtures/dashboard-demo,
plus --kind and --complexity sections in the type3 and summary demos.
2026-09-17 18:15:45 +02:00
``` bash
jscpd ./src --complexity --summary-top 20
jscpd ./src --complexity --reporters ai --no-tips
```
2026-09-18 08:11:44 +02:00
Prose and data files (markdown, reStructuredText, AsciiDoc, text, logs, CSV, JSON, YAML, TOML, INI, properties) have complexity `0` in both `--complexity` and `--summary` : an "if" in a README is a word and `||` in a lock file is a version range.
feat(cli): --dashboard with duplication, complexity and dead code
--dashboard prints one screen: project size and largest formats,
duplication with clones per kind and the most duplicated files, total and
mean complexity with the most complex files, and dead code by category
with the largest findings (JavaScript, TypeScript, Python). The dead-code
scan runs beside clone detection; --summary-top sets the rows per list.
Data formats (JSON, YAML, TOML, CSV, ...) join markdown at complexity 0,
so a lock file's version ranges no longer top the complexity ranking.
Docs for --kind, --complexity and --dashboard; fixtures/dashboard-demo,
plus --kind and --complexity sections in the type3 and summary demos.
2026-09-17 18:15:45 +02:00
### Dashboard
feat(cli): beautify health badge, weigh duplication by kind, format reports
- Console health badge: reverse-video grade chip, eighth-block gauges per
dimension, one row per sub-score with what it was measured from.
- markdown/html reporters for --dashboard and --health, alongside the
existing console/json/badge; the health SVG badge moves into badge.rs.
- --dashboard's Duplication section lists a breakdown by format instead of
by file, sourced from the same jscpd statistics as everywhere else.
- Duplication no longer counts markup, stylesheet and template clones
(HTML, CSS, Handlebars, ...): a repeating style rule is not the
maintenance problem repeating programming logic is. The exclusion
follows the clone's own format, not the file it lives in, so a .svelte
or .vue file's style/template block is left out even though the
component itself is full weight.
- The duplication line and format-breakdown table now name what they
actually measured and, only for categories the project has files in,
what was left out (e.g. "5.4% in typescript (no text)") instead of a
fixed disclaimer.
2026-09-18 11:48:45 +02:00
`--dashboard` prints the whole picture of a project on one screen, under its [health badge ](#health-score ): its size and largest formats, duplication with the clone count per kind and a breakdown by format, total and mean complexity with the most complex files, and, for JavaScript, TypeScript and Python, dead code by category with the largest findings. `--summary-top N` sets the rows per list (default 5). Detection options (`--min-tokens` , `--ignore-identifiers` , `--kind` , `--ignore` , …) apply as in a normal run, and the dead-code options (`--entry` , `--dead-code-categories` , `--min-confidence` ) apply to its dead-code section. Reporters: `console` (the default), `json` , which writes every section of the screen to `jscpd-dashboard.json` , `badge` , which writes `jscpd-health-badge.svg` , and `markdown` /`html` , which write the same sections to `jscpd-dashboard.md` /`jscpd-dashboard.html` .
feat(cli): --dashboard with duplication, complexity and dead code
--dashboard prints one screen: project size and largest formats,
duplication with clones per kind and the most duplicated files, total and
mean complexity with the most complex files, and dead code by category
with the largest findings (JavaScript, TypeScript, Python). The dead-code
scan runs beside clone detection; --summary-top sets the rows per list.
Data formats (JSON, YAML, TOML, CSV, ...) join markdown at complexity 0,
so a lock file's version ranges no longer top the complexity ranking.
Docs for --kind, --complexity and --dashboard; fixtures/dashboard-demo,
plus --kind and --complexity sections in the type3 and summary demos.
2026-09-17 18:15:45 +02:00
```
── Duplication ─────────────────────────────────────────────
1.78% duplicated lines · 1 clone (1 exact)
feat(cli): beautify health badge, weigh duplication by kind, format reports
- Console health badge: reverse-video grade chip, eighth-block gauges per
dimension, one row per sub-score with what it was measured from.
- markdown/html reporters for --dashboard and --health, alongside the
existing console/json/badge; the health SVG badge moves into badge.rs.
- --dashboard's Duplication section lists a breakdown by format instead of
by file, sourced from the same jscpd statistics as everywhere else.
- Duplication no longer counts markup, stylesheet and template clones
(HTML, CSS, Handlebars, ...): a repeating style rule is not the
maintenance problem repeating programming logic is. The exclusion
follows the clone's own format, not the file it lives in, so a .svelte
or .vue file's style/template block is left out even though the
component itself is full weight.
- The duplication line and format-breakdown table now name what they
actually measured and, only for categories the project has files in,
what was left out (e.g. "5.4% in typescript (no text)") instead of a
fixed disclaimer.
2026-09-18 11:48:45 +02:00
By format:
DUP% LINES CLONES FORMAT
45.5 5 1 typescript
feat(cli): --dashboard with duplication, complexity and dead code
--dashboard prints one screen: project size and largest formats,
duplication with clones per kind and the most duplicated files, total and
mean complexity with the most complex files, and dead code by category
with the largest findings (JavaScript, TypeScript, Python). The dead-code
scan runs beside clone detection; --summary-top sets the rows per list.
Data formats (JSON, YAML, TOML, CSV, ...) join markdown at complexity 0,
so a lock file's version ranges no longer top the complexity ranking.
Docs for --kind, --complexity and --dashboard; fixtures/dashboard-demo,
plus --kind and --complexity sections in the type3 and summary demos.
2026-09-17 18:15:45 +02:00
```
feat(cli): beautify health badge, weigh duplication by kind, format reports
- Console health badge: reverse-video grade chip, eighth-block gauges per
dimension, one row per sub-score with what it was measured from.
- markdown/html reporters for --dashboard and --health, alongside the
existing console/json/badge; the health SVG badge moves into badge.rs.
- --dashboard's Duplication section lists a breakdown by format instead of
by file, sourced from the same jscpd statistics as everywhere else.
- Duplication no longer counts markup, stylesheet and template clones
(HTML, CSS, Handlebars, ...): a repeating style rule is not the
maintenance problem repeating programming logic is. The exclusion
follows the clone's own format, not the file it lives in, so a .svelte
or .vue file's style/template block is left out even though the
component itself is full weight.
- The duplication line and format-breakdown table now name what they
actually measured and, only for categories the project has files in,
what was left out (e.g. "5.4% in typescript (no text)") instead of a
fixed disclaimer.
2026-09-18 11:48:45 +02:00
The format breakdown leaves out prose/data formats (markdown, JSON, YAML, …) and markup formats (HTML, CSS, templates, …): neither counts toward the health score's duplication share, so a row for them here would describe a number the score does not have.
2026-09-18 08:11:44 +02:00
The dashboard runs a clone scan and a dead-code scan side by side, so it takes about as long as the slower of the two on a small project and close to their sum on a very large one. `--workers N` is a budget for the whole run: the two scans get half of it each, and `--workers 1` runs them one after the other.
The exit gates of a clone run apply: `--threshold` compares the duplication percentage as usual, `--exit-code` is returned when clones were found, and `--fail-on-empty` fails a scan that analyzed nothing. The baseline family does not: `--baseline` , `--baseline-from-ref` and `--update-baseline` need a clone report the dashboard does not write, so they warn and are ignored, and `--fail-on-new-clones` is refused rather than passing silently. Bad dead-code options (`--dead-code-categories` , `--min-confidence` ) are refused exactly as in `--dead-code` . See [`fixtures/dashboard-demo` ](../fixtures/dashboard-demo/README.md ) for a runnable example.
feat(cli): --dashboard with duplication, complexity and dead code
--dashboard prints one screen: project size and largest formats,
duplication with clones per kind and the most duplicated files, total and
mean complexity with the most complex files, and dead code by category
with the largest findings (JavaScript, TypeScript, Python). The dead-code
scan runs beside clone detection; --summary-top sets the rows per list.
Data formats (JSON, YAML, TOML, CSV, ...) join markdown at complexity 0,
so a lock file's version ranges no longer top the complexity ranking.
Docs for --kind, --complexity and --dashboard; fixtures/dashboard-demo,
plus --kind and --complexity sections in the type3 and summary demos.
2026-09-17 18:15:45 +02:00
feat(cli): project health score, --health, dashboard JSON
One 0-100 score with an A-E grade, shown on top of --dashboard and alone
with --health.
- Dimensions are shares of the code lines, so size cancels out:
duplication (jscpd's percentage over code files), dead code, and the
share of code in complex files (complexity 50+). Prose and data files
are not counted.
- Each share is scored on a half-life curve (100 at zero, 50 at one
half-life), calibrated on 42 open-source projects so the median project
scores 75 per dimension; shares are mixed with a 2000-line prior so one
finding does not sink a small project.
- Sub-scores combine as a weighted geometric mean. A dimension that
cannot be measured is left out and named, and dead code weighs as much
as the share of the code it could read.
- --health-input FILE and the health config object add metrics from
other tools (a ready score, or a value with a half-life) and tune the
built-in half-lives and weights.
- Reporters: console badge, ai one-liner, json (jscpd-health.json,
jscpd-dashboard.json with every dashboard section) and badge
(jscpd-health-badge.svg). Exit gates apply as in the dashboard.
CpdClone::matched_lines moves to cpd-core so statistics and health count
duplicated lines the same way.
2026-09-18 09:23:58 +02:00
### Health score
`--health` prints one number for the state of a codebase, and `--dashboard` shows it on top:
```
feat(cli): beautify health badge, weigh duplication by kind, format reports
- Console health badge: reverse-video grade chip, eighth-block gauges per
dimension, one row per sub-score with what it was measured from.
- markdown/html reporters for --dashboard and --health, alongside the
existing console/json/badge; the health SVG badge moves into badge.rs.
- --dashboard's Duplication section lists a breakdown by format instead of
by file, sourced from the same jscpd statistics as everywhere else.
- Duplication no longer counts markup, stylesheet and template clones
(HTML, CSS, Handlebars, ...): a repeating style rule is not the
maintenance problem repeating programming logic is. The exclusion
follows the clone's own format, not the file it lives in, so a .svelte
or .vue file's style/template block is left out even though the
component itself is full weight.
- The duplication line and format-breakdown table now name what they
actually measured and, only for categories the project has files in,
what was left out (e.g. "5.4% in typescript (no text)") instead of a
fixed disclaimer.
2026-09-18 11:48:45 +02:00
Health B 74/100 █████████████████▊░░░░░░ 93 lines of code (XS)
duplication 75 █████████░░░ 5.4% in typescript (no text)
dead code 72 ████████▋░░░ 14.0%
complexity 76 █████████▏░░ 0.0% in complex files
feat(cli): project health score, --health, dashboard JSON
One 0-100 score with an A-E grade, shown on top of --dashboard and alone
with --health.
- Dimensions are shares of the code lines, so size cancels out:
duplication (jscpd's percentage over code files), dead code, and the
share of code in complex files (complexity 50+). Prose and data files
are not counted.
- Each share is scored on a half-life curve (100 at zero, 50 at one
half-life), calibrated on 42 open-source projects so the median project
scores 75 per dimension; shares are mixed with a 2000-line prior so one
finding does not sink a small project.
- Sub-scores combine as a weighted geometric mean. A dimension that
cannot be measured is left out and named, and dead code weighs as much
as the share of the code it could read.
- --health-input FILE and the health config object add metrics from
other tools (a ready score, or a value with a half-life) and tune the
built-in half-lives and weights.
- Reporters: console badge, ai one-liner, json (jscpd-health.json,
jscpd-dashboard.json with every dashboard section) and badge
(jscpd-health-badge.svg). Exit gates apply as in the dashboard.
CpdClone::matched_lines moves to cpd-core so statistics and health count
duplicated lines the same way.
2026-09-18 09:23:58 +02:00
```
How it is calculated:
feat(cli): beautify health badge, weigh duplication by kind, format reports
- Console health badge: reverse-video grade chip, eighth-block gauges per
dimension, one row per sub-score with what it was measured from.
- markdown/html reporters for --dashboard and --health, alongside the
existing console/json/badge; the health SVG badge moves into badge.rs.
- --dashboard's Duplication section lists a breakdown by format instead of
by file, sourced from the same jscpd statistics as everywhere else.
- Duplication no longer counts markup, stylesheet and template clones
(HTML, CSS, Handlebars, ...): a repeating style rule is not the
maintenance problem repeating programming logic is. The exclusion
follows the clone's own format, not the file it lives in, so a .svelte
or .vue file's style/template block is left out even though the
component itself is full weight.
- The duplication line and format-breakdown table now name what they
actually measured and, only for categories the project has files in,
what was left out (e.g. "5.4% in typescript (no text)") instead of a
fixed disclaimer.
2026-09-18 11:48:45 +02:00
1. **Three shares of the code lines. ** * Duplication * is jscpd's duplication percentage over code files, and does not count a duplicated markup, stylesheet or template block (HTML, CSS, Handlebars, …): a repeating template or style rule is not the maintenance problem repeating programming logic is. Component/script languages such as Vue, Svelte, Astro and GraphQL still count in full — the exclusion follows the clone's own format, not the file it lives in, so a `.svelte` or `.vue` file's style or template block is left out of the duplication share even though the component itself counts. The console line names what it actually measured (`5.4% in typescript` ) and, only when the project has files in that category, what it left out (`(no text)` , `(no markup/data)` , …) rather than a fixed disclaimer. * Dead code * is the share of lines nothing runs (JavaScript, TypeScript, Python). * Complexity * is the share of code lines that sit in complex files, those with a complexity of 50 or more — complexity hurts when it piles up, and a mean would hide that. Prose and data files (markdown, JSON, YAML, …) are not the project's code and are left out entirely, so a folder of copied JSON snapshots does not lower the score. Because every dimension is a share, a project is not penalized for being large.
feat(cli): project health score, --health, dashboard JSON
One 0-100 score with an A-E grade, shown on top of --dashboard and alone
with --health.
- Dimensions are shares of the code lines, so size cancels out:
duplication (jscpd's percentage over code files), dead code, and the
share of code in complex files (complexity 50+). Prose and data files
are not counted.
- Each share is scored on a half-life curve (100 at zero, 50 at one
half-life), calibrated on 42 open-source projects so the median project
scores 75 per dimension; shares are mixed with a 2000-line prior so one
finding does not sink a small project.
- Sub-scores combine as a weighted geometric mean. A dimension that
cannot be measured is left out and named, and dead code weighs as much
as the share of the code it could read.
- --health-input FILE and the health config object add metrics from
other tools (a ready score, or a value with a half-life) and tune the
built-in half-lives and weights.
- Reporters: console badge, ai one-liner, json (jscpd-health.json,
jscpd-dashboard.json with every dashboard section) and badge
(jscpd-health-badge.svg). Exit gates apply as in the dashboard.
CpdClone::matched_lines moves to cpd-core so statistics and health count
duplicated lines the same way.
2026-09-18 09:23:58 +02:00
2. **A sub-score per dimension ** on a half-life curve, `100 · 2^(− share / halfLife)` : 100 at zero, 50 at one half-life, 25 at two, with no cliff and no dead zone. The half-lives — 8.5% duplication, 7.5% dead code, 50% in complex files — are calibrated on 42 open-source projects so that the median project scores 75 in each dimension.
3. **Size ** enters once more: in a small project one finding is a large share, so each share is mixed with 2000 lines of "typical project" before it is scored. At 300 lines that prior dominates; at 50,000 it no longer matters. The report shows both the measured `value` and the `adjusted` one.
4. **One score ** : the weighted geometric mean of the sub-scores, so a project that is 40% dead code is not rescued by its low duplication. Grades: `A` from 85, `B` from 70, `C` from 55, `D` from 40, then `E` .
A dimension that cannot be measured is left out and named (`dead code n/a` ) rather than scored as perfect: dead code is skipped when JavaScript, TypeScript and Python are under 5% of the code, and weighs as much as the share of the code it could read otherwise. Two scores are comparable only when they are built from the same dimensions.
**Other tools. ** `--health-input FILE` (config key `healthInput` ) adds metrics from coverage, test or security tools. A metric is either a ready 0-100 `score` , or a `value` with the `halfLife` that turns it into one; `"direction": "higher"` scores the distance to `max` (default 100):
``` json
{
"metrics" : [
{ "id" : "coverage" , "value" : 81 , "direction" : "higher" , "halfLife" : 40 } ,
{ "id" : "security" , "score" : 100 , "weight" : 2 }
]
}
```
The same object can live under `health` in `.jscpd.json` , together with the tuning of the built-in dimensions: `"health": { "duplication": { "halfLife": 5, "weight": 2 }, "deadCode": { "weight": 0 }, "complexFile": 80 }` . A weight of `0` leaves a dimension out. A metric that cannot be scored, or an unknown key, is an error.
feat(cli): beautify health badge, weigh duplication by kind, format reports
- Console health badge: reverse-video grade chip, eighth-block gauges per
dimension, one row per sub-score with what it was measured from.
- markdown/html reporters for --dashboard and --health, alongside the
existing console/json/badge; the health SVG badge moves into badge.rs.
- --dashboard's Duplication section lists a breakdown by format instead of
by file, sourced from the same jscpd statistics as everywhere else.
- Duplication no longer counts markup, stylesheet and template clones
(HTML, CSS, Handlebars, ...): a repeating style rule is not the
maintenance problem repeating programming logic is. The exclusion
follows the clone's own format, not the file it lives in, so a .svelte
or .vue file's style/template block is left out even though the
component itself is full weight.
- The duplication line and format-breakdown table now name what they
actually measured and, only for categories the project has files in,
what was left out (e.g. "5.4% in typescript (no text)") instead of a
fixed disclaimer.
2026-09-18 11:48:45 +02:00
Reporters: `console` (the badge), `ai` (one line: `health 74 B (duplication 75, dead-code 72, complexity 76; 93 code lines)` ), `json` (`jscpd-health.json` : score, grade, size, and for each dimension its value, adjusted value, lines, half-life, weight and score), `badge` (`jscpd-health-badge.svg` ), and `markdown` /`html` (`jscpd-health.md` /`jscpd-health.html` , the same score and dimension table). The exit gates of a clone run apply as they do to the dashboard. See [`fixtures/dashboard-demo` ](../fixtures/dashboard-demo/README.md#health ) for a runnable example.
feat(cli): project health score, --health, dashboard JSON
One 0-100 score with an A-E grade, shown on top of --dashboard and alone
with --health.
- Dimensions are shares of the code lines, so size cancels out:
duplication (jscpd's percentage over code files), dead code, and the
share of code in complex files (complexity 50+). Prose and data files
are not counted.
- Each share is scored on a half-life curve (100 at zero, 50 at one
half-life), calibrated on 42 open-source projects so the median project
scores 75 per dimension; shares are mixed with a 2000-line prior so one
finding does not sink a small project.
- Sub-scores combine as a weighted geometric mean. A dimension that
cannot be measured is left out and named, and dead code weighs as much
as the share of the code it could read.
- --health-input FILE and the health config object add metrics from
other tools (a ready score, or a value with a half-life) and tune the
built-in half-lives and weights.
- Reporters: console badge, ai one-liner, json (jscpd-health.json,
jscpd-dashboard.json with every dashboard section) and badge
(jscpd-health-badge.svg). Exit gates apply as in the dashboard.
CpdClone::matched_lines moves to cpd-core so statistics and health count
duplicated lines the same way.
2026-09-18 09:23:58 +02:00
feat(cli): --history, duplication trend over git history
Closes #1002 (the --history half; --ratchet is deliberately not
implemented, the report shows the headroom instead).
`jscpd src --history v5.0.0..HEAD` (or `--history-since 2026-01-01`)
lists the commits with `git log`, checks each one out into a temporary
detached worktree (the --baseline-from-ref machinery, now shared through
baseline_ref::map_scan_paths), scans it with the run's own configuration
and keeps the totals; the current run is the series' last point.
`--history-every N` keeps every Nth commit counted from the newest,
`--history-limit N` (default 30) samples a long series evenly keeping
both ends. Nothing runs unless one of the flags is given.
Output: the console reporter appends a sparkline of the duplication
percentage, a table (commit, date, files, lines, clones, dup lines,
dup%, change, subject) with the change column red when duplication rose
and green when it fell, the overall trend line, and, when --threshold is
set and the latest value is under it, the headroom with the value the
threshold could be tightened to. The json reporter adds a `history`
object; the ai reporter prints one compact line per point. Other
reporters are unchanged.
New cpd_core::history (model, sparkline, change/headroom helpers with
unit tests), cpd::history (git log parsing, sampling, worktree scans),
cpd_reporter::history_render. Config keys history / historySince /
historyEvery / historyLimit; action input `history`. Integration tests
build a four-commit repo with fixed dates and check the JSON series,
the console block, every/limit thinning and the error paths. 969
workspace tests pass, clippy clean.
Docs: History section and option rows in docs/rust.md, README bullet,
action input row, fixtures/history-demo/README.md with a script that
builds the demo repository and the expected output.
Claude-Session: https://claude.ai/code/session_01WztdFKZAwW9b51iJe9zhtV
2026-09-12 07:50:18 +02:00
### History
`--history <range>` answers "is duplication going up or down?" without a hosted dashboard. Every commit `git log` yields for the range is checked out into a temporary detached worktree (the same machinery as `--baseline-from-ref` ), scanned with the run's own configuration, and its totals become one point of a series; the current run is the last point. Commits are scanned one after another, since each scan is already parallel across files.
``` bash
jscpd src --history v5.0.0..HEAD # every commit in the range
jscpd src --history-since 2026-01-01 # every commit since a date, up to HEAD
jscpd src --history main --history-since 2026-06-01 --history-every 5 --history-limit 12
```
2026-09-12 09:04:37 +02:00
The `console` and `console-full` reporters append a block with a bar chart of the duplication percentage (its y-axis spans the series' own min and max, so small drifts stay visible), the table, the change from the previous point (red when duplication rose, green when it fell), the overall trend, and, when `--threshold` is set and the latest value sits below it, the headroom:
feat(cli): --history, duplication trend over git history
Closes #1002 (the --history half; --ratchet is deliberately not
implemented, the report shows the headroom instead).
`jscpd src --history v5.0.0..HEAD` (or `--history-since 2026-01-01`)
lists the commits with `git log`, checks each one out into a temporary
detached worktree (the --baseline-from-ref machinery, now shared through
baseline_ref::map_scan_paths), scans it with the run's own configuration
and keeps the totals; the current run is the series' last point.
`--history-every N` keeps every Nth commit counted from the newest,
`--history-limit N` (default 30) samples a long series evenly keeping
both ends. Nothing runs unless one of the flags is given.
Output: the console reporter appends a sparkline of the duplication
percentage, a table (commit, date, files, lines, clones, dup lines,
dup%, change, subject) with the change column red when duplication rose
and green when it fell, the overall trend line, and, when --threshold is
set and the latest value is under it, the headroom with the value the
threshold could be tightened to. The json reporter adds a `history`
object; the ai reporter prints one compact line per point. Other
reporters are unchanged.
New cpd_core::history (model, sparkline, change/headroom helpers with
unit tests), cpd::history (git log parsing, sampling, worktree scans),
cpd_reporter::history_render. Config keys history / historySince /
historyEvery / historyLimit; action input `history`. Integration tests
build a four-commit repo with fixed dates and check the JSON series,
the console block, every/limit thinning and the error paths. 969
workspace tests pass, clippy clean.
Docs: History section and option rows in docs/rust.md, README bullet,
action input row, fixtures/history-demo/README.md with a script that
builds the demo repository and the expected output.
Claude-Session: https://claude.ai/code/session_01WztdFKZAwW9b51iJe9zhtV
2026-09-12 07:50:18 +02:00
```
History (since 2026-01-01: 4 commits + working tree)
2026-09-12 08:26:10 +02:00
duplicated lines, % of all lines: min 0.0% max 58.1% now 42.9%
58.1% ┤ ██
│ ██
│ ▇▇ ██ ▇▇ ▇▇
29.0% ┤ ██ ██ ██ ██
│ ██ ██ ██ ██
│ ██ ██ ██ ██
│ ██ ██ ██ ██
0.0% ┤ ▁▁ ██ ██ ██ ██
└────────────────
1 2 3 4 5
# COMMIT DATE FILES LINES CLONES DUP LINES DUP% CHANGE SUBJECT
1 0a3e3d5 2026-08-01 1 11 0 0 0.0% initial helpers
2 6728f91 2026-08-08 2 21 1 9 42.9% +42.9 copy total() into b.js
3 aff51e5 2026-08-15 3 31 2 18 58.1% +15.2 and again into c.js
4 817b39d 2026-08-22 2 21 1 9 42.9% -15.2 b.js imports total() instead
5 working 2026-09-12 2 21 1 9 42.9% = (uncommitted changes)
feat(cli): --history, duplication trend over git history
Closes #1002 (the --history half; --ratchet is deliberately not
implemented, the report shows the headroom instead).
`jscpd src --history v5.0.0..HEAD` (or `--history-since 2026-01-01`)
lists the commits with `git log`, checks each one out into a temporary
detached worktree (the --baseline-from-ref machinery, now shared through
baseline_ref::map_scan_paths), scans it with the run's own configuration
and keeps the totals; the current run is the series' last point.
`--history-every N` keeps every Nth commit counted from the newest,
`--history-limit N` (default 30) samples a long series evenly keeping
both ends. Nothing runs unless one of the flags is given.
Output: the console reporter appends a sparkline of the duplication
percentage, a table (commit, date, files, lines, clones, dup lines,
dup%, change, subject) with the change column red when duplication rose
and green when it fell, the overall trend line, and, when --threshold is
set and the latest value is under it, the headroom with the value the
threshold could be tightened to. The json reporter adds a `history`
object; the ai reporter prints one compact line per point. Other
reporters are unchanged.
New cpd_core::history (model, sparkline, change/headroom helpers with
unit tests), cpd::history (git log parsing, sampling, worktree scans),
cpd_reporter::history_render. Config keys history / historySince /
historyEvery / historyLimit; action input `history`. Integration tests
build a four-commit repo with fixed dates and check the JSON series,
the console block, every/limit thinning and the error paths. 969
workspace tests pass, clippy clean.
Docs: History section and option rows in docs/rust.md, README bullet,
action input row, fixtures/history-demo/README.md with a script that
builds the demo repository and the expected output.
Claude-Session: https://claude.ai/code/session_01WztdFKZAwW9b51iJe9zhtV
2026-09-12 07:50:18 +02:00
Trend: +42.9 points since 0a3e3d5 (2026-08-01)
Threshold 50.0% has 7.1 points of headroom: the series never needed it, tighten it with --threshold 42.9
```
That last line is the manual form of a ratchet: jscpd reports how far the threshold could be tightened and leaves the change to you. The `json` reporter adds a `history` object (`range` , `threshold` , `points[]` with `commit` , `short` , `date` , `subject` , `sources` , `lines` , `tokens` , `clones` , `duplicatedLines` , `percentage` ), and the `ai` reporter prints one compact line per point. Other reporters are unchanged.
`--history-every N` keeps every Nth commit counted back from the newest, `--history-limit N` (default 30) samples a longer series evenly while keeping both ends. Paths that did not exist at a commit count as zero. The range needs the commits locally: in a shallow CI checkout fetch them first (`fetch-depth: 0` ). Config keys: `history` , `historySince` , `historyEvery` , `historyLimit` . See [`fixtures/history-demo` ](../fixtures/history-demo/README.md ) for a runnable example.
chore: apply audit fixes across repo, crates, npm wrapper and pipelines
Rust / crates.io
- report the invoked binary name in --version/--help (jscpd vs cpd)
- add repository, documentation, keywords, categories to all crates
- exclude tests/ from the jscpd crate package; add cargo-binstall metadata
- expand the crates.io README and render it on docs.rs
npm
- add funding field to jscpd, cpd and jscpd@4 packages
- add jscpd-linux-arm64-musl platform package and clearer unsupported-platform error
- enable provenance for the v4 changeset publish
Pipelines
- rust.yml: windows-latest in the matrix, drop dead schedule guard
- release.yml: cosign-sign release assets, floating v5 tag, LICENSE in tarballs,
invoke the new docker.yml (GHCR multi-arch image) after each release
- audit.yml: nightly cargo audit, cargo deny and pnpm audit
- Dockerfile: multi-stage image from release binaries (distroless), mcp target for Glama
Docs / community
- README: shields badges, single primary install per OS, GitHub Action snippet,
link to jscpd.dev, v5.1 features, 15 reporters, 224 formats, 8 platforms
- docs: @v5 action tag, Docker usage, baseline section, current crate versions
- YAML issue forms with engine selector, config.yml, CODEOWNERS
- remove stale .github/CONTRIBUTING.md stub, custom.md, TODO.md; untrack rust/jscpd-report.json
- examples: mark as v4 API, add a Rust cpd-finder example
2026-09-02 09:57:06 +02:00
### Baseline
Gate CI on * new * duplication only, tolerating clones that already exist. A baseline file records a content-hash fingerprint per accepted clone (the same hash the SARIF reporter emits as `partialFingerprints["jscpdCloneHash/v1"]` ); clones absent from it are reported as new.
``` bash
# Create or refresh the committed baseline
jscpd --baseline .jscpd-baseline.json --update-baseline .
# Fail when new clones appear (independent of --threshold)
jscpd --baseline .jscpd-baseline.json --fail-on-new-clones .
# Allow up to 3 new clones
jscpd --baseline .jscpd-baseline.json --fail-on-new-clones 3 .
# Stateless variant for PR gates: compare against a git ref instead of a file
jscpd --baseline-from-ref origin/main --fail-on-new-clones .
```
`--baseline-from-ref` checks the base ref's tree out into a temporary detached worktree, scans it with the same configuration, and compares fingerprints in memory. It costs a second scan of the corpus; the committed file needs only one. In CI, fetch the ref first (`fetch-depth: 0` or `git fetch origin main` ).
New-clone information flows through the reporters: `[NEW]` markers in `console` /`console-full` , per-clone `isNew` plus `newClones` / `newDuplicatedLines` statistics in `json` , level `error` in `sarif` , severity `major` in `codeclimate` , and `jscpd_new_clones` / `jscpd_new_duplicated_lines` gauges in `openmetrics` .
Config file keys: `baseline` , `baselineFromRef` , `failOnNewClones` .
docs: reorganize documentation into docs/ folder, separate v4/v5 docs
- Split the overloaded README.md into focused docs:
- docs/typescript.md: v4 (Node.js) CLI, reporters, API, config
- docs/rust.md: v5 (Rust) CLI, reporters, blame, differences from v4
- docs/ai-ready.md: AI reporter, agent skills, MCP server
- docs/api.md: Programming APIs (TypeScript and Rust)
- docs/packages.md: Monorepo package and crate overview
- Trim README.md to a concise entry point with links to docs/
- Slim down rust/README.md, rust/jscpd/README.md, rust/npm/README.md:
remove duplicated content, link to docs/rust.md for details
- Fix factual errors verified against actual CLI output:
- Format count: 223 (v5) and 224 (v4), not '225+'
- Reporter output filenames: jscpd-report.* not cpd.*
- --max-size: no default in v5 (not 512KB)
- --formats-exts: same hyphenated form in both v4 and v5
- --no-gitignore: same flag name in both v4 and v5
- Update rust/jscpd/package.json: add 'cpd' bin so jscpd@5
installs both jscpd and cpd commands
- Update crate versions in rust/README.md to match source (0.1.3/0.1.4)
2026-06-08 12:57:38 +02:00
### Blame Output
With `--blame --reporters console-full` , clones are displayed with a side-by-side author comparison:
```
176 │ Andrii Kucherenko │ <= │ 196 │ Josh Soref │ ## TODO
177 │ Andrii Kucherenko │ <= │ 197 │ Josh Soref │
180 │ Andrii Kucherenko │ == │ 200 │ Andrii Kucherenko │ ## License
```
`==` means both lines were written by the same author; `<=` means different authors (potential copy).
feat(cli): non-zero exit for unknown format, missing path, failed reporter; add --fail-on-empty
Closes #1047.
Four situations used to write an empty report and exit 0, so a CI job
that checks only the exit code saw a green run:
- `--format` naming a format that is not supported (a warning since #964)
is now `Error: --format: 'x' is not a supported format`, exit 1. Names
introduced through --formats-exts or --formats-names stay accepted.
- A scan path that does not exist is `Error: path does not exist: <p>`,
exit 1, before anything runs.
- A reporter that fails to write its output still prints the existing
`Reporter '<name>' error: ...` line; the run now ends with
`ERROR: a reporter failed to write its output` and exit 1, after the
other reporters have run.
- A scan that analyzes no files (paths exist, but nothing matched the
--format/--ignore/--pattern filters or every file was below
--min-tokens) prints `Warning: jscpd analyzed no files` and still
exits 0, so an intentionally empty tree passes. The new
`--fail-on-empty` flag (config key `failOnEmpty`, action input
`fail-on-empty`) makes it exit 1. Reports are written before the check.
Docs: an "Exit codes" section in docs/rust.md, option rows in
docs/rust.md and docs/ci-and-hooks.md, a README feature bullet.
Fixtures: fixtures/fail-on-empty-demo with a `code/` clone pair, a
`nothing/` comment-only file, and a README quoting every command's
output and exit code. Tests: the #964 warning test becomes an error
test, plus integration tests for each new exit path and for the config
key; 531 tests pass, clippy clean.
Claude-Session: https://claude.ai/code/session_01WztdFKZAwW9b51iJe9zhtV
2026-09-11 08:45:09 +02:00
### Exit codes
| Code | When |
|------|------|
| 0 | The scan ran and no gate fired; clones may still have been found and reported |
| 1 | `--threshold` exceeded; `--fail-on-new-clones` exceeded; `--fail-on-empty` and no file was analyzed; a reporter failed to write its output; a scan path does not exist; `--format` names a format that is not supported; an invalid flag combination or an unreadable `--config` file |
| N | `--exit-code N` (default 1) when at least one clone was found |
| 2 | Command-line parse errors: an unknown flag or a missing value |
A scan that analyzes no files, because the paths exist but nothing matched the `--format` , `--ignore` and `--pattern` filters or every file was below `--min-tokens` , prints `Warning: jscpd analyzed no files` and still exits 0, so an intentionally empty tree does not break a pipeline. `--fail-on-empty` (config key `failOnEmpty` ) turns that into an error for CI jobs where an empty result means a misconfigured scan. Reports are written before the check, so the empty report is still there to inspect. Unknown reporter names remain a warning. See [`fixtures/fail-on-empty-demo` ](../fixtures/fail-on-empty-demo/README.md ) for a runnable example.
docs: reorganize documentation into docs/ folder, separate v4/v5 docs
- Split the overloaded README.md into focused docs:
- docs/typescript.md: v4 (Node.js) CLI, reporters, API, config
- docs/rust.md: v5 (Rust) CLI, reporters, blame, differences from v4
- docs/ai-ready.md: AI reporter, agent skills, MCP server
- docs/api.md: Programming APIs (TypeScript and Rust)
- docs/packages.md: Monorepo package and crate overview
- Trim README.md to a concise entry point with links to docs/
- Slim down rust/README.md, rust/jscpd/README.md, rust/npm/README.md:
remove duplicated content, link to docs/rust.md for details
- Fix factual errors verified against actual CLI output:
- Format count: 223 (v5) and 224 (v4), not '225+'
- Reporter output filenames: jscpd-report.* not cpd.*
- --max-size: no default in v5 (not 512KB)
- --formats-exts: same hyphenated form in both v4 and v5
- --no-gitignore: same flag name in both v4 and v5
- Update rust/jscpd/package.json: add 'cpd' bin so jscpd@5
installs both jscpd and cpd commands
- Update crate versions in rust/README.md to match source (0.1.3/0.1.4)
2026-06-08 12:57:38 +02:00
### Examples
``` bash
chore: make master v5-only
Everything belonging to the v4 TypeScript engine moves to the master-v4
branch: apps/, packages/, build-utils/, changesets, pnpm workspace, turbo,
the Node.js CI workflow and the ts-* release jobs. What remains is the
Rust workspace under rust/, the npm wrapper and platform packages, the
GitHub Action, Docker image, flake, skills, benchmark and fixtures/.
- rust.yml gains a smoke job that runs the release binary against
fixtures/ (json, sarif, html) and asserts clones and reporters
- release.yml keeps only the Rust jobs; pnpm removed from every workflow;
audit.yml keeps cargo audit + cargo deny; dependabot drops the root npm entry
- root package.json becomes a thin private package depending on the exact
jscpd@5 version so the pre-commit hook keeps installing the binary;
sync-version.mjs keeps it in step
- .pre-commit-hooks.yaml used v4-only flags that the v5 CLI rejects; fixed
- FORMATS.md is now generated from the Rust tokenizer (224 formats)
- README, docs, CONTRIBUTING, SECURITY, package and crate descriptions,
benchmark and skills rewritten for v5 on its own terms: no v5-vs-v4 speed
multipliers anywhere, a single "Looking for v4?" pointer to master-v4
2026-09-02 10:15:10 +02:00
# Scan a directory
docs: reorganize documentation into docs/ folder, separate v4/v5 docs
- Split the overloaded README.md into focused docs:
- docs/typescript.md: v4 (Node.js) CLI, reporters, API, config
- docs/rust.md: v5 (Rust) CLI, reporters, blame, differences from v4
- docs/ai-ready.md: AI reporter, agent skills, MCP server
- docs/api.md: Programming APIs (TypeScript and Rust)
- docs/packages.md: Monorepo package and crate overview
- Trim README.md to a concise entry point with links to docs/
- Slim down rust/README.md, rust/jscpd/README.md, rust/npm/README.md:
remove duplicated content, link to docs/rust.md for details
- Fix factual errors verified against actual CLI output:
- Format count: 223 (v5) and 224 (v4), not '225+'
- Reporter output filenames: jscpd-report.* not cpd.*
- --max-size: no default in v5 (not 512KB)
- --formats-exts: same hyphenated form in both v4 and v5
- --no-gitignore: same flag name in both v4 and v5
- Update rust/jscpd/package.json: add 'cpd' bin so jscpd@5
installs both jscpd and cpd commands
- Update crate versions in rust/README.md to match source (0.1.3/0.1.4)
2026-06-08 12:57:38 +02:00
jscpd /path/to/source
# or
2026-09-17 18:37:20 +02:00
jscpd /path/to/source
docs: reorganize documentation into docs/ folder, separate v4/v5 docs
- Split the overloaded README.md into focused docs:
- docs/typescript.md: v4 (Node.js) CLI, reporters, API, config
- docs/rust.md: v5 (Rust) CLI, reporters, blame, differences from v4
- docs/ai-ready.md: AI reporter, agent skills, MCP server
- docs/api.md: Programming APIs (TypeScript and Rust)
- docs/packages.md: Monorepo package and crate overview
- Trim README.md to a concise entry point with links to docs/
- Slim down rust/README.md, rust/jscpd/README.md, rust/npm/README.md:
remove duplicated content, link to docs/rust.md for details
- Fix factual errors verified against actual CLI output:
- Format count: 223 (v5) and 224 (v4), not '225+'
- Reporter output filenames: jscpd-report.* not cpd.*
- --max-size: no default in v5 (not 512KB)
- --formats-exts: same hyphenated form in both v4 and v5
- --no-gitignore: same flag name in both v4 and v5
- Update rust/jscpd/package.json: add 'cpd' bin so jscpd@5
installs both jscpd and cpd commands
- Update crate versions in rust/README.md to match source (0.1.3/0.1.4)
2026-06-08 12:57:38 +02:00
chore: make master v5-only
Everything belonging to the v4 TypeScript engine moves to the master-v4
branch: apps/, packages/, build-utils/, changesets, pnpm workspace, turbo,
the Node.js CI workflow and the ts-* release jobs. What remains is the
Rust workspace under rust/, the npm wrapper and platform packages, the
GitHub Action, Docker image, flake, skills, benchmark and fixtures/.
- rust.yml gains a smoke job that runs the release binary against
fixtures/ (json, sarif, html) and asserts clones and reporters
- release.yml keeps only the Rust jobs; pnpm removed from every workflow;
audit.yml keeps cargo audit + cargo deny; dependabot drops the root npm entry
- root package.json becomes a thin private package depending on the exact
jscpd@5 version so the pre-commit hook keeps installing the binary;
sync-version.mjs keeps it in step
- .pre-commit-hooks.yaml used v4-only flags that the v5 CLI rejects; fixed
- FORMATS.md is now generated from the Rust tokenizer (224 formats)
- README, docs, CONTRIBUTING, SECURITY, package and crate descriptions,
benchmark and skills rewritten for v5 on its own terms: no v5-vs-v4 speed
multipliers anywhere, a single "Looking for v4?" pointer to master-v4
2026-09-02 10:15:10 +02:00
# Tune sensitivity and pick reporters
2026-09-17 18:37:20 +02:00
jscpd /path/to/source --min-tokens 30 --min-lines 3 --reporters console,json,html
docs: reorganize documentation into docs/ folder, separate v4/v5 docs
- Split the overloaded README.md into focused docs:
- docs/typescript.md: v4 (Node.js) CLI, reporters, API, config
- docs/rust.md: v5 (Rust) CLI, reporters, blame, differences from v4
- docs/ai-ready.md: AI reporter, agent skills, MCP server
- docs/api.md: Programming APIs (TypeScript and Rust)
- docs/packages.md: Monorepo package and crate overview
- Trim README.md to a concise entry point with links to docs/
- Slim down rust/README.md, rust/jscpd/README.md, rust/npm/README.md:
remove duplicated content, link to docs/rust.md for details
- Fix factual errors verified against actual CLI output:
- Format count: 223 (v5) and 224 (v4), not '225+'
- Reporter output filenames: jscpd-report.* not cpd.*
- --max-size: no default in v5 (not 512KB)
- --formats-exts: same hyphenated form in both v4 and v5
- --no-gitignore: same flag name in both v4 and v5
- Update rust/jscpd/package.json: add 'cpd' bin so jscpd@5
installs both jscpd and cpd commands
- Update crate versions in rust/README.md to match source (0.1.3/0.1.4)
2026-06-08 12:57:38 +02:00
# Git blame with side-by-side author comparison
2026-09-17 18:37:20 +02:00
jscpd /path/to/source --blame --reporters console-full
docs: reorganize documentation into docs/ folder, separate v4/v5 docs
- Split the overloaded README.md into focused docs:
- docs/typescript.md: v4 (Node.js) CLI, reporters, API, config
- docs/rust.md: v5 (Rust) CLI, reporters, blame, differences from v4
- docs/ai-ready.md: AI reporter, agent skills, MCP server
- docs/api.md: Programming APIs (TypeScript and Rust)
- docs/packages.md: Monorepo package and crate overview
- Trim README.md to a concise entry point with links to docs/
- Slim down rust/README.md, rust/jscpd/README.md, rust/npm/README.md:
remove duplicated content, link to docs/rust.md for details
- Fix factual errors verified against actual CLI output:
- Format count: 223 (v5) and 224 (v4), not '225+'
- Reporter output filenames: jscpd-report.* not cpd.*
- --max-size: no default in v5 (not 512KB)
- --formats-exts: same hyphenated form in both v4 and v5
- --no-gitignore: same flag name in both v4 and v5
- Update rust/jscpd/package.json: add 'cpd' bin so jscpd@5
installs both jscpd and cpd commands
- Update crate versions in rust/README.md to match source (0.1.3/0.1.4)
2026-06-08 12:57:38 +02:00
# List supported formats
2026-09-17 18:37:20 +02:00
jscpd --list
docs: reorganize documentation into docs/ folder, separate v4/v5 docs
- Split the overloaded README.md into focused docs:
- docs/typescript.md: v4 (Node.js) CLI, reporters, API, config
- docs/rust.md: v5 (Rust) CLI, reporters, blame, differences from v4
- docs/ai-ready.md: AI reporter, agent skills, MCP server
- docs/api.md: Programming APIs (TypeScript and Rust)
- docs/packages.md: Monorepo package and crate overview
- Trim README.md to a concise entry point with links to docs/
- Slim down rust/README.md, rust/jscpd/README.md, rust/npm/README.md:
remove duplicated content, link to docs/rust.md for details
- Fix factual errors verified against actual CLI output:
- Format count: 223 (v5) and 224 (v4), not '225+'
- Reporter output filenames: jscpd-report.* not cpd.*
- --max-size: no default in v5 (not 512KB)
- --formats-exts: same hyphenated form in both v4 and v5
- --no-gitignore: same flag name in both v4 and v5
- Update rust/jscpd/package.json: add 'cpd' bin so jscpd@5
installs both jscpd and cpd commands
- Update crate versions in rust/README.md to match source (0.1.3/0.1.4)
2026-06-08 12:57:38 +02:00
# Use multiple reporters with custom output
2026-09-17 18:37:20 +02:00
jscpd ./src -r console,json,sarif -o ./reports
docs: reorganize documentation into docs/ folder, separate v4/v5 docs
- Split the overloaded README.md into focused docs:
- docs/typescript.md: v4 (Node.js) CLI, reporters, API, config
- docs/rust.md: v5 (Rust) CLI, reporters, blame, differences from v4
- docs/ai-ready.md: AI reporter, agent skills, MCP server
- docs/api.md: Programming APIs (TypeScript and Rust)
- docs/packages.md: Monorepo package and crate overview
- Trim README.md to a concise entry point with links to docs/
- Slim down rust/README.md, rust/jscpd/README.md, rust/npm/README.md:
remove duplicated content, link to docs/rust.md for details
- Fix factual errors verified against actual CLI output:
- Format count: 223 (v5) and 224 (v4), not '225+'
- Reporter output filenames: jscpd-report.* not cpd.*
- --max-size: no default in v5 (not 512KB)
- --formats-exts: same hyphenated form in both v4 and v5
- --no-gitignore: same flag name in both v4 and v5
- Update rust/jscpd/package.json: add 'cpd' bin so jscpd@5
installs both jscpd and cpd commands
- Update crate versions in rust/README.md to match source (0.1.3/0.1.4)
2026-06-08 12:57:38 +02:00
# Skip clones within the same directory
2026-09-17 18:37:20 +02:00
jscpd --skip-local /path/to/source
2026-08-17 19:37:21 +02:00
# Monorepo: don't compare team-owned packages with each other
2026-09-17 18:37:20 +02:00
jscpd . --skip-isolated "packages/team-a|packages/team-b"
docs: reorganize documentation into docs/ folder, separate v4/v5 docs
- Split the overloaded README.md into focused docs:
- docs/typescript.md: v4 (Node.js) CLI, reporters, API, config
- docs/rust.md: v5 (Rust) CLI, reporters, blame, differences from v4
- docs/ai-ready.md: AI reporter, agent skills, MCP server
- docs/api.md: Programming APIs (TypeScript and Rust)
- docs/packages.md: Monorepo package and crate overview
- Trim README.md to a concise entry point with links to docs/
- Slim down rust/README.md, rust/jscpd/README.md, rust/npm/README.md:
remove duplicated content, link to docs/rust.md for details
- Fix factual errors verified against actual CLI output:
- Format count: 223 (v5) and 224 (v4), not '225+'
- Reporter output filenames: jscpd-report.* not cpd.*
- --max-size: no default in v5 (not 512KB)
- --formats-exts: same hyphenated form in both v4 and v5
- --no-gitignore: same flag name in both v4 and v5
- Update rust/jscpd/package.json: add 'cpd' bin so jscpd@5
installs both jscpd and cpd commands
- Update crate versions in rust/README.md to match source (0.1.3/0.1.4)
2026-06-08 12:57:38 +02:00
```
### Config File
chore: make master v5-only
Everything belonging to the v4 TypeScript engine moves to the master-v4
branch: apps/, packages/, build-utils/, changesets, pnpm workspace, turbo,
the Node.js CI workflow and the ts-* release jobs. What remains is the
Rust workspace under rust/, the npm wrapper and platform packages, the
GitHub Action, Docker image, flake, skills, benchmark and fixtures/.
- rust.yml gains a smoke job that runs the release binary against
fixtures/ (json, sarif, html) and asserts clones and reporters
- release.yml keeps only the Rust jobs; pnpm removed from every workflow;
audit.yml keeps cargo audit + cargo deny; dependabot drops the root npm entry
- root package.json becomes a thin private package depending on the exact
jscpd@5 version so the pre-commit hook keeps installing the binary;
sync-version.mjs keeps it in step
- .pre-commit-hooks.yaml used v4-only flags that the v5 CLI rejects; fixed
- FORMATS.md is now generated from the Rust tokenizer (224 formats)
- README, docs, CONTRIBUTING, SECURITY, package and crate descriptions,
benchmark and skills rewritten for v5 on its own terms: no v5-vs-v4 speed
multipliers anywhere, a single "Looking for v4?" pointer to master-v4
2026-09-02 10:15:10 +02:00
Options can also come from a `.jscpd.json` config file (camelCase keys; existing v4 config files work unchanged):
docs: reorganize documentation into docs/ folder, separate v4/v5 docs
- Split the overloaded README.md into focused docs:
- docs/typescript.md: v4 (Node.js) CLI, reporters, API, config
- docs/rust.md: v5 (Rust) CLI, reporters, blame, differences from v4
- docs/ai-ready.md: AI reporter, agent skills, MCP server
- docs/api.md: Programming APIs (TypeScript and Rust)
- docs/packages.md: Monorepo package and crate overview
- Trim README.md to a concise entry point with links to docs/
- Slim down rust/README.md, rust/jscpd/README.md, rust/npm/README.md:
remove duplicated content, link to docs/rust.md for details
- Fix factual errors verified against actual CLI output:
- Format count: 223 (v5) and 224 (v4), not '225+'
- Reporter output filenames: jscpd-report.* not cpd.*
- --max-size: no default in v5 (not 512KB)
- --formats-exts: same hyphenated form in both v4 and v5
- --no-gitignore: same flag name in both v4 and v5
- Update rust/jscpd/package.json: add 'cpd' bin so jscpd@5
installs both jscpd and cpd commands
- Update crate versions in rust/README.md to match source (0.1.3/0.1.4)
2026-06-08 12:57:38 +02:00
``` json
{
"path" : [ "./src" ] ,
"reporters" : [ "console" , "json" ] ,
"minLines" : 5 ,
"minTokens" : 50 ,
"threshold" : 0 ,
"format" : [ "javascript" , "typescript" ] ,
"ignore" : [ "**/node_modules/**" ] ,
2026-09-04 15:12:29 +02:00
"ignorePattern" : [ "generated by .*" ] ,
feat: Type-2 clone detection (--ignore-identifiers, --ignore-literals, --ignore-annotations)
Closes #998.
Three opt-in flags (config keys ignoreIdentifiers, ignoreLiterals,
ignoreAnnotations) normalize token classes before hashing so that blocks
which differ only in names, values or annotations are detected:
- identifiers hash as `$id`; keywords are kept (the JS/TS tokenizer
classifies them, other languages use a built-in common-keyword list)
- string literals hash as `$str`, numeric literals as `$num`
- `@Name`, `@a.b.Name` and `@Name(...)` runs are dropped in Java, Kotlin,
Scala, Groovy, Python, Dart, Swift, JavaScript and TypeScript
Each clone now carries `kind: exact | renamed`. DetectionToken gains a
raw_hash (equal to hash unless normalization rewrote the token); the
PreparedSource materializes raw hashes only when a token was normalized,
and the detector compares raw hashes over the matched run to classify a
pair. A dropped annotation salts the raw hash of the token before it, so a
pair differing only in annotations inside the matched run is `renamed`.
Reporters: console prints `Clone found (fmt, renamed)`, ai appends
`(renamed)`, json adds "kind", sarif uses rule jscpd/similar-code (declared
only when referenced), codeclimate the same check_name. Default runs are
unchanged apart from the additive "kind": "exact" JSON field.
Also: GitHub Action inputs, docs section, fixtures/type2-demo with a README
of runnable commands, unit tests in tokenizer/core/reporter, CLI flag
tests, and a binary-level integration test.
2026-09-05 11:06:23 +02:00
"ignoreIdentifiers" : false ,
"ignoreLiterals" : false ,
"ignoreAnnotations" : false ,
feat: near-miss clone merging with --max-gap-lines (Type-3, stage 1 of #999)
Off by default (0). When set to N, clones of the same file pair whose
fragments follow each other in both files with at most N unmatched lines
between them are merged into one clone of kind `similar`, with `tokens` =
matched tokens and `similarity` = matched tokens over the tokens of the
longer merged span. Adjacent exact windows that share a boundary token are
counted once; chains merge transitively; overlapping or reordered fragments
never merge. The pass runs after every other filter and returns its input
untouched at 0, so default output is unchanged.
Reporting: console `Clone found (fmt, similar ~0.91)`, ai `[~0.91]`, JSON
"kind"/"similarity" (rounded to three decimals), SARIF rule
jscpd/near-miss-code with a similarity property (declared only when
referenced), Code Climate check_name.
Config key maxGapLines (kebab alias), GitHub Action input max-gap-lines,
docs section, fixtures/type3-demo with a README of runnable commands, unit
tests for the merge pass and reporters, and a binary-level integration test.
2026-09-06 08:55:12 +02:00
"maxGapLines" : 0 ,
docs: reorganize documentation into docs/ folder, separate v4/v5 docs
- Split the overloaded README.md into focused docs:
- docs/typescript.md: v4 (Node.js) CLI, reporters, API, config
- docs/rust.md: v5 (Rust) CLI, reporters, blame, differences from v4
- docs/ai-ready.md: AI reporter, agent skills, MCP server
- docs/api.md: Programming APIs (TypeScript and Rust)
- docs/packages.md: Monorepo package and crate overview
- Trim README.md to a concise entry point with links to docs/
- Slim down rust/README.md, rust/jscpd/README.md, rust/npm/README.md:
remove duplicated content, link to docs/rust.md for details
- Fix factual errors verified against actual CLI output:
- Format count: 223 (v5) and 224 (v4), not '225+'
- Reporter output filenames: jscpd-report.* not cpd.*
- --max-size: no default in v5 (not 512KB)
- --formats-exts: same hyphenated form in both v4 and v5
- --no-gitignore: same flag name in both v4 and v5
- Update rust/jscpd/package.json: add 'cpd' bin so jscpd@5
installs both jscpd and cpd commands
- Update crate versions in rust/README.md to match source (0.1.3/0.1.4)
2026-06-08 12:57:38 +02:00
"gitignore" : true ,
"mode" : "mild"
}
```
2026-08-17 19:37:21 +02:00
Isolation groups use the nested-array form in the config file: `"skipIsolated": [["packages/a", "packages/b"]]` .
2026-08-30 11:20:31 +02:00
Config discovery order: `--config <path>` → `.jscpd.json` → `.config/jscpd.json` (the [dot-config convention ](https://dot-config.github.io/ ), also accepts `.config/.jscpd.json` ) → the `jscpd` key in `package.json` .
2026-09-04 15:12:29 +02:00
### Ignoring source regions
2026-09-05 09:15:58 +02:00
Use `--ignore-pattern` (or `ignorePattern` in `.jscpd.json` ) when only part of a file should be excluded. Each regular expression is matched against the raw source text before tokenization, and tokens that overlap a match are omitted from clone detection. This matches the v4 behavior; v5 uses [Rust regex syntax ](https://docs.rs/regex/latest/regex/#syntax ), which does not support look-around or backreferences. A pattern that fails to compile is skipped with a warning.
The CLI flag splits its value on commas, so a regular expression that itself contains a comma (a `{1,3}` repetition, a character class such as `[,;]` ) must be set in the config file instead.
2026-09-04 15:12:29 +02:00
For a one-off region, place `jscpd:ignore-start` and `jscpd:ignore-end` in comments that are valid for the source language:
``` javascript
// jscpd:ignore-start
const generatedLookup = {
alpha : 1 ,
beta : 2 ,
} ;
// jscpd:ignore-end
```
All source between the markers is excluded during tokenization. This works in every detection mode.
2026-09-05 09:15:58 +02:00
License headers are a common use case in languages whose comments are tokenized: C#, Java, Go, Python and every other format handled by the generic tokenizer. JavaScript and TypeScript comments never produce tokens, so a header in those files is never part of a clone and needs no exception. Mark a header explicitly when only a few files need it:
2026-09-04 15:12:29 +02:00
2026-09-05 09:15:58 +02:00
``` csharp
2026-09-04 15:12:29 +02:00
// jscpd:ignore-start
/*
* Copyright 2026 Example Authors
* Licensed under the Example License
*/
// jscpd:ignore-end
```
For the same block-comment header across many files, configure one anchored, dot-all regular expression instead:
``` json
{
"ignorePattern" : [ "(?s)\\A/\\*.*?\\*/" ]
}
```
The JSON escaping above produces the Rust regular expression `(?s)\A/\*.*?\*/` , which matches the first block comment only when it starts at the beginning of the file. Adjust the expression to the comment style and exact license text used by the project.
2026-09-05 09:15:58 +02:00
`--mode weak` is a blunter alternative: it drops every comment from detection in every language, so duplicated comments elsewhere in the code are ignored too.
feat: Type-2 clone detection (--ignore-identifiers, --ignore-literals, --ignore-annotations)
Closes #998.
Three opt-in flags (config keys ignoreIdentifiers, ignoreLiterals,
ignoreAnnotations) normalize token classes before hashing so that blocks
which differ only in names, values or annotations are detected:
- identifiers hash as `$id`; keywords are kept (the JS/TS tokenizer
classifies them, other languages use a built-in common-keyword list)
- string literals hash as `$str`, numeric literals as `$num`
- `@Name`, `@a.b.Name` and `@Name(...)` runs are dropped in Java, Kotlin,
Scala, Groovy, Python, Dart, Swift, JavaScript and TypeScript
Each clone now carries `kind: exact | renamed`. DetectionToken gains a
raw_hash (equal to hash unless normalization rewrote the token); the
PreparedSource materializes raw hashes only when a token was normalized,
and the detector compares raw hashes over the matched run to classify a
pair. A dropped annotation salts the raw hash of the token before it, so a
pair differing only in annotations inside the matched run is `renamed`.
Reporters: console prints `Clone found (fmt, renamed)`, ai appends
`(renamed)`, json adds "kind", sarif uses rule jscpd/similar-code (declared
only when referenced), codeclimate the same check_name. Default runs are
unchanged apart from the additive "kind": "exact" JSON field.
Also: GitHub Action inputs, docs section, fixtures/type2-demo with a README
of runnable commands, unit tests in tokenizer/core/reporter, CLI flag
tests, and a binary-level integration test.
2026-09-05 11:06:23 +02:00
### Type-2 clones: renamed identifiers, literals and annotations
By default two blocks are a clone only when their tokens are identical. Three opt-in flags normalize token classes before hashing so that blocks which differ only in names or values match as well (Type-2 clones, the same idea as PMD CPD's `--ignore-identifiers` / `--ignore-literals` / `--ignore-annotations` ):
| Flag | Config key | What is normalized |
|------|------------|--------------------|
| `--ignore-identifiers` | `ignoreIdentifiers` | Every identifier hashes as `$id` . Keywords are kept, so `if` never matches `while` : the JavaScript/TypeScript tokenizer classifies keywords itself, other languages use a built-in list of common keywords |
| `--ignore-literals` | `ignoreLiterals` | String literals hash as `$str` , numeric literals as `$num` ; `true` , `null` and regex literals keep their value |
| `--ignore-annotations` | `ignoreAnnotations` | `@Name` , `@a.b.Name` and `@Name(...)` runs are dropped in Java, Kotlin, Scala, Groovy, Python, Dart, Swift, JavaScript and TypeScript. Formats where `@` prefixes a variable or directive (Ruby, Perl, Razor, T-SQL, CSS) are untouched |
2026-09-07 18:51:21 +02:00
Positions in reports still point at the original source. Each clone carries a `kind` : `exact` when the raw tokens of both fragments are identical, `renamed` when they match only after normalization. The console prints `Clone found (javascript, renamed)` , the `ai` reporter appends `(renamed)` , the JSON report adds `"kind": "renamed"` to each duplicate, SARIF reports renamed clones under the rule `jscpd/renamed-code` (exact ones stay `jscpd/duplicate-code` ), and Code Climate uses the same two `check_name` values. A run without these flags reports only `exact` clones and its output is unchanged. When `--max-gap-lines` merges two renamed halves, the result is `similar` : a merged clone is no longer identical even after normalization, so `similar` takes precedence over `renamed` .
feat: Type-2 clone detection (--ignore-identifiers, --ignore-literals, --ignore-annotations)
Closes #998.
Three opt-in flags (config keys ignoreIdentifiers, ignoreLiterals,
ignoreAnnotations) normalize token classes before hashing so that blocks
which differ only in names, values or annotations are detected:
- identifiers hash as `$id`; keywords are kept (the JS/TS tokenizer
classifies them, other languages use a built-in common-keyword list)
- string literals hash as `$str`, numeric literals as `$num`
- `@Name`, `@a.b.Name` and `@Name(...)` runs are dropped in Java, Kotlin,
Scala, Groovy, Python, Dart, Swift, JavaScript and TypeScript
Each clone now carries `kind: exact | renamed`. DetectionToken gains a
raw_hash (equal to hash unless normalization rewrote the token); the
PreparedSource materializes raw hashes only when a token was normalized,
and the detector compares raw hashes over the matched run to classify a
pair. A dropped annotation salts the raw hash of the token before it, so a
pair differing only in annotations inside the matched run is `renamed`.
Reporters: console prints `Clone found (fmt, renamed)`, ai appends
`(renamed)`, json adds "kind", sarif uses rule jscpd/similar-code (declared
only when referenced), codeclimate the same check_name. Default runs are
unchanged apart from the additive "kind": "exact" JSON field.
Also: GitHub Action inputs, docs section, fixtures/type2-demo with a README
of runnable commands, unit tests in tokenizer/core/reporter, CLI flag
tests, and a binary-level integration test.
2026-09-05 11:06:23 +02:00
``` bash
jscpd --ignore-identifiers src/ # function a(x) {…} matches function b(y) {…}
jscpd --ignore-identifiers --ignore-literals src/ # …and 10 matches 25, 'dev' matches 'prod'
jscpd --ignore-annotations src/main/java/ # @Override / @Deprecated no longer split a clone
```
Normalized runs find more and longer clones than exact runs, so their snippet fingerprints (`jscpdCloneHash/v1` ) differ from an exact run's. Keep a separate `--baseline` file per configuration. See [`fixtures/type2-demo` ](../fixtures/type2-demo/README.md ) for a runnable example of each flag.
feat: near-miss clone merging with --max-gap-lines (Type-3, stage 1 of #999)
Off by default (0). When set to N, clones of the same file pair whose
fragments follow each other in both files with at most N unmatched lines
between them are merged into one clone of kind `similar`, with `tokens` =
matched tokens and `similarity` = matched tokens over the tokens of the
longer merged span. Adjacent exact windows that share a boundary token are
counted once; chains merge transitively; overlapping or reordered fragments
never merge. The pass runs after every other filter and returns its input
untouched at 0, so default output is unchanged.
Reporting: console `Clone found (fmt, similar ~0.91)`, ai `[~0.91]`, JSON
"kind"/"similarity" (rounded to three decimals), SARIF rule
jscpd/near-miss-code with a similarity property (declared only when
referenced), Code Climate check_name.
Config key maxGapLines (kebab alias), GitHub Action input max-gap-lines,
docs section, fixtures/type3-demo with a README of runnable commands, unit
tests for the merge pass and reporters, and a binary-level integration test.
2026-09-06 08:55:12 +02:00
### Type-3 clones: near-miss merging with `--max-gap-lines`
A copy with a line inserted, removed or changed in the middle shows up as two shorter exact clones with a gap between them, each of which must clear `--min-tokens` and `--min-lines` on its own. `--max-gap-lines N` (config key `maxGapLines` ) merges clones of the same file pair whose fragments follow each other in * both * files with at most `N` unmatched lines in between, and reports the result as one clone of kind `similar` :
``` bash
jscpd src/ # a.js 1-4 ↔ b.js 1-4, a.js 4-9 ↔ b.js 5-10: two exact clones
2026-09-06 18:36:49 +02:00
jscpd --max-gap-lines 1 src/ # Clone found (javascript, similar (gap) ~0.85): a.js 1-9 ↔ b.js 1-10
feat: near-miss clone merging with --max-gap-lines (Type-3, stage 1 of #999)
Off by default (0). When set to N, clones of the same file pair whose
fragments follow each other in both files with at most N unmatched lines
between them are merged into one clone of kind `similar`, with `tokens` =
matched tokens and `similarity` = matched tokens over the tokens of the
longer merged span. Adjacent exact windows that share a boundary token are
counted once; chains merge transitively; overlapping or reordered fragments
never merge. The pass runs after every other filter and returns its input
untouched at 0, so default output is unchanged.
Reporting: console `Clone found (fmt, similar ~0.91)`, ai `[~0.91]`, JSON
"kind"/"similarity" (rounded to three decimals), SARIF rule
jscpd/near-miss-code with a similarity property (declared only when
referenced), Code Climate check_name.
Config key maxGapLines (kebab alias), GitHub Action input max-gap-lines,
docs section, fixtures/type3-demo with a README of runnable commands, unit
tests for the merge pass and reporters, and a binary-level integration test.
2026-09-06 08:55:12 +02:00
```
A merged clone's `tokens` is the number of matched tokens and `similarity` is that number divided by the tokens of the longer merged span, so a single inserted line in a 60-token block gives roughly `0.9` . Chains of matches merge transitively, and the merge is applied after every other filter (`--min-lines` , `--skip-local` , `--skip-isolated` ). Because merging only ever joins clones the exact run already reported, it cannot introduce a match that was not there; it removes fragmentation. It applies to every language.
2026-09-07 18:51:21 +02:00
Reporting: the console prints `Clone found (javascript, similar (gap) ~0.85)` , the `ai` reporter appends `[~0.85 gap]` , the JSON report adds `"kind": "similar"` , a `"similarity"` value and `"method": "gap"` , SARIF files merged clones under `jscpd/similar-code` with `similarity` and `similarity_method` properties, and Code Climate uses the same `check_name` . The method is shown because the two near-miss mechanisms score on different scales: `gap` is matched tokens over the merged span, `ast` (from `--similarity` , below) is structural overlap of whole functions. A merge is refused when its similarity would fall below `0.5` , that is when the gap holds more tokens than the halves match (one very long inserted line, say); the halves are then reported separately as before. Duplicated-line statistics count only the matched lines of a merged clone, so enabling the merge does not move `--threshold` . With the default `0` the merge pass is skipped entirely and output is identical to earlier releases. See [`fixtures/type3-demo` ](../fixtures/type3-demo/README.md ) for a runnable example.
feat: near-miss clone merging with --max-gap-lines (Type-3, stage 1 of #999)
Off by default (0). When set to N, clones of the same file pair whose
fragments follow each other in both files with at most N unmatched lines
between them are merged into one clone of kind `similar`, with `tokens` =
matched tokens and `similarity` = matched tokens over the tokens of the
longer merged span. Adjacent exact windows that share a boundary token are
counted once; chains merge transitively; overlapping or reordered fragments
never merge. The pass runs after every other filter and returns its input
untouched at 0, so default output is unchanged.
Reporting: console `Clone found (fmt, similar ~0.91)`, ai `[~0.91]`, JSON
"kind"/"similarity" (rounded to three decimals), SARIF rule
jscpd/near-miss-code with a similarity property (declared only when
referenced), Code Climate check_name.
Config key maxGapLines (kebab alias), GitHub Action input max-gap-lines,
docs section, fixtures/type3-demo with a README of runnable commands, unit
tests for the merge pass and reporters, and a binary-level integration test.
2026-09-06 08:55:12 +02:00
feat(cli): --dashboard with duplication, complexity and dead code
--dashboard prints one screen: project size and largest formats,
duplication with clones per kind and the most duplicated files, total and
mean complexity with the most complex files, and dead code by category
with the largest findings (JavaScript, TypeScript, Python). The dead-code
scan runs beside clone detection; --summary-top sets the rows per list.
Data formats (JSON, YAML, TOML, CSV, ...) join markdown at complexity 0,
so a lock file's version ranges no longer top the complexity ranking.
Docs for --kind, --complexity and --dashboard; fixtures/dashboard-demo,
plus --kind and --complexity sections in the type3 and summary demos.
2026-09-17 18:15:45 +02:00
### Filtering by kind with `--kind`
`--kind` (config key `kind` ) keeps only the clones of the kinds it lists: `exact` , `renamed` , `similar` , or one of the two mechanisms behind `similar` , `gap` (`--max-gap-lines` ) and `ast` (`--similarity` ). Statistics, `--threshold` and every reporter see the filtered list. The filter never switches a detector on: `--kind ast` without `--similarity` warns that no such clones can be found, and an unknown kind is an error, so a typo cannot turn a scan silently clean.
``` bash
jscpd --ignore-identifiers --kind renamed src/ # only the renamed copies
jscpd --max-gap-lines 2 --similarity 0.8 --kind gap,ast src/ # only near-miss clones
```
See [`fixtures/type3-demo` ](../fixtures/type3-demo/README.md#keeping-one-kind---kind ) for a runnable example.
feat: function-level similarity for JS/TS with --similarity (Type-3, stage 2 of #999)
Off by default. `--similarity RATIO` (config `similarity`, Action input
`similarity`, MCP `check_duplication` argument) summarizes every function,
method and arrow function of a JavaScript/TypeScript/JSX/TSX file by the
bag of 4-grams over the pre-order sequence of its AST node types (oxc),
indexes the bags with MinHash + LSH banding, and reports pairs whose
weighted Jaccard index reaches RATIO as `similar` clones with a
`similarity` value. Names and literal values are not part of the summary:
a renamed copy scores 1.0, one inserted line ~0.9, two inserted statements
plus renames ~0.75.
Functions must clear --min-tokens/--min-lines, nested functions are never
paired with their parent, and pairs already covered by an exact, renamed
or merged clone are skipped. Values outside (0, 1] warn and disable the
option. Reporting reuses the Type-3 vocabulary (console `similar ~0.75`,
JSON kind/similarity, SARIF jscpd/near-miss-code).
New: cpd-core::similarity (FunctionSig, SimilarityIndex, bag_jaccard,
minhash), cpd-tokenizer::functions (oxc visitor extractor), MCP function
index built lazily per scan. fixtures/type3-demo/similar-functions with
README numbers, docs, unit + integration + MCP stdio tests. Also adds the
missing max_gap_lines/similarity fields to the --debug config output.
2026-09-06 12:27:03 +02:00
### Function-level similarity with `--similarity`
2026-09-06 18:01:38 +02:00
Edits spread through a function rather than concentrated in one gap still escape a token window. `--similarity RATIO` (config key `similarity` , a number in `(0, 1]` ; the default `1` means exact matches only, so the pass never runs until you set a lower value) compares whole functions instead: every function declaration, function expression, method and arrow function in a JavaScript, TypeScript, JSX or TSX file is summarized by the bag of 4-grams over the pre-order sequence of its syntax-tree node * types * , and two functions are reported as one `similar` clone when the weighted Jaccard index of their bags reaches `RATIO` . Names and literal values are not part of the summary, so a renamed copy scores `1.0` ; one inserted line scores about `0.9` ; two inserted statements plus renames score about `0.75` . Candidates come from a MinHash index, so the search stays close to linear in the number of functions.
feat: function-level similarity for JS/TS with --similarity (Type-3, stage 2 of #999)
Off by default. `--similarity RATIO` (config `similarity`, Action input
`similarity`, MCP `check_duplication` argument) summarizes every function,
method and arrow function of a JavaScript/TypeScript/JSX/TSX file by the
bag of 4-grams over the pre-order sequence of its AST node types (oxc),
indexes the bags with MinHash + LSH banding, and reports pairs whose
weighted Jaccard index reaches RATIO as `similar` clones with a
`similarity` value. Names and literal values are not part of the summary:
a renamed copy scores 1.0, one inserted line ~0.9, two inserted statements
plus renames ~0.75.
Functions must clear --min-tokens/--min-lines, nested functions are never
paired with their parent, and pairs already covered by an exact, renamed
or merged clone are skipped. Values outside (0, 1] warn and disable the
option. Reporting reuses the Type-3 vocabulary (console `similar ~0.75`,
JSON kind/similarity, SARIF jscpd/near-miss-code).
New: cpd-core::similarity (FunctionSig, SimilarityIndex, bag_jaccard,
minhash), cpd-tokenizer::functions (oxc visitor extractor), MCP function
index built lazily per scan. fixtures/type3-demo/similar-functions with
README numbers, docs, unit + integration + MCP stdio tests. Also adds the
missing max_gap_lines/similarity fields to the --debug config output.
2026-09-06 12:27:03 +02:00
``` bash
jscpd --similarity 0.85 src/ # near-identical structure: renames, literal changes, a one-line edit
jscpd --similarity 0.7 src/ # looser: a couple of added or removed statements
```
2026-09-06 18:36:49 +02:00
Functions must clear `--min-tokens` and `--min-lines` on their own, nested functions are never paired with their parent, and a pair that an exact, renamed or merged clone already covers is not reported again. Reporting is the same as for merged clones except for the method: the console prints `Clone found (javascript, similar (ast) ~0.75)` , the `ai` reporter `[~0.75 ast]` , JSON carries `"method": "ast"` and SARIF `similarity_method` ; `tokens` is the smaller function's token count and the fragments span the whole functions. Values outside `(0, 1]` print a warning and fall back to `1` .
2026-09-06 17:06:20 +02:00
Scoring needs a syntax tree, and today only JavaScript/TypeScript have one (oxc). Each language plugs in through the `FunctionExtractor` trait in `cpd-tokenizer` (`functions.rs` ): a grammar id, the formats it serves, and a walk that opens a function at every function-like node and records the node-type sequence inside it. Signatures carry their grammar id and are only compared within one grammar, so a tree-sitter-backed extractor for another language is a self-contained addition; the scoring, CLI, MCP tool and reporters need no change. Formats without an extractor are a silent no-op. The MCP `check_duplication` tool accepts the same `similarity` argument and returns the structurally similar project functions for each function in the snippet.
feat: near-miss clone merging with --max-gap-lines (Type-3, stage 1 of #999)
Off by default (0). When set to N, clones of the same file pair whose
fragments follow each other in both files with at most N unmatched lines
between them are merged into one clone of kind `similar`, with `tokens` =
matched tokens and `similarity` = matched tokens over the tokens of the
longer merged span. Adjacent exact windows that share a boundary token are
counted once; chains merge transitively; overlapping or reordered fragments
never merge. The pass runs after every other filter and returns its input
untouched at 0, so default output is unchanged.
Reporting: console `Clone found (fmt, similar ~0.91)`, ai `[~0.91]`, JSON
"kind"/"similarity" (rounded to three decimals), SARIF rule
jscpd/near-miss-code with a similarity property (declared only when
referenced), Code Climate check_name.
Config key maxGapLines (kebab alias), GitHub Action input max-gap-lines,
docs section, fixtures/type3-demo with a README of runnable commands, unit
tests for the merge pass and reporters, and a binary-level integration test.
2026-09-06 08:55:12 +02:00
docs: say that jscpd tokenizes by language syntax, not text
Reviews compare jscpd with detectors that "use language-specific
normalization" as if jscpd matched raw text. It does not: every format
has its own comment and string rules, JS/TS/JSX/TSX go through the oxc
parser (with TypeScript erasure for cross-format pools), Vue/Svelte/
Astro/Markdown/Razor are split into embedded languages, and tokens are
classified so the Type-2 pass keeps keywords while renaming identifiers.
The README intro and a new first Features bullet say so, and docs/rust.md
gains a "How detection works" section walking through format detection,
tokenization, modes and ignores, normalization, Rabin-Karp matching and
the near-miss passes, plus what stays out of scope (Type-4). Every claim
is taken from cpd-tokenizer (generic.rs comment styles, javascript.rs,
ts_strip.rs, sfc.rs, markdown.rs, razor.rs, tokenizer.rs mode filter,
strips_annotations, is_common_keyword).
Claude-Session: https://claude.ai/code/session_01WztdFKZAwW9b51iJe9zhtV
2026-09-11 08:35:08 +02:00
## How detection works
jscpd is a token-based detector, but the tokens come from each language's own syntax rather than from splitting text on whitespace. A scan goes through these stages:
1. **Format detection. ** The file extension (or a name such as `Makefile` / `Dockerfile` , see `--formats-names` ) selects one of the 224 formats, and the format selects the tokenizer.
2. **Tokenization. ** Every format has its comment style (`//` and `/* */` , `#` , `--` , Lua's `--[[ ]]` , `;` , Visual Basic's `'` , none for Markdown) and string-literal rules, so a comment marker inside a string, or a `/*` in Markdown prose, does not swallow the rest of the file. Each token is classified as identifier, literal, punctuation, comment or whitespace.
- **JavaScript, TypeScript, JSX, TSX** are tokenized by the [oxc ](https://oxc.rs ) parser: template literals, regular expressions, JSX and decorators come out as the tokens the language defines, and a recoverable parse error does not change the stream. With `--cross-formats` , erasable TypeScript-only syntax (type annotations, interfaces, type aliases, generics, access modifiers) is removed via the syntax tree so the remaining tokens match the equivalent JavaScript; constructs with runtime meaning (`enum` , non-declare `namespace` , parameter properties) are kept.
- **Vue, Svelte, Astro** files are split into `<template>` , `<script>` and `<style>` blocks, and each block is tokenized as the language its `lang` attribute names. **Markdown ** fences are tokenized as the language of the fence. **Razor ** views separate C# from HTML. Clones are reported with the line range of the block, and a `<script lang="ts">` block matches `.ts` files.
3. **What counts. ** `--mode mild` (default) drops whitespace tokens, `--mode weak` also drops comments, `--mode strict` keeps every token. `jscpd:ignore-start` / `jscpd:ignore-end` comments exclude a region and `--ignore-pattern` regular expressions exclude whatever they match; skipped tokens leave the stream without shifting the positions reported for the rest.
4. **Normalization (opt-in). ** `--ignore-identifiers` hashes every identifier as the same placeholder but leaves keywords alone (the oxc token kinds for JS/TS, a shared keyword table for other languages); `--ignore-literals` does the same for strings and numbers; `--ignore-annotations` drops `@Name` and `@Name(...)` sequences only in the languages where `@` means an annotation or decorator (Java, Kotlin, Scala, Groovy, Python, Dart, Swift, JavaScript, TypeScript), never in Ruby, Perl, T-SQL, Razor or CSS, where it means something else.
5. **Matching. ** A rolling [Rabin-Karp ](https://en.wikipedia.org/wiki/Rabin%E2%80%93Karp_algorithm ) hash over the token stream finds every repeated window of at least `--min-tokens` tokens and `--min-lines` lines, within a format and across the formats that share a pool.
6. **Near-miss passes (opt-in). ** `--max-gap-lines` merges clone pieces separated by a few edited lines into one `similar` clone; `--similarity` extracts JavaScript/TypeScript functions from the syntax tree and compares their node-type sequences, so two functions with the same structure match regardless of names, literals or scattered edits.
What jscpd does not do is semantic analysis: two functions that compute the same result with different code (Type-4 clones) are out of scope, as they are for every token-based detector. See [Types of Code Clones ](https://jscpd.dev/guides/clone-types ) for where the line sits.
feat(dead-code): find code nothing runs, via the new basta engine
Adds a second question about the same tree: not "what is duplicated" but
"what does nothing reach". A new `basta` crate builds the import graph from
the project's entry points and walks it, reporting unused files, unused
exports, unused module-private declarations, unused imports and — opt-in —
unused class members, across JavaScript, TypeScript, JSX, TSX and Python.
It ships two ways: `jscpd --dead-code` inside the existing binary, and a
standalone `basta` command. Both reuse the walker, the filters, all fifteen
reporters and the `--threshold` / `--exit-code` gates, so nothing new has to
be learned to run it.
Because it is a graph traversal rather than a reference count, dead code
cascades: a helper whose only caller is itself dead is reported too. Every
finding carries a confidence score and, below 100, the reasons it might be
wrong — `eval`, an unrecognised decorator, a wildcard re-export, a name seen
only in a string, a file in the scan that did not parse. `--min-confidence`
sets the floor at 60.
Entry points come from `package.json`, `pyproject.toml`, framework and
file-name conventions, and anything a shell script, CI workflow, Makefile or
Dockerfile names by path. CommonJS is read alongside ESM. A project that
renames its own import paths is read on its own terms: `paths` and `baseUrl`
from `tsconfig.json` and `jsconfig.json` are resolved, through a relative
`extends` chain and per package in a monorepo. A file named only by a path
string — a worker spawned through `new URL`, a build entry, a vitest setup
file — counts as used.
Languages plug in through one trait, `basta::lang::Analyzer`, which owns
parsing, specifier resolution, entry-point conventions, manifests, alias
configs and path traits. Nothing outside `lang/` is language-specific;
`docs/basta-extending.md` walks through adding one.
Validated against knip, fallow, vulture, skylos, fossil-mcp and repowise on
trending repositories. On a corpus of ten of them — 11k files, 3.3M lines —
every one of basta's 1,806 findings was checked against an import graph
rebuilt independently of it: no unused-file, unused-import or unused-symbol
claim survived as wrong.
Claude-Session: https://claude.ai/code/session_01WztdFKZAwW9b51iJe9zhtV
2026-09-16 09:23:13 +02:00
## Dead code detection (`--dead-code`)
jscpd answers two questions about a codebase. `jscpd .` asks what is written
twice; `jscpd --dead-code .` asks what is never run. The second is a separate
engine — **basta ** — that ships inside the same binary and also stands alone
as a `basta` command.
``` bash
# Anything nothing runs, in the current project
jscpd --dead-code .
# `--basta` is the same flag
jscpd --basta src
# Or the standalone binary, with no duplication half
basta src
```
feat(dead-code): read components, bundler aliases, globs and workspaces
basta reported most of a real Vue, Svelte or Astro project as dead: on
thirty GitHub-trending projects in those three ecosystems it flagged 1572
unused files, and some import in the tree contradicted 78% of them. The
misses were almost never in the analysis itself; they were imports only the
project's own build knows how to resolve. This reads them the way the build
does.
- Single-file components are read whole. The script of a .vue, .svelte or
.astro file is masked in place so positions stay real, and the markup is
scanned for the names it reads: <Foo />, kebab-case spellings, {{ }}
interpolations, Svelte actions, attribute expressions, and a literal
import() written in markup.
- Aliases come from vite.config.* resolve.alias and svelte.config.* kit.alias
as well as tsconfig paths, and SvelteKit's $lib is known without the
generated .svelte-kit/tsconfig.json no repository commits. The project's
own declaration now wins over the ~/ @/ project-root fallback.
- A computed import whose static head names a directory,
import(`./pages/${name}.vue`), and import.meta.glob('./locales/*.js') are
expanded into one namespace edge per file there, the way a bundler hands
back whole module objects. Such an import no longer marks its module as
dynamic access, so the module's own findings keep their confidence.
- In a monorepo a package name resolves through that package's package.json,
exports subpath by subpath with source conditions preferred over ./dist,
anywhere in the workspace pnpm-workspace.yaml, lerna.json, turbo.json or a
workspaces field marks out.
- A path literal in a build config resolves against the project root, and
Nitro's api/, routes/ and middleware/ are file-system routes.
On the same thirty projects reported unused files fell from 1572 to 468.
fixtures/dead-code-demo gains components/, bundler/ and monorepo/. On master
the bundler demo reports five files as certainly dead, four of them wrongly;
the monorepo demo reports badge.ts, which the app imports by package name.
Both now report only what is dead. The quote-aware byte scanning the markup
and config readers share lives in one place, lang::Quotes and
lang::outside_strings, so rust/crates keeps master's 25 clones.
2026-09-17 12:36:34 +02:00
It supports **JavaScript, TypeScript, JSX, TSX, Vue, Svelte, Astro and Python ** — ESM and
feat(dead-code): find code nothing runs, via the new basta engine
Adds a second question about the same tree: not "what is duplicated" but
"what does nothing reach". A new `basta` crate builds the import graph from
the project's entry points and walks it, reporting unused files, unused
exports, unused module-private declarations, unused imports and — opt-in —
unused class members, across JavaScript, TypeScript, JSX, TSX and Python.
It ships two ways: `jscpd --dead-code` inside the existing binary, and a
standalone `basta` command. Both reuse the walker, the filters, all fifteen
reporters and the `--threshold` / `--exit-code` gates, so nothing new has to
be learned to run it.
Because it is a graph traversal rather than a reference count, dead code
cascades: a helper whose only caller is itself dead is reported too. Every
finding carries a confidence score and, below 100, the reasons it might be
wrong — `eval`, an unrecognised decorator, a wildcard re-export, a name seen
only in a string, a file in the scan that did not parse. `--min-confidence`
sets the floor at 60.
Entry points come from `package.json`, `pyproject.toml`, framework and
file-name conventions, and anything a shell script, CI workflow, Makefile or
Dockerfile names by path. CommonJS is read alongside ESM. A project that
renames its own import paths is read on its own terms: `paths` and `baseUrl`
from `tsconfig.json` and `jsconfig.json` are resolved, through a relative
`extends` chain and per package in a monorepo. A file named only by a path
string — a worker spawned through `new URL`, a build entry, a vitest setup
file — counts as used.
Languages plug in through one trait, `basta::lang::Analyzer`, which owns
parsing, specifier resolution, entry-point conventions, manifests, alias
configs and path traits. Nothing outside `lang/` is language-specific;
`docs/basta-extending.md` walks through adding one.
Validated against knip, fallow, vulture, skylos, fossil-mcp and repowise on
trending repositories. On a corpus of ten of them — 11k files, 3.3M lines —
every one of basta's 1,806 findings was checked against an import graph
rebuilt independently of it: no unused-file, unused-import or unused-symbol
claim survived as wrong.
Claude-Session: https://claude.ai/code/session_01WztdFKZAwW9b51iJe9zhtV
2026-09-16 09:23:13 +02:00
CommonJS alike: `require('./x')` , `const { a } = require('./x')` ,
`module.exports = { a, b }` , `exports.a = …` and a literal `import('./x')`
are all edges in the graph, not just `import` and `export` . A run walks with
the same filters as a duplication run — `--ignore` , `--format` , `.gitignore`
handling, `--max-size` , `--follow-symlinks` — and reports through the same
reporter names, so `-r sarif -o report` means the same thing in both modes.
### What it reports
| Category | What it means |
| ---------------- | ----------------------------------------------------------------- |
| `unused-file` | No entry point reaches the file through the import graph |
| `unused-export` | An exported name no reachable module imports |
| `unused-symbol` | A module-private declaration nothing reaches |
| `unused-import` | An import binding with no references |
| `unused-member` | A class or enum member whose name is never read (opt-in) |
Pick a subset with `--dead-code-categories` , or ask for everything:
``` bash
jscpd --dead-code src --dead-code-categories unused-export,unused-import
jscpd --dead-code src --dead-code-categories all
```
`unused-member` is off by default: without type information, `x.render()`
could be a call to any `render` in the project, so the rule is the least
certain of the five.
### How it decides
Everything rests on the entry points, because every finding is the answer to
* nothing reaches this * . They come from three places, in decreasing order of
authority:
1. **Manifests. ** `package.json` 's `main` , `module` , `bin` , `exports` ,
`files` and `scripts` ; `pyproject.toml` 's `[project.scripts]` and
entry-point tables. A manifest that names a built file (`./dist/index.js` )
is mapped back to the source it was built from, since that is what the
repository holds. A source file listed under `files` ships to every
consumer, so it is a public surface whether or not the package's own entry
imports it.
2. **Conventions. ** `src/index.ts` , `__main__.py` , `manage.py` , a framework's
`pages/` and `app/` routes, `*.config.ts` , a `.d.ts` ambient declaration, a
file with a shebang, a Python `if __name__ == "__main__"` guard, and a
package's `__init__.py` .
3. **Scripts. ** A shell script, a CI workflow, a Makefile or a Dockerfile in
the tree that names a source file by path runs it, copies it or ships it.
Those files are not JavaScript or Python, so nothing imports * from * them —
but `publish.sh` requiring `./platform-map.js` is as real a use as any
`import` , and the file it names is an entry point.
4. **You. ** `--entry <glob>` , repeatable, which adds entry points and never
removes one.
feat(dead-code): read components, bundler aliases, globs and workspaces
basta reported most of a real Vue, Svelte or Astro project as dead: on
thirty GitHub-trending projects in those three ecosystems it flagged 1572
unused files, and some import in the tree contradicted 78% of them. The
misses were almost never in the analysis itself; they were imports only the
project's own build knows how to resolve. This reads them the way the build
does.
- Single-file components are read whole. The script of a .vue, .svelte or
.astro file is masked in place so positions stay real, and the markup is
scanned for the names it reads: <Foo />, kebab-case spellings, {{ }}
interpolations, Svelte actions, attribute expressions, and a literal
import() written in markup.
- Aliases come from vite.config.* resolve.alias and svelte.config.* kit.alias
as well as tsconfig paths, and SvelteKit's $lib is known without the
generated .svelte-kit/tsconfig.json no repository commits. The project's
own declaration now wins over the ~/ @/ project-root fallback.
- A computed import whose static head names a directory,
import(`./pages/${name}.vue`), and import.meta.glob('./locales/*.js') are
expanded into one namespace edge per file there, the way a bundler hands
back whole module objects. Such an import no longer marks its module as
dynamic access, so the module's own findings keep their confidence.
- In a monorepo a package name resolves through that package's package.json,
exports subpath by subpath with source conditions preferred over ./dist,
anywhere in the workspace pnpm-workspace.yaml, lerna.json, turbo.json or a
workspaces field marks out.
- A path literal in a build config resolves against the project root, and
Nitro's api/, routes/ and middleware/ are file-system routes.
On the same thirty projects reported unused files fell from 1572 to 468.
fixtures/dead-code-demo gains components/, bundler/ and monorepo/. On master
the bundler demo reports five files as certainly dead, four of them wrongly;
the monorepo demo reports badge.ts, which the app imports by package name.
Both now report only what is dead. The quote-aware byte scanning the markup
and config readers share lives in one place, lang::Quotes and
lang::outside_strings, so rust/crates keeps master's 25 clones.
2026-09-17 12:36:34 +02:00
Import paths are then read the way the project's own build reads them, since
that is where a real project keeps half its graph:
- **Aliases** from `tsconfig.json` /`jsconfig.json` `paths` , from
`vite.config.*` `resolve.alias` , and from `svelte.config.*` `kit.alias` .
SvelteKit's `$lib` needs no config: the `.svelte-kit/tsconfig.json` that
declares it is generated at build time and never committed.
- **Globs.** ``import(` ./pages/${name}.vue`)` ` and
fix(dead-code): address review on globs, aliases and component markup
Copilot's review of #1062 raised seven points; each checked out and each is
fixed with a test that fails without it.
- A glob keeps its pattern. `import.meta.glob('./locales/*.js')` and
import(`./pages/${name}.vue`) used to keep every file under the directory
alive; they now reach what the pattern matches, `*` staying within one
segment as it does for the bundler. On Firefly an image glob,
'../../**/*.{png,jpg}', had been keeping all of src/ alive.
- Every pattern of an `import.meta.glob([...])` array is kept, not the first.
- A declared alias is not second-guessed: when `@` points at src/ and the file
is missing there, the `@/` project-root fallback no longer finds a
different file. A catch-all `*` path claims no prefix and does not count.
- Astro client <script> blocks are read as the modules Astro bundles them
into, so what they import is used. A script with any attribute but `src` is
left to the browser, as Astro leaves it.
- import('./x') in markup is found only inside expressions, not in comments
or plain text.
- A quoted attribute value is an expression only on a directive (`:prop`,
`@click`, `#slot`, `v-*`); elsewhere only its `{...}` interpolations are,
so `class="card"` no longer credits a declaration named `card`.
- An object key in markup, `{ label: value }`, is not a read.
Re-measuring on the thirty trending projects also exposed `?raw` imports, as
in `import script from './panzoom.js?raw'`: a bundler query now is stripped
before resolving. On one snapshot of those projects the previous release
reports 1093 unused files and this branch 481, with the share some import
names falling from 83% to 62%; the CHANGELOG now quotes those numbers
instead of ones measured against a development baseline. Components used
only from .mdx content are still reported, and the docs say so.
2026-09-17 13:49:55 +02:00
`import.meta.glob('./locales/*.js')` reach every file their pattern matches,
as a bundler expands them: `pages/*.vue` includes `pages/home.vue` but not
`pages/archive/old.vue` .
feat(dead-code): read components, bundler aliases, globs and workspaces
basta reported most of a real Vue, Svelte or Astro project as dead: on
thirty GitHub-trending projects in those three ecosystems it flagged 1572
unused files, and some import in the tree contradicted 78% of them. The
misses were almost never in the analysis itself; they were imports only the
project's own build knows how to resolve. This reads them the way the build
does.
- Single-file components are read whole. The script of a .vue, .svelte or
.astro file is masked in place so positions stay real, and the markup is
scanned for the names it reads: <Foo />, kebab-case spellings, {{ }}
interpolations, Svelte actions, attribute expressions, and a literal
import() written in markup.
- Aliases come from vite.config.* resolve.alias and svelte.config.* kit.alias
as well as tsconfig paths, and SvelteKit's $lib is known without the
generated .svelte-kit/tsconfig.json no repository commits. The project's
own declaration now wins over the ~/ @/ project-root fallback.
- A computed import whose static head names a directory,
import(`./pages/${name}.vue`), and import.meta.glob('./locales/*.js') are
expanded into one namespace edge per file there, the way a bundler hands
back whole module objects. Such an import no longer marks its module as
dynamic access, so the module's own findings keep their confidence.
- In a monorepo a package name resolves through that package's package.json,
exports subpath by subpath with source conditions preferred over ./dist,
anywhere in the workspace pnpm-workspace.yaml, lerna.json, turbo.json or a
workspaces field marks out.
- A path literal in a build config resolves against the project root, and
Nitro's api/, routes/ and middleware/ are file-system routes.
On the same thirty projects reported unused files fell from 1572 to 468.
fixtures/dead-code-demo gains components/, bundler/ and monorepo/. On master
the bundler demo reports five files as certainly dead, four of them wrongly;
the monorepo demo reports badge.ts, which the app imports by package name.
Both now report only what is dead. The quote-aware byte scanning the markup
and config readers share lives in one place, lang::Quotes and
lang::outside_strings, so rust/crates keeps master's 25 clones.
2026-09-17 12:36:34 +02:00
- **Workspace packages.** In a monorepo, `@acme/ui/date` resolves through
that package's own `package.json` — `exports` subpath by subpath, preferring
source conditions over `./dist` — wherever in the workspace it is imported
from.
- **Markup.** A `.vue` , `.svelte` or `.astro` file is read whole: `<Foo />` ,
fix(dead-code): address review on globs, aliases and component markup
Copilot's review of #1062 raised seven points; each checked out and each is
fixed with a test that fails without it.
- A glob keeps its pattern. `import.meta.glob('./locales/*.js')` and
import(`./pages/${name}.vue`) used to keep every file under the directory
alive; they now reach what the pattern matches, `*` staying within one
segment as it does for the bundler. On Firefly an image glob,
'../../**/*.{png,jpg}', had been keeping all of src/ alive.
- Every pattern of an `import.meta.glob([...])` array is kept, not the first.
- A declared alias is not second-guessed: when `@` points at src/ and the file
is missing there, the `@/` project-root fallback no longer finds a
different file. A catch-all `*` path claims no prefix and does not count.
- Astro client <script> blocks are read as the modules Astro bundles them
into, so what they import is used. A script with any attribute but `src` is
left to the browser, as Astro leaves it.
- import('./x') in markup is found only inside expressions, not in comments
or plain text.
- A quoted attribute value is an expression only on a directive (`:prop`,
`@click`, `#slot`, `v-*`); elsewhere only its `{...}` interpolations are,
so `class="card"` no longer credits a declaration named `card`.
- An object key in markup, `{ label: value }`, is not a read.
Re-measuring on the thirty trending projects also exposed `?raw` imports, as
in `import script from './panzoom.js?raw'`: a bundler query now is stripped
before resolving. On one snapshot of those projects the previous release
reports 1093 unused files and this branch 481, with the share some import
names falling from 83% to 62%; the CHANGELOG now quotes those numbers
instead of ones measured against a development baseline. Components used
only from .mdx content are still reported, and the docs say so.
2026-09-17 13:49:55 +02:00
`{{ … }}` , directive and `{…}` attribute expressions and
`{#await import('./x.svelte')}` are uses too, and an Astro client `<script>`
is read as the module Astro bundles it into.
feat(dead-code): read components, bundler aliases, globs and workspaces
basta reported most of a real Vue, Svelte or Astro project as dead: on
thirty GitHub-trending projects in those three ecosystems it flagged 1572
unused files, and some import in the tree contradicted 78% of them. The
misses were almost never in the analysis itself; they were imports only the
project's own build knows how to resolve. This reads them the way the build
does.
- Single-file components are read whole. The script of a .vue, .svelte or
.astro file is masked in place so positions stay real, and the markup is
scanned for the names it reads: <Foo />, kebab-case spellings, {{ }}
interpolations, Svelte actions, attribute expressions, and a literal
import() written in markup.
- Aliases come from vite.config.* resolve.alias and svelte.config.* kit.alias
as well as tsconfig paths, and SvelteKit's $lib is known without the
generated .svelte-kit/tsconfig.json no repository commits. The project's
own declaration now wins over the ~/ @/ project-root fallback.
- A computed import whose static head names a directory,
import(`./pages/${name}.vue`), and import.meta.glob('./locales/*.js') are
expanded into one namespace edge per file there, the way a bundler hands
back whole module objects. Such an import no longer marks its module as
dynamic access, so the module's own findings keep their confidence.
- In a monorepo a package name resolves through that package's package.json,
exports subpath by subpath with source conditions preferred over ./dist,
anywhere in the workspace pnpm-workspace.yaml, lerna.json, turbo.json or a
workspaces field marks out.
- A path literal in a build config resolves against the project root, and
Nitro's api/, routes/ and middleware/ are file-system routes.
On the same thirty projects reported unused files fell from 1572 to 468.
fixtures/dead-code-demo gains components/, bundler/ and monorepo/. On master
the bundler demo reports five files as certainly dead, four of them wrongly;
the monorepo demo reports badge.ts, which the app imports by package name.
Both now report only what is dead. The quote-aware byte scanning the markup
and config readers share lives in one place, lang::Quotes and
lang::outside_strings, so rust/crates keeps master's 25 clones.
2026-09-17 12:36:34 +02:00
feat(dead-code): find code nothing runs, via the new basta engine
Adds a second question about the same tree: not "what is duplicated" but
"what does nothing reach". A new `basta` crate builds the import graph from
the project's entry points and walks it, reporting unused files, unused
exports, unused module-private declarations, unused imports and — opt-in —
unused class members, across JavaScript, TypeScript, JSX, TSX and Python.
It ships two ways: `jscpd --dead-code` inside the existing binary, and a
standalone `basta` command. Both reuse the walker, the filters, all fifteen
reporters and the `--threshold` / `--exit-code` gates, so nothing new has to
be learned to run it.
Because it is a graph traversal rather than a reference count, dead code
cascades: a helper whose only caller is itself dead is reported too. Every
finding carries a confidence score and, below 100, the reasons it might be
wrong — `eval`, an unrecognised decorator, a wildcard re-export, a name seen
only in a string, a file in the scan that did not parse. `--min-confidence`
sets the floor at 60.
Entry points come from `package.json`, `pyproject.toml`, framework and
file-name conventions, and anything a shell script, CI workflow, Makefile or
Dockerfile names by path. CommonJS is read alongside ESM. A project that
renames its own import paths is read on its own terms: `paths` and `baseUrl`
from `tsconfig.json` and `jsconfig.json` are resolved, through a relative
`extends` chain and per package in a monorepo. A file named only by a path
string — a worker spawned through `new URL`, a build entry, a vitest setup
file — counts as used.
Languages plug in through one trait, `basta::lang::Analyzer`, which owns
parsing, specifier resolution, entry-point conventions, manifests, alias
configs and path traits. Nothing outside `lang/` is language-specific;
`docs/basta-extending.md` walks through adding one.
Validated against knip, fallow, vulture, skylos, fossil-mcp and repowise on
trending repositories. On a corpus of ten of them — 11k files, 3.3M lines —
every one of basta's 1,806 findings was checked against an import graph
rebuilt independently of it: no unused-file, unused-import or unused-symbol
claim survived as wrong.
Claude-Session: https://claude.ai/code/session_01WztdFKZAwW9b51iJe9zhtV
2026-09-16 09:23:13 +02:00
From there it is two breadth-first walks: over import edges to decide which
files run, and over reference edges to decide which declarations run. Because
it is a traversal and not a reference count, dead code cascades — a helper
whose only caller is dead is reported too.
Test files are always entry points, so a test file is never "unused". Dead
code * inside * one is off by default; `--include-tests` turns it on. An export
only the test suite imports is reported separately, and says so.
### Confidence
Static analysis of JavaScript and Python cannot be certain, so basta does not
pretend. Every finding carries a score from 0 to 100 and, below 100, the
reasons it might be wrong:
```
Unused exports (1)
- function src/registry.ts:12:17 registerPlugin medium 60% 14 lines
↳ carries an unrecognised decorator; the name appears in a string literal
```
The score starts from a base set by how much inference the rule needs — an
unreferenced import binding is a fact, an unused class member is a guess —
and loses points for each piece of contrary evidence: a file that calls
`eval` or `getattr` , a decorator the analyzer does not recognise, a wildcard
re-export, a name that appears in a string, a file in the scan that did not
parse.
`--min-confidence` sets the floor; the default is 60.
``` bash
# Only what basta is sure of
jscpd --dead-code src --min-confidence 90
# Everything, including the guesses, with their reasons
jscpd --dead-code src --min-confidence 0
```
Raising the floor is the first thing to try on a codebase that does something
unusual, and `--entry` is the second.
A file that fails to parse lowers the confidence of every finding in the run,
because its references are unknown. The console trailer names such files (up
to ten; the JSON report carries the full list under
`statistics.unparsedFiles` ), so a broken test fixture can be told apart from
a real gap in the parser.
### In CI
``` bash
# Fail when dead code exceeds 2% of the codebase
jscpd --dead-code src --threshold 2
# Fail on any finding at all
jscpd --dead-code src --exit-code 1
# Publish to GitHub code scanning
jscpd --dead-code src -r sarif -o report
```
See [`fixtures/dead-code-demo` ](../fixtures/dead-code-demo/README.md ) for a
feat(dead-code): read components, bundler aliases, globs and workspaces
basta reported most of a real Vue, Svelte or Astro project as dead: on
thirty GitHub-trending projects in those three ecosystems it flagged 1572
unused files, and some import in the tree contradicted 78% of them. The
misses were almost never in the analysis itself; they were imports only the
project's own build knows how to resolve. This reads them the way the build
does.
- Single-file components are read whole. The script of a .vue, .svelte or
.astro file is masked in place so positions stay real, and the markup is
scanned for the names it reads: <Foo />, kebab-case spellings, {{ }}
interpolations, Svelte actions, attribute expressions, and a literal
import() written in markup.
- Aliases come from vite.config.* resolve.alias and svelte.config.* kit.alias
as well as tsconfig paths, and SvelteKit's $lib is known without the
generated .svelte-kit/tsconfig.json no repository commits. The project's
own declaration now wins over the ~/ @/ project-root fallback.
- A computed import whose static head names a directory,
import(`./pages/${name}.vue`), and import.meta.glob('./locales/*.js') are
expanded into one namespace edge per file there, the way a bundler hands
back whole module objects. Such an import no longer marks its module as
dynamic access, so the module's own findings keep their confidence.
- In a monorepo a package name resolves through that package's package.json,
exports subpath by subpath with source conditions preferred over ./dist,
anywhere in the workspace pnpm-workspace.yaml, lerna.json, turbo.json or a
workspaces field marks out.
- A path literal in a build config resolves against the project root, and
Nitro's api/, routes/ and middleware/ are file-system routes.
On the same thirty projects reported unused files fell from 1572 to 468.
fixtures/dead-code-demo gains components/, bundler/ and monorepo/. On master
the bundler demo reports five files as certainly dead, four of them wrongly;
the monorepo demo reports badge.ts, which the app imports by package name.
Both now report only what is dead. The quote-aware byte scanning the markup
and config readers share lives in one place, lang::Quotes and
lang::outside_strings, so rust/crates keeps master's 25 clones.
2026-09-17 12:36:34 +02:00
runnable example of every category in TypeScript, Python and single-file
components, plus a Vite project and a pnpm workspace whose imports only their
build can resolve.
feat(dead-code): find code nothing runs, via the new basta engine
Adds a second question about the same tree: not "what is duplicated" but
"what does nothing reach". A new `basta` crate builds the import graph from
the project's entry points and walks it, reporting unused files, unused
exports, unused module-private declarations, unused imports and — opt-in —
unused class members, across JavaScript, TypeScript, JSX, TSX and Python.
It ships two ways: `jscpd --dead-code` inside the existing binary, and a
standalone `basta` command. Both reuse the walker, the filters, all fifteen
reporters and the `--threshold` / `--exit-code` gates, so nothing new has to
be learned to run it.
Because it is a graph traversal rather than a reference count, dead code
cascades: a helper whose only caller is itself dead is reported too. Every
finding carries a confidence score and, below 100, the reasons it might be
wrong — `eval`, an unrecognised decorator, a wildcard re-export, a name seen
only in a string, a file in the scan that did not parse. `--min-confidence`
sets the floor at 60.
Entry points come from `package.json`, `pyproject.toml`, framework and
file-name conventions, and anything a shell script, CI workflow, Makefile or
Dockerfile names by path. CommonJS is read alongside ESM. A project that
renames its own import paths is read on its own terms: `paths` and `baseUrl`
from `tsconfig.json` and `jsconfig.json` are resolved, through a relative
`extends` chain and per package in a monorepo. A file named only by a path
string — a worker spawned through `new URL`, a build entry, a vitest setup
file — counts as used.
Languages plug in through one trait, `basta::lang::Analyzer`, which owns
parsing, specifier resolution, entry-point conventions, manifests, alias
configs and path traits. Nothing outside `lang/` is language-specific;
`docs/basta-extending.md` walks through adding one.
Validated against knip, fallow, vulture, skylos, fossil-mcp and repowise on
trending repositories. On a corpus of ten of them — 11k files, 3.3M lines —
every one of basta's 1,806 findings was checked against an import graph
rebuilt independently of it: no unused-file, unused-import or unused-symbol
claim survived as wrong.
Claude-Session: https://claude.ai/code/session_01WztdFKZAwW9b51iJe9zhtV
2026-09-16 09:23:13 +02:00
### What it does not do
- **No type inference.** A member access matches members by name across the
whole project, which is why `unused-member` is opt-in.
feat(dead-code): read components, bundler aliases, globs and workspaces
basta reported most of a real Vue, Svelte or Astro project as dead: on
thirty GitHub-trending projects in those three ecosystems it flagged 1572
unused files, and some import in the tree contradicted 78% of them. The
misses were almost never in the analysis itself; they were imports only the
project's own build knows how to resolve. This reads them the way the build
does.
- Single-file components are read whole. The script of a .vue, .svelte or
.astro file is masked in place so positions stay real, and the markup is
scanned for the names it reads: <Foo />, kebab-case spellings, {{ }}
interpolations, Svelte actions, attribute expressions, and a literal
import() written in markup.
- Aliases come from vite.config.* resolve.alias and svelte.config.* kit.alias
as well as tsconfig paths, and SvelteKit's $lib is known without the
generated .svelte-kit/tsconfig.json no repository commits. The project's
own declaration now wins over the ~/ @/ project-root fallback.
- A computed import whose static head names a directory,
import(`./pages/${name}.vue`), and import.meta.glob('./locales/*.js') are
expanded into one namespace edge per file there, the way a bundler hands
back whole module objects. Such an import no longer marks its module as
dynamic access, so the module's own findings keep their confidence.
- In a monorepo a package name resolves through that package's package.json,
exports subpath by subpath with source conditions preferred over ./dist,
anywhere in the workspace pnpm-workspace.yaml, lerna.json, turbo.json or a
workspaces field marks out.
- A path literal in a build config resolves against the project root, and
Nitro's api/, routes/ and middleware/ are file-system routes.
On the same thirty projects reported unused files fell from 1572 to 468.
fixtures/dead-code-demo gains components/, bundler/ and monorepo/. On master
the bundler demo reports five files as certainly dead, four of them wrongly;
the monorepo demo reports badge.ts, which the app imports by package name.
Both now report only what is dead. The quote-aware byte scanning the markup
and config readers share lives in one place, lang::Quotes and
lang::outside_strings, so rust/crates keeps master's 25 clones.
2026-09-17 12:36:34 +02:00
- **No runtime resolution.** `getattr(obj, name)` , an `import(expr)` with no
static directory to expand over, and a module object passed as a parameter
are recorded as uncertainty, not resolved.
fix(dead-code): address review on globs, aliases and component markup
Copilot's review of #1062 raised seven points; each checked out and each is
fixed with a test that fails without it.
- A glob keeps its pattern. `import.meta.glob('./locales/*.js')` and
import(`./pages/${name}.vue`) used to keep every file under the directory
alive; they now reach what the pattern matches, `*` staying within one
segment as it does for the bundler. On Firefly an image glob,
'../../**/*.{png,jpg}', had been keeping all of src/ alive.
- Every pattern of an `import.meta.glob([...])` array is kept, not the first.
- A declared alias is not second-guessed: when `@` points at src/ and the file
is missing there, the `@/` project-root fallback no longer finds a
different file. A catch-all `*` path claims no prefix and does not count.
- Astro client <script> blocks are read as the modules Astro bundles them
into, so what they import is used. A script with any attribute but `src` is
left to the browser, as Astro leaves it.
- import('./x') in markup is found only inside expressions, not in comments
or plain text.
- A quoted attribute value is an expression only on a directive (`:prop`,
`@click`, `#slot`, `v-*`); elsewhere only its `{...}` interpolations are,
so `class="card"` no longer credits a declaration named `card`.
- An object key in markup, `{ label: value }`, is not a read.
Re-measuring on the thirty trending projects also exposed `?raw` imports, as
in `import script from './panzoom.js?raw'`: a bundler query now is stripped
before resolving. On one snapshot of those projects the previous release
reports 1093 unused files and this branch 481, with the share some import
names falling from 83% to 62%; the CHANGELOG now quotes those numbers
instead of ones measured against a development baseline. Components used
only from .mdx content are still reported, and the docs say so.
2026-09-17 13:49:55 +02:00
- **No Markdown or MDX.** An `import` written in an `.mdx` page is not an
edge, so a component used only from content reads as unused; `--entry`
says otherwise.
feat(dead-code): find code nothing runs, via the new basta engine
Adds a second question about the same tree: not "what is duplicated" but
"what does nothing reach". A new `basta` crate builds the import graph from
the project's entry points and walks it, reporting unused files, unused
exports, unused module-private declarations, unused imports and — opt-in —
unused class members, across JavaScript, TypeScript, JSX, TSX and Python.
It ships two ways: `jscpd --dead-code` inside the existing binary, and a
standalone `basta` command. Both reuse the walker, the filters, all fifteen
reporters and the `--threshold` / `--exit-code` gates, so nothing new has to
be learned to run it.
Because it is a graph traversal rather than a reference count, dead code
cascades: a helper whose only caller is itself dead is reported too. Every
finding carries a confidence score and, below 100, the reasons it might be
wrong — `eval`, an unrecognised decorator, a wildcard re-export, a name seen
only in a string, a file in the scan that did not parse. `--min-confidence`
sets the floor at 60.
Entry points come from `package.json`, `pyproject.toml`, framework and
file-name conventions, and anything a shell script, CI workflow, Makefile or
Dockerfile names by path. CommonJS is read alongside ESM. A project that
renames its own import paths is read on its own terms: `paths` and `baseUrl`
from `tsconfig.json` and `jsconfig.json` are resolved, through a relative
`extends` chain and per package in a monorepo. A file named only by a path
string — a worker spawned through `new URL`, a build entry, a vitest setup
file — counts as used.
Languages plug in through one trait, `basta::lang::Analyzer`, which owns
parsing, specifier resolution, entry-point conventions, manifests, alias
configs and path traits. Nothing outside `lang/` is language-specific;
`docs/basta-extending.md` walks through adding one.
Validated against knip, fallow, vulture, skylos, fossil-mcp and repowise on
trending repositories. On a corpus of ten of them — 11k files, 3.3M lines —
every one of basta's 1,806 findings was checked against an import graph
rebuilt independently of it: no unused-file, unused-import or unused-symbol
claim survived as wrong.
Claude-Session: https://claude.ai/code/session_01WztdFKZAwW9b51iJe9zhtV
2026-09-16 09:23:13 +02:00
- **An export used only inside its own file is not reported.** The `export`
keyword is then unnecessary, but the code is not dead, and the two are
different conversations.
- **Only the five categories above.** Unused dependencies, unused files in
other languages, and unused local variables are out of scope; a linter
already finds the last of those.
docs: reorganize documentation into docs/ folder, separate v4/v5 docs
- Split the overloaded README.md into focused docs:
- docs/typescript.md: v4 (Node.js) CLI, reporters, API, config
- docs/rust.md: v5 (Rust) CLI, reporters, blame, differences from v4
- docs/ai-ready.md: AI reporter, agent skills, MCP server
- docs/api.md: Programming APIs (TypeScript and Rust)
- docs/packages.md: Monorepo package and crate overview
- Trim README.md to a concise entry point with links to docs/
- Slim down rust/README.md, rust/jscpd/README.md, rust/npm/README.md:
remove duplicated content, link to docs/rust.md for details
- Fix factual errors verified against actual CLI output:
- Format count: 223 (v5) and 224 (v4), not '225+'
- Reporter output filenames: jscpd-report.* not cpd.*
- --max-size: no default in v5 (not 512KB)
- --formats-exts: same hyphenated form in both v4 and v5
- --no-gitignore: same flag name in both v4 and v5
- Update rust/jscpd/package.json: add 'cpd' bin so jscpd@5
installs both jscpd and cpd commands
- Update crate versions in rust/README.md to match source (0.1.3/0.1.4)
2026-06-08 12:57:38 +02:00
## Format Support
2026-09-06 21:12:26 +02:00
JavaScript, TypeScript, JSX and TSX are tokenized by the [oxc ](https://oxc.rs ) lexer; a parse diagnostic (a redeclaration, a recoverable syntax error) does not change the token stream, so such files still match files that parse cleanly. Only a source the parser gives up on entirely falls back to a word-split tokenizer, and that file then matches only other fallback-tokenized files. See [`fixtures/parse-errors-demo` ](../fixtures/parse-errors-demo/README.md ).
2026-09-17 18:37:20 +02:00
jscpd supports **224 formats ** . Use `jscpd --list` to see the full list, or see [FORMATS.md ](../FORMATS.md ) for names, file extensions and descriptions.
docs: reorganize documentation into docs/ folder, separate v4/v5 docs
- Split the overloaded README.md into focused docs:
- docs/typescript.md: v4 (Node.js) CLI, reporters, API, config
- docs/rust.md: v5 (Rust) CLI, reporters, blame, differences from v4
- docs/ai-ready.md: AI reporter, agent skills, MCP server
- docs/api.md: Programming APIs (TypeScript and Rust)
- docs/packages.md: Monorepo package and crate overview
- Trim README.md to a concise entry point with links to docs/
- Slim down rust/README.md, rust/jscpd/README.md, rust/npm/README.md:
remove duplicated content, link to docs/rust.md for details
- Fix factual errors verified against actual CLI output:
- Format count: 223 (v5) and 224 (v4), not '225+'
- Reporter output filenames: jscpd-report.* not cpd.*
- --max-size: no default in v5 (not 512KB)
- --formats-exts: same hyphenated form in both v4 and v5
- --no-gitignore: same flag name in both v4 and v5
- Update rust/jscpd/package.json: add 'cpd' bin so jscpd@5
installs both jscpd and cpd commands
- Update crate versions in rust/README.md to match source (0.1.3/0.1.4)
2026-06-08 12:57:38 +02:00
### Cross-Format Detection
fix(sfc): keep Vue wrapper tags out of the html stream
Sorting the html tokens (previous commit) restores source order, but the
wrapper tags of a Vue file — <template>, </template>, <script ...>,
</script>, <style ...>, </style> — are identical in every Vue file and
sit at both ends of it. In source order they stretch every template clone
to the last </style>: on fixtures/vue the html clone went from
[1:1 - 10:9] to [1:1 - 262:10] and duplicated lines from 289 to 541,
counting the script and style bodies as duplicated html.
A file with a <template> block keeps all of its markup inside that block,
so the skeleton outside the blocks is only wrapper tags and is now left
out of the html stream. The clone becomes the template body itself:
file1.vue:html [2:3 - 10:9], 75 tokens. Svelte and Astro have no template
wrapper; their top-level markup is the skeleton and is kept, so their
output is unchanged. The sort stays, for custom blocks that map to html.
Fixture: fixtures/sfc-demo/template-range with a README showing the
template-only range; docs/rust.md links it.
Claude-Session: https://claude.ai/code/session_01WztdFKZAwW9b51iJe9zhtV
2026-09-08 08:28:07 +02:00
Vue SFC (`.vue` ), Svelte (`.svelte` ), Astro (`.astro` ), and Markdown (`.md` ) files are tokenized per-block/per-section, enabling duplicate detection across file types. In a Vue file only the block bodies are scanned; the wrapper tags around `<template>` , `<script>` and `<style>` are left out, so a template clone is reported with the template's own line range. See [`fixtures/sfc-demo` ](../fixtures/sfc-demo/README.md ) for a runnable example.
docs: reorganize documentation into docs/ folder, separate v4/v5 docs
- Split the overloaded README.md into focused docs:
- docs/typescript.md: v4 (Node.js) CLI, reporters, API, config
- docs/rust.md: v5 (Rust) CLI, reporters, blame, differences from v4
- docs/ai-ready.md: AI reporter, agent skills, MCP server
- docs/api.md: Programming APIs (TypeScript and Rust)
- docs/packages.md: Monorepo package and crate overview
- Trim README.md to a concise entry point with links to docs/
- Slim down rust/README.md, rust/jscpd/README.md, rust/npm/README.md:
remove duplicated content, link to docs/rust.md for details
- Fix factual errors verified against actual CLI output:
- Format count: 223 (v5) and 224 (v4), not '225+'
- Reporter output filenames: jscpd-report.* not cpd.*
- --max-size: no default in v5 (not 512KB)
- --formats-exts: same hyphenated form in both v4 and v5
- --no-gitignore: same flag name in both v4 and v5
- Update rust/jscpd/package.json: add 'cpd' bin so jscpd@5
installs both jscpd and cpd commands
- Update crate versions in rust/README.md to match source (0.1.3/0.1.4)
2026-06-08 12:57:38 +02:00
feat(rust): add --cross-formats for cross-format clone detection (#810)
Detect duplicates across related formats via format equivalence groups
sharing one comparison pool, e.g. --cross-formats "javascript,typescript"
or the js-ts preset (javascript,jsx,typescript,tsx).
When a group mixes TypeScript with JavaScript, TS files are compared with
erasable type-only syntax stripped from the detection token stream (type
annotations, generics, interface/type declarations, as/satisfies, ?/!
markers, access modifiers, implements clauses, type-only imports/exports,
overload signatures, declare statements) so that
`function f(a: number): void` matches `function f(a)`. Stripping is
AST-driven (oxc_ast_visit over the already-parsed program) and only drops
tokens, so reported clone positions always reference the original source.
- cpd-tokenizer: new ts_strip module, tokenize_js_stripped,
TokenizeOptions.strip_types_formats (empty by default)
- cpd-finder: RunConfig.cross_formats, build_pools() pool grouping,
strip-set computation for TS-family formats grouped with JS
- cpd: --cross-formats flag, crossFormats config field (string,
array-of-strings, or array-of-arrays), js-ts preset, overlap merging,
unknown-format warnings, --debug output
- docs: rust.md option + Cross-Format Groups section, CHANGELOG entry
- tests: tokenizer strip tests, pool unit tests, cross-pool core test,
cpd-finder integration tests, CLI parse/config tests, e2e binary tests
with fixtures; default behavior unchanged (golden parity intact)
Non-erasable TS syntax with runtime semantics (enum, non-declare
namespace, parameter properties, import =, export =) is left intact and
will not cross-match. Cross-format clones are attributed to one member
format in per-format statistics.
Closes #810
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-23 08:44:08 +02:00
### Cross-Format Groups (`--cross-formats`)
By default every format is compared in its own isolated pool, so a TypeScript file never matches a near-identical JavaScript file. `--cross-formats` declares format equivalence groups that share one comparison pool — useful for finding leftover `.js` copies during a TypeScript migration:
``` bash
2026-09-17 18:37:20 +02:00
jscpd --cross-formats "javascript,typescript" ./src
jscpd --cross-formats js-ts ./src # preset: javascript,jsx,typescript,tsx
jscpd --cross-formats "js-ts;css,scss" ./src # multiple groups
feat(rust): add --cross-formats for cross-format clone detection (#810)
Detect duplicates across related formats via format equivalence groups
sharing one comparison pool, e.g. --cross-formats "javascript,typescript"
or the js-ts preset (javascript,jsx,typescript,tsx).
When a group mixes TypeScript with JavaScript, TS files are compared with
erasable type-only syntax stripped from the detection token stream (type
annotations, generics, interface/type declarations, as/satisfies, ?/!
markers, access modifiers, implements clauses, type-only imports/exports,
overload signatures, declare statements) so that
`function f(a: number): void` matches `function f(a)`. Stripping is
AST-driven (oxc_ast_visit over the already-parsed program) and only drops
tokens, so reported clone positions always reference the original source.
- cpd-tokenizer: new ts_strip module, tokenize_js_stripped,
TokenizeOptions.strip_types_formats (empty by default)
- cpd-finder: RunConfig.cross_formats, build_pools() pool grouping,
strip-set computation for TS-family formats grouped with JS
- cpd: --cross-formats flag, crossFormats config field (string,
array-of-strings, or array-of-arrays), js-ts preset, overlap merging,
unknown-format warnings, --debug output
- docs: rust.md option + Cross-Format Groups section, CHANGELOG entry
- tests: tokenizer strip tests, pool unit tests, cross-pool core test,
cpd-finder integration tests, CLI parse/config tests, e2e binary tests
with fixtures; default behavior unchanged (golden parity intact)
Non-erasable TS syntax with runtime semantics (enum, non-declare
namespace, parameter properties, import =, export =) is left intact and
will not cross-match. Cross-format clones are attributed to one member
format in per-format statistics.
Closes #810
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-23 08:44:08 +02:00
```
When a group mixes TypeScript (`typescript` /`tsx` ) with JavaScript (`javascript` /`jsx` ), TypeScript files are compared with erasable type syntax stripped from the detection token stream — type annotations, generics, `interface` /`type` declarations, `as` /`satisfies` , `?` /`!` markers, access modifiers, `implements` clauses, type-only imports/exports, overload signatures, and `declare` statements. Reported clone positions always reference the original sources.
Config file equivalents (all three shapes are accepted):
``` json
{ "crossFormats" : "javascript,typescript;css,scss" }
{ "crossFormats" : [ "javascript,typescript" , "css,scss" ] }
{ "crossFormats" : [ [ "javascript" , "typescript" ] , [ "css" , "scss" ] ] }
```
Notes:
- TypeScript syntax with runtime semantics is not erased and will not cross-match: `enum` , non-declare `namespace` , parameter properties (`constructor(private x)` ), `import x = require()` , `export =` .
- A cross-format clone is attributed to one member format in the per-format statistics.
- Overlapping groups are merged; groups with fewer than two formats are ignored.
chore: make master v5-only
Everything belonging to the v4 TypeScript engine moves to the master-v4
branch: apps/, packages/, build-utils/, changesets, pnpm workspace, turbo,
the Node.js CI workflow and the ts-* release jobs. What remains is the
Rust workspace under rust/, the npm wrapper and platform packages, the
GitHub Action, Docker image, flake, skills, benchmark and fixtures/.
- rust.yml gains a smoke job that runs the release binary against
fixtures/ (json, sarif, html) and asserts clones and reporters
- release.yml keeps only the Rust jobs; pnpm removed from every workflow;
audit.yml keeps cargo audit + cargo deny; dependabot drops the root npm entry
- root package.json becomes a thin private package depending on the exact
jscpd@5 version so the pre-commit hook keeps installing the binary;
sync-version.mjs keeps it in step
- .pre-commit-hooks.yaml used v4-only flags that the v5 CLI rejects; fixed
- FORMATS.md is now generated from the Rust tokenizer (224 formats)
- README, docs, CONTRIBUTING, SECURITY, package and crate descriptions,
benchmark and skills rewritten for v5 on its own terms: no v5-vs-v4 speed
multipliers anywhere, a single "Looking for v4?" pointer to master-v4
2026-09-02 10:15:10 +02:00
## Migrating from jscpd v4
jscpd v4 (TypeScript engine) is maintained on the [`master-v4` ](https://github.com/kucherenko/jscpd/tree/master-v4 ) branch and published as `jscpd@4` . Moving to v5 needs no changes to flags or config in most projects; the differences:
docs: reorganize documentation into docs/ folder, separate v4/v5 docs
- Split the overloaded README.md into focused docs:
- docs/typescript.md: v4 (Node.js) CLI, reporters, API, config
- docs/rust.md: v5 (Rust) CLI, reporters, blame, differences from v4
- docs/ai-ready.md: AI reporter, agent skills, MCP server
- docs/api.md: Programming APIs (TypeScript and Rust)
- docs/packages.md: Monorepo package and crate overview
- Trim README.md to a concise entry point with links to docs/
- Slim down rust/README.md, rust/jscpd/README.md, rust/npm/README.md:
remove duplicated content, link to docs/rust.md for details
- Fix factual errors verified against actual CLI output:
- Format count: 223 (v5) and 224 (v4), not '225+'
- Reporter output filenames: jscpd-report.* not cpd.*
- --max-size: no default in v5 (not 512KB)
- --formats-exts: same hyphenated form in both v4 and v5
- --no-gitignore: same flag name in both v4 and v5
- Update rust/jscpd/package.json: add 'cpd' bin so jscpd@5
installs both jscpd and cpd commands
- Update crate versions in rust/README.md to match source (0.1.3/0.1.4)
2026-06-08 12:57:38 +02:00
chore: make master v5-only
Everything belonging to the v4 TypeScript engine moves to the master-v4
branch: apps/, packages/, build-utils/, changesets, pnpm workspace, turbo,
the Node.js CI workflow and the ts-* release jobs. What remains is the
Rust workspace under rust/, the npm wrapper and platform packages, the
GitHub Action, Docker image, flake, skills, benchmark and fixtures/.
- rust.yml gains a smoke job that runs the release binary against
fixtures/ (json, sarif, html) and asserts clones and reporters
- release.yml keeps only the Rust jobs; pnpm removed from every workflow;
audit.yml keeps cargo audit + cargo deny; dependabot drops the root npm entry
- root package.json becomes a thin private package depending on the exact
jscpd@5 version so the pre-commit hook keeps installing the binary;
sync-version.mjs keeps it in step
- .pre-commit-hooks.yaml used v4-only flags that the v5 CLI rejects; fixed
- FORMATS.md is now generated from the Rust tokenizer (224 formats)
- README, docs, CONTRIBUTING, SECURITY, package and crate descriptions,
benchmark and skills rewritten for v5 on its own terms: no v5-vs-v4 speed
multipliers anywhere, a single "Looking for v4?" pointer to master-v4
2026-09-02 10:15:10 +02:00
| Feature | jscpd v4 (Node.js) | jscpd v5 (Rust) |
docs: reorganize documentation into docs/ folder, separate v4/v5 docs
- Split the overloaded README.md into focused docs:
- docs/typescript.md: v4 (Node.js) CLI, reporters, API, config
- docs/rust.md: v5 (Rust) CLI, reporters, blame, differences from v4
- docs/ai-ready.md: AI reporter, agent skills, MCP server
- docs/api.md: Programming APIs (TypeScript and Rust)
- docs/packages.md: Monorepo package and crate overview
- Trim README.md to a concise entry point with links to docs/
- Slim down rust/README.md, rust/jscpd/README.md, rust/npm/README.md:
remove duplicated content, link to docs/rust.md for details
- Fix factual errors verified against actual CLI output:
- Format count: 223 (v5) and 224 (v4), not '225+'
- Reporter output filenames: jscpd-report.* not cpd.*
- --max-size: no default in v5 (not 512KB)
- --formats-exts: same hyphenated form in both v4 and v5
- --no-gitignore: same flag name in both v4 and v5
- Update rust/jscpd/package.json: add 'cpd' bin so jscpd@5
installs both jscpd and cpd commands
- Update crate versions in rust/README.md to match source (0.1.3/0.1.4)
2026-06-08 12:57:38 +02:00
|---------|--------------------|-----------------|
2026-06-13 21:25:49 +02:00
| `--blame` | Calls `git` CLI for each file | Same output (`==` /`<=` markers), calls `git blame --porcelain` per file |
chore: make master v5-only
Everything belonging to the v4 TypeScript engine moves to the master-v4
branch: apps/, packages/, build-utils/, changesets, pnpm workspace, turbo,
the Node.js CI workflow and the ts-* release jobs. What remains is the
Rust workspace under rust/, the npm wrapper and platform packages, the
GitHub Action, Docker image, flake, skills, benchmark and fixtures/.
- rust.yml gains a smoke job that runs the release binary against
fixtures/ (json, sarif, html) and asserts clones and reporters
- release.yml keeps only the Rust jobs; pnpm removed from every workflow;
audit.yml keeps cargo audit + cargo deny; dependabot drops the root npm entry
- root package.json becomes a thin private package depending on the exact
jscpd@5 version so the pre-commit hook keeps installing the binary;
sync-version.mjs keeps it in step
- .pre-commit-hooks.yaml used v4-only flags that the v5 CLI rejects; fixed
- FORMATS.md is now generated from the Rust tokenizer (224 formats)
- README, docs, CONTRIBUTING, SECURITY, package and crate descriptions,
benchmark and skills rewritten for v5 on its own terms: no v5-vs-v4 speed
multipliers anywhere, a single "Looking for v4?" pointer to master-v4
2026-09-02 10:15:10 +02:00
| `--store` (LevelDB/Redis) | Persistent store for large repos | Not supported; the flag is ignored with a warning. Available on the `master-v4` line. |
docs: reorganize documentation into docs/ folder, separate v4/v5 docs
- Split the overloaded README.md into focused docs:
- docs/typescript.md: v4 (Node.js) CLI, reporters, API, config
- docs/rust.md: v5 (Rust) CLI, reporters, blame, differences from v4
- docs/ai-ready.md: AI reporter, agent skills, MCP server
- docs/api.md: Programming APIs (TypeScript and Rust)
- docs/packages.md: Monorepo package and crate overview
- Trim README.md to a concise entry point with links to docs/
- Slim down rust/README.md, rust/jscpd/README.md, rust/npm/README.md:
remove duplicated content, link to docs/rust.md for details
- Fix factual errors verified against actual CLI output:
- Format count: 223 (v5) and 224 (v4), not '225+'
- Reporter output filenames: jscpd-report.* not cpd.*
- --max-size: no default in v5 (not 512KB)
- --formats-exts: same hyphenated form in both v4 and v5
- --no-gitignore: same flag name in both v4 and v5
- Update rust/jscpd/package.json: add 'cpd' bin so jscpd@5
installs both jscpd and cpd commands
- Update crate versions in rust/README.md to match source (0.1.3/0.1.4)
2026-06-08 12:57:38 +02:00
| `--formats-exts` | Custom format-to-extension mapping | Same flag name, same behavior |
| `--formats-names` | Custom format-to-filename mapping | Same flag name, same behavior |
| Programming API | `jscpd()` Promise API, `detectClones()` | Rust API via `cpd-finder` crate; no Node.js API |
| Config file | `.jscpd.json` with camelCase keys | Same — `.jscpd.json` with camelCase keys |
| Cross-format detection | Vue SFC, Svelte, Astro, Markdown | Same — per-block tokenization |
| Token counts | Varies by tokenizer | May differ by 1-2% due to Rust tokenizer; clone detection matches |
| `--reporters` | All v4 reporters | All v4 reporters except `full` (use `console-full` ) |
| `--no-gitignore` | Default respects `.gitignore` | Same behavior, same flag name |
fix(walk): report symlinked files by their walked path and scan each file once
With `--follow-symlinks` the source id was the canonical path, so a file
reached through a link showed up as an absolute path outside the scan
root, `--ignore` (matched on the walked path) and the report disagreed
about its name, and a file reachable through two paths was two sources
(a file symlink next to its target even became a clone of itself).
The walked path, anchored at the canonical scan root, is now the id:
what reports show, what `--ignore` matches, what `--absolute` prints.
The canonical path travels alongside (`DiscoveredFile::real_path`,
`PreparedSource::real_path`) for reading the file and for the
`--skip-local` / `--skip-isolated` prefix checks. When links are
followed, files whose canonical path was already seen are dropped; the
entry that is the real file wins, else the first walked path.
Docs: `--follow-symlinks` row in the option table, the v4 default in the
migration table and README. Fixture `fixtures/follow-symlinks-demo`.
Closes #1059
Claude-Session: https://claude.ai/code/session_01WztdFKZAwW9b51iJe9zhtV
2026-09-14 20:35:29 +02:00
| Symbolic links | Followed by default; `--noSymlinks` to skip them | Skipped by default; `--follow-symlinks` (config `followSymlinks: true` ) to follow them. A v4 config with `noSymlinks: false` still maps to following |
2026-06-08 14:20:05 +02:00
| `--workers` | Not available | Available — control parallelism for file tokenization/detection |
docs: reorganize documentation into docs/ folder, separate v4/v5 docs
- Split the overloaded README.md into focused docs:
- docs/typescript.md: v4 (Node.js) CLI, reporters, API, config
- docs/rust.md: v5 (Rust) CLI, reporters, blame, differences from v4
- docs/ai-ready.md: AI reporter, agent skills, MCP server
- docs/api.md: Programming APIs (TypeScript and Rust)
- docs/packages.md: Monorepo package and crate overview
- Trim README.md to a concise entry point with links to docs/
- Slim down rust/README.md, rust/jscpd/README.md, rust/npm/README.md:
remove duplicated content, link to docs/rust.md for details
- Fix factual errors verified against actual CLI output:
- Format count: 223 (v5) and 224 (v4), not '225+'
- Reporter output filenames: jscpd-report.* not cpd.*
- --max-size: no default in v5 (not 512KB)
- --formats-exts: same hyphenated form in both v4 and v5
- --no-gitignore: same flag name in both v4 and v5
- Update rust/jscpd/package.json: add 'cpd' bin so jscpd@5
installs both jscpd and cpd commands
- Update crate versions in rust/README.md to match source (0.1.3/0.1.4)
2026-06-08 12:57:38 +02:00
| Output filenames | `jscpd-report.json` , `html/` directory | `jscpd-report.json` , `jscpd-report.html` , `jscpd-report.sarif` , `jscpd-report.csv` , `jscpd-report.md` , `jscpd-badge.svg` , `jscpd-lines-badge.svg` |
## Rust API
For integration in Rust applications:
``` rust
use cpd_finder ::orchestrate ::{ RunConfig , run } ;
let config = RunConfig {
paths : vec ! [ " ./src " . into ( ) ] ,
min_tokens : 50 ,
.. Default ::default ( )
} ;
let result = run ( & config ) . unwrap ( ) ;
println! ( " Found {} clones " , result . clones . len ( ) ) ;
println! ( " Analyzed {} files " , result . statistics . total . sources ) ;
```
## Architecture
```
feat(dead-code): find code nothing runs, via the new basta engine
Adds a second question about the same tree: not "what is duplicated" but
"what does nothing reach". A new `basta` crate builds the import graph from
the project's entry points and walks it, reporting unused files, unused
exports, unused module-private declarations, unused imports and — opt-in —
unused class members, across JavaScript, TypeScript, JSX, TSX and Python.
It ships two ways: `jscpd --dead-code` inside the existing binary, and a
standalone `basta` command. Both reuse the walker, the filters, all fifteen
reporters and the `--threshold` / `--exit-code` gates, so nothing new has to
be learned to run it.
Because it is a graph traversal rather than a reference count, dead code
cascades: a helper whose only caller is itself dead is reported too. Every
finding carries a confidence score and, below 100, the reasons it might be
wrong — `eval`, an unrecognised decorator, a wildcard re-export, a name seen
only in a string, a file in the scan that did not parse. `--min-confidence`
sets the floor at 60.
Entry points come from `package.json`, `pyproject.toml`, framework and
file-name conventions, and anything a shell script, CI workflow, Makefile or
Dockerfile names by path. CommonJS is read alongside ESM. A project that
renames its own import paths is read on its own terms: `paths` and `baseUrl`
from `tsconfig.json` and `jsconfig.json` are resolved, through a relative
`extends` chain and per package in a monorepo. A file named only by a path
string — a worker spawned through `new URL`, a build entry, a vitest setup
file — counts as used.
Languages plug in through one trait, `basta::lang::Analyzer`, which owns
parsing, specifier resolution, entry-point conventions, manifests, alias
configs and path traits. Nothing outside `lang/` is language-specific;
`docs/basta-extending.md` walks through adding one.
Validated against knip, fallow, vulture, skylos, fossil-mcp and repowise on
trending repositories. On a corpus of ten of them — 11k files, 3.3M lines —
every one of basta's 1,806 findings was checked against an import graph
rebuilt independently of it: no unused-file, unused-import or unused-symbol
claim survived as wrong.
Claude-Session: https://claude.ai/code/session_01WztdFKZAwW9b51iJe9zhtV
2026-09-16 09:23:13 +02:00
cpd / jscpd (CLI binary) basta (CLI binary)
├── cpd-core — Detection algorithm (Rabin-Karp rolling hash), report models
chore: apply audit fixes across repo, crates, npm wrapper and pipelines
Rust / crates.io
- report the invoked binary name in --version/--help (jscpd vs cpd)
- add repository, documentation, keywords, categories to all crates
- exclude tests/ from the jscpd crate package; add cargo-binstall metadata
- expand the crates.io README and render it on docs.rs
npm
- add funding field to jscpd, cpd and jscpd@4 packages
- add jscpd-linux-arm64-musl platform package and clearer unsupported-platform error
- enable provenance for the v4 changeset publish
Pipelines
- rust.yml: windows-latest in the matrix, drop dead schedule guard
- release.yml: cosign-sign release assets, floating v5 tag, LICENSE in tarballs,
invoke the new docker.yml (GHCR multi-arch image) after each release
- audit.yml: nightly cargo audit, cargo deny and pnpm audit
- Dockerfile: multi-stage image from release binaries (distroless), mcp target for Glama
Docs / community
- README: shields badges, single primary install per OS, GitHub Action snippet,
link to jscpd.dev, v5.1 features, 15 reporters, 224 formats, 8 platforms
- docs: @v5 action tag, Docker usage, baseline section, current crate versions
- YAML issue forms with engine selector, config.yml, CODEOWNERS
- remove stale .github/CONTRIBUTING.md stub, custom.md, TODO.md; untrack rust/jscpd-report.json
- examples: mark as v4 API, add a Rust cpd-finder example
2026-09-02 09:57:06 +02:00
├── cpd-tokenizer — Language tokenization (224 formats)
docs: reorganize documentation into docs/ folder, separate v4/v5 docs
- Split the overloaded README.md into focused docs:
- docs/typescript.md: v4 (Node.js) CLI, reporters, API, config
- docs/rust.md: v5 (Rust) CLI, reporters, blame, differences from v4
- docs/ai-ready.md: AI reporter, agent skills, MCP server
- docs/api.md: Programming APIs (TypeScript and Rust)
- docs/packages.md: Monorepo package and crate overview
- Trim README.md to a concise entry point with links to docs/
- Slim down rust/README.md, rust/jscpd/README.md, rust/npm/README.md:
remove duplicated content, link to docs/rust.md for details
- Fix factual errors verified against actual CLI output:
- Format count: 223 (v5) and 224 (v4), not '225+'
- Reporter output filenames: jscpd-report.* not cpd.*
- --max-size: no default in v5 (not 512KB)
- --formats-exts: same hyphenated form in both v4 and v5
- --no-gitignore: same flag name in both v4 and v5
- Update rust/jscpd/package.json: add 'cpd' bin so jscpd@5
installs both jscpd and cpd commands
- Update crate versions in rust/README.md to match source (0.1.3/0.1.4)
2026-06-08 12:57:38 +02:00
├── cpd-finder — File walking, orchestration, git blame
feat(dead-code): find code nothing runs, via the new basta engine
Adds a second question about the same tree: not "what is duplicated" but
"what does nothing reach". A new `basta` crate builds the import graph from
the project's entry points and walks it, reporting unused files, unused
exports, unused module-private declarations, unused imports and — opt-in —
unused class members, across JavaScript, TypeScript, JSX, TSX and Python.
It ships two ways: `jscpd --dead-code` inside the existing binary, and a
standalone `basta` command. Both reuse the walker, the filters, all fifteen
reporters and the `--threshold` / `--exit-code` gates, so nothing new has to
be learned to run it.
Because it is a graph traversal rather than a reference count, dead code
cascades: a helper whose only caller is itself dead is reported too. Every
finding carries a confidence score and, below 100, the reasons it might be
wrong — `eval`, an unrecognised decorator, a wildcard re-export, a name seen
only in a string, a file in the scan that did not parse. `--min-confidence`
sets the floor at 60.
Entry points come from `package.json`, `pyproject.toml`, framework and
file-name conventions, and anything a shell script, CI workflow, Makefile or
Dockerfile names by path. CommonJS is read alongside ESM. A project that
renames its own import paths is read on its own terms: `paths` and `baseUrl`
from `tsconfig.json` and `jsconfig.json` are resolved, through a relative
`extends` chain and per package in a monorepo. A file named only by a path
string — a worker spawned through `new URL`, a build entry, a vitest setup
file — counts as used.
Languages plug in through one trait, `basta::lang::Analyzer`, which owns
parsing, specifier resolution, entry-point conventions, manifests, alias
configs and path traits. Nothing outside `lang/` is language-specific;
`docs/basta-extending.md` walks through adding one.
Validated against knip, fallow, vulture, skylos, fossil-mcp and repowise on
trending repositories. On a corpus of ten of them — 11k files, 3.3M lines —
every one of basta's 1,806 findings was checked against an import graph
rebuilt independently of it: no unused-file, unused-import or unused-symbol
claim survived as wrong.
Claude-Session: https://claude.ai/code/session_01WztdFKZAwW9b51iJe9zhtV
2026-09-16 09:23:13 +02:00
├── cpd-reporter — Output formatting (15 reporters, for both modes)
└── basta — Dead code: per-language analyzers, module graph, reachability
2026-08-26 16:47:39 +02:00
```
feat(dead-code): find code nothing runs, via the new basta engine
Adds a second question about the same tree: not "what is duplicated" but
"what does nothing reach". A new `basta` crate builds the import graph from
the project's entry points and walks it, reporting unused files, unused
exports, unused module-private declarations, unused imports and — opt-in —
unused class members, across JavaScript, TypeScript, JSX, TSX and Python.
It ships two ways: `jscpd --dead-code` inside the existing binary, and a
standalone `basta` command. Both reuse the walker, the filters, all fifteen
reporters and the `--threshold` / `--exit-code` gates, so nothing new has to
be learned to run it.
Because it is a graph traversal rather than a reference count, dead code
cascades: a helper whose only caller is itself dead is reported too. Every
finding carries a confidence score and, below 100, the reasons it might be
wrong — `eval`, an unrecognised decorator, a wildcard re-export, a name seen
only in a string, a file in the scan that did not parse. `--min-confidence`
sets the floor at 60.
Entry points come from `package.json`, `pyproject.toml`, framework and
file-name conventions, and anything a shell script, CI workflow, Makefile or
Dockerfile names by path. CommonJS is read alongside ESM. A project that
renames its own import paths is read on its own terms: `paths` and `baseUrl`
from `tsconfig.json` and `jsconfig.json` are resolved, through a relative
`extends` chain and per package in a monorepo. A file named only by a path
string — a worker spawned through `new URL`, a build entry, a vitest setup
file — counts as used.
Languages plug in through one trait, `basta::lang::Analyzer`, which owns
parsing, specifier resolution, entry-point conventions, manifests, alias
configs and path traits. Nothing outside `lang/` is language-specific;
`docs/basta-extending.md` walks through adding one.
Validated against knip, fallow, vulture, skylos, fossil-mcp and repowise on
trending repositories. On a corpus of ten of them — 11k files, 3.3M lines —
every one of basta's 1,806 findings was checked against an import graph
rebuilt independently of it: no unused-file, unused-import or unused-symbol
claim survived as wrong.
Claude-Session: https://claude.ai/code/session_01WztdFKZAwW9b51iJe9zhtV
2026-09-16 09:23:13 +02:00
Both binaries walk with `cpd-finder` and report through `cpd-reporter` ; the
finding types live in `cpd-core` beside the clone models, so a reporter can
render a dead-code run without linking the analyzer that produced it.
Inside `basta` , one file per language under `src/lang/` implements the
`Analyzer` trait: it turns a source file into declarations, imports and
references, resolves the language's import specifiers against the index of
scanned modules, and declares the language's entry-point conventions,
manifests and path traits. Nothing outside `lang/` knows a language.
`graph.rs` merges every file's facts into one address space and runs the two
reachability passes, `confidence.rs` scores what is left, and `classify.rs`
decides what is worth saying. Adding a language is a new file under `lang/`
plus an entry in the `ANALYZERS` registry — see
[`docs/basta-extending.md` ](basta-extending.md ).