[{"data":1,"prerenderedAt":1044},["ShallowReactive",2],{"navigation_docs":3,"-guides-health":188,"-guides-health-surround":1039},[4,50,82,99,135,157,173,178,183],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":6},"Getting Started",false,"\u002Fgetting-started","1.getting-started",[10,15,20,25,30,35,40,45],{"title":11,"path":12,"stem":13,"icon":14},"Introduction","\u002Fgetting-started\u002Fintroduction","1.getting-started\u002F2.introduction","i-lucide-house",{"title":16,"path":17,"stem":18,"icon":19},"Installation","\u002Fgetting-started\u002Finstallation","1.getting-started\u002F3.installation","i-lucide-download",{"title":21,"path":22,"stem":23,"icon":24},"Configuration","\u002Fgetting-started\u002Fconfiguration","1.getting-started\u002F4.configuration","i-lucide-settings",{"title":26,"path":27,"stem":28,"icon":29},"Supported Formats","\u002Fgetting-started\u002Fsupported-formats","1.getting-started\u002F5.supported-formats","i-lucide-file-code",{"title":31,"path":32,"stem":33,"icon":34},"Agent Skill","\u002Fgetting-started\u002Fagent-skill","1.getting-started\u002F6.agent-skill","i-lucide-cpu",{"title":36,"path":37,"stem":38,"icon":39},"Changelog","\u002Fgetting-started\u002Fchangelog","1.getting-started\u002F7.changelog","i-lucide-scroll-text",{"title":41,"path":42,"stem":43,"icon":44},"Migrating from v4 to v5","\u002Fgetting-started\u002Fmigration","1.getting-started\u002F8.migration","i-lucide-arrow-right-left",{"title":46,"path":47,"stem":48,"icon":49},"jscpd v4 (TypeScript)","\u002Fgetting-started\u002Fv4","1.getting-started\u002F9.v4","i-simple-icons-typescript",{"title":51,"path":52,"stem":53,"children":54,"icon":6},"Guides","\u002Fguides","2.guides\u002F1.index",[55,57,62,67,72,77],{"title":51,"path":52,"stem":53,"icon":56},"i-lucide-book-open",{"title":58,"path":59,"stem":60,"icon":61},"Types of Code Clones","\u002Fguides\u002Fclone-types","2.guides\u002F2.clone-types","i-lucide-copy",{"title":63,"path":64,"stem":65,"icon":66},"How Detection Works","\u002Fguides\u002Fhow-detection-works","2.guides\u002F3.how-detection-works","i-lucide-scan-search",{"title":68,"path":69,"stem":70,"icon":71},"Duplication Trend over Git History","\u002Fguides\u002Fhistory","2.guides\u002F4.history","i-lucide-chart-no-axes-combined",{"title":73,"path":74,"stem":75,"icon":76},"Project Dashboard","\u002Fguides\u002Fdashboard","2.guides\u002F5.dashboard","i-lucide-layout-dashboard",{"title":78,"path":79,"stem":80,"icon":81},"Project Health Score","\u002Fguides\u002Fhealth","2.guides\u002F6.health","i-lucide-heart-pulse",{"title":83,"path":84,"stem":85,"children":86,"icon":6},"CI & Hooks","\u002Fci-and-hooks","3.ci-and-hooks\u002F1.index",[87,89,94],{"title":83,"path":84,"stem":85,"icon":88},"i-lucide-git-pull-request",{"title":90,"path":91,"stem":92,"icon":93},"Use jscpd in CI","\u002Fci-and-hooks\u002Fci","3.ci-and-hooks\u002F2.ci","i-lucide-github",{"title":95,"path":96,"stem":97,"icon":98},"Use jscpd in Pre-Commit Hook","\u002Fci-and-hooks\u002Fpre-commit","3.ci-and-hooks\u002F3.pre-commit","i-lucide-git-commit",{"title":100,"path":101,"stem":102,"children":103,"icon":105},"Reporters","\u002Freporters","4.reporters\u002F1.index",[104,106,110,115,120,125,130],{"title":100,"path":101,"stem":102,"icon":105},"i-lucide-file-chart-column",{"title":107,"path":108,"stem":109,"icon":29},"HTML Reporter","\u002Freporters\u002Fhtml","4.reporters\u002F2.html",{"title":111,"path":112,"stem":113,"icon":114},"JSON Reporter","\u002Freporters\u002Fjson","4.reporters\u002F3.json","i-lucide-braces",{"title":116,"path":117,"stem":118,"icon":119},"Badge Reporter","\u002Freporters\u002Fbadge","4.reporters\u002F4.badge","i-lucide-award",{"title":121,"path":122,"stem":123,"icon":124},"SARIF Reporter","\u002Freporters\u002Fsarif","4.reporters\u002F5.sarif","i-lucide-shield-check",{"title":126,"path":127,"stem":128,"icon":129},"CodeClimate \u002F GitLab Reporter","\u002Freporters\u002Fcodeclimate","4.reporters\u002F6.codeclimate","i-lucide-flag-triangle-right",{"title":131,"path":132,"stem":133,"icon":134},"OpenMetrics Reporter","\u002Freporters\u002Fopenmetrics","4.reporters\u002F7.openmetrics","i-lucide-activity",{"title":136,"path":137,"stem":138,"children":139,"icon":6},"Benchmarks","\u002Fbenchmarks","5.benchmarks\u002F1.index",[140,142,147,152],{"title":136,"path":137,"stem":138,"icon":141},"i-lucide-gauge",{"title":143,"path":144,"stem":145,"icon":146},"Detection Speed","\u002Fbenchmarks\u002Fdetection-speed","5.benchmarks\u002F2.detection-speed","i-lucide-zap",{"title":148,"path":149,"stem":150,"icon":151},"Multi-Format Detection","\u002Fbenchmarks\u002Fcross-format","5.benchmarks\u002F3.cross-format","i-lucide-layers",{"title":153,"path":154,"stem":155,"icon":156},"AI Token Efficiency","\u002Fbenchmarks\u002Fai-token-efficiency","5.benchmarks\u002F4.ai-token-efficiency","i-lucide-sparkles",{"title":158,"path":159,"stem":160,"children":161,"icon":163},"API","\u002Fapi","6.api\u002F1.index",[162,164,169],{"title":158,"path":159,"stem":160,"icon":163},"i-lucide-code",{"title":165,"path":166,"stem":167,"icon":168},"Rust Crates (v5)","\u002Fapi\u002Fcore","6.api\u002F2.core","i-lucide-box",{"title":170,"path":171,"stem":172,"icon":168},"MCP Server","\u002Fapi\u002Fmcp-server","6.api\u002F4.mcp-server",{"title":174,"path":175,"stem":176,"icon":177},"Trending","\u002Ftrending","7.trending","i-lucide-trending-up",{"title":179,"path":180,"stem":181,"icon":182},"Research","\u002Fresearch","8.research","i-lucide-graduation-cap",{"title":184,"path":185,"stem":186,"icon":187},"Articles","\u002Farticles","9.articles","i-lucide-newspaper",{"id":189,"title":78,"body":190,"description":1030,"extension":1031,"links":1032,"meta":1033,"navigation":1034,"path":79,"seo":1035,"stem":80,"__hash__":1038},"docs\u002F2.guides\u002F6.health.md",{"type":191,"value":192,"toc":1023},"minimark",[193,209,218,223,289,297,304,308,314,358,361,371,417,449,475,478,482,511,723,734,738,749,905,912,916,997,1019],[194,195,196,197,201,202,208],"p",{},"Duplication, dead code and complexity each tell part of the story. ",[198,199,200],"code",{},"--health"," folds them into one number you can put on a README, track over time, or gate on, and ",[203,204,205],"a",{"href":74},[198,206,207],{},"--dashboard"," shows it on top of the screen.",[210,211,212,213,217],"note",{},"Available from jscpd ",[214,215,216],"strong",{},"5.3.0",". Dead code is measured for JavaScript, TypeScript and Python.",[219,220,222],"h2",{"id":221},"running-it","Running it",[224,225,231],"pre",{"className":226,"code":227,"filename":228,"language":229,"meta":230,"style":230},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","jscpd src --health                                   # the badge\njscpd src --health --reporters json,badge            # jscpd-health.json + jscpd-health-badge.svg\njscpd src --health --health-input metrics.json       # with coverage, tests, security\n","Terminal","bash","",[198,232,233,253,271],{"__ignoreMap":230},[234,235,238,242,246,249],"span",{"class":236,"line":237},"line",1,[234,239,241],{"class":240},"sBMFI","jscpd",[234,243,245],{"class":244},"sfazB"," src",[234,247,248],{"class":244}," --health",[234,250,252],{"class":251},"sHwdD","                                   # the badge\n",[234,254,256,258,260,262,265,268],{"class":236,"line":255},2,[234,257,241],{"class":240},[234,259,245],{"class":244},[234,261,248],{"class":244},[234,263,264],{"class":244}," --reporters",[234,266,267],{"class":244}," json,badge",[234,269,270],{"class":251},"            # jscpd-health.json + jscpd-health-badge.svg\n",[234,272,274,276,278,280,283,286],{"class":236,"line":273},3,[234,275,241],{"class":240},[234,277,245],{"class":244},[234,279,248],{"class":244},[234,281,282],{"class":244}," --health-input",[234,284,285],{"class":244}," metrics.json",[234,287,288],{"class":251},"       # with coverage, tests, security\n",[224,290,295],{"className":291,"code":293,"language":294,"meta":230},[292],"language-text","Health  B  74\u002F100  ███████████████░░░░░  93 lines of code (XS)\n  duplication 75 (5.4%) · dead code 72 (14.0%) · complexity 76 (0.0% in complex files)\n","text",[198,296,293],{"__ignoreMap":230},[194,298,299,300,303],{},"Each sub-score is followed by what it was measured from. A dimension that cannot be measured is named (",[198,301,302],{},"dead code n\u002Fa",") rather than scored as perfect.",[219,305,307],{"id":306},"how-it-is-calculated","How it is calculated",[194,309,310,313],{},[214,311,312],{},"1. Three shares of the code lines."," Because every dimension is a share, a project is not penalized for being large.",[315,316,317,330],"table",{},[318,319,320],"thead",{},[321,322,323,327],"tr",{},[324,325,326],"th",{},"Dimension",[324,328,329],{},"What is measured",[331,332,333,342,350],"tbody",{},[321,334,335,339],{},[336,337,338],"td",{},"Duplication",[336,340,341],{},"jscpd's duplication percentage, over code files",[321,343,344,347],{},[336,345,346],{},"Dead code",[336,348,349],{},"Share of lines nothing runs (JavaScript, TypeScript, Python)",[321,351,352,355],{},[336,353,354],{},"Complexity",[336,356,357],{},"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",[194,359,360],{},"Prose and data files (markdown, JSON, YAML, lock files) are not the project's code and are left out, so a folder of copied JSON snapshots does not lower the score.",[194,362,363,366,367,370],{},[214,364,365],{},"2. A sub-score per dimension"," on a half-life curve: ",[198,368,369],{},"100 · 2^(−share \u002F halfLife)",". It is 100 at zero, 50 at one half-life and 25 at two, with no cliff and no dead zone. The half-lives are calibrated on 42 open-source projects so that the median project scores 75 in each dimension:",[315,372,373,385],{},[318,374,375],{},[321,376,377,379,382],{},[324,378,326],{},[324,380,381],{},"Half-life",[324,383,384],{},"Median project",[331,386,387,397,407],{},[321,388,389,391,394],{},[336,390,338],{},[336,392,393],{},"8.5%",[336,395,396],{},"3.5%",[321,398,399,401,404],{},[336,400,346],{},[336,402,403],{},"7.5%",[336,405,406],{},"3.1%",[321,408,409,411,414],{},[336,410,354],{},[336,412,413],{},"50% in complex files",[336,415,416],{},"20.9%",[194,418,419,422,423,426,427,430,431,434,435,438,439,438,442,438,445,448],{},[214,420,421],{},"3. Size."," 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 JSON report carries both the measured ",[198,424,425],{},"value"," and the ",[198,428,429],{},"adjusted"," one, and the badge shows the size class (",[198,432,433],{},"XS"," under 1K lines of code, ",[198,436,437],{},"S",", ",[198,440,441],{},"M",[198,443,444],{},"L",[198,446,447],{},"XL"," from 1M).",[194,450,451,454,455,458,459,462,463,466,467,470,471,474],{},[214,452,453],{},"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: ",[198,456,457],{},"A"," from 85, ",[198,460,461],{},"B"," from 70, ",[198,464,465],{},"C"," from 55, ",[198,468,469],{},"D"," from 40, then ",[198,472,473],{},"E",". On the calibration corpus that gives 5 A, 13 B, 15 C, 8 D and 1 E.",[194,476,477],{},"Dead code is skipped when JavaScript, TypeScript and Python are under 5% of the code, and otherwise weighs as much as the share of the code it could read. Two scores are comparable only when they are built from the same dimensions.",[219,479,481],{"id":480},"metrics-from-other-tools","Metrics from other tools",[194,483,484,487,488,491,492,495,496,498,499,502,503,506,507,510],{},[198,485,486],{},"--health-input FILE"," (config key ",[198,489,490],{},"healthInput",") adds what jscpd cannot measure. A metric is either a ready 0-100 ",[198,493,494],{},"score",", or a ",[198,497,425],{}," with the ",[198,500,501],{},"halfLife"," that turns it into one; ",[198,504,505],{},"\"direction\": \"higher\""," scores the distance to ",[198,508,509],{},"max"," (default 100).",[224,512,517],{"className":513,"code":514,"filename":515,"language":516,"meta":230,"style":230},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"metrics\": [\n    { \"id\": \"coverage\", \"value\": 81, \"direction\": \"higher\", \"halfLife\": 40 },\n    { \"id\": \"failing-tests\", \"value\": 2, \"halfLife\": 5 },\n    { \"id\": \"security\", \"score\": 100, \"weight\": 2 }\n  ]\n}\n","metrics.json","json",[198,518,519,525,543,614,662,711,717],{"__ignoreMap":230},[234,520,521],{"class":236,"line":237},[234,522,524],{"class":523},"sMK4o","{\n",[234,526,527,530,534,537,540],{"class":236,"line":255},[234,528,529],{"class":523},"  \"",[234,531,533],{"class":532},"spNyl","metrics",[234,535,536],{"class":523},"\"",[234,538,539],{"class":523},":",[234,541,542],{"class":523}," [\n",[234,544,545,548,551,554,556,558,560,563,565,568,570,572,574,576,580,582,584,587,589,591,593,596,598,600,602,604,606,608,611],{"class":236,"line":273},[234,546,547],{"class":523},"    {",[234,549,550],{"class":523}," \"",[234,552,553],{"class":240},"id",[234,555,536],{"class":523},[234,557,539],{"class":523},[234,559,550],{"class":523},[234,561,562],{"class":244},"coverage",[234,564,536],{"class":523},[234,566,567],{"class":523},",",[234,569,550],{"class":523},[234,571,425],{"class":240},[234,573,536],{"class":523},[234,575,539],{"class":523},[234,577,579],{"class":578},"sbssI"," 81",[234,581,567],{"class":523},[234,583,550],{"class":523},[234,585,586],{"class":240},"direction",[234,588,536],{"class":523},[234,590,539],{"class":523},[234,592,550],{"class":523},[234,594,595],{"class":244},"higher",[234,597,536],{"class":523},[234,599,567],{"class":523},[234,601,550],{"class":523},[234,603,501],{"class":240},[234,605,536],{"class":523},[234,607,539],{"class":523},[234,609,610],{"class":578}," 40",[234,612,613],{"class":523}," },\n",[234,615,617,619,621,623,625,627,629,632,634,636,638,640,642,644,647,649,651,653,655,657,660],{"class":236,"line":616},4,[234,618,547],{"class":523},[234,620,550],{"class":523},[234,622,553],{"class":240},[234,624,536],{"class":523},[234,626,539],{"class":523},[234,628,550],{"class":523},[234,630,631],{"class":244},"failing-tests",[234,633,536],{"class":523},[234,635,567],{"class":523},[234,637,550],{"class":523},[234,639,425],{"class":240},[234,641,536],{"class":523},[234,643,539],{"class":523},[234,645,646],{"class":578}," 2",[234,648,567],{"class":523},[234,650,550],{"class":523},[234,652,501],{"class":240},[234,654,536],{"class":523},[234,656,539],{"class":523},[234,658,659],{"class":578}," 5",[234,661,613],{"class":523},[234,663,665,667,669,671,673,675,677,680,682,684,686,688,690,692,695,697,699,702,704,706,708],{"class":236,"line":664},5,[234,666,547],{"class":523},[234,668,550],{"class":523},[234,670,553],{"class":240},[234,672,536],{"class":523},[234,674,539],{"class":523},[234,676,550],{"class":523},[234,678,679],{"class":244},"security",[234,681,536],{"class":523},[234,683,567],{"class":523},[234,685,550],{"class":523},[234,687,494],{"class":240},[234,689,536],{"class":523},[234,691,539],{"class":523},[234,693,694],{"class":578}," 100",[234,696,567],{"class":523},[234,698,550],{"class":523},[234,700,701],{"class":240},"weight",[234,703,536],{"class":523},[234,705,539],{"class":523},[234,707,646],{"class":578},[234,709,710],{"class":523}," }\n",[234,712,714],{"class":236,"line":713},6,[234,715,716],{"class":523},"  ]\n",[234,718,720],{"class":236,"line":719},7,[234,721,722],{"class":523},"}\n",[194,724,725,726,729,730,733],{},"With ",[198,727,728],{},"halfLife: 40",", 81% coverage is 19 short of 100 and scores 72; 60% scores 50. A CI job typically writes this file from its coverage and audit steps, then runs ",[198,731,732],{},"jscpd . --health --health-input metrics.json",".",[219,735,737],{"id":736},"tuning","Tuning",[194,739,740,741,744,745,748],{},"The same object can live under ",[198,742,743],{},"health"," in ",[198,746,747],{},".jscpd.json",", together with the tuning of the built-in dimensions:",[224,750,752],{"className":513,"code":751,"filename":747,"language":516,"meta":230,"style":230},"{\n  \"health\": {\n    \"duplication\": { \"halfLife\": 5, \"weight\": 2 },\n    \"deadCode\": { \"weight\": 0 },\n    \"complexFile\": 80,\n    \"metrics\": [{ \"id\": \"security\", \"score\": 100 }]\n  }\n}\n",[198,753,754,758,771,810,836,853,895,900],{"__ignoreMap":230},[234,755,756],{"class":236,"line":237},[234,757,524],{"class":523},[234,759,760,762,764,766,768],{"class":236,"line":255},[234,761,529],{"class":523},[234,763,743],{"class":532},[234,765,536],{"class":523},[234,767,539],{"class":523},[234,769,770],{"class":523}," {\n",[234,772,773,776,779,781,783,786,788,790,792,794,796,798,800,802,804,806,808],{"class":236,"line":273},[234,774,775],{"class":523},"    \"",[234,777,778],{"class":240},"duplication",[234,780,536],{"class":523},[234,782,539],{"class":523},[234,784,785],{"class":523}," {",[234,787,550],{"class":523},[234,789,501],{"class":578},[234,791,536],{"class":523},[234,793,539],{"class":523},[234,795,659],{"class":578},[234,797,567],{"class":523},[234,799,550],{"class":523},[234,801,701],{"class":578},[234,803,536],{"class":523},[234,805,539],{"class":523},[234,807,646],{"class":578},[234,809,613],{"class":523},[234,811,812,814,817,819,821,823,825,827,829,831,834],{"class":236,"line":616},[234,813,775],{"class":523},[234,815,816],{"class":240},"deadCode",[234,818,536],{"class":523},[234,820,539],{"class":523},[234,822,785],{"class":523},[234,824,550],{"class":523},[234,826,701],{"class":578},[234,828,536],{"class":523},[234,830,539],{"class":523},[234,832,833],{"class":578}," 0",[234,835,613],{"class":523},[234,837,838,840,843,845,847,850],{"class":236,"line":664},[234,839,775],{"class":523},[234,841,842],{"class":240},"complexFile",[234,844,536],{"class":523},[234,846,539],{"class":523},[234,848,849],{"class":578}," 80",[234,851,852],{"class":523},",\n",[234,854,855,857,859,861,863,866,868,870,872,874,876,878,880,882,884,886,888,890,892],{"class":236,"line":713},[234,856,775],{"class":523},[234,858,533],{"class":240},[234,860,536],{"class":523},[234,862,539],{"class":523},[234,864,865],{"class":523}," [{",[234,867,550],{"class":523},[234,869,553],{"class":578},[234,871,536],{"class":523},[234,873,539],{"class":523},[234,875,550],{"class":523},[234,877,679],{"class":244},[234,879,536],{"class":523},[234,881,567],{"class":523},[234,883,550],{"class":523},[234,885,494],{"class":578},[234,887,536],{"class":523},[234,889,539],{"class":523},[234,891,694],{"class":578},[234,893,894],{"class":523}," }]\n",[234,896,897],{"class":236,"line":719},[234,898,899],{"class":523},"  }\n",[234,901,903],{"class":236,"line":902},8,[234,904,722],{"class":523},[194,906,907,908,911],{},"A weight of ",[198,909,910],{},"0"," leaves a dimension out. An unknown key, or a metric that cannot be scored, is an error rather than a silently different score.",[219,913,915],{"id":914},"reporters-and-exit-codes","Reporters and exit codes",[315,917,918,928],{},[318,919,920],{},[321,921,922,925],{},[324,923,924],{},"Reporter",[324,926,927],{},"Output",[331,929,930,940,953,965,977],{},[321,931,932,937],{},[336,933,934],{},[198,935,936],{},"console",[336,938,939],{},"The badge",[321,941,942,947],{},[336,943,944],{},[198,945,946],{},"ai",[336,948,949,950],{},"One line: ",[198,951,952],{},"health 74 B (duplication 75, dead-code 72, complexity 76; 93 code lines)",[321,954,955,959],{},[336,956,957],{},[198,958,516],{},[336,960,961,964],{},[198,962,963],{},"jscpd-health.json",": score, grade, size, and for each dimension its value, adjusted value, lines, half-life, weight and score",[321,966,967,972],{},[336,968,969],{},[198,970,971],{},"badge",[336,973,974],{},[198,975,976],{},"jscpd-health-badge.svg",[321,978,979,988],{},[336,980,981,984,985],{},[198,982,983],{},"markdown"," \u002F ",[198,986,987],{},"html",[336,989,990,984,993,996],{},[198,991,992],{},"jscpd-health.md",[198,994,995],{},"jscpd-health.html",": the same score and dimension table, for a PR comment or a status page",[194,998,999,1000,438,1003,1006,1007,1010,1011,733],{},"The exit gates of a clone run apply: ",[198,1001,1002],{},"--threshold",[198,1004,1005],{},"--exit-code"," and ",[198,1008,1009],{},"--fail-on-empty",". A runnable example, with a metrics file, is in ",[203,1012,1016],{"href":1013,"rel":1014},"https:\u002F\u002Fgithub.com\u002Fkucherenko\u002Fjscpd\u002Ftree\u002Fmaster\u002Ffixtures\u002Fdashboard-demo#health",[1015],"nofollow",[198,1017,1018],{},"fixtures\u002Fdashboard-demo",[1020,1021,1022],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":230,"searchDepth":255,"depth":255,"links":1024},[1025,1026,1027,1028,1029],{"id":221,"depth":255,"text":222},{"id":306,"depth":255,"text":307},{"id":480,"depth":255,"text":481},{"id":736,"depth":255,"text":737},{"id":914,"depth":255,"text":915},"One 0-100 score with a grade for a codebase, from how much of it is duplicated, dead or concentrated in complex files, extensible with coverage, test and security metrics.","md",null,{},{"icon":81},{"title":1036,"description":1037},"Project Health Score with jscpd --health","jscpd --health turns duplication, dead code and complexity into one size-aware 0-100 score with an A-E grade, calibrated on 42 open-source projects and extensible with metrics from other tools.","_FaV-842O9QLl_LkFuKkAsbOVV6MmP9GD0_5gXTnzLA",[1040,1042],{"title":73,"path":74,"stem":75,"description":1041,"icon":76,"children":-1},"One screen with a project's size, duplication, complexity and dead code, from a single jscpd --dashboard run.",{"title":83,"path":84,"stem":85,"description":1043,"icon":88,"children":-1},"Integrate jscpd into your CI pipeline and git hooks.",1789749597468]