[{"data":1,"prerenderedAt":1046},["ShallowReactive",2],{"navigation_docs":3,"-monorepos-shared-libraries":357,"-monorepos-shared-libraries-surround":1043},[4,22,40,53,78,107,132,153,167,176,347],{"title":5,"path":6,"stem":7,"children":8,"page":21},"Introduction","\u002Fintroduction","1.introduction",[9,13,17],{"title":10,"path":11,"stem":12},"Why the-i18n-kit","\u002Fintroduction\u002Fwhy","1.introduction\u002F1.why",{"title":14,"path":15,"stem":16},"Architecture","\u002Fintroduction\u002Farchitecture","1.introduction\u002F2.architecture",{"title":18,"path":19,"stem":20},"Built for Agents","\u002Fintroduction\u002Fbuilt-for-agents","1.introduction\u002F3.built-for-agents",false,{"title":23,"icon":24,"path":25,"stem":26,"children":27,"page":21},"ESLint Plugin","i-lucide-shield-check","\u002Feslint-plugin","10.eslint-plugin",[28,32,36],{"title":29,"path":30,"stem":31},"Install and Presets","\u002Feslint-plugin\u002Finstall","10.eslint-plugin\u002F1.install",{"title":33,"path":34,"stem":35},"The Rules","\u002Feslint-plugin\u002Frules","10.eslint-plugin\u002F2.rules",{"title":37,"path":38,"stem":39},"Layer-Aware Missing Keys","\u002Feslint-plugin\u002Flayer-aware","10.eslint-plugin\u002F3.layer-aware",{"title":41,"path":42,"stem":43,"children":44,"page":21},"Getting Started","\u002Fgetting-started","2.getting-started",[45,49],{"title":46,"path":47,"stem":48},"Set Up the MCP Server","\u002Fgetting-started\u002Fagent-setup","2.getting-started\u002F1.agent-setup",{"title":50,"path":51,"stem":52},"From an Unconfigured Repository to a Gated CI Job","\u002Fgetting-started\u002Fcold-start","2.getting-started\u002F2.cold-start",{"title":54,"path":55,"stem":56,"children":57,"page":21},"Monorepos","\u002Fmonorepos","3.monorepos",[58,62,66,70,74],{"title":59,"path":60,"stem":61},"Layers","\u002Fmonorepos\u002Flayers","3.monorepos\u002F1.layers",{"title":63,"path":64,"stem":65},"The Consumer Graph","\u002Fmonorepos\u002Fconsumer-graph","3.monorepos\u002F2.consumer-graph",{"title":67,"path":68,"stem":69},"The Shared Library Scenario","\u002Fmonorepos\u002Fshared-libraries","3.monorepos\u002F3.shared-libraries",{"title":71,"path":72,"stem":73},"Duplicates and Divergence","\u002Fmonorepos\u002Fduplicates-and-divergence","3.monorepos\u002F4.duplicates-and-divergence",{"title":75,"path":76,"stem":77},"Misplaced Usages","\u002Fmonorepos\u002Fmisplaced-usages","3.monorepos\u002F5.misplaced-usages",{"title":79,"path":80,"stem":81,"children":82,"page":21},"Frameworks","\u002Fframeworks","4.frameworks",[83,87,91,95,99,103],{"title":84,"path":85,"stem":86},"Detection","\u002Fframeworks\u002Fdetection","4.frameworks\u002F1.detection",{"title":88,"path":89,"stem":90},"Nuxt","\u002Fframeworks\u002Fnuxt","4.frameworks\u002F2.nuxt",{"title":92,"path":93,"stem":94},"Laravel","\u002Fframeworks\u002Flaravel","4.frameworks\u002F3.laravel",{"title":96,"path":97,"stem":98},"Vue","\u002Fframeworks\u002Fvue","4.frameworks\u002F4.vue",{"title":100,"path":101,"stem":102},"React \u002F Next.js","\u002Fframeworks\u002Freact-next","4.frameworks\u002F5.react-next",{"title":104,"path":105,"stem":106},"Generic","\u002Fframeworks\u002Fgeneric","4.frameworks\u002F6.generic",{"title":108,"path":109,"stem":110,"children":111,"page":21},"Configuration","\u002Fconfiguration","5.configuration",[112,116,120,124,128],{"title":113,"path":114,"stem":115},"Where Configuration Lives","\u002Fconfiguration\u002Fwhere-config-lives","5.configuration\u002F1.where-config-lives",{"title":117,"path":118,"stem":119},"Precedence and Conflicts","\u002Fconfiguration\u002Fprecedence","5.configuration\u002F2.precedence",{"title":121,"path":122,"stem":123},"Declared vs. Derived Configuration","\u002Fconfiguration\u002Fdeclared-vs-derived","5.configuration\u002F3.declared-vs-derived",{"title":125,"path":126,"stem":127},"Configuration Fields","\u002Fconfiguration\u002Freference","5.configuration\u002F4.reference",{"title":129,"path":130,"stem":131},"Referring to Locales","\u002Fconfiguration\u002Flocale-refs","5.configuration\u002F5.locale-refs",{"title":133,"path":134,"stem":135,"children":136,"page":21},"Nuxt Module","\u002Fnuxt-module","6.nuxt-module",[137,141,145,149],{"title":138,"path":139,"stem":140},"Install and Setup","\u002Fnuxt-module\u002Finstall","6.nuxt-module\u002F1.install",{"title":142,"path":143,"stem":144},"What It Publishes","\u002Fnuxt-module\u002Fwhat-it-publishes","6.nuxt-module\u002F2.what-it-publishes",{"title":146,"path":147,"stem":148},"What It Validates","\u002Fnuxt-module\u002Fvalidation","6.nuxt-module\u002F3.validation",{"title":150,"path":151,"stem":152},"Options and Limits","\u002Fnuxt-module\u002Foptions-and-limits","6.nuxt-module\u002F4.options-and-limits",{"title":154,"icon":155,"path":156,"stem":157,"children":158,"page":21},"CI\u002FCD","i-lucide-git-pull-request","\u002Fci-cd","7.ci-cd",[159,163],{"title":160,"path":161,"stem":162},"GitHub Actions","\u002Fci-cd\u002Fgithub-actions","7.ci-cd\u002F1.github-actions",{"title":164,"path":165,"stem":166},"GitLab CI","\u002Fci-cd\u002Fgitlab-ci","7.ci-cd\u002F2.gitlab-ci",{"title":168,"path":169,"stem":170,"children":171,"page":21},"Concepts","\u002Fconcepts","8.concepts",[172],{"title":173,"path":174,"stem":175},"Translation Modes","\u002Fconcepts\u002Ftranslation-modes","8.concepts\u002F1.translation-modes",{"title":177,"path":178,"stem":179,"children":180,"page":-1},"Reference","\u002Freference","9.reference",[181,183,261,339,343],{"title":177,"path":178,"stem":182},"9.reference\u002Findex",{"title":184,"path":185,"stem":186,"children":187,"page":-1},"CLI Commands","\u002Freference\u002Fcli","9.reference\u002F1.cli\u002Findex",[188,189,193,197,201,205,209,213,217,221,225,229,233,237,241,245,249,253,257],{"title":184,"path":185,"stem":186},{"title":190,"path":191,"stem":192},"add","\u002Freference\u002Fcli\u002Fadd","9.reference\u002F1.cli\u002Fadd",{"title":194,"path":195,"stem":196},"check","\u002Freference\u002Fcli\u002Fcheck","9.reference\u002F1.cli\u002Fcheck",{"title":198,"path":199,"stem":200},"find-duplicates","\u002Freference\u002Fcli\u002Ffind-duplicates","9.reference\u002F1.cli\u002Ffind-duplicates",{"title":202,"path":203,"stem":204},"get","\u002Freference\u002Fcli\u002Fget","9.reference\u002F1.cli\u002Fget",{"title":206,"path":207,"stem":208},"init","\u002Freference\u002Fcli\u002Finit","9.reference\u002F1.cli\u002Finit",{"title":210,"path":211,"stem":212},"missing","\u002Freference\u002Fcli\u002Fmissing","9.reference\u002F1.cli\u002Fmissing",{"title":214,"path":215,"stem":216},"move","\u002Freference\u002Fcli\u002Fmove","9.reference\u002F1.cli\u002Fmove",{"title":218,"path":219,"stem":220},"remove","\u002Freference\u002Fcli\u002Fremove","9.reference\u002F1.cli\u002Fremove",{"title":222,"path":223,"stem":224},"remove-orphans","\u002Freference\u002Fcli\u002Fremove-orphans","9.reference\u002F1.cli\u002Fremove-orphans",{"title":226,"path":227,"stem":228},"rename","\u002Freference\u002Fcli\u002Frename","9.reference\u002F1.cli\u002Frename",{"title":230,"path":231,"stem":232},"scaffold","\u002Freference\u002Fcli\u002Fscaffold","9.reference\u002F1.cli\u002Fscaffold",{"title":234,"path":235,"stem":236},"scan","\u002Freference\u002Fcli\u002Fscan","9.reference\u002F1.cli\u002Fscan",{"title":238,"path":239,"stem":240},"search","\u002Freference\u002Fcli\u002Fsearch","9.reference\u002F1.cli\u002Fsearch",{"title":242,"path":243,"stem":244},"status","\u002Freference\u002Fcli\u002Fstatus","9.reference\u002F1.cli\u002Fstatus",{"title":246,"path":247,"stem":248},"translate","\u002Freference\u002Fcli\u002Ftranslate","9.reference\u002F1.cli\u002Ftranslate",{"title":250,"path":251,"stem":252},"translate-key","\u002Freference\u002Fcli\u002Ftranslate-key","9.reference\u002F1.cli\u002Ftranslate-key",{"title":254,"path":255,"stem":256},"update","\u002Freference\u002Fcli\u002Fupdate","9.reference\u002F1.cli\u002Fupdate",{"title":258,"path":259,"stem":260},"write","\u002Freference\u002Fcli\u002Fwrite","9.reference\u002F1.cli\u002Fwrite",{"title":262,"path":263,"stem":264,"children":265,"page":-1},"MCP Tools","\u002Freference\u002Fmcp","9.reference\u002F2.mcp\u002Findex",[266,267,271,275,279,283,287,291,295,299,303,307,311,315,319,323,327,331,335],{"title":262,"path":263,"stem":264},{"title":268,"path":269,"stem":270},"discover","\u002Freference\u002Fmcp\u002Fdiscover","9.reference\u002F2.mcp\u002Fdiscover",{"title":272,"path":273,"stem":274},"find_duplicate_keys","\u002Freference\u002Fmcp\u002Ffind_duplicate_keys","9.reference\u002F2.mcp\u002Ffind_duplicate_keys",{"title":276,"path":277,"stem":278},"find_empty_translations","\u002Freference\u002Fmcp\u002Ffind_empty_translations","9.reference\u002F2.mcp\u002Ffind_empty_translations",{"title":280,"path":281,"stem":282},"find_orphan_keys","\u002Freference\u002Fmcp\u002Ffind_orphan_keys","9.reference\u002F2.mcp\u002Ffind_orphan_keys",{"title":284,"path":285,"stem":286},"find_undefined_keys","\u002Freference\u002Fmcp\u002Ffind_undefined_keys","9.reference\u002F2.mcp\u002Ffind_undefined_keys",{"title":288,"path":289,"stem":290},"get_missing_translations","\u002Freference\u002Fmcp\u002Fget_missing_translations","9.reference\u002F2.mcp\u002Fget_missing_translations",{"title":292,"path":293,"stem":294},"get_translation_status","\u002Freference\u002Fmcp\u002Fget_translation_status","9.reference\u002F2.mcp\u002Fget_translation_status",{"title":296,"path":297,"stem":298},"get_translations","\u002Freference\u002Fmcp\u002Fget_translations","9.reference\u002F2.mcp\u002Fget_translations",{"title":300,"path":301,"stem":302},"list_namespaces","\u002Freference\u002Fmcp\u002Flist_namespaces","9.reference\u002F2.mcp\u002Flist_namespaces",{"title":304,"path":305,"stem":306},"move_translation_key","\u002Freference\u002Fmcp\u002Fmove_translation_key","9.reference\u002F2.mcp\u002Fmove_translation_key",{"title":308,"path":309,"stem":310},"remove_orphan_keys","\u002Freference\u002Fmcp\u002Fremove_orphan_keys","9.reference\u002F2.mcp\u002Fremove_orphan_keys",{"title":312,"path":313,"stem":314},"remove_translations","\u002Freference\u002Fmcp\u002Fremove_translations","9.reference\u002F2.mcp\u002Fremove_translations",{"title":316,"path":317,"stem":318},"rename_translation_key","\u002Freference\u002Fmcp\u002Frename_translation_key","9.reference\u002F2.mcp\u002Frename_translation_key",{"title":320,"path":321,"stem":322},"scaffold_locale","\u002Freference\u002Fmcp\u002Fscaffold_locale","9.reference\u002F2.mcp\u002Fscaffold_locale",{"title":324,"path":325,"stem":326},"search_translations","\u002Freference\u002Fmcp\u002Fsearch_translations","9.reference\u002F2.mcp\u002Fsearch_translations",{"title":328,"path":329,"stem":330},"translate_key","\u002Freference\u002Fmcp\u002Ftranslate_key","9.reference\u002F2.mcp\u002Ftranslate_key",{"title":332,"path":333,"stem":334},"translate_missing","\u002Freference\u002Fmcp\u002Ftranslate_missing","9.reference\u002F2.mcp\u002Ftranslate_missing",{"title":336,"path":337,"stem":338},"write_translations","\u002Freference\u002Fmcp\u002Fwrite_translations","9.reference\u002F2.mcp\u002Fwrite_translations",{"title":340,"path":341,"stem":342},"GitHub Action","\u002Freference\u002Faction","9.reference\u002F3.action",{"title":344,"path":345,"stem":346},"Programmatic API","\u002Freference\u002Fprogrammatic-api","9.reference\u002F4.programmatic-api",{"title":348,"icon":349,"path":350,"stem":351,"children":352,"page":21},"Extra Topics","i-lucide-microscope","\u002Fextra-topics","91.extra-topics",[353],{"title":354,"path":355,"stem":356},"How Detection Scores Adapters","\u002Fextra-topics\u002Fdetection-scoring","91.extra-topics\u002F1.detection-scoring",{"id":358,"title":67,"body":359,"description":377,"extension":1036,"links":1037,"meta":1038,"navigation":1039,"path":68,"seo":1040,"stem":69,"__hash__":1042},"docs\u002F3.monorepos\u002F3.shared-libraries.md",{"type":360,"value":361,"toc":1028},"minimark",[362,367,378,399,403,410,469,472,476,479,498,519,537,560,566,570,590,597,947,950,968,975,979,987,991,1005,1017,1024],[363,364,366],"h2",{"id":365},"the-repository","The Repository",[368,369,374],"pre",{"className":370,"code":372,"language":373},[371],"language-text","monorepo\u002F\n├── packages\u002Fui\u002F          # shared library: buttons, dialogs, form errors\n│   ├── locales\u002Fen.json\n│   └── src\u002F\n├── apps\u002Fcheckout\u002F        # consumes ui\n│   ├── locales\u002Fen.json\n│   └── src\u002F\n├── apps\u002Fadmin\u002F           # consumes ui\n│   ├── locales\u002Fen.json\n│   └── src\u002F\n└── scripts\u002F              # release tooling, no app\n","text",[375,376,372],"code",{"__ignoreMap":377},"",[379,380,381,382,385,386,390,391,394,395,398],"p",{},"Three layers, three locale directories, two apps. ",[375,383,384],{},"ui"," is a ",[387,388,389],"strong",{},"shared layer",":\nconsumed by more than one app. ",[375,392,393],{},"checkout"," and ",[375,396,397],{},"admin"," are private to one app\neach.",[363,400,402],{"id":401},"what-each-layer-is-checked-against","What Each Layer Is Checked Against",[379,404,405,406,409],{},"Each layer's scope is its own root, plus the roots of the apps that consume it,\nplus the project root — which claims everything outside the three, including\n",[375,407,408],{},"scripts\u002F",":",[411,412,413,426],"table",{},[414,415,416],"thead",{},[417,418,419,423],"tr",{},[420,421,422],"th",{},"Layer",[420,424,425],{},"Scope",[427,428,429,449,459],"tbody",{},[417,430,431,436],{},[432,433,434],"td",{},[375,435,384],{},[432,437,438,441,442,441,445,448],{},[375,439,440],{},"packages\u002Fui",", ",[375,443,444],{},"apps\u002Fcheckout",[375,446,447],{},"apps\u002Fadmin",", project root",[417,450,451,455],{},[432,452,453],{},[375,454,393],{},[432,456,457,448],{},[375,458,444],{},[417,460,461,465],{},[432,462,463],{},[375,464,397],{},[432,466,467,448],{},[375,468,447],{},[379,470,471],{},"What changes against a repository-wide scan is who is allowed to vouch for what.",[363,473,475],{"id":474},"four-keys-four-outcomes","Four Keys, Four Outcomes",[379,477,478],{},"Take four keys and follow each one through the plan.",[379,480,481,494,495,497],{},[387,482,483,486,487,489,490,493],{},[375,484,485],{},"ui.button.save",", defined in ",[375,488,384],{},", used in ",[375,491,492],{},"packages\u002Fui\u002Fsrc\u002FButton.vue",".","\nThe library's own root is in ",[375,496,384],{},"'s scope, so the key is used. A shared library's\nkeys are protected by the library's own code, which is what makes it safe to\ndelete-check a library nobody has finished migrating to.",[379,499,500,510,512,513,515,516,518],{},[387,501,502,486,505,507,508,493],{},[375,503,504],{},"ui.dialog.confirm",[375,506,384],{},", used only in ",[375,509,444],{},[375,511,444],{}," is in ",[375,514,384],{},"'s scope because checkout consumes ",[375,517,384],{},". The key is\nused. One consumer is enough; the admin app never referencing it is not a\nfinding.",[379,520,521,529,530,533,534,536],{},[387,522,523,486,526,528],{},[375,524,525],{},"ui.legacy.banner",[375,527,384],{},", referenced nowhere.","\nNothing in scope vouches for it, and nothing out of scope does either. It is an\n",[387,531,532],{},"orphan key"," — the only bucket ",[375,535,222],{}," ever deletes from.",[379,538,539,549,551,552,554,555,559],{},[387,540,541,486,544,546,547,493],{},[375,542,543],{},"checkout.cart.title",[375,545,393],{},", referenced only in ",[375,548,447],{},[375,550,447],{}," is not in ",[375,553,393],{},"'s scope, so the reference is not usage\nevidence. But the key is not unreferenced either. It is reported as a\n",[556,557,558],"a",{"href":76},"misplaced usage"," and left alone: deleting it would\nbreak the admin call site, and counting it as used would hide the fact that the\ncall site cannot resolve it at runtime.",[379,561,562,563,565],{},"That fourth case is the one an unscoped scan gets wrong. A repository-wide grep\nfinds the string in ",[375,564,447],{},", calls the key used, and the broken screen ships.",[363,567,569],{"id":568},"running-it","Running It",[368,571,575],{"className":572,"code":573,"language":574,"meta":377,"style":377},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","the-i18n-cli remove-orphans\n","bash",[375,576,577],{"__ignoreMap":377},[578,579,582,586],"span",{"class":580,"line":581},"line",1,[578,583,585],{"class":584},"sBMFI","the-i18n-cli",[578,587,589],{"class":588},"sfazB"," remove-orphans\n",[379,591,592,593,596],{},"Dry run is the default — nothing is written until you pass ",[375,594,595],{},"--no-dry-run",".\nThe result carries the buckets separately:",[368,598,602],{"className":599,"code":600,"language":601,"meta":377,"style":377},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"orphanKeys\": {\n    \"ui\": [\"ui.legacy.banner\"]\n  },\n  \"misplacedUsages\": [\n    { \"key\": \"checkout.cart.title\", \"layer\": \"checkout\", \"usingApps\": [\"admin\"] }\n  ],\n  \"summary\": {\n    \"orphanCount\": 1,\n    \"uncertainCount\": 0,\n    \"misplacedCount\": 1,\n    \"scanScope\": {\n      \"ui\": [\".\", \"packages\u002Fui\", \"apps\u002Fcheckout\", \"apps\u002Fadmin\"],\n      \"checkout\": [\".\", \"apps\u002Fcheckout\"],\n      \"admin\": [\".\", \"apps\u002Fadmin\"]\n    }\n  }\n}\n","json",[375,603,604,610,628,652,658,673,738,744,758,777,794,810,824,871,900,929,935,941],{"__ignoreMap":377},[578,605,606],{"class":580,"line":581},[578,607,609],{"class":608},"sMK4o","{\n",[578,611,613,616,620,623,625],{"class":580,"line":612},2,[578,614,615],{"class":608},"  \"",[578,617,619],{"class":618},"spNyl","orphanKeys",[578,621,622],{"class":608},"\"",[578,624,409],{"class":608},[578,626,627],{"class":608}," {\n",[578,629,631,634,636,638,640,643,645,647,649],{"class":580,"line":630},3,[578,632,633],{"class":608},"    \"",[578,635,384],{"class":584},[578,637,622],{"class":608},[578,639,409],{"class":608},[578,641,642],{"class":608}," [",[578,644,622],{"class":608},[578,646,525],{"class":588},[578,648,622],{"class":608},[578,650,651],{"class":608},"]\n",[578,653,655],{"class":580,"line":654},4,[578,656,657],{"class":608},"  },\n",[578,659,661,663,666,668,670],{"class":580,"line":660},5,[578,662,615],{"class":608},[578,664,665],{"class":618},"misplacedUsages",[578,667,622],{"class":608},[578,669,409],{"class":608},[578,671,672],{"class":608}," [\n",[578,674,676,679,682,685,687,689,691,693,695,698,700,703,705,707,709,711,713,715,717,720,722,724,726,728,730,732,735],{"class":580,"line":675},6,[578,677,678],{"class":608},"    {",[578,680,681],{"class":608}," \"",[578,683,684],{"class":584},"key",[578,686,622],{"class":608},[578,688,409],{"class":608},[578,690,681],{"class":608},[578,692,543],{"class":588},[578,694,622],{"class":608},[578,696,697],{"class":608},",",[578,699,681],{"class":608},[578,701,702],{"class":584},"layer",[578,704,622],{"class":608},[578,706,409],{"class":608},[578,708,681],{"class":608},[578,710,393],{"class":588},[578,712,622],{"class":608},[578,714,697],{"class":608},[578,716,681],{"class":608},[578,718,719],{"class":584},"usingApps",[578,721,622],{"class":608},[578,723,409],{"class":608},[578,725,642],{"class":608},[578,727,622],{"class":608},[578,729,397],{"class":588},[578,731,622],{"class":608},[578,733,734],{"class":608},"]",[578,736,737],{"class":608}," }\n",[578,739,741],{"class":580,"line":740},7,[578,742,743],{"class":608},"  ],\n",[578,745,747,749,752,754,756],{"class":580,"line":746},8,[578,748,615],{"class":608},[578,750,751],{"class":618},"summary",[578,753,622],{"class":608},[578,755,409],{"class":608},[578,757,627],{"class":608},[578,759,761,763,766,768,770,774],{"class":580,"line":760},9,[578,762,633],{"class":608},[578,764,765],{"class":584},"orphanCount",[578,767,622],{"class":608},[578,769,409],{"class":608},[578,771,773],{"class":772},"sbssI"," 1",[578,775,776],{"class":608},",\n",[578,778,780,782,785,787,789,792],{"class":580,"line":779},10,[578,781,633],{"class":608},[578,783,784],{"class":584},"uncertainCount",[578,786,622],{"class":608},[578,788,409],{"class":608},[578,790,791],{"class":772}," 0",[578,793,776],{"class":608},[578,795,797,799,802,804,806,808],{"class":580,"line":796},11,[578,798,633],{"class":608},[578,800,801],{"class":584},"misplacedCount",[578,803,622],{"class":608},[578,805,409],{"class":608},[578,807,773],{"class":772},[578,809,776],{"class":608},[578,811,813,815,818,820,822],{"class":580,"line":812},12,[578,814,633],{"class":608},[578,816,817],{"class":584},"scanScope",[578,819,622],{"class":608},[578,821,409],{"class":608},[578,823,627],{"class":608},[578,825,827,830,832,834,836,838,840,842,844,846,848,850,852,854,856,858,860,862,864,866,868],{"class":580,"line":826},13,[578,828,829],{"class":608},"      \"",[578,831,384],{"class":772},[578,833,622],{"class":608},[578,835,409],{"class":608},[578,837,642],{"class":608},[578,839,622],{"class":608},[578,841,493],{"class":588},[578,843,622],{"class":608},[578,845,697],{"class":608},[578,847,681],{"class":608},[578,849,440],{"class":588},[578,851,622],{"class":608},[578,853,697],{"class":608},[578,855,681],{"class":608},[578,857,444],{"class":588},[578,859,622],{"class":608},[578,861,697],{"class":608},[578,863,681],{"class":608},[578,865,447],{"class":588},[578,867,622],{"class":608},[578,869,870],{"class":608},"],\n",[578,872,874,876,878,880,882,884,886,888,890,892,894,896,898],{"class":580,"line":873},14,[578,875,829],{"class":608},[578,877,393],{"class":772},[578,879,622],{"class":608},[578,881,409],{"class":608},[578,883,642],{"class":608},[578,885,622],{"class":608},[578,887,493],{"class":588},[578,889,622],{"class":608},[578,891,697],{"class":608},[578,893,681],{"class":608},[578,895,444],{"class":588},[578,897,622],{"class":608},[578,899,870],{"class":608},[578,901,903,905,907,909,911,913,915,917,919,921,923,925,927],{"class":580,"line":902},15,[578,904,829],{"class":608},[578,906,397],{"class":772},[578,908,622],{"class":608},[578,910,409],{"class":608},[578,912,642],{"class":608},[578,914,622],{"class":608},[578,916,493],{"class":588},[578,918,622],{"class":608},[578,920,697],{"class":608},[578,922,681],{"class":608},[578,924,447],{"class":588},[578,926,622],{"class":608},[578,928,651],{"class":608},[578,930,932],{"class":580,"line":931},16,[578,933,934],{"class":608},"    }\n",[578,936,938],{"class":580,"line":937},17,[578,939,940],{"class":608},"  }\n",[578,942,944],{"class":580,"line":943},18,[578,945,946],{"class":608},"}\n",[379,948,949],{},"To check the library alone, narrow by layer — the scope stays the same, because\nscope comes from the graph rather than from the flag:",[368,951,953],{"className":572,"code":952,"language":574,"meta":377,"style":377},"the-i18n-cli remove-orphans --layer ui\n",[375,954,955],{"__ignoreMap":377},[578,956,957,959,962,965],{"class":580,"line":581},[578,958,585],{"class":584},[578,960,961],{"class":588}," remove-orphans",[578,963,964],{"class":588}," --layer",[578,966,967],{"class":588}," ui\n",[379,969,970,971,974],{},"On a catalog large enough that the full report is inconvenient, ",[375,972,973],{},"--output-file","\nwrites it to disk and returns only the summary, which is also how an agent keeps\na thousand-key result out of its context window.",[363,976,978],{"id":977},"when-the-library-has-one-consumer","When the Library Has One Consumer",[379,980,981,982,394,984,986],{},"Drop ",[375,983,447],{},[375,985,384],{}," is no longer a shared layer. The remaining app's\nscope is the whole project, so per-layer scope collapses to global scope and\nmisplaced usages cannot occur — there is nothing left out of scope. The scan\nbehaves exactly like an unscoped one.",[363,988,990],{"id":989},"what-this-setup-requires","What This Setup Requires",[379,992,993,994,996,997,1000,1001,1004],{},"Reaching the table above needs app-to-layer edges in the resolved config, and\nthose are derived today only for Nuxt monorepos. On a React, Vue or Laravel\nmonorepo you can declare the three layers by hand (see\n",[556,995,59],{"href":60},") and you get per-layer reports, per-layer ignore\npatterns and ",[556,998,999],{"href":72},"duplicate detection"," — but\none app consuming everything, so usage evidence stays repository-wide. The\n",[556,1002,1003],{"href":64},"consumer graph"," page states the boundary precisely.",[1006,1007,1008,1009,1012,1013,1016],"warning",{},"Before the first real removal, run the dry run and read ",[375,1010,1011],{},"uncertainKeys"," and\n",[375,1014,1015],{},"dynamicKeys",". A shared library is exactly where keys get built at runtime from\ncomponent props, and those are the keys a static scan is least sure about.",[379,1018,1019,1020,1023],{},"Next: ",[556,1021,1022],{"href":72},"duplicates and divergence"," — what\nhappens when a consuming layer redefines a key the shared library already owns.",[1025,1026,1027],"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 .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":377,"searchDepth":630,"depth":630,"links":1029},[1030,1031,1032,1033,1034,1035],{"id":365,"depth":612,"text":366},{"id":401,"depth":612,"text":402},{"id":474,"depth":612,"text":475},{"id":568,"depth":612,"text":569},{"id":977,"depth":612,"text":978},{"id":989,"depth":612,"text":990},"md",null,{},true,{"description":1041,"title":67},"A worked example of a shared UI library with its own translations consumed by two apps — which keys count as used, which are orphans, and which are neither.","9lbBy_Bge34th8gBROLer_I4bfEGgHlaTM4YoogvB9I",[1044,1045],{"title":63,"path":64,"stem":65,"description":377,"children":-1},{"title":71,"path":72,"stem":73,"description":377,"children":-1},1787604647516]