pretensor 0.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 (498) hide show
  1. pretensor-0.1.0/.env.example +0 -0
  2. pretensor-0.1.0/.gitattributes +2 -0
  3. pretensor-0.1.0/.github/CODEOWNERS +2 -0
  4. pretensor-0.1.0/.github/ISSUE_TEMPLATE/bug_report.yml +110 -0
  5. pretensor-0.1.0/.github/ISSUE_TEMPLATE/config.yml +8 -0
  6. pretensor-0.1.0/.github/ISSUE_TEMPLATE/feature_request.yml +57 -0
  7. pretensor-0.1.0/.github/ISSUE_TEMPLATE/schema_report.yml +122 -0
  8. pretensor-0.1.0/.github/pull_request_template.md +15 -0
  9. pretensor-0.1.0/.github/workflows/bench.yml +155 -0
  10. pretensor-0.1.0/.github/workflows/ci.yml +198 -0
  11. pretensor-0.1.0/.github/workflows/docs.yml +48 -0
  12. pretensor-0.1.0/.github/workflows/e2e.yml +47 -0
  13. pretensor-0.1.0/.github/workflows/no-internal-refs.yml +41 -0
  14. pretensor-0.1.0/.github/workflows/open-publish-pr.yml +36 -0
  15. pretensor-0.1.0/.github/workflows/release.yml +192 -0
  16. pretensor-0.1.0/.gitignore +76 -0
  17. pretensor-0.1.0/.gitlint +19 -0
  18. pretensor-0.1.0/.pre-commit-config.yaml +35 -0
  19. pretensor-0.1.0/.python-version +1 -0
  20. pretensor-0.1.0/CHANGELOG.md +199 -0
  21. pretensor-0.1.0/CODE_OF_CONDUCT.md +83 -0
  22. pretensor-0.1.0/CONTRIBUTING.md +173 -0
  23. pretensor-0.1.0/LICENSE +21 -0
  24. pretensor-0.1.0/Makefile +68 -0
  25. pretensor-0.1.0/PKG-INFO +251 -0
  26. pretensor-0.1.0/README.md +174 -0
  27. pretensor-0.1.0/SECURITY.md +101 -0
  28. pretensor-0.1.0/docs/agent-framework-adapters.md +84 -0
  29. pretensor-0.1.0/docs/ci.md +49 -0
  30. pretensor-0.1.0/docs/releases.md +164 -0
  31. pretensor-0.1.0/examples/README.md +25 -0
  32. pretensor-0.1.0/examples/claude-code/README.md +52 -0
  33. pretensor-0.1.0/examples/claude-code/mcp.json +8 -0
  34. pretensor-0.1.0/examples/cursor/README.md +50 -0
  35. pretensor-0.1.0/examples/cursor/mcp.json +8 -0
  36. pretensor-0.1.0/examples/pagila/.gitignore +2 -0
  37. pretensor-0.1.0/examples/pagila/README.md +77 -0
  38. pretensor-0.1.0/examples/pagila/docker-compose.yml +19 -0
  39. pretensor-0.1.0/examples/snowflake-tpch/README.md +126 -0
  40. pretensor-0.1.0/examples/windsurf/README.md +51 -0
  41. pretensor-0.1.0/examples/windsurf/mcp_config.json +8 -0
  42. pretensor-0.1.0/guides/quickstart.md +471 -0
  43. pretensor-0.1.0/pyproject.toml +151 -0
  44. pretensor-0.1.0/scripts/audit_deny_list.py +147 -0
  45. pretensor-0.1.0/scripts/check_no_internal_refs.py +114 -0
  46. pretensor-0.1.0/scripts/check_readme_urls.py +71 -0
  47. pretensor-0.1.0/scripts/data/adventureworks/schema.sql +3046 -0
  48. pretensor-0.1.0/scripts/data/adventureworks_metric_templates.yaml +67 -0
  49. pretensor-0.1.0/scripts/data/adventureworks_nl2sql_bench.json +130 -0
  50. pretensor-0.1.0/scripts/data/pagila/schema.sql +1842 -0
  51. pretensor-0.1.0/scripts/data/pagila_metric_templates.yaml +67 -0
  52. pretensor-0.1.0/scripts/data/pagila_nl2sql_bench.json +66 -0
  53. pretensor-0.1.0/scripts/data/tpch/schema.sql +121 -0
  54. pretensor-0.1.0/scripts/data/tpch_metric_templates.yaml +67 -0
  55. pretensor-0.1.0/scripts/data/tpch_nl2sql_bench.json +138 -0
  56. pretensor-0.1.0/scripts/generate_schema_snapshot.py +165 -0
  57. pretensor-0.1.0/src/pretensor/__init__.py +50 -0
  58. pretensor-0.1.0/src/pretensor/benchmark/__init__.py +54 -0
  59. pretensor-0.1.0/src/pretensor/benchmark/cli.py +294 -0
  60. pretensor-0.1.0/src/pretensor/benchmark/fixtures.py +84 -0
  61. pretensor-0.1.0/src/pretensor/benchmark/l1/__init__.py +23 -0
  62. pretensor-0.1.0/src/pretensor/benchmark/l1/metrics.py +141 -0
  63. pretensor-0.1.0/src/pretensor/benchmark/l1/pipeline.py +188 -0
  64. pretensor-0.1.0/src/pretensor/benchmark/l1/runner.py +245 -0
  65. pretensor-0.1.0/src/pretensor/benchmark/l2/__init__.py +27 -0
  66. pretensor-0.1.0/src/pretensor/benchmark/l2/gold.py +236 -0
  67. pretensor-0.1.0/src/pretensor/benchmark/l2/metrics.py +146 -0
  68. pretensor-0.1.0/src/pretensor/benchmark/l2/pipeline.py +124 -0
  69. pretensor-0.1.0/src/pretensor/benchmark/l2/runner.py +530 -0
  70. pretensor-0.1.0/src/pretensor/benchmark/l3/__init__.py +73 -0
  71. pretensor-0.1.0/src/pretensor/benchmark/l3/agent.py +316 -0
  72. pretensor-0.1.0/src/pretensor/benchmark/l3/db.py +188 -0
  73. pretensor-0.1.0/src/pretensor/benchmark/l3/gold.py +85 -0
  74. pretensor-0.1.0/src/pretensor/benchmark/l3/llm_client.py +395 -0
  75. pretensor-0.1.0/src/pretensor/benchmark/l3/mcp_client.py +357 -0
  76. pretensor-0.1.0/src/pretensor/benchmark/l3/pretensor_runner.py +456 -0
  77. pretensor-0.1.0/src/pretensor/benchmark/l3/prompt.py +132 -0
  78. pretensor-0.1.0/src/pretensor/benchmark/l3/runner.py +358 -0
  79. pretensor-0.1.0/src/pretensor/benchmark/l3/sql_equivalence.py +176 -0
  80. pretensor-0.1.0/src/pretensor/benchmark/release_gate.py +448 -0
  81. pretensor-0.1.0/src/pretensor/benchmark/results.py +298 -0
  82. pretensor-0.1.0/src/pretensor/benchmark/runner.py +109 -0
  83. pretensor-0.1.0/src/pretensor/cli/__init__.py +1 -0
  84. pretensor-0.1.0/src/pretensor/cli/commands/_source_runner.py +147 -0
  85. pretensor-0.1.0/src/pretensor/cli/commands/analyze.py +201 -0
  86. pretensor-0.1.0/src/pretensor/cli/commands/connections/__init__.py +7 -0
  87. pretensor-0.1.0/src/pretensor/cli/commands/connections/add_remove.py +126 -0
  88. pretensor-0.1.0/src/pretensor/cli/commands/connections/register.py +12 -0
  89. pretensor-0.1.0/src/pretensor/cli/commands/export.py +131 -0
  90. pretensor-0.1.0/src/pretensor/cli/commands/index.py +559 -0
  91. pretensor-0.1.0/src/pretensor/cli/commands/list.py +76 -0
  92. pretensor-0.1.0/src/pretensor/cli/commands/quickstart.py +207 -0
  93. pretensor-0.1.0/src/pretensor/cli/commands/reindex.py +646 -0
  94. pretensor-0.1.0/src/pretensor/cli/commands/semantic.py +190 -0
  95. pretensor-0.1.0/src/pretensor/cli/commands/serve.py +144 -0
  96. pretensor-0.1.0/src/pretensor/cli/commands/sync_grants.py +149 -0
  97. pretensor-0.1.0/src/pretensor/cli/commands/validate.py +176 -0
  98. pretensor-0.1.0/src/pretensor/cli/config_file.py +442 -0
  99. pretensor-0.1.0/src/pretensor/cli/constants.py +10 -0
  100. pretensor-0.1.0/src/pretensor/cli/dbt_enrichment.py +96 -0
  101. pretensor-0.1.0/src/pretensor/cli/main.py +109 -0
  102. pretensor-0.1.0/src/pretensor/cli/paths.py +43 -0
  103. pretensor-0.1.0/src/pretensor/cli/plugin.py +52 -0
  104. pretensor-0.1.0/src/pretensor/config.py +226 -0
  105. pretensor-0.1.0/src/pretensor/connectors/__init__.py +29 -0
  106. pretensor-0.1.0/src/pretensor/connectors/base.py +165 -0
  107. pretensor-0.1.0/src/pretensor/connectors/bigquery.py +468 -0
  108. pretensor-0.1.0/src/pretensor/connectors/inspect.py +321 -0
  109. pretensor-0.1.0/src/pretensor/connectors/lineage_sqlglot.py +97 -0
  110. pretensor-0.1.0/src/pretensor/connectors/models.py +130 -0
  111. pretensor-0.1.0/src/pretensor/connectors/mysql.py +402 -0
  112. pretensor-0.1.0/src/pretensor/connectors/pg_array_parse.py +53 -0
  113. pretensor-0.1.0/src/pretensor/connectors/postgres.py +938 -0
  114. pretensor-0.1.0/src/pretensor/connectors/registry.py +93 -0
  115. pretensor-0.1.0/src/pretensor/connectors/snapshot.py +244 -0
  116. pretensor-0.1.0/src/pretensor/connectors/snowflake.py +908 -0
  117. pretensor-0.1.0/src/pretensor/core/__init__.py +1 -0
  118. pretensor-0.1.0/src/pretensor/core/builder.py +307 -0
  119. pretensor-0.1.0/src/pretensor/core/dsn_crypto.py +51 -0
  120. pretensor-0.1.0/src/pretensor/core/graph_schema_manager.py +246 -0
  121. pretensor-0.1.0/src/pretensor/core/graph_store.py +1226 -0
  122. pretensor-0.1.0/src/pretensor/core/ids.py +101 -0
  123. pretensor-0.1.0/src/pretensor/core/portable_export.py +276 -0
  124. pretensor-0.1.0/src/pretensor/core/query_runner.py +67 -0
  125. pretensor-0.1.0/src/pretensor/core/registry.py +209 -0
  126. pretensor-0.1.0/src/pretensor/core/schema.py +473 -0
  127. pretensor-0.1.0/src/pretensor/core/secure_io.py +93 -0
  128. pretensor-0.1.0/src/pretensor/core/store.py +469 -0
  129. pretensor-0.1.0/src/pretensor/enrichment/__init__.py +1 -0
  130. pretensor-0.1.0/src/pretensor/enrichment/analyze/__init__.py +0 -0
  131. pretensor-0.1.0/src/pretensor/enrichment/analyze/classify.py +49 -0
  132. pretensor-0.1.0/src/pretensor/enrichment/analyze/extract_python.py +196 -0
  133. pretensor-0.1.0/src/pretensor/enrichment/analyze/parse.py +141 -0
  134. pretensor-0.1.0/src/pretensor/enrichment/analyze/pipeline.py +195 -0
  135. pretensor-0.1.0/src/pretensor/enrichment/analyze/summary.py +38 -0
  136. pretensor-0.1.0/src/pretensor/enrichment/analyze/walker.py +98 -0
  137. pretensor-0.1.0/src/pretensor/enrichment/analyze/writers.py +214 -0
  138. pretensor-0.1.0/src/pretensor/enrichment/dbt/__init__.py +30 -0
  139. pretensor-0.1.0/src/pretensor/enrichment/dbt/lineage.py +100 -0
  140. pretensor-0.1.0/src/pretensor/enrichment/dbt/manifest.py +300 -0
  141. pretensor-0.1.0/src/pretensor/enrichment/dbt/metadata.py +263 -0
  142. pretensor-0.1.0/src/pretensor/enrichment/dbt/pipeline.py +77 -0
  143. pretensor-0.1.0/src/pretensor/enrichment/dbt/resolution.py +101 -0
  144. pretensor-0.1.0/src/pretensor/enrichment/dbt/signals.py +305 -0
  145. pretensor-0.1.0/src/pretensor/entities/__init__.py +27 -0
  146. pretensor-0.1.0/src/pretensor/entities/builder.py +63 -0
  147. pretensor-0.1.0/src/pretensor/entities/classifier.py +383 -0
  148. pretensor-0.1.0/src/pretensor/entities/llm_extract.py +66 -0
  149. pretensor-0.1.0/src/pretensor/errors.py +35 -0
  150. pretensor-0.1.0/src/pretensor/graph_models/__init__.py +17 -0
  151. pretensor-0.1.0/src/pretensor/graph_models/base.py +11 -0
  152. pretensor-0.1.0/src/pretensor/graph_models/consumer.py +71 -0
  153. pretensor-0.1.0/src/pretensor/graph_models/edge.py +35 -0
  154. pretensor-0.1.0/src/pretensor/graph_models/entity.py +21 -0
  155. pretensor-0.1.0/src/pretensor/graph_models/node.py +79 -0
  156. pretensor-0.1.0/src/pretensor/graph_models/relationship.py +33 -0
  157. pretensor-0.1.0/src/pretensor/integrations/__init__.py +42 -0
  158. pretensor-0.1.0/src/pretensor/integrations/_base.py +138 -0
  159. pretensor-0.1.0/src/pretensor/integrations/google_adk.py +49 -0
  160. pretensor-0.1.0/src/pretensor/integrations/langchain.py +55 -0
  161. pretensor-0.1.0/src/pretensor/integrations/llamaindex.py +53 -0
  162. pretensor-0.1.0/src/pretensor/intelligence/__init__.py +33 -0
  163. pretensor-0.1.0/src/pretensor/intelligence/cluster_labeler.py +425 -0
  164. pretensor-0.1.0/src/pretensor/intelligence/clustering.py +168 -0
  165. pretensor-0.1.0/src/pretensor/intelligence/combining.py +32 -0
  166. pretensor-0.1.0/src/pretensor/intelligence/discovery.py +114 -0
  167. pretensor-0.1.0/src/pretensor/intelligence/embeddings.py +317 -0
  168. pretensor-0.1.0/src/pretensor/intelligence/graph_export.py +200 -0
  169. pretensor-0.1.0/src/pretensor/intelligence/heuristic.py +544 -0
  170. pretensor-0.1.0/src/pretensor/intelligence/join_paths/__init__.py +130 -0
  171. pretensor-0.1.0/src/pretensor/intelligence/join_paths/on_demand.py +516 -0
  172. pretensor-0.1.0/src/pretensor/intelligence/join_paths/storage.py +70 -0
  173. pretensor-0.1.0/src/pretensor/intelligence/llm_infer.py +78 -0
  174. pretensor-0.1.0/src/pretensor/intelligence/llm_runtime.py +62 -0
  175. pretensor-0.1.0/src/pretensor/intelligence/metric_templates.py +193 -0
  176. pretensor-0.1.0/src/pretensor/intelligence/pipeline.py +364 -0
  177. pretensor-0.1.0/src/pretensor/intelligence/role_exemplars.py +263 -0
  178. pretensor-0.1.0/src/pretensor/intelligence/schema_classification.py +360 -0
  179. pretensor-0.1.0/src/pretensor/intelligence/scoring.py +76 -0
  180. pretensor-0.1.0/src/pretensor/intelligence/semantic.py +240 -0
  181. pretensor-0.1.0/src/pretensor/intelligence/shadow_alias.py +101 -0
  182. pretensor-0.1.0/src/pretensor/intelligence/statistical.py +50 -0
  183. pretensor-0.1.0/src/pretensor/intelligence/steps.py +191 -0
  184. pretensor-0.1.0/src/pretensor/intelligence/steps_embedding.py +168 -0
  185. pretensor-0.1.0/src/pretensor/introspection/__init__.py +6 -0
  186. pretensor-0.1.0/src/pretensor/introspection/inspector.py +5 -0
  187. pretensor-0.1.0/src/pretensor/introspection/models/__init__.py +0 -0
  188. pretensor-0.1.0/src/pretensor/introspection/models/base.py +5 -0
  189. pretensor-0.1.0/src/pretensor/introspection/models/config.py +237 -0
  190. pretensor-0.1.0/src/pretensor/introspection/models/dsn.py +550 -0
  191. pretensor-0.1.0/src/pretensor/introspection/models/plan.py +116 -0
  192. pretensor-0.1.0/src/pretensor/introspection/models/schema.py +10 -0
  193. pretensor-0.1.0/src/pretensor/introspection/models/semantic.py +121 -0
  194. pretensor-0.1.0/src/pretensor/introspection/models/validation.py +116 -0
  195. pretensor-0.1.0/src/pretensor/introspection/snapshot.py +46 -0
  196. pretensor-0.1.0/src/pretensor/mcp/__init__.py +16 -0
  197. pretensor-0.1.0/src/pretensor/mcp/config_json.py +24 -0
  198. pretensor-0.1.0/src/pretensor/mcp/payload_types.py +274 -0
  199. pretensor-0.1.0/src/pretensor/mcp/resources/__init__.py +17 -0
  200. pretensor-0.1.0/src/pretensor/mcp/resources/markdown.py +314 -0
  201. pretensor-0.1.0/src/pretensor/mcp/server.py +285 -0
  202. pretensor-0.1.0/src/pretensor/mcp/service.py +49 -0
  203. pretensor-0.1.0/src/pretensor/mcp/service_context.py +142 -0
  204. pretensor-0.1.0/src/pretensor/mcp/service_registry.py +294 -0
  205. pretensor-0.1.0/src/pretensor/mcp/store_cache.py +43 -0
  206. pretensor-0.1.0/src/pretensor/mcp/tool_registry.py +136 -0
  207. pretensor-0.1.0/src/pretensor/mcp/tools/__init__.py +1 -0
  208. pretensor-0.1.0/src/pretensor/mcp/tools/_rank.py +244 -0
  209. pretensor-0.1.0/src/pretensor/mcp/tools/_timed.py +26 -0
  210. pretensor-0.1.0/src/pretensor/mcp/tools/compile_metric.py +144 -0
  211. pretensor-0.1.0/src/pretensor/mcp/tools/consumers.py +161 -0
  212. pretensor-0.1.0/src/pretensor/mcp/tools/context.py +1121 -0
  213. pretensor-0.1.0/src/pretensor/mcp/tools/cypher.py +509 -0
  214. pretensor-0.1.0/src/pretensor/mcp/tools/detect_changes.py +254 -0
  215. pretensor-0.1.0/src/pretensor/mcp/tools/impact.py +271 -0
  216. pretensor-0.1.0/src/pretensor/mcp/tools/list.py +131 -0
  217. pretensor-0.1.0/src/pretensor/mcp/tools/schema.py +170 -0
  218. pretensor-0.1.0/src/pretensor/mcp/tools/search.py +316 -0
  219. pretensor-0.1.0/src/pretensor/mcp/tools/semantic_search.py +282 -0
  220. pretensor-0.1.0/src/pretensor/mcp/tools/traverse.py +1027 -0
  221. pretensor-0.1.0/src/pretensor/mcp/tools/validate_sql.py +150 -0
  222. pretensor-0.1.0/src/pretensor/observability.py +203 -0
  223. pretensor-0.1.0/src/pretensor/py.typed +0 -0
  224. pretensor-0.1.0/src/pretensor/quickstart/README.md +29 -0
  225. pretensor-0.1.0/src/pretensor/quickstart/__init__.py +6 -0
  226. pretensor-0.1.0/src/pretensor/quickstart/docker-compose.yml +18 -0
  227. pretensor-0.1.0/src/pretensor/quickstart/pagila_data.sql +63 -0
  228. pretensor-0.1.0/src/pretensor/quickstart/pagila_ddl.sql +92 -0
  229. pretensor-0.1.0/src/pretensor/search/__init__.py +6 -0
  230. pretensor-0.1.0/src/pretensor/search/base.py +80 -0
  231. pretensor-0.1.0/src/pretensor/search/index.py +435 -0
  232. pretensor-0.1.0/src/pretensor/semantic/__init__.py +24 -0
  233. pretensor-0.1.0/src/pretensor/semantic/base.py +123 -0
  234. pretensor-0.1.0/src/pretensor/semantic/compiler.py +487 -0
  235. pretensor-0.1.0/src/pretensor/semantic/yaml_layer.py +180 -0
  236. pretensor-0.1.0/src/pretensor/skills/__init__.py +5 -0
  237. pretensor-0.1.0/src/pretensor/skills/generator.py +235 -0
  238. pretensor-0.1.0/src/pretensor/staleness/__init__.py +15 -0
  239. pretensor-0.1.0/src/pretensor/staleness/graph_patcher.py +355 -0
  240. pretensor-0.1.0/src/pretensor/staleness/impact_analyzer.py +162 -0
  241. pretensor-0.1.0/src/pretensor/staleness/snapshot_store.py +38 -0
  242. pretensor-0.1.0/src/pretensor/validation/__init__.py +9 -0
  243. pretensor-0.1.0/src/pretensor/validation/query_validator.py +436 -0
  244. pretensor-0.1.0/src/pretensor/visibility/__init__.py +23 -0
  245. pretensor-0.1.0/src/pretensor/visibility/config.py +126 -0
  246. pretensor-0.1.0/src/pretensor/visibility/filter.py +143 -0
  247. pretensor-0.1.0/src/pretensor/visibility/kuzu_helpers.py +32 -0
  248. pretensor-0.1.0/src/pretensor/visibility/runtime.py +36 -0
  249. pretensor-0.1.0/src/pretensor/visibility/sync_grants.py +188 -0
  250. pretensor-0.1.0/tests/__init__.py +1 -0
  251. pretensor-0.1.0/tests/benchmark/__init__.py +0 -0
  252. pretensor-0.1.0/tests/benchmark/_compare.py +23 -0
  253. pretensor-0.1.0/tests/benchmark/baselines/adventureworks-l1-embeddings.json +4184 -0
  254. pretensor-0.1.0/tests/benchmark/baselines/adventureworks-l1.json +4183 -0
  255. pretensor-0.1.0/tests/benchmark/baselines/adventureworks-l2-embeddings.json +953 -0
  256. pretensor-0.1.0/tests/benchmark/baselines/adventureworks-l2.json +487 -0
  257. pretensor-0.1.0/tests/benchmark/baselines/adversarial-l1.json +77 -0
  258. pretensor-0.1.0/tests/benchmark/baselines/analytics_dwh-l1.json +55 -0
  259. pretensor-0.1.0/tests/benchmark/baselines/messy_warehouse-l1.json +839 -0
  260. pretensor-0.1.0/tests/benchmark/baselines/pagila-l1-embeddings.json +158 -0
  261. pretensor-0.1.0/tests/benchmark/baselines/pagila-l1.json +91 -0
  262. pretensor-0.1.0/tests/benchmark/baselines/pagila-l2-embeddings.json +539 -0
  263. pretensor-0.1.0/tests/benchmark/baselines/pagila-l2.json +323 -0
  264. pretensor-0.1.0/tests/benchmark/baselines/saas_multitenant-l1.json +73 -0
  265. pretensor-0.1.0/tests/benchmark/baselines/tpch-l1-embeddings.json +80 -0
  266. pretensor-0.1.0/tests/benchmark/baselines/tpch-l1.json +79 -0
  267. pretensor-0.1.0/tests/benchmark/baselines/tpch-l2-embeddings.json +1096 -0
  268. pretensor-0.1.0/tests/benchmark/baselines/tpch-l2.json +562 -0
  269. pretensor-0.1.0/tests/benchmark/fixtures/baseline.json +20 -0
  270. pretensor-0.1.0/tests/benchmark/fixtures/regressed.json +20 -0
  271. pretensor-0.1.0/tests/benchmark/l1/__init__.py +0 -0
  272. pretensor-0.1.0/tests/benchmark/l1/test_metrics.py +168 -0
  273. pretensor-0.1.0/tests/benchmark/l1/test_runner.py +172 -0
  274. pretensor-0.1.0/tests/benchmark/l2/__init__.py +0 -0
  275. pretensor-0.1.0/tests/benchmark/l2/test_gold.py +306 -0
  276. pretensor-0.1.0/tests/benchmark/l2/test_metrics.py +201 -0
  277. pretensor-0.1.0/tests/benchmark/l2/test_runner.py +151 -0
  278. pretensor-0.1.0/tests/benchmark/l3/__init__.py +0 -0
  279. pretensor-0.1.0/tests/benchmark/l3/test_agent.py +377 -0
  280. pretensor-0.1.0/tests/benchmark/l3/test_db.py +285 -0
  281. pretensor-0.1.0/tests/benchmark/l3/test_gold.py +102 -0
  282. pretensor-0.1.0/tests/benchmark/l3/test_llm_client.py +525 -0
  283. pretensor-0.1.0/tests/benchmark/l3/test_mcp_client.py +307 -0
  284. pretensor-0.1.0/tests/benchmark/l3/test_pretensor_runner.py +950 -0
  285. pretensor-0.1.0/tests/benchmark/l3/test_prompt.py +152 -0
  286. pretensor-0.1.0/tests/benchmark/l3/test_runner.py +597 -0
  287. pretensor-0.1.0/tests/benchmark/l3/test_sql_equivalence.py +210 -0
  288. pretensor-0.1.0/tests/benchmark/results/v0.1.0a3/README.md +15 -0
  289. pretensor-0.1.0/tests/benchmark/results/v0.1.0a3/adventureworks-l1.json +4183 -0
  290. pretensor-0.1.0/tests/benchmark/results/v0.1.0a3/adventureworks-l2.json +487 -0
  291. pretensor-0.1.0/tests/benchmark/results/v0.1.0a3/pagila-l1.json +91 -0
  292. pretensor-0.1.0/tests/benchmark/results/v0.1.0a3/pagila-l2.json +323 -0
  293. pretensor-0.1.0/tests/benchmark/results/v0.1.0a3/tpch-l1.json +79 -0
  294. pretensor-0.1.0/tests/benchmark/results/v0.1.0a3/tpch-l2.json +562 -0
  295. pretensor-0.1.0/tests/benchmark/results/v0.1.0a4/adventureworks-l1.json +4183 -0
  296. pretensor-0.1.0/tests/benchmark/results/v0.1.0a4/adventureworks-l2.json +487 -0
  297. pretensor-0.1.0/tests/benchmark/results/v0.1.0a4/pagila-l1.json +91 -0
  298. pretensor-0.1.0/tests/benchmark/results/v0.1.0a4/pagila-l2.json +323 -0
  299. pretensor-0.1.0/tests/benchmark/results/v0.1.0a4/tpch-l1.json +79 -0
  300. pretensor-0.1.0/tests/benchmark/results/v0.1.0a4/tpch-l2.json +562 -0
  301. pretensor-0.1.0/tests/benchmark/test_cli.py +456 -0
  302. pretensor-0.1.0/tests/benchmark/test_fixtures.py +126 -0
  303. pretensor-0.1.0/tests/benchmark/test_release_gate.py +538 -0
  304. pretensor-0.1.0/tests/benchmark/test_results.py +489 -0
  305. pretensor-0.1.0/tests/cli/conftest.py +20 -0
  306. pretensor-0.1.0/tests/cli/test_analyze_cli.py +248 -0
  307. pretensor-0.1.0/tests/cli/test_cli_error_handling.py +372 -0
  308. pretensor-0.1.0/tests/cli/test_config_file.py +757 -0
  309. pretensor-0.1.0/tests/cli/test_connections_cli.py +220 -0
  310. pretensor-0.1.0/tests/cli/test_dbt_enrichment_cli.py +142 -0
  311. pretensor-0.1.0/tests/cli/test_export_cli.py +330 -0
  312. pretensor-0.1.0/tests/cli/test_index_cli.py +507 -0
  313. pretensor-0.1.0/tests/cli/test_list_cli.py +155 -0
  314. pretensor-0.1.0/tests/cli/test_main_cli.py +139 -0
  315. pretensor-0.1.0/tests/cli/test_paths_cli.py +101 -0
  316. pretensor-0.1.0/tests/cli/test_plugin.py +144 -0
  317. pretensor-0.1.0/tests/cli/test_quickstart_cli.py +205 -0
  318. pretensor-0.1.0/tests/cli/test_reindex_cli.py +626 -0
  319. pretensor-0.1.0/tests/cli/test_semantic_cli.py +189 -0
  320. pretensor-0.1.0/tests/cli/test_serve_cli.py +192 -0
  321. pretensor-0.1.0/tests/cli/test_sync_grants_cli.py +211 -0
  322. pretensor-0.1.0/tests/cli/test_validate_cli.py +225 -0
  323. pretensor-0.1.0/tests/conftest.py +187 -0
  324. pretensor-0.1.0/tests/connectors/test_base_connector.py +74 -0
  325. pretensor-0.1.0/tests/connectors/test_bigquery.py +262 -0
  326. pretensor-0.1.0/tests/connectors/test_catalog_enrichment.py +189 -0
  327. pretensor-0.1.0/tests/connectors/test_dsn_parsing.py +460 -0
  328. pretensor-0.1.0/tests/connectors/test_lineage_sqlglot.py +98 -0
  329. pretensor-0.1.0/tests/connectors/test_mysql_connector.py +823 -0
  330. pretensor-0.1.0/tests/connectors/test_pg_array_parse.py +23 -0
  331. pretensor-0.1.0/tests/connectors/test_postgres_table_grants.py +197 -0
  332. pretensor-0.1.0/tests/connectors/test_postgres_views.py +145 -0
  333. pretensor-0.1.0/tests/connectors/test_registry_mysql_optional.py +35 -0
  334. pretensor-0.1.0/tests/connectors/test_registry_postgres_optional.py +45 -0
  335. pretensor-0.1.0/tests/connectors/test_registry_snowflake_optional.py +36 -0
  336. pretensor-0.1.0/tests/connectors/test_snowflake_connector.py +1394 -0
  337. pretensor-0.1.0/tests/connectors/test_snowflake_table_grants.py +187 -0
  338. pretensor-0.1.0/tests/contracts/__init__.py +4 -0
  339. pretensor-0.1.0/tests/contracts/test_combiner.py +182 -0
  340. pretensor-0.1.0/tests/contracts/test_consumer_node.py +77 -0
  341. pretensor-0.1.0/tests/contracts/test_pipeline_step.py +254 -0
  342. pretensor-0.1.0/tests/contracts/test_scorer.py +275 -0
  343. pretensor-0.1.0/tests/contracts/test_search_index.py +219 -0
  344. pretensor-0.1.0/tests/contracts/test_semantic_layer.py +225 -0
  345. pretensor-0.1.0/tests/core/test_builder.py +310 -0
  346. pretensor-0.1.0/tests/core/test_dsn_at_rest.py +113 -0
  347. pretensor-0.1.0/tests/core/test_graph_builder_lineage.py +65 -0
  348. pretensor-0.1.0/tests/core/test_lineage_store.py +103 -0
  349. pretensor-0.1.0/tests/core/test_models.py +44 -0
  350. pretensor-0.1.0/tests/core/test_portable_export.py +114 -0
  351. pretensor-0.1.0/tests/core/test_registry.py +52 -0
  352. pretensor-0.1.0/tests/core/test_schema.py +96 -0
  353. pretensor-0.1.0/tests/core/test_schema_external_consumer.py +38 -0
  354. pretensor-0.1.0/tests/core/test_semantic_schema.py +61 -0
  355. pretensor-0.1.0/tests/core/test_store_consumer_upserts.py +339 -0
  356. pretensor-0.1.0/tests/e2e/__init__.py +0 -0
  357. pretensor-0.1.0/tests/e2e/conftest.py +437 -0
  358. pretensor-0.1.0/tests/e2e/fixtures/__init__.py +0 -0
  359. pretensor-0.1.0/tests/e2e/fixtures/sql/adventureworks_ddl.sql +431 -0
  360. pretensor-0.1.0/tests/e2e/fixtures/sql/messy_warehouse_ddl.sql +300 -0
  361. pretensor-0.1.0/tests/e2e/fixtures/sql/sakila_mysql_ddl.sql +83 -0
  362. pretensor-0.1.0/tests/e2e/fixtures/sql/tpcds_ddl.sql +571 -0
  363. pretensor-0.1.0/tests/e2e/fixtures/sql/tpch_ddl.sql +111 -0
  364. pretensor-0.1.0/tests/e2e/test_adventureworks_smoke.py +45 -0
  365. pretensor-0.1.0/tests/e2e/test_adventureworks_traverse.py +118 -0
  366. pretensor-0.1.0/tests/e2e/test_dbt_warehouse_scale_enrichment.py +288 -0
  367. pretensor-0.1.0/tests/e2e/test_index_cycle.py +88 -0
  368. pretensor-0.1.0/tests/e2e/test_l3_baseline.py +161 -0
  369. pretensor-0.1.0/tests/e2e/test_l3_pretensor.py +302 -0
  370. pretensor-0.1.0/tests/e2e/test_mcp_tools.py +106 -0
  371. pretensor-0.1.0/tests/e2e/test_mysql_index_cycle.py +125 -0
  372. pretensor-0.1.0/tests/e2e/test_reindex.py +101 -0
  373. pretensor-0.1.0/tests/e2e/test_serve_smoke.py +46 -0
  374. pretensor-0.1.0/tests/e2e/test_tpcds_traverse.py +222 -0
  375. pretensor-0.1.0/tests/e2e/test_tpch_traverse.py +120 -0
  376. pretensor-0.1.0/tests/e2e/test_visibility.py +78 -0
  377. pretensor-0.1.0/tests/enrichment/__init__.py +0 -0
  378. pretensor-0.1.0/tests/enrichment/analyze/__init__.py +0 -0
  379. pretensor-0.1.0/tests/enrichment/analyze/fixtures/cross_connection.py +1 -0
  380. pretensor-0.1.0/tests/enrichment/analyze/fixtures/dml_writes.py +4 -0
  381. pretensor-0.1.0/tests/enrichment/analyze/fixtures/dynamic_only.py +5 -0
  382. pretensor-0.1.0/tests/enrichment/analyze/fixtures/fstring_prefix.py +2 -0
  383. pretensor-0.1.0/tests/enrichment/analyze/fixtures/noqa_optout.py +6 -0
  384. pretensor-0.1.0/tests/enrichment/analyze/fixtures/simple_select.py +1 -0
  385. pretensor-0.1.0/tests/enrichment/analyze/test_classify.py +100 -0
  386. pretensor-0.1.0/tests/enrichment/analyze/test_extract_python.py +174 -0
  387. pretensor-0.1.0/tests/enrichment/analyze/test_parse.py +185 -0
  388. pretensor-0.1.0/tests/enrichment/analyze/test_pipeline.py +287 -0
  389. pretensor-0.1.0/tests/enrichment/analyze/test_walker.py +113 -0
  390. pretensor-0.1.0/tests/enrichment/analyze/test_writers.py +334 -0
  391. pretensor-0.1.0/tests/enrichment/fixtures/dbt/manifest_v10.json +19 -0
  392. pretensor-0.1.0/tests/enrichment/fixtures/dbt/manifest_v9.json +55 -0
  393. pretensor-0.1.0/tests/enrichment/test_dbt_lineage.py +179 -0
  394. pretensor-0.1.0/tests/enrichment/test_dbt_manifest.py +106 -0
  395. pretensor-0.1.0/tests/enrichment/test_dbt_metadata.py +200 -0
  396. pretensor-0.1.0/tests/enrichment/test_dbt_pipeline.py +107 -0
  397. pretensor-0.1.0/tests/enrichment/test_dbt_signals.py +361 -0
  398. pretensor-0.1.0/tests/entities/test_classifier.py +69 -0
  399. pretensor-0.1.0/tests/entities/test_entity_builder.py +76 -0
  400. pretensor-0.1.0/tests/entities/test_llm_extract.py +69 -0
  401. pretensor-0.1.0/tests/entities/test_pagila_entities.py +67 -0
  402. pretensor-0.1.0/tests/fixtures/dbt/synthetic_warehouse/README.md +83 -0
  403. pretensor-0.1.0/tests/fixtures/dbt/synthetic_warehouse/__init__.py +16 -0
  404. pretensor-0.1.0/tests/fixtures/dbt/synthetic_warehouse/generator.py +405 -0
  405. pretensor-0.1.0/tests/fixtures/pairs/analytics_vs_saas.yaml +17 -0
  406. pretensor-0.1.0/tests/fixtures/pairs/tpch_vs_pagila.yaml +17 -0
  407. pretensor-0.1.0/tests/fixtures/pairs/tpch_vs_tpch_renamed.yaml +27 -0
  408. pretensor-0.1.0/tests/fixtures/schemas/README.md +133 -0
  409. pretensor-0.1.0/tests/fixtures/schemas/adventureworks.yaml +20694 -0
  410. pretensor-0.1.0/tests/fixtures/schemas/adversarial.yaml +372 -0
  411. pretensor-0.1.0/tests/fixtures/schemas/adversarial_roles.yaml +16 -0
  412. pretensor-0.1.0/tests/fixtures/schemas/analytics_dwh.yaml +574 -0
  413. pretensor-0.1.0/tests/fixtures/schemas/messy_warehouse.yaml +3872 -0
  414. pretensor-0.1.0/tests/fixtures/schemas/messy_warehouse_roles.yaml +43 -0
  415. pretensor-0.1.0/tests/fixtures/schemas/pagila.yaml +657 -0
  416. pretensor-0.1.0/tests/fixtures/schemas/pagila_extended.yaml +1459 -0
  417. pretensor-0.1.0/tests/fixtures/schemas/saas_multitenant.yaml +551 -0
  418. pretensor-0.1.0/tests/fixtures/schemas/tpch.yaml +776 -0
  419. pretensor-0.1.0/tests/integrations/__init__.py +0 -0
  420. pretensor-0.1.0/tests/integrations/test_base.py +217 -0
  421. pretensor-0.1.0/tests/integrations/test_google_adk.py +96 -0
  422. pretensor-0.1.0/tests/integrations/test_langchain.py +107 -0
  423. pretensor-0.1.0/tests/integrations/test_llamaindex.py +105 -0
  424. pretensor-0.1.0/tests/intelligence/slow/__init__.py +0 -0
  425. pretensor-0.1.0/tests/intelligence/slow/test_real_model_smoke.py +100 -0
  426. pretensor-0.1.0/tests/intelligence/test_cluster_labeler.py +461 -0
  427. pretensor-0.1.0/tests/intelligence/test_clustering.py +101 -0
  428. pretensor-0.1.0/tests/intelligence/test_clustering_embeddings.py +414 -0
  429. pretensor-0.1.0/tests/intelligence/test_discovery.py +407 -0
  430. pretensor-0.1.0/tests/intelligence/test_embedding_index_step.py +348 -0
  431. pretensor-0.1.0/tests/intelligence/test_embeddings.py +294 -0
  432. pretensor-0.1.0/tests/intelligence/test_extended_pagila.py +80 -0
  433. pretensor-0.1.0/tests/intelligence/test_heuristic.py +769 -0
  434. pretensor-0.1.0/tests/intelligence/test_intelligence.py +100 -0
  435. pretensor-0.1.0/tests/intelligence/test_join_paths.py +305 -0
  436. pretensor-0.1.0/tests/intelligence/test_llm_infer.py +85 -0
  437. pretensor-0.1.0/tests/intelligence/test_llm_runtime.py +50 -0
  438. pretensor-0.1.0/tests/intelligence/test_metric_templates.py +148 -0
  439. pretensor-0.1.0/tests/intelligence/test_null_path_parity.py +212 -0
  440. pretensor-0.1.0/tests/intelligence/test_pipeline.py +274 -0
  441. pretensor-0.1.0/tests/intelligence/test_role_exemplars.py +231 -0
  442. pretensor-0.1.0/tests/intelligence/test_schema_classification.py +68 -0
  443. pretensor-0.1.0/tests/intelligence/test_semantic_scorer.py +344 -0
  444. pretensor-0.1.0/tests/intelligence/test_shadow_alias.py +355 -0
  445. pretensor-0.1.0/tests/intelligence/test_statistical.py +78 -0
  446. pretensor-0.1.0/tests/mcp/test_compile_metric_tool.py +154 -0
  447. pretensor-0.1.0/tests/mcp/test_consumers_tool.py +152 -0
  448. pretensor-0.1.0/tests/mcp/test_context_dbt.py +136 -0
  449. pretensor-0.1.0/tests/mcp/test_context_lineage.py +119 -0
  450. pretensor-0.1.0/tests/mcp/test_context_similar.py +339 -0
  451. pretensor-0.1.0/tests/mcp/test_context_tool.py +53 -0
  452. pretensor-0.1.0/tests/mcp/test_cypher_readonly.py +170 -0
  453. pretensor-0.1.0/tests/mcp/test_cypher_timeout_pool.py +104 -0
  454. pretensor-0.1.0/tests/mcp/test_detect_changes_errors.py +138 -0
  455. pretensor-0.1.0/tests/mcp/test_error_ergonomics.py +389 -0
  456. pretensor-0.1.0/tests/mcp/test_error_handling.py +322 -0
  457. pretensor-0.1.0/tests/mcp/test_error_sanitization.py +127 -0
  458. pretensor-0.1.0/tests/mcp/test_impact_consumers.py +127 -0
  459. pretensor-0.1.0/tests/mcp/test_impact_hop.py +136 -0
  460. pretensor-0.1.0/tests/mcp/test_kill_switch.py +211 -0
  461. pretensor-0.1.0/tests/mcp/test_mcp_null_path_parity.py +233 -0
  462. pretensor-0.1.0/tests/mcp/test_query_hybrid.py +357 -0
  463. pretensor-0.1.0/tests/mcp/test_schema_tool.py +117 -0
  464. pretensor-0.1.0/tests/mcp/test_semantic_search.py +428 -0
  465. pretensor-0.1.0/tests/mcp/test_serve_stdio_smoke.py +133 -0
  466. pretensor-0.1.0/tests/mcp/test_service.py +812 -0
  467. pretensor-0.1.0/tests/mcp/test_tool_registry.py +198 -0
  468. pretensor-0.1.0/tests/mcp/test_traverse_ambiguous.py +173 -0
  469. pretensor-0.1.0/tests/mcp/test_traverse_dijkstra.py +520 -0
  470. pretensor-0.1.0/tests/mcp/test_traverse_pagila_shape.py +269 -0
  471. pretensor-0.1.0/tests/mcp/test_traverse_tiebreak.py +412 -0
  472. pretensor-0.1.0/tests/mcp/test_validate_sql_tool.py +125 -0
  473. pretensor-0.1.0/tests/mcp/test_visibility_mcp.py +281 -0
  474. pretensor-0.1.0/tests/query_helpers.py +26 -0
  475. pretensor-0.1.0/tests/scripts/__init__.py +0 -0
  476. pretensor-0.1.0/tests/scripts/test_check_no_internal_refs.py +138 -0
  477. pretensor-0.1.0/tests/search/test_search_index.py +310 -0
  478. pretensor-0.1.0/tests/semantic/__init__.py +0 -0
  479. pretensor-0.1.0/tests/semantic/test_compiler.py +341 -0
  480. pretensor-0.1.0/tests/semantic/test_semantic_layer.py +76 -0
  481. pretensor-0.1.0/tests/semantic/test_yaml_layer.py +229 -0
  482. pretensor-0.1.0/tests/staleness/test_staleness.py +159 -0
  483. pretensor-0.1.0/tests/test_errors.py +131 -0
  484. pretensor-0.1.0/tests/test_gitlint_config.py +94 -0
  485. pretensor-0.1.0/tests/test_graph_schema_manager.py +64 -0
  486. pretensor-0.1.0/tests/test_graph_store.py +86 -0
  487. pretensor-0.1.0/tests/test_observability.py +96 -0
  488. pretensor-0.1.0/tests/test_packaging.py +28 -0
  489. pretensor-0.1.0/tests/test_pretensor_config.py +379 -0
  490. pretensor-0.1.0/tests/test_query_runner.py +48 -0
  491. pretensor-0.1.0/tests/test_store_cache.py +185 -0
  492. pretensor-0.1.0/tests/utils/__init__.py +0 -0
  493. pretensor-0.1.0/tests/utils/score_tracker.py +99 -0
  494. pretensor-0.1.0/tests/validation/test_compile_did_you_mean.py +488 -0
  495. pretensor-0.1.0/tests/validation/test_query_validator.py +147 -0
  496. pretensor-0.1.0/tests/visibility/test_sync_grants.py +274 -0
  497. pretensor-0.1.0/tests/visibility/test_visibility_config.py +376 -0
  498. pretensor-0.1.0/uv.lock +4562 -0
File without changes
@@ -0,0 +1,2 @@
1
+ * text=auto eol=lf
2
+ uv.lock linguist-generated=true
@@ -0,0 +1,2 @@
1
+ # Default owner for all files
2
+ * @tensorcarlos
@@ -0,0 +1,110 @@
1
+ name: Bug report
2
+ description: Report a reproducible problem with Pretensor.
3
+ title: "bug: <short summary>"
4
+ labels:
5
+ - bug
6
+ - triage
7
+ body:
8
+ - type: markdown
9
+ attributes:
10
+ value: |
11
+ Thanks for taking the time to file a bug report. Please fill out the fields below so we can reproduce the issue quickly.
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: input
25
+ id: python-version
26
+ attributes:
27
+ label: Python version
28
+ description: Output of `python --version`.
29
+ placeholder: "3.11.x or 3.12.x"
30
+ validations:
31
+ required: true
32
+
33
+ - type: dropdown
34
+ id: os
35
+ attributes:
36
+ label: Operating system
37
+ options:
38
+ - Linux
39
+ - macOS
40
+ - Windows
41
+ - Other
42
+ validations:
43
+ required: true
44
+
45
+ - type: dropdown
46
+ id: backend
47
+ attributes:
48
+ label: Database backend
49
+ description: Which connector were you using when the bug occurred?
50
+ options:
51
+ - PostgreSQL
52
+ - Snowflake
53
+ - BigQuery
54
+ - Not applicable
55
+ - Other
56
+ validations:
57
+ required: true
58
+
59
+ - type: input
60
+ id: extras
61
+ attributes:
62
+ label: Installed extras
63
+ description: Which pip extras did you install? e.g. `[dev]`, `[snowflake]`, `[bigquery]`, `[e2e]`.
64
+ placeholder: "[dev]"
65
+
66
+ - type: textarea
67
+ id: repro
68
+ attributes:
69
+ label: Steps to reproduce
70
+ description: A minimal, self-contained reproduction. Include the exact commands or code.
71
+ placeholder: |
72
+ 1. Install with `pip install -e ".[dev]"`
73
+ 2. Run `pretensor index ...`
74
+ 3. Observe ...
75
+ render: markdown
76
+ validations:
77
+ required: true
78
+
79
+ - type: textarea
80
+ id: expected
81
+ attributes:
82
+ label: Expected behavior
83
+ validations:
84
+ required: true
85
+
86
+ - type: textarea
87
+ id: actual
88
+ attributes:
89
+ label: Actual behavior
90
+ description: Include full tracebacks and error messages.
91
+ render: shell
92
+ validations:
93
+ required: true
94
+
95
+ - type: textarea
96
+ id: logs
97
+ attributes:
98
+ label: Additional logs or context
99
+ description: Any relevant logs, MCP transcripts, or schema snippets. Redact secrets and personally identifiable data.
100
+ render: shell
101
+
102
+ - type: checkboxes
103
+ id: checks
104
+ attributes:
105
+ label: Pre-submission checks
106
+ options:
107
+ - label: I searched existing issues and did not find a duplicate.
108
+ required: true
109
+ - label: I confirmed this is not a security vulnerability (those go through Security Advisories).
110
+ required: true
@@ -0,0 +1,8 @@
1
+ blank_issues_enabled: false
2
+ contact_links:
3
+ - name: Report a security vulnerability
4
+ url: https://github.com/pretensor-ai/pretensor/security/advisories/new
5
+ about: Please report security issues privately through GitHub Security Advisories, not as public issues. See SECURITY.md for details.
6
+ - name: Ask a question or start a discussion
7
+ url: https://github.com/pretensor-ai/pretensor/discussions
8
+ about: Questions, ideas, and general discussion belong in Discussions.
@@ -0,0 +1,57 @@
1
+ name: Feature request
2
+ description: Suggest a new capability or enhancement for Pretensor.
3
+ title: "feat: <short summary>"
4
+ labels:
5
+ - enhancement
6
+ - triage
7
+ body:
8
+ - type: markdown
9
+ attributes:
10
+ value: |
11
+ Thanks for proposing an improvement. Please describe the problem you're trying to solve before the solution — that lets us evaluate alternatives we may not have considered.
12
+
13
+ - type: textarea
14
+ id: problem
15
+ attributes:
16
+ label: Problem
17
+ description: What are you trying to accomplish, and what's blocking you today? Include concrete use cases where helpful.
18
+ validations:
19
+ required: true
20
+
21
+ - type: textarea
22
+ id: proposal
23
+ attributes:
24
+ label: Proposed solution
25
+ description: Describe the change you have in mind. Include expected CLI, MCP, or API behavior if relevant.
26
+ validations:
27
+ required: true
28
+
29
+ - type: textarea
30
+ id: alternatives
31
+ attributes:
32
+ label: Alternatives considered
33
+ description: Other approaches you evaluated and why you discarded them. Leave blank if none.
34
+
35
+ - type: dropdown
36
+ id: scope
37
+ attributes:
38
+ label: Scope
39
+ description: Which subsystem does this primarily affect?
40
+ options:
41
+ - CLI
42
+ - MCP server
43
+ - Connectors (Postgres / Snowflake / BigQuery)
44
+ - Graph / intelligence
45
+ - Docs
46
+ - Build / release
47
+ - Not sure
48
+ validations:
49
+ required: true
50
+
51
+ - type: checkboxes
52
+ id: checks
53
+ attributes:
54
+ label: Pre-submission checks
55
+ options:
56
+ - label: I searched existing issues and did not find a duplicate.
57
+ required: true
@@ -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
@@ -0,0 +1,15 @@
1
+ ## Summary
2
+
3
+ <!-- What changed and why (1-3 sentences). -->
4
+
5
+ ## Checklist
6
+
7
+ - [ ] Tests pass (`python -m pytest tests/`)
8
+ - [ ] Linting passes (`ruff check src/ tests/`)
9
+ - [ ] Type checking passes (`pyright src/`)
10
+ - [ ] `CHANGELOG.md` updated under `[Unreleased]` (or noted as not user-facing)
11
+ - [ ] All commits signed off per the [Developer Certificate of Origin](https://developercertificate.org/) (`git commit -s`)
12
+
13
+ ## Notes
14
+
15
+ <!-- Optional: risks, follow-ups, screenshots. -->
@@ -0,0 +1,155 @@
1
+ name: Bench
2
+
3
+ on:
4
+ # No paths-ignore: the bench lane runs on every PR (including doc-only)
5
+ # so the dry-run AC is satisfiable and the lane never silently no-ops.
6
+ pull_request:
7
+ branches: [main]
8
+ workflow_dispatch:
9
+ inputs:
10
+ l3_model:
11
+ description: "L3 model id (defaults to claude-haiku-4-5)"
12
+ required: false
13
+ type: string
14
+ default: "claude-haiku-4-5"
15
+ # L3 runs weekly (Monday 04:00 UTC) for trend watching, on release-tag
16
+ # pushes for the release-being-announced snapshot, and on manual dispatch
17
+ # for ad-hoc runs.
18
+ schedule:
19
+ - cron: '0 4 * * 1'
20
+ push:
21
+ tags: ['v*.*.*']
22
+
23
+ concurrency:
24
+ group: bench-${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
25
+ cancel-in-progress: true
26
+
27
+ permissions:
28
+ contents: read
29
+
30
+ jobs:
31
+ pr-bench:
32
+ name: ${{ matrix.level }} (${{ matrix.dataset }}, ${{ matrix.extras_label }})
33
+ if: github.event_name == 'pull_request' || github.event_name == 'workflow_dispatch'
34
+ runs-on: ubuntu-latest
35
+ timeout-minutes: 20
36
+ strategy:
37
+ fail-fast: false
38
+ matrix:
39
+ level: [l1, l2]
40
+ dataset: [pagila, adventureworks, tpch]
41
+ extras: [dev, dev-embeddings]
42
+ include:
43
+ - extras: dev
44
+ extras_args: "--extra dev"
45
+ extras_label: "dev"
46
+ - extras: dev-embeddings
47
+ extras_args: "--extra dev --extra embeddings"
48
+ extras_label: "dev,embeddings"
49
+ steps:
50
+ - uses: actions/checkout@v4
51
+ - uses: astral-sh/setup-uv@v4
52
+ with:
53
+ enable-cache: true
54
+ cache-dependency-glob: "uv.lock"
55
+ python-version: "3.11"
56
+ - name: Install dependencies
57
+ run: uv sync --locked ${{ matrix.extras_args }}
58
+ - name: Cache HuggingFace embedding model
59
+ if: matrix.extras == 'dev-embeddings'
60
+ uses: actions/cache@v4
61
+ with:
62
+ path: ~/.cache/huggingface
63
+ key: hf-arctic-embed-xs-${{ hashFiles('src/pretensor/intelligence/embeddings.py') }}
64
+ - name: Pre-warm embedding model (retry on Hub rate limits)
65
+ if: matrix.extras == 'dev-embeddings'
66
+ env:
67
+ # Optional repo secret; anonymous Hub downloads from shared
68
+ # runner IPs are frequently 429-rate-limited. huggingface_hub
69
+ # picks the token up from the environment automatically; an
70
+ # empty value is a no-op.
71
+ HF_TOKEN: ${{ secrets.HF_TOKEN }}
72
+ run: |
73
+ for attempt in 1 2 3 4 5; do
74
+ if uv run python -c "from pretensor.intelligence.embeddings import get_default_embedding_client; get_default_embedding_client().embed(['warm'])"; then
75
+ echo "model ready (attempt $attempt)"
76
+ exit 0
77
+ fi
78
+ sleep $((30 + attempt * 15 + RANDOM % 30))
79
+ done
80
+ echo "::error::embedding model download kept failing (HF Hub rate limit?). Add an HF_TOKEN repo secret or retry the run."
81
+ exit 1
82
+ - name: Run benchmark
83
+ # The embeddings lane passes --embeddings and compares against
84
+ # lane-specific baselines: L2 measures real cosine retrieval for
85
+ # semantic_search + the hybrid rerank; L1 measures blind join
86
+ # discovery with the embedding relationship scorer registered at
87
+ # its documented typical threshold (see L1_EMBEDDING_JOIN_THRESHOLD).
88
+ env:
89
+ HF_TOKEN: ${{ secrets.HF_TOKEN }}
90
+ run: |
91
+ BENCH_FLAG=""
92
+ SUFFIX=""
93
+ if [ "${{ matrix.extras }}" = "dev-embeddings" ]; then
94
+ BENCH_FLAG="--embeddings"
95
+ SUFFIX="-embeddings"
96
+ fi
97
+ echo "BASELINE_SUFFIX=$SUFFIX" >> "$GITHUB_ENV"
98
+ uv run pretensor benchmark ${{ matrix.level }} --dataset ${{ matrix.dataset }} $BENCH_FLAG --out current.json
99
+ - name: Compare against baseline
100
+ run: |
101
+ uv run pretensor benchmark compare \
102
+ --baseline tests/benchmark/baselines/${{ matrix.dataset }}-${{ matrix.level }}${BASELINE_SUFFIX}.json \
103
+ --current current.json
104
+ - name: Upload current result on failure
105
+ if: failure()
106
+ uses: actions/upload-artifact@v4
107
+ with:
108
+ name: ${{ matrix.level }}-${{ matrix.dataset }}-${{ matrix.extras }}-current
109
+ path: current.json
110
+ retention-days: 14
111
+ if-no-files-found: warn
112
+
113
+ l3:
114
+ name: L3 (${{ matrix.dataset }}, ${{ matrix.runner }})
115
+ # L3 is dormant until the per-dataset Postgres fixtures and DSN env
116
+ # vars are wired into CI. Set the repo variable
117
+ # `L3_ENV_PROVISIONED=true` once that work lands; until then,
118
+ # scheduled / tag-push / manual triggers no-op cleanly instead of
119
+ # producing six failed jobs that drown out the L1+L2 signal.
120
+ if: vars.L3_ENV_PROVISIONED == 'true' && (github.event_name == 'push' || github.event_name == 'workflow_dispatch' || github.event_name == 'schedule')
121
+ runs-on: ubuntu-latest
122
+ timeout-minutes: 60
123
+ continue-on-error: true
124
+ strategy:
125
+ fail-fast: false
126
+ matrix:
127
+ dataset: [pagila, adventureworks, tpch]
128
+ runner: [baseline, pretensor]
129
+ env:
130
+ ANTHROPIC_API_KEY: ${{ secrets.BENCH_ANTHROPIC_API_KEY }}
131
+ steps:
132
+ - uses: actions/checkout@v4
133
+ - uses: astral-sh/setup-uv@v4
134
+ with:
135
+ enable-cache: true
136
+ cache-dependency-glob: "uv.lock"
137
+ python-version: "3.11"
138
+ - name: Install dependencies
139
+ run: uv sync --locked --extra dev --extra embeddings
140
+ - name: Run L3
141
+ run: |
142
+ model="${{ inputs.l3_model || 'claude-haiku-4-5' }}"
143
+ uv run pretensor benchmark l3 \
144
+ --dataset ${{ matrix.dataset }} \
145
+ --runner ${{ matrix.runner }} \
146
+ --model "$model" \
147
+ --out results.json
148
+ - name: Upload result
149
+ if: always()
150
+ uses: actions/upload-artifact@v4
151
+ with:
152
+ name: l3-${{ matrix.dataset }}-${{ matrix.runner }}-${{ github.run_id }}
153
+ path: results.json
154
+ retention-days: 90
155
+ if-no-files-found: warn
@@ -0,0 +1,198 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches: [main, master, 'publish/**']
6
+ paths-ignore:
7
+ - 'docs/**'
8
+ - '**.md'
9
+ - '.github/ISSUE_TEMPLATE/**'
10
+ pull_request:
11
+ paths-ignore:
12
+ - 'docs/**'
13
+ - '**.md'
14
+ - '.github/ISSUE_TEMPLATE/**'
15
+ schedule:
16
+ # Nightly slow lane (real-model embedding smoke + future heavy fixtures).
17
+ # Daily at 03:17 UTC.
18
+ - cron: '17 3 * * *'
19
+ workflow_dispatch:
20
+ inputs:
21
+ run_slow:
22
+ description: 'Run the slow opt-in test lane (real model downloads).'
23
+ type: boolean
24
+ required: false
25
+ default: false
26
+
27
+ concurrency:
28
+ group: ci-${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
29
+ cancel-in-progress: true
30
+
31
+ permissions:
32
+ contents: read
33
+
34
+ jobs:
35
+ lint:
36
+ name: Lint (ruff)
37
+ runs-on: ubuntu-latest
38
+ steps:
39
+ - uses: actions/checkout@v4
40
+ - uses: astral-sh/setup-uv@v4
41
+ with:
42
+ enable-cache: true
43
+ cache-dependency-glob: "uv.lock"
44
+ python-version: "3.12"
45
+ - name: Install dependencies
46
+ run: uv sync --locked --extra dev
47
+ - name: Ruff check
48
+ run: uv run ruff check src tests
49
+
50
+ lockfile:
51
+ name: Lockfile up to date
52
+ runs-on: ubuntu-latest
53
+ steps:
54
+ - uses: actions/checkout@v4
55
+ - uses: astral-sh/setup-uv@v4
56
+ with:
57
+ enable-cache: true
58
+ cache-dependency-glob: "uv.lock"
59
+ python-version: "3.12"
60
+ - name: Verify uv.lock matches pyproject.toml
61
+ # Fails if the committed lock would be re-resolved — keeps the reviewed
62
+ # pins identical to what every other job installs with `uv sync --locked`.
63
+ run: uv lock --check
64
+
65
+ typecheck:
66
+ name: Typecheck (pyright)
67
+ runs-on: ubuntu-latest
68
+ steps:
69
+ - uses: actions/checkout@v4
70
+ - uses: astral-sh/setup-uv@v4
71
+ with:
72
+ enable-cache: true
73
+ cache-dependency-glob: "uv.lock"
74
+ python-version: "3.11"
75
+ - name: Install dependencies
76
+ run: uv sync --locked --extra dev
77
+ - name: Pyright
78
+ run: uv run pyright
79
+
80
+ test:
81
+ name: Test (pytest, py${{ matrix.python-version }})
82
+ runs-on: ubuntu-latest
83
+ strategy:
84
+ fail-fast: false
85
+ matrix:
86
+ python-version: ["3.11", "3.12"]
87
+ steps:
88
+ - uses: actions/checkout@v4
89
+ - uses: astral-sh/setup-uv@v4
90
+ with:
91
+ enable-cache: true
92
+ cache-dependency-glob: "uv.lock"
93
+ python-version: ${{ matrix.python-version }}
94
+ - name: Install dependencies
95
+ run: uv sync --locked --extra dev
96
+ - name: Pytest
97
+ env:
98
+ PYTHONPATH: src
99
+ run: uv run pytest tests/
100
+
101
+ build-verify:
102
+ name: Build wheel & verify packaging
103
+ runs-on: ubuntu-latest
104
+ steps:
105
+ - uses: actions/checkout@v4
106
+ - uses: astral-sh/setup-uv@v4
107
+ with:
108
+ enable-cache: true
109
+ cache-dependency-glob: "uv.lock"
110
+ python-version: "3.12"
111
+ - name: Build sdist + wheel
112
+ run: uv build
113
+ - name: Verify wheel ships every tracked subpackage
114
+ # Guard against .gitignore (or any other exclude) silently dropping a
115
+ # package directory from the built wheel. Every `__init__.py` tracked
116
+ # under `src/pretensor/` must land at the matching path inside the wheel.
117
+ run: |
118
+ uv run python <<'PY'
119
+ import glob, subprocess, sys, zipfile
120
+
121
+ whls = sorted(glob.glob("dist/pretensor-*-py3-none-any.whl"))
122
+ if len(whls) != 1:
123
+ sys.exit(
124
+ f"expected exactly one wheel in dist/, found {len(whls)}: {whls}"
125
+ )
126
+ whl = whls[0]
127
+
128
+ with zipfile.ZipFile(whl) as z:
129
+ names = set(z.namelist())
130
+
131
+ tracked = subprocess.check_output(
132
+ ["git", "ls-files", "src/pretensor/"], text=True
133
+ ).splitlines()
134
+ expected = sorted(
135
+ f.removeprefix("src/") for f in tracked if f.endswith("/__init__.py")
136
+ )
137
+
138
+ missing = [e for e in expected if e not in names]
139
+ if missing:
140
+ print(f"MISSING from {whl}:", file=sys.stderr)
141
+ for m in missing:
142
+ print(f" - {m}", file=sys.stderr)
143
+ sys.exit(1)
144
+ print(f"OK: {whl} contains all {len(expected)} tracked __init__.py files")
145
+ PY
146
+ - name: Smoke-test the installed wheel
147
+ # Install the freshly built wheel into an isolated env and boot the
148
+ # CLI. `pretensor --help` imports every subcommand module at startup
149
+ # (typer registration), which transitively imports
150
+ # `pretensor.skills.generator` from `cli/commands/index.py`. A missing
151
+ # subpackage would surface here as ModuleNotFoundError — the exact
152
+ # failure mode the published 0.1.0a1 wheel had.
153
+ run: |
154
+ set -euo pipefail
155
+ shopt -s nullglob
156
+ wheels=(dist/pretensor-*-py3-none-any.whl)
157
+ if [ "${#wheels[@]}" -ne 1 ]; then
158
+ echo "expected exactly one wheel in dist/, found ${#wheels[@]}" >&2
159
+ exit 1
160
+ fi
161
+ uvx --from "${wheels[0]}" pretensor --help > /dev/null
162
+
163
+ slow-tests:
164
+ name: Slow tests (opt-in real model)
165
+ if: github.event_name == 'schedule' || (github.event_name == 'workflow_dispatch' && inputs.run_slow)
166
+ runs-on: ubuntu-latest
167
+ steps:
168
+ - uses: actions/checkout@v4
169
+ - uses: astral-sh/setup-uv@v4
170
+ with:
171
+ enable-cache: true
172
+ cache-dependency-glob: "uv.lock"
173
+ python-version: "3.12"
174
+ - name: Install dependencies (with embeddings extra)
175
+ run: uv sync --locked --extra dev --extra embeddings
176
+ - name: Cache HuggingFace embedding model
177
+ uses: actions/cache@v4
178
+ with:
179
+ path: ~/.cache/huggingface
180
+ key: hf-arctic-embed-xs-${{ hashFiles('src/pretensor/intelligence/embeddings.py') }}
181
+ - name: Pre-warm embedding model (retry on Hub rate limits)
182
+ env:
183
+ HF_TOKEN: ${{ secrets.HF_TOKEN }}
184
+ run: |
185
+ for attempt in 1 2 3 4 5; do
186
+ if uv run python -c "from pretensor.intelligence.embeddings import get_default_embedding_client; get_default_embedding_client().embed(['warm'])"; then
187
+ echo "model ready (attempt $attempt)"
188
+ exit 0
189
+ fi
190
+ sleep $((30 + attempt * 15 + RANDOM % 30))
191
+ done
192
+ echo "::error::embedding model download kept failing (HF Hub rate limit?). Add an HF_TOKEN repo secret or retry the run."
193
+ exit 1
194
+ - name: Pytest -m slow
195
+ env:
196
+ PYTHONPATH: src
197
+ HF_TOKEN: ${{ secrets.HF_TOKEN }}
198
+ run: uv run pytest -m slow tests/