TUI: Git-Clone-Progress von bare-Repos zerstört Layout #50

Closed
opened 2026-07-13 01:37:10 +02:00 by frank · 1 comment
Owner

Problem

Beim ersten Bare-Clone eines Repos (z. B. unter forge agent watch mit TUI) schreibt git clone --bare seinen Progress direkt auf das Terminal. Die Ausgabe landet am unteren Bildschirmrand, überlappt mit der TUI-Footer-Zeile (Filter · [/] scroll) und verschiebt das gesamte Layout.

Beobachteter Output (Ende des Bildschirms):

Cloning into bare repository '/Users/frank/Documents/forge/frank/forgecli.git'...lter · [/] scroll
                                                                                 remote: Enumerating objects: 1779, done.
remote: Counting objects: 100% (1779/1779), done.
remote: Compressing objects: 100% (1237/1237), done.
remote: Total 1779 (delta 791), reused 1274 (delta 487), pack-reused 0 (from 0)
Receiving objects: 100% (1779/1779), 2.94 MiB | 20.48 MiB/s, done.             Receiving objects:  93% (1655/1779)
Resolving deltas: 100% (791/791), done.                           Resolving deltas:   0% (0/791)

Erwartetes Verhalten

  • Git-Progress (Clone/Fetch) muss innerhalb der Agent-TUI bleiben (Log-Panel), analog zu anderen Agent-/Git-/CI-Ausgaben.
  • Carriage-Return-Progress (Receiving objects: xx%) darf die TUI nicht corrupt machen (Zeilen überschreiben / Layout verschieben).
  • Ohne TUI (--no-tui) darf Progress weiterhin auf stderr sichtbar sein.

Vermutete Ursache

internal/gitutil/git.goclone() / CloneBare() leitet Stdout/Stderr fest auf os.Stdout/os.Stderr um.

EnsureRepoRoot in internal/agent/gitflow.go hat zwar einen log io.Writer und schreibt dort cloning bare …, übergibt den Writer aber nicht an CloneBare. Dadurch umgeht der eigentliche git clone --bare-Progress die TUI komplett.

Fix-Ideen

  1. CloneBare/clone um optionalen io.Writer für Progress erweitern (oder Stdout/Stderr setzbar machen).
  2. In EnsureRepoRoot den vorhandenen log-Writer an den Clone durchreichen.
  3. Sicherstellen, dass RunLogWriter CR-Progress korrekt als einzelne Log-Zeilen behandelt (Test TestRunLogWriterCarriageReturn prüfen/erweitern).
  4. Gleiches Muster für andere Git-Aufrufe prüfen, die noch direkt aufs Terminal schreiben.

Repro

  1. Bare-Cache für ein Repo löschen (oder neues Repo ohne lokalen Cache watchen).
  2. forge agent watch im interaktiven Terminal starten (TUI aktiv).
  3. Beim ersten Clone den Progress beobachten — Layout bricht.
## Problem Beim ersten Bare-Clone eines Repos (z. B. unter `forge agent watch` mit TUI) schreibt `git clone --bare` seinen Progress direkt auf das Terminal. Die Ausgabe landet am unteren Bildschirmrand, überlappt mit der TUI-Footer-Zeile (`Filter · [/] scroll`) und verschiebt das gesamte Layout. Beobachteter Output (Ende des Bildschirms): ``` Cloning into bare repository '/Users/frank/Documents/forge/frank/forgecli.git'...lter · [/] scroll remote: Enumerating objects: 1779, done. remote: Counting objects: 100% (1779/1779), done. remote: Compressing objects: 100% (1237/1237), done. remote: Total 1779 (delta 791), reused 1274 (delta 487), pack-reused 0 (from 0) Receiving objects: 100% (1779/1779), 2.94 MiB | 20.48 MiB/s, done. Receiving objects: 93% (1655/1779) Resolving deltas: 100% (791/791), done. Resolving deltas: 0% (0/791) ``` ## Erwartetes Verhalten - Git-Progress (Clone/Fetch) muss **innerhalb** der Agent-TUI bleiben (Log-Panel), analog zu anderen Agent-/Git-/CI-Ausgaben. - Carriage-Return-Progress (`Receiving objects: xx%`) darf die TUI nicht corrupt machen (Zeilen überschreiben / Layout verschieben). - Ohne TUI (`--no-tui`) darf Progress weiterhin auf stderr sichtbar sein. ## Vermutete Ursache `internal/gitutil/git.go` → `clone()` / `CloneBare()` leitet `Stdout`/`Stderr` fest auf `os.Stdout`/`os.Stderr` um. `EnsureRepoRoot` in `internal/agent/gitflow.go` hat zwar einen `log io.Writer` und schreibt dort `cloning bare …`, übergibt den Writer aber **nicht** an `CloneBare`. Dadurch umgeht der eigentliche `git clone --bare`-Progress die TUI komplett. ## Fix-Ideen 1. `CloneBare`/`clone` um optionalen `io.Writer` für Progress erweitern (oder Stdout/Stderr setzbar machen). 2. In `EnsureRepoRoot` den vorhandenen `log`-Writer an den Clone durchreichen. 3. Sicherstellen, dass `RunLogWriter` CR-Progress korrekt als einzelne Log-Zeilen behandelt (Test `TestRunLogWriterCarriageReturn` prüfen/erweitern). 4. Gleiches Muster für andere Git-Aufrufe prüfen, die noch direkt aufs Terminal schreiben. ## Repro 1. Bare-Cache für ein Repo löschen (oder neues Repo ohne lokalen Cache watchen). 2. `forge agent watch` im interaktiven Terminal starten (TUI aktiv). 3. Beim ersten Clone den Progress beobachten — Layout bricht.
Author
Owner

🤖 forge agent started

  • Agent: cursor-agent
  • Model: (default)
  • Mode: pr
  • Trigger: assignee=agent

TUI: Git-Clone-Progress von bare-Repos zerstört Layout — Beim ersten Bare-Clone eines Repos (z. B. unter forge agent watch mit TUI) schreibt git clone --bare seinen Progress direkt auf das Terminal. Die Ausgabe landet am unteren Bildschirmrand,…

🤖 **forge agent started** - Agent: `cursor-agent` - Model: `(default)` - Mode: `pr` - Trigger: `assignee=agent` TUI: Git-Clone-Progress von bare-Repos zerstört Layout — Beim ersten Bare-Clone eines Repos (z. B. unter `forge agent watch` mit TUI) schreibt `git clone --bare` seinen Progress direkt auf das Terminal. Die Ausgabe landet am unteren Bildschirmrand,…
frank 2026-07-13 01:40:31 +02:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
frank/forgecli#50
No description provided.