primitive-admin 1.0.25 → 1.0.26
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/README.md +124 -4
- package/dist/bin/primitive.js +21 -4
- package/dist/bin/primitive.js.map +1 -1
- package/dist/src/commands/auth.js +113 -3
- package/dist/src/commands/auth.js.map +1 -1
- package/dist/src/commands/collection-type-configs.js +178 -0
- package/dist/src/commands/collection-type-configs.js.map +1 -0
- package/dist/src/commands/collections.js +512 -0
- package/dist/src/commands/collections.js.map +1 -0
- package/dist/src/commands/documents.js +105 -2
- package/dist/src/commands/documents.js.map +1 -1
- package/dist/src/commands/init.js +126 -18
- package/dist/src/commands/init.js.map +1 -1
- package/dist/src/commands/sync.js +961 -75
- package/dist/src/commands/sync.js.map +1 -1
- package/dist/src/commands/tokens.js +17 -3
- package/dist/src/commands/tokens.js.map +1 -1
- package/dist/src/commands/users.js +60 -0
- package/dist/src/commands/users.js.map +1 -1
- package/dist/src/commands/workflows.js +21 -3
- package/dist/src/commands/workflows.js.map +1 -1
- package/dist/src/lib/api-client.js +351 -1
- package/dist/src/lib/api-client.js.map +1 -1
- package/dist/src/lib/template.js +161 -6
- package/dist/src/lib/template.js.map +1 -1
- package/dist/src/lib/version-check.js +3 -3
- package/dist/src/lib/version-check.js.map +1 -1
- package/package.json +4 -3
package/README.md
CHANGED
|
@@ -150,12 +150,13 @@ Manage users within an app.
|
|
|
150
150
|
|
|
151
151
|
```bash
|
|
152
152
|
primitive users list [app-id] # List users
|
|
153
|
+
primitive users create <email> [--role admin|member] # Create/add user by email
|
|
153
154
|
primitive users invite [app-id] <email> [--role admin] # Invite user
|
|
154
155
|
primitive users remove [app-id] <user-id> # Remove user
|
|
155
156
|
primitive users set-role [app-id] <user-id> <role> # Change role
|
|
156
157
|
primitive users transfer-owner [app-id] <new-owner-id> # Transfer ownership
|
|
157
|
-
primitive users
|
|
158
|
-
primitive users invitations
|
|
158
|
+
primitive users mint-jwt <user-id> [--role <role>] # Mint test JWT (dev/test only)
|
|
159
|
+
primitive users invitations [app-id] # List pending invitations
|
|
159
160
|
```
|
|
160
161
|
|
|
161
162
|
### Waitlist
|
|
@@ -248,6 +249,120 @@ primitive workflows runs list <workflow-id>
|
|
|
248
249
|
primitive workflows runs status <workflow-id> <run-id>
|
|
249
250
|
```
|
|
250
251
|
|
|
252
|
+
### Tokens
|
|
253
|
+
|
|
254
|
+
Manage long-lived API access tokens for headless/server authentication.
|
|
255
|
+
|
|
256
|
+
```bash
|
|
257
|
+
primitive tokens create <app-id> --name "My Token" --user <user-id> # Create token
|
|
258
|
+
primitive tokens create <app-id> --name "CI/CD" --ttl 90d --user <uid> # With expiry
|
|
259
|
+
primitive tokens list [app-id] # List tokens
|
|
260
|
+
primitive tokens show <token-id> [app-id] # Show details
|
|
261
|
+
primitive tokens revoke <token-id> [app-id] # Revoke token
|
|
262
|
+
```
|
|
263
|
+
|
|
264
|
+
**Create options:**
|
|
265
|
+
- `--name <name>` - Token name (required)
|
|
266
|
+
- `--user <user-id>` - App user ID to associate the token with (required)
|
|
267
|
+
- `--ttl <duration>` - Token lifetime (e.g., 7d, 30d, 4w, 3m, 1y). Omit for never-expiring
|
|
268
|
+
|
|
269
|
+
### Databases
|
|
270
|
+
|
|
271
|
+
Manage online databases and permissions. `list` returns databases the user has direct access to; group-shared databases are listed via `primitive groups databases`.
|
|
272
|
+
|
|
273
|
+
```bash
|
|
274
|
+
primitive databases list [app-id] # List databases (direct access)
|
|
275
|
+
primitive databases create <title> [app-id] # Create database
|
|
276
|
+
primitive databases get <database-id> [app-id] # Get details
|
|
277
|
+
primitive databases update <database-id> [options] # Update title or type
|
|
278
|
+
primitive databases delete <database-id> [app-id] # Delete database
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
**Permissions:**
|
|
282
|
+
```bash
|
|
283
|
+
primitive databases permissions list <database-id> [app-id]
|
|
284
|
+
primitive databases permissions grant <database-id> --user-id <uid> --permission <perm> [app-id]
|
|
285
|
+
primitive databases permissions revoke <database-id> <user-id> [app-id]
|
|
286
|
+
```
|
|
287
|
+
|
|
288
|
+
Permission values: `owner` (set at creation), `manager`
|
|
289
|
+
|
|
290
|
+
**Metadata:**
|
|
291
|
+
```bash
|
|
292
|
+
primitive databases metadata update <database-id> --data '{"key":"value"}' # Merge-update metadata
|
|
293
|
+
```
|
|
294
|
+
|
|
295
|
+
**Operations:**
|
|
296
|
+
```bash
|
|
297
|
+
primitive databases operations list <database-id> [app-id] # List registered operations
|
|
298
|
+
primitive databases operations execute <database-id> <op-name> --params '{}' # Execute operation
|
|
299
|
+
primitive databases operations execute <database-id> <op-name> --token <jwt> # Execute as specific user
|
|
300
|
+
```
|
|
301
|
+
|
|
302
|
+
The `--token` flag lets you execute an operation as a specific user using a test JWT from `users mint-jwt`. Useful for testing access rules.
|
|
303
|
+
|
|
304
|
+
**Records (schema introspection):**
|
|
305
|
+
```bash
|
|
306
|
+
primitive databases records models <database-id> [app-id] # List model names
|
|
307
|
+
primitive databases records describe <database-id> <model> [app-id] # Show inferred schema
|
|
308
|
+
```
|
|
309
|
+
|
|
310
|
+
**Indexes:**
|
|
311
|
+
```bash
|
|
312
|
+
primitive databases indexes list <database-id> [--model <name>] # List indexes
|
|
313
|
+
primitive databases indexes create <database-id> <model> <field> [options] # Create index
|
|
314
|
+
primitive databases indexes drop <database-id> <model> <field> # Drop index
|
|
315
|
+
```
|
|
316
|
+
|
|
317
|
+
### Documents
|
|
318
|
+
|
|
319
|
+
Manage document ownership and group permissions.
|
|
320
|
+
|
|
321
|
+
```bash
|
|
322
|
+
primitive documents transfer-owner [app-id] <document-id> <new-owner-id> # Transfer ownership
|
|
323
|
+
```
|
|
324
|
+
|
|
325
|
+
**Group permissions on documents:**
|
|
326
|
+
```bash
|
|
327
|
+
primitive documents group-permissions list <document-id>
|
|
328
|
+
primitive documents group-permissions grant <document-id> --group-type <type> --group-id <id> --permission <perm>
|
|
329
|
+
primitive documents group-permissions revoke <document-id> <group-type> <group-id>
|
|
330
|
+
```
|
|
331
|
+
|
|
332
|
+
Permission values: `read-write`, `reader`
|
|
333
|
+
|
|
334
|
+
### Groups
|
|
335
|
+
|
|
336
|
+
Manage groups, members, and memberships.
|
|
337
|
+
|
|
338
|
+
```bash
|
|
339
|
+
primitive groups list [app-id] # List groups
|
|
340
|
+
primitive groups create [app-id] --type <type> --id <id> --name <name> # Create group
|
|
341
|
+
primitive groups get <group-type> <group-id> [app-id] # Get details
|
|
342
|
+
primitive groups update <group-type> <group-id> [app-id] # Update group
|
|
343
|
+
primitive groups delete <group-type> <group-id> [app-id] # Delete group
|
|
344
|
+
```
|
|
345
|
+
|
|
346
|
+
**Members:**
|
|
347
|
+
```bash
|
|
348
|
+
primitive groups members list <group-type> <group-id> [app-id]
|
|
349
|
+
primitive groups members add <group-type> <group-id> <user-id> [app-id]
|
|
350
|
+
primitive groups members remove <group-type> <group-id> <user-id> [app-id]
|
|
351
|
+
primitive groups members set-role <group-type> <group-id> <user-id> <role> [app-id]
|
|
352
|
+
```
|
|
353
|
+
|
|
354
|
+
**Memberships:**
|
|
355
|
+
```bash
|
|
356
|
+
primitive groups memberships <user-id> [app-id] # List user's group memberships
|
|
357
|
+
```
|
|
358
|
+
|
|
359
|
+
**Group resource access:**
|
|
360
|
+
```bash
|
|
361
|
+
primitive groups documents <group-type> <group-id> # List documents a group can access
|
|
362
|
+
```
|
|
363
|
+
|
|
364
|
+
Group permissions on documents are managed via `primitive documents group-permissions` (see [Documents](#documents) above).
|
|
365
|
+
|
|
251
366
|
### Analytics
|
|
252
367
|
|
|
253
368
|
View usage analytics for an app.
|
|
@@ -476,8 +591,13 @@ cli/tests/
|
|
|
476
591
|
config.test.ts # Credentials and config management
|
|
477
592
|
output.test.ts # Output formatting functions
|
|
478
593
|
integration/
|
|
479
|
-
api-client.test.ts
|
|
480
|
-
commands.test.ts
|
|
594
|
+
api-client.test.ts # API client HTTP tests
|
|
595
|
+
commands.test.ts # CLI command tests
|
|
596
|
+
tokens.test.ts # Token lifecycle tests
|
|
597
|
+
databases.test.ts # Database CRUD, permissions, group permissions tests
|
|
598
|
+
documents.test.ts # Document group permissions, group resource listing tests
|
|
599
|
+
groups.test.ts # Group CRUD, members, memberships tests
|
|
600
|
+
classroom-e2e.test.ts # End-to-end classroom app workflow (types, rules, operations, access)
|
|
481
601
|
```
|
|
482
602
|
|
|
483
603
|
## Troubleshooting
|
package/dist/bin/primitive.js
CHANGED
|
@@ -18,10 +18,17 @@ import { registerSyncCommands } from "../src/commands/sync.js";
|
|
|
18
18
|
import { registerLlmCommands } from "../src/commands/llm.js";
|
|
19
19
|
import { registerComparisonsCommands } from "../src/commands/comparisons.js";
|
|
20
20
|
import { registerTokensCommands } from "../src/commands/tokens.js";
|
|
21
|
+
import { registerDatabasesCommands } from "../src/commands/databases.js";
|
|
22
|
+
import { registerGroupsCommands } from "../src/commands/groups.js";
|
|
23
|
+
import { registerRuleSetsCommands } from "../src/commands/rule-sets.js";
|
|
24
|
+
import { registerGroupTypeConfigsCommands } from "../src/commands/group-type-configs.js";
|
|
25
|
+
import { registerDatabaseTypesCommands } from "../src/commands/database-types.js";
|
|
21
26
|
import { registerGuidesCommands } from "../src/commands/guides.js";
|
|
22
27
|
import { registerDocumentsCommands } from "../src/commands/documents.js";
|
|
23
28
|
import chalk from "chalk";
|
|
24
29
|
import { registerEmailTemplatesCommands } from "../src/commands/email-templates.js";
|
|
30
|
+
import { registerCollectionsCommands } from "../src/commands/collections.js";
|
|
31
|
+
import { registerCollectionTypeConfigsCommands } from "../src/commands/collection-type-configs.js";
|
|
25
32
|
import { error } from "../src/lib/output.js";
|
|
26
33
|
import { ApiError } from "../src/lib/api-client.js";
|
|
27
34
|
import { checkForUpdate } from "../src/lib/version-check.js";
|
|
@@ -32,7 +39,7 @@ const pkg = JSON.parse(readFileSync(resolve(__dirname, "../../package.json"), "u
|
|
|
32
39
|
const isVersionFlag = process.argv.includes("--version") || process.argv.includes("-V");
|
|
33
40
|
const subcommand = process.argv[2];
|
|
34
41
|
const isJsonOutput = process.argv.includes("--json");
|
|
35
|
-
const skipHeader = isVersionFlag || isJsonOutput || subcommand === "login" || subcommand === "logout";
|
|
42
|
+
const skipHeader = isVersionFlag || isJsonOutput || subcommand === "login" || subcommand === "logout" || subcommand === "token";
|
|
36
43
|
if (!skipHeader) {
|
|
37
44
|
const creds = loadCredentials();
|
|
38
45
|
const appName = creds?.currentAppName;
|
|
@@ -86,27 +93,37 @@ registerSyncCommands(program);
|
|
|
86
93
|
registerLlmCommands(program);
|
|
87
94
|
registerComparisonsCommands(program);
|
|
88
95
|
registerTokensCommands(program);
|
|
96
|
+
registerDatabasesCommands(program);
|
|
97
|
+
registerGroupsCommands(program);
|
|
98
|
+
registerRuleSetsCommands(program);
|
|
99
|
+
registerGroupTypeConfigsCommands(program);
|
|
100
|
+
registerDatabaseTypesCommands(program);
|
|
89
101
|
registerGuidesCommands(program);
|
|
90
102
|
registerDocumentsCommands(program);
|
|
91
103
|
registerEmailTemplatesCommands(program);
|
|
104
|
+
registerCollectionsCommands(program);
|
|
105
|
+
registerCollectionTypeConfigsCommands(program);
|
|
92
106
|
// Global error handler
|
|
93
107
|
program.hook("preAction", () => {
|
|
94
108
|
// Reset API client state before each command
|
|
95
109
|
});
|
|
96
110
|
// Parse and execute
|
|
97
111
|
program.parseAsync(process.argv)
|
|
98
|
-
.then(() =>
|
|
112
|
+
.then(() => { if (!isJsonOutput)
|
|
113
|
+
return checkForUpdate(pkg.version); })
|
|
99
114
|
.catch(async (err) => {
|
|
100
115
|
if (err instanceof ApiError) {
|
|
101
116
|
error(err.message);
|
|
102
117
|
if (err.statusCode === 401) {
|
|
103
118
|
error("Try running 'primitive login' to authenticate.");
|
|
104
119
|
}
|
|
105
|
-
|
|
120
|
+
if (!isJsonOutput)
|
|
121
|
+
await checkForUpdate(pkg.version);
|
|
106
122
|
process.exit(err.statusCode === 401 ? 2 : 1);
|
|
107
123
|
}
|
|
108
124
|
error(err.message || "An unexpected error occurred");
|
|
109
|
-
|
|
125
|
+
if (!isJsonOutput)
|
|
126
|
+
await checkForUpdate(pkg.version);
|
|
110
127
|
process.exit(1);
|
|
111
128
|
});
|
|
112
129
|
//# sourceMappingURL=primitive.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"primitive.js","sourceRoot":"","sources":["../../bin/primitive.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACxC,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,wBAAwB,EAAE,MAAM,6BAA6B,CAAC;AACvE,OAAO,EAAE,4BAA4B,EAAE,MAAM,iCAAiC,CAAC;AAC/E,OAAO,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AACrE,OAAO,EAAE,yBAAyB,EAAE,MAAM,8BAA8B,CAAC;AACzE,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AACrE,OAAO,EAAE,yBAAyB,EAAE,MAAM,8BAA8B,CAAC;AACzE,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,2BAA2B,EAAE,MAAM,gCAAgC,CAAC;AAC7E,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,EAAE,yBAAyB,EAAE,MAAM,8BAA8B,CAAC;AACzE,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,8BAA8B,EAAE,MAAM,oCAAoC,CAAC;AACpF,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEvD,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AACtC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,SAAS,EAAE,oBAAoB,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;AAExF,MAAM,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AACxF,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACnC,MAAM,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AACrD,MAAM,UAAU,GAAG,aAAa,IAAI,YAAY,IAAI,UAAU,KAAK,OAAO,IAAI,UAAU,KAAK,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"primitive.js","sourceRoot":"","sources":["../../bin/primitive.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,16 +1,86 @@
|
|
|
1
|
-
import { loadCredentials, clearCredentials, setCurrentApp, clearCurrentApp, } from "../lib/config.js";
|
|
1
|
+
import { loadCredentials, saveCredentials, clearCredentials, setCurrentApp, clearCurrentApp, } from "../lib/config.js";
|
|
2
2
|
import { browserLogin } from "../lib/auth-flow.js";
|
|
3
|
+
import { fetchWithTLS } from "../lib/fetch.js";
|
|
3
4
|
import { ApiClient } from "../lib/api-client.js";
|
|
4
5
|
import { success, error, info, keyValue, formatId, json, } from "../lib/output.js";
|
|
5
6
|
import { DEFAULT_SERVER_URL } from "../lib/constants.js";
|
|
7
|
+
function parseJwt(token) {
|
|
8
|
+
try {
|
|
9
|
+
const parts = token.split(".");
|
|
10
|
+
if (parts.length !== 3)
|
|
11
|
+
return {};
|
|
12
|
+
const payload = parts[1];
|
|
13
|
+
const decoded = Buffer.from(payload, "base64url").toString("utf-8");
|
|
14
|
+
return JSON.parse(decoded);
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
return {};
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
function readStdin() {
|
|
21
|
+
return new Promise((resolve, reject) => {
|
|
22
|
+
if (process.stdin.isTTY) {
|
|
23
|
+
resolve("");
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
let data = "";
|
|
27
|
+
process.stdin.setEncoding("utf-8");
|
|
28
|
+
process.stdin.on("data", (chunk) => { data += chunk; });
|
|
29
|
+
process.stdin.on("end", () => resolve(data));
|
|
30
|
+
process.stdin.on("error", reject);
|
|
31
|
+
});
|
|
32
|
+
}
|
|
6
33
|
export function registerAuthCommands(program) {
|
|
7
34
|
// Login command
|
|
8
35
|
program
|
|
9
36
|
.command("login")
|
|
10
37
|
.description("Authenticate with the Primitive admin API via browser OAuth")
|
|
11
38
|
.option("-s, --server <url>", "Server URL", DEFAULT_SERVER_URL)
|
|
39
|
+
.option("--token-stdin", "Read a refresh token from stdin instead of browser OAuth")
|
|
12
40
|
.action(async (options) => {
|
|
13
41
|
const serverUrl = options.server.replace(/\/$/, ""); // Remove trailing slash
|
|
42
|
+
if (options.tokenStdin) {
|
|
43
|
+
const refreshToken = (await readStdin()).trim();
|
|
44
|
+
if (!refreshToken) {
|
|
45
|
+
error("No token provided on stdin. Pipe a refresh token, e.g.:");
|
|
46
|
+
info(" primitive token --refresh | primitive login -s <url> --token-stdin");
|
|
47
|
+
process.exit(1);
|
|
48
|
+
}
|
|
49
|
+
try {
|
|
50
|
+
const response = await fetchWithTLS(`${serverUrl}/admin/api/auth/refresh`, {
|
|
51
|
+
method: "POST",
|
|
52
|
+
headers: { "Content-Type": "application/json" },
|
|
53
|
+
body: JSON.stringify({ refreshToken }),
|
|
54
|
+
});
|
|
55
|
+
if (!response.ok) {
|
|
56
|
+
error("Token refresh failed. The token may be expired or invalid.");
|
|
57
|
+
process.exit(1);
|
|
58
|
+
}
|
|
59
|
+
const data = (await response.json());
|
|
60
|
+
const payload = parseJwt(data.accessToken || data.jwt);
|
|
61
|
+
const credentials = {
|
|
62
|
+
serverUrl,
|
|
63
|
+
accessToken: data.accessToken || data.jwt,
|
|
64
|
+
refreshToken: data.refreshToken || refreshToken,
|
|
65
|
+
expiresAt: data.expiresAt || new Date(Date.now() + 3600 * 1000).toISOString(),
|
|
66
|
+
adminId: payload.adminId || "",
|
|
67
|
+
email: payload.email || "",
|
|
68
|
+
role: payload.role || "admin",
|
|
69
|
+
name: payload.name,
|
|
70
|
+
globalAdminAppId: payload.globalAdminAppId,
|
|
71
|
+
};
|
|
72
|
+
saveCredentials(credentials);
|
|
73
|
+
success(`Logged in as ${credentials.email}`);
|
|
74
|
+
if (credentials.role === "super-admin") {
|
|
75
|
+
info("You have super-admin privileges.");
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
catch (err) {
|
|
79
|
+
error(err.message || "Login with token failed");
|
|
80
|
+
process.exit(1);
|
|
81
|
+
}
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
14
84
|
const result = await browserLogin(serverUrl);
|
|
15
85
|
if (result.success && result.credentials) {
|
|
16
86
|
success(`Logged in as ${result.credentials.email}`);
|
|
@@ -23,6 +93,45 @@ export function registerAuthCommands(program) {
|
|
|
23
93
|
process.exit(1);
|
|
24
94
|
}
|
|
25
95
|
});
|
|
96
|
+
// Bootstrap command - create first admin on empty database
|
|
97
|
+
program
|
|
98
|
+
.command("bootstrap")
|
|
99
|
+
.description("Create the first admin user on an empty database (no Google OAuth required)")
|
|
100
|
+
.requiredOption("-s, --server <url>", "Server URL")
|
|
101
|
+
.requiredOption("-e, --email <email>", "Admin email address")
|
|
102
|
+
.action(async (options) => {
|
|
103
|
+
const serverUrl = options.server.replace(/\/$/, "");
|
|
104
|
+
try {
|
|
105
|
+
const response = await fetchWithTLS(`${serverUrl}/admin/api/bootstrap`, {
|
|
106
|
+
method: "POST",
|
|
107
|
+
headers: { "Content-Type": "application/json" },
|
|
108
|
+
body: JSON.stringify({ email: options.email }),
|
|
109
|
+
});
|
|
110
|
+
const data = (await response.json());
|
|
111
|
+
if (!response.ok) {
|
|
112
|
+
error(data.error || `Bootstrap failed (${response.status})`);
|
|
113
|
+
process.exit(1);
|
|
114
|
+
}
|
|
115
|
+
const credentials = {
|
|
116
|
+
serverUrl,
|
|
117
|
+
accessToken: data.accessToken,
|
|
118
|
+
refreshToken: data.refreshToken,
|
|
119
|
+
expiresAt: data.expiresAt,
|
|
120
|
+
adminId: data.adminId,
|
|
121
|
+
email: data.email,
|
|
122
|
+
role: data.role || "super-admin",
|
|
123
|
+
name: data.name,
|
|
124
|
+
globalAdminAppId: data.globalAdminAppId,
|
|
125
|
+
};
|
|
126
|
+
saveCredentials(credentials);
|
|
127
|
+
success(`Bootstrapped as ${credentials.email} (super-admin)`);
|
|
128
|
+
info("You can now use the CLI to create apps and manage users.");
|
|
129
|
+
}
|
|
130
|
+
catch (err) {
|
|
131
|
+
error(err.message || "Bootstrap failed");
|
|
132
|
+
process.exit(1);
|
|
133
|
+
}
|
|
134
|
+
});
|
|
26
135
|
// Logout command
|
|
27
136
|
program
|
|
28
137
|
.command("logout")
|
|
@@ -65,14 +174,15 @@ export function registerAuthCommands(program) {
|
|
|
65
174
|
program
|
|
66
175
|
.command("token")
|
|
67
176
|
.description("Print the current access token (for scripting)")
|
|
68
|
-
.
|
|
177
|
+
.option("--refresh", "Print the refresh token instead of the access token")
|
|
178
|
+
.action((options) => {
|
|
69
179
|
const credentials = loadCredentials();
|
|
70
180
|
if (!credentials) {
|
|
71
181
|
error("Not logged in. Run 'primitive login' first.");
|
|
72
182
|
process.exit(2);
|
|
73
183
|
}
|
|
74
184
|
// Print only the token for easy piping
|
|
75
|
-
console.log(credentials.accessToken);
|
|
185
|
+
console.log(options.refresh ? credentials.refreshToken : credentials.accessToken);
|
|
76
186
|
});
|
|
77
187
|
// Use command - set current app context
|
|
78
188
|
program
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../src/commands/auth.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,aAAa,EACb,eAAe,GAEhB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,SAAS,EAAY,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EACL,OAAO,EACP,KAAK,EACL,IAAI,EACJ,QAAQ,EAER,QAAQ,EACR,IAAI,GACL,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../src/commands/auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
import { ApiClient } from "../lib/api-client.js";
|
|
2
|
+
import { getCurrentAppId } from "../lib/config.js";
|
|
3
|
+
import { success, error, info, keyValue, formatTable, formatDate, json, } 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 registerCollectionTypeConfigsCommands(program) {
|
|
13
|
+
const configs = program
|
|
14
|
+
.command("collection-type-configs")
|
|
15
|
+
.description("Manage collection type configurations (CEL rule sets)")
|
|
16
|
+
.addHelpText("after", `
|
|
17
|
+
Examples:
|
|
18
|
+
$ primitive collection-type-configs list
|
|
19
|
+
$ primitive collection-type-configs create --collection-type default --rule-set-id <id>
|
|
20
|
+
$ primitive collection-type-configs get default
|
|
21
|
+
$ primitive collection-type-configs update default --rule-set-id <new-id>
|
|
22
|
+
$ primitive collection-type-configs delete default
|
|
23
|
+
`);
|
|
24
|
+
// List
|
|
25
|
+
configs
|
|
26
|
+
.command("list")
|
|
27
|
+
.description("List collection type configs in an app")
|
|
28
|
+
.argument("[app-id]", "App ID (uses current app if not specified)")
|
|
29
|
+
.option("--app <app-id>", "App ID")
|
|
30
|
+
.option("--json", "Output as JSON")
|
|
31
|
+
.action(async (appId, options) => {
|
|
32
|
+
const resolvedAppId = resolveAppId(appId, options);
|
|
33
|
+
const client = new ApiClient();
|
|
34
|
+
try {
|
|
35
|
+
const result = await client.listCollectionTypeConfigs(resolvedAppId);
|
|
36
|
+
const list = Array.isArray(result) ? result : [];
|
|
37
|
+
if (options.json) {
|
|
38
|
+
json(list);
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
if (list.length === 0) {
|
|
42
|
+
info("No collection type configs found.");
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
console.log(formatTable(list, [
|
|
46
|
+
{ header: "COLLECTION_TYPE", key: "collectionType" },
|
|
47
|
+
{ header: "RULE_SET_ID", key: "ruleSetId", format: (v) => v || "(none)" },
|
|
48
|
+
{ header: "CREATED", key: "createdAt", format: formatDate },
|
|
49
|
+
]));
|
|
50
|
+
}
|
|
51
|
+
catch (err) {
|
|
52
|
+
error(err.message);
|
|
53
|
+
process.exit(1);
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
// Create
|
|
57
|
+
configs
|
|
58
|
+
.command("create")
|
|
59
|
+
.description("Create a collection type config")
|
|
60
|
+
.requiredOption("--collection-type <type>", "Collection type (e.g. default)")
|
|
61
|
+
.option("--rule-set-id <id>", "Rule set ID to attach")
|
|
62
|
+
.option("--app <app-id>", "App ID")
|
|
63
|
+
.option("--json", "Output as JSON")
|
|
64
|
+
.action(async (options) => {
|
|
65
|
+
const resolvedAppId = resolveAppId(undefined, options);
|
|
66
|
+
const client = new ApiClient();
|
|
67
|
+
try {
|
|
68
|
+
const data = { collectionType: options.collectionType };
|
|
69
|
+
if (options.ruleSetId)
|
|
70
|
+
data.ruleSetId = options.ruleSetId;
|
|
71
|
+
const result = await client.createCollectionTypeConfig(resolvedAppId, data);
|
|
72
|
+
if (options.json) {
|
|
73
|
+
json(result);
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
success("Collection type config created.");
|
|
77
|
+
keyValue("Collection Type", result.collectionType);
|
|
78
|
+
keyValue("Rule Set ID", result.ruleSetId || "(none)");
|
|
79
|
+
}
|
|
80
|
+
catch (err) {
|
|
81
|
+
error(err.message);
|
|
82
|
+
process.exit(1);
|
|
83
|
+
}
|
|
84
|
+
});
|
|
85
|
+
// Get
|
|
86
|
+
configs
|
|
87
|
+
.command("get")
|
|
88
|
+
.description("Get a collection type config")
|
|
89
|
+
.argument("<collection-type>", "Collection type")
|
|
90
|
+
.option("--app <app-id>", "App ID")
|
|
91
|
+
.option("--json", "Output as JSON")
|
|
92
|
+
.action(async (collectionType, options) => {
|
|
93
|
+
const resolvedAppId = resolveAppId(undefined, options);
|
|
94
|
+
const client = new ApiClient();
|
|
95
|
+
try {
|
|
96
|
+
const result = await client.getCollectionTypeConfig(resolvedAppId, collectionType);
|
|
97
|
+
if (options.json) {
|
|
98
|
+
json(result);
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
keyValue("Collection Type", result.collectionType);
|
|
102
|
+
keyValue("Rule Set ID", result.ruleSetId || "(none)");
|
|
103
|
+
keyValue("Created", formatDate(result.createdAt));
|
|
104
|
+
keyValue("Modified", formatDate(result.modifiedAt));
|
|
105
|
+
}
|
|
106
|
+
catch (err) {
|
|
107
|
+
error(err.message);
|
|
108
|
+
process.exit(1);
|
|
109
|
+
}
|
|
110
|
+
});
|
|
111
|
+
// Update
|
|
112
|
+
configs
|
|
113
|
+
.command("update")
|
|
114
|
+
.description("Update a collection type config")
|
|
115
|
+
.argument("<collection-type>", "Collection type")
|
|
116
|
+
.option("--rule-set-id <id>", "Rule set ID (use 'null' to detach)")
|
|
117
|
+
.option("--app <app-id>", "App ID")
|
|
118
|
+
.option("--json", "Output as JSON")
|
|
119
|
+
.action(async (collectionType, options) => {
|
|
120
|
+
const resolvedAppId = resolveAppId(undefined, options);
|
|
121
|
+
const client = new ApiClient();
|
|
122
|
+
const data = {};
|
|
123
|
+
if (options.ruleSetId !== undefined) {
|
|
124
|
+
data.ruleSetId = options.ruleSetId === "null" ? null : options.ruleSetId;
|
|
125
|
+
}
|
|
126
|
+
if (Object.keys(data).length === 0) {
|
|
127
|
+
error("Nothing to update. Provide --rule-set-id.");
|
|
128
|
+
process.exit(1);
|
|
129
|
+
}
|
|
130
|
+
try {
|
|
131
|
+
const result = await client.updateCollectionTypeConfig(resolvedAppId, collectionType, data);
|
|
132
|
+
if (options.json) {
|
|
133
|
+
json(result);
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
success(`Collection type config '${collectionType}' updated.`);
|
|
137
|
+
}
|
|
138
|
+
catch (err) {
|
|
139
|
+
error(err.message);
|
|
140
|
+
process.exit(1);
|
|
141
|
+
}
|
|
142
|
+
});
|
|
143
|
+
// Delete
|
|
144
|
+
configs
|
|
145
|
+
.command("delete")
|
|
146
|
+
.description("Delete a collection type config")
|
|
147
|
+
.argument("<collection-type>", "Collection type")
|
|
148
|
+
.option("--app <app-id>", "App ID")
|
|
149
|
+
.option("-y, --yes", "Skip confirmation prompt")
|
|
150
|
+
.action(async (collectionType, options) => {
|
|
151
|
+
const resolvedAppId = resolveAppId(undefined, options);
|
|
152
|
+
if (!options.yes) {
|
|
153
|
+
const inquirer = await import("inquirer");
|
|
154
|
+
const { confirm } = await inquirer.default.prompt([
|
|
155
|
+
{
|
|
156
|
+
type: "confirm",
|
|
157
|
+
name: "confirm",
|
|
158
|
+
message: `Delete collection type config '${collectionType}'? This cannot be undone.`,
|
|
159
|
+
default: false,
|
|
160
|
+
},
|
|
161
|
+
]);
|
|
162
|
+
if (!confirm) {
|
|
163
|
+
info("Cancelled.");
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
const client = new ApiClient();
|
|
168
|
+
try {
|
|
169
|
+
await client.deleteCollectionTypeConfig(resolvedAppId, collectionType);
|
|
170
|
+
success(`Collection type config '${collectionType}' deleted.`);
|
|
171
|
+
}
|
|
172
|
+
catch (err) {
|
|
173
|
+
error(err.message);
|
|
174
|
+
process.exit(1);
|
|
175
|
+
}
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
//# sourceMappingURL=collection-type-configs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collection-type-configs.js","sourceRoot":"","sources":["../../../src/commands/collection-type-configs.ts"],"names":[],"mappings":"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"}
|