@uluops/cli 0.2.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.
- package/LICENSE +21 -0
- package/README.md +825 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +93 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/analytics.d.ts +6 -0
- package/dist/commands/analytics.d.ts.map +1 -0
- package/dist/commands/analytics.js +445 -0
- package/dist/commands/analytics.js.map +1 -0
- package/dist/commands/auth.d.ts +6 -0
- package/dist/commands/auth.d.ts.map +1 -0
- package/dist/commands/auth.js +496 -0
- package/dist/commands/auth.js.map +1 -0
- package/dist/commands/completion.d.ts +7 -0
- package/dist/commands/completion.d.ts.map +1 -0
- package/dist/commands/completion.js +188 -0
- package/dist/commands/completion.js.map +1 -0
- package/dist/commands/config.d.ts +6 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +279 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/definitions.d.ts +6 -0
- package/dist/commands/definitions.d.ts.map +1 -0
- package/dist/commands/definitions.js +229 -0
- package/dist/commands/definitions.js.map +1 -0
- package/dist/commands/deps.d.ts +6 -0
- package/dist/commands/deps.d.ts.map +1 -0
- package/dist/commands/deps.js +87 -0
- package/dist/commands/deps.js.map +1 -0
- package/dist/commands/exec.d.ts +6 -0
- package/dist/commands/exec.d.ts.map +1 -0
- package/dist/commands/exec.js +334 -0
- package/dist/commands/exec.js.map +1 -0
- package/dist/commands/executions.d.ts +6 -0
- package/dist/commands/executions.d.ts.map +1 -0
- package/dist/commands/executions.js +63 -0
- package/dist/commands/executions.js.map +1 -0
- package/dist/commands/forks.d.ts +6 -0
- package/dist/commands/forks.d.ts.map +1 -0
- package/dist/commands/forks.js +145 -0
- package/dist/commands/forks.js.map +1 -0
- package/dist/commands/issues.d.ts +6 -0
- package/dist/commands/issues.d.ts.map +1 -0
- package/dist/commands/issues.js +458 -0
- package/dist/commands/issues.js.map +1 -0
- package/dist/commands/models.d.ts +6 -0
- package/dist/commands/models.d.ts.map +1 -0
- package/dist/commands/models.js +156 -0
- package/dist/commands/models.js.map +1 -0
- package/dist/commands/projects.d.ts +6 -0
- package/dist/commands/projects.d.ts.map +1 -0
- package/dist/commands/projects.js +262 -0
- package/dist/commands/projects.js.map +1 -0
- package/dist/commands/render.d.ts +6 -0
- package/dist/commands/render.d.ts.map +1 -0
- package/dist/commands/render.js +59 -0
- package/dist/commands/render.js.map +1 -0
- package/dist/commands/runs.d.ts +6 -0
- package/dist/commands/runs.d.ts.map +1 -0
- package/dist/commands/runs.js +442 -0
- package/dist/commands/runs.js.map +1 -0
- package/dist/commands/taxonomy.d.ts +6 -0
- package/dist/commands/taxonomy.d.ts.map +1 -0
- package/dist/commands/taxonomy.js +45 -0
- package/dist/commands/taxonomy.js.map +1 -0
- package/dist/commands/translation.d.ts +6 -0
- package/dist/commands/translation.d.ts.map +1 -0
- package/dist/commands/translation.js +85 -0
- package/dist/commands/translation.js.map +1 -0
- package/dist/commands/versions.d.ts +6 -0
- package/dist/commands/versions.d.ts.map +1 -0
- package/dist/commands/versions.js +61 -0
- package/dist/commands/versions.js.map +1 -0
- package/dist/context.d.ts +85 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +386 -0
- package/dist/context.js.map +1 -0
- package/dist/formatters/core.d.ts +31 -0
- package/dist/formatters/core.d.ts.map +1 -0
- package/dist/formatters/core.js +176 -0
- package/dist/formatters/core.js.map +1 -0
- package/dist/formatters/ops.d.ts +43 -0
- package/dist/formatters/ops.d.ts.map +1 -0
- package/dist/formatters/ops.js +112 -0
- package/dist/formatters/ops.js.map +1 -0
- package/dist/formatters/registry.d.ts +41 -0
- package/dist/formatters/registry.d.ts.map +1 -0
- package/dist/formatters/registry.js +167 -0
- package/dist/formatters/registry.js.map +1 -0
- package/dist/formatters/table.d.ts +18 -0
- package/dist/formatters/table.d.ts.map +1 -0
- package/dist/formatters/table.js +76 -0
- package/dist/formatters/table.js.map +1 -0
- package/dist/utils.d.ts +99 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +201 -0
- package/dist/utils.js.map +1 -0
- package/package.json +57 -0
|
@@ -0,0 +1,496 @@
|
|
|
1
|
+
import { mkdirSync, existsSync, readFileSync } from 'node:fs';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { homedir } from 'node:os';
|
|
4
|
+
import { OpsClient } from '@uluops/ops-sdk';
|
|
5
|
+
import { createOpsContext, createUnauthenticatedContext, handleOpsError, } from '../context.js';
|
|
6
|
+
import { withSpinner, writeFileAtomic, exitWithError } from '../utils.js';
|
|
7
|
+
import { formatApiKeys } from '../formatters/ops.js';
|
|
8
|
+
/**
|
|
9
|
+
* Config file paths
|
|
10
|
+
*/
|
|
11
|
+
const CONFIG_PATHS = {
|
|
12
|
+
GLOBAL_DIR: '.uluops',
|
|
13
|
+
CREDENTIALS: '.uluops/credentials.json',
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* Save credentials to the credentials file
|
|
17
|
+
*/
|
|
18
|
+
function saveCredentials(profile, credentials) {
|
|
19
|
+
const configDir = join(homedir(), CONFIG_PATHS.GLOBAL_DIR);
|
|
20
|
+
const credPath = join(homedir(), CONFIG_PATHS.CREDENTIALS);
|
|
21
|
+
// Create config directory if it doesn't exist
|
|
22
|
+
if (!existsSync(configDir)) {
|
|
23
|
+
mkdirSync(configDir, { recursive: true });
|
|
24
|
+
}
|
|
25
|
+
// Load existing credentials or start fresh
|
|
26
|
+
let stored = {};
|
|
27
|
+
if (existsSync(credPath)) {
|
|
28
|
+
try {
|
|
29
|
+
stored = JSON.parse(readFileSync(credPath, 'utf-8'));
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
// Start fresh if file is corrupted
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
// Update the profile
|
|
36
|
+
stored[profile] = credentials;
|
|
37
|
+
// Write back atomically (write to .tmp then rename)
|
|
38
|
+
writeFileAtomic(credPath, JSON.stringify(stored, null, 2));
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Remove credentials for a profile from the credentials file
|
|
42
|
+
*/
|
|
43
|
+
function removeCredentials(profile) {
|
|
44
|
+
const credPath = join(homedir(), CONFIG_PATHS.CREDENTIALS);
|
|
45
|
+
if (!existsSync(credPath)) {
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
let stored = {};
|
|
49
|
+
try {
|
|
50
|
+
stored = JSON.parse(readFileSync(credPath, 'utf-8'));
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
delete stored[profile];
|
|
56
|
+
writeFileAtomic(credPath, JSON.stringify(stored, null, 2));
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Register auth commands
|
|
60
|
+
*/
|
|
61
|
+
export function registerAuthCommands(program) {
|
|
62
|
+
const auth = program
|
|
63
|
+
.command('auth')
|
|
64
|
+
.description('Authentication and credential management');
|
|
65
|
+
// ulu auth login
|
|
66
|
+
auth
|
|
67
|
+
.command('login')
|
|
68
|
+
.description('Login with email and password')
|
|
69
|
+
.option('-e, --email <email>', 'Email address')
|
|
70
|
+
.option('-p, --password <password>', 'Password')
|
|
71
|
+
.action(async (options, cmd) => {
|
|
72
|
+
const globalOpts = cmd.optsWithGlobals();
|
|
73
|
+
const ctx = createUnauthenticatedContext(globalOpts);
|
|
74
|
+
if (!options.email || !options.password) {
|
|
75
|
+
console.error('Error: Both --email and --password are required');
|
|
76
|
+
console.error('Usage: ulu auth login --email <email> --password <password>');
|
|
77
|
+
process.exit(1);
|
|
78
|
+
}
|
|
79
|
+
try {
|
|
80
|
+
const result = await withSpinner(ctx, { start: 'Logging in...', success: 'Login successful', failure: 'Login failed' }, async () => {
|
|
81
|
+
const client = new OpsClient({ baseUrl: ctx.baseUrl, debug: ctx.debug, email: options.email, password: options.password });
|
|
82
|
+
return client.login(options.email, options.password);
|
|
83
|
+
});
|
|
84
|
+
// Save credentials
|
|
85
|
+
const profile = globalOpts.profile ?? 'default';
|
|
86
|
+
try {
|
|
87
|
+
saveCredentials(profile, {
|
|
88
|
+
type: 'session',
|
|
89
|
+
sessionToken: result.sessionToken,
|
|
90
|
+
expiresAt: result.expiresAt,
|
|
91
|
+
email: options.email,
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
catch (saveError) {
|
|
95
|
+
const msg = saveError instanceof Error ? saveError.message : String(saveError);
|
|
96
|
+
if (msg.includes('EACCES') || msg.includes('permission denied')) {
|
|
97
|
+
exitWithError(`Cannot save credentials: permission denied.\n` +
|
|
98
|
+
'Check file permissions on ~/.uluops/credentials.json');
|
|
99
|
+
}
|
|
100
|
+
exitWithError(`Failed to save credentials: ${msg}`);
|
|
101
|
+
}
|
|
102
|
+
if (ctx.json) {
|
|
103
|
+
console.log(JSON.stringify({ success: true, profile }, null, 2));
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
console.log(`\nCredentials saved to profile: ${profile}`);
|
|
107
|
+
console.log('You can now use other ulu commands.');
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
catch (error) {
|
|
111
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
112
|
+
if (message.includes('No credentials configured') || message.includes('credentials')) {
|
|
113
|
+
console.error('Error: Invalid email or password.');
|
|
114
|
+
console.error('\nHint: Check your email and password, then try again.');
|
|
115
|
+
process.exit(1);
|
|
116
|
+
}
|
|
117
|
+
handleOpsError(error, ctx);
|
|
118
|
+
}
|
|
119
|
+
});
|
|
120
|
+
// ulu auth logout
|
|
121
|
+
auth
|
|
122
|
+
.command('logout')
|
|
123
|
+
.description('Logout and revoke all sessions')
|
|
124
|
+
.action(async (_, cmd) => {
|
|
125
|
+
const globalOpts = cmd.optsWithGlobals();
|
|
126
|
+
const profile = globalOpts.profile ?? 'default';
|
|
127
|
+
const json = globalOpts.json ?? false;
|
|
128
|
+
const debug = globalOpts.debug ?? false;
|
|
129
|
+
// Try to revoke server-side sessions using raw client (avoid createOpsContext
|
|
130
|
+
// which calls process.exit on expired sessions)
|
|
131
|
+
let sessionsRevoked = 0;
|
|
132
|
+
try {
|
|
133
|
+
const credPath = join(homedir(), CONFIG_PATHS.CREDENTIALS);
|
|
134
|
+
if (existsSync(credPath)) {
|
|
135
|
+
const stored = JSON.parse(readFileSync(credPath, 'utf-8'));
|
|
136
|
+
const creds = stored[profile];
|
|
137
|
+
if (creds) {
|
|
138
|
+
const { loadConfig: loadOpsConfig } = await import('@uluops/ops-sdk');
|
|
139
|
+
const config = loadOpsConfig({ baseUrl: globalOpts.baseUrl, profile, debug: globalOpts.debug });
|
|
140
|
+
const client = new OpsClient({
|
|
141
|
+
apiKey: creds.type === 'api_key' ? creds.apiKey : undefined,
|
|
142
|
+
sessionToken: creds.type === 'session' ? creds.sessionToken : undefined,
|
|
143
|
+
baseUrl: config.baseUrl,
|
|
144
|
+
debug,
|
|
145
|
+
});
|
|
146
|
+
const spinnerCtx = { json, debug, quiet: false };
|
|
147
|
+
const result = await withSpinner(spinnerCtx, { start: 'Logging out...', success: 'Logged out', failure: 'Logout failed' }, () => client.logout());
|
|
148
|
+
sessionsRevoked = result.sessionsRevoked;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
catch {
|
|
153
|
+
// If credentials are expired/invalid, that's fine — we still remove local creds
|
|
154
|
+
}
|
|
155
|
+
// Always remove local credentials for this profile
|
|
156
|
+
removeCredentials(profile);
|
|
157
|
+
if (json) {
|
|
158
|
+
console.log(JSON.stringify({ success: true, profile, sessionsRevoked }, null, 2));
|
|
159
|
+
}
|
|
160
|
+
else {
|
|
161
|
+
if (sessionsRevoked > 0) {
|
|
162
|
+
console.log(`Revoked ${sessionsRevoked} server session(s)`);
|
|
163
|
+
}
|
|
164
|
+
console.log(`Removed local credentials for profile "${profile}"`);
|
|
165
|
+
}
|
|
166
|
+
});
|
|
167
|
+
// ulu auth whoami
|
|
168
|
+
auth
|
|
169
|
+
.command('whoami')
|
|
170
|
+
.description('Show current authenticated user')
|
|
171
|
+
.action(async (_, cmd) => {
|
|
172
|
+
const globalOpts = cmd.optsWithGlobals();
|
|
173
|
+
const ctx = createOpsContext(globalOpts);
|
|
174
|
+
try {
|
|
175
|
+
const user = await withSpinner(ctx, { start: 'Fetching user info...', failure: 'Failed to fetch user info' }, () => ctx.client.auth.getMe());
|
|
176
|
+
if (ctx.json) {
|
|
177
|
+
console.log(JSON.stringify(user, null, 2));
|
|
178
|
+
}
|
|
179
|
+
else {
|
|
180
|
+
console.log(`Email: ${user.email}`);
|
|
181
|
+
console.log(`Role: ${user.role}`);
|
|
182
|
+
console.log(`Tier: ${user.subscriptionTier}`);
|
|
183
|
+
if (user.username)
|
|
184
|
+
console.log(`Username: ${user.username}`);
|
|
185
|
+
if (user.name)
|
|
186
|
+
console.log(`Name: ${user.name}`);
|
|
187
|
+
console.log(`Auth Type: ${ctx.client.getAuthType()}`);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
catch (error) {
|
|
191
|
+
handleOpsError(error, ctx);
|
|
192
|
+
}
|
|
193
|
+
});
|
|
194
|
+
// ulu auth register
|
|
195
|
+
auth
|
|
196
|
+
.command('register')
|
|
197
|
+
.description('Register a new account')
|
|
198
|
+
.requiredOption('-e, --email <email>', 'Email address')
|
|
199
|
+
.requiredOption('-p, --password <password>', 'Password')
|
|
200
|
+
.action(async (options, cmd) => {
|
|
201
|
+
const globalOpts = cmd.optsWithGlobals();
|
|
202
|
+
const ctx = createUnauthenticatedContext(globalOpts);
|
|
203
|
+
try {
|
|
204
|
+
const result = await withSpinner(ctx, { start: 'Registering...', success: 'Registration successful', failure: 'Registration failed' }, async () => {
|
|
205
|
+
const client = new OpsClient({ baseUrl: ctx.baseUrl });
|
|
206
|
+
return client.auth.register({ email: options.email, password: options.password });
|
|
207
|
+
});
|
|
208
|
+
if (ctx.json) {
|
|
209
|
+
console.log(JSON.stringify(result, null, 2));
|
|
210
|
+
}
|
|
211
|
+
else {
|
|
212
|
+
console.log(`Account registered for ${options.email}`);
|
|
213
|
+
console.log('You can now login with: ulu auth login');
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
catch (error) {
|
|
217
|
+
handleOpsError(error, ctx);
|
|
218
|
+
}
|
|
219
|
+
});
|
|
220
|
+
// ulu auth forgot-password
|
|
221
|
+
auth
|
|
222
|
+
.command('forgot-password')
|
|
223
|
+
.description('Request a password reset email')
|
|
224
|
+
.requiredOption('-e, --email <email>', 'Email address')
|
|
225
|
+
.action(async (options, cmd) => {
|
|
226
|
+
const globalOpts = cmd.optsWithGlobals();
|
|
227
|
+
const ctx = createUnauthenticatedContext(globalOpts);
|
|
228
|
+
try {
|
|
229
|
+
const result = await withSpinner(ctx, { start: 'Sending reset email...', success: 'Reset email sent', failure: 'Failed to send reset email' }, async () => {
|
|
230
|
+
const client = new OpsClient({ baseUrl: ctx.baseUrl });
|
|
231
|
+
return client.auth.forgotPassword(options.email);
|
|
232
|
+
});
|
|
233
|
+
if (ctx.json) {
|
|
234
|
+
console.log(JSON.stringify(result, null, 2));
|
|
235
|
+
}
|
|
236
|
+
else {
|
|
237
|
+
console.log(result.message);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
catch (error) {
|
|
241
|
+
handleOpsError(error, ctx);
|
|
242
|
+
}
|
|
243
|
+
});
|
|
244
|
+
// ulu auth reset-password
|
|
245
|
+
auth
|
|
246
|
+
.command('reset-password')
|
|
247
|
+
.description('Reset password using a token')
|
|
248
|
+
.requiredOption('-t, --token <token>', 'Reset token from email')
|
|
249
|
+
.requiredOption('-p, --password <password>', 'New password')
|
|
250
|
+
.action(async (options, cmd) => {
|
|
251
|
+
const globalOpts = cmd.optsWithGlobals();
|
|
252
|
+
const ctx = createUnauthenticatedContext(globalOpts);
|
|
253
|
+
try {
|
|
254
|
+
const result = await withSpinner(ctx, { start: 'Resetting password...', success: 'Password reset', failure: 'Failed to reset password' }, async () => {
|
|
255
|
+
const client = new OpsClient({ baseUrl: ctx.baseUrl });
|
|
256
|
+
return client.auth.resetPassword({ token: options.token, password: options.password });
|
|
257
|
+
});
|
|
258
|
+
if (ctx.json) {
|
|
259
|
+
console.log(JSON.stringify(result, null, 2));
|
|
260
|
+
}
|
|
261
|
+
else {
|
|
262
|
+
console.log(result.message);
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
catch (error) {
|
|
266
|
+
handleOpsError(error, ctx);
|
|
267
|
+
}
|
|
268
|
+
});
|
|
269
|
+
// ulu auth change-password
|
|
270
|
+
auth
|
|
271
|
+
.command('change-password')
|
|
272
|
+
.description('Change your current password')
|
|
273
|
+
.requiredOption('-c, --current <password>', 'Current password')
|
|
274
|
+
.requiredOption('-n, --new-password <password>', 'New password')
|
|
275
|
+
.action(async (options, cmd) => {
|
|
276
|
+
const globalOpts = cmd.optsWithGlobals();
|
|
277
|
+
const ctx = createOpsContext(globalOpts);
|
|
278
|
+
try {
|
|
279
|
+
const result = await withSpinner(ctx, { start: 'Changing password...', success: 'Password changed', failure: 'Failed to change password' }, () => ctx.client.auth.changePassword({
|
|
280
|
+
currentPassword: options.current,
|
|
281
|
+
newPassword: options.newPassword,
|
|
282
|
+
}));
|
|
283
|
+
if (ctx.json) {
|
|
284
|
+
console.log(JSON.stringify(result, null, 2));
|
|
285
|
+
}
|
|
286
|
+
else {
|
|
287
|
+
console.log(result.message);
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
catch (error) {
|
|
291
|
+
handleOpsError(error, ctx);
|
|
292
|
+
}
|
|
293
|
+
});
|
|
294
|
+
// ulu auth profile
|
|
295
|
+
auth
|
|
296
|
+
.command('profile')
|
|
297
|
+
.description('View your profile')
|
|
298
|
+
.action(async (_, cmd) => {
|
|
299
|
+
const globalOpts = cmd.optsWithGlobals();
|
|
300
|
+
const ctx = createOpsContext(globalOpts);
|
|
301
|
+
try {
|
|
302
|
+
const data = await withSpinner(ctx, { start: 'Fetching profile...', failure: 'Failed to fetch profile' }, () => ctx.client.auth.getProfile());
|
|
303
|
+
if (ctx.json) {
|
|
304
|
+
console.log(JSON.stringify(data, null, 2));
|
|
305
|
+
}
|
|
306
|
+
else {
|
|
307
|
+
const u = data.user;
|
|
308
|
+
console.log(`Email: ${u.email}`);
|
|
309
|
+
console.log(`Role: ${u.role}`);
|
|
310
|
+
if (u.username)
|
|
311
|
+
console.log(`Username: ${u.username}`);
|
|
312
|
+
if (u.name)
|
|
313
|
+
console.log(`Name: ${u.name}`);
|
|
314
|
+
if (u.bio)
|
|
315
|
+
console.log(`Bio: ${u.bio}`);
|
|
316
|
+
if (u.timezone)
|
|
317
|
+
console.log(`Timezone: ${u.timezone}`);
|
|
318
|
+
if (u.websiteUrl)
|
|
319
|
+
console.log(`Website: ${u.websiteUrl}`);
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
catch (error) {
|
|
323
|
+
handleOpsError(error, ctx);
|
|
324
|
+
}
|
|
325
|
+
});
|
|
326
|
+
// ulu auth update-profile
|
|
327
|
+
auth
|
|
328
|
+
.command('update-profile')
|
|
329
|
+
.description('Update your profile')
|
|
330
|
+
.option('-u, --username <username>', 'Username')
|
|
331
|
+
.option('-n, --name <name>', 'Display name')
|
|
332
|
+
.option('--bio <bio>', 'Bio')
|
|
333
|
+
.option('--timezone <tz>', 'Timezone')
|
|
334
|
+
.option('--website <url>', 'Website URL')
|
|
335
|
+
.action(async (options, cmd) => {
|
|
336
|
+
const globalOpts = cmd.optsWithGlobals();
|
|
337
|
+
const ctx = createOpsContext(globalOpts);
|
|
338
|
+
const input = {};
|
|
339
|
+
if (options.username !== undefined)
|
|
340
|
+
input.username = options.username;
|
|
341
|
+
if (options.name !== undefined)
|
|
342
|
+
input.name = options.name;
|
|
343
|
+
if (options.bio !== undefined)
|
|
344
|
+
input.bio = options.bio;
|
|
345
|
+
if (options.timezone !== undefined)
|
|
346
|
+
input.timezone = options.timezone;
|
|
347
|
+
if (options.website !== undefined)
|
|
348
|
+
input.websiteUrl = options.website;
|
|
349
|
+
if (Object.keys(input).length === 0) {
|
|
350
|
+
console.error('Error: At least one field must be specified');
|
|
351
|
+
process.exit(1);
|
|
352
|
+
}
|
|
353
|
+
try {
|
|
354
|
+
const data = await withSpinner(ctx, { start: 'Updating profile...', success: 'Profile updated', failure: 'Failed to update profile' }, () => ctx.client.auth.updateProfile(input));
|
|
355
|
+
if (ctx.json) {
|
|
356
|
+
console.log(JSON.stringify(data, null, 2));
|
|
357
|
+
}
|
|
358
|
+
else {
|
|
359
|
+
console.log(`Profile updated for ${data.user.email}`);
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
catch (error) {
|
|
363
|
+
handleOpsError(error, ctx);
|
|
364
|
+
}
|
|
365
|
+
});
|
|
366
|
+
// ulu auth sessions
|
|
367
|
+
const authSessions = auth
|
|
368
|
+
.command('sessions')
|
|
369
|
+
.description('Manage your sessions');
|
|
370
|
+
// ulu auth sessions list
|
|
371
|
+
authSessions
|
|
372
|
+
.command('list')
|
|
373
|
+
.description('List your active sessions')
|
|
374
|
+
.action(async (_, cmd) => {
|
|
375
|
+
const globalOpts = cmd.optsWithGlobals();
|
|
376
|
+
const ctx = createOpsContext(globalOpts);
|
|
377
|
+
try {
|
|
378
|
+
const sessions = await withSpinner(ctx, { start: 'Fetching sessions...', failure: 'Failed to fetch sessions' }, () => ctx.client.auth.listSessions());
|
|
379
|
+
if (ctx.json) {
|
|
380
|
+
console.log(JSON.stringify(sessions, null, 2));
|
|
381
|
+
}
|
|
382
|
+
else if (sessions.length === 0) {
|
|
383
|
+
console.log('No active sessions');
|
|
384
|
+
}
|
|
385
|
+
else {
|
|
386
|
+
console.log(`Active sessions: ${sessions.length}\n`);
|
|
387
|
+
for (const s of sessions) {
|
|
388
|
+
console.log(` ${s.id.slice(0, 8)} ${s.ipAddress ?? '-'} ${s.createdAt}`);
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
catch (error) {
|
|
393
|
+
handleOpsError(error, ctx);
|
|
394
|
+
}
|
|
395
|
+
});
|
|
396
|
+
// ulu auth sessions revoke <id>
|
|
397
|
+
authSessions
|
|
398
|
+
.command('revoke <sessionId>')
|
|
399
|
+
.description('Revoke a session')
|
|
400
|
+
.action(async (sessionId, _, cmd) => {
|
|
401
|
+
const globalOpts = cmd.optsWithGlobals();
|
|
402
|
+
const ctx = createOpsContext(globalOpts);
|
|
403
|
+
try {
|
|
404
|
+
await withSpinner(ctx, { start: 'Revoking session...', success: 'Session revoked', failure: 'Failed to revoke session' }, () => ctx.client.auth.revokeSession(sessionId));
|
|
405
|
+
if (ctx.json) {
|
|
406
|
+
console.log(JSON.stringify({ success: true, sessionId }, null, 2));
|
|
407
|
+
}
|
|
408
|
+
else {
|
|
409
|
+
console.log(`Session ${sessionId.slice(0, 8)} revoked`);
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
catch (error) {
|
|
413
|
+
handleOpsError(error, ctx);
|
|
414
|
+
}
|
|
415
|
+
});
|
|
416
|
+
// ulu auth api-keys
|
|
417
|
+
const apiKeys = auth
|
|
418
|
+
.command('api-keys')
|
|
419
|
+
.description('Manage API keys');
|
|
420
|
+
// ulu auth api-keys list
|
|
421
|
+
apiKeys
|
|
422
|
+
.command('list')
|
|
423
|
+
.description('List all API keys')
|
|
424
|
+
.action(async (_, cmd) => {
|
|
425
|
+
const globalOpts = cmd.optsWithGlobals();
|
|
426
|
+
const ctx = createOpsContext(globalOpts);
|
|
427
|
+
try {
|
|
428
|
+
const keys = await withSpinner(ctx, { start: 'Fetching API keys...', failure: 'Failed to fetch API keys' }, () => ctx.client.auth.listApiKeys());
|
|
429
|
+
if (ctx.json) {
|
|
430
|
+
console.log(JSON.stringify(keys, null, 2));
|
|
431
|
+
}
|
|
432
|
+
else if (keys.length === 0) {
|
|
433
|
+
console.log('No API keys found');
|
|
434
|
+
}
|
|
435
|
+
else {
|
|
436
|
+
console.log(formatApiKeys(keys));
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
catch (error) {
|
|
440
|
+
handleOpsError(error, ctx);
|
|
441
|
+
}
|
|
442
|
+
});
|
|
443
|
+
// ulu auth api-keys create
|
|
444
|
+
apiKeys
|
|
445
|
+
.command('create')
|
|
446
|
+
.description('Create a new API key')
|
|
447
|
+
.option('-n, --name <name>', 'Key name (for identification)')
|
|
448
|
+
.option('--expires <date>', 'Expiration date (ISO format)')
|
|
449
|
+
.action(async (options, cmd) => {
|
|
450
|
+
const globalOpts = cmd.optsWithGlobals();
|
|
451
|
+
const ctx = createOpsContext(globalOpts);
|
|
452
|
+
try {
|
|
453
|
+
const result = await withSpinner(ctx, { start: 'Creating API key...', success: 'API key created', failure: 'Failed to create API key' }, () => ctx.client.auth.createApiKey({
|
|
454
|
+
name: options.name,
|
|
455
|
+
expiresAt: options.expires,
|
|
456
|
+
}));
|
|
457
|
+
if (ctx.json) {
|
|
458
|
+
console.log(JSON.stringify(result, null, 2));
|
|
459
|
+
}
|
|
460
|
+
else {
|
|
461
|
+
console.log('\n' + '='.repeat(60));
|
|
462
|
+
console.log('IMPORTANT: Save this key now - it will not be shown again!');
|
|
463
|
+
console.log('='.repeat(60));
|
|
464
|
+
console.log(`\nAPI Key: ${result.key}`);
|
|
465
|
+
console.log(`Key ID: ${result.apiKey.id}`);
|
|
466
|
+
if (result.apiKey.name)
|
|
467
|
+
console.log(`Name: ${result.apiKey.name}`);
|
|
468
|
+
console.log('\n' + '='.repeat(60));
|
|
469
|
+
}
|
|
470
|
+
}
|
|
471
|
+
catch (error) {
|
|
472
|
+
handleOpsError(error, ctx);
|
|
473
|
+
}
|
|
474
|
+
});
|
|
475
|
+
// ulu auth api-keys revoke
|
|
476
|
+
apiKeys
|
|
477
|
+
.command('revoke <keyId>')
|
|
478
|
+
.description('Revoke an API key')
|
|
479
|
+
.action(async (keyId, _, cmd) => {
|
|
480
|
+
const globalOpts = cmd.optsWithGlobals();
|
|
481
|
+
const ctx = createOpsContext(globalOpts);
|
|
482
|
+
try {
|
|
483
|
+
await withSpinner(ctx, { start: 'Revoking API key...', success: 'API key revoked', failure: 'Failed to revoke API key' }, () => ctx.client.auth.revokeApiKey(keyId));
|
|
484
|
+
if (ctx.json) {
|
|
485
|
+
console.log(JSON.stringify({ success: true, keyId }, null, 2));
|
|
486
|
+
}
|
|
487
|
+
else {
|
|
488
|
+
console.log(`API key ${keyId} has been revoked`);
|
|
489
|
+
}
|
|
490
|
+
}
|
|
491
|
+
catch (error) {
|
|
492
|
+
handleOpsError(error, ctx);
|
|
493
|
+
}
|
|
494
|
+
});
|
|
495
|
+
}
|
|
496
|
+
//# sourceMappingURL=auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
/**
|
|
3
|
+
* Register completion command.
|
|
4
|
+
* Requires the fully-built program so it can introspect the command tree.
|
|
5
|
+
*/
|
|
6
|
+
export declare function registerCompletionCommands(program: Command): void;
|
|
7
|
+
//# sourceMappingURL=completion.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"completion.d.ts","sourceRoot":"","sources":["../../src/commands/completion.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAmLpC;;;GAGG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAyBjE"}
|