primitive-admin 1.0.62 → 1.0.64
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 +132 -42
- package/assets/skill/skills/primitive-platform/SKILL.md +142 -661
- package/dist/bin/primitive.js +121 -41
- package/dist/bin/primitive.js.map +1 -1
- package/dist/src/commands/admins.js +37 -50
- package/dist/src/commands/admins.js.map +1 -1
- package/dist/src/commands/analytics.js +178 -9
- package/dist/src/commands/analytics.js.map +1 -1
- package/dist/src/commands/apps.js +17 -7
- package/dist/src/commands/apps.js.map +1 -1
- package/dist/src/commands/auth-sessions.d.ts +7 -0
- package/dist/src/commands/auth-sessions.js +144 -0
- package/dist/src/commands/auth-sessions.js.map +1 -0
- package/dist/src/commands/auth.js +76 -116
- package/dist/src/commands/auth.js.map +1 -1
- package/dist/src/commands/blob-buckets.js +2 -1
- package/dist/src/commands/blob-buckets.js.map +1 -1
- package/dist/src/commands/catalog.js +26 -10
- package/dist/src/commands/catalog.js.map +1 -1
- package/dist/src/commands/collection-type-configs.js +3 -10
- package/dist/src/commands/collection-type-configs.js.map +1 -1
- package/dist/src/commands/collections.js +736 -19
- package/dist/src/commands/collections.js.map +1 -1
- package/dist/src/commands/config.js +13 -27
- package/dist/src/commands/config.js.map +1 -1
- package/dist/src/commands/connections.js +8 -9
- package/dist/src/commands/connections.js.map +1 -1
- package/dist/src/commands/cron-triggers.js +2 -1
- package/dist/src/commands/cron-triggers.js.map +1 -1
- package/dist/src/commands/database-type-configs.js +5 -12
- package/dist/src/commands/database-type-configs.js.map +1 -1
- package/dist/src/commands/databases.js +59 -72
- package/dist/src/commands/databases.js.map +1 -1
- package/dist/src/commands/documents.d.ts +58 -0
- package/dist/src/commands/documents.js +1623 -95
- package/dist/src/commands/documents.js.map +1 -1
- package/dist/src/commands/email-templates.js +5 -4
- package/dist/src/commands/email-templates.js.map +1 -1
- package/dist/src/commands/env.d.ts +1 -1
- package/dist/src/commands/env.js +106 -44
- package/dist/src/commands/env.js.map +1 -1
- package/dist/src/commands/feature-flags.js +2 -1
- package/dist/src/commands/feature-flags.js.map +1 -1
- package/dist/src/commands/functions.d.ts +20 -0
- package/dist/src/commands/functions.js +1630 -0
- package/dist/src/commands/functions.js.map +1 -0
- package/dist/src/commands/group-type-configs.js +2 -1
- package/dist/src/commands/group-type-configs.js.map +1 -1
- package/dist/src/commands/groups.js +30 -17
- package/dist/src/commands/groups.js.map +1 -1
- package/dist/src/commands/guides.js +17 -11
- package/dist/src/commands/guides.js.map +1 -1
- package/dist/src/commands/init.d.ts +24 -12
- package/dist/src/commands/init.js +198 -110
- package/dist/src/commands/init.js.map +1 -1
- package/dist/src/commands/integrations.js +65 -26
- package/dist/src/commands/integrations.js.map +1 -1
- package/dist/src/commands/locks.js +17 -2
- package/dist/src/commands/locks.js.map +1 -1
- package/dist/src/commands/metadata-category-configs.js +2 -1
- package/dist/src/commands/metadata-category-configs.js.map +1 -1
- package/dist/src/commands/metadata.js +8 -1
- package/dist/src/commands/metadata.js.map +1 -1
- package/dist/src/commands/prompts.js +106 -59
- package/dist/src/commands/prompts.js.map +1 -1
- package/dist/src/commands/rule-sets.js +3 -10
- package/dist/src/commands/rule-sets.js.map +1 -1
- package/dist/src/commands/scripts.d.ts +10 -0
- package/dist/src/commands/scripts.js +159 -25
- package/dist/src/commands/scripts.js.map +1 -1
- package/dist/src/commands/secrets.js +2 -1
- package/dist/src/commands/secrets.js.map +1 -1
- package/dist/src/commands/sessions.js +10 -9
- package/dist/src/commands/sessions.js.map +1 -1
- package/dist/src/commands/sync-app-settings.js +3 -5
- package/dist/src/commands/sync-app-settings.js.map +1 -1
- package/dist/src/commands/sync.d.ts +391 -44
- package/dist/src/commands/sync.js +2622 -534
- package/dist/src/commands/sync.js.map +1 -1
- package/dist/src/commands/tokens.js +2 -1
- package/dist/src/commands/tokens.js.map +1 -1
- package/dist/src/commands/users.js +19 -10
- package/dist/src/commands/users.js.map +1 -1
- package/dist/src/commands/vars.js +2 -1
- package/dist/src/commands/vars.js.map +1 -1
- package/dist/src/commands/waitlist.js +2 -1
- package/dist/src/commands/waitlist.js.map +1 -1
- package/dist/src/commands/webhooks.d.ts +29 -0
- package/dist/src/commands/webhooks.js +135 -64
- package/dist/src/commands/webhooks.js.map +1 -1
- package/dist/src/commands/workflows.d.ts +1 -29
- package/dist/src/commands/workflows.js +113 -179
- package/dist/src/commands/workflows.js.map +1 -1
- package/dist/src/lib/api-client.d.ts +628 -14
- package/dist/src/lib/api-client.js +776 -70
- package/dist/src/lib/api-client.js.map +1 -1
- package/dist/src/lib/app-settings-descriptor.d.ts +1 -1
- package/dist/src/lib/app-settings-descriptor.js +9 -1
- package/dist/src/lib/app-settings-descriptor.js.map +1 -1
- package/dist/src/lib/block-selector.d.ts +58 -0
- package/dist/src/lib/block-selector.js +92 -0
- package/dist/src/lib/block-selector.js.map +1 -0
- package/dist/src/lib/codegen-shared/resolveCodegenSourceDir.d.ts +24 -54
- package/dist/src/lib/codegen-shared/resolveCodegenSourceDir.js +31 -153
- package/dist/src/lib/codegen-shared/resolveCodegenSourceDir.js.map +1 -1
- package/dist/src/lib/collection-export.d.ts +184 -0
- package/dist/src/lib/collection-export.js +252 -0
- package/dist/src/lib/collection-export.js.map +1 -0
- package/dist/src/lib/config-json-field.d.ts +28 -0
- package/dist/src/lib/config-json-field.js +56 -0
- package/dist/src/lib/config-json-field.js.map +1 -0
- package/dist/src/lib/config-object-descriptor.js +88 -6
- package/dist/src/lib/config-object-descriptor.js.map +1 -1
- package/dist/src/lib/config-payload.d.ts +8 -1
- package/dist/src/lib/config-payload.js +49 -4
- package/dist/src/lib/config-payload.js.map +1 -1
- package/dist/src/lib/config-surface.d.ts +12 -1
- package/dist/src/lib/config-surface.js +71 -3
- package/dist/src/lib/config-surface.js.map +1 -1
- package/dist/src/lib/config.d.ts +31 -13
- package/dist/src/lib/config.js +34 -70
- package/dist/src/lib/config.js.map +1 -1
- package/dist/src/lib/credentials-store.d.ts +37 -22
- package/dist/src/lib/credentials-store.js +103 -97
- package/dist/src/lib/credentials-store.js.map +1 -1
- package/dist/src/lib/db-codegen/dbTypeIR.js +8 -0
- package/dist/src/lib/db-codegen/dbTypeIR.js.map +1 -1
- package/dist/src/lib/deprecation.d.ts +22 -0
- package/dist/src/lib/deprecation.js +43 -0
- package/dist/src/lib/deprecation.js.map +1 -0
- package/dist/src/lib/document-export-permissions.d.ts +30 -0
- package/dist/src/lib/document-export-permissions.js +54 -0
- package/dist/src/lib/document-export-permissions.js.map +1 -0
- package/dist/src/lib/document-ingest-artifact.d.ts +120 -0
- package/dist/src/lib/document-ingest-artifact.js +505 -0
- package/dist/src/lib/document-ingest-artifact.js.map +1 -0
- package/dist/src/lib/document-ingest-input.d.ts +51 -0
- package/dist/src/lib/document-ingest-input.js +132 -0
- package/dist/src/lib/document-ingest-input.js.map +1 -0
- package/dist/src/lib/document-ingest-rows.d.ts +137 -0
- package/dist/src/lib/document-ingest-rows.js +181 -0
- package/dist/src/lib/document-ingest-rows.js.map +1 -0
- package/dist/src/lib/document-ingest.d.ts +101 -0
- package/dist/src/lib/document-ingest.js +384 -0
- package/dist/src/lib/document-ingest.js.map +1 -0
- package/dist/src/lib/env-resolver-core.d.ts +128 -17
- package/dist/src/lib/env-resolver-core.js +204 -22
- package/dist/src/lib/env-resolver-core.js.map +1 -1
- package/dist/src/lib/env-resolver.d.ts +18 -3
- package/dist/src/lib/env-resolver.js +23 -3
- package/dist/src/lib/env-resolver.js.map +1 -1
- package/dist/src/lib/function-bundle.d.ts +147 -0
- package/dist/src/lib/function-bundle.js +341 -0
- package/dist/src/lib/function-bundle.js.map +1 -0
- package/dist/src/lib/function-collect.d.ts +123 -0
- package/dist/src/lib/function-collect.js +610 -0
- package/dist/src/lib/function-collect.js.map +1 -0
- package/dist/src/lib/function-db-types.d.ts +202 -0
- package/dist/src/lib/function-db-types.js +870 -0
- package/dist/src/lib/function-db-types.js.map +1 -0
- package/dist/src/lib/function-document-types.d.ts +144 -0
- package/dist/src/lib/function-document-types.js +370 -0
- package/dist/src/lib/function-document-types.js.map +1 -0
- package/dist/src/lib/function-grants-preflight.d.ts +64 -0
- package/dist/src/lib/function-grants-preflight.js +105 -0
- package/dist/src/lib/function-grants-preflight.js.map +1 -0
- package/dist/src/lib/function-log-lines.d.ts +76 -0
- package/dist/src/lib/function-log-lines.js +160 -0
- package/dist/src/lib/function-log-lines.js.map +1 -0
- package/dist/src/lib/function-log-row.d.ts +29 -0
- package/dist/src/lib/function-log-row.js +73 -0
- package/dist/src/lib/function-log-row.js.map +1 -0
- package/dist/src/lib/function-log-tail.d.ts +132 -0
- package/dist/src/lib/function-log-tail.js +262 -0
- package/dist/src/lib/function-log-tail.js.map +1 -0
- package/dist/src/lib/function-run.d.ts +289 -0
- package/dist/src/lib/function-run.js +389 -0
- package/dist/src/lib/function-run.js.map +1 -0
- package/dist/src/lib/function-schema-codegen.d.ts +143 -0
- package/dist/src/lib/function-schema-codegen.js +420 -0
- package/dist/src/lib/function-schema-codegen.js.map +1 -0
- package/dist/src/lib/function-sync.d.ts +459 -0
- package/dist/src/lib/function-sync.js +1258 -0
- package/dist/src/lib/function-sync.js.map +1 -0
- package/dist/src/lib/function-trigger-listing.d.ts +27 -0
- package/dist/src/lib/function-trigger-listing.js +70 -0
- package/dist/src/lib/function-trigger-listing.js.map +1 -0
- package/dist/src/lib/function-typecheck.d.ts +86 -0
- package/dist/src/lib/function-typecheck.js +370 -0
- package/dist/src/lib/function-typecheck.js.map +1 -0
- package/dist/src/lib/function-versions.d.ts +122 -0
- package/dist/src/lib/function-versions.js +182 -0
- package/dist/src/lib/function-versions.js.map +1 -0
- package/dist/src/lib/generated-allowlist.js +4 -0
- package/dist/src/lib/generated-allowlist.js.map +1 -1
- package/dist/src/lib/generated-config-surfaces.d.ts +2332 -78
- package/dist/src/lib/generated-config-surfaces.js +6979 -468
- package/dist/src/lib/generated-config-surfaces.js.map +1 -1
- package/dist/src/lib/generated-sdk-types.d.ts +12 -0
- package/dist/src/lib/generated-sdk-types.js +13 -0
- package/dist/src/lib/generated-sdk-types.js.map +1 -0
- package/dist/src/lib/init-adopt.js +2 -2
- package/dist/src/lib/init-adopt.js.map +1 -1
- package/dist/src/lib/init-assets.js +3 -3
- package/dist/src/lib/init-client-platforms.d.ts +14 -0
- package/dist/src/lib/init-client-platforms.js +71 -0
- package/dist/src/lib/init-client-platforms.js.map +1 -0
- package/dist/src/lib/init-config.d.ts +1 -1
- package/dist/src/lib/init-email-redirect-uris.d.ts +37 -0
- package/dist/src/lib/init-email-redirect-uris.js +46 -0
- package/dist/src/lib/init-email-redirect-uris.js.map +1 -0
- package/dist/src/lib/init-ios-links.d.ts +41 -0
- package/dist/src/lib/init-ios-links.js +67 -1
- package/dist/src/lib/init-ios-links.js.map +1 -1
- package/dist/src/lib/init-plan.d.ts +1 -1
- package/dist/src/lib/init-plan.js +1 -1
- package/dist/src/lib/init-xcode.d.ts +6 -5
- package/dist/src/lib/init-xcode.js +34 -10
- package/dist/src/lib/init-xcode.js.map +1 -1
- package/dist/src/lib/integration-selector.d.ts +42 -0
- package/dist/src/lib/integration-selector.js +46 -0
- package/dist/src/lib/integration-selector.js.map +1 -0
- package/dist/src/lib/ios-app-id.d.ts +34 -0
- package/dist/src/lib/ios-app-id.js +69 -0
- package/dist/src/lib/ios-app-id.js.map +1 -0
- package/dist/src/lib/list-options.d.ts +68 -0
- package/dist/src/lib/list-options.js +89 -0
- package/dist/src/lib/list-options.js.map +1 -0
- package/dist/src/lib/local-state.d.ts +1 -1
- package/dist/src/lib/local-state.js +1 -1
- package/dist/src/lib/local-test-cases.d.ts +63 -0
- package/dist/src/lib/local-test-cases.js +136 -0
- package/dist/src/lib/local-test-cases.js.map +1 -0
- package/dist/src/lib/log-inspection.d.ts +152 -5
- package/dist/src/lib/log-inspection.js +179 -2
- package/dist/src/lib/log-inspection.js.map +1 -1
- package/dist/src/lib/logout-admin-session.d.ts +33 -0
- package/dist/src/lib/logout-admin-session.js +70 -0
- package/dist/src/lib/logout-admin-session.js.map +1 -0
- package/dist/src/lib/output.d.ts +15 -0
- package/dist/src/lib/output.js +28 -0
- package/dist/src/lib/output.js.map +1 -1
- package/dist/src/lib/paginate.d.ts +15 -0
- package/dist/src/lib/paginate.js +17 -0
- package/dist/src/lib/paginate.js.map +1 -1
- package/dist/src/lib/project-config.d.ts +46 -21
- package/dist/src/lib/project-config.js +74 -47
- package/dist/src/lib/project-config.js.map +1 -1
- package/dist/src/lib/prompt-cost-format.d.ts +11 -0
- package/dist/src/lib/prompt-cost-format.js +41 -0
- package/dist/src/lib/prompt-cost-format.js.map +1 -0
- package/dist/src/lib/prompt-schema-codegen.d.ts +147 -0
- package/dist/src/lib/prompt-schema-codegen.js +462 -0
- package/dist/src/lib/prompt-schema-codegen.js.map +1 -0
- package/dist/src/lib/refresh-admin-credentials.d.ts +9 -1
- package/dist/src/lib/refresh-admin-credentials.js +22 -2
- package/dist/src/lib/refresh-admin-credentials.js.map +1 -1
- package/dist/src/lib/resolve-owner.d.ts +19 -0
- package/dist/src/lib/resolve-owner.js +20 -0
- package/dist/src/lib/resolve-owner.js.map +1 -0
- package/dist/src/lib/skill-installer.d.ts +49 -3
- package/dist/src/lib/skill-installer.js +275 -100
- package/dist/src/lib/skill-installer.js.map +1 -1
- package/dist/src/lib/snapshot-audit-source.d.ts +45 -0
- package/dist/src/lib/snapshot-audit-source.js +58 -0
- package/dist/src/lib/snapshot-audit-source.js.map +1 -0
- package/dist/src/lib/snapshot-audit-store.d.ts +52 -0
- package/dist/src/lib/snapshot-audit-store.js +196 -0
- package/dist/src/lib/snapshot-audit-store.js.map +1 -0
- package/dist/src/lib/snapshot-audit.d.ts +207 -0
- package/dist/src/lib/snapshot-audit.js +431 -0
- package/dist/src/lib/snapshot-audit.js.map +1 -0
- package/dist/src/lib/snapshot-build-rows.d.ts +60 -0
- package/dist/src/lib/snapshot-build-rows.js +87 -0
- package/dist/src/lib/snapshot-build-rows.js.map +1 -0
- package/dist/src/lib/snapshot-build.d.ts +50 -0
- package/dist/src/lib/snapshot-build.js +111 -0
- package/dist/src/lib/snapshot-build.js.map +1 -0
- package/dist/src/lib/snapshot-manifest-layout.d.ts +61 -0
- package/dist/src/lib/snapshot-manifest-layout.js +70 -0
- package/dist/src/lib/snapshot-manifest-layout.js.map +1 -0
- package/dist/src/lib/snapshots.d.ts +8 -9
- package/dist/src/lib/snapshots.js +20 -83
- package/dist/src/lib/snapshots.js.map +1 -1
- package/dist/src/lib/step-run-table.d.ts +43 -0
- package/dist/src/lib/step-run-table.js +129 -0
- package/dist/src/lib/step-run-table.js.map +1 -0
- package/dist/src/lib/storage-pending-retry.d.ts +26 -0
- package/dist/src/lib/storage-pending-retry.js +42 -0
- package/dist/src/lib/storage-pending-retry.js.map +1 -0
- package/dist/src/lib/swift-codegen/agentGenerator.d.ts +42 -0
- package/dist/src/lib/swift-codegen/agentGenerator.js +118 -0
- package/dist/src/lib/swift-codegen/agentGenerator.js.map +1 -0
- package/dist/src/lib/swift-codegen/banners.d.ts +24 -0
- package/dist/src/lib/swift-codegen/banners.js +25 -0
- package/dist/src/lib/swift-codegen/banners.js.map +1 -0
- package/dist/src/lib/swift-codegen/dbGenerator.js +19 -7
- package/dist/src/lib/swift-codegen/dbGenerator.js.map +1 -1
- package/dist/src/lib/swift-codegen/functionGenerator.d.ts +139 -0
- package/dist/src/lib/swift-codegen/functionGenerator.js +462 -0
- package/dist/src/lib/swift-codegen/functionGenerator.js.map +1 -0
- package/dist/src/lib/swift-codegen/generator.d.ts +7 -1
- package/dist/src/lib/swift-codegen/generator.js +28 -11
- package/dist/src/lib/swift-codegen/generator.js.map +1 -1
- package/dist/src/lib/swift-codegen/schemaToSwift.d.ts +15 -0
- package/dist/src/lib/swift-codegen/schemaToSwift.js +21 -4
- package/dist/src/lib/swift-codegen/schemaToSwift.js.map +1 -1
- package/dist/src/lib/sync-paths.d.ts +72 -55
- package/dist/src/lib/sync-paths.js +97 -100
- package/dist/src/lib/sync-paths.js.map +1 -1
- package/dist/src/lib/sync-resource-types.d.ts +23 -4
- package/dist/src/lib/sync-resource-types.js +106 -8
- package/dist/src/lib/sync-resource-types.js.map +1 -1
- package/dist/src/lib/sync-selectors.d.ts +45 -2
- package/dist/src/lib/sync-selectors.js +66 -5
- package/dist/src/lib/sync-selectors.js.map +1 -1
- package/dist/src/lib/template.d.ts +2 -2
- package/dist/src/lib/template.js +2 -2
- package/dist/src/lib/test-case-file-names.d.ts +40 -0
- package/dist/src/lib/test-case-file-names.js +91 -0
- package/dist/src/lib/test-case-file-names.js.map +1 -0
- package/dist/src/lib/test-case-keys.d.ts +1 -1
- package/dist/src/lib/test-case-keys.js +1 -1
- package/dist/src/lib/test-case-variables.d.ts +14 -0
- package/dist/src/lib/test-case-variables.js +42 -0
- package/dist/src/lib/test-case-variables.js.map +1 -1
- package/dist/src/lib/toml-database-config.js +19 -2
- package/dist/src/lib/toml-database-config.js.map +1 -1
- package/dist/src/lib/web-url.d.ts +40 -0
- package/dist/src/lib/web-url.js +76 -0
- package/dist/src/lib/web-url.js.map +1 -0
- package/dist/src/lib/webhook-deliver.d.ts +209 -0
- package/dist/src/lib/webhook-deliver.js +519 -0
- package/dist/src/lib/webhook-deliver.js.map +1 -0
- package/dist/src/lib/workflow-codegen/generator.d.ts +1 -1
- package/dist/src/lib/workflow-codegen/generator.js +1 -1
- package/dist/src/lib/workflow-toml-validator.d.ts +17 -8
- package/dist/src/lib/workflow-toml-validator.js +25 -12
- package/dist/src/lib/workflow-toml-validator.js.map +1 -1
- package/dist/src/lib/workflow-usage.d.ts +196 -0
- package/dist/src/lib/workflow-usage.js +310 -0
- package/dist/src/lib/workflow-usage.js.map +1 -0
- package/dist/src/types/index.d.ts +12 -2
- package/package.json +5 -4
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { ApiClient } from "../lib/api-client.js";
|
|
2
2
|
import { resolveAppId } from "../lib/config.js";
|
|
3
3
|
import { success, error, info, keyValue, formatTable, formatDate, json, } from "../lib/output.js";
|
|
4
|
+
import { wholeListEnvelope } from "../lib/paginate.js";
|
|
4
5
|
/**
|
|
5
6
|
* `primitive locks` — inspect and script the named lock API (#1518).
|
|
6
7
|
*
|
|
@@ -16,6 +17,7 @@ Examples:
|
|
|
16
17
|
$ primitive locks list
|
|
17
18
|
$ primitive locks status portfolio-import:user-123
|
|
18
19
|
$ primitive locks acquire portfolio-import:user-123 --ttl 60000
|
|
20
|
+
$ primitive locks acquire portfolio-import:user-123 --owner run-01M2H5EYQQ
|
|
19
21
|
$ primitive locks release portfolio-import:user-123 --handle 01HXY...
|
|
20
22
|
`);
|
|
21
23
|
// ─── list ───
|
|
@@ -31,7 +33,7 @@ Examples:
|
|
|
31
33
|
try {
|
|
32
34
|
const { locks: held } = await client.listLocks(resolvedAppId);
|
|
33
35
|
if (options.json) {
|
|
34
|
-
json(held);
|
|
36
|
+
json(wholeListEnvelope(held));
|
|
35
37
|
return;
|
|
36
38
|
}
|
|
37
39
|
if (!held || held.length === 0) {
|
|
@@ -42,6 +44,9 @@ Examples:
|
|
|
42
44
|
{ header: "KEY", key: "key" },
|
|
43
45
|
{ header: "HELD BY", key: "heldBy" },
|
|
44
46
|
{ header: "KIND", key: "holderKind" },
|
|
47
|
+
// #3562 — whose hold it is. An operator reading this needs it to
|
|
48
|
+
// tell a run's own hold from another's.
|
|
49
|
+
{ header: "OWNER", key: "owner" },
|
|
45
50
|
{ header: "ACQUIRED", key: "acquiredAt", format: formatDate },
|
|
46
51
|
{ header: "EXPIRES", key: "leaseExpiresAt", format: formatDate },
|
|
47
52
|
]));
|
|
@@ -77,6 +82,11 @@ Examples:
|
|
|
77
82
|
keyValue("Holder kind", status.holderKind ?? "(unknown)");
|
|
78
83
|
if (status.holderRunId)
|
|
79
84
|
keyValue("Holder run", status.holderRunId);
|
|
85
|
+
// #3562 — the owner the holder named. Printed only when there is one:
|
|
86
|
+
// a hold made without one is strictly non-reentrant and has nothing to
|
|
87
|
+
// say here.
|
|
88
|
+
if (status.owner)
|
|
89
|
+
keyValue("Owner", status.owner);
|
|
80
90
|
keyValue("Acquired at", formatDate(status.acquiredAt));
|
|
81
91
|
keyValue("Lease expires", formatDate(status.leaseExpiresAt));
|
|
82
92
|
}
|
|
@@ -93,6 +103,9 @@ Examples:
|
|
|
93
103
|
.argument("[app-id]", "App ID (uses current app if not specified)")
|
|
94
104
|
.option("--app <app-id>", "App ID")
|
|
95
105
|
.option("--ttl <ms>", "Lease duration in milliseconds", "60000")
|
|
106
|
+
.option("--owner <owner>", "Who is taking this lease. Presenting the owner that already holds the " +
|
|
107
|
+
"key re-takes it with a fresh handle; omit it and the lock is strictly " +
|
|
108
|
+
"non-reentrant")
|
|
96
109
|
.option("--json", "Output as JSON")
|
|
97
110
|
.action(async (key, appId, options) => {
|
|
98
111
|
const resolvedAppId = resolveAppId(appId, options);
|
|
@@ -103,7 +116,7 @@ Examples:
|
|
|
103
116
|
}
|
|
104
117
|
const client = new ApiClient();
|
|
105
118
|
try {
|
|
106
|
-
const res = await client.acquireLock(resolvedAppId, key, ttlMs);
|
|
119
|
+
const res = await client.acquireLock(resolvedAppId, key, ttlMs, options.owner);
|
|
107
120
|
if (options.json) {
|
|
108
121
|
json(res);
|
|
109
122
|
return;
|
|
@@ -116,6 +129,8 @@ Examples:
|
|
|
116
129
|
}
|
|
117
130
|
else {
|
|
118
131
|
info(`Lock "${key}" is held by ${res?.heldBy ?? "another caller"}.`);
|
|
132
|
+
if (res?.owner)
|
|
133
|
+
keyValue("Owner", res.owner);
|
|
119
134
|
keyValue("Lease expires", formatDate(res?.leaseExpiresAt));
|
|
120
135
|
process.exit(1);
|
|
121
136
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"locks.js","sourceRoot":"","sources":["../../../src/commands/locks.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EACL,OAAO,EACP,KAAK,EACL,IAAI,EACJ,QAAQ,EACR,WAAW,EACX,UAAU,EACV,IAAI,GACL,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"locks.js","sourceRoot":"","sources":["../../../src/commands/locks.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { ApiClient } from "../lib/api-client.js";
|
|
2
2
|
import { resolveAppId } from "../lib/config.js";
|
|
3
3
|
import { error, info, keyValue, json, divider } from "../lib/output.js";
|
|
4
|
+
import { wholeListEnvelope } from "../lib/paginate.js";
|
|
4
5
|
/**
|
|
5
6
|
* The metadata category DEFINITIONS noun (issue #2762).
|
|
6
7
|
*
|
|
@@ -55,7 +56,7 @@ them first with 'primitive metadata delete' if you need them gone.
|
|
|
55
56
|
try {
|
|
56
57
|
const configList = await client.listMetadataCategoryConfigs(resolvedAppId);
|
|
57
58
|
if (options.json) {
|
|
58
|
-
json(configList);
|
|
59
|
+
json(wholeListEnvelope(configList));
|
|
59
60
|
return;
|
|
60
61
|
}
|
|
61
62
|
if (!configList || configList.length === 0) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metadata-category-configs.js","sourceRoot":"","sources":["../../../src/commands/metadata-category-configs.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"metadata-category-configs.js","sourceRoot":"","sources":["../../../src/commands/metadata-category-configs.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,6 +2,7 @@ import { ApiClient } from "../lib/api-client.js";
|
|
|
2
2
|
import { resolveAppId } from "../lib/config.js";
|
|
3
3
|
import { parseDataOption } from "../lib/data-input.js";
|
|
4
4
|
import { success, error, info, keyValue, json, divider, } from "../lib/output.js";
|
|
5
|
+
import { wholeListEnvelope } from "../lib/paginate.js";
|
|
5
6
|
/**
|
|
6
7
|
* Parse the `--data` / `--data-file` pair into a metadata object (#1969: the
|
|
7
8
|
* shared parser lives in `lib/data-input.ts`; this thin wrapper keeps the
|
|
@@ -129,7 +130,13 @@ Examples:
|
|
|
129
130
|
try {
|
|
130
131
|
const result = await client.listResourceMetadata(resolvedAppId, resourceType, resourceId);
|
|
131
132
|
if (options.json) {
|
|
132
|
-
|
|
133
|
+
// The one list envelope (#3646): the stored categories are `items`,
|
|
134
|
+
// with the resource they belong to beside them.
|
|
135
|
+
json({
|
|
136
|
+
...wholeListEnvelope(result.categories),
|
|
137
|
+
resourceType: result.resourceType,
|
|
138
|
+
resourceId: result.resourceId,
|
|
139
|
+
});
|
|
133
140
|
return;
|
|
134
141
|
}
|
|
135
142
|
keyValue("Resource", `${result.resourceType}/${result.resourceId}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metadata.js","sourceRoot":"","sources":["../../../src/commands/metadata.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EACL,OAAO,EACP,KAAK,EACL,IAAI,EACJ,QAAQ,EACR,IAAI,EACJ,OAAO,GACR,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"metadata.js","sourceRoot":"","sources":["../../../src/commands/metadata.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,23 +7,39 @@ import { pollUntil } from "../lib/watch.js";
|
|
|
7
7
|
import { confirmPrompt } from "../lib/confirm-prompt.js";
|
|
8
8
|
import { parseStatusFilter } from "../lib/object-status-filter.js";
|
|
9
9
|
import { formatAccessRuleForDisplay } from "../lib/access-rule-display.js";
|
|
10
|
+
import { requireTestCaseInputVariables } from "../lib/test-case-variables.js";
|
|
11
|
+
import { resolvePromptSelector } from "../lib/block-selector.js";
|
|
12
|
+
import { normalizeCliListEnvelope, wholeListEnvelope, } from "../lib/paginate.js";
|
|
13
|
+
import { pageCursorOption, pageLimitOption, parsePageLimit, printEmptyPage, printPageHint, } from "../lib/list-options.js";
|
|
14
|
+
/**
|
|
15
|
+
* The one-line token accounting an execution prints.
|
|
16
|
+
*
|
|
17
|
+
* #3358 — `reasoningTokens` is appended only when the provider reported some,
|
|
18
|
+
* so a prompt that does no thinking prints exactly what it always did. It is
|
|
19
|
+
* shown beside the output count rather than folded into it because the two
|
|
20
|
+
* providers disagree about whether reasoning is already inside that number,
|
|
21
|
+
* and the whole point of the metric is to say how much of the decode was
|
|
22
|
+
* deliberation rather than answer.
|
|
23
|
+
*/
|
|
24
|
+
function formatTokens(metrics) {
|
|
25
|
+
const base = `${metrics?.inputTokens || 0} in / ${metrics?.outputTokens || 0} out`;
|
|
26
|
+
const reasoning = metrics?.reasoningTokens;
|
|
27
|
+
return typeof reasoning === "number"
|
|
28
|
+
? `${base} (${reasoning} reasoning)`
|
|
29
|
+
: base;
|
|
30
|
+
}
|
|
10
31
|
/**
|
|
11
32
|
* Resolve a prompt reference — its server id, or the author-chosen key its
|
|
12
33
|
* TOML file is named for.
|
|
13
34
|
*
|
|
14
35
|
* Under TOML-only authoring the key is what an operator has: `prompts/<key>.toml`
|
|
15
36
|
* is the object, and the id is a server detail they never wrote down. Mirrors
|
|
16
|
-
* `resolveScriptId` in `scripts.ts`.
|
|
37
|
+
* `resolveScriptId` in `scripts.ts`. The resolution itself lives in
|
|
38
|
+
* `block-selector.ts` (#3249) so the `tests` verbs and `configs get` agree on
|
|
39
|
+
* it — and drain every page of the list, where this used to read one.
|
|
17
40
|
*/
|
|
18
41
|
async function resolvePromptId(client, appId, ref) {
|
|
19
|
-
|
|
20
|
-
const byId = (items ?? []).find((p) => p.promptId === ref);
|
|
21
|
-
if (byId)
|
|
22
|
-
return byId.promptId;
|
|
23
|
-
const byKey = (items ?? []).find((p) => p.promptKey === ref);
|
|
24
|
-
if (byKey)
|
|
25
|
-
return byKey.promptId;
|
|
26
|
-
throw new Error(`Prompt not found: ${ref}`);
|
|
42
|
+
return (await resolvePromptSelector(client, appId, ref)).blockId;
|
|
27
43
|
}
|
|
28
44
|
export function registerPromptsCommands(program) {
|
|
29
45
|
const prompts = program
|
|
@@ -53,8 +69,11 @@ Configuration lives in prompts/<key>.toml:
|
|
|
53
69
|
.argument("[app-id]", "App ID (uses current app if not specified)")
|
|
54
70
|
.option("--app <app-id>", "App ID")
|
|
55
71
|
.option("--status <status>", "Filter by status: active, inactive, archived")
|
|
72
|
+
.addOption(pageLimitOption())
|
|
73
|
+
.addOption(pageCursorOption())
|
|
56
74
|
.option("--json", "Output as JSON")
|
|
57
75
|
.action(async (appId, options) => {
|
|
76
|
+
const limit = parsePageLimit(options.limit);
|
|
58
77
|
const resolvedAppId = resolveAppId(appId, options);
|
|
59
78
|
const client = new ApiClient();
|
|
60
79
|
try {
|
|
@@ -62,19 +81,22 @@ Configuration lives in prompts/<key>.toml:
|
|
|
62
81
|
// empty list a canonical filter would produce. #2887 added `archived`:
|
|
63
82
|
// the delete flow writes one now, so asking for the retired rows is a
|
|
64
83
|
// question with an answer rather than a 400.
|
|
65
|
-
const
|
|
84
|
+
const page = normalizeCliListEnvelope(await client.listPrompts(resolvedAppId, {
|
|
66
85
|
status: parseStatusFilter("prompts", options.status, [
|
|
67
86
|
"active",
|
|
68
87
|
"inactive",
|
|
69
88
|
"archived",
|
|
70
89
|
]),
|
|
71
|
-
|
|
90
|
+
limit,
|
|
91
|
+
cursor: options.cursor,
|
|
92
|
+
}));
|
|
93
|
+
const items = page.items;
|
|
72
94
|
if (options.json) {
|
|
73
|
-
json(
|
|
95
|
+
json(page);
|
|
74
96
|
return;
|
|
75
97
|
}
|
|
76
|
-
if (
|
|
77
|
-
|
|
98
|
+
if (items.length === 0) {
|
|
99
|
+
printEmptyPage(page, "prompts");
|
|
78
100
|
return;
|
|
79
101
|
}
|
|
80
102
|
console.log(formatTable(items, [
|
|
@@ -84,6 +106,7 @@ Configuration lives in prompts/<key>.toml:
|
|
|
84
106
|
{ header: "STATUS", key: "status", format: formatStatus },
|
|
85
107
|
{ header: "MODIFIED", key: "modifiedAt", format: formatDate },
|
|
86
108
|
]));
|
|
109
|
+
printPageHint(page);
|
|
87
110
|
}
|
|
88
111
|
catch (err) {
|
|
89
112
|
error(err.message);
|
|
@@ -271,7 +294,7 @@ Reclaiming the key means hard-deleting the row:
|
|
|
271
294
|
if (result.success) {
|
|
272
295
|
success("Execution successful");
|
|
273
296
|
keyValue("Duration", formatDuration(result.metrics?.durationMs));
|
|
274
|
-
keyValue("Tokens",
|
|
297
|
+
keyValue("Tokens", formatTokens(result.metrics));
|
|
275
298
|
console.log("\nOutput:");
|
|
276
299
|
console.log(result.output);
|
|
277
300
|
}
|
|
@@ -411,7 +434,7 @@ Duplicating a config is copying its \`[[configs]]\` block and renaming it.
|
|
|
411
434
|
try {
|
|
412
435
|
const { items } = await client.listPromptConfigs(resolvedAppId, promptId);
|
|
413
436
|
if (options.json) {
|
|
414
|
-
json(items);
|
|
437
|
+
json(wholeListEnvelope(items));
|
|
415
438
|
return;
|
|
416
439
|
}
|
|
417
440
|
if (!items || items.length === 0) {
|
|
@@ -493,30 +516,45 @@ Test cases are authored in TOML at prompts/<key>.tests/<name>.toml and applied
|
|
|
493
516
|
with \`primitive config push\` (issue #2769); \`config fields prompt\` lists the
|
|
494
517
|
fields. Deleting a case is removing its file and running \`config push --prune\`.
|
|
495
518
|
|
|
519
|
+
Every verb here takes the prompt's KEY or its ID (#3249). An identifier that
|
|
520
|
+
names no prompt in the app fails; "No test cases found." only ever means the
|
|
521
|
+
prompt exists and has no cases.
|
|
522
|
+
|
|
496
523
|
Examples:
|
|
497
|
-
$ primitive prompts tests list <prompt
|
|
498
|
-
$ primitive prompts tests run <prompt
|
|
499
|
-
$ primitive prompts tests run-all <prompt
|
|
500
|
-
$ primitive prompts tests run-all <prompt
|
|
524
|
+
$ primitive prompts tests list <prompt>
|
|
525
|
+
$ primitive prompts tests run <prompt> <test-case-id>
|
|
526
|
+
$ primitive prompts tests run-all <prompt>
|
|
527
|
+
$ primitive prompts tests run-all <prompt> --test-cases 01ABC,01DEF,01GHI
|
|
501
528
|
`);
|
|
502
529
|
// List test cases
|
|
503
530
|
tests
|
|
504
531
|
.command("list")
|
|
505
532
|
.description("List test cases for a prompt")
|
|
506
|
-
.argument("<prompt
|
|
533
|
+
.argument("<prompt>", "Prompt key or ID")
|
|
507
534
|
.option("--app <app-id>", "App ID (uses current app if not specified)")
|
|
535
|
+
.addOption(pageLimitOption())
|
|
536
|
+
.addOption(pageCursorOption())
|
|
508
537
|
.option("--json", "Output as JSON")
|
|
509
|
-
.action(async (
|
|
538
|
+
.action(async (prompt, options) => {
|
|
539
|
+
const limit = parsePageLimit(options.limit);
|
|
510
540
|
const resolvedAppId = resolveAppId(undefined, options);
|
|
511
541
|
const client = new ApiClient();
|
|
512
542
|
try {
|
|
513
|
-
|
|
543
|
+
// #3249 — resolve BEFORE listing: the test-case endpoint answers an
|
|
544
|
+
// unknown block with an empty page, so an unresolved identifier would
|
|
545
|
+
// print "No test cases found." and exit 0.
|
|
546
|
+
const promptId = await resolvePromptId(client, resolvedAppId, prompt);
|
|
547
|
+
const page = normalizeCliListEnvelope(await client.listTestCases(resolvedAppId, "prompt", promptId, {
|
|
548
|
+
limit,
|
|
549
|
+
cursor: options.cursor,
|
|
550
|
+
}));
|
|
551
|
+
const items = page.items;
|
|
514
552
|
if (options.json) {
|
|
515
|
-
json(
|
|
553
|
+
json(page);
|
|
516
554
|
return;
|
|
517
555
|
}
|
|
518
|
-
if (
|
|
519
|
-
|
|
556
|
+
if (items.length === 0) {
|
|
557
|
+
printEmptyPage(page, "test cases");
|
|
520
558
|
return;
|
|
521
559
|
}
|
|
522
560
|
console.log(formatTable(items, [
|
|
@@ -525,6 +563,7 @@ Examples:
|
|
|
525
563
|
{ header: "CONFIG", key: "configId", format: (v) => v ? formatId(v) : "-" },
|
|
526
564
|
{ header: "CREATED", key: "createdAt", format: formatDate },
|
|
527
565
|
]));
|
|
566
|
+
printPageHint(page);
|
|
528
567
|
}
|
|
529
568
|
catch (err) {
|
|
530
569
|
error(err.message);
|
|
@@ -535,14 +574,15 @@ Examples:
|
|
|
535
574
|
tests
|
|
536
575
|
.command("get")
|
|
537
576
|
.description("Get test case details")
|
|
538
|
-
.argument("<prompt
|
|
577
|
+
.argument("<prompt>", "Prompt key or ID")
|
|
539
578
|
.argument("<test-case-id>", "Test Case ID")
|
|
540
579
|
.option("--app <app-id>", "App ID (uses current app if not specified)")
|
|
541
580
|
.option("--json", "Output as JSON")
|
|
542
|
-
.action(async (
|
|
581
|
+
.action(async (prompt, testCaseId, options) => {
|
|
543
582
|
const resolvedAppId = resolveAppId(undefined, options);
|
|
544
583
|
const client = new ApiClient();
|
|
545
584
|
try {
|
|
585
|
+
const promptId = await resolvePromptId(client, resolvedAppId, prompt);
|
|
546
586
|
const result = await client.getTestCase(resolvedAppId, "prompt", promptId, testCaseId);
|
|
547
587
|
if (options.json) {
|
|
548
588
|
json(result);
|
|
@@ -600,24 +640,22 @@ Examples:
|
|
|
600
640
|
tests
|
|
601
641
|
.command("run")
|
|
602
642
|
.description("Run a single test case")
|
|
603
|
-
.argument("<prompt
|
|
643
|
+
.argument("<prompt>", "Prompt key or ID")
|
|
604
644
|
.argument("<test-case-id>", "Test Case ID")
|
|
605
645
|
.option("--app <app-id>", "App ID (uses current app if not specified)")
|
|
606
646
|
.option("--config <config-id>", "Override config ID")
|
|
607
647
|
.option("--json", "Output as JSON")
|
|
608
|
-
.action(async (
|
|
648
|
+
.action(async (prompt, testCaseId, options) => {
|
|
609
649
|
const resolvedAppId = resolveAppId(undefined, options);
|
|
610
650
|
const client = new ApiClient();
|
|
611
651
|
try {
|
|
652
|
+
const promptId = await resolvePromptId(client, resolvedAppId, prompt);
|
|
612
653
|
// Get test case to retrieve its variables
|
|
613
654
|
const testCase = await client.getTestCase(resolvedAppId, "prompt", promptId, testCaseId);
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
catch {
|
|
619
|
-
// Use empty object if parsing fails
|
|
620
|
-
}
|
|
655
|
+
// #3158 — the case's stored input IS the run's input, and the server
|
|
656
|
+
// hands it back parsed; `JSON.parse` on that object threw and the run
|
|
657
|
+
// went ahead with `{}`, disagreeing with `run-all` over the same case.
|
|
658
|
+
const variables = requireTestCaseInputVariables(testCase.inputVariables, testCaseId);
|
|
621
659
|
const result = await client.executeBlockTest(resolvedAppId, "prompt", promptId, {
|
|
622
660
|
variables,
|
|
623
661
|
testCaseId,
|
|
@@ -635,7 +673,7 @@ Examples:
|
|
|
635
673
|
error("Test FAILED");
|
|
636
674
|
}
|
|
637
675
|
keyValue("Duration", formatDuration(result.metrics?.durationMs));
|
|
638
|
-
keyValue("Tokens",
|
|
676
|
+
keyValue("Tokens", formatTokens(result.metrics));
|
|
639
677
|
if (result.verification) {
|
|
640
678
|
divider();
|
|
641
679
|
info("Verification:");
|
|
@@ -672,15 +710,18 @@ Examples:
|
|
|
672
710
|
tests
|
|
673
711
|
.command("run-all")
|
|
674
712
|
.description("Run all test cases for a prompt, or a specific subset")
|
|
675
|
-
.argument("<prompt
|
|
713
|
+
.argument("<prompt>", "Prompt key or ID")
|
|
676
714
|
.option("--app <app-id>", "App ID (uses current app if not specified)")
|
|
677
715
|
.option("--config <config-id>", "Override config ID for all tests")
|
|
678
716
|
.option("--test-cases <ids>", "Comma-separated list of test case IDs to run (runs only these)")
|
|
679
717
|
.option("--json", "Output as JSON")
|
|
680
|
-
.action(async (
|
|
718
|
+
.action(async (prompt, options) => {
|
|
681
719
|
const resolvedAppId = resolveAppId(undefined, options);
|
|
682
720
|
const client = new ApiClient();
|
|
683
721
|
try {
|
|
722
|
+
// #3249 — resolve first, so `Total Tests: 0` can only ever mean the
|
|
723
|
+
// prompt exists and has no cases, never that the identifier was wrong.
|
|
724
|
+
const promptId = await resolvePromptId(client, resolvedAppId, prompt);
|
|
684
725
|
// Parse test case IDs if provided
|
|
685
726
|
let testCaseIds;
|
|
686
727
|
if (options.testCases) {
|
|
@@ -738,15 +779,16 @@ Examples:
|
|
|
738
779
|
tests
|
|
739
780
|
.command("runs")
|
|
740
781
|
.description("List recent test runs for a prompt")
|
|
741
|
-
.argument("<prompt
|
|
782
|
+
.argument("<prompt>", "Prompt key or ID")
|
|
742
783
|
.option("--app <app-id>", "App ID (uses current app if not specified)")
|
|
743
784
|
.option("--limit <n>", "Maximum number of runs to show", "20")
|
|
744
785
|
.option("--group <group>", "Filter by comparison group")
|
|
745
786
|
.option("--json", "Output as JSON")
|
|
746
|
-
.action(async (
|
|
787
|
+
.action(async (prompt, options) => {
|
|
747
788
|
const resolvedAppId = resolveAppId(undefined, options);
|
|
748
789
|
const client = new ApiClient();
|
|
749
790
|
try {
|
|
791
|
+
const promptId = await resolvePromptId(client, resolvedAppId, prompt);
|
|
750
792
|
const { items } = await client.listTestRuns(resolvedAppId, "prompt", promptId, {
|
|
751
793
|
limit: parseInt(options.limit),
|
|
752
794
|
comparisonGroup: options.group,
|
|
@@ -788,24 +830,25 @@ Examples:
|
|
|
788
830
|
.description("Run tests in parallel using workflow-based execution")
|
|
789
831
|
.addHelpText("after", `
|
|
790
832
|
Examples:
|
|
791
|
-
$ primitive prompts tests batch start <prompt
|
|
792
|
-
$ primitive prompts tests batch start <prompt
|
|
793
|
-
$ primitive prompts tests batch status <prompt
|
|
794
|
-
$ primitive prompts tests batch cancel <prompt
|
|
833
|
+
$ primitive prompts tests batch start <prompt>
|
|
834
|
+
$ primitive prompts tests batch start <prompt> --test-cases 01ABC,01DEF
|
|
835
|
+
$ primitive prompts tests batch status <prompt> <batch-id>
|
|
836
|
+
$ primitive prompts tests batch cancel <prompt> <batch-id>
|
|
795
837
|
`);
|
|
796
838
|
// Start batch tests
|
|
797
839
|
batch
|
|
798
840
|
.command("start")
|
|
799
841
|
.description("Start parallel batch test execution")
|
|
800
|
-
.argument("<prompt
|
|
842
|
+
.argument("<prompt>", "Prompt key or ID")
|
|
801
843
|
.option("--app <app-id>", "App ID (uses current app if not specified)")
|
|
802
844
|
.option("--config <config-id>", "Override config ID for all tests")
|
|
803
845
|
.option("--test-cases <ids>", "Comma-separated list of test case IDs to run")
|
|
804
846
|
.option("--json", "Output as JSON")
|
|
805
|
-
.action(async (
|
|
847
|
+
.action(async (prompt, options) => {
|
|
806
848
|
const resolvedAppId = resolveAppId(undefined, options);
|
|
807
849
|
const client = new ApiClient();
|
|
808
850
|
try {
|
|
851
|
+
const promptId = await resolvePromptId(client, resolvedAppId, prompt);
|
|
809
852
|
let testCaseIds;
|
|
810
853
|
if (options.testCases) {
|
|
811
854
|
testCaseIds = options.testCases.split(",").map((id) => id.trim()).filter(Boolean);
|
|
@@ -842,15 +885,16 @@ Examples:
|
|
|
842
885
|
batch
|
|
843
886
|
.command("status")
|
|
844
887
|
.description("Get status of a batch test execution")
|
|
845
|
-
.argument("<prompt
|
|
888
|
+
.argument("<prompt>", "Prompt key or ID")
|
|
846
889
|
.argument("<batch-id>", "Batch ID")
|
|
847
890
|
.option("--app <app-id>", "App ID (uses current app if not specified)")
|
|
848
891
|
.option("--wait", "Wait for completion (polls every 2 seconds)")
|
|
849
892
|
.option("--json", "Output as JSON")
|
|
850
|
-
.action(async (
|
|
893
|
+
.action(async (prompt, batchId, options) => {
|
|
851
894
|
const resolvedAppId = resolveAppId(undefined, options);
|
|
852
895
|
const client = new ApiClient();
|
|
853
896
|
try {
|
|
897
|
+
const promptId = await resolvePromptId(client, resolvedAppId, prompt);
|
|
854
898
|
const fetchStatus = async () => {
|
|
855
899
|
return client.getBatchTestStatus(resolvedAppId, "prompt", promptId, batchId);
|
|
856
900
|
};
|
|
@@ -907,12 +951,12 @@ Examples:
|
|
|
907
951
|
batch
|
|
908
952
|
.command("cancel")
|
|
909
953
|
.description("Cancel a running batch test execution")
|
|
910
|
-
.argument("<prompt
|
|
954
|
+
.argument("<prompt>", "Prompt key or ID")
|
|
911
955
|
.argument("<batch-id>", "Batch ID")
|
|
912
956
|
.option("--app <app-id>", "App ID (uses current app if not specified)")
|
|
913
957
|
.option("-y, --yes", "Skip confirmation prompt")
|
|
914
958
|
.option("--json", "Output as JSON")
|
|
915
|
-
.action(async (
|
|
959
|
+
.action(async (prompt, batchId, options) => {
|
|
916
960
|
const resolvedAppId = resolveAppId(undefined, options);
|
|
917
961
|
if (!options.yes) {
|
|
918
962
|
let confirm;
|
|
@@ -930,6 +974,7 @@ Examples:
|
|
|
930
974
|
}
|
|
931
975
|
const client = new ApiClient();
|
|
932
976
|
try {
|
|
977
|
+
const promptId = await resolvePromptId(client, resolvedAppId, prompt);
|
|
933
978
|
// First get current status to get instance IDs
|
|
934
979
|
const status = await client.getBatchTestStatus(resolvedAppId, "prompt", promptId, batchId);
|
|
935
980
|
// Get instance IDs that are still running
|
|
@@ -969,24 +1014,25 @@ with \`primitive config push\` (#2769); removing one and running
|
|
|
969
1014
|
\`config push --prune\` deletes it server-side. These verbs read server state.
|
|
970
1015
|
|
|
971
1016
|
Examples:
|
|
972
|
-
$ primitive prompts tests attachments list <prompt
|
|
973
|
-
$ primitive prompts tests attachments download <prompt
|
|
1017
|
+
$ primitive prompts tests attachments list <prompt> <test-case-id>
|
|
1018
|
+
$ primitive prompts tests attachments download <prompt> <test-case-id> document.pdf
|
|
974
1019
|
`);
|
|
975
1020
|
// List attachments
|
|
976
1021
|
attachments
|
|
977
1022
|
.command("list")
|
|
978
1023
|
.description("List attachments for a test case")
|
|
979
|
-
.argument("<prompt
|
|
1024
|
+
.argument("<prompt>", "Prompt key or ID")
|
|
980
1025
|
.argument("<test-case-id>", "Test Case ID")
|
|
981
1026
|
.option("--app <app-id>", "App ID (uses current app if not specified)")
|
|
982
1027
|
.option("--json", "Output as JSON")
|
|
983
|
-
.action(async (
|
|
1028
|
+
.action(async (prompt, testCaseId, options) => {
|
|
984
1029
|
const resolvedAppId = resolveAppId(undefined, options);
|
|
985
1030
|
const client = new ApiClient();
|
|
986
1031
|
try {
|
|
1032
|
+
const promptId = await resolvePromptId(client, resolvedAppId, prompt);
|
|
987
1033
|
const result = await client.listTestCaseAttachments(resolvedAppId, "prompt", promptId, testCaseId);
|
|
988
1034
|
if (options.json) {
|
|
989
|
-
json(result.attachments);
|
|
1035
|
+
json(wholeListEnvelope(result.attachments));
|
|
990
1036
|
return;
|
|
991
1037
|
}
|
|
992
1038
|
if (!result.attachments || result.attachments.length === 0) {
|
|
@@ -1012,15 +1058,16 @@ Examples:
|
|
|
1012
1058
|
attachments
|
|
1013
1059
|
.command("download")
|
|
1014
1060
|
.description("Download a file attachment from a test case")
|
|
1015
|
-
.argument("<prompt
|
|
1061
|
+
.argument("<prompt>", "Prompt key or ID")
|
|
1016
1062
|
.argument("<test-case-id>", "Test Case ID")
|
|
1017
1063
|
.argument("<filename>", "Name of the file to download")
|
|
1018
1064
|
.argument("[output-path]", "Output path (defaults to current directory)")
|
|
1019
1065
|
.option("--app <app-id>", "App ID (uses current app if not specified)")
|
|
1020
|
-
.action(async (
|
|
1066
|
+
.action(async (prompt, testCaseId, filename, outputPath, options) => {
|
|
1021
1067
|
const resolvedAppId = resolveAppId(undefined, options);
|
|
1022
1068
|
const client = new ApiClient();
|
|
1023
1069
|
try {
|
|
1070
|
+
const promptId = await resolvePromptId(client, resolvedAppId, prompt);
|
|
1024
1071
|
const result = await client.downloadTestCaseAttachment(resolvedAppId, "prompt", promptId, testCaseId, filename);
|
|
1025
1072
|
const finalPath = outputPath || filename;
|
|
1026
1073
|
writeFileSync(finalPath, result.data);
|