dlin-cli 0.2.4rc3__tar.gz → 0.2.6rc1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (216) hide show
  1. {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/Cargo.lock +29 -27
  2. {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/Cargo.toml +3 -3
  3. {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/PKG-INFO +20 -11
  4. {dlin_cli-0.2.4rc3/crates/dlin → dlin_cli-0.2.6rc1}/README.md +19 -10
  5. {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin/Cargo.toml +1 -0
  6. {dlin_cli-0.2.4rc3/crates/dlin-core → dlin_cli-0.2.6rc1/crates/dlin}/README.md +19 -10
  7. dlin_cli-0.2.6rc1/crates/dlin/src/cli/column.rs +240 -0
  8. dlin_cli-0.2.6rc1/crates/dlin/src/cli/command.rs +247 -0
  9. dlin_cli-0.2.6rc1/crates/dlin/src/cli/common.rs +126 -0
  10. dlin_cli-0.2.6rc1/crates/dlin/src/cli/graph.rs +309 -0
  11. dlin_cli-0.2.6rc1/crates/dlin/src/cli/misc.rs +163 -0
  12. dlin_cli-0.2.6rc1/crates/dlin/src/cli/mod.rs +13 -0
  13. dlin_cli-0.2.6rc1/crates/dlin/src/cli/summary.rs +321 -0
  14. dlin_cli-0.2.6rc1/crates/dlin/src/commands/column.rs +315 -0
  15. dlin_cli-0.2.6rc1/crates/dlin/src/commands/debug.rs +143 -0
  16. dlin_cli-0.2.6rc1/crates/dlin/src/commands/graph.rs +529 -0
  17. dlin_cli-0.2.6rc1/crates/dlin/src/commands/manifest.rs +383 -0
  18. dlin_cli-0.2.6rc1/crates/dlin/src/commands/mod.rs +13 -0
  19. dlin_cli-0.2.6rc1/crates/dlin/src/commands/shared.rs +331 -0
  20. dlin_cli-0.2.6rc1/crates/dlin/src/main.rs +129 -0
  21. dlin_cli-0.2.6rc1/crates/dlin/src/mcp/mod.rs +7 -0
  22. dlin_cli-0.2.6rc1/crates/dlin/src/mcp/protocol.rs +227 -0
  23. dlin_cli-0.2.6rc1/crates/dlin/src/mcp/tests.rs +824 -0
  24. dlin_cli-0.2.6rc1/crates/dlin/src/mcp/tools.rs +529 -0
  25. dlin_cli-0.2.6rc1/crates/dlin/tests/integration/artifacts.rs +47 -0
  26. dlin_cli-0.2.6rc1/crates/dlin/tests/integration/cli.rs +682 -0
  27. dlin_cli-0.2.6rc1/crates/dlin/tests/integration/error_format.rs +163 -0
  28. dlin_cli-0.2.6rc1/crates/dlin/tests/integration/freshness.rs +359 -0
  29. dlin_cli-0.2.6rc1/crates/dlin/tests/integration/generic_test_metadata.rs +654 -0
  30. dlin_cli-0.2.6rc1/crates/dlin/tests/integration/manifest_only.rs +686 -0
  31. dlin_cli-0.2.6rc1/crates/dlin/tests/integration/manifest_only_rest.rs +590 -0
  32. dlin_cli-0.2.6rc1/crates/dlin/tests/integration/parsing.rs +65 -0
  33. dlin_cli-0.2.6rc1/crates/dlin/tests/integration/render_failure.rs +255 -0
  34. dlin_cli-0.2.6rc1/crates/dlin/tests/integration/sql_mode_test_warning.rs +154 -0
  35. dlin_cli-0.2.6rc1/crates/dlin/tests/integration_test.rs +82 -0
  36. {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/Cargo.toml +1 -0
  37. {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1/crates/dlin-core}/README.md +19 -10
  38. {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/error.rs +15 -0
  39. {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/graph/builder/mod.rs +49 -440
  40. dlin_cli-0.2.6rc1/crates/dlin-core/src/graph/builder/project_yaml.rs +194 -0
  41. dlin_cli-0.2.6rc1/crates/dlin-core/src/graph/builder/semantic_layer.rs +200 -0
  42. dlin_cli-0.2.6rc1/crates/dlin-core/src/graph/builder/tests/build_graph/basic.rs +552 -0
  43. dlin_cli-0.2.6rc1/crates/dlin-core/src/graph/builder/tests/build_graph/mod.rs +6 -0
  44. dlin_cli-0.2.6rc1/crates/dlin-core/src/graph/builder/tests/build_graph/semantic_layer.rs +228 -0
  45. dlin_cli-0.2.6rc1/crates/dlin-core/src/graph/builder/tests/build_graph/yaml_snapshots.rs +428 -0
  46. {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/graph/builder/tests/versioned.rs +4 -4
  47. {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/graph/column_lineage/backend/mod.rs +0 -8
  48. {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/graph/column_lineage/backend/sqllineage.rs +20 -16
  49. dlin_cli-0.2.6rc1/crates/dlin-core/src/graph/column_lineage/cache.rs +171 -0
  50. {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/graph/column_lineage/cross_model.rs +88 -55
  51. {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/graph/column_lineage/impact.rs +24 -42
  52. {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/graph/column_lineage/mod.rs +137 -47
  53. {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/graph/column_lineage/schema.rs +154 -53
  54. dlin_cli-0.2.6rc1/crates/dlin-core/src/graph/column_lineage/tests/backend_regression/basic.rs +226 -0
  55. dlin_cli-0.2.6rc1/crates/dlin-core/src/graph/column_lineage/tests/backend_regression/discovery.rs +424 -0
  56. dlin_cli-0.2.6rc1/crates/dlin-core/src/graph/column_lineage/tests/backend_regression/mod.rs +324 -0
  57. dlin_cli-0.2.6rc1/crates/dlin-core/src/graph/column_lineage/tests/backend_regression/set_operations.rs +575 -0
  58. dlin_cli-0.2.6rc1/crates/dlin-core/src/graph/column_lineage/tests/cache.rs +618 -0
  59. dlin_cli-0.2.6rc1/crates/dlin-core/src/graph/column_lineage/tests/core_cross_model/mod.rs +580 -0
  60. dlin_cli-0.2.6rc1/crates/dlin-core/src/graph/column_lineage/tests/core_cross_model/scenarios.rs +701 -0
  61. {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/graph/column_lineage/tests/core_star.rs +2 -0
  62. {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/graph/column_lineage/tests/core_util.rs +21 -26
  63. dlin_cli-0.2.4rc3/crates/dlin-core/src/graph/column_lineage/tests/impact.rs → dlin_cli-0.2.6rc1/crates/dlin-core/src/graph/column_lineage/tests/impact/core.rs +22 -241
  64. dlin_cli-0.2.6rc1/crates/dlin-core/src/graph/column_lineage/tests/impact/edge_cases.rs +117 -0
  65. dlin_cli-0.2.6rc1/crates/dlin-core/src/graph/column_lineage/tests/impact/mod.rs +188 -0
  66. {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/graph/column_lineage/tests/regression_fixtures.rs +18 -3
  67. dlin_cli-0.2.6rc1/crates/dlin-core/src/graph/column_lineage/types.rs +390 -0
  68. {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/graph/filter/mod.rs +161 -34
  69. {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/graph/filter/tests/filter_graph.rs +120 -0
  70. {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/graph/filter/tests/output.rs +90 -1
  71. {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/graph/filter/tests/selector.rs +44 -0
  72. {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/graph/types.rs +6 -3
  73. {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/input.rs +86 -10
  74. dlin_cli-0.2.6rc1/crates/dlin-core/src/parser/cache.rs +790 -0
  75. {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/parser/discovery.rs +97 -15
  76. dlin_cli-0.2.6rc1/crates/dlin-core/src/parser/jinja/mod.rs +143 -0
  77. dlin_cli-0.2.6rc1/crates/dlin-core/src/parser/jinja/reachability/analysis.rs +67 -0
  78. dlin_cli-0.2.6rc1/crates/dlin-core/src/parser/jinja/reachability/catalog.rs +131 -0
  79. dlin_cli-0.2.6rc1/crates/dlin-core/src/parser/jinja/reachability/mod.rs +318 -0
  80. dlin_cli-0.2.6rc1/crates/dlin-core/src/parser/jinja/reachability/tests.rs +210 -0
  81. dlin_cli-0.2.6rc1/crates/dlin-core/src/parser/jinja/render.rs +736 -0
  82. dlin_cli-0.2.6rc1/crates/dlin-core/src/parser/jinja/source.rs +305 -0
  83. dlin_cli-0.2.6rc1/crates/dlin-core/src/parser/jinja/tests.rs +1131 -0
  84. dlin_cli-0.2.6rc1/crates/dlin-core/src/parser/manifest/graph.rs +480 -0
  85. dlin_cli-0.2.6rc1/crates/dlin-core/src/parser/manifest/mod.rs +454 -0
  86. dlin_cli-0.2.6rc1/crates/dlin-core/src/parser/manifest/report/decode.rs +493 -0
  87. dlin_cli-0.2.6rc1/crates/dlin-core/src/parser/manifest/report/mod.rs +571 -0
  88. dlin_cli-0.2.6rc1/crates/dlin-core/src/parser/manifest/report/tests.rs +562 -0
  89. dlin_cli-0.2.6rc1/crates/dlin-core/src/parser/manifest/tests/compatibility.rs +366 -0
  90. dlin_cli-0.2.6rc1/crates/dlin-core/src/parser/manifest/tests/contents.rs +255 -0
  91. dlin_cli-0.2.6rc1/crates/dlin-core/src/parser/manifest/tests/graph.rs +785 -0
  92. dlin_cli-0.2.6rc1/crates/dlin-core/src/parser/manifest/tests/identifiers.rs +95 -0
  93. dlin_cli-0.2.6rc1/crates/dlin-core/src/parser/manifest/tests/mod.rs +8 -0
  94. dlin_cli-0.2.6rc1/crates/dlin-core/src/parser/manifest/tests/semantic_layer.rs +141 -0
  95. dlin_cli-0.2.6rc1/crates/dlin-core/src/parser/manifest_cache.rs +307 -0
  96. {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/parser/mod.rs +1 -1
  97. dlin_cli-0.2.6rc1/crates/dlin-core/src/parser/project.rs +753 -0
  98. dlin_cli-0.2.6rc1/crates/dlin-core/src/parser/sql/mod.rs +388 -0
  99. dlin_cli-0.2.6rc1/crates/dlin-core/src/parser/sql/recovery.rs +246 -0
  100. dlin_cli-0.2.6rc1/crates/dlin-core/src/parser/sql/tests.rs +1232 -0
  101. {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/column_graph.rs +2 -491
  102. dlin_cli-0.2.6rc1/crates/dlin-core/src/render/column_graph_tests.rs +489 -0
  103. {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/tests/column_lineage_test.rs +29 -61
  104. dlin_cli-0.2.4rc3/crates/dlin/src/cli.rs +0 -2429
  105. dlin_cli-0.2.4rc3/crates/dlin/src/main.rs +0 -1736
  106. dlin_cli-0.2.4rc3/crates/dlin/src/mcp.rs +0 -1454
  107. dlin_cli-0.2.4rc3/crates/dlin/tests/integration_test.rs +0 -2812
  108. dlin_cli-0.2.4rc3/crates/dlin-core/src/graph/builder/tests/build_graph.rs +0 -1077
  109. dlin_cli-0.2.4rc3/crates/dlin-core/src/graph/column_lineage/cache.rs +0 -305
  110. dlin_cli-0.2.4rc3/crates/dlin-core/src/graph/column_lineage/tests/backend_regression.rs +0 -1329
  111. dlin_cli-0.2.4rc3/crates/dlin-core/src/graph/column_lineage/tests/cache.rs +0 -546
  112. dlin_cli-0.2.4rc3/crates/dlin-core/src/graph/column_lineage/tests/core_cross_model.rs +0 -282
  113. dlin_cli-0.2.4rc3/crates/dlin-core/src/graph/column_lineage/types.rs +0 -174
  114. dlin_cli-0.2.4rc3/crates/dlin-core/src/parser/cache.rs +0 -497
  115. dlin_cli-0.2.4rc3/crates/dlin-core/src/parser/jinja.rs +0 -753
  116. dlin_cli-0.2.4rc3/crates/dlin-core/src/parser/manifest.rs +0 -1879
  117. dlin_cli-0.2.4rc3/crates/dlin-core/src/parser/manifest_cache.rs +0 -207
  118. dlin_cli-0.2.4rc3/crates/dlin-core/src/parser/project.rs +0 -228
  119. dlin_cli-0.2.4rc3/crates/dlin-core/src/parser/sql.rs +0 -829
  120. {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/LICENSE +0 -0
  121. {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/graph/builder/tests/generic_tests.rs +0 -0
  122. {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/graph/builder/tests/mod.rs +0 -0
  123. {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/graph/builder/tests/ref_parsing.rs +0 -0
  124. {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/graph/column_lineage/backend/catalog.rs +0 -0
  125. {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/graph/column_lineage/backend/catalog_provider.rs +0 -0
  126. {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/graph/column_lineage/backend/dialect.rs +0 -0
  127. {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/graph/column_lineage/backend/types.rs +0 -0
  128. {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/graph/column_lineage/relation.rs +0 -0
  129. {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/graph/column_lineage/tests/alias.rs +0 -0
  130. {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/graph/column_lineage/tests/core_basic.rs +0 -0
  131. {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/graph/column_lineage/tests/core_star_chain.rs +0 -0
  132. {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/graph/column_lineage/tests/mod.rs +0 -0
  133. {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/graph/filter/tests/collapse.rs +0 -0
  134. {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/graph/filter/tests/mod.rs +0 -0
  135. {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/graph/filter/tests/search.rs +0 -0
  136. {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/graph/filter/tests/snapshots/dlin_core__graph__filter__tests__collapse__collapse_snapshot.snap +0 -0
  137. {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/graph/filter/tests/snapshots/dlin_core__graph__filter__tests__collapse__collapse_snapshot_bfs_pseudoendpoint.snap +0 -0
  138. {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/graph/filter/tests/snapshots/dlin_core__graph__filter__tests__collapse__collapse_snapshot_endpoints_fan_out.snap +0 -0
  139. {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/graph/filter/tests/snapshots/dlin_core__graph__filter__tests__collapse__collapse_snapshot_endpoints_leaf_model.snap +0 -0
  140. {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/graph/filter/tests/snapshots/dlin_core__graph__filter__tests__collapse__collapse_snapshot_multiple_focus_models.snap +0 -0
  141. {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/graph/filter/tests/snapshots/dlin_core__graph__filter__tests__collapse__collapse_snapshot_no_source_exposure.snap +0 -0
  142. {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/graph/filter/tests/snapshots/dlin_core__graph__filter__tests__collapse__collapse_snapshot_preserve_focus.snap +0 -0
  143. {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/graph/filter/tests/snapshots/dlin_core__graph__filter__tests__collapse__snapshot_transitive_node_type_filter.snap +0 -0
  144. {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/graph/filter/tests/snapshots/dlin_core__graph__filter__tests__collapse__snapshot_transitive_select_filter.snap +0 -0
  145. {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/graph/filter/tests/snapshots/dlin_core__graph__filter__tests__collapse__snapshot_transitive_select_with_node_type.snap +0 -0
  146. {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/graph/filter/tests/transitive.rs +0 -0
  147. {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/graph/filter/tests/versioned.rs +0 -0
  148. {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/graph/impact.rs +0 -0
  149. {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/graph/mod.rs +0 -0
  150. {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/lib.rs +0 -0
  151. {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/parser/columns.rs +0 -0
  152. {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/parser/yaml_schema.rs +0 -0
  153. {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/ascii.rs +0 -0
  154. {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/dot.rs +0 -0
  155. {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/html.rs +0 -0
  156. {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/impact.rs +0 -0
  157. {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/json.rs +0 -0
  158. {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/layout.rs +0 -0
  159. {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/list.rs +0 -0
  160. {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/mermaid.rs +0 -0
  161. {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/mod.rs +0 -0
  162. {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/plain.rs +0 -0
  163. {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/snapshots/dlin_core__render__column_graph__tests__dot_all_transformation_types.snap +0 -0
  164. {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/snapshots/dlin_core__render__column_graph__tests__dot_escapes_special_chars.snap +0 -0
  165. {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/snapshots/dlin_core__render__column_graph__tests__dot_id_collision_avoided.snap +0 -0
  166. {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/snapshots/dlin_core__render__column_graph__tests__dot_impact_indirect.snap +0 -0
  167. {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/snapshots/dlin_core__render__column_graph__tests__dot_impact_single.snap +0 -0
  168. {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/snapshots/dlin_core__render__column_graph__tests__dot_single_model.snap +0 -0
  169. {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/snapshots/dlin_core__render__column_graph__tests__dot_via_path.snap +0 -0
  170. {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/snapshots/dlin_core__render__column_graph__tests__impact_mermaid.snap +0 -0
  171. {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/snapshots/dlin_core__render__column_graph__tests__impact_mermaid_indirect_edge_label.snap +0 -0
  172. {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/snapshots/dlin_core__render__column_graph__tests__impact_plain.snap +0 -0
  173. {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/snapshots/dlin_core__render__column_graph__tests__impact_plain_multi_hop.snap +0 -0
  174. {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/snapshots/dlin_core__render__column_graph__tests__impact_plain_non_direct_intermediate.snap +0 -0
  175. {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/snapshots/dlin_core__render__column_graph__tests__mermaid_dotted_table_name.snap +0 -0
  176. {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/snapshots/dlin_core__render__column_graph__tests__mermaid_id_collision_avoided.snap +0 -0
  177. {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/snapshots/dlin_core__render__column_graph__tests__mermaid_label_escaping.snap +0 -0
  178. {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/snapshots/dlin_core__render__column_graph__tests__mermaid_single_model.snap +0 -0
  179. {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/snapshots/dlin_core__render__column_graph__tests__plain_model_path_non_direct_annotation.snap +0 -0
  180. {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/snapshots/dlin_core__render__column_graph__tests__plain_no_sources.snap +0 -0
  181. {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/snapshots/dlin_core__render__column_graph__tests__plain_single_model.snap +0 -0
  182. {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/snapshots/dlin_core__render__dot__tests__group_by_node_type.snap +0 -0
  183. {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/snapshots/dlin_core__render__dot__tests__snapshot_all_edge_types.snap +0 -0
  184. {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/snapshots/dlin_core__render__dot__tests__snapshot_direction_tb.snap +0 -0
  185. {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/snapshots/dlin_core__render__dot__tests__snapshot_direction_tb_grouped.snap +0 -0
  186. {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/snapshots/dlin_core__render__dot__tests__snapshot_group_by_directory.snap +0 -0
  187. {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/snapshots/dlin_core__render__dot__tests__snapshot_lineage.snap +0 -0
  188. {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/snapshots/dlin_core__render__dot__tests__snapshot_transitive_edges.snap +0 -0
  189. {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/snapshots/dlin_core__render__html__tests__snapshot_html_json.snap +0 -0
  190. {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/snapshots/dlin_core__render__impact__tests__snapshot_impact_json.snap +0 -0
  191. {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/snapshots/dlin_core__render__impact__tests__snapshot_impact_json_with_sql.snap +0 -0
  192. {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/snapshots/dlin_core__render__impact__tests__snapshot_impact_text.snap +0 -0
  193. {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/snapshots/dlin_core__render__impact__tests__snapshot_impact_text_with_sql.snap +0 -0
  194. {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/snapshots/dlin_core__render__json__tests__snapshot_json_with_sql.snap +0 -0
  195. {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/snapshots/dlin_core__render__json__tests__snapshot_lineage.snap +0 -0
  196. {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/snapshots/dlin_core__render__json__tests__snapshot_node_metadata.snap +0 -0
  197. {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/snapshots/dlin_core__render__list__tests__snapshot_list_json.snap +0 -0
  198. {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/snapshots/dlin_core__render__list__tests__snapshot_list_plain.snap +0 -0
  199. {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/snapshots/dlin_core__render__mermaid__tests__group_by_node_type.snap +0 -0
  200. {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/snapshots/dlin_core__render__mermaid__tests__mixed_direct_and_transitive_edges.snap +0 -0
  201. {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/snapshots/dlin_core__render__mermaid__tests__show_columns_escapes_quotes.snap +0 -0
  202. {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/snapshots/dlin_core__render__mermaid__tests__show_columns_lineage.snap +0 -0
  203. {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/snapshots/dlin_core__render__mermaid__tests__show_columns_single_model.snap +0 -0
  204. {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/snapshots/dlin_core__render__mermaid__tests__show_columns_with_collapse.snap +0 -0
  205. {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/snapshots/dlin_core__render__mermaid__tests__show_columns_with_grouping.snap +0 -0
  206. {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/snapshots/dlin_core__render__mermaid__tests__snapshot_direction_tb.snap +0 -0
  207. {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/snapshots/dlin_core__render__mermaid__tests__snapshot_direction_tb_grouped.snap +0 -0
  208. {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/snapshots/dlin_core__render__mermaid__tests__snapshot_group_by_directory.snap +0 -0
  209. {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/snapshots/dlin_core__render__mermaid__tests__snapshot_lineage.snap +0 -0
  210. {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/snapshots/dlin_core__render__mermaid__tests__transitive_edge_rendering.snap +0 -0
  211. {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/snapshots/dlin_core__render__plain__tests__snapshot_plain.snap +0 -0
  212. {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/snapshots/dlin_core__render__summary__tests__snapshot_summary_json.snap +0 -0
  213. {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/snapshots/dlin_core__render__summary__tests__snapshot_summary_text.snap +0 -0
  214. {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/summary.rs +0 -0
  215. {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/svg.rs +0 -0
  216. {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/pyproject.toml +0 -0
@@ -139,9 +139,9 @@ checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801"
139
139
 
140
140
  [[package]]
141
141
  name = "clap"
142
- version = "4.6.6"
142
+ version = "4.6.7"
143
143
  source = "registry+https://github.com/rust-lang/crates.io-index"
144
- checksum = "473c7e07f409a8d772161724aa8db6a765a2532a70f9667eeb7b49d3d02fbdca"
144
+ checksum = "aa8876b300ab35ba921adea3dfd70157a46249b33f95c9084ae5709785478946"
145
145
  dependencies = [
146
146
  "clap_builder",
147
147
  "clap_derive",
@@ -149,9 +149,9 @@ dependencies = [
149
149
 
150
150
  [[package]]
151
151
  name = "clap_builder"
152
- version = "4.6.6"
152
+ version = "4.6.7"
153
153
  source = "registry+https://github.com/rust-lang/crates.io-index"
154
- checksum = "7b48fea5a88e9ae728a2dcbedbfc0e730f7d60da42e1cb049a83c9fb8b789889"
154
+ checksum = "ec0797fb7aeb1406c84efac526901f7ec3ead2124f946b494e72879d4b54704d"
155
155
  dependencies = [
156
156
  "anstream",
157
157
  "anstyle",
@@ -161,9 +161,9 @@ dependencies = [
161
161
 
162
162
  [[package]]
163
163
  name = "clap_derive"
164
- version = "4.6.4"
164
+ version = "4.6.7"
165
165
  source = "registry+https://github.com/rust-lang/crates.io-index"
166
- checksum = "d012d2b9d65aca7f18f4d9878a045bc17899bba951561ba5ec3c2ba1eed9a061"
166
+ checksum = "f9c751b79415d4e559e3d1fcf128e09e720eb673a06d26cf6f392d37d75b66e0"
167
167
  dependencies = [
168
168
  "heck",
169
169
  "proc-macro2",
@@ -230,12 +230,13 @@ checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28"
230
230
 
231
231
  [[package]]
232
232
  name = "dlin"
233
- version = "0.2.4-rc.3"
233
+ version = "0.2.6-rc.1"
234
234
  dependencies = [
235
235
  "anyhow",
236
236
  "clap",
237
237
  "dlin-core",
238
238
  "filetime",
239
+ "insta",
239
240
  "libc",
240
241
  "path-slash",
241
242
  "regex",
@@ -247,11 +248,12 @@ dependencies = [
247
248
 
248
249
  [[package]]
249
250
  name = "dlin-core"
250
- version = "0.2.4-rc.3"
251
+ version = "0.2.6-rc.1"
251
252
  dependencies = [
252
253
  "anyhow",
253
254
  "clap",
254
255
  "colored",
256
+ "filetime",
255
257
  "globset",
256
258
  "indexmap",
257
259
  "insta",
@@ -400,9 +402,9 @@ dependencies = [
400
402
 
401
403
  [[package]]
402
404
  name = "globset"
403
- version = "0.4.19"
405
+ version = "0.4.20"
404
406
  source = "registry+https://github.com/rust-lang/crates.io-index"
405
- checksum = "e47d37d2ae4464254884b60ab7071be2b876a9c35b696bd018ddcc76847309cd"
407
+ checksum = "07c34a9410465b45bd9787443bc7370f37735bad04b0f0cd57ff1a3186c98988"
406
408
  dependencies = [
407
409
  "aho-corasick",
408
410
  "bstr",
@@ -413,9 +415,9 @@ dependencies = [
413
415
 
414
416
  [[package]]
415
417
  name = "granit-parser"
416
- version = "1.0.1"
418
+ version = "1.3.0"
417
419
  source = "registry+https://github.com/rust-lang/crates.io-index"
418
- checksum = "7c92814c286f45b5ed1498ce9547bc9637b473eba7037f8aee6a4d5a3c1e051c"
420
+ checksum = "e20f99e46474f56bd905c56e817ebddcf377a611f94c53ac4649e4d3fa3c0cd0"
419
421
  dependencies = [
420
422
  "arraydeque",
421
423
  "smallvec",
@@ -444,9 +446,9 @@ checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
444
446
 
445
447
  [[package]]
446
448
  name = "indexmap"
447
- version = "2.14.0"
449
+ version = "2.14.2"
448
450
  source = "registry+https://github.com/rust-lang/crates.io-index"
449
- checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9"
451
+ checksum = "cc4e190f5d26ca7051642629da2c52fc03bde85a03197c99408dcd291734c855"
450
452
  dependencies = [
451
453
  "equivalent",
452
454
  "hashbrown 0.17.1",
@@ -694,9 +696,9 @@ dependencies = [
694
696
 
695
697
  [[package]]
696
698
  name = "regex"
697
- version = "1.12.3"
699
+ version = "1.13.1"
698
700
  source = "registry+https://github.com/rust-lang/crates.io-index"
699
- checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276"
701
+ checksum = "f020237b6c8eed93db2e2cb53c00c60a8e1bc73da7d073199a1180401450218d"
700
702
  dependencies = [
701
703
  "aho-corasick",
702
704
  "memchr",
@@ -706,9 +708,9 @@ dependencies = [
706
708
 
707
709
  [[package]]
708
710
  name = "regex-automata"
709
- version = "0.4.14"
711
+ version = "0.4.18"
710
712
  source = "registry+https://github.com/rust-lang/crates.io-index"
711
- checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f"
713
+ checksum = "ad8553b9b26413251cbf30e620595c7a41b3887f03da04579c0e6b0d6a06b4b2"
712
714
  dependencies = [
713
715
  "aho-corasick",
714
716
  "memchr",
@@ -717,9 +719,9 @@ dependencies = [
717
719
 
718
720
  [[package]]
719
721
  name = "regex-syntax"
720
- version = "0.8.10"
722
+ version = "0.8.11"
721
723
  source = "registry+https://github.com/rust-lang/crates.io-index"
722
- checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a"
724
+ checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4"
723
725
 
724
726
  [[package]]
725
727
  name = "rustix"
@@ -761,9 +763,9 @@ dependencies = [
761
763
 
762
764
  [[package]]
763
765
  name = "serde-saphyr"
764
- version = "1.0.1"
766
+ version = "1.3.0"
765
767
  source = "registry+https://github.com/rust-lang/crates.io-index"
766
- checksum = "af2c6921c8ce48fb1b052b457619d008834039d80325992ed3bc55bbe6c155ad"
768
+ checksum = "b8050abb251097357e24aff63ba2c52a6309ecb7d23a5474023df960a02694d8"
767
769
  dependencies = [
768
770
  "annotate-snippets",
769
771
  "base64",
@@ -861,7 +863,7 @@ checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03"
861
863
  [[package]]
862
864
  name = "sqllineage"
863
865
  version = "0.2.0"
864
- source = "git+https://github.com/funcpp/sqllineage.git?rev=4f6be31ce421af49c7dc87fb22e2b8d6c0156b57#4f6be31ce421af49c7dc87fb22e2b8d6c0156b57"
866
+ source = "git+https://github.com/funcpp/sqllineage.git?rev=b010d8083c60aee977055ea36f8a6807c1d51c62#b010d8083c60aee977055ea36f8a6807c1d51c62"
865
867
  dependencies = [
866
868
  "serde",
867
869
  "serde_json",
@@ -947,18 +949,18 @@ dependencies = [
947
949
 
948
950
  [[package]]
949
951
  name = "thiserror"
950
- version = "2.0.20"
952
+ version = "2.0.21"
951
953
  source = "registry+https://github.com/rust-lang/crates.io-index"
952
- checksum = "ec86235f5fcc2a73650310756d2ac5b138a5780bbbdfae3eeccec992c435ba4f"
954
+ checksum = "09e52cb86a36cede5cb101bf8908837b3e4c6e5e59fe7fd85c23fb56200d189e"
953
955
  dependencies = [
954
956
  "thiserror-impl",
955
957
  ]
956
958
 
957
959
  [[package]]
958
960
  name = "thiserror-impl"
959
- version = "2.0.20"
961
+ version = "2.0.21"
960
962
  source = "registry+https://github.com/rust-lang/crates.io-index"
961
- checksum = "bc04cd3e1236dd4a98afca4569f2deb3f120e5422a4023be2cb683f8486292af"
963
+ checksum = "fe5197923287db20a58125f0bc85c062f7f2c892de97b18c356f9efb14b28524"
962
964
  dependencies = [
963
965
  "proc-macro2",
964
966
  "quote",
@@ -3,7 +3,7 @@ members = ["crates/*"]
3
3
  resolver = "3"
4
4
 
5
5
  [workspace.package]
6
- version = "0.2.4-rc.3"
6
+ version = "0.2.6-rc.1"
7
7
  edition = "2024"
8
8
  license = "MIT"
9
9
  repository = "https://github.com/eitsupi/dlin"
@@ -23,7 +23,7 @@ indexmap = "2"
23
23
  minijinja = "2"
24
24
  rayon = "1"
25
25
  globset = "0.4"
26
- sqllineage = { git = "https://github.com/funcpp/sqllineage.git", rev = "4f6be31ce421af49c7dc87fb22e2b8d6c0156b57", default-features = false }
26
+ sqllineage = { git = "https://github.com/funcpp/sqllineage.git", rev = "b010d8083c60aee977055ea36f8a6807c1d51c62", default-features = false }
27
27
  # Must stay in lockstep with the sqlparser version sqllineage depends on; see
28
28
  # `sqlparser_version_matches_sqllineage` in dlin-core.
29
29
  sqlparser = { version = "0.62", features = ["serde", "visitor"] }
@@ -38,7 +38,7 @@ insta = "1"
38
38
  serial_test = "4.0.1"
39
39
 
40
40
  # internal
41
- dlin-core = { version = "0.2.4-rc.3", path = "crates/dlin-core" }
41
+ dlin-core = { version = "0.2.6-rc.1", path = "crates/dlin-core" }
42
42
 
43
43
  [workspace.lints.rust]
44
44
  unexpected_cfgs = { level = "warn", check-cfg = ['cfg(tarpaulin_include)'] }
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dlin-cli
3
- Version: 0.2.4rc3
3
+ Version: 0.2.6rc1
4
4
  Classifier: Development Status :: 4 - Beta
5
5
  Classifier: Environment :: Console
6
6
  Classifier: Intended Audience :: Developers
@@ -30,7 +30,7 @@ dbt model lineage CLI. Parses SQL files directly or reads a compiled `manifest.j
30
30
 
31
31
  Works for developers navigating live SQL files, analysts exploring a shared manifest, AI agents via CLI prompt or MCP server, and CI pipelines.
32
32
 
33
- Column-level lineage (`dlin column upstream` / `dlin column downstream`) is also available. It requires `manifest.json`.
33
+ Column-level lineage (`dlin column upstream` / `dlin column downstream`) requires a compiled `manifest.json` and is usable in practice while remaining Experimental for coverage reasons.
34
34
 
35
35
  ## Motivation
36
36
 
@@ -40,7 +40,7 @@ dlin is designed to fill that gap: a CLI tool that lets AI agents understand a d
40
40
 
41
41
  To replace `grep`, speed and size matter. dlin is a small, self-contained binary with no runtime dependencies. It parses SQL directly, evaluates common Jinja patterns without Python, parallelizes file I/O, and caches aggressively.
42
42
 
43
- The key idea behind dlin is that finding the right models fast is what matters most. The hard part for agents is knowing which models to look at in the first place. dlin focuses on making model-level lineage as fast as possible, and also offers experimental column-level lineage for deeper analysis.
43
+ The key idea behind dlin is that finding the right models fast is what matters most. The hard part for agents is knowing which models to look at in the first place. dlin focuses on making model-level lineage fast and provides column-level lineage for deeper analysis.
44
44
 
45
45
  ## Install
46
46
 
@@ -94,9 +94,9 @@ git diff --name-only main | dlin graph -o json
94
94
 
95
95
  dlin supports two source modes for model-level commands.
96
96
 
97
- **SQL parse mode (default)** is for developers working with a live dbt project. dlin reads `ref()` and `source()` calls directly from SQL files without running `dbt compile`. It works immediately as you edit models, with no compilation step needed.
97
+ **SQL parse mode (default)** is for developers editing a live dbt project. It reads `ref()` and `source()` directly from SQL without waiting for `dbt compile`, so model-level lineage quickly identifies the related models. Read the relevant SQL for exact transformation behavior.
98
98
 
99
- **Manifest mode** (`--source manifest`) is for analysts or agents who have access only to a compiled `manifest.json`. A developer runs `dbt compile` once and distributes the result; anyone with that file can then explore the full project structure with dlin without needing SQL files or a Python environment.
99
+ **Manifest mode** (`--source manifest`) is for analysts or agents analyzing compiled state rather than editing live SQL. A developer compiles once and shares `manifest.json`; users explore the resolved graph without SQL or Python. Use column-level lineage when a field-level trace is needed; it requires the compiled manifest.
100
100
 
101
101
  ```sh
102
102
  # SQL parse mode: reads SQL files directly (default)
@@ -111,7 +111,7 @@ For model-name inputs, `manifest.json` is the only file needed in manifest mode.
111
111
 
112
112
  ### Limitations of SQL parse mode
113
113
 
114
- - `var()` resolves from `dbt_project.yml` only (`--vars` CLI overrides not supported)
114
+ - `var()` resolves from `vars.yml` or `dbt_project.yml` (`--vars` CLI overrides not supported)
115
115
  - Runtime context (`target.type`, `env_var()`) is not evaluated
116
116
  - Conditional Jinja branches use default values; non-default paths may be missed
117
117
  - Generic test IDs are dlin-specific (e.g. `test.not_null.orders.order_id`) and do not match dbt's naming; use manifest mode when exact test IDs matter
@@ -168,7 +168,7 @@ Pass `--dialect` to match your project's SQL dialect for accurate column lineage
168
168
  - **Impact analysis with severity**: `dlin impact` scores downstream nodes and flags exposure reachability
169
169
  - **Composable**: stdin accepts model names or file paths; pipe with `jq`, `dlin list`, `git diff`, etc.
170
170
  - **Agent-friendly**: `--error-format json` emits structured `{"level","what","why","hint"}` on stderr; `--help` is designed for tool discovery
171
- - **Column-level lineage** (experimental): traces columns across models with transformation classification; requires `manifest.json`
171
+ - **Column-level lineage** (experimental): traces columns across models with transformation classification through the Rust lineage backend; requires `manifest.json`
172
172
 
173
173
  ## Mermaid diagrams
174
174
 
@@ -304,10 +304,7 @@ Output formats: ASCII (default), JSON, Mermaid, Graphviz DOT, Plain, SVG, HTML.
304
304
 
305
305
  ## Column-level lineage (Experimental)
306
306
 
307
- > [!WARNING]
308
- > Column-level lineage uses [sqllineage](https://github.com/funcpp/sqllineage) for SQL parsing and lineage extraction. The production backend directly supports Generic, PostgreSQL, MySQL, Hive, Databricks, Snowflake, BigQuery, DuckDB, SQLite, Spark, Trino, Redshift, T-SQL, and ClickHouse. The `dlin` CLI and MCP resolve other recognized dialects to Generic with a warning; direct `dlin-core` API callers receive an unsupported-dialect error instead. Coverage still varies by SQL complexity and dialect, and patterns such as `SELECT *` chains, STRUCT expansion, and some database-specific syntax may remain unresolved.
309
-
310
- `dlin column upstream` and `dlin column downstream` trace columns across models. Unlike model-level commands, they always require a compiled `manifest.json`. Run `dbt compile` first.
307
+ `dlin column upstream` and `dlin column downstream` trace columns across models. They require a compiled `manifest.json`, so run `dbt compile` first. Regression fixtures and real dbt project validation show that column-level lineage is usable in practice. Experimental reflects the Rust stack's shorter production history and remaining cross-dialect and complex-SQL coverage gaps, not a prototype-only status.
311
308
 
312
309
  ```sh
313
310
  # Where does each output column of orders come from?
@@ -424,6 +421,18 @@ flowchart LR
424
421
 
425
422
  `stg_orders.order_id` flows directly into `orders.order_id` and `order_enriched.order_id`. `orders.order_id` is then aggregated into `customers.order_count`. Each edge shows its per-hop transformation type.
426
423
 
424
+ ### Performance benchmark
425
+
426
+ Correctness-gated means from the synthetic scalability run (3 runs, 1 warmup):
427
+
428
+ | Workload | dlin 0.2.4 | [Parrant 0.17.2](https://pypi.org/project/parrant/0.17.2/) | [dbt-meta 0.3.8](https://pypi.org/project/dbt-meta/0.3.8/) |
429
+ | --- | ---: | ---: | ---: |
430
+ | Volume, 100,150 columns, single upstream | 88.9 ms | 37.4 s | build >120 s timeout; query not run |
431
+ | Deep 64, single upstream | 115 ms | 1.42 s | build 4.86 s; query 411 ms |
432
+ | Fan-out 128, downstream | 114 ms | 1.78 s | build 6.47 s; query 363 ms |
433
+
434
+ These synthetic results use artifacts derived from the real dbt fixture. Native Rust avoids Python startup and dlin showed lower latency here; dlin uses `--no-cache`, Parrant includes parsing, and dbt-meta query excludes build. They are not a general ranking; see the [full results and reproduction](benchmarks/column-lineage/results/published/scalability/summary.md).
435
+
427
436
  ### Known limitations
428
437
 
429
438
  - **Requires `dbt compile`**: no SQL parse mode fallback; manifest with compiled SQL is always needed
@@ -8,7 +8,7 @@ dbt model lineage CLI. Parses SQL files directly or reads a compiled `manifest.j
8
8
 
9
9
  Works for developers navigating live SQL files, analysts exploring a shared manifest, AI agents via CLI prompt or MCP server, and CI pipelines.
10
10
 
11
- Column-level lineage (`dlin column upstream` / `dlin column downstream`) is also available. It requires `manifest.json`.
11
+ Column-level lineage (`dlin column upstream` / `dlin column downstream`) requires a compiled `manifest.json` and is usable in practice while remaining Experimental for coverage reasons.
12
12
 
13
13
  ## Motivation
14
14
 
@@ -18,7 +18,7 @@ dlin is designed to fill that gap: a CLI tool that lets AI agents understand a d
18
18
 
19
19
  To replace `grep`, speed and size matter. dlin is a small, self-contained binary with no runtime dependencies. It parses SQL directly, evaluates common Jinja patterns without Python, parallelizes file I/O, and caches aggressively.
20
20
 
21
- The key idea behind dlin is that finding the right models fast is what matters most. The hard part for agents is knowing which models to look at in the first place. dlin focuses on making model-level lineage as fast as possible, and also offers experimental column-level lineage for deeper analysis.
21
+ The key idea behind dlin is that finding the right models fast is what matters most. The hard part for agents is knowing which models to look at in the first place. dlin focuses on making model-level lineage fast and provides column-level lineage for deeper analysis.
22
22
 
23
23
  ## Install
24
24
 
@@ -72,9 +72,9 @@ git diff --name-only main | dlin graph -o json
72
72
 
73
73
  dlin supports two source modes for model-level commands.
74
74
 
75
- **SQL parse mode (default)** is for developers working with a live dbt project. dlin reads `ref()` and `source()` calls directly from SQL files without running `dbt compile`. It works immediately as you edit models, with no compilation step needed.
75
+ **SQL parse mode (default)** is for developers editing a live dbt project. It reads `ref()` and `source()` directly from SQL without waiting for `dbt compile`, so model-level lineage quickly identifies the related models. Read the relevant SQL for exact transformation behavior.
76
76
 
77
- **Manifest mode** (`--source manifest`) is for analysts or agents who have access only to a compiled `manifest.json`. A developer runs `dbt compile` once and distributes the result; anyone with that file can then explore the full project structure with dlin without needing SQL files or a Python environment.
77
+ **Manifest mode** (`--source manifest`) is for analysts or agents analyzing compiled state rather than editing live SQL. A developer compiles once and shares `manifest.json`; users explore the resolved graph without SQL or Python. Use column-level lineage when a field-level trace is needed; it requires the compiled manifest.
78
78
 
79
79
  ```sh
80
80
  # SQL parse mode: reads SQL files directly (default)
@@ -89,7 +89,7 @@ For model-name inputs, `manifest.json` is the only file needed in manifest mode.
89
89
 
90
90
  ### Limitations of SQL parse mode
91
91
 
92
- - `var()` resolves from `dbt_project.yml` only (`--vars` CLI overrides not supported)
92
+ - `var()` resolves from `vars.yml` or `dbt_project.yml` (`--vars` CLI overrides not supported)
93
93
  - Runtime context (`target.type`, `env_var()`) is not evaluated
94
94
  - Conditional Jinja branches use default values; non-default paths may be missed
95
95
  - Generic test IDs are dlin-specific (e.g. `test.not_null.orders.order_id`) and do not match dbt's naming; use manifest mode when exact test IDs matter
@@ -146,7 +146,7 @@ Pass `--dialect` to match your project's SQL dialect for accurate column lineage
146
146
  - **Impact analysis with severity**: `dlin impact` scores downstream nodes and flags exposure reachability
147
147
  - **Composable**: stdin accepts model names or file paths; pipe with `jq`, `dlin list`, `git diff`, etc.
148
148
  - **Agent-friendly**: `--error-format json` emits structured `{"level","what","why","hint"}` on stderr; `--help` is designed for tool discovery
149
- - **Column-level lineage** (experimental): traces columns across models with transformation classification; requires `manifest.json`
149
+ - **Column-level lineage** (experimental): traces columns across models with transformation classification through the Rust lineage backend; requires `manifest.json`
150
150
 
151
151
  ## Mermaid diagrams
152
152
 
@@ -282,10 +282,7 @@ Output formats: ASCII (default), JSON, Mermaid, Graphviz DOT, Plain, SVG, HTML.
282
282
 
283
283
  ## Column-level lineage (Experimental)
284
284
 
285
- > [!WARNING]
286
- > Column-level lineage uses [sqllineage](https://github.com/funcpp/sqllineage) for SQL parsing and lineage extraction. The production backend directly supports Generic, PostgreSQL, MySQL, Hive, Databricks, Snowflake, BigQuery, DuckDB, SQLite, Spark, Trino, Redshift, T-SQL, and ClickHouse. The `dlin` CLI and MCP resolve other recognized dialects to Generic with a warning; direct `dlin-core` API callers receive an unsupported-dialect error instead. Coverage still varies by SQL complexity and dialect, and patterns such as `SELECT *` chains, STRUCT expansion, and some database-specific syntax may remain unresolved.
287
-
288
- `dlin column upstream` and `dlin column downstream` trace columns across models. Unlike model-level commands, they always require a compiled `manifest.json`. Run `dbt compile` first.
285
+ `dlin column upstream` and `dlin column downstream` trace columns across models. They require a compiled `manifest.json`, so run `dbt compile` first. Regression fixtures and real dbt project validation show that column-level lineage is usable in practice. Experimental reflects the Rust stack's shorter production history and remaining cross-dialect and complex-SQL coverage gaps, not a prototype-only status.
289
286
 
290
287
  ```sh
291
288
  # Where does each output column of orders come from?
@@ -402,6 +399,18 @@ flowchart LR
402
399
 
403
400
  `stg_orders.order_id` flows directly into `orders.order_id` and `order_enriched.order_id`. `orders.order_id` is then aggregated into `customers.order_count`. Each edge shows its per-hop transformation type.
404
401
 
402
+ ### Performance benchmark
403
+
404
+ Correctness-gated means from the synthetic scalability run (3 runs, 1 warmup):
405
+
406
+ | Workload | dlin 0.2.4 | [Parrant 0.17.2](https://pypi.org/project/parrant/0.17.2/) | [dbt-meta 0.3.8](https://pypi.org/project/dbt-meta/0.3.8/) |
407
+ | --- | ---: | ---: | ---: |
408
+ | Volume, 100,150 columns, single upstream | 88.9 ms | 37.4 s | build >120 s timeout; query not run |
409
+ | Deep 64, single upstream | 115 ms | 1.42 s | build 4.86 s; query 411 ms |
410
+ | Fan-out 128, downstream | 114 ms | 1.78 s | build 6.47 s; query 363 ms |
411
+
412
+ These synthetic results use artifacts derived from the real dbt fixture. Native Rust avoids Python startup and dlin showed lower latency here; dlin uses `--no-cache`, Parrant includes parsing, and dbt-meta query excludes build. They are not a general ranking; see the [full results and reproduction](benchmarks/column-lineage/results/published/scalability/summary.md).
413
+
405
414
  ### Known limitations
406
415
 
407
416
  - **Requires `dbt compile`**: no SQL parse mode fallback; manifest with compiled SQL is always needed
@@ -33,6 +33,7 @@ tempfile = { workspace = true }
33
33
  regex = { workspace = true }
34
34
  serde_json = { workspace = true }
35
35
  serde-saphyr = { workspace = true }
36
+ insta = { workspace = true }
36
37
 
37
38
  [lints]
38
39
  workspace = true
@@ -8,7 +8,7 @@ dbt model lineage CLI. Parses SQL files directly or reads a compiled `manifest.j
8
8
 
9
9
  Works for developers navigating live SQL files, analysts exploring a shared manifest, AI agents via CLI prompt or MCP server, and CI pipelines.
10
10
 
11
- Column-level lineage (`dlin column upstream` / `dlin column downstream`) is also available. It requires `manifest.json`.
11
+ Column-level lineage (`dlin column upstream` / `dlin column downstream`) requires a compiled `manifest.json` and is usable in practice while remaining Experimental for coverage reasons.
12
12
 
13
13
  ## Motivation
14
14
 
@@ -18,7 +18,7 @@ dlin is designed to fill that gap: a CLI tool that lets AI agents understand a d
18
18
 
19
19
  To replace `grep`, speed and size matter. dlin is a small, self-contained binary with no runtime dependencies. It parses SQL directly, evaluates common Jinja patterns without Python, parallelizes file I/O, and caches aggressively.
20
20
 
21
- The key idea behind dlin is that finding the right models fast is what matters most. The hard part for agents is knowing which models to look at in the first place. dlin focuses on making model-level lineage as fast as possible, and also offers experimental column-level lineage for deeper analysis.
21
+ The key idea behind dlin is that finding the right models fast is what matters most. The hard part for agents is knowing which models to look at in the first place. dlin focuses on making model-level lineage fast and provides column-level lineage for deeper analysis.
22
22
 
23
23
  ## Install
24
24
 
@@ -72,9 +72,9 @@ git diff --name-only main | dlin graph -o json
72
72
 
73
73
  dlin supports two source modes for model-level commands.
74
74
 
75
- **SQL parse mode (default)** is for developers working with a live dbt project. dlin reads `ref()` and `source()` calls directly from SQL files without running `dbt compile`. It works immediately as you edit models, with no compilation step needed.
75
+ **SQL parse mode (default)** is for developers editing a live dbt project. It reads `ref()` and `source()` directly from SQL without waiting for `dbt compile`, so model-level lineage quickly identifies the related models. Read the relevant SQL for exact transformation behavior.
76
76
 
77
- **Manifest mode** (`--source manifest`) is for analysts or agents who have access only to a compiled `manifest.json`. A developer runs `dbt compile` once and distributes the result; anyone with that file can then explore the full project structure with dlin without needing SQL files or a Python environment.
77
+ **Manifest mode** (`--source manifest`) is for analysts or agents analyzing compiled state rather than editing live SQL. A developer compiles once and shares `manifest.json`; users explore the resolved graph without SQL or Python. Use column-level lineage when a field-level trace is needed; it requires the compiled manifest.
78
78
 
79
79
  ```sh
80
80
  # SQL parse mode: reads SQL files directly (default)
@@ -89,7 +89,7 @@ For model-name inputs, `manifest.json` is the only file needed in manifest mode.
89
89
 
90
90
  ### Limitations of SQL parse mode
91
91
 
92
- - `var()` resolves from `dbt_project.yml` only (`--vars` CLI overrides not supported)
92
+ - `var()` resolves from `vars.yml` or `dbt_project.yml` (`--vars` CLI overrides not supported)
93
93
  - Runtime context (`target.type`, `env_var()`) is not evaluated
94
94
  - Conditional Jinja branches use default values; non-default paths may be missed
95
95
  - Generic test IDs are dlin-specific (e.g. `test.not_null.orders.order_id`) and do not match dbt's naming; use manifest mode when exact test IDs matter
@@ -146,7 +146,7 @@ Pass `--dialect` to match your project's SQL dialect for accurate column lineage
146
146
  - **Impact analysis with severity**: `dlin impact` scores downstream nodes and flags exposure reachability
147
147
  - **Composable**: stdin accepts model names or file paths; pipe with `jq`, `dlin list`, `git diff`, etc.
148
148
  - **Agent-friendly**: `--error-format json` emits structured `{"level","what","why","hint"}` on stderr; `--help` is designed for tool discovery
149
- - **Column-level lineage** (experimental): traces columns across models with transformation classification; requires `manifest.json`
149
+ - **Column-level lineage** (experimental): traces columns across models with transformation classification through the Rust lineage backend; requires `manifest.json`
150
150
 
151
151
  ## Mermaid diagrams
152
152
 
@@ -282,10 +282,7 @@ Output formats: ASCII (default), JSON, Mermaid, Graphviz DOT, Plain, SVG, HTML.
282
282
 
283
283
  ## Column-level lineage (Experimental)
284
284
 
285
- > [!WARNING]
286
- > Column-level lineage uses [sqllineage](https://github.com/funcpp/sqllineage) for SQL parsing and lineage extraction. The production backend directly supports Generic, PostgreSQL, MySQL, Hive, Databricks, Snowflake, BigQuery, DuckDB, SQLite, Spark, Trino, Redshift, T-SQL, and ClickHouse. The `dlin` CLI and MCP resolve other recognized dialects to Generic with a warning; direct `dlin-core` API callers receive an unsupported-dialect error instead. Coverage still varies by SQL complexity and dialect, and patterns such as `SELECT *` chains, STRUCT expansion, and some database-specific syntax may remain unresolved.
287
-
288
- `dlin column upstream` and `dlin column downstream` trace columns across models. Unlike model-level commands, they always require a compiled `manifest.json`. Run `dbt compile` first.
285
+ `dlin column upstream` and `dlin column downstream` trace columns across models. They require a compiled `manifest.json`, so run `dbt compile` first. Regression fixtures and real dbt project validation show that column-level lineage is usable in practice. Experimental reflects the Rust stack's shorter production history and remaining cross-dialect and complex-SQL coverage gaps, not a prototype-only status.
289
286
 
290
287
  ```sh
291
288
  # Where does each output column of orders come from?
@@ -402,6 +399,18 @@ flowchart LR
402
399
 
403
400
  `stg_orders.order_id` flows directly into `orders.order_id` and `order_enriched.order_id`. `orders.order_id` is then aggregated into `customers.order_count`. Each edge shows its per-hop transformation type.
404
401
 
402
+ ### Performance benchmark
403
+
404
+ Correctness-gated means from the synthetic scalability run (3 runs, 1 warmup):
405
+
406
+ | Workload | dlin 0.2.4 | [Parrant 0.17.2](https://pypi.org/project/parrant/0.17.2/) | [dbt-meta 0.3.8](https://pypi.org/project/dbt-meta/0.3.8/) |
407
+ | --- | ---: | ---: | ---: |
408
+ | Volume, 100,150 columns, single upstream | 88.9 ms | 37.4 s | build >120 s timeout; query not run |
409
+ | Deep 64, single upstream | 115 ms | 1.42 s | build 4.86 s; query 411 ms |
410
+ | Fan-out 128, downstream | 114 ms | 1.78 s | build 6.47 s; query 363 ms |
411
+
412
+ These synthetic results use artifacts derived from the real dbt fixture. Native Rust avoids Python startup and dlin showed lower latency here; dlin uses `--no-cache`, Parrant includes parsing, and dbt-meta query excludes build. They are not a general ranking; see the [full results and reproduction](benchmarks/column-lineage/results/published/scalability/summary.md).
413
+
405
414
  ### Known limitations
406
415
 
407
416
  - **Requires `dbt compile`**: no SQL parse mode fallback; manifest with compiled SQL is always needed