agent watch: WIP-PRs bei Konfliktprüfung nicht als Merge-Konflikt werten #55

Merged
frank merged 2 commits from agent/issue-54-agent-watch-wip-prs-bei-konfliktprüfung into main 2026-07-13 01:59:54 +02:00
Owner

Summary

  • PRHasMergeConflict ignoriert mergeable=false bei WIP-/Draft-PRs, solange kein expliziter Konfliktstatus (conflicts/dirty) vorliegt
  • Neue Hilfsfunktionen IsWIPPR und HasWIPPrefix für WIP-Erkennung per Titelpräfix und Draft-Flag
  • PullRequest um draft-Feld ergänzt

Test plan

  • TestPRHasMergeConflict: WIP + mergeable=false ohne Konflikt → kein Konflikt
  • TestPRHasMergeConflict: WIP + mergeable_state=conflicts/dirty → Konflikt
  • TestIsWIPPR: Titelpräfix und Draft-Flag
  • go test ./internal/agent/... grün

Fixes #54

## Summary - `PRHasMergeConflict` ignoriert `mergeable=false` bei WIP-/Draft-PRs, solange kein expliziter Konfliktstatus (`conflicts`/`dirty`) vorliegt - Neue Hilfsfunktionen `IsWIPPR` und `HasWIPPrefix` für WIP-Erkennung per Titelpräfix und Draft-Flag - `PullRequest` um `draft`-Feld ergänzt ## Test plan - [x] `TestPRHasMergeConflict`: WIP + `mergeable=false` ohne Konflikt → kein Konflikt - [x] `TestPRHasMergeConflict`: WIP + `mergeable_state=conflicts`/`dirty` → Konflikt - [x] `TestIsWIPPR`: Titelpräfix und Draft-Flag - [x] `go test ./internal/agent/...` grün Fixes #54
Author
Owner

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

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

💭 Agent progress

Ich werde Issue #54 für die Forge CLI umsetzen.

WIP-PRs mit WIP:-Titel sollen nicht als Merge-Konflikte gelten. Nur echte Merge-Konflikte sollen die Reparatur auslösen. Unit-Tests sind nötig. Ich untersuche den Code.
Ich schaue mir zuerst die betroffenen Stellen und die bestehende WIP-/Konfliktlogik an.

💭 **Agent progress** Ich werde Issue #54 für die Forge CLI umsetzen. WIP-PRs mit `WIP:`-Titel sollen nicht als Merge-Konflikte gelten. Nur echte Merge-Konflikte sollen die Reparatur auslösen. Unit-Tests sind nötig. Ich untersuche den Code. Ich schaue mir zuerst die betroffenen Stellen und die bestehende WIP-/Konfliktlogik an.
Author
Owner

💭 Agent progress

Ich lese die bestehenden Tests und die Datei pipeline.go, um den vollständigen Kontext zu verstehen.

Ich prüfe, ob PullRequest bereits ein Draft-Feld besitzt oder hinzugefügt werden muss.

💭 **Agent progress** Ich lese die bestehenden Tests und die Datei pipeline.go, um den vollständigen Kontext zu verstehen. Ich prüfe, ob PullRequest bereits ein Draft-Feld besitzt oder hinzugefügt werden muss.
Author
Owner

💭 Agent progress

Ich verstehe das Problem. PRHasMergeConflict erkennt WIP-PRs fälschlich als Merge-Konflikte.

Die Funktion erkennt mergeable=false und den Status "conflicts" oder "dirty" als Merge-Konflikte. Für WIP-PRs soll nur explizite Konfliktzustände gelten. Ich prüfe die Forgejo-API auf ein Draft-Feld und die Finalisierung des Titels.

💭 **Agent progress** Ich verstehe das Problem. `PRHasMergeConflict` erkennt WIP-PRs fälschlich als Merge-Konflikte. Die Funktion erkennt `mergeable=false` und den Status "conflicts" oder "dirty" als Merge-Konflikte. Für WIP-PRs soll nur explizite Konfliktzustände gelten. Ich prüfe die Forgejo-API auf ein Draft-Feld und die Finalisierung des Titels.
Author
Owner

💭 Agent progress

Die Funktion IsWIPPR muss in pr_wip implementiert werden.

IsWIPPR prüft Titel auf WIP-Präfix und Draft-Status. PRHasMergeConflict soll WIP-PRs nur als Merge-Konflikt werten, wenn mergeable_state „conflicts“ oder „dirty“ ist. Nicht-WIP-PRs bleiben unverändert.

Der Fix ändert PRHasMergeConflict: Bei mergeable=false wird für WIP-PRs direkt false zurückgegeben. Echte Merge-Konflikte bleiben erhalten.

Ein Draft-Feld kommt ins PullRequest-Struct. IsWIPPR erkennt WIP-PRs über den Titel oder diesen Flag. Eine Hilfsfunktion HasWIPPrefix prüft den Präfix.

IsWIPPR prüft zuerst den Draft-Flag. Dann folgt die Prüfung auf den WIP:-Titelpräfix.

Vier Szenarien müssen getestet werden:

  • WIP-PR mit mergeable=false und keinem Konfliktzustand → kein Merge-Konflikt

  • WIP-PR mit mergeable_state=conflicts → Merge-Konflikt

  • Nicht-WIP-PR mit mergeable=false → weiterhin Merge-Konflikt

  • WIP-PR mit mergeable_state=dirty → Merge-Konflikt

TestPRHasMergeConflict muss an das neue Verhalten angepasst werden.

Auch pipeline.go wird durch den Fix betroffen. Während des Babysittens bleibt ein WIP-PR offenbar aktiv. Ein echter Merge-Konflikt während dieser Phase sollte weiterhin behoben werden. mergeable=false ohne Konfliktzustand führt nun nicht mehr zur automatischen Behebung. Die Implementierung und Tests folgen.
Ich implementiere IsWIPPR und passe PRHasMergeConflict an, damit WIP-PRs mit mergeable=false ohne echten Konfliktstatus nicht mehr fälschlich als Konflikt gelten.

💭 **Agent progress** Die Funktion `IsWIPPR` muss in `pr_wip` implementiert werden. `IsWIPPR` prüft Titel auf WIP-Präfix und Draft-Status. `PRHasMergeConflict` soll WIP-PRs nur als Merge-Konflikt werten, wenn `mergeable_state` „conflicts“ oder „dirty“ ist. Nicht-WIP-PRs bleiben unverändert. Der Fix ändert `PRHasMergeConflict`: Bei `mergeable=false` wird für WIP-PRs direkt `false` zurückgegeben. Echte Merge-Konflikte bleiben erhalten. Ein `Draft`-Feld kommt ins `PullRequest`-Struct. `IsWIPPR` erkennt WIP-PRs über den Titel oder diesen Flag. Eine Hilfsfunktion `HasWIPPrefix` prüft den Präfix. `IsWIPPR` prüft zuerst den `Draft`-Flag. Dann folgt die Prüfung auf den `WIP:`-Titelpräfix. Vier Szenarien müssen getestet werden: - WIP-PR mit `mergeable=false` und keinem Konfliktzustand → kein Merge-Konflikt - WIP-PR mit `mergeable_state=conflicts` → Merge-Konflikt - Nicht-WIP-PR mit `mergeable=false` → weiterhin Merge-Konflikt - WIP-PR mit `mergeable_state=dirty` → Merge-Konflikt `TestPRHasMergeConflict` muss an das neue Verhalten angepasst werden. Auch `pipeline.go` wird durch den Fix betroffen. Während des Babysittens bleibt ein WIP-PR offenbar aktiv. Ein echter Merge-Konflikt während dieser Phase sollte weiterhin behoben werden. `mergeable=false` ohne Konfliktzustand führt nun nicht mehr zur automatischen Behebung. Die Implementierung und Tests folgen. Ich implementiere `IsWIPPR` und passe `PRHasMergeConflict` an, damit WIP-PRs mit `mergeable=false` ohne echten Konfliktstatus nicht mehr fälschlich als Konflikt gelten.
Author
Owner

💭 Agent progress

Die Tests in worktree_test.go werden aktualisiert und neue Tests für pr_wip_test.go ergänzt.

💭 **Agent progress** Die Tests in worktree_test.go werden aktualisiert und neue Tests für pr_wip_test.go ergänzt.
Author
Owner

💭 Agent progress

Die Tests werden ausgeführt, um sicherzustellen, dass alles korrekt funktioniert.

💭 **Agent progress** Die Tests werden ausgeführt, um sicherzustellen, dass alles korrekt funktioniert.
Author
Owner

💭 Agent progress

Tests passed. Running the full agent package tests now. Then committing and pushing.

💭 **Agent progress** Tests passed. Running the full agent package tests now. Then committing and pushing.
Author
Owner

💭 Agent progress

Alle Tests bestehen. Die Änderung ist intern und verändert das sichtbare Verhalten nicht.

Die Änderung wird in zwei commits übermittelt: zuerst die Kernlogik, dann die Tests.
Alle Tests sind grün. Ich committe und pushe die Änderungen in zwei logischen Schritten.

💭 **Agent progress** Alle Tests bestehen. Die Änderung ist intern und verändert das sichtbare Verhalten nicht. Die Änderung wird in zwei commits übermittelt: zuerst die Kernlogik, dann die Tests. Alle Tests sind grün. Ich committe und pushe die Änderungen in zwei logischen Schritten.
Author
Owner

💭 Agent progress

Die Implementierung wird in zwei Commits erfolgen. Der erste betrifft die Kernlogik in forge.go und pr_wip.go.

Der zweite Commit umfasst Tests. Beide Commits werden anschließend gepusht.

💭 **Agent progress** Die Implementierung wird in zwei Commits erfolgen. Der erste betrifft die Kernlogik in forge.go und pr_wip.go. Der zweite Commit umfasst Tests. Beide Commits werden anschließend gepusht.
fix(agent): ignore mergeable=false on WIP/draft PRs without conflict state
Some checks failed
CI / race (pull_request) Has been cancelled
CI / test (pull_request) Has been cancelled
4b8f88ee79
WIP pull requests often report mergeable=false from Forgejo even when no
git conflicts exist. Only treat explicit conflicts/dirty states for WIP PRs.

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

💭 Agent progress

Der erste Commit wurde gepusht. Nun werden die Tests committet.

💭 **Agent progress** Der erste Commit wurde gepusht. Nun werden die Tests committet.
test(agent): cover WIP vs merge conflict detection
All checks were successful
CI / race (pull_request) Successful in 35s
CI / test (pull_request) Successful in 35s
277b20113d
Assert WIP/draft PRs with mergeable=false alone do not queue conflict fixes,
while conflicts/dirty states still do.

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

💭 Agent progress

Die Implementierung ist abgeschlossen. Ich prüfe den Git-Status und erstelle das finale Zusammenfassung mit den geforderten Markern.

💭 **Agent progress** Die Implementierung ist abgeschlossen. Ich prüfe den Git-Status und erstelle das finale Zusammenfassung mit den geforderten Markern.
frank changed title from WIP: #54 agent watch: WIP-PRs bei Konfliktprüfung nicht als Merge-Konflikt werten to agent watch: WIP-PRs bei Konfliktprüfung nicht als Merge-Konflikt werten 2026-07-13 01:56:11 +02:00
Author
Owner

forge agent finished implementation

  • Commit: test(agent): cover WIP vs merge conflict detection
  • Pull request: #55
  • Next: waiting for CI / babysitting fixes if needed
internal/agent/pr_wip_test.go   | 12 ++++++++++++
 internal/agent/worktree_test.go | 18 ++++++++++++++++++
 2 files changed, 30 insertions(+)
Agent output (tail)
**`PRHasMergeConflict`** (`internal/agent/forge.go`): Wenn ein PR als WIP gilt (`WIP:`-Titel oder `draft: true`) und nur `mergeable=false` meldet, wird das nicht mehr als Konflikt gezählt. Explizite Zustände `conflicts`/`dirty` lösen weiterhin Reparaturen aus — auch bei WIP-PRs.
**`IsWIPPR` / `HasWIPPrefix`** (`internal/agent/pr_wip.go`): Neue Hilfsfunktionen zur WIP-Erkennung; `StripWIPPrefix` nutzt `HasWIPPrefix`.
**`PullRequest.Draft`**: Neues JSON-Feld für Forgejo-Draft-PRs.
Die bestehenden Aufrufer in `collectRepoPRFixes` und `pipeline.go` profitieren automatisch von der angepassten `PRHasMergeConflict`-Logik. Wiki und `--help` blieben unverändert — das Nutzerverhalten ist intern, nicht sichtbar anders.
TODO_DONE: WIP-PRs ohne echten Merge-Konflikt werden nicht als Konflikt-Reparatur gequeued
TODO_DONE: WIP-PRs mit nachgewiesenem Merge-Konflikt werden weiterhin repariert
TODO_DONE: Unit-Tests für die Unterscheidung WIP vs. Konflikt
TODO_DONE: Wiki/`forge agent watch --help` nur anpassen, falls Nutzerverhalten sich sichtbar ändert
PR_TITLE: agent watch: WIP-PRs bei Konfliktprüfung nicht als Merge-Konflikt werten
PR_BODY:
## Summary
- `PRHasMergeConflict` ignoriert `mergeable=false` bei WIP-/Draft-PRs, solange kein expliziter Konfliktstatus (`conflicts`/`dirty`) vorliegt
- Neue Hilfsfunktionen `IsWIPPR` und `HasWIPPrefix` für WIP-Erkennung per Titelpräfix und Draft-Flag
- `PullRequest` um `draft`-Feld ergänzt
## Test plan
- [x] `TestPRHasMergeConflict`: WIP + `mergeable=false` ohne Konflikt → kein Konflikt
- [x] `TestPRHasMergeConflict`: WIP + `mergeable_state=conflicts`/`dirty` → Konflikt
- [x] `TestIsWIPPR`: Titelpräfix und Draft-Flag
- [x] `go test ./internal/agent/...` grün
Fixes #54
✅ **forge agent finished implementation** - Commit: `test(agent): cover WIP vs merge conflict detection` - Pull request: https://repository.hildebrandt.io/frank/forgecli/pulls/55 - Next: waiting for CI / babysitting fixes if needed ``` internal/agent/pr_wip_test.go | 12 ++++++++++++ internal/agent/worktree_test.go | 18 ++++++++++++++++++ 2 files changed, 30 insertions(+) ``` <details><summary>Agent output (tail)</summary> ``` **`PRHasMergeConflict`** (`internal/agent/forge.go`): Wenn ein PR als WIP gilt (`WIP:`-Titel oder `draft: true`) und nur `mergeable=false` meldet, wird das nicht mehr als Konflikt gezählt. Explizite Zustände `conflicts`/`dirty` lösen weiterhin Reparaturen aus — auch bei WIP-PRs. **`IsWIPPR` / `HasWIPPrefix`** (`internal/agent/pr_wip.go`): Neue Hilfsfunktionen zur WIP-Erkennung; `StripWIPPrefix` nutzt `HasWIPPrefix`. **`PullRequest.Draft`**: Neues JSON-Feld für Forgejo-Draft-PRs. Die bestehenden Aufrufer in `collectRepoPRFixes` und `pipeline.go` profitieren automatisch von der angepassten `PRHasMergeConflict`-Logik. Wiki und `--help` blieben unverändert — das Nutzerverhalten ist intern, nicht sichtbar anders. TODO_DONE: WIP-PRs ohne echten Merge-Konflikt werden nicht als Konflikt-Reparatur gequeued TODO_DONE: WIP-PRs mit nachgewiesenem Merge-Konflikt werden weiterhin repariert TODO_DONE: Unit-Tests für die Unterscheidung WIP vs. Konflikt TODO_DONE: Wiki/`forge agent watch --help` nur anpassen, falls Nutzerverhalten sich sichtbar ändert PR_TITLE: agent watch: WIP-PRs bei Konfliktprüfung nicht als Merge-Konflikt werten PR_BODY: ## Summary - `PRHasMergeConflict` ignoriert `mergeable=false` bei WIP-/Draft-PRs, solange kein expliziter Konfliktstatus (`conflicts`/`dirty`) vorliegt - Neue Hilfsfunktionen `IsWIPPR` und `HasWIPPrefix` für WIP-Erkennung per Titelpräfix und Draft-Flag - `PullRequest` um `draft`-Feld ergänzt ## Test plan - [x] `TestPRHasMergeConflict`: WIP + `mergeable=false` ohne Konflikt → kein Konflikt - [x] `TestPRHasMergeConflict`: WIP + `mergeable_state=conflicts`/`dirty` → Konflikt - [x] `TestIsWIPPR`: Titelpräfix und Draft-Flag - [x] `go test ./internal/agent/...` grün Fixes #54 ``` </details>
Author
Owner

☑️ ToDos checked off

  • WIP-PRs ohne echten Merge-Konflikt werden nicht als Konflikt-Reparatur gequeued
  • WIP-PRs mit nachgewiesenem Merge-Konflikt werden weiterhin repariert
  • Unit-Tests für die Unterscheidung WIP vs. Konflikt
  • Wiki/forge agent watch --help nur anpassen, falls Nutzerverhalten sich sichtbar ändert
☑️ **ToDos checked off** - [x] WIP-PRs ohne echten Merge-Konflikt werden nicht als Konflikt-Reparatur gequeued - [x] WIP-PRs mit nachgewiesenem Merge-Konflikt werden weiterhin repariert - [x] Unit-Tests für die Unterscheidung WIP vs. Konflikt - [x] Wiki/`forge agent watch --help` nur anpassen, falls Nutzerverhalten sich sichtbar ändert
Author
Owner
🟢 **CI green** (attempt 1/3) https://repository.hildebrandt.io/frank/forgecli/actions/runs/123
Author
Owner

💭 Agent progress

Die Implementierung ist abgeschlossen. Die finale Antwort wird auf Deutsch verfasst.
Issue #54 ist umgesetzt. WIP-PRs werden bei der Konfliktprüfung nicht mehr fälschlich als Merge-Konflikt gewertet.

Änderungen

PRHasMergeConflict (internal/agent/forge.go): Wenn ein PR als WIP gilt (WIP:-Titel oder draft: true) und nur mergeable=false meldet, wird das nicht mehr als Konflikt gezählt. Explizite Zustände conflicts/dirty lösen weiterhin Reparaturen aus — auch bei WIP-PRs.
IsWIPPR / HasWIPPrefix (internal/agent/pr_wip.go): Neue Hilfsfunktionen zur WIP-Erkennung; StripWIPPrefix nutzt HasWIPPrefix.
PullRequest.Draft: Neues JSON-Feld für Forgejo-Draft-PRs.
Die bestehenden Aufrufer in collectRepoPRFixes und pipeline.go profitieren automatisch von der angepassten PRHasMergeConflict-Logik. Wiki und --help blieben unverändert — das Nutzerverhalten ist intern, nicht sichtbar anders.

Summary

  • PRHasMergeConflict ignoriert mergeable=false bei WIP-/Draft-PRs, solange kein expliziter Konfliktstatus (conflicts/dirty) vorliegt
  • Neue Hilfsfunktionen IsWIPPR und HasWIPPrefix für WIP-Erkennung per Titelpräfix und Draft-Flag
  • PullRequest um draft-Feld ergänzt

Test plan

  • TestPRHasMergeConflict: WIP + mergeable=false ohne Konflikt → kein Konflikt
  • TestPRHasMergeConflict: WIP + mergeable_state=conflicts/dirty → Konflikt
  • TestIsWIPPR: Titelpräfix und Draft-Flag
  • go test ./internal/agent/... grün
    Fixes #54
💭 **Agent progress** Die Implementierung ist abgeschlossen. Die finale Antwort wird auf Deutsch verfasst. Issue #54 ist umgesetzt. WIP-PRs werden bei der Konfliktprüfung nicht mehr fälschlich als Merge-Konflikt gewertet. ## Änderungen **`PRHasMergeConflict`** (`internal/agent/forge.go`): Wenn ein PR als WIP gilt (`WIP:`-Titel oder `draft: true`) und nur `mergeable=false` meldet, wird das nicht mehr als Konflikt gezählt. Explizite Zustände `conflicts`/`dirty` lösen weiterhin Reparaturen aus — auch bei WIP-PRs. **`IsWIPPR` / `HasWIPPrefix`** (`internal/agent/pr_wip.go`): Neue Hilfsfunktionen zur WIP-Erkennung; `StripWIPPrefix` nutzt `HasWIPPrefix`. **`PullRequest.Draft`**: Neues JSON-Feld für Forgejo-Draft-PRs. Die bestehenden Aufrufer in `collectRepoPRFixes` und `pipeline.go` profitieren automatisch von der angepassten `PRHasMergeConflict`-Logik. Wiki und `--help` blieben unverändert — das Nutzerverhalten ist intern, nicht sichtbar anders. ## Summary - `PRHasMergeConflict` ignoriert `mergeable=false` bei WIP-/Draft-PRs, solange kein expliziter Konfliktstatus (`conflicts`/`dirty`) vorliegt - Neue Hilfsfunktionen `IsWIPPR` und `HasWIPPrefix` für WIP-Erkennung per Titelpräfix und Draft-Flag - `PullRequest` um `draft`-Feld ergänzt ## Test plan - [x] `TestPRHasMergeConflict`: WIP + `mergeable=false` ohne Konflikt → kein Konflikt - [x] `TestPRHasMergeConflict`: WIP + `mergeable_state=conflicts`/`dirty` → Konflikt - [x] `TestIsWIPPR`: Titelpräfix und Draft-Flag - [x] `go test ./internal/agent/...` grün Fixes #54
frank merged commit cf93b57a76 into main 2026-07-13 01:59:54 +02:00
frank deleted branch agent/issue-54-agent-watch-wip-prs-bei-konfliktprüfung 2026-07-13 01:59:54 +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!55
No description provided.