@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.
- package/README.md +320 -322
- package/commands/vibe.figma.md +1520 -0
- package/dist/cli/commands/figma.d.ts +35 -0
- package/dist/cli/commands/figma.d.ts.map +1 -0
- package/dist/cli/commands/figma.js +426 -0
- package/dist/cli/commands/figma.js.map +1 -0
- package/dist/cli/commands/index.d.ts +1 -0
- package/dist/cli/commands/index.d.ts.map +1 -1
- package/dist/cli/commands/index.js +1 -0
- package/dist/cli/commands/index.js.map +1 -1
- package/dist/cli/commands/info.d.ts.map +1 -1
- package/dist/cli/commands/info.js +6 -0
- package/dist/cli/commands/info.js.map +1 -1
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +39 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/types.d.ts +22 -0
- package/dist/cli/types.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -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":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EACL,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,+CAA+C,CAAC;AAGvD,MAAM,cAAc,GAAG,0BAA0B,CAAC;AAElD,MAAM,mBAAmB,GAAqB;IAC5C,UAAU,EAAE,IAAI;IAChB,QAAQ,EAAE,IAAI;IACd,cAAc,EAAE,GAAG;IACnB,aAAa,EAAE,GAAG;IAClB,QAAQ,EAAE,IAAI;IACd,YAAY,EAAE,GAAG;CAClB,CAAC;AAEF,SAAS,eAAe;IACtB,OAAO,gBAAgB,EAAE,CAAC,WAAW,EAAE,KAAK,IAAI,IAAI,CAAC;AACvD,CAAC;AAED,SAAS,eAAe;IACtB,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAC,KAAK,EAAE,WAAW,CAAC;IACrD,IAAI,CAAC,MAAM;QAAE,OAAO,mBAAmB,CAAC;IACxC,OAAO,EAAE,GAAG,mBAAmB,EAAE,GAAG,MAAM,EAAE,CAAC;AAC/C,CAAC;AAED,SAAS,aAAa;IACpB,MAAM,MAAM,GAAG,eAAe,EAAE,CAAC;IACjC,OAAO,MAAM,EAAE,WAAW,IAAI,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,IAAI,CAAC;AACvE,CAAC;AAED;;GAEG;AACH,SAAS,aAAa,CAAC,GAAW;IAChC,MAAM,SAAS,GAAG,GAAG,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC;IAC/D,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,0EAA0E,CAAC,CAAC;IAC9F,CAAC;IAED,MAAM,SAAS,GAAG,GAAG,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;IAC/C,OAAO;QACL,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC;QACrB,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI;KAC5D,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,UAAU,CAAC,QAAgB,EAAE,KAAa;IACvD,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,cAAc,GAAG,QAAQ,EAAE,EAAE;QACtD,OAAO,EAAE,EAAE,eAAe,EAAE,KAAK,EAAE;KACpC,CAAC,CAAC;IACH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,mBAAmB,GAAG,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC,CAAC;IAC5D,CAAC;IACD,OAAO,GAAG,CAAC,IAAI,EAAE,CAAC;AACpB,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,aAAa,CAC1B,OAAe,EACf,MAAqB,EACrB,KAAa;IAEb,MAAM,WAAW,GAAG,MAAM,EAAE,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,IAAI,CAAC;IACzD,MAAM,QAAQ,GAAG,WAAW;QAC1B,CAAC,CAAC,UAAU,OAAO,cAAc,WAAW,EAAE;QAC9C,CAAC,CAAC,UAAU,OAAO,EAAE,CAAC;IAExB,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,QAAQ,EAAE,KAAK,CAA4B,CAAC;IAE1E,IAAI,WAAW,EAAE,CAAC;QAChB,MAAM,KAAK,GAAG,IAAI,CAAC,KAA4C,CAAC;QAChE,OAAO,KAAK,EAAE,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC;IACtC,CAAC;IACD,OAAQ,IAAgC,CAAC,QAAQ,IAAI,IAAI,CAAC;AAC5D,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,WAAW,CACxB,OAAe,EACf,MAAqB,EACrB,KAAa,EACb,SAAiB,EACjB,WAAmB,WAAW;IAE9B,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IAEzB,MAAM,EAAE,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IACvC,MAAM,IAAI,GAAG,MAAM,UAAU,CAC3B,WAAW,OAAO,QAAQ,EAAE,qBAAqB,EACjD,KAAK,CACqB,CAAC;IAE7B,MAAM,MAAM,GAAG,IAAI,CAAC,MAA4C,CAAC;IACjE,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;IAC9B,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IAE3B,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,CAAC;IACrC,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,0BAA0B,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IAC7D,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;IACvD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAC/C,EAAE,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAElC,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,SAAS,gBAAgB,CAAC,IAAa,EAAE,OAAoB,IAAI,GAAG,EAAU;IAC5E,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IACnD,MAAM,GAAG,GAAG,IAA+B,CAAC;IAE5C,MAAM,KAAK,GAAG,GAAG,CAAC,KAAmD,CAAC;IACtE,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,IAAI,OAAO,IAAI,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;gBAC/D,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC1B,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAiC,CAAC;IACvD,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC5B,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;YAC7B,gBAAgB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,iBAAiB,CAC9B,OAAe,EACf,SAAsB,EACtB,KAAa,EACb,SAAiB;IAEjB,IAAI,SAAS,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IAEnC,MAAM,IAAI,GAAG,MAAM,UAAU,CAC3B,UAAU,OAAO,SAAS,EAC1B,KAAK,CACqB,CAAC;IAE7B,MAAM,IAAI,GAAG,IAAI,CAAC,IAA0C,CAAC;IAC7D,IAAI,CAAC,IAAI;QAAE,OAAO,CAAC,CAAC;IAEpB,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IACjD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9B,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/C,CAAC;IAED,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;QAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;QAC3B,IAAI,CAAC,QAAQ;YAAE,SAAS;QAExB,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,CAAC;YAClC,IAAI,CAAC,GAAG,CAAC,EAAE;gBAAE,SAAS;YAEtB,MAAM,WAAW,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;YAC1D,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;YACpD,MAAM,GAAG,GAAG,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK;gBAC7C,CAAC,CAAC,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK;oBACrC,CAAC,CAAC,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM;wBACvC,CAAC,CAAC,KAAK,CAAC;YACV,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,GAAG,IAAI,GAAG,EAAE,CAAC,CAAC;YACvD,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YACnC,KAAK,EAAE,CAAC;QACV,CAAC;QAAC,MAAM,CAAC;YACP,iCAAiC;QACnC,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;GAGG;AACH,SAAS,cAAc,CAAC,MAAe;IACrC,MAAM,IAAI,GAAG,MAAiC,CAAC;IAC/C,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAA4B,CAAC;IAC/D,MAAM,IAAI,GAAG,GAAG,CAAC,mBAAqD,CAAC;IACvE,MAAM,KAAK,GAAG,IAAI,EAAE,KAAK,IAAI,CAAC,CAAC;IAC/B,MAAM,EAAE,GAAG,eAAe,EAAE,CAAC;IAE7B,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC,cAAc;QAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;IAC/E,IAAI,KAAK,GAAG,EAAE,CAAC,cAAc,IAAI,KAAK,IAAI,EAAE,CAAC,UAAU;QAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;IAC3F,IAAI,KAAK,GAAG,EAAE,CAAC,UAAU;QAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;IAC9D,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;AACrC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,KAAc;IACvC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;QACtD,OAAO,CAAC,GAAG,CAAC,+DAA+D,CAAC,CAAC;QAC7E,OAAO;IACT,CAAC;IAED,iBAAiB,CAAC;QAChB,WAAW,EAAE;YACX,KAAK,EAAE;gBACL,WAAW,EAAE,KAAK;gBAClB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACpC;SACF;KACF,CAAC,CAAC;IACH,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;AAC1C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW;IACzB,MAAM,MAAM,GAAG,eAAe,EAAE,CAAC;IACjC,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;IAEhD,IAAI,CAAC,MAAM,EAAE,WAAW,IAAI,CAAC,QAAQ,EAAE,CAAC;QACtC,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;QACrC,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;QACtD,OAAO;IACT,CAAC;IAED,IAAI,MAAM,EAAE,WAAW,EAAE,CAAC;QACxB,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC;QACjC,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5D,OAAO,CAAC,GAAG,CAAC,sBAAsB,OAAO,GAAG,CAAC,CAAC;QAC9C,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;YACrB,OAAO,CAAC,GAAG,CAAC,YAAY,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC;SAAM,IAAI,QAAQ,EAAE,CAAC;QACpB,OAAO,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAC;IAChE,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW;IACzB,MAAM,MAAM,GAAG,eAAe,EAAE,CAAC;IACjC,IAAI,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;QACrC,OAAO;IACT,CAAC;IAED,iBAAiB,CAAC;QAChB,WAAW,EAAE;YACX,KAAK,EAAE,EAAE,WAAW,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE;SACxD;KACF,CAAC,CAAC;IACH,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;AAC5C,CAAC;AAED;;;GAGG;AACH,KAAK,UAAU,aAAa,CAC1B,GAAW,EACX,KAAa,EACb,SAAiB,EACjB,SAAiB,EAAE;IAEnB,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;IAC/C,OAAO,CAAC,GAAG,CAAC,aAAa,OAAO,cAAc,MAAM,IAAI,aAAa,EAAE,CAAC,CAAC;IAEzE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9B,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/C,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;IACxC,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;IAC3D,MAAM,UAAU,GAAG,MAAM,CAAC,CAAC,CAAC,UAAU,MAAM,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC;IACpE,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;IACpD,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC9D,OAAO,CAAC,GAAG,CAAC,iBAAiB,UAAU,EAAE,CAAC,CAAC;IAE3C,MAAM,QAAQ,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;IAExC,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;QACxC,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,SAAS,MAAM,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC;QAC7D,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;QAC9E,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,CAAC,GAAG,CAAC,gBAAgB,OAAO,EAAE,CAAC,CAAC;QACzC,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC;QACjE,CAAC;IACH,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,2DAA2D,CAAC,CAAC;IAC3E,CAAC;IAED,gEAAgE;IAChE,MAAM,SAAS,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAC3C,IAAI,SAAS,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,cAAc,SAAS,CAAC,IAAI,mBAAmB,CAAC,CAAC;QAC7D,MAAM,UAAU,GAAG,MAAM,iBAAiB,CAAC,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;QACjF,OAAO,CAAC,GAAG,CAAC,uBAAuB,UAAU,IAAI,SAAS,CAAC,IAAI,MAAM,SAAS,UAAU,CAAC,CAAC;IAC5F,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,CAAC;AACtB,CAAC;AAUD;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAe,EAAE,SAAkB;IACpE,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/B,OAAO,CAAC,GAAG,CAAC,uEAAuE,CAAC,CAAC;QACrF,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;QACnD,OAAO,CAAC,GAAG,CAAC,0DAA0D,CAAC,CAAC;QACxE,OAAO;IACT,CAAC;IAED,MAAM,KAAK,GAAG,aAAa,EAAE,CAAC;IAC9B,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;QAC7C,OAAO,CAAC,KAAK,CAAC,wCAAwC,CAAC,CAAC;QACxD,OAAO,CAAC,KAAK,CAAC,kDAAkD,CAAC,CAAC;QAClE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChB,OAAO;IACT,CAAC;IAED,MAAM,cAAc,GAAG,SAAS,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,cAAc,CAAC,CAAC;IAE7E,IAAI,CAAC;QACH,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,mCAAmC;YACnC,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,cAAc,CAAC,CAAC;YACzE,OAAO,CAAC,GAAG,CAAC,sBAAsB,QAAQ,CAAC,KAAK,KAAK,QAAQ,CAAC,KAAK,KAAK,CAAC,CAAC;YAC1E,OAAO,CAAC,GAAG,CAAC,mBAAmB,cAAc,EAAE,CAAC,CAAC;YACjD,OAAO,CAAC,GAAG,CAAC,6DAA6D,CAAC,CAAC;YAC3E,OAAO;QACT,CAAC;QAED,kCAAkC;QAClC,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,CAAC,MAAM,mCAAmC,CAAC,CAAC;QAC1E,MAAM,SAAS,GAAoB,EAAE,CAAC;QAEtC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACrC,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAC1B,OAAO,CAAC,GAAG,CAAC,cAAc,GAAG,MAAM,CAAC,CAAC;YACrC,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,GAAG,CAAC,CAAC;YAC9E,SAAS,CAAC,IAAI,CAAC;gBACb,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC;gBACZ,KAAK,EAAE,QAAQ,CAAC,KAAK;gBACrB,KAAK,EAAE,QAAQ,CAAC,KAAK;gBACrB,UAAU,EAAE,UAAU,GAAG,OAAO;gBAChC,SAAS,EAAE,SAAS,GAAG,MAAM;aAC9B,CAAC,CAAC;YACH,OAAO,CAAC,GAAG,CAAC,aAAa,QAAQ,CAAC,KAAK,KAAK,QAAQ,CAAC,KAAK,OAAO,CAAC,CAAC;QACrE,CAAC;QAED,sDAAsD;QACtD,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;QAE5C,qDAAqD;QACrD,MAAM,EAAE,GAAG,eAAe,EAAE,CAAC;QAC7B,MAAM,QAAQ,GAAG;YACf,UAAU,EAAE,IAAI;YAChB,WAAW,EAAE,EAAE;YACf,SAAS,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC/B,KAAK,EAAE,CAAC,CAAC,KAAK;gBACd,KAAK,EAAE,CAAC,CAAC,KAAK;gBACd,UAAU,EAAE,CAAC,CAAC,UAAU;gBACxB,SAAS,EAAE,CAAC,CAAC,SAAS;gBACtB,GAAG,EAAE,CAAC,CAAC,GAAG;aACX,CAAC,CAAC;YACH,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACtC,CAAC;QACF,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,iBAAiB,CAAC,CAAC;QAClE,EAAE,CAAC,aAAa,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAElE,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;QAC1D,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QAC1B,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;YAC1B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,UAAU,KAAK,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;QAC/E,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,mBAAmB,cAAc,EAAE,CAAC,CAAC;QACjD,OAAO,CAAC,GAAG,CAAC,wEAAwE,CAAC,CAAC;IACxF,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,OAAO,CAAC,KAAK,CAAC,mBAAmB,OAAO,EAAE,CAAC,CAAC;QAC5C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAe;IAC9C,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACrC,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QACxB,IAAI,CAAC,GAAG,IAAI,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;YAC9B,OAAO,CAAC,KAAK,CAAC,mDAAmD,CAAC,CAAC;YACnE,OAAO,CAAC,KAAK,CAAC,qFAAqF,CAAC,CAAC;YACrG,OAAO;QACT,CAAC;QACD,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QACnD,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAC7B,OAAO,CAAC,KAAK,CAAC,gBAAgB,GAAG,iBAAiB,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC1E,OAAO;QACT,CAAC;QACD,iBAAiB,CAAC;YAChB,KAAK,EAAE,EAAE,WAAW,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,EAAE;SACvC,CAAC,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,uBAAuB,GAAG,MAAM,GAAG,IAAI,CAAC,CAAC;IACvD,CAAC;IAED,MAAM,EAAE,GAAG,eAAe,EAAE,CAAC;IAC7B,MAAM,QAAQ,GAAG,gBAAgB,EAAE,CAAC,KAAK,EAAE,WAAW,CAAC;IACvD,OAAO,CAAC,GAAG,CAAC,oBAAoB,QAAQ,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,aAAa,GAAG,CAAC,CAAC;IAC/E,OAAO,CAAC,GAAG,CAAC,qBAAqB,EAAE,CAAC,UAAU,0BAA0B,CAAC,CAAC;IAC1E,OAAO,CAAC,GAAG,CAAC,qBAAqB,EAAE,CAAC,QAAQ,sBAAsB,CAAC,CAAC;IACpE,OAAO,CAAC,GAAG,CAAC,qBAAqB,EAAE,CAAC,cAAc,2BAA2B,CAAC,CAAC;IAC/E,OAAO,CAAC,GAAG,CAAC,qBAAqB,EAAE,CAAC,aAAa,sBAAsB,CAAC,CAAC;IACzE,OAAO,CAAC,GAAG,CAAC,qBAAqB,EAAE,CAAC,QAAQ,yBAAyB,CAAC,CAAC;IACvE,OAAO,CAAC,GAAG,CAAC,qBAAqB,EAAE,CAAC,YAAY,6BAA6B,CAAC,CAAC;IAC/E,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,4DAA4D,CAAC,CAAC;IAC5E,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS;IACvB,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCX,CAAC,CAAC;AACL,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.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,
|
|
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
|
|
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"}
|
package/dist/cli/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AAEA;;GAEG;
|
|
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
|
|