@buoy-design/cli 0.1.10 → 0.1.11

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 (157) hide show
  1. package/dist/cloud/client.d.ts +261 -0
  2. package/dist/cloud/client.d.ts.map +1 -0
  3. package/dist/cloud/client.js +140 -0
  4. package/dist/cloud/client.js.map +1 -0
  5. package/dist/cloud/config.d.ts +51 -0
  6. package/dist/cloud/config.d.ts.map +1 -0
  7. package/dist/cloud/config.js +98 -0
  8. package/dist/cloud/config.js.map +1 -0
  9. package/dist/cloud/index.d.ts +5 -0
  10. package/dist/cloud/index.d.ts.map +1 -0
  11. package/dist/cloud/index.js +5 -0
  12. package/dist/cloud/index.js.map +1 -0
  13. package/dist/cloud/queue.d.ts +52 -0
  14. package/dist/cloud/queue.d.ts.map +1 -0
  15. package/dist/cloud/queue.js +108 -0
  16. package/dist/cloud/queue.js.map +1 -0
  17. package/dist/cloud/sync.d.ts +75 -0
  18. package/dist/cloud/sync.d.ts.map +1 -0
  19. package/dist/cloud/sync.js +116 -0
  20. package/dist/cloud/sync.js.map +1 -0
  21. package/dist/commands/begin.d.ts +8 -0
  22. package/dist/commands/begin.d.ts.map +1 -0
  23. package/dist/commands/begin.js +380 -0
  24. package/dist/commands/begin.js.map +1 -0
  25. package/dist/commands/billing.d.ts +11 -0
  26. package/dist/commands/billing.d.ts.map +1 -0
  27. package/dist/commands/billing.js +295 -0
  28. package/dist/commands/billing.js.map +1 -0
  29. package/dist/commands/ci.d.ts.map +1 -1
  30. package/dist/commands/ci.js +18 -0
  31. package/dist/commands/ci.js.map +1 -1
  32. package/dist/commands/dock.js +1 -1
  33. package/dist/commands/drift.d.ts.map +1 -1
  34. package/dist/commands/drift.js +36 -2
  35. package/dist/commands/drift.js.map +1 -1
  36. package/dist/commands/explain.d.ts.map +1 -1
  37. package/dist/commands/explain.js +15 -3
  38. package/dist/commands/explain.js.map +1 -1
  39. package/dist/commands/github.d.ts +10 -0
  40. package/dist/commands/github.d.ts.map +1 -0
  41. package/dist/commands/github.js +223 -0
  42. package/dist/commands/github.js.map +1 -0
  43. package/dist/commands/history.d.ts +3 -0
  44. package/dist/commands/history.d.ts.map +1 -0
  45. package/dist/commands/history.js +320 -0
  46. package/dist/commands/history.js.map +1 -0
  47. package/dist/commands/index.d.ts +10 -0
  48. package/dist/commands/index.d.ts.map +1 -1
  49. package/dist/commands/index.js +11 -0
  50. package/dist/commands/index.js.map +1 -1
  51. package/dist/commands/link.d.ts +8 -0
  52. package/dist/commands/link.d.ts.map +1 -0
  53. package/dist/commands/link.js +279 -0
  54. package/dist/commands/link.js.map +1 -0
  55. package/dist/commands/login.d.ts +8 -0
  56. package/dist/commands/login.d.ts.map +1 -0
  57. package/dist/commands/login.js +143 -0
  58. package/dist/commands/login.js.map +1 -0
  59. package/dist/commands/logout.d.ts +8 -0
  60. package/dist/commands/logout.d.ts.map +1 -0
  61. package/dist/commands/logout.js +31 -0
  62. package/dist/commands/logout.js.map +1 -0
  63. package/dist/commands/scan.d.ts.map +1 -1
  64. package/dist/commands/scan.js +178 -31
  65. package/dist/commands/scan.js.map +1 -1
  66. package/dist/commands/status.d.ts.map +1 -1
  67. package/dist/commands/status.js +135 -20
  68. package/dist/commands/status.js.map +1 -1
  69. package/dist/commands/sync.d.ts +8 -0
  70. package/dist/commands/sync.d.ts.map +1 -0
  71. package/dist/commands/sync.js +126 -0
  72. package/dist/commands/sync.js.map +1 -0
  73. package/dist/commands/tokens.js +1 -1
  74. package/dist/commands/unlink.d.ts +8 -0
  75. package/dist/commands/unlink.d.ts.map +1 -0
  76. package/dist/commands/unlink.js +80 -0
  77. package/dist/commands/unlink.js.map +1 -0
  78. package/dist/commands/whoami.d.ts +8 -0
  79. package/dist/commands/whoami.d.ts.map +1 -0
  80. package/dist/commands/whoami.js +86 -0
  81. package/dist/commands/whoami.js.map +1 -0
  82. package/dist/config/auto-detect.d.ts.map +1 -1
  83. package/dist/config/auto-detect.js +9 -2
  84. package/dist/config/auto-detect.js.map +1 -1
  85. package/dist/config/loader.d.ts.map +1 -1
  86. package/dist/config/loader.js +6 -6
  87. package/dist/config/loader.js.map +1 -1
  88. package/dist/config/schema.d.ts +70 -0
  89. package/dist/config/schema.d.ts.map +1 -1
  90. package/dist/config/schema.js +8 -0
  91. package/dist/config/schema.js.map +1 -1
  92. package/dist/hooks/index.js +3 -3
  93. package/dist/index.d.ts.map +1 -1
  94. package/dist/index.js +14 -1
  95. package/dist/index.js.map +1 -1
  96. package/dist/insights/index.d.ts +3 -0
  97. package/dist/insights/index.d.ts.map +1 -0
  98. package/dist/insights/index.js +3 -0
  99. package/dist/insights/index.js.map +1 -0
  100. package/dist/insights/interactive.d.ts +11 -0
  101. package/dist/insights/interactive.d.ts.map +1 -0
  102. package/dist/insights/interactive.js +36 -0
  103. package/dist/insights/interactive.js.map +1 -0
  104. package/dist/insights/project-insights.d.ts +39 -0
  105. package/dist/insights/project-insights.d.ts.map +1 -0
  106. package/dist/insights/project-insights.js +198 -0
  107. package/dist/insights/project-insights.js.map +1 -0
  108. package/dist/integrations/github-formatter.js +4 -4
  109. package/dist/integrations/github-formatter.js.map +1 -1
  110. package/dist/output/formatters.d.ts +6 -0
  111. package/dist/output/formatters.d.ts.map +1 -1
  112. package/dist/output/formatters.js +236 -1
  113. package/dist/output/formatters.js.map +1 -1
  114. package/dist/scan/orchestrator.d.ts +14 -1
  115. package/dist/scan/orchestrator.d.ts.map +1 -1
  116. package/dist/scan/orchestrator.js +64 -4
  117. package/dist/scan/orchestrator.js.map +1 -1
  118. package/dist/services/architect.js +1 -1
  119. package/dist/services/architect.js.map +1 -1
  120. package/dist/services/drift-analysis.d.ts +3 -0
  121. package/dist/services/drift-analysis.d.ts.map +1 -1
  122. package/dist/services/drift-analysis.js +18 -2
  123. package/dist/services/drift-analysis.js.map +1 -1
  124. package/dist/store/cloud-store.d.ts +34 -0
  125. package/dist/store/cloud-store.d.ts.map +1 -0
  126. package/dist/store/cloud-store.js +100 -0
  127. package/dist/store/cloud-store.js.map +1 -0
  128. package/dist/store/index.d.ts +57 -0
  129. package/dist/store/index.d.ts.map +1 -0
  130. package/dist/store/index.js +93 -0
  131. package/dist/store/index.js.map +1 -0
  132. package/dist/store/local-store.d.ts +31 -0
  133. package/dist/store/local-store.d.ts.map +1 -0
  134. package/dist/store/local-store.js +384 -0
  135. package/dist/store/local-store.js.map +1 -0
  136. package/dist/store/types.d.ts +147 -0
  137. package/dist/store/types.d.ts.map +1 -0
  138. package/dist/store/types.js +6 -0
  139. package/dist/store/types.js.map +1 -0
  140. package/dist/wizard/ci-generator.d.ts +15 -0
  141. package/dist/wizard/ci-generator.d.ts.map +1 -0
  142. package/dist/wizard/ci-generator.js +129 -0
  143. package/dist/wizard/ci-generator.js.map +1 -0
  144. package/dist/wizard/index.d.ts +7 -0
  145. package/dist/wizard/index.d.ts.map +1 -0
  146. package/dist/wizard/index.js +7 -0
  147. package/dist/wizard/index.js.map +1 -0
  148. package/dist/wizard/issue-reviewer.d.ts +16 -0
  149. package/dist/wizard/issue-reviewer.d.ts.map +1 -0
  150. package/dist/wizard/issue-reviewer.js +183 -0
  151. package/dist/wizard/issue-reviewer.js.map +1 -0
  152. package/dist/wizard/menu.d.ts +46 -0
  153. package/dist/wizard/menu.d.ts.map +1 -0
  154. package/dist/wizard/menu.js +88 -0
  155. package/dist/wizard/menu.js.map +1 -0
  156. package/package.json +19 -15
  157. package/LICENSE +0 -21
@@ -0,0 +1 @@
1
+ {"version":3,"file":"link.d.ts","sourceRoot":"","sources":["../../src/commands/link.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA2JpC,wBAAgB,iBAAiB,IAAI,OAAO,CAyK3C"}
@@ -0,0 +1,279 @@
1
+ /**
2
+ * buoy link - Connect local project to Buoy Cloud
3
+ *
4
+ * Links the current project to a cloud project for syncing scans and drift history.
5
+ */
6
+ import { Command } from 'commander';
7
+ import { existsSync, readFileSync, writeFileSync } from 'fs';
8
+ import { join, basename } from 'path';
9
+ import { createInterface } from 'readline';
10
+ import { isLoggedIn } from '../cloud/config.js';
11
+ import { listProjects, createProject } from '../cloud/client.js';
12
+ import { spinner, success, error, info, warning, keyValue, newline, header, } from '../output/reporters.js';
13
+ const CONFIG_FILE = 'buoy.config.mjs';
14
+ /**
15
+ * Prompt for selection from a list
16
+ */
17
+ function promptSelect(question, options) {
18
+ const rl = createInterface({
19
+ input: process.stdin,
20
+ output: process.stdout,
21
+ });
22
+ console.log(question);
23
+ options.forEach((opt, i) => {
24
+ console.log(` ${i + 1}. ${opt}`);
25
+ });
26
+ return new Promise((resolve) => {
27
+ rl.question('Enter number: ', (answer) => {
28
+ rl.close();
29
+ const num = parseInt(answer.trim(), 10);
30
+ resolve(num - 1);
31
+ });
32
+ });
33
+ }
34
+ /**
35
+ * Prompt for text input
36
+ */
37
+ function prompt(question) {
38
+ const rl = createInterface({
39
+ input: process.stdin,
40
+ output: process.stdout,
41
+ });
42
+ return new Promise((resolve) => {
43
+ rl.question(question, (answer) => {
44
+ rl.close();
45
+ resolve(answer.trim());
46
+ });
47
+ });
48
+ }
49
+ /**
50
+ * Read project name from local config
51
+ */
52
+ function getLocalProjectName(cwd) {
53
+ const configPath = join(cwd, CONFIG_FILE);
54
+ if (!existsSync(configPath)) {
55
+ return null;
56
+ }
57
+ try {
58
+ const content = readFileSync(configPath, 'utf-8');
59
+ // Simple regex to extract name from config
60
+ const match = content.match(/name:\s*['"]([^'"]+)['"]/);
61
+ return match?.[1] ?? null;
62
+ }
63
+ catch {
64
+ return null;
65
+ }
66
+ }
67
+ /**
68
+ * Get existing cloud project ID from local config
69
+ */
70
+ function getCloudProjectId(cwd) {
71
+ const configPath = join(cwd, CONFIG_FILE);
72
+ if (!existsSync(configPath)) {
73
+ return null;
74
+ }
75
+ try {
76
+ const content = readFileSync(configPath, 'utf-8');
77
+ const match = content.match(/cloudProjectId:\s*['"]([^'"]+)['"]/);
78
+ return match?.[1] ?? null;
79
+ }
80
+ catch {
81
+ return null;
82
+ }
83
+ }
84
+ /**
85
+ * Add cloudProjectId to local config
86
+ */
87
+ function updateLocalConfig(cwd, projectId) {
88
+ const configPath = join(cwd, CONFIG_FILE);
89
+ if (!existsSync(configPath)) {
90
+ return false;
91
+ }
92
+ try {
93
+ let content = readFileSync(configPath, 'utf-8');
94
+ // Check if cloudProjectId already exists
95
+ if (content.includes('cloudProjectId:')) {
96
+ // Replace existing
97
+ content = content.replace(/cloudProjectId:\s*['"][^'"]*['"]/, `cloudProjectId: '${projectId}'`);
98
+ }
99
+ else {
100
+ // Add after project name or at start of project section
101
+ if (content.includes('project:')) {
102
+ // Find project section and add cloudProjectId
103
+ content = content.replace(/(project:\s*\{[^}]*name:\s*['"][^'"]+['"])/, `$1,\n cloudProjectId: '${projectId}'`);
104
+ }
105
+ else if (content.includes('name:')) {
106
+ // Add after name in root
107
+ content = content.replace(/(name:\s*['"][^'"]+['"])/, `$1,\n cloudProjectId: '${projectId}'`);
108
+ }
109
+ }
110
+ writeFileSync(configPath, content);
111
+ return true;
112
+ }
113
+ catch {
114
+ return false;
115
+ }
116
+ }
117
+ /**
118
+ * Get git remote URL for repo matching
119
+ */
120
+ function getGitRemoteUrl(cwd) {
121
+ try {
122
+ const gitConfigPath = join(cwd, '.git', 'config');
123
+ if (!existsSync(gitConfigPath))
124
+ return null;
125
+ const content = readFileSync(gitConfigPath, 'utf-8');
126
+ const match = content.match(/url\s*=\s*(.+)/);
127
+ return match?.[1]?.trim() ?? null;
128
+ }
129
+ catch {
130
+ return null;
131
+ }
132
+ }
133
+ export function createLinkCommand() {
134
+ const cmd = new Command('link');
135
+ cmd
136
+ .description('Connect local project to Buoy Cloud')
137
+ .option('--project-id <id>', 'Link to specific cloud project ID')
138
+ .option('--create', 'Create new cloud project')
139
+ .option('-y, --yes', 'Skip confirmation prompts')
140
+ .action(async (options) => {
141
+ const cwd = process.cwd();
142
+ // Check login
143
+ if (!isLoggedIn()) {
144
+ error('Not logged in');
145
+ info('Run `buoy login` first');
146
+ process.exit(1);
147
+ }
148
+ // Check for existing link
149
+ const existingId = getCloudProjectId(cwd);
150
+ if (existingId && !options.projectId) {
151
+ warning(`Already linked to cloud project: ${existingId}`);
152
+ info('Run `buoy unlink` first to disconnect');
153
+ return;
154
+ }
155
+ // Check for local config
156
+ const configPath = join(cwd, CONFIG_FILE);
157
+ if (!existsSync(configPath)) {
158
+ error('No buoy.config.mjs found');
159
+ info('Run `buoy dock` first to initialize your project');
160
+ process.exit(1);
161
+ }
162
+ const localName = getLocalProjectName(cwd) || basename(cwd);
163
+ const repoUrl = getGitRemoteUrl(cwd);
164
+ newline();
165
+ header('Buoy Cloud Link');
166
+ keyValue('Local project', localName);
167
+ if (repoUrl) {
168
+ keyValue('Repository', repoUrl);
169
+ }
170
+ newline();
171
+ let cloudProject;
172
+ if (options.projectId) {
173
+ // Direct link to specified project
174
+ info(`Linking to project ${options.projectId}...`);
175
+ // We'd fetch the project here to verify it exists
176
+ cloudProject = { id: options.projectId };
177
+ }
178
+ else if (options.create) {
179
+ // Create new cloud project
180
+ const spin = spinner('Creating cloud project...').start();
181
+ const result = await createProject({
182
+ name: localName,
183
+ repoUrl: repoUrl || undefined,
184
+ });
185
+ if (!result.ok || !result.data) {
186
+ spin.fail('Failed to create project');
187
+ error(result.error || 'Unknown error');
188
+ process.exit(1);
189
+ }
190
+ spin.succeed('Created cloud project');
191
+ cloudProject = result.data;
192
+ }
193
+ else {
194
+ // Interactive: list existing projects or create new
195
+ const spin = spinner('Fetching cloud projects...').start();
196
+ const result = await listProjects();
197
+ if (!result.ok) {
198
+ spin.fail('Failed to fetch projects');
199
+ error(result.error || 'Unknown error');
200
+ process.exit(1);
201
+ }
202
+ spin.stop();
203
+ const projects = result.data?.projects || [];
204
+ // Find matching project by name or repo URL
205
+ const matchingProject = projects.find((p) => p.name === localName || (repoUrl && p.repoUrl === repoUrl));
206
+ if (matchingProject && (options.yes || !process.stdin.isTTY)) {
207
+ // Auto-link to matching project
208
+ cloudProject = matchingProject;
209
+ info(`Found matching project: ${matchingProject.name}`);
210
+ }
211
+ else if (projects.length > 0 && process.stdin.isTTY) {
212
+ // Let user select
213
+ const projectOptions = [
214
+ ...projects.map((p) => `${p.name} (${p.id})`),
215
+ '+ Create new project',
216
+ ];
217
+ const selection = await promptSelect('Select a cloud project:', projectOptions);
218
+ if (selection === projects.length) {
219
+ // Create new
220
+ const name = await prompt(`Project name [${localName}]: `);
221
+ const projectName = name || localName;
222
+ const createSpin = spinner('Creating cloud project...').start();
223
+ const createResult = await createProject({
224
+ name: projectName,
225
+ repoUrl: repoUrl || undefined,
226
+ });
227
+ if (!createResult.ok || !createResult.data) {
228
+ createSpin.fail('Failed to create project');
229
+ error(createResult.error || 'Unknown error');
230
+ process.exit(1);
231
+ }
232
+ createSpin.succeed('Created cloud project');
233
+ cloudProject = createResult.data;
234
+ }
235
+ else if (selection >= 0 && selection < projects.length) {
236
+ cloudProject = projects[selection];
237
+ }
238
+ else {
239
+ error('Invalid selection');
240
+ process.exit(1);
241
+ }
242
+ }
243
+ else {
244
+ // No projects, create new
245
+ const spin2 = spinner('Creating cloud project...').start();
246
+ const result2 = await createProject({
247
+ name: localName,
248
+ repoUrl: repoUrl || undefined,
249
+ });
250
+ if (!result2.ok || !result2.data) {
251
+ spin2.fail('Failed to create project');
252
+ error(result2.error || 'Unknown error');
253
+ process.exit(1);
254
+ }
255
+ spin2.succeed('Created cloud project');
256
+ cloudProject = result2.data;
257
+ }
258
+ }
259
+ if (!cloudProject) {
260
+ error('No project selected');
261
+ process.exit(1);
262
+ }
263
+ // Update local config
264
+ const updated = updateLocalConfig(cwd, cloudProject.id);
265
+ if (!updated) {
266
+ warning('Could not update buoy.config.mjs automatically');
267
+ info(`Add this to your config manually:`);
268
+ info(` cloudProjectId: '${cloudProject.id}'`);
269
+ }
270
+ newline();
271
+ success(`Linked to ${cloudProject.name || cloudProject.id}`);
272
+ keyValue('Project ID', cloudProject.id);
273
+ newline();
274
+ info('Your scans will now sync to Buoy Cloud.');
275
+ info('Run `buoy scan` to upload your first scan.');
276
+ });
277
+ return cmd;
278
+ }
279
+ //# sourceMappingURL=link.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"link.js","sourceRoot":"","sources":["../../src/commands/link.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * buoy login - Authenticate with Buoy Cloud
3
+ *
4
+ * Opens browser to authenticate and saves API token locally.
5
+ */
6
+ import { Command } from 'commander';
7
+ export declare function createLoginCommand(): Command;
8
+ //# sourceMappingURL=login.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAwFpC,wBAAgB,kBAAkB,IAAI,OAAO,CA0F5C"}
@@ -0,0 +1,143 @@
1
+ /**
2
+ * buoy login - Authenticate with Buoy Cloud
3
+ *
4
+ * Opens browser to authenticate and saves API token locally.
5
+ */
6
+ import { Command } from 'commander';
7
+ import { createInterface } from 'readline';
8
+ import { exec } from 'child_process';
9
+ import { promisify } from 'util';
10
+ import { updateCloudConfig, isLoggedIn, getApiEndpoint, readCloudConfig, } from '../cloud/config.js';
11
+ import { getMe } from '../cloud/client.js';
12
+ import { spinner, error, info, warning, keyValue, newline } from '../output/reporters.js';
13
+ const execAsync = promisify(exec);
14
+ /**
15
+ * Open URL in default browser
16
+ */
17
+ async function openBrowser(url) {
18
+ const platform = process.platform;
19
+ let command;
20
+ switch (platform) {
21
+ case 'darwin':
22
+ command = `open "${url}"`;
23
+ break;
24
+ case 'win32':
25
+ command = `start "" "${url}"`;
26
+ break;
27
+ default:
28
+ command = `xdg-open "${url}"`;
29
+ }
30
+ await execAsync(command);
31
+ }
32
+ /**
33
+ * Prompt for input
34
+ */
35
+ function prompt(question) {
36
+ const rl = createInterface({
37
+ input: process.stdin,
38
+ output: process.stdout,
39
+ });
40
+ return new Promise((resolve) => {
41
+ rl.question(question, (answer) => {
42
+ rl.close();
43
+ resolve(answer.trim());
44
+ });
45
+ });
46
+ }
47
+ /**
48
+ * Validate API token by fetching user info
49
+ */
50
+ async function validateToken(token) {
51
+ // Temporarily store token to make the request
52
+ const originalConfig = readCloudConfig();
53
+ updateCloudConfig({ apiToken: token });
54
+ const result = await getMe();
55
+ if (!result.ok || !result.data) {
56
+ // Restore original config
57
+ updateCloudConfig(originalConfig);
58
+ return { valid: false };
59
+ }
60
+ return {
61
+ valid: true,
62
+ user: result.data.user,
63
+ account: result.data.account,
64
+ };
65
+ }
66
+ export function createLoginCommand() {
67
+ const cmd = new Command('login');
68
+ cmd
69
+ .description('Authenticate with Buoy Cloud')
70
+ .option('-t, --token <token>', 'API token (skip browser flow)')
71
+ .option('--no-browser', 'Do not open browser automatically')
72
+ .action(async (options) => {
73
+ // Check if already logged in
74
+ if (isLoggedIn()) {
75
+ const config = readCloudConfig();
76
+ warning('Already logged in');
77
+ if (config.email) {
78
+ keyValue('Account', config.accountName || config.email);
79
+ }
80
+ info('Run `buoy logout` to sign out first');
81
+ return;
82
+ }
83
+ let token;
84
+ if (options.token) {
85
+ // Token provided directly
86
+ token = options.token;
87
+ }
88
+ else {
89
+ // Interactive login flow
90
+ const endpoint = getApiEndpoint();
91
+ const authUrl = `${endpoint.replace('api.', 'app.')}/cli-auth`;
92
+ newline();
93
+ info('Opening browser to authenticate with Buoy Cloud...');
94
+ newline();
95
+ if (options.browser !== false) {
96
+ try {
97
+ await openBrowser(authUrl);
98
+ info('Browser opened. Complete authentication there.');
99
+ }
100
+ catch {
101
+ warning('Could not open browser automatically.');
102
+ }
103
+ }
104
+ newline();
105
+ info(`If browser didn't open, visit: ${authUrl}`);
106
+ newline();
107
+ // Prompt for token
108
+ token = await prompt('Paste your API token here: ');
109
+ if (!token) {
110
+ error('No token provided. Login cancelled.');
111
+ process.exit(1);
112
+ }
113
+ }
114
+ // Validate token
115
+ const spin = spinner('Validating token...').start();
116
+ const validation = await validateToken(token);
117
+ if (!validation.valid) {
118
+ spin.fail('Invalid token');
119
+ error('The provided token is invalid or expired.');
120
+ process.exit(1);
121
+ }
122
+ // Save config
123
+ updateCloudConfig({
124
+ apiToken: token,
125
+ userId: validation.user?.id,
126
+ email: validation.user?.email,
127
+ accountId: validation.account?.id,
128
+ accountName: validation.account?.name,
129
+ });
130
+ spin.succeed('Logged in successfully');
131
+ newline();
132
+ keyValue('Account', validation.account?.name || 'Unknown');
133
+ keyValue('Email', validation.user?.email || 'Unknown');
134
+ keyValue('Plan', validation.account?.plan || 'free');
135
+ newline();
136
+ info('You can now use:');
137
+ info(' buoy link - Connect this project to Buoy Cloud');
138
+ info(' buoy whoami - Show current user');
139
+ info(' buoy logout - Sign out');
140
+ });
141
+ return cmd;
142
+ }
143
+ //# sourceMappingURL=login.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * buoy logout - Sign out from Buoy Cloud
3
+ *
4
+ * Clears stored credentials from ~/.buoy/config.json
5
+ */
6
+ import { Command } from 'commander';
7
+ export declare function createLogoutCommand(): Command;
8
+ //# sourceMappingURL=logout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logout.d.ts","sourceRoot":"","sources":["../../src/commands/logout.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,wBAAgB,mBAAmB,IAAI,OAAO,CA2B7C"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * buoy logout - Sign out from Buoy Cloud
3
+ *
4
+ * Clears stored credentials from ~/.buoy/config.json
5
+ */
6
+ import { Command } from 'commander';
7
+ import { clearCloudConfig, isLoggedIn, readCloudConfig } from '../cloud/config.js';
8
+ import { success, info, warning } from '../output/reporters.js';
9
+ export function createLogoutCommand() {
10
+ const cmd = new Command('logout');
11
+ cmd
12
+ .description('Sign out from Buoy Cloud')
13
+ .option('-f, --force', 'Force logout without confirmation')
14
+ .action(async (options) => {
15
+ if (!isLoggedIn()) {
16
+ warning('Not logged in');
17
+ return;
18
+ }
19
+ const config = readCloudConfig();
20
+ const accountInfo = config.accountName || config.email || 'Unknown';
21
+ if (!options.force && process.stdin.isTTY) {
22
+ // Could add confirmation prompt here if desired
23
+ }
24
+ clearCloudConfig();
25
+ success(`Logged out from ${accountInfo}`);
26
+ info('Your local scan data and config are preserved.');
27
+ info('Run `buoy login` to sign in again.');
28
+ });
29
+ return cmd;
30
+ }
31
+ //# sourceMappingURL=logout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logout.js","sourceRoot":"","sources":["../../src/commands/logout.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACnF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAEhE,MAAM,UAAU,mBAAmB;IACjC,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC,CAAC;IAElC,GAAG;SACA,WAAW,CAAC,0BAA0B,CAAC;SACvC,MAAM,CAAC,aAAa,EAAE,mCAAmC,CAAC;SAC1D,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACxB,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC;YAClB,OAAO,CAAC,eAAe,CAAC,CAAC;YACzB,OAAO;QACT,CAAC;QAED,MAAM,MAAM,GAAG,eAAe,EAAE,CAAC;QACjC,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,KAAK,IAAI,SAAS,CAAC;QAEpE,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YAC1C,gDAAgD;QAClD,CAAC;QAED,gBAAgB,EAAE,CAAC;QACnB,OAAO,CAAC,mBAAmB,WAAW,EAAE,CAAC,CAAC;QAE1C,IAAI,CAAC,gDAAgD,CAAC,CAAC;QACvD,IAAI,CAAC,oCAAoC,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEL,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"scan.d.ts","sourceRoot":"","sources":["../../src/commands/scan.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAsBpC,wBAAgB,iBAAiB,IAAI,OAAO,CAkL3C"}
1
+ {"version":3,"file":"scan.d.ts","sourceRoot":"","sources":["../../src/commands/scan.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAiCpC,wBAAgB,iBAAiB,IAAI,OAAO,CA6U3C"}