4304dd7c4bf86cfdcf58f356b7e6d8937b6d192c
Sitzung D, erste Hälfte (docs/plan/22-multi-repo.md): Jede Route der Builds-API gibt es jetzt zweimal — repo-benannt und unscoped. Die unscoped Form bleibt dauerhaft und meint das bediente Repository (`RepoRegistry.current`): Lesezeichen, die alte Oberfläche und die bereits nach Gitea geposteten Links kennen kein Repo-Segment, und eine CI, die ihre eigenen alten Links bricht, ist eine CI, der niemand traut. Der Controller hält kein `BuildResultRepository`, keinen `ArtifactStore` und keinen `RepoContext` mehr als Bohne, sondern löst je Anfrage über die Registry auf. Ein unbekannter Name beantwortet sich in der Form dieser API (404 mit `error`) über einen eigenen ExceptionHandler statt über Springs Problem-Detail. Dabei gefunden und mitbehoben: `cancel` griff über Repository-Grenzen. Der Executor bricht per Schlüssel instanzweit ab — eine Route, die ein Repository benennt, darf damit kein fremdes erreichen. Sie prüft jetzt zuerst, ob der Schlüssel in den Ergebnissen DIESES Repositories steht; ein wartender oder laufender Build hat dort immer sein PENDING/RUNNING. Drei neue Tests: die repo-benannte Route antwortet, ein unbekannter Name gibt 404 mit Meldung, und `cancel` erreicht keinen fremden Build. 496 Tests grün, ktlint sauber. Noch nicht scoped: die Oberfläche und die Artefakt-Routen — die kommen mit der zweiten Hälfte von Sitzung D. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Werkator
Lightweight, declarative and highly opinionated software build system (CI/CD).
Documentation
- docs/configuration.md — configuration reference
- docs/bootstrapping.md — initializing a repository with
init - docs/deployment.md — running Werkator as a systemd service behind a reverse proxy
Developer Setup
Source .envrc to add tools/ to your PATH, or install direnv to have this done automatically on cd:
source .envrc
Common tasks:
./gradlew build # compile and run all checks
./gradlew test # run tests
./gradlew ktlintFormat # auto-format Kotlin sources
./gradlew ktlintCheck # check formatting (also runs as part of build)
adr-status # show all architecture decisions at a glance
direnv
direnv sources .envrc automatically whenever you enter the repository and unloads it when you leave.
# Ubuntu
sudo apt install direnv
# add to ~/.bashrc or ~/.zshrc
eval "$(direnv hook bash)" # or: eval "$(direnv hook zsh)"
Trust the project's .envrc once per clone:
direnv allow
Tools (tools/)
| Command | Description |
|---|---|
adr-status |
List all Architecture Decision Records with their status and decision summary |
Architecture Decision Records
Major technical decisions are documented as ADRs in docs/adrs/.
adr-status # show all decisions at a glance
New ADRs follow the template at docs/adrs/0000-00-00.adr-template.md.
Languages
Kotlin
87%
HTML
4.6%
Shell
4.2%
JavaScript
3%
CSS
1.2%