@katerynakhar/i18n-keeper 0.16.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 (103) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +666 -0
  3. package/dist/apply.d.ts +66 -0
  4. package/dist/apply.js +254 -0
  5. package/dist/apply.js.map +1 -0
  6. package/dist/check.d.ts +5 -0
  7. package/dist/check.js +326 -0
  8. package/dist/check.js.map +1 -0
  9. package/dist/cli.d.ts +2 -0
  10. package/dist/cli.js +525 -0
  11. package/dist/cli.js.map +1 -0
  12. package/dist/formats/error.d.ts +12 -0
  13. package/dist/formats/error.js +19 -0
  14. package/dist/formats/error.js.map +1 -0
  15. package/dist/formats/flatten.d.ts +6 -0
  16. package/dist/formats/flatten.js +26 -0
  17. package/dist/formats/flatten.js.map +1 -0
  18. package/dist/formats/json-write.d.ts +7 -0
  19. package/dist/formats/json-write.js +55 -0
  20. package/dist/formats/json-write.js.map +1 -0
  21. package/dist/formats/json.d.ts +6 -0
  22. package/dist/formats/json.js +21 -0
  23. package/dist/formats/json.js.map +1 -0
  24. package/dist/formats/php-write.d.ts +16 -0
  25. package/dist/formats/php-write.js +130 -0
  26. package/dist/formats/php-write.js.map +1 -0
  27. package/dist/formats/php.d.ts +44 -0
  28. package/dist/formats/php.js +356 -0
  29. package/dist/formats/php.js.map +1 -0
  30. package/dist/formats/po-write.d.ts +3 -0
  31. package/dist/formats/po-write.js +200 -0
  32. package/dist/formats/po-write.js.map +1 -0
  33. package/dist/formats/po.d.ts +30 -0
  34. package/dist/formats/po.js +202 -0
  35. package/dist/formats/po.js.map +1 -0
  36. package/dist/formats/write.d.ts +29 -0
  37. package/dist/formats/write.js +19 -0
  38. package/dist/formats/write.js.map +1 -0
  39. package/dist/formats/yaml-write.d.ts +12 -0
  40. package/dist/formats/yaml-write.js +42 -0
  41. package/dist/formats/yaml-write.js.map +1 -0
  42. package/dist/formats/yaml.d.ts +18 -0
  43. package/dist/formats/yaml.js +51 -0
  44. package/dist/formats/yaml.js.map +1 -0
  45. package/dist/glossary.d.ts +38 -0
  46. package/dist/glossary.js +140 -0
  47. package/dist/glossary.js.map +1 -0
  48. package/dist/lengths.d.ts +37 -0
  49. package/dist/lengths.js +195 -0
  50. package/dist/lengths.js.map +1 -0
  51. package/dist/mcp.d.ts +2 -0
  52. package/dist/mcp.js +374 -0
  53. package/dist/mcp.js.map +1 -0
  54. package/dist/memory.d.ts +72 -0
  55. package/dist/memory.js +162 -0
  56. package/dist/memory.js.map +1 -0
  57. package/dist/placeholders.d.ts +15 -0
  58. package/dist/placeholders.js +103 -0
  59. package/dist/placeholders.js.map +1 -0
  60. package/dist/plurals.d.ts +59 -0
  61. package/dist/plurals.js +280 -0
  62. package/dist/plurals.js.map +1 -0
  63. package/dist/report.d.ts +2 -0
  64. package/dist/report.js +126 -0
  65. package/dist/report.js.map +1 -0
  66. package/dist/scan.d.ts +23 -0
  67. package/dist/scan.js +250 -0
  68. package/dist/scan.js.map +1 -0
  69. package/dist/translate.d.ts +93 -0
  70. package/dist/translate.js +369 -0
  71. package/dist/translate.js.map +1 -0
  72. package/dist/types.d.ts +88 -0
  73. package/dist/types.js +50 -0
  74. package/dist/types.js.map +1 -0
  75. package/dist/version.d.ts +1 -0
  76. package/dist/version.js +28 -0
  77. package/dist/version.js.map +1 -0
  78. package/package.json +77 -0
  79. package/src/apply.ts +334 -0
  80. package/src/check.ts +468 -0
  81. package/src/cli.ts +637 -0
  82. package/src/formats/error.ts +19 -0
  83. package/src/formats/flatten.ts +38 -0
  84. package/src/formats/json-write.ts +66 -0
  85. package/src/formats/json.ts +27 -0
  86. package/src/formats/php-write.ts +146 -0
  87. package/src/formats/php.ts +414 -0
  88. package/src/formats/po-write.ts +230 -0
  89. package/src/formats/po.ts +233 -0
  90. package/src/formats/write.ts +41 -0
  91. package/src/formats/yaml-write.ts +53 -0
  92. package/src/formats/yaml.ts +62 -0
  93. package/src/glossary.ts +191 -0
  94. package/src/lengths.ts +214 -0
  95. package/src/mcp.ts +451 -0
  96. package/src/memory.ts +227 -0
  97. package/src/placeholders.ts +123 -0
  98. package/src/plurals.ts +320 -0
  99. package/src/report.ts +162 -0
  100. package/src/scan.ts +280 -0
  101. package/src/translate.ts +486 -0
  102. package/src/types.ts +136 -0
  103. package/src/version.ts +27 -0
@@ -0,0 +1,195 @@
1
+ import { existsSync, readFileSync } from 'node:fs';
2
+ import { resolve } from 'node:path';
3
+ import { looksLikeIcuPlural } from './plurals.js';
4
+ export const LIMITS_FILE = '.i18n/limits.json';
5
+ export class LimitsError extends Error {
6
+ }
7
+ export function limitsPath(root, explicit) {
8
+ return resolve(root, explicit ?? LIMITS_FILE);
9
+ }
10
+ function fail(file, message) {
11
+ throw new LimitsError(`Invalid limits ${file}\n ${message}`);
12
+ }
13
+ function asMax(file, value, where) {
14
+ if (typeof value !== 'number' || !Number.isInteger(value) || value <= 0) {
15
+ fail(file, `${where} must be a positive integer`);
16
+ }
17
+ return value;
18
+ }
19
+ export function loadLimits(file) {
20
+ if (!existsSync(file))
21
+ return null;
22
+ let parsed;
23
+ try {
24
+ parsed = JSON.parse(readFileSync(file, 'utf8'));
25
+ }
26
+ catch (err) {
27
+ fail(file, err instanceof Error ? err.message : String(err));
28
+ }
29
+ if (typeof parsed !== 'object' || parsed === null)
30
+ fail(file, 'expected an object');
31
+ const raw = parsed;
32
+ if (raw['version'] !== 1)
33
+ fail(file, 'expected "version": 1');
34
+ const fallback = raw['default'] === undefined || raw['default'] === null
35
+ ? null
36
+ : asMax(file, raw['default'], 'default');
37
+ const keys = {};
38
+ if (raw['keys'] !== undefined) {
39
+ if (typeof raw['keys'] !== 'object' || raw['keys'] === null || Array.isArray(raw['keys'])) {
40
+ fail(file, 'keys must be an object mapping key to maximum width');
41
+ }
42
+ for (const [key, value] of Object.entries(raw['keys'])) {
43
+ keys[key] = asMax(file, value, `keys.${key}`);
44
+ }
45
+ }
46
+ const patterns = [];
47
+ if (raw['patterns'] !== undefined) {
48
+ if (!Array.isArray(raw['patterns']))
49
+ fail(file, 'patterns must be an array');
50
+ raw['patterns'].forEach((entry, index) => {
51
+ const where = `patterns[${index}]`;
52
+ if (typeof entry !== 'object' || entry === null)
53
+ fail(file, `${where} must be an object`);
54
+ const pattern = entry;
55
+ if (typeof pattern['match'] !== 'string' || pattern['match'] === '') {
56
+ fail(file, `${where}.match must be a non-empty string`);
57
+ }
58
+ patterns.push({
59
+ match: pattern['match'],
60
+ max: asMax(file, pattern['max'], `${where}.max`),
61
+ });
62
+ });
63
+ }
64
+ return { version: 1, default: fallback, keys, patterns };
65
+ }
66
+ function globToRegExp(glob) {
67
+ // Split on the wildcard first, so the escaping pass never has to carry a
68
+ // placeholder character through the string.
69
+ const pattern = glob
70
+ .split('*')
71
+ .map((part) => part.replace(/[.+?^${}()|[\]\\]/g, '\\$&'))
72
+ .join('.*');
73
+ return new RegExp(`^${pattern}$`);
74
+ }
75
+ const patternCache = new Map();
76
+ /** Exact keys win over patterns, and the first matching pattern wins over the default. */
77
+ export function limitFor(limits, key) {
78
+ const exact = limits.keys[key];
79
+ if (exact !== undefined)
80
+ return exact;
81
+ for (const pattern of limits.patterns) {
82
+ let re = patternCache.get(pattern.match);
83
+ if (!re) {
84
+ re = globToRegExp(pattern.match);
85
+ patternCache.set(pattern.match, re);
86
+ }
87
+ if (re.test(key))
88
+ return pattern.max;
89
+ }
90
+ return limits.default;
91
+ }
92
+ // ---------------------------------------------------------------------------
93
+ // Width
94
+ // ---------------------------------------------------------------------------
95
+ const COMBINING = /\p{M}/u;
96
+ const ZERO_WIDTH = new Set([0x200b, 0x200c, 0x200d, 0x200e, 0x200f, 0xfeff]);
97
+ /** East Asian Wide and Fullwidth blocks, which occupy two columns. */
98
+ const WIDE_RANGES = [
99
+ [0x1100, 0x115f],
100
+ [0x2e80, 0x303e],
101
+ [0x3041, 0x33ff],
102
+ [0x3400, 0x4dbf],
103
+ [0x4e00, 0x9fff],
104
+ [0xa000, 0xa4cf],
105
+ [0xa960, 0xa97f],
106
+ [0xac00, 0xd7a3],
107
+ [0xf900, 0xfaff],
108
+ [0xfe10, 0xfe19],
109
+ [0xfe30, 0xfe6f],
110
+ [0xff00, 0xff60],
111
+ [0xffe0, 0xffe6],
112
+ [0x17000, 0x18aff],
113
+ [0x1b000, 0x1b12f],
114
+ [0x1f300, 0x1f64f],
115
+ [0x1f900, 0x1f9ff],
116
+ [0x20000, 0x3fffd],
117
+ ];
118
+ function isWide(cp) {
119
+ for (const [start, end] of WIDE_RANGES) {
120
+ if (cp < start)
121
+ return false;
122
+ if (cp <= end)
123
+ return true;
124
+ }
125
+ return false;
126
+ }
127
+ /**
128
+ * Width in display columns rather than UTF-16 units: a CJK character occupies
129
+ * two columns, combining marks none. Counting `.length` would report Japanese
130
+ * as half its real size and any emoji as double.
131
+ */
132
+ export function displayWidth(text) {
133
+ let width = 0;
134
+ for (const ch of text) {
135
+ const cp = ch.codePointAt(0);
136
+ if (ZERO_WIDTH.has(cp) || (cp >= 0xfe00 && cp <= 0xfe0f))
137
+ continue;
138
+ if (COMBINING.test(ch))
139
+ continue;
140
+ width += isWide(cp) ? 2 : 1;
141
+ }
142
+ return width;
143
+ }
144
+ /** Splits on Laravel's top-level pipes, which select between forms. */
145
+ function segments(text) {
146
+ const out = [];
147
+ let depth = 0;
148
+ let current = '';
149
+ for (const ch of text) {
150
+ if (ch === '{' || ch === '[')
151
+ depth++;
152
+ else if (ch === '}' || ch === ']')
153
+ depth = Math.max(0, depth - 1);
154
+ if (ch === '|' && depth === 0) {
155
+ out.push(current);
156
+ current = '';
157
+ continue;
158
+ }
159
+ current += ch;
160
+ }
161
+ out.push(current);
162
+ return out;
163
+ }
164
+ /**
165
+ * An ICU plural carries every branch in one string but shows one at a time, and
166
+ * its selectors are not displayed at all, so measuring it would be meaningless.
167
+ */
168
+ export function measurable(text) {
169
+ return !looksLikeIcuPlural(text);
170
+ }
171
+ /** The widest thing the user can actually end up seeing. */
172
+ export function renderedWidth(text, laravel) {
173
+ if (!laravel)
174
+ return displayWidth(text);
175
+ return Math.max(...segments(text).map((segment) => displayWidth(segment.trim())));
176
+ }
177
+ /**
178
+ * Conventional translation-expansion allowances: short strings grow much more
179
+ * in relative terms than long ones, so a single ratio would either miss real
180
+ * overflow or flag every button. These are rules of thumb, not a standard.
181
+ */
182
+ export function allowanceFor(sourceWidth) {
183
+ if (sourceWidth <= 10)
184
+ return 3;
185
+ if (sourceWidth <= 20)
186
+ return 2;
187
+ if (sourceWidth <= 30)
188
+ return 1.8;
189
+ if (sourceWidth <= 50)
190
+ return 1.6;
191
+ if (sourceWidth <= 70)
192
+ return 1.4;
193
+ return 1.3;
194
+ }
195
+ //# sourceMappingURL=lengths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lengths.js","sourceRoot":"","sources":["../src/lengths.ts"],"names":[],"mappings":"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"}
package/dist/mcp.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
package/dist/mcp.js ADDED
@@ -0,0 +1,374 @@
1
+ #!/usr/bin/env node
2
+ import { existsSync } from 'node:fs';
3
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
4
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
5
+ import { z } from 'zod';
6
+ import { check } from './check.js';
7
+ import { FormatError, describeFormatError } from './formats/error.js';
8
+ import { GlossaryError, glossaryPath, loadGlossary, } from './glossary.js';
9
+ import { LimitsError, limitsPath, loadLimits } from './lengths.js';
10
+ import { MemoryError, emptyMemory, loadMemory, memoryPath, saveMemory, syncMemory, } from './memory.js';
11
+ import { ALL_SYNTAXES } from './placeholders.js';
12
+ import { ScanError, detectProject, listLocales } from './scan.js';
13
+ import { RULE_IDS } from './types.js';
14
+ import { VERSION } from './version.js';
15
+ /**
16
+ * Everything a tool returns lands in the agent's context, so the text stays
17
+ * compact and findings are paged rather than dumped.
18
+ */
19
+ const DEFAULT_LIMIT = 25;
20
+ const commonInput = {
21
+ path: z.string().optional().describe('Project root. Defaults to the working directory.'),
22
+ localesDir: z.string().optional().describe('Locales directory. Auto-detected when omitted.'),
23
+ source: z.string().optional().describe('Source locale. Defaults to en, else the first found.'),
24
+ memory: z.string().optional().describe('Translation memory file. Defaults to .i18n/memory.json.'),
25
+ glossary: z.string().optional().describe('Glossary file. Defaults to .i18n/glossary.json.'),
26
+ limits: z.string().optional().describe('Width limits file. Defaults to .i18n/limits.json.'),
27
+ };
28
+ const statShape = {
29
+ locale: z.string(),
30
+ coverage: z.number(),
31
+ missing: z.number(),
32
+ orphan: z.number(),
33
+ stale: z.number(),
34
+ errors: z.number(),
35
+ warnings: z.number(),
36
+ };
37
+ function buildConfig(args) {
38
+ const config = detectProject(args.path ?? process.cwd(), {
39
+ localesDir: args.localesDir,
40
+ sourceLocale: args.source,
41
+ });
42
+ if (args.syntax && args.syntax.length > 0)
43
+ config.placeholderSyntaxes = args.syntax;
44
+ if (args.ignoreIdentical)
45
+ config.ignoreIdentical = args.ignoreIdentical;
46
+ return config;
47
+ }
48
+ /** An explicitly named memory must exist; the default path is optional. */
49
+ function openMemory(config, explicit) {
50
+ const file = memoryPath(config.root, explicit);
51
+ if (explicit && !existsSync(file))
52
+ throw new MemoryError(`Memory file not found: ${file}`);
53
+ return { memory: loadMemory(file), file };
54
+ }
55
+ /** An explicitly named limits file must exist; the default path is optional. */
56
+ function openLimits(config, explicit) {
57
+ const file = limitsPath(config.root, explicit);
58
+ if (explicit && !existsSync(file))
59
+ throw new LimitsError(`Limits file not found: ${file}`);
60
+ return { limits: loadLimits(file), file };
61
+ }
62
+ /** An explicitly named glossary must exist; the default path is optional. */
63
+ function openGlossary(config, explicit) {
64
+ const file = glossaryPath(config.root, explicit);
65
+ if (explicit && !existsSync(file))
66
+ throw new GlossaryError(`Glossary file not found: ${file}`);
67
+ return { glossary: loadGlossary(file), file };
68
+ }
69
+ function pad(s, width, right = false) {
70
+ const gap = ' '.repeat(Math.max(0, width - s.length));
71
+ return right ? gap + s : s + gap;
72
+ }
73
+ function renderTable(report) {
74
+ const head = ['locale', 'cov', 'miss', 'orph'];
75
+ if (report.memoryLoaded)
76
+ head.push('stale');
77
+ head.push('err', 'warn');
78
+ const rows = report.stats.map((s) => {
79
+ const row = [
80
+ s.locale,
81
+ `${(s.coverage * 100).toFixed(1)}%`,
82
+ String(s.missing),
83
+ String(s.orphan),
84
+ ];
85
+ if (report.memoryLoaded)
86
+ row.push(String(s.stale));
87
+ row.push(String(s.errors), String(s.warnings));
88
+ return row;
89
+ });
90
+ const widths = head.map((h, i) => Math.max(h.length, ...rows.map((r) => (r[i] ?? '').length)));
91
+ const line = (cells) => cells.map((c, i) => pad(c, widths[i], i > 0)).join(' ').trimEnd();
92
+ return [line(head), ...rows.map(line)].join('\n');
93
+ }
94
+ function renderFindings(findings, offset, total) {
95
+ if (total === 0)
96
+ return 'no findings';
97
+ if (findings.length === 0)
98
+ return `no findings at offset ${offset} (${total} total)`;
99
+ const localeWidth = Math.max(...findings.map((f) => f.locale.length));
100
+ const keyWidth = Math.max(...findings.map((f) => f.key.length));
101
+ const ruleWidth = Math.max(...findings.map((f) => f.rule.length));
102
+ const lines = findings.map((f) => `${f.severity === 'error' ? 'E' : 'W'} ${pad(f.locale, localeWidth)} ` +
103
+ `${pad(f.key, keyWidth)} ${pad(f.rule, ruleWidth)} ${f.detail}`);
104
+ const end = offset + findings.length;
105
+ const header = end < total || offset > 0
106
+ ? `findings ${offset + 1}-${end} of ${total} (raise offset for more)`
107
+ : `findings (${total})`;
108
+ return [header, ...lines].join('\n');
109
+ }
110
+ function describeError(err) {
111
+ if (err instanceof ScanError ||
112
+ err instanceof MemoryError ||
113
+ err instanceof GlossaryError ||
114
+ err instanceof LimitsError) {
115
+ return err.message;
116
+ }
117
+ if (err instanceof FormatError)
118
+ return describeFormatError(err);
119
+ return err instanceof Error ? err.message : String(err);
120
+ }
121
+ function toolError(err) {
122
+ return { isError: true, content: [{ type: 'text', text: describeError(err) }] };
123
+ }
124
+ const server = new McpServer({ name: 'i18n-keeper', version: VERSION }, { capabilities: { tools: {} } });
125
+ server.registerTool('i18n_scan', {
126
+ title: 'Scan i18n project',
127
+ description: 'Report which locale directory, layout, locales and translation memory would be used. Run this first when the project layout is unknown.',
128
+ inputSchema: commonInput,
129
+ annotations: { readOnlyHint: true },
130
+ }, async (args) => {
131
+ try {
132
+ const config = buildConfig(args);
133
+ const { layout, locales } = listLocales(config.localesDir);
134
+ const { memory, file } = openMemory(config, args.memory);
135
+ const glossaryInfo = openGlossary(config, args.glossary);
136
+ const limitsInfo = openLimits(config, args.limits);
137
+ return {
138
+ content: [
139
+ {
140
+ type: 'text',
141
+ text: [
142
+ `localesDir: ${config.localesDir}`,
143
+ `layout: ${layout}`,
144
+ `source: ${config.sourceLocale}`,
145
+ `locales: ${locales.join(', ')}`,
146
+ `placeholders: ${config.placeholderSyntaxes.join(', ')}`,
147
+ `memory: ${memory ? file : 'none (run i18n_sync to start tracking)'}`,
148
+ `glossary: ${glossaryInfo.glossary
149
+ ? `${glossaryInfo.file} (${glossaryInfo.glossary.terms.length} terms, ${glossaryInfo.glossary.doNotTranslate.length} verbatim)`
150
+ : 'none'}`,
151
+ `limits: ${limitsInfo.limits
152
+ ? `${limitsInfo.file} (${Object.keys(limitsInfo.limits.keys).length} keys, ${limitsInfo.limits.patterns.length} patterns)`
153
+ : 'none'}`,
154
+ ].join('\n'),
155
+ },
156
+ ],
157
+ };
158
+ }
159
+ catch (err) {
160
+ return toolError(err);
161
+ }
162
+ });
163
+ server.registerTool('i18n_status', {
164
+ title: 'i18n coverage summary',
165
+ description: 'Per-locale coverage and issue counts, without listing individual findings. Cheap overview; use i18n_check for detail.',
166
+ inputSchema: commonInput,
167
+ outputSchema: {
168
+ sourceLocale: z.string(),
169
+ sourceKeys: z.number(),
170
+ memoryLoaded: z.boolean(),
171
+ locales: z.array(z.object(statShape)),
172
+ },
173
+ annotations: { readOnlyHint: true },
174
+ }, async (args) => {
175
+ try {
176
+ const config = buildConfig(args);
177
+ const { memory } = openMemory(config, args.memory);
178
+ const { glossary } = openGlossary(config, args.glossary);
179
+ const { limits } = openLimits(config, args.limits);
180
+ const report = check(config, memory, glossary, limits);
181
+ return {
182
+ content: [
183
+ {
184
+ type: 'text',
185
+ text: `${report.sourceLocale} · ${report.sourceKeys} keys` +
186
+ `${report.memoryLoaded ? '' : ' · no memory'}\n\n${renderTable(report)}`,
187
+ },
188
+ ],
189
+ structuredContent: {
190
+ sourceLocale: report.sourceLocale,
191
+ sourceKeys: report.sourceKeys,
192
+ memoryLoaded: report.memoryLoaded,
193
+ locales: report.stats.map((s) => ({
194
+ locale: s.locale,
195
+ coverage: Number(s.coverage.toFixed(4)),
196
+ missing: s.missing,
197
+ orphan: s.orphan,
198
+ stale: s.stale,
199
+ errors: s.errors,
200
+ warnings: s.warnings,
201
+ })),
202
+ },
203
+ };
204
+ }
205
+ catch (err) {
206
+ return toolError(err);
207
+ }
208
+ });
209
+ server.registerTool('i18n_check', {
210
+ title: 'Lint locale files',
211
+ description: 'Find missing keys, orphans, empty values, structure mismatches, broken placeholders and — when a translation memory exists — translations whose source has changed since (stale). Deterministic: nothing is translated and no network is used. Filter by locale, rule or severity, and page with offset.',
212
+ inputSchema: {
213
+ ...commonInput,
214
+ locale: z.array(z.string()).optional().describe('Only these target locales.'),
215
+ rule: z
216
+ .array(z.enum(RULE_IDS))
217
+ .optional()
218
+ .describe('Only these rules. Naming a rule also enables it if it is off by default.'),
219
+ severity: z.enum(['error', 'warning']).optional().describe('Only this severity.'),
220
+ limit: z
221
+ .number()
222
+ .int()
223
+ .min(1)
224
+ .max(200)
225
+ .optional()
226
+ .describe(`Findings per call (default ${DEFAULT_LIMIT}).`),
227
+ offset: z.number().int().min(0).optional().describe('Skip this many findings.'),
228
+ ignoreIdentical: z
229
+ .array(z.string())
230
+ .optional()
231
+ .describe('Values allowed to equal the source, e.g. ["OK", "Email"].'),
232
+ syntax: z
233
+ .array(z.enum(ALL_SYNTAXES))
234
+ .optional()
235
+ .describe('Override placeholder syntaxes. Add "laravel" for :name projects.'),
236
+ noMemory: z.boolean().optional().describe('Ignore the memory; disables stale detection.'),
237
+ noGlossary: z.boolean().optional().describe('Ignore the glossary.'),
238
+ noLimits: z.boolean().optional().describe('Ignore the width limits.'),
239
+ },
240
+ outputSchema: {
241
+ sourceLocale: z.string(),
242
+ sourceKeys: z.number(),
243
+ memoryLoaded: z.boolean(),
244
+ errors: z.number(),
245
+ warnings: z.number(),
246
+ total: z.number(),
247
+ offset: z.number(),
248
+ findings: z.array(z.object({
249
+ rule: z.string(),
250
+ severity: z.string(),
251
+ locale: z.string(),
252
+ key: z.string(),
253
+ detail: z.string(),
254
+ })),
255
+ },
256
+ annotations: { readOnlyHint: true },
257
+ }, async (args) => {
258
+ try {
259
+ const config = buildConfig(args);
260
+ const rules = new Set((args.rule ?? []));
261
+ // Naming a rule turns it on, so asking for an off-by-default rule works.
262
+ for (const rule of rules) {
263
+ if (config.rules[rule] === 'off')
264
+ config.rules[rule] = 'warning';
265
+ }
266
+ const memory = args.noMemory ? null : openMemory(config, args.memory).memory;
267
+ const glossary = args.noGlossary ? null : openGlossary(config, args.glossary).glossary;
268
+ const limits = args.noLimits ? null : openLimits(config, args.limits).limits;
269
+ const report = check(config, memory, glossary, limits);
270
+ const locales = new Set(args.locale ?? []);
271
+ let findings = report.findings;
272
+ if (locales.size > 0)
273
+ findings = findings.filter((f) => locales.has(f.locale));
274
+ if (rules.size > 0)
275
+ findings = findings.filter((f) => rules.has(f.rule));
276
+ if (args.severity)
277
+ findings = findings.filter((f) => f.severity === args.severity);
278
+ const total = findings.length;
279
+ const offset = args.offset ?? 0;
280
+ const limit = args.limit ?? DEFAULT_LIMIT;
281
+ const page = findings.slice(offset, offset + limit);
282
+ const errors = findings.filter((f) => f.severity === 'error').length;
283
+ const stats = locales.size > 0 ? report.stats.filter((s) => locales.has(s.locale)) : report.stats;
284
+ const text = [
285
+ `${report.sourceLocale} · ${report.sourceKeys} keys · ${errors} errors · ${total - errors} warnings` +
286
+ `${report.memoryLoaded ? '' : ' · no memory'}`,
287
+ '',
288
+ renderTable({ ...report, stats }),
289
+ '',
290
+ renderFindings(page, offset, total),
291
+ ].join('\n');
292
+ return {
293
+ content: [{ type: 'text', text }],
294
+ structuredContent: {
295
+ sourceLocale: report.sourceLocale,
296
+ sourceKeys: report.sourceKeys,
297
+ memoryLoaded: report.memoryLoaded,
298
+ errors,
299
+ warnings: total - errors,
300
+ total,
301
+ offset,
302
+ findings: page.map((f) => ({
303
+ rule: f.rule,
304
+ severity: f.severity,
305
+ locale: f.locale,
306
+ key: f.key,
307
+ detail: f.detail,
308
+ })),
309
+ },
310
+ };
311
+ }
312
+ catch (err) {
313
+ return toolError(err);
314
+ }
315
+ });
316
+ server.registerTool('i18n_sync', {
317
+ title: 'Record translations in the memory',
318
+ description: 'Write the current translations into .i18n/memory.json so later source edits can be detected as stale. Without force this never clears a stale flag: entries whose translation is unchanged keep their old source hash. Run it after translations are updated, and once when adopting the tool.',
319
+ inputSchema: {
320
+ ...commonInput,
321
+ locale: z.array(z.string()).optional().describe('Only record these locales.'),
322
+ origin: z
323
+ .enum(['human', 'machine'])
324
+ .optional()
325
+ .describe('Who produced these translations. Default human, which also marks them reviewed.'),
326
+ force: z
327
+ .boolean()
328
+ .optional()
329
+ .describe('Re-record unchanged translations too, accepting them as current and clearing stale.'),
330
+ },
331
+ outputSchema: {
332
+ memory: z.string(),
333
+ created: z.number(),
334
+ updated: z.number(),
335
+ keptStale: z.number(),
336
+ unchanged: z.number(),
337
+ removed: z.number(),
338
+ },
339
+ annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: true },
340
+ }, async (args) => {
341
+ try {
342
+ const config = buildConfig(args);
343
+ const file = memoryPath(config.root, args.memory);
344
+ const memory = loadMemory(file) ?? emptyMemory(config.sourceLocale);
345
+ const origin = args.origin ?? 'human';
346
+ const result = syncMemory(config, memory, {
347
+ origin,
348
+ reviewed: origin === 'human',
349
+ locales: args.locale,
350
+ force: args.force === true,
351
+ });
352
+ saveMemory(file, memory);
353
+ const note = result.keptStale > 0 && !args.force
354
+ ? `\n${result.keptStale} translation(s) left stale on purpose — retranslate them, or sync with force to accept as-is.`
355
+ : '';
356
+ return {
357
+ content: [
358
+ {
359
+ type: 'text',
360
+ text: `memory ${file}\n` +
361
+ `created ${result.created} updated ${result.updated} ` +
362
+ `kept-stale ${result.keptStale} unchanged ${result.unchanged} removed ${result.removed}` +
363
+ note,
364
+ },
365
+ ],
366
+ structuredContent: { memory: file, ...result },
367
+ };
368
+ }
369
+ catch (err) {
370
+ return toolError(err);
371
+ }
372
+ });
373
+ await server.connect(new StdioServerTransport());
374
+ //# sourceMappingURL=mcp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.js","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"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"}