GitHub Import Feature: Import repositories/projects from GitHub (#1424) (#1454)

## Summary
Adds the ability to import GitHub repositories directly into Dyad from
the home screen, complementing the existing local folder import feature.
- GitHub Import Modal: New modal accessible from home screen via "Import
from Github" button with two Import methods
- Select project from GitHub repositories list
- Clone from any GitHub URL
- Advanced Options: Optional custom install/start commands (defaults to
project's package.json scripts)
- Auto AI_RULES Generation: Automatically generates AI_RULES.md if not
present in imported repo

closes #1424
    
<!-- This is an auto-generated description by cubic. -->
---

## Summary by cubic
Adds a GitHub import flow from the home screen so users can clone repos
via their list or any URL, with optional install/start commands and
automatic AI_RULES.md generation. Addresses Linear #1424 by enabling
seamless project setup from GitHub.

- **New Features**
  - Import modal with two tabs: Your Repositories and From URL.
- Advanced options for install/start commands with validation; defaults
used when both are empty.
- After cloning, navigate to chat and auto-generate AI_RULES.md if
missing.
- New IPC handler github:clone-repo-from-url with token auth support,
plus IpcClient method and preload channel.
- E2E tests cover modal open, auth, import via URL/repo list, and
advanced options.

- **Dependencies**
  - Added @radix-ui/react-tabs for the modal tab UI.

<!-- End of auto-generated description by cubic. -->
This commit is contained in:
Adeniji Adekunle James
2025-10-14 03:10:04 +01:00
committed by GitHub
parent 7acbe73c73
commit 348521ce82
12 changed files with 934 additions and 157 deletions

View File

@@ -65,6 +65,7 @@ import type {
UpdatePromptParamsDto,
McpServerUpdate,
CreateMcpServer,
CloneRepoParams,
} from "./ipc_types";
import type { Template } from "../shared/templates";
import type {
@@ -1277,6 +1278,11 @@ export class IpcClient {
public async deletePrompt(id: number): Promise<void> {
await this.ipcRenderer.invoke("prompts:delete", id);
}
public async cloneRepoFromUrl(
params: CloneRepoParams,
): Promise<{ app: App; hasAiRules: boolean } | { error: string }> {
return this.ipcRenderer.invoke("github:clone-repo-from-url", params);
}
// --- Help bot ---
public startHelpChat(