quicklify 0.3.3 → 0.4.1

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 (51) hide show
  1. package/README.md +83 -46
  2. package/SECURITY.md +17 -3
  3. package/dist/commands/destroy.d.ts +2 -0
  4. package/dist/commands/destroy.d.ts.map +1 -0
  5. package/dist/commands/destroy.js +95 -0
  6. package/dist/commands/destroy.js.map +1 -0
  7. package/dist/commands/init.d.ts +2 -1
  8. package/dist/commands/init.d.ts.map +1 -1
  9. package/dist/commands/init.js +164 -96
  10. package/dist/commands/init.js.map +1 -1
  11. package/dist/commands/list.d.ts +2 -0
  12. package/dist/commands/list.d.ts.map +1 -0
  13. package/dist/commands/list.js +22 -0
  14. package/dist/commands/list.js.map +1 -0
  15. package/dist/commands/status.d.ts +2 -0
  16. package/dist/commands/status.d.ts.map +1 -0
  17. package/dist/commands/status.js +89 -0
  18. package/dist/commands/status.js.map +1 -0
  19. package/dist/index.js +17 -0
  20. package/dist/index.js.map +1 -1
  21. package/dist/providers/base.d.ts +1 -0
  22. package/dist/providers/base.d.ts.map +1 -1
  23. package/dist/providers/digitalocean.d.ts +1 -0
  24. package/dist/providers/digitalocean.d.ts.map +1 -1
  25. package/dist/providers/digitalocean.js +13 -0
  26. package/dist/providers/digitalocean.js.map +1 -1
  27. package/dist/providers/hetzner.d.ts +1 -0
  28. package/dist/providers/hetzner.d.ts.map +1 -1
  29. package/dist/providers/hetzner.js +13 -0
  30. package/dist/providers/hetzner.js.map +1 -1
  31. package/dist/types/index.d.ts +16 -0
  32. package/dist/types/index.d.ts.map +1 -1
  33. package/dist/utils/cloudInit.d.ts.map +1 -1
  34. package/dist/utils/cloudInit.js +2 -0
  35. package/dist/utils/cloudInit.js.map +1 -1
  36. package/dist/utils/config.d.ts +9 -0
  37. package/dist/utils/config.d.ts.map +1 -0
  38. package/dist/utils/config.js +50 -0
  39. package/dist/utils/config.js.map +1 -0
  40. package/dist/utils/healthCheck.d.ts +2 -0
  41. package/dist/utils/healthCheck.d.ts.map +1 -0
  42. package/dist/utils/healthCheck.js +29 -0
  43. package/dist/utils/healthCheck.js.map +1 -0
  44. package/dist/utils/prompts.d.ts.map +1 -1
  45. package/dist/utils/prompts.js +5 -2
  46. package/dist/utils/prompts.js.map +1 -1
  47. package/dist/utils/providerFactory.d.ts +4 -0
  48. package/dist/utils/providerFactory.d.ts.map +1 -0
  49. package/dist/utils/providerFactory.js +24 -0
  50. package/dist/utils/providerFactory.js.map +1 -0
  51. package/package.json +1 -1
package/README.md CHANGED
@@ -45,6 +45,9 @@ 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, and destroy commands
49
+ - 🏥 **Health Check Polling** - Detects when Coolify is ready (no more blind waiting)
50
+ - 🤖 **Non-Interactive Mode** - CI/CD friendly with `--provider --token --region --size --name` flags
48
51
 
49
52
  ## 📦 Installation
50
53
 
@@ -156,53 +159,26 @@ For production use, we recommend setting up a domain instead of using the IP add
156
159
 
157
160
  ## 📋 Recent Updates
158
161
 
162
+ ### v0.4.0 (2026-02-20)
163
+ - **New commands:** `quicklify list`, `quicklify status [query]`, `quicklify destroy [query]`
164
+ - **Non-interactive mode:** `quicklify init --provider --token --region --size --name` for CI/CD
165
+ - **Health check polling:** Detects when Coolify is ready instead of blind waiting
166
+ - **Server persistence:** Deploys saved to `~/.quicklify/servers.json` for list/status/destroy
167
+ - **`destroyServer()`** added to provider interface (Hetzner + DigitalOcean)
168
+ - 233 tests with 97%+ statement coverage
169
+
159
170
  ### v0.3.1 (2026-02-19)
160
171
  - Hetzner pricing now shows net prices (excl. VAT), matching website display
161
172
  - Hetzner server types use `/datacenters` API for real availability per location
162
173
  - Replaced deprecated Hetzner server types (cpx→cx23/cx33)
163
174
  - "Server name already used" error now prompts for a new name
164
175
  - Location disabled retry now re-prompts for server type
165
- - Back navigation works correctly in error retry flows
166
176
 
167
177
  ### v0.3.0 (2026-02-19)
168
178
  - DigitalOcean provider support (full API integration)
169
179
  - Interactive provider selection (Hetzner / DigitalOcean)
170
180
  - Step-based back navigation in all prompts
171
181
  - Network wait loop + install logging for DigitalOcean cloud-init reliability
172
- - 143 tests with 97%+ statement coverage
173
-
174
- ### v0.2.8 (2026-02-16)
175
- - Replaced all `any` types with proper TypeScript interfaces
176
- - Added ESLint 9 + Prettier for code quality enforcement
177
- - Added CHANGELOG.md and CONTRIBUTING.md
178
-
179
- ### v0.2.7 (2026-02-16)
180
- - Fixed inaccurate README/SECURITY claims
181
- - Added npm keywords for better discoverability
182
-
183
- ### v0.2.6 (2026-02-16)
184
- - CI: Upgraded Codecov action to v5
185
-
186
- ### v0.2.5 (2026-02-16)
187
- - CI: Added Codecov integration for automatic coverage badge
188
-
189
- ### v0.2.4 (2026-02-15)
190
- - Refactor: Removed recommended label, excluded failed server types from retry list
191
-
192
- ### v0.2.3 (2026-02-15)
193
- - Fix: Unsupported error retry, dynamic deployment summary, dynamic recommended selection
194
-
195
- ### v0.2.2 (2026-02-15)
196
- - Feat: Filter deprecated server types and add retry on unavailable
197
-
198
- ### v0.2.1 (2026-02-14)
199
- - Fixed URL protocol (http for initial Coolify setup)
200
-
201
- ### v0.2.0 (2026-02-14)
202
- - Added dynamic server type filtering based on selected location
203
- - Auto firewall configuration (ports 8000, 22, 80, 443)
204
- - Improved price formatting
205
- - Removed debug logs
206
182
 
207
183
  ## 🗺️ Roadmap
208
184
 
@@ -236,14 +212,21 @@ For production use, we recommend setting up a domain instead of using the IP add
236
212
  - [x] Step-based back navigation
237
213
  - [x] Cloud-init reliability improvements (network wait, logging)
238
214
 
215
+ ### v0.4.0 (Completed)
216
+
217
+ - [x] Server management commands (list, status, destroy)
218
+ - [x] Non-interactive mode for CI/CD
219
+ - [x] Coolify health check polling (replaces blind wait)
220
+ - [x] Server record persistence (`~/.quicklify/servers.json`)
221
+ - [x] `destroyServer()` on provider interface
222
+ - [x] Double confirmation safety for destroy
223
+
239
224
  ### Future
240
225
  - [ ] Vultr support
241
226
  - [ ] Linode support
242
227
  - [ ] Domain configuration helper
243
228
  - [ ] SSL certificate automation
244
- - [ ] Health checks & monitoring
245
229
  - [ ] Backup configuration
246
- - [ ] Multi-server management
247
230
  - [ ] Web dashboard
248
231
  - [ ] GitHub Actions integration
249
232
 
@@ -264,9 +247,23 @@ For production use, we recommend setting up a domain instead of using the IP add
264
247
  ### Commands
265
248
 
266
249
  ```bash
267
- # Deploy new Coolify instance
250
+ # Deploy new Coolify instance (interactive)
268
251
  quicklify init
269
252
 
253
+ # Deploy non-interactively (CI/CD friendly)
254
+ quicklify init --provider hetzner --token YOUR_TOKEN --region nbg1 --size cax11 --name my-server
255
+
256
+ # List all registered servers
257
+ quicklify list
258
+
259
+ # Check server and Coolify status
260
+ quicklify status 123.45.67.89
261
+ quicklify status my-server
262
+
263
+ # Destroy a server (with double confirmation)
264
+ quicklify destroy 123.45.67.89
265
+ quicklify destroy my-server
266
+
270
267
  # Show version
271
268
  quicklify --version
272
269
 
@@ -274,6 +271,35 @@ quicklify --version
274
271
  quicklify --help
275
272
  ```
276
273
 
274
+ ### Non-Interactive Mode
275
+
276
+ Pass all options as flags to skip interactive prompts (useful for CI/CD pipelines):
277
+
278
+ ```bash
279
+ quicklify init \
280
+ --provider hetzner \
281
+ --token $HETZNER_TOKEN \
282
+ --region nbg1 \
283
+ --size cax11 \
284
+ --name production-coolify
285
+ ```
286
+
287
+ **Using environment variables (recommended for CI/CD):**
288
+
289
+ ```bash
290
+ # Set token as environment variable (avoids shell history exposure)
291
+ export HETZNER_TOKEN="your-api-token"
292
+ # or
293
+ export DIGITALOCEAN_TOKEN="your-api-token"
294
+
295
+ # Token is read automatically from env var
296
+ quicklify init --provider hetzner --region nbg1 --size cax11 --name my-server
297
+ ```
298
+
299
+ Token resolution order: `--token` flag > environment variable > interactive prompt.
300
+
301
+ If some flags are missing, only the missing values will be prompted interactively.
302
+
277
303
  ### Interactive Prompts
278
304
 
279
305
  1. **Provider Selection** - Choose Hetzner Cloud or DigitalOcean
@@ -310,17 +336,28 @@ npm run format
310
336
 
311
337
  ```
312
338
  tests/
313
- ├── __mocks__/ # Mock modules (axios, inquirer, ora, chalk)
314
- ├── unit/ # Unit tests
339
+ ├── __mocks__/ # Mock modules (axios, inquirer, ora, chalk)
340
+ ├── unit/ # Unit tests
315
341
  │ ├── cloudInit.test.ts
342
+ │ ├── config.test.ts # Config CRUD operations
343
+ │ ├── config-edge.test.ts # Config edge cases (corruption, empty files)
344
+ │ ├── destroy.test.ts # Destroy command unit tests
345
+ │ ├── healthCheck.test.ts # Health check polling tests
346
+ │ ├── healthCheck-edge.test.ts # Health check edge cases (302, 401, 500)
347
+ │ ├── list.test.ts # List command unit tests
316
348
  │ ├── logger.test.ts
317
349
  │ ├── prompts.test.ts
350
+ │ ├── providerFactory.test.ts # Provider factory tests
351
+ │ ├── status.test.ts # Status command unit tests
318
352
  │ └── validators.test.ts
319
- ├── integration/ # Integration tests (provider API calls)
320
- │ ├── hetzner.test.ts
321
- │ └── digitalocean.test.ts
322
- └── e2e/ # End-to-end tests (full init flow)
323
- └── init.test.ts
353
+ ├── integration/ # Integration tests (provider API calls)
354
+ │ ├── hetzner.test.ts # Including destroyServer tests
355
+ │ └── digitalocean.test.ts # Including destroyServer tests
356
+ └── e2e/ # End-to-end tests (full command flows)
357
+ ├── init.test.ts
358
+ ├── init-noninteractive.test.ts # Non-interactive mode E2E
359
+ ├── status.test.ts # Status command E2E
360
+ └── destroy.test.ts # Destroy command E2E
324
361
  ```
325
362
 
326
363
  ### CI/CD
@@ -332,7 +369,7 @@ Tests run automatically on every push/PR via GitHub Actions across:
332
369
 
333
370
  ### Coverage
334
371
 
335
- Current coverage: **97%+ statements/lines**, **90%+ branches**, **100% functions**. 143 tests across 7 test suites.
372
+ Current coverage: **97%+ statements/lines**, **89%+ branches**, **96%+ functions**. 233 tests across 18 test suites.
336
373
 
337
374
  ## 🔧 Troubleshooting
338
375
 
package/SECURITY.md CHANGED
@@ -4,7 +4,8 @@
4
4
 
5
5
  | Version | Supported |
6
6
  | ------- | ------------------ |
7
- | 0.2.x | :white_check_mark: |
7
+ | 0.4.x | :white_check_mark: |
8
+ | < 0.4 | :x: |
8
9
 
9
10
  ## Reporting a Vulnerability
10
11
 
@@ -24,15 +25,28 @@ Response time: Within 48 hours
24
25
 
25
26
  - All dependencies scanned with Socket.dev
26
27
  - No credentials stored in code
27
- - API tokens collected via interactive secure prompts (masked input)
28
+ - API tokens can be provided via environment variables (`HETZNER_TOKEN`, `DIGITALOCEAN_TOKEN`) to avoid shell history exposure
29
+ - API tokens collected via interactive secure prompts (masked input) when env vars are not set
30
+ - Config directory created with restrictive permissions (`0o700`)
31
+ - Server config file written with `0o600` permissions (owner read/write only)
32
+ - Cloud-init install log restricted to `chmod 600` (root only)
33
+ - Server name validation: 3-63 chars, lowercase alphanumeric + hyphens, must start with letter
28
34
  - Input validation on all user inputs
29
35
  - Automated security checks via GitHub Actions
30
36
 
37
+ ## HTTP Usage
38
+
39
+ Quicklify accesses Coolify at `http://IP:8000` during initial setup. This is expected because SSL/TLS is not configured on a fresh Coolify installation. Users are warned to set up a domain and enable SSL for production use.
40
+
31
41
  ## Third-party Dependencies
32
42
 
33
43
  Quicklify uses audited dependencies:
34
- - Hetzner Cloud API v1 (via Axios)
44
+ - Hetzner Cloud API v1 (via Axios, HTTPS)
45
+ - DigitalOcean API v2 (via Axios, HTTPS)
46
+ - Coolify installed via `curl -fsSL https://cdn.coollabs.io/coolify/install.sh | bash` (official method, HTTPS)
35
47
  - All dependencies regularly updated
36
48
  - Socket.dev security monitoring enabled
37
49
 
50
+ **Note:** The `curl | bash` installation method is the official Coolify installation procedure. The script is fetched over HTTPS from Coolify's CDN.
51
+
38
52
  Security scan: https://socket.dev/npm/package/quicklify
@@ -0,0 +1,2 @@
1
+ export declare function destroyCommand(query?: string): Promise<void>;
2
+ //# sourceMappingURL=destroy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"destroy.d.ts","sourceRoot":"","sources":["../../src/commands/destroy.ts"],"names":[],"mappings":"AA6BA,wBAAsB,cAAc,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA4ElE"}
@@ -0,0 +1,95 @@
1
+ import inquirer from "inquirer";
2
+ import { getServers, findServer, removeServer } from "../utils/config.js";
3
+ import { createProviderWithToken } from "../utils/providerFactory.js";
4
+ 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
+ export async function destroyCommand(query) {
25
+ let server;
26
+ if (query) {
27
+ server = findServer(query);
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
+ }
38
+ // First confirmation
39
+ const { confirm } = await inquirer.prompt([
40
+ {
41
+ type: "confirm",
42
+ name: "confirm",
43
+ message: `Are you sure you want to destroy "${server.name}" (${server.ip})?`,
44
+ default: false,
45
+ },
46
+ ]);
47
+ if (!confirm) {
48
+ logger.info("Destroy cancelled.");
49
+ return;
50
+ }
51
+ // Second confirmation: type server name
52
+ const { confirmName } = await inquirer.prompt([
53
+ {
54
+ type: "input",
55
+ name: "confirmName",
56
+ message: `Type the server name "${server.name}" to confirm:`,
57
+ },
58
+ ]);
59
+ if (confirmName.trim() !== server.name) {
60
+ logger.error("Server name does not match. Destroy cancelled.");
61
+ return;
62
+ }
63
+ // Ask for API token
64
+ const { apiToken } = await inquirer.prompt([
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
+ ]);
72
+ const spinner = createSpinner("Destroying server...");
73
+ spinner.start();
74
+ try {
75
+ const provider = createProviderWithToken(server.provider, apiToken.trim());
76
+ await provider.destroyServer(server.id);
77
+ removeServer(server.id);
78
+ spinner.succeed(`Server "${server.name}" destroyed`);
79
+ logger.success("Server has been removed from your cloud provider and local config.");
80
+ }
81
+ catch (error) {
82
+ const message = error instanceof Error ? error.message : String(error);
83
+ const isNotFound = message.toLowerCase().includes("not found") || message.toLowerCase().includes("not_found");
84
+ if (isNotFound) {
85
+ removeServer(server.id);
86
+ spinner.warn(`Server not found on ${server.provider} (may have been deleted manually)`);
87
+ logger.info("Removed from local config.");
88
+ }
89
+ else {
90
+ spinner.fail("Failed to destroy server");
91
+ logger.error(message);
92
+ }
93
+ }
94
+ }
95
+ //# sourceMappingURL=destroy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"destroy.js","sourceRoot":"","sources":["../../src/commands/destroy.ts"],"names":[],"mappings":"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"}
@@ -1,2 +1,3 @@
1
- export declare function initCommand(): Promise<void>;
1
+ import type { InitOptions } from "../types/index.js";
2
+ export declare function initCommand(options?: InitOptions): Promise<void>;
2
3
  //# sourceMappingURL=init.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAsCA,wBAAsB,WAAW,kBAqNhC"}
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAgBrD,wBAAsB,WAAW,CAAC,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAiK1E"}