Sync: Complete project state with all MEGA SPRINT V1-V3 features and Codex stubs
This commit is contained in:
137
ralph/scripts/Invoke-ClaudeProvider.ps1
Normal file
137
ralph/scripts/Invoke-ClaudeProvider.ps1
Normal file
@@ -0,0 +1,137 @@
|
||||
param(
|
||||
[Parameter(Mandatory = $true)][string]$ProviderName,
|
||||
[Parameter(Mandatory = $true)][string]$PromptFile,
|
||||
[Parameter(Mandatory = $true)][string]$OutputFile,
|
||||
[string]$WorkingDirectory = "",
|
||||
[string[]]$AddDirectories = @(),
|
||||
[ValidateSet("json", "text")][string]$OutputFormat = "json"
|
||||
)
|
||||
|
||||
. (Join-Path $PSScriptRoot "Common.ps1")
|
||||
|
||||
if ([string]::IsNullOrWhiteSpace($WorkingDirectory)) {
|
||||
$WorkingDirectory = Get-RepoRoot
|
||||
}
|
||||
|
||||
$provider = Get-ProviderConfig -Name $ProviderName
|
||||
$runner = [string]$provider.runner
|
||||
$promptText = Get-Content -Raw -Path $PromptFile
|
||||
Ensure-Directory -Path (Split-Path -Parent $OutputFile)
|
||||
|
||||
if ($runner -eq "opencode") {
|
||||
$opencodeCommand = Get-Command opencode -ErrorAction SilentlyContinue
|
||||
if ($null -eq $opencodeCommand) {
|
||||
throw "opencode executable not found in PATH."
|
||||
}
|
||||
|
||||
$arguments = @(
|
||||
"run",
|
||||
"--dir", $WorkingDirectory,
|
||||
"--model", [string]$provider.model,
|
||||
"--format", "json"
|
||||
)
|
||||
$agentProp = $provider.PSObject.Properties["agent"]
|
||||
if ($null -ne $agentProp -and -not [string]::IsNullOrWhiteSpace([string]$agentProp.Value)) {
|
||||
$arguments += @("--agent", [string]$agentProp.Value)
|
||||
}
|
||||
$variantProp = $provider.PSObject.Properties["variant"]
|
||||
if ($null -ne $variantProp -and -not [string]::IsNullOrWhiteSpace([string]$variantProp.Value)) {
|
||||
$arguments += @("--variant", [string]$variantProp.Value)
|
||||
}
|
||||
$arguments += @($promptText)
|
||||
|
||||
$output = @(& $opencodeCommand.Source @arguments 2>&1)
|
||||
$exitCode = $LASTEXITCODE
|
||||
|
||||
$result = [ordered]@{
|
||||
provider = $ProviderName
|
||||
runner = "opencode"
|
||||
model = [string]$provider.model
|
||||
working_directory = $WorkingDirectory
|
||||
prompt_file = $PromptFile
|
||||
output_format = "json"
|
||||
timestamp = (Get-Date).ToString("o")
|
||||
exit_code = $exitCode
|
||||
output = ($output -join [Environment]::NewLine)
|
||||
}
|
||||
|
||||
Write-Utf8File -Path $OutputFile -Content (($result | ConvertTo-Json -Depth 100) + "`n")
|
||||
|
||||
if ($exitCode -ne 0) {
|
||||
throw "Provider '$ProviderName' failed with exit code $exitCode. See $OutputFile"
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
$envNames = @(
|
||||
"ANTHROPIC_BASE_URL",
|
||||
"ANTHROPIC_AUTH_TOKEN",
|
||||
"API_TIMEOUT_MS",
|
||||
"CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC",
|
||||
"ANTHROPIC_MODEL",
|
||||
"ANTHROPIC_SMALL_FAST_MODEL",
|
||||
"ANTHROPIC_DEFAULT_HAIKU_MODEL",
|
||||
"ANTHROPIC_DEFAULT_SONNET_MODEL",
|
||||
"ANTHROPIC_DEFAULT_OPUS_MODEL",
|
||||
"CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS"
|
||||
)
|
||||
|
||||
$previous = @{}
|
||||
foreach ($name in $envNames) {
|
||||
$previous[$name] = [Environment]::GetEnvironmentVariable($name, "Process")
|
||||
}
|
||||
|
||||
try {
|
||||
[Environment]::SetEnvironmentVariable("ANTHROPIC_BASE_URL", [string]$provider.base_url, "Process")
|
||||
[Environment]::SetEnvironmentVariable("ANTHROPIC_AUTH_TOKEN", [string]$provider.auth_token, "Process")
|
||||
[Environment]::SetEnvironmentVariable("API_TIMEOUT_MS", [string]$provider.timeout_ms, "Process")
|
||||
[Environment]::SetEnvironmentVariable("CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC", "1", "Process")
|
||||
[Environment]::SetEnvironmentVariable("ANTHROPIC_MODEL", [string]$provider.model, "Process")
|
||||
[Environment]::SetEnvironmentVariable("ANTHROPIC_SMALL_FAST_MODEL", [string]$provider.model, "Process")
|
||||
[Environment]::SetEnvironmentVariable("ANTHROPIC_DEFAULT_HAIKU_MODEL", [string]$provider.model, "Process")
|
||||
[Environment]::SetEnvironmentVariable("ANTHROPIC_DEFAULT_SONNET_MODEL", [string]$provider.model, "Process")
|
||||
[Environment]::SetEnvironmentVariable("ANTHROPIC_DEFAULT_OPUS_MODEL", [string]$provider.model, "Process")
|
||||
[Environment]::SetEnvironmentVariable(
|
||||
"CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS",
|
||||
$(if ($provider.experimental_agent_teams) { "1" } else { "0" }),
|
||||
"Process"
|
||||
)
|
||||
|
||||
$claudeArgs = @(
|
||||
"-p",
|
||||
"--output-format", $OutputFormat,
|
||||
"--dangerously-skip-permissions",
|
||||
"--model", [string]$provider.model
|
||||
)
|
||||
|
||||
foreach ($path in @($WorkingDirectory) + $AddDirectories) {
|
||||
if (-not [string]::IsNullOrWhiteSpace($path)) {
|
||||
$claudeArgs += @("--add-dir", $path)
|
||||
}
|
||||
}
|
||||
|
||||
$output = $promptText | & claude @claudeArgs "-" 2>&1
|
||||
$exitCode = $LASTEXITCODE
|
||||
}
|
||||
finally {
|
||||
foreach ($name in $envNames) {
|
||||
[Environment]::SetEnvironmentVariable($name, $previous[$name], "Process")
|
||||
}
|
||||
}
|
||||
|
||||
$result = [ordered]@{
|
||||
provider = $ProviderName
|
||||
model = [string]$provider.model
|
||||
working_directory = $WorkingDirectory
|
||||
prompt_file = $PromptFile
|
||||
output_format = $OutputFormat
|
||||
timestamp = (Get-Date).ToString("o")
|
||||
exit_code = $exitCode
|
||||
output = ($output -join [Environment]::NewLine)
|
||||
}
|
||||
|
||||
Write-Utf8File -Path $OutputFile -Content (($result | ConvertTo-Json -Depth 100) + "`n")
|
||||
|
||||
if ($exitCode -ne 0) {
|
||||
throw "Provider '$ProviderName' failed with exit code $exitCode. See $OutputFile"
|
||||
}
|
||||
Reference in New Issue
Block a user