Zweite Hälfte von Sitzung D (docs/plan/22-multi-repo.md, PR #13): Der Server bediente bisher genau ein Repository der Registry. Jede Route — API, Seiten, Artefakt-Dateien — arbeitete auf `registry.current()`; ein zweites registriertes Repository wurde gebaut und gepollt, war aber unsichtbar und unerreichbar. Jeder Controller löst sein Repository jetzt je Anfrage auf, statt das bediente als Bohne zu halten; jede Route ist zweimal gemappt. Die unscoped Form ist kein Übergangs-Alias, sondern dauerhaft die Art zu sagen „das bediente Repository" — Lesezeichen und die nach Gitea geposteten Links kennen kein Segment. Entschieden gegen die Repo-Spalte: Die Seiten bleiben je Repository, die Navigation bekommt einen Umschalter. Die Aktionen einer Zeile brauchen das Repository ohnehin, Branches kommen von einem origin und Artefakte aus einem Store — und bei dem einen Repository, das die meisten Installationen haben, wäre eine Spalte nur Rauschen. Das Link-Präfix folgt der ZAHL der bedienten Repositories, nicht dem Weg, über den eine Seite erreicht wurde: mit einem behält die Installation ihre bisherigen URLs (Abnahmekriterium der Sitzung), mit mehreren benennt jeder Link sein Repository. werkator.js liest das Präfix einmal aus einem `werkator-repo-base`-Meta. `BranchPermalinks.permanentUrl` bekommt es ebenfalls — der permanente Schlüssel ist ein Hash des Build-Namens allein, zwei Repositories mit `main` teilten sich sonst eine permanente URL. Fünf neue Tests, Gegenprobe per Mutation gezogen (Präfix fest auf leer → genau der Mehr-Repo-Test fällt). 498 Tests grün, ktlint sauber. PR-Dokument docs/prs/2026-09-03-PR#13-…, Plan, Architektur-Skill und AGENTS.md nachgezogen. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
41 lines
2.3 KiB
HTML
41 lines
2.3 KiB
HTML
<!doctype html>
|
||
<html xmlns:th="http://www.thymeleaf.org" lang="en">
|
||
<head th:replace="~{fragments :: head(${pageTitle})}"></head>
|
||
<body>
|
||
<main>
|
||
<h1 th:replace="~{fragments :: header(${pageTitle})}"></h1>
|
||
<div th:replace="~{fragments :: nav(${view})}"></div>
|
||
<div id="current-builds" th:attr="data-api=${apiBase} + '/builds/current'" data-api="/api/builds/current">
|
||
<p id="no-current" class="empty-panel" th:style="${#lists.isEmpty(currentBuilds)} ? '' : 'display: none'">
|
||
No build is currently running.
|
||
</p>
|
||
<section class="build-card" th:each="build : ${currentBuilds}"
|
||
th:attr="data-artifact-key=${build.artifactKey},data-started-at=${build.startedAtIso},data-running-since=${build.runningSinceIso},data-status=${build.status}">
|
||
<header class="build-card-header">
|
||
<span th:class="'status status-' + ${build.status}" th:text="${build.status}">running</span>
|
||
<span class="branch link-tools">
|
||
<a th:if="${build.branchUrl != null}" th:href="${build.branchUrl}" target="_blank"
|
||
rel="noopener noreferrer" th:text="${build.name}">main</a>
|
||
<span th:if="${build.branchUrl == null}" th:text="${build.name}">main</span>
|
||
</span>
|
||
<code>
|
||
<a th:if="${build.commitUrl != null}" th:href="${build.commitUrl}" target="_blank"
|
||
rel="noopener noreferrer" th:text="${build.commitAbbrev}">0123abc</a>
|
||
<span th:if="${build.commitUrl == null}" th:text="${build.commitAbbrev}">0123abc</span>
|
||
</code>
|
||
<span class="muted" th:text="'started ' + ${build.startedAt}">started 2026-07-07 12:00</span>
|
||
<span class="duration-cell running-duration"></span>
|
||
<span class="build-card-actions">
|
||
<button class="action-button cancel-button" type="button" data-action="cancel"
|
||
th:attr="data-artifact-key=${build.artifactKey}" title="Cancel build">× Cancel</button>
|
||
</span>
|
||
</header>
|
||
<pre class="live-log" th:attr="aria-label='live log of ' + ${build.name}"></pre>
|
||
</section>
|
||
</div>
|
||
</main>
|
||
<footer th:replace="~{fragments :: footer}"></footer>
|
||
<script src="/werkator.js"></script>
|
||
</body>
|
||
</html>
|