From expo-rn-plugin
Load coding standards and conventions for this React Native / Expo project. Use when you need guidance on TypeScript patterns, Tamagui tokens, Zustand stores, Lingui i18n, Doppler env vars, or Zustand state ownership rules.
npx claudepluginhub ksairi/claude --plugin expo-rn-pluginThis skill uses the workspace's default tool permissions.
Apply the following standards to all code in this project.
Guides Payload CMS config (payload.config.ts), collections, fields, hooks, access control, APIs. Debugs validation errors, security, relationships, queries, transactions, hook behavior.
Builds scalable data pipelines, modern data warehouses, and real-time streaming architectures using Spark, dbt, Airflow, Kafka, and cloud platforms like Snowflake, BigQuery.
Builds production Apache Airflow DAGs with best practices for operators, sensors, testing, and deployment. For data pipelines, workflow orchestration, and batch job scheduling.
Apply the following standards to all code in this project.
any — use proper types, generics, or type guardsas assertions — fix types at the sourcetsc --noEmit and fix all errors (zero errors is a baseline)eslint-disable-next-line react-hooks/exhaustive-deps — fix the dependency issueTrans + t for every hardcoded user-visible stringt`…` for prop strings (placeholders, aria labels, alert titles)Trans, useLingui from @lingui/react/macroimport statement per module path (prevents import/no-duplicates)src/theme/tamagui.config.ts; themes: src/theme/themes.ts$surface-app, $text-primary — always check themes.ts before usingallowedStyleValues: "strict" — only token values; raw hex/rgba will error at compile time$sm, $md, $lg from sizesSpaces; radius from radius tokenssrc/components/ — no raw <Text> with style propsStyleSheet.create() — use Tamagui styled()| Layer | Owner |
|---|---|
| Server state | react-query / orval hooks |
| Client/UI state | Zustand |
If data comes from the backend it belongs in react-query. Zustand stores should be thin.
type MyStore = MyStoreState & MyStoreFunctions;
const INITIAL_STATE: MyStoreState = { ... };
const useMyStore = create<MyStore>()(
persist(
(set) => ({
...INITIAL_STATE,
setKeyValue: (key, value) => set((state) => ({ ...state, [key]: value })),
}),
{ name: "my-storage", storage: createJSONStorage(() => createZustandMmkvStorage({ id: "my-storage" })) },
),
);
// Good
const firstName = useUserStore((state) => state.firstName);
// Bad — re-renders on any store change
const store = useUserStore();
/plugin configure expo-rn-plugin)env.template.yaml: VAR_NAME={{ .VAR_NAME }}doppler secrets set VAR_NAME="value" --project <p> --config dev/stg/prodyarn sync-env-vars stgEXPO_PUBLIC_ prefix required for client-side varsUse mcp__github__* tools directly:
mcp__github__create_pull_requestmcp__github__get_pull_request_commentsmcp__github__get_pull_request_statusFlows in .maestro/. Run: maestro test .maestro/<flow>.yaml
Text matchers preferred over testIDs.
eas update --channel production --message "description"