codevf 1.0.0

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 (78) hide show
  1. package/ARCHITECTURE.md +285 -0
  2. package/BUILD_SUMMARY.md +340 -0
  3. package/LICENSE +21 -0
  4. package/QUICKSTART.md +180 -0
  5. package/README.md +104 -0
  6. package/dist/commands/fix.d.ts +2 -0
  7. package/dist/commands/fix.d.ts.map +1 -0
  8. package/dist/commands/fix.js +118 -0
  9. package/dist/commands/fix.js.map +1 -0
  10. package/dist/commands/init.d.ts +2 -0
  11. package/dist/commands/init.d.ts.map +1 -0
  12. package/dist/commands/init.js +270 -0
  13. package/dist/commands/init.js.map +1 -0
  14. package/dist/commands/login.d.ts +2 -0
  15. package/dist/commands/login.d.ts.map +1 -0
  16. package/dist/commands/login.js +62 -0
  17. package/dist/commands/login.js.map +1 -0
  18. package/dist/commands/logout.d.ts +2 -0
  19. package/dist/commands/logout.d.ts.map +1 -0
  20. package/dist/commands/logout.js +14 -0
  21. package/dist/commands/logout.js.map +1 -0
  22. package/dist/commands/sync.d.ts +4 -0
  23. package/dist/commands/sync.d.ts.map +1 -0
  24. package/dist/commands/sync.js +93 -0
  25. package/dist/commands/sync.js.map +1 -0
  26. package/dist/commands/tasks.d.ts +2 -0
  27. package/dist/commands/tasks.d.ts.map +1 -0
  28. package/dist/commands/tasks.js +41 -0
  29. package/dist/commands/tasks.js.map +1 -0
  30. package/dist/index.d.ts +3 -0
  31. package/dist/index.d.ts.map +1 -0
  32. package/dist/index.js +248 -0
  33. package/dist/index.js.map +1 -0
  34. package/dist/modules/api.d.ts +36 -0
  35. package/dist/modules/api.d.ts.map +1 -0
  36. package/dist/modules/api.js +107 -0
  37. package/dist/modules/api.js.map +1 -0
  38. package/dist/modules/auth.d.ts +13 -0
  39. package/dist/modules/auth.d.ts.map +1 -0
  40. package/dist/modules/auth.js +80 -0
  41. package/dist/modules/auth.js.map +1 -0
  42. package/dist/modules/config.d.ts +17 -0
  43. package/dist/modules/config.d.ts.map +1 -0
  44. package/dist/modules/config.js +76 -0
  45. package/dist/modules/config.js.map +1 -0
  46. package/dist/modules/git.d.ts +13 -0
  47. package/dist/modules/git.d.ts.map +1 -0
  48. package/dist/modules/git.js +78 -0
  49. package/dist/modules/git.js.map +1 -0
  50. package/dist/modules/permissions.d.ts +5 -0
  51. package/dist/modules/permissions.d.ts.map +1 -0
  52. package/dist/modules/permissions.js +42 -0
  53. package/dist/modules/permissions.js.map +1 -0
  54. package/dist/modules/websocket.d.ts +17 -0
  55. package/dist/modules/websocket.d.ts.map +1 -0
  56. package/dist/modules/websocket.js +80 -0
  57. package/dist/modules/websocket.js.map +1 -0
  58. package/dist/types/index.d.ts +186 -0
  59. package/dist/types/index.d.ts.map +1 -0
  60. package/dist/types/index.js +40 -0
  61. package/dist/types/index.js.map +1 -0
  62. package/dist/ui/LiveSession.d.ts +13 -0
  63. package/dist/ui/LiveSession.d.ts.map +1 -0
  64. package/dist/ui/LiveSession.js +451 -0
  65. package/dist/ui/LiveSession.js.map +1 -0
  66. package/dist/utils/detect.d.ts +3 -0
  67. package/dist/utils/detect.d.ts.map +1 -0
  68. package/dist/utils/detect.js +78 -0
  69. package/dist/utils/detect.js.map +1 -0
  70. package/dist/utils/errors.d.ts +3 -0
  71. package/dist/utils/errors.d.ts.map +1 -0
  72. package/dist/utils/errors.js +36 -0
  73. package/dist/utils/errors.js.map +1 -0
  74. package/dist/utils/upload.d.ts +3 -0
  75. package/dist/utils/upload.d.ts.map +1 -0
  76. package/dist/utils/upload.js +75 -0
  77. package/dist/utils/upload.js.map +1 -0
  78. package/package.json +76 -0
@@ -0,0 +1,451 @@
1
+ import React, { useState, useEffect } from 'react';
2
+ import { Box, Text, useInput, useApp } from 'ink';
3
+ import * as fs from 'fs';
4
+ import { exec } from 'child_process';
5
+ import { promisify } from 'util';
6
+ import { useRef } from 'react';
7
+ const execAsync = promisify(exec);
8
+ const COMMANDS = [
9
+ { cmd: '/end', description: 'End the session' },
10
+ { cmd: '/help', description: 'Show available commands' },
11
+ { cmd: '/?', description: 'Show available commands' },
12
+ { cmd: '/shell', description: 'Switch to local shell (not shared)' },
13
+ { cmd: '/resume', description: 'Return from shell to session' },
14
+ ];
15
+ export const LiveSession = ({ taskId, wsClient, apiClient, permissionManager, }) => {
16
+ const [messages, setMessages] = useState([]);
17
+ const [engineerName, setEngineerName] = useState(null);
18
+ const [engineerTitle, setEngineerTitle] = useState('');
19
+ const [creditsUsed, setCreditsUsed] = useState(0);
20
+ const [sessionDuration, setSessionDuration] = useState(0);
21
+ const [inputBuffer, setInputBuffer] = useState('');
22
+ const [isProcessingRequest, setIsProcessingRequest] = useState(false);
23
+ const { exit } = useApp();
24
+ const endingRef = useRef(false);
25
+ const [mode, setMode] = useState('session');
26
+ useEffect(() => {
27
+ // Add initial message
28
+ setMessages([
29
+ {
30
+ timestamp: new Date().toISOString(),
31
+ sender: 'system',
32
+ content: 'Connecting to engineer... (type /? for commands, /shell for local shell, /end to close)',
33
+ },
34
+ ]);
35
+ // WebSocket event handlers
36
+ wsClient.on('engineer_connected', (data) => {
37
+ setEngineerName(data.payload.engineerName);
38
+ setEngineerTitle(data.payload.engineerTitle);
39
+ setMessages((prev) => [
40
+ ...prev,
41
+ {
42
+ timestamp: new Date().toISOString(),
43
+ sender: 'system',
44
+ content: `Engineer connected: ${data.payload.engineerName} (${data.payload.engineerTitle})`,
45
+ },
46
+ ]);
47
+ });
48
+ wsClient.on('engineer_message', (data) => {
49
+ setMessages((prev) => [
50
+ ...prev,
51
+ {
52
+ timestamp: data.timestamp,
53
+ sender: 'engineer',
54
+ content: data.payload.message,
55
+ },
56
+ ]);
57
+ });
58
+ wsClient.on('billing_update', (data) => {
59
+ setCreditsUsed(data.payload.creditsUsed);
60
+ setSessionDuration(data.payload.sessionDuration);
61
+ });
62
+ wsClient.on('request_command', async (data) => {
63
+ setIsProcessingRequest(true);
64
+ const { command, reason } = data.payload;
65
+ const approved = await permissionManager.requestCommandPermission(command, reason);
66
+ if (approved) {
67
+ try {
68
+ const { stdout, stderr } = await execAsync(command, { cwd: process.cwd() });
69
+ await apiClient.approveCommand(taskId, command, true);
70
+ // Show output locally
71
+ setMessages((prev) => [
72
+ ...prev,
73
+ {
74
+ timestamp: new Date().toISOString(),
75
+ sender: 'system',
76
+ content: `✓ Command executed: ${command}\n${stdout || ''}${stderr ? `\n${stderr}` : ''}`.trim(),
77
+ },
78
+ ]);
79
+ wsClient.send({
80
+ type: 'command_output',
81
+ timestamp: new Date().toISOString(),
82
+ payload: {
83
+ command,
84
+ exitCode: 0,
85
+ stdout,
86
+ stderr,
87
+ },
88
+ });
89
+ }
90
+ catch (error) {
91
+ wsClient.send({
92
+ type: 'command_output',
93
+ timestamp: new Date().toISOString(),
94
+ payload: {
95
+ command,
96
+ exitCode: error.code || 1,
97
+ stdout: error.stdout || '',
98
+ stderr: error.stderr || error.message,
99
+ },
100
+ });
101
+ setMessages((prev) => [
102
+ ...prev,
103
+ {
104
+ timestamp: new Date().toISOString(),
105
+ sender: 'system',
106
+ content: `✗ Command failed: ${command}\n${error.stdout || ''}${error.stderr || error.message || ''}`,
107
+ },
108
+ ]);
109
+ }
110
+ }
111
+ else {
112
+ await apiClient.approveCommand(taskId, command, false);
113
+ setMessages((prev) => [
114
+ ...prev,
115
+ {
116
+ timestamp: new Date().toISOString(),
117
+ sender: 'system',
118
+ content: `✗ Command denied: ${command}`,
119
+ },
120
+ ]);
121
+ }
122
+ setIsProcessingRequest(false);
123
+ });
124
+ wsClient.on('request_file', async (data) => {
125
+ setIsProcessingRequest(true);
126
+ const { filePath, reason } = data.payload;
127
+ const approved = await permissionManager.requestFilePermission(filePath, reason);
128
+ if (approved) {
129
+ try {
130
+ const fullPath = `${process.cwd()}/${filePath}`;
131
+ const content = fs.readFileSync(fullPath, 'utf-8');
132
+ await apiClient.uploadFile(taskId, filePath, content);
133
+ setMessages((prev) => [
134
+ ...prev,
135
+ {
136
+ timestamp: new Date().toISOString(),
137
+ sender: 'system',
138
+ content: `✓ File shared: ${filePath}`,
139
+ },
140
+ ]);
141
+ }
142
+ catch (error) {
143
+ setMessages((prev) => [
144
+ ...prev,
145
+ {
146
+ timestamp: new Date().toISOString(),
147
+ sender: 'system',
148
+ content: `✗ Failed to read file: ${filePath}`,
149
+ },
150
+ ]);
151
+ }
152
+ }
153
+ else {
154
+ setMessages((prev) => [
155
+ ...prev,
156
+ {
157
+ timestamp: new Date().toISOString(),
158
+ sender: 'system',
159
+ content: `✗ File access denied: ${filePath}`,
160
+ },
161
+ ]);
162
+ }
163
+ setIsProcessingRequest(false);
164
+ });
165
+ wsClient.on('screenshare_request', (data) => {
166
+ setMessages((prev) => [
167
+ ...prev,
168
+ {
169
+ timestamp: new Date().toISOString(),
170
+ sender: 'system',
171
+ content: `📹 Engineer requests screenshare: ${data.payload.url}`,
172
+ },
173
+ ]);
174
+ });
175
+ wsClient.on('closure_request', (data) => {
176
+ setMessages((prev) => [
177
+ ...prev,
178
+ {
179
+ timestamp: data.timestamp,
180
+ sender: 'system',
181
+ content: `Engineer requests to close the session: ${data.payload?.reason || ''}`.trim(),
182
+ },
183
+ ]);
184
+ });
185
+ wsClient.on('session_end', async (data) => {
186
+ setMessages((prev) => [
187
+ ...prev,
188
+ {
189
+ timestamp: new Date().toISOString(),
190
+ sender: 'system',
191
+ content: 'Session ended by engineer',
192
+ },
193
+ ]);
194
+ // Show summary and exit after a delay
195
+ setTimeout(() => exit(), 2000);
196
+ });
197
+ wsClient.on('error', (error) => {
198
+ setMessages((prev) => [
199
+ ...prev,
200
+ {
201
+ timestamp: new Date().toISOString(),
202
+ sender: 'system',
203
+ content: `Error: ${error.message}`,
204
+ },
205
+ ]);
206
+ });
207
+ wsClient.on('reconnecting', (attempt) => {
208
+ setMessages((prev) => [
209
+ ...prev,
210
+ {
211
+ timestamp: new Date().toISOString(),
212
+ sender: 'system',
213
+ content: `Reconnecting... (attempt ${attempt})`,
214
+ },
215
+ ]);
216
+ });
217
+ return () => {
218
+ wsClient.removeAllListeners();
219
+ };
220
+ }, [wsClient, taskId, apiClient, permissionManager, exit]);
221
+ const endSession = async (reason = 'Customer ended session') => {
222
+ if (endingRef.current)
223
+ return;
224
+ endingRef.current = true;
225
+ setMessages((prev) => [
226
+ ...prev,
227
+ {
228
+ timestamp: new Date().toISOString(),
229
+ sender: 'system',
230
+ content: 'Ending session...',
231
+ },
232
+ ]);
233
+ try {
234
+ wsClient.send({
235
+ type: 'end_session',
236
+ timestamp: new Date().toISOString(),
237
+ payload: { reason, endedBy: 'customer' },
238
+ });
239
+ }
240
+ catch (error) {
241
+ // ignore send errors on shutdown
242
+ }
243
+ try {
244
+ await apiClient.endSession(taskId);
245
+ }
246
+ catch (error) {
247
+ // best-effort; still proceed to exit
248
+ }
249
+ try {
250
+ wsClient.disconnect();
251
+ }
252
+ catch (error) {
253
+ // ignore
254
+ }
255
+ setTimeout(() => exit(), 200);
256
+ };
257
+ useInput((input, key) => {
258
+ if (key.return && inputBuffer.trim()) {
259
+ const message = inputBuffer.trim();
260
+ // Shell mode handling (local only)
261
+ if (mode === 'shell') {
262
+ if (message === '/resume' || message === '/session') {
263
+ setMode('session');
264
+ setMessages((prev) => [
265
+ ...prev,
266
+ {
267
+ timestamp: new Date().toISOString(),
268
+ sender: 'system',
269
+ content: 'Back to session (messages will be shared with engineer).',
270
+ },
271
+ ]);
272
+ setInputBuffer('');
273
+ return;
274
+ }
275
+ if (message === '/end') {
276
+ endSession();
277
+ setInputBuffer('');
278
+ return;
279
+ }
280
+ if (message === '/shell') {
281
+ setMessages((prev) => [
282
+ ...prev,
283
+ {
284
+ timestamp: new Date().toISOString(),
285
+ sender: 'system',
286
+ content: 'Already in shell mode. Type /resume to return to session.',
287
+ },
288
+ ]);
289
+ setInputBuffer('');
290
+ return;
291
+ }
292
+ if (message === '/help' || message === '/?') {
293
+ setMessages((prev) => [
294
+ ...prev,
295
+ ...COMMANDS.map((c) => ({
296
+ timestamp: new Date().toISOString(),
297
+ sender: 'system',
298
+ content: `${c.cmd} — ${c.description}`,
299
+ })),
300
+ {
301
+ timestamp: new Date().toISOString(),
302
+ sender: 'system',
303
+ content: '/resume — return to session mode',
304
+ },
305
+ ]);
306
+ setInputBuffer('');
307
+ return;
308
+ }
309
+ if (message.startsWith('/')) {
310
+ setMessages((prev) => [
311
+ ...prev,
312
+ {
313
+ timestamp: new Date().toISOString(),
314
+ sender: 'system',
315
+ content: `Unknown command in shell: ${message}`,
316
+ },
317
+ ]);
318
+ setInputBuffer('');
319
+ return;
320
+ }
321
+ // Execute local command
322
+ (async () => {
323
+ try {
324
+ const { stdout, stderr } = await execAsync(message, { cwd: process.cwd() });
325
+ setMessages((prev) => [
326
+ ...prev,
327
+ {
328
+ timestamp: new Date().toISOString(),
329
+ sender: 'system',
330
+ content: `$ ${message}\n${stdout || ''}${stderr ? `\n${stderr}` : ''}`.trim(),
331
+ },
332
+ ]);
333
+ }
334
+ catch (error) {
335
+ setMessages((prev) => [
336
+ ...prev,
337
+ {
338
+ timestamp: new Date().toISOString(),
339
+ sender: 'system',
340
+ content: `$ ${message}\n${error.stdout || ''}${error.stderr || error.message || 'Command failed'}`,
341
+ },
342
+ ]);
343
+ }
344
+ })();
345
+ setInputBuffer('');
346
+ return;
347
+ }
348
+ // Session mode handling
349
+ if (message === '/end') {
350
+ endSession();
351
+ setInputBuffer('');
352
+ return;
353
+ }
354
+ if (message === '/help' || message === '/?') {
355
+ setMessages((prev) => [
356
+ ...prev,
357
+ ...COMMANDS.map((c) => ({
358
+ timestamp: new Date().toISOString(),
359
+ sender: 'system',
360
+ content: `${c.cmd} — ${c.description}`,
361
+ })),
362
+ {
363
+ timestamp: new Date().toISOString(),
364
+ sender: 'system',
365
+ content: '/shell — switch to local shell (not shared)',
366
+ },
367
+ ]);
368
+ setInputBuffer('');
369
+ return;
370
+ }
371
+ if (message === '/shell') {
372
+ setMode('shell');
373
+ setMessages((prev) => [
374
+ ...prev,
375
+ {
376
+ timestamp: new Date().toISOString(),
377
+ sender: 'system',
378
+ content: 'Switched to local shell mode (commands are NOT shared with engineer). Type /resume to return.',
379
+ },
380
+ ]);
381
+ setInputBuffer('');
382
+ return;
383
+ }
384
+ wsClient.send({
385
+ type: 'customer_message',
386
+ timestamp: new Date().toISOString(),
387
+ payload: { message },
388
+ });
389
+ setMessages((prev) => [
390
+ ...prev,
391
+ {
392
+ timestamp: new Date().toISOString(),
393
+ sender: 'customer',
394
+ content: message,
395
+ },
396
+ ]);
397
+ setInputBuffer('');
398
+ }
399
+ else if (key.backspace || key.delete) {
400
+ setInputBuffer((prev) => prev.slice(0, -1));
401
+ }
402
+ else if (!key.ctrl && !key.meta && input) {
403
+ setInputBuffer((prev) => prev + input);
404
+ }
405
+ }, { isActive: !isProcessingRequest });
406
+ const formatTime = (timestamp) => {
407
+ const date = new Date(timestamp);
408
+ return date.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' });
409
+ };
410
+ return (React.createElement(Box, { flexDirection: "column", height: "100%" },
411
+ React.createElement(Box, { borderStyle: "round", borderColor: "cyan", paddingX: 1, marginBottom: 1 },
412
+ React.createElement(Box, { flexDirection: "column" },
413
+ React.createElement(Text, { bold: true, color: "cyan" }, "CodeVF Live Session"),
414
+ engineerName && (React.createElement(Text, { color: "white" },
415
+ "Engineer: ",
416
+ engineerName,
417
+ " ",
418
+ engineerTitle && React.createElement(Text, { dimColor: true },
419
+ "(",
420
+ engineerTitle,
421
+ ")"))),
422
+ React.createElement(Text, { dimColor: true },
423
+ "Billing: ",
424
+ creditsUsed,
425
+ " credit",
426
+ creditsUsed !== 1 ? 's' : '',
427
+ " used \u2022 Press CTRL+C to exit"))),
428
+ React.createElement(Box, { flexDirection: "column", borderStyle: "round", borderColor: "gray", paddingX: 1, flexGrow: 1, marginBottom: 1 }, messages.slice(-15).map((msg, idx) => (React.createElement(Box, { key: idx, marginBottom: 0 },
429
+ React.createElement(Text, { dimColor: true },
430
+ "[",
431
+ formatTime(msg.timestamp),
432
+ "]"),
433
+ React.createElement(Text, null, " "),
434
+ msg.sender === 'engineer' && React.createElement(Text, { color: "green" },
435
+ engineerName || 'Engineer',
436
+ ":"),
437
+ msg.sender === 'customer' && React.createElement(Text, { color: "blue" }, "You:"),
438
+ msg.sender === 'system' && React.createElement(Text, { color: "yellow" }, "System:"),
439
+ React.createElement(Text, null,
440
+ " ",
441
+ msg.content))))),
442
+ React.createElement(Box, { borderStyle: "round", borderColor: "blue", paddingX: 1 },
443
+ React.createElement(Text, { color: "blue" }, mode === 'shell' ? 'Local> ' : 'You: '),
444
+ React.createElement(Text, null, inputBuffer),
445
+ React.createElement(Text, { color: "gray" }, "\u258C")),
446
+ React.createElement(Box, { marginTop: 1 },
447
+ React.createElement(Text, { dimColor: true }, mode === 'shell'
448
+ ? 'Shell mode (not shared). /resume to return, /? for commands.'
449
+ : 'Type `/?` to see available commands (e.g., /end, /shell)'))));
450
+ };
451
+ //# sourceMappingURL=LiveSession.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LiveSession.js","sourceRoot":"","sources":["../../src/ui/LiveSession.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { ProjectDetection } from '../types/index.js';
2
+ export declare function detectProjectType(cwd?: string): ProjectDetection;
3
+ //# sourceMappingURL=detect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect.d.ts","sourceRoot":"","sources":["../../src/utils/detect.ts"],"names":[],"mappings":"AAEA,OAAO,EAAe,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAElE,wBAAgB,iBAAiB,CAAC,GAAG,GAAE,MAAsB,GAAG,gBAAgB,CA6D/E"}
@@ -0,0 +1,78 @@
1
+ import * as fs from 'fs';
2
+ import * as path from 'path';
3
+ export function detectProjectType(cwd = process.cwd()) {
4
+ const indicators = [];
5
+ let type = 'unknown';
6
+ let confidence = 0;
7
+ // Check for Node.js project
8
+ if (fs.existsSync(path.join(cwd, 'package.json'))) {
9
+ indicators.push('package.json');
10
+ type = 'node';
11
+ confidence = 90;
12
+ }
13
+ // Check for Python project
14
+ if (fs.existsSync(path.join(cwd, 'requirements.txt')) ||
15
+ fs.existsSync(path.join(cwd, 'setup.py')) ||
16
+ fs.existsSync(path.join(cwd, 'pyproject.toml'))) {
17
+ indicators.push('requirements.txt or setup.py or pyproject.toml');
18
+ type = 'python';
19
+ confidence = 90;
20
+ }
21
+ // Check for Go project
22
+ if (fs.existsSync(path.join(cwd, 'go.mod'))) {
23
+ indicators.push('go.mod');
24
+ type = 'go';
25
+ confidence = 95;
26
+ }
27
+ // Check for Ruby project
28
+ if (fs.existsSync(path.join(cwd, 'Gemfile'))) {
29
+ indicators.push('Gemfile');
30
+ type = 'ruby';
31
+ confidence = 90;
32
+ }
33
+ // Check for Java project
34
+ if (fs.existsSync(path.join(cwd, 'pom.xml')) ||
35
+ fs.existsSync(path.join(cwd, 'build.gradle'))) {
36
+ indicators.push('pom.xml or build.gradle');
37
+ type = 'java';
38
+ confidence = 90;
39
+ }
40
+ // Check for Rust project
41
+ if (fs.existsSync(path.join(cwd, 'Cargo.toml'))) {
42
+ indicators.push('Cargo.toml');
43
+ type = 'rust';
44
+ confidence = 95;
45
+ }
46
+ return {
47
+ type,
48
+ confidence,
49
+ indicators,
50
+ suggestedTestCommand: getSuggestedTestCommand(type),
51
+ suggestedBuildCommand: getSuggestedBuildCommand(type),
52
+ };
53
+ }
54
+ function getSuggestedTestCommand(type) {
55
+ const commands = {
56
+ node: 'npm test',
57
+ python: 'pytest',
58
+ go: 'go test ./...',
59
+ ruby: 'bundle exec rspec',
60
+ java: 'mvn test',
61
+ rust: 'cargo test',
62
+ unknown: undefined,
63
+ };
64
+ return commands[type];
65
+ }
66
+ function getSuggestedBuildCommand(type) {
67
+ const commands = {
68
+ node: 'npm run build',
69
+ python: undefined,
70
+ go: 'go build',
71
+ ruby: undefined,
72
+ java: 'mvn package',
73
+ rust: 'cargo build --release',
74
+ unknown: undefined,
75
+ };
76
+ return commands[type];
77
+ }
78
+ //# sourceMappingURL=detect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect.js","sourceRoot":"","sources":["../../src/utils/detect.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare function handleError(error: unknown): void;
2
+ export declare function formatErrorMessage(error: unknown): string;
3
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAGA,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CA2BhD;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAKzD"}
@@ -0,0 +1,36 @@
1
+ import chalk from 'chalk';
2
+ import { CodeVFError } from '../types/index.js';
3
+ export function handleError(error) {
4
+ if (error instanceof CodeVFError) {
5
+ console.error(chalk.red(`\nError: ${error.message}`));
6
+ if (error.code) {
7
+ console.error(chalk.dim(`Code: ${error.code}`));
8
+ }
9
+ // Provide helpful hints based on error type
10
+ switch (error.name) {
11
+ case 'AuthError':
12
+ console.error(chalk.yellow('\nPlease run: codevf login'));
13
+ break;
14
+ case 'ConfigError':
15
+ console.error(chalk.yellow('\nPlease run: codevf init'));
16
+ break;
17
+ case 'NetworkError':
18
+ console.error(chalk.yellow('\nPlease check your internet connection.'));
19
+ break;
20
+ }
21
+ }
22
+ else if (error instanceof Error) {
23
+ console.error(chalk.red(`\nError: ${error.message}`));
24
+ }
25
+ else {
26
+ console.error(chalk.red('\nAn unexpected error occurred.'));
27
+ }
28
+ process.exit(1);
29
+ }
30
+ export function formatErrorMessage(error) {
31
+ if (error instanceof Error) {
32
+ return error.message;
33
+ }
34
+ return String(error);
35
+ }
36
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,MAAM,UAAU,WAAW,CAAC,KAAc;IACxC,IAAI,KAAK,YAAY,WAAW,EAAE,CAAC;QACjC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAEtD,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAClD,CAAC;QAED,4CAA4C;QAC5C,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;YACnB,KAAK,WAAW;gBACd,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,4BAA4B,CAAC,CAAC,CAAC;gBAC1D,MAAM;YACR,KAAK,aAAa;gBAChB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,2BAA2B,CAAC,CAAC,CAAC;gBACzD,MAAM;YACR,KAAK,cAAc;gBACjB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,0CAA0C,CAAC,CAAC,CAAC;gBACxE,MAAM;QACV,CAAC;IACH,CAAC;SAAM,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAClC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IACxD,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC,CAAC;IAC9D,CAAC;IAED,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,KAAc;IAC/C,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAC3B,OAAO,KAAK,CAAC,OAAO,CAAC;IACvB,CAAC;IACD,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;AACvB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare function createRepoZip(cwd: string): Promise<Buffer>;
2
+ export declare function shouldWarnAboutFile(filePath: string): boolean;
3
+ //# sourceMappingURL=upload.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upload.d.ts","sourceRoot":"","sources":["../../src/utils/upload.ts"],"names":[],"mappings":"AAmBA,wBAAsB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAiDhE;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAc7D"}