@nomad-e/bluma-cli 0.14.1 → 0.16.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 (64) hide show
  1. package/dist/config/native_tools.json +15 -3
  2. package/dist/main.js +0 -1
  3. package/dist/scaffold/.eslintrc.json +3 -0
  4. package/dist/scaffold/app/globals.css +46 -0
  5. package/dist/scaffold/app/layout.tsx +19 -0
  6. package/dist/scaffold/app/page.tsx +124 -0
  7. package/dist/scaffold/components/ui/README.md +12 -0
  8. package/dist/scaffold/components/ui/accordion.jsx +42 -0
  9. package/dist/scaffold/components/ui/alert-dialog.jsx +80 -0
  10. package/dist/scaffold/components/ui/alert.jsx +33 -0
  11. package/dist/scaffold/components/ui/aspect-ratio.jsx +5 -0
  12. package/dist/scaffold/components/ui/avatar.jsx +28 -0
  13. package/dist/scaffold/components/ui/badge.jsx +24 -0
  14. package/dist/scaffold/components/ui/breadcrumb.jsx +72 -0
  15. package/dist/scaffold/components/ui/button.jsx +40 -0
  16. package/dist/scaffold/components/ui/calendar.jsx +56 -0
  17. package/dist/scaffold/components/ui/card.jsx +38 -0
  18. package/dist/scaffold/components/ui/carousel.jsx +168 -0
  19. package/dist/scaffold/components/ui/chart.jsx +76 -0
  20. package/dist/scaffold/components/ui/checkbox.jsx +22 -0
  21. package/dist/scaffold/components/ui/collapsible.jsx +7 -0
  22. package/dist/scaffold/components/ui/command.jsx +100 -0
  23. package/dist/scaffold/components/ui/context-menu.jsx +137 -0
  24. package/dist/scaffold/components/ui/dialog.jsx +72 -0
  25. package/dist/scaffold/components/ui/drawer.jsx +68 -0
  26. package/dist/scaffold/components/ui/dropdown-menu.jsx +143 -0
  27. package/dist/scaffold/components/ui/form.jsx +88 -0
  28. package/dist/scaffold/components/ui/hover-card.jsx +22 -0
  29. package/dist/scaffold/components/ui/input-otp.jsx +49 -0
  30. package/dist/scaffold/components/ui/input.jsx +19 -0
  31. package/dist/scaffold/components/ui/label.jsx +15 -0
  32. package/dist/scaffold/components/ui/menubar.jsx +161 -0
  33. package/dist/scaffold/components/ui/navigation-menu.jsx +95 -0
  34. package/dist/scaffold/components/ui/pagination.jsx +77 -0
  35. package/dist/scaffold/components/ui/popover.jsx +25 -0
  36. package/dist/scaffold/components/ui/progress.jsx +19 -0
  37. package/dist/scaffold/components/ui/radio-group.jsx +29 -0
  38. package/dist/scaffold/components/ui/resizable.jsx +27 -0
  39. package/dist/scaffold/components/ui/scroll-area.jsx +31 -0
  40. package/dist/scaffold/components/ui/select.jsx +117 -0
  41. package/dist/scaffold/components/ui/separator.jsx +22 -0
  42. package/dist/scaffold/components/ui/sheet.jsx +81 -0
  43. package/dist/scaffold/components/ui/skeleton.jsx +7 -0
  44. package/dist/scaffold/components/ui/slider.jsx +19 -0
  45. package/dist/scaffold/components/ui/sonner.jsx +22 -0
  46. package/dist/scaffold/components/ui/switch.jsx +23 -0
  47. package/dist/scaffold/components/ui/table.jsx +61 -0
  48. package/dist/scaffold/components/ui/tabs.jsx +43 -0
  49. package/dist/scaffold/components/ui/textarea.jsx +18 -0
  50. package/dist/scaffold/components/ui/toast.jsx +85 -0
  51. package/dist/scaffold/components/ui/toaster.jsx +33 -0
  52. package/dist/scaffold/components/ui/toggle-group.jsx +41 -0
  53. package/dist/scaffold/components/ui/toggle.jsx +30 -0
  54. package/dist/scaffold/components/ui/tooltip.jsx +22 -0
  55. package/dist/scaffold/hooks/use-toast.ts +101 -0
  56. package/dist/scaffold/lib/utils.ts +6 -0
  57. package/dist/scaffold/next.config.js +5 -0
  58. package/dist/scaffold/next.config.mjs +15 -0
  59. package/dist/scaffold/next.config.ts +19 -0
  60. package/dist/scaffold/package.json +70 -0
  61. package/dist/scaffold/postcss.config.js +6 -0
  62. package/dist/scaffold/tailwind.config.ts +57 -0
  63. package/dist/scaffold/tsconfig.json +20 -0
  64. package/package.json +1 -1
@@ -0,0 +1,33 @@
1
+ import {
2
+ Toast,
3
+ ToastClose,
4
+ ToastDescription,
5
+ ToastProvider,
6
+ ToastTitle,
7
+ ToastViewport,
8
+ } from '@/components/ui/toast';
9
+ import { useToast } from '@/hooks/use-toast';
10
+
11
+ function Toaster() {
12
+ const { toasts } = useToast();
13
+
14
+ return (
15
+ <ToastProvider>
16
+ {toasts.map(function ({ id, title, description, action, open, onOpenChange, ...props }) {
17
+ return (
18
+ <Toast key={id} open={open} onOpenChange={onOpenChange} {...props}>
19
+ <div className="grid gap-1">
20
+ {title && <ToastTitle>{title}</ToastTitle>}
21
+ {description && <ToastDescription>{description}</ToastDescription>}
22
+ </div>
23
+ {action}
24
+ <ToastClose />
25
+ </Toast>
26
+ );
27
+ })}
28
+ <ToastViewport />
29
+ </ToastProvider>
30
+ );
31
+ }
32
+
33
+ export { Toaster };
@@ -0,0 +1,41 @@
1
+ import * as React from 'react';
2
+ import * as ToggleGroupPrimitive from '@radix-ui/react-toggle-group';
3
+ import { cn } from '@/lib/utils';
4
+ import { toggleVariants } from '@/components/ui/toggle';
5
+
6
+ const ToggleGroupContext = React.createContext({ size: 'default', variant: 'default' });
7
+
8
+ const ToggleGroup = React.forwardRef(({ className, variant, size, children, ...props }, ref) => (
9
+ <ToggleGroupPrimitive.Root
10
+ ref={ref}
11
+ className={cn('flex items-center justify-center gap-1', className)}
12
+ {...props}
13
+ >
14
+ <ToggleGroupContext.Provider value={{ variant, size }}>{children}</ToggleGroupContext.Provider>
15
+ </ToggleGroupPrimitive.Root>
16
+ ));
17
+
18
+ ToggleGroup.displayName = ToggleGroupPrimitive.Root.displayName;
19
+
20
+ const ToggleGroupItem = React.forwardRef(({ className, children, ...props }, ref) => {
21
+ const context = React.useContext(ToggleGroupContext);
22
+ return (
23
+ <ToggleGroupPrimitive.Item
24
+ ref={ref}
25
+ className={cn(
26
+ toggleVariants({
27
+ variant: context.variant,
28
+ size: context.size,
29
+ }),
30
+ className
31
+ )}
32
+ {...props}
33
+ >
34
+ {children}
35
+ </ToggleGroupPrimitive.Item>
36
+ );
37
+ });
38
+
39
+ ToggleGroupItem.displayName = ToggleGroupPrimitive.Item.displayName;
40
+
41
+ export { ToggleGroup, ToggleGroupItem };
@@ -0,0 +1,30 @@
1
+ import * as React from 'react';
2
+ import * as TogglePrimitive from '@radix-ui/react-toggle';
3
+ import { cva } from 'class-variance-authority';
4
+ import { cn } from '@/lib/utils';
5
+
6
+ const toggleVariants = cva(
7
+ 'inline-flex items-center justify-center rounded-md text-sm font-medium ring-offset-background transition-colors hover:bg-muted hover:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 data-[state=on]:bg-accent data-[state=on]:text-accent-foreground',
8
+ {
9
+ variants: {
10
+ variant: {
11
+ default: 'bg-transparent',
12
+ outline: 'border border-input bg-transparent hover:bg-accent hover:text-accent-foreground',
13
+ },
14
+ size: {
15
+ default: 'h-10 px-3',
16
+ sm: 'h-9 px-2.5',
17
+ lg: 'h-11 px-5',
18
+ },
19
+ },
20
+ defaultVariants: { variant: 'default', size: 'default' },
21
+ }
22
+ );
23
+
24
+ const Toggle = React.forwardRef(({ className, variant, size, ...props }, ref) => (
25
+ <TogglePrimitive.Root ref={ref} className={cn(toggleVariants({ variant, size, className }))} {...props} />
26
+ ));
27
+
28
+ Toggle.displayName = TogglePrimitive.Root.displayName;
29
+
30
+ export { Toggle, toggleVariants };
@@ -0,0 +1,22 @@
1
+ import * as React from 'react';
2
+ import * as TooltipPrimitive from '@radix-ui/react-tooltip';
3
+ import { cn } from '@/lib/utils';
4
+
5
+ const TooltipProvider = TooltipPrimitive.Provider;
6
+ const Tooltip = TooltipPrimitive.Root;
7
+ const TooltipTrigger = TooltipPrimitive.Trigger;
8
+
9
+ const TooltipContent = React.forwardRef(({ className, sideOffset = 4, ...props }, ref) => (
10
+ <TooltipPrimitive.Content
11
+ ref={ref}
12
+ sideOffset={sideOffset}
13
+ className={cn(
14
+ 'z-50 overflow-hidden rounded-md border bg-popover px-3 py-1.5 text-sm text-popover-foreground shadow-md',
15
+ className
16
+ )}
17
+ {...props}
18
+ />
19
+ ));
20
+ TooltipContent.displayName = TooltipPrimitive.Content.displayName;
21
+
22
+ export { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider };
@@ -0,0 +1,101 @@
1
+ // @ts-nocheck — shadcn toast hook (JS port); app code is typed separately.
2
+ import * as React from 'react';
3
+
4
+ const TOAST_LIMIT = 20;
5
+ const TOAST_REMOVE_DELAY = 1000;
6
+
7
+ let count = 0;
8
+ function genId() {
9
+ count = (count + 1) % Number.MAX_SAFE_INTEGER;
10
+ return count.toString();
11
+ }
12
+
13
+ const toastTimeouts = new Map();
14
+
15
+ const addToRemoveQueue = (toastId) => {
16
+ if (toastTimeouts.has(toastId)) return;
17
+ const timeout = setTimeout(() => {
18
+ toastTimeouts.delete(toastId);
19
+ dispatch({ type: 'REMOVE_TOAST', toastId });
20
+ }, TOAST_REMOVE_DELAY);
21
+ toastTimeouts.set(toastId, timeout);
22
+ };
23
+
24
+ const listeners = [];
25
+ let memoryState = { toasts: [] };
26
+
27
+ function dispatch(action) {
28
+ memoryState = reducer(memoryState, action);
29
+ listeners.forEach((listener) => listener(memoryState));
30
+ }
31
+
32
+ function reducer(state, action) {
33
+ switch (action.type) {
34
+ case 'ADD_TOAST':
35
+ return {
36
+ ...state,
37
+ toasts: [action.toast, ...state.toasts].slice(0, TOAST_LIMIT),
38
+ };
39
+ case 'UPDATE_TOAST':
40
+ return {
41
+ ...state,
42
+ toasts: state.toasts.map((t) => (t.id === action.toast.id ? { ...t, ...action.toast } : t)),
43
+ };
44
+ case 'DISMISS_TOAST': {
45
+ const { toastId } = action;
46
+ if (toastId) addToRemoveQueue(toastId);
47
+ else state.toasts.forEach((t) => addToRemoveQueue(t.id));
48
+ return {
49
+ ...state,
50
+ toasts: state.toasts.map((t) =>
51
+ t.id === toastId || toastId === undefined ? { ...t, open: false } : t
52
+ ),
53
+ };
54
+ }
55
+ case 'REMOVE_TOAST':
56
+ if (action.toastId === undefined) return { ...state, toasts: [] };
57
+ return { ...state, toasts: state.toasts.filter((t) => t.id !== action.toastId) };
58
+ default:
59
+ return state;
60
+ }
61
+ }
62
+
63
+ function toastFn(props) {
64
+ const id = genId();
65
+ const update = (p) => dispatch({ type: 'UPDATE_TOAST', toast: { ...p, id } });
66
+ const dismiss = () => dispatch({ type: 'DISMISS_TOAST', toastId: id });
67
+
68
+ dispatch({
69
+ type: 'ADD_TOAST',
70
+ toast: {
71
+ ...props,
72
+ id,
73
+ open: true,
74
+ onOpenChange: (open) => {
75
+ if (!open) dismiss();
76
+ },
77
+ },
78
+ });
79
+
80
+ return { id, dismiss, update };
81
+ }
82
+
83
+ function useToast() {
84
+ const [state, setState] = React.useState(memoryState);
85
+
86
+ React.useEffect(() => {
87
+ listeners.push(setState);
88
+ return () => {
89
+ const i = listeners.indexOf(setState);
90
+ if (i > -1) listeners.splice(i, 1);
91
+ };
92
+ }, []);
93
+
94
+ return {
95
+ ...state,
96
+ toast: toastFn,
97
+ dismiss: (toastId) => dispatch({ type: 'DISMISS_TOAST', toastId }),
98
+ };
99
+ }
100
+
101
+ export { useToast, toastFn as toast };
@@ -0,0 +1,6 @@
1
+ import { type ClassValue, clsx } from 'clsx';
2
+ import { twMerge } from 'tailwind-merge';
3
+
4
+ export function cn(...inputs: ClassValue[]) {
5
+ return twMerge(clsx(inputs));
6
+ }
@@ -0,0 +1,5 @@
1
+ /** @type {import('next').NextConfig} */
2
+ module.exports = {
3
+ output: "standalone",
4
+ reactStrictMode: true,
5
+ };
@@ -0,0 +1,15 @@
1
+ import path from 'path';
2
+ import { fileURLToPath } from 'url';
3
+
4
+ const appRoot = path.dirname(fileURLToPath(import.meta.url));
5
+
6
+ /** @type {import('next').NextConfig} */
7
+ const nextConfig = {
8
+ output: 'standalone',
9
+ reactStrictMode: true,
10
+ experimental: {
11
+ outputFileTracingRoot: appRoot,
12
+ },
13
+ };
14
+
15
+ export default nextConfig;
@@ -0,0 +1,19 @@
1
+ import type { NextConfig } from 'next';
2
+ import path from 'path';
3
+ import { fileURLToPath } from 'url';
4
+
5
+ const appRoot = path.dirname(fileURLToPath(import.meta.url));
6
+
7
+ /**
8
+ * FactorAI deployer injects basePath here before build.
9
+ * Keep output: 'standalone' — required for PM2 / Unix socket runtime.
10
+ */
11
+ const nextConfig: NextConfig = {
12
+ output: 'standalone',
13
+ reactStrictMode: true,
14
+ experimental: {
15
+ outputFileTracingRoot: appRoot,
16
+ },
17
+ };
18
+
19
+ export default nextConfig;
@@ -0,0 +1,70 @@
1
+ {
2
+ "name": "{{NAME}}",
3
+ "version": "0.1.0",
4
+ "private": true,
5
+ "scripts": {
6
+ "dev": "next dev",
7
+ "build": "next build",
8
+ "start": "next start",
9
+ "lint": "next lint"
10
+ },
11
+ "dependencies": {
12
+ "next": "14.2.28",
13
+ "react": "^18.2.0",
14
+ "react-dom": "^18.2.0",
15
+ "@hookform/resolvers": "^5.2.2",
16
+ "@radix-ui/react-accordion": "^1.2.12",
17
+ "@radix-ui/react-alert-dialog": "^1.1.15",
18
+ "@radix-ui/react-aspect-ratio": "^1.1.8",
19
+ "@radix-ui/react-avatar": "^1.1.11",
20
+ "@radix-ui/react-checkbox": "^1.3.3",
21
+ "@radix-ui/react-collapsible": "^1.1.12",
22
+ "@radix-ui/react-context-menu": "^2.2.16",
23
+ "@radix-ui/react-dialog": "^1.1.15",
24
+ "@radix-ui/react-dropdown-menu": "^2.1.16",
25
+ "@radix-ui/react-hover-card": "^1.1.15",
26
+ "@radix-ui/react-label": "^2.1.8",
27
+ "@radix-ui/react-menubar": "^1.1.16",
28
+ "@radix-ui/react-navigation-menu": "^1.2.14",
29
+ "@radix-ui/react-popover": "^1.1.15",
30
+ "@radix-ui/react-progress": "^1.1.8",
31
+ "@radix-ui/react-radio-group": "^1.3.8",
32
+ "@radix-ui/react-scroll-area": "^1.2.10",
33
+ "@radix-ui/react-select": "^2.2.6",
34
+ "@radix-ui/react-separator": "^1.1.8",
35
+ "@radix-ui/react-slider": "^1.3.6",
36
+ "@radix-ui/react-slot": "^1.2.3",
37
+ "@radix-ui/react-switch": "^1.2.6",
38
+ "@radix-ui/react-tabs": "^1.1.13",
39
+ "@radix-ui/react-toast": "^1.2.15",
40
+ "@radix-ui/react-toggle": "^1.1.10",
41
+ "@radix-ui/react-toggle-group": "^1.1.11",
42
+ "@radix-ui/react-tooltip": "^1.2.8",
43
+ "class-variance-authority": "^0.7.1",
44
+ "clsx": "^2.1.1",
45
+ "cmdk": "^1.1.1",
46
+ "date-fns": "^4.1.0",
47
+ "embla-carousel-react": "^8.6.0",
48
+ "input-otp": "^1.4.2",
49
+ "lucide-react": "^0.460.0",
50
+ "react-day-picker": "^9.14.0",
51
+ "react-hook-form": "^7.72.0",
52
+ "react-resizable-panels": "^4.8.0",
53
+ "recharts": "^2.15.4",
54
+ "sonner": "^2.0.7",
55
+ "tailwind-merge": "^2.2.0",
56
+ "vaul": "^1.1.2",
57
+ "zod": "^3.23.0"
58
+ },
59
+ "devDependencies": {
60
+ "@types/node": "^20.11.0",
61
+ "@types/react": "^18.2.0",
62
+ "@types/react-dom": "^18.2.0",
63
+ "typescript": "^5.3.0",
64
+ "tailwindcss": "^3.4.0",
65
+ "postcss": "^8.4.0",
66
+ "autoprefixer": "^10.4.0",
67
+ "eslint": "^8.56.0",
68
+ "eslint-config-next": "14.2.28"
69
+ }
70
+ }
@@ -0,0 +1,6 @@
1
+ module.exports = {
2
+ plugins: {
3
+ tailwindcss: {},
4
+ autoprefixer: {},
5
+ },
6
+ };
@@ -0,0 +1,57 @@
1
+ import type { Config } from 'tailwindcss';
2
+
3
+ const config: Config = {
4
+ darkMode: 'class',
5
+ content: [
6
+ './pages/**/*.{js,ts,jsx,tsx,mdx}',
7
+ './components/**/*.{js,ts,jsx,tsx,mdx}',
8
+ './app/**/*.{js,ts,jsx,tsx,mdx}',
9
+ ],
10
+ theme: {
11
+ extend: {
12
+ colors: {
13
+ background: 'hsl(var(--background))',
14
+ foreground: 'hsl(var(--foreground))',
15
+ card: {
16
+ DEFAULT: 'hsl(var(--card))',
17
+ foreground: 'hsl(var(--card-foreground))',
18
+ },
19
+ popover: {
20
+ DEFAULT: 'hsl(var(--popover))',
21
+ foreground: 'hsl(var(--popover-foreground))',
22
+ },
23
+ primary: {
24
+ DEFAULT: 'hsl(var(--primary))',
25
+ foreground: 'hsl(var(--primary-foreground))',
26
+ },
27
+ secondary: {
28
+ DEFAULT: 'hsl(var(--secondary))',
29
+ foreground: 'hsl(var(--secondary-foreground))',
30
+ },
31
+ muted: {
32
+ DEFAULT: 'hsl(var(--muted))',
33
+ foreground: 'hsl(var(--muted-foreground))',
34
+ },
35
+ accent: {
36
+ DEFAULT: 'hsl(var(--accent))',
37
+ foreground: 'hsl(var(--accent-foreground))',
38
+ },
39
+ destructive: {
40
+ DEFAULT: 'hsl(var(--destructive))',
41
+ foreground: 'hsl(var(--destructive-foreground))',
42
+ },
43
+ border: 'hsl(var(--border))',
44
+ input: 'hsl(var(--input))',
45
+ ring: 'hsl(var(--ring))',
46
+ },
47
+ borderRadius: {
48
+ lg: 'var(--radius)',
49
+ md: 'calc(var(--radius) - 2px)',
50
+ sm: 'calc(var(--radius) - 4px)',
51
+ },
52
+ },
53
+ },
54
+ plugins: [],
55
+ };
56
+
57
+ export default config;
@@ -0,0 +1,20 @@
1
+ {
2
+ "compilerOptions": {
3
+ "lib": ["dom", "dom.iterable", "esnext"],
4
+ "allowJs": true,
5
+ "skipLibCheck": true,
6
+ "strict": true,
7
+ "noEmit": true,
8
+ "esModuleInterop": true,
9
+ "module": "esnext",
10
+ "moduleResolution": "bundler",
11
+ "resolveJsonModule": true,
12
+ "isolatedModules": true,
13
+ "jsx": "preserve",
14
+ "incremental": true,
15
+ "plugins": [{ "name": "next" }],
16
+ "paths": { "@/*": ["./*"] }
17
+ },
18
+ "include": ["**/*.ts", "**/*.tsx", "**/*.js", "**/*.jsx"],
19
+ "exclude": ["node_modules", ".next"]
20
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nomad-e/bluma-cli",
3
- "version": "0.14.1",
3
+ "version": "0.16.0",
4
4
  "description": "BluMa independent agent for automation and advanced software engineering.",
5
5
  "author": "Alex Fonseca",
6
6
  "license": "Apache-2.0",