@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.
- package/dist/cli.js +57 -13
- 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.
|
|
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
|
-
|
|
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 = `${
|
|
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
|
|
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
|
|
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
|
|
2327
|
+
console.log(pc10.green(`\u2713 Auto-selected project: ${getProjectDisplayName(selectedProject)} (${matchReason})`));
|
|
2317
2328
|
} else if (autoMatch && autoMatch.matchType === "partial_name") {
|
|
2318
|
-
|
|
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 ${
|
|
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
|
|
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
|
|
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
|
-
|
|
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,
|