From ac9aec4e905836af16b7af09a2ec2acf9f701eb7 Mon Sep 17 00:00:00 2001 From: Val Alexander Date: Sun, 5 Apr 2026 05:53:08 -0500 Subject: [PATCH] Add GitHub repo cloning entry points - Add clone-repo actions to sidebar and home empty state - Open cloned repos as projects, reusing existing projects when possible --- apps/web/src/components/Sidebar.tsx | 25 ++++++++++ .../components/home/ChatHomeEmptyState.tsx | 50 +++++++++++++++++++ apps/web/src/components/home/HomeActions.tsx | 8 ++- 3 files changed, 82 insertions(+), 1 deletion(-) diff --git a/apps/web/src/components/Sidebar.tsx b/apps/web/src/components/Sidebar.tsx index b159ac84d..0be1e45a2 100644 --- a/apps/web/src/components/Sidebar.tsx +++ b/apps/web/src/components/Sidebar.tsx @@ -6,6 +6,7 @@ import { EyeOffIcon, ZapIcon, FolderIcon, + GitBranchIcon, GitMergeIcon, GitPullRequestIcon, XCircleIcon, @@ -121,6 +122,7 @@ import { resolvePackageManagerResolution, } from "~/projectScriptDefaults"; import { useClientMode } from "~/hooks/useClientMode"; +import { CloneRepositoryDialog } from "~/components/CloneRepositoryDialog"; import { getProjectColor } from "~/projectColors"; import type { Thread } from "../types"; @@ -398,6 +400,7 @@ export default function Sidebar() { const [isAddingProject, setIsAddingProject] = useState(false); const [addProjectError, setAddProjectError] = useState(null); const [manualProjectPathEntry, setManualProjectPathEntry] = useState(false); + const [cloneDialogOpen, setCloneDialogOpen] = useState(false); const addProjectInputRef = useRef(null); const [expandedThreadListsByProject, setExpandedThreadListsByProject] = useState< ReadonlySet @@ -680,6 +683,13 @@ export default function Sidebar() { setAddingProject((prev) => !prev); }; + const handleCloneComplete = useCallback( + async (result: { path: string; branch: string; repoName: string }) => { + await addProjectFromPath(result.path); + }, + [addProjectFromPath], + ); + /** * Delete a single thread: stop session, close terminal, dispatch delete, * clean up drafts/state, and optionally remove orphaned worktree. @@ -2044,6 +2054,15 @@ export default function Sidebar() { {isPickingFolder ? "Picking folder..." : "Browse for folder"} + {!manualProjectPathEntry && ( +