@followthecode/cli 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +491 -0
- package/bin/ftc.js +94 -0
- package/bin/linux-x64/ftc.cli +0 -0
- package/bin/osx-x64/ftc.cli +0 -0
- package/bin/win-x64/ftc.cli.exe +0 -0
- package/package.json +73 -0
package/README.md
ADDED
|
@@ -0,0 +1,491 @@
|
|
|
1
|
+
# FTC CLI - Ferramenta de Análise de Repositórios Git
|
|
2
|
+
|
|
3
|
+
Ferramenta de linha de comando (CLI) para análise de repositórios Git, desenvolvida seguindo a arquitetura Vertical Slice do projeto FTC.
|
|
4
|
+
|
|
5
|
+
## Funcionalidades
|
|
6
|
+
|
|
7
|
+
- ✅ Total de commits no repositório
|
|
8
|
+
- ✅ Lista de autores e quantidade de commits por autor
|
|
9
|
+
- ✅ Número total de arquivos alterados
|
|
10
|
+
- ✅ Lista dos arquivos alterados com quantidade de alterações (adições/remoções)
|
|
11
|
+
- ✅ Relatório resumido com datas dos primeiros e últimos commits
|
|
12
|
+
- ✅ **Suporte a repositórios remotos** (clona automaticamente)
|
|
13
|
+
- ✅ Filtros por data (--startDate e --endDate)
|
|
14
|
+
- ✅ Exportação em JSON (--json)
|
|
15
|
+
- ✅ **Exportação em CSV detalhado** (--csv) com informações por commit
|
|
16
|
+
- ✅ **Tratamento robusto de erros** com mensagens claras
|
|
17
|
+
- ✅ **Testes automatizados** para validação de funcionalidades
|
|
18
|
+
- ✅ **Suporte a Docker** para execução em containers
|
|
19
|
+
- ✅ **Uso como ferramenta global (dotnet tool)**
|
|
20
|
+
|
|
21
|
+
## Simulando/Executando localmente via Docker CLI
|
|
22
|
+
|
|
23
|
+
Você pode rodar o FTC CLI via Docker em ambiente local, sem scripts auxiliares, seguindo estes passos:
|
|
24
|
+
|
|
25
|
+
### 1. Build da imagem Docker localmente
|
|
26
|
+
|
|
27
|
+
No diretório do projeto (onde está o Dockerfile):
|
|
28
|
+
|
|
29
|
+
```sh
|
|
30
|
+
docker build -t ftc:latest .
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
### 2. Executar a CLI com repositório local
|
|
34
|
+
|
|
35
|
+
Supondo que você tenha um repositório local em uma pasta chamada `meu-repo` no seu diretório atual:
|
|
36
|
+
|
|
37
|
+
#### Linux/macOS
|
|
38
|
+
```sh
|
|
39
|
+
docker run --rm -v "$PWD:/repo" ftc:latest collect code "/repo/meu-repo" --json
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
#### Windows (cmd/powershell)
|
|
43
|
+
```bat
|
|
44
|
+
docker run --rm -v "%cd%:/repo" ftc:latest collect code "/repo/meu-repo" --json
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
- O volume `-v "$PWD:/repo"` (ou `%cd%:/repo` no Windows) faz com que a pasta atual do host seja montada como `/repo` dentro do container.
|
|
48
|
+
- O parâmetro `collect code "/repo/meu-repo"` aponta para o caminho do repositório dentro do container.
|
|
49
|
+
|
|
50
|
+
### 3. Executar a CLI com repositório remoto
|
|
51
|
+
|
|
52
|
+
Você não precisa mapear volumes para repositórios remotos:
|
|
53
|
+
|
|
54
|
+
```sh
|
|
55
|
+
docker run --rm ftc:latest collect code "https://github.com/usuario/repositorio.git" --json
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
### 4. Exemplo com filtros de data
|
|
59
|
+
|
|
60
|
+
```sh
|
|
61
|
+
docker run --rm -v "$PWD:/repo" ftc:latest collect code "/repo/meu-repo" --startDate 2024-01-01 --endDate 2024-12-31 --json
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
### 5. Ver ajuda da CLI
|
|
65
|
+
|
|
66
|
+
```sh
|
|
67
|
+
docker run --rm ftc:latest --help
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
> **Resumo:**
|
|
71
|
+
> - Sempre use `-v "$PWD:/repo"` (Linux/macOS) ou `-v "%cd%:/repo"` (Windows) para acessar repositórios locais.
|
|
72
|
+
> - O caminho passado para `code` deve ser o caminho dentro do container, por exemplo, `"/repo/meu-repo"`.
|
|
73
|
+
> - Para repositórios remotos, basta passar a URL.
|
|
74
|
+
|
|
75
|
+
## Uso moderno via Docker CLI
|
|
76
|
+
|
|
77
|
+
Execute diretamente, sem scripts auxiliares:
|
|
78
|
+
|
|
79
|
+
### Linux/macOS
|
|
80
|
+
```sh
|
|
81
|
+
docker run --rm -v "$PWD:/repo" ftc:latest collect code "/repo/meu-repo" --json
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
### Windows (cmd/powershell)
|
|
85
|
+
```bat
|
|
86
|
+
docker run --rm -v "%cd%:/repo" ftc:latest collect code "/repo/meu-repo" --json
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
### Repositório remoto
|
|
90
|
+
```sh
|
|
91
|
+
docker run --rm ftc:latest collect code "https://github.com/usuario/repositorio.git" --json
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
### Com filtros de data
|
|
95
|
+
```sh
|
|
96
|
+
docker run --rm -v "$PWD:/repo" ftc:latest collect code "/repo/meu-repo" --startDate 2024-01-01 --endDate 2024-12-31 --json
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
> **Dica:**
|
|
100
|
+
> - O volume `-v "$PWD:/repo"` (ou `%cd%:/repo` no Windows) permite que o container acesse seu repositório local.
|
|
101
|
+
> - O comando `code "/repo/meu-repo"` deve apontar para o caminho dentro do container.
|
|
102
|
+
|
|
103
|
+
## Uso como ferramenta global (dotnet tool)
|
|
104
|
+
|
|
105
|
+
Após instalar:
|
|
106
|
+
|
|
107
|
+
```sh
|
|
108
|
+
dotnet tool install --global --add-source ./bin/Release ftc.cli
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
Execute de qualquer lugar:
|
|
112
|
+
|
|
113
|
+
```sh
|
|
114
|
+
ftc collect code "./caminho/para/meu-repo" --json
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
Exemplo com repositório remoto e filtros:
|
|
118
|
+
|
|
119
|
+
```sh
|
|
120
|
+
ftc collect code "https://github.com/usuario/repositorio.git" --startDate 2024-01-01 --endDate 2024-12-31 --json
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
Para ajuda:
|
|
124
|
+
|
|
125
|
+
```sh
|
|
126
|
+
ftc --help
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
## Uso
|
|
130
|
+
|
|
131
|
+
### Execução Local
|
|
132
|
+
|
|
133
|
+
#### Análise de repositório local
|
|
134
|
+
```bash
|
|
135
|
+
dotnet run -- collect code /caminho/para/repositorio
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
#### Análise de repositório remoto
|
|
139
|
+
```bash
|
|
140
|
+
dotnet run -- collect code https://github.com/usuario/repositorio.git
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
#### Com filtros de data
|
|
144
|
+
```bash
|
|
145
|
+
dotnet run -- collect code /caminho/para/repositorio --startDate 2024-01-01 --endDate 2024-12-31
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
#### Exportação em JSON
|
|
149
|
+
```bash
|
|
150
|
+
dotnet run -- collect code /caminho/para/repositorio --json
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
#### Exportação em CSV detalhado
|
|
154
|
+
```bash
|
|
155
|
+
dotnet run -- collect code /caminho/para/repositorio --csv
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
#### Exportação para S3
|
|
159
|
+
```bash
|
|
160
|
+
dotnet run -- collect code /caminho/para/repositorio --csv --export s3
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
### Execução com Docker
|
|
164
|
+
|
|
165
|
+
#### Construir e executar
|
|
166
|
+
```bash
|
|
167
|
+
# Linux/macOS
|
|
168
|
+
./scripts/docker-run.sh collect code /caminho/para/repositorio
|
|
169
|
+
|
|
170
|
+
# Windows
|
|
171
|
+
scripts\docker-run.bat collect code C:\caminho\para\repositorio
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
#### Análise de repositório remoto
|
|
175
|
+
```bash
|
|
176
|
+
# Linux/macOS
|
|
177
|
+
./scripts/docker-run.sh collect code https://github.com/usuario/repositorio.git
|
|
178
|
+
|
|
179
|
+
# Windows
|
|
180
|
+
scripts\docker-run.bat collect code https://github.com/usuario/repositorio.git
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
#### Com filtros e JSON
|
|
184
|
+
```bash
|
|
185
|
+
# Linux/macOS
|
|
186
|
+
./scripts/docker-run.sh collect code /caminho/para/repositorio --startDate 2024-01-01 --json
|
|
187
|
+
|
|
188
|
+
# Windows
|
|
189
|
+
scripts\docker-run.bat collect code C:\caminho\para\repositorio --startDate 2024-01-01 --json
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
#### Opções do Docker Runner
|
|
193
|
+
```bash
|
|
194
|
+
# Mostrar ajuda
|
|
195
|
+
./scripts/docker-run.sh --help
|
|
196
|
+
|
|
197
|
+
# Reconstruir imagem
|
|
198
|
+
./scripts/docker-run.sh --build collect code /caminho/para/repositorio
|
|
199
|
+
|
|
200
|
+
# Limpar containers
|
|
201
|
+
./scripts/docker-run.sh --clean
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
#### Execução direta com Docker
|
|
205
|
+
```bash
|
|
206
|
+
# Construir imagem
|
|
207
|
+
docker-compose build
|
|
208
|
+
|
|
209
|
+
# Executar CLI
|
|
210
|
+
docker-compose run --rm ftc collect code /caminho/para/repositorio
|
|
211
|
+
|
|
212
|
+
# Executar com volumes mapeados
|
|
213
|
+
docker run --rm -v $(pwd)/repos:/repos:ro ftc:latest collect code /repos/meu-projeto
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
## Opções
|
|
217
|
+
|
|
218
|
+
- `collect`: Comando para coleta de dados
|
|
219
|
+
- `code`: Caminho local ou URL do repositório Git (obrigatório)
|
|
220
|
+
- `--startDate`: Data inicial no formato yyyy-MM-dd (opcional)
|
|
221
|
+
- `--endDate`: Data final no formato yyyy-MM-dd (opcional)
|
|
222
|
+
- `--json`: Exportar resultado em formato JSON (opcional)
|
|
223
|
+
- `--csv`: Exportar resultado em formato CSV detalhado (opcional)
|
|
224
|
+
- `--export`: Destino de exportação: local:/caminho/arquivo.json ou s3 (opcional)
|
|
225
|
+
|
|
226
|
+
## Repositórios Suportados
|
|
227
|
+
|
|
228
|
+
### Locais
|
|
229
|
+
- Caminhos absolutos: `C:\caminho\para\repositorio`
|
|
230
|
+
- Caminhos relativos: `./repositorio`, `../repositorio`
|
|
231
|
+
|
|
232
|
+
### Remotos
|
|
233
|
+
- HTTPS: `https://github.com/usuario/repositorio.git`
|
|
234
|
+
- HTTP: `http://github.com/usuario/repositorio.git`
|
|
235
|
+
- SSH: `git@github.com/usuario/repositorio.git`
|
|
236
|
+
- Git: `git://github.com/usuario/repositorio.git`
|
|
237
|
+
|
|
238
|
+
## Exemplo de Saída
|
|
239
|
+
|
|
240
|
+
### Formato padrão
|
|
241
|
+
```
|
|
242
|
+
Analisando repositório: https://github.com/usuario/repositorio.git
|
|
243
|
+
Tipo: Remoto
|
|
244
|
+
Clonando repositório: https://github.com/usuario/repositorio.git
|
|
245
|
+
Pasta temporária: C:\Users\usuario\AppData\Local\Temp\ftc-cli-12345678-1234-1234-1234-123456789abc
|
|
246
|
+
Repositório clonado com sucesso.
|
|
247
|
+
|
|
248
|
+
📊 Total de commits: 150
|
|
249
|
+
|
|
250
|
+
👥 Autores:
|
|
251
|
+
• João Silva <joao@exemplo.com>: 45 commits
|
|
252
|
+
• Maria Santos <maria@exemplo.com>: 38 commits
|
|
253
|
+
• Pedro Oliveira <pedro@exemplo.com>: 27 commits
|
|
254
|
+
|
|
255
|
+
📁 Total de arquivos alterados: 89
|
|
256
|
+
📄 Arquivos alterados:
|
|
257
|
+
• src/Program.cs: +120 -45
|
|
258
|
+
• src/Models.cs: +89 -12
|
|
259
|
+
• README.md: +15 -3
|
|
260
|
+
... e mais 86 arquivos
|
|
261
|
+
|
|
262
|
+
📅 Primeiro commit: 2024-01-15 10:30:00
|
|
263
|
+
📅 Último commit: 2024-12-20 16:45:30
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
### Formato JSON
|
|
267
|
+
```json
|
|
268
|
+
{
|
|
269
|
+
"totalCommits": 150,
|
|
270
|
+
"authors": [
|
|
271
|
+
{
|
|
272
|
+
"name": "João Silva",
|
|
273
|
+
"email": "joao@exemplo.com",
|
|
274
|
+
"commits": 45
|
|
275
|
+
}
|
|
276
|
+
],
|
|
277
|
+
"totalFilesChanged": 89,
|
|
278
|
+
"files": [
|
|
279
|
+
{
|
|
280
|
+
"filePath": "src/Program.cs",
|
|
281
|
+
"additions": 120,
|
|
282
|
+
"deletions": 45
|
|
283
|
+
}
|
|
284
|
+
],
|
|
285
|
+
"firstCommitDate": "2024-01-15T10:30:00+00:00",
|
|
286
|
+
"lastCommitDate": "2024-12-20T16:45:30+00:00"
|
|
287
|
+
}
|
|
288
|
+
```
|
|
289
|
+
|
|
290
|
+
### Formato CSV
|
|
291
|
+
```csv
|
|
292
|
+
nomeRepositorio;idRepositorio;dataCommit;idCommit;nomeAutor;emailAutor;nomeArquivo;caminhoArquivo;linhasAdicionadas;linhasRemovidas
|
|
293
|
+
meu-repo;abc123;2024-01-15 10:30:00;def456;João Silva;joao@exemplo.com;Program.cs;src/Program.cs;120;45
|
|
294
|
+
meu-repo;abc123;2024-01-15 10:30:00;def456;João Silva;joao@exemplo.com;Models.cs;src/Models.cs;89;12
|
|
295
|
+
meu-repo;abc123;2024-01-16 14:20:00;ghi789;Maria Santos;maria@exemplo.com;README.md;README.md;15;3
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
O formato CSV inclui:
|
|
299
|
+
- **nomeRepositorio**: Nome do repositório
|
|
300
|
+
- **idRepositorio**: ID do repositório (SHA do HEAD)
|
|
301
|
+
- **dataCommit**: Data e hora do commit
|
|
302
|
+
- **idCommit**: SHA do commit
|
|
303
|
+
- **nomeAutor**: Nome do autor do commit
|
|
304
|
+
- **emailAutor**: Email do autor do commit
|
|
305
|
+
- **nomeArquivo**: Nome do arquivo alterado
|
|
306
|
+
- **caminhoArquivo**: Caminho completo do arquivo
|
|
307
|
+
- **linhasAdicionadas**: Número de linhas adicionadas
|
|
308
|
+
- **linhasRemovidas**: Número de linhas removidas
|
|
309
|
+
|
|
310
|
+
## Tratamento de Erros
|
|
311
|
+
|
|
312
|
+
A CLI fornece mensagens de erro claras e específicas:
|
|
313
|
+
|
|
314
|
+
- **Repositório não encontrado**: Verifica se o caminho existe
|
|
315
|
+
- **Repositório Git inválido**: Valida se é um repositório Git válido
|
|
316
|
+
- **Sem commits**: Verifica se há commits para análise
|
|
317
|
+
- **Período sem commits**: Avisa quando não há commits no período especificado
|
|
318
|
+
- **Datas inválidas**: Valida formato e ordem das datas
|
|
319
|
+
- **Erro de clonagem**: Trata falhas na clonagem de repositórios remotos
|
|
320
|
+
|
|
321
|
+
## Arquitetura
|
|
322
|
+
|
|
323
|
+
O projeto segue a arquitetura Vertical Slice do FTC:
|
|
324
|
+
|
|
325
|
+
```
|
|
326
|
+
Features/
|
|
327
|
+
└── AnalyzeRepository/
|
|
328
|
+
├── Models.cs # Request/Response records
|
|
329
|
+
└── AnalyzeRepositorySlice.cs # Lógica de análise
|
|
330
|
+
|
|
331
|
+
Common/
|
|
332
|
+
└── RepositoryUtils.cs # Utilitários para repositórios
|
|
333
|
+
|
|
334
|
+
scripts/
|
|
335
|
+
├── docker-run.sh # Script Linux/macOS
|
|
336
|
+
└── docker-run.bat # Script Windows
|
|
337
|
+
```
|
|
338
|
+
|
|
339
|
+
## Docker
|
|
340
|
+
|
|
341
|
+
### Estrutura Docker
|
|
342
|
+
```
|
|
343
|
+
Dockerfile # Multi-stage build otimizado
|
|
344
|
+
.dockerignore # Exclusões para build
|
|
345
|
+
docker-compose.yml # Configuração do container
|
|
346
|
+
scripts/
|
|
347
|
+
├── docker-run.sh # Script Linux/macOS
|
|
348
|
+
└── docker-run.bat # Script Windows
|
|
349
|
+
```
|
|
350
|
+
|
|
351
|
+
### Características da Imagem
|
|
352
|
+
- **Multi-stage build**: Otimiza tamanho da imagem
|
|
353
|
+
- **Runtime .NET 8**: Imagem base leve
|
|
354
|
+
- **Git instalado**: Suporte a repositórios remotos
|
|
355
|
+
- **Volumes mapeados**: Acesso a repositórios locais
|
|
356
|
+
- **Timezone configurado**: America/Sao_Paulo
|
|
357
|
+
|
|
358
|
+
### Volumes Docker
|
|
359
|
+
- `./repos:/repos:ro`: Mapeia repositórios locais (somente leitura)
|
|
360
|
+
- `./temp:/tmp/ftc-cli`: Pasta temporária para persistência
|
|
361
|
+
|
|
362
|
+
## Testes
|
|
363
|
+
|
|
364
|
+
O projeto inclui testes automatizados para validação de funcionalidades:
|
|
365
|
+
|
|
366
|
+
```bash
|
|
367
|
+
# Executar todos os testes
|
|
368
|
+
dotnet test ../../ftc.cli.tests
|
|
369
|
+
|
|
370
|
+
# Executar testes específicos
|
|
371
|
+
dotnet test ../../ftc.cli.tests --filter "IsRemoteRepository"
|
|
372
|
+
```
|
|
373
|
+
|
|
374
|
+
### Cobertura de Testes
|
|
375
|
+
- ✅ Detecção de repositórios remotos vs locais
|
|
376
|
+
- ✅ Validação de URLs HTTPS, HTTP, SSH, Git
|
|
377
|
+
- ✅ Validação de caminhos locais e relativos
|
|
378
|
+
|
|
379
|
+
## Dependências
|
|
380
|
+
|
|
381
|
+
- **System.CommandLine**: Para parsing de argumentos da CLI
|
|
382
|
+
- **LibGit2Sharp**: Para análise de repositórios Git
|
|
383
|
+
- **System.Text.Json**: Para serialização JSON
|
|
384
|
+
- **xUnit**: Para testes automatizados
|
|
385
|
+
- **Docker**: Para containerização
|
|
386
|
+
|
|
387
|
+
## Desenvolvimento
|
|
388
|
+
|
|
389
|
+
### Compilar
|
|
390
|
+
```bash
|
|
391
|
+
dotnet build
|
|
392
|
+
```
|
|
393
|
+
|
|
394
|
+
### Executar Localmente
|
|
395
|
+
```bash
|
|
396
|
+
dotnet run -- [argumentos]
|
|
397
|
+
```
|
|
398
|
+
|
|
399
|
+
### Executar com Docker
|
|
400
|
+
```bash
|
|
401
|
+
# Linux/macOS
|
|
402
|
+
./scripts/docker-run.sh [argumentos]
|
|
403
|
+
|
|
404
|
+
# Windows
|
|
405
|
+
scripts\docker-run.bat [argumentos]
|
|
406
|
+
```
|
|
407
|
+
|
|
408
|
+
### Testar
|
|
409
|
+
```bash
|
|
410
|
+
# Testar com um repositório local
|
|
411
|
+
dotnet run -- C:\caminho\para\repositorio
|
|
412
|
+
|
|
413
|
+
# Testar com repositório remoto
|
|
414
|
+
dotnet run -- https://github.com/usuario/repositorio.git
|
|
415
|
+
|
|
416
|
+
# Testar com filtros
|
|
417
|
+
dotnet run -- C:\caminho\para\repositorio --since 2024-01-01 --json
|
|
418
|
+
|
|
419
|
+
# Executar testes
|
|
420
|
+
dotnet test ../../ftc.cli.tests
|
|
421
|
+
|
|
422
|
+
# Testar com Docker
|
|
423
|
+
./scripts/docker-run.sh C:\caminho\para\repositorio
|
|
424
|
+
```
|
|
425
|
+
|
|
426
|
+
## Melhorias Implementadas
|
|
427
|
+
|
|
428
|
+
### ✅ Suporte a Repositórios Remotos
|
|
429
|
+
- Detecção automática de URLs vs caminhos locais
|
|
430
|
+
- Clonagem automática para pasta temporária
|
|
431
|
+
- Limpeza automática após análise
|
|
432
|
+
- Suporte a múltiplos protocolos (HTTPS, HTTP, SSH, Git)
|
|
433
|
+
|
|
434
|
+
### ✅ Testes Automatizados
|
|
435
|
+
- Testes unitários para detecção de repositórios
|
|
436
|
+
- Cobertura de diferentes tipos de URLs
|
|
437
|
+
- Validação de caminhos locais e relativos
|
|
438
|
+
- Integração com xUnit
|
|
439
|
+
|
|
440
|
+
### ✅ Tratamento Robusto de Erros
|
|
441
|
+
- Mensagens de erro específicas e úteis
|
|
442
|
+
- Validação de argumentos de entrada
|
|
443
|
+
- Verificação de repositórios válidos
|
|
444
|
+
- Tratamento de exceções com contexto
|
|
445
|
+
- Interface melhorada com emojis e formatação
|
|
446
|
+
|
|
447
|
+
### ✅ Suporte a Docker
|
|
448
|
+
- Multi-stage build otimizado
|
|
449
|
+
- Scripts para Linux/macOS e Windows
|
|
450
|
+
- Volumes mapeados para repositórios locais
|
|
451
|
+
- Configuração de timezone
|
|
452
|
+
- Docker Compose para facilitar uso
|
|
453
|
+
|
|
454
|
+
## Exportação de resultados (local e S3)
|
|
455
|
+
|
|
456
|
+
A CLI permite exportar o resultado da análise para um arquivo local ou diretamente para um bucket S3.
|
|
457
|
+
|
|
458
|
+
### Exportar JSON localmente
|
|
459
|
+
```sh
|
|
460
|
+
ftc code "./meu-repo" --json --export local:./resultado.json
|
|
461
|
+
```
|
|
462
|
+
|
|
463
|
+
### Exportar CSV localmente
|
|
464
|
+
```sh
|
|
465
|
+
ftc code "./meu-repo" --csv --export local:./resultado.csv
|
|
466
|
+
```
|
|
467
|
+
|
|
468
|
+
### Exportar para S3 (JSON)
|
|
469
|
+
```sh
|
|
470
|
+
ftc code "./meu-repo" --json --export s3
|
|
471
|
+
```
|
|
472
|
+
|
|
473
|
+
### Exportar para S3 (CSV)
|
|
474
|
+
```sh
|
|
475
|
+
ftc code "./meu-repo" --csv --export s3
|
|
476
|
+
```
|
|
477
|
+
|
|
478
|
+
### Exportar para S3 (bucket e key customizados)
|
|
479
|
+
```sh
|
|
480
|
+
ftc code "./meu-repo" --csv --export s3: --s3-bucket "meu-bucket"
|
|
481
|
+
```
|
|
482
|
+
|
|
483
|
+
### Exportar para S3 (bucket/key no próprio parâmetro)
|
|
484
|
+
```sh
|
|
485
|
+
ftc code "./meu-repo" --csv --export s3://meu-bucket/analises/resultado.csv
|
|
486
|
+
```
|
|
487
|
+
|
|
488
|
+
- Se `--s3-bucket` não for informado, será usado o bucket padrão `ftc-analyzer`.
|
|
489
|
+
- Para JSON: Se `--s3-key` não for informado, será usado o padrão `analises/<nome_repositorio>-ano-mes-dia.json`.
|
|
490
|
+
- Para CSV: Se `--s3-key` não for informado, será usado o padrão `analises/<nome_repositorio>-ano-mes-dia.csv`.
|
|
491
|
+
- O parâmetro `--s3-region` pode ser usado para especificar a região AWS.
|
package/bin/ftc.js
ADDED
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
const { spawn } = require('child_process');
|
|
4
|
+
const path = require('path');
|
|
5
|
+
const fs = require('fs');
|
|
6
|
+
|
|
7
|
+
// Detecta a plataforma e arquitetura
|
|
8
|
+
const platform = process.platform;
|
|
9
|
+
const arch = process.arch;
|
|
10
|
+
|
|
11
|
+
// Mapeia a plataforma para o diretório correto
|
|
12
|
+
const platformMap = {
|
|
13
|
+
'win32': 'win-x64',
|
|
14
|
+
'darwin': 'osx-x64', // macOS
|
|
15
|
+
'linux': 'linux-x64'
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
// Obtém o diretório da plataforma
|
|
19
|
+
const platformDir = platformMap[platform];
|
|
20
|
+
if (!platformDir) {
|
|
21
|
+
console.error('❌ Plataforma não suportada:', platform);
|
|
22
|
+
console.error('💡 Plataformas suportadas: Windows, macOS, Linux');
|
|
23
|
+
process.exit(1);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
// Define o nome do executável baseado na plataforma
|
|
27
|
+
const executableName = platform === 'win32' ? 'ftc.cli.exe' : 'ftc.cli';
|
|
28
|
+
const executablePath = path.join(__dirname, platformDir, executableName);
|
|
29
|
+
|
|
30
|
+
// Argumentos passados para o comando
|
|
31
|
+
const args = process.argv.slice(2);
|
|
32
|
+
|
|
33
|
+
// Se não há argumentos ou é --help, mostra o help customizado
|
|
34
|
+
if (args.length === 0 || args.includes('--help') || args.includes('-h')) {
|
|
35
|
+
console.log(`
|
|
36
|
+
🚀 Follow The Code CLI - Ferramenta de Análise de Repositórios Git
|
|
37
|
+
|
|
38
|
+
📋 USO:
|
|
39
|
+
ftc <comando> [opções]
|
|
40
|
+
|
|
41
|
+
📝 COMANDOS:
|
|
42
|
+
collect code <repo> Analisa um repositório Git e coleta dados
|
|
43
|
+
|
|
44
|
+
📊 OPÇÕES DE EXPORTAÇÃO:
|
|
45
|
+
--csv Exporta resultados em formato CSV
|
|
46
|
+
--json Exporta resultados em formato JSON
|
|
47
|
+
--export <destino> Define o destino da exportação
|
|
48
|
+
|
|
49
|
+
🎯 DESTINOS DE EXPORTAÇÃO:
|
|
50
|
+
local:<caminho> Salva arquivo local (ex: local:./output.csv)
|
|
51
|
+
s3:<bucket>/<key> Envia para AWS S3 (ex: s3:meu-bucket/resultado.csv)
|
|
52
|
+
|
|
53
|
+
📖 EXEMPLOS:
|
|
54
|
+
ftc collect code https://github.com/user/repo --csv --export local:./resultado.csv
|
|
55
|
+
ftc collect code https://github.com/user/repo --json --export s3:meu-bucket/analise.json
|
|
56
|
+
ftc collect code https://github.com/user/repo --csv
|
|
57
|
+
|
|
58
|
+
🔧 OPÇÕES GLOBAIS:
|
|
59
|
+
--help, -h Mostra esta ajuda
|
|
60
|
+
--version, -v Mostra a versão
|
|
61
|
+
|
|
62
|
+
🌍 PLATAFORMAS SUPORTADAS:
|
|
63
|
+
Windows (x64), macOS (x64), Linux (x64)
|
|
64
|
+
|
|
65
|
+
📚 MAIS INFORMAÇÕES:
|
|
66
|
+
Visite: https://github.com/your-org/follow-the-code
|
|
67
|
+
`);
|
|
68
|
+
process.exit(0);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// Verifica se o executável existe
|
|
72
|
+
if (!fs.existsSync(executablePath)) {
|
|
73
|
+
console.error('❌ Erro: Executável .NET não encontrado para', platform, 'em:', executablePath);
|
|
74
|
+
console.error('💡 Certifique-se de que o projeto foi compilado para todas as plataformas.');
|
|
75
|
+
process.exit(1);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// Executa o binário .NET
|
|
79
|
+
const executableDir = path.dirname(executablePath);
|
|
80
|
+
const child = spawn(executablePath, args, {
|
|
81
|
+
stdio: 'inherit',
|
|
82
|
+
cwd: executableDir
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
// Aguarda o processo terminar
|
|
86
|
+
child.on('close', (code) => {
|
|
87
|
+
process.exit(code);
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
// Trata erros
|
|
91
|
+
child.on('error', (error) => {
|
|
92
|
+
console.error('❌ Erro ao executar o CLI:', error.message);
|
|
93
|
+
process.exit(1);
|
|
94
|
+
});
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
package/package.json
ADDED
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@followthecode/cli",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "CLI tool for Git repository analysis and data collection",
|
|
5
|
+
"main": "index.js",
|
|
6
|
+
"license": "UNLICENSED",
|
|
7
|
+
"publishConfig": {
|
|
8
|
+
"access": "restricted"
|
|
9
|
+
},
|
|
10
|
+
"bin": {
|
|
11
|
+
"ftc": "./bin/ftc.js"
|
|
12
|
+
},
|
|
13
|
+
"scripts": {
|
|
14
|
+
"prepublishOnly": "npm run build",
|
|
15
|
+
"build": "npm run build:win && npm run build:mac && npm run build:linux",
|
|
16
|
+
"build:win": "dotnet publish ftc.cli.csproj -c Release -r win-x64 --self-contained true /p:PublishSingleFile=true -o ./bin/win-x64",
|
|
17
|
+
"build:mac": "dotnet publish ftc.cli.csproj -c Release -r osx-x64 --self-contained true /p:PublishSingleFile=true -o ./bin/osx-x64",
|
|
18
|
+
"build:linux": "dotnet publish ftc.cli.csproj -c Release -r linux-x64 --self-contained true /p:PublishSingleFile=true -o ./bin/linux-x64",
|
|
19
|
+
"test": "dotnet test",
|
|
20
|
+
"clean": "dotnet clean",
|
|
21
|
+
"publish:patch": "node scripts/publish.js --patch",
|
|
22
|
+
"publish:minor": "node scripts/publish.js --minor",
|
|
23
|
+
"publish:major": "node scripts/publish.js --major",
|
|
24
|
+
"publish:manual": "node scripts/publish.js"
|
|
25
|
+
},
|
|
26
|
+
"keywords": [
|
|
27
|
+
"git",
|
|
28
|
+
"analysis",
|
|
29
|
+
"repository",
|
|
30
|
+
"cli",
|
|
31
|
+
"follow-the-code",
|
|
32
|
+
"metrics",
|
|
33
|
+
"csv",
|
|
34
|
+
"json",
|
|
35
|
+
"s3"
|
|
36
|
+
],
|
|
37
|
+
"author": "Follow The Code Team",
|
|
38
|
+
"repository": {
|
|
39
|
+
"type": "git",
|
|
40
|
+
"url": "https://github.com/your-org/follow-the-code.git"
|
|
41
|
+
},
|
|
42
|
+
"bugs": {
|
|
43
|
+
"url": "https://github.com/your-org/follow-the-code/issues"
|
|
44
|
+
},
|
|
45
|
+
"homepage": "https://github.com/your-org/follow-the-code#readme",
|
|
46
|
+
"engines": {
|
|
47
|
+
"node": ">=14.0.0"
|
|
48
|
+
},
|
|
49
|
+
"os": [
|
|
50
|
+
"win32",
|
|
51
|
+
"darwin",
|
|
52
|
+
"linux"
|
|
53
|
+
],
|
|
54
|
+
"cpu": [
|
|
55
|
+
"x64",
|
|
56
|
+
"arm64"
|
|
57
|
+
],
|
|
58
|
+
"files": [
|
|
59
|
+
"bin/ftc.js",
|
|
60
|
+
"bin/win-x64/ftc.cli.exe",
|
|
61
|
+
"bin/osx-x64/ftc.cli",
|
|
62
|
+
"bin/linux-x64/ftc.cli",
|
|
63
|
+
"README.md",
|
|
64
|
+
"LICENSE"
|
|
65
|
+
],
|
|
66
|
+
"dependencies": {
|
|
67
|
+
"@followthecode/cli": "^1.0.1",
|
|
68
|
+
"node-fetch": "^3.3.0"
|
|
69
|
+
},
|
|
70
|
+
"devDependencies": {
|
|
71
|
+
"@types/node": "^18.0.0"
|
|
72
|
+
}
|
|
73
|
+
}
|