Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 6 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
# CodeGuard
# CodeSift AI

Automated security and code-quality review platform for pull/merge requests, with AI analysis, optional AI remediation, custom policy enforcement, and developer-focused triage UI.
> **AI-Powered Code Security for Modern Teams**

## What CodeGuard Does
CodeSift AI is an autonomous DevSecOps SaaS platform that helps developers detect security vulnerabilities, code-quality issues, and risky changes in GitHub pull requests, understand the risks, and safely fix them.

CodeGuard connects repositories, receives webhook events, analyzes code changes, stores findings, and surfaces actionable review output in a dashboard.
## What CodeSift AI Does

CodeSift AI connects repositories, receives webhook events, analyzes code changes, stores findings, and surfaces actionable review output in a dashboard.

Core outcomes:

Expand Down
2 changes: 2 additions & 0 deletions client/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1" />
<title>CodeSift AI — AI-Powered Code Security</title>
<meta name="description" content="AI-powered security analysis for every pull request." />
<link rel="icon" type="image/png" href="/favicon.png" />
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
Expand Down
25 changes: 23 additions & 2 deletions client/src/App.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -31,12 +31,29 @@ import AdminRequests from "@/pages/admin/requests";
import AdminSystem from "@/pages/admin/system";
import AdminAuditLog from "@/pages/admin/audit-log";
import AdminExport from "@/pages/admin/export";
import { AuthProvider } from "@/hooks/use-auth";
import LandingPage from "@/pages/landing-page";
import { AuthProvider, useAuth } from "@/hooks/use-auth";
import { ThemeProvider } from "@/hooks/use-theme";
import { ProtectedRoute, AdminProtectedRoute } from "@/lib/protected-route";
import { withLayout } from "@/components/layout";
import { SocketManager } from "@/components/SocketManager";

function HomeRoute() {
const { user, isLoading } = useAuth();
if (isLoading) {
return (
<div className="flex items-center justify-center min-h-screen bg-background">
<div className="animate-spin rounded-full h-8 w-8 border-b-2 border-primary"></div>
</div>
);
}
if (!user) {
return <LandingPage />;
}
const DashboardWithLayout = withLayout(Dashboard);
return <DashboardWithLayout />;
}

function App() {
return (
<QueryClientProvider client={queryClient}>
Expand All @@ -48,8 +65,12 @@ function App() {
<Route path="/auth" component={AuthPage} />
<Route path="/404" component={NotFound} />

{/* Public Landing & Home Route */}
<Route path="/" component={HomeRoute} />
<Route path="/landing" component={LandingPage} />

{/* Protected Routes with Sidebar */}
<ProtectedRoute path="/" component={withLayout(Dashboard)} />
<ProtectedRoute path="/dashboard" component={withLayout(Dashboard)} />
<ProtectedRoute path="/reviews" component={withLayout(Reviews)} />
<ProtectedRoute path="/reviews/:id" component={withLayout(ReviewDetail)} />
<ProtectedRoute path="/repositories" component={withLayout(Repositories)} />
Expand Down
10 changes: 7 additions & 3 deletions client/src/components/AIProviderStatus.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ interface AIStatus {
successes: number;
failures: number;
};
activeProvider: "nim" | "openai" | "none";
activeProvider: "nim" | "openai" | "groq" | "none";
lastFailureReason: string | null;
forceFallback: boolean;
}
Expand Down Expand Up @@ -120,9 +120,13 @@ export default function AIProviderStatus() {
variant="outline"
className={status.activeProvider === 'nim'
? "bg-green-500/10 text-green-500 border-green-500/20"
: "bg-blue-500/10 text-blue-500 border-blue-500/20"}
: status.activeProvider === 'groq'
? "bg-emerald-500/10 text-emerald-500 border-emerald-500/20"
: status.activeProvider === 'openai'
? "bg-blue-500/10 text-blue-500 border-blue-500/20"
: "bg-muted text-muted-foreground"}
>
{status.activeProvider === 'nim' ? 'NVIDIA NIM Active' : status.activeProvider === 'openai' ? 'OpenAI Fallback' : 'Idle'}
{status.activeProvider === 'nim' ? 'NVIDIA NIM Active' : status.activeProvider === 'groq' ? 'Groq Active (Primary)' : status.activeProvider === 'openai' ? 'OpenAI Fallback' : 'Idle'}
</Badge>
)}
<Button
Expand Down
Loading