@followthecode/cli 1.2.40 → 1.2.43
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 +47 -118
- 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 +1 -1
package/README.md
CHANGED
|
@@ -52,7 +52,7 @@ docker run --rm -v "%cd%:/repo" ftc:latest collect code "/repo/meu-repo" --json
|
|
|
52
52
|
Você não precisa mapear volumes para repositórios remotos:
|
|
53
53
|
|
|
54
54
|
```sh
|
|
55
|
-
docker run --rm ftc:latest collect code "https://github.com/
|
|
55
|
+
docker run --rm ftc:latest collect code "https://github.com/exemplo/repositorio.git" --json
|
|
56
56
|
```
|
|
57
57
|
|
|
58
58
|
### 4. Exemplo com filtros de data
|
|
@@ -69,7 +69,7 @@ docker run --rm ftc:latest --help
|
|
|
69
69
|
|
|
70
70
|
> **Resumo:**
|
|
71
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"`.
|
|
72
|
+
> - O caminho passado para `collect code` deve ser o caminho dentro do container, por exemplo, `"/repo/meu-repo"`.
|
|
73
73
|
> - Para repositórios remotos, basta passar a URL.
|
|
74
74
|
|
|
75
75
|
## Uso moderno via Docker CLI
|
|
@@ -88,7 +88,7 @@ docker run --rm -v "%cd%:/repo" ftc:latest collect code "/repo/meu-repo" --json
|
|
|
88
88
|
|
|
89
89
|
### Repositório remoto
|
|
90
90
|
```sh
|
|
91
|
-
docker run --rm ftc:latest collect code "https://github.com/
|
|
91
|
+
docker run --rm ftc:latest collect code "https://github.com/exemplo/repositorio.git" --json
|
|
92
92
|
```
|
|
93
93
|
|
|
94
94
|
### Com filtros de data
|
|
@@ -107,7 +107,7 @@ Se você encontrar problemas durante a instalação do CLI, como:
|
|
|
107
107
|
- Erros de permissão EPERM no Windows
|
|
108
108
|
- Problemas de limpeza de cache
|
|
109
109
|
|
|
110
|
-
Consulte
|
|
110
|
+
Consulte a seção de troubleshooting abaixo.
|
|
111
111
|
|
|
112
112
|
### Solução Rápida para Windows
|
|
113
113
|
|
|
@@ -115,10 +115,10 @@ Execute o script de correção como Administrador:
|
|
|
115
115
|
|
|
116
116
|
```powershell
|
|
117
117
|
# Abrir PowerShell como Administrador
|
|
118
|
-
.\scripts\fix-
|
|
118
|
+
.\scripts\fix-permissions.ps1
|
|
119
119
|
|
|
120
120
|
# Ou com limpeza forçada
|
|
121
|
-
.\scripts\fix-
|
|
121
|
+
.\scripts\fix-permissions.ps1 -Force
|
|
122
122
|
```
|
|
123
123
|
|
|
124
124
|
## 🧪 Testando a Instalação
|
|
@@ -159,11 +159,11 @@ cd ..
|
|
|
159
159
|
|
|
160
160
|
# Testar funcionalidades
|
|
161
161
|
bin/ftc collect code ./test-repo --json
|
|
162
|
-
bin/ftc collect code https://github.com/
|
|
162
|
+
bin/ftc collect code https://github.com/exemplo/repositorio.git --json
|
|
163
163
|
```
|
|
164
164
|
|
|
165
|
-
Para mais detalhes, consulte
|
|
166
|
-
> - O comando `code "/repo/meu-repo"` deve apontar para o caminho dentro do container.
|
|
165
|
+
Para mais detalhes, consulte a seção de testes abaixo.
|
|
166
|
+
> - O comando `collect code "/repo/meu-repo"` deve apontar para o caminho dentro do container.
|
|
167
167
|
|
|
168
168
|
## Uso como ferramenta global (dotnet tool)
|
|
169
169
|
|
|
@@ -182,7 +182,7 @@ ftc collect code "./caminho/para/meu-repo" --json
|
|
|
182
182
|
Exemplo com repositório remoto e filtros:
|
|
183
183
|
|
|
184
184
|
```sh
|
|
185
|
-
ftc collect code "https://github.com/
|
|
185
|
+
ftc collect code "https://github.com/exemplo/repositorio.git" --startDate 2024-01-01 --endDate 2024-12-31 --json
|
|
186
186
|
```
|
|
187
187
|
|
|
188
188
|
Para ajuda:
|
|
@@ -202,7 +202,7 @@ dotnet run -- collect code /caminho/para/repositorio
|
|
|
202
202
|
|
|
203
203
|
#### Análise de repositório remoto
|
|
204
204
|
```bash
|
|
205
|
-
dotnet run -- collect code https://github.com/
|
|
205
|
+
dotnet run -- collect code https://github.com/exemplo/repositorio.git
|
|
206
206
|
```
|
|
207
207
|
|
|
208
208
|
#### Com filtros de data
|
|
@@ -239,19 +239,19 @@ scripts\docker-run.bat collect code C:\caminho\para\repositorio
|
|
|
239
239
|
#### Análise de repositório remoto
|
|
240
240
|
```bash
|
|
241
241
|
# Linux/macOS
|
|
242
|
-
./scripts/docker-run.sh collect code https://github.com/
|
|
242
|
+
./scripts/docker-run.sh collect code https://github.com/exemplo/repositorio.git
|
|
243
243
|
|
|
244
244
|
# Windows
|
|
245
|
-
scripts\docker-run.bat collect code https://github.com/
|
|
245
|
+
scripts\docker-run.bat collect code https://github.com/exemplo/repositorio.git
|
|
246
246
|
```
|
|
247
247
|
|
|
248
248
|
#### Com filtros e JSON
|
|
249
249
|
```bash
|
|
250
250
|
# Linux/macOS
|
|
251
|
-
./scripts/docker-run.sh
|
|
251
|
+
./scripts/docker-run.sh code /caminho/para/repositorio --startDate 2024-01-01 --json
|
|
252
252
|
|
|
253
253
|
# Windows
|
|
254
|
-
scripts\docker-run.bat
|
|
254
|
+
scripts\docker-run.bat code C:\caminho\para\repositorio --startDate 2024-01-01 --json
|
|
255
255
|
```
|
|
256
256
|
|
|
257
257
|
#### Opções do Docker Runner
|
|
@@ -295,27 +295,27 @@ docker run --rm -v $(pwd)/repos:/repos:ro ftc:latest collect code /repos/meu-pro
|
|
|
295
295
|
- Caminhos relativos: `./repositorio`, `../repositorio`
|
|
296
296
|
|
|
297
297
|
### Remotos
|
|
298
|
-
- HTTPS: `https://github.com/
|
|
299
|
-
- HTTP: `http://github.com/
|
|
300
|
-
- SSH: `git@github.com/
|
|
301
|
-
- Git: `git://github.com/
|
|
298
|
+
- HTTPS: `https://github.com/exemplo/repositorio.git`
|
|
299
|
+
- HTTP: `http://github.com/exemplo/repositorio.git`
|
|
300
|
+
- SSH: `git@github.com/exemplo/repositorio.git`
|
|
301
|
+
- Git: `git://github.com/exemplo/repositorio.git`
|
|
302
302
|
|
|
303
303
|
## Exemplo de Saída
|
|
304
304
|
|
|
305
305
|
### Formato padrão
|
|
306
306
|
```
|
|
307
|
-
Analisando repositório: https://github.com/
|
|
307
|
+
Analisando repositório: https://github.com/exemplo/repositorio.git
|
|
308
308
|
Tipo: Remoto
|
|
309
|
-
Clonando repositório: https://github.com/
|
|
310
|
-
Pasta temporária:
|
|
309
|
+
Clonando repositório: https://github.com/exemplo/repositorio.git
|
|
310
|
+
Pasta temporária: /tmp/ftc-cli-12345678-1234-1234-1234-123456789abc
|
|
311
311
|
Repositório clonado com sucesso.
|
|
312
312
|
|
|
313
313
|
📊 Total de commits: 150
|
|
314
314
|
|
|
315
315
|
👥 Autores:
|
|
316
|
-
•
|
|
317
|
-
•
|
|
318
|
-
•
|
|
316
|
+
• Desenvolvedor A <dev.a@exemplo.com>: 45 commits
|
|
317
|
+
• Desenvolvedor B <dev.b@exemplo.com>: 38 commits
|
|
318
|
+
• Desenvolvedor C <dev.c@exemplo.com>: 27 commits
|
|
319
319
|
|
|
320
320
|
📁 Total de arquivos alterados: 89
|
|
321
321
|
📄 Arquivos alterados:
|
|
@@ -334,8 +334,8 @@ Repositório clonado com sucesso.
|
|
|
334
334
|
"totalCommits": 150,
|
|
335
335
|
"authors": [
|
|
336
336
|
{
|
|
337
|
-
"name": "
|
|
338
|
-
"email": "
|
|
337
|
+
"name": "Desenvolvedor A",
|
|
338
|
+
"email": "dev.a@exemplo.com",
|
|
339
339
|
"commits": 45
|
|
340
340
|
}
|
|
341
341
|
],
|
|
@@ -355,9 +355,9 @@ Repositório clonado com sucesso.
|
|
|
355
355
|
### Formato CSV
|
|
356
356
|
```csv
|
|
357
357
|
nomeRepositorio;idRepositorio;dataCommit;idCommit;nomeAutor;emailAutor;nomeArquivo;caminhoArquivo;linhasAdicionadas;linhasRemovidas
|
|
358
|
-
meu-repo;abc123;2024-01-15 10:30:00;def456;
|
|
359
|
-
meu-repo;abc123;2024-01-15 10:30:00;def456;
|
|
360
|
-
meu-repo;abc123;2024-01-16 14:20:00;ghi789;
|
|
358
|
+
meu-repo;abc123;2024-01-15 10:30:00;def456;Desenvolvedor A;dev.a@exemplo.com;Program.cs;src/Program.cs;120;45
|
|
359
|
+
meu-repo;abc123;2024-01-15 10:30:00;def456;Desenvolvedor A;dev.a@exemplo.com;Models.cs;src/Models.cs;89;12
|
|
360
|
+
meu-repo;abc123;2024-01-16 14:20:00;ghi789;Desenvolvedor B;dev.b@exemplo.com;README.md;README.md;15;3
|
|
361
361
|
```
|
|
362
362
|
|
|
363
363
|
O formato CSV inclui:
|
|
@@ -385,21 +385,7 @@ A CLI fornece mensagens de erro claras e específicas:
|
|
|
385
385
|
|
|
386
386
|
## Arquitetura
|
|
387
387
|
|
|
388
|
-
O projeto segue a arquitetura Vertical Slice do FTC
|
|
389
|
-
|
|
390
|
-
```
|
|
391
|
-
Features/
|
|
392
|
-
└── AnalyzeRepository/
|
|
393
|
-
├── Models.cs # Request/Response records
|
|
394
|
-
└── AnalyzeRepositorySlice.cs # Lógica de análise
|
|
395
|
-
|
|
396
|
-
Common/
|
|
397
|
-
└── RepositoryUtils.cs # Utilitários para repositórios
|
|
398
|
-
|
|
399
|
-
scripts/
|
|
400
|
-
├── docker-run.sh # Script Linux/macOS
|
|
401
|
-
└── docker-run.bat # Script Windows
|
|
402
|
-
```
|
|
388
|
+
O projeto segue a arquitetura Vertical Slice do FTC, organizando funcionalidades em slices independentes com suas próprias responsabilidades.
|
|
403
389
|
|
|
404
390
|
## Docker
|
|
405
391
|
|
|
@@ -408,9 +394,6 @@ scripts/
|
|
|
408
394
|
Dockerfile # Multi-stage build otimizado
|
|
409
395
|
.dockerignore # Exclusões para build
|
|
410
396
|
docker-compose.yml # Configuração do container
|
|
411
|
-
scripts/
|
|
412
|
-
├── docker-run.sh # Script Linux/macOS
|
|
413
|
-
└── docker-run.bat # Script Windows
|
|
414
397
|
```
|
|
415
398
|
|
|
416
399
|
### Características da Imagem
|
|
@@ -418,11 +401,11 @@ scripts/
|
|
|
418
401
|
- **Runtime .NET 8**: Imagem base leve
|
|
419
402
|
- **Git instalado**: Suporte a repositórios remotos
|
|
420
403
|
- **Volumes mapeados**: Acesso a repositórios locais
|
|
421
|
-
- **Timezone configurado**:
|
|
404
|
+
- **Timezone configurado**: UTC
|
|
422
405
|
|
|
423
406
|
### Volumes Docker
|
|
424
407
|
- `./repos:/repos:ro`: Mapeia repositórios locais (somente leitura)
|
|
425
|
-
- `./temp:/tmp
|
|
408
|
+
- `./temp:/tmp`: Pasta temporária para persistência
|
|
426
409
|
|
|
427
410
|
## Testes
|
|
428
411
|
|
|
@@ -430,10 +413,10 @@ O projeto inclui testes automatizados para validação de funcionalidades:
|
|
|
430
413
|
|
|
431
414
|
```bash
|
|
432
415
|
# Executar todos os testes
|
|
433
|
-
dotnet test
|
|
416
|
+
dotnet test
|
|
434
417
|
|
|
435
418
|
# Executar testes específicos
|
|
436
|
-
dotnet test
|
|
419
|
+
dotnet test --filter "RepositoryTests"
|
|
437
420
|
```
|
|
438
421
|
|
|
439
422
|
### Cobertura de Testes
|
|
@@ -441,14 +424,6 @@ dotnet test ../../ftc.cli.tests --filter "IsRemoteRepository"
|
|
|
441
424
|
- ✅ Validação de URLs HTTPS, HTTP, SSH, Git
|
|
442
425
|
- ✅ Validação de caminhos locais e relativos
|
|
443
426
|
|
|
444
|
-
## Dependências
|
|
445
|
-
|
|
446
|
-
- **System.CommandLine**: Para parsing de argumentos da CLI
|
|
447
|
-
- **LibGit2Sharp**: Para análise de repositórios Git
|
|
448
|
-
- **System.Text.Json**: Para serialização JSON
|
|
449
|
-
- **xUnit**: Para testes automatizados
|
|
450
|
-
- **Docker**: Para containerização
|
|
451
|
-
|
|
452
427
|
## Desenvolvimento
|
|
453
428
|
|
|
454
429
|
### Compilar
|
|
@@ -473,19 +448,19 @@ scripts\docker-run.bat [argumentos]
|
|
|
473
448
|
### Testar
|
|
474
449
|
```bash
|
|
475
450
|
# Testar com um repositório local
|
|
476
|
-
dotnet run -- C:\caminho\para\repositorio
|
|
451
|
+
dotnet run -- collect code C:\caminho\para\repositorio
|
|
477
452
|
|
|
478
453
|
# Testar com repositório remoto
|
|
479
|
-
dotnet run -- https://github.com/
|
|
454
|
+
dotnet run -- collect code https://github.com/exemplo/repositorio.git
|
|
480
455
|
|
|
481
456
|
# Testar com filtros
|
|
482
|
-
dotnet run -- C:\caminho\para\repositorio --
|
|
457
|
+
dotnet run -- collect code C:\caminho\para\repositorio --startDate 2024-01-01 --endDate 2024-12-31 --json
|
|
483
458
|
|
|
484
459
|
# Executar testes
|
|
485
|
-
dotnet test
|
|
460
|
+
dotnet test
|
|
486
461
|
|
|
487
462
|
# Testar com Docker
|
|
488
|
-
./scripts/docker-run.sh C:\caminho\para\repositorio
|
|
463
|
+
./scripts/docker-run.sh collect code C:\caminho\para\repositorio
|
|
489
464
|
```
|
|
490
465
|
|
|
491
466
|
## Melhorias Implementadas
|
|
@@ -522,81 +497,35 @@ A CLI permite exportar o resultado da análise para um arquivo local ou diretame
|
|
|
522
497
|
|
|
523
498
|
### Exportar JSON localmente
|
|
524
499
|
```sh
|
|
525
|
-
ftc code "./meu-repo" --json --export local:./resultado.json
|
|
500
|
+
ftc collect code "./meu-repo" --json --export local:./resultado.json
|
|
526
501
|
```
|
|
527
502
|
|
|
528
503
|
### Exportar CSV localmente
|
|
529
504
|
```sh
|
|
530
|
-
ftc code "./meu-repo" --csv --export local:./resultado.csv
|
|
505
|
+
ftc collect code "./meu-repo" --csv --export local:./resultado.csv
|
|
531
506
|
```
|
|
532
507
|
|
|
533
508
|
### Exportar para S3 (JSON)
|
|
534
509
|
```sh
|
|
535
|
-
ftc code "./meu-repo" --json --export s3
|
|
510
|
+
ftc collect code "./meu-repo" --json --export s3
|
|
536
511
|
```
|
|
537
512
|
|
|
538
513
|
### Exportar para S3 (CSV)
|
|
539
514
|
```sh
|
|
540
|
-
ftc code "./meu-repo" --csv --export s3
|
|
515
|
+
ftc collect code "./meu-repo" --csv --export s3
|
|
541
516
|
```
|
|
542
517
|
|
|
543
518
|
### Exportar para S3 (bucket e key customizados)
|
|
544
519
|
```sh
|
|
545
|
-
ftc code "./meu-repo" --csv --export s3: --s3-bucket "meu-bucket"
|
|
520
|
+
ftc collect code "./meu-repo" --csv --export s3: --s3-bucket "meu-bucket"
|
|
546
521
|
```
|
|
547
522
|
|
|
548
523
|
### Exportar para S3 (bucket/key no próprio parâmetro)
|
|
549
524
|
```sh
|
|
550
|
-
ftc code "./meu-repo" --csv --export s3://meu-bucket/analises/resultado.csv
|
|
525
|
+
ftc collect code "./meu-repo" --csv --export s3://meu-bucket/analises/resultado.csv
|
|
551
526
|
```
|
|
552
527
|
|
|
553
|
-
- Se `--s3-bucket` não for informado, será usado o bucket padrão
|
|
528
|
+
- Se `--s3-bucket` não for informado, será usado o bucket padrão configurado.
|
|
554
529
|
- Para JSON: Se `--s3-key` não for informado, será usado o padrão `analises/<nome_repositorio>-ano-mes-dia.json`.
|
|
555
530
|
- Para CSV: Se `--s3-key` não for informado, será usado o padrão `analises/<nome_repositorio>-ano-mes-dia.csv`.
|
|
556
531
|
- O parâmetro `--s3-region` pode ser usado para especificar a região AWS.
|
|
557
|
-
|
|
558
|
-
## Exportação via API HTTP (x-apikey)
|
|
559
|
-
|
|
560
|
-
Agora é possível exportar arquivos diretamente para uma API HTTP utilizando o header `x-apikey`.
|
|
561
|
-
|
|
562
|
-
**Exemplo de configuração:**
|
|
563
|
-
|
|
564
|
-
```
|
|
565
|
-
api:https://sua-api.com/upload?apikey=SEU_API_KEY
|
|
566
|
-
```
|
|
567
|
-
|
|
568
|
-
- O arquivo será compactado (gzip) e enviado via POST para a URL informada.
|
|
569
|
-
- O header `x-apikey` será preenchido automaticamente com o valor fornecido.
|
|
570
|
-
- O header `x-provider` será enviado se especificado na URL.
|
|
571
|
-
- O conteúdo enviado será do tipo `application/octet-stream` com encoding `gzip`.
|
|
572
|
-
|
|
573
|
-
**Uso no código:**
|
|
574
|
-
|
|
575
|
-
```csharp
|
|
576
|
-
await ExportHelper.ExportDataAsync(
|
|
577
|
-
dados,
|
|
578
|
-
"api:https://sua-api.com/upload?apikey=SEU_API_KEY",
|
|
579
|
-
repoPath,
|
|
580
|
-
serviceProvider,
|
|
581
|
-
ExportFormat.Json
|
|
582
|
-
);
|
|
583
|
-
```
|
|
584
|
-
|
|
585
|
-
### Exemplo: Envio de arquivo compactado para o endpoint de commit-files
|
|
586
|
-
|
|
587
|
-
```
|
|
588
|
-
api:https://ftc-api.eximia.co/collect/commit-files?apikey=xpt-apikey&provider=Azure
|
|
589
|
-
```
|
|
590
|
-
|
|
591
|
-
- O arquivo será compactado (gzip) e enviado via POST.
|
|
592
|
-
- Headers enviados: x-apikey, x-provider
|
|
593
|
-
- Suporta CSV ou JSON.
|
|
594
|
-
- Formato: application/octet-stream com encoding gzip
|
|
595
|
-
|
|
596
|
-
### Exemplo: Consulta do last-sync via GET
|
|
597
|
-
|
|
598
|
-
```csharp
|
|
599
|
-
var client = new ApiKeyHttpGetClient(serviceProvider.GetRequiredService<IHttpClientFactory>(), "xpt-apikey");
|
|
600
|
-
var lastSync = await client.GetLastSyncAsync("https://ftc-api.eximia.co/collect/repositories/repo01/last-sync");
|
|
601
|
-
Console.WriteLine($"Última sincronização: {lastSync}");
|
|
602
|
-
```
|
package/bin/linux-x64/ftc.cli
CHANGED
|
Binary file
|
package/bin/osx-x64/ftc.cli
CHANGED
|
Binary file
|
package/bin/win-x64/ftc.cli.exe
CHANGED
|
Binary file
|