data-modelling-sdk 2.0.9

Shared SDK for model operations across platforms (API, WASM, Native)
Documentation
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
# Changelog

All notable changes to this project will be documented in this file.

The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [2.0.9] - 2026-01-28

### Fixed

- **fix(export)**: Stable YAML key ordering for all exporters
  - Replaced manual `serde_yaml::Mapping` construction with struct-based serialization
  - ODCS, ODPS, and CADS exporters now produce consistent key ordering matching struct field definitions
  - Eliminates git diff noise from alphabetical key sorting (BTreeMap behavior)
  - Re-exporting the same data produces identical YAML output

### Changed

- **refactor(odcs)**: Simplified `ODCSExporter::export_table()` to use `ODCSContract::from_table()` converter
  - Removed ~1500 lines of manual Mapping construction code
  - All exports now use the same struct-based serialization path

- **refactor(odps)**: Migrated to struct-based serialization
  - Added `#[serde(rename_all = "camelCase")]` to all ODPS structs
  - Added `skip_serializing_if` for optional fields to produce clean YAML
  - Removed ~764 lines of manual Mapping construction

- **refactor(cads)**: Migrated to struct-based serialization
  - Added `skip_serializing_if` for optional fields
  - Removed ~771 lines of manual Mapping construction

### Added

- **feat(odcs)**: Enhanced Column to Property converter
  - `map_data_type_to_logical_type()` function for SQL to ODCS type mapping
  - `parse_struct_fields_from_data_type()` for expanding STRUCT type definitions
  - Proper handling of ARRAY<STRUCT<...>> nested types

- **feat(pdf)**: Comprehensive column details in PDF/Markdown export
  - Added logical type options (min/max length, pattern, format, precision, scale)
  - Added transformation metadata (source objects, logic, description)
  - Added relationships and authoritative definitions
  - Added column-level quality rules and tags
  - Added composite/secondary key information
  - Added partition key position and additional constraints

- **feat(workspace)**: Added `description` field to Workspace struct (GitHub #66)
  - Optional description field for workspace metadata
  - Displayed in UI and README generation

## [2.0.8] - 2026-01-14

### Fixed

- **chore**: Fix code formatting (cargo fmt)

## [2.0.7] - 2026-01-14

### Fixed

- **fix(odcl)**: Import model-level quality rules from ODCL Data Contract format (#64)
  - Fixed bug where `models.<name>.quality` rules were not being captured during ODCL import
  - Quality rules are now extracted from both root level and model level in Data Contract Specification format
  - Ensures all quality rules defined at the model level are preserved when converting ODCL to ODCS

### Added

- **test(odcl)**: Comprehensive E2E tests for ODCL import
  - 13 new tests verifying ODCL to ODCS conversion preserves all fields
  - Tests based on official datacontract-specification examples
  - Coverage for: model-level quality, field-level quality, metadata, servicelevels, terms, servers, tags, column descriptions, $ref resolution, and roundtrip export

## [2.0.6] - 2026-01-14

### Fixed

- **ci**: Increase crates.io indexing wait time to 60s to fix publish failures

## [2.0.5] - 2026-01-13

### Fixed

- **fix(odcs)**: Preserve customProperties at schema and column levels (#60)
  - Added schema-level `customProperties` extraction in `parse_odcl_v3_all()`
  - Updated `table_to_table_data()` to merge contract-level and schema-level customProperties
  - Custom properties are now preserved at all three ODCS levels: contract, schema, and column

### Added

- **test(odcs)**: Comprehensive E2E round-trip tests for ODCS v3.1.0
  - 51 tests covering all ODCS v3.1.0 specification fields
  - Tests for contract-level, schema-level, and property-level fields
  - Round-trip preservation tests via `import_contract`/`export_contract` v2 API
  - Builder API tests for programmatic contract construction

## [2.0.4] - 2026-01-13

### Added

- **feat(odcs)**: Native ODCS data structures for lossless round-trip
  - New `ODCSContract` struct representing full ODCS v3.1.0 contracts
  - New `SchemaObject` struct for schema-level metadata (physicalName, businessName, etc.)
  - New `Property` struct with nested support (`properties` for OBJECT, `items` for ARRAY)
  - Supporting types: `QualityRule`, `CustomProperty`, `AuthoritativeDefinition`, `Team`, `Server`, etc.
  - Converters: `From` trait implementations for Table/Column interop
  - `ODCSContract::to_tables()` and `ODCSContract::from_tables()` for backwards compatibility
  - `ODCSContract::to_table_data()` for UI rendering

- **feat(import)**: New `import_contract()` method for native ODCS parsing
  - Returns `ODCSContract` instead of flattened `Table`/`Column` types
  - Preserves all contract-level, schema-level, and property-level metadata
  - Supports nested properties (OBJECT/ARRAY) hierarchically
  - Multi-table contracts fully supported

- **feat(export)**: New `export_contract()` method for native ODCS serialization
  - Directly serializes `ODCSContract` to YAML (no reconstruction needed)
  - Zero data loss on round-trip
  - `export_contract_validated()` variant with optional schema validation

- **feat(wasm)**: V2 WASM bindings for native ODCS API
  - `parse_odcs_yaml_v2()` - Returns `ODCSContract` JSON
  - `export_odcs_yaml_v2()` - Takes `ODCSContract` JSON, returns YAML
  - `odcs_contract_to_tables()` - Convert contract to Table array
  - `tables_to_odcs_contract()` - Convert Table array to contract
  - `odcs_contract_to_table_data()` - Convert contract to TableData for UI

## [2.0.3] - 2026-01-12

### Fixed

- **fix(odcs)**: Full round-trip support for all column metadata fields
  - **Export**: Nested STRUCT/ARRAY columns now export all metadata fields matching top-level columns
  - **Import**: Parse all ODCS v3.1.0 column metadata fields during import
  - Fields supported: `businessName`, `physicalName`, `logicalTypeOptions`
  - Fields supported: `unique`, `primaryKey`, `primaryKeyPosition`
  - Fields supported: `partitioned`, `partitionKeyPosition`, `clustered`
  - Fields supported: `classification`, `criticalDataElement`, `encryptedName`
  - Fields supported: `transformSourceObjects`, `transformLogic`, `transformDescription`
  - Fields supported: `examples`, `authoritativeDefinitions`, `tags`, `customProperties`, `businessKey`
  - Fixes data loss for column metadata on round-trip import/export

## [2.0.2] - 2026-01-12

### Fixed

- **fix(odcs)**: Export all column-level metadata fields to ODCS YAML
  - Added export for: `businessName`, `physicalName`, `logicalTypeOptions`
  - Added export for: `primaryKeyPosition`, `partitionKeyPosition`, `unique`, `partitioned`
  - Added export for: `classification`, `criticalDataElement`, `encryptedName`
  - Added export for: `transformSourceObjects`, `transformLogic`, `transformDescription`
  - Added export for: `examples`, `authoritativeDefinitions`, `tags`
  - Added export for: `customProperties` (fixes data loss on round-trip)

## [2.0.1] - 2026-01-12

### Fixed

- **fix(ci)**: Restructure CI/CD workflows for proper publish order
  - Add `version-check.yml` as reusable workflow for version consistency
  - Add `release-sdk.yml` for crates.io publishing (core before sdk)
  - Update `release-cli.yml` to upload artifacts to GitHub release
  - Update `release-wasm.yml` to only run manually or when called
  - Update `publish.yml` as orchestrating wrapper
  - Fix crates.io publish error by publishing dependencies in order
  - Fix `pkg/package.json` not found error (generated during WASM build)
  - Support dev releases with prerelease flag

## [2.0.0] - 2026-01-11

### Fixed

- **fix(pdf)**: Long URLs and field names now wrap correctly in PDF tables (#50)
  - Text that exceeds column width is now broken with hyphen continuation markers
  - Prevents text from overlapping into adjacent columns
  - Works for URLs, long field names, and any text without natural break points

### Added

- **feat(staging)**: Real-time progress reporting for ingestion operations
  - `IngestProgress` with multi-bar display (files, records, bytes throughput)
  - `InferenceProgress` for schema inference operations
  - `Spinner` for indeterminate operations
  - `format_bytes()` and `format_number()` helper functions
  - Uses `indicatif` crate for terminal progress bars

- **feat(s3)**: AWS S3 ingestion support (feature: `s3`)
  - `S3Source` configuration with bucket, prefix, region, profile, endpoint
  - `S3Ingester` with streaming file discovery and download
  - Async file listing with pagination support
  - Memory-efficient streaming downloads
  - Integration with staging pipeline

- **feat(databricks)**: Databricks Unity Catalog Volumes ingestion (feature: `databricks`)
  - `UnityVolumeSource` configuration with host, token, catalog, schema, volume
  - `UnityVolumeIngester` using Databricks Files REST API
  - Secure token handling with `SecureCredentials` wrapper
  - File discovery and download from Unity Catalog Volumes

- **feat(security)**: Secure credential handling
  - `SecureCredentials` wrapper type preventing accidental Display/Debug logging
  - `redact_secret()` function showing only first N characters
  - `redact_secrets_in_string()` with regex-based detection for:
    - AWS access keys (AKIA...)
    - AWS secret keys
    - Bearer tokens
    - URL-embedded passwords
  - All credential types implement safe Display trait

- **feat(tests)**: Comprehensive integration and performance tests
  - 10 integration tests covering full staging pipeline
  - Performance benchmarks for 10K, 100K, and 1M records
  - Criterion benchmarks for staging operations

- **feat(pipeline)**: Full data pipeline orchestration (Phase 6)
  - `PipelineExecutor` for running multi-stage data pipelines
  - `PipelineConfig` with comprehensive configuration options
  - `PipelineStage` enum: Ingest, Infer, Refine, Map, Export
  - Checkpointing and resume support with `Checkpoint` struct
  - Dry-run mode for validation without execution
  - Stage timing and success/failure tracking
  - CLI command: `odm pipeline run` with 15+ options
  - CLI command: `odm pipeline status` for pipeline monitoring
  - 20 unit tests for pipeline functionality

- **feat(mapping)**: Schema-to-schema mapping with transformation generation (Phase 5)
  - `SchemaMatcher` with multiple matching algorithms
  - Match methods: Exact, CaseInsensitive, Fuzzy (Levenshtein), Semantic, LLM
  - `SchemaMapping` result with direct mappings, transformations, gaps, extras
  - Compatibility scoring (0.0-1.0)
  - `TransformType` variants: TypeCast, Rename, Merge, Split, FormatChange, Custom, Extract, Default
  - Transformation script generation: SQL, JQ, Python, PySpark
  - CLI command: `odm map` with fuzzy matching and transform output
  - 29 unit tests for mapping functionality

- **feat(llm-matcher)**: LLM-enhanced schema matching
  - `LlmSchemaMatcher` combining algorithmic and LLM matching
  - Retry logic with exponential backoff for LLM failures
  - Batching for large schemas exceeding prompt limits
  - Transform hint parsing to create `TransformMapping`s
  - Example value inclusion in prompts for better matching
  - Feature-gated under `llm` feature
  - 12 unit tests for LLM matching

- **feat(iceberg)**: Apache Iceberg integration for data lakehouse staging (Phase 3)
  - New `iceberg` feature flag for optional Iceberg support
  - Added `arrow = "55"` and `parquet = "55"` dependencies for data writing
  - Catalog abstraction supporting REST (Lakekeeper/Nessie/Polaris), S3 Tables, Unity Catalog, and Glue
  - `CatalogConfig` enum with serializable configuration for all catalog types
  - `IcebergCatalog` wrapper with async operations for namespace and table management
  - `IcebergTable` for raw JSON staging with time travel support
    - `append_records()` method converts JSON records to Arrow RecordBatch and writes Parquet files
    - `write_parquet_file()` helper with SNAPPY compression
  - `ingest_to_iceberg()` function for batch ingestion from local files to Iceberg tables
  - `to_raw_json_records()` conversion function for file-to-record transformation
  - Export module (`staging/export.rs`) with:
    - `ExportTarget` enum (Unity, Glue, S3Tables, Local)
    - `ExportConfig` and `ExportResult` structs
    - `export_to_catalog()` function with local filesystem export support
  - Snapshot listing and time travel queries by version or timestamp
  - Batch metadata storage in Iceberg table properties
  - New CLI commands:
    - `odm staging init --catalog <type>` - Initialize with Iceberg catalog (rest, s3-tables, unity, glue)
    - `odm staging history` - Show table version history
    - `odm staging query --version N` - Time travel queries by snapshot version
    - `odm staging query --timestamp <ISO8601>` - Time travel queries by timestamp
    - `odm staging export --target <unity|glue|s3-tables>` - Export to production catalogs
    - `odm staging view create` - Create typed views from inferred schemas

### Changed

- **refactor(workspace)**: Restructured monolithic crate into Cargo workspace with three sub-crates
  - `data-modelling-core` - Core SDK library with all business logic
  - `odm` - CLI binary (renamed from `data-modelling-cli`)
  - `data-modelling-wasm` - WASM bindings for browser applications
  - Root `data-modelling-sdk` crate remains for backward compatibility via re-exports
  - Uses Cargo workspace with `resolver = "2"` for proper feature unification
  - Added `wasm` feature to core crate for browser storage backend dependencies
  - Updated all CI/CD workflows for workspace structure

## [1.14.3] - 2026-01-11

### Added

- **feat(serde)**: Dual-case JSON field name support for WASM deserialization
  - All struct fields with `#[serde(rename_all = "camelCase")]` now accept both camelCase and snake_case during deserialization
  - Added `#[serde(alias = "snake_case")]` attributes to all multi-word field names
  - Serialization output remains camelCase for consistency
  - Updated structs: `Relationship`, `ForeignKeyDetails`, `ETLJobMetadata`, `VisualMetadata`, `Column`, `ForeignKey`, `PropertyRelationship`, `LogicalTypeOptions`, `AuthoritativeDefinition`, `Workspace`, `AssetReference`, `DomainReference`, `SystemReference`, `Table`, `SlaProperty`, `ContactDetails`, `CADSAsset`, `CADSDescription`, `CADSPricing`, `CADSRisk`, `CADSValidationProfile`, `CADSValidationProfileAppliesTo`, `KnowledgeArticle`, `KnowledgeIndex`, `KnowledgeIndexEntry`, `RelatedArticle`, `Decision`, `DecisionIndex`, `AssetLink`, `ComplianceAssessment`
  - Enables UI flexibility when passing JSON with either naming convention

## [1.14.3] - 2026-01-11

### Added

- **feat(serde)**: Dual-case JSON field name support for WASM deserialization
  - All struct fields with `#[serde(rename_all = "camelCase")]` now accept both camelCase and snake_case during deserialization
  - Added `#[serde(alias = "snake_case")]` attributes to all multi-word field names
  - Serialization output remains camelCase for consistency
  - Updated structs: `Relationship`, `ForeignKeyDetails`, `ETLJobMetadata`, `VisualMetadata`, `Column`, `ForeignKey`, `PropertyRelationship`, `LogicalTypeOptions`, `AuthoritativeDefinition`, `Workspace`, `AssetReference`, `DomainReference`, `SystemReference`, `Table`, `SlaProperty`, `ContactDetails`, `CADSAsset`, `CADSDescription`, `CADSPricing`, `CADSRisk`, `CADSValidationProfile`, `CADSValidationProfileAppliesTo`, `KnowledgeArticle`, `KnowledgeIndex`, `KnowledgeIndexEntry`, `RelatedArticle`, `Decision`, `DecisionIndex`, `AssetLink`, `ComplianceAssessment`
  - Enables UI flexibility when passing JSON with either naming convention

## [1.14.2] - 2026-01-11

### Added

- **feat(wasm)**: Native YAML format PDF/Markdown export bindings for all document types
  - `export_odcs_yaml_to_pdf` - Export ODCS YAML content directly to PDF
  - `export_odcs_yaml_to_markdown` - Export ODCS YAML content directly to Markdown
  - `export_odps_yaml_to_pdf` - Export ODPS YAML content directly to PDF
  - `export_odps_yaml_to_markdown` - Export ODPS YAML content directly to Markdown
  - `export_cads_yaml_to_pdf` - Export CADS YAML content directly to PDF
  - `export_cads_yaml_to_markdown` - Export CADS YAML content directly to Markdown
  - `export_decision_yaml_to_pdf` - Export Decision (ADR) YAML content directly to PDF
  - `export_decision_yaml_to_markdown` - Export Decision (ADR) YAML content directly to Markdown
  - `export_knowledge_yaml_to_pdf` - Export Knowledge Base YAML content directly to PDF
  - `export_knowledge_yaml_to_markdown` - Export Knowledge Base YAML content directly to Markdown
  - These functions accept raw YAML content (as stored in .odcs.yaml, .odps.yaml, .cads.yaml, .madr.yaml, .kb.yaml files)
  - Enables direct export from UI without requiring conversion to internal SDK structs

- **feat(models)**: Added `Table::from_table_data` for converting import data to Table model

## [1.14.1] - 2026-01-11

### Added

- **feat(wasm)**: ODCS/ODPS/CADS PDF and Markdown export bindings
  - `export_table_to_pdf` - Export ODCS Data Contract to PDF with optional branding
  - `export_odps_to_pdf` - Export ODPS Data Product to PDF with optional branding
  - `export_cads_to_pdf` - Export CADS Asset to PDF with optional branding
  - `export_table_to_markdown` - Export ODCS Data Contract to Markdown
  - `export_odps_to_markdown` - Export ODPS Data Product to Markdown
  - `export_cads_to_markdown` - Export CADS Asset to Markdown

- **feat(models)**: Added `Table::from_table_data` for converting import data to Table model

- **feat(cli)**: Extended PDF and Markdown export to support all contract types
  - `data-modelling-cli export pdf` now supports .odcs.yaml, .odps.yaml, .cads.yaml files
  - `data-modelling-cli export markdown` now supports .odcs.yaml, .odps.yaml, .cads.yaml files
  - Auto-detection of document type based on content

### Fixed

- **fix(npm)**: Corrected npm organization name to `@offenedatenmodellierung`
  - Fixed package name in release-cli.yml and release-wasm.yml workflows

## [1.14.0] - 2026-01-11

### Added

- **feat(relationship)**: Crow's feet notation cardinality support for ERD-style relationships
  - New `EndpointCardinality` enum with values: `zeroOrOne` (0..1), `exactlyOne` (1..1), `zeroOrMany` (0..*), `oneOrMany` (1..*)
  - New `sourceCardinality` and `targetCardinality` fields on `Relationship` struct
  - Enables precise endpoint cardinality modeling for data flow diagrams

- **feat(relationship)**: Data flow direction support
  - New `FlowDirection` enum with values: `sourceToTarget`, `targetToSource`, `bidirectional`
  - New `flowDirection` field on `Relationship` struct
  - Enables directional data flow modeling in relationship diagrams

- **feat(workspace)**: Extended workspace schema with full relationship metadata
  - Added `ForeignKeyDetails`, `ETLJobMetadata`, `SlaProperty`, `ContactDetails`, `VisualMetadata`, `ConnectionPoint` definitions
  - All relationship fields now available in workspace-schema.json

### Changed

- **refactor(serialization)**: Consistent camelCase serialization across all models
  - All structs now use `#[serde(rename_all = "camelCase")]` for JSON/YAML serialization
  - Updated: `Workspace`, `DomainReference`, `SystemReference`, `AssetReference`, `Relationship`, `ForeignKeyDetails`, `ETLJobMetadata`, `VisualMetadata`
  - Updated: `Cardinality`, `RelationshipType` enums now serialize as camelCase
  - Updated: `Decision`, `DecisionIndex`, `KnowledgeArticle`, `KnowledgeIndex` structs
  - Updated: `CADSAsset` and all nested CADS structs
  - Aligns with ODCS format conventions for consistent API responses

- **refactor(enums)**: Updated enum serialization to camelCase
  - `Cardinality`: `oneToOne`, `oneToMany`, `manyToOne`, `manyToMany`
  - `RelationshipType`: `dataFlow`, `dependency`, `foreignKey`, `etl`
  - `EndpointCardinality`: `zeroOrOne`, `exactlyOne`, `zeroOrMany`, `oneOrMany`
  - `FlowDirection`: `sourceToTarget`, `targetToSource`, `bidirectional`

- **refactor(schema)**: Updated workspace-schema.json to camelCase field names
  - All property names now use camelCase (e.g., `sourceTableId`, `targetTableId`, `createdAt`)
  - Relationship definition includes new cardinality and flow direction fields
  - Example updated to demonstrate crow's feet notation usage

### Fixed

- **fix(export)**: Added missing `CADSKind::DataPipeline` and `CADSKind::ETLProcess` match arms in CADS exporter
- **fix(export)**: Added missing `CADSDMNFormat::Json` match arm in CADS exporter

## [1.13.6] - 2026-01-08

### Added

- **feat(workspace)**: Add `view_positions` to DomainReference for per-view canvas node positioning (#37)
  - Supports view types: `operational`, `analytical`, `process`, `systems`
  - Each node (table, system, asset) stores x/y coordinates specific to its view context
  - Matches existing `DomainConfig.view_positions` structure for consistency

- **feat(relationship)**: Add `source_handle` and `target_handle` for edge connection points (#37)
  - New `ConnectionHandle` enum with 12 positions around node perimeter
  - Positions: `top-left`, `top-center`, `top-right`, `right-top`, `right-center`, `right-bottom`, `bottom-right`, `bottom-center`, `bottom-left`, `left-bottom`, `left-center`, `left-top`
  - Enables precise control over edge attachment points to prevent overlapping lines

## [1.13.5] - 2026-01-08

### Added

- **feat(import)**: Preserve all ODCS v3.1.0 contract-level fields during import (#35)
  - `TableData` struct now includes: `id`, `apiVersion`, `version`, `status`, `kind`, `domain`, `dataProduct`, `tenant`, `description`, `servers`, `team`, `support`, `roles`, `slaProperties`, `quality`, `price`, `tags`, `customProperties`, `authoritativeDefinitions`, `contractCreatedTs`, `odcsMetadata`
  - ODCS and ODCL importers extract all fields from source YAML
  - Other importers (Avro, JSON Schema, Protobuf, SQL) use defaults for ODCS-specific fields

- **feat(workspace)**: Add `table_ids` and `asset_ids` to SystemReference (#34)
  - Optional UUID arrays for explicit table-to-system and asset-to-system mapping
  - Enables direct relationships without relying on `customProperties.system_id`
  - Updated workspace JSON schema and Rust types

### Fixed

- **fix(import)**: ODCS `id` field now correctly preserved in import results (#35)
  - Previously the contract UUID was extracted but lost during `TableData` construction
  - Tables now retain their source UUIDs for proper system linkage

## [1.13.4] - 2026-01-08

### Added

- **feat(sql)**: Databricks SQL `USING` clause support for table format specifications
  - `USING DELTA` - Delta Lake tables
  - `USING PARQUET` - Parquet format tables
  - `USING CSV`, `USING JSON`, `USING ORC`, `USING AVRO` - Other formats
  - `USING ICEBERG` - Apache Iceberg tables
  - These clauses are now stripped during preprocessing, allowing table imports to succeed

### Fixed

- **fix(sql)**: Databricks SQL imports now correctly handle:
  - `CREATE TABLE ... USING DELTA` statements
  - `CREATE VIEW` statements (already supported, now tested)
  - `CREATE MATERIALIZED VIEW` statements (already supported, now tested)
  - Combined clauses like `USING DELTA TBLPROPERTIES (...)`

## [1.13.3] - 2026-01-08

### Fixed

- **fix(wasm)**: Rebuild WASM package to include v1.13.2 Decision Log and Knowledge Base bindings
  - NPM package was stuck at v1.13.1 and missing all DDL/KB WASM exports
  - Rebuilt with `wasm-pack build --target web --out-dir pkg --features wasm,openapi,odps-validation`
  - All 83 WASM functions now properly exported in the NPM package

## [1.13.2] - 2026-01-07

### Added

- **feat(wasm)**: Decision Log (DDL) WASM bindings for browser support
  - `parse_decision_yaml()` - Parse decision YAML files (.madr.yaml)
  - `parse_decision_index_yaml()` - Parse decisions index file (decisions.yaml)
  - `export_decision_to_yaml()` - Export decision to YAML format
  - `export_decision_index_to_yaml()` - Export decision index to YAML format
  - `export_decision_to_markdown()` - Export decision to MADR Markdown format
  - `create_decision()` - Create new decision with required fields
  - `create_decision_index()` - Create empty decision index
  - `add_decision_to_index()` - Add decision to index

- **feat(wasm)**: Knowledge Base (KB) WASM bindings for browser support
  - `parse_knowledge_yaml()` - Parse knowledge article YAML files (.kb.yaml)
  - `parse_knowledge_index_yaml()` - Parse knowledge index file (knowledge.yaml)
  - `export_knowledge_to_yaml()` - Export article to YAML format
  - `export_knowledge_index_to_yaml()` - Export knowledge index to YAML format
  - `export_knowledge_to_markdown()` - Export article to Markdown format
  - `create_knowledge_article()` - Create new knowledge article
  - `create_knowledge_index()` - Create empty knowledge index
  - `add_article_to_knowledge_index()` - Add article to index
  - `search_knowledge_articles()` - Search articles by title, summary, content, or tags

### Changed

- WASM package now exports 83 functions (up from 66 in v1.13.1)

## [1.13.1] - 2026-01-07

### Fixed

- **fix(validation)**: Move schema validation from CLI module to core validation module
  - Schema validation functions are now in `validation::schema` instead of `cli::validation`
  - Fixes WASM build failure when `cli` feature is not enabled but `schema-validation` is
  - Validation functions are now available to all SDK consumers (WASM, native, API)
  - Removed duplicate inline validation code from import/export modules
  - Removed redundant `cli/validation.rs` wrapper module

## [1.13.0] - 2026-01-07

### Added

- **feat(ddl)**: Architecture Decision Records (DDL) with MADR format support
  - `Decision` model with full MADR (Markdown Any Decision Records) field support
  - Decision lifecycle: draft, proposed, accepted, deprecated, superseded, rejected
  - Decision categories: architecture, technology, process, security, data, integration
  - `DecisionIndex` for tracking decision metadata and numbering
  - `DecisionImporter` for parsing decision YAML files
  - `DecisionExporter` for exporting decisions to Markdown format
  - Storage integration: `load_decisions()`, `save_decision()`, `export_decision_markdown()`
  - Database schema with `decisions` table and comprehensive indexes
  - CLI commands: `decision new`, `decision list`, `decision show`, `decision status`, `decision export`

- **feat(kb)**: Knowledge Base (KB) for domain documentation
  - `KnowledgeArticle` model for storing guides, references, tutorials, and runbooks
  - Article types: guide, reference, concept, tutorial, troubleshooting, runbook
  - Article lifecycle: draft, review, published, archived, deprecated
  - `KnowledgeIndex` for tracking article metadata and numbering
  - `KnowledgeImporter` for parsing knowledge YAML files
  - `KnowledgeExporter` for exporting articles to Markdown format
  - Storage integration: `load_knowledge()`, `save_knowledge()`, `export_knowledge_markdown()`
  - Database schema with `knowledge_articles` table and comprehensive indexes
  - CLI commands: `knowledge new`, `knowledge list`, `knowledge show`, `knowledge search`, `knowledge status`, `knowledge export`

- **feat(database)**: Extended database schema for DDL/KB (schema version 2)
  - `decisions` table with all MADR fields: number, title, status, category, date, deciders, context, drivers, options, decision, consequences, linked_assets, supersedes, superseded_by, compliance, rationale, additional_context
  - `knowledge_articles` table with all KB fields: number, title, article_type, status, summary, content, author, author_email, reviewers, linked_assets, linked_decisions, related_articles, skill_level, estimated_reading_time, review_frequency
  - Indexes for workspace, domain, status, category, type, author, and number queries
  - SQL modules: `decision_sql` and `knowledge_sql` with UPSERT, SELECT, DELETE, COUNT operations

- **feat(sync)**: Extended sync engine for DDL/KB
  - `sync_decisions()` and `sync_knowledge()` methods in DatabaseBackend trait
  - `export_decisions()` and `export_knowledge()` methods for database export
  - `sync_workspace_full()` now includes decisions and knowledge articles
  - `export_workspace_full()` returns complete workspace including DDL/KB content
  - Extended `SyncResult` with `decisions_synced` and `knowledge_synced` counts
  - Extended `SyncStatus` with `decision_count` and `knowledge_count`

### Documentation

- Updated README.md with Decision Records and Knowledge Base sections
- Updated CLI.md with `decision` and `knowledge` command documentation
- Updated LLM.txt with DDL/KB modules and architecture

## [1.12.0] - 2026-01-07

### Added

- **feat(workspace)**: Relationships now embedded in workspace.yaml
  - Added `relationships` field to Workspace struct
  - Added Relationship definition to workspace-schema.json
  - WASM bindings for relationship operations: `add_relationship_to_workspace()`, `remove_relationship_from_workspace()`, `get_workspace_relationships_for_source()`, `get_workspace_relationships_for_target()`
  - Relationships.yaml file is no longer required (merged into workspace schema)

- **feat(models)**: Added `color` field to Relationship model
  - Supports hex color codes (#RRGGBB, #RGB) or named colors
  - Used for relationship line colors in the UI
  - Pattern validation in workspace-schema.json

- **feat(database)**: Database schema updated with new relationship fields
  - Added `drawio_edge_id` column to relationships table for diagram integration
  - Added `color` column to relationships table for UI display
  - Updated DuckDB backend `sync_relationships` with new fields
  - Updated PostgreSQL backend `sync_relationships` with new fields

- **feat(schemas)**: Added workspace-schema.json
  - Complete JSON Schema for workspace.yaml validation
  - Includes Relationship definition with all fields

### Changed

- **refactor(storage)**: Flat file naming convention
  - Files now use format: `{workspace}_{domain}_{system}_{resource}.{type}.yaml`
  - Removed legacy domain-based directory structure
  - Updated README.md and ARCHITECTURE.md documentation

- **refactor(schemas)**: Removed domain-schema.json
  - Domain functionality now merged into workspace schema
  - Added dmnModels section to CADS schema
  - Added openApiSpecs section to CADS schema

### Documentation

- Updated LLM.txt with flat file structure and workspace relationships
- Updated README.md with new file naming convention
- Updated docs/ARCHITECTURE.md with flat structure documentation
- Updated schemas/README.md with workspace-schema.json

## [1.11.0] - 2026-01-07

### Added

- **feat(models)**: Complete ODCS v3.1.0 property field support in Column model
  - Added 25+ new fields: `id`, `businessName`, `physicalName`, `logicalTypeOptions`, `primaryKeyPosition`, `unique`, `partitioned`, `partitionKeyPosition`, `clustered`, `classification`, `criticalDataElement`, `encryptedName`, `transformSourceObjects`, `transformLogic`, `transformDescription`, `examples`, `defaultValue`, `authoritativeDefinitions`, `tags`, `customProperties`
  - Ensures zero data loss during import/export round-trips

- **feat(import)**: ColumnData struct now mirrors Column exactly
  - All ODCS v3.1.0 property fields preserved through WASM layer
  - Added `column_to_column_data()` helper for consistent Column→ColumnData conversion
  - Updated `column_data_to_column()` to preserve all fields during reconstruction

- **feat(models)**: Added new supporting types
  - `LogicalTypeOptions`: minLength, maxLength, pattern, format, minimum, maximum, precision, scale
  - `AuthoritativeDefinition`: type and URL for authoritative definition references
  - Both types exported from models module for external use

### Changed

- **refactor(import)**: All importers now use `..Default::default()` pattern for Column/ColumnData construction
  - Simplifies code and ensures new fields automatically get sensible defaults
  - Applied across: avro.rs, json_schema.rs, protobuf.rs, odcs.rs, odcl.rs, odcs_shared.rs, sql.rs

## [1.10.0] - 2026-01-06

### Added

- **feat(cli)**: Added `validate` command for standalone schema validation
  - Validates files against their respective schemas without importing
  - Supports formats: ODCS, ODCL, ODPS, CADS, OpenAPI, Protobuf, Avro, JSON Schema, SQL
  - Usage: `data-modelling-cli validate <format> [file]`
  - Accepts stdin with `-` as input

- **feat(import)**: Fixed protobuf JAR import to properly create parent columns for nested messages
  - Nested messages now create parent column with `OBJECT` or `ARRAY<OBJECT>` type
  - Repeated message fields use `.[]` notation for nested properties
  - ODCS export now correctly includes nested column structure

### Changed

- **refactor(validation)**: ODPS and OpenAPI validation now only require `schema-validation` feature
  - Removed separate `odps-validation` and `openapi` feature requirements for validation
  - Simplifies feature configuration for validation-only use cases

## [1.9.0] - 2025-01-06

### Added

- **feat(import)**: Added support for Google protobuf well-known wrapper types in JAR imports
  - `google.protobuf.StringValue` → `STRING`
  - `google.protobuf.Int32Value` → `INTEGER`
  - `google.protobuf.Int64Value` → `BIGINT`
  - `google.protobuf.DoubleValue` → `DOUBLE`
  - `google.protobuf.FloatValue` → `FLOAT`
  - `google.protobuf.BoolValue` → `BOOLEAN`
  - `google.protobuf.Timestamp` → `TIMESTAMP`
  - Wrapper types are correctly marked as nullable

- **feat(import)**: Added nested message extraction for protobuf JAR imports
  - Now extracts nested messages (e.g., `Bet.Cashout`, `Leg.EachWay`)
  - Supports deeply nested message hierarchies
  - Enums are now recognized and mapped to `STRING` type

- **feat(import)**: Consistent STRUCT flattening across all import types
  - All WASM import functions now return consistent flattened format
  - `STRUCT<...>` types flatten to `parent.field` notation
  - `ARRAY<STRUCT<...>>` types flatten to `parent.[].field` notation
  - Applied to: SQL, ODCS, ODCL, Avro, JSON Schema, Protobuf imports

### Fixed

- **fix(import)**: Fixed protobuf JAR parser incorrectly parsing multi-line comments as fields
  - Added proper tracking for `/* ... */` and `/** ... */` block comments
  - Added validation that field names must be valid identifiers
  - Added check that proto field lines must contain `=` for field number

- **fix(import)**: Fixed WASM SQL import not flattening STRUCT columns
  - WASM `import_from_sql` now returns nested columns with dot notation
  - Matches CLI behavior for consistent UI rendering

## [1.8.6] - 2025-01-06

### Fixed

- Fixed macOS code signing by ensuring MACOS_SIGNING_IDENTITY secret is properly configured

## [1.8.5] - 2025-01-06

### Added

- **feat(cli)**: Improved protobuf JAR import with dependency graph analysis
  - Made `INPUT` argument optional when `--jar` is provided
  - Added `--root-message` flag to specify root message for JAR imports
  - Implemented dependency graph analysis to auto-detect root message
  - Flattens all referenced messages into single unified schema with dot notation
  - Outputs single combined ODCS file instead of multiple files
  - Root message detection: prefers messages with no incoming refs and most outgoing refs
  - Pretty mode shows JAR analysis with message list and dependencies

- **feat(ci)**: Added optional macOS code signing and notarization to release workflow
  - Signing is skipped gracefully if secrets are not configured
  - Supports Developer ID Application certificates
  - Supports Apple notarization for Gatekeeper approval

## [1.8.4] - 2025-01-06

### Fixed

- Fixed workflow_call version detection using environment variables
- Fixed dev suffix only applying to release/* branches, not main

## [1.8.3] - 2025-01-06

### Changed

- Merged release-cli and release-wasm workflows into a single workflow
- Version is now passed from publish workflow to release workflow
- Removed blocking tag condition from create-release job

## [1.8.2] - 2025-01-05

### Added

- **feat(wasm)**: Workspace and DomainConfig WASM bindings
  - `create_workspace()` - Create a new workspace with owner
  - `parse_workspace_yaml()` - Parse workspace YAML to JSON
  - `export_workspace_to_yaml()` - Export workspace JSON to YAML
  - `add_domain_to_workspace()` - Add a domain reference to workspace
  - `remove_domain_from_workspace()` - Remove a domain reference from workspace
  - `create_domain_config()` - Create a new domain configuration
  - `parse_domain_config_yaml()` - Parse domain config YAML to JSON
  - `export_domain_config_to_yaml()` - Export domain config JSON to YAML
  - `get_domain_config_id()` - Extract domain ID from config
  - `update_domain_view_positions()` - Update view positions in domain config
  - `add_entity_to_domain_config()` - Add entity reference (system, table, product, asset, process, decision)
  - `remove_entity_from_domain_config()` - Remove entity reference from domain config

- **feat(loader)**: Workspace and DomainConfig loading/saving
  - `load_workspace()` / `save_workspace()` - Load/save workspace.yaml files
  - `load_domain_config()` / `save_domain_config()` - Load/save domain.yaml files
  - `load_domain_config_by_name()` - Load domain config by name within a workspace
  - `get_domain_id()` - Extract domain ID from domain.yaml
  - `load_all_domain_configs()` - Load all domain configs in a workspace

### Fixed

- **fix(loader)**: Domain ID extraction from domain.yaml
  - BPMN, DMN, and OpenAPI loaders now extract domain ID from domain.yaml instead of generating random UUIDs
  - Falls back to new UUID if domain.yaml is not found

## [1.8.1] - 2026-01-05

### Fixed

- **fix(wasm)**: Fixed WASM build compatibility issues
  - Upgraded jsonschema from 0.20 to 0.38.1 with `default-features = false` to avoid reqwest dependency in WASM builds
  - Updated validation error handling to use new jsonschema 0.38.1 API (single ValidationError instead of iterator)
  - Configured getrandom 0.3.4 with `wasm_js` feature for proper WASM support
  - Added `.cargo/config.toml` with `getrandom_backend="wasm_js"` configuration
  - WASM builds now work correctly with `wasm,openapi,odps-validation` features

## [1.8.0] - 2026-01-05

### Added

- **feat(odps)**: ODPS schema validation and CLI support
  - ODPS import/export with JSON Schema validation (requires `odps-validation` feature)
  - CLI commands: `import odps` and `export odps` for ODPS YAML files
  - Manual test script (`test-odps`) for round-trip testing with field preservation verification
  - WASM binding: `validateOdps()` function for JavaScript validation
  - Field preservation: All ODPS fields (required and optional) preserved during import/export round-trips
  - Empty array preservation: Empty optional arrays maintained in exported YAML
  - Feature flag support: Validation can be enabled/disabled via `odps-validation` feature flag
  - Enhanced ODPS import display: Shows tags, description, managementPorts, support, and team information

### Fixed

- **fix(cli)**: Fixed pre-commit hook issues
  - Fixed formatting and clippy warnings
  - Added feature declaration for `odps-validation` in Cargo.toml lints section
  - Fixed collapsed if statements and unnecessary unwrap patterns

## [1.7.1] - 2026-01-05

### Fixed

- **fix(ci)**: Fixed GitHub Actions workflow for Windows builds
  - Use PowerShell `Compress-Archive` instead of `zip` command for Windows artifacts
  - Explicitly set `shell: bash` for all bash-based steps to avoid PowerShell parsing errors
  - Added cross-platform checksum generation support

## [1.7.0] - 2026-01-05

### Added

- **feat(cli)**: Full CLI wrapper implementation (`data-modelling-cli`)
  - Comprehensive import/export commands for all supported formats (SQL, AVRO, JSON Schema, Protobuf, OpenAPI, ODCS)
  - Support for importing SQL files with various dialects (PostgreSQL, MySQL, SQLite, Generic, Databricks)
  - Support for `CREATE VIEW` and `CREATE MATERIALIZED VIEW` statements
  - Import from AVRO, JSON Schema, Protobuf, OpenAPI, and ODCS formats
  - Export to ODCS, AVRO, JSON Schema, Protobuf (proto2/proto3), and Protobuf descriptor formats
  - UUID override support for imported tables (`--uuid` flag)
  - Automatic ODCS file generation on import (can be disabled with `--no-odcs`)
  - External reference resolution for JSON Schema and OpenAPI (`$ref`, `import`)
  - Schema validation before import (optional `--validate` flag)
  - Protobuf descriptor export using `protoc` compiler
  - Comprehensive error messages with platform-specific installation guidance
  - GitHub Actions workflow for building and releasing CLI binaries (Linux, macOS, Windows)
  - Full test coverage for all import/export operations

- **feat(protobuf)**: Proto2 and Proto3 format support
  - `--protobuf-version` flag to select proto2 or proto3 (default: proto3)
  - Correct field labeling: proto2 uses `required`/`optional`, proto3 uses optional by default
  - Proper handling of `repeated` fields in both versions
  - Protobuf descriptor export supports both proto2 and proto3

- **feat(cli)**: OpenAPI support enabled by default
  - CLI builds now include OpenAPI feature by default in GitHub releases
  - CI/CD workflows updated to build with `openapi` feature enabled
  - Documentation updated with OpenAPI build instructions

### Changed

- **refactor(cli)**: Export operations now accept `.odcs.yaml` files directly as input
  - Removed requirement for `workspace.json` file
  - Simplified export workflow: `data-modelling-cli export <format> input.odcs.yaml output.<ext>`

### Fixed

- **fix(protobuf)**: Fixed invalid `optional repeated` syntax in proto3 exports
  - `repeated` fields no longer include `optional` keyword (proto3 compliant)
  - Proto2 correctly uses `required` for non-nullable fields

## [1.6.2] - 2026-01-04

### Added

- **feat(json-schema)**: Full JSON Schema validation support
  - Import: Extract all JSON Schema validation keywords (pattern, minimum, maximum, minLength, maxLength, enum, const, multipleOf, minItems, maxItems, uniqueItems, minProperties, maxProperties, allOf, anyOf, oneOf, not)
  - Export: Export validation conditions from Column quality rules and enum_values back to JSON Schema format
  - Added enum_values field to ColumnData structure to preserve enumeration values through import pipeline
  - Validation keywords stored as quality rules with source="json_schema" for proper round-trip preservation
  - Comprehensive integration test for validation conditions round-trip

## [1.6.1] - 2026-01-04

### Fixed

- **fix(sql)**: Fixed Databricks SQL parser issues with COMMENT clauses
  - Fixed multiline COMMENT clause parsing by converting newlines to spaces within quoted strings
  - Fixed escaped quotes in COMMENT clauses (`\'` converted to SQL standard `''`)
  - Added support for `MAP<...>` complex types (extracted and restored like STRUCT/ARRAY)
  - Added preprocessing to remove unsupported table-level `COMMENT` clauses
  - Added preprocessing to remove unsupported `CLUSTER BY AUTO` clauses
  - Improved SQL normalization to preserve quoted strings correctly

### Added

- **feat(sql)**: Added SQL parser test tool (`cargo run --example test_sql`)
  - Command-line tool for manually testing SQL parsing with different dialects
  - Supports reading from file, stdin, or command-line argument
  - Pretty-print option for detailed column information
  - Convenience script (`test_sql.sh`) for quick testing

## [1.6.0] - 2026-01-03

### Added

- **feat(sql)**: Databricks SQL dialect support
  - `DatabricksDialect` implementation for parsing Databricks-specific SQL syntax
  - Support for `IDENTIFIER()` function calls in table/view names with variable references and string concatenation
  - Support for variable references (`:variable_name`) in `STRUCT` and `ARRAY` type definitions
  - Support for variable references in column definitions (`column_name :variable TYPE`)
  - Support for variable references in `COMMENT` clauses
  - Support for `CREATE VIEW` and `CREATE MATERIALIZED VIEW` statements
  - Complex type extraction and restoration for `STRUCT<...>` and `ARRAY<...>` types
  - SQL normalization for handling multiline SQL statements
  - Comprehensive test coverage with unit and integration tests
  - Backward compatibility maintained with existing SQL dialects (PostgreSQL, MySQL, SQLite, Generic)

### Changed

- **docs**: Updated documentation to list all supported SQL dialects (PostgreSQL, MySQL, SQLite, Generic, Databricks)
- **docs**: Enhanced `SQLImporter` documentation with Databricks dialect examples and usage

## [1.5.0] - 2026-01-03

### Added

- **feat(bpmn)**: BPMN 2.0 model support
  - `BPMNImporter` for importing BPMN XML files with validation
  - `BPMNExporter` for exporting BPMN models in native XML format
  - `BPMNModel` struct for representing BPMN models
  - WASM bindings: `importBpmnModel()`, `exportBpmnModel()`
  - Storage integration: Models saved to `{domain_name}/{model_name}.bpmn.xml`
  - CADS asset references: CADS assets can reference BPMN models via `bpmn_models` field

- **feat(dmn)**: DMN 1.3 model support
  - `DMNImporter` for importing DMN XML files with validation
  - `DMNExporter` for exporting DMN models in native XML format
  - `DMNModel` struct for representing DMN models
  - WASM bindings: `importDmnModel()`, `exportDmnModel()`
  - Storage integration: Models saved to `{domain_name}/{model_name}.dmn.xml`
  - CADS asset references: CADS assets can reference DMN models via `dmn_models` field

- **feat(openapi)**: OpenAPI 3.1.1 specification support
  - `OpenAPIImporter` for importing OpenAPI YAML/JSON files with validation
  - `OpenAPIExporter` for exporting OpenAPI specs with YAML ↔ JSON conversion
  - `OpenAPIModel` struct for representing OpenAPI specifications
  - WASM bindings: `importOpenapiSpec()`, `exportOpenapiSpec()`
  - Storage integration: Specs saved to `{domain_name}/{api_name}.openapi.yaml` or `.openapi.json`
  - CADS asset references: CADS assets can reference OpenAPI specs via `openapi_specs` field

- **feat(converter)**: OpenAPI to ODCS converter
  - `OpenAPIToODCSConverter` for converting OpenAPI schema components to ODCS tables
  - Type mapping: OpenAPI types (string, integer, number, boolean) mapped to ODCS types
  - Constraint preservation: minLength, maxLength, pattern, minimum, maximum, enum converted to ODCS quality rules
  - Format support: date, date-time, email, uri, uuid, password formats handled
  - WASM bindings: `convertOpenapiToOdcs()`, `analyzeOpenapiConversion()`
  - Conversion reports with warnings and field mappings

- **feat(cads)**: Extended CADS asset references
  - `CADSDMNModel` struct for DMN model references
  - `CADSOpenAPISpec` struct for OpenAPI spec references
  - `CADSDMNFormat` and `CADSOpenAPIFormat` enums
  - CADS importer/exporter support for `dmn_models` and `openapi_specs` fields

- **feat(schemas)**: Schema reference files
  - BPMN 2.0 XSD schema placeholder in `schemas/bpmn-2.0.xsd`
  - DMN 1.3 XSD schema placeholder in `schemas/dmn-1.3.xsd`
  - OpenAPI 3.1.1 JSON Schema placeholder in `schemas/openapi-3.1.1.json`

### Changed

- **refactor(features)**: Feature flags for optional formats
  - `bpmn` feature flag for BPMN support (requires `quick-xml`)
  - `dmn` feature flag for DMN support (requires `quick-xml`)
  - `openapi` feature flag for OpenAPI support (uses existing `jsonschema`)

## [1.4.0] - 2026-01-03

### Added

- **feat(storage)**: Domain-based file organization
  - Domain directories with `domain.yaml` files
  - ODCS tables saved as `{name}.odcs.yaml` within domain directories
  - ODPS products saved as `{name}.odps.yaml` within domain directories
  - CADS assets saved as `{name}.cads.yaml` within domain directories
  - `ModelSaver::save_domain()` for saving complete domains with all associated files
  - `ModelLoader::load_domains()` for loading domains from domain directories
  - `ModelLoader::load_domains_from_list()` for loading specific domains
  - Backward compatibility maintained with legacy `tables/` directory structure

- **feat(schemas)**: Schema reference directory
  - `schemas/` directory with JSON Schema definitions for all supported formats
  - ODCS v3.1.0, ODCL v1.2.1, ODPS, and CADS schemas maintained for validation and reference
  - Comprehensive schema documentation in `schemas/README.md`

- **feat(docs)**: Architecture guide
  - Comprehensive Architecture Guide (`docs/ARCHITECTURE.md`) covering project decisions, use cases, and integration patterns
  - Updated README.md with domain-based file structure documentation
  - Updated LLM.txt with new architecture details

### Changed

- **refactor(storage)**: File organization now uses domain-based structure
  - Files organized by business domain instead of flat `tables/` directory
  - Each domain contains its definition and all associated ODCS/ODPS/CADS files
  - Legacy `tables/` directory still supported for backward compatibility

## [1.3.0] - 2026-01-03

### Added

- **feat(odcs)**: Complete ODCS v3.1.0 and ODCL v1.2.1 field preservation
  - Preserve `description`, `quality` arrays (with nested structures), and `$ref` references during import/export
  - Full schema coverage for ODCS v3.1.0 and ODCL v1.2.1 formats
  - Round-trip import/export preserves all fields

- **feat(tags)**: Enhanced tag support with Simple, Pair, and List formats
  - `Tag` enum supporting three formats: `Simple(String)`, `Pair(String, String)`, `List(String, Vec<String>)`
  - Auto-detection parsing with graceful degradation for malformed tags
  - Backward compatible with existing `Vec<String>` tags
  - Tag support in ODCS, ODCL, JSON Schema, AVRO, and Protobuf importers/exporters

- **feat(cads)**: Full CADS v1.0 support
  - CADS importer (`CADSImporter`) for AI/ML models, applications, pipelines
  - CADS exporter (`CADSExporter`) for serializing CADS assets
  - Support for all CADS asset kinds: AIModel, MLPipeline, Application, ETLPipeline, SourceSystem, DestinationSystem
  - Full metadata support: runtime, SLA, pricing, team, risk, compliance, validation profiles

- **feat(odps)**: Full ODPS (Open Data Product Standard) support
  - ODPS importer (`ODPSImporter`) for data products
  - ODPS exporter (`ODPSExporter`) for serializing data products
  - Contract ID validation against ODCS Tables
  - Support for input/output ports, support, team, and custom properties

- **feat(domain)**: Business Domain schema support
  - `Domain` struct for organizing systems, CADS nodes, and ODCS nodes
  - `System` struct representing physical infrastructure with DataFlow metadata
  - `CADSNode` and `ODCSNode` structs with shared reference support
  - ERD-style `SystemConnection` for system-to-system relationships
  - Crowsfeet notation `NodeConnection` for ODCS node relationships
  - Domain operations in `DataModel`: `add_domain()`, `add_system_to_domain()`, `add_cads_node_to_domain()`, `add_odcs_node_to_domain()`, etc.
  - Domain YAML import/export: `Domain::from_yaml()`, `Domain::to_yaml()`

- **feat(converter)**: Universal format converter
  - `convert_to_odcs()` function converts any format to ODCS v3.1.0
  - Auto-detection for SQL, ODCS, ODCL, JSON Schema, AVRO, Protobuf, CADS, ODPS, Domain formats
  - Format-specific conversion logic with informative error messages

- **feat(migration)**: DataFlow to Domain migration utility
  - `migrate_dataflow_to_domain()` converts DataFlow YAML to Domain schema
  - Preserves all metadata during migration
  - Maps DataFlow nodes to Systems and relationships to SystemConnections

- **feat(wasm)**: Comprehensive WASM bindings for new features
  - CADS import/export: `importFromCads()`, `exportToCads()`
  - ODPS import/export: `importFromOdps()`, `exportToOdps()`
  - Domain operations: `createDomain()`, `importFromDomain()`, `exportToDomain()`, `migrateDataflowToDomain()`
  - Domain management: `addSystemToDomain()`, `addCadsNodeToDomain()`, `addOdcsNodeToDomain()`
  - Tag operations: `parseTag()`, `serializeTag()`
  - Universal converter: `convertToOdcs()`

### Changed

- **refactor(dataflow)**: DataFlow format removed and replaced with Domain schema
  - DataFlow import/export modules removed
  - DataFlow WASM bindings removed
  - Migration utility provided for existing DataFlow files

- **refactor(tags)**: Enhanced tag support across all formats
  - `Table.tags` and `Relationship.tags` now use `Vec<Tag>` instead of `Vec<String>`
  - All importers parse enhanced tags using `Tag::from_str()`
  - All exporters serialize tags using `Tag::to_string()`

### Documentation

- Added comprehensive Schema Overview Guide (`docs/SCHEMA_OVERVIEW.md`)
- Updated README.md with Domain schema and new format support
- Updated LLM.txt with new modules and architecture details

## [1.2.0] - 2026-01-27

### Added

- **feat(metadata)**: Enhanced Data Flow node and relationship metadata support
  - Add `owner`, `sla`, `contact_details`, `infrastructure_type`, and `notes` fields to `Table` struct (for Data Flow nodes)
  - Add `owner`, `sla`, `contact_details`, `infrastructure_type` fields to `Relationship` struct (for Data Flow relationships)
  - Add `SlaProperty` struct with ODCS-inspired structure (property, value, unit, element, driver, description, scheduler, schedule)
  - Add `ContactDetails` struct with email, phone, name, role, and other fields
  - Add `InfrastructureType` enum with 70+ infrastructure types covering major cloud databases, container platforms, data warehouses, message queues, and BI/analytics tools
  - Add filter methods to `DataModel`: `filter_nodes_by_owner()`, `filter_relationships_by_owner()`, `filter_nodes_by_infrastructure_type()`, `filter_relationships_by_infrastructure_type()`, `filter_by_tags()`

### Changed

- **refactor(metadata)**: All new metadata fields are optional and maintain backward compatibility
- **refactor(filter)**: Updated `filter_by_tags()` to return tuple `(Vec<&Table>, Vec<&Relationship>)` for both nodes and relationships

## [1.1.0] - 2026-01-02

### Added

- **feat(wasm)**: Add comprehensive WASM bindings for validation, export, and model management
  - Add WASM bindings for input validation functions (`validate_table_name`, `validate_column_name`, `validate_uuid`, `validate_data_type`, `validate_description`)
  - Add WASM bindings for sanitization functions (`sanitize_sql_identifier`, `sanitize_description`)
  - Add WASM bindings for table validation (`detect_naming_conflicts`, `validate_pattern_exclusivity`)
  - Add WASM bindings for relationship validation (`check_circular_dependency`, `validate_no_self_reference`)
  - Add WASM binding for PNG export (`export_to_png`) - feature-gated behind `png-export`
  - Add async WASM bindings for model loading/saving (`load_model`, `save_model`) using browser storage backend
  - Add `Serialize`/`Deserialize` to validation result types for WASM interop
  - Add `Serialize`/`Deserialize` to `ModelLoadResult` and related types for WASM interop

### Changed

- **refactor(wasm)**: Extend WASM module with 14 new binding functions
  - All validation functions return JSON strings with structured results
  - Model loading/saving functions use `js_sys::Promise` for async operations
  - Error handling converts Rust errors to JavaScript-compatible errors

## [1.0.2] - 2025-12-31

### Fixed

- **fix(publish)**: Fix publish workflow and Cargo.toml metadata
  - Add required `description` field to Cargo.toml for crates.io publishing
  - Update publish workflow to use `cargo login` with environment variables instead of deprecated `--token` flag
  - Fix cargo publish warnings

## [1.0.1] - 2025-12-31

### Changed

- **refactor(ci)**: Update GitHub workflows
  - CI workflow now only runs on PR open/update events (not on main branch)
  - Removed publish job from CI workflow
  - Build/test only on Linux by default (macOS/Windows optional)
  - Publish workflow runs on manual trigger or merge to main
  - Publish workflow creates git tag from Cargo.toml version
  - Publish workflow verifies version matches CHANGELOG.md

- **fix(auth)**: Use derive Default for AuthMode enum
  - Replace manual Default impl with derive macro and #[default] attribute
  - Fixes clippy::derivable_impls warning

## [1.0.0] - 2024-12-19

### Added

#### Features

- **feat(models)**: Add comprehensive data model structures for tables, columns, and relationships
  - Add `Table` struct with support for database types, medallion layers, SCD patterns, and Data Vault classifications
  - Add `Column` struct with support for foreign keys, composite keys, constraints, and enum values
  - Add `Relationship` struct with cardinality, relationship types, foreign key details, and ETL job metadata
  - Add `DataModel` struct for managing collections of tables and relationships
  - Add `Position` struct for 2D canvas positioning
  - Add `CrossDomainConfig` for cross-domain table and relationship references

- **feat(import)**: Add comprehensive import functionality for multiple formats
  - Add `ODCSImporter` for importing ODCS v3.1.0 YAML format (legacy ODCL formats supported for import)
  - Add `SQLImporter` for parsing CREATE TABLE statements (PostgreSQL, MySQL, SQL Server dialects)
  - Add `JSONSchemaImporter` for importing JSON Schema definitions with nested object support
  - Add `AvroImporter` for importing AVRO schema files
  - Add `ProtobufImporter` for runtime parsing of proto3 syntax files
  - Add support for deeply nested structures and references in all importers
  - Add validation for imported table and column names

- **feat(export)**: Add comprehensive export functionality for multiple formats
  - Add `ODCSExporter` for exporting to ODCS v3.1.0 YAML format
  - Add `SQLExporter` for generating CREATE TABLE statements (PostgreSQL, MySQL, SQL Server dialects)
  - Add `JSONSchemaExporter` for exporting JSON Schema definitions
  - Add `AvroExporter` for exporting AVRO schema files
  - Add `ProtobufExporter` for exporting Protocol Buffer message definitions
  - Add `ODCLExporter` for legacy ODCL format support (deprecated)
  - Add `PNGExporter` for exporting ER diagrams as PNG images (feature-gated)

- **feat(storage)**: Add storage backend abstraction layer
  - Add `StorageBackend` trait for platform-agnostic file operations
  - Add `FileSystemStorageBackend` for native file system operations (feature-gated)
  - Add `BrowserStorageBackend` for WASM browser storage APIs (feature-gated)
  - Add `ApiStorageBackend` for HTTP API-based storage (feature-gated)
  - Add path traversal protection in all storage backends
  - Add domain slug validation for API backend

- **feat(model)**: Add model loading and saving functionality
  - Add `ModelLoader` for loading tables and relationships from storage backends
  - Add `ModelSaver` for saving tables and relationships to storage backends
  - Add `ApiModelLoader` for loading models from API endpoints
  - Add support for orphaned relationship detection
  - Add YAML file path tracking for tables

- **feat(validation)**: Add comprehensive validation functionality
  - Add `TableValidator` for detecting naming conflicts and pattern exclusivity violations
  - Add `RelationshipValidator` for detecting circular dependencies and self-references
  - Add input validation functions for table names, column names, data types, and UUIDs
  - Add SQL identifier sanitization for multiple database dialects
  - Add reserved word checking for SQL identifiers

- **feat(git)**: Add Git integration support
  - Add `GitService` for Git repository operations (feature-gated)
  - Add support for staging files, committing changes, and checking repository status
  - Add error handling for Git operations

- **feat(workspace)**: Add workspace management types
  - Add `WorkspaceInfo` for workspace metadata
  - Add `ProfileInfo` for user profile management
  - Add request/response types for workspace operations

- **feat(auth)**: Add authentication types
  - Add `AuthMode` enum for different authentication modes (Web, Local, Online)
  - Add `AuthState` for tracking authentication status
  - Add `GitHubEmail` for GitHub OAuth email selection
  - Add OAuth request/response types

- **feat(cross-domain)**: Add cross-domain table and relationship sharing
  - Add `CrossDomainTableRef` for referencing tables from other domains
  - Add `CrossDomainRelationshipRef` for referencing relationships from other domains
  - Add `CrossDomainConfig` for managing imported references

#### Documentation

- **docs**: Add comprehensive documentation coverage (~85%+)
  - Add module-level documentation for all public modules
  - Add function-level documentation with examples for all public functions
  - Add field-level documentation for all model structs
  - Add usage examples in documentation comments
  - Add security considerations documentation

#### Tests

- **test**: Add comprehensive test suite (~65+ tests)
  - Add unit tests for all validation functions
  - Add unit tests for model loading and saving
  - Add unit tests for Git service operations
  - Add unit tests for storage backend operations
  - Add unit tests for import/export functionality
  - Add unit tests for workspace and auth types
  - Add integration tests for ODCS import/export roundtrips
  - Add tests for deeply nested structures and references
  - Add tests for edge cases and error conditions

### Changed

- **refactor(import/odcs)**: Improve ODCS importer to fully parse table structure
  - Replace basic field parsing with full `ODCSImporter::parse_table()` usage
  - Implement complete STRUCT expansion with recursive helper function
  - Improve handling of complex union types in AVRO import

- **refactor(import/protobuf)**: Enhance Protobuf parser for complete proto3 support
  - Add support for nested messages with dot notation
  - Add support for repeated and optional fields
  - Add support for enum definitions
  - Add support for oneof and map types

- **refactor(export/odcs)**: Standardize on ODCS v3.1.0 format
  - Remove support for legacy ODCS formats in export (import still supported)
  - Ensure all exports conform to ODCS v3.1.0 schema

- **refactor(models)**: Improve model structure and methods
  - Change table ID generation from deterministic UUIDv5 to random UUIDv4
  - Add `get_unique_key()` method to `Table` for conflict detection
  - Add helper methods to `DataModel` for table and relationship lookup

- **refactor(validation)**: Improve validation error messages
  - Add detailed error messages with context
  - Add support for multiple validation errors per operation

### Fixed

- **fix(import/odcs)**: Fix comments to clarify ODCS single-table-per-file format
  - Update comments to reflect that ODCS only specifies one table per file
  - Fix STRUCT expansion to handle deeply nested structures correctly

- **fix(import/avro)**: Improve union type handling
  - Use first non-null type from union instead of defaulting to string

- **fix(model/loader)**: Fix table loading to use full ODCS parser
  - Replace basic field parsing with complete table structure parsing
  - Ensure all columns and metadata are properly loaded

- **fix(storage)**: Fix path traversal vulnerabilities
  - Add comprehensive path traversal protection in all storage backends
  - Add validation for domain slugs in API backend

- **fix(export)**: Fix clippy warnings and improve code quality
  - Replace `or_insert_with(Vec::new)` with `or_default()`
  - Fix redundant closure warnings
  - Fix unused enumerate index warnings

### Security

- **security(storage)**: Add path traversal protection
  - Block all path traversal attempts (../, ..\, etc.)
  - Validate domain slugs to prevent injection attacks
  - Sanitize SQL identifiers to prevent SQL injection

- **security(validation)**: Add input validation
  - Validate all user inputs before processing
  - Prevent SQL injection via malicious table/column names
  - Enforce maximum length limits on identifiers

### Performance

- **perf(validation)**: Optimize relationship validation
  - Use efficient graph algorithms for cycle detection
  - Cache validation results where appropriate

### Build

- **build**: Add feature flags for optional functionality
  - Add `api-backend` feature for HTTP API support
  - Add `native-fs` feature for native file system operations
  - Add `wasm` feature for WebAssembly support
  - Add `png-export` feature for PNG diagram export
  - Add `git` feature for Git integration
  - Add `databricks-dialect` feature for Databricks SQL support

### Removed

- **remove**: Remove legacy ODCS format support from export
  - ODCL exporter remains for import compatibility only
  - All exports now use ODCS v3.1.0 format

### Deprecated

- **deprecate(export/odcl)**: Mark ODCL exporter as deprecated
  - ODCL is End-of-Life standard
  - Use ODCS v3.1.0 format for new exports
  - ODCL import still supported for backward compatibility

---

## Version History

### [1.0.0] - 2024-12-19

Initial stable release with comprehensive feature set:

- Complete data modeling SDK with support for tables, columns, and relationships
- Multi-format import/export (ODCS, SQL, JSON Schema, AVRO, Protobuf)
- Storage backend abstraction for multiple platforms
- Comprehensive validation and security features
- Cross-domain sharing capabilities
- Git integration support
- Extensive test coverage (~65+ tests)
- Comprehensive documentation (~85%+ coverage)

---

## Types of Changes

- **Added** for new features
- **Changed** for changes in existing functionality
- **Deprecated** for soon-to-be removed features
- **Removed** for now removed features
- **Fixed** for any bug fixes
- **Security** for vulnerability fixes

[1.0.0]: https://github.com/your-org/data-modelling-sdk/releases/tag/v1.0.0