indesign-cli 0.2.0__py3-none-any.whl

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 (72) hide show
  1. cli_anything/indesign/README.md +32 -0
  2. cli_anything/indesign/__init__.py +1 -0
  3. cli_anything/indesign/__main__.py +5 -0
  4. cli_anything/indesign/core/artifacts.py +57 -0
  5. cli_anything/indesign/core/catalog.py +405 -0
  6. cli_anything/indesign/core/domains.py +178 -0
  7. cli_anything/indesign/core/envelope.py +65 -0
  8. cli_anything/indesign/core/errors.py +30 -0
  9. cli_anything/indesign/core/health.py +46 -0
  10. cli_anything/indesign/core/hidden_backend.py +116 -0
  11. cli_anything/indesign/core/hidden_handler_schemas.py +223 -0
  12. cli_anything/indesign/core/mcp_backend.py +152 -0
  13. cli_anything/indesign/core/node_setup.py +35 -0
  14. cli_anything/indesign/core/paths.py +41 -0
  15. cli_anything/indesign/core/plugins/__init__.py +2 -0
  16. cli_anything/indesign/core/plugins/backend.py +90 -0
  17. cli_anything/indesign/core/plugins/discovery.py +69 -0
  18. cli_anything/indesign/core/plugins/host_actions.py +76 -0
  19. cli_anything/indesign/core/plugins/install.py +38 -0
  20. cli_anything/indesign/core/plugins/manifest.py +279 -0
  21. cli_anything/indesign/core/plugins/validate.py +181 -0
  22. cli_anything/indesign/core/router.py +217 -0
  23. cli_anything/indesign/core/runtime.py +59 -0
  24. cli_anything/indesign/core/scripts.py +44 -0
  25. cli_anything/indesign/core/session.py +68 -0
  26. cli_anything/indesign/indesign_cli.py +320 -0
  27. cli_anything/indesign/node/hidden_handler_bridge.mjs +111 -0
  28. cli_anything/indesign/server/package-lock.json +168 -0
  29. cli_anything/indesign/server/package.json +45 -0
  30. cli_anything/indesign/server/src/advanced/index.js +76 -0
  31. cli_anything/indesign/server/src/core/InDesignMCPServer.js +273 -0
  32. cli_anything/indesign/server/src/core/scriptExecutor.js +271 -0
  33. cli_anything/indesign/server/src/core/sessionManager.js +545 -0
  34. cli_anything/indesign/server/src/handlers/advancedTemplateHandlers.js +1072 -0
  35. cli_anything/indesign/server/src/handlers/bookHandlers.js +490 -0
  36. cli_anything/indesign/server/src/handlers/documentHandlers.js +1472 -0
  37. cli_anything/indesign/server/src/handlers/exportHandlers.js +208 -0
  38. cli_anything/indesign/server/src/handlers/graphicsHandlers.js +605 -0
  39. cli_anything/indesign/server/src/handlers/groupHandlers.js +358 -0
  40. cli_anything/indesign/server/src/handlers/helpHandlers.js +347 -0
  41. cli_anything/indesign/server/src/handlers/index.js +77 -0
  42. cli_anything/indesign/server/src/handlers/layerHandlers.js +75 -0
  43. cli_anything/indesign/server/src/handlers/masterSpreadHandlers.js +451 -0
  44. cli_anything/indesign/server/src/handlers/pageHandlers.js +698 -0
  45. cli_anything/indesign/server/src/handlers/pageItemHandlers.js +704 -0
  46. cli_anything/indesign/server/src/handlers/presentationHandlers.js +220 -0
  47. cli_anything/indesign/server/src/handlers/spreadHandlers.js +348 -0
  48. cli_anything/indesign/server/src/handlers/styleHandlers.js +458 -0
  49. cli_anything/indesign/server/src/handlers/textHandlers.js +431 -0
  50. cli_anything/indesign/server/src/handlers/utilityHandlers.js +83 -0
  51. cli_anything/indesign/server/src/index.js +17 -0
  52. cli_anything/indesign/server/src/types/index.js +106 -0
  53. cli_anything/indesign/server/src/types/toolDefinitionsAdvancedTemplates.js +144 -0
  54. cli_anything/indesign/server/src/types/toolDefinitionsBook.js +224 -0
  55. cli_anything/indesign/server/src/types/toolDefinitionsContent.js +353 -0
  56. cli_anything/indesign/server/src/types/toolDefinitionsDocument.js +409 -0
  57. cli_anything/indesign/server/src/types/toolDefinitionsExport.js +65 -0
  58. cli_anything/indesign/server/src/types/toolDefinitionsLayer.js +40 -0
  59. cli_anything/indesign/server/src/types/toolDefinitionsMasterSpread.js +160 -0
  60. cli_anything/indesign/server/src/types/toolDefinitionsPage.js +271 -0
  61. cli_anything/indesign/server/src/types/toolDefinitionsPageItemGroup.js +437 -0
  62. cli_anything/indesign/server/src/types/toolDefinitionsPresentation.js +83 -0
  63. cli_anything/indesign/server/src/types/toolDefinitionsSpread.js +158 -0
  64. cli_anything/indesign/server/src/types/toolDefinitionsUtility.js +40 -0
  65. cli_anything/indesign/server/src/utils/stringUtils.js +107 -0
  66. cli_anything/indesign/skills/SKILL.md +198 -0
  67. indesign_cli-0.2.0.dist-info/METADATA +267 -0
  68. indesign_cli-0.2.0.dist-info/RECORD +72 -0
  69. indesign_cli-0.2.0.dist-info/WHEEL +5 -0
  70. indesign_cli-0.2.0.dist-info/entry_points.txt +3 -0
  71. indesign_cli-0.2.0.dist-info/licenses/LICENSE +21 -0
  72. indesign_cli-0.2.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,451 @@
1
+ /**
2
+ * Master spread management handlers
3
+ */
4
+ import { ScriptExecutor } from '../core/scriptExecutor.js';
5
+ import { formatResponse, escapeJsxString } from '../utils/stringUtils.js';
6
+
7
+ export class MasterSpreadHandlers {
8
+ /**
9
+ * Create a master spread
10
+ */
11
+ static async createMasterSpread(args) {
12
+ const { name, namePrefix, baseName, showMasterItems = true } = args;
13
+
14
+ let resolvedNamePrefix = namePrefix;
15
+ let resolvedBaseName = baseName;
16
+ if (name && (!resolvedNamePrefix || !resolvedBaseName)) {
17
+ const match = String(name).match(/^([A-Za-z]+)-(.+)$/);
18
+ if (match) {
19
+ resolvedNamePrefix = resolvedNamePrefix || match[1];
20
+ resolvedBaseName = resolvedBaseName || match[2];
21
+ } else {
22
+ resolvedBaseName = resolvedBaseName || name;
23
+ }
24
+ }
25
+
26
+ const escapedNamePrefix = escapeJsxString(resolvedNamePrefix);
27
+ const escapedBaseName = escapeJsxString(resolvedBaseName);
28
+
29
+ const script = [
30
+ 'if (app.documents.length === 0) {',
31
+ ' "No document open";',
32
+ '} else {',
33
+ ' var doc = app.activeDocument;',
34
+ ' var masterSpread = null;',
35
+ ...(resolvedNamePrefix ? [
36
+ ` for (var i = 0; i < doc.masterSpreads.length; i++) {`,
37
+ ` if (doc.masterSpreads[i].namePrefix === "${escapedNamePrefix}") { masterSpread = doc.masterSpreads[i]; break; }`,
38
+ ' }'
39
+ ] : []),
40
+ ' if (masterSpread === null) {',
41
+ ' masterSpread = doc.masterSpreads.add();',
42
+ ...(resolvedNamePrefix ? [` masterSpread.namePrefix = "${escapedNamePrefix}";`] : []),
43
+ ' }',
44
+ '',
45
+ ` masterSpread.showMasterItems = ${showMasterItems};`,
46
+ // Apply naming if provided
47
+ ...(resolvedBaseName ? [` masterSpread.baseName = "${escapedBaseName}";`] : []),
48
+ '',
49
+ ' "Master spread created successfully: " + masterSpread.name;',
50
+ '}'
51
+ ].join('\n');
52
+
53
+ const result = await ScriptExecutor.executeInDesignScript(script);
54
+ return formatResponse(result, "Create Master Spread");
55
+ }
56
+
57
+ /**
58
+ * List all master spreads
59
+ */
60
+ static async listMasterSpreads(args) {
61
+ const script = [
62
+ 'if (app.documents.length === 0) {',
63
+ ' "No document open";',
64
+ '} else {',
65
+ ' var doc = app.activeDocument;',
66
+ ' var masterSpreads = doc.masterSpreads;',
67
+ ' var result = "=== MASTER SPREADS ===\\n";',
68
+ '',
69
+ ' for (var i = 0; i < masterSpreads.length; i++) {',
70
+ ' var master = masterSpreads[i];',
71
+ ' result += "Index: " + i + "\\n";',
72
+ ' result += "Name: " + master.name + "\\n";',
73
+ ' result += "Name Prefix: " + master.namePrefix + "\\n";',
74
+ ' result += "Base Name: " + master.baseName + "\\n";',
75
+ ' result += "Show Master Items: " + master.showMasterItems + "\\n";',
76
+ ' result += "Pages: " + master.pages.length + "\\n";',
77
+ ' result += "---\\n";',
78
+ ' }',
79
+ '',
80
+ ' result;',
81
+ '}'
82
+ ].join('\n');
83
+
84
+ const result = await ScriptExecutor.executeInDesignScript(script);
85
+ return formatResponse(result, "List Master Spreads");
86
+ }
87
+
88
+ /**
89
+ * Delete a master spread
90
+ */
91
+ static async deleteMasterSpread(args) {
92
+ const { masterIndex } = args;
93
+
94
+ const script = [
95
+ 'if (app.documents.length === 0) {',
96
+ ' "No document open";',
97
+ '} else {',
98
+ ' var doc = app.activeDocument;',
99
+ ` if (${masterIndex} >= doc.masterSpreads.length) {`,
100
+ ' "Master spread index out of range";',
101
+ ' } else {',
102
+ ` var masterSpread = doc.masterSpreads[${masterIndex}];`,
103
+ ' var name = masterSpread.name;',
104
+ ' masterSpread.remove();',
105
+ ' "Master spread deleted: " + name;',
106
+ ' }',
107
+ '}'
108
+ ].join('\n');
109
+
110
+ const result = await ScriptExecutor.executeInDesignScript(script);
111
+ return formatResponse(result, "Delete Master Spread");
112
+ }
113
+
114
+ /**
115
+ * Duplicate a master spread
116
+ */
117
+ static async duplicateMasterSpread(args) {
118
+ const { masterIndex, position = 'AT_END', referenceMaster } = args;
119
+
120
+ const script = [
121
+ 'if (app.documents.length === 0) {',
122
+ ' "No document open";',
123
+ '} else {',
124
+ ' var doc = app.activeDocument;',
125
+ ` if (${masterIndex} >= doc.masterSpreads.length) {`,
126
+ ' "Master spread index out of range";',
127
+ ' } else {',
128
+ ` var masterSpread = doc.masterSpreads[${masterIndex}];`,
129
+ ' var newMasterSpread;',
130
+ '',
131
+ ` if ("${position}" === "AT_END") {`,
132
+ ' newMasterSpread = masterSpread.duplicate();',
133
+ ` } else if ("${position}" === "AT_BEGINNING") {`,
134
+ ' newMasterSpread = masterSpread.duplicate(LocationOptions.AT_BEGINNING);',
135
+ ` } else if ("${position}" === "BEFORE" && ${referenceMaster} !== undefined) {`,
136
+ ` newMasterSpread = masterSpread.duplicate(LocationOptions.BEFORE, doc.masterSpreads[${referenceMaster}]);`,
137
+ ` } else if ("${position}" === "AFTER" && ${referenceMaster} !== undefined) {`,
138
+ ` newMasterSpread = masterSpread.duplicate(LocationOptions.AFTER, doc.masterSpreads[${referenceMaster}]);`,
139
+ ' } else {',
140
+ ' newMasterSpread = masterSpread.duplicate();',
141
+ ' }',
142
+ '',
143
+ ' "Master spread duplicated successfully. New master index: " + newMasterSpread.index;',
144
+ ' }',
145
+ '}'
146
+ ].join('\n');
147
+
148
+ const result = await ScriptExecutor.executeInDesignScript(script);
149
+ return formatResponse(result, "Duplicate Master Spread");
150
+ }
151
+
152
+ /**
153
+ * Apply a master spread to pages
154
+ */
155
+ static async applyMasterSpread(args) {
156
+ const { masterName, pageRange } = args;
157
+
158
+ const escapedMasterName = escapeJsxString(masterName);
159
+ const escapedPageRange = escapeJsxString(pageRange);
160
+
161
+ const script = [
162
+ 'if (app.documents.length === 0) {',
163
+ ' "No document open";',
164
+ '} else {',
165
+ ' var doc = app.activeDocument;',
166
+ ` var masterSpread = doc.masterSpreads.itemByName("${escapedMasterName}");`,
167
+ '',
168
+ ' if (!masterSpread.isValid) {',
169
+ ` "Master spread not found: ${escapedMasterName}";`,
170
+ ' } else {',
171
+ ' var pages = doc.pages;',
172
+ '',
173
+ ` if ("${escapedPageRange}" === "all") {`,
174
+ ' for (var i = 0; i < pages.length; i++) {',
175
+ ' pages[i].appliedMaster = masterSpread;',
176
+ ' }',
177
+ ` } else if ("${escapedPageRange}".indexOf("-") !== -1) {`,
178
+ ` var range = "${escapedPageRange}".split("-");`,
179
+ ' var start = parseInt(range[0]) - 1;',
180
+ ' var end = parseInt(range[1]) - 1;',
181
+ ' for (var i = start; i <= end && i < pages.length; i++) {',
182
+ ' pages[i].appliedMaster = masterSpread;',
183
+ ' }',
184
+ ' } else {',
185
+ ` var pageIndex = parseInt("${escapedPageRange}") - 1;`,
186
+ ' if (pageIndex >= 0 && pageIndex < pages.length) {',
187
+ ' pages[pageIndex].appliedMaster = masterSpread;',
188
+ ' }',
189
+ ' }',
190
+ '',
191
+ ' "Master spread applied successfully";',
192
+ ' }',
193
+ '}'
194
+ ].join('\n');
195
+
196
+ const result = await ScriptExecutor.executeInDesignScript(script);
197
+ return formatResponse(result, "Apply Master Spread");
198
+ }
199
+
200
+ /**
201
+ * Create a text frame on a master spread
202
+ */
203
+ static async createMasterTextFrame(args) {
204
+ const {
205
+ masterName,
206
+ content,
207
+ x,
208
+ y,
209
+ width,
210
+ height,
211
+ fontSize = 12,
212
+ fontFamily = "Arial",
213
+ fontStyle = "Normal",
214
+ alignment = "LEFT_ALIGN"
215
+ } = args;
216
+
217
+ const escapedMasterName = escapeJsxString(masterName);
218
+ const escapedContent = escapeJsxString(content);
219
+ const escapedFontFamily = escapeJsxString(fontFamily);
220
+
221
+ const script = [
222
+ 'if (app.documents.length === 0) {',
223
+ ' "No document open";',
224
+ '} else {',
225
+ ' var doc = app.activeDocument;',
226
+ ` var masterSpread = doc.masterSpreads.itemByName("${escapedMasterName}");`,
227
+ '',
228
+ ' if (!masterSpread.isValid) {',
229
+ ` "Master spread not found: ${escapedMasterName}";`,
230
+ ' } else {',
231
+ ' var page = masterSpread.pages[0];',
232
+ ' var textFrame = page.textFrames.add();',
233
+ '',
234
+ ` textFrame.geometricBounds = [${y}, ${x}, ${y + height}, ${x + width}];`,
235
+ ` textFrame.contents = "${escapedContent}";`,
236
+ ` try { textFrame.texts[0].pointSize = ${fontSize}; } catch (e) {}`,
237
+ ` try { textFrame.texts[0].appliedFont = app.fonts.itemByName("${escapedFontFamily}"); } catch (e) {}`,
238
+ ` try { textFrame.texts[0].fontStyle = "${fontStyle}"; } catch (e) {}`,
239
+ ` try { textFrame.texts[0].justification = Justification.${alignment}; } catch (e) {}`,
240
+ '',
241
+ ' "Master text frame created successfully";',
242
+ ' }',
243
+ '}'
244
+ ].join('\n');
245
+
246
+ const result = await ScriptExecutor.executeInDesignScript(script);
247
+ return formatResponse(result, "Create Master Text Frame");
248
+ }
249
+
250
+ /**
251
+ * Create a rectangle on a master spread
252
+ */
253
+ static async createMasterRectangle(args) {
254
+ const {
255
+ masterName,
256
+ x,
257
+ y,
258
+ width,
259
+ height,
260
+ fillColor = "None",
261
+ strokeColor = "Black",
262
+ strokeWeight = 1
263
+ } = args;
264
+
265
+ const escapedMasterName = escapeJsxString(masterName);
266
+ const escapedFillColor = escapeJsxString(fillColor);
267
+ const escapedStrokeColor = escapeJsxString(strokeColor);
268
+
269
+ const script = [
270
+ 'if (app.documents.length === 0) {',
271
+ ' "No document open";',
272
+ '} else {',
273
+ ' var doc = app.activeDocument;',
274
+ ` var masterSpread = doc.masterSpreads.itemByName("${escapedMasterName}");`,
275
+ '',
276
+ ' if (!masterSpread.isValid) {',
277
+ ` "Master spread not found: ${escapedMasterName}";`,
278
+ ' } else {',
279
+ ' var page = masterSpread.pages[0];',
280
+ ' var rectangle = page.rectangles.add();',
281
+ '',
282
+ ` rectangle.geometricBounds = [${y}, ${x}, ${y + height}, ${x + width}];`,
283
+ ` rectangle.fillColor = doc.colors.itemByName("${escapedFillColor}");`,
284
+ ` rectangle.strokeColor = doc.colors.itemByName("${escapedStrokeColor}");`,
285
+ ` rectangle.strokeWeight = ${strokeWeight};`,
286
+ '',
287
+ ' "Master rectangle created successfully";',
288
+ ' }',
289
+ '}'
290
+ ].join('\n');
291
+
292
+ const result = await ScriptExecutor.executeInDesignScript(script);
293
+ return formatResponse(result, "Create Master Rectangle");
294
+ }
295
+
296
+ /**
297
+ * Create guides on a master spread
298
+ */
299
+ static async createMasterGuides(args) {
300
+ const {
301
+ masterName,
302
+ numberOfRows = 0,
303
+ numberOfColumns = 0,
304
+ rowGutter,
305
+ columnGutter,
306
+ guideColor = '[0, 0, 255]',
307
+ fitMargins = false,
308
+ removeExisting = false
309
+ } = args;
310
+
311
+ const escapedMasterName = escapeJsxString(masterName);
312
+
313
+ const script = [
314
+ 'if (app.documents.length === 0) {',
315
+ ' "No document open";',
316
+ '} else {',
317
+ ' var doc = app.activeDocument;',
318
+ ` var masterSpread = doc.masterSpreads.itemByName("${escapedMasterName}");`,
319
+ '',
320
+ ' if (!masterSpread.isValid) {',
321
+ ` "Master spread not found: ${escapedMasterName}";`,
322
+ ' } else {',
323
+ '',
324
+ ` masterSpread.createGuides(${numberOfRows}, ${numberOfColumns}, "${rowGutter || ''}", "${columnGutter || ''}", ${guideColor}, ${fitMargins}, ${removeExisting});`,
325
+ '',
326
+ ' "Master guides created successfully";',
327
+ ' }',
328
+ '}'
329
+ ].join('\n');
330
+
331
+ const result = await ScriptExecutor.executeInDesignScript(script);
332
+ return formatResponse(result, "Create Master Guides");
333
+ }
334
+
335
+ /**
336
+ * Get master spread information
337
+ */
338
+ static async getMasterSpreadInfo(args) {
339
+ const { masterIndex } = args;
340
+
341
+ const script = [
342
+ 'if (app.documents.length === 0) {',
343
+ ' "No document open";',
344
+ '} else {',
345
+ ' var doc = app.activeDocument;',
346
+ ` if (${masterIndex} >= doc.masterSpreads.length) {`,
347
+ ' "Master spread index out of range";',
348
+ ' } else {',
349
+ ` var masterSpread = doc.masterSpreads[${masterIndex}];`,
350
+ ' var info = "=== MASTER SPREAD INFO ===\\n";',
351
+ '',
352
+ ' info += "Name: " + masterSpread.name + "\\n";',
353
+ ' info += "Name Prefix: " + masterSpread.namePrefix + "\\n";',
354
+ ' info += "Base Name: " + masterSpread.baseName + "\\n";',
355
+ ' info += "Show Master Items: " + masterSpread.showMasterItems + "\\n";',
356
+ ' info += "Index: " + masterSpread.index + "\\n";',
357
+ ' info += "ID: " + masterSpread.id + "\\n";',
358
+ '',
359
+ ' // Content counts',
360
+ ' info += "\\n=== CONTENT COUNTS ===\\n";',
361
+ ' info += "Pages: " + masterSpread.pages.length + "\\n";',
362
+ ' info += "Text Frames: " + masterSpread.textFrames.length + "\\n";',
363
+ ' info += "Rectangles: " + masterSpread.rectangles.length + "\\n";',
364
+ ' info += "Ovals: " + masterSpread.ovals.length + "\\n";',
365
+ ' info += "Polygons: " + masterSpread.polygons.length + "\\n";',
366
+ ' info += "Groups: " + masterSpread.groups.length + "\\n";',
367
+ ' info += "Guides: " + masterSpread.guides.length + "\\n";',
368
+ ' info += "All Page Items: " + masterSpread.allPageItems.length + "\\n";',
369
+ '',
370
+ ' info;',
371
+ ' }',
372
+ '}'
373
+ ].join('\n');
374
+
375
+ const result = await ScriptExecutor.executeInDesignScript(script);
376
+ return formatResponse(result, "Get Master Spread Info");
377
+ }
378
+
379
+ /**
380
+ * Detach master items on a page (override to page)
381
+ */
382
+ static async detachMasterItems(args) {
383
+ const { pageIndex, itemIndex } = args;
384
+ const script = [
385
+ 'if (app.documents.length === 0) {',
386
+ ' "No document open";',
387
+ '} else {',
388
+ ' var doc = app.activeDocument;',
389
+ ` if (${pageIndex} >= doc.pages.length) {`,
390
+ ' "Page index out of range";',
391
+ ' } else {',
392
+ ` var page = doc.pages[${pageIndex}];`,
393
+ ' var master = page.appliedMaster;',
394
+ ' if (!master || !master.isValid) {',
395
+ ' "No master applied to page";',
396
+ ' } else {',
397
+ ' var count = 0;',
398
+ ` if (${itemIndex} !== undefined) {`,
399
+ ` if (${itemIndex} >= master.allPageItems.length) {`,
400
+ ' "Master item index out of range";',
401
+ ' } else {',
402
+ ` try { master.allPageItems[${itemIndex}].override(page); count=1; } catch (e) { "Error overriding: " + e.message; }`,
403
+ ' "Detached 1 master item";',
404
+ ' }',
405
+ ' } else {',
406
+ ' for (var i=0;i<master.allPageItems.length;i++){',
407
+ ' try { master.allPageItems[i].override(page); count++; } catch(e) {}',
408
+ ' }',
409
+ ' "Detached " + count + " master items";',
410
+ ' }',
411
+ ' }',
412
+ ' }',
413
+ '}'
414
+ ].join('\n');
415
+ const result = await ScriptExecutor.executeInDesignScript(script);
416
+ return formatResponse(result, 'Detach Master Items');
417
+ }
418
+
419
+ /**
420
+ * Remove override from a master page item on a page
421
+ * Implementation: deletes the overridden instance so master item shows again
422
+ */
423
+ static async removeMasterOverride(args) {
424
+ const { pageIndex, itemIndex } = args;
425
+ const script = [
426
+ 'if (app.documents.length === 0) {',
427
+ ' "No document open";',
428
+ '} else {',
429
+ ' var doc = app.activeDocument;',
430
+ ` if (${pageIndex} >= doc.pages.length) {`,
431
+ ' "Page index out of range";',
432
+ ' } else {',
433
+ ` var page = doc.pages[${pageIndex}];`,
434
+ ` if (${itemIndex} >= page.pageItems.length) {`,
435
+ ' "Page item index out of range";',
436
+ ' } else {',
437
+ ` var it = page.pageItems[${itemIndex}];`,
438
+ ' try {',
439
+ ' it.remove();',
440
+ ' "Master override removed (item deleted)";',
441
+ ' } catch (e) {',
442
+ ' "Error removing override: " + e.message;',
443
+ ' }',
444
+ ' }',
445
+ ' }',
446
+ '}'
447
+ ].join('\n');
448
+ const result = await ScriptExecutor.executeInDesignScript(script);
449
+ return formatResponse(result, 'Remove Master Override');
450
+ }
451
+ }