@followthecode/cli 1.1.8 → 1.1.9

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.
@@ -0,0 +1,143 @@
1
+ # 🔧 Troubleshooting - Problemas com Node.js no Linux
2
+
3
+ ## ❌ Erro: `node: not found`
4
+
5
+ Se você está recebendo o erro `node: not found` após instalar o FTC CLI no Linux, isso significa que o Node.js não está instalado ou não está no PATH do sistema.
6
+
7
+ ## 🔍 Diagnóstico
8
+
9
+ ### 1. Verificar se o Node.js está instalado:
10
+ ```bash
11
+ node --version
12
+ npm --version
13
+ ```
14
+
15
+ ### 2. Se o Node.js não estiver instalado:
16
+
17
+ #### Opção A: Instalar via NodeSource (Recomendado)
18
+ ```bash
19
+ # Para Ubuntu/Debian
20
+ curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo -E bash -
21
+ sudo apt-get install -y nodejs
22
+
23
+ # Para CentOS/RHEL/Fedora
24
+ curl -fsSL https://rpm.nodesource.com/setup_lts.x | sudo bash -
25
+ sudo yum install -y nodejs
26
+ ```
27
+
28
+ #### Opção B: Instalar via Snap
29
+ ```bash
30
+ sudo snap install node --classic
31
+ ```
32
+
33
+ #### Opção C: Instalar via NVM (Node Version Manager)
34
+ ```bash
35
+ curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash
36
+ source ~/.bashrc
37
+ nvm install --lts
38
+ nvm use --lts
39
+ ```
40
+
41
+ ### 3. Verificar o PATH:
42
+ ```bash
43
+ echo $PATH
44
+ which node
45
+ ```
46
+
47
+ ## 🛠️ Soluções Alternativas
48
+
49
+ ### Solução 1: Usar o Wrapper Shell (Recomendado para Linux sem Node.js)
50
+
51
+ O FTC CLI agora inclui um wrapper shell script que não depende do Node.js:
52
+
53
+ ```bash
54
+ # Execute diretamente o wrapper shell
55
+ ftc --help
56
+
57
+ # Ou use o comando alternativo
58
+ ftc-linux --help
59
+ ```
60
+
61
+ ### Solução 2: Instalar Node.js apenas para o usuário atual
62
+
63
+ Se você não tem permissões de administrador:
64
+
65
+ ```bash
66
+ # Baixar e instalar Node.js localmente
67
+ mkdir ~/.nodejs
68
+ cd ~/.nodejs
69
+ wget https://nodejs.org/dist/v18.17.0/node-v18.17.0-linux-x64.tar.xz
70
+ tar -xf node-v18.17.0-linux-x64.tar.xz
71
+ echo 'export PATH="$HOME/.nodejs/node-v18.17.0-linux-x64/bin:$PATH"' >> ~/.bashrc
72
+ source ~/.bashrc
73
+ ```
74
+
75
+ ### Solução 3: Usar o binário .NET diretamente
76
+
77
+ Se nenhuma das opções acima funcionar, você pode executar o binário .NET diretamente:
78
+
79
+ ```bash
80
+ # Navegar para o diretório de instalação
81
+ cd /usr/local/lib/node_modules/@followthecode/cli/bin/linux-x64
82
+
83
+ # Executar diretamente
84
+ ./ftc.cli --help
85
+ ```
86
+
87
+ ## 🔧 Configuração Automática
88
+
89
+ O FTC CLI agora detecta automaticamente qual wrapper usar:
90
+
91
+ ```bash
92
+ # Reinstalar o pacote para executar a configuração automática
93
+ npm uninstall -g @followthecode/cli
94
+ npm install -g @followthecode/cli
95
+ ```
96
+
97
+ ## 📋 Verificação
98
+
99
+ Após a instalação, verifique se está funcionando:
100
+
101
+ ```bash
102
+ # Verificar se o comando está disponível
103
+ which ftc
104
+
105
+ # Testar o comando
106
+ ftc --help
107
+
108
+ # Verificar a versão
109
+ ftc --version
110
+ ```
111
+
112
+ ## 🆘 Ainda com Problemas?
113
+
114
+ Se você ainda está enfrentando problemas:
115
+
116
+ 1. **Verifique as permissões**:
117
+ ```bash
118
+ ls -la $(which ftc)
119
+ chmod +x $(which ftc)
120
+ ```
121
+
122
+ 2. **Reinstale o pacote**:
123
+ ```bash
124
+ npm uninstall -g @followthecode/cli
125
+ npm cache clean --force
126
+ npm install -g @followthecode/cli
127
+ ```
128
+
129
+ 3. **Execute o script de configuração manualmente**:
130
+ ```bash
131
+ cd /usr/local/lib/node_modules/@followthecode/cli
132
+ node scripts/install-wrapper.js
133
+ ```
134
+
135
+ ## 📞 Suporte
136
+
137
+ Se nenhuma das soluções acima funcionar, abra uma issue no repositório do projeto com:
138
+
139
+ - Sistema operacional e versão
140
+ - Saída do comando `node --version`
141
+ - Saída do comando `npm --version`
142
+ - Mensagem de erro completa
143
+ - Conteúdo do arquivo `/etc/environment` (se aplicável)
package/README.md CHANGED
@@ -488,4 +488,50 @@ ftc code "./meu-repo" --csv --export s3://meu-bucket/analises/resultado.csv
488
488
  - Se `--s3-bucket` não for informado, será usado o bucket padrão `ftc-analyzer`.
489
489
  - Para JSON: Se `--s3-key` não for informado, será usado o padrão `analises/<nome_repositorio>-ano-mes-dia.json`.
490
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.
491
+ - O parâmetro `--s3-region` pode ser usado para especificar a região AWS.
492
+
493
+ ## Exportação via API HTTP (x-apikey)
494
+
495
+ Agora é possível exportar arquivos diretamente para uma API HTTP utilizando o header `x-apikey`.
496
+
497
+ **Exemplo de configuração:**
498
+
499
+ ```
500
+ api:https://sua-api.com/upload?apikey=SEU_API_KEY
501
+ ```
502
+
503
+ - O arquivo será compactado (gzip) e enviado via POST para a URL informada.
504
+ - O header `x-apikey` será preenchido automaticamente com o valor fornecido.
505
+ - O header `x-provider` será enviado se especificado na URL.
506
+ - O conteúdo enviado será do tipo `application/octet-stream` com encoding `gzip`.
507
+
508
+ **Uso no código:**
509
+
510
+ ```csharp
511
+ await ExportHelper.ExportDataAsync(
512
+ dados,
513
+ "api:https://sua-api.com/upload?apikey=SEU_API_KEY",
514
+ repoPath,
515
+ serviceProvider,
516
+ ExportFormat.Json
517
+ );
518
+ ```
519
+
520
+ ### Exemplo: Envio de arquivo compactado para o endpoint de commit-files
521
+
522
+ ```
523
+ api:https://ftc-api.eximia.co/collect/commit-files?apikey=xpt-apikey&provider=Azure
524
+ ```
525
+
526
+ - O arquivo será compactado (gzip) e enviado via POST.
527
+ - Headers enviados: x-apikey, x-provider
528
+ - Suporta CSV ou JSON.
529
+ - Formato: application/octet-stream com encoding gzip
530
+
531
+ ### Exemplo: Consulta do last-sync via GET
532
+
533
+ ```csharp
534
+ var client = new ApiKeyHttpGetClient(serviceProvider.GetRequiredService<IHttpClientFactory>(), "xpt-apikey");
535
+ var lastSync = await client.GetLastSyncAsync("https://ftc-api.eximia.co/collect/repositories/repo01/last-sync");
536
+ Console.WriteLine($"Última sincronização: {lastSync}");
537
+ ```
package/TESTING.md ADDED
@@ -0,0 +1,169 @@
1
+ # 🧪 Guia de Testes - Follow The Code CLI
2
+
3
+ ## Testes de Permissões
4
+
5
+ ### 1. **Teste Básico de Permissões**
6
+ ```bash
7
+ cd contexts/ftc.cli
8
+ npm run test-permissions
9
+ ```
10
+
11
+ Este comando verifica:
12
+ - ✅ Permissões dos arquivos executáveis
13
+ - ✅ Existência dos arquivos
14
+ - ✅ Funcionamento dos scripts de correção
15
+
16
+ ### 2. **Teste Completo do Build**
17
+ ```bash
18
+ npm run build
19
+ ```
20
+
21
+ Verifica todo o processo:
22
+ - 🔨 Compilação para todas as plataformas
23
+ - 📋 Cópia de configurações
24
+ - 🔐 Definição de permissões
25
+
26
+ ### 3. **Teste Individual dos Scripts**
27
+ ```bash
28
+ # Teste de cópia de configuração
29
+ npm run copy-config
30
+
31
+ # Teste de definição de permissões
32
+ npm run set-permissions
33
+
34
+ # Teste de correção manual
35
+ npm run fix-permissions
36
+ ```
37
+
38
+ ### 4. **Teste com Docker (Linux)**
39
+ ```bash
40
+ # Requer Docker instalado
41
+ npm run test-linux
42
+ ```
43
+
44
+ Simula instalação em ambiente Linux limpo.
45
+
46
+ ## Verificação Manual
47
+
48
+ ### Verificar Permissões
49
+ ```bash
50
+ # Linux/macOS
51
+ ls -la bin/linux-x64/ftc.cli
52
+ ls -la bin/osx-x64/ftc.cli
53
+ ls -la bin/ftc.js
54
+
55
+ # Deve mostrar: -rwxr-xr-x (755)
56
+ ```
57
+
58
+ ### Testar Execução
59
+ ```bash
60
+ # Teste do CLI
61
+ ./bin/ftc.js --help
62
+
63
+ # Deve mostrar a ajuda do CLI
64
+ ```
65
+
66
+ ## Teste de Publicação
67
+
68
+ ### 1. **Teste Local de Publicação**
69
+ ```bash
70
+ # Simula publicação sem enviar para npm
71
+ npm run build
72
+ npm pack
73
+
74
+ # Verifica o conteúdo do pacote
75
+ tar -tzf followthecode-cli-*.tgz
76
+ ```
77
+
78
+ ### 2. **Teste de Instalação Local**
79
+ ```bash
80
+ # Instala o pacote localmente
81
+ npm install -g ./followthecode-cli-*.tgz
82
+
83
+ # Testa a instalação
84
+ ftc --help
85
+ ```
86
+
87
+ ## Cenários de Teste
88
+
89
+ ### ✅ **Cenário 1: Build Completo**
90
+ 1. Execute `npm run build`
91
+ 2. Verifique se todos os arquivos foram criados
92
+ 3. Verifique permissões com `npm run test-permissions`
93
+
94
+ ### ✅ **Cenário 2: Instalação Limpa**
95
+ 1. Delete a pasta `bin/`
96
+ 2. Execute `npm run build`
97
+ 3. Verifique se as permissões foram definidas
98
+
99
+ ### ✅ **Cenário 3: Correção Manual**
100
+ 1. Remova permissões: `chmod -x bin/linux-x64/ftc.cli`
101
+ 2. Execute `npm run fix-permissions`
102
+ 3. Verifique se as permissões foram restauradas
103
+
104
+ ### ✅ **Cenário 4: Teste Cross-Platform**
105
+ 1. Execute em Windows
106
+ 2. Execute em Linux (via Docker)
107
+ 3. Execute em macOS (se disponível)
108
+
109
+ ## Resultados Esperados
110
+
111
+ ### ✅ **Sucesso**
112
+ ```
113
+ 🧪 Testando permissões de execução...
114
+
115
+ 🔍 Verificando arquivos...
116
+
117
+ 📁 bin/ftc.js
118
+ Permissões: 755
119
+ Executável: ✅ Sim
120
+ Tamanho: 2048 bytes
121
+
122
+ 📁 bin/linux-x64/ftc.cli
123
+ Permissões: 755
124
+ Executável: ✅ Sim
125
+ Tamanho: 51200 bytes
126
+
127
+ 📊 Resultado do teste:
128
+ ✅ Todas as permissões estão corretas!
129
+ ```
130
+
131
+ ### ❌ **Falha**
132
+ ```
133
+ 📁 bin/linux-x64/ftc.cli
134
+ Permissões: 644
135
+ Executável: ❌ Não
136
+ Tamanho: 51200 bytes
137
+
138
+ 📊 Resultado do teste:
139
+ ❌ Algumas permissões precisam ser corrigidas
140
+ 💡 Execute: npm run fix-permissions
141
+ ```
142
+
143
+ ## Troubleshooting
144
+
145
+ ### Problema: "Script não encontrado"
146
+ ```bash
147
+ # Verifique se os scripts existem
148
+ ls -la scripts/
149
+ ```
150
+
151
+ ### Problema: "Permissão negada"
152
+ ```bash
153
+ # No Linux/macOS
154
+ chmod +x scripts/*.js
155
+ chmod +x scripts/*.sh
156
+ ```
157
+
158
+ ### Problema: "Docker não encontrado"
159
+ ```bash
160
+ # Instale Docker ou use apenas os testes Node.js
161
+ npm run test-permissions
162
+ ```
163
+
164
+ ## Próximos Passos
165
+
166
+ Após os testes:
167
+ 1. ✅ Se tudo passar: Pronto para publicação
168
+ 2. ❌ Se houver falhas: Corrija e teste novamente
169
+ 3. 🔄 Para publicação: `npm run publish:patch`
@@ -0,0 +1,60 @@
1
+ # 🔧 Troubleshooting - Follow The Code CLI
2
+
3
+ ## Problemas de Permissão no Linux
4
+
5
+ ### Sintoma
6
+ Após instalar a CLI no Linux, você recebe um erro como:
7
+ ```
8
+ bash: ./ftc.cli: Permission denied
9
+ ```
10
+
11
+ ### Solução Automática
12
+ Execute o comando de correção de permissões:
13
+ ```bash
14
+ npm run fix-permissions
15
+ ```
16
+
17
+ ### Solução Manual
18
+ Se a solução automática não funcionar, execute manualmente:
19
+ ```bash
20
+ chmod +x bin/linux-x64/ftc.cli
21
+ chmod +x bin/ftc.js
22
+ ```
23
+
24
+ ### Verificação
25
+ Para verificar se as permissões estão corretas:
26
+ ```bash
27
+ ls -la bin/linux-x64/ftc.cli
28
+ ls -la bin/ftc.js
29
+ ```
30
+
31
+ As permissões devem aparecer como `-rwxr-xr-x` (755).
32
+
33
+ ## Outros Problemas Comuns
34
+
35
+ ### Erro: "Executável .NET não encontrado"
36
+ Certifique-se de que o projeto foi compilado para todas as plataformas:
37
+ ```bash
38
+ npm run build
39
+ ```
40
+
41
+ ### Erro: "Plataforma não suportada"
42
+ A CLI suporta apenas:
43
+ - Windows (x64)
44
+ - macOS (x64)
45
+ - Linux (x64)
46
+
47
+ ### Problemas de Rede
48
+ Se houver problemas de conectividade, verifique:
49
+ - Configuração de proxy
50
+ - Firewall
51
+ - DNS
52
+
53
+ ## Logs de Debug
54
+ Para obter mais informações sobre erros, execute:
55
+ ```bash
56
+ ftc --help
57
+ ```
58
+
59
+ ## Suporte
60
+ Se os problemas persistirem, abra uma issue no repositório do projeto.
package/bin/ftc ADDED
@@ -0,0 +1,85 @@
1
+ #!/bin/bash
2
+
3
+ # Follow The Code CLI - Wrapper Shell Script
4
+ # Este script executa o binário .NET diretamente sem depender do Node.js
5
+
6
+ # Detecta a plataforma
7
+ PLATFORM=$(uname -s | tr '[:upper:]' '[:lower:]')
8
+ ARCH=$(uname -m)
9
+
10
+ # Mapeia a plataforma para o diretório correto
11
+ case "$PLATFORM" in
12
+ "linux")
13
+ PLATFORM_DIR="linux-x64"
14
+ EXECUTABLE="ftc.cli"
15
+ ;;
16
+ "darwin")
17
+ PLATFORM_DIR="osx-x64"
18
+ EXECUTABLE="ftc.cli"
19
+ ;;
20
+ *)
21
+ echo "❌ Plataforma não suportada: $PLATFORM"
22
+ echo "💡 Plataformas suportadas: Linux, macOS"
23
+ exit 1
24
+ ;;
25
+ esac
26
+
27
+ # Obtém o diretório do script
28
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
29
+ EXECUTABLE_PATH="$SCRIPT_DIR/$PLATFORM_DIR/$EXECUTABLE"
30
+
31
+ # Verifica se o executável existe
32
+ if [ ! -f "$EXECUTABLE_PATH" ]; then
33
+ echo "❌ Erro: Executável .NET não encontrado em: $EXECUTABLE_PATH"
34
+ echo "💡 Certifique-se de que o projeto foi compilado para todas as plataformas."
35
+ exit 1
36
+ fi
37
+
38
+ # Verifica permissões de execução
39
+ if [ ! -x "$EXECUTABLE_PATH" ]; then
40
+ echo "❌ Erro: Arquivo não tem permissões de execução: $EXECUTABLE_PATH"
41
+ echo "💡 Execute: chmod +x $EXECUTABLE_PATH"
42
+ exit 1
43
+ fi
44
+
45
+ # Se não há argumentos ou é --help, mostra o help
46
+ if [ $# -eq 0 ] || [[ "$*" == *"--help"* ]] || [[ "$*" == *"-h"* ]]; then
47
+ echo "
48
+ 🚀 Follow The Code CLI - Ferramenta de Análise de Repositórios Git
49
+
50
+ 📋 USO:
51
+ ftc <comando> [opções]
52
+
53
+ 📝 COMANDOS:
54
+ collect code <repo> Analisa um repositório Git e coleta dados
55
+
56
+ 📊 OPÇÕES DE EXPORTAÇÃO:
57
+ --csv Exporta resultados em formato CSV
58
+ --json Exporta resultados em formato JSON
59
+ --export <destino> Define o destino da exportação
60
+
61
+ 🎯 DESTINOS DE EXPORTAÇÃO:
62
+ local:<caminho> Salva arquivo local (ex: local:./output.csv)
63
+ s3:<bucket>/<key> Envia para AWS S3 (ex: s3:meu-bucket/resultado.csv)
64
+
65
+ 📖 EXEMPLOS:
66
+ ftc collect code https://github.com/user/repo --csv --export local:./resultado.csv
67
+ ftc collect code https://github.com/user/repo --json --export s3:meu-bucket/analise.json
68
+ ftc collect code https://github.com/user/repo --csv
69
+
70
+ 🔧 OPÇÕES GLOBAIS:
71
+ --help, -h Mostra esta ajuda
72
+ --version, -v Mostra a versão
73
+
74
+ 🌍 PLATAFORMAS SUPORTADAS:
75
+ Windows (x64), macOS (x64), Linux (x64)
76
+
77
+ 📚 MAIS INFORMAÇÕES:
78
+ Visite: https://github.com/your-org/follow-the-code
79
+ "
80
+ exit 0
81
+ fi
82
+
83
+ # Executa o binário .NET
84
+ cd "$(dirname "$EXECUTABLE_PATH")"
85
+ exec "$EXECUTABLE_PATH" "$@"
package/bin/ftc.js CHANGED
@@ -4,6 +4,18 @@ const { spawn } = require('child_process');
4
4
  const path = require('path');
5
5
  const fs = require('fs');
6
6
 
7
+ // Verifica se o Node.js está disponível
8
+ function checkNodeAvailability() {
9
+ try {
10
+ // Tenta executar node --version
11
+ const { execSync } = require('child_process');
12
+ execSync('node --version', { stdio: 'pipe' });
13
+ return true;
14
+ } catch (error) {
15
+ return false;
16
+ }
17
+ }
18
+
7
19
  // Detecta a plataforma e arquitetura
8
20
  const platform = process.platform;
9
21
  const arch = process.arch;
@@ -75,6 +87,24 @@ if (!fs.existsSync(executablePath)) {
75
87
  process.exit(1);
76
88
  }
77
89
 
90
+ // Verifica permissões de execução no Linux/macOS
91
+ if (platform !== 'win32') {
92
+ try {
93
+ const stats = fs.statSync(executablePath);
94
+ const isExecutable = (stats.mode & fs.constants.S_IXUSR) !== 0;
95
+
96
+ if (!isExecutable) {
97
+ console.error('❌ Erro: Arquivo não tem permissões de execução:', executablePath);
98
+ console.error('💡 Execute: npm run fix-permissions');
99
+ console.error('💡 Ou manualmente: chmod +x', executablePath);
100
+ process.exit(1);
101
+ }
102
+ } catch (error) {
103
+ console.error('❌ Erro ao verificar permissões:', error.message);
104
+ process.exit(1);
105
+ }
106
+ }
107
+
78
108
  // Executa o binário .NET
79
109
  const executableDir = path.dirname(executablePath);
80
110
  const child = spawn(executablePath, args, {
@@ -29,27 +29,7 @@
29
29
  "Args": {
30
30
  "outputTemplate": "[{Timestamp:HH:mm:ss} {Level:u3}] [{ThreadId}] [{TraceId}/{SpanId}] {Message:lj}{NewLine}{Exception}"
31
31
  }
32
- },
33
- {
34
- "Name": "OpenTelemetry",
35
- "Args": {
36
- "endpoint": "http://10.0.17.241:4317",
37
- "protocol": "Grpc",
38
- "timeout": 1000,
39
- "batchSizeLimit": 10,
40
- "period": 1
41
- }
42
32
  }
43
33
  ]
44
- },
45
- "OpenTelemetry": {
46
- "ServiceName": "ftc.cli",
47
- "OtlpEndpoint": "http://10.0.17.241:4317"
48
- },
49
- "AWS": {
50
- "Region": "us-east-1",
51
- "S3": {
52
- "BucketName": "ftc-analyzer"
53
- }
54
34
  }
55
35
  }
@@ -13,6 +13,7 @@
13
13
  "LibGit2Sharp": "0.27.0",
14
14
  "Microsoft.Extensions.Configuration.Binder": "9.0.0",
15
15
  "Microsoft.Extensions.Configuration.Json": "8.0.0",
16
+ "Microsoft.Extensions.Http": "8.0.0",
16
17
  "OpenTelemetry": "1.11.2",
17
18
  "OpenTelemetry.Exporter.OpenTelemetryProtocol": "1.11.2",
18
19
  "OpenTelemetry.Extensions.Hosting": "1.11.2",
@@ -910,6 +911,19 @@
910
911
  }
911
912
  }
912
913
  },
914
+ "Microsoft.Extensions.Diagnostics/8.0.0": {
915
+ "dependencies": {
916
+ "Microsoft.Extensions.Configuration": "9.0.0",
917
+ "Microsoft.Extensions.Diagnostics.Abstractions": "9.0.0",
918
+ "Microsoft.Extensions.Options.ConfigurationExtensions": "9.0.0"
919
+ },
920
+ "runtime": {
921
+ "lib/net8.0/Microsoft.Extensions.Diagnostics.dll": {
922
+ "assemblyVersion": "8.0.0.0",
923
+ "fileVersion": "8.0.23.53103"
924
+ }
925
+ }
926
+ },
913
927
  "Microsoft.Extensions.Diagnostics.Abstractions/9.0.0": {
914
928
  "dependencies": {
915
929
  "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.0",
@@ -970,6 +984,22 @@
970
984
  }
971
985
  }
972
986
  },
987
+ "Microsoft.Extensions.Http/8.0.0": {
988
+ "dependencies": {
989
+ "Microsoft.Extensions.Configuration.Abstractions": "9.0.0",
990
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.0",
991
+ "Microsoft.Extensions.Diagnostics": "8.0.0",
992
+ "Microsoft.Extensions.Logging": "9.0.0",
993
+ "Microsoft.Extensions.Logging.Abstractions": "9.0.0",
994
+ "Microsoft.Extensions.Options": "9.0.0"
995
+ },
996
+ "runtime": {
997
+ "lib/net8.0/Microsoft.Extensions.Http.dll": {
998
+ "assemblyVersion": "8.0.0.0",
999
+ "fileVersion": "8.0.23.53103"
1000
+ }
1001
+ }
1002
+ },
973
1003
  "Microsoft.Extensions.Logging/9.0.0": {
974
1004
  "dependencies": {
975
1005
  "Microsoft.Extensions.DependencyInjection": "9.0.0",
@@ -1420,6 +1450,13 @@
1420
1450
  "path": "microsoft.extensions.dependencymodel/9.0.0",
1421
1451
  "hashPath": "microsoft.extensions.dependencymodel.9.0.0.nupkg.sha512"
1422
1452
  },
1453
+ "Microsoft.Extensions.Diagnostics/8.0.0": {
1454
+ "type": "package",
1455
+ "serviceable": true,
1456
+ "sha512": "sha512-3PZp/YSkIXrF7QK7PfC1bkyRYwqOHpWFad8Qx+4wkuumAeXo1NHaxpS9LboNA9OvNSAu+QOVlXbMyoY+pHSqcw==",
1457
+ "path": "microsoft.extensions.diagnostics/8.0.0",
1458
+ "hashPath": "microsoft.extensions.diagnostics.8.0.0.nupkg.sha512"
1459
+ },
1423
1460
  "Microsoft.Extensions.Diagnostics.Abstractions/9.0.0": {
1424
1461
  "type": "package",
1425
1462
  "serviceable": true,
@@ -1455,6 +1492,13 @@
1455
1492
  "path": "microsoft.extensions.hosting.abstractions/9.0.0",
1456
1493
  "hashPath": "microsoft.extensions.hosting.abstractions.9.0.0.nupkg.sha512"
1457
1494
  },
1495
+ "Microsoft.Extensions.Http/8.0.0": {
1496
+ "type": "package",
1497
+ "serviceable": true,
1498
+ "sha512": "sha512-cWz4caHwvx0emoYe7NkHPxII/KkTI8R/LC9qdqJqnKv2poTJ4e2qqPGQqvRoQ5kaSA4FU5IV3qFAuLuOhoqULQ==",
1499
+ "path": "microsoft.extensions.http/8.0.0",
1500
+ "hashPath": "microsoft.extensions.http.8.0.0.nupkg.sha512"
1501
+ },
1458
1502
  "Microsoft.Extensions.Logging/9.0.0": {
1459
1503
  "type": "package",
1460
1504
  "serviceable": true,
Binary file
@@ -29,27 +29,7 @@
29
29
  "Args": {
30
30
  "outputTemplate": "[{Timestamp:HH:mm:ss} {Level:u3}] [{ThreadId}] [{TraceId}/{SpanId}] {Message:lj}{NewLine}{Exception}"
31
31
  }
32
- },
33
- {
34
- "Name": "OpenTelemetry",
35
- "Args": {
36
- "endpoint": "http://10.0.17.241:4317",
37
- "protocol": "Grpc",
38
- "timeout": 1000,
39
- "batchSizeLimit": 10,
40
- "period": 1
41
- }
42
32
  }
43
33
  ]
44
- },
45
- "OpenTelemetry": {
46
- "ServiceName": "ftc.cli",
47
- "OtlpEndpoint": "http://10.0.17.241:4317"
48
- },
49
- "AWS": {
50
- "Region": "us-east-1",
51
- "S3": {
52
- "BucketName": "ftc-analyzer"
53
- }
54
34
  }
55
35
  }
@@ -13,6 +13,7 @@
13
13
  "LibGit2Sharp": "0.27.0",
14
14
  "Microsoft.Extensions.Configuration.Binder": "9.0.0",
15
15
  "Microsoft.Extensions.Configuration.Json": "8.0.0",
16
+ "Microsoft.Extensions.Http": "8.0.0",
16
17
  "OpenTelemetry": "1.11.2",
17
18
  "OpenTelemetry.Exporter.OpenTelemetryProtocol": "1.11.2",
18
19
  "OpenTelemetry.Extensions.Hosting": "1.11.2",
@@ -910,6 +911,19 @@
910
911
  }
911
912
  }
912
913
  },
914
+ "Microsoft.Extensions.Diagnostics/8.0.0": {
915
+ "dependencies": {
916
+ "Microsoft.Extensions.Configuration": "9.0.0",
917
+ "Microsoft.Extensions.Diagnostics.Abstractions": "9.0.0",
918
+ "Microsoft.Extensions.Options.ConfigurationExtensions": "9.0.0"
919
+ },
920
+ "runtime": {
921
+ "lib/net8.0/Microsoft.Extensions.Diagnostics.dll": {
922
+ "assemblyVersion": "8.0.0.0",
923
+ "fileVersion": "8.0.23.53103"
924
+ }
925
+ }
926
+ },
913
927
  "Microsoft.Extensions.Diagnostics.Abstractions/9.0.0": {
914
928
  "dependencies": {
915
929
  "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.0",
@@ -970,6 +984,22 @@
970
984
  }
971
985
  }
972
986
  },
987
+ "Microsoft.Extensions.Http/8.0.0": {
988
+ "dependencies": {
989
+ "Microsoft.Extensions.Configuration.Abstractions": "9.0.0",
990
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.0",
991
+ "Microsoft.Extensions.Diagnostics": "8.0.0",
992
+ "Microsoft.Extensions.Logging": "9.0.0",
993
+ "Microsoft.Extensions.Logging.Abstractions": "9.0.0",
994
+ "Microsoft.Extensions.Options": "9.0.0"
995
+ },
996
+ "runtime": {
997
+ "lib/net8.0/Microsoft.Extensions.Http.dll": {
998
+ "assemblyVersion": "8.0.0.0",
999
+ "fileVersion": "8.0.23.53103"
1000
+ }
1001
+ }
1002
+ },
973
1003
  "Microsoft.Extensions.Logging/9.0.0": {
974
1004
  "dependencies": {
975
1005
  "Microsoft.Extensions.DependencyInjection": "9.0.0",
@@ -1420,6 +1450,13 @@
1420
1450
  "path": "microsoft.extensions.dependencymodel/9.0.0",
1421
1451
  "hashPath": "microsoft.extensions.dependencymodel.9.0.0.nupkg.sha512"
1422
1452
  },
1453
+ "Microsoft.Extensions.Diagnostics/8.0.0": {
1454
+ "type": "package",
1455
+ "serviceable": true,
1456
+ "sha512": "sha512-3PZp/YSkIXrF7QK7PfC1bkyRYwqOHpWFad8Qx+4wkuumAeXo1NHaxpS9LboNA9OvNSAu+QOVlXbMyoY+pHSqcw==",
1457
+ "path": "microsoft.extensions.diagnostics/8.0.0",
1458
+ "hashPath": "microsoft.extensions.diagnostics.8.0.0.nupkg.sha512"
1459
+ },
1423
1460
  "Microsoft.Extensions.Diagnostics.Abstractions/9.0.0": {
1424
1461
  "type": "package",
1425
1462
  "serviceable": true,
@@ -1455,6 +1492,13 @@
1455
1492
  "path": "microsoft.extensions.hosting.abstractions/9.0.0",
1456
1493
  "hashPath": "microsoft.extensions.hosting.abstractions.9.0.0.nupkg.sha512"
1457
1494
  },
1495
+ "Microsoft.Extensions.Http/8.0.0": {
1496
+ "type": "package",
1497
+ "serviceable": true,
1498
+ "sha512": "sha512-cWz4caHwvx0emoYe7NkHPxII/KkTI8R/LC9qdqJqnKv2poTJ4e2qqPGQqvRoQ5kaSA4FU5IV3qFAuLuOhoqULQ==",
1499
+ "path": "microsoft.extensions.http/8.0.0",
1500
+ "hashPath": "microsoft.extensions.http.8.0.0.nupkg.sha512"
1501
+ },
1458
1502
  "Microsoft.Extensions.Logging/9.0.0": {
1459
1503
  "type": "package",
1460
1504
  "serviceable": true,
Binary file
@@ -29,27 +29,7 @@
29
29
  "Args": {
30
30
  "outputTemplate": "[{Timestamp:HH:mm:ss} {Level:u3}] [{ThreadId}] [{TraceId}/{SpanId}] {Message:lj}{NewLine}{Exception}"
31
31
  }
32
- },
33
- {
34
- "Name": "OpenTelemetry",
35
- "Args": {
36
- "endpoint": "http://10.0.17.241:4317",
37
- "protocol": "Grpc",
38
- "timeout": 1000,
39
- "batchSizeLimit": 10,
40
- "period": 1
41
- }
42
32
  }
43
33
  ]
44
- },
45
- "OpenTelemetry": {
46
- "ServiceName": "ftc.cli",
47
- "OtlpEndpoint": "http://10.0.17.241:4317"
48
- },
49
- "AWS": {
50
- "Region": "us-east-1",
51
- "S3": {
52
- "BucketName": "ftc-analyzer"
53
- }
54
34
  }
55
35
  }
@@ -13,6 +13,7 @@
13
13
  "LibGit2Sharp": "0.27.0",
14
14
  "Microsoft.Extensions.Configuration.Binder": "9.0.0",
15
15
  "Microsoft.Extensions.Configuration.Json": "8.0.0",
16
+ "Microsoft.Extensions.Http": "8.0.0",
16
17
  "OpenTelemetry": "1.11.2",
17
18
  "OpenTelemetry.Exporter.OpenTelemetryProtocol": "1.11.2",
18
19
  "OpenTelemetry.Extensions.Hosting": "1.11.2",
@@ -910,6 +911,19 @@
910
911
  }
911
912
  }
912
913
  },
914
+ "Microsoft.Extensions.Diagnostics/8.0.0": {
915
+ "dependencies": {
916
+ "Microsoft.Extensions.Configuration": "9.0.0",
917
+ "Microsoft.Extensions.Diagnostics.Abstractions": "9.0.0",
918
+ "Microsoft.Extensions.Options.ConfigurationExtensions": "9.0.0"
919
+ },
920
+ "runtime": {
921
+ "lib/net8.0/Microsoft.Extensions.Diagnostics.dll": {
922
+ "assemblyVersion": "8.0.0.0",
923
+ "fileVersion": "8.0.23.53103"
924
+ }
925
+ }
926
+ },
913
927
  "Microsoft.Extensions.Diagnostics.Abstractions/9.0.0": {
914
928
  "dependencies": {
915
929
  "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.0",
@@ -970,6 +984,22 @@
970
984
  }
971
985
  }
972
986
  },
987
+ "Microsoft.Extensions.Http/8.0.0": {
988
+ "dependencies": {
989
+ "Microsoft.Extensions.Configuration.Abstractions": "9.0.0",
990
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.0",
991
+ "Microsoft.Extensions.Diagnostics": "8.0.0",
992
+ "Microsoft.Extensions.Logging": "9.0.0",
993
+ "Microsoft.Extensions.Logging.Abstractions": "9.0.0",
994
+ "Microsoft.Extensions.Options": "9.0.0"
995
+ },
996
+ "runtime": {
997
+ "lib/net8.0/Microsoft.Extensions.Http.dll": {
998
+ "assemblyVersion": "8.0.0.0",
999
+ "fileVersion": "8.0.23.53103"
1000
+ }
1001
+ }
1002
+ },
973
1003
  "Microsoft.Extensions.Logging/9.0.0": {
974
1004
  "dependencies": {
975
1005
  "Microsoft.Extensions.DependencyInjection": "9.0.0",
@@ -1420,6 +1450,13 @@
1420
1450
  "path": "microsoft.extensions.dependencymodel/9.0.0",
1421
1451
  "hashPath": "microsoft.extensions.dependencymodel.9.0.0.nupkg.sha512"
1422
1452
  },
1453
+ "Microsoft.Extensions.Diagnostics/8.0.0": {
1454
+ "type": "package",
1455
+ "serviceable": true,
1456
+ "sha512": "sha512-3PZp/YSkIXrF7QK7PfC1bkyRYwqOHpWFad8Qx+4wkuumAeXo1NHaxpS9LboNA9OvNSAu+QOVlXbMyoY+pHSqcw==",
1457
+ "path": "microsoft.extensions.diagnostics/8.0.0",
1458
+ "hashPath": "microsoft.extensions.diagnostics.8.0.0.nupkg.sha512"
1459
+ },
1423
1460
  "Microsoft.Extensions.Diagnostics.Abstractions/9.0.0": {
1424
1461
  "type": "package",
1425
1462
  "serviceable": true,
@@ -1455,6 +1492,13 @@
1455
1492
  "path": "microsoft.extensions.hosting.abstractions/9.0.0",
1456
1493
  "hashPath": "microsoft.extensions.hosting.abstractions.9.0.0.nupkg.sha512"
1457
1494
  },
1495
+ "Microsoft.Extensions.Http/8.0.0": {
1496
+ "type": "package",
1497
+ "serviceable": true,
1498
+ "sha512": "sha512-cWz4caHwvx0emoYe7NkHPxII/KkTI8R/LC9qdqJqnKv2poTJ4e2qqPGQqvRoQ5kaSA4FU5IV3qFAuLuOhoqULQ==",
1499
+ "path": "microsoft.extensions.http/8.0.0",
1500
+ "hashPath": "microsoft.extensions.http.8.0.0.nupkg.sha512"
1501
+ },
1458
1502
  "Microsoft.Extensions.Logging/9.0.0": {
1459
1503
  "type": "package",
1460
1504
  "serviceable": true,
Binary file
Binary file
package/package.json CHANGED
@@ -1,23 +1,35 @@
1
1
  {
2
2
  "name": "@followthecode/cli",
3
- "version": "1.1.8",
3
+ "version": "1.1.9",
4
4
  "description": "CLI tool for Git repository analysis and data collection",
5
5
  "main": "index.js",
6
6
  "license": "UNLICENSED",
7
7
  "publishConfig": {
8
- "access": "restricted"
8
+ "access": "public"
9
9
  },
10
10
  "bin": {
11
- "ftc": "./bin/ftc.js"
11
+ "ftc": "./bin/ftc.js",
12
+ "ftc-linux": "./bin/ftc"
12
13
  },
13
14
  "scripts": {
14
15
  "prepublishOnly": "npm run build",
15
- "build": "npm run build:win && npm run build:mac && npm run build:linux && npm run copy-config",
16
+ "build": "npm run build:win && npm run build:mac && npm run build:linux && npm run copy-config && npm run set-permissions",
16
17
  "build:win": "dotnet publish ftc.cli.csproj -c Release -r win-x64 --self-contained true -o ./bin/win-x64",
17
18
  "build:mac": "dotnet publish ftc.cli.csproj -c Release -r osx-x64 --self-contained true -o ./bin/osx-x64",
18
19
  "build:linux": "dotnet publish ftc.cli.csproj -c Release -r linux-x64 --self-contained true -o ./bin/linux-x64",
19
- "copy-config": "copy appsettings.json bin\\win-x64\\ && copy appsettings.json bin\\osx-x64\\ && copy appsettings.json bin\\linux-x64\\",
20
+ "copy-config": "node scripts/copy-config.js",
21
+ "set-permissions": "node scripts/set-permissions.js",
22
+ "postinstall": "node scripts/set-permissions.js && node scripts/install-wrapper.js",
23
+ "fix-permissions": "node scripts/fix-permissions.js",
20
24
  "test": "dotnet test",
25
+ "test-permissions": "node scripts/test-permissions.js",
26
+ "test-linux": "bash scripts/test-linux-permissions.sh",
27
+ "test-local-install": "node scripts/test-local-install.js",
28
+ "test-docker-real": "bash scripts/test-docker-real.sh",
29
+ "test-wsl": "wsl bash scripts/test-wsl-basic.sh",
30
+ "validate-wsl": "wsl bash scripts/validate-wsl.sh",
31
+ "validate-wsl-simple": "wsl bash scripts/validate-wsl-simple.sh",
32
+ "validate-wsl-no-sudo": "wsl bash scripts/validate-wsl-no-sudo.sh",
21
33
  "clean": "dotnet clean",
22
34
  "publish:patch": "node scripts/publish.js --patch",
23
35
  "publish:minor": "node scripts/publish.js --minor",
@@ -58,6 +70,7 @@
58
70
  ],
59
71
  "files": [
60
72
  "bin/ftc.js",
73
+ "bin/ftc",
61
74
  "bin/win-x64/ftc.cli.exe",
62
75
  "bin/win-x64/ftc.cli.dll",
63
76
  "bin/win-x64/ftc.cli.deps.json",
@@ -73,8 +86,14 @@
73
86
  "bin/linux-x64/ftc.cli.deps.json",
74
87
  "bin/linux-x64/appsettings.json",
75
88
  "bin/linux-x64/*.dll",
89
+ "scripts/set-permissions.js",
90
+ "scripts/fix-permissions.js",
91
+ "scripts/install-wrapper.js",
76
92
  "README.md",
77
- "LICENSE"
93
+ "LICENSE",
94
+ "TROUBLESHOOTING.md",
95
+ "TESTING.md",
96
+ "NODEJS-TROUBLESHOOTING.md"
78
97
  ],
79
98
  "dependencies": {
80
99
  "@followthecode/cli": "^1.0.1",
@@ -0,0 +1,58 @@
1
+ #!/usr/bin/env node
2
+
3
+ const fs = require('fs');
4
+ const path = require('path');
5
+
6
+ console.log('🔧 Corrigindo permissões de execução...');
7
+
8
+ // Função para definir permissões recursivamente
9
+ function setExecutablePermissions(dir) {
10
+ if (!fs.existsSync(dir)) {
11
+ console.warn(`⚠️ Diretório não encontrado: ${dir}`);
12
+ return;
13
+ }
14
+
15
+ const items = fs.readdirSync(dir);
16
+
17
+ items.forEach(item => {
18
+ const fullPath = path.join(dir, item);
19
+ const stat = fs.statSync(fullPath);
20
+
21
+ if (stat.isDirectory()) {
22
+ setExecutablePermissions(fullPath);
23
+ } else if (stat.isFile()) {
24
+ // Define permissões de execução para arquivos binários
25
+ const isExecutable = item === 'ftc.cli' || item === 'ftc.js' || item.endsWith('.exe');
26
+
27
+ if (isExecutable) {
28
+ try {
29
+ fs.chmodSync(fullPath, 0o755);
30
+ console.log(`✅ Permissões corrigidas: ${fullPath}`);
31
+ } catch (error) {
32
+ console.error(`❌ Erro ao corrigir permissões para ${fullPath}:`, error.message);
33
+ }
34
+ }
35
+ }
36
+ });
37
+ }
38
+
39
+ // Define permissões para os diretórios das plataformas
40
+ const platforms = ['linux-x64', 'osx-x64'];
41
+ platforms.forEach(platform => {
42
+ const platformDir = path.join('bin', platform);
43
+ setExecutablePermissions(platformDir);
44
+ });
45
+
46
+ // Define permissões para o arquivo ftc.js
47
+ const ftcJsPath = path.join('bin', 'ftc.js');
48
+ if (fs.existsSync(ftcJsPath)) {
49
+ try {
50
+ fs.chmodSync(ftcJsPath, 0o755);
51
+ console.log(`✅ Permissões corrigidas: ${ftcJsPath}`);
52
+ } catch (error) {
53
+ console.error(`❌ Erro ao corrigir permissões para ${ftcJsPath}:`, error.message);
54
+ }
55
+ }
56
+
57
+ console.log('✅ Correção de permissões concluída!');
58
+ console.log('💡 Se ainda houver problemas, execute manualmente: chmod +x bin/linux-x64/ftc.cli');
@@ -0,0 +1,74 @@
1
+ #!/usr/bin/env node
2
+
3
+ const fs = require('fs');
4
+ const path = require('path');
5
+ const { execSync } = require('child_process');
6
+
7
+ console.log('🔧 Configurando wrapper do FTC CLI...');
8
+
9
+ // Detecta a plataforma
10
+ const platform = process.platform;
11
+ const isWindows = platform === 'win32';
12
+
13
+ // Verifica se o Node.js está disponível
14
+ function checkNodeAvailability() {
15
+ try {
16
+ execSync('node --version', { stdio: 'pipe' });
17
+ return true;
18
+ } catch (error) {
19
+ return false;
20
+ }
21
+ }
22
+
23
+ // Caminhos dos wrappers
24
+ const ftcJsPath = path.join(__dirname, '..', 'bin', 'ftc.js');
25
+ const ftcShellPath = path.join(__dirname, '..', 'bin', 'ftc');
26
+
27
+ // Verifica qual wrapper usar
28
+ const nodeAvailable = checkNodeAvailability();
29
+ const ftcJsExists = fs.existsSync(ftcJsPath);
30
+ const ftcShellExists = fs.existsSync(ftcShellPath);
31
+
32
+ console.log(`📋 Detecção de ambiente:`);
33
+ console.log(` Plataforma: ${platform}`);
34
+ console.log(` Node.js disponível: ${nodeAvailable ? '✅ Sim' : '❌ Não'}`);
35
+ console.log(` Wrapper Node.js: ${ftcJsExists ? '✅ Existe' : '❌ Não existe'}`);
36
+ console.log(` Wrapper Shell: ${ftcShellExists ? '✅ Existe' : '❌ Não existe'}`);
37
+
38
+ // Recomenda o wrapper apropriado
39
+ if (nodeAvailable && ftcJsExists) {
40
+ console.log('✅ Usando wrapper Node.js (ftc.js)');
41
+ console.log('💡 Execute: ftc --help');
42
+ } else if (ftcShellExists) {
43
+ console.log('✅ Usando wrapper Shell (ftc)');
44
+ console.log('💡 Execute: ftc --help');
45
+
46
+ if (!nodeAvailable) {
47
+ console.log('⚠️ Node.js não encontrado, usando wrapper shell como fallback');
48
+ }
49
+ } else {
50
+ console.error('❌ Nenhum wrapper disponível!');
51
+ console.error('💡 Certifique-se de que o projeto foi compilado corretamente.');
52
+ process.exit(1);
53
+ }
54
+
55
+ // Define permissões para os wrappers
56
+ if (ftcJsExists) {
57
+ try {
58
+ fs.chmodSync(ftcJsPath, 0o755);
59
+ console.log('✅ Permissões definidas para ftc.js');
60
+ } catch (error) {
61
+ console.warn('⚠️ Não foi possível definir permissões para ftc.js:', error.message);
62
+ }
63
+ }
64
+
65
+ if (ftcShellExists) {
66
+ try {
67
+ fs.chmodSync(ftcShellPath, 0o755);
68
+ console.log('✅ Permissões definidas para ftc (shell)');
69
+ } catch (error) {
70
+ console.warn('⚠️ Não foi possível definir permissões para ftc (shell):', error.message);
71
+ }
72
+ }
73
+
74
+ console.log('🎉 Configuração concluída!');
@@ -0,0 +1,84 @@
1
+ const fs = require('fs');
2
+ const path = require('path');
3
+ const { execSync } = require('child_process');
4
+
5
+ console.log('🔐 Definindo permissões de execução...');
6
+
7
+ // Detecta a plataforma
8
+ const platform = process.platform;
9
+ const isWindows = platform === 'win32';
10
+
11
+ const platforms = [
12
+ { dir: 'linux-x64', executable: 'ftc.cli' },
13
+ { dir: 'osx-x64', executable: 'ftc.cli' }
14
+ ];
15
+
16
+ platforms.forEach(platformConfig => {
17
+ const executablePath = path.join('bin', platformConfig.dir, platformConfig.executable);
18
+
19
+ if (fs.existsSync(executablePath)) {
20
+ try {
21
+ if (isWindows) {
22
+ // No Windows, tenta definir permissões mesmo assim
23
+ try {
24
+ fs.chmodSync(executablePath, 0o755);
25
+ console.log(`✅ Permissões definidas para ${executablePath} (Windows)`);
26
+ } catch (error) {
27
+ console.log(`✅ Arquivo preparado para ${executablePath} (Windows - permissões não aplicáveis)`);
28
+ }
29
+ } else {
30
+ // No Linux/macOS, define permissões reais
31
+ fs.chmodSync(executablePath, 0o755);
32
+ console.log(`✅ Permissões definidas para ${executablePath}`);
33
+ }
34
+ } catch (error) {
35
+ console.error(`❌ Erro ao definir permissões para ${executablePath}:`, error.message);
36
+ }
37
+ } else {
38
+ console.warn(`⚠️ Executável não encontrado: ${executablePath}`);
39
+ }
40
+ });
41
+
42
+ // Também define permissões para o arquivo ftc.js
43
+ const ftcJsPath = path.join('bin', 'ftc.js');
44
+ if (fs.existsSync(ftcJsPath)) {
45
+ try {
46
+ if (isWindows) {
47
+ try {
48
+ fs.chmodSync(ftcJsPath, 0o755);
49
+ console.log(`✅ Permissões definidas para ${ftcJsPath} (Windows)`);
50
+ } catch (error) {
51
+ console.log(`✅ Arquivo preparado para ${ftcJsPath} (Windows - permissões não aplicáveis)`);
52
+ }
53
+ } else {
54
+ fs.chmodSync(ftcJsPath, 0o755);
55
+ console.log(`✅ Permissões definidas para ${ftcJsPath}`);
56
+ }
57
+ } catch (error) {
58
+ console.error(`❌ Erro ao definir permissões para ${ftcJsPath}:`, error.message);
59
+ }
60
+ }
61
+
62
+ // Define permissões para o wrapper shell script
63
+ const ftcShellPath = path.join('bin', 'ftc');
64
+ if (fs.existsSync(ftcShellPath)) {
65
+ try {
66
+ if (isWindows) {
67
+ try {
68
+ fs.chmodSync(ftcShellPath, 0o755);
69
+ console.log(`✅ Permissões definidas para ${ftcShellPath} (Windows)`);
70
+ } catch (error) {
71
+ console.log(`✅ Arquivo preparado para ${ftcShellPath} (Windows - permissões não aplicáveis)`);
72
+ }
73
+ } else {
74
+ fs.chmodSync(ftcShellPath, 0o755);
75
+ console.log(`✅ Permissões definidas para ${ftcShellPath}`);
76
+ }
77
+ } catch (error) {
78
+ console.error(`❌ Erro ao definir permissões para ${ftcShellPath}:`, error.message);
79
+ }
80
+ } else {
81
+ console.warn(`⚠️ Wrapper shell script não encontrado: ${ftcShellPath}`);
82
+ }
83
+
84
+ console.log('✅ Permissões de execução definidas com sucesso');