@better-i18n/mcp 0.15.3 → 0.15.5

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 (99) hide show
  1. package/dist/__tests__/base-tool.test.d.ts +2 -0
  2. package/dist/__tests__/base-tool.test.d.ts.map +1 -0
  3. package/dist/__tests__/base-tool.test.js +193 -0
  4. package/dist/__tests__/base-tool.test.js.map +1 -0
  5. package/dist/__tests__/contract.test.d.ts +24 -0
  6. package/dist/__tests__/contract.test.d.ts.map +1 -0
  7. package/dist/__tests__/contract.test.js +919 -0
  8. package/dist/__tests__/contract.test.js.map +1 -0
  9. package/dist/__tests__/fixtures/mock-client.d.ts +11 -0
  10. package/dist/__tests__/fixtures/mock-client.d.ts.map +1 -0
  11. package/dist/__tests__/fixtures/mock-client.js +33 -0
  12. package/dist/__tests__/fixtures/mock-client.js.map +1 -0
  13. package/dist/__tests__/helpers.d.ts +10 -0
  14. package/dist/__tests__/helpers.d.ts.map +1 -0
  15. package/dist/__tests__/helpers.js +27 -0
  16. package/dist/__tests__/helpers.js.map +1 -0
  17. package/dist/__tests__/schema-alignment.test.d.ts +15 -0
  18. package/dist/__tests__/schema-alignment.test.d.ts.map +1 -0
  19. package/dist/__tests__/schema-alignment.test.js +1011 -0
  20. package/dist/__tests__/schema-alignment.test.js.map +1 -0
  21. package/dist/__tests__/server-dispatch.test.d.ts +10 -0
  22. package/dist/__tests__/server-dispatch.test.d.ts.map +1 -0
  23. package/dist/__tests__/server-dispatch.test.js +202 -0
  24. package/dist/__tests__/server-dispatch.test.js.map +1 -0
  25. package/dist/tools/__tests__/createKeys.test.d.ts +2 -0
  26. package/dist/tools/__tests__/createKeys.test.d.ts.map +1 -0
  27. package/dist/tools/__tests__/createKeys.test.js +139 -0
  28. package/dist/tools/__tests__/createKeys.test.js.map +1 -0
  29. package/dist/tools/__tests__/deleteKeys.test.d.ts +2 -0
  30. package/dist/tools/__tests__/deleteKeys.test.d.ts.map +1 -0
  31. package/dist/tools/__tests__/deleteKeys.test.js +91 -0
  32. package/dist/tools/__tests__/deleteKeys.test.js.map +1 -0
  33. package/dist/tools/__tests__/getPendingChanges.test.d.ts +2 -0
  34. package/dist/tools/__tests__/getPendingChanges.test.d.ts.map +1 -0
  35. package/dist/tools/__tests__/getPendingChanges.test.js +50 -0
  36. package/dist/tools/__tests__/getPendingChanges.test.js.map +1 -0
  37. package/dist/tools/__tests__/getProject.test.d.ts +2 -0
  38. package/dist/tools/__tests__/getProject.test.d.ts.map +1 -0
  39. package/dist/tools/__tests__/getProject.test.js +55 -0
  40. package/dist/tools/__tests__/getProject.test.js.map +1 -0
  41. package/dist/tools/__tests__/getSync.test.d.ts +2 -0
  42. package/dist/tools/__tests__/getSync.test.d.ts.map +1 -0
  43. package/dist/tools/__tests__/getSync.test.js +42 -0
  44. package/dist/tools/__tests__/getSync.test.js.map +1 -0
  45. package/dist/tools/__tests__/getSyncs.test.d.ts +2 -0
  46. package/dist/tools/__tests__/getSyncs.test.d.ts.map +1 -0
  47. package/dist/tools/__tests__/getSyncs.test.js +66 -0
  48. package/dist/tools/__tests__/getSyncs.test.js.map +1 -0
  49. package/dist/tools/__tests__/getTranslations.test.d.ts +2 -0
  50. package/dist/tools/__tests__/getTranslations.test.d.ts.map +1 -0
  51. package/dist/tools/__tests__/getTranslations.test.js +114 -0
  52. package/dist/tools/__tests__/getTranslations.test.js.map +1 -0
  53. package/dist/tools/__tests__/listKeys.test.d.ts +2 -0
  54. package/dist/tools/__tests__/listKeys.test.d.ts.map +1 -0
  55. package/dist/tools/__tests__/listKeys.test.js +98 -0
  56. package/dist/tools/__tests__/listKeys.test.js.map +1 -0
  57. package/dist/tools/__tests__/listProjects.test.d.ts +2 -0
  58. package/dist/tools/__tests__/listProjects.test.d.ts.map +1 -0
  59. package/dist/tools/__tests__/listProjects.test.js +45 -0
  60. package/dist/tools/__tests__/listProjects.test.js.map +1 -0
  61. package/dist/tools/__tests__/proposeLanguageEdits.test.d.ts +2 -0
  62. package/dist/tools/__tests__/proposeLanguageEdits.test.d.ts.map +1 -0
  63. package/dist/tools/__tests__/proposeLanguageEdits.test.js +87 -0
  64. package/dist/tools/__tests__/proposeLanguageEdits.test.js.map +1 -0
  65. package/dist/tools/__tests__/proposeLanguages.test.d.ts +2 -0
  66. package/dist/tools/__tests__/proposeLanguages.test.d.ts.map +1 -0
  67. package/dist/tools/__tests__/proposeLanguages.test.js +109 -0
  68. package/dist/tools/__tests__/proposeLanguages.test.js.map +1 -0
  69. package/dist/tools/__tests__/publishTranslations.test.d.ts +2 -0
  70. package/dist/tools/__tests__/publishTranslations.test.d.ts.map +1 -0
  71. package/dist/tools/__tests__/publishTranslations.test.js +127 -0
  72. package/dist/tools/__tests__/publishTranslations.test.js.map +1 -0
  73. package/dist/tools/__tests__/updateKeys.test.d.ts +2 -0
  74. package/dist/tools/__tests__/updateKeys.test.d.ts.map +1 -0
  75. package/dist/tools/__tests__/updateKeys.test.js +122 -0
  76. package/dist/tools/__tests__/updateKeys.test.js.map +1 -0
  77. package/dist/tools/createKeys.d.ts.map +1 -1
  78. package/dist/tools/createKeys.js +19 -7
  79. package/dist/tools/createKeys.js.map +1 -1
  80. package/dist/tools/deleteKeys.d.ts.map +1 -1
  81. package/dist/tools/deleteKeys.js +9 -1
  82. package/dist/tools/deleteKeys.js.map +1 -1
  83. package/dist/tools/getProject.d.ts.map +1 -1
  84. package/dist/tools/getProject.js +2 -1
  85. package/dist/tools/getProject.js.map +1 -1
  86. package/dist/tools/getTranslations.d.ts +1 -1
  87. package/dist/tools/getTranslations.js +4 -4
  88. package/dist/tools/getTranslations.js.map +1 -1
  89. package/dist/tools/publishTranslations.d.ts.map +1 -1
  90. package/dist/tools/publishTranslations.js +12 -3
  91. package/dist/tools/publishTranslations.js.map +1 -1
  92. package/dist/tools/updateKeys.d.ts.map +1 -1
  93. package/dist/tools/updateKeys.js +8 -3
  94. package/dist/tools/updateKeys.js.map +1 -1
  95. package/dist/worker.test.d.ts +16 -0
  96. package/dist/worker.test.d.ts.map +1 -0
  97. package/dist/worker.test.js +244 -0
  98. package/dist/worker.test.js.map +1 -0
  99. package/package.json +2 -2
@@ -0,0 +1,87 @@
1
+ import { describe, it, expect, vi } from "vitest";
2
+ import { proposeLanguageEdits } from "../proposeLanguageEdits.js";
3
+ import { createMockClient } from "../../__tests__/fixtures/mock-client.js";
4
+ import { expectSuccess, expectError, isErrorResult } from "../../__tests__/helpers.js";
5
+ const mockUpdateLanguagesResult = {
6
+ success: true,
7
+ results: [{ languageCode: "tr", updated: true, status: "archived" }],
8
+ notFound: [],
9
+ };
10
+ describe("proposeLanguageEdits", () => {
11
+ it("rejects missing project → isError", async () => {
12
+ const client = createMockClient();
13
+ const result = await proposeLanguageEdits.execute(client, {
14
+ edits: [{ languageCode: "tr", newStatus: "archived" }],
15
+ });
16
+ expect(isErrorResult(result)).toBe(true);
17
+ });
18
+ it("rejects missing edits array → isError", async () => {
19
+ const client = createMockClient();
20
+ const result = await proposeLanguageEdits.execute(client, {
21
+ project: "my-org/my-project",
22
+ });
23
+ expect(isErrorResult(result)).toBe(true);
24
+ });
25
+ it("rejects empty edits array → isError", async () => {
26
+ const client = createMockClient();
27
+ const result = await proposeLanguageEdits.execute(client, {
28
+ project: "my-org/my-project",
29
+ edits: [],
30
+ });
31
+ expect(isErrorResult(result)).toBe(true);
32
+ });
33
+ it("normalizes languageCode to lowercase", async () => {
34
+ const mutateFn = vi.fn().mockResolvedValue(mockUpdateLanguagesResult);
35
+ const client = createMockClient({ mcp: { updateLanguages: { mutate: mutateFn } } });
36
+ await proposeLanguageEdits.execute(client, {
37
+ project: "my-org/my-project",
38
+ edits: [{ languageCode: "TR", newStatus: "archived" }],
39
+ });
40
+ expect(mutateFn).toHaveBeenCalledWith(expect.objectContaining({
41
+ updates: expect.arrayContaining([
42
+ expect.objectContaining({ languageCode: "tr" }),
43
+ ]),
44
+ }));
45
+ });
46
+ it("maps edits[].newStatus → updates[].status (field rename)", async () => {
47
+ const mutateFn = vi.fn().mockResolvedValue(mockUpdateLanguagesResult);
48
+ const client = createMockClient({ mcp: { updateLanguages: { mutate: mutateFn } } });
49
+ await proposeLanguageEdits.execute(client, {
50
+ project: "my-org/my-project",
51
+ edits: [{ languageCode: "tr", newStatus: "draft" }],
52
+ });
53
+ expect(mutateFn).toHaveBeenCalledWith(expect.objectContaining({
54
+ updates: expect.arrayContaining([
55
+ expect.objectContaining({ languageCode: "tr", status: "draft" }),
56
+ ]),
57
+ }));
58
+ // Ensure the API is NOT called with the input field name "newStatus"
59
+ const callArg = mutateFn.mock.calls[0][0];
60
+ const update = callArg.updates[0];
61
+ expect(update).not.toHaveProperty("newStatus");
62
+ });
63
+ it("wraps response with success/results/notFound/project fields", async () => {
64
+ const mutateFn = vi.fn().mockResolvedValue(mockUpdateLanguagesResult);
65
+ const client = createMockClient({ mcp: { updateLanguages: { mutate: mutateFn } } });
66
+ const result = await proposeLanguageEdits.execute(client, {
67
+ project: "my-org/my-project",
68
+ edits: [{ languageCode: "tr", newStatus: "archived" }],
69
+ });
70
+ const data = expectSuccess(result);
71
+ expect(data).toHaveProperty("success", true);
72
+ expect(data).toHaveProperty("results");
73
+ expect(data).toHaveProperty("notFound");
74
+ expect(data).toHaveProperty("project", "my-org/my-project");
75
+ });
76
+ it("returns isError when API throws", async () => {
77
+ const mutateFn = vi.fn().mockRejectedValue(new Error("Language not found"));
78
+ const client = createMockClient({ mcp: { updateLanguages: { mutate: mutateFn } } });
79
+ const result = await proposeLanguageEdits.execute(client, {
80
+ project: "my-org/my-project",
81
+ edits: [{ languageCode: "tr", newStatus: "archived" }],
82
+ });
83
+ expect(isErrorResult(result)).toBe(true);
84
+ expect(expectError(result)).toContain("Language not found");
85
+ });
86
+ });
87
+ //# sourceMappingURL=proposeLanguageEdits.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proposeLanguageEdits.test.js","sourceRoot":"","sources":["../../../src/tools/__tests__/proposeLanguageEdits.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=proposeLanguages.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proposeLanguages.test.d.ts","sourceRoot":"","sources":["../../../src/tools/__tests__/proposeLanguages.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,109 @@
1
+ import { describe, it, expect, vi } from "vitest";
2
+ import { proposeLanguages } from "../proposeLanguages.js";
3
+ import { createMockClient } from "../../__tests__/fixtures/mock-client.js";
4
+ import { expectSuccess, expectError, isErrorResult } from "../../__tests__/helpers.js";
5
+ const mockAddLanguagesResult = {
6
+ success: true,
7
+ added: ["fr"],
8
+ skipped: [],
9
+ results: [{ languageCode: "fr", added: true }],
10
+ };
11
+ describe("proposeLanguages", () => {
12
+ it("rejects missing project → isError", async () => {
13
+ const client = createMockClient();
14
+ const result = await proposeLanguages.execute(client, {
15
+ languages: [{ languageCode: "fr" }],
16
+ });
17
+ expect(isErrorResult(result)).toBe(true);
18
+ });
19
+ it("rejects missing languages array → isError", async () => {
20
+ const client = createMockClient();
21
+ const result = await proposeLanguages.execute(client, {
22
+ project: "my-org/my-project",
23
+ });
24
+ expect(isErrorResult(result)).toBe(true);
25
+ });
26
+ it("rejects empty languages array (min 1) → isError", async () => {
27
+ const client = createMockClient();
28
+ const result = await proposeLanguages.execute(client, {
29
+ project: "my-org/my-project",
30
+ languages: [],
31
+ });
32
+ expect(isErrorResult(result)).toBe(true);
33
+ });
34
+ it("rejects languageCode shorter than 2 chars → isError", async () => {
35
+ const client = createMockClient();
36
+ const result = await proposeLanguages.execute(client, {
37
+ project: "my-org/my-project",
38
+ languages: [{ languageCode: "f" }],
39
+ });
40
+ expect(isErrorResult(result)).toBe(true);
41
+ });
42
+ it("normalizes languageCode to lowercase — 'FR' → client receives 'fr'", async () => {
43
+ const mutateFn = vi.fn().mockResolvedValue(mockAddLanguagesResult);
44
+ const client = createMockClient({ mcp: { addLanguages: { mutate: mutateFn } } });
45
+ await proposeLanguages.execute(client, {
46
+ project: "my-org/my-project",
47
+ languages: [{ languageCode: "FR" }],
48
+ });
49
+ expect(mutateFn).toHaveBeenCalledWith(expect.objectContaining({
50
+ languages: expect.arrayContaining([
51
+ expect.objectContaining({ languageCode: "fr" }),
52
+ ]),
53
+ }));
54
+ });
55
+ it("omits status when not provided (uses API default)", async () => {
56
+ const mutateFn = vi.fn().mockResolvedValue(mockAddLanguagesResult);
57
+ const client = createMockClient({ mcp: { addLanguages: { mutate: mutateFn } } });
58
+ await proposeLanguages.execute(client, {
59
+ project: "my-org/my-project",
60
+ languages: [{ languageCode: "fr" }],
61
+ });
62
+ expect(mutateFn).toHaveBeenCalledWith(expect.objectContaining({
63
+ languages: expect.arrayContaining([
64
+ expect.objectContaining({ languageCode: "fr" }),
65
+ ]),
66
+ }));
67
+ });
68
+ it("passes through explicit status 'draft'", async () => {
69
+ const mutateFn = vi.fn().mockResolvedValue({
70
+ ...mockAddLanguagesResult,
71
+ added: ["de"],
72
+ results: [{ languageCode: "de", added: true }],
73
+ });
74
+ const client = createMockClient({ mcp: { addLanguages: { mutate: mutateFn } } });
75
+ await proposeLanguages.execute(client, {
76
+ project: "my-org/my-project",
77
+ languages: [{ languageCode: "de", status: "draft" }],
78
+ });
79
+ expect(mutateFn).toHaveBeenCalledWith(expect.objectContaining({
80
+ languages: expect.arrayContaining([
81
+ expect.objectContaining({ languageCode: "de", status: "draft" }),
82
+ ]),
83
+ }));
84
+ });
85
+ it("wraps response with success/added/skipped/project fields", async () => {
86
+ const mutateFn = vi.fn().mockResolvedValue(mockAddLanguagesResult);
87
+ const client = createMockClient({ mcp: { addLanguages: { mutate: mutateFn } } });
88
+ const result = await proposeLanguages.execute(client, {
89
+ project: "my-org/my-project",
90
+ languages: [{ languageCode: "fr" }],
91
+ });
92
+ const data = expectSuccess(result);
93
+ expect(data).toHaveProperty("success", true);
94
+ expect(data).toHaveProperty("added");
95
+ expect(data).toHaveProperty("skipped");
96
+ expect(data).toHaveProperty("project", "my-org/my-project");
97
+ });
98
+ it("returns isError when API throws", async () => {
99
+ const mutateFn = vi.fn().mockRejectedValue(new Error("Language limit exceeded"));
100
+ const client = createMockClient({ mcp: { addLanguages: { mutate: mutateFn } } });
101
+ const result = await proposeLanguages.execute(client, {
102
+ project: "my-org/my-project",
103
+ languages: [{ languageCode: "fr" }],
104
+ });
105
+ expect(isErrorResult(result)).toBe(true);
106
+ expect(expectError(result)).toContain("Language limit exceeded");
107
+ });
108
+ });
109
+ //# sourceMappingURL=proposeLanguages.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proposeLanguages.test.js","sourceRoot":"","sources":["../../../src/tools/__tests__/proposeLanguages.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=publishTranslations.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publishTranslations.test.d.ts","sourceRoot":"","sources":["../../../src/tools/__tests__/publishTranslations.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,127 @@
1
+ import { describe, it, expect, vi } from "vitest";
2
+ import { publishTranslations } from "../publishTranslations.js";
3
+ import { createMockClient } from "../../__tests__/fixtures/mock-client.js";
4
+ const VALID_KEY_ID = "550e8400-e29b-41d4-a716-446655440000";
5
+ describe("publishTranslations", () => {
6
+ describe("input validation", () => {
7
+ it("rejects missing project", async () => {
8
+ const client = createMockClient();
9
+ const result = await publishTranslations.execute(client, {
10
+ translations: [{ keyId: VALID_KEY_ID, languageCode: "tr" }],
11
+ });
12
+ expect(result.isError).toBe(true);
13
+ });
14
+ it("accepts project-only input (publish all)", async () => {
15
+ const mutateMock = vi.fn().mockResolvedValue({ syncJobIds: ["job-1"] });
16
+ const client = createMockClient({
17
+ mcp: { publishTranslations: { mutate: mutateMock } },
18
+ });
19
+ const result = await publishTranslations.execute(client, {
20
+ project: "org/proj",
21
+ });
22
+ expect(result.isError).toBeUndefined();
23
+ const call = mutateMock.mock.calls[0][0];
24
+ expect(call.translations).toBeUndefined();
25
+ });
26
+ });
27
+ describe("data normalization", () => {
28
+ it("normalizes languageCode to lowercase", async () => {
29
+ const mutateMock = vi.fn().mockResolvedValue({ syncJobIds: ["job-1"] });
30
+ const client = createMockClient({
31
+ mcp: { publishTranslations: { mutate: mutateMock } },
32
+ });
33
+ await publishTranslations.execute(client, {
34
+ project: "org/proj",
35
+ translations: [{ keyId: VALID_KEY_ID, languageCode: "TR" }],
36
+ });
37
+ const call = mutateMock.mock.calls[0][0];
38
+ expect(call.translations[0].languageCode).toBe("tr");
39
+ });
40
+ it("passes keyId through unchanged", async () => {
41
+ const mutateMock = vi.fn().mockResolvedValue({ syncJobIds: ["job-1"] });
42
+ const client = createMockClient({
43
+ mcp: { publishTranslations: { mutate: mutateMock } },
44
+ });
45
+ await publishTranslations.execute(client, {
46
+ project: "org/proj",
47
+ translations: [{ keyId: VALID_KEY_ID, languageCode: "de" }],
48
+ });
49
+ const call = mutateMock.mock.calls[0][0];
50
+ expect(call.translations[0].keyId).toBe(VALID_KEY_ID);
51
+ });
52
+ });
53
+ describe("API call", () => {
54
+ it("sends undefined translations for full publish", async () => {
55
+ const mutateMock = vi.fn().mockResolvedValue({ syncJobIds: ["job-1"] });
56
+ const client = createMockClient({
57
+ mcp: { publishTranslations: { mutate: mutateMock } },
58
+ });
59
+ await publishTranslations.execute(client, { project: "org/proj" });
60
+ expect(mutateMock).toHaveBeenCalledWith({
61
+ orgSlug: "org",
62
+ projectSlug: "proj",
63
+ translations: undefined,
64
+ });
65
+ });
66
+ it("sends specific translations for selective publish", async () => {
67
+ const mutateMock = vi.fn().mockResolvedValue({ syncJobIds: ["job-1"] });
68
+ const client = createMockClient({
69
+ mcp: { publishTranslations: { mutate: mutateMock } },
70
+ });
71
+ const uuid2 = "660e8400-e29b-41d4-a716-446655440001";
72
+ await publishTranslations.execute(client, {
73
+ project: "org/proj",
74
+ translations: [
75
+ { keyId: VALID_KEY_ID, languageCode: "tr" },
76
+ { keyId: uuid2, languageCode: "de" },
77
+ ],
78
+ });
79
+ const call = mutateMock.mock.calls[0][0];
80
+ expect(call.translations).toHaveLength(2);
81
+ expect(call.translations[0]).toEqual({ keyId: VALID_KEY_ID, languageCode: "tr" });
82
+ expect(call.translations[1]).toEqual({ keyId: uuid2, languageCode: "de" });
83
+ });
84
+ it("calls client.mcp.publishTranslations.mutate with correct params", async () => {
85
+ const mutateMock = vi.fn().mockResolvedValue({ syncJobIds: ["job-42"] });
86
+ const client = createMockClient({
87
+ mcp: { publishTranslations: { mutate: mutateMock } },
88
+ });
89
+ await publishTranslations.execute(client, {
90
+ project: "my-org/my-proj",
91
+ translations: [{ keyId: VALID_KEY_ID, languageCode: "fr" }],
92
+ });
93
+ expect(mutateMock).toHaveBeenCalledWith({
94
+ orgSlug: "my-org",
95
+ projectSlug: "my-proj",
96
+ translations: [{ keyId: VALID_KEY_ID, languageCode: "fr" }],
97
+ });
98
+ });
99
+ it("returns API response as success", async () => {
100
+ const apiResponse = { syncJobIds: ["job-1", "job-2"] };
101
+ const mutateMock = vi.fn().mockResolvedValue(apiResponse);
102
+ const client = createMockClient({
103
+ mcp: { publishTranslations: { mutate: mutateMock } },
104
+ });
105
+ const result = await publishTranslations.execute(client, {
106
+ project: "org/proj",
107
+ });
108
+ expect(result.isError).toBeUndefined();
109
+ const parsed = JSON.parse(result.content[0].text);
110
+ expect(parsed).toEqual(apiResponse);
111
+ });
112
+ });
113
+ describe("error handling", () => {
114
+ it("returns isError when API throws", async () => {
115
+ const mutateMock = vi.fn().mockRejectedValue(new Error("Publish failed"));
116
+ const client = createMockClient({
117
+ mcp: { publishTranslations: { mutate: mutateMock } },
118
+ });
119
+ const result = await publishTranslations.execute(client, {
120
+ project: "org/proj",
121
+ });
122
+ expect(result.isError).toBe(true);
123
+ expect(result.content[0].text).toContain("Publish failed");
124
+ });
125
+ });
126
+ });
127
+ //# sourceMappingURL=publishTranslations.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publishTranslations.test.js","sourceRoot":"","sources":["../../../src/tools/__tests__/publishTranslations.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=updateKeys.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"updateKeys.test.d.ts","sourceRoot":"","sources":["../../../src/tools/__tests__/updateKeys.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,122 @@
1
+ import { describe, it, expect, vi } from "vitest";
2
+ import { updateKeys } from "../updateKeys.js";
3
+ import { createMockClient } from "../../__tests__/fixtures/mock-client.js";
4
+ const VALID_UUID = "550e8400-e29b-41d4-a716-446655440000";
5
+ describe("updateKeys", () => {
6
+ describe("input validation", () => {
7
+ it("rejects missing project", async () => {
8
+ const client = createMockClient();
9
+ const result = await updateKeys.execute(client, {
10
+ t: [{ id: VALID_UUID, l: "tr", t: "Merhaba" }],
11
+ });
12
+ expect(result.isError).toBe(true);
13
+ });
14
+ it("rejects missing t array", async () => {
15
+ const client = createMockClient();
16
+ const result = await updateKeys.execute(client, { project: "org/proj" });
17
+ expect(result.isError).toBe(true);
18
+ });
19
+ it("rejects empty t array", async () => {
20
+ const client = createMockClient();
21
+ const result = await updateKeys.execute(client, {
22
+ project: "org/proj",
23
+ t: [],
24
+ });
25
+ expect(result.isError).toBe(true);
26
+ });
27
+ it("rejects items missing required fields", async () => {
28
+ const client = createMockClient();
29
+ // Missing l and t fields
30
+ const result = await updateKeys.execute(client, {
31
+ project: "org/proj",
32
+ t: [{ id: VALID_UUID }],
33
+ });
34
+ expect(result.isError).toBe(true);
35
+ });
36
+ });
37
+ describe("data normalization", () => {
38
+ it("normalizes language code to lowercase", async () => {
39
+ const mutateMock = vi.fn().mockResolvedValue({ updated: 1 });
40
+ const client = createMockClient({
41
+ mcp: { updateKeys: { mutate: mutateMock } },
42
+ });
43
+ await updateKeys.execute(client, {
44
+ project: "org/proj",
45
+ t: [{ id: VALID_UUID, l: "TR", t: "Merhaba" }],
46
+ });
47
+ const call = mutateMock.mock.calls[0][0];
48
+ expect(call.t[0].l).toBe("tr");
49
+ });
50
+ it("preserves other fields", async () => {
51
+ const mutateMock = vi.fn().mockResolvedValue({ updated: 1 });
52
+ const client = createMockClient({
53
+ mcp: { updateKeys: { mutate: mutateMock } },
54
+ });
55
+ await updateKeys.execute(client, {
56
+ project: "org/proj",
57
+ t: [{ id: VALID_UUID, l: "de", t: "Guten Tag", s: true, st: "published" }],
58
+ });
59
+ const call = mutateMock.mock.calls[0][0];
60
+ expect(call.t[0]).toMatchObject({
61
+ id: VALID_UUID,
62
+ l: "de",
63
+ t: "Guten Tag",
64
+ s: true,
65
+ st: "published",
66
+ });
67
+ });
68
+ });
69
+ describe("API call", () => {
70
+ it("calls client.mcp.updateKeys.mutate with correct params", async () => {
71
+ const mutateMock = vi.fn().mockResolvedValue({ updated: 2 });
72
+ const client = createMockClient({
73
+ mcp: { updateKeys: { mutate: mutateMock } },
74
+ });
75
+ const uuid2 = "660e8400-e29b-41d4-a716-446655440001";
76
+ await updateKeys.execute(client, {
77
+ project: "my-org/my-proj",
78
+ t: [
79
+ { id: VALID_UUID, l: "tr", t: "Merhaba" },
80
+ { id: uuid2, l: "fr", t: "Bonjour" },
81
+ ],
82
+ });
83
+ expect(mutateMock).toHaveBeenCalledWith({
84
+ orgSlug: "my-org",
85
+ projectSlug: "my-proj",
86
+ t: [
87
+ { id: VALID_UUID, l: "tr", t: "Merhaba" },
88
+ { id: uuid2, l: "fr", t: "Bonjour" },
89
+ ],
90
+ });
91
+ });
92
+ it("returns API response as success", async () => {
93
+ const apiResponse = { updated: 1 };
94
+ const mutateMock = vi.fn().mockResolvedValue(apiResponse);
95
+ const client = createMockClient({
96
+ mcp: { updateKeys: { mutate: mutateMock } },
97
+ });
98
+ const result = await updateKeys.execute(client, {
99
+ project: "org/proj",
100
+ t: [{ id: VALID_UUID, l: "tr", t: "Merhaba" }],
101
+ });
102
+ expect(result.isError).toBeUndefined();
103
+ const parsed = JSON.parse(result.content[0].text);
104
+ expect(parsed).toEqual(apiResponse);
105
+ });
106
+ });
107
+ describe("error handling", () => {
108
+ it("returns isError when API throws", async () => {
109
+ const mutateMock = vi.fn().mockRejectedValue(new Error("Network error"));
110
+ const client = createMockClient({
111
+ mcp: { updateKeys: { mutate: mutateMock } },
112
+ });
113
+ const result = await updateKeys.execute(client, {
114
+ project: "org/proj",
115
+ t: [{ id: VALID_UUID, l: "tr", t: "Merhaba" }],
116
+ });
117
+ expect(result.isError).toBe(true);
118
+ expect(result.content[0].text).toContain("Network error");
119
+ });
120
+ });
121
+ });
122
+ //# sourceMappingURL=updateKeys.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"updateKeys.test.js","sourceRoot":"","sources":["../../../src/tools/__tests__/updateKeys.test.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"createKeys.d.ts","sourceRoot":"","sources":["../../src/tools/createKeys.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AASH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAsB9C,eAAO,MAAM,UAAU,EAAE,IAuExB,CAAC"}
1
+ {"version":3,"file":"createKeys.d.ts","sourceRoot":"","sources":["../../src/tools/createKeys.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AASH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAsB9C,eAAO,MAAM,UAAU,EAAE,IAmFxB,CAAC"}
@@ -27,14 +27,26 @@ export const createKeys = {
27
27
  name: "createKeys",
28
28
  description: `Create NEW translation keys with source text and optional translations.
29
29
 
30
- IMPORTANT avoid accidental duplicates:
31
- - Call getProject first to see existing namespaces and key count
32
- - ns defaults to 'default'. Use the SAME namespace as existing keys
33
- - Same key name in a different namespace creates a SEPARATE key (not a duplicate)
34
- - To add translations to EXISTING keys, use listKeys + updateKeys instead
30
+ REQUIRED WORKFLOW (follow in order):
31
+ 1. Call getProject FIRST to get the list of existing namespaces and languages.
32
+ 2. Use the namespace list to set 'ns' correctly for each key.
33
+ 3. Call createKeys with properly routed keys.
34
+ 4. Call getPendingChanges to verify, then publishTranslations to deploy.
35
35
 
36
- Response fields: 'dup' = same-namespace skips, 'warn' = cross-namespace name matches
37
- Don't include source language in translations use v (source value) instead.`,
36
+ NAMESPACE RULE (CRITICAL):
37
+ - First dot-segment = namespace (ns), remaining segments = key name (n).
38
+ - WRONG: { n: "terms.meta.title", ns: "default" } — namespace embedded in key name!
39
+ - CORRECT: { n: "meta.title", ns: "terms" }
40
+ - An unknown ns value silently creates a NEW namespace — always verify against getProject output.
41
+ - Same key name in a different namespace creates a SEPARATE key (not a duplicate).
42
+
43
+ SILENT BEHAVIORS:
44
+ - Existing keys (same name + namespace) are silently SKIPPED. Use updateKeys instead.
45
+ - Source language translations in 't' are silently DROPPED. Use 'v' for source text.
46
+ - If 'n' starts with an existing namespace, server auto-corrects but returns a warning.
47
+
48
+ Response fields: 'dup' = same-namespace skips, 'warn' = cross-namespace name matches.
49
+ To add translations to EXISTING keys, use listKeys + updateKeys instead.`,
38
50
  inputSchema: {
39
51
  type: "object",
40
52
  properties: {
@@ -1 +1 @@
1
- {"version":3,"file":"createKeys.js","sourceRoot":"","sources":["../../src/tools/createKeys.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"createKeys.js","sourceRoot":"","sources":["../../src/tools/createKeys.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EACL,WAAW,EACX,oBAAoB,EACpB,aAAa,EACb,OAAO,GACR,MAAM,iBAAiB,CAAC;AAGzB,MAAM,sBAAsB,GAAG,CAAC,CAAC,MAAM,CAAC;IACtC,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAClC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC3B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC7B,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC/B,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;CACrC,CAAC,CAAC,QAAQ,EAAE,CAAC;AAEd,MAAM,WAAW,GAAG,aAAa,CAAC,MAAM,CAAC;IACvC,CAAC,EAAE,CAAC,CAAC,KAAK,CACR,CAAC,CAAC,MAAM,CAAC;QACP,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,8CAA8C,CAAC;QACtE,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,gCAAgC,CAAC;QAC5E,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sBAAsB,CAAC;QACzD,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yCAAyC,CAAC;QAClG,EAAE,EAAE,sBAAsB;KAC3B,CAAC,CACH,CAAC,GAAG,CAAC,CAAC,CAAC;CACT,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,UAAU,GAAS;IAC9B,UAAU,EAAE;QACV,IAAI,EAAE,YAAY;QAClB,WAAW,EAAE;;;;;;;;;;;;;;;;;;;;;yEAqBwD;QACrE,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,GAAG,oBAAoB;gBACvB,CAAC,EAAE;oBACD,IAAI,EAAE,OAAO;oBACb,WAAW,EAAE,yBAAyB;oBACtC,KAAK,EAAE;wBACL,IAAI,EAAE,QAAQ;wBACd,UAAU,EAAE;4BACV,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,8CAA8C,EAAE;4BAClF,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,+GAA+G,EAAE;4BACpJ,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,sBAAsB,EAAE;4BAC1D,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,yCAAyC,EAAE;4BAC7E,EAAE,EAAE;gCACF,IAAI,EAAE,QAAQ;gCACd,WAAW,EAAE,6GAA6G;gCAC1H,UAAU,EAAE;oCACV,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,8BAA8B,EAAE;oCAC5E,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,4BAA4B,EAAE;oCACnE,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,2CAA2C,EAAE;oCACpF,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,qDAAqD,EAAE;oCAChG,IAAI,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,WAAW,EAAE,yBAAyB,EAAE;iCAC3F;6BACF;yBACF;wBACD,QAAQ,EAAE,CAAC,GAAG,CAAC;qBAChB;iBACF;aACF;YACD,QAAQ,EAAE,CAAC,SAAS,EAAE,GAAG,CAAC;SAC3B;KACF;IAED,OAAO,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,CACxB,WAAW,CACT,IAAI,EACJ,WAAW,EACX,KAAK,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,WAAW,EAAE,EAAE,EAAE;QAC5C,iDAAiD;QACjD,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;YAC1B,IAAI,CAAC,GAAG,CAAC,CAAC;gBAAE,OAAO,GAAG,CAAC;YACvB,MAAM,UAAU,GAA2B,EAAE,CAAC;YAC9C,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;gBACjD,UAAU,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,GAAG,IAAI,CAAC;YACxC,CAAC;YACD,OAAO,EAAE,GAAG,GAAG,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC;QACnC,CAAC,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC;YAChD,OAAO,EAAE,WAAW;YACpB,WAAW;YACX,CAAC;SACF,CAAC,CAAC;QAEH,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC;IACzB,CAAC,CACF;CACJ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"deleteKeys.d.ts","sourceRoot":"","sources":["../../src/tools/deleteKeys.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AASH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAM9C,eAAO,MAAM,UAAU,EAAE,IA4BxB,CAAC"}
1
+ {"version":3,"file":"deleteKeys.d.ts","sourceRoot":"","sources":["../../src/tools/deleteKeys.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AASH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAM9C,eAAO,MAAM,UAAU,EAAE,IAmCxB,CAAC"}
@@ -12,7 +12,15 @@ const inputSchema = projectSchema.extend({
12
12
  export const deleteKeys = {
13
13
  definition: {
14
14
  name: "deleteKeys",
15
- description: "Soft-delete translation keys by UUID. Keys are marked for deletion and removed from CDN/GitHub on next publish. Get UUIDs from listKeys.",
15
+ description: `Soft-delete translation keys by UUID (max 100 per call).
16
+
17
+ REQUIRED WORKFLOW:
18
+ 1. Call listKeys to find and verify key IDs (UUIDs) before deleting.
19
+ 2. Call deleteKeys with verified UUIDs.
20
+ 3. Call getPendingChanges to review what will be permanently deleted.
21
+ 4. Call publishTranslations only when ready — after publish, deleted keys are PERMANENTLY removed with NO recovery.
22
+
23
+ Check 'skipped' in response — lists IDs not found or already deleted.`,
16
24
  inputSchema: {
17
25
  type: "object",
18
26
  properties: {
@@ -1 +1 @@
1
- {"version":3,"file":"deleteKeys.js","sourceRoot":"","sources":["../../src/tools/deleteKeys.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EACL,WAAW,EACX,oBAAoB,EACpB,aAAa,EACb,OAAO,GACR,MAAM,iBAAiB,CAAC;AAGzB,MAAM,WAAW,GAAG,aAAa,CAAC,MAAM,CAAC;IACvC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;CACnD,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,UAAU,GAAS;IAC9B,UAAU,EAAE;QACV,IAAI,EAAE,YAAY;QAClB,WAAW,EACT,0IAA0I;QAC5I,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,GAAG,oBAAoB;gBACvB,MAAM,EAAE;oBACN,IAAI,EAAE,OAAO;oBACb,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;iBAC1B;aACF;YACD,QAAQ,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC;SAChC;KACF;IAED,OAAO,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,CACxB,WAAW,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,WAAW,EAAE,EAAE,EAAE;QAC3E,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC;YAChD,OAAO,EAAE,WAAW;YACpB,WAAW;YACX,MAAM,EAAE,KAAK,CAAC,MAAM;SACrB,CAAC,CAAC;QAEH,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC;IACzB,CAAC,CAAC;CACL,CAAC"}
1
+ {"version":3,"file":"deleteKeys.js","sourceRoot":"","sources":["../../src/tools/deleteKeys.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EACL,WAAW,EACX,oBAAoB,EACpB,aAAa,EACb,OAAO,GACR,MAAM,iBAAiB,CAAC;AAGzB,MAAM,WAAW,GAAG,aAAa,CAAC,MAAM,CAAC;IACvC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;CACnD,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,UAAU,GAAS;IAC9B,UAAU,EAAE;QACV,IAAI,EAAE,YAAY;QAClB,WAAW,EAAE;;;;;;;;sEAQqD;QAClE,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,GAAG,oBAAoB;gBACvB,MAAM,EAAE;oBACN,IAAI,EAAE,OAAO;oBACb,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;iBAC1B;aACF;YACD,QAAQ,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC;SAChC;KACF;IAED,OAAO,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,CACxB,WAAW,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,WAAW,EAAE,EAAE,EAAE;QAC3E,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC;YAChD,OAAO,EAAE,WAAW;YACpB,WAAW;YACX,MAAM,EAAE,KAAK,CAAC,MAAM;SACrB,CAAC,CAAC;QAEH,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC;IACzB,CAAC,CAAC;CACL,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"getProject.d.ts","sourceRoot":"","sources":["../../src/tools/getProject.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAQH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAI9C,eAAO,MAAM,UAAU,EAAE,IA2BxB,CAAC"}
1
+ {"version":3,"file":"getProject.d.ts","sourceRoot":"","sources":["../../src/tools/getProject.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAQH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAI9C,eAAO,MAAM,UAAU,EAAE,IA4BxB,CAAC"}
@@ -9,7 +9,8 @@ export const getProject = {
9
9
  definition: {
10
10
  name: "getProject",
11
11
  description: "Get project details including namespaces, languages, key count, and translation coverage. " +
12
- "Use this after listProjects to understand a specific project's structure. " +
12
+ "CALL THIS BEFORE createKeys you need the namespace list to route keys correctly. " +
13
+ "Using wrong namespaces silently creates duplicates in the wrong namespace. " +
13
14
  "Namespaces include rich metadata: name, keyCount, description, and context (team, domain, aiPrompt, tags). " +
14
15
  "Response includes CDN delivery metadata (cdn field): base URL, manifest URL, " +
15
16
  "URL pattern with {locale}/{namespace} placeholders, and example URLs. " +