Skip to content

Commit 58dd1d9

Browse files
feat(github): add repository browser UI
- Create GitHubClient with Octokit - Add /api/github/repos endpoint - Build RepositoryBrowser component with search - Integrate into dashboard - Install @octokit/rest dependency Part of Phase 2 - GitHub Integration 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
1 parent 486ec26 commit 58dd1d9

6 files changed

Lines changed: 391 additions & 1 deletion

File tree

package-lock.json

Lines changed: 183 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030
"@langchain/core": "^0.3.28",
3131
"@langchain/langgraph": "^0.2.42",
3232
"@langchain/openai": "^0.5.0",
33-
"langchain": "^0.3.11",
33+
"@octokit/rest": "^22.0.1",
3434
"@opentelemetry/api": "^1.9.0",
3535
"@opentelemetry/exporter-prometheus": "^0.205.0",
3636
"@opentelemetry/instrumentation-fs": "^0.25.0",
@@ -54,6 +54,7 @@
5454
"ioredis": "^5.7.0",
5555
"js-tiktoken": "^1.0.21",
5656
"js-yaml": "^4.1.0",
57+
"langchain": "^0.3.11",
5758
"lru-cache": "^10.1.0",
5859
"lucide-react": "^0.468.0",
5960
"next": "15.5.3",

src/app/api/github/repos/route.ts

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
import { createClient } from '@/lib/supabase/server'
2+
import { GitHubClient } from '@/lib/github/client'
3+
import { NextResponse } from 'next/server'
4+
import { cookies } from 'next/headers'
5+
6+
export async function GET(request: Request) {
7+
const cookieStore = cookies()
8+
const supabase = createClient(cookieStore)
9+
10+
// Get current user session
11+
const { data: { session }, error: sessionError } = await supabase.auth.getSession()
12+
13+
if (sessionError || !session) {
14+
return NextResponse.json({ error: 'Not authenticated' }, { status: 401 })
15+
}
16+
17+
// Get GitHub access token from session
18+
const githubToken = session.provider_token
19+
20+
if (!githubToken) {
21+
return NextResponse.json({ error: 'No GitHub token found' }, { status: 401 })
22+
}
23+
24+
try {
25+
const github = new GitHubClient(githubToken)
26+
const repos = await github.getUserRepos()
27+
28+
return NextResponse.json({ repos })
29+
} catch (error) {
30+
console.error('GitHub API error:', error)
31+
return NextResponse.json(
32+
{ error: 'Failed to fetch repositories' },
33+
{ status: 500 }
34+
)
35+
}
36+
}

src/app/dashboard/page.tsx

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { Button } from '@/components/ui/button'
55
import { Input } from '@/components/ui/input'
66
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'
77
import { Alert, AlertDescription } from '@/components/ui/alert'
8+
import { RepositoryBrowser } from '@/components/github/RepositoryBrowser'
89

910
interface CodebaseReview {
1011
summary: string
@@ -87,6 +88,24 @@ export default function DashboardPage() {
8788
</CardContent>
8889
</Card>
8990

91+
{/* GitHub Repository Browser */}
92+
<Card className="mb-6">
93+
<CardHeader>
94+
<CardTitle>GitHub Integration</CardTitle>
95+
<CardDescription>
96+
Connect your GitHub account to analyze repositories
97+
</CardDescription>
98+
</CardHeader>
99+
<CardContent>
100+
<RepositoryBrowser
101+
onSelectRepo={(repo) => {
102+
console.log('Selected repo:', repo)
103+
setProjectPath(`github:${repo.fullName}`)
104+
}}
105+
/>
106+
</CardContent>
107+
</Card>
108+
90109
{/* Error Display */}
91110
{error && (
92111
<Alert variant="destructive" className="mb-6 bg-red-950 border-red-800">

0 commit comments

Comments
 (0)