[{"data":1,"prerenderedAt":805},["ShallowReactive",2],{"navigation_docs":3,"-getting-started-harness-integrations":302,"-getting-started-harness-integrations-surround":802},[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":50,"body":304,"description":332,"extension":796,"links":797,"meta":798,"navigation":690,"path":51,"seo":799,"stem":52,"__hash__":801},"docs\u002F2.getting-started\u002F4.harness-integrations.md",{"type":305,"value":306,"toc":788},"minimark",[307,315,320,323,333,336,415,438,441,475,480,483,576,583,586,603,606,612,618,629,632,647,653,660,664,674,741,754,758,763,781,784],[308,309,310,311,314],"p",{},"The MCP server gives every host the same tools. What differs per host is\nenforcement: a model that knows about ",[312,313,291],"code",{}," will still reach for\nits file editor under pressure, and nothing in the protocol stops it. Hosts with\na hook system can stop it. Hosts without one get the rules as context, and CI\nstays the backstop.",[316,317,319],"h2",{"id":318},"claude-code","Claude Code",[308,321,322],{},"The repository doubles as a plugin marketplace:",[324,325,330],"pre",{"className":326,"code":328,"language":329},[327],"language-text","\u002Fplugin marketplace add fabkho\u002Fthe-i18n-kit\n\u002Fplugin install the-i18n-kit@the-i18n-kit\n","text",[312,331,328],{"__ignoreMap":332},"",[308,334,335],{},"One plugin, four components:",[337,338,339,352],"table",{},[340,341,342],"thead",{},[343,344,345,349],"tr",{},[346,347,348],"th",{},"Component",[346,350,351],{},"What it does",[353,354,355,375,391,402],"tbody",{},[343,356,357,361],{},[358,359,360],"td",{},"MCP server",[358,362,363,366,367,370,371,374],{},[312,364,365],{},"the-i18n-kit"," over stdio via ",[312,368,369],{},"npx @the-i18n-kit\u002Fmcp@latest"," — the same server ",[372,373,38],"a",{"href":39}," configures by hand",[343,376,377,380],{},[358,378,379],{},"PreToolUse hook",[358,381,382,383,386,387,390],{},"Denies ",[312,384,385],{},"Edit"," and ",[312,388,389],{},"Write"," on files inside a locale directory, and answers with the tools to use instead. One hand-edited locale silently drifts from its siblings; the tools keep every locale consistent",[343,392,393,396],{},[358,394,395],{},"Stop hook",[358,397,398,399,401],{},"Runs ",[312,400,170],{}," before the agent finishes. Keys referenced in code but defined in no consumed layer render as raw keys in production, so findings block the stop with the key names and the agent fixes them in-session instead of leaving them for CI",[343,403,404,407],{},[358,405,406],{},"Skill",[358,408,409,410,412,413],{},"The workflow as guidance: orient with ",[312,411,174],{},", read before writing, write through tools, verify with ",[312,414,247],{},[308,416,417,418,421,422,425,426,429,430,433,434,437],{},"Both hooks decide by walking up from the working directory to the nearest\n",[312,419,420],{},".i18n-mcp.json"," or ",[312,423,424],{},"i18n-kit.config.*",". No config file, no opinion: outside a\nkit project they exit silently, so the plugin is safe to keep enabled globally.\nThey resolve ",[312,427,428],{},"the-i18n-cli"," from the project's ",[312,431,432],{},"node_modules"," first, then a\nglobal install, then ",[312,435,436],{},"npx"," — and on any infrastructure failure they allow rather\nthan block.",[308,439,440],{},"Two environment variables switch the enforcement off when you mean to bypass it:",[337,442,443,453],{},[340,444,445],{},[343,446,447,450],{},[346,448,449],{},"Variable",[346,451,452],{},"Effect",[353,454,455,465],{},[343,456,457,462],{},[358,458,459],{},[312,460,461],{},"I18N_KIT_ALLOW_DIRECT_EDITS=1",[358,463,464],{},"The locale-file guard stands down",[343,466,467,472],{},[358,468,469],{},[312,470,471],{},"I18N_KIT_SKIP_CHECK=1",[358,473,474],{},"The stop gate stands down",[476,477,479],"h3",{"id":478},"status-line","Status Line",[308,481,482],{},"Claude Code plugins cannot ship a status line, so coverage in the footer is one\nmanual step. The plugin carries the script; point your user settings at it:",[324,484,489],{"className":485,"code":486,"filename":487,"language":488,"meta":332,"style":332},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"statusLine\": {\n    \"type\": \"command\",\n    \"command\": \"bash \u002Fpath\u002Fto\u002Fthe-i18n-kit\u002Fintegrations\u002Fclaude-code\u002Fstatusline\u002Fi18n-statusline.sh\"\n  }\n}\n","~\u002F.claude\u002Fsettings.json","json",[312,490,491,500,519,545,564,570],{"__ignoreMap":332},[492,493,496],"span",{"class":494,"line":495},"line",1,[492,497,499],{"class":498},"sMK4o","{\n",[492,501,503,506,510,513,516],{"class":494,"line":502},2,[492,504,505],{"class":498},"  \"",[492,507,509],{"class":508},"spNyl","statusLine",[492,511,512],{"class":498},"\"",[492,514,515],{"class":498},":",[492,517,518],{"class":498}," {\n",[492,520,522,525,529,531,533,536,540,542],{"class":494,"line":521},3,[492,523,524],{"class":498},"    \"",[492,526,528],{"class":527},"sBMFI","type",[492,530,512],{"class":498},[492,532,515],{"class":498},[492,534,535],{"class":498}," \"",[492,537,539],{"class":538},"sfazB","command",[492,541,512],{"class":498},[492,543,544],{"class":498},",\n",[492,546,548,550,552,554,556,558,561],{"class":494,"line":547},4,[492,549,524],{"class":498},[492,551,539],{"class":527},[492,553,512],{"class":498},[492,555,515],{"class":498},[492,557,535],{"class":498},[492,559,560],{"class":538},"bash \u002Fpath\u002Fto\u002Fthe-i18n-kit\u002Fintegrations\u002Fclaude-code\u002Fstatusline\u002Fi18n-statusline.sh",[492,562,563],{"class":498},"\"\n",[492,565,567],{"class":494,"line":566},5,[492,568,569],{"class":498},"  }\n",[492,571,573],{"class":494,"line":572},6,[492,574,575],{"class":498},"}\n",[308,577,578,579,582],{},"It prints per-locale coverage — ",[312,580,581],{},"🌐 de 100% · es 75% · fr 92% · 4 missing"," —\ncached for a minute per project, and prints nothing outside kit projects, so it\ncomposes with a status line you already have.",[316,584,585],{"id":585},"pi",[324,587,591],{"className":588,"code":589,"language":590,"meta":332,"style":332},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","pi install npm:@the-i18n-kit\u002Fpi\n","bash",[312,592,593],{"__ignoreMap":332},[492,594,595,597,600],{"class":494,"line":495},[492,596,585],{"class":527},[492,598,599],{"class":538}," install",[492,601,602],{"class":538}," npm:@the-i18n-kit\u002Fpi\n",[308,604,605],{},"An extension rather than hooks: a widget by the editor that shows change, never\nstate.",[324,607,610],{"className":608,"code":609,"language":329},[327],"🌐 4 keys missing · es-ES 3 · fr-FR 1\n🌐 ⠹ ▕██████░░░░░░▏ es-ES: batch 1\u002F1 3\u002F6\n🌐 es-ES +3 · fr-FR +1 · ⚠ fr-FR dropped {count}\n🌐 2 undefined keys · checkout.payNow, cart.empty\n",[312,611,609],{"__ignoreMap":332},[308,613,614,615,617],{},"A finished run is reported from its own result rather than from the totals:\nwhich locales moved, which translation dropped a placeholder — a broken string\nin front of a user — and which locales were left alone because they are\nprotected, since three fewer locales than you asked for reads as failure until\nit is named. After a turn that edited source, ",[312,616,170],{}," runs: keys the code calls\nand no layer defines render raw in production, and the moment the edit lands is\nthe cheapest moment to hear about them.",[308,619,620,621,624,625,628],{},"Coverage is also published as a host status — ",[312,622,623],{},"🌐 4 missing",", ",[312,626,627],{},"🌐 ✓"," — which\nhosts with a footer render there. That is the standing fact the widget will not\nkeep on screen: a transient line suits change, a footer suits state, and each\nsurface gets the half it is good at.",[308,630,631],{},"The same figure is readable in-process, so a theme or another extension can put\nit wherever that setup actually looks — an editor border, a tmux status line —\nwithout this package knowing anything about it.",[308,633,634,635,638,639,642,643,646],{},"Colours are the theme's own — ",[312,636,637],{},"warning"," while work is outstanding, ",[312,640,641],{},"success","\nonce it is done — so the widget matches whatever theme you run rather than\nintroducing a palette. The bar tracks real progress notifications and the\nspinner turns only while a tool is running; ",[312,644,645],{},"I18N_KIT_WIDGET_STYLE=plain"," turns\nboth off.",[308,648,649,650,652],{},"It mentions outstanding work when you sit down, follows a ",[312,651,287],{},"\nrun batch by batch instead of leaving a spinner with nothing behind it, reports\nwhat moved when the run ends — and then withdraws. A project with nothing\nmissing gets no widget at all.",[308,654,655,656,659],{},"The reason is that a permanent line is an unread line. \"Complete\" says the same\nthing whether or not you have touched translations all day, and a missing count\nthat has not moved in a week is wallpaper; worse, a percentage in a large\nproject is pinned near 100 and moves in the third decimal, looking like a gauge\nwhile behaving like a constant. So the widget reports counts, briefly, and\n",[312,657,658],{},"\u002Fi18n-coverage"," answers in full — percentages, per locale — when you actually\nask. Like every other piece here it is silent outside kit projects.",[316,661,663],{"id":662},"codex-and-other-hosts","Codex and Other Hosts",[308,665,666,667,669,670,673],{},"Codex CLI has no hook system, so the same rules travel as context instead of\nenforcement. The server block is on\n",[372,668,38],{"href":39},"; next to it, put the rules\nwhere your host reads them — ",[312,671,672],{},"AGENTS.md"," for Codex:",[324,675,679],{"className":676,"code":677,"filename":672,"language":678,"meta":332,"style":332},"language-markdown shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","## Translations\n\nThis project manages translations with the-i18n-kit (MCP server `the-i18n-kit`).\n\n- Never edit locale files directly — one edited locale drifts from its\n  siblings. Use `write_translations`, `translate_missing`, `translate_key`,\n  `remove_translations`, `move_translation_key`.\n- Start with `discover` to see locales, layers and the translation mode.\n- Before finishing work that touched UI code, run `find_undefined_keys`;\n  undefined keys render raw in production.\n- Respect protected locales and preserve `{placeholders}` exactly.\n","markdown",[312,680,681,686,692,697,701,706,711,717,723,729,735],{"__ignoreMap":332},[492,682,683],{"class":494,"line":495},[492,684,685],{},"## Translations\n",[492,687,688],{"class":494,"line":502},[492,689,691],{"emptyLinePlaceholder":690},true,"\n",[492,693,694],{"class":494,"line":521},[492,695,696],{},"This project manages translations with the-i18n-kit (MCP server `the-i18n-kit`).\n",[492,698,699],{"class":494,"line":547},[492,700,691],{"emptyLinePlaceholder":690},[492,702,703],{"class":494,"line":566},[492,704,705],{},"- Never edit locale files directly — one edited locale drifts from its\n",[492,707,708],{"class":494,"line":572},[492,709,710],{},"  siblings. Use `write_translations`, `translate_missing`, `translate_key`,\n",[492,712,714],{"class":494,"line":713},7,[492,715,716],{},"  `remove_translations`, `move_translation_key`.\n",[492,718,720],{"class":494,"line":719},8,[492,721,722],{},"- Start with `discover` to see locales, layers and the translation mode.\n",[492,724,726],{"class":494,"line":725},9,[492,727,728],{},"- Before finishing work that touched UI code, run `find_undefined_keys`;\n",[492,730,732],{"class":494,"line":731},10,[492,733,734],{},"  undefined keys render raw in production.\n",[492,736,738],{"class":494,"line":737},11,[492,739,740],{},"- Respect protected locales and preserve `{placeholders}` exactly.\n",[308,742,743,744,746,747,749,750,753],{},"Context is advice, and advice gets ignored. What the Stop hook enforces\nin-session, the pipeline enforces on every push: ",[312,745,170],{}," exits non-zero on\nfindings, wired through the ",[372,748,295],{"href":141}," or the\n",[372,751,752],{"href":145},"GitLab CI template",". A host without hooks loses the\nin-session correction, never the gate.",[316,755,757],{"id":756},"long-running-tools","Long-Running Tools",[308,759,760,762],{},[312,761,287],{}," reports progress over MCP progress notifications — batch by\nbatch, locale by locale — but only when the host asks for it, and hosts differ:",[764,765,766,773,778],"ul",{},[767,768,769,772],"li",{},[770,771,319],"strong",{}," requests progress and uses it to keep long calls alive; how\nmuch of it reaches the screen depends on the Claude Code version.",[767,774,775,777],{},[770,776,585],{}," with pi-mcp-adapter's progress bridge renders each notification as a\nlive partial result on the running tool call.",[767,779,780],{},"Hosts that request no progress get none — the server sends nothing rather\nthan degrading the call.",[308,782,783],{},"The server side is the same in every case; a host upgrade is all it takes for\nprogress to appear.",[785,786,787],"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);}",{"title":332,"searchDepth":521,"depth":521,"links":789},[790,793,794,795],{"id":318,"depth":502,"text":319,"children":791},[792],{"id":478,"depth":521,"text":479},{"id":585,"depth":502,"text":585},{"id":662,"depth":502,"text":663},{"id":756,"depth":502,"text":757},"md",null,{},{"description":800,"title":50},"The Claude Code plugin with locale-file guardrails and an undefined-keys gate, the conventions block for Codex and other hosts, and where CI remains the enforcement.","eZqcZ_urGYsWTH2Hn2j2bAYJYMqMcjeQSFT0goYdbok",[803,804],{"title":46,"path":47,"stem":48,"description":332,"children":-1},{"title":59,"path":60,"stem":61,"description":332,"children":-1},1789062605942]