Skip to content

release: v2.1.0 - #2615

Merged
mikib0 merged 593 commits into
mainfrom
release/v2.1.0
Jul 20, 2026
Merged

release: v2.1.0#2615
mikib0 merged 593 commits into
mainfrom
release/v2.1.0

Conversation

@mikib0

@mikib0 mikib0 commented Jun 28, 2026

Copy link
Copy Markdown
Collaborator

Summary

  • MCP connector: Claude connector-store readiness with Better Auth OAuth, write scope, logo URI
  • Mobile: Expo UI migration (native headers/search), Android large title, cached profile avatars, upcoming trips screen
  • User preferences: Weight + temperature unit preferences synced to DB, applied across catalog, AI, and settings surfaces
  • Pack gap analysis: Major UX overhaul — shared-element transforms, tap-to-swap, shopping cart flow, haptics
  • Auth fix: additionalFields (firstName, lastName, avatarUrl) now correctly returned on sign-in/session refresh
  • API hardening: DB query tagging for call-site attribution, projection discipline on fat tables, Sentry instrumentation throughout
  • Metrics: Query metrics dashboard moved to Cloudflare D1 with monthly trends, period selectors, and call-site breakdown

Release notes

  • 935 commits since v2.0.28
  • EAS production builds queued for iOS (buildNumber 452) and Android (versionCode 73) with auto-submit to App Store and Play Store
  • No breaking API changes — all endpoint contracts are additive or internal

Test plan

  • EAS production build completes for iOS and Android
  • Auto-submit lands in App Store Connect and Google Play Console
  • Auth sign-in/re-login preserves firstName, lastName, and avatarUrl
  • Weight/temperature unit preferences persist across sessions
  • MCP connector accessible from Claude connector store

andrew-bierman and others added 30 commits June 3, 2026 13:45
Replaces custom title header with LargeTitleHeader which includes
native back button navigation, matching other screens in the app.

Fixes #2548
…031/MD029)

CodeRabbit findings on #2553:
- MD031: add blank lines around fenced code blocks in both the runbook
  and the HNSW brainstorm
- MD029: restart the post-deploy verification list at 1 (was 4-6,
  continuing from the pre-merge list which logically belongs to a
  separate ordered group)

Cosmetic, no semantic changes.
Captures the Copilot follow-up surfaced on PR #2554 review while
context is fresh. Five options laid out (A: opt-in total, B: drop it,
C: approximate via reltuples, D: bounded count via LIMIT, E: accept
cost) with investigation plan to pick one once the HNSW fix lands and
the count query becomes the visible cost line.

Not a blocker on PR #2554 — the count cost pre-dates the HNSW fix.
The fix makes the SELECT path ~115× cheaper without making count
worse. Captured here so the follow-up doesn't get lost.
fix: add back button to Gear Inventory screen
- Fix email login re-navigating to login screen on submit
  Router was using dismissTo() which dismissed the modal first then
  navigated, causing a race that reset inputs and left users on the
  login screen. Switched to router.replace() for direct navigation.

- Remove cancel buttons from all auth and form modals
  Removed cancel button (headerLeft) from the create-account modal,
  the sign-in modal, the create trip modal, and the create pack modal.
  Also cleaned up now-unused useRouter, Pressable, Text, and testIds imports.
Root cause: the layout configured weather-alert-preferences with
headerShown: false, but LargeTitleHeader internally renders
<Stack.Screen options={{ headerShown: true }}> — dynamically
changing header visibility in a modal context.

React Navigation detects this conflict and remounts the entire
screen, resetting all useState to initial values. This is why every
toggle appeared to snap back after being tapped.

Fixes:
- Remove headerShown: false from the layout and use headerLargeTitle: true
  instead, so the layout and LargeTitleHeader agree from the start and
  no dynamic header visibility change occurs
- Add delaysContentTouches={false} and canCancelContentTouches={false}
  to the ScrollView as a secondary defence against iOS UIScrollView
  stealing and cancelling touches before UISwitch can complete its
  gesture (also observed on iOS 26)

Closes #2540
fix(expo): add contentInsetAdjustmentBehavior to GearInventory ScrollView
… iOS

This prop prevents UIScrollView from ever reclaiming the gesture for
scrolling once a touch is delivered to a subview. The primary fix
(headerLargeTitle: true in the layout) already resolves the snap-back
by eliminating the screen remount. The secondary canCancelContentTouches
defence is unnecessary and breaks scroll.
fix(expo): auth modal UX improvements
…s-toggle-snap-back

fix(expo): fix weather alert preference toggles snapping back on iOS
…a top space

- Move share/edit/delete buttons from title row into getTripDetailOptions headerRight
- Add share handler to getTripDetailOptions using trip data from store
- Replace SafeAreaView edges default with edges={['bottom']} to avoid double
  top inset stacking with the navigation header
- Remove now-redundant inline action buttons, AlertComponent ref, and
  handleShareTrip/handleDeleteTrip handlers from TripDetailScreen
fix(expo): move trip detail action buttons to nav header, remove extra top space
GET /admin/analytics/db/snapshot returns the same metrics from
docs/runbooks/neon-cost-profiling.md so cost trends are visible from
the admin app without running Neon MCP / SQL editor by hand.

Response shape:
{
  generatedAt: ISO8601,
  statsResetAt: ISO8601 | null,    // pg_stat_database.stats_reset
  database: { name, sizeBytes },
  tables: [
    { name, estimatedRows,
      heapBytes, toastBytes, indexBytes, totalBytes,
      seqScans, seqTuplesRead, idxScans, idxTuplesFetched,
      inserts, updates, deletes, hotUpdates,
      liveTuples, deadTuples,
      lastAutovacuum, lastAutoanalyze }
  ],
  indexes: [
    { table, name, bytes, isUnique,
      scans, tuplesRead, tuplesFetched }
  ]
}

Tables ordered by total size DESC; indexes ordered by size DESC.

Implementation in packages/api/src/services/dbMetricsService.ts.
Queries are pure metadata — pg_class for sizing, pg_stat_user_tables +
pg_stat_user_indexes for activity. No row scans on user tables; no
pg_stat_statements dependency (works on Neon without enabling the
extension). Four parallel queries per call; total time stays well
under the 30s HTTP timeout even for large schemas.

Mounted under existing /admin/analytics/ namespace so the admin app's
analytics dashboard can poll it alongside the existing platform +
catalog routes. Auth inherited from admin parent (onBeforeHandle +
adminAuthGuard at packages/api/src/routes/admin/index.ts:245).

Test coverage in packages/api/test/admin.test.ts:
- Returns expected response shape with catalog_items present and
  numeric typed fields
- Requires admin auth (raw api() request returns 401)

Refs: docs/runbooks/neon-cost-profiling.md (step 2-3 metrics)
…overage ratchet

Five Copilot findings, all valid:

1. **pg_relation_size(reltoastrelid) throws on reltoastrelid=0**
   COALESCE evaluates AFTER the function call, so the error wins for
   small / non-TOASTed tables (most of the schema). Wrapped in
   CASE WHEN c.reltoastrelid = 0 THEN '0' ELSE pg_relation_size(...) END
   which short-circuits the call.

2. **Use createReadOnlyDb() instead of createDb()**
   Defense in depth — a future bug introducing a write would be
   rejected at the Postgres role level rather than silently mutating
   production. Service is intentionally read-only.

3. **Update constructor to use the read-only client** — follows from (2).

4. **Doc comment promised a statement-timeout that wasn't implemented**
   Rewrote the doc to reflect actual behavior: queries are pure
   metadata, total runtime stays well under Neon's 30s HTTP timeout,
   no explicit statement_timeout wrapper applied.

5. **500 response missing stable error code field**
   Added \`code: 'ANALYTICS_DB_SNAPSHOT_ERROR'\` matching the existing
   admin route convention (CATALOG_OVERVIEW_ERROR, ANALYTICS_GROWTH_ERROR
   etc.).

Plus: coverage ratchet failed (98.31% → 92.68% on packages/api) because
integration tests at packages/api/test/ aren't coverage-counted under
the Cloudflare Workers test pool. Added
packages/api/src/services/__tests__/dbMetricsService.test.ts with 5
unit tests covering:
- Full snapshot shape with parsed numerics
- Graceful fallback when database info query returns no rows
- reltoastrelid=0 fixture (toast_bytes='0') parses to toastBytes: 0
- Order preservation from underlying SQL
- Four parallel queries fire per snapshot

Tests mock createReadOnlyDb at the module level and drive each of the
four execute() calls via mockResolvedValueOnce in source order (the
order Promise.all fires them).
✨ feat(api): admin DB sizing + activity snapshot endpoint
…ms (F4) (#2566)

* 📝 docs: refined embedding-regen hypothesis post-investigation

After confirming F4 at the code level in merged catalogService.ts and
correlating against the pg_stat_user_tables delta (zero updates in 4
days post-Tier-1-merge), the bug shape is different than first framed:

- The diff in upsertCatalogItems is dead code (excluded.col = input.col
  after UPSERT, so the comparison is structurally always-false). Never
  fires the 'second regen' branch.
- The real waste is upstream in processValidItemsBatch which calls
  generateManyEmbeddings for EVERY batch row regardless of whether the
  catalog row already exists with byte-identical embedding.
- 5.56M n_tup_upd ÷ 1.79M rows ≈ 3 lifetime ETL re-runs touching every
  row — matches 'we did a lot of data loading this month for catalog'.

Real cost lines (in priority): OpenAI text-embedding-3 API spend,
Cloudflare AI Gateway hit count (may already be caching — verify),
Postgres n_tup_upd churn (likely HOT-suppressed since text-embedding-3
is deterministic on identical input), Worker compute + network.

Fix shape: move the source-text diff upstream into processValidItemsBatch
BEFORE generateManyEmbeddings. Bulk-fetch existing rows, compare
getEmbeddingText output, generate only for the diff. UPSERT 'set' clause
modified to skip embedding column when input embedding is undefined
(COALESCE(excluded.embedding, catalog_items.embedding)). Also delete
the dead diff in upsertCatalogItems.

Open question before designing the fix: is Cloudflare AI Gateway
already deduplicating identical embedding requests? If yes, OpenAI $
is already minimal; the fix recovers Worker + Postgres only. If no,
the fix recovers full OpenAI $. Checking AI Gateway cache config next.

* 🐛 fix(api): skip OpenAI embedding calls for unchanged catalog ETL items

Implements the source-text diff upstream of generateManyEmbeddings in
processValidItemsBatch, fixing the F4 embedding-regen anomaly captured
in docs/brainstorms/2026-06-01-embedding-regen-anomaly-requirements.md.

Before this fix:
- processValidItemsBatch called generateManyEmbeddings for every batch
  row regardless of whether the catalog already had a byte-identical
  embedding from unchanged source text
- The diff loop inside upsertCatalogItems was dead code (excluded.col =
  input.col after UPSERT, so the comparison was structurally always
  false) — but even if it had worked, it ran AFTER the OpenAI call, so
  it couldn't recover the cost
- Every ETL re-run paid OpenAI \$ for N redundant embedding generations
  (5.56M lifetime n_tup_upd on catalog_items, ~3 lifetime ETL re-runs)

After:
- CatalogService.fetchExistingForRegen(skus) bulk-projects each
  existing row's embedding column + the fields getEmbeddingText reads.
  Explicit column projection per the U9 lint discipline.
- processValidItemsBatch partitions incoming items into "needs fresh
  embedding" (new + source-text-changed) vs "reuse existing embedding"
  (existing + source-text-unchanged), and only calls generateManyEmbeddings
  on the fresh partition
- text-embedding-3 is deterministic on identical input, so reused
  embeddings are byte-equivalent to what would have been regenerated
- Dead diff loop in upsertCatalogItems removed; replaced with a comment
  pointing at this fix

Observability:
- logger.info('etl.embedding.diff') reports total / fresh / reused
  counts per batch, so the savings are visible in production logs
- The admin DB snapshot endpoint (PR #2565) will start showing flat
  n_tup_upd growth on catalog_items between ETL runs once this ships

Tests in packages/api/src/services/etl/__tests__/processValidItemsBatch.test.ts:
- Calls generateManyEmbeddings only for the changed/new partition
- Skips it entirely when every item is unchanged
- Treats existing-with-null-embedding as needing fresh generation
- All-new partition still works

Complements the AI Gateway cache toggle (defense in depth): even when
that's on, this fix prevents the redundant request from being made at
all, saving Worker compute + network + cache pollution.

Future optimization (deferred to its own plan): add an
embedding_source_hash column on catalog_items so the diff doesn't need
to re-fetch JSONB fields (reviews/qas/faqs/etc.) and re-run
getEmbeddingText on existing rows. Native Web Crypto API in Workers
makes the implementation trivial; the cost is a schema migration plus
backfill.

Refs: docs/brainstorms/2026-06-01-embedding-regen-anomaly-requirements.md

* 🐛 fix(api): address PR #2566 review — short-response guard + COALESCE for reuse + as-unknown

Three findings from PR #2566 review (Copilot + CodeRabbit), all valid:

1. **Copilot @ processValidItemsBatch:96** — `freshEmbeddings[freshIndex] ?? null`
   silently wrote NULL embedding if `generateManyEmbeddings` ever
   returned short. Lost vector coverage on affected items.

   Added a length guard: throw if mismatch. Routes execution to the
   existing fallback path that records the failure on
   `etl_jobs.total_embedding_failures` and upserts without embeddings.

2. **Copilot @ processValidItemsBatch:98** — reuse partition still
   passed `embedding: existingEmbedding` to UPSERT, which through
   `embedding = excluded.embedding` rewrote identical bytes. Counted
   as n_tup_upd and dirtied the HNSW page even with HOT-update
   suppression. Defeated half the point of the diff.

   Now:
   - Reuse partition passes `embedding: undefined` (→ NULL in INSERT)
   - upsertCatalogItems set clause for embedding column changed to
     `embedding = COALESCE(excluded.embedding, catalog_items.embedding)`
   - Preserves stored vector when input is NULL, takes new value when
     provided. text-embedding-3 is deterministic so byte equivalence
     holds.

3. **CodeRabbit @ test fixture** — `as any` on TEST_ENV. Swapped for
   `as unknown as Parameters<typeof processValidItemsBatch>[0]['env']`.

Tests updated to assert the new contract + new test for the
short-response throw → fallback path. 5/5 unit tests pass.
landing, guides, admin, and trails each had a `lint: next lint` script
with no ESLint deps or config installed (it would error if run). The
repo lints with Biome 2.0 (root `bun lint`), so these scripts are dead.

Remove them, and document in each next.config that the existing
`eslint.ignoreDuringBuilds` is intentional — Biome handles linting, so
Next must never invoke ESLint during builds.
# Conflicts:
#	.github/workflows/web-e2e-tests.yml
#	apps/expo/features/trips/screens/TripDetailScreen.tsx
#	apps/expo/features/trips/utils/getTripDetailOptions.tsx
#	coverage-baselines.json
#	packages/api/src/index.ts
#	packages/api/src/routes/catalog/index.ts
#	packages/api/src/services/catalogService.ts
#	packages/api/src/services/etl/CatalogItemValidator.ts
#	packages/api/src/services/etl/processLogsBatch.ts
#	packages/api/src/services/etl/processValidItemsBatch.ts
#	packages/api/src/services/retention/__tests__/invalidLogRetention.test.ts
#	packages/api/src/services/retention/invalidLogRetention.ts
#	packages/api/src/utils/__tests__/logger.test.ts
#	packages/api/src/utils/logger.ts
#	packages/api/src/workflows/catalog-etl-workflow.ts
#	packages/api/src/workflows/shared/__tests__/chunk-csv-for-r2.test.ts
#	packages/api/src/workflows/shared/chunkCsvForR2.ts
mikib0 added 10 commits June 28, 2026 08:56
Fixes the MCP OAuth flow for local development (MCP Inspector) and
hardens JWT verification across all environments.

## JWT verification fixes (affect all environments)

- token-verify.ts + mcp-token.ts: issuer was compared against bare
  PACKRAT_API_URL; Better Auth sets iss = baseURL + '/api/auth' —
  added the suffix so the claim matches
- JWKS fetch was constructed from the issuer URL, producing the double-path
  /api/auth/api/auth/jwks; fixed to use the bare API base URL
- Algorithm allowlist was ['ES256', 'RS256']; Better Auth signs with
  EdDSA (Ed25519) by default — added EdDSA to both verifiers
- mcp-token.ts: MCP audience was hardcoded to the production URL; now
  reads env.PACKRAT_MCP_URL so non-production deployments verify correctly

## MCP Inspector local-dev support

- MCP_PUBLIC_URL env var: canonicalResourceUrl and buildWwwAuthenticateHeader
  now use it in dev so the resource_metadata pointer and JWT aud resolve to
  the local worker, not the production domain
- CORS on /.well-known/* extended to localhost:* origins so the browser can
  read metadata documents during Inspector-driven OAuth discovery
- CORS applied to 401 responses on /mcp so Inspector sees the
  WWW-Authenticate header instead of a blocked cross-origin response
- DO fetch wrapped in a 503-retry to handle brief Durable Object hibernation
  between the initialize WebSocket closing and notifications/initialized arriving
- validAudiences includes http://localhost:8788/mcp in local dev and
  env.PACKRAT_MCP_URL + /mcp when set, so the resource param in OAuth
  authorize requests is accepted
- PACKRAT_MCP_URL added to env-validation.ts schema (optional URL)
- seed-inspector-oauth-client.ts: pre-registers MCP Inspector as a public
  OAuth client (DCR is disabled; Inspector needs a seeded row)

## OAuth consent UI

- sign-in-page.tsx + signInRoute: Better Auth redirects unauthenticated users
  to /api/auth/sign-in mid-OAuth-flow; the route and rendered page were
  missing, causing a 404 that broke the authorize redirect loop
- consent-page.tsx: updated to POST JSON to /api/auth/oauth2/consent;
  sanitizeOAuthConsentRequest in index.ts updated to parse JSON accordingly
…nges

- token-verify.test.ts: split ISSUER into API_BASE + '/api/auth' to
  match Better Auth's actual iss claim (base URL + '/api/auth')
- mcp-token.test.ts: update expected issuer and add EdDSA to algorithm
  allowlist to match resolveMcpBearerUser implementation
- auth-cors.test.ts: add signInRoute to consent-route mock and make
  appBase.use() chainable to support .use(signInRoute).use(consentRoute)
…oauth

fix(mcp): local-dev OAuth flow + JWT verification correctness
…een Workers

Cloudflare Workers cannot make outbound HTTP requests to other Workers
in the same account via their workers.dev URLs — the runtime returns
error 1042 instead of the actual response. This caused verifyMcpToken
to fail JWKS verification with `Expected 200 OK` on every deployed
request, making the MCP connector unusable.

Adding the global_fetch_strictly_public compatibility flag routes all
fetch() calls through the public internet, bypassing the same-account
restriction and allowing the MCP Worker to reach the API Worker's
/api/auth/jwks endpoint.

Local dev was unaffected because the tunnel URLs (trycloudflare.com)
are on a different domain and don't trigger the restriction.
resolveMcpBearerUser fetches /api/auth/jwks from env.PACKRAT_API_URL to
verify MCP JWTs. On workers.dev, this is a self-referential HTTP call
that also triggers error 1042, causing JWT verification to silently
return null and all authenticated API endpoints to 401.

Same root cause as the MCP JWKS fix (error 1042 on same-account
workers.dev fetch). global_fetch_strictly_public routes the JWKS fetch
through the public internet, breaking the self-loop.
…y-public

fix(mcp): add global_fetch_strictly_public to unblock JWKS fetch between Workers
…ctor metadata

Two connector issues:

1. The WWW-Authenticate scope hint defaulted to `mcp:read`, so Claude.ai
   only requested read-only access. Changed the default in
   `buildWwwAuthenticateHeader` to `mcp:write` so the initial auth flow
   grants write access. (The glossary already documented `mcp:write` as
   "the default scope Claude.ai requests" — code now matches.)

2. `buildResourceMetadata` omitted `logo_uri`, so Claude.ai had no logo
   to display for the PackRat connector. Added `logo_uri` pointing at the
   256px MCP logo already hosted on packratai.com.
…e-and-logo

fix(mcp): request write scope by default and expose logo_uri in connector metadata
@cloudflare-workers-and-pages

Copy link
Copy Markdown
Contributor

Deploying with  Cloudflare Workers  Cloudflare Workers

The latest updates on your project. Learn more about integrating Git with Workers.

Status Name Latest Commit Preview URL Updated (UTC)
✅ Deployment successful!
View logs
packrat-admin a1b4362 Commit Preview URL

Branch Preview URL
Jun 28 2026, 06:03 PM

@coderabbitai

coderabbitai Bot commented Jun 28, 2026

Copy link
Copy Markdown
Contributor

Important

Review skipped

Too many files!

This PR contains 920 files, which is 770 over the limit of 150.

To get a review, narrow the scope:
• coderabbit review --type committed # exclude uncommitted changes
• coderabbit review --dir # limit to a subdirectory
• coderabbit review --base # compare against a closer base

Upgrade to a paid plan to raise the limit.

⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: d2e20d8c-c7ad-48b7-9a2c-89102b0f3a55

📥 Commits

Reviewing files that changed from the base of the PR and between d328194 and a1b4362.

⛔ Files ignored due to path filters (17)
  • apps/landing/public/favicon.ico is excluded by !**/*.ico, !**/public/**
  • apps/landing/public/mcp-logo-1024.png is excluded by !**/*.png, !**/public/**
  • apps/landing/public/mcp-logo-256.png is excluded by !**/*.png, !**/public/**
  • apps/landing/public/mcp-logo-512.png is excluded by !**/*.png, !**/public/**
  • apps/landing/public/mcp-logo.svg is excluded by !**/*.svg, !**/public/**
  • apps/swift/Resources/Assets.xcassets/AppIcon.appiconset/AppIcon-iOS-1024.png is excluded by !**/*.png
  • apps/swift/Resources/Assets.xcassets/AppIcon.appiconset/AppIcon-mac-128.png is excluded by !**/*.png
  • apps/swift/Resources/Assets.xcassets/AppIcon.appiconset/AppIcon-mac-128@2x.png is excluded by !**/*.png
  • apps/swift/Resources/Assets.xcassets/AppIcon.appiconset/AppIcon-mac-16.png is excluded by !**/*.png
  • apps/swift/Resources/Assets.xcassets/AppIcon.appiconset/AppIcon-mac-16@2x.png is excluded by !**/*.png
  • apps/swift/Resources/Assets.xcassets/AppIcon.appiconset/AppIcon-mac-256.png is excluded by !**/*.png
  • apps/swift/Resources/Assets.xcassets/AppIcon.appiconset/AppIcon-mac-256@2x.png is excluded by !**/*.png
  • apps/swift/Resources/Assets.xcassets/AppIcon.appiconset/AppIcon-mac-32.png is excluded by !**/*.png
  • apps/swift/Resources/Assets.xcassets/AppIcon.appiconset/AppIcon-mac-32@2x.png is excluded by !**/*.png
  • apps/swift/Resources/Assets.xcassets/AppIcon.appiconset/AppIcon-mac-512.png is excluded by !**/*.png
  • apps/swift/Resources/Assets.xcassets/AppIcon.appiconset/AppIcon-mac-512@2x.png is excluded by !**/*.png
  • bun.lock is excluded by !**/*.lock, !bun.lock
📒 Files selected for processing (920)
  • .github/actionlint.yaml
  • .github/scripts/env.ts
  • .github/scripts/run-android-maestro-ci.ts
  • .github/workflows/checks.yml
  • .github/workflows/coverage.yml
  • .github/workflows/e2e-tests.yml
  • .github/workflows/swift-ci.yml
  • .github/workflows/swift-e2e.yml
  • .github/workflows/swift-visual.yml
  • .github/workflows/web-e2e-tests.yml
  • .gitignore
  • .jscpd.json
  • .maestro/README.md
  • .maestro/config-android.yaml
  • .maestro/flows/ai/ai-chat-dashboard-flow.yaml
  • .maestro/flows/ai/ai-chat-pack-flow.yaml
  • .maestro/flows/auth/login-flow.yaml
  • .maestro/flows/auth/logout-flow.yaml
  • .maestro/flows/catalog/catalog-browse-flow.yaml
  • .maestro/flows/catalog/catalog-item-detail-flow.yaml
  • .maestro/flows/catalog/catalog-search-flow.yaml
  • .maestro/flows/dashboard/pack-templates-flow.yaml
  • .maestro/flows/guides/guides-browse-flow.yaml
  • .maestro/flows/negative/empty-pack-submit-flow.yaml
  • .maestro/flows/negative/empty-trip-submit-flow.yaml
  • .maestro/flows/negative/invalid-login-flow.yaml
  • .maestro/flows/packs/add-item-actions-flow.yaml
  • .maestro/flows/packs/add-item-catalog-flow.yaml
  • .maestro/flows/packs/add-item-in-pack-catalog-flow.yaml
  • .maestro/flows/packs/add-item-manual-flow.yaml
  • .maestro/flows/packs/create-pack-flow.yaml
  • .maestro/flows/packs/pack-detail-flow.yaml
  • .maestro/flows/packs/pack-edit-share-flow.yaml
  • .maestro/flows/packs/pack-toggle-filter-flow.yaml
  • .maestro/flows/setup/dev-client-open-flow.yaml
  • .maestro/flows/setup/session-persistence-flow.yaml
  • .maestro/flows/trips/create-trip-flow.yaml
  • .maestro/flows/trips/trip-detail-flow.yaml
  • .maestro/flows/trips/trip-edit-flow.yaml
  • .maestro/master-flow-android.yaml
  • .maestro/master-flow.yaml
  • .maestro/run-suite.sh
  • .maestro/run-suite.ts
  • .zed/settings.json
  • CLAUDE.md
  • apps/admin/app/dashboard/analytics/query-metrics/page.tsx
  • apps/admin/components/analytics/catalog-analytics.tsx
  • apps/admin/components/analytics/query-metrics.tsx
  • apps/admin/components/raw-object-dialog.tsx
  • apps/admin/config/nav.ts
  • apps/admin/hooks/use-query-metrics.ts
  • apps/admin/lib/api.ts
  • apps/admin/lib/queryKeys.ts
  • apps/admin/next.config.mjs
  • apps/admin/package.json
  • apps/admin/tsconfig.json
  • apps/expo/Shims/SwiftUICore.framework/SwiftUICore.tbd
  • apps/expo/Shims/UIUtilities.framework/Headers/UICoordinateSpace.h
  • apps/expo/Shims/UIUtilities.framework/Headers/UIDefines.h
  • apps/expo/Shims/UIUtilities.framework/Headers/UIGeometry.h
  • apps/expo/Shims/UIUtilities.framework/Modules/module.modulemap
  • apps/expo/Shims/UIUtilities.framework/UIUtilities.tbd
  • apps/expo/app.config.ts
  • apps/expo/app/(app)/(tabs)/(home)/index.tsx
  • apps/expo/app/(app)/(tabs)/profile/index.tsx
  • apps/expo/app/(app)/(tabs)/profile/name.tsx
  • apps/expo/app/(app)/(tabs)/profile/username.tsx
  • apps/expo/app/(app)/_layout.tsx
  • apps/expo/app/(app)/ai-chat.tsx
  • apps/expo/app/(app)/current-pack/[id].tsx
  • apps/expo/app/(app)/demo/index.tsx
  • apps/expo/app/(app)/gear-inventory.tsx
  • apps/expo/app/(app)/messages/conversations.android.tsx
  • apps/expo/app/(app)/messages/conversations.tsx
  • apps/expo/app/(app)/pack-categories/[id].tsx
  • apps/expo/app/(app)/pack-stats/[id].tsx
  • apps/expo/app/(app)/recent-packs.tsx
  • apps/expo/app/(app)/season-suggestions-results.tsx
  • apps/expo/app/(app)/season-suggestions.tsx
  • apps/expo/app/(app)/settings/index.tsx
  • apps/expo/app/(app)/shared-packs.tsx
  • apps/expo/app/(app)/shopping-list.tsx
  • apps/expo/app/(app)/trail-conditions.tsx
  • apps/expo/app/(app)/upcoming-trips.tsx
  • apps/expo/app/(app)/weather-alert-preferences.tsx
  • apps/expo/app/(app)/weather-alerts.tsx
  • apps/expo/app/(app)/weight-analysis/[id].tsx
  • apps/expo/app/_layout.tsx
  • apps/expo/app/_layout.web.tsx
  • apps/expo/app/auth/(login)/index.tsx
  • apps/expo/app/auth/_layout.tsx
  • apps/expo/app/auth/index.tsx
  • apps/expo/app/auth/one-time-password.tsx
  • apps/expo/atoms/atomWithAsyncStorage.ts
  • apps/expo/atoms/atomWithKvStorage.ts
  • apps/expo/atoms/atomWithSecureStorage.ts
  • apps/expo/atoms/atomWithSecureStorage.web.ts
  • apps/expo/atoms/catalogGroupAtom.ts
  • apps/expo/atoms/devAtoms.ts
  • apps/expo/components/CategoriesFilter.tsx
  • apps/expo/components/ErrorState.tsx
  • apps/expo/components/LargeTitleHeaderSearchContentContainer.tsx
  • apps/expo/components/Markdown.tsx
  • apps/expo/components/initial/ExpandableText.tsx
  • apps/expo/components/initial/WeightBadge.tsx
  • apps/expo/features/ai-packs/screens/AIPacksScreen.tsx
  • apps/expo/features/ai/atoms/chatStorageAtoms.ts
  • apps/expo/features/ai/components/ChatBubble.tsx
  • apps/expo/features/ai/components/GuidesRAGGenerativeUI.tsx
  • apps/expo/features/ai/components/LocationContext.tsx
  • apps/expo/features/ai/components/ToolCard.tsx
  • apps/expo/features/ai/components/ToolInvocationRenderer.tsx
  • apps/expo/features/ai/components/WeatherGenerativeUI.tsx
  • apps/expo/features/ai/hooks/useReportedContent.ts
  • apps/expo/features/ai/lib/CustomChatTransport.ts
  • apps/expo/features/ai/lib/appleModelWrapper.ts
  • apps/expo/features/ai/lib/llamaToolsWrapper.ts
  • apps/expo/features/ai/lib/tools.ts
  • apps/expo/features/ai/screens/ReportedContentScreen.tsx
  • apps/expo/features/auth/atoms/authAtoms.ts
  • apps/expo/features/auth/hooks/useAuthActions.ts
  • apps/expo/features/auth/hooks/useAuthInit.ts
  • apps/expo/features/auth/hooks/useSpeedUnit.ts
  • apps/expo/features/auth/hooks/useTemperatureUnit.ts
  • apps/expo/features/auth/hooks/useWeightUnit.ts
  • apps/expo/features/auth/store/preferences.ts
  • apps/expo/features/catalog/components/CatalogBrowserModal.tsx
  • apps/expo/features/catalog/components/CatalogItemCard.tsx
  • apps/expo/features/catalog/components/CatalogItemImage.tsx
  • apps/expo/features/catalog/components/CatalogItemSelectCard.tsx
  • apps/expo/features/catalog/components/ImageViewerModal.tsx
  • apps/expo/features/catalog/components/SimilarItems.tsx
  • apps/expo/features/catalog/hooks/useVectorSearch.ts
  • apps/expo/features/catalog/lib/groupCatalogItems.ts
  • apps/expo/features/catalog/lib/normalizeDescription.ts
  • apps/expo/features/catalog/screens/AddCatalogItemDetailsScreen.tsx
  • apps/expo/features/catalog/screens/CatalogItemDetailScreen.tsx
  • apps/expo/features/catalog/screens/CatalogItemsScreen.tsx
  • apps/expo/features/catalog/screens/PackSelectionScreen.tsx
  • apps/expo/features/feed/screens/FeedScreen.tsx
  • apps/expo/features/guides/components/GuideCard.tsx
  • apps/expo/features/guides/screens/GuidesListScreen.tsx
  • apps/expo/features/pack-templates/components/AddPackTemplateItemActions.tsx
  • apps/expo/features/pack-templates/components/FeaturedPacksSection.tsx
  • apps/expo/features/pack-templates/components/PackTemplateCard.tsx
  • apps/expo/features/pack-templates/components/PackTemplateItemImage.tsx
  • apps/expo/features/pack-templates/components/PackTemplatesTile.tsx
  • apps/expo/features/pack-templates/screens/PackTemplateItemDetailScreen.tsx
  • apps/expo/features/pack-templates/screens/PackTemplateListScreen.tsx
  • apps/expo/features/pack-templates/utils/getPackTemplateDetailOptions.tsx
  • apps/expo/features/pack-templates/utils/getPackTemplateItemDetailOptions.tsx
  • apps/expo/features/packs/atoms/seasonSuggestionsAtoms.ts
  • apps/expo/features/packs/components/ActivityPicker.tsx
  • apps/expo/features/packs/components/AddPackItemActions.tsx
  • apps/expo/features/packs/components/CurrentPackTile.tsx
  • apps/expo/features/packs/components/GapAnalysisModal.tsx
  • apps/expo/features/packs/components/GapItemCatalogSuggestions.tsx
  • apps/expo/features/packs/components/GapSuggestion.tsx
  • apps/expo/features/packs/components/GapSuggestionRow.tsx
  • apps/expo/features/packs/components/HorizontalCatalogItemCard.tsx
  • apps/expo/features/packs/components/LocationSearchSheet.tsx
  • apps/expo/features/packs/components/LocationSourceSheet.tsx
  • apps/expo/features/packs/components/PackForm.tsx
  • apps/expo/features/packs/components/PackItemImage.tsx
  • apps/expo/features/packs/components/SearchResults.tsx
  • apps/expo/features/packs/components/SeasonSuggestionsTile.tsx
  • apps/expo/features/packs/components/SeasonSuggestionsUnlockSheet.tsx
  • apps/expo/features/packs/components/WeightAnalysisTile.tsx
  • apps/expo/features/packs/hooks/index.ts
  • apps/expo/features/packs/hooks/useGapCatalogMatches.ts
  • apps/expo/features/packs/hooks/usePackWeightAnalysis.ts
  • apps/expo/features/packs/hooks/useSeasonSuggestions.ts
  • apps/expo/features/packs/screens/CreatePackItemForm.tsx
  • apps/expo/features/packs/screens/PackDetailScreen.tsx
  • apps/expo/features/packs/screens/PackItemDetailScreen.tsx
  • apps/expo/features/packs/screens/PackListScreen.tsx
  • apps/expo/features/packs/utils/__tests__/computeCategories.test.ts
  • apps/expo/features/packs/utils/computeCategories.ts
  • apps/expo/features/packs/utils/getPackDetailOptions.tsx
  • apps/expo/features/packs/utils/getPackItemDetailOptions.tsx
  • apps/expo/features/trail-conditions/hooks/useTrailConditionReports.ts
  • apps/expo/features/trips/components/TripForm.tsx
  • apps/expo/features/trips/components/UpcomingTripsTile.tsx
  • apps/expo/features/trips/hooks/useDeleteTrip.ts
  • apps/expo/features/trips/screens/TripDetailScreen.tsx
  • apps/expo/features/trips/screens/TripListScreen.tsx
  • apps/expo/features/trips/screens/TripWeatherDetailsScreen.tsx
  • apps/expo/features/trips/screens/UpcomingTripsScreen.tsx
  • apps/expo/features/trips/utils/__tests__/tripDateUtils.test.ts
  • apps/expo/features/trips/utils/getTripDetailOptions.tsx
  • apps/expo/features/trips/utils/tripDateUtils.ts
  • apps/expo/features/weather/components/LocationCard.tsx
  • apps/expo/features/weather/components/LocationPicker.tsx
  • apps/expo/features/weather/components/WeatherForecast.tsx
  • apps/expo/features/weather/components/WeatherTile.tsx
  • apps/expo/features/weather/lib/weatherService.ts
  • apps/expo/features/weather/screens/LocationDetailScreen.tsx
  • apps/expo/features/weather/screens/LocationPreviewScreen.tsx
  • apps/expo/features/weather/screens/LocationSearchScreen.tsx
  • apps/expo/features/weather/screens/LocationsScreen.tsx
  • apps/expo/features/wildlife/atoms/wildlifeAtoms.ts
  • apps/expo/features/wildlife/screens/WildlifeScreen.tsx
  • apps/expo/lib/api/getBaseUrl.ts
  • apps/expo/lib/api/packrat.ts
  • apps/expo/lib/asyncStorage.ts
  • apps/expo/lib/auth-client.ts
  • apps/expo/lib/expoSqliteKvStore.ts
  • apps/expo/lib/expoSqliteKvStore.web.ts
  • apps/expo/lib/googleSignin.ts
  • apps/expo/lib/googleSignin.web.ts
  • apps/expo/lib/hooks/useBottomSheetAction.ts
  • apps/expo/lib/hooks/useColorScheme.tsx
  • apps/expo/lib/i18n/locales/en.json
  • apps/expo/lib/kvStorage.ts
  • apps/expo/lib/kvStorage.web.ts
  • apps/expo/lib/persist-plugin.ts
  • apps/expo/lib/persist-plugin.web.ts
  • apps/expo/lib/testIds.ts
  • apps/expo/lib/unitDefaults.ts
  • apps/expo/lib/utils/__tests__/getRelativeTime.test.ts
  • apps/expo/lib/utils/__tests__/getRemoteImageCacheKey.test.ts
  • apps/expo/lib/utils/__tests__/imageUtils.test.ts
  • apps/expo/lib/utils/getRemoteImageCacheKey.ts
  • apps/expo/metro.config.js
  • apps/expo/mocks/expo-secure-store.ts
  • apps/expo/mocks/react-native-community-datetimepicker.tsx
  • apps/expo/package.json
  • apps/expo/playwright/capture-web-screenshots.ts
  • apps/expo/playwright/playwright.config.ts
  • apps/expo/playwright/playwright.visual.config.ts
  • apps/expo/playwright/tests/core.spec.ts
  • apps/expo/playwright/tests/packs.spec.ts
  • apps/expo/playwright/tests/profile.spec.ts
  • apps/expo/playwright/tests/trips.spec.ts
  • apps/expo/playwright/tests/visual.spec.ts
  • apps/expo/polyfills.ts
  • apps/expo/providers/index.web.tsx
  • apps/expo/theme/index.ts
  • apps/expo/tsconfig.json
  • apps/expo/utils/__tests__/storage.test.ts
  • apps/expo/utils/storage.ts
  • apps/expo/utils/weight.ts
  • apps/expo/vitest.types.config.ts
  • apps/guides/app/dev/generate/page.tsx
  • apps/guides/lib/enhanceGuideContent.ts
  • apps/guides/next.config.mjs
  • apps/guides/package.json
  • apps/guides/scripts/build-content.ts
  • apps/guides/scripts/generate-content.ts
  • apps/guides/tsconfig.json
  • apps/landing/__tests__/legal.pages.test.ts
  • apps/landing/__tests__/mcp.page.test.ts
  • apps/landing/app/mcp/page.tsx
  • apps/landing/app/privacy-policy/page.tsx
  • apps/landing/app/terms-of-service/page.tsx
  • apps/landing/config/site.ts
  • apps/landing/data/mcp-catalog.json
  • apps/landing/next.config.mjs
  • apps/landing/package.json
  • apps/landing/tsconfig.json
  • apps/swift/PackRatAPIClient/Package.resolved
  • apps/swift/PackRatAPIClient/Package.swift
  • apps/swift/PackRatAPIClient/Sources/PackRatAPIClient/GeneratedSources/Client.swift
  • apps/swift/PackRatAPIClient/Sources/PackRatAPIClient/GeneratedSources/Types.swift
  • apps/swift/PackRatAPIClient/Sources/PackRatAPIClient/openapi-generator-config.yaml
  • apps/swift/PackRatAPIClient/Sources/PackRatAPIClient/openapi.yaml
  • apps/swift/README.md
  • apps/swift/Resources/Assets.xcassets/AccentColor.colorset/Contents.json
  • apps/swift/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json
  • apps/swift/Resources/Assets.xcassets/Contents.json
  • apps/swift/Resources/Info-iOS.plist
  • apps/swift/Resources/Info-macOS.plist
  • apps/swift/Resources/Info-watchOS.plist
  • apps/swift/Resources/PackRat-iOS.entitlements
  • apps/swift/Resources/PackRat-macOS.entitlements
  • apps/swift/Sources/PackRat/API/Client.swift
  • apps/swift/Sources/PackRat/API/Types.swift
  • apps/swift/Sources/PackRat/AppState.swift
  • apps/swift/Sources/PackRat/Config/AppFeatureFlags.swift
  • apps/swift/Sources/PackRat/Features/AIPacks/AIPacksView.swift
  • apps/swift/Sources/PackRat/Features/AIPacks/AIPacksViewModel.swift
  • apps/swift/Sources/PackRat/Features/Auth/AuthGateView.swift
  • apps/swift/Sources/PackRat/Features/Auth/AuthWelcomeView.swift
  • apps/swift/Sources/PackRat/Features/Auth/LoginView.swift
  • apps/swift/Sources/PackRat/Features/Auth/PasswordResetViews.swift
  • apps/swift/Sources/PackRat/Features/Auth/RegisterView.swift
  • apps/swift/Sources/PackRat/Features/Catalog/CatalogItemDetailView.swift
  • apps/swift/Sources/PackRat/Features/Catalog/CatalogView.swift
  • apps/swift/Sources/PackRat/Features/Catalog/CatalogViewModel.swift
  • apps/swift/Sources/PackRat/Features/Chat/ChatView.swift
  • apps/swift/Sources/PackRat/Features/Chat/ChatViewModel.swift
  • apps/swift/Sources/PackRat/Features/Chat/ToolResultView.swift
  • apps/swift/Sources/PackRat/Features/Feed/ComposePostView.swift
  • apps/swift/Sources/PackRat/Features/Feed/FeedView.swift
  • apps/swift/Sources/PackRat/Features/Feed/FeedViewModel.swift
  • apps/swift/Sources/PackRat/Features/Feed/PostCommentsView.swift
  • apps/swift/Sources/PackRat/Features/GearInventory/GearInventoryView.swift
  • apps/swift/Sources/PackRat/Features/Guides/GuidesView.swift
  • apps/swift/Sources/PackRat/Features/Home/HomeView.swift
  • apps/swift/Sources/PackRat/Features/OfflineAI/FeatureFlag.swift
  • apps/swift/Sources/PackRat/Features/OfflineAI/LocalLLMProvider.swift
  • apps/swift/Sources/PackRat/Features/OfflineAI/MLXLocalLLMProvider.swift
  • apps/swift/Sources/PackRat/Features/OfflineAI/MockLocalLLMProvider.swift
  • apps/swift/Sources/PackRat/Features/OfflineAI/OfflineAIView.swift
  • apps/swift/Sources/PackRat/Features/OfflineAI/OfflineAIViewModel.swift
  • apps/swift/Sources/PackRat/Features/PackTemplates/PackTemplateFormView.swift
  • apps/swift/Sources/PackRat/Features/PackTemplates/PackTemplateItemFormView.swift
  • apps/swift/Sources/PackRat/Features/PackTemplates/PackTemplatesView.swift
  • apps/swift/Sources/PackRat/Features/PackTemplates/PackTemplatesViewModel.swift
  • apps/swift/Sources/PackRat/Features/Packs/GapAnalysisSheet.swift
  • apps/swift/Sources/PackRat/Features/Packs/PackDetailView.swift
  • apps/swift/Sources/PackRat/Features/Packs/PackFormView.swift
  • apps/swift/Sources/PackRat/Features/Packs/PackItemDetailView.swift
  • apps/swift/Sources/PackRat/Features/Packs/PackItemFormView.swift
  • apps/swift/Sources/PackRat/Features/Packs/PackItemRow.swift
  • apps/swift/Sources/PackRat/Features/Packs/PackWeightAnalysisView.swift
  • apps/swift/Sources/PackRat/Features/Packs/PackWeightChart.swift
  • apps/swift/Sources/PackRat/Features/Packs/PackWindowView.swift
  • apps/swift/Sources/PackRat/Features/Packs/PacksListView.swift
  • apps/swift/Sources/PackRat/Features/Packs/PacksViewModel.swift
  • apps/swift/Sources/PackRat/Features/Packs/RecentPacksView.swift
  • apps/swift/Sources/PackRat/Features/Preferences/PreferencesView.swift
  • apps/swift/Sources/PackRat/Features/Profile/ProfileView.swift
  • apps/swift/Sources/PackRat/Features/Search/GlobalSearchView.swift
  • apps/swift/Sources/PackRat/Features/SeasonSuggestions/SeasonSuggestionsView.swift
  • apps/swift/Sources/PackRat/Features/Shopping/ShoppingListView.swift
  • apps/swift/Sources/PackRat/Features/TrailConditions/TrailConditionsView.swift
  • apps/swift/Sources/PackRat/Features/TrailConditions/TrailConditionsViewModel.swift
  • apps/swift/Sources/PackRat/Features/Trips/LocationSearchView.swift
  • apps/swift/Sources/PackRat/Features/Trips/TripDetailView.swift
  • apps/swift/Sources/PackRat/Features/Trips/TripFormView.swift
  • apps/swift/Sources/PackRat/Features/Trips/TripWindowView.swift
  • apps/swift/Sources/PackRat/Features/Trips/TripsListView.swift
  • apps/swift/Sources/PackRat/Features/Trips/TripsViewModel.swift
  • apps/swift/Sources/PackRat/Features/Weather/ForecastRow.swift
  • apps/swift/Sources/PackRat/Features/Weather/WeatherAlertPreferencesView.swift
  • apps/swift/Sources/PackRat/Features/Weather/WeatherAlertsView.swift
  • apps/swift/Sources/PackRat/Features/Weather/WeatherView.swift
  • apps/swift/Sources/PackRat/Features/Weather/WeatherViewModel.swift
  • apps/swift/Sources/PackRat/Features/Wildlife/WildlifeView.swift
  • apps/swift/Sources/PackRat/Models/APIError.swift
  • apps/swift/Sources/PackRat/Models/Catalog.swift
  • apps/swift/Sources/PackRat/Models/Chat.swift
  • apps/swift/Sources/PackRat/Models/Feed.swift
  • apps/swift/Sources/PackRat/Models/Generated.swift
  • apps/swift/Sources/PackRat/Models/Pack.swift
  • apps/swift/Sources/PackRat/Models/PackTemplate.swift
  • apps/swift/Sources/PackRat/Models/SeasonSuggestions.swift
  • apps/swift/Sources/PackRat/Models/TrailCondition.swift
  • apps/swift/Sources/PackRat/Models/Trip.swift
  • apps/swift/Sources/PackRat/Models/User.swift
  • apps/swift/Sources/PackRat/Models/Weather.swift
  • apps/swift/Sources/PackRat/Navigation/AppNavigation.swift
  • apps/swift/Sources/PackRat/Navigation/DeepLink.swift
  • apps/swift/Sources/PackRat/Navigation/PackRatCommands.swift
  • apps/swift/Sources/PackRat/Network/APIClient.swift
  • apps/swift/Sources/PackRat/Network/APIEndpoint.swift
  • apps/swift/Sources/PackRat/Network/AuthManager.swift
  • apps/swift/Sources/PackRat/Network/KeychainService.swift
  • apps/swift/Sources/PackRat/Network/NetworkMonitor.swift
  • apps/swift/Sources/PackRat/Network/PackRatGeneratedClient.swift
  • apps/swift/Sources/PackRat/PackRatApp.swift
  • apps/swift/Sources/PackRat/Persistence/CachedPack.swift
  • apps/swift/Sources/PackRat/Persistence/CachedTrip.swift
  • apps/swift/Sources/PackRat/Persistence/PersistenceController.swift
  • apps/swift/Sources/PackRat/Services/AIPacksService.swift
  • apps/swift/Sources/PackRat/Services/CatalogService.swift
  • apps/swift/Sources/PackRat/Services/ChatService.swift
  • apps/swift/Sources/PackRat/Services/FeedService.swift
  • apps/swift/Sources/PackRat/Services/PackService.swift
  • apps/swift/Sources/PackRat/Services/PackTemplateService.swift
  • apps/swift/Sources/PackRat/Services/TrailConditionsService.swift
  • apps/swift/Sources/PackRat/Services/TripService.swift
  • apps/swift/Sources/PackRat/Services/UploadService.swift
  • apps/swift/Sources/PackRat/Services/WeatherService.swift
  • apps/swift/Sources/PackRat/Shared/AsyncButton.swift
  • apps/swift/Sources/PackRat/Shared/DateFormatting.swift
  • apps/swift/Sources/PackRat/Shared/EmptyStateView.swift
  • apps/swift/Sources/PackRat/Shared/ErrorView.swift
  • apps/swift/Sources/PackRat/Shared/FormSheetSizing.swift
  • apps/swift/Sources/PackRat/Shared/OfflineBanner.swift
  • apps/swift/Sources/PackRat/Shared/OpenWindowButton.swift
  • apps/swift/Sources/PackRat/Shared/RemoteImage.swift
  • apps/swift/Sources/PackRat/Shared/UnavailableStateView.swift
  • apps/swift/Sources/PackRat/Shared/VisualSampleData.swift
  • apps/swift/Sources/PackRat/Telemetry/SentryConfig.swift
  • apps/swift/Sources/PackRat/Watch/WatchCompanionService.swift
  • apps/swift/Sources/PackRatShared/WatchSnapshot.swift
  • apps/swift/Sources/PackRatWatch/PackRatWatchApp.swift
  • apps/swift/Sources/PackRatWatch/WatchConnectivityStore.swift
  • apps/swift/TestPlans/iOS-Full.xctestplan
  • apps/swift/TestPlans/iOS-Smoke.xctestplan
  • apps/swift/TestPlans/macOS-Full.xctestplan
  • apps/swift/TestPlans/macOS-Smoke.xctestplan
  • apps/swift/Tests/PackRatMacOSUITests/Info.plist
  • apps/swift/Tests/PackRatMacUITests/MacHomeFeatureTests.swift
  • apps/swift/Tests/PackRatMacUITests/MacNavigationTests.swift
  • apps/swift/Tests/PackRatMacUITests/MacPackTripTests.swift
  • apps/swift/Tests/PackRatMacUITests/MacSecondaryFeatureTests.swift
  • apps/swift/Tests/PackRatMacUITests/MacSmokeTests.swift
  • apps/swift/Tests/PackRatMacUITests/MacUITestCase.swift
  • apps/swift/Tests/PackRatMacUITests/MacWeatherTests.swift
  • apps/swift/Tests/PackRatTests/AIPacksTests.swift
  • apps/swift/Tests/PackRatTests/ChatViewModelTests.swift
  • apps/swift/Tests/PackRatTests/DeepLinkTests.swift
  • apps/swift/Tests/PackRatTests/ModelTests.swift
  • apps/swift/Tests/PackRatTests/NetworkTests.swift
  • apps/swift/Tests/PackRatTests/OfflineAITests.swift
  • apps/swift/Tests/PackRatTests/SentryConfigTests.swift
  • apps/swift/Tests/PackRatTests/ServiceTests.swift
  • apps/swift/Tests/PackRatTests/ViewModelTests.swift
  • apps/swift/Tests/PackRatTests/WatchSnapshotTests.swift
  • apps/swift/Tests/PackRatUITests/AppUITestCase.swift
  • apps/swift/Tests/PackRatUITests/AuthTests.swift
  • apps/swift/Tests/PackRatUITests/CatalogMacOSTests.swift
  • apps/swift/Tests/PackRatUITests/CatalogTests.swift
  • apps/swift/Tests/PackRatUITests/ChatMacOSTests.swift
  • apps/swift/Tests/PackRatUITests/ChatTests.swift
  • apps/swift/Tests/PackRatUITests/FeedMacOSTests.swift
  • apps/swift/Tests/PackRatUITests/FeedTests.swift
  • apps/swift/Tests/PackRatUITests/HomeTileTests.swift
  • apps/swift/Tests/PackRatUITests/Info.plist
  • apps/swift/Tests/PackRatUITests/MoreTabsMacOSTests.swift
  • apps/swift/Tests/PackRatUITests/MoreTabsTests.swift
  • apps/swift/Tests/PackRatUITests/NavigationMacOSTests.swift
  • apps/swift/Tests/PackRatUITests/NavigationTests.swift
  • apps/swift/Tests/PackRatUITests/PackMacOSTests.swift
  • apps/swift/Tests/PackRatUITests/PackSubFlowMacOSTests.swift
  • apps/swift/Tests/PackRatUITests/PackSubFlowTests.swift
  • apps/swift/Tests/PackRatUITests/PackTemplateMacOSTests.swift
  • apps/swift/Tests/PackRatUITests/PackTemplateTests.swift
  • apps/swift/Tests/PackRatUITests/PackTests.swift
  • apps/swift/Tests/PackRatUITests/ScreenshotSmokeTests.swift
  • apps/swift/Tests/PackRatUITests/SeasonSuggestionsMacOSTests.swift
  • apps/swift/Tests/PackRatUITests/SeasonSuggestionsTests.swift
  • apps/swift/Tests/PackRatUITests/TrailConditionMacOSTests.swift
  • apps/swift/Tests/PackRatUITests/TrailConditionTests.swift
  • apps/swift/Tests/PackRatUITests/TripMacOSTests.swift
  • apps/swift/Tests/PackRatUITests/TripTests.swift
  • apps/swift/Tests/PackRatUITests/UITestFeatureFlags.swift
  • apps/swift/Tests/PackRatUITests/VisualScreenshotTests.swift
  • apps/swift/Tests/PackRatUITests/WeatherMacOSTests.swift
  • apps/swift/Tests/PackRatUITests/WeatherSubFlowMacOSTests.swift
  • apps/swift/Tests/PackRatUITests/WeatherSubFlowTests.swift
  • apps/swift/Tests/PackRatUITests/WeatherTests.swift
  • apps/swift/openapi.yaml
  • apps/swift/project.yml
  • apps/swift/scripts/__tests__/app-store-assets.test.ts
  • apps/swift/scripts/__tests__/args.test.ts
  • apps/swift/scripts/__tests__/config-codegen.test.ts
  • apps/swift/scripts/__tests__/fixtures/devices-booted.json
  • apps/swift/scripts/__tests__/fixtures/failing-summary.json
  • apps/swift/scripts/__tests__/fixtures/passing-summary.json
  • apps/swift/scripts/__tests__/macos-args.test.ts
  • apps/swift/scripts/__tests__/simctl.test.ts
  • apps/swift/scripts/__tests__/xcresult.test.ts
  • apps/swift/scripts/capture-visual-screenshots.ts
  • apps/swift/scripts/fix-xcodeproj.ts
  • apps/swift/scripts/generate-quicktype-models.ts
  • apps/swift/scripts/generate-swift-config.ts
  • apps/swift/scripts/generate-swift-models.ts
  • apps/swift/scripts/lib/app-store-assets.ts
  • apps/swift/scripts/lib/args.ts
  • apps/swift/scripts/lib/config-codegen.ts
  • apps/swift/scripts/lib/macos-args.ts
  • apps/swift/scripts/lib/simctl.ts
  • apps/swift/scripts/lib/xcresult.ts
  • apps/swift/scripts/run-e2e-macos.ts
  • apps/swift/scripts/run-e2e.ts
  • apps/swift/scripts/validate-app-store-assets.ts
  • apps/swift/scripts/watch-sync-smoke.ts
  • apps/swift/vitest.config.ts
  • apps/swift/xcconfig/Config-Debug.local.xcconfig.example
  • apps/swift/xcconfig/Config-Debug.xcconfig
  • apps/swift/xcconfig/Config-Release.xcconfig
  • apps/trails/lib/auth.ts
  • apps/trails/package.json
  • apps/trails/tsconfig.json
  • apps/web/app/auth/page.tsx
  • apps/web/components/screens/ai-screen.tsx
  • apps/web/lib/api.ts
  • apps/web/lib/auth-client.ts
  • apps/web/lib/getApiBaseUrl.ts
  • apps/web/package.json
  • apps/web/tsconfig.json
  • ast-grep-rules/PARITY.md
  • ast-grep-rules/no-index-zero-tsx.yml
  • ast-grep-rules/no-index-zero.yml
  • ast-grep-rules/no-primitive-cast-tsx.yml
  • ast-grep-rules/no-primitive-cast.yml
  • ast-grep-rules/no-raw-json-stringify-multi-tsx.yml
  • ast-grep-rules/no-raw-json-stringify-multi.yml
  • ast-grep-rules/no-raw-json-stringify-tsx.yml
  • ast-grep-rules/no-raw-json-stringify.yml
  • ast-grep-rules/no-raw-json-tsx.yml
  • ast-grep-rules/no-raw-json.yml
  • ast-grep-rules/no-raw-regex-tsx.yml
  • ast-grep-rules/no-raw-regex.yml
  • ast-grep-rules/no-raw-typeof-tsx.yml
  • ast-grep-rules/no-raw-typeof.yml
  • ast-grep-tests/__snapshots__/no-index-zero-snapshot.yml
  • ast-grep-tests/__snapshots__/no-index-zero-tsx-snapshot.yml
  • ast-grep-tests/__snapshots__/no-primitive-cast-snapshot.yml
  • ast-grep-tests/__snapshots__/no-primitive-cast-tsx-snapshot.yml
  • ast-grep-tests/__snapshots__/no-raw-regex-snapshot.yml
  • ast-grep-tests/__snapshots__/no-raw-typeof-snapshot.yml
  • ast-grep-tests/__snapshots__/no-raw-typeof-tsx-snapshot.yml
  • ast-grep-tests/no-index-zero-test.yml
  • ast-grep-tests/no-index-zero-tsx-test.yml
  • ast-grep-tests/no-primitive-cast-test.yml
  • ast-grep-tests/no-primitive-cast-tsx-test.yml
  • ast-grep-tests/no-raw-regex-test.yml
  • ast-grep-tests/no-raw-typeof-test.yml
  • ast-grep-tests/no-raw-typeof-tsx-test.yml
  • biome.json
  • coverage-baselines.json
  • docs/audits/2026-05-20-better-auth-swift-migration.md
  • docs/audits/2026-05-20-decision-ios-swap.md
  • docs/audits/2026-05-20-deep-linking-parity.md
  • docs/audits/2026-05-20-feature-parity-matrix.md
  • docs/audits/2026-05-20-swift-baseline.md
  • docs/brainstorms/2026-05-22-portless-turborepo-dev-workflow-requirements.md
  • docs/brainstorms/2026-05-31-monorepo-dependency-policy-requirements.md
  • docs/brainstorms/2026-06-01-embedding-regen-anomaly-requirements.md
  • docs/brainstorms/2026-06-01-neon-cost-reduction-requirements.md
  • docs/brainstorms/2026-06-01-vector-search-hnsw-unused-requirements.md
  • docs/brainstorms/2026-06-04-vector-search-total-count-cost-requirements.md
  • docs/ci/swift-e2e-runner.md
  • docs/dependency-policy.md
  • docs/ideation/2026-06-05-persistent-query-metrics-ideation.md
  • docs/ideation/2026-06-13-nativewindui-to-expo-ui-ideation.md
  • docs/mcp/README.md
  • docs/mcp/adr-0001-oauth-provider-vs-mcp-plugin.md
  • docs/mcp/better-auth-oauth-provider-spike-2026-05-25.md
  • docs/mcp/runbook.md
  • docs/mcp/submission-packet.md
  • docs/migrations/nativewindui-to-expo-ui.md
  • docs/plans/2026-05-02-001-refactor-swift-xcodegen-multiplatform-plan.md
  • docs/plans/2026-05-02-002-feat-swift-expo-parity-plan.md
  • docs/plans/2026-05-05-001-feat-swift-e2e-coverage-plan.md
  • docs/plans/2026-05-20-001-feat-swift-mac-and-ios-ship-readiness-plan.md
  • docs/plans/2026-05-20-001-fix-etl-pipeline-workflows-migration-plan.md
  • docs/plans/2026-05-22-001-feat-mcp-connector-store-readiness-plan.md
  • docs/plans/2026-05-25-001-refactor-mcp-auth-onto-better-auth-plan.md
  • docs/plans/2026-05-31-001-refactor-monorepo-dependency-policy-plan.md
  • docs/plans/2026-05-31-002-refactor-utils-guards-hardening-plan.md
  • docs/plans/2026-06-01-001-feat-portless-turborepo-dev-workflow-plan.md
  • docs/plans/2026-06-01-001-refactor-neon-cost-tier1-projections-plan.md
  • docs/portless-dev-workflow.md
  • docs/runbooks/etl-pipeline.md
  • docs/runbooks/neon-cost-profiling.md
  • docs/testing.md
  • docs/utils-policy.md
  • docs/utils-sweep-findings.md
  • lefthook.yml
  • package.json
  • packages/analytics/package.json
  • packages/analytics/src/core/cache-metadata.ts
  • packages/analytics/src/core/data-export.ts
  • packages/analytics/src/core/local-cache.ts
  • packages/analytics/test/core/spec-parser.test.ts
  • packages/analytics/tsconfig.json
  • packages/api-client/package.json
  • packages/api-client/src/index.ts
  • packages/api/README.e2e-local.md
  • packages/api/README.md
  • packages/api/auth-schema.ts
  • packages/api/container_src/package.json
  • packages/api/container_src/server.ts
  • packages/api/d1-migrations/0000_request_query_metrics.sql
  • packages/api/docker-compose.e2e.yml
  • packages/api/drizzle/0037_big_archangel.sql
  • packages/api/drizzle/0048_sturdy_felicia_hardy.sql
  • packages/api/drizzle/0049_even_lizard.sql
  • packages/api/drizzle/meta/0048_snapshot.json
  • packages/api/drizzle/meta/0049_snapshot.json
  • packages/api/drizzle/meta/_journal.json
  • packages/api/migrate.ts
  • packages/api/package.json
  • packages/api/scripts/e2e-local-init.sh
  • packages/api/scripts/e2e-local-init.ts
  • packages/api/scripts/e2e-local-start.sh
  • packages/api/scripts/e2e-local-start.ts
  • packages/api/scripts/e2e-local-stop.sh
  • packages/api/scripts/e2e-local-stop.ts
  • packages/api/scripts/e2e-node-server.ts
  • packages/api/scripts/generate-openapi.ts
  • packages/api/src/__tests__/auth-cors.test.ts
  • packages/api/src/app.ts
  • packages/api/src/auth/__tests__/auth.helpers.test.ts
  • packages/api/src/auth/__tests__/consent-page.test.ts
  • packages/api/src/auth/__tests__/mcp-token.test.ts
  • packages/api/src/auth/__tests__/oauth-provider.test.ts
  • packages/api/src/auth/__tests__/session-storage.test.ts
  • packages/api/src/auth/auth.config.ts
  • packages/api/src/auth/consent-route.ts
  • packages/api/src/auth/index.ts
  • packages/api/src/auth/local-e2e.ts
  • packages/api/src/auth/mcp-token.ts
  • packages/api/src/db/index.ts
  • packages/api/src/db/metricsDb.ts
  • packages/api/src/db/seed-claude-oauth-client.ts
  • packages/api/src/db/seed-dev.ts
  • packages/api/src/db/seed-e2e-catalog.ts
  • packages/api/src/db/seed-e2e-user.ts
  • packages/api/src/db/seed-inspector-oauth-client.ts
  • packages/api/src/db/seed.ts
  • packages/api/src/e2e-worker.ts
  • packages/api/src/index.ts
  • packages/api/src/middleware/__tests__/auth-mcp-token.test.ts
  • packages/api/src/middleware/__tests__/cfAccess.test.ts
  • packages/api/src/middleware/auth.ts
  • packages/api/src/routes/admin/analytics/catalog.ts
  • packages/api/src/routes/admin/analytics/db.ts
  • packages/api/src/routes/admin/analytics/index.ts
  • packages/api/src/routes/admin/analytics/platform.ts
  • packages/api/src/routes/admin/analytics/query-metrics.ts
  • packages/api/src/routes/admin/index.ts
  • packages/api/src/routes/admin/trails.ts
  • packages/api/src/routes/catalog/__tests__/instanceId.test.ts
  • packages/api/src/routes/catalog/index.ts
  • packages/api/src/routes/chat.ts
  • packages/api/src/routes/feed/index.ts
  • packages/api/src/routes/guides/index.ts
  • packages/api/src/routes/packTemplates/index.ts
  • packages/api/src/routes/packs/index.ts
  • packages/api/src/routes/passwordReset.ts
  • packages/api/src/routes/seasonSuggestions.ts
  • packages/api/src/routes/trailConditions/reports.ts
  • packages/api/src/routes/trails/index.ts
  • packages/api/src/routes/trips/index.ts
  • packages/api/src/routes/upload.ts
  • packages/api/src/routes/user/index.ts
  • packages/api/src/routes/weather.ts
  • packages/api/src/routes/wildlife/index.ts
  • packages/api/src/services/__tests__/dbMetricsService.test.ts
  • packages/api/src/services/__tests__/embeddingService.test.ts
  • packages/api/src/services/__tests__/packService.test.ts
  • packages/api/src/services/__tests__/passwordResetService.test.ts
  • packages/api/src/services/__tests__/userService.test.ts
  • packages/api/src/services/catalogService.ts
  • packages/api/src/services/dbMetricsService.ts
  • packages/api/src/services/embeddingService.ts
  • packages/api/src/services/etl/CatalogItemValidator.ts
  • packages/api/src/services/etl/__tests__/CatalogItemValidator.test.ts
  • packages/api/src/services/etl/__tests__/processValidItemsBatch.test.ts
  • packages/api/src/services/etl/processCatalogEtl.ts
  • packages/api/src/services/etl/processLogsBatch.ts
  • packages/api/src/services/etl/processValidItemsBatch.ts
  • packages/api/src/services/etl/updateEtlJobProgress.ts
  • packages/api/src/services/executeSqlAiTool.ts
  • packages/api/src/services/imageDetectionService.ts
  • packages/api/src/services/packItemService.ts
  • packages/api/src/services/packService.ts
  • packages/api/src/services/passwordResetService.ts
  • packages/api/src/services/r2-bucket.ts
  • packages/api/src/services/retention/__tests__/invalidLogRetention.test.ts
  • packages/api/src/services/retention/invalidLogRetention.ts
  • packages/api/src/services/trails.ts
  • packages/api/src/services/userService.ts
  • packages/api/src/utils/DbUtils.ts
  • packages/api/src/utils/__tests__/cors-origins.test.ts
  • packages/api/src/utils/__tests__/csv-utils.test.ts
  • packages/api/src/utils/__tests__/embeddingHelper.test.ts
  • packages/api/src/utils/__tests__/env-validation.test.ts
  • packages/api/src/utils/__tests__/json-utils.catch-branches.test.ts
  • packages/api/src/utils/__tests__/json-utils.test.ts
  • packages/api/src/utils/__tests__/queryMetrics.test.ts
  • packages/api/src/utils/__tests__/sentry.test.ts
  • packages/api/src/utils/auth.ts
  • packages/api/src/utils/buildInstanceId.ts
  • packages/api/src/utils/compute-pack.ts
  • packages/api/src/utils/cors-origins.ts
  • packages/api/src/utils/csv-utils.ts
  • packages/api/src/utils/embeddingHelper.ts
  • packages/api/src/utils/env-validation.ts
  • packages/api/src/utils/json-utils.ts
  • packages/api/src/utils/logger.ts
  • packages/api/src/utils/openapi.ts
  • packages/api/src/utils/queryMetrics.ts
  • packages/api/src/utils/sentry.ts
  • packages/api/src/workflows/catalog-etl-workflow.ts
  • packages/api/src/workflows/shared/__tests__/chunk-csv-for-r2.test.ts
  • packages/api/src/workflows/shared/chunkCsvForR2.ts
  • packages/api/test/admin-auth-guard.test.ts
  • packages/api/test/admin-jwt.test.ts
  • packages/api/test/admin.test.ts
  • packages/api/test/catalog.test.ts
  • packages/api/test/db-schema-etl.test.ts
  • packages/api/test/etl.test.ts
  • packages/api/test/executeSqlAiTool.test.ts
  • packages/api/test/fixtures/catalog-fixtures.ts
  • packages/api/test/middleware/adminMiddleware.test.ts
  • packages/api/test/middleware/auth.test.ts
  • packages/api/test/packs.test.ts
  • packages/api/test/setup.ts
  • packages/api/test/utils/db-helpers.ts
  • packages/api/test/weather.test.ts
  • packages/api/tsconfig.json
  • packages/api/vitest.config.ts
  • packages/api/vitest.unit.config.ts
  • packages/api/wrangler.jsonc
  • packages/app/package.json
  • packages/app/src/features/pack/create/queries.ts
  • packages/app/tsconfig.json
  • packages/checks/package.json
  • packages/checks/src/check-utils-provenance.test.ts
  • packages/checks/src/check-utils-provenance.ts
  • packages/checks/tsconfig.json
  • packages/checks/vitest.config.ts
  • packages/cli/package.json
  • packages/cli/src/api/config.ts
  • packages/cli/src/api/run.ts
  • packages/cli/src/commands/admin/analytics.ts
  • packages/cli/src/commands/admin/catalog.ts
  • packages/cli/src/commands/admin/etl.ts
  • packages/cli/src/commands/admin/packs.ts
  • packages/cli/src/commands/admin/trails.ts
  • packages/cli/src/commands/admin/users.ts
  • packages/cli/src/commands/ai/index.ts
  • packages/cli/src/commands/auth/login.ts
  • packages/cli/src/commands/auth/refresh.ts
  • packages/cli/src/commands/auth/register.ts
  • packages/cli/src/commands/catalog/index.ts
  • packages/cli/src/commands/feed/index.ts
  • packages/cli/src/commands/packs/create.ts
  • packages/cli/src/commands/packs/gap-analysis.ts
  • packages/cli/src/commands/packs/get.ts
  • packages/cli/src/commands/packs/items.ts
  • packages/cli/src/commands/packs/list.ts
  • packages/cli/src/commands/seasons/index.ts
  • packages/cli/src/commands/templates/index.ts
  • packages/cli/src/commands/trails/index.ts
  • packages/cli/src/commands/trips/index.ts
  • packages/cli/src/commands/user/index.ts
  • packages/cli/src/commands/weather/index.ts
  • packages/cli/src/index.ts
  • packages/cli/tsconfig.json
  • packages/config/package.json
  • packages/config/tsconfig.json
  • packages/consent-ui/package.json
  • packages/consent-ui/src/consent-page.tsx
  • packages/consent-ui/src/index.ts
  • packages/consent-ui/src/sign-in-page.tsx
  • packages/consent-ui/tsconfig.json
  • packages/constants/package.json
  • packages/constants/src/index.ts
  • packages/db/package.json
  • packages/db/src/d1Schema.ts
  • packages/db/src/index.ts
  • packages/db/src/projections.ts
  • packages/db/src/schema.ts
  • packages/db/tsconfig.json
  • packages/env/package.json
  • packages/env/scripts/no-raw-process-env.ts
  • packages/env/src/expo-client.ts
  • packages/env/src/node.ts
  • packages/env/tsconfig.json
  • packages/guards/package.json
  • packages/guards/src/index.ts
  • packages/guards/src/narrow.ts
  • packages/guards/tsconfig.json
  • packages/mcp/.dev.vars.example
  • packages/mcp/README.md
  • packages/mcp/package.json
  • packages/mcp/scripts/dump-catalog.ts
  • packages/mcp/scripts/submission-readiness.ts
  • packages/mcp/src/__tests__/_access.ts
  • packages/mcp/src/__tests__/_tool-harness.ts
  • packages/mcp/src/__tests__/annotations.test.ts
  • packages/mcp/src/__tests__/auth.test.ts
  • packages/mcp/src/__tests__/client.test.ts
  • packages/mcp/src/__tests__/constants.test.ts
  • packages/mcp/src/__tests__/cors.test.ts
  • packages/mcp/src/__tests__/elicit.test.ts
  • packages/mcp/src/__tests__/enums.test.ts
  • packages/mcp/src/__tests__/favicon.test.ts
  • packages/mcp/src/__tests__/integration/health-status.test.ts
  • packages/mcp/src/__tests__/integration/oauth-flow.test.ts
  • packages/mcp/src/__tests__/integration/well-known.test.ts
  • packages/mcp/src/__tests__/metadata.test.ts
  • packages/mcp/src/__tests__/observability.test.ts
  • packages/mcp/src/__tests__/output-schemas.test.ts
  • packages/mcp/src/__tests__/prompts.test.ts
  • packages/mcp/src/__tests__/rate-limit.test.ts
  • packages/mcp/src/__tests__/request-helpers.test.ts
  • packages/mcp/src/__tests__/resources.test.ts
  • packages/mcp/src/__tests__/scopes.test.ts
  • packages/mcp/src/__tests__/submission-readiness.test.ts
  • packages/mcp/src/__tests__/token-verify.test.ts
  • packages/mcp/src/__tests__/tools-admin-handlers.test.ts
  • packages/mcp/src/__tests__/tools-admin.test.ts
  • packages/mcp/src/__tests__/tools-ai.test.ts
  • packages/mcp/src/__tests__/tools-alltrails.test.ts
  • packages/mcp/src/__tests__/tools-auth.test.ts
  • packages/mcp/src/__tests__/tools-catalog.test.ts
  • packages/mcp/src/__tests__/tools-feed.test.ts
  • packages/mcp/src/__tests__/tools-guides.test.ts
  • packages/mcp/src/__tests__/tools-knowledge.test.ts
  • packages/mcp/src/__tests__/tools-packTemplates.test.ts
  • packages/mcp/src/__tests__/tools-packs.test.ts
  • packages/mcp/src/__tests__/tools-seasons.test.ts
  • packages/mcp/src/__tests__/tools-trail-conditions.test.ts
  • packages/mcp/src/__tests__/tools-trails.test.ts
  • packages/mcp/src/__tests__/tools-trips.test.ts
  • packages/mcp/src/__tests__/tools-upload.test.ts
  • packages/mcp/src/__tests__/tools-user.test.ts
  • packages/mcp/src/__tests__/tools-weather.test.ts
  • packages/mcp/src/__tests__/tools-wildlife.test.ts
  • packages/mcp/src/auth.ts
  • packages/mcp/src/client.ts
  • packages/mcp/src/constants.ts
  • packages/mcp/src/cors.ts
  • packages/mcp/src/elicit.ts
  • packages/mcp/src/enums.ts
  • packages/mcp/src/favicon.ts
  • packages/mcp/src/glossary.ts
  • packages/mcp/src/index.ts
  • packages/mcp/src/metadata.ts
  • packages/mcp/src/observability.ts
  • packages/mcp/src/output-schemas.ts
  • packages/mcp/src/prompts.ts
  • packages/mcp/src/rate-limit.ts
  • packages/mcp/src/registerTool.ts
  • packages/mcp/src/request-helpers.ts
  • packages/mcp/src/resources.ts
  • packages/mcp/src/scopes.ts
  • packages/mcp/src/token-verify.ts
  • packages/mcp/src/tools/admin.ts
  • packages/mcp/src/tools/ai.ts
  • packages/mcp/src/tools/alltrails.ts
  • packages/mcp/src/tools/auth.ts
  • packages/mcp/src/tools/catalog.ts
  • packages/mcp/src/tools/feed.ts
  • packages/mcp/src/tools/guides.ts
  • packages/mcp/src/tools/knowledge.ts
  • packages/mcp/src/tools/packTemplates.ts
  • packages/mcp/src/tools/packs.ts
  • packages/mcp/src/tools/seasons.ts
  • packages/mcp/src/tools/trail-conditions.ts
  • packages/mcp/src/tools/trails.ts
  • packages/mcp/src/tools/trips.ts
  • packages/mcp/src/tools/upload.ts
  • packages/mcp/src/tools/user.ts
  • packages/mcp/src/tools/weather.ts
  • packages/mcp/src/tools/wildlife.ts
  • packages/mcp/src/types.ts
  • packages/mcp/tsconfig.json
  • packages/mcp/vitest.config.ts
  • packages/mcp/vitest.integration.config.ts
  • packages/mcp/vitest.unit.config.ts
  • packages/mcp/vitest.workspace.ts
  • packages/mcp/wrangler.jsonc
  • packages/osm-db/package.json
  • packages/osm-db/tsconfig.json
  • packages/osm-import/package.json
  • packages/osm-import/tsconfig.json
  • packages/overpass/package.json
  • packages/overpass/tsconfig.json
  • packages/schemas/package.json
  • packages/schemas/src/admin.ts
  • packages/schemas/src/catalog.ts
  • packages/schemas/src/packs.ts
  • packages/schemas/src/users.ts
  • packages/schemas/tsconfig.json
  • packages/types/package.json
  • packages/typescript-config/package.json
  • packages/typescript-config/tsconfig.json
  • packages/ui/nativewind-env.d.ts
  • packages/ui/nativewindui/index.ts
  • packages/ui/package.json
  • packages/ui/src/app-bar/AppBarAndroid.tsx
  • packages/ui/src/app-bar/index.tsx
  • packages/ui/src/ios-transparent-header-overlap-fix.tsx
  • packages/ui/src/search-overlay/SearchOverlay.ios.tsx
  • packages/ui/src/search-overlay/SearchOverlay.tsx
  • packages/ui/src/search-overlay/index.ts
  • packages/ui/src/search-overlay/types.ts
  • packages/ui/tsconfig.json
  • packages/units/package.json
  • packages/units/tsconfig.json
  • packages/utils/package.json
  • packages/utils/src/array.ts
  • packages/utils/src/async.ts
  • packages/utils/src/fn.ts
  • packages/utils/src/index.ts
  • packages/utils/src/json.test.ts
  • packages/utils/src/json.ts
  • packages/utils/src/math.ts
  • packages/utils/src/object.ts
  • packages/utils/src/predicates.ts
  • packages/utils/src/provenance.test.ts
  • packages/utils/src/provenance.ts
  • packages/utils/src/string.ts
  • packages/utils/src/surface.test.ts
  • packages/utils/vitest.config.ts
  • packages/web-ui/package.json
  • packages/web-ui/src/components/chart.tsx
  • packages/web-ui/tsconfig.json
  • patches/@packrat-ai%2Fnativewindui@2.0.3.patch
  • patches/react-native-ios-utilities@5.2.0.patch
  • portless.json
  • scripts/check-all.ts
  • scripts/lint/__tests__/no-duplicate-utils.test.ts
  • scripts/lint/check-duplication.ts
  • scripts/lint/nativewindui-migration.ts
  • scripts/lint/no-direct-wrapped-imports.ts
  • scripts/lint/no-duplicate-utils.ts
  • scripts/lint/no-owned-max-params.ts
  • scripts/lint/no-raw-ast-grep.ts
  • scripts/lint/no-raw-regex.ts
  • scripts/lint/no-raw-typeof.ts
  • scripts/lint/no-undocumented-overrides.test.ts
  • scripts/lint/no-undocumented-overrides.ts
  • scripts/lint/no-unprojected-fat-table-queries.ts
  • scripts/portless-check.ts
  • scripts/portless-setup.sh
  • scripts/portless-urls.ts
  • sgconfig.yml
  • tsconfig.json

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch release/v2.1.0

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actions github-actions Bot added documentation Improvements or additions to documentation dependencies Pull requests that update a dependency file api ci/cd mobile web database labels Jun 28, 2026
@github-actions

Copy link
Copy Markdown
Contributor

Coverage Report for packages/units (./packages/units)

Status Category Percentage Covered / Total
🔵 Lines 100% (🎯 100%) 35 / 35
🔵 Statements 100% (🎯 100%) 35 / 35
🔵 Functions 100% (🎯 100%) 6 / 6
🔵 Branches 100% (🎯 100%) 11 / 11
File CoverageNo changed files found.
Generated in workflow #398 for commit a1b4362 by the Vitest Coverage Report Action

@github-actions

Copy link
Copy Markdown
Contributor

Coverage Report for packages/analytics (./packages/analytics)

Status Category Percentage Covered / Total
🔵 Lines 100% (🎯 80%) 745 / 745
🔵 Statements 100% (🎯 80%) 745 / 745
🔵 Functions 100% (🎯 85%) 48 / 48
🔵 Branches 87.35% (🎯 80%) 152 / 174
File Coverage
File Stmts Branches Functions Lines Uncovered Lines
Changed Files
packages/analytics/src/core/cache-metadata.ts 100% 93.33% 100% 100%
Generated in workflow #398 for commit a1b4362 by the Vitest Coverage Report Action

@github-actions

Copy link
Copy Markdown
Contributor

Coverage Report for apps/expo (./apps/expo)

Status Category Percentage Covered / Total
🔵 Lines 97.64% (🎯 95%) 623 / 638
🔵 Statements 97.64% (🎯 95%) 623 / 638
🔵 Functions 100% (🎯 97%) 52 / 52
🔵 Branches 95.19% (🎯 92%) 218 / 229
File Coverage
File Stmts Branches Functions Lines Uncovered Lines
Changed Files
apps/expo/features/packs/utils/computeCategories.ts 100% 100% 100% 100%
apps/expo/features/trips/utils/tripDateUtils.ts 100% 93.75% 100% 100%
apps/expo/lib/utils/getRemoteImageCacheKey.ts 100% 75% 100% 100%
apps/expo/utils/storage.ts 100% 100% 100% 100%
apps/expo/utils/weight.ts 100% 100% 100% 100%
Generated in workflow #398 for commit a1b4362 by the Vitest Coverage Report Action

@github-actions

Copy link
Copy Markdown
Contributor

Coverage Report for packages/utils (./packages/utils)

Status Category Percentage Covered / Total
🔵 Lines 100% (🎯 100%) 92 / 92
🔵 Statements 100% (🎯 100%) 92 / 92
🔵 Functions 100% (🎯 100%) 1 / 1
🔵 Branches 100% (🎯 100%) 1 / 1
File Coverage
File Stmts Branches Functions Lines Uncovered Lines
Changed Files
packages/utils/src/array.ts 100% 100% 100% 100%
packages/utils/src/async.ts 100% 100% 100% 100%
packages/utils/src/fn.ts 100% 100% 100% 100%
packages/utils/src/index.ts 100% 100% 100% 100%
packages/utils/src/json.ts 100% 100% 100% 100%
packages/utils/src/math.ts 100% 100% 100% 100%
packages/utils/src/object.ts 100% 100% 100% 100%
packages/utils/src/predicates.ts 100% 100% 100% 100%
packages/utils/src/provenance.ts 100% 100% 100% 100%
packages/utils/src/string.ts 100% 100% 100% 100%
Generated in workflow #398 for commit a1b4362 by the Vitest Coverage Report Action

@github-actions

Copy link
Copy Markdown
Contributor

Coverage Report for packages/overpass (./packages/overpass)

Status Category Percentage Covered / Total
🔵 Lines 100% (🎯 80%) 155 / 155
🔵 Statements 100% (🎯 80%) 155 / 155
🔵 Functions 100% (🎯 80%) 13 / 13
🔵 Branches 95.65% (🎯 70%) 44 / 46
File CoverageNo changed files found.
Generated in workflow #398 for commit a1b4362 by the Vitest Coverage Report Action

@github-actions

Copy link
Copy Markdown
Contributor

Coverage Report for packages/api (./packages/api)

Status Category Percentage Covered / Total
🔵 Lines 98.91% (🎯 95%) 1547 / 1564
🔵 Statements 98.91% (🎯 95%) 1547 / 1564
🔵 Functions 100% (🎯 97%) 83 / 83
🔵 Branches 96.94% (🎯 92%) 571 / 589
File Coverage
File Stmts Branches Functions Lines Uncovered Lines
Changed Files
packages/api/src/auth/consent-route.ts 90.54% 94.11% 100% 90.54% 50-56
packages/api/src/auth/mcp-token.ts 100% 88.88% 100% 100%
packages/api/src/services/dbMetricsService.ts 100% 100% 100% 100%
packages/api/src/services/embeddingService.ts 100% 100% 100% 100%
packages/api/src/services/passwordResetService.ts 100% 100% 100% 100%
packages/api/src/services/userService.ts 100% 84.61% 100% 100%
packages/api/src/services/retention/invalidLogRetention.ts 100% 100% 100% 100%
packages/api/src/utils/auth.ts 100% 93.33% 100% 100%
packages/api/src/utils/buildInstanceId.ts 100% 100% 100% 100%
packages/api/src/utils/compute-pack.ts 100% 100% 100% 100%
packages/api/src/utils/cors-origins.ts 100% 100% 100% 100%
packages/api/src/utils/csv-utils.ts 97.73% 92.72% 100% 97.73% 136-137, 153-154, 175-176
packages/api/src/utils/embeddingHelper.ts 100% 98.68% 100% 100%
packages/api/src/utils/json-utils.ts 100% 100% 100% 100%
packages/api/src/utils/logger.ts 95.83% 97.29% 100% 95.83% 62-65
packages/api/src/utils/queryMetrics.ts 100% 100% 100% 100%
packages/api/src/workflows/shared/chunkCsvForR2.ts 100% 100% 100% 100%
Generated in workflow #398 for commit a1b4362 by the Vitest Coverage Report Action

@mikib0
mikib0 requested a review from andrew-bierman June 28, 2026 18:21
@mikib0
mikib0 merged commit 25c2221 into main Jul 20, 2026
33 of 36 checks passed
@mikib0
mikib0 deleted the release/v2.1.0 branch July 20, 2026 16:38
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

api ci/cd database dependencies Pull requests that update a dependency file documentation Improvements or additions to documentation mobile web

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants