# Reporters

> Output formats and reporters in jscpd.

## Overview

jscpd supports multiple reporters to output duplication detection results in various formats.

## Available Reporters

<table>
<thead>
  <tr>
    <th>
      Reporter
    </th>
    
    <th>
      Description
    </th>
  </tr>
</thead>

<tbody>
  <tr>
    <td>
      <code>
        console
      </code>
    </td>
    
    <td>
      Output results to console (default)
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        consoleFull
      </code>
    </td>
    
    <td>
      Detailed console output with code snippets and side-by-side blame
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        ai
      </code>
    </td>
    
    <td>
      Compact token-efficient output for AI tools (~79% fewer tokens than default)
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        json
      </code>
    </td>
    
    <td>
      JSON format output (<code>
        jscpd-report.json
      </code>
      
      )
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        xml
      </code>
    </td>
    
    <td>
      XML format output (<code>
        jscpd-report.xml
      </code>
      
      )
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        csv
      </code>
    </td>
    
    <td>
      CSV format output (<code>
        jscpd-report.csv
      </code>
      
      )
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        markdown
      </code>
    </td>
    
    <td>
      Markdown format output (<code>
        jscpd-report.md
      </code>
      
      )
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        html
      </code>
    </td>
    
    <td>
      Interactive HTML report (<code>
        jscpd-report.html
      </code>
      
      )
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        sarif
      </code>
    </td>
    
    <td>
      SARIF output for GitHub Code Scanning (<code>
        jscpd-sarif.json
      </code>
      
      )
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        badge
      </code>
    </td>
    
    <td>
      Badge generator for README files
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        xcode
      </code>
    </td>
    
    <td>
      Xcode-compatible warnings output
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        threshold
      </code>
    </td>
    
    <td>
      Exit with error code when duplication exceeds threshold
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        silent
      </code>
    </td>
    
    <td>
      No console output
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        time
      </code>
    </td>
    
    <td>
      Output execution time (included in default reporters)
    </td>
  </tr>
</tbody>
</table>

## 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):**

<table>
<thead>
  <tr>
    <th>
      Reporter
    </th>
    
    <th>
      Estimated tokens
    </th>
  </tr>
</thead>

<tbody>
  <tr>
    <td>
      <code>
        console
      </code>
      
       (default)
    </td>
    
    <td>
      ~5,400
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        ai
      </code>
    </td>
    
    <td>
      ~1,100
    </td>
  </tr>
</tbody>
</table>

```bash
jscpd --reporters ai ./src
```

**Example output:**

```text
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

```bash
jscpd --reporters console,html,json ./src
```

## Output Directory

Specify where reports are saved:

```bash
jscpd --output ./reports ./src
```

## Reporter Configuration

In `.jscpd.json`:

```json [.jscpd.json]
{
  "reporters": ["html", "console", "json"],
  "output": "./jscpd-report"
}
```

```text
code,[object Object],
```
