sql-code-graph 1.0.2__tar.gz → 1.1.0__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 (416) hide show
  1. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/ARCHITECTURE_REVIEW.md +121 -0
  2. sql_code_graph-1.1.0/CHANGELOG.md +102 -0
  3. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/CLAUDE.md +4 -2
  4. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/PKG-INFO +13 -2
  5. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/README.md +12 -1
  6. sql_code_graph-1.1.0/plan/feature_34_unused_presentation_segregation.md +433 -0
  7. sql_code_graph-1.1.0/plan/feature_35_external_downstream_injection.md +617 -0
  8. sql_code_graph-1.1.0/plan/feature_F2_bundle_claude_skill.md +286 -0
  9. sql_code_graph-1.1.0/plan/hygiene_config_path_and_survivors.md +601 -0
  10. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/plan/measurements/sprint_08_changelogs_fullindex.json +14 -14
  11. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/plan/measurements/sprint_08_fullcorpus_index.json +15 -15
  12. sql_code_graph-1.1.0/plan/sprint_12_v1.1.0.md +1526 -0
  13. sql_code_graph-1.1.0/plan/sprint_13_v1.1.0_cluster_b.md +1001 -0
  14. sql_code_graph-1.1.0/plan/v1.1.0_cluster_b_provenance_trust.md +344 -0
  15. sql_code_graph-1.1.0/plan/v1.1.0_live_graph_freshness.md +400 -0
  16. sql_code_graph-1.1.0/plan/v1.1.1_batch_upsert_perf.md +596 -0
  17. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/pyproject.toml +1 -1
  18. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/src/sqlcg/__init__.py +1 -1
  19. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/src/sqlcg/cli/commands/analyze.py +115 -17
  20. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/src/sqlcg/cli/commands/db.py +17 -0
  21. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/src/sqlcg/cli/commands/find.py +7 -0
  22. sql_code_graph-1.1.0/src/sqlcg/cli/commands/git.py +154 -0
  23. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/src/sqlcg/cli/commands/index.py +30 -2
  24. sql_code_graph-1.1.0/src/sqlcg/cli/commands/mcp.py +176 -0
  25. sql_code_graph-1.1.0/src/sqlcg/cli/commands/reindex.py +283 -0
  26. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/src/sqlcg/core/config.py +80 -0
  27. sql_code_graph-1.1.0/src/sqlcg/core/freshness.py +134 -0
  28. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/src/sqlcg/core/graph_db.py +2 -0
  29. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/src/sqlcg/core/queries.cypher +24 -6
  30. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/src/sqlcg/core/queries.py +4 -1
  31. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/src/sqlcg/core/schema.cypher +13 -1
  32. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/src/sqlcg/core/schema.py +5 -1
  33. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/src/sqlcg/indexer/indexer.py +376 -160
  34. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/src/sqlcg/indexer/walker.py +3 -0
  35. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/src/sqlcg/parsers/ansi_parser.py +56 -0
  36. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/src/sqlcg/parsers/base.py +6 -3
  37. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/src/sqlcg/parsers/snowflake_parser.py +46 -6
  38. sql_code_graph-1.1.0/src/sqlcg/server/control.py +144 -0
  39. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/src/sqlcg/server/models.py +68 -0
  40. sql_code_graph-1.1.0/src/sqlcg/server/server.py +382 -0
  41. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/src/sqlcg/server/skill.py +20 -4
  42. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/src/sqlcg/server/tools.py +203 -13
  43. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/e2e/test_cli_index.py +74 -0
  44. sql_code_graph-1.1.0/tests/e2e/test_git_hook_install.py +294 -0
  45. sql_code_graph-1.1.0/tests/e2e/test_mcp_lifecycle.py +214 -0
  46. sql_code_graph-1.1.0/tests/integration/test_T34_presentation_segregation.py +347 -0
  47. sql_code_graph-1.1.0/tests/integration/test_T35_external_consumers.py +631 -0
  48. sql_code_graph-1.1.0/tests/integration/test_freshness_mcp.py +211 -0
  49. sql_code_graph-1.1.0/tests/integration/test_hygiene_config_root_reconciliation.py +224 -0
  50. sql_code_graph-1.1.0/tests/integration/test_indexer_batching.py +311 -0
  51. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/integration/test_indexer_commits.py +14 -7
  52. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/integration/test_parse_diagnostics.py +3 -3
  53. sql_code_graph-1.1.0/tests/integration/test_pr1_confidence_reason.py +284 -0
  54. sql_code_graph-1.1.0/tests/integration/test_pr2_source_location.py +531 -0
  55. sql_code_graph-1.1.0/tests/integration/test_pr3_kind_tagging.py +422 -0
  56. sql_code_graph-1.1.0/tests/integration/test_reindex_via_server.py +833 -0
  57. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/integration/test_star_resolution.py +12 -13
  58. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_F2_skill_render.py +45 -0
  59. sql_code_graph-1.1.0/tests/unit/test_T35_config_external_consumers.py +219 -0
  60. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_firstuser_findings.py +4 -3
  61. sql_code_graph-1.1.0/tests/unit/test_freshness_helper.py +328 -0
  62. sql_code_graph-1.1.0/tests/unit/test_git_hooks.py +548 -0
  63. sql_code_graph-1.1.0/tests/unit/test_hygiene_config_warning.py +246 -0
  64. sql_code_graph-1.1.0/tests/unit/test_include_working_tree.py +308 -0
  65. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_index_cmd.py +2 -2
  66. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_index_flags.py +2 -2
  67. sql_code_graph-1.1.0/tests/unit/test_mcp_control.py +295 -0
  68. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_pr07_observability.py +1 -1
  69. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_queries_loader.py +1 -1
  70. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_star_schema_unit.py +5 -5
  71. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_tools_hints.py +2 -1
  72. sql_code_graph-1.1.0/tests/unit/test_upsert_batch_invariant.py +127 -0
  73. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/uv.lock +1 -1
  74. sql_code_graph-1.0.2/CHANGELOG.md +0 -49
  75. sql_code_graph-1.0.2/plan/sprint_031.md +0 -1040
  76. sql_code_graph-1.0.2/plan/sprint_31_postmortem.md +0 -1040
  77. sql_code_graph-1.0.2/src/sqlcg/cli/commands/git.py +0 -104
  78. sql_code_graph-1.0.2/src/sqlcg/cli/commands/mcp.py +0 -73
  79. sql_code_graph-1.0.2/src/sqlcg/cli/commands/reindex.py +0 -173
  80. sql_code_graph-1.0.2/src/sqlcg/server/server.py +0 -100
  81. sql_code_graph-1.0.2/tests/e2e/test_git_hook_install.py +0 -116
  82. sql_code_graph-1.0.2/tests/integration/test_indexer_batching.py +0 -164
  83. sql_code_graph-1.0.2/tests/unit/test_git_hooks.py +0 -279
  84. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/.claude/agents/api-documenter.md +0 -0
  85. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/.claude/agents/architect-planner.md +0 -0
  86. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/.claude/agents/architect-reviewer.md +0 -0
  87. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/.claude/agents/code-reviewer.md +0 -0
  88. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/.claude/agents/developer.md +0 -0
  89. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/.claude/agents/plan-reviewer.md +0 -0
  90. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/.claude/agents/sprint-planner.md +0 -0
  91. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  92. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  93. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  94. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/.github/workflows/benchmark.yml +0 -0
  95. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/.github/workflows/e2e-tests.yml +0 -0
  96. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/.github/workflows/release.yml +0 -0
  97. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/.github/workflows/test.yml +0 -0
  98. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/.gitignore +0 -0
  99. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/.pre-commit-config.yaml +0 -0
  100. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/.sqlcgignore +0 -0
  101. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/docs/AIRBNB_PARSE_REPORT.md +0 -0
  102. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/docs/cli.md +0 -0
  103. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/e2e_firstuser_report.md +0 -0
  104. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/e2e_run_20260528_101413.output +0 -0
  105. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/main.py +0 -0
  106. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/plan/WORKFLOW.md +0 -0
  107. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/plan/blueprint.md +0 -0
  108. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/plan/bundle_claude_skill.md +0 -0
  109. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/plan/fix_dynamic_table_parsing.md +0 -0
  110. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/plan/fix_expand_qualify_perf.md +0 -0
  111. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/plan/fix_firstuser_findings.md +0 -0
  112. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/plan/fix_schema_case_mismatch.md +0 -0
  113. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/plan/investigation_e5_e4.md +0 -0
  114. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/plan/living_codebase_resync.md +0 -0
  115. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/plan/measurements/schema_comparison_with_schema.json +0 -0
  116. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/plan/measurements/schema_comparison_without_schema.json +0 -0
  117. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/plan/measurements/sprint_pool_300s_plan.json +0 -0
  118. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/plan/parse_diagnostics.md +0 -0
  119. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/plan/parsing_errors_experiment.md +0 -0
  120. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/plan/snowflake_en_test_suite.md +0 -0
  121. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/plan/sprint_01.md +0 -0
  122. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/plan/sprint_01_deployment_pypi.md +0 -0
  123. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/plan/sprint_02.md +0 -0
  124. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/plan/sprint_02_v0.3.0_core.md +0 -0
  125. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/plan/sprint_03.md +0 -0
  126. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/plan/sprint_03_v0.3.1_postmortem.md +0 -0
  127. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/plan/sprint_04_column_lineage.md +0 -0
  128. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/plan/sprint_04_column_lineage_fix.md +0 -0
  129. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/plan/sprint_05_star_resolution.md +0 -0
  130. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/plan/sprint_06_lineage_coverage.md +0 -0
  131. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/plan/sprint_07_open_ecodes.md +0 -0
  132. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/plan/sprint_07_perf_and_live_test.md +0 -0
  133. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/plan/sprint_08_perf_upsert.md +0 -0
  134. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/plan/sprint_09_lineage_coverage.md +0 -0
  135. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/plan/sprint_10_anchor_tools.md +0 -0
  136. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/plan/sprint_11_v1.0.2_bugfix.md +0 -0
  137. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/plan/sprint_3.1_postmortem.md +0 -0
  138. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/plan/sqlcg.md +0 -0
  139. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/plan/trust_layer.md +0 -0
  140. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/profile.html +0 -0
  141. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/pyrightconfig.json +0 -0
  142. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/scripts/collect_parse_errors.py +0 -0
  143. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/scripts/generate_cli_docs.sh +0 -0
  144. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/src/sqlcg/__main__.py +0 -0
  145. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/src/sqlcg/cli/__init__.py +0 -0
  146. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/src/sqlcg/cli/commands/__init__.py +0 -0
  147. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/src/sqlcg/cli/commands/gain.py +0 -0
  148. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/src/sqlcg/cli/commands/install.py +0 -0
  149. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/src/sqlcg/cli/commands/report.py +0 -0
  150. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/src/sqlcg/cli/commands/uninstall.py +0 -0
  151. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/src/sqlcg/cli/commands/watch.py +0 -0
  152. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/src/sqlcg/cli/main.py +0 -0
  153. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/src/sqlcg/core/__init__.py +0 -0
  154. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/src/sqlcg/core/jobs.py +0 -0
  155. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/src/sqlcg/core/kuzu_backend.py +0 -0
  156. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/src/sqlcg/core/neo4j_backend.py +0 -0
  157. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/src/sqlcg/indexer/__init__.py +0 -0
  158. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/src/sqlcg/indexer/dbt_adapter.py +0 -0
  159. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/src/sqlcg/indexer/error_classify.py +0 -0
  160. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/src/sqlcg/indexer/git_delta.py +0 -0
  161. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/src/sqlcg/indexer/pool.py +0 -0
  162. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/src/sqlcg/indexer/watcher.py +0 -0
  163. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/src/sqlcg/lineage/__init__.py +0 -0
  164. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/src/sqlcg/lineage/aggregator.py +0 -0
  165. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/src/sqlcg/lineage/schema_resolver.py +0 -0
  166. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/src/sqlcg/metrics/__init__.py +0 -0
  167. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/src/sqlcg/metrics/store.py +0 -0
  168. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/src/sqlcg/parsers/__init__.py +0 -0
  169. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/src/sqlcg/parsers/bigquery_parser.py +0 -0
  170. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/src/sqlcg/parsers/postgres_parser.py +0 -0
  171. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/src/sqlcg/parsers/registry.py +0 -0
  172. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/src/sqlcg/parsers/tsql_parser.py +0 -0
  173. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/src/sqlcg/server/__init__.py +0 -0
  174. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/src/sqlcg/server/exceptions.py +0 -0
  175. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/src/sqlcg/server/noise_filter.py +0 -0
  176. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/src/sqlcg/utils/__init__.py +0 -0
  177. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/src/sqlcg/utils/hashing.py +0 -0
  178. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/src/sqlcg/utils/ignore.py +0 -0
  179. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/src/sqlcg/utils/logging.py +0 -0
  180. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/__init__.py +0 -0
  181. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/benchmarks/__init__.py +0 -0
  182. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/benchmarks/adversarial/200_join.sql +0 -0
  183. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/benchmarks/adversarial/500_union.sql +0 -0
  184. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/benchmarks/bench_indexer.py +0 -0
  185. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/benchmarks/conftest.py +0 -0
  186. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/benchmarks/golden_corpus/snowflake/case_normalization.sql +0 -0
  187. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/benchmarks/golden_corpus/snowflake/colon_cast.sql +0 -0
  188. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/benchmarks/golden_corpus/snowflake/colon_reserved_word.sql +0 -0
  189. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/benchmarks/golden_corpus/snowflake/copy_into.sql +0 -0
  190. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/benchmarks/golden_corpus/snowflake/create_procedure.sql +0 -0
  191. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/benchmarks/golden_corpus/snowflake/identifier_dynamic.sql +0 -0
  192. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/benchmarks/golden_corpus/snowflake/lateral_flatten.sql +0 -0
  193. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/benchmarks/golden_corpus/snowflake/qualify.sql +0 -0
  194. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/benchmarks/golden_corpus/snowflake/scripting_block.sql +0 -0
  195. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/benchmarks/golden_corpus/snowflake/three_part.sql +0 -0
  196. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/benchmarks/tpch/q01.sql +0 -0
  197. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/benchmarks/tpch/q02.sql +0 -0
  198. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/benchmarks/tpch/q03.sql +0 -0
  199. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/benchmarks/tpch/q04.sql +0 -0
  200. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/benchmarks/tpch/q05.sql +0 -0
  201. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/e2e/__init__.py +0 -0
  202. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/e2e/conftest.py +0 -0
  203. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/e2e/test_F2_skill_install_e2e.py +0 -0
  204. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/e2e/test_airbnb_e2e.py +0 -0
  205. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/e2e/test_golden_lineage.py +0 -0
  206. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/e2e/test_mcp_tools.py +0 -0
  207. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/e2e/test_parse_diagnostics_cli.py +0 -0
  208. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/e2e/test_star_resolution_e2e.py +0 -0
  209. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/e2e/test_watch.py +0 -0
  210. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/fixtures/airbnb/dim_hosts_cleansed.sql +0 -0
  211. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/fixtures/airbnb/dim_listings_cleansed.sql +0 -0
  212. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/fixtures/airbnb/fct_reviews.sql +0 -0
  213. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/fixtures/airbnb/mart_fullmoon_reviews.sql +0 -0
  214. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/fixtures/airbnb/raw_hosts.sql +0 -0
  215. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/fixtures/airbnb/raw_listings.sql +0 -0
  216. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/fixtures/airbnb/raw_reviews.sql +0 -0
  217. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/fixtures/airbnb/src_hosts.sql +0 -0
  218. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/fixtures/airbnb/src_listings.sql +0 -0
  219. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/fixtures/airbnb/src_reviews.sql +0 -0
  220. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/fixtures/bigquery/.gitkeep +0 -0
  221. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/fixtures/jaffle_shop/customers.sql +0 -0
  222. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/fixtures/jaffle_shop/orders.sql +0 -0
  223. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/fixtures/jaffle_shop/raw_orders.sql +0 -0
  224. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/fixtures/snowflake/base_tables.sql +0 -0
  225. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/fixtures/snowflake/reports.sql +0 -0
  226. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/fixtures/snowflake/views.sql +0 -0
  227. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/fixtures/star_corpus/ddl_src.sql +0 -0
  228. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/fixtures/star_corpus/ddl_tgt.sql +0 -0
  229. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/fixtures/star_corpus/etl_alias_star.sql +0 -0
  230. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/fixtures/star_corpus/etl_star.sql +0 -0
  231. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/fixtures/synthetic/base_tables.sql +0 -0
  232. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/fixtures/synthetic/reports.sql +0 -0
  233. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/fixtures/synthetic/views.sql +0 -0
  234. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/integration/__init__.py +0 -0
  235. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/integration/snowflake/__init__.py +0 -0
  236. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/integration/snowflake/test_insert_select.py +0 -0
  237. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/integration/test_anchor_tools.py +0 -0
  238. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/integration/test_bulk_upsert.py +0 -0
  239. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/integration/test_column_lineage_e2e.py +0 -0
  240. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/integration/test_cross_file_lineage.py +0 -0
  241. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/integration/test_dialect_matrix.py +0 -0
  242. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/integration/test_e36_xfile_regression_guard.py +0 -0
  243. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/integration/test_indexer_to_graph.py +0 -0
  244. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/integration/test_live_anchors.py +0 -0
  245. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/integration/test_resync.py +0 -0
  246. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/integration/test_temp_table_lineage.py +0 -0
  247. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/perf/__init__.py +0 -0
  248. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/perf/test_perf.py +0 -0
  249. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E10/__init__.py +0 -0
  250. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E11/__init__.py +0 -0
  251. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E12/__init__.py +0 -0
  252. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E12/e12_json_path.sql +0 -0
  253. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E12/e12_lateral_flatten.sql +0 -0
  254. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E12/test_e12.py +0 -0
  255. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E13/__init__.py +0 -0
  256. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E14/__init__.py +0 -0
  257. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E15/__init__.py +0 -0
  258. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E16/__init__.py +0 -0
  259. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E16/e16_merge.sql +0 -0
  260. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E16/e16_merge_delete.sql +0 -0
  261. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E16/test_e16.py +0 -0
  262. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E17/__init__.py +0 -0
  263. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E18/__init__.py +0 -0
  264. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E18/e18_decode.sql +0 -0
  265. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E18/e18_iff_decode.sql +0 -0
  266. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E18/e18_nvl2.sql +0 -0
  267. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E18/test_e18.py +0 -0
  268. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E19/__init__.py +0 -0
  269. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E2/__init__.py +0 -0
  270. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E2/e2_expr_alias.sql +0 -0
  271. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E2/e2_function_alias.sql +0 -0
  272. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E2/e2_multiply_alias.sql +0 -0
  273. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E2/test_e2.py +0 -0
  274. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E20/__init__.py +0 -0
  275. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E21/__init__.py +0 -0
  276. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E21/e21_alias_forward_ref.sql +0 -0
  277. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E21/e21_three_level_chain.sql +0 -0
  278. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E21/test_e21.py +0 -0
  279. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E22/__init__.py +0 -0
  280. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E23/__init__.py +0 -0
  281. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E23/e23_stored_proc.sql +0 -0
  282. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E23/e23_stored_proc_multi.sql +0 -0
  283. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E23/test_e23.py +0 -0
  284. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E24/__init__.py +0 -0
  285. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E25/__init__.py +0 -0
  286. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E25/e25_cross_db.sql +0 -0
  287. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E25/e25_two_part.sql +0 -0
  288. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E25/test_e25.py +0 -0
  289. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E25/test_e25_full_id.py +0 -0
  290. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E26/__init__.py +0 -0
  291. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E27/__init__.py +0 -0
  292. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E27/e27_nested_udf.sql +0 -0
  293. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E27/e27_udf.sql +0 -0
  294. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E27/test_e27.py +0 -0
  295. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E28/__init__.py +0 -0
  296. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E29/__init__.py +0 -0
  297. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E3/__init__.py +0 -0
  298. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E3/e3_alter_table.sql +0 -0
  299. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E3/e3_create_sequence.sql +0 -0
  300. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E3/e3_ddl_only.sql +0 -0
  301. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E3/test_e3.py +0 -0
  302. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E30/__init__.py +0 -0
  303. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E31/__init__.py +0 -0
  304. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E32/__init__.py +0 -0
  305. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E33/__init__.py +0 -0
  306. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E34/__init__.py +0 -0
  307. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E35/__init__.py +0 -0
  308. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E36/__init__.py +0 -0
  309. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E36/e36_temp_multi_use.sql +0 -0
  310. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E36/e36_temp_table.sql +0 -0
  311. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E36/test_e36.py +0 -0
  312. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E36/test_e36_xfile.py +0 -0
  313. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E37/__init__.py +0 -0
  314. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E38/__init__.py +0 -0
  315. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E4/__init__.py +0 -0
  316. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E4/e4_execute_immediate.sql +0 -0
  317. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E4/e4_if_not_exists.sql +0 -0
  318. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E4/e4_unexpected_token.sql +0 -0
  319. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E4/e4_unpivot.sql +0 -0
  320. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E4/test_e4.py +0 -0
  321. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E5/__init__.py +0 -0
  322. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E5/e5_cte_missing_source.sql +0 -0
  323. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E5/e5_multi_cte.sql +0 -0
  324. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E5/e5_nested_cte.sql +0 -0
  325. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E5/test_e5.py +0 -0
  326. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E5/test_e5_cte_projection.py +0 -0
  327. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E8/__init__.py +0 -0
  328. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E8/e8_dynamic_sources.sql +0 -0
  329. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E8/e8_seq_nextval.sql +0 -0
  330. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E8/e8_uuid.sql +0 -0
  331. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E8/test_e8.py +0 -0
  332. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E9/__init__.py +0 -0
  333. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E_aggregates/__init__.py +0 -0
  334. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E_aggregates/fixture_sum_absent_cross_schema.sql +0 -0
  335. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E_aggregates/fixture_sum_case_when.sql +0 -0
  336. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E_aggregates/fixture_sum_present_source.sql +0 -0
  337. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E_aggregates/test_e_aggregates.py +0 -0
  338. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E_date_functions/__init__.py +0 -0
  339. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E_date_functions/fixture_date_aliased.sql +0 -0
  340. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E_date_functions/fixture_date_unaliased.sql +0 -0
  341. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E_date_functions/fixture_datediff_unaliased.sql +0 -0
  342. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E_date_functions/fixture_year_unaliased.sql +0 -0
  343. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E_date_functions/test_e_date_functions.py +0 -0
  344. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/README.md +0 -0
  345. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/__init__.py +0 -0
  346. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/anchors/__init__.py +0 -0
  347. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/anchors/fixture_etl.sql +0 -0
  348. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/anchors/fixture_omloopsnelheid.sql +0 -0
  349. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/anchors/fixture_semantic.sql +0 -0
  350. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/anchors/fixture_source.sql +0 -0
  351. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/anchors/test_anchor_ma_aantal_op_order.py +0 -0
  352. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/anchors/test_anchor_omloopsnelheid.py +0 -0
  353. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/conftest.py +0 -0
  354. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/test_plan_review_gates.py +0 -0
  355. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/__init__.py +0 -0
  356. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/snowflake/__init__.py +0 -0
  357. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/snowflake/test_scripting_noise.py +0 -0
  358. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_F2_install_skill.py +0 -0
  359. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_F2_uninstall_skill.py +0 -0
  360. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_T09_01_qualify_once.py +0 -0
  361. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_T09_02_ddl_skip.py +0 -0
  362. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_T09_04_subprocess_isolate.py +0 -0
  363. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_T09_06_log_verbosity.py +0 -0
  364. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_aggregator.py +0 -0
  365. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_aggregator_skip.py +0 -0
  366. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_base_parser.py +0 -0
  367. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_branch_monitor.py +0 -0
  368. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_bulk_upsert_invariant.py +0 -0
  369. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_cli.py +0 -0
  370. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_cli_help.py +0 -0
  371. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_closure_depth.py +0 -0
  372. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_column_lineage_wiring.py +0 -0
  373. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_config.py +0 -0
  374. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_data_models.py +0 -0
  375. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_db_info.py +0 -0
  376. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_dominant_cause.py +0 -0
  377. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_find_cmd.py +0 -0
  378. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_gain_ratio.py +0 -0
  379. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_git_delta.py +0 -0
  380. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_graph_backend.py +0 -0
  381. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_hard_kill_pool.py +0 -0
  382. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_index_progress.py +0 -0
  383. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_indexer_progress.py +0 -0
  384. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_indexer_quality.py +0 -0
  385. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_install.py +0 -0
  386. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_install_message.py +0 -0
  387. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_jobs.py +0 -0
  388. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_judgement.py +0 -0
  389. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_kuzu_backend.py +0 -0
  390. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_kuzu_lock.py +0 -0
  391. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_lineage_conversion.py +0 -0
  392. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_literal_column_skip.py +0 -0
  393. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_mcp_best_practices.py +0 -0
  394. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_mcp_stdio_smoke.py +0 -0
  395. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_metrics.py +0 -0
  396. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_noise_filter.py +0 -0
  397. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_parse_file_dependency_filter.py +0 -0
  398. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_parse_quality.py +0 -0
  399. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_parser.py +0 -0
  400. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_perf_scaling_guard.py +0 -0
  401. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_resolve_pass2_passes_dependency_filter.py +0 -0
  402. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_schema_resolver.py +0 -0
  403. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_server.py +0 -0
  404. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_snowflake_strip_alter_set_tag.py +0 -0
  405. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_sprint_06_t04_t05.py +0 -0
  406. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_star_resolution_unit.py +0 -0
  407. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_submit_feedback.py +0 -0
  408. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_subprocess_isolate.py +0 -0
  409. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_t02_expression_name_extraction.py +0 -0
  410. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_t03_ddl_skip.py +0 -0
  411. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_timeout_cancel.py +0 -0
  412. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_tools_warnings.py +0 -0
  413. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_uninstall.py +0 -0
  414. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_unqualified_fallback.py +0 -0
  415. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_walker.py +0 -0
  416. {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_watcher.py +0 -0
@@ -2827,3 +2827,124 @@ removes the skill, mirroring the F1 sentinel teardown.
2827
2827
  persists the prerequisite `indexed_sha`.
2828
2828
  - `max_closure_depth=3` is a reasoned default, not yet calibrated against real
2829
2829
  DWH chain depth — revisit if a deep chain is observed under-resolving.
2830
+
2831
+ ---
2832
+
2833
+ ## 17. v1.1.0 — Live Graph Freshness & Daemon Reindex (Cluster A)
2834
+
2835
+ Review date: 2026-05-31 · Reviewer: architect-reviewer · Branch:
2836
+ `fix/v1.0.2-bugfix` · Verdict: **APPROVED-WITH-FOLLOWUPS**
2837
+
2838
+ Resolves the §16.3 deferred staleness FACT and closes the silent-stale-graph
2839
+ class of failure. Plan: [`v1.1.0_live_graph_freshness.md`](plan/v1.1.0_live_graph_freshness.md);
2840
+ sprint breakdown: [`sprint_12_v1.1.0.md`](plan/sprint_12_v1.1.0.md). GitHub
2841
+ issues [#28], [#29], [#30]. Four PRs (21ecd2e, abcf41c, e3bead4/add000d/f02b279,
2842
+ b54153f), all merged on the branch.
2843
+
2844
+ ### 17.1 Freshness model (#30)
2845
+
2846
+ A new backend-free helper [`core/freshness.py`](src/sqlcg/core/freshness.py)
2847
+ computes a `Freshness(indexed_sha, head_sha, stale_by_commits, dirty, branch)`
2848
+ from a repo root + the stored SHA. All git calls funnel through one private
2849
+ `_git(root, *args)` that returns `None` on any failure — **never raises**
2850
+ (matches the defensive pattern in `git_delta.py`/`watcher.py`). `stale_by_commits`
2851
+ is `git rev-list --count <indexed>..<head>`; an indexed SHA unknown to git
2852
+ (rebased/shallow, or the `+dirty` sentinel) yields `None` ("distance unknown"),
2853
+ never a false `0`. The helper does not import the backend — the caller passes
2854
+ `indexed_sha` in — so it unit-tests against a real temp git repo with no Kuzu.
2855
+
2856
+ Surfaced in three places, all reusing the single helper:
2857
+ - `sqlcg db info` prints `render_freshness_line` (silent on empty/non-git DB).
2858
+ - MCP `db_info` tool extends `DbInfoResult` with the four optional fields;
2859
+ Neo4j's `NotImplementedError` on `get_indexed_sha()` is guarded → reports
2860
+ `indexed_sha: null` without crashing.
2861
+ - `mcp status` JSON (see 17.3).
2862
+
2863
+ `index --include-working-tree` (#30, PR-B) folds uncommitted changes and
2864
+ overwrites the stored SHA with a `"<head>+dirty"` sentinel via a fresh backend
2865
+ context. The sentinel is intentionally **not** a valid SHA, so freshness reports
2866
+ "commit distance unknown, working tree dirty" — accurate rather than guessed.
2867
+ Default committed-only behaviour is unchanged.
2868
+
2869
+ ### 17.2 Daemon control-channel architecture (#29)
2870
+
2871
+ The MCP server is a single process running one `anyio` event loop holding the
2872
+ KuzuDB write lock for its whole lifetime (no lock lease — verified no safe Kuzu
2873
+ API exists; a reader/writer split was explicitly rejected). v1.1 adds a
2874
+ **Unix-domain-socket control channel** on that same event loop, not a second
2875
+ process. Control-file paths derive from `get_db_path()` (`KuzuConfig`-owned),
2876
+ never hardcoded `~/.sqlcg`, so two servers on two DBs do not collide:
2877
+ `graph.db` → `graph.db.sock` + `graph.db.pid` (both `0o600`). See
2878
+ [`server/control.py`](src/sqlcg/server/control.py) (paths + pid record +
2879
+ `is_pid_alive` + cleanup) and `_control_socket_task` in
2880
+ [`server/server.py`](src/sqlcg/server/server.py).
2881
+
2882
+ Protocol (newline-delimited JSON, one request → one response):
2883
+ - `status` → `{running, pid, db_path, indexed_sha, head_sha, stale_by_commits,
2884
+ connected_clients, uptime}`. `connected_clients` is best-effort `1` (stdio
2885
+ transport = one client by design; documented approximation, not a gate).
2886
+ - `stop` → replies `{"ok": true}`, sets `stop_event` (see 17.5).
2887
+ - `reindex {root, from, to, dialect}` → see 17.4.
2888
+
2889
+ CLI side (`mcp status`/`stop`/`restart` in
2890
+ [`cli/commands/mcp.py`](src/sqlcg/cli/commands/mcp.py)) connect-and-probe the
2891
+ socket. R3 stale-socket handling: on `ConnectionRefusedError`/`FileNotFoundError`,
2892
+ fall through to the PID-file probe (`is_pid_alive`) — `running:true,
2893
+ degraded:"socket unavailable"` if the PID lives, `{"running": false}` otherwise.
2894
+ The socket task is guarded behind `sys.platform != "win32"`; Windows keeps the
2895
+ direct-write + staleness-cue path (IPC deferred to v1.2).
2896
+
2897
+ ### 17.3 Daemon-writer reindex (#28 — the real fix)
2898
+
2899
+ The silent-stale-graph failure (a second process opening the locked DB,
2900
+ swallowed by the hook's `|| true`) is fixed by routing the delta **through the
2901
+ process that already holds the lock**. The `reindex` socket op calls
2902
+ `Indexer.resync_changed(root, from, to, db, dialect)` **unchanged** (positional
2903
+ match verified against [`indexer.py`](src/sqlcg/indexer/indexer.py) line 428),
2904
+ run via `anyio.to_thread.run_sync` (R1: off the event-loop thread so tool calls
2905
+ are not blocked) behind a single `anyio.Lock` (`reindex_lock`, R2: the Kuzu
2906
+ connection is not thread-safe — see finding 3.3; concurrent notifies serialise).
2907
+ `reindex --notify` ([`reindex.py`](src/sqlcg/cli/commands/reindex.py)) probes the
2908
+ socket and on any connect failure falls through to the existing direct-write path
2909
+ unchanged (R3). The git hooks ([`git.py`](src/sqlcg/cli/commands/git.py)) now pass
2910
+ `--notify` and emit a one-line **stderr cue** on failure while staying non-fatal
2911
+ to the checkout — killing the "silent" mode. Idempotency sentinels unchanged (R9).
2912
+
2913
+ **Perf invariants intact (verified):** neither `parsers/base.py` nor
2914
+ `indexer.py` changed anywhere in Cluster A (`git diff --stat 21ecd2e~1 dcba863`
2915
+ on both paths is empty). The reindex op reuses `resync_changed`, so the
2916
+ bulk-upsert and once-per-statement-scope invariants are inherited; an integration
2917
+ test (`test_reindex_via_server.py` Scenario A) pins that `resync_changed` is
2918
+ called exactly once. DWH regression gate **PASSED**: 175s (≤240s budget),
2919
+ 45,652 edges (≥44,939 baseline — no coverage regression).
2920
+
2921
+ ### 17.4 Deviation: `os._exit(0)` on stop (accepted for v1.1)
2922
+
2923
+ The MCP `stdio_server` runs stdin `readline` in a thread via
2924
+ `anyio.to_thread.run_sync` with `abandon_on_cancel=False`. When stdin is a
2925
+ parent-held pipe, that blocking read **cannot be interrupted** from inside the
2926
+ subprocess (the parent holds the write end open), so a clean cancel-scope
2927
+ unwind cannot drain the thread. The `stop` path therefore does explicit cleanup
2928
+ **first** — `shutdown_backend()` then `cleanup_control_files()` in `_stop_watcher`
2929
+ ([`server.py`](src/sqlcg/server/server.py) ~L218-255) — and then calls
2930
+ `os._exit(0)`. R8 (backend shutdown + socket removal before exit) holds because
2931
+ the teardown runs ahead of the hard exit, not in `main()`'s `finally` (which
2932
+ `os._exit` skips). This is **documented honestly, not faked, and contains no
2933
+ TODO in a happy path** (commit f02b279). Acceptable for v1.1.
2934
+
2935
+ `restart` is `stop` + client-respawn guidance, **not** a true re-parent: the
2936
+ editor owns the stdio process lifecycle and v1.1 has no launcher to re-spawn it
2937
+ (R5). Also documented, not faked.
2938
+
2939
+ ### 17.5 Tracked for v1.2
2940
+
2941
+ - **True graceful stop / true `restart`** — needs a launcher model that owns the
2942
+ stdio process so the blocking-pipe-read can be unblocked and `os._exit(0)`
2943
+ retired in favour of clean unwind (R5 + 17.4).
2944
+ - **Windows IPC** (named pipes) for lifecycle + notify-reindex (R7).
2945
+ - **Per-file / SQL-only dirty tracking** — v1.1 reports whole-tree dirty only.
2946
+ - **Socket auth token** for multi-user machines (R6: socket is `0o600`,
2947
+ owner-only, but any same-uid local process can send `stop`/`reindex`).
2948
+ - **Freshness on every tool result by default** — v1.1 ships it gated/off to
2949
+ protect hot-path latency; default-on pending an overhead measurement.
2950
+ - **`connected_clients` fidelity** — best-effort `1` today; no real counter.
@@ -0,0 +1,102 @@
1
+ ## v1.1.0 (2026-06-01)
2
+
3
+ > **⚠️ Upgrade note — re-index required.** The graph schema advanced from
4
+ > `SCHEMA_VERSION` 4 to 6 (added `start_line` on `SqlQuery`, repurposed
5
+ > `SqlTable.kind`, added the `ExternalConsumer` node + `CONSUMED_BY` edge). There
6
+ > is no in-place migration — re-run `sqlcg index <path>` to rebuild the graph. If
7
+ > you run the MCP server, restart it (`sqlcg mcp restart`) after re-indexing.
8
+
9
+ ### Feat
10
+
11
+ - **#28/#29/#30**: live-graph freshness & daemon reindex — Unix-socket control channel,
12
+ `mcp status/stop/restart`, reindex through the running server, post-merge hook routing
13
+ via `ORIG_HEAD`, `index --include-working-tree` + dirty sentinel, and a freshness signal
14
+ (indexed SHA vs HEAD) surfaced in `db info` / the `db_info` MCP tool
15
+ - **#31**: source location — `file`/`line`/`expression` on lineage edges (`start_line` on `SqlQuery`)
16
+ - **#32**: meaningful confidence — `1.0` for plainly-parsed facts, with a `reason` on inferred edges
17
+ - **#33**: CLI/MCP output parity + node-kind tagging (`table` / `cte` / `derived` / `external`)
18
+ - **#34**: `analyze_unused` segregates presentation/terminal tables from dead code
19
+ - **#35**: external downstream lineage injection — `ExternalConsumer` node + `CONSUMED_BY` edge
20
+ - **hygiene**: config-path footgun warning, find/analyze noise-filter parity, cause discoverability,
21
+ and MCP config-root reconciliation
22
+ - **skill**: bundled Claude skill teaches the new provenance + node-kind fields (F2)
23
+ - **indexer**: batch-scoped upsert — bulk writes once per batch instead of per file
24
+ (~13,400 → ~270 backend round-trips on the 1,340-file DWH corpus; upsert 169s → 52s)
25
+
26
+ ### Fix
27
+
28
+ - **#31**: preserve newline count in Snowflake preprocessing (multi-line `start_line` bug)
29
+ - **#28**: socket timeout fix, symbolic-ref `--to` resolution, hook binary path
30
+ - **index**: resolve walker root once so relative paths yield absolute paths (sibling of #24)
31
+ - **analyze_unused**: external-consumer warning clarifies the edge is created anyway;
32
+ debug log on the no-Repo File-node fallback
33
+
34
+ ### Perf
35
+
36
+ - **indexer**: raise default per-file parse timeout 5s→10s
37
+
38
+ ## v1.0.2 (2026-05-30)
39
+
40
+ ### Fix
41
+
42
+ - **parser**: restore COALESCE/func lineage + CTE-chain hops broken by eb19f29 (#25)
43
+ - **observability**: make pool-path timeouts visible + route warnings to log file (#13/#27d PR-07)
44
+ - **analyze**: query-time bare-name fallback for unqualified INSERT targets (#26 PR-06)
45
+ - **analyze**: wire NoiseFilter into CLI + add *_bck_* glob (#27a/b PR-08)
46
+ - **install**: restore uvx cold-cache message dropped in #23 rewrite
47
+ - **parser**: preserve skip markers for INSERT-column-list expressions (#25 regression)
48
+ - **parser**: INSERT positional mapping overrides SELECT alias attribution (#25)
49
+ - **install**: write via claude mcp add + ~/.claude.json fallback, remove settings.json (#23)
50
+ - **server**: capture fd 1 before _configure_mcp_logging to fix stdio transport (#22)
51
+ - **find**: lowercase name/ref before graph query to match C2 normalization (#12)
52
+ - **reindex**: resolve root to absolute before ignore matching (#24)
53
+
54
+ ## v1.0.1 (2026-05-30)
55
+
56
+ ### Fix
57
+
58
+ - **indexer**: abort immediately on Ctrl-C instead of flushing a partial graph
59
+
60
+ ### Perf
61
+
62
+ - **parser**: recover 3 once-per-statement lineage regressions from 4234e5d
63
+
64
+ ## v1.0.0 (2026-05-30)
65
+
66
+ ### Feat
67
+
68
+ - **trust-layer**: `Judgement` discriminator (fact vs. heuristic) on risk/dead-code
69
+ outputs; `analyze_unused` + `get_hub_ranking` tools; golden-harness answer-anchors
70
+ - **F1 living-codebase resync**: incremental branch-change resync via
71
+ `Indexer.resync_changed` + cross-file pass-2 affected closure; standalone
72
+ `sqlcg reindex`; `indexed_sha` metadata (schema v4); `post-merge` hook
73
+ - **F2 bundled skill**: `sqlcg install` provisions a `SKILL.md` encoding the
74
+ fact/heuristic boundary; `sqlcg mcp best-practices` CLI command
75
+ - **index**: `--profile` flag emitting per-stage and per-file timing
76
+ - **analyze**: `failures` subcommand surfacing per-file parse-failure cause
77
+
78
+ ### Refactor
79
+
80
+ - remove the INFORMATION_SCHEMA-CSV / `load-schema` path (zero measured edge delta)
81
+ - compact the generated `SKILL.md` (~40% smaller, fact/heuristic-sorted tool table)
82
+
83
+ ## v0.2.1 (2026-05-05)
84
+
85
+ ### Fix
86
+
87
+ - **benchmarks**: add bench_*.py to pytest python_files so bench_indexer.py is collected
88
+ - **tests**: use tracked variable in fake_run and regenerate cli docs
89
+ - **tests**: strip ANSI codes in test_cli_help assertion
90
+
91
+ ## v0.2.0 (2026-05-05)
92
+
93
+ ### Feat
94
+
95
+ - **walker**: default to git ls-files to avoid indexing untracked files
96
+ - **phase-9+10**: git-aware graph freshness + PyPI publishing
97
+ - **phase-8**: metrics and feedback layer
98
+
99
+ ### Fix
100
+
101
+ - **tools**: move inline Cypher queries to queries.py and fix decorator order (C1, C2)
102
+ - **walker**: address code-review findings C2/W1/W2/W4/S1
@@ -108,9 +108,11 @@ Any refactor that touches [`base.py`](src/sqlcg/parsers/base.py) or [`indexer.py
108
108
  | **`body_scope` is built once per statement BEFORE the column loop** (with a schema-free qualify retry on failure), never lazily inside it | `_extract_column_lineage` | Building it inside the loop re-ran expand+qualify+build_scope for *every* column whenever qualify failed (the failure path). Regressed in `4234e5d` |
109
109
  | In the INSERT column-list aliasing path, **`body.copy()` + strip-WITH happen once** before the loop; only the single projection is swapped per column | `_extract_column_lineage` INSERT block | A full-body deepcopy per column is O(cols × body_size). Regressed in `4234e5d` |
110
110
  | **`_upsert_parsed_file` uses `upsert_nodes_bulk`/`upsert_edges_bulk`** (Phase A→B→C), never `upsert_node`/`upsert_edge` per row | `indexer.py` `_upsert_parsed_file` | Measured: bulk=181s vs per-node=1020s+ on 1,340-file DWH (~10 execute() calls per file vs ~14,500 total). Commit `4234e5d` accidentally regressed this by rewriting the method during C2 normalization. |
111
+ | **`_flush_row_batch` accumulates rows across all files in a batch and calls each `upsert_*_bulk` once per batch** (not once per file) | `indexer.py` `_flush_batch`/`_upsert_file_batch` → `_flush_row_batch` | Measured: per-file flush = ~13,400 `execute()` on 1,340-file DWH (10/file); per-batch flush = ~270 (10/batch). v1.1.1. Guard: [`test_upsert_batch_invariant.py`](tests/unit/test_upsert_batch_invariant.py) |
111
112
 
112
- Tests covering these invariants live in [`test_T09_01_qualify_once.py`](tests/unit/test_T09_01_qualify_once.py)
113
- and [`test_bulk_upsert_invariant.py`](tests/unit/test_bulk_upsert_invariant.py) (each pins
113
+ Tests covering these invariants live in [`test_T09_01_qualify_once.py`](tests/unit/test_T09_01_qualify_once.py),
114
+ [`test_bulk_upsert_invariant.py`](tests/unit/test_bulk_upsert_invariant.py), and
115
+ [`test_upsert_batch_invariant.py`](tests/unit/test_upsert_batch_invariant.py) (each pins
114
116
  one *named* regression). If any fail after a refactor, the invariant was broken — do not mark
115
117
  the test as pre-existing and move on.
116
118
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sql-code-graph
3
- Version: 1.0.2
3
+ Version: 1.1.0
4
4
  Summary: SQL code graph analyzer and lineage tracer
5
5
  Project-URL: Homepage, https://github.com/Warhorze/sql-code-graph
6
6
  Project-URL: Repository, https://github.com/Warhorze/sql-code-graph
@@ -219,7 +219,7 @@ After indexing, `sqlcg db info` shows non-zero `STAR_EXPANSION lineage edges`, a
219
219
  | **Search & meta** | |
220
220
  | `search_sql_pattern(query)` | Full-text search across indexed SQL |
221
221
  | `list_dialects_and_repos()` | List indexed repos and dialects (catalogue) |
222
- | `db_info()` | Graph health, node counts, parse quality breakdown, warnings |
222
+ | `db_info()` | Graph health, node counts, parse quality breakdown, warnings, freshness (indexed SHA vs HEAD) |
223
223
  | `execute_cypher(query)` | Raw Cypher query against the graph |
224
224
  | `submit_feedback(...)` | Report a false positive/negative to improve metrics |
225
225
 
@@ -228,6 +228,12 @@ After indexing, `sqlcg db info` shows non-zero `STAR_EXPANSION lineage edges`, a
228
228
  > `table.column`. Each returned node carries both `name` (the bare column) and
229
229
  > `table` (the owning `schema.table`), so results are navigable without a second lookup.
230
230
 
231
+ > **Provenance fields**: lineage edges now carry `file`, `line`, and `expression`
232
+ > (where the lineage was derived from), a `confidence` of `1.0` for plainly-parsed
233
+ > facts (lower for inferred edges, with a `reason`), and a `table_kind`
234
+ > (`table` / `cte` / `derived` / `external`) so CTE and derived aliases are
235
+ > distinguishable from real tables.
236
+
231
237
  > **LLM agent tip**: call `db_info()` before lineage queries to check that
232
238
  > `SqlColumn > 0` and `warnings` is empty. If `parse_quality["scripting_block"]`
233
239
  > is high, column lineage will be limited for those files — use table-level tools
@@ -243,16 +249,21 @@ sqlcg db init # initialise graph database
243
249
  sqlcg index <path> --dialect snowflake # index SQL files (snowflake is the tested dialect)
244
250
  sqlcg index <path> --dialect auto # read dialect from .sqlcg.toml
245
251
  sqlcg index <path> --profile # index + print per-stage timing and slowest files
252
+ sqlcg index <path> --include-working-tree # also index uncommitted changes (marks graph dirty)
246
253
  sqlcg reindex <path> --from <sha> --to <sha> # incremental resync of only changed files
247
254
  sqlcg analyze unused # tables with no query references
248
255
  sqlcg analyze upstream/downstream # trace lineage from the CLI
249
256
  sqlcg find table/column/pattern # search the graph
250
257
  sqlcg watch <path> # watch for file changes
258
+ sqlcg db info # graph stats + freshness (indexed SHA vs HEAD)
251
259
  sqlcg git install-hooks # install post-checkout + post-merge resync hooks
252
260
  sqlcg gain # show usage metrics
253
261
  sqlcg report # generate FP/error report
254
262
  sqlcg mcp best-practices # print the fact/heuristic boundary for the MCP tools
255
263
  sqlcg mcp start # start MCP server manually
264
+ sqlcg mcp status # server status JSON (via control socket)
265
+ sqlcg mcp stop # stop the running MCP server gracefully
266
+ sqlcg mcp restart # stop the server (client must respawn it)
256
267
  sqlcg version # show installed version
257
268
  ```
258
269
 
@@ -181,7 +181,7 @@ After indexing, `sqlcg db info` shows non-zero `STAR_EXPANSION lineage edges`, a
181
181
  | **Search & meta** | |
182
182
  | `search_sql_pattern(query)` | Full-text search across indexed SQL |
183
183
  | `list_dialects_and_repos()` | List indexed repos and dialects (catalogue) |
184
- | `db_info()` | Graph health, node counts, parse quality breakdown, warnings |
184
+ | `db_info()` | Graph health, node counts, parse quality breakdown, warnings, freshness (indexed SHA vs HEAD) |
185
185
  | `execute_cypher(query)` | Raw Cypher query against the graph |
186
186
  | `submit_feedback(...)` | Report a false positive/negative to improve metrics |
187
187
 
@@ -190,6 +190,12 @@ After indexing, `sqlcg db info` shows non-zero `STAR_EXPANSION lineage edges`, a
190
190
  > `table.column`. Each returned node carries both `name` (the bare column) and
191
191
  > `table` (the owning `schema.table`), so results are navigable without a second lookup.
192
192
 
193
+ > **Provenance fields**: lineage edges now carry `file`, `line`, and `expression`
194
+ > (where the lineage was derived from), a `confidence` of `1.0` for plainly-parsed
195
+ > facts (lower for inferred edges, with a `reason`), and a `table_kind`
196
+ > (`table` / `cte` / `derived` / `external`) so CTE and derived aliases are
197
+ > distinguishable from real tables.
198
+
193
199
  > **LLM agent tip**: call `db_info()` before lineage queries to check that
194
200
  > `SqlColumn > 0` and `warnings` is empty. If `parse_quality["scripting_block"]`
195
201
  > is high, column lineage will be limited for those files — use table-level tools
@@ -205,16 +211,21 @@ sqlcg db init # initialise graph database
205
211
  sqlcg index <path> --dialect snowflake # index SQL files (snowflake is the tested dialect)
206
212
  sqlcg index <path> --dialect auto # read dialect from .sqlcg.toml
207
213
  sqlcg index <path> --profile # index + print per-stage timing and slowest files
214
+ sqlcg index <path> --include-working-tree # also index uncommitted changes (marks graph dirty)
208
215
  sqlcg reindex <path> --from <sha> --to <sha> # incremental resync of only changed files
209
216
  sqlcg analyze unused # tables with no query references
210
217
  sqlcg analyze upstream/downstream # trace lineage from the CLI
211
218
  sqlcg find table/column/pattern # search the graph
212
219
  sqlcg watch <path> # watch for file changes
220
+ sqlcg db info # graph stats + freshness (indexed SHA vs HEAD)
213
221
  sqlcg git install-hooks # install post-checkout + post-merge resync hooks
214
222
  sqlcg gain # show usage metrics
215
223
  sqlcg report # generate FP/error report
216
224
  sqlcg mcp best-practices # print the fact/heuristic boundary for the MCP tools
217
225
  sqlcg mcp start # start MCP server manually
226
+ sqlcg mcp status # server status JSON (via control socket)
227
+ sqlcg mcp stop # stop the running MCP server gracefully
228
+ sqlcg mcp restart # stop the server (client must respawn it)
218
229
  sqlcg version # show installed version
219
230
  ```
220
231