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-*"