@portaidentity/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 (157) hide show
  1. package/dist/auth/browser-flow.d.ts +42 -0
  2. package/dist/auth/browser-flow.d.ts.map +1 -0
  3. package/dist/auth/browser-flow.js +193 -0
  4. package/dist/auth/browser-flow.js.map +1 -0
  5. package/dist/auth/callback-server.d.ts +81 -0
  6. package/dist/auth/callback-server.d.ts.map +1 -0
  7. package/dist/auth/callback-server.js +193 -0
  8. package/dist/auth/callback-server.js.map +1 -0
  9. package/dist/auth/metadata.d.ts +43 -0
  10. package/dist/auth/metadata.d.ts.map +1 -0
  11. package/dist/auth/metadata.js +66 -0
  12. package/dist/auth/metadata.js.map +1 -0
  13. package/dist/auth/pkce.d.ts +42 -0
  14. package/dist/auth/pkce.d.ts.map +1 -0
  15. package/dist/auth/pkce.js +52 -0
  16. package/dist/auth/pkce.js.map +1 -0
  17. package/dist/auth/types.d.ts +72 -0
  18. package/dist/auth/types.d.ts.map +1 -0
  19. package/dist/auth/types.js +11 -0
  20. package/dist/auth/types.js.map +1 -0
  21. package/dist/client-factory.d.ts +29 -0
  22. package/dist/client-factory.d.ts.map +1 -0
  23. package/dist/client-factory.js +43 -0
  24. package/dist/client-factory.js.map +1 -0
  25. package/dist/commands/app-claim.d.ts +9 -0
  26. package/dist/commands/app-claim.d.ts.map +1 -0
  27. package/dist/commands/app-claim.js +128 -0
  28. package/dist/commands/app-claim.js.map +1 -0
  29. package/dist/commands/app-module.d.ts +9 -0
  30. package/dist/commands/app-module.d.ts.map +1 -0
  31. package/dist/commands/app-module.js +104 -0
  32. package/dist/commands/app-module.js.map +1 -0
  33. package/dist/commands/app-permission.d.ts +9 -0
  34. package/dist/commands/app-permission.d.ts.map +1 -0
  35. package/dist/commands/app-permission.js +118 -0
  36. package/dist/commands/app-permission.js.map +1 -0
  37. package/dist/commands/app-role.d.ts +9 -0
  38. package/dist/commands/app-role.d.ts.map +1 -0
  39. package/dist/commands/app-role.js +166 -0
  40. package/dist/commands/app-role.js.map +1 -0
  41. package/dist/commands/app.d.ts +12 -0
  42. package/dist/commands/app.d.ts.map +1 -0
  43. package/dist/commands/app.js +255 -0
  44. package/dist/commands/app.js.map +1 -0
  45. package/dist/commands/audit.d.ts +12 -0
  46. package/dist/commands/audit.d.ts.map +1 -0
  47. package/dist/commands/audit.js +96 -0
  48. package/dist/commands/audit.js.map +1 -0
  49. package/dist/commands/bulk.d.ts +12 -0
  50. package/dist/commands/bulk.d.ts.map +1 -0
  51. package/dist/commands/bulk.js +77 -0
  52. package/dist/commands/bulk.js.map +1 -0
  53. package/dist/commands/client-secret.d.ts +18 -0
  54. package/dist/commands/client-secret.d.ts.map +1 -0
  55. package/dist/commands/client-secret.js +126 -0
  56. package/dist/commands/client-secret.js.map +1 -0
  57. package/dist/commands/client.d.ts +27 -0
  58. package/dist/commands/client.d.ts.map +1 -0
  59. package/dist/commands/client.js +385 -0
  60. package/dist/commands/client.js.map +1 -0
  61. package/dist/commands/completion.d.ts +27 -0
  62. package/dist/commands/completion.d.ts.map +1 -0
  63. package/dist/commands/completion.js +42 -0
  64. package/dist/commands/completion.js.map +1 -0
  65. package/dist/commands/config.d.ts +14 -0
  66. package/dist/commands/config.d.ts.map +1 -0
  67. package/dist/commands/config.js +85 -0
  68. package/dist/commands/config.js.map +1 -0
  69. package/dist/commands/doctor.d.ts +25 -0
  70. package/dist/commands/doctor.d.ts.map +1 -0
  71. package/dist/commands/doctor.js +198 -0
  72. package/dist/commands/doctor.js.map +1 -0
  73. package/dist/commands/exports.d.ts +12 -0
  74. package/dist/commands/exports.d.ts.map +1 -0
  75. package/dist/commands/exports.js +80 -0
  76. package/dist/commands/exports.js.map +1 -0
  77. package/dist/commands/health.d.ts +12 -0
  78. package/dist/commands/health.d.ts.map +1 -0
  79. package/dist/commands/health.js +53 -0
  80. package/dist/commands/health.js.map +1 -0
  81. package/dist/commands/keys.d.ts +14 -0
  82. package/dist/commands/keys.d.ts.map +1 -0
  83. package/dist/commands/keys.js +91 -0
  84. package/dist/commands/keys.js.map +1 -0
  85. package/dist/commands/login.d.ts +36 -0
  86. package/dist/commands/login.d.ts.map +1 -0
  87. package/dist/commands/login.js +78 -0
  88. package/dist/commands/login.js.map +1 -0
  89. package/dist/commands/logout.d.ts +25 -0
  90. package/dist/commands/logout.d.ts.map +1 -0
  91. package/dist/commands/logout.js +43 -0
  92. package/dist/commands/logout.js.map +1 -0
  93. package/dist/commands/org.d.ts +26 -0
  94. package/dist/commands/org.d.ts.map +1 -0
  95. package/dist/commands/org.js +396 -0
  96. package/dist/commands/org.js.map +1 -0
  97. package/dist/commands/provision.d.ts +47 -0
  98. package/dist/commands/provision.d.ts.map +1 -0
  99. package/dist/commands/provision.js +400 -0
  100. package/dist/commands/provision.js.map +1 -0
  101. package/dist/commands/sessions.d.ts +14 -0
  102. package/dist/commands/sessions.d.ts.map +1 -0
  103. package/dist/commands/sessions.js +122 -0
  104. package/dist/commands/sessions.js.map +1 -0
  105. package/dist/commands/stats.d.ts +12 -0
  106. package/dist/commands/stats.d.ts.map +1 -0
  107. package/dist/commands/stats.js +46 -0
  108. package/dist/commands/stats.js.map +1 -0
  109. package/dist/commands/user-claim.d.ts +17 -0
  110. package/dist/commands/user-claim.d.ts.map +1 -0
  111. package/dist/commands/user-claim.js +123 -0
  112. package/dist/commands/user-claim.js.map +1 -0
  113. package/dist/commands/user-role.d.ts +17 -0
  114. package/dist/commands/user-role.d.ts.map +1 -0
  115. package/dist/commands/user-role.js +118 -0
  116. package/dist/commands/user-role.js.map +1 -0
  117. package/dist/commands/user.d.ts +26 -0
  118. package/dist/commands/user.d.ts.map +1 -0
  119. package/dist/commands/user.js +352 -0
  120. package/dist/commands/user.js.map +1 -0
  121. package/dist/commands/version.d.ts +25 -0
  122. package/dist/commands/version.d.ts.map +1 -0
  123. package/dist/commands/version.js +83 -0
  124. package/dist/commands/version.js.map +1 -0
  125. package/dist/commands/whoami.d.ts +26 -0
  126. package/dist/commands/whoami.d.ts.map +1 -0
  127. package/dist/commands/whoami.js +66 -0
  128. package/dist/commands/whoami.js.map +1 -0
  129. package/dist/credential-store.d.ts +101 -0
  130. package/dist/credential-store.d.ts.map +1 -0
  131. package/dist/credential-store.js +121 -0
  132. package/dist/credential-store.js.map +1 -0
  133. package/dist/error-handler.d.ts +47 -0
  134. package/dist/error-handler.d.ts.map +1 -0
  135. package/dist/error-handler.js +166 -0
  136. package/dist/error-handler.js.map +1 -0
  137. package/dist/global-options.d.ts +50 -0
  138. package/dist/global-options.d.ts.map +1 -0
  139. package/dist/global-options.js +62 -0
  140. package/dist/global-options.js.map +1 -0
  141. package/dist/index.d.ts +29 -0
  142. package/dist/index.d.ts.map +1 -0
  143. package/dist/index.js +122 -0
  144. package/dist/index.js.map +1 -0
  145. package/dist/output.d.ts +75 -0
  146. package/dist/output.d.ts.map +1 -0
  147. package/dist/output.js +100 -0
  148. package/dist/output.js.map +1 -0
  149. package/dist/parsers.d.ts +74 -0
  150. package/dist/parsers.d.ts.map +1 -0
  151. package/dist/parsers.js +125 -0
  152. package/dist/parsers.js.map +1 -0
  153. package/dist/prompt.d.ts +50 -0
  154. package/dist/prompt.d.ts.map +1 -0
  155. package/dist/prompt.js +98 -0
  156. package/dist/prompt.js.map +1 -0
  157. package/package.json +46 -0
@@ -0,0 +1,385 @@
1
+ /**
2
+ * CLI client management commands.
3
+ *
4
+ * Provides CRUD and lifecycle management for OIDC clients, plus
5
+ * nested secret subcommands. All operations use the Porta SDK for
6
+ * Admin API communication.
7
+ *
8
+ * Usage:
9
+ * porta client create --org <org-id> --app <app-id> --type confidential --redirect-uris "https://..." [--name "My Client"]
10
+ * porta client list --app <app-id> [--status active|revoked] [--page 1] [--page-size 20]
11
+ * porta client show <client-id>
12
+ * porta client update <client-id> --name "New Name" [--redirect-uris "..."]
13
+ * porta client revoke <client-id>
14
+ * porta client restore <client-id>
15
+ * porta client history <client-id>
16
+ * porta client login-methods get <client-id>
17
+ * porta client login-methods set <client-id> --methods "password,magic_link"
18
+ * porta client login-methods clear <client-id>
19
+ * porta client secret <subcommand> ...
20
+ *
21
+ * @module commands/client
22
+ */
23
+ import { createClient } from '../client-factory.js';
24
+ import { handleError } from '../error-handler.js';
25
+ import { printTable, printJson, success, warn, info, formatDate, truncate, } from '../output.js';
26
+ import { confirm } from '../prompt.js';
27
+ import { parseLoginMethodsFlag, parseCommaSeparated } from '../parsers.js';
28
+ import { clientSecretCommand } from './client-secret.js';
29
+ // ---------------------------------------------------------------------------
30
+ // Command definition
31
+ // ---------------------------------------------------------------------------
32
+ /** The client command module — registered at the top level of the CLI */
33
+ export const clientCommand = {
34
+ command: 'client',
35
+ describe: 'Manage OIDC clients',
36
+ builder: (yargs) => {
37
+ return yargs
38
+ // ── create ──────────────────────────────────────────────────────
39
+ .command('create', 'Create a new OIDC client', (y) => y
40
+ .option('org', {
41
+ type: 'string',
42
+ demandOption: true,
43
+ description: 'Organization UUID (owner of the client)',
44
+ })
45
+ .option('app', {
46
+ type: 'string',
47
+ demandOption: true,
48
+ description: 'Application UUID or slug',
49
+ })
50
+ .option('name', {
51
+ type: 'string',
52
+ description: 'Client display name',
53
+ })
54
+ .option('type', {
55
+ type: 'string',
56
+ choices: ['confidential', 'public'],
57
+ demandOption: true,
58
+ description: 'Client type (confidential has secret, public does not)',
59
+ })
60
+ .option('application-type', {
61
+ type: 'string',
62
+ choices: ['web', 'native', 'spa'],
63
+ default: 'web',
64
+ description: 'Application deployment type',
65
+ })
66
+ .option('redirect-uris', {
67
+ type: 'string',
68
+ demandOption: true,
69
+ description: 'Comma-separated redirect URIs',
70
+ })
71
+ .option('login-methods', {
72
+ type: 'string',
73
+ description: 'Comma-separated login methods (password, magic_link) or "inherit" to use the org default',
74
+ }), async (argv) => {
75
+ try {
76
+ const loginMethods = parseLoginMethodsFlag(argv['login-methods'],
77
+ /* allowInherit */ true);
78
+ const sdkClient = createClient(argv);
79
+ // Resolve app slug → UUID if needed via SDK get
80
+ let appId = argv.app;
81
+ const UUID_REGEX = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
82
+ if (!UUID_REGEX.test(appId)) {
83
+ const { data: app } = await sdkClient.applications.get(appId);
84
+ appId = app.id;
85
+ }
86
+ const result = await sdkClient.clients.create({
87
+ applicationId: appId,
88
+ name: argv.name ?? 'Unnamed Client',
89
+ clientType: argv.type,
90
+ redirectUris: parseCommaSeparated(argv['redirect-uris']),
91
+ ...(loginMethods !== undefined && { loginMethods }),
92
+ });
93
+ if (argv.json) {
94
+ printJson(result);
95
+ }
96
+ else {
97
+ success(`Client created: ${result.name} (${result.clientId})`);
98
+ printTable(['Field', 'Value'], [
99
+ ['ID', result.id],
100
+ ['Client ID', result.clientId],
101
+ ['Name', result.name],
102
+ ['Type', result.clientType],
103
+ ['Status', result.status],
104
+ ['Redirect URIs', result.redirectUris.join(', ')],
105
+ ['Created', formatDate(result.createdAt)],
106
+ ]);
107
+ }
108
+ }
109
+ catch (err) {
110
+ handleError(err, argv.verbose);
111
+ }
112
+ })
113
+ // ── list ────────────────────────────────────────────────────────
114
+ .command('list', 'List clients for an application', (y) => y
115
+ .option('app', {
116
+ type: 'string',
117
+ demandOption: true,
118
+ description: 'Application UUID or slug',
119
+ })
120
+ .option('status', {
121
+ type: 'string',
122
+ choices: ['active', 'revoked'],
123
+ description: 'Filter by status',
124
+ })
125
+ .option('page', {
126
+ type: 'number',
127
+ default: 1,
128
+ description: 'Page number',
129
+ })
130
+ .option('page-size', {
131
+ type: 'number',
132
+ default: 20,
133
+ description: 'Items per page',
134
+ }), async (argv) => {
135
+ try {
136
+ const sdkClient = createClient(argv);
137
+ const result = await sdkClient.clients.list({
138
+ page: argv.page,
139
+ pageSize: argv['page-size'],
140
+ ...(argv.status && { status: argv.status }),
141
+ ...(argv.app && { applicationId: argv.app }),
142
+ });
143
+ if (result.data.length === 0) {
144
+ warn('No clients found');
145
+ return;
146
+ }
147
+ if (argv.json) {
148
+ printJson(result);
149
+ }
150
+ else {
151
+ printTable(['ID', 'Client ID', 'Name', 'Type', 'Status', 'Created'], result.data.map((c) => [
152
+ truncate(c.id, 8),
153
+ truncate(c.clientId, 8),
154
+ c.name,
155
+ c.clientType,
156
+ c.status,
157
+ formatDate(c.createdAt),
158
+ ]));
159
+ info(`Total: ${result.total} clients`);
160
+ }
161
+ }
162
+ catch (err) {
163
+ handleError(err, argv.verbose);
164
+ }
165
+ })
166
+ // ── show ────────────────────────────────────────────────────────
167
+ .command('show <client-id>', 'Show client details', (y) => y.positional('client-id', {
168
+ type: 'string',
169
+ demandOption: true,
170
+ description: 'Client internal UUID or client_id',
171
+ }), async (argv) => {
172
+ try {
173
+ const sdkClient = createClient(argv);
174
+ const { data: c } = await sdkClient.clients.get(argv['client-id']);
175
+ if (argv.json) {
176
+ printJson(c);
177
+ }
178
+ else {
179
+ printTable(['Field', 'Value'], [
180
+ ['ID', c.id],
181
+ ['Client ID', c.clientId],
182
+ ['Name', c.name],
183
+ ['Type', c.clientType],
184
+ ['Status', c.status],
185
+ ['Redirect URIs', c.redirectUris.join(', ') || '—'],
186
+ ['Grant Types', c.grantTypes.join(', ')],
187
+ ['Login Methods', c.loginMethods === null ? 'inherit' : c.loginMethods.join(', ')],
188
+ ['Created', formatDate(c.createdAt)],
189
+ ['Updated', formatDate(c.updatedAt)],
190
+ ]);
191
+ }
192
+ }
193
+ catch (err) {
194
+ handleError(err, argv.verbose);
195
+ }
196
+ })
197
+ // ── update ──────────────────────────────────────────────────────
198
+ .command('update <client-id>', 'Update client fields', (y) => y
199
+ .positional('client-id', {
200
+ type: 'string',
201
+ demandOption: true,
202
+ description: 'Client internal UUID or client_id',
203
+ })
204
+ .option('name', {
205
+ type: 'string',
206
+ description: 'New client display name',
207
+ })
208
+ .option('redirect-uris', {
209
+ type: 'string',
210
+ description: 'New comma-separated redirect URIs',
211
+ })
212
+ .option('login-methods', {
213
+ type: 'string',
214
+ description: 'Comma-separated login methods (password, magic_link) or "inherit" to reset to org default',
215
+ }), async (argv) => {
216
+ try {
217
+ const loginMethods = parseLoginMethodsFlag(argv['login-methods'],
218
+ /* allowInherit */ true);
219
+ const sdkClient = createClient(argv);
220
+ const { data: current, etag } = await sdkClient.clients.get(argv['client-id']);
221
+ const updated = await sdkClient.clients.update(current.id, {
222
+ name: argv.name,
223
+ redirectUris: argv['redirect-uris']
224
+ ? parseCommaSeparated(argv['redirect-uris'])
225
+ : undefined,
226
+ ...(loginMethods !== undefined && { loginMethods }),
227
+ }, etag ?? undefined);
228
+ if (argv.json) {
229
+ printJson(updated);
230
+ }
231
+ else {
232
+ success(`Client updated: ${updated.name} (${updated.clientId})`);
233
+ }
234
+ }
235
+ catch (err) {
236
+ handleError(err, argv.verbose);
237
+ }
238
+ })
239
+ // ── revoke ──────────────────────────────────────────────────────
240
+ .command('revoke <client-id>', 'Revoke a client (permanent)', (y) => y.positional('client-id', {
241
+ type: 'string',
242
+ demandOption: true,
243
+ description: 'Client internal UUID or client_id',
244
+ }), async (argv) => {
245
+ try {
246
+ const sdkClient = createClient(argv);
247
+ const { data: c } = await sdkClient.clients.get(argv['client-id']);
248
+ if (!argv.force) {
249
+ const confirmed = await confirm(`Revoke client "${c.name}" (${c.clientId})? This is permanent and cannot be undone.`);
250
+ if (!confirmed) {
251
+ warn('Operation cancelled');
252
+ return;
253
+ }
254
+ }
255
+ await sdkClient.clients.revoke(c.id);
256
+ success(`Client revoked: ${c.name} (${c.clientId})`);
257
+ }
258
+ catch (err) {
259
+ handleError(err, argv.verbose);
260
+ }
261
+ })
262
+ // ── restore (NEW) ───────────────────────────────────────────────
263
+ .command('restore <client-id>', 'Restore a revoked client', (y) => y.positional('client-id', {
264
+ type: 'string',
265
+ demandOption: true,
266
+ description: 'Client internal UUID or client_id',
267
+ }), async (argv) => {
268
+ try {
269
+ const sdkClient = createClient(argv);
270
+ const { data: c } = await sdkClient.clients.get(argv['client-id']);
271
+ await sdkClient.clients.restore(c.id);
272
+ success(`Client restored: ${c.name} (${c.clientId})`);
273
+ }
274
+ catch (err) {
275
+ handleError(err, argv.verbose);
276
+ }
277
+ })
278
+ // ── history (NEW) ───────────────────────────────────────────────
279
+ .command('history <client-id>', 'Show client change history', (y) => y.positional('client-id', {
280
+ type: 'string',
281
+ demandOption: true,
282
+ description: 'Client internal UUID or client_id',
283
+ }), async (argv) => {
284
+ try {
285
+ const sdkClient = createClient(argv);
286
+ const history = await sdkClient.clients.getHistory(argv['client-id']);
287
+ if (history.length === 0) {
288
+ warn('No history entries found');
289
+ return;
290
+ }
291
+ if (argv.json) {
292
+ printJson(history);
293
+ }
294
+ else {
295
+ printTable(['Date', 'Action', 'Actor', 'Changes'], history.map((h) => [
296
+ formatDate(h.createdAt),
297
+ h.action,
298
+ h.performedBy ?? '—',
299
+ h.changes ? JSON.stringify(h.changes).slice(0, 60) : '—',
300
+ ]));
301
+ }
302
+ }
303
+ catch (err) {
304
+ handleError(err, argv.verbose);
305
+ }
306
+ })
307
+ // ── login-methods ───────────────────────────────────────────────
308
+ .command('login-methods', 'Manage client login method overrides', (loginYargs) => {
309
+ return loginYargs
310
+ // ── login-methods get ──
311
+ .command('get <client-id>', 'Show current login methods for a client', (y) => y.positional('client-id', {
312
+ type: 'string',
313
+ demandOption: true,
314
+ description: 'Client internal UUID or client_id',
315
+ }), async (argv) => {
316
+ try {
317
+ const sdkClient = createClient(argv);
318
+ const { data: c } = await sdkClient.clients.get(argv['client-id']);
319
+ if (argv.json) {
320
+ printJson({
321
+ clientId: c.clientId,
322
+ loginMethods: c.loginMethods,
323
+ });
324
+ }
325
+ else {
326
+ const display = c.loginMethods === null
327
+ ? 'inherit (using org default)'
328
+ : c.loginMethods.join(', ');
329
+ info(`Login methods for ${c.name}: ${display}`);
330
+ }
331
+ }
332
+ catch (err) {
333
+ handleError(err, argv.verbose);
334
+ }
335
+ })
336
+ // ── login-methods set ──
337
+ .command('set <client-id>', 'Set login method overrides for a client', (y) => y
338
+ .positional('client-id', {
339
+ type: 'string',
340
+ demandOption: true,
341
+ description: 'Client internal UUID or client_id',
342
+ })
343
+ .option('methods', {
344
+ type: 'string',
345
+ demandOption: true,
346
+ description: 'Comma-separated login methods (password, magic_link)',
347
+ }), async (argv) => {
348
+ try {
349
+ const loginMethods = parseLoginMethodsFlag(argv.methods, false);
350
+ const sdkClient = createClient(argv);
351
+ const { data: current, etag } = await sdkClient.clients.get(argv['client-id']);
352
+ await sdkClient.clients.update(current.id, { loginMethods: loginMethods ?? undefined }, etag ?? undefined);
353
+ success(`Login methods set for ${current.name}: ${argv.methods}`);
354
+ }
355
+ catch (err) {
356
+ handleError(err, argv.verbose);
357
+ }
358
+ })
359
+ // ── login-methods clear ──
360
+ .command('clear <client-id>', 'Clear login method overrides (inherit from org)', (y) => y.positional('client-id', {
361
+ type: 'string',
362
+ demandOption: true,
363
+ description: 'Client internal UUID or client_id',
364
+ }), async (argv) => {
365
+ try {
366
+ const sdkClient = createClient(argv);
367
+ const { data: current, etag } = await sdkClient.clients.get(argv['client-id']);
368
+ await sdkClient.clients.update(current.id, { loginMethods: null }, etag ?? undefined);
369
+ success(`Login methods cleared for ${current.name} (will inherit from org)`);
370
+ }
371
+ catch (err) {
372
+ handleError(err, argv.verbose);
373
+ }
374
+ })
375
+ .demandCommand(1, 'Specify a login-methods subcommand: get, set, clear');
376
+ })
377
+ // ── nested subcommand groups ────────────────────────────────────
378
+ .command(clientSecretCommand)
379
+ .demandCommand(1, 'Specify a client subcommand: create, list, show, update, revoke, restore, history, login-methods, secret');
380
+ },
381
+ handler: () => {
382
+ // No-op — subcommands handle execution
383
+ },
384
+ };
385
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/commands/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * CLI completion command — generate shell completion scripts.
3
+ *
4
+ * Leverages yargs' built-in completion support to generate
5
+ * shell completion scripts for bash, zsh, and fish.
6
+ *
7
+ * Usage:
8
+ * porta completion # Print completion script
9
+ * source <(porta completion) # Install for current session (bash/zsh)
10
+ *
11
+ * Permanent installation:
12
+ * porta completion >> ~/.bashrc # bash
13
+ * porta completion >> ~/.zshrc # zsh
14
+ *
15
+ * @module commands/completion
16
+ */
17
+ import type { CommandModule } from 'yargs';
18
+ import type { GlobalOptions } from '../global-options.js';
19
+ /**
20
+ * The completion command module — outputs shell completion script.
21
+ *
22
+ * This is a thin wrapper that triggers yargs' built-in `showCompletionScript()`
23
+ * method. The completion script handles tab-completion for commands,
24
+ * subcommands, and options.
25
+ */
26
+ export declare const completionCommand: CommandModule<GlobalOptions, GlobalOptions>;
27
+ //# sourceMappingURL=completion.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"completion.d.ts","sourceRoot":"","sources":["../../src/commands/completion.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAC3C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAM1D;;;;;;GAMG;AACH,eAAO,MAAM,iBAAiB,EAAE,aAAa,CAAC,aAAa,EAAE,aAAa,CAezE,CAAC"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * CLI completion command — generate shell completion scripts.
3
+ *
4
+ * Leverages yargs' built-in completion support to generate
5
+ * shell completion scripts for bash, zsh, and fish.
6
+ *
7
+ * Usage:
8
+ * porta completion # Print completion script
9
+ * source <(porta completion) # Install for current session (bash/zsh)
10
+ *
11
+ * Permanent installation:
12
+ * porta completion >> ~/.bashrc # bash
13
+ * porta completion >> ~/.zshrc # zsh
14
+ *
15
+ * @module commands/completion
16
+ */
17
+ // ---------------------------------------------------------------------------
18
+ // Command Definition
19
+ // ---------------------------------------------------------------------------
20
+ /**
21
+ * The completion command module — outputs shell completion script.
22
+ *
23
+ * This is a thin wrapper that triggers yargs' built-in `showCompletionScript()`
24
+ * method. The completion script handles tab-completion for commands,
25
+ * subcommands, and options.
26
+ */
27
+ export const completionCommand = {
28
+ command: 'completion',
29
+ describe: 'Generate shell completion script',
30
+ handler: async () => {
31
+ // yargs.showCompletionScript() is called via the yargs configuration
32
+ // in index.ts. This handler is a fallback for direct invocation.
33
+ console.log('# Porta CLI shell completion');
34
+ console.log('# Add the following to your shell profile:');
35
+ console.log('# source <(porta completion)');
36
+ console.log('#');
37
+ console.log('# Or use yargs built-in completion:');
38
+ console.log('# porta --get-yargs-completions');
39
+ process.exit(0);
40
+ },
41
+ };
42
+ //# sourceMappingURL=completion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"completion.js","sourceRoot":"","sources":["../../src/commands/completion.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAKH,8EAA8E;AAC9E,qBAAqB;AACrB,8EAA8E;AAE9E;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAgD;IAC5E,OAAO,EAAE,YAAY;IACrB,QAAQ,EAAE,kCAAkC;IAE5C,OAAO,EAAE,KAAK,IAAI,EAAE;QAClB,qEAAqE;QACrE,iEAAiE;QACjE,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;QAC5C,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;QAC1D,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;QAC9C,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;QACnD,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;QACjD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;CACF,CAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Config command — manage system configuration.
3
+ *
4
+ * Subcommands:
5
+ * list List all configuration entries
6
+ * get Get a specific configuration value
7
+ * set Set a configuration value
8
+ *
9
+ * @module commands/config
10
+ */
11
+ import type { CommandModule } from 'yargs';
12
+ import type { GlobalOptions } from '../global-options.js';
13
+ export declare const configCommand: CommandModule<GlobalOptions, GlobalOptions>;
14
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAC3C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAsB1D,eAAO,MAAM,aAAa,EAAE,aAAa,CAAC,aAAa,EAAE,aAAa,CAgGrE,CAAC"}
@@ -0,0 +1,85 @@
1
+ /**
2
+ * Config command — manage system configuration.
3
+ *
4
+ * Subcommands:
5
+ * list List all configuration entries
6
+ * get Get a specific configuration value
7
+ * set Set a configuration value
8
+ *
9
+ * @module commands/config
10
+ */
11
+ import { createClient } from '../client-factory.js';
12
+ import { handleError } from '../error-handler.js';
13
+ import { printTable, printJson, success, formatDate } from '../output.js';
14
+ // ---------------------------------------------------------------------------
15
+ // Command
16
+ // ---------------------------------------------------------------------------
17
+ export const configCommand = {
18
+ command: 'config',
19
+ describe: 'Manage system configuration',
20
+ builder: (yargs) => yargs
21
+ // ── list ──────────────────────────────────────────────────────────
22
+ .command('list', 'List all configuration entries', (y) => y, async (argv) => {
23
+ try {
24
+ const client = createClient(argv);
25
+ const entries = await client.config.list();
26
+ if (argv.json) {
27
+ printJson(entries);
28
+ return;
29
+ }
30
+ printTable(['Key', 'Value', 'Updated'], entries.map((e) => [e.key, e.value, formatDate(e.updatedAt)]));
31
+ }
32
+ catch (err) {
33
+ handleError(err, argv.verbose);
34
+ }
35
+ })
36
+ // ── get ───────────────────────────────────────────────────────────
37
+ .command('get <key>', 'Get a configuration value', (y) => y.positional('key', {
38
+ type: 'string',
39
+ describe: 'Configuration key',
40
+ demandOption: true,
41
+ }), async (argv) => {
42
+ try {
43
+ const client = createClient(argv);
44
+ const entry = await client.config.get(argv.key);
45
+ if (argv.json) {
46
+ printJson(entry);
47
+ return;
48
+ }
49
+ printTable(['Key', 'Value', 'Description', 'Updated'], [[entry.key, entry.value, entry.description ?? '—', formatDate(entry.updatedAt)]]);
50
+ }
51
+ catch (err) {
52
+ handleError(err, argv.verbose);
53
+ }
54
+ })
55
+ // ── set ───────────────────────────────────────────────────────────
56
+ .command('set <key> <value>', 'Set a configuration value', (y) => y
57
+ .positional('key', {
58
+ type: 'string',
59
+ describe: 'Configuration key',
60
+ demandOption: true,
61
+ })
62
+ .positional('value', {
63
+ type: 'string',
64
+ describe: 'New value',
65
+ demandOption: true,
66
+ }), async (argv) => {
67
+ try {
68
+ const client = createClient(argv);
69
+ const entry = await client.config.set(argv.key, argv.value);
70
+ if (argv.json) {
71
+ printJson(entry);
72
+ return;
73
+ }
74
+ success(`Set ${entry.key} = ${entry.value}`);
75
+ }
76
+ catch (err) {
77
+ handleError(err, argv.verbose);
78
+ }
79
+ })
80
+ .demandCommand(1, 'Please specify a config subcommand: list, get, set'),
81
+ handler: () => {
82
+ // No-op — subcommands handle execution
83
+ },
84
+ };
85
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * CLI doctor command — diagnostic checks for the CLI environment.
3
+ *
4
+ * Runs a series of checks to verify the CLI setup is correct:
5
+ * 1. Node.js version (>= 22.0.0 required)
6
+ * 2. Credentials file exists and is readable
7
+ * 3. Token validity (not expired)
8
+ * 4. Server reachability (health endpoint)
9
+ * 5. Admin metadata endpoint accessible
10
+ *
11
+ * Useful for troubleshooting authentication or connectivity issues.
12
+ *
13
+ * Usage:
14
+ * porta doctor # Run all diagnostic checks
15
+ * porta doctor --json # JSON output (machine-readable)
16
+ *
17
+ * @module commands/doctor
18
+ */
19
+ import type { CommandModule } from 'yargs';
20
+ import type { GlobalOptions } from '../global-options.js';
21
+ /**
22
+ * The doctor command module — runs diagnostic checks.
23
+ */
24
+ export declare const doctorCommand: CommandModule<GlobalOptions, GlobalOptions>;
25
+ //# sourceMappingURL=doctor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAC3C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAmK1D;;GAEG;AACH,eAAO,MAAM,aAAa,EAAE,aAAa,CAAC,aAAa,EAAE,aAAa,CAoDrE,CAAC"}