Uh oh!
There was an error while loading. Please reload this page.
fix(cli): resolve optional-extra install commands and preserve extras on upgrade - #442
Merged
Merged
Conversation
Jason Robert (jrob5756)
marked this pull request as ready for review
August 14, 2026 20:00
Jason Robert (jrob5756)force-pushed
the
fix/441-fleet-tui-install-hint
branch
from
August 14, 2026 20:08
d7b35e3 to
4af4171Compare… on upgrade Every hint pointing at an optional extra hardcoded `pip install 'conductor-cli[<extra>]'`, which cannot work on the documented install path: install.sh/install.ps1 create a uv tool venv, which is not pip-managed, and conductor-cli is not published to PyPI so pip has nothing to resolve against there. Add `conductor.install_hint`, a stdlib-only leaf module that resolves the command from the detected install context -- a uv receipt, an editable `direct_url.json`, or neither. `conductor fleet` without the `tui` extra and the `aca` / `claude-agent-sdk` provider errors all go through it. The rendered command reuses the install source recorded for this install (so a fork or a local build is not redirected upstream), unions the extras already recorded (`uv tool install --force` replaces the whole requirement set, and `uv sync` is exact unless given `--inexact`), and names this interpreter for the pip fallback, which otherwise succeeds against a pipx venv while installing a second copy the user never runs. Both install scripts now read that same receipt and rebuild the source as `conductor-cli[<extras>] @ <source>`, so `conductor update` no longer silently uninstalls [tui]/[aca]. Adds `--extras` / `--no-preserve-extras` (plus env-var forms), rejects an extra the package does not declare (uv treats an unknown one as a warning and still exits 0), and quotes the spec into `Start-Process -ArgumentList`, which does not quote its elements and so handed uv three arguments instead of one. A receipt that exists but cannot be read is reported rather than treated as "no extras" in all three readers: the hint appends an inline warning, and the scripts warn and continue rather than either dropping the extras silently or refusing to run the reinstall that repairs that state. Closes#441 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Jason Robert (jrob5756)force-pushed
the
fix/441-fleet-tui-install-hint
branch
from
August 14, 2026 20:19
4af4171 to
7d7d2b5CompareUh oh!
There was an error while loading. Please reload this page.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for freeto join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes#441
The problem
Every hint pointing at an optional extra hardcoded
pip install 'conductor-cli[<extra>]'. That cannot work on the documented install path:install.sh/install.ps1runuv tool install, and a uv tool venv is not pip-managed — plusconductor-cliis not published to PyPI, so pip has nothing to resolve against there.Two related defects, both included here at Jason Robert (@jrob5756)'s request:
acahad the same dead string (and so didclaude-agent-sdk) — these were reachable asProviderError.suggestion, not just docstrings.conductor updatesilently uninstalled your extras.uv tool install --forcereplaces the tool's entire requirement set, and the install scripts passed a bare git source, so upgrading dropped[tui]/[aca]without saying anything.What this does
New
conductor.install_hint— a stdlib-only leaf module (top-level, becauseproviders/needs it and must not import fromcli/). Resolves the command from the detected install context:<prefix>/uv-receipt.tomluv tool install --force '<spec>'direct_url.jsonwithdir_info.editableuv sync --inexact --extra <extra><sys.executable> -m pip install '<spec>'Four properties are load-bearing:
--forcerewrites the requirement set anduv syncis exact unless given--inexact, so a command naming only the requested extra uninstalls the others.git/directory/url, elsedirect_url.json), so the hint never redirects a fork or a local build at upstream's released tag.pipdoes not manage a pipx venv — there it succeeds, installing a second copy the user never runs whileconductor fleetkeeps printing the same error.Both install scripts read the same receipt and rebuild the source as
conductor-cli[<extras>] @ <source>, soconductor updatepreserves extras. New--extras <a,b>/--no-preserve-extras(plusCONDUCTOR_INSTALL_EXTRAS/CONDUCTOR_INSTALL_NO_PRESERVE_EXTRAS).Bugs found and fixed during review
--no-preserve-extraswas a silent no-op on an up-to-date install — the gate compared against a variable the flag itself zeroed, so the shortcut fired and reported success.Start-Process -ArgumentListjoins elements with spaces and does not quote them, soconductor-cli[tui] @ <src>split apart and the extras were dropped. Verified broken, and fixed, against realpwsh.uvexits 0 with only a warning for an unknown extra — a typo installed nothing under two green checkmarks. Extras are now validated up front and the warning is surfaced on the success path.installed_extras()could raise despite documenting "never raises" — from inside aProviderError(...)argument, which deleted the diagnosis rather than degrading the hint.uv sync --extrabeing exact by default, PEP 503 name normalization, whole-fieldname =matching (soconductor-cli-pluginis not folded in), and case normalization so the two installers agree.Verification
make checkclean; 7150 passed / 62 skipped.--applyordering, and the up-to-date gate.uv tool installruns confirm preserve / add / drop end-to-end.install.shhelpers are executed for real;install.ps1helpers are extracted with PowerShell's own AST parser and executed underpwsh, with a parity class feeding both the same receipt, and a shared oracle asserting the shell and Python parsers agree.Known gaps
Format-ProcessArgumentdoes not escape a trailing backslash in a path — unreachable today, since the only such argument isJoin-Path $tmpDir 'constraints.txt'.install_scripts-marked Windows test drivesinstall.ps1with extras end-to-end; AST-level helper tests and a static call-site check cover it short of a real Windows install.