-
-
Notifications
You must be signed in to change notification settings - Fork 221
feat(cli): add uniwind with heroui-native #686
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
|
Note Other AI code review bot(s) detectedCodeRabbit has detected other AI code review bot(s) in this pull request and will avoid duplicating their findings in the review comments. This may lead to a less comprehensive review. WalkthroughThis PR replaces the single Changes
Sequence Diagram(s)sequenceDiagram
participant User as CLI User
participant Prompt as Frontend Prompt
participant Types as Frontend Types
participant Helpers as CLI Helpers
participant TemplateMgr as Template Manager
User->>Prompt: select frontend option
Prompt->>Types: validate selection (native-bare / native-uniwind / native-unistyles)
Types-->>Prompt: confirmed
Prompt->>Helpers: build project config
Helpers->>Helpers: evaluate native flags
alt native detected
Helpers->>TemplateMgr: request native templates
TemplateMgr->>TemplateMgr: resolve framework path ("bare"/"uniwind"/"unistyles")
TemplateMgr-->>Helpers: templates & assets to copy
end
Helpers-->>User: scaffold project
Estimated code review effort🎯 4 (Complex) | ⏱️ ~45 minutes Areas to focus during review:
Possibly related PRs
Poem
Pre-merge checks and finishing touches❌ Failed checks (1 warning)
✅ Passed checks (2 passed)
✨ Finishing touches
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This PR is being reviewed by Cursor Bugbot
Details
You are on the Bugbot Free tier. On this plan, Bugbot will review limited PRs each billing cycle.
To receive Bugbot reviews on all of your PRs, visit the Cursor dashboard to activate Pro and start your 14-day free trial.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 11
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (3)
apps/cli/templates/auth/better-auth/convex/backend/convex/auth.ts.hbs (1)
34-44: Replace genericelseblock with explicit condition.The generic
{{else}}block violates the coding guideline and creates a potential runtime issue. Lines 42-43 usesiteUrlwhich may be undefined if the frontend doesn't match any of the conditions in lines 17-19. Additionally, the else block duplicates the logic from lines 39-41.As per coding guidelines
Apply this diff to remove the redundant else block:
- {{else if (or (includes frontend "tanstack-start") (includes frontend "next"))}} + {{else}} baseURL: siteUrl, trustedOrigins: [siteUrl], - {{else}} - trustedOrigins: [siteUrl], {{/if}}This consolidates the duplicate logic while maintaining the same behavior. If there are other frontend types that need different handling, add explicit conditions for them.
apps/cli/templates/frontend/native/bare/app/(drawer)/_layout.tsx.hbs (1)
9-88: SwitchDrawerLayoutto a function declaration.
Line 9 currently uses an arrow component (const DrawerLayout = () => { ... }), which violates our directive to define JS/TS functions with the standard declaration syntax. Please convert it to afunction DrawerLayout()declaration so the template stays compliant.Apply this diff:
-const DrawerLayout = () => { +function DrawerLayout() { const { colorScheme } = useColorScheme(); const theme = colorScheme === "dark" ? NAV_THEME.dark : NAV_THEME.light; return ( <Drawer screenOptions={{{{ headerStyle: { backgroundColor: theme.background, }, headerTitleStyle: { color: theme.text, }, headerTintColor: theme.text, drawerStyle: { backgroundColor: theme.background, }, drawerLabelStyle: { color: theme.text, }, drawerInactiveTintColor: theme.text, }}}} > @@ - ); -}; - -export default DrawerLayout; + ); +} + +export default DrawerLayout;apps/cli/src/helpers/core/template-manager.ts (1)
537-553: Copy native-bare auth templates
native-bareis now a supported frontend, but both Better Auth code paths only selectuniwind/unistyles. As a result the bare-specific auth templates never get copied, leaving generated projects incomplete. Please includehasNativeBarewhen derivingnativeFrameworkPath.- if (hasUniwind) nativeFrameworkPath = "uniwind"; - else if (hasUnistyles) nativeFrameworkPath = "unistyles"; + if (hasNativeBare) nativeFrameworkPath = "bare"; + else if (hasUniwind) nativeFrameworkPath = "uniwind"; + else if (hasUnistyles) nativeFrameworkPath = "unistyles"; ... - if (hasUniwind) { - nativeFrameworkAuthPath = "uniwind"; + if (hasNativeBare) { + nativeFrameworkAuthPath = "bare"; + } else if (hasUniwind) { + nativeFrameworkAuthPath = "uniwind"; } else if (hasUnistyles) { nativeFrameworkAuthPath = "unistyles"; }Without this adjustment the new bare Expo variant ships without its auth scaffolding.
Also applies to: 699-703
🧹 Nitpick comments (6)
apps/cli/templates/frontend/native/bare/lib/android-navigation-bar.tsx.hbs (1)
5-11: Consider adding error handling for native API calls.The async function calls
setButtonStyleAsyncandsetBackgroundColorAsyncwithout error handling. If these operations fail on certain devices or Android versions, the error will be silently swallowed. Consider wrapping in a try-catch or at least logging failures.export async function setAndroidNavigationBar(theme: "light" | "dark") { if (Platform.OS !== "android") return; + try { - await NavigationBar.setButtonStyleAsync(theme === "dark" ? "light" : "dark"); - await NavigationBar.setBackgroundColorAsync( - theme === "dark" ? NAV_THEME.dark.background : NAV_THEME.light.background, - ); + await NavigationBar.setButtonStyleAsync(theme === "dark" ? "light" : "dark"); + await NavigationBar.setBackgroundColorAsync( + theme === "dark" ? NAV_THEME.dark.background : NAV_THEME.light.background, + ); + } catch (error) { + console.warn("Failed to set Android navigation bar:", error); + } }apps/cli/templates/extras/bunfig.toml.hbs (1)
2-6: Remove redundantorhelper and consider usingeqfor explicit comparison.The
orhelper with a single condition is unnecessary. Consider simplifying to:-{{#if (or (includes frontend "nuxt"))}} +{{#if (eq frontend "nuxt")}} linker = "hoisted" # having issues with Nuxt when linker is isolated {{else}} linker = "isolated" {{/if}}If
frontendis a string variable (as suggested by the coding guidelines example usingeq), theneqprovides a clearer exact match. Iffrontendis an array and you need substring matching, useincludeswithout theorwrapper.As per coding guidelines
apps/cli/templates/frontend/native/bare/components/header-button.tsx.hbs (2)
39-39: Add displayName for better debugging.Components using
forwardRefshould have adisplayNamefor better debugging in React DevTools.Apply this diff to add the displayName:
}); + +HeaderButton.displayName = "HeaderButton";
27-36: Consider extracting pressed state to avoid inline style object.The current implementation creates a new style object on every render. While functionally correct, extracting the pressed state could improve performance slightly.
Consider this alternative:
> - {({ pressed }) => ( + {() => ( <FontAwesome name="info-circle" size={20} color={theme.text} - style={{ - opacity: pressed ? 0.7 : 1, - }} + style={styles.icon} /> )} </Pressable>And update the styles:
const styles = StyleSheet.create({ button: { padding: 8, marginRight: 8, borderRadius: 8, }, + icon: { + opacity: 1, + }, });Then use the container's pressed state to control the icon opacity via the button backgroundColor alone. Alternatively, if you need the opacity change, you can access pressed from the outer render prop.
apps/cli/templates/frontend/native/bare/metro.config.js.hbs (1)
6-6: Remove redundant explicitunstable_enablePackageExportssetting or explain its necessity.The
unstable_enablePackageExportsoption is experimental and enabled by default. Explicitly setting it totruein the template is redundant. Either remove this line or add a comment explaining why it's necessary for this template, as no package exports are evident in the generated bare Expo project structure.apps/cli/templates/frontend/native/uniwind/app/(drawer)/(tabs)/_layout.tsx.hbs (1)
12-20: Remove unused header styles when headerShown is false.Lines 13-20 define header styling options (backgroundColor, tintColor, titleStyle), but line 12 sets
headerShown: false, making these styles ineffective. Either remove the unused style definitions or setheaderShown: trueif headers are intended to be visible.Apply this diff if headers are not needed:
<Tabs screenOptions=\{{ headerShown: false, - headerStyle: { - backgroundColor: themeColorBackground, - }, - headerTintColor: themeColorForeground, - headerTitleStyle: { - color: themeColorForeground, - fontWeight: "600", - }, tabBarStyle: { backgroundColor: themeColorBackground, },Or set
headerShown: trueif headers should be visible.
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (89)
apps/cli/README.md(2 hunks)apps/cli/src/helpers/addons/examples-setup.ts(1 hunks)apps/cli/src/helpers/addons/ultracite-setup.ts(1 hunks)apps/cli/src/helpers/core/api-setup.ts(3 hunks)apps/cli/src/helpers/core/auth-setup.ts(4 hunks)apps/cli/src/helpers/core/create-readme.ts(3 hunks)apps/cli/src/helpers/core/env-setup.ts(2 hunks)apps/cli/src/helpers/core/post-installation.ts(2 hunks)apps/cli/src/helpers/core/template-manager.ts(9 hunks)apps/cli/src/prompts/auth.ts(2 hunks)apps/cli/src/prompts/frontend.ts(2 hunks)apps/cli/src/types.ts(1 hunks)apps/cli/src/utils/better-auth-plugin-setup.ts(1 hunks)apps/cli/src/utils/compatibility-rules.ts(3 hunks)apps/cli/src/utils/config-validation.ts(1 hunks)apps/cli/src/utils/setup-catalogs.ts(1 hunks)apps/cli/templates/auth/better-auth/convex/backend/convex/auth.ts.hbs(4 hunks)apps/cli/templates/auth/better-auth/convex/backend/convex/http.ts.hbs(1 hunks)apps/cli/templates/auth/better-auth/convex/native/nativewind/components/sign-in.tsx.hbs(0 hunks)apps/cli/templates/auth/better-auth/convex/native/nativewind/components/sign-up.tsx.hbs(0 hunks)apps/cli/templates/auth/better-auth/convex/native/uniwind/components/sign-in.tsx.hbs(1 hunks)apps/cli/templates/auth/better-auth/convex/native/uniwind/components/sign-up.tsx.hbs(1 hunks)apps/cli/templates/auth/better-auth/native/nativewind/app/(drawer)/index.tsx.hbs(0 hunks)apps/cli/templates/auth/better-auth/native/nativewind/components/sign-in.tsx.hbs(0 hunks)apps/cli/templates/auth/better-auth/native/nativewind/components/sign-up.tsx.hbs(0 hunks)apps/cli/templates/auth/better-auth/native/uniwind/app/(drawer)/index.tsx.hbs(1 hunks)apps/cli/templates/auth/better-auth/native/uniwind/components/sign-in.tsx.hbs(1 hunks)apps/cli/templates/auth/better-auth/native/uniwind/components/sign-up.tsx.hbs(1 hunks)apps/cli/templates/auth/better-auth/server/base/src/index.ts.hbs(5 hunks)apps/cli/templates/examples/ai/native/uniwind/app/(drawer)/ai.tsx.hbs(5 hunks)apps/cli/templates/examples/ai/native/uniwind/polyfills.js(1 hunks)apps/cli/templates/examples/todo/native/nativewind/app/(drawer)/todos.tsx.hbs(0 hunks)apps/cli/templates/examples/todo/native/uniwind/app/(drawer)/todos.tsx.hbs(1 hunks)apps/cli/templates/extras/bunfig.toml.hbs(1 hunks)apps/cli/templates/frontend/native/bare/_gitignore(1 hunks)apps/cli/templates/frontend/native/bare/app.json.hbs(1 hunks)apps/cli/templates/frontend/native/bare/app/(drawer)/(tabs)/_layout.tsx.hbs(1 hunks)apps/cli/templates/frontend/native/bare/app/(drawer)/(tabs)/index.tsx.hbs(1 hunks)apps/cli/templates/frontend/native/bare/app/(drawer)/(tabs)/two.tsx.hbs(1 hunks)apps/cli/templates/frontend/native/bare/app/(drawer)/_layout.tsx.hbs(3 hunks)apps/cli/templates/frontend/native/bare/app/(drawer)/index.tsx.hbs(1 hunks)apps/cli/templates/frontend/native/bare/app/+not-found.tsx.hbs(1 hunks)apps/cli/templates/frontend/native/bare/app/_layout.tsx.hbs(1 hunks)apps/cli/templates/frontend/native/bare/app/modal.tsx.hbs(1 hunks)apps/cli/templates/frontend/native/bare/babel.config.js.hbs(1 hunks)apps/cli/templates/frontend/native/bare/components/container.tsx.hbs(1 hunks)apps/cli/templates/frontend/native/bare/components/header-button.tsx.hbs(1 hunks)apps/cli/templates/frontend/native/bare/components/tabbar-icon.tsx.hbs(1 hunks)apps/cli/templates/frontend/native/bare/lib/android-navigation-bar.tsx.hbs(1 hunks)apps/cli/templates/frontend/native/bare/lib/constants.ts.hbs(1 hunks)apps/cli/templates/frontend/native/bare/lib/use-color-scheme.ts.hbs(1 hunks)apps/cli/templates/frontend/native/bare/metro.config.js.hbs(1 hunks)apps/cli/templates/frontend/native/bare/package.json.hbs(1 hunks)apps/cli/templates/frontend/native/bare/tsconfig.json.hbs(1 hunks)apps/cli/templates/frontend/native/nativewind/app/(drawer)/(tabs)/index.tsx.hbs(0 hunks)apps/cli/templates/frontend/native/nativewind/app/(drawer)/(tabs)/two.tsx.hbs(0 hunks)apps/cli/templates/frontend/native/nativewind/app/(drawer)/index.tsx.hbs(0 hunks)apps/cli/templates/frontend/native/nativewind/app/+not-found.tsx.hbs(0 hunks)apps/cli/templates/frontend/native/nativewind/app/_layout.tsx.hbs(0 hunks)apps/cli/templates/frontend/native/nativewind/app/modal.tsx.hbs(0 hunks)apps/cli/templates/frontend/native/nativewind/components/container.tsx.hbs(0 hunks)apps/cli/templates/frontend/native/nativewind/components/header-button.tsx.hbs(0 hunks)apps/cli/templates/frontend/native/nativewind/global.css(0 hunks)apps/cli/templates/frontend/native/nativewind/lib/use-color-scheme.ts.hbs(0 hunks)apps/cli/templates/frontend/native/nativewind/metro.config.js.hbs(0 hunks)apps/cli/templates/frontend/native/nativewind/tailwind.config.js.hbs(0 hunks)apps/cli/templates/frontend/native/uniwind/_gitignore(1 hunks)apps/cli/templates/frontend/native/uniwind/app.json.hbs(1 hunks)apps/cli/templates/frontend/native/uniwind/app/(drawer)/(tabs)/_layout.tsx.hbs(1 hunks)apps/cli/templates/frontend/native/uniwind/app/(drawer)/(tabs)/index.tsx.hbs(1 hunks)apps/cli/templates/frontend/native/uniwind/app/(drawer)/(tabs)/two.tsx.hbs(1 hunks)apps/cli/templates/frontend/native/uniwind/app/(drawer)/_layout.tsx.hbs(1 hunks)apps/cli/templates/frontend/native/uniwind/app/(drawer)/index.tsx.hbs(1 hunks)apps/cli/templates/frontend/native/uniwind/app/+not-found.tsx.hbs(1 hunks)apps/cli/templates/frontend/native/uniwind/app/_layout.tsx.hbs(1 hunks)apps/cli/templates/frontend/native/uniwind/app/modal.tsx.hbs(1 hunks)apps/cli/templates/frontend/native/uniwind/components/container.tsx.hbs(1 hunks)apps/cli/templates/frontend/native/uniwind/components/theme-toggle.tsx.hbs(1 hunks)apps/cli/templates/frontend/native/uniwind/contexts/app-theme-context.tsx.hbs(1 hunks)apps/cli/templates/frontend/native/uniwind/global.css(1 hunks)apps/cli/templates/frontend/native/uniwind/metro.config.js.hbs(1 hunks)apps/cli/templates/frontend/native/uniwind/package.json.hbs(1 hunks)apps/cli/templates/frontend/native/uniwind/tsconfig.json.hbs(1 hunks)apps/cli/test/addons.test.ts(2 hunks)apps/cli/test/api.test.ts(3 hunks)apps/cli/test/auth.test.ts(3 hunks)apps/cli/test/deployment.test.ts(3 hunks)apps/cli/test/frontend.test.ts(5 hunks)apps/cli/test/integration.test.ts(4 hunks)
💤 Files with no reviewable changes (18)
- apps/cli/templates/frontend/native/nativewind/app/+not-found.tsx.hbs
- apps/cli/templates/auth/better-auth/convex/native/nativewind/components/sign-in.tsx.hbs
- apps/cli/templates/frontend/native/nativewind/tailwind.config.js.hbs
- apps/cli/templates/auth/better-auth/convex/native/nativewind/components/sign-up.tsx.hbs
- apps/cli/templates/frontend/native/nativewind/app/(drawer)/(tabs)/two.tsx.hbs
- apps/cli/templates/frontend/native/nativewind/app/_layout.tsx.hbs
- apps/cli/templates/auth/better-auth/native/nativewind/app/(drawer)/index.tsx.hbs
- apps/cli/templates/frontend/native/nativewind/app/modal.tsx.hbs
- apps/cli/templates/frontend/native/nativewind/global.css
- apps/cli/templates/auth/better-auth/native/nativewind/components/sign-in.tsx.hbs
- apps/cli/templates/frontend/native/nativewind/lib/use-color-scheme.ts.hbs
- apps/cli/templates/frontend/native/nativewind/metro.config.js.hbs
- apps/cli/templates/frontend/native/nativewind/app/(drawer)/(tabs)/index.tsx.hbs
- apps/cli/templates/examples/todo/native/nativewind/app/(drawer)/todos.tsx.hbs
- apps/cli/templates/frontend/native/nativewind/components/header-button.tsx.hbs
- apps/cli/templates/frontend/native/nativewind/components/container.tsx.hbs
- apps/cli/templates/auth/better-auth/native/nativewind/components/sign-up.tsx.hbs
- apps/cli/templates/frontend/native/nativewind/app/(drawer)/index.tsx.hbs
🧰 Additional context used
📓 Path-based instructions (4)
**/*.{hbs,handlebars}
📄 CodeRabbit inference engine (.cursor/rules/better-t-stack-repo.mdc)
In Handlebars templates, avoid generic if/else blocks; write explicit conditions (e.g., if (eq orm "prisma") and else if (eq orm "drizzle")).
Files:
apps/cli/templates/auth/better-auth/convex/backend/convex/auth.ts.hbsapps/cli/templates/frontend/native/uniwind/app/(drawer)/(tabs)/index.tsx.hbsapps/cli/templates/frontend/native/bare/lib/constants.ts.hbsapps/cli/templates/frontend/native/uniwind/app/(drawer)/(tabs)/two.tsx.hbsapps/cli/templates/frontend/native/uniwind/app/(drawer)/(tabs)/_layout.tsx.hbsapps/cli/templates/frontend/native/bare/metro.config.js.hbsapps/cli/templates/auth/better-auth/native/uniwind/components/sign-up.tsx.hbsapps/cli/templates/auth/better-auth/native/uniwind/app/(drawer)/index.tsx.hbsapps/cli/templates/auth/better-auth/native/uniwind/components/sign-in.tsx.hbsapps/cli/templates/frontend/native/bare/components/container.tsx.hbsapps/cli/templates/frontend/native/bare/components/tabbar-icon.tsx.hbsapps/cli/templates/frontend/native/uniwind/components/container.tsx.hbsapps/cli/templates/frontend/native/bare/app/+not-found.tsx.hbsapps/cli/templates/frontend/native/bare/app/(drawer)/(tabs)/two.tsx.hbsapps/cli/templates/extras/bunfig.toml.hbsapps/cli/templates/frontend/native/bare/app/modal.tsx.hbsapps/cli/templates/frontend/native/uniwind/app/(drawer)/_layout.tsx.hbsapps/cli/templates/frontend/native/uniwind/components/theme-toggle.tsx.hbsapps/cli/templates/frontend/native/bare/lib/use-color-scheme.ts.hbsapps/cli/templates/frontend/native/uniwind/app/+not-found.tsx.hbsapps/cli/templates/frontend/native/bare/app/_layout.tsx.hbsapps/cli/templates/frontend/native/uniwind/app/_layout.tsx.hbsapps/cli/templates/frontend/native/bare/package.json.hbsapps/cli/templates/auth/better-auth/server/base/src/index.ts.hbsapps/cli/templates/frontend/native/bare/babel.config.js.hbsapps/cli/templates/frontend/native/bare/app/(drawer)/index.tsx.hbsapps/cli/templates/frontend/native/bare/components/header-button.tsx.hbsapps/cli/templates/frontend/native/uniwind/contexts/app-theme-context.tsx.hbsapps/cli/templates/frontend/native/bare/app.json.hbsapps/cli/templates/frontend/native/bare/app/(drawer)/(tabs)/_layout.tsx.hbsapps/cli/templates/frontend/native/uniwind/metro.config.js.hbsapps/cli/templates/frontend/native/uniwind/app/(drawer)/index.tsx.hbsapps/cli/templates/auth/better-auth/convex/native/uniwind/components/sign-in.tsx.hbsapps/cli/templates/frontend/native/bare/app/(drawer)/_layout.tsx.hbsapps/cli/templates/auth/better-auth/convex/native/uniwind/components/sign-up.tsx.hbsapps/cli/templates/frontend/native/uniwind/app/modal.tsx.hbsapps/cli/templates/frontend/native/bare/tsconfig.json.hbsapps/cli/templates/frontend/native/uniwind/package.json.hbsapps/cli/templates/auth/better-auth/convex/backend/convex/http.ts.hbsapps/cli/templates/examples/todo/native/uniwind/app/(drawer)/todos.tsx.hbsapps/cli/templates/frontend/native/bare/lib/android-navigation-bar.tsx.hbsapps/cli/templates/frontend/native/uniwind/app.json.hbsapps/cli/templates/frontend/native/bare/app/(drawer)/(tabs)/index.tsx.hbsapps/cli/templates/examples/ai/native/uniwind/app/(drawer)/ai.tsx.hbsapps/cli/templates/frontend/native/uniwind/tsconfig.json.hbs
**/*.{ts,tsx}
📄 CodeRabbit inference engine (.cursor/rules/convex_rules.mdc)
**/*.{ts,tsx}: Use Id from './_generated/dataModel' to type document ids (e.g., Id<'users'>)
Ensure Record key/value types align with validators (e.g., v.record(v.id('users'), v.string()) => Record<Id<'users'>, string>)
Be strict with types for document ids; prefer Id<'table'> over string
Use 'as const' for string literals in discriminated unions
When using Array and Record types, declare with explicit generic types (e.g., const arr: Array = ...)
**/*.{ts,tsx}: Use TypeScript type aliases instead of interface declarations.
Do not use explicit return types in TypeScript.
Files:
apps/cli/src/utils/config-validation.tsapps/cli/test/auth.test.tsapps/cli/src/types.tsapps/cli/src/helpers/core/api-setup.tsapps/cli/test/api.test.tsapps/cli/src/helpers/core/env-setup.tsapps/cli/src/prompts/frontend.tsapps/cli/src/helpers/core/auth-setup.tsapps/cli/src/helpers/core/post-installation.tsapps/cli/src/helpers/addons/examples-setup.tsapps/cli/src/utils/compatibility-rules.tsapps/cli/src/helpers/addons/ultracite-setup.tsapps/cli/src/prompts/auth.tsapps/cli/test/addons.test.tsapps/cli/src/utils/better-auth-plugin-setup.tsapps/cli/test/deployment.test.tsapps/cli/test/integration.test.tsapps/cli/test/frontend.test.tsapps/cli/src/helpers/core/template-manager.tsapps/cli/src/utils/setup-catalogs.tsapps/cli/src/helpers/core/create-readme.ts
**/*.{js,jsx,ts,tsx,mjs,cjs}
📄 CodeRabbit inference engine (.cursor/rules/use-bun-instead-of-node-vite-npm-pnpm.mdc)
**/*.{js,jsx,ts,tsx,mjs,cjs}: Do not use dotenv; Bun auto-loads .env
UseBun.serve()for HTTP/WebSockets; do not useexpress
Usebun:sqlitefor SQLite; do not usebetter-sqlite3
UseBun.redisfor Redis; do not useioredis
UseBun.sqlfor Postgres; do not usepgorpostgres.js
Use built-inWebSocket; do not usews
PreferBun.fileovernode:fsreadFile/writeFile
UseBun.$instead ofexecafor shelling out
Files:
apps/cli/src/utils/config-validation.tsapps/cli/test/auth.test.tsapps/cli/src/types.tsapps/cli/src/helpers/core/api-setup.tsapps/cli/test/api.test.tsapps/cli/src/helpers/core/env-setup.tsapps/cli/src/prompts/frontend.tsapps/cli/src/helpers/core/auth-setup.tsapps/cli/src/helpers/core/post-installation.tsapps/cli/src/helpers/addons/examples-setup.tsapps/cli/src/utils/compatibility-rules.tsapps/cli/src/helpers/addons/ultracite-setup.tsapps/cli/src/prompts/auth.tsapps/cli/test/addons.test.tsapps/cli/src/utils/better-auth-plugin-setup.tsapps/cli/test/deployment.test.tsapps/cli/templates/examples/ai/native/uniwind/polyfills.jsapps/cli/test/integration.test.tsapps/cli/test/frontend.test.tsapps/cli/src/helpers/core/template-manager.tsapps/cli/src/utils/setup-catalogs.tsapps/cli/src/helpers/core/create-readme.ts
**/*.{js,jsx,ts,tsx}
📄 CodeRabbit inference engine (.cursor/rules/better-t-stack-repo.mdc)
Define functions using the standard function declaration syntax, not arrow functions.
Files:
apps/cli/src/utils/config-validation.tsapps/cli/test/auth.test.tsapps/cli/src/types.tsapps/cli/src/helpers/core/api-setup.tsapps/cli/test/api.test.tsapps/cli/src/helpers/core/env-setup.tsapps/cli/src/prompts/frontend.tsapps/cli/src/helpers/core/auth-setup.tsapps/cli/src/helpers/core/post-installation.tsapps/cli/src/helpers/addons/examples-setup.tsapps/cli/src/utils/compatibility-rules.tsapps/cli/src/helpers/addons/ultracite-setup.tsapps/cli/src/prompts/auth.tsapps/cli/test/addons.test.tsapps/cli/src/utils/better-auth-plugin-setup.tsapps/cli/test/deployment.test.tsapps/cli/templates/examples/ai/native/uniwind/polyfills.jsapps/cli/test/integration.test.tsapps/cli/test/frontend.test.tsapps/cli/src/helpers/core/template-manager.tsapps/cli/src/utils/setup-catalogs.tsapps/cli/src/helpers/core/create-readme.ts
🧠 Learnings (22)
📚 Learning: 2025-09-11T04:31:24.508Z
Learnt from: CR
Repo: AmanVarshney01/create-better-t-stack PR: 0
File: .cursor/rules/better-t-stack-repo.mdc:0-0
Timestamp: 2025-09-11T04:31:24.508Z
Learning: Applies to **/*.{hbs,handlebars} : In Handlebars templates, avoid generic if/else blocks; write explicit conditions (e.g., if (eq orm "prisma") and else if (eq orm "drizzle")).
Applied to files:
apps/cli/templates/auth/better-auth/convex/backend/convex/auth.ts.hbsapps/cli/templates/auth/better-auth/convex/backend/convex/http.ts.hbs
📚 Learning: 2025-08-24T18:00:39.152Z
Learnt from: CR
Repo: AmanVarshney01/create-better-t-stack PR: 0
File: .cursor/rules/convex_rules.mdc:0-0
Timestamp: 2025-08-24T18:00:39.152Z
Learning: Applies to convex/**/*.ts : Always use the new Convex function syntax (query/mutation/action/internal*) with args/returns/handler
Applied to files:
apps/cli/templates/auth/better-auth/convex/backend/convex/auth.ts.hbsapps/cli/src/utils/config-validation.tsapps/cli/src/prompts/auth.tsapps/cli/templates/auth/better-auth/convex/backend/convex/http.ts.hbs
📚 Learning: 2025-08-24T18:00:39.152Z
Learnt from: CR
Repo: AmanVarshney01/create-better-t-stack PR: 0
File: .cursor/rules/convex_rules.mdc:0-0
Timestamp: 2025-08-24T18:00:39.152Z
Learning: Applies to convex/**/*.ts : Always include argument and return validators for all Convex functions (public and internal)
Applied to files:
apps/cli/templates/auth/better-auth/convex/backend/convex/auth.ts.hbsapps/cli/src/utils/config-validation.tsapps/cli/templates/auth/better-auth/convex/backend/convex/http.ts.hbs
📚 Learning: 2025-08-24T18:00:39.152Z
Learnt from: CR
Repo: AmanVarshney01/create-better-t-stack PR: 0
File: .cursor/rules/convex_rules.mdc:0-0
Timestamp: 2025-08-24T18:00:39.152Z
Learning: Applies to convex/schema.ts : Always define the Convex schema in convex/schema.ts and import schema helpers from convex/server
Applied to files:
apps/cli/templates/auth/better-auth/convex/backend/convex/auth.ts.hbsapps/cli/src/utils/config-validation.tsapps/cli/templates/auth/better-auth/convex/backend/convex/http.ts.hbs
📚 Learning: 2025-08-24T18:00:39.152Z
Learnt from: CR
Repo: AmanVarshney01/create-better-t-stack PR: 0
File: .cursor/rules/convex_rules.mdc:0-0
Timestamp: 2025-08-24T18:00:39.152Z
Learning: Applies to convex/**/*.ts : Use v.null() instead of undefined; undefined is not a valid Convex value
Applied to files:
apps/cli/src/utils/config-validation.ts
📚 Learning: 2025-08-24T18:00:39.152Z
Learnt from: CR
Repo: AmanVarshney01/create-better-t-stack PR: 0
File: .cursor/rules/convex_rules.mdc:0-0
Timestamp: 2025-08-24T18:00:39.152Z
Learning: Applies to convex/**/*.ts : Use v.int64() instead of deprecated v.bigint() for 64-bit integers
Applied to files:
apps/cli/src/utils/config-validation.ts
📚 Learning: 2025-08-24T18:00:39.152Z
Learnt from: CR
Repo: AmanVarshney01/create-better-t-stack PR: 0
File: .cursor/rules/convex_rules.mdc:0-0
Timestamp: 2025-08-24T18:00:39.152Z
Learning: Applies to convex/**/_generated/api.ts : Use the generated api object to reference public functions
Applied to files:
apps/cli/src/utils/config-validation.tsapps/cli/templates/auth/better-auth/convex/backend/convex/http.ts.hbs
📚 Learning: 2025-08-24T18:00:39.152Z
Learnt from: CR
Repo: AmanVarshney01/create-better-t-stack PR: 0
File: .cursor/rules/convex_rules.mdc:0-0
Timestamp: 2025-08-24T18:00:39.152Z
Learning: Applies to convex/**/_generated/api.ts : Use the generated internal object to reference internal functions
Applied to files:
apps/cli/src/utils/config-validation.ts
📚 Learning: 2025-08-24T18:01:11.544Z
Learnt from: CR
Repo: AmanVarshney01/create-better-t-stack PR: 0
File: .cursor/rules/use-bun-instead-of-node-vite-npm-pnpm.mdc:0-0
Timestamp: 2025-08-24T18:01:11.544Z
Learning: Applies to {**/package.json,**/webpack.config.@(js|ts|mjs|cjs),**/esbuild.config.@(js|ts|mjs|cjs)} : Use `bun build <file>` instead of `webpack` or `esbuild`
Applied to files:
apps/cli/templates/extras/bunfig.toml.hbsapps/cli/templates/frontend/native/uniwind/tsconfig.json.hbs
📚 Learning: 2025-08-24T18:01:11.544Z
Learnt from: CR
Repo: AmanVarshney01/create-better-t-stack PR: 0
File: .cursor/rules/use-bun-instead-of-node-vite-npm-pnpm.mdc:0-0
Timestamp: 2025-08-24T18:01:11.544Z
Learning: Applies to {**/package.json,**/@(jest|vitest).config.@(js|ts|mjs|cjs)} : Use `bun test` to run tests
Applied to files:
apps/cli/test/api.test.ts
📚 Learning: 2025-06-08T17:57:33.083Z
Learnt from: Vijayabaskar56
Repo: AmanVarshney01/create-better-t-stack PR: 310
File: apps/cli/templates/frontend/angular/src/app.component.html:1-7
Timestamp: 2025-06-08T17:57:33.083Z
Learning: The Angular frontend template uses Tailwind CSS v4, which doesn't require a traditional tailwind.config.js configuration file.
Applied to files:
apps/cli/templates/frontend/native/bare/package.json.hbsapps/cli/templates/frontend/native/uniwind/global.css
📚 Learning: 2025-08-24T18:00:39.152Z
Learnt from: CR
Repo: AmanVarshney01/create-better-t-stack PR: 0
File: .cursor/rules/convex_rules.mdc:0-0
Timestamp: 2025-08-24T18:00:39.152Z
Learning: Applies to package.json : Add types/node to package.json when using Node.js built-in modules
Applied to files:
apps/cli/templates/frontend/native/bare/package.json.hbs
📚 Learning: 2025-08-24T18:01:11.544Z
Learnt from: CR
Repo: AmanVarshney01/create-better-t-stack PR: 0
File: .cursor/rules/use-bun-instead-of-node-vite-npm-pnpm.mdc:0-0
Timestamp: 2025-08-24T18:01:11.544Z
Learning: Applies to **/*.{js,jsx,ts,tsx,mjs,cjs} : Use `Bun.$` instead of `execa` for shelling out
Applied to files:
apps/cli/src/prompts/auth.tsapps/cli/src/helpers/core/template-manager.ts
📚 Learning: 2025-08-24T18:01:11.544Z
Learnt from: CR
Repo: AmanVarshney01/create-better-t-stack PR: 0
File: .cursor/rules/use-bun-instead-of-node-vite-npm-pnpm.mdc:0-0
Timestamp: 2025-08-24T18:01:11.544Z
Learning: Applies to {**/package.json,**/@(jest|vitest).config.@(js|ts|mjs|cjs)} : Use `bun test` instead of `jest` or `vitest`
Applied to files:
apps/cli/test/integration.test.tsapps/cli/test/frontend.test.ts
📚 Learning: 2025-09-11T04:31:24.508Z
Learnt from: CR
Repo: AmanVarshney01/create-better-t-stack PR: 0
File: .cursor/rules/better-t-stack-repo.mdc:0-0
Timestamp: 2025-09-11T04:31:24.508Z
Learning: Applies to **/*.{ts,tsx} : Use TypeScript type aliases instead of interface declarations.
Applied to files:
apps/cli/templates/frontend/native/bare/tsconfig.json.hbs
📚 Learning: 2025-09-11T04:31:24.508Z
Learnt from: CR
Repo: AmanVarshney01/create-better-t-stack PR: 0
File: .cursor/rules/better-t-stack-repo.mdc:0-0
Timestamp: 2025-09-11T04:31:24.508Z
Learning: Applies to **/*.{ts,tsx} : Do not use explicit return types in TypeScript.
Applied to files:
apps/cli/templates/frontend/native/bare/tsconfig.json.hbsapps/cli/templates/frontend/native/uniwind/tsconfig.json.hbs
📚 Learning: 2025-08-24T18:00:39.152Z
Learnt from: CR
Repo: AmanVarshney01/create-better-t-stack PR: 0
File: .cursor/rules/convex_rules.mdc:0-0
Timestamp: 2025-08-24T18:00:39.152Z
Learning: Applies to convex/http.ts : Define HTTP endpoints only in convex/http.ts and wrap handlers with httpAction
Applied to files:
apps/cli/templates/auth/better-auth/convex/backend/convex/http.ts.hbs
📚 Learning: 2025-08-24T18:00:39.152Z
Learnt from: CR
Repo: AmanVarshney01/create-better-t-stack PR: 0
File: .cursor/rules/convex_rules.mdc:0-0
Timestamp: 2025-08-24T18:00:39.152Z
Learning: Applies to convex/http.ts : HTTP endpoints are registered at the exact path specified in route.path (no implicit prefixes)
Applied to files:
apps/cli/templates/auth/better-auth/convex/backend/convex/http.ts.hbs
📚 Learning: 2025-08-24T18:00:39.152Z
Learnt from: CR
Repo: AmanVarshney01/create-better-t-stack PR: 0
File: .cursor/rules/convex_rules.mdc:0-0
Timestamp: 2025-08-24T18:00:39.152Z
Learning: Applies to convex/**/*.ts : Respect file-based routing: api.<path>.<name> for public and internal.<path>.<name> for private functions based on file location/name
Applied to files:
apps/cli/templates/auth/better-auth/convex/backend/convex/http.ts.hbs
📚 Learning: 2025-08-24T18:00:39.152Z
Learnt from: CR
Repo: AmanVarshney01/create-better-t-stack PR: 0
File: .cursor/rules/convex_rules.mdc:0-0
Timestamp: 2025-08-24T18:00:39.152Z
Learning: Applies to convex/**/*.ts : Use query/mutation/action for public API; use internalQuery/internalMutation/internalAction for private functions; do not register via api/internal objects
Applied to files:
apps/cli/templates/auth/better-auth/convex/backend/convex/http.ts.hbs
📚 Learning: 2025-08-24T18:01:11.544Z
Learnt from: CR
Repo: AmanVarshney01/create-better-t-stack PR: 0
File: .cursor/rules/use-bun-instead-of-node-vite-npm-pnpm.mdc:0-0
Timestamp: 2025-08-24T18:01:11.544Z
Learning: Applies to **/*.{js,jsx,ts,tsx,mjs,cjs} : Use `Bun.serve()` for HTTP/WebSockets; do not use `express`
Applied to files:
apps/cli/templates/auth/better-auth/convex/backend/convex/http.ts.hbs
📚 Learning: 2025-08-24T18:00:39.152Z
Learnt from: CR
Repo: AmanVarshney01/create-better-t-stack PR: 0
File: .cursor/rules/convex_rules.mdc:0-0
Timestamp: 2025-08-24T18:00:39.152Z
Learning: Applies to **/*.{ts,tsx} : Use 'as const' for string literals in discriminated unions
Applied to files:
apps/cli/templates/frontend/native/uniwind/tsconfig.json.hbs
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
- GitHub Check: Cursor Bugbot
🔇 Additional comments (63)
apps/cli/templates/frontend/native/bare/_gitignore (1)
1-18: Solid.gitignoretemplate for bare Expo projects.The gitignore patterns are appropriate and comprehensive, covering dependencies, build artifacts, Expo/Metro tooling, macOS metadata, and critically, security-sensitive files (keys, certificates, provisioning profiles). The structure is clear and follows common conventions.
apps/cli/templates/frontend/native/bare/tsconfig.json.hbs (1)
1-11: LGTM! Standard Expo TypeScript configuration.The tsconfig.json template follows Expo best practices with strict mode enabled and appropriate path aliases. The include patterns correctly reference Expo-generated types and source files.
Verify that the
"@/*"path alias correctly maps to the project structure when the template is rendered. Ensure that imports using@/resolve properly from the generated bare Expo project root.apps/cli/src/utils/setup-catalogs.ts (1)
28-28: LGTM! Native apps can now use catalog dependencies.Re-enabling the native app path allows its dependencies to participate in catalog-based deduplication. The existing
pathExistscheck at line 43 ensures this won't cause errors for projects without a native app. Verification confirms native templates are properly scaffolded and the path is safely referenced throughout the codebase.apps/cli/templates/auth/better-auth/server/base/src/index.ts.hbs (1)
19-21: The native frontend identifiers in the template are correct and consistent.The three native frontend options—
native-bare,native-uniwind, andnative-unistyles—are legitimate, distinct options defined throughout the codebase. They represent different styling approaches for Expo:
native-bare: Bare Expo without styling librarynative-uniwind: Expo with Tailwind CSS (UniWind)native-unistyles: Expo with Unistyles stylingAll three are present in the type definitions, prompts, and compatibility checks. The template correctly checks for all three as valid native frontend selections.
Likely an incorrect or invalid review comment.
apps/cli/templates/examples/ai/native/uniwind/app/(drawer)/ai.tsx.hbs (7)
1-16: LGTM! Clean design system integration.The imports correctly introduce
Pressablefor modern touch handling andCard+useThemeColorfrom heroui-native for consistent theming across the native UI.
18-27: LGTM! Robust URL construction.The explicit slash handling in line 25 ensures consistent API URL formatting regardless of input format—good defensive coding practice.
29-42: LGTM! Theme-driven initialization.The theme color hooks (lines 39-42) enable consistent, theme-aware styling throughout the component. The useChat configuration with custom transport is properly set up.
56-71: LGTM! Improved error presentation.Wrapping the error state in a Card (lines 60-67) with semantic danger colors creates a visually distinct and accessible error state that aligns with the design system.
73-98: LGTM! Clean layout structure.The KeyboardAvoidingView platform handling (line 77) and empty state messaging follow React Native best practices. The text hierarchy is clear and theme-consistent.
100-136: LGTM! Card-based message layout.The Card component usage (lines 102-134) provides consistent visual treatment for messages. The role-based variants and conditional styling (lines 104-109) create clear visual distinction between user and AI messages. The parts rendering logic (lines 115-131) correctly handles both text and non-text content types.
138-167: LGTM! Modern input area with excellent UX.The Pressable component (lines 152-165) provides better touch handling than the previous TouchableOpacity. The conditional styling (lines 155-157, 162) gives clear visual feedback based on input state—accent colors when ready to send, muted when disabled. The theme color integration for placeholder and icons maintains design consistency.
apps/cli/templates/frontend/native/uniwind/tsconfig.json.hbs (2)
5-8: LGTM: Path alias configuration is correct.The
baseUrlandpathsconfiguration properly enables module aliasing with@/*for cleaner imports.
10-13: No issues found with the .d.ts handling in this tsconfig.The configuration extends
expo/tsconfig.baseand includes only.tsand.tsxfiles. Verification showed no custom.d.tsfiles exist in the uniwind template directory, and the Expo base configuration handles standard type resolution. For a template that users scaffold projects from, this pattern is appropriate—if developers add custom ambient declarations later, they can configure tsconfig accordingly or use a dedicated types folder.apps/cli/templates/frontend/native/uniwind/package.json.hbs (5)
1-12: LGTM!The package metadata and scripts are correctly configured for an Expo Router project. The main entry point and standard Expo scripts are appropriate.
19-22: Verify compliance with coding guidelines for conditional logic.The conditional block uses
(includes examples "ai")to check array membership. As per coding guidelines, explicit conditions like(eq orm "prisma")are preferred. Whileincludesis checking for a specific value ("ai"), verify that this pattern is acceptable for array membership checks in your Handlebars templates, as the guideline specifically mentions usingeqfor explicit comparisons.As per coding guidelines
48-54: LGTM!The devDependencies are appropriately minimal for a TypeScript-based React Native project, and the private flag is correctly set for a project template.
32-32: Versions verified as valid and available.React 19.1.0 and Tailwind CSS 4.1.16 are both confirmed to exist and are stable releases on npm. No issues detected.
34-34: The review comment is based on outdated information and should be disregarded.React Native 0.81.5 is the intended version for Expo SDK 54, making the concern about inconsistent versioning unfounded. The version has been verified to exist on npm, and Expo SDK 54 targets React Native 0.81.x, so version 0.81.5 is within the fully supported range. React Native has evolved to the 0.8x version line as of November 2025, which is normal progression.
Likely an incorrect or invalid review comment.
apps/cli/templates/frontend/native/uniwind/_gitignore (1)
18-20: LGTM!Correctly excludes generated UniWind type definitions from version control.
apps/cli/templates/frontend/native/bare/package.json.hbs (1)
1-51: LGTM!The removal of
nativewindandtailwindcssdependencies correctly aligns this template with a "bare" Expo setup, as described in the PR objectives.apps/cli/templates/frontend/native/uniwind/app/(drawer)/(tabs)/two.tsx.hbs (1)
1-15: LGTM!The component correctly uses standard function declaration syntax and follows the expected structure for a UniWind template.
apps/cli/templates/frontend/native/bare/app/_layout.tsx.hbs (1)
57-59: Verify environment variable availability.Line 57 uses a non-null assertion (
!) onprocess.env.EXPO_PUBLIC_CONVEX_URL. If this environment variable is not set, it will passundefinedto the ConvexReactClient constructor, potentially causing a runtime error.Ensure that the setup process guarantees this environment variable is always present, or add runtime validation.
apps/cli/src/helpers/addons/examples-setup.ts (1)
58-61: LGTM! Frontend token update is correct.The update correctly replaces
native-nativewindwithnative-bareandnative-uniwindwhile preservingnative-unistyles, aligning with the PR's frontend restructuring.apps/cli/src/types.ts (1)
30-31: LGTM! Core type definition updated correctly.The FrontendSchema enum correctly removes
native-nativewindand addsnative-bareandnative-uniwind. This change is consistently reflected across the codebase in helpers, templates, tests, and validation logic.apps/cli/README.md (1)
60-60: LGTM! Documentation updated correctly.The CLI help text and example commands correctly reflect the new frontend tokens
native-bareandnative-uniwind(replacingnative-nativewind).Also applies to: 122-122
apps/cli/src/utils/better-auth-plugin-setup.ts (1)
34-41: LGTM! Better-Auth plugin condition updated correctly.The condition now correctly checks for
native-bareandnative-uniwindalongsidenative-unistylesto trigger the expo plugin, consistent with the frontend restructuring.apps/cli/test/deployment.test.ts (1)
66-66: LGTM! Test cases updated correctly.The deployment test cases correctly use
native-bareinstead ofnative-nativewindfor validating web deployment constraints with native frontends.Also applies to: 87-87, 544-544
apps/cli/test/auth.test.ts (1)
130-132: LGTM! Authentication tests updated with comprehensive coverage.The test cases now include
native-bareandnative-uniwindin the compatible frontends lists for both Better-Auth and Clerk, ensuring the new native frontend options are properly tested.Also applies to: 217-219, 460-460
apps/cli/src/utils/config-validation.ts (1)
218-220: LGTM! Validation logic updated correctly.The supported frontends list for Better-Auth with Convex backend now correctly includes
native-bareandnative-uniwind(replacingnative-nativewind), ensuring proper configuration validation.apps/cli/test/addons.test.ts (2)
77-83: LGTM! Consistent renaming for PWA incompatibility.The replacement of
native-nativewindwithnative-bareandnative-uniwindcorrectly maintains PWA addon incompatibility for all native frontend options.
157-161: LGTM! Consistent renaming for Tauri incompatibility.The changes correctly update Tauri addon incompatibility checks to include both new native frontend options.
apps/cli/src/prompts/auth.ts (2)
16-25: LGTM! Better Auth compatibility updated correctly.The frontend compatibility check for Better Auth now correctly includes both
native-bareandnative-uniwind, maintaining feature parity with the previousnative-nativewindoption.
27-37: LGTM! Clerk compatibility updated consistently.The Clerk compatibility check mirrors the Better Auth changes, ensuring both new native frontend options are supported.
apps/cli/src/helpers/addons/ultracite-setup.ts (1)
114-137: LGTM! Framework mapping updated correctly.Both
native-bareandnative-uniwindcorrectly map to the "react" framework, which is appropriate since they are React Native-based frontends.apps/cli/test/integration.test.ts (4)
117-136: LGTM! Mobile app test updated to use native-bare.The integration test correctly uses the new
native-barefrontend option for testing mobile app creation.
377-396: LGTM! PWA incompatibility test updated correctly.The test correctly verifies that the PWA addon remains incompatible with the
native-barefrontend option.
444-463: LGTM! Deployment constraint test updated correctly.The test correctly uses
native-bareto verify that web deployment requires a web frontend and fails with native-only frontends.
467-486: LGTM! Hybrid app test updated correctly.The maximum complexity test now uses
native-barealongsidetanstack-router, correctly testing hybrid web + mobile configurations.apps/cli/src/helpers/core/env-setup.ts (2)
227-272: LGTM! Native environment setup updated correctly.The conditional logic correctly includes both
native-bareandnative-uniwindfor native app environment variable configuration, ensuring proper setup for both new frontend options.
280-308: LGTM! Convex native detection updated consistently.The native frontend detection for Convex backend environment setup correctly includes both new native options, ensuring proper configuration for Convex with native frontends.
apps/cli/templates/frontend/native/bare/app/(drawer)/(tabs)/two.tsx.hbs (1)
1-43: LGTM! Well-structured tab component with proper theming.The TabTwo component follows React Native best practices:
- Correctly integrates with the color scheme system
- Uses consistent styling patterns
- Applies theme colors appropriately
- Maintains good visual hierarchy with opacity
apps/cli/templates/frontend/native/uniwind/global.css (1)
1-5: No issues found. The configuration is correct.The
heroui-nativepackage is properly declared as a dependency inpackage.json.hbs(version^1.0.0-beta.1), and the@sourcepath./node_modules/heroui-native/libis the correct location for accessing the library's files after npm installation. The imports are consistent with howheroui-nativeis actively used throughout the template files.apps/cli/templates/frontend/native/uniwind/app.json.hbs (1)
1-16: Now I need to verify the actual Metro and CSS configuration files in the Uniwind template:
The app.json configuration is correct as-is. Uniwind only supports Tailwind 4, and it handles styling configuration through
metro.config.jswithwithUniwindConfig()and aglobal.cssfile, not through app.json plugins. Theexpo-fontplugin is the appropriate and sufficient plugin for this template. The minimal configuration is intentional for Uniwind's architecture.apps/cli/test/api.test.ts (3)
52-52: Great coverage for new native frontends.Thanks for expanding the tRPC native matrix to include
native-bareandnative-uniwindalongsidenative-unistyles.
184-186: ORPC matrix stays in sync.Appreciate that the oRPC sweep now tests the bare and uniwind stacks too.
569-569: Edge combo reflects the new default.Good call updating the complex frontend combo to pair web with
native-bare.apps/cli/templates/frontend/native/uniwind/metro.config.js.hbs (1)
1-12: Uniwind metro config looks solid.Wrapping Expo’s default config with
withUniwindConfigand setting the CSS/DTS entry points lines up with the expected Uniwind setup.apps/cli/src/prompts/frontend.ts (1)
95-111: Prompt update aligns with new native stacks.The Bare default plus Uniwind option matches the expanded frontend schema and keeps the CLI prompt consistent.
apps/cli/templates/frontend/native/bare/app/modal.tsx.hbs (1)
1-36: Modal component integrates theming cleanly.Nice to see the bare template reusing
Containerand pulling text color fromNAV_THEME; everything lines up.apps/cli/templates/auth/better-auth/convex/native/uniwind/components/sign-in.tsx.hbs (1)
12-90: LGTM!The SignIn component is well-structured with proper state management, error handling, and theme integration. The authentication flow correctly handles loading states and provides user feedback.
apps/cli/templates/frontend/native/uniwind/components/theme-toggle.tsx.hbs (1)
10-34: LGTM!The ThemeToggle component properly integrates platform-specific haptics, smooth animations, and theme state management. The use of
withUniwindHOC correctly enables className-based styling for the Ionicons.apps/cli/src/helpers/core/create-readme.ts (2)
325-327: Consistent update in generateProjectStructure.The native frontend detection logic is correctly updated here as well, maintaining consistency with the changes at lines 46-48.
407-409: Consistent update in generateFeaturesList.The native frontend detection is correctly updated, completing the migration across all functions in this file.
apps/cli/templates/frontend/native/uniwind/app/modal.tsx.hbs (1)
7-53: LGTM!The Modal component follows Expo Router modal patterns correctly, with proper navigation handling via
router.back()and consistent theme integration. The UI structure with Card components is well-organized.apps/cli/templates/frontend/native/bare/app/(drawer)/(tabs)/index.tsx.hbs (1)
6-43: LGTM!The TabOne component correctly implements theme-aware styling using the color scheme hook and NAV_THEME constants. The use of StyleSheet follows React Native best practices.
apps/cli/test/frontend.test.ts (4)
17-33: Test configuration correctly updated for new native frontend options.The
singleFrontendsarray now includesnative-bareandnative-uniwindinstead of the removednative-nativewind, with matching type annotations. This ensures all new native frontend variants are tested.
342-342: Test correctly uses native-bare for multiple native frontends validation.The test case now validates that users cannot select both
native-bareandnative-unistyles, maintaining the constraint logic with the updated frontend tokens.
363-363: Test correctly uses native-bare for web-native combination.The web-native combo test now uses
native-barealongsidetanstack-router, validating that one web and one native frontend can be selected together.
495-495: Test correctly validates web deploy requirement with native-bare.The test now uses
native-bareto verify that web deployment options require a web frontend, not just a native frontend.apps/cli/src/utils/compatibility-rules.ts (3)
26-28: Native frontend detection correctly updated.The
splitFrontendsfunction now properly identifies all three native frontend variants:native-bare,native-uniwind, andnative-unistyles. This ensures compatibility validation works correctly with the new frontend options.
40-42: Error message accurately reflects available native frontends.The validation message now lists all three supported native frontend options, providing clear guidance to users when they attempt to select multiple native frameworks.
74-76: Consistent error message in self-backend validation.The error message for fullstack (self-backend) native framework validation is consistently updated to match the changes elsewhere in the file.
apps/cli/templates/auth/better-auth/convex/native/uniwind/components/sign-up.tsx.hbs (1)
24-49: SwitchhandleSignUpto a function declarationProject guidelines require standard function declarations instead of arrow functions. Converting
handleSignUpkeeps the logic unchanged while aligning with the convention.- const handleSignUp = async () => { + async function handleSignUp() { setIsLoading(true); setError(null); await authClient.signUp.email( { name, email, password, }, { onError: (error) => { setError(error.error?.message || "Failed to sign up"); setIsLoading(false); }, onSuccess: () => { setName(""); setEmail(""); setPassword(""); }, onFinished: () => { setIsLoading(false); }, }, ); - }; + }[As per coding guidelines]
⛔ Skipped due to learnings
Learnt from: CR Repo: AmanVarshney01/create-better-t-stack PR: 0 File: .cursor/rules/better-t-stack-repo.mdc:0-0 Timestamp: 2025-09-11T04:31:24.508Z Learning: Applies to **/*.{js,jsx,ts,tsx} : Define functions using the standard function declaration syntax, not arrow functions.
apps/cli/templates/auth/better-auth/native/uniwind/app/(drawer)/index.tsx.hbs
Outdated
Show resolved
Hide resolved
apps/cli/templates/auth/better-auth/native/uniwind/components/sign-in.tsx.hbs
Outdated
Show resolved
Hide resolved
apps/cli/templates/auth/better-auth/native/uniwind/components/sign-up.tsx.hbs
Outdated
Show resolved
Hide resolved
| screenOptions=\{{{ | ||
| headerShown: false, | ||
| tabBarActiveTintColor: isDarkColorScheme | ||
| ? "hsl(217.2 91.2% 59.8%)" | ||
| : "hsl(221.2 83.2% 53.3%)", | ||
| tabBarInactiveTintColor: isDarkColorScheme | ||
| ? "hsl(215 20.2% 65.1%)" | ||
| : "hsl(215.4 16.3% 46.9%)", | ||
| tabBarActiveTintColor: theme.primary, | ||
| tabBarInactiveTintColor: theme.text, | ||
| tabBarStyle: { | ||
| backgroundColor: isDarkColorScheme | ||
| ? "hsl(222.2 84% 4.9%)" | ||
| : "hsl(0 0% 100%)", | ||
| borderTopColor: isDarkColorScheme | ||
| ? "hsl(217.2 32.6% 17.5%)" | ||
| : "hsl(214.3 31.8% 91.4%)", | ||
| backgroundColor: theme.background, | ||
| borderTopColor: theme.border, | ||
| }, | ||
| }} | ||
| }}} | ||
| > | ||
| <Tabs.Screen | ||
| name="index" | ||
| options=\{{ | ||
| options=\{{{ | ||
| title: "Home", | ||
| tabBarIcon: ({ color }) => <TabBarIcon name="home" color={color} />, | ||
| }} | ||
| }}} | ||
| /> | ||
| <Tabs.Screen | ||
| name="two" | ||
| options=\{{ | ||
| options=\{{{ | ||
| title: "Explore", | ||
| tabBarIcon: ({ color }) => ( | ||
| <TabBarIcon name="compass" color={color} /> | ||
| ), | ||
| }} | ||
| }}} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Revert to double braces in generated JSX.
Changing to \{{{ … }}} causes Handlebars to emit literal triple braces, so the generated Expo Router layout becomes screenOptions={{{ … }}}, which is invalid JSX. Please return to the standard double-brace form (no backslash, no extra {).
Apply this diff:
- <Tabs
- screenOptions=\{{{
+ <Tabs
+ screenOptions={{
@@
- },
- }}}
+ },
+ }}
@@
- <Tabs.Screen
- name="index"
- options=\{{{
+ <Tabs.Screen
+ name="index"
+ options={{
@@
- name="two"
- options=\{{{
+ name="two"
+ options={{
@@
- ),
- }}}
+ ),
+ }}📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| screenOptions=\{{{ | |
| headerShown: false, | |
| tabBarActiveTintColor: isDarkColorScheme | |
| ? "hsl(217.2 91.2% 59.8%)" | |
| : "hsl(221.2 83.2% 53.3%)", | |
| tabBarInactiveTintColor: isDarkColorScheme | |
| ? "hsl(215 20.2% 65.1%)" | |
| : "hsl(215.4 16.3% 46.9%)", | |
| tabBarActiveTintColor: theme.primary, | |
| tabBarInactiveTintColor: theme.text, | |
| tabBarStyle: { | |
| backgroundColor: isDarkColorScheme | |
| ? "hsl(222.2 84% 4.9%)" | |
| : "hsl(0 0% 100%)", | |
| borderTopColor: isDarkColorScheme | |
| ? "hsl(217.2 32.6% 17.5%)" | |
| : "hsl(214.3 31.8% 91.4%)", | |
| backgroundColor: theme.background, | |
| borderTopColor: theme.border, | |
| }, | |
| }} | |
| }}} | |
| > | |
| <Tabs.Screen | |
| name="index" | |
| options=\{{ | |
| options=\{{{ | |
| title: "Home", | |
| tabBarIcon: ({ color }) => <TabBarIcon name="home" color={color} />, | |
| }} | |
| }}} | |
| /> | |
| <Tabs.Screen | |
| name="two" | |
| options=\{{ | |
| options=\{{{ | |
| title: "Explore", | |
| tabBarIcon: ({ color }) => ( | |
| <TabBarIcon name="compass" color={color} /> | |
| ), | |
| }} | |
| }}} | |
| screenOptions={{ | |
| headerShown: false, | |
| tabBarActiveTintColor: theme.primary, | |
| tabBarInactiveTintColor: theme.text, | |
| tabBarStyle: { | |
| backgroundColor: theme.background, | |
| borderTopColor: theme.border, | |
| }, | |
| }} | |
| > | |
| <Tabs.Screen | |
| name="index" | |
| options={{ | |
| title: "Home", | |
| tabBarIcon: ({ color }) => <TabBarIcon name="home" color={color} />, | |
| }} | |
| /> | |
| <Tabs.Screen | |
| name="two" | |
| options={{ | |
| title: "Explore", | |
| tabBarIcon: ({ color }) => ( | |
| <TabBarIcon name="compass" color={color} /> | |
| ), | |
| }} |
🤖 Prompt for AI Agents
In apps/cli/templates/frontend/native/bare/app/(drawer)/(tabs)/_layout.tsx.hbs
around lines 12 to 36, the template currently emits triple-brace sequences like
\{{{ … }}} which produce invalid JSX (screenOptions={{{ … }}}) in the generated
Expo Router layout; change those occurrences back to standard double-brace JSX
syntax by replacing any \{{{ and }}} (and any backslash-escaped variants) with {
and } pairs that result in screenOptions={{ ... }} and options={{ ... }} so the
generated file uses valid JSX object literals for screenOptions and options.
apps/cli/templates/frontend/native/bare/components/container.tsx.hbs
Outdated
Show resolved
Hide resolved
apps/cli/templates/frontend/native/bare/components/header-button.tsx.hbs
Show resolved
Hide resolved
| {{#if (eq backend "convex")}} | ||
| const isConnected = healthCheck === "OK"; | ||
| const isLoading = healthCheck === undefined; | ||
| {{else}} | ||
| {{#unless (eq api "none")}} | ||
| const isConnected = healthCheck?.data === "OK"; | ||
| const isLoading = healthCheck?.isLoading; | ||
| {{/unless}} | ||
| {{/if}} | ||
|
|
||
| return ( | ||
| <Container className="p-6"> | ||
| <View className="py-4 mb-6"> | ||
| <Text className="text-4xl font-bold text-foreground mb-2"> | ||
| BETTER T STACK | ||
| </Text> | ||
| </View> | ||
|
|
||
| {{#unless (and (eq backend "convex") (eq auth "better-auth"))}} | ||
| <Card variant="secondary" className="p-6"> | ||
| <View className="flex-row items-center justify-between mb-4"> | ||
| <Card.Title>System Status</Card.Title> | ||
| <Chip | ||
| variant="secondary" | ||
| color={isConnected ? "success" : "danger"} | ||
| size="sm" | ||
| > | ||
| <Chip.Label> | ||
| {isConnected ? "LIVE" : "OFFLINE"} | ||
| </Chip.Label> | ||
| </Chip> | ||
| </View> | ||
| <Card className="p-4"> | ||
| <View className="flex-row items-center"> | ||
| <View | ||
| className={`w-3 h-3 rounded-full mr-3 ${ | ||
| isConnected ? "bg-success" : "bg-muted" | ||
| }`} | ||
| /> | ||
| <View className="flex-1"> | ||
| <Text className="text-foreground font-medium mb-1"> | ||
| {{#if (eq backend "convex")}} | ||
| Convex Backend | ||
| {{else}} | ||
| {{#unless (eq api "none")}} | ||
| {{#if (eq api "orpc")}}ORPC{{else}}TRPC{{/if}} Backend | ||
| {{/unless}} | ||
| {{/if}} | ||
| </Text> |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Guard the status card when api === "none"
When the template runs with api set to "none", the const declarations for isConnected/isLoading are omitted (Lines 56-59), but the System Status card (Lines 70-120) still renders and references those identifiers. The generated file will fail to compile with ReferenceError: isConnected is not defined. Please either skip rendering the card when api === "none" or provide fallback declarations so the identifiers always exist.
🤖 Prompt for AI Agents
In apps/cli/templates/frontend/native/uniwind/app/(drawer)/index.tsx.hbs around
lines 52 to 100, the System Status card references isConnected/isLoading which
are not declared when api === "none", causing a runtime/compile error; fix by
guarding the card with a Handlebars conditional (wrap the entire Card block in
{{#unless (eq api "none")}} ... {{/unless}}) so it's not rendered when api is
"none", or alternatively add an else branch that defines fallback consts (e.g.,
const isConnected = false; const isLoading = false;) before the return so the
identifiers always exist.
| }, | ||
| } | ||
| ); | ||
| } |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Bug: Async Inconsistency: Broken Error Handling
The signUpHandler function is missing the async keyword but calls authClient.signUp.email() which returns a promise. Without async, the promise isn't awaited and errors won't be properly caught. The corresponding handleLogin in sign-in.tsx.hbs correctly uses async, showing this is an inconsistency that breaks error handling.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 8
♻️ Duplicate comments (2)
apps/cli/templates/frontend/native/bare/components/header-button.tsx.hbs (1)
7-9: Incorrect ref type causes TypeScript errors.The first type parameter of
forwardRefshould be the element instance type, not the component type.typeof Pressablerefers to the component constructor, which is incorrect. For Pressable components, the ref type should beView.Apply this diff to fix the ref type:
-import { Pressable, StyleSheet } from "react-native"; +import { Pressable, StyleSheet, View } from "react-native"; export const HeaderButton = forwardRef< - typeof Pressable, + View, { onPress?: () => void } >(({ onPress }, ref) => {apps/cli/templates/frontend/native/bare/app/_layout.tsx.hbs (1)
124-159: Replace bare{{else}}branches with explicit conditionsThe default Convex branch (Line 124) and the API fallback (Line 150) still rely on a plain
{{else}}. Our Handlebars guideline requires explicit conditions, as previously flagged, so please rewrite these branches to something like{{else if (eq auth "none")}}and{{else if (eq api "none")}}, adjusting the surrounding blocks as needed to keep the logic the same.
As per coding guidelines
🧹 Nitpick comments (10)
apps/cli/templates/frontend/native/bare/components/header-button.tsx.hbs (1)
7-39: Consider adding a displayName for better debugging.Components created with
forwardRefbenefit from an explicitdisplayNameproperty, which improves the debugging experience in React DevTools.Add a displayName after the component definition:
}); + +HeaderButton.displayName = "HeaderButton";apps/cli/templates/frontend/native/uniwind/app.json.hbs (2)
1-19: Add missing critical Expo configuration fields.The template is missing several standard Expo app.json fields that are typically required or recommended for production apps:
version(required for app store submissions and OTA updates)iconpath for the app iconsplashscreen configurationiosandandroidplatform-specific settings (bundle identifiers, build numbers, etc.)assetBundlePatternsto specify which assets to bundleConsider extending the template to include these fields:
{ "expo": { "scheme": "{{projectName}}", + "version": "1.0.0", "userInterfaceStyle": "automatic", "orientation": "default", + "icon": "./assets/icon.png", + "splash": { + "image": "./assets/splash.png", + "resizeMode": "contain", + "backgroundColor": "#ffffff" + }, "web": { "bundler": "metro" }, "name": "{{projectName}}", "slug": "{{projectName}}", + "ios": { + "bundleIdentifier": "com.{{projectName}}.app", + "supportsTablet": true + }, + "android": { + "package": "com.{{projectName}}.app", + "adaptiveIcon": { + "foregroundImage": "./assets/adaptive-icon.png", + "backgroundColor": "#ffffff" + } + }, + "assetBundlePatterns": [ + "**/*" + ], "plugins": [ "expo-font" ], "experiments": { "typedRoutes": true, "reactCompiler": true } } }
11-13: Remove unusedexpo-fontplugin to reduce bundle size.The
expo-fontplugin and dependency are not used anywhere in the uniwind template. No font loading logic exists (nouseFonts,Font.loadAsync, or custom font imports found). Since the template relies on system fonts and icon libraries, this plugin can be safely removed from bothapp.json.hbs(lines 11–13) andpackage.json.hbs.apps/cli/src/helpers/core/template-manager.ts (3)
75-75: Remove unused variable_hasNative.The variable
_hasNativeis declared but never used. Line 205 duplicates the same condition inline instead of using this variable. Either remove the variable or use it at line 205.Apply this diff to use the variable:
- if (hasNativeBare || hasNativeUniwind || hasUnistyles) { + if (_hasNative) {Or remove the unused variable entirely:
- const _hasNative = hasNativeBare || hasNativeUniwind || hasUnistyles;
224-230: Consider extracting the repeated native framework path resolution pattern.This if-else chain for mapping native frontend tokens to framework path strings is duplicated at lines 447-450, 534-537, 697-703, and 1049-1055. Consider extracting it to a helper function to improve maintainability.
Example helper function:
function getNativeFrameworkPath(context: ProjectConfig) { if (context.frontend.includes("native-bare")) return "bare"; if (context.frontend.includes("native-uniwind")) return "uniwind"; if (context.frontend.includes("native-unistyles")) return "unistyles"; return ""; }Then use it consistently:
- let nativeFrameworkPath = ""; - if (hasNativeBare) { - nativeFrameworkPath = "bare"; - } else if (hasNativeUniwind) { - nativeFrameworkPath = "uniwind"; - } else if (hasUnistyles) { - nativeFrameworkPath = "unistyles"; - } + const nativeFrameworkPath = getNativeFrameworkPath(context);
389-389: Use consistent variable naming for native frameworks.The variable
hasUniwindis inconsistent withhasNativeUniwindused insetupFrontendTemplatesat line 73. For consistency and searchability, use the full namehasNativeUniwindthroughout the file. This same issue appears at lines 1044 and 1078.Apply this diff:
- const hasUniwind = context.frontend.includes("native-uniwind"); + const hasNativeUniwind = context.frontend.includes("native-uniwind");And update references at lines 391, 449, 536, 700, 1044, 1047, 1051, 1078, 1080.
apps/cli/templates/auth/better-auth/convex/native/bare/components/sign-up.tsx.hbs (1)
93-93: Consider using theme values for button colors.The hardcoded
#ffffffcolors could be replaced with theme values for better consistency and dark mode support.Apply this diff:
- {isLoading ? ( - <ActivityIndicator size="small" color="#ffffff" /> - ) : ( - <Text style={styles.buttonText}>Sign Up</Text> + {isLoading ? ( + <ActivityIndicator size="small" color={theme.card} /> + ) : ( + <Text style={[styles.buttonText, { color: theme.card }]}>Sign Up</Text> )}And update the StyleSheet:
buttonText: { - color: "#ffffff", fontSize: 16, fontWeight: "500", },Also applies to: 139-139
apps/cli/templates/auth/better-auth/native/bare/components/sign-up.tsx.hbs (1)
99-103: Consider using theme values for button colors.Similar to the Convex variant, the hardcoded
#ffffffcolors could use theme values for consistency.Also applies to: 145-149
apps/cli/templates/auth/better-auth/convex/native/bare/components/sign-in.tsx.hbs (1)
82-82: Consider using theme values for button colors.The hardcoded
#ffffffcolors could be replaced with theme values for better consistency, similar to the SignUp component.Also applies to: 127-127
apps/cli/templates/auth/better-auth/native/bare/components/sign-in.tsx.hbs (1)
75-75: Consider using theme values for button colors.Same as the other templates: hardcoded
#ffffffcould use theme values.Also applies to: 120-120
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (15)
apps/cli/src/helpers/core/template-manager.ts(9 hunks)apps/cli/templates/auth/better-auth/convex/native/bare/components/sign-in.tsx.hbs(1 hunks)apps/cli/templates/auth/better-auth/convex/native/bare/components/sign-up.tsx.hbs(1 hunks)apps/cli/templates/auth/better-auth/native/bare/components/sign-in.tsx.hbs(1 hunks)apps/cli/templates/auth/better-auth/native/bare/components/sign-up.tsx.hbs(1 hunks)apps/cli/templates/examples/ai/native/bare/app/(drawer)/ai.tsx.hbs(1 hunks)apps/cli/templates/examples/ai/native/bare/polyfills.js(1 hunks)apps/cli/templates/examples/todo/native/bare/app/(drawer)/todos.tsx.hbs(1 hunks)apps/cli/templates/frontend/native/bare/app/(drawer)/(tabs)/_layout.tsx.hbs(2 hunks)apps/cli/templates/frontend/native/bare/app/(drawer)/_layout.tsx.hbs(2 hunks)apps/cli/templates/frontend/native/bare/app/(drawer)/index.tsx.hbs(1 hunks)apps/cli/templates/frontend/native/bare/app/_layout.tsx.hbs(1 hunks)apps/cli/templates/frontend/native/bare/components/container.tsx.hbs(1 hunks)apps/cli/templates/frontend/native/bare/components/header-button.tsx.hbs(1 hunks)apps/cli/templates/frontend/native/uniwind/app.json.hbs(1 hunks)
✅ Files skipped from review due to trivial changes (1)
- apps/cli/templates/examples/ai/native/bare/polyfills.js
🚧 Files skipped from review as they are similar to previous changes (1)
- apps/cli/templates/frontend/native/bare/components/container.tsx.hbs
🧰 Additional context used
📓 Path-based instructions (4)
**/*.{hbs,handlebars}
📄 CodeRabbit inference engine (.cursor/rules/better-t-stack-repo.mdc)
In Handlebars templates, avoid generic if/else blocks; write explicit conditions (e.g., if (eq orm "prisma") and else if (eq orm "drizzle")).
Files:
apps/cli/templates/auth/better-auth/convex/native/bare/components/sign-in.tsx.hbsapps/cli/templates/frontend/native/bare/app/(drawer)/(tabs)/_layout.tsx.hbsapps/cli/templates/frontend/native/bare/app/(drawer)/index.tsx.hbsapps/cli/templates/auth/better-auth/native/bare/components/sign-in.tsx.hbsapps/cli/templates/examples/todo/native/bare/app/(drawer)/todos.tsx.hbsapps/cli/templates/frontend/native/bare/app/(drawer)/_layout.tsx.hbsapps/cli/templates/frontend/native/bare/components/header-button.tsx.hbsapps/cli/templates/frontend/native/uniwind/app.json.hbsapps/cli/templates/auth/better-auth/convex/native/bare/components/sign-up.tsx.hbsapps/cli/templates/frontend/native/bare/app/_layout.tsx.hbsapps/cli/templates/examples/ai/native/bare/app/(drawer)/ai.tsx.hbsapps/cli/templates/auth/better-auth/native/bare/components/sign-up.tsx.hbs
**/*.{ts,tsx}
📄 CodeRabbit inference engine (.cursor/rules/convex_rules.mdc)
**/*.{ts,tsx}: Use Id from './_generated/dataModel' to type document ids (e.g., Id<'users'>)
Ensure Record key/value types align with validators (e.g., v.record(v.id('users'), v.string()) => Record<Id<'users'>, string>)
Be strict with types for document ids; prefer Id<'table'> over string
Use 'as const' for string literals in discriminated unions
When using Array and Record types, declare with explicit generic types (e.g., const arr: Array = ...)
**/*.{ts,tsx}: Use TypeScript type aliases instead of interface declarations.
Do not use explicit return types in TypeScript.
Files:
apps/cli/src/helpers/core/template-manager.ts
**/*.{js,jsx,ts,tsx,mjs,cjs}
📄 CodeRabbit inference engine (.cursor/rules/use-bun-instead-of-node-vite-npm-pnpm.mdc)
**/*.{js,jsx,ts,tsx,mjs,cjs}: Do not use dotenv; Bun auto-loads .env
UseBun.serve()for HTTP/WebSockets; do not useexpress
Usebun:sqlitefor SQLite; do not usebetter-sqlite3
UseBun.redisfor Redis; do not useioredis
UseBun.sqlfor Postgres; do not usepgorpostgres.js
Use built-inWebSocket; do not usews
PreferBun.fileovernode:fsreadFile/writeFile
UseBun.$instead ofexecafor shelling out
Files:
apps/cli/src/helpers/core/template-manager.ts
**/*.{js,jsx,ts,tsx}
📄 CodeRabbit inference engine (.cursor/rules/better-t-stack-repo.mdc)
Define functions using the standard function declaration syntax, not arrow functions.
Files:
apps/cli/src/helpers/core/template-manager.ts
🧠 Learnings (2)
📚 Learning: 2025-09-11T04:31:24.508Z
Learnt from: CR
Repo: AmanVarshney01/create-better-t-stack PR: 0
File: .cursor/rules/better-t-stack-repo.mdc:0-0
Timestamp: 2025-09-11T04:31:24.508Z
Learning: Applies to **/*.{hbs,handlebars} : In Handlebars templates, avoid generic if/else blocks; write explicit conditions (e.g., if (eq orm "prisma") and else if (eq orm "drizzle")).
Applied to files:
apps/cli/templates/frontend/native/bare/app/(drawer)/(tabs)/_layout.tsx.hbsapps/cli/templates/frontend/native/bare/app/_layout.tsx.hbs
📚 Learning: 2025-08-24T18:01:11.544Z
Learnt from: CR
Repo: AmanVarshney01/create-better-t-stack PR: 0
File: .cursor/rules/use-bun-instead-of-node-vite-npm-pnpm.mdc:0-0
Timestamp: 2025-08-24T18:01:11.544Z
Learning: Applies to **/*.{js,jsx,ts,tsx,mjs,cjs} : Use `Bun.$` instead of `execa` for shelling out
Applied to files:
apps/cli/src/helpers/core/template-manager.ts
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
- GitHub Check: Cursor Bugbot
🔇 Additional comments (4)
apps/cli/src/helpers/core/template-manager.ts (1)
697-703: Past review concern resolved: native-bare now supported.The previous review flagged that
native-barewas missing from this auth path resolution. The code now correctly handlesnative-bareby checkinghasNativeBarefirst and setting the path to "bare". This resolves the inconsistency with Clerk auth handling.apps/cli/templates/auth/better-auth/convex/native/bare/components/sign-up.tsx.hbs (1)
14-48: LGTM! Auth flow correctly omits queryClient for Convex.The SignUp component correctly handles the authentication flow for Convex, which manages its own reactivity without needing manual query refetching.
apps/cli/templates/auth/better-auth/convex/native/bare/components/sign-in.tsx.hbs (1)
14-45: LGTM! Auth flow correctly omits queryClient for Convex.The SignIn component correctly handles the authentication flow for Convex without manual query refetching.
apps/cli/templates/auth/better-auth/native/bare/components/sign-in.tsx.hbs (1)
45-45: Verify thatapiis always either "trpc" or "orpc".Same verification needed as in the SignUp template: ensure
queryClientis always imported when used.Run the verification script provided in the SignUp template review comment.
| {{#if (eq api "trpc")}} | ||
| import { queryClient } from "@/utils/trpc"; | ||
| {{/if}} | ||
| {{#if (eq api "orpc")}} | ||
| import { queryClient } from "@/utils/orpc"; | ||
| {{/if}} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ Refactor suggestion | 🟠 Major
Refactor to use else if in Handlebars template.
Same issue as in the SignUp template: use explicit else if for mutually exclusive API conditions.
Apply this diff:
-{{#if (eq api "trpc")}}
+{{#if (eq api "trpc")}}
import { queryClient } from "@/utils/trpc";
-{{/if}}
-{{#if (eq api "orpc")}}
+{{else if (eq api "orpc")}}
import { queryClient } from "@/utils/orpc";
{{/if}}As per coding guidelines.
📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| {{#if (eq api "trpc")}} | |
| import { queryClient } from "@/utils/trpc"; | |
| {{/if}} | |
| {{#if (eq api "orpc")}} | |
| import { queryClient } from "@/utils/orpc"; | |
| {{/if}} | |
| {{#if (eq api "trpc")}} | |
| import { queryClient } from "@/utils/trpc"; | |
| {{else if (eq api "orpc")}} | |
| import { queryClient } from "@/utils/orpc"; | |
| {{/if}} |
🤖 Prompt for AI Agents
In apps/cli/templates/auth/better-auth/native/bare/components/sign-in.tsx.hbs
around lines 2 to 7, the template uses two separate Handlebars {{#if}} blocks
for mutually exclusive api values which can render both; change them to a single
conditional chain by replacing the second standalone {{#if (eq api "orpc")}}
with an {{else if (eq api "orpc")}} branch so only one import is emitted based
on the api value and keep closing tags correctly.
| <TextInput style={[styles.input, { color: theme.text, borderColor: theme.border, backgroundColor: | ||
| theme.background }]} placeholder="Email" placeholderTextColor={theme.text} value={email} | ||
| onChangeText={setEmail} keyboardType="email-address" autoCapitalize="none" /> | ||
|
|
||
| <TextInput style={[styles.input, { color: theme.text, borderColor: theme.border, backgroundColor: | ||
| theme.background }]} placeholder="Password" placeholderTextColor={theme.text} value={password} | ||
| onChangeText={setPassword} secureTextEntry /> | ||
|
|
||
| <TouchableOpacity onPress={handleLogin} disabled={isLoading} style={[styles.button, { backgroundColor: | ||
| theme.primary, opacity: isLoading ? 0.5 : 1 }]}> | ||
| {isLoading ? ( | ||
| <ActivityIndicator size="small" color="#ffffff" /> | ||
| ) : ( | ||
| <Text style={styles.buttonText}>Sign In</Text> | ||
| )} | ||
| </TouchableOpacity> |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ Refactor suggestion | 🟠 Major
Fix JSX formatting for readability.
The JSX elements are broken across lines in a way that makes the code hard to read and maintain.
Apply this diff to fix formatting:
- <TextInput style={[styles.input, { color: theme.text, borderColor: theme.border, backgroundColor:
- theme.background }]} placeholder="Email" placeholderTextColor={theme.text} value={email}
- onChangeText={setEmail} keyboardType="email-address" autoCapitalize="none" />
+ <TextInput
+ style={[styles.input, { color: theme.text, borderColor: theme.border, backgroundColor: theme.background }]}
+ placeholder="Email"
+ placeholderTextColor={theme.text}
+ value={email}
+ onChangeText={setEmail}
+ keyboardType="email-address"
+ autoCapitalize="none"
+ />
- <TextInput style={[styles.input, { color: theme.text, borderColor: theme.border, backgroundColor:
- theme.background }]} placeholder="Password" placeholderTextColor={theme.text} value={password}
- onChangeText={setPassword} secureTextEntry />
+ <TextInput
+ style={[styles.input, { color: theme.text, borderColor: theme.border, backgroundColor: theme.background }]}
+ placeholder="Password"
+ placeholderTextColor={theme.text}
+ value={password}
+ onChangeText={setPassword}
+ secureTextEntry
+ />
- <TouchableOpacity onPress={handleLogin} disabled={isLoading} style={[styles.button, { backgroundColor:
- theme.primary, opacity: isLoading ? 0.5 : 1 }]}>
+ <TouchableOpacity
+ onPress={handleLogin}
+ disabled={isLoading}
+ style={[styles.button, { backgroundColor: theme.primary, opacity: isLoading ? 0.5 : 1 }]}
+ >
{isLoading ? (
- <ActivityIndicator size="small" color="#ffffff" />
+ <ActivityIndicator size="small" color="#ffffff" />
) : (
- <Text style={styles.buttonText}>Sign In</Text>
+ <Text style={styles.buttonText}>Sign In</Text>
)}
</TouchableOpacity>📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| <TextInput style={[styles.input, { color: theme.text, borderColor: theme.border, backgroundColor: | |
| theme.background }]} placeholder="Email" placeholderTextColor={theme.text} value={email} | |
| onChangeText={setEmail} keyboardType="email-address" autoCapitalize="none" /> | |
| <TextInput style={[styles.input, { color: theme.text, borderColor: theme.border, backgroundColor: | |
| theme.background }]} placeholder="Password" placeholderTextColor={theme.text} value={password} | |
| onChangeText={setPassword} secureTextEntry /> | |
| <TouchableOpacity onPress={handleLogin} disabled={isLoading} style={[styles.button, { backgroundColor: | |
| theme.primary, opacity: isLoading ? 0.5 : 1 }]}> | |
| {isLoading ? ( | |
| <ActivityIndicator size="small" color="#ffffff" /> | |
| ) : ( | |
| <Text style={styles.buttonText}>Sign In</Text> | |
| )} | |
| </TouchableOpacity> | |
| <TextInput | |
| style={[styles.input, { color: theme.text, borderColor: theme.border, backgroundColor: theme.background }]} | |
| placeholder="Email" | |
| placeholderTextColor={theme.text} | |
| value={email} | |
| onChangeText={setEmail} | |
| keyboardType="email-address" | |
| autoCapitalize="none" | |
| /> | |
| <TextInput | |
| style={[styles.input, { color: theme.text, borderColor: theme.border, backgroundColor: theme.background }]} | |
| placeholder="Password" | |
| placeholderTextColor={theme.text} | |
| value={password} | |
| onChangeText={setPassword} | |
| secureTextEntry | |
| /> | |
| <TouchableOpacity | |
| onPress={handleLogin} | |
| disabled={isLoading} | |
| style={[styles.button, { backgroundColor: theme.primary, opacity: isLoading ? 0.5 : 1 }]} | |
| > | |
| {isLoading ? ( | |
| <ActivityIndicator size="small" color="#ffffff" /> | |
| ) : ( | |
| <Text style={styles.buttonText}>Sign In</Text> | |
| )} | |
| </TouchableOpacity> |
🤖 Prompt for AI Agents
In apps/cli/templates/auth/better-auth/native/bare/components/sign-in.tsx.hbs
around lines 64 to 79 the JSX props and nested children are broken across lines
making it hard to read; reformat each TextInput and the TouchableOpacity so
props are one-per-line (style, placeholder, placeholderTextColor, value,
onChangeText, keyboardType, autoCapitalize, secureTextEntry, disabled) with
consistent indentation, wrap long style objects onto multiple lines, place the
ActivityIndicator and the fallback Text each on their own indented lines inside
the TouchableOpacity, and ensure closing tags align with their openings for
clear, consistent JSX formatting.
apps/cli/templates/auth/better-auth/native/bare/components/sign-up.tsx.hbs
Show resolved
Hide resolved
apps/cli/templates/auth/better-auth/native/bare/components/sign-up.tsx.hbs
Show resolved
Hide resolved
apps/cli/templates/examples/todo/native/bare/app/(drawer)/todos.tsx.hbs
Outdated
Show resolved
Hide resolved
apps/cli/templates/frontend/native/bare/app/(drawer)/index.tsx.hbs
Outdated
Show resolved
Hide resolved
apps/cli/templates/frontend/native/bare/components/header-button.tsx.hbs
Outdated
Show resolved
Hide resolved
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 1
♻️ Duplicate comments (3)
apps/cli/templates/examples/ai/native/bare/app/(drawer)/ai.tsx.hbs (1)
20-29: This issue was already flagged in a previous review.The
generateAPIUrlfunction throws during render whenEXPO_PUBLIC_SERVER_URLis missing, causing a hard crash before any error UI can mount. As noted in the previous review, this should degrade gracefully with a friendly configuration message instead.apps/cli/templates/auth/better-auth/native/uniwind/components/sign-up.tsx.hbs (1)
18-58: Addasynckeyword to prevent broken error handling.The
signUpHandlerfunction callsauthClient.signUp.email()without theasynckeyword, so the promise isn't awaited and errors won't be caught properly. This is inconsistent with the correspondinghandleLogininsign-in.tsx.hbs(lines 29-58), which correctly usesasync.Apply this diff:
-function signUpHandler({ +async function signUpHandler({ name, email, password, setError, setIsLoading, setName, setEmail, setPassword, }) { setIsLoading(true); setError(null); - authClient.signUp.email( + await authClient.signUp.email( { name, email, password, },apps/cli/templates/examples/todo/native/bare/app/(drawer)/todos.tsx.hbs (1)
215-259: Fix invalid JSX style expressions (still outstanding).The template still emits
style={{ styles.loadingText, { … } }}and similar patterns, which compile to invalid JSX and break the generated app. Please wrap multi-part styles in arrays and use plain expressions for single-style bindings.- <Text style=\{{ styles.loadingText, { color: theme.text, opacity: 0.7 } }}> + <Text + style={[ + styles.loadingText, + \{{ color: theme.text, opacity: 0.7 }}, + ]} + > ... - <Text style=\{{ styles.emptyTitle, { color: theme.text } }}> + <Text + style={[ + styles.emptyTitle, + \{{ color: theme.text }}, + ]} + > ... - <Text style=\{{ styles.emptyText, { color: theme.text, opacity: 0.7 } }}> + <Text + style={[ + styles.emptyText, + \{{ color: theme.text, opacity: 0.7 }}, + ]} + > ... - <TouchableOpacity - onPress={() => handleDeleteTodo(todo._id)} - style=\{{ styles.deleteButton }} - > + <TouchableOpacity + onPress={() => handleDeleteTodo(todo._id)} + style={styles.deleteButton} + > ... - <Text style=\{{ styles.emptyTitle, { color: theme.text } }}> + <Text + style={[ + styles.emptyTitle, + \{{ color: theme.text }}, + ]} + > ... - <Text style=\{{ styles.emptyText, { color: theme.text, opacity: 0.7 } }}> + <Text + style={[ + styles.emptyText, + \{{ color: theme.text, opacity: 0.7 }}, + ]} + >Also applies to: 279-283
🧹 Nitpick comments (9)
.cursor/rules/better-t-stack-repo.mdc (1)
10-10: Improve clarity of the Handlebars escaping guideline.The new rule about escaping
{{in Handlebars templates is valuable context given the PR's template refactors. However, the guideline could be clearer about the purpose and edge cases. Consider rewording to explain why this escaping is necessary (e.g., to avoid unintended Handlebars expressions).Suggested improvement:
- - escape the '{{' in hbs templates like '\{{' + - Escape '{{' in Handlebars templates as '\{{' to prevent unintended variable interpolation.apps/cli/templates/auth/better-auth/native/unistyles/components/sign-up.tsx.hbs (1)
44-49: Consider consolidating duplicate refetch calls.Both API conditions execute the identical
queryClient.refetchQueries()call. Since the queryClient interface is the same for both ORPC and TRPC, you can simplify this to a single unconditional call.Apply this diff:
- {{#if (eq api "orpc")}} - queryClient.refetchQueries(); - {{/if}} - {{#if (eq api "trpc")}} queryClient.refetchQueries(); - {{/if}}apps/cli/templates/auth/better-auth/native/unistyles/components/sign-in.tsx.hbs (1)
41-46: Consider consolidating the duplicate refetch call.Both the
orpcandtrpcbranches execute identical logic. While the imports differ, the refetch call is duplicated.If your Handlebars environment supports an
orhelper, you can simplify this to:- {{#if (eq api "orpc")}} - queryClient.refetchQueries(); - {{/if}} - {{#if (eq api "trpc")}} queryClient.refetchQueries(); - {{/if}} + {{#if (or (eq api "orpc") (eq api "trpc"))}} + queryClient.refetchQueries(); + {{/if}}Alternatively, if an
orhelper isn't available, the current explicit approach is acceptable per the coding guidelines, though it does result in some duplication.apps/cli/templates/frontend/native/bare/app/(drawer)/(tabs)/index.tsx.hbs (1)
6-24: Consider adding accessibility props for better screen reader support.The Text components would benefit from accessibility labels to improve screen reader support. This is especially important for navigation elements in mobile apps.
Apply this diff to enhance accessibility:
- <Text style={[styles.title, { color: theme.text }]}> + <Text + style={[styles.title, { color: theme.text }]} + accessibilityRole="header" + > Tab One </Text> - <Text style={[styles.subtitle, { color: theme.text, opacity: 0.7 }]}> + <Text + style={[styles.subtitle, { color: theme.text, opacity: 0.7 }]} + accessibilityRole="text" + > Explore the first section of your app </Text>apps/cli/templates/examples/ai/native/bare/app/(drawer)/ai.tsx.hbs (1)
163-163: Simplify boolean prop syntax.The
={true}is redundant in JSX. The shorter formautoFocusis more idiomatic.- autoFocus={true} + autoFocusapps/cli/templates/auth/better-auth/native/unistyles/app/(drawer)/index.tsx.hbs (2)
8-15: Consider extracting the commonuseQueryimport.The
useQueryimport from@tanstack/react-queryis duplicated in both the orpc and trpc conditional blocks. You can reduce duplication by extracting it:+{{#unless (eq api "none")}} +import { useQuery } from "@tanstack/react-query"; +{{/unless}} {{#if (eq api "orpc")}} -import { useQuery } from "@tanstack/react-query"; import { queryClient, orpc } from "@/utils/orpc"; {{/if}} {{#if (eq api "trpc")}} -import { useQuery } from "@tanstack/react-query"; import { queryClient, trpc } from "@/utils/trpc"; {{/if}}
43-53: Consider consolidating the duplicateinvalidateQueriescall.The
queryClient.invalidateQueries()call is duplicated in both conditional blocks. Since both orpc and trpc use the same invalidation logic, you can simplify:<TouchableOpacity style={styles.signOutButton} onPress={() => { authClient.signOut(); - {{#if (eq api "orpc")}} - queryClient.invalidateQueries(); - {{/if}} - {{#if (eq api "trpc")}} + {{#unless (eq api "none")}} queryClient.invalidateQueries(); - {{/if}} + {{/unless}} }} >apps/cli/templates/auth/better-auth/native/uniwind/components/sign-in.tsx.hbs (1)
25-27: Consider removing unused theme colors.The
accentColoranddangerColorhooks are defined but never referenced in the component. The UI uses Tailwind classes (bg-accent,text-danger) instead of these programmatic colors. Consider removing these unused hooks to reduce unnecessary re-renders.Apply this diff:
const mutedColor = useThemeColor("muted"); - const accentColor = useThemeColor("accent"); const foregroundColor = useThemeColor("foreground"); - const dangerColor = useThemeColor("danger");apps/cli/templates/auth/better-auth/native/uniwind/components/sign-up.tsx.hbs (1)
68-70: Consider removing unused theme colors.
accentColoranddangerColorare defined but never used. The component relies on Tailwind classes (bg-accent,text-danger) instead. Removing these unused hooks can reduce unnecessary re-renders.Apply this diff:
const mutedColor = useThemeColor("muted"); - const accentColor = useThemeColor("accent"); const foregroundColor = useThemeColor("foreground"); - const dangerColor = useThemeColor("danger");
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (20)
.cursor/rules/better-t-stack-repo.mdc(1 hunks)apps/cli/templates/auth/better-auth/convex/native/bare/components/sign-in.tsx.hbs(1 hunks)apps/cli/templates/auth/better-auth/convex/native/bare/components/sign-up.tsx.hbs(1 hunks)apps/cli/templates/auth/better-auth/native/bare/app/(drawer)/index.tsx.hbs(1 hunks)apps/cli/templates/auth/better-auth/native/bare/components/sign-in.tsx.hbs(1 hunks)apps/cli/templates/auth/better-auth/native/bare/components/sign-up.tsx.hbs(1 hunks)apps/cli/templates/auth/better-auth/native/unistyles/app/(drawer)/index.tsx.hbs(3 hunks)apps/cli/templates/auth/better-auth/native/unistyles/components/sign-in.tsx.hbs(1 hunks)apps/cli/templates/auth/better-auth/native/unistyles/components/sign-up.tsx.hbs(1 hunks)apps/cli/templates/auth/better-auth/native/uniwind/app/(drawer)/index.tsx.hbs(1 hunks)apps/cli/templates/auth/better-auth/native/uniwind/components/sign-in.tsx.hbs(1 hunks)apps/cli/templates/auth/better-auth/native/uniwind/components/sign-up.tsx.hbs(1 hunks)apps/cli/templates/examples/ai/native/bare/app/(drawer)/ai.tsx.hbs(1 hunks)apps/cli/templates/examples/todo/native/bare/app/(drawer)/todos.tsx.hbs(1 hunks)apps/cli/templates/frontend/native/bare/app/(drawer)/(tabs)/index.tsx.hbs(1 hunks)apps/cli/templates/frontend/native/bare/app/(drawer)/(tabs)/two.tsx.hbs(1 hunks)apps/cli/templates/frontend/native/bare/app/(drawer)/index.tsx.hbs(1 hunks)apps/cli/templates/frontend/native/bare/app/+not-found.tsx.hbs(1 hunks)apps/cli/templates/frontend/native/bare/app/modal.tsx.hbs(1 hunks)apps/cli/templates/frontend/native/bare/components/header-button.tsx.hbs(1 hunks)
🚧 Files skipped from review as they are similar to previous changes (7)
- apps/cli/templates/frontend/native/bare/components/header-button.tsx.hbs
- apps/cli/templates/frontend/native/bare/app/+not-found.tsx.hbs
- apps/cli/templates/auth/better-auth/convex/native/bare/components/sign-in.tsx.hbs
- apps/cli/templates/frontend/native/bare/app/(drawer)/(tabs)/two.tsx.hbs
- apps/cli/templates/auth/better-auth/native/bare/components/sign-up.tsx.hbs
- apps/cli/templates/frontend/native/bare/app/modal.tsx.hbs
- apps/cli/templates/auth/better-auth/native/bare/components/sign-in.tsx.hbs
🧰 Additional context used
📓 Path-based instructions (1)
**/*.{hbs,handlebars}
📄 CodeRabbit inference engine (.cursor/rules/better-t-stack-repo.mdc)
In Handlebars templates, avoid generic if/else blocks; write explicit conditions (e.g., if (eq orm "prisma") and else if (eq orm "drizzle")).
Files:
apps/cli/templates/auth/better-auth/native/uniwind/components/sign-up.tsx.hbsapps/cli/templates/frontend/native/bare/app/(drawer)/index.tsx.hbsapps/cli/templates/auth/better-auth/convex/native/bare/components/sign-up.tsx.hbsapps/cli/templates/auth/better-auth/native/uniwind/app/(drawer)/index.tsx.hbsapps/cli/templates/examples/todo/native/bare/app/(drawer)/todos.tsx.hbsapps/cli/templates/auth/better-auth/native/unistyles/components/sign-up.tsx.hbsapps/cli/templates/frontend/native/bare/app/(drawer)/(tabs)/index.tsx.hbsapps/cli/templates/auth/better-auth/native/bare/app/(drawer)/index.tsx.hbsapps/cli/templates/auth/better-auth/native/unistyles/components/sign-in.tsx.hbsapps/cli/templates/auth/better-auth/native/uniwind/components/sign-in.tsx.hbsapps/cli/templates/examples/ai/native/bare/app/(drawer)/ai.tsx.hbsapps/cli/templates/auth/better-auth/native/unistyles/app/(drawer)/index.tsx.hbs
🧠 Learnings (9)
📚 Learning: 2025-09-11T04:31:24.508Z
Learnt from: CR
Repo: AmanVarshney01/create-better-t-stack PR: 0
File: .cursor/rules/better-t-stack-repo.mdc:0-0
Timestamp: 2025-09-11T04:31:24.508Z
Learning: Applies to **/*.{hbs,handlebars} : In Handlebars templates, avoid generic if/else blocks; write explicit conditions (e.g., if (eq orm "prisma") and else if (eq orm "drizzle")).
Applied to files:
apps/cli/templates/auth/better-auth/native/uniwind/components/sign-up.tsx.hbsapps/cli/templates/frontend/native/bare/app/(drawer)/index.tsx.hbsapps/cli/templates/auth/better-auth/native/uniwind/app/(drawer)/index.tsx.hbs.cursor/rules/better-t-stack-repo.mdc
📚 Learning: 2025-08-24T18:00:39.152Z
Learnt from: CR
Repo: AmanVarshney01/create-better-t-stack PR: 0
File: .cursor/rules/convex_rules.mdc:0-0
Timestamp: 2025-08-24T18:00:39.152Z
Learning: Applies to convex/**/*.ts : Use query/mutation/action for public API; use internalQuery/internalMutation/internalAction for private functions; do not register via api/internal objects
Applied to files:
apps/cli/templates/auth/better-auth/native/uniwind/app/(drawer)/index.tsx.hbsapps/cli/templates/auth/better-auth/native/unistyles/app/(drawer)/index.tsx.hbs
📚 Learning: 2025-08-24T18:00:39.152Z
Learnt from: CR
Repo: AmanVarshney01/create-better-t-stack PR: 0
File: .cursor/rules/convex_rules.mdc:0-0
Timestamp: 2025-08-24T18:00:39.152Z
Learning: Applies to convex/**/*.ts : Minimize action calls to queries/mutations to avoid transactional race conditions
Applied to files:
apps/cli/templates/auth/better-auth/native/uniwind/app/(drawer)/index.tsx.hbsapps/cli/templates/auth/better-auth/native/uniwind/components/sign-in.tsx.hbs
📚 Learning: 2025-09-11T04:31:24.508Z
Learnt from: CR
Repo: AmanVarshney01/create-better-t-stack PR: 0
File: .cursor/rules/better-t-stack-repo.mdc:0-0
Timestamp: 2025-09-11T04:31:24.508Z
Learning: Applies to **/*.{ts,tsx} : Do not use explicit return types in TypeScript.
Applied to files:
.cursor/rules/better-t-stack-repo.mdc
📚 Learning: 2025-09-11T04:31:24.508Z
Learnt from: CR
Repo: AmanVarshney01/create-better-t-stack PR: 0
File: .cursor/rules/better-t-stack-repo.mdc:0-0
Timestamp: 2025-09-11T04:31:24.508Z
Learning: Applies to **/*.{js,jsx,ts,tsx} : Define functions using the standard function declaration syntax, not arrow functions.
Applied to files:
.cursor/rules/better-t-stack-repo.mdc
📚 Learning: 2025-08-24T18:00:39.152Z
Learnt from: CR
Repo: AmanVarshney01/create-better-t-stack PR: 0
File: .cursor/rules/convex_rules.mdc:0-0
Timestamp: 2025-08-24T18:00:39.152Z
Learning: Applies to convex/**/*.ts : Always use the new Convex function syntax (query/mutation/action/internal*) with args/returns/handler
Applied to files:
.cursor/rules/better-t-stack-repo.mdc
📚 Learning: 2025-09-11T04:31:24.508Z
Learnt from: CR
Repo: AmanVarshney01/create-better-t-stack PR: 0
File: .cursor/rules/better-t-stack-repo.mdc:0-0
Timestamp: 2025-09-11T04:31:24.508Z
Learning: Always use functional programming; avoid object-oriented programming.
Applied to files:
.cursor/rules/better-t-stack-repo.mdc
📚 Learning: 2025-09-11T04:31:24.508Z
Learnt from: CR
Repo: AmanVarshney01/create-better-t-stack PR: 0
File: .cursor/rules/better-t-stack-repo.mdc:0-0
Timestamp: 2025-09-11T04:31:24.508Z
Learning: Applies to **/*.{ts,tsx} : Use TypeScript type aliases instead of interface declarations.
Applied to files:
.cursor/rules/better-t-stack-repo.mdc
📚 Learning: 2025-08-24T18:00:39.152Z
Learnt from: CR
Repo: AmanVarshney01/create-better-t-stack PR: 0
File: .cursor/rules/convex_rules.mdc:0-0
Timestamp: 2025-08-24T18:00:39.152Z
Learning: Applies to **/*.{ts,tsx} : Use 'as const' for string literals in discriminated unions
Applied to files:
.cursor/rules/better-t-stack-repo.mdc
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
- GitHub Check: Cursor Bugbot
🔇 Additional comments (10)
.cursor/rules/better-t-stack-repo.mdc (1)
9-10: Clarify inconsistency: summary claims line 9 was removed, but it appears in the current code.The AI summary states the guideline "Do not use explicit return types" was removed, yet line 9 still contains this rule. Please verify whether this line was modified, moved, or if the summary is inaccurate.
apps/cli/templates/frontend/native/bare/app/(drawer)/(tabs)/index.tsx.hbs (2)
1-4: LGTM!Imports are clean and well-organized with appropriate use of absolute path aliases.
26-42: LGTM!StyleSheet definitions are well-structured and follow React Native best practices with appropriate spacing and typography.
apps/cli/templates/auth/better-auth/native/unistyles/app/(drawer)/index.tsx.hbs (1)
59-90: Conditional rendering logic is correct.The
{{#unless (eq api "none")}}wrapper ensures the API Status section is only rendered when api queries are defined (orpc or trpc), preventing undefined variable references. This change properly aligns the UI rendering with data availability.apps/cli/templates/auth/better-auth/native/uniwind/components/sign-in.tsx.hbs (1)
46-51: LGTM! QueryClient guards are now correct.The
queryClient.refetchQueries()calls are properly wrapped in conditional blocks that match the import guards. This resolves the previous concern about runtime crashes whenapi = "none".apps/cli/templates/auth/better-auth/convex/native/bare/components/sign-up.tsx.hbs (1)
23-48: LGTM! Auth flow is correctly implemented.The
handleSignUpfunction properly usesasync/awaitto handle the authentication promise, and the lifecycle callbacks (onError,onSuccess,onFinished) correctly manage state transitions. The Convex-only setup appropriately omits query client refetch calls.apps/cli/templates/auth/better-auth/native/uniwind/components/sign-up.tsx.hbs (1)
46-51: LGTM! QueryClient guards are correct.The
queryClient.refetchQueries()calls are now properly wrapped in conditional blocks matching the import guards, resolving the previous concern about crashes whenapi = "none".apps/cli/templates/frontend/native/bare/app/(drawer)/index.tsx.hbs (1)
30-163: LGTM! Template conditionals and style expressions are correct.The Handlebars conditionals properly follow the guideline to use explicit conditions (e.g.,
{{#if (eq api "orpc")}}and{{else if (eq api "trpc")}}). Style expressions correctly use either array syntax for combining styles or escaped braces for single objects. The guards around API-dependent code prevent undefined variable references whenapi = "none".Based on coding guidelines
apps/cli/templates/auth/better-auth/native/uniwind/app/(drawer)/index.tsx.hbs (1)
17-123: LGTM! API guards prevent undefined variable references.The template correctly guards all API-dependent code:
- Lines 18-29:
healthCheckandprivateDataqueries only defined whenapiis"trpc"or"orpc"- Lines 68-113: UI consuming these variables guarded by
{{#unless (eq api "none")}}- Lines 55-60:
queryClient.invalidateQueries()calls properly wrapped in conditional blocksThis prevents
ReferenceErrors whenapi = "none"and resolves the previous concern.apps/cli/templates/auth/better-auth/native/bare/app/(drawer)/index.tsx.hbs (1)
17-111: LGTM! Proper guards for API-dependent code.The template correctly handles optional API integration:
- Lines 20-31: Query definitions conditional on
apitype- Lines 67-99: UI using query results guarded by
{{#unless (eq api "none")}}- Lines 54-59:
queryClient.invalidateQueries()calls wrapped in matching conditionalsAll variable references are safe regardless of API configuration.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 0
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
apps/cli/src/helpers/core/auth-setup.ts (1)
102-130: Eliminate duplicate variable declarations.The native variant checks (
hasNativeBare,hasNativeUniwind,hasUnistyles) are declared twice—once at lines 102-104 and again at lines 124-126—with identical logic. This creates unnecessary duplication and maintenance burden.Refactor by defining these variables once at the beginning of the Convex backend block:
try { if (backend === "convex") { + const hasNativeBare = frontend.includes("native-bare"); + const hasNativeUniwind = frontend.includes("native-uniwind"); + const hasUnistyles = frontend.includes("native-unistyles"); + if (auth === "clerk" && clientDirExists) { const hasNextJs = frontend.includes("next");Then remove the duplicate declarations at lines 102-104 and 124-126.
🧹 Nitpick comments (2)
apps/cli/src/helpers/core/auth-setup.ts (2)
54-57: Consider extracting native variant checks to helper variables for consistency.While the inline checks are functionally correct, lines 102-104 and 124-126 use explicit helper variables (
hasNativeBare,hasNativeUniwind,hasUnistyles) for the same checks. Consider refactoring this section to match that pattern for consistency.+ const hasNativeBare = frontend.includes("native-bare"); + const hasNativeUniwind = frontend.includes("native-uniwind"); + const hasUnistyles = frontend.includes("native-unistyles"); const hasNativeForBA = - frontend.includes("native-bare") || - frontend.includes("native-uniwind") || - frontend.includes("native-unistyles"); + hasNativeBare || hasNativeUniwind || hasUnistyles;
171-174: Consider using helper variables for consistency.Similar to the comment on lines 54-57, consider extracting the native variant checks to helper variables for consistency with the pattern used elsewhere in the file.
+ const hasNativeBare = frontend.includes("native-bare"); + const hasNativeUniwind = frontend.includes("native-uniwind"); + const hasUnistyles = frontend.includes("native-unistyles"); + if ( - (frontend.includes("native-bare") || - frontend.includes("native-uniwind") || - frontend.includes("native-unistyles")) && + (hasNativeBare || hasNativeUniwind || hasUnistyles) && nativeDirExists ) {
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (5)
apps/cli/src/helpers/core/auth-setup.ts(4 hunks)apps/cli/src/utils/compatibility-rules.ts(3 hunks)apps/cli/test/api.test.ts(3 hunks)apps/web/src/app/(home)/new/_components/utils.ts(6 hunks)apps/web/src/lib/constant.ts(4 hunks)
🚧 Files skipped from review as they are similar to previous changes (2)
- apps/cli/test/api.test.ts
- apps/cli/src/utils/compatibility-rules.ts
🧰 Additional context used
📓 Path-based instructions (3)
**/*.{ts,tsx}
📄 CodeRabbit inference engine (.cursor/rules/convex_rules.mdc)
**/*.{ts,tsx}: Use Id from './_generated/dataModel' to type document ids (e.g., Id<'users'>)
Ensure Record key/value types align with validators (e.g., v.record(v.id('users'), v.string()) => Record<Id<'users'>, string>)
Be strict with types for document ids; prefer Id<'table'> over string
Use 'as const' for string literals in discriminated unions
When using Array and Record types, declare with explicit generic types (e.g., const arr: Array = ...)
**/*.{ts,tsx}: Use TypeScript type aliases instead of interface declarations.
Do not use explicit return types in TypeScript.
Files:
apps/web/src/app/(home)/new/_components/utils.tsapps/web/src/lib/constant.tsapps/cli/src/helpers/core/auth-setup.ts
**/*.{js,jsx,ts,tsx,mjs,cjs}
📄 CodeRabbit inference engine (.cursor/rules/use-bun-instead-of-node-vite-npm-pnpm.mdc)
**/*.{js,jsx,ts,tsx,mjs,cjs}: Do not use dotenv; Bun auto-loads .env
UseBun.serve()for HTTP/WebSockets; do not useexpress
Usebun:sqlitefor SQLite; do not usebetter-sqlite3
UseBun.redisfor Redis; do not useioredis
UseBun.sqlfor Postgres; do not usepgorpostgres.js
Use built-inWebSocket; do not usews
PreferBun.fileovernode:fsreadFile/writeFile
UseBun.$instead ofexecafor shelling out
Files:
apps/web/src/app/(home)/new/_components/utils.tsapps/web/src/lib/constant.tsapps/cli/src/helpers/core/auth-setup.ts
**/*.{js,jsx,ts,tsx}
📄 CodeRabbit inference engine (.cursor/rules/better-t-stack-repo.mdc)
Define functions using the standard function declaration syntax, not arrow functions.
Files:
apps/web/src/app/(home)/new/_components/utils.tsapps/web/src/lib/constant.tsapps/cli/src/helpers/core/auth-setup.ts
🧠 Learnings (2)
📚 Learning: 2025-08-24T18:01:11.544Z
Learnt from: CR
Repo: AmanVarshney01/create-better-t-stack PR: 0
File: .cursor/rules/use-bun-instead-of-node-vite-npm-pnpm.mdc:0-0
Timestamp: 2025-08-24T18:01:11.544Z
Learning: Applies to **/*.{js,jsx,ts,tsx,mjs,cjs} : Use `bun:sqlite` for SQLite; do not use `better-sqlite3`
Applied to files:
apps/web/src/lib/constant.ts
📚 Learning: 2025-08-24T18:01:11.544Z
Learnt from: CR
Repo: AmanVarshney01/create-better-t-stack PR: 0
File: .cursor/rules/use-bun-instead-of-node-vite-npm-pnpm.mdc:0-0
Timestamp: 2025-08-24T18:01:11.544Z
Learning: Applies to {**/package.json,**/webpack.config.@(js|ts|mjs|cjs),**/esbuild.config.@(js|ts|mjs|cjs)} : Use `bun build <file>` instead of `webpack` or `esbuild`
Applied to files:
apps/web/src/lib/constant.ts
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
- GitHub Check: Cursor Bugbot
🔇 Additional comments (9)
apps/cli/src/helpers/core/auth-setup.ts (1)
54-189: Migration to new native tokens completed successfully.The migration from
native-nativewindto the new native variants (native-bare,native-uniwind,native-unistyles) is complete and correct across all authentication flows. The logic properly:
- Detects all three new native variants in both Convex and non-Convex backend paths
- Adds appropriate dependencies for BetterAuth (
@better-auth/expo) and Clerk (@clerk/clerk-expo) when native frontends are present- Maintains backward compatibility with
native-unistyleswhich was already supportedThe suggested refactors above are for code quality and maintainability, but the core logic is sound.
apps/web/src/app/(home)/new/_components/utils.ts (5)
107-109: LGTM!The native frontend compatibility check for Clerk auth with Convex backend has been correctly updated to recognize the new native frontend options.
115-117: LGTM!Better-Auth compatibility check correctly updated to include all three native frontend variants.
884-886: LGTM!Auth compatibility checks and user-facing messages correctly updated to recognize and communicate the new native frontend options. The message clearly indicates the supported variants.
Also applies to: 908-934
1261-1267: LGTM!The disabled reason check for Better-Auth with Convex correctly recognizes the new native frontend options and provides a clear user-facing message.
1347-1375: LGTM!The final compatibility checks in
getDisabledReasonare correctly updated with the new native frontend options and provide clear, user-friendly error messages.apps/web/src/lib/constant.ts (3)
108-144: LGTM!The native frontend options have been properly restructured to offer three distinct styling approaches:
- Bare (default): StyleSheet with no additional styling library
- Uniwind: Tailwind CSS for React Native
- Unistyles: Type-safe styling
The descriptions are clear and help users understand the differences between the options. The default flag is appropriately set for the bare option.
733-758: LGTM!The "Mobile App" preset template correctly uses the new
native-bareoption as the default native frontend choice, which aligns with the architectural changes.
785-811: LGTM!The "Full Featured" preset template is consistently updated to use
native-bare, maintaining alignment with the other preset templates.
| <Ionicons name="add-outline" size={24} color={themeColorForeground} /> | ||
| </Pressable> | ||
| </Link> | ||
| ), |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Bug: Theme Toggle Vanishes on Tabs
The headerRight override for the tabs screen replaces the global renderThemeToggle from screenOptions, causing the theme toggle button to disappear on this screen while remaining visible on other screens. The tabs screen should render both the theme toggle and the modal button together, not just the modal button alone.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 0
🧹 Nitpick comments (1)
apps/web/src/app/(home)/analytics/_components/stack-configuration-charts.tsx (1)
154-164: Color mappings updated correctly; consider refactoring for readability.The color assignments for the new native frontend options (native-bare, native-uniwind) are consistent with the configuration in types.ts. However, the deeply nested ternary operators make this code harder to maintain.
Consider refactoring to a more maintainable approach:
<Bar dataKey="value" radius={4}> {frontendData.map((entry) => ( <Cell key={`frontend-${entry.name}`} - fill={ - entry.name === "react-router" - ? "hsl(var(--chart-1))" - : entry.name === "tanstack-router" - ? "hsl(var(--chart-2))" - : entry.name === "tanstack-start" - ? "hsl(var(--chart-3))" - : entry.name === "next" - ? "hsl(var(--chart-4))" - : entry.name === "nuxt" - ? "hsl(var(--chart-5))" - : entry.name === "native-bare" - ? "hsl(var(--chart-6))" - : entry.name === "native-uniwind" - ? "hsl(var(--chart-7))" - : entry.name === "native-unistyles" - ? "hsl(var(--chart-1))" - : entry.name === "svelte" - ? "hsl(var(--chart-3))" - : entry.name === "solid" - ? "hsl(var(--chart-4))" - : "hsl(var(--chart-7))" - } + fill={frontendConfig[entry.name as keyof typeof frontendConfig]?.color ?? "hsl(var(--chart-7))"} /> ))} </Bar>This leverages the existing
frontendConfigfrom types.ts and eliminates the nested ternary.
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (5)
apps/cli/src/constants.ts(1 hunks)apps/cli/templates/examples/todo/native/bare/app/(drawer)/todos.tsx.hbs(1 hunks)apps/cli/templates/frontend/native/bare/components/header-button.tsx.hbs(1 hunks)apps/web/src/app/(home)/analytics/_components/stack-configuration-charts.tsx(1 hunks)apps/web/src/app/(home)/analytics/_components/types.ts(1 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
- apps/cli/templates/frontend/native/bare/components/header-button.tsx.hbs
🧰 Additional context used
📓 Path-based instructions (4)
**/*.{ts,tsx}
📄 CodeRabbit inference engine (.cursor/rules/convex_rules.mdc)
**/*.{ts,tsx}: Use Id from './_generated/dataModel' to type document ids (e.g., Id<'users'>)
Ensure Record key/value types align with validators (e.g., v.record(v.id('users'), v.string()) => Record<Id<'users'>, string>)
Be strict with types for document ids; prefer Id<'table'> over string
Use 'as const' for string literals in discriminated unions
When using Array and Record types, declare with explicit generic types (e.g., const arr: Array = ...)
**/*.{ts,tsx}: Use TypeScript type aliases instead of interface declarations.
Do not use explicit return types in TypeScript.
Files:
apps/web/src/app/(home)/analytics/_components/types.tsapps/cli/src/constants.tsapps/web/src/app/(home)/analytics/_components/stack-configuration-charts.tsx
**/*.{js,jsx,ts,tsx,mjs,cjs}
📄 CodeRabbit inference engine (.cursor/rules/use-bun-instead-of-node-vite-npm-pnpm.mdc)
**/*.{js,jsx,ts,tsx,mjs,cjs}: Do not use dotenv; Bun auto-loads .env
UseBun.serve()for HTTP/WebSockets; do not useexpress
Usebun:sqlitefor SQLite; do not usebetter-sqlite3
UseBun.redisfor Redis; do not useioredis
UseBun.sqlfor Postgres; do not usepgorpostgres.js
Use built-inWebSocket; do not usews
PreferBun.fileovernode:fsreadFile/writeFile
UseBun.$instead ofexecafor shelling out
Files:
apps/web/src/app/(home)/analytics/_components/types.tsapps/cli/src/constants.tsapps/web/src/app/(home)/analytics/_components/stack-configuration-charts.tsx
**/*.{js,jsx,ts,tsx}
📄 CodeRabbit inference engine (.cursor/rules/better-t-stack-repo.mdc)
Define functions using the standard function declaration syntax, not arrow functions.
Files:
apps/web/src/app/(home)/analytics/_components/types.tsapps/cli/src/constants.tsapps/web/src/app/(home)/analytics/_components/stack-configuration-charts.tsx
**/*.{hbs,handlebars}
📄 CodeRabbit inference engine (.cursor/rules/better-t-stack-repo.mdc)
In Handlebars templates, avoid generic if/else blocks; write explicit conditions (e.g., if (eq orm "prisma") and else if (eq orm "drizzle")).
Files:
apps/cli/templates/examples/todo/native/bare/app/(drawer)/todos.tsx.hbs
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
- GitHub Check: Cursor Bugbot
🔇 Additional comments (9)
apps/cli/templates/examples/todo/native/bare/app/(drawer)/todos.tsx.hbs (7)
1-30: LGTM! Conditional imports follow explicit Handlebars patterns.The import structure correctly branches on backend and API choices, using explicit
eqchecks as required by the coding guidelines.
37-67: LGTM! Convex integration is correct.The async/await pattern for mutations and direct array access align with Convex's reactive query model.
69-143: LGTM! Non-Convex paths correctly use TanStack Query patterns.The mutation callbacks with
onSuccessrefetch logic and.dataaccess are appropriate for ORPC/TRPC with TanStack Query.
146-235: LGTM! Input UI correctly adapts to backend differences.The conditional
editableprop and loading indicators appropriately reflect each backend's mutation state exposure.
237-324: LGTM! Convex rendering paths correctly handle loading, empty, and list states.The data access patterns (direct array,
_idfield) and conditional rendering align with Convex's reactive model.
326-412: LGTM! Non-Convex rendering correctly accessestodos?.dataand uses numeric IDs.The conditional rendering and data access patterns are appropriate for TanStack Query's result structure.
419-521: LGTM! StyleSheet definitions follow React Native conventions.The styles are well-organized and use appropriate layout properties for the Todo list UI.
apps/web/src/app/(home)/analytics/_components/types.ts (1)
243-254: LGTM! Frontend config updated correctly.The frontend configuration has been properly updated to replace
native-nativewindwith the newnative-bareandnative-uniwindoptions. The color assignments are consistent with the chart rendering logic instack-configuration-charts.tsx, and the labels clearly distinguish between the different Expo variants.apps/cli/src/constants.ts (1)
158-158: No issues found with alchemy version update.The version bump from ^0.75.1 to ^0.77.0 includes only bug fixes and additive features (container bindings support and improved secret encryption) with no breaking changes. The codebase's usage of alchemy—through module imports, CLI commands, and framework integration—is compatible with v0.77.0, and no configuration updates are necessary.
Note
Introduce new native frontends (Expo Bare, UniWind), remove NativeWind, and update CLI, templates, compatibility, analytics, and tests accordingly.
native-bareandnative-uniwindfrontend options; removenative-nativewindacross flags, prompts, schemas, compatibility rules, and env/setup logic.alchemy), catalogs to includeapps/native, and bun config conditions.native-bare,native-uniwind, and replace NativeWind.{{in Handlebars templates.Written by Cursor Bugbot for commit 22f93ed. This will update automatically on new commits. Configure here.
Summary by CodeRabbit
New Features
Templates Updated
Deprecated