@mks2508/coolify-mks-cli-mcp 0.6.2 → 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.
Files changed (60) hide show
  1. package/dist/cli/coolify-state.d.ts +92 -4
  2. package/dist/cli/coolify-state.d.ts.map +1 -1
  3. package/dist/cli/index.js +22228 -11529
  4. package/dist/cli/ui/highlighter.d.ts +28 -0
  5. package/dist/cli/ui/highlighter.d.ts.map +1 -0
  6. package/dist/cli/ui/index.d.ts +9 -0
  7. package/dist/cli/ui/index.d.ts.map +1 -0
  8. package/dist/cli/ui/spinners.d.ts +100 -0
  9. package/dist/cli/ui/spinners.d.ts.map +1 -0
  10. package/dist/cli/ui/tables.d.ts +103 -0
  11. package/dist/cli/ui/tables.d.ts.map +1 -0
  12. package/dist/coolify/index.d.ts +22 -3
  13. package/dist/coolify/index.d.ts.map +1 -1
  14. package/dist/coolify/types.d.ts +99 -1
  15. package/dist/coolify/types.d.ts.map +1 -1
  16. package/dist/examples/demo-ui.d.ts +8 -0
  17. package/dist/examples/demo-ui.d.ts.map +1 -0
  18. package/dist/index.cjs +322 -12
  19. package/dist/index.cjs.map +1 -1
  20. package/dist/index.js +322 -12
  21. package/dist/index.js.map +1 -1
  22. package/dist/sdk.d.ts +41 -0
  23. package/dist/sdk.d.ts.map +1 -1
  24. package/dist/server/stdio.js +258 -9
  25. package/package.json +19 -4
  26. package/src/cli/actions.ts +9 -2
  27. package/src/cli/commands/create.ts +71 -5
  28. package/src/cli/commands/db.ts +37 -0
  29. package/src/cli/commands/delete.ts +6 -2
  30. package/src/cli/commands/deploy.ts +347 -49
  31. package/src/cli/commands/deployments.ts +6 -2
  32. package/src/cli/commands/diagnose.ts +3 -3
  33. package/src/cli/commands/env.ts +121 -22
  34. package/src/cli/commands/exec.ts +6 -2
  35. package/src/cli/commands/init.ts +937 -0
  36. package/src/cli/commands/logs.ts +224 -24
  37. package/src/cli/commands/main-menu.ts +21 -0
  38. package/src/cli/commands/projects.ts +312 -29
  39. package/src/cli/commands/restart.ts +6 -2
  40. package/src/cli/commands/service-logs.ts +14 -0
  41. package/src/cli/commands/show.ts +6 -2
  42. package/src/cli/commands/start.ts +6 -2
  43. package/src/cli/commands/status.ts +538 -0
  44. package/src/cli/commands/stop.ts +6 -2
  45. package/src/cli/commands/update.ts +27 -2
  46. package/src/cli/coolify-state.ts +164 -11
  47. package/src/cli/index.ts +91 -10
  48. package/src/cli/name-resolver.ts +228 -0
  49. package/src/cli/ui/banner.ts +276 -0
  50. package/src/cli/ui/highlighter.ts +176 -0
  51. package/src/cli/ui/index.ts +9 -0
  52. package/src/cli/ui/prompts.ts +155 -0
  53. package/src/cli/ui/screen.ts +606 -0
  54. package/src/cli/ui/select.ts +280 -0
  55. package/src/cli/ui/spinners.ts +256 -0
  56. package/src/cli/ui/tables.ts +407 -0
  57. package/src/coolify/index.ts +257 -12
  58. package/src/coolify/types.ts +103 -1
  59. package/src/examples/demo-ui.ts +78 -0
  60. 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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"}
@@ -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, _isBuildTime = false) {
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({ key, value })
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({ key, value })
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.6.2",
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",
@@ -69,5 +73,16 @@
69
73
  },
70
74
  "engines": {
71
75
  "node": ">=18.0.0"
72
- }
76
+ },
77
+ "publishConfig": {
78
+ "access": "public"
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
+ ]
73
88
  }
@@ -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
- const resolved = resolveUuid(uuid);
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
- const resolved = resolveUuid(uuid);
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: options.type || "public",
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(result.value.uuid)}`,
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(options.type || "public")}`);
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 " + result.value.uuid)}`,
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 " + result.value.uuid)}`,
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}`));
@@ -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>(