@seekrit/cli 0.46.0 → 0.47.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/index.js +150 -6
  2. package/package.json +3 -3
package/dist/index.js CHANGED
@@ -2481,7 +2481,8 @@ const SYNC_PROVIDER_KINDS = [
2481
2481
  "bunnyshell",
2482
2482
  "github-actions",
2483
2483
  "gcp-secret-manager",
2484
- "langgraph-platform"
2484
+ "langgraph-platform",
2485
+ "azure-key-vault"
2485
2486
  ];
2486
2487
  z.enum(SYNC_PROVIDER_KINDS);
2487
2488
  /**
@@ -2822,6 +2823,54 @@ const langgraphPlatformConnectionConfigSchema = z.object({
2822
2823
  message: "set region for a LangChain-hosted account or baseUrl for a self-hosted one, not both",
2823
2824
  path: ["baseUrl"]
2824
2825
  });
2826
+ /**
2827
+ * The Azure clouds a vault can live in.
2828
+ *
2829
+ * Unlike AWS, where the China partition can be read off the region string
2830
+ * (`cn-…`), nothing about a tenant id or a vault name says which cloud it
2831
+ * belongs to — and two hosts have to agree with the answer: the Entra authority
2832
+ * that issues the token and the DNS suffix the vault answers on. Getting either
2833
+ * wrong is a failure inside an alarm with nobody watching, so it is stated.
2834
+ */
2835
+ const AZURE_CLOUDS = [
2836
+ "public",
2837
+ "usgov",
2838
+ "china"
2839
+ ];
2840
+ /**
2841
+ * A Microsoft Entra directory (tenant) or application (client) id.
2842
+ *
2843
+ * Both are GUIDs. Entra accepts a verified domain name in place of a tenant id
2844
+ * in the token URL, but not a client id, and taking only the GUID for both
2845
+ * keeps one rule — a tenant's GUID is on the same admin-center page as the
2846
+ * client id it pairs with, so nothing is harder to find.
2847
+ */
2848
+ const azureGuidSchema = z.string().trim().regex(/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i, "must be a GUID, as the Entra admin center shows it");
2849
+ /**
2850
+ * Azure account scope: which directory to authenticate against, as which app.
2851
+ *
2852
+ * The split follows AWS's, and for the same reason. A service principal's
2853
+ * **client secret** is the credential and is wrapped to the connection's key;
2854
+ * the tenant and client ids are *identifiers* — they appear in the token
2855
+ * request URL, in sign-in logs, and on the app registration blade. Keeping them
2856
+ * here lets the dashboard say which principal a connection authenticates as,
2857
+ * which is the first thing worth knowing when a connection starts failing after
2858
+ * a secret expires.
2859
+ *
2860
+ * Client secrets are the only credential kind here: a certificate or federated
2861
+ * credential would need a private key or a trust relationship the sync engine
2862
+ * has nowhere to keep, and Entra caps a client secret at 24 months, which is a
2863
+ * rotation the connection's `lastError` will make loud.
2864
+ */
2865
+ const azureKeyVaultConnectionConfigSchema = z.object({
2866
+ provider: z.literal("azure-key-vault"),
2867
+ /** Entra directory (tenant) ID. */
2868
+ tenantId: azureGuidSchema,
2869
+ /** Application (client) ID of the service principal seekrit signs in as. */
2870
+ clientId: azureGuidSchema,
2871
+ /** Which Azure cloud the tenant and its vaults live in. */
2872
+ cloud: z.enum(AZURE_CLOUDS).default("public")
2873
+ });
2825
2874
  const syncConnectionConfigSchema = z.discriminatedUnion("provider", [
2826
2875
  vercelConnectionConfigSchema,
2827
2876
  cloudflareWorkersConnectionConfigSchema,
@@ -2839,7 +2888,8 @@ const syncConnectionConfigSchema = z.discriminatedUnion("provider", [
2839
2888
  bunnyshellConnectionConfigSchema,
2840
2889
  githubActionsConnectionConfigSchema,
2841
2890
  gcpSecretManagerConnectionConfigSchema,
2842
- langgraphPlatformConnectionConfigSchema
2891
+ langgraphPlatformConnectionConfigSchema,
2892
+ azureKeyVaultConnectionConfigSchema
2843
2893
  ]);
2844
2894
  /** Vercel's three deployment targets. A binding writes to one or more. */
2845
2895
  const VERCEL_TARGETS = [
@@ -3571,6 +3621,65 @@ const langgraphPlatformDestinationSchema = z.object({
3571
3621
  /** Deployment UUID, from the dashboard URL or `GET /v2/deployments`. */
3572
3622
  deploymentId: z.string().trim().regex(/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i, "must be a LangGraph Platform deployment UUID")
3573
3623
  });
3624
+ /**
3625
+ * A Key Vault's name — the leftmost label of its DNS name, so the vault
3626
+ * `acme-prod` answers at `acme-prod.vault.azure.net`.
3627
+ *
3628
+ * Azure's own rule, stated here because the failure it prevents is confusing:
3629
+ * 3–24 characters, alphanumerics and hyphens, starting with a letter, ending
3630
+ * with a letter or digit, and no run of two hyphens. A name that breaks it
3631
+ * cannot exist, so a typo is a DNS failure rather than a 404 — an error that
3632
+ * says nothing about what was wrong.
3633
+ *
3634
+ * The *base URL* is not taken instead. It would let a connection be pointed at
3635
+ * any host, and the whole address seekrit needs is this label plus the cloud
3636
+ * already named on the connection.
3637
+ */
3638
+ const azureVaultNameSchema = z.string().trim().regex(/^[A-Za-z](?!.*--)[A-Za-z0-9-]{1,22}[A-Za-z0-9]$/, "must be a Key Vault name: 3–24 letters, digits, and single hyphens, starting with a letter");
3639
+ /**
3640
+ * What to do with a name Key Vault cannot store.
3641
+ *
3642
+ * Key Vault secret names are `^[0-9a-zA-Z-]+$` — **no underscores** — and
3643
+ * `DATABASE_URL` is what a secret is actually called nearly everywhere. So this
3644
+ * is not an edge case to fail on: it is the common case, and a connector that
3645
+ * rejected it would push nothing at all.
3646
+ *
3647
+ * - `dash` — `_` becomes `-`, so `DATABASE_URL` is stored as `DATABASE-URL`.
3648
+ * The default, and what every other tool bridging this gap does. The rename
3649
+ * is visible: the dashboard and the run ledger both show it.
3650
+ * - `reject` — fail each such name instead, for an operator who would rather
3651
+ * name every secret explicitly with the binding's `rename` than have seekrit
3652
+ * choose. Nothing is renamed silently under either setting; this one just
3653
+ * refuses rather than translating.
3654
+ *
3655
+ * Translating can make two seekrit names collide (`A_B` and `A-B` both give
3656
+ * `A-B`). That is caught per run and fails *both* names rather than letting
3657
+ * whichever sorts last win — the same rule, and the same reasoning, as
3658
+ * {@link mapSecretNames}.
3659
+ */
3660
+ const AZURE_KEY_VAULT_NAME_MODES = ["dash", "reject"];
3661
+ /**
3662
+ * Which vault a binding writes to, and under what names.
3663
+ *
3664
+ * There is no layout choice as Secrets Manager has: the reason a `json-bundle`
3665
+ * exists there is billing — AWS charges per secret per month — and Key Vault
3666
+ * charges per *operation*, so fifty names cost the same stored fifty ways. One
3667
+ * secret per name is simply correct here.
3668
+ */
3669
+ const azureKeyVaultDestinationSchema = z.object({
3670
+ provider: z.literal("azure-key-vault"),
3671
+ /** Vault name, e.g. `acme-prod` for `acme-prod.vault.azure.net`. */
3672
+ vault: azureVaultNameSchema,
3673
+ /**
3674
+ * Prepended to every secret name, e.g. `storefront-`. Key Vault has no
3675
+ * hierarchy — its names are flat, and `/` is not among the characters it
3676
+ * accepts — so unlike Parameter Store's `path` this is a naming convention
3677
+ * and nothing more. Worth setting in a vault that holds anything else.
3678
+ */
3679
+ prefix: z.string().trim().max(64).regex(/^[A-Za-z0-9-]*$/, "may contain letters, digits, and hyphens").optional(),
3680
+ /** What to do with a name Key Vault cannot store — see {@link AZURE_KEY_VAULT_NAME_MODES}. */
3681
+ nameMode: z.enum(AZURE_KEY_VAULT_NAME_MODES).default("dash")
3682
+ });
3574
3683
  const syncDestinationSchema = z.discriminatedUnion("provider", [
3575
3684
  vercelDestinationSchema,
3576
3685
  cloudflareWorkersDestinationSchema,
@@ -3588,7 +3697,8 @@ const syncDestinationSchema = z.discriminatedUnion("provider", [
3588
3697
  bunnyshellDestinationSchema,
3589
3698
  githubActionsDestinationSchema,
3590
3699
  gcpSecretManagerDestinationSchema,
3591
- langgraphPlatformDestinationSchema
3700
+ langgraphPlatformDestinationSchema,
3701
+ azureKeyVaultDestinationSchema
3592
3702
  ]);
3593
3703
  /**
3594
3704
  * How seekrit secret names become destination key names. Applied in order:
@@ -4876,7 +4986,7 @@ async function createAgentTaskToken() {
4876
4986
  }
4877
4987
  //#endregion
4878
4988
  //#region package.json
4879
- var version = "0.46.0";
4989
+ var version = "0.47.0";
4880
4990
  //#endregion
4881
4991
  //#region ../../packages/api-client/src/index.ts
4882
4992
  var SeekritApiError = class extends Error {
@@ -12271,8 +12381,21 @@ function credentialNoun(provider) {
12271
12381
  if (provider.startsWith("aws-")) return "secret access key";
12272
12382
  if (provider === "gcp-secret-manager") return "service-account key JSON";
12273
12383
  if (provider === "langgraph-platform") return "LangSmith API key";
12384
+ if (provider === "azure-key-vault") return "client secret";
12274
12385
  return "API token";
12275
12386
  }
12387
+ /**
12388
+ * Entra takes a verified domain name in place of a tenant id, but never in
12389
+ * place of a client id — so both are held to the GUID, which keeps one rule
12390
+ * and costs nothing: the admin center shows a tenant's GUID on the same page
12391
+ * as the application id it pairs with.
12392
+ */
12393
+ function assertAzureGuid(value, flag, what) {
12394
+ if (!value) fail(`${flag} is required for azure-key-vault (${what})`);
12395
+ const id = value.trim();
12396
+ if (!/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(id)) fail(`${flag} "${id}" is not a GUID — the Entra admin center shows it under ${what}`);
12397
+ return id;
12398
+ }
12276
12399
  /** Account-scope config for a connection (never the credential itself). */
12277
12400
  function buildConfig(provider, options) {
12278
12401
  switch (provider) {
@@ -12338,6 +12461,15 @@ function buildConfig(provider, options) {
12338
12461
  ...options.langgraphTenant ? { tenantId: options.langgraphTenant.trim() } : {}
12339
12462
  };
12340
12463
  }
12464
+ case "azure-key-vault": {
12465
+ const cloud = assertMembers(list(options.azureCloud, "public"), AZURE_CLOUDS, "--azure-cloud")[0];
12466
+ return {
12467
+ provider: "azure-key-vault",
12468
+ tenantId: assertAzureGuid(options.azureTenantId, "--azure-tenant-id", "Directory (tenant) ID"),
12469
+ clientId: assertAzureGuid(options.azureClientId, "--azure-client-id", "Application (client) ID"),
12470
+ cloud: cloud ?? "public"
12471
+ };
12472
+ }
12341
12473
  }
12342
12474
  }
12343
12475
  /** Where inside the platform a binding writes. */
@@ -12540,6 +12672,17 @@ function buildDestination(provider, options) {
12540
12672
  provider: "langgraph-platform",
12541
12673
  deploymentId: assertLanggraphDeploymentId(options.langgraphDeployment)
12542
12674
  };
12675
+ case "azure-key-vault": {
12676
+ if (!options.vault) fail("--vault is required for azure-key-vault — the vault name, e.g. acme-prod");
12677
+ const prefix = options.path?.trim();
12678
+ const nameMode = assertMembers(list(options.nameMode, "dash"), AZURE_KEY_VAULT_NAME_MODES, "--name-mode")[0];
12679
+ return {
12680
+ provider: "azure-key-vault",
12681
+ vault: options.vault.trim(),
12682
+ ...prefix ? { prefix } : {},
12683
+ nameMode: nameMode ?? "dash"
12684
+ };
12685
+ }
12543
12686
  }
12544
12687
  }
12545
12688
  /** One-line description of a destination, for list output. */
@@ -12561,6 +12704,7 @@ function describeDestination(destination) {
12561
12704
  case "bunnyshell": return destination.kind === "environment" ? `environment ${destination.environmentId}` : `project ${destination.projectId} (inherited by new environments)`;
12562
12705
  case "gcp-secret-manager": return destination.layout === "json-bundle" ? `${destination.secretId} · json` : `${destination.idPrefix ?? ""}* · one per name`;
12563
12706
  case "langgraph-platform": return `deployment ${destination.deploymentId}`;
12707
+ case "azure-key-vault": return `${destination.vault}${destination.prefix ? ` (${destination.prefix}*)` : ""}`;
12564
12708
  case "github-actions": switch (destination.kind) {
12565
12709
  case "repo": return `${destination.owner}/${destination.repo}`;
12566
12710
  case "environment": return `${destination.owner}/${destination.repo} @${destination.environment}`;
@@ -12576,7 +12720,7 @@ function describeDestination(destination) {
12576
12720
  * application whose environment the binding reads from.
12577
12721
  */
12578
12722
  function destinationOptions(command) {
12579
- return command.option("--project <id>", "vercel: project id or name · cloudflare-pages / northflank: project name or slug · bunnyshell: project ID (writes variables new environments inherit)").option("--target <list>", "vercel / cloudflare-pages: comma-separated deployment targets", "production").option("--git-branch <branch>", "vercel: restrict preview writes to one branch").option("--script <name>", "cloudflare-workers: Worker script name").option("--store-id <id>", "cloudflare-secrets-store: store ID (32 hex)").option("--scopes <list>", "cloudflare-secrets-store: comma-separated scopes", "workers").option("--railway-project <id>", "railway: project ID (a UUID)").option("--railway-environment <id>", "railway: environment ID (a UUID)").option("--service <id>", "railway: service ID (omit for the environment's shared variables) · render: service ID (srv-…, or crn-… for a cron job)").option("--skip-deploys", "railway: stage values without triggering a redeploy").option("--path <path>", "aws-parameter-store: hierarchy, e.g. /prod/storefront/ · aws-secrets-manager: name prefix").option("--layout <layout>", `aws-secrets-manager: ${AWS_SECRETS_MANAGER_LAYOUTS.join(" | ")}`).option("--secret-name <name>", "aws-secrets-manager: the secret a json-bundle writes to").option("--param-type <type>", `aws-parameter-store: ${AWS_PARAMETER_TYPES.join(" | ")}`).option("--tier <tier>", `aws-parameter-store: ${AWS_PARAMETER_TIERS.join(" | ")}`).option("--kms-key-id <id>", "aws: customer-managed KMS key id, ARN, or alias").option("--env-group <id>", "render: environment group ID (evg-…)").option("--fly-app <name>", "fly: app name, as `fly apps list` shows it").option("--secret-group <id>", "northflank: secret group ID (the slug in its URL)").option("--do-app <id>", "digitalocean: App Platform app ID (the UUID in its URL)").option("--component <name>", "digitalocean: write to one component's variables (omit for app-level)").option("--env-scope <scope>", `digitalocean: ${DIGITALOCEAN_ENV_SCOPES.join(" | ")}`).option("--heroku-app <name>", "heroku: app name, as `heroku apps` shows it (or its UUID)").option("--netlify-site <id>", "netlify: site API ID (the UUID under Project configuration)").option("--no-netlify-secret", "netlify: create readable variables instead of Netlify secrets (write-only)").option("--bunnyshell-environment <id>", "bunnyshell: environment ID (omit to write a project)").option("--no-bunnyshell-secret", "bunnyshell: create variables visible in the dashboard instead of secret ones").option("--gh-repo <owner/name>", "github-actions: repository, e.g. acme/storefront").option("--gh-environment <name>", "github-actions: write to one deployment environment's secrets (needs --gh-repo)").option("--gh-org <login>", "github-actions: write organization secrets instead of a repo's").option("--gh-visibility <v>", `github-actions org secrets: ${GITHUB_ACTIONS_VISIBILITIES.join(" | ")}`).option("--gh-repo-ids <ids>", "github-actions: comma-separated numeric repository IDs for --gh-visibility selected").option("--langgraph-deployment <id>", "langgraph-platform: deployment UUID (the one in its dashboard URL)").option("--gcp-prefix <prefix>", "gcp: prepended to every secret ID, e.g. prod-storefront-").option("--gcp-replication <policy>", `gcp: ${GCP_REPLICATION_POLICIES.join(" | ")}`, "automatic").option("--gcp-locations <list>", "gcp: regions for user-managed replication, e.g. us-east1").option("--gcp-kms-key <name>", "gcp: Cloud KMS key (projects/…/cryptoKeys/…)").option("--gcp-prune-versions", "gcp: destroy the version each push supersedes, keeping one active version");
12723
+ return command.option("--project <id>", "vercel: project id or name · cloudflare-pages / northflank: project name or slug · bunnyshell: project ID (writes variables new environments inherit)").option("--target <list>", "vercel / cloudflare-pages: comma-separated deployment targets", "production").option("--git-branch <branch>", "vercel: restrict preview writes to one branch").option("--script <name>", "cloudflare-workers: Worker script name").option("--store-id <id>", "cloudflare-secrets-store: store ID (32 hex)").option("--scopes <list>", "cloudflare-secrets-store: comma-separated scopes", "workers").option("--railway-project <id>", "railway: project ID (a UUID)").option("--railway-environment <id>", "railway: environment ID (a UUID)").option("--service <id>", "railway: service ID (omit for the environment's shared variables) · render: service ID (srv-…, or crn-… for a cron job)").option("--skip-deploys", "railway: stage values without triggering a redeploy").option("--path <path>", "aws-parameter-store: hierarchy, e.g. /prod/storefront/ · aws-secrets-manager, azure-key-vault: name prefix").option("--layout <layout>", `aws-secrets-manager: ${AWS_SECRETS_MANAGER_LAYOUTS.join(" | ")}`).option("--secret-name <name>", "aws-secrets-manager: the secret a json-bundle writes to").option("--param-type <type>", `aws-parameter-store: ${AWS_PARAMETER_TYPES.join(" | ")}`).option("--tier <tier>", `aws-parameter-store: ${AWS_PARAMETER_TIERS.join(" | ")}`).option("--kms-key-id <id>", "aws: customer-managed KMS key id, ARN, or alias").option("--env-group <id>", "render: environment group ID (evg-…)").option("--fly-app <name>", "fly: app name, as `fly apps list` shows it").option("--secret-group <id>", "northflank: secret group ID (the slug in its URL)").option("--do-app <id>", "digitalocean: App Platform app ID (the UUID in its URL)").option("--component <name>", "digitalocean: write to one component's variables (omit for app-level)").option("--env-scope <scope>", `digitalocean: ${DIGITALOCEAN_ENV_SCOPES.join(" | ")}`).option("--heroku-app <name>", "heroku: app name, as `heroku apps` shows it (or its UUID)").option("--netlify-site <id>", "netlify: site API ID (the UUID under Project configuration)").option("--no-netlify-secret", "netlify: create readable variables instead of Netlify secrets (write-only)").option("--bunnyshell-environment <id>", "bunnyshell: environment ID (omit to write a project)").option("--no-bunnyshell-secret", "bunnyshell: create variables visible in the dashboard instead of secret ones").option("--gh-repo <owner/name>", "github-actions: repository, e.g. acme/storefront").option("--gh-environment <name>", "github-actions: write to one deployment environment's secrets (needs --gh-repo)").option("--gh-org <login>", "github-actions: write organization secrets instead of a repo's").option("--gh-visibility <v>", `github-actions org secrets: ${GITHUB_ACTIONS_VISIBILITIES.join(" | ")}`).option("--gh-repo-ids <ids>", "github-actions: comma-separated numeric repository IDs for --gh-visibility selected").option("--langgraph-deployment <id>", "langgraph-platform: deployment UUID (the one in its dashboard URL)").option("--gcp-prefix <prefix>", "gcp: prepended to every secret ID, e.g. prod-storefront-").option("--gcp-replication <policy>", `gcp: ${GCP_REPLICATION_POLICIES.join(" | ")}`, "automatic").option("--gcp-locations <list>", "gcp: regions for user-managed replication, e.g. us-east1").option("--gcp-kms-key <name>", "gcp: Cloud KMS key (projects/…/cryptoKeys/…)").option("--gcp-prune-versions", "gcp: destroy the version each push supersedes, keeping one active version").option("--vault <name>", "azure-key-vault: vault name, e.g. acme-prod").option("--name-mode <mode>", `azure-key-vault: ${AZURE_KEY_VAULT_NAME_MODES.join(" | ")} — Key Vault stores no underscores, so DATABASE_URL becomes DATABASE-URL unless you reject instead`);
12580
12724
  }
12581
12725
  /** Find a connection by id or name — nobody keeps `syc_…` ids in their head. */
12582
12726
  async function resolveConnection(ctx, orgId, ref) {
@@ -12600,7 +12744,7 @@ function registerSyncCommands(program) {
12600
12744
  col("id", (c) => c.id)
12601
12745
  ], "no connections — add one with `seekrit sync connect`"));
12602
12746
  });
12603
- sync.command("connect").description("register a destination account (reads its API token from stdin)").option("--org <slug>").requiredOption("--name <name>", "what to call this account, e.g. acme-vercel").option("--provider <kind>", SYNC_PROVIDER_KINDS.join(" | "), "vercel").option("--team-id <id>", "vercel: Team id (omit for a personal account)").option("--token-kind <kind>", `railway: ${RAILWAY_TOKEN_KINDS.join(" | ")}`, "account").option("--account-id <id>", "cloudflare: account ID (32 hex, from the dashboard sidebar) · netlify: team slug or account ID").option("--region <region>", "aws: region ID, e.g. us-east-1").option("--access-key-id <id>", "aws: IAM access key ID (the secret key is read from stdin)").option("--base-url <url>", "github-actions: GitHub Enterprise Server API root (omit for github.com) · langgraph-platform: self-hosted LangSmith control-plane root").option("--project-id <id>", "gcp: project ID or number whose Secret Manager to write").option("--langgraph-region <region>", `langgraph-platform: ${LANGGRAPH_PLATFORM_REGIONS.join(" | ")} (omit for us)`).option("--langgraph-tenant <id>", "langgraph-platform: LangSmith workspace UUID (only an org-scoped key needs it)").action(async (options) => {
12747
+ sync.command("connect").description("register a destination account (reads its API token from stdin)").option("--org <slug>").requiredOption("--name <name>", "what to call this account, e.g. acme-vercel").option("--provider <kind>", SYNC_PROVIDER_KINDS.join(" | "), "vercel").option("--team-id <id>", "vercel: Team id (omit for a personal account)").option("--token-kind <kind>", `railway: ${RAILWAY_TOKEN_KINDS.join(" | ")}`, "account").option("--account-id <id>", "cloudflare: account ID (32 hex, from the dashboard sidebar) · netlify: team slug or account ID").option("--region <region>", "aws: region ID, e.g. us-east-1").option("--access-key-id <id>", "aws: IAM access key ID (the secret key is read from stdin)").option("--azure-tenant-id <id>", "azure-key-vault: Entra Directory (tenant) ID, a GUID").option("--azure-client-id <id>", "azure-key-vault: Application (client) ID of the service principal, a GUID (its client secret is read from stdin)").option("--azure-cloud <cloud>", `azure-key-vault: ${AZURE_CLOUDS.join(" | ")}`, "public").option("--base-url <url>", "github-actions: GitHub Enterprise Server API root (omit for github.com) · langgraph-platform: self-hosted LangSmith control-plane root").option("--project-id <id>", "gcp: project ID or number whose Secret Manager to write").option("--langgraph-region <region>", `langgraph-platform: ${LANGGRAPH_PLATFORM_REGIONS.join(" | ")} (omit for us)`).option("--langgraph-tenant <id>", "langgraph-platform: LangSmith workspace UUID (only an org-scoped key needs it)").action(async (options) => {
12604
12748
  const provider = assertProvider(options.provider);
12605
12749
  const ctx = buildContext();
12606
12750
  const ref = await resolveOrg(ctx, options.org);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@seekrit/cli",
3
- "version": "0.46.0",
3
+ "version": "0.47.0",
4
4
  "description": "End-to-end encrypted secrets manager CLI — inject decrypted secrets into any command.",
5
5
  "type": "module",
6
6
  "publishConfig": {
@@ -29,8 +29,8 @@
29
29
  "tsdown": "^0.22.3",
30
30
  "vitest": "^4.1.9",
31
31
  "@seekrit/api-client": "0.0.1",
32
- "@seekrit/core": "0.0.1",
33
- "@seekrit/crypto": "0.0.1"
32
+ "@seekrit/crypto": "0.0.1",
33
+ "@seekrit/core": "0.0.1"
34
34
  },
35
35
  "scripts": {
36
36
  "build": "tsdown",