@su-record/vibe 2.8.0 → 2.8.2

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.
@@ -0,0 +1,35 @@
1
+ /**
2
+ * CLI Commands: vibe figma <subcommand>
3
+ *
4
+ * Figma API integration for design-to-code pipeline.
5
+ * Token is stored in ~/.vibe/config.json credentials.figma
6
+ */
7
+ /**
8
+ * vibe figma setup <token>
9
+ */
10
+ export declare function figmaSetup(token?: string): void;
11
+ /**
12
+ * vibe figma status
13
+ */
14
+ export declare function figmaStatus(): void;
15
+ /**
16
+ * vibe figma logout
17
+ */
18
+ export declare function figmaLogout(): void;
19
+ /**
20
+ * vibe figma extract <url...> [--output <dir>]
21
+ *
22
+ * Single URL: vibe figma extract "url"
23
+ * Multi URL: vibe figma extract "mobile-url" "desktop-url"
24
+ */
25
+ export declare function figmaExtract(urls?: string[], outputDir?: string): Promise<void>;
26
+ /**
27
+ * vibe figma breakpoints [--set key=value]
28
+ * Show or update responsive breakpoint defaults.
29
+ */
30
+ export declare function figmaBreakpoints(setArg?: string): void;
31
+ /**
32
+ * vibe figma help
33
+ */
34
+ export declare function figmaHelp(): void;
35
+ //# sourceMappingURL=figma.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"figma.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/figma.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAqNH;;GAEG;AACH,wBAAgB,UAAU,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAgB/C;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,IAAI,CAoBlC;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,IAAI,CAalC;AA4DD;;;;;GAKG;AACH,wBAAsB,YAAY,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA+ErF;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAgCtD;AAED;;GAEG;AACH,wBAAgB,SAAS,IAAI,IAAI,CAkChC"}
@@ -0,0 +1,426 @@
1
+ /**
2
+ * CLI Commands: vibe figma <subcommand>
3
+ *
4
+ * Figma API integration for design-to-code pipeline.
5
+ * Token is stored in ~/.vibe/config.json credentials.figma
6
+ */
7
+ import * as fs from 'node:fs';
8
+ import * as path from 'node:path';
9
+ import { readGlobalConfig, patchGlobalConfig, } from '../../infra/lib/config/GlobalConfigManager.js';
10
+ const FIGMA_API_BASE = 'https://api.figma.com/v1';
11
+ const DEFAULT_BREAKPOINTS = {
12
+ breakpoint: 1024,
13
+ pcTarget: 1920,
14
+ mobilePortrait: 480,
15
+ mobileMinimum: 360,
16
+ designPc: 2560,
17
+ designMobile: 720,
18
+ };
19
+ function loadFigmaConfig() {
20
+ return readGlobalConfig().credentials?.figma ?? null;
21
+ }
22
+ function loadBreakpoints() {
23
+ const userBp = readGlobalConfig().figma?.breakpoints;
24
+ if (!userBp)
25
+ return DEFAULT_BREAKPOINTS;
26
+ return { ...DEFAULT_BREAKPOINTS, ...userBp };
27
+ }
28
+ function getFigmaToken() {
29
+ const config = loadFigmaConfig();
30
+ return config?.accessToken ?? process.env.FIGMA_ACCESS_TOKEN ?? null;
31
+ }
32
+ /**
33
+ * Parse Figma URL to extract file_key and node_id
34
+ */
35
+ function parseFigmaUrl(url) {
36
+ const fileMatch = url.match(/\/(design|file)\/([a-zA-Z0-9]+)/);
37
+ if (!fileMatch) {
38
+ throw new Error('Invalid Figma URL. Expected: https://www.figma.com/design/<file_key>/...');
39
+ }
40
+ const nodeMatch = url.match(/node-id=([^&]+)/);
41
+ return {
42
+ fileKey: fileMatch[2],
43
+ nodeId: nodeMatch ? decodeURIComponent(nodeMatch[1]) : null,
44
+ };
45
+ }
46
+ /**
47
+ * Figma API fetch helper
48
+ */
49
+ async function figmaFetch(endpoint, token) {
50
+ const res = await fetch(`${FIGMA_API_BASE}${endpoint}`, {
51
+ headers: { 'X-Figma-Token': token },
52
+ });
53
+ if (!res.ok) {
54
+ const body = await res.text();
55
+ throw new Error(`Figma API error ${res.status}: ${body}`);
56
+ }
57
+ return res.json();
58
+ }
59
+ /**
60
+ * Extract layer JSON from Figma file
61
+ */
62
+ async function extractLayers(fileKey, nodeId, token) {
63
+ const canonicalId = nodeId?.replaceAll('-', ':') ?? null;
64
+ const endpoint = canonicalId
65
+ ? `/files/${fileKey}/nodes?ids=${canonicalId}`
66
+ : `/files/${fileKey}`;
67
+ const data = await figmaFetch(endpoint, token);
68
+ if (canonicalId) {
69
+ const nodes = data.nodes;
70
+ return nodes?.[canonicalId] ?? data;
71
+ }
72
+ return data.document ?? data;
73
+ }
74
+ /**
75
+ * Render frame image from Figma
76
+ */
77
+ async function renderImage(fileKey, nodeId, token, outputDir, filename = 'frame.png') {
78
+ if (!nodeId)
79
+ return null;
80
+ const id = nodeId.replaceAll('-', ':');
81
+ const data = await figmaFetch(`/images/${fileKey}?ids=${id}&format=png&scale=2`, token);
82
+ const images = data.images;
83
+ const imageUrl = images?.[id];
84
+ if (!imageUrl)
85
+ return null;
86
+ const imgRes = await fetch(imageUrl);
87
+ if (!imgRes.ok) {
88
+ throw new Error(`Image download failed: ${imgRes.status}`);
89
+ }
90
+ const buffer = Buffer.from(await imgRes.arrayBuffer());
91
+ const imgPath = path.join(outputDir, filename);
92
+ fs.writeFileSync(imgPath, buffer);
93
+ return imgPath;
94
+ }
95
+ /**
96
+ * Collect all imageRef values from Figma layer data recursively.
97
+ */
98
+ function collectImageRefs(node, refs = new Set()) {
99
+ if (!node || typeof node !== 'object')
100
+ return refs;
101
+ const obj = node;
102
+ const fills = obj.fills;
103
+ if (Array.isArray(fills)) {
104
+ for (const fill of fills) {
105
+ if (fill.type === 'IMAGE' && typeof fill.imageRef === 'string') {
106
+ refs.add(fill.imageRef);
107
+ }
108
+ }
109
+ }
110
+ const children = obj.children;
111
+ if (Array.isArray(children)) {
112
+ for (const child of children) {
113
+ collectImageRefs(child, refs);
114
+ }
115
+ }
116
+ return refs;
117
+ }
118
+ /**
119
+ * Download image fills from Figma file and save to assets/ directory.
120
+ */
121
+ async function extractImageFills(fileKey, imageRefs, token, outputDir) {
122
+ if (imageRefs.size === 0)
123
+ return 0;
124
+ const data = await figmaFetch(`/files/${fileKey}/images`, token);
125
+ const meta = data.meta;
126
+ if (!meta)
127
+ return 0;
128
+ const assetsDir = path.join(outputDir, 'assets');
129
+ if (!fs.existsSync(assetsDir)) {
130
+ fs.mkdirSync(assetsDir, { recursive: true });
131
+ }
132
+ let count = 0;
133
+ for (const ref of imageRefs) {
134
+ const imageUrl = meta[ref];
135
+ if (!imageUrl)
136
+ continue;
137
+ try {
138
+ const res = await fetch(imageUrl);
139
+ if (!res.ok)
140
+ continue;
141
+ const contentType = res.headers.get('content-type') ?? '';
142
+ const buffer = Buffer.from(await res.arrayBuffer());
143
+ const ext = contentType.includes('png') ? 'png'
144
+ : contentType.includes('svg') ? 'svg'
145
+ : contentType.includes('webp') ? 'webp'
146
+ : 'jpg';
147
+ const filePath = path.join(assetsDir, `${ref}.${ext}`);
148
+ fs.writeFileSync(filePath, buffer);
149
+ count++;
150
+ }
151
+ catch {
152
+ // Skip failed downloads silently
153
+ }
154
+ }
155
+ return count;
156
+ }
157
+ /**
158
+ * Detect viewport class from Figma layer data.
159
+ * Uses the root frame's absoluteBoundingBox width and project breakpoints.
160
+ */
161
+ function detectViewport(layers) {
162
+ const node = layers;
163
+ const doc = (node.document ?? node);
164
+ const bbox = doc.absoluteBoundingBox;
165
+ const width = bbox?.width ?? 0;
166
+ const bp = loadBreakpoints();
167
+ if (width > 0 && width <= bp.mobilePortrait)
168
+ return { width, label: 'mobile' };
169
+ if (width > bp.mobilePortrait && width <= bp.breakpoint)
170
+ return { width, label: 'tablet' };
171
+ if (width > bp.breakpoint)
172
+ return { width, label: 'desktop' };
173
+ return { width, label: 'unknown' };
174
+ }
175
+ /**
176
+ * vibe figma setup <token>
177
+ */
178
+ export function figmaSetup(token) {
179
+ if (!token) {
180
+ console.log('Usage: vibe figma setup <access-token>');
181
+ console.log(' Get a token from: Figma > Settings > Personal access tokens');
182
+ return;
183
+ }
184
+ patchGlobalConfig({
185
+ credentials: {
186
+ figma: {
187
+ accessToken: token,
188
+ createdAt: new Date().toISOString(),
189
+ },
190
+ },
191
+ });
192
+ console.log('Figma access token saved');
193
+ }
194
+ /**
195
+ * vibe figma status
196
+ */
197
+ export function figmaStatus() {
198
+ const config = loadFigmaConfig();
199
+ const envToken = process.env.FIGMA_ACCESS_TOKEN;
200
+ if (!config?.accessToken && !envToken) {
201
+ console.log('Figma: not configured');
202
+ console.log(' Run: vibe figma setup <access-token>');
203
+ return;
204
+ }
205
+ if (config?.accessToken) {
206
+ const token = config.accessToken;
207
+ const preview = token.slice(0, 8) + '...' + token.slice(-4);
208
+ console.log(`Figma: configured (${preview})`);
209
+ if (config.createdAt) {
210
+ console.log(` Added: ${config.createdAt}`);
211
+ }
212
+ }
213
+ else if (envToken) {
214
+ console.log('Figma: configured (via FIGMA_ACCESS_TOKEN env)');
215
+ }
216
+ }
217
+ /**
218
+ * vibe figma logout
219
+ */
220
+ export function figmaLogout() {
221
+ const config = loadFigmaConfig();
222
+ if (!config?.accessToken) {
223
+ console.log('Figma: not configured');
224
+ return;
225
+ }
226
+ patchGlobalConfig({
227
+ credentials: {
228
+ figma: { accessToken: undefined, createdAt: undefined },
229
+ },
230
+ });
231
+ console.log('Figma access token removed');
232
+ }
233
+ /**
234
+ * Extract a single Figma URL into the given directory.
235
+ * Returns the detected viewport info.
236
+ */
237
+ async function extractSingle(url, token, outputDir, prefix = '') {
238
+ const { fileKey, nodeId } = parseFigmaUrl(url);
239
+ console.log(`File key: ${fileKey}, Node ID: ${nodeId ?? 'entire file'}`);
240
+ if (!fs.existsSync(outputDir)) {
241
+ fs.mkdirSync(outputDir, { recursive: true });
242
+ }
243
+ console.log('Extracting layer data...');
244
+ const layers = await extractLayers(fileKey, nodeId, token);
245
+ const layersFile = prefix ? `layers.${prefix}.json` : 'layers.json';
246
+ const layersPath = path.join(outputDir, layersFile);
247
+ fs.writeFileSync(layersPath, JSON.stringify(layers, null, 2));
248
+ console.log(`Layers saved: ${layersPath}`);
249
+ const viewport = detectViewport(layers);
250
+ if (nodeId) {
251
+ console.log('Rendering frame image...');
252
+ const imgFile = prefix ? `frame.${prefix}.png` : 'frame.png';
253
+ const imgPath = await renderImage(fileKey, nodeId, token, outputDir, imgFile);
254
+ if (imgPath) {
255
+ console.log(`Image saved: ${imgPath}`);
256
+ }
257
+ else {
258
+ console.log('Image rendering skipped (no image URL returned)');
259
+ }
260
+ }
261
+ else {
262
+ console.log('Image rendering skipped (specify node-id for frame image)');
263
+ }
264
+ // Extract image fills (background images, content images, etc.)
265
+ const imageRefs = collectImageRefs(layers);
266
+ if (imageRefs.size > 0) {
267
+ console.log(`Extracting ${imageRefs.size} image fill(s)...`);
268
+ const downloaded = await extractImageFills(fileKey, imageRefs, token, outputDir);
269
+ console.log(`Image assets saved: ${downloaded}/${imageRefs.size} → ${outputDir}/assets/`);
270
+ }
271
+ return { viewport };
272
+ }
273
+ /**
274
+ * vibe figma extract <url...> [--output <dir>]
275
+ *
276
+ * Single URL: vibe figma extract "url"
277
+ * Multi URL: vibe figma extract "mobile-url" "desktop-url"
278
+ */
279
+ export async function figmaExtract(urls, outputDir) {
280
+ if (!urls || urls.length === 0) {
281
+ console.log('Usage: vibe figma extract <figma-url> [figma-url...] [--output <dir>]');
282
+ console.log(' Single: vibe figma extract "url"');
283
+ console.log(' Multi: vibe figma extract "mobile-url" "desktop-url"');
284
+ return;
285
+ }
286
+ const token = getFigmaToken();
287
+ if (!token) {
288
+ console.error('Figma token not configured.');
289
+ console.error(' Run: vibe figma setup <access-token>');
290
+ console.error(' Or set FIGMA_ACCESS_TOKEN environment variable');
291
+ process.exit(1);
292
+ return;
293
+ }
294
+ const resolvedOutput = outputDir ?? path.join(process.cwd(), 'figma-output');
295
+ try {
296
+ if (urls.length === 1) {
297
+ // Single URL — backward compatible
298
+ const { viewport } = await extractSingle(urls[0], token, resolvedOutput);
299
+ console.log(`Viewport detected: ${viewport.label} (${viewport.width}px)`);
300
+ console.log(`\nDone! Output: ${resolvedOutput}`);
301
+ console.log('Next: Run /vibe.figma in Claude Code to generate components');
302
+ return;
303
+ }
304
+ // Multiple URLs — responsive mode
305
+ console.log(`Extracting ${urls.length} designs for responsive mode...\n`);
306
+ const viewports = [];
307
+ for (let i = 0; i < urls.length; i++) {
308
+ const tag = String(i + 1);
309
+ console.log(`--- Design ${tag} ---`);
310
+ const { viewport } = await extractSingle(urls[i], token, resolvedOutput, tag);
311
+ viewports.push({
312
+ url: urls[i],
313
+ label: viewport.label,
314
+ width: viewport.width,
315
+ layersFile: `layers.${tag}.json`,
316
+ frameFile: `frame.${tag}.png`,
317
+ });
318
+ console.log(`Viewport: ${viewport.label} (${viewport.width}px)\n`);
319
+ }
320
+ // Sort by width ascending and assign canonical labels
321
+ viewports.sort((a, b) => a.width - b.width);
322
+ // Write responsive manifest with project breakpoints
323
+ const bp = loadBreakpoints();
324
+ const manifest = {
325
+ responsive: true,
326
+ breakpoints: bp,
327
+ viewports: viewports.map((v) => ({
328
+ label: v.label,
329
+ width: v.width,
330
+ layersFile: v.layersFile,
331
+ frameFile: v.frameFile,
332
+ url: v.url,
333
+ })),
334
+ extractedAt: new Date().toISOString(),
335
+ };
336
+ const manifestPath = path.join(resolvedOutput, 'responsive.json');
337
+ fs.writeFileSync(manifestPath, JSON.stringify(manifest, null, 2));
338
+ console.log('Responsive manifest saved: responsive.json');
339
+ console.log('Viewports:');
340
+ for (const v of viewports) {
341
+ console.log(` ${v.label} (${v.width}px) → ${v.layersFile}, ${v.frameFile}`);
342
+ }
343
+ console.log(`\nDone! Output: ${resolvedOutput}`);
344
+ console.log('Next: Run /vibe.figma in Claude Code to generate responsive components');
345
+ }
346
+ catch (err) {
347
+ const message = err instanceof Error ? err.message : String(err);
348
+ console.error(`Extract failed: ${message}`);
349
+ process.exit(1);
350
+ }
351
+ }
352
+ /**
353
+ * vibe figma breakpoints [--set key=value]
354
+ * Show or update responsive breakpoint defaults.
355
+ */
356
+ export function figmaBreakpoints(setArg) {
357
+ if (setArg) {
358
+ const [key, val] = setArg.split('=');
359
+ const num = Number(val);
360
+ if (!key || Number.isNaN(num)) {
361
+ console.error('Usage: vibe figma breakpoints --set <key>=<value>');
362
+ console.error(' Keys: breakpoint, pcTarget, mobilePortrait, mobileMinimum, designPc, designMobile');
363
+ return;
364
+ }
365
+ const validKeys = Object.keys(DEFAULT_BREAKPOINTS);
366
+ if (!validKeys.includes(key)) {
367
+ console.error(`Unknown key: ${key}. Valid keys: ${validKeys.join(', ')}`);
368
+ return;
369
+ }
370
+ patchGlobalConfig({
371
+ figma: { breakpoints: { [key]: num } },
372
+ });
373
+ console.log(`Breakpoint updated: ${key} = ${num}px`);
374
+ }
375
+ const bp = loadBreakpoints();
376
+ const isCustom = readGlobalConfig().figma?.breakpoints;
377
+ console.log(`Figma Breakpoints${isCustom ? ' (customized)' : ' (defaults)'}:`);
378
+ console.log(` breakpoint: ${bp.breakpoint}px (PC↔Mobile boundary)`);
379
+ console.log(` pcTarget: ${bp.pcTarget}px (PC main target)`);
380
+ console.log(` mobilePortrait: ${bp.mobilePortrait}px (Mobile portrait max)`);
381
+ console.log(` mobileMinimum: ${bp.mobileMinimum}px (Mobile minimum)`);
382
+ console.log(` designPc: ${bp.designPc}px (Figma PC artboard)`);
383
+ console.log(` designMobile: ${bp.designMobile}px (Figma Mobile artboard)`);
384
+ if (!isCustom) {
385
+ console.log('\n Customize: vibe figma breakpoints --set breakpoint=768');
386
+ }
387
+ }
388
+ /**
389
+ * vibe figma help
390
+ */
391
+ export function figmaHelp() {
392
+ console.log(`
393
+ Figma Commands:
394
+ vibe figma setup <token> Set Figma access token
395
+ vibe figma extract <url> [url...] Extract layers + image from Figma URL(s)
396
+ vibe figma breakpoints Show current breakpoint defaults
397
+ vibe figma breakpoints --set key=value Customize a breakpoint value
398
+ vibe figma status Show configuration
399
+ vibe figma logout Remove access token
400
+ vibe figma help Show this help
401
+
402
+ Extract options:
403
+ --output <dir> Output directory (default: ./figma-output)
404
+
405
+ Breakpoint keys:
406
+ breakpoint PC↔Mobile boundary (default: 1024px)
407
+ pcTarget PC main target resolution (default: 1920px)
408
+ mobilePortrait Mobile portrait max width (default: 480px)
409
+ mobileMinimum Mobile minimum width (default: 360px)
410
+ designPc Figma PC artboard width (default: 2560px)
411
+ designMobile Figma Mobile artboard width (default: 720px)
412
+
413
+ Workflow (single design):
414
+ 1. vibe figma setup <token>
415
+ 2. vibe figma extract "https://www.figma.com/design/ABC/Project?node-id=1-2"
416
+ 3. claude /vibe.figma
417
+
418
+ Workflow (responsive — mobile + desktop):
419
+ 1. vibe figma setup <token>
420
+ 2. vibe figma extract "mobile-url" "desktop-url"
421
+ 3. claude /vibe.figma
422
+
423
+ Get a token from: Figma > Settings > Personal access tokens
424
+ `);
425
+ }
426
+ //# sourceMappingURL=figma.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"figma.js","sourceRoot":"","sources":["../../../src/cli/commands/figma.ts"],"names":[],"mappings":"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"}
@@ -10,4 +10,5 @@ export { showHelp, showStatus, showVersion } from './info.js';
10
10
  export { telegramSetup, telegramChat, telegramStatus, telegramHelp } from './telegram.js';
11
11
  export { slackSetup, slackChannel, slackStatus, slackHelp } from './slack.js';
12
12
  export { skillsAdd, installExternalSkills } from './skills.js';
13
+ export { figmaSetup, figmaExtract, figmaStatus, figmaLogout, figmaBreakpoints, figmaHelp } from './figma.js';
13
14
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,IAAI,EAAE,wBAAwB,EAAE,MAAM,WAAW,CAAC;AAC3D,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC1F,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC9E,OAAO,EAAE,SAAS,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,IAAI,EAAE,wBAAwB,EAAE,MAAM,WAAW,CAAC;AAC3D,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC1F,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC9E,OAAO,EAAE,SAAS,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC"}
@@ -10,4 +10,5 @@ export { showHelp, showStatus, showVersion } from './info.js';
10
10
  export { telegramSetup, telegramChat, telegramStatus, telegramHelp } from './telegram.js';
11
11
  export { slackSetup, slackChannel, slackStatus, slackHelp } from './slack.js';
12
12
  export { skillsAdd, installExternalSkills } from './skills.js';
13
+ export { figmaSetup, figmaExtract, figmaStatus, figmaLogout, figmaBreakpoints, figmaHelp } from './figma.js';
13
14
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cli/commands/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,IAAI,EAAE,wBAAwB,EAAE,MAAM,WAAW,CAAC;AAC3D,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC1F,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC9E,OAAO,EAAE,SAAS,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cli/commands/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,IAAI,EAAE,wBAAwB,EAAE,MAAM,WAAW,CAAC;AAC3D,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC1F,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC9E,OAAO,EAAE,SAAS,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"info.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/info.ts"],"names":[],"mappings":"AAAA;;GAEG;AASH;;GAEG;AACH,wBAAgB,QAAQ,IAAI,IAAI,CAqC/B;AAED;;GAEG;AACH,wBAAgB,UAAU,IAAI,IAAI,CAsCjC;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,IAAI,CAGlC"}
1
+ {"version":3,"file":"info.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/info.ts"],"names":[],"mappings":"AAAA;;GAEG;AASH;;GAEG;AACH,wBAAgB,QAAQ,IAAI,IAAI,CA2C/B;AAED;;GAEG;AACH,wBAAgB,UAAU,IAAI,IAAI,CAsCjC;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,IAAI,CAGlC"}
@@ -27,6 +27,11 @@ LLM:
27
27
  vibe gemini <cmd> Gemini (auth, key, status, logout)
28
28
  vibe env import [path] .env → ~/.vibe/config.json 가져오기
29
29
 
30
+ Figma:
31
+ vibe figma setup <token> Set Figma access token
32
+ vibe figma extract <url> Extract layers + image from Figma URL
33
+ vibe figma status Check configuration
34
+
30
35
  Skills:
31
36
  vibe skills add <pkg> Install skill from skills.sh
32
37
 
@@ -43,6 +48,7 @@ Slash Commands (Claude Code):
43
48
  /vibe.analyze 프로젝트 분석
44
49
  /vibe.trace "feature" 요구사항 추적 매트릭스
45
50
  /vibe.utils 유틸리티 (--e2e, --diagram, --continue)
51
+ /vibe.figma Figma 디자인 → 코드 변환
46
52
 
47
53
  Docs: https://github.com/su-record/vibe
48
54
  `);
@@ -1 +1 @@
1
- {"version":3,"file":"info.js","sourceRoot":"","sources":["../../../src/cli/commands/info.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,CAAC;AAEpB,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAE3E;;GAEG;AACH,MAAM,UAAU,QAAQ;IACtB,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCX,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU;IACxB,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAClC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;IAC1D,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;IAErD,MAAM,WAAW,GAAG,cAAc,EAAE,CAAC;IACrC,MAAM,aAAa,GAAG,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IAE7C,IAAI,MAAM,GAAyC,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;IAClF,IAAI,aAAa,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/C,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;IAC5D,CAAC;IAED,MAAM,UAAU,GAAG,gBAAgB,EAAE,CAAC;IAEtC,MAAM,QAAQ,GAAG,cAAc,EAAE,CAAC;IAClC,MAAM,SAAS,GAAG,eAAe,EAAE,CAAC;IAEpC,MAAM,gBAAgB,GAAG,iBAAiB,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;IAC9D,MAAM,aAAa,GAAG,iBAAiB,CAAC,UAAU,CAAC,GAAG,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC;IAC5E,MAAM,gBAAgB,GAAG,iBAAiB,CAAC,UAAU,CAAC,MAAM,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAEnF,UAAU;IACV,MAAM,aAAa,GAAG,aAAa;QACjC,CAAC,CAAC,KAAK,WAAW,EAAE;QACpB,CAAC,CAAC,uCAAuC,CAAC;IAE5C,OAAO,CAAC,GAAG,CAAC;gBACE,WAAW,CAAC,OAAO;;WAExB,aAAa;EACtB,aAAa,CAAC,CAAC,CAAC,aAAa,MAAM,CAAC,QAAQ,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE;;;oBAGzC,gBAAgB;oBAChB,aAAa;oBACb,gBAAgB;GACjC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW;IACzB,MAAM,WAAW,GAAG,cAAc,EAAE,CAAC;IACrC,OAAO,CAAC,GAAG,CAAC,SAAS,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC;AAC9C,CAAC"}
1
+ {"version":3,"file":"info.js","sourceRoot":"","sources":["../../../src/cli/commands/info.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,CAAC;AAEpB,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAE3E;;GAEG;AACH,MAAM,UAAU,QAAQ;IACtB,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCX,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU;IACxB,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAClC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;IAC1D,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;IAErD,MAAM,WAAW,GAAG,cAAc,EAAE,CAAC;IACrC,MAAM,aAAa,GAAG,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IAE7C,IAAI,MAAM,GAAyC,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;IAClF,IAAI,aAAa,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/C,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;IAC5D,CAAC;IAED,MAAM,UAAU,GAAG,gBAAgB,EAAE,CAAC;IAEtC,MAAM,QAAQ,GAAG,cAAc,EAAE,CAAC;IAClC,MAAM,SAAS,GAAG,eAAe,EAAE,CAAC;IAEpC,MAAM,gBAAgB,GAAG,iBAAiB,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;IAC9D,MAAM,aAAa,GAAG,iBAAiB,CAAC,UAAU,CAAC,GAAG,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC;IAC5E,MAAM,gBAAgB,GAAG,iBAAiB,CAAC,UAAU,CAAC,MAAM,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAEnF,UAAU;IACV,MAAM,aAAa,GAAG,aAAa;QACjC,CAAC,CAAC,KAAK,WAAW,EAAE;QACpB,CAAC,CAAC,uCAAuC,CAAC;IAE5C,OAAO,CAAC,GAAG,CAAC;gBACE,WAAW,CAAC,OAAO;;WAExB,aAAa;EACtB,aAAa,CAAC,CAAC,CAAC,aAAa,MAAM,CAAC,QAAQ,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE;;;oBAGzC,gBAAgB;oBAChB,aAAa;oBACb,gBAAgB;GACjC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW;IACzB,MAAM,WAAW,GAAG,cAAc,EAAE,CAAC;IACrC,OAAO,CAAC,GAAG,CAAC,SAAS,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC;AAC9C,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AAEA;;GAEG;AAgDH,cAAc,+BAA+B,CAAC;AAC9C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,mCAAmC,CAAC;AAClD,OAAO,EACL,SAAS,EACT,aAAa,EACb,eAAe,EACf,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,gBAAgB,EAChB,mBAAmB,EACnB,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,kCAAkC,CAAC;AAE1C,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,EAAE,qBAAqB,IAAI,cAAc,EAAE,MAAM,mCAAmC,CAAC;AAC5F,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,yCAAyC,CAAC;AAC/E,OAAO,EAAE,sBAAsB,EAAE,MAAM,2CAA2C,CAAC;AACnF,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,oCAAoC,CAAC;AACrE,OAAO,EAAE,qBAAqB,EAAE,MAAM,0CAA0C,CAAC;AACjF,OAAO,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AACvE,OAAO,EAAE,iBAAiB,EAAE,MAAM,sCAAsC,CAAC;AAEzE,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAC;AACrE,OAAO,EAAE,sBAAsB,EAAE,MAAM,6CAA6C,CAAC;AAErF,OAAO,EAAE,iBAAiB,EAAE,MAAM,0CAA0C,CAAC;AAC7E,OAAO,EAAE,mBAAmB,EAAE,MAAM,4CAA4C,CAAC;AACjF,OAAO,EAAE,qBAAqB,EAAE,MAAM,8CAA8C,CAAC;AACrF,OAAO,EAAE,mBAAmB,EAAE,MAAM,4CAA4C,CAAC;AACjF,OAAO,EAAE,iBAAiB,EAAE,MAAM,0CAA0C,CAAC;AAE7E,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AAEA;;GAEG;AAiDH,cAAc,+BAA+B,CAAC;AAC9C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,mCAAmC,CAAC;AAClD,OAAO,EACL,SAAS,EACT,aAAa,EACb,eAAe,EACf,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,gBAAgB,EAChB,mBAAmB,EACnB,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,kCAAkC,CAAC;AAE1C,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,EAAE,qBAAqB,IAAI,cAAc,EAAE,MAAM,mCAAmC,CAAC;AAC5F,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,yCAAyC,CAAC;AAC/E,OAAO,EAAE,sBAAsB,EAAE,MAAM,2CAA2C,CAAC;AACnF,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,oCAAoC,CAAC;AACrE,OAAO,EAAE,qBAAqB,EAAE,MAAM,0CAA0C,CAAC;AACjF,OAAO,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AACvE,OAAO,EAAE,iBAAiB,EAAE,MAAM,sCAAsC,CAAC;AAEzE,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAC;AACrE,OAAO,EAAE,sBAAsB,EAAE,MAAM,6CAA6C,CAAC;AAErF,OAAO,EAAE,iBAAiB,EAAE,MAAM,0CAA0C,CAAC;AAC7E,OAAO,EAAE,mBAAmB,EAAE,MAAM,4CAA4C,CAAC;AACjF,OAAO,EAAE,qBAAqB,EAAE,MAAM,8CAA8C,CAAC;AACrF,OAAO,EAAE,mBAAmB,EAAE,MAAM,4CAA4C,CAAC;AACjF,OAAO,EAAE,iBAAiB,EAAE,MAAM,0CAA0C,CAAC;AAE7E,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC"}
package/dist/cli/index.js CHANGED
@@ -7,7 +7,7 @@ import path from 'path';
7
7
  import { setSilentMode } from './utils.js';
8
8
  import { setupExternalLLM, removeExternalLLM, gptStatus, gptLogout, geminiAuth, geminiStatus, geminiLogout, claudeStatus, claudeLogout, } from './llm.js';
9
9
  import { patchGlobalConfig, getVibeDir } from '../infra/lib/config/GlobalConfigManager.js';
10
- import { init, setup, update, upgrade, remove, showHelp, showStatus, showVersion, telegramSetup, telegramChat, telegramStatus, telegramHelp, slackSetup, slackChannel, slackStatus, slackHelp, skillsAdd, } from './commands/index.js';
10
+ import { init, setup, update, upgrade, remove, showHelp, showStatus, showVersion, telegramSetup, telegramChat, telegramStatus, telegramHelp, slackSetup, slackChannel, slackStatus, slackHelp, skillsAdd, figmaSetup, figmaExtract, figmaStatus, figmaLogout, figmaBreakpoints, figmaHelp, } from './commands/index.js';
11
11
  // ============================================================================
12
12
  // Constants
13
13
  // ============================================================================
@@ -244,6 +244,42 @@ Example: vibe skills add vercel-labs/skills
244
244
  }
245
245
  break;
246
246
  }
247
+ // vibe figma <subcommand>
248
+ case 'figma': {
249
+ const figmaSub = positionalArgs[1];
250
+ switch (figmaSub) {
251
+ case 'setup':
252
+ figmaSetup(positionalArgs[2]);
253
+ break;
254
+ case 'extract':
255
+ (async () => {
256
+ const outputFlag = args.indexOf('--output');
257
+ const outputDir = outputFlag >= 0 ? args[outputFlag + 1] : undefined;
258
+ // Collect all URL args (positionalArgs[2..N], excluding --output and its value)
259
+ const extractUrls = positionalArgs.slice(2).filter((a) => a !== '--output' && a !== outputDir);
260
+ await figmaExtract(extractUrls.length > 0 ? extractUrls : undefined, outputDir);
261
+ })();
262
+ break;
263
+ case 'breakpoints': {
264
+ const setFlag = args.indexOf('--set');
265
+ figmaBreakpoints(setFlag >= 0 ? args[setFlag + 1] : undefined);
266
+ break;
267
+ }
268
+ case 'status':
269
+ figmaStatus();
270
+ break;
271
+ case 'logout':
272
+ case 'remove':
273
+ figmaLogout();
274
+ break;
275
+ case 'help':
276
+ figmaHelp();
277
+ break;
278
+ default:
279
+ figmaHelp();
280
+ }
281
+ break;
282
+ }
247
283
  // vibe env import [path]
248
284
  case 'env': {
249
285
  const envSub = positionalArgs[1];
@@ -255,6 +291,7 @@ Example: vibe skills add vercel-labs/skills
255
291
  }
256
292
  const envContent = fs.readFileSync(envSource, 'utf-8');
257
293
  const ENV_TO_CONFIG = {
294
+ FIGMA_ACCESS_TOKEN: (v, p) => { (p.credentials ??= {}).figma = { ...(p.credentials.figma ?? {}), accessToken: v }; },
258
295
  OPENAI_API_KEY: (v, p) => { (p.credentials ??= {}).gpt = { ...(p.credentials.gpt ?? {}), apiKey: v }; },
259
296
  GEMINI_API_KEY: (v, p) => { (p.credentials ??= {}).gemini = { ...(p.credentials.gemini ?? {}), apiKey: v }; },
260
297
  TELEGRAM_BOT_TOKEN: (v, p) => { (p.channels ??= {}).telegram = { ...(p.channels.telegram ?? {}), botToken: v }; },
@@ -348,6 +385,7 @@ Available commands:
348
385
  vibe gpt <cmd> GPT (auth, key, status, logout)
349
386
  vibe gemini <cmd> Gemini (auth, key, status, logout)
350
387
 
388
+ vibe figma <cmd> Figma (setup, extract, status, logout)
351
389
  vibe telegram <cmd> Telegram (setup, status) - notification only
352
390
  vibe slack <cmd> Slack (setup, status) - notification only
353
391