quicklify 0.4.1 → 0.5.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/README.md +55 -14
- package/dist/commands/config.d.ts +2 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +63 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/destroy.d.ts.map +1 -1
- package/dist/commands/destroy.js +7 -42
- package/dist/commands/destroy.js.map +1 -1
- package/dist/commands/restart.d.ts +2 -0
- package/dist/commands/restart.d.ts.map +1 -0
- package/dist/commands/restart.js +58 -0
- package/dist/commands/restart.js.map +1 -0
- package/dist/commands/ssh.d.ts +4 -0
- package/dist/commands/ssh.d.ts.map +1 -0
- package/dist/commands/ssh.js +33 -0
- package/dist/commands/ssh.js.map +1 -0
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +6 -43
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/update.d.ts +2 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +63 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/index.js +21 -0
- package/dist/index.js.map +1 -1
- package/dist/providers/base.d.ts +1 -0
- package/dist/providers/base.d.ts.map +1 -1
- package/dist/providers/digitalocean.d.ts +1 -0
- package/dist/providers/digitalocean.d.ts.map +1 -1
- package/dist/providers/digitalocean.js +21 -5
- package/dist/providers/digitalocean.js.map +1 -1
- package/dist/providers/hetzner.d.ts +1 -0
- package/dist/providers/hetzner.d.ts.map +1 -1
- package/dist/providers/hetzner.js +21 -5
- package/dist/providers/hetzner.js.map +1 -1
- package/dist/types/index.d.ts +6 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/utils/defaults.d.ts +10 -0
- package/dist/utils/defaults.d.ts.map +1 -0
- package/dist/utils/defaults.js +47 -0
- package/dist/utils/defaults.js.map +1 -0
- package/dist/utils/serverSelect.d.ts +5 -0
- package/dist/utils/serverSelect.d.ts.map +1 -0
- package/dist/utils/serverSelect.js +49 -0
- package/dist/utils/serverSelect.js.map +1 -0
- package/dist/utils/ssh.d.ts +8 -0
- package/dist/utils/ssh.d.ts.map +1 -0
- package/dist/utils/ssh.js +37 -0
- package/dist/utils/ssh.js.map +1 -0
- package/package.json +13 -10
package/README.md
CHANGED
|
@@ -45,7 +45,10 @@ npx quicklify init
|
|
|
45
45
|
- ✨ **Dynamic Server Types** - Only shows compatible types for selected location
|
|
46
46
|
- 🔥 **Auto Firewall** - Ports 8000, 22, 80, 443 configured automatically
|
|
47
47
|
- 🚀 **Zero SSH Required** - Opens directly in browser after deployment
|
|
48
|
-
- 📋 **Server Management** - List, status check,
|
|
48
|
+
- 📋 **Server Management** - List, status check, destroy, restart commands
|
|
49
|
+
- 🔧 **Default Config** - Set defaults to skip repetitive prompts
|
|
50
|
+
- 🔑 **SSH Access** - Connect to servers or run remote commands
|
|
51
|
+
- 🔄 **Coolify Update** - Update Coolify with one command
|
|
49
52
|
- 🏥 **Health Check Polling** - Detects when Coolify is ready (no more blind waiting)
|
|
50
53
|
- 🤖 **Non-Interactive Mode** - CI/CD friendly with `--provider --token --region --size --name` flags
|
|
51
54
|
|
|
@@ -159,13 +162,19 @@ For production use, we recommend setting up a domain instead of using the IP add
|
|
|
159
162
|
|
|
160
163
|
## 📋 Recent Updates
|
|
161
164
|
|
|
165
|
+
### v0.5.0 (2026-02-20)
|
|
166
|
+
- **New commands:** `quicklify config`, `quicklify ssh`, `quicklify update`, `quicklify restart`
|
|
167
|
+
- **Default config:** Set defaults for provider, region, size with `quicklify config set`
|
|
168
|
+
- **SSH access:** Connect to servers with `quicklify ssh` or run commands with `--command`
|
|
169
|
+
- **Coolify updates:** Update Coolify via SSH with `quicklify update`
|
|
170
|
+
- **Server restart:** Reboot via provider API with `quicklify restart`
|
|
171
|
+
- 311 tests with 97%+ statement coverage
|
|
172
|
+
|
|
162
173
|
### v0.4.0 (2026-02-20)
|
|
163
174
|
- **New commands:** `quicklify list`, `quicklify status [query]`, `quicklify destroy [query]`
|
|
164
175
|
- **Non-interactive mode:** `quicklify init --provider --token --region --size --name` for CI/CD
|
|
165
176
|
- **Health check polling:** Detects when Coolify is ready instead of blind waiting
|
|
166
|
-
-
|
|
167
|
-
- **`destroyServer()`** added to provider interface (Hetzner + DigitalOcean)
|
|
168
|
-
- 233 tests with 97%+ statement coverage
|
|
177
|
+
- 246 tests with 97%+ statement coverage
|
|
169
178
|
|
|
170
179
|
### v0.3.1 (2026-02-19)
|
|
171
180
|
- Hetzner pricing now shows net prices (excl. VAT), matching website display
|
|
@@ -221,25 +230,33 @@ For production use, we recommend setting up a domain instead of using the IP add
|
|
|
221
230
|
- [x] `destroyServer()` on provider interface
|
|
222
231
|
- [x] Double confirmation safety for destroy
|
|
223
232
|
|
|
233
|
+
### v0.5.0 (Completed)
|
|
234
|
+
|
|
235
|
+
- [x] Default configuration management (`quicklify config`)
|
|
236
|
+
- [x] SSH access to servers (`quicklify ssh`)
|
|
237
|
+
- [x] Coolify update via SSH (`quicklify update`)
|
|
238
|
+
- [x] Server restart via provider API (`quicklify restart`)
|
|
239
|
+
- [x] Shared server selection and token utilities (DRY refactor)
|
|
240
|
+
|
|
224
241
|
### Future
|
|
225
242
|
- [ ] Vultr support
|
|
226
|
-
- [ ] Linode support
|
|
227
|
-
- [ ] Domain configuration helper
|
|
228
|
-
- [ ]
|
|
229
|
-
- [ ]
|
|
230
|
-
- [ ]
|
|
231
|
-
- [ ]
|
|
243
|
+
- [ ] Linode / AWS Lightsail support
|
|
244
|
+
- [ ] Domain + SSL configuration helper
|
|
245
|
+
- [ ] Backup/restore commands
|
|
246
|
+
- [ ] Server monitoring (CPU/RAM/Disk)
|
|
247
|
+
- [ ] Interactive TUI dashboard
|
|
248
|
+
- [ ] Firewall management
|
|
232
249
|
|
|
233
250
|
## 🛠️ Tech Stack
|
|
234
251
|
|
|
235
|
-
- **Runtime:** Node.js
|
|
252
|
+
- **Runtime:** Node.js 20+
|
|
236
253
|
- **Language:** TypeScript
|
|
237
254
|
- **CLI Framework:** Commander.js
|
|
238
255
|
- **Interactive Prompts:** Inquirer.js
|
|
239
256
|
- **Styling:** Chalk (colors) + Ora (spinners)
|
|
240
257
|
- **HTTP Client:** Axios
|
|
241
258
|
- **Cloud APIs:** Hetzner Cloud API v1, DigitalOcean API v2
|
|
242
|
-
- **Linting:** ESLint
|
|
259
|
+
- **Linting:** ESLint 10 + typescript-eslint
|
|
243
260
|
- **Formatting:** Prettier
|
|
244
261
|
|
|
245
262
|
## 📖 CLI Reference
|
|
@@ -264,6 +281,23 @@ quicklify status my-server
|
|
|
264
281
|
quicklify destroy 123.45.67.89
|
|
265
282
|
quicklify destroy my-server
|
|
266
283
|
|
|
284
|
+
# Manage default configuration
|
|
285
|
+
quicklify config set provider hetzner
|
|
286
|
+
quicklify config set region nbg1
|
|
287
|
+
quicklify config get provider
|
|
288
|
+
quicklify config list
|
|
289
|
+
quicklify config reset
|
|
290
|
+
|
|
291
|
+
# SSH into a server
|
|
292
|
+
quicklify ssh my-server
|
|
293
|
+
quicklify ssh 123.45.67.89 -c "docker ps"
|
|
294
|
+
|
|
295
|
+
# Update Coolify on a server
|
|
296
|
+
quicklify update my-server
|
|
297
|
+
|
|
298
|
+
# Restart a server
|
|
299
|
+
quicklify restart my-server
|
|
300
|
+
|
|
267
301
|
# Show version
|
|
268
302
|
quicklify --version
|
|
269
303
|
|
|
@@ -341,6 +375,8 @@ tests/
|
|
|
341
375
|
│ ├── cloudInit.test.ts
|
|
342
376
|
│ ├── config.test.ts # Config CRUD operations
|
|
343
377
|
│ ├── config-edge.test.ts # Config edge cases (corruption, empty files)
|
|
378
|
+
│ ├── config-command.test.ts # Config command subcommands
|
|
379
|
+
│ ├── defaults.test.ts # Default config CRUD
|
|
344
380
|
│ ├── destroy.test.ts # Destroy command unit tests
|
|
345
381
|
│ ├── healthCheck.test.ts # Health check polling tests
|
|
346
382
|
│ ├── healthCheck-edge.test.ts # Health check edge cases (302, 401, 500)
|
|
@@ -348,7 +384,12 @@ tests/
|
|
|
348
384
|
│ ├── logger.test.ts
|
|
349
385
|
│ ├── prompts.test.ts
|
|
350
386
|
│ ├── providerFactory.test.ts # Provider factory tests
|
|
387
|
+
│ ├── restart.test.ts # Restart command tests
|
|
388
|
+
│ ├── serverSelect.test.ts # Server selection utility tests
|
|
389
|
+
│ ├── ssh-command.test.ts # SSH command tests
|
|
390
|
+
│ ├── ssh-utils.test.ts # SSH helper tests
|
|
351
391
|
│ ├── status.test.ts # Status command unit tests
|
|
392
|
+
│ ├── update.test.ts # Update command tests
|
|
352
393
|
│ └── validators.test.ts
|
|
353
394
|
├── integration/ # Integration tests (provider API calls)
|
|
354
395
|
│ ├── hetzner.test.ts # Including destroyServer tests
|
|
@@ -365,11 +406,11 @@ tests/
|
|
|
365
406
|
Tests run automatically on every push/PR via GitHub Actions across:
|
|
366
407
|
|
|
367
408
|
- **OS:** Ubuntu, macOS, Windows
|
|
368
|
-
- **Node.js:**
|
|
409
|
+
- **Node.js:** 20, 22
|
|
369
410
|
|
|
370
411
|
### Coverage
|
|
371
412
|
|
|
372
|
-
Current coverage: **97%+ statements/lines**, **
|
|
413
|
+
Current coverage: **97%+ statements/lines**, **88%+ branches**, **97%+ functions**. 311 tests across 25 test suites.
|
|
373
414
|
|
|
374
415
|
## 🔧 Troubleshooting
|
|
375
416
|
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AAGA,wBAAsB,aAAa,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAyDvF"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { getDefaults, setDefault, getDefault, resetDefaults, VALID_KEYS } from "../utils/defaults.js";
|
|
2
|
+
import { logger } from "../utils/logger.js";
|
|
3
|
+
export async function configCommand(subcommand, args) {
|
|
4
|
+
switch (subcommand) {
|
|
5
|
+
case "set": {
|
|
6
|
+
if (!args || args.length < 2) {
|
|
7
|
+
logger.error("Usage: quicklify config set <key> <value>");
|
|
8
|
+
return;
|
|
9
|
+
}
|
|
10
|
+
const [key, value] = args;
|
|
11
|
+
try {
|
|
12
|
+
setDefault(key, value);
|
|
13
|
+
logger.success(`Set ${key} = ${value}`);
|
|
14
|
+
}
|
|
15
|
+
catch (error) {
|
|
16
|
+
logger.error(error instanceof Error ? error.message : String(error));
|
|
17
|
+
}
|
|
18
|
+
break;
|
|
19
|
+
}
|
|
20
|
+
case "get": {
|
|
21
|
+
if (!args || args.length < 1) {
|
|
22
|
+
logger.error("Usage: quicklify config get <key>");
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
const val = getDefault(args[0]);
|
|
26
|
+
if (val !== undefined) {
|
|
27
|
+
logger.info(`${args[0]} = ${val}`);
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
logger.info(`${args[0]} is not set`);
|
|
31
|
+
}
|
|
32
|
+
break;
|
|
33
|
+
}
|
|
34
|
+
case "list": {
|
|
35
|
+
const config = getDefaults();
|
|
36
|
+
const entries = Object.entries(config).filter(([, v]) => v !== undefined);
|
|
37
|
+
if (entries.length === 0) {
|
|
38
|
+
logger.info("No default config set. Use: quicklify config set <key> <value>");
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
logger.title("Default Configuration");
|
|
42
|
+
for (const [k, v] of entries) {
|
|
43
|
+
logger.info(`${k.padEnd(12)} ${v}`);
|
|
44
|
+
}
|
|
45
|
+
break;
|
|
46
|
+
}
|
|
47
|
+
case "reset": {
|
|
48
|
+
resetDefaults();
|
|
49
|
+
logger.success("Default configuration reset");
|
|
50
|
+
break;
|
|
51
|
+
}
|
|
52
|
+
default:
|
|
53
|
+
logger.error("Usage: quicklify config <set|get|list|reset>");
|
|
54
|
+
logger.info(` set <key> <value> Set a default value`);
|
|
55
|
+
logger.info(` get <key> Get a default value`);
|
|
56
|
+
logger.info(` list Show all defaults`);
|
|
57
|
+
logger.info(` reset Clear all defaults`);
|
|
58
|
+
logger.info(``);
|
|
59
|
+
logger.info(`Valid keys: ${VALID_KEYS.join(", ")}`);
|
|
60
|
+
break;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACtG,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,UAAmB,EAAE,IAAe;IACtE,QAAQ,UAAU,EAAE,CAAC;QACnB,KAAK,KAAK,CAAC,CAAC,CAAC;YACX,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC7B,MAAM,CAAC,KAAK,CAAC,2CAA2C,CAAC,CAAC;gBAC1D,OAAO;YACT,CAAC;YACD,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,IAAI,CAAC;YAC1B,IAAI,CAAC;gBACH,UAAU,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;gBACvB,MAAM,CAAC,OAAO,CAAC,OAAO,GAAG,MAAM,KAAK,EAAE,CAAC,CAAC;YAC1C,CAAC;YAAC,OAAO,KAAc,EAAE,CAAC;gBACxB,MAAM,CAAC,KAAK,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YACvE,CAAC;YACD,MAAM;QACR,CAAC;QACD,KAAK,KAAK,CAAC,CAAC,CAAC;YACX,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC7B,MAAM,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC;gBAClD,OAAO;YACT,CAAC;YACD,MAAM,GAAG,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;YAChC,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;gBACtB,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;YACrC,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC;YACvC,CAAC;YACD,MAAM;QACR,CAAC;QACD,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,MAAM,MAAM,GAAG,WAAW,EAAE,CAAC;YAC7B,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC;YAC1E,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACzB,MAAM,CAAC,IAAI,CAAC,gEAAgE,CAAC,CAAC;gBAC9E,OAAO;YACT,CAAC;YACD,MAAM,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;YACtC,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,OAAO,EAAE,CAAC;gBAC7B,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACtC,CAAC;YACD,MAAM;QACR,CAAC;QACD,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,aAAa,EAAE,CAAC;YAChB,MAAM,CAAC,OAAO,CAAC,6BAA6B,CAAC,CAAC;YAC9C,MAAM;QACR,CAAC;QACD;YACE,MAAM,CAAC,KAAK,CAAC,8CAA8C,CAAC,CAAC;YAC7D,MAAM,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC;YACxD,MAAM,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC;YACxD,MAAM,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;YACtD,MAAM,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC;YACvD,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAChB,MAAM,CAAC,IAAI,CAAC,eAAe,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACpD,MAAM;IACV,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"destroy.d.ts","sourceRoot":"","sources":["../../src/commands/destroy.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"destroy.d.ts","sourceRoot":"","sources":["../../src/commands/destroy.ts"],"names":[],"mappings":"AAMA,wBAAsB,cAAc,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA2DlE"}
|
package/dist/commands/destroy.js
CHANGED
|
@@ -1,40 +1,12 @@
|
|
|
1
1
|
import inquirer from "inquirer";
|
|
2
|
-
import {
|
|
2
|
+
import { removeServer } from "../utils/config.js";
|
|
3
|
+
import { resolveServer, promptApiToken } from "../utils/serverSelect.js";
|
|
3
4
|
import { createProviderWithToken } from "../utils/providerFactory.js";
|
|
4
5
|
import { logger, createSpinner } from "../utils/logger.js";
|
|
5
|
-
async function selectServer() {
|
|
6
|
-
const servers = getServers();
|
|
7
|
-
if (servers.length === 0) {
|
|
8
|
-
logger.info("No servers found.");
|
|
9
|
-
return undefined;
|
|
10
|
-
}
|
|
11
|
-
const { serverId } = await inquirer.prompt([
|
|
12
|
-
{
|
|
13
|
-
type: "list",
|
|
14
|
-
name: "serverId",
|
|
15
|
-
message: "Select a server to destroy:",
|
|
16
|
-
choices: servers.map((s) => ({
|
|
17
|
-
name: `${s.name} (${s.ip}) - ${s.provider}`,
|
|
18
|
-
value: s.id,
|
|
19
|
-
})),
|
|
20
|
-
},
|
|
21
|
-
]);
|
|
22
|
-
return servers.find((s) => s.id === serverId);
|
|
23
|
-
}
|
|
24
6
|
export async function destroyCommand(query) {
|
|
25
|
-
|
|
26
|
-
if (
|
|
27
|
-
|
|
28
|
-
if (!server) {
|
|
29
|
-
logger.error(`Server not found: ${query}`);
|
|
30
|
-
return;
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
else {
|
|
34
|
-
server = await selectServer();
|
|
35
|
-
if (!server)
|
|
36
|
-
return;
|
|
37
|
-
}
|
|
7
|
+
const server = await resolveServer(query, "Select a server to destroy:");
|
|
8
|
+
if (!server)
|
|
9
|
+
return;
|
|
38
10
|
// First confirmation
|
|
39
11
|
const { confirm } = await inquirer.prompt([
|
|
40
12
|
{
|
|
@@ -61,18 +33,11 @@ export async function destroyCommand(query) {
|
|
|
61
33
|
return;
|
|
62
34
|
}
|
|
63
35
|
// Ask for API token
|
|
64
|
-
const
|
|
65
|
-
{
|
|
66
|
-
type: "password",
|
|
67
|
-
name: "apiToken",
|
|
68
|
-
message: `Enter your ${server.provider} API token:`,
|
|
69
|
-
validate: (input) => (input.trim().length > 0 ? true : "API token is required"),
|
|
70
|
-
},
|
|
71
|
-
]);
|
|
36
|
+
const apiToken = await promptApiToken(server.provider);
|
|
72
37
|
const spinner = createSpinner("Destroying server...");
|
|
73
38
|
spinner.start();
|
|
74
39
|
try {
|
|
75
|
-
const provider = createProviderWithToken(server.provider, apiToken
|
|
40
|
+
const provider = createProviderWithToken(server.provider, apiToken);
|
|
76
41
|
await provider.destroyServer(server.id);
|
|
77
42
|
removeServer(server.id);
|
|
78
43
|
spinner.succeed(`Server "${server.name}" destroyed`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"destroy.js","sourceRoot":"","sources":["../../src/commands/destroy.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"destroy.js","sourceRoot":"","sources":["../../src/commands/destroy.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AACzE,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AACtE,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAE3D,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,KAAc;IACjD,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,KAAK,EAAE,6BAA6B,CAAC,CAAC;IACzE,IAAI,CAAC,MAAM;QAAE,OAAO;IAEpB,qBAAqB;IACrB,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC;QACxC;YACE,IAAI,EAAE,SAAS;YACf,IAAI,EAAE,SAAS;YACf,OAAO,EAAE,qCAAqC,MAAM,CAAC,IAAI,MAAM,MAAM,CAAC,EAAE,IAAI;YAC5E,OAAO,EAAE,KAAK;SACf;KACF,CAAC,CAAC;IAEH,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QAClC,OAAO;IACT,CAAC;IAED,wCAAwC;IACxC,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC;QAC5C;YACE,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,aAAa;YACnB,OAAO,EAAE,yBAAyB,MAAM,CAAC,IAAI,eAAe;SAC7D;KACF,CAAC,CAAC;IAEH,IAAI,WAAW,CAAC,IAAI,EAAE,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC;QACvC,MAAM,CAAC,KAAK,CAAC,gDAAgD,CAAC,CAAC;QAC/D,OAAO;IACT,CAAC;IAED,oBAAoB;IACpB,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAEvD,MAAM,OAAO,GAAG,aAAa,CAAC,sBAAsB,CAAC,CAAC;IACtD,OAAO,CAAC,KAAK,EAAE,CAAC;IAEhB,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,uBAAuB,CAAC,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QACpE,MAAM,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACxC,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACxB,OAAO,CAAC,OAAO,CAAC,WAAW,MAAM,CAAC,IAAI,aAAa,CAAC,CAAC;QACrD,MAAM,CAAC,OAAO,CAAC,oEAAoE,CAAC,CAAC;IACvF,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACxB,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE,MAAM,UAAU,GACd,OAAO,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;QAE7F,IAAI,UAAU,EAAE,CAAC;YACf,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACxB,OAAO,CAAC,IAAI,CAAC,uBAAuB,MAAM,CAAC,QAAQ,mCAAmC,CAAC,CAAC;YACxF,MAAM,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;QAC5C,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;YACzC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACxB,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"restart.d.ts","sourceRoot":"","sources":["../../src/commands/restart.ts"],"names":[],"mappings":"AAKA,wBAAsB,cAAc,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA0DlE"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import inquirer from "inquirer";
|
|
2
|
+
import { resolveServer, promptApiToken } from "../utils/serverSelect.js";
|
|
3
|
+
import { createProviderWithToken } from "../utils/providerFactory.js";
|
|
4
|
+
import { logger, createSpinner } from "../utils/logger.js";
|
|
5
|
+
export async function restartCommand(query) {
|
|
6
|
+
const server = await resolveServer(query, "Select a server to restart:");
|
|
7
|
+
if (!server)
|
|
8
|
+
return;
|
|
9
|
+
const { confirm } = await inquirer.prompt([
|
|
10
|
+
{
|
|
11
|
+
type: "confirm",
|
|
12
|
+
name: "confirm",
|
|
13
|
+
message: `Restart server "${server.name}" (${server.ip})? This will cause brief downtime.`,
|
|
14
|
+
default: false,
|
|
15
|
+
},
|
|
16
|
+
]);
|
|
17
|
+
if (!confirm) {
|
|
18
|
+
logger.info("Restart cancelled.");
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
const apiToken = await promptApiToken(server.provider);
|
|
22
|
+
const spinner = createSpinner("Rebooting server...");
|
|
23
|
+
spinner.start();
|
|
24
|
+
try {
|
|
25
|
+
const provider = createProviderWithToken(server.provider, apiToken);
|
|
26
|
+
await provider.rebootServer(server.id);
|
|
27
|
+
spinner.succeed("Reboot initiated");
|
|
28
|
+
const pollSpinner = createSpinner("Waiting for server to come back online...");
|
|
29
|
+
pollSpinner.start();
|
|
30
|
+
let attempts = 0;
|
|
31
|
+
const maxAttempts = 30;
|
|
32
|
+
while (attempts < maxAttempts) {
|
|
33
|
+
await new Promise((resolve) => setTimeout(resolve, 2000));
|
|
34
|
+
try {
|
|
35
|
+
const status = await provider.getServerStatus(server.id);
|
|
36
|
+
if (status === "running") {
|
|
37
|
+
pollSpinner.succeed("Server is running");
|
|
38
|
+
console.log();
|
|
39
|
+
logger.success(`Server "${server.name}" restarted successfully`);
|
|
40
|
+
logger.info(`Access Coolify: http://${server.ip}:8000`);
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
// Server might be temporarily unreachable during reboot
|
|
46
|
+
}
|
|
47
|
+
attempts++;
|
|
48
|
+
pollSpinner.text = `Waiting for server... (${attempts}/${maxAttempts})`;
|
|
49
|
+
}
|
|
50
|
+
pollSpinner.warn("Server did not come back in time");
|
|
51
|
+
logger.warning("The server may still be rebooting. Check status later with: quicklify status");
|
|
52
|
+
}
|
|
53
|
+
catch (error) {
|
|
54
|
+
spinner.fail("Failed to reboot server");
|
|
55
|
+
logger.error(error instanceof Error ? error.message : String(error));
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=restart.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"restart.js","sourceRoot":"","sources":["../../src/commands/restart.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AACzE,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AACtE,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAE3D,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,KAAc;IACjD,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,KAAK,EAAE,6BAA6B,CAAC,CAAC;IACzE,IAAI,CAAC,MAAM;QAAE,OAAO;IAEpB,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC;QACxC;YACE,IAAI,EAAE,SAAS;YACf,IAAI,EAAE,SAAS;YACf,OAAO,EAAE,mBAAmB,MAAM,CAAC,IAAI,MAAM,MAAM,CAAC,EAAE,oCAAoC;YAC1F,OAAO,EAAE,KAAK;SACf;KACF,CAAC,CAAC;IAEH,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QAClC,OAAO;IACT,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAEvD,MAAM,OAAO,GAAG,aAAa,CAAC,qBAAqB,CAAC,CAAC;IACrD,OAAO,CAAC,KAAK,EAAE,CAAC;IAEhB,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,uBAAuB,CAAC,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QACpE,MAAM,QAAQ,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACvC,OAAO,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;QAEpC,MAAM,WAAW,GAAG,aAAa,CAAC,2CAA2C,CAAC,CAAC;QAC/E,WAAW,CAAC,KAAK,EAAE,CAAC;QAEpB,IAAI,QAAQ,GAAG,CAAC,CAAC;QACjB,MAAM,WAAW,GAAG,EAAE,CAAC;QAEvB,OAAO,QAAQ,GAAG,WAAW,EAAE,CAAC;YAC9B,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;YAC1D,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;gBACzD,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;oBACzB,WAAW,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;oBACzC,OAAO,CAAC,GAAG,EAAE,CAAC;oBACd,MAAM,CAAC,OAAO,CAAC,WAAW,MAAM,CAAC,IAAI,0BAA0B,CAAC,CAAC;oBACjE,MAAM,CAAC,IAAI,CAAC,0BAA0B,MAAM,CAAC,EAAE,OAAO,CAAC,CAAC;oBACxD,OAAO;gBACT,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,wDAAwD;YAC1D,CAAC;YACD,QAAQ,EAAE,CAAC;YACX,WAAW,CAAC,IAAI,GAAG,0BAA0B,QAAQ,IAAI,WAAW,GAAG,CAAC;QAC1E,CAAC;QAED,WAAW,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;QACrD,MAAM,CAAC,OAAO,CAAC,8EAA8E,CAAC,CAAC;IACjG,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACxB,OAAO,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;QACxC,MAAM,CAAC,KAAK,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IACvE,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ssh.d.ts","sourceRoot":"","sources":["../../src/commands/ssh.ts"],"names":[],"mappings":"AAIA,wBAAsB,UAAU,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA0B9F"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { resolveServer } from "../utils/serverSelect.js";
|
|
2
|
+
import { checkSshAvailable, sshConnect, sshExec } from "../utils/ssh.js";
|
|
3
|
+
import { logger } from "../utils/logger.js";
|
|
4
|
+
export async function sshCommand(query, options) {
|
|
5
|
+
if (!checkSshAvailable()) {
|
|
6
|
+
logger.error("SSH client not found. Please install OpenSSH.");
|
|
7
|
+
logger.info("Windows: Settings > Apps > Optional Features > OpenSSH Client");
|
|
8
|
+
logger.info("Linux/macOS: SSH is usually pre-installed.");
|
|
9
|
+
return;
|
|
10
|
+
}
|
|
11
|
+
const server = await resolveServer(query, "Select a server to connect:");
|
|
12
|
+
if (!server)
|
|
13
|
+
return;
|
|
14
|
+
if (options?.command) {
|
|
15
|
+
logger.info(`Running command on ${server.name} (${server.ip})...`);
|
|
16
|
+
const result = await sshExec(server.ip, options.command);
|
|
17
|
+
if (result.stdout)
|
|
18
|
+
console.log(result.stdout);
|
|
19
|
+
if (result.stderr)
|
|
20
|
+
console.error(result.stderr);
|
|
21
|
+
if (result.code !== 0) {
|
|
22
|
+
logger.error(`Command exited with code ${result.code}`);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
logger.info(`Connecting to ${server.name} (${server.ip})...`);
|
|
27
|
+
const exitCode = await sshConnect(server.ip);
|
|
28
|
+
if (exitCode !== 0) {
|
|
29
|
+
logger.warning(`SSH session ended with code ${exitCode}`);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=ssh.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ssh.js","sourceRoot":"","sources":["../../src/commands/ssh.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AACzE,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,KAAc,EAAE,OAA8B;IAC7E,IAAI,CAAC,iBAAiB,EAAE,EAAE,CAAC;QACzB,MAAM,CAAC,KAAK,CAAC,+CAA+C,CAAC,CAAC;QAC9D,MAAM,CAAC,IAAI,CAAC,+DAA+D,CAAC,CAAC;QAC7E,MAAM,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC;QAC1D,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,KAAK,EAAE,6BAA6B,CAAC,CAAC;IACzE,IAAI,CAAC,MAAM;QAAE,OAAO;IAEpB,IAAI,OAAO,EAAE,OAAO,EAAE,CAAC;QACrB,MAAM,CAAC,IAAI,CAAC,sBAAsB,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC;QACnE,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;QACzD,IAAI,MAAM,CAAC,MAAM;YAAE,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC9C,IAAI,MAAM,CAAC,MAAM;YAAE,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAChD,IAAI,MAAM,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;YACtB,MAAM,CAAC,KAAK,CAAC,4BAA4B,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,IAAI,CAAC,iBAAiB,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC;QAC9D,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC7C,IAAI,QAAQ,KAAK,CAAC,EAAE,CAAC;YACnB,MAAM,CAAC,OAAO,CAAC,+BAA+B,QAAQ,EAAE,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAKA,wBAAsB,aAAa,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAkDjE"}
|
package/dist/commands/status.js
CHANGED
|
@@ -1,54 +1,17 @@
|
|
|
1
1
|
import axios from "axios";
|
|
2
|
-
import
|
|
3
|
-
import { getServers, findServer } from "../utils/config.js";
|
|
2
|
+
import { resolveServer, promptApiToken } from "../utils/serverSelect.js";
|
|
4
3
|
import { createProviderWithToken } from "../utils/providerFactory.js";
|
|
5
4
|
import { logger, createSpinner } from "../utils/logger.js";
|
|
6
|
-
async function selectServer() {
|
|
7
|
-
const servers = getServers();
|
|
8
|
-
if (servers.length === 0) {
|
|
9
|
-
logger.info("No servers found. Deploy one with: quicklify init");
|
|
10
|
-
return undefined;
|
|
11
|
-
}
|
|
12
|
-
const { serverId } = await inquirer.prompt([
|
|
13
|
-
{
|
|
14
|
-
type: "list",
|
|
15
|
-
name: "serverId",
|
|
16
|
-
message: "Select a server:",
|
|
17
|
-
choices: servers.map((s) => ({
|
|
18
|
-
name: `${s.name} (${s.ip}) - ${s.provider}`,
|
|
19
|
-
value: s.id,
|
|
20
|
-
})),
|
|
21
|
-
},
|
|
22
|
-
]);
|
|
23
|
-
return servers.find((s) => s.id === serverId);
|
|
24
|
-
}
|
|
25
5
|
export async function statusCommand(query) {
|
|
26
|
-
|
|
27
|
-
if (
|
|
28
|
-
|
|
29
|
-
if (!server) {
|
|
30
|
-
logger.error(`Server not found: ${query}`);
|
|
31
|
-
return;
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
else {
|
|
35
|
-
server = await selectServer();
|
|
36
|
-
if (!server)
|
|
37
|
-
return;
|
|
38
|
-
}
|
|
6
|
+
const server = await resolveServer(query);
|
|
7
|
+
if (!server)
|
|
8
|
+
return;
|
|
39
9
|
// Ask for API token
|
|
40
|
-
const
|
|
41
|
-
{
|
|
42
|
-
type: "password",
|
|
43
|
-
name: "apiToken",
|
|
44
|
-
message: `Enter your ${server.provider} API token:`,
|
|
45
|
-
validate: (input) => (input.trim().length > 0 ? true : "API token is required"),
|
|
46
|
-
},
|
|
47
|
-
]);
|
|
10
|
+
const apiToken = await promptApiToken(server.provider);
|
|
48
11
|
const spinner = createSpinner("Checking server status...");
|
|
49
12
|
spinner.start();
|
|
50
13
|
try {
|
|
51
|
-
const provider = createProviderWithToken(server.provider, apiToken
|
|
14
|
+
const provider = createProviderWithToken(server.provider, apiToken);
|
|
52
15
|
// Check server status via provider API
|
|
53
16
|
const serverStatus = await provider.getServerStatus(server.id);
|
|
54
17
|
// Check Coolify health
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AACzE,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AACtE,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAE3D,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,KAAc;IAChD,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,KAAK,CAAC,CAAC;IAC1C,IAAI,CAAC,MAAM;QAAE,OAAO;IAEpB,oBAAoB;IACpB,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAEvD,MAAM,OAAO,GAAG,aAAa,CAAC,2BAA2B,CAAC,CAAC;IAC3D,OAAO,CAAC,KAAK,EAAE,CAAC;IAEhB,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,uBAAuB,CAAC,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAEpE,uCAAuC;QACvC,MAAM,YAAY,GAAG,MAAM,QAAQ,CAAC,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAE/D,uBAAuB;QACvB,IAAI,aAAa,GAAG,SAAS,CAAC;QAC9B,IAAI,CAAC;YACH,MAAM,KAAK,CAAC,GAAG,CAAC,UAAU,MAAM,CAAC,EAAE,OAAO,EAAE;gBAC1C,OAAO,EAAE,IAAI;gBACb,cAAc,EAAE,GAAG,EAAE,CAAC,IAAI;aAC3B,CAAC,CAAC;YACH,aAAa,GAAG,SAAS,CAAC;QAC5B,CAAC;QAAC,MAAM,CAAC;YACP,aAAa,GAAG,eAAe,CAAC;QAClC,CAAC;QAED,OAAO,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;QAEpC,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,MAAM,CAAC,IAAI,CAAC,mBAAmB,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QAC9C,MAAM,CAAC,IAAI,CAAC,mBAAmB,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;QAClD,MAAM,CAAC,IAAI,CAAC,mBAAmB,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;QAC5C,MAAM,CAAC,IAAI,CAAC,mBAAmB,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QAChD,MAAM,CAAC,IAAI,CAAC,mBAAmB,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QAC9C,MAAM,CAAC,IAAI,CAAC,mBAAmB,YAAY,EAAE,CAAC,CAAC;QAC/C,MAAM,CAAC,IAAI,CAAC,mBAAmB,aAAa,EAAE,CAAC,CAAC;QAChD,OAAO,CAAC,GAAG,EAAE,CAAC;QAEd,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;YAChC,MAAM,CAAC,OAAO,CAAC,0BAA0B,MAAM,CAAC,EAAE,OAAO,CAAC,CAAC;YAC3D,MAAM,CAAC,OAAO,CAAC,4DAA4D,CAAC,CAAC;QAC/E,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,OAAO,CAAC,uDAAuD,CAAC,CAAC;QAC1E,CAAC;IACH,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACxB,OAAO,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;QACvC,MAAM,CAAC,KAAK,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IACvE,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"AAQA,wBAAsB,aAAa,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA2DjE"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import inquirer from "inquirer";
|
|
2
|
+
import { resolveServer, promptApiToken } from "../utils/serverSelect.js";
|
|
3
|
+
import { checkSshAvailable, sshExec } from "../utils/ssh.js";
|
|
4
|
+
import { createProviderWithToken } from "../utils/providerFactory.js";
|
|
5
|
+
import { logger, createSpinner } from "../utils/logger.js";
|
|
6
|
+
const COOLIFY_UPDATE_CMD = "curl -fsSL https://cdn.coollabs.io/coolify/install.sh | bash";
|
|
7
|
+
export async function updateCommand(query) {
|
|
8
|
+
if (!checkSshAvailable()) {
|
|
9
|
+
logger.error("SSH client not found. Required for Coolify update.");
|
|
10
|
+
logger.info("Windows: Settings > Apps > Optional Features > OpenSSH Client");
|
|
11
|
+
logger.info("Linux/macOS: SSH is usually pre-installed.");
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
const server = await resolveServer(query, "Select a server to update:");
|
|
15
|
+
if (!server)
|
|
16
|
+
return;
|
|
17
|
+
const { confirm } = await inquirer.prompt([
|
|
18
|
+
{
|
|
19
|
+
type: "confirm",
|
|
20
|
+
name: "confirm",
|
|
21
|
+
message: `Update Coolify on "${server.name}" (${server.ip})? This may cause brief downtime.`,
|
|
22
|
+
default: false,
|
|
23
|
+
},
|
|
24
|
+
]);
|
|
25
|
+
if (!confirm) {
|
|
26
|
+
logger.info("Update cancelled.");
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
const apiToken = await promptApiToken(server.provider);
|
|
30
|
+
const spinner = createSpinner("Validating access...");
|
|
31
|
+
spinner.start();
|
|
32
|
+
try {
|
|
33
|
+
const provider = createProviderWithToken(server.provider, apiToken);
|
|
34
|
+
const status = await provider.getServerStatus(server.id);
|
|
35
|
+
if (status !== "running") {
|
|
36
|
+
spinner.fail(`Server is not running (status: ${status})`);
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
spinner.succeed("Server verified");
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
spinner.fail("Failed to verify server");
|
|
43
|
+
logger.error(error instanceof Error ? error.message : String(error));
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
logger.info("Running Coolify update script...");
|
|
47
|
+
logger.info("This may take several minutes. Please wait.");
|
|
48
|
+
console.log();
|
|
49
|
+
const result = await sshExec(server.ip, COOLIFY_UPDATE_CMD);
|
|
50
|
+
if (result.stdout)
|
|
51
|
+
console.log(result.stdout);
|
|
52
|
+
if (result.stderr)
|
|
53
|
+
console.error(result.stderr);
|
|
54
|
+
if (result.code === 0) {
|
|
55
|
+
logger.success("Coolify update completed successfully!");
|
|
56
|
+
logger.info(`Access Coolify: http://${server.ip}:8000`);
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
logger.error(`Update failed with exit code ${result.code}`);
|
|
60
|
+
logger.info("Check the output above for details.");
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=update.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -7,6 +7,10 @@ import { initCommand } from "./commands/init.js";
|
|
|
7
7
|
import { listCommand } from "./commands/list.js";
|
|
8
8
|
import { statusCommand } from "./commands/status.js";
|
|
9
9
|
import { destroyCommand } from "./commands/destroy.js";
|
|
10
|
+
import { configCommand } from "./commands/config.js";
|
|
11
|
+
import { sshCommand } from "./commands/ssh.js";
|
|
12
|
+
import { updateCommand } from "./commands/update.js";
|
|
13
|
+
import { restartCommand } from "./commands/restart.js";
|
|
10
14
|
const __filename = fileURLToPath(import.meta.url);
|
|
11
15
|
const __dirname = dirname(__filename);
|
|
12
16
|
const pkg = JSON.parse(readFileSync(join(__dirname, "../package.json"), "utf-8"));
|
|
@@ -33,5 +37,22 @@ program
|
|
|
33
37
|
.command("destroy [query]")
|
|
34
38
|
.description("Destroy a registered server")
|
|
35
39
|
.action(destroyCommand);
|
|
40
|
+
program
|
|
41
|
+
.command("config [subcommand] [args...]")
|
|
42
|
+
.description("Manage default configuration")
|
|
43
|
+
.action((subcommand, args) => configCommand(subcommand, args));
|
|
44
|
+
program
|
|
45
|
+
.command("ssh [query]")
|
|
46
|
+
.description("SSH into a registered server")
|
|
47
|
+
.option("-c, --command <command>", "Execute a single command via SSH")
|
|
48
|
+
.action((query, options) => sshCommand(query, options));
|
|
49
|
+
program
|
|
50
|
+
.command("update [query]")
|
|
51
|
+
.description("Update Coolify on a registered server")
|
|
52
|
+
.action(updateCommand);
|
|
53
|
+
program
|
|
54
|
+
.command("restart [query]")
|
|
55
|
+
.description("Restart a registered server")
|
|
56
|
+
.action(restartCommand);
|
|
36
57
|
program.parse();
|
|
37
58
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEvD,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AACtC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,iBAAiB,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;AAElF,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,WAAW,CAAC;KACjB,WAAW,CAAC,gDAAgD,CAAC;KAC7D,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AAExB,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,mDAAmD,CAAC;KAChE,MAAM,CAAC,uBAAuB,EAAE,wCAAwC,CAAC;KACzE,MAAM,CAAC,iBAAiB,EAAE,+DAA+D,CAAC;KAC1F,MAAM,CAAC,mBAAmB,EAAE,eAAe,CAAC;KAC5C,MAAM,CAAC,eAAe,EAAE,aAAa,CAAC;KACtC,MAAM,CAAC,eAAe,EAAE,aAAa,CAAC;KACtC,MAAM,CAAC,WAAW,CAAC,CAAC;AAEvB,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,6BAA6B,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;AAEvF,OAAO;KACJ,OAAO,CAAC,gBAAgB,CAAC;KACzB,WAAW,CAAC,iCAAiC,CAAC;KAC9C,MAAM,CAAC,aAAa,CAAC,CAAC;AAEzB,OAAO;KACJ,OAAO,CAAC,iBAAiB,CAAC;KAC1B,WAAW,CAAC,6BAA6B,CAAC;KAC1C,MAAM,CAAC,cAAc,CAAC,CAAC;AAE1B,OAAO,CAAC,KAAK,EAAE,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEvD,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AACtC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,iBAAiB,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;AAElF,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,WAAW,CAAC;KACjB,WAAW,CAAC,gDAAgD,CAAC;KAC7D,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AAExB,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,mDAAmD,CAAC;KAChE,MAAM,CAAC,uBAAuB,EAAE,wCAAwC,CAAC;KACzE,MAAM,CAAC,iBAAiB,EAAE,+DAA+D,CAAC;KAC1F,MAAM,CAAC,mBAAmB,EAAE,eAAe,CAAC;KAC5C,MAAM,CAAC,eAAe,EAAE,aAAa,CAAC;KACtC,MAAM,CAAC,eAAe,EAAE,aAAa,CAAC;KACtC,MAAM,CAAC,WAAW,CAAC,CAAC;AAEvB,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,6BAA6B,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;AAEvF,OAAO;KACJ,OAAO,CAAC,gBAAgB,CAAC;KACzB,WAAW,CAAC,iCAAiC,CAAC;KAC9C,MAAM,CAAC,aAAa,CAAC,CAAC;AAEzB,OAAO;KACJ,OAAO,CAAC,iBAAiB,CAAC;KAC1B,WAAW,CAAC,6BAA6B,CAAC;KAC1C,MAAM,CAAC,cAAc,CAAC,CAAC;AAE1B,OAAO;KACJ,OAAO,CAAC,+BAA+B,CAAC;KACxC,WAAW,CAAC,8BAA8B,CAAC;KAC3C,MAAM,CAAC,CAAC,UAAmB,EAAE,IAAe,EAAE,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,CAAC;AAErF,OAAO;KACJ,OAAO,CAAC,aAAa,CAAC;KACtB,WAAW,CAAC,8BAA8B,CAAC;KAC3C,MAAM,CAAC,yBAAyB,EAAE,kCAAkC,CAAC;KACrE,MAAM,CAAC,CAAC,KAAc,EAAE,OAA8B,EAAE,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;AAE1F,OAAO;KACJ,OAAO,CAAC,gBAAgB,CAAC;KACzB,WAAW,CAAC,uCAAuC,CAAC;KACpD,MAAM,CAAC,aAAa,CAAC,CAAC;AAEzB,OAAO;KACJ,OAAO,CAAC,iBAAiB,CAAC;KAC1B,WAAW,CAAC,6BAA6B,CAAC;KAC1C,MAAM,CAAC,cAAc,CAAC,CAAC;AAE1B,OAAO,CAAC,KAAK,EAAE,CAAC"}
|
package/dist/providers/base.d.ts
CHANGED
|
@@ -11,5 +11,6 @@ export interface CloudProvider {
|
|
|
11
11
|
getServerStatus(serverId: string): Promise<string>;
|
|
12
12
|
getServerDetails(serverId: string): Promise<ServerResult>;
|
|
13
13
|
destroyServer(serverId: string): Promise<void>;
|
|
14
|
+
rebootServer(serverId: string): Promise<void>;
|
|
14
15
|
}
|
|
15
16
|
//# sourceMappingURL=base.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/providers/base.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAExF,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC/C,UAAU,IAAI,MAAM,EAAE,CAAC;IACvB,cAAc,IAAI,UAAU,EAAE,CAAC;IAC/B,qBAAqB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC3C,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;IACjE,YAAY,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IAC1D,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACnD,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IAC1D,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/providers/base.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAExF,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC/C,UAAU,IAAI,MAAM,EAAE,CAAC;IACvB,cAAc,IAAI,UAAU,EAAE,CAAC;IAC/B,qBAAqB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC3C,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;IACjE,YAAY,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IAC1D,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACnD,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IAC1D,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/C,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/C"}
|
|
@@ -11,6 +11,7 @@ export declare class DigitalOceanProvider implements CloudProvider {
|
|
|
11
11
|
getServerDetails(serverId: string): Promise<ServerResult>;
|
|
12
12
|
getServerStatus(serverId: string): Promise<string>;
|
|
13
13
|
destroyServer(serverId: string): Promise<void>;
|
|
14
|
+
rebootServer(serverId: string): Promise<void>;
|
|
14
15
|
getRegions(): Region[];
|
|
15
16
|
getServerSizes(): ServerSize[];
|
|
16
17
|
getAvailableLocations(): Promise<Region[]>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"digitalocean.d.ts","sourceRoot":"","sources":["../../src/providers/digitalocean.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAuBxF,qBAAa,oBAAqB,YAAW,aAAa;IACxD,IAAI,SAAkB;IACtB,WAAW,SAAkB;IAC7B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,OAAO,CAAqC;gBAExC,QAAQ,EAAE,MAAM;IAItB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAW9C,YAAY,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"digitalocean.d.ts","sourceRoot":"","sources":["../../src/providers/digitalocean.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAuBxF,qBAAa,oBAAqB,YAAW,aAAa;IACxD,IAAI,SAAkB;IACtB,WAAW,SAAkB;IAC7B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,OAAO,CAAqC;gBAExC,QAAQ,EAAE,MAAM;IAItB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAW9C,YAAY,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;IA2CzD,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAezD,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAgBlD,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAmB9C,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA0BnD,UAAU,IAAI,MAAM,EAAE;IAWtB,cAAc,IAAI,UAAU,EAAE;IASxB,qBAAqB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAiB1C,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;CA6BvE"}
|
|
@@ -43,9 +43,9 @@ export class DigitalOceanProvider {
|
|
|
43
43
|
}
|
|
44
44
|
catch (error) {
|
|
45
45
|
if (axios.isAxiosError(error)) {
|
|
46
|
-
throw new Error(`Failed to create server: ${error.response?.data?.message || error.message}
|
|
46
|
+
throw new Error(`Failed to create server: ${error.response?.data?.message || error.message}`, { cause: error });
|
|
47
47
|
}
|
|
48
|
-
throw new Error(`Failed to create server: ${error instanceof Error ? error.message : String(error)}
|
|
48
|
+
throw new Error(`Failed to create server: ${error instanceof Error ? error.message : String(error)}`, { cause: error });
|
|
49
49
|
}
|
|
50
50
|
}
|
|
51
51
|
async getServerDetails(serverId) {
|
|
@@ -71,7 +71,7 @@ export class DigitalOceanProvider {
|
|
|
71
71
|
return doStatus === "active" ? "running" : doStatus;
|
|
72
72
|
}
|
|
73
73
|
catch (error) {
|
|
74
|
-
throw new Error(`Failed to get server status: ${error instanceof Error ? error.message : String(error)}
|
|
74
|
+
throw new Error(`Failed to get server status: ${error instanceof Error ? error.message : String(error)}`, { cause: error });
|
|
75
75
|
}
|
|
76
76
|
}
|
|
77
77
|
async destroyServer(serverId) {
|
|
@@ -82,9 +82,25 @@ export class DigitalOceanProvider {
|
|
|
82
82
|
}
|
|
83
83
|
catch (error) {
|
|
84
84
|
if (axios.isAxiosError(error)) {
|
|
85
|
-
throw new Error(`Failed to destroy server: ${error.response?.data?.message || error.message}
|
|
85
|
+
throw new Error(`Failed to destroy server: ${error.response?.data?.message || error.message}`, { cause: error });
|
|
86
86
|
}
|
|
87
|
-
throw new Error(`Failed to destroy server: ${error instanceof Error ? error.message : String(error)}
|
|
87
|
+
throw new Error(`Failed to destroy server: ${error instanceof Error ? error.message : String(error)}`, { cause: error });
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
async rebootServer(serverId) {
|
|
91
|
+
try {
|
|
92
|
+
await axios.post(`${this.baseUrl}/droplets/${serverId}/actions`, { type: "reboot" }, {
|
|
93
|
+
headers: {
|
|
94
|
+
Authorization: `Bearer ${this.apiToken}`,
|
|
95
|
+
"Content-Type": "application/json",
|
|
96
|
+
},
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
catch (error) {
|
|
100
|
+
if (axios.isAxiosError(error)) {
|
|
101
|
+
throw new Error(`Failed to reboot server: ${error.response?.data?.message || error.message}`, { cause: error });
|
|
102
|
+
}
|
|
103
|
+
throw new Error(`Failed to reboot server: ${error instanceof Error ? error.message : String(error)}`, { cause: error });
|
|
88
104
|
}
|
|
89
105
|
}
|
|
90
106
|
getRegions() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"digitalocean.js","sourceRoot":"","sources":["../../src/providers/digitalocean.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAyB1B,MAAM,OAAO,oBAAoB;IAC/B,IAAI,GAAG,cAAc,CAAC;IACtB,WAAW,GAAG,cAAc,CAAC;IACrB,QAAQ,CAAS;IACjB,OAAO,GAAG,iCAAiC,CAAC;IAEpD,YAAY,QAAgB;QAC1B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,KAAa;QAC/B,IAAI,CAAC;YACH,MAAM,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,UAAU,EAAE;gBACzC,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,KAAK,EAAE,EAAE;aAC9C,CAAC,CAAC;YACH,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,MAAoB;QACrC,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,IAAI,CAC/B,GAAG,IAAI,CAAC,OAAO,WAAW,EAC1B;gBACE,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,KAAK,EAAE,kBAAkB;gBACzB,SAAS,EAAE,MAAM,CAAC,SAAS;aAC5B,EACD;gBACE,OAAO,EAAE;oBACP,aAAa,EAAE,UAAU,IAAI,CAAC,QAAQ,EAAE;oBACxC,cAAc,EAAE,kBAAkB;iBACnC;aACF,CACF,CAAC;YAEF,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC;YACtC,MAAM,EAAE,GACN,OAAO,CAAC,QAAQ,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC,CAAmB,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,EAAE,UAAU;gBACpF,SAAS,CAAC;YAEZ,OAAO;gBACL,EAAE,EAAE,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE;gBACzB,EAAE;gBACF,MAAM,EAAE,OAAO,CAAC,MAAM;aACvB,CAAC;QACJ,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,IAAI,KAAK,CAAC,YAAY,CAAkB,KAAK,CAAC,EAAE,CAAC;gBAC/C,MAAM,IAAI,KAAK,CACb,4BAA4B,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,IAAI,KAAK,CAAC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"digitalocean.js","sourceRoot":"","sources":["../../src/providers/digitalocean.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,6 +11,7 @@ export declare class HetznerProvider implements CloudProvider {
|
|
|
11
11
|
getServerDetails(serverId: string): Promise<ServerResult>;
|
|
12
12
|
getServerStatus(serverId: string): Promise<string>;
|
|
13
13
|
destroyServer(serverId: string): Promise<void>;
|
|
14
|
+
rebootServer(serverId: string): Promise<void>;
|
|
14
15
|
getRegions(): Region[];
|
|
15
16
|
getServerSizes(): ServerSize[];
|
|
16
17
|
getAvailableLocations(): Promise<Region[]>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hetzner.d.ts","sourceRoot":"","sources":["../../src/providers/hetzner.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAsCxF,qBAAa,eAAgB,YAAW,aAAa;IACnD,IAAI,SAAa;IACjB,WAAW,SAAmB;IAC9B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,OAAO,CAAkC;gBAErC,QAAQ,EAAE,MAAM;IAItB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAW9C,YAAY,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"hetzner.d.ts","sourceRoot":"","sources":["../../src/providers/hetzner.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAsCxF,qBAAa,eAAgB,YAAW,aAAa;IACnD,IAAI,SAAa;IACjB,WAAW,SAAmB;IAC9B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,OAAO,CAAkC;gBAErC,QAAQ,EAAE,MAAM;IAItB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAW9C,YAAY,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;IAsCzD,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAWzD,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAclD,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAmB9C,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA0BnD,UAAU,IAAI,MAAM,EAAE;IAStB,cAAc,IAAI,UAAU,EAAE;IASxB,qBAAqB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAe1C,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;CA+CvE"}
|
|
@@ -40,9 +40,9 @@ export class HetznerProvider {
|
|
|
40
40
|
}
|
|
41
41
|
catch (error) {
|
|
42
42
|
if (axios.isAxiosError(error)) {
|
|
43
|
-
throw new Error(`Failed to create server: ${error.response?.data?.error?.message || error.message}
|
|
43
|
+
throw new Error(`Failed to create server: ${error.response?.data?.error?.message || error.message}`, { cause: error });
|
|
44
44
|
}
|
|
45
|
-
throw new Error(`Failed to create server: ${error instanceof Error ? error.message : String(error)}
|
|
45
|
+
throw new Error(`Failed to create server: ${error instanceof Error ? error.message : String(error)}`, { cause: error });
|
|
46
46
|
}
|
|
47
47
|
}
|
|
48
48
|
async getServerDetails(serverId) {
|
|
@@ -63,7 +63,7 @@ export class HetznerProvider {
|
|
|
63
63
|
return response.data.server.status;
|
|
64
64
|
}
|
|
65
65
|
catch (error) {
|
|
66
|
-
throw new Error(`Failed to get server status: ${error instanceof Error ? error.message : String(error)}
|
|
66
|
+
throw new Error(`Failed to get server status: ${error instanceof Error ? error.message : String(error)}`, { cause: error });
|
|
67
67
|
}
|
|
68
68
|
}
|
|
69
69
|
async destroyServer(serverId) {
|
|
@@ -74,9 +74,25 @@ export class HetznerProvider {
|
|
|
74
74
|
}
|
|
75
75
|
catch (error) {
|
|
76
76
|
if (axios.isAxiosError(error)) {
|
|
77
|
-
throw new Error(`Failed to destroy server: ${error.response?.data?.error?.message || error.message}
|
|
77
|
+
throw new Error(`Failed to destroy server: ${error.response?.data?.error?.message || error.message}`, { cause: error });
|
|
78
78
|
}
|
|
79
|
-
throw new Error(`Failed to destroy server: ${error instanceof Error ? error.message : String(error)}
|
|
79
|
+
throw new Error(`Failed to destroy server: ${error instanceof Error ? error.message : String(error)}`, { cause: error });
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
async rebootServer(serverId) {
|
|
83
|
+
try {
|
|
84
|
+
await axios.post(`${this.baseUrl}/servers/${serverId}/actions/reboot`, {}, {
|
|
85
|
+
headers: {
|
|
86
|
+
Authorization: `Bearer ${this.apiToken}`,
|
|
87
|
+
"Content-Type": "application/json",
|
|
88
|
+
},
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
catch (error) {
|
|
92
|
+
if (axios.isAxiosError(error)) {
|
|
93
|
+
throw new Error(`Failed to reboot server: ${error.response?.data?.error?.message || error.message}`, { cause: error });
|
|
94
|
+
}
|
|
95
|
+
throw new Error(`Failed to reboot server: ${error instanceof Error ? error.message : String(error)}`, { cause: error });
|
|
80
96
|
}
|
|
81
97
|
}
|
|
82
98
|
getRegions() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hetzner.js","sourceRoot":"","sources":["../../src/providers/hetzner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAwC1B,MAAM,OAAO,eAAe;IAC1B,IAAI,GAAG,SAAS,CAAC;IACjB,WAAW,GAAG,eAAe,CAAC;IACtB,QAAQ,CAAS;IACjB,OAAO,GAAG,8BAA8B,CAAC;IAEjD,YAAY,QAAgB;QAC1B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,KAAa;QAC/B,IAAI,CAAC;YACH,MAAM,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,UAAU,EAAE;gBACzC,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,KAAK,EAAE,EAAE;aAC9C,CAAC,CAAC;YACH,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,MAAoB;QACrC,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,IAAI,CAC/B,GAAG,IAAI,CAAC,OAAO,UAAU,EACzB;gBACE,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,WAAW,EAAE,MAAM,CAAC,IAAI;gBACxB,QAAQ,EAAE,MAAM,CAAC,MAAM;gBACvB,KAAK,EAAE,cAAc;gBACrB,SAAS,EAAE,MAAM,CAAC,SAAS;aAC5B,EACD;gBACE,OAAO,EAAE;oBACP,aAAa,EAAE,UAAU,IAAI,CAAC,QAAQ,EAAE;oBACxC,cAAc,EAAE,kBAAkB;iBACnC;aACF,CACF,CAAC;YAEF,OAAO;gBACL,EAAE,EAAE,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE;gBACtC,EAAE,EAAE,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE;gBAC3C,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM;aACpC,CAAC;QACJ,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,IAAI,KAAK,CAAC,YAAY,CAAuB,KAAK,CAAC,EAAE,CAAC;gBACpD,MAAM,IAAI,KAAK,CACb,4BAA4B,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,IAAI,KAAK,CAAC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"hetzner.js","sourceRoot":"","sources":["../../src/providers/hetzner.ts"],"names":[],"mappings":"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"}
|
package/dist/types/index.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,MAAM;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,MAAM;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { QuicklifyConfig } from "../types/index.js";
|
|
2
|
+
declare const CONFIG_DIR: string;
|
|
3
|
+
declare const DEFAULTS_FILE: string;
|
|
4
|
+
declare const VALID_KEYS: string[];
|
|
5
|
+
export declare function getDefaults(): QuicklifyConfig;
|
|
6
|
+
export declare function setDefault(key: string, value: string): void;
|
|
7
|
+
export declare function getDefault(key: string): string | undefined;
|
|
8
|
+
export declare function resetDefaults(): void;
|
|
9
|
+
export { CONFIG_DIR, DEFAULTS_FILE, VALID_KEYS };
|
|
10
|
+
//# sourceMappingURL=defaults.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../../src/utils/defaults.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEzD,QAAA,MAAM,UAAU,QAAgC,CAAC;AACjD,QAAA,MAAM,aAAa,QAAkC,CAAC;AAEtD,QAAA,MAAM,UAAU,UAAyC,CAAC;AAQ1D,wBAAgB,WAAW,IAAI,eAAe,CAU7C;AAED,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAW3D;AAED,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAG1D;AAED,wBAAgB,aAAa,IAAI,IAAI,CAGpC;AAED,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,UAAU,EAAE,CAAC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { readFileSync, writeFileSync, mkdirSync, existsSync } from "fs";
|
|
2
|
+
import { homedir } from "os";
|
|
3
|
+
import { join } from "path";
|
|
4
|
+
const CONFIG_DIR = join(homedir(), ".quicklify");
|
|
5
|
+
const DEFAULTS_FILE = join(CONFIG_DIR, "config.json");
|
|
6
|
+
const VALID_KEYS = ["provider", "region", "size", "name"];
|
|
7
|
+
function ensureConfigDir() {
|
|
8
|
+
if (!existsSync(CONFIG_DIR)) {
|
|
9
|
+
mkdirSync(CONFIG_DIR, { recursive: true, mode: 0o700 });
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
export function getDefaults() {
|
|
13
|
+
try {
|
|
14
|
+
if (!existsSync(DEFAULTS_FILE))
|
|
15
|
+
return {};
|
|
16
|
+
const data = readFileSync(DEFAULTS_FILE, "utf-8");
|
|
17
|
+
const parsed = JSON.parse(data);
|
|
18
|
+
if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed))
|
|
19
|
+
return {};
|
|
20
|
+
return parsed;
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
return {};
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
export function setDefault(key, value) {
|
|
27
|
+
if (!VALID_KEYS.includes(key)) {
|
|
28
|
+
throw new Error(`Invalid config key: ${key}. Valid keys: ${VALID_KEYS.join(", ")}`);
|
|
29
|
+
}
|
|
30
|
+
if (key === "provider" && !["hetzner", "digitalocean"].includes(value)) {
|
|
31
|
+
throw new Error(`Invalid provider: ${value}. Use "hetzner" or "digitalocean".`);
|
|
32
|
+
}
|
|
33
|
+
ensureConfigDir();
|
|
34
|
+
const config = getDefaults();
|
|
35
|
+
config[key] = value;
|
|
36
|
+
writeFileSync(DEFAULTS_FILE, JSON.stringify(config, null, 2), { mode: 0o600 });
|
|
37
|
+
}
|
|
38
|
+
export function getDefault(key) {
|
|
39
|
+
const config = getDefaults();
|
|
40
|
+
return config[key];
|
|
41
|
+
}
|
|
42
|
+
export function resetDefaults() {
|
|
43
|
+
ensureConfigDir();
|
|
44
|
+
writeFileSync(DEFAULTS_FILE, JSON.stringify({}, null, 2), { mode: 0o600 });
|
|
45
|
+
}
|
|
46
|
+
export { CONFIG_DIR, DEFAULTS_FILE, VALID_KEYS };
|
|
47
|
+
//# sourceMappingURL=defaults.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"defaults.js","sourceRoot":"","sources":["../../src/utils/defaults.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AACxE,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAG5B,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,YAAY,CAAC,CAAC;AACjD,MAAM,aAAa,GAAG,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;AAEtD,MAAM,UAAU,GAAG,CAAC,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AAE1D,SAAS,eAAe;IACtB,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC1D,CAAC;AACH,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,IAAI,CAAC;QACH,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC;YAAE,OAAO,EAAE,CAAC;QAC1C,MAAM,IAAI,GAAG,YAAY,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;QAClD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAChC,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;YAAE,OAAO,EAAE,CAAC;QACtF,OAAO,MAAyB,CAAC;IACnC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,GAAW,EAAE,KAAa;IACnD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,uBAAuB,GAAG,iBAAiB,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACtF,CAAC;IACD,IAAI,GAAG,KAAK,UAAU,IAAI,CAAC,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACvE,MAAM,IAAI,KAAK,CAAC,qBAAqB,KAAK,oCAAoC,CAAC,CAAC;IAClF,CAAC;IACD,eAAe,EAAE,CAAC;IAClB,MAAM,MAAM,GAAG,WAAW,EAAE,CAAC;IAC5B,MAAiC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IAChD,aAAa,CAAC,aAAa,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;AACjF,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,GAAW;IACpC,MAAM,MAAM,GAAG,WAAW,EAAE,CAAC;IAC7B,OAAQ,MAA6C,CAAC,GAAG,CAAC,CAAC;AAC7D,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,eAAe,EAAE,CAAC;IAClB,aAAa,CAAC,aAAa,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;AAC7E,CAAC;AAED,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,UAAU,EAAE,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { ServerRecord } from "../types/index.js";
|
|
2
|
+
export declare function selectServer(promptMessage?: string): Promise<ServerRecord | undefined>;
|
|
3
|
+
export declare function resolveServer(query?: string, promptMessage?: string): Promise<ServerRecord | undefined>;
|
|
4
|
+
export declare function promptApiToken(providerName: string): Promise<string>;
|
|
5
|
+
//# sourceMappingURL=serverSelect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serverSelect.d.ts","sourceRoot":"","sources":["../../src/utils/serverSelect.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEtD,wBAAsB,YAAY,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC,CAqB5F;AAED,wBAAsB,aAAa,CACjC,KAAK,CAAC,EAAE,MAAM,EACd,aAAa,CAAC,EAAE,MAAM,GACrB,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC,CAUnC;AAED,wBAAsB,cAAc,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAe1E"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import inquirer from "inquirer";
|
|
2
|
+
import { getServers, findServer } from "./config.js";
|
|
3
|
+
import { logger } from "./logger.js";
|
|
4
|
+
export async function selectServer(promptMessage) {
|
|
5
|
+
const servers = getServers();
|
|
6
|
+
if (servers.length === 0) {
|
|
7
|
+
logger.info("No servers found. Deploy one with: quicklify init");
|
|
8
|
+
return undefined;
|
|
9
|
+
}
|
|
10
|
+
const { serverId } = await inquirer.prompt([
|
|
11
|
+
{
|
|
12
|
+
type: "list",
|
|
13
|
+
name: "serverId",
|
|
14
|
+
message: promptMessage || "Select a server:",
|
|
15
|
+
choices: servers.map((s) => ({
|
|
16
|
+
name: `${s.name} (${s.ip}) - ${s.provider}`,
|
|
17
|
+
value: s.id,
|
|
18
|
+
})),
|
|
19
|
+
},
|
|
20
|
+
]);
|
|
21
|
+
return servers.find((s) => s.id === serverId);
|
|
22
|
+
}
|
|
23
|
+
export async function resolveServer(query, promptMessage) {
|
|
24
|
+
if (query) {
|
|
25
|
+
const server = findServer(query);
|
|
26
|
+
if (!server) {
|
|
27
|
+
logger.error(`Server not found: ${query}`);
|
|
28
|
+
return undefined;
|
|
29
|
+
}
|
|
30
|
+
return server;
|
|
31
|
+
}
|
|
32
|
+
return selectServer(promptMessage);
|
|
33
|
+
}
|
|
34
|
+
export async function promptApiToken(providerName) {
|
|
35
|
+
const envKey = providerName === "hetzner" ? "HETZNER_TOKEN" : "DIGITALOCEAN_TOKEN";
|
|
36
|
+
if (process.env[envKey]) {
|
|
37
|
+
return process.env[envKey];
|
|
38
|
+
}
|
|
39
|
+
const { apiToken } = await inquirer.prompt([
|
|
40
|
+
{
|
|
41
|
+
type: "password",
|
|
42
|
+
name: "apiToken",
|
|
43
|
+
message: `Enter your ${providerName} API token:`,
|
|
44
|
+
validate: (input) => (input.trim().length > 0 ? true : "API token is required"),
|
|
45
|
+
},
|
|
46
|
+
]);
|
|
47
|
+
return apiToken.trim();
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=serverSelect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serverSelect.js","sourceRoot":"","sources":["../../src/utils/serverSelect.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAGrC,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,aAAsB;IACvD,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAE7B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAAC;QACjE,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC;QACzC;YACE,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,UAAU;YAChB,OAAO,EAAE,aAAa,IAAI,kBAAkB;YAC5C,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC3B,IAAI,EAAE,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,QAAQ,EAAE;gBAC3C,KAAK,EAAE,CAAC,CAAC,EAAE;aACZ,CAAC,CAAC;SACJ;KACF,CAAC,CAAC;IAEH,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC;AAChD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,KAAc,EACd,aAAsB;IAEtB,IAAI,KAAK,EAAE,CAAC;QACV,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;QACjC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,CAAC,KAAK,CAAC,qBAAqB,KAAK,EAAE,CAAC,CAAC;YAC3C,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,OAAO,YAAY,CAAC,aAAa,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,YAAoB;IACvD,MAAM,MAAM,GAAG,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,oBAAoB,CAAC;IACnF,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;QACxB,OAAO,OAAO,CAAC,GAAG,CAAC,MAAM,CAAE,CAAC;IAC9B,CAAC;IAED,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC;QACzC;YACE,IAAI,EAAE,UAAU;YAChB,IAAI,EAAE,UAAU;YAChB,OAAO,EAAE,cAAc,YAAY,aAAa;YAChD,QAAQ,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,uBAAuB,CAAC;SACxF;KACF,CAAC,CAAC;IACH,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC;AACzB,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export declare function checkSshAvailable(): boolean;
|
|
2
|
+
export declare function sshConnect(ip: string): Promise<number>;
|
|
3
|
+
export declare function sshExec(ip: string, command: string): Promise<{
|
|
4
|
+
code: number;
|
|
5
|
+
stdout: string;
|
|
6
|
+
stderr: string;
|
|
7
|
+
}>;
|
|
8
|
+
//# sourceMappingURL=ssh.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ssh.d.ts","sourceRoot":"","sources":["../../src/utils/ssh.ts"],"names":[],"mappings":"AAEA,wBAAgB,iBAAiB,IAAI,OAAO,CAO3C;AAED,wBAAgB,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAQtD;AAED,wBAAgB,OAAO,CACrB,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,MAAM,GACd,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAgB3D"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { spawn, execSync } from "child_process";
|
|
2
|
+
export function checkSshAvailable() {
|
|
3
|
+
try {
|
|
4
|
+
execSync("ssh -V", { stdio: "pipe" });
|
|
5
|
+
return true;
|
|
6
|
+
}
|
|
7
|
+
catch {
|
|
8
|
+
return false;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
export function sshConnect(ip) {
|
|
12
|
+
return new Promise((resolve) => {
|
|
13
|
+
const child = spawn("ssh", [`root@${ip}`], {
|
|
14
|
+
stdio: "inherit",
|
|
15
|
+
});
|
|
16
|
+
child.on("close", (code) => resolve(code ?? 0));
|
|
17
|
+
child.on("error", () => resolve(1));
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
export function sshExec(ip, command) {
|
|
21
|
+
return new Promise((resolve) => {
|
|
22
|
+
const child = spawn("ssh", ["-o", "StrictHostKeyChecking=accept-new", `root@${ip}`, command], {
|
|
23
|
+
stdio: ["inherit", "pipe", "pipe"],
|
|
24
|
+
});
|
|
25
|
+
let stdout = "";
|
|
26
|
+
let stderr = "";
|
|
27
|
+
child.stdout?.on("data", (data) => {
|
|
28
|
+
stdout += data.toString();
|
|
29
|
+
});
|
|
30
|
+
child.stderr?.on("data", (data) => {
|
|
31
|
+
stderr += data.toString();
|
|
32
|
+
});
|
|
33
|
+
child.on("close", (code) => resolve({ code: code ?? 1, stdout, stderr }));
|
|
34
|
+
child.on("error", (err) => resolve({ code: 1, stdout: "", stderr: err.message }));
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=ssh.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ssh.js","sourceRoot":"","sources":["../../src/utils/ssh.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEhD,MAAM,UAAU,iBAAiB;IAC/B,IAAI,CAAC;QACH,QAAQ,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QACtC,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,EAAU;IACnC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,EAAE;YACzC,KAAK,EAAE,SAAS;SACjB,CAAC,CAAC;QACH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;QAChD,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,OAAO,CACrB,EAAU,EACV,OAAe;IAEf,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,kCAAkC,EAAE,QAAQ,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE;YAC5F,KAAK,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC;SACnC,CAAC,CAAC;QACH,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE;YACxC,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC5B,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE;YACxC,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC5B,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;QAC1E,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IACpF,CAAC,CAAC,CAAC;AACL,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "quicklify",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.0",
|
|
4
4
|
"description": "Automate Coolify deployment on cloud providers",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -41,6 +41,9 @@
|
|
|
41
41
|
"devops",
|
|
42
42
|
"server"
|
|
43
43
|
],
|
|
44
|
+
"engines": {
|
|
45
|
+
"node": ">=20.0.0"
|
|
46
|
+
},
|
|
44
47
|
"license": "MIT",
|
|
45
48
|
"repository": {
|
|
46
49
|
"type": "git",
|
|
@@ -56,24 +59,24 @@
|
|
|
56
59
|
"url": "https://omrfc.dev"
|
|
57
60
|
},
|
|
58
61
|
"dependencies": {
|
|
59
|
-
"axios": "^1.
|
|
60
|
-
"chalk": "^5.
|
|
61
|
-
"commander": "^
|
|
62
|
+
"axios": "^1.13.5",
|
|
63
|
+
"chalk": "^5.6.2",
|
|
64
|
+
"commander": "^14.0.3",
|
|
62
65
|
"inquirer": "^12.3.2",
|
|
63
|
-
"ora": "^
|
|
66
|
+
"ora": "^9.3.0"
|
|
64
67
|
},
|
|
65
68
|
"devDependencies": {
|
|
66
|
-
"@eslint/js": "^
|
|
69
|
+
"@eslint/js": "^10.0.1",
|
|
67
70
|
"@types/inquirer": "^9.0.7",
|
|
68
71
|
"@types/jest": "^30.0.0",
|
|
69
72
|
"@types/node": "^22.12.0",
|
|
70
|
-
"eslint": "^
|
|
73
|
+
"eslint": "^10.0.0",
|
|
71
74
|
"eslint-config-prettier": "^10.1.8",
|
|
72
75
|
"jest": "^30.2.0",
|
|
73
76
|
"prettier": "^3.8.1",
|
|
74
77
|
"ts-jest": "^29.4.6",
|
|
75
|
-
"tsx": "^4.
|
|
76
|
-
"typescript": "^5.
|
|
77
|
-
"typescript-eslint": "^8.
|
|
78
|
+
"tsx": "^4.21.0",
|
|
79
|
+
"typescript": "^5.9.3",
|
|
80
|
+
"typescript-eslint": "^8.56.0"
|
|
78
81
|
}
|
|
79
82
|
}
|