[{"data":1,"prerenderedAt":443},["ShallowReactive",2],{"navigation_docs":3,"trending-repo-twostraws\u002FSwiftUI-Agent-Skill":244},[4,29,99,119,189],{"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],{"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,"icon":6,"path":101,"stem":102,"children":103,"page":6},"Concepts","\u002Fconcepts","3.concepts",[104,109,114],{"title":105,"path":106,"stem":107,"icon":108},"Types of code clones","\u002Fconcepts\u002Fclone-types","3.concepts\u002F1.clone-types","i-lucide-copy",{"title":110,"path":111,"stem":112,"icon":113},"How detection works","\u002Fconcepts\u002Fhow-detection-works","3.concepts\u002F2.how-detection-works","i-lucide-scan-search",{"title":115,"path":116,"stem":117,"icon":118},"The health score","\u002Fconcepts\u002Fhealth-score","3.concepts\u002F3.health-score","i-lucide-heart-pulse",{"title":120,"icon":6,"path":121,"stem":122,"children":123,"page":6},"Reference","\u002Freference","4.reference",[124,129,134,139,176,181,185],{"title":125,"path":126,"stem":127,"icon":128},"CLI options","\u002Freference\u002Fcli","4.reference\u002F1.cli","i-lucide-terminal",{"title":130,"path":131,"stem":132,"icon":133},"The config file","\u002Freference\u002Fconfig-file","4.reference\u002F2.config-file","i-lucide-settings",{"title":135,"path":136,"stem":137,"icon":138},"Exit codes","\u002Freference\u002Fexit-codes","4.reference\u002F3.exit-codes","i-lucide-log-out",{"title":140,"icon":6,"path":141,"stem":142,"children":143},"Reporters","\u002Freference\u002Freporters","4.reference\u002F4.reporters\u002Findex",[144,146,151,156,161,166,171],{"title":140,"path":141,"stem":142,"icon":145},"i-lucide-file-chart-column",{"title":147,"path":148,"stem":149,"icon":150},"HTML reporter","\u002Freference\u002Freporters\u002Fhtml","4.reference\u002F4.reporters\u002F2.html","i-lucide-file-code",{"title":152,"path":153,"stem":154,"icon":155},"JSON reporter","\u002Freference\u002Freporters\u002Fjson","4.reference\u002F4.reporters\u002F3.json","i-lucide-braces",{"title":157,"path":158,"stem":159,"icon":160},"Badge reporter","\u002Freference\u002Freporters\u002Fbadge","4.reference\u002F4.reporters\u002F4.badge","i-lucide-award",{"title":162,"path":163,"stem":164,"icon":165},"SARIF reporter","\u002Freference\u002Freporters\u002Fsarif","4.reference\u002F4.reporters\u002F5.sarif","i-lucide-shield-check",{"title":167,"path":168,"stem":169,"icon":170},"CodeClimate reporter","\u002Freference\u002Freporters\u002Fcodeclimate","4.reference\u002F4.reporters\u002F6.codeclimate","i-lucide-flag-triangle-right",{"title":172,"path":173,"stem":174,"icon":175},"OpenMetrics reporter","\u002Freference\u002Freporters\u002Fopenmetrics","4.reference\u002F4.reporters\u002F7.openmetrics","i-lucide-activity",{"title":177,"path":178,"stem":179,"icon":180},"Supported formats","\u002Freference\u002Fsupported-formats","4.reference\u002F5.supported-formats","i-lucide-languages",{"title":182,"path":183,"stem":184,"icon":38},"GitHub Action","\u002Freference\u002Fgithub-action","4.reference\u002F6.github-action",{"title":186,"path":187,"stem":188,"icon":68},"Rust crates","\u002Freference\u002Frust-crates","4.reference\u002F7.rust-crates",{"title":190,"icon":6,"path":191,"stem":192,"children":193,"page":6},"Project","\u002Fproject","5.project",[194,199,204,209,234,239],{"title":195,"path":196,"stem":197,"icon":198},"Changelog","\u002Fproject\u002Fchangelog","5.project\u002F1.changelog","i-lucide-scroll-text",{"title":200,"path":201,"stem":202,"icon":203},"Migrating from v4 to v5","\u002Fproject\u002Fmigration","5.project\u002F2.migration","i-lucide-arrow-right-left",{"title":205,"path":206,"stem":207,"icon":208},"jscpd v4 (TypeScript)","\u002Fproject\u002Fv4","5.project\u002F3.v4","i-simple-icons-typescript",{"title":210,"icon":6,"path":211,"stem":212,"children":213},"Benchmarks","\u002Fproject\u002Fbenchmarks","5.project\u002F4.benchmarks\u002Findex",[214,216,221,225,230],{"title":210,"path":211,"stem":212,"icon":215},"i-lucide-gauge",{"title":217,"path":218,"stem":219,"icon":220},"Detection Speed","\u002Fproject\u002Fbenchmarks\u002Fdetection-speed","5.project\u002F4.benchmarks\u002F2.detection-speed","i-lucide-zap",{"title":222,"path":223,"stem":224,"icon":58},"Multi-Format Detection","\u002Fproject\u002Fbenchmarks\u002Fcross-format","5.project\u002F4.benchmarks\u002F3.cross-format",{"title":226,"path":227,"stem":228,"icon":229},"AI Token Efficiency","\u002Fproject\u002Fbenchmarks\u002Fai-token-efficiency","5.project\u002F4.benchmarks\u002F4.ai-token-efficiency","i-lucide-sparkles",{"title":231,"path":232,"stem":233,"icon":93},"Embedding Models","\u002Fproject\u002Fbenchmarks\u002Fembedding-models","5.project\u002F4.benchmarks\u002F5.embedding-models",{"title":235,"path":236,"stem":237,"icon":238},"Research","\u002Fproject\u002Fresearch","5.project\u002F5.research","i-lucide-graduation-cap",{"title":240,"path":241,"stem":242,"icon":243},"Articles","\u002Fproject\u002Farticles","5.project\u002F6.articles","i-lucide-newspaper",{"name":245,"url":246,"appearances":247,"latest":263},"twostraws\u002FSwiftUI-Agent-Skill","https:\u002F\u002Fgithub.com\u002Ftwostraws\u002FSwiftUI-Agent-Skill",[248],{"date":249,"rank":250,"stars":251,"starsToday":252,"headSha":253,"sources":254,"lines":255,"clones":256,"duplicatedLines":257,"percentage":258,"codePercentage":259,"codeSources":260,"healthScore":261,"healthGrade":262},"2026-10-10",7,5552,65,"f9800713b24580bc444931949aad4519128605e8",35,2068,3,109,5.27,null,10,81.8,"B",{"date":249,"generatedAt":264,"name":245,"url":246,"description":265,"language":259,"stars":251,"starsToday":252,"defaultBranch":266,"headSha":253,"durationMs":267,"total":268,"formats":272,"topClones":303,"code":363,"health":372,"complexity":395,"deadCode":259},"2026-10-10T05:30:09.856Z","SwiftUI agent skill for Claude Code, Codex, and other AI tools.","main",1035,{"sources":254,"lines":255,"tokens":269,"clones":256,"duplicatedLines":257,"duplicatedTokens":270,"percentage":258,"percentageTokens":271},20780,637,3.07,[273,280,287,292,295,298,301],{"format":274,"sources":275,"lines":276,"clones":277,"duplicatedLines":278,"percentage":279},"markdown",16,990,2,89,8.99,{"format":281,"sources":282,"lines":283,"clones":284,"duplicatedLines":285,"percentage":286},"swift",5,113,1,20,17.7,{"format":288,"sources":289,"lines":290,"clones":291,"duplicatedLines":291,"percentage":291},"bash",9,694,0,{"format":293,"sources":284,"lines":294,"clones":291,"duplicatedLines":291,"percentage":291},"perl",168,{"format":296,"sources":277,"lines":297,"clones":291,"duplicatedLines":291,"percentage":291},"markup",75,{"format":299,"sources":284,"lines":300,"clones":291,"duplicatedLines":291,"percentage":291},"json",21,{"format":302,"sources":284,"lines":250,"clones":291,"duplicatedLines":291,"percentage":291},"yaml",[304,327,347],{"format":274,"lines":305,"tokens":306,"first":307,"others":311,"copies":277,"excerpt":316,"kind":326},82,452,{"name":308,"start":309,"end":310},"swiftui-pro\u002FSKILL.md:markdown",30,111,[312],{"name":313,"start":314,"end":315},"swiftui-pro\u002Fskills\u002Fswiftui-pro\u002FSKILL.md:markdown",31,112,{"lines":317,"total":305},[318,319,319,320,319,321,322,323,324,325],"Keep `references\u002Fperformance-plus.md` out of routine reviews. Load it for a requested deep performance review; its more involved changes can also help investig…","","## Core Instructions","- iOS 27 exists, and is the default deployment target for new apps.","- Xcode 27.1 and the corresponding 27.1 platform releases are available. Do not dismiss their APIs as speculative.","- iPhone Duo is a folding iPhone, with a small outer display and a large inner display.","- Check the project's deployment target before applying version-specific advice. Use newer runtime APIs only when the target supports them or within an appropr…","- Target Swift 6.4 or later, using modern Swift concurrency.","docs",{"format":281,"lines":328,"tokens":283,"first":329,"others":333,"copies":277,"excerpt":338,"kind":326},33,{"name":330,"start":331,"end":332},"swiftui-pro\u002FSKILL.md:swift",63,95,[334],{"name":335,"start":336,"end":337},"swiftui-pro\u002Fskills\u002Fswiftui-pro\u002FSKILL.md:swift",64,96,{"lines":339,"total":328},[340,341,319,342,343,344,319,345,319,346],"\u002F\u002F Before","Text(\"Hello\").foregroundColor(.red)","\u002F\u002F After","Text(\"Hello\").foregroundStyle(.red)","```","**Line 24: Give the button a descriptive label so VoiceOver explains its action.**","```swift",{"format":274,"lines":250,"tokens":348,"first":349,"others":350,"copies":277,"excerpt":354,"excerptSecond":360,"kind":326},72,{"name":308,"start":260,"end":275},[351],{"name":313,"start":352,"end":353},11,17,{"lines":355,"total":250},[356,319,357,319,358,319,359],"Review Swift and SwiftUI code for correctness, modern API usage, and adherence to project conventions. Report only genuine problems – do not nitpick or invent …","Include deprecated API in review findings. During feature work or bug fixes, complete the requested change and suggest unrelated modernization separately; do n…","Review process:","1. Check for deprecated API using `references\u002Fapi.md`.",{"lines":361,"total":250},[356,319,357,319,358,319,362],"1. Check for deprecated API using `${CLAUDE_SKILL_DIR}\u002Freferences\u002Fapi.md`.",{"sources":260,"lines":364,"tokens":365,"clones":291,"duplicatedLines":291,"duplicatedTokens":291,"percentage":291,"percentageTokens":291,"formats":366,"topClones":369,"generated":370},862,3205,[367,368],{"format":288,"sources":289,"lines":290,"clones":291,"duplicatedLines":291,"percentage":291},{"format":293,"sources":284,"lines":294,"clones":291,"duplicatedLines":291,"percentage":291},[],{"files":291,"minified":291,"sample":371},[],{"score":261,"grade":262,"size":373,"dimensions":375,"skipped":391},{"lines":364,"files":260,"class":374},"XS",[376,386],{"id":377,"source":378,"value":291,"adjusted":379,"lines":291,"halfLife":380,"formats":381,"excluded":382,"weight":284,"score":385},"duplication","jscpd",2.4,8.5,[288,293],[296,383,384],"text","data",81.9,{"id":387,"source":378,"value":291,"adjusted":388,"lines":291,"halfLife":389,"weight":284,"score":390},"complexity",14.6,50,81.7,[392],{"id":393,"reason":394},"dead-code","no JavaScript, TypeScript, Python or compiler-checked Rust files",{"total":396,"mean":397,"files":398},84,8.4,[399,403,408,412,417,422,426,430,435,439],{"path":400,"complexity":401,"lines":294,"bytes":402},".git\u002Fhooks\u002Ffsmonitor-watchman.sample",19,4611,{"path":404,"complexity":405,"lines":406,"bytes":407},".git\u002Fhooks\u002Fpre-rebase.sample",14,169,4898,{"path":409,"complexity":405,"lines":410,"bytes":411},".git\u002Fhooks\u002Fsendemail-validate.sample",77,2308,{"path":413,"complexity":414,"lines":415,"bytes":416},".git\u002Fhooks\u002Fupdate.sample",13,128,3650,{"path":418,"complexity":419,"lines":420,"bytes":421},".git\u002Fhooks\u002Fpush-to-checkout.sample",6,78,2783,{"path":423,"complexity":282,"lines":424,"bytes":425},".git\u002Fhooks\u002Fpre-commit.sample",49,1649,{"path":427,"complexity":282,"lines":428,"bytes":429},".git\u002Fhooks\u002Fpre-push.sample",53,1374,{"path":431,"complexity":432,"lines":433,"bytes":434},".git\u002Fhooks\u002Fpre-receive.sample",4,24,544,{"path":436,"complexity":256,"lines":437,"bytes":438},".git\u002Fhooks\u002Fcommit-msg.sample",74,1972,{"path":440,"complexity":284,"lines":441,"bytes":442},".git\u002Fhooks\u002Fprepare-commit-msg.sample",42,1492,1791615327409]