10 Commits
Author SHA1 Message Date
kriss b6d113edcd feat: switch accent to Plum, finalize vault-door app icon, group filter Clear button
- Replace Copper accent with Plum (light #6B4577 / dark #A67FB0) across the main
  app and AutoFill extension.
- Replace the padlock app icon with a vault-door design (ring, hub, locking
  handle) in Plum, plus all macOS sizes.
- Add an AppIconImage asset (separate from the AppIcon icon-set, which SwiftUI
  can't reference directly at runtime) and show it on the unlock screen instead
  of a generic SF Symbol.
- GroupFilterView: move "Clear Filter" out of the list and into a leading
  toolbar button ("Clear", disabled when no filter is active), mirroring the
  trailing "Done" button.
2026-09-20 18:25:41 +02:00
kriss 8bba64076f feat: copper accent theme, always-expanded group filter, app icon; rename MyPass to KeeVault
- Custom copper AccentColor and warm VaultBackground color assets (light/dark),
  applied to both the main app and the AutoFill extension (which needed its own
  copy of the asset catalog plus ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME
  and an explicit .tint() modifier, since extensions don't pick up the app-wide
  accent color the same way a full SwiftUI App/Scene does).
- GroupFilterView no longer uses DisclosureGroup for subgroups -- the whole tree
  renders always-expanded (indented per depth) so active filters are visible at
  a glance instead of requiring tap-to-expand.
- Added a placeholder app icon (padlock glyph, light/dark/tinted variants plus
  macOS sizes) -- previously the icon slot existed but had no actual images,
  which blocks App Store/TestFlight archive validation.
- Added ITSAppUsesNonExemptEncryption = NO (standard encryption only, via
  KeePassKit) to skip the export-compliance prompt on each upload.
- Renamed the app from MyPass to KeeVault throughout: Xcode project/targets/
  schemes, the MyPassCore package (now KeeVaultCore) and every import site,
  folder and file names, bundle identifiers (org.antiloop222.keevault) and
  their App Group/Keychain-group entitlements, and remaining UI/string
  references -- MyPass was already taken as an App Store app name.
2026-09-20 15:05:19 +02:00
kriss a8d612f745 fix: resolve real-device blockers for vault open, biometrics, and AutoFill
- FileBookmarkService: hold a security scope while creating the bookmark,
  fixing "file doesn't exist" on iCloud Drive-backed vaults (NSCocoaErrorDomain
  Code=4), which only surfaced on a real device since the Simulator strips
  entitlements needed to reproduce this.
- Fix Keychain access group missing the Team ID prefix, which silently broke
  saving the master password so Face ID was never offered after backgrounding.
- Add the autofill-credential-provider entitlement to the main app target
  (previously only on the extension) and declare ProvidesPasswords in the
  extension's Info.plist, so MyPass now registers as a selectable AutoFill
  Passwords provider.
- CredentialMatcher: fall back to a scheme-prefixed re-parse when extracting a
  host, since KDBX entries commonly store bare domains (e.g. "allocine.fr")
  that URL(string:).host can't parse without an authority component. Fixes
  AutoFill suggestions being unranked/wrong for such entries.
2026-09-20 12:39:45 +02:00
krissandClaude Sonnet 5 5a59867d48 fix: align AutoFill keychain-access-group with main app, lowercase bundle IDs
Root-caused the "MyPass doesn't appear in Settings > AutoFill Passwords"
issue: entitlements embed correctly on a real device build but are
silently stripped to empty on every Simulator build in this
environment (confirmed identically via CLI xcodebuild and Xcode's own
GUI build/run, before and after multiple rounds of removing/re-adding
capabilities in Signing & Capabilities). This is a Simulator/SDK-level
limitation in this environment, not a project misconfiguration --
verified by comparing against a real iphoneos device build, which
embeds the full App Group / Keychain Sharing / AutoFill Credential
Provider entitlements correctly.

While diagnosing, found and fixed a real, separate bug: AutoFill's
Keychain Sharing group had been set (via Xcode's capability re-add
flow, which defaults to the target's own bundle ID) to
org.antiloop222.mypass.autofill, while the main app uses
org.antiloop222.mypass -- a mismatch that would have prevented the
extension from ever reading the shared master password from Keychain,
even on a real device where entitlements embed correctly. Now aligned
to org.antiloop222.mypass on both targets, matching what
KeychainStore's hardcoded accessGroup expects in both AutoFill/
CredentialProviderViewController.swift and MyPass/ViewModels/
UnlockViewModel.swift.

Also includes the user's own Signing & Capabilities re-add (repopulated
App Group selections) and a bundle-identifier lowercase normalization
(org.antiloop222.MyPass -> org.antiloop222.mypass, matching the
already-lowercase App Group/Keychain group strings) made via Xcode's
GUI.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WYqycDFsynHH9VnnK7LNSf
2026-09-19 22:03:34 +02:00
krissandClaude Sonnet 5 5281ce4895 fix: address AutoFill extension code review findings
- Remove dead provideCredentialWithoutUserInteraction override and
  unlockSilently() helper (nothing registers credential identities,
  so it could never run, and it was a footgun for future inline
  QuickType work).
- Surface non-cancellation biometric unlock failures into
  errorMessage instead of swallowing them, matching
  UnlockViewModel.unlockWithBiometrics().
- Forward VaultSession.objectWillChange into ExtensionViewModel via
  Combine so the lock/unlock UI transition no longer depends on an
  accidental isUnlocking side effect, matching VaultViewModel's
  pattern.
- Show the "Open MyPass" deep-link escape hatch whenever unlock
  fails (errorMessage set), not only when there's no bookmark yet,
  per the extension constraints spec.
- Add INFOPLIST_KEY_NSFaceIDUsageDescription to the MyPass and
  AutoFill targets' Debug/Release build configs.

Also folds in pre-existing alphabetical reordering of two
PBXBuildFile/PBXFileReference entries in project.pbxproj from an
earlier task, since this same file is already being touched here.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WYqycDFsynHH9VnnK7LNSf
2026-09-19 19:24:35 +02:00
krissandClaude Haiku 4.5 e52cf3f39b feat: add CredentialListView for AutoFill extension
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WYqycDFsynHH9VnnK7LNSf
2026-09-19 19:15:16 +02:00
krissandClaude Sonnet 5 a70ea40acd feat: add ExtensionRootView and ExtensionViewModel
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WYqycDFsynHH9VnnK7LNSf
2026-09-19 19:12:49 +02:00
krissandClaude Sonnet 5 3ee729070a feat: add CredentialProviderViewController skeleton, strip unused storyboard UI
Replace the Xcode boilerplate in AutoFill/CredentialProviderViewController.swift
with real logic: prepareCredentialList(for:) builds ExtensionRootView (added in
Task 19) inside a UIHostingController, provideCredentialWithoutUserInteraction(for:)
silently unlocks via the shared Keychain token and completes/cancels the request.
Strip the storyboard's now-unused static nav-bar/button/actions, keeping the same
customClass so the system still instantiates this exact class.

Also add AutoFill target membership for MyPass/Services/FileBookmarkService.swift
and BiometricAuthService.swift (app-target files, referenced directly by the
extension per the plan) via explicit PBXFileReference/PBXBuildFile entries, since
Xcode's synchronized-group file system only auto-includes them in the MyPass
target by default.

Expected build state: exactly one error, "cannot find 'ExtensionRootView' in
scope" (reported once per simulator architecture), until Task 19 adds that type.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WYqycDFsynHH9VnnK7LNSf
2026-09-19 19:08:54 +02:00
krissandClaude Sonnet 5 ac787a0c9e feat: complete AutoFill target capability wiring
Adds App Groups + Keychain Sharing entitlements to the AutoFill
target (matching the main app's group.org.antiloop222.mypass /
org.antiloop222.mypass), sets REGISTER_APP_GROUPS so automatic
signing registers the capability, and links MyPassCore as a
framework dependency by reusing the existing local package product
reference. Verified with `xcodebuild -scheme AutoFill build` for the
iOS Simulator: the AutoFill.appex target builds, signs, and embeds
cleanly (the only build failure is the pre-existing, expected
ContentView.swift/Item SwiftData breakage in the MyPass app target,
unrelated to this change).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WYqycDFsynHH9VnnK7LNSf
2026-09-19 15:50:11 +02:00
krissandClaude Sonnet 5 f017387dd5 chore: rename autofill target/folder to AutoFill
Also drops the stray empty AutoFillExtension/ directory left over from
an earlier abandoned attempt at creating this target, and cleans up
duplicate/stale scheme entries in xcschememanagement.plist.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WYqycDFsynHH9VnnK7LNSf
2026-09-19 15:37:31 +02:00