Skip to content

Acquisition coherence: install / update / self-update across all 5 routes #15949

@radical

Description

@radical

Tracking issue for Aspire CLI acquisition coherence — making install, update, self-update, side-by-side coexistence, channel selection, and uninstall behave correctly across all 5 acquisition routes (get-aspire-cli.{sh,ps1}, get-aspire-cli-pr.{sh,ps1}, winget, Homebrew, dotnet-tool).

Detailed working state, design notes, decision write-ups, and the validation runbook live in @radical's fork (radical#50). This issue is updated sparsely with top-level todos only.

Goals

  1. Every route behaves correctly when invoked alone — no silent clobbers, no surprise prompts.
  2. Routes coexist safely side-by-side — no cross-route channel/hive/bundle contamination.
  3. The CLI knows what it is (route + channel intrinsic to the binary, not heuristic).
  4. Self-update is install-route-aware — winget/Homebrew/PR-dogfood paths opt out of in-place clobber.
  5. Running CLI + concurrent update do not corrupt each other (bundle layout + atomicity).
  6. Uninstall has a defined surface for each route, including shared-state cleanup.

Top-level todos

Research (Track A) — done

  • Behavior matrix (route × action), state-sharing map, pkg-mgr publishing pipelines, reparse-flip risk analysis

Implementation (Track B)

  • B0 — Detect install route at runtime (enum + sentinel + path-shape fallback)
  • B1 — Install scripts write install-route sentinel
  • B2aspire update --self route-aware: refuse / redirect / --break-install escape
  • B3 — Channel writes scoped per route
  • B4aspire uninstall with route-aware state sweep (--state-only, --purge)
  • B5 — Bundle layout per install-id; atomicity guarantees on Windows

In-flight or already merged contributors: #15932, #15947, #15938, #15951, #15604, #16408 (merged), native-AOT dotnet-tool (landed), #15600, #15601, #15614.

Validation (Track C)

  • SxS install detection fixture
  • Channel-contention test (cross-route)
  • Bundle-flip-while-running test
  • Manual runbook executions: winget, Homebrew, full SxS

Open decisions

7 decisions tracked privately on the working mirror. Brief leans:

  1. winget can ship prereleases; Homebrew stable-only.
  2. Bundle dirs scoped per install-id (route + location hash).
  3. Channel field becomes per-route in aspire.config.json.
  4. Hives become route-scoped under install-id.
  5. aspire uninstall refuses on pkg-mgr installs and redirects; --state-only [--purge] preserves the binary.
  6. Running-CLI + aspire update --self warns and proceeds (with --force-while-running to silence) once Windows atomicity gap closes.
  7. Self-update on pkg-mgr binary refuses by default; --break-install opts into clobber + warning; refusal message points to the script route for non-stable channels.

Related

/cc @mitchdenny @davidfowl @maddymontaquila @DamianEdwards @danegsta

Metadata

Metadata

Assignees

Type

No type
No fields configured for issues without a type.

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions