Skip to content

Commit cf52e67

Browse files
authored
Merge branch 'main' into dependabot/npm_and_yarn/frontend/vitejs/plugin-react-5.1.2
2 parents 634ce3d + 6ad4503 commit cf52e67

7 files changed

Lines changed: 1129 additions & 15 deletions

File tree

.gitignore

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,3 +34,7 @@ backend/repos/
3434
# MCP Server
3535
mcp-server/__pycache__/
3636
*.code-workspace
37+
38+
# Validation experiments
39+
validation-experiment/
40+
exp-2/

backend/dependencies.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
from services.dependency_analyzer import DependencyAnalyzer
1515
from services.style_analyzer import StyleAnalyzer
1616
from services.performance_metrics import PerformanceMetrics
17+
from services.dna_extractor import DNAExtractor
1718
from services.rate_limiter import RateLimiter, APIKeyManager
1819
from services.supabase_service import get_supabase_service
1920
from services.input_validator import InputValidator, CostController
@@ -26,6 +27,7 @@
2627
repo_manager = RepositoryManager()
2728
dependency_analyzer = DependencyAnalyzer()
2829
style_analyzer = StyleAnalyzer()
30+
dna_extractor = DNAExtractor()
2931
metrics = PerformanceMetrics()
3032

3133
# Rate limiting and API key management

backend/routes/analysis.py

Lines changed: 48 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from pydantic import BaseModel
44

55
from dependencies import (
6-
dependency_analyzer, style_analyzer,
6+
dependency_analyzer, style_analyzer, dna_extractor,
77
get_repo_or_404
88
)
99
from services.input_validator import InputValidator
@@ -133,3 +133,50 @@ async def get_style_analysis(
133133
return {**style_data, "cached": False}
134134
except Exception as e:
135135
raise HTTPException(status_code=500, detail=str(e))
136+
137+
138+
139+
@router.get("/{repo_id}/dna")
140+
async def get_codebase_dna(
141+
repo_id: str,
142+
format: str = "json",
143+
auth: AuthContext = Depends(require_auth)
144+
):
145+
"""
146+
Extract codebase DNA - architectural patterns, conventions, and constraints.
147+
148+
This endpoint analyzes your codebase and returns a DNA profile that helps
149+
AI assistants understand how to write code consistent with your patterns.
150+
151+
Args:
152+
repo_id: Repository identifier
153+
format: Output format - 'json' or 'markdown' (default: json)
154+
155+
Returns:
156+
DNA profile with auth patterns, service patterns, database patterns, etc.
157+
"""
158+
try:
159+
repo = get_repo_or_404(repo_id, auth.user_id)
160+
161+
# Try cache first
162+
cached_dna = dna_extractor.load_from_cache(repo_id)
163+
if cached_dna:
164+
logger.debug("Using cached DNA", repo_id=repo_id)
165+
if format == "markdown":
166+
return {"dna": cached_dna.to_markdown(), "cached": True}
167+
return {**cached_dna.to_dict(), "cached": True}
168+
169+
# Extract fresh DNA
170+
logger.info("Extracting codebase DNA", repo_id=repo_id)
171+
metrics.increment("dna_extractions")
172+
173+
dna = dna_extractor.extract_dna(repo["local_path"], repo_id)
174+
dna_extractor.save_to_cache(repo_id, dna)
175+
176+
if format == "markdown":
177+
return {"dna": dna.to_markdown(), "cached": False}
178+
return {**dna.to_dict(), "cached": False}
179+
180+
except Exception as e:
181+
logger.error("Error extracting DNA", repo_id=repo_id, error=str(e))
182+
raise HTTPException(status_code=500, detail=str(e))

0 commit comments

Comments
 (0)