From d96569890542d2de446fe4dfb78a1cea7aa6dfdf Mon Sep 17 00:00:00 2001 From: Dani Akash Date: Thu, 19 Mar 2026 18:18:24 +0530 Subject: [PATCH] fix: biome & tsc setup across repo (#493) * fix: biome lint issues * fix: code quality workflow * fix: all lint issues * chore: test lefthook pre-commit hook * chore: test lefthook with agent file * chore: revert test comment from lefthook verification * feat: setup tsgo for typechecking agent * fix: typecheck cli command * fix: early return to prevent errors --- .github/workflows/code-quality.yml | 5 +- lefthook.yml | 57 ++++++++ .../apps/agent/components/ui/alert-dialog.tsx | 16 +- .../apps/agent/components/ui/alert.tsx | 2 +- .../apps/agent/components/ui/card.tsx | 8 +- .../apps/agent/components/ui/carousel.tsx | 4 +- .../apps/agent/components/ui/collapsible.tsx | 2 +- .../apps/agent/components/ui/command.tsx | 6 +- .../agent/components/ui/dropdown-menu.tsx | 10 +- .../apps/agent/components/ui/form.tsx | 8 +- .../apps/agent/components/ui/hover-card.tsx | 2 +- .../apps/agent/components/ui/input-group.tsx | 2 +- .../apps/agent/components/ui/popover.tsx | 2 +- .../apps/agent/components/ui/resizable.tsx | 2 +- .../apps/agent/components/ui/sheet.tsx | 8 +- .../apps/agent/components/ui/tabs.tsx | 2 +- .../apps/agent/components/ui/tooltip.tsx | 2 +- .../app/ai-settings/ProviderCard.tsx | 6 +- .../NewScheduledTaskDialog.tsx | 8 +- .../entrypoints/sidepanel/index/ChatInput.tsx | 16 +- .../agent/lib/llm-providers/useOAuthStatus.ts | 1 + .../messaging/schedules/scheduleMessages.ts | 2 +- .../lib/messaging/server/serverMessages.ts | 2 +- .../sidepanel/openSidepanelWithSearch.ts | 2 +- .../apps/agent/lib/voice/useVoiceInput.ts | 9 +- .../browseros-agent/apps/agent/package.json | 4 +- .../browseros-agent/apps/agent/tsconfig.json | 1 - .../apps/eval/src/agents/single-agent.ts | 3 +- .../apps/eval/src/capture/screenshot.ts | 8 +- .../apps/server/src/agent/ai-sdk-agent.ts | 8 +- .../apps/server/src/agent/prompt.ts | 2 +- .../apps/server/src/api/types.ts | 6 +- .../apps/server/src/browser/browser.ts | 9 +- .../apps/server/src/lib/clients/llm/config.ts | 8 +- .../server/src/lib/clients/llm/provider.ts | 2 +- .../src/lib/clients/oauth/callback-server.ts | 9 +- .../src/lib/clients/oauth/codex-fetch.ts | 9 +- .../src/lib/clients/oauth/token-manager.ts | 22 ++- .../browseros-agent/apps/server/src/main.ts | 6 +- .../apps/server/src/skills/loader.ts | 2 +- .../apps/server/src/skills/remote-sync.ts | 16 +- .../apps/server/src/skills/types.ts | 1 - .../apps/server/tests/skills/flows.test.ts | 8 +- .../apps/server/tests/skills/loader.test.ts | 25 +++- .../apps/server/tests/skills/migrate.test.ts | 41 +++++- .../server/tests/skills/remote-sync.test.ts | 138 +++++++++++++----- .../apps/server/tests/skills/service.test.ts | 50 +++++-- packages/browseros-agent/bun.lock | 17 +++ packages/browseros-agent/package.json | 1 + .../scripts/upload-skills-catalog.ts | 5 +- 50 files changed, 416 insertions(+), 169 deletions(-) create mode 100644 lefthook.yml diff --git a/.github/workflows/code-quality.yml b/.github/workflows/code-quality.yml index 7903c061c..d8513cec9 100644 --- a/.github/workflows/code-quality.yml +++ b/.github/workflows/code-quality.yml @@ -5,7 +5,7 @@ on: branches: - main paths: - - 'packages/browseros-agent/**' + - "packages/browseros-agent/**" jobs: biome: @@ -50,6 +50,9 @@ jobs: - name: Install dependencies run: bun ci + - name: Prepare wxt + run: VITE_PUBLIC_BROWSEROS_API=http://localhost:3000 bun run --cwd apps/agent wxt prepare + - name: Run codegen run: bun run --cwd apps/agent codegen diff --git a/lefthook.yml b/lefthook.yml new file mode 100644 index 000000000..ee6c4fb50 --- /dev/null +++ b/lefthook.yml @@ -0,0 +1,57 @@ +commit-msg: + commands: + conventional: + run: | + msg=$(head -1 {1}) + if [[ ! "$msg" =~ ^(feat|fix|docs|style|refactor|perf|test|chore|ci|build|revert)(\(.+\))?\!?:\ .+ ]]; then + echo "Commit message must follow Conventional Commits format:" + echo " (): " + echo " Types: feat, fix, docs, style, refactor, perf, test, chore, ci, build, revert" + echo "" + echo "Examples:" + echo " feat(auth): add OAuth2 support" + echo " fix: resolve null pointer exception" + exit 1 + fi + +pre-commit: + commands: + biome-check: + root: "packages/browseros-agent/" + glob: "*.{js,ts,cjs,mjs,d.cts,d.mts,jsx,tsx,json,jsonc}" + run: npx @biomejs/biome check --write --no-errors-on-unmatched --files-ignore-unknown=true --colors=off {staged_files} + stage_fixed: true + + file-length: + root: "packages/browseros-agent/" + glob: "*.{ts,tsx}" + exclude: "*.{test,spec,d}.ts|*.{test,spec}.tsx|**/__tests__/**|**/tests/**|**/*.generated.*" + run: | + for file in {staged_files}; do + if [[ -f "$file" ]]; then + lines=$(wc -l < "$file" | tr -d ' ') + if [[ $lines -gt 400 ]]; then + echo "⚠️ Warning: $file has $lines lines (threshold: 400)" + echo " Consider splitting this file if it has multiple responsibilities." + fi + fi + done + +pre-push: + commands: + branch-name: + run: | + branch=$(git rev-parse --abbrev-ref HEAD) + if [[ "$branch" == "main" || "$branch" == "master" ]]; then + exit 0 + fi + if [[ ! "$branch" =~ ^(feat|fix|bugfix|hotfix|release|docs|refactor|test|chore|experiment)/[a-z0-9-]+$ ]]; then + echo "⚠️ Warning: Branch name '$branch' doesn't match recommended format." + echo " Use: /" + echo " Types: feat, fix, bugfix, hotfix, release, docs, refactor, test, chore, experiment" + echo " Example: feat/add-auth, fix/login-crash" + echo "" + echo " To rename your branch:" + echo " git branch -m " + echo " git push -u origin " + fi diff --git a/packages/browseros-agent/apps/agent/components/ui/alert-dialog.tsx b/packages/browseros-agent/apps/agent/components/ui/alert-dialog.tsx index a9014d59b..399179d95 100644 --- a/packages/browseros-agent/apps/agent/components/ui/alert-dialog.tsx +++ b/packages/browseros-agent/apps/agent/components/ui/alert-dialog.tsx @@ -176,14 +176,14 @@ function AlertDialogCancel({ export { AlertDialog, - AlertDialogPortal, - AlertDialogOverlay, - AlertDialogTrigger, - AlertDialogContent, - AlertDialogHeader, - AlertDialogFooter, - AlertDialogTitle, - AlertDialogDescription, AlertDialogAction, AlertDialogCancel, + AlertDialogContent, + AlertDialogDescription, + AlertDialogFooter, + AlertDialogHeader, + AlertDialogOverlay, + AlertDialogPortal, + AlertDialogTitle, + AlertDialogTrigger, } diff --git a/packages/browseros-agent/apps/agent/components/ui/alert.tsx b/packages/browseros-agent/apps/agent/components/ui/alert.tsx index a970645ac..dc1275e66 100644 --- a/packages/browseros-agent/apps/agent/components/ui/alert.tsx +++ b/packages/browseros-agent/apps/agent/components/ui/alert.tsx @@ -72,4 +72,4 @@ function AlertDescription({ ) } -export { Alert, AlertTitle, AlertDescription } +export { Alert, AlertDescription, AlertTitle } diff --git a/packages/browseros-agent/apps/agent/components/ui/card.tsx b/packages/browseros-agent/apps/agent/components/ui/card.tsx index 038100742..fc2d00f30 100644 --- a/packages/browseros-agent/apps/agent/components/ui/card.tsx +++ b/packages/browseros-agent/apps/agent/components/ui/card.tsx @@ -104,10 +104,10 @@ function CardFooter({ className, ...props }: React.ComponentProps<'div'>) { export { Card, - CardHeader, - CardFooter, - CardTitle, CardAction, - CardDescription, CardContent, + CardDescription, + CardFooter, + CardHeader, + CardTitle, } diff --git a/packages/browseros-agent/apps/agent/components/ui/carousel.tsx b/packages/browseros-agent/apps/agent/components/ui/carousel.tsx index 92659c686..a5c6e74f4 100644 --- a/packages/browseros-agent/apps/agent/components/ui/carousel.tsx +++ b/packages/browseros-agent/apps/agent/components/ui/carousel.tsx @@ -251,10 +251,10 @@ function CarouselNext({ } export { - type CarouselApi, Carousel, + type CarouselApi, CarouselContent, CarouselItem, - CarouselPrevious, CarouselNext, + CarouselPrevious, } diff --git a/packages/browseros-agent/apps/agent/components/ui/collapsible.tsx b/packages/browseros-agent/apps/agent/components/ui/collapsible.tsx index 6135b7a61..f7df9da9a 100644 --- a/packages/browseros-agent/apps/agent/components/ui/collapsible.tsx +++ b/packages/browseros-agent/apps/agent/components/ui/collapsible.tsx @@ -39,4 +39,4 @@ function CollapsibleContent({ ) } -export { Collapsible, CollapsibleTrigger, CollapsibleContent } +export { Collapsible, CollapsibleContent, CollapsibleTrigger } diff --git a/packages/browseros-agent/apps/agent/components/ui/command.tsx b/packages/browseros-agent/apps/agent/components/ui/command.tsx index 285d348c4..260dfe8a3 100644 --- a/packages/browseros-agent/apps/agent/components/ui/command.tsx +++ b/packages/browseros-agent/apps/agent/components/ui/command.tsx @@ -198,11 +198,11 @@ function CommandShortcut({ export { Command, CommandDialog, - CommandInput, - CommandList, CommandEmpty, CommandGroup, + CommandInput, CommandItem, - CommandShortcut, + CommandList, CommandSeparator, + CommandShortcut, } diff --git a/packages/browseros-agent/apps/agent/components/ui/dropdown-menu.tsx b/packages/browseros-agent/apps/agent/components/ui/dropdown-menu.tsx index 33c1bd0f7..cce45c28a 100644 --- a/packages/browseros-agent/apps/agent/components/ui/dropdown-menu.tsx +++ b/packages/browseros-agent/apps/agent/components/ui/dropdown-menu.tsx @@ -283,18 +283,18 @@ function DropdownMenuSubContent({ export { DropdownMenu, - DropdownMenuPortal, - DropdownMenuTrigger, + DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, - DropdownMenuLabel, DropdownMenuItem, - DropdownMenuCheckboxItem, + DropdownMenuLabel, + DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, - DropdownMenuSubTrigger, DropdownMenuSubContent, + DropdownMenuSubTrigger, + DropdownMenuTrigger, } diff --git a/packages/browseros-agent/apps/agent/components/ui/form.tsx b/packages/browseros-agent/apps/agent/components/ui/form.tsx index 3e3b861e1..63c14fe65 100644 --- a/packages/browseros-agent/apps/agent/components/ui/form.tsx +++ b/packages/browseros-agent/apps/agent/components/ui/form.tsx @@ -179,12 +179,12 @@ function FormMessage({ className, ...props }: React.ComponentProps<'p'>) { } export { - useFormField, Form, - FormItem, - FormLabel, FormControl, FormDescription, - FormMessage, FormField, + FormItem, + FormLabel, + FormMessage, + useFormField, } diff --git a/packages/browseros-agent/apps/agent/components/ui/hover-card.tsx b/packages/browseros-agent/apps/agent/components/ui/hover-card.tsx index 642212876..00da27373 100644 --- a/packages/browseros-agent/apps/agent/components/ui/hover-card.tsx +++ b/packages/browseros-agent/apps/agent/components/ui/hover-card.tsx @@ -50,4 +50,4 @@ function HoverCardContent({ ) } -export { HoverCard, HoverCardTrigger, HoverCardContent } +export { HoverCard, HoverCardContent, HoverCardTrigger } diff --git a/packages/browseros-agent/apps/agent/components/ui/input-group.tsx b/packages/browseros-agent/apps/agent/components/ui/input-group.tsx index c076b9262..c85ce308f 100644 --- a/packages/browseros-agent/apps/agent/components/ui/input-group.tsx +++ b/packages/browseros-agent/apps/agent/components/ui/input-group.tsx @@ -184,7 +184,7 @@ export { InputGroup, InputGroupAddon, InputGroupButton, - InputGroupText, InputGroupInput, + InputGroupText, InputGroupTextarea, } diff --git a/packages/browseros-agent/apps/agent/components/ui/popover.tsx b/packages/browseros-agent/apps/agent/components/ui/popover.tsx index 706d0dc87..520434a4c 100644 --- a/packages/browseros-agent/apps/agent/components/ui/popover.tsx +++ b/packages/browseros-agent/apps/agent/components/ui/popover.tsx @@ -55,4 +55,4 @@ function PopoverAnchor({ return } -export { Popover, PopoverTrigger, PopoverContent, PopoverAnchor } +export { Popover, PopoverAnchor, PopoverContent, PopoverTrigger } diff --git a/packages/browseros-agent/apps/agent/components/ui/resizable.tsx b/packages/browseros-agent/apps/agent/components/ui/resizable.tsx index fe30c4562..0f4275e5d 100644 --- a/packages/browseros-agent/apps/agent/components/ui/resizable.tsx +++ b/packages/browseros-agent/apps/agent/components/ui/resizable.tsx @@ -49,4 +49,4 @@ function ResizableHandle({ ) } -export { ResizablePanelGroup, ResizablePanel, ResizableHandle } +export { ResizableHandle, ResizablePanel, ResizablePanelGroup } diff --git a/packages/browseros-agent/apps/agent/components/ui/sheet.tsx b/packages/browseros-agent/apps/agent/components/ui/sheet.tsx index b5a294c8d..c4556773b 100644 --- a/packages/browseros-agent/apps/agent/components/ui/sheet.tsx +++ b/packages/browseros-agent/apps/agent/components/ui/sheet.tsx @@ -129,11 +129,11 @@ function SheetDescription({ export { Sheet, - SheetTrigger, SheetClose, SheetContent, - SheetHeader, - SheetFooter, - SheetTitle, SheetDescription, + SheetFooter, + SheetHeader, + SheetTitle, + SheetTrigger, } diff --git a/packages/browseros-agent/apps/agent/components/ui/tabs.tsx b/packages/browseros-agent/apps/agent/components/ui/tabs.tsx index 15596ed6d..2e9d934b7 100644 --- a/packages/browseros-agent/apps/agent/components/ui/tabs.tsx +++ b/packages/browseros-agent/apps/agent/components/ui/tabs.tsx @@ -86,4 +86,4 @@ function TabsContent({ ) } -export { Tabs, TabsList, TabsTrigger, TabsContent, tabsListVariants } +export { Tabs, TabsContent, TabsList, TabsTrigger, tabsListVariants } diff --git a/packages/browseros-agent/apps/agent/components/ui/tooltip.tsx b/packages/browseros-agent/apps/agent/components/ui/tooltip.tsx index 0277aa079..927e20a49 100644 --- a/packages/browseros-agent/apps/agent/components/ui/tooltip.tsx +++ b/packages/browseros-agent/apps/agent/components/ui/tooltip.tsx @@ -68,4 +68,4 @@ function TooltipContent({ ) } -export { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider } +export { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } diff --git a/packages/browseros-agent/apps/agent/entrypoints/app/ai-settings/ProviderCard.tsx b/packages/browseros-agent/apps/agent/entrypoints/app/ai-settings/ProviderCard.tsx index 44e4a2747..273621b1c 100644 --- a/packages/browseros-agent/apps/agent/entrypoints/app/ai-settings/ProviderCard.tsx +++ b/packages/browseros-agent/apps/agent/entrypoints/app/ai-settings/ProviderCard.tsx @@ -103,10 +103,10 @@ export const ProviderCard: FC = ({ for better performance. ) + ) : provider.baseUrl ? ( + `${provider.modelId} • ${provider.baseUrl}` ) : ( - provider.baseUrl - ? `${provider.modelId} • ${provider.baseUrl}` - : provider.modelId + provider.modelId )}

diff --git a/packages/browseros-agent/apps/agent/entrypoints/app/scheduled-tasks/NewScheduledTaskDialog.tsx b/packages/browseros-agent/apps/agent/entrypoints/app/scheduled-tasks/NewScheduledTaskDialog.tsx index 991058632..2c57992eb 100644 --- a/packages/browseros-agent/apps/agent/entrypoints/app/scheduled-tasks/NewScheduledTaskDialog.tsx +++ b/packages/browseros-agent/apps/agent/entrypoints/app/scheduled-tasks/NewScheduledTaskDialog.tsx @@ -3,6 +3,7 @@ import { ChevronDown, Loader2, Sparkles, Undo2 } from 'lucide-react' import type { FC } from 'react' import { useEffect, useRef, useState } from 'react' import { useForm } from 'react-hook-form' +import { toast } from 'sonner' import { z } from 'zod/v3' import { ChatProviderSelector } from '@/components/chat/ChatProviderSelector' import type { Provider } from '@/components/chat/chatComponentTypes' @@ -34,16 +35,15 @@ import { SelectValue, } from '@/components/ui/select' import { Textarea } from '@/components/ui/textarea' +import { SCHEDULED_TASK_PROMPT_REFINED_EVENT } from '@/lib/constants/analyticsEvents' import { BrowserOSIcon, ProviderIcon } from '@/lib/llm-providers/providerIcons' import { defaultProviderIdStorage, providersStorage, } from '@/lib/llm-providers/storage' import type { LlmProviderConfig, ProviderType } from '@/lib/llm-providers/types' -import { SCHEDULED_TASK_PROMPT_REFINED_EVENT } from '@/lib/constants/analyticsEvents' import { track } from '@/lib/metrics/track' import { refinePrompt } from '@/lib/schedules/refine-prompt' -import { toast } from 'sonner' import type { ScheduledJob } from './types' const formSchema = z @@ -291,7 +291,7 @@ export const NewScheduledTaskDialog: FC = ({ type="button" variant="ghost" size="sm" - className="h-auto gap-1 px-2 py-1 text-xs text-muted-foreground" + className="h-auto gap-1 px-2 py-1 text-muted-foreground text-xs" disabled={!queryValue?.trim() || isRefining} onClick={handleRefinePrompt} > @@ -322,7 +322,7 @@ export const NewScheduledTaskDialog: FC = ({ {!isRefining && originalPromptRef.current !== null ? ( @@ -317,7 +321,9 @@ export const ChatInput = forwardRef( return (