@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.
- package/dist/index.js +150 -6
- 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.
|
|
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.
|
|
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/
|
|
33
|
-
"@seekrit/
|
|
32
|
+
"@seekrit/crypto": "0.0.1",
|
|
33
|
+
"@seekrit/core": "0.0.1"
|
|
34
34
|
},
|
|
35
35
|
"scripts": {
|
|
36
36
|
"build": "tsdown",
|