feat(repo-appearance): add data layer for per-repo icon and color
Introduce RepositoryAppearance — an optional icon + color pair persisted
in a global `~/.prowl/repository-appearances.json` keyed by Repository.ID
— so the sidebar, shelf spine, and canvas card can all read a single
`@Shared` dict at render time without per-repo file IO.
- RepositoryColorChoice: closed 10-color palette (Finder 7 + mint/cyan/pink)
resolved to system Colors only, encoded as raw case names for migration
safety.
- RepositoryIconSource: tagged enum (sfSymbol / bundledAsset / userImage)
encoded as a single marker-prefixed string, mirroring the TabIconSource
convention. PNG user images are explicitly non-tintable; SVGs are.
- RepositoryAppearancesKey: SharedKey backed by SettingsFileStorage with
empty-entry pruning so cleared rows don't accumulate dead JSON keys.
- RepositoryIconAssetStore: dependency-injected file gateway that imports
user-picked PNG/SVG into ~/.prowl/repo/<name>/icons/<uuid>.<ext>, so
removing the per-repo settings directory cleans the icons up too.
- SupacodePaths: add repositoryAppearancesURL, repositoryIconsDirectory,
and repositoryIconFileURL helpers.
Tests cover palette stability, storage-string round-trips for all three
icon sources, codable forward-compat, file IO golden paths, error
surfaces, and SharedKey load/save/empty-pruning semantics.