pretensor 0.1.0a4__tar.gz → 0.2.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 (530) hide show
  1. pretensor-0.2.0/.github/ISSUE_TEMPLATE/schema_report.yml +122 -0
  2. {pretensor-0.1.0a4 → pretensor-0.2.0}/.github/workflows/open-publish-pr.yml +6 -1
  3. {pretensor-0.1.0a4 → pretensor-0.2.0}/.github/workflows/release.yml +12 -1
  4. pretensor-0.2.0/CHANGELOG.md +262 -0
  5. {pretensor-0.1.0a4 → pretensor-0.2.0}/PKG-INFO +78 -28
  6. {pretensor-0.1.0a4 → pretensor-0.2.0}/README.md +74 -25
  7. {pretensor-0.1.0a4 → pretensor-0.2.0}/guides/quickstart.md +213 -34
  8. {pretensor-0.1.0a4 → pretensor-0.2.0}/pyproject.toml +3 -2
  9. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/benchmark/l1/runner.py +2 -9
  10. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/benchmark/l2/runner.py +2 -9
  11. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/benchmark/l3/pretensor_runner.py +2 -9
  12. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/benchmark/l3/runner.py +2 -9
  13. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/benchmark/release_gate.py +232 -5
  14. pretensor-0.2.0/src/pretensor/cli/commands/_command_runners.py +406 -0
  15. pretensor-0.2.0/src/pretensor/cli/commands/analyze.py +205 -0
  16. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/cli/commands/index.py +5 -263
  17. pretensor-0.2.0/src/pretensor/cli/commands/init.py +661 -0
  18. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/cli/commands/quickstart.py +2 -2
  19. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/cli/commands/reindex.py +12 -0
  20. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/cli/commands/serve.py +7 -3
  21. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/cli/config_file.py +296 -23
  22. pretensor-0.2.0/src/pretensor/cli/init/inference.py +160 -0
  23. pretensor-0.2.0/src/pretensor/cli/init/mcp_clients.py +170 -0
  24. pretensor-0.2.0/src/pretensor/cli/init/steps.py +194 -0
  25. pretensor-0.2.0/src/pretensor/cli/init/wizard.py +62 -0
  26. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/cli/main.py +32 -10
  27. pretensor-0.2.0/src/pretensor/cli/prompts.py +102 -0
  28. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/config.py +16 -3
  29. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/connectors/inspect.py +31 -23
  30. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/connectors/lineage_sqlglot.py +15 -9
  31. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/connectors/snapshot.py +62 -37
  32. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/core/graph_schema_manager.py +2 -0
  33. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/core/graph_store.py +195 -0
  34. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/core/ids.py +33 -0
  35. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/core/schema.py +49 -0
  36. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/core/store.py +54 -0
  37. pretensor-0.2.0/src/pretensor/enrichment/analyze/classify.py +49 -0
  38. pretensor-0.2.0/src/pretensor/enrichment/analyze/extract_python.py +196 -0
  39. pretensor-0.2.0/src/pretensor/enrichment/analyze/extract_sql_file.py +83 -0
  40. pretensor-0.2.0/src/pretensor/enrichment/analyze/parse.py +141 -0
  41. pretensor-0.2.0/src/pretensor/enrichment/analyze/pipeline.py +282 -0
  42. pretensor-0.2.0/src/pretensor/enrichment/analyze/summary.py +41 -0
  43. pretensor-0.2.0/src/pretensor/enrichment/analyze/walker.py +133 -0
  44. pretensor-0.2.0/src/pretensor/enrichment/analyze/writers.py +214 -0
  45. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/graph_models/__init__.py +3 -0
  46. pretensor-0.2.0/src/pretensor/graph_models/consumer.py +71 -0
  47. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/intelligence/discovery.py +8 -0
  48. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/intelligence/heuristic.py +59 -27
  49. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/intelligence/join_paths/on_demand.py +57 -14
  50. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/introspection/models/dsn.py +22 -1
  51. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/mcp/payload_types.py +24 -2
  52. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/mcp/server.py +8 -0
  53. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/mcp/service.py +2 -0
  54. pretensor-0.2.0/src/pretensor/mcp/tools/consumers.py +161 -0
  55. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/mcp/tools/context.py +2 -2
  56. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/mcp/tools/cypher.py +26 -3
  57. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/mcp/tools/detect_changes.py +3 -1
  58. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/mcp/tools/impact.py +36 -0
  59. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/mcp/tools/traverse.py +73 -21
  60. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/quickstart/README.md +3 -1
  61. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/quickstart/docker-compose.yml +5 -1
  62. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/staleness/graph_patcher.py +98 -1
  63. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/staleness/impact_analyzer.py +3 -2
  64. pretensor-0.2.0/src/pretensor/version.py +20 -0
  65. pretensor-0.2.0/tests/benchmark/baselines/adventureworks-l1-embeddings.json +1610 -0
  66. pretensor-0.2.0/tests/benchmark/baselines/adventureworks-l1.json +1609 -0
  67. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/benchmark/baselines/messy_warehouse-l1.json +6 -180
  68. pretensor-0.2.0/tests/benchmark/results/v0.1.0/adventureworks-l2.json +487 -0
  69. pretensor-0.2.0/tests/benchmark/results/v0.1.0/pagila-l2.json +323 -0
  70. pretensor-0.2.0/tests/benchmark/results/v0.1.0/tpch-l2.json +562 -0
  71. pretensor-0.2.0/tests/benchmark/results/v0.1.0a3/pagila-l1.json +91 -0
  72. pretensor-0.2.0/tests/benchmark/results/v0.1.0a3/tpch-l1.json +79 -0
  73. pretensor-0.1.0a4/tests/benchmark/baselines/adventureworks-l1-embeddings.json → pretensor-0.2.0/tests/benchmark/results/v0.1.0a4/adventureworks-l1.json +2 -3
  74. pretensor-0.2.0/tests/benchmark/results/v0.1.0a4/adventureworks-l2.json +487 -0
  75. pretensor-0.2.0/tests/benchmark/results/v0.1.0a4/pagila-l1.json +91 -0
  76. pretensor-0.2.0/tests/benchmark/results/v0.1.0a4/pagila-l2.json +323 -0
  77. pretensor-0.2.0/tests/benchmark/results/v0.1.0a4/tpch-l1.json +79 -0
  78. pretensor-0.2.0/tests/benchmark/results/v0.1.0a4/tpch-l2.json +562 -0
  79. pretensor-0.2.0/tests/benchmark/results/v0.2.0/accepted-regressions.toml +24 -0
  80. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/benchmark/test_release_gate.py +242 -0
  81. pretensor-0.2.0/tests/cli/init/test_inference.py +79 -0
  82. pretensor-0.2.0/tests/cli/init/test_mcp_clients.py +209 -0
  83. pretensor-0.2.0/tests/cli/init/test_steps.py +204 -0
  84. pretensor-0.2.0/tests/cli/init/test_wizard.py +39 -0
  85. pretensor-0.2.0/tests/cli/test_analyze_cli.py +670 -0
  86. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/cli/test_cli_error_handling.py +14 -6
  87. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/cli/test_config_file.py +409 -3
  88. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/cli/test_index_cli.py +23 -6
  89. pretensor-0.2.0/tests/cli/test_init_cli.py +2163 -0
  90. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/cli/test_main_cli.py +43 -0
  91. pretensor-0.2.0/tests/cli/test_prompts.py +39 -0
  92. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/cli/test_quickstart_cli.py +11 -19
  93. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/cli/test_reindex_cli.py +110 -0
  94. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/cli/test_serve_cli.py +5 -7
  95. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/connectors/test_dsn_parsing.py +126 -19
  96. pretensor-0.2.0/tests/connectors/test_inspect_collect_stats.py +67 -0
  97. pretensor-0.2.0/tests/contracts/test_consumer_node.py +77 -0
  98. pretensor-0.2.0/tests/core/test_schema_external_consumer.py +38 -0
  99. pretensor-0.2.0/tests/core/test_store_consumer_upserts.py +339 -0
  100. pretensor-0.2.0/tests/enrichment/analyze/fixtures/cross_connection.py +1 -0
  101. pretensor-0.2.0/tests/enrichment/analyze/fixtures/dml_writes.py +4 -0
  102. pretensor-0.2.0/tests/enrichment/analyze/fixtures/dynamic_only.py +5 -0
  103. pretensor-0.2.0/tests/enrichment/analyze/fixtures/fstring_prefix.py +2 -0
  104. pretensor-0.2.0/tests/enrichment/analyze/fixtures/multi_statement.sql +6 -0
  105. pretensor-0.2.0/tests/enrichment/analyze/fixtures/noqa_optout.py +6 -0
  106. pretensor-0.2.0/tests/enrichment/analyze/fixtures/simple.sql +4 -0
  107. pretensor-0.2.0/tests/enrichment/analyze/fixtures/simple_select.py +1 -0
  108. pretensor-0.2.0/tests/enrichment/analyze/fixtures/unparseable.sql +2 -0
  109. pretensor-0.2.0/tests/enrichment/analyze/test_classify.py +100 -0
  110. pretensor-0.2.0/tests/enrichment/analyze/test_extract_python.py +174 -0
  111. pretensor-0.2.0/tests/enrichment/analyze/test_extract_sql_file.py +215 -0
  112. pretensor-0.2.0/tests/enrichment/analyze/test_parse.py +185 -0
  113. pretensor-0.2.0/tests/enrichment/analyze/test_pipeline.py +474 -0
  114. pretensor-0.2.0/tests/enrichment/analyze/test_walker.py +177 -0
  115. pretensor-0.2.0/tests/enrichment/analyze/test_writers.py +334 -0
  116. pretensor-0.2.0/tests/intelligence/slow/__init__.py +0 -0
  117. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/intelligence/test_discovery.py +73 -0
  118. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/intelligence/test_heuristic.py +82 -18
  119. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/intelligence/test_join_paths.py +132 -5
  120. pretensor-0.2.0/tests/mcp/test_consumers_tool.py +152 -0
  121. pretensor-0.2.0/tests/mcp/test_cypher_timeout_pool.py +104 -0
  122. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/mcp/test_detect_changes_errors.py +30 -3
  123. pretensor-0.2.0/tests/mcp/test_impact_consumers.py +127 -0
  124. pretensor-0.2.0/tests/mcp/test_serve_stdio_smoke.py +133 -0
  125. pretensor-0.2.0/tests/mcp/test_server_version.py +52 -0
  126. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/mcp/test_service.py +3 -0
  127. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/mcp/test_tool_registry.py +3 -2
  128. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/mcp/test_traverse_dijkstra.py +107 -2
  129. pretensor-0.2.0/tests/scripts/__init__.py +0 -0
  130. pretensor-0.2.0/tests/semantic/__init__.py +0 -0
  131. pretensor-0.2.0/tests/staleness/test_staleness.py +572 -0
  132. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/test_pretensor_config.py +10 -0
  133. pretensor-0.2.0/tests/utils/__init__.py +0 -0
  134. {pretensor-0.1.0a4 → pretensor-0.2.0}/uv.lock +13 -2
  135. pretensor-0.1.0a4/CHANGELOG.md +0 -134
  136. pretensor-0.1.0a4/tests/staleness/test_staleness.py +0 -159
  137. {pretensor-0.1.0a4 → pretensor-0.2.0}/.env.example +0 -0
  138. {pretensor-0.1.0a4 → pretensor-0.2.0}/.gitattributes +0 -0
  139. {pretensor-0.1.0a4 → pretensor-0.2.0}/.github/CODEOWNERS +0 -0
  140. {pretensor-0.1.0a4 → pretensor-0.2.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  141. {pretensor-0.1.0a4 → pretensor-0.2.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  142. {pretensor-0.1.0a4 → pretensor-0.2.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  143. {pretensor-0.1.0a4 → pretensor-0.2.0}/.github/pull_request_template.md +0 -0
  144. {pretensor-0.1.0a4 → pretensor-0.2.0}/.github/workflows/bench.yml +0 -0
  145. {pretensor-0.1.0a4 → pretensor-0.2.0}/.github/workflows/ci.yml +0 -0
  146. {pretensor-0.1.0a4 → pretensor-0.2.0}/.github/workflows/docs.yml +0 -0
  147. {pretensor-0.1.0a4 → pretensor-0.2.0}/.github/workflows/e2e.yml +0 -0
  148. {pretensor-0.1.0a4 → pretensor-0.2.0}/.github/workflows/no-internal-refs.yml +0 -0
  149. {pretensor-0.1.0a4 → pretensor-0.2.0}/.gitignore +0 -0
  150. {pretensor-0.1.0a4 → pretensor-0.2.0}/.gitlint +0 -0
  151. {pretensor-0.1.0a4 → pretensor-0.2.0}/.pre-commit-config.yaml +0 -0
  152. {pretensor-0.1.0a4 → pretensor-0.2.0}/.python-version +0 -0
  153. {pretensor-0.1.0a4 → pretensor-0.2.0}/CODE_OF_CONDUCT.md +0 -0
  154. {pretensor-0.1.0a4 → pretensor-0.2.0}/CONTRIBUTING.md +0 -0
  155. {pretensor-0.1.0a4 → pretensor-0.2.0}/LICENSE +0 -0
  156. {pretensor-0.1.0a4 → pretensor-0.2.0}/Makefile +0 -0
  157. {pretensor-0.1.0a4 → pretensor-0.2.0}/SECURITY.md +0 -0
  158. {pretensor-0.1.0a4 → pretensor-0.2.0}/docs/agent-framework-adapters.md +0 -0
  159. {pretensor-0.1.0a4 → pretensor-0.2.0}/docs/ci.md +0 -0
  160. {pretensor-0.1.0a4 → pretensor-0.2.0}/docs/releases.md +0 -0
  161. {pretensor-0.1.0a4 → pretensor-0.2.0}/examples/README.md +0 -0
  162. {pretensor-0.1.0a4 → pretensor-0.2.0}/examples/claude-code/README.md +0 -0
  163. {pretensor-0.1.0a4 → pretensor-0.2.0}/examples/claude-code/mcp.json +0 -0
  164. {pretensor-0.1.0a4 → pretensor-0.2.0}/examples/cursor/README.md +0 -0
  165. {pretensor-0.1.0a4 → pretensor-0.2.0}/examples/cursor/mcp.json +0 -0
  166. {pretensor-0.1.0a4 → pretensor-0.2.0}/examples/pagila/.gitignore +0 -0
  167. {pretensor-0.1.0a4 → pretensor-0.2.0}/examples/pagila/README.md +0 -0
  168. {pretensor-0.1.0a4 → pretensor-0.2.0}/examples/pagila/docker-compose.yml +0 -0
  169. {pretensor-0.1.0a4 → pretensor-0.2.0}/examples/snowflake-tpch/README.md +0 -0
  170. {pretensor-0.1.0a4 → pretensor-0.2.0}/examples/windsurf/README.md +0 -0
  171. {pretensor-0.1.0a4 → pretensor-0.2.0}/examples/windsurf/mcp_config.json +0 -0
  172. {pretensor-0.1.0a4 → pretensor-0.2.0}/scripts/audit_deny_list.py +0 -0
  173. {pretensor-0.1.0a4 → pretensor-0.2.0}/scripts/check_no_internal_refs.py +0 -0
  174. {pretensor-0.1.0a4 → pretensor-0.2.0}/scripts/check_readme_urls.py +0 -0
  175. {pretensor-0.1.0a4 → pretensor-0.2.0}/scripts/data/adventureworks/schema.sql +0 -0
  176. {pretensor-0.1.0a4 → pretensor-0.2.0}/scripts/data/adventureworks_metric_templates.yaml +0 -0
  177. {pretensor-0.1.0a4 → pretensor-0.2.0}/scripts/data/adventureworks_nl2sql_bench.json +0 -0
  178. {pretensor-0.1.0a4 → pretensor-0.2.0}/scripts/data/pagila/schema.sql +0 -0
  179. {pretensor-0.1.0a4 → pretensor-0.2.0}/scripts/data/pagila_metric_templates.yaml +0 -0
  180. {pretensor-0.1.0a4 → pretensor-0.2.0}/scripts/data/pagila_nl2sql_bench.json +0 -0
  181. {pretensor-0.1.0a4 → pretensor-0.2.0}/scripts/data/tpch/schema.sql +0 -0
  182. {pretensor-0.1.0a4 → pretensor-0.2.0}/scripts/data/tpch_metric_templates.yaml +0 -0
  183. {pretensor-0.1.0a4 → pretensor-0.2.0}/scripts/data/tpch_nl2sql_bench.json +0 -0
  184. {pretensor-0.1.0a4 → pretensor-0.2.0}/scripts/generate_schema_snapshot.py +0 -0
  185. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/__init__.py +0 -0
  186. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/benchmark/__init__.py +0 -0
  187. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/benchmark/cli.py +0 -0
  188. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/benchmark/fixtures.py +0 -0
  189. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/benchmark/l1/__init__.py +0 -0
  190. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/benchmark/l1/metrics.py +0 -0
  191. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/benchmark/l1/pipeline.py +0 -0
  192. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/benchmark/l2/__init__.py +0 -0
  193. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/benchmark/l2/gold.py +0 -0
  194. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/benchmark/l2/metrics.py +0 -0
  195. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/benchmark/l2/pipeline.py +0 -0
  196. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/benchmark/l3/__init__.py +0 -0
  197. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/benchmark/l3/agent.py +0 -0
  198. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/benchmark/l3/db.py +0 -0
  199. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/benchmark/l3/gold.py +0 -0
  200. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/benchmark/l3/llm_client.py +0 -0
  201. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/benchmark/l3/mcp_client.py +0 -0
  202. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/benchmark/l3/prompt.py +0 -0
  203. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/benchmark/l3/sql_equivalence.py +0 -0
  204. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/benchmark/results.py +0 -0
  205. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/benchmark/runner.py +0 -0
  206. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/cli/__init__.py +0 -0
  207. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/cli/commands/_source_runner.py +0 -0
  208. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/cli/commands/connections/__init__.py +0 -0
  209. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/cli/commands/connections/add_remove.py +0 -0
  210. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/cli/commands/connections/register.py +0 -0
  211. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/cli/commands/export.py +0 -0
  212. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/cli/commands/list.py +0 -0
  213. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/cli/commands/semantic.py +0 -0
  214. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/cli/commands/sync_grants.py +0 -0
  215. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/cli/commands/validate.py +0 -0
  216. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/cli/constants.py +0 -0
  217. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/cli/dbt_enrichment.py +0 -0
  218. {pretensor-0.1.0a4/src/pretensor/introspection/models → pretensor-0.2.0/src/pretensor/cli/init}/__init__.py +0 -0
  219. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/cli/paths.py +0 -0
  220. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/cli/plugin.py +0 -0
  221. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/connectors/__init__.py +0 -0
  222. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/connectors/base.py +0 -0
  223. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/connectors/bigquery.py +0 -0
  224. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/connectors/models.py +0 -0
  225. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/connectors/mysql.py +0 -0
  226. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/connectors/pg_array_parse.py +0 -0
  227. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/connectors/postgres.py +0 -0
  228. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/connectors/registry.py +0 -0
  229. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/connectors/snowflake.py +0 -0
  230. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/core/__init__.py +0 -0
  231. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/core/builder.py +0 -0
  232. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/core/dsn_crypto.py +0 -0
  233. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/core/portable_export.py +0 -0
  234. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/core/query_runner.py +0 -0
  235. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/core/registry.py +0 -0
  236. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/core/secure_io.py +0 -0
  237. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/enrichment/__init__.py +0 -0
  238. {pretensor-0.1.0a4/tests/benchmark → pretensor-0.2.0/src/pretensor/enrichment/analyze}/__init__.py +0 -0
  239. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/enrichment/dbt/__init__.py +0 -0
  240. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/enrichment/dbt/lineage.py +0 -0
  241. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/enrichment/dbt/manifest.py +0 -0
  242. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/enrichment/dbt/metadata.py +0 -0
  243. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/enrichment/dbt/pipeline.py +0 -0
  244. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/enrichment/dbt/resolution.py +0 -0
  245. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/enrichment/dbt/signals.py +0 -0
  246. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/entities/__init__.py +0 -0
  247. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/entities/builder.py +0 -0
  248. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/entities/classifier.py +0 -0
  249. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/entities/llm_extract.py +0 -0
  250. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/errors.py +0 -0
  251. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/graph_models/base.py +0 -0
  252. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/graph_models/edge.py +0 -0
  253. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/graph_models/entity.py +0 -0
  254. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/graph_models/node.py +0 -0
  255. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/graph_models/relationship.py +0 -0
  256. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/integrations/__init__.py +0 -0
  257. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/integrations/_base.py +0 -0
  258. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/integrations/google_adk.py +0 -0
  259. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/integrations/langchain.py +0 -0
  260. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/integrations/llamaindex.py +0 -0
  261. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/intelligence/__init__.py +0 -0
  262. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/intelligence/cluster_labeler.py +0 -0
  263. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/intelligence/clustering.py +0 -0
  264. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/intelligence/combining.py +0 -0
  265. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/intelligence/embeddings.py +0 -0
  266. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/intelligence/graph_export.py +0 -0
  267. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/intelligence/join_paths/__init__.py +0 -0
  268. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/intelligence/join_paths/storage.py +0 -0
  269. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/intelligence/llm_infer.py +0 -0
  270. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/intelligence/llm_runtime.py +0 -0
  271. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/intelligence/metric_templates.py +0 -0
  272. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/intelligence/pipeline.py +0 -0
  273. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/intelligence/role_exemplars.py +0 -0
  274. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/intelligence/schema_classification.py +0 -0
  275. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/intelligence/scoring.py +0 -0
  276. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/intelligence/semantic.py +0 -0
  277. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/intelligence/shadow_alias.py +0 -0
  278. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/intelligence/statistical.py +0 -0
  279. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/intelligence/steps.py +0 -0
  280. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/intelligence/steps_embedding.py +0 -0
  281. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/introspection/__init__.py +0 -0
  282. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/introspection/inspector.py +0 -0
  283. {pretensor-0.1.0a4/tests/benchmark/l1 → pretensor-0.2.0/src/pretensor/introspection/models}/__init__.py +0 -0
  284. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/introspection/models/base.py +0 -0
  285. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/introspection/models/config.py +0 -0
  286. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/introspection/models/plan.py +0 -0
  287. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/introspection/models/schema.py +0 -0
  288. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/introspection/models/semantic.py +0 -0
  289. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/introspection/models/validation.py +0 -0
  290. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/introspection/snapshot.py +0 -0
  291. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/mcp/__init__.py +0 -0
  292. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/mcp/config_json.py +0 -0
  293. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/mcp/resources/__init__.py +0 -0
  294. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/mcp/resources/markdown.py +0 -0
  295. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/mcp/service_context.py +0 -0
  296. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/mcp/service_registry.py +0 -0
  297. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/mcp/store_cache.py +0 -0
  298. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/mcp/tool_registry.py +0 -0
  299. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/mcp/tools/__init__.py +0 -0
  300. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/mcp/tools/_rank.py +0 -0
  301. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/mcp/tools/_timed.py +0 -0
  302. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/mcp/tools/compile_metric.py +0 -0
  303. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/mcp/tools/list.py +0 -0
  304. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/mcp/tools/schema.py +0 -0
  305. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/mcp/tools/search.py +0 -0
  306. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/mcp/tools/semantic_search.py +0 -0
  307. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/mcp/tools/validate_sql.py +0 -0
  308. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/observability.py +0 -0
  309. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/py.typed +0 -0
  310. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/quickstart/__init__.py +0 -0
  311. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/quickstart/pagila_data.sql +0 -0
  312. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/quickstart/pagila_ddl.sql +0 -0
  313. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/search/__init__.py +0 -0
  314. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/search/base.py +0 -0
  315. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/search/index.py +0 -0
  316. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/semantic/__init__.py +0 -0
  317. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/semantic/base.py +0 -0
  318. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/semantic/compiler.py +0 -0
  319. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/semantic/yaml_layer.py +0 -0
  320. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/skills/__init__.py +0 -0
  321. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/skills/generator.py +0 -0
  322. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/staleness/__init__.py +0 -0
  323. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/staleness/snapshot_store.py +0 -0
  324. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/validation/__init__.py +0 -0
  325. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/validation/query_validator.py +0 -0
  326. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/visibility/__init__.py +0 -0
  327. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/visibility/config.py +0 -0
  328. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/visibility/filter.py +0 -0
  329. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/visibility/kuzu_helpers.py +0 -0
  330. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/visibility/runtime.py +0 -0
  331. {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/visibility/sync_grants.py +0 -0
  332. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/__init__.py +0 -0
  333. {pretensor-0.1.0a4/tests/benchmark/l2 → pretensor-0.2.0/tests/benchmark}/__init__.py +0 -0
  334. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/benchmark/_compare.py +0 -0
  335. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/benchmark/baselines/adventureworks-l2-embeddings.json +0 -0
  336. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/benchmark/baselines/adventureworks-l2.json +0 -0
  337. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/benchmark/baselines/adversarial-l1.json +0 -0
  338. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/benchmark/baselines/analytics_dwh-l1.json +0 -0
  339. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/benchmark/baselines/pagila-l1-embeddings.json +0 -0
  340. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/benchmark/baselines/pagila-l1.json +0 -0
  341. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/benchmark/baselines/pagila-l2-embeddings.json +0 -0
  342. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/benchmark/baselines/pagila-l2.json +0 -0
  343. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/benchmark/baselines/saas_multitenant-l1.json +0 -0
  344. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/benchmark/baselines/tpch-l1-embeddings.json +0 -0
  345. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/benchmark/baselines/tpch-l1.json +0 -0
  346. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/benchmark/baselines/tpch-l2-embeddings.json +0 -0
  347. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/benchmark/baselines/tpch-l2.json +0 -0
  348. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/benchmark/fixtures/baseline.json +0 -0
  349. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/benchmark/fixtures/regressed.json +0 -0
  350. {pretensor-0.1.0a4/tests/benchmark/l3 → pretensor-0.2.0/tests/benchmark/l1}/__init__.py +0 -0
  351. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/benchmark/l1/test_metrics.py +0 -0
  352. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/benchmark/l1/test_runner.py +0 -0
  353. {pretensor-0.1.0a4/tests/e2e → pretensor-0.2.0/tests/benchmark/l2}/__init__.py +0 -0
  354. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/benchmark/l2/test_gold.py +0 -0
  355. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/benchmark/l2/test_metrics.py +0 -0
  356. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/benchmark/l2/test_runner.py +0 -0
  357. {pretensor-0.1.0a4/tests/e2e/fixtures → pretensor-0.2.0/tests/benchmark/l3}/__init__.py +0 -0
  358. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/benchmark/l3/test_agent.py +0 -0
  359. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/benchmark/l3/test_db.py +0 -0
  360. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/benchmark/l3/test_gold.py +0 -0
  361. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/benchmark/l3/test_llm_client.py +0 -0
  362. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/benchmark/l3/test_mcp_client.py +0 -0
  363. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/benchmark/l3/test_pretensor_runner.py +0 -0
  364. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/benchmark/l3/test_prompt.py +0 -0
  365. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/benchmark/l3/test_runner.py +0 -0
  366. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/benchmark/l3/test_sql_equivalence.py +0 -0
  367. {pretensor-0.1.0a4/tests/benchmark/baselines → pretensor-0.2.0/tests/benchmark/results/v0.1.0}/adventureworks-l1.json +0 -0
  368. {pretensor-0.1.0a4/tests/benchmark/results/v0.1.0a3 → pretensor-0.2.0/tests/benchmark/results/v0.1.0}/pagila-l1.json +0 -0
  369. {pretensor-0.1.0a4/tests/benchmark/results/v0.1.0a3 → pretensor-0.2.0/tests/benchmark/results/v0.1.0}/tpch-l1.json +0 -0
  370. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/benchmark/results/v0.1.0a3/README.md +0 -0
  371. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/benchmark/results/v0.1.0a3/adventureworks-l1.json +0 -0
  372. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/benchmark/results/v0.1.0a3/adventureworks-l2.json +0 -0
  373. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/benchmark/results/v0.1.0a3/pagila-l2.json +0 -0
  374. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/benchmark/results/v0.1.0a3/tpch-l2.json +0 -0
  375. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/benchmark/test_cli.py +0 -0
  376. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/benchmark/test_fixtures.py +0 -0
  377. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/benchmark/test_results.py +0 -0
  378. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/cli/conftest.py +0 -0
  379. {pretensor-0.1.0a4/tests/enrichment → pretensor-0.2.0/tests/cli/init}/__init__.py +0 -0
  380. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/cli/test_connections_cli.py +0 -0
  381. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/cli/test_dbt_enrichment_cli.py +0 -0
  382. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/cli/test_export_cli.py +0 -0
  383. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/cli/test_list_cli.py +0 -0
  384. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/cli/test_paths_cli.py +0 -0
  385. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/cli/test_plugin.py +0 -0
  386. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/cli/test_semantic_cli.py +0 -0
  387. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/cli/test_sync_grants_cli.py +0 -0
  388. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/cli/test_validate_cli.py +0 -0
  389. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/conftest.py +0 -0
  390. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/connectors/test_base_connector.py +0 -0
  391. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/connectors/test_bigquery.py +0 -0
  392. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/connectors/test_catalog_enrichment.py +0 -0
  393. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/connectors/test_lineage_sqlglot.py +0 -0
  394. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/connectors/test_mysql_connector.py +0 -0
  395. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/connectors/test_pg_array_parse.py +0 -0
  396. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/connectors/test_postgres_table_grants.py +0 -0
  397. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/connectors/test_postgres_views.py +0 -0
  398. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/connectors/test_registry_mysql_optional.py +0 -0
  399. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/connectors/test_registry_postgres_optional.py +0 -0
  400. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/connectors/test_registry_snowflake_optional.py +0 -0
  401. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/connectors/test_snowflake_connector.py +0 -0
  402. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/connectors/test_snowflake_table_grants.py +0 -0
  403. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/contracts/__init__.py +0 -0
  404. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/contracts/test_combiner.py +0 -0
  405. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/contracts/test_pipeline_step.py +0 -0
  406. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/contracts/test_scorer.py +0 -0
  407. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/contracts/test_search_index.py +0 -0
  408. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/contracts/test_semantic_layer.py +0 -0
  409. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/core/test_builder.py +0 -0
  410. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/core/test_dsn_at_rest.py +0 -0
  411. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/core/test_graph_builder_lineage.py +0 -0
  412. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/core/test_lineage_store.py +0 -0
  413. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/core/test_models.py +0 -0
  414. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/core/test_portable_export.py +0 -0
  415. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/core/test_registry.py +0 -0
  416. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/core/test_schema.py +0 -0
  417. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/core/test_semantic_schema.py +0 -0
  418. {pretensor-0.1.0a4/tests/integrations → pretensor-0.2.0/tests/e2e}/__init__.py +0 -0
  419. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/e2e/conftest.py +0 -0
  420. {pretensor-0.1.0a4/tests/intelligence/slow → pretensor-0.2.0/tests/e2e/fixtures}/__init__.py +0 -0
  421. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/e2e/fixtures/sql/adventureworks_ddl.sql +0 -0
  422. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/e2e/fixtures/sql/messy_warehouse_ddl.sql +0 -0
  423. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/e2e/fixtures/sql/sakila_mysql_ddl.sql +0 -0
  424. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/e2e/fixtures/sql/tpcds_ddl.sql +0 -0
  425. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/e2e/fixtures/sql/tpch_ddl.sql +0 -0
  426. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/e2e/test_adventureworks_smoke.py +0 -0
  427. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/e2e/test_adventureworks_traverse.py +0 -0
  428. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/e2e/test_dbt_warehouse_scale_enrichment.py +0 -0
  429. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/e2e/test_index_cycle.py +0 -0
  430. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/e2e/test_l3_baseline.py +0 -0
  431. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/e2e/test_l3_pretensor.py +0 -0
  432. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/e2e/test_mcp_tools.py +0 -0
  433. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/e2e/test_mysql_index_cycle.py +0 -0
  434. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/e2e/test_reindex.py +0 -0
  435. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/e2e/test_serve_smoke.py +0 -0
  436. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/e2e/test_tpcds_traverse.py +0 -0
  437. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/e2e/test_tpch_traverse.py +0 -0
  438. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/e2e/test_visibility.py +0 -0
  439. {pretensor-0.1.0a4/tests/scripts → pretensor-0.2.0/tests/enrichment}/__init__.py +0 -0
  440. {pretensor-0.1.0a4/tests/semantic → pretensor-0.2.0/tests/enrichment/analyze}/__init__.py +0 -0
  441. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/enrichment/fixtures/dbt/manifest_v10.json +0 -0
  442. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/enrichment/fixtures/dbt/manifest_v9.json +0 -0
  443. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/enrichment/test_dbt_lineage.py +0 -0
  444. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/enrichment/test_dbt_manifest.py +0 -0
  445. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/enrichment/test_dbt_metadata.py +0 -0
  446. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/enrichment/test_dbt_pipeline.py +0 -0
  447. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/enrichment/test_dbt_signals.py +0 -0
  448. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/entities/test_classifier.py +0 -0
  449. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/entities/test_entity_builder.py +0 -0
  450. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/entities/test_llm_extract.py +0 -0
  451. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/entities/test_pagila_entities.py +0 -0
  452. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/fixtures/dbt/synthetic_warehouse/README.md +0 -0
  453. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/fixtures/dbt/synthetic_warehouse/__init__.py +0 -0
  454. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/fixtures/dbt/synthetic_warehouse/generator.py +0 -0
  455. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/fixtures/pairs/analytics_vs_saas.yaml +0 -0
  456. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/fixtures/pairs/tpch_vs_pagila.yaml +0 -0
  457. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/fixtures/pairs/tpch_vs_tpch_renamed.yaml +0 -0
  458. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/fixtures/schemas/README.md +0 -0
  459. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/fixtures/schemas/adventureworks.yaml +0 -0
  460. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/fixtures/schemas/adversarial.yaml +0 -0
  461. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/fixtures/schemas/adversarial_roles.yaml +0 -0
  462. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/fixtures/schemas/analytics_dwh.yaml +0 -0
  463. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/fixtures/schemas/messy_warehouse.yaml +0 -0
  464. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/fixtures/schemas/messy_warehouse_roles.yaml +0 -0
  465. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/fixtures/schemas/pagila.yaml +0 -0
  466. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/fixtures/schemas/pagila_extended.yaml +0 -0
  467. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/fixtures/schemas/saas_multitenant.yaml +0 -0
  468. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/fixtures/schemas/tpch.yaml +0 -0
  469. {pretensor-0.1.0a4/tests/utils → pretensor-0.2.0/tests/integrations}/__init__.py +0 -0
  470. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/integrations/test_base.py +0 -0
  471. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/integrations/test_google_adk.py +0 -0
  472. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/integrations/test_langchain.py +0 -0
  473. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/integrations/test_llamaindex.py +0 -0
  474. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/intelligence/slow/test_real_model_smoke.py +0 -0
  475. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/intelligence/test_cluster_labeler.py +0 -0
  476. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/intelligence/test_clustering.py +0 -0
  477. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/intelligence/test_clustering_embeddings.py +0 -0
  478. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/intelligence/test_embedding_index_step.py +0 -0
  479. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/intelligence/test_embeddings.py +0 -0
  480. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/intelligence/test_extended_pagila.py +0 -0
  481. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/intelligence/test_intelligence.py +0 -0
  482. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/intelligence/test_llm_infer.py +0 -0
  483. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/intelligence/test_llm_runtime.py +0 -0
  484. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/intelligence/test_metric_templates.py +0 -0
  485. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/intelligence/test_null_path_parity.py +0 -0
  486. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/intelligence/test_pipeline.py +0 -0
  487. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/intelligence/test_role_exemplars.py +0 -0
  488. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/intelligence/test_schema_classification.py +0 -0
  489. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/intelligence/test_semantic_scorer.py +0 -0
  490. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/intelligence/test_shadow_alias.py +0 -0
  491. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/intelligence/test_statistical.py +0 -0
  492. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/mcp/test_compile_metric_tool.py +0 -0
  493. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/mcp/test_context_dbt.py +0 -0
  494. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/mcp/test_context_lineage.py +0 -0
  495. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/mcp/test_context_similar.py +0 -0
  496. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/mcp/test_context_tool.py +0 -0
  497. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/mcp/test_cypher_readonly.py +0 -0
  498. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/mcp/test_error_ergonomics.py +0 -0
  499. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/mcp/test_error_handling.py +0 -0
  500. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/mcp/test_error_sanitization.py +0 -0
  501. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/mcp/test_impact_hop.py +0 -0
  502. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/mcp/test_kill_switch.py +0 -0
  503. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/mcp/test_mcp_null_path_parity.py +0 -0
  504. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/mcp/test_query_hybrid.py +0 -0
  505. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/mcp/test_schema_tool.py +0 -0
  506. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/mcp/test_semantic_search.py +0 -0
  507. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/mcp/test_traverse_ambiguous.py +0 -0
  508. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/mcp/test_traverse_pagila_shape.py +0 -0
  509. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/mcp/test_traverse_tiebreak.py +0 -0
  510. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/mcp/test_validate_sql_tool.py +0 -0
  511. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/mcp/test_visibility_mcp.py +0 -0
  512. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/query_helpers.py +0 -0
  513. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/scripts/test_check_no_internal_refs.py +0 -0
  514. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/search/test_search_index.py +0 -0
  515. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/semantic/test_compiler.py +0 -0
  516. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/semantic/test_semantic_layer.py +0 -0
  517. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/semantic/test_yaml_layer.py +0 -0
  518. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/test_errors.py +0 -0
  519. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/test_gitlint_config.py +0 -0
  520. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/test_graph_schema_manager.py +0 -0
  521. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/test_graph_store.py +0 -0
  522. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/test_observability.py +0 -0
  523. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/test_packaging.py +0 -0
  524. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/test_query_runner.py +0 -0
  525. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/test_store_cache.py +0 -0
  526. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/utils/score_tracker.py +0 -0
  527. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/validation/test_compile_did_you_mean.py +0 -0
  528. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/validation/test_query_validator.py +0 -0
  529. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/visibility/test_sync_grants.py +0 -0
  530. {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/visibility/test_visibility_config.py +0 -0
@@ -0,0 +1,122 @@
1
+ name: Schema doesn't match my database
2
+ description: The knowledge graph is missing or misrepresenting tables, columns, keys, or relationships from your database.
3
+ title: "schema: <what's missing or wrong>"
4
+ labels:
5
+ - bug
6
+ - triage
7
+ body:
8
+ - type: markdown
9
+ attributes:
10
+ value: |
11
+ Use this form when Pretensor indexed your database but the resulting graph is **wrong or incomplete** — a table or column is missing, a foreign key or inferred join is wrong, or MCP tools return schema context that doesn't match reality. For crashes and errors, use the bug report form instead.
12
+
13
+ **Security vulnerabilities must not be filed as public issues.** See [SECURITY.md](https://github.com/pretensor-ai/pretensor/blob/main/SECURITY.md) and report privately via [GitHub Security Advisories](https://github.com/pretensor-ai/pretensor/security/advisories/new).
14
+
15
+ - type: input
16
+ id: pretensor-version
17
+ attributes:
18
+ label: Pretensor version
19
+ description: Output of `pretensor --version`.
20
+ placeholder: "0.1.0aN"
21
+ validations:
22
+ required: true
23
+
24
+ - type: dropdown
25
+ id: backend
26
+ attributes:
27
+ label: Database backend
28
+ options:
29
+ - PostgreSQL
30
+ - MySQL
31
+ - Snowflake
32
+ - BigQuery
33
+ - Other
34
+ validations:
35
+ required: true
36
+
37
+ - type: input
38
+ id: backend-version
39
+ attributes:
40
+ label: Database version
41
+ description: e.g. `PostgreSQL 16.3`, `Snowflake 8.x`.
42
+ validations:
43
+ required: true
44
+
45
+ - type: dropdown
46
+ id: problem-kind
47
+ attributes:
48
+ label: What is wrong in the graph?
49
+ options:
50
+ - Table missing
51
+ - Column missing
52
+ - Foreign key missing or wrong
53
+ - Inferred join / relationship wrong
54
+ - Wrong metadata (types, row counts, comments)
55
+ - Search / context returns the wrong schema objects
56
+ - Other
57
+ validations:
58
+ required: true
59
+
60
+ - type: dropdown
61
+ id: surface
62
+ attributes:
63
+ label: Where do you see it?
64
+ description: The surface where the wrong output shows up.
65
+ options:
66
+ - CLI (`pretensor list` / `validate` / `export`)
67
+ - MCP tool response (`schema`, `context`, `traverse`, ...)
68
+ - Both
69
+ - Other
70
+ validations:
71
+ required: true
72
+
73
+ - type: textarea
74
+ id: expected
75
+ attributes:
76
+ label: What the database actually contains
77
+ description: |
78
+ The relevant schema as it exists in your database — a sanitized DDL
79
+ snippet (`CREATE TABLE ...`), an information-schema query result, or a
80
+ prose description. Redact table/column names if needed, but keep the
81
+ structure (keys, references) intact.
82
+ render: sql
83
+ validations:
84
+ required: true
85
+
86
+ - type: textarea
87
+ id: actual
88
+ attributes:
89
+ label: What Pretensor produced instead
90
+ description: The wrong or missing output — CLI output, MCP tool response JSON, or `pretensor export` fragment.
91
+ render: shell
92
+ validations:
93
+ required: true
94
+
95
+ - type: dropdown
96
+ id: reindex
97
+ attributes:
98
+ label: Does a fresh index reproduce it?
99
+ description: Whether the problem survives a full `pretensor index` (not just `reindex`) into a clean state directory.
100
+ options:
101
+ - Yes — reproduced after a fresh full index
102
+ - No — a fresh index fixed it
103
+ - Not tried
104
+ validations:
105
+ required: true
106
+
107
+ - type: textarea
108
+ id: logs
109
+ attributes:
110
+ label: Index/reindex logs or additional context
111
+ description: Output of the indexing run (add `--log-level debug` if possible). Redact secrets, DSNs, and personally identifiable data.
112
+ render: shell
113
+
114
+ - type: checkboxes
115
+ id: checks
116
+ attributes:
117
+ label: Pre-submission checks
118
+ options:
119
+ - label: I searched existing issues and did not find a duplicate.
120
+ required: true
121
+ - label: I redacted credentials and sensitive schema details from all snippets.
122
+ required: true
@@ -27,7 +27,12 @@ jobs:
27
27
  run: |
28
28
  set -euo pipefail
29
29
  version="${BRANCH#publish/}"
30
- if gh pr view "$BRANCH" --repo "$REPO" --json number >/dev/null 2>&1; then
30
+ # Only an OPEN PR should count as "already handled": `gh pr view`
31
+ # on a branch name also resolves closed and merged PRs, so a
32
+ # re-pushed release branch whose earlier PR was merged would be
33
+ # skipped and the release would stall with no PR to review.
34
+ open_count=$(gh pr list --repo "$REPO" --head "$BRANCH" --state open --json number --jq 'length')
35
+ if [ "$open_count" -gt 0 ]; then
31
36
  echo "PR already open for ${BRANCH}."
32
37
  else
33
38
  gh pr create --repo "$REPO" --base main --head "$BRANCH" \
@@ -133,6 +133,11 @@ jobs:
133
133
  # branch and integration there is PR-only by repo policy.
134
134
  name: Archive release-gate baselines (open PR)
135
135
  needs: [pypi]
136
+ # Explicit condition: the default success() check looks at the whole
137
+ # transitive needs chain, so the skipped TestPyPI job on final (non-pre)
138
+ # releases silently skipped this job even though pypi succeeded. That is
139
+ # how the v0.1.0 baseline was never archived.
140
+ if: always() && needs.pypi.result == 'success'
136
141
  runs-on: ubuntu-latest
137
142
  permissions:
138
143
  contents: write
@@ -151,7 +156,10 @@ jobs:
151
156
  TAG: ${{ github.ref_name }}
152
157
  GH_TOKEN: ${{ github.token }}
153
158
  run: |
154
- if git diff --quiet --exit-code tests/benchmark/results/; then
159
+ # The artifact lands as untracked files in a fresh checkout, so
160
+ # `git diff` never sees it — check the porcelain status (which
161
+ # includes untracked paths) instead.
162
+ if [ -z "$(git status --porcelain tests/benchmark/results/)" ]; then
155
163
  echo "No release-gate JSON to archive."
156
164
  exit 0
157
165
  fi
@@ -171,6 +179,9 @@ jobs:
171
179
  github-release:
172
180
  name: Create GitHub Release
173
181
  needs: [pypi, detect]
182
+ # Same transitive-skip fix as archive-results: run whenever the publish
183
+ # itself succeeded, even though TestPyPI was skipped for a final release.
184
+ if: always() && needs.pypi.result == 'success' && needs.detect.result == 'success'
174
185
  runs-on: ubuntu-latest
175
186
  permissions:
176
187
  contents: write
@@ -0,0 +1,262 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ The format is based on [Keep a Changelog 1.1.0](https://keepachangelog.com/en/1.1.0/),
6
+ and this project adheres to [PEP 440](https://peps.python.org/pep-0440/) versioning.
7
+
8
+ `0.1.0` is the first non-alpha release: `pip install pretensor` resolves
9
+ to the latest non-prerelease version, and pre-releases published after it
10
+ require `--pre`. Until `1.0.0` ships, the schema and CLI surface can
11
+ still change between minor versions; this changelog tracks what moves
12
+ between releases.
13
+
14
+ ## [0.2.0] - 2026-09-04
15
+
16
+ ### Added
17
+ - The release gate honours a per-release
18
+ `tests/benchmark/results/<tag>/accepted-regressions.toml`. Each entry names
19
+ one dataset, level and metric, the value the release ships at, and a
20
+ reason. The value is a floor, not a waiver: a run that is worse than the
21
+ accepted value still blocks, and an entry that matches no regression is an
22
+ error. Deliberate precision/recall trade-offs no longer require bypassing
23
+ the gate.
24
+ - `pretensor init`, an interactive first-run setup wizard.
25
+ - `pretensor init`'s build-from-parts flow now supports mysql, snowflake,
26
+ and bigquery in addition to postgres, and a `--dialect` flag to force the
27
+ dialect instead of inferring it from the DSN.
28
+ - `analyze --all` over repositories configured in config.yaml.
29
+ - Sources can now hold a whole-DSN `url:` reference (e.g. `${DATABASE_URL}`)
30
+ instead of individual connection fields. `pretensor init` writes one of
31
+ these automatically when the indexed DSN came from a single environment
32
+ variable, so `config.yaml` stays safe to commit; `pretensor index --source`
33
+ and `--all` resolve the reference at run time.
34
+ - Bare `pretensor` (no subcommand) prints a one-line hint to run
35
+ `pretensor init` when no connections are indexed yet, before showing help.
36
+ - `pretensor init --client <key>` (repeatable, one of `claude-code`,
37
+ `claude-desktop`, `cursor`) to explicitly register with a detected MCP
38
+ client under `--yes` or a non-interactive run, since merely detecting a
39
+ client installed is not consent to write its config.
40
+ - `pretensor init` now detects Claude Desktop on Windows as well
41
+ (`%APPDATA%\Claude\claude_desktop_config.json`).
42
+ - `pretensor analyze` scans bare `.sql` files, not just SQL embedded in
43
+ Python source. Each `.sql` file is treated as one high-confidence
44
+ consumer, with table references unioned across all of its statements.
45
+
46
+ ### Security
47
+ - `pretensor quickstart` now binds its throwaway Postgres to `127.0.0.1:55432`
48
+ instead of all interfaces. In 0.1.0 the sandbox listened on every interface
49
+ with the default `postgres:postgres` credentials, and Docker publishes ports
50
+ past host firewalls, so on a machine with a public IP it was reachable from
51
+ the internet. If you ran the 0.1.0 quickstart on a server, run
52
+ `pretensor quickstart --down`, upgrade, and start it again.
53
+
54
+ ### Changed
55
+ - Same-name join inference is gated by how many tables share a column name
56
+ (`GraphConfig.same_name_max_tables`, default 8). Hub columns shared by more
57
+ than 8 tables (`customer_id` on every fact table, `date_id` on 40 tables)
58
+ no longer produce same-name candidates, same-name confidence decays with
59
+ how widely the name is shared, and a join path is only flagged ambiguous
60
+ when another path ties its cost. On warehouse-sized schemas this cuts
61
+ inferred edges and index time by an order of magnitude at the cost of some
62
+ recall on hub columns. Set `same_name_max_tables` to `null` to restore the
63
+ ungated behaviour.
64
+ - `analyze --connection` is now optional: it is required unless `--all` is
65
+ passed. Omitting it without `--all` exits 1 with a runtime message
66
+ instead of failing argument parsing with a usage error.
67
+ - `pretensor init`'s interactive flow now opens with a summary of everything
68
+ inferred and a single Yes/No/Customize choice instead of asking a
69
+ question per item up front. Yes proceeds with no further questions;
70
+ Customize walks through the same per-item questions as before. After
71
+ indexing (and after linking a repository), interactive runs offer to add
72
+ another database connection or repository. When the optional
73
+ `[embeddings]` extra is installed, the guided flow also asks once,
74
+ before indexing, whether to compute table embeddings.
75
+ - `analyze --all --json` now emits a single JSON array of per-repository
76
+ summaries instead of interleaving unparseable "Analyzing <path>" lines
77
+ between them.
78
+
79
+ ## [0.1.0] - 2026-08-13
80
+
81
+ ### Fixed
82
+ - `pretensor serve` crashed at startup on fresh installs: the unbounded
83
+ `mcp>=1.0` dependency resolved to the new `mcp` 2.0 major release,
84
+ whose `Server` API is incompatible. The dependency is now capped to
85
+ `mcp>=1.0,<2` (2.x support is tracked as follow-up work), and an
86
+ end-to-end stdio smoke test now exercises the real CLI handshake so a
87
+ startup-breaking dependency drift fails in CI instead of on users'
88
+ machines.
89
+ - `pretensor serve` startup errors are printed to stderr instead of
90
+ stdout. Stdout is the MCP JSON-RPC channel and clients only surface
91
+ stderr in their logs, so a startup failure looked like a silent
92
+ disconnect.
93
+ - `pretensor analyze`: statements quoting identifiers with backticks
94
+ (MySQL, BigQuery `` `project.dataset.table` ``) no longer fail table
95
+ resolution. The multi-dialect parse retry accepted the first dialect
96
+ returning any refs, and generic-dialect tokenization of backticks
97
+ produced garbage names that stopped the retry before the right dialect
98
+ ran; implausible refs are now treated as a failed parse.
99
+ - `pretensor analyze`: table references resolve case-insensitively when
100
+ exactly one indexed table matches, so conventional lowercase SQL
101
+ resolves against Snowflake's uppercase-stored identifiers. Exact
102
+ matches still win, and ambiguous case-variant twins stay dropped.
103
+ - `pretensor analyze`: MySQL `REPLACE INTO` statements are recognized and
104
+ classified as writes (sqlglot cannot parse them in any dialect; the
105
+ pre-parse normalizer rewrites them to `INSERT INTO`, which has the same
106
+ write-target shape).
107
+ - `pretensor analyze`: SQL-bearing variable detection also matches
108
+ affixed names (`merge_sql`, `orders_query`, `sql_fetch_users`), not
109
+ only the exact names `query`/`sql`/`stmt`/`statement`. The is-this-SQL
110
+ classifier still gates every candidate, so non-SQL strings in such
111
+ variables are rejected as before.
112
+ - The MCP `cypher` tool no longer leaks a worker thread per timed-out
113
+ query: all queries now run on one shared, bounded thread pool, and a
114
+ timeout returns immediately instead of blocking until the runaway
115
+ query finishes. Under sustained slow-query load the previous
116
+ per-query executors could accumulate threads without limit.
117
+
118
+ ### Added
119
+ - `pretensor analyze`: scan an application repository for SQL string
120
+ literals in Python source and link the code that issues them to the
121
+ indexed tables in the graph. Produces `ExternalConsumer` nodes and
122
+ `CONSUMES` edges carrying provenance (service, file, line range,
123
+ read/write op, confidence), written idempotently per scan run with
124
+ stale rows swept on re-scan. Raw SQL text is never stored: only a
125
+ `sha256[:16]` fingerprint and the resolved table references. Flags:
126
+ required `--connection`, `--service`, repeatable `--include` /
127
+ `--exclude`, `--max-file-bytes`, `--min-confidence`,
128
+ `--default-schema` (schema assumed for unqualified table names),
129
+ `--dry-run`, and `--json`. When the graph has no tables for the
130
+ connection the command errors with a copy-pasteable `pretensor index`
131
+ hint; it never auto-indexes. A `# noqa: pretensor-analyze` comment on
132
+ or above a statement opts it out of extraction.
133
+ - `consumers` MCP tool: the external code locations that read or write
134
+ one table (service, file, line range, op, kind, confidence), from the
135
+ data produced by `pretensor analyze`. Optional `op` filter and
136
+ `min_confidence` cutoff.
137
+ - The `impact` MCP tool now attaches a `consumers` list to every
138
+ reached table. The field is additive. Existing callers that ignore
139
+ it are unaffected.
140
+ - `pathspec` added to base dependencies (gitignore-aware repository
141
+ walking for `analyze`).
142
+
143
+ ## [0.1.0a4] - 2026-07-13
144
+
145
+ ### Fixed
146
+ - `pretensor export` no longer crashes with `Parameter database_name not
147
+ found`. The export query builder bound scope parameters that some node
148
+ tables' queries never referenced (e.g. the semantic-layer tables), which
149
+ Kuzu's prepared statements reject; parameters are now built to match
150
+ exactly the filter each query generates. `export` is also covered by an
151
+ end-to-end CLI test against a real graph now.
152
+ - `pretensor reindex <name>` with a registry connection name no longer
153
+ dumps a raw traceback; it exits cleanly and suggests
154
+ `pretensor reindex --database <name>` when the value matches a known
155
+ connection.
156
+ - `pretensor quickstart` no longer points `docker compose` at the
157
+ compose file inside `site-packages`. Snap-confined Docker (the default
158
+ `snap install docker` on Ubuntu) can't read files under hidden
159
+ directories in `$HOME`, so a `pipx install` (venv under
160
+ `~/.local/pipx/venvs/...`) made quickstart fail with an opaque
161
+ `permission denied` error. Quickstart now copies the compose file and
162
+ Pagila SQL fixtures into `./.pretensor/quickstart/` (next to the graph
163
+ output) before invoking compose, and prints a hint about snap Docker +
164
+ hidden paths if a permission error slips through anyway.
165
+
166
+ ### Added
167
+ - Agent-framework SDK adapters for LangChain, LlamaIndex, and Google ADK,
168
+ exposing the MCP tools as native framework tools.
169
+ - `pretensor --version` prints the installed package version.
170
+ - CLI flag names unified across subcommands: the workspace directory is
171
+ `--state-dir` everywhere and the connection selector is `--database`/`-d`
172
+ everywhere. The previous spellings (`--graph-dir` on `serve`, `--db` on
173
+ `validate`) keep working as hidden deprecated aliases.
174
+ - `SECURITY.md` with the supported-versions and responsible-disclosure
175
+ policy.
176
+ - `pretensor benchmark {l1,l2,l3}` CLI scaffolding for the 3-level benchmark
177
+ harness. Dispatch / I/O wiring only; metric computation and the L3 runners
178
+ land in follow-up changes. `l1`/`l2` accept `--embeddings`; `l3` accepts
179
+ `--runner {baseline,pretensor}`, `--model`, and `--seed`.
180
+ - `pretensor benchmark compare --baseline <path> --current <path>
181
+ [--tolerance <float>]` regression-gate subcommand. Reads two
182
+ `BenchmarkResult` JSON files, classifies metric changes by direction
183
+ (`higher_is_better` drops and `lower_is_better` rises beyond tolerance
184
+ fail), prints a human-readable diff to stderr, and exits `0` on no
185
+ regression, `1` on regression, `2` on bad input (dataset/level mismatch
186
+ or malformed JSON).
187
+ - `pretensor.benchmark.results` module: `BenchmarkResult` / `Metric`
188
+ dataclasses, deterministic `write_json` / `read_json` (sorted keys,
189
+ indent 2, trailing newline), `compare()` returning a `ComparisonReport`,
190
+ and `write_csv()` for spreadsheet review.
191
+
192
+ ### Changed
193
+ - The MCP server now reuses one graph connection per database for the
194
+ lifetime of the server instead of re-opening the graph file (and
195
+ re-running schema migration probes) on every tool call. A separate
196
+ `pretensor reindex` run is picked up on server restart, as before.
197
+
198
+ ### Security
199
+ - The MCP `cypher` tool now opens the graph in Kuzu's engine-level
200
+ read-only mode, so mutations cannot commit even if the statement
201
+ allowlist were bypassed; the allowlist itself also rejects DDL and
202
+ file-I/O commands (`COPY`, `EXPORT`, `ATTACH`, `LOAD`, …) explicitly.
203
+ - Encryption keystore and registry writes are atomic and created with
204
+ owner-only permissions; a warning is printed if an existing keystore is
205
+ world-readable.
206
+ - MCP tool and resource errors returned to clients are sanitized: the full
207
+ stack is logged server-side under a correlation id, and the client
208
+ receives a generic message with that id instead of exception text or
209
+ filesystem paths.
210
+
211
+ ### Removed
212
+ - MCP `context` tool: removed the deprecated `name` field from column
213
+ entries: use `column_name`.
214
+ - `scripts/benchmark_graph_rag_nl2sql.py`: unrunnable after the LLM
215
+ stack was stripped from OSS (imported the since-deleted `suggest_query` MCP
216
+ tool). The new `pretensor benchmark` CLI covers its namespace.
217
+ - `scripts/e2e_pagila.py`: unrunnable for the same reason (imported deleted
218
+ `llm_runtime` helpers, `suggest_query_payload`, and the `llm_options` CLI
219
+ module). The Docker-backed `tests/e2e/` suite is the canonical full-stack
220
+ E2E path now.
221
+
222
+ ## [0.1.0a3] - 2026-05-03
223
+
224
+ ### Fixed
225
+ - Ship the quickstart assets in the wheel so the documented quickstart
226
+ runs from a clean `pip install pretensor` (they were missing from the
227
+ built distribution in earlier alphas).
228
+
229
+ ## [0.1.0a2] - 2026-04-28
230
+
231
+ ### Fixed
232
+ - Ship the `pretensor.skills` package data in the wheel; earlier wheels
233
+ omitted it, so skill-backed flows failed on a clean install.
234
+
235
+ ## [0.1.0a1] - 2026-04-26
236
+
237
+ ### Added
238
+ - CD pipeline at `.github/workflows/release.yml` that publishes tagged
239
+ `v*.*.*` versions to PyPI via OIDC trusted publishing, routing
240
+ prereleases through TestPyPI first.
241
+ - `"Typing :: Typed"` PyPI classifier, pairing the existing
242
+ `src/pretensor/py.typed` PEP 561 marker with its public advertisement.
243
+ - Release runbook sections in `docs/releases.md` covering publishing,
244
+ one-time OIDC setup, an optional pre-merge dry-run, cutting a release,
245
+ and the post-transfer re-point procedure.
246
+
247
+ ### Fixed
248
+ - Drop the embedding dependencies from the `[all-connectors]` extra so it
249
+ installs only connector drivers, not the heavy ML stack.
250
+
251
+ ## [0.1.0a0] - 2026-04-17
252
+
253
+ ### Added
254
+ - Initial public alpha on PyPI: reserves the `pretensor` name and ships
255
+ the first published build of the schema-introspection MCP server, CLI,
256
+ and bundled connectors.
257
+
258
+ <!--
259
+ When cutting a release, copy the contents of [Unreleased] into a new
260
+ `## [X.Y.Z] - YYYY-MM-DD` section above, then reset [Unreleased] to empty
261
+ subsections (Added / Changed / Deprecated / Removed / Fixed / Security).
262
+ -->
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.4
1
+ Metadata-Version: 2.5
2
2
  Name: pretensor
3
- Version: 0.1.0a4
3
+ Version: 0.2.0
4
4
  Summary: Pretensor database knowledge graph — Kuzu-backed schema graph from precomputed DB introspection
5
5
  Project-URL: Homepage, https://github.com/pretensor-ai/pretensor
6
6
  Project-URL: Repository, https://github.com/pretensor-ai/pretensor
@@ -27,7 +27,8 @@ Requires-Dist: cryptography>=42.0
27
27
  Requires-Dist: httpx>=0.27
28
28
  Requires-Dist: igraph<1,>=0.11
29
29
  Requires-Dist: kuzu<1,>=0.7
30
- Requires-Dist: mcp>=1.0
30
+ Requires-Dist: mcp<2,>=1.0
31
+ Requires-Dist: pathspec>=0.12
31
32
  Requires-Dist: pydantic>=2.0
32
33
  Requires-Dist: rapidfuzz>=3.0
33
34
  Requires-Dist: rich>=13.0
@@ -79,12 +80,12 @@ Description-Content-Type: text/markdown
79
80
  [![PyPI](https://img.shields.io/pypi/v/pretensor.svg)](https://pypi.org/project/pretensor/)
80
81
  [![CI](https://github.com/pretensor-ai/pretensor/actions/workflows/ci.yml/badge.svg?branch=main)](https://github.com/pretensor-ai/pretensor/actions/workflows/ci.yml)
81
82
  [![Bench](https://github.com/pretensor-ai/pretensor/actions/workflows/bench.yml/badge.svg?branch=main)](https://github.com/pretensor-ai/pretensor/actions/workflows/bench.yml)
82
- [![Status: Alpha](https://img.shields.io/badge/status-alpha-yellow.svg)](#status)
83
+ [![Status: Beta](https://img.shields.io/badge/status-beta-blue.svg)](#status)
83
84
  [![Python: 3.11 | 3.12](https://img.shields.io/badge/python-3.11%20%7C%203.12-blue.svg)](#prerequisites)
84
85
 
85
86
  **Pretensor OSS** introspects **PostgreSQL** and **Snowflake**, with optional **BigQuery** connector support, builds a **Kuzu** knowledge graph of tables, columns, foreign keys, inferred joins, and related metadata, and exposes that graph to AI tools through an **MCP** (Model Context Protocol) server. Agents query schema context and search without issuing raw SQL against your graph store.
86
87
 
87
- > **Status: Alpha.** Pretensor is on PyPI as `pretensor` and currently in alpha. CLI flags, MCP tools, and graph schema can still change between alpha versions — pin exact versions until `1.0.0`. See [docs/releases.md](https://github.com/pretensor-ai/pretensor/blob/main/docs/releases.md) for the versioning policy.
88
+ > **Status: Beta.** Pretensor is on PyPI as `pretensor`; `0.1.0` is the first non-alpha release. CLI flags, MCP tools, and graph schema can still change between minor versions. Pin exact versions until `1.0.0`. See [docs/releases.md](https://github.com/pretensor-ai/pretensor/blob/main/docs/releases.md) for the versioning policy.
88
89
 
89
90
  ## Who is this for
90
91
 
@@ -96,7 +97,7 @@ Description-Content-Type: text/markdown
96
97
  ## Prerequisites
97
98
 
98
99
  - **Python 3.11 or 3.12** (3.13 not yet tested).
99
- - A reachable database for `pretensor index`. Every database driver ships as an extra — PostgreSQL via `pretensor[postgres]`, Snowflake via `pretensor[snowflake]`, BigQuery via `pretensor[bigquery]`.
100
+ - A reachable database for `pretensor index`. Every database driver ships as an extra: PostgreSQL via `pretensor[postgres]`, Snowflake via `pretensor[snowflake]`, BigQuery via `pretensor[bigquery]`.
100
101
 
101
102
  ## Install
102
103
 
@@ -109,7 +110,7 @@ uv pip install 'pretensor[postgres]'
109
110
 
110
111
  > **Heads-up:** the database drivers are *not* bundled in the base install. A
111
112
  > bare `pip install pretensor` installs the CLI and MCP server but **no DB
112
- > driver** — `pretensor index postgresql://…` will then fail at connect time
113
+ > driver**. `pretensor index postgresql://…` will then fail at connect time
113
114
  > with `Postgres connector requires psycopg2. Install the Postgres extra: pip
114
115
  > install 'pretensor[postgres]' (or pip install psycopg2-binary).` Install the
115
116
  > extra matching your database (`postgres`, `snowflake`, `bigquery`, or
@@ -119,7 +120,7 @@ Optional features are exposed as extras:
119
120
 
120
121
  | Extra | Adds | Use when |
121
122
  |-------|------|----------|
122
- | `pretensor[postgres]` | `psycopg2-binary` | You're indexing PostgreSQL. **Required** — a bare install has no Postgres driver. |
123
+ | `pretensor[postgres]` | `psycopg2-binary` | You're indexing PostgreSQL. **Required**: a bare install has no Postgres driver. |
123
124
  | `pretensor[snowflake]` | `snowflake-sqlalchemy` | You're indexing a Snowflake warehouse. |
124
125
  | `pretensor[bigquery]` | `google-cloud-bigquery` | You're indexing BigQuery. |
125
126
  | `pretensor[clustering]` | `leidenalg` | You want Leiden community detection during indexing. Without this, Pretensor falls back to igraph Louvain (works, but no resolution tuning). |
@@ -133,22 +134,41 @@ Try it without installing:
133
134
  uvx --from pretensor pretensor --help
134
135
  ```
135
136
 
136
- > **A note on alpha versions.** Pretensor is in alpha. The plain `pip install pretensor` command picks up the latest alpha because PyPI has no stable release yet. Once `1.0.0` ships, future alphas will require `--pre` (e.g. `pip install --pre pretensor`); pin to a specific version (e.g. `pretensor==<version>`) if you want a deterministic install today — see the [PyPI badge above](https://pypi.org/project/pretensor/) for the latest.
137
+ > **A note on versions.** From `0.1.0` on, plain `pip install pretensor` resolves to the latest non-alpha release, and pre-releases require `--pre` (e.g. `pip install --pre pretensor`). Pin to a specific version (e.g. `pretensor==<version>`) if you want a deterministic install. See the [PyPI badge above](https://pypi.org/project/pretensor/) for the latest.
137
138
 
138
139
  If you want to hack on Pretensor itself rather than use it, see the contributor setup in [CONTRIBUTING.md](https://github.com/pretensor-ai/pretensor/blob/main/CONTRIBUTING.md) for the `git clone` + `make install` flow.
139
140
 
140
141
  ## Quickstart
141
142
 
142
143
  ```bash
143
- pretensor index postgresql://USER:PASSWORD@HOST:5432/DBNAME
144
- pretensor serve --config-only # prints mcpServers JSON for Claude / Cursor
144
+ pip install 'pretensor[postgres]'
145
+ pretensor init
145
146
  ```
146
147
 
147
- `serve --config-only` prints the **`mcpServers` JSON** to stdout. Merge the `pretensor` entry into your Claude or Cursor MCP settings — the IDE starts the server automatically. Run `pretensor serve` directly if you prefer a long-running terminal process (config hints go to stderr, keeping stdout clean for JSON-RPC).
148
+ `init` finds your database connection, indexes it, links your code, and registers
149
+ pretensor with Claude or Cursor. Prefer to drive it yourself? Every step is still a
150
+ flag: see [guides/quickstart.md](https://github.com/pretensor-ai/pretensor/blob/main/guides/quickstart.md).
148
151
 
149
- Use **`--state-dir`** on `index` / `reindex` and **`--graph-dir`** on `serve` when overriding the default state directory (`.pretensor`).
152
+ ## Scan application code (`analyze`)
150
153
 
151
- **Full guide — install, tools, visibility, reindexing, graph visualization:** [guides/quickstart.md](https://github.com/pretensor-ai/pretensor/blob/main/guides/quickstart.md)
154
+ ```bash
155
+ pretensor analyze path/to/service-repo --connection mydb
156
+ ```
157
+
158
+ `analyze` scans a repository's Python (`.py`) and SQL (`.sql`) files: it lifts
159
+ SQL string literals from Python source via the stdlib AST (no code is
160
+ executed) and reads bare `.sql` files whole, resolves each statement's table
161
+ references with sqlglot, and links the issuing code to the matching tables in the graph as
162
+ external consumers: service, file, line range, read/write op, and a confidence
163
+ score. Raw SQL text is never stored, only a fingerprint. The results power the
164
+ `consumers` MCP tool and enrich `impact`, so an agent can answer "which
165
+ services consume this table?" with provenance.
166
+
167
+ Useful flags: `--service` labels the scanned repo (defaults to the directory
168
+ name), `--default-schema` sets the schema assumed for unqualified table names,
169
+ `--dry-run` previews without writing, `--json` emits a machine-readable
170
+ summary. A `# noqa: pretensor-analyze` comment on or above a statement opts it
171
+ out.
152
172
 
153
173
  ## MCP tools
154
174
 
@@ -159,18 +179,47 @@ Use **`--state-dir`** on `index` / `reindex` and **`--graph-dir`** on `serve` wh
159
179
  | `query` | BM25 keyword search over table and entity metadata. Hybrid BM25 + cosine RRF rerank when `[embeddings]` is installed and tables carry vectors. |
160
180
  | `semantic_search` | Cosine ranking over indexed `SchemaTable` embeddings. Requires `pretensor[embeddings]`; returns a structured BM25-fallback envelope when the extra is absent or no tables have been embedded. |
161
181
  | `cypher` | Read-only Kuzu Cypher for one indexed database; mutating clauses are rejected. |
162
- | `context` | Full context for one physical table, including columns, joins, lineage, and cluster metadata. Optional `include_similar` arg surfaces cross-cluster nearest neighbors when embeddings are present. |
163
- | `traverse` | Join paths between two physical tables. When ambiguous and tables carry embeddings, ranks tied paths by embedding similarity. |
164
- | `impact` | Downstream tables reachable from a table via FK and inferred-join edges. |
182
+ | `context` | Full context for one physical table, including columns, joins, lineage, and cluster metadata. Every relationship carries `confidence` + `source` provenance. Optional `include_similar` arg surfaces cross-cluster nearest neighbors when embeddings are present. |
183
+ | `traverse` | Join paths between two physical tables. Every step carries `confidence` + `source` provenance. When ambiguous and tables carry embeddings, ranks tied paths by embedding similarity. |
184
+ | `impact` | Downstream tables reachable from a table via FK and inferred-join edges. Each reached table carries the external code consumers found by `pretensor analyze`. |
185
+ | `consumers` | External code locations (service, file, line range, read/write op, confidence) that consume one table, from `pretensor analyze`. |
165
186
  | `detect_changes` | Compare the live database schema to the last indexed snapshot without mutating the graph. |
166
187
  | `compile_metric` | Compile semantic-layer YAML into validated SQL for one indexed database. The error string includes a "did you mean: …" suggestion list when an unresolved metric, table, or column name has close matches. |
167
188
  | `validate_sql` | Validate SQL against the indexed graph before execution. |
168
189
 
190
+ ### Join confidence & provenance
191
+
192
+ `context` (per relationship) and `traverse` (per path step) both report how a
193
+ join was derived, so an agent can decide how much to trust it before writing
194
+ SQL:
195
+
196
+ - `confidence` — a `0.0`–`1.0` score. Declared foreign keys always report
197
+ `1.0`; inferred joins carry the score produced by the pass that found them.
198
+ - `source` — how the join was derived:
199
+ - `declared_fk` — a real foreign-key constraint in the database. Always
200
+ confidence `1.0`.
201
+ - `heuristic` — inferred from naming conventions and column-type overlap.
202
+ - `llm_inferred` — inferred by an LLM pass over schema metadata.
203
+ - `embedding` — inferred from vector similarity between column/table
204
+ descriptions.
205
+ - `statistical` — a heuristic or LLM candidate whose confidence was
206
+ re-scored using sampled value overlap; the original hypothesis source is
207
+ folded into this value once the statistical pass adjusts it.
208
+ - `entity_link` — cross-database bridge steps in `traverse` derived from a
209
+ confirmed `SAME_ENTITY` link, not a same-database join.
210
+ - `reasoning` — an optional short, human-readable rationale for inferred
211
+ joins (absent for declared FKs, where the constraint itself is the
212
+ rationale).
213
+
214
+ Agents should prefer `declared_fk` and high-confidence edges when composing
215
+ SQL, and treat sub-`0.5` confidence as speculative — verify with
216
+ `validate_sql` (or inspect `reasoning`) before relying on it.
217
+
169
218
  ## Agent-framework adapters
170
219
 
171
220
  Agents that don't run over MCP can still reach the graph tools. Pretensor exposes
172
221
  `schema`, `context`, `traverse`, `impact`, `query`, and `validate_sql` as native
173
- tool objects for LangChain, LlamaIndex, and Google ADK — no MCP server process
222
+ tool objects for LangChain, LlamaIndex, and Google ADK. No MCP server process is
174
223
  required. The adapters call the same underlying functions the MCP server uses, so
175
224
  output is identical.
176
225
 
@@ -189,19 +238,20 @@ example per framework.
189
238
 
190
239
  `src/pretensor/` is organized by subsystem:
191
240
 
192
- - **`connectors/`** — database-specific introspection (PostgreSQL, Snowflake, BigQuery)
193
- - **`core/`** — Kuzu graph store, schema writing, relationship discovery
194
- - **`intelligence/`** — deterministic graph intelligence (classification, clustering, join-path precomputation; metric-template code exists but is not part of the default OSS indexing flow)
195
- - **`mcp/`** — MCP server, tools, resources
196
- - **`cli/`** — Typer CLI (`index`, `reindex`, `serve`, `list`, `quickstart`, `export`, `validate`, `sync-grants`, `add`, `remove`, plus the `semantic` subcommand group)
241
+ - **`connectors/`**: database-specific introspection (PostgreSQL, Snowflake, BigQuery)
242
+ - **`core/`**: Kuzu graph store, schema writing, relationship discovery
243
+ - **`intelligence/`**: deterministic graph intelligence (classification, clustering, join-path precomputation; metric-template code exists but is not part of the default OSS indexing flow)
244
+ - **`enrichment/`**: optional graph enrichment passes (dbt manifest, `analyze` code scanner)
245
+ - **`mcp/`**: MCP server, tools, resources
246
+ - **`cli/`**: Typer CLI (`init`, `index`, `reindex`, `analyze`, `serve`, `list`, `quickstart`, `export`, `validate`, `sync-grants`, `add`, `remove`, plus the `semantic` subcommand group)
197
247
 
198
248
  ## Status
199
249
 
200
- Pretensor is in **pre-release development**. Before the first packaged release:
250
+ Pretensor is **early software**:
201
251
 
202
- - The package on PyPI is named `pretensor`. The first stable release will be `1.0.0`; everything before that is alpha. `pip install pretensor` works today because no stable version exists yet — `--pre` will be required once `1.0.0` ships and future alphas resume.
203
- - There is no SemVer stability guarantee yet, so CLI flags, MCP tools, and graph schema may change between alphas. Pin exact versions.
204
- - Treat current builds as evaluation software and test upgrades in a staging environment before production use.
252
+ - The package on PyPI is named `pretensor`. `0.1.0` is the first non-alpha release; pre-releases published after it require `--pre` to install.
253
+ - There is no SemVer stability guarantee before `1.0.0`, so CLI flags, MCP tools, and graph schema may still change between releases. Pin exact versions.
254
+ - Test upgrades in a staging environment before production use.
205
255
 
206
256
  Progress and release notes: [CHANGELOG.md](https://github.com/pretensor-ai/pretensor/blob/main/CHANGELOG.md).
207
257
 
@@ -225,4 +275,4 @@ make typecheck # pyright
225
275
 
226
276
  ## License
227
277
 
228
- MIT — see [LICENSE](https://github.com/pretensor-ai/pretensor/blob/main/LICENSE).
278
+ MIT: see [LICENSE](https://github.com/pretensor-ai/pretensor/blob/main/LICENSE).