@the-i18n-kit/cli 4.10.0 → 5.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (83) hide show
  1. package/README.md +29 -296
  2. package/dist/{_shared-Dn15c_g9.js → _shared-DFyy3sh8.js} +24 -12
  3. package/dist/_shared-DFyy3sh8.js.map +1 -0
  4. package/dist/{add-Dj6hsdl9.js → add-C-qs8iBa.js} +5 -5
  5. package/dist/{add-Dj6hsdl9.js.map → add-C-qs8iBa.js.map} +1 -1
  6. package/dist/bin.js +1 -1
  7. package/dist/{check-BI-CGxpY.js → check-BI1orjXb.js} +11 -19
  8. package/dist/check-BI1orjXb.js.map +1 -0
  9. package/dist/cli-DsFuVJNP.js +74 -0
  10. package/dist/cli-DsFuVJNP.js.map +1 -0
  11. package/dist/config/framework/stubs/{next-intl-routing-Se7Y8cCb.d.ts → next-intl-routing-Cwaa3f4R.d.ts} +1 -1
  12. package/dist/config/framework/stubs/{next-intl-routing-Se7Y8cCb.d.ts.map → next-intl-routing-Cwaa3f4R.d.ts.map} +1 -1
  13. package/dist/config/framework/stubs/{unplugin-vue-i18n-DrR5pbEW.d.ts → unplugin-vue-i18n-1ud7-Ly8.d.ts} +1 -1
  14. package/dist/config/framework/stubs/{unplugin-vue-i18n-DrR5pbEW.d.ts.map → unplugin-vue-i18n-1ud7-Ly8.d.ts.map} +1 -1
  15. package/dist/define-config-4ubtfvUy.js.map +1 -1
  16. package/dist/{define-config-DpbZ4BZ6.d.ts → define-config-BaZ1dZph.d.ts} +11 -4
  17. package/dist/define-config-BaZ1dZph.d.ts.map +1 -0
  18. package/dist/{define-config-BSsvRnWR.d.ts → define-config-CLgKN-7N.d.ts} +1 -1
  19. package/dist/define-config.d.ts +1 -1
  20. package/dist/{detect-BmvyRD1a.js → detect-7cVfsNJP.js} +5 -5
  21. package/dist/{detect-BmvyRD1a.js.map → detect-7cVfsNJP.js.map} +1 -1
  22. package/dist/{empty-Ww6FnmgY.js → empty-DB8Hl_8u.js} +5 -5
  23. package/dist/{empty-Ww6FnmgY.js.map → empty-DB8Hl_8u.js.map} +1 -1
  24. package/dist/find-duplicates-CmEqBfby.js +42 -0
  25. package/dist/find-duplicates-CmEqBfby.js.map +1 -0
  26. package/dist/{get-oF_xIbVR.js → get-BE21Iy6N.js} +5 -5
  27. package/dist/{get-oF_xIbVR.js.map → get-BE21Iy6N.js.map} +1 -1
  28. package/dist/{index-JeU02vfH.d.ts → index-DCG3dOdC.d.ts} +332 -3
  29. package/dist/index-DCG3dOdC.d.ts.map +1 -0
  30. package/dist/index.d.ts +1 -1
  31. package/dist/index.js +4 -4
  32. package/dist/{init-D4B1_DXb.js → init-BtzmhsOM.js} +5 -5
  33. package/dist/{init-D4B1_DXb.js.map → init-BtzmhsOM.js.map} +1 -1
  34. package/dist/{list-dirs-CgXh-Lg1.js → list-dirs-DUQbwvlE.js} +5 -5
  35. package/dist/{list-dirs-CgXh-Lg1.js.map → list-dirs-DUQbwvlE.js.map} +1 -1
  36. package/dist/{missing-BZT6PgW5.js → missing-CcYrgd54.js} +5 -5
  37. package/dist/{missing-BZT6PgW5.js.map → missing-CcYrgd54.js.map} +1 -1
  38. package/dist/move-B2px6Ck-.js +50 -0
  39. package/dist/move-B2px6Ck-.js.map +1 -0
  40. package/dist/{operations-BCJd7in3.js → operations-CTo44gPu.js} +1332 -241
  41. package/dist/operations-CTo44gPu.js.map +1 -0
  42. package/dist/php-reader-3Fgw80zK.js +64 -0
  43. package/dist/php-reader-3Fgw80zK.js.map +1 -0
  44. package/dist/php-reader-CpnaPSpZ.js +2 -0
  45. package/dist/{providers-BAwPjeCy.js → providers-CHE2ffi6.js} +53 -27
  46. package/dist/providers-CHE2ffi6.js.map +1 -0
  47. package/dist/{remove-B7m-hi2O.js → remove-DTbqM4bR.js} +5 -5
  48. package/dist/{remove-B7m-hi2O.js.map → remove-DTbqM4bR.js.map} +1 -1
  49. package/dist/{remove-orphans-DOTWE7Ji.js → remove-orphans-Dfzu7hRz.js} +5 -5
  50. package/dist/{remove-orphans-DOTWE7Ji.js.map → remove-orphans-Dfzu7hRz.js.map} +1 -1
  51. package/dist/{rename-DEJWj5_P.js → rename-C_rFKkU4.js} +5 -5
  52. package/dist/{rename-DEJWj5_P.js.map → rename-C_rFKkU4.js.map} +1 -1
  53. package/dist/{scaffold-BH_OX-5z.js → scaffold-CUimlNqR.js} +5 -5
  54. package/dist/{scaffold-BH_OX-5z.js.map → scaffold-CUimlNqR.js.map} +1 -1
  55. package/dist/{scan-LeU4xG0G.js → scan-BkOIYhjZ.js} +5 -5
  56. package/dist/{scan-LeU4xG0G.js.map → scan-BkOIYhjZ.js.map} +1 -1
  57. package/dist/{search-CHdDywqc.js → search-0io1BcsY.js} +5 -5
  58. package/dist/{search-CHdDywqc.js.map → search-0io1BcsY.js.map} +1 -1
  59. package/dist/{status-CwI94d_R.js → status-Bp-SzjTN.js} +5 -5
  60. package/dist/{status-CwI94d_R.js.map → status-Bp-SzjTN.js.map} +1 -1
  61. package/dist/{translate-Cf3npNpr.js → translate-cCb2Z57w.js} +6 -6
  62. package/dist/{translate-Cf3npNpr.js.map → translate-cCb2Z57w.js.map} +1 -1
  63. package/dist/{translate-key-Bg_8B6c_.js → translate-key-DHLWEmrA.js} +5 -5
  64. package/dist/{translate-key-Bg_8B6c_.js.map → translate-key-DHLWEmrA.js.map} +1 -1
  65. package/dist/{update-DNv-dU1U.js → update-DV4ijRVB.js} +5 -5
  66. package/dist/{update-DNv-dU1U.js.map → update-DV4ijRVB.js.map} +1 -1
  67. package/dist/{write-DUwMSc75.js → write-Czzm_Nb0.js} +5 -5
  68. package/dist/{write-DUwMSc75.js.map → write-Czzm_Nb0.js.map} +1 -1
  69. package/package.json +15 -5
  70. package/dist/_shared-Dn15c_g9.js.map +0 -1
  71. package/dist/check-BI-CGxpY.js.map +0 -1
  72. package/dist/cli-CDhNbaUM.js +0 -82
  73. package/dist/cli-CDhNbaUM.js.map +0 -1
  74. package/dist/define-config-DpbZ4BZ6.d.ts.map +0 -1
  75. package/dist/find-duplicates-BfBBqP7I.js +0 -31
  76. package/dist/find-duplicates-BfBBqP7I.js.map +0 -1
  77. package/dist/index-JeU02vfH.d.ts.map +0 -1
  78. package/dist/operations-BCJd7in3.js.map +0 -1
  79. package/dist/php-reader-DcgOAhTw.js +0 -2
  80. package/dist/php-reader-DuZ0Hyl_.js +0 -32
  81. package/dist/php-reader-DuZ0Hyl_.js.map +0 -1
  82. package/dist/providers-BAwPjeCy.js.map +0 -1
  83. /package/dist/{bin-CF8fSc-R.d.ts → bin-DrKRgnr9.d.ts} +0 -0
@@ -0,0 +1,74 @@
1
+ import "./stdout-guard-sJHFWVem.js";
2
+ import "./providers-CHE2ffi6.js";
3
+ import { n as emitErrorResult } from "./_shared-DFyy3sh8.js";
4
+ import { createRequire } from "node:module";
5
+ import { defineCommand, runCommand, runMain } from "citty";
6
+ //#region src/commands/index.ts
7
+ const command = (load) => ({ load: () => load().then((m) => m.default) });
8
+ const hidden = (load) => ({
9
+ ...command(load),
10
+ hidden: true
11
+ });
12
+ const commands$1 = {
13
+ "init": command(() => import("./init-BtzmhsOM.js")),
14
+ "detect": hidden(() => import("./detect-7cVfsNJP.js")),
15
+ "list-dirs": hidden(() => import("./list-dirs-DUQbwvlE.js")),
16
+ "get": command(() => import("./get-BE21Iy6N.js")),
17
+ "write": command(() => import("./write-Czzm_Nb0.js")),
18
+ "add": command(() => import("./add-C-qs8iBa.js")),
19
+ "update": command(() => import("./update-DV4ijRVB.js")),
20
+ "missing": command(() => import("./missing-CcYrgd54.js")),
21
+ "status": command(() => import("./status-Bp-SzjTN.js")),
22
+ "empty": hidden(() => import("./empty-DB8Hl_8u.js")),
23
+ "search": command(() => import("./search-0io1BcsY.js")),
24
+ "remove": command(() => import("./remove-DTbqM4bR.js")),
25
+ "rename": command(() => import("./rename-C_rFKkU4.js")),
26
+ "move": command(() => import("./move-B2px6Ck-.js")),
27
+ "translate": command(() => import("./translate-cCb2Z57w.js")),
28
+ "translate-missing": { load: () => import("./translate-cCb2Z57w.js").then((m) => {
29
+ const def = m.default;
30
+ return {
31
+ ...def,
32
+ meta: {
33
+ ...def.meta,
34
+ name: "translate-missing",
35
+ description: "Alias of \"translate\" — matches the MCP tool translate_missing."
36
+ }
37
+ };
38
+ }) },
39
+ "translate-key": command(() => import("./translate-key-DHLWEmrA.js")),
40
+ "scan": command(() => import("./scan-BkOIYhjZ.js")),
41
+ "check": command(() => import("./check-BI1orjXb.js")),
42
+ "find-duplicates": command(() => import("./find-duplicates-CmEqBfby.js")),
43
+ "remove-orphans": command(() => import("./remove-orphans-Dfzu7hRz.js")),
44
+ "scaffold": command(() => import("./scaffold-CUimlNqR.js"))
45
+ };
46
+ //#endregion
47
+ //#region src/cli.ts
48
+ const commands = Object.fromEntries(Object.entries(commands$1).filter(([, entry]) => !entry.hidden).map(([name, entry]) => [name, entry.load]));
49
+ const { version, description } = createRequire(import.meta.url)("../package.json");
50
+ const main = defineCommand({
51
+ meta: {
52
+ name: "the-i18n-cli",
53
+ version,
54
+ description
55
+ },
56
+ subCommands: commands
57
+ });
58
+ async function runCli() {
59
+ const rawArgs = process.argv.slice(2);
60
+ if (rawArgs.includes("--help") || rawArgs.includes("-h") || rawArgs.includes("--version") || rawArgs.includes("-v")) {
61
+ await runMain(main);
62
+ return;
63
+ }
64
+ try {
65
+ await runCommand(main, { rawArgs });
66
+ } catch (error) {
67
+ emitErrorResult(error, { json: rawArgs.includes("--json") });
68
+ process.exitCode = 1;
69
+ }
70
+ }
71
+ //#endregion
72
+ export { runCli };
73
+
74
+ //# sourceMappingURL=cli-DsFuVJNP.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-DsFuVJNP.js","names":["commands","allCommands"],"sources":["../src/commands/index.ts","../src/cli.ts"],"sourcesContent":["import type { CommandDef } from 'citty'\n\n/**\n * A registered command: its lazy loader, and whether the CLI exposes it.\n *\n * `hidden` sits on the entry rather than in a separate set so that adding a\n * command is one edit and the default is to be reachable. The set it replaced\n * lived in `cli.ts`, out of sight of anyone adding a command here, and the one\n * time it and the registry disagreed a documented command became uninvokable\n * (#307).\n */\nexport interface CommandEntry {\n load: () => Promise<CommandDef>\n /**\n * Kept out of the executed map, not merely out of `--help`: a hidden name\n * cannot be invoked at all. Only for operations reachable another way —\n * `discover` covers `detect` and `list-dirs`, `find_empty_translations`\n * covers `empty` (#252). A command with no other route must stay exposed.\n */\n hidden?: true\n}\n\nconst command = (load: () => Promise<{ default: unknown }>): CommandEntry => ({\n load: () => load().then(m => m.default as CommandDef),\n})\n\nconst hidden = (load: () => Promise<{ default: unknown }>): CommandEntry => ({\n ...command(load),\n hidden: true,\n})\n\nexport const commands = {\n 'init': command(() => import('./init.js')),\n 'detect': hidden(() => import('./detect.js')),\n 'list-dirs': hidden(() => import('./list-dirs.js')),\n 'get': command(() => import('./get.js')),\n 'write': command(() => import('./write.js')),\n 'add': command(() => import('./add.js')),\n 'update': command(() => import('./update.js')),\n 'missing': command(() => import('./missing.js')),\n 'status': command(() => import('./status.js')),\n 'empty': hidden(() => import('./empty.js')),\n 'search': command(() => import('./search.js')),\n 'remove': command(() => import('./remove.js')),\n 'rename': command(() => import('./rename.js')),\n 'move': command(() => import('./move.js')),\n 'translate': command(() => import('./translate.js')),\n // Alias: same operation as `translate`, named to match the MCP tool\n // translate_missing so docs can use one name across both surfaces.\n 'translate-missing': {\n load: () => import('./translate.js').then((m) => {\n const def = m.default as CommandDef\n return {\n ...def,\n meta: { ...(def.meta as object), name: 'translate-missing', description: 'Alias of \"translate\" — matches the MCP tool translate_missing.' },\n } as CommandDef\n }),\n },\n 'translate-key': command(() => import('./translate-key.js')),\n // Deliberately exposed: key-usage scanning has no other route on either\n // surface, so hiding it made a documented command unreachable (#307).\n 'scan': command(() => import('./scan.js')),\n 'check': command(() => import('./check.js')),\n 'find-duplicates': command(() => import('./find-duplicates.js')),\n 'remove-orphans': command(() => import('./remove-orphans.js')),\n 'scaffold': command(() => import('./scaffold.js')),\n} as const satisfies Record<string, CommandEntry>\n\n/** The names the CLI wires into citty — everything not marked hidden. */\nexport function exposedCommandNames(): string[] {\n return Object.entries(commands)\n .filter(([, entry]) => !(entry as CommandEntry).hidden)\n .map(([name]) => name)\n}\n","import { createRequire } from 'node:module'\nimport { defineCommand, runCommand, runMain } from 'citty'\nimport { commands as allCommands } from './commands/index.js'\nimport type { CommandEntry } from './commands/index.js'\nimport { emitErrorResult } from './commands/_shared.js'\n\n// Which commands are hidden is declared on the registry entries themselves, so\n// there is no second list here to fall out of step with it (#370).\nconst commands = Object.fromEntries(\n Object.entries(allCommands as Record<string, CommandEntry>)\n .filter(([, entry]) => !entry.hidden)\n .map(([name, entry]) => [name, entry.load]),\n)\n\nconst require = createRequire(import.meta.url)\nconst { version, description } = require('../package.json') as { version: string; description: string }\n\nconst main = defineCommand({\n meta: {\n name: 'the-i18n-cli',\n version,\n description,\n },\n subCommands: commands,\n})\n\nexport async function runCli(): Promise<void> {\n const rawArgs = process.argv.slice(2)\n\n // Let citty handle --help and --version natively (pretty-printed usage)\n if (rawArgs.includes('--help') || rawArgs.includes('-h')\n || rawArgs.includes('--version') || rawArgs.includes('-v')) {\n await runMain(main)\n return\n }\n\n // For normal execution, use runCommand so we control error output.\n // Command run() errors are handled inside createCommand; this catch only\n // sees pre-run failures (unknown command, argument parsing) — those must\n // also keep stdout parseable in JSON mode.\n try {\n await runCommand(main, { rawArgs })\n } catch (error: unknown) {\n emitErrorResult(error, { json: rawArgs.includes('--json') })\n process.exitCode = 1\n }\n}\n"],"mappings":";;;;;;AAsBA,MAAM,WAAW,UAA6D,EAC5E,YAAY,MAAM,CAAC,MAAK,MAAK,EAAE,QAAsB,EACtD;AAED,MAAM,UAAU,UAA6D;CAC3E,GAAG,QAAQ,KAAK;CAChB,QAAQ;CACT;AAED,MAAaA,aAAW;CACtB,QAAQ,cAAc,OAAO,sBAAa;CAC1C,UAAU,aAAa,OAAO,wBAAe;CAC7C,aAAa,aAAa,OAAO,2BAAkB;CACnD,OAAO,cAAc,OAAO,qBAAY;CACxC,SAAS,cAAc,OAAO,uBAAc;CAC5C,OAAO,cAAc,OAAO,qBAAY;CACxC,UAAU,cAAc,OAAO,wBAAe;CAC9C,WAAW,cAAc,OAAO,yBAAgB;CAChD,UAAU,cAAc,OAAO,wBAAe;CAC9C,SAAS,aAAa,OAAO,uBAAc;CAC3C,UAAU,cAAc,OAAO,wBAAe;CAC9C,UAAU,cAAc,OAAO,wBAAe;CAC9C,UAAU,cAAc,OAAO,wBAAe;CAC9C,QAAQ,cAAc,OAAO,sBAAa;CAC1C,aAAa,cAAc,OAAO,2BAAkB;CAGpD,qBAAqB,EACnB,YAAY,OAAO,2BAAkB,MAAM,MAAM;EAC/C,MAAM,MAAM,EAAE;AACd,SAAO;GACL,GAAG;GACH,MAAM;IAAE,GAAI,IAAI;IAAiB,MAAM;IAAqB,aAAa;IAAkE;GAC5I;GACD,EACH;CACD,iBAAiB,cAAc,OAAO,+BAAsB;CAG5D,QAAQ,cAAc,OAAO,sBAAa;CAC1C,SAAS,cAAc,OAAO,uBAAc;CAC5C,mBAAmB,cAAc,OAAO,iCAAwB;CAChE,kBAAkB,cAAc,OAAO,gCAAuB;CAC9D,YAAY,cAAc,OAAO,0BAAiB;CACnD;;;AC1DD,MAAM,WAAW,OAAO,YACtB,OAAO,QAAQC,WAA4C,CACxD,QAAQ,GAAG,WAAW,CAAC,MAAM,OAAO,CACpC,KAAK,CAAC,MAAM,WAAW,CAAC,MAAM,MAAM,KAAK,CAAC,CAC9C;AAGD,MAAM,EAAE,SAAS,gBADD,cAAc,OAAO,KAAK,IAAI,CACL,kBAAkB;AAE3D,MAAM,OAAO,cAAc;CACzB,MAAM;EACJ,MAAM;EACN;EACA;EACD;CACD,aAAa;CACd,CAAC;AAEF,eAAsB,SAAwB;CAC5C,MAAM,UAAU,QAAQ,KAAK,MAAM,EAAE;AAGrC,KAAI,QAAQ,SAAS,SAAS,IAAI,QAAQ,SAAS,KAAK,IACnD,QAAQ,SAAS,YAAY,IAAI,QAAQ,SAAS,KAAK,EAAE;AAC5D,QAAM,QAAQ,KAAK;AACnB;;AAOF,KAAI;AACF,QAAM,WAAW,MAAM,EAAE,SAAS,CAAC;UAC5B,OAAgB;AACvB,kBAAgB,OAAO,EAAE,MAAM,QAAQ,SAAS,SAAS,EAAE,CAAC;AAC5D,UAAQ,WAAW"}
@@ -16,4 +16,4 @@
16
16
  declare function defineRouting<T>(config: T): T;
17
17
  //#endregion
18
18
  export { defineRouting as default, defineRouting };
19
- //# sourceMappingURL=next-intl-routing-Se7Y8cCb.d.ts.map
19
+ //# sourceMappingURL=next-intl-routing-Cwaa3f4R.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"next-intl-routing-Se7Y8cCb.d.ts","names":[],"sources":["../../../../src/config/framework/stubs/next-intl-routing.ts"],"sourcesContent":[],"mappings":";;AAcA;;;;;;;;;;;;;iBAAgB,yBAAyB,IAAI"}
1
+ {"version":3,"file":"next-intl-routing-Cwaa3f4R.d.ts","names":[],"sources":["../../../../src/config/framework/stubs/next-intl-routing.ts"],"sourcesContent":[],"mappings":";;AAcA;;;;;;;;;;;;;iBAAgB,yBAAyB,IAAI"}
@@ -22,4 +22,4 @@ declare const unpluginVueI18n: typeof record;
22
22
  //# sourceMappingURL=unplugin-vue-i18n.d.ts.map
23
23
  //#endregion
24
24
  export { RECORDED, record as default, unpluginVueI18n, vueI18n };
25
- //# sourceMappingURL=unplugin-vue-i18n-DrR5pbEW.d.ts.map
25
+ //# sourceMappingURL=unplugin-vue-i18n-1ud7-Ly8.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"unplugin-vue-i18n-DrR5pbEW.d.ts","names":[],"sources":["../../../../src/config/framework/stubs/unplugin-vue-i18n.ts"],"sourcesContent":[],"mappings":";;AAcA;AAA4E;AAQ5E;AACA;;;;;;;;;;cATa;iBAEJ,MAAA;;;cAMI,gBAAO;cACP,wBAAe"}
1
+ {"version":3,"file":"unplugin-vue-i18n-1ud7-Ly8.d.ts","names":[],"sources":["../../../../src/config/framework/stubs/unplugin-vue-i18n.ts"],"sourcesContent":[],"mappings":";;AAcA;AAA4E;AAQ5E;AACA;;;;;;;;;;cATa;iBAEJ,MAAA;;;cAMI,gBAAO;cACP,wBAAe"}
@@ -1 +1 @@
1
- {"version":3,"file":"define-config-4ubtfvUy.js","names":[],"sources":["../src/define-config.ts"],"sourcesContent":["/**\n * The entry point a project's own `i18n-kit.config.ts` imports:\n *\n * ```ts\n * import { defineI18nKitConfig } from 'the-i18n-cli/config'\n *\n * export default defineI18nKitConfig({ defaultLocale: 'en' })\n * ```\n *\n * Deliberately its own entry rather than part of the package's main export.\n * This module is loaded *by the config file the CLI is about to read*, so it\n * has to stay free of anything that touches the filesystem, the logger, or a\n * provider — importing it must not be able to do anything.\n */\nimport type { ProjectConfig } from './config/types.js'\n\n/**\n * Everything `.i18n-mcp.json` accepts, minus the JSON-only `$schema` key —\n * a TypeScript config is checked by the editor rather than by a schema URL.\n */\nexport type I18nKitConfig = ProjectConfig\n\n/**\n * Identity at runtime; the point is the type. Returning the argument unchanged\n * keeps the config file's inferred type exact, so `defaultLocale` autocompletes\n * and a misspelled `protectedLocals` is a red squiggle rather than a key that\n * silently protects nothing.\n */\nexport function defineI18nKitConfig(config: I18nKitConfig): I18nKitConfig {\n return config\n}\n\nexport type { ProjectConfig, LocaleDefinition, LocaleDir, I18nConfig } from './config/types.js'\n"],"mappings":";;;;;;;AA4BA,SAAgB,oBAAoB,QAAsC;AACxE,QAAO"}
1
+ {"version":3,"file":"define-config-4ubtfvUy.js","names":[],"sources":["../src/define-config.ts"],"sourcesContent":["/**\n * The entry point a project's own `i18n-kit.config.ts` imports:\n *\n * ```ts\n * import { defineI18nKitConfig } from '@the-i18n-kit/cli/config'\n *\n * export default defineI18nKitConfig({ defaultLocale: 'en' })\n * ```\n *\n * Deliberately its own entry rather than part of the package's main export.\n * This module is loaded *by the config file the CLI is about to read*, so it\n * has to stay free of anything that touches the filesystem, the logger, or a\n * provider — importing it must not be able to do anything.\n */\nimport type { ProjectConfig } from './config/types.js'\n\n/**\n * Everything `.i18n-mcp.json` accepts, minus the JSON-only `$schema` key —\n * a TypeScript config is checked by the editor rather than by a schema URL.\n */\nexport type I18nKitConfig = ProjectConfig\n\n/**\n * Identity at runtime; the point is the type. Returning the argument unchanged\n * keeps the config file's inferred type exact, so `defaultLocale` autocompletes\n * and a misspelled `protectedLocals` is a red squiggle rather than a key that\n * silently protects nothing.\n */\nexport function defineI18nKitConfig(config: I18nKitConfig): I18nKitConfig {\n return config\n}\n\nexport type { ProjectConfig, LocaleDefinition, LocaleDir, I18nConfig } from './config/types.js'\n"],"mappings":";;;;;;;AA4BA,SAAgB,oBAAoB,QAAsC;AACxE,QAAO"}
@@ -57,8 +57,15 @@ interface ProjectConfig {
57
57
  translationPrompt?: string;
58
58
  /** Per-locale context (formal register, regional differences, etc.) */
59
59
  localeNotes?: Record<string, string>;
60
- /** Few-shot translation examples */
61
- examples?: Array<Record<string, string>>;
60
+ /**
61
+ * Few-shot translation examples. `key` is required — the prompt names it, so
62
+ * an entry without one reaches the provider as the word "undefined" (#367).
63
+ * Every other property is a locale code mapped to its translated value.
64
+ */
65
+ examples?: Array<{
66
+ key: string;
67
+ note?: string;
68
+ } & Record<string, string>>;
62
69
  /** Per-layer scan directories and ignore patterns for orphan key detection. Keys are layer names. */
63
70
  orphanScan?: Record<string, {
64
71
  /** Glob patterns for translation keys to exclude from orphan detection (e.g., "common.datetime.months.*"). */
@@ -138,5 +145,5 @@ type I18nKitConfig = ProjectConfig;
138
145
  */
139
146
  declare function defineI18nKitConfig(config: I18nKitConfig): I18nKitConfig;
140
147
  //#endregion
141
- export { LocaleDir as a, LocaleDefinition as i, defineI18nKitConfig as n, ProjectConfig as o, I18nConfig as r, I18nKitConfig as t };
142
- //# sourceMappingURL=define-config-DpbZ4BZ6.d.ts.map
148
+ export { LocaleDir as a, LocaleDefinition as i, defineI18nKitConfig as n, ProjectConfig as o, I18nConfig as r, LocaleFileFormat as s, I18nKitConfig as t };
149
+ //# sourceMappingURL=define-config-BaZ1dZph.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"define-config-BaZ1dZph.d.ts","names":[],"sources":["../src/adapters/types.ts","../src/config/types.ts","../src/define-config.ts"],"sourcesContent":[],"mappings":";AAEY,KAAA,gBAAA,GAAgB,MAAA,GAAA,WAAA;;;AAA5B;;;UCGiB,gBAAA;EAAA;EAcA,IAAA,EAAA,MAAS;EAWT;EAaA,QAAA,EAAA,MAAa;EAAA;MAMf,CAAA,EAAA,MAAA;;MAUC,CAAA,EAAA,MAAA;;;;;AAiCK,UAzEJ,SAAA,CAyEI;EAAgB;EAapB,IAAA,EAAA,MAAA;EAAU;OAQT,EAAA,MAAA;;cAIJ,EAAA,MAAA;;SAMO,CAAA,EAAA,MAAA;;AAEN,UA/FE,OAAA,CA+FF;;;;ECzGH,OAAA,EAAA,MAAA;EAQI;EAAmB,MAAA,EAAA,MAAA,EAAA;;;;;;UDelB,aAAA;;;;;;eAMF;;;;;;aAMF;;;;gBAIG;;;;;;aAMH;;;MAAuC;;eAErC;;;;;;;;;;;eAWA;;;;;;;;;;;;;;;;;qBAcM;;;;;;;;;;;;UAaJ,UAAA;;;;;;;;kBAQC;;WAEP;;cAEG;;;;kBAII;;qBAEG;;QAEb;;;;;;;;;AApBS,KCrFL,aAAA,GAAgB,aDqFD;;;;;;;AAoBnB,iBCjGQ,mBAAA,CDiGR,MAAA,ECjGoC,aDiGpC,CAAA,ECjGoD,aDiGpD"}
@@ -1,2 +1,2 @@
1
- import { a as LocaleDir, i as LocaleDefinition, n as defineI18nKitConfig, o as ProjectConfig, r as I18nConfig, t as I18nKitConfig } from "./define-config-DpbZ4BZ6.js";
1
+ import { a as LocaleDir, i as LocaleDefinition, n as defineI18nKitConfig, o as ProjectConfig, r as I18nConfig, t as I18nKitConfig } from "./define-config-BaZ1dZph.js";
2
2
  export { I18nConfig, I18nKitConfig, LocaleDefinition, LocaleDir, ProjectConfig, defineI18nKitConfig };
@@ -1 +1 @@
1
- export * from './define-config-BSsvRnWR.d.ts';
1
+ export * from './define-config-CLgKN-7N.d.ts';
@@ -1,8 +1,8 @@
1
1
  import "./stdout-guard-sJHFWVem.js";
2
- import { m as detectConfig } from "./operations-BCJd7in3.js";
3
- import "./providers-BAwPjeCy.js";
4
- import "./php-reader-DuZ0Hyl_.js";
5
- import { t as createCommand } from "./_shared-Dn15c_g9.js";
2
+ import { C as detectConfig } from "./operations-CTo44gPu.js";
3
+ import "./providers-CHE2ffi6.js";
4
+ import "./php-reader-3Fgw80zK.js";
5
+ import { t as createCommand } from "./_shared-DFyy3sh8.js";
6
6
  //#region src/commands/detect.ts
7
7
  var detect_default = createCommand({
8
8
  name: "detect",
@@ -14,4 +14,4 @@ var detect_default = createCommand({
14
14
  //#endregion
15
15
  export { detect_default as default };
16
16
 
17
- //# sourceMappingURL=detect-BmvyRD1a.js.map
17
+ //# sourceMappingURL=detect-7cVfsNJP.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"detect-BmvyRD1a.js","names":[],"sources":["../src/commands/detect.ts"],"sourcesContent":["import { createCommand } from './_shared.js'\nimport { detectConfig } from '../core/operations.js'\n\nexport default createCommand({\n name: 'detect',\n description: 'Detect i18n configuration from the project',\n async run(args) {\n return detectConfig(args.projectDir)\n },\n})\n"],"mappings":";;;;;;AAGA,IAAA,iBAAe,cAAc;CAC3B,MAAM;CACN,aAAa;CACb,MAAM,IAAI,MAAM;AACd,SAAO,aAAa,KAAK,WAAW;;CAEvC,CAAC"}
1
+ {"version":3,"file":"detect-7cVfsNJP.js","names":[],"sources":["../src/commands/detect.ts"],"sourcesContent":["import { createCommand } from './_shared.js'\nimport { detectConfig } from '../core/operations.js'\n\nexport default createCommand({\n name: 'detect',\n description: 'Detect i18n configuration from the project',\n async run(args) {\n return detectConfig(args.projectDir)\n },\n})\n"],"mappings":";;;;;;AAGA,IAAA,iBAAe,cAAc;CAC3B,MAAM;CACN,aAAa;CACb,MAAM,IAAI,MAAM;AACd,SAAO,aAAa,KAAK,WAAW;;CAEvC,CAAC"}
@@ -1,8 +1,8 @@
1
1
  import "./stdout-guard-sJHFWVem.js";
2
- import { h as findEmptyTranslations } from "./operations-BCJd7in3.js";
3
- import "./providers-BAwPjeCy.js";
4
- import "./php-reader-DuZ0Hyl_.js";
5
- import { t as createCommand } from "./_shared-Dn15c_g9.js";
2
+ import { w as findEmptyTranslations } from "./operations-CTo44gPu.js";
3
+ import "./providers-CHE2ffi6.js";
4
+ import "./php-reader-3Fgw80zK.js";
5
+ import { t as createCommand } from "./_shared-DFyy3sh8.js";
6
6
  //#region src/commands/empty.ts
7
7
  var empty_default = createCommand({
8
8
  name: "empty",
@@ -33,4 +33,4 @@ var empty_default = createCommand({
33
33
  //#endregion
34
34
  export { empty_default as default };
35
35
 
36
- //# sourceMappingURL=empty-Ww6FnmgY.js.map
36
+ //# sourceMappingURL=empty-DB8Hl_8u.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"empty-Ww6FnmgY.js","names":[],"sources":["../src/commands/empty.ts"],"sourcesContent":["import { createCommand } from './_shared.js'\nimport { findEmptyTranslations } from '../core/operations.js'\n\nexport default createCommand({\n name: 'empty',\n description: 'Find translation keys with empty string values',\n args: {\n layer: { type: 'string', description: 'Filter to a specific layer' },\n locale: { type: 'string', description: 'Filter to a specific locale' },\n outputFile: { type: 'string', description: 'Write full output to this file path and return only a summary (useful for large outputs)' },\n },\n async run(args) {\n return findEmptyTranslations({\n layer: args.layer,\n locale: args.locale,\n projectDir: args.projectDir,\n outputFile: args.outputFile,\n })\n },\n})\n"],"mappings":";;;;;;AAGA,IAAA,gBAAe,cAAc;CAC3B,MAAM;CACN,aAAa;CACb,MAAM;EACJ,OAAO;GAAE,MAAM;GAAU,aAAa;GAA8B;EACpE,QAAQ;GAAE,MAAM;GAAU,aAAa;GAA+B;EACtE,YAAY;GAAE,MAAM;GAAU,aAAa;GAA4F;EACxI;CACD,MAAM,IAAI,MAAM;AACd,SAAO,sBAAsB;GAC3B,OAAO,KAAK;GACZ,QAAQ,KAAK;GACb,YAAY,KAAK;GACjB,YAAY,KAAK;GAClB,CAAC;;CAEL,CAAC"}
1
+ {"version":3,"file":"empty-DB8Hl_8u.js","names":[],"sources":["../src/commands/empty.ts"],"sourcesContent":["import { createCommand } from './_shared.js'\nimport { findEmptyTranslations } from '../core/operations.js'\n\nexport default createCommand({\n name: 'empty',\n description: 'Find translation keys with empty string values',\n args: {\n layer: { type: 'string', description: 'Filter to a specific layer' },\n locale: { type: 'string', description: 'Filter to a specific locale' },\n outputFile: { type: 'string', description: 'Write full output to this file path and return only a summary (useful for large outputs)' },\n },\n async run(args) {\n return findEmptyTranslations({\n layer: args.layer,\n locale: args.locale,\n projectDir: args.projectDir,\n outputFile: args.outputFile,\n })\n },\n})\n"],"mappings":";;;;;;AAGA,IAAA,gBAAe,cAAc;CAC3B,MAAM;CACN,aAAa;CACb,MAAM;EACJ,OAAO;GAAE,MAAM;GAAU,aAAa;GAA8B;EACpE,QAAQ;GAAE,MAAM;GAAU,aAAa;GAA+B;EACtE,YAAY;GAAE,MAAM;GAAU,aAAa;GAA4F;EACxI;CACD,MAAM,IAAI,MAAM;AACd,SAAO,sBAAsB;GAC3B,OAAO,KAAK;GACZ,QAAQ,KAAK;GACb,YAAY,KAAK;GACjB,YAAY,KAAK;GAClB,CAAC;;CAEL,CAAC"}
@@ -0,0 +1,42 @@
1
+ import "./stdout-guard-sJHFWVem.js";
2
+ import { n as findDuplicateKeys } from "./operations-CTo44gPu.js";
3
+ import "./providers-CHE2ffi6.js";
4
+ import "./php-reader-3Fgw80zK.js";
5
+ import { t as createCommand } from "./_shared-DFyy3sh8.js";
6
+ //#region src/commands/find-duplicates.ts
7
+ var find_duplicates_default = createCommand({
8
+ name: "find-duplicates",
9
+ description: "Find keys defined in both a shared layer and a consuming child layer (with divergence detection); --byValue also finds different keys carrying the same value",
10
+ args: {
11
+ locale: {
12
+ type: "string",
13
+ description: "Locale to compare values in (default: project default)"
14
+ },
15
+ byValue: {
16
+ type: "boolean",
17
+ description: "Also group different keys carrying the same value, ranked by what to do about each group",
18
+ default: false
19
+ },
20
+ minValueLength: {
21
+ type: "string",
22
+ description: "Shortest value worth grouping with --byValue (default: 4) — below it, repetition is usually legitimate"
23
+ },
24
+ outputFile: {
25
+ type: "string",
26
+ description: "Write full output to this file path and return only a summary (useful for large outputs)"
27
+ }
28
+ },
29
+ async run(args) {
30
+ return findDuplicateKeys({
31
+ locale: args.locale,
32
+ projectDir: args.projectDir,
33
+ outputFile: args.outputFile,
34
+ byValue: args.byValue,
35
+ ...args.minValueLength ? { minValueLength: Number(args.minValueLength) } : {}
36
+ });
37
+ }
38
+ });
39
+ //#endregion
40
+ export { find_duplicates_default as default };
41
+
42
+ //# sourceMappingURL=find-duplicates-CmEqBfby.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"find-duplicates-CmEqBfby.js","names":[],"sources":["../src/commands/find-duplicates.ts"],"sourcesContent":["import { createCommand } from './_shared.js'\nimport { findDuplicateKeys } from '../core/operations.js'\n\nexport default createCommand({\n name: 'find-duplicates',\n description: 'Find keys defined in both a shared layer and a consuming child layer (with divergence detection); --byValue also finds different keys carrying the same value',\n args: {\n locale: { type: 'string', description: 'Locale to compare values in (default: project default)' },\n byValue: { type: 'boolean', description: 'Also group different keys carrying the same value, ranked by what to do about each group', default: false },\n minValueLength: { type: 'string', description: 'Shortest value worth grouping with --byValue (default: 4) — below it, repetition is usually legitimate' },\n outputFile: { type: 'string', description: 'Write full output to this file path and return only a summary (useful for large outputs)' },\n },\n async run(args) {\n return findDuplicateKeys({\n locale: args.locale,\n projectDir: args.projectDir,\n outputFile: args.outputFile,\n byValue: args.byValue,\n ...(args.minValueLength ? { minValueLength: Number(args.minValueLength) } : {}),\n })\n },\n})\n"],"mappings":";;;;;;AAGA,IAAA,0BAAe,cAAc;CAC3B,MAAM;CACN,aAAa;CACb,MAAM;EACJ,QAAQ;GAAE,MAAM;GAAU,aAAa;GAA0D;EACjG,SAAS;GAAE,MAAM;GAAW,aAAa;GAA4F,SAAS;GAAO;EACrJ,gBAAgB;GAAE,MAAM;GAAU,aAAa;GAA0G;EACzJ,YAAY;GAAE,MAAM;GAAU,aAAa;GAA4F;EACxI;CACD,MAAM,IAAI,MAAM;AACd,SAAO,kBAAkB;GACvB,QAAQ,KAAK;GACb,YAAY,KAAK;GACjB,YAAY,KAAK;GACjB,SAAS,KAAK;GACd,GAAI,KAAK,iBAAiB,EAAE,gBAAgB,OAAO,KAAK,eAAe,EAAE,GAAG,EAAE;GAC/E,CAAC;;CAEL,CAAC"}
@@ -1,8 +1,8 @@
1
1
  import "./stdout-guard-sJHFWVem.js";
2
- import { _ as getTranslations } from "./operations-BCJd7in3.js";
3
- import "./providers-BAwPjeCy.js";
4
- import "./php-reader-DuZ0Hyl_.js";
5
- import { o as splitList, t as createCommand } from "./_shared-Dn15c_g9.js";
2
+ import { E as getTranslations } from "./operations-CTo44gPu.js";
3
+ import "./providers-CHE2ffi6.js";
4
+ import "./php-reader-3Fgw80zK.js";
5
+ import { o as splitList, t as createCommand } from "./_shared-DFyy3sh8.js";
6
6
  //#region src/commands/get.ts
7
7
  var get_default = createCommand({
8
8
  name: "get",
@@ -38,4 +38,4 @@ var get_default = createCommand({
38
38
  //#endregion
39
39
  export { get_default as default };
40
40
 
41
- //# sourceMappingURL=get-oF_xIbVR.js.map
41
+ //# sourceMappingURL=get-BE21Iy6N.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"get-oF_xIbVR.js","names":[],"sources":["../src/commands/get.ts"],"sourcesContent":["import { createCommand, splitList } from './_shared.js'\nimport { getTranslations } from '../core/operations.js'\n\nexport default createCommand({\n name: 'get',\n description: 'Get translation values for specific keys',\n args: {\n layer: { type: 'string', description: 'Layer name', required: true },\n locale: { type: 'string', description: 'Locale code, or \"*\" for all', required: true },\n keys: { type: 'string', description: 'Comma-separated key paths', required: true },\n },\n async run(args) {\n const keys = splitList(args.keys) ?? []\n if (keys.length === 0) {\n throw new Error('No keys provided. Pass comma-separated key paths via --keys')\n }\n return getTranslations({ layer: args.layer, locale: args.locale, keys, projectDir: args.projectDir })\n },\n})\n"],"mappings":";;;;;;AAGA,IAAA,cAAe,cAAc;CAC3B,MAAM;CACN,aAAa;CACb,MAAM;EACJ,OAAO;GAAE,MAAM;GAAU,aAAa;GAAc,UAAU;GAAM;EACpE,QAAQ;GAAE,MAAM;GAAU,aAAa;GAA+B,UAAU;GAAM;EACtF,MAAM;GAAE,MAAM;GAAU,aAAa;GAA6B,UAAU;GAAM;EACnF;CACD,MAAM,IAAI,MAAM;EACd,MAAM,OAAO,UAAU,KAAK,KAAK,IAAI,EAAE;AACvC,MAAI,KAAK,WAAW,EAClB,OAAM,IAAI,MAAM,8DAA8D;AAEhF,SAAO,gBAAgB;GAAE,OAAO,KAAK;GAAO,QAAQ,KAAK;GAAQ;GAAM,YAAY,KAAK;GAAY,CAAC;;CAExG,CAAC"}
1
+ {"version":3,"file":"get-BE21Iy6N.js","names":[],"sources":["../src/commands/get.ts"],"sourcesContent":["import { createCommand, splitList } from './_shared.js'\nimport { getTranslations } from '../core/operations.js'\n\nexport default createCommand({\n name: 'get',\n description: 'Get translation values for specific keys',\n args: {\n layer: { type: 'string', description: 'Layer name', required: true },\n locale: { type: 'string', description: 'Locale code, or \"*\" for all', required: true },\n keys: { type: 'string', description: 'Comma-separated key paths', required: true },\n },\n async run(args) {\n const keys = splitList(args.keys) ?? []\n if (keys.length === 0) {\n throw new Error('No keys provided. Pass comma-separated key paths via --keys')\n }\n return getTranslations({ layer: args.layer, locale: args.locale, keys, projectDir: args.projectDir })\n },\n})\n"],"mappings":";;;;;;AAGA,IAAA,cAAe,cAAc;CAC3B,MAAM;CACN,aAAa;CACb,MAAM;EACJ,OAAO;GAAE,MAAM;GAAU,aAAa;GAAc,UAAU;GAAM;EACpE,QAAQ;GAAE,MAAM;GAAU,aAAa;GAA+B,UAAU;GAAM;EACtF,MAAM;GAAE,MAAM;GAAU,aAAa;GAA6B,UAAU;GAAM;EACnF;CACD,MAAM,IAAI,MAAM;EACd,MAAM,OAAO,UAAU,KAAK,KAAK,IAAI,EAAE;AACvC,MAAI,KAAK,WAAW,EAClB,OAAM,IAAI,MAAM,8DAA8D;AAEhF,SAAO,gBAAgB;GAAE,OAAO,KAAK;GAAO,QAAQ,KAAK;GAAQ;GAAM,YAAY,KAAK;GAAY,CAAC;;CAExG,CAAC"}