primitive-admin 1.0.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 (38) hide show
  1. package/README.md +495 -0
  2. package/dist/bin/primitive.js +72 -0
  3. package/dist/bin/primitive.js.map +1 -0
  4. package/dist/src/commands/admins.js +268 -0
  5. package/dist/src/commands/admins.js.map +1 -0
  6. package/dist/src/commands/analytics.js +195 -0
  7. package/dist/src/commands/analytics.js.map +1 -0
  8. package/dist/src/commands/apps.js +238 -0
  9. package/dist/src/commands/apps.js.map +1 -0
  10. package/dist/src/commands/auth.js +178 -0
  11. package/dist/src/commands/auth.js.map +1 -0
  12. package/dist/src/commands/catalog.js +460 -0
  13. package/dist/src/commands/catalog.js.map +1 -0
  14. package/dist/src/commands/integrations.js +438 -0
  15. package/dist/src/commands/integrations.js.map +1 -0
  16. package/dist/src/commands/prompts.js +999 -0
  17. package/dist/src/commands/prompts.js.map +1 -0
  18. package/dist/src/commands/sync.js +598 -0
  19. package/dist/src/commands/sync.js.map +1 -0
  20. package/dist/src/commands/users.js +293 -0
  21. package/dist/src/commands/users.js.map +1 -0
  22. package/dist/src/commands/waitlist.js +176 -0
  23. package/dist/src/commands/waitlist.js.map +1 -0
  24. package/dist/src/commands/workflows.js +876 -0
  25. package/dist/src/commands/workflows.js.map +1 -0
  26. package/dist/src/lib/api-client.js +522 -0
  27. package/dist/src/lib/api-client.js.map +1 -0
  28. package/dist/src/lib/auth-flow.js +306 -0
  29. package/dist/src/lib/auth-flow.js.map +1 -0
  30. package/dist/src/lib/config.js +90 -0
  31. package/dist/src/lib/config.js.map +1 -0
  32. package/dist/src/lib/fetch.js +43 -0
  33. package/dist/src/lib/fetch.js.map +1 -0
  34. package/dist/src/lib/output.js +143 -0
  35. package/dist/src/lib/output.js.map +1 -0
  36. package/dist/src/types/index.js +2 -0
  37. package/dist/src/types/index.js.map +1 -0
  38. package/package.json +47 -0
@@ -0,0 +1,268 @@
1
+ import { ApiClient } from "../lib/api-client.js";
2
+ import { success, error, info, keyValue, formatTable, formatId, formatDate, json, divider, } from "../lib/output.js";
3
+ export function registerAdminsCommands(program) {
4
+ const admins = program
5
+ .command("admins")
6
+ .description("Manage admin directory and invitations (super-admin only)")
7
+ .addHelpText("after", `
8
+ Examples:
9
+ $ primitive admins list
10
+ $ primitive admins search user@example.com
11
+ $ primitive admins invite newadmin@example.com --limit 5
12
+ $ primitive admins invitations list
13
+ `);
14
+ // List all admins
15
+ admins
16
+ .command("list")
17
+ .description("List all admins in the directory")
18
+ .option("--limit <n>", "Number of admins to show", "50")
19
+ .option("--json", "Output as JSON")
20
+ .action(async (options) => {
21
+ const client = new ApiClient();
22
+ try {
23
+ const result = await client.listAllAdmins({
24
+ limit: parseInt(options.limit),
25
+ });
26
+ if (options.json) {
27
+ json(result.admins);
28
+ return;
29
+ }
30
+ if (!result.admins || result.admins.length === 0) {
31
+ info("No admins found.");
32
+ return;
33
+ }
34
+ console.log(formatTable(result.admins, [
35
+ { header: "ID", key: "adminId", format: formatId },
36
+ { header: "EMAIL", key: "email" },
37
+ { header: "NAME", key: "name" },
38
+ { header: "ROLE", key: "role" },
39
+ { header: "APPS", key: "assignedAppsCount" },
40
+ { header: "LIMIT", key: "appCreationLimit" },
41
+ { header: "DISABLED", key: "disabledAt", format: (v) => v ? "yes" : "" },
42
+ ]));
43
+ if (result.cursor) {
44
+ info("More results available. Use --limit to see more.");
45
+ }
46
+ }
47
+ catch (err) {
48
+ error(err.message);
49
+ process.exit(1);
50
+ }
51
+ });
52
+ // Search admin by email
53
+ admins
54
+ .command("search")
55
+ .description("Search for an admin by email")
56
+ .argument("<email>", "Email to search")
57
+ .option("--json", "Output as JSON")
58
+ .action(async (email, options) => {
59
+ const client = new ApiClient();
60
+ try {
61
+ const result = await client.searchAdminByEmail(email);
62
+ if (options.json) {
63
+ json(result);
64
+ return;
65
+ }
66
+ if (!result || !result.admin) {
67
+ info(`No admin found with email: ${email}`);
68
+ return;
69
+ }
70
+ const admin = result.admin;
71
+ keyValue("Admin ID", admin.adminId);
72
+ keyValue("Email", admin.email);
73
+ keyValue("Name", admin.name);
74
+ keyValue("Role", admin.role);
75
+ keyValue("App Creation Limit", admin.appCreationLimit);
76
+ keyValue("Disabled", admin.disabledAt ? formatDate(admin.disabledAt) : "no");
77
+ if (result.apps && result.apps.length > 0) {
78
+ divider();
79
+ info(`Apps (${result.apps.length}):`);
80
+ console.log(formatTable(result.apps, [
81
+ { header: "APP ID", key: "appId", format: formatId },
82
+ { header: "NAME", key: "name" },
83
+ { header: "ROLE", key: "role" },
84
+ ]));
85
+ }
86
+ }
87
+ catch (err) {
88
+ error(err.message);
89
+ process.exit(1);
90
+ }
91
+ });
92
+ // Invite admin
93
+ admins
94
+ .command("invite")
95
+ .description("Create a global admin invitation")
96
+ .argument("<email>", "Email to invite")
97
+ .option("--limit <n>", "App creation limit for the new admin")
98
+ .option("--expires-days <n>", "Days until invitation expires", "7")
99
+ .option("--json", "Output as JSON")
100
+ .action(async (email, options) => {
101
+ const client = new ApiClient();
102
+ try {
103
+ const result = await client.createGlobalAdminInvitation({
104
+ email,
105
+ appCreationLimit: options.limit ? parseInt(options.limit) : undefined,
106
+ expiresInDays: parseInt(options.expiresDays),
107
+ });
108
+ if (options.json) {
109
+ json(result);
110
+ return;
111
+ }
112
+ success(`Invitation created for ${email}`);
113
+ if (result.invitation) {
114
+ keyValue("Invitation ID", result.invitation.invitationId);
115
+ keyValue("Expires", formatDate(result.invitation.expiresAt));
116
+ }
117
+ }
118
+ catch (err) {
119
+ error(err.message);
120
+ process.exit(1);
121
+ }
122
+ });
123
+ // Update admin settings
124
+ admins
125
+ .command("update")
126
+ .description("Update admin settings")
127
+ .argument("<admin-id>", "Admin ID to update")
128
+ .option("--limit <n>", "App creation limit")
129
+ .option("--role <role>", "Role: admin, super-admin")
130
+ .option("--json", "Output as JSON")
131
+ .action(async (adminId, options) => {
132
+ const payload = {};
133
+ if (options.limit !== undefined)
134
+ payload.appCreationLimit = parseInt(options.limit);
135
+ if (options.role)
136
+ payload.role = options.role;
137
+ if (Object.keys(payload).length === 0) {
138
+ error("No update options specified. Use --limit or --role.");
139
+ process.exit(1);
140
+ }
141
+ const client = new ApiClient();
142
+ try {
143
+ const result = await client.updateAdminSettings(adminId, payload);
144
+ if (options.json) {
145
+ json(result);
146
+ return;
147
+ }
148
+ success("Admin settings updated.");
149
+ }
150
+ catch (err) {
151
+ error(err.message);
152
+ process.exit(1);
153
+ }
154
+ });
155
+ // Disable admin
156
+ admins
157
+ .command("disable")
158
+ .description("Disable an admin account")
159
+ .argument("<admin-id>", "Admin ID to disable")
160
+ .option("-y, --yes", "Skip confirmation prompt")
161
+ .action(async (adminId, options) => {
162
+ if (!options.yes) {
163
+ const inquirer = await import("inquirer");
164
+ const { confirm } = await inquirer.default.prompt([
165
+ {
166
+ type: "confirm",
167
+ name: "confirm",
168
+ message: `Disable admin ${adminId}?`,
169
+ default: false,
170
+ },
171
+ ]);
172
+ if (!confirm) {
173
+ info("Cancelled.");
174
+ return;
175
+ }
176
+ }
177
+ const client = new ApiClient();
178
+ try {
179
+ await client.updateAdminSettings(adminId, { disabled: true });
180
+ success(`Admin ${adminId} disabled.`);
181
+ }
182
+ catch (err) {
183
+ error(err.message);
184
+ process.exit(1);
185
+ }
186
+ });
187
+ // Enable admin
188
+ admins
189
+ .command("enable")
190
+ .description("Enable a disabled admin account")
191
+ .argument("<admin-id>", "Admin ID to enable")
192
+ .action(async (adminId) => {
193
+ const client = new ApiClient();
194
+ try {
195
+ await client.updateAdminSettings(adminId, { disabled: false });
196
+ success(`Admin ${adminId} enabled.`);
197
+ }
198
+ catch (err) {
199
+ error(err.message);
200
+ process.exit(1);
201
+ }
202
+ });
203
+ // Invitations subcommand
204
+ const invitations = admins.command("invitations").description("Manage admin invitations");
205
+ // List all invitations
206
+ invitations
207
+ .command("list")
208
+ .description("List all pending admin invitations")
209
+ .option("--json", "Output as JSON")
210
+ .action(async (options) => {
211
+ const client = new ApiClient();
212
+ try {
213
+ const invitationsList = await client.listAllAdminInvitations();
214
+ if (options.json) {
215
+ json(invitationsList);
216
+ return;
217
+ }
218
+ if (!invitationsList || invitationsList.length === 0) {
219
+ info("No pending invitations.");
220
+ return;
221
+ }
222
+ console.log(formatTable(invitationsList, [
223
+ { header: "ID", key: "invitationId", format: formatId },
224
+ { header: "EMAIL", key: "email" },
225
+ { header: "TYPE", key: "type" },
226
+ { header: "APP", key: "appName" },
227
+ { header: "EXPIRES", key: "expiresAt", format: formatDate },
228
+ ]));
229
+ }
230
+ catch (err) {
231
+ error(err.message);
232
+ process.exit(1);
233
+ }
234
+ });
235
+ // Delete invitation
236
+ invitations
237
+ .command("delete")
238
+ .description("Delete an admin invitation")
239
+ .argument("<invitation-id>", "Invitation ID to delete")
240
+ .option("-y, --yes", "Skip confirmation prompt")
241
+ .action(async (invitationId, options) => {
242
+ if (!options.yes) {
243
+ const inquirer = await import("inquirer");
244
+ const { confirm } = await inquirer.default.prompt([
245
+ {
246
+ type: "confirm",
247
+ name: "confirm",
248
+ message: `Delete invitation ${invitationId}?`,
249
+ default: false,
250
+ },
251
+ ]);
252
+ if (!confirm) {
253
+ info("Cancelled.");
254
+ return;
255
+ }
256
+ }
257
+ const client = new ApiClient();
258
+ try {
259
+ await client.deleteGlobalAdminInvitation(invitationId);
260
+ success(`Invitation ${invitationId} deleted.`);
261
+ }
262
+ catch (err) {
263
+ error(err.message);
264
+ process.exit(1);
265
+ }
266
+ });
267
+ }
268
+ //# sourceMappingURL=admins.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admins.js","sourceRoot":"","sources":["../../../src/commands/admins.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,195 @@
1
+ import { ApiClient } from "../lib/api-client.js";
2
+ import { getCurrentAppId } from "../lib/config.js";
3
+ import { error, info, keyValue, formatTable, formatId, formatDate, formatNumber, formatPercent, formatDuration, json, divider, heading, } from "../lib/output.js";
4
+ function resolveAppId(appId, options) {
5
+ const resolved = appId || options.app || getCurrentAppId();
6
+ if (!resolved) {
7
+ error("No app specified. Use <app-id>, --app, or 'primitive use <app-id>' to set context.");
8
+ process.exit(1);
9
+ }
10
+ return resolved;
11
+ }
12
+ export function registerAnalyticsCommands(program) {
13
+ const analytics = program
14
+ .command("analytics")
15
+ .description("View usage analytics, user activity, and integration metrics")
16
+ .addHelpText("after", `
17
+ Examples:
18
+ $ primitive analytics overview
19
+ $ primitive analytics top-users --window-days 7 --limit 20
20
+ $ primitive analytics integrations
21
+ `);
22
+ // Overview
23
+ analytics
24
+ .command("overview")
25
+ .description("Get analytics overview for an app")
26
+ .argument("[app-id]", "App ID (uses current app if not specified)")
27
+ .option("--app <app-id>", "App ID")
28
+ .option("--window-days <n>", "Time window in days", "30")
29
+ .option("--json", "Output as JSON")
30
+ .action(async (appId, options) => {
31
+ const resolvedAppId = resolveAppId(appId, options);
32
+ const client = new ApiClient();
33
+ try {
34
+ const result = await client.getAnalyticsOverview(resolvedAppId, {
35
+ windowDays: parseInt(options.windowDays),
36
+ });
37
+ if (options.json) {
38
+ json(result);
39
+ return;
40
+ }
41
+ heading(`Analytics Overview (${result.windowDays} days)`);
42
+ console.log();
43
+ keyValue("Daily Active Users (DAU)", formatNumber(result.totals.dau));
44
+ keyValue("Weekly Active Users (WAU)", formatNumber(result.totals.wau));
45
+ keyValue("Monthly Active Users (MAU)", formatNumber(result.totals.mau));
46
+ keyValue("Total Events", formatNumber(result.totals.totalEvents));
47
+ if (result.series && result.series.length > 0) {
48
+ divider();
49
+ info("Activity Series:");
50
+ console.log(formatTable(result.series.slice(-10), [
51
+ { header: "DATE", key: "bucketStart", format: (v) => v.slice(0, 10) },
52
+ { header: "USERS", key: "activeUsers", align: "right" },
53
+ { header: "EVENTS", key: "totalEvents", align: "right" },
54
+ ]));
55
+ }
56
+ }
57
+ catch (err) {
58
+ error(err.message);
59
+ process.exit(1);
60
+ }
61
+ });
62
+ // Top users
63
+ analytics
64
+ .command("top-users")
65
+ .description("Get top users by activity")
66
+ .argument("[app-id]", "App ID (uses current app if not specified)")
67
+ .option("--app <app-id>", "App ID")
68
+ .option("--window-days <n>", "Time window in days", "30")
69
+ .option("--limit <n>", "Number of users to show", "10")
70
+ .option("--json", "Output as JSON")
71
+ .action(async (appId, options) => {
72
+ const resolvedAppId = resolveAppId(appId, options);
73
+ const client = new ApiClient();
74
+ try {
75
+ const result = await client.getAnalyticsTopUsers(resolvedAppId, {
76
+ windowDays: parseInt(options.windowDays),
77
+ limit: parseInt(options.limit),
78
+ });
79
+ if (options.json) {
80
+ json(result);
81
+ return;
82
+ }
83
+ heading(`Top Users (${result.windowDays} days)`);
84
+ console.log();
85
+ if (!result.results || result.results.length === 0) {
86
+ info("No user activity found.");
87
+ return;
88
+ }
89
+ console.log(formatTable(result.results, [
90
+ { header: "USER", key: "userUlid", format: formatId },
91
+ { header: "EVENTS", key: "eventCount", align: "right" },
92
+ { header: "FIRST SEEN", key: "firstSeen", format: formatDate },
93
+ { header: "LAST SEEN", key: "lastSeen", format: formatDate },
94
+ ]));
95
+ }
96
+ catch (err) {
97
+ error(err.message);
98
+ process.exit(1);
99
+ }
100
+ });
101
+ // User details
102
+ analytics
103
+ .command("user")
104
+ .description("Get analytics for a specific user")
105
+ .argument("[app-id]", "App ID (uses current app if not specified)")
106
+ .argument("<user-ulid>", "User ULID")
107
+ .option("--app <app-id>", "App ID")
108
+ .option("--window-days <n>", "Time window in days", "30")
109
+ .option("--json", "Output as JSON")
110
+ .action(async (appIdOrUserUlid, userUlidOrUndefined, options) => {
111
+ let resolvedAppId;
112
+ let userUlid;
113
+ if (userUlidOrUndefined) {
114
+ resolvedAppId = resolveAppId(appIdOrUserUlid, options);
115
+ userUlid = userUlidOrUndefined;
116
+ }
117
+ else {
118
+ resolvedAppId = resolveAppId(undefined, options);
119
+ userUlid = appIdOrUserUlid;
120
+ }
121
+ const client = new ApiClient();
122
+ try {
123
+ const result = await client.getAnalyticsUserTimeline(resolvedAppId, userUlid, {
124
+ windowDays: parseInt(options.windowDays),
125
+ });
126
+ if (options.json) {
127
+ json(result);
128
+ return;
129
+ }
130
+ heading(`User Activity (${result.windowDays} days)`);
131
+ keyValue("User", userUlid);
132
+ console.log();
133
+ if (result.breakdown && result.breakdown.length > 0) {
134
+ info("Activity Breakdown:");
135
+ console.log(formatTable(result.breakdown.slice(0, 15), [
136
+ { header: "ACTION", key: "action" },
137
+ { header: "FEATURE", key: "feature" },
138
+ { header: "ROUTE", key: "route" },
139
+ { header: "EVENTS", key: "events", align: "right" },
140
+ ]));
141
+ }
142
+ if (result.timeline && result.timeline.length > 0) {
143
+ divider();
144
+ info("Recent Timeline:");
145
+ console.log(formatTable(result.timeline.slice(-10), [
146
+ { header: "TIME", key: "bucketStart", format: formatDate },
147
+ { header: "EVENTS", key: "events", align: "right" },
148
+ ]));
149
+ }
150
+ }
151
+ catch (err) {
152
+ error(err.message);
153
+ process.exit(1);
154
+ }
155
+ });
156
+ // Integration metrics
157
+ analytics
158
+ .command("integrations")
159
+ .description("Get integration usage metrics")
160
+ .argument("[app-id]", "App ID (uses current app if not specified)")
161
+ .option("--app <app-id>", "App ID")
162
+ .option("--window-days <n>", "Time window in days", "30")
163
+ .option("--json", "Output as JSON")
164
+ .action(async (appId, options) => {
165
+ const resolvedAppId = resolveAppId(appId, options);
166
+ const client = new ApiClient();
167
+ try {
168
+ const result = await client.getAnalyticsIntegrationMetrics(resolvedAppId, {
169
+ windowDays: parseInt(options.windowDays),
170
+ });
171
+ if (options.json) {
172
+ json(result);
173
+ return;
174
+ }
175
+ heading(`Integration Metrics (${result.windowDays} days)`);
176
+ console.log();
177
+ if (!result.integrations || result.integrations.length === 0) {
178
+ info("No integration usage found.");
179
+ return;
180
+ }
181
+ console.log(formatTable(result.integrations, [
182
+ { header: "INTEGRATION", key: "integrationKey" },
183
+ { header: "CALLS", key: "invocations", align: "right", format: formatNumber },
184
+ { header: "ERROR RATE", key: "errorRate", align: "right", format: formatPercent },
185
+ { header: "AVG LATENCY", key: "avgDurationMs", align: "right", format: formatDuration },
186
+ { header: "P95 LATENCY", key: "p95DurationMs", align: "right", format: formatDuration },
187
+ ]));
188
+ }
189
+ catch (err) {
190
+ error(err.message);
191
+ process.exit(1);
192
+ }
193
+ });
194
+ }
195
+ //# sourceMappingURL=analytics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analytics.js","sourceRoot":"","sources":["../../../src/commands/analytics.ts"],"names":[],"mappings":"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"}