Neues Label "help wanted" fuer QA-Spalte im Codeberg-Sync (Issue #49)
Der Agent (fds2610/Agent#9) setzt "help wanted" auf Issues, waehrend er auf die Erfuellung einer externen Voraussetzung wartet. Solche Issues sollen im Monitor-Board in der Spalte "QA" auftauchen statt im Backlog zu verschwinden. "qa" wird dafuer wie "backlog"/"bereit"/"in_arbeit"/"testing"/"done" zur sync-verwalteten Spalte; nur "fertig" bleibt weiterhin fuer ein zukuenftiges Label reserviert und rein manuell.
This commit is contained in:
parent
05fdef1525
commit
dedcab6930
5 changed files with 18 additions and 16 deletions
12
API.md
12
API.md
|
|
@ -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).
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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',
|
||||||
];
|
];
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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'],
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue