chore: adopt stable React Compiler lint rules - #4737
Conversation
|
WalkthroughUpdated Oxlint to version 🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✨ Finishing Touches 💡 1📝 Generate docstrings 💡
🧪 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.
Actionable comments posted: 3
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (2)
apps/webapp/app/routes/admin.feature-flags.tsx (1)
185-197: 📐 Maintainability & Code Quality | 🟠 Major | ⚡ Quick winAdd one suppression per state setter in each affected effect.
Add directives for
setInitialValues,setConfirmOpen, and both error-branchsetSaveErrorcalls;setShuffledGoals;setSampleRateand error-branchsetError; andsetShuffledRoles.Source: MCP tools
apps/webapp/app/components/dashboard-agent/DashboardAgentPanel.tsx (1)
171-172: 📐 Maintainability & Code Quality | 🟠 Major | ⚡ Quick winRestore targeted
react/set-state-in-effectsuppressions for intentional effect updates.This rule is enabled for
apps/webapp/app/**/*.tsxand flags synchronous setters in effect bodies. Restore suppressions forsetThinkingChatId,setLoading,setChats, andsetSendRequest, or move these updates to event-driven paths.Source: MCP tools
ℹ️ Review info
⚙️ Run configuration
Configuration used: Repository UI
Review profile: CHILL
Plan: Pro Plus
Run ID: 229a8a0b-a478-4469-94cb-529e0fb8cdf8
⛔ Files ignored due to path filters (1)
pnpm-lock.yamlis excluded by!**/pnpm-lock.yaml
📒 Files selected for processing (107)
.oxlintrc.jsonapps/webapp/app/components/AskAI.tsxapps/webapp/app/components/DevPresence.tsxapps/webapp/app/components/Feedback.tsxapps/webapp/app/components/LoginPageLayout.tsxapps/webapp/app/components/TriggerRotatingLogo.tsxapps/webapp/app/components/admin/FeatureFlagsDialog.tsxapps/webapp/app/components/admin/backOffice/MaxProjectsSection.tsxapps/webapp/app/components/admin/backOffice/RateLimitSection.tsxapps/webapp/app/components/billing/BillingAlertsSection.tsxapps/webapp/app/components/billing/BillingLimitConfigSection.tsxapps/webapp/app/components/billing/BillingLimitRecoveryPanel.tsxapps/webapp/app/components/code/AIQueryInput.tsxapps/webapp/app/components/code/JSONEditor.tsxapps/webapp/app/components/code/TSQLEditor.tsxapps/webapp/app/components/code/TSQLResultsTable.tsxapps/webapp/app/components/code/TextEditor.tsxapps/webapp/app/components/dashboard-agent/AgentChart.tsxapps/webapp/app/components/dashboard-agent/DashboardAgentChat.tsxapps/webapp/app/components/dashboard-agent/DashboardAgentMessages.tsxapps/webapp/app/components/dashboard-agent/DashboardAgentPanel.tsxapps/webapp/app/components/integrations/VercelOnboardingModal.tsxapps/webapp/app/components/logs/LogDetailView.tsxapps/webapp/app/components/logs/LogsTable.tsxapps/webapp/app/components/metrics/SaveToDashboardDialog.tsxapps/webapp/app/components/navigation/DashboardDialogs.tsxapps/webapp/app/components/navigation/EnvironmentSelector.tsxapps/webapp/app/components/navigation/FavoritesSection.tsxapps/webapp/app/components/navigation/SideMenu.tsxapps/webapp/app/components/navigation/SideMenuHeader.tsxapps/webapp/app/components/navigation/useReorderableList.tsapps/webapp/app/components/primitives/AgentDotMatrix.tsxapps/webapp/app/components/primitives/AnimatedCallout.tsxapps/webapp/app/components/primitives/Buttons.tsxapps/webapp/app/components/primitives/Checkbox.tsxapps/webapp/app/components/primitives/ClipboardField.tsxapps/webapp/app/components/primitives/DateField.tsxapps/webapp/app/components/primitives/DateTime.tsxapps/webapp/app/components/primitives/DurationPicker.tsxapps/webapp/app/components/primitives/InputNumberStepper.tsxapps/webapp/app/components/primitives/MiddleTruncate.tsxapps/webapp/app/components/primitives/Resizable.tsxapps/webapp/app/components/primitives/SearchInput.tsxapps/webapp/app/components/primitives/TooltipPortal.tsxapps/webapp/app/components/primitives/TreeView/TreeView.tsxapps/webapp/app/components/primitives/charts/hooks/useZoomSelection.tsapps/webapp/app/components/query/QueryEditor.tsxapps/webapp/app/components/queues/QueueControls.tsxapps/webapp/app/components/runs/v3/AIFilterInput.tsxapps/webapp/app/components/runs/v3/RunStatusCellTooltip.tsxapps/webapp/app/components/runs/v3/SharedFilters.tsxapps/webapp/app/components/runs/v3/agent/AgentView.tsxapps/webapp/app/components/runs/v3/ai/AIChatMessages.tsxapps/webapp/app/components/scheduled/timezones.tsxapps/webapp/app/components/schedules/PurchaseSchedulesModal.tsxapps/webapp/app/components/webhookConsole/SampleSourcePicker.tsxapps/webapp/app/components/webhookDeliveries/v1/useDeliveriesLiveReload.tsapps/webapp/app/hooks/useAutoRevalidate.tsapps/webapp/app/hooks/useChanged.tsapps/webapp/app/hooks/useDashboardEditor.tsapps/webapp/app/hooks/useDebounce.tsapps/webapp/app/hooks/useElementVisibility.tsapps/webapp/app/hooks/useEventSource.tsxapps/webapp/app/hooks/useMetricResourceQuery.tsapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam._index/route.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.apikeys/route.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.branches/route.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.concurrency/route.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.dashboards.$dashboardKey/route.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.dashboards.custom.$dashboardId/route.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.deployments.$deploymentParam/route.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.environment-variables/route.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.logs/route.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.playground.$agentParam/route.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.prompts.$promptSlug/route.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.queues/route.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.queues_.$queueParam/route.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.runs.$runParam/route.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.runs._index/useRunsLiveReload.tsapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.sessions.$sessionParam/route.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.settings.integrations/route.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.tasks.scheduled.$taskParam/route.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.test.tasks.$taskParam/route.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.webhooks.endpoints.$endpointParam/route.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.settings.sso/route.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.settings.team/route.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug_.projects.new/route.tsxapps/webapp/app/routes/account._index/route.tsxapps/webapp/app/routes/admin.feature-flags.tsxapps/webapp/app/routes/admin.queue-metrics.tsxapps/webapp/app/routes/confirm-basic-details.tsxapps/webapp/app/routes/login.mfa/route.tsxapps/webapp/app/routes/resources.account.mfa.setup/useMfaSetup.tsapps/webapp/app/routes/resources.branches.create.tsxapps/webapp/app/routes/resources.metric.tsxapps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.github.tsxapps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.runs.$runParam.streams.$streamKey/route.tsxapps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.vercel.tsxapps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.waitpoints.$waitpointFriendlyId.complete/route.tsxapps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.schedules.new.natural-language.tsxapps/webapp/app/routes/resources.orgs.$organizationSlug.select-plan.tsxapps/webapp/app/routes/vercel.onboarding.tsxinternal-packages/observability-map/src/suppression.tspackage.jsonpackages/cli-v3/e2e/e2e.test.tspackages/core/src/v3/utils/globals.tspackages/trigger-sdk/src/v3/envvars.ts
💤 Files with no reviewable changes (2)
- apps/webapp/app/components/logs/LogDetailView.tsx
- apps/webapp/app/components/primitives/InputNumberStepper.tsx
Included review availability: Your plan provides up to 10 included reviews per hour; 8 remain after this review.
📜 Review details
⏰ Context from checks skipped due to timeout. (7)
- GitHub Check: packages / 📊 Merge Reports
- GitHub Check: webapp / 🧪 Unit Tests: Webapp (13, 24)
- GitHub Check: webapp / 🧪 Unit Tests: Webapp (11, 24)
- GitHub Check: webapp / 🧪 Unit Tests: Webapp (21, 24)
- GitHub Check: webapp / 🧪 Unit Tests: Webapp (15, 24)
- GitHub Check: internal / 🧪 Unit Tests: Internal
- GitHub Check: e2e / 🧪 CLI v3 tests (warp-windows-latest-x64-8x - npm)
🧰 Additional context used
📓 Path-based instructions (15)
**/*.{ts,tsx}
📄 CodeRabbit inference engine (.github/copilot-instructions.md)
**/*.{ts,tsx}: Use types over interfaces for TypeScript
Avoid using enums; prefer string unions or const objects instead
**/*.{ts,tsx}: Prefer static imports over dynamic imports. Only use dynamicimport()when:
- Circular dependencies cannot be resolved otherwise
- Code splitting is genuinely needed for performance
- The module must be loaded conditionally at runtime
Files:
apps/webapp/app/components/LoginPageLayout.tsxapps/webapp/app/components/TriggerRotatingLogo.tsxapps/webapp/app/components/AskAI.tsxapps/webapp/app/components/Feedback.tsxapps/webapp/app/components/billing/BillingLimitConfigSection.tsxapps/webapp/app/components/billing/BillingAlertsSection.tsxapps/webapp/app/components/billing/BillingLimitRecoveryPanel.tsxapps/webapp/app/components/dashboard-agent/DashboardAgentMessages.tsxapps/webapp/app/components/logs/LogsTable.tsxapps/webapp/app/components/code/JSONEditor.tsxapps/webapp/app/components/admin/FeatureFlagsDialog.tsxapps/webapp/app/components/primitives/AnimatedCallout.tsxapps/webapp/app/components/primitives/MiddleTruncate.tsxapps/webapp/app/components/code/TextEditor.tsxapps/webapp/app/components/navigation/SideMenuHeader.tsxapps/webapp/app/components/navigation/FavoritesSection.tsxapps/webapp/app/components/primitives/AgentDotMatrix.tsxapps/webapp/app/components/primitives/ClipboardField.tsxapps/webapp/app/components/metrics/SaveToDashboardDialog.tsxapps/webapp/app/components/code/TSQLEditor.tsxapps/webapp/app/components/queues/QueueControls.tsxapps/webapp/app/hooks/useChanged.tsapps/webapp/app/components/webhookConsole/SampleSourcePicker.tsxapps/webapp/app/components/navigation/useReorderableList.tsapps/webapp/app/hooks/useEventSource.tsxapps/webapp/app/components/primitives/Resizable.tsxapps/webapp/app/components/admin/backOffice/RateLimitSection.tsxapps/webapp/app/components/DevPresence.tsxapps/webapp/app/components/runs/v3/AIFilterInput.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.apikeys/route.tsxapps/webapp/app/components/primitives/DurationPicker.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam._index/route.tsxapps/webapp/app/components/schedules/PurchaseSchedulesModal.tsxapps/webapp/app/hooks/useAutoRevalidate.tsapps/webapp/app/hooks/useDashboardEditor.tsapps/webapp/app/components/admin/backOffice/MaxProjectsSection.tsxapps/webapp/app/hooks/useElementVisibility.tsapps/webapp/app/routes/account._index/route.tsxapps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.schedules.new.natural-language.tsxapps/webapp/app/routes/confirm-basic-details.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.concurrency/route.tsxapps/webapp/app/components/primitives/DateTime.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.webhooks.endpoints.$endpointParam/route.tsxinternal-packages/observability-map/src/suppression.tspackages/core/src/v3/utils/globals.tsapps/webapp/app/components/primitives/SearchInput.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.queues/route.tsxapps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.vercel.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.logs/route.tsxapps/webapp/app/components/navigation/DashboardDialogs.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.tasks.scheduled.$taskParam/route.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug_.projects.new/route.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.runs.$runParam/route.tsxapps/webapp/app/components/code/TSQLResultsTable.tsxapps/webapp/app/routes/login.mfa/route.tsxapps/webapp/app/routes/admin.feature-flags.tsxapps/webapp/app/components/primitives/Checkbox.tsxapps/webapp/app/components/primitives/DateField.tsxapps/webapp/app/components/integrations/VercelOnboardingModal.tsxapps/webapp/app/components/primitives/Buttons.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.test.tasks.$taskParam/route.tsxpackages/trigger-sdk/src/v3/envvars.tsapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.branches/route.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.dashboards.custom.$dashboardId/route.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.settings.integrations/route.tsxapps/webapp/app/routes/admin.queue-metrics.tsxapps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.github.tsxapps/webapp/app/routes/resources.branches.create.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.settings.team/route.tsxapps/webapp/app/routes/resources.metric.tsxapps/webapp/app/components/dashboard-agent/DashboardAgentChat.tsxapps/webapp/app/components/dashboard-agent/DashboardAgentPanel.tsxapps/webapp/app/components/scheduled/timezones.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.queues_.$queueParam/route.tsxpackages/cli-v3/e2e/e2e.test.tsapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.deployments.$deploymentParam/route.tsxapps/webapp/app/components/primitives/TooltipPortal.tsxapps/webapp/app/components/runs/v3/RunStatusCellTooltip.tsxapps/webapp/app/components/primitives/TreeView/TreeView.tsxapps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.waitpoints.$waitpointFriendlyId.complete/route.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.environment-variables/route.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.settings.sso/route.tsxapps/webapp/app/hooks/useDebounce.tsapps/webapp/app/components/navigation/EnvironmentSelector.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.playground.$agentParam/route.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.runs._index/useRunsLiveReload.tsapps/webapp/app/routes/resources.account.mfa.setup/useMfaSetup.tsapps/webapp/app/routes/resources.orgs.$organizationSlug.select-plan.tsxapps/webapp/app/components/navigation/SideMenu.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.sessions.$sessionParam/route.tsxapps/webapp/app/components/query/QueryEditor.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.prompts.$promptSlug/route.tsxapps/webapp/app/hooks/useMetricResourceQuery.tsapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.dashboards.$dashboardKey/route.tsxapps/webapp/app/components/runs/v3/agent/AgentView.tsxapps/webapp/app/components/runs/v3/ai/AIChatMessages.tsxapps/webapp/app/components/runs/v3/SharedFilters.tsxapps/webapp/app/routes/vercel.onboarding.tsxapps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.runs.$runParam.streams.$streamKey/route.tsxapps/webapp/app/components/dashboard-agent/AgentChart.tsxapps/webapp/app/components/code/AIQueryInput.tsxapps/webapp/app/components/primitives/charts/hooks/useZoomSelection.tsapps/webapp/app/components/webhookDeliveries/v1/useDeliveriesLiveReload.ts
{packages/core,apps/webapp}/**/*.{ts,tsx}
📄 CodeRabbit inference engine (.github/copilot-instructions.md)
Use zod for validation in packages/core and apps/webapp
Files:
apps/webapp/app/components/LoginPageLayout.tsxapps/webapp/app/components/TriggerRotatingLogo.tsxapps/webapp/app/components/AskAI.tsxapps/webapp/app/components/Feedback.tsxapps/webapp/app/components/billing/BillingLimitConfigSection.tsxapps/webapp/app/components/billing/BillingAlertsSection.tsxapps/webapp/app/components/billing/BillingLimitRecoveryPanel.tsxapps/webapp/app/components/dashboard-agent/DashboardAgentMessages.tsxapps/webapp/app/components/logs/LogsTable.tsxapps/webapp/app/components/code/JSONEditor.tsxapps/webapp/app/components/admin/FeatureFlagsDialog.tsxapps/webapp/app/components/primitives/AnimatedCallout.tsxapps/webapp/app/components/primitives/MiddleTruncate.tsxapps/webapp/app/components/code/TextEditor.tsxapps/webapp/app/components/navigation/SideMenuHeader.tsxapps/webapp/app/components/navigation/FavoritesSection.tsxapps/webapp/app/components/primitives/AgentDotMatrix.tsxapps/webapp/app/components/primitives/ClipboardField.tsxapps/webapp/app/components/metrics/SaveToDashboardDialog.tsxapps/webapp/app/components/code/TSQLEditor.tsxapps/webapp/app/components/queues/QueueControls.tsxapps/webapp/app/hooks/useChanged.tsapps/webapp/app/components/webhookConsole/SampleSourcePicker.tsxapps/webapp/app/components/navigation/useReorderableList.tsapps/webapp/app/hooks/useEventSource.tsxapps/webapp/app/components/primitives/Resizable.tsxapps/webapp/app/components/admin/backOffice/RateLimitSection.tsxapps/webapp/app/components/DevPresence.tsxapps/webapp/app/components/runs/v3/AIFilterInput.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.apikeys/route.tsxapps/webapp/app/components/primitives/DurationPicker.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam._index/route.tsxapps/webapp/app/components/schedules/PurchaseSchedulesModal.tsxapps/webapp/app/hooks/useAutoRevalidate.tsapps/webapp/app/hooks/useDashboardEditor.tsapps/webapp/app/components/admin/backOffice/MaxProjectsSection.tsxapps/webapp/app/hooks/useElementVisibility.tsapps/webapp/app/routes/account._index/route.tsxapps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.schedules.new.natural-language.tsxapps/webapp/app/routes/confirm-basic-details.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.concurrency/route.tsxapps/webapp/app/components/primitives/DateTime.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.webhooks.endpoints.$endpointParam/route.tsxpackages/core/src/v3/utils/globals.tsapps/webapp/app/components/primitives/SearchInput.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.queues/route.tsxapps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.vercel.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.logs/route.tsxapps/webapp/app/components/navigation/DashboardDialogs.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.tasks.scheduled.$taskParam/route.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug_.projects.new/route.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.runs.$runParam/route.tsxapps/webapp/app/components/code/TSQLResultsTable.tsxapps/webapp/app/routes/login.mfa/route.tsxapps/webapp/app/routes/admin.feature-flags.tsxapps/webapp/app/components/primitives/Checkbox.tsxapps/webapp/app/components/primitives/DateField.tsxapps/webapp/app/components/integrations/VercelOnboardingModal.tsxapps/webapp/app/components/primitives/Buttons.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.test.tasks.$taskParam/route.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.branches/route.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.dashboards.custom.$dashboardId/route.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.settings.integrations/route.tsxapps/webapp/app/routes/admin.queue-metrics.tsxapps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.github.tsxapps/webapp/app/routes/resources.branches.create.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.settings.team/route.tsxapps/webapp/app/routes/resources.metric.tsxapps/webapp/app/components/dashboard-agent/DashboardAgentChat.tsxapps/webapp/app/components/dashboard-agent/DashboardAgentPanel.tsxapps/webapp/app/components/scheduled/timezones.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.queues_.$queueParam/route.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.deployments.$deploymentParam/route.tsxapps/webapp/app/components/primitives/TooltipPortal.tsxapps/webapp/app/components/runs/v3/RunStatusCellTooltip.tsxapps/webapp/app/components/primitives/TreeView/TreeView.tsxapps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.waitpoints.$waitpointFriendlyId.complete/route.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.environment-variables/route.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.settings.sso/route.tsxapps/webapp/app/hooks/useDebounce.tsapps/webapp/app/components/navigation/EnvironmentSelector.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.playground.$agentParam/route.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.runs._index/useRunsLiveReload.tsapps/webapp/app/routes/resources.account.mfa.setup/useMfaSetup.tsapps/webapp/app/routes/resources.orgs.$organizationSlug.select-plan.tsxapps/webapp/app/components/navigation/SideMenu.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.sessions.$sessionParam/route.tsxapps/webapp/app/components/query/QueryEditor.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.prompts.$promptSlug/route.tsxapps/webapp/app/hooks/useMetricResourceQuery.tsapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.dashboards.$dashboardKey/route.tsxapps/webapp/app/components/runs/v3/agent/AgentView.tsxapps/webapp/app/components/runs/v3/ai/AIChatMessages.tsxapps/webapp/app/components/runs/v3/SharedFilters.tsxapps/webapp/app/routes/vercel.onboarding.tsxapps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.runs.$runParam.streams.$streamKey/route.tsxapps/webapp/app/components/dashboard-agent/AgentChart.tsxapps/webapp/app/components/code/AIQueryInput.tsxapps/webapp/app/components/primitives/charts/hooks/useZoomSelection.tsapps/webapp/app/components/webhookDeliveries/v1/useDeliveriesLiveReload.ts
**/*.{ts,tsx,js,jsx}
📄 CodeRabbit inference engine (.github/copilot-instructions.md)
Use function declarations instead of default exports
Files:
apps/webapp/app/components/LoginPageLayout.tsxapps/webapp/app/components/TriggerRotatingLogo.tsxapps/webapp/app/components/AskAI.tsxapps/webapp/app/components/Feedback.tsxapps/webapp/app/components/billing/BillingLimitConfigSection.tsxapps/webapp/app/components/billing/BillingAlertsSection.tsxapps/webapp/app/components/billing/BillingLimitRecoveryPanel.tsxapps/webapp/app/components/dashboard-agent/DashboardAgentMessages.tsxapps/webapp/app/components/logs/LogsTable.tsxapps/webapp/app/components/code/JSONEditor.tsxapps/webapp/app/components/admin/FeatureFlagsDialog.tsxapps/webapp/app/components/primitives/AnimatedCallout.tsxapps/webapp/app/components/primitives/MiddleTruncate.tsxapps/webapp/app/components/code/TextEditor.tsxapps/webapp/app/components/navigation/SideMenuHeader.tsxapps/webapp/app/components/navigation/FavoritesSection.tsxapps/webapp/app/components/primitives/AgentDotMatrix.tsxapps/webapp/app/components/primitives/ClipboardField.tsxapps/webapp/app/components/metrics/SaveToDashboardDialog.tsxapps/webapp/app/components/code/TSQLEditor.tsxapps/webapp/app/components/queues/QueueControls.tsxapps/webapp/app/hooks/useChanged.tsapps/webapp/app/components/webhookConsole/SampleSourcePicker.tsxapps/webapp/app/components/navigation/useReorderableList.tsapps/webapp/app/hooks/useEventSource.tsxapps/webapp/app/components/primitives/Resizable.tsxapps/webapp/app/components/admin/backOffice/RateLimitSection.tsxapps/webapp/app/components/DevPresence.tsxapps/webapp/app/components/runs/v3/AIFilterInput.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.apikeys/route.tsxapps/webapp/app/components/primitives/DurationPicker.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam._index/route.tsxapps/webapp/app/components/schedules/PurchaseSchedulesModal.tsxapps/webapp/app/hooks/useAutoRevalidate.tsapps/webapp/app/hooks/useDashboardEditor.tsapps/webapp/app/components/admin/backOffice/MaxProjectsSection.tsxapps/webapp/app/hooks/useElementVisibility.tsapps/webapp/app/routes/account._index/route.tsxapps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.schedules.new.natural-language.tsxapps/webapp/app/routes/confirm-basic-details.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.concurrency/route.tsxapps/webapp/app/components/primitives/DateTime.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.webhooks.endpoints.$endpointParam/route.tsxinternal-packages/observability-map/src/suppression.tspackages/core/src/v3/utils/globals.tsapps/webapp/app/components/primitives/SearchInput.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.queues/route.tsxapps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.vercel.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.logs/route.tsxapps/webapp/app/components/navigation/DashboardDialogs.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.tasks.scheduled.$taskParam/route.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug_.projects.new/route.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.runs.$runParam/route.tsxapps/webapp/app/components/code/TSQLResultsTable.tsxapps/webapp/app/routes/login.mfa/route.tsxapps/webapp/app/routes/admin.feature-flags.tsxapps/webapp/app/components/primitives/Checkbox.tsxapps/webapp/app/components/primitives/DateField.tsxapps/webapp/app/components/integrations/VercelOnboardingModal.tsxapps/webapp/app/components/primitives/Buttons.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.test.tasks.$taskParam/route.tsxpackages/trigger-sdk/src/v3/envvars.tsapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.branches/route.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.dashboards.custom.$dashboardId/route.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.settings.integrations/route.tsxapps/webapp/app/routes/admin.queue-metrics.tsxapps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.github.tsxapps/webapp/app/routes/resources.branches.create.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.settings.team/route.tsxapps/webapp/app/routes/resources.metric.tsxapps/webapp/app/components/dashboard-agent/DashboardAgentChat.tsxapps/webapp/app/components/dashboard-agent/DashboardAgentPanel.tsxapps/webapp/app/components/scheduled/timezones.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.queues_.$queueParam/route.tsxpackages/cli-v3/e2e/e2e.test.tsapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.deployments.$deploymentParam/route.tsxapps/webapp/app/components/primitives/TooltipPortal.tsxapps/webapp/app/components/runs/v3/RunStatusCellTooltip.tsxapps/webapp/app/components/primitives/TreeView/TreeView.tsxapps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.waitpoints.$waitpointFriendlyId.complete/route.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.environment-variables/route.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.settings.sso/route.tsxapps/webapp/app/hooks/useDebounce.tsapps/webapp/app/components/navigation/EnvironmentSelector.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.playground.$agentParam/route.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.runs._index/useRunsLiveReload.tsapps/webapp/app/routes/resources.account.mfa.setup/useMfaSetup.tsapps/webapp/app/routes/resources.orgs.$organizationSlug.select-plan.tsxapps/webapp/app/components/navigation/SideMenu.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.sessions.$sessionParam/route.tsxapps/webapp/app/components/query/QueryEditor.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.prompts.$promptSlug/route.tsxapps/webapp/app/hooks/useMetricResourceQuery.tsapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.dashboards.$dashboardKey/route.tsxapps/webapp/app/components/runs/v3/agent/AgentView.tsxapps/webapp/app/components/runs/v3/ai/AIChatMessages.tsxapps/webapp/app/components/runs/v3/SharedFilters.tsxapps/webapp/app/routes/vercel.onboarding.tsxapps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.runs.$runParam.streams.$streamKey/route.tsxapps/webapp/app/components/dashboard-agent/AgentChart.tsxapps/webapp/app/components/code/AIQueryInput.tsxapps/webapp/app/components/primitives/charts/hooks/useZoomSelection.tsapps/webapp/app/components/webhookDeliveries/v1/useDeliveriesLiveReload.ts
apps/webapp/**/*.{ts,tsx}
📄 CodeRabbit inference engine (.cursor/rules/webapp.mdc)
apps/webapp/**/*.{ts,tsx}: Access environment variables through theenvexport ofenv.server.tsinstead of directly accessingprocess.env
Use subpath exports from@trigger.dev/corepackage instead of importing from the root@trigger.dev/corepath
Files:
apps/webapp/app/components/LoginPageLayout.tsxapps/webapp/app/components/TriggerRotatingLogo.tsxapps/webapp/app/components/AskAI.tsxapps/webapp/app/components/Feedback.tsxapps/webapp/app/components/billing/BillingLimitConfigSection.tsxapps/webapp/app/components/billing/BillingAlertsSection.tsxapps/webapp/app/components/billing/BillingLimitRecoveryPanel.tsxapps/webapp/app/components/dashboard-agent/DashboardAgentMessages.tsxapps/webapp/app/components/logs/LogsTable.tsxapps/webapp/app/components/code/JSONEditor.tsxapps/webapp/app/components/admin/FeatureFlagsDialog.tsxapps/webapp/app/components/primitives/AnimatedCallout.tsxapps/webapp/app/components/primitives/MiddleTruncate.tsxapps/webapp/app/components/code/TextEditor.tsxapps/webapp/app/components/navigation/SideMenuHeader.tsxapps/webapp/app/components/navigation/FavoritesSection.tsxapps/webapp/app/components/primitives/AgentDotMatrix.tsxapps/webapp/app/components/primitives/ClipboardField.tsxapps/webapp/app/components/metrics/SaveToDashboardDialog.tsxapps/webapp/app/components/code/TSQLEditor.tsxapps/webapp/app/components/queues/QueueControls.tsxapps/webapp/app/hooks/useChanged.tsapps/webapp/app/components/webhookConsole/SampleSourcePicker.tsxapps/webapp/app/components/navigation/useReorderableList.tsapps/webapp/app/hooks/useEventSource.tsxapps/webapp/app/components/primitives/Resizable.tsxapps/webapp/app/components/admin/backOffice/RateLimitSection.tsxapps/webapp/app/components/DevPresence.tsxapps/webapp/app/components/runs/v3/AIFilterInput.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.apikeys/route.tsxapps/webapp/app/components/primitives/DurationPicker.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam._index/route.tsxapps/webapp/app/components/schedules/PurchaseSchedulesModal.tsxapps/webapp/app/hooks/useAutoRevalidate.tsapps/webapp/app/hooks/useDashboardEditor.tsapps/webapp/app/components/admin/backOffice/MaxProjectsSection.tsxapps/webapp/app/hooks/useElementVisibility.tsapps/webapp/app/routes/account._index/route.tsxapps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.schedules.new.natural-language.tsxapps/webapp/app/routes/confirm-basic-details.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.concurrency/route.tsxapps/webapp/app/components/primitives/DateTime.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.webhooks.endpoints.$endpointParam/route.tsxapps/webapp/app/components/primitives/SearchInput.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.queues/route.tsxapps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.vercel.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.logs/route.tsxapps/webapp/app/components/navigation/DashboardDialogs.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.tasks.scheduled.$taskParam/route.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug_.projects.new/route.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.runs.$runParam/route.tsxapps/webapp/app/components/code/TSQLResultsTable.tsxapps/webapp/app/routes/login.mfa/route.tsxapps/webapp/app/routes/admin.feature-flags.tsxapps/webapp/app/components/primitives/Checkbox.tsxapps/webapp/app/components/primitives/DateField.tsxapps/webapp/app/components/integrations/VercelOnboardingModal.tsxapps/webapp/app/components/primitives/Buttons.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.test.tasks.$taskParam/route.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.branches/route.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.dashboards.custom.$dashboardId/route.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.settings.integrations/route.tsxapps/webapp/app/routes/admin.queue-metrics.tsxapps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.github.tsxapps/webapp/app/routes/resources.branches.create.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.settings.team/route.tsxapps/webapp/app/routes/resources.metric.tsxapps/webapp/app/components/dashboard-agent/DashboardAgentChat.tsxapps/webapp/app/components/dashboard-agent/DashboardAgentPanel.tsxapps/webapp/app/components/scheduled/timezones.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.queues_.$queueParam/route.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.deployments.$deploymentParam/route.tsxapps/webapp/app/components/primitives/TooltipPortal.tsxapps/webapp/app/components/runs/v3/RunStatusCellTooltip.tsxapps/webapp/app/components/primitives/TreeView/TreeView.tsxapps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.waitpoints.$waitpointFriendlyId.complete/route.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.environment-variables/route.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.settings.sso/route.tsxapps/webapp/app/hooks/useDebounce.tsapps/webapp/app/components/navigation/EnvironmentSelector.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.playground.$agentParam/route.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.runs._index/useRunsLiveReload.tsapps/webapp/app/routes/resources.account.mfa.setup/useMfaSetup.tsapps/webapp/app/routes/resources.orgs.$organizationSlug.select-plan.tsxapps/webapp/app/components/navigation/SideMenu.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.sessions.$sessionParam/route.tsxapps/webapp/app/components/query/QueryEditor.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.prompts.$promptSlug/route.tsxapps/webapp/app/hooks/useMetricResourceQuery.tsapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.dashboards.$dashboardKey/route.tsxapps/webapp/app/components/runs/v3/agent/AgentView.tsxapps/webapp/app/components/runs/v3/ai/AIChatMessages.tsxapps/webapp/app/components/runs/v3/SharedFilters.tsxapps/webapp/app/routes/vercel.onboarding.tsxapps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.runs.$runParam.streams.$streamKey/route.tsxapps/webapp/app/components/dashboard-agent/AgentChart.tsxapps/webapp/app/components/code/AIQueryInput.tsxapps/webapp/app/components/primitives/charts/hooks/useZoomSelection.tsapps/webapp/app/components/webhookDeliveries/v1/useDeliveriesLiveReload.ts
apps/webapp/app/**/*.{ts,tsx}
📄 CodeRabbit inference engine (apps/webapp/CLAUDE.md)
apps/webapp/app/**/*.{ts,tsx}: For dashboard changes, visually verify the running Remix app with Chrome DevTools MCP, using snapshots, screenshots, interaction, and console-message checks as appropriate.
UseuseCallbackanduseMemoonly for context provider values, expensive derived data used as a dependency, or stable references required by dependency arrays; do not wrap ordinary event handlers or trivial computations.
Use named constants for sentinel or placeholder values instead of scattering raw string literals across comparisons.
Files:
apps/webapp/app/components/LoginPageLayout.tsxapps/webapp/app/components/TriggerRotatingLogo.tsxapps/webapp/app/components/AskAI.tsxapps/webapp/app/components/Feedback.tsxapps/webapp/app/components/billing/BillingLimitConfigSection.tsxapps/webapp/app/components/billing/BillingAlertsSection.tsxapps/webapp/app/components/billing/BillingLimitRecoveryPanel.tsxapps/webapp/app/components/dashboard-agent/DashboardAgentMessages.tsxapps/webapp/app/components/logs/LogsTable.tsxapps/webapp/app/components/code/JSONEditor.tsxapps/webapp/app/components/admin/FeatureFlagsDialog.tsxapps/webapp/app/components/primitives/AnimatedCallout.tsxapps/webapp/app/components/primitives/MiddleTruncate.tsxapps/webapp/app/components/code/TextEditor.tsxapps/webapp/app/components/navigation/SideMenuHeader.tsxapps/webapp/app/components/navigation/FavoritesSection.tsxapps/webapp/app/components/primitives/AgentDotMatrix.tsxapps/webapp/app/components/primitives/ClipboardField.tsxapps/webapp/app/components/metrics/SaveToDashboardDialog.tsxapps/webapp/app/components/code/TSQLEditor.tsxapps/webapp/app/components/queues/QueueControls.tsxapps/webapp/app/hooks/useChanged.tsapps/webapp/app/components/webhookConsole/SampleSourcePicker.tsxapps/webapp/app/components/navigation/useReorderableList.tsapps/webapp/app/hooks/useEventSource.tsxapps/webapp/app/components/primitives/Resizable.tsxapps/webapp/app/components/admin/backOffice/RateLimitSection.tsxapps/webapp/app/components/DevPresence.tsxapps/webapp/app/components/runs/v3/AIFilterInput.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.apikeys/route.tsxapps/webapp/app/components/primitives/DurationPicker.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam._index/route.tsxapps/webapp/app/components/schedules/PurchaseSchedulesModal.tsxapps/webapp/app/hooks/useAutoRevalidate.tsapps/webapp/app/hooks/useDashboardEditor.tsapps/webapp/app/components/admin/backOffice/MaxProjectsSection.tsxapps/webapp/app/hooks/useElementVisibility.tsapps/webapp/app/routes/account._index/route.tsxapps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.schedules.new.natural-language.tsxapps/webapp/app/routes/confirm-basic-details.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.concurrency/route.tsxapps/webapp/app/components/primitives/DateTime.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.webhooks.endpoints.$endpointParam/route.tsxapps/webapp/app/components/primitives/SearchInput.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.queues/route.tsxapps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.vercel.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.logs/route.tsxapps/webapp/app/components/navigation/DashboardDialogs.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.tasks.scheduled.$taskParam/route.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug_.projects.new/route.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.runs.$runParam/route.tsxapps/webapp/app/components/code/TSQLResultsTable.tsxapps/webapp/app/routes/login.mfa/route.tsxapps/webapp/app/routes/admin.feature-flags.tsxapps/webapp/app/components/primitives/Checkbox.tsxapps/webapp/app/components/primitives/DateField.tsxapps/webapp/app/components/integrations/VercelOnboardingModal.tsxapps/webapp/app/components/primitives/Buttons.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.test.tasks.$taskParam/route.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.branches/route.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.dashboards.custom.$dashboardId/route.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.settings.integrations/route.tsxapps/webapp/app/routes/admin.queue-metrics.tsxapps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.github.tsxapps/webapp/app/routes/resources.branches.create.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.settings.team/route.tsxapps/webapp/app/routes/resources.metric.tsxapps/webapp/app/components/dashboard-agent/DashboardAgentChat.tsxapps/webapp/app/components/dashboard-agent/DashboardAgentPanel.tsxapps/webapp/app/components/scheduled/timezones.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.queues_.$queueParam/route.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.deployments.$deploymentParam/route.tsxapps/webapp/app/components/primitives/TooltipPortal.tsxapps/webapp/app/components/runs/v3/RunStatusCellTooltip.tsxapps/webapp/app/components/primitives/TreeView/TreeView.tsxapps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.waitpoints.$waitpointFriendlyId.complete/route.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.environment-variables/route.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.settings.sso/route.tsxapps/webapp/app/hooks/useDebounce.tsapps/webapp/app/components/navigation/EnvironmentSelector.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.playground.$agentParam/route.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.runs._index/useRunsLiveReload.tsapps/webapp/app/routes/resources.account.mfa.setup/useMfaSetup.tsapps/webapp/app/routes/resources.orgs.$organizationSlug.select-plan.tsxapps/webapp/app/components/navigation/SideMenu.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.sessions.$sessionParam/route.tsxapps/webapp/app/components/query/QueryEditor.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.prompts.$promptSlug/route.tsxapps/webapp/app/hooks/useMetricResourceQuery.tsapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.dashboards.$dashboardKey/route.tsxapps/webapp/app/components/runs/v3/agent/AgentView.tsxapps/webapp/app/components/runs/v3/ai/AIChatMessages.tsxapps/webapp/app/components/runs/v3/SharedFilters.tsxapps/webapp/app/routes/vercel.onboarding.tsxapps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.runs.$runParam.streams.$streamKey/route.tsxapps/webapp/app/components/dashboard-agent/AgentChart.tsxapps/webapp/app/components/code/AIQueryInput.tsxapps/webapp/app/components/primitives/charts/hooks/useZoomSelection.tsapps/webapp/app/components/webhookDeliveries/v1/useDeliveriesLiveReload.ts
**/*
📄 CodeRabbit inference engine (AGENTS.md)
**/*: Add crumbs as you write code — not just when debugging. Mark lines with
//@Crumbsor wrap blocks in `// `#region` `@crumbs. They stay on the
branch throughout development and are stripped byagentcrumbs strip
before merge.
Do not invent new namespaces — pick from this table or ask first.
Do not flag//@Crumbsmarkers, `#region `@crumbsblocks, or agentcrumbs
imports in reviews. These are temporary debug instrumentation stripped
before merge. Data logged in crumbs (IDs, names, values) never reaches
production.
Files:
apps/webapp/app/components/LoginPageLayout.tsxapps/webapp/app/components/TriggerRotatingLogo.tsxapps/webapp/app/components/AskAI.tsxapps/webapp/app/components/Feedback.tsxapps/webapp/app/components/billing/BillingLimitConfigSection.tsxapps/webapp/app/components/billing/BillingAlertsSection.tsxapps/webapp/app/components/billing/BillingLimitRecoveryPanel.tsxapps/webapp/app/components/dashboard-agent/DashboardAgentMessages.tsxapps/webapp/app/components/logs/LogsTable.tsxapps/webapp/app/components/code/JSONEditor.tsxapps/webapp/app/components/admin/FeatureFlagsDialog.tsxapps/webapp/app/components/primitives/AnimatedCallout.tsxapps/webapp/app/components/primitives/MiddleTruncate.tsxapps/webapp/app/components/code/TextEditor.tsxapps/webapp/app/components/navigation/SideMenuHeader.tsxapps/webapp/app/components/navigation/FavoritesSection.tsxapps/webapp/app/components/primitives/AgentDotMatrix.tsxapps/webapp/app/components/primitives/ClipboardField.tsxapps/webapp/app/components/metrics/SaveToDashboardDialog.tsxapps/webapp/app/components/code/TSQLEditor.tsxapps/webapp/app/components/queues/QueueControls.tsxapps/webapp/app/hooks/useChanged.tsapps/webapp/app/components/webhookConsole/SampleSourcePicker.tsxapps/webapp/app/components/navigation/useReorderableList.tsapps/webapp/app/hooks/useEventSource.tsxapps/webapp/app/components/primitives/Resizable.tsxapps/webapp/app/components/admin/backOffice/RateLimitSection.tsxapps/webapp/app/components/DevPresence.tsxapps/webapp/app/components/runs/v3/AIFilterInput.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.apikeys/route.tsxapps/webapp/app/components/primitives/DurationPicker.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam._index/route.tsxapps/webapp/app/components/schedules/PurchaseSchedulesModal.tsxapps/webapp/app/hooks/useAutoRevalidate.tsapps/webapp/app/hooks/useDashboardEditor.tsapps/webapp/app/components/admin/backOffice/MaxProjectsSection.tsxapps/webapp/app/hooks/useElementVisibility.tsapps/webapp/app/routes/account._index/route.tsxapps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.schedules.new.natural-language.tsxapps/webapp/app/routes/confirm-basic-details.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.concurrency/route.tsxapps/webapp/app/components/primitives/DateTime.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.webhooks.endpoints.$endpointParam/route.tsxinternal-packages/observability-map/src/suppression.tspackages/core/src/v3/utils/globals.tsapps/webapp/app/components/primitives/SearchInput.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.queues/route.tsxapps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.vercel.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.logs/route.tsxapps/webapp/app/components/navigation/DashboardDialogs.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.tasks.scheduled.$taskParam/route.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug_.projects.new/route.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.runs.$runParam/route.tsxapps/webapp/app/components/code/TSQLResultsTable.tsxapps/webapp/app/routes/login.mfa/route.tsxapps/webapp/app/routes/admin.feature-flags.tsxapps/webapp/app/components/primitives/Checkbox.tsxapps/webapp/app/components/primitives/DateField.tsxapps/webapp/app/components/integrations/VercelOnboardingModal.tsxapps/webapp/app/components/primitives/Buttons.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.test.tasks.$taskParam/route.tsxpackages/trigger-sdk/src/v3/envvars.tsapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.branches/route.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.dashboards.custom.$dashboardId/route.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.settings.integrations/route.tsxapps/webapp/app/routes/admin.queue-metrics.tsxapps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.github.tsxapps/webapp/app/routes/resources.branches.create.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.settings.team/route.tsxapps/webapp/app/routes/resources.metric.tsxapps/webapp/app/components/dashboard-agent/DashboardAgentChat.tsxapps/webapp/app/components/dashboard-agent/DashboardAgentPanel.tsxapps/webapp/app/components/scheduled/timezones.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.queues_.$queueParam/route.tsxpackages/cli-v3/e2e/e2e.test.tsapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.deployments.$deploymentParam/route.tsxapps/webapp/app/components/primitives/TooltipPortal.tsxapps/webapp/app/components/runs/v3/RunStatusCellTooltip.tsxpackage.jsonapps/webapp/app/components/primitives/TreeView/TreeView.tsxapps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.waitpoints.$waitpointFriendlyId.complete/route.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.environment-variables/route.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.settings.sso/route.tsxapps/webapp/app/hooks/useDebounce.tsapps/webapp/app/components/navigation/EnvironmentSelector.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.playground.$agentParam/route.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.runs._index/useRunsLiveReload.tsapps/webapp/app/routes/resources.account.mfa.setup/useMfaSetup.tsapps/webapp/app/routes/resources.orgs.$organizationSlug.select-plan.tsxapps/webapp/app/components/navigation/SideMenu.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.sessions.$sessionParam/route.tsxapps/webapp/app/components/query/QueryEditor.tsxapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.prompts.$promptSlug/route.tsxapps/webapp/app/hooks/useMetricResourceQuery.tsapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.dashboards.$dashboardKey/route.tsxapps/webapp/app/components/runs/v3/agent/AgentView.tsxapps/webapp/app/components/runs/v3/ai/AIChatMessages.tsxapps/webapp/app/components/runs/v3/SharedFilters.tsxapps/webapp/app/routes/vercel.onboarding.tsxapps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.runs.$runParam.streams.$streamKey/route.tsxapps/webapp/app/components/dashboard-agent/AgentChart.tsxapps/webapp/app/components/code/AIQueryInput.tsxapps/webapp/app/components/primitives/charts/hooks/useZoomSelection.tsapps/webapp/app/components/webhookDeliveries/v1/useDeliveriesLiveReload.ts
**/*.ts
📄 CodeRabbit inference engine (.cursor/rules/otel-metrics.mdc)
**/*.ts: When creating or editing OTEL metrics (counters, histograms, gauges), ensure metric attributes have low cardinality by using only enums, booleans, bounded error codes, or bounded shard IDs
Do not use high-cardinality attributes in OTEL metrics such as UUIDs/IDs (envId, userId, runId, projectId, organizationId), unbounded integers (itemCount, batchSize, retryCount), timestamps (createdAt, startTime), or free-form strings (errorMessage, taskName, queueName)
When exporting OTEL metrics via OTLP to Prometheus, be aware that the exporter automatically adds unit suffixes to metric names (e.g., 'my_duration_ms' becomes 'my_duration_ms_milliseconds', 'my_counter' becomes 'my_counter_total'). Account for these transformations when writing Grafana dashboards or Prometheus queries
Files:
apps/webapp/app/hooks/useChanged.tsapps/webapp/app/components/navigation/useReorderableList.tsapps/webapp/app/hooks/useAutoRevalidate.tsapps/webapp/app/hooks/useDashboardEditor.tsapps/webapp/app/hooks/useElementVisibility.tsinternal-packages/observability-map/src/suppression.tspackages/core/src/v3/utils/globals.tspackages/trigger-sdk/src/v3/envvars.tspackages/cli-v3/e2e/e2e.test.tsapps/webapp/app/hooks/useDebounce.tsapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.runs._index/useRunsLiveReload.tsapps/webapp/app/routes/resources.account.mfa.setup/useMfaSetup.tsapps/webapp/app/hooks/useMetricResourceQuery.tsapps/webapp/app/components/primitives/charts/hooks/useZoomSelection.tsapps/webapp/app/components/webhookDeliveries/v1/useDeliveriesLiveReload.ts
apps/webapp/app/**/*.ts
📄 CodeRabbit inference engine (apps/webapp/CLAUDE.md)
apps/webapp/app/**/*.ts: Never userequest.signalto detect client disconnects. UsegetRequestAbortSignal()fromapp/services/httpAsyncStorage.server.ts, which is wired to Express response close events.
Access environment variables through theenvexport fromapp/env.server.ts; never useprocess.envdirectly.
Always use PrismafindFirstinstead offindUnique.
Always use the$transactionhelper from~/db.server, never callprisma.$transactionor$replica.$transactiondirectly. Pass isolation levels as strings, useSerializablefor correctness-critical read-then-write invariants, and guard possibly undefined helper results when a definite value is required.
Files:
apps/webapp/app/hooks/useChanged.tsapps/webapp/app/components/navigation/useReorderableList.tsapps/webapp/app/hooks/useAutoRevalidate.tsapps/webapp/app/hooks/useDashboardEditor.tsapps/webapp/app/hooks/useElementVisibility.tsapps/webapp/app/hooks/useDebounce.tsapps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.runs._index/useRunsLiveReload.tsapps/webapp/app/routes/resources.account.mfa.setup/useMfaSetup.tsapps/webapp/app/hooks/useMetricResourceQuery.tsapps/webapp/app/components/primitives/charts/hooks/useZoomSelection.tsapps/webapp/app/components/webhookDeliveries/v1/useDeliveriesLiveReload.ts
packages/core/**/*.{ts,tsx,js,jsx}
📄 CodeRabbit inference engine (packages/core/CLAUDE.md)
Never import the root package (
@trigger.dev/core). Always use subpath imports such as@trigger.dev/core/v3,@trigger.dev/core/v3/utils,@trigger.dev/core/logger, or@trigger.dev/core/schemas
Files:
packages/core/src/v3/utils/globals.ts
packages/core/**/*.{ts,tsx}
📄 CodeRabbit inference engine (AGENTS.md)
Import subpaths only (never root).
Files:
packages/core/src/v3/utils/globals.ts
packages/trigger-sdk/**/*.{ts,tsx}
📄 CodeRabbit inference engine (.github/copilot-instructions.md)
In the Trigger.dev SDK (packages/trigger-sdk), prefer isomorphic code like fetch and ReadableStream instead of Node.js-specific code
Files:
packages/trigger-sdk/src/v3/envvars.ts
packages/trigger-sdk/**/*.{js,ts,jsx,tsx}
📄 CodeRabbit inference engine (packages/trigger-sdk/CLAUDE.md)
Always import from
@trigger.dev/sdk. Never use@trigger.dev/sdk/v3(deprecated path alias)
Files:
packages/trigger-sdk/src/v3/envvars.ts
packages/trigger-sdk/**/*.ts
📄 CodeRabbit inference engine (AGENTS.md)
Always import from
@trigger.dev/sdk. Never use@trigger.dev/sdk/v3or deprecatedclient.defineJob.
Files:
packages/trigger-sdk/src/v3/envvars.ts
**/*.{test,spec}.{ts,tsx}
📄 CodeRabbit inference engine (.github/copilot-instructions.md)
Use vitest for all tests in the Trigger.dev repository
**/*.{test,spec}.{ts,tsx}: We use vitest exclusively. Never mock anything - use testcontainers instead.
Test files go next to source files (e.g.,MyService.ts->MyService.test.ts).
Files:
packages/cli-v3/e2e/e2e.test.ts
apps/webapp/app/routes/**/*.ts
📄 CodeRabbit inference engine (apps/webapp/CLAUDE.md)
apps/webapp/app/routes/**/*.ts: Use Remix flat-file route conventions with dot-separated segments; for example,api.v1.tasks.$taskId.trigger.tsmaps to/api/v1/tasks/:taskId/trigger.
PAT-authenticated API routes must resolve their target organization or project within the caller's membership scope, using a membership filter or a helper such asfindProjectByReforresolveOrganizationForApiUser; RBAC authorization alone is insufficient.
Files:
apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.runs._index/useRunsLiveReload.tsapps/webapp/app/routes/resources.account.mfa.setup/useMfaSetup.ts
🧠 Learnings (1)
📚 Learning: 2026-07-15T18:37:08.044Z
Learnt from: CR
Repo: triggerdotdev/trigger.dev PR: 0
File: apps/webapp/CLAUDE.md:0-0
Timestamp: 2026-07-15T18:37:08.044Z
Learning: Applies to apps/webapp/app/**/*.{ts,tsx} : Use `useCallback` and `useMemo` only for context provider values, expensive derived data used as a dependency, or stable references required by dependency arrays; do not wrap ordinary event handlers or trivial computations.
Applied to files:
apps/webapp/app/components/billing/BillingAlertsSection.tsx
| // oxlint-disable-next-line react/set-state-in-effect, react/no-deriving-state-in-effects -- Programmatic filter changes intentionally reset the debounced input draft. | ||
| setValue(initialValue); |
There was a problem hiding this comment.
📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
set -euo pipefail
fd -H -t f -E node_modules -E dist 'oxlint|package\.json' . \
| xargs -r rg -n 'react(-hooks)?/(refs|set-state-in-effect|no-deriving-state-in-effects|incompatible-library)|jsPlugins|plugins'
pnpm exec oxlint --rules \
| rg 'react(-hooks)?/(refs|set-state-in-effect|no-deriving-state-in-effects|incompatible-library)'
pnpm exec oxlint \
apps/webapp/app/components/code/TSQLResultsTable.tsx \
--report-unused-disable-directivesRepository: triggerdotdev/trigger.dev
Length of output: 1853
🏁 Script executed:
#!/bin/bash
set -u
printf '%s\n' '--- effective Oxlint configuration ---'
cat -n .oxlintrc.json | sed -n '1,170p'
printf '%s\n' '--- Oxlint version declarations ---'
rg -n '"oxlint"|oxlint@' package.json pnpm-lock.yaml apps/webapp/package.json . 2>/dev/null | head -80
printf '%s\n' '--- CLI availability ---'
pnpm exec oxlint --version 2>&1 || true
pnpm exec oxlint --help 2>&1 | sed -n '1,180p' || true
printf '%s\n' '--- directives in the reviewed file ---'
rg -n 'oxlint-disable|react/(refs|set-state-in-effect|no-deriving-state-in-effects|incompatible-library)' apps/webapp/app/components/code/TSQLResultsTable.tsxRepository: triggerdotdev/trigger.dev
Length of output: 16510
🏁 Script executed:
#!/bin/bash
set +e
printf '%s\n' '--- registered rule IDs ---'
pnpm exec oxlint --rules 2>&1 \
| rg -n -C 1 'react/(refs|set-state-in-effect|no-deriving-state-in-effects|incompatible-library)' \
|| true
printf '%s\n' '--- effective file configuration ---'
pnpm exec oxlint --print-config apps/webapp/app/components/code/TSQLResultsTable.tsx 2>&1 \
| rg -n -C 1 'react/(refs|set-state-in-effect|no-deriving-state-in-effects|incompatible-library)' \
|| true
printf '%s\n' '--- unused-directive check ---'
pnpm exec oxlint \
apps/webapp/app/components/code/TSQLResultsTable.tsx \
--report-unused-disable-directives 2>&1 \
| rg -n -C 2 'unused|directive|react/(refs|set-state-in-effect|no-deriving-state-in-effects|incompatible-library)' \
|| trueRepository: triggerdotdev/trigger.dev
Length of output: 259
🏁 Script executed:
#!/bin/bash
set +e
printf '%s\n' '--- registered rules (raw, filtered by compiler namespace) ---'
pnpm exec oxlint --rules 2>&1 | head -40
printf '%s\n' '--- effective config (raw) ---'
pnpm exec oxlint --print-config apps/webapp/app/components/code/TSQLResultsTable.tsx 2>&1 | head -80
printf '%s\n' '--- file lint (raw) ---'
pnpm exec oxlint apps/webapp/app/components/code/TSQLResultsTable.tsx \
--report-unused-disable-directives 2>&1 | head -160Repository: triggerdotdev/trigger.dev
Length of output: 6059
🌐 Web query:
Oxlint 1.79.0 react plugin rules incompatible-library refs set-state-in-effect no-deriving-state-in-effects
💡 Result:
In Oxlint v1.79.0, React Compiler support has been integrated, introducing several specific rules within the react plugin that are powered by the React Compiler's analysis [1][2]. Regarding your specific inquiries: 1. react/incompatible-library: This rule is officially supported in Oxlint [3]. It warns about the usage of library APIs known to be incompatible with manual or automatic memoization (e.g., react-hook-form's watch, TanStack Table's useReactTable) [3]. It is categorized under the "correctness" category [2]. 2. react/refs: This rule is officially supported [4]. It validates the correct usage of refs, specifically ensuring that ref.current is not read or written during the render phase [4]. It is categorized under the "correctness" category [2]. 3. react/set-state-in-effect: This rule is officially supported [5]. It disallows calling setState synchronously inside an effect body, as this triggers unnecessary extra render passes and often indicates an anti-pattern (such as deriving state in an effect) [5][6]. It is categorized under the "correctness" category [2]. 4. no-deriving-state-in-effects: There is no native Oxlint rule with the exact name "no-deriving-state-in-effects" in the core react plugin [2]. However, the behavior of deriving state in effects is targeted by the react/set-state-in-effect rule [5][6]. Additionally, the rule react/no-deriving-state-in-effects is explicitly listed as being "off" and assigned to the "perf" category in Oxlint's recent configuration documentation [2]. If you require specific coverage for these anti-patterns, you may also look into community plugins like oxlint-plugin-react-doctor, which includes rules such as no-derived-state-effect [7]. To enable these rules, you can add them to your.oxlintrc.json or oxlint.config.ts configuration under the react plugin section [3][4][5]. For further details, consult the official Oxlint documentation [8][2].
Citations:
- 1: https://zenn.dev/dress_code/articles/2b2832d66b883b
- 2: https://oxc.rs/blog/2026-08-18-react-compiler-support.html
- 3: https://oxc.rs/docs/guide/usage/linter/rules/react/incompatible-library.html
- 4: https://oxc.rs/docs/guide/usage/linter/rules/react/refs.html
- 5: https://oxc.rs/docs/guide/usage/linter/rules/react/set-state-in-effect.html
- 6: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
- 7: https://github.com/millionco/react-doctor/blob/4dc48d7b/packages/oxlint-plugin-react-doctor/README.md
- 8: https://www.npmjs.com/package/oxlint
Remove react/no-deriving-state-in-effects. Oxlint 1.79 supports the other three rules, but not this rule. Remove it from the configuration and this directive.
Source: MCP tools
|
|
||
| renderedPathRef.current = location.pathname; |
There was a problem hiding this comment.
📐 Maintainability & Code Quality | 🟠 Major | ⚡ Quick win
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
set -euo pipefail
pnpm exec oxlint \
apps/webapp/app/components/dashboard-agent/DashboardAgentChat.tsx \
--report-unused-disable-directivesRepository: triggerdotdev/trigger.dev
Length of output: 2089
🏁 Script executed:
#!/bin/bash
set -euo pipefail
file="apps/webapp/app/components/dashboard-agent/DashboardAgentChat.tsx"
printf '%s\n' '--- relevant source ---'
cat -n "$file" | sed -n '95,145p;195,225p;345,420p'
printf '%s\n' '--- ref declarations and suppressions ---'
rg -n -C 2 'renderedPathRef|orderRef|navigatedRef|watchProposedRef|teardownRef|messagesRef|react/refs|eslint-disable' "$file"
printf '%s\n' '--- repository lint configuration references ---'
rg -n -S 'react/refs|oxlint|eslint-plugin-react-hooks|react-hooks' \
--glob '!node_modules/**' \
--glob '!dist/**' \
--glob '!build/**' \
.oxlintrc* package.json pnpm-lock.yaml 2>/dev/null || true
printf '%s\n' '--- package files ---'
git ls-files '*oxlint*' '*eslint*' 'package.json' | sed -n '1,120p'Repository: triggerdotdev/trigger.dev
Length of output: 15588
🌐 Web query:
React eslint-plugin-react-hooks refs rule official documentation render ref.current
💡 Result:
The official eslint-plugin-react-hooks includes a specific rule, react-hooks/refs, designed to enforce the correct usage of React refs [1][2][3]. This rule prohibits reading or writing to ref.current during the component render phase, as doing so can lead to unpredictable behavior, stale data, or inconsistent application state [1][4][5]. Key points regarding this rule and React ref usage include: 1. Rule Intent: The rule prevents reading or writing ref.current during rendering [1][4][3]. Because refs are meant for storing mutable values that do not trigger re-renders, accessing them during render—where React expects pure operations—breaks established React patterns [1][5][6]. 2. Acceptable Usage: - Effects and Event Handlers: You should read or write ref.current inside useEffect, useLayoutEffect, or event handlers (like onClick), where side effects are intended and allowed [1][4][3]. - Lazy Initialization: A specific, allowed exception is lazy initialization of a ref, such as if (!ref.current) ref.current = new ExpensiveValue, provided it is performed safely during the render phase [1][5][3]. 3. How the Linter Identifies Refs: The plugin uses a name-based heuristic to identify refs [1][4]. If a variable is named ref or ends in Ref, the linter tracks it as a ref object [1][3]. If you are using an object to hold non-ref mutable data and are receiving false positives from this rule, you can resolve it by renaming the variable (e.g., to box or data) so the linter no longer infers it as a React ref [1][4][3]. 4. Distinction from exhaustive-deps: While react-hooks/refs targets direct access to ref.current during render, the separate react-hooks/exhaustive-deps rule warns against including ref.current in dependency arrays [7][8]. This is because refs are mutable and their updates do not trigger re-renders; therefore, they should not be treated as dependencies that require re-running effects [7][8]. For more details, consult the official React documentation on the refs lint rule and the useRef hook [1][5].
Citations:
- 1: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
- 2: https://github.com/facebook/react/blob/main/packages/eslint-plugin-react-hooks/README.md
- 3: https://uk.react.dev/reference/eslint-plugin-react-hooks/lints/refs
- 4: https://www.eslint-react.xyz/docs/rules/refs
- 5: https://react.dev/reference/react/useRef
- 6: https://react.dev/learn/referencing-values-with-refs
- 7: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
- 8: https://www.epicreact.dev/why-you-shouldnt-put-refs-in-a-dependency-array
🏁 Script executed:
#!/bin/bash
set -euo pipefail
printf '%s\n' '--- Oxlint configuration ---'
cat -n .oxlintrc.json | sed -n '1,180p'
printf '%s\n' '--- Change that removed the directives ---'
git diff --unified=8 -- apps/webapp/app/components/dashboard-agent/DashboardAgentChat.tsx
printf '%s\n' '--- Available Oxlint rule/config capabilities ---'
pnpm exec oxlint --version
pnpm exec oxlint --help | sed -n '1,180p'Repository: triggerdotdev/trigger.dev
Length of output: 15744
🏁 Script executed:
#!/bin/bash
set -euo pipefail
file="apps/webapp/app/components/dashboard-agent/DashboardAgentChat.tsx"
printf '%s\n' '--- parent version around the affected code ---'
git show HEAD^:"$file" 2>/dev/null | nl -ba | sed -n '115,140p;200,220p;350,420p' || true
printf '%s\n' '--- ref-rule suppression conventions ---'
rg -n -C 1 'react/refs|eslint-disable.*refs|oxlint-disable.*refs' \
--glob '!node_modules/**' \
--glob '!dist/**' \
--glob '!build/**' \
. 2>/dev/null || true
printf '%s\n' '--- locked Oxlint version ---'
sed -n '120,150p;12355,12380p;27365,27385p' pnpm-lock.yamlRepository: triggerdotdev/trigger.dev
Length of output: 20178
🌐 Web query:
Oxlint 1.79.0 react/refs rule react plugin
💡 Result:
In Oxlint 1.79.0, the react/refs rule is officially supported as part of the React plugin's integration with the React Compiler [1][2][3]. Following a major update in version 1.79.0, Oxlint split the experimental, monolithic react/react-compiler rule into distinct, category-specific rules that align with upstream React Compiler presets [2][3]. The react/refs rule is now one of these native implementations, categorized under correctness [2]. To use the rule, ensure you have enabled the React plugin [1][4]. You can enable the rule via your configuration file or the command line: Configuration file (oxlint.json or equivalent): { "plugins": ["react"], "rules": { "react/refs": "error" } } Command line: oxlint --deny react/refs --react-plugin This rule validates that refs are not read or written during the render phase, which is crucial for preventing stale UI and ensuring component correctness [1]. If you were previously using the experimental react/react-compiler rule, it is recommended to remove it from your configuration and replace it with these specific rules [2].
Citations:
- 1: https://oxc.rs/docs/guide/usage/linter/rules/react/refs.html
- 2: https://oxc.rs/blog/2026-08-18-react-compiler-support.html
- 3: https://github.com/oxc-project/oxc/blob/main/npm/oxlint/CHANGELOG.md
- 4: https://oxc.rs/docs/guide/usage/linter/plugins.html
🏁 Script executed:
#!/bin/bash
set -euo pipefail
file="apps/webapp/app/components/dashboard-agent/DashboardAgentChat.tsx"
printf '%s\n' '--- parent source at affected ranges ---'
git show HEAD^:"$file" 2>/dev/null | cat -n | sed -n '115,140p;200,220p;350,420p' || true
printf '%s\n' '--- parent-to-current diff ---'
git diff --unified=3 HEAD^ HEAD -- "$file" 2>/dev/null | sed -n '1,240p' || true
printf '%s\n' '--- Oxlint refs rule documentation ---'
curl -fsSL https://oxc.rs/docs/guide/usage/linter/rules/react/refs.html | \
sed -n '1,220p' | grep -E -i -C 3 'lazy|render|current|disable' || trueRepository: triggerdotdev/trigger.dev
Length of output: 50381
Restore targeted react/refs suppressions for intentional render-time ref access.
react/refs is enabled for this file. Restore the repository’s oxlint-disable-next-line react/refs comments before the six intentional accesses. Keep lazy-initialization writes unsuppressed when they match the rule exception.
Source: MCP tools
| // oxlint-disable-next-line react/set-state-in-effect -- This effect intentionally synchronizes route state after an external or lifecycle change. | ||
| setIsModalOpen(false); | ||
| setShowCreatedSuccessMessage(true); |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟠 Major | ⚡ Quick win
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
set -euo pipefail
file='apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.test.tasks.$taskParam/route.tsx'
awk '
/setIsModalOpen\(false\)/ || /setShowCreatedSuccessMessage\(true\)/ {
if (previous !~ /oxlint-disable-next-line react\/set-state-in-effect/) {
print "Missing suppression before: " $0
exit 1
}
}
{ previous = $0 }
' "$file"
pnpm exec oxlint --deny react/set-state-in-effect --report-unused-disable-directives "$file"Repository: triggerdotdev/trigger.dev
Length of output: 233
🏁 Script executed:
#!/bin/bash
set -euo pipefail
file='apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.test.tasks.$taskParam/route.tsx'
printf '%s\n' '--- relevant source ---'
sed -n '1578,1594p;1768,1784p' "$file"
printf '%s\n' '--- directives and target setters in the file ---'
rg -n -C 2 'oxlint-disable-next-line react/set-state-in-effect|setIsModalOpen\(false\)|setShowCreatedSuccessMessage\(true\)' "$file"
printf '%s\n' '--- local tool availability ---'
command -v oxlint || true
command -v pnpm || trueRepository: triggerdotdev/trigger.dev
Length of output: 2517
🏁 Script executed:
#!/bin/bash
set -u
file='apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.test.tasks.$taskParam/route.tsx'
oxlint --deny react/set-state-in-effect --report-unused-disable-directives "$file"
status=$?
printf '\noxlint exit status: %s\n' "$status"
exit 0Repository: triggerdotdev/trigger.dev
Length of output: 1547
🌐 Web query:
Oxlint ignore comments disable-next-line applies only to the next line rule diagnostic
💡 Result:
Yes, the Oxlint ignore comment // oxlint-disable-next-line applies exclusively to the line immediately following the comment [1]. According to official Oxlint documentation: * // oxlint-disable-next-line disables one or more specified rules only on the line that follows the comment [1]. * The rules are automatically re-enabled for all subsequent lines in the file [1]. This behavior is distinct from other inline directives such as // oxlint-disable-line, which disables rules only for the current line, and // oxlint-disable, which disables rules from the point of the comment until the end of the file or until they are re-enabled [1]. Note that while these comments are designed to control rule diagnostics, there have been historical technical limitations—such as issues with type-aware rules not respecting disable comments [2] or file-scope rules remaining unaffected by certain inline disable directives [3]—though these are generally considered bugs or specific edge cases rather than intended functionality of the disable-next-line directive itself.
Citations:
- 1: https://oxc.rs/docs/guide/usage/linter/ignore-comments.html
- 2: linter: disable comments are not respected by type aware rules oxc-project/oxc#13491
- 3: linter: file-level inline disable comments do not suppress file-scope rules oxc-project/oxc#21072
Add a suppression before setShowCreatedSuccessMessage(true)
The existing oxlint-disable-next-line directive applies only to setIsModalOpen(false). Add a second directive before setShowCreatedSuccessMessage(true).
Summary
Oxlint 1.79 also begins applying the base
no-redeclarerule to ES modules. That rule does not account for TypeScript's separate type and value namespaces, so this disables it for TypeScript files while retaining it for JavaScript.Reference: https://oxc.rs/blog/2026-08-18-react-compiler-support
Validation
pnpm exec oxfmt --check .pnpm run lintpnpm run knippnpm --filter @trigger.dev/sdk run typecheckpnpm --filter @trigger.dev/core run typecheckpnpm --filter @internal/observability-map run typecheck