Releases: PackRat-AI/PackRat
PackRat v2.0.28
What's New
Features
- feat(expo): add Sentry instrumentation to remaining uninstrumented hooks and screens (31220f3)
- feat(pack-stats): add pack picker with search to PackStatsTile (5e6ed9c)
- feat(api): route AI providers through Cloudflare Gateway (ccfd7a6)
- feat(etl): GET /api/admin/analytics/catalog/audit endpoint (cbab838)
- feat(etl): U6 part 2 — @sentry/cloudflare wiring (10dbf60)
- feat(etl): migration 0050 — ETag fail-closed repair + supersession audit trail (4672fc8)
- feat(etl): U5 (minimal) — workflow-aware retry + reconcile admin endpoints (53bb3a7)
- feat(etl): U6 part 1 — structured logger + error propagation fixes (a1f942c)
- feat(etl): U7 invalid_item_logs retention sweep (1f8432f)
- feat(etl): U4 validator hardening — close SSRF, IDN, length, charset gaps (b99bb49)
- feat(etl): producer cutover — default to Workflow, retain queue fallback (eec7ec8)
- feat(etl): CatalogEtlWorkflow — durable ETL via Cloudflare Workflows (bcc7c9e)
- feat(etl): row-boundary-aligned R2 chunker (chunkCsvForR2) (35a45d8)
- feat(etl): U2 schema migration 0048 — Workflows-aware columns (a32f738)
- feat(etl): U1 standalone spike worker — Workflows verified GO (9216908)
- feat(etl): U1 Workflows spike (throwaway POC) (334fbdb)
- feat(web): web support MVP — platform shims, Playwright e2e, OTP fix (97771d5)
Bug Fixes
- fix(schemas): use .catch(null) on PackSchema category to handle legacy DB enum values (99f9a79)
- fix(expo): address copilot review — firstName/lastName empty-string fallthrough and WeightUnit runtime validation (4e1883b)
- fix(expo): fix biome import order and formatting in Sentry instrumentation (258c7b9)
- fix: avoid logging image content in Sentry extra data for analyzeImage (b5b10ea)
- fix(expo): add Sentry instrumentation across all error-handling paths (ea71280)
- fix(expo): preserve existing avatarUrl when session refresh lacks additionalFields (acd9cf1)
- fix(expo): preserve avatarUrl from Better Auth additionalField on session refresh (c81f19b)
- fix: expand inline type annotation to satisfy Biome formatter (f3a744b)
- fix: use single object param for getContextualSuggestions to satisfy no-owned-max-params lint rule (e112400)
- fix(ai): add defensive fallbacks for missing weather fields in WeatherGenerativeUI (adeb088)
- fix: pass isAuthenticated to Apple model init to fix auth tool gating (56cfd0a)
- fix(api/ai): remove debug logging from weather tool (b74a5a0)
- fix(ai): normalize cloud weather tool output to match local tool shape (e4ada6d)
- fix(ai): align WeatherGenerativeUI type with actual API response shape (4bdf954)
- fix(ai): guard details access in WeatherGenerativeUI against undefined (a2cbc07)
- fix: gate auth-required local AI tools for unauthenticated users (520735f)
- fix(e2e): remove placeholder DB URL fallback, fail loud if unset (e85008e)
- fix(web): sync NativeWind dark mode class to in web layout (e549bd2)
- fix(expo): use SafeAreaView in PackStatsTile modal for proper safe area handling (0603794)
- fix(expo/upcoming-trips): add right padding to status badge in trip list (ba71468)
- fix(expo/api): use clientEnvs shim in getApiBaseUrl (2048cc5)
- fix(expo/api): replace raw regex with split/join in getApiBaseUrl (06a506b)
- fix(expo): improve pack selection UX and dynamic API base URL (ee5a0b2)
- fix(expo/pack-stats): use dismissTo so Open Pack opens as stack screen not modal (02e530e)
- fix(expo/pack-stats): add meaningful empty states with action for Weight History and Category Distribution (7b9191d)
- fix(expo/ai): remove pointless retry from context overflow error card (8ff4716)
- fix(expo/ai): show specific error UI for local model context overflow (e128901)
- fix(expo/ai): remove auth gate from local AI navigation in pack/item detail screens (685a73a)
- fix(expo/ai-chat): add a bit of breathing room above location pill (e4d8687)
- fix(cached-image): distinguish permanent vs recoverable image errors (8c694e3)
- fix(cached-image): self-heal corrupted cache entries on render failure (d34f2b3)
- fix(test): align timingSafeEqual mock with object-arg signature (9e85a92)
- fix(api): guard catalog vector search embeddings (e1f3543)
- fix(catalog): handle nullable weights in clients (2411875)
- fix(catalog): allow unknown item weights (57ac5e5)
- fix(etl): guard variants.values.join crash when values is a string scalar (13efe08)
- fix(etl): address Copilot review — generic comment, doc alignment, chunkMiB test (d096a4a)
- fix(etl): reduce chunk size 5MB→2MB to clear Marmot WorkflowTimeoutError (5049a6f)
- fix(api/image-detection): make all schema fields required for OpenAI strict response_format (58c03c3)
- fix(etl): capture csv pump promise to prevent silent hang on R2 errors (3af10be)
- fix(api): clamp KV expirationTtl to minimum 60s (#2466) (f8f7be5)
- fix: strip .csv from workflow instance ID (CF Workflows invalid_id) (8397d9e)
- fix: address P0/P1 review findings on ETL workflow (9980ed4)
- fix(etl): drop isBoolean import — @packrat/guards doesn't export it (0f1c057)
- fix(etl): logger uses @packrat/guards type predicates instead of raw typeof (cbae081)
- fix(etl): CI failures — type errors, coverage threshold, hoisted mock (4bac86e)
- fix(etl): drop
as Errorcasts in CatalogEtlWorkflow (4af57df) - fix(ci): coverage report action path doubling (491ebb2)
- fix(auth): remove unused onFocus from OTPField (aac0449)
- fix(upload): narrow arr[1] to satisfy noUncheckedIndexedAccess (6590daf)
- fix(upload): guard against null userId and malformed data URLs (8ef6a38)
- fix(checks): exclude guides/lib/content.ts from cast scan (f532ce2)
- fix(packs): sort usePacks newest-first so E2E can find newly created pack (0fa1a22)
- fix(maestro): wait for keyboard animation before typing pack name on iOS (0495b4a)
- fix(maestro): use containerTestID for iOS pack name field instead of icon text (1127196)
- fix(maestro): update iOS Pack Name field selector to use folder icon (1301319)
- fix(auth): clear isLoadingAtom when auth screen mounts after sign-out (6fcdc46)
- fix(maestro): tap trips:start/end-date-btn to open the native date picker (4bbc4e6)
- fix(e2e): navigate to trip detail via SPA click to avoid bfcache (9432539)
- fix(e2e): wait for trips list GET before asserting deletion in trips test (c38f308)
- fix(patch): add testID to LargeTitleHeader searchBar type definition (8f46a1f)
- fix(patch): apply testID to LargeTitleHeader search button on web (fe92de3)
- fix(e2e): guard route.fetch against context-disposed error on browser close (f7e0a79)
- fix(e2e): strip Origin header via context.route() to bypass Better Auth INVALID_ORIGIN (248e470)
- fix(e2e): disable CORS in test browser to fix cross-origin API calls from localhost (559a002)
- fix(e2e): add React-props diagnostic + locator.press('Enter') for reliable submit (41c3b02)
- fix(auth+e2e): web localStorage fallback for expo-secure-store + fill() for globalSetup (72dd0b2)
- fix(e2e): catch ANY POST and log all network requests + page errors (24285c8)
- fix(e2e): debug form state and fix aria-disabled check for RNW Pressable (edf4cdb)
- fix(e2e): use native value-setter to update controlled form fields (083b540)
- fix(e2e): remove locator('input') wrapper and guard web button submit (1e821c1)
- fix(web-e2e): target input element directly and use page.keyboard for Enter submit (ff337ff)
- fix(web-e2e): submit login via Enter on password field, not button click (474f7ae)
- fix(web-e2e): use waitForResponse + explicit goto to fix globalSetup login timeout (e489a31)
- fix(biome): organize imports in useAuthActions (7fede0a)
- fix(biome): remove unused imports and duplicate testID prop (4f0ebca)
- fix(web-e2e): make catalog search assertion resilient to live data (015d05e)
- fix(web-e2e): restore pack-name-input/pack-description-input testIDs (f4d2d93)
- fix(web-e2e): gate email-input wrapper testID to non-web to fix Playwright strict-mode duplicate (4e5b790)
- fix(trips): add safe-cast annotation for expo-router Href (1d0d499)
- fix(trips): sort list newest-first and use replace when no back history (a8415c5)
- fix(web-e2e): navigate directly to trip detail before delete to avoid FlatList windowing (ec003eb)
- fix(trips): hard-delete via DELETE endpoint in useDeleteTrip, intercept DELETE in test (1769e18)
- fix(web-e2e): scope delete PUT filter to specific tripId, check response ok (8485dd2)
- fix(web-e2e): await PUT before page.goto for delete trip assertion (4a12476)
- fix(trips): soft-delete via PUT with deleted:true, intercept PUT in test (cd82252)
- fix(trips): add delete handler to syncedCrud and fix delete test (2835da4)
- fix(web-e2e): register dialog handler before trip delete button click (07985a9)
- fix(web-e2e): use window.confirm on web for item and trip delete (aec4099)
- fix(web-e2e): use Alert.alert (window.confirm on web) for item and trip delete (93720ad)
- fix(e2e): fix Alert imperative API and Dates section selector for web tests (01e3410)
- fix: remove location guard blocking trip sync, fix test selectors and retry loop (7d4cfc2)
- fix(e2e): fix waitForResponse timing, add missing test timeouts, patch nativewindui testID (e63d539)
- fix(types): restore catalog:search-btn testID via safe-cast pending nativewindui 2.0.6 (7f2968a)
- fix(types): remove searchBar testID prop not in published nativewindui type (a411610)
- fix(types): add missing TestIds import to CatalogItemDetailScreen and TripListScreen (713a276)
- fix(e2e): update packs:name-input → pack-name-input after testIds merge (19a24b7)
- fix(e2e): resolve remaining 9 failing web E2E tests (3e2e7cd)
- fix(e2e): fix add-from-catalog, item delete, and web alert (c7a7bb7)
- fix(e2e): add testIDs and fix all failing web E2E tests (90a8c7e)
- fix(web): drop ts-ignore from BackHandler patch — not needed in .js file...
v2.0.23
PackRat Mobile Release
Version 2.0.23 was submitted to iOS and Android stores.
Download on the App Store: https://apps.apple.com/app/id6499243187
Download on Google Play: https://play.google.com/store/apps/details?id=com.packratai.mobile&pli=1
What's Changed
- Release/2.0.22 by @mikib0 in #2263
- Unify search UI pattern across Guides, Pack Templates, and Trips screens by @Copilot in #2266
- fix(expo): TextInput not losing focus after dismissing keyboard by @mikib0 in #2267
- fix(expo): resolve packId type incompatibility in TripForm by @Copilot in #2265
- Fix merge-main-to-development workflow for protected branch by @Copilot in #2264
- Main -> Development by @mikib0 in #2269
Full Changelog: v2.0.22...v2.0.23
v2.0.23-alpha.1
Merge pull request #2268 from PackRat-AI/claude/complete-type-safety-…
v2.0.22
PackRat Mobile Release
Version 2.0.22 was submitted to iOS and Android stores.
Download on the App Store: https://apps.apple.com/app/id6499243187
Download on Google Play: https://play.google.com/store/apps/details?id=com.packratai.mobile&pli=1
What's Changed
- 📝 docs: clarify NATIVEWIND token export for bun install by @andrew-bierman in #2225
- Release/2.0.21 by @mikib0 in #2226
- Fix/Header-title-missing by @Isthisanmol in #2212
- Main -> Development by @mikib0 in #2227
- Fix/trip form issues by @Isthisanmol in #2258
- fix(expo): consistent fixed search bar in tab screens by @mikib0 in #2261
- fix(expo): #2256 broken search UI layout by @mikib0 in #2262
Full Changelog: v2.0.21...v2.0.22
v2.0.21
PackRat Mobile Release
Version 2.0.21 was submitted to iOS and Android stores.
Download on the App Store: https://apps.apple.com/app/id6499243187
Download on Google Play: https://play.google.com/store/apps/details?id=com.packratai.mobile&pli=1
What's Changed
- Development -> main by @andrew-bierman in #2190
- Fix outdated commands in copilot-instructions.md by @Copilot in #2174
- Remove duplicate header in CatalogItemsAuthWall by @Copilot in #2207
- Release/2.0.20 by @mikib0 in #2206
- [WIP] Add centralized frozen app config and magic-string checks workspace by @Copilot in #2209
- ci(e2e): harden Maestro workflow for reliability by @andrew-bierman in #2176
- Add @packrat/mcp — full-featured MCP server on Cloudflare Workers by @andrew-bierman in #2186
- chore(ci): consolidate biome and type workflows into checks by @Copilot in #2210
- Add centralized frozen config workspace + magic-string checks workspace by @Copilot in #2204
- feat(ci): add mobile GitHub release workflow with monorepo version guard by @Copilot in #2211
- claude/add-analytics-api-K625X by @andrew-bierman in #2193
- Align Expo app dependencies with Expo Doctor peer requirements by @Copilot in #2219
- feat: add monorepo-wide React Doctor custom check alongside Expo Doctor by @Copilot in #2217
- chore(env): introduce Zod-validated env shim for Node scripts by @andrew-bierman in #2046
- Harden PackRat CLI with typed argument parsing and resilient bootstrap behavior by @Copilot in #2221
- feat: expand Copilot cloud agent environment bootstrap by @Copilot in #2218
- chore: ignore worktree dirs and add Hono RPC foundation plan by @andrew-bierman in #2223
- Bump Expo dependency to latest SDK 54 patch via install-helper-aligned update by @Copilot in #2222
- feat(ai): gate local AI behind a feature flag by @mikib0 in #2224
Full Changelog: v2.0.20...v2.0.21
App vUpload-tauri-build
See the assets to download this version and install.