pnpm-workspace.yaml

packages:
  - apps/*
  - infra/*
  - oxlint-plugin-t3code
  - packages/*
  - scripts

# Successor to onlyBuiltDependencies/ignoredBuiltDependencies (pnpm 11+).
# true = allowed to run build scripts; false mirrors the pnpm 10 behavior
# where anything outside onlyBuiltDependencies was silently not built.
allowBuilds:
  browser-tabs-lock: false
  bufferutil: false
  core-js: false
  # No install script since Electron 44; ensure:electron runs install.js.
  # Keep the key: pnpm fails installs that still record a removed `true`.
  electron: false
  electron-winstaller: false
  esbuild: true
  msgpackr-extract: true
  msw: false
  node-pty: true
  # Ships N-API prebuilds; its install script only rebuilds from source.
  objc-js: false
  "react-native-enriched-markdown@file:apps/mobile/deps/react-native-enriched-markdown-1.2.0-t3.15-fee84114.tgz": true
  sharp: true
  "@tsc-rs/typescript": true
  utf-8-validate: false
  workerd: false

catalog:
  "@clerk/backend": 3.25.0
  "@clerk/clerk-js": 6.40.0
  "@clerk/electron": 0.1.3
  "@clerk/electron-passkeys": 0.0.3
  "@clerk/expo": 4.13.0
  "@clerk/react": 6.18.0
  "@clerk/shared": 4.41.0
  # Must match the version alchemy depends on: the relay overrides its
  # Cloudflare retry policy through this package's Retry service.
  "@distilled.cloud/cloudflare": 1.0.0-rc.13
  "@effect/atom-react": 4.0.5
  "@effect/graphql-generator": 4.0.5
  "@effect/openapi-generator": 4.0.5
  "@effect/platform-node": 4.0.5
  "@effect/platform-node-shared": 4.0.5
  "@effect/sql-pg": 4.0.5
  "@effect/sql-sqlite-do": 4.0.5
  "@effect/vitest": 4.0.5
  "@electron-webauthn/macos": 1.3.1
  "@legendapp/list": 3.3.5
  "@noble/curves": 1.9.1
  "@noble/hashes": 1.8.0
  "@pierre/diffs": 1.5.2
  "@tailwindcss/node": 4.3.3
  "@tailwindcss/oxide": 4.3.3
  "@tailwindcss/vite": 4.3.3
  "@types/node": 24.12.4
  "@types/plist": 3.0.5
  "@types/react": ~19.3.0
  "@types/react-dom": ~19.3.0
  "@types/ws": 8.18.2
  effect: 4.0.5
  electron-webauthn: 1.3.1
  jose: 6.2.2
  lightningcss: 1.33.0
  objc-js: 1.5.0
  plist: 3.1.1
  react: 19.3.0
  react-dom: 19.3.0
  tailwindcss: 4.3.3
  tldts: 7.4.2
  typescript: npm:@tsc-rs/typescript@0.8.0
  undici: 8.11.2
  vite: npm:@voidzero-dev/vite-plus-core@1.3.0
  vite-plus: 1.3.0
  ws: 8.22.0
  yaml: ^2.9.0
  # Markdown pipeline: the server counts find matches with the same parser the
  # web renders with, so both must resolve to one version.
  mdast-util-directive: 3.1.0
  micromark-extension-directive: 4.0.0
  micromark-util-character: 2.1.1
  micromark-util-types: 2.0.2
  rehype-raw: 7.0.0
  rehype-sanitize: 6.0.0
  remark-breaks: 4.0.0
  remark-gfm: 4.0.1
  remark-parse: 11.0.0
  remark-rehype: 11.1.2
  unified: 11.0.5

minimumReleaseAgeExclude:
  - "@tsc-rs/*"
  - expo-glass-effect@58.0.4
  - expo-blur@58.0.4
  - expo-audio@58.0.9
  - "@clerk/backend@3.25.0"
  - "@clerk/clerk-js@6.40.0"
  - "@clerk/electron@0.1.3"
  - "@clerk/expo-native-components@0.2.0"
  - "@clerk/expo@4.13.0"
  - "@clerk/react@6.18.0"
  - "@clerk/shared@4.41.0"
  - "@distilled.cloud/aws@1.0.0-rc.13"
  - "@distilled.cloud/axiom@1.0.0-rc.13"
  - "@distilled.cloud/cloudflare@1.0.0-rc.13"
  - "@distilled.cloud/core@1.0.0-rc.13"
  - "@distilled.cloud/neon@1.0.0-rc.13"
  - "@distilled.cloud/planetscale@1.0.0-rc.13"
  - "@effect/atom-react@4.0.5"
  - "@effect/graphql-generator@4.0.5"
  - "@effect/openapi-generator@4.0.5"
  - "@effect/platform-node-shared@4.0.5"
  - "@effect/platform-node@4.0.5"
  - "@effect/sql-pg@4.0.5"
  - "@effect/sql-sqlite-do@4.0.5"
  - "@effect/vitest@4.0.5"
  - alchemy@2.0.0-beta.80
  - effect@4.0.5
  - "@legendapp/list@3.3.5"
  - "@expo/cli@58.1.1 || 58.1.9 || 58.1.11"
  - "@expo/env@2.5.1"
  - "@expo/fingerprint@0.21.2"
  - "@expo/metro-config@58.0.14"
  - expo-constants@58.0.12
  - expo-font@58.0.8
  - expo-updates@58.0.17
  - expo@58.0.14
  - expo-widgets@58.0.20
  - "@expo/config-plugins@58.0.9"
  - "@expo/log-box@58.0.8"
  - "@expo/metro-file-map@58.0.3"
  - "@expo/metro-runtime@58.0.14"
  - "@expo/metro@58.0.0-rc.0"
  - "@expo/prebuild-config@58.0.7 || 58.0.14"
  - "@expo/router-server@58.0.6 || 58.0.14"
  - "@expo/ui@58.0.20"
  - babel-preset-expo@58.0.17
  - expo-asset@58.0.16
  - expo-build-properties@58.0.11
  - expo-dev-client@58.0.14
  - expo-dev-launcher@58.0.10 || 58.0.14
  - expo-dev-menu@58.0.10
  - expo-image-manipulator@58.0.14
  - expo-image-picker@58.0.10
  - expo-image@58.0.15
  - expo-linking@58.0.13
  - expo-modules-autolinking@58.0.7
  - expo-modules-core@58.0.11 || 58.0.19 || 58.0.22
  - expo-modules-jsi@58.0.7 || 58.0.14 || 58.0.15
  - expo-notifications@58.1.5
  - expo-sharing@58.0.19
  - expo-sqlite@58.0.13
  - expo-symbols@58.0.4
  - electron@44.9.3
  - "@anthropic-ai/claude-agent-sdk@0.3.276"
  - "@alchemy.run/cloudflare-runtime@2.0.0-beta.80"
  - "@alchemy.run/floci@2.0.0-beta.80"
  - "@alchemy.run/node-utils@2.0.0-beta.80"
  - "@distilled.cloud/fly-io@1.0.0-rc.13"
  - "@distilled.cloud/hetzner@1.0.0-rc.13"
  - "@distilled.cloud/prisma@1.0.0-rc.13"
  - "@distilled.cloud/railway@1.0.0-rc.13"
  - "@distilled.cloud/stripe@1.0.0-rc.13"
  - "@shadcn/lint@0.1.5"
  - cn@0.3.2
  - uniwind@1.13.0
  - "@expo/dom-webview@58.0.2"
  - "expo-auth-session@58.0.13"
  - "expo-camera@58.0.10"
  - "expo-clipboard@58.0.3"
  - "expo-crypto@58.0.7"
  - "expo-device@58.0.5"
  - "expo-document-picker@58.0.4"
  - "expo-file-system@58.0.9"
  - "expo-haptics@58.0.7"
  - "expo-keep-awake@58.0.3"
  - "expo-network@58.0.3"
  - "expo-secure-store@58.0.2"
  - "expo-splash-screen@58.0.10"
  - "expo-video@58.0.11"
  - "expo-web-browser@58.0.6"
  - "react@19.3.0"
  - "react-dom@19.3.0"
  - "react-native@0.88.0"
  - "react-native-keyboard-controller@1.22.7"
  - "react-native-worklets@0.13.0"
  - "react-native-reanimated@4.7.1"
  - "react-native-screens@4.28.0"
  - "@expo/config-types@58.0.3"
  - expo-application@58.0.3 || 58.1.2
  - expo-eas-client@58.0.2
  - expo-image-loader@58.0.3
  - "@distilled.cloud/acme@1.0.0-rc.13"
  - "@distilled.cloud/doppler@1.0.0-rc.13"
  - "@distilled.cloud/gcp@1.0.0-rc.13"
  - "@distilled.cloud/infisical@1.0.0-rc.13"
  - "@distilled.cloud/zerossl@1.0.0-rc.13"
  - "@opencode/client@2.0.28"
  - "@opencode/protocol@2.0.28"
  - "@opencode/schema@2.0.28"
  - "@muse-code/sdk@1.4.6"
  - "@expo/package-manager@1.14.2"
  - "@react-native/asset-utils@0.88.0"
  - "@react-native/babel-plugin-codegen@0.88.0"
  - "@react-native/babel-preset@0.88.0"
  - "@react-native/codegen@0.88.0"
  - "@react-native/community-cli-plugin@0.88.0"
  - "@react-native/debugger-frontend@0.88.0"
  - "@react-native/debugger-shell@0.88.0"
  - "@react-native/dev-middleware@0.88.0"
  - "@react-native/gradle-plugin@0.88.0"
  - "@react-native/js-polyfills@0.88.0"
  - "@react-native/metro-babel-transformer@0.88.0"
  - "@react-native/metro-config@0.88.0"
  - "@react-native/normalize-colors@0.88.0"
  - "@react-native/virtualized-lists@0.88.0"
  - react-native-svg@15.16.0
  - "@expo/schema-utils@58.0.2"
  - pele@1.8.0

overrides:
  # Keep on the patched version. A fresh resolution would take a newer release and
  # fail on the unused patch. Move this with patches/expo-modules-core@*.patch.
  expo-modules-core: 58.0.22
  # Keep jsdom's optional peer consistent so Vite+ has one test-runner instance.
  "@exodus/bytes>@noble/hashes": "1.8.0"
  # Earlier React Navigation declarations create a circular type alias in TypeScript 7.
  # Move this with @react-navigation/native: an older core than it requires crashes
  # every native stack at launch.
  "@react-navigation/core": 7.24.0
  # The dbus-next patch drops usocket from the package, but pnpm resolves from the
  # registry manifest, so the edge has to be cut here as well.
  "dbus-next>usocket": "-"
  # The SDK always receives the user's Claude executable, so its bundled binaries are unused.
  "@anthropic-ai/claude-agent-sdk>@anthropic-ai/claude-agent-sdk-darwin-arm64": "-"
  "@anthropic-ai/claude-agent-sdk>@anthropic-ai/claude-agent-sdk-darwin-x64": "-"
  "@anthropic-ai/claude-agent-sdk>@anthropic-ai/claude-agent-sdk-linux-arm64": "-"
  "@anthropic-ai/claude-agent-sdk>@anthropic-ai/claude-agent-sdk-linux-arm64-musl": "-"
  "@anthropic-ai/claude-agent-sdk>@anthropic-ai/claude-agent-sdk-linux-x64": "-"
  "@anthropic-ai/claude-agent-sdk>@anthropic-ai/claude-agent-sdk-linux-x64-musl": "-"
  "@anthropic-ai/claude-agent-sdk>@anthropic-ai/claude-agent-sdk-win32-arm64": "-"
  "@anthropic-ai/claude-agent-sdk>@anthropic-ai/claude-agent-sdk-win32-x64": "-"
  # Alchemy's Ink fork declares React as a hard dependency, but the relay only
  # reaches its terminal-capability helpers; the TUI is never imported, so the
  # extra React copy is pure install weight.
  "@alchemy.run/sigil>react": "-"
  "@alchemy.run/sigil>react-reconciler": "-"
  "@alchemy.run/sigil>scheduler": "-"
  # Alchemy only reaches @prisma/dev through a lazy import inside the Prisma
  # database provider, which the relay never deploys. Its exact hono/valibot
  # pins are also the bulk of our open dependency advisories.
  "alchemy>@prisma/dev": "-"
  "@clerk/backend": "catalog:"
  "@clerk/clerk-js": "catalog:"
  "@clerk/clerk-js>@base-org/account": "-"
  "@clerk/clerk-js>@coinbase/wallet-sdk": "-"
  "@clerk/clerk-js>@solana/wallet-adapter-base": "-"
  "@clerk/clerk-js>@solana/wallet-adapter-react": "-"
  "@clerk/clerk-js>@solana/wallet-standard": "-"
  "@clerk/clerk-js>@wallet-standard/core": "-"
  "@clerk/electron": "catalog:"
  "@clerk/electron-passkeys": "catalog:"
  "@clerk/expo": "catalog:"
  "@clerk/react": "catalog:"
  "@clerk/shared": "catalog:"
  "@effect/atom-react": "catalog:"
  "@effect/platform-node": "catalog:"
  "@effect/platform-node-shared": "catalog:"
  "@effect/sql-pg": "catalog:"
  "@effect/vitest": "catalog:"
  "@effect/vitest>vitest": "-"
  "@expo/dom-webview": 58.0.2
  "@expo/metro-config": 58.0.14
  expo-constants: 58.0.12
  expo-router: 58.0.20
  "expo-sharing>@expo/config-plugins": 58.0.9
  "expo-sharing>@expo/config-types": 58.0.3
  "@pierre/diffs>@shikijs/transformers": ^4.2.0
  # Resolve below remark-math so Vite, Metro and Node use the same tokenizer.
  "remark-math>micromark-extension-math": npm:micromark-extension-llm-math@3.1.0
  micromark-extension-gfm-table: 2.1.1
  # Keep one copy of these native-binary packages. lightningcss ships 11 platform binaries per
  # version, and the workspaces' tailwindcss ^4 ranges drift into two 4.3.x copies of the family.
  "@tailwindcss/node": "catalog:"
  "@tailwindcss/oxide": "catalog:"
  "@tailwindcss/vite": "catalog:"
  "@types/node": "catalog:"
  effect: "catalog:"
  # OpenCode 2's protocol and schema packages hard-pin an exact Effect version as a
  # dependency, and their schemas fail to decode under a second Effect copy.
  # The `effect` override above already collapses them; these name the edge so it
  # stays pinned on its own.
  "@opencode/protocol>effect": "catalog:"
  "@opencode/schema>effect": "catalog:"
  node-abi: 4.33.0
  # The desktop app installs these without a lockfile when it packages them, so
  # pin the native passkey code that runs in its main process.
  "electron-webauthn>@electron-webauthn/macos": "catalog:"
  "@electron-webauthn/macos>objc-js": "catalog:"
  lightningcss: "catalog:"
  tailwindcss: "catalog:"
  # Ranges from @effect/platform-node, jsdom, unifont, Expo and libsql otherwise
  # settle on two patch releases of each major. Older majors stay as they are.
  "@types/ws@^8": "catalog:"
  "undici@^8": "catalog:"
  "ws@^8": "catalog:"
  vite: "catalog:"
  vite-plus: "catalog:"
  yaml: "catalog:"

packageExtensions:
  "@clerk/expo@*":
    dependencies:
      "@expo/config-plugins": 58.0.9
  "@clerk/expo-native-components@*":
    dependencies:
      "@expo/config-plugins": 58.0.9
  # Our patch makes @effect/vitest import vite-plus/test. A catalog: spec here
  # resolves through the vite-plus override above.
  "@effect/vitest@*":
    dependencies:
      vite-plus: "catalog:"

patchedDependencies:
  react-native-image-viewing@0.2.2: patches/react-native-image-viewing@0.2.2.patch
  mdast-util-math@3.0.0: patches/mdast-util-math@3.0.0.patch
  micromark-extension-llm-math@3.1.0: patches/micromark-extension-llm-math@3.1.0.patch
  micromark-extension-gfm-table@2.1.1: patches/micromark-extension-gfm-table@2.1.1.patch
  alchemy@2.0.0-beta.80: patches/alchemy@2.0.0-beta.80.patch
  expo-audio@58.0.9: patches/expo-audio@58.0.9.patch
  expo-network@58.0.3: patches/expo-network@58.0.3.patch
  "@clerk/expo-native-components@0.2.0": patches/@clerk__expo-native-components@0.2.0.patch
  "@effect/vitest@4.0.5": patches/@effect__vitest@4.0.5.patch
  "@expo/metro-config@58.0.14": patches/@expo__metro-config@58.0.14.patch
  expo-sharing@58.0.19: patches/expo-sharing@58.0.19.patch
  expo-widgets@58.0.20: patches/expo-widgets@58.0.20.patch
  "@ff-labs/fff-node@0.11.0": patches/@ff-labs__fff-node@0.11.0.patch
  "@legendapp/list@3.3.5": patches/@legendapp__list@3.3.5.patch
  # Exports the dependency-light subpaths mobile and the web diff parser import, and keeps
  # measured wrapped-row heights above an edit (fileEditorVirtualization.test.ts).
  "@pierre/diffs@1.5.2": patches/@pierre%2Fdiffs@1.5.2.patch
  "@react-native-ai/apple@0.12.0": patches/@react-native-ai__apple@0.12.0.patch
  "@react-native-menu/menu@2.0.0": patches/@react-native-menu__menu@2.0.0.patch
  "@react-navigation/native-stack@7.21.0": patches/@react-navigation%2Fnative-stack@7.21.0.patch
  dbus-next@0.10.2: patches/dbus-next@0.10.2.patch
  node-pty@1.2.0-beta.15: patches/node-pty@1.2.0-beta.15.patch
  react-native-gesture-handler@3.3.0: patches/react-native-gesture-handler@3.3.0.patch
  # Screens v5 stack, split and tab screens leave at once, like legacy screens. Exiting animations
  # inside one otherwise hold its removal for a later mount, after its stack has moved on.
  react-native-reanimated@4.7.1: patches/react-native-reanimated@4.7.1.patch
  react-native-keyboard-controller@1.22.7: patches/react-native-keyboard-controller@1.22.7.patch
  react-native-pdf-jsi@5.0.0: patches/react-native-pdf-jsi@5.0.0.patch
  # Android: a nested WebView hands a vertical drag to its scrolling parent at the page's edge.
  react-native-webview@14.0.1: patches/react-native-webview@14.0.1.patch
  "@expo/ui@58.0.20": patches/@expo__ui@58.0.20.patch
  # Android: a Compose host that requests layout in a mount (a new screen's app bar) is laid out
  # before that frame is drawn, instead of a frame later.
  expo-modules-core@58.0.22: patches/expo-modules-core@58.0.22.patch
  # Android: Maven-resolved gradle plugins (expo-widgets) have no sourceDir; without this
  # skip, the fingerprint silently drops every Expo native module and OTAs reach stale binaries.
  "@expo/fingerprint@0.21.5": patches/@expo__fingerprint@0.21.5.patch
  app-builder-lib@26.16.1: patches/app-builder-lib@26.16.1.patch

peerDependencyRules:
  allowAny:
    - typescript
    - vite
  allowedVersions:
    vite: "*"

# pnpm 12 links agent skills that dependencies ship into .claude/skills once
# approved. We curate our own skills, so deny these to keep installs quiet.
permissions:
  "@tanstack/router-plugin":
    skills: false
  drizzle-kit:
    skills: false
  expo-sqlite:
    skills: false

# @cursor/sdk finds its platform package (sandbox helper, rg, tree-sitter) by
# walking up from the entry script for node_modules/@cursor/sdk-<platform>-<arch>.
# pnpm keeps optional deps inside the virtual store, so hoist it to the root.
publicHoistPattern:
  - "@cursor/sdk-*"