Manifest text is now carried through the solver's ResolvedPkg and written directly to disk during install, eliminating the redundant re-fetch from the repository that could silently fail. save_manifest() is now mandatory (fatal on error) since the .p5m file on disk is the authoritative record for pkg verify and pkg fix. Add ADRs for libips API layer (GUI sharing), OpenID Connect auth, and SQLite catalog as query engine (including normalized installed_actions table). Add phase plans for code hygiene, client completion, catalog expansion, and OIDC authentication. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1.8 KiB
ADR-001: Elevate Business Logic into libips API Layer
Date: 2026-02-25 Status: Accepted
Context
pkg6 (CLI client) implements significant business logic inline in main.rs — install orchestration, solver advice generation, action plan creation, progress reporting, and package pattern parsing. A future GUI client must replicate all of this, leading to duplication or divergence.
The libips::api module already exists as a high-level facade (ManifestBuilder, Repository, PublisherClient, Lint) but covers only publishing workflows. Client-side operations (install, uninstall, update, search, verify, info, contents) have no library-level orchestration.
Decision
All client-side business logic moves into libips::api as composable operation types. The pattern:
libips::api::install::InstallOptions -> InstallPlan -> ActionPlan -> apply()
libips::api::search::SearchOptions -> SearchResults
libips::api::info::InfoQuery -> PackageDetails
pkg6 becomes a thin CLI adapter: parse args -> build options struct -> call libips -> format output.
A future GUI client imports the same libips::api types and calls the same methods.
Key Design Rules
- Options structs carry all configuration (dry_run, accept_licenses, concurrency, etc.)
- Progress reporting via trait object callbacks — CLI prints text, GUI updates progress bars
- No formatting in libips — return structured data, let consumers format
- Error types carry miette diagnostics — both CLI and GUI can render them
Consequences
- pkg6/src/main.rs shrinks dramatically
- GUI client shares 100% of logic with CLI
- Testing improves — library operations are unit-testable without CLI harness
- Breaking change for anyone importing libips directly (unlikely given current adoption)