Agent Bare Mode: Repos per URL clonen & aktuell halten #16

Closed
opened 2026-07-12 11:28:36 +02:00 by frank · 1 comment
Owner

Problem

Heute braucht der Agent-Orchestrierer einen bereits vorhandenen lokalen Checkout (ResolveRepoRoot: CWD oder ~/.config/forge/repos/owner/repo). Worktrees hängen an diesem Non-Bare-Repo; Frische hängt davon ab, dass jemand manuell pullt bzw. später Post-Merge-Sync (#15) greift.

Für Multi-Repo-Watch ist das unpraktisch: Config und Betrieb müssten lokale Pfade pflegen, obwohl der Orchestrierer eigentlich nur die Remote-URL braucht und Worktrees selbst anlegen kann.

Verwandt: #15 (Configfile inkl. path:), #10/#13 (Worktree-Lifecycle).

Ziel

Bare Mode: In der Config stehen nur noch Repo-URLs (bzw. owner/repo + Host). Der Agent-Orchestrierer

  1. cloned fehlende Repos als bare Repo in einen Cache (z. B. ~/.config/forge/repos/owner/repo.git),
  2. fetcht vor jedem neuen Worktree (und periodisch / nach Merge) die aktuellen Refs vom Remote,
  3. legt Agent-Worktrees aus dem Bare-Repo an (git worktree add), sodass neue Runs immer auf aktuellem Base-Stand starten.

Kein manueller Working-Tree-Checkout mehr nötig; optionale Legacy-Pfade können weiter unterstützt werden.

Scope

1. Config: nur URLs / Repo-Identität

Beispiel (Keys final in der Implementierung festlegen; abstimmen mit #15):

repos:
  - url: https://repository.hildebrandt.io/frank/forgecli.git
  # oder:
  - owner: frank
    name: forgecli
    # host optional, Default aus forge auth
  • Kein Pflichtfeld path für Bare Mode.
  • CLI (--repos) bleibt kompatibel: owner/repo reicht; Clone-URL aus API/forge Host ableiten.
  • Cache-Root konfigurierbar (Default unter User-Config-Dir).

2. Bare-Clone & Fetch

  • Beim ersten Bezug eines Repos: git clone --bare <url> <cache>.
  • Auth wie bestehende Clone-Helfer (gitutil.Clone / Token / SSH).
  • Vor PrepareWorktree (und sinnvoll periodisch im Watch-Loop): git fetch --prune origin (alle relevanten Refs).
  • Default-Branch aus Forgejo-API oder remote HEAD auflösen; Worktree-Base immer vom frischen Remote-Tracking-Ref (z. B. origin/main).

3. Worktrees aus Bare-Repo

  • PrepareWorktree / Git-Flow so anpassen, dass Base ein Bare-Repo sein kann (Worktree-Dir z. B. neben dem Cache oder unter .forge-worktrees relativ zum Cache-Root — Layout dokumentieren).
  • Push aus dem Worktree muss weiterhin funktionieren (remote + Credentials).
  • Cleanup bestehender Worktrees (#10/#13) bleibt gültig; Bare-Repo selbst bleibt als Cache liegen.

4. Aktualität

  • Jeder neue Run: Fetch vor Worktree-Create.
  • Optional: nach gemergtem Agent-PR ebenfalls Fetch (ersetzt/ergänzt „lokalen Main pullen“ aus #15 für Bare Mode).
  • Fetch-Fehler: loggen / Dashboard, Run nicht auf veraltetem Stand starten wenn Fetch hart fehlschlägt (Retry beim nächsten Poll).

Nicht im Scope (zunächst)

  • Ersetzen aller Non-Bare-Workflows erzwingen — Legacy-Checkout (path / CWD) darf vorerst parallel bleiben.
  • Mirror-Remotes / Multi-Remote-Setups.
  • Vollständige Dashboard-UI (#15) — nur Hook-Punkte für Sync-Status, falls einfach.

Akzeptanzkriterien

  • Config/CLI kann Repos ohne lokalen path nur per URL bzw. owner/repo angeben.
  • Fehlendes Repo wird automatisch als bare Clone angelegt.
  • Vor neuem Worktree wird fetch ausgeführt; Base-Branch ist aktuell zum Remote.
  • Agent-Pipeline (commit/PR) läuft aus dem Bare-basierten Worktree inkl. Push.
  • Bestehende Resolve-Pfad-Logik bleibt für Legacy-Checkouts nutzbar oder ist klar abgelöst.
  • Wiki + --help dokumentieren Bare Mode, Cache-Pfad und Fetch-Verhalten; Tests für Clone/Fetch/Worktree-Pfade.

Relevante Code-Stellen

  • internal/agent/gitflow.goDefaultRepoCacheDir, ResolveRepoRoot, PrepareWorktree
  • internal/agent/pipeline.go — Repo-Auflösung vor Run
  • internal/agent/config.goRepoTarget / später Configfile (#15)
  • internal/gitutil/git.go — Clone mit Token/SSH
  • internal/cmd/agent.go — CLI-Wiring

Umsetzungsschritte (Vorschlag)

  1. Bare-Cache-Layout + Clone-on-demand
  2. Fetch-before-worktree + Default-Branch-Auflösung
  3. Worktree/Push-Flow auf Bare-Base umstellen
  4. Config/CLI ohne path; Doku + Tests
  5. Abgleich mit #15 (Configfile-Schema: URL statt path als Default)
## Problem Heute braucht der Agent-Orchestrierer einen **bereits vorhandenen lokalen Checkout** (`ResolveRepoRoot`: CWD oder `~/.config/forge/repos/owner/repo`). Worktrees hängen an diesem Non-Bare-Repo; Frische hängt davon ab, dass jemand manuell pullt bzw. später Post-Merge-Sync (#15) greift. Für Multi-Repo-Watch ist das unpraktisch: Config und Betrieb müssten lokale Pfade pflegen, obwohl der Orchestrierer eigentlich nur die **Remote-URL** braucht und Worktrees selbst anlegen kann. Verwandt: #15 (Configfile inkl. `path:`), #10/#13 (Worktree-Lifecycle). ## Ziel **Bare Mode**: In der Config stehen nur noch Repo-URLs (bzw. `owner/repo` + Host). Der Agent-Orchestrierer 1. **cloned** fehlende Repos als **bare** Repo in einen Cache (z. B. `~/.config/forge/repos/owner/repo.git`), 2. **fetcht** vor jedem neuen Worktree (und periodisch / nach Merge) die aktuellen Refs vom Remote, 3. legt Agent-Worktrees aus dem Bare-Repo an (`git worktree add`), sodass neue Runs immer auf aktuellem Base-Stand starten. Kein manueller Working-Tree-Checkout mehr nötig; optionale Legacy-Pfade können weiter unterstützt werden. ## Scope ### 1. Config: nur URLs / Repo-Identität Beispiel (Keys final in der Implementierung festlegen; abstimmen mit #15): ```yaml repos: - url: https://repository.hildebrandt.io/frank/forgecli.git # oder: - owner: frank name: forgecli # host optional, Default aus forge auth ``` - Kein Pflichtfeld `path` für Bare Mode. - CLI (`--repos`) bleibt kompatibel: `owner/repo` reicht; Clone-URL aus API/`forge` Host ableiten. - Cache-Root konfigurierbar (Default unter User-Config-Dir). ### 2. Bare-Clone & Fetch - Beim ersten Bezug eines Repos: `git clone --bare <url> <cache>`. - Auth wie bestehende Clone-Helfer (`gitutil.Clone` / Token / SSH). - Vor `PrepareWorktree` (und sinnvoll periodisch im Watch-Loop): `git fetch --prune origin` (alle relevanten Refs). - Default-Branch aus Forgejo-API oder `remote HEAD` auflösen; Worktree-Base immer vom frischen Remote-Tracking-Ref (z. B. `origin/main`). ### 3. Worktrees aus Bare-Repo - `PrepareWorktree` / Git-Flow so anpassen, dass Base ein Bare-Repo sein kann (Worktree-Dir z. B. neben dem Cache oder unter `.forge-worktrees` relativ zum Cache-Root — Layout dokumentieren). - Push aus dem Worktree muss weiterhin funktionieren (remote + Credentials). - Cleanup bestehender Worktrees (#10/#13) bleibt gültig; Bare-Repo selbst bleibt als Cache liegen. ### 4. Aktualität - Jeder neue Run: Fetch vor Worktree-Create. - Optional: nach gemergtem Agent-PR ebenfalls Fetch (ersetzt/ergänzt „lokalen Main pullen“ aus #15 für Bare Mode). - Fetch-Fehler: loggen / Dashboard, Run nicht auf veraltetem Stand starten wenn Fetch hart fehlschlägt (Retry beim nächsten Poll). ## Nicht im Scope (zunächst) - Ersetzen aller Non-Bare-Workflows erzwingen — Legacy-Checkout (`path` / CWD) darf vorerst parallel bleiben. - Mirror-Remotes / Multi-Remote-Setups. - Vollständige Dashboard-UI (#15) — nur Hook-Punkte für Sync-Status, falls einfach. ## Akzeptanzkriterien - [x] Config/CLI kann Repos **ohne lokalen `path`** nur per URL bzw. `owner/repo` angeben. - [x] Fehlendes Repo wird automatisch als **bare** Clone angelegt. - [x] Vor neuem Worktree wird **fetch** ausgeführt; Base-Branch ist aktuell zum Remote. - [x] Agent-Pipeline (commit/PR) läuft aus dem Bare-basierten Worktree inkl. Push. - [x] Bestehende Resolve-Pfad-Logik bleibt für Legacy-Checkouts nutzbar oder ist klar abgelöst. - [x] Wiki + `--help` dokumentieren Bare Mode, Cache-Pfad und Fetch-Verhalten; Tests für Clone/Fetch/Worktree-Pfade. ## Relevante Code-Stellen - `internal/agent/gitflow.go` — `DefaultRepoCacheDir`, `ResolveRepoRoot`, `PrepareWorktree` - `internal/agent/pipeline.go` — Repo-Auflösung vor Run - `internal/agent/config.go` — `RepoTarget` / später Configfile (#15) - `internal/gitutil/git.go` — Clone mit Token/SSH - `internal/cmd/agent.go` — CLI-Wiring ## Umsetzungsschritte (Vorschlag) 1. Bare-Cache-Layout + Clone-on-demand 2. Fetch-before-worktree + Default-Branch-Auflösung 3. Worktree/Push-Flow auf Bare-Base umstellen 4. Config/CLI ohne `path`; Doku + Tests 5. Abgleich mit #15 (Configfile-Schema: URL statt `path` als Default)
Author
Owner

🤖 forge agent started

  • Agent: cursor-agent
  • Model: (default)
  • Mode: pr
  • Trigger: assignee=agent
  • Open ToDos: 6

Agent Bare Mode: Repos per URL clonen & aktuell halten — Heute braucht der Agent-Orchestrierer einen bereits vorhandenen lokalen Checkout (ResolveRepoRoot: CWD oder ~/.config/forge/repos/owner/repo). Worktrees hängen an diesem Non-Bare-Repo;…

🤖 **forge agent started** - Agent: `cursor-agent` - Model: `(default)` - Mode: `pr` - Trigger: `assignee=agent` - Open ToDos: 6 Agent Bare Mode: Repos per URL clonen & aktuell halten — Heute braucht der Agent-Orchestrierer einen **bereits vorhandenen lokalen Checkout** (`ResolveRepoRoot`: CWD oder `~/.config/forge/repos/owner/repo`). Worktrees hängen an diesem Non-Bare-Repo;…
frank closed this issue 2026-07-12 14:25:25 +02:00
Sign in to join this conversation.
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#16
No description provided.