feat: clone GitHub repo into a workspace (#1331)
* feat: clone GitHub repo into a workspace Add an end-to-end "clone a GitHub repo and register it as a Paseo workspace" flow: a new workspace.github.clone RPC, daemon handler, client method, CLI `paseo clone` command, and a GitHub-repo mode in the project picker modal. Gated behind the workspaceGithubClone server capability flag. - protocol: workspace.github.clone request/response schemas + feature flag - server: handleWorkspaceGithubCloneRequest, normalizeCloneRepository - client: DaemonClient.cloneGithubWorkspace - cli: `paseo clone <repo> --dir <path> [--protocol https|ssh]` - app: GitHub-repo mode, clone-protocol picker, error surfacing Review fixes: - CLI clone now checks the workspaceGithubClone capability and fails fast with a clear "update the host" error instead of hanging for the full request timeout against an older daemon. - Replace the duplicated client-side URL-detection regex (app + CLI) with a shared isCompleteGitRemote() in @getpaseo/protocol/git-remote, backed by parseGitRemoteLocation so clients classify remotes identically to the daemon (fixes confusing errors for git://, ftp://, file:// inputs). - Add git-remote.test.ts covering the shared classifier. * Fix GitHub clone failure handling --------- Co-authored-by: Mohamed Boudra <boudra.moha@gmail.com>
This commit is contained in:
co-authored by
Mohamed Boudra
parent
bac302626f
commit
218097b7cc
@@ -24,6 +24,19 @@ export function parseGitHubRemoteUrl(remoteUrl: string): GitHubRemoteIdentity |
|
||||
return parseGitHubRemoteIdentity(location.path);
|
||||
}
|
||||
|
||||
/**
|
||||
* Whether `repo` is already a complete git remote (a URL or scp-like address)
|
||||
* rather than `owner/repo` shorthand that still needs a clone protocol picked.
|
||||
*
|
||||
* Clients (app + CLI) and the daemon must agree on this classification: the
|
||||
* daemon treats `parseGitRemoteLocation(repo) !== null` as "complete remote"
|
||||
* and everything else as shorthand, so reuse the same parser here instead of a
|
||||
* separate regex that would drift (e.g. accepting `git://` the parser rejects).
|
||||
*/
|
||||
export function isCompleteGitRemote(repo: string): boolean {
|
||||
return parseGitRemoteLocation(repo) !== null;
|
||||
}
|
||||
|
||||
export function parseGitRemoteLocation(remoteUrl: string): GitRemoteLocation | null {
|
||||
const trimmed = remoteUrl.trim();
|
||||
if (!trimmed) return null;
|
||||
|
||||
Reference in New Issue
Block a user