Merge pull request 'Neues Label "help wanted" fuer QA-Spalte im Codeberg-Sync' (#50) from fds2610-bot/monitor:main into main

Reviewed-on: https://codeberg.org/fds2610/monitor/pulls/50
This commit is contained in:
fds2610 2026-08-19 17:21:22 +02:00
commit a5a5df0ecd
5 changed files with 18 additions and 16 deletions

12
API.md
View file

@ -176,10 +176,10 @@ curl -X POST "$MONITOR_API_BASE/agents/$ID/activity" \
Spalten (F3): `backlog`, `bereit`, `in_arbeit`, `qa`, `testing`, `fertig`, `done`. Spalten (F3): `backlog`, `bereit`, `in_arbeit`, `qa`, `testing`, `fertig`, `done`.
- `backlog`, `bereit`, `in_arbeit`, `testing` und `done` werden regelmaessig aus - `backlog`, `bereit`, `in_arbeit`, `qa`, `testing` und `done` werden regelmaessig aus
Codeberg-Issues aus mehreren konfigurierten Projekten befuellt (siehe Codeberg-Issues aus mehreren konfigurierten Projekten befuellt (siehe
[Codeberg-Sync](#codeberg-sync-backlogdone)); `qa` und `fertig` sind fuer zukuenftige [Codeberg-Sync](#codeberg-sync-backlogdone)); `fertig` ist fuer ein zukuenftiges Label
Labels reserviert und ergeben sich ausschliesslich aus Agenten-Meldungen (F4). reserviert und ergibt sich ausschliesslich aus Agenten-Meldungen (F4).
- Ticket-Typ (statt Prioritaet) wird bei Codeberg-Tickets aus dem ersten Issue-Label - Ticket-Typ (statt Prioritaet) wird bei Codeberg-Tickets aus dem ersten Issue-Label
uebernommen, die Farbe dagegen fest aus dem Quell-Projekt (F4/F26) - so bleiben Tickets aus uebernommen, die Farbe dagegen fest aus dem Quell-Projekt (F4/F26) - so bleiben Tickets aus
unterschiedlichen Codeberg-Projekten auf einen Blick unterscheidbar, unabhaengig davon, unterschiedlichen Codeberg-Projekten auf einen Blick unterscheidbar, unabhaengig davon,
@ -349,10 +349,10 @@ Codeberg-Projekten (siehe [Projekte](#projekte-codeberg-sync-konfigurieren)) und
je Projekt ueber `repo` + `external_ref` (= Issue-Nummer) mit den Tickets ab: je Projekt ueber `repo` + `external_ref` (= Issue-Nummer) mit den Tickets ab:
- Offene Issues → Spalte je nach Label: `wip` → `in_arbeit`, sonst `testing` → `testing`, - Offene Issues → Spalte je nach Label: `wip` → `in_arbeit`, sonst `testing` → `testing`,
sonst `automate` → `bereit`, sonst `backlog`. sonst `help wanted` → `qa`, sonst `automate` → `bereit`, sonst `backlog`.
- Geschlossene Issues → Spalte `done`. - Geschlossene Issues → Spalte `done`.
- Nur falls das Ticket noch in einer der Sync-Spalten (`backlog`, `bereit`, `in_arbeit`, - Nur falls das Ticket noch in einer der Sync-Spalten (`backlog`, `bereit`, `in_arbeit`, `qa`,
`testing`, `done`) ist - auf `qa`/`fertig` manuell verschobene Tickets werden nicht `testing`, `done`) ist - auf `fertig` manuell verschobene Tickets werden nicht
zurueckgesetzt. zurueckgesetzt.
- Ticket-Typ kommt vom ersten Issue-Label, die Farbe fest vom Projekt (siehe oben). - Ticket-Typ kommt vom ersten Issue-Label, die Farbe fest vom Projekt (siehe oben).

View file

@ -14,12 +14,12 @@ final class TicketRepository
public const COLUMNS = ['backlog', 'bereit', 'in_arbeit', 'qa', 'testing', 'fertig', 'done']; public const COLUMNS = ['backlog', 'bereit', 'in_arbeit', 'qa', 'testing', 'fertig', 'done'];
/** /**
* Spalten, die der Codeberg-Sync anhand von Issue-Status/Labels pflegt (F14). "qa" und * Spalten, die der Codeberg-Sync anhand von Issue-Status/Labels pflegt (F14). "fertig"
* "fertig" sind fuer zukuenftige Labels reserviert und bleiben rein manuell. * ist fuer ein zukuenftiges Label reserviert und bleibt rein manuell.
* *
* @var string[] * @var string[]
*/ */
private const SYNC_MANAGED_COLUMNS = ['backlog', 'bereit', 'in_arbeit', 'testing', 'done']; private const SYNC_MANAGED_COLUMNS = ['backlog', 'bereit', 'in_arbeit', 'qa', 'testing', 'done'];
public function __construct(private readonly Database $db) public function __construct(private readonly Database $db)
{ {
@ -155,7 +155,7 @@ final class TicketRepository
return $this->create($data + ['source' => 'codeberg']); return $this->create($data + ['source' => 'codeberg']);
} }
// Manuell auf eine nicht vom Sync verwaltete Spalte bewegte Tickets (z. B. qa/fertig) // Manuell auf eine nicht vom Sync verwaltete Spalte bewegte Tickets (z. B. fertig)
// werden vom periodischen Codeberg-Sync nicht zurueckgesetzt. // werden vom periodischen Codeberg-Sync nicht zurueckgesetzt.
if (!in_array($existing['column_name'], self::SYNC_MANAGED_COLUMNS, true)) { if (!in_array($existing['column_name'], self::SYNC_MANAGED_COLUMNS, true)) {
return $existing; return $existing;

View file

@ -11,7 +11,7 @@ use Monitor\Api\Repository\TicketRepository;
* F4/F26: Liest offene und geschlossene Issues aus mehreren konfigurierten Codeberg-Projekten * F4/F26: Liest offene und geschlossene Issues aus mehreren konfigurierten Codeberg-Projekten
* (RepoConfigRepository, Issue #27 vormals Config::codebergRepos()) und legt daraus Tickets * (RepoConfigRepository, Issue #27 vormals Config::codebergRepos()) und legt daraus Tickets
* an bzw. aktualisiert sie. Offene Issues landen (falls noch nicht vorhanden bzw. noch nicht * an bzw. aktualisiert sie. Offene Issues landen (falls noch nicht vorhanden bzw. noch nicht
* manuell bewegt) je nach Label in Backlog, Bereit, In Arbeit oder Testing, geschlossene in * manuell bewegt) je nach Label in Backlog, Bereit, In Arbeit, QA oder Testing, geschlossene in
* Done. Der Ticket-Typ (Badge-Text) kommt vom ersten Codeberg-Label, die Ticket-Farbe dagegen * Done. Der Ticket-Typ (Badge-Text) kommt vom ersten Codeberg-Label, die Ticket-Farbe dagegen
* fest vom Quell-Projekt (Issue #26: "unterschiedliche Codeberg-Projekte sollen an fest * fest vom Quell-Projekt (Issue #26: "unterschiedliche Codeberg-Projekte sollen an fest
* zugeordneten Farben erkennbar sein"), nicht mehr von der Label-Farbe. * zugeordneten Farben erkennbar sein"), nicht mehr von der Label-Farbe.
@ -25,6 +25,7 @@ final class CodebergSyncService
private const LABEL_TO_COLUMN = [ private const LABEL_TO_COLUMN = [
'wip' => 'in_arbeit', 'wip' => 'in_arbeit',
'testing' => 'testing', 'testing' => 'testing',
'help wanted' => 'qa',
'automate' => 'bereit', 'automate' => 'bereit',
]; ];

View file

@ -122,7 +122,7 @@ final class TicketRepositoryTest extends TestCase
'column' => 'backlog', 'column' => 'backlog',
]); ]);
$ticket = $this->repository->findByExternalRef('42'); $ticket = $this->repository->findByExternalRef('42');
$this->repository->update((int) $ticket['id'], ['column' => 'qa']); $this->repository->update((int) $ticket['id'], ['column' => 'fertig']);
$result = $this->repository->upsertFromCodeberg([ $result = $this->repository->upsertFromCodeberg([
'external_ref' => '42', 'external_ref' => '42',
@ -130,7 +130,7 @@ final class TicketRepositoryTest extends TestCase
'column' => 'backlog', 'column' => 'backlog',
]); ]);
self::assertSame('qa', $result['column_name']); self::assertSame('fertig', $result['column_name']);
} }
public function testUpsertFromCodebergMovesTicketBetweenSyncManagedColumns(): void public function testUpsertFromCodebergMovesTicketBetweenSyncManagedColumns(): void

View file

@ -148,12 +148,12 @@ final class CodebergSyncServiceTest extends TestCase
$service->sync(); $service->sync();
$ticket = $tickets->findByExternalRef('1', self::MONITOR_SLUG); $ticket = $tickets->findByExternalRef('1', self::MONITOR_SLUG);
$tickets->update((int) $ticket['id'], ['column' => 'qa']); $tickets->update((int) $ticket['id'], ['column' => 'fertig']);
$service->sync(); $service->sync();
$stillQa = $tickets->findByExternalRef('1', self::MONITOR_SLUG); $stillFertig = $tickets->findByExternalRef('1', self::MONITOR_SLUG);
self::assertSame('qa', $stillQa['column_name']); self::assertSame('fertig', $stillFertig['column_name']);
} }
/** @return array<int, array{0: string, 1: string}> */ /** @return array<int, array{0: string, 1: string}> */
@ -163,6 +163,7 @@ final class CodebergSyncServiceTest extends TestCase
'automate -> bereit' => ['automate', 'bereit'], 'automate -> bereit' => ['automate', 'bereit'],
'wip -> in_arbeit' => ['wip', 'in_arbeit'], 'wip -> in_arbeit' => ['wip', 'in_arbeit'],
'testing -> testing' => ['testing', 'testing'], 'testing -> testing' => ['testing', 'testing'],
'help wanted -> qa' => ['help wanted', 'qa'],
]; ];
} }