From cb7e8dcbbc4907f68f105420535cb68bbc8ed87d Mon Sep 17 00:00:00 2001 From: Jason Robert Date: Wed, 25 Mar 2026 16:37:22 -0400 Subject: [PATCH] fix: add retry logic for Windows install and update lockfile MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add retry loop (3 attempts) to install.ps1 for Windows Defender file locking issue (astral-sh/uv#4690) - Show actionable Defender exclusion hint on persistent failure - Update uv.lock with latest anthropic (0.77.0 → 0.86.0) - Bump version to 0.1.5 --- install.ps1 | 29 ++++++++++++++++++++++++----- pyproject.toml | 2 +- uv.lock | 8 ++++---- 3 files changed, 29 insertions(+), 10 deletions(-) diff --git a/install.ps1 b/install.ps1 index 6bdf9f1..9d9f24f 100644 --- a/install.ps1 +++ b/install.ps1 @@ -105,12 +105,31 @@ try { } Write-Ok "Checksum verified" - # --- Install --- - Write-Info "Installing Conductor $tagName…" - uv tool install --force "git+https://github.com/$Repo.git@$tagName" -c $constraintsFile + # --- Install (with retry for Windows Defender file locking) --- + $maxRetries = 3 + $installed = $false + for ($attempt = 1; $attempt -le $maxRetries; $attempt++) { + if ($attempt -eq 1) { + Write-Info "Installing Conductor $tagName…" + } else { + Write-Info "Retrying install (attempt $attempt/$maxRetries)…" + Start-Sleep -Seconds 2 + } + uv tool install --force "git+https://github.com/$Repo.git@$tagName" -c $constraintsFile 2>$null + if ($LASTEXITCODE -eq 0) { + $installed = $true + break + } + } - if ($LASTEXITCODE -ne 0) { - Write-Err "uv tool install failed with exit code $LASTEXITCODE" + if (-not $installed) { + Write-Host "" + Write-Info "Install failed after $maxRetries attempts. This is often caused by" + Write-Info "Windows Defender scanning files during install. Try:" + Write-Info " 1. Add a Defender exclusion: Add-MpExclusion -Path `"$env:LOCALAPPDATA\uv`"" + Write-Info " 2. Re-run this installer" + Write-Host "" + Write-Err "uv tool install failed" } Write-Ok "Conductor $tagName installed" diff --git a/pyproject.toml b/pyproject.toml index a533e7a..5d4c0a1 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "conductor-cli" -version = "0.1.4" +version = "0.1.5" description = "A CLI tool for defining and running multi-agent workflows with the GitHub Copilot SDK" readme = "README.md" requires-python = ">=3.12" diff --git a/uv.lock b/uv.lock index 08fd048..cc0f58c 100644 --- a/uv.lock +++ b/uv.lock @@ -22,7 +22,7 @@ wheels = [ [[package]] name = "anthropic" -version = "0.77.0" +version = "0.86.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, @@ -34,9 +34,9 @@ dependencies = [ { name = "sniffio" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/eb/85/6cb5da3cf91de2eeea89726316e8c5c8c31e2d61ee7cb1233d7e95512c31/anthropic-0.77.0.tar.gz", hash = "sha256:ce36efeb80cb1e25430a88440dc0f9aa5c87f10d080ab70a1bdfd5c2c5fbedb4", size = 504575, upload-time = "2026-01-29T18:20:41.507Z" } +sdist = { url = "https://files.pythonhosted.org/packages/37/7a/8b390dc47945d3169875d342847431e5f7d5fa716b2e37494d57cfc1db10/anthropic-0.86.0.tar.gz", hash = "sha256:60023a7e879aa4fbb1fed99d487fe407b2ebf6569603e5047cfe304cebdaa0e5", size = 583820, upload-time = "2026-03-18T18:43:08.017Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ac/27/9df785d3f94df9ac72f43ee9e14b8120b37d992b18f4952774ed46145022/anthropic-0.77.0-py3-none-any.whl", hash = "sha256:65cc83a3c82ce622d5c677d0d7706c77d29dc83958c6b10286e12fda6ffb2651", size = 397867, upload-time = "2026-01-29T18:20:39.481Z" }, + { url = "https://files.pythonhosted.org/packages/63/5f/67db29c6e5d16c8c9c4652d3efb934d89cb750cad201539141781d8eae14/anthropic-0.86.0-py3-none-any.whl", hash = "sha256:9d2bbd339446acce98858c5627d33056efe01f70435b22b63546fe7edae0cd57", size = 469400, upload-time = "2026-03-18T18:43:06.526Z" }, ] [[package]] @@ -150,7 +150,7 @@ wheels = [ [[package]] name = "conductor-cli" -version = "0.1.2" +version = "0.1.4" source = { editable = "." } dependencies = [ { name = "anthropic" },