Skip to content

Commit 06bc18b

Browse files
author
Jean Avila
committed
feat: adiciona 36 novos comandos (Terminal, Node.js, PowerShell, Python)
Expande o catalogo de whitelist com operacoes de diagnostico e gestao de ambiente para 4 areas sem cobertura ou com cobertura minima: Windows Terminal (9), Node.js (7 fixos + 2 templates de instalar/desinstalar pacote), PowerShell (8) e Python (7 fixos + 3 templates de instalar/desinstalar pacote e criar venv). Cada operacao entra em v10/allowed-operations.json (fonte de verdade validada pelo launcher) e em mcp-server/index.js (mestreTools, com id identico ao catalogo). Corrige tambem um bug preexistente em npm_install_no_projeto: o comando tinha -LiteralPath vazio (faltava $env:MESTRE_PROJETO_PATH). Adiciona teste de regressao permanente que garante todo id de mestreTools existir no catalogo -- a mesma classe de bug corrigida na sessao anterior (19 ids desalinhados bloqueando comandos legitimos).
1 parent 9e5e272 commit 06bc18b

3 files changed

Lines changed: 470 additions & 1 deletion

File tree

mcp-server/index.js

Lines changed: 188 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -463,6 +463,194 @@ const mestreTools = {
463463
description: "Executa um scan rápido no Defender.",
464464
command: 'Start-MpScan -ScanType QuickScan; Write-Host "✅ Scan rápido iniciado!" -ForegroundColor Green',
465465
},
466+
467+
// ===== Terminal =====
468+
abrir_windows_terminal: {
469+
id: "abrir_windows_terminal",
470+
description: "Abre uma nova janela do Windows Terminal.",
471+
command: 'Start-Process wt.exe; Write-Host "✅ Windows Terminal aberto!" -ForegroundColor Green',
472+
},
473+
abrir_windows_terminal_no_projeto: {
474+
id: "abrir_windows_terminal_no_projeto",
475+
description: "Abre o Windows Terminal já na pasta do projeto Mestre do PC.",
476+
command: 'Start-Process wt.exe -ArgumentList "-d","$env:MESTRE_PROJETO_PATH"; Write-Host "✅ Windows Terminal aberto no projeto!" -ForegroundColor Green',
477+
},
478+
abrir_cmd_no_projeto: {
479+
id: "abrir_cmd_no_projeto",
480+
description: "Abre o Prompt de Comando (CMD) já na pasta do projeto Mestre do PC.",
481+
command: 'Start-Process cmd.exe -ArgumentList "/K","cd /d ""$env:MESTRE_PROJETO_PATH"""; Write-Host "✅ CMD aberto no projeto!" -ForegroundColor Green',
482+
},
483+
verificar_terminal_padrao: {
484+
id: "verificar_terminal_padrao",
485+
description: "Verifica qual aplicativo de terminal está configurado como padrão no Windows.",
486+
command: 'try { $t = Get-ItemProperty -Path "HKCU:\\Console\\%%Startup" -Name DelegationConsole -EA Stop; Write-Host "Terminal padrão configurado: $($t.DelegationConsole)" } catch { Write-Host "Nenhuma preferência de terminal padrão definida (usando padrão do sistema)." -ForegroundColor Yellow }',
487+
},
488+
definir_windows_terminal_como_padrao: {
489+
id: "definir_windows_terminal_como_padrao",
490+
description: "Define o Windows Terminal como o terminal padrão do sistema.",
491+
command: 'New-Item -Path "HKCU:\\Console\\%%Startup" -Force | Out-Null; Set-ItemProperty -Path "HKCU:\\Console\\%%Startup" -Name DelegationConsole -Value "{2EACA947-7F5F-4CFA-BA87-8F7FBEEFBE69}"; Set-ItemProperty -Path "HKCU:\\Console\\%%Startup" -Name DelegationTerminal -Value "{2EACA947-7F5F-4CFA-BA87-8F7FBEEFBE69}"; Write-Host "✅ Windows Terminal definido como padrão!" -ForegroundColor Green',
492+
},
493+
listar_variaveis_de_ambiente_path: {
494+
id: "listar_variaveis_de_ambiente_path",
495+
description: "Lista todas as entradas da variável de ambiente PATH.",
496+
command: '($env:Path -split \';\') | Where-Object { $_ -ne "" } | ForEach-Object { Write-Host $_ }',
497+
},
498+
verificar_edicoes_do_windows_terminal_instaladas: {
499+
id: "verificar_edicoes_do_windows_terminal_instaladas",
500+
description: "Verifica se o Windows Terminal está instalado via winget.",
501+
command: "winget list --id Microsoft.WindowsTerminal",
502+
},
503+
listar_processos_de_terminais_abertos: {
504+
id: "listar_processos_de_terminais_abertos",
505+
description: "Lista processos de terminais abertos (Windows Terminal, PowerShell, pwsh, CMD).",
506+
command: 'Get-Process -Name wt,powershell,pwsh,cmd -ErrorAction SilentlyContinue | Select-Object Name,Id,StartTime | Format-Table -AutoSize',
507+
},
508+
reiniciar_windows_terminal: {
509+
id: "reiniciar_windows_terminal",
510+
description: "Encerra o processo do Windows Terminal (fecha todas as janelas abertas).",
511+
command: 'Stop-Process -Name WindowsTerminal -Force -EA 0; Write-Host "✅ Windows Terminal reiniciado (feche e abra novamente)!" -ForegroundColor Green',
512+
},
513+
514+
// ===== Node.js =====
515+
verificar_versao_node: {
516+
id: "verificar_versao_node",
517+
description: "Mostra a versão instalada do Node.js e do NPM.",
518+
command: "node -v; npm -v",
519+
},
520+
listar_pacotes_globais_npm: {
521+
id: "listar_pacotes_globais_npm",
522+
description: "Lista os pacotes NPM instalados globalmente.",
523+
command: "npm list -g --depth=0",
524+
},
525+
atualizar_npm: {
526+
id: "atualizar_npm",
527+
description: "Atualiza o NPM para a versão mais recente.",
528+
command: 'npm install -g npm@latest; Write-Host "✅ NPM atualizado!" -ForegroundColor Green',
529+
},
530+
limpar_cache_npm: {
531+
id: "limpar_cache_npm",
532+
description: "Limpa o cache do NPM.",
533+
command: 'npm cache clean --force; Write-Host "✅ Cache do NPM limpo!" -ForegroundColor Green',
534+
},
535+
verificar_processos_node_ativos: {
536+
id: "verificar_processos_node_ativos",
537+
description: "Lista processos Node.js ativos e o uso de RAM de cada um.",
538+
command: 'Get-Process -Name node -ErrorAction SilentlyContinue | Select-Object Id,StartTime,@{N="RAM(MB)";E={[math]::Round($_.WorkingSet64/1MB,2)}} | Format-Table -AutoSize',
539+
},
540+
verificar_dependencias_desatualizadas_npm: {
541+
id: "verificar_dependencias_desatualizadas_npm",
542+
description: "Roda 'npm outdated' na pasta do projeto Mestre do PC.",
543+
command: "Set-Location -LiteralPath $env:MESTRE_PROJETO_PATH; npm outdated",
544+
},
545+
auditar_seguranca_npm: {
546+
id: "auditar_seguranca_npm",
547+
description: "Roda 'npm audit' na pasta do projeto Mestre do PC.",
548+
command: "Set-Location -LiteralPath $env:MESTRE_PROJETO_PATH; npm audit",
549+
},
550+
instalar_pacote_npm_global: {
551+
id: "instalar_pacote_npm_global",
552+
description: "Instala um pacote NPM globalmente. Informe o parâmetro 'pacote' com o nome do pacote (ex: typescript, nodemon).",
553+
command: 'npm install -g {{PACOTE}}; Write-Host "✅ Pacote {{PACOTE}} instalado!" -ForegroundColor Green',
554+
},
555+
desinstalar_pacote_npm_global: {
556+
id: "desinstalar_pacote_npm_global",
557+
description: "Desinstala um pacote NPM global. Informe o parâmetro 'pacote' com o nome do pacote.",
558+
command: 'npm uninstall -g {{PACOTE}}; Write-Host "✅ Pacote {{PACOTE}} desinstalado!" -ForegroundColor Green',
559+
},
560+
561+
// ===== PowerShell =====
562+
verificar_versao_do_powershell: {
563+
id: "verificar_versao_do_powershell",
564+
description: "Mostra a versão do PowerShell em uso e detalhes da edição.",
565+
command: "$PSVersionTable | Format-List",
566+
},
567+
listar_modulos_powershell_instalados: {
568+
id: "listar_modulos_powershell_instalados",
569+
description: "Lista os módulos PowerShell instalados.",
570+
command: "Get-Module -ListAvailable | Select-Object Name,Version | Sort-Object Name | Format-Table -AutoSize",
571+
},
572+
verificar_execution_policy: {
573+
id: "verificar_execution_policy",
574+
description: "Mostra a Execution Policy configurada em cada escopo.",
575+
command: "Get-ExecutionPolicy -List | Format-Table -AutoSize",
576+
},
577+
definir_execution_policy_remotesigned: {
578+
id: "definir_execution_policy_remotesigned",
579+
description: "Define a Execution Policy como RemoteSigned no escopo do usuário atual.",
580+
command: 'Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser -Force; Write-Host "✅ Execution Policy definida como RemoteSigned!" -ForegroundColor Green',
581+
},
582+
atualizar_ajuda_do_powershell: {
583+
id: "atualizar_ajuda_do_powershell",
584+
description: "Atualiza os arquivos de ajuda (Update-Help) do PowerShell.",
585+
command: 'Update-Help -Force -ErrorAction SilentlyContinue; Write-Host "✅ Ajuda do PowerShell atualizada!" -ForegroundColor Green',
586+
},
587+
verificar_perfil_do_powershell: {
588+
id: "verificar_perfil_do_powershell",
589+
description: "Verifica se existe um perfil do PowerShell ($PROFILE) configurado e mostra seu conteúdo.",
590+
command: 'if (Test-Path $PROFILE) { Write-Host "Perfil encontrado: $PROFILE"; Get-Content $PROFILE } else { Write-Host "Nenhum perfil do PowerShell configurado." -ForegroundColor Yellow }',
591+
},
592+
limpar_historico_do_powershell: {
593+
id: "limpar_historico_do_powershell",
594+
description: "Limpa o histórico de comandos do PowerShell (PSReadLine).",
595+
command: '$h = (Get-PSReadLineOption).HistorySavePath; Remove-Item -Path $h -Force -EA 0; Write-Host "✅ Histórico do PowerShell limpo!" -ForegroundColor Green',
596+
},
597+
listar_variaveis_de_ambiente: {
598+
id: "listar_variaveis_de_ambiente",
599+
description: "Lista todas as variáveis de ambiente do sistema.",
600+
command: "Get-ChildItem Env: | Sort-Object Name | Format-Table -AutoSize",
601+
},
602+
603+
// ===== Python =====
604+
verificar_versao_python: {
605+
id: "verificar_versao_python",
606+
description: "Mostra a versão instalada do Python.",
607+
command: "python --version",
608+
},
609+
verificar_versao_pip: {
610+
id: "verificar_versao_pip",
611+
description: "Mostra a versão instalada do Pip.",
612+
command: "pip --version",
613+
},
614+
listar_pacotes_pip_instalados: {
615+
id: "listar_pacotes_pip_instalados",
616+
description: "Lista os pacotes Python instalados via Pip.",
617+
command: "pip list",
618+
},
619+
atualizar_pip: {
620+
id: "atualizar_pip",
621+
description: "Atualiza o Pip para a versão mais recente.",
622+
command: 'python -m pip install --upgrade pip; Write-Host "✅ Pip atualizado!" -ForegroundColor Green',
623+
},
624+
verificar_pacotes_desatualizados_pip: {
625+
id: "verificar_pacotes_desatualizados_pip",
626+
description: "Lista os pacotes Pip que possuem versão mais nova disponível.",
627+
command: "pip list --outdated",
628+
},
629+
verificar_processos_python_ativos: {
630+
id: "verificar_processos_python_ativos",
631+
description: "Lista processos Python ativos e o uso de RAM de cada um.",
632+
command: 'Get-Process -Name python,python3,pythonw -ErrorAction SilentlyContinue | Select-Object Id,StartTime,@{N="RAM(MB)";E={[math]::Round($_.WorkingSet64/1MB,2)}} | Format-Table -AutoSize',
633+
},
634+
limpar_cache_pip: {
635+
id: "limpar_cache_pip",
636+
description: "Limpa o cache de download do Pip.",
637+
command: 'pip cache purge; Write-Host "✅ Cache do Pip limpo!" -ForegroundColor Green',
638+
},
639+
instalar_pacote_pip: {
640+
id: "instalar_pacote_pip",
641+
description: "Instala um pacote Python via Pip. Informe o parâmetro 'pacote' com o nome do pacote (ex: requests, numpy).",
642+
command: 'pip install {{PACOTE}}; Write-Host "✅ Pacote {{PACOTE}} instalado!" -ForegroundColor Green',
643+
},
644+
desinstalar_pacote_pip: {
645+
id: "desinstalar_pacote_pip",
646+
description: "Desinstala um pacote Python via Pip. Informe o parâmetro 'pacote' com o nome do pacote.",
647+
command: 'pip uninstall -y {{PACOTE}}; Write-Host "✅ Pacote {{PACOTE}} desinstalado!" -ForegroundColor Green',
648+
},
649+
criar_ambiente_virtual_venv: {
650+
id: "criar_ambiente_virtual_venv",
651+
description: "Cria um ambiente virtual Python (venv). Informe o parâmetro 'nome' com o nome da pasta do ambiente.",
652+
command: 'python -m venv {{NOME}}; Write-Host "✅ Ambiente virtual \'{{NOME}}\' criado!" -ForegroundColor Green',
653+
},
466654
};
467655

468656
// --- Model profiles (local automation desktop models) ---

mcp-server/test/whitelist-enforcement.test.js

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,3 +128,27 @@ test("template parametrizado casa por cmd literal (modo legado)", async (t) => {
128128
assert.equal(legacy.allowed, true);
129129
assert.equal(legacy.id, "encerrar_processo");
130130
});
131+
132+
test("todo id de mestreTools (mcp-server/index.js) existe em allowed-operations.json", async () => {
133+
// Regressão: 19 ferramentas MCP já usaram ids que não existiam no catálogo,
134+
// ficando bloqueadas pela whitelist mesmo sendo operações legítimas. Este
135+
// teste garante que todo `id:` declarado em mestreTools bate com um id real
136+
// do catálogo (operations ou templates), sem depender de checagem manual.
137+
const catalog = JSON.parse(await readFile(join(root, "v10", "allowed-operations.json"), "utf8"));
138+
const catalogIds = new Set([
139+
...catalog.operations.map((op) => op.id),
140+
...catalog.templates.map((tpl) => tpl.id),
141+
]);
142+
143+
const source = await readFile(join(root, "mcp-server", "index.js"), "utf8");
144+
const start = source.indexOf("const mestreTools = {");
145+
assert.ok(start > 0, "objeto mestreTools não encontrado em index.js");
146+
const end = source.indexOf("\n};", start);
147+
const mestreToolsSource = source.slice(start, end);
148+
149+
const mcpIds = [...mestreToolsSource.matchAll(/id:\s*"([a-z_0-9]+)"/g)].map((m) => m[1]);
150+
assert.ok(mcpIds.length > 0, "nenhum id extraído de mestreTools — regex pode ter quebrado");
151+
152+
const missing = mcpIds.filter((id) => !catalogIds.has(id));
153+
assert.deepEqual(missing, [], `ids de mestreTools ausentes do catálogo: ${missing.join(", ")}`);
154+
});

0 commit comments

Comments
 (0)