feat(integrations): add Git hosting integrations and repo listing

Add support for integrating with external Git hosts (GitLab, Gitea,
and Azure DevOps). The backend gains a client to fetch paginated
repository lists, normalise base URLs, and surface provider errors.
Credentials are loaded from the OS keychain and a Tauri command is
exposed for the frontend to list integration repositories.

- Implement integration client with pagination, deserialization,
  and provider-specific handling.
- Centralise keychain credential loading and expose listing command.
- Update UI to manage integration metadata, persist settings, and
  save/remove tokens to the OS keychain for cloning and operations.
This commit is contained in:
2026-08-29 23:25:51 +02:00
parent 823a50ce85
commit 91263547db
10 changed files with 1190 additions and 130 deletions
+51
View File
@@ -16,6 +16,57 @@ export type AppTheme = "system" | "light" | "dark";
export type AppAppearance = "modern" | "classic" | "custom";
export type AppLanguage = "en" | "de";
export type GitIntegrationProvider = "gitlab" | "gitlab-self-hosted" | "azure-devops" | "gitea";
export interface GitIntegrationConfig {
provider: GitIntegrationProvider;
enabled: boolean;
baseUrl: string;
username: string;
tokenStored: boolean;
}
export interface GitIntegrationSettings {
providers: Record<GitIntegrationProvider, GitIntegrationConfig>;
azureDevOpsOrganizations: AzureDevOpsOrganization[];
}
export interface AzureDevOpsOrganization {
id: string;
name: string;
enabled: boolean;
baseUrl: string;
username: string;
tokenStored: boolean;
}
export interface GitIntegrationSecretUpdate {
provider: GitIntegrationProvider;
accountId?: string;
token?: string;
removeToken?: boolean;
}
export interface GitIntegrationSource {
id: string;
provider: GitIntegrationProvider;
accountId?: string;
label: string;
baseUrl: string;
}
export interface GitIntegrationRepository {
id: string;
name: string;
fullName: string;
description: string;
cloneUrl: string;
sshUrl: string;
webUrl: string;
updatedAt: string;
private: boolean;
}
export interface CustomThemeColors {
background: string;
surface: string;