Skip to content

Commit 9fc6aab

Browse files
committed
vendoring(skills): add java, build, project-setup, personal-zrdj-release via vendoring chain
Vendor the newly declared skill targets from repos.json into .claude/skills/ via ~/.claude/bin/vendor-sync.py. These names previously arrived as generated symlinks into ~/.claude/skills-pool/ from the older workspace-skills.py mechanism; that path is being retired for the personal provider. Part of the personal-aus-der-symlink-verteilung change, phase 3.
1 parent 976f8c5 commit 9fc6aab

43 files changed

Lines changed: 6157 additions & 0 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

‎.claude/skills/build/SKILL.md‎

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
---
2+
name: build
3+
version: 1
4+
description: Bauen, testen, linten und typechecken — immer ueber den Devcontainer, nie nativ. Findet die projektspezifischen Befehle in der Repo-CLAUDE.md statt sie zu raten. Triggers auf bauen, build, compile, test, lint, typecheck, verify, "laeuft das durch", "vor dem Push", CI lokal, Devcontainer, ./dev.
5+
# GENERIERT aus personal/skills-ref/build/ — nicht hier editieren; Aenderungen gehoeren nach ~/.claude/skills-ref/build/.
6+
source: personal-provider-ref
7+
ref-hash: sha256:00d4aeafdd29dd31bf449c357551de121d9bc7fefe23ca18efd8804229a0f51e
8+
---
9+
10+
# build
11+
12+
Lokale CI-Simulation: dieselben Schritte wie in der Pipeline, bevor Code weggeht.
13+
14+
Dieser Skill traegt das **Konzept**. Die konkreten Befehle dieses Repos stehen nicht hier — siehe [Woher die Befehle kommen](#woher-die-befehle-kommen).
15+
16+
## Zwei Regeln, die nicht verhandelbar sind
17+
18+
**1. Die KI baut NIE nativ.** Build, Test, Lint, Typecheck, Verify und Package-Install laufen ausschliesslich ueber den Devcontainer — in **beiden** Kontexten, Host und Sandbox. Direkte Aufrufe nativer Toolchains (`mvn`, `mvnw`, `npm`, `pnpm`, `yarn`, `go build`, `go test`, `gradle`, `gradlew`, `cargo`, `dotnet`) und erst recht SDK-Installs (`mise use --global`, `nvm`, `sdkman`, `asdf`, `go install …@latest`) sind **User-only**.
19+
20+
Der Grund ist nicht Bequemlichkeit: Build-Toolchains sind der groesste Supply-Chain-Vektor, den es gibt. Ein `postinstall`-Script, ein Maven-Plugin, ein crates.io-Build-Script — alles laeuft mit vollen Nutzerrechten und sieht dann `~/.ssh`, `~/.gitconfig`, Browser-Profile, Keychain. Container existieren, **damit** das in einer Wegwerf-Umgebung passiert. Nativ auszuweichen „nur kurz zum Verifizieren" hebt genau den Schutz auf, fuer den der Container da ist.
21+
22+
**2. Am Host startet die KI die Anwendung nicht.** Bauen ja, hochfahren nein. `./dev dev|run|start|serve|watch`, `docker compose up`, jeder Dev-Server, jeder Long-running-Prozess: am Host **User-Vorbehalt**. Er hat die Anwendung in seiner IDE laufen; ein zweiter Start kollidiert um Ports, Datenbank-Zustand und Log-Ausgabe. In der **Sandbox** ist App-Start erlaubt, mit `run_in_background` und Timeout.
23+
24+
### Die Trennlinie
25+
26+
| Kommando-Klasse | Host | Sandbox |
27+
|---|---|---|
28+
| `compile` · `build` · `test` · `lint` · `typecheck` · `verify` · `package` | **ja**, via Devcontainer | ja |
29+
| Codegen, das durchlaeuft und endet | **ja** | ja |
30+
| `dev` · `run` · `start` · `serve` · `watch` · `compose up` | **nein — User** | ja (`run_in_background`) |
31+
| Browser-Smoke-Test gegen selbst gestartete Instanz | **nein — User** | ja |
32+
33+
Merkmal: **endet der Befehl von selbst?** Dann ist es Verifikation → erlaubt. Laeuft er, bis jemand abbricht? Dann ist es App-Start → am Host User-Vorbehalt.
34+
35+
Braucht eine Verifikation zwingend eine laufende Instanz: **den User fragen**, ob seine laeuft und was sie sagt. Nicht selbst starten.
36+
37+
## Woher die Befehle kommen
38+
39+
In dieser Reihenfolge, die erste Quelle gewinnt:
40+
41+
1. **`CLAUDE.md` dieses Repos → Abschnitt `## Bauen und Testen`.** Dort stehen die Befehle, das CI-Aequivalent und die Eigenheiten. Das ist die deklarierte Stelle — sie wird gelesen, nicht uebersprungen.
42+
2. **`./dev` ohne Argument.** Listet alle Subcommands. Das ist die Quelle, wenn CLAUDE.md schweigt oder unvollstaendig ist.
43+
3. **Kein `./dev`, aber `.devcontainer/`** → `devcontainer up --workspace-folder .` einmalig, danach `devcontainer exec --workspace-folder . sh -c '<cmd>'`.
44+
4. **Nichts davon vorhanden** → es gibt (noch) keinen definierten Build. Das wird **gesagt**, nicht durch einen geratenen Befehl ueberspielt.
45+
46+
**Raten ist verboten.** Nicht annehmen, dass es `npm run build` ist — es kann `pnpm`, `yarn`, `vite`, `vinxi` oder ein eigenes Target sein. Nicht annehmen, dass `test` existiert. Ein falsch geratener Befehl, der zufaellig durchlaeuft, ist schlimmer als eine Rueckfrage.
47+
48+
**Dieser Skill wird nicht um Projekt-Befehle erweitert.** Er ist eine generierte Kopie aus `skills-ref/` — eine Aenderung hier erreicht kein anderes Repo und blockiert den naechsten Sync. Projekt-Fakten gehoeren in `CLAUDE.md` → `## Bauen und Testen`.
49+
50+
## Pre-flight
51+
52+
```bash
53+
docker info >/dev/null 2>&1 && echo "Daemon OK"
54+
devcontainer --version # nur noetig fuer direkten devcontainer exec
55+
```
56+
57+
Ohne laufenden Docker-Daemon kein Build — der Container **ist** das Build-Backend. Fehlt die Devcontainer-CLI, wird sie installiert (Standalone-Installer, nicht per npm), **nicht** auf nativen Build ausgewichen.
58+
59+
Nicht mehr pruefen oder installieren: SDKs am Host. Die Toolchain lebt im Container.
60+
61+
## Ausfuehren
62+
63+
`./dev <command>` im Repo-Root ist der Standardweg; das Skript ist container-aware und entscheidet selbst, ob es nativ laeuft (im Container) oder `devcontainer exec` wrappt (am Host).
64+
65+
Ohne `./dev`:
66+
67+
```bash
68+
devcontainer exec --workspace-folder . sh -c '<cmd>'
69+
```
70+
71+
Native Befehle in Repo-Doku sind **Referenz fuer den Inhalt**, kein Ausfuehrungsweg.
72+
73+
## Verifikation
74+
75+
- Alle Befehle mit Exit Code 0
76+
- Keine Lint- oder Test-Fehler
77+
- Lockfiles synchron und ohne Diff nach dem Lauf (`go.sum`, `package-lock.json`, `pnpm-lock.yaml`)
78+
- Keine unaufgeloesten Abhaengigkeiten
79+
80+
Erzeugt ein Build-Schritt Diffs in getrackten Dateien (typisch bei `go mod tidy` oder Lockfile-Updates), gehoeren die committet — nicht verworfen.
81+
82+
## Troubleshooting
83+
84+
| Problem | Ursache | Loesung |
85+
|---|---|---|
86+
| `command not found: devcontainer` | CLI fehlt am Host | Standalone-Installer, **nicht** nativ ausweichen |
87+
| Build „will" nativ laufen | Versuchung, schnell zu verifizieren | STOP. Nativ ist User-only, ohne Ausnahme |
88+
| Kein `./dev`, kein `.devcontainer/` | Repo hat noch kein Build-Setup | melden, nicht improvisieren |
89+
| Testcontainers-Timeout | Ryuk ueber `172.17.0.1` nicht erreichbar | `TESTCONTAINERS_HOST_OVERRIDE=host.docker.internal` + `--add-host=host.docker.internal:host-gateway` |
90+
| Lockfile-Update schlaegt fehl | Lockfile veraltet | im Container regenerieren, dann committen |
91+
| Container-Volume nicht beschreibbar | Named Volume gehoert `root` | `chown` im `post-create.sh` des Repos |
92+
93+
## Zum Schluss
94+
95+
- **Build gruen vor der Uebergabe.** Am Host committet und pusht der User — der gruene Build ist trotzdem Bringschuld, bevor uebergeben wird.
96+
- **Push nie aus dem Container.** Der Devcontainer haelt keine Credentials und ist per Hook geblockt.
97+
- **Fehlschlag wird berichtet**, mit Ausgabe. Nicht umgehen, nicht `--no-verify`, nicht „lief lokal aber".

‎.claude/skills/java/SKILL.md‎

Lines changed: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
1+
---
2+
name: java
3+
description: Umfassende Java-Entwicklungsrichtlinien für Backend-Projekte. Enthält Konventionen, Integrationen (PostgreSQL, Javalin, Jackson, Log4j2), Patterns (Clean Architecture, Repository) und Build-Konfiguration (Maven). Triggers auf Java-Code, REST APIs, Datenbank, jOOQ, Flyway, DTOs, Records, Logging, Properties, Identifiers, Security.
4+
# GENERIERT aus personal/skills-ref/java/ — nicht hier editieren; Aenderungen gehoeren nach ~/.claude/skills-ref/java/.
5+
source: personal-provider-ref
6+
ref-hash: sha256:8a4c909743dc64a6c65624290ae533a0c33027f19ad593362f2e0606491304d9
7+
---
8+
9+
# Java Development Guide
10+
11+
Vollständige Entwicklungsrichtlinien für Java-Backend-Projekte.
12+
13+
## Quick Reference
14+
15+
| Thema | Konvention |
16+
|-------|------------|
17+
| **Klassen/Records** | PascalCase, Suffix: `*Dto`, `*Repository`, `*Service` |
18+
| **Methoden** | camelCase, Prefix: `find*`, `create*`, `update*`, `delete*` |
19+
| **Private Felder** | `_underscorePrefix` |
20+
| **Null-Handling** | `Optional<T>` statt null |
21+
| **Collections** | Eclipse Collections (immutable) |
22+
| **JSON** | Jackson mit Field-Visibility |
23+
| **Database** | jOOQ + Flyway + HikariCP |
24+
| **HTTP Server** | Javalin |
25+
| **Logging** | Log4j2 + SLF4J (JSON) |
26+
| **IDs** | UUIDv7 |
27+
| **Build** | Maven Multi-Module |
28+
29+
## Rules by Priority
30+
31+
### Conventions (Immer anwenden)
32+
33+
| Rule | Impact | Beschreibung |
34+
|------|--------|--------------|
35+
| [convention-naming](rules/convention-naming.md) | HIGH | Klassen, Interfaces, Methoden, Variablen |
36+
| [convention-dtos](rules/convention-dtos.md) | HIGH | Records, Klassen-DTOs, Sealed Classes |
37+
| [convention-null-handling](rules/convention-null-handling.md) | HIGH | Optional, var, final |
38+
| [convention-formatting](rules/convention-formatting.md) | MEDIUM | Einrückung, Klammern, Leerzeilen |
39+
| [convention-imports](rules/convention-imports.md) | MEDIUM | Import-Reihenfolge |
40+
41+
### Integrations (Bei Bedarf)
42+
43+
| Rule | Impact | Beschreibung |
44+
|------|--------|--------------|
45+
| [integration-database-postgres](rules/integration-database-postgres.md) | CRITICAL | jOOQ, Flyway, HikariCP, Auditing |
46+
| [integration-http-server-javalin](rules/integration-http-server-javalin.md) | CRITICAL | REST Endpoints, Exception Handler |
47+
| [integration-json-jackson](rules/integration-json-jackson.md) | HIGH | ObjectMapper, Annotations, SubTypes |
48+
| [integration-logging-log4j2](rules/integration-logging-log4j2.md) | HIGH | Structured JSON Logging, MDC |
49+
| [integration-collections-eclipse](rules/integration-collections-eclipse.md) | HIGH | ImmutableList, ImmutableMap |
50+
| [integration-identifiers](rules/integration-identifiers.md) | HIGH | UUIDv7, ULID, Codecs |
51+
| [integration-configuration-properties](rules/integration-configuration-properties.md) | MEDIUM | Typisierte Properties |
52+
| [integration-http-client-retrofit](rules/integration-http-client-retrofit.md) | MEDIUM | REST Client mit OkHttp |
53+
| [integration-dependency-injection](rules/integration-dependency-injection.md) | MEDIUM | JUseCase Inject, AspectJ |
54+
| [integration-security-password4j](rules/integration-security-password4j.md) | MEDIUM | Argon2, BCrypt Hashing |
55+
| [integration-security-password-policy](rules/integration-security-password-policy.md) | MEDIUM | Passay Validierung |
56+
| [integration-sqids](rules/integration-sqids.md) | LOW | Kurze URL-sichere IDs |
57+
| [integration-primitives](rules/integration-primitives.md) | LOW | Bytes, Hashing, Codecs |
58+
| [integration-filesearch](rules/integration-filesearch.md) | LOW | Dateisystem-Suche |
59+
| [integration-useragent-parser](rules/integration-useragent-parser.md) | LOW | Browser/OS Erkennung |
60+
| [integration-ip-geolocation](rules/integration-ip-geolocation.md) | LOW | MaxMind GeoLite2 |
61+
| [integration-database-dynamodb](rules/integration-database-dynamodb.md) | LOW | AWS DynamoDB |
62+
63+
### Patterns (Architektur)
64+
65+
| Rule | Impact | Beschreibung |
66+
|------|--------|--------------|
67+
| [pattern-clean-architecture](rules/pattern-clean-architecture.md) | CRITICAL | UseCases, Domain Layer |
68+
| [pattern-repository](rules/pattern-repository.md) | HIGH | Interface + jOOQ Implementierung |
69+
70+
### Build (Projekt-Setup)
71+
72+
| Rule | Impact | Beschreibung |
73+
|------|--------|--------------|
74+
| [build-maven-multimodule](rules/build-maven-multimodule.md) | HIGH | Parent POM, Module |
75+
| [build-maven](rules/build-maven.md) | MEDIUM | Single-Module Setup |
76+
| [build-bootstrap-rest-api](rules/build-bootstrap-rest-api.md) | MEDIUM | REST API Grundgerüst |
77+
78+
## Workflow-Checkliste
79+
80+
### Neues Projekt
81+
82+
- [ ] Maven-Struktur anlegen (Single oder Multi-Module)
83+
- [ ] `.editorconfig` aus Template kopieren
84+
- [ ] Dependencies in pom.xml eintragen
85+
- [ ] log4j2.xml konfigurieren
86+
- [ ] application.properties anlegen
87+
88+
### Neue Klasse
89+
90+
- [ ] Package-Struktur beachten (feature/{domain}/...)
91+
- [ ] Naming-Konventionen einhalten
92+
- [ ] `final` und `var` verwenden
93+
- [ ] `Optional<T>` statt null
94+
- [ ] Private Felder mit `_underscorePrefix`
95+
96+
### Neues Feature
97+
98+
- [ ] UseCase mit korrektem Interface anlegen
99+
- [ ] DTO im api-Package erstellen
100+
- [ ] Repository-Interface definieren
101+
- [ ] jOOQ-Implementierung schreiben
102+
- [ ] Javalin Route registrieren
103+
104+
## Wichtige Hinweise
105+
106+
- **Build zur Verifikation** - immer ueber den Devcontainer: `./dev compile`/`./dev verify` (Baunach), sonst `devcontainer exec --workspace-folder . sh -c 'mvn clean verify'`. **Nie nativ `mvn`/`./mvnw`** — das ist User-only (siehe `~/.claude/CLAUDE.md` → Verbote, [[build]])
107+
- **Sandbox deaktivieren** - der Build-Befehl (`./dev` bzw. `devcontainer exec`) immer mit `dangerouslyDisableSandbox: true` ausfuehren (Netzwerkzugriff auf Maven Central, JitPack etc. noetig)
108+
- **DTOs aus api-Package** - Niemals Repository-Records direkt zurueckgeben
109+
- **Eclipse Collections** - Immer immutable Collections verwenden
110+
- **UUIDv7** - Fuer alle neuen IDs verwenden
111+
112+
## References (Templates)
113+
114+
| Template | Beschreibung |
115+
|----------|--------------|
116+
| [usecase-template.java](references/usecase-template.java) | UseCase mit Request/Response |
117+
| [repository-template.java](references/repository-template.java) | Interface + jOOQ-Implementierung |
118+
| [dto-template.java](references/dto-template.java) | Record DTO mit jOOQ-Konstruktor |
119+
120+
## Ressourcen
121+
122+
- [editorconfig.template](editorconfig.template) - IDE-Konfiguration
Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
# EditorConfig - https://editorconfig.org
2+
# Kopiere diese Datei als .editorconfig ins Projekt-Root
3+
root = true
4+
5+
# Defaults für alle Dateien
6+
[*]
7+
charset = utf-8
8+
end_of_line = lf
9+
insert_final_newline = true
10+
trim_trailing_whitespace = true
11+
indent_style = space
12+
indent_size = 4
13+
14+
# Java
15+
[*.java]
16+
indent_size = 4
17+
continuation_indent_size = 8
18+
max_line_length = 120
19+
20+
# IntelliJ-spezifisch: Import-Reihenfolge
21+
# $* = static imports, | = Leerzeile, * = alle anderen
22+
ij_java_imports_layout = $*, |, *, |, javax.**, |, java.**
23+
ij_java_class_count_to_use_import_on_demand = 999
24+
ij_java_names_count_to_use_import_on_demand = 999
25+
26+
# IntelliJ-spezifisch: Klammern
27+
ij_java_brace_style = end_of_line
28+
ij_java_class_brace_style = end_of_line
29+
ij_java_method_brace_style = end_of_line
30+
31+
# IntelliJ-spezifisch: Leerzeilen
32+
ij_java_blank_lines_after_package = 1
33+
ij_java_blank_lines_before_imports = 1
34+
ij_java_blank_lines_after_imports = 1
35+
ij_java_blank_lines_around_class = 1
36+
ij_java_blank_lines_around_method = 1
37+
ij_java_blank_lines_around_field = 0
38+
39+
# IntelliJ-spezifisch: Wrapping
40+
ij_java_wrap_long_lines = true
41+
ij_java_method_parameters_wrap = on_every_item
42+
ij_java_method_call_arguments_wrap = on_every_item
43+
ij_java_record_components_wrap = on_every_item
44+
ij_java_align_multiline_parameters = false
45+
ij_java_align_multiline_records = false
46+
47+
# IntelliJ-spezifisch: Spaces
48+
ij_java_space_before_method_parentheses = false
49+
ij_java_space_before_if_parentheses = true
50+
ij_java_space_before_for_parentheses = true
51+
ij_java_space_before_while_parentheses = true
52+
ij_java_space_before_switch_parentheses = true
53+
ij_java_space_before_catch_parentheses = true
54+
ij_java_space_around_assignment_operators = true
55+
ij_java_space_around_logical_operators = true
56+
ij_java_space_around_equality_operators = true
57+
ij_java_space_around_relational_operators = true
58+
ij_java_space_around_additive_operators = true
59+
ij_java_space_around_multiplicative_operators = true
60+
ij_java_space_after_comma = true
61+
ij_java_space_before_comma = false
62+
63+
# XML / POM
64+
[*.xml]
65+
indent_size = 4
66+
67+
[pom.xml]
68+
indent_size = 4
69+
70+
# Properties
71+
[*.properties]
72+
indent_size = 2
73+
74+
# YAML
75+
[*.{yml,yaml}]
76+
indent_size = 2
77+
78+
# JSON
79+
[*.json]
80+
indent_size = 2
81+
82+
# Markdown
83+
[*.md]
84+
trim_trailing_whitespace = false
85+
indent_size = 2
86+
87+
# SQL
88+
[*.sql]
89+
indent_size = 4
90+
ij_sql_keyword_case = upper
91+
ij_sql_identifier_case = lower
92+
93+
# Shell Scripts
94+
[*.sh]
95+
indent_size = 2
96+
97+
# Generated Code - nicht formatieren
98+
[**/generated/**]
99+
ij_formatter_enabled = false
100+
101+
[**/org/jooq/generated/**]
102+
ij_formatter_enabled = false
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package net.baunach.bis.backend.core.feature.website.{domain}.api;
2+
3+
import java.util.Optional;
4+
import java.util.UUID;
5+
6+
// ============================================================
7+
// Standard Record DTO
8+
// ============================================================
9+
public record {FeatureName}Dto(
10+
UUID id,
11+
String name,
12+
Optional<String> description
13+
) {
14+
// Konstruktor fuer jOOQ-Records
15+
public {FeatureName}Dto(final JooqGeneratedBisRecord{Entity} record) {
16+
this(
17+
record.getId(),
18+
record.getName(),
19+
Optional.ofNullable(record.getDescription())
20+
);
21+
}
22+
}
23+
24+
// ============================================================
25+
// Sealed Interface (fuer polymorphe Ergebnisse)
26+
// ============================================================
27+
// public sealed interface {FeatureName}Result
28+
// permits {FeatureName}Success, {FeatureName}Failure {
29+
// }
30+
//
31+
// public record {FeatureName}Success(UUID id) implements {FeatureName}Result {}
32+
// public record {FeatureName}Failure(String errorCode) implements {FeatureName}Result {}

0 commit comments

Comments
 (0)