[{"data":1,"prerenderedAt":448},["ShallowReactive",2],{"navigation_docs":3,"trending-repo-spotify\u002Fportal-ai-plugins":249,"page-views-\u002Ftrending\u002Fspotify\u002Fportal-ai-plugins":446},[4,29,104,124,194],{"title":5,"icon":6,"path":7,"stem":8,"children":9},"Start",false,"\u002Fstart","1.start",[10,14,19,24],{"title":11,"path":7,"stem":12,"icon":13},"What jscpd finds","1.start\u002Findex","i-lucide-house",{"title":15,"path":16,"stem":17,"icon":18},"Installation","\u002Fstart\u002Finstallation","1.start\u002F2.installation","i-lucide-download",{"title":20,"path":21,"stem":22,"icon":23},"Quickstart","\u002Fstart\u002Fquickstart","1.start\u002F3.quickstart","i-lucide-rocket",{"title":25,"path":26,"stem":27,"icon":28},"Configuration basics","\u002Fstart\u002Fconfiguration","1.start\u002F4.configuration","i-lucide-settings-2",{"title":30,"icon":6,"path":31,"stem":32,"children":33,"page":6},"Guides","\u002Fguides","2.guides",[34,39,44,49,54,59,64,69,74,79,84,89,94,99],{"title":35,"path":36,"stem":37,"icon":38},"Use jscpd in CI","\u002Fguides\u002Fci","2.guides\u002F01.ci","i-lucide-github",{"title":40,"path":41,"stem":42,"icon":43},"Pre-commit hooks","\u002Fguides\u002Fpre-commit","2.guides\u002F02.pre-commit","i-lucide-git-commit",{"title":45,"path":46,"stem":47,"icon":48},"Fail only on new duplication","\u002Fguides\u002Fbaseline","2.guides\u002F03.baseline","i-lucide-git-compare",{"title":50,"path":51,"stem":52,"icon":53},"Monorepos","\u002Fguides\u002Fmonorepos","2.guides\u002F04.monorepos","i-lucide-folder-tree",{"title":55,"path":56,"stem":57,"icon":58},"Cross-format detection","\u002Fguides\u002Fcross-format","2.guides\u002F05.cross-format","i-lucide-layers",{"title":60,"path":61,"stem":62,"icon":63},"Agents","\u002Fguides\u002Fagents","2.guides\u002F06.agents","i-lucide-cpu",{"title":65,"path":66,"stem":67,"icon":68},"Editors","\u002Fguides\u002Feditors","2.guides\u002F07.editors","i-lucide-code",{"title":70,"path":71,"stem":72,"icon":73},"Duplication over git history","\u002Fguides\u002Fhistory","2.guides\u002F08.history","i-lucide-chart-no-axes-combined",{"title":75,"path":76,"stem":77,"icon":78},"Dashboard and health score","\u002Fguides\u002Fdashboard","2.guides\u002F09.dashboard","i-lucide-layout-dashboard",{"title":80,"path":81,"stem":82,"icon":83},"Dead code","\u002Fguides\u002Fdead-code","2.guides\u002F10.dead-code","i-lucide-ghost",{"title":85,"path":86,"stem":87,"icon":88},"Comparing two codebases","\u002Fguides\u002Fcompare","2.guides\u002F11.compare","i-lucide-git-compare-arrows",{"title":90,"path":91,"stem":92,"icon":93},"Semantic clones","\u002Fguides\u002Fsemantic-clones","2.guides\u002F12.semantic-clones","i-lucide-brain-circuit",{"title":95,"path":96,"stem":97,"icon":98},"Similar functions","\u002Fguides\u002Fsimilarity","2.guides\u002F13.similarity","i-lucide-list-tree",{"title":100,"path":101,"stem":102,"icon":103},"Boundaries","\u002Fguides\u002Fboundaries","2.guides\u002F14.boundaries","i-lucide-fence",{"title":105,"icon":6,"path":106,"stem":107,"children":108,"page":6},"Concepts","\u002Fconcepts","3.concepts",[109,114,119],{"title":110,"path":111,"stem":112,"icon":113},"Types of code clones","\u002Fconcepts\u002Fclone-types","3.concepts\u002F1.clone-types","i-lucide-copy",{"title":115,"path":116,"stem":117,"icon":118},"How detection works","\u002Fconcepts\u002Fhow-detection-works","3.concepts\u002F2.how-detection-works","i-lucide-scan-search",{"title":120,"path":121,"stem":122,"icon":123},"The health score","\u002Fconcepts\u002Fhealth-score","3.concepts\u002F3.health-score","i-lucide-heart-pulse",{"title":125,"icon":6,"path":126,"stem":127,"children":128,"page":6},"Reference","\u002Freference","4.reference",[129,134,139,144,181,186,190],{"title":130,"path":131,"stem":132,"icon":133},"CLI options","\u002Freference\u002Fcli","4.reference\u002F1.cli","i-lucide-terminal",{"title":135,"path":136,"stem":137,"icon":138},"The config file","\u002Freference\u002Fconfig-file","4.reference\u002F2.config-file","i-lucide-settings",{"title":140,"path":141,"stem":142,"icon":143},"Exit codes","\u002Freference\u002Fexit-codes","4.reference\u002F3.exit-codes","i-lucide-log-out",{"title":145,"icon":6,"path":146,"stem":147,"children":148},"Reporters","\u002Freference\u002Freporters","4.reference\u002F4.reporters\u002Findex",[149,151,156,161,166,171,176],{"title":145,"path":146,"stem":147,"icon":150},"i-lucide-file-chart-column",{"title":152,"path":153,"stem":154,"icon":155},"HTML reporter","\u002Freference\u002Freporters\u002Fhtml","4.reference\u002F4.reporters\u002F2.html","i-lucide-file-code",{"title":157,"path":158,"stem":159,"icon":160},"JSON reporter","\u002Freference\u002Freporters\u002Fjson","4.reference\u002F4.reporters\u002F3.json","i-lucide-braces",{"title":162,"path":163,"stem":164,"icon":165},"Badge reporter","\u002Freference\u002Freporters\u002Fbadge","4.reference\u002F4.reporters\u002F4.badge","i-lucide-award",{"title":167,"path":168,"stem":169,"icon":170},"SARIF reporter","\u002Freference\u002Freporters\u002Fsarif","4.reference\u002F4.reporters\u002F5.sarif","i-lucide-shield-check",{"title":172,"path":173,"stem":174,"icon":175},"CodeClimate reporter","\u002Freference\u002Freporters\u002Fcodeclimate","4.reference\u002F4.reporters\u002F6.codeclimate","i-lucide-flag-triangle-right",{"title":177,"path":178,"stem":179,"icon":180},"OpenMetrics reporter","\u002Freference\u002Freporters\u002Fopenmetrics","4.reference\u002F4.reporters\u002F7.openmetrics","i-lucide-activity",{"title":182,"path":183,"stem":184,"icon":185},"Supported formats","\u002Freference\u002Fsupported-formats","4.reference\u002F5.supported-formats","i-lucide-languages",{"title":187,"path":188,"stem":189,"icon":38},"GitHub Action","\u002Freference\u002Fgithub-action","4.reference\u002F6.github-action",{"title":191,"path":192,"stem":193,"icon":68},"Rust crates","\u002Freference\u002Frust-crates","4.reference\u002F7.rust-crates",{"title":195,"icon":6,"path":196,"stem":197,"children":198,"page":6},"Project","\u002Fproject","5.project",[199,204,209,214,239,244],{"title":200,"path":201,"stem":202,"icon":203},"Changelog","\u002Fproject\u002Fchangelog","5.project\u002F1.changelog","i-lucide-scroll-text",{"title":205,"path":206,"stem":207,"icon":208},"Migrating from v4 to v5","\u002Fproject\u002Fmigration","5.project\u002F2.migration","i-lucide-arrow-right-left",{"title":210,"path":211,"stem":212,"icon":213},"jscpd v4 (TypeScript)","\u002Fproject\u002Fv4","5.project\u002F3.v4","i-simple-icons-typescript",{"title":215,"icon":6,"path":216,"stem":217,"children":218},"Benchmarks","\u002Fproject\u002Fbenchmarks","5.project\u002F4.benchmarks\u002Findex",[219,221,226,230,235],{"title":215,"path":216,"stem":217,"icon":220},"i-lucide-gauge",{"title":222,"path":223,"stem":224,"icon":225},"Detection Speed","\u002Fproject\u002Fbenchmarks\u002Fdetection-speed","5.project\u002F4.benchmarks\u002F2.detection-speed","i-lucide-zap",{"title":227,"path":228,"stem":229,"icon":58},"Multi-Format Detection","\u002Fproject\u002Fbenchmarks\u002Fcross-format","5.project\u002F4.benchmarks\u002F3.cross-format",{"title":231,"path":232,"stem":233,"icon":234},"AI Token Efficiency","\u002Fproject\u002Fbenchmarks\u002Fai-token-efficiency","5.project\u002F4.benchmarks\u002F4.ai-token-efficiency","i-lucide-sparkles",{"title":236,"path":237,"stem":238,"icon":93},"Embedding Models","\u002Fproject\u002Fbenchmarks\u002Fembedding-models","5.project\u002F4.benchmarks\u002F5.embedding-models",{"title":240,"path":241,"stem":242,"icon":243},"Research","\u002Fproject\u002Fresearch","5.project\u002F5.research","i-lucide-graduation-cap",{"title":245,"path":246,"stem":247,"icon":248},"Articles","\u002Fproject\u002Farticles","5.project\u002F6.articles","i-lucide-newspaper",{"name":250,"url":251,"appearances":252,"latest":268},"spotify\u002Fportal-ai-plugins","https:\u002F\u002Fgithub.com\u002Fspotify\u002Fportal-ai-plugins",[253],{"date":254,"rank":255,"stars":256,"starsToday":257,"headSha":258,"sources":259,"lines":260,"clones":261,"duplicatedLines":262,"percentage":263,"codePercentage":264,"codeSources":265,"healthScore":266,"healthGrade":267},"2026-11-04",5,3086,91,"aa252eb21df5bbf32b0beb45f84a2c03341ccad8",52,3455,4,60,1.74,null,7,76.5,"B",{"date":254,"generatedAt":269,"name":250,"url":251,"description":270,"language":271,"stars":256,"starsToday":257,"defaultBranch":272,"headSha":258,"durationMs":273,"total":274,"formats":278,"topClones":307,"code":362,"health":370,"complexity":397,"deadCode":443},"2026-11-04T05:21:37.925Z","","TypeScript","main",956,{"sources":259,"lines":260,"tokens":275,"clones":261,"duplicatedLines":262,"duplicatedTokens":276,"percentage":263,"percentageTokens":277},31912,654,2.05,[279,284,289,293,297,301,305],{"format":280,"sources":281,"lines":282,"clones":261,"duplicatedLines":262,"percentage":283},"markdown",16,1248,4.81,{"format":285,"sources":286,"lines":287,"clones":288,"duplicatedLines":288,"percentage":288},"bash",18,944,0,{"format":290,"sources":291,"lines":292,"clones":288,"duplicatedLines":288,"percentage":288},"typescript",3,692,{"format":294,"sources":295,"lines":296,"clones":288,"duplicatedLines":288,"percentage":288},"json",10,529,{"format":298,"sources":299,"lines":300,"clones":288,"duplicatedLines":288,"percentage":288},"text",1,26,{"format":302,"sources":303,"lines":304,"clones":288,"duplicatedLines":288,"percentage":288},"markup",2,12,{"format":306,"sources":303,"lines":261,"clones":288,"duplicatedLines":288,"percentage":288},"yaml",[308,328,340,354],{"format":280,"lines":309,"tokens":310,"first":311,"others":314,"copies":303,"excerpt":317,"kind":327},19,186,{"name":312,"start":286,"end":313},"skills\u002Ffleetshift-check-shift\u002FSKILL.md",36,[315],{"name":316,"start":286,"end":313},"skills\u002Ffleetshift-troubleshoot-shift\u002FSKILL.md",{"lines":318,"total":309},[319,270,320,270,321,322,323,324,325,326],"  closed).","## Prerequisites","- The Portal CLI is authenticated: `npx @spotify\u002Fportal-cli auth show`.","  If it isn't, ask the user to run `npx @spotify\u002Fportal-cli auth login`.","  If `auth list` shows more than one Portal instance, confirm which one","  with the user and pass `--instance \u003Cname>` on every call.","- If a Portal MCP server is connected instead, the same actions are","  available as `fleetshift_\u003Caction>` tools (for example","docs",{"format":280,"lines":329,"tokens":330,"first":331,"others":333,"copies":303,"excerpt":338,"kind":327},15,173,{"name":312,"start":286,"end":332},32,[334],{"name":335,"start":336,"end":337},"skills\u002Ffleetshift-create-prs\u002FSKILL.md",14,28,{"lines":339,"total":329},[319,270,320,270,321,322,323,324,325,326],{"format":280,"lines":341,"tokens":342,"first":343,"others":345,"copies":303,"excerpt":350,"kind":327},13,172,{"name":312,"start":344,"end":332},20,[346],{"name":347,"start":348,"end":349},"skills\u002Ffleetshift-create-shift\u002FSKILL.md",21,33,{"lines":351,"total":341},[320,270,321,322,323,324,325,326,352,353],"  `fleetshift_list-shifts`). They take the same input, but have no","  `--dry-run`, so the confirmation steps below matter even more.",{"format":280,"lines":341,"tokens":355,"first":356,"others":357,"copies":303,"kind":327},123,{"name":335,"start":336,"end":300},[358],{"name":359,"start":360,"end":361},"skills\u002Ffleetshift-run-shift\u002FSKILL.md",68,80,{"sources":265,"lines":363,"tokens":364,"clones":288,"duplicatedLines":288,"duplicatedTokens":288,"percentage":288,"percentageTokens":288,"formats":365,"topClones":367,"generated":368},834,3574,[366],{"format":285,"sources":265,"lines":363,"clones":288,"duplicatedLines":288,"percentage":288},[],{"files":288,"minified":288,"sample":369},[],{"score":266,"grade":267,"size":371,"dimensions":374},{"lines":372,"files":295,"class":373},1526,"S",[375,383,390],{"id":376,"source":377,"value":288,"adjusted":303,"lines":288,"halfLife":378,"formats":379,"excluded":380,"weight":299,"score":382},"duplication","jscpd",8.5,[285,290],[302,298,381],"data",85.1,{"id":384,"source":377,"value":288,"adjusted":385,"lines":288,"halfLife":386,"coverage":387,"weight":388,"score":389},"dead-code",2.3,7.5,45.3,0.453,80.8,{"id":391,"source":377,"value":392,"adjusted":393,"lines":394,"halfLife":395,"weight":299,"score":396},"complexity",39.4,28.9,602,50,67,{"total":398,"mean":399,"files":400},432,43.2,[401,405,410,415,419,423,427,431,436,440],{"path":402,"complexity":403,"lines":394,"bytes":404},"plugins\u002Fshunt\u002Fevals\u002Ffixtures\u002Fwebsocket-handler.ts",292,48024,{"path":406,"complexity":407,"lines":408,"bytes":409},"plugins\u002Fshunt\u002Fevals\u002Frun.sh",35,321,11076,{"path":411,"complexity":412,"lines":413,"bytes":414},"plugins\u002Fshunt\u002Fevals\u002Ftransport-evals.sh",27,156,6154,{"path":416,"complexity":344,"lines":417,"bytes":418},"plugins\u002Fshunt\u002Fscripts\u002Flib\u002Faika.sh",166,6322,{"path":420,"complexity":341,"lines":421,"bytes":422},"plugins\u002Fshunt\u002Fscripts\u002Fbulk-read",58,1554,{"path":424,"complexity":304,"lines":425,"bytes":426},"plugins\u002Fshunt\u002Fhooks\u002Fcheck-bash-read",40,1596,{"path":428,"complexity":429,"lines":262,"bytes":430},"plugins\u002Fshunt\u002Fscripts\u002Fcode-write",11,1647,{"path":432,"complexity":433,"lines":434,"bytes":435},"plugins\u002Fshunt\u002Fevals\u002Ffixtures\u002Forder-service.test.ts",9,55,1669,{"path":437,"complexity":438,"lines":349,"bytes":439},"plugins\u002Fshunt\u002Fhooks\u002Fcheck-file-size",8,1264,{"path":441,"complexity":255,"lines":407,"bytes":442},"plugins\u002Fshunt\u002Fevals\u002Ffixtures\u002Fuser-service.ts",1051,{"percentage":288,"findings":288,"files":291,"byCategory":444,"largest":445},[],[],{"\u002Ftrending\u002Fspotify\u002Fportal-ai-plugins":447},{"views":288,"visits":288},1793775077612]