@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,59 @@
1
+ {
2
+ "permissions": {
3
+ "allow": [
4
+ "mcp__claude-buddy__buddy_show",
5
+ "mcp__claude-buddy__buddy_pet",
6
+ "mcp__serena__write_memory",
7
+ "mcp__serena__check_onboarding_performed",
8
+ "mcp__serena__initial_instructions",
9
+ "Skill(update-config)",
10
+ "Bash(npx --yes sequential-thinking --version)",
11
+ "Read(//Users/andre/.npm/**)",
12
+ "Read(//usr/local/bin/**)",
13
+ "Read(//Users/andre/.claude/**)",
14
+ "Read(//Users/andre/.config/claude/**)",
15
+ "Read(//Users/andre/.config/**)"
16
+ ]
17
+ },
18
+ "hooks": {
19
+ "PostToolUse": [
20
+ {
21
+ "matcher": "Edit|Write",
22
+ "hooks": [
23
+ {
24
+ "type": "agent",
25
+ "prompt": "A file was just edited. Tool input: $ARGUMENTS. Using Serena tools (get_symbols_overview, find_symbol, find_referencing_symbols), briefly validate the changed file: check for symbol correctness, broken references, and consistency with the codebase. Report only real issues. If everything looks fine, output nothing.",
26
+ "statusMessage": "sc:reflect — validating changes...",
27
+ "timeout": 30,
28
+ "async": true
29
+ }
30
+ ]
31
+ }
32
+ ],
33
+ "PreToolUse": [
34
+ {
35
+ "matcher": "Bash",
36
+ "hooks": [
37
+ {
38
+ "type": "agent",
39
+ "prompt": "A git commit command is about to run. Command: $ARGUMENTS. Using Serena tools, analyze the codebase for critical issues that should block this commit: security vulnerabilities, broken symbol references, obvious bugs. If critical issues are found, set permissionDecision to deny with a clear explanation. If only minor or no issues, allow the commit.",
40
+ "if": "Bash(git commit*)",
41
+ "statusMessage": "sc:analyze — pre-commit review...",
42
+ "timeout": 60
43
+ }
44
+ ]
45
+ }
46
+ ],
47
+ "SessionStart": [
48
+ {
49
+ "hooks": [
50
+ {
51
+ "type": "command",
52
+ "command": "printf '{\"systemMessage\":\"sc:load: Read Serena project memories (code_style, codebase_structure, project_overview, suggested_commands, tech_stack) via mcp__serena__read_memory to restore full project context before your first response.\"}'",
53
+ "statusMessage": "sc:load — restoring context..."
54
+ }
55
+ ]
56
+ }
57
+ ]
58
+ }
59
+ }
package/README.md ADDED
@@ -0,0 +1,378 @@
1
+ # laravel-tools
2
+
3
+ CLI interna per portare sui progetti Laravel un workflow simile a `trellis-tools`.
4
+
5
+ Il focus attuale del progetto e del lavoro in corso e' il flusso di sviluppo locale:
6
+ - definire il progetto
7
+ - preparare il repo locale
8
+ - avviare lo stack Docker
9
+ - inizializzare Laravel dentro lo stack in esecuzione
10
+
11
+ ## Stato del progetto
12
+
13
+ Questo progetto e' ancora un grosso work in progress. La release corrente di riferimento e' `2.2.0`, ma la priorita' adesso resta stabilizzare il flusso locale e documentare bene le nuove funzionalita' prima di espandere il resto del tool.
14
+
15
+ ## Obiettivo
16
+
17
+ `laravel-tools` prende come benchmark `@jumpgroup/trellis-tools`, ma lo adatta a progetti Laravel che non usano Trellis.
18
+
19
+ Oggi i gruppi di comandi presenti sono:
20
+ - `local`
21
+ - `database`
22
+ - `cache`
23
+ - `media` (S3 + CloudFront)
24
+
25
+ ## Prerequisiti locali
26
+
27
+ Per testare seriamente il flusso locale su un progetto servono:
28
+ - Node.js `>=20`
29
+ - Docker Desktop con `docker compose`
30
+ - `mkcert` installato e inizializzato con `mkcert -install`
31
+ - permessi per usare `sudo` localmente
32
+ - file `.env.example` nel progetto Laravel target
33
+ - file `.secret-fetcher` nel progetto Laravel target
34
+
35
+ Dipendenze opzionali ma rilevanti:
36
+ - Google Drive configurato per i dump database
37
+ - `laravel-tools.yml` nel root del progetto target se vuoi usare i comandi remoti
38
+
39
+ ## Installazione sviluppo
40
+
41
+ Nel repo di `laravel-tools`:
42
+
43
+ ```bash
44
+ npm install
45
+ npm link
46
+ ```
47
+
48
+ Questo espone il comando `laravel-tools` in locale.
49
+
50
+ ## Quickstart locale
51
+
52
+ Dentro un progetto Laravel reale:
53
+
54
+ ```bash
55
+ npx laravel-tools local setup-project
56
+ yarn repo-setup
57
+ yarn start
58
+ yarn setup-laravel
59
+ ```
60
+
61
+ Con variante PHP esplicita:
62
+
63
+ ```bash
64
+ npx laravel-tools local setup-project
65
+ laravel-tools local setup-repo --phpversion php8.2
66
+ yarn start
67
+ yarn setup-laravel
68
+ ```
69
+
70
+ Se il boilerplate espone gia' `yarn repo-setup`, quello resta il percorso standard. Il comando manuale con `--phpversion` serve solo quando vuoi forzare una variante PHP diversa dal default nello step 2.
71
+
72
+ ## Cosa fa il flusso locale
73
+
74
+ ### `local setup-project`
75
+
76
+ Esegue questi passi:
77
+ 1. controlla che `.env.example` esista
78
+ 2. controlla che `.secret-fetcher` esista
79
+ 3. legge `APP_NAME` da `.env.example`
80
+ 4. chiede conferma o modifica del nome progetto
81
+ 5. normalizza il nome in uno slug sicuro per host locali, container Docker e routing Traefik
82
+ 6. aggiorna `APP_NAME`, `APP_URL` e `ASSETS_URL` in `.env.example`
83
+ 7. opzionalmente configura lo stack media AWS (S3 + CloudFront), con default `no`
84
+
85
+ Questa fase definisce l'identita' del progetto.
86
+
87
+ Non fa:
88
+ - generazione di `.env`
89
+ - copia degli stub Docker
90
+ - generazione dei certificati
91
+ - modifica di `/etc/hosts`
92
+ - `composer install`
93
+ - avvio di Docker
94
+ - migration o seeder
95
+ - creazione risorse AWS, se scegli `no` al prompt media
96
+
97
+ Se scegli `si` al prompt media:
98
+ - usa il nome progetto normalizzato come identita' AWS del progetto
99
+ - prova a configurare o riconciliare bucket S3, CloudFront e IAM media
100
+ - aggiorna `.env.example` con i valori media risultanti
101
+ - invia le credenziali media a `secret-fetcher` se il progetto e' configurato
102
+
103
+ ### `local setup-repo`
104
+
105
+ Esegue questi passi:
106
+ 1. controlla i prerequisiti minimi locali
107
+ 2. legge `.env.example` e verifica che il progetto sia inizializzato
108
+ 3. usa `@jumpgroup/secret-fetcher` per generare `.env`
109
+ 4. copia gli stub Docker e Traefik nel progetto
110
+ 5. genera i certificati locali con `mkcert`
111
+ 6. aggiunge `{APP_NAME}.test` e `mail.{APP_NAME}.test` a `/etc/hosts`
112
+
113
+ Questa fase rende il checkout locale eseguibile sulla macchina.
114
+
115
+ Note importanti:
116
+ - gli stub Docker preferiscono `DB_DATABASE`
117
+ - per compatibilita' il tool accetta anche `DB_NAME`
118
+ - `APP_NAME` e' la singola fonte di naming e pilota:
119
+ - `https://{APP_NAME}.test`
120
+ - `${APP_NAME}-api`
121
+ - `${APP_NAME}-mysql`
122
+ - `${APP_NAME}-mailpit`
123
+ - Traefik e' pensato per servire `https://{APP_NAME}.test`
124
+ - Mailpit e' esposto su `https://mail.{APP_NAME}.test`
125
+
126
+ ### `local setup-laravel`
127
+
128
+ Esegue questi passi:
129
+ 1. verifica che `.env` esista
130
+ 2. verifica che il container `${APP_NAME}-api` sia in esecuzione
131
+ 3. genera `APP_KEY` solo se manca
132
+ 4. lancia le migration
133
+ 5. opzionalmente esegue i seeder
134
+
135
+ Questa fase inizializza Laravel dentro lo stack gia' avviato.
136
+
137
+ ### `local doctor`
138
+
139
+ Esegue una diagnostica rapida del progetto locale e segnala:
140
+ 1. file chiave presenti/mancanti (`.env.example`, `.secret-fetcher`, `.env`, `docker-compose.yml`, certificati)
141
+ 2. variabili minime richieste in `.env.example`
142
+ 3. prerequisiti locali (`docker compose`, `mkcert`, `composer`, `sudo`)
143
+ 4. stato Docker daemon e container `${APP_NAME}-api` / `${APP_NAME}-mysql`
144
+
145
+ Il comando termina con errore se trova problemi bloccanti.
146
+
147
+ ## Checklist di validazione locale
148
+
149
+ Quando proviamo `laravel-tools` su un progetto reale, questa e' la checklist minima:
150
+ - `npx laravel-tools local setup-project` termina senza errori
151
+ - `laravel-tools local setup-repo` termina senza errori
152
+ - `yarn start` avvia correttamente `traefik`, `api`, `db`, `mailpit`
153
+ - `laravel-tools local setup-laravel` termina senza errori
154
+ - `https://{APP_NAME}.test` risponde
155
+ - `https://mail.{APP_NAME}.test` risponde
156
+ - i comandi `database local-export` e `database local-import` funzionano
157
+ - `cache flush-local` funziona
158
+
159
+ ## Stack media AWS
160
+
161
+ Il gruppo `media` gestisce lo stack media del progetto su AWS con questo modello:
162
+ - bucket S3 privato
163
+ - CloudFront davanti al bucket
164
+ - Origin Access Control (OAC) per l'accesso da CloudFront a S3
165
+ - bucket policy che consente lettura solo alla distribuzione CloudFront del progetto
166
+ - IAM user dedicato per upload, delete e invalidation applicative
167
+
168
+ Il naming e' deterministico:
169
+ - bucket: `${APP_NAME}-media`
170
+ - OAC: `${APP_NAME}-media-oac`
171
+ - IAM user: `media-user.${APP_NAME}`
172
+ - tag AWS usato per il matching: `site=${APP_NAME}`
173
+
174
+ ### Prerequisiti AWS
175
+
176
+ Per usare i comandi `media` servono:
177
+ - credenziali AWS locali valide nel profilo condiviso (`AWS_PROFILE`, default `default`)
178
+ - permessi per S3, CloudFront, IAM e STS nell'account target
179
+ - `.env.example` presente se vuoi usare il fallback automatico a `APP_NAME`
180
+
181
+ Regioni usate dal tool:
182
+ - S3: `AWS_REGION` oppure `AWS_DEFAULT_REGION`, fallback `eu-central-1`
183
+ - CloudFront/IAM/STS: `us-east-1` salvo override di `AWS_CLOUDFRONT_REGION`
184
+
185
+ ### Comandi `media`
186
+
187
+ #### `media setup-general`
188
+
189
+ Esegue il setup completo dello stack media per il progetto corrente:
190
+ 1. crea o riconcilia il bucket `${APP_NAME}-media`
191
+ 2. impone una configurazione privata al bucket
192
+ 3. crea o riconcilia la distribuzione CloudFront del progetto
193
+ 4. crea o riconcilia l'OAC usato dalla distribuzione
194
+ 5. applica o aggiorna la bucket policy per consentire la lettura a CloudFront
195
+ 6. crea o aggiorna lo IAM user dedicato al media
196
+ 7. ruota le access key in modo safe
197
+ 8. aggiorna `.env.example`
198
+ 9. invia le credenziali a `secret-fetcher` se presente
199
+
200
+ Il comando e' pensato per essere rilanciabile senza dover distruggere le risorse esistenti.
201
+
202
+ #### `media setup-iam`
203
+
204
+ Crea o aggiorna solo lo IAM user media:
205
+ - cerca la distribuzione CloudFront del progetto tramite tag `site`
206
+ - aggiorna la policy inline dello user
207
+ - genera una nuova access key e rimuove quella vecchia solo dopo creazione riuscita
208
+
209
+ Questo comando e' utile quando vuoi rigenerare credenziali senza toccare bucket o CloudFront.
210
+
211
+ #### `media s3 list`
212
+
213
+ Lista i bucket S3 visibili al profilo AWS corrente, mostrando il tag `site` quando presente.
214
+
215
+ #### `media s3 get --tag <tag>`
216
+
217
+ Cerca bucket tramite tag `site=<tag>`.
218
+ Se trova piu' bucket con lo stesso tag, apre una scelta interattiva.
219
+
220
+ #### `media cloudfront list`
221
+
222
+ Lista le distribuzioni CloudFront visibili al profilo AWS corrente, mostrando:
223
+ - ID
224
+ - ARN
225
+ - domain name
226
+ - status
227
+ - comment
228
+ - tag `site`
229
+
230
+ #### `media cloudfront get --tag <tag>`
231
+
232
+ Recupera la distribuzione CloudFront del progetto con match esatto sul tag `site`.
233
+
234
+ Se esistono piu' distribuzioni con lo stesso tag, il comando fallisce esplicitamente:
235
+ non prova a indovinare.
236
+
237
+ #### `media cloudfront setup`
238
+
239
+ Crea o riconcilia la distribuzione CloudFront del progetto e garantisce che:
240
+ - il bucket esista gia'
241
+ - la distribuzione usi OAC
242
+ - la bucket policy permetta la lettura a quella distribuzione
243
+
244
+ Non crea lo IAM user: per quello serve `media setup-general` oppure `media setup-iam`.
245
+
246
+ ### Variabili `.env.example` aggiornate
247
+
248
+ Quando il setup media aggiorna `.env.example`, scrive:
249
+ - `AWS_DEFAULT_REGION`
250
+ - `AWS_BUCKET`
251
+ - `AWS_URL`
252
+ - `CLOUDFRONT_DISTRIBUTION_ID`
253
+ - `CLOUDFRONT_DOMAIN`
254
+ - `S3_SITE_BUCKET`
255
+ - `S3_UPLOADS_BUCKET_URL`
256
+
257
+ ### Esempi
258
+
259
+ ```bash
260
+ laravel-tools media setup-general
261
+ laravel-tools media setup-general --name my-project
262
+ laravel-tools media setup-iam
263
+ laravel-tools media setup-iam --cloudfront E1234567890ABC
264
+ laravel-tools media s3 get --tag my-project
265
+ laravel-tools media cloudfront get --tag my-project
266
+ laravel-tools media cloudfront setup --name my-project
267
+ ```
268
+
269
+ ## Comandi utili
270
+
271
+ ```bash
272
+ npx laravel-tools local setup-project
273
+ laravel-tools local doctor
274
+ laravel-tools local setup-repo
275
+ laravel-tools local setup-repo --phpversion php8.4
276
+ laravel-tools local setup-laravel
277
+ laravel-tools media setup-general
278
+ laravel-tools media s3 list
279
+ laravel-tools media cloudfront list
280
+ laravel-tools cache flush-local
281
+ laravel-tools database local-export
282
+ laravel-tools database local-import
283
+ ```
284
+
285
+ ## Configurazione remota
286
+
287
+ I comandi remoti leggono `laravel-tools.yml` dal root del progetto target:
288
+
289
+ ```yaml
290
+ staging:
291
+ host: 1.2.3.4
292
+ user: deployer
293
+
294
+ production:
295
+ host: 5.6.7.8
296
+ user: deployer
297
+ ```
298
+
299
+ ## Workflow multi-repo con Codex
300
+
301
+ Per i task che coinvolgono piu' repository, il workflow raccomandato e' una singola sessione Codex centrata su `laravel-tools`, con:
302
+ - un repo secondario modificabile, per esempio il boilerplate Laravel
303
+ - un repo reale usato come riferimento read-only
304
+
305
+ Questo workflow non e' una feature del codice di `laravel-tools`: e' una convenzione operativa per lavorare piu' velocemente tra tool, boilerplate e progetto reale.
306
+
307
+ ### Struttura consigliata dei ruoli
308
+
309
+ - primary repo: `laravel-tools`
310
+ - secondary writable repo: boilerplate Laravel
311
+ - reference read-only repo: progetto Laravel reale
312
+
313
+ ### Comando base
314
+
315
+ ```bash
316
+ codex -C /path/to/laravel-tools \
317
+ --add-dir /path/to/laravel-boilerplate \
318
+ --add-dir /path/to/laravel-real-project
319
+ ```
320
+
321
+ ### Prompt iniziale standard
322
+
323
+ ```text
324
+ Workspace multi-repo:
325
+
326
+ - Primary repo: laravel-tools
327
+ - Secondary writable repo: laravel-boilerplate
328
+ - Reference read-only repo: laravel-real-project
329
+
330
+ Rules:
331
+ - Do not change any code without my approval.
332
+ - Ask approval separately for each repo before any patch.
333
+ - Use laravel-real-project only as reference unless I explicitly authorize changes there.
334
+
335
+ Current goal:
336
+ [descrizione task]
337
+ ```
338
+
339
+ ### Ordine operativo per ogni task
340
+
341
+ 1. esplorare `laravel-tools`
342
+ 2. esplorare il boilerplate se il task tocca il flusso locale o gli stub
343
+ 3. confrontare il progetto reale solo per validare struttura, naming, convenzioni o edge cases
344
+ 4. proporre un piano di modifica separato per repo
345
+ 5. aspettare approvazione esplicita
346
+ 6. applicare cambi solo nel repo autorizzato
347
+
348
+ ### Regole decisionali
349
+
350
+ - `laravel-tools` contiene la logica CLI, i command group, i controlli e la documentazione del tool
351
+ - il boilerplate e' il target principale per verificare che `setup-project`, `setup-repo`, `setup-laravel`, Docker e convenzioni env funzionino davvero
352
+ - il progetto reale serve come benchmark di compatibilita' e riferimento architetturale
353
+ - nessun cambiamento cross-repo va fatto in un unico passaggio implicito
354
+ - se un task richiede modifiche in piu' repo, l'output va separato in blocchi: `repo tools`, `repo boilerplate`, `repo reference`
355
+ - il repo reale resta read-only di default
356
+
357
+ ### Checklist di validazione
358
+
359
+ - aprire una sessione unica con `laravel-tools` come root e gli altri repo come `--add-dir`
360
+ - eseguire un task di sola analisi cross-repo e verificare che i ruoli siano distinti correttamente
361
+ - eseguire un task che richiede cambi su `laravel-tools` e boilerplate e verificare che l'approvazione sia chiesta separatamente
362
+ - verificare che il repo reale venga trattato come read-only salvo override esplicito
363
+
364
+ ### Primo task consigliato
365
+
366
+ Usare il workflow multi-repo per:
367
+ - confrontare il flusso locale tra `laravel-tools`, boilerplate e progetto reale
368
+ - produrre una gap analysis
369
+ - proporre cambi solo su `laravel-tools` e boilerplate
370
+ - lasciare il progetto reale come benchmark
371
+
372
+ ## Direzione attuale
373
+
374
+ Le prossime iterazioni dovrebbero concentrarsi su:
375
+ - test end-to-end del flusso locale su un progetto Laravel reale
376
+ - applicazione del workflow multi-repo per confrontare tool, boilerplate e progetto reale
377
+ - rimozione delle incoerenze residue tra stub, documentazione e comportamento CLI
378
+ - solo dopo, nuove funzionalita' cross-repo o nuovi command group
@@ -0,0 +1,52 @@
1
+ import { Option } from 'commander';
2
+ import { flushLocal, flushRemote, flushAll } from '../../src/cache.js';
3
+
4
+ export default (program) => {
5
+ const cache = program.command('cache').description('Cache operations');
6
+
7
+ cache
8
+ .command('flush-local')
9
+ .description('Clear all Laravel caches in the local Docker environment')
10
+ .action(async () => {
11
+ try {
12
+ await flushLocal();
13
+ } catch (error) {
14
+ console.error('❌ Error:', error.message);
15
+ process.exit(1);
16
+ }
17
+ });
18
+
19
+ cache
20
+ .command('flush-remote')
21
+ .description('Clear all Laravel caches on a remote server')
22
+ .addOption(
23
+ new Option('-e, --environment [environment]', 'Environment')
24
+ .choices(['staging', 'production'])
25
+ .default('staging')
26
+ )
27
+ .action(async (options) => {
28
+ try {
29
+ await flushRemote(options);
30
+ } catch (error) {
31
+ console.error('❌ Error:', error.message);
32
+ process.exit(1);
33
+ }
34
+ });
35
+
36
+ cache
37
+ .command('flush-all')
38
+ .description('Clear all Laravel caches both locally and on a remote server')
39
+ .addOption(
40
+ new Option('-e, --environment [environment]', 'Environment')
41
+ .choices(['staging', 'production'])
42
+ .default('staging')
43
+ )
44
+ .action(async (options) => {
45
+ try {
46
+ await flushAll(options);
47
+ } catch (error) {
48
+ console.error('❌ Error:', error.message);
49
+ process.exit(1);
50
+ }
51
+ });
52
+ };
@@ -0,0 +1,105 @@
1
+ import { Option } from 'commander';
2
+ import {
3
+ remoteDownload,
4
+ dbLocalImport,
5
+ dbLocalExport,
6
+ remoteImport,
7
+ listDatabases,
8
+ } from '../../src/database.js';
9
+
10
+ export default (program) => {
11
+ const database = program
12
+ .command('database')
13
+ .description('Database operations');
14
+
15
+ database
16
+ .command('remote-export')
17
+ .description('Export database from remote server and download locally')
18
+ .addOption(
19
+ new Option('-e, --environment [environment]', 'Environment')
20
+ .choices(['staging', 'production'])
21
+ .default('staging')
22
+ )
23
+ .addOption(new Option('-n, --name [name]', 'Custom filename'))
24
+ .addOption(new Option('--ams', 'AMS mode').default(false))
25
+ .addOption(new Option('--dry-run', 'Preview actions without executing').default(false))
26
+ .action(async (options) => {
27
+ try {
28
+ await remoteDownload(options);
29
+ } catch (error) {
30
+ console.error('❌ Error:', error.message);
31
+ process.exit(1);
32
+ }
33
+ });
34
+
35
+ database
36
+ .command('local-import')
37
+ .description('Import a database dump into the local Docker environment')
38
+ .addOption(
39
+ new Option('-e, --environment [environment]', 'Environment')
40
+ .choices(['staging', 'production'])
41
+ .default('staging')
42
+ )
43
+ .addOption(new Option('--ams', 'AMS mode').default(false))
44
+ .addOption(new Option('--dry-run', 'Preview actions without executing').default(false))
45
+ .action(async (options) => {
46
+ try {
47
+ await dbLocalImport(options);
48
+ } catch (error) {
49
+ console.error('❌ Error:', error.message);
50
+ process.exit(1);
51
+ }
52
+ });
53
+
54
+ database
55
+ .command('local-export')
56
+ .description('Export database from the local Docker environment')
57
+ .addOption(new Option('-n, --name [name]', 'Custom filename'))
58
+ .addOption(new Option('--ams', 'AMS mode').default(false))
59
+ .addOption(new Option('--dry-run', 'Preview actions without executing').default(false))
60
+ .action(async (options) => {
61
+ try {
62
+ await dbLocalExport(options);
63
+ } catch (error) {
64
+ console.error('❌ Error:', error.message);
65
+ process.exit(1);
66
+ }
67
+ });
68
+
69
+ database
70
+ .command('remote-import')
71
+ .description('Upload and import a database dump to a remote server')
72
+ .addOption(
73
+ new Option('-e, --environment [environment]', 'Environment')
74
+ .choices(['staging', 'production'])
75
+ .default('staging')
76
+ )
77
+ .addOption(new Option('--ams', 'AMS mode').default(false))
78
+ .addOption(new Option('--dry-run', 'Preview actions without executing').default(false))
79
+ .action(async (options) => {
80
+ try {
81
+ await remoteImport(options);
82
+ } catch (error) {
83
+ console.error('❌ Error:', error.message);
84
+ process.exit(1);
85
+ }
86
+ });
87
+
88
+ database
89
+ .command('list')
90
+ .description('List available local database dumps')
91
+ .addOption(
92
+ new Option('-e, --environment [environment]', 'Environment').choices([
93
+ 'staging',
94
+ 'production',
95
+ ])
96
+ )
97
+ .action(async (options) => {
98
+ try {
99
+ await listDatabases(options);
100
+ } catch (error) {
101
+ console.error('❌ Error:', error.message);
102
+ process.exit(1);
103
+ }
104
+ });
105
+ };