@defai.digital/ax-cli 3.14.10 → 3.14.11

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 (106) hide show
  1. package/README.md +10 -1
  2. package/dist/agent/execution/tool-executor.d.ts +6 -0
  3. package/dist/agent/execution/tool-executor.js +72 -0
  4. package/dist/agent/execution/tool-executor.js.map +1 -1
  5. package/dist/commands/design.d.ts +18 -0
  6. package/dist/commands/design.js +495 -0
  7. package/dist/commands/design.js.map +1 -0
  8. package/dist/commands/vscode.js +1 -1
  9. package/dist/commands/vscode.js.map +1 -1
  10. package/dist/design/figma-alias.d.ts +88 -0
  11. package/dist/design/figma-alias.js +324 -0
  12. package/dist/design/figma-alias.js.map +1 -0
  13. package/dist/design/figma-audit.d.ts +40 -0
  14. package/dist/design/figma-audit.js +375 -0
  15. package/dist/design/figma-audit.js.map +1 -0
  16. package/dist/design/figma-client.d.ts +123 -0
  17. package/dist/design/figma-client.js +316 -0
  18. package/dist/design/figma-client.js.map +1 -0
  19. package/dist/design/figma-map.d.ts +29 -0
  20. package/dist/design/figma-map.js +274 -0
  21. package/dist/design/figma-map.js.map +1 -0
  22. package/dist/design/figma-tokens.d.ts +73 -0
  23. package/dist/design/figma-tokens.js +431 -0
  24. package/dist/design/figma-tokens.js.map +1 -0
  25. package/dist/design/index.d.ts +13 -0
  26. package/dist/design/index.js +18 -0
  27. package/dist/design/index.js.map +1 -0
  28. package/dist/design/types.d.ts +89 -0
  29. package/dist/design/types.js +9 -0
  30. package/dist/design/types.js.map +1 -0
  31. package/dist/hooks/hook-runner.js +2 -2
  32. package/dist/hooks/hook-runner.js.map +1 -1
  33. package/dist/index.js +3 -0
  34. package/dist/index.js.map +1 -1
  35. package/dist/ipc/vscode-client.js +1 -1
  36. package/dist/ipc/vscode-client.js.map +1 -1
  37. package/dist/llm/tools.js +170 -0
  38. package/dist/llm/tools.js.map +1 -1
  39. package/dist/mcp/client-v2.js +1 -1
  40. package/dist/mcp/client-v2.js.map +1 -1
  41. package/dist/mcp/validation.js +1 -1
  42. package/dist/mcp/validation.js.map +1 -1
  43. package/dist/permissions/permission-manager.js +2 -2
  44. package/dist/permissions/permission-manager.js.map +1 -1
  45. package/dist/tools/design-tool.d.ts +59 -0
  46. package/dist/tools/design-tool.js +258 -0
  47. package/dist/tools/design-tool.js.map +1 -0
  48. package/dist/ui/hooks/use-input-history.js +1 -1
  49. package/dist/ui/hooks/use-input-history.js.map +1 -1
  50. package/dist/ui/utils/image-handler.js +1 -1
  51. package/dist/ui/utils/image-handler.js.map +1 -1
  52. package/dist/utils/path-security.js +2 -2
  53. package/dist/utils/path-security.js.map +1 -1
  54. package/dist/utils/progress-tracker.js +1 -1
  55. package/dist/utils/progress-tracker.js.map +1 -1
  56. package/dist/utils/settings-manager.js +8 -3
  57. package/dist/utils/settings-manager.js.map +1 -1
  58. package/node_modules/@ax-cli/schemas/dist/index.d.ts +1 -0
  59. package/node_modules/@ax-cli/schemas/dist/index.d.ts.map +1 -1
  60. package/node_modules/@ax-cli/schemas/dist/index.js +2 -2
  61. package/node_modules/@ax-cli/schemas/dist/index.js.map +1 -1
  62. package/node_modules/@ax-cli/schemas/dist/public/design/alias-types.d.ts +346 -0
  63. package/node_modules/@ax-cli/schemas/dist/public/design/alias-types.d.ts.map +1 -0
  64. package/node_modules/@ax-cli/schemas/dist/public/design/alias-types.js +171 -0
  65. package/node_modules/@ax-cli/schemas/dist/public/design/alias-types.js.map +1 -0
  66. package/node_modules/@ax-cli/schemas/dist/public/design/audit-types.d.ts +545 -0
  67. package/node_modules/@ax-cli/schemas/dist/public/design/audit-types.d.ts.map +1 -0
  68. package/node_modules/@ax-cli/schemas/dist/public/design/audit-types.js +307 -0
  69. package/node_modules/@ax-cli/schemas/dist/public/design/audit-types.js.map +1 -0
  70. package/node_modules/@ax-cli/schemas/dist/public/design/figma-types.d.ts +1306 -0
  71. package/node_modules/@ax-cli/schemas/dist/public/design/figma-types.d.ts.map +1 -0
  72. package/node_modules/@ax-cli/schemas/dist/public/design/figma-types.js +428 -0
  73. package/node_modules/@ax-cli/schemas/dist/public/design/figma-types.js.map +1 -0
  74. package/node_modules/@ax-cli/schemas/dist/public/design/index.d.ts +13 -0
  75. package/node_modules/@ax-cli/schemas/dist/public/design/index.d.ts.map +1 -0
  76. package/node_modules/@ax-cli/schemas/dist/public/design/index.js +82 -0
  77. package/node_modules/@ax-cli/schemas/dist/public/design/index.js.map +1 -0
  78. package/node_modules/@ax-cli/schemas/dist/public/design/token-types.d.ts +1245 -0
  79. package/node_modules/@ax-cli/schemas/dist/public/design/token-types.d.ts.map +1 -0
  80. package/node_modules/@ax-cli/schemas/dist/public/design/token-types.js +282 -0
  81. package/node_modules/@ax-cli/schemas/dist/public/design/token-types.js.map +1 -0
  82. package/package.json +1 -1
  83. package/packages/schemas/dist/index.d.ts +1 -0
  84. package/packages/schemas/dist/index.d.ts.map +1 -1
  85. package/packages/schemas/dist/index.js +2 -2
  86. package/packages/schemas/dist/index.js.map +1 -1
  87. package/packages/schemas/dist/public/design/alias-types.d.ts +346 -0
  88. package/packages/schemas/dist/public/design/alias-types.d.ts.map +1 -0
  89. package/packages/schemas/dist/public/design/alias-types.js +171 -0
  90. package/packages/schemas/dist/public/design/alias-types.js.map +1 -0
  91. package/packages/schemas/dist/public/design/audit-types.d.ts +545 -0
  92. package/packages/schemas/dist/public/design/audit-types.d.ts.map +1 -0
  93. package/packages/schemas/dist/public/design/audit-types.js +307 -0
  94. package/packages/schemas/dist/public/design/audit-types.js.map +1 -0
  95. package/packages/schemas/dist/public/design/figma-types.d.ts +1306 -0
  96. package/packages/schemas/dist/public/design/figma-types.d.ts.map +1 -0
  97. package/packages/schemas/dist/public/design/figma-types.js +428 -0
  98. package/packages/schemas/dist/public/design/figma-types.js.map +1 -0
  99. package/packages/schemas/dist/public/design/index.d.ts +13 -0
  100. package/packages/schemas/dist/public/design/index.d.ts.map +1 -0
  101. package/packages/schemas/dist/public/design/index.js +82 -0
  102. package/packages/schemas/dist/public/design/index.js.map +1 -0
  103. package/packages/schemas/dist/public/design/token-types.d.ts +1245 -0
  104. package/packages/schemas/dist/public/design/token-types.d.ts.map +1 -0
  105. package/packages/schemas/dist/public/design/token-types.js +282 -0
  106. package/packages/schemas/dist/public/design/token-types.js.map +1 -0
@@ -0,0 +1,375 @@
1
+ /**
2
+ * Figma Design Audit
3
+ *
4
+ * Rule-based audit system for checking design consistency,
5
+ * accessibility, and best practices.
6
+ *
7
+ * @module design/figma-audit
8
+ */
9
+ // =============================================================================
10
+ // Generic Layer Naming Patterns
11
+ // =============================================================================
12
+ const GENERIC_NAMES = [
13
+ /^Frame \d+$/i,
14
+ /^Rectangle \d+$/i,
15
+ /^Ellipse \d+$/i,
16
+ /^Line \d+$/i,
17
+ /^Group \d+$/i,
18
+ /^Vector \d+$/i,
19
+ /^Text$/i,
20
+ /^Image \d*$/i,
21
+ /^Component \d+$/i,
22
+ /^Instance$/i,
23
+ /^Polygon \d+$/i,
24
+ /^Star \d+$/i,
25
+ /^Boolean \d+$/i,
26
+ ];
27
+ // =============================================================================
28
+ // Rule Implementations
29
+ // =============================================================================
30
+ /**
31
+ * Check for generic layer names
32
+ */
33
+ function checkLayerNaming(node, _context, path) {
34
+ const issues = [];
35
+ const isGeneric = GENERIC_NAMES.some((pattern) => pattern.test(node.name));
36
+ if (isGeneric) {
37
+ issues.push(createIssue('layer-naming', 'info', `Generic layer name "${node.name}" - consider using a descriptive name`, node, path, { suggestion: 'Rename to describe the layer\'s purpose (e.g., "Hero Section", "Primary Button")' }));
38
+ }
39
+ return issues;
40
+ }
41
+ /**
42
+ * Check for missing auto-layout on frames with multiple children
43
+ */
44
+ function checkMissingAutoLayout(node, _context, path) {
45
+ const issues = [];
46
+ // Only check frames
47
+ if (node.type !== 'FRAME' && node.type !== 'COMPONENT') {
48
+ return issues;
49
+ }
50
+ // Check if it has children but no auto-layout
51
+ const childCount = node.children?.length ?? 0;
52
+ if (childCount >= 2 && !node.hasAutoLayout) {
53
+ issues.push(createIssue('missing-autolayout', 'info', `Frame "${node.name}" has ${childCount} children but no auto-layout`, node, path, { suggestion: 'Consider adding auto-layout for responsive design' }));
54
+ }
55
+ return issues;
56
+ }
57
+ /**
58
+ * Check naming conventions
59
+ */
60
+ function checkNamingConvention(node, _context, path) {
61
+ const issues = [];
62
+ // Check components follow PascalCase
63
+ if (node.type === 'COMPONENT' || node.type === 'COMPONENT_SET') {
64
+ const isPascalCase = /^[A-Z][a-zA-Z0-9]*(\s[A-Z][a-zA-Z0-9]*)*$/.test(node.name);
65
+ if (!isPascalCase && !node.name.includes('/')) {
66
+ issues.push(createIssue('naming-convention', 'info', `Component "${node.name}" doesn't follow PascalCase naming`, node, path, { suggestion: 'Use PascalCase for components (e.g., "PrimaryButton", "Card Header")' }));
67
+ }
68
+ }
69
+ // Check for very short names (likely meaningless)
70
+ if (node.name.length === 1 && node.type !== 'TEXT') {
71
+ issues.push(createIssue('naming-convention', 'info', `Very short layer name "${node.name}" - likely needs more context`, node, path, { suggestion: 'Use descriptive names that explain the layer\'s purpose' }));
72
+ }
73
+ return issues;
74
+ }
75
+ /**
76
+ * Check for potential text overflow issues
77
+ */
78
+ function checkTextOverflow(node, _context, path) {
79
+ const issues = [];
80
+ // Only check text nodes
81
+ if (node.type !== 'TEXT') {
82
+ return issues;
83
+ }
84
+ // Check for truncated text (indicated by ...)
85
+ if (node.characters && node.characters.endsWith('...')) {
86
+ issues.push(createIssue('text-overflow', 'warning', `Text "${node.name}" may be truncated`, node, path, {
87
+ suggestion: 'Check if text overflow is intentional or if container needs resizing',
88
+ actual: node.characters,
89
+ }));
90
+ }
91
+ return issues;
92
+ }
93
+ /**
94
+ * Check component usage (prefer instances over detached)
95
+ */
96
+ function checkComponentUsage(node, _context, path) {
97
+ const issues = [];
98
+ // Check for frames that might be better as component instances
99
+ if (node.type === 'FRAME' && node.children) {
100
+ // Look for patterns that suggest this should be a component
101
+ const childNames = node.children.map((c) => c.name);
102
+ const hasButtonPattern = childNames.some((n) => /button|btn|cta/i.test(n));
103
+ const hasCardPattern = childNames.some((n) => /title|description|image|content/i.test(n));
104
+ if (hasButtonPattern || hasCardPattern) {
105
+ // Check if parent path suggests this is already a component
106
+ const isComponent = path.some((p) => /component|instance/i.test(p));
107
+ if (!isComponent && !node.componentKey) {
108
+ issues.push(createIssue('component-usage', 'info', `Frame "${node.name}" has common component patterns - consider making it a component`, node, path, { suggestion: 'Convert to component for reusability and consistency' }));
109
+ }
110
+ }
111
+ }
112
+ return issues;
113
+ }
114
+ /**
115
+ * Check spacing consistency (basic check for common values)
116
+ */
117
+ function checkSpacingConsistency(_node, _context, _path) {
118
+ // This is a simplified check - full implementation would need
119
+ // actual spacing values from the Figma API
120
+ // For MVP, we just note frames without auto-layout padding
121
+ return [];
122
+ }
123
+ /**
124
+ * Check font consistency
125
+ */
126
+ function checkFontConsistency(_node, _context, _path) {
127
+ // Font consistency requires style information from the API
128
+ // For MVP, this is a placeholder
129
+ return [];
130
+ }
131
+ /**
132
+ * Check token usage
133
+ */
134
+ function checkTokenUsage(_node, _context, _path) {
135
+ // Token usage requires variable bindings from the API
136
+ // For MVP, this is a placeholder
137
+ return [];
138
+ }
139
+ /**
140
+ * Check color contrast
141
+ */
142
+ function checkColorContrast(_node, _context, _path) {
143
+ // Color contrast requires color values from the API
144
+ // For MVP, this is a placeholder
145
+ return [];
146
+ }
147
+ /**
148
+ * Check image resolution
149
+ */
150
+ function checkImageResolution(_node, _context, _path) {
151
+ // Image resolution requires image API calls
152
+ // Disabled by default
153
+ return [];
154
+ }
155
+ // =============================================================================
156
+ // Rule Registry
157
+ // =============================================================================
158
+ const RULE_CHECKERS = {
159
+ 'layer-naming': checkLayerNaming,
160
+ 'missing-autolayout': checkMissingAutoLayout,
161
+ 'naming-convention': checkNamingConvention,
162
+ 'text-overflow': checkTextOverflow,
163
+ 'component-usage': checkComponentUsage,
164
+ 'spacing-consistency': checkSpacingConsistency,
165
+ 'font-consistency': checkFontConsistency,
166
+ 'token-usage': checkTokenUsage,
167
+ 'color-contrast': checkColorContrast,
168
+ 'image-resolution': checkImageResolution,
169
+ };
170
+ // =============================================================================
171
+ // Helper Functions
172
+ // =============================================================================
173
+ function createIssue(ruleId, severity, message, node, path, extras = {}) {
174
+ return {
175
+ ruleId,
176
+ severity,
177
+ message,
178
+ location: {
179
+ nodeId: node.id,
180
+ nodeName: node.name,
181
+ nodePath: path.join(' > '),
182
+ nodeType: node.type,
183
+ },
184
+ ...extras,
185
+ };
186
+ }
187
+ function getEnabledRules(config) {
188
+ // Import DEFAULT_AUDIT_RULES at runtime to avoid circular deps
189
+ const defaultRules = [
190
+ { id: 'layer-naming', name: 'Layer Naming', description: 'Check for generic layer names', severity: 'info', category: 'naming', enabled: true },
191
+ { id: 'missing-autolayout', name: 'Missing Auto-Layout', description: 'Identify frames without auto-layout', severity: 'info', category: 'best-practices', enabled: true },
192
+ { id: 'naming-convention', name: 'Naming Convention', description: 'Check naming conventions', severity: 'info', category: 'naming', enabled: true },
193
+ { id: 'text-overflow', name: 'Text Overflow', description: 'Detect text overflow issues', severity: 'warning', category: 'best-practices', enabled: true },
194
+ { id: 'component-usage', name: 'Component Usage', description: 'Check component usage patterns', severity: 'info', category: 'best-practices', enabled: true },
195
+ { id: 'spacing-consistency', name: 'Spacing Consistency', description: 'Check spacing values', severity: 'warning', category: 'consistency', enabled: true },
196
+ { id: 'font-consistency', name: 'Font Consistency', description: 'Check font consistency', severity: 'warning', category: 'consistency', enabled: true },
197
+ { id: 'token-usage', name: 'Token Usage', description: 'Check token usage', severity: 'warning', category: 'consistency', enabled: true },
198
+ { id: 'color-contrast', name: 'Color Contrast', description: 'Check color contrast', severity: 'error', category: 'accessibility', enabled: true },
199
+ { id: 'image-resolution', name: 'Image Resolution', description: 'Check image resolution', severity: 'warning', category: 'performance', enabled: false },
200
+ ];
201
+ let rules = [...defaultRules];
202
+ // Filter to only requested rules
203
+ if (config.rules && config.rules.length > 0) {
204
+ rules = rules.filter((r) => config.rules.includes(r.id));
205
+ }
206
+ // Exclude specified rules
207
+ if (config.excludeRules && config.excludeRules.length > 0) {
208
+ rules = rules.filter((r) => !config.excludeRules.includes(r.id));
209
+ }
210
+ // Apply rule overrides
211
+ if (config.ruleConfig) {
212
+ rules = rules.map((rule) => {
213
+ const override = config.ruleConfig?.[rule.id];
214
+ if (override) {
215
+ return {
216
+ ...rule,
217
+ enabled: override.enabled ?? rule.enabled,
218
+ severity: override.severity ?? rule.severity,
219
+ };
220
+ }
221
+ return rule;
222
+ });
223
+ }
224
+ // Return only enabled rules
225
+ return rules.filter((r) => r.enabled);
226
+ }
227
+ // =============================================================================
228
+ // Main Audit Function
229
+ // =============================================================================
230
+ /**
231
+ * Audit a Figma file/node for design issues
232
+ */
233
+ export function auditDesign(mapResult, config = {}) {
234
+ const startTime = Date.now();
235
+ const enabledRules = getEnabledRules(config);
236
+ const context = {
237
+ fileKey: mapResult.fileKey,
238
+ fileName: mapResult.fileName,
239
+ config,
240
+ rules: enabledRules,
241
+ issues: [],
242
+ nodesAudited: 0,
243
+ startTime,
244
+ };
245
+ // Traverse and audit
246
+ auditNode(mapResult.root, context, [], 0);
247
+ // Build summary
248
+ const issueCount = {
249
+ error: context.issues.filter((i) => i.severity === 'error').length,
250
+ warning: context.issues.filter((i) => i.severity === 'warning').length,
251
+ info: context.issues.filter((i) => i.severity === 'info').length,
252
+ total: context.issues.length,
253
+ };
254
+ const summary = {
255
+ totalNodes: mapResult.nodeCount,
256
+ nodesAudited: context.nodesAudited,
257
+ issueCount,
258
+ passRate: context.nodesAudited > 0
259
+ ? Math.round(((context.nodesAudited - issueCount.total) / context.nodesAudited) * 100 * 100) / 100
260
+ : 100,
261
+ rulesRun: enabledRules.map((r) => r.id),
262
+ duration: Date.now() - startTime,
263
+ };
264
+ return {
265
+ fileKey: mapResult.fileKey,
266
+ fileName: mapResult.fileName,
267
+ timestamp: new Date().toISOString(),
268
+ summary,
269
+ issues: context.issues,
270
+ };
271
+ }
272
+ /**
273
+ * Recursively audit a node and its children
274
+ */
275
+ function auditNode(node, context, path, depth) {
276
+ // Check depth limit
277
+ if (context.config.maxDepth !== undefined && depth > context.config.maxDepth) {
278
+ return;
279
+ }
280
+ context.nodesAudited++;
281
+ const currentPath = [...path, node.name];
282
+ // Run each enabled rule
283
+ for (const rule of context.rules) {
284
+ const checker = RULE_CHECKERS[rule.id];
285
+ if (checker) {
286
+ const issues = checker(node, context, currentPath);
287
+ // Apply rule severity override
288
+ const processedIssues = issues.map((issue) => ({
289
+ ...issue,
290
+ severity: rule.severity, // Use rule's severity (may be overridden)
291
+ }));
292
+ context.issues.push(...processedIssues);
293
+ }
294
+ }
295
+ // Recurse into children
296
+ if (node.children) {
297
+ for (const child of node.children) {
298
+ auditNode(child, context, currentPath, depth + 1);
299
+ }
300
+ }
301
+ }
302
+ // =============================================================================
303
+ // Output Formatting
304
+ // =============================================================================
305
+ /**
306
+ * Format audit result for terminal display
307
+ */
308
+ export function formatAuditResult(result) {
309
+ const lines = [];
310
+ // Header
311
+ lines.push('Design Audit Report');
312
+ lines.push('===================');
313
+ lines.push(`File: ${result.fileName ?? result.fileKey}`);
314
+ lines.push(`Timestamp: ${result.timestamp}`);
315
+ lines.push('');
316
+ // Summary
317
+ lines.push('Summary');
318
+ lines.push('-------');
319
+ lines.push(`Nodes audited: ${result.summary.nodesAudited}/${result.summary.totalNodes}`);
320
+ lines.push(`Rules run: ${result.summary.rulesRun.length}`);
321
+ lines.push(`Duration: ${result.summary.duration}ms`);
322
+ lines.push('');
323
+ lines.push(`Issues: ${result.summary.issueCount.total}`);
324
+ lines.push(` Errors: ${result.summary.issueCount.error}`);
325
+ lines.push(` Warnings: ${result.summary.issueCount.warning}`);
326
+ lines.push(` Info: ${result.summary.issueCount.info}`);
327
+ lines.push('');
328
+ lines.push(`Pass Rate: ${result.summary.passRate}%`);
329
+ lines.push('');
330
+ // Issues by severity
331
+ if (result.issues.length > 0) {
332
+ lines.push('Issues');
333
+ lines.push('------');
334
+ // Group by severity
335
+ const byRule = new Map();
336
+ for (const issue of result.issues) {
337
+ const existing = byRule.get(issue.ruleId) ?? [];
338
+ existing.push(issue);
339
+ byRule.set(issue.ruleId, existing);
340
+ }
341
+ for (const [ruleId, issues] of byRule) {
342
+ lines.push('');
343
+ lines.push(`[${ruleId}] (${issues.length} issue${issues.length === 1 ? '' : 's'})`);
344
+ for (const issue of issues.slice(0, 10)) {
345
+ const severityIcon = issue.severity === 'error' ? '✗' : issue.severity === 'warning' ? '!' : '•';
346
+ lines.push(` ${severityIcon} ${issue.message}`);
347
+ lines.push(` Path: ${issue.location.nodePath}`);
348
+ lines.push(` Node ID: ${issue.location.nodeId}`);
349
+ if (issue.suggestion) {
350
+ lines.push(` Suggestion: ${issue.suggestion}`);
351
+ }
352
+ }
353
+ if (issues.length > 10) {
354
+ lines.push(` ... and ${issues.length - 10} more`);
355
+ }
356
+ }
357
+ }
358
+ else {
359
+ lines.push('No issues found!');
360
+ }
361
+ return lines.join('\n');
362
+ }
363
+ /**
364
+ * Format audit result as compact summary
365
+ */
366
+ export function formatAuditSummary(result) {
367
+ const { summary } = result;
368
+ const status = summary.issueCount.error > 0
369
+ ? 'FAILED'
370
+ : summary.issueCount.warning > 0
371
+ ? 'WARNINGS'
372
+ : 'PASSED';
373
+ return `[${status}] ${summary.nodesAudited} nodes, ${summary.issueCount.total} issues (${summary.issueCount.error} errors, ${summary.issueCount.warning} warnings, ${summary.issueCount.info} info) - ${summary.passRate}% pass rate`;
374
+ }
375
+ //# sourceMappingURL=figma-audit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"figma-audit.js","sourceRoot":"","sources":["../../src/design/figma-audit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,123 @@
1
+ /**
2
+ * Figma REST API Client
3
+ *
4
+ * Provides a type-safe interface to the Figma REST API.
5
+ * Includes caching, rate limiting, and error handling.
6
+ *
7
+ * @module design/figma-client
8
+ */
9
+ import { type FigmaFileResponse, type FigmaNodesResponse, type FigmaVariablesResponse, type FigmaImagesResponse, type GetFileOptions, type GetImagesOptions } from '@ax-cli/schemas';
10
+ export interface FigmaClientConfig {
11
+ /** Figma API access token */
12
+ accessToken: string;
13
+ /** Base URL for Figma API (default: https://api.figma.com) */
14
+ baseUrl?: string;
15
+ /** Request timeout in ms (default: 30000) */
16
+ timeout?: number;
17
+ /** Enable response caching (default: true) */
18
+ cacheEnabled?: boolean;
19
+ /** Cache TTL in ms (default: 60000) */
20
+ cacheTtl?: number;
21
+ }
22
+ export interface FigmaApiError extends Error {
23
+ status: number;
24
+ endpoint: string;
25
+ figmaError?: string;
26
+ }
27
+ export declare class FigmaClient {
28
+ private readonly accessToken;
29
+ private readonly baseUrl;
30
+ private readonly timeout;
31
+ private readonly cache;
32
+ private readonly cacheEnabled;
33
+ private readonly rateLimiter;
34
+ constructor(config: FigmaClientConfig);
35
+ private request;
36
+ /**
37
+ * Get a Figma file
38
+ *
39
+ * @param fileKey - The file key from the Figma URL
40
+ * @param options - Optional parameters (depth, geometry, etc.)
41
+ * @returns Validated FigmaFileResponse
42
+ *
43
+ * @example
44
+ * ```typescript
45
+ * const file = await client.getFile('abc123xyz', { depth: 2 });
46
+ * console.log(file.name);
47
+ * ```
48
+ */
49
+ getFile(fileKey: string, options?: GetFileOptions): Promise<FigmaFileResponse>;
50
+ /**
51
+ * Get specific nodes from a Figma file
52
+ *
53
+ * @param fileKey - The file key from the Figma URL
54
+ * @param nodeIds - Array of node IDs to fetch
55
+ * @returns Validated FigmaNodesResponse
56
+ *
57
+ * @example
58
+ * ```typescript
59
+ * const nodes = await client.getFileNodes('abc123xyz', ['1:2', '3:4']);
60
+ * ```
61
+ */
62
+ getFileNodes(fileKey: string, nodeIds: string[]): Promise<FigmaNodesResponse>;
63
+ /**
64
+ * Get local variables (design tokens) from a Figma file
65
+ *
66
+ * @param fileKey - The file key from the Figma URL
67
+ * @returns Validated FigmaVariablesResponse
68
+ *
69
+ * @example
70
+ * ```typescript
71
+ * const variables = await client.getLocalVariables('abc123xyz');
72
+ * ```
73
+ */
74
+ getLocalVariables(fileKey: string): Promise<FigmaVariablesResponse>;
75
+ /**
76
+ * Get images for specific nodes
77
+ *
78
+ * @param fileKey - The file key from the Figma URL
79
+ * @param nodeIds - Array of node IDs to export
80
+ * @param options - Export options (scale, format)
81
+ * @returns Validated FigmaImagesResponse with URLs
82
+ *
83
+ * @example
84
+ * ```typescript
85
+ * const images = await client.getImages('abc123xyz', ['1:2'], { format: 'png', scale: 2 });
86
+ * ```
87
+ */
88
+ getImages(fileKey: string, nodeIds: string[], options?: GetImagesOptions): Promise<FigmaImagesResponse>;
89
+ /**
90
+ * Get file metadata without the full document tree
91
+ *
92
+ * @param fileKey - The file key from the Figma URL
93
+ * @returns Basic file info (name, lastModified, etc.)
94
+ */
95
+ getFileMetadata(fileKey: string): Promise<{
96
+ name: string;
97
+ lastModified: string;
98
+ version: string;
99
+ thumbnailUrl?: string;
100
+ }>;
101
+ /**
102
+ * Clear the response cache
103
+ */
104
+ clearCache(): void;
105
+ /**
106
+ * Invalidate cache for a specific file
107
+ */
108
+ invalidateFile(fileKey: string): void;
109
+ }
110
+ /**
111
+ * Create a new Figma client instance
112
+ */
113
+ export declare function createFigmaClient(config: FigmaClientConfig): FigmaClient;
114
+ /**
115
+ * Get the default Figma client (creates one if needed)
116
+ *
117
+ * Uses FIGMA_ACCESS_TOKEN environment variable if no token provided.
118
+ */
119
+ export declare function getFigmaClient(accessToken?: string): FigmaClient;
120
+ /**
121
+ * Reset the default client (useful for testing)
122
+ */
123
+ export declare function resetFigmaClient(): void;