vibehub-cli 1.0.43 → 1.1.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 (38) hide show
  1. package/dist/commands/clone.d.ts.map +1 -1
  2. package/dist/commands/clone.js +24 -2
  3. package/dist/commands/clone.js.map +1 -1
  4. package/dist/commands/login.d.ts +3 -0
  5. package/dist/commands/login.d.ts.map +1 -0
  6. package/dist/commands/login.js +71 -0
  7. package/dist/commands/login.js.map +1 -0
  8. package/dist/commands/logout.d.ts +3 -0
  9. package/dist/commands/logout.d.ts.map +1 -0
  10. package/dist/commands/logout.js +92 -0
  11. package/dist/commands/logout.js.map +1 -0
  12. package/dist/commands/profiles.d.ts +3 -0
  13. package/dist/commands/profiles.d.ts.map +1 -0
  14. package/dist/commands/profiles.js +77 -0
  15. package/dist/commands/profiles.js.map +1 -0
  16. package/dist/commands/use.d.ts +3 -0
  17. package/dist/commands/use.d.ts.map +1 -0
  18. package/dist/commands/use.js +83 -0
  19. package/dist/commands/use.js.map +1 -0
  20. package/dist/commands/whoami.d.ts +3 -0
  21. package/dist/commands/whoami.d.ts.map +1 -0
  22. package/dist/commands/whoami.js +105 -0
  23. package/dist/commands/whoami.js.map +1 -0
  24. package/dist/index.js +12 -0
  25. package/dist/index.js.map +1 -1
  26. package/dist/lib/auth-helper.d.ts +14 -3
  27. package/dist/lib/auth-helper.d.ts.map +1 -1
  28. package/dist/lib/auth-helper.js +111 -35
  29. package/dist/lib/auth-helper.js.map +1 -1
  30. package/dist/lib/profile-manager.d.ts +116 -0
  31. package/dist/lib/profile-manager.d.ts.map +1 -0
  32. package/dist/lib/profile-manager.js +351 -0
  33. package/dist/lib/profile-manager.js.map +1 -0
  34. package/dist/lib/supabase-auth.d.ts +42 -0
  35. package/dist/lib/supabase-auth.d.ts.map +1 -0
  36. package/dist/lib/supabase-auth.js +398 -0
  37. package/dist/lib/supabase-auth.js.map +1 -0
  38. package/package.json +4 -3
@@ -0,0 +1,351 @@
1
+ import fs from 'fs-extra';
2
+ import path from 'path';
3
+ import os from 'os';
4
+ import { createClient } from '@supabase/supabase-js';
5
+ // Supabase configuration
6
+ const SUPABASE_URL = 'https://keogzaeakmndknpgrjif.supabase.co';
7
+ const SUPABASE_ANON_KEY = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6Imtlb2d6YWVha21uZGtucGdyamlmIiwicm9sZSI6ImFub24iLCJpYXQiOjE3NTc0MTYzMjQsImV4cCI6MjA3Mjk5MjMyNH0.38TymM-WiTS3ONu2KirEGbQT3XwRqSC5UBhZCQnlwO0';
8
+ /**
9
+ * ProfileManager handles multi-profile authentication token storage and management.
10
+ *
11
+ * Storage structure:
12
+ * ~/.vibehub/
13
+ * ├── config.json # Global settings (defaultProfile, version)
14
+ * └── profiles/
15
+ * ├── default.json # Default profile tokens
16
+ * └── work.json # Named profile tokens
17
+ *
18
+ * Project-level override:
19
+ * project/.vibehub/config.json # Contains "profile" field to override default
20
+ */
21
+ export class ProfileManager {
22
+ constructor() {
23
+ this.baseDir = path.join(os.homedir(), '.vibehub');
24
+ this.configPath = path.join(this.baseDir, 'config.json');
25
+ this.profilesDir = path.join(this.baseDir, 'profiles');
26
+ this.supabase = createClient(SUPABASE_URL, SUPABASE_ANON_KEY);
27
+ }
28
+ /**
29
+ * Ensure the profile directories exist
30
+ */
31
+ async ensureDirectories() {
32
+ await fs.ensureDir(this.baseDir);
33
+ await fs.ensureDir(this.profilesDir);
34
+ }
35
+ /**
36
+ * Get the global configuration
37
+ */
38
+ async getGlobalConfig() {
39
+ try {
40
+ await this.ensureDirectories();
41
+ if (await fs.pathExists(this.configPath)) {
42
+ return await fs.readJson(this.configPath);
43
+ }
44
+ }
45
+ catch {
46
+ // Return default config if file doesn't exist or is invalid
47
+ }
48
+ return {
49
+ version: '2.0',
50
+ defaultProfile: 'default'
51
+ };
52
+ }
53
+ /**
54
+ * Save the global configuration
55
+ */
56
+ async saveGlobalConfig(config) {
57
+ await this.ensureDirectories();
58
+ await fs.writeJson(this.configPath, config, { spaces: 2 });
59
+ }
60
+ /**
61
+ * Get a profile by name
62
+ */
63
+ async getProfile(name) {
64
+ try {
65
+ const profilePath = path.join(this.profilesDir, `${name}.json`);
66
+ if (await fs.pathExists(profilePath)) {
67
+ return await fs.readJson(profilePath);
68
+ }
69
+ }
70
+ catch {
71
+ // Profile doesn't exist or is invalid
72
+ }
73
+ return null;
74
+ }
75
+ /**
76
+ * Save a profile
77
+ */
78
+ async saveProfile(name, data) {
79
+ await this.ensureDirectories();
80
+ const profilePath = path.join(this.profilesDir, `${name}.json`);
81
+ const profile = {
82
+ ...data,
83
+ name,
84
+ lastUsedAt: new Date().toISOString()
85
+ };
86
+ await fs.writeJson(profilePath, profile, { spaces: 2 });
87
+ // Update global config if this is the first profile
88
+ const config = await this.getGlobalConfig();
89
+ if (!config.defaultProfile || !(await this.getProfile(config.defaultProfile))) {
90
+ config.defaultProfile = name;
91
+ await this.saveGlobalConfig(config);
92
+ }
93
+ }
94
+ /**
95
+ * Delete a profile
96
+ */
97
+ async deleteProfile(name) {
98
+ const profilePath = path.join(this.profilesDir, `${name}.json`);
99
+ if (await fs.pathExists(profilePath)) {
100
+ await fs.remove(profilePath);
101
+ // If deleting the default profile, update config
102
+ const config = await this.getGlobalConfig();
103
+ if (config.defaultProfile === name) {
104
+ const profiles = await this.listProfiles();
105
+ config.defaultProfile = profiles.length > 0 ? profiles[0].name : 'default';
106
+ await this.saveGlobalConfig(config);
107
+ }
108
+ return true;
109
+ }
110
+ return false;
111
+ }
112
+ /**
113
+ * List all profiles
114
+ */
115
+ async listProfiles() {
116
+ try {
117
+ await this.ensureDirectories();
118
+ const files = await fs.readdir(this.profilesDir);
119
+ const profiles = [];
120
+ for (const file of files) {
121
+ if (file.endsWith('.json')) {
122
+ try {
123
+ const profile = await fs.readJson(path.join(this.profilesDir, file));
124
+ profiles.push(profile);
125
+ }
126
+ catch {
127
+ // Skip invalid profile files
128
+ }
129
+ }
130
+ }
131
+ return profiles.sort((a, b) => new Date(b.lastUsedAt).getTime() - new Date(a.lastUsedAt).getTime());
132
+ }
133
+ catch {
134
+ return [];
135
+ }
136
+ }
137
+ /**
138
+ * Delete all profiles
139
+ */
140
+ async deleteAllProfiles() {
141
+ const profiles = await this.listProfiles();
142
+ let count = 0;
143
+ for (const profile of profiles) {
144
+ if (await this.deleteProfile(profile.name)) {
145
+ count++;
146
+ }
147
+ }
148
+ return count;
149
+ }
150
+ /**
151
+ * Get the project-level profile override (if any)
152
+ */
153
+ async getProjectProfile(projectPath) {
154
+ try {
155
+ const searchPath = projectPath || process.cwd();
156
+ // Check for .vibehub/config.json in project
157
+ const projectConfigPath = path.join(searchPath, '.vibehub', 'config.json');
158
+ if (await fs.pathExists(projectConfigPath)) {
159
+ const projectConfig = await fs.readJson(projectConfigPath);
160
+ if (projectConfig.profile) {
161
+ return projectConfig.profile;
162
+ }
163
+ }
164
+ // Also check vibehub.json for backward compatibility
165
+ const vibehubConfigPath = path.join(searchPath, '.vibehub', 'vibehub.json');
166
+ if (await fs.pathExists(vibehubConfigPath)) {
167
+ const vibehubConfig = await fs.readJson(vibehubConfigPath);
168
+ if (vibehubConfig.profile) {
169
+ return vibehubConfig.profile;
170
+ }
171
+ }
172
+ }
173
+ catch {
174
+ // No project profile set
175
+ }
176
+ return null;
177
+ }
178
+ /**
179
+ * Set the profile for the current project
180
+ */
181
+ async setProjectProfile(profileName, projectPath) {
182
+ const searchPath = projectPath || process.cwd();
183
+ const configDir = path.join(searchPath, '.vibehub');
184
+ const configPath = path.join(configDir, 'config.json');
185
+ await fs.ensureDir(configDir);
186
+ // Load existing config or create new
187
+ let config = {};
188
+ try {
189
+ if (await fs.pathExists(configPath)) {
190
+ config = await fs.readJson(configPath);
191
+ }
192
+ }
193
+ catch {
194
+ // Start with empty config
195
+ }
196
+ config.profile = profileName;
197
+ await fs.writeJson(configPath, config, { spaces: 2 });
198
+ }
199
+ /**
200
+ * Clear the project profile override
201
+ */
202
+ async clearProjectProfile(projectPath) {
203
+ const searchPath = projectPath || process.cwd();
204
+ const configPath = path.join(searchPath, '.vibehub', 'config.json');
205
+ try {
206
+ if (await fs.pathExists(configPath)) {
207
+ const config = await fs.readJson(configPath);
208
+ delete config.profile;
209
+ await fs.writeJson(configPath, config, { spaces: 2 });
210
+ }
211
+ }
212
+ catch {
213
+ // No config to update
214
+ }
215
+ }
216
+ /**
217
+ * Get the active profile (project-level override or default)
218
+ */
219
+ async getActiveProfile(projectPath) {
220
+ // 1. Check for project-level override
221
+ const projectProfileName = await this.getProjectProfile(projectPath);
222
+ if (projectProfileName) {
223
+ const profile = await this.getProfile(projectProfileName);
224
+ if (profile) {
225
+ return profile;
226
+ }
227
+ // Project specifies a profile that doesn't exist
228
+ console.warn(`Warning: Project specifies profile '${projectProfileName}' but it doesn't exist.`);
229
+ }
230
+ // 2. Fall back to default profile
231
+ const config = await this.getGlobalConfig();
232
+ return await this.getProfile(config.defaultProfile);
233
+ }
234
+ /**
235
+ * Check if a token is expired or about to expire
236
+ */
237
+ isTokenExpired(profile, bufferMinutes = 5) {
238
+ const expiresAt = new Date(profile.tokenExpiresAt);
239
+ const now = new Date();
240
+ const bufferMs = bufferMinutes * 60 * 1000;
241
+ return expiresAt.getTime() - now.getTime() <= bufferMs;
242
+ }
243
+ /**
244
+ * Refresh tokens if needed (silent refresh using refresh token)
245
+ */
246
+ async refreshTokenIfNeeded(profile) {
247
+ if (!this.isTokenExpired(profile)) {
248
+ // Update last used time
249
+ profile.lastUsedAt = new Date().toISOString();
250
+ await this.saveProfile(profile.name, profile);
251
+ return profile;
252
+ }
253
+ // Token is expired or about to expire, refresh it
254
+ try {
255
+ const { data, error } = await this.supabase.auth.setSession({
256
+ access_token: profile.accessToken,
257
+ refresh_token: profile.refreshToken
258
+ });
259
+ if (error || !data.session) {
260
+ throw new Error(error?.message || 'Failed to refresh session');
261
+ }
262
+ // Update profile with new tokens
263
+ const updatedProfile = {
264
+ ...profile,
265
+ accessToken: data.session.access_token,
266
+ refreshToken: data.session.refresh_token || profile.refreshToken,
267
+ tokenExpiresAt: new Date(data.session.expires_at * 1000).toISOString(),
268
+ lastUsedAt: new Date().toISOString()
269
+ };
270
+ await this.saveProfile(profile.name, updatedProfile);
271
+ return updatedProfile;
272
+ }
273
+ catch (error) {
274
+ throw new Error(`Token refresh failed: ${error.message}. Please run 'vibe login' again.`);
275
+ }
276
+ }
277
+ /**
278
+ * Check if migration from old format is needed and perform it
279
+ */
280
+ async migrateIfNeeded() {
281
+ try {
282
+ // Check for old-style config with user.token
283
+ const oldConfigPath = path.join(this.baseDir, 'config.json');
284
+ if (!await fs.pathExists(oldConfigPath)) {
285
+ return false;
286
+ }
287
+ const oldConfig = await fs.readJson(oldConfigPath);
288
+ // Check if already migrated (has version 2.0)
289
+ if (oldConfig.version === '2.0') {
290
+ return false;
291
+ }
292
+ // Check for old user token format
293
+ if (oldConfig.user?.token) {
294
+ // Create backup
295
+ const backupPath = path.join(this.baseDir, 'config.backup.json');
296
+ await fs.copy(oldConfigPath, backupPath);
297
+ // Update config to new format
298
+ const newConfig = {
299
+ version: '2.0',
300
+ defaultProfile: 'default',
301
+ migratedFrom: '1.0'
302
+ };
303
+ await this.saveGlobalConfig(newConfig);
304
+ return true; // Migration needed - caller should prompt for re-authentication
305
+ }
306
+ return false;
307
+ }
308
+ catch {
309
+ return false;
310
+ }
311
+ }
312
+ /**
313
+ * Get the profile status (for display)
314
+ */
315
+ getProfileStatus(profile) {
316
+ const expiresAt = new Date(profile.tokenExpiresAt);
317
+ const now = new Date();
318
+ const diffMs = expiresAt.getTime() - now.getTime();
319
+ if (diffMs <= 0) {
320
+ return 'expired';
321
+ }
322
+ else if (diffMs <= 10 * 60 * 1000) { // 10 minutes
323
+ return 'expiring';
324
+ }
325
+ return 'active';
326
+ }
327
+ /**
328
+ * Get time until token expires (formatted string)
329
+ */
330
+ getTokenExpiryString(profile) {
331
+ const expiresAt = new Date(profile.tokenExpiresAt);
332
+ const now = new Date();
333
+ const diffMs = expiresAt.getTime() - now.getTime();
334
+ if (diffMs <= 0) {
335
+ return 'Expired';
336
+ }
337
+ const minutes = Math.floor(diffMs / 60000);
338
+ const hours = Math.floor(minutes / 60);
339
+ const days = Math.floor(hours / 24);
340
+ if (days > 0) {
341
+ return `${days} day${days > 1 ? 's' : ''}`;
342
+ }
343
+ else if (hours > 0) {
344
+ return `${hours} hour${hours > 1 ? 's' : ''}`;
345
+ }
346
+ else {
347
+ return `${minutes} minute${minutes > 1 ? 's' : ''}`;
348
+ }
349
+ }
350
+ }
351
+ //# sourceMappingURL=profile-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profile-manager.js","sourceRoot":"","sources":["../../src/lib/profile-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ import type { ProfileData } from './profile-manager.js';
2
+ /**
3
+ * SupabaseAuth handles browser-based Google OAuth authentication for CLI.
4
+ *
5
+ * Flow:
6
+ * 1. Start local HTTP server on localhost:54321
7
+ * 2. Generate PKCE code verifier and challenge
8
+ * 3. Open browser to Supabase OAuth URL with Google provider
9
+ * 4. User authenticates with Google
10
+ * 5. Supabase redirects to localhost:54321/callback with code
11
+ * 6. CLI exchanges code for session tokens
12
+ * 7. Return tokens to caller
13
+ */
14
+ export declare class SupabaseAuth {
15
+ private supabase;
16
+ constructor();
17
+ /**
18
+ * Initiate Google OAuth login flow via browser
19
+ */
20
+ loginWithGoogle(): Promise<Omit<ProfileData, 'name'>>;
21
+ /**
22
+ * Refresh an existing session using refresh token
23
+ */
24
+ refreshSession(refreshToken: string): Promise<Omit<ProfileData, 'name'>>;
25
+ /**
26
+ * Sign out from Supabase (invalidate tokens)
27
+ */
28
+ signOut(): Promise<void>;
29
+ /**
30
+ * Get success HTML page for browser
31
+ */
32
+ private getSuccessHtml;
33
+ /**
34
+ * Get error HTML page for browser
35
+ */
36
+ private getErrorHtml;
37
+ }
38
+ /**
39
+ * Get the OAuth URL for manual browser opening (fallback)
40
+ */
41
+ export declare function getOAuthUrl(): string;
42
+ //# sourceMappingURL=supabase-auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supabase-auth.d.ts","sourceRoot":"","sources":["../../src/lib/supabase-auth.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AA+BxD;;;;;;;;;;;GAWG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAiB;;IAMjC;;OAEG;IACG,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IA8I3D;;OAEG;IACG,cAAc,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IAuB9E;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAI9B;;OAEG;IACH,OAAO,CAAC,cAAc;IA+FtB;;OAEG;IACH,OAAO,CAAC,YAAY;CAqFrB;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,MAAM,CAGpC"}