@guaracloud/cli 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (160) hide show
  1. package/bin/dev.js +4 -0
  2. package/bin/run.js +4 -0
  3. package/dist/commands/config/get.d.ts +10 -0
  4. package/dist/commands/config/get.d.ts.map +1 -0
  5. package/dist/commands/config/get.js +21 -0
  6. package/dist/commands/config/get.js.map +1 -0
  7. package/dist/commands/config/list.d.ts +7 -0
  8. package/dist/commands/config/list.d.ts.map +1 -0
  9. package/dist/commands/config/list.js +31 -0
  10. package/dist/commands/config/list.js.map +1 -0
  11. package/dist/commands/config/reset.d.ts +7 -0
  12. package/dist/commands/config/reset.d.ts.map +1 -0
  13. package/dist/commands/config/reset.js +25 -0
  14. package/dist/commands/config/reset.js.map +1 -0
  15. package/dist/commands/config/set.d.ts +11 -0
  16. package/dist/commands/config/set.d.ts.map +1 -0
  17. package/dist/commands/config/set.js +29 -0
  18. package/dist/commands/config/set.js.map +1 -0
  19. package/dist/commands/deploy.d.ts +25 -0
  20. package/dist/commands/deploy.d.ts.map +1 -0
  21. package/dist/commands/deploy.js +115 -0
  22. package/dist/commands/deploy.js.map +1 -0
  23. package/dist/commands/deployments/list.d.ts +7 -0
  24. package/dist/commands/deployments/list.d.ts.map +1 -0
  25. package/dist/commands/deployments/list.js +40 -0
  26. package/dist/commands/deployments/list.js.map +1 -0
  27. package/dist/commands/domains/add.d.ts +17 -0
  28. package/dist/commands/domains/add.d.ts.map +1 -0
  29. package/dist/commands/domains/add.js +41 -0
  30. package/dist/commands/domains/add.js.map +1 -0
  31. package/dist/commands/domains/list.d.ts +7 -0
  32. package/dist/commands/domains/list.d.ts.map +1 -0
  33. package/dist/commands/domains/list.js +32 -0
  34. package/dist/commands/domains/list.js.map +1 -0
  35. package/dist/commands/domains/remove.d.ts +17 -0
  36. package/dist/commands/domains/remove.d.ts.map +1 -0
  37. package/dist/commands/domains/remove.js +60 -0
  38. package/dist/commands/domains/remove.js.map +1 -0
  39. package/dist/commands/env/list.d.ts +7 -0
  40. package/dist/commands/env/list.d.ts.map +1 -0
  41. package/dist/commands/env/list.js +32 -0
  42. package/dist/commands/env/list.js.map +1 -0
  43. package/dist/commands/env/set.d.ts +18 -0
  44. package/dist/commands/env/set.d.ts.map +1 -0
  45. package/dist/commands/env/set.js +70 -0
  46. package/dist/commands/env/set.js.map +1 -0
  47. package/dist/commands/env/unset.d.ts +8 -0
  48. package/dist/commands/env/unset.d.ts.map +1 -0
  49. package/dist/commands/env/unset.js +36 -0
  50. package/dist/commands/env/unset.js.map +1 -0
  51. package/dist/commands/link.d.ts +16 -0
  52. package/dist/commands/link.d.ts.map +1 -0
  53. package/dist/commands/link.js +123 -0
  54. package/dist/commands/link.js.map +1 -0
  55. package/dist/commands/login.d.ts +28 -0
  56. package/dist/commands/login.d.ts.map +1 -0
  57. package/dist/commands/login.js +190 -0
  58. package/dist/commands/login.js.map +1 -0
  59. package/dist/commands/logout.d.ts +7 -0
  60. package/dist/commands/logout.d.ts.map +1 -0
  61. package/dist/commands/logout.js +33 -0
  62. package/dist/commands/logout.js.map +1 -0
  63. package/dist/commands/logs.d.ts +24 -0
  64. package/dist/commands/logs.d.ts.map +1 -0
  65. package/dist/commands/logs.js +174 -0
  66. package/dist/commands/logs.js.map +1 -0
  67. package/dist/commands/open.d.ts +17 -0
  68. package/dist/commands/open.d.ts.map +1 -0
  69. package/dist/commands/open.js +78 -0
  70. package/dist/commands/open.js.map +1 -0
  71. package/dist/commands/projects/create.d.ts +19 -0
  72. package/dist/commands/projects/create.d.ts.map +1 -0
  73. package/dist/commands/projects/create.js +79 -0
  74. package/dist/commands/projects/create.js.map +1 -0
  75. package/dist/commands/projects/info.d.ts +7 -0
  76. package/dist/commands/projects/info.d.ts.map +1 -0
  77. package/dist/commands/projects/info.js +39 -0
  78. package/dist/commands/projects/info.js.map +1 -0
  79. package/dist/commands/projects/list.d.ts +7 -0
  80. package/dist/commands/projects/list.d.ts.map +1 -0
  81. package/dist/commands/projects/list.js +38 -0
  82. package/dist/commands/projects/list.js.map +1 -0
  83. package/dist/commands/rollback.d.ts +17 -0
  84. package/dist/commands/rollback.d.ts.map +1 -0
  85. package/dist/commands/rollback.js +63 -0
  86. package/dist/commands/rollback.js.map +1 -0
  87. package/dist/commands/scale.d.ts +18 -0
  88. package/dist/commands/scale.d.ts.map +1 -0
  89. package/dist/commands/scale.js +96 -0
  90. package/dist/commands/scale.js.map +1 -0
  91. package/dist/commands/services/create.d.ts +23 -0
  92. package/dist/commands/services/create.d.ts.map +1 -0
  93. package/dist/commands/services/create.js +146 -0
  94. package/dist/commands/services/create.js.map +1 -0
  95. package/dist/commands/services/delete.d.ts +7 -0
  96. package/dist/commands/services/delete.d.ts.map +1 -0
  97. package/dist/commands/services/delete.js +41 -0
  98. package/dist/commands/services/delete.js.map +1 -0
  99. package/dist/commands/services/info.d.ts +7 -0
  100. package/dist/commands/services/info.d.ts.map +1 -0
  101. package/dist/commands/services/info.js +46 -0
  102. package/dist/commands/services/info.js.map +1 -0
  103. package/dist/commands/services/list.d.ts +7 -0
  104. package/dist/commands/services/list.d.ts.map +1 -0
  105. package/dist/commands/services/list.js +40 -0
  106. package/dist/commands/services/list.js.map +1 -0
  107. package/dist/commands/services/restart.d.ts +7 -0
  108. package/dist/commands/services/restart.d.ts.map +1 -0
  109. package/dist/commands/services/restart.js +27 -0
  110. package/dist/commands/services/restart.js.map +1 -0
  111. package/dist/commands/services/start.d.ts +7 -0
  112. package/dist/commands/services/start.d.ts.map +1 -0
  113. package/dist/commands/services/start.js +27 -0
  114. package/dist/commands/services/start.js.map +1 -0
  115. package/dist/commands/services/stop.d.ts +7 -0
  116. package/dist/commands/services/stop.d.ts.map +1 -0
  117. package/dist/commands/services/stop.js +27 -0
  118. package/dist/commands/services/stop.js.map +1 -0
  119. package/dist/commands/status.d.ts +11 -0
  120. package/dist/commands/status.d.ts.map +1 -0
  121. package/dist/commands/status.js +87 -0
  122. package/dist/commands/status.js.map +1 -0
  123. package/dist/commands/unlink.d.ts +7 -0
  124. package/dist/commands/unlink.d.ts.map +1 -0
  125. package/dist/commands/unlink.js +43 -0
  126. package/dist/commands/unlink.js.map +1 -0
  127. package/dist/commands/whoami.d.ts +7 -0
  128. package/dist/commands/whoami.d.ts.map +1 -0
  129. package/dist/commands/whoami.js +46 -0
  130. package/dist/commands/whoami.js.map +1 -0
  131. package/dist/index.d.ts +2 -0
  132. package/dist/index.d.ts.map +1 -0
  133. package/dist/index.js +2 -0
  134. package/dist/index.js.map +1 -0
  135. package/dist/lib/api-client.d.ts +96 -0
  136. package/dist/lib/api-client.d.ts.map +1 -0
  137. package/dist/lib/api-client.js +256 -0
  138. package/dist/lib/api-client.js.map +1 -0
  139. package/dist/lib/auth.d.ts +68 -0
  140. package/dist/lib/auth.d.ts.map +1 -0
  141. package/dist/lib/auth.js +180 -0
  142. package/dist/lib/auth.js.map +1 -0
  143. package/dist/lib/base-command.d.ts +94 -0
  144. package/dist/lib/base-command.d.ts.map +1 -0
  145. package/dist/lib/base-command.js +184 -0
  146. package/dist/lib/base-command.js.map +1 -0
  147. package/dist/lib/context.d.ts +58 -0
  148. package/dist/lib/context.d.ts.map +1 -0
  149. package/dist/lib/context.js +147 -0
  150. package/dist/lib/context.js.map +1 -0
  151. package/dist/lib/errors.d.ts +34 -0
  152. package/dist/lib/errors.d.ts.map +1 -0
  153. package/dist/lib/errors.js +143 -0
  154. package/dist/lib/errors.js.map +1 -0
  155. package/dist/lib/output.d.ts +19 -0
  156. package/dist/lib/output.d.ts.map +1 -0
  157. package/dist/lib/output.js +75 -0
  158. package/dist/lib/output.js.map +1 -0
  159. package/oclif.manifest.json +2880 -0
  160. package/package.json +92 -0
@@ -0,0 +1,256 @@
1
+ import { createRequire } from 'node:module';
2
+ import { getApiKey, getApiUrl } from './auth.js';
3
+ import { AuthenticationError, CliError, NetworkError } from './errors.js';
4
+ // ─── CLI version (read from package.json at load time) ───────────────────────
5
+ const require = createRequire(import.meta.url);
6
+ const { version: CLI_VERSION } = require('../../package.json');
7
+ /** Default request timeout in milliseconds (30 seconds). */
8
+ const REQUEST_TIMEOUT_MS = 30_000;
9
+ export class ApiError extends Error {
10
+ statusCode;
11
+ errorCode;
12
+ details;
13
+ requestId;
14
+ constructor(body) {
15
+ super(body.message);
16
+ this.name = 'ApiError';
17
+ this.statusCode = body.statusCode;
18
+ this.errorCode = body.errorCode;
19
+ this.details = body.details;
20
+ this.requestId = body.requestId;
21
+ }
22
+ }
23
+ // ─── API Client class ──────────────────────────────────────────────────────
24
+ export class GuaraApiClient {
25
+ baseUrl;
26
+ apiKey;
27
+ fetchFn;
28
+ constructor(baseUrl, apiKey, fetchFn) {
29
+ this.baseUrl = baseUrl.replace(/\/+$/, '');
30
+ this.apiKey = apiKey;
31
+ this.fetchFn = fetchFn;
32
+ }
33
+ /**
34
+ * Create a client instance, resolving credentials from the auth module.
35
+ */
36
+ static async create(options = {}) {
37
+ const baseUrl = options.baseUrl ?? getApiUrl();
38
+ const apiKey = options.apiKey ?? (await getApiKey());
39
+ const fetchFn = options.fetch ?? globalThis.fetch;
40
+ return new GuaraApiClient(baseUrl, apiKey, fetchFn);
41
+ }
42
+ // ─── HTTP primitives ──────────────────────────────────────────────────
43
+ async request(method, path, body) {
44
+ if (!this.apiKey) {
45
+ throw new AuthenticationError();
46
+ }
47
+ const url = `${this.baseUrl}${path}`;
48
+ const headers = {
49
+ 'X-API-Key': this.apiKey,
50
+ Accept: 'application/json',
51
+ 'User-Agent': `guara-cli/${CLI_VERSION} (${process.platform}; ${process.arch})`,
52
+ };
53
+ if (body !== undefined) {
54
+ headers['Content-Type'] = 'application/json';
55
+ }
56
+ let response;
57
+ try {
58
+ response = await this.fetchFn(url, {
59
+ method,
60
+ headers,
61
+ body: body !== undefined ? JSON.stringify(body) : undefined,
62
+ signal: AbortSignal.timeout(REQUEST_TIMEOUT_MS),
63
+ });
64
+ }
65
+ catch (error) {
66
+ if (error instanceof DOMException && error.name === 'TimeoutError') {
67
+ throw new NetworkError(this.baseUrl);
68
+ }
69
+ throw new NetworkError(this.baseUrl);
70
+ }
71
+ if (!response.ok) {
72
+ let errorBody;
73
+ try {
74
+ errorBody = (await response.json());
75
+ }
76
+ catch {
77
+ errorBody = {
78
+ statusCode: response.status,
79
+ error: response.statusText || 'Unknown Error',
80
+ message: `API returned HTTP ${String(response.status)} with an unparseable response body.`,
81
+ };
82
+ }
83
+ throw new ApiError(errorBody);
84
+ }
85
+ // 204 No Content
86
+ if (response.status === 204) {
87
+ return undefined;
88
+ }
89
+ return (await response.json());
90
+ }
91
+ get(path) {
92
+ return this.request('GET', path);
93
+ }
94
+ post(path, body) {
95
+ return this.request('POST', path, body);
96
+ }
97
+ put(path, body) {
98
+ return this.request('PUT', path, body);
99
+ }
100
+ patch(path, body) {
101
+ return this.request('PATCH', path, body);
102
+ }
103
+ del(path) {
104
+ return this.request('DELETE', path);
105
+ }
106
+ // ─── Query string helpers ─────────────────────────────────────────────
107
+ paginated(path, params) {
108
+ const qs = new URLSearchParams();
109
+ if (params?.page !== undefined)
110
+ qs.set('page', String(params.page));
111
+ if (params?.limit !== undefined)
112
+ qs.set('limit', String(params.limit));
113
+ const query = qs.toString();
114
+ return query ? `${path}?${query}` : path;
115
+ }
116
+ // ─── Slug-to-UUID resolution ─────────────────────────────────────────
117
+ static UUID_REGEX = /^[\da-f]{8}-[\da-f]{4}-[\da-f]{4}-[\da-f]{4}-[\da-f]{12}$/i;
118
+ /**
119
+ * Resolve a project identifier (slug or UUID) to a UUID.
120
+ * If already a UUID, returns it directly. Otherwise lists projects to find the matching slug.
121
+ */
122
+ async resolveProjectId(projectIdOrSlug) {
123
+ if (GuaraApiClient.UUID_REGEX.test(projectIdOrSlug)) {
124
+ return projectIdOrSlug;
125
+ }
126
+ const { data } = await this.listProjects({ limit: 100 });
127
+ const match = data.find((p) => p.slug === projectIdOrSlug);
128
+ if (!match) {
129
+ throw new CliError(`Project "${projectIdOrSlug}" not found.`, 1, 'Check your project slug with `guara projects list`.');
130
+ }
131
+ return match.id;
132
+ }
133
+ /**
134
+ * Resolve a service identifier (slug or UUID) to a UUID.
135
+ */
136
+ async resolveServiceId(projectId, serviceIdOrSlug) {
137
+ if (GuaraApiClient.UUID_REGEX.test(serviceIdOrSlug)) {
138
+ return serviceIdOrSlug;
139
+ }
140
+ const { data } = await this.listServices(projectId, { limit: 100 });
141
+ const match = data.find((s) => s.slug === serviceIdOrSlug);
142
+ if (!match) {
143
+ throw new CliError(`Service "${serviceIdOrSlug}" not found.`, 1, 'Check your service slug with `guara services list`.');
144
+ }
145
+ return match.id;
146
+ }
147
+ // ─── Auth / User ──────────────────────────────────────────────────────
148
+ whoami() {
149
+ return this.get('/api/v1/auth/me');
150
+ }
151
+ // ─── Projects ─────────────────────────────────────────────────────────
152
+ listProjects(params) {
153
+ return this.get(this.paginated('/api/v1/projects', params));
154
+ }
155
+ getProject(projectSlug) {
156
+ return this.get(`/api/v1/projects/${encodeURIComponent(projectSlug)}`);
157
+ }
158
+ createProject(dto) {
159
+ return this.post('/api/v1/projects', dto);
160
+ }
161
+ updateProject(projectSlug, dto) {
162
+ return this.patch(`/api/v1/projects/${encodeURIComponent(projectSlug)}`, dto);
163
+ }
164
+ deleteProject(projectSlug) {
165
+ return this.del(`/api/v1/projects/${encodeURIComponent(projectSlug)}`);
166
+ }
167
+ // ─── Services ─────────────────────────────────────────────────────────
168
+ listServices(projectSlug, params) {
169
+ return this.get(this.paginated(`/api/v1/projects/${encodeURIComponent(projectSlug)}/services`, params));
170
+ }
171
+ getService(projectSlug, serviceSlug) {
172
+ return this.get(`/api/v1/projects/${encodeURIComponent(projectSlug)}/services/${encodeURIComponent(serviceSlug)}`);
173
+ }
174
+ createService(projectSlug, dto) {
175
+ return this.post(`/api/v1/projects/${encodeURIComponent(projectSlug)}/services`, dto);
176
+ }
177
+ updateService(projectSlug, serviceSlug, dto) {
178
+ return this.patch(`/api/v1/projects/${encodeURIComponent(projectSlug)}/services/${encodeURIComponent(serviceSlug)}`, dto);
179
+ }
180
+ deleteService(projectSlug, serviceSlug) {
181
+ return this.del(`/api/v1/projects/${encodeURIComponent(projectSlug)}/services/${encodeURIComponent(serviceSlug)}`);
182
+ }
183
+ restartService(projectSlug, serviceSlug) {
184
+ return this.post(`/api/v1/projects/${encodeURIComponent(projectSlug)}/services/${encodeURIComponent(serviceSlug)}/restart`);
185
+ }
186
+ stopService(projectSlug, serviceSlug) {
187
+ return this.post(`/api/v1/projects/${encodeURIComponent(projectSlug)}/services/${encodeURIComponent(serviceSlug)}/stop`);
188
+ }
189
+ startService(projectSlug, serviceSlug) {
190
+ return this.post(`/api/v1/projects/${encodeURIComponent(projectSlug)}/services/${encodeURIComponent(serviceSlug)}/start`);
191
+ }
192
+ // ─── Deployments ──────────────────────────────────────────────────────
193
+ listDeployments(projectSlug, serviceSlug, params) {
194
+ return this.get(this.paginated(`/api/v1/projects/${encodeURIComponent(projectSlug)}/services/${encodeURIComponent(serviceSlug)}/deployments`, params));
195
+ }
196
+ createDeployment(projectSlug, serviceSlug, dto) {
197
+ return this.post(`/api/v1/projects/${encodeURIComponent(projectSlug)}/services/${encodeURIComponent(serviceSlug)}/deployments`, dto);
198
+ }
199
+ getDeployment(projectSlug, serviceSlug, deploymentId) {
200
+ return this.get(`/api/v1/projects/${encodeURIComponent(projectSlug)}/services/${encodeURIComponent(serviceSlug)}/deployments/${encodeURIComponent(deploymentId)}`);
201
+ }
202
+ rollbackDeployment(projectSlug, serviceSlug, targetDeploymentId) {
203
+ return this.post(`/api/v1/projects/${encodeURIComponent(projectSlug)}/services/${encodeURIComponent(serviceSlug)}/deployments/${encodeURIComponent(targetDeploymentId)}/rollback`);
204
+ }
205
+ // ─── Domains ──────────────────────────────────────────────────────────
206
+ listDomains(projectSlug, serviceSlug) {
207
+ return this.get(`/api/v1/projects/${encodeURIComponent(projectSlug)}/services/${encodeURIComponent(serviceSlug)}/domains`);
208
+ }
209
+ createDomain(projectSlug, serviceSlug, dto) {
210
+ return this.post(`/api/v1/projects/${encodeURIComponent(projectSlug)}/services/${encodeURIComponent(serviceSlug)}/domains`, dto);
211
+ }
212
+ deleteDomain(projectSlug, serviceSlug, domainId) {
213
+ return this.del(`/api/v1/projects/${encodeURIComponent(projectSlug)}/services/${encodeURIComponent(serviceSlug)}/domains/${encodeURIComponent(domainId)}`);
214
+ }
215
+ // ─── Environment Variables ────────────────────────────────────────────
216
+ getEnvVars(projectSlug, serviceSlug) {
217
+ return this.get(`/api/v1/projects/${encodeURIComponent(projectSlug)}/services/${encodeURIComponent(serviceSlug)}/env`);
218
+ }
219
+ updateEnvVars(projectSlug, serviceSlug, dto) {
220
+ return this.put(`/api/v1/projects/${encodeURIComponent(projectSlug)}/services/${encodeURIComponent(serviceSlug)}/env`, dto);
221
+ }
222
+ // ─── Scaling ─────────────────────────────────────────────────────────
223
+ updateScaling(projectSlug, serviceSlug, dto) {
224
+ return this.patch(`/api/v1/projects/${encodeURIComponent(projectSlug)}/services/${encodeURIComponent(serviceSlug)}/scaling`, dto);
225
+ }
226
+ // ─── Logs ──────────────────────────────────────────────────────────
227
+ queryLogs(projectSlug, serviceSlug, params = {}) {
228
+ const qs = new URLSearchParams();
229
+ if (params.since)
230
+ qs.set('since', params.since);
231
+ if (params.until)
232
+ qs.set('until', params.until);
233
+ if (params.limit !== undefined)
234
+ qs.set('limit', String(params.limit));
235
+ if (params.search)
236
+ qs.set('search', params.search);
237
+ if (params.level)
238
+ qs.set('level', params.level);
239
+ if (params.direction)
240
+ qs.set('direction', params.direction);
241
+ const query = qs.toString();
242
+ const base = `/api/v1/projects/${encodeURIComponent(projectSlug)}/services/${encodeURIComponent(serviceSlug)}/logs`;
243
+ return this.get(query ? `${base}?${query}` : base);
244
+ }
245
+ // ─── Platform Status ───────────────────────────────────────────────
246
+ /**
247
+ * Fetch public platform status.
248
+ *
249
+ * Note: This endpoint does not require authentication on the server,
250
+ * but the client still sends the Bearer token if available.
251
+ */
252
+ getPlatformStatus() {
253
+ return this.get('/api/v1/status');
254
+ }
255
+ }
256
+ //# sourceMappingURL=api-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-client.js","sourceRoot":"","sources":["../../src/lib/api-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,68 @@
1
+ import Conf from 'conf';
2
+ interface CliConfig {
3
+ apiUrl: string;
4
+ apiKey?: string;
5
+ }
6
+ declare const config: Conf<CliConfig>;
7
+ /**
8
+ * Save an API key.
9
+ *
10
+ * Strategy:
11
+ * 1. Try the OS keychain via `@napi-rs/keyring`.
12
+ * 2. Fall back to the plain-text `conf` store (XDG config dir).
13
+ *
14
+ * Returns `'keychain'` or `'file'` to indicate which backend was used.
15
+ */
16
+ export declare function saveApiKey(key: string): Promise<'keychain' | 'file'>;
17
+ /**
18
+ * Resolve the current API key.
19
+ *
20
+ * Resolution order:
21
+ * 1. `GUARA_API_KEY` environment variable (for CI / scripts).
22
+ * 2. OS keychain.
23
+ * 3. `conf` file store.
24
+ */
25
+ export declare function getApiKey(): Promise<string | undefined>;
26
+ /**
27
+ * Remove stored credentials from all backends.
28
+ *
29
+ * Returns `true` if a credential was found and deleted, `false` otherwise.
30
+ */
31
+ export declare function clearApiKey(): Promise<boolean>;
32
+ /**
33
+ * Get the configured API base URL.
34
+ *
35
+ * Resolution order:
36
+ * 1. `GUARA_API_URL` environment variable.
37
+ * 2. `conf` file store (defaults to https://api.guaracloud.com).
38
+ */
39
+ export declare function getApiUrl(): string;
40
+ /**
41
+ * Set the API base URL in the config store.
42
+ */
43
+ export declare function setApiUrl(url: string): void;
44
+ /**
45
+ * Return the underlying conf path for debugging/diagnostics.
46
+ */
47
+ export declare function getConfigPath(): string;
48
+ /**
49
+ * Set a configuration value by key.
50
+ *
51
+ * Only user-facing keys (e.g. `apiUrl`) are writable.
52
+ * The `apiKey` is managed exclusively through {@link saveApiKey} / {@link clearApiKey}.
53
+ */
54
+ export declare function setConfigValue(key: string, value: string): void;
55
+ /**
56
+ * Get a single configuration value by key.
57
+ */
58
+ export declare function getConfigValue(key: string): string | undefined;
59
+ /**
60
+ * Return all non-sensitive configuration as a plain object.
61
+ */
62
+ export declare function getAllConfig(): Record<string, string | undefined>;
63
+ /**
64
+ * Reset configuration to defaults (clears apiUrl override; does NOT clear the API key).
65
+ */
66
+ export declare function resetConfig(): void;
67
+ export { config as _config };
68
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/lib/auth.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AAKxB,UAAU,SAAS;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,QAAA,MAAM,MAAM,iBAKV,CAAC;AAgBH;;;;;;;;GAQG;AACH,wBAAsB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,MAAM,CAAC,CAmB1E;AAED;;;;;;;GAOG;AACH,wBAAsB,SAAS,IAAI,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAoB7D;AAED;;;;GAIG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC,CAmBpD;AAED;;;;;;GAMG;AACH,wBAAgB,SAAS,IAAI,MAAM,CAElC;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAE3C;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAeD;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAU/D;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAU9D;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAMjE;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,IAAI,CAElC;AAGD,OAAO,EAAE,MAAM,IAAI,OAAO,EAAE,CAAC"}
@@ -0,0 +1,180 @@
1
+ import Conf from 'conf';
2
+ const KEYRING_SERVICE = 'guaracloud-cli';
3
+ const KEYRING_ACCOUNT = 'api-key';
4
+ const config = new Conf({
5
+ projectName: 'guara',
6
+ defaults: {
7
+ apiUrl: 'https://api.guaracloud.com',
8
+ },
9
+ });
10
+ /**
11
+ * Attempt to load `@napi-rs/keyring` at runtime.
12
+ * Returns the Entry class or undefined if the native module is unavailable
13
+ * (e.g., missing native binary, headless CI, Docker without secrets service).
14
+ */
15
+ async function loadKeyring() {
16
+ try {
17
+ const mod = await import('@napi-rs/keyring');
18
+ return mod.Entry;
19
+ }
20
+ catch {
21
+ return undefined;
22
+ }
23
+ }
24
+ /**
25
+ * Save an API key.
26
+ *
27
+ * Strategy:
28
+ * 1. Try the OS keychain via `@napi-rs/keyring`.
29
+ * 2. Fall back to the plain-text `conf` store (XDG config dir).
30
+ *
31
+ * Returns `'keychain'` or `'file'` to indicate which backend was used.
32
+ */
33
+ export async function saveApiKey(key) {
34
+ const Entry = await loadKeyring();
35
+ if (Entry) {
36
+ try {
37
+ const entry = new Entry(KEYRING_SERVICE, KEYRING_ACCOUNT);
38
+ entry.setPassword(key);
39
+ // Clear any stale file-based key so we don't have two sources of truth.
40
+ config.delete('apiKey');
41
+ return 'keychain';
42
+ }
43
+ catch {
44
+ // Keychain write failed (e.g., sandbox restriction). Fall through.
45
+ }
46
+ }
47
+ config.set('apiKey', key);
48
+ return 'file';
49
+ }
50
+ /**
51
+ * Resolve the current API key.
52
+ *
53
+ * Resolution order:
54
+ * 1. `GUARA_API_KEY` environment variable (for CI / scripts).
55
+ * 2. OS keychain.
56
+ * 3. `conf` file store.
57
+ */
58
+ export async function getApiKey() {
59
+ const envKey = process.env['GUARA_API_KEY'];
60
+ if (envKey) {
61
+ return envKey;
62
+ }
63
+ const Entry = await loadKeyring();
64
+ if (Entry) {
65
+ try {
66
+ const entry = new Entry(KEYRING_SERVICE, KEYRING_ACCOUNT);
67
+ const password = entry.getPassword();
68
+ if (password !== null) {
69
+ return password;
70
+ }
71
+ }
72
+ catch {
73
+ // Keychain read failed — fall through to file.
74
+ }
75
+ }
76
+ return config.get('apiKey');
77
+ }
78
+ /**
79
+ * Remove stored credentials from all backends.
80
+ *
81
+ * Returns `true` if a credential was found and deleted, `false` otherwise.
82
+ */
83
+ export async function clearApiKey() {
84
+ let deleted = false;
85
+ const Entry = await loadKeyring();
86
+ if (Entry) {
87
+ try {
88
+ const entry = new Entry(KEYRING_SERVICE, KEYRING_ACCOUNT);
89
+ deleted = entry.deleteCredential();
90
+ }
91
+ catch {
92
+ // Ignore — may not exist.
93
+ }
94
+ }
95
+ if (config.has('apiKey')) {
96
+ config.delete('apiKey');
97
+ deleted = true;
98
+ }
99
+ return deleted;
100
+ }
101
+ /**
102
+ * Get the configured API base URL.
103
+ *
104
+ * Resolution order:
105
+ * 1. `GUARA_API_URL` environment variable.
106
+ * 2. `conf` file store (defaults to https://api.guaracloud.com).
107
+ */
108
+ export function getApiUrl() {
109
+ return process.env['GUARA_API_URL'] ?? config.get('apiUrl');
110
+ }
111
+ /**
112
+ * Set the API base URL in the config store.
113
+ */
114
+ export function setApiUrl(url) {
115
+ config.set('apiUrl', url);
116
+ }
117
+ /**
118
+ * Return the underlying conf path for debugging/diagnostics.
119
+ */
120
+ export function getConfigPath() {
121
+ return config.path;
122
+ }
123
+ // ─── Config key/value helpers ───────────────────────────────────────────────
124
+ /** Map of user-facing kebab-case keys to internal camelCase keys. */
125
+ const CONFIG_KEY_MAP = {
126
+ 'api-url': 'apiUrl',
127
+ apiUrl: 'apiUrl',
128
+ };
129
+ /** Resolve a user-facing key (kebab or camel) to the internal config key. */
130
+ function resolveConfigKey(key) {
131
+ return CONFIG_KEY_MAP[key];
132
+ }
133
+ /**
134
+ * Set a configuration value by key.
135
+ *
136
+ * Only user-facing keys (e.g. `apiUrl`) are writable.
137
+ * The `apiKey` is managed exclusively through {@link saveApiKey} / {@link clearApiKey}.
138
+ */
139
+ export function setConfigValue(key, value) {
140
+ const resolved = resolveConfigKey(key);
141
+ if (!resolved) {
142
+ throw new Error(`Unknown config key: ${key}. Allowed keys: ${Object.keys(CONFIG_KEY_MAP)
143
+ .filter((k) => k.includes('-'))
144
+ .join(', ')}`);
145
+ }
146
+ config.set(resolved, value);
147
+ }
148
+ /**
149
+ * Get a single configuration value by key.
150
+ */
151
+ export function getConfigValue(key) {
152
+ const resolved = resolveConfigKey(key);
153
+ if (resolved === 'apiUrl') {
154
+ return config.get('apiUrl');
155
+ }
156
+ // apiKey is sensitive — return whether it's set, not the value.
157
+ if (key === 'apiKey' || key === 'api-key') {
158
+ return config.has('apiKey') ? '(set)' : undefined;
159
+ }
160
+ return undefined;
161
+ }
162
+ /**
163
+ * Return all non-sensitive configuration as a plain object.
164
+ */
165
+ export function getAllConfig() {
166
+ return {
167
+ 'api-url': config.get('apiUrl'),
168
+ 'api-key': config.has('apiKey') ? '(set)' : undefined,
169
+ 'config-path': config.path,
170
+ };
171
+ }
172
+ /**
173
+ * Reset configuration to defaults (clears apiUrl override; does NOT clear the API key).
174
+ */
175
+ export function resetConfig() {
176
+ config.set('apiUrl', 'https://api.guaracloud.com');
177
+ }
178
+ // Re-export for testing seams.
179
+ export { config as _config };
180
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/lib/auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,94 @@
1
+ import { Command } from '@oclif/core';
2
+ import { GuaraApiClient } from './api-client.js';
3
+ import type { ResolvedContext } from './context.js';
4
+ export declare const globalFlags: {
5
+ readonly json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
6
+ readonly quiet: import("@oclif/core/interfaces").BooleanFlag<boolean>;
7
+ readonly 'api-key': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
8
+ readonly 'api-url': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
9
+ readonly project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
10
+ readonly service: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
11
+ readonly yes: import("@oclif/core/interfaces").BooleanFlag<boolean>;
12
+ };
13
+ export type GlobalFlags = {
14
+ json: boolean;
15
+ quiet: boolean;
16
+ 'api-key': string | undefined;
17
+ 'api-url': string | undefined;
18
+ project: string | undefined;
19
+ service: string | undefined;
20
+ yes: boolean;
21
+ };
22
+ /**
23
+ * Abstract base class for all GuaraCloud CLI commands.
24
+ *
25
+ * Provides:
26
+ * - Global flags (json, quiet, api-key, api-url, project, service, yes)
27
+ * - API client initialisation via {@link initApiClient}
28
+ * - Context resolution via {@link resolveContext}
29
+ * - Helper methods for project/service requirement enforcement
30
+ * - Structured JSON and quiet output helpers
31
+ * - Unified error handling for ApiError, CliError, and unexpected errors
32
+ */
33
+ export declare abstract class BaseCommand extends Command {
34
+ static baseFlags: {
35
+ readonly json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
36
+ readonly quiet: import("@oclif/core/interfaces").BooleanFlag<boolean>;
37
+ readonly 'api-key': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
38
+ readonly 'api-url': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
39
+ readonly project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
40
+ readonly service: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
41
+ readonly yes: import("@oclif/core/interfaces").BooleanFlag<boolean>;
42
+ };
43
+ /**
44
+ * Create an authenticated {@link GuaraApiClient} using the resolved flags.
45
+ *
46
+ * Resolution order for the API key:
47
+ * 1. `--api-key` flag
48
+ * 2. Auth module (env -> keychain -> config file)
49
+ *
50
+ * Resolution order for the API URL:
51
+ * 1. `--api-url` flag
52
+ * 2. Auth module (env -> config file, defaults to https://api.guaracloud.com)
53
+ */
54
+ protected initApiClient(flags: GlobalFlags): Promise<GuaraApiClient>;
55
+ /**
56
+ * Resolve project/service context from flags, environment, or `.guara.json`.
57
+ *
58
+ * Returns `undefined` when no project could be determined from any source.
59
+ */
60
+ protected resolveProjectContext(flags: GlobalFlags): Promise<ResolvedContext | undefined>;
61
+ /**
62
+ * Resolve context and fail if no project is available.
63
+ * Resolves slug to UUID via the API client when needed.
64
+ *
65
+ * @returns The resolved project UUID.
66
+ * @throws {CliError} when no project could be resolved.
67
+ */
68
+ protected requireProject(flags: GlobalFlags, client: GuaraApiClient): Promise<string>;
69
+ /**
70
+ * Resolve context and fail if no service is available.
71
+ * Resolves slugs to UUIDs via the API client when needed.
72
+ *
73
+ * @returns A tuple of `[projectId, serviceId]` (UUIDs).
74
+ * @throws {CliError} when project or service could not be resolved.
75
+ */
76
+ protected requireService(flags: GlobalFlags, client: GuaraApiClient): Promise<[project: string, service: string]>;
77
+ /**
78
+ * Print structured JSON to stdout and return it (so oclif's `--json`
79
+ * envelope can use the value if `enableJsonFlag` is set on the command).
80
+ */
81
+ protected outputJson(data: unknown): void;
82
+ /**
83
+ * Print a minimal value for `--quiet` mode (e.g. a slug or ID).
84
+ */
85
+ protected outputQuiet(value: string | string[]): void;
86
+ /**
87
+ * Unified error handler that formats known error types into user-friendly
88
+ * messages, with optional JSON output.
89
+ */
90
+ protected catch(err: Error & {
91
+ exitCode?: number;
92
+ }): Promise<void>;
93
+ }
94
+ //# sourceMappingURL=base-command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base-command.d.ts","sourceRoot":"","sources":["../../src/lib/base-command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAS,MAAM,aAAa,CAAC;AAG7C,OAAO,EAAY,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAG3D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAMpD,eAAO,MAAM,WAAW;;;;;;;;CAqCd,CAAC;AAIX,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,OAAO,CAAC;IACf,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,GAAG,EAAE,OAAO,CAAC;CACd,CAAC;AAIF;;;;;;;;;;GAUG;AACH,8BAAsB,WAAY,SAAQ,OAAO;IAC/C,OAAgB,SAAS;;;;;;;;MAAe;IAIxC;;;;;;;;;;OAUG;cACa,aAAa,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,cAAc,CAAC;IAS1E;;;;OAIG;cACa,qBAAqB,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,eAAe,GAAG,SAAS,CAAC;IAO/F;;;;;;OAMG;cACa,cAAc,CAAC,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC;IAc3F;;;;;;OAMG;cACa,cAAc,CAC5B,KAAK,EAAE,WAAW,EAClB,MAAM,EAAE,cAAc,GACrB,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IA0B9C;;;OAGG;IACH,SAAS,CAAC,UAAU,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI;IAIzC;;OAEG;IACH,SAAS,CAAC,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI;IAMrD;;;OAGG;cAEsB,KAAK,CAAC,GAAG,EAAE,KAAK,GAAG;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;CAiDlF"}