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.
- pretensor-0.2.0/.github/ISSUE_TEMPLATE/schema_report.yml +122 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/.github/workflows/open-publish-pr.yml +6 -1
- {pretensor-0.1.0a4 → pretensor-0.2.0}/.github/workflows/release.yml +12 -1
- pretensor-0.2.0/CHANGELOG.md +262 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/PKG-INFO +78 -28
- {pretensor-0.1.0a4 → pretensor-0.2.0}/README.md +74 -25
- {pretensor-0.1.0a4 → pretensor-0.2.0}/guides/quickstart.md +213 -34
- {pretensor-0.1.0a4 → pretensor-0.2.0}/pyproject.toml +3 -2
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/benchmark/l1/runner.py +2 -9
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/benchmark/l2/runner.py +2 -9
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/benchmark/l3/pretensor_runner.py +2 -9
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/benchmark/l3/runner.py +2 -9
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/benchmark/release_gate.py +232 -5
- pretensor-0.2.0/src/pretensor/cli/commands/_command_runners.py +406 -0
- pretensor-0.2.0/src/pretensor/cli/commands/analyze.py +205 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/cli/commands/index.py +5 -263
- pretensor-0.2.0/src/pretensor/cli/commands/init.py +661 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/cli/commands/quickstart.py +2 -2
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/cli/commands/reindex.py +12 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/cli/commands/serve.py +7 -3
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/cli/config_file.py +296 -23
- pretensor-0.2.0/src/pretensor/cli/init/inference.py +160 -0
- pretensor-0.2.0/src/pretensor/cli/init/mcp_clients.py +170 -0
- pretensor-0.2.0/src/pretensor/cli/init/steps.py +194 -0
- pretensor-0.2.0/src/pretensor/cli/init/wizard.py +62 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/cli/main.py +32 -10
- pretensor-0.2.0/src/pretensor/cli/prompts.py +102 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/config.py +16 -3
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/connectors/inspect.py +31 -23
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/connectors/lineage_sqlglot.py +15 -9
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/connectors/snapshot.py +62 -37
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/core/graph_schema_manager.py +2 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/core/graph_store.py +195 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/core/ids.py +33 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/core/schema.py +49 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/core/store.py +54 -0
- pretensor-0.2.0/src/pretensor/enrichment/analyze/classify.py +49 -0
- pretensor-0.2.0/src/pretensor/enrichment/analyze/extract_python.py +196 -0
- pretensor-0.2.0/src/pretensor/enrichment/analyze/extract_sql_file.py +83 -0
- pretensor-0.2.0/src/pretensor/enrichment/analyze/parse.py +141 -0
- pretensor-0.2.0/src/pretensor/enrichment/analyze/pipeline.py +282 -0
- pretensor-0.2.0/src/pretensor/enrichment/analyze/summary.py +41 -0
- pretensor-0.2.0/src/pretensor/enrichment/analyze/walker.py +133 -0
- pretensor-0.2.0/src/pretensor/enrichment/analyze/writers.py +214 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/graph_models/__init__.py +3 -0
- pretensor-0.2.0/src/pretensor/graph_models/consumer.py +71 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/intelligence/discovery.py +8 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/intelligence/heuristic.py +59 -27
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/intelligence/join_paths/on_demand.py +57 -14
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/introspection/models/dsn.py +22 -1
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/mcp/payload_types.py +24 -2
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/mcp/server.py +8 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/mcp/service.py +2 -0
- pretensor-0.2.0/src/pretensor/mcp/tools/consumers.py +161 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/mcp/tools/context.py +2 -2
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/mcp/tools/cypher.py +26 -3
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/mcp/tools/detect_changes.py +3 -1
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/mcp/tools/impact.py +36 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/mcp/tools/traverse.py +73 -21
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/quickstart/README.md +3 -1
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/quickstart/docker-compose.yml +5 -1
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/staleness/graph_patcher.py +98 -1
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/staleness/impact_analyzer.py +3 -2
- pretensor-0.2.0/src/pretensor/version.py +20 -0
- pretensor-0.2.0/tests/benchmark/baselines/adventureworks-l1-embeddings.json +1610 -0
- pretensor-0.2.0/tests/benchmark/baselines/adventureworks-l1.json +1609 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/benchmark/baselines/messy_warehouse-l1.json +6 -180
- pretensor-0.2.0/tests/benchmark/results/v0.1.0/adventureworks-l2.json +487 -0
- pretensor-0.2.0/tests/benchmark/results/v0.1.0/pagila-l2.json +323 -0
- pretensor-0.2.0/tests/benchmark/results/v0.1.0/tpch-l2.json +562 -0
- pretensor-0.2.0/tests/benchmark/results/v0.1.0a3/pagila-l1.json +91 -0
- pretensor-0.2.0/tests/benchmark/results/v0.1.0a3/tpch-l1.json +79 -0
- 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
- pretensor-0.2.0/tests/benchmark/results/v0.1.0a4/adventureworks-l2.json +487 -0
- pretensor-0.2.0/tests/benchmark/results/v0.1.0a4/pagila-l1.json +91 -0
- pretensor-0.2.0/tests/benchmark/results/v0.1.0a4/pagila-l2.json +323 -0
- pretensor-0.2.0/tests/benchmark/results/v0.1.0a4/tpch-l1.json +79 -0
- pretensor-0.2.0/tests/benchmark/results/v0.1.0a4/tpch-l2.json +562 -0
- pretensor-0.2.0/tests/benchmark/results/v0.2.0/accepted-regressions.toml +24 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/benchmark/test_release_gate.py +242 -0
- pretensor-0.2.0/tests/cli/init/test_inference.py +79 -0
- pretensor-0.2.0/tests/cli/init/test_mcp_clients.py +209 -0
- pretensor-0.2.0/tests/cli/init/test_steps.py +204 -0
- pretensor-0.2.0/tests/cli/init/test_wizard.py +39 -0
- pretensor-0.2.0/tests/cli/test_analyze_cli.py +670 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/cli/test_cli_error_handling.py +14 -6
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/cli/test_config_file.py +409 -3
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/cli/test_index_cli.py +23 -6
- pretensor-0.2.0/tests/cli/test_init_cli.py +2163 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/cli/test_main_cli.py +43 -0
- pretensor-0.2.0/tests/cli/test_prompts.py +39 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/cli/test_quickstart_cli.py +11 -19
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/cli/test_reindex_cli.py +110 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/cli/test_serve_cli.py +5 -7
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/connectors/test_dsn_parsing.py +126 -19
- pretensor-0.2.0/tests/connectors/test_inspect_collect_stats.py +67 -0
- pretensor-0.2.0/tests/contracts/test_consumer_node.py +77 -0
- pretensor-0.2.0/tests/core/test_schema_external_consumer.py +38 -0
- pretensor-0.2.0/tests/core/test_store_consumer_upserts.py +339 -0
- pretensor-0.2.0/tests/enrichment/analyze/fixtures/cross_connection.py +1 -0
- pretensor-0.2.0/tests/enrichment/analyze/fixtures/dml_writes.py +4 -0
- pretensor-0.2.0/tests/enrichment/analyze/fixtures/dynamic_only.py +5 -0
- pretensor-0.2.0/tests/enrichment/analyze/fixtures/fstring_prefix.py +2 -0
- pretensor-0.2.0/tests/enrichment/analyze/fixtures/multi_statement.sql +6 -0
- pretensor-0.2.0/tests/enrichment/analyze/fixtures/noqa_optout.py +6 -0
- pretensor-0.2.0/tests/enrichment/analyze/fixtures/simple.sql +4 -0
- pretensor-0.2.0/tests/enrichment/analyze/fixtures/simple_select.py +1 -0
- pretensor-0.2.0/tests/enrichment/analyze/fixtures/unparseable.sql +2 -0
- pretensor-0.2.0/tests/enrichment/analyze/test_classify.py +100 -0
- pretensor-0.2.0/tests/enrichment/analyze/test_extract_python.py +174 -0
- pretensor-0.2.0/tests/enrichment/analyze/test_extract_sql_file.py +215 -0
- pretensor-0.2.0/tests/enrichment/analyze/test_parse.py +185 -0
- pretensor-0.2.0/tests/enrichment/analyze/test_pipeline.py +474 -0
- pretensor-0.2.0/tests/enrichment/analyze/test_walker.py +177 -0
- pretensor-0.2.0/tests/enrichment/analyze/test_writers.py +334 -0
- pretensor-0.2.0/tests/intelligence/slow/__init__.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/intelligence/test_discovery.py +73 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/intelligence/test_heuristic.py +82 -18
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/intelligence/test_join_paths.py +132 -5
- pretensor-0.2.0/tests/mcp/test_consumers_tool.py +152 -0
- pretensor-0.2.0/tests/mcp/test_cypher_timeout_pool.py +104 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/mcp/test_detect_changes_errors.py +30 -3
- pretensor-0.2.0/tests/mcp/test_impact_consumers.py +127 -0
- pretensor-0.2.0/tests/mcp/test_serve_stdio_smoke.py +133 -0
- pretensor-0.2.0/tests/mcp/test_server_version.py +52 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/mcp/test_service.py +3 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/mcp/test_tool_registry.py +3 -2
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/mcp/test_traverse_dijkstra.py +107 -2
- pretensor-0.2.0/tests/scripts/__init__.py +0 -0
- pretensor-0.2.0/tests/semantic/__init__.py +0 -0
- pretensor-0.2.0/tests/staleness/test_staleness.py +572 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/test_pretensor_config.py +10 -0
- pretensor-0.2.0/tests/utils/__init__.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/uv.lock +13 -2
- pretensor-0.1.0a4/CHANGELOG.md +0 -134
- pretensor-0.1.0a4/tests/staleness/test_staleness.py +0 -159
- {pretensor-0.1.0a4 → pretensor-0.2.0}/.env.example +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/.gitattributes +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/.github/CODEOWNERS +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/.github/pull_request_template.md +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/.github/workflows/bench.yml +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/.github/workflows/ci.yml +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/.github/workflows/docs.yml +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/.github/workflows/e2e.yml +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/.github/workflows/no-internal-refs.yml +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/.gitignore +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/.gitlint +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/.pre-commit-config.yaml +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/.python-version +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/CODE_OF_CONDUCT.md +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/CONTRIBUTING.md +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/LICENSE +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/Makefile +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/SECURITY.md +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/docs/agent-framework-adapters.md +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/docs/ci.md +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/docs/releases.md +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/examples/README.md +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/examples/claude-code/README.md +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/examples/claude-code/mcp.json +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/examples/cursor/README.md +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/examples/cursor/mcp.json +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/examples/pagila/.gitignore +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/examples/pagila/README.md +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/examples/pagila/docker-compose.yml +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/examples/snowflake-tpch/README.md +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/examples/windsurf/README.md +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/examples/windsurf/mcp_config.json +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/scripts/audit_deny_list.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/scripts/check_no_internal_refs.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/scripts/check_readme_urls.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/scripts/data/adventureworks/schema.sql +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/scripts/data/adventureworks_metric_templates.yaml +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/scripts/data/adventureworks_nl2sql_bench.json +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/scripts/data/pagila/schema.sql +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/scripts/data/pagila_metric_templates.yaml +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/scripts/data/pagila_nl2sql_bench.json +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/scripts/data/tpch/schema.sql +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/scripts/data/tpch_metric_templates.yaml +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/scripts/data/tpch_nl2sql_bench.json +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/scripts/generate_schema_snapshot.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/__init__.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/benchmark/__init__.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/benchmark/cli.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/benchmark/fixtures.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/benchmark/l1/__init__.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/benchmark/l1/metrics.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/benchmark/l1/pipeline.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/benchmark/l2/__init__.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/benchmark/l2/gold.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/benchmark/l2/metrics.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/benchmark/l2/pipeline.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/benchmark/l3/__init__.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/benchmark/l3/agent.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/benchmark/l3/db.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/benchmark/l3/gold.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/benchmark/l3/llm_client.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/benchmark/l3/mcp_client.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/benchmark/l3/prompt.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/benchmark/l3/sql_equivalence.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/benchmark/results.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/benchmark/runner.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/cli/__init__.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/cli/commands/_source_runner.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/cli/commands/connections/__init__.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/cli/commands/connections/add_remove.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/cli/commands/connections/register.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/cli/commands/export.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/cli/commands/list.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/cli/commands/semantic.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/cli/commands/sync_grants.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/cli/commands/validate.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/cli/constants.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/cli/dbt_enrichment.py +0 -0
- {pretensor-0.1.0a4/src/pretensor/introspection/models → pretensor-0.2.0/src/pretensor/cli/init}/__init__.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/cli/paths.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/cli/plugin.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/connectors/__init__.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/connectors/base.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/connectors/bigquery.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/connectors/models.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/connectors/mysql.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/connectors/pg_array_parse.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/connectors/postgres.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/connectors/registry.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/connectors/snowflake.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/core/__init__.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/core/builder.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/core/dsn_crypto.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/core/portable_export.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/core/query_runner.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/core/registry.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/core/secure_io.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/enrichment/__init__.py +0 -0
- {pretensor-0.1.0a4/tests/benchmark → pretensor-0.2.0/src/pretensor/enrichment/analyze}/__init__.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/enrichment/dbt/__init__.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/enrichment/dbt/lineage.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/enrichment/dbt/manifest.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/enrichment/dbt/metadata.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/enrichment/dbt/pipeline.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/enrichment/dbt/resolution.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/enrichment/dbt/signals.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/entities/__init__.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/entities/builder.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/entities/classifier.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/entities/llm_extract.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/errors.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/graph_models/base.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/graph_models/edge.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/graph_models/entity.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/graph_models/node.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/graph_models/relationship.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/integrations/__init__.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/integrations/_base.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/integrations/google_adk.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/integrations/langchain.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/integrations/llamaindex.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/intelligence/__init__.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/intelligence/cluster_labeler.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/intelligence/clustering.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/intelligence/combining.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/intelligence/embeddings.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/intelligence/graph_export.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/intelligence/join_paths/__init__.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/intelligence/join_paths/storage.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/intelligence/llm_infer.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/intelligence/llm_runtime.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/intelligence/metric_templates.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/intelligence/pipeline.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/intelligence/role_exemplars.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/intelligence/schema_classification.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/intelligence/scoring.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/intelligence/semantic.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/intelligence/shadow_alias.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/intelligence/statistical.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/intelligence/steps.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/intelligence/steps_embedding.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/introspection/__init__.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/introspection/inspector.py +0 -0
- {pretensor-0.1.0a4/tests/benchmark/l1 → pretensor-0.2.0/src/pretensor/introspection/models}/__init__.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/introspection/models/base.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/introspection/models/config.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/introspection/models/plan.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/introspection/models/schema.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/introspection/models/semantic.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/introspection/models/validation.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/introspection/snapshot.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/mcp/__init__.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/mcp/config_json.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/mcp/resources/__init__.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/mcp/resources/markdown.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/mcp/service_context.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/mcp/service_registry.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/mcp/store_cache.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/mcp/tool_registry.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/mcp/tools/__init__.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/mcp/tools/_rank.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/mcp/tools/_timed.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/mcp/tools/compile_metric.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/mcp/tools/list.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/mcp/tools/schema.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/mcp/tools/search.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/mcp/tools/semantic_search.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/mcp/tools/validate_sql.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/observability.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/py.typed +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/quickstart/__init__.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/quickstart/pagila_data.sql +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/quickstart/pagila_ddl.sql +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/search/__init__.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/search/base.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/search/index.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/semantic/__init__.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/semantic/base.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/semantic/compiler.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/semantic/yaml_layer.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/skills/__init__.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/skills/generator.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/staleness/__init__.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/staleness/snapshot_store.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/validation/__init__.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/validation/query_validator.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/visibility/__init__.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/visibility/config.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/visibility/filter.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/visibility/kuzu_helpers.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/visibility/runtime.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/src/pretensor/visibility/sync_grants.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/__init__.py +0 -0
- {pretensor-0.1.0a4/tests/benchmark/l2 → pretensor-0.2.0/tests/benchmark}/__init__.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/benchmark/_compare.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/benchmark/baselines/adventureworks-l2-embeddings.json +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/benchmark/baselines/adventureworks-l2.json +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/benchmark/baselines/adversarial-l1.json +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/benchmark/baselines/analytics_dwh-l1.json +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/benchmark/baselines/pagila-l1-embeddings.json +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/benchmark/baselines/pagila-l1.json +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/benchmark/baselines/pagila-l2-embeddings.json +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/benchmark/baselines/pagila-l2.json +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/benchmark/baselines/saas_multitenant-l1.json +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/benchmark/baselines/tpch-l1-embeddings.json +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/benchmark/baselines/tpch-l1.json +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/benchmark/baselines/tpch-l2-embeddings.json +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/benchmark/baselines/tpch-l2.json +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/benchmark/fixtures/baseline.json +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/benchmark/fixtures/regressed.json +0 -0
- {pretensor-0.1.0a4/tests/benchmark/l3 → pretensor-0.2.0/tests/benchmark/l1}/__init__.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/benchmark/l1/test_metrics.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/benchmark/l1/test_runner.py +0 -0
- {pretensor-0.1.0a4/tests/e2e → pretensor-0.2.0/tests/benchmark/l2}/__init__.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/benchmark/l2/test_gold.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/benchmark/l2/test_metrics.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/benchmark/l2/test_runner.py +0 -0
- {pretensor-0.1.0a4/tests/e2e/fixtures → pretensor-0.2.0/tests/benchmark/l3}/__init__.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/benchmark/l3/test_agent.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/benchmark/l3/test_db.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/benchmark/l3/test_gold.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/benchmark/l3/test_llm_client.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/benchmark/l3/test_mcp_client.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/benchmark/l3/test_pretensor_runner.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/benchmark/l3/test_prompt.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/benchmark/l3/test_runner.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/benchmark/l3/test_sql_equivalence.py +0 -0
- {pretensor-0.1.0a4/tests/benchmark/baselines → pretensor-0.2.0/tests/benchmark/results/v0.1.0}/adventureworks-l1.json +0 -0
- {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
- {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
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/benchmark/results/v0.1.0a3/README.md +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/benchmark/results/v0.1.0a3/adventureworks-l1.json +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/benchmark/results/v0.1.0a3/adventureworks-l2.json +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/benchmark/results/v0.1.0a3/pagila-l2.json +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/benchmark/results/v0.1.0a3/tpch-l2.json +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/benchmark/test_cli.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/benchmark/test_fixtures.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/benchmark/test_results.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/cli/conftest.py +0 -0
- {pretensor-0.1.0a4/tests/enrichment → pretensor-0.2.0/tests/cli/init}/__init__.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/cli/test_connections_cli.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/cli/test_dbt_enrichment_cli.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/cli/test_export_cli.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/cli/test_list_cli.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/cli/test_paths_cli.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/cli/test_plugin.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/cli/test_semantic_cli.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/cli/test_sync_grants_cli.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/cli/test_validate_cli.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/conftest.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/connectors/test_base_connector.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/connectors/test_bigquery.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/connectors/test_catalog_enrichment.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/connectors/test_lineage_sqlglot.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/connectors/test_mysql_connector.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/connectors/test_pg_array_parse.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/connectors/test_postgres_table_grants.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/connectors/test_postgres_views.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/connectors/test_registry_mysql_optional.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/connectors/test_registry_postgres_optional.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/connectors/test_registry_snowflake_optional.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/connectors/test_snowflake_connector.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/connectors/test_snowflake_table_grants.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/contracts/__init__.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/contracts/test_combiner.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/contracts/test_pipeline_step.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/contracts/test_scorer.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/contracts/test_search_index.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/contracts/test_semantic_layer.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/core/test_builder.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/core/test_dsn_at_rest.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/core/test_graph_builder_lineage.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/core/test_lineage_store.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/core/test_models.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/core/test_portable_export.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/core/test_registry.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/core/test_schema.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/core/test_semantic_schema.py +0 -0
- {pretensor-0.1.0a4/tests/integrations → pretensor-0.2.0/tests/e2e}/__init__.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/e2e/conftest.py +0 -0
- {pretensor-0.1.0a4/tests/intelligence/slow → pretensor-0.2.0/tests/e2e/fixtures}/__init__.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/e2e/fixtures/sql/adventureworks_ddl.sql +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/e2e/fixtures/sql/messy_warehouse_ddl.sql +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/e2e/fixtures/sql/sakila_mysql_ddl.sql +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/e2e/fixtures/sql/tpcds_ddl.sql +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/e2e/fixtures/sql/tpch_ddl.sql +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/e2e/test_adventureworks_smoke.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/e2e/test_adventureworks_traverse.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/e2e/test_dbt_warehouse_scale_enrichment.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/e2e/test_index_cycle.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/e2e/test_l3_baseline.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/e2e/test_l3_pretensor.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/e2e/test_mcp_tools.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/e2e/test_mysql_index_cycle.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/e2e/test_reindex.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/e2e/test_serve_smoke.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/e2e/test_tpcds_traverse.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/e2e/test_tpch_traverse.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/e2e/test_visibility.py +0 -0
- {pretensor-0.1.0a4/tests/scripts → pretensor-0.2.0/tests/enrichment}/__init__.py +0 -0
- {pretensor-0.1.0a4/tests/semantic → pretensor-0.2.0/tests/enrichment/analyze}/__init__.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/enrichment/fixtures/dbt/manifest_v10.json +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/enrichment/fixtures/dbt/manifest_v9.json +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/enrichment/test_dbt_lineage.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/enrichment/test_dbt_manifest.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/enrichment/test_dbt_metadata.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/enrichment/test_dbt_pipeline.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/enrichment/test_dbt_signals.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/entities/test_classifier.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/entities/test_entity_builder.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/entities/test_llm_extract.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/entities/test_pagila_entities.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/fixtures/dbt/synthetic_warehouse/README.md +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/fixtures/dbt/synthetic_warehouse/__init__.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/fixtures/dbt/synthetic_warehouse/generator.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/fixtures/pairs/analytics_vs_saas.yaml +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/fixtures/pairs/tpch_vs_pagila.yaml +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/fixtures/pairs/tpch_vs_tpch_renamed.yaml +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/fixtures/schemas/README.md +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/fixtures/schemas/adventureworks.yaml +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/fixtures/schemas/adversarial.yaml +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/fixtures/schemas/adversarial_roles.yaml +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/fixtures/schemas/analytics_dwh.yaml +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/fixtures/schemas/messy_warehouse.yaml +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/fixtures/schemas/messy_warehouse_roles.yaml +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/fixtures/schemas/pagila.yaml +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/fixtures/schemas/pagila_extended.yaml +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/fixtures/schemas/saas_multitenant.yaml +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/fixtures/schemas/tpch.yaml +0 -0
- {pretensor-0.1.0a4/tests/utils → pretensor-0.2.0/tests/integrations}/__init__.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/integrations/test_base.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/integrations/test_google_adk.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/integrations/test_langchain.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/integrations/test_llamaindex.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/intelligence/slow/test_real_model_smoke.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/intelligence/test_cluster_labeler.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/intelligence/test_clustering.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/intelligence/test_clustering_embeddings.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/intelligence/test_embedding_index_step.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/intelligence/test_embeddings.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/intelligence/test_extended_pagila.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/intelligence/test_intelligence.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/intelligence/test_llm_infer.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/intelligence/test_llm_runtime.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/intelligence/test_metric_templates.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/intelligence/test_null_path_parity.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/intelligence/test_pipeline.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/intelligence/test_role_exemplars.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/intelligence/test_schema_classification.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/intelligence/test_semantic_scorer.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/intelligence/test_shadow_alias.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/intelligence/test_statistical.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/mcp/test_compile_metric_tool.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/mcp/test_context_dbt.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/mcp/test_context_lineage.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/mcp/test_context_similar.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/mcp/test_context_tool.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/mcp/test_cypher_readonly.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/mcp/test_error_ergonomics.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/mcp/test_error_handling.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/mcp/test_error_sanitization.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/mcp/test_impact_hop.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/mcp/test_kill_switch.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/mcp/test_mcp_null_path_parity.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/mcp/test_query_hybrid.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/mcp/test_schema_tool.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/mcp/test_semantic_search.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/mcp/test_traverse_ambiguous.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/mcp/test_traverse_pagila_shape.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/mcp/test_traverse_tiebreak.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/mcp/test_validate_sql_tool.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/mcp/test_visibility_mcp.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/query_helpers.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/scripts/test_check_no_internal_refs.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/search/test_search_index.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/semantic/test_compiler.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/semantic/test_semantic_layer.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/semantic/test_yaml_layer.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/test_errors.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/test_gitlint_config.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/test_graph_schema_manager.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/test_graph_store.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/test_observability.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/test_packaging.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/test_query_runner.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/test_store_cache.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/utils/score_tracker.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/validation/test_compile_did_you_mean.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/validation/test_query_validator.py +0 -0
- {pretensor-0.1.0a4 → pretensor-0.2.0}/tests/visibility/test_sync_grants.py +0 -0
- {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
|
-
|
|
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
|
-
|
|
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.
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
2
|
Name: pretensor
|
|
3
|
-
Version: 0.
|
|
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
|
|
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
|
[](https://pypi.org/project/pretensor/)
|
|
80
81
|
[](https://github.com/pretensor-ai/pretensor/actions/workflows/ci.yml)
|
|
81
82
|
[](https://github.com/pretensor-ai/pretensor/actions/workflows/bench.yml)
|
|
82
|
-
[](#status)
|
|
83
84
|
[](#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:
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
144
|
-
pretensor
|
|
144
|
+
pip install 'pretensor[postgres]'
|
|
145
|
+
pretensor init
|
|
145
146
|
```
|
|
146
147
|
|
|
147
|
-
`
|
|
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
|
-
|
|
152
|
+
## Scan application code (`analyze`)
|
|
150
153
|
|
|
151
|
-
|
|
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
|
|
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
|
|
193
|
-
- **`core
|
|
194
|
-
- **`intelligence
|
|
195
|
-
- **`
|
|
196
|
-
- **`
|
|
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
|
|
250
|
+
Pretensor is **early software**:
|
|
201
251
|
|
|
202
|
-
- The package on PyPI is named `pretensor`.
|
|
203
|
-
- There is no SemVer stability guarantee
|
|
204
|
-
-
|
|
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
|
|
278
|
+
MIT: see [LICENSE](https://github.com/pretensor-ai/pretensor/blob/main/LICENSE).
|