Reporters
Reporters
Output formats and reporters in jscpd.
Overview
jscpd supports multiple reporters to output duplication detection results in various formats.
Available Reporters
| Reporter | Description |
|---|---|
console | Output results to console (default) |
consoleFull | Detailed console output with code snippets |
ai | Compact token-efficient output for AI tools (~79% fewer tokens than default) |
json | JSON format output |
xml | XML format output |
html | Interactive HTML report |
markdown | Markdown format output |
csv | CSV format output |
threshold | Exit with error if threshold exceeded |
badge | Generate SVG badge |
AI Reporter
The ai reporter is optimized for piping jscpd output into AI/LLM tools. It uses common-path-prefix compression and omits code fragments and colors, producing output that is ~79% smaller than the default reporter.
Benchmarked on fixtures/ (91 clones, 132 files):
| Reporter | Estimated tokens |
|---|---|
console (default) | ~5,400 |
ai | ~1,100 |
jscpd --reporters ai ./src
Example output:
Clones:
fixtures/yaml/ file1.yml:1-18 ~ file2.yml:1-18
fixtures/xml/file2.xsl 32-43 ~ 20-31
fixtures/xml/ file1.xsl:1-47 ~ file2.xsl:1-35
fixtures/xml/ file1.svg:1-88 ~ file2.svg:1-87
fixtures/vue/ file1.vue:1-75 ~ file2.vue:1-75
fixtures/vue/ file1.vue:95-262 ~ file2.vue:74-241
fixtures/twig/file_2.twig 17-32 ~ 14-23
fixtures/twig/ file_1.twig:1-29 ~ file_2.twig:1-32
fixtures/text/ file1.txt:1-12 ~ file2.txt:1-12
fixtures/swift/ file1.swift:9-30 ~ file2.swift:2-24
fixtures/sass/ file1.sass:21-45 ~ file2.sass:24-48
fixtures/rust/file2.rs 220-230 ~ 148-158
fixtures/rust/file2.rs 256-271 ~ 204-219
fixtures/rust/ file1.rs:1-131 ~ file2.rs:1-132
fixtures/rust/ file1.rs:199-206 ~ file2.rs:140-147
fixtures/rust/ file1.rs:232-239 ~ file2.rs:132-139
fixtures/rust/ file1.rs:239-416 ~ file2.rs:123-301
fixtures/ruby/ file1.rb:1-40 ~ file2.rb:1-40
fixtures/r/ file1.r:1-64 ~ file2.r:1-64
fixtures/python/ file1.py:1-27 ~ file2.py:1-26
fixtures/puppet/ file1.pp:1-40 ~ file2.pp:1-40
fixtures/puppet/ file1.pp:44-64 ~ file2.pp:38-58
fixtures/pug/ file1.pug:1-274 ~ file2.pug:1-266
fixtures/php/ file1.php:1-51 ~ file2.php:1-51
fixtures/perl/ file1.pm:1-144 ~ file2.pm:1-144
fixtures/perl/ file1.pl:1-123 ~ file2.pl:1-123
fixtures/one-file/one-file.js 32-61 ~ 1-29
fixtures/objective-c/ file_1.m:14-64 ~ file_2.m:38-88
fixtures/objective-c/ file_1.h:1-35 ~ file_2.h:1-37
fixtures/modes/ file1.ts:1-92 ~ file2.ts:1-86
fixtures/markdown/ file1.md:4-81 ~ file2.md:9-86
fixtures/markdown/ file1.md:82-178 ~ file2.md:87-183
fixtures/jsx/ file1.tsx:1-37 ~ file2.tsx:1-37
fixtures/jsx/ file1.jsx:1-23 ~ file2.jsx:1-23
fixtures/javascript/file_4.js 56-83 ~ 15-42
fixtures/javascript/ file_2.mjs:1-28 ~ file_3.js:25-52
fixtures/javascript/ file_2.mjs:29-56 ~ file_3.js:25-52
fixtures/javascript/ file_2.js:1-56 ~ file_3.js:25-52
fixtures/javascript/ file_2.cjs:1-56 ~ file_3.js:25-52
fixtures/javascript/ file_1.mjs:4-55 ~ file_3.js:1-52
fixtures/javascript/ file_1.js:1-55 ~ file_1.mjs:1-52
fixtures/javascript/ file_1.cjs:1-55 ~ file_1.mjs:1-52
fixtures/javascript/ file2.mts:1-376 ~ file2.ts:1-376
fixtures/javascript/ file2.cts:1-376 ~ file2.ts:1-376
fixtures/javascript/ file1.ts:1-73 ~ file2.ts:48-119
fixtures/javascript/ file1.ts:73-263 ~ file2.ts:186-376
fixtures/javascript/ file1.mts:1-263 ~ file2.ts:48-376
fixtures/javascript/ file1.js:1-24 ~ file2.js:1-27
fixtures/javascript/ file1.cts:1-263 ~ file2.ts:48-376
fixtures/ ignore-case/file2.txt:1-61 ~ text/file2.txt:1-61
fixtures/ htmlmixed/file2.htm:1-24 ~ ignore/file2.htm:1-24
fixtures/htmlmixed/ file1.html:1-16 ~ file2.html:1-16
fixtures/ htmlmixed/file1.htm:1-24 ~ ignore/file2.htm:1-24
fixtures/haxe/ file1.hxml:3-14 ~ file2.hxml:1-12
fixtures/haxe/ file1.hx:1-47 ~ file2.hx:1-47
fixtures/haxe/ file1.hx:47-103 ~ file2.hx:6-62
fixtures/haskell/ file1.hs:1-175 ~ file2.hs:1-175
fixtures/haskell/ file1.hs:190-204 ~ file2.hs:175-189
fixtures/go/ file1.go:1-30 ~ file2.go:1-31
fixtures/gdscript/ file1.gd:22-47 ~ file2.gd:22-47
fixtures/ folder2/file_2.js:1-56 ~ javascript/file_3.js:25-52
fixtures/ folder1/file_1.js:1-55 ~ javascript/file_1.mjs:1-52
fixtures/folder1/file2.c 18-28 ~ 8-18
fixtures/erlang/ file1.erl:1-121 ~ file2.erl:1-121
fixtures/dart/ file1.dart:1-91 ~ file2.dart:1-91
fixtures/dart/ file1.dart:118-148 ~ file2.dart:88-118
fixtures/d/ file1.d:1-169 ~ file2.d:1-169
fixtures/css/ file10.css:1-20 ~ file2.css:1-20
fixtures/css/ file1.less:1-20 ~ file2.less:1-20
fixtures/css/file1.less 24-36 ~ 14-25
fixtures/css/ file1.css:1-25 ~ file2.css:1-25
fixtures/coffeescript/ file1.coffee:1-13 ~ file2.coffee:3-15
fixtures/coffeescript/file1.coffee 46-77 ~ 16-46
fixtures/clike/file2.hpp 45-66 ~ 24-45
fixtures/clike/file2.h 18-28 ~ 8-18
fixtures/clike/file2.cpp 45-66 ~ 24-45
fixtures/ clike/file2.c:1-29 ~ folder1/file2.c:1-29
fixtures/clike/ file1.scala:1-29 ~ file2.scala:1-29
fixtures/clike/ file1.java:1-191 ~ file2.java:1-191
fixtures/clike/ file1.java:182-221 ~ file2.java:194-233
fixtures/clike/ file1.hpp:14-86 ~ file2.hpp:14-86
fixtures/clike/ file1.h:1-19 ~ file2.h:1-29
fixtures/clike/ file1.cs:1-95 ~ file2.cs:1-94
fixtures/clike/ file1.cs:103-185 ~ file2.cs:93-175
fixtures/clike/ file1.cpp:14-86 ~ file2.cpp:14-86
fixtures/ clike/file1.c:1-19 ~ folder1/file2.c:1-29
fixtures/brainfuck/ file2.b:1-41 ~ file2.bf:1-41
fixtures/brainfuck/ file1.bf:1-28 ~ file2.bf:1-28
fixtures/brainfuck/ file1.bf:28-36 ~ file2.bf:33-41
fixtures/brainfuck/ file1.b:1-41 ~ file2.bf:1-41
fixtures/apl/ file1.apl:1-21 ~ file2.apl:1-22
---
91 clones · 54.4% duplication
time: 377.51ms
Using Multiple Reporters
jscpd --reporters console,html,json ./src
Output Directory
Specify where reports are saved:
jscpd --output ./reports ./src
Reporter Configuration
In .jscpd.json:
.jscpd.json
{
"reporters": ["html", "console", "json"],
"output": "./jscpd-report"
}