Skip to content

feat(ecosystem): add pipx as a package manager OpenFreshr tracks - #49

Merged
trsdn merged 2 commits into
mainfrom
feat/pipx-ecosystem
Sep 22, 2026
Merged

trsdn merged 2 commits into
mainfrom
feat/pipx-ecosystem

Conversation

@trsdn

@trsdn trsdn commented Sep 22, 2026

Copy link
Copy Markdown
Owner

Why

Reopens the pipx half of #29. The original finding (comment on that issue) was correct at the time: pipx had no safe, read-only "what's outdated" command — pipx upgrade ran 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.3 while investigating package-manager coverage more broadly (alongside #47's pnpm work) — that gap is closed: pipx list --outdated --json is genuinely read-only (confirmed by running it repeatedly and observing nothing changes) and returns a clean, structured report.

What changed

  • PipxEcosystem: pipx list --outdated --json for the check, pipx upgrade --output json -- <name> for the update. Verified real shapes, not assumed:
    • Check: {"data": {"packages": [{package, version, latest_version, environment, injected, pinned}], packages_checked, skipped}}.
    • Simpler than npm/pnpm in one respect — confirmed pipx list --outdated exits 0 whether 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.pipx already 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 into AppViewModel's EcosystemCoordinator.

Testing

  • swift test: 352/352 passing, including a new PipxEcosystemTests suite (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

trsdn and others added 2 commits September 22, 2026 21:03
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
@trsdn
trsdn merged commit d729304 into main Sep 22, 2026
12 checks passed
@trsdn
trsdn deleted the feat/pipx-ecosystem branch September 22, 2026 21:47
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant