feat(agent): Worktree-Lifecycle und Merge-Konflikt-Queue im PR-Modus #13

Merged
frank merged 1 commit from agent/issue-10-feat-agent-worktrees-bei-gemergtem-gesch into main 2026-07-12 11:34:41 +02:00
Owner

Summary

  • Im --pr-Modus bleiben Worktrees unter .forge-worktrees/issue-<n> erhalten, solange der zugehörige PR offen ist; nach Merge/Close oder bei verwaisten Einträgen ohne offenen PR räumt forge agent watch sie idempotent auf (inkl. lokalem Branch und State-Metadaten).
  • Merge-Konflikte werden über die Forgejo-PR-API erkannt und als Fix-Jobs in die Watch-Queue gestellt; während des Babysittings werden Konflikte ebenfalls vor dem CI-Wait behoben.
  • State speichert PR-Nummer, Branch und Worktree-Pfad; laufende Pipelines werden bei Cleanup und Conflict-Scan übersprungen.

Test plan

  • go test ./internal/agent/...
  • go test ./...
  • Manuell: PR mergen/schließen → Worktree verschwindet beim nächsten Poll
  • Manuell: Base-Branch ändern → Konflikt-Fix wird gequeued und kommentiert

Kurzfassung der Änderungen

Pipeline (pipeline.go): Im PR-Modus kein defer cleanup() mehr; bestehende Worktrees werden wiederverwendet. Metadaten (PR-Nummer, Branch, Pfad) landen im State. babysitPR prüft Merge-Konflikte vor CI; RunConflictFix / fixMergeConflict führen Agent-Läufe mit Push und PR-Kommentaren aus.

Watcher (watcher.go, worktree.go): Jeder Poll-Zyklus führt Worktree-Maintenance und Conflict-Scan aus. Konflikt-Fixes laufen parallel zur Issue-Queue (mit TryClaimConflict). Issues mit offenem Agent-PR werden nicht erneut als neue Implementierung dispatched.

Forge/Git (forge.go, gitflow.go): PR-API (GetPR, FindOpenPRByHead, PRHasMergeConflict) und Worktree-Helfer (ListForgeWorktreeIssues, ReuseWorktree, CleanupWorktree).

Docs: README um den Worktree-Lebenszyklus und Merge-Konflikt-Handling ergänzt.

Closes #10

## Summary - Im `--pr`-Modus bleiben Worktrees unter `.forge-worktrees/issue-<n>` erhalten, solange der zugehörige PR offen ist; nach Merge/Close oder bei verwaisten Einträgen ohne offenen PR räumt `forge agent watch` sie idempotent auf (inkl. lokalem Branch und State-Metadaten). - Merge-Konflikte werden über die Forgejo-PR-API erkannt und als Fix-Jobs in die Watch-Queue gestellt; während des Babysittings werden Konflikte ebenfalls vor dem CI-Wait behoben. - State speichert PR-Nummer, Branch und Worktree-Pfad; laufende Pipelines werden bei Cleanup und Conflict-Scan übersprungen. ## Test plan - [x] `go test ./internal/agent/...` - [x] `go test ./...` - [ ] Manuell: PR mergen/schließen → Worktree verschwindet beim nächsten Poll - [ ] Manuell: Base-Branch ändern → Konflikt-Fix wird gequeued und kommentiert ## Kurzfassung der Änderungen **Pipeline (`pipeline.go`)**: Im PR-Modus kein `defer cleanup()` mehr; bestehende Worktrees werden wiederverwendet. Metadaten (PR-Nummer, Branch, Pfad) landen im State. `babysitPR` prüft Merge-Konflikte vor CI; `RunConflictFix` / `fixMergeConflict` führen Agent-Läufe mit Push und PR-Kommentaren aus. **Watcher (`watcher.go`, `worktree.go`)**: Jeder Poll-Zyklus führt Worktree-Maintenance und Conflict-Scan aus. Konflikt-Fixes laufen parallel zur Issue-Queue (mit `TryClaimConflict`). Issues mit offenem Agent-PR werden nicht erneut als neue Implementierung dispatched. **Forge/Git (`forge.go`, `gitflow.go`)**: PR-API (`GetPR`, `FindOpenPRByHead`, `PRHasMergeConflict`) und Worktree-Helfer (`ListForgeWorktreeIssues`, `ReuseWorktree`, `CleanupWorktree`). **Docs**: README um den Worktree-Lebenszyklus und Merge-Konflikt-Handling ergänzt. Closes #10
feat(agent): persist PR worktrees and queue merge-conflict fixes
All checks were successful
CI / test (pull_request) Successful in 9m33s
CI / race (pull_request) Successful in 9m34s
7dd5cba10a
Keep --pr worktrees until the pull request closes, clean up orphans on
watch polls, and re-run the coding agent when Forgejo reports conflicts.

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

🔗 Linked to issue #10. Babysitting CI until green…

🔗 Linked to issue #10. Babysitting CI until green…
Author
Owner

forge agent finished implementation

  • Commit: feat(agent): persist PR worktrees and queue merge-conflict fixes
  • Pull request: #13
  • Next: waiting for CI / babysitting fixes if needed
README.md                       |   2 +
 internal/agent/forge.go         |  77 +++++++++++++++
 internal/agent/gitflow.go       |  75 ++++++++++++++
 internal/agent/pipeline.go      | 120 +++++++++++++++++++++-
 internal/agent/prompt.go        |  26 +++++
 internal/agent/state.go         |  67 +++++++++++++
 internal/agent/status.go        |  11 +++
 internal/agent/watcher.go       | 130 +++++++++++++++++++++---
 internal/agent/worktree.go      | 213 ++++++++++++++++++++++++++++++++++++++++
 internal/agent/worktree_test.go |  67 +++++++++++++
 10 files changed, 772 insertions(+), 16 deletions(-)
Agent output (tail)
TODO_DONE: Verwaiste Worktrees ohne offenen PR werden beim nächsten Watch-Zyklus aufgeräumt.
TODO_DONE: Offene Agent-PRs mit Merge-Konflikt werden erkannt und als Fix-Lauf gequeued (Kommentar + Agent-Run + Push).
TODO_DONE: Cleanup und Conflict-Handling sind idempotent und stören laufende Agent-Läufe nicht.
TODO_DONE: Wiki/Docs zu `forge agent watch` / `--pr` um den neuen Lebenszyklus ergänzen.
PR_TITLE: feat(agent): Worktree-Lifecycle und Merge-Konflikt-Queue im PR-Modus
PR_BODY:
## Summary
- Im `--pr`-Modus bleiben Worktrees unter `.forge-worktrees/issue-<n>` erhalten, solange der zugehörige PR offen ist; nach Merge/Close oder bei verwaisten Einträgen ohne offenen PR räumt `forge agent watch` sie idempotent auf (inkl. lokalem Branch und State-Metadaten).
- Merge-Konflikte werden über die Forgejo-PR-API erkannt und als Fix-Jobs in die Watch-Queue gestellt; während des Babysittings werden Konflikte ebenfalls vor dem CI-Wait behoben.
- State speichert PR-Nummer, Branch und Worktree-Pfad; laufende Pipelines werden bei Cleanup und Conflict-Scan übersprungen.
## Test plan
- [x] `go test ./internal/agent/...`
- [x] `go test ./...`
- [ ] Manuell: PR mergen/schließen → Worktree verschwindet beim nächsten Poll
- [ ] Manuell: Base-Branch ändern → Konflikt-Fix wird gequeued und kommentiert
## Kurzfassung der Änderungen
**Pipeline (`pipeline.go`)**: Im PR-Modus kein `defer cleanup()` mehr; bestehende Worktrees werden wiederverwendet. Metadaten (PR-Nummer, Branch, Pfad) landen im State. `babysitPR` prüft Merge-Konflikte vor CI; `RunConflictFix` / `fixMergeConflict` führen Agent-Läufe mit Push und PR-Kommentaren aus.
**Watcher (`watcher.go`, `worktree.go`)**: Jeder Poll-Zyklus führt Worktree-Maintenance und Conflict-Scan aus. Konflikt-Fixes laufen parallel zur Issue-Queue (mit `TryClaimConflict`). Issues mit offenem Agent-PR werden nicht erneut als neue Implementierung dispatched.
**Forge/Git (`forge.go`, `gitflow.go`)**: PR-API (`GetPR`, `FindOpenPRByHead`, `PRHasMergeConflict`) und Worktree-Helfer (`ListForgeWorktreeIssues`, `ReuseWorktree`, `CleanupWorktree`).
**Docs**: README um den Worktree-Lebenszyklus und Merge-Konflikt-Handling ergänzt.
✅ **forge agent finished implementation** - Commit: `feat(agent): persist PR worktrees and queue merge-conflict fixes` - Pull request: https://repository.hildebrandt.io/frank/forgecli/pulls/13 - Next: waiting for CI / babysitting fixes if needed ``` README.md | 2 + internal/agent/forge.go | 77 +++++++++++++++ internal/agent/gitflow.go | 75 ++++++++++++++ internal/agent/pipeline.go | 120 +++++++++++++++++++++- internal/agent/prompt.go | 26 +++++ internal/agent/state.go | 67 +++++++++++++ internal/agent/status.go | 11 +++ internal/agent/watcher.go | 130 +++++++++++++++++++++--- internal/agent/worktree.go | 213 ++++++++++++++++++++++++++++++++++++++++ internal/agent/worktree_test.go | 67 +++++++++++++ 10 files changed, 772 insertions(+), 16 deletions(-) ``` <details><summary>Agent output (tail)</summary> ``` TODO_DONE: Verwaiste Worktrees ohne offenen PR werden beim nächsten Watch-Zyklus aufgeräumt. TODO_DONE: Offene Agent-PRs mit Merge-Konflikt werden erkannt und als Fix-Lauf gequeued (Kommentar + Agent-Run + Push). TODO_DONE: Cleanup und Conflict-Handling sind idempotent und stören laufende Agent-Läufe nicht. TODO_DONE: Wiki/Docs zu `forge agent watch` / `--pr` um den neuen Lebenszyklus ergänzen. PR_TITLE: feat(agent): Worktree-Lifecycle und Merge-Konflikt-Queue im PR-Modus PR_BODY: ## Summary - Im `--pr`-Modus bleiben Worktrees unter `.forge-worktrees/issue-<n>` erhalten, solange der zugehörige PR offen ist; nach Merge/Close oder bei verwaisten Einträgen ohne offenen PR räumt `forge agent watch` sie idempotent auf (inkl. lokalem Branch und State-Metadaten). - Merge-Konflikte werden über die Forgejo-PR-API erkannt und als Fix-Jobs in die Watch-Queue gestellt; während des Babysittings werden Konflikte ebenfalls vor dem CI-Wait behoben. - State speichert PR-Nummer, Branch und Worktree-Pfad; laufende Pipelines werden bei Cleanup und Conflict-Scan übersprungen. ## Test plan - [x] `go test ./internal/agent/...` - [x] `go test ./...` - [ ] Manuell: PR mergen/schließen → Worktree verschwindet beim nächsten Poll - [ ] Manuell: Base-Branch ändern → Konflikt-Fix wird gequeued und kommentiert ## Kurzfassung der Änderungen **Pipeline (`pipeline.go`)**: Im PR-Modus kein `defer cleanup()` mehr; bestehende Worktrees werden wiederverwendet. Metadaten (PR-Nummer, Branch, Pfad) landen im State. `babysitPR` prüft Merge-Konflikte vor CI; `RunConflictFix` / `fixMergeConflict` führen Agent-Läufe mit Push und PR-Kommentaren aus. **Watcher (`watcher.go`, `worktree.go`)**: Jeder Poll-Zyklus führt Worktree-Maintenance und Conflict-Scan aus. Konflikt-Fixes laufen parallel zur Issue-Queue (mit `TryClaimConflict`). Issues mit offenem Agent-PR werden nicht erneut als neue Implementierung dispatched. **Forge/Git (`forge.go`, `gitflow.go`)**: PR-API (`GetPR`, `FindOpenPRByHead`, `PRHasMergeConflict`) und Worktree-Helfer (`ListForgeWorktreeIssues`, `ReuseWorktree`, `CleanupWorktree`). **Docs**: README um den Worktree-Lebenszyklus und Merge-Konflikt-Handling ergänzt. ``` </details>
Author
Owner

☑️ ToDos checked off

  • Nach Merge oder Close eines Agent-PRs verschwindet der zugehörige Eintrag unter .forge-worktrees/ (und wird nicht dauerhaft zurückgelassen).
  • Verwaiste Worktrees ohne offenen PR werden beim nächsten Watch-Zyklus aufgeräumt.
  • Offene Agent-PRs mit Merge-Konflikt werden erkannt und als Fix-Lauf gequeued (Kommentar + Agent-Run + Push).
  • Cleanup und Conflict-Handling sind idempotent und stören laufende Agent-Läufe nicht.
  • Wiki/Docs zu forge agent watch / --pr um den neuen Lebenszyklus ergänzen.
☑️ **ToDos checked off** - [x] Nach Merge oder Close eines Agent-PRs verschwindet der zugehörige Eintrag unter `.forge-worktrees/` (und wird nicht dauerhaft zurückgelassen). - [x] Verwaiste Worktrees ohne offenen PR werden beim nächsten Watch-Zyklus aufgeräumt. - [x] Offene Agent-PRs mit Merge-Konflikt werden erkannt und als Fix-Lauf gequeued (Kommentar + Agent-Run + Push). - [x] Cleanup und Conflict-Handling sind idempotent und stören laufende Agent-Läufe nicht. - [x] Wiki/Docs zu `forge agent watch` / `--pr` um den neuen Lebenszyklus ergänzen.
frank merged commit 01159c9b96 into main 2026-07-12 11:34:41 +02:00
frank deleted branch agent/issue-10-feat-agent-worktrees-bei-gemergtem-gesch 2026-07-12 11:35:04 +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!13
No description provided.