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:
@@ -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
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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>`
|
||||
|
||||
Generated
+2
-2
@@ -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
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "gitty",
|
||||
"version": "2026.8.7",
|
||||
"version": "2026.8.8",
|
||||
"private": true,
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
Reference in New Issue
Block a user