@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.
- package/.claude/settings.local.json +59 -0
- package/README.md +378 -0
- package/bin/groups/cache.js +52 -0
- package/bin/groups/database.js +105 -0
- package/bin/groups/forge.js +272 -0
- package/bin/groups/local.js +78 -0
- package/bin/groups/media.js +110 -0
- package/bin/tools.js +23 -0
- package/docs/Changelog.md +267 -0
- package/docs/TODO.md +167 -0
- package/docs/releases/release_0.0.1.md +116 -0
- package/docs/releases/release_0.0.2.md +88 -0
- package/docs/releases/release_0.0.3.md +58 -0
- package/docs/releases/release_0.0.4.md +128 -0
- package/docs/releases/release_0.0.5.md +77 -0
- package/docs/releases/release_0.0.6.md +80 -0
- package/docs/releases/release_1.0.0.md +61 -0
- package/docs/releases/release_1.0.1.md +18 -0
- package/docs/releases/release_1.0.2.md +18 -0
- package/docs/releases/release_1.0.3.md +19 -0
- package/docs/releases/release_1.1.0.md +18 -0
- package/docs/releases/release_1.1.1.md +17 -0
- package/docs/releases/release_1.1.2.md +18 -0
- package/docs/releases/release_1.1.3.md +21 -0
- package/docs/releases/release_1.1.4.md +18 -0
- package/docs/releases/release_1.1.5.md +18 -0
- package/docs/releases/release_1.1.6.md +21 -0
- package/docs/releases/release_1.1.7.md +17 -0
- package/docs/releases/release_2.0.0.md +192 -0
- package/docs/releases/release_2.0.1.md +53 -0
- package/docs/releases/release_2.0.2.md +55 -0
- package/docs/releases/release_2.0.3.md +69 -0
- package/docs/releases/release_2.1.0.md +59 -0
- package/docs/releases/release_2.2.0.md +83 -0
- package/docs/releases/release_2.2.1.md +36 -0
- package/docs/releases/release_2.2.2.md +57 -0
- package/docs/releases/release_2.2.3.md +39 -0
- package/docs/releases/release_2.2.4.md +75 -0
- package/docs/releases/release_2.2.5.md +69 -0
- package/docs/releases/release_3.0.0.md +87 -0
- package/docs/releases/release_3.0.1.md +65 -0
- package/docs/releases/release_3.1.0.md +90 -0
- package/docs/releases/release_3.2.0.md +74 -0
- package/docs/releases/release_3.3.0.md +72 -0
- package/package.json +35 -0
- package/src/aws/bucket.js +287 -0
- package/src/aws/cloudfront.js +433 -0
- package/src/aws/config.js +39 -0
- package/src/aws/iam.js +189 -0
- package/src/cache.js +49 -0
- package/src/database.js +315 -0
- package/src/forge/client.js +43 -0
- package/src/forge/config.js +33 -0
- package/src/forge/provisioning.js +191 -0
- package/src/forge/servers.js +27 -0
- package/src/forge/sites.js +93 -0
- package/src/google/groupMembers.js +35 -0
- package/src/google/utilities.js +39 -0
- package/src/local/doctor.js +214 -0
- package/src/local/setup.js +398 -0
- package/src/media.js +143 -0
- package/src/stub/docker/mysql/my.cnf +6 -0
- package/src/stub/docker/php/local.ini +4 -0
- package/src/stub/docker/traefik/dynamic_conf.yml +4 -0
- package/src/stub/docker/traefik/traefik.yml +24 -0
- package/src/stub/docker-compose/php8.0/docker-compose.yml +78 -0
- package/src/stub/docker-compose/php8.1/docker-compose.yml +78 -0
- package/src/stub/docker-compose/php8.2/docker-compose.yml +78 -0
- package/src/stub/docker-compose/php8.3/docker-compose.yml +78 -0
- package/src/stub/docker-compose/php8.4/docker-compose.yml +78 -0
- package/src/stub/docker-compose.yml +78 -0
- package/src/utilities/command.js +137 -0
- package/src/utilities/dateUtils.js +7 -0
- package/src/utilities/fileUtils.js +36 -0
- package/src/utilities/google-drive.js +69 -0
- package/src/utilities/pathUtils.js +15 -0
- package/src/utilities/userInput.js +28 -0
- 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
|
+
};
|