vibehub-cli 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 (69) hide show
  1. package/dist/commands/add.d.ts +3 -0
  2. package/dist/commands/add.d.ts.map +1 -0
  3. package/dist/commands/add.js +125 -0
  4. package/dist/commands/add.js.map +1 -0
  5. package/dist/commands/capture-prompts.d.ts +3 -0
  6. package/dist/commands/capture-prompts.d.ts.map +1 -0
  7. package/dist/commands/capture-prompts.js +137 -0
  8. package/dist/commands/capture-prompts.js.map +1 -0
  9. package/dist/commands/commit.d.ts +3 -0
  10. package/dist/commands/commit.d.ts.map +1 -0
  11. package/dist/commands/commit.js +132 -0
  12. package/dist/commands/commit.js.map +1 -0
  13. package/dist/commands/init.d.ts +3 -0
  14. package/dist/commands/init.d.ts.map +1 -0
  15. package/dist/commands/init.js +113 -0
  16. package/dist/commands/init.js.map +1 -0
  17. package/dist/commands/install.d.ts +3 -0
  18. package/dist/commands/install.d.ts.map +1 -0
  19. package/dist/commands/install.js +182 -0
  20. package/dist/commands/install.js.map +1 -0
  21. package/dist/commands/pull.d.ts +3 -0
  22. package/dist/commands/pull.d.ts.map +1 -0
  23. package/dist/commands/pull.js +99 -0
  24. package/dist/commands/pull.js.map +1 -0
  25. package/dist/commands/push.d.ts +3 -0
  26. package/dist/commands/push.d.ts.map +1 -0
  27. package/dist/commands/push.js +142 -0
  28. package/dist/commands/push.js.map +1 -0
  29. package/dist/commands/session.d.ts +3 -0
  30. package/dist/commands/session.d.ts.map +1 -0
  31. package/dist/commands/session.js +179 -0
  32. package/dist/commands/session.js.map +1 -0
  33. package/dist/commands/set.d.ts +3 -0
  34. package/dist/commands/set.d.ts.map +1 -0
  35. package/dist/commands/set.js +134 -0
  36. package/dist/commands/set.js.map +1 -0
  37. package/dist/commands/status.d.ts +3 -0
  38. package/dist/commands/status.d.ts.map +1 -0
  39. package/dist/commands/status.js +79 -0
  40. package/dist/commands/status.js.map +1 -0
  41. package/dist/index.d.ts +3 -0
  42. package/dist/index.d.ts.map +1 -0
  43. package/dist/index.js +44 -0
  44. package/dist/index.js.map +1 -0
  45. package/dist/lib/ai-capture.d.ts +21 -0
  46. package/dist/lib/ai-capture.d.ts.map +1 -0
  47. package/dist/lib/ai-capture.js +242 -0
  48. package/dist/lib/ai-capture.js.map +1 -0
  49. package/dist/lib/cloud-service.d.ts +26 -0
  50. package/dist/lib/cloud-service.d.ts.map +1 -0
  51. package/dist/lib/cloud-service.js +200 -0
  52. package/dist/lib/cloud-service.js.map +1 -0
  53. package/dist/lib/cursor-conversation-capture.d.ts +10 -0
  54. package/dist/lib/cursor-conversation-capture.d.ts.map +1 -0
  55. package/dist/lib/cursor-conversation-capture.js +117 -0
  56. package/dist/lib/cursor-conversation-capture.js.map +1 -0
  57. package/dist/lib/prompt-capture-manager.d.ts +33 -0
  58. package/dist/lib/prompt-capture-manager.d.ts.map +1 -0
  59. package/dist/lib/prompt-capture-manager.js +178 -0
  60. package/dist/lib/prompt-capture-manager.js.map +1 -0
  61. package/dist/lib/vibehub-manager.d.ts +172 -0
  62. package/dist/lib/vibehub-manager.d.ts.map +1 -0
  63. package/dist/lib/vibehub-manager.js +855 -0
  64. package/dist/lib/vibehub-manager.js.map +1 -0
  65. package/dist/src/commands/set.d.ts +3 -0
  66. package/dist/src/commands/set.d.ts.map +1 -0
  67. package/dist/src/commands/set.js +125 -0
  68. package/dist/src/commands/set.js.map +1 -0
  69. package/package.json +53 -0
@@ -0,0 +1,242 @@
1
+ import fs from 'fs-extra';
2
+ import path from 'path';
3
+ import os from 'os';
4
+ import { VibeHubManager } from './vibehub-manager.js';
5
+ import { CursorConversationCapture } from './cursor-conversation-capture.js';
6
+ export class AICapture {
7
+ constructor(cwd) {
8
+ this.cwd = cwd;
9
+ this.cursorCapture = new CursorConversationCapture();
10
+ }
11
+ async captureRecentConversation() {
12
+ try {
13
+ // Try Cursor conversation capture first
14
+ const cursorCapture = new CursorConversationCapture();
15
+ const cursorConversation = await cursorCapture.captureRecentConversation();
16
+ if (cursorConversation) {
17
+ return {
18
+ prompt: cursorConversation.prompt,
19
+ timestamp: cursorConversation.timestamp
20
+ };
21
+ }
22
+ // Fallback to reading from Cursor logs/cache
23
+ const conversation = await this.getConversationFromCursor();
24
+ if (conversation) {
25
+ return {
26
+ prompt: conversation.prompt,
27
+ timestamp: Date.now()
28
+ };
29
+ }
30
+ return null;
31
+ }
32
+ catch (error) {
33
+ console.error('Error capturing AI conversation:', error);
34
+ return null;
35
+ }
36
+ }
37
+ async getConversationFromCursor() {
38
+ try {
39
+ const cursorPaths = this.getCursorDataPaths();
40
+ for (const cursorPath of cursorPaths) {
41
+ if (await fs.pathExists(cursorPath)) {
42
+ const conversation = await this.readFromCursorPath(cursorPath);
43
+ if (conversation) {
44
+ return conversation;
45
+ }
46
+ }
47
+ }
48
+ return null;
49
+ }
50
+ catch (error) {
51
+ console.error('Error reading from Cursor paths:', error);
52
+ return null;
53
+ }
54
+ }
55
+ getCursorDataPaths() {
56
+ const platform = os.platform();
57
+ const homeDir = os.homedir();
58
+ if (platform === 'darwin') {
59
+ return [
60
+ path.join(homeDir, 'Library', 'Application Support', 'Cursor', 'User', 'globalStorage'),
61
+ path.join(homeDir, 'Library', 'Application Support', 'Cursor', 'logs'),
62
+ path.join(homeDir, 'Library', 'Application Support', 'Cursor', 'User', 'workspaceStorage')
63
+ ];
64
+ }
65
+ else if (platform === 'win32') {
66
+ return [
67
+ path.join(homeDir, 'AppData', 'Roaming', 'Cursor', 'User', 'globalStorage'),
68
+ path.join(homeDir, 'AppData', 'Roaming', 'Cursor', 'logs'),
69
+ path.join(homeDir, 'AppData', 'Roaming', 'Cursor', 'User', 'workspaceStorage')
70
+ ];
71
+ }
72
+ else {
73
+ return [
74
+ path.join(homeDir, '.config', 'Cursor', 'User', 'globalStorage'),
75
+ path.join(homeDir, '.config', 'Cursor', 'logs'),
76
+ path.join(homeDir, '.config', 'Cursor', 'User', 'workspaceStorage')
77
+ ];
78
+ }
79
+ }
80
+ async readFromCursorPath(cursorPath) {
81
+ try {
82
+ const files = await fs.readdir(cursorPath);
83
+ // Look for recent conversation files
84
+ const conversationFiles = files
85
+ .filter(file => file.includes('conversation') || file.includes('chat') || file.includes('ai'))
86
+ .sort()
87
+ .reverse(); // Most recent first
88
+ for (const file of conversationFiles.slice(0, 5)) { // Check last 5 files
89
+ const filePath = path.join(cursorPath, file);
90
+ const stats = await fs.stat(filePath);
91
+ // Only check files modified in the last hour
92
+ if (Date.now() - stats.mtime.getTime() < 60 * 60 * 1000) {
93
+ const conversation = await this.parseConversationFile(filePath);
94
+ if (conversation) {
95
+ return conversation;
96
+ }
97
+ }
98
+ }
99
+ return null;
100
+ }
101
+ catch (error) {
102
+ console.error('Error reading from Cursor path:', error);
103
+ return null;
104
+ }
105
+ }
106
+ async parseConversationFile(filePath) {
107
+ try {
108
+ const content = await fs.readFile(filePath, 'utf-8');
109
+ // Try to parse as JSON first
110
+ try {
111
+ const jsonData = JSON.parse(content);
112
+ return this.extractConversationFromJson(jsonData);
113
+ }
114
+ catch {
115
+ // If not JSON, try to extract from log format
116
+ return this.extractConversationFromLog(content);
117
+ }
118
+ }
119
+ catch (error) {
120
+ console.error('Error parsing conversation file:', error);
121
+ return null;
122
+ }
123
+ }
124
+ extractConversationFromJson(data) {
125
+ try {
126
+ // Look for conversation data in various formats
127
+ const conversation = data.conversation || data.chat || data.messages || data.prompts;
128
+ if (Array.isArray(conversation) && conversation.length > 0) {
129
+ const lastMessage = conversation[conversation.length - 1];
130
+ if (lastMessage.prompt || lastMessage.text || lastMessage.message) {
131
+ return {
132
+ prompt: lastMessage.prompt || lastMessage.text || lastMessage.message,
133
+ timestamp: Date.now()
134
+ };
135
+ }
136
+ }
137
+ // Try direct properties
138
+ if (data.prompt || data.text || data.message) {
139
+ return {
140
+ prompt: data.prompt || data.text || data.message,
141
+ timestamp: Date.now()
142
+ };
143
+ }
144
+ return null;
145
+ }
146
+ catch (error) {
147
+ console.error('Error extracting conversation from JSON:', error);
148
+ return null;
149
+ }
150
+ }
151
+ extractConversationFromLog(content) {
152
+ try {
153
+ const lines = content.split('\n').reverse(); // Start from the end
154
+ for (const line of lines) {
155
+ if (line.includes('prompt') || line.includes('user') || line.includes('ask')) {
156
+ // Extract the prompt from the line
157
+ const match = line.match(/(?:prompt|user|ask)[:\s]+(.+)/i);
158
+ if (match && match[1].trim().length > 10) {
159
+ return {
160
+ prompt: match[1].trim(),
161
+ timestamp: Date.now()
162
+ };
163
+ }
164
+ }
165
+ }
166
+ return null;
167
+ }
168
+ catch (error) {
169
+ console.error('Error extracting conversation from log:', error);
170
+ return null;
171
+ }
172
+ }
173
+ extractMultiLineConversation(content) {
174
+ const lines = content.split('\n');
175
+ let prompt = '';
176
+ let response = '';
177
+ let inPrompt = false;
178
+ let inResponse = false;
179
+ for (const line of lines) {
180
+ const trimmed = line.trim();
181
+ if (trimmed.includes('User:') || trimmed.includes('user:') || trimmed.includes('prompt:')) {
182
+ inPrompt = true;
183
+ inResponse = false;
184
+ prompt = trimmed.replace(/^(User|user|prompt):\s*/i, '');
185
+ }
186
+ else if (trimmed.includes('Assistant:') || trimmed.includes('assistant:') || trimmed.includes('response:')) {
187
+ inPrompt = false;
188
+ inResponse = true;
189
+ response = trimmed.replace(/^(Assistant|assistant|response):\s*/i, '');
190
+ }
191
+ else if (inPrompt && trimmed) {
192
+ prompt += ' ' + trimmed;
193
+ }
194
+ else if (inResponse && trimmed) {
195
+ response += ' ' + trimmed;
196
+ }
197
+ }
198
+ return { prompt: prompt.trim(), response: response.trim() };
199
+ }
200
+ extractFilesFromMessages(messages) {
201
+ const files = [];
202
+ for (const message of messages) {
203
+ if (message.files && Array.isArray(message.files)) {
204
+ files.push(...message.files);
205
+ }
206
+ if (message.content && typeof message.content === 'string') {
207
+ const fileMatches = message.content.match(/`([^`]+\.(js|ts|jsx|tsx|py|java|cpp|c|h|html|css|json|md|txt))`/g);
208
+ if (fileMatches) {
209
+ files.push(...fileMatches.map((f) => f.replace(/`/g, '')));
210
+ }
211
+ }
212
+ }
213
+ return [...new Set(files)]; // Remove duplicates
214
+ }
215
+ async createManualSession() {
216
+ try {
217
+ const vibehubManager = new VibeHubManager(this.cwd);
218
+ // This would need to be implemented with user input
219
+ // For now, return null to indicate manual input is needed
220
+ return null;
221
+ }
222
+ catch (error) {
223
+ console.error('Error creating manual session:', error);
224
+ return null;
225
+ }
226
+ }
227
+ async getRecentSession() {
228
+ try {
229
+ const vibehubManager = new VibeHubManager(this.cwd);
230
+ const sessions = await vibehubManager.getAllSessions();
231
+ if (sessions.length > 0) {
232
+ return sessions[sessions.length - 1].id;
233
+ }
234
+ return null;
235
+ }
236
+ catch (error) {
237
+ console.error('Error getting recent session:', error);
238
+ return null;
239
+ }
240
+ }
241
+ }
242
+ //# sourceMappingURL=ai-capture.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-capture.js","sourceRoot":"","sources":["../../src/lib/ai-capture.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import { VibeHubCommit, VibeHubSession, SyncResponse } from './vibehub-manager.js';
2
+ export interface CloudConfig {
3
+ apiUrl: string;
4
+ token?: string;
5
+ }
6
+ export declare class CloudService {
7
+ private api;
8
+ private config;
9
+ constructor(config: CloudConfig);
10
+ setToken(token: string): void;
11
+ push(projectId: string, commits: VibeHubCommit[], sessions: VibeHubSession[], force?: boolean): Promise<SyncResponse>;
12
+ pull(projectId: string, lastSync?: string, force?: boolean): Promise<SyncResponse>;
13
+ getSyncStatus(projectId: string): Promise<any>;
14
+ getCommits(projectId: string, limit?: number, offset?: number, branch?: string): Promise<any[]>;
15
+ getSessions(projectId: string, limit?: number, offset?: number): Promise<any[]>;
16
+ createProject(name: string, description?: string, settings?: any): Promise<any>;
17
+ getProjects(limit?: number, offset?: number): Promise<any[]>;
18
+ getProject(projectId: string): Promise<any>;
19
+ updateProject(projectId: string, updates: any): Promise<any>;
20
+ deleteProject(projectId: string): Promise<void>;
21
+ addCollaborator(projectId: string, email: string, role: 'Admin' | 'Editor' | 'Viewer'): Promise<void>;
22
+ removeCollaborator(projectId: string, collaboratorId: string): Promise<void>;
23
+ testConnection(): Promise<boolean>;
24
+ verifyProject(projectId: string): Promise<boolean>;
25
+ }
26
+ //# sourceMappingURL=cloud-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloud-service.d.ts","sourceRoot":"","sources":["../../src/lib/cloud-service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,cAAc,EAA4B,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAE7G,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,GAAG,CAAgB;IAC3B,OAAO,CAAC,MAAM,CAAc;gBAEhB,MAAM,EAAE,WAAW;IA8B/B,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAMvB,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,EAAE,QAAQ,EAAE,cAAc,EAAE,EAAE,KAAK,UAAQ,GAAG,OAAO,CAAC,YAAY,CAAC;IAgBnH,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,KAAK,UAAQ,GAAG,OAAO,CAAC,YAAY,CAAC;IAehF,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAU9C,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,SAAK,EAAE,MAAM,SAAI,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAgBtF,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,SAAK,EAAE,MAAM,SAAI,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAetE,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;IAe/E,WAAW,CAAC,KAAK,SAAK,EAAE,MAAM,SAAI,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAenD,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAU3C,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;IAU5D,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAS/C,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAYrG,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAS5E,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC;IAWlC,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAQzD"}
@@ -0,0 +1,200 @@
1
+ import axios from 'axios';
2
+ export class CloudService {
3
+ constructor(config) {
4
+ this.config = config;
5
+ this.api = axios.create({
6
+ baseURL: config.apiUrl,
7
+ timeout: 30000,
8
+ headers: {
9
+ 'Content-Type': 'application/json',
10
+ ...(config.token && { Authorization: `Bearer ${config.token}` })
11
+ }
12
+ });
13
+ // Add response interceptor for error handling
14
+ this.api.interceptors.response.use((response) => response, (error) => {
15
+ if (error.response?.status === 401) {
16
+ throw new Error('Authentication failed. Please login again.');
17
+ }
18
+ if (error.response?.status === 403) {
19
+ throw new Error('Access denied. You don\'t have permission to perform this action.');
20
+ }
21
+ if (error.response?.status === 404) {
22
+ throw new Error('Resource not found.');
23
+ }
24
+ throw new Error(error.response?.data?.error || error.message || 'Network error');
25
+ });
26
+ }
27
+ // Set authentication token
28
+ setToken(token) {
29
+ this.config.token = token;
30
+ this.api.defaults.headers.Authorization = `Bearer ${token}`;
31
+ }
32
+ // Push commits and sessions to cloud
33
+ async push(projectId, commits, sessions, force = false) {
34
+ try {
35
+ const response = await this.api.post('/api/sync/push', {
36
+ projectId,
37
+ commits,
38
+ sessions,
39
+ force
40
+ });
41
+ return response.data.data;
42
+ }
43
+ catch (error) {
44
+ throw new Error(`Failed to push to cloud: ${error instanceof Error ? error.message : 'Unknown error'}`);
45
+ }
46
+ }
47
+ // Pull commits and sessions from cloud
48
+ async pull(projectId, lastSync, force = false) {
49
+ try {
50
+ const response = await this.api.post('/api/sync/pull', {
51
+ projectId,
52
+ lastSync,
53
+ force
54
+ });
55
+ return response.data.data;
56
+ }
57
+ catch (error) {
58
+ throw new Error(`Failed to pull from cloud: ${error instanceof Error ? error.message : 'Unknown error'}`);
59
+ }
60
+ }
61
+ // Get sync status
62
+ async getSyncStatus(projectId) {
63
+ try {
64
+ const response = await this.api.get(`/api/sync/status/${projectId}`);
65
+ return response.data.data;
66
+ }
67
+ catch (error) {
68
+ throw new Error(`Failed to get sync status: ${error instanceof Error ? error.message : 'Unknown error'}`);
69
+ }
70
+ }
71
+ // Get project commits
72
+ async getCommits(projectId, limit = 50, offset = 0, branch) {
73
+ try {
74
+ const params = new URLSearchParams({
75
+ limit: limit.toString(),
76
+ offset: offset.toString(),
77
+ ...(branch && { branch })
78
+ });
79
+ const response = await this.api.get(`/api/sync/commits/${projectId}?${params}`);
80
+ return response.data.data;
81
+ }
82
+ catch (error) {
83
+ throw new Error(`Failed to get commits: ${error instanceof Error ? error.message : 'Unknown error'}`);
84
+ }
85
+ }
86
+ // Get project sessions
87
+ async getSessions(projectId, limit = 50, offset = 0) {
88
+ try {
89
+ const params = new URLSearchParams({
90
+ limit: limit.toString(),
91
+ offset: offset.toString()
92
+ });
93
+ const response = await this.api.get(`/api/sync/sessions/${projectId}?${params}`);
94
+ return response.data.data;
95
+ }
96
+ catch (error) {
97
+ throw new Error(`Failed to get sessions: ${error instanceof Error ? error.message : 'Unknown error'}`);
98
+ }
99
+ }
100
+ // Create project in cloud
101
+ async createProject(name, description, settings) {
102
+ try {
103
+ const response = await this.api.post('/api/projects', {
104
+ name,
105
+ description,
106
+ settings
107
+ });
108
+ return response.data.data;
109
+ }
110
+ catch (error) {
111
+ throw new Error(`Failed to create project: ${error instanceof Error ? error.message : 'Unknown error'}`);
112
+ }
113
+ }
114
+ // Get user's projects
115
+ async getProjects(limit = 20, offset = 0) {
116
+ try {
117
+ const params = new URLSearchParams({
118
+ limit: limit.toString(),
119
+ offset: offset.toString()
120
+ });
121
+ const response = await this.api.get(`/api/projects?${params}`);
122
+ return response.data.data;
123
+ }
124
+ catch (error) {
125
+ throw new Error(`Failed to get projects: ${error instanceof Error ? error.message : 'Unknown error'}`);
126
+ }
127
+ }
128
+ // Get project by ID
129
+ async getProject(projectId) {
130
+ try {
131
+ const response = await this.api.get(`/api/projects/${projectId}`);
132
+ return response.data.data;
133
+ }
134
+ catch (error) {
135
+ throw new Error(`Failed to get project: ${error instanceof Error ? error.message : 'Unknown error'}`);
136
+ }
137
+ }
138
+ // Update project
139
+ async updateProject(projectId, updates) {
140
+ try {
141
+ const response = await this.api.put(`/api/projects/${projectId}`, updates);
142
+ return response.data.data;
143
+ }
144
+ catch (error) {
145
+ throw new Error(`Failed to update project: ${error instanceof Error ? error.message : 'Unknown error'}`);
146
+ }
147
+ }
148
+ // Delete project
149
+ async deleteProject(projectId) {
150
+ try {
151
+ await this.api.delete(`/api/projects/${projectId}`);
152
+ }
153
+ catch (error) {
154
+ throw new Error(`Failed to delete project: ${error instanceof Error ? error.message : 'Unknown error'}`);
155
+ }
156
+ }
157
+ // Add collaborator
158
+ async addCollaborator(projectId, email, role) {
159
+ try {
160
+ await this.api.post(`/api/projects/${projectId}/collaborators`, {
161
+ email,
162
+ role
163
+ });
164
+ }
165
+ catch (error) {
166
+ throw new Error(`Failed to add collaborator: ${error instanceof Error ? error.message : 'Unknown error'}`);
167
+ }
168
+ }
169
+ // Remove collaborator
170
+ async removeCollaborator(projectId, collaboratorId) {
171
+ try {
172
+ await this.api.delete(`/api/projects/${projectId}/collaborators/${collaboratorId}`);
173
+ }
174
+ catch (error) {
175
+ throw new Error(`Failed to remove collaborator: ${error instanceof Error ? error.message : 'Unknown error'}`);
176
+ }
177
+ }
178
+ // Test connection
179
+ async testConnection() {
180
+ try {
181
+ // Try the health endpoint at the root level
182
+ const response = await this.api.get('/health');
183
+ return response.data.success === true;
184
+ }
185
+ catch (error) {
186
+ return false;
187
+ }
188
+ }
189
+ // Verify project exists in cloud
190
+ async verifyProject(projectId) {
191
+ try {
192
+ const response = await this.api.get(`/api/projects/${projectId}`);
193
+ return response.data.success === true;
194
+ }
195
+ catch (error) {
196
+ return false;
197
+ }
198
+ }
199
+ }
200
+ //# sourceMappingURL=cloud-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloud-service.js","sourceRoot":"","sources":["../../src/lib/cloud-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAwB,MAAM,OAAO,CAAC;AAQ7C,MAAM,OAAO,YAAY;IAIvB,YAAY,MAAmB;QAC7B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC;YACtB,OAAO,EAAE,MAAM,CAAC,MAAM;YACtB,OAAO,EAAE,KAAK;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,GAAG,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,aAAa,EAAE,UAAU,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC;aACjE;SACF,CAAC,CAAC;QAEH,8CAA8C;QAC9C,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,CAChC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,EACtB,CAAC,KAAK,EAAE,EAAE;YACR,IAAI,KAAK,CAAC,QAAQ,EAAE,MAAM,KAAK,GAAG,EAAE,CAAC;gBACnC,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;YAChE,CAAC;YACD,IAAI,KAAK,CAAC,QAAQ,EAAE,MAAM,KAAK,GAAG,EAAE,CAAC;gBACnC,MAAM,IAAI,KAAK,CAAC,mEAAmE,CAAC,CAAC;YACvF,CAAC;YACD,IAAI,KAAK,CAAC,QAAQ,EAAE,MAAM,KAAK,GAAG,EAAE,CAAC;gBACnC,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;YACzC,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE,KAAK,IAAI,KAAK,CAAC,OAAO,IAAI,eAAe,CAAC,CAAC;QACnF,CAAC,CACF,CAAC;IACJ,CAAC;IAED,2BAA2B;IAC3B,QAAQ,CAAC,KAAa;QACpB,IAAI,CAAC,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC;QAC1B,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,aAAa,GAAG,UAAU,KAAK,EAAE,CAAC;IAC9D,CAAC;IAED,qCAAqC;IACrC,KAAK,CAAC,IAAI,CAAC,SAAiB,EAAE,OAAwB,EAAE,QAA0B,EAAE,KAAK,GAAG,KAAK;QAC/F,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,gBAAgB,EAAE;gBACrD,SAAS;gBACT,OAAO;gBACP,QAAQ;gBACR,KAAK;aACN,CAAC,CAAC;YAEH,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;QAC5B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,4BAA4B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC;QAC1G,CAAC;IACH,CAAC;IAED,uCAAuC;IACvC,KAAK,CAAC,IAAI,CAAC,SAAiB,EAAE,QAAiB,EAAE,KAAK,GAAG,KAAK;QAC5D,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,gBAAgB,EAAE;gBACrD,SAAS;gBACT,QAAQ;gBACR,KAAK;aACN,CAAC,CAAC;YAEH,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;QAC5B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,8BAA8B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC;QAC5G,CAAC;IACH,CAAC;IAED,kBAAkB;IAClB,KAAK,CAAC,aAAa,CAAC,SAAiB;QACnC,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,oBAAoB,SAAS,EAAE,CAAC,CAAC;YACrE,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;QAC5B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,8BAA8B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC;QAC5G,CAAC;IACH,CAAC;IAED,sBAAsB;IACtB,KAAK,CAAC,UAAU,CAAC,SAAiB,EAAE,KAAK,GAAG,EAAE,EAAE,MAAM,GAAG,CAAC,EAAE,MAAe;QACzE,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC;gBACjC,KAAK,EAAE,KAAK,CAAC,QAAQ,EAAE;gBACvB,MAAM,EAAE,MAAM,CAAC,QAAQ,EAAE;gBACzB,GAAG,CAAC,MAAM,IAAI,EAAE,MAAM,EAAE,CAAC;aAC1B,CAAC,CAAC;YAEH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,qBAAqB,SAAS,IAAI,MAAM,EAAE,CAAC,CAAC;YAChF,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;QAC5B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,0BAA0B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC;QACxG,CAAC;IACH,CAAC;IAED,uBAAuB;IACvB,KAAK,CAAC,WAAW,CAAC,SAAiB,EAAE,KAAK,GAAG,EAAE,EAAE,MAAM,GAAG,CAAC;QACzD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC;gBACjC,KAAK,EAAE,KAAK,CAAC,QAAQ,EAAE;gBACvB,MAAM,EAAE,MAAM,CAAC,QAAQ,EAAE;aAC1B,CAAC,CAAC;YAEH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,sBAAsB,SAAS,IAAI,MAAM,EAAE,CAAC,CAAC;YACjF,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;QAC5B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,2BAA2B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC;QACzG,CAAC;IACH,CAAC;IAED,0BAA0B;IAC1B,KAAK,CAAC,aAAa,CAAC,IAAY,EAAE,WAAoB,EAAE,QAAc;QACpE,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,eAAe,EAAE;gBACpD,IAAI;gBACJ,WAAW;gBACX,QAAQ;aACT,CAAC,CAAC;YAEH,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;QAC5B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,6BAA6B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC;QAC3G,CAAC;IACH,CAAC;IAED,sBAAsB;IACtB,KAAK,CAAC,WAAW,CAAC,KAAK,GAAG,EAAE,EAAE,MAAM,GAAG,CAAC;QACtC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC;gBACjC,KAAK,EAAE,KAAK,CAAC,QAAQ,EAAE;gBACvB,MAAM,EAAE,MAAM,CAAC,QAAQ,EAAE;aAC1B,CAAC,CAAC;YAEH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,iBAAiB,MAAM,EAAE,CAAC,CAAC;YAC/D,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;QAC5B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,2BAA2B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC;QACzG,CAAC;IACH,CAAC;IAED,oBAAoB;IACpB,KAAK,CAAC,UAAU,CAAC,SAAiB;QAChC,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,iBAAiB,SAAS,EAAE,CAAC,CAAC;YAClE,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;QAC5B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,0BAA0B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC;QACxG,CAAC;IACH,CAAC;IAED,iBAAiB;IACjB,KAAK,CAAC,aAAa,CAAC,SAAiB,EAAE,OAAY;QACjD,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,iBAAiB,SAAS,EAAE,EAAE,OAAO,CAAC,CAAC;YAC3E,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;QAC5B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,6BAA6B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC;QAC3G,CAAC;IACH,CAAC;IAED,iBAAiB;IACjB,KAAK,CAAC,aAAa,CAAC,SAAiB;QACnC,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,iBAAiB,SAAS,EAAE,CAAC,CAAC;QACtD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,6BAA6B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC;QAC3G,CAAC;IACH,CAAC;IAED,mBAAmB;IACnB,KAAK,CAAC,eAAe,CAAC,SAAiB,EAAE,KAAa,EAAE,IAAmC;QACzF,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,iBAAiB,SAAS,gBAAgB,EAAE;gBAC9D,KAAK;gBACL,IAAI;aACL,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,+BAA+B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC;QAC7G,CAAC;IACH,CAAC;IAED,sBAAsB;IACtB,KAAK,CAAC,kBAAkB,CAAC,SAAiB,EAAE,cAAsB;QAChE,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,iBAAiB,SAAS,kBAAkB,cAAc,EAAE,CAAC,CAAC;QACtF,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,kCAAkC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC;QAChH,CAAC;IACH,CAAC;IAED,kBAAkB;IAClB,KAAK,CAAC,cAAc;QAClB,IAAI,CAAC;YACH,4CAA4C;YAC5C,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YAC/C,OAAO,QAAQ,CAAC,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC;QACxC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,iCAAiC;IACjC,KAAK,CAAC,aAAa,CAAC,SAAiB;QACnC,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,iBAAiB,SAAS,EAAE,CAAC,CAAC;YAClE,OAAO,QAAQ,CAAC,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC;QACxC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,10 @@
1
+ export interface CursorConversation {
2
+ prompt: string;
3
+ timestamp: number;
4
+ }
5
+ export declare class CursorConversationCapture {
6
+ private getCursorDataPath;
7
+ captureRecentConversation(): Promise<CursorConversation | null>;
8
+ private parseCursorDatabase;
9
+ }
10
+ //# sourceMappingURL=cursor-conversation-capture.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cursor-conversation-capture.d.ts","sourceRoot":"","sources":["../../src/lib/cursor-conversation-capture.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,yBAAyB;IACpC,OAAO,CAAC,iBAAiB;IAanB,yBAAyB,IAAI,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC;YA0EvD,mBAAmB;CA0ClC"}
@@ -0,0 +1,117 @@
1
+ import fs from 'fs-extra';
2
+ import path from 'path';
3
+ import os from 'os';
4
+ export class CursorConversationCapture {
5
+ getCursorDataPath() {
6
+ const platform = os.platform();
7
+ const homeDir = os.homedir();
8
+ if (platform === 'darwin') {
9
+ return path.join(homeDir, 'Library', 'Application Support', 'Cursor', 'User', 'workspaceStorage');
10
+ }
11
+ else if (platform === 'win32') {
12
+ return path.join(homeDir, 'AppData', 'Roaming', 'Cursor', 'User', 'workspaceStorage');
13
+ }
14
+ else {
15
+ return path.join(homeDir, '.config', 'Cursor', 'User', 'workspaceStorage');
16
+ }
17
+ }
18
+ async captureRecentConversation() {
19
+ try {
20
+ console.log('🤖 Capturing recent Cursor conversation...');
21
+ const cursorPath = this.getCursorDataPath();
22
+ console.log('Cursor path:', cursorPath);
23
+ if (!await fs.pathExists(cursorPath)) {
24
+ console.log('❌ Cursor path does not exist');
25
+ return null;
26
+ }
27
+ // Find the database with the most recent conversation data
28
+ const workspaces = await fs.readdir(cursorPath);
29
+ console.log('Found workspaces:', workspaces.length);
30
+ let bestConversation = null;
31
+ let latestTime = 0;
32
+ for (const workspace of workspaces) {
33
+ // First, check for active state.vscdb files (current conversations)
34
+ const activeDbPath = path.join(cursorPath, workspace, 'state.vscdb');
35
+ const backupDbPath = path.join(cursorPath, workspace, 'state.vscdb.backup');
36
+ console.log(`Checking workspace: ${workspace}`);
37
+ // Try active database first
38
+ if (await fs.pathExists(activeDbPath)) {
39
+ console.log(`✅ Found active database: ${activeDbPath}`);
40
+ const stats = await fs.stat(activeDbPath);
41
+ console.log(`Active database modified: ${stats.mtime.toISOString()}`);
42
+ // Try to parse this active database
43
+ const conversation = await this.parseCursorDatabase(activeDbPath);
44
+ if (conversation && conversation.timestamp > latestTime) {
45
+ latestTime = conversation.timestamp;
46
+ bestConversation = conversation;
47
+ console.log(`✅ Found better conversation in active database: ${workspace}`);
48
+ }
49
+ }
50
+ else {
51
+ console.log(`❌ No active database found: ${activeDbPath}`);
52
+ // Fall back to backup database if no active one exists
53
+ if (await fs.pathExists(backupDbPath)) {
54
+ console.log(`📦 Found backup database: ${backupDbPath}`);
55
+ const stats = await fs.stat(backupDbPath);
56
+ console.log(`Backup database modified: ${stats.mtime.toISOString()}`);
57
+ // Try to parse this backup database
58
+ const conversation = await this.parseCursorDatabase(backupDbPath);
59
+ if (conversation && conversation.timestamp > latestTime) {
60
+ latestTime = conversation.timestamp;
61
+ bestConversation = conversation;
62
+ console.log(`✅ Found better conversation in backup database: ${workspace}`);
63
+ }
64
+ }
65
+ else {
66
+ console.log(`❌ No backup database found: ${backupDbPath}`);
67
+ }
68
+ }
69
+ }
70
+ if (!bestConversation) {
71
+ console.log('❌ No recent conversation found in any database');
72
+ return null;
73
+ }
74
+ console.log('Using conversation from database with timestamp:', new Date(bestConversation.timestamp).toISOString());
75
+ return bestConversation;
76
+ }
77
+ catch (error) {
78
+ console.error('Error capturing Cursor conversation:', error);
79
+ return null;
80
+ }
81
+ }
82
+ async parseCursorDatabase(dbPath) {
83
+ try {
84
+ const Database = (await import('better-sqlite3')).default;
85
+ const db = new Database(dbPath);
86
+ // Get the most recent prompt
87
+ const promptsResult = db.prepare("SELECT value FROM ItemTable WHERE key = 'aiService.prompts'").get();
88
+ if (!promptsResult) {
89
+ console.log('❌ No prompts found in database');
90
+ return null;
91
+ }
92
+ const prompts = JSON.parse(promptsResult.value);
93
+ console.log('Found prompts:', prompts.length);
94
+ if (prompts.length === 0) {
95
+ console.log('❌ No prompts in array');
96
+ return null;
97
+ }
98
+ // Get the MOST RECENT prompt (last in the array)
99
+ const latestPrompt = prompts[prompts.length - 1];
100
+ if (!latestPrompt || !latestPrompt.text) {
101
+ console.log('❌ Latest prompt is invalid:', latestPrompt);
102
+ return null;
103
+ }
104
+ console.log('✅ Captured prompt:', latestPrompt.text.substring(0, 100) + '...');
105
+ console.log('Prompt timestamp:', new Date(latestPrompt.unixMs || Date.now()).toISOString());
106
+ return {
107
+ prompt: latestPrompt.text,
108
+ timestamp: latestPrompt.unixMs || Date.now()
109
+ };
110
+ }
111
+ catch (error) {
112
+ console.error('Error parsing Cursor database:', error);
113
+ return null;
114
+ }
115
+ }
116
+ }
117
+ //# sourceMappingURL=cursor-conversation-capture.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cursor-conversation-capture.js","sourceRoot":"","sources":["../../src/lib/cursor-conversation-capture.ts"],"names":[],"mappings":"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"}