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 (