From 9c277fd8e3af5849e3c26d6f1c6b48013e685bda Mon Sep 17 00:00:00 2001 From: Mark Henderson Date: Mon, 9 Mar 2026 11:30:51 -0700 Subject: [PATCH] feat: add GitHub import flow, project delete fix, and analyze API - Mirror GitHub repos to Gitea as-is on import (skip scaffold) - Auto-trigger ImportAnalyzer agent after successful mirror - Add POST/GET /api/projects/[projectId]/analyze route - Fix project delete button visibility (was permanently opacity:0) - Store isImport, importAnalysisStatus, importAnalysisJobId on projects Made-with: Cursor --- app/[workspace]/projects/page.tsx | 21 +-- app/api/projects/[projectId]/analyze/route.ts | 121 ++++++++++++++++++ app/api/projects/create/route.ts | 66 +++++++++- 3 files changed, 195 insertions(+), 13 deletions(-) create mode 100644 app/api/projects/[projectId]/analyze/route.ts diff --git a/app/[workspace]/projects/page.tsx b/app/[workspace]/projects/page.tsx index 955d1a0..d488430 100644 --- a/app/[workspace]/projects/page.tsx +++ b/app/[workspace]/projects/page.tsx @@ -76,6 +76,7 @@ export default function ProjectsPage() { const [showNew, setShowNew] = useState(false); const [projectToDelete, setProjectToDelete] = useState(null); const [isDeleting, setIsDeleting] = useState(false); + const [hoveredId, setHoveredId] = useState(null); const fetchProjects = async () => { try { @@ -193,10 +194,12 @@ export default function ProjectsPage() { transition: "all 0.15s", }} onMouseEnter={(e) => { + setHoveredId(p.id); e.currentTarget.style.borderColor = "#d0ccc4"; e.currentTarget.style.boxShadow = "0 2px 8px #1a1a1a0a"; }} onMouseLeave={(e) => { + setHoveredId(null); e.currentTarget.style.borderColor = "#e8e4dc"; e.currentTarget.style.boxShadow = "0 1px 2px #1a1a1a05"; }} @@ -247,19 +250,19 @@ export default function ProjectsPage() { - {/* Delete (hover) */} + {/* Delete (visible on row hover) */}