@mks2508/coolify-mks-cli-mcp 0.6.3 → 0.8.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/cli/coolify-state.d.ts +92 -4
- package/dist/cli/coolify-state.d.ts.map +1 -1
- package/dist/cli/index.js +22149 -11456
- package/dist/cli/ui/highlighter.d.ts +28 -0
- package/dist/cli/ui/highlighter.d.ts.map +1 -0
- package/dist/cli/ui/index.d.ts +9 -0
- package/dist/cli/ui/index.d.ts.map +1 -0
- package/dist/cli/ui/spinners.d.ts +100 -0
- package/dist/cli/ui/spinners.d.ts.map +1 -0
- package/dist/cli/ui/tables.d.ts +103 -0
- package/dist/cli/ui/tables.d.ts.map +1 -0
- package/dist/coolify/index.d.ts +22 -3
- package/dist/coolify/index.d.ts.map +1 -1
- package/dist/coolify/types.d.ts +99 -1
- package/dist/coolify/types.d.ts.map +1 -1
- package/dist/examples/demo-ui.d.ts +8 -0
- package/dist/examples/demo-ui.d.ts.map +1 -0
- package/dist/index.cjs +322 -12
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +322 -12
- package/dist/index.js.map +1 -1
- package/dist/sdk.d.ts +41 -0
- package/dist/sdk.d.ts.map +1 -1
- package/dist/server/stdio.js +258 -9
- package/package.json +16 -4
- package/src/cli/actions.ts +9 -2
- package/src/cli/commands/create.ts +71 -5
- package/src/cli/commands/db.ts +37 -0
- package/src/cli/commands/delete.ts +6 -2
- package/src/cli/commands/deploy.ts +347 -49
- package/src/cli/commands/deployments.ts +6 -2
- package/src/cli/commands/diagnose.ts +3 -3
- package/src/cli/commands/env.ts +121 -22
- package/src/cli/commands/exec.ts +6 -2
- package/src/cli/commands/init.ts +937 -0
- package/src/cli/commands/logs.ts +224 -24
- package/src/cli/commands/main-menu.ts +21 -0
- package/src/cli/commands/projects.ts +312 -29
- package/src/cli/commands/restart.ts +6 -2
- package/src/cli/commands/service-logs.ts +14 -0
- package/src/cli/commands/show.ts +6 -2
- package/src/cli/commands/start.ts +6 -2
- package/src/cli/commands/status.ts +538 -0
- package/src/cli/commands/stop.ts +6 -2
- package/src/cli/commands/update.ts +27 -2
- package/src/cli/coolify-state.ts +164 -11
- package/src/cli/index.ts +91 -10
- package/src/cli/name-resolver.ts +228 -0
- package/src/cli/ui/banner.ts +276 -0
- package/src/cli/ui/highlighter.ts +176 -0
- package/src/cli/ui/index.ts +9 -0
- package/src/cli/ui/prompts.ts +155 -0
- package/src/cli/ui/screen.ts +606 -0
- package/src/cli/ui/select.ts +280 -0
- package/src/cli/ui/spinners.ts +256 -0
- package/src/cli/ui/tables.ts +407 -0
- package/src/coolify/index.ts +257 -12
- package/src/coolify/types.ts +103 -1
- package/src/examples/demo-ui.ts +78 -0
- package/src/sdk.ts +162 -0
package/dist/sdk.d.ts
CHANGED
|
@@ -79,6 +79,47 @@ declare class ApplicationsResource {
|
|
|
79
79
|
message: string;
|
|
80
80
|
}>;
|
|
81
81
|
deleteEnv(uuid: string, key: string): Promise<void>;
|
|
82
|
+
/**
|
|
83
|
+
* Sync environment variables from a local .env file to Coolify.
|
|
84
|
+
*
|
|
85
|
+
* @param uuid - Application UUID
|
|
86
|
+
* @param options - Sync options
|
|
87
|
+
* @returns Sync result with changes applied
|
|
88
|
+
*/
|
|
89
|
+
syncEnv(uuid: string, options?: {
|
|
90
|
+
/** Path to .env file (default: reads from .env in cwd) */
|
|
91
|
+
filePath?: string;
|
|
92
|
+
/** Preview changes without applying */
|
|
93
|
+
dryRun?: boolean;
|
|
94
|
+
/** Delete vars not in file */
|
|
95
|
+
prune?: boolean;
|
|
96
|
+
/** Callback for progress updates (optional) */
|
|
97
|
+
onProgress?: (update: {
|
|
98
|
+
type: 'add' | 'update' | 'remove';
|
|
99
|
+
key: string;
|
|
100
|
+
value?: string;
|
|
101
|
+
}) => void;
|
|
102
|
+
}): Promise<{
|
|
103
|
+
added: Array<{
|
|
104
|
+
key: string;
|
|
105
|
+
value: string;
|
|
106
|
+
}>;
|
|
107
|
+
updated: Array<{
|
|
108
|
+
key: string;
|
|
109
|
+
value: string;
|
|
110
|
+
oldValue: string;
|
|
111
|
+
}>;
|
|
112
|
+
removed: string[];
|
|
113
|
+
skipped: number;
|
|
114
|
+
}>;
|
|
115
|
+
/**
|
|
116
|
+
* Parse .env file content into a Map.
|
|
117
|
+
* Handles comments, empty lines, and quoted values.
|
|
118
|
+
*
|
|
119
|
+
* @param content - The .env file content
|
|
120
|
+
* @returns Map of environment variables
|
|
121
|
+
*/
|
|
122
|
+
private parseEnvContent;
|
|
82
123
|
}
|
|
83
124
|
declare class DatabasesResource {
|
|
84
125
|
private svc;
|
package/dist/sdk.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sdk.d.ts","sourceRoot":"","sources":["../src/sdk.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"sdk.d.ts","sourceRoot":"","sources":["../src/sdk.ts"],"names":[],"mappings":"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"}
|
package/dist/server/stdio.js
CHANGED
|
@@ -18593,10 +18593,10 @@ class CoolifyService {
|
|
|
18593
18593
|
environment_uuid: options.environmentUuid,
|
|
18594
18594
|
server_uuid: options.serverUuid
|
|
18595
18595
|
};
|
|
18596
|
+
if (options.githubRepoUrl) {
|
|
18597
|
+
body.git_repository = options.githubRepoUrl.replace(/^https?:\/\/github\.com\//, "").replace(/\.git$/, "");
|
|
18598
|
+
}
|
|
18596
18599
|
if (appType === "public" || appType === "private-github-app" || appType === "private-deploy-key") {
|
|
18597
|
-
if (options.githubRepoUrl) {
|
|
18598
|
-
body.git_repository = options.githubRepoUrl.replace(/^https?:\/\/github\.com\//, "").replace(/\.git$/, "");
|
|
18599
|
-
}
|
|
18600
18600
|
if (options.githubAppUuid) {
|
|
18601
18601
|
body.github_app_uuid = options.githubAppUuid;
|
|
18602
18602
|
}
|
|
@@ -18641,7 +18641,7 @@ class CoolifyService {
|
|
|
18641
18641
|
for (const [key, value] of Object.entries(envVars)) {
|
|
18642
18642
|
const result = await this.request(`/applications/${appUuid}/envs`, {
|
|
18643
18643
|
method: "POST",
|
|
18644
|
-
body: JSON.stringify({ key, value, is_preview: false })
|
|
18644
|
+
body: JSON.stringify({ key, value, is_preview: false, is_buildtime: false })
|
|
18645
18645
|
});
|
|
18646
18646
|
if (result.error && result.error.includes("already exists")) {
|
|
18647
18647
|
const listResult = await this.request(`/applications/${appUuid}/envs`);
|
|
@@ -18652,7 +18652,7 @@ class CoolifyService {
|
|
|
18652
18652
|
});
|
|
18653
18653
|
const repost = await this.request(`/applications/${appUuid}/envs`, {
|
|
18654
18654
|
method: "POST",
|
|
18655
|
-
body: JSON.stringify({ key, value, is_preview: false })
|
|
18655
|
+
body: JSON.stringify({ key, value, is_preview: false, is_buildtime: false })
|
|
18656
18656
|
});
|
|
18657
18657
|
if (repost.error) {
|
|
18658
18658
|
log.error(`Failed to update env var ${key}: ${repost.error}`);
|
|
@@ -18681,8 +18681,8 @@ class CoolifyService {
|
|
|
18681
18681
|
log.success(`Environment variables retrieved for ${appUuid}`);
|
|
18682
18682
|
return ok(result.data || []);
|
|
18683
18683
|
}
|
|
18684
|
-
async setEnvironmentVariable(appUuid, key, value,
|
|
18685
|
-
log.info(`Setting environment variable ${key} for ${appUuid}`);
|
|
18684
|
+
async setEnvironmentVariable(appUuid, key, value, isBuildTime = false) {
|
|
18685
|
+
log.info(`Setting environment variable ${key} for ${appUuid} (buildtime: ${isBuildTime})`);
|
|
18686
18686
|
const existingVars = await this.getEnvironmentVariables(appUuid);
|
|
18687
18687
|
if (isErr(existingVars)) {
|
|
18688
18688
|
return err(existingVars.error);
|
|
@@ -18692,7 +18692,11 @@ class CoolifyService {
|
|
|
18692
18692
|
log.debug(`Variable ${key} exists, using PATCH to update`);
|
|
18693
18693
|
const result = await this.request(`/applications/${appUuid}/envs`, {
|
|
18694
18694
|
method: "PATCH",
|
|
18695
|
-
body: JSON.stringify({
|
|
18695
|
+
body: JSON.stringify({
|
|
18696
|
+
key,
|
|
18697
|
+
value,
|
|
18698
|
+
is_buildtime: isBuildTime
|
|
18699
|
+
})
|
|
18696
18700
|
});
|
|
18697
18701
|
if (result.error) {
|
|
18698
18702
|
log.error(`Failed to update env var: ${result.error}`);
|
|
@@ -18702,7 +18706,11 @@ class CoolifyService {
|
|
|
18702
18706
|
log.debug(`Variable ${key} does not exist, using POST to create`);
|
|
18703
18707
|
const result = await this.request(`/applications/${appUuid}/envs`, {
|
|
18704
18708
|
method: "POST",
|
|
18705
|
-
body: JSON.stringify({
|
|
18709
|
+
body: JSON.stringify({
|
|
18710
|
+
key,
|
|
18711
|
+
value,
|
|
18712
|
+
is_buildtime: isBuildTime
|
|
18713
|
+
})
|
|
18706
18714
|
});
|
|
18707
18715
|
if (result.error) {
|
|
18708
18716
|
log.error(`Failed to create env var: ${result.error}`);
|
|
@@ -18920,6 +18928,24 @@ class CoolifyService {
|
|
|
18920
18928
|
body.is_force_https_enabled = options.isForceHttpsEnabled;
|
|
18921
18929
|
if (options.isAutoDeployEnabled !== undefined)
|
|
18922
18930
|
body.is_auto_deploy_enabled = options.isAutoDeployEnabled;
|
|
18931
|
+
if (options.healthCheckEnabled !== undefined)
|
|
18932
|
+
body.health_check_enabled = options.healthCheckEnabled;
|
|
18933
|
+
if (options.healthCheckPath)
|
|
18934
|
+
body.health_check_path = options.healthCheckPath;
|
|
18935
|
+
if (options.healthCheckPort)
|
|
18936
|
+
body.health_check_port = String(options.healthCheckPort);
|
|
18937
|
+
if (options.healthCheckMethod)
|
|
18938
|
+
body.health_check_method = options.healthCheckMethod;
|
|
18939
|
+
if (options.healthCheckInterval)
|
|
18940
|
+
body.health_check_interval = options.healthCheckInterval;
|
|
18941
|
+
if (options.healthCheckTimeout)
|
|
18942
|
+
body.health_check_timeout = options.healthCheckTimeout;
|
|
18943
|
+
if (options.healthCheckRetries)
|
|
18944
|
+
body.health_check_retries = options.healthCheckRetries;
|
|
18945
|
+
if (options.healthCheckStartPeriod)
|
|
18946
|
+
body.health_check_start_period = options.healthCheckStartPeriod;
|
|
18947
|
+
if (options.healthCheckReturnCode)
|
|
18948
|
+
body.health_check_return_code = options.healthCheckReturnCode;
|
|
18923
18949
|
const result = await this.request(`/applications/${appUuid}`, {
|
|
18924
18950
|
method: "PATCH",
|
|
18925
18951
|
body: JSON.stringify(body)
|
|
@@ -19243,6 +19269,133 @@ class CoolifyService {
|
|
|
19243
19269
|
log.success(`Service deleted: ${uuid2}`);
|
|
19244
19270
|
return ok({ success: true, message: "Service deleted" });
|
|
19245
19271
|
}
|
|
19272
|
+
async getInfrastructureTree() {
|
|
19273
|
+
log.info("Building infrastructure tree");
|
|
19274
|
+
const [projectsResult, appsResult, dbsResult, svcsResult, serversResult] = await Promise.all([
|
|
19275
|
+
this.listProjects(),
|
|
19276
|
+
this.listApplications(),
|
|
19277
|
+
this.listDatabases(),
|
|
19278
|
+
this.listServices(),
|
|
19279
|
+
this.listServers()
|
|
19280
|
+
]);
|
|
19281
|
+
if (isErr(projectsResult))
|
|
19282
|
+
return err(projectsResult.error);
|
|
19283
|
+
if (isErr(appsResult))
|
|
19284
|
+
return err(appsResult.error);
|
|
19285
|
+
if (isErr(serversResult))
|
|
19286
|
+
return err(serversResult.error);
|
|
19287
|
+
const projects = projectsResult.value;
|
|
19288
|
+
const apps = appsResult.value;
|
|
19289
|
+
const dbs = isErr(dbsResult) ? [] : dbsResult.value;
|
|
19290
|
+
const svcs = isErr(svcsResult) ? [] : svcsResult.value;
|
|
19291
|
+
const servers = serversResult.value;
|
|
19292
|
+
const envResults = await Promise.allSettled(projects.map((p) => this.getProjectEnvironments(p.uuid)));
|
|
19293
|
+
const envIdMap = new Map;
|
|
19294
|
+
for (let i = 0;i < projects.length; i++) {
|
|
19295
|
+
const envResult = envResults[i];
|
|
19296
|
+
if (envResult.status === "fulfilled" && !isErr(envResult.value)) {
|
|
19297
|
+
for (const env of envResult.value.value) {
|
|
19298
|
+
envIdMap.set(env.id, {
|
|
19299
|
+
projectUuid: projects[i].uuid,
|
|
19300
|
+
envName: env.name,
|
|
19301
|
+
envUuid: env.uuid
|
|
19302
|
+
});
|
|
19303
|
+
}
|
|
19304
|
+
}
|
|
19305
|
+
}
|
|
19306
|
+
const projectNodes = projects.map((p) => ({
|
|
19307
|
+
uuid: p.uuid,
|
|
19308
|
+
name: p.name,
|
|
19309
|
+
description: p.description,
|
|
19310
|
+
environments: []
|
|
19311
|
+
}));
|
|
19312
|
+
const projectMap = new Map;
|
|
19313
|
+
for (const node of projectNodes) {
|
|
19314
|
+
projectMap.set(node.uuid, node);
|
|
19315
|
+
}
|
|
19316
|
+
const envNodeMap = new Map;
|
|
19317
|
+
for (const [envId, info] of envIdMap) {
|
|
19318
|
+
const project = projectMap.get(info.projectUuid);
|
|
19319
|
+
if (!project)
|
|
19320
|
+
continue;
|
|
19321
|
+
let envNode = project.environments.find((e) => e.id === envId);
|
|
19322
|
+
if (!envNode) {
|
|
19323
|
+
envNode = {
|
|
19324
|
+
id: envId,
|
|
19325
|
+
uuid: info.envUuid,
|
|
19326
|
+
name: info.envName,
|
|
19327
|
+
resources: []
|
|
19328
|
+
};
|
|
19329
|
+
project.environments.push(envNode);
|
|
19330
|
+
}
|
|
19331
|
+
envNodeMap.set(envId, envNode);
|
|
19332
|
+
}
|
|
19333
|
+
for (const app of apps) {
|
|
19334
|
+
const envNode = app.environment_id ? envNodeMap.get(app.environment_id) : undefined;
|
|
19335
|
+
const resource = {
|
|
19336
|
+
uuid: app.uuid,
|
|
19337
|
+
name: app.name,
|
|
19338
|
+
kind: "app",
|
|
19339
|
+
status: app.status,
|
|
19340
|
+
fqdn: app.fqdn
|
|
19341
|
+
};
|
|
19342
|
+
if (envNode) {
|
|
19343
|
+
envNode.resources.push(resource);
|
|
19344
|
+
}
|
|
19345
|
+
}
|
|
19346
|
+
for (const db of dbs) {
|
|
19347
|
+
const envNode = db.environment_id ? envNodeMap.get(db.environment_id) : undefined;
|
|
19348
|
+
const resource = {
|
|
19349
|
+
uuid: db.uuid,
|
|
19350
|
+
name: db.name,
|
|
19351
|
+
kind: "database",
|
|
19352
|
+
status: db.status,
|
|
19353
|
+
dbType: db.type
|
|
19354
|
+
};
|
|
19355
|
+
if (envNode) {
|
|
19356
|
+
envNode.resources.push(resource);
|
|
19357
|
+
}
|
|
19358
|
+
}
|
|
19359
|
+
for (const svc of svcs) {
|
|
19360
|
+
const envNode = svc.environment_id ? envNodeMap.get(svc.environment_id) : undefined;
|
|
19361
|
+
const resource = {
|
|
19362
|
+
uuid: svc.uuid,
|
|
19363
|
+
name: svc.name,
|
|
19364
|
+
kind: "service",
|
|
19365
|
+
status: svc.status
|
|
19366
|
+
};
|
|
19367
|
+
if (envNode) {
|
|
19368
|
+
envNode.resources.push(resource);
|
|
19369
|
+
}
|
|
19370
|
+
}
|
|
19371
|
+
const populatedProjects = projectNodes.filter((p) => p.environments.some((e) => e.resources.length > 0));
|
|
19372
|
+
const allStatuses = [
|
|
19373
|
+
...apps.map((a) => a.status),
|
|
19374
|
+
...dbs.map((d) => d.status),
|
|
19375
|
+
...svcs.map((s) => s.status)
|
|
19376
|
+
];
|
|
19377
|
+
const counts = {
|
|
19378
|
+
projects: populatedProjects.length,
|
|
19379
|
+
apps: apps.length,
|
|
19380
|
+
databases: dbs.length,
|
|
19381
|
+
services: svcs.length,
|
|
19382
|
+
healthy: allStatuses.filter((s) => s.includes("healthy")).length,
|
|
19383
|
+
running: allStatuses.filter((s) => s.startsWith("running") && !s.includes("healthy")).length,
|
|
19384
|
+
stopped: allStatuses.filter((s) => s.includes("exited")).length,
|
|
19385
|
+
unhealthy: allStatuses.filter((s) => s.includes("unhealthy")).length
|
|
19386
|
+
};
|
|
19387
|
+
const server = servers[0] || { name: "Unknown" };
|
|
19388
|
+
log.success(`Infrastructure tree built: ${counts.projects} projects, ${counts.apps} apps, ${counts.databases} dbs, ${counts.services} svcs`);
|
|
19389
|
+
return ok({
|
|
19390
|
+
server: {
|
|
19391
|
+
name: server.name,
|
|
19392
|
+
ip: server.ip,
|
|
19393
|
+
uuid: server.uuid
|
|
19394
|
+
},
|
|
19395
|
+
projects: populatedProjects,
|
|
19396
|
+
counts
|
|
19397
|
+
});
|
|
19398
|
+
}
|
|
19246
19399
|
async startService(uuid2) {
|
|
19247
19400
|
log.info(`Starting service ${uuid2}`);
|
|
19248
19401
|
const result = await this.request(`/services/${uuid2}/start`, { method: "GET" });
|
|
@@ -19504,6 +19657,17 @@ class CoolifyService {
|
|
|
19504
19657
|
log.success(`Listed ${deployments.length} deployments for ${appUuid}`);
|
|
19505
19658
|
return ok(deployments);
|
|
19506
19659
|
}
|
|
19660
|
+
async getApplication(appUuid) {
|
|
19661
|
+
log.info(`Getting application details: ${appUuid}`);
|
|
19662
|
+
const result = await this.request(`/applications/${appUuid}`);
|
|
19663
|
+
if (result.error) {
|
|
19664
|
+
return err(new Error(result.error));
|
|
19665
|
+
}
|
|
19666
|
+
if (!result.data) {
|
|
19667
|
+
return err(new Error("Application not found"));
|
|
19668
|
+
}
|
|
19669
|
+
return ok(result.data);
|
|
19670
|
+
}
|
|
19507
19671
|
async resolveApplication(query) {
|
|
19508
19672
|
log.info(`Resolving application: ${query}`);
|
|
19509
19673
|
if (this.isLikelyUuid(query)) {
|
|
@@ -19847,6 +20011,91 @@ class ApplicationsResource {
|
|
|
19847
20011
|
async deleteEnv(uuid2, key) {
|
|
19848
20012
|
return unwrap(await this.svc.deleteEnvironmentVariable(uuid2, key));
|
|
19849
20013
|
}
|
|
20014
|
+
async syncEnv(uuid2, options = {}) {
|
|
20015
|
+
const { filePath, dryRun = false, prune = false, onProgress } = options;
|
|
20016
|
+
let envContent;
|
|
20017
|
+
try {
|
|
20018
|
+
envContent = await Bun.file(filePath || ".env").text();
|
|
20019
|
+
} catch {
|
|
20020
|
+
throw new Error(filePath ? `Cannot read file: ${filePath}` : "No .env file found in current directory");
|
|
20021
|
+
}
|
|
20022
|
+
const localVars = this.parseEnvContent(envContent);
|
|
20023
|
+
if (localVars.size === 0) {
|
|
20024
|
+
return { added: [], updated: [], removed: [], skipped: 0 };
|
|
20025
|
+
}
|
|
20026
|
+
const currentVarsList = await this.envVars(uuid2);
|
|
20027
|
+
const currentVars = new Map(currentVarsList.map((v) => [v.key, v.value]));
|
|
20028
|
+
const toAdd = [];
|
|
20029
|
+
const toUpdate = [];
|
|
20030
|
+
const toRemove = [];
|
|
20031
|
+
for (const [key, value] of localVars.entries()) {
|
|
20032
|
+
const currentValue = currentVars.get(key);
|
|
20033
|
+
if (!currentValue) {
|
|
20034
|
+
toAdd.push({ key, value });
|
|
20035
|
+
} else if (currentValue !== value) {
|
|
20036
|
+
toUpdate.push({ key, value, oldValue: currentValue });
|
|
20037
|
+
}
|
|
20038
|
+
}
|
|
20039
|
+
if (prune) {
|
|
20040
|
+
for (const key of currentVars.keys()) {
|
|
20041
|
+
if (!localVars.has(key)) {
|
|
20042
|
+
toRemove.push(key);
|
|
20043
|
+
}
|
|
20044
|
+
}
|
|
20045
|
+
}
|
|
20046
|
+
if (!dryRun) {
|
|
20047
|
+
for (const { key, value } of toAdd) {
|
|
20048
|
+
await this.setEnv(uuid2, key, value, false);
|
|
20049
|
+
onProgress?.({ type: "add", key, value });
|
|
20050
|
+
}
|
|
20051
|
+
for (const { key, value } of toUpdate) {
|
|
20052
|
+
await this.setEnv(uuid2, key, value, false);
|
|
20053
|
+
onProgress?.({ type: "update", key, value });
|
|
20054
|
+
}
|
|
20055
|
+
for (const key of toRemove) {
|
|
20056
|
+
await this.deleteEnv(uuid2, key);
|
|
20057
|
+
onProgress?.({ type: "remove", key });
|
|
20058
|
+
}
|
|
20059
|
+
} else {
|
|
20060
|
+
for (const { key, value } of toAdd) {
|
|
20061
|
+
onProgress?.({ type: "add", key, value });
|
|
20062
|
+
}
|
|
20063
|
+
for (const { key, value } of toUpdate) {
|
|
20064
|
+
onProgress?.({ type: "update", key, value });
|
|
20065
|
+
}
|
|
20066
|
+
for (const key of toRemove) {
|
|
20067
|
+
onProgress?.({ type: "remove", key });
|
|
20068
|
+
}
|
|
20069
|
+
}
|
|
20070
|
+
return {
|
|
20071
|
+
added: toAdd,
|
|
20072
|
+
updated: toUpdate,
|
|
20073
|
+
removed: toRemove,
|
|
20074
|
+
skipped: currentVars.size - toUpdate.length - toRemove.length
|
|
20075
|
+
};
|
|
20076
|
+
}
|
|
20077
|
+
parseEnvContent(content) {
|
|
20078
|
+
const envVars = new Map;
|
|
20079
|
+
const lines = content.split(`
|
|
20080
|
+
`);
|
|
20081
|
+
for (const line of lines) {
|
|
20082
|
+
const trimmedLine = line.trim();
|
|
20083
|
+
if (!trimmedLine || trimmedLine.startsWith("#")) {
|
|
20084
|
+
continue;
|
|
20085
|
+
}
|
|
20086
|
+
const eqIndex = trimmedLine.indexOf("=");
|
|
20087
|
+
if (eqIndex === -1) {
|
|
20088
|
+
continue;
|
|
20089
|
+
}
|
|
20090
|
+
const key = trimmedLine.slice(0, eqIndex).trim();
|
|
20091
|
+
let value = trimmedLine.slice(eqIndex + 1).trim();
|
|
20092
|
+
if (value.startsWith('"') && value.endsWith('"') || value.startsWith("'") && value.endsWith("'")) {
|
|
20093
|
+
value = value.slice(1, -1);
|
|
20094
|
+
}
|
|
20095
|
+
envVars.set(key, value);
|
|
20096
|
+
}
|
|
20097
|
+
return envVars;
|
|
20098
|
+
}
|
|
19850
20099
|
}
|
|
19851
20100
|
|
|
19852
20101
|
class DatabasesResource {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mks2508/coolify-mks-cli-mcp",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.8.0",
|
|
4
4
|
"description": "MCP server and CLI for Coolify deployment management",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -8,7 +8,8 @@
|
|
|
8
8
|
"types": "./dist/index.d.ts",
|
|
9
9
|
"bin": {
|
|
10
10
|
"coolify-mcp": "dist/cli/index.js",
|
|
11
|
-
"coolify-mcp-server": "dist/server/stdio.js"
|
|
11
|
+
"coolify-mcp-server": "dist/server/stdio.js",
|
|
12
|
+
"coolify-cli": "dist/cli/index.js"
|
|
12
13
|
},
|
|
13
14
|
"exports": {
|
|
14
15
|
".": {
|
|
@@ -52,14 +53,17 @@
|
|
|
52
53
|
"typecheck": "tsgo --noEmit"
|
|
53
54
|
},
|
|
54
55
|
"dependencies": {
|
|
56
|
+
"@clack/prompts": "^1.2.0",
|
|
55
57
|
"@mks2508/better-logger": "^4.0.0",
|
|
56
58
|
"@mks2508/no-throw": "^0.1.0",
|
|
57
59
|
"@modelcontextprotocol/sdk": "^1.25.2",
|
|
58
60
|
"chalk": "^5.4.1",
|
|
59
61
|
"cli-table3": "^0.6.5",
|
|
60
62
|
"commander": "^12.1.0",
|
|
63
|
+
"diff": "^8.0.4",
|
|
61
64
|
"ora": "^8.1.1",
|
|
62
|
-
"prompts": "^2.4.2"
|
|
65
|
+
"prompts": "^2.4.2",
|
|
66
|
+
"shiki": "^4.0.2"
|
|
63
67
|
},
|
|
64
68
|
"devDependencies": {
|
|
65
69
|
"@types/node": "^22.10.5",
|
|
@@ -72,5 +76,13 @@
|
|
|
72
76
|
},
|
|
73
77
|
"publishConfig": {
|
|
74
78
|
"access": "public"
|
|
75
|
-
}
|
|
79
|
+
},
|
|
80
|
+
"jsonSchema": [
|
|
81
|
+
{
|
|
82
|
+
"name": ".coolify.json",
|
|
83
|
+
"description": "Coolify deployment configuration",
|
|
84
|
+
"fileMatch": [".coolify.json"],
|
|
85
|
+
"url": "./coolify.json.schema.json"
|
|
86
|
+
}
|
|
87
|
+
]
|
|
76
88
|
}
|
package/src/cli/actions.ts
CHANGED
|
@@ -13,6 +13,7 @@ import Table from "cli-table3";
|
|
|
13
13
|
import { Coolify } from "../sdk.js";
|
|
14
14
|
import { formatStatus } from "../utils/format.js";
|
|
15
15
|
import { resolveUuid } from "./coolify-state.js";
|
|
16
|
+
import { resolveNameOrUuid } from "./name-resolver.js";
|
|
16
17
|
|
|
17
18
|
/** Singleton SDK instance for CLI (uses env vars / config file). */
|
|
18
19
|
let _sdk: Coolify | null = null;
|
|
@@ -42,7 +43,10 @@ export async function runAction(
|
|
|
42
43
|
callFn: (sdk: Coolify, uuid: string) => Promise<unknown>,
|
|
43
44
|
successMsg: (uuid: string) => string,
|
|
44
45
|
): Promise<void> {
|
|
45
|
-
|
|
46
|
+
let resolved = resolveUuid(uuid);
|
|
47
|
+
if (!resolved && uuid) {
|
|
48
|
+
resolved = await resolveNameOrUuid(uuid);
|
|
49
|
+
}
|
|
46
50
|
if (!resolved) {
|
|
47
51
|
console.error(
|
|
48
52
|
chalk.red("Error: No UUID provided and no .coolify.json found"),
|
|
@@ -129,7 +133,10 @@ export async function runGet<T>(
|
|
|
129
133
|
callFn: (sdk: Coolify, uuid: string) => Promise<T>,
|
|
130
134
|
formatFn: (item: T) => void,
|
|
131
135
|
): Promise<void> {
|
|
132
|
-
|
|
136
|
+
let resolved = resolveUuid(uuid);
|
|
137
|
+
if (!resolved && uuid) {
|
|
138
|
+
resolved = await resolveNameOrUuid(uuid);
|
|
139
|
+
}
|
|
133
140
|
if (!resolved) {
|
|
134
141
|
console.error(
|
|
135
142
|
chalk.red("Error: No UUID provided and no .coolify.json found"),
|
|
@@ -34,6 +34,8 @@ interface ICreateOptions {
|
|
|
34
34
|
dockerComposeLocation?: string;
|
|
35
35
|
dockerfileLocation?: string;
|
|
36
36
|
baseDirectory?: string;
|
|
37
|
+
githubAppUuid?: string;
|
|
38
|
+
domain?: string;
|
|
37
39
|
}
|
|
38
40
|
|
|
39
41
|
/**
|
|
@@ -86,6 +88,39 @@ export async function createCommand(options: ICreateOptions) {
|
|
|
86
88
|
return;
|
|
87
89
|
}
|
|
88
90
|
|
|
91
|
+
// Auto-detect GitHub App when type is private-github-app or not specified
|
|
92
|
+
let appType = options.type || "public";
|
|
93
|
+
let githubAppUuid = options.githubAppUuid;
|
|
94
|
+
|
|
95
|
+
if (!githubAppUuid && (appType === "private-github-app" || !options.type)) {
|
|
96
|
+
spinner.text = "Detecting GitHub Apps...";
|
|
97
|
+
const ghAppsResult = await coolify.listGithubApps();
|
|
98
|
+
|
|
99
|
+
if (isOk(ghAppsResult)) {
|
|
100
|
+
const nonPublicApps = ghAppsResult.value.filter((app) => !app.is_public && app.id !== 0);
|
|
101
|
+
|
|
102
|
+
if (nonPublicApps.length > 0) {
|
|
103
|
+
githubAppUuid = nonPublicApps[0].uuid;
|
|
104
|
+
appType = "private-github-app";
|
|
105
|
+
spinner.info(
|
|
106
|
+
chalk.cyan(
|
|
107
|
+
`Auto-detected GitHub App: ${nonPublicApps[0].name} (${githubAppUuid})`,
|
|
108
|
+
),
|
|
109
|
+
);
|
|
110
|
+
} else if (appType === "private-github-app") {
|
|
111
|
+
spinner.warn(
|
|
112
|
+
chalk.yellow("No private GitHub Apps found. Falling back to public type."),
|
|
113
|
+
);
|
|
114
|
+
appType = "public";
|
|
115
|
+
}
|
|
116
|
+
} else if (appType === "private-github-app") {
|
|
117
|
+
spinner.warn(
|
|
118
|
+
chalk.yellow(`Could not list GitHub Apps: ${ghAppsResult.error.message}. Falling back to public type.`),
|
|
119
|
+
);
|
|
120
|
+
appType = "public";
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
|
|
89
124
|
spinner.text = "Creating application...";
|
|
90
125
|
|
|
91
126
|
const result = await coolify.createApplication(
|
|
@@ -95,7 +130,8 @@ export async function createCommand(options: ICreateOptions) {
|
|
|
95
130
|
projectUuid: options.project,
|
|
96
131
|
environmentUuid,
|
|
97
132
|
serverUuid: options.server,
|
|
98
|
-
type:
|
|
133
|
+
type: appType,
|
|
134
|
+
githubAppUuid,
|
|
99
135
|
githubRepoUrl: options.repo,
|
|
100
136
|
branch: options.branch || "main",
|
|
101
137
|
buildPack: options.buildPack || "dockerfile",
|
|
@@ -112,19 +148,49 @@ export async function createCommand(options: ICreateOptions) {
|
|
|
112
148
|
);
|
|
113
149
|
|
|
114
150
|
if (isOk(result)) {
|
|
151
|
+
const createdUuid = result.value.uuid;
|
|
115
152
|
spinner.succeed(
|
|
116
153
|
chalk.green(
|
|
117
|
-
`Application created! UUID: ${chalk.cyan(
|
|
154
|
+
`Application created! UUID: ${chalk.cyan(createdUuid)}`,
|
|
118
155
|
),
|
|
119
156
|
);
|
|
157
|
+
|
|
158
|
+
// Set domain via PATCH if --domain was provided
|
|
159
|
+
if (options.domain && createdUuid) {
|
|
160
|
+
const domainSpinner = ora("Setting domain...").start();
|
|
161
|
+
const domainValue = options.domain.startsWith("http")
|
|
162
|
+
? options.domain
|
|
163
|
+
: `https://${options.domain}`;
|
|
164
|
+
|
|
165
|
+
const updateResult = await coolify.updateApplication(createdUuid, {
|
|
166
|
+
domains: domainValue,
|
|
167
|
+
});
|
|
168
|
+
|
|
169
|
+
if (isOk(updateResult)) {
|
|
170
|
+
domainSpinner.succeed(
|
|
171
|
+
chalk.green(`Domain set: ${chalk.cyan(domainValue)}`),
|
|
172
|
+
);
|
|
173
|
+
} else {
|
|
174
|
+
domainSpinner.fail(
|
|
175
|
+
chalk.red(`Failed to set domain: ${updateResult.error.message}`),
|
|
176
|
+
);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
|
|
120
180
|
console.log(` Name: ${chalk.cyan(options.name)}`);
|
|
121
|
-
console.log(` Type: ${chalk.cyan(
|
|
181
|
+
console.log(` Type: ${chalk.cyan(appType)}`);
|
|
182
|
+
if (options.domain) {
|
|
183
|
+
const domainValue = options.domain.startsWith("http")
|
|
184
|
+
? options.domain
|
|
185
|
+
: `https://${options.domain}`;
|
|
186
|
+
console.log(` Domain: ${chalk.cyan(domainValue)}`);
|
|
187
|
+
}
|
|
122
188
|
console.log(` Next steps:`);
|
|
123
189
|
console.log(
|
|
124
|
-
` 1. Set environment variables: ${chalk.yellow("coolify-mcp env " +
|
|
190
|
+
` 1. Set environment variables: ${chalk.yellow("coolify-mcp env " + createdUuid)}`,
|
|
125
191
|
);
|
|
126
192
|
console.log(
|
|
127
|
-
` 2. Deploy application: ${chalk.yellow("coolify-mcp deploy " +
|
|
193
|
+
` 2. Deploy application: ${chalk.yellow("coolify-mcp deploy " + createdUuid)}`,
|
|
128
194
|
);
|
|
129
195
|
} else {
|
|
130
196
|
spinner.fail(chalk.red(`Creation failed: ${result.error.message}`));
|
package/src/cli/commands/db.ts
CHANGED
|
@@ -16,6 +16,7 @@ import type {
|
|
|
16
16
|
ICoolifyDatabase,
|
|
17
17
|
ICoolifyDatabaseBackup,
|
|
18
18
|
} from "../../coolify/types.js";
|
|
19
|
+
import { resolveDbNameOrUuid } from "../name-resolver.js";
|
|
19
20
|
|
|
20
21
|
/** List all databases. */
|
|
21
22
|
export const dbListCommand = () =>
|
|
@@ -110,6 +111,42 @@ export const dbDeleteCommand = (uuid: string) =>
|
|
|
110
111
|
(u) => `Database deleted: ${u}`,
|
|
111
112
|
);
|
|
112
113
|
|
|
114
|
+
/**
|
|
115
|
+
* Update a database configuration.
|
|
116
|
+
*
|
|
117
|
+
* @param uuid - Database UUID
|
|
118
|
+
* @param options - Update options (publicPort, isPublic)
|
|
119
|
+
*/
|
|
120
|
+
export async function dbUpdateCommand(
|
|
121
|
+
uuidOrName: string,
|
|
122
|
+
options: { publicPort?: string; isPublic?: boolean },
|
|
123
|
+
): Promise<void> {
|
|
124
|
+
try {
|
|
125
|
+
const uuid = await resolveDbNameOrUuid(uuidOrName) ?? uuidOrName;
|
|
126
|
+
const data: Record<string, unknown> = {};
|
|
127
|
+
|
|
128
|
+
if (options.publicPort !== undefined) data.public_port = options.publicPort;
|
|
129
|
+
if (options.isPublic !== undefined) data.is_public = options.isPublic;
|
|
130
|
+
|
|
131
|
+
if (Object.keys(data).length === 0) {
|
|
132
|
+
console.warn(
|
|
133
|
+
chalk.yellow("No update options provided. Use --help to see available options."),
|
|
134
|
+
);
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
console.log(chalk.cyan(`Updating database ${chalk.bold(uuid)}...`));
|
|
139
|
+
await getCliSdk().databases.update(uuid, data);
|
|
140
|
+
console.log(chalk.green("Database updated successfully"));
|
|
141
|
+
} catch (error) {
|
|
142
|
+
console.error(
|
|
143
|
+
chalk.red(
|
|
144
|
+
`Error: ${error instanceof Error ? error.message : String(error)}`,
|
|
145
|
+
),
|
|
146
|
+
);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
|
|
113
150
|
/** List backups for a database. */
|
|
114
151
|
export const dbBackupsCommand = (uuid: string) =>
|
|
115
152
|
runList<ICoolifyDatabaseBackup>(
|