@buoy-design/cli 0.1.9 → 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.d.ts +3 -0
- package/dist/commands/dock.d.ts.map +1 -0
- package/dist/commands/dock.js +881 -0
- package/dist/commands/dock.js.map +1 -0
- 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 +11 -1
- package/dist/commands/index.d.ts.map +1 -1
- package/dist/commands/index.js +12 -1
- 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 +15 -2
- 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,261 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Buoy Cloud API Client
|
|
3
|
+
*
|
|
4
|
+
* HTTP client for interacting with the Buoy Cloud API
|
|
5
|
+
*/
|
|
6
|
+
export interface ApiError {
|
|
7
|
+
error: string;
|
|
8
|
+
message?: string;
|
|
9
|
+
}
|
|
10
|
+
export interface ApiResponse<T> {
|
|
11
|
+
ok: boolean;
|
|
12
|
+
data?: T;
|
|
13
|
+
error?: string;
|
|
14
|
+
status: number;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Make an authenticated request to the Buoy Cloud API
|
|
18
|
+
*/
|
|
19
|
+
export declare function apiRequest<T>(path: string, options?: RequestInit): Promise<ApiResponse<T>>;
|
|
20
|
+
export interface AuthMeResponse {
|
|
21
|
+
user: {
|
|
22
|
+
id: string;
|
|
23
|
+
email: string;
|
|
24
|
+
name: string | null;
|
|
25
|
+
avatarUrl: string | null;
|
|
26
|
+
githubLogin: string | null;
|
|
27
|
+
role: string;
|
|
28
|
+
};
|
|
29
|
+
account: {
|
|
30
|
+
id: string;
|
|
31
|
+
name: string;
|
|
32
|
+
slug: string;
|
|
33
|
+
plan: string;
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
export declare function getMe(): Promise<ApiResponse<AuthMeResponse>>;
|
|
37
|
+
export interface ApiKey {
|
|
38
|
+
id: string;
|
|
39
|
+
name: string;
|
|
40
|
+
keyPrefix: string;
|
|
41
|
+
scopes: string[];
|
|
42
|
+
lastUsedAt: string | null;
|
|
43
|
+
expiresAt: string | null;
|
|
44
|
+
createdAt: string;
|
|
45
|
+
}
|
|
46
|
+
export interface CreateApiKeyRequest {
|
|
47
|
+
name: string;
|
|
48
|
+
scopes?: string[];
|
|
49
|
+
expiresIn?: number;
|
|
50
|
+
}
|
|
51
|
+
export interface CreateApiKeyResponse extends ApiKey {
|
|
52
|
+
key: string;
|
|
53
|
+
}
|
|
54
|
+
export declare function listApiKeys(): Promise<ApiResponse<{
|
|
55
|
+
keys: ApiKey[];
|
|
56
|
+
}>>;
|
|
57
|
+
export declare function createApiKey(data: CreateApiKeyRequest): Promise<ApiResponse<CreateApiKeyResponse>>;
|
|
58
|
+
export declare function revokeApiKey(id: string): Promise<ApiResponse<{
|
|
59
|
+
success: boolean;
|
|
60
|
+
}>>;
|
|
61
|
+
export interface Project {
|
|
62
|
+
id: string;
|
|
63
|
+
name: string;
|
|
64
|
+
repoUrl: string | null;
|
|
65
|
+
defaultBranch: string;
|
|
66
|
+
settings: {
|
|
67
|
+
autoScan?: boolean;
|
|
68
|
+
prComments?: boolean;
|
|
69
|
+
checkRuns?: boolean;
|
|
70
|
+
};
|
|
71
|
+
createdAt: string;
|
|
72
|
+
updatedAt: string;
|
|
73
|
+
}
|
|
74
|
+
export interface CreateProjectRequest {
|
|
75
|
+
name: string;
|
|
76
|
+
repoUrl?: string;
|
|
77
|
+
defaultBranch?: string;
|
|
78
|
+
settings?: {
|
|
79
|
+
autoScan?: boolean;
|
|
80
|
+
prComments?: boolean;
|
|
81
|
+
checkRuns?: boolean;
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
export declare function listProjects(): Promise<ApiResponse<{
|
|
85
|
+
projects: Project[];
|
|
86
|
+
}>>;
|
|
87
|
+
export declare function getProject(id: string): Promise<ApiResponse<Project>>;
|
|
88
|
+
export declare function createProject(data: CreateProjectRequest): Promise<ApiResponse<Project>>;
|
|
89
|
+
export declare function updateProject(id: string, data: Partial<CreateProjectRequest>): Promise<ApiResponse<Project>>;
|
|
90
|
+
export declare function deleteProject(id: string): Promise<ApiResponse<{
|
|
91
|
+
success: boolean;
|
|
92
|
+
}>>;
|
|
93
|
+
export interface ScanComponent {
|
|
94
|
+
name: string;
|
|
95
|
+
path: string;
|
|
96
|
+
framework?: string;
|
|
97
|
+
props?: Array<{
|
|
98
|
+
name: string;
|
|
99
|
+
type?: string;
|
|
100
|
+
required?: boolean;
|
|
101
|
+
defaultValue?: unknown;
|
|
102
|
+
}>;
|
|
103
|
+
imports?: string[];
|
|
104
|
+
loc?: number;
|
|
105
|
+
}
|
|
106
|
+
export interface ScanToken {
|
|
107
|
+
name: string;
|
|
108
|
+
value: string;
|
|
109
|
+
type: string;
|
|
110
|
+
path?: string;
|
|
111
|
+
source?: string;
|
|
112
|
+
}
|
|
113
|
+
export interface ScanDriftSignal {
|
|
114
|
+
type: string;
|
|
115
|
+
severity: 'error' | 'warning' | 'info';
|
|
116
|
+
message: string;
|
|
117
|
+
file?: string;
|
|
118
|
+
line?: number;
|
|
119
|
+
component?: string;
|
|
120
|
+
token?: string;
|
|
121
|
+
suggestion?: string;
|
|
122
|
+
}
|
|
123
|
+
export interface UploadScanRequest {
|
|
124
|
+
commitSha?: string;
|
|
125
|
+
branch?: string;
|
|
126
|
+
author?: string;
|
|
127
|
+
timestamp?: string;
|
|
128
|
+
components: ScanComponent[];
|
|
129
|
+
tokens: ScanToken[];
|
|
130
|
+
drift: ScanDriftSignal[];
|
|
131
|
+
summary?: {
|
|
132
|
+
totalComponents: number;
|
|
133
|
+
totalTokens: number;
|
|
134
|
+
totalDrift: number;
|
|
135
|
+
driftByType?: Record<string, number>;
|
|
136
|
+
driftBySeverity?: Record<string, number>;
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
export interface UploadScanResponse {
|
|
140
|
+
id: string;
|
|
141
|
+
projectId: string;
|
|
142
|
+
summary: {
|
|
143
|
+
totalComponents: number;
|
|
144
|
+
totalTokens: number;
|
|
145
|
+
totalDrift: number;
|
|
146
|
+
driftByType?: Record<string, number>;
|
|
147
|
+
driftBySeverity?: Record<string, number>;
|
|
148
|
+
};
|
|
149
|
+
createdAt: string;
|
|
150
|
+
}
|
|
151
|
+
export interface Scan {
|
|
152
|
+
id: string;
|
|
153
|
+
commitSha: string | null;
|
|
154
|
+
branch: string | null;
|
|
155
|
+
author: string | null;
|
|
156
|
+
componentsCount: number;
|
|
157
|
+
tokensCount: number;
|
|
158
|
+
driftCount: number;
|
|
159
|
+
summary: {
|
|
160
|
+
totalComponents: number;
|
|
161
|
+
totalTokens: number;
|
|
162
|
+
totalDrift: number;
|
|
163
|
+
driftByType?: Record<string, number>;
|
|
164
|
+
driftBySeverity?: Record<string, number>;
|
|
165
|
+
} | null;
|
|
166
|
+
createdAt: string;
|
|
167
|
+
}
|
|
168
|
+
export declare function uploadScan(projectId: string, data: UploadScanRequest): Promise<ApiResponse<UploadScanResponse>>;
|
|
169
|
+
export declare function listScans(projectId: string, options?: {
|
|
170
|
+
limit?: number;
|
|
171
|
+
offset?: number;
|
|
172
|
+
}): Promise<ApiResponse<{
|
|
173
|
+
scans: Scan[];
|
|
174
|
+
total: number;
|
|
175
|
+
}>>;
|
|
176
|
+
export declare function getLatestScan(projectId: string, includeFull?: boolean): Promise<ApiResponse<Scan>>;
|
|
177
|
+
export interface GitHubInstallation {
|
|
178
|
+
id: string;
|
|
179
|
+
installationId: number;
|
|
180
|
+
accountLogin: string;
|
|
181
|
+
accountType: string;
|
|
182
|
+
avatarUrl: string | null;
|
|
183
|
+
repositorySelection: 'all' | 'selected';
|
|
184
|
+
suspended: boolean;
|
|
185
|
+
suspendedAt: string | null;
|
|
186
|
+
createdAt: string;
|
|
187
|
+
updatedAt: string;
|
|
188
|
+
}
|
|
189
|
+
export declare function listGitHubInstallations(): Promise<ApiResponse<{
|
|
190
|
+
installations: GitHubInstallation[];
|
|
191
|
+
}>>;
|
|
192
|
+
export declare function revokeGitHubInstallation(id: string): Promise<ApiResponse<{
|
|
193
|
+
success: boolean;
|
|
194
|
+
}>>;
|
|
195
|
+
export declare function getGitHubInstallUrl(endpoint: string): string;
|
|
196
|
+
export interface BillingPlan {
|
|
197
|
+
id: string;
|
|
198
|
+
name: string;
|
|
199
|
+
features: string[];
|
|
200
|
+
}
|
|
201
|
+
export interface BillingUsage {
|
|
202
|
+
period: string;
|
|
203
|
+
scans: number;
|
|
204
|
+
apiCalls: number;
|
|
205
|
+
storageBytes: number;
|
|
206
|
+
}
|
|
207
|
+
export interface BillingStatus {
|
|
208
|
+
plan: BillingPlan;
|
|
209
|
+
subscription: {
|
|
210
|
+
id: string;
|
|
211
|
+
customerId: string;
|
|
212
|
+
} | null;
|
|
213
|
+
limits: {
|
|
214
|
+
users: number | null;
|
|
215
|
+
currentUsers: number;
|
|
216
|
+
};
|
|
217
|
+
usage: BillingUsage;
|
|
218
|
+
trial: {
|
|
219
|
+
active: boolean;
|
|
220
|
+
daysRemaining: number;
|
|
221
|
+
endsAt: string;
|
|
222
|
+
converted: boolean;
|
|
223
|
+
} | null;
|
|
224
|
+
paymentAlert: {
|
|
225
|
+
status: string;
|
|
226
|
+
daysRemaining: number;
|
|
227
|
+
graceEndsAt: string;
|
|
228
|
+
failedAt: string;
|
|
229
|
+
} | null;
|
|
230
|
+
cancellation: {
|
|
231
|
+
requestedAt: string;
|
|
232
|
+
reason: string;
|
|
233
|
+
} | null;
|
|
234
|
+
}
|
|
235
|
+
export interface Invoice {
|
|
236
|
+
id: string;
|
|
237
|
+
number: string;
|
|
238
|
+
status: string;
|
|
239
|
+
amountDue: number;
|
|
240
|
+
amountPaid: number;
|
|
241
|
+
currency: string;
|
|
242
|
+
createdAt: string;
|
|
243
|
+
hostedUrl: string;
|
|
244
|
+
pdfUrl: string;
|
|
245
|
+
}
|
|
246
|
+
export declare function getBillingStatus(): Promise<ApiResponse<BillingStatus>>;
|
|
247
|
+
export declare function getInvoices(): Promise<ApiResponse<{
|
|
248
|
+
invoices: Invoice[];
|
|
249
|
+
}>>;
|
|
250
|
+
export declare function createCheckoutSession(): Promise<ApiResponse<{
|
|
251
|
+
checkoutUrl: string;
|
|
252
|
+
sessionId: string;
|
|
253
|
+
}>>;
|
|
254
|
+
export declare function createPortalSession(): Promise<ApiResponse<{
|
|
255
|
+
portalUrl: string;
|
|
256
|
+
}>>;
|
|
257
|
+
export declare function requestCancellation(reason: string, feedback?: string): Promise<ApiResponse<{
|
|
258
|
+
success: boolean;
|
|
259
|
+
message: string;
|
|
260
|
+
}>>;
|
|
261
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/cloud/client.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,WAAW,CAAC,CAAC;IAC5B,EAAE,EAAE,OAAO,CAAC;IACZ,IAAI,CAAC,EAAE,CAAC,CAAC;IACT,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,CAAC,EAChC,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,WAAgB,GACxB,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CA0CzB;AAMD,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE;QACJ,EAAE,EAAE,MAAM,CAAC;QACX,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;QACpB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;QACzB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;QAC3B,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;IACF,OAAO,EAAE;QACP,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;CACH;AAED,wBAAsB,KAAK,IAAI,OAAO,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC,CAElE;AAMD,MAAM,WAAW,MAAM;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,oBAAqB,SAAQ,MAAM;IAClD,GAAG,EAAE,MAAM,CAAC;CACb;AAED,wBAAsB,WAAW,IAAI,OAAO,CAAC,WAAW,CAAC;IAAE,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAAC,CAE5E;AAED,wBAAsB,YAAY,CAChC,IAAI,EAAE,mBAAmB,GACxB,OAAO,CAAC,WAAW,CAAC,oBAAoB,CAAC,CAAC,CAK5C;AAED,wBAAsB,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC,CAAC,CAIzF;AAMD,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE;QACR,QAAQ,CAAC,EAAE,OAAO,CAAC;QACnB,UAAU,CAAC,EAAE,OAAO,CAAC;QACrB,SAAS,CAAC,EAAE,OAAO,CAAC;KACrB,CAAC;IACF,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE;QACT,QAAQ,CAAC,EAAE,OAAO,CAAC;QACnB,UAAU,CAAC,EAAE,OAAO,CAAC;QACrB,SAAS,CAAC,EAAE,OAAO,CAAC;KACrB,CAAC;CACH;AAED,wBAAsB,YAAY,IAAI,OAAO,CAAC,WAAW,CAAC;IAAE,QAAQ,EAAE,OAAO,EAAE,CAAA;CAAE,CAAC,CAAC,CAElF;AAED,wBAAsB,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAE1E;AAED,wBAAsB,aAAa,CAAC,IAAI,EAAE,oBAAoB,GAAG,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAK7F;AAED,wBAAsB,aAAa,CACjC,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,OAAO,CAAC,oBAAoB,CAAC,GAClC,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAK/B;AAED,wBAAsB,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC,CAAC,CAI1F;AAMD,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC;QACZ,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,QAAQ,CAAC,EAAE,OAAO,CAAC;QACnB,YAAY,CAAC,EAAE,OAAO,CAAC;KACxB,CAAC,CAAC;IACH,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;IACvC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,iBAAiB;IAChC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,aAAa,EAAE,CAAC;IAC5B,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,KAAK,EAAE,eAAe,EAAE,CAAC;IACzB,OAAO,CAAC,EAAE;QACR,eAAe,EAAE,MAAM,CAAC;QACxB,WAAW,EAAE,MAAM,CAAC;QACpB,UAAU,EAAE,MAAM,CAAC;QACnB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACrC,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KAC1C,CAAC;CACH;AAED,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE;QACP,eAAe,EAAE,MAAM,CAAC;QACxB,WAAW,EAAE,MAAM,CAAC;QACpB,UAAU,EAAE,MAAM,CAAC;QACnB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACrC,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KAC1C,CAAC;IACF,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE;QACP,eAAe,EAAE,MAAM,CAAC;QACxB,WAAW,EAAE,MAAM,CAAC;QACpB,UAAU,EAAE,MAAM,CAAC;QACnB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACrC,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KAC1C,GAAG,IAAI,CAAC;IACT,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAsB,UAAU,CAC9B,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,iBAAiB,GACtB,OAAO,CAAC,WAAW,CAAC,kBAAkB,CAAC,CAAC,CAK1C;AAED,wBAAsB,SAAS,CAC7B,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAC5C,OAAO,CAAC,WAAW,CAAC;IAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,CAMxD;AAED,wBAAsB,aAAa,CACjC,SAAS,EAAE,MAAM,EACjB,WAAW,UAAQ,GAClB,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAG5B;AAMD,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,mBAAmB,EAAE,KAAK,GAAG,UAAU,CAAC;IACxC,SAAS,EAAE,OAAO,CAAC;IACnB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAsB,uBAAuB,IAAI,OAAO,CACtD,WAAW,CAAC;IAAE,aAAa,EAAE,kBAAkB,EAAE,CAAA;CAAE,CAAC,CACrD,CAEA;AAED,wBAAsB,wBAAwB,CAC5C,EAAE,EAAE,MAAM,GACT,OAAO,CAAC,WAAW,CAAC;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC,CAAC,CAI5C;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE5D;AAMD,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,WAAW,CAAC;IAClB,YAAY,EAAE;QACZ,EAAE,EAAE,MAAM,CAAC;QACX,UAAU,EAAE,MAAM,CAAC;KACpB,GAAG,IAAI,CAAC;IACT,MAAM,EAAE;QACN,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;QACrB,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;IACF,KAAK,EAAE,YAAY,CAAC;IACpB,KAAK,EAAE;QACL,MAAM,EAAE,OAAO,CAAC;QAChB,aAAa,EAAE,MAAM,CAAC;QACtB,MAAM,EAAE,MAAM,CAAC;QACf,SAAS,EAAE,OAAO,CAAC;KACpB,GAAG,IAAI,CAAC;IACT,YAAY,EAAE;QACZ,MAAM,EAAE,MAAM,CAAC;QACf,aAAa,EAAE,MAAM,CAAC;QACtB,WAAW,EAAE,MAAM,CAAC;QACpB,QAAQ,EAAE,MAAM,CAAC;KAClB,GAAG,IAAI,CAAC;IACT,YAAY,EAAE;QACZ,WAAW,EAAE,MAAM,CAAC;QACpB,MAAM,EAAE,MAAM,CAAC;KAChB,GAAG,IAAI,CAAC;CACV;AAED,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC,CAE5E;AAED,wBAAsB,WAAW,IAAI,OAAO,CAAC,WAAW,CAAC;IAAE,QAAQ,EAAE,OAAO,EAAE,CAAA;CAAE,CAAC,CAAC,CAEjF;AAED,wBAAsB,qBAAqB,IAAI,OAAO,CACpD,WAAW,CAAC;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,CACxD,CAIA;AAED,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,WAAW,CAAC;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,CAIvF;AAED,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,MAAM,EACd,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,WAAW,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,CAK7D"}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Buoy Cloud API Client
|
|
3
|
+
*
|
|
4
|
+
* HTTP client for interacting with the Buoy Cloud API
|
|
5
|
+
*/
|
|
6
|
+
import { getApiToken, getApiEndpoint } from './config.js';
|
|
7
|
+
/**
|
|
8
|
+
* Make an authenticated request to the Buoy Cloud API
|
|
9
|
+
*/
|
|
10
|
+
export async function apiRequest(path, options = {}) {
|
|
11
|
+
const endpoint = getApiEndpoint();
|
|
12
|
+
const token = getApiToken();
|
|
13
|
+
const url = `${endpoint}${path}`;
|
|
14
|
+
const headers = {
|
|
15
|
+
'Content-Type': 'application/json',
|
|
16
|
+
...options.headers,
|
|
17
|
+
};
|
|
18
|
+
if (token) {
|
|
19
|
+
headers['Authorization'] = `Bearer ${token}`;
|
|
20
|
+
}
|
|
21
|
+
try {
|
|
22
|
+
const response = await fetch(url, {
|
|
23
|
+
...options,
|
|
24
|
+
headers,
|
|
25
|
+
});
|
|
26
|
+
const data = await response.json().catch(() => ({}));
|
|
27
|
+
if (!response.ok) {
|
|
28
|
+
return {
|
|
29
|
+
ok: false,
|
|
30
|
+
error: data.error || `Request failed with status ${response.status}`,
|
|
31
|
+
status: response.status,
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
return {
|
|
35
|
+
ok: true,
|
|
36
|
+
data: data,
|
|
37
|
+
status: response.status,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
catch (error) {
|
|
41
|
+
return {
|
|
42
|
+
ok: false,
|
|
43
|
+
error: error instanceof Error ? error.message : 'Network error',
|
|
44
|
+
status: 0,
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
export async function getMe() {
|
|
49
|
+
return apiRequest('/auth/me');
|
|
50
|
+
}
|
|
51
|
+
export async function listApiKeys() {
|
|
52
|
+
return apiRequest('/api-keys');
|
|
53
|
+
}
|
|
54
|
+
export async function createApiKey(data) {
|
|
55
|
+
return apiRequest('/api-keys', {
|
|
56
|
+
method: 'POST',
|
|
57
|
+
body: JSON.stringify(data),
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
export async function revokeApiKey(id) {
|
|
61
|
+
return apiRequest(`/api-keys/${id}`, {
|
|
62
|
+
method: 'DELETE',
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
export async function listProjects() {
|
|
66
|
+
return apiRequest('/projects');
|
|
67
|
+
}
|
|
68
|
+
export async function getProject(id) {
|
|
69
|
+
return apiRequest(`/projects/${id}`);
|
|
70
|
+
}
|
|
71
|
+
export async function createProject(data) {
|
|
72
|
+
return apiRequest('/projects', {
|
|
73
|
+
method: 'POST',
|
|
74
|
+
body: JSON.stringify(data),
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
export async function updateProject(id, data) {
|
|
78
|
+
return apiRequest(`/projects/${id}`, {
|
|
79
|
+
method: 'PATCH',
|
|
80
|
+
body: JSON.stringify(data),
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
export async function deleteProject(id) {
|
|
84
|
+
return apiRequest(`/projects/${id}`, {
|
|
85
|
+
method: 'DELETE',
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
export async function uploadScan(projectId, data) {
|
|
89
|
+
return apiRequest(`/projects/${projectId}/scans`, {
|
|
90
|
+
method: 'POST',
|
|
91
|
+
body: JSON.stringify(data),
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
export async function listScans(projectId, options) {
|
|
95
|
+
const params = new URLSearchParams();
|
|
96
|
+
if (options?.limit)
|
|
97
|
+
params.set('limit', String(options.limit));
|
|
98
|
+
if (options?.offset)
|
|
99
|
+
params.set('offset', String(options.offset));
|
|
100
|
+
const query = params.toString() ? `?${params.toString()}` : '';
|
|
101
|
+
return apiRequest(`/projects/${projectId}/scans${query}`);
|
|
102
|
+
}
|
|
103
|
+
export async function getLatestScan(projectId, includeFull = false) {
|
|
104
|
+
const query = includeFull ? '?include=full' : '';
|
|
105
|
+
return apiRequest(`/projects/${projectId}/scans/latest${query}`);
|
|
106
|
+
}
|
|
107
|
+
export async function listGitHubInstallations() {
|
|
108
|
+
return apiRequest('/github/installations');
|
|
109
|
+
}
|
|
110
|
+
export async function revokeGitHubInstallation(id) {
|
|
111
|
+
return apiRequest(`/github/installations/${id}`, {
|
|
112
|
+
method: 'DELETE',
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
export function getGitHubInstallUrl(endpoint) {
|
|
116
|
+
return `${endpoint}/github/install`;
|
|
117
|
+
}
|
|
118
|
+
export async function getBillingStatus() {
|
|
119
|
+
return apiRequest('/billing');
|
|
120
|
+
}
|
|
121
|
+
export async function getInvoices() {
|
|
122
|
+
return apiRequest('/billing/invoices');
|
|
123
|
+
}
|
|
124
|
+
export async function createCheckoutSession() {
|
|
125
|
+
return apiRequest('/billing/checkout', {
|
|
126
|
+
method: 'POST',
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
export async function createPortalSession() {
|
|
130
|
+
return apiRequest('/billing/portal', {
|
|
131
|
+
method: 'POST',
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
export async function requestCancellation(reason, feedback) {
|
|
135
|
+
return apiRequest('/billing/cancel-request', {
|
|
136
|
+
method: 'POST',
|
|
137
|
+
body: JSON.stringify({ reason, feedback }),
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/cloud/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Buoy Cloud Configuration
|
|
3
|
+
*
|
|
4
|
+
* Manages cloud credentials and settings stored in ~/.buoy/
|
|
5
|
+
*/
|
|
6
|
+
export interface CloudConfig {
|
|
7
|
+
apiToken?: string;
|
|
8
|
+
apiEndpoint?: string;
|
|
9
|
+
userId?: string;
|
|
10
|
+
accountId?: string;
|
|
11
|
+
accountName?: string;
|
|
12
|
+
email?: string;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Read cloud config from disk
|
|
16
|
+
*/
|
|
17
|
+
export declare function readCloudConfig(): CloudConfig;
|
|
18
|
+
/**
|
|
19
|
+
* Write cloud config to disk
|
|
20
|
+
*/
|
|
21
|
+
export declare function writeCloudConfig(config: CloudConfig): void;
|
|
22
|
+
/**
|
|
23
|
+
* Update specific fields in cloud config
|
|
24
|
+
*/
|
|
25
|
+
export declare function updateCloudConfig(updates: Partial<CloudConfig>): CloudConfig;
|
|
26
|
+
/**
|
|
27
|
+
* Clear cloud config (logout)
|
|
28
|
+
*/
|
|
29
|
+
export declare function clearCloudConfig(): void;
|
|
30
|
+
/**
|
|
31
|
+
* Get the API token if configured
|
|
32
|
+
*/
|
|
33
|
+
export declare function getApiToken(): string | undefined;
|
|
34
|
+
/**
|
|
35
|
+
* Get the API endpoint
|
|
36
|
+
*/
|
|
37
|
+
export declare function getApiEndpoint(): string;
|
|
38
|
+
/**
|
|
39
|
+
* Check if user is logged in
|
|
40
|
+
*/
|
|
41
|
+
export declare function isLoggedIn(): boolean;
|
|
42
|
+
/**
|
|
43
|
+
* Get authenticated user info
|
|
44
|
+
*/
|
|
45
|
+
export declare function getAuthenticatedUser(): {
|
|
46
|
+
userId?: string;
|
|
47
|
+
accountId?: string;
|
|
48
|
+
accountName?: string;
|
|
49
|
+
email?: string;
|
|
50
|
+
} | null;
|
|
51
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/cloud/config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAaH,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAWD;;GAEG;AACH,wBAAgB,eAAe,IAAI,WAAW,CAU7C;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,CAK1D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,WAAW,CAK5E;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,IAAI,CAIvC;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,MAAM,GAAG,SAAS,CAGhD;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,MAAM,CAGvC;AAED;;GAEG;AACH,wBAAgB,UAAU,IAAI,OAAO,CAGpC;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI;IACtC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GAAG,IAAI,CASP"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Buoy Cloud Configuration
|
|
3
|
+
*
|
|
4
|
+
* Manages cloud credentials and settings stored in ~/.buoy/
|
|
5
|
+
*/
|
|
6
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync, unlinkSync } from 'fs';
|
|
7
|
+
import { homedir } from 'os';
|
|
8
|
+
import { join } from 'path';
|
|
9
|
+
// Config directory and file paths
|
|
10
|
+
const CONFIG_DIR = join(homedir(), '.buoy');
|
|
11
|
+
const CONFIG_FILE = join(CONFIG_DIR, 'config.json');
|
|
12
|
+
// Default API endpoint
|
|
13
|
+
const DEFAULT_API_ENDPOINT = 'https://api.buoy.design';
|
|
14
|
+
/**
|
|
15
|
+
* Ensure the config directory exists
|
|
16
|
+
*/
|
|
17
|
+
function ensureConfigDir() {
|
|
18
|
+
if (!existsSync(CONFIG_DIR)) {
|
|
19
|
+
mkdirSync(CONFIG_DIR, { recursive: true, mode: 0o700 });
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Read cloud config from disk
|
|
24
|
+
*/
|
|
25
|
+
export function readCloudConfig() {
|
|
26
|
+
try {
|
|
27
|
+
if (!existsSync(CONFIG_FILE)) {
|
|
28
|
+
return {};
|
|
29
|
+
}
|
|
30
|
+
const content = readFileSync(CONFIG_FILE, 'utf-8');
|
|
31
|
+
return JSON.parse(content);
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
return {};
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Write cloud config to disk
|
|
39
|
+
*/
|
|
40
|
+
export function writeCloudConfig(config) {
|
|
41
|
+
ensureConfigDir();
|
|
42
|
+
writeFileSync(CONFIG_FILE, JSON.stringify(config, null, 2), {
|
|
43
|
+
mode: 0o600, // Owner read/write only
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Update specific fields in cloud config
|
|
48
|
+
*/
|
|
49
|
+
export function updateCloudConfig(updates) {
|
|
50
|
+
const config = readCloudConfig();
|
|
51
|
+
const newConfig = { ...config, ...updates };
|
|
52
|
+
writeCloudConfig(newConfig);
|
|
53
|
+
return newConfig;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Clear cloud config (logout)
|
|
57
|
+
*/
|
|
58
|
+
export function clearCloudConfig() {
|
|
59
|
+
if (existsSync(CONFIG_FILE)) {
|
|
60
|
+
unlinkSync(CONFIG_FILE);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Get the API token if configured
|
|
65
|
+
*/
|
|
66
|
+
export function getApiToken() {
|
|
67
|
+
const config = readCloudConfig();
|
|
68
|
+
return config.apiToken;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Get the API endpoint
|
|
72
|
+
*/
|
|
73
|
+
export function getApiEndpoint() {
|
|
74
|
+
const config = readCloudConfig();
|
|
75
|
+
return config.apiEndpoint || DEFAULT_API_ENDPOINT;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Check if user is logged in
|
|
79
|
+
*/
|
|
80
|
+
export function isLoggedIn() {
|
|
81
|
+
const config = readCloudConfig();
|
|
82
|
+
return !!config.apiToken;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Get authenticated user info
|
|
86
|
+
*/
|
|
87
|
+
export function getAuthenticatedUser() {
|
|
88
|
+
const config = readCloudConfig();
|
|
89
|
+
if (!config.apiToken)
|
|
90
|
+
return null;
|
|
91
|
+
return {
|
|
92
|
+
userId: config.userId,
|
|
93
|
+
accountId: config.accountId,
|
|
94
|
+
accountName: config.accountName,
|
|
95
|
+
email: config.email,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/cloud/config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AACpF,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,kCAAkC;AAClC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,OAAO,CAAC,CAAC;AAC5C,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;AAEpD,uBAAuB;AACvB,MAAM,oBAAoB,GAAG,yBAAyB,CAAC;AAWvD;;GAEG;AACH,SAAS,eAAe;IACtB,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC1D,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe;IAC7B,IAAI,CAAC;QACH,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YAC7B,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,MAAM,OAAO,GAAG,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QACnD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAgB,CAAC;IAC5C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAmB;IAClD,eAAe,EAAE,CAAC;IAClB,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE;QAC1D,IAAI,EAAE,KAAK,EAAE,wBAAwB;KACtC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAA6B;IAC7D,MAAM,MAAM,GAAG,eAAe,EAAE,CAAC;IACjC,MAAM,SAAS,GAAG,EAAE,GAAG,MAAM,EAAE,GAAG,OAAO,EAAE,CAAC;IAC5C,gBAAgB,CAAC,SAAS,CAAC,CAAC;IAC5B,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB;IAC9B,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC5B,UAAU,CAAC,WAAW,CAAC,CAAC;IAC1B,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW;IACzB,MAAM,MAAM,GAAG,eAAe,EAAE,CAAC;IACjC,OAAO,MAAM,CAAC,QAAQ,CAAC;AACzB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc;IAC5B,MAAM,MAAM,GAAG,eAAe,EAAE,CAAC;IACjC,OAAO,MAAM,CAAC,WAAW,IAAI,oBAAoB,CAAC;AACpD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU;IACxB,MAAM,MAAM,GAAG,eAAe,EAAE,CAAC;IACjC,OAAO,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC;AAC3B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB;IAMlC,MAAM,MAAM,GAAG,eAAe,EAAE,CAAC;IACjC,IAAI,CAAC,MAAM,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IAClC,OAAO;QACL,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,KAAK,EAAE,MAAM,CAAC,KAAK;KACpB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cloud/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,WAAW,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cloud/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,WAAW,CAAC"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Offline Queue for Failed Uploads
|
|
3
|
+
*
|
|
4
|
+
* When scan uploads fail (network issues, API errors), they're queued
|
|
5
|
+
* for retry. The queue is stored in .buoy/sync-queue.json in the project.
|
|
6
|
+
*/
|
|
7
|
+
import type { UploadScanRequest } from './client.js';
|
|
8
|
+
export interface QueuedScan {
|
|
9
|
+
id: string;
|
|
10
|
+
projectId: string;
|
|
11
|
+
data: UploadScanRequest;
|
|
12
|
+
attempts: number;
|
|
13
|
+
lastAttempt: string;
|
|
14
|
+
error?: string;
|
|
15
|
+
createdAt: string;
|
|
16
|
+
}
|
|
17
|
+
export interface SyncQueue {
|
|
18
|
+
scans: QueuedScan[];
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Read the sync queue
|
|
22
|
+
*/
|
|
23
|
+
export declare function readQueue(projectRoot: string): SyncQueue;
|
|
24
|
+
/**
|
|
25
|
+
* Write the sync queue
|
|
26
|
+
*/
|
|
27
|
+
export declare function writeQueue(projectRoot: string, queue: SyncQueue): void;
|
|
28
|
+
/**
|
|
29
|
+
* Add a failed scan to the queue
|
|
30
|
+
*/
|
|
31
|
+
export declare function queueScan(projectRoot: string, projectId: string, data: UploadScanRequest, error?: string): QueuedScan;
|
|
32
|
+
/**
|
|
33
|
+
* Update a queued scan after a retry attempt
|
|
34
|
+
*/
|
|
35
|
+
export declare function updateQueuedScan(projectRoot: string, scanId: string, updates: Partial<Pick<QueuedScan, 'attempts' | 'lastAttempt' | 'error'>>): void;
|
|
36
|
+
/**
|
|
37
|
+
* Remove a scan from the queue (after successful upload)
|
|
38
|
+
*/
|
|
39
|
+
export declare function removeFromQueue(projectRoot: string, scanId: string): void;
|
|
40
|
+
/**
|
|
41
|
+
* Get pending scans that should be retried
|
|
42
|
+
*/
|
|
43
|
+
export declare function getPendingScans(projectRoot: string, maxAttempts?: number): QueuedScan[];
|
|
44
|
+
/**
|
|
45
|
+
* Get count of queued scans
|
|
46
|
+
*/
|
|
47
|
+
export declare function getQueueCount(projectRoot: string): number;
|
|
48
|
+
/**
|
|
49
|
+
* Clear all queued scans
|
|
50
|
+
*/
|
|
51
|
+
export declare function clearQueue(projectRoot: string): void;
|
|
52
|
+
//# sourceMappingURL=queue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queue.d.ts","sourceRoot":"","sources":["../../src/cloud/queue.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAKrD,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,iBAAiB,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,UAAU,EAAE,CAAC;CACrB;AAmBD;;GAEG;AACH,wBAAgB,SAAS,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,CAWxD;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,GAAG,IAAI,CAItE;AAED;;GAEG;AACH,wBAAgB,SAAS,CACvB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,iBAAiB,EACvB,KAAK,CAAC,EAAE,MAAM,GACb,UAAU,CAkBZ;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,UAAU,GAAG,aAAa,GAAG,OAAO,CAAC,CAAC,GACvE,IAAI,CAQN;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAIzE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,SAAI,GAAG,UAAU,EAAE,CAGlF;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAGzD;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAEpD"}
|