diff --git a/attached_assets/Pasted-Here-s-a-high-to-medium-level-outline-formatted-roadmap-for-turning-your-existing-embeddinggemma-30-1757473542795_1757473542795.txt b/attached_assets/Pasted-Here-s-a-high-to-medium-level-outline-formatted-roadmap-for-turning-your-existing-embeddinggemma-30-1757473542795_1757473542795.txt
deleted file mode 100644
index 0cbb6cf670b4752b511d29c29fc4a88212e16bff..0000000000000000000000000000000000000000
--- a/attached_assets/Pasted-Here-s-a-high-to-medium-level-outline-formatted-roadmap-for-turning-your-existing-embeddinggemma-30-1757473542795_1757473542795.txt
+++ /dev/null
@@ -1,82 +0,0 @@
-Here’s a high-to-medium-level, outline-formatted roadmap for turning your existing embeddinggemma-300m setup into a unified CLI tool powered by Phi-2. No code snippets—just clear steps and gap-checks.
-
-1. Define Your Modular Surface
-Embedder
-
-Uses google/embeddinggemma-300m to turn text into vectors
-
-Retriever
-
-Indexes and searches embeddings (e.g., FAISS or Chroma)
-
-Generator
-
-Runs Phi-2 (2.7 B) for response generation based on retrieved context
-
-CLI
-
-Ties everything together with a command-line interface (e.g., Typer)
-
-2. Prepare Your Conda Environment
-Confirm sentence-transformers and transformers are installed
-
-Add your vector store library (FAISS/Chroma)
-
-Install any quantization/runtime helpers for Phi-2 (GGUF, bitsandbytes, etc.)
-
-Allocate model cache paths under your project (e.g., ./models/)
-
-3. Acquire and Optimize Phi-2
-Download the Phi-2 weights from Hugging Face or Azure AI Studio
-
-Quantize to Q4/Q5 to fit within ~6–8 GB of RAM on your i5/16 GB rig
-
-Validate loading speed and memory footprint in isolation before integration
-
-4. Sketch Your Data Flow
-User Input: typed command + query text
-
-Embedding: call Gemma → vector
-
-Retrieval: query vector → top-k document vectors
-
-Context Assembly: stitch retrieved snippets
-
-Generation: feed context + user prompt into Phi-2 → text answer
-
-Output: print or save response
-
-5. Fill Logic Holes
-You need a vector store backend; plain in-memory lists won’t scale
-
-Chunk larger documents before embedding (e.g., 500 token windows)
-
-Watch Phi-2’s context window (typically ~2 K tokens) and trim if needed
-
-Plan caching: don’t re-embed the same files on every run
-
-Design a config file for model paths, thresholds, and CLI defaults
-
-6. Organize Your Directory
-Code
-gemma-phi2-cli/
-├── models/
-│ ├── embeddinggemma-300m/
-│ └── phi2-quantized/
-├── data/
-│ └── index/ # FAISS/Chroma files
-├── src/
-│ ├── embedder.py # wraps Gemma
-│ ├── retriever.py # builds & queries index
-│ ├── generator.py # wraps Phi-2
-│ └── cli.py # Typer entry point
-├── config.yaml # model locations, hyperparams
-└── README.md
-7. Plan Your CLI Commands
-init → create or update index from a target directory
-
-search → semantic lookup, returns file names + scores
-
-ask → retrieval + generation in one step
-
-serve → optional local API for integrations
\ No newline at end of file
diff --git a/client/index.html b/client/index.html
deleted file mode 100644
index 0d05af327082f583ac298ab6103296eee7a0b3fd..0000000000000000000000000000000000000000
--- a/client/index.html
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/client/src/App.tsx b/client/src/App.tsx
deleted file mode 100644
index 77bf6836b1417ccae1192042eb5c545a33cfeef6..0000000000000000000000000000000000000000
--- a/client/src/App.tsx
+++ /dev/null
@@ -1,31 +0,0 @@
-import { Switch, Route } from "wouter";
-import { queryClient } from "./lib/queryClient";
-import { QueryClientProvider } from "@tanstack/react-query";
-import { Toaster } from "@/components/ui/toaster";
-import { TooltipProvider } from "@/components/ui/tooltip";
-import Dashboard from "./pages/dashboard";
-import NotFound from "@/pages/not-found";
-
-function Router() {
- return (
-
-
-
-
- );
-}
-
-function App() {
- return (
-
-
-
-
-
-
-
-
- );
-}
-
-export default App;
diff --git a/client/src/components/sections/commands.tsx b/client/src/components/sections/commands.tsx
deleted file mode 100644
index d0ec8e141721a1de916a463f04f1d2e42b53d947..0000000000000000000000000000000000000000
--- a/client/src/components/sections/commands.tsx
+++ /dev/null
@@ -1,117 +0,0 @@
-import { Card } from "@/components/ui/card";
-import { TerminalComponent } from "@/components/ui/terminal";
-import { Terminal, Play, Settings } from "lucide-react";
-
-export function CommandsSection() {
- const coreCommands = [
- {
- command: "gemma-phi2-cli init [path]",
- description: "Initialize or update index from target directory",
- color: "text-accent"
- },
- {
- command: "gemma-phi2-cli search [query]",
- description: "Semantic lookup returning file names and scores",
- color: "text-accent"
- },
- {
- command: "gemma-phi2-cli ask [question]",
- description: "Retrieval + generation in one step",
- color: "text-accent"
- },
- {
- command: "gemma-phi2-cli serve",
- description: "Launch local API server for integrations",
- color: "text-accent"
- },
- {
- command: "gemma-phi2-cli commit [--preview|--apply]",
- description: "Generate commit messages from staged changes",
- color: "text-accent"
- },
- {
- command: "gemma-phi2-cli commit --dry-run",
- description: "Show file count, chunks, and token estimates",
- color: "text-accent"
- }
- ];
-
- const utilityCommands = [
- {
- command: "gemma-phi2-cli status",
- description: "Show current configuration and model status",
- color: "text-accent"
- },
- {
- command: "gemma-phi2-cli config [key] [value]",
- description: "Get or set configuration parameters",
- color: "text-accent"
- },
- {
- command: "gemma-phi2-cli clear",
- description: "Clear vector store and cached embeddings",
- color: "text-accent"
- },
- {
- command: "gemma-phi2-cli --help",
- description: "Display detailed help and usage examples",
- color: "text-accent"
- },
- {
- command: "gemma-phi2-cli commit --preview",
- description: "Preview generated commit message without applying",
- color: "text-accent"
- },
- {
- command: "gemma-phi2-cli config --list-presets",
- description: "Show available commit style presets",
- color: "text-accent"
- }
- ];
-
- return (
-
- CLI Commands
-
-
-
-
-
-
-
-
- Core Commands
-
-
- {coreCommands.map((cmd, index) => (
-
-
- {cmd.command}
-
- {cmd.description}
-
- ))}
-
-
-
-
-
-
- Utility Commands
-
-
- {utilityCommands.map((cmd, index) => (
-
-
- {cmd.command}
-
- {cmd.description}
-
- ))}
-
-
-
-
-
- );
-}
diff --git a/client/src/components/sections/configuration.tsx b/client/src/components/sections/configuration.tsx
deleted file mode 100644
index ce9166bc213ac62598e8cf38092ad33a76978d85..0000000000000000000000000000000000000000
--- a/client/src/components/sections/configuration.tsx
+++ /dev/null
@@ -1,105 +0,0 @@
-import { Card } from "@/components/ui/card";
-import { Button } from "@/components/ui/button";
-import { FileCode, Edit, Save } from "lucide-react";
-
-export function ConfigurationSection() {
- const configContent = `# Gemma-Phi2-CLI Configuration
-models:
- embedder:
- path: "./models/embeddinggemma-300m"
- batch_size: 32
- device: "cpu"
- generator:
- path: "./models/phi2-quantized.gguf"
- quantization: "Q4_0"
- max_tokens: 2048
- temperature: 0.7
- format: "gguf"
-
-embedding:
- dim: 768
- truncate_to: 128
- sentence_transformers: true
-
-vector_store:
- type: "faiss"
- index_path: "./data/index"
- persistence: true
-
-retrieval:
- top_k: 5
- similarity_threshold: 0.75
- rerank: false
-
-performance:
- cache_embeddings: true
- chunk_size: 500
- chunk_overlap: 50
-
-commit:
- tone: "imperative"
- style: "conventional" # Options: conventional | descriptive | terse
- max_length: 72
- preview_by_default: true
- fallback_enabled: true
- dry_run_default: false
-
-logging:
- level: "INFO"
- file: "./logs/gemma-phi2.log"
- verbose: true
- telemetry: false
- rotate_logs: true
-
-environment:
- conda_env: "gemma-phi2-cli"
- python_version: "3.10"
- platform: "windows"`;
-
- return (
-
- Configuration Management
-
-
-
-
-
- config.yaml
-
-
-
-
- Edit
-
-
-
- Save
-
-
-
-
-
-
- {configContent.split('\n').map((line, index) => {
- let className = '';
- if (line.trim().startsWith('#')) {
- className = 'comment';
- } else if (line.includes(':') && !line.trim().startsWith(' ')) {
- className = 'keyword';
- } else if (line.includes('"')) {
- className = 'string';
- }
-
- return (
-
- {line || '\u00A0'}
-
- );
- })}
-
-
-
-
-
- );
-}
\ No newline at end of file
diff --git a/client/src/components/sections/deployment.tsx b/client/src/components/sections/deployment.tsx
deleted file mode 100644
index e0a48fd178739f761924c03e5f5b4590add18350..0000000000000000000000000000000000000000
--- a/client/src/components/sections/deployment.tsx
+++ /dev/null
@@ -1,124 +0,0 @@
-import { Card } from "@/components/ui/card";
-import { Button } from "@/components/ui/button";
-import { Progress } from "@/components/ui/progress";
-import { Server, Download, Rocket } from "lucide-react";
-
-export function DeploymentSection() {
- const systemRequirements = [
- { label: "CPU", value: "Intel i5+ / AMD Ryzen 5+" },
- { label: "RAM", value: "16 GB minimum" },
- { label: "Storage", value: "10 GB+ SSD" },
- { label: "Platform", value: "Windows 11 (primary)" },
- { label: "Python", value: "3.10 (Conda managed)" },
- { label: "Models", value: "CPU-only execution" }
- ];
-
- const installationSteps = [
- { name: "Conda Environment", progress: 100, status: "✓ Complete", color: "bg-green-400" },
- { name: "sentence-transformers", progress: 100, status: "✓ Complete", color: "bg-green-400" },
- { name: "FAISS + Typer + PyYAML", progress: 100, status: "✓ Complete", color: "bg-green-400" },
- { name: "EmbeddingGemma-300m", progress: 75, status: "⟳ Downloading", color: "bg-yellow-400" },
- { name: "Phi-2 GGUF (Q4_0)", progress: 0, status: "⏳ Pending", color: "bg-muted" }
- ];
-
- const quickStartSteps = [
- {
- number: 1,
- title: "Conda Setup",
- commands: ["conda env create -f environment.yml", "conda activate gemma-phi2-cli", "pip install -e ."],
- color: "bg-primary"
- },
- {
- number: 2,
- title: "Model Download",
- commands: ["python download_models.py", "# Downloads EmbeddingGemma + Phi-2 GGUF"],
- color: "bg-accent"
- },
- {
- number: 3,
- title: "CLI Usage",
- commands: ["gemma-phi2-cli init ./my-project", "git add .", "gemma-phi2-cli commit --preview"],
- color: "bg-green-400"
- }
- ];
-
- return (
-
- Deployment & Setup
-
-
- {/* System Requirements */}
-
-
-
- System Requirements
-
-
- {systemRequirements.map((req, index) => (
-
- {req.label}
-
- {req.value}
-
-
- ))}
-
-
-
- {/* Installation Progress */}
-
-
-
- Installation Progress
-
-
- {installationSteps.map((step, index) => (
-
-
- {step.name}
-
- {step.status}
-
-
-
-
- ))}
-
-
-
-
- {/* Quick Start Guide */}
-
-
-
- Quick Start Guide
-
-
- {quickStartSteps.map((step, index) => (
-
-
- {step.number}
-
-
{step.title}
-
- {step.commands.map((command, cmdIndex) => (
-
- {command}
-
- ))}
-
-
- ))}
-
-
-
- );
-}
diff --git a/client/src/components/sections/modules.tsx b/client/src/components/sections/modules.tsx
deleted file mode 100644
index 3b951e8383f1d3718470a52bd21b57a5525eee9d..0000000000000000000000000000000000000000
--- a/client/src/components/sections/modules.tsx
+++ /dev/null
@@ -1,395 +0,0 @@
-import { Card } from "@/components/ui/card";
-import { Input } from "@/components/ui/input";
-import { Label } from "@/components/ui/label";
-import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select";
-import { Badge } from "@/components/ui/badge";
-import { Brain, Search, Wand2, GitBranch, ChevronDown, CheckCircle, Clock } from "lucide-react";
-import { useState } from "react";
-
-export function ModulesSection() {
- const [expandedModules, setExpandedModules] = useState>(new Set(["embedder"]));
-
- const toggleModule = (moduleId: string) => {
- const newExpanded = new Set(expandedModules);
- if (newExpanded.has(moduleId)) {
- newExpanded.delete(moduleId);
- } else {
- newExpanded.add(moduleId);
- }
- setExpandedModules(newExpanded);
- };
-
- return (
-
- Module Configuration
-
- {/* Embedder Module */}
-
-
-
-
-
-
Embedder Module
-
- Active
-
-
-
toggleModule("embedder")}
- className="text-muted-foreground hover:text-foreground transition-colors"
- data-testid="toggle-embedder"
- >
-
-
-
-
- {expandedModules.has("embedder") && (
-
-
-
-
-
- Implementation Status
-
-
-
-
- Model loading interface
-
-
-
- Text preprocessing pipeline
-
-
-
- Batch processing optimization
-
-
-
-
- )}
-
-
- {/* Retriever Module */}
-
-
-
-
-
-
Retriever Module
-
- Active
-
-
-
toggleModule("retriever")}
- className="text-muted-foreground hover:text-foreground transition-colors"
- data-testid="toggle-retriever"
- >
-
-
-
-
- {expandedModules.has("retriever") && (
-
-
-
- Vector Store
-
-
-
-
-
- FAISS
- Chroma
- Pinecone
-
-
-
-
- Top-K Results
-
-
-
- Similarity Threshold
-
-
-
-
- Index Statistics
-
-
-
- )}
-
-
- {/* DiffAnalyzer Module */}
-
-
-
-
-
-
DiffAnalyzer Module
-
- Active
-
-
-
toggleModule("diffanalyzer")}
- className="text-muted-foreground hover:text-foreground transition-colors"
- data-testid="toggle-diffanalyzer"
- >
-
-
-
-
- {expandedModules.has("diffanalyzer") && (
-
-
-
-
-
- Git Integration
-
-
-
-
- Git diff parsing
-
-
-
- Staged changes detection
-
-
-
- Logical section chunking
-
-
-
-
-
-
- Sample Diff Chunk
-
-
-
diff --git a/src/embedder.py b/src/embedder.py
-
index 1a2b3c4..5d6e7f8 100644
-
--- a/src/embedder.py
-
+++ b/src/embedder.py
-
@@ -45,6 +45,12 @@ class Embedder:
-
- return self.model.encode(texts)
-
+ embeddings = self.model.encode(texts)
-
+ # Cache embeddings for faster retrieval
-
+ self._cache_embeddings(texts, embeddings)
-
+ return embeddings
-
-
-
- )}
-
-
- {/* Generator Module */}
-
-
-
-
-
-
Generator Module
-
- Loading
-
-
-
toggleModule("generator")}
- className="text-muted-foreground hover:text-foreground transition-colors"
- data-testid="toggle-generator"
- >
-
-
-
-
- {expandedModules.has("generator") && (
-
-
-
- Model
-
-
-
- Quantization
-
-
-
-
-
- 4-bit (Q4)
- 5-bit (Q5)
- 8-bit (Q8)
- 16-bit (FP16)
-
-
-
-
- Commit Style
-
-
-
-
-
- Conventional (feat:, fix:)
- Descriptive (detailed)
- Terse (minimal)
-
-
-
-
-
-
-
-
- Commit Message Generation
-
-
-
-
- Conventional commit format
-
-
-
- Imperative tone enforcement
-
-
-
- Context-aware suggestions
-
-
-
- Fallback logic for model failures
-
-
-
- Style presets (conventional/descriptive/terse)
-
-
-
-
- )}
-
-
- );
-}
diff --git a/client/src/components/sections/overview.tsx b/client/src/components/sections/overview.tsx
deleted file mode 100644
index 403cac91efeb69f04c6e9733f9bc8130cb6b996b..0000000000000000000000000000000000000000
--- a/client/src/components/sections/overview.tsx
+++ /dev/null
@@ -1,154 +0,0 @@
-import { Card } from "@/components/ui/card";
-import { Badge } from "@/components/ui/badge";
-import { Brain, Search, Wand2, FolderTree, GitCommit } from "lucide-react";
-
-export function OverviewSection() {
- const features = [
- {
- icon: Brain,
- title: "EmbeddingGemma-300m",
- description: "High-precision text embedding for semantic search",
- color: "text-primary"
- },
- {
- icon: Search,
- title: "FAISS Vector Store",
- description: "Efficient similarity search and clustering",
- color: "text-accent"
- },
- {
- icon: Wand2,
- title: "Phi-2 Generator",
- description: "2.7B parameter model for contextual responses",
- color: "text-purple-400"
- },
- {
- icon: FolderTree,
- title: "Commit Assistant",
- description: "Git diff analysis and intelligent commit message generation",
- color: "text-orange-400"
- }
- ];
-
- const projectStructure = [
- { type: "folder", name: "gemma-phi2-cli/", level: 0 },
- { type: "folder", name: "models/", level: 1, badge: "AI Models" },
- { type: "folder", name: "embeddinggemma-300m/", level: 2 },
- { type: "folder", name: "phi2-quantized/", level: 2 },
- { type: "folder", name: "data/", level: 1 },
- { type: "folder", name: "index/", level: 2, badge: "Vector Store" },
- { type: "folder", name: "src/", level: 1 },
- { type: "file", name: "embedder.py", level: 2 },
- { type: "file", name: "retriever.py", level: 2 },
- { type: "file", name: "generator.py", level: 2 },
- { type: "file", name: "diff_analyzer.py", level: 2 },
- { type: "file", name: "cli.py", level: 2 },
- { type: "folder", name: "tests/", level: 1, badge: "Unit Tests" },
- { type: "file", name: "test_embedder.py", level: 2 },
- { type: "file", name: "test_retriever.py", level: 2 },
- { type: "file", name: "test_generator.py", level: 2 },
- { type: "folder", name: "examples/", level: 1, badge: "Sample Repo" },
- { type: "file", name: "sample_repo/", level: 2 },
- { type: "file", name: "config.yaml", level: 1 },
- { type: "file", name: "environment.yml", level: 1 },
- { type: "file", name: "README.md", level: 1 },
- ];
-
- return (
-
-
-
-
-
-
Project Overview
-
- A seamless CLI assistant that combines EmbeddingGemma's precision with Phi-2's generative capabilities.
-
-
-
- v1.0.0
-
-
-
-
- {features.map((feature, index) => (
-
-
-
-
{feature.title}
-
- {feature.description}
-
- ))}
-
-
-
-
-
- Data Flow Pipeline
-
-
-
-
-
1
-
Git Diff Analysis
-
-
diff_analyzer.py
-
-
-
-
-
-
-
3
-
Context Retrieval
-
-
retriever.py
-
-
-
-
-
4
-
Message Generation
-
-
generator.py
-
-
-
-
-
-
-
- Project Structure
-
-
- {projectStructure.map((item, index) => (
-
-
- {item.name}
- {item.badge && (
-
- {item.badge}
-
- )}
-
- ))}
-
-
-
-
-
- );
-}
diff --git a/client/src/components/ui/accordion.tsx b/client/src/components/ui/accordion.tsx
deleted file mode 100644
index e6a723d06574ee5cec8b00759b98f3fbe1ac7cc9..0000000000000000000000000000000000000000
--- a/client/src/components/ui/accordion.tsx
+++ /dev/null
@@ -1,56 +0,0 @@
-import * as React from "react"
-import * as AccordionPrimitive from "@radix-ui/react-accordion"
-import { ChevronDown } from "lucide-react"
-
-import { cn } from "@/lib/utils"
-
-const Accordion = AccordionPrimitive.Root
-
-const AccordionItem = React.forwardRef<
- React.ElementRef,
- React.ComponentPropsWithoutRef
->(({ className, ...props }, ref) => (
-
-))
-AccordionItem.displayName = "AccordionItem"
-
-const AccordionTrigger = React.forwardRef<
- React.ElementRef,
- React.ComponentPropsWithoutRef
->(({ className, children, ...props }, ref) => (
-
- svg]:rotate-180",
- className
- )}
- {...props}
- >
- {children}
-
-
-
-))
-AccordionTrigger.displayName = AccordionPrimitive.Trigger.displayName
-
-const AccordionContent = React.forwardRef<
- React.ElementRef,
- React.ComponentPropsWithoutRef
->(({ className, children, ...props }, ref) => (
-
- {children}
-
-))
-
-AccordionContent.displayName = AccordionPrimitive.Content.displayName
-
-export { Accordion, AccordionItem, AccordionTrigger, AccordionContent }
diff --git a/client/src/components/ui/alert-dialog.tsx b/client/src/components/ui/alert-dialog.tsx
deleted file mode 100644
index 8722561cf6bda62d62f9a0c67730aefda971873a..0000000000000000000000000000000000000000
--- a/client/src/components/ui/alert-dialog.tsx
+++ /dev/null
@@ -1,139 +0,0 @@
-import * as React from "react"
-import * as AlertDialogPrimitive from "@radix-ui/react-alert-dialog"
-
-import { cn } from "@/lib/utils"
-import { buttonVariants } from "@/components/ui/button"
-
-const AlertDialog = AlertDialogPrimitive.Root
-
-const AlertDialogTrigger = AlertDialogPrimitive.Trigger
-
-const AlertDialogPortal = AlertDialogPrimitive.Portal
-
-const AlertDialogOverlay = React.forwardRef<
- React.ElementRef,
- React.ComponentPropsWithoutRef
->(({ className, ...props }, ref) => (
-
-))
-AlertDialogOverlay.displayName = AlertDialogPrimitive.Overlay.displayName
-
-const AlertDialogContent = React.forwardRef<
- React.ElementRef,
- React.ComponentPropsWithoutRef
->(({ className, ...props }, ref) => (
-
-
-
-
-))
-AlertDialogContent.displayName = AlertDialogPrimitive.Content.displayName
-
-const AlertDialogHeader = ({
- className,
- ...props
-}: React.HTMLAttributes) => (
-
-)
-AlertDialogHeader.displayName = "AlertDialogHeader"
-
-const AlertDialogFooter = ({
- className,
- ...props
-}: React.HTMLAttributes) => (
-
-)
-AlertDialogFooter.displayName = "AlertDialogFooter"
-
-const AlertDialogTitle = React.forwardRef<
- React.ElementRef,
- React.ComponentPropsWithoutRef
->(({ className, ...props }, ref) => (
-
-))
-AlertDialogTitle.displayName = AlertDialogPrimitive.Title.displayName
-
-const AlertDialogDescription = React.forwardRef<
- React.ElementRef,
- React.ComponentPropsWithoutRef
->(({ className, ...props }, ref) => (
-
-))
-AlertDialogDescription.displayName =
- AlertDialogPrimitive.Description.displayName
-
-const AlertDialogAction = React.forwardRef<
- React.ElementRef,
- React.ComponentPropsWithoutRef
->(({ className, ...props }, ref) => (
-
-))
-AlertDialogAction.displayName = AlertDialogPrimitive.Action.displayName
-
-const AlertDialogCancel = React.forwardRef<
- React.ElementRef,
- React.ComponentPropsWithoutRef
->(({ className, ...props }, ref) => (
-
-))
-AlertDialogCancel.displayName = AlertDialogPrimitive.Cancel.displayName
-
-export {
- AlertDialog,
- AlertDialogPortal,
- AlertDialogOverlay,
- AlertDialogTrigger,
- AlertDialogContent,
- AlertDialogHeader,
- AlertDialogFooter,
- AlertDialogTitle,
- AlertDialogDescription,
- AlertDialogAction,
- AlertDialogCancel,
-}
diff --git a/client/src/components/ui/alert.tsx b/client/src/components/ui/alert.tsx
deleted file mode 100644
index 41fa7e0561a3fdb5f986c1213a35e563de740e96..0000000000000000000000000000000000000000
--- a/client/src/components/ui/alert.tsx
+++ /dev/null
@@ -1,59 +0,0 @@
-import * as React from "react"
-import { cva, type VariantProps } from "class-variance-authority"
-
-import { cn } from "@/lib/utils"
-
-const alertVariants = cva(
- "relative w-full rounded-lg border p-4 [&>svg~*]:pl-7 [&>svg+div]:translate-y-[-3px] [&>svg]:absolute [&>svg]:left-4 [&>svg]:top-4 [&>svg]:text-foreground",
- {
- variants: {
- variant: {
- default: "bg-background text-foreground",
- destructive:
- "border-destructive/50 text-destructive dark:border-destructive [&>svg]:text-destructive",
- },
- },
- defaultVariants: {
- variant: "default",
- },
- }
-)
-
-const Alert = React.forwardRef<
- HTMLDivElement,
- React.HTMLAttributes & VariantProps
->(({ className, variant, ...props }, ref) => (
-
-))
-Alert.displayName = "Alert"
-
-const AlertTitle = React.forwardRef<
- HTMLParagraphElement,
- React.HTMLAttributes
->(({ className, ...props }, ref) => (
-
-))
-AlertTitle.displayName = "AlertTitle"
-
-const AlertDescription = React.forwardRef<
- HTMLParagraphElement,
- React.HTMLAttributes
->(({ className, ...props }, ref) => (
-
-))
-AlertDescription.displayName = "AlertDescription"
-
-export { Alert, AlertTitle, AlertDescription }
diff --git a/client/src/components/ui/aspect-ratio.tsx b/client/src/components/ui/aspect-ratio.tsx
deleted file mode 100644
index c4abbf37f217c715a0eaade7f45ac78600df419f..0000000000000000000000000000000000000000
--- a/client/src/components/ui/aspect-ratio.tsx
+++ /dev/null
@@ -1,5 +0,0 @@
-import * as AspectRatioPrimitive from "@radix-ui/react-aspect-ratio"
-
-const AspectRatio = AspectRatioPrimitive.Root
-
-export { AspectRatio }
diff --git a/client/src/components/ui/avatar.tsx b/client/src/components/ui/avatar.tsx
deleted file mode 100644
index 51e507ba9d08bcdbb1fb630498f1cbdf2bf50093..0000000000000000000000000000000000000000
--- a/client/src/components/ui/avatar.tsx
+++ /dev/null
@@ -1,50 +0,0 @@
-"use client"
-
-import * as React from "react"
-import * as AvatarPrimitive from "@radix-ui/react-avatar"
-
-import { cn } from "@/lib/utils"
-
-const Avatar = React.forwardRef<
- React.ElementRef,
- React.ComponentPropsWithoutRef
->(({ className, ...props }, ref) => (
-
-))
-Avatar.displayName = AvatarPrimitive.Root.displayName
-
-const AvatarImage = React.forwardRef<
- React.ElementRef,
- React.ComponentPropsWithoutRef
->(({ className, ...props }, ref) => (
-
-))
-AvatarImage.displayName = AvatarPrimitive.Image.displayName
-
-const AvatarFallback = React.forwardRef<
- React.ElementRef,
- React.ComponentPropsWithoutRef
->(({ className, ...props }, ref) => (
-
-))
-AvatarFallback.displayName = AvatarPrimitive.Fallback.displayName
-
-export { Avatar, AvatarImage, AvatarFallback }
diff --git a/client/src/components/ui/badge.tsx b/client/src/components/ui/badge.tsx
deleted file mode 100644
index f000e3ef5176395b067dfc3f3e1256a80c450015..0000000000000000000000000000000000000000
--- a/client/src/components/ui/badge.tsx
+++ /dev/null
@@ -1,36 +0,0 @@
-import * as React from "react"
-import { cva, type VariantProps } from "class-variance-authority"
-
-import { cn } from "@/lib/utils"
-
-const badgeVariants = cva(
- "inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2",
- {
- variants: {
- variant: {
- default:
- "border-transparent bg-primary text-primary-foreground hover:bg-primary/80",
- secondary:
- "border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80",
- destructive:
- "border-transparent bg-destructive text-destructive-foreground hover:bg-destructive/80",
- outline: "text-foreground",
- },
- },
- defaultVariants: {
- variant: "default",
- },
- }
-)
-
-export interface BadgeProps
- extends React.HTMLAttributes,
- VariantProps {}
-
-function Badge({ className, variant, ...props }: BadgeProps) {
- return (
-
- )
-}
-
-export { Badge, badgeVariants }
diff --git a/client/src/components/ui/breadcrumb.tsx b/client/src/components/ui/breadcrumb.tsx
deleted file mode 100644
index 60e6c96f72f0350d08b47e4730cab8f3975dc853..0000000000000000000000000000000000000000
--- a/client/src/components/ui/breadcrumb.tsx
+++ /dev/null
@@ -1,115 +0,0 @@
-import * as React from "react"
-import { Slot } from "@radix-ui/react-slot"
-import { ChevronRight, MoreHorizontal } from "lucide-react"
-
-import { cn } from "@/lib/utils"
-
-const Breadcrumb = React.forwardRef<
- HTMLElement,
- React.ComponentPropsWithoutRef<"nav"> & {
- separator?: React.ReactNode
- }
->(({ ...props }, ref) => )
-Breadcrumb.displayName = "Breadcrumb"
-
-const BreadcrumbList = React.forwardRef<
- HTMLOListElement,
- React.ComponentPropsWithoutRef<"ol">
->(({ className, ...props }, ref) => (
-
-))
-BreadcrumbList.displayName = "BreadcrumbList"
-
-const BreadcrumbItem = React.forwardRef<
- HTMLLIElement,
- React.ComponentPropsWithoutRef<"li">
->(({ className, ...props }, ref) => (
-
-))
-BreadcrumbItem.displayName = "BreadcrumbItem"
-
-const BreadcrumbLink = React.forwardRef<
- HTMLAnchorElement,
- React.ComponentPropsWithoutRef<"a"> & {
- asChild?: boolean
- }
->(({ asChild, className, ...props }, ref) => {
- const Comp = asChild ? Slot : "a"
-
- return (
-
- )
-})
-BreadcrumbLink.displayName = "BreadcrumbLink"
-
-const BreadcrumbPage = React.forwardRef<
- HTMLSpanElement,
- React.ComponentPropsWithoutRef<"span">
->(({ className, ...props }, ref) => (
-
-))
-BreadcrumbPage.displayName = "BreadcrumbPage"
-
-const BreadcrumbSeparator = ({
- children,
- className,
- ...props
-}: React.ComponentProps<"li">) => (
- svg]:w-3.5 [&>svg]:h-3.5", className)}
- {...props}
- >
- {children ?? }
-
-)
-BreadcrumbSeparator.displayName = "BreadcrumbSeparator"
-
-const BreadcrumbEllipsis = ({
- className,
- ...props
-}: React.ComponentProps<"span">) => (
-
-
- More
-
-)
-BreadcrumbEllipsis.displayName = "BreadcrumbElipssis"
-
-export {
- Breadcrumb,
- BreadcrumbList,
- BreadcrumbItem,
- BreadcrumbLink,
- BreadcrumbPage,
- BreadcrumbSeparator,
- BreadcrumbEllipsis,
-}
diff --git a/client/src/components/ui/button.tsx b/client/src/components/ui/button.tsx
deleted file mode 100644
index 36496a28727a3643b4212a14225d4f6cbd50bda5..0000000000000000000000000000000000000000
--- a/client/src/components/ui/button.tsx
+++ /dev/null
@@ -1,56 +0,0 @@
-import * as React from "react"
-import { Slot } from "@radix-ui/react-slot"
-import { cva, type VariantProps } from "class-variance-authority"
-
-import { cn } from "@/lib/utils"
-
-const buttonVariants = cva(
- "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0",
- {
- variants: {
- variant: {
- default: "bg-primary text-primary-foreground hover:bg-primary/90",
- destructive:
- "bg-destructive text-destructive-foreground hover:bg-destructive/90",
- outline:
- "border border-input bg-background hover:bg-accent hover:text-accent-foreground",
- secondary:
- "bg-secondary text-secondary-foreground hover:bg-secondary/80",
- ghost: "hover:bg-accent hover:text-accent-foreground",
- link: "text-primary underline-offset-4 hover:underline",
- },
- size: {
- default: "h-10 px-4 py-2",
- sm: "h-9 rounded-md px-3",
- lg: "h-11 rounded-md px-8",
- icon: "h-10 w-10",
- },
- },
- defaultVariants: {
- variant: "default",
- size: "default",
- },
- }
-)
-
-export interface ButtonProps
- extends React.ButtonHTMLAttributes,
- VariantProps {
- asChild?: boolean
-}
-
-const Button = React.forwardRef(
- ({ className, variant, size, asChild = false, ...props }, ref) => {
- const Comp = asChild ? Slot : "button"
- return (
-
- )
- }
-)
-Button.displayName = "Button"
-
-export { Button, buttonVariants }
diff --git a/client/src/components/ui/calendar.tsx b/client/src/components/ui/calendar.tsx
deleted file mode 100644
index 2174f7101ba18ec1385eed03f69dbd619feb98aa..0000000000000000000000000000000000000000
--- a/client/src/components/ui/calendar.tsx
+++ /dev/null
@@ -1,68 +0,0 @@
-import * as React from "react"
-import { ChevronLeft, ChevronRight } from "lucide-react"
-import { DayPicker } from "react-day-picker"
-
-import { cn } from "@/lib/utils"
-import { buttonVariants } from "@/components/ui/button"
-
-export type CalendarProps = React.ComponentProps
-
-function Calendar({
- className,
- classNames,
- showOutsideDays = true,
- ...props
-}: CalendarProps) {
- return (
- (
-
- ),
- IconRight: ({ className, ...props }) => (
-
- ),
- }}
- {...props}
- />
- )
-}
-Calendar.displayName = "Calendar"
-
-export { Calendar }
diff --git a/client/src/components/ui/card.tsx b/client/src/components/ui/card.tsx
deleted file mode 100644
index f62edea578d50058bef5e6bcc178b88d145564e9..0000000000000000000000000000000000000000
--- a/client/src/components/ui/card.tsx
+++ /dev/null
@@ -1,79 +0,0 @@
-import * as React from "react"
-
-import { cn } from "@/lib/utils"
-
-const Card = React.forwardRef<
- HTMLDivElement,
- React.HTMLAttributes
->(({ className, ...props }, ref) => (
-
-))
-Card.displayName = "Card"
-
-const CardHeader = React.forwardRef<
- HTMLDivElement,
- React.HTMLAttributes
->(({ className, ...props }, ref) => (
-
-))
-CardHeader.displayName = "CardHeader"
-
-const CardTitle = React.forwardRef<
- HTMLDivElement,
- React.HTMLAttributes
->(({ className, ...props }, ref) => (
-
-))
-CardTitle.displayName = "CardTitle"
-
-const CardDescription = React.forwardRef<
- HTMLDivElement,
- React.HTMLAttributes
->(({ className, ...props }, ref) => (
-
-))
-CardDescription.displayName = "CardDescription"
-
-const CardContent = React.forwardRef<
- HTMLDivElement,
- React.HTMLAttributes
->(({ className, ...props }, ref) => (
-
-))
-CardContent.displayName = "CardContent"
-
-const CardFooter = React.forwardRef<
- HTMLDivElement,
- React.HTMLAttributes
->(({ className, ...props }, ref) => (
-
-))
-CardFooter.displayName = "CardFooter"
-
-export { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent }
diff --git a/client/src/components/ui/carousel.tsx b/client/src/components/ui/carousel.tsx
deleted file mode 100644
index 9c2b9bf3705d8421bef00704c0c52e83d371ca11..0000000000000000000000000000000000000000
--- a/client/src/components/ui/carousel.tsx
+++ /dev/null
@@ -1,260 +0,0 @@
-import * as React from "react"
-import useEmblaCarousel, {
- type UseEmblaCarouselType,
-} from "embla-carousel-react"
-import { ArrowLeft, ArrowRight } from "lucide-react"
-
-import { cn } from "@/lib/utils"
-import { Button } from "@/components/ui/button"
-
-type CarouselApi = UseEmblaCarouselType[1]
-type UseCarouselParameters = Parameters
-type CarouselOptions = UseCarouselParameters[0]
-type CarouselPlugin = UseCarouselParameters[1]
-
-type CarouselProps = {
- opts?: CarouselOptions
- plugins?: CarouselPlugin
- orientation?: "horizontal" | "vertical"
- setApi?: (api: CarouselApi) => void
-}
-
-type CarouselContextProps = {
- carouselRef: ReturnType[0]
- api: ReturnType[1]
- scrollPrev: () => void
- scrollNext: () => void
- canScrollPrev: boolean
- canScrollNext: boolean
-} & CarouselProps
-
-const CarouselContext = React.createContext(null)
-
-function useCarousel() {
- const context = React.useContext(CarouselContext)
-
- if (!context) {
- throw new Error("useCarousel must be used within a ")
- }
-
- return context
-}
-
-const Carousel = React.forwardRef<
- HTMLDivElement,
- React.HTMLAttributes & CarouselProps
->(
- (
- {
- orientation = "horizontal",
- opts,
- setApi,
- plugins,
- className,
- children,
- ...props
- },
- ref
- ) => {
- const [carouselRef, api] = useEmblaCarousel(
- {
- ...opts,
- axis: orientation === "horizontal" ? "x" : "y",
- },
- plugins
- )
- const [canScrollPrev, setCanScrollPrev] = React.useState(false)
- const [canScrollNext, setCanScrollNext] = React.useState(false)
-
- const onSelect = React.useCallback((api: CarouselApi) => {
- if (!api) {
- return
- }
-
- setCanScrollPrev(api.canScrollPrev())
- setCanScrollNext(api.canScrollNext())
- }, [])
-
- const scrollPrev = React.useCallback(() => {
- api?.scrollPrev()
- }, [api])
-
- const scrollNext = React.useCallback(() => {
- api?.scrollNext()
- }, [api])
-
- const handleKeyDown = React.useCallback(
- (event: React.KeyboardEvent) => {
- if (event.key === "ArrowLeft") {
- event.preventDefault()
- scrollPrev()
- } else if (event.key === "ArrowRight") {
- event.preventDefault()
- scrollNext()
- }
- },
- [scrollPrev, scrollNext]
- )
-
- React.useEffect(() => {
- if (!api || !setApi) {
- return
- }
-
- setApi(api)
- }, [api, setApi])
-
- React.useEffect(() => {
- if (!api) {
- return
- }
-
- onSelect(api)
- api.on("reInit", onSelect)
- api.on("select", onSelect)
-
- return () => {
- api?.off("select", onSelect)
- }
- }, [api, onSelect])
-
- return (
-
-
- {children}
-
-
- )
- }
-)
-Carousel.displayName = "Carousel"
-
-const CarouselContent = React.forwardRef<
- HTMLDivElement,
- React.HTMLAttributes
->(({ className, ...props }, ref) => {
- const { carouselRef, orientation } = useCarousel()
-
- return (
-
- )
-})
-CarouselContent.displayName = "CarouselContent"
-
-const CarouselItem = React.forwardRef<
- HTMLDivElement,
- React.HTMLAttributes
->(({ className, ...props }, ref) => {
- const { orientation } = useCarousel()
-
- return (
-
- )
-})
-CarouselItem.displayName = "CarouselItem"
-
-const CarouselPrevious = React.forwardRef<
- HTMLButtonElement,
- React.ComponentProps
->(({ className, variant = "outline", size = "icon", ...props }, ref) => {
- const { orientation, scrollPrev, canScrollPrev } = useCarousel()
-
- return (
-
-
- Previous slide
-
- )
-})
-CarouselPrevious.displayName = "CarouselPrevious"
-
-const CarouselNext = React.forwardRef<
- HTMLButtonElement,
- React.ComponentProps
->(({ className, variant = "outline", size = "icon", ...props }, ref) => {
- const { orientation, scrollNext, canScrollNext } = useCarousel()
-
- return (
-
-
- Next slide
-
- )
-})
-CarouselNext.displayName = "CarouselNext"
-
-export {
- type CarouselApi,
- Carousel,
- CarouselContent,
- CarouselItem,
- CarouselPrevious,
- CarouselNext,
-}
diff --git a/client/src/components/ui/chart.tsx b/client/src/components/ui/chart.tsx
deleted file mode 100644
index 39fba6d6fc8509b968824b5076a8791c46650294..0000000000000000000000000000000000000000
--- a/client/src/components/ui/chart.tsx
+++ /dev/null
@@ -1,365 +0,0 @@
-"use client"
-
-import * as React from "react"
-import * as RechartsPrimitive from "recharts"
-
-import { cn } from "@/lib/utils"
-
-// Format: { THEME_NAME: CSS_SELECTOR }
-const THEMES = { light: "", dark: ".dark" } as const
-
-export type ChartConfig = {
- [k in string]: {
- label?: React.ReactNode
- icon?: React.ComponentType
- } & (
- | { color?: string; theme?: never }
- | { color?: never; theme: Record }
- )
-}
-
-type ChartContextProps = {
- config: ChartConfig
-}
-
-const ChartContext = React.createContext(null)
-
-function useChart() {
- const context = React.useContext(ChartContext)
-
- if (!context) {
- throw new Error("useChart must be used within a ")
- }
-
- return context
-}
-
-const ChartContainer = React.forwardRef<
- HTMLDivElement,
- React.ComponentProps<"div"> & {
- config: ChartConfig
- children: React.ComponentProps<
- typeof RechartsPrimitive.ResponsiveContainer
- >["children"]
- }
->(({ id, className, children, config, ...props }, ref) => {
- const uniqueId = React.useId()
- const chartId = `chart-${id || uniqueId.replace(/:/g, "")}`
-
- return (
-
-
-
-
- {children}
-
-
-
- )
-})
-ChartContainer.displayName = "Chart"
-
-const ChartStyle = ({ id, config }: { id: string; config: ChartConfig }) => {
- const colorConfig = Object.entries(config).filter(
- ([, config]) => config.theme || config.color
- )
-
- if (!colorConfig.length) {
- return null
- }
-
- return (
-