v0.27.0
[0.27.0] - 2026-07-09
Bug Fixes
- Correct SQL generator option key from dialect to sql-dialect (docs)
Chore
- Bump version to 0.27.0 (release)
Documentation
- Document ERM (entity-relationship modelling) in handbook + README- Fix release-review findings for v0.27.0
Other
- KUML V3.4.1 - ERM Metamodell, DSL und Constraint-Checker
Neues eigenstaendiges Modul kuml-metamodel-erm: Entity/Attribute/
Relationship/View/Index/CheckConstraint-Modell sowie eine ermModel{}-DSL
mit notation-bewusster Diagrammerstellung (Martin/Crow's-Foot, Bachman,
Chen, IDEF1X als einheitliche notation-Eigenschaft auf Modellebene;
Rendering der unterschiedlichen Notationen folgt in V3.4.2). Haengt nur
von kuml-core-model ab, keine Wiederverwendung von kuml-metamodel-uml.
ErmConstraintChecker mit 15 Struktur-Regeln (u.a. Primaerschluessel-,
Fremdschluessel-, View-, Index- und Check-Constraint-Validierung,
inklusive der zuvor fehlenden Regel 15 fuer nicht-leere Check-Constraint-
Ausdruecke).
Verdrahtung des Checkers in die bestehenden Pipelines: kuml validate
fuehrt ERM-Strukturregeln jetzt im bestehenden "structural"-JSON-Abschnitt
unter der Kategorie "erm" aus. Render-Pipelines (Desktop/Web/Asciidoctor/
Vault-Example-Renderer) geben fuer ERM-Diagramme eine klare "noch nicht
unterstuetzt"-Meldung statt eines Absturzes aus (Rendering geplant fuer
V3.4.2). Der MCP-Validate-Tool und der Beispiel-Katalog wurden um
ERM-Awareness erweitert.
Neue CLI-Smoke-Tests und ERM-Fixtures (valid-ecommerce.kuml.kts,
broken-fk.kuml.kts).
Co-Authored-By: Claude Sonnet 5 noreply@anthropic.com- KUML V3.4.2 - ERM/Martin-Notation SVG-Renderer
Neu:
- ERM/Martin-SVG-Renderer (kuml-io-svg): ErmMartinSvg, ErmMartinEdgeSvg,
ErmSizing, ErmViewSvg (+ Tests), verdrahtet in KumlSvgRenderer.toSvg/
toSvgFile und SvgDocument-Stylesheet. - ERM-Layout-Bridge (kuml-layout-bridge): ErmContentSizeProvider,
ErmLayoutBridge (+ jvmTests) — legt ERM-Entitaeten/Views per ELK layoutet
aus, analog zu UML-Klassendiagrammen. - kuml-io-svg und kuml-layout-bridge deklarieren neu
api(project(":kuml-metamodel:kuml-metamodel-erm")). - DumpJsonCommand und VaultExampleRenderer nutzen jetzt die neue Layout-
Bridge + den neuen Renderer statt des V3.4.1-Stubs ("ERM rendering not
yet supported"). - ValidateCommandErmTest prueft echtes SVG fuer Martin-Notation; Bachman/
Chen/IDEF1X werfen weiterhin den strukturierten "not yet supported"-Fehler.
Fix:
- RenderPipeline.renderErm faengt IllegalArgumentException aus
KumlSvgRenderer.toSvg gezielt ab (neuer ermToSvg-Helper) und wirft sie als
ScriptEvaluationException weiter — analog zur bestehenden Konvention fuer
nicht unterstuetzte ERM-Formate/LaTeX. Der zu breite catch-Block in
RenderCommand, der zuvor jede require(...)-Verletzung in der gesamten
Pipeline als harmlosen Skriptfehler maskierte, wurde entfernt.
Co-Authored-By: Claude Sonnet 5 noreply@anthropic.com- KUML V3.4.3 - ERM/Bachman-Notation SVG-Renderer
Implementiert die Bachman-Notation (Pfeil + Kreis) für ERM-Diagramme als
zweite unterstützte Notation neben Martin/Crow's-Foot (V3.4.2).
- KumlSvgRenderer: renderErmBachman-Pfad ergänzt, der sich Layout,
Entity-/View-Rendering und Relationship-Label-Stacking mit
renderErmMartin über eine neue gemeinsame renderErm-Body-Funktion
teilt. Nur der Kanten-Glyph-Renderer (renderRelationship) variiert pro
Notation. ErmNotation.BACHMAN wirft nicht mehr "not yet supported",
sondern rendert echtes SVG; die Fehlermeldungen für CHEN (V3.4.4) und
IDEF1X (V3.4.5) sind entsprechend aktualisiert. - ErmBachmanEdgeSvg.kt (neu): Bachman-spezifischer Kantenrenderer mit
Pfeilspitze für "many" und gefülltem Kreis für "mandatory" (Pendant zu
den Crow's-Foot-/Bar-Glyphen der Martin-Notation). - SvgDocument: neue CSS-Klassen .kuml-erm-bachman-arrow und
.kuml-erm-bachman-mandatory; Entity-Boxen und der hohle
.kuml-erm-optional-marker-Kreis werden unverändert wiederverwendet. - RenderPipelineTest: CLI-Test für "--notation bachman" aktualisiert —
erwartet jetzt gerendertes SVG (kuml-erm-entity, kuml-erm-bachman-arrow)
statt der bisherigen not-yet-supported-Exception; neuer Test bestätigt,
dass "--notation chen" weiterhin die strukturierte Fehlermeldung wirft. - ErmMartinSvgTest: BACHMAN aus der Liste der Notationen entfernt, die
noch die not-yet-supported-Exception werfen (nur noch CHEN/IDEF1X). - ErmBachmanSvgTest.kt (neu): Sample-Output-Tests für die neue Bachman-
Notation (Pfeilspitzen, Mandatory-Kreise, Label-Stacking, XML-Escaping). - ValidateCommandErmTest: analoger Fix im CLI-Smoke-Test — "render
--notation bachman" erwartet jetzt gerendertes SVG statt exit 3;
neuer Test bestätigt, dass "--notation chen" weiterhin die
strukturierte Fehlermeldung wirft (war im Feature-Branch übersehen
worden und ließ ./gradlew check erst rot werden).- KUML V3.4.4 - ERM/Chen-Notation SVG-Renderer
Neuer Renderer-Pfad für ER-Diagramme in klassischer Chen-Notation
(Rechtecke für Entities, Rauten für Relationships, Ellipsen für
Attribute, verbunden über einfache Linien statt Crow's-Foot-Pfeilen).
- ErmChenSvg: SVG-Zeichenlogik für Chen-Notation (Entity-Boxen,
Relationship-Rauten, Attribut-Ellipsen inkl. Primärschlüssel-
Unterstreichung und Multi-/schwache Entity-Darstellung) - ErmChenSizing: Content-aware Größenberechnung für Chen-Elemente
- ErmChenLayoutBridge / ErmChenSizeProvider: Anbindung an die
Layout-Bridge, analog zum bestehenden Bachman-Renderer-Pfad - KumlSvgRenderer, RenderCommand, RenderPipeline um den neuen
Notationsmodus erweitert - Testabdeckung: ErmChenSvgTest, ErmChenLayoutBridgeTest,
RenderPipelineTest, ValidateCommandErmTest, ErmMartinSvgTest
(Regressionsschutz) ergänzt/angepasst
Co-Authored-By: Claude Sonnet 5 noreply@anthropic.com- KUML V3.4.5 - ERM/IDEF1X-Notation SVG-Renderer
Neu:
- ErmCategory als First-Class-Element im ERM-Metamodell (Supertyp/Subtypen,
Vollstaendigkeits-Flag, Diskriminator-Attribut), DSL-Funktion category(...) - Neue Constraint-Regeln 16-19 (Supertyp/Subtypen aufloesbar, kein Selbstbezug,
Diskriminator gehoert zum Supertyp) sowie Ausnahme der Kategorie-Subtypen
von Regel 3s PK-Pflicht - ErmIdef1xLayoutBridge: behaelt echte Entity-/View-/Relationship-Ids
(im Gegensatz zur Chen-Bridge) und injiziert fuer IDEF1X-Kategorien einen
synthetischen Diskriminator-Kreis-Knoten plus Supertyp-/Subtyp-Kanten - IDEF1X-SVG-Renderer (renderErmIdef1x()): rundet Ecken abhaengiger Entitaeten
(weak, Identifying-Ziel, Kategorie-Subtyp); zeichnet Identifying/
Non-Identifying-Linien mit gefuelltem Kind-Punkt, optionaler Eltern-Raute
und P/Z/1-Kardinalitaets-Annotation; Kategorie-Diskriminator-Kreis mit
einfacher/doppelter Vollstaendigkeits-Linie; neue CSS-Klassen in SvgDocument - CLI-Anbindung: RenderPipeline.renderErm waehlt fuer IDEF1X die neue
ErmIdef1xLayoutBridge; --notation-Hilfetext und KDocs aktualisiert
(idef1x wirft nicht mehr)
Bisherige "idef1x throws / not yet supported"-Regressionstests in
RenderPipelineTest, ValidateCommandErmTest, ErmMartinSvgTest und
ErmChenSvgTest zu echten Render-Assertions umgeschrieben.
Betroffene Module: kuml-metamodel-erm, kuml-layout-bridge, kuml-io-svg, kuml-cli.- KUML V3.4.6 - UML-zu-ERM Modelltransformation (M2M) + Exposed-Mapping-Profil
Neues Codegen-Modul kuml-transform-uml-to-erm: transformiert UML-Klassenmodelle
(annotiert mit dem neuen dev.kuml.profiles.erm-Mapping-Profil, kuml-profile-erm)
in ERM-Metamodelle sowie in ausführbare Kotlin-Exposed-DAO-Skripte.
- UmlToErmTransformer: Klassen -> Entities, Assoziationen -> FKs/Join-Tabellen,
inklusive JOINED-Inheritance-Auflösung root-to-leaf (applyJoinedLinks)
und Kollisions-Auflösung für FK-Spaltennamen über Assoziationsend-Rollen - UmlToErmScriptTransformer + ErmScriptRenderer: Rendering des ERM-Modells als
Kotlin-Exposed-Skript (Tabellen, Spalten, Fremdschlüssel, Referential Actions) - SqlIdentifiers/UmlErmTypeMapper: sichere SQL-Identifier-Erzeugung und
UML-Typ-zu-SQL-Typ-Mapping - Security-Fixes: Neutralisierung von Kotlin-Script-Injection über
$sowie
CR/LF-Injection im generierten Skript-Header-Kommentar (ErmScriptRenderer) - Neues Profil-Modul kuml-profile-erm (ErmMappingProfile, ErmProfileNames) als
Gegenstück zum bestehenden AUTOSAR-Profil-Muster - Registrierung über ServiceLoader (KumlTransformerProvider, KumlProfileProvider)
und Anbindung in settings.gradle.kts - Vault-Beispiel "38 UML Profil – Exposed" ergänzt (Profil-Definition +
renderbares PSM-Beispiel), Übersicht und Playground-Mapping aktualisiert
Basiert auf 5 WIP-Commits von feature/v3.4.6-uml-to-erm-transform, per
Squash-Merge zu einem Release-Commit auf master zusammengefasst.- KUML V3.4.7 - kuml-gen-sql auf ERM-Eingabe umgestellt
Repoints kuml-gen-sql von direktem UML-Stereotyp-String-Matching auf das
getippte ERM-Metamodell (V3.4.6). Ein neuer ErmSqlEmitter ist die einzige
DDL-Rendering-Engine fuer zwei gleichwertige Eingangspfade:
- SqlDdlGenerator (UML-Direktpfad): KumlDiagram -> UmlToErmTransformer ->
ErmModel -> ErmSqlEmitter -> DDL. - ErmSqlDdlGenerator (ERM-first, neu): ErmModel -> ErmSqlEmitter -> DDL,
ueber eine neue ErmCodeGenerator/ErmCodeGenRegistry-SPI in kuml-codegen-api.
Der Emitter unterstuetzt jetzt Composite-PKs, Indizes, Views, Check-
Constraints und referentielle Aktionen (ON DELETE/ON UPDATE) - keiner davon
war im alten UML-Direktpfad abbildbar. FK-Spalten stehen direkt in CREATE
TABLE statt per ALTER TABLE ADD COLUMN, M:N-Assoziationen erzeugen echte
Junction-Tables statt TODO-Kommentaren, Enums werden als VARCHAR+CHECK statt
Postgres-CREATE-TYPE emittiert (bewusste Verhaltensaenderung).
FlywayBaselineGenerator bekommt ein ERM-first-Gegenstueck
(ErmFlywayBaselineGenerator), beide teilen sich die Pfad-Traversal-Guards
ueber ein neues FlywayFileNaming-Objekt. GenerateCommand (CLI) und
GenerateTool (MCP) verzweigen jetzt auf UML- oder ERM-Skripte.
Co-Authored-By: Claude Sonnet 5 noreply@anthropic.com- KUML OKF-Spike - Workspace info/validate/render fuer Obsidian-Knowledge-Format (ADR-0011 FT-1)
Neuer kuml workspace-Befehl mit den Subcommands info, validate und
render fuer Obsidian-Vault-Workspaces im Open Knowledge Format (OKF):
- Frontmatter-Parser fuer YAML-Frontmatter in Markdown-Notizen
(Frontmatter.kt) - OKF-Dokumentmodell und -Typen (OkfDocument.kt, OkfType.kt)
- Validator fuer OKF-Konformitaet von Workspace-Notizen (OkfValidator.kt)
- WorkspaceScanner durchsucht ein Obsidian-Vault nach OKF-Notizen anhand
einer.kuml-workspace.toml-Konfiguration - WorkspaceRenderer rendert eingebettete kuml-Blöcke aus Workspace-Notizen;
Block-Namen werden sanitisiert um Path-Traversal beim Datei-Output zu
verhindern - WorkspaceCommand verdrahtet die drei Subcommands in der CLI
(KumlCli.kt) - Testabdeckung: FrontmatterParserTest, WorkspaceCommandTest sowie ein
Beispiel-Workspace unter src/test/resources/okf-workspace/ (Artikel,
Konzepte, Modelle, Index) - ktlint-Formatierung auf alle neuen Sources angewendet
Squash-Merge von feature/okf-validation-spike (3 Commits: WIP-Implementierung,
ktlint-Formatierung, Path-Traversal-Fix).- KUML DSL-Stereotypen - Attribut-/Assoziations-Stereotypen in DSL, Rendering und Layout
Fuehrt Stereotyp-Unterstuetzung fuer Attribute und Assoziationen ein: DSL-Builder
(AssociationBuilder, ClassBuilder) koennen Stereotypen setzen, das Relationships-
Metamodell traegt sie, StereotypeHelper rendert sie im SVG-Output, und
UmlContentSizeProvider beruecksichtigt sie bei der Knotengroessenberechnung.
Inklusive Tests in kuml-core-dsl, kuml-io-svg und kuml-layout-bridge.- KUML V3.4.8 - ERM-zu-Exposed Transformer-Kette
ErmToExposedTransformer + ErmExposedGenerator/ErmExposedEmitter fuer
den direkten ERM->Exposed-PSM-Schritt der MDA-Persistenzschicht-
Pipeline (ADR-0016), sowie UmlToExposedViaErmScriptTransformer als
Kettenwrapper (UML->ERM->Exposed). Neue Service-Provider fuer
ErmCodeGeneratorProvider und KumlTransformerProvider registriert.- KUML V3.4.9 - SQL-zu-ERM Reverse Engineering
Neue ERM-tragende Reverse-SPI (ErmReverseEngine/ErmReverseResult/
ErmReverseEngineRegistry) in kuml-codegen-reverse-api, parallel zur
bestehenden UML-Reverse-SPI, da SQL-DDL ein ErmModel statt eines
KumlModel liefert.
Neues Modul kuml-codegen-reverse-sql implementiert PostgresErmReverseEngine
(JVM-only, JSqlParser 5.3) mit 2-Pass-Pipeline: CREATE TABLE -> Entities +
Attribute (Typ-Mapping inkl. SERIAL/pg_dump-nextval-Erkennung, PK/UNIQUE/
DEFAULT/CHECK/REFERENCES-Parsing aus JSqlParsers Roh-Token-Spalten-Specs),
dann ALTER TABLE ADD CONSTRAINT/CREATE INDEX/CREATE VIEW gegen den
vollstaendigen Tabellennamen-Index aufgeloest, abschliessend Relationship-
Inferenz (Identifying/Weak-Entity bei FK-in-PK, Kardinalitaet aus Nullable/
Unique/Composite-PK). Relationship-Konvention (source=Parent, target=Kind)
verifiziert gegen UmlToErmTransformer.kt fuer Konsistenz mit dem bestehenden
UML->ERM-Pfad. Dollar-Quote-/String-/Kommentar-bewusster Fallback-Splitter
faengt PL/pgSQL-Bloecke (CREATE FUNCTION/DO
Grammatik nicht unterstuetzt, ohne die gesamte Datei zu verwerfen; eigener
Daemon-Thread-Executor umgeht einen Thread-Leak in JSqlParserUtils
Convenience-Overloads bei Parse-Fehlern.
CLI: kuml reverse <file|dir> --format sql [--dialect postgres] via neuem
ErmModelDslPrinter (rendert Entities/Attribute/Relationships/Views/Indizes
als ermModel-DSL, analog ErmScriptRenderer). --list-engines zeigt SQL-Engines
zusaetzlich. Neuer Exit-Code REVERSE_SQL_PARSE_FAILED (17).
Abweichung von der urspruenglichen Aufgabenbeschreibung: JSqlParser liegt auf
Maven Central unter der Koordinate com.github.jsqlparser:jsqlparser (verifiziert
gegen repo1.maven.org) statt des historischen, seit 2012 verwaisten
net.sf.jsqlparser:jsqlparser:0.8.0.
Tests: 59 Unit-Tests in kuml-codegen-reverse-sql (Typ-Mapping, Constraint-
Parsing, Relationship-Inferenz, Identifier-Folding, Statement-Collector-
Fallback, ServiceLoader-Registry) + 11 CLI-Smoke-Tests in kuml-cli. Alle
betroffenen Module (reverse-api, reverse-sql, cli) gruen inkl. ktlint,
distTar und runtimeZip verifiziert.
Co-Authored-By: Claude Sonnet 5 noreply@anthropic.com- KUML ERM-Vault-Beispiel - E-Commerce-Schema + MCP Example-Catalog-Wiring
Fuegt das Vault-Beispiel "39 ERM Martin - E-Commerce Schema" (neutrale
E-Commerce-Domaene: FKs, Selbstreferenz, schwache/identifizierende
Entitaet, Multi-FK-Fan-out, Views/Indexe/Checks) als Test-Resource fuer
kuml-vault-examples-tests hinzu, kuratiert es im ExampleCatalog als
sechste Example-Catalog-Sprache (erm/martin) und erweitert den
Vault-Examples-Tests-Runtime-Classpath um kuml-metamodel-erm, damit der
Script-Host ermModel(...) aufloesen kann. Aktualisiert die zwei
hartkodierten Fuenf-Sprachen-Assertions in ExampleCatalogTest und
ExamplesToolTest auf die neue Sechs-Sprachen-Liste.