Skip to content

feat(install): "Install all" button for staged packages (#137)#174

Merged
phantomptr merged 1 commit into
mainfrom
feat/pkg-install-all
Jul 6, 2026
Merged

feat(install): "Install all" button for staged packages (#137)#174
phantomptr merged 1 commit into
mainfrom
feat/pkg-install-all

Conversation

@phantomptr

Copy link
Copy Markdown
Owner

Description

Implements #137 — an "Install all" button on the Install Package screen — and completes the WIP that was trimmed in #173.

Today, installing several staged packages means clicking Install on each row and waiting. This adds one button that installs every staged, not-yet-installed package sequentially, in the correct order.

Why the ordering matters

Sony's installer will accept an update or DLC whose base game isn't installed yet — and then land nothing. So a naive "install all" that hit rows in listing order could silently no-op the add-ons. installAll sorts by pkgEntryInstallOrder (base → update → DLC, from the PARAM.SFO category with a /updates/·/dlc/ path-hint fallback for headerless rows), mirroring the existing uploadQueue.installOrderPriority.

Changes

  • state/pkgLibrary.tspkgEntryInstallOrder helper, installAll(host) action, installingAll state. installAll snapshots the idle/not-installed rows, sorts them, and awaits each existing install() (which self-serializes on installing and never throws — a single failure can't abort the batch). One summary bell at the end; each item's own success/failure bell still fires. No-op if an install is already running.
  • screens/InstallPackage/index.tsx — "Install all (N)" header button, shown only when >1 row is installable (a single row already has its own Install button), disabled while any install runs.
  • state/pkgLibrary.test.ts — 5 cases pinning pkgEntryInstallOrder.
  • i18n/locales/en.ts + scripts/i18n-known-missing.json — two new keys, allowlisted for all 17 non-English locales per the coverage gate.

Client-only — no payload/engine changes.

Type of Change

  • New feature (non-breaking)

Testing

typecheck + lint + 759 Vitest tests (5 new) + i18n coverage (18 langs) + vite build all green.

Closes #137.

🤖 Generated with Claude Code

…n order

Implements #137's install-all request (and completes the WIP trimmed in
#173). The Install Package screen gains an "Install all (N)" header button
that installs every staged, not-yet-installed package sequentially through
the existing readiness-gated install() cascade, in base -> update -> DLC
order so an add-on never installs before its base (Sony's installer accepts
an update/DLC whose base isn't present yet but then lands nothing).

- pkgLibrary.ts: `pkgEntryInstallOrder` (mirrors uploadQueue.installOrderPriority
  for a PkgEntry) + `installAll` action + `installingAll` state. installAll
  snapshots the idle, not-installed rows, sorts by order, and awaits each
  install() (which self-serializes on `installing` and never throws), counting
  outcomes; one summary bell at the end. No-op if an install is already running.
- InstallPackage screen: "Install all (N)" button, shown only when >1 row is
  installable (a single row already has its own Install button), disabled while
  any install runs.
- pkgLibrary.test.ts: 5 cases pinning pkgEntryInstallOrder (category order,
  path-hint fallback, category-beats-path, batch sort).
- en.ts + i18n-known-missing.json: two new keys, allowlisted for all 17
  non-English locales per the coverage gate.

Client-only; no payload/engine changes. typecheck + lint + 759 tests + i18n
(18 langs) + vite build all green.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@phantomptr phantomptr merged commit 775487b into main Jul 6, 2026
19 checks passed
@phantomptr phantomptr deleted the feat/pkg-install-all branch July 6, 2026 00:30
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.

pkg installing improvement

1 participant