feat(ecosystem): add pipx as a package manager OpenFreshr tracks - #49
Merged
Merged
Conversation
Reopens issue #29's pipx question. Its original finding was correct at the time: older pipx had no safe, read-only "what's outdated" command — `pipx upgrade` ran immediately, no dry-run, and the only honest check meant a per-package network call to the index. Verified directly against real `pipx 1.17.3`, not assumed: that gap is closed. `pipx list --outdated --json` is genuinely read-only (confirmed: running it repeatedly changes nothing) and returns a clean, structured report per outdated package. - PipxEcosystem: `pipx list --outdated --json` for the check, `pipx upgrade --output json -- <name>` for the update. Simpler than npm/pnpm's contract in one way — verified pipx exits 0 whether or not anything is outdated, so there's no exit-code heuristic to get wrong, the payload alone carries the answer. - EcosystemKind.pipx already existed as an unused placeholder; this wires it into AppViewModel's EcosystemCoordinator for the first time. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01K1v8n32LeqiPZd5vazB8q1
# Conflicts: # Sources/OpenFreshrApp/AppViewModel.swift # Tests/OpenFreshrCoreTests/EcosystemTests.swift
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 free
to 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.
Why
Reopens the pipx half of #29. The original finding (comment on that issue) was correct at the time:
pipxhad no safe, read-only "what's outdated" command —pipx upgraderan immediately with no dry-run, and an honest check would have meant a network call to the package index per venv, a different pattern than the other ecosystems.Verified directly against real
pipx 1.17.3while investigating package-manager coverage more broadly (alongside #47's pnpm work) — that gap is closed:pipx list --outdated --jsonis genuinely read-only (confirmed by running it repeatedly and observing nothing changes) and returns a clean, structured report.What changed
PipxEcosystem:pipx list --outdated --jsonfor the check,pipx upgrade --output json -- <name>for the update. Verified real shapes, not assumed:{"data": {"packages": [{package, version, latest_version, environment, injected, pinned}], packages_checked, skipped}}.pipx list --outdatedexits0whether or not anything is outdated, so there's no exit-code heuristic to get wrong; the payload alone carries the answer.--separator before the package name accepted (confirmed).EcosystemKind.pipxalready existed as an unused placeholder (from the original Backend: Sprach-Paketmanager (npm, pip/pipx, cargo, gem) #29 attempt); this is the first PR that actually wires it intoAppViewModel'sEcosystemCoordinator.Testing
swift test: 352/352 passing, including a newPipxEcosystemTestssuite (real JSON shape, up-to-date, non-zero-exit failure, hostile-name rejection, wrong-ecosystem-tag rejection).swift format lint --strict: clean.make app: succeeds.🤖 Generated with Claude Code
https://claude.ai/code/session_01K1v8n32LeqiPZd5vazB8q1