feat: declare supported integrations for every official plugin - #457
Merged
V3RON merged 2 commits intoAug 31, 2026
Conversation
V3RON
force-pushed
the
claude/plugin-integration-declarations
branch
from
August 31, 2026 08:19
1474e48 to
2467d2b
Compare
V3RON
force-pushed
the
claude/plugin-integration-declarations
branch
from
August 31, 2026 08:22
2467d2b to
f2ff0f8
Compare
Each plugin now states which environments it works in, so the compatibility
gate has something to read.
Plugins whose device side depends on a native module declare React Native
only: SQLite (expo-sqlite), Storage (MMKV, SecureStore), File System (its
expo-file-system / react-native-fs adapters) and Performance Monitor
(react-native-performance).
Plugins that use React Native APIs with working web equivalents also
declare Rozenite for Web: Network Activity, Overlay, React Navigation,
Require Profiler, Expo Atlas, Feature Flags and Redux DevTools.
Controls, React Hook Form and TanStack Query are pure JavaScript on the
device — nothing in their runtime imports `react-native` — so they declare
every integration, Lynx included.
Redux DevTools is the one exception to "pure JavaScript means everywhere":
its runtime reaches Metro symbolication through a static
`import { NativeModules } from 'react-native'`, which a Lynx bundler cannot
resolve, so it stops at Rozenite for Web until that import is made lazy.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VyZswYgjDu7i6zoeFct8kX
Network Activity and Require Profiler declared `react-native-web`, but
`react-native-web` exports neither `TurboModuleRegistry` nor
`DevSettings`, and both are reached unconditionally from device code:
`websocket-inspector.ts` evaluates `getWebSocketInterceptor()` as a
default parameter, and the websocket inspector is on by default, so
`TurboModuleRegistry.getEnforcing('WebSocketModule')` runs on plugin
init; `useRequireProfilerDevTools` calls `DevSettings.reload()` on
`reload-and-profile`. Both declare React Native only.
The justification for Network Activity had gone stale: `@rozenite/metro`
does stub `react-native/Libraries/WebSocket/WebSocketInterceptor` on web,
but the plugin no longer imports that module.
Feature Flags imports nothing from `react-native` anywhere in its device
code — its adapters are the LaunchDarkly and Statsig JS SDKs, already
optional peers — so it joins Controls, React Hook Form and TanStack Query
in declaring every integration.
Those four also stop requiring `react-native` as a peer dependency. The
requirement was already untrue and now contradicts the manifest: a plugin
that declares Lynx cannot demand a package Lynx apps do not install.
Their built device entries contain no reference to `react-native`.
Claude-Session: https://claude.ai/code/session_01AEzqE9P3sGFinTPJGK8CBi
V3RON
force-pushed
the
claude/plugin-integration-declarations
branch
from
August 31, 2026 09:14
f2ff0f8 to
af6beaa
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Description
Stacked on #456, which added the
integrationsfield. This fills it in for all fourteen official plugins, so the gate has something to read when enforcement lands.react-nativereact-native,react-native-webRelated Issue
Part of #455 — the annotation sweep that has to ship in the same release as enforcement.
Context
Classification followed one question per plugin: does anything its device side pulls in only work on a phone?
React Native only — the capability itself is native. SQLite is
expo-sqlite, which has no web or Lynx build; Storage covers MMKV and SecureStore; File System's adapters wrapexpo-file-systemandreact-native-fs; Performance Monitor readsreact-native-performance's native marks. These are user-supplied adapters in most cases, so the plugin's own code is portable, but what it exposes is not.Also Rozenite for Web — uses React Native APIs that have working web equivalents. Network Activity is the clearest case:
@rozenite/metroalready stubsreact-native/Libraries/WebSocket/WebSocketInterceptorwhen the platform isweb, so it was built to run there. Overlay isreact-nativeplusreact-native-svg, React Navigation works on web already, Require Profiler and Expo Atlas are Metro-side and Metro serves both platforms.Everywhere, Lynx included — Controls, React Hook Form and TanStack Query. Verified rather than assumed: nothing outside their panel code imports
react-native, so their device runtimes are plain React.Redux DevTools is the one deviation from the rule of thumb, and it is worth a look before merging. It is pure JavaScript in spirit, but its runtime reaches Metro symbolication through
src/symbolication/metro.ts, which does a staticimport { NativeModules } from 'react-native'— and that file is reachable unconditionally from the device entry (runtime.ts→symbolication/trace.ts→symbolication/metro.ts).react-native.tsdeliberately loads that runtime on Lynx, so declaringlynxtoday would promise something a Lynx bundler cannot resolve. It declaresreact-native-webinstead. Making that one import lazy would move it into the "everywhere" row, but that is a behavior change and did not belong in a declaration-only PR.lynx-webis declared whereverlynxis, for consistency. No integration reports it yet, so nothing matches it today.Testing
From the repository root, after
git fetch origin main:pnpm checks:affected— passedpnpm test:affected— 63/63 taskspnpm release:plan— recognises the changesetThe declarations are data, so there is nothing new to unit test here; #456 covers validation of the field itself, including that an unknown id fails the build.
Not verified on a device: no plugin was exercised against a real Lynx or browser target, so the "everywhere" declarations rest on what the code imports rather than on a run.
Generated by Claude Code