@kywi-software/mcp 0.1.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 (119) hide show
  1. package/LICENSE +661 -0
  2. package/README.md +77 -0
  3. package/dist/__tests__/auto-detect.test.d.ts +2 -0
  4. package/dist/__tests__/auto-detect.test.d.ts.map +1 -0
  5. package/dist/__tests__/auto-detect.test.js +134 -0
  6. package/dist/__tests__/auto-detect.test.js.map +1 -0
  7. package/dist/__tests__/config.test.d.ts +2 -0
  8. package/dist/__tests__/config.test.d.ts.map +1 -0
  9. package/dist/__tests__/config.test.js +72 -0
  10. package/dist/__tests__/config.test.js.map +1 -0
  11. package/dist/__tests__/developer-mutation.test.d.ts +2 -0
  12. package/dist/__tests__/developer-mutation.test.d.ts.map +1 -0
  13. package/dist/__tests__/developer-mutation.test.js +511 -0
  14. package/dist/__tests__/developer-mutation.test.js.map +1 -0
  15. package/dist/__tests__/developer-read-only.test.d.ts +2 -0
  16. package/dist/__tests__/developer-read-only.test.d.ts.map +1 -0
  17. package/dist/__tests__/developer-read-only.test.js +192 -0
  18. package/dist/__tests__/developer-read-only.test.js.map +1 -0
  19. package/dist/__tests__/site-content-tools.test.d.ts +2 -0
  20. package/dist/__tests__/site-content-tools.test.d.ts.map +1 -0
  21. package/dist/__tests__/site-content-tools.test.js +446 -0
  22. package/dist/__tests__/site-content-tools.test.js.map +1 -0
  23. package/dist/__tests__/site-layout-tools.test.d.ts +2 -0
  24. package/dist/__tests__/site-layout-tools.test.d.ts.map +1 -0
  25. package/dist/__tests__/site-layout-tools.test.js +316 -0
  26. package/dist/__tests__/site-layout-tools.test.js.map +1 -0
  27. package/dist/__tests__/site-other-tools.test.d.ts +2 -0
  28. package/dist/__tests__/site-other-tools.test.d.ts.map +1 -0
  29. package/dist/__tests__/site-other-tools.test.js +318 -0
  30. package/dist/__tests__/site-other-tools.test.js.map +1 -0
  31. package/dist/config.d.ts +31 -0
  32. package/dist/config.d.ts.map +1 -0
  33. package/dist/config.js +4 -0
  34. package/dist/config.js.map +1 -0
  35. package/dist/developer/auto-detect.d.ts +17 -0
  36. package/dist/developer/auto-detect.d.ts.map +1 -0
  37. package/dist/developer/auto-detect.js +54 -0
  38. package/dist/developer/auto-detect.js.map +1 -0
  39. package/dist/developer/cli.d.ts +3 -0
  40. package/dist/developer/cli.d.ts.map +1 -0
  41. package/dist/developer/cli.js +14 -0
  42. package/dist/developer/cli.js.map +1 -0
  43. package/dist/developer/index.d.ts +4 -0
  44. package/dist/developer/index.d.ts.map +1 -0
  45. package/dist/developer/index.js +9 -0
  46. package/dist/developer/index.js.map +1 -0
  47. package/dist/developer/server.d.ts +4 -0
  48. package/dist/developer/server.d.ts.map +1 -0
  49. package/dist/developer/server.js +29 -0
  50. package/dist/developer/server.js.map +1 -0
  51. package/dist/developer/tools/api-keys.d.ts +48 -0
  52. package/dist/developer/tools/api-keys.d.ts.map +1 -0
  53. package/dist/developer/tools/api-keys.js +51 -0
  54. package/dist/developer/tools/api-keys.js.map +1 -0
  55. package/dist/developer/tools/config-mutation.d.ts +139 -0
  56. package/dist/developer/tools/config-mutation.d.ts.map +1 -0
  57. package/dist/developer/tools/config-mutation.js +277 -0
  58. package/dist/developer/tools/config-mutation.js.map +1 -0
  59. package/dist/developer/tools/content-type-tools.d.ts +32 -0
  60. package/dist/developer/tools/content-type-tools.d.ts.map +1 -0
  61. package/dist/developer/tools/content-type-tools.js +92 -0
  62. package/dist/developer/tools/content-type-tools.js.map +1 -0
  63. package/dist/developer/tools/read-only.d.ts +86 -0
  64. package/dist/developer/tools/read-only.d.ts.map +1 -0
  65. package/dist/developer/tools/read-only.js +235 -0
  66. package/dist/developer/tools/read-only.js.map +1 -0
  67. package/dist/developer/tools/scaffolding.d.ts +67 -0
  68. package/dist/developer/tools/scaffolding.d.ts.map +1 -0
  69. package/dist/developer/tools/scaffolding.js +207 -0
  70. package/dist/developer/tools/scaffolding.js.map +1 -0
  71. package/dist/index.d.ts +7 -0
  72. package/dist/index.d.ts.map +1 -0
  73. package/dist/index.js +6 -0
  74. package/dist/index.js.map +1 -0
  75. package/dist/shared.d.ts +15 -0
  76. package/dist/shared.d.ts.map +1 -0
  77. package/dist/shared.js +7 -0
  78. package/dist/shared.js.map +1 -0
  79. package/dist/site/cli.d.ts +3 -0
  80. package/dist/site/cli.d.ts.map +1 -0
  81. package/dist/site/cli.js +12 -0
  82. package/dist/site/cli.js.map +1 -0
  83. package/dist/site/index.d.ts +4 -0
  84. package/dist/site/index.d.ts.map +1 -0
  85. package/dist/site/index.js +9 -0
  86. package/dist/site/index.js.map +1 -0
  87. package/dist/site/server.d.ts +10 -0
  88. package/dist/site/server.d.ts.map +1 -0
  89. package/dist/site/server.js +73 -0
  90. package/dist/site/server.js.map +1 -0
  91. package/dist/site/tools/content.d.ts +250 -0
  92. package/dist/site/tools/content.d.ts.map +1 -0
  93. package/dist/site/tools/content.js +329 -0
  94. package/dist/site/tools/content.js.map +1 -0
  95. package/dist/site/tools/feeds.d.ts +62 -0
  96. package/dist/site/tools/feeds.d.ts.map +1 -0
  97. package/dist/site/tools/feeds.js +97 -0
  98. package/dist/site/tools/feeds.js.map +1 -0
  99. package/dist/site/tools/layout.d.ts +163 -0
  100. package/dist/site/tools/layout.d.ts.map +1 -0
  101. package/dist/site/tools/layout.js +226 -0
  102. package/dist/site/tools/layout.js.map +1 -0
  103. package/dist/site/tools/media.d.ts +38 -0
  104. package/dist/site/tools/media.d.ts.map +1 -0
  105. package/dist/site/tools/media.js +52 -0
  106. package/dist/site/tools/media.js.map +1 -0
  107. package/dist/site/tools/search.d.ts +40 -0
  108. package/dist/site/tools/search.d.ts.map +1 -0
  109. package/dist/site/tools/search.js +60 -0
  110. package/dist/site/tools/search.js.map +1 -0
  111. package/dist/site/tools/users.d.ts +60 -0
  112. package/dist/site/tools/users.d.ts.map +1 -0
  113. package/dist/site/tools/users.js +71 -0
  114. package/dist/site/tools/users.js.map +1 -0
  115. package/dist/site/tools/webhooks.d.ts +34 -0
  116. package/dist/site/tools/webhooks.d.ts.map +1 -0
  117. package/dist/site/tools/webhooks.js +44 -0
  118. package/dist/site/tools/webhooks.js.map +1 -0
  119. package/package.json +61 -0
@@ -0,0 +1,511 @@
1
+ import { describe, it, expect, vi, beforeEach } from 'vitest';
2
+ import { handleAddContentType, handleAddField, handleRemoveField, handleAddTheme, handleRunMigration, } from '../developer/tools/config-mutation.js';
3
+ import { handleScaffoldSiteStructure, handleScaffoldContentType, handleScaffoldTheme, handleSeedContent, } from '../developer/tools/scaffolding.js';
4
+ import { handleCreateApiKey, handleListApiKeys, handleRevokeApiKey, } from '../developer/tools/api-keys.js';
5
+ // ─── Mock node:fs ────────────────────────────────────────────────────────────
6
+ vi.mock('node:fs', () => ({
7
+ readFileSync: vi.fn(),
8
+ writeFileSync: vi.fn(),
9
+ }));
10
+ import { readFileSync, writeFileSync } from 'node:fs';
11
+ const mockedReadFileSync = vi.mocked(readFileSync);
12
+ const mockedWriteFileSync = vi.mocked(writeFileSync);
13
+ // ─── Mock node:child_process ─────────────────────────────────────────────────
14
+ // promisify(execFile) uses a custom symbol on Node's execFile.
15
+ // We mock the entire module so that promisify wraps our callback-style mock.
16
+ let execFileResult = { stdout: '', stderr: '' };
17
+ vi.mock('node:child_process', async () => {
18
+ const customPromisify = Symbol.for('nodejs.util.promisify.custom');
19
+ const fn = Object.assign(vi.fn((...args) => {
20
+ const cb = args[args.length - 1];
21
+ if (typeof cb === 'function') {
22
+ if (execFileResult instanceof Error) {
23
+ cb(execFileResult, '', '');
24
+ }
25
+ else {
26
+ cb(null, execFileResult.stdout, execFileResult.stderr);
27
+ }
28
+ }
29
+ return {};
30
+ }), {
31
+ [customPromisify]: vi.fn(async (..._args) => {
32
+ if (execFileResult instanceof Error)
33
+ throw execFileResult;
34
+ return execFileResult;
35
+ }),
36
+ });
37
+ return { execFile: fn };
38
+ });
39
+ // ─── Helpers ─────────────────────────────────────────────────────────────────
40
+ function createMockSdk() {
41
+ return {
42
+ content: {
43
+ getBySlug: vi.fn().mockResolvedValue({ id: '1', title: 'Test' }),
44
+ getById: vi.fn().mockResolvedValue({ id: '1', title: 'Test' }),
45
+ getChildren: vi.fn().mockResolvedValue([]),
46
+ list: vi.fn().mockResolvedValue({ rows: [], total: 0 }),
47
+ create: vi.fn().mockImplementation((_type, data) => Promise.resolve({ id: `new-${String(data.slug ?? 'item')}`, ...data })),
48
+ update: vi.fn().mockResolvedValue({ id: '1', title: 'Updated' }),
49
+ delete: vi.fn().mockResolvedValue(true),
50
+ publish: vi.fn().mockResolvedValue({ id: '1', status: 'published' }),
51
+ unpublish: vi.fn().mockResolvedValue({ id: '1', status: 'draft' }),
52
+ },
53
+ nav: { getTree: vi.fn(), getBreadcrumbs: vi.fn(), getChildren: vi.fn() },
54
+ site: { getConfig: vi.fn(), list: vi.fn() },
55
+ user: { getCurrent: vi.fn(), getById: vi.fn() },
56
+ feeds: { query: vi.fn(), get: vi.fn() },
57
+ };
58
+ }
59
+ function createMockHttp() {
60
+ return {
61
+ get: vi.fn(),
62
+ post: vi.fn(),
63
+ put: vi.fn(),
64
+ delete: vi.fn(),
65
+ setToken: vi.fn(),
66
+ };
67
+ }
68
+ const baseConfig = `import { defineContentType } from '@kywi/core'
69
+
70
+ defineContentType('page', {
71
+ label: 'Page',
72
+ baseType: 'page',
73
+ fields: [
74
+ { name: 'title', type: 'text', label: 'Title', required: true },
75
+ { name: 'body', type: 'richtext', label: 'Body' },
76
+ ],
77
+ })
78
+ `;
79
+ beforeEach(() => {
80
+ vi.clearAllMocks();
81
+ });
82
+ // ─── Config mutation tools ─────────────────────────────────────────────────
83
+ describe('Config mutation tools', () => {
84
+ const ctx = { configPath: '/project/kywi.config.ts' };
85
+ describe('handleAddContentType', () => {
86
+ it('appends a content type to the config', async () => {
87
+ mockedReadFileSync.mockReturnValue(baseConfig);
88
+ const result = await handleAddContentType(ctx, {
89
+ name: 'post',
90
+ label: 'Blog Post',
91
+ baseType: 'page',
92
+ fields: [
93
+ { name: 'title', type: 'text', label: 'Title', required: true },
94
+ { name: 'body', type: 'richtext', label: 'Body' },
95
+ ],
96
+ });
97
+ const data = JSON.parse(result.content[0].text);
98
+ expect(data.added).toBe('post');
99
+ expect(data.fields).toBe(2);
100
+ expect(mockedWriteFileSync).toHaveBeenCalledOnce();
101
+ const written = mockedWriteFileSync.mock.calls[0][1];
102
+ expect(written).toContain("defineContentType('post'");
103
+ expect(written).toContain("name: 'title'");
104
+ expect(written).toContain('required: true');
105
+ });
106
+ });
107
+ describe('handleAddField', () => {
108
+ it('adds a field to an existing content type', async () => {
109
+ mockedReadFileSync.mockReturnValue(baseConfig);
110
+ const result = await handleAddField(ctx, {
111
+ contentTypeName: 'page',
112
+ field: { name: 'summary', type: 'text', label: 'Summary' },
113
+ });
114
+ const data = JSON.parse(result.content[0].text);
115
+ expect(data.addedField).toBe('summary');
116
+ const written = mockedWriteFileSync.mock.calls[0][1];
117
+ expect(written).toContain("name: 'summary'");
118
+ });
119
+ it('returns error if content type not found', async () => {
120
+ mockedReadFileSync.mockReturnValue(baseConfig);
121
+ const result = await handleAddField(ctx, {
122
+ contentTypeName: 'nonexistent',
123
+ field: { name: 'test', type: 'text', label: 'Test' },
124
+ });
125
+ expect(result.isError).toBe(true);
126
+ expect(result.content[0].text).toContain('not found');
127
+ });
128
+ });
129
+ describe('handleRemoveField', () => {
130
+ it('removes a field from a content type', async () => {
131
+ mockedReadFileSync.mockReturnValue(baseConfig);
132
+ const result = await handleRemoveField(ctx, {
133
+ contentTypeName: 'page',
134
+ fieldName: 'body',
135
+ });
136
+ const data = JSON.parse(result.content[0].text);
137
+ expect(data.removedField).toBe('body');
138
+ const written = mockedWriteFileSync.mock.calls[0][1];
139
+ expect(written).not.toContain("name: 'body'");
140
+ expect(written).toContain("name: 'title'");
141
+ });
142
+ it('returns error if content type not found', async () => {
143
+ mockedReadFileSync.mockReturnValue(baseConfig);
144
+ const result = await handleRemoveField(ctx, {
145
+ contentTypeName: 'nonexistent',
146
+ fieldName: 'body',
147
+ });
148
+ expect(result.isError).toBe(true);
149
+ });
150
+ it('returns error if field not found', async () => {
151
+ mockedReadFileSync.mockReturnValue(baseConfig);
152
+ const result = await handleRemoveField(ctx, {
153
+ contentTypeName: 'page',
154
+ fieldName: 'nonexistent',
155
+ });
156
+ expect(result.isError).toBe(true);
157
+ });
158
+ });
159
+ describe('handleAddTheme', () => {
160
+ it('appends a theme to the config', async () => {
161
+ mockedReadFileSync.mockReturnValue(baseConfig);
162
+ const result = await handleAddTheme(ctx, {
163
+ name: 'modern',
164
+ label: 'Modern Theme',
165
+ regions: ['header', 'main', 'sidebar', 'footer'],
166
+ });
167
+ const data = JSON.parse(result.content[0].text);
168
+ expect(data.added).toBe('modern');
169
+ expect(data.regions).toEqual(['header', 'main', 'sidebar', 'footer']);
170
+ const written = mockedWriteFileSync.mock.calls[0][1];
171
+ expect(written).toContain("defineTheme('modern'");
172
+ });
173
+ });
174
+ describe('handleRunMigration', () => {
175
+ it('runs drizzle-kit push successfully', async () => {
176
+ execFileResult = { stdout: 'Migration applied\n', stderr: '' };
177
+ const result = await handleRunMigration(ctx);
178
+ const data = JSON.parse(result.content[0].text);
179
+ expect(data.success).toBe(true);
180
+ expect(data.stdout).toContain('Migration applied');
181
+ });
182
+ it('returns error on failure', async () => {
183
+ execFileResult = new Error('Command failed');
184
+ const result = await handleRunMigration(ctx);
185
+ expect(result.isError).toBe(true);
186
+ expect(result.content[0].text).toContain('Migration failed');
187
+ });
188
+ });
189
+ });
190
+ // ─── Scaffolding tools ─────────────────────────────────────────────────────
191
+ describe('Scaffolding tools', () => {
192
+ describe('handleScaffoldSiteStructure', () => {
193
+ it('creates pages for corporate site', async () => {
194
+ const sdk = createMockSdk();
195
+ const result = await handleScaffoldSiteStructure(sdk, {
196
+ siteType: 'corporate',
197
+ siteId: 'site-1',
198
+ });
199
+ const data = JSON.parse(result.content[0].text);
200
+ expect(data.siteType).toBe('corporate');
201
+ expect(data.created).toBe(5);
202
+ expect(data.pages).toEqual(['Home', 'About', 'Services', 'Contact', 'Blog']);
203
+ expect(sdk.content.create).toHaveBeenCalledTimes(5);
204
+ });
205
+ it('creates pages for blog site', async () => {
206
+ const sdk = createMockSdk();
207
+ const result = await handleScaffoldSiteStructure(sdk, {
208
+ siteType: 'blog',
209
+ siteId: 'site-1',
210
+ });
211
+ const data = JSON.parse(result.content[0].text);
212
+ expect(data.created).toBe(3);
213
+ expect(data.pages).toEqual(['Home', 'Posts', 'About']);
214
+ });
215
+ it('creates pages for portfolio site', async () => {
216
+ const sdk = createMockSdk();
217
+ const result = await handleScaffoldSiteStructure(sdk, {
218
+ siteType: 'portfolio',
219
+ siteId: 'site-1',
220
+ });
221
+ const data = JSON.parse(result.content[0].text);
222
+ expect(data.created).toBe(4);
223
+ });
224
+ it('creates pages for ecommerce site', async () => {
225
+ const sdk = createMockSdk();
226
+ const result = await handleScaffoldSiteStructure(sdk, {
227
+ siteType: 'ecommerce',
228
+ siteId: 'site-1',
229
+ });
230
+ const data = JSON.parse(result.content[0].text);
231
+ expect(data.created).toBe(5);
232
+ });
233
+ it('returns error for unknown site type', async () => {
234
+ const sdk = createMockSdk();
235
+ const result = await handleScaffoldSiteStructure(sdk, {
236
+ siteType: 'unknown',
237
+ siteId: 'site-1',
238
+ });
239
+ expect(result.isError).toBe(true);
240
+ });
241
+ it('captures errors from individual page creation', async () => {
242
+ const sdk = createMockSdk();
243
+ let callCount = 0;
244
+ vi.mocked(sdk.content.create).mockImplementation(() => {
245
+ callCount++;
246
+ if (callCount === 2) {
247
+ return Promise.reject(new Error('create failed'));
248
+ }
249
+ return Promise.resolve({ id: `p${callCount}` });
250
+ });
251
+ const result = await handleScaffoldSiteStructure(sdk, {
252
+ siteType: 'blog',
253
+ siteId: 'site-1',
254
+ });
255
+ const data = JSON.parse(result.content[0].text);
256
+ expect(data.created).toBe(2);
257
+ expect(data.errors).toHaveLength(1);
258
+ expect(data.errors[0].error).toContain('create failed');
259
+ });
260
+ });
261
+ describe('handleScaffoldContentType', () => {
262
+ it('returns a content type suggestion', async () => {
263
+ const sdk = createMockSdk();
264
+ const result = await handleScaffoldContentType(sdk, {
265
+ name: 'article',
266
+ description: 'A news article',
267
+ });
268
+ const data = JSON.parse(result.content[0].text);
269
+ expect(data.suggestion.name).toBe('article');
270
+ expect(data.suggestion.fields.length).toBeGreaterThan(0);
271
+ expect(data.note).toContain('add_content_type');
272
+ });
273
+ });
274
+ describe('handleScaffoldTheme', () => {
275
+ it('returns a theme suggestion with default regions', async () => {
276
+ const sdk = createMockSdk();
277
+ const result = await handleScaffoldTheme(sdk, {
278
+ name: 'minimal',
279
+ description: 'A minimal theme',
280
+ });
281
+ const data = JSON.parse(result.content[0].text);
282
+ expect(data.suggestion.name).toBe('minimal');
283
+ expect(data.suggestion.regions).toEqual(['header', 'main', 'sidebar', 'footer']);
284
+ });
285
+ it('uses custom regions when provided', async () => {
286
+ const sdk = createMockSdk();
287
+ const result = await handleScaffoldTheme(sdk, {
288
+ name: 'simple',
289
+ description: 'Simple layout',
290
+ regions: ['header', 'content', 'footer'],
291
+ });
292
+ const data = JSON.parse(result.content[0].text);
293
+ expect(data.suggestion.regions).toEqual(['header', 'content', 'footer']);
294
+ });
295
+ });
296
+ describe('handleSeedContent', () => {
297
+ it('creates sample content items', async () => {
298
+ const sdk = createMockSdk();
299
+ const result = await handleSeedContent(sdk, {
300
+ type: 'post',
301
+ count: 3,
302
+ siteId: 'site-1',
303
+ });
304
+ const data = JSON.parse(result.content[0].text);
305
+ expect(data.created).toBe(3);
306
+ expect(data.requested).toBe(3);
307
+ expect(sdk.content.create).toHaveBeenCalledTimes(3);
308
+ });
309
+ it('captures individual item errors', async () => {
310
+ const sdk = createMockSdk();
311
+ let callCount = 0;
312
+ vi.mocked(sdk.content.create).mockImplementation(() => {
313
+ callCount++;
314
+ if (callCount === 2) {
315
+ return Promise.reject(new Error('seed failed'));
316
+ }
317
+ return Promise.resolve({ id: `p${callCount}` });
318
+ });
319
+ const result = await handleSeedContent(sdk, {
320
+ type: 'post',
321
+ count: 3,
322
+ siteId: 'site-1',
323
+ });
324
+ const data = JSON.parse(result.content[0].text);
325
+ expect(data.created).toBe(2);
326
+ expect(data.errors).toHaveLength(1);
327
+ });
328
+ });
329
+ });
330
+ // ─── New config mutation tools (IU-40) ─────────────────────────────────────
331
+ describe('New config mutation tools (IU-40)', () => {
332
+ const ctx = { configPath: '/project/kywi.config.ts' };
333
+ const configWithTheme = `import { defineContentType, defineTheme } from '@kywi/core'
334
+
335
+ defineContentType('page', {
336
+ label: 'Page',
337
+ baseType: 'page',
338
+ fields: [
339
+ { name: 'title', type: 'text', label: 'Title', required: true },
340
+ { name: 'body', type: 'richtext', label: 'Body' },
341
+ ],
342
+ })
343
+
344
+ defineTheme('modern', {
345
+ label: 'Modern Theme',
346
+ regions: [
347
+ 'header',
348
+ 'main',
349
+ 'sidebar',
350
+ 'footer',
351
+ ],
352
+ })
353
+ `;
354
+ describe('handleUpdateContentType', () => {
355
+ it('updates an existing content type label', async () => {
356
+ const { handleUpdateContentType } = await import('../developer/tools/config-mutation.js');
357
+ mockedReadFileSync.mockReturnValue(baseConfig);
358
+ const result = await handleUpdateContentType(ctx, {
359
+ name: 'page',
360
+ label: 'Landing Page',
361
+ });
362
+ const data = JSON.parse(result.content[0].text);
363
+ expect(data.updated).toBe('page');
364
+ expect(data.label).toBe('Landing Page');
365
+ const written = mockedWriteFileSync.mock.calls[0][1];
366
+ expect(written).toContain("label: 'Landing Page'");
367
+ expect(written).toContain("defineContentType('page'");
368
+ });
369
+ it('updates baseType of an existing content type', async () => {
370
+ const { handleUpdateContentType } = await import('../developer/tools/config-mutation.js');
371
+ mockedReadFileSync.mockReturnValue(baseConfig);
372
+ const result = await handleUpdateContentType(ctx, {
373
+ name: 'page',
374
+ baseType: 'folder',
375
+ });
376
+ const data = JSON.parse(result.content[0].text);
377
+ expect(data.updated).toBe('page');
378
+ const written = mockedWriteFileSync.mock.calls[0][1];
379
+ expect(written).toContain("baseType: 'folder'");
380
+ });
381
+ it('returns error when content type not found', async () => {
382
+ const { handleUpdateContentType } = await import('../developer/tools/config-mutation.js');
383
+ mockedReadFileSync.mockReturnValue(baseConfig);
384
+ const result = await handleUpdateContentType(ctx, {
385
+ name: 'nonexistent',
386
+ label: 'Nope',
387
+ });
388
+ expect(result.isError).toBe(true);
389
+ expect(result.content[0].text).toContain('not found');
390
+ });
391
+ });
392
+ describe('handleUpdateThemeRegions', () => {
393
+ it('updates region list of an existing theme', async () => {
394
+ const { handleUpdateThemeRegions } = await import('../developer/tools/config-mutation.js');
395
+ mockedReadFileSync.mockReturnValue(configWithTheme);
396
+ const result = await handleUpdateThemeRegions(ctx, {
397
+ name: 'modern',
398
+ regions: ['header', 'hero', 'main', 'footer'],
399
+ });
400
+ const data = JSON.parse(result.content[0].text);
401
+ expect(data.updated).toBe('modern');
402
+ expect(data.regions).toEqual(['header', 'hero', 'main', 'footer']);
403
+ const written = mockedWriteFileSync.mock.calls[0][1];
404
+ expect(written).toContain("'hero'");
405
+ expect(written).not.toContain("'sidebar'");
406
+ });
407
+ it('returns error when theme not found', async () => {
408
+ const { handleUpdateThemeRegions } = await import('../developer/tools/config-mutation.js');
409
+ mockedReadFileSync.mockReturnValue(configWithTheme);
410
+ const result = await handleUpdateThemeRegions(ctx, {
411
+ name: 'nonexistent',
412
+ regions: ['header', 'main'],
413
+ });
414
+ expect(result.isError).toBe(true);
415
+ expect(result.content[0].text).toContain('not found');
416
+ });
417
+ });
418
+ describe('handleAddModule', () => {
419
+ it('appends a module definition to the config', async () => {
420
+ const { handleAddModule } = await import('../developer/tools/config-mutation.js');
421
+ mockedReadFileSync.mockReturnValue(baseConfig);
422
+ const result = await handleAddModule(ctx, {
423
+ name: 'heroSection',
424
+ label: 'Hero Section',
425
+ component: './modules/HeroSection.tsx',
426
+ });
427
+ const data = JSON.parse(result.content[0].text);
428
+ expect(data.added).toBe('heroSection');
429
+ expect(data.label).toBe('Hero Section');
430
+ const written = mockedWriteFileSync.mock.calls[0][1];
431
+ expect(written).toContain("defineModule('heroSection'");
432
+ expect(written).toContain("label: 'Hero Section'");
433
+ expect(written).toContain("component: './modules/HeroSection.tsx'");
434
+ });
435
+ });
436
+ describe('handleAddPlugin', () => {
437
+ it('appends a plugin definition to the config', async () => {
438
+ const { handleAddPlugin } = await import('../developer/tools/config-mutation.js');
439
+ mockedReadFileSync.mockReturnValue(baseConfig);
440
+ const result = await handleAddPlugin(ctx, {
441
+ name: 'seo',
442
+ label: 'SEO Plugin',
443
+ options: { sitemap: true, robots: true },
444
+ });
445
+ const data = JSON.parse(result.content[0].text);
446
+ expect(data.added).toBe('seo');
447
+ expect(data.label).toBe('SEO Plugin');
448
+ const written = mockedWriteFileSync.mock.calls[0][1];
449
+ expect(written).toContain("definePlugin('seo'");
450
+ expect(written).toContain("label: 'SEO Plugin'");
451
+ });
452
+ });
453
+ });
454
+ // ─── API key tools ─────────────────────────────────────────────────────────
455
+ describe('API key tools', () => {
456
+ describe('handleCreateApiKey', () => {
457
+ it('creates an API key', async () => {
458
+ const http = createMockHttp();
459
+ vi.mocked(http.post).mockResolvedValue({ id: 'key-1', name: 'Test', scopes: ['content:read'] });
460
+ const result = await handleCreateApiKey(http, {
461
+ name: 'Test',
462
+ scopes: ['content:read'],
463
+ });
464
+ const data = JSON.parse(result.content[0].text);
465
+ expect(data.id).toBe('key-1');
466
+ expect(http.post).toHaveBeenCalledWith('/api-keys', { name: 'Test', scopes: ['content:read'] });
467
+ });
468
+ it('returns error on failure', async () => {
469
+ const http = createMockHttp();
470
+ vi.mocked(http.post).mockRejectedValue(new Error('Forbidden'));
471
+ const result = await handleCreateApiKey(http, {
472
+ name: 'Test',
473
+ scopes: ['content:read'],
474
+ });
475
+ expect(result.isError).toBe(true);
476
+ expect(result.content[0].text).toContain('Forbidden');
477
+ });
478
+ });
479
+ describe('handleListApiKeys', () => {
480
+ it('lists API keys', async () => {
481
+ const http = createMockHttp();
482
+ vi.mocked(http.get).mockResolvedValue([{ id: 'key-1' }, { id: 'key-2' }]);
483
+ const result = await handleListApiKeys(http);
484
+ const data = JSON.parse(result.content[0].text);
485
+ expect(data).toHaveLength(2);
486
+ });
487
+ it('returns error on failure', async () => {
488
+ const http = createMockHttp();
489
+ vi.mocked(http.get).mockRejectedValue(new Error('Unauthorized'));
490
+ const result = await handleListApiKeys(http);
491
+ expect(result.isError).toBe(true);
492
+ });
493
+ });
494
+ describe('handleRevokeApiKey', () => {
495
+ it('revokes an API key', async () => {
496
+ const http = createMockHttp();
497
+ vi.mocked(http.delete).mockResolvedValue({ revoked: true });
498
+ const result = await handleRevokeApiKey(http, { id: 'key-1' });
499
+ const data = JSON.parse(result.content[0].text);
500
+ expect(data.revoked).toBe(true);
501
+ expect(http.delete).toHaveBeenCalledWith('/api-keys/key-1');
502
+ });
503
+ it('returns error on failure', async () => {
504
+ const http = createMockHttp();
505
+ vi.mocked(http.delete).mockRejectedValue(new Error('Not found'));
506
+ const result = await handleRevokeApiKey(http, { id: 'key-1' });
507
+ expect(result.isError).toBe(true);
508
+ });
509
+ });
510
+ });
511
+ //# sourceMappingURL=developer-mutation.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"developer-mutation.test.js","sourceRoot":"","sources":["../../src/__tests__/developer-mutation.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=developer-read-only.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"developer-read-only.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/developer-read-only.test.ts"],"names":[],"mappings":""}