Skip to content

feat: manufacturer filter, grouped updates view, PDF export - #25

Open
bounceconnection wants to merge 8 commits into
devfrom
feature/parity-followups
Open

bounceconnection wants to merge 8 commits into
devfrom
feature/parity-followups

Conversation

@bounceconnection

Copy link
Copy Markdown
Owner

Stacked on #24 (which is stacked on #23). Until those merge, this PR's diff includes their commits too; it collapses to just the follow-ups once they land. Verified locally on macOS (Xcode 26.6): build clean, 372 tests pass, SwiftLint clean.

What this adds

  • Manufacturers sidebar filter — a Manufacturers section filters the library by publisher, ranked by plugin count (Plugoff-style). Extracted into a small helper so the sidebar stays easy for the compiler to type-check.
  • Grouped updates view — "Updates Available" now renders a PluginHub-style list grouped by vendor, each row showing the installed → available version diff and an architecture chip (Universal / Apple Silicon / Intel-only). Built from small, independent subviews.
  • PDF export — "Export as PDF…" in the File menu writes a paginated inventory PDF (via a new PluginInventoryPDF renderer using NSLayoutManager), alongside the existing CSV export.

Tests

New PluginInventoryPDF suite (valid PDF header, multi-page pagination, empty inventory). Suite now 372.

Note on the earlier CI failure

I kept every new SwiftUI expression small (extracted subviews) specifically to avoid the type-check timeout that the older CI Xcode hit on #24 — verifying here on CI before calling it done.

🤖 Generated with Claude Code

bounceconnection and others added 8 commits August 19, 2026 14:34
…ends

Two self-contained building blocks for the Plugoff-style features, each
with tests (345 tests pass total):

- PluginCategory + PluginCategoryClassifier: classifies plugins into
  functional categories (Synth, EQ, Dynamics, Reverb, ...) via a bundled
  plugin_categories.json (95 vendor/prefix rules) plus a name-keyword
  heuristic fallback. Resolution: longest bundle-id prefix > exact vendor
  > name keyword > heuristic > uncategorized.
- OffloadManager (actor) + OffloadRecord: moves plugin bundles to an
  offload folder to reclaim disk and restores them, with collision-safe
  path handling and size measured before the move.

UI/model integration follows in subsequent commits.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Pure, tested logic layers for the competitor-parity features:

- DuplicateDetector: cross-format duplicates (same plugin in VST3/AU/…)
  and location duplicates (same bundle+format in system & user folders),
  mirroring Plugoff's duplicate filter.
- ArchitectureCompatibility + RosettaSunsetSummary: flags Intel-only /
  legacy plugins that stop working when macOS 28 removes Rosetta, for the
  PluginHub-style warning banner.
- InsightsData: aggregates counts by format, category, and manufacturer
  plus totals, backing a Plugoff-style Insights view.

All pure value types, Sendable, deterministic. 21 new tests; suite now 366.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Plugin gains a `category` (persisted via categoryRaw, default uncategorized).
PluginReconciler runs PluginCategoryClassifier on insert and update so every
scanned plugin is categorized (Synth, EQ, Reverb, …). Adds a reconciler test.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Adds visible competitor-parity features to the dashboard:
- Categories sidebar section — filter the library by functional category
  (Synth, EQ, Reverb, …), with per-category counts (Plugoff-style).
- Cleanup > Duplicates filter — surfaces plugins installed in multiple
  formats or in both system and user folders (Plugoff-style).
- Compatibility > "Won't run in macOS 28" filter and a prominent red
  warning banner counting Intel-only / legacy plugins that break when
  Apple removes Rosetta (PluginHub-style).

All computed from the tested DuplicateDetector / ArchitectureCompatibility
layers. Suite: 367 tests pass.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Adds a Plugoff-style Insights sheet (toolbar chart button) built on the
tested InsightsData layer: overview tiles (plugins, manufacturers, total
size) plus Swift Charts bar breakdowns by format, category, and top
manufacturers, over currently-visible plugins.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Wires the tested OffloadManager into the app (Plugoff-style offloading):
- New OffloadedPlugin @model persists what was moved + where from.
- AppState.offloadPlugins moves bundles to ~/PluginventoryOffload and
  drops them from the active list; restoreOffloaded moves them back and
  rescans. Failures are surfaced, never silent; nothing is clobbered.
- Dashboard: right-click "Offload to Reclaim Space" (with a confirmation),
  a "Storage ▸ Offloaded (N) · X saved" sidebar entry, and a restore list.

Adds an offload↔restore round-trip integration test. Suite: 369 tests.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…imeout

The dashboard table was one ~230-line expression (Table + 12 modifiers).
Xcode 26.6 type-checks it fine, but the CI runner's older Xcode hit
"unable to type-check this expression in reasonable time". Extracted the
table, context menu, overlay, banner, footer, toolbar, dialog actions,
inspector, and search handler into small helpers so no single expression
is large. No behavior change.
Three more parity features:
- Manufacturers sidebar section filters the library by publisher, ranked
  by plugin count (Plugoff-style).
- "Updates Available" now shows a PluginHub-style vendor-grouped list with
  installed → available version diffs and architecture chips per row.
- "Export as PDF…" (File menu) writes a paginated inventory PDF next to the
  existing CSV export, via a new PluginInventoryPDF renderer.

New tests: PluginInventoryPDF (valid PDF, multi-page, empty). Suite: 372.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
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