@keywaysh/cli 0.1.7 → 0.1.9

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/cli.js +57 -13
  2. package/package.json +1 -1
package/dist/cli.js CHANGED
@@ -101,7 +101,7 @@ var INTERNAL_POSTHOG_HOST = "https://eu.i.posthog.com";
101
101
  // package.json
102
102
  var package_default = {
103
103
  name: "@keywaysh/cli",
104
- version: "0.1.7",
104
+ version: "0.1.9",
105
105
  description: "One link to all your secrets",
106
106
  type: "module",
107
107
  bin: {
@@ -452,6 +452,9 @@ async function getSyncDiff(accessToken, repoFullName, options) {
452
452
  keywayEnvironment: options.keywayEnvironment || "production",
453
453
  providerEnvironment: options.providerEnvironment || "production"
454
454
  });
455
+ if (options.serviceId) {
456
+ params.set("serviceId", options.serviceId);
457
+ }
455
458
  const response = await fetchWithTimeout(
456
459
  `${API_BASE_URL}/v1/integrations/vaults/${owner}/${repo}/sync/diff?${params}`,
457
460
  {
@@ -477,6 +480,9 @@ async function getSyncPreview(accessToken, repoFullName, options) {
477
480
  direction: options.direction || "push",
478
481
  allowDelete: String(options.allowDelete || false)
479
482
  });
483
+ if (options.serviceId) {
484
+ params.set("serviceId", options.serviceId);
485
+ }
480
486
  const response = await fetchWithTimeout(
481
487
  `${API_BASE_URL}/v1/integrations/vaults/${owner}/${repo}/sync/preview?${params}`,
482
488
  {
@@ -506,6 +512,7 @@ async function executeSync(accessToken, repoFullName, options) {
506
512
  body: JSON.stringify({
507
513
  connectionId: options.connectionId,
508
514
  projectId: options.projectId,
515
+ serviceId: options.serviceId,
509
516
  keywayEnvironment: options.keywayEnvironment || "production",
510
517
  providerEnvironment: options.providerEnvironment || "production",
511
518
  direction: options.direction || "push",
@@ -2175,6 +2182,9 @@ function displayDiffSummary(diff, providerName) {
2175
2182
  }
2176
2183
  console.log("");
2177
2184
  }
2185
+ function getProjectDisplayName(project) {
2186
+ return project.serviceName || project.name;
2187
+ }
2178
2188
  function findMatchingProject(projects, repoFullName) {
2179
2189
  const repoFullNameLower = repoFullName.toLowerCase();
2180
2190
  const repoName = repoFullName.split("/")[1]?.toLowerCase();
@@ -2211,17 +2221,18 @@ function projectMatchesRepo(project, repoFullName) {
2211
2221
  async function promptProjectSelection(projects, repoFullName) {
2212
2222
  const repoName = repoFullName.split("/")[1]?.toLowerCase() || "";
2213
2223
  const choices = projects.map((p) => {
2214
- let title = p.name;
2224
+ const displayName = getProjectDisplayName(p);
2225
+ let title = displayName;
2215
2226
  const badges = [];
2216
2227
  if (p.linkedRepo?.toLowerCase() === repoFullName.toLowerCase()) {
2217
2228
  badges.push(pc10.green("\u2190 linked"));
2218
- } else if (p.name.toLowerCase() === repoName) {
2229
+ } else if (p.name.toLowerCase() === repoName || p.serviceName?.toLowerCase() === repoName) {
2219
2230
  badges.push(pc10.green("\u2190 same name"));
2220
2231
  } else if (p.linkedRepo) {
2221
2232
  badges.push(pc10.gray(`\u2192 ${p.linkedRepo}`));
2222
2233
  }
2223
2234
  if (badges.length > 0) {
2224
- title = `${p.name} ${badges.join(" ")}`;
2235
+ title = `${displayName} ${badges.join(" ")}`;
2225
2236
  }
2226
2237
  return { title, value: p.id };
2227
2238
  });
@@ -2287,12 +2298,12 @@ Connection to ${providerDisplayName} failed.`));
2287
2298
  let selectedProject;
2288
2299
  if (options.project) {
2289
2300
  const found = projects.find(
2290
- (p) => p.id === options.project || p.name.toLowerCase() === options.project?.toLowerCase()
2301
+ (p) => p.id === options.project || p.name.toLowerCase() === options.project?.toLowerCase() || p.serviceName?.toLowerCase() === options.project?.toLowerCase()
2291
2302
  );
2292
2303
  if (!found) {
2293
2304
  console.error(pc10.red(`Project not found: ${options.project}`));
2294
2305
  console.log(pc10.gray("Available projects:"));
2295
- projects.forEach((p) => console.log(pc10.gray(` - ${p.name}`)));
2306
+ projects.forEach((p) => console.log(pc10.gray(` - ${getProjectDisplayName(p)}`)));
2296
2307
  process.exit(1);
2297
2308
  }
2298
2309
  selectedProject = found;
@@ -2302,7 +2313,7 @@ Connection to ${providerDisplayName} failed.`));
2302
2313
  console.log(pc10.yellow("\u2502 \u26A0\uFE0F WARNING: Project does not match current repository \u2502"));
2303
2314
  console.log(pc10.yellow("\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518"));
2304
2315
  console.log(pc10.yellow(` Current repo: ${repoFullName}`));
2305
- console.log(pc10.yellow(` Selected project: ${selectedProject.name}`));
2316
+ console.log(pc10.yellow(` Selected project: ${getProjectDisplayName(selectedProject)}`));
2306
2317
  if (selectedProject.linkedRepo) {
2307
2318
  console.log(pc10.yellow(` Project linked to: ${selectedProject.linkedRepo}`));
2308
2319
  }
@@ -2313,13 +2324,14 @@ Connection to ${providerDisplayName} failed.`));
2313
2324
  if (autoMatch && (autoMatch.matchType === "linked_repo" || autoMatch.matchType === "exact_name")) {
2314
2325
  selectedProject = autoMatch.project;
2315
2326
  const matchReason = autoMatch.matchType === "linked_repo" ? `linked to ${repoFullName}` : "exact name match";
2316
- console.log(pc10.green(`\u2713 Auto-selected project: ${selectedProject.name} (${matchReason})`));
2327
+ console.log(pc10.green(`\u2713 Auto-selected project: ${getProjectDisplayName(selectedProject)} (${matchReason})`));
2317
2328
  } else if (autoMatch && autoMatch.matchType === "partial_name") {
2318
- console.log(pc10.yellow(`Detected project: ${autoMatch.project.name} (partial match)`));
2329
+ const partialDisplayName = getProjectDisplayName(autoMatch.project);
2330
+ console.log(pc10.yellow(`Detected project: ${partialDisplayName} (partial match)`));
2319
2331
  const { useDetected } = await prompts7({
2320
2332
  type: "confirm",
2321
2333
  name: "useDetected",
2322
- message: `Use ${autoMatch.project.name}?`,
2334
+ message: `Use ${partialDisplayName}?`,
2323
2335
  initial: true
2324
2336
  });
2325
2337
  if (useDetected) {
@@ -2335,7 +2347,7 @@ Connection to ${providerDisplayName} failed.`));
2335
2347
  console.log(pc10.yellow("\u2502 \u26A0\uFE0F WARNING: Project does not match current repository \u2502"));
2336
2348
  console.log(pc10.yellow("\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518"));
2337
2349
  console.log(pc10.yellow(` Current repo: ${repoFullName}`));
2338
- console.log(pc10.yellow(` Only project: ${selectedProject.name}`));
2350
+ console.log(pc10.yellow(` Only project: ${getProjectDisplayName(selectedProject)}`));
2339
2351
  if (selectedProject.linkedRepo) {
2340
2352
  console.log(pc10.yellow(` Project linked to: ${selectedProject.linkedRepo}`));
2341
2353
  }
@@ -2366,7 +2378,7 @@ Connection to ${providerDisplayName} failed.`));
2366
2378
  console.log(pc10.yellow("\u2502 \u26A0\uFE0F WARNING: You selected a different project \u2502"));
2367
2379
  console.log(pc10.yellow("\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518"));
2368
2380
  console.log(pc10.yellow(` Current repo: ${repoFullName}`));
2369
- console.log(pc10.yellow(` Selected project: ${selectedProject.name}`));
2381
+ console.log(pc10.yellow(` Selected project: ${getProjectDisplayName(selectedProject)}`));
2370
2382
  if (selectedProject.linkedRepo) {
2371
2383
  console.log(pc10.yellow(` Project linked to: ${selectedProject.linkedRepo}`));
2372
2384
  }
@@ -2405,7 +2417,35 @@ Connection to ${providerDisplayName} failed.`));
2405
2417
  }
2406
2418
  keywayEnv = selectedEnv;
2407
2419
  if (!options.providerEnv) {
2408
- providerEnv = mapToProviderEnvironment(provider, keywayEnv);
2420
+ if (selectedProject.environments && selectedProject.environments.length > 0) {
2421
+ const mappedEnv = mapToProviderEnvironment(provider, keywayEnv);
2422
+ const envExists = selectedProject.environments.some(
2423
+ (e) => e.toLowerCase() === mappedEnv.toLowerCase()
2424
+ );
2425
+ if (envExists) {
2426
+ providerEnv = mappedEnv;
2427
+ } else if (selectedProject.environments.length === 1) {
2428
+ providerEnv = selectedProject.environments[0];
2429
+ console.log(pc10.gray(`Using ${providerName} environment: ${providerEnv}`));
2430
+ } else {
2431
+ const { selectedProviderEnv } = await prompts7({
2432
+ type: "select",
2433
+ name: "selectedProviderEnv",
2434
+ message: `${providerName} environment:`,
2435
+ choices: selectedProject.environments.map((e) => ({ title: e, value: e })),
2436
+ initial: Math.max(0, selectedProject.environments.findIndex(
2437
+ (e) => e.toLowerCase() === "production"
2438
+ ))
2439
+ });
2440
+ if (!selectedProviderEnv) {
2441
+ console.log(pc10.gray("Cancelled."));
2442
+ process.exit(0);
2443
+ }
2444
+ providerEnv = selectedProviderEnv;
2445
+ }
2446
+ } else {
2447
+ providerEnv = mapToProviderEnvironment(provider, keywayEnv);
2448
+ }
2409
2449
  }
2410
2450
  }
2411
2451
  if (needsDirectionPrompt) {
@@ -2415,6 +2455,8 @@ Connection to ${providerDisplayName} failed.`));
2415
2455
  const diff = await getSyncDiff(accessToken, repoFullName, {
2416
2456
  connectionId: connection.id,
2417
2457
  projectId: selectedProject.id,
2458
+ serviceId: selectedProject.serviceId,
2459
+ // Railway: service ID for service-specific variables
2418
2460
  keywayEnvironment: effectiveKeywayEnv,
2419
2461
  providerEnvironment: effectiveProviderEnv
2420
2462
  });
@@ -2559,6 +2601,8 @@ async function executeSyncOperation(accessToken, repoFullName, connectionId, pro
2559
2601
  const result = await executeSync(accessToken, repoFullName, {
2560
2602
  connectionId,
2561
2603
  projectId: project.id,
2604
+ serviceId: project.serviceId,
2605
+ // Railway: service ID for service-specific variables
2562
2606
  keywayEnvironment: keywayEnv,
2563
2607
  providerEnvironment: providerEnv,
2564
2608
  direction,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@keywaysh/cli",
3
- "version": "0.1.7",
3
+ "version": "0.1.9",
4
4
  "description": "One link to all your secrets",
5
5
  "type": "module",
6
6
  "bin": {