@jumpgroup/laravel-tools 3.3.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 (78) hide show
  1. package/.claude/settings.local.json +59 -0
  2. package/README.md +378 -0
  3. package/bin/groups/cache.js +52 -0
  4. package/bin/groups/database.js +105 -0
  5. package/bin/groups/forge.js +272 -0
  6. package/bin/groups/local.js +78 -0
  7. package/bin/groups/media.js +110 -0
  8. package/bin/tools.js +23 -0
  9. package/docs/Changelog.md +267 -0
  10. package/docs/TODO.md +167 -0
  11. package/docs/releases/release_0.0.1.md +116 -0
  12. package/docs/releases/release_0.0.2.md +88 -0
  13. package/docs/releases/release_0.0.3.md +58 -0
  14. package/docs/releases/release_0.0.4.md +128 -0
  15. package/docs/releases/release_0.0.5.md +77 -0
  16. package/docs/releases/release_0.0.6.md +80 -0
  17. package/docs/releases/release_1.0.0.md +61 -0
  18. package/docs/releases/release_1.0.1.md +18 -0
  19. package/docs/releases/release_1.0.2.md +18 -0
  20. package/docs/releases/release_1.0.3.md +19 -0
  21. package/docs/releases/release_1.1.0.md +18 -0
  22. package/docs/releases/release_1.1.1.md +17 -0
  23. package/docs/releases/release_1.1.2.md +18 -0
  24. package/docs/releases/release_1.1.3.md +21 -0
  25. package/docs/releases/release_1.1.4.md +18 -0
  26. package/docs/releases/release_1.1.5.md +18 -0
  27. package/docs/releases/release_1.1.6.md +21 -0
  28. package/docs/releases/release_1.1.7.md +17 -0
  29. package/docs/releases/release_2.0.0.md +192 -0
  30. package/docs/releases/release_2.0.1.md +53 -0
  31. package/docs/releases/release_2.0.2.md +55 -0
  32. package/docs/releases/release_2.0.3.md +69 -0
  33. package/docs/releases/release_2.1.0.md +59 -0
  34. package/docs/releases/release_2.2.0.md +83 -0
  35. package/docs/releases/release_2.2.1.md +36 -0
  36. package/docs/releases/release_2.2.2.md +57 -0
  37. package/docs/releases/release_2.2.3.md +39 -0
  38. package/docs/releases/release_2.2.4.md +75 -0
  39. package/docs/releases/release_2.2.5.md +69 -0
  40. package/docs/releases/release_3.0.0.md +87 -0
  41. package/docs/releases/release_3.0.1.md +65 -0
  42. package/docs/releases/release_3.1.0.md +90 -0
  43. package/docs/releases/release_3.2.0.md +74 -0
  44. package/docs/releases/release_3.3.0.md +72 -0
  45. package/package.json +35 -0
  46. package/src/aws/bucket.js +287 -0
  47. package/src/aws/cloudfront.js +433 -0
  48. package/src/aws/config.js +39 -0
  49. package/src/aws/iam.js +189 -0
  50. package/src/cache.js +49 -0
  51. package/src/database.js +315 -0
  52. package/src/forge/client.js +43 -0
  53. package/src/forge/config.js +33 -0
  54. package/src/forge/provisioning.js +191 -0
  55. package/src/forge/servers.js +27 -0
  56. package/src/forge/sites.js +93 -0
  57. package/src/google/groupMembers.js +35 -0
  58. package/src/google/utilities.js +39 -0
  59. package/src/local/doctor.js +214 -0
  60. package/src/local/setup.js +398 -0
  61. package/src/media.js +143 -0
  62. package/src/stub/docker/mysql/my.cnf +6 -0
  63. package/src/stub/docker/php/local.ini +4 -0
  64. package/src/stub/docker/traefik/dynamic_conf.yml +4 -0
  65. package/src/stub/docker/traefik/traefik.yml +24 -0
  66. package/src/stub/docker-compose/php8.0/docker-compose.yml +78 -0
  67. package/src/stub/docker-compose/php8.1/docker-compose.yml +78 -0
  68. package/src/stub/docker-compose/php8.2/docker-compose.yml +78 -0
  69. package/src/stub/docker-compose/php8.3/docker-compose.yml +78 -0
  70. package/src/stub/docker-compose/php8.4/docker-compose.yml +78 -0
  71. package/src/stub/docker-compose.yml +78 -0
  72. package/src/utilities/command.js +137 -0
  73. package/src/utilities/dateUtils.js +7 -0
  74. package/src/utilities/fileUtils.js +36 -0
  75. package/src/utilities/google-drive.js +69 -0
  76. package/src/utilities/pathUtils.js +15 -0
  77. package/src/utilities/userInput.js +28 -0
  78. package/src/utilities/utilities.js +57 -0
@@ -0,0 +1,75 @@
1
+ # Release 2.2.4 — Prevenzione distribuzioni CloudFront duplicate e CDN lookup robusto
2
+
3
+ **Date:** 2026-04-08
4
+
5
+ ---
6
+
7
+ ## Overview
8
+
9
+ Tre fix correlati al layer CloudFront che prevengono la creazione di
10
+ distribuzioni duplicate e rendono il lookup di quella esistente più
11
+ robusto in caso di tag AWS temporaneamente non disponibili.
12
+
13
+ ---
14
+
15
+ ## Fixed
16
+
17
+ - **Prevenzione duplicati CloudFront** (`getDistributionsByProjectTag`):
18
+ - Il metodo usava solo il tag `site` per identificare la distribuzione
19
+ del progetto; se il tag lookup falliva, restituiva zero risultati
20
+ e il tool procedeva a crearne una nuova
21
+ - Aggiunto fallback su `comment` (`CDN for {projectName}`) quando
22
+ nessun match esatto per tag viene trovato
23
+ - Se il fallback per comment trova risultati, stampa un avviso
24
+ `⚠️ Tag lookup unavailable/incomplete`
25
+ - Se il lookup fallisce completamente ma ci sono errori di tag listing,
26
+ ora lancia un errore esplicito invece di procedere silenziosamente
27
+
28
+ - **CDN lookup deterministico** (`resolveOrCreateDistributionForProject`):
29
+ - Il lookup ora usa `getDistributionForProjectStrict` (nuova funzione)
30
+ che verifica sia tag/comment *sia* il dominio dell'origine S3,
31
+ riducendo drasticamente la probabilità di match ambigui o falsi
32
+ - La funzione supporta entrambi i formati di dominio S3
33
+ (regionale `bucket.s3.region.amazonaws.com` e globale
34
+ `bucket.s3.amazonaws.com`) tramite un set di candidati
35
+ - Se vengono trovate più distribuzioni candidate, stampa la tabella
36
+ e lancia un errore che richiede risoluzione manuale
37
+
38
+ - **Fix aws-sdk `PutObjectCommand`**:
39
+ - Il `Body` della chiave cartella S3 era passato come stringa vuota `''`;
40
+ alcune versioni dell'SDK lo rifiutavano come tipo non valido
41
+ - Sostituito con `Buffer.alloc(0)` per garantire compatibilità
42
+
43
+ ---
44
+
45
+ ## Added
46
+
47
+ - `getBucketOriginDomainCandidates()` in `src/aws/cloudfront.js`:
48
+ helper che restituisce un `Set` con i due possibili formati del dominio
49
+ S3 origin per un bucket (regionale + globale)
50
+
51
+ - `getDistributionForProjectStrict()` in `src/aws/cloudfront.js`:
52
+ lookup deterministico che combina match su origin domain, comment e tag
53
+ con gestione esplicita dei casi ambigui (0 match → `null`,
54
+ 1 match → oggetto, 2+ match → errore)
55
+
56
+ - Campo `originDomainNames` nei row CloudFront restituiti da
57
+ `distributionToRow()`, per supportare il match sull'origin S3
58
+
59
+ ---
60
+
61
+ ## Files changed
62
+
63
+ - `src/aws/cloudfront.js`
64
+ - `src/aws/bucket.js`
65
+
66
+ ---
67
+
68
+ ## Impact
69
+
70
+ - Eliminato il rischio di creare distribuzioni CloudFront duplicate su
71
+ account dove il tag listing è temporaneamente degradato
72
+ - Il lookup della distribuzione esistente è ora vincolato all'origin S3
73
+ del progetto, rendendo l'idempotenza affidabile anche su account
74
+ con molte distribuzioni
75
+ - Fix compatibilità aws-sdk per la creazione della cartella S3 iniziale
@@ -0,0 +1,69 @@
1
+ # Release 2.2.5 — Laravel health check e recovery post-setup
2
+
3
+ **Date:** 2026-04-23
4
+
5
+ ---
6
+
7
+ ## Overview
8
+
9
+ Migliora la fase finale di `local setup-laravel` con un health check esplicito
10
+ del bootstrap Laravel e un meccanismo di recovery automatico per i casi in cui
11
+ l'applicazione non si avvia correttamente dopo il setup.
12
+
13
+ Aggiunge anche una nuova utility `executeCommandWithOutput` che cattura stdout/stderr
14
+ dai comandi Docker, rendendo gli errori diagnosticabili invece di opachi.
15
+
16
+ ---
17
+
18
+ ## Added
19
+
20
+ - `executeCommandWithOutput` in `src/utilities/command.js`:
21
+ nuovo helper che esegue un comando con stdio in pipe, restituisce stdout in caso
22
+ di successo, e include stderr (o stdout come fallback) nel messaggio di errore in
23
+ caso di exit code non-zero
24
+
25
+ - Health check Laravel post-setup tramite `php artisan about`:
26
+ verifica che il bootstrap dell'applicazione sia integro prima di procedere ai seeder
27
+
28
+ - Recovery automatico senza Filament (`runNoFilamentRecovery`):
29
+ se il health check fallisce su un progetto senza Filament, esegue automaticamente
30
+ `composer install`, `package:discover`, `storage:link`, `optimize:clear` e ripete
31
+ il check; se fallisce di nuovo, lancia un errore con output artisan incluso
32
+
33
+ - Log di conferma `✅ Bootstrap Laravel verificato.` (e variante `dopo recovery`)
34
+ al termine del health check riuscito
35
+
36
+ ---
37
+
38
+ ## Changed
39
+
40
+ - `runLaravelHealthCheck` ora usa `executeCommandWithOutput` invece di `executeCommand`
41
+ con `stdio: pipe`: l'output di artisan è ora visibile nei messaggi di errore
42
+
43
+ - `runNoFilamentRecovery` esegue ora anche `php artisan storage:link` tra
44
+ `package:discover` e `optimize:clear`, coprendo un caso comune di bootstrap rotto
45
+
46
+ - Errore in caso di health check fallito con Filament installato:
47
+ ora è un messaggio in italiano con indicazioni operative e output artisan allegato,
48
+ invece di un re-throw grezzo dal processo executor
49
+
50
+ - Errore in caso di recovery fallito (senza Filament):
51
+ ora include l'output artisan del secondo tentativo per facilitare la diagnosi
52
+
53
+ ---
54
+
55
+ ## Files changed
56
+
57
+ - `src/utilities/command.js`
58
+ - `src/local/setup.js`
59
+
60
+ ---
61
+
62
+ ## Impact
63
+
64
+ - I fallimenti di bootstrap Laravel sono ora diagnosticabili: l'output di artisan
65
+ appare direttamente nel messaggio di errore invece di sparire nel pipe
66
+ - Il recovery automatico riduce i casi in cui il developer deve rilanciareil setup
67
+ manualmente per progetti senza Filament
68
+ - `storage:link` aggiunto al recovery copre un caso comune di Laravel che non trova
69
+ la cartella pubblica dei file
@@ -0,0 +1,87 @@
1
+ # Release 3.0.0 — Gruppo comandi `forge`
2
+
3
+ **Date:** 2026-04-23
4
+
5
+ ---
6
+
7
+ ## Overview
8
+
9
+ Introduce il gruppo comandi `forge`: integrazione diretta con Laravel Forge via API,
10
+ senza dipendenze PHP. Permette di gestire deploy, variabili d'ambiente e log
11
+ direttamente dal terminale, su qualsiasi progetto Laravel gestito da Forge.
12
+
13
+ L'integrazione punta alla nuova API Forge (`/api`), evitando deliberatamente
14
+ la versione legacy `/api/v1` deprecata e prevista per la dismissione il 30 giugno 2026.
15
+
16
+ ---
17
+
18
+ ## Added
19
+
20
+ ### Comandi
21
+
22
+ | Comando | Descrizione |
23
+ |---|---|
24
+ | `forge token set` | Salva il token Forge API in `~/.laravel-tools` |
25
+ | `forge servers` | Elenca tutti i server dell'account Forge |
26
+ | `forge deploy` | Seleziona server → sito → avvia deploy |
27
+ | `forge env get` | Seleziona server → sito → stampa il `.env` remoto |
28
+ | `forge env set` | Seleziona server → sito → sovrascrive il `.env` remoto |
29
+ | `forge logs` | Seleziona server → sito → stampa il log dell'ultimo deploy |
30
+
31
+ ### Moduli
32
+
33
+ - `src/forge/config.js` — lettura/scrittura `~/.laravel-tools` (JSON globale per credenziali);
34
+ errore esplicito in italiano se il token non è configurato
35
+
36
+ - `src/forge/client.js` — wrapper `fetch` verso `https://forge.laravel.com/api`;
37
+ mapping completo degli errori HTTP (401, 403, 404, 422, 429) in messaggi italiani
38
+
39
+ - `src/forge/servers.js` — `listServers()` e `pickServer()` interattivo via `@inquirer/select`
40
+
41
+ - `src/forge/sites.js` — `listSites()`, `pickSite()`, `deploySite()`, `getEnv()`, `setEnv()`,
42
+ `getDeploymentLog()` e prompt di conferma distruttiva per `env set`
43
+
44
+ - `bin/groups/forge.js` — wiring Commander per tutti i comandi del gruppo
45
+
46
+ ---
47
+
48
+ ## Design decisions
49
+
50
+ - **Token globale in `~/.laravel-tools`**: il token Forge è per account, non per progetto.
51
+ Viene salvato una sola volta sulla macchina del developer e riutilizzato su tutti i progetti.
52
+
53
+ - **Server/sito sempre interattivi**: il tool è usato su progetti diversi ogni volta,
54
+ quindi non ha senso memorizzare IDs in `laravel-tools.yml`.
55
+
56
+ - **Nessuna dipendenza aggiuntiva**: il client HTTP usa `fetch` nativo (Node 20+,
57
+ già requisito del progetto). Nessun package npm aggiunto.
58
+
59
+ - **Nuova API Forge (`/api`)**: la versione legacy `/api/v1` è deprecata.
60
+ Partire dalla nuova API evita una migrazione forzata entro giugno 2026.
61
+
62
+ - **`forge env set` è distruttivo**: sovrascrive completamente il `.env` remoto.
63
+ Il prompt di conferma è esplicito e in rosso:
64
+ `DISTRUTTIVO: Se confermi l'env remote verrà sovrascritto! Sicuro di voler continuare?`
65
+
66
+ ---
67
+
68
+ ## Files changed
69
+
70
+ - `src/forge/config.js` (nuovo)
71
+ - `src/forge/client.js` (nuovo)
72
+ - `src/forge/servers.js` (nuovo)
73
+ - `src/forge/sites.js` (nuovo)
74
+ - `bin/groups/forge.js` (nuovo)
75
+ - `bin/tools.js`
76
+ - `package.json`
77
+
78
+ ---
79
+
80
+ ## Impact
81
+
82
+ - I developer possono avviare deploy, leggere log e gestire variabili d'ambiente
83
+ Forge direttamente dal terminale senza aprire la UI web
84
+ - Nessuna dipendenza dal package PHP `laravel/forge-sdk`: l'integrazione è
85
+ implementata nativamente in Node.js
86
+ - L'architettura è predisposta per aggiungere nuovi comandi Forge senza toccare
87
+ il client o la configurazione
@@ -0,0 +1,65 @@
1
+ # Release 3.0.1 — Fix server path per Forge su AWS
2
+
3
+ **Date:** 2026-04-23
4
+
5
+ ---
6
+
7
+ ## Overview
8
+
9
+ Corregge il path remoto usato dai comandi `database remote-export`,
10
+ `database remote-import` e `cache flush-remote`.
11
+
12
+ Il path precedente (`/var/www/{APP_NAME}/current`) era derivato dalla
13
+ convenzione Deployer e non corrisponde alla struttura reale dei server
14
+ gestiti da Laravel Forge, dove il path è basato sul dominio del sito
15
+ (es. `/home/forge/api.goego.it`).
16
+
17
+ ---
18
+
19
+ ## Fixed
20
+
21
+ - `getServerPath` non deriva più il path dall'`APP_NAME`: legge ora
22
+ il campo `path` da `laravel-tools.yml` per l'ambiente selezionato
23
+ - Se `path` non è configurato, lancia un errore esplicito con esempio
24
+ di configurazione
25
+ - `cache flush-remote` passava `appName` a `getServerPath` invece
26
+ di `env` — corretto
27
+
28
+ ---
29
+
30
+ ## Changed
31
+
32
+ - `getServerPath` spostato da `src/utilities/pathUtils.js` a
33
+ `src/utilities/command.js`, dove vivono già `getIp` e `getSshUser`
34
+ (stessa fonte di configurazione: `laravel-tools.yml`)
35
+ - `src/database.js` e `src/cache.js` aggiornati per importare
36
+ `getServerPath` da `command.js`
37
+
38
+ ---
39
+
40
+ ## Migration
41
+
42
+ Aggiungere `path` a ogni ambiente in `laravel-tools.yml`:
43
+
44
+ ```yaml
45
+ staging:
46
+ host: 1.2.3.4
47
+ user: forge
48
+ path: /home/forge/staging.your-site.com
49
+ production:
50
+ host: 5.6.7.8
51
+ user: forge
52
+ path: /home/forge/your-site.com
53
+ ```
54
+
55
+ Il valore di `path` corrisponde al nome della directory del sito
56
+ visibile in **Forge → Server → Sites**.
57
+
58
+ ---
59
+
60
+ ## Files changed
61
+
62
+ - `src/utilities/command.js`
63
+ - `src/utilities/pathUtils.js`
64
+ - `src/database.js`
65
+ - `src/cache.js`
@@ -0,0 +1,90 @@
1
+ # Release 3.1.0 — `forge server create`
2
+
3
+ **Date:** 2026-04-24
4
+
5
+ ---
6
+
7
+ ## Overview
8
+
9
+ Aggiunge il comando `forge server create` per provisionare un nuovo server
10
+ AWS Lightsail tramite Forge API direttamente dal terminale.
11
+
12
+ Il comando supporta il pattern blue/green usato in azienda: quando esiste già
13
+ un server con lo stesso nome, auto-incrementa il suffisso (`myapp-staging` →
14
+ `myapp-staging-2` → `myapp-staging-3`) e chiede conferma prima di procedere.
15
+ Il passaggio dell'IP statico tra le istanze rimane manuale via AWS Console.
16
+
17
+ ---
18
+
19
+ ## Added
20
+
21
+ ### Comando
22
+
23
+ ```bash
24
+ laravel-tools forge server create
25
+ ```
26
+
27
+ ### Flusso interattivo
28
+
29
+ 1. Recupero automatico credenziale AWS da Forge (nessuna configurazione aggiuntiva)
30
+ 2. Lettura versione PHP da `composer.json` → conversione al formato Forge (`php84` ecc.)
31
+ 3. Lettura `APP_NAME` da `.env.example`
32
+ 4. Selezione ambiente (`staging` / `production`) → nome base derivato (`{APP_NAME}-{env}`)
33
+ 5. Risoluzione nome con auto-incremento se il nome esiste già su Forge
34
+ 6. Conferma nome server prima di procedere
35
+ 7. Selezione regione AWS (`eu-central-1` / `us-west-2`)
36
+ 8. Recupero piani Lightsail disponibili via Forge API (fallback su lista standard se l'API non risponde)
37
+ 9. Selezione piano (nano / micro / small / medium / large / xlarge)
38
+ 10. Opzione Redis (default: no)
39
+ 11. Creazione server → polling ogni 20s fino a provisioning completo (timeout 25 min)
40
+ 12. Output: nome, IP, PHP, Redis, hint passo successivo
41
+
42
+ ### Logica di naming per blue/green
43
+
44
+ | Servers esistenti | Nome assegnato |
45
+ |---|---|
46
+ | nessuno | `myapp-staging` |
47
+ | `myapp-staging` | `myapp-staging-2` |
48
+ | `myapp-staging`, `myapp-staging-2` | `myapp-staging-3` |
49
+
50
+ Il workflow aziendale prevede: spin up nuovo server → swap IP statico Lightsail
51
+ (manuale via AWS Console) → backup → delete del server precedente.
52
+
53
+ ### Parametri server fissi
54
+
55
+ | Parametro | Valore |
56
+ |---|---|
57
+ | Provider | `aws` |
58
+ | Tipo | `app` |
59
+ | Database | MySQL 8 (`mysql8`) |
60
+ | Ubuntu | 24.04 |
61
+
62
+ ### Nuovo modulo
63
+
64
+ - `src/forge/provisioning.js`:
65
+ - `getAwsCredential()` — trova la credenziale AWS nell'account Forge
66
+ - `getSizesForRegion()` — recupera i piani Lightsail via API con fallback
67
+ - `readPhpVersionFromComposer()` — legge e converte la versione PHP
68
+ - `readAppName()` — legge `APP_NAME` da `.env.example`
69
+ - `resolveServerName()` — auto-incrementa il nome se già in uso
70
+ - `promptServerConfig()` — flusso interattivo completo
71
+ - `createServer()` — chiama `POST /servers`
72
+ - `pollServerReady()` — polling con progress dots fino a `is_ready`
73
+
74
+ ---
75
+
76
+ ## Files changed
77
+
78
+ - `src/forge/provisioning.js` (nuovo)
79
+ - `bin/groups/forge.js`
80
+
81
+ ---
82
+
83
+ ## Impact
84
+
85
+ - Il provisioning di un nuovo server staging/production richiede ora
86
+ un solo comando invece di navigare la UI Forge
87
+ - Il pattern blue/green è gestito nativamente: nessun rischio di sovrascrivere
88
+ un server esistente per errore di naming
89
+ - La versione PHP viene letta dal progetto reale, eliminando il rischio
90
+ di disallineamento tra ambiente locale e server remoto
@@ -0,0 +1,74 @@
1
+ # Release 3.2.0 — `forge site create`
2
+
3
+ **Date:** 2026-04-24
4
+
5
+ ---
6
+
7
+ ## Overview
8
+
9
+ Aggiunge il comando `forge site create` per collegare un sito Laravel
10
+ a un server Forge esistente e installare il repository Git in un unico flusso.
11
+
12
+ Insieme a `forge server create` (3.1.0), copre i due passi fondamentali
13
+ del provisioning di un nuovo ambiente staging/production:
14
+
15
+ ```
16
+ forge server create → forge site create → forge env set → forge deploy
17
+ ```
18
+
19
+ ---
20
+
21
+ ## Added
22
+
23
+ ### Comando
24
+
25
+ ```bash
26
+ laravel-tools forge site create
27
+ ```
28
+
29
+ ### Flusso interattivo
30
+
31
+ 1. Lettura PHP version da `composer.json` (stesso meccanismo di `forge server create`)
32
+ 2. Lettura `APP_NAME` da `.env.example` → suggerisce nome database (`app_name`)
33
+ 3. Selezione server esistente su Forge
34
+ 4. Input dominio del sito (es. `staging.myapp.com`)
35
+ 5. Input nome database (default: `APP_NAME` con trattini → underscore)
36
+ 6. Selezione provider Git (GitHub / GitLab / Bitbucket)
37
+ 7. Input repository in formato `org/repo`
38
+ 8. Input branch (default: `main`)
39
+ 9. Creazione sito via API → polling ogni 5s fino a `status=installed` (timeout 5 min)
40
+ 10. Installazione repository Git + `composer install` automatico
41
+ 11. Output riepilogo + hint passi successivi (`forge env set` → `forge deploy`)
42
+
43
+ ### Parametri sito fissi
44
+
45
+ | Parametro | Valore |
46
+ |---|---|
47
+ | Tipo progetto | `php` |
48
+ | Web directory | `/public` |
49
+ | PHP version | letta da `composer.json` |
50
+ | Composer install | `true` |
51
+
52
+ ### Nuove funzioni in `src/forge/sites.js`
53
+
54
+ - `createSite(serverId, payload)` — chiama `POST /servers/{id}/sites`
55
+ - `pollSiteInstalled(serverId, siteId)` — polling ogni 5s fino a `status=installed`
56
+ - `installGitRepo(serverId, siteId, payload)` — chiama `POST /servers/{id}/sites/{id}/git`
57
+
58
+ ---
59
+
60
+ ## Files changed
61
+
62
+ - `src/forge/sites.js`
63
+ - `bin/groups/forge.js`
64
+
65
+ ---
66
+
67
+ ## Impact
68
+
69
+ - Il setup di un nuovo sito su un server Forge esistente richiede ora
70
+ un solo comando guidato invece di navigare la UI
71
+ - Il repository Git viene collegato e `composer install` eseguito
72
+ automaticamente al termine della creazione del sito
73
+ - Il flusso `server create` → `site create` → `env set` → `deploy`
74
+ copre ora l'intero ciclo di provisioning di un nuovo ambiente
@@ -0,0 +1,72 @@
1
+ # Release 3.3.0 — `forge server delete` + convenzione domini
2
+
3
+ **Date:** 2026-04-24
4
+
5
+ ---
6
+
7
+ ## Overview
8
+
9
+ Aggiunge `forge server delete` per eliminare un server Forge dalla CLI,
10
+ introduce la convenzione domini con prefisso `api.` in tutti gli ambienti,
11
+ e corregge un crash in `forge site create`.
12
+
13
+ ---
14
+
15
+ ## Added
16
+
17
+ ### `forge server delete`
18
+
19
+ ```bash
20
+ laravel-tools forge server delete
21
+ ```
22
+
23
+ - Mostra lista server → selezione interattiva
24
+ - Avviso in rosso con nome e IP del server da eliminare
25
+ - Conferma distruttiva con default `N`
26
+ - Chiama `DELETE /servers/{id}` via Forge API
27
+
28
+ > Nota: Forge tenta di terminare anche l'istanza EC2 sottostante, ma può fallire silenziosamente se le credenziali AWS su Forge non hanno il permesso `ec2:TerminateInstances`. In quel caso, terminare l'istanza manualmente dalla console AWS o via `aws ec2 terminate-instances`.
29
+
30
+ ---
31
+
32
+ ## Changed
33
+
34
+ ### Convenzione domini — prefisso `api.`
35
+
36
+ Tutti i progetti Laravel creati con laravel-tools seguono ora la convenzione:
37
+
38
+ | Ambiente | Dominio |
39
+ |------------|----------------------------------|
40
+ | Locale | `api.{appName}.test` |
41
+ | Staging | `api.{appName}.sitointest.it` |
42
+ | Production | `api.{appName}.it` |
43
+
44
+ #### Locale (`local setup-repo`)
45
+
46
+ - Certificati SSL generati per `api.{appName}.test` (era `{appName}.test`)
47
+ - `/etc/hosts` aggiornato con `api.{appName}.test`
48
+ - `APP_URL` e `ASSETS_URL` in `.env.example` impostati a `https://api.{appName}.test`
49
+
50
+ #### Forge (`forge site create`)
51
+
52
+ - Il campo dominio si pre-compila automaticamente:
53
+ - Server con "staging" nel nome → `api.{appName}.sitointest.it`
54
+ - Server production → `api.{appName}.it`
55
+ - L'utente può modificare il valore prima di confermare
56
+
57
+ ---
58
+
59
+ ## Fixed
60
+
61
+ - Import mancante di `select` in `bin/groups/forge.js`: causava
62
+ `ReferenceError: select is not defined` durante `forge site create`
63
+ al passo di selezione del provider Git (GitHub/GitLab/Bitbucket)
64
+
65
+ ---
66
+
67
+ ## Files changed
68
+
69
+ - `src/forge/servers.js` — aggiunto `deleteServer(serverId)`
70
+ - `src/local/setup.js` — convenzione `api.` per dominio locale
71
+ - `bin/groups/forge.js` — comando `server delete`, default dominio `forge site create`, fix import `select`
72
+ - `package.json` — versione `3.3.0`
package/package.json ADDED
@@ -0,0 +1,35 @@
1
+ {
2
+ "name": "@jumpgroup/laravel-tools",
3
+ "version": "3.3.0",
4
+ "description": "CLI tool for managing the full lifecycle of Laravel projects at JumpGroup",
5
+ "type": "module",
6
+ "bin": {
7
+ "laravel-tools": "bin/tools.js"
8
+ },
9
+ "scripts": {
10
+ "start": "node bin/tools.js"
11
+ },
12
+ "dependencies": {
13
+ "@aws-sdk/client-cloudfront": "^3.924.0",
14
+ "@aws-sdk/client-iam": "^3.924.0",
15
+ "@aws-sdk/client-s3": "^3.924.0",
16
+ "@aws-sdk/client-sts": "^3.924.0",
17
+ "@aws-sdk/credential-provider-ini": "^3.924.0",
18
+ "@inquirer/prompts": "^1.1.3",
19
+ "@inquirer/select": "^1.2.6",
20
+ "@jumpgroup/secret-fetcher": "^2.1.0",
21
+ "cli-table3": "^0.6.3",
22
+ "commander": "^10.0.0",
23
+ "dotenv": "^16.0.0",
24
+ "glob": "^10.2.2",
25
+ "hostile": "^1.3.3",
26
+ "js-yaml": "^4.1.0",
27
+ "keytar": "^7.9.0"
28
+ },
29
+ "engines": {
30
+ "node": ">=20"
31
+ },
32
+ "publishConfig": {
33
+ "access": "public"
34
+ }
35
+ }