[{"data":1,"prerenderedAt":897},["ShallowReactive",2],{"navigation_docs":3,"-monorepos-consumer-graph":357,"-monorepos-consumer-graph-surround":894},[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":63,"body":359,"description":512,"extension":888,"links":889,"meta":890,"navigation":771,"path":64,"seo":891,"stem":65,"__hash__":893},"docs\u002F3.monorepos\u002F2.consumer-graph.md",{"type":360,"value":361,"toc":878},"minimark",[362,367,376,427,430,446,453,457,461,465,475,491,498,506,644,664,668,671,686,690,693,731,842,848,852,867,874],[363,364,366],"h2",{"id":365},"what-the-graph-is","What the Graph Is",[368,369,370,371,375],"p",{},"The ",[372,373,374],"strong",{},"consumer graph"," is the set of edges from apps to the layers they consume.\nAn app contributes three things to it:",[377,378,379,392],"table",{},[380,381,382],"thead",{},[383,384,385,389],"tr",{},[386,387,388],"th",{},"Field",[386,390,391],{},"Means",[393,394,395,407,417],"tbody",{},[383,396,397,404],{},[398,399,400],"td",{},[401,402,403],"code",{},"name",[398,405,406],{},"The app's name, as it appears in reports",[383,408,409,414],{},[398,410,411],{},[401,412,413],{},"rootDir",[398,415,416],{},"The app's code root",[383,418,419,424],{},[398,420,421],{},[401,422,423],{},"layers",[398,425,426],{},"The layers it consumes, in precedence order — earlier entries override later ones at runtime",[368,428,429],{},"Two terms come out of those edges and are used in every report:",[431,432,433,440],"ul",{},[434,435,436,439],"li",{},[372,437,438],{},"canonical layers"," — every layer that owns its locale directory, aliases\nexcluded",[434,441,442,445],{},[372,443,444],{},"shared layers"," — canonical layers consumed by more than one app",[368,447,448,449,452],{},"The whole graph derives from configuration you can print with\n",[401,450,451],{},"the-i18n-cli detect",".",[363,454,456],{"id":455},"where-the-edges-come-from","Where the Edges Come From",[458,459,460],"warning",{},"Consumption edges are derived today only for Nuxt projects, where each app\nreports the layers it extends and the apps are merged into one project config.\nThe Laravel, Vue, React\u002FNext and generic adapters each resolve a single app that\nconsumes all of their layers. On those stacks the scoping below is still\napplied, but every layer's scope is the whole project — the same behavior as an\nunscoped scan. You get per-layer reports and duplicate detection; you do not get\napp-scoped usage evidence, because nothing in the project declares which app\nconsumes what.",[363,462,464],{"id":463},"what-counts-as-usage","What Counts as Usage",[368,466,467,470,471,474],{},[372,468,469],{},"Usage counts only from the code of the apps that consume the layer."," A key\nlives in one layer, and at runtime only apps that consume that layer can resolve\nit — so a reference to ",[401,472,473],{},"checkout.cart.title"," inside an admin app that does not\nconsume the checkout layer is evidence of a bug, not evidence that the key is\nneeded.",[368,476,477,478,481,482,485,486,490],{},"A layer's scope is therefore its own root directory, plus the root directory of\nevery app that consumes it, plus any part of the repository that lies outside\nevery app — a monorepo root holding ",[401,479,480],{},"scripts\u002F"," or ",[401,483,484],{},"tools\u002F"," counts for ",[487,488,489],"em",{},"every","\nlayer, so code outside all apps never turns into a false orphan.",[363,492,494,495],{"id":493},"reading-scanscope","Reading ",[401,496,497],{},"scanScope",[368,499,500,502,503,505],{},[401,501,222],{}," and ",[401,504,280],{}," report the effective scope per layer,\nrelative to the project directory, so the scoping is auditable rather than\nimplied:",[507,508,513],"pre",{"className":509,"code":510,"language":511,"meta":512,"style":512},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"scanScope\": {\n    \"root\": [\".\", \"app-admin\", \"app-shop\"],\n    \"app-admin\": [\"app-admin\"],\n    \"app-shop\": [\"app-shop\"]\n  }\n}\n","json","",[401,514,515,524,542,589,610,632,638],{"__ignoreMap":512},[516,517,520],"span",{"class":518,"line":519},"line",1,[516,521,523],{"class":522},"sMK4o","{\n",[516,525,527,530,533,536,539],{"class":518,"line":526},2,[516,528,529],{"class":522},"  \"",[516,531,497],{"class":532},"spNyl",[516,534,535],{"class":522},"\"",[516,537,538],{"class":522},":",[516,540,541],{"class":522}," {\n",[516,543,545,548,552,554,556,559,561,564,566,569,572,575,577,579,581,584,586],{"class":518,"line":544},3,[516,546,547],{"class":522},"    \"",[516,549,551],{"class":550},"sBMFI","root",[516,553,535],{"class":522},[516,555,538],{"class":522},[516,557,558],{"class":522}," [",[516,560,535],{"class":522},[516,562,452],{"class":563},"sfazB",[516,565,535],{"class":522},[516,567,568],{"class":522},",",[516,570,571],{"class":522}," \"",[516,573,574],{"class":563},"app-admin",[516,576,535],{"class":522},[516,578,568],{"class":522},[516,580,571],{"class":522},[516,582,583],{"class":563},"app-shop",[516,585,535],{"class":522},[516,587,588],{"class":522},"],\n",[516,590,592,594,596,598,600,602,604,606,608],{"class":518,"line":591},4,[516,593,547],{"class":522},[516,595,574],{"class":550},[516,597,535],{"class":522},[516,599,538],{"class":522},[516,601,558],{"class":522},[516,603,535],{"class":522},[516,605,574],{"class":563},[516,607,535],{"class":522},[516,609,588],{"class":522},[516,611,613,615,617,619,621,623,625,627,629],{"class":518,"line":612},5,[516,614,547],{"class":522},[516,616,583],{"class":550},[516,618,535],{"class":522},[516,620,538],{"class":522},[516,622,558],{"class":522},[516,624,535],{"class":522},[516,626,583],{"class":563},[516,628,535],{"class":522},[516,630,631],{"class":522},"]\n",[516,633,635],{"class":518,"line":634},6,[516,636,637],{"class":522},"  }\n",[516,639,641],{"class":518,"line":640},7,[516,642,643],{"class":522},"}\n",[368,645,646,647,649,650,652,653,655,656,658,659,663],{},"Read it as: the shared ",[401,648,551],{}," layer was checked against both apps and the\nrepository root, while each app-private layer was checked against its own app\nonly. A key defined in ",[401,651,574],{}," and referenced only from ",[401,654,583],{}," is\noutside ",[401,657,574],{},"'s scope — that is a\n",[660,661,662],"a",{"href":76},"misplaced usage",", reported separately and never\nremoved.",[363,665,667],{"id":666},"when-scope-is-the-whole-project","When Scope Is the Whole Project",[368,669,670],{},"Scoping widens a layer's scope rather than narrowing it wrongly. With no app\ninformation in the config, with a layer no app consumes, or in a single-app\nproject, every layer is checked against the whole project — the same behavior as\nan unscoped scan.",[368,672,673,676,677,679,680,682,683,452],{},[401,674,675],{},"scanDirs"," is the manual override, on the ",[401,678,280],{}," and\n",[401,681,308],{}," MCP tools and on the same functions in the programmatic\nAPI: all layers are then checked against one combined usage set from those\ndirectories, and misplaced-usage detection is off. It is not a CLI flag — from\nthe terminal, scoping is derived, and the way to narrow a run is ",[401,684,685],{},"--layer",[363,687,689],{"id":688},"per-layer-scanning","Per-Layer Scanning",[368,691,692],{},"Layers are the unit of work everywhere:",[431,694,695,704,725],{},[434,696,697,700,701,703],{},[401,698,699],{},"the-i18n-cli remove-orphans --layer ui"," checks one layer, against that\nlayer's scope. Without ",[401,702,685],{},", every non-alias layer is checked, each\nagainst its own scope, in one pass.",[434,705,706,707,710,711,502,714,717,718,720,721,724],{},"Reports are keyed by layer: ",[401,708,709],{},"orphanKeys",", ",[401,712,713],{},"uncertainKeys",[401,715,716],{},"removed"," are\nall maps from layer name to keys, and ",[401,719,280],{}," adds\n",[401,722,723],{},"summary.layersChecked"," naming the layers that ran.",[434,726,727,730],{},[401,728,729],{},"orphanScan"," in the project config is keyed by layer name too, so a family of\nruntime-built keys can be declared dynamic in the layer that owns it:",[507,732,737],{"className":733,"code":734,"filename":735,"language":736,"meta":512,"style":512},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { defineI18nKitConfig } from '@the-i18n-kit\u002Fcli\u002Fconfig'\n\nexport default defineI18nKitConfig({\n  orphanScan: {\n    ui: { ignorePatterns: ['ui.icons.*'] },\n  },\n})\n","i18n-kit.config.ts","ts",[401,738,739,767,773,789,799,829,834],{"__ignoreMap":512},[516,740,741,745,748,752,755,758,761,764],{"class":518,"line":519},[516,742,744],{"class":743},"s7zQu","import",[516,746,747],{"class":522}," {",[516,749,751],{"class":750},"sTEyZ"," defineI18nKitConfig",[516,753,754],{"class":522}," }",[516,756,757],{"class":743}," from",[516,759,760],{"class":522}," '",[516,762,763],{"class":563},"@the-i18n-kit\u002Fcli\u002Fconfig",[516,765,766],{"class":522},"'\n",[516,768,769],{"class":518,"line":526},[516,770,772],{"emptyLinePlaceholder":771},true,"\n",[516,774,775,778,781,784,787],{"class":518,"line":544},[516,776,777],{"class":743},"export",[516,779,780],{"class":743}," default",[516,782,751],{"class":783},"s2Zo4",[516,785,786],{"class":750},"(",[516,788,523],{"class":522},[516,790,791,795,797],{"class":518,"line":591},[516,792,794],{"class":793},"swJcz","  orphanScan",[516,796,538],{"class":522},[516,798,541],{"class":522},[516,800,801,804,806,808,811,813,815,818,821,823,826],{"class":518,"line":612},[516,802,803],{"class":793},"    ui",[516,805,538],{"class":522},[516,807,747],{"class":522},[516,809,810],{"class":793}," ignorePatterns",[516,812,538],{"class":522},[516,814,558],{"class":750},[516,816,817],{"class":522},"'",[516,819,820],{"class":563},"ui.icons.*",[516,822,817],{"class":522},[516,824,825],{"class":750},"] ",[516,827,828],{"class":522},"},\n",[516,830,831],{"class":518,"line":634},[516,832,833],{"class":522},"  },\n",[516,835,836,839],{"class":518,"line":640},[516,837,838],{"class":522},"}",[516,840,841],{"class":750},")\n",[368,843,844,845,847],{},"A key in ",[401,846,729],{}," that matches no detected layer silently applies to\nnothing, so the CLI warns on stderr and lists the layer names it did detect.",[363,849,851],{"id":850},"limits","Limits",[431,853,854,857,860],{},[434,855,856],{},"The graph is only as good as what the project declares. An app that consumes a\nlayer through a mechanism the adapter cannot see is missing an edge, and its\nusages will read as misplaced.",[434,858,859],{},"Scope is directory-based. Two apps sharing one root directory cannot be told\napart.",[434,861,862,863,866],{},"Layer precedence comes from the order an app lists its layers. Where two apps\ndisagree about the order of the same two layers, the first one seen wins —\nwhich matters for ",[660,864,865],{"href":72},"duplicate detection",",\nnot for scoping.",[368,868,869,870,873],{},"Next: ",[660,871,872],{"href":68},"the shared library scenario",", where all of\nthis earns its keep.",[875,876,877],"style",{},"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 .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 .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}",{"title":512,"searchDepth":544,"depth":544,"links":879},[880,881,882,883,885,886,887],{"id":365,"depth":526,"text":366},{"id":455,"depth":526,"text":456},{"id":463,"depth":526,"text":464},{"id":493,"depth":526,"text":884},"Reading scanScope",{"id":666,"depth":526,"text":667},{"id":688,"depth":526,"text":689},{"id":850,"depth":526,"text":851},"md",null,{},{"description":892,"title":63},"How the-i18n-kit works out which apps consume which layers, and why usage in a non-consuming app never counts as evidence that a key is used.","9WR04hRrFIk-EMz97gN7jf_qm9a4V44uZE3lMXh6HD4",[895,896],{"title":59,"path":60,"stem":61,"description":512,"children":-1},{"title":67,"path":68,"stem":69,"description":512,"children":-1},1787604647516]