diff --git a/.claude/agents/next-issue.md b/.claude/agents/next-issue.md index 0ade770..ae08a7d 100644 --- a/.claude/agents/next-issue.md +++ b/.claude/agents/next-issue.md @@ -4,7 +4,7 @@ description: Wählt das nächste zu bearbeitende Gitea-Issue und gibt nur die Ke tools: mcp__gitea__list_issues, mcp__gitea__issue_read model: haiku --- -Finde das nächste offene Issue im Repo / mit Label `ai-ready` +Finde das nächste offene Issue im Repo pitfriedrich/chart-app mit Label `ai-ready` und NICHT mit Label `ai-wip` oder `ai-blocked`. Priorisiere nach `prio/high` > `prio/medium` > `prio/low`, dann nach ältestem. diff --git a/.claude/commands/fix-issue.md b/.claude/commands/fix-issue.md index 04428c6..774d80e 100644 --- a/.claude/commands/fix-issue.md +++ b/.claude/commands/fix-issue.md @@ -5,7 +5,8 @@ allowed-tools: > Bash, Edit, Read, Write, Grep, Glob, mcp__gitea__issue_read, mcp__gitea__issue_write, mcp__gitea__label_read, - mcp__gitea__pull_request_write + mcp__gitea__pull_request_write, mcp__gitea__pull_request_read, + mcp__gitea__actions_run_read model: opus --- Bearbeite Gitea-Issue #$1 im aktuellen Repo. Schritt für Schritt: @@ -18,22 +19,36 @@ Name → ID für die gesamte Bearbeitung. Verwende ausschließlich `add_labels` Niemals `replace_labels` oder `clear_labels` benutzen — das löscht alle übrigen Labels des Issues (z.B. `prio/*`). +0. Vorbedingungen: Wenn Issue #$1 bereits `ai-wip` oder `ai-blocked` trägt, + abbrechen (kein Doppelstart). Prüfe `git status --porcelain` — ist der + Baum nicht sauber, abbrechen statt fremde Änderungen mitzucommitten. 1. Lies Issue #$1 (Titel, Beschreibung, Kommentare) über `issue_read`. Notiere die aktuell gesetzten Labels, damit du sie nicht verlierst. 2. Hole die Label-Liste via `label_read`. Setze Label `ai-wip` (`add_labels`), entferne `ai-ready` (`remove_label`). 3. Analysiere das Repo und finde die Ursache. Wenn der Scope zu groß/unklar ist (siehe CLAUDE.md), brich ab: kommentiere das Issue mit einer kurzen - Begründung, setze `ai-blocked`, und beende ohne Codeänderung. -4. Implementiere den Fix. Halte den Diff minimal und fokussiert. -5. Führe die Tests aus (``). Bei Rot: bis zu 2x nachbessern. - Wenn danach immer noch rot → `ai-blocked`, Issue kommentieren, abbrechen. -6. Commit mit Message: `fix: (#$1)`. -7. Push den aktuellen Branch zum Remote. -8. Öffne via `pull_request_write` einen PR gegen `main` (bzw. `develop`). - Die PR-Beschreibung MUSS `Closes #$1` enthalten. -9. Kommentiere am Issue mit dem PR-Link, setze Label `ai-review` - (`add_labels`) und entferne `ai-wip` (`remove_label`). + Begründung, setze `ai-blocked`, entferne `ai-wip`, und beende ohne + Codeänderung. +4. Lege den Branch an: `git checkout main && git pull --ff-only`, dann + `git checkout -b ai/issue-$1-` (Slug aus dem Issue-Titel, + kleingeschrieben, Bindestriche statt Leerzeichen). +5. Implementiere den Fix. Halte den Diff minimal und fokussiert. +6. Führe die Tests aus (`./mvnw test`). Bei Rot: bis zu 2x nachbessern. + Wenn danach immer noch rot → `ai-blocked`, `ai-wip` entfernen, Issue + kommentieren, abbrechen. Hinweis: `e2e/*PlaywrightTest` überspringt sich + selbst per JUnit-Assumption, wenn der Browser-Download fehlschlägt — + übersprungen zählt nicht als rot und ist kein Abbruchgrund. +7. Commit mit Message: `fix: (#$1)`. +8. Push den Branch zum Remote. +9. Öffne via `pull_request_write` einen PR gegen `main`. Die + PR-Beschreibung MUSS `Closes #$1` enthalten. +10. Warte den CI-Lauf des PR-Branches ab (`actions_run_read`, PR läuft + automatisch gegen `.gitea/workflows/ci.yml`). + - Grün: kommentiere am Issue mit dem PR-Link, setze Label `ai-review` + (`add_labels`), entferne `ai-wip` (`remove_label`). + - Rot: setze `ai-blocked`, entferne `ai-wip`, kommentiere das Issue mit + einem kurzen Auszug aus dem CI-Log. Kein `ai-review`. Wenn du in einem Schritt `ai-blocked` setzt, entferne ebenfalls `ai-wip`. Existiert ein benötigtes Label nicht im Repo, kommentiere das am Issue statt diff --git a/.claude/commands/work-queue.md b/.claude/commands/work-queue.md new file mode 100644 index 0000000..4fe36ca --- /dev/null +++ b/.claude/commands/work-queue.md @@ -0,0 +1,23 @@ +--- +description: Wählt das nächste ai-ready Issue und arbeitet es via /fix-issue ab. +allowed-tools: > + Bash, Edit, Read, Write, Grep, Glob, + mcp__gitea__list_issues, mcp__gitea__issue_read, mcp__gitea__issue_write, + mcp__gitea__label_read, + mcp__gitea__pull_request_write, mcp__gitea__pull_request_read, + mcp__gitea__actions_run_read +model: opus +--- +Arbeitet genau EIN Issue aus der Autofix-Warteschlange ab. Kein Loop +innerhalb dieses Commands — für wiederholte Läufe die `/loop`-Skill nutzen +(z.B. `/loop 30m /work-queue`). + +1. Rufe den Agenten `next-issue` auf. Er liefert entweder `ISSUE=` + oder `ISSUE=NONE`. +2. `ISSUE=NONE` → melde „Queue leer, kein `ai-ready`-Issue offen" und + beende ohne weitere Aktion. +3. `ISSUE=` → führe exakt den Ablauf aus `.claude/commands/fix-issue.md` + für Issue `` aus (Schritte 0–10 dort, unverändert, inklusive + Label-Regeln, Branch-Schema, Testkommando und CI-Gate). Diese Datei + beschreibt den Ablauf nicht erneut — Quelle der Wahrheit ist + `fix-issue.md`. diff --git a/.gitignore b/.gitignore index d0a4b0b..90a2773 100644 --- a/.gitignore +++ b/.gitignore @@ -13,3 +13,4 @@ node_modules/ src/main/frontend/generated/ vite.generated.ts /src/main/bundles/prod.bundle +/src/main/bundles/dev.bundle diff --git a/CLAUDE.md b/CLAUDE.md index c98f5e7..3b288a4 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -52,4 +52,5 @@ UI copy/data (chart labels, notifications) is in German. - Bei Unklarheit / Scope > ~200 Zeilen Diff: NICHT fixen, stattdessen Issue kommentieren ("needs human") und Label `ai-blocked` setzen. - PR-Beschreibung MUSS `Closes #` enthalten. -- Keine Änderungen an ohne Freigabe. +- Keine Änderungen an kritischen Pfaden ohne Freigabe: `pom.xml`, `mvnw`/`mvnw.cmd`, + `.mvn/`, `.gitea/workflows/`, `.gitignore`. diff --git a/src/main/bundles/dev.bundle b/src/main/bundles/dev.bundle deleted file mode 100644 index db04b3b..0000000 Binary files a/src/main/bundles/dev.bundle and /dev/null differ