feat(integrations): add Git hosting providers and Clone UI

Add integrations for GitHub, GitLab (cloud & self-hosted), Azure DevOps,
and Gitea, storing personal access tokens in the operating system
keychain. Azure DevOps supports multiple independently configurable
organizations, and the Clone → Integrations tab loads, filters, sorts,
and clones repositories using stored credentials. Update the API
contract, help overlay, README, changelog, and application version
metadata to document and ship the feature.

- Add list_integration_repositories API command and related types
- New Clone → Integrations UI with search, refresh, and direct clone
- Store tokens in OS keychain and support multiple Azure DevOps orgs
This commit is contained in:
2026-08-30 00:05:01 +02:00
parent c242a72edd
commit 9c93d5a978
7 changed files with 166 additions and 4 deletions
+49
View File
@@ -4,6 +4,53 @@ All notable user-facing changes to Gitty are documented in this file.
The project uses calendar-style versions in the form `YYYY.M.PATCH`.
## [2026.8.8] - 2026-08-29
### Added
- Git hosting integrations for GitHub, GitLab.com, GitLab Self-Managed,
Azure DevOps, and Gitea. Personal access tokens are stored separately in
the operating system keychain.
- Azure DevOps supports multiple independently configurable organizations,
each with its own display name, organization URL, username, and token.
- The Clone dialog has an Integrations tab that loads all repositories
available to the selected account, supports filtering and refresh, sorts
repositories alphabetically, and clones the selected repository directly
with its stored credentials.
### Changed
- Repository tabs use a more compact Git-client-style bar. Close buttons
remain visible and turn red only while hovered.
- The integration repository list uses a narrow custom scrollbar that grows
only slightly on hover and no longer covers repository names or metadata.
- Repository loading and status overlays use theme-aware design tokens with
improved contrast and a more compact presentation.
### Fixed
- Clearing sync settings on a branch that never had an upstream is now a safe
no-op instead of failing with a fatal Git error.
## [2026.8.7] - 2026-08-23
### Added
- Appearance settings now offer Modern, Classic, and Custom styles. Custom
themes can define their own persisted color palette, while a complete light
theme is available alongside the refreshed dark appearance.
- The branch visibility dialog groups local and remote branches into
collapsible sections with selected-branch counts. Local branches open by
default, while the remote group starts collapsed for quicker navigation.
### Changed
- Dark-theme colors, surfaces, controls, and focus outlines have been refined
for clearer interactive boundaries and more consistent contrast throughout
the application.
- The branch visibility dialog follows the responsive layout and visual
language of the rest of Gitty more closely.
## [2026.8.6] - 2026-08-18
### Changed
@@ -243,6 +290,8 @@ The project uses calendar-style versions in the form `YYYY.M.PATCH`.
[2026.07.22]: https://git.cbsk-tech.de/Christoph/GitLite/releases/tag/2026.7.22
[2026.07.21]: https://git.cbsk-tech.de/Christoph/GitLite/releases/tag/2026.7.21
[2026.7.20]: https://git.cbsk-tech.de/Christoph/GitLite/releases/tag/2026.7.20
[2026.8.8]: https://git.cbsk-tech.de/Christoph/GitLite/releases/tag/2026.8.8
[2026.8.7]: https://git.cbsk-tech.de/Christoph/GitLite/releases/tag/2026.8.7
[2026.8.6]: https://git.cbsk-tech.de/Christoph/GitLite/releases/tag/2026.8.6
[2026.8.5]: https://git.cbsk-tech.de/Christoph/GitLite/releases/tag/2026.8.5
[2026.8.4]: https://git.cbsk-tech.de/Christoph/GitLite/releases/tag/2026.8.4
+16
View File
@@ -20,6 +20,7 @@ Fast, simple, and designed for developers who want a clean Git experience withou
- 🔄 Pull, Push & Fetch
- 🔀 Merge & Rebase
- 📦 Repository management
- ☁️ GitHub, GitLab, Azure DevOps, and Gitea integrations
- 🗄️ Git LFS detection, tracking and object management
- 🎨 Modern and intuitive UI
@@ -103,6 +104,21 @@ the running window when Gitty is already open.
---
## Git hosting integrations
Gitty connects to GitHub, GitLab.com, GitLab Self-Managed, Azure DevOps, and
Gitea from **Settings → Integrations**. Each connection uses a personal access
token that is stored in the operating system keychain instead of application
settings. Azure DevOps can manage multiple organizations with separate URLs,
usernames, and tokens.
After enabling a connection, open **Clone → Integrations** to load the
repositories available to that account. Repositories are sorted
alphabetically and can be filtered, refreshed, selected, and cloned directly
with the stored credentials.
---
## Development
Start the complete desktop application in development mode with:
+15
View File
@@ -101,6 +101,20 @@ interface GitLfsFile {
oid: string;
version: string;
}
type GitIntegrationProvider = "github" | "gitlab" | "gitlab-self-hosted" | "azure-devops" | "gitea";
interface IntegrationRepository {
id: string;
name: string;
fullName: string;
description: string;
cloneUrl: string;
sshUrl: string;
webUrl: string;
updatedAt: string;
private: boolean;
}
```
## Commands
@@ -110,6 +124,7 @@ The command list below includes the repository-management and synchronization AP
- `open_repository(path: string): Promise<GitStatus>`
- `init_repository(path: string, initialBranch?: string): Promise<GitStatus>`
- `clone_repository(...): Promise<RepositoryBundle>`
- `list_integration_repositories(provider: GitIntegrationProvider, baseUrl: string, accountId?: string): Promise<IntegrationRepository[]>`; loads credentials from the operating system keychain and returns every repository accessible through the configured Git hosting account.
- `get_status(path: string): Promise<GitStatus>`
- `git_lfs_status(path: string): Promise<GitLfsStatus>`
- `git_lfs_install(path: string): Promise<GitLfsStatus>`
+2 -2
View File
@@ -1,12 +1,12 @@
{
"name": "gitty",
"version": "2026.8.7",
"version": "2026.8.8",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "gitty",
"version": "2026.8.7",
"version": "2026.8.8",
"dependencies": {
"@lucide/svelte": "^1.21.0",
"@tailwindcss/vite": "^4.3.1",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "gitty",
"version": "2026.8.7",
"version": "2026.8.8",
"private": true,
"type": "module",
"scripts": {
+1 -1
View File
@@ -1,7 +1,7 @@
{
"$schema": "https://schema.tauri.app/config/2",
"productName": "Gitty",
"version": "2026.8.7",
"version": "2026.8.8",
"identifier": "com.gitty",
"build": {
"beforeDevCommand": "npm run prepare:lfs && npm run dev",
+82
View File
@@ -635,6 +635,19 @@
"Öffne das Tab-Kontextmenü, um ein Repository aus der aktuellen Arbeitsfläche zu entfernen, ohne Dateien zu löschen.",
],
},
{
id: "app-integrations",
title: "Git-Hosting-Integrationen und Clone",
summary: "Gitty verbindet sich mit GitHub, GitLab.com, GitLab Self-Managed, Azure DevOps und Gitea. Danach kannst du deine verfügbaren Repositories direkt im Clone-Dialog durchsuchen und laden.",
steps: [
"Öffne Einstellungen → Integrationen, wähle einen Anbieter und trage Server-URL, Benutzername sowie einen Personal Access Token ein.",
"Für Azure DevOps kannst du mehrere Organisationen anlegen. Jede Organisation besitzt einen eigenen Anzeigenamen, eine Organisations-URL und einen separat gespeicherten Token.",
"Aktiviere die Integration und speichere die Einstellungen. Tokens werden getrennt von den App-Einstellungen im Schlüsselbund des Betriebssystems abgelegt.",
"Öffne Clone → Integrationen und wähle das gewünschte Konto. Gitty lädt alle zugänglichen Repositories und sortiert sie alphabetisch.",
"Filtere bei Bedarf nach Name oder Beschreibung, wähle ein Repository und einen Zielordner und starte den Clone direkt mit den gespeicherten Zugangsdaten.",
],
note: "Vergib Tokens nur die benötigten Leserechte und eine möglichst kurze Laufzeit. Entfernst du einen gespeicherten Token in Gitty, wird die betroffene Integration automatisch deaktiviert.",
},
{
id: "app-commit-detail",
title: "Saubere Commits in Gitty erstellen",
@@ -1097,6 +1110,19 @@
"Use the tab context menu to remove a repository from the workspace without deleting its files.",
],
},
{
id: "app-integrations",
title: "Git hosting integrations and Clone",
summary: "Gitty connects to GitHub, GitLab.com, GitLab Self-Managed, Azure DevOps, and Gitea. You can then browse and clone the repositories available to your accounts directly from the Clone dialog.",
steps: [
"Open Settings → Integrations, select a provider, and enter its server URL, username, and personal access token.",
"Azure DevOps supports multiple organizations. Every organization has its own display name, organization URL, and separately stored token.",
"Enable the integration and save the settings. Tokens are kept in the operating system keychain rather than application settings.",
"Open Clone → Integrations and select an account. Gitty loads every accessible repository and sorts the list alphabetically.",
"Filter by name or description when needed, select a repository and destination, and clone it directly with the stored credentials.",
],
note: "Give tokens only the required read permissions and the shortest practical lifetime. Removing a stored token in Gitty automatically disables the affected integration.",
},
{
id: "app-commit-detail",
title: "Create clean commits in Gitty",
@@ -1522,6 +1548,34 @@
label: "Neu in Gitty",
description: "Änderungen seit der letzten veröffentlichten Version und wichtige Neuerungen früherer Releases.",
sections: [
{
id: "changelog-2026-8-8",
title: "Version 2026.8.8",
summary: "Dieses Release verbindet Gitty mit den wichtigsten Git-Hosting-Diensten und macht das Klonen aus deinen eigenen Repository-Listen deutlich schneller.",
steps: [
"Neue Integrationen für GitHub, GitLab.com, GitLab Self-Managed, Azure DevOps und Gitea lassen sich zentral in den Einstellungen verwalten. Personal Access Tokens werden sicher im Schlüsselbund des Betriebssystems gespeichert.",
"Azure DevOps unterstützt mehrere Organisationen mit jeweils eigenem Anzeigenamen, eigener Organisations-URL, eigenem Benutzernamen und Token.",
"Der Clone-Dialog besitzt einen Integrationen-Reiter. Er lädt alle zugänglichen Repositories des gewählten Kontos, sortiert sie alphabetisch und unterstützt Suche, Aktualisieren und direktes Klonen mit den gespeicherten Zugangsdaten.",
"Die Repository-Tab-Leiste ist kompakter und näher an klassischen Git-Clients gestaltet. Das Schließen-X bleibt sichtbar und wird nur beim Überfahren rot.",
"Eine schmale eigene Scrollbar im Repository-Browser überdeckt weder Namen noch Metadaten und wird beim Überfahren nur leicht breiter.",
"Repository-Loading- und Status-Flächen reagieren konsistenter auf das aktive Theme und sind kompakter und kontrastreicher.",
"Das Entfernen eines nicht vorhandenen Upstreams ist jetzt ein sicherer No-op und löst keinen fatalen Git-Fehler mehr aus.",
],
note: "Die Integrationen verwenden HTTPS und Personal Access Tokens. Welche Repositories sichtbar sind, richtet sich nach den Berechtigungen des jeweiligen Tokens und Kontos.",
},
{
id: "changelog-2026-8-7",
title: "Version 2026.8.7",
summary: "Dieses Release erweitert die Darstellungseinstellungen und macht die Branch-Auswahl bei vielen lokalen und entfernten Branches übersichtlicher.",
steps: [
"In den Einstellungen stehen die Darstellungsstile Aktuell, Klassisch und Eigene zur Verfügung. Beim eigenen Stil lässt sich eine individuelle Farbpalette konfigurieren und dauerhaft speichern.",
"Ein vollständiges helles Theme ergänzt die überarbeitete dunkle Darstellung. Farben, Flächen, Bedienelemente und Fokusrahmen besitzen klarere Grenzen und konsistentere Kontraste.",
"Der Dialog zur Branch-Sichtbarkeit trennt lokale und entfernte Branches in auf- und zuklappbare Gruppen und zeigt für jede Gruppe die Anzahl der ausgewählten Branches.",
"Beim Öffnen ist die lokale Gruppe ausgeklappt und die Remote-Gruppe zunächst geschlossen, damit häufig verwendete Branches schneller erreichbar sind.",
"Die Branch-Auswahl passt sich kleineren Fenstergrößen besser an und folgt dem visuellen Stil der übrigen Gitty-Dialoge.",
],
note: "Darstellungsstil und eigene Farben werden lokal gespeichert und beim nächsten Start automatisch wieder angewendet.",
},
{
id: "changelog-2026-8-6",
title: "Version 2026.8.6",
@@ -1652,6 +1706,34 @@
label: "What's new",
description: "Changes since the latest published version and notable additions from earlier releases.",
sections: [
{
id: "changelog-2026-8-8",
title: "Version 2026.8.8",
summary: "This release connects Gitty to the major Git hosting services and makes cloning from your own repository lists substantially faster.",
steps: [
"New integrations for GitHub, GitLab.com, GitLab Self-Managed, Azure DevOps, and Gitea can be managed centrally in Settings. Personal access tokens are stored securely in the operating system keychain.",
"Azure DevOps supports multiple organizations, each with its own display name, organization URL, username, and token.",
"The Clone dialog has an Integrations tab. It loads every repository accessible to the selected account, sorts the list alphabetically, and supports search, refresh, and direct cloning with stored credentials.",
"The repository tab bar is more compact and closer to familiar Git clients. Its close button remains visible and turns red only while hovered.",
"A narrow custom scrollbar in the repository browser no longer covers names or metadata and grows only slightly on hover.",
"Repository loading and status surfaces respond more consistently to the active theme with improved contrast and a more compact presentation.",
"Clearing a missing upstream is now a safe no-op instead of producing a fatal Git error.",
],
note: "Integrations use HTTPS and personal access tokens. The repositories shown depend on the permissions granted to the selected account and token.",
},
{
id: "changelog-2026-8-7",
title: "Version 2026.8.7",
summary: "This release expands appearance settings and makes branch selection easier to navigate in repositories with many local and remote branches.",
steps: [
"Settings now provide Modern, Classic, and Custom appearance styles. Custom mode supports an individual color palette that is persisted across restarts.",
"A complete light theme complements the refreshed dark appearance. Colors, surfaces, controls, and focus outlines have clearer boundaries and more consistent contrast.",
"The branch visibility dialog separates local and remote branches into collapsible groups and displays the number of selected branches for each group.",
"The local group opens by default while the remote group starts collapsed, keeping frequently used branches quicker to reach.",
"The branch selector responds better to smaller window sizes and follows the visual language of the other Gitty dialogs.",
],
note: "The selected appearance style and custom colors are stored locally and restored automatically on the next start.",
},
{
id: "changelog-2026-8-6",
title: "Version 2026.8.6",