primitive-admin 1.1.0-alpha.61 → 1.1.0-alpha.63
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 +34 -27
- package/assets/skill/skills/primitive-platform/SKILL.md +59 -21
- package/dist/bin/primitive.js +10 -10
- package/dist/bin/primitive.js.map +1 -1
- package/dist/src/commands/apps.js +40 -41
- package/dist/src/commands/apps.js.map +1 -1
- package/dist/src/commands/blob-buckets.js +7 -7
- package/dist/src/commands/blob-buckets.js.map +1 -1
- package/dist/src/commands/collection-type-configs.js +7 -7
- package/dist/src/commands/collection-type-configs.js.map +1 -1
- package/dist/src/commands/collections.js +47 -8
- package/dist/src/commands/collections.js.map +1 -1
- package/dist/src/commands/config.d.ts +23 -12
- package/dist/src/commands/config.js +80 -45
- package/dist/src/commands/config.js.map +1 -1
- package/dist/src/commands/cron-triggers.js +6 -6
- package/dist/src/commands/cron-triggers.js.map +1 -1
- package/dist/src/commands/database-type-configs.d.ts +2 -0
- package/dist/src/commands/database-type-configs.js +171 -0
- package/dist/src/commands/database-type-configs.js.map +1 -0
- package/dist/src/commands/database-types.js +313 -13
- package/dist/src/commands/database-types.js.map +1 -1
- package/dist/src/commands/databases.js +35 -25
- package/dist/src/commands/databases.js.map +1 -1
- package/dist/src/commands/documents.js +138 -11
- package/dist/src/commands/documents.js.map +1 -1
- package/dist/src/commands/email-templates.js +8 -8
- package/dist/src/commands/email-templates.js.map +1 -1
- package/dist/src/commands/group-type-configs.js +7 -7
- package/dist/src/commands/group-type-configs.js.map +1 -1
- package/dist/src/commands/init.js +1 -1
- package/dist/src/commands/init.js.map +1 -1
- package/dist/src/commands/integrations.js +12 -197
- package/dist/src/commands/integrations.js.map +1 -1
- package/dist/src/commands/llm.js +6 -9
- package/dist/src/commands/llm.js.map +1 -1
- package/dist/src/commands/metadata-category-configs.d.ts +12 -0
- package/dist/src/commands/metadata-category-configs.js +112 -0
- package/dist/src/commands/metadata-category-configs.js.map +1 -0
- package/dist/src/commands/metadata.js +4 -129
- package/dist/src/commands/metadata.js.map +1 -1
- package/dist/src/commands/prompts.js +24 -282
- package/dist/src/commands/prompts.js.map +1 -1
- package/dist/src/commands/rule-sets.js +8 -8
- package/dist/src/commands/rule-sets.js.map +1 -1
- package/dist/src/commands/scripts.js +16 -201
- package/dist/src/commands/scripts.js.map +1 -1
- package/dist/src/commands/settings.d.ts +9 -12
- package/dist/src/commands/settings.js +79 -31
- package/dist/src/commands/settings.js.map +1 -1
- package/dist/src/commands/sync-app-settings.d.ts +24 -19
- package/dist/src/commands/sync-app-settings.js +48 -52
- package/dist/src/commands/sync-app-settings.js.map +1 -1
- package/dist/src/commands/sync.d.ts +1003 -53
- package/dist/src/commands/sync.js +4080 -882
- package/dist/src/commands/sync.js.map +1 -1
- package/dist/src/commands/vars.js +4 -4
- package/dist/src/commands/vars.js.map +1 -1
- package/dist/src/commands/webhooks.js +6 -6
- package/dist/src/commands/webhooks.js.map +1 -1
- package/dist/src/commands/workflows.d.ts +22 -0
- package/dist/src/commands/workflows.js +142 -446
- package/dist/src/commands/workflows.js.map +1 -1
- package/dist/src/lib/access-rule-display.d.ts +21 -0
- package/dist/src/lib/access-rule-display.js +34 -0
- package/dist/src/lib/access-rule-display.js.map +1 -0
- package/dist/src/lib/api-client.d.ts +75 -37
- package/dist/src/lib/api-client.js +113 -59
- package/dist/src/lib/api-client.js.map +1 -1
- package/dist/src/lib/codegen-shared/generatedFiles.d.ts +6 -2
- package/dist/src/lib/codegen-shared/generatedFiles.js +9 -2
- package/dist/src/lib/codegen-shared/generatedFiles.js.map +1 -1
- package/dist/src/lib/codegen-shared/resolveCodegenSourceDir.d.ts +6 -6
- package/dist/src/lib/codegen-shared/resolveCodegenSourceDir.js +8 -8
- package/dist/src/lib/codegen-shared/resolveCodegenSourceDir.js.map +1 -1
- package/dist/src/lib/config-object-descriptor.d.ts +24 -5
- package/dist/src/lib/config-object-descriptor.js +58 -10
- package/dist/src/lib/config-object-descriptor.js.map +1 -1
- package/dist/src/lib/config-payload.d.ts +1 -1
- package/dist/src/lib/config-payload.js +1 -1
- package/dist/src/lib/config-surface.d.ts +8 -8
- package/dist/src/lib/config-surface.js +10 -10
- package/dist/src/lib/config-surface.js.map +1 -1
- package/dist/src/lib/db-codegen/dbTemplates.js +1 -1
- package/dist/src/lib/db-codegen/dbTemplates.js.map +1 -1
- package/dist/src/lib/db-codegen/dbTypeIR.d.ts +1 -1
- package/dist/src/lib/generated-allowlist.js +11 -0
- package/dist/src/lib/generated-allowlist.js.map +1 -1
- package/dist/src/lib/generated-config-surfaces.d.ts +14 -14
- package/dist/src/lib/generated-config-surfaces.js +63 -35
- package/dist/src/lib/generated-config-surfaces.js.map +1 -1
- package/dist/src/lib/generated-template-lint.d.ts +16 -10
- package/dist/src/lib/generated-template-lint.js +59 -24
- package/dist/src/lib/generated-template-lint.js.map +1 -1
- package/dist/src/lib/google-client-secret-status.d.ts +1 -1
- package/dist/src/lib/google-client-secret-status.js +4 -4
- package/dist/src/lib/google-client-secret-status.js.map +1 -1
- package/dist/src/lib/migration-nag.d.ts +2 -2
- package/dist/src/lib/migration-nag.js +3 -3
- package/dist/src/lib/output.d.ts +1 -1
- package/dist/src/lib/output.js +1 -1
- package/dist/src/lib/platform-owned.d.ts +5 -5
- package/dist/src/lib/platform-owned.js +6 -6
- package/dist/src/lib/platform-owned.js.map +1 -1
- package/dist/src/lib/query-operators.d.ts +1 -1
- package/dist/src/lib/query-operators.js +1 -1
- package/dist/src/lib/signing-secret-status.d.ts +2 -2
- package/dist/src/lib/signing-secret-status.js +2 -2
- package/dist/src/lib/snapshots.d.ts +2 -2
- package/dist/src/lib/snapshots.js +2 -2
- package/dist/src/lib/swift-codegen/dbGenerator.d.ts +15 -2
- package/dist/src/lib/swift-codegen/dbGenerator.js +250 -18
- package/dist/src/lib/swift-codegen/dbGenerator.js.map +1 -1
- package/dist/src/lib/swift-codegen/generator.js +5 -4
- package/dist/src/lib/swift-codegen/generator.js.map +1 -1
- package/dist/src/lib/swift-codegen/siblingSymbols.d.ts +7 -3
- package/dist/src/lib/swift-codegen/siblingSymbols.js +4 -1
- package/dist/src/lib/swift-codegen/siblingSymbols.js.map +1 -1
- package/dist/src/lib/sync-dir-selector.d.ts +21 -0
- package/dist/src/lib/sync-dir-selector.js +30 -0
- package/dist/src/lib/sync-dir-selector.js.map +1 -0
- package/dist/src/lib/sync-paths.d.ts +39 -0
- package/dist/src/lib/sync-paths.js +70 -2
- package/dist/src/lib/sync-paths.js.map +1 -1
- package/dist/src/lib/sync-resource-types.d.ts +122 -31
- package/dist/src/lib/sync-resource-types.js +177 -42
- package/dist/src/lib/sync-resource-types.js.map +1 -1
- package/dist/src/lib/sync-selectors.d.ts +4 -4
- package/dist/src/lib/sync-selectors.js +4 -4
- package/dist/src/lib/toml-database-config.d.ts +4 -4
- package/dist/src/lib/toml-database-config.js +3 -3
- package/dist/src/lib/toml-database-config.js.map +1 -1
- package/dist/src/lib/toml-metadata-config.d.ts +4 -4
- package/dist/src/lib/toml-metadata-config.js +4 -4
- package/dist/src/lib/toml-native-form.d.ts +1 -1
- package/dist/src/lib/toml-native-form.js +1 -1
- package/dist/src/lib/toml-params-validator.d.ts +1 -1
- package/dist/src/lib/toml-params-validator.js +1 -1
- package/dist/src/lib/version-check.js +1 -1
- package/dist/src/lib/version-check.js.map +1 -1
- package/dist/src/lib/workflow-apply.d.ts +69 -10
- package/dist/src/lib/workflow-apply.js +99 -24
- package/dist/src/lib/workflow-apply.js.map +1 -1
- package/dist/src/lib/workflow-codegen/generator.js +1 -1
- package/dist/src/lib/workflow-codegen/generator.js.map +1 -1
- package/dist/src/lib/workflow-config-apply.d.ts +1 -1
- package/dist/src/lib/workflow-config-apply.js +1 -1
- package/dist/src/lib/workflow-config-sidecar.d.ts +1 -1
- package/dist/src/lib/workflow-config-sidecar.js +1 -1
- package/dist/src/lib/workflow-config-sidecar.js.map +1 -1
- package/dist/src/lib/workflow-defaults.d.ts +30 -0
- package/dist/src/lib/workflow-defaults.js +41 -0
- package/dist/src/lib/workflow-defaults.js.map +1 -0
- package/dist/src/lib/workflow-include-preserve.d.ts +12 -7
- package/dist/src/lib/workflow-include-preserve.js +139 -6
- package/dist/src/lib/workflow-include-preserve.js.map +1 -1
- package/dist/src/lib/workflow-payload.d.ts +26 -14
- package/dist/src/lib/workflow-payload.js +61 -45
- package/dist/src/lib/workflow-payload.js.map +1 -1
- package/dist/src/lib/workflow-toml-validator.d.ts +19 -16
- package/dist/src/lib/workflow-toml-validator.js +19 -16
- package/dist/src/lib/workflow-toml-validator.js.map +1 -1
- package/dist/src/types/index.d.ts +15 -0
- package/dist/src/validators.d.ts +7 -7
- package/dist/src/validators.js +6 -6
- package/package.json +1 -3
- package/dist/src/lib/generated-workflow-model-fields.d.ts +0 -20
- package/dist/src/lib/generated-workflow-model-fields.js +0 -53
- package/dist/src/lib/generated-workflow-model-fields.js.map +0 -1
- package/dist/src/lib/workflow-field-descriptor.d.ts +0 -91
- package/dist/src/lib/workflow-field-descriptor.js +0 -153
- package/dist/src/lib/workflow-field-descriptor.js.map +0 -1
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { ApiClient } from "../lib/api-client.js";
|
|
2
2
|
import { resolveAppId } from "../lib/config.js";
|
|
3
|
-
import { confirmPrompt } from "../lib/confirm-prompt.js";
|
|
4
3
|
import { parseDataOption } from "../lib/data-input.js";
|
|
5
4
|
import { success, error, info, keyValue, json, divider, } from "../lib/output.js";
|
|
6
5
|
/**
|
|
@@ -41,8 +40,10 @@ export function registerMetadataCommands(program) {
|
|
|
41
40
|
.command("metadata")
|
|
42
41
|
.description("Read and write typed resource metadata (values)")
|
|
43
42
|
.addHelpText("after", `
|
|
44
|
-
|
|
45
|
-
|
|
43
|
+
These commands read and write metadata VALUES. Category definitions (schemas
|
|
44
|
+
and read/write rules) are a separate plane: inspect them with
|
|
45
|
+
'primitive metadata-category-configs', author them in TOML and apply them with
|
|
46
|
+
'primitive config push'.
|
|
46
47
|
|
|
47
48
|
Examples:
|
|
48
49
|
$ primitive metadata get user 01HXY... profile
|
|
@@ -52,8 +53,6 @@ Examples:
|
|
|
52
53
|
$ primitive metadata get-batch --resource user:01HXY...:profile,settings --resource class:01HZQ...:roster
|
|
53
54
|
$ primitive metadata get-batch --requests '[{"resourceType":"user","resourceId":"01HXY...","categories":["profile"]}]'
|
|
54
55
|
$ primitive metadata resolve user billing stripeCustomerId cus_ABC
|
|
55
|
-
$ primitive metadata categories list
|
|
56
|
-
$ primitive metadata categories get user profile
|
|
57
56
|
`);
|
|
58
57
|
// ─── get ───
|
|
59
58
|
metadata
|
|
@@ -278,129 +277,5 @@ Example:
|
|
|
278
277
|
process.exit(1);
|
|
279
278
|
}
|
|
280
279
|
});
|
|
281
|
-
// ─── categories (read-only config inspection) ───
|
|
282
|
-
//
|
|
283
|
-
// Category definitions are authored declaratively via `primitive sync`; these
|
|
284
|
-
// read-only subcommands let a developer inspect the app's category configs
|
|
285
|
-
// (schemas + read/write rules) without leaving the CLI.
|
|
286
|
-
const categories = metadata
|
|
287
|
-
.command("categories")
|
|
288
|
-
.description("Inspect and delete metadata category definitions (schemas + read/write rules)")
|
|
289
|
-
.addHelpText("after", `
|
|
290
|
-
Category definitions are authored declaratively with 'primitive sync'; 'list'
|
|
291
|
-
and 'get' are read-only inspection. 'delete' removes a definition (admin-gated);
|
|
292
|
-
stored values for the category are NOT deleted — delete values first.
|
|
293
|
-
|
|
294
|
-
Examples:
|
|
295
|
-
$ primitive metadata categories list
|
|
296
|
-
$ primitive metadata categories get user profile
|
|
297
|
-
$ primitive metadata categories delete user profile
|
|
298
|
-
`);
|
|
299
|
-
categories
|
|
300
|
-
.command("list")
|
|
301
|
-
.description("List all metadata category definitions for the app")
|
|
302
|
-
.option("--app <app-id>", "App ID (uses current app if not specified)")
|
|
303
|
-
.option("--json", "Output as JSON")
|
|
304
|
-
.action(async (options) => {
|
|
305
|
-
const resolvedAppId = resolveAppId(undefined, options);
|
|
306
|
-
const client = new ApiClient();
|
|
307
|
-
try {
|
|
308
|
-
const configs = await client.listMetadataCategoryConfigs(resolvedAppId);
|
|
309
|
-
if (options.json) {
|
|
310
|
-
json(configs);
|
|
311
|
-
return;
|
|
312
|
-
}
|
|
313
|
-
if (!configs || configs.length === 0) {
|
|
314
|
-
info("No metadata category definitions.");
|
|
315
|
-
return;
|
|
316
|
-
}
|
|
317
|
-
for (const cfg of configs) {
|
|
318
|
-
divider();
|
|
319
|
-
keyValue("Resource Type", cfg.resourceType);
|
|
320
|
-
keyValue("Category", cfg.category);
|
|
321
|
-
keyValue("Schema Version", String(cfg.schemaVersion ?? "(none)"));
|
|
322
|
-
keyValue("Read Rule", cfg.readRule ?? "(none — default deny)");
|
|
323
|
-
keyValue("Write Rule", cfg.writeRule ?? "(none — default deny)");
|
|
324
|
-
if (cfg.description)
|
|
325
|
-
keyValue("Description", cfg.description);
|
|
326
|
-
}
|
|
327
|
-
}
|
|
328
|
-
catch (err) {
|
|
329
|
-
error(err.message);
|
|
330
|
-
process.exit(1);
|
|
331
|
-
}
|
|
332
|
-
});
|
|
333
|
-
categories
|
|
334
|
-
.command("get")
|
|
335
|
-
.description("Show one metadata category definition")
|
|
336
|
-
.argument("<resource-type>", "Resource type (e.g. user, class)")
|
|
337
|
-
.argument("<category>", "Metadata category")
|
|
338
|
-
.option("--app <app-id>", "App ID (uses current app if not specified)")
|
|
339
|
-
.option("--json", "Output as JSON")
|
|
340
|
-
.action(async (resourceType, category, options) => {
|
|
341
|
-
const resolvedAppId = resolveAppId(undefined, options);
|
|
342
|
-
const client = new ApiClient();
|
|
343
|
-
try {
|
|
344
|
-
const cfg = await client.getMetadataCategoryConfig(resolvedAppId, resourceType, category);
|
|
345
|
-
if (options.json) {
|
|
346
|
-
json(cfg);
|
|
347
|
-
return;
|
|
348
|
-
}
|
|
349
|
-
keyValue("Resource Type", cfg.resourceType);
|
|
350
|
-
keyValue("Category", cfg.category);
|
|
351
|
-
keyValue("Schema Version", String(cfg.schemaVersion ?? "(none)"));
|
|
352
|
-
keyValue("Read Rule", cfg.readRule ?? "(none — default deny)");
|
|
353
|
-
keyValue("Write Rule", cfg.writeRule ?? "(none — default deny)");
|
|
354
|
-
if (cfg.description)
|
|
355
|
-
keyValue("Description", cfg.description);
|
|
356
|
-
keyValue("Schema", JSON.stringify(cfg.schema, null, 2));
|
|
357
|
-
}
|
|
358
|
-
catch (err) {
|
|
359
|
-
error(err.message);
|
|
360
|
-
process.exit(1);
|
|
361
|
-
}
|
|
362
|
-
});
|
|
363
|
-
categories
|
|
364
|
-
.command("delete")
|
|
365
|
-
.description("Delete a metadata category definition (admin-gated). The one configuration verb that survives the TOML-only rule (issue #2645): `sync push --prune` has no server delete surface for this type yet (#1426), so deleting the file cannot retire the category. Orphan semantics: stored values for the category are NOT deleted — delete them first if you need them gone, or they become unreachable.")
|
|
366
|
-
.argument("<resource-type>", "Resource type (e.g. user, class)")
|
|
367
|
-
.argument("<category>", "Metadata category")
|
|
368
|
-
.option("--app <app-id>", "App ID (uses current app if not specified)")
|
|
369
|
-
.option("-y, --yes", "Skip confirmation prompt")
|
|
370
|
-
.option("--json", "Output as JSON")
|
|
371
|
-
.action(async (resourceType, category, options) => {
|
|
372
|
-
const resolvedAppId = resolveAppId(undefined, options);
|
|
373
|
-
if (!options.yes) {
|
|
374
|
-
let confirm;
|
|
375
|
-
try {
|
|
376
|
-
confirm = await confirmPrompt(`Delete metadata category '${resourceType}/${category}'? This cannot be undone. ` +
|
|
377
|
-
"Stored values for this category are NOT deleted and become unreachable — delete them first if you need them gone.");
|
|
378
|
-
}
|
|
379
|
-
catch (err) {
|
|
380
|
-
error(err.message);
|
|
381
|
-
process.exit(1);
|
|
382
|
-
}
|
|
383
|
-
if (!confirm) {
|
|
384
|
-
info("Cancelled.");
|
|
385
|
-
return;
|
|
386
|
-
}
|
|
387
|
-
}
|
|
388
|
-
const client = new ApiClient();
|
|
389
|
-
try {
|
|
390
|
-
const result = await client.deleteMetadataCategoryConfig(resolvedAppId, resourceType, category);
|
|
391
|
-
if (options.json) {
|
|
392
|
-
json(result);
|
|
393
|
-
return;
|
|
394
|
-
}
|
|
395
|
-
success("Metadata category definition deleted.");
|
|
396
|
-
keyValue("Resource Type", result.resourceType);
|
|
397
|
-
keyValue("Category", result.category);
|
|
398
|
-
info("Stored values for this category (if any) were not deleted and are now unreachable — delete values before the category next time.");
|
|
399
|
-
}
|
|
400
|
-
catch (err) {
|
|
401
|
-
error(err.message);
|
|
402
|
-
process.exit(1);
|
|
403
|
-
}
|
|
404
|
-
});
|
|
405
280
|
}
|
|
406
281
|
//# sourceMappingURL=metadata.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metadata.js","sourceRoot":"","sources":["../../../src/commands/metadata.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"metadata.js","sourceRoot":"","sources":["../../../src/commands/metadata.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,12 +1,11 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { basename } from "path";
|
|
3
|
-
import { lookup as mimeLookup } from "mime-types";
|
|
1
|
+
import { writeFileSync } from "fs";
|
|
4
2
|
import { ApiClient } from "../lib/api-client.js";
|
|
5
3
|
import { resolveAppId } from "../lib/config.js";
|
|
6
4
|
import chalk from "chalk";
|
|
7
5
|
import { success, error, info, warn, keyValue, result as printResult, formatTable, formatId, formatDate, formatStatus, formatDuration, json, divider, progress, progressEnd, } from "../lib/output.js";
|
|
8
6
|
import { pollUntil } from "../lib/watch.js";
|
|
9
7
|
import { confirmPrompt } from "../lib/confirm-prompt.js";
|
|
8
|
+
import { formatAccessRuleForDisplay } from "../lib/access-rule-display.js";
|
|
10
9
|
/**
|
|
11
10
|
* Resolve a prompt reference — its server id, or the author-chosen key its
|
|
12
11
|
* TOML file is named for.
|
|
@@ -32,19 +31,19 @@ export function registerPromptsCommands(program) {
|
|
|
32
31
|
.addHelpText("after", `
|
|
33
32
|
Examples:
|
|
34
33
|
$ primitive prompts list
|
|
35
|
-
$ primitive config
|
|
36
|
-
$ primitive
|
|
34
|
+
$ primitive config create prompt summarizer # scaffold prompts/summarizer.toml
|
|
35
|
+
$ primitive config push --only prompt/summarizer # apply it
|
|
37
36
|
$ primitive prompts execute 01HXY... --vars '{"text":"Hello world"}'
|
|
38
|
-
$ primitive prompts configs list summarizer
|
|
37
|
+
$ primitive prompts configs list summarizer # what the server runs
|
|
39
38
|
`);
|
|
40
|
-
// Server-side configuration is authored in TOML and applied with `
|
|
39
|
+
// Server-side configuration is authored in TOML and applied with `config push`
|
|
41
40
|
// (issue #2645) — this group no longer carries config-setting flags.
|
|
42
41
|
prompts.addHelpText("after", `
|
|
43
42
|
Configuration lives in prompts/<key>.toml:
|
|
44
|
-
$ primitive config fields prompt
|
|
45
|
-
$ primitive config
|
|
43
|
+
$ primitive config fields prompt # the file's keys, types and defaults
|
|
44
|
+
$ primitive config create prompt <key> # scaffold one locally
|
|
46
45
|
$ primitive config set prompt/<key> <path>=<value>
|
|
47
|
-
$ primitive
|
|
46
|
+
$ primitive config push --only prompt/<key>
|
|
48
47
|
`);
|
|
49
48
|
// List prompts
|
|
50
49
|
prompts
|
|
@@ -102,6 +101,10 @@ Configuration lives in prompts/<key>.toml:
|
|
|
102
101
|
printResult("Name", result.displayName);
|
|
103
102
|
printResult("Description", result.description);
|
|
104
103
|
printResult("Status", formatStatus(result.status));
|
|
104
|
+
// #2652: no rule means every non-admin execution is denied. Print that
|
|
105
|
+
// in words — a blank or "-" would read as "unrestricted" and hide a
|
|
106
|
+
// prompt that was never given a rule.
|
|
107
|
+
printResult("Access Rule", formatAccessRuleForDisplay(result.accessRule, "prompt"));
|
|
105
108
|
printResult("Active Config", result.activeConfigId || "-");
|
|
106
109
|
if (result.configs && result.configs.length > 0) {
|
|
107
110
|
divider();
|
|
@@ -272,7 +275,7 @@ edit, retire (\`status = "archived"\`) or mark one live (\`active = true\`) in t
|
|
|
272
275
|
file, then apply it:
|
|
273
276
|
|
|
274
277
|
$ primitive config set prompt/<key> prompt.status=active
|
|
275
|
-
$ primitive
|
|
278
|
+
$ primitive config push --only prompt/<key>
|
|
276
279
|
|
|
277
280
|
Duplicating a config is copying its \`[[configs]]\` block and renaming it.
|
|
278
281
|
`);
|
|
@@ -365,11 +368,14 @@ Duplicating a config is copying its \`[[configs]]\` block and renaming it.
|
|
|
365
368
|
// ============================================
|
|
366
369
|
const tests = prompts
|
|
367
370
|
.command("tests")
|
|
368
|
-
.description("
|
|
371
|
+
.description("Run and inspect prompt test cases")
|
|
369
372
|
.addHelpText("after", `
|
|
373
|
+
Test cases are authored in TOML at prompts/<key>.tests/<name>.toml and applied
|
|
374
|
+
with \`primitive config push\` (issue #2769); \`config fields prompt\` lists the
|
|
375
|
+
fields. Deleting a case is removing its file and running \`config push --prune\`.
|
|
376
|
+
|
|
370
377
|
Examples:
|
|
371
378
|
$ primitive prompts tests list <prompt-id>
|
|
372
|
-
$ primitive prompts tests create <prompt-id> --name "Basic test" --vars '{"input":"hello"}'
|
|
373
379
|
$ primitive prompts tests run <prompt-id> <test-case-id>
|
|
374
380
|
$ primitive prompts tests run-all <prompt-id>
|
|
375
381
|
$ primitive prompts tests run-all <prompt-id> --test-cases 01ABC,01DEF,01GHI
|
|
@@ -406,79 +412,6 @@ Examples:
|
|
|
406
412
|
process.exit(1);
|
|
407
413
|
}
|
|
408
414
|
});
|
|
409
|
-
// Create test case
|
|
410
|
-
tests
|
|
411
|
-
.command("create")
|
|
412
|
-
.description("Create a test case for a prompt")
|
|
413
|
-
.argument("<prompt-id>", "Prompt ID")
|
|
414
|
-
.option("--app <app-id>", "App ID (uses current app if not specified)")
|
|
415
|
-
.option("--name <name>", "Test case name (required)")
|
|
416
|
-
.option("--vars <json>", "Input variables as JSON (required)")
|
|
417
|
-
.option("--pattern <regex>", "Expected output pattern (regex)")
|
|
418
|
-
.option("--contains <json>", "Expected strings to contain (JSON array)")
|
|
419
|
-
.option("--json-subset <json>", "Expected JSON subset to match")
|
|
420
|
-
.option("--config <config-id>", "Config ID to use for this test")
|
|
421
|
-
.option("--evaluator-prompt <prompt-id>", "Evaluator prompt ID")
|
|
422
|
-
.option("--evaluator-config <config-id>", "Evaluator config ID")
|
|
423
|
-
.option("--json", "Output as JSON")
|
|
424
|
-
.action(async (promptId, options) => {
|
|
425
|
-
const resolvedAppId = resolveAppId(undefined, options);
|
|
426
|
-
if (!options.name || !options.vars) {
|
|
427
|
-
error("Required: --name and --vars");
|
|
428
|
-
process.exit(1);
|
|
429
|
-
}
|
|
430
|
-
let inputVariables;
|
|
431
|
-
try {
|
|
432
|
-
inputVariables = JSON.parse(options.vars);
|
|
433
|
-
}
|
|
434
|
-
catch {
|
|
435
|
-
error("Invalid JSON in --vars");
|
|
436
|
-
process.exit(1);
|
|
437
|
-
}
|
|
438
|
-
let expectedOutputContains;
|
|
439
|
-
if (options.contains) {
|
|
440
|
-
try {
|
|
441
|
-
expectedOutputContains = JSON.parse(options.contains);
|
|
442
|
-
}
|
|
443
|
-
catch {
|
|
444
|
-
error("Invalid JSON in --contains");
|
|
445
|
-
process.exit(1);
|
|
446
|
-
}
|
|
447
|
-
}
|
|
448
|
-
let expectedJsonSubset;
|
|
449
|
-
if (options.jsonSubset) {
|
|
450
|
-
try {
|
|
451
|
-
expectedJsonSubset = JSON.parse(options.jsonSubset);
|
|
452
|
-
}
|
|
453
|
-
catch {
|
|
454
|
-
error("Invalid JSON in --json-subset");
|
|
455
|
-
process.exit(1);
|
|
456
|
-
}
|
|
457
|
-
}
|
|
458
|
-
const client = new ApiClient();
|
|
459
|
-
try {
|
|
460
|
-
const result = await client.createTestCase(resolvedAppId, "prompt", promptId, {
|
|
461
|
-
name: options.name,
|
|
462
|
-
inputVariables,
|
|
463
|
-
expectedOutputPattern: options.pattern,
|
|
464
|
-
expectedOutputContains,
|
|
465
|
-
expectedJsonSubset,
|
|
466
|
-
configId: options.config,
|
|
467
|
-
evaluatorPromptId: options.evaluatorPrompt,
|
|
468
|
-
evaluatorConfigId: options.evaluatorConfig,
|
|
469
|
-
});
|
|
470
|
-
if (options.json) {
|
|
471
|
-
json(result);
|
|
472
|
-
return;
|
|
473
|
-
}
|
|
474
|
-
success(`Test case created: ${result.name}`);
|
|
475
|
-
keyValue("Test Case ID", result.testCaseId);
|
|
476
|
-
}
|
|
477
|
-
catch (err) {
|
|
478
|
-
error(err.message);
|
|
479
|
-
process.exit(1);
|
|
480
|
-
}
|
|
481
|
-
});
|
|
482
415
|
// Get test case
|
|
483
416
|
tests
|
|
484
417
|
.command("get")
|
|
@@ -544,121 +477,6 @@ Examples:
|
|
|
544
477
|
process.exit(1);
|
|
545
478
|
}
|
|
546
479
|
});
|
|
547
|
-
// Update test case
|
|
548
|
-
tests
|
|
549
|
-
.command("update")
|
|
550
|
-
.description("Update a test case")
|
|
551
|
-
.argument("<prompt-id>", "Prompt ID")
|
|
552
|
-
.argument("<test-case-id>", "Test Case ID")
|
|
553
|
-
.option("--app <app-id>", "App ID (uses current app if not specified)")
|
|
554
|
-
.option("--name <name>", "Test case name")
|
|
555
|
-
.option("--vars <json>", "Input variables as JSON")
|
|
556
|
-
.option("--pattern <regex>", "Expected output pattern (regex)")
|
|
557
|
-
.option("--contains <json>", "Expected strings to contain (JSON array)")
|
|
558
|
-
.option("--json-subset <json>", "Expected JSON subset to match")
|
|
559
|
-
.option("--config <config-id>", "Config ID to use for this test")
|
|
560
|
-
.option("--clear-pattern", "Clear expected pattern")
|
|
561
|
-
.option("--clear-contains", "Clear expected contains")
|
|
562
|
-
.option("--clear-json-subset", "Clear expected JSON subset")
|
|
563
|
-
.option("--json", "Output as JSON")
|
|
564
|
-
.action(async (promptId, testCaseId, options) => {
|
|
565
|
-
const resolvedAppId = resolveAppId(undefined, options);
|
|
566
|
-
const payload = {};
|
|
567
|
-
if (options.name)
|
|
568
|
-
payload.name = options.name;
|
|
569
|
-
if (options.vars) {
|
|
570
|
-
try {
|
|
571
|
-
payload.inputVariables = JSON.parse(options.vars);
|
|
572
|
-
}
|
|
573
|
-
catch {
|
|
574
|
-
error("Invalid JSON in --vars");
|
|
575
|
-
process.exit(1);
|
|
576
|
-
}
|
|
577
|
-
}
|
|
578
|
-
if (options.clearPattern) {
|
|
579
|
-
payload.expectedOutputPattern = null;
|
|
580
|
-
}
|
|
581
|
-
else if (options.pattern) {
|
|
582
|
-
payload.expectedOutputPattern = options.pattern;
|
|
583
|
-
}
|
|
584
|
-
if (options.clearContains) {
|
|
585
|
-
payload.expectedOutputContains = null;
|
|
586
|
-
}
|
|
587
|
-
else if (options.contains) {
|
|
588
|
-
try {
|
|
589
|
-
payload.expectedOutputContains = JSON.parse(options.contains);
|
|
590
|
-
}
|
|
591
|
-
catch {
|
|
592
|
-
error("Invalid JSON in --contains");
|
|
593
|
-
process.exit(1);
|
|
594
|
-
}
|
|
595
|
-
}
|
|
596
|
-
if (options.clearJsonSubset) {
|
|
597
|
-
payload.expectedJsonSubset = null;
|
|
598
|
-
}
|
|
599
|
-
else if (options.jsonSubset) {
|
|
600
|
-
try {
|
|
601
|
-
payload.expectedJsonSubset = JSON.parse(options.jsonSubset);
|
|
602
|
-
}
|
|
603
|
-
catch {
|
|
604
|
-
error("Invalid JSON in --json-subset");
|
|
605
|
-
process.exit(1);
|
|
606
|
-
}
|
|
607
|
-
}
|
|
608
|
-
if (options.config)
|
|
609
|
-
payload.configId = options.config;
|
|
610
|
-
if (Object.keys(payload).length === 0) {
|
|
611
|
-
error("No update options specified.");
|
|
612
|
-
process.exit(1);
|
|
613
|
-
}
|
|
614
|
-
const client = new ApiClient();
|
|
615
|
-
try {
|
|
616
|
-
const result = await client.updateTestCase(resolvedAppId, "prompt", promptId, testCaseId, payload);
|
|
617
|
-
if (options.json) {
|
|
618
|
-
json(result);
|
|
619
|
-
return;
|
|
620
|
-
}
|
|
621
|
-
success("Test case updated.");
|
|
622
|
-
}
|
|
623
|
-
catch (err) {
|
|
624
|
-
error(err.message);
|
|
625
|
-
process.exit(1);
|
|
626
|
-
}
|
|
627
|
-
});
|
|
628
|
-
// Delete test case
|
|
629
|
-
tests
|
|
630
|
-
.command("delete")
|
|
631
|
-
.description("Delete a test case")
|
|
632
|
-
.argument("<prompt-id>", "Prompt ID")
|
|
633
|
-
.argument("<test-case-id>", "Test Case ID")
|
|
634
|
-
.option("--app <app-id>", "App ID (uses current app if not specified)")
|
|
635
|
-
.option("-y, --yes", "Skip confirmation prompt")
|
|
636
|
-
.action(async (promptId, testCaseId, options) => {
|
|
637
|
-
const resolvedAppId = resolveAppId(undefined, options);
|
|
638
|
-
if (!options.yes) {
|
|
639
|
-
let confirm;
|
|
640
|
-
try {
|
|
641
|
-
confirm = await confirmPrompt(`Are you sure you want to delete test case ${testCaseId}?`);
|
|
642
|
-
}
|
|
643
|
-
catch (err) {
|
|
644
|
-
error(err.message);
|
|
645
|
-
process.exit(1);
|
|
646
|
-
}
|
|
647
|
-
if (!confirm) {
|
|
648
|
-
info("Cancelled.");
|
|
649
|
-
return;
|
|
650
|
-
}
|
|
651
|
-
}
|
|
652
|
-
const client = new ApiClient();
|
|
653
|
-
try {
|
|
654
|
-
await client.deleteTestCase(resolvedAppId, "prompt", promptId, testCaseId);
|
|
655
|
-
success("Test case deleted.");
|
|
656
|
-
}
|
|
657
|
-
catch (err) {
|
|
658
|
-
error(err.message);
|
|
659
|
-
process.exit(1);
|
|
660
|
-
}
|
|
661
|
-
});
|
|
662
480
|
// Run a single test case
|
|
663
481
|
tests
|
|
664
482
|
.command("run")
|
|
@@ -1025,13 +843,15 @@ Examples:
|
|
|
1025
843
|
// ============================================
|
|
1026
844
|
const attachments = tests
|
|
1027
845
|
.command("attachments")
|
|
1028
|
-
.description("
|
|
846
|
+
.description("Inspect test case file attachments")
|
|
1029
847
|
.addHelpText("after", `
|
|
848
|
+
Attachments are authored as files in prompts/<key>.tests/<name>/ and applied
|
|
849
|
+
with \`primitive config push\` (#2769); removing one and running
|
|
850
|
+
\`config push --prune\` deletes it server-side. These verbs read server state.
|
|
851
|
+
|
|
1030
852
|
Examples:
|
|
1031
853
|
$ primitive prompts tests attachments list <prompt-id> <test-case-id>
|
|
1032
|
-
$ primitive prompts tests attachments upload <prompt-id> <test-case-id> ./document.pdf
|
|
1033
854
|
$ primitive prompts tests attachments download <prompt-id> <test-case-id> document.pdf
|
|
1034
|
-
$ primitive prompts tests attachments delete <prompt-id> <test-case-id> document.pdf
|
|
1035
855
|
`);
|
|
1036
856
|
// List attachments
|
|
1037
857
|
attachments
|
|
@@ -1069,49 +889,6 @@ Examples:
|
|
|
1069
889
|
process.exit(1);
|
|
1070
890
|
}
|
|
1071
891
|
});
|
|
1072
|
-
// Upload attachment
|
|
1073
|
-
attachments
|
|
1074
|
-
.command("upload")
|
|
1075
|
-
.description("Upload a file attachment to a test case")
|
|
1076
|
-
.argument("<prompt-id>", "Prompt ID")
|
|
1077
|
-
.argument("<test-case-id>", "Test Case ID")
|
|
1078
|
-
.argument("<file-path>", "Path to the file to upload")
|
|
1079
|
-
.option("--app <app-id>", "App ID (uses current app if not specified)")
|
|
1080
|
-
.option("--name <name>", "Override the filename")
|
|
1081
|
-
.option("--json", "Output as JSON")
|
|
1082
|
-
.action(async (promptId, testCaseId, filePath, options) => {
|
|
1083
|
-
const resolvedAppId = resolveAppId(undefined, options);
|
|
1084
|
-
const client = new ApiClient();
|
|
1085
|
-
try {
|
|
1086
|
-
// Check file exists and get stats
|
|
1087
|
-
const stats = statSync(filePath);
|
|
1088
|
-
if (!stats.isFile()) {
|
|
1089
|
-
error(`Not a file: ${filePath}`);
|
|
1090
|
-
process.exit(1);
|
|
1091
|
-
}
|
|
1092
|
-
// Check file size (10 MB limit)
|
|
1093
|
-
const TEN_MB = 10 * 1024 * 1024;
|
|
1094
|
-
if (stats.size > TEN_MB) {
|
|
1095
|
-
error(`File too large (max 10MB): ${formatFileSize(stats.size)}`);
|
|
1096
|
-
process.exit(1);
|
|
1097
|
-
}
|
|
1098
|
-
const filename = options.name || basename(filePath);
|
|
1099
|
-
const data = readFileSync(filePath);
|
|
1100
|
-
const contentType = mimeLookup(filePath) || "application/octet-stream";
|
|
1101
|
-
const result = await client.uploadTestCaseAttachment(resolvedAppId, "prompt", promptId, testCaseId, filename, data, contentType);
|
|
1102
|
-
if (options.json) {
|
|
1103
|
-
json(result);
|
|
1104
|
-
return;
|
|
1105
|
-
}
|
|
1106
|
-
success(`Uploaded: ${filename}`);
|
|
1107
|
-
keyValue("Size", formatFileSize(result.attachment.size));
|
|
1108
|
-
keyValue("Type", result.attachment.contentType);
|
|
1109
|
-
}
|
|
1110
|
-
catch (err) {
|
|
1111
|
-
error(err.message);
|
|
1112
|
-
process.exit(1);
|
|
1113
|
-
}
|
|
1114
|
-
});
|
|
1115
892
|
// Download attachment
|
|
1116
893
|
attachments
|
|
1117
894
|
.command("download")
|
|
@@ -1137,41 +914,6 @@ Examples:
|
|
|
1137
914
|
process.exit(1);
|
|
1138
915
|
}
|
|
1139
916
|
});
|
|
1140
|
-
// Delete attachment
|
|
1141
|
-
attachments
|
|
1142
|
-
.command("delete")
|
|
1143
|
-
.description("Delete a file attachment from a test case")
|
|
1144
|
-
.argument("<prompt-id>", "Prompt ID")
|
|
1145
|
-
.argument("<test-case-id>", "Test Case ID")
|
|
1146
|
-
.argument("<filename>", "Name of the file to delete")
|
|
1147
|
-
.option("--app <app-id>", "App ID (uses current app if not specified)")
|
|
1148
|
-
.option("-y, --yes", "Skip confirmation prompt")
|
|
1149
|
-
.action(async (promptId, testCaseId, filename, options) => {
|
|
1150
|
-
const resolvedAppId = resolveAppId(undefined, options);
|
|
1151
|
-
if (!options.yes) {
|
|
1152
|
-
let confirm;
|
|
1153
|
-
try {
|
|
1154
|
-
confirm = await confirmPrompt(`Are you sure you want to delete attachment "${filename}"?`);
|
|
1155
|
-
}
|
|
1156
|
-
catch (err) {
|
|
1157
|
-
error(err.message);
|
|
1158
|
-
process.exit(1);
|
|
1159
|
-
}
|
|
1160
|
-
if (!confirm) {
|
|
1161
|
-
info("Cancelled.");
|
|
1162
|
-
return;
|
|
1163
|
-
}
|
|
1164
|
-
}
|
|
1165
|
-
const client = new ApiClient();
|
|
1166
|
-
try {
|
|
1167
|
-
await client.deleteTestCaseAttachment(resolvedAppId, "prompt", promptId, testCaseId, filename);
|
|
1168
|
-
success(`Deleted: ${filename}`);
|
|
1169
|
-
}
|
|
1170
|
-
catch (err) {
|
|
1171
|
-
error(err.message);
|
|
1172
|
-
process.exit(1);
|
|
1173
|
-
}
|
|
1174
|
-
});
|
|
1175
917
|
}
|
|
1176
918
|
function formatFileSize(bytes) {
|
|
1177
919
|
if (bytes < 1024)
|