@geekmidas/cli 0.44.0 → 0.46.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 (48) hide show
  1. package/dist/{config-C0b0jdmU.mjs → config-C3LSBNSl.mjs} +2 -2
  2. package/dist/{config-C0b0jdmU.mjs.map → config-C3LSBNSl.mjs.map} +1 -1
  3. package/dist/{config-xVZsRjN7.cjs → config-HYiM3iQJ.cjs} +2 -2
  4. package/dist/{config-xVZsRjN7.cjs.map → config-HYiM3iQJ.cjs.map} +1 -1
  5. package/dist/config.cjs +2 -2
  6. package/dist/config.d.cts +1 -1
  7. package/dist/config.d.mts +1 -1
  8. package/dist/config.mjs +2 -2
  9. package/dist/dokploy-api-C1JgU9Vr.mjs +3 -0
  10. package/dist/dokploy-api-Cpq_tLSz.cjs +3 -0
  11. package/dist/{dokploy-api-BdxOMH_V.cjs → dokploy-api-D8a0eQQB.cjs} +110 -1
  12. package/dist/dokploy-api-D8a0eQQB.cjs.map +1 -0
  13. package/dist/{dokploy-api-DWsqNjwP.mjs → dokploy-api-b6usLLKk.mjs} +110 -1
  14. package/dist/dokploy-api-b6usLLKk.mjs.map +1 -0
  15. package/dist/{index-CXa3odEw.d.mts → index-BtnjoghR.d.mts} +540 -46
  16. package/dist/index-BtnjoghR.d.mts.map +1 -0
  17. package/dist/{index-E8Nu2Rxl.d.cts → index-c89X2mi2.d.cts} +540 -46
  18. package/dist/index-c89X2mi2.d.cts.map +1 -0
  19. package/dist/index.cjs +254 -131
  20. package/dist/index.cjs.map +1 -1
  21. package/dist/index.mjs +254 -131
  22. package/dist/index.mjs.map +1 -1
  23. package/dist/{openapi-D3pA6FfZ.mjs → openapi-C3C-BzIZ.mjs} +2 -2
  24. package/dist/{openapi-D3pA6FfZ.mjs.map → openapi-C3C-BzIZ.mjs.map} +1 -1
  25. package/dist/{openapi-DhcCtKzM.cjs → openapi-D7WwlpPF.cjs} +2 -2
  26. package/dist/{openapi-DhcCtKzM.cjs.map → openapi-D7WwlpPF.cjs.map} +1 -1
  27. package/dist/openapi.cjs +3 -3
  28. package/dist/openapi.mjs +3 -3
  29. package/dist/workspace/index.cjs +1 -1
  30. package/dist/workspace/index.d.cts +1 -1
  31. package/dist/workspace/index.d.mts +1 -1
  32. package/dist/workspace/index.mjs +1 -1
  33. package/dist/{workspace-BDAhr6Kb.cjs → workspace-CaVW6j2q.cjs} +10 -1
  34. package/dist/{workspace-BDAhr6Kb.cjs.map → workspace-CaVW6j2q.cjs.map} +1 -1
  35. package/dist/{workspace-D_6ZCaR_.mjs → workspace-DLFRaDc-.mjs} +10 -1
  36. package/dist/{workspace-D_6ZCaR_.mjs.map → workspace-DLFRaDc-.mjs.map} +1 -1
  37. package/package.json +4 -4
  38. package/src/deploy/dokploy-api.ts +163 -0
  39. package/src/deploy/index.ts +313 -225
  40. package/src/deploy/state.ts +146 -0
  41. package/src/workspace/types.ts +566 -47
  42. package/tsconfig.tsbuildinfo +1 -1
  43. package/dist/dokploy-api-Bdmk5ImW.cjs +0 -3
  44. package/dist/dokploy-api-BdxOMH_V.cjs.map +0 -1
  45. package/dist/dokploy-api-DWsqNjwP.mjs.map +0 -1
  46. package/dist/dokploy-api-tZSZaHd9.mjs +0 -3
  47. package/dist/index-CXa3odEw.d.mts.map +0 -1
  48. package/dist/index-E8Nu2Rxl.d.cts.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-c89X2mi2.d.cts","names":[],"sources":["../src/workspace/types.ts","../src/workspace/schema.ts","../src/workspace/index.ts"],"sourcesContent":[],"mappings":";;;;;;;;AA0BA;AAwBA;AAsBA;AAcA;AA2BA;AA2CA;;;;;AAMmC;AAuBnC;AAqBY,KApLA,YAAA,GAoLe,SAAY,GAAM,QAAA,GAAA,YAAA;AAwB7C;AAyCA;;;;AAIiC;AAmBjC;AA4BA;AAuBA;AA2BA;AAGC;;;;;;;;;;;;AAyIU,KA9cC,gBAAA,GA8cD,MAAA,GAAA,aAAA,GAAA,SAAA,GAAA,SAAA;;;;;AAqEc;AAmCzB;;;;AACsB;AAStB;AAQA;AAOA;;;;AAA+B;AAM/B;;;AACa,KAhkBD,iBAAA,GAgkBC,QAAA,GAAA,OAAA,GAAA,MAAA;;;;;AACyB;AAqCtC;;;;;;;AAUY,UAlmBK,kBAAA,CAkmBL;EAAc;EAEF,OAAA,CAAA,EAAA,MAAA;EAMZ;EAAa,KAAA,CAAA,EAAA,MAAA;;;AAAwC;AAKjE;;;;;;;;;;;;;AAUwB;AA8FxB;;;;AAQU,UApsBO,iBAAA,SAA0B,kBAosBjC,CAAA;EAAY;EAGA,IAGV,CAAA,EAAA;IAGD,IAAA,EAAA,MAAA;IAAa,IAAA,EAAA,MAAA;IASP,IAAA,CAAA,EAAA,MAAA;IAAoB,IAAA,CAAA,EAAA,MAAA;EAAA,CAAA;;;;;;AAAY;AA2BjD;;;;;;;;AAcuB;AAMvB;;;;;AAM+B;AAe/B;;;;;AAE4B;;;;AC74BD;AAyF0B;AAUrD;AASA;AASgB,UDuCC,cAAA,CCvCmB;EA0JvB;EA2FV,EAAA,CAAA,EAAA,OAAA,GD5Ma,kBC4Mb;EAAA;oBD1MgB;;mBAED;;;;;;;;;;;;;;;;;;;;;;KAuBN,oBAAA,GAAuB;;;;;;;;;;;;;;;;;;;;KAqBvB,eAAA,YAA2B;;;;;;;;;;;;;;;;;;;;;;;UAwBtB,sBAAA;;;;;;;;;;;;;;YAcN;;;;;;;;;;;;;;;;;;;;;;;;;;UA2BM,YAAA;;YAEN;;YAEA;;;;;;;;;;;;;;;;;;UAmBM,YAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;UA4BA,YAAA;;;;WAIP;;;;;;;;;;;;;;;;;;UAmBO,aAAA;;;;;;;;;AC1EiB;AAiGlC;;;;AAEU;AAOV;;;;;AAGmB;AAYnB;;;;AC3QA;AAA+B,UFuPd,YAAA,CEvPc;EAAA;EAA+B,MACtC,CAAA,EAAA,MAAA;;;;AACE;AA8B1B;;;;AAGsB;AA4CtB;;;;AAGsB;AAyDtB;;;;;AAGe;AA2Bf;;;;AAGY;AA2BZ;AA8BA;;;;AAIS;;;;;;UFsDC,aAAA;;;;;;;;;;;;;;;;;;;;;;;;WA2BA;;;;;WAUA;;;;;cAMG;;;;;UAMJ;;;;;gBAMM;;;;;;;;;;;;cAeF;;;;;UAMJ;;;;;iCAMuB;;;;;8BAMH;;;;;sBAMR;;;;;YAMV;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAuCE,mBAAmB;;;;;WAMtB;;;;;;;;;;;;;;;;;;;WAwBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;UAmCO,0DACR;;iBAEO;;;;;;UAOC,SAAA,SAAkB;;;;;;;KAQvB,QAAA,GAAW;;;;;;KAOX,UAAA,GAAa,eAAe;;;;;KAM5B,8BAA8B,4BAC7B,QAAQ,KAAK,MAAM;iCACC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAqCrB,6BAA6B;;;;QAIlC,gBAAgB;;WAEb;;WAEA;;aAEE;;YAED;;;;;KAMC,4BAA4B,oBAAoB;;;;KAKhD,sCAAsC;;sBAGpC,QAAQ,KAAK,MAAM;mBACf,cAAc;;WAGtB;WACA;aACE;YACD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;UA8FM,eAAA;;;;QAKV,eAAe;;WAGZ;;WAGA;;aAGE;;YAGD;;;;;;;;UASM,mBAAA,SAA4B,KAAK;;;;;;;;;;wBAU3B;;;;cAIV,mBAAmB;;WAEtB;;;;;;;;;;UAWO,mBAAA;;;;;;QAMV,eAAe;;YAEX;;UAEF;;UAEA;;WAEC;;;;;UAMO,YAAA;;;;OAIX,YAAY;;aAEN;;;;;;;;;;;;;;iBAeI,iBAAA,SACP,YAAY,4BACR;;;;;;AAn3Bb,cC+DM,wBD/DkB,EAAA,SAAA,CAAA,SAAA,CAAA;AAwBxB;AAsBA;AAcA;AA2BA,cCnBM,sBDmBqC,EAAA,SAAA,CAAA,QAAkB,EAAA,YAAA,CAAA;AA2C7D;;;AAImB,iBC7DH,uBAAA,CD6DG,MAAA,EAAA,MAAA,CAAA,EAAA,OAAA;;AAEgB;AAuBnC;AAqBY,iBClGI,oBAAA,CDkG6B,MAAA,EAAA,MAAA,CAAA,EAAA,OAAA;AAwB7C;AAyCA;;AAEW,iBC5JK,oBAAA,CD4JL,MAAA,EAAA,MAAA,EAAA,OAAA,CAAA,EAAA,MAAA,CAAA,EAAA,MAAA;;AAEsB;AAmBjC;AA4BiB,cCnDJ,qBDuDS,ECvDY,CAAA,CAAA,SDuDZ,CAAA;EAmBL,IAAA,eAAa,CCiB3B,CAAA,CAAA,SDjB2B,CAAA;EA2Bb,IAAA,aAAY,YAAA,aAAA,CAAA;IAwCnB,IAAA,cAAa,cAAA,UAAA,CAAA;MAAA,OAAA,EAAA,SAAA;MA2Bb,QAAA,EAAA,UAAA;MAUA,IAAA,EAAA,MAAA;IAMG,CAAA,CAAA,CAAA,CAAA;IAMJ,IAAA,aAAA;IAMM,IAAA,aAAA;IAeF,YAAA,eAAA,WAAA,YAAA,CAAA,CAAA;IAMJ,MAAA,eAAA,UAAA,CAAA;MAMuB,OAAA,EAAA,SAAA;MAMH,MAAA,EAAA,QAAA;MAMR,UAAA,EAAA,YAAA;IAMV,CAAA,CAAA,CAAA;IAuCE,MAAA,eAAA,WAAA,CAAA,SAAA,YAAA,YAAA,YAAA,CAAA,CAAA,CAAA,CAAA;IAAmB,SAAA,eAAA,WAAA,CAAA,SAAA,YAAA,YAAA,YAAA,CAAA,CAAA,CAAA,CAAA;IAMtB,KAAA,eAAA,WAAA,CAAA,SAAA,YAAA,YAAA,YAAA,CAAA,CAAA,CAAA,CAAA;IAwBA,WAAA,eAAA,WAAA,CAAA,SAAA,YAAA,YAAA,YAAA,CAAA,CAAA,CAAA,CAAA;IAAe,SAAA,eAAA,YAAA,CAAA;IAmCR,MAAA,eAAc,YAAA,CAAA;IAAA,KAAA,eAAA,YAAA,CAAA;MAGf,MAAA,eAAA,YAAA,CAAA;IAFP,CAAA,eAAA,CAAA,CAAA;IAAa,SAAA,eAAA,WAAA,CAAA,SAAA,YAAA,cAAA,aAAA,CAAA;MASL,OAAU,eAAQ,aAAa,CAAA;MAQpC,IAAQ,eAAG,YAAa,CAAA;MAOxB,IAAA,eAAU,YAAA,CAAA;MAAA,MAAA,eAAA,WAAA,YAAA,CAAA,CAAA;MAAkB,UAAA,eAAA,aAAA,CAAA;MAAf,UAAA,eAAA,YAAA,CAAA;MAAM,SAAA,eAAA,aAAA,CAAA;IAMnB,CAAA,eAAe,CAAA,CAAA,CAAA,CAAA;IAAA,MAAA,eAAA,WAAA,CAAA,SAAA,YAAA,cAAA,aAAA,CAAA;MAAe,OAAA,eAAA,aAAA,CAAA;MAC7B,IAAA,eAAA,YAAA,CAAA;MAAa,MAAA,eAAA,YAAA,CAAA;IAAM,CAAA,eAAA,CAAA,CAAA,CAAA,CAAA;IAAX,OAAA,eAAA,WAAA,CAAA,SAAA,aAAA,aAAA,CAAA;MACY,OAAA,eAAA,aAAA,CAAA;MAAK,KAAA,eAAA,YAAA,CAAA;MAqC1B,OAAA,eAAc,YAAA,CAAA;MAAA,WAAA,eAAA,YAAA,CAAA;IAAe,CAAA,eAAA,CAAA,CAAA,CAAA,CAAA;IAIlB,OAAA,eAAA,UAAA,CAAA;MAAhB,IAAA,EAAA,MAAA;MAEG,GAAA,EAAA,KAAA;IAEA,CAAA,CAAA,CAAA;IAEE,GAAA,eAAA,WAAA,CAAA,SAAA,YAAA,YAAA,YAAA,CAAA,CAAA,CAAA,CAAA;IAED,KAAA,eAAA,YAAA,CAAA;IAAa,SAAA,eAAA,WAAA,CAAA,SAAA,UAAA,CAAA;MAMZ,IAAA,EAAA,MAAa;MAAA,aAAA,EAAA,aAAA;MAAe,OAAA,EAAA,SAAA;MAAoB,OAAA,EAAA,SAAA;IAAK,CAAA,CAAA,WAAA,CAAA;MAKrD,MAAA,EAAA,QAAA;MAAuB,KAAA,EAAA,OAAA;MAAe,IAAA,EAAA,MAAA;IAGpC,CAAA,CAAA,CAAA,CAAA,CAAA;IAAa,MAAA,eAAA,YAAA,CAAA;MAAM,MAAA,eAAA,YAAA,CAAA;IAAX,CAAA,eAAA,CAAA,CAAA;IACU,QAAA,eAAA,UAAA,CAAA;MAAd,aAAA,EAAA,aAAA;IAGR,CAAA,CAAA,CAAA;EAAY,CAAA,eACZ,CAAA,CAAA;EAAY,MACV,eAAA,YAAA,CAAA;IACD,QAAA,eAAA,WAAA,YAAA,CAAA,CAAA;IAAa,MAAA,eAAA,YAAA,CAAA;MA8FP,IAAA,eAAe,YAAA,CAAA;MAAA,MAAA,eAAA,UAAA,CAAA;QAKV,GAAA,EAAA,KAAA;MAAf,CAAA,CAAA,CAAA;IAGG,CAAA,eAAA,CAAA,CAAA;EAAY,CAAA,eAGZ,CAAA,CAAA;EAAY,MAGV,eAAA,YAAA,CAAA;IAGD,OAAA,eAAA,UAAA,CAAA;MAAa,OAAA,EAAA,SAAA;MASP,MAAA,EAAA,QAAoB;MAAA,UAAA,EAAA,YAAA;IAAa,CAAA,CAAA,CAAA;IAU3B,OAAA,eAAA,YAAA,CAAA;MAIV,QAAA,UAAA;MAAmB,SAAA,aAAA;MAEtB,QAAA,eAAA,YAAA,CAAA;MAhBmC,UAAA,eAAA,YAAA,CAAA;IAAI,CAAA,eAAA,CAAA,CAAA;EA2BhC,CAAA,eAAA,CAAA,CAAA;EAAmB,QAAA,eAAA,YAAA,CAAA;IAMd,EAAA,eAAA,WAAA,CAAA,SAAA,aAAA,aAAA,CAAA;MAAf,OAAA,eAAA,YAAA,CAAA;MAEI,KAAA,eAAA,YAAA,CAAA;IAEF,CAAA,eAAA,CAAA,CAAA,CAAA,CAAA;IAEA,KAAA,eAAA,WAAA,CAAA,SAAA,aAAA,aAAA,CAAA;MAEC,OAAA,eAAA,YAAA,CAAA;MAAa,KAAA,eAAA,YAAA,CAAA;IAMN,CAAA,eAAY,CAAA,CAAA,CAAA,CAAA;IAAA,IAAA,eAAA,WAAA,CAAA,SAAA,aAAA,aAAA,CAAA;MAIvB,OAAA,eAAA,YAAA,CAAA;MAAY,KAAA,eAAA,YAAA,CAAA;MAEN,IAAA,eAAA,YAAA,CAAA;QAAmB,IAAA,aAAA;QAef,IAAA,aAAiB;QAAA,IAAA,eAAA,YAAA,CAAA;QACxB,IAAA,eAAA,YAAA,CAAA;MAAY,CAAA,eAAA,CAAA,CAAA;IACR,CAAA,eAAA,CAAA,CAAA,CAAA,CAAA;EAAe,CAAA,eAAA,CAAA,CAAA;;;;ICpzBtB,GAAA,eAAA,UAA+C,CAAA;MAK/C,MAAA,EAAA,QAAA;MAKU,MAAA,EAAA,QAAA;IASA,CAAA,CAAA,CAAA;EASA,CAAA,eAAA,CAAA,CAAA;AA0JhB,CAAA,eAAa,CAAA;;;;;iBAiGG,uBAAA,mBAEb,CAAA,CAAE,aAAa;;;;iBAOF,2BAAA;;SAER,CAAA,CAAE,aAAa;UACd,CAAA,CAAE;;;;;iBAYK,sBAAA,QAA8B,CAAA,CAAE;;;ADtVhD;AAsBA;AAcA;AA2BA;AA2CA;;;;;AAMmC;AAuBnC;AAqBA;AAwBA;AAyCA;;;;AAIiC;AAmBjC;AA4BA;AAuBA;AA2BA;AAGC;;;;;;;;;;;;;;;;;AA8MwB;AAmCzB;;AAGgB,iBE9eA,eF8eA,CAAA,oBE9eoC,UF8epC,CAAA,CAAA,MAAA,EE7eP,cF6eO,CE7eQ,KF6eR,CAAA,CAAA,EE5eb,uBF4ea,CE5eW,KF4eX,CAAA;;AAFM;AAStB;AAQY,iBE7dI,kBAAA,CF6doB,MAAA,EE5d3B,eF4d2B,EAAA,GAAA,EAAA,MAAA,CAAA,EE1djC,mBF0diC;AAOpC;;;;AAA+B,iBErbf,wBAAA,CFqbe,MAAA,EEpbtB,SFobsB,EAAA,GAAA,EAAA,MAAA,CAAA,EElb5B,mBFkb4B;AAM/B;;;;AAC0B,iBEhYV,aAAA,CFgYU,MAAA,EE/XjB,SF+XiB,GE/XL,eF+XK,EAAA,GAAA,EAAA,MAAA,CAAA,EE7XvB,YF6XuB;;;;AACY;AAqC1B,iBExYI,eAAA,CFwYU,SAAA,EEvYd,mBFuYc,EAAA,OAAA,EAAA,MAAA,CAAA,EErYvB,SFqYuB,GAAA,SAAA;;;;;AAMhB,iBEhXM,gBAAA,CFgXN,SAAA,EEhXkC,mBFgXlC,CAAA,EAAA,MAAA,EAAA;;;;AAMc;AAMZ,iBE9VI,oBAAA,CF8VS,SAAA,EE7Vb,mBF6Va,EAAA,OAAA,EAAA,MAAA,EAAA,SAAA,CAAA,EAAA,MAAA,CAAA,EE1VtB,MF0VsB,CAAA,MAAA,EAAA,MAAA,CAAA"}
package/dist/index.cjs CHANGED
@@ -1,10 +1,10 @@
1
1
  #!/usr/bin/env -S npx tsx
2
2
  const require_chunk = require('./chunk-CUT6urMc.cjs');
3
- const require_workspace = require('./workspace-BDAhr6Kb.cjs');
4
- const require_config = require('./config-xVZsRjN7.cjs');
5
- const require_openapi = require('./openapi-DhcCtKzM.cjs');
3
+ const require_workspace = require('./workspace-CaVW6j2q.cjs');
4
+ const require_config = require('./config-HYiM3iQJ.cjs');
5
+ const require_openapi = require('./openapi-D7WwlpPF.cjs');
6
6
  const require_storage = require('./storage-BPRgh3DU.cjs');
7
- const require_dokploy_api = require('./dokploy-api-BdxOMH_V.cjs');
7
+ const require_dokploy_api = require('./dokploy-api-D8a0eQQB.cjs');
8
8
  const require_encryption = require('./encryption-DaCB_NmS.cjs');
9
9
  const require_openapi_react_query = require('./openapi-react-query-C_MxpBgF.cjs');
10
10
  const node_fs = require_chunk.__toESM(require("node:fs"));
@@ -29,7 +29,7 @@ const node_module = require_chunk.__toESM(require("node:module"));
29
29
 
30
30
  //#region package.json
31
31
  var name = "@geekmidas/cli";
32
- var version = "0.44.0";
32
+ var version = "0.46.0";
33
33
  var description = "CLI tools for building Lambda handlers, server applications, and generating OpenAPI specs";
34
34
  var private$1 = false;
35
35
  var type = "module";
@@ -228,7 +228,7 @@ const logger$10 = console;
228
228
  * Validate Dokploy token by making a test API call
229
229
  */
230
230
  async function validateDokployToken(endpoint, token) {
231
- const { DokployApi: DokployApi$1 } = await Promise.resolve().then(() => require("./dokploy-api-Bdmk5ImW.cjs"));
231
+ const { DokployApi: DokployApi$1 } = await Promise.resolve().then(() => require("./dokploy-api-Cpq_tLSz.cjs"));
232
232
  const api = new DokployApi$1({
233
233
  baseUrl: endpoint,
234
234
  token
@@ -3811,6 +3811,89 @@ async function deployDokploy(options) {
3811
3811
  };
3812
3812
  }
3813
3813
 
3814
+ //#endregion
3815
+ //#region src/deploy/state.ts
3816
+ /**
3817
+ * Get the state file path for a stage
3818
+ */
3819
+ function getStateFilePath(workspaceRoot, stage) {
3820
+ return (0, node_path.join)(workspaceRoot, ".gkm", `deploy-${stage}.json`);
3821
+ }
3822
+ /**
3823
+ * Read the deploy state for a stage
3824
+ * Returns null if state file doesn't exist
3825
+ */
3826
+ async function readStageState(workspaceRoot, stage) {
3827
+ const filePath = getStateFilePath(workspaceRoot, stage);
3828
+ try {
3829
+ const content = await (0, node_fs_promises.readFile)(filePath, "utf-8");
3830
+ return JSON.parse(content);
3831
+ } catch (error) {
3832
+ if (error.code === "ENOENT") return null;
3833
+ console.warn(`Warning: Could not read deploy state: ${error}`);
3834
+ return null;
3835
+ }
3836
+ }
3837
+ /**
3838
+ * Write the deploy state for a stage
3839
+ */
3840
+ async function writeStageState(workspaceRoot, stage, state) {
3841
+ const filePath = getStateFilePath(workspaceRoot, stage);
3842
+ const dir = (0, node_path.join)(workspaceRoot, ".gkm");
3843
+ await (0, node_fs_promises.mkdir)(dir, { recursive: true });
3844
+ state.lastDeployedAt = (/* @__PURE__ */ new Date()).toISOString();
3845
+ await (0, node_fs_promises.writeFile)(filePath, JSON.stringify(state, null, 2));
3846
+ }
3847
+ /**
3848
+ * Create a new empty state for a stage
3849
+ */
3850
+ function createEmptyState(stage, environmentId) {
3851
+ return {
3852
+ provider: "dokploy",
3853
+ stage,
3854
+ environmentId,
3855
+ applications: {},
3856
+ services: {},
3857
+ lastDeployedAt: (/* @__PURE__ */ new Date()).toISOString()
3858
+ };
3859
+ }
3860
+ /**
3861
+ * Get application ID from state
3862
+ */
3863
+ function getApplicationId(state, appName) {
3864
+ return state?.applications[appName];
3865
+ }
3866
+ /**
3867
+ * Set application ID in state (mutates state)
3868
+ */
3869
+ function setApplicationId(state, appName, applicationId) {
3870
+ state.applications[appName] = applicationId;
3871
+ }
3872
+ /**
3873
+ * Get postgres ID from state
3874
+ */
3875
+ function getPostgresId(state) {
3876
+ return state?.services.postgresId;
3877
+ }
3878
+ /**
3879
+ * Set postgres ID in state (mutates state)
3880
+ */
3881
+ function setPostgresId(state, postgresId) {
3882
+ state.services.postgresId = postgresId;
3883
+ }
3884
+ /**
3885
+ * Get redis ID from state
3886
+ */
3887
+ function getRedisId(state) {
3888
+ return state?.services.redisId;
3889
+ }
3890
+ /**
3891
+ * Set redis ID in state (mutates state)
3892
+ */
3893
+ function setRedisId(state, redisId) {
3894
+ state.services.redisId = redisId;
3895
+ }
3896
+
3814
3897
  //#endregion
3815
3898
  //#region src/deploy/domain.ts
3816
3899
  /**
@@ -4315,24 +4398,39 @@ async function prompt(message, hidden = false) {
4315
4398
  * Provision docker compose services in Dokploy
4316
4399
  * @internal Exported for testing
4317
4400
  */
4318
- async function provisionServices(api, projectId, environmentId, appName, services, existingUrls) {
4401
+ async function provisionServices(api, projectId, environmentId, appName, services, existingServiceIds) {
4319
4402
  logger$1.log(`\n🔍 provisionServices called: services=${JSON.stringify(services)}, envId=${environmentId}`);
4320
4403
  if (!services || !environmentId) {
4321
4404
  logger$1.log(" Skipping: no services or no environmentId");
4322
4405
  return void 0;
4323
4406
  }
4324
4407
  const serviceUrls = {};
4325
- if (services.postgres) if (existingUrls?.DATABASE_URL) logger$1.log("\n🐘 PostgreSQL: Already configured (skipping)");
4326
- else {
4327
- logger$1.log("\n🐘 Provisioning PostgreSQL...");
4328
- const postgresName = `${appName}-db`;
4408
+ const serviceIds = {};
4409
+ if (services.postgres) {
4410
+ logger$1.log("\n🐘 Checking PostgreSQL...");
4411
+ const postgresName = "db";
4329
4412
  try {
4330
- const { randomBytes: randomBytes$1 } = await import("node:crypto");
4331
- const databasePassword = randomBytes$1(16).toString("hex");
4332
- const postgres = await api.createPostgres(postgresName, projectId, environmentId, { databasePassword });
4333
- logger$1.log(` Created PostgreSQL: ${postgres.postgresId}`);
4334
- await api.deployPostgres(postgres.postgresId);
4335
- logger$1.log(" ✓ PostgreSQL deployed");
4413
+ let postgres = null;
4414
+ let created = false;
4415
+ if (existingServiceIds?.postgresId) {
4416
+ logger$1.log(` Using cached ID: ${existingServiceIds.postgresId}`);
4417
+ postgres = await api.getPostgres(existingServiceIds.postgresId);
4418
+ if (postgres) logger$1.log(` ✓ PostgreSQL found: ${postgres.postgresId}`);
4419
+ else logger$1.log(` ⚠ Cached ID invalid, will create new`);
4420
+ }
4421
+ if (!postgres) {
4422
+ const { randomBytes: randomBytes$1 } = await import("node:crypto");
4423
+ const databasePassword = randomBytes$1(16).toString("hex");
4424
+ const result = await api.findOrCreatePostgres(postgresName, projectId, environmentId, { databasePassword });
4425
+ postgres = result.postgres;
4426
+ created = result.created;
4427
+ if (created) {
4428
+ logger$1.log(` ✓ Created PostgreSQL: ${postgres.postgresId}`);
4429
+ await api.deployPostgres(postgres.postgresId);
4430
+ logger$1.log(" ✓ PostgreSQL deployed");
4431
+ } else logger$1.log(` ✓ PostgreSQL already exists: ${postgres.postgresId}`);
4432
+ }
4433
+ serviceIds.postgresId = postgres.postgresId;
4336
4434
  serviceUrls.DATABASE_HOST = postgres.appName;
4337
4435
  serviceUrls.DATABASE_PORT = "5432";
4338
4436
  serviceUrls.DATABASE_NAME = postgres.databaseName;
@@ -4342,21 +4440,34 @@ async function provisionServices(api, projectId, environmentId, appName, service
4342
4440
  logger$1.log(` ✓ Database credentials configured`);
4343
4441
  } catch (error) {
4344
4442
  const message = error instanceof Error ? error.message : "Unknown error";
4345
- if (message.includes("already exists") || message.includes("duplicate")) logger$1.log(` PostgreSQL already exists`);
4346
- else logger$1.log(` ⚠ Failed to provision PostgreSQL: ${message}`);
4443
+ logger$1.log(` Failed to provision PostgreSQL: ${message}`);
4347
4444
  }
4348
4445
  }
4349
- if (services.redis) if (existingUrls?.REDIS_URL) logger$1.log("\n🔴 Redis: Already configured (skipping)");
4350
- else {
4351
- logger$1.log("\n🔴 Provisioning Redis...");
4352
- const redisName = `${appName}-cache`;
4446
+ if (services.redis) {
4447
+ logger$1.log("\n🔴 Checking Redis...");
4448
+ const redisName = "cache";
4353
4449
  try {
4354
- const { randomBytes: randomBytes$1 } = await import("node:crypto");
4355
- const databasePassword = randomBytes$1(16).toString("hex");
4356
- const redis = await api.createRedis(redisName, projectId, environmentId, { databasePassword });
4357
- logger$1.log(` Created Redis: ${redis.redisId}`);
4358
- await api.deployRedis(redis.redisId);
4359
- logger$1.log(" ✓ Redis deployed");
4450
+ let redis = null;
4451
+ let created = false;
4452
+ if (existingServiceIds?.redisId) {
4453
+ logger$1.log(` Using cached ID: ${existingServiceIds.redisId}`);
4454
+ redis = await api.getRedis(existingServiceIds.redisId);
4455
+ if (redis) logger$1.log(` ✓ Redis found: ${redis.redisId}`);
4456
+ else logger$1.log(` ⚠ Cached ID invalid, will create new`);
4457
+ }
4458
+ if (!redis) {
4459
+ const { randomBytes: randomBytes$1 } = await import("node:crypto");
4460
+ const databasePassword = randomBytes$1(16).toString("hex");
4461
+ const result = await api.findOrCreateRedis(redisName, projectId, environmentId, { databasePassword });
4462
+ redis = result.redis;
4463
+ created = result.created;
4464
+ if (created) {
4465
+ logger$1.log(` ✓ Created Redis: ${redis.redisId}`);
4466
+ await api.deployRedis(redis.redisId);
4467
+ logger$1.log(" ✓ Redis deployed");
4468
+ } else logger$1.log(` ✓ Redis already exists: ${redis.redisId}`);
4469
+ }
4470
+ serviceIds.redisId = redis.redisId;
4360
4471
  serviceUrls.REDIS_HOST = redis.appName;
4361
4472
  serviceUrls.REDIS_PORT = "6379";
4362
4473
  if (redis.databasePassword) serviceUrls.REDIS_PASSWORD = redis.databasePassword;
@@ -4365,11 +4476,13 @@ async function provisionServices(api, projectId, environmentId, appName, service
4365
4476
  logger$1.log(` ✓ Redis credentials configured`);
4366
4477
  } catch (error) {
4367
4478
  const message = error instanceof Error ? error.message : "Unknown error";
4368
- if (message.includes("already exists") || message.includes("duplicate")) logger$1.log(` Redis already exists`);
4369
- else logger$1.log(` ⚠ Failed to provision Redis: ${message}`);
4479
+ logger$1.log(` Failed to provision Redis: ${message}`);
4370
4480
  }
4371
4481
  }
4372
- return Object.keys(serviceUrls).length > 0 ? serviceUrls : void 0;
4482
+ return Object.keys(serviceUrls).length > 0 ? {
4483
+ serviceUrls,
4484
+ serviceIds
4485
+ } : void 0;
4373
4486
  }
4374
4487
  /**
4375
4488
  * Ensure Dokploy is fully configured, recovering/creating resources as needed
@@ -4424,7 +4537,7 @@ async function ensureDokploySetup(config, dockerConfig, stage, services) {
4424
4537
  }
4425
4538
  const environmentId$1 = environment.environmentId;
4426
4539
  logger$1.log(` Services config: ${JSON.stringify(services)}, envId: ${environmentId$1}`);
4427
- const serviceUrls$1 = await provisionServices(api, existingConfig.projectId, environmentId$1, dockerConfig.appName, services, existingUrls);
4540
+ const provisionResult$1 = await provisionServices(api, existingConfig.projectId, environmentId$1, dockerConfig.appName, services, void 0);
4428
4541
  return {
4429
4542
  config: {
4430
4543
  endpoint: existingConfig.endpoint,
@@ -4433,7 +4546,7 @@ async function ensureDokploySetup(config, dockerConfig, stage, services) {
4433
4546
  registry: existingConfig.registry,
4434
4547
  registryId: storedRegistryId ?? void 0
4435
4548
  },
4436
- serviceUrls: serviceUrls$1
4549
+ serviceUrls: provisionResult$1?.serviceUrls
4437
4550
  };
4438
4551
  } catch {
4439
4552
  logger$1.log("⚠ Project not found, will recover...");
@@ -4540,10 +4653,10 @@ async function ensureDokploySetup(config, dockerConfig, stage, services) {
4540
4653
  logger$1.log(` Project: ${project.projectId}`);
4541
4654
  logger$1.log(` Application: ${applicationId}`);
4542
4655
  if (registryId) logger$1.log(` Registry: ${registryId}`);
4543
- const serviceUrls = await provisionServices(api, project.projectId, environmentId, dockerConfig.appName, services, existingUrls);
4656
+ const provisionResult = await provisionServices(api, project.projectId, environmentId, dockerConfig.appName, services, void 0);
4544
4657
  return {
4545
4658
  config: dokployConfig,
4546
- serviceUrls
4659
+ serviceUrls: provisionResult?.serviceUrls
4547
4660
  };
4548
4661
  }
4549
4662
  /**
@@ -4662,6 +4775,18 @@ async function workspaceDeployCommand(workspace, options) {
4662
4775
  } else environmentId = result.environment.environmentId;
4663
4776
  logger$1.log(` ✓ Created project: ${project.projectId}`);
4664
4777
  }
4778
+ logger$1.log("\n📋 Loading deploy state...");
4779
+ let state = await readStageState(workspace.root, stage);
4780
+ if (state) {
4781
+ logger$1.log(` Found existing state for stage "${stage}"`);
4782
+ if (state.environmentId !== environmentId) {
4783
+ logger$1.log(` ⚠ Environment ID changed, updating state`);
4784
+ state.environmentId = environmentId;
4785
+ }
4786
+ } else {
4787
+ logger$1.log(` Creating new state for stage "${stage}"`);
4788
+ state = createEmptyState(stage, environmentId);
4789
+ }
4665
4790
  logger$1.log("\n🐳 Checking registry...");
4666
4791
  let registryId = await getDokployRegistryId();
4667
4792
  const registry = workspace.deploy.dokploy?.registry;
@@ -4697,7 +4822,15 @@ async function workspaceDeployCommand(workspace, options) {
4697
4822
  };
4698
4823
  if (dockerServices.postgres || dockerServices.redis) {
4699
4824
  logger$1.log("\n🔧 Provisioning infrastructure services...");
4700
- await provisionServices(api, project.projectId, environmentId, workspace.name, dockerServices);
4825
+ const existingServiceIds = {
4826
+ postgresId: getPostgresId(state),
4827
+ redisId: getRedisId(state)
4828
+ };
4829
+ const provisionResult = await provisionServices(api, project.projectId, environmentId, workspace.name, dockerServices, existingServiceIds);
4830
+ if (provisionResult?.serviceIds) {
4831
+ if (provisionResult.serviceIds.postgresId) setPostgresId(state, provisionResult.serviceIds.postgresId);
4832
+ if (provisionResult.serviceIds.redisId) setRedisId(state, provisionResult.serviceIds.redisId);
4833
+ }
4701
4834
  }
4702
4835
  const backendApps = appsToDeployNames.filter((name$1) => workspace.apps[name$1].type === "backend");
4703
4836
  const frontendApps = appsToDeployNames.filter((name$1) => workspace.apps[name$1].type === "frontend");
@@ -4710,16 +4843,22 @@ async function workspaceDeployCommand(workspace, options) {
4710
4843
  const app = workspace.apps[appName];
4711
4844
  logger$1.log(`\n ⚙️ Deploying ${appName}...`);
4712
4845
  try {
4713
- const dokployAppName = `${workspace.name}-${appName}`;
4714
- let application;
4715
- try {
4716
- application = await api.createApplication(dokployAppName, project.projectId, environmentId);
4717
- logger$1.log(` Created application: ${application.applicationId}`);
4718
- } catch (error) {
4719
- const message = error instanceof Error ? error.message : "Unknown error";
4720
- if (message.includes("already exists") || message.includes("duplicate")) logger$1.log(` Application already exists`);
4721
- else throw error;
4846
+ const dokployAppName = appName;
4847
+ let application = null;
4848
+ const cachedAppId = getApplicationId(state, appName);
4849
+ if (cachedAppId) {
4850
+ logger$1.log(` Using cached ID: ${cachedAppId}`);
4851
+ application = await api.getApplication(cachedAppId);
4852
+ if (application) logger$1.log(` ✓ Application found: ${application.applicationId}`);
4853
+ else logger$1.log(` Cached ID invalid, will create new`);
4854
+ }
4855
+ if (!application) {
4856
+ const result = await api.findOrCreateApplication(dokployAppName, project.projectId, environmentId);
4857
+ application = result.application;
4858
+ if (result.created) logger$1.log(` Created application: ${application.applicationId}`);
4859
+ else logger$1.log(` Found existing application: ${application.applicationId}`);
4722
4860
  }
4861
+ setApplicationId(state, appName, application.applicationId);
4723
4862
  const appSecrets = encryptedSecrets.get(appName);
4724
4863
  const buildArgs = [];
4725
4864
  if (appSecrets && appSecrets.secretCount > 0) {
@@ -4743,47 +4882,35 @@ async function workspaceDeployCommand(workspace, options) {
4743
4882
  });
4744
4883
  const envVars = [`NODE_ENV=production`, `PORT=${app.port}`];
4745
4884
  if (appSecrets && appSecrets.masterKey) envVars.push(`GKM_MASTER_KEY=${appSecrets.masterKey}`);
4746
- if (application) {
4747
- await api.saveDockerProvider(application.applicationId, imageRef, { registryId });
4748
- await api.saveApplicationEnv(application.applicationId, envVars.join("\n"));
4749
- logger$1.log(` Deploying to Dokploy...`);
4750
- await api.deployApplication(application.applicationId);
4751
- try {
4752
- const host = resolveHost(appName, app, stage, dokployConfig, false);
4753
- await api.createDomain({
4754
- host,
4755
- port: app.port,
4756
- https: true,
4757
- certificateType: "letsencrypt",
4758
- applicationId: application.applicationId
4759
- });
4760
- const publicUrl = `https://${host}`;
4761
- publicUrls[appName] = publicUrl;
4762
- logger$1.log(` ✓ Domain: ${publicUrl}`);
4763
- } catch (domainError) {
4764
- const host = resolveHost(appName, app, stage, dokployConfig, false);
4765
- publicUrls[appName] = `https://${host}`;
4766
- logger$1.log(` ℹ Domain already configured: https://${host}`);
4767
- }
4768
- results.push({
4769
- appName,
4770
- type: app.type,
4771
- success: true,
4772
- applicationId: application.applicationId,
4773
- imageRef
4885
+ await api.saveDockerProvider(application.applicationId, imageRef, { registryId });
4886
+ await api.saveApplicationEnv(application.applicationId, envVars.join("\n"));
4887
+ logger$1.log(` Deploying to Dokploy...`);
4888
+ await api.deployApplication(application.applicationId);
4889
+ try {
4890
+ const host = resolveHost(appName, app, stage, dokployConfig, false);
4891
+ await api.createDomain({
4892
+ host,
4893
+ port: app.port,
4894
+ https: true,
4895
+ certificateType: "letsencrypt",
4896
+ applicationId: application.applicationId
4774
4897
  });
4775
- logger$1.log(` ✓ ${appName} deployed successfully`);
4776
- } else {
4898
+ const publicUrl = `https://${host}`;
4899
+ publicUrls[appName] = publicUrl;
4900
+ logger$1.log(` ✓ Domain: ${publicUrl}`);
4901
+ } catch (domainError) {
4777
4902
  const host = resolveHost(appName, app, stage, dokployConfig, false);
4778
4903
  publicUrls[appName] = `https://${host}`;
4779
- results.push({
4780
- appName,
4781
- type: app.type,
4782
- success: true,
4783
- imageRef
4784
- });
4785
- logger$1.log(` ✓ ${appName} image pushed (app already exists)`);
4904
+ logger$1.log(` ℹ Domain already configured: https://${host}`);
4786
4905
  }
4906
+ results.push({
4907
+ appName,
4908
+ type: app.type,
4909
+ success: true,
4910
+ applicationId: application.applicationId,
4911
+ imageRef
4912
+ });
4913
+ logger$1.log(` ✓ ${appName} deployed successfully`);
4787
4914
  } catch (error) {
4788
4915
  const message = error instanceof Error ? error.message : "Unknown error";
4789
4916
  logger$1.log(` ✗ Failed to deploy ${appName}: ${message}`);
@@ -4803,16 +4930,22 @@ async function workspaceDeployCommand(workspace, options) {
4803
4930
  const app = workspace.apps[appName];
4804
4931
  logger$1.log(`\n 🌐 Deploying ${appName}...`);
4805
4932
  try {
4806
- const dokployAppName = `${workspace.name}-${appName}`;
4807
- let application;
4808
- try {
4809
- application = await api.createApplication(dokployAppName, project.projectId, environmentId);
4810
- logger$1.log(` Created application: ${application.applicationId}`);
4811
- } catch (error) {
4812
- const message = error instanceof Error ? error.message : "Unknown error";
4813
- if (message.includes("already exists") || message.includes("duplicate")) logger$1.log(` Application already exists`);
4814
- else throw error;
4933
+ const dokployAppName = appName;
4934
+ let application = null;
4935
+ const cachedAppId = getApplicationId(state, appName);
4936
+ if (cachedAppId) {
4937
+ logger$1.log(` Using cached ID: ${cachedAppId}`);
4938
+ application = await api.getApplication(cachedAppId);
4939
+ if (application) logger$1.log(` ✓ Application found: ${application.applicationId}`);
4940
+ else logger$1.log(` Cached ID invalid, will create new`);
4815
4941
  }
4942
+ if (!application) {
4943
+ const result = await api.findOrCreateApplication(dokployAppName, project.projectId, environmentId);
4944
+ application = result.application;
4945
+ if (result.created) logger$1.log(` Created application: ${application.applicationId}`);
4946
+ else logger$1.log(` Found existing application: ${application.applicationId}`);
4947
+ }
4948
+ setApplicationId(state, appName, application.applicationId);
4816
4949
  const buildArgs = generatePublicUrlBuildArgs(app, publicUrls);
4817
4950
  if (buildArgs.length > 0) logger$1.log(` Public URLs: ${buildArgs.join(", ")}`);
4818
4951
  const imageName = `${workspace.name}-${appName}`;
@@ -4831,49 +4964,36 @@ async function workspaceDeployCommand(workspace, options) {
4831
4964
  publicUrlArgs: getPublicUrlArgNames(app)
4832
4965
  });
4833
4966
  const envVars = [`NODE_ENV=production`, `PORT=${app.port}`];
4834
- if (application) {
4835
- await api.saveDockerProvider(application.applicationId, imageRef, { registryId });
4836
- await api.saveApplicationEnv(application.applicationId, envVars.join("\n"));
4837
- logger$1.log(` Deploying to Dokploy...`);
4838
- await api.deployApplication(application.applicationId);
4839
- const isMainFrontend = isMainFrontendApp(appName, app, workspace.apps);
4840
- try {
4841
- const host = resolveHost(appName, app, stage, dokployConfig, isMainFrontend);
4842
- await api.createDomain({
4843
- host,
4844
- port: app.port,
4845
- https: true,
4846
- certificateType: "letsencrypt",
4847
- applicationId: application.applicationId
4848
- });
4849
- const publicUrl = `https://${host}`;
4850
- publicUrls[appName] = publicUrl;
4851
- logger$1.log(` ✓ Domain: ${publicUrl}`);
4852
- } catch (domainError) {
4853
- const host = resolveHost(appName, app, stage, dokployConfig, isMainFrontend);
4854
- publicUrls[appName] = `https://${host}`;
4855
- logger$1.log(` ℹ Domain already configured: https://${host}`);
4856
- }
4857
- results.push({
4858
- appName,
4859
- type: app.type,
4860
- success: true,
4861
- applicationId: application.applicationId,
4862
- imageRef
4967
+ await api.saveDockerProvider(application.applicationId, imageRef, { registryId });
4968
+ await api.saveApplicationEnv(application.applicationId, envVars.join("\n"));
4969
+ logger$1.log(` Deploying to Dokploy...`);
4970
+ await api.deployApplication(application.applicationId);
4971
+ const isMainFrontend = isMainFrontendApp(appName, app, workspace.apps);
4972
+ try {
4973
+ const host = resolveHost(appName, app, stage, dokployConfig, isMainFrontend);
4974
+ await api.createDomain({
4975
+ host,
4976
+ port: app.port,
4977
+ https: true,
4978
+ certificateType: "letsencrypt",
4979
+ applicationId: application.applicationId
4863
4980
  });
4864
- logger$1.log(` ✓ ${appName} deployed successfully`);
4865
- } else {
4866
- const isMainFrontend = isMainFrontendApp(appName, app, workspace.apps);
4981
+ const publicUrl = `https://${host}`;
4982
+ publicUrls[appName] = publicUrl;
4983
+ logger$1.log(` ✓ Domain: ${publicUrl}`);
4984
+ } catch (domainError) {
4867
4985
  const host = resolveHost(appName, app, stage, dokployConfig, isMainFrontend);
4868
4986
  publicUrls[appName] = `https://${host}`;
4869
- results.push({
4870
- appName,
4871
- type: app.type,
4872
- success: true,
4873
- imageRef
4874
- });
4875
- logger$1.log(` ✓ ${appName} image pushed (app already exists)`);
4987
+ logger$1.log(` ℹ Domain already configured: https://${host}`);
4876
4988
  }
4989
+ results.push({
4990
+ appName,
4991
+ type: app.type,
4992
+ success: true,
4993
+ applicationId: application.applicationId,
4994
+ imageRef
4995
+ });
4996
+ logger$1.log(` ✓ ${appName} deployed successfully`);
4877
4997
  } catch (error) {
4878
4998
  const message = error instanceof Error ? error.message : "Unknown error";
4879
4999
  logger$1.log(` ✗ Failed to deploy ${appName}: ${message}`);
@@ -4886,6 +5006,9 @@ async function workspaceDeployCommand(workspace, options) {
4886
5006
  }
4887
5007
  }
4888
5008
  }
5009
+ logger$1.log("\n📋 Saving deploy state...");
5010
+ await writeStageState(workspace.root, stage, state);
5011
+ logger$1.log(` ✓ State saved to .gkm/deploy-${stage}.json`);
4889
5012
  const successCount = results.filter((r) => r.success).length;
4890
5013
  const failedCount = results.filter((r) => !r.success).length;
4891
5014
  logger$1.log(`\n${"─".repeat(50)}`);