fix(agent): route bare git clone progress into TUI log panel #51
No reviewers
Labels
No labels
agent:done
agent:ready
agent:working
enhancement
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
frank/forgecli!51
Loading…
Reference in a new issue
No description provided.
Delete branch "agent/issue-50-tui-git-clone-progress-von-bare-repos-ze"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Summary
gitutil.Clone/CloneBare; CLI callers passniland keep terminal output.EnsureRepoRootto bare clone so first-time cache clones stay inside the dashboard log.RunLogWriterCR handling already collapsesReceiving objects: xx%lines; added regression tests.Test plan
go test ./...forge agent watch --tui, confirm clone progress appears in the log panel without corrupting the footerforge agent watch --no-tuiand confirm git progress still prints to stderrCloses #50
🚧 WIP pull request opened — linked to issue #50. Agent is working…
💭 Agent progress
Ich werde Issue #50 umsetzen. Der Git-Clone-Progress bei Bare-Repos zerstört das TUI-Layout.
Git-Progress soll über das TUI-Log-Panel laufen. Ohne TUI bleibt die Ausgabe bei stderr. Ich suche jetzt im Code nach der aktuellen Implementierung.
Ich schaue mir zuerst die relevanten Stellen im Code an: Git-Clone,
EnsureRepoRootund die TUI-Log-Ausgabe.💭 Agent progress
Ich lese weitere Dateien im Git-Flow-Prozess.
Nun werden status.go, tu.go und die Tests nach Verwendungen von CloneBare und runAuthenticated durchsucht.
💭 Agent progress
Ich muss die runLogWriter-Implementierung für Carriage-Return-Handling verstehen. Ich prüfe auch, ob es Tests für gitutil.CloneBare gibt.
💭 Agent progress
Ich prüfe die Write-Methode von runLogWriter und die Tests in gitutil.
💭 Agent progress
Ich habe das Problem verstanden und bereite die Umsetzung vor.
Die Lösung erfordert einen optionalen
io.Writerfür den Git-Clone-Fortschritt ingitutil.EnsureRepoRootleitet den Log-Writer dorthin. Andere Git-Befehle werden ebenfalls auf direkte Terminal-Ausgaben geprüft.Der konkrete Ansatz ist ein neuer Parameter
progress io.WriterinCloneBareundclone. Die Git-Ausgabe wird dann direkt an diesen Writer geleitet statt auf das Terminal zu schreiben.Der Fortschritt soll nur bei einem angegebenen Writer geleitet werden. Ohne Writer bleibt die Ausgabe auf stderr. Die CLI-Kommandos in
cmd/root.gobleiben unverändert.Ein Hilfsfunktion
outputWriterswird ergänzt. Sie leitet alle Ausgaben an den optionalen Writer oder aufos.Stdout/os.Stderrum, falls kein Writer angegeben ist. Damit bleibt die bestehende CLI-Nutzung vollständig abwärtskompatibel.FetchOriginverwendet bereits den Log-Writer. Nun folgt die Implementierung und ein Test fürEnsureRepoRoot.Ein Unit-Test für den Writer-Parameter ist ohne echtes Git schwierig. Ein Integrationstest in
agent.gowäre besser geeignet. Ich prüfe nun, wieagent.goden Log-Writer anEnsureRepoRootübergibt.💭 Agent progress
Ich prüfe in agent.go, ob errW bei aktivierter TUI ein RunLogWriter ist.
💭 Agent progress
Bei aktivierter TUI leitet
errWüberstatus.WatchLogWriter()die Ausgabe direkt an die TUI weiter.Der Fix übergibt den Log-Writer an
CloneBare. Dafür werdenclone,CloneundCloneBareingitutil/git.goum einen optionalenio.Writererweitert.EnsureRepoRootleitet den Writer anCloneBaredurch.CloneSSHbleibt unverändert. Ein Test für Carriage-Return-Progress intui_test.gowird ergänzt.Ein Test mit
bytes.Bufferund lokalerfile://-Quelle prüft die Writer-Übergabe.PullundrunAuthenticatedlaufen über CLI-Pfade und bleiben unverändert. Der Agent-Pfad nutzt bereitsrunGitAuthmit Log-Writer. Die API-Änderung setztprogressals letzten Parameter inCloneundCloneBare.Aufrufe in
root.gowerden angepasst, damitnilan den neuen Writer-Parameter übergeben wird. FürEnsureRepoRootwird ein Test mit einer lokalenfile://-Remote-Quelle geprüft. Dazu muss die Implementierung vonForge.CloneURLanalysiert werden.💭 Agent progress
Die Aufrufe in root.go müssen aktualisiert werden, um den Progress-Parameter als nil zu übergeben.
Ich plane Tests für EnsureRepoRoot mit einem lokalen Bare-Remote und gefilterter Log-Ausgabe. Ich prüfe, ob CloneURL per URL-Override angepasst werden kann.
💭 Agent progress
Ich teste den Bare-Clone lokal mit einer lokalen Git-URL.
Ich schreibe einen Go-Test für
EnsureRepoRoot, der den Bare-Clone-Output in einem Buffer erfasst und auf die Progress-Meldungen prüft.Die Git-Progress landet standardmäßig auf stderr. Ich leite sie in den Buffer um. Nun implementiere ich die Lösung.
Ich setze den Fix um: Git-Clone-Progress optional über einen Writer leiten und in
EnsureRepoRootan die TUI anbinden.💭 Agent progress
Tests werden ergänzt. Ein Gitflow-Test prüft EnsureRepoRoot-Clone mit Log. Das TUI-Test wird um eine Git-ähnliche CR-Progress-Sequenz erweitert.
💭 Agent progress
Ich prüfe, ob
stringsbereits intui_test.goimportiert ist.💭 Agent progress
Der Test ist fehlgeschlagen, weil ResolveRepoRootFor den aktuellen Arbeitsverzeichnis als Git-Repository erkannt hat.
Ich muss in ein temporäres Verzeichnis wechseln, wie es TestResolvRootForBareCache bereits tut.
Der Test schlägt fehl, weil das aktuelle Worktree-Repo gefunden wird — ich isoliere den Test in ein temporäres Verzeichnis.
💭 Agent progress
Ein eindeutiger Owner/Repo-Name wird benötigt, um eine Übereinstimmung mit dem aktuellen Arbeitsverzeichnis zu vermeiden. Ein Wechsel in das leere cacheRoot-Verzeichnis löst das Problem, da dort kein Git-Repository mehr existiert.
Die Tests werden erneut ausgeführt.
💭 Agent progress
Der Test bestätigt die Korrektur. Der Clone-Progress wird korrekt erfasst.
Die Assertion wurde auf „Cloning into bare repository“ umgestellt. Bei einem kleinen lokalen Clone erscheint „Receiving objects“ möglicherweise nicht.
💭 Agent progress
Die Tests werden jetzt ausgeführt. Änderungen werden inkrementell committet.
💭 Agent progress
Alle Tests bestanden. Ich werde nun schrittweise committen und pushen.
Die Änderungen werden in drei kleine Commits aufgeteilt: gitutil mit optionaler Progress-Ausgabe, Agent mit TUI-Log-Writer für Bare-Clones und Tests für die Log-Routung.
Alle Tests sind grün. Ich committe und pushe die Änderungen in logischen Schritten.
💭 Agent progress
Ich werde zwei Commits machen. Der erste betrifft die Kern-API-Änderung in gitutil und cmd/root.go.
Der zweite Commit richtet den Bare-Clone-Progress in die TUI-Log-Route um. Der dritte Commit fügt Tests für den Log-Routing und den CR-Progress hinzu.
💭 Agent progress
Der erste Commit wurde gepusht. Nun folgen Agent-Änderungen und Tests.
💭 Agent progress
Die Tests werden nun committet.
WIP: #50 TUI: Git-Clone-Progress von bare-Repos zerstört Layoutto fix(agent): route bare git clone progress into TUI log panel✅ forge agent finished implementation
test(agent): cover bare clone log routing and CR progressAgent output (tail)
🟢 CI green (attempt 1/3)
https://repository.hildebrandt.io/frank/forgecli/actions/runs/115
💭 Agent progress
Die Implementierung ist abgeschlossen. Ich erstelle nun die Zusammenfassung mit den geforderten Markern.
Zusammenfassung
Git-Clone-Progress von bare-Repos landet nicht mehr direkt auf dem Terminal und zerstört damit nicht mehr das TUI-Layout.
Änderungen:
internal/gitutil/git.go–Clone/CloneBarenehmen einen optionalenprogress io.Writer. Ist er gesetzt, gehen stdout/stderr dorthin; beinilbleibt das bisherige Terminal-Verhalten.internal/agent/gitflow.go–EnsureRepoRootreicht den vorhandenenlog-Writer anCloneBareweiter (wie schon beiFetchOriginund anderen Git-Aufrufen).TestEnsureRepoRootCloneUsesLogWriterprüft die Weiterleitung;TestRunLogWriterGitCloneProgressprüft CR-basierten Git-Progress im TUI-Log.Commits (3, gepusht):
fix(gitutil): route git clone progress through optional writerfix(agent): pass watch log writer to bare repo clonetest(agent): cover bare clone log routing and CR progressSummary
gitutil.Clone/CloneBare; CLI callers passniland keep terminal output.EnsureRepoRootto bare clone so first-time cache clones stay inside the dashboard log.RunLogWriterCR handling already collapsesReceiving objects: xx%lines; added regression tests.Test plan
go test ./...forge agent watch --tui, confirm clone progress appears in the log panel without corrupting the footerforge agent watch --no-tuiand confirm git progress still prints to stderr