[{"data":1,"prerenderedAt":1199},["ShallowReactive",2],{"navigation_docs":3,"-monorepos-layers-and-consumer-graph":302,"-monorepos-layers-and-consumer-graph-surround":1196},[4,18,32,53,74,103,120,133,147,156],{"title":5,"path":6,"stem":7,"children":8,"page":17},"Introduction","\u002Fintroduction","1.introduction",[9,13],{"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",false,{"title":19,"icon":20,"path":21,"stem":22,"children":23,"page":17},"ESLint Plugin","i-lucide-shield-check","\u002Feslint-plugin","10.eslint-plugin",[24,28],{"title":25,"path":26,"stem":27},"Install and Rules","\u002Feslint-plugin\u002Finstall-and-rules","10.eslint-plugin\u002F1.install-and-rules",{"title":29,"path":30,"stem":31},"Layer-Aware Missing Keys","\u002Feslint-plugin\u002Flayer-aware","10.eslint-plugin\u002F2.layer-aware",{"title":33,"path":34,"stem":35,"children":36,"page":17},"Getting Started","\u002Fgetting-started","2.getting-started",[37,41,45,49],{"title":38,"path":39,"stem":40},"Set Up the MCP Server","\u002Fgetting-started\u002Fagent-setup","2.getting-started\u002F1.agent-setup",{"title":42,"path":43,"stem":44},"From an Unconfigured Repository to a Translated One","\u002Fgetting-started\u002Fcold-start","2.getting-started\u002F2.cold-start",{"title":46,"path":47,"stem":48},"Agent Contract","\u002Fgetting-started\u002Fagent-contract","2.getting-started\u002F3.agent-contract",{"title":50,"path":51,"stem":52},"Harness Integrations","\u002Fgetting-started\u002Fharness-integrations","2.getting-started\u002F4.harness-integrations",{"title":54,"path":55,"stem":56,"children":57,"page":17},"Monorepos","\u002Fmonorepos","3.monorepos",[58,62,66,70],{"title":59,"path":60,"stem":61},"Layers and the Consumer Graph","\u002Fmonorepos\u002Flayers-and-consumer-graph","3.monorepos\u002F1.layers-and-consumer-graph",{"title":63,"path":64,"stem":65},"Shared Layers and Duplicates","\u002Fmonorepos\u002Fduplicates-and-shared-layers","3.monorepos\u002F2.duplicates-and-shared-layers",{"title":67,"path":68,"stem":69},"Misplaced Usages","\u002Fmonorepos\u002Fmisplaced-usages","3.monorepos\u002F3.misplaced-usages",{"title":71,"path":72,"stem":73},"Orphan Detection","\u002Fmonorepos\u002Forphan-detection","3.monorepos\u002F4.orphan-detection",{"title":75,"path":76,"stem":77,"children":78,"page":17},"Frameworks","\u002Fframeworks","4.frameworks",[79,83,87,91,95,99],{"title":80,"path":81,"stem":82},"Detection","\u002Fframeworks\u002Fdetection","4.frameworks\u002F1.detection",{"title":84,"path":85,"stem":86},"Nuxt","\u002Fframeworks\u002Fnuxt","4.frameworks\u002F2.nuxt",{"title":88,"path":89,"stem":90},"Laravel","\u002Fframeworks\u002Flaravel","4.frameworks\u002F3.laravel",{"title":92,"path":93,"stem":94},"Vue","\u002Fframeworks\u002Fvue","4.frameworks\u002F4.vue",{"title":96,"path":97,"stem":98},"React \u002F Next.js","\u002Fframeworks\u002Freact-next","4.frameworks\u002F5.react-next",{"title":100,"path":101,"stem":102},"Generic","\u002Fframeworks\u002Fgeneric","4.frameworks\u002F6.generic",{"title":104,"path":105,"stem":106,"children":107,"page":17},"Configuration","\u002Fconfiguration","5.configuration",[108,112,116],{"title":109,"path":110,"stem":111},"Where Configuration Lives","\u002Fconfiguration\u002Fwhere-config-lives","5.configuration\u002F1.where-config-lives",{"title":113,"path":114,"stem":115},"Precedence and Locale References","\u002Fconfiguration\u002Fprecedence-and-locale-refs","5.configuration\u002F2.precedence-and-locale-refs",{"title":117,"path":118,"stem":119},"Configuration Fields","\u002Fconfiguration\u002Freference","5.configuration\u002F4.reference",{"title":121,"path":122,"stem":123,"children":124,"page":17},"Nuxt Module","\u002Fnuxt-module","6.nuxt-module",[125,129],{"title":126,"path":127,"stem":128},"Install and Setup","\u002Fnuxt-module\u002Finstall","6.nuxt-module\u002F1.install",{"title":130,"path":131,"stem":132},"The Artifact and Options","\u002Fnuxt-module\u002Fartifact-and-options","6.nuxt-module\u002F2.artifact-and-options",{"title":134,"icon":135,"path":136,"stem":137,"children":138,"page":17},"CI\u002FCD","i-lucide-git-pull-request","\u002Fci-cd","7.ci-cd",[139,143],{"title":140,"path":141,"stem":142},"GitHub Actions","\u002Fci-cd\u002Fgithub-actions","7.ci-cd\u002F1.github-actions",{"title":144,"path":145,"stem":146},"GitLab CI","\u002Fci-cd\u002Fgitlab-ci","7.ci-cd\u002F2.gitlab-ci",{"title":148,"path":149,"stem":150,"children":151,"page":17},"Concepts","\u002Fconcepts","8.concepts",[152],{"title":153,"path":154,"stem":155},"Translation Modes","\u002Fconcepts\u002Ftranslation-modes","8.concepts\u002F1.translation-modes",{"title":157,"path":158,"stem":159,"children":160,"page":-1},"Reference","\u002Freference","9.reference",[161,163,229,294,298],{"title":157,"path":158,"stem":162},"9.reference\u002Findex",{"title":164,"path":165,"stem":166,"children":167,"page":-1},"CLI Commands","\u002Freference\u002Fcli","9.reference\u002F1.cli\u002Findex",[168,169,173,177,181,185,189,193,197,201,205,209,213,217,221,225],{"title":164,"path":165,"stem":166},{"title":170,"path":171,"stem":172},"check","\u002Freference\u002Fcli\u002Fcheck","9.reference\u002F1.cli\u002Fcheck",{"title":174,"path":175,"stem":176},"discover","\u002Freference\u002Fcli\u002Fdiscover","9.reference\u002F1.cli\u002Fdiscover",{"title":178,"path":179,"stem":180},"find-duplicates","\u002Freference\u002Fcli\u002Ffind-duplicates","9.reference\u002F1.cli\u002Ffind-duplicates",{"title":182,"path":183,"stem":184},"get","\u002Freference\u002Fcli\u002Fget","9.reference\u002F1.cli\u002Fget",{"title":186,"path":187,"stem":188},"init","\u002Freference\u002Fcli\u002Finit","9.reference\u002F1.cli\u002Finit",{"title":190,"path":191,"stem":192},"missing","\u002Freference\u002Fcli\u002Fmissing","9.reference\u002F1.cli\u002Fmissing",{"title":194,"path":195,"stem":196},"move","\u002Freference\u002Fcli\u002Fmove","9.reference\u002F1.cli\u002Fmove",{"title":198,"path":199,"stem":200},"orphans","\u002Freference\u002Fcli\u002Forphans","9.reference\u002F1.cli\u002Forphans",{"title":202,"path":203,"stem":204},"remove","\u002Freference\u002Fcli\u002Fremove","9.reference\u002F1.cli\u002Fremove",{"title":206,"path":207,"stem":208},"scaffold","\u002Freference\u002Fcli\u002Fscaffold","9.reference\u002F1.cli\u002Fscaffold",{"title":210,"path":211,"stem":212},"search","\u002Freference\u002Fcli\u002Fsearch","9.reference\u002F1.cli\u002Fsearch",{"title":214,"path":215,"stem":216},"status","\u002Freference\u002Fcli\u002Fstatus","9.reference\u002F1.cli\u002Fstatus",{"title":218,"path":219,"stem":220},"translate","\u002Freference\u002Fcli\u002Ftranslate","9.reference\u002F1.cli\u002Ftranslate",{"title":222,"path":223,"stem":224},"translate-key","\u002Freference\u002Fcli\u002Ftranslate-key","9.reference\u002F1.cli\u002Ftranslate-key",{"title":226,"path":227,"stem":228},"write","\u002Freference\u002Fcli\u002Fwrite","9.reference\u002F1.cli\u002Fwrite",{"title":230,"path":231,"stem":232,"children":233,"page":-1},"MCP Tools","\u002Freference\u002Fmcp","9.reference\u002F2.mcp\u002Findex",[234,235,238,242,246,250,254,258,262,266,270,274,278,282,286,290],{"title":230,"path":231,"stem":232},{"title":174,"path":236,"stem":237},"\u002Freference\u002Fmcp\u002Fdiscover","9.reference\u002F2.mcp\u002Fdiscover",{"title":239,"path":240,"stem":241},"find_duplicate_keys","\u002Freference\u002Fmcp\u002Ffind_duplicate_keys","9.reference\u002F2.mcp\u002Ffind_duplicate_keys",{"title":243,"path":244,"stem":245},"find_orphan_keys","\u002Freference\u002Fmcp\u002Ffind_orphan_keys","9.reference\u002F2.mcp\u002Ffind_orphan_keys",{"title":247,"path":248,"stem":249},"find_undefined_keys","\u002Freference\u002Fmcp\u002Ffind_undefined_keys","9.reference\u002F2.mcp\u002Ffind_undefined_keys",{"title":251,"path":252,"stem":253},"get_missing_translations","\u002Freference\u002Fmcp\u002Fget_missing_translations","9.reference\u002F2.mcp\u002Fget_missing_translations",{"title":255,"path":256,"stem":257},"get_translation_status","\u002Freference\u002Fmcp\u002Fget_translation_status","9.reference\u002F2.mcp\u002Fget_translation_status",{"title":259,"path":260,"stem":261},"get_translations","\u002Freference\u002Fmcp\u002Fget_translations","9.reference\u002F2.mcp\u002Fget_translations",{"title":263,"path":264,"stem":265},"list_namespaces","\u002Freference\u002Fmcp\u002Flist_namespaces","9.reference\u002F2.mcp\u002Flist_namespaces",{"title":267,"path":268,"stem":269},"move_translation_key","\u002Freference\u002Fmcp\u002Fmove_translation_key","9.reference\u002F2.mcp\u002Fmove_translation_key",{"title":271,"path":272,"stem":273},"remove_translations","\u002Freference\u002Fmcp\u002Fremove_translations","9.reference\u002F2.mcp\u002Fremove_translations",{"title":275,"path":276,"stem":277},"scaffold_locale","\u002Freference\u002Fmcp\u002Fscaffold_locale","9.reference\u002F2.mcp\u002Fscaffold_locale",{"title":279,"path":280,"stem":281},"search_translations","\u002Freference\u002Fmcp\u002Fsearch_translations","9.reference\u002F2.mcp\u002Fsearch_translations",{"title":283,"path":284,"stem":285},"translate_key","\u002Freference\u002Fmcp\u002Ftranslate_key","9.reference\u002F2.mcp\u002Ftranslate_key",{"title":287,"path":288,"stem":289},"translate_missing","\u002Freference\u002Fmcp\u002Ftranslate_missing","9.reference\u002F2.mcp\u002Ftranslate_missing",{"title":291,"path":292,"stem":293},"write_translations","\u002Freference\u002Fmcp\u002Fwrite_translations","9.reference\u002F2.mcp\u002Fwrite_translations",{"title":295,"path":296,"stem":297},"GitHub Action","\u002Freference\u002Faction","9.reference\u002F3.action",{"title":299,"path":300,"stem":301},"Programmatic API","\u002Freference\u002Fprogrammatic-api","9.reference\u002F4.programmatic-api",{"id":303,"title":59,"body":304,"description":456,"extension":1190,"links":1191,"meta":1192,"navigation":497,"path":60,"seo":1193,"stem":61,"__hash__":1195},"docs\u002F3.monorepos\u002F1.layers-and-consumer-graph.md",{"type":305,"value":306,"toc":1183},"minimark",[307,312,330,333,386,390,443,449,663,674,677,681,707,740,747,892,905,909,919,926,1048,1060,1063,1067,1076,1162,1170,1179],[308,309,311],"h2",{"id":310},"what-a-layer-is","What a Layer Is",[313,314,315,316,320,321,325,326,329],"p",{},"A ",[317,318,319],"strong",{},"layer"," is a scoped locale directory together with the code that owns it —\na workspace package that ships its own ",[322,323,324],"code",{},"locales\u002F",", a shared UI library, one app\nin a monorepo, a Nuxt layer other apps extend, or a Laravel ",[322,327,328],{},"lang\u002F"," directory.",[313,331,332],{},"Each resolved layer has three parts:",[334,335,336,349],"table",{},[337,338,339],"thead",{},[340,341,342,346],"tr",{},[343,344,345],"th",{},"Part",[343,347,348],{},"Means",[350,351,352,363,376],"tbody",{},[340,353,354,360],{},[355,356,357],"td",{},[322,358,359],{},"path",[355,361,362],{},"The locale directory — where the JSON, YAML or PHP files live",[340,364,365,369],{},[355,366,367],{},[322,368,319],{},[355,370,371,372,375],{},"The name, used by every ",[322,373,374],{},"--layer"," flag and in every report",[340,377,378,383],{},[355,379,380],{},[322,381,382],{},"layerRootDir",[355,384,385],{},"The code root that owns the directory — the subtree scanned for usages of its keys",[308,387,389],{"id":388},"where-layer-names-come-from","Where Layer Names Come From",[334,391,392,402],{},[337,393,394],{},[340,395,396,399],{},[343,397,398],{},"Framework",[343,400,401],{},"Layers",[350,403,404,411,422],{},[340,405,406,408],{},[355,407,84],{},[355,409,410],{},"One per entry in Nuxt's resolved layer list that has a locale directory, for every app found. Named from the directory path relative to the project root",[340,412,413,416],{},[355,414,415],{},"Laravel, React \u002F Next.js",[355,417,418,419],{},"One layer, named ",[322,420,421],{},"root",[340,423,424,426],{},[355,425,100],{},[355,427,428,429,432,433,436,437,440,441],{},"One per entry in ",[322,430,431],{},"localeDirs",". A string entry is named ",[322,434,435],{},"default","; an object entry ",[322,438,439],{},"{ path, layer }"," carries the name you give it. A probed directory is one layer, named ",[322,442,435],{},[313,444,445,446,448],{},"Outside Nuxt, declare a multi-layer project with ",[322,447,431],{},":",[450,451,457],"pre",{"className":452,"code":453,"filename":454,"language":455,"meta":456,"style":456},"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  defaultLocale: 'en',\n  localeDirs: [\n    { path: 'packages\u002Fui\u002Flocales', layer: 'ui' },\n    { path: 'apps\u002Fcheckout\u002Flocales', layer: 'checkout' },\n    { path: 'apps\u002Fadmin\u002Flocales', layer: 'admin' },\n  ],\n})\n","i18n-kit.config.ts","ts","",[322,458,459,492,499,517,537,548,584,615,646,654],{"__ignoreMap":456},[460,461,464,468,472,476,479,482,485,489],"span",{"class":462,"line":463},"line",1,[460,465,467],{"class":466},"s7zQu","import",[460,469,471],{"class":470},"sMK4o"," {",[460,473,475],{"class":474},"sTEyZ"," defineI18nKitConfig",[460,477,478],{"class":470}," }",[460,480,481],{"class":466}," from",[460,483,484],{"class":470}," '",[460,486,488],{"class":487},"sfazB","@the-i18n-kit\u002Fcli\u002Fconfig",[460,490,491],{"class":470},"'\n",[460,493,495],{"class":462,"line":494},2,[460,496,498],{"emptyLinePlaceholder":497},true,"\n",[460,500,502,505,508,511,514],{"class":462,"line":501},3,[460,503,504],{"class":466},"export",[460,506,507],{"class":466}," default",[460,509,475],{"class":510},"s2Zo4",[460,512,513],{"class":474},"(",[460,515,516],{"class":470},"{\n",[460,518,520,524,526,528,531,534],{"class":462,"line":519},4,[460,521,523],{"class":522},"swJcz","  defaultLocale",[460,525,448],{"class":470},[460,527,484],{"class":470},[460,529,530],{"class":487},"en",[460,532,533],{"class":470},"'",[460,535,536],{"class":470},",\n",[460,538,540,543,545],{"class":462,"line":539},5,[460,541,542],{"class":522},"  localeDirs",[460,544,448],{"class":470},[460,546,547],{"class":474}," [\n",[460,549,551,554,557,559,561,564,566,569,572,574,576,579,581],{"class":462,"line":550},6,[460,552,553],{"class":470},"    {",[460,555,556],{"class":522}," path",[460,558,448],{"class":470},[460,560,484],{"class":470},[460,562,563],{"class":487},"packages\u002Fui\u002Flocales",[460,565,533],{"class":470},[460,567,568],{"class":470},",",[460,570,571],{"class":522}," layer",[460,573,448],{"class":470},[460,575,484],{"class":470},[460,577,578],{"class":487},"ui",[460,580,533],{"class":470},[460,582,583],{"class":470}," },\n",[460,585,587,589,591,593,595,598,600,602,604,606,608,611,613],{"class":462,"line":586},7,[460,588,553],{"class":470},[460,590,556],{"class":522},[460,592,448],{"class":470},[460,594,484],{"class":470},[460,596,597],{"class":487},"apps\u002Fcheckout\u002Flocales",[460,599,533],{"class":470},[460,601,568],{"class":470},[460,603,571],{"class":522},[460,605,448],{"class":470},[460,607,484],{"class":470},[460,609,610],{"class":487},"checkout",[460,612,533],{"class":470},[460,614,583],{"class":470},[460,616,618,620,622,624,626,629,631,633,635,637,639,642,644],{"class":462,"line":617},8,[460,619,553],{"class":470},[460,621,556],{"class":522},[460,623,448],{"class":470},[460,625,484],{"class":470},[460,627,628],{"class":487},"apps\u002Fadmin\u002Flocales",[460,630,533],{"class":470},[460,632,568],{"class":470},[460,634,571],{"class":522},[460,636,448],{"class":470},[460,638,484],{"class":470},[460,640,641],{"class":487},"admin",[460,643,533],{"class":470},[460,645,583],{"class":470},[460,647,649,652],{"class":462,"line":648},9,[460,650,651],{"class":474},"  ]",[460,653,536],{"class":470},[460,655,657,660],{"class":462,"line":656},10,[460,658,659],{"class":470},"}",[460,661,662],{"class":474},")\n",[313,664,665,666,669,670,673],{},"A path that does not exist is a configuration error. Renaming a directory renames\nthe layer, so any ",[322,667,668],{},"layerRules"," or ",[322,671,672],{},"orphanScan"," entry keyed by the old name stops\nmatching.",[313,675,676],{},"Where one directory is reachable under two names, the kit deduplicates by real\npath: one entry owns it, the others become aliases. Reads resolve through an\nalias; anything that writes or could delete rejects an alias name and tells you\nthe owning layer.",[308,678,680],{"id":679},"which-apps-consume-which-layers","Which Apps Consume Which Layers",[313,682,683,684,687,688,691,692,695,696,699,700,706],{},"The ",[317,685,686],{},"consumer graph"," is the set of edges from apps to the layers they consume.\nEach app has a ",[322,689,690],{},"name"," and the ",[322,693,694],{},"layers"," it consumes in precedence order — earlier\nentries override later ones at runtime. A ",[317,697,698],{},"canonical layer"," owns its locale\ndirectory; a ",[701,702,703],"a",{"href":64},[317,704,705],{},"shared layer"," is one\nmore than one app consumes.",[313,708,709,710,713,714,669,717,720,721,724,725,536,728,731,732,735,736,739],{},"On Nuxt the edges are the layers each app extends. Everywhere else they are\ninferred from the package manager workspace: packages come from ",[322,711,712],{},"packages:"," in\n",[322,715,716],{},"pnpm-workspace.yaml",[322,718,719],{},"workspaces"," in the root ",[322,722,723],{},"package.json",", a package\nholding a locale directory owns that layer, and the ",[322,726,727],{},"dependencies",[322,729,730],{},"devDependencies"," and ",[322,733,734],{},"peerDependencies"," edges between those packages are the\nconsumption edges. A package no other one depends on becomes an app, and consumes\nits own layers plus those of its transitive dependencies. Outside a workspace, or\nwhere fewer than two apps come out, one app consumes every layer.\n",[322,737,738],{},"consumerGraph: 'off'"," turns the inference off.",[313,741,742,743,746],{},"Declaring ",[322,744,745],{},"apps"," overrides both:",[450,748,750],{"className":452,"code":749,"filename":454,"language":455,"meta":456,"style":456},"import { defineI18nKitConfig } from '@the-i18n-kit\u002Fcli\u002Fconfig'\n\nexport default defineI18nKitConfig({\n  apps: [\n    { name: 'checkout', layers: ['checkout', 'ui'] },\n    { name: 'admin', layers: ['admin', 'ui'] },\n  ],\n})\n",[322,751,752,770,774,786,795,840,880,886],{"__ignoreMap":456},[460,753,754,756,758,760,762,764,766,768],{"class":462,"line":463},[460,755,467],{"class":466},[460,757,471],{"class":470},[460,759,475],{"class":474},[460,761,478],{"class":470},[460,763,481],{"class":466},[460,765,484],{"class":470},[460,767,488],{"class":487},[460,769,491],{"class":470},[460,771,772],{"class":462,"line":494},[460,773,498],{"emptyLinePlaceholder":497},[460,775,776,778,780,782,784],{"class":462,"line":501},[460,777,504],{"class":466},[460,779,507],{"class":466},[460,781,475],{"class":510},[460,783,513],{"class":474},[460,785,516],{"class":470},[460,787,788,791,793],{"class":462,"line":519},[460,789,790],{"class":522},"  apps",[460,792,448],{"class":470},[460,794,547],{"class":474},[460,796,797,799,802,804,806,808,810,812,815,817,820,822,824,826,828,830,832,834,837],{"class":462,"line":539},[460,798,553],{"class":470},[460,800,801],{"class":522}," name",[460,803,448],{"class":470},[460,805,484],{"class":470},[460,807,610],{"class":487},[460,809,533],{"class":470},[460,811,568],{"class":470},[460,813,814],{"class":522}," layers",[460,816,448],{"class":470},[460,818,819],{"class":474}," [",[460,821,533],{"class":470},[460,823,610],{"class":487},[460,825,533],{"class":470},[460,827,568],{"class":470},[460,829,484],{"class":470},[460,831,578],{"class":487},[460,833,533],{"class":470},[460,835,836],{"class":474},"] ",[460,838,839],{"class":470},"},\n",[460,841,842,844,846,848,850,852,854,856,858,860,862,864,866,868,870,872,874,876,878],{"class":462,"line":550},[460,843,553],{"class":470},[460,845,801],{"class":522},[460,847,448],{"class":470},[460,849,484],{"class":470},[460,851,641],{"class":487},[460,853,533],{"class":470},[460,855,568],{"class":470},[460,857,814],{"class":522},[460,859,448],{"class":470},[460,861,819],{"class":474},[460,863,533],{"class":470},[460,865,641],{"class":487},[460,867,533],{"class":470},[460,869,568],{"class":470},[460,871,484],{"class":470},[460,873,578],{"class":487},[460,875,533],{"class":470},[460,877,836],{"class":474},[460,879,839],{"class":470},[460,881,882,884],{"class":462,"line":586},[460,883,651],{"class":474},[460,885,536],{"class":470},[460,887,888,890],{"class":462,"line":617},[460,889,659],{"class":470},[460,891,662],{"class":474},[313,893,894,896,897,900,901,904],{},[322,895,214],{}," reports the graph it ran on: ",[322,898,899],{},"consumedBy"," names the apps declaring each\nlayer, and ",[322,902,903],{},"summary.unconsumedLayers"," the scanned layers no app consumes — filled\nonly where the project has more than one app.",[308,906,908],{"id":907},"what-counts-as-usage","What Counts as Usage",[313,910,911,914,915,918],{},[317,912,913],{},"Usage counts only from the code of the apps that consume the layer."," At\nruntime only those apps can resolve the key, so a reference to\n",[322,916,917],{},"checkout.cart.title"," in an admin app that does not consume the checkout layer\nis evidence of a bug, not of a needed key.",[313,920,921,922,925],{},"A layer's scope is its own root, plus the root of every app that consumes it,\nplus any part of the repository outside every app — so a monorepo root holding\n",[322,923,924],{},"scripts\u002F"," counts for every layer. The orphan scan reports the effective scope\nper layer:",[450,927,931],{"className":928,"code":929,"language":930,"meta":456,"style":456},"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",[322,932,933,937,954,997,1017,1038,1043],{"__ignoreMap":456},[460,934,935],{"class":462,"line":463},[460,936,516],{"class":470},[460,938,939,942,946,949,951],{"class":462,"line":494},[460,940,941],{"class":470},"  \"",[460,943,945],{"class":944},"spNyl","scanScope",[460,947,948],{"class":470},"\"",[460,950,448],{"class":470},[460,952,953],{"class":470}," {\n",[460,955,956,959,962,964,966,968,970,973,975,977,980,983,985,987,989,992,994],{"class":462,"line":501},[460,957,958],{"class":470},"    \"",[460,960,421],{"class":961},"sBMFI",[460,963,948],{"class":470},[460,965,448],{"class":470},[460,967,819],{"class":470},[460,969,948],{"class":470},[460,971,972],{"class":487},".",[460,974,948],{"class":470},[460,976,568],{"class":470},[460,978,979],{"class":470}," \"",[460,981,982],{"class":487},"app-admin",[460,984,948],{"class":470},[460,986,568],{"class":470},[460,988,979],{"class":470},[460,990,991],{"class":487},"app-shop",[460,993,948],{"class":470},[460,995,996],{"class":470},"],\n",[460,998,999,1001,1003,1005,1007,1009,1011,1013,1015],{"class":462,"line":519},[460,1000,958],{"class":470},[460,1002,982],{"class":961},[460,1004,948],{"class":470},[460,1006,448],{"class":470},[460,1008,819],{"class":470},[460,1010,948],{"class":470},[460,1012,982],{"class":487},[460,1014,948],{"class":470},[460,1016,996],{"class":470},[460,1018,1019,1021,1023,1025,1027,1029,1031,1033,1035],{"class":462,"line":539},[460,1020,958],{"class":470},[460,1022,991],{"class":961},[460,1024,948],{"class":470},[460,1026,448],{"class":470},[460,1028,819],{"class":470},[460,1030,948],{"class":470},[460,1032,991],{"class":487},[460,1034,948],{"class":470},[460,1036,1037],{"class":470},"]\n",[460,1039,1040],{"class":462,"line":550},[460,1041,1042],{"class":470},"  }\n",[460,1044,1045],{"class":462,"line":586},[460,1046,1047],{"class":470},"}\n",[313,1049,1050,1051,1053,1054,1056,1057,972],{},"A key defined in ",[322,1052,982],{}," and referenced only from ",[322,1055,991],{}," is a\n",[701,1058,1059],{"href":68},"misplaced usage",[313,1061,1062],{},"Scoping only ever widens: with no app information, a layer no app consumes, or a\nsingle app, a layer is checked against the whole project.",[308,1064,1066],{"id":1065},"working-per-layer","Working Per Layer",[313,1068,1069,1072,1073,1075],{},[322,1070,1071],{},"--layer \u003Cname>"," narrows a run to one layer, checked against that layer's own\nscope; without it, every non-alias layer is checked in one pass. Reports are\nkeyed by layer, and so is ",[322,1074,672],{},", which declares the key families a layer\nbuilds at runtime:",[450,1077,1079],{"className":452,"code":1078,"filename":454,"language":455,"meta":456,"style":456},"import { defineI18nKitConfig } from '@the-i18n-kit\u002Fcli\u002Fconfig'\n\nexport default defineI18nKitConfig({\n  orphanScan: {\n    ui: { ignorePatterns: ['ui.icons.*'] },\n  },\n})\n",[322,1080,1081,1099,1103,1115,1124,1151,1156],{"__ignoreMap":456},[460,1082,1083,1085,1087,1089,1091,1093,1095,1097],{"class":462,"line":463},[460,1084,467],{"class":466},[460,1086,471],{"class":470},[460,1088,475],{"class":474},[460,1090,478],{"class":470},[460,1092,481],{"class":466},[460,1094,484],{"class":470},[460,1096,488],{"class":487},[460,1098,491],{"class":470},[460,1100,1101],{"class":462,"line":494},[460,1102,498],{"emptyLinePlaceholder":497},[460,1104,1105,1107,1109,1111,1113],{"class":462,"line":501},[460,1106,504],{"class":466},[460,1108,507],{"class":466},[460,1110,475],{"class":510},[460,1112,513],{"class":474},[460,1114,516],{"class":470},[460,1116,1117,1120,1122],{"class":462,"line":519},[460,1118,1119],{"class":522},"  orphanScan",[460,1121,448],{"class":470},[460,1123,953],{"class":470},[460,1125,1126,1129,1131,1133,1136,1138,1140,1142,1145,1147,1149],{"class":462,"line":539},[460,1127,1128],{"class":522},"    ui",[460,1130,448],{"class":470},[460,1132,471],{"class":470},[460,1134,1135],{"class":522}," ignorePatterns",[460,1137,448],{"class":470},[460,1139,819],{"class":474},[460,1141,533],{"class":470},[460,1143,1144],{"class":487},"ui.icons.*",[460,1146,533],{"class":470},[460,1148,836],{"class":474},[460,1150,839],{"class":470},[460,1152,1153],{"class":462,"line":550},[460,1154,1155],{"class":470},"  },\n",[460,1157,1158,1160],{"class":462,"line":586},[460,1159,659],{"class":470},[460,1161,662],{"class":474},[313,1163,1164,1165,669,1167,1169],{},"A name in ",[322,1166,745],{},[322,1168,672],{}," matching no detected layer applies to nothing,\nso the CLI warns on stderr and lists the layers it did detect.",[313,1171,1172,1174,1175,972],{},[322,1173,668],{}," is the other per-layer key: guidance an agent reads, never routing\nthe tool performs. See the ",[701,1176,1178],{"href":1177},"\u002Fconfiguration\u002Freference#layerrules","field reference",[1180,1181,1182],"style",{},"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 .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}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}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 .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}",{"title":456,"searchDepth":501,"depth":501,"links":1184},[1185,1186,1187,1188,1189],{"id":310,"depth":494,"text":311},{"id":388,"depth":494,"text":389},{"id":679,"depth":494,"text":680},{"id":907,"depth":494,"text":908},{"id":1065,"depth":494,"text":1066},"md",null,{},{"description":1194,"title":59},"What a layer is, where layer names come from in each framework, which apps consume which layers, and why usage in a non-consuming app is not evidence a key is used.","ullPdTKoW1S6c2leU4-pr93UESUSlC6Kv0mdCOm2Roc",[1197,1198],{"title":50,"path":51,"stem":52,"description":456,"children":-1},{"title":63,"path":64,"stem":65,"description":456,"children":-1},1789062605942]