primitive-admin 1.1.0-alpha.7 → 1.1.0-alpha.71
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 +404 -80
- package/assets/skill/skills/primitive-platform/SKILL.md +808 -0
- package/dist/bin/primitive.d.ts +2 -0
- package/dist/bin/primitive.js +294 -21
- package/dist/bin/primitive.js.map +1 -1
- package/dist/src/commands/admins.d.ts +2 -0
- package/dist/src/commands/admins.js +138 -19
- package/dist/src/commands/admins.js.map +1 -1
- package/dist/src/commands/analytics.d.ts +2 -0
- package/dist/src/commands/analytics.js +544 -55
- package/dist/src/commands/analytics.js.map +1 -1
- package/dist/src/commands/apps.d.ts +2 -0
- package/dist/src/commands/apps.js +51 -96
- package/dist/src/commands/apps.js.map +1 -1
- package/dist/src/commands/auth.d.ts +2 -0
- package/dist/src/commands/auth.js +177 -7
- package/dist/src/commands/auth.js.map +1 -1
- package/dist/src/commands/blob-buckets.d.ts +2 -0
- package/dist/src/commands/blob-buckets.js +330 -0
- package/dist/src/commands/blob-buckets.js.map +1 -0
- package/dist/src/commands/catalog.d.ts +2 -0
- package/dist/src/commands/catalog.js +37 -38
- package/dist/src/commands/catalog.js.map +1 -1
- package/dist/src/commands/collection-type-configs.d.ts +2 -0
- package/dist/src/commands/collection-type-configs.js +92 -0
- package/dist/src/commands/collection-type-configs.js.map +1 -0
- package/dist/src/commands/collections.d.ts +2 -0
- package/dist/src/commands/collections.js +565 -0
- package/dist/src/commands/collections.js.map +1 -0
- package/dist/src/commands/comparisons.d.ts +2 -0
- package/dist/src/commands/comparisons.js +6 -6
- package/dist/src/commands/comparisons.js.map +1 -1
- package/dist/src/commands/config.d.ts +46 -0
- package/dist/src/commands/config.js +479 -0
- package/dist/src/commands/config.js.map +1 -0
- package/dist/src/commands/connections.d.ts +2 -0
- package/dist/src/commands/connections.js +100 -0
- package/dist/src/commands/connections.js.map +1 -0
- package/dist/src/commands/cron-triggers.d.ts +2 -0
- package/dist/src/commands/cron-triggers.js +265 -0
- package/dist/src/commands/cron-triggers.js.map +1 -0
- 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.d.ts +2 -0
- package/dist/src/commands/database-types.js +471 -0
- package/dist/src/commands/database-types.js.map +1 -0
- package/dist/src/commands/databases.d.ts +65 -0
- package/dist/src/commands/databases.js +2140 -112
- package/dist/src/commands/databases.js.map +1 -1
- package/dist/src/commands/documents.d.ts +2 -0
- package/dist/src/commands/documents.js +1357 -19
- package/dist/src/commands/documents.js.map +1 -1
- package/dist/src/commands/email-templates.d.ts +2 -0
- package/dist/src/commands/email-templates.js +174 -0
- package/dist/src/commands/email-templates.js.map +1 -0
- package/dist/src/commands/env.d.ts +23 -0
- package/dist/src/commands/env.js +333 -0
- package/dist/src/commands/env.js.map +1 -0
- package/dist/src/commands/feature-flags.d.ts +14 -0
- package/dist/src/commands/feature-flags.js +116 -0
- package/dist/src/commands/feature-flags.js.map +1 -0
- package/dist/src/commands/group-type-configs.d.ts +2 -0
- package/dist/src/commands/group-type-configs.js +86 -0
- package/dist/src/commands/group-type-configs.js.map +1 -0
- package/dist/src/commands/groups.d.ts +2 -0
- package/dist/src/commands/groups.js +38 -99
- package/dist/src/commands/groups.js.map +1 -1
- package/dist/src/commands/guides.d.ts +223 -0
- package/dist/src/commands/guides.js +617 -65
- package/dist/src/commands/guides.js.map +1 -1
- package/dist/src/commands/init.d.ts +25 -0
- package/dist/src/commands/init.js +1605 -208
- package/dist/src/commands/init.js.map +1 -1
- package/dist/src/commands/integrations.d.ts +2 -0
- package/dist/src/commands/integrations.js +380 -178
- package/dist/src/commands/integrations.js.map +1 -1
- package/dist/src/commands/llm.d.ts +2 -0
- package/dist/src/commands/llm.js +4 -2
- package/dist/src/commands/llm.js.map +1 -1
- package/dist/src/commands/locks.d.ts +8 -0
- package/dist/src/commands/locks.js +160 -0
- package/dist/src/commands/locks.js.map +1 -0
- 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.d.ts +2 -0
- package/dist/src/commands/metadata.js +281 -0
- package/dist/src/commands/metadata.js.map +1 -0
- package/dist/src/commands/prompts.d.ts +2 -0
- package/dist/src/commands/prompts.js +225 -584
- package/dist/src/commands/prompts.js.map +1 -1
- package/dist/src/commands/rule-sets.d.ts +3 -0
- package/dist/src/commands/rule-sets.js +272 -0
- package/dist/src/commands/rule-sets.js.map +1 -0
- package/dist/src/commands/scripts.d.ts +20 -0
- package/dist/src/commands/scripts.js +554 -0
- package/dist/src/commands/scripts.js.map +1 -0
- package/dist/src/commands/secrets.d.ts +2 -0
- package/dist/src/commands/secrets.js +108 -0
- package/dist/src/commands/secrets.js.map +1 -0
- package/dist/src/commands/sessions.d.ts +2 -0
- package/dist/src/commands/sessions.js +75 -0
- package/dist/src/commands/sessions.js.map +1 -0
- package/dist/src/commands/skill.d.ts +2 -0
- package/dist/src/commands/skill.js +29 -0
- package/dist/src/commands/skill.js.map +1 -0
- package/dist/src/commands/sync-app-settings.d.ts +158 -0
- package/dist/src/commands/sync-app-settings.js +330 -0
- package/dist/src/commands/sync-app-settings.js.map +1 -0
- package/dist/src/commands/sync.d.ts +2323 -0
- package/dist/src/commands/sync.js +15065 -843
- package/dist/src/commands/sync.js.map +1 -1
- package/dist/src/commands/tokens.d.ts +2 -0
- package/dist/src/commands/tokens.js +130 -21
- package/dist/src/commands/tokens.js.map +1 -1
- package/dist/src/commands/users.d.ts +2 -0
- package/dist/src/commands/users.js +532 -23
- package/dist/src/commands/users.js.map +1 -1
- package/dist/src/commands/vars.d.ts +8 -0
- package/dist/src/commands/vars.js +96 -0
- package/dist/src/commands/vars.js.map +1 -0
- package/dist/src/commands/waitlist.d.ts +2 -0
- package/dist/src/commands/waitlist.js +10 -10
- package/dist/src/commands/waitlist.js.map +1 -1
- package/dist/src/commands/webhooks.d.ts +2 -0
- package/dist/src/commands/webhooks.js +562 -0
- package/dist/src/commands/webhooks.js.map +1 -0
- package/dist/src/commands/workflows.d.ts +116 -0
- package/dist/src/commands/workflows.js +1583 -681
- 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 +1936 -0
- package/dist/src/lib/api-client.js +1826 -138
- package/dist/src/lib/api-client.js.map +1 -1
- package/dist/src/lib/app-settings-descriptor.d.ts +263 -0
- package/dist/src/lib/app-settings-descriptor.js +575 -0
- package/dist/src/lib/app-settings-descriptor.js.map +1 -0
- package/dist/src/lib/auth-flow.d.ts +8 -0
- package/dist/src/lib/batch.d.ts +26 -0
- package/dist/src/lib/batch.js +32 -0
- package/dist/src/lib/batch.js.map +1 -0
- package/dist/src/lib/block-layout.d.ts +160 -0
- package/dist/src/lib/block-layout.js +451 -0
- package/dist/src/lib/block-layout.js.map +1 -0
- package/dist/src/lib/canonical-json.d.ts +12 -0
- package/dist/src/lib/canonical-json.js +35 -0
- package/dist/src/lib/canonical-json.js.map +1 -0
- package/dist/src/lib/channel.d.ts +30 -0
- package/dist/src/lib/channel.js +68 -0
- package/dist/src/lib/channel.js.map +1 -0
- package/dist/src/lib/cli-manifest.d.ts +68 -0
- package/dist/src/lib/cli-manifest.js +71 -0
- package/dist/src/lib/cli-manifest.js.map +1 -0
- package/dist/src/lib/codegen-shared/generatedFiles.d.ts +101 -0
- package/dist/src/lib/codegen-shared/generatedFiles.js +191 -0
- package/dist/src/lib/codegen-shared/generatedFiles.js.map +1 -0
- package/dist/src/lib/codegen-shared/prettierStable.d.ts +262 -0
- package/dist/src/lib/codegen-shared/prettierStable.js +610 -0
- package/dist/src/lib/codegen-shared/prettierStable.js.map +1 -0
- package/dist/src/lib/codegen-shared/resolveCodegenSourceDir.d.ts +68 -0
- package/dist/src/lib/codegen-shared/resolveCodegenSourceDir.js +168 -0
- package/dist/src/lib/codegen-shared/resolveCodegenSourceDir.js.map +1 -0
- package/dist/src/lib/config-object-descriptor.d.ts +127 -0
- package/dist/src/lib/config-object-descriptor.js +658 -0
- package/dist/src/lib/config-object-descriptor.js.map +1 -0
- package/dist/src/lib/config-payload.d.ts +85 -0
- package/dist/src/lib/config-payload.js +116 -0
- package/dist/src/lib/config-payload.js.map +1 -0
- package/dist/src/lib/config-surface.d.ts +130 -0
- package/dist/src/lib/config-surface.js +300 -0
- package/dist/src/lib/config-surface.js.map +1 -0
- package/dist/src/lib/config-toml.d.ts +10 -0
- package/dist/src/lib/config-toml.js +42 -0
- package/dist/src/lib/config-toml.js.map +1 -0
- package/dist/src/lib/config.d.ts +53 -0
- package/dist/src/lib/config.js +92 -53
- package/dist/src/lib/config.js.map +1 -1
- package/dist/src/lib/confirm-prompt.d.ts +83 -0
- package/dist/src/lib/confirm-prompt.js +110 -0
- package/dist/src/lib/confirm-prompt.js.map +1 -0
- package/dist/src/lib/constants.d.ts +11 -0
- package/dist/src/lib/constants.js +12 -0
- package/dist/src/lib/constants.js.map +1 -0
- package/dist/src/lib/crash-handlers.d.ts +20 -0
- package/dist/src/lib/crash-handlers.js +49 -0
- package/dist/src/lib/crash-handlers.js.map +1 -0
- package/dist/src/lib/credentials-store.d.ts +89 -0
- package/dist/src/lib/credentials-store.js +330 -0
- package/dist/src/lib/credentials-store.js.map +1 -0
- package/dist/src/lib/csv.d.ts +47 -0
- package/dist/src/lib/csv.js +172 -0
- package/dist/src/lib/csv.js.map +1 -0
- package/dist/src/lib/data-input.d.ts +23 -0
- package/dist/src/lib/data-input.js +50 -0
- package/dist/src/lib/data-input.js.map +1 -0
- package/dist/src/lib/db-codegen/dbFingerprint.d.ts +10 -0
- package/dist/src/lib/db-codegen/dbFingerprint.js +17 -0
- package/dist/src/lib/db-codegen/dbFingerprint.js.map +1 -0
- package/dist/src/lib/db-codegen/dbGenerator.d.ts +67 -0
- package/dist/src/lib/db-codegen/dbGenerator.js +170 -0
- package/dist/src/lib/db-codegen/dbGenerator.js.map +1 -0
- package/dist/src/lib/db-codegen/dbNaming.d.ts +87 -0
- package/dist/src/lib/db-codegen/dbNaming.js +180 -0
- package/dist/src/lib/db-codegen/dbNaming.js.map +1 -0
- package/dist/src/lib/db-codegen/dbTemplates.d.ts +272 -0
- package/dist/src/lib/db-codegen/dbTemplates.js +480 -0
- package/dist/src/lib/db-codegen/dbTemplates.js.map +1 -0
- package/dist/src/lib/db-codegen/dbTsTypes.d.ts +73 -0
- package/dist/src/lib/db-codegen/dbTsTypes.js +139 -0
- package/dist/src/lib/db-codegen/dbTsTypes.js.map +1 -0
- package/dist/src/lib/db-codegen/dbTypeIR.d.ts +146 -0
- package/dist/src/lib/db-codegen/dbTypeIR.js +517 -0
- package/dist/src/lib/db-codegen/dbTypeIR.js.map +1 -0
- package/dist/src/lib/db-codegen/generated-operation-def-descriptor.d.ts +112 -0
- package/dist/src/lib/db-codegen/generated-operation-def-descriptor.js +211 -0
- package/dist/src/lib/db-codegen/generated-operation-def-descriptor.js.map +1 -0
- package/dist/src/lib/env-resolver-core.d.ts +147 -0
- package/dist/src/lib/env-resolver-core.js +265 -0
- package/dist/src/lib/env-resolver-core.js.map +1 -0
- package/dist/src/lib/env-resolver.d.ts +84 -0
- package/dist/src/lib/env-resolver.js +133 -0
- package/dist/src/lib/env-resolver.js.map +1 -0
- package/dist/src/lib/fetch.d.ts +5 -0
- package/dist/src/lib/generated-allowlist.d.ts +28 -0
- package/dist/src/lib/generated-allowlist.js +277 -0
- package/dist/src/lib/generated-allowlist.js.map +1 -0
- package/dist/src/lib/generated-config-surfaces.d.ts +682 -0
- package/dist/src/lib/generated-config-surfaces.js +4058 -0
- package/dist/src/lib/generated-config-surfaces.js.map +1 -0
- package/dist/src/lib/generated-template-lint.d.ts +212 -0
- package/dist/src/lib/generated-template-lint.js +624 -0
- package/dist/src/lib/generated-template-lint.js.map +1 -0
- package/dist/src/lib/init-adopt.d.ts +16 -0
- package/dist/src/lib/init-adopt.js +34 -0
- package/dist/src/lib/init-adopt.js.map +1 -0
- package/dist/src/lib/init-assets.d.ts +39 -0
- package/dist/src/lib/init-assets.js +97 -0
- package/dist/src/lib/init-assets.js.map +1 -0
- package/dist/src/lib/init-config.d.ts +98 -0
- package/dist/src/lib/init-config.js +186 -0
- package/dist/src/lib/init-config.js.map +1 -0
- package/dist/src/lib/init-ios-links.d.ts +50 -0
- package/dist/src/lib/init-ios-links.js +153 -0
- package/dist/src/lib/init-ios-links.js.map +1 -0
- package/dist/src/lib/init-plan.d.ts +80 -0
- package/dist/src/lib/init-plan.js +95 -0
- package/dist/src/lib/init-plan.js.map +1 -0
- package/dist/src/lib/init-production-env.d.ts +48 -0
- package/dist/src/lib/init-production-env.js +59 -0
- package/dist/src/lib/init-production-env.js.map +1 -0
- package/dist/src/lib/init-schema.d.ts +74 -0
- package/dist/src/lib/init-schema.js +358 -0
- package/dist/src/lib/init-schema.js.map +1 -0
- package/dist/src/lib/init-xcode.d.ts +33 -0
- package/dist/src/lib/init-xcode.js +114 -0
- package/dist/src/lib/init-xcode.js.map +1 -0
- package/dist/src/lib/integration-request-config.d.ts +30 -0
- package/dist/src/lib/integration-request-config.js +145 -0
- package/dist/src/lib/integration-request-config.js.map +1 -0
- package/dist/src/lib/local-state.d.ts +55 -0
- package/dist/src/lib/local-state.js +167 -0
- package/dist/src/lib/local-state.js.map +1 -0
- package/dist/src/lib/log-inspection.d.ts +568 -0
- package/dist/src/lib/log-inspection.js +639 -0
- package/dist/src/lib/log-inspection.js.map +1 -0
- package/dist/src/lib/migration-nag.d.ts +49 -0
- package/dist/src/lib/migration-nag.js +163 -0
- package/dist/src/lib/migration-nag.js.map +1 -0
- package/dist/src/lib/object-status-filter.d.ts +22 -0
- package/dist/src/lib/object-status-filter.js +45 -0
- package/dist/src/lib/object-status-filter.js.map +1 -0
- package/dist/src/lib/output.d.ts +109 -0
- package/dist/src/lib/output.js +191 -8
- package/dist/src/lib/output.js.map +1 -1
- package/dist/src/lib/package-manager.d.ts +140 -0
- package/dist/src/lib/package-manager.js +305 -0
- package/dist/src/lib/package-manager.js.map +1 -0
- package/dist/src/lib/paginate.d.ts +83 -0
- package/dist/src/lib/paginate.js +95 -0
- package/dist/src/lib/paginate.js.map +1 -0
- package/dist/src/lib/platform-owned.d.ts +63 -0
- package/dist/src/lib/platform-owned.js +85 -0
- package/dist/src/lib/platform-owned.js.map +1 -0
- package/dist/src/lib/project-config.d.ts +97 -0
- package/dist/src/lib/project-config.js +217 -0
- package/dist/src/lib/project-config.js.map +1 -0
- package/dist/src/lib/query-operators.d.ts +43 -0
- package/dist/src/lib/query-operators.js +80 -0
- package/dist/src/lib/query-operators.js.map +1 -0
- package/dist/src/lib/record-filter.d.ts +18 -0
- package/dist/src/lib/record-filter.js +55 -0
- package/dist/src/lib/record-filter.js.map +1 -0
- package/dist/src/lib/refresh-admin-credentials.d.ts +65 -0
- package/dist/src/lib/refresh-admin-credentials.js +103 -0
- package/dist/src/lib/refresh-admin-credentials.js.map +1 -0
- package/dist/src/lib/resolve-init-dev-port.d.ts +56 -0
- package/dist/src/lib/resolve-init-dev-port.js +55 -0
- package/dist/src/lib/resolve-init-dev-port.js.map +1 -0
- package/dist/src/lib/resolve-init-server.d.ts +64 -0
- package/dist/src/lib/resolve-init-server.js +77 -0
- package/dist/src/lib/resolve-init-server.js.map +1 -0
- package/dist/src/lib/resolve-platform.d.ts +74 -0
- package/dist/src/lib/resolve-platform.js +105 -0
- package/dist/src/lib/resolve-platform.js.map +1 -0
- package/dist/src/lib/run-status.d.ts +19 -0
- package/dist/src/lib/run-status.generated.d.ts +39 -0
- package/dist/src/lib/run-status.generated.js +66 -0
- package/dist/src/lib/run-status.generated.js.map +1 -0
- package/dist/src/lib/run-status.js +19 -0
- package/dist/src/lib/run-status.js.map +1 -0
- package/dist/src/lib/server-text-normalization.d.ts +51 -0
- package/dist/src/lib/server-text-normalization.js +90 -0
- package/dist/src/lib/server-text-normalization.js.map +1 -0
- package/dist/src/lib/server-url.d.ts +22 -0
- package/dist/src/lib/server-url.js +33 -0
- package/dist/src/lib/server-url.js.map +1 -0
- package/dist/src/lib/signing-secret-status.d.ts +81 -0
- package/dist/src/lib/signing-secret-status.js +116 -0
- package/dist/src/lib/signing-secret-status.js.map +1 -0
- package/dist/src/lib/skill-installer.d.ts +25 -0
- package/dist/src/lib/skill-installer.js +266 -0
- package/dist/src/lib/skill-installer.js.map +1 -0
- package/dist/src/lib/snapshots.d.ts +99 -0
- package/dist/src/lib/snapshots.js +357 -0
- package/dist/src/lib/snapshots.js.map +1 -0
- package/dist/src/lib/swift-codegen/dbGenerator.d.ts +113 -0
- package/dist/src/lib/swift-codegen/dbGenerator.js +914 -0
- package/dist/src/lib/swift-codegen/dbGenerator.js.map +1 -0
- package/dist/src/lib/swift-codegen/dbSwiftTypes.d.ts +42 -0
- package/dist/src/lib/swift-codegen/dbSwiftTypes.js +100 -0
- package/dist/src/lib/swift-codegen/dbSwiftTypes.js.map +1 -0
- package/dist/src/lib/swift-codegen/generator.d.ts +94 -0
- package/dist/src/lib/swift-codegen/generator.js +440 -0
- package/dist/src/lib/swift-codegen/generator.js.map +1 -0
- package/dist/src/lib/swift-codegen/schemaToSwift.d.ts +72 -0
- package/dist/src/lib/swift-codegen/schemaToSwift.js +644 -0
- package/dist/src/lib/swift-codegen/schemaToSwift.js.map +1 -0
- package/dist/src/lib/swift-codegen/siblingSymbols.d.ts +94 -0
- package/dist/src/lib/swift-codegen/siblingSymbols.js +155 -0
- package/dist/src/lib/swift-codegen/siblingSymbols.js.map +1 -0
- package/dist/src/lib/swift-codegen/swiftNaming.d.ts +85 -0
- package/dist/src/lib/swift-codegen/swiftNaming.js +198 -0
- package/dist/src/lib/swift-codegen/swiftNaming.js.map +1 -0
- 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 +111 -0
- package/dist/src/lib/sync-paths.js +198 -0
- package/dist/src/lib/sync-paths.js.map +1 -0
- package/dist/src/lib/sync-resource-types.d.ts +544 -0
- package/dist/src/lib/sync-resource-types.js +975 -0
- package/dist/src/lib/sync-resource-types.js.map +1 -0
- package/dist/src/lib/sync-selectors.d.ts +95 -0
- package/dist/src/lib/sync-selectors.js +228 -0
- package/dist/src/lib/sync-selectors.js.map +1 -0
- package/dist/src/lib/template.d.ts +170 -0
- package/dist/src/lib/template.js +484 -68
- package/dist/src/lib/template.js.map +1 -1
- package/dist/src/lib/test-case-keys.d.ts +29 -0
- package/dist/src/lib/test-case-keys.js +55 -0
- package/dist/src/lib/test-case-keys.js.map +1 -0
- package/dist/src/lib/test-case-variables.d.ts +15 -0
- package/dist/src/lib/test-case-variables.js +29 -0
- package/dist/src/lib/test-case-variables.js.map +1 -0
- package/dist/src/lib/token-inject.d.ts +56 -0
- package/dist/src/lib/token-inject.js +204 -0
- package/dist/src/lib/token-inject.js.map +1 -0
- package/dist/src/lib/toml-database-config.d.ts +123 -0
- package/dist/src/lib/toml-database-config.js +527 -0
- package/dist/src/lib/toml-database-config.js.map +1 -0
- package/dist/src/lib/toml-metadata-config.d.ts +151 -0
- package/dist/src/lib/toml-metadata-config.js +476 -0
- package/dist/src/lib/toml-metadata-config.js.map +1 -0
- package/dist/src/lib/toml-native-form.d.ts +46 -0
- package/dist/src/lib/toml-native-form.js +78 -0
- package/dist/src/lib/toml-native-form.js.map +1 -0
- package/dist/src/lib/toml-params-validator.d.ts +129 -0
- package/dist/src/lib/toml-params-validator.js +298 -0
- package/dist/src/lib/toml-params-validator.js.map +1 -0
- package/dist/src/lib/toml-scalar-edit.d.ts +43 -0
- package/dist/src/lib/toml-scalar-edit.js +283 -0
- package/dist/src/lib/toml-scalar-edit.js.map +1 -0
- package/dist/src/lib/user-selector.d.ts +24 -0
- package/dist/src/lib/user-selector.js +33 -0
- package/dist/src/lib/user-selector.js.map +1 -0
- package/dist/src/lib/version-check.d.ts +35 -0
- package/dist/src/lib/version-check.js +241 -0
- package/dist/src/lib/version-check.js.map +1 -0
- package/dist/src/lib/watch.d.ts +121 -0
- package/dist/src/lib/watch.js +169 -0
- package/dist/src/lib/watch.js.map +1 -0
- package/dist/src/lib/workflow-apply.d.ts +110 -0
- package/dist/src/lib/workflow-apply.js +164 -0
- package/dist/src/lib/workflow-apply.js.map +1 -0
- package/dist/src/lib/workflow-codegen/generated-schema-descriptor.d.ts +129 -0
- package/dist/src/lib/workflow-codegen/generated-schema-descriptor.js +269 -0
- package/dist/src/lib/workflow-codegen/generated-schema-descriptor.js.map +1 -0
- package/dist/src/lib/workflow-codegen/generator.d.ts +96 -0
- package/dist/src/lib/workflow-codegen/generator.js +361 -0
- package/dist/src/lib/workflow-codegen/generator.js.map +1 -0
- package/dist/src/lib/workflow-codegen/invokerIR.d.ts +94 -0
- package/dist/src/lib/workflow-codegen/invokerIR.js +76 -0
- package/dist/src/lib/workflow-codegen/invokerIR.js.map +1 -0
- package/dist/src/lib/workflow-codegen/naming.d.ts +33 -0
- package/dist/src/lib/workflow-codegen/naming.js +81 -0
- package/dist/src/lib/workflow-codegen/naming.js.map +1 -0
- package/dist/src/lib/workflow-codegen/schemaToTs.d.ts +80 -0
- package/dist/src/lib/workflow-codegen/schemaToTs.js +303 -0
- package/dist/src/lib/workflow-codegen/schemaToTs.js.map +1 -0
- package/dist/src/lib/workflow-config-apply.d.ts +70 -0
- package/dist/src/lib/workflow-config-apply.js +137 -0
- package/dist/src/lib/workflow-config-apply.js.map +1 -0
- package/dist/src/lib/workflow-config-sidecar.d.ts +63 -0
- package/dist/src/lib/workflow-config-sidecar.js +96 -0
- package/dist/src/lib/workflow-config-sidecar.js.map +1 -0
- package/dist/src/lib/workflow-defaults.d.ts +29 -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-fragments.d.ts +64 -0
- package/dist/src/lib/workflow-fragments.js +342 -0
- package/dist/src/lib/workflow-fragments.js.map +1 -0
- package/dist/src/lib/workflow-include-preserve.d.ts +76 -0
- package/dist/src/lib/workflow-include-preserve.js +286 -0
- package/dist/src/lib/workflow-include-preserve.js.map +1 -0
- package/dist/src/lib/workflow-payload.d.ts +98 -0
- package/dist/src/lib/workflow-payload.js +178 -0
- package/dist/src/lib/workflow-payload.js.map +1 -0
- package/dist/src/lib/workflow-toml-validator.d.ts +202 -0
- package/dist/src/lib/workflow-toml-validator.js +757 -0
- package/dist/src/lib/workflow-toml-validator.js.map +1 -0
- package/dist/src/types/index.d.ts +581 -0
- package/dist/src/validators.d.ts +65 -0
- package/dist/src/validators.js +64 -0
- package/dist/src/validators.js.map +1 -0
- package/package.json +32 -8
|
@@ -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, formatId, formatDate, json, } from "../lib/output.js";
|
|
4
|
+
import { confirmPrompt } from "../lib/confirm-prompt.js";
|
|
4
5
|
export function registerUsersCommands(program) {
|
|
5
6
|
const users = program
|
|
6
7
|
.command("users")
|
|
@@ -8,23 +9,40 @@ export function registerUsersCommands(program) {
|
|
|
8
9
|
.addHelpText("after", `
|
|
9
10
|
Examples:
|
|
10
11
|
$ primitive users list
|
|
12
|
+
$ primitive users create user@example.com --role admin
|
|
11
13
|
$ primitive users invite user@example.com --role admin
|
|
12
14
|
$ primitive users set-role 01HXY... member
|
|
15
|
+
$ primitive users mint-jwt <user-id>
|
|
13
16
|
`);
|
|
14
17
|
// List users
|
|
15
18
|
users
|
|
16
19
|
.command("list")
|
|
17
|
-
.description("List users in an app")
|
|
20
|
+
.description("List users in an app, optionally filtered by --search")
|
|
18
21
|
.argument("[app-id]", "App ID (uses current app if not specified)")
|
|
19
22
|
.option("--app <app-id>", "App ID")
|
|
23
|
+
.option("--search <query>", "Filter users. ULID -> userId lookup; contains '@' -> email lookup; otherwise substring name search.")
|
|
20
24
|
.option("--json", "Output as JSON")
|
|
21
25
|
.action(async (appId, options) => {
|
|
22
26
|
const resolvedAppId = resolveAppId(appId, options);
|
|
23
27
|
const client = new ApiClient();
|
|
28
|
+
const params = {};
|
|
29
|
+
if (options.search) {
|
|
30
|
+
const q = String(options.search).trim();
|
|
31
|
+
// ULID is exactly 26 chars from Crockford's base32 alphabet (excludes I,L,O,U).
|
|
32
|
+
// Match case-insensitively because users paste IDs from various sources.
|
|
33
|
+
const isUlid = /^[0-9A-HJKMNP-TV-Z]{26}$/i.test(q);
|
|
34
|
+
if (isUlid)
|
|
35
|
+
params.userId = q;
|
|
36
|
+
else if (q.includes("@"))
|
|
37
|
+
params.email = q;
|
|
38
|
+
else
|
|
39
|
+
params.name = q;
|
|
40
|
+
}
|
|
24
41
|
try {
|
|
25
|
-
const
|
|
42
|
+
const result = await client.listUsers(resolvedAppId, params);
|
|
43
|
+
const usersList = result.items;
|
|
26
44
|
if (options.json) {
|
|
27
|
-
json(
|
|
45
|
+
json(result);
|
|
28
46
|
return;
|
|
29
47
|
}
|
|
30
48
|
if (!usersList || usersList.length === 0) {
|
|
@@ -36,8 +54,98 @@ Examples:
|
|
|
36
54
|
{ header: "EMAIL", key: "email" },
|
|
37
55
|
{ header: "NAME", key: "name" },
|
|
38
56
|
{ header: "ROLE", key: "role" },
|
|
57
|
+
// #2803 — a disabled user rendered exactly like an active one, so
|
|
58
|
+
// the list said nothing about the state the console could put them
|
|
59
|
+
// in. `disabled` reads plainly next to the role.
|
|
60
|
+
{
|
|
61
|
+
header: "STATUS",
|
|
62
|
+
key: "status",
|
|
63
|
+
format: (value) => String(value || "active") === "disabled" ? "disabled" : "active",
|
|
64
|
+
},
|
|
39
65
|
{ header: "ADDED", key: "addedAt", format: formatDate },
|
|
40
66
|
]));
|
|
67
|
+
if (result.nextCursor) {
|
|
68
|
+
info(`(${usersList.length}+ shown — more pages available)`);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
catch (err) {
|
|
72
|
+
error(err.message);
|
|
73
|
+
process.exit(1);
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
// Create user (add by email)
|
|
77
|
+
users
|
|
78
|
+
.command("create")
|
|
79
|
+
.description("Create a user in an app (or add an existing user by email)")
|
|
80
|
+
.argument("<email>", "Email address")
|
|
81
|
+
.option("--role <role>", "Role: admin or member", "member")
|
|
82
|
+
.option("--app <app-id>", "App ID")
|
|
83
|
+
.option("--json", "Output as JSON")
|
|
84
|
+
.action(async (email, options) => {
|
|
85
|
+
const resolvedAppId = resolveAppId(undefined, options);
|
|
86
|
+
const client = new ApiClient();
|
|
87
|
+
try {
|
|
88
|
+
const result = await client.addUserByEmail(resolvedAppId, {
|
|
89
|
+
email,
|
|
90
|
+
role: options.role,
|
|
91
|
+
});
|
|
92
|
+
if (options.json) {
|
|
93
|
+
json(result);
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
success(result.message || `User ${email} added.`);
|
|
97
|
+
if (result.userId)
|
|
98
|
+
keyValue("User ID", result.userId);
|
|
99
|
+
if (result.email)
|
|
100
|
+
keyValue("Email", result.email);
|
|
101
|
+
}
|
|
102
|
+
catch (err) {
|
|
103
|
+
error(err.message);
|
|
104
|
+
process.exit(1);
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
// Mint test JWT
|
|
108
|
+
users
|
|
109
|
+
.command("mint-jwt")
|
|
110
|
+
.description("Mint a test JWT for a user (dev/test environments only)")
|
|
111
|
+
.argument("<user-id>", "User ID")
|
|
112
|
+
.option("--role <role>", "Role override for the JWT")
|
|
113
|
+
.option("--app <app-id>", "App ID")
|
|
114
|
+
.option("--json", "Output as JSON")
|
|
115
|
+
.action(async (userId, options) => {
|
|
116
|
+
const resolvedAppId = resolveAppId(undefined, options);
|
|
117
|
+
const client = new ApiClient();
|
|
118
|
+
try {
|
|
119
|
+
const result = await client.mintTestJwt(resolvedAppId, userId, options.role);
|
|
120
|
+
if (options.json) {
|
|
121
|
+
json(result);
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
success("JWT minted.");
|
|
125
|
+
console.log(result.token);
|
|
126
|
+
}
|
|
127
|
+
catch (err) {
|
|
128
|
+
error(err.message);
|
|
129
|
+
process.exit(1);
|
|
130
|
+
}
|
|
131
|
+
});
|
|
132
|
+
// Rebuild User._searchText (super-admin only)
|
|
133
|
+
users
|
|
134
|
+
.command("rebuild-search-text")
|
|
135
|
+
.description("Re-save every user in an app to repopulate User._searchText")
|
|
136
|
+
.argument("[app-id]", "App ID (uses current app if not specified)")
|
|
137
|
+
.option("--app <app-id>", "App ID")
|
|
138
|
+
.option("--json", "Output as JSON")
|
|
139
|
+
.action(async (appId, options) => {
|
|
140
|
+
const resolvedAppId = resolveAppId(appId, options);
|
|
141
|
+
const client = new ApiClient();
|
|
142
|
+
try {
|
|
143
|
+
const result = await client.rebuildUserSearchText(resolvedAppId);
|
|
144
|
+
if (options.json) {
|
|
145
|
+
json(result);
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
success(`Reindexed ${result.count} user(s) in ${resolvedAppId}.`);
|
|
41
149
|
}
|
|
42
150
|
catch (err) {
|
|
43
151
|
error(err.message);
|
|
@@ -54,6 +162,7 @@ Examples:
|
|
|
54
162
|
.option("--role <role>", "Role: admin or member", "member")
|
|
55
163
|
.option("--send-email", "Send invitation email")
|
|
56
164
|
.option("--expires-days <days>", "Days until invitation expires", "7")
|
|
165
|
+
.option("--note <note>", "Personal note to include in the invitation email")
|
|
57
166
|
.option("--json", "Output as JSON")
|
|
58
167
|
.action(async (appIdOrEmail, emailOrUndefined, options) => {
|
|
59
168
|
// Handle argument flexibility
|
|
@@ -79,11 +188,17 @@ Examples:
|
|
|
79
188
|
}
|
|
80
189
|
const client = new ApiClient();
|
|
81
190
|
try {
|
|
191
|
+
// When inviting as admin, create the console admin first — the backend
|
|
192
|
+
// enforces the 3-admin limit (single source of truth)
|
|
193
|
+
if (options.role === "admin") {
|
|
194
|
+
await client.addAppAdmin(resolvedAppId, { adminEmail: email });
|
|
195
|
+
}
|
|
82
196
|
const result = await client.createInvitation(resolvedAppId, {
|
|
83
197
|
email,
|
|
84
198
|
role: options.role,
|
|
85
199
|
expiresInDays: parseInt(options.expiresDays),
|
|
86
200
|
sendEmail: options.sendEmail || false,
|
|
201
|
+
...(options.note ? { note: options.note } : {}),
|
|
87
202
|
});
|
|
88
203
|
if (options.json) {
|
|
89
204
|
json(result);
|
|
@@ -101,7 +216,7 @@ Examples:
|
|
|
101
216
|
// Remove user
|
|
102
217
|
users
|
|
103
218
|
.command("remove")
|
|
104
|
-
.description("Remove a user
|
|
219
|
+
.description("Remove a user's membership of an app. To block sign-in without removing them, use `users disable`.")
|
|
105
220
|
.argument("[app-id]", "App ID (uses current app if not specified)")
|
|
106
221
|
.argument("<user-id>", "User ID to remove")
|
|
107
222
|
.option("--app <app-id>", "App ID")
|
|
@@ -123,15 +238,14 @@ Examples:
|
|
|
123
238
|
process.exit(1);
|
|
124
239
|
}
|
|
125
240
|
if (!options.yes) {
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
{
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
]);
|
|
241
|
+
let confirm;
|
|
242
|
+
try {
|
|
243
|
+
confirm = await confirmPrompt(`Remove user ${userId} from app?`);
|
|
244
|
+
}
|
|
245
|
+
catch (err) {
|
|
246
|
+
error(err.message);
|
|
247
|
+
process.exit(1);
|
|
248
|
+
}
|
|
135
249
|
if (!confirm) {
|
|
136
250
|
info("Cancelled.");
|
|
137
251
|
return;
|
|
@@ -147,6 +261,89 @@ Examples:
|
|
|
147
261
|
process.exit(1);
|
|
148
262
|
}
|
|
149
263
|
});
|
|
264
|
+
// #2803 — an app user could be disabled from the console but not from the
|
|
265
|
+
// CLI, and the console could not undo it. Both routes already existed; the
|
|
266
|
+
// operational control just was not reachable. Deliberately distinct from
|
|
267
|
+
// `users remove`, which detaches the membership: disabling blocks the
|
|
268
|
+
// person's auth in this app and is reversible.
|
|
269
|
+
users
|
|
270
|
+
.command("disable")
|
|
271
|
+
.description("Block a user from signing in to an app. Revokes their sessions and API tokens; reversible with `users enable`.")
|
|
272
|
+
.argument("[app-id]", "App ID (uses current app if not specified)")
|
|
273
|
+
.argument("<user-id>", "User ID to disable")
|
|
274
|
+
.option("--app <app-id>", "App ID")
|
|
275
|
+
.option("-y, --yes", "Skip confirmation prompt")
|
|
276
|
+
.action(async (appIdOrUserId, userIdOrUndefined, options) => {
|
|
277
|
+
let resolvedAppId;
|
|
278
|
+
let userId;
|
|
279
|
+
if (userIdOrUndefined) {
|
|
280
|
+
resolvedAppId = resolveAppId(appIdOrUserId, options);
|
|
281
|
+
userId = userIdOrUndefined;
|
|
282
|
+
}
|
|
283
|
+
else {
|
|
284
|
+
resolvedAppId = resolveAppId(undefined, options);
|
|
285
|
+
userId = appIdOrUserId;
|
|
286
|
+
}
|
|
287
|
+
if (!userId) {
|
|
288
|
+
error("User ID is required.");
|
|
289
|
+
process.exit(1);
|
|
290
|
+
}
|
|
291
|
+
if (!options.yes) {
|
|
292
|
+
let confirm;
|
|
293
|
+
try {
|
|
294
|
+
confirm = await confirmPrompt(`Disable user ${userId}? They will be signed out and unable to sign in.`);
|
|
295
|
+
}
|
|
296
|
+
catch (err) {
|
|
297
|
+
error(err.message);
|
|
298
|
+
process.exit(1);
|
|
299
|
+
}
|
|
300
|
+
if (!confirm) {
|
|
301
|
+
info("Cancelled.");
|
|
302
|
+
return;
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
const client = new ApiClient();
|
|
306
|
+
try {
|
|
307
|
+
await client.setUserAvailability(resolvedAppId, userId, "disable");
|
|
308
|
+
success(`User ${userId} disabled.`);
|
|
309
|
+
info("Their membership is unchanged — `primitive users enable` restores access.");
|
|
310
|
+
}
|
|
311
|
+
catch (err) {
|
|
312
|
+
error(err.message);
|
|
313
|
+
process.exit(1);
|
|
314
|
+
}
|
|
315
|
+
});
|
|
316
|
+
users
|
|
317
|
+
.command("enable")
|
|
318
|
+
.description("Restore a disabled user's access to an app.")
|
|
319
|
+
.argument("[app-id]", "App ID (uses current app if not specified)")
|
|
320
|
+
.argument("<user-id>", "User ID to enable")
|
|
321
|
+
.option("--app <app-id>", "App ID")
|
|
322
|
+
.action(async (appIdOrUserId, userIdOrUndefined, options) => {
|
|
323
|
+
let resolvedAppId;
|
|
324
|
+
let userId;
|
|
325
|
+
if (userIdOrUndefined) {
|
|
326
|
+
resolvedAppId = resolveAppId(appIdOrUserId, options);
|
|
327
|
+
userId = userIdOrUndefined;
|
|
328
|
+
}
|
|
329
|
+
else {
|
|
330
|
+
resolvedAppId = resolveAppId(undefined, options);
|
|
331
|
+
userId = appIdOrUserId;
|
|
332
|
+
}
|
|
333
|
+
if (!userId) {
|
|
334
|
+
error("User ID is required.");
|
|
335
|
+
process.exit(1);
|
|
336
|
+
}
|
|
337
|
+
const client = new ApiClient();
|
|
338
|
+
try {
|
|
339
|
+
await client.setUserAvailability(resolvedAppId, userId, "enable");
|
|
340
|
+
success(`User ${userId} enabled.`);
|
|
341
|
+
}
|
|
342
|
+
catch (err) {
|
|
343
|
+
error(err.message);
|
|
344
|
+
process.exit(1);
|
|
345
|
+
}
|
|
346
|
+
});
|
|
150
347
|
// Set user role
|
|
151
348
|
users
|
|
152
349
|
.command("set-role")
|
|
@@ -218,15 +415,14 @@ Examples:
|
|
|
218
415
|
process.exit(1);
|
|
219
416
|
}
|
|
220
417
|
if (!options.yes) {
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
{
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
]);
|
|
418
|
+
let confirm;
|
|
419
|
+
try {
|
|
420
|
+
confirm = await confirmPrompt(`Transfer ownership of app to ${target}? This cannot be undone.`);
|
|
421
|
+
}
|
|
422
|
+
catch (err) {
|
|
423
|
+
error(err.message);
|
|
424
|
+
process.exit(1);
|
|
425
|
+
}
|
|
230
426
|
if (!confirm) {
|
|
231
427
|
info("Cancelled.");
|
|
232
428
|
return;
|
|
@@ -260,7 +456,8 @@ Examples:
|
|
|
260
456
|
const resolvedAppId = resolveAppId(appId, options);
|
|
261
457
|
const client = new ApiClient();
|
|
262
458
|
try {
|
|
263
|
-
const
|
|
459
|
+
const result = await client.listInvitations(resolvedAppId);
|
|
460
|
+
const invitations = result.items;
|
|
264
461
|
if (options.json) {
|
|
265
462
|
json(invitations);
|
|
266
463
|
return;
|
|
@@ -281,5 +478,317 @@ Examples:
|
|
|
281
478
|
process.exit(1);
|
|
282
479
|
}
|
|
283
480
|
});
|
|
481
|
+
// --- Console admins subcommands ---
|
|
482
|
+
const admins = users
|
|
483
|
+
.command("admins")
|
|
484
|
+
.description("Manage console admins for an app");
|
|
485
|
+
// List console admins
|
|
486
|
+
admins
|
|
487
|
+
.command("list")
|
|
488
|
+
.description("List console admins for an app")
|
|
489
|
+
.argument("[app-id]", "App ID (uses current app if not specified)")
|
|
490
|
+
.option("--app <app-id>", "App ID")
|
|
491
|
+
.option("--json", "Output as JSON")
|
|
492
|
+
.action(async (appId, options) => {
|
|
493
|
+
const resolvedAppId = resolveAppId(appId, options);
|
|
494
|
+
const client = new ApiClient();
|
|
495
|
+
try {
|
|
496
|
+
const adminsList = await client.listAppAdmins(resolvedAppId);
|
|
497
|
+
if (options.json) {
|
|
498
|
+
json(adminsList);
|
|
499
|
+
return;
|
|
500
|
+
}
|
|
501
|
+
if (!adminsList || adminsList.length === 0) {
|
|
502
|
+
info("No console admins found.");
|
|
503
|
+
return;
|
|
504
|
+
}
|
|
505
|
+
console.log(formatTable(adminsList, [
|
|
506
|
+
{ header: "ADMIN ID", key: "adminId", format: formatId },
|
|
507
|
+
{ header: "EMAIL", key: "email" },
|
|
508
|
+
{ header: "NAME", key: "name" },
|
|
509
|
+
{ header: "ROLE", key: "role" },
|
|
510
|
+
{ header: "ASSIGNED", key: "assignedAt", format: formatDate },
|
|
511
|
+
]));
|
|
512
|
+
}
|
|
513
|
+
catch (err) {
|
|
514
|
+
error(err.message);
|
|
515
|
+
process.exit(1);
|
|
516
|
+
}
|
|
517
|
+
});
|
|
518
|
+
// Add console admin
|
|
519
|
+
admins
|
|
520
|
+
.command("add")
|
|
521
|
+
.description("Add a console admin to an app (creates invitation if admin account doesn't exist)")
|
|
522
|
+
.argument("[app-id-or-email]", "App ID or admin email")
|
|
523
|
+
.argument("[email]", "Admin email address (if first arg is app ID)")
|
|
524
|
+
.option("--app <app-id>", "App ID")
|
|
525
|
+
.option("--json", "Output as JSON")
|
|
526
|
+
.action(async (appIdOrEmail, emailOrUndefined, options) => {
|
|
527
|
+
let resolvedAppId;
|
|
528
|
+
let email;
|
|
529
|
+
if (emailOrUndefined && !emailOrUndefined.startsWith("-")) {
|
|
530
|
+
resolvedAppId = resolveAppId(appIdOrEmail, options);
|
|
531
|
+
email = emailOrUndefined;
|
|
532
|
+
}
|
|
533
|
+
else if (appIdOrEmail?.includes("@")) {
|
|
534
|
+
resolvedAppId = resolveAppId(undefined, options);
|
|
535
|
+
email = appIdOrEmail;
|
|
536
|
+
}
|
|
537
|
+
else {
|
|
538
|
+
resolvedAppId = resolveAppId(appIdOrEmail, options);
|
|
539
|
+
email = emailOrUndefined;
|
|
540
|
+
}
|
|
541
|
+
if (!email) {
|
|
542
|
+
error("Email is required.");
|
|
543
|
+
process.exit(1);
|
|
544
|
+
}
|
|
545
|
+
const client = new ApiClient();
|
|
546
|
+
try {
|
|
547
|
+
const result = await client.addAppAdmin(resolvedAppId, {
|
|
548
|
+
adminEmail: email,
|
|
549
|
+
});
|
|
550
|
+
// Also create an app-level invitation with role "admin"
|
|
551
|
+
try {
|
|
552
|
+
await client.createInvitation(resolvedAppId, {
|
|
553
|
+
email,
|
|
554
|
+
role: "admin",
|
|
555
|
+
expiresInDays: 7,
|
|
556
|
+
sendEmail: false,
|
|
557
|
+
});
|
|
558
|
+
}
|
|
559
|
+
catch {
|
|
560
|
+
// Non-fatal: console admin was created, app invitation may already exist
|
|
561
|
+
}
|
|
562
|
+
if (options.json) {
|
|
563
|
+
json(result);
|
|
564
|
+
return;
|
|
565
|
+
}
|
|
566
|
+
if (result.status === "invited") {
|
|
567
|
+
success(`Invitation sent to ${email}`);
|
|
568
|
+
if (result.invitation) {
|
|
569
|
+
keyValue("Invitation ID", result.invitation.invitationId);
|
|
570
|
+
if (result.invitation.expiresAt) {
|
|
571
|
+
keyValue("Expires", formatDate(result.invitation.expiresAt));
|
|
572
|
+
}
|
|
573
|
+
}
|
|
574
|
+
}
|
|
575
|
+
else {
|
|
576
|
+
success(result.message || `Admin ${email} added.`);
|
|
577
|
+
if (result.admin) {
|
|
578
|
+
keyValue("Admin ID", result.admin.adminId);
|
|
579
|
+
}
|
|
580
|
+
}
|
|
581
|
+
}
|
|
582
|
+
catch (err) {
|
|
583
|
+
error(err.message);
|
|
584
|
+
process.exit(1);
|
|
585
|
+
}
|
|
586
|
+
});
|
|
587
|
+
// Remove console admin
|
|
588
|
+
admins
|
|
589
|
+
.command("remove")
|
|
590
|
+
.description("Remove a console admin from an app")
|
|
591
|
+
.argument("[app-id-or-admin-id]", "App ID or admin ID")
|
|
592
|
+
.argument("[admin-id]", "Admin ID (if first arg is app ID)")
|
|
593
|
+
.option("--app <app-id>", "App ID")
|
|
594
|
+
.option("-y, --yes", "Skip confirmation prompt")
|
|
595
|
+
.action(async (appIdOrAdminId, adminIdOrUndefined, options) => {
|
|
596
|
+
let resolvedAppId;
|
|
597
|
+
let adminId;
|
|
598
|
+
if (adminIdOrUndefined && !adminIdOrUndefined.startsWith("-")) {
|
|
599
|
+
resolvedAppId = resolveAppId(appIdOrAdminId, options);
|
|
600
|
+
adminId = adminIdOrUndefined;
|
|
601
|
+
}
|
|
602
|
+
else {
|
|
603
|
+
resolvedAppId = resolveAppId(undefined, options);
|
|
604
|
+
adminId = appIdOrAdminId;
|
|
605
|
+
}
|
|
606
|
+
if (!adminId) {
|
|
607
|
+
error("Admin ID is required.");
|
|
608
|
+
process.exit(1);
|
|
609
|
+
}
|
|
610
|
+
if (!options.yes) {
|
|
611
|
+
let confirm;
|
|
612
|
+
try {
|
|
613
|
+
confirm = await confirmPrompt(`Remove admin ${adminId} from app?`);
|
|
614
|
+
}
|
|
615
|
+
catch (err) {
|
|
616
|
+
error(err.message);
|
|
617
|
+
process.exit(1);
|
|
618
|
+
}
|
|
619
|
+
if (!confirm) {
|
|
620
|
+
info("Cancelled.");
|
|
621
|
+
return;
|
|
622
|
+
}
|
|
623
|
+
}
|
|
624
|
+
const client = new ApiClient();
|
|
625
|
+
try {
|
|
626
|
+
await client.removeAppAdmin(resolvedAppId, adminId);
|
|
627
|
+
success(`Admin ${adminId} removed.`);
|
|
628
|
+
}
|
|
629
|
+
catch (err) {
|
|
630
|
+
error(err.message);
|
|
631
|
+
process.exit(1);
|
|
632
|
+
}
|
|
633
|
+
});
|
|
634
|
+
// Transfer ownership
|
|
635
|
+
admins
|
|
636
|
+
.command("transfer-owner")
|
|
637
|
+
.description("Transfer app ownership to another admin")
|
|
638
|
+
.argument("[app-id-or-target]", "App ID or new owner's email/admin ID")
|
|
639
|
+
.argument("[email-or-admin-id]", "New owner's email or admin ID (if first arg is app ID)")
|
|
640
|
+
.option("--app <app-id>", "App ID")
|
|
641
|
+
.option("-y, --yes", "Skip confirmation prompt")
|
|
642
|
+
.action(async (appIdOrTarget, targetOrUndefined, options) => {
|
|
643
|
+
let resolvedAppId;
|
|
644
|
+
let target;
|
|
645
|
+
if (targetOrUndefined && !targetOrUndefined.startsWith("-")) {
|
|
646
|
+
resolvedAppId = resolveAppId(appIdOrTarget, options);
|
|
647
|
+
target = targetOrUndefined;
|
|
648
|
+
}
|
|
649
|
+
else {
|
|
650
|
+
resolvedAppId = resolveAppId(undefined, options);
|
|
651
|
+
target = appIdOrTarget;
|
|
652
|
+
}
|
|
653
|
+
if (!target) {
|
|
654
|
+
error("New owner email or admin ID is required.");
|
|
655
|
+
process.exit(1);
|
|
656
|
+
}
|
|
657
|
+
if (!options.yes) {
|
|
658
|
+
let confirm;
|
|
659
|
+
try {
|
|
660
|
+
confirm = await confirmPrompt(`Transfer ownership of app to ${target}? This cannot be undone.`);
|
|
661
|
+
}
|
|
662
|
+
catch (err) {
|
|
663
|
+
error(err.message);
|
|
664
|
+
process.exit(1);
|
|
665
|
+
}
|
|
666
|
+
if (!confirm) {
|
|
667
|
+
info("Cancelled.");
|
|
668
|
+
return;
|
|
669
|
+
}
|
|
670
|
+
}
|
|
671
|
+
const client = new ApiClient();
|
|
672
|
+
try {
|
|
673
|
+
if (target.includes("@")) {
|
|
674
|
+
await client.transferOwnership(resolvedAppId, target);
|
|
675
|
+
}
|
|
676
|
+
else {
|
|
677
|
+
await client.transferAdminOwnership(resolvedAppId, target);
|
|
678
|
+
}
|
|
679
|
+
success(`Ownership transferred to ${target}`);
|
|
680
|
+
}
|
|
681
|
+
catch (err) {
|
|
682
|
+
error(err.message);
|
|
683
|
+
process.exit(1);
|
|
684
|
+
}
|
|
685
|
+
});
|
|
686
|
+
// --- Admin invitations subcommands ---
|
|
687
|
+
const adminInvitations = users
|
|
688
|
+
.command("admin-invitations")
|
|
689
|
+
.description("Manage console admin invitations for an app");
|
|
690
|
+
// List admin invitations
|
|
691
|
+
adminInvitations
|
|
692
|
+
.command("list")
|
|
693
|
+
.description("List pending console admin invitations")
|
|
694
|
+
.argument("[app-id]", "App ID (uses current app if not specified)")
|
|
695
|
+
.option("--app <app-id>", "App ID")
|
|
696
|
+
.option("--json", "Output as JSON")
|
|
697
|
+
.action(async (appId, options) => {
|
|
698
|
+
const resolvedAppId = resolveAppId(appId, options);
|
|
699
|
+
const client = new ApiClient();
|
|
700
|
+
try {
|
|
701
|
+
const invitationsList = await client.listAppAdminInvitations(resolvedAppId);
|
|
702
|
+
if (options.json) {
|
|
703
|
+
json(invitationsList);
|
|
704
|
+
return;
|
|
705
|
+
}
|
|
706
|
+
if (!invitationsList || invitationsList.length === 0) {
|
|
707
|
+
info("No pending admin invitations.");
|
|
708
|
+
return;
|
|
709
|
+
}
|
|
710
|
+
console.log(formatTable(invitationsList, [
|
|
711
|
+
{ header: "ID", key: "invitationId", format: formatId },
|
|
712
|
+
{ header: "EMAIL", key: "email" },
|
|
713
|
+
{ header: "ROLE", key: "role" },
|
|
714
|
+
{ header: "INVITED", key: "invitedAt", format: formatDate },
|
|
715
|
+
{ header: "EXPIRES", key: "expiresAt", format: formatDate },
|
|
716
|
+
]));
|
|
717
|
+
}
|
|
718
|
+
catch (err) {
|
|
719
|
+
error(err.message);
|
|
720
|
+
process.exit(1);
|
|
721
|
+
}
|
|
722
|
+
});
|
|
723
|
+
// Delete admin invitation
|
|
724
|
+
adminInvitations
|
|
725
|
+
.command("delete")
|
|
726
|
+
.description("Delete a pending console admin invitation")
|
|
727
|
+
.argument("[app-id-or-inv-id]", "App ID or invitation ID")
|
|
728
|
+
.argument("[invitation-id]", "Invitation ID (if first arg is app ID)")
|
|
729
|
+
.option("--app <app-id>", "App ID")
|
|
730
|
+
.option("-y, --yes", "Skip confirmation prompt")
|
|
731
|
+
.action(async (appIdOrInvId, invIdOrUndefined, options) => {
|
|
732
|
+
let resolvedAppId;
|
|
733
|
+
let invitationId;
|
|
734
|
+
if (invIdOrUndefined && !invIdOrUndefined.startsWith("-")) {
|
|
735
|
+
resolvedAppId = resolveAppId(appIdOrInvId, options);
|
|
736
|
+
invitationId = invIdOrUndefined;
|
|
737
|
+
}
|
|
738
|
+
else {
|
|
739
|
+
resolvedAppId = resolveAppId(undefined, options);
|
|
740
|
+
invitationId = appIdOrInvId;
|
|
741
|
+
}
|
|
742
|
+
if (!invitationId) {
|
|
743
|
+
error("Invitation ID is required.");
|
|
744
|
+
process.exit(1);
|
|
745
|
+
}
|
|
746
|
+
if (!options.yes) {
|
|
747
|
+
let confirm;
|
|
748
|
+
try {
|
|
749
|
+
confirm = await confirmPrompt(`Delete admin invitation ${invitationId}?`);
|
|
750
|
+
}
|
|
751
|
+
catch (err) {
|
|
752
|
+
error(err.message);
|
|
753
|
+
process.exit(1);
|
|
754
|
+
}
|
|
755
|
+
if (!confirm) {
|
|
756
|
+
info("Cancelled.");
|
|
757
|
+
return;
|
|
758
|
+
}
|
|
759
|
+
}
|
|
760
|
+
const client = new ApiClient();
|
|
761
|
+
try {
|
|
762
|
+
// Look up the admin invitation's email before deleting, so we can cross-delete
|
|
763
|
+
let invEmail;
|
|
764
|
+
try {
|
|
765
|
+
const adminInvitations = await client.listAppAdminInvitations(resolvedAppId);
|
|
766
|
+
const match = adminInvitations.find((inv) => inv.invitationId === invitationId);
|
|
767
|
+
invEmail = match?.email;
|
|
768
|
+
}
|
|
769
|
+
catch {
|
|
770
|
+
// Non-fatal
|
|
771
|
+
}
|
|
772
|
+
await client.deleteAppAdminInvitation(resolvedAppId, invitationId);
|
|
773
|
+
// Cross-delete matching app-level invitations by email
|
|
774
|
+
if (invEmail) {
|
|
775
|
+
try {
|
|
776
|
+
const appInvitations = await client.listInvitations(resolvedAppId);
|
|
777
|
+
const matching = appInvitations.items.filter((inv) => inv.email === invEmail && !inv.accepted);
|
|
778
|
+
for (const inv of matching) {
|
|
779
|
+
await client.deleteInvitation(resolvedAppId, inv.invitationId);
|
|
780
|
+
}
|
|
781
|
+
}
|
|
782
|
+
catch {
|
|
783
|
+
// Non-fatal
|
|
784
|
+
}
|
|
785
|
+
}
|
|
786
|
+
success(`Invitation ${invitationId} deleted.`);
|
|
787
|
+
}
|
|
788
|
+
catch (err) {
|
|
789
|
+
error(err.message);
|
|
790
|
+
process.exit(1);
|
|
791
|
+
}
|
|
792
|
+
});
|
|
284
793
|
}
|
|
285
794
|
//# sourceMappingURL=users.js.map
|