illustrator-mcp-server 1.2.4 → 1.2.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 (243) hide show
  1. package/README.ja.md +525 -107
  2. package/README.md +510 -89
  3. package/dist/executor/jsx-runner.d.ts +1 -0
  4. package/dist/executor/jsx-runner.d.ts.map +1 -1
  5. package/dist/executor/jsx-runner.js +33 -19
  6. package/dist/executor/jsx-runner.js.map +1 -1
  7. package/dist/jsx/helpers/common.jsx +113 -7
  8. package/dist/prompts/print-preflight-workflow.d.ts +3 -0
  9. package/dist/prompts/print-preflight-workflow.d.ts.map +1 -0
  10. package/dist/prompts/print-preflight-workflow.js +45 -0
  11. package/dist/prompts/print-preflight-workflow.js.map +1 -0
  12. package/dist/prompts/quick-layout.d.ts +3 -0
  13. package/dist/prompts/quick-layout.d.ts.map +1 -0
  14. package/dist/prompts/quick-layout.js +42 -0
  15. package/dist/prompts/quick-layout.js.map +1 -0
  16. package/dist/prompts/registry.d.ts +3 -0
  17. package/dist/prompts/registry.d.ts.map +1 -0
  18. package/dist/prompts/registry.js +7 -0
  19. package/dist/prompts/registry.js.map +1 -0
  20. package/dist/server.d.ts.map +1 -1
  21. package/dist/server.js +3 -1
  22. package/dist/server.js.map +1 -1
  23. package/dist/tools/export/export-pdf.d.ts.map +1 -1
  24. package/dist/tools/export/export-pdf.js +48 -18
  25. package/dist/tools/export/export-pdf.js.map +1 -1
  26. package/dist/tools/export/export.d.ts.map +1 -1
  27. package/dist/tools/export/export.js +41 -49
  28. package/dist/tools/export/export.js.map +1 -1
  29. package/dist/tools/modify/align-objects.d.ts +3 -0
  30. package/dist/tools/modify/align-objects.d.ts.map +1 -0
  31. package/dist/tools/modify/align-objects.js +195 -0
  32. package/dist/tools/modify/align-objects.js.map +1 -0
  33. package/dist/tools/modify/apply-color-profile.d.ts.map +1 -1
  34. package/dist/tools/modify/apply-color-profile.js +12 -10
  35. package/dist/tools/modify/apply-color-profile.js.map +1 -1
  36. package/dist/tools/modify/apply-graphic-style.d.ts +3 -0
  37. package/dist/tools/modify/apply-graphic-style.d.ts.map +1 -0
  38. package/dist/tools/modify/apply-graphic-style.js +100 -0
  39. package/dist/tools/modify/apply-graphic-style.js.map +1 -0
  40. package/dist/tools/modify/apply-text-style.d.ts +3 -0
  41. package/dist/tools/modify/apply-text-style.d.ts.map +1 -0
  42. package/dist/tools/modify/apply-text-style.js +117 -0
  43. package/dist/tools/modify/apply-text-style.js.map +1 -0
  44. package/dist/tools/modify/close-document.d.ts.map +1 -1
  45. package/dist/tools/modify/close-document.js +9 -9
  46. package/dist/tools/modify/close-document.js.map +1 -1
  47. package/dist/tools/modify/convert-to-outlines.d.ts.map +1 -1
  48. package/dist/tools/modify/convert-to-outlines.js +7 -29
  49. package/dist/tools/modify/convert-to-outlines.js.map +1 -1
  50. package/dist/tools/modify/create-document.d.ts.map +1 -1
  51. package/dist/tools/modify/create-document.js +8 -6
  52. package/dist/tools/modify/create-document.js.map +1 -1
  53. package/dist/tools/modify/create-ellipse.d.ts.map +1 -1
  54. package/dist/tools/modify/create-ellipse.js +15 -32
  55. package/dist/tools/modify/create-ellipse.js.map +1 -1
  56. package/dist/tools/modify/create-gradient.d.ts +3 -0
  57. package/dist/tools/modify/create-gradient.d.ts.map +1 -0
  58. package/dist/tools/modify/create-gradient.js +111 -0
  59. package/dist/tools/modify/create-gradient.js.map +1 -0
  60. package/dist/tools/modify/create-line.d.ts.map +1 -1
  61. package/dist/tools/modify/create-line.js +16 -36
  62. package/dist/tools/modify/create-line.js.map +1 -1
  63. package/dist/tools/modify/create-path-text.d.ts +3 -0
  64. package/dist/tools/modify/create-path-text.d.ts.map +1 -0
  65. package/dist/tools/modify/create-path-text.js +85 -0
  66. package/dist/tools/modify/create-path-text.js.map +1 -0
  67. package/dist/tools/modify/create-path.d.ts.map +1 -1
  68. package/dist/tools/modify/create-path.js +18 -38
  69. package/dist/tools/modify/create-path.js.map +1 -1
  70. package/dist/tools/modify/create-rectangle.d.ts.map +1 -1
  71. package/dist/tools/modify/create-rectangle.js +16 -32
  72. package/dist/tools/modify/create-rectangle.js.map +1 -1
  73. package/dist/tools/modify/create-text-frame.d.ts.map +1 -1
  74. package/dist/tools/modify/create-text-frame.js +27 -40
  75. package/dist/tools/modify/create-text-frame.js.map +1 -1
  76. package/dist/tools/modify/duplicate-objects.d.ts +3 -0
  77. package/dist/tools/modify/duplicate-objects.d.ts.map +1 -0
  78. package/dist/tools/modify/duplicate-objects.js +97 -0
  79. package/dist/tools/modify/duplicate-objects.js.map +1 -0
  80. package/dist/tools/modify/group-objects.d.ts +3 -0
  81. package/dist/tools/modify/group-objects.d.ts.map +1 -0
  82. package/dist/tools/modify/group-objects.js +79 -0
  83. package/dist/tools/modify/group-objects.js.map +1 -0
  84. package/dist/tools/modify/manage-artboards.d.ts +3 -0
  85. package/dist/tools/modify/manage-artboards.d.ts.map +1 -0
  86. package/dist/tools/modify/manage-artboards.js +142 -0
  87. package/dist/tools/modify/manage-artboards.js.map +1 -0
  88. package/dist/tools/modify/manage-datasets.d.ts +3 -0
  89. package/dist/tools/modify/manage-datasets.d.ts.map +1 -0
  90. package/dist/tools/modify/manage-datasets.js +126 -0
  91. package/dist/tools/modify/manage-datasets.js.map +1 -0
  92. package/dist/tools/modify/manage-layers.d.ts +3 -0
  93. package/dist/tools/modify/manage-layers.d.ts.map +1 -0
  94. package/dist/tools/modify/manage-layers.js +141 -0
  95. package/dist/tools/modify/manage-layers.js.map +1 -0
  96. package/dist/tools/modify/manage-linked-images.d.ts +3 -0
  97. package/dist/tools/modify/manage-linked-images.d.ts.map +1 -0
  98. package/dist/tools/modify/manage-linked-images.js +96 -0
  99. package/dist/tools/modify/manage-linked-images.js.map +1 -0
  100. package/dist/tools/modify/manage-swatches.d.ts +3 -0
  101. package/dist/tools/modify/manage-swatches.d.ts.map +1 -0
  102. package/dist/tools/modify/manage-swatches.js +78 -0
  103. package/dist/tools/modify/manage-swatches.js.map +1 -0
  104. package/dist/tools/modify/modify-object.d.ts.map +1 -1
  105. package/dist/tools/modify/modify-object.js +31 -47
  106. package/dist/tools/modify/modify-object.js.map +1 -1
  107. package/dist/tools/modify/move-to-layer.d.ts +3 -0
  108. package/dist/tools/modify/move-to-layer.d.ts.map +1 -0
  109. package/dist/tools/modify/move-to-layer.js +73 -0
  110. package/dist/tools/modify/move-to-layer.js.map +1 -0
  111. package/dist/tools/modify/open-document.d.ts +3 -0
  112. package/dist/tools/modify/open-document.d.ts.map +1 -0
  113. package/dist/tools/modify/open-document.js +72 -0
  114. package/dist/tools/modify/open-document.js.map +1 -0
  115. package/dist/tools/modify/place-color-chips.d.ts +3 -0
  116. package/dist/tools/modify/place-color-chips.d.ts.map +1 -0
  117. package/dist/tools/modify/place-color-chips.js +218 -0
  118. package/dist/tools/modify/place-color-chips.js.map +1 -0
  119. package/dist/tools/modify/place-image.d.ts.map +1 -1
  120. package/dist/tools/modify/place-image.js +26 -35
  121. package/dist/tools/modify/place-image.js.map +1 -1
  122. package/dist/tools/modify/place-symbol.d.ts +3 -0
  123. package/dist/tools/modify/place-symbol.d.ts.map +1 -0
  124. package/dist/tools/modify/place-symbol.js +96 -0
  125. package/dist/tools/modify/place-symbol.js.map +1 -0
  126. package/dist/tools/modify/replace-color.d.ts +3 -0
  127. package/dist/tools/modify/replace-color.d.ts.map +1 -0
  128. package/dist/tools/modify/replace-color.js +136 -0
  129. package/dist/tools/modify/replace-color.js.map +1 -0
  130. package/dist/tools/modify/resize-for-variation.d.ts +3 -0
  131. package/dist/tools/modify/resize-for-variation.d.ts.map +1 -0
  132. package/dist/tools/modify/resize-for-variation.js +169 -0
  133. package/dist/tools/modify/resize-for-variation.js.map +1 -0
  134. package/dist/tools/modify/save-document.d.ts +3 -0
  135. package/dist/tools/modify/save-document.d.ts.map +1 -0
  136. package/dist/tools/modify/save-document.js +63 -0
  137. package/dist/tools/modify/save-document.js.map +1 -0
  138. package/dist/tools/modify/set-z-order.d.ts +3 -0
  139. package/dist/tools/modify/set-z-order.d.ts.map +1 -0
  140. package/dist/tools/modify/set-z-order.js +60 -0
  141. package/dist/tools/modify/set-z-order.js.map +1 -0
  142. package/dist/tools/modify/shared.d.ts +49 -1
  143. package/dist/tools/modify/shared.d.ts.map +1 -1
  144. package/dist/tools/modify/shared.js +48 -4
  145. package/dist/tools/modify/shared.js.map +1 -1
  146. package/dist/tools/modify/undo.d.ts +3 -0
  147. package/dist/tools/modify/undo.d.ts.map +1 -0
  148. package/dist/tools/modify/undo.js +64 -0
  149. package/dist/tools/modify/undo.js.map +1 -0
  150. package/dist/tools/modify/ungroup-objects.d.ts +3 -0
  151. package/dist/tools/modify/ungroup-objects.d.ts.map +1 -0
  152. package/dist/tools/modify/ungroup-objects.js +67 -0
  153. package/dist/tools/modify/ungroup-objects.js.map +1 -0
  154. package/dist/tools/read/check-contrast.d.ts +3 -0
  155. package/dist/tools/read/check-contrast.d.ts.map +1 -0
  156. package/dist/tools/read/check-contrast.js +239 -0
  157. package/dist/tools/read/check-contrast.js.map +1 -0
  158. package/dist/tools/read/convert-coordinate.d.ts +3 -0
  159. package/dist/tools/read/convert-coordinate.d.ts.map +1 -0
  160. package/dist/tools/read/convert-coordinate.js +74 -0
  161. package/dist/tools/read/convert-coordinate.js.map +1 -0
  162. package/dist/tools/read/extract-design-tokens.d.ts +3 -0
  163. package/dist/tools/read/extract-design-tokens.d.ts.map +1 -0
  164. package/dist/tools/read/extract-design-tokens.js +258 -0
  165. package/dist/tools/read/extract-design-tokens.js.map +1 -0
  166. package/dist/tools/read/find-objects.d.ts.map +1 -1
  167. package/dist/tools/read/find-objects.js +16 -37
  168. package/dist/tools/read/find-objects.js.map +1 -1
  169. package/dist/tools/read/get-artboards.d.ts.map +1 -1
  170. package/dist/tools/read/get-artboards.js +15 -13
  171. package/dist/tools/read/get-artboards.js.map +1 -1
  172. package/dist/tools/read/get-colors.d.ts.map +1 -1
  173. package/dist/tools/read/get-colors.js +93 -15
  174. package/dist/tools/read/get-colors.js.map +1 -1
  175. package/dist/tools/read/get-document-info.d.ts.map +1 -1
  176. package/dist/tools/read/get-document-info.js +47 -19
  177. package/dist/tools/read/get-document-info.js.map +1 -1
  178. package/dist/tools/read/get-document-structure.d.ts.map +1 -1
  179. package/dist/tools/read/get-document-structure.js +16 -24
  180. package/dist/tools/read/get-document-structure.js.map +1 -1
  181. package/dist/tools/read/get-effects.d.ts.map +1 -1
  182. package/dist/tools/read/get-effects.js +32 -43
  183. package/dist/tools/read/get-effects.js.map +1 -1
  184. package/dist/tools/read/get-groups.d.ts.map +1 -1
  185. package/dist/tools/read/get-groups.js +22 -26
  186. package/dist/tools/read/get-groups.js.map +1 -1
  187. package/dist/tools/read/get-guidelines.d.ts.map +1 -1
  188. package/dist/tools/read/get-guidelines.js +13 -16
  189. package/dist/tools/read/get-guidelines.js.map +1 -1
  190. package/dist/tools/read/get-images.d.ts.map +1 -1
  191. package/dist/tools/read/get-images.js +43 -25
  192. package/dist/tools/read/get-images.js.map +1 -1
  193. package/dist/tools/read/get-layers.d.ts.map +1 -1
  194. package/dist/tools/read/get-layers.js +14 -15
  195. package/dist/tools/read/get-layers.js.map +1 -1
  196. package/dist/tools/read/get-overprint-info.d.ts.map +1 -1
  197. package/dist/tools/read/get-overprint-info.js +72 -63
  198. package/dist/tools/read/get-overprint-info.js.map +1 -1
  199. package/dist/tools/read/get-path-items.d.ts.map +1 -1
  200. package/dist/tools/read/get-path-items.js +26 -20
  201. package/dist/tools/read/get-path-items.js.map +1 -1
  202. package/dist/tools/read/get-selection.d.ts.map +1 -1
  203. package/dist/tools/read/get-selection.js +19 -33
  204. package/dist/tools/read/get-selection.js.map +1 -1
  205. package/dist/tools/read/get-separation-info.d.ts +3 -0
  206. package/dist/tools/read/get-separation-info.d.ts.map +1 -0
  207. package/dist/tools/read/get-separation-info.js +94 -0
  208. package/dist/tools/read/get-separation-info.js.map +1 -0
  209. package/dist/tools/read/get-symbols.d.ts.map +1 -1
  210. package/dist/tools/read/get-symbols.js +19 -23
  211. package/dist/tools/read/get-symbols.js.map +1 -1
  212. package/dist/tools/read/get-text-frame-detail.d.ts.map +1 -1
  213. package/dist/tools/read/get-text-frame-detail.js +270 -67
  214. package/dist/tools/read/get-text-frame-detail.js.map +1 -1
  215. package/dist/tools/read/list-fonts.d.ts +3 -0
  216. package/dist/tools/read/list-fonts.d.ts.map +1 -0
  217. package/dist/tools/read/list-fonts.js +78 -0
  218. package/dist/tools/read/list-fonts.js.map +1 -0
  219. package/dist/tools/read/list-text-frames.d.ts.map +1 -1
  220. package/dist/tools/read/list-text-frames.js +99 -36
  221. package/dist/tools/read/list-text-frames.js.map +1 -1
  222. package/dist/tools/registry.d.ts.map +1 -1
  223. package/dist/tools/registry.js +60 -0
  224. package/dist/tools/registry.js.map +1 -1
  225. package/dist/tools/session.d.ts +36 -0
  226. package/dist/tools/session.d.ts.map +1 -0
  227. package/dist/tools/session.js +246 -0
  228. package/dist/tools/session.js.map +1 -0
  229. package/dist/tools/utility/check-text-consistency.d.ts +3 -0
  230. package/dist/tools/utility/check-text-consistency.d.ts.map +1 -0
  231. package/dist/tools/utility/check-text-consistency.js +303 -0
  232. package/dist/tools/utility/check-text-consistency.js.map +1 -0
  233. package/dist/tools/utility/preflight-check.d.ts.map +1 -1
  234. package/dist/tools/utility/preflight-check.js +141 -43
  235. package/dist/tools/utility/preflight-check.js.map +1 -1
  236. package/dist/tools/utility/set-workflow.d.ts +3 -0
  237. package/dist/tools/utility/set-workflow.d.ts.map +1 -0
  238. package/dist/tools/utility/set-workflow.js +95 -0
  239. package/dist/tools/utility/set-workflow.js.map +1 -0
  240. package/dist/utils/image-header.d.ts.map +1 -1
  241. package/dist/utils/image-header.js +5 -1
  242. package/dist/utils/image-header.js.map +1 -1
  243. package/package.json +1 -1
@@ -0,0 +1,94 @@
1
+ import { executeJsx } from '../../executor/jsx-runner.js';
2
+ import { READ_ANNOTATIONS } from '../modify/shared.js';
3
+ /**
4
+ * get_separation_info — 色分解情報の取得
5
+ * @see https://ai-scripting.docsforadobe.dev/jsobjref/Ink/ — Ink, InkInfo
6
+ * @see https://ai-scripting.docsforadobe.dev/jsobjref/Document/ — documentColorSpace
7
+ */
8
+ const jsxCode = `
9
+ var preflight = preflightChecks();
10
+ if (preflight) {
11
+ writeResultFile(RESULT_PATH, preflight);
12
+ } else {
13
+ try {
14
+ var doc = app.activeDocument;
15
+ var isCMYKDoc = (doc.documentColorSpace === DocumentColorSpace.CMYK);
16
+ var separations = [];
17
+
18
+ // Process colors (CMYK)
19
+ if (isCMYKDoc) {
20
+ separations.push({ name: "Cyan", type: "process", usageCount: 0 });
21
+ separations.push({ name: "Magenta", type: "process", usageCount: 0 });
22
+ separations.push({ name: "Yellow", type: "process", usageCount: 0 });
23
+ separations.push({ name: "Black", type: "process", usageCount: 0 });
24
+ }
25
+
26
+ // Spot colors (spots[0] is registration, skip it)
27
+ for (var si = 1; si < doc.spots.length; si++) {
28
+ var spot = doc.spots[si];
29
+ var spotInfo = {
30
+ name: spot.name,
31
+ type: "spot",
32
+ usageCount: 0,
33
+ color: null
34
+ };
35
+ try { spotInfo.color = colorToObject(spot.color); } catch(e) {}
36
+ try {
37
+ var sk = spot.spotKind;
38
+ if (sk === SpotColorKind.SpotCMYK) spotInfo.spotKind = "CMYK";
39
+ else if (sk === SpotColorKind.SpotRGB) spotInfo.spotKind = "RGB";
40
+ else if (sk === SpotColorKind.SpotLAB) spotInfo.spotKind = "LAB";
41
+ else spotInfo.spotKind = sk.toString();
42
+ } catch(e) { spotInfo.spotKind = "unknown"; }
43
+ separations.push(spotInfo);
44
+ }
45
+
46
+ // スポットカラー名→インデックスのマップを構築(O(1)ルックアップ)
47
+ var spotIndex = {};
48
+ for (var si2 = 0; si2 < separations.length; si2++) {
49
+ spotIndex[separations[si2].name] = si2;
50
+ }
51
+
52
+ function countColorUsage(color) {
53
+ if (color.typename === "CMYKColor" && isCMYKDoc) {
54
+ if (color.cyan > 0) separations[0].usageCount++;
55
+ if (color.magenta > 0) separations[1].usageCount++;
56
+ if (color.yellow > 0) separations[2].usageCount++;
57
+ if (color.black > 0) separations[3].usageCount++;
58
+ } else if (color.typename === "SpotColor") {
59
+ var idx = spotIndex[color.spot.name];
60
+ if (idx !== undefined) separations[idx].usageCount++;
61
+ }
62
+ }
63
+
64
+ // Count usage by iterating pathItems
65
+ for (var pi = 0; pi < doc.pathItems.length; pi++) {
66
+ var item = doc.pathItems[pi];
67
+ try { if (item.filled) countColorUsage(item.fillColor); } catch(e) {}
68
+ try { if (item.stroked) countColorUsage(item.strokeColor); } catch(e) {}
69
+ }
70
+
71
+ writeResultFile(RESULT_PATH, {
72
+ documentColorSpace: isCMYKDoc ? "CMYK" : "RGB",
73
+ separationCount: separations.length,
74
+ separations: separations
75
+ });
76
+ } catch (e) {
77
+ writeResultFile(RESULT_PATH, { error: true, message: e.message, line: e.line });
78
+ }
79
+ }
80
+ `;
81
+ export function register(server) {
82
+ server.registerTool('get_separation_info', {
83
+ title: 'Get Separation Info',
84
+ description: 'Get color separation information: CMYK process plates and spot color plates with usage counts',
85
+ inputSchema: {},
86
+ annotations: READ_ANNOTATIONS,
87
+ }, async (params) => {
88
+ const result = await executeJsx(jsxCode, params);
89
+ return {
90
+ content: [{ type: 'text', text: JSON.stringify(result, null, 2) }],
91
+ };
92
+ });
93
+ }
94
+ //# sourceMappingURL=get-separation-info.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-separation-info.js","sourceRoot":"","sources":["../../../src/tools/read/get-separation-info.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD;;;;GAIG;AACH,MAAM,OAAO,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwEf,CAAC;AAEF,MAAM,UAAU,QAAQ,CAAC,MAAiB;IACxC,MAAM,CAAC,YAAY,CACjB,qBAAqB,EACrB;QACE,KAAK,EAAE,qBAAqB;QAC5B,WAAW,EACT,+FAA+F;QACjG,WAAW,EAAE,EAAE;QACf,WAAW,EAAE,gBAAgB;KAC9B,EACD,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QACjD,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;SACnE,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"get-symbols.d.ts","sourceRoot":"","sources":["../../../src/tools/read/get-symbols.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAgFpE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA0BhD"}
1
+ {"version":3,"file":"get-symbols.d.ts","sourceRoot":"","sources":["../../../src/tools/read/get-symbols.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAsFpE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAmBhD"}
@@ -1,11 +1,17 @@
1
- import { z } from 'zod';
2
1
  import { executeJsx } from '../../executor/jsx-runner.js';
2
+ import { coordinateSystemSchema, resolveCoordinateSystem, } from '../session.js';
3
+ import { READ_ANNOTATIONS } from '../modify/shared.js';
4
+ /**
5
+ * get_symbols — シンボル定義・インスタンスの取得
6
+ * @see https://ai-scripting.docsforadobe.dev/jsobjref/Symbols/ — Symbols collection
7
+ * @see https://ai-scripting.docsforadobe.dev/jsobjref/SymbolItem/ — symbol, position
8
+ */
3
9
  const jsxCode = `
4
- try {
5
- var err = preflightChecks();
6
- if (err) {
7
- writeResultFile(RESULT_PATH, err);
8
- } else {
10
+ var preflight = preflightChecks();
11
+ if (preflight) {
12
+ writeResultFile(RESULT_PATH, preflight);
13
+ } else {
14
+ try {
9
15
  var params = readParamsFile(PARAMS_PATH);
10
16
  var coordSystem = (params && params.coordinate_system) ? params.coordinate_system : "artboard-web";
11
17
  var doc = app.activeDocument;
@@ -43,10 +49,7 @@ try {
43
49
  var uuid = ensureUUID(sItem);
44
50
  var zIdx = getZIndex(sItem);
45
51
  var abIndex = getArtboardIndexForItem(sItem);
46
- var artboardRect = null;
47
- if (abIndex >= 0) {
48
- artboardRect = doc.artboards[abIndex].artboardRect;
49
- }
52
+ var artboardRect = getArtboardRectByIndex(abIndex);
50
53
  var bounds = getBounds(sItem, coordSystem, artboardRect);
51
54
 
52
55
  var instInfo = {
@@ -70,9 +73,9 @@ try {
70
73
  definitions: definitions,
71
74
  instances: instances
72
75
  });
76
+ } catch (e) {
77
+ writeResultFile(RESULT_PATH, { error: true, message: e.message, line: e.line });
73
78
  }
74
- } catch (e) {
75
- writeResultFile(RESULT_PATH, { error: true, message: e.message, line: e.line });
76
79
  }
77
80
  `;
78
81
  export function register(server) {
@@ -80,19 +83,12 @@ export function register(server) {
80
83
  title: 'Get Symbols',
81
84
  description: 'Get symbol definitions and instances',
82
85
  inputSchema: {
83
- coordinate_system: z
84
- .enum(['artboard-web', 'document'])
85
- .optional()
86
- .default('artboard-web'),
87
- },
88
- annotations: {
89
- readOnlyHint: true,
90
- destructiveHint: false,
91
- idempotentHint: true,
92
- openWorldHint: false,
86
+ coordinate_system: coordinateSystemSchema,
93
87
  },
88
+ annotations: READ_ANNOTATIONS,
94
89
  }, async (params) => {
95
- const result = await executeJsx(jsxCode, params);
90
+ const resolvedParams = { ...params, coordinate_system: await resolveCoordinateSystem(params.coordinate_system) };
91
+ const result = await executeJsx(jsxCode, resolvedParams);
96
92
  return {
97
93
  content: [{ type: 'text', text: JSON.stringify(result, null, 2) }],
98
94
  };
@@ -1 +1 @@
1
- {"version":3,"file":"get-symbols.js","sourceRoot":"","sources":["../../../src/tools/read/get-symbols.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAE1D,MAAM,OAAO,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0Ef,CAAC;AAEF,MAAM,UAAU,QAAQ,CAAC,MAAiB;IACxC,MAAM,CAAC,YAAY,CACjB,aAAa,EACb;QACE,KAAK,EAAE,aAAa;QACpB,WAAW,EAAE,sCAAsC;QACnD,WAAW,EAAE;YACX,iBAAiB,EAAE,CAAC;iBACjB,IAAI,CAAC,CAAC,cAAc,EAAE,UAAU,CAAC,CAAC;iBAClC,QAAQ,EAAE;iBACV,OAAO,CAAC,cAAc,CAAC;SAC3B;QACD,WAAW,EAAE;YACX,YAAY,EAAE,IAAI;YAClB,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,IAAI;YACpB,aAAa,EAAE,KAAK;SACrB;KACF,EACD,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QACjD,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;SACnE,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"get-symbols.js","sourceRoot":"","sources":["../../../src/tools/read/get-symbols.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAC1D,OAAO,EACL,sBAAsB,EACtB,uBAAuB,GACxB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD;;;;GAIG;AACH,MAAM,OAAO,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuEf,CAAC;AAEF,MAAM,UAAU,QAAQ,CAAC,MAAiB;IACxC,MAAM,CAAC,YAAY,CACjB,aAAa,EACb;QACE,KAAK,EAAE,aAAa;QACpB,WAAW,EAAE,sCAAsC;QACnD,WAAW,EAAE;YACX,iBAAiB,EAAE,sBAAsB;SAC1C;QACD,WAAW,EAAE,gBAAgB;KAC9B,EACD,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,MAAM,cAAc,GAAG,EAAE,GAAG,MAAM,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC,MAAM,CAAC,iBAAiB,CAAC,EAAE,CAAC;QACjH,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;QACzD,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;SACnE,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"get-text-frame-detail.d.ts","sourceRoot":"","sources":["../../../src/tools/read/get-text-frame-detail.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAmKpE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA0BhD"}
1
+ {"version":3,"file":"get-text-frame-detail.d.ts","sourceRoot":"","sources":["../../../src/tools/read/get-text-frame-detail.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AA+NpE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA+LhD"}
@@ -1,5 +1,14 @@
1
1
  import { z } from 'zod';
2
2
  import { executeJsx } from '../../executor/jsx-runner.js';
3
+ import { coordinateSystemSchema, resolveCoordinateSystem, } from '../session.js';
4
+ import { READ_ANNOTATIONS } from '../modify/shared.js';
5
+ /**
6
+ * get_text_frame_detail — テキストフレームの詳細情報取得
7
+ * @see https://ai-scripting.docsforadobe.dev/jsobjref/TextFrameItem/ — contents, textRanges, paragraphs
8
+ * @see https://ai-scripting.docsforadobe.dev/jsobjref/CharacterAttributes/ — size, textFont, tracking, Tsume, etc.
9
+ *
10
+ * 既知の制限: ParagraphAttributes.leading / .autoLeading は存在しないプロパティ(try/catch で回避中)。
11
+ */
3
12
  const jsxCode = `
4
13
  var preflight = preflightChecks();
5
14
  if (preflight) {
@@ -33,61 +42,16 @@ if (preflight) {
33
42
  } else {
34
43
  var tf = found;
35
44
 
36
- // テキスト種別
37
- var textKind = "unknown";
38
- if (tf.kind === TextType.POINTTEXT) {
39
- textKind = "point";
40
- } else if (tf.kind === TextType.AREATEXT) {
41
- textKind = "area";
42
- } else if (tf.kind === TextType.PATHTEXT) {
43
- textKind = "path";
44
- }
45
+ var textKind = getTextKind(tf);
45
46
 
46
47
  // 座標
47
48
  var itemAbIdx = getArtboardIndexForItem(tf);
48
49
  var boundsAbRect = null;
49
- if (coordSystem === "artboard-web" && itemAbIdx >= 0) {
50
- boundsAbRect = doc.artboards[itemAbIdx].artboardRect;
50
+ if (coordSystem === "artboard-web") {
51
+ boundsAbRect = getArtboardRectByIndex(itemAbIdx);
51
52
  }
52
53
  var bounds = getBounds(tf, coordSystem, boundsAbRect);
53
54
 
54
- // 文字属性(各 textRange ごと)
55
- var charAttrs = [];
56
- for (var ri = 0; ri < tf.textRanges.length; ri++) {
57
- var tr = tf.textRanges[ri];
58
- var ca = tr.characterAttributes;
59
- var charInfo = {
60
- text: tr.contents,
61
- fontFamily: "",
62
- fontStyle: "",
63
- fontSize: 0,
64
- color: { type: "none" },
65
- kerning: 0,
66
- tracking: 0,
67
- baselineShift: 0,
68
- horizontalScale: 100,
69
- verticalScale: 100,
70
- characterStyle: ""
71
- };
72
-
73
- try { charInfo.fontFamily = ca.textFont.family; } catch (e) {}
74
- try { charInfo.fontStyle = ca.textFont.style; } catch (e) {}
75
- try { charInfo.fontSize = ca.size; } catch (e) {}
76
- try { charInfo.color = colorToObject(ca.fillColor); } catch (e) {}
77
- try { charInfo.kerning = ca.kerningMethod ? ca.kerningMethod : 0; } catch (e) {}
78
- try { charInfo.tracking = ca.tracking; } catch (e) {}
79
- try { charInfo.baselineShift = ca.baselineShift; } catch (e) {}
80
- try { charInfo.horizontalScale = ca.horizontalScale; } catch (e) {}
81
- try { charInfo.verticalScale = ca.verticalScale; } catch (e) {}
82
- try {
83
- if (ca.characterStyle) {
84
- charInfo.characterStyle = ca.characterStyle.name || "";
85
- }
86
- } catch (e) {}
87
-
88
- charAttrs.push(charInfo);
89
- }
90
-
91
55
  // 段落属性(各段落ごと)
92
56
  var paraAttrs = [];
93
57
  for (var pi = 0; pi < tf.paragraphs.length; pi++) {
@@ -135,7 +99,102 @@ if (preflight) {
135
99
  paraAttrs.push(paraInfo);
136
100
  }
137
101
 
138
- var result = {
102
+ // 文字単位走査: 同一属性の連続文字はランにまとめる
103
+ var chars = tf.characters;
104
+ var runs = [];
105
+ var prevKey = "";
106
+ var currentRun = null;
107
+
108
+ for (var ci = 0; ci < chars.length; ci++) {
109
+ var ch = chars[ci];
110
+ var cca = ch.characterAttributes;
111
+ var info = {
112
+ fontFamily: "",
113
+ fontStyle: "",
114
+ fontSize: 0,
115
+ color: { type: "none" },
116
+ tracking: 0,
117
+ kerningMethod: "auto",
118
+ akiLeft: -1,
119
+ akiRight: -1,
120
+ tsume: 0,
121
+ proportionalMetrics: false,
122
+ baselineShift: 0,
123
+ horizontalScale: 100,
124
+ verticalScale: 100,
125
+ rotation: 0
126
+ };
127
+
128
+ try { info.fontFamily = cca.textFont.family; } catch (e2) {}
129
+ try { info.fontStyle = cca.textFont.style; } catch (e2) {}
130
+ try { info.fontSize = cca.size; } catch (e2) {}
131
+ try { info.color = colorToObject(cca.fillColor); } catch (e2) {}
132
+ try { info.tracking = cca.tracking; } catch (e2) {}
133
+ try {
134
+ var km2 = cca.kerningMethod;
135
+ if (km2 === AutoKernType.AUTO) info.kerningMethod = "auto";
136
+ else if (km2 === AutoKernType.OPTICAL) info.kerningMethod = "optical";
137
+ else if (km2 === AutoKernType.METRICSROMANONLY) info.kerningMethod = "metrics";
138
+ else if (km2 === AutoKernType.NOAUTOKERN) info.kerningMethod = "none";
139
+ else info.kerningMethod = String(km2);
140
+ } catch (e2) {}
141
+ try { info.proportionalMetrics = cca.proportionalMetrics; } catch (e2) {}
142
+ try { info.akiLeft = cca.akiLeft; } catch (e2) {}
143
+ try { info.akiRight = cca.akiRight; } catch (e2) {}
144
+ try { info.tsume = cca.Tsume; } catch (e2) {}
145
+ try { info.baselineShift = cca.baselineShift; } catch (e2) {}
146
+ try { info.horizontalScale = cca.horizontalScale; } catch (e2) {}
147
+ try { info.verticalScale = cca.verticalScale; } catch (e2) {}
148
+ try { info.rotation = cca.rotation; } catch (e2) {}
149
+
150
+ // ランキー生成: 属性が同一なら前のランに結合
151
+ var key = info.fontFamily + "|" + info.fontStyle + "|" + info.fontSize
152
+ + "|" + info.tracking + "|" + info.kerningMethod
153
+ + "|" + info.akiLeft + "|" + info.akiRight + "|" + info.tsume + "|" + info.proportionalMetrics
154
+ + "|" + info.baselineShift + "|" + info.horizontalScale + "|" + info.verticalScale
155
+ + "|" + info.rotation
156
+ + "|" + (info.color.type === "rgb" ? info.color.r + "," + info.color.g + "," + info.color.b
157
+ : info.color.type === "cmyk" ? info.color.c + "," + info.color.m + "," + info.color.y + "," + info.color.k
158
+ : info.color.type);
159
+
160
+ if (key === prevKey && currentRun) {
161
+ currentRun.text += ch.contents;
162
+ } else {
163
+ currentRun = {
164
+ text: ch.contents,
165
+ fontFamily: info.fontFamily,
166
+ fontStyle: info.fontStyle,
167
+ fontSize: info.fontSize,
168
+ color: info.color,
169
+ tracking: info.tracking,
170
+ kerningMethod: info.kerningMethod,
171
+ akiLeft: info.akiLeft,
172
+ akiRight: info.akiRight,
173
+ tsume: info.tsume,
174
+ proportionalMetrics: info.proportionalMetrics,
175
+ baselineShift: info.baselineShift,
176
+ horizontalScale: info.horizontalScale,
177
+ verticalScale: info.verticalScale,
178
+ rotation: info.rotation
179
+ };
180
+ runs.push(currentRun);
181
+ prevKey = key;
182
+ }
183
+ }
184
+
185
+ // 文字ペア間のカーニング値を収集 (TextRange.kerning — 手動設定がない位置では例外)
186
+ var kerningPairs = [];
187
+ for (var ki = 0; ki < chars.length; ki++) {
188
+ var kVal = null;
189
+ try { kVal = chars[ki].kerning; } catch (ek) { /* no manual kerning */ }
190
+ if (kVal !== null) {
191
+ var left = chars[ki].contents;
192
+ var right = (ki + 1 < chars.length) ? chars[ki + 1].contents : "";
193
+ kerningPairs.push({ index: ki, left: left, right: right, value: kVal });
194
+ }
195
+ }
196
+
197
+ writeResultFile(RESULT_PATH, {
139
198
  uuid: targetUUID,
140
199
  contents: tf.contents,
141
200
  x: bounds.x,
@@ -146,11 +205,10 @@ if (preflight) {
146
205
  zIndex: getZIndex(tf),
147
206
  artboardIndex: itemAbIdx,
148
207
  coordinateSystem: coordSystem,
149
- characterAttributes: charAttrs,
208
+ characterRuns: runs,
209
+ kerningPairs: kerningPairs,
150
210
  paragraphAttributes: paraAttrs
151
- };
152
-
153
- writeResultFile(RESULT_PATH, result);
211
+ });
154
212
  }
155
213
  }
156
214
  } catch (e) {
@@ -161,24 +219,169 @@ if (preflight) {
161
219
  export function register(server) {
162
220
  server.registerTool('get_text_frame_detail', {
163
221
  title: 'Get Text Frame Detail',
164
- description: 'Get detailed attributes of a specific text frame',
222
+ description: 'Get detailed text frame attributes including per-character runs (font, tracking, akiLeft/akiRight, tsume, proportionalMetrics), kerning pairs with manual kerning values (1/1000 em), and paragraph attributes. Returns cssHints for web/CSS reproduction. Note: paragraph leading/autoLeading may return 0 in some ExtendScript versions due to missing API support.',
165
223
  inputSchema: {
166
224
  uuid: z.string().describe('UUID of the target text frame'),
167
- coordinate_system: z
168
- .enum(['artboard-web', 'document'])
169
- .optional()
170
- .default('artboard-web')
171
- .describe('Coordinate system (artboard-web: artboard-relative Y-down, document: native Illustrator coordinates)'),
172
- },
173
- annotations: {
174
- readOnlyHint: true,
175
- destructiveHint: false,
176
- idempotentHint: true,
177
- openWorldHint: false,
225
+ coordinate_system: coordinateSystemSchema,
178
226
  },
227
+ annotations: READ_ANNOTATIONS,
179
228
  }, async (params) => {
180
- const result = await executeJsx(jsxCode, params);
181
- return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
229
+ const resolvedParams = { ...params, coordinate_system: await resolveCoordinateSystem(params.coordinate_system) };
230
+ const result = (await executeJsx(jsxCode, resolvedParams));
231
+ if (result.error) {
232
+ return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
233
+ }
234
+ // --- CSS ヒント付与 & サマリ生成 ---
235
+ const runs = (result.characterRuns ?? []);
236
+ const kerningPairs = (result.kerningPairs ?? []);
237
+ const cssRules = [];
238
+ const notes = [];
239
+ for (const run of runs) {
240
+ const css = {};
241
+ const tracking = run.tracking;
242
+ if (tracking !== 0) {
243
+ css['letter-spacing'] = `${(tracking / 1000).toFixed(3)}em`;
244
+ }
245
+ const tsume = run.tsume;
246
+ const propMetrics = run.proportionalMetrics;
247
+ const featureFlags = [];
248
+ if (tsume > 0)
249
+ featureFlags.push('"palt"');
250
+ if (propMetrics)
251
+ featureFlags.push('"palt"');
252
+ if (featureFlags.length > 0) {
253
+ css['font-feature-settings'] = [...new Set(featureFlags)].join(', ');
254
+ }
255
+ const baselineShift = run.baselineShift;
256
+ if (baselineShift !== 0) {
257
+ css['vertical-align'] = `${baselineShift}pt`;
258
+ }
259
+ const hScale = run.horizontalScale;
260
+ const vScale = run.verticalScale;
261
+ const rotation = run.rotation;
262
+ const transforms = [];
263
+ if (hScale !== 100 || vScale !== 100) {
264
+ transforms.push(`scale(${(hScale / 100).toFixed(2)}, ${(vScale / 100).toFixed(2)})`);
265
+ }
266
+ if (rotation !== 0) {
267
+ transforms.push(`rotate(${rotation}deg)`);
268
+ }
269
+ if (transforms.length > 0) {
270
+ css['transform'] = transforms.join(' ');
271
+ }
272
+ const kernType = run.kerningMethod;
273
+ if (kernType === 'none') {
274
+ css['font-kerning'] = 'none';
275
+ }
276
+ else if (kernType === 'optical' || kernType === 'metrics' || kernType === 'auto') {
277
+ css['font-kerning'] = 'auto';
278
+ }
279
+ if (Object.keys(css).length > 0) {
280
+ run.cssHints = css;
281
+ }
282
+ }
283
+ // --- 自然言語サマリを生成 ---
284
+ // フォント情報
285
+ const fontSet = new Set(runs.map((r) => `${r.fontFamily} ${r.fontStyle}`));
286
+ const fontSize = runs.length > 0 ? runs[0].fontSize : 0;
287
+ cssRules.push(`font-family: "${runs[0]?.fontFamily ?? ''}", sans-serif`);
288
+ cssRules.push(`font-size: ${fontSize}pt`);
289
+ // tracking → letter-spacing
290
+ const trackingVal = runs.length > 0 ? runs[0].tracking : 0;
291
+ if (trackingVal !== 0) {
292
+ cssRules.push(`letter-spacing: ${(trackingVal / 1000).toFixed(3)}em`);
293
+ }
294
+ // kerning method
295
+ const kernMethod = runs.length > 0 ? runs[0].kerningMethod : 'auto';
296
+ if (kernMethod !== 'none') {
297
+ cssRules.push('font-kerning: auto');
298
+ }
299
+ // kerning pairs サマリ
300
+ if (kerningPairs.length > 0) {
301
+ const pairDescs = kerningPairs.map((p) => `"${p.left}${p.right}" ${p.value > 0 ? '+' : ''}${p.value}`);
302
+ notes.push(`手動カーニング (${kerningPairs.length}箇所): ${pairDescs.join(', ')}。` +
303
+ 'Web再現するには各文字を<span>で囲み個別にletter-spacingを設定。');
304
+ }
305
+ else {
306
+ notes.push('手動カーニングなし。フォント内蔵のメトリクスカーニングのみ(font-kerning: auto で再現)。');
307
+ }
308
+ // 文字単位の特殊設定を検出
309
+ if (runs.length > 1) {
310
+ const diffs = [];
311
+ for (const run of runs) {
312
+ const parts = [];
313
+ if (run.horizontalScale !== 100 || run.verticalScale !== 100) {
314
+ parts.push(`transform: scale(${(run.horizontalScale / 100).toFixed(2)}, ${(run.verticalScale / 100).toFixed(2)})`);
315
+ }
316
+ if (run.baselineShift !== 0) {
317
+ parts.push(`ベースラインシフト: ${run.baselineShift}pt`);
318
+ }
319
+ if (run.rotation !== 0) {
320
+ parts.push(`回転: ${run.rotation}°`);
321
+ }
322
+ if (parts.length > 0) {
323
+ diffs.push(`"${run.text.substring(0, 20)}" → ${parts.join(', ')}`);
324
+ }
325
+ }
326
+ if (diffs.length > 0) {
327
+ notes.push(`文字単位の個別設定: ${diffs.join('; ')}`);
328
+ }
329
+ }
330
+ // tsume / proportionalMetrics
331
+ const hasTsume = runs.some((r) => r.tsume > 0);
332
+ const hasPropMetrics = runs.some((r) => r.proportionalMetrics === true);
333
+ if (hasTsume || hasPropMetrics) {
334
+ cssRules.push('font-feature-settings: "palt"');
335
+ notes.push('プロポーショナルメトリクスまたはツメが有効。CSSではfont-feature-settings: "palt"で再現。');
336
+ }
337
+ // paragraphs
338
+ const paras = (result.paragraphAttributes ?? []);
339
+ if (paras.length > 0) {
340
+ const para = paras[0];
341
+ if (para.justification && para.justification !== 'left') {
342
+ cssRules.push(`text-align: ${para.justification}`);
343
+ }
344
+ const leading = para.leading;
345
+ if (leading > 0 && fontSize > 0) {
346
+ cssRules.push(`line-height: ${(leading / fontSize).toFixed(2)}`);
347
+ }
348
+ }
349
+ // --- プレーンテキストのサマリを生成(Claude が最初に読むブロック) ---
350
+ const summaryLines = [];
351
+ summaryLines.push(`■ テキスト: "${result.contents.replace(/\r/g, '\\n').substring(0, 60)}"`);
352
+ summaryLines.push(`■ フォント: ${[...fontSet].join(', ')} / ${fontSize}pt`);
353
+ summaryLines.push('');
354
+ summaryLines.push('【CSS再現ルール】');
355
+ for (const rule of cssRules) {
356
+ summaryLines.push(` ${rule};`);
357
+ }
358
+ if (kerningPairs.length > 0) {
359
+ summaryLines.push('');
360
+ summaryLines.push(`【手動カーニング: ${kerningPairs.length}箇所】`);
361
+ summaryLines.push(' Web再現するには各文字を<span>で囲み個別にletter-spacingを設定。');
362
+ summaryLines.push(' 値の単位は1/1000em。');
363
+ for (const p of kerningPairs) {
364
+ const v = p.value;
365
+ summaryLines.push(` "${p.left}${p.right}": ${v > 0 ? '+' : ''}${v} → letter-spacing: ${(v / 1000).toFixed(3)}em`);
366
+ }
367
+ }
368
+ else {
369
+ summaryLines.push('');
370
+ summaryLines.push('【カーニング】');
371
+ summaryLines.push(' 手動カーニングなし。font-kerning: auto でフォント内蔵メトリクスを使用。');
372
+ }
373
+ for (const note of notes) {
374
+ if (!note.startsWith('手動カーニング')) {
375
+ summaryLines.push('');
376
+ summaryLines.push(`【注意】 ${note}`);
377
+ }
378
+ }
379
+ return {
380
+ content: [
381
+ { type: 'text', text: summaryLines.join('\n') },
382
+ { type: 'text', text: JSON.stringify(result, null, 2) },
383
+ ],
384
+ };
182
385
  });
183
386
  }
184
387
  //# sourceMappingURL=get-text-frame-detail.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"get-text-frame-detail.js","sourceRoot":"","sources":["../../../src/tools/read/get-text-frame-detail.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAE1D,MAAM,OAAO,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6Jf,CAAC;AAEF,MAAM,UAAU,QAAQ,CAAC,MAAiB;IACxC,MAAM,CAAC,YAAY,CACjB,uBAAuB,EACvB;QACE,KAAK,EAAE,uBAAuB;QAC9B,WAAW,EAAE,kDAAkD;QAC/D,WAAW,EAAE;YACX,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,+BAA+B,CAAC;YAC1D,iBAAiB,EAAE,CAAC;iBACjB,IAAI,CAAC,CAAC,cAAc,EAAE,UAAU,CAAC,CAAC;iBAClC,QAAQ,EAAE;iBACV,OAAO,CAAC,cAAc,CAAC;iBACvB,QAAQ,CAAC,sGAAsG,CAAC;SACpH;QACD,WAAW,EAAE;YACX,YAAY,EAAE,IAAI;YAClB,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,IAAI;YACpB,aAAa,EAAE,KAAK;SACrB;KACF,EACD,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QACjD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IAChF,CAAC,CACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"get-text-frame-detail.js","sourceRoot":"","sources":["../../../src/tools/read/get-text-frame-detail.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function register(server: McpServer): void;
3
+ //# sourceMappingURL=list-fonts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-fonts.d.ts","sourceRoot":"","sources":["../../../src/tools/read/list-fonts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAyDpE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA0BhD"}