ucode-agent 1.5.0 → 1.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/README.md +53 -1
  2. package/package.json +3 -1
  3. package/skills/ui-ux/SKILL.md +2 -2
  4. package/src/core/doctor.js +122 -0
  5. package/src/core/loop.js +301 -12
  6. package/src/core/provider.js +93 -10
  7. package/src/core/stuck.js +269 -0
  8. package/src/tools/browser.js +121 -59
  9. package/src/tools/deploy.js +283 -0
  10. package/src/tools/files.js +91 -8
  11. package/src/tools/index.js +44 -10
  12. package/src/tools/scaffold.js +61 -1
  13. package/src/tools/shell.js +89 -1
  14. package/src/ui/activity.js +203 -0
  15. package/src/ui/plain.js +22 -3
  16. package/src/ui/screen.js +65 -19
  17. package/templates/next-shadcn/TEMPLATE.md +53 -9
  18. package/templates/next-shadcn/_package-lock.json +1335 -148
  19. package/templates/next-shadcn/components.json +1 -1
  20. package/templates/next-shadcn/next.config.ts +2 -1
  21. package/templates/next-shadcn/package.json +4 -2
  22. package/templates/next-shadcn/presets/citrus.json +77 -0
  23. package/templates/next-shadcn/presets/graphite.json +77 -0
  24. package/templates/next-shadcn/presets/grove.json +77 -0
  25. package/templates/next-shadcn/presets/ocean.json +78 -0
  26. package/templates/next-shadcn/presets/sunset.json +77 -0
  27. package/templates/next-shadcn/presets/violet.json +77 -0
  28. package/templates/next-shadcn/src/components/ui/accordion.tsx +80 -0
  29. package/templates/next-shadcn/src/components/ui/alert-dialog.tsx +34 -22
  30. package/templates/next-shadcn/src/components/ui/avatar.tsx +7 -4
  31. package/templates/next-shadcn/src/components/ui/badge.tsx +15 -18
  32. package/templates/next-shadcn/src/components/ui/button.tsx +12 -3
  33. package/templates/next-shadcn/src/components/ui/calendar.tsx +1 -0
  34. package/templates/next-shadcn/src/components/ui/checkbox.tsx +6 -2
  35. package/templates/next-shadcn/src/components/ui/collapsible.tsx +33 -0
  36. package/templates/next-shadcn/src/components/ui/command.tsx +1 -2
  37. package/templates/next-shadcn/src/components/ui/dialog.tsx +34 -26
  38. package/templates/next-shadcn/src/components/ui/dropdown-menu.tsx +115 -114
  39. package/templates/next-shadcn/src/components/ui/hover-card.tsx +43 -0
  40. package/templates/next-shadcn/src/components/ui/input-group.tsx +2 -4
  41. package/templates/next-shadcn/src/components/ui/input.tsx +1 -2
  42. package/templates/next-shadcn/src/components/ui/label.tsx +6 -2
  43. package/templates/next-shadcn/src/components/ui/popover.tsx +27 -28
  44. package/templates/next-shadcn/src/components/ui/progress.tsx +11 -63
  45. package/templates/next-shadcn/src/components/ui/radio-group.tsx +43 -0
  46. package/templates/next-shadcn/src/components/ui/scroll-area.tsx +6 -6
  47. package/templates/next-shadcn/src/components/ui/select.tsx +55 -64
  48. package/templates/next-shadcn/src/components/ui/separator.tsx +6 -3
  49. package/templates/next-shadcn/src/components/ui/sheet.tsx +35 -26
  50. package/templates/next-shadcn/src/components/ui/slider.tsx +58 -0
  51. package/templates/next-shadcn/src/components/ui/switch.tsx +3 -2
  52. package/templates/next-shadcn/src/components/ui/table.tsx +115 -0
  53. package/templates/next-shadcn/src/components/ui/tabs.tsx +16 -8
  54. package/templates/next-shadcn/src/components/ui/toggle-group.tsx +89 -0
  55. package/templates/next-shadcn/src/components/ui/toggle.tsx +46 -0
  56. package/templates/next-shadcn/src/components/ui/tooltip.tsx +24 -33
  57. package/templates/next-shadcn/src/lib/utils.ts +6 -1
  58. package/ucode.js +8 -1
@@ -1,22 +1,28 @@
1
1
  "use client"
2
2
 
3
3
  import * as React from "react"
4
- import { AlertDialog as AlertDialogPrimitive } from "@base-ui/react/alert-dialog"
5
4
  import { cn } from "cn"
5
+ import { AlertDialog as AlertDialogPrimitive } from "radix-ui"
6
6
 
7
7
  import { Button } from "@/components/ui/button"
8
8
 
9
- function AlertDialog({ ...props }: AlertDialogPrimitive.Root.Props) {
9
+ function AlertDialog({
10
+ ...props
11
+ }: React.ComponentProps<typeof AlertDialogPrimitive.Root>) {
10
12
  return <AlertDialogPrimitive.Root data-slot="alert-dialog" {...props} />
11
13
  }
12
14
 
13
- function AlertDialogTrigger({ ...props }: AlertDialogPrimitive.Trigger.Props) {
15
+ function AlertDialogTrigger({
16
+ ...props
17
+ }: React.ComponentProps<typeof AlertDialogPrimitive.Trigger>) {
14
18
  return (
15
19
  <AlertDialogPrimitive.Trigger data-slot="alert-dialog-trigger" {...props} />
16
20
  )
17
21
  }
18
22
 
19
- function AlertDialogPortal({ ...props }: AlertDialogPrimitive.Portal.Props) {
23
+ function AlertDialogPortal({
24
+ ...props
25
+ }: React.ComponentProps<typeof AlertDialogPrimitive.Portal>) {
20
26
  return (
21
27
  <AlertDialogPrimitive.Portal data-slot="alert-dialog-portal" {...props} />
22
28
  )
@@ -25,12 +31,12 @@ function AlertDialogPortal({ ...props }: AlertDialogPrimitive.Portal.Props) {
25
31
  function AlertDialogOverlay({
26
32
  className,
27
33
  ...props
28
- }: AlertDialogPrimitive.Backdrop.Props) {
34
+ }: React.ComponentProps<typeof AlertDialogPrimitive.Overlay>) {
29
35
  return (
30
- <AlertDialogPrimitive.Backdrop
36
+ <AlertDialogPrimitive.Overlay
31
37
  data-slot="alert-dialog-overlay"
32
38
  className={cn(
33
- "fixed inset-0 isolate z-50 bg-black/10 duration-100 supports-backdrop-filter:backdrop-blur-xs data-open:animate-in data-open:fade-in-0 data-closed:animate-out data-closed:fade-out-0",
39
+ "fixed inset-0 z-50 bg-black/10 duration-100 supports-backdrop-filter:backdrop-blur-xs data-open:animate-in data-open:fade-in-0 data-closed:animate-out data-closed:fade-out-0",
34
40
  className
35
41
  )}
36
42
  {...props}
@@ -42,13 +48,13 @@ function AlertDialogContent({
42
48
  className,
43
49
  size = "default",
44
50
  ...props
45
- }: AlertDialogPrimitive.Popup.Props & {
51
+ }: React.ComponentProps<typeof AlertDialogPrimitive.Content> & {
46
52
  size?: "default" | "sm"
47
53
  }) {
48
54
  return (
49
55
  <AlertDialogPortal>
50
56
  <AlertDialogOverlay />
51
- <AlertDialogPrimitive.Popup
57
+ <AlertDialogPrimitive.Content
52
58
  data-slot="alert-dialog-content"
53
59
  data-size={size}
54
60
  className={cn(
@@ -143,14 +149,19 @@ function AlertDialogDescription({
143
149
 
144
150
  function AlertDialogAction({
145
151
  className,
152
+ variant = "default",
153
+ size = "default",
146
154
  ...props
147
- }: React.ComponentProps<typeof Button>) {
155
+ }: React.ComponentProps<typeof AlertDialogPrimitive.Action> &
156
+ Pick<React.ComponentProps<typeof Button>, "variant" | "size">) {
148
157
  return (
149
- <Button
150
- data-slot="alert-dialog-action"
151
- className={cn(className)}
152
- {...props}
153
- />
158
+ <Button variant={variant} size={size} asChild>
159
+ <AlertDialogPrimitive.Action
160
+ data-slot="alert-dialog-action"
161
+ className={cn(className)}
162
+ {...props}
163
+ />
164
+ </Button>
154
165
  )
155
166
  }
156
167
 
@@ -159,15 +170,16 @@ function AlertDialogCancel({
159
170
  variant = "outline",
160
171
  size = "default",
161
172
  ...props
162
- }: AlertDialogPrimitive.Close.Props &
173
+ }: React.ComponentProps<typeof AlertDialogPrimitive.Cancel> &
163
174
  Pick<React.ComponentProps<typeof Button>, "variant" | "size">) {
164
175
  return (
165
- <AlertDialogPrimitive.Close
166
- data-slot="alert-dialog-cancel"
167
- className={cn(className)}
168
- render={<Button variant={variant} size={size} />}
169
- {...props}
170
- />
176
+ <Button variant={variant} size={size} asChild>
177
+ <AlertDialogPrimitive.Cancel
178
+ data-slot="alert-dialog-cancel"
179
+ className={cn(className)}
180
+ {...props}
181
+ />
182
+ </Button>
171
183
  )
172
184
  }
173
185
 
@@ -1,14 +1,14 @@
1
1
  "use client"
2
2
 
3
3
  import * as React from "react"
4
- import { Avatar as AvatarPrimitive } from "@base-ui/react/avatar"
5
4
  import { cn } from "cn"
5
+ import { Avatar as AvatarPrimitive } from "radix-ui"
6
6
 
7
7
  function Avatar({
8
8
  className,
9
9
  size = "default",
10
10
  ...props
11
- }: AvatarPrimitive.Root.Props & {
11
+ }: React.ComponentProps<typeof AvatarPrimitive.Root> & {
12
12
  size?: "default" | "sm" | "lg"
13
13
  }) {
14
14
  return (
@@ -24,7 +24,10 @@ function Avatar({
24
24
  )
25
25
  }
26
26
 
27
- function AvatarImage({ className, ...props }: AvatarPrimitive.Image.Props) {
27
+ function AvatarImage({
28
+ className,
29
+ ...props
30
+ }: React.ComponentProps<typeof AvatarPrimitive.Image>) {
28
31
  return (
29
32
  <AvatarPrimitive.Image
30
33
  data-slot="avatar-image"
@@ -40,7 +43,7 @@ function AvatarImage({ className, ...props }: AvatarPrimitive.Image.Props) {
40
43
  function AvatarFallback({
41
44
  className,
42
45
  ...props
43
- }: AvatarPrimitive.Fallback.Props) {
46
+ }: React.ComponentProps<typeof AvatarPrimitive.Fallback>) {
44
47
  return (
45
48
  <AvatarPrimitive.Fallback
46
49
  data-slot="avatar-fallback"
@@ -1,7 +1,7 @@
1
- import { mergeProps } from "@base-ui/react/merge-props"
2
- import { useRender } from "@base-ui/react/use-render"
1
+ import * as React from "react"
3
2
  import { cva, type VariantProps } from "class-variance-authority"
4
3
  import { cn } from "cn"
4
+ import { Slot } from "radix-ui"
5
5
 
6
6
  const badgeVariants = cva(
7
7
  "group/badge inline-flex h-5 w-fit shrink-0 items-center justify-center gap-1 overflow-hidden rounded-4xl border border-transparent px-2 py-0.5 text-xs font-medium whitespace-nowrap transition-all focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 [&>svg]:pointer-events-none [&>svg]:size-3!",
@@ -29,23 +29,20 @@ const badgeVariants = cva(
29
29
  function Badge({
30
30
  className,
31
31
  variant = "default",
32
- render,
32
+ asChild = false,
33
33
  ...props
34
- }: useRender.ComponentProps<"span"> & VariantProps<typeof badgeVariants>) {
35
- return useRender({
36
- defaultTagName: "span",
37
- props: mergeProps<"span">(
38
- {
39
- className: cn(badgeVariants({ variant }), className),
40
- },
41
- props
42
- ),
43
- render,
44
- state: {
45
- slot: "badge",
46
- variant,
47
- },
48
- })
34
+ }: React.ComponentProps<"span"> &
35
+ VariantProps<typeof badgeVariants> & { asChild?: boolean }) {
36
+ const Comp = asChild ? Slot.Root : "span"
37
+
38
+ return (
39
+ <Comp
40
+ data-slot="badge"
41
+ data-variant={variant}
42
+ className={cn(badgeVariants({ variant }), className)}
43
+ {...props}
44
+ />
45
+ )
49
46
  }
50
47
 
51
48
  export { Badge, badgeVariants }
@@ -1,6 +1,7 @@
1
- import { Button as ButtonPrimitive } from "@base-ui/react/button"
1
+ import * as React from "react"
2
2
  import { cva, type VariantProps } from "class-variance-authority"
3
3
  import { cn } from "cn"
4
+ import { Slot } from "radix-ui"
4
5
 
5
6
  const buttonVariants = cva(
6
7
  "group/button inline-flex shrink-0 items-center justify-center rounded-lg border border-transparent bg-clip-padding text-sm font-medium whitespace-nowrap transition-all outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 active:not-aria-[haspopup]:translate-y-px disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
@@ -43,11 +44,19 @@ function Button({
43
44
  className,
44
45
  variant = "default",
45
46
  size = "default",
47
+ asChild = false,
46
48
  ...props
47
- }: ButtonPrimitive.Props & VariantProps<typeof buttonVariants>) {
49
+ }: React.ComponentProps<"button"> &
50
+ VariantProps<typeof buttonVariants> & {
51
+ asChild?: boolean
52
+ }) {
53
+ const Comp = asChild ? Slot.Root : "button"
54
+
48
55
  return (
49
- <ButtonPrimitive
56
+ <Comp
50
57
  data-slot="button"
58
+ data-variant={variant}
59
+ data-size={size}
51
60
  className={cn(buttonVariants({ variant, size, className }))}
52
61
  {...props}
53
62
  />
@@ -196,6 +196,7 @@ function CalendarDayButton({
196
196
 
197
197
  return (
198
198
  <Button
199
+ ref={ref}
199
200
  variant="ghost"
200
201
  size="icon"
201
202
  data-day={day.date.toLocaleDateString(locale?.code)}
@@ -1,10 +1,14 @@
1
1
  "use client"
2
2
 
3
- import { Checkbox as CheckboxPrimitive } from "@base-ui/react/checkbox"
3
+ import * as React from "react"
4
4
  import { cn } from "cn"
5
+ import { Checkbox as CheckboxPrimitive } from "radix-ui"
5
6
  import { CheckIcon } from "lucide-react"
6
7
 
7
- function Checkbox({ className, ...props }: CheckboxPrimitive.Root.Props) {
8
+ function Checkbox({
9
+ className,
10
+ ...props
11
+ }: React.ComponentProps<typeof CheckboxPrimitive.Root>) {
8
12
  return (
9
13
  <CheckboxPrimitive.Root
10
14
  data-slot="checkbox"
@@ -0,0 +1,33 @@
1
+ "use client"
2
+
3
+ import { Collapsible as CollapsiblePrimitive } from "radix-ui"
4
+
5
+ function Collapsible({
6
+ ...props
7
+ }: React.ComponentProps<typeof CollapsiblePrimitive.Root>) {
8
+ return <CollapsiblePrimitive.Root data-slot="collapsible" {...props} />
9
+ }
10
+
11
+ function CollapsibleTrigger({
12
+ ...props
13
+ }: React.ComponentProps<typeof CollapsiblePrimitive.CollapsibleTrigger>) {
14
+ return (
15
+ <CollapsiblePrimitive.CollapsibleTrigger
16
+ data-slot="collapsible-trigger"
17
+ {...props}
18
+ />
19
+ )
20
+ }
21
+
22
+ function CollapsibleContent({
23
+ ...props
24
+ }: React.ComponentProps<typeof CollapsiblePrimitive.CollapsibleContent>) {
25
+ return (
26
+ <CollapsiblePrimitive.CollapsibleContent
27
+ data-slot="collapsible-content"
28
+ {...props}
29
+ />
30
+ )
31
+ }
32
+
33
+ export { Collapsible, CollapsibleTrigger, CollapsibleContent }
@@ -40,12 +40,11 @@ function CommandDialog({
40
40
  className,
41
41
  showCloseButton = false,
42
42
  ...props
43
- }: Omit<React.ComponentProps<typeof Dialog>, "children"> & {
43
+ }: React.ComponentProps<typeof Dialog> & {
44
44
  title?: string
45
45
  description?: string
46
46
  className?: string
47
47
  showCloseButton?: boolean
48
- children: React.ReactNode
49
48
  }) {
50
49
  return (
51
50
  <Dialog {...props}>
@@ -1,34 +1,42 @@
1
1
  "use client"
2
2
 
3
3
  import * as React from "react"
4
- import { Dialog as DialogPrimitive } from "@base-ui/react/dialog"
5
4
  import { cn } from "cn"
5
+ import { Dialog as DialogPrimitive } from "radix-ui"
6
6
 
7
7
  import { Button } from "@/components/ui/button"
8
8
  import { XIcon } from "lucide-react"
9
9
 
10
- function Dialog({ ...props }: DialogPrimitive.Root.Props) {
10
+ function Dialog({
11
+ ...props
12
+ }: React.ComponentProps<typeof DialogPrimitive.Root>) {
11
13
  return <DialogPrimitive.Root data-slot="dialog" {...props} />
12
14
  }
13
15
 
14
- function DialogTrigger({ ...props }: DialogPrimitive.Trigger.Props) {
16
+ function DialogTrigger({
17
+ ...props
18
+ }: React.ComponentProps<typeof DialogPrimitive.Trigger>) {
15
19
  return <DialogPrimitive.Trigger data-slot="dialog-trigger" {...props} />
16
20
  }
17
21
 
18
- function DialogPortal({ ...props }: DialogPrimitive.Portal.Props) {
22
+ function DialogPortal({
23
+ ...props
24
+ }: React.ComponentProps<typeof DialogPrimitive.Portal>) {
19
25
  return <DialogPrimitive.Portal data-slot="dialog-portal" {...props} />
20
26
  }
21
27
 
22
- function DialogClose({ ...props }: DialogPrimitive.Close.Props) {
28
+ function DialogClose({
29
+ ...props
30
+ }: React.ComponentProps<typeof DialogPrimitive.Close>) {
23
31
  return <DialogPrimitive.Close data-slot="dialog-close" {...props} />
24
32
  }
25
33
 
26
34
  function DialogOverlay({
27
35
  className,
28
36
  ...props
29
- }: DialogPrimitive.Backdrop.Props) {
37
+ }: React.ComponentProps<typeof DialogPrimitive.Overlay>) {
30
38
  return (
31
- <DialogPrimitive.Backdrop
39
+ <DialogPrimitive.Overlay
32
40
  data-slot="dialog-overlay"
33
41
  className={cn(
34
42
  "fixed inset-0 isolate z-50 bg-black/10 duration-100 supports-backdrop-filter:backdrop-blur-xs data-open:animate-in data-open:fade-in-0 data-closed:animate-out data-closed:fade-out-0",
@@ -44,13 +52,13 @@ function DialogContent({
44
52
  children,
45
53
  showCloseButton = true,
46
54
  ...props
47
- }: DialogPrimitive.Popup.Props & {
55
+ }: React.ComponentProps<typeof DialogPrimitive.Content> & {
48
56
  showCloseButton?: boolean
49
57
  }) {
50
58
  return (
51
59
  <DialogPortal>
52
60
  <DialogOverlay />
53
- <DialogPrimitive.Popup
61
+ <DialogPrimitive.Content
54
62
  data-slot="dialog-content"
55
63
  className={cn(
56
64
  "fixed top-1/2 left-1/2 z-50 grid w-full max-w-[calc(100%-2rem)] -translate-x-1/2 -translate-y-1/2 gap-4 rounded-xl bg-popover p-4 text-sm text-popover-foreground ring-1 ring-foreground/10 duration-100 outline-none sm:max-w-sm data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95",
@@ -60,22 +68,19 @@ function DialogContent({
60
68
  >
61
69
  {children}
62
70
  {showCloseButton && (
63
- <DialogPrimitive.Close
64
- data-slot="dialog-close"
65
- render={
66
- <Button
67
- variant="ghost"
68
- className="absolute top-2 right-2"
69
- size="icon-sm"
71
+ <DialogPrimitive.Close data-slot="dialog-close" asChild>
72
+ <Button
73
+ variant="ghost"
74
+ className="absolute top-2 right-2"
75
+ size="icon-sm"
76
+ >
77
+ <XIcon
70
78
  />
71
- }
72
- >
73
- <XIcon
74
- />
75
- <span className="sr-only">Close</span>
79
+ <span className="sr-only">Close</span>
80
+ </Button>
76
81
  </DialogPrimitive.Close>
77
82
  )}
78
- </DialogPrimitive.Popup>
83
+ </DialogPrimitive.Content>
79
84
  </DialogPortal>
80
85
  )
81
86
  }
@@ -109,15 +114,18 @@ function DialogFooter({
109
114
  >
110
115
  {children}
111
116
  {showCloseButton && (
112
- <DialogPrimitive.Close render={<Button variant="outline" />}>
113
- Close
117
+ <DialogPrimitive.Close asChild>
118
+ <Button variant="outline">Close</Button>
114
119
  </DialogPrimitive.Close>
115
120
  )}
116
121
  </div>
117
122
  )
118
123
  }
119
124
 
120
- function DialogTitle({ className, ...props }: DialogPrimitive.Title.Props) {
125
+ function DialogTitle({
126
+ className,
127
+ ...props
128
+ }: React.ComponentProps<typeof DialogPrimitive.Title>) {
121
129
  return (
122
130
  <DialogPrimitive.Title
123
131
  data-slot="dialog-title"
@@ -133,7 +141,7 @@ function DialogTitle({ className, ...props }: DialogPrimitive.Title.Props) {
133
141
  function DialogDescription({
134
142
  className,
135
143
  ...props
136
- }: DialogPrimitive.Description.Props) {
144
+ }: React.ComponentProps<typeof DialogPrimitive.Description>) {
137
145
  return (
138
146
  <DialogPrimitive.Description
139
147
  data-slot="dialog-description"