@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.
- package/dist/cloud/client.d.ts +261 -0
- package/dist/cloud/client.d.ts.map +1 -0
- package/dist/cloud/client.js +140 -0
- package/dist/cloud/client.js.map +1 -0
- package/dist/cloud/config.d.ts +51 -0
- package/dist/cloud/config.d.ts.map +1 -0
- package/dist/cloud/config.js +98 -0
- package/dist/cloud/config.js.map +1 -0
- package/dist/cloud/index.d.ts +5 -0
- package/dist/cloud/index.d.ts.map +1 -0
- package/dist/cloud/index.js +5 -0
- package/dist/cloud/index.js.map +1 -0
- package/dist/cloud/queue.d.ts +52 -0
- package/dist/cloud/queue.d.ts.map +1 -0
- package/dist/cloud/queue.js +108 -0
- package/dist/cloud/queue.js.map +1 -0
- package/dist/cloud/sync.d.ts +75 -0
- package/dist/cloud/sync.d.ts.map +1 -0
- package/dist/cloud/sync.js +116 -0
- package/dist/cloud/sync.js.map +1 -0
- package/dist/commands/begin.d.ts +8 -0
- package/dist/commands/begin.d.ts.map +1 -0
- package/dist/commands/begin.js +380 -0
- package/dist/commands/begin.js.map +1 -0
- package/dist/commands/billing.d.ts +11 -0
- package/dist/commands/billing.d.ts.map +1 -0
- package/dist/commands/billing.js +295 -0
- package/dist/commands/billing.js.map +1 -0
- package/dist/commands/ci.d.ts.map +1 -1
- package/dist/commands/ci.js +18 -0
- package/dist/commands/ci.js.map +1 -1
- package/dist/commands/dock.js +1 -1
- package/dist/commands/drift.d.ts.map +1 -1
- package/dist/commands/drift.js +36 -2
- package/dist/commands/drift.js.map +1 -1
- package/dist/commands/explain.d.ts.map +1 -1
- package/dist/commands/explain.js +15 -3
- package/dist/commands/explain.js.map +1 -1
- package/dist/commands/github.d.ts +10 -0
- package/dist/commands/github.d.ts.map +1 -0
- package/dist/commands/github.js +223 -0
- package/dist/commands/github.js.map +1 -0
- package/dist/commands/history.d.ts +3 -0
- package/dist/commands/history.d.ts.map +1 -0
- package/dist/commands/history.js +320 -0
- package/dist/commands/history.js.map +1 -0
- package/dist/commands/index.d.ts +10 -0
- package/dist/commands/index.d.ts.map +1 -1
- package/dist/commands/index.js +11 -0
- package/dist/commands/index.js.map +1 -1
- package/dist/commands/link.d.ts +8 -0
- package/dist/commands/link.d.ts.map +1 -0
- package/dist/commands/link.js +279 -0
- package/dist/commands/link.js.map +1 -0
- package/dist/commands/login.d.ts +8 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +143 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/logout.d.ts +8 -0
- package/dist/commands/logout.d.ts.map +1 -0
- package/dist/commands/logout.js +31 -0
- package/dist/commands/logout.js.map +1 -0
- package/dist/commands/scan.d.ts.map +1 -1
- package/dist/commands/scan.js +178 -31
- package/dist/commands/scan.js.map +1 -1
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +135 -20
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/sync.d.ts +8 -0
- package/dist/commands/sync.d.ts.map +1 -0
- package/dist/commands/sync.js +126 -0
- package/dist/commands/sync.js.map +1 -0
- package/dist/commands/tokens.js +1 -1
- package/dist/commands/unlink.d.ts +8 -0
- package/dist/commands/unlink.d.ts.map +1 -0
- package/dist/commands/unlink.js +80 -0
- package/dist/commands/unlink.js.map +1 -0
- package/dist/commands/whoami.d.ts +8 -0
- package/dist/commands/whoami.d.ts.map +1 -0
- package/dist/commands/whoami.js +86 -0
- package/dist/commands/whoami.js.map +1 -0
- package/dist/config/auto-detect.d.ts.map +1 -1
- package/dist/config/auto-detect.js +9 -2
- package/dist/config/auto-detect.js.map +1 -1
- package/dist/config/loader.d.ts.map +1 -1
- package/dist/config/loader.js +6 -6
- package/dist/config/loader.js.map +1 -1
- package/dist/config/schema.d.ts +70 -0
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +8 -0
- package/dist/config/schema.js.map +1 -1
- package/dist/hooks/index.js +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +14 -1
- package/dist/index.js.map +1 -1
- package/dist/insights/index.d.ts +3 -0
- package/dist/insights/index.d.ts.map +1 -0
- package/dist/insights/index.js +3 -0
- package/dist/insights/index.js.map +1 -0
- package/dist/insights/interactive.d.ts +11 -0
- package/dist/insights/interactive.d.ts.map +1 -0
- package/dist/insights/interactive.js +36 -0
- package/dist/insights/interactive.js.map +1 -0
- package/dist/insights/project-insights.d.ts +39 -0
- package/dist/insights/project-insights.d.ts.map +1 -0
- package/dist/insights/project-insights.js +198 -0
- package/dist/insights/project-insights.js.map +1 -0
- package/dist/integrations/github-formatter.js +4 -4
- package/dist/integrations/github-formatter.js.map +1 -1
- package/dist/output/formatters.d.ts +6 -0
- package/dist/output/formatters.d.ts.map +1 -1
- package/dist/output/formatters.js +236 -1
- package/dist/output/formatters.js.map +1 -1
- package/dist/scan/orchestrator.d.ts +14 -1
- package/dist/scan/orchestrator.d.ts.map +1 -1
- package/dist/scan/orchestrator.js +64 -4
- package/dist/scan/orchestrator.js.map +1 -1
- package/dist/services/architect.js +1 -1
- package/dist/services/architect.js.map +1 -1
- package/dist/services/drift-analysis.d.ts +3 -0
- package/dist/services/drift-analysis.d.ts.map +1 -1
- package/dist/services/drift-analysis.js +18 -2
- package/dist/services/drift-analysis.js.map +1 -1
- package/dist/store/cloud-store.d.ts +34 -0
- package/dist/store/cloud-store.d.ts.map +1 -0
- package/dist/store/cloud-store.js +100 -0
- package/dist/store/cloud-store.js.map +1 -0
- package/dist/store/index.d.ts +57 -0
- package/dist/store/index.d.ts.map +1 -0
- package/dist/store/index.js +93 -0
- package/dist/store/index.js.map +1 -0
- package/dist/store/local-store.d.ts +31 -0
- package/dist/store/local-store.d.ts.map +1 -0
- package/dist/store/local-store.js +384 -0
- package/dist/store/local-store.js.map +1 -0
- package/dist/store/types.d.ts +147 -0
- package/dist/store/types.d.ts.map +1 -0
- package/dist/store/types.js +6 -0
- package/dist/store/types.js.map +1 -0
- package/dist/wizard/ci-generator.d.ts +15 -0
- package/dist/wizard/ci-generator.d.ts.map +1 -0
- package/dist/wizard/ci-generator.js +129 -0
- package/dist/wizard/ci-generator.js.map +1 -0
- package/dist/wizard/index.d.ts +7 -0
- package/dist/wizard/index.d.ts.map +1 -0
- package/dist/wizard/index.js +7 -0
- package/dist/wizard/index.js.map +1 -0
- package/dist/wizard/issue-reviewer.d.ts +16 -0
- package/dist/wizard/issue-reviewer.d.ts.map +1 -0
- package/dist/wizard/issue-reviewer.js +183 -0
- package/dist/wizard/issue-reviewer.js.map +1 -0
- package/dist/wizard/menu.d.ts +46 -0
- package/dist/wizard/menu.d.ts.map +1 -0
- package/dist/wizard/menu.js +88 -0
- package/dist/wizard/menu.js.map +1 -0
- package/package.json +19 -15
- 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":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AAC7D,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AACtC,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,aAAa,EAAgB,MAAM,oBAAoB,CAAC;AAC/E,OAAO,EACL,OAAO,EACP,OAAO,EACP,KAAK,EACL,IAAI,EACJ,OAAO,EACP,QAAQ,EACR,OAAO,EACP,MAAM,GACP,MAAM,wBAAwB,CAAC;AAEhC,MAAM,WAAW,GAAG,iBAAiB,CAAC;AAEtC;;GAEG;AACH,SAAS,YAAY,CAAC,QAAgB,EAAE,OAAiB;IACvD,MAAM,EAAE,GAAG,eAAe,CAAC;QACzB,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC,CAAC;IAEH,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACtB,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE;QACzB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,EAAE,CAAC,QAAQ,CAAC,gBAAgB,EAAE,CAAC,MAAM,EAAE,EAAE;YACvC,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,GAAG,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;YACxC,OAAO,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;QACnB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,SAAS,MAAM,CAAC,QAAgB;IAC9B,MAAM,EAAE,GAAG,eAAe,CAAC;QACzB,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC,CAAC;IAEH,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,EAAE;YAC/B,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QACzB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,SAAS,mBAAmB,CAAC,GAAW;IACtC,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;IAC1C,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAClD,2CAA2C;QAC3C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;QACxD,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,iBAAiB,CAAC,GAAW;IACpC,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;IAC1C,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAClD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAC;QAClE,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,iBAAiB,CAAC,GAAW,EAAE,SAAiB;IACvD,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;IAC1C,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,CAAC;QACH,IAAI,OAAO,GAAG,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAEhD,yCAAyC;QACzC,IAAI,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC;YACxC,mBAAmB;YACnB,OAAO,GAAG,OAAO,CAAC,OAAO,CACvB,kCAAkC,EAClC,oBAAoB,SAAS,GAAG,CACjC,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,wDAAwD;YACxD,IAAI,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;gBACjC,8CAA8C;gBAC9C,OAAO,GAAG,OAAO,CAAC,OAAO,CACvB,4CAA4C,EAC5C,6BAA6B,SAAS,GAAG,CAC1C,CAAC;YACJ,CAAC;iBAAM,IAAI,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;gBACrC,yBAAyB;gBACzB,OAAO,GAAG,OAAO,CAAC,OAAO,CACvB,0BAA0B,EAC1B,2BAA2B,SAAS,GAAG,CACxC,CAAC;YACJ,CAAC;QACH,CAAC;QAED,aAAa,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QACnC,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,eAAe,CAAC,GAAW;IAClC,IAAI,CAAC;QACH,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;QAClD,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC;YAAE,OAAO,IAAI,CAAC;QAE5C,MAAM,OAAO,GAAG,YAAY,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;QACrD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;QAC9C,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC;IACpC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAEhC,GAAG;SACA,WAAW,CAAC,qCAAqC,CAAC;SAClD,MAAM,CAAC,mBAAmB,EAAE,mCAAmC,CAAC;SAChE,MAAM,CAAC,UAAU,EAAE,0BAA0B,CAAC;SAC9C,MAAM,CAAC,WAAW,EAAE,2BAA2B,CAAC;SAChD,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACxB,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;QAE1B,cAAc;QACd,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC;YAClB,KAAK,CAAC,eAAe,CAAC,CAAC;YACvB,IAAI,CAAC,wBAAwB,CAAC,CAAC;YAC/B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,0BAA0B;QAC1B,MAAM,UAAU,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;QAC1C,IAAI,UAAU,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;YACrC,OAAO,CAAC,oCAAoC,UAAU,EAAE,CAAC,CAAC;YAC1D,IAAI,CAAC,uCAAuC,CAAC,CAAC;YAC9C,OAAO;QACT,CAAC;QAED,yBAAyB;QACzB,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;QAC1C,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC5B,KAAK,CAAC,0BAA0B,CAAC,CAAC;YAClC,IAAI,CAAC,kDAAkD,CAAC,CAAC;YACzD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,SAAS,GAAG,mBAAmB,CAAC,GAAG,CAAC,IAAI,QAAQ,CAAC,GAAG,CAAC,CAAC;QAC5D,MAAM,OAAO,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;QAErC,OAAO,EAAE,CAAC;QACV,MAAM,CAAC,iBAAiB,CAAC,CAAC;QAC1B,QAAQ,CAAC,eAAe,EAAE,SAAS,CAAC,CAAC;QACrC,IAAI,OAAO,EAAE,CAAC;YACZ,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QAClC,CAAC;QACD,OAAO,EAAE,CAAC;QAEV,IAAI,YAAiC,CAAC;QAEtC,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;YACtB,mCAAmC;YACnC,IAAI,CAAC,sBAAsB,OAAO,CAAC,SAAS,KAAK,CAAC,CAAC;YACnD,kDAAkD;YAClD,YAAY,GAAG,EAAE,EAAE,EAAE,OAAO,CAAC,SAAS,EAAa,CAAC;QACtD,CAAC;aAAM,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YAC1B,2BAA2B;YAC3B,MAAM,IAAI,GAAG,OAAO,CAAC,2BAA2B,CAAC,CAAC,KAAK,EAAE,CAAC;YAE1D,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC;gBACjC,IAAI,EAAE,SAAS;gBACf,OAAO,EAAE,OAAO,IAAI,SAAS;aAC9B,CAAC,CAAC;YAEH,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;gBAC/B,IAAI,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;gBACtC,KAAK,CAAC,MAAM,CAAC,KAAK,IAAI,eAAe,CAAC,CAAC;gBACvC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YAED,IAAI,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAC;YACtC,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC;QAC7B,CAAC;aAAM,CAAC;YACN,oDAAoD;YACpD,MAAM,IAAI,GAAG,OAAO,CAAC,4BAA4B,CAAC,CAAC,KAAK,EAAE,CAAC;YAC3D,MAAM,MAAM,GAAG,MAAM,YAAY,EAAE,CAAC;YAEpC,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;gBACf,IAAI,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;gBACtC,KAAK,CAAC,MAAM,CAAC,KAAK,IAAI,eAAe,CAAC,CAAC;gBACvC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YAED,IAAI,CAAC,IAAI,EAAE,CAAC;YAEZ,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,EAAE,QAAQ,IAAI,EAAE,CAAC;YAE7C,4CAA4C;YAC5C,MAAM,eAAe,GAAG,QAAQ,CAAC,IAAI,CACnC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,CAClE,CAAC;YAEF,IAAI,eAAe,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC7D,gCAAgC;gBAChC,YAAY,GAAG,eAAe,CAAC;gBAC/B,IAAI,CAAC,2BAA2B,eAAe,CAAC,IAAI,EAAE,CAAC,CAAC;YAC1D,CAAC;iBAAM,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;gBACtD,kBAAkB;gBAClB,MAAM,cAAc,GAAG;oBACrB,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;oBAC7C,sBAAsB;iBACvB,CAAC;gBAEF,MAAM,SAAS,GAAG,MAAM,YAAY,CAAC,yBAAyB,EAAE,cAAc,CAAC,CAAC;gBAEhF,IAAI,SAAS,KAAK,QAAQ,CAAC,MAAM,EAAE,CAAC;oBAClC,aAAa;oBACb,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,iBAAiB,SAAS,KAAK,CAAC,CAAC;oBAC3D,MAAM,WAAW,GAAG,IAAI,IAAI,SAAS,CAAC;oBAEtC,MAAM,UAAU,GAAG,OAAO,CAAC,2BAA2B,CAAC,CAAC,KAAK,EAAE,CAAC;oBAChE,MAAM,YAAY,GAAG,MAAM,aAAa,CAAC;wBACvC,IAAI,EAAE,WAAW;wBACjB,OAAO,EAAE,OAAO,IAAI,SAAS;qBAC9B,CAAC,CAAC;oBAEH,IAAI,CAAC,YAAY,CAAC,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;wBAC3C,UAAU,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;wBAC5C,KAAK,CAAC,YAAY,CAAC,KAAK,IAAI,eAAe,CAAC,CAAC;wBAC7C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;oBAClB,CAAC;oBAED,UAAU,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAC;oBAC5C,YAAY,GAAG,YAAY,CAAC,IAAI,CAAC;gBACnC,CAAC;qBAAM,IAAI,SAAS,IAAI,CAAC,IAAI,SAAS,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC;oBACzD,YAAY,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC;gBACrC,CAAC;qBAAM,CAAC;oBACN,KAAK,CAAC,mBAAmB,CAAC,CAAC;oBAC3B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAClB,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,0BAA0B;gBAC1B,MAAM,KAAK,GAAG,OAAO,CAAC,2BAA2B,CAAC,CAAC,KAAK,EAAE,CAAC;gBAC3D,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC;oBAClC,IAAI,EAAE,SAAS;oBACf,OAAO,EAAE,OAAO,IAAI,SAAS;iBAC9B,CAAC,CAAC;gBAEH,IAAI,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;oBACjC,KAAK,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;oBACvC,KAAK,CAAC,OAAO,CAAC,KAAK,IAAI,eAAe,CAAC,CAAC;oBACxC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAClB,CAAC;gBAED,KAAK,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAC;gBACvC,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;YAC9B,CAAC;QACH,CAAC;QAED,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,KAAK,CAAC,qBAAqB,CAAC,CAAC;YAC7B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,sBAAsB;QACtB,MAAM,OAAO,GAAG,iBAAiB,CAAC,GAAG,EAAE,YAAY,CAAC,EAAE,CAAC,CAAC;QACxD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,CAAC,gDAAgD,CAAC,CAAC;YAC1D,IAAI,CAAC,mCAAmC,CAAC,CAAC;YAC1C,IAAI,CAAC,sBAAsB,YAAY,CAAC,EAAE,GAAG,CAAC,CAAC;QACjD,CAAC;QAED,OAAO,EAAE,CAAC;QACV,OAAO,CAAC,aAAa,YAAY,CAAC,IAAI,IAAI,YAAY,CAAC,EAAE,EAAE,CAAC,CAAC;QAC7D,QAAQ,CAAC,YAAY,EAAE,YAAY,CAAC,EAAE,CAAC,CAAC;QAExC,OAAO,EAAE,CAAC;QACV,IAAI,CAAC,yCAAyC,CAAC,CAAC;QAChD,IAAI,CAAC,4CAA4C,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEL,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -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":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAC3C,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AACjC,OAAO,EACL,iBAAiB,EACjB,UAAU,EACV,cAAc,EACd,eAAe,GAChB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAE1F,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;AAElC;;GAEG;AACH,KAAK,UAAU,WAAW,CAAC,GAAW;IACpC,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IAClC,IAAI,OAAe,CAAC;IAEpB,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,QAAQ;YACX,OAAO,GAAG,SAAS,GAAG,GAAG,CAAC;YAC1B,MAAM;QACR,KAAK,OAAO;YACV,OAAO,GAAG,aAAa,GAAG,GAAG,CAAC;YAC9B,MAAM;QACR;YACE,OAAO,GAAG,aAAa,GAAG,GAAG,CAAC;IAClC,CAAC;IAED,MAAM,SAAS,CAAC,OAAO,CAAC,CAAC;AAC3B,CAAC;AAED;;GAEG;AACH,SAAS,MAAM,CAAC,QAAgB;IAC9B,MAAM,EAAE,GAAG,eAAe,CAAC;QACzB,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC,CAAC;IAEH,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,EAAE;YAC/B,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QACzB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,aAAa,CAAC,KAAa;IAaxC,8CAA8C;IAC9C,MAAM,cAAc,GAAG,eAAe,EAAE,CAAC;IACzC,iBAAiB,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;IAEvC,MAAM,MAAM,GAAG,MAAM,KAAK,EAAE,CAAC;IAE7B,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QAC/B,0BAA0B;QAC1B,iBAAiB,CAAC,cAAc,CAAC,CAAC;QAClC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;IAC1B,CAAC;IAED,OAAO;QACL,KAAK,EAAE,IAAI;QACX,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI;QACtB,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO;KAC7B,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAEjC,GAAG;SACA,WAAW,CAAC,8BAA8B,CAAC;SAC3C,MAAM,CAAC,qBAAqB,EAAE,+BAA+B,CAAC;SAC9D,MAAM,CAAC,cAAc,EAAE,mCAAmC,CAAC;SAC3D,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACxB,6BAA6B;QAC7B,IAAI,UAAU,EAAE,EAAE,CAAC;YACjB,MAAM,MAAM,GAAG,eAAe,EAAE,CAAC;YACjC,OAAO,CAAC,mBAAmB,CAAC,CAAC;YAC7B,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;gBACjB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC;YAC1D,CAAC;YACD,IAAI,CAAC,qCAAqC,CAAC,CAAC;YAC5C,OAAO;QACT,CAAC;QAED,IAAI,KAAa,CAAC;QAElB,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YAClB,0BAA0B;YAC1B,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;QACxB,CAAC;aAAM,CAAC;YACN,yBAAyB;YACzB,MAAM,QAAQ,GAAG,cAAc,EAAE,CAAC;YAClC,MAAM,OAAO,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,WAAW,CAAC;YAE/D,OAAO,EAAE,CAAC;YACV,IAAI,CAAC,oDAAoD,CAAC,CAAC;YAC3D,OAAO,EAAE,CAAC;YAEV,IAAI,OAAO,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;gBAC9B,IAAI,CAAC;oBACH,MAAM,WAAW,CAAC,OAAO,CAAC,CAAC;oBAC3B,IAAI,CAAC,gDAAgD,CAAC,CAAC;gBACzD,CAAC;gBAAC,MAAM,CAAC;oBACP,OAAO,CAAC,uCAAuC,CAAC,CAAC;gBACnD,CAAC;YACH,CAAC;YAED,OAAO,EAAE,CAAC;YACV,IAAI,CAAC,kCAAkC,OAAO,EAAE,CAAC,CAAC;YAClD,OAAO,EAAE,CAAC;YAEV,mBAAmB;YACnB,KAAK,GAAG,MAAM,MAAM,CAAC,6BAA6B,CAAC,CAAC;YAEpD,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,KAAK,CAAC,qCAAqC,CAAC,CAAC;gBAC7C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;QAED,iBAAiB;QACjB,MAAM,IAAI,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAAC,KAAK,EAAE,CAAC;QAEpD,MAAM,UAAU,GAAG,MAAM,aAAa,CAAC,KAAK,CAAC,CAAC;QAE9C,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;YACtB,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;YAC3B,KAAK,CAAC,2CAA2C,CAAC,CAAC;YACnD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,cAAc;QACd,iBAAiB,CAAC;YAChB,QAAQ,EAAE,KAAK;YACf,MAAM,EAAE,UAAU,CAAC,IAAI,EAAE,EAAE;YAC3B,KAAK,EAAE,UAAU,CAAC,IAAI,EAAE,KAAK;YAC7B,SAAS,EAAE,UAAU,CAAC,OAAO,EAAE,EAAE;YACjC,WAAW,EAAE,UAAU,CAAC,OAAO,EAAE,IAAI;SACtC,CAAC,CAAC;QAEH,IAAI,CAAC,OAAO,CAAC,wBAAwB,CAAC,CAAC;QACvC,OAAO,EAAE,CAAC;QAEV,QAAQ,CAAC,SAAS,EAAE,UAAU,CAAC,OAAO,EAAE,IAAI,IAAI,SAAS,CAAC,CAAC;QAC3D,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC,IAAI,EAAE,KAAK,IAAI,SAAS,CAAC,CAAC;QACvD,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC,OAAO,EAAE,IAAI,IAAI,MAAM,CAAC,CAAC;QAErD,OAAO,EAAE,CAAC;QACV,IAAI,CAAC,kBAAkB,CAAC,CAAC;QACzB,IAAI,CAAC,sDAAsD,CAAC,CAAC;QAC7D,IAAI,CAAC,qCAAqC,CAAC,CAAC;QAC5C,IAAI,CAAC,4BAA4B,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEL,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -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;
|
|
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"}
|