1{2 "skill_name": "clerk-expo",3 "evals": [4 {5 "id": 1,6 "prompt": "add auth to my expo app with clerk",7 "expected_output": "Defaults to prebuilt native components: ClerkProvider with tokenCache at the root, AuthView in a Modal kept mounted beside signed-in content, UserButton when signed in, dev build called out",8 "expectations": [9 "Recommends AuthView/UserButton from @clerk/expo/native as the default path and mentions they are in beta",10
"Wraps app in ClerkProvider with publishableKey from process.env.EXPO_PUBLIC_CLERK_PUBLISHABLE_KEY and tokenCache from @clerk/expo/token-cache"
,
11 "Registers the @clerk/expo config plugin (and expo-secure-store) in app.json",
12 "Passes { treatPendingAsSignedOut: false } to the useAuth() call gating the auth UI",
13 "States that a development build (expo run:ios / run:android) is required and Expo Go will not work",
14 "Does not call setActive() after native component auth and does not pair AuthView with useSignInWithGoogle/useSignInWithApple"
15 ]
16 },
17 {
18 "id": 2,
19 "prompt": "add phone sms auth to my expo app with clerk",
20 "expected_output": "Custom flow using the current method-based API: signUp.create({ phoneNumber }) + verifications.sendPhoneCode/verifyPhoneCode, signIn.phoneCode.sendCode/verifyCode, finalize() on complete, with a note to enable phone/SMS in the Clerk Dashboard",
21 "expectations": [
22 "Verifies or instructs that phone number + SMS verification is enabled in the Clerk Dashboard before implementing",
23 "Uses signUp.create({ phoneNumber }) then signUp.verifications.sendPhoneCode() and verifyPhoneCode({ code }) for sign-up",
24 "Uses signIn.phoneCode.sendCode() and signIn.phoneCode.verifyCode({ code }) for sign-in",
25 "Calls finalize({ navigate }) when status is complete instead of setActive({ session })",
26 "Does NOT use the legacy API (prepareFirstFactor, attemptFirstFactor, isLoaded from the hook)",
27 "Renders <View nativeID=\"clerk-captcha\" /> on the sign-up screen",
28 "Shows the code-entry step only after a code was successfully sent (gated via signUp.status/unverifiedFields or explicit step state)"
29 ]
30 },
31 {
32 "id": 3,
33 "prompt": "i want users to sign in with Google in my expo app using clerk",
34 "expected_output": "Uses useSSO with startSSOFlow({ strategy: 'oauth_google' }) for the browser flow (or the native useSignInWithGoogle hook with a dev build), calling setActive with createdSessionId and treating cancellation as non-fatal",
35 "expectations": [
36 "Uses useSSO (never the deprecated useOAuth) for the browser-based flow",
37 "Calls setActive({ session: createdSessionId }) after a successful flow",
38 "Does not call WebBrowser.maybeCompleteAuthSession() manually",
39 "Treats user cancellation (no createdSessionId) as non-fatal with no error UI",
40 "If offering native Google sign-in, imports useSignInWithGoogle from @clerk/expo/google, requires a dev build, and handles SIGN_IN_CANCELLED/-5 error codes",
41 "Mentions enabling the Google social connection in the Clerk Dashboard"
42 ]
43 },
44 {
45 "id": 4,
46 "prompt": "my expo router app has a (tabs) group that should only be accessible to signed-in users. redirect unauthenticated users to the sign-in screen.",
47 "expected_output": "Layout-level guard using useAuth: checks isLoaded before isSignedIn, returns null while loading, uses expo-router Redirect",
48 "expectations": [
49 "Imports useAuth from @clerk/expo",
50 "Checks isLoaded before isSignedIn",
51 "Returns null or a loading indicator when isLoaded is false",
52 "Uses Expo Router's <Redirect> component (not router.push in an effect)",
53 "Places the guard in the group's _layout.tsx"
54 ]
55 },
56 {
57 "id": 5,
58 "prompt": "build a custom email/password sign in screen for my expo app with clerk, i don't want the prebuilt UI",
59 "expected_output": "Custom flow with the current API: signIn.password({ emailAddress, password }), errors.fields for display, fetchStatus to disable the button, finalize on complete, MFA/Device Trust branches handled",
60 "expectations": [
61 "Destructures { signIn, errors, fetchStatus } from useSignIn()",
62 "Calls signIn.password({ emailAddress, password }) and checks the returned error",
63 "Calls signIn.finalize({ navigate }) when signIn.status === 'complete'",
64 "Handles needs_second_factor and/or needs_client_trust status branches",
65 "Surfaces field errors from errors.fields and disables submit while fetchStatus === 'fetching'",
66 "Does NOT use the legacy signIn.create + attemptFirstFactor + setActive pattern"
67 ]
68 },
69 {
70 "id": 6,
71 "prompt": "i'm building an expo app and want the clerk session to persist after app restarts",
72 "expected_output": "Passes tokenCache from @clerk/expo/token-cache to ClerkProvider with the publishable key from EXPO_PUBLIC env",
73 "expectations": [
74 "Imports tokenCache from @clerk/expo/token-cache",
75 "Passes tokenCache prop to ClerkProvider",
76 "Reads the key from process.env.EXPO_PUBLIC_CLERK_PUBLISHABLE_KEY (not NEXT_PUBLIC_)",
77 "Installs expo-secure-store via npx expo install",
78 "Does not use expo-secure-store directly or AsyncStorage for session tokens"
79 ]
80 },
81 {
82 "id": 7,
83 "prompt": "my expo app supports organizations. i need a screen where users can see their organizations and switch the active one.",
84 "expected_output": "Uses useOrganizationList to list memberships and setActive, uses useOrganization to show the current org",
85 "expectations": [
86 "Imports useOrganization and useOrganizationList from @clerk/expo",
87 "Calls setActive from useOrganizationList to switch organizations",
88 "Lists available orgs from userMemberships.data",
89 "Shows the currently active organization name",
90 "Handles the case where userMemberships.data is undefined or loading"
91 ]
92 },
93 {
94 "id": 8,
95 "prompt": "add 2fa with an authenticator app to my clerk expo sign in flow",
96 "expected_output": "Handles signIn.status === 'needs_second_factor' with signIn.mfa.verifyTOTP({ code }), then finalize",
97 "expectations": [
98 "Branches on signIn.status === 'needs_second_factor' after the first factor",
99 "Uses signIn.mfa.verifyTOTP({ code }) for the authenticator code",
100 "Calls finalize when status becomes complete",
101 "Optionally offers backup codes via signIn.mfa.verifyBackupCode",