fix(agent): paste in repo-add dialog; add --all-repos watch flag #49

Merged
frank merged 2 commits from agent/issue-48-agent-config-paste-bei-repo-add-kaputt-f into main 2026-07-13 01:40:25 +02:00
Owner

Summary

  • Fix terminal paste (Ctrl/Cmd+V, bracketed paste) in the agent config TUI and watch-dashboard repo-add dialog (a).
  • Add --all-repos / all_repos: true to watch every repository accessible to the authenticated Forgejo user; explicit repos: entries are merged and override path/limits per owner/name.
  • Document both changes in CLI help and the Agent-Watcher wiki page.

Test plan

  • go test ./...
  • Paste unit tests (TestInsertRunesPaste, TestAppendRunesPaste)
  • Repo list resolution tests (TestExpandAllRepos*)
  • Manual: forge agent watch --tui, press a, paste HTTPS URL, confirm
  • Manual: forge agent watch --all-repos --label … --agent … --pr lists all accessible repos

Closes #48

## Summary - Fix terminal paste (Ctrl/Cmd+V, bracketed paste) in the agent config TUI and watch-dashboard repo-add dialog (`a`). - Add `--all-repos` / `all_repos: true` to watch every repository accessible to the authenticated Forgejo user; explicit `repos:` entries are merged and override path/limits per owner/name. - Document both changes in CLI help and the Agent-Watcher wiki page. ## Test plan - [x] `go test ./...` - [x] Paste unit tests (`TestInsertRunesPaste`, `TestAppendRunesPaste`) - [x] Repo list resolution tests (`TestExpandAllRepos*`) - [ ] Manual: `forge agent watch --tui`, press `a`, paste HTTPS URL, confirm - [ ] Manual: `forge agent watch --all-repos --label … --agent … --pr` lists all accessible repos Closes #48
Author
Owner

🚧 WIP pull request opened — linked to issue #48. Agent is working…

🚧 **WIP pull request opened** — linked to issue #48. Agent is working…
Author
Owner

💭 Agent progress

Ich werde Issue #48 umsetzen. Zwei Punkte sind zu bearbeiten: Copy-Paste im Repo-Add und das Flag --all-repos.

Ich suche jetzt nach dem Repo-Add-Dialog und den zugehörigen Befehlen. Danach folgen Tests und Dokumentation.
Ich setze Issue #48 um: zuerst den Repo-Add-Dialog und die Agent-Watch-Konfiguration im Code untersuchen.

💭 **Agent progress** Ich werde Issue #48 umsetzen. Zwei Punkte sind zu bearbeiten: Copy-Paste im Repo-Add und das Flag --all-repos. Ich suche jetzt nach dem Repo-Add-Dialog und den zugehörigen Befehlen. Danach folgen Tests und Dokumentation. Ich setze Issue #48 um: zuerst den Repo-Add-Dialog und die Agent-Watch-Konfiguration im Code untersuchen.
Author
Owner

💭 Agent progress

Ich untersuche die Config-TUI und den Watch-Befehl genauer. Der Fokus liegt auf dem Repo-Add und der Texteingabe.

💭 **Agent progress** Ich untersuche die Config-TUI und den Watch-Befehl genauer. Der Fokus liegt auf dem Repo-Add und der Texteingabe.
Author
Owner

💭 Agent progress

Ich prüfe die Funktionen handleEditKey und handleAddRepoKey, um zu verstehen, wie Copy & Paste im Repo-Add abläuft.

💭 **Agent progress** Ich prüfe die Funktionen handleEditKey und handleAddRepoKey, um zu verstehen, wie Copy & Paste im Repo-Add abläuft.
Author
Owner

💭 Agent progress

Ich habe den Bug lokalisiert. Die Handler handleAddRepoKey und handleEditKey akzeptieren Eingaben nur, wenn len(msg.Runes) == 1. Dadurch blockiert das Tastatur-Eingabesystem Copy-and-Paste im Hotkey-Dialog.

Die Lösung ist, alle Eingaben zu akzeptieren, sobald len(msg.Runes) > 0 ist. Ich prüfe nun, wie Bubble Tea PasteMsg und Bracketed Paste verarbeitet.

💭 **Agent progress** Ich habe den Bug lokalisiert. Die Handler `handleAddRepoKey` und `handleEditKey` akzeptieren Eingaben nur, wenn `len(msg.Runes) == 1`. Dadurch blockiert das Tastatur-Eingabesystem Copy-and-Paste im Hotkey-Dialog. Die Lösung ist, alle Eingaben zu akzeptieren, sobald `len(msg.Runes) > 0` ist. Ich prüfe nun, wie Bubble Tea PasteMsg und Bracketed Paste verarbeitet.
Author
Owner

💭 Agent progress

Ich erkenne den Bug beim Einfügen von URLs per Copy & Paste im Repo-Add-Flow. Die Bedingung len(msg.Runes) == 1 muss angepasst werden, damit mehrere Zeichen als Einzelzeichen nicht mehr blockiert werden.

Die Anpassung betrifft handleEditKey und handlpoKey. Zeile 229 in tui.go muss ebenfalls geprüft werden. Die Auflösung der Repos wird in agentfile.go und ApplyAgentFile untersucht. Der API-Client-Methoden ListRepos wird analysiert.

💭 **Agent progress** Ich erkenne den Bug beim Einfügen von URLs per Copy & Paste im Repo-Add-Flow. Die Bedingung `len(msg.Runes) == 1` muss angepasst werden, damit mehrere Zeichen als Einzelzeichen nicht mehr blockiert werden. Die Anpassung betrifft handleEditKey und handlpoKey. Zeile 229 in tui.go muss ebenfalls geprüft werden. Die Auflösung der Repos wird in agentfile.go und ApplyAgentFile untersucht. Der API-Client-Methoden ListRepos wird analysiert.
Author
Owner

💭 Agent progress

Ich lese config.go, um zu verstehen, wie AllRepos hinzugefügt wird.

ListRepos-API und config_tui_test werden ebenfalls gelesen, um Muster zu finden.

💭 **Agent progress** Ich lese config.go, um zu verstehen, wie AllRepos hinzugefügt wird. ListRepos-API und config_tui_test werden ebenfalls gelesen, um Muster zu finden.
Author
Owner

💭 Agent progress

Ich prüfe, wie agentWatchDeps funktioniert und ob bereits ein Mechanismus für alle Repos existiert.

Ich lese die Wiki-Dokumentation und prüfe den aktuellen Git-Status.

💭 **Agent progress** Ich prüfe, wie agentWatchDeps funktioniert und ob bereits ein Mechanismus für alle Repos existiert. Ich lese die Wiki-Dokumentation und prüfe den aktuellen Git-Status.
Author
Owner

💭 Agent progress

Ich habe das Problem verstanden und plane nun die Implementierung.

Die Paste-Funktion ist in zwei Stellen blockiert: handleEditKey in config_tui.go und handleAddRepoKey in tui.go. Dort wird nur ein einzelnes Zeichen erkannt. Ich ändere die Bedingungen auf len(msg.Runes) > 0, damit mehrzeilige Einfügungen funktionieren. Für die Config-TUI füge ich die Eingabe mit Cursor-Einschleusung hinzu. Für das Hinzufügen von Repos reicht ein einfaches Anhängen der Zeichenkette. Zudem prüfe ich, ob cmd+v als spezieller Tastendruck ankommt.

Ich verzichte auf eine separate Hilfsfunktion und passe den Code direkt an. Die Eingabe wird in handleEditKey als String aus den Runes gelesen und in den aktiven Felder-Text eingefügt.

Für die Config-TUI prüfe ich die Eingabe im Int-Feld auf gültige Ziffern. Der Text wird an der Cursor-Position eingeschoben. Für das Hinzufügen von Repos wird die Zeichenkette direkt angehängt.

Nun plane ich die --all-repos-Flag. Dazu füge ich ein AllRepos-Feld zur Config hinzu und ergänze es im AgentFile.

Das Flag kommt in die Befehle agent watch und agent run. Bei Aktivierung holt der Agent alle Repositories über die API und fügt sie zu den explizit konfigurierten hinzu. Explizite Repos mit eigenen Overrides bleiben erhalten. Dynamische Einträge werden nur ergänzt, wenn sie noch nicht existieren.

Bei kombinierten Einstellungen gewinnen explizite Konfigurationen. Die Defaults für parallele Verarbeitung sind bereits gesetzt, aber Nutzer sollten Limits bei --all-repos selbst setzen. Ich prüfe nun die Repository-Struktur.

💭 **Agent progress** Ich habe das Problem verstanden und plane nun die Implementierung. Die Paste-Funktion ist in zwei Stellen blockiert: `handleEditKey` in `config_tui.go` und `handleAddRepoKey` in `tui.go`. Dort wird nur ein einzelnes Zeichen erkannt. Ich ändere die Bedingungen auf `len(msg.Runes) > 0`, damit mehrzeilige Einfügungen funktionieren. Für die Config-TUI füge ich die Eingabe mit Cursor-Einschleusung hinzu. Für das Hinzufügen von Repos reicht ein einfaches Anhängen der Zeichenkette. Zudem prüfe ich, ob `cmd+v` als spezieller Tastendruck ankommt. Ich verzichte auf eine separate Hilfsfunktion und passe den Code direkt an. Die Eingabe wird in `handleEditKey` als String aus den Runes gelesen und in den aktiven Felder-Text eingefügt. Für die Config-TUI prüfe ich die Eingabe im Int-Feld auf gültige Ziffern. Der Text wird an der Cursor-Position eingeschoben. Für das Hinzufügen von Repos wird die Zeichenkette direkt angehängt. Nun plane ich die `--all-repos`-Flag. Dazu füge ich ein `AllRepos`-Feld zur Config hinzu und ergänze es im AgentFile. Das Flag kommt in die Befehle `agent watch` und `agent run`. Bei Aktivierung holt der Agent alle Repositories über die API und fügt sie zu den explizit konfigurierten hinzu. Explizite Repos mit eigenen Overrides bleiben erhalten. Dynamische Einträge werden nur ergänzt, wenn sie noch nicht existieren. Bei kombinierten Einstellungen gewinnen explizite Konfigurationen. Die Defaults für parallele Verarbeitung sind bereits gesetzt, aber Nutzer sollten Limits bei --all-repos selbst setzen. Ich prüfe nun die Repository-Struktur.
Author
Owner

💭 Agent progress

Ich prüfe die Felder von configSectionAdvanced, um das Flag --all-repos in der Config-TUI zu platzieren.

Ich prüfe die Validierung in agentWatchDeps. Bei aktiviertem AllRepos müssen die Repos vor der Prüfung auf Targets erweitert werden. Der Ablauf sieht vor: buildAgentConfig setzt cfg.AllRepos, agentWatchDeps ruft expandRepos auf, bevor targets geprüft werden. Für agent run muss ich ähnliche Logik in runAgentOne oder agentDeps ergänzen.

💭 **Agent progress** Ich prüfe die Felder von configSectionAdvanced, um das Flag --all-repos in der Config-TUI zu platzieren. Ich prüfe die Validierung in agentWatchDeps. Bei aktiviertem AllRepos müssen die Repos vor der Prüfung auf Targets erweitert werden. Der Ablauf sieht vor: buildAgentConfig setzt cfg.AllRepos, agentWatchDeps ruft expandRepos auf, bevor targets geprüft werden. Für agent run muss ich ähnliche Logik in runAgentOne oder agentDeps ergänzen.
Author
Owner

💭 Agent progress

agent run verwendet nur ein einzelnes Forge mit cfg.Owner und cfg.Repo. Es iteriert nicht über alle Repos.

Der Flag --all-repos ist für agent run weniger sinnvoll, da dieser Befehl eine einzelne Issue-Nummer verarbeitet. Dennoch wird er konsistent zu beiden Kommandos hinzugefügt.

Der Flag --all-repos wird primär für den Watch-Befehl ergänzt. Er wird auch in der agent.yaml für Watch unterstützt. Für agent run bleibt er ausgelassen, da die Issue-Nummer das passende Repository bereits kennt.

Die Funktion ExpandAllRepos wird implementiert. Sie ruft alle zugänglichen Repositories über die API ab und fügt sie der Konfiguration hinzu. Der Scope bleibt bewusst klein und umfasst nur den Watch-Befehl.

Explizite Repository-Ziele und Owner/Repo werden als Map gespeichert. Die API-Auflistung wird durchlaufen und nur gültige Einträge mit Owner und Name übernommen.

Doppelte Einträge werden vermieden. Explizite Ziel-Repositories überschreiben API-Einträge. Fehlende explizite Repositories werden ergänzt.

Die Implementierung von ExpandAllRepos wird abgeschlossen. Die erweiterte Liste wird in cfg.Repos geschrieben. Falls cfg.Owner leer ist, wird das erste Repository der Liste als Standardwert gesetzt.

Es wird erwogen, ob cfg.Owner und cfg.Repo bei aktiviertem --all-repos nicht mehr als einzelnes Default-Repository gelten sollen. Stattdessen soll die Konfiguration ausschließlich aus den API-Abgerufenen Repositories bestehen.

Bei aktiviertem --all-repos sollte cfg.Owner und cfg.Repo geleert werden. Sonst würde das aktuelle Repository aus dem Arbeitsverzeichnis doppelt in die erweiterte Liste aufgenommen.

Die Duplikatentfernung in RepoTargets übernimmt das Problem automatisch. Ein Repository aus dem Arbeitsverzeichnis erscheint nicht doppelt, wenn es auch in der API-Liste steht. Die Validierung auf leere Ziel-Liste funktioniert nach der Erweiterung korrekt.

Beim Neuladen der Watch-Konfiguration muss die Repository-Expansion bei aktiviertem AllRepos erneut ausgeführt werden. Dafür wird der Ablauf in watch_config.go geprüft.

💭 **Agent progress** `agent run` verwendet nur ein einzelnes Forge mit cfg.Owner und cfg.Repo. Es iteriert nicht über alle Repos. Der Flag `--all-repos` ist für `agent run` weniger sinnvoll, da dieser Befehl eine einzelne Issue-Nummer verarbeitet. Dennoch wird er konsistent zu beiden Kommandos hinzugefügt. Der Flag `--all-repos` wird primär für den Watch-Befehl ergänzt. Er wird auch in der `agent.yaml` für Watch unterstützt. Für `agent run` bleibt er ausgelassen, da die Issue-Nummer das passende Repository bereits kennt. Die Funktion `ExpandAllRepos` wird implementiert. Sie ruft alle zugänglichen Repositories über die API ab und fügt sie der Konfiguration hinzu. Der Scope bleibt bewusst klein und umfasst nur den Watch-Befehl. Explizite Repository-Ziele und Owner/Repo werden als Map gespeichert. Die API-Auflistung wird durchlaufen und nur gültige Einträge mit Owner und Name übernommen. Doppelte Einträge werden vermieden. Explizite Ziel-Repositories überschreiben API-Einträge. Fehlende explizite Repositories werden ergänzt. Die Implementierung von `ExpandAllRepos` wird abgeschlossen. Die erweiterte Liste wird in `cfg.Repos` geschrieben. Falls `cfg.Owner` leer ist, wird das erste Repository der Liste als Standardwert gesetzt. Es wird erwogen, ob `cfg.Owner` und `cfg.Repo` bei aktiviertem `--all-repos` nicht mehr als einzelnes Default-Repository gelten sollen. Stattdessen soll die Konfiguration ausschließlich aus den API-Abgerufenen Repositories bestehen. Bei aktiviertem `--all-repos` sollte `cfg.Owner` und `cfg.Repo` geleert werden. Sonst würde das aktuelle Repository aus dem Arbeitsverzeichnis doppelt in die erweiterte Liste aufgenommen. Die Duplikatentfernung in `RepoTargets` übernimmt das Problem automatisch. Ein Repository aus dem Arbeitsverzeichnis erscheint nicht doppelt, wenn es auch in der API-Liste steht. Die Validierung auf leere Ziel-Liste funktioniert nach der Erweiterung korrekt. Beim Neuladen der Watch-Konfiguration muss die Repository-Expansion bei aktiviertem `AllRepos` erneut ausgeführt werden. Dafür wird der Ablauf in `watch_config.go` geprüft.
Author
Owner

💭 Agent progress

WatchConfigurator muss Repositories beim Reload erweitern, wenn all_repos: true in der YAML-Konfiguration steht.

BuildRepos nutzt cfg.RepoTargets(), weshalb die API-Aufrufe erst nach der Erweiterung erfolgen. Ein neuer ExpandAllRepos-Helper im Agent-Paket soll vor dem BuildRepos in agentWatchDeps und watch_config/Reload ausgeführt werden. Die Erweiterung muss dabei API-Client-Zugriff benötigen.

Der Helper ExpandAllRepos soll in einem neuen File agent/repos.go landen. Er arbeitet mit einer RepoLister-Schnittstelle und einem Callback für WatchConfigurator. Damit bleibt die Erweiterung zentral und testbar.

Die Erweiterungslogik wird in internal/agent/repos.go mit einer RepoLister-Schnittstelle platziert. Ein Adapter in internal/cmd/agent.go liefert den ForgejoRepoLister. WatchConfigurator erhält ein ExpandRepos-Callback. Dieser wird in reloadFromFile nach ApplyAgentFile aufgerufen.

Ein Mock-RepoLister soll die Tests für die Erweiterung bereitstellen. Für das Copy-Paste-Problem wird eine Hilfsfunktion zum Einfügen von Zeichen an der Cursorposition geprüft. Sie ermöglicht Unit-Tests für die TUI-Logik.

Eine neue Datei textinput.go im Agent-Paket enthält den gemeinsamen Helper insertRunes. Er fügt Zeichen an der Cursorposition ein und filtert bei Bedarf nur Ziffern. Damit lassen sich beide TUIs für das Copy-Paste-Problem zentral testen.

Zusätzlich zu insertRunes wird eine appendRunes-Hilfsfunktion ergänzt, die Zeichen am Ende des Buffers anhängt. Beide Funktionen sollen mit Multi-Rune-Copy-Paste getestet werden.

Das Feld all_repos wird in der Config-TUI unter der Advanced-Sektion ergänzt. In der AgentFile und der Config-Struktur wird es als AllRepos bool mit YAML-Tag all_repos,omitempty definiert.

Die Flag --all-repos wird nur für den Watch-Befehl sichtbar gemacht. ApplyAgentFile setzt cfg.AllRepos auf true, wenn die Konfiguration all_repos: true enthält und die Flag nicht aktiv ist. buildAgentConfig übernimmt den Wert aus den Kommandozeilen-Flags.

Bei aktiviertem all_repos ohne explizite Limits bleiben die Standardwerte erhalten. Unbegrenzte offene Pull Requests bei vielen Repositories könnten problematisch sein.

Statt Default-Limits zu ändern, wird empfohlen, explizite Limits in der Wiki-Dokumentation zu dokumentieren. Bei Kollision zwischen --all-repos und --repos überschreiben explizite Repository-Listen aus --repos und YAML die API-Liste.

Der Implementierungsplan gliedert sich in drei Schritte: erstes Commit für das Copy-Paste-Problem, zweites Commit für die all_repos-Infrastruktur, drittes Commit für Tests und Dokumentation. Zudem wird geprüft, wie Bool-Felder in der Config-TUI editiert werden.

💭 **Agent progress** WatchConfigurator muss Repositories beim Reload erweitern, wenn `all_repos: true` in der YAML-Konfiguration steht. BuildRepos nutzt cfg.RepoTargets(), weshalb die API-Aufrufe erst nach der Erweiterung erfolgen. Ein neuer ExpandAllRepos-Helper im Agent-Paket soll vor dem BuildRepos in agentWatchDeps und watch_config/Reload ausgeführt werden. Die Erweiterung muss dabei API-Client-Zugriff benötigen. Der Helper `ExpandAllRepos` soll in einem neuen File `agent/repos.go` landen. Er arbeitet mit einer `RepoLister`-Schnittstelle und einem Callback für WatchConfigurator. Damit bleibt die Erweiterung zentral und testbar. Die Erweiterungslogik wird in `internal/agent/repos.go` mit einer `RepoLister`-Schnittstelle platziert. Ein Adapter in `internal/cmd/agent.go` liefert den `ForgejoRepoLister`. `WatchConfigurator` erhält ein `ExpandRepos`-Callback. Dieser wird in `reloadFromFile` nach `ApplyAgentFile` aufgerufen. Ein Mock-RepoLister soll die Tests für die Erweiterung bereitstellen. Für das Copy-Paste-Problem wird eine Hilfsfunktion zum Einfügen von Zeichen an der Cursorposition geprüft. Sie ermöglicht Unit-Tests für die TUI-Logik. Eine neue Datei `textinput.go` im Agent-Paket enthält den gemeinsamen Helper `insertRunes`. Er fügt Zeichen an der Cursorposition ein und filtert bei Bedarf nur Ziffern. Damit lassen sich beide TUIs für das Copy-Paste-Problem zentral testen. Zusätzlich zu `insertRunes` wird eine `appendRunes`-Hilfsfunktion ergänzt, die Zeichen am Ende des Buffers anhängt. Beide Funktionen sollen mit Multi-Rune-Copy-Paste getestet werden. Das Feld `all_repos` wird in der Config-TUI unter der Advanced-Sektion ergänzt. In der AgentFile und der Config-Struktur wird es als `AllRepos bool` mit YAML-Tag `all_repos,omitempty` definiert. Die Flag `--all-repos` wird nur für den Watch-Befehl sichtbar gemacht. `ApplyAgentFile` setzt `cfg.AllRepos` auf `true`, wenn die Konfiguration `all_repos: true` enthält und die Flag nicht aktiv ist. `buildAgentConfig` übernimmt den Wert aus den Kommandozeilen-Flags. Bei aktiviertem `all_repos` ohne explizite Limits bleiben die Standardwerte erhalten. Unbegrenzte offene Pull Requests bei vielen Repositories könnten problematisch sein. Statt Default-Limits zu ändern, wird empfohlen, explizite Limits in der Wiki-Dokumentation zu dokumentieren. Bei Kollision zwischen --all-repos und --repos überschreiben explizite Repository-Listen aus --repos und YAML die API-Liste. Der Implementierungsplan gliedert sich in drei Schritte: erstes Commit für das Copy-Paste-Problem, zweites Commit für die all_repos-Infrastruktur, drittes Commit für Tests und Dokumentation. Zudem wird geprüft, wie Bool-Felder in der Config-TUI editiert werden.
Author
Owner

💭 Agent progress

Die Implementierung beginnt mit dem Fix für das Einfügen per Copy & Paste.

textinput.go mit Hilfsfunktionen für den Paste-Test wird erstellt. Für ExpandAllRepos wird repos.go im Agent-Paket angelegt. Die nötige Schnittstelle AccessibleRepoLister wird dort definiert.

Die Funktion ExpandAllRepos wird implementiert. Sie fügt bei aktiviertem --all-repos automatisch alle zugänglichen Repositories hinzu. Explizit konfigurierte Einträge überschreiben dabei passende Repositories.

Die Implementierung von ExpandAllRepos wird fortgesetzt. Fehler beim Auflisten der Repositories werden abgefangen. Explizite Konfigurationseinträge werden als Overrides gesammelt. Der Merge-Prozess für die finalen Repository-Ziele beginnt.

Die Merge-Logik in ExpandAllRepos wird vervollständigt. Ungültige Einträge und Duplikate werden verworfen. Überschreibungen aus der expliziten Konfiguration werden angewendet. Fehlende Repositories bleiben erhalten.

Die Merge-Logik in ExpandAllRepos ist nun vollständig. Die finalen Repository-Ziele werden in cfg.Repos gespeichert.

In cmd/agent.go wird ein Adapter forgeRepoLister eingeführt. Er nutzt den Forgejo-API-Client, um alle zugänglichen Repositories abzurufen.

Der Adapter forgeRepoLister wird in agentWatchDeps aufgerufen. ExpandAllRepos erhält den Client als AccessibleRepoLister. ExpandRepos wird auf WatchConfigurator gesetzt. Bei aktiviertem --all-repos ohne erreichbare Repositories wird ein Fehler zurückgegeben.

Fehlermeldungen für fehlende Repositories werden angepasst. Ohne aktiviertes --all-repos wird eine Fehlermeldung mit -R oder --repos ausgegeben. Bei aktiviertem --all-repos wird stattdessen --all-repos erwähnt.
Ich beginne mit dem Paste-Fix, danach folgt --all-repos.

💭 **Agent progress** Die Implementierung beginnt mit dem Fix für das Einfügen per Copy & Paste. `textinput.go` mit Hilfsfunktionen für den Paste-Test wird erstellt. Für `ExpandAllRepos` wird `repos.go` im Agent-Paket angelegt. Die nötige Schnittstelle `AccessibleRepoLister` wird dort definiert. Die Funktion `ExpandAllRepos` wird implementiert. Sie fügt bei aktiviertem `--all-repos` automatisch alle zugänglichen Repositories hinzu. Explizit konfigurierte Einträge überschreiben dabei passende Repositories. Die Implementierung von `ExpandAllRepos` wird fortgesetzt. Fehler beim Auflisten der Repositories werden abgefangen. Explizite Konfigurationseinträge werden als Overrides gesammelt. Der Merge-Prozess für die finalen Repository-Ziele beginnt. Die Merge-Logik in `ExpandAllRepos` wird vervollständigt. Ungültige Einträge und Duplikate werden verworfen. Überschreibungen aus der expliziten Konfiguration werden angewendet. Fehlende Repositories bleiben erhalten. Die Merge-Logik in `ExpandAllRepos` ist nun vollständig. Die finalen Repository-Ziele werden in `cfg.Repos` gespeichert. In `cmd/agent.go` wird ein Adapter `forgeRepoLister` eingeführt. Er nutzt den Forgejo-API-Client, um alle zugänglichen Repositories abzurufen. Der Adapter `forgeRepoLister` wird in `agentWatchDeps` aufgerufen. `ExpandAllRepos` erhält den Client als `AccessibleRepoLister`. `ExpandRepos` wird auf `WatchConfigurator` gesetzt. Bei aktiviertem `--all-repos` ohne erreichbare Repositories wird ein Fehler zurückgegeben. Fehlermeldungen für fehlende Repositories werden angepasst. Ohne aktiviertes `--all-repos` wird eine Fehlermeldung mit `-R` oder `--repos` ausgegeben. Bei aktiviertem `--all-repos` wird stattdessen `--all-repos` erwähnt. Ich beginne mit dem Paste-Fix, danach folgt `--all-repos`.
Author
Owner

💭 Agent progress

Ich prüfe, ob der Unicode-Import in config_tui.go noch überall verwendet wird und entferne ihn gegebenenfalls.

💭 **Agent progress** Ich prüfe, ob der Unicode-Import in config_tui.go noch überall verwendet wird und entferne ihn gegebenenfalls.
Author
Owner

💭 Agent progress

Der Import unicode in config_tui.go scheint dort nicht mehr verwendet zu werden.

Ich prüfe, ob der Import unicode noch an anderer Stelle in config_tui.go genutzt wird.

💭 **Agent progress** Der Import `unicode` in `config_tui.go` scheint dort nicht mehr verwendet zu werden. Ich prüfe, ob der Import `unicode` noch an anderer Stelle in `config_tui.go` genutzt wird.
Author
Owner

💭 Agent progress

Der nicht verwendete Unicode-Import in config_tui.go wird entfernt.

💭 **Agent progress** Der nicht verwendete Unicode-Import in config_tui.go wird entfernt.
Author
Owner

💭 Agent progress

Die Paste-Funktion wird nun committet und gepusht. Danach wird das Flag --all-repos implementiert.

💭 **Agent progress** Die Paste-Funktion wird nun committet und gepusht. Danach wird das Flag --all-repos implementiert.
fix(agent): accept multi-rune paste in config and repo-add inputs
All checks were successful
CI / test (pull_request) Successful in 32s
CI / race (pull_request) Successful in 32s
f41dd94775
Terminal paste sends multiple runes at once; the TUI previously ignored
anything except single-character key events.

Co-authored-by: Cursor <cursoragent@cursor.com>
Author
Owner

💭 Agent progress

Die Implementierung des Flags --all-repos beginnt.

Die Änderungen betreffen repos.go, die Konfiguration, agntfile, cmd/agent.go, watch_config.go, die TUI, Dokumentation und Tests.
Jetzt implementiere ich --all-repos.

💭 **Agent progress** Die Implementierung des Flags --all-repos beginnt. Die Änderungen betreffen repos.go, die Konfiguration, agntfile, cmd/agent.go, watch_config.go, die TUI, Dokumentation und Tests. Jetzt implementiere ich `--all-repos`.
Author
Owner

💭 Agent progress

Die Dateien watch_config.go und cmd/agent werden jetzt aktualisiert.

Auch config_tui.go wird für das all_repos-Feld aktualisiert.

💭 **Agent progress** Die Dateien watch_config.go und cmd/agent werden jetzt aktualisiert. Auch config_tui.go wird für das all_repos-Feld aktualisiert.
Author
Owner

💭 Agent progress

Ich füge AllRepos zu cfg und Flags in buildAgentConfig hinzu und aktualisiere agentWatchDeps.

💭 **Agent progress** Ich füge AllRepos zu cfg und Flags in buildAgentConfig hinzu und aktualisiere agentWatchDeps.
Author
Owner

💭 Agent progress

Ich füge das AllRepos-Flag zur Agent-Konfiguration hinzu und lese es aus dem Flag.

Ich erweitere die Repositories im Agent-Watcher vor dem Build. Ein Helper und ein Lister für alle Repositen werden ergänzt. Die Fehlermeldung wird angepasst. Das Flag kommt in die Config-TUI und die Lang-Help des Watch-Befehls.

💭 **Agent progress** Ich füge das AllRepos-Flag zur Agent-Konfiguration hinzu und lese es aus dem Flag. Ich erweitere die Repositories im Agent-Watcher vor dem Build. Ein Helper und ein Lister für alle Repositen werden ergänzt. Die Fehlermeldung wird angepasst. Das Flag kommt in die Config-TUI und die Lang-Help des Watch-Befehls.
Author
Owner

💭 Agent progress

ExpandRepos muss zu WatchConfigurator in runAgentWatch hinzugefügt werden.

💭 **Agent progress** ExpandRepos muss zu WatchConfigurator in runAgentWatch hinzugefügt werden.
Author
Owner

💭 Agent progress

Ich füge ExpandRepos zum WatchConfigurator hinzu.

Die Lang-Help des Watch-Befehls wird um --all-repos ergänzt.

💭 **Agent progress** Ich füge ExpandRepos zum WatchConfigurator hinzu. Die Lang-Help des Watch-Befehls wird um --all-repos ergänzt.
Author
Owner

💭 Agent progress

Die Wiki-Dokumentation wird aktualisiert.

Die lokale Datei docs/wiki/Agent-Watch.md wird aktualisiert. Danach folgen Tests und Commit.

💭 **Agent progress** Die Wiki-Dokumentation wird aktualisiert. Die lokale Datei docs/wiki/Agent-Watch.md wird aktualisiert. Danach folgen Tests und Commit.
Author
Owner

💭 Agent progress

Alle Tests bestanden. Die all-repos-Funktion und die Dokumentation werden nun committet und gepusht.

Die Wiki-Dokumentation wird über den forge-Befehl aktualisiert.

💭 **Agent progress** Alle Tests bestanden. Die all-repos-Funktion und die Dokumentation werden nun committet und gepusht. Die Wiki-Dokumentation wird über den forge-Befehl aktualisiert.
Author
Owner

💭 Agent progress

Ich versuche, die Wiki mit forge wiki update zu veröffentlichen.

Ich muss forge zunächst bauen oder ein vorhandenes Binary nutzen.

💭 **Agent progress** Ich versuche, die Wiki mit forge wiki update zu veröffentlichen. Ich muss forge zunächst bauen oder ein vorhandenes Binary nutzen.
feat(agent): add --all-repos to watch all accessible repositories
All checks were successful
CI / test (pull_request) Successful in 34s
CI / race (pull_request) Successful in 34s
636f626f65
Merge Forgejo API repo list with explicit repos: overrides; support
all_repos in agent.yaml and config TUI; reload on live config apply.

Co-authored-by: Cursor <cursoragent@cursor.com>
Author
Owner

💭 Agent progress

Die Wiki-Seiten-Aktualisierung soll veröffentlicht werden.

Ich prüfe, ob Forge in dieser Umgebung mit Zugangsdaten konfiguriert ist.

💭 **Agent progress** Die Wiki-Seiten-Aktualisierung soll veröffentlicht werden. Ich prüfe, ob Forge in dieser Umgebung mit Zugangsdaten konfiguriert ist.
Author
Owner

💭 Agent progress

Die Wiki-Seite könnte einen anderen Namen haben.

Ich prüfe die Wiki-Seiten oder die Datei docs/wiki/Wiki.ki.md auf den korrekten Namen.

💭 **Agent progress** Die Wiki-Seite könnte einen anderen Namen haben. Ich prüfe die Wiki-Seiten oder die Datei docs/wiki/Wiki.ki.md auf den korrekten Namen.
Author
Owner

💭 Agent progress

Die Wiki-Seite heißt "Agent-Watcher", nicht "Agent-Watch".

💭 **Agent progress** Die Wiki-Seite heißt "Agent-Watcher", nicht "Agent-Watch".
Author
Owner

💭 Agent progress

Ein Wiki-Update schlug mit einem 404-Fehler fehl.

Vielleicht braucht das Wiki-Update einen Sub-URL. Ich prüfe den Ablauf oder teste einen alternativen Titel.

💭 **Agent progress** Ein Wiki-Update schlug mit einem 404-Fehler fehl. Vielleicht braucht das Wiki-Update einen Sub-URL. Ich prüfe den Ablauf oder teste einen alternativen Titel.
Author
Owner

💭 Agent progress

Das Wiki-Lesen schlägt ebenfalls fehl. Der Repository-Kontext ist wahrscheinlich falsch.

Als Nächstes wird ein expliziter Repository-Flag versucht.

💭 **Agent progress** Das Wiki-Lesen schlägt ebenfalls fehl. Der Repository-Kontext ist wahrscheinlich falsch. Als Nächstes wird ein expliziter Repository-Flag versucht.
Author
Owner

💭 Agent progress

Die Wiki-Liste funktioniert, aber das Lesen schlägt fehl.

Vielleicht wird ein sub_url benötigt. Ich teste den Agent-Watcher.

💭 **Agent progress** Die Wiki-Liste funktioniert, aber das Lesen schlägt fehl. Vielleicht wird ein sub_url benötigt. Ich teste den Agent-Watcher.
Author
Owner

💭 Agent progress

Der Sub-URL-Pfad für den Agent-Watcher wird festgelegt.

💭 **Agent progress** Der Sub-URL-Pfad für den Agent-Watcher wird festgelegt.
Author
Owner

💭 Agent progress

Die Wiki-Dokumentation wurde veröffentlicht. Ich verifiziere nun, dass der Hilfstext den Parameter --all-repos enthält. Anschließend erstelle ich die abschließende Zusammenfassung mit den TODO_DONE-Zeilen und den PR-Titel sowie den PR-Body.

💭 **Agent progress** Die Wiki-Dokumentation wurde veröffentlicht. Ich verifiziere nun, dass der Hilfstext den Parameter --all-repos enthält. Anschließend erstelle ich die abschließende Zusammenfassung mit den TODO_DONE-Zeilen und den PR-Titel sowie den PR-Body.
frank changed title from WIP: #48 Agent Config: Paste bei Repo-Add kaputt; Flag --all-repos für alle zugänglichen Repos to fix(agent): paste in repo-add dialog; add --all-repos watch flag 2026-07-13 01:37:26 +02:00
Author
Owner

forge agent finished implementation

  • Commit: feat(agent): add --all-repos to watch all accessible repositories
  • Pull request: #49
  • Next: waiting for CI / babysitting fixes if needed
docs/wiki/Agent-Watch.md       | 10 +++--
 internal/agent/agentfile.go    |  8 +++-
 internal/agent/config.go       |  3 ++
 internal/agent/config_tui.go   |  9 +++++
 internal/agent/repos.go        | 74 +++++++++++++++++++++++++++++++++++
 internal/agent/repos_test.go   | 88 ++++++++++++++++++++++++++++++++++++++++++
 internal/agent/watch_config.go |  6 +++
 internal/cmd/agent.go          | 45 ++++++++++++++++++++-
 8 files changed, 236 insertions(+), 7 deletions(-)
Agent output (tail)
TODO_DONE: `--all-repos` listet und überwacht alle für den Login zugänglichen Repos
TODO_DONE: Verhalten ohne `--all-repos` unverändert (nur konfigurierte `repos:`)
TODO_DONE: Help + Wiki (`Agent-Watch`) dokumentieren Flag und Paste-Fix
TODO_DONE: Tests für Paste-Input (soweit sinnvoll) und Auflösung der Repo-Liste
### Änderungen
**Paste-Fix:** Die TUI hat bisher nur Einzelzeichen (`len(msg.Runes) == 1`) akzeptiert — Terminal-Paste liefert aber mehrere Runes auf einmal. Neue Hilfsfunktionen `insertRunes` / `appendRunes` in `internal/agent/textinput.go` für Config-TUI und Repo-Add-Dialog (`a`).
**`--all-repos`:** Neues Flag für `forge agent watch`, YAML-Feld `all_repos: true` und Toggle in der Config-TUI (Advanced). `ExpandAllRepos` lädt Repos über `/user/repos` und merged sie mit expliziten `repos:`-Einträgen (Overrides für Pfad/Limits bleiben erhalten). Live-Reload im Watch-Dashboard unterstützt das ebenfalls.
**Dokumentation:** `docs/wiki/Agent-Watch.md` aktualisiert und auf Forgejo als [Agent-Watcher](https://repository.hildebrandt.io/frank/forgecli/wiki/Agent-Watcher.-) veröffentlicht.
PR_TITLE: fix(agent): paste in repo-add dialog; add --all-repos watch flag
PR_BODY:
## Summary
- Fix terminal paste (Ctrl/Cmd+V, bracketed paste) in the agent config TUI and watch-dashboard repo-add dialog (`a`).
- Add `--all-repos` / `all_repos: true` to watch every repository accessible to the authenticated Forgejo user; explicit `repos:` entries are merged and override path/limits per owner/name.
- Document both changes in CLI help and the Agent-Watcher wiki page.
## Test plan
- [x] `go test ./...`
- [x] Paste unit tests (`TestInsertRunesPaste`, `TestAppendRunesPaste`)
- [x] Repo list resolution tests (`TestExpandAllRepos*`)
- [ ] Manual: `forge agent watch --tui`, press `a`, paste HTTPS URL, confirm
- [ ] Manual: `forge agent watch --all-repos --label … --agent … --pr` lists all accessible repos
✅ **forge agent finished implementation** - Commit: `feat(agent): add --all-repos to watch all accessible repositories` - Pull request: https://repository.hildebrandt.io/frank/forgecli/pulls/49 - Next: waiting for CI / babysitting fixes if needed ``` docs/wiki/Agent-Watch.md | 10 +++-- internal/agent/agentfile.go | 8 +++- internal/agent/config.go | 3 ++ internal/agent/config_tui.go | 9 +++++ internal/agent/repos.go | 74 +++++++++++++++++++++++++++++++++++ internal/agent/repos_test.go | 88 ++++++++++++++++++++++++++++++++++++++++++ internal/agent/watch_config.go | 6 +++ internal/cmd/agent.go | 45 ++++++++++++++++++++- 8 files changed, 236 insertions(+), 7 deletions(-) ``` <details><summary>Agent output (tail)</summary> ``` TODO_DONE: `--all-repos` listet und überwacht alle für den Login zugänglichen Repos TODO_DONE: Verhalten ohne `--all-repos` unverändert (nur konfigurierte `repos:`) TODO_DONE: Help + Wiki (`Agent-Watch`) dokumentieren Flag und Paste-Fix TODO_DONE: Tests für Paste-Input (soweit sinnvoll) und Auflösung der Repo-Liste ### Änderungen **Paste-Fix:** Die TUI hat bisher nur Einzelzeichen (`len(msg.Runes) == 1`) akzeptiert — Terminal-Paste liefert aber mehrere Runes auf einmal. Neue Hilfsfunktionen `insertRunes` / `appendRunes` in `internal/agent/textinput.go` für Config-TUI und Repo-Add-Dialog (`a`). **`--all-repos`:** Neues Flag für `forge agent watch`, YAML-Feld `all_repos: true` und Toggle in der Config-TUI (Advanced). `ExpandAllRepos` lädt Repos über `/user/repos` und merged sie mit expliziten `repos:`-Einträgen (Overrides für Pfad/Limits bleiben erhalten). Live-Reload im Watch-Dashboard unterstützt das ebenfalls. **Dokumentation:** `docs/wiki/Agent-Watch.md` aktualisiert und auf Forgejo als [Agent-Watcher](https://repository.hildebrandt.io/frank/forgecli/wiki/Agent-Watcher.-) veröffentlicht. PR_TITLE: fix(agent): paste in repo-add dialog; add --all-repos watch flag PR_BODY: ## Summary - Fix terminal paste (Ctrl/Cmd+V, bracketed paste) in the agent config TUI and watch-dashboard repo-add dialog (`a`). - Add `--all-repos` / `all_repos: true` to watch every repository accessible to the authenticated Forgejo user; explicit `repos:` entries are merged and override path/limits per owner/name. - Document both changes in CLI help and the Agent-Watcher wiki page. ## Test plan - [x] `go test ./...` - [x] Paste unit tests (`TestInsertRunesPaste`, `TestAppendRunesPaste`) - [x] Repo list resolution tests (`TestExpandAllRepos*`) - [ ] Manual: `forge agent watch --tui`, press `a`, paste HTTPS URL, confirm - [ ] Manual: `forge agent watch --all-repos --label … --agent … --pr` lists all accessible repos ``` </details>
Author
Owner

☑️ ToDos checked off

  • Im Repo-Add-Dialog lässt sich eine HTTPS-URL per Paste einfügen und bestätigen
  • --all-repos listet und überwacht alle für den Login zugänglichen Repos
  • Verhalten ohne --all-repos unverändert (nur konfigurierte repos:)
  • Help + Wiki (Agent-Watch) dokumentieren Flag und Paste-Fix
  • Tests für Paste-Input (soweit sinnvoll) und Auflösung der Repo-Liste
☑️ **ToDos checked off** - [x] Im Repo-Add-Dialog lässt sich eine HTTPS-URL per Paste einfügen und bestätigen - [x] `--all-repos` listet und überwacht alle für den Login zugänglichen Repos - [x] Verhalten ohne `--all-repos` unverändert (nur konfigurierte `repos:`) - [x] Help + Wiki (`Agent-Watch`) dokumentieren Flag und Paste-Fix - [x] Tests für Paste-Input (soweit sinnvoll) und Auflösung der Repo-Liste
Author
Owner
🟢 **CI green** (attempt 1/3) https://repository.hildebrandt.io/frank/forgecli/actions/runs/111
Author
Owner

💭 Agent progress

Alle Kriterien sind erfüllt. Ich erstelle nun die finale Antwort mit Titel, Beschreibung und Zusammenfassung.
Issue #48 ist umgesetzt, in zwei Commits gepusht und die Wiki-Seite veröffentlicht.

Änderungen

Paste-Fix: Die TUI hat bisher nur Einzelzeichen (len(msg.Runes) == 1) akzeptiert — Terminal-Paste liefert aber mehrere Runes auf einmal. Neue Hilfsfunktionen insertRunes / appendRunes in internal/agent/textinput.go für Config-TUI und Repo-Add-Dialog (a).
--all-repos: Neues Flag für forge agent watch, YAML-Feld all_repos: true und Toggle in der Config-TUI (Advanced). ExpandAllRepos lädt Repos über /user/repos und merged sie mit expliziten repos:-Einträgen (Overrides für Pfad/Limits bleiben erhalten). Live-Reload im Watch-Dashboard unterstützt das ebenfalls.
Dokumentation: docs/wiki/Agent-Watch.md aktualisiert und auf Forgejo als Agent-Watcher veröffentlicht.

Summary

  • Fix terminal paste (Ctrl/Cmd+V, bracketed paste) in the agent config TUI and watch-dashboard repo-add dialog (a).
  • Add --all-repos / all_repos: true to watch every repository accessible to the authenticated Forgejo user; explicit repos: entries are merged and override path/limits per owner/name.
  • Document both changes in CLI help and the Agent-Watcher wiki page.

Test plan

  • go test ./...
  • Paste unit tests (TestInsertRunesPaste, TestAppendRunesPaste)
  • Repo list resolution tests (TestExpandAllRepos*)
  • Manual: forge agent watch --tui, press a, paste HTTPS URL, confirm
  • Manual: forge agent watch --all-repos --label … --agent … --pr lists all accessible repos
💭 **Agent progress** Alle Kriterien sind erfüllt. Ich erstelle nun die finale Antwort mit Titel, Beschreibung und Zusammenfassung. Issue #48 ist umgesetzt, in zwei Commits gepusht und die Wiki-Seite veröffentlicht. ### Änderungen **Paste-Fix:** Die TUI hat bisher nur Einzelzeichen (`len(msg.Runes) == 1`) akzeptiert — Terminal-Paste liefert aber mehrere Runes auf einmal. Neue Hilfsfunktionen `insertRunes` / `appendRunes` in `internal/agent/textinput.go` für Config-TUI und Repo-Add-Dialog (`a`). **`--all-repos`:** Neues Flag für `forge agent watch`, YAML-Feld `all_repos: true` und Toggle in der Config-TUI (Advanced). `ExpandAllRepos` lädt Repos über `/user/repos` und merged sie mit expliziten `repos:`-Einträgen (Overrides für Pfad/Limits bleiben erhalten). Live-Reload im Watch-Dashboard unterstützt das ebenfalls. **Dokumentation:** `docs/wiki/Agent-Watch.md` aktualisiert und auf Forgejo als [Agent-Watcher](https://repository.hildebrandt.io/frank/forgecli/wiki/Agent-Watcher.-) veröffentlicht. ## Summary - Fix terminal paste (Ctrl/Cmd+V, bracketed paste) in the agent config TUI and watch-dashboard repo-add dialog (`a`). - Add `--all-repos` / `all_repos: true` to watch every repository accessible to the authenticated Forgejo user; explicit `repos:` entries are merged and override path/limits per owner/name. - Document both changes in CLI help and the Agent-Watcher wiki page. ## Test plan - [x] `go test ./...` - [x] Paste unit tests (`TestInsertRunesPaste`, `TestAppendRunesPaste`) - [x] Repo list resolution tests (`TestExpandAllRepos*`) - [ ] Manual: `forge agent watch --tui`, press `a`, paste HTTPS URL, confirm - [ ] Manual: `forge agent watch --all-repos --label … --agent … --pr` lists all accessible repos
frank merged commit b5b7393ebf into main 2026-07-13 01:40:25 +02:00
frank deleted branch agent/issue-48-agent-config-paste-bei-repo-add-kaputt-f 2026-07-13 01:40:25 +02:00
Sign in to join this conversation.
No reviewers
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!49
No description provided.