Skip to content

feat: declare supported integrations for every official plugin - #457

Merged
V3RON merged 2 commits into
claude/plugin-integration-compatibility-yj0odcfrom
claude/plugin-integration-declarations
Aug 31, 2026
Merged

feat: declare supported integrations for every official plugin#457
V3RON merged 2 commits into
claude/plugin-integration-compatibility-yj0odcfrom
claude/plugin-integration-declarations

Conversation

@V3RON

@V3RON V3RON commented Aug 22, 2026

Copy link
Copy Markdown
Contributor

Description

Stacked on #456, which added the integrations field. This fills it in for all fourteen official plugins, so the gate has something to read when enforcement lands.

Declaration Plugins
react-native SQLite, Storage, File System, Performance Monitor
react-native, react-native-web Network Activity, Overlay, React Navigation, Require Profiler, Expo Atlas, Feature Flags, Redux DevTools
all four Controls, React Hook Form, TanStack Query

Related 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 wrap expo-file-system and react-native-fs; Performance Monitor reads react-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/metro already stubs react-native/Libraries/WebSocket/WebSocketInterceptor when the platform is web, so it was built to run there. Overlay is react-native plus react-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 static import { NativeModules } from 'react-native' — and that file is reachable unconditionally from the device entry (runtime.tssymbolication/trace.tssymbolication/metro.ts). react-native.ts deliberately loads that runtime on Lynx, so declaring lynx today would promise something a Lynx bundler cannot resolve. It declares react-native-web instead. 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-web is declared wherever lynx is, 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 — passed
  • pnpm test:affected — 63/63 tasks
  • pnpm release:plan — recognises the changeset

The 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

@V3RON
V3RON force-pushed the claude/plugin-integration-declarations branch from 1474e48 to 2467d2b Compare August 31, 2026 08:19
@V3RON
V3RON force-pushed the claude/plugin-integration-declarations branch from 2467d2b to f2ff0f8 Compare August 31, 2026 08:22
claude and others added 2 commits August 31, 2026 11:13
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
V3RON force-pushed the claude/plugin-integration-declarations branch from f2ff0f8 to af6beaa Compare August 31, 2026 09:14
@V3RON
V3RON merged commit 3a29044 into main Aug 31, 2026
4 checks passed
@V3RON
V3RON deleted the claude/plugin-integration-declarations branch August 31, 2026 09:27
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants