[{"data":1,"prerenderedAt":685},["ShallowReactive",2],{"navigation_docs":3,"trending-repo-Usagi-org\u002Fai-goofish-monitor":249,"page-views-\u002Ftrending\u002FUsagi-org\u002Fai-goofish-monitor":683},[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":267},"Usagi-org\u002Fai-goofish-monitor","https:\u002F\u002Fgithub.com\u002FUsagi-org\u002Fai-goofish-monitor",[253],{"date":254,"rank":255,"stars":256,"starsToday":257,"headSha":258,"sources":259,"lines":260,"clones":261,"duplicatedLines":262,"percentage":263,"codePercentage":264,"codeSources":257,"healthScore":265,"healthGrade":266},"2026-11-04",6,16699,228,"77f8d75869acd65f9dba72731b95c7c49ea67bdf",317,32284,40,498,1.54,1,78.8,"B",{"date":254,"generatedAt":268,"name":250,"url":251,"description":269,"language":270,"stars":256,"starsToday":257,"defaultBranch":271,"headSha":258,"durationMs":272,"total":273,"formats":277,"topClones":329,"code":466,"health":564,"complexity":600,"deadCode":645},"2026-11-04T05:21:37.925Z","基于 Playwright 和AI实现的闲鱼多任务实时\u002F定时监控与智能分析系统，配备了功能完善的后台管理UI。帮助用户从闲鱼海量商品中，找到心仪产品。","Python","master",1409,{"sources":259,"lines":260,"tokens":274,"clones":261,"duplicatedLines":262,"duplicatedTokens":275,"percentage":263,"percentageTokens":276},178930,2831,1.58,[278,285,292,298,303,309,314,319,322,326],{"format":279,"sources":280,"lines":281,"clones":282,"duplicatedLines":283,"percentage":284},"python",103,15171,28,377,2.49,{"format":286,"sources":287,"lines":288,"clones":289,"duplicatedLines":290,"percentage":291},"typescript",87,6020,5,53,0.88,{"format":293,"sources":294,"lines":295,"clones":296,"duplicatedLines":297,"percentage":264},"html",31,2408,3,24,{"format":299,"sources":296,"lines":300,"clones":301,"duplicatedLines":297,"percentage":302},"yaml",222,2,10.81,{"format":304,"sources":305,"lines":306,"clones":264,"duplicatedLines":307,"percentage":308},"markdown",8,949,7,0.74,{"format":310,"sources":255,"lines":311,"clones":264,"duplicatedLines":312,"percentage":313},"bash",648,13,2.01,{"format":315,"sources":316,"lines":317,"clones":318,"duplicatedLines":318,"percentage":318},"vue",54,5645,0,{"format":320,"sources":296,"lines":321,"clones":318,"duplicatedLines":318,"percentage":318},"javascript",459,{"format":323,"sources":324,"lines":325,"clones":318,"duplicatedLines":318,"percentage":318},"json",9,253,{"format":327,"sources":296,"lines":328,"clones":318,"duplicatedLines":318,"percentage":318},"css",175,[330,352,372,400,409,420,429,439,447,457],{"format":279,"lines":331,"tokens":332,"first":333,"others":337,"copies":301,"excerpt":341,"kind":351},32,148,{"name":334,"start":335,"end":336},"src\u002Fdomain\u002Fmodels\u002Ftask.py",183,214,[338],{"name":334,"start":339,"end":340},251,282,{"lines":342,"total":331},[343,344,345,346,347,348,344,349,350,347],"@model_validator(mode=\"before\")","@classmethod","def normalize_legacy_keyword_payload(cls, values):","    return _normalize_payload_keywords(values)","","@field_validator(\"min_price\", \"max_price\", mode=\"before\")","def convert_price_to_str(cls, value):","    return _normalize_price_value(value)","code",{"format":279,"lines":307,"tokens":353,"first":354,"others":357,"copies":296,"excerpt":363,"kind":351},64,{"name":334,"start":355,"end":356},125,131,[358,360],{"name":334,"start":328,"end":359},181,{"name":334,"start":361,"end":362},306,312,{"lines":364,"total":307},[365,366,367,368,369,370,371],"account_state_file: Optional[str] = None","account_strategy: Literal[\"auto\", \"fixed\", \"rotate\"] = \"auto\"","free_shipping: bool = True","new_publish_option: Optional[str] = None","region: Optional[str] = None","decision_mode: Literal[\"ai\", \"keyword\"] = \"ai\"","keyword_rules: List[str] = Field(default_factory=list)",{"format":279,"lines":373,"tokens":374,"first":375,"others":379,"copies":296,"excerpt":386,"excerptSecond":396,"kind":399},10,60,{"name":376,"start":377,"end":378},"tests\u002Funit\u002Ftest_ai_handler_analysis.py",56,65,[380,383],{"name":376,"start":381,"end":382},101,110,{"name":376,"start":384,"end":385},227,236,{"lines":387,"total":373},[388,347,389,390,391,392,347,393,394,395],"    )","monkeypatch.setattr(ai_handler, \"client\", _build_fake_client(fake_create))","monkeypatch.setattr(ai_handler, \"MODEL_NAME\", \"fake-model\")","monkeypatch.setattr(ai_handler, \"ENABLE_RESPONSE_FORMAT\", True)","monkeypatch.setattr(app_config, \"ENABLE_RESPONSE_FORMAT\", True)","result = asyncio.run(","    ai_handler.get_ai_analysis(","        {\"商品信息\": {\"商品ID\": \"2\", \"商品标题\": \"测试商品2\"}},",{"lines":397,"total":373},[388,347,389,390,391,392,347,393,394,398],"        {\"商品信息\": {\"商品ID\": \"3\", \"商品标题\": \"测试商品3\"}},","tests",{"format":310,"lines":312,"tokens":401,"first":402,"others":405,"copies":301,"kind":351},119,{"name":403,"start":404,"end":332},"start.sh",136,[406],{"name":403,"start":407,"end":408},201,213,{"format":279,"lines":410,"tokens":411,"first":412,"others":416,"copies":301,"kind":351},18,118,{"name":413,"start":414,"end":415},"src\u002Finfrastructure\u002Fpersistence\u002Fsqlite_bootstrap.py",264,281,[417],{"name":418,"start":419,"end":290},"src\u002Fservices\u002Fprice_history_service.py",36,{"format":279,"lines":421,"tokens":422,"first":423,"others":425,"copies":301,"kind":351},17,111,{"name":334,"start":424,"end":300},206,[426],{"name":334,"start":427,"end":428},342,358,{"format":279,"lines":430,"tokens":431,"first":432,"others":435,"copies":301,"kind":351},20,109,{"name":334,"start":433,"end":434},176,195,[436],{"name":334,"start":437,"end":438},307,326,{"format":286,"lines":440,"tokens":441,"first":442,"others":444,"copies":301,"kind":351},19,95,{"name":443,"start":301,"end":430},"web-ui\u002Fsrc\u002Fcomponents\u002Fui\u002Fdialog\u002FDialogContent.vue",[445],{"name":446,"start":301,"end":430},"web-ui\u002Fsrc\u002Fcomponents\u002Fui\u002Fdialog\u002FDialogScrollContent.vue",{"format":279,"lines":421,"tokens":448,"first":449,"others":453,"copies":301,"kind":399},84,{"name":450,"start":451,"end":452},"tests\u002Funit\u002Ftest_ai_client.py",123,139,[454],{"name":376,"start":455,"end":456},126,143,{"format":279,"lines":458,"tokens":459,"first":460,"others":462,"copies":301,"kind":399},22,82,{"name":376,"start":461,"end":382},89,[463],{"name":376,"start":464,"end":465},184,205,{"sources":257,"lines":467,"tokens":468,"clones":430,"duplicatedLines":385,"duplicatedTokens":469,"percentage":264,"percentageTokens":470,"formats":471,"topClones":490,"generated":562},23602,134575,1582,1.18,[472,478,482,483,486,487,488],{"format":279,"sources":473,"lines":474,"clones":475,"duplicatedLines":476,"percentage":477},57,9919,11,146,1.47,{"format":286,"sources":479,"lines":480,"clones":289,"duplicatedLines":290,"percentage":481},79,4556,1.16,{"format":293,"sources":294,"lines":295,"clones":296,"duplicatedLines":297,"percentage":264},{"format":310,"sources":301,"lines":484,"clones":264,"duplicatedLines":312,"percentage":485},570,2.28,{"format":315,"sources":316,"lines":317,"clones":318,"duplicatedLines":318,"percentage":318},{"format":320,"sources":296,"lines":321,"clones":318,"duplicatedLines":318,"percentage":318},{"format":327,"sources":301,"lines":489,"clones":318,"duplicatedLines":318,"percentage":318},45,[491,497,504,520,524,528,532,536,545,552],{"format":279,"lines":331,"tokens":332,"first":492,"others":493,"copies":301,"excerpt":495,"kind":351},{"name":334,"start":335,"end":336},[494],{"name":334,"start":339,"end":340},{"lines":496,"total":331},[343,344,345,346,347,348,344,349,350,347],{"format":279,"lines":307,"tokens":353,"first":498,"others":499,"copies":296,"excerpt":502,"kind":351},{"name":334,"start":355,"end":356},[500,501],{"name":334,"start":328,"end":359},{"name":334,"start":361,"end":362},{"lines":503,"total":307},[365,366,367,368,369,370,371],{"format":310,"lines":312,"tokens":401,"first":505,"others":506,"copies":301,"excerpt":508,"kind":351},{"name":403,"start":404,"end":332},[507],{"name":403,"start":407,"end":408},{"lines":509,"total":312},[510,511,512,513,514,515,516,517,518,519],"Linux (Debian\u002FUbuntu) 解决办法:","1) 安装 Python 与 pip:","   sudo apt-get update","   sudo apt-get install -y python3 python3-pip python3-venv","2) 安装 Node.js 与 npm (LTS):","   curl -fsSL https:\u002F\u002Fdeb.nodesource.com\u002Fsetup_lts.x | sudo -E bash -","   sudo apt-get install -y nodejs","3) 安装 Playwright:","   python3 -m pip install playwright","   python3 -m playwright install chromium",{"format":279,"lines":410,"tokens":411,"first":521,"others":522,"copies":301,"kind":351},{"name":413,"start":414,"end":415},[523],{"name":418,"start":419,"end":290},{"format":279,"lines":421,"tokens":422,"first":525,"others":526,"copies":301,"kind":351},{"name":334,"start":424,"end":300},[527],{"name":334,"start":427,"end":428},{"format":279,"lines":430,"tokens":431,"first":529,"others":530,"copies":301,"kind":351},{"name":334,"start":433,"end":434},[531],{"name":334,"start":437,"end":438},{"format":286,"lines":440,"tokens":441,"first":533,"others":534,"copies":301,"kind":351},{"name":443,"start":301,"end":430},[535],{"name":446,"start":301,"end":430},{"format":279,"lines":324,"tokens":537,"first":538,"others":541,"copies":301,"kind":351},81,{"name":413,"start":539,"end":540},196,204,[542],{"name":543,"start":544,"end":328},"src\u002Fservices\u002Fresult_storage_service.py",167,{"format":279,"lines":324,"tokens":546,"first":547,"others":548,"copies":301,"kind":351},77,{"name":413,"start":257,"end":385},[549],{"name":418,"start":550,"end":551},129,137,{"format":279,"lines":553,"tokens":554,"first":555,"others":559,"copies":301,"kind":351},14,71,{"name":556,"start":557,"end":558},"src\u002Fapi\u002Froutes\u002Flogs.py",177,190,[560],{"name":556,"start":558,"end":561},203,{"files":318,"minified":318,"sample":563},[],{"score":265,"grade":266,"size":565,"dimensions":568},{"lines":566,"files":407,"class":567},25674,"M",[569,584,593],{"id":570,"source":571,"value":572,"adjusted":573,"lines":574,"halfLife":575,"formats":576,"excluded":579,"weight":264,"score":583},"duplication","jscpd",1.7,1.9,443,8.5,[279,315,286,310,320,577,578],"docker","nginx",[580,581,582],"markup","text","data",86,{"id":585,"source":571,"value":586,"adjusted":587,"lines":588,"halfLife":589,"coverage":590,"weight":591,"score":592},"dead-code",2.1,2.2,536,7.5,99.4,0.994,81.8,{"id":594,"source":571,"value":595,"adjusted":596,"lines":597,"halfLife":598,"weight":264,"score":599},"complexity",26.6,26.1,6817,50,69.6,{"total":601,"mean":602,"files":603},3360,16.7,[604,609,613,618,622,627,632,634,637,641],{"path":605,"complexity":606,"lines":607,"bytes":608},"src\u002Fscraper.py",220,1344,59767,{"path":418,"complexity":610,"lines":611,"bytes":612},105,404,13873,{"path":614,"complexity":615,"lines":616,"bytes":617},"src\u002Fai_handler.py",97,479,18295,{"path":619,"complexity":448,"lines":620,"bytes":621},"src\u002Fservices\u002Fnotification_config_service.py",425,15244,{"path":623,"complexity":624,"lines":625,"bytes":626},"src\u002Ffailure_guard.py",83,357,10788,{"path":628,"complexity":629,"lines":630,"bytes":631},"web-ui\u002Fsrc\u002Fcomposables\u002FuseResults.ts",78,316,8949,{"path":334,"complexity":546,"lines":428,"bytes":633},11960,{"path":543,"complexity":546,"lines":635,"bytes":636},475,15480,{"path":638,"complexity":378,"lines":639,"bytes":640},"src\u002Fservices\u002Fdashboard_payloads.py",296,9840,{"path":642,"complexity":643,"lines":606,"bytes":644},"spider_v2.py",63,9406,{"percentage":586,"findings":410,"files":646,"byCategory":647,"largest":657},244,[648,651,653,655],{"category":649,"count":650},"unused-file",4,{"category":652,"count":301},"unused-export",{"category":654,"count":264},"unused-symbol",{"category":656,"count":475},"unused-import",[658,661,664,666,669,671,674,677,679,681],{"category":649,"path":659,"name":347,"line":264,"lines":660},"chrome-extension\u002Fbackground.js",301,{"category":649,"path":662,"name":347,"line":264,"lines":663},"src\u002Finfrastructure\u002Fpersistence\u002Fjson_task_repository.py",72,{"category":649,"path":665,"name":347,"line":264,"lines":643},"chrome-extension\u002Fpopup.js",{"category":654,"path":638,"name":667,"line":550,"lines":668},"_collect_record_metrics",41,{"category":649,"path":670,"name":347,"line":264,"lines":668},"web-ui\u002Fsrc\u002Fcomponents\u002FHelloWorld.vue",{"category":652,"path":418,"name":672,"line":673,"lines":289},"build_price_history_path",29,{"category":656,"path":675,"name":676,"line":297,"lines":301},"src\u002Fapi\u002Froutes\u002Fsettings.py","is_responses_api_unsupported_error",{"category":656,"path":614,"name":678,"line":373,"lines":264},"parse_qsl",{"category":656,"path":614,"name":680,"line":373,"lines":264},"urlencode",{"category":656,"path":614,"name":682,"line":373,"lines":264},"urlparse",{"\u002Ftrending\u002FUsagi-org\u002Fai-goofish-monitor":684},{"views":318,"visits":318},1793775078512]