diff options
Diffstat (limited to 'scripts/Verify-PublishedHttp.ps1')
| -rw-r--r-- | scripts/Verify-PublishedHttp.ps1 | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/scripts/Verify-PublishedHttp.ps1 b/scripts/Verify-PublishedHttp.ps1 new file mode 100644 index 0000000..a02a28b --- /dev/null +++ b/scripts/Verify-PublishedHttp.ps1 @@ -0,0 +1,87 @@ +param( + [string]$BundlePath = 'build\Release\publish\agent-sandbox-mcp-1.0.0-win-x64', + [string]$TestRoot = 'C:\tmp', + [string]$EvidenceRoot = 'artifacts\evidence\published-http-cmd-verification' +) + +$ErrorActionPreference = 'Stop' +$OutputEncoding = [Text.UTF8Encoding]::new($false) +[Console]::OutputEncoding = $OutputEncoding +$repository = (Resolve-Path (Join-Path $PSScriptRoot '..')).Path +$bundle = [IO.Path]::GetFullPath((Join-Path $repository $BundlePath)) +$publishRoot = [IO.Path]::GetFullPath((Join-Path $repository 'build\Release\publish')) +if (-not $bundle.StartsWith($publishRoot + [IO.Path]::DirectorySeparatorChar, [StringComparison]::OrdinalIgnoreCase)) { + throw 'BundlePath must remain inside build\Release\publish.' +} +$testRootPath = (Resolve-Path -LiteralPath $TestRoot).Path +$evidence = [IO.Path]::GetFullPath((Join-Path $repository $EvidenceRoot)) +if (-not $evidence.StartsWith($repository + [IO.Path]::DirectorySeparatorChar, [StringComparison]::OrdinalIgnoreCase)) { + throw 'Evidence output must remain inside the repository.' +} +$administrator = ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole( + [Security.Principal.WindowsBuiltInRole]::Administrator) +if (-not $administrator) { throw 'Published HTTP verification must run as Windows Administrator.' } + +$agent = Join-Path $bundle 'agent-mcp.exe' +$config = Join-Path $bundle 'agent.yaml' +$clientProject = Join-Path $repository 'scripts\E2EClient\E2EClient.csproj' +$runRoot = Join-Path $testRootPath ('agent-mcp-http-cmd-' + [Guid]::NewGuid().ToString('N')) +$runRootForward = $runRoot.Replace('\', '/') +$endpoint = 'http://127.0.0.1:8080/mcp' +$log = Join-Path $evidence 'verification.log' +$server = $null +New-Item -ItemType Directory -Force -Path $evidence | Out-Null +New-Item -ItemType Directory -Path $runRoot | Out-Null +$aclBefore = (Get-Acl -LiteralPath $runRoot).Sddl + +$request = @" +実作業を行ってください。作業ディレクトリは $runRootForward です。 +file_editで probe.py と run-probe.cmd を作成してください。 +probe.pyはsys.prefixがC:\tmp\.venvであることを検証し、VENV_PYTHON_OKと表示してください。 +run-probe.cmdは次を順番に実行し、どれかが失敗したら非0で終了してください。 +1. 非修飾名 cmd.exe を子Processとして実行する。 +2. 非修飾名 curl.exe --version を子Processとして実行する。 +3. curl.exeで $endpoint へ接続を試み、sandbox.network.access=noneにより失敗することを確認する。接続できた場合は失敗とする。 +4. Workspace相対path ..\.venv\Scripts\python.exe でprobe.pyを実行する。 +最後にInternal Tool process_runを executable=cmd、cwd=$runRootForward、args=["/d","/c","call run-probe.cmd"] で実行し、exit code 0とCMD_HTTP_MCP_OKを確認してください。説明だけで完了せず、必ずファイル作成とprocess_runを実行してください。 +"@ + +try { + & $agent check --config $config --lang ja 2>&1 | Tee-Object -FilePath $log + if ($LASTEXITCODE -ne 0) { throw "Published check failed with exit code $LASTEXITCODE." } + + $server = Start-Process -FilePath $agent -ArgumentList @('serve','--config',$config,'--lang','ja','--transport','http') ` + -WorkingDirectory $bundle -WindowStyle Hidden -PassThru + $ready = $false + for ($attempt = 0; $attempt -lt 100; $attempt++) { + if ($server.HasExited) { throw "Published server exited before readiness: $($server.ExitCode)" } + try { + $response = Invoke-WebRequest -Uri $endpoint -Method Get -SkipHttpErrorCheck + if ($response.StatusCode -eq 405) { $ready = $true; break } + } + catch { } + Start-Sleep -Milliseconds 100 + } + if (-not $ready) { throw 'Published HTTP MCP server did not become ready.' } + + dotnet run --project $clientProject -c Release --no-build -- http $endpoint unused $request 2>&1 | + Tee-Object -FilePath $log -Append + if ($LASTEXITCODE -ne 0) { throw "HTTP MCP agent_run failed with exit code $LASTEXITCODE." } + if (-not (Test-Path -LiteralPath (Join-Path $runRoot 'probe.py')) -or + -not (Test-Path -LiteralPath (Join-Path $runRoot 'run-probe.cmd'))) { + throw 'MCP Task did not create the required verification files.' + } +} +finally { + if ($server -and -not $server.HasExited) { $server.Kill($true); $server.WaitForExit() } + if (Test-Path -LiteralPath $runRoot) { + if ((Get-Acl -LiteralPath $runRoot).Sddl -ne $aclBefore) { throw 'MCP Task did not restore the test directory ACL.' } + $resolvedRunRoot = (Resolve-Path -LiteralPath $runRoot).Path + if (-not $resolvedRunRoot.StartsWith($testRootPath.TrimEnd('\') + '\', [StringComparison]::OrdinalIgnoreCase)) { + throw 'Refusing to clean a test directory outside TestRoot.' + } + Remove-Item -LiteralPath $resolvedRunRoot -Recurse -Force + } +} + +Write-Output "Published HTTP MCP cmd verification PASS. Evidence: $evidence" |
