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.
- pretensor-0.1.0/.env.example +0 -0
- pretensor-0.1.0/.gitattributes +2 -0
- pretensor-0.1.0/.github/CODEOWNERS +2 -0
- pretensor-0.1.0/.github/ISSUE_TEMPLATE/bug_report.yml +110 -0
- pretensor-0.1.0/.github/ISSUE_TEMPLATE/config.yml +8 -0
- pretensor-0.1.0/.github/ISSUE_TEMPLATE/feature_request.yml +57 -0
- pretensor-0.1.0/.github/ISSUE_TEMPLATE/schema_report.yml +122 -0
- pretensor-0.1.0/.github/pull_request_template.md +15 -0
- pretensor-0.1.0/.github/workflows/bench.yml +155 -0
- pretensor-0.1.0/.github/workflows/ci.yml +198 -0
- pretensor-0.1.0/.github/workflows/docs.yml +48 -0
- pretensor-0.1.0/.github/workflows/e2e.yml +47 -0
- pretensor-0.1.0/.github/workflows/no-internal-refs.yml +41 -0
- pretensor-0.1.0/.github/workflows/open-publish-pr.yml +36 -0
- pretensor-0.1.0/.github/workflows/release.yml +192 -0
- pretensor-0.1.0/.gitignore +76 -0
- pretensor-0.1.0/.gitlint +19 -0
- pretensor-0.1.0/.pre-commit-config.yaml +35 -0
- pretensor-0.1.0/.python-version +1 -0
- pretensor-0.1.0/CHANGELOG.md +199 -0
- pretensor-0.1.0/CODE_OF_CONDUCT.md +83 -0
- pretensor-0.1.0/CONTRIBUTING.md +173 -0
- pretensor-0.1.0/LICENSE +21 -0
- pretensor-0.1.0/Makefile +68 -0
- pretensor-0.1.0/PKG-INFO +251 -0
- pretensor-0.1.0/README.md +174 -0
- pretensor-0.1.0/SECURITY.md +101 -0
- pretensor-0.1.0/docs/agent-framework-adapters.md +84 -0
- pretensor-0.1.0/docs/ci.md +49 -0
- pretensor-0.1.0/docs/releases.md +164 -0
- pretensor-0.1.0/examples/README.md +25 -0
- pretensor-0.1.0/examples/claude-code/README.md +52 -0
- pretensor-0.1.0/examples/claude-code/mcp.json +8 -0
- pretensor-0.1.0/examples/cursor/README.md +50 -0
- pretensor-0.1.0/examples/cursor/mcp.json +8 -0
- pretensor-0.1.0/examples/pagila/.gitignore +2 -0
- pretensor-0.1.0/examples/pagila/README.md +77 -0
- pretensor-0.1.0/examples/pagila/docker-compose.yml +19 -0
- pretensor-0.1.0/examples/snowflake-tpch/README.md +126 -0
- pretensor-0.1.0/examples/windsurf/README.md +51 -0
- pretensor-0.1.0/examples/windsurf/mcp_config.json +8 -0
- pretensor-0.1.0/guides/quickstart.md +471 -0
- pretensor-0.1.0/pyproject.toml +151 -0
- pretensor-0.1.0/scripts/audit_deny_list.py +147 -0
- pretensor-0.1.0/scripts/check_no_internal_refs.py +114 -0
- pretensor-0.1.0/scripts/check_readme_urls.py +71 -0
- pretensor-0.1.0/scripts/data/adventureworks/schema.sql +3046 -0
- pretensor-0.1.0/scripts/data/adventureworks_metric_templates.yaml +67 -0
- pretensor-0.1.0/scripts/data/adventureworks_nl2sql_bench.json +130 -0
- pretensor-0.1.0/scripts/data/pagila/schema.sql +1842 -0
- pretensor-0.1.0/scripts/data/pagila_metric_templates.yaml +67 -0
- pretensor-0.1.0/scripts/data/pagila_nl2sql_bench.json +66 -0
- pretensor-0.1.0/scripts/data/tpch/schema.sql +121 -0
- pretensor-0.1.0/scripts/data/tpch_metric_templates.yaml +67 -0
- pretensor-0.1.0/scripts/data/tpch_nl2sql_bench.json +138 -0
- pretensor-0.1.0/scripts/generate_schema_snapshot.py +165 -0
- pretensor-0.1.0/src/pretensor/__init__.py +50 -0
- pretensor-0.1.0/src/pretensor/benchmark/__init__.py +54 -0
- pretensor-0.1.0/src/pretensor/benchmark/cli.py +294 -0
- pretensor-0.1.0/src/pretensor/benchmark/fixtures.py +84 -0
- pretensor-0.1.0/src/pretensor/benchmark/l1/__init__.py +23 -0
- pretensor-0.1.0/src/pretensor/benchmark/l1/metrics.py +141 -0
- pretensor-0.1.0/src/pretensor/benchmark/l1/pipeline.py +188 -0
- pretensor-0.1.0/src/pretensor/benchmark/l1/runner.py +245 -0
- pretensor-0.1.0/src/pretensor/benchmark/l2/__init__.py +27 -0
- pretensor-0.1.0/src/pretensor/benchmark/l2/gold.py +236 -0
- pretensor-0.1.0/src/pretensor/benchmark/l2/metrics.py +146 -0
- pretensor-0.1.0/src/pretensor/benchmark/l2/pipeline.py +124 -0
- pretensor-0.1.0/src/pretensor/benchmark/l2/runner.py +530 -0
- pretensor-0.1.0/src/pretensor/benchmark/l3/__init__.py +73 -0
- pretensor-0.1.0/src/pretensor/benchmark/l3/agent.py +316 -0
- pretensor-0.1.0/src/pretensor/benchmark/l3/db.py +188 -0
- pretensor-0.1.0/src/pretensor/benchmark/l3/gold.py +85 -0
- pretensor-0.1.0/src/pretensor/benchmark/l3/llm_client.py +395 -0
- pretensor-0.1.0/src/pretensor/benchmark/l3/mcp_client.py +357 -0
- pretensor-0.1.0/src/pretensor/benchmark/l3/pretensor_runner.py +456 -0
- pretensor-0.1.0/src/pretensor/benchmark/l3/prompt.py +132 -0
- pretensor-0.1.0/src/pretensor/benchmark/l3/runner.py +358 -0
- pretensor-0.1.0/src/pretensor/benchmark/l3/sql_equivalence.py +176 -0
- pretensor-0.1.0/src/pretensor/benchmark/release_gate.py +448 -0
- pretensor-0.1.0/src/pretensor/benchmark/results.py +298 -0
- pretensor-0.1.0/src/pretensor/benchmark/runner.py +109 -0
- pretensor-0.1.0/src/pretensor/cli/__init__.py +1 -0
- pretensor-0.1.0/src/pretensor/cli/commands/_source_runner.py +147 -0
- pretensor-0.1.0/src/pretensor/cli/commands/analyze.py +201 -0
- pretensor-0.1.0/src/pretensor/cli/commands/connections/__init__.py +7 -0
- pretensor-0.1.0/src/pretensor/cli/commands/connections/add_remove.py +126 -0
- pretensor-0.1.0/src/pretensor/cli/commands/connections/register.py +12 -0
- pretensor-0.1.0/src/pretensor/cli/commands/export.py +131 -0
- pretensor-0.1.0/src/pretensor/cli/commands/index.py +559 -0
- pretensor-0.1.0/src/pretensor/cli/commands/list.py +76 -0
- pretensor-0.1.0/src/pretensor/cli/commands/quickstart.py +207 -0
- pretensor-0.1.0/src/pretensor/cli/commands/reindex.py +646 -0
- pretensor-0.1.0/src/pretensor/cli/commands/semantic.py +190 -0
- pretensor-0.1.0/src/pretensor/cli/commands/serve.py +144 -0
- pretensor-0.1.0/src/pretensor/cli/commands/sync_grants.py +149 -0
- pretensor-0.1.0/src/pretensor/cli/commands/validate.py +176 -0
- pretensor-0.1.0/src/pretensor/cli/config_file.py +442 -0
- pretensor-0.1.0/src/pretensor/cli/constants.py +10 -0
- pretensor-0.1.0/src/pretensor/cli/dbt_enrichment.py +96 -0
- pretensor-0.1.0/src/pretensor/cli/main.py +109 -0
- pretensor-0.1.0/src/pretensor/cli/paths.py +43 -0
- pretensor-0.1.0/src/pretensor/cli/plugin.py +52 -0
- pretensor-0.1.0/src/pretensor/config.py +226 -0
- pretensor-0.1.0/src/pretensor/connectors/__init__.py +29 -0
- pretensor-0.1.0/src/pretensor/connectors/base.py +165 -0
- pretensor-0.1.0/src/pretensor/connectors/bigquery.py +468 -0
- pretensor-0.1.0/src/pretensor/connectors/inspect.py +321 -0
- pretensor-0.1.0/src/pretensor/connectors/lineage_sqlglot.py +97 -0
- pretensor-0.1.0/src/pretensor/connectors/models.py +130 -0
- pretensor-0.1.0/src/pretensor/connectors/mysql.py +402 -0
- pretensor-0.1.0/src/pretensor/connectors/pg_array_parse.py +53 -0
- pretensor-0.1.0/src/pretensor/connectors/postgres.py +938 -0
- pretensor-0.1.0/src/pretensor/connectors/registry.py +93 -0
- pretensor-0.1.0/src/pretensor/connectors/snapshot.py +244 -0
- pretensor-0.1.0/src/pretensor/connectors/snowflake.py +908 -0
- pretensor-0.1.0/src/pretensor/core/__init__.py +1 -0
- pretensor-0.1.0/src/pretensor/core/builder.py +307 -0
- pretensor-0.1.0/src/pretensor/core/dsn_crypto.py +51 -0
- pretensor-0.1.0/src/pretensor/core/graph_schema_manager.py +246 -0
- pretensor-0.1.0/src/pretensor/core/graph_store.py +1226 -0
- pretensor-0.1.0/src/pretensor/core/ids.py +101 -0
- pretensor-0.1.0/src/pretensor/core/portable_export.py +276 -0
- pretensor-0.1.0/src/pretensor/core/query_runner.py +67 -0
- pretensor-0.1.0/src/pretensor/core/registry.py +209 -0
- pretensor-0.1.0/src/pretensor/core/schema.py +473 -0
- pretensor-0.1.0/src/pretensor/core/secure_io.py +93 -0
- pretensor-0.1.0/src/pretensor/core/store.py +469 -0
- pretensor-0.1.0/src/pretensor/enrichment/__init__.py +1 -0
- pretensor-0.1.0/src/pretensor/enrichment/analyze/__init__.py +0 -0
- pretensor-0.1.0/src/pretensor/enrichment/analyze/classify.py +49 -0
- pretensor-0.1.0/src/pretensor/enrichment/analyze/extract_python.py +196 -0
- pretensor-0.1.0/src/pretensor/enrichment/analyze/parse.py +141 -0
- pretensor-0.1.0/src/pretensor/enrichment/analyze/pipeline.py +195 -0
- pretensor-0.1.0/src/pretensor/enrichment/analyze/summary.py +38 -0
- pretensor-0.1.0/src/pretensor/enrichment/analyze/walker.py +98 -0
- pretensor-0.1.0/src/pretensor/enrichment/analyze/writers.py +214 -0
- pretensor-0.1.0/src/pretensor/enrichment/dbt/__init__.py +30 -0
- pretensor-0.1.0/src/pretensor/enrichment/dbt/lineage.py +100 -0
- pretensor-0.1.0/src/pretensor/enrichment/dbt/manifest.py +300 -0
- pretensor-0.1.0/src/pretensor/enrichment/dbt/metadata.py +263 -0
- pretensor-0.1.0/src/pretensor/enrichment/dbt/pipeline.py +77 -0
- pretensor-0.1.0/src/pretensor/enrichment/dbt/resolution.py +101 -0
- pretensor-0.1.0/src/pretensor/enrichment/dbt/signals.py +305 -0
- pretensor-0.1.0/src/pretensor/entities/__init__.py +27 -0
- pretensor-0.1.0/src/pretensor/entities/builder.py +63 -0
- pretensor-0.1.0/src/pretensor/entities/classifier.py +383 -0
- pretensor-0.1.0/src/pretensor/entities/llm_extract.py +66 -0
- pretensor-0.1.0/src/pretensor/errors.py +35 -0
- pretensor-0.1.0/src/pretensor/graph_models/__init__.py +17 -0
- pretensor-0.1.0/src/pretensor/graph_models/base.py +11 -0
- pretensor-0.1.0/src/pretensor/graph_models/consumer.py +71 -0
- pretensor-0.1.0/src/pretensor/graph_models/edge.py +35 -0
- pretensor-0.1.0/src/pretensor/graph_models/entity.py +21 -0
- pretensor-0.1.0/src/pretensor/graph_models/node.py +79 -0
- pretensor-0.1.0/src/pretensor/graph_models/relationship.py +33 -0
- pretensor-0.1.0/src/pretensor/integrations/__init__.py +42 -0
- pretensor-0.1.0/src/pretensor/integrations/_base.py +138 -0
- pretensor-0.1.0/src/pretensor/integrations/google_adk.py +49 -0
- pretensor-0.1.0/src/pretensor/integrations/langchain.py +55 -0
- pretensor-0.1.0/src/pretensor/integrations/llamaindex.py +53 -0
- pretensor-0.1.0/src/pretensor/intelligence/__init__.py +33 -0
- pretensor-0.1.0/src/pretensor/intelligence/cluster_labeler.py +425 -0
- pretensor-0.1.0/src/pretensor/intelligence/clustering.py +168 -0
- pretensor-0.1.0/src/pretensor/intelligence/combining.py +32 -0
- pretensor-0.1.0/src/pretensor/intelligence/discovery.py +114 -0
- pretensor-0.1.0/src/pretensor/intelligence/embeddings.py +317 -0
- pretensor-0.1.0/src/pretensor/intelligence/graph_export.py +200 -0
- pretensor-0.1.0/src/pretensor/intelligence/heuristic.py +544 -0
- pretensor-0.1.0/src/pretensor/intelligence/join_paths/__init__.py +130 -0
- pretensor-0.1.0/src/pretensor/intelligence/join_paths/on_demand.py +516 -0
- pretensor-0.1.0/src/pretensor/intelligence/join_paths/storage.py +70 -0
- pretensor-0.1.0/src/pretensor/intelligence/llm_infer.py +78 -0
- pretensor-0.1.0/src/pretensor/intelligence/llm_runtime.py +62 -0
- pretensor-0.1.0/src/pretensor/intelligence/metric_templates.py +193 -0
- pretensor-0.1.0/src/pretensor/intelligence/pipeline.py +364 -0
- pretensor-0.1.0/src/pretensor/intelligence/role_exemplars.py +263 -0
- pretensor-0.1.0/src/pretensor/intelligence/schema_classification.py +360 -0
- pretensor-0.1.0/src/pretensor/intelligence/scoring.py +76 -0
- pretensor-0.1.0/src/pretensor/intelligence/semantic.py +240 -0
- pretensor-0.1.0/src/pretensor/intelligence/shadow_alias.py +101 -0
- pretensor-0.1.0/src/pretensor/intelligence/statistical.py +50 -0
- pretensor-0.1.0/src/pretensor/intelligence/steps.py +191 -0
- pretensor-0.1.0/src/pretensor/intelligence/steps_embedding.py +168 -0
- pretensor-0.1.0/src/pretensor/introspection/__init__.py +6 -0
- pretensor-0.1.0/src/pretensor/introspection/inspector.py +5 -0
- pretensor-0.1.0/src/pretensor/introspection/models/__init__.py +0 -0
- pretensor-0.1.0/src/pretensor/introspection/models/base.py +5 -0
- pretensor-0.1.0/src/pretensor/introspection/models/config.py +237 -0
- pretensor-0.1.0/src/pretensor/introspection/models/dsn.py +550 -0
- pretensor-0.1.0/src/pretensor/introspection/models/plan.py +116 -0
- pretensor-0.1.0/src/pretensor/introspection/models/schema.py +10 -0
- pretensor-0.1.0/src/pretensor/introspection/models/semantic.py +121 -0
- pretensor-0.1.0/src/pretensor/introspection/models/validation.py +116 -0
- pretensor-0.1.0/src/pretensor/introspection/snapshot.py +46 -0
- pretensor-0.1.0/src/pretensor/mcp/__init__.py +16 -0
- pretensor-0.1.0/src/pretensor/mcp/config_json.py +24 -0
- pretensor-0.1.0/src/pretensor/mcp/payload_types.py +274 -0
- pretensor-0.1.0/src/pretensor/mcp/resources/__init__.py +17 -0
- pretensor-0.1.0/src/pretensor/mcp/resources/markdown.py +314 -0
- pretensor-0.1.0/src/pretensor/mcp/server.py +285 -0
- pretensor-0.1.0/src/pretensor/mcp/service.py +49 -0
- pretensor-0.1.0/src/pretensor/mcp/service_context.py +142 -0
- pretensor-0.1.0/src/pretensor/mcp/service_registry.py +294 -0
- pretensor-0.1.0/src/pretensor/mcp/store_cache.py +43 -0
- pretensor-0.1.0/src/pretensor/mcp/tool_registry.py +136 -0
- pretensor-0.1.0/src/pretensor/mcp/tools/__init__.py +1 -0
- pretensor-0.1.0/src/pretensor/mcp/tools/_rank.py +244 -0
- pretensor-0.1.0/src/pretensor/mcp/tools/_timed.py +26 -0
- pretensor-0.1.0/src/pretensor/mcp/tools/compile_metric.py +144 -0
- pretensor-0.1.0/src/pretensor/mcp/tools/consumers.py +161 -0
- pretensor-0.1.0/src/pretensor/mcp/tools/context.py +1121 -0
- pretensor-0.1.0/src/pretensor/mcp/tools/cypher.py +509 -0
- pretensor-0.1.0/src/pretensor/mcp/tools/detect_changes.py +254 -0
- pretensor-0.1.0/src/pretensor/mcp/tools/impact.py +271 -0
- pretensor-0.1.0/src/pretensor/mcp/tools/list.py +131 -0
- pretensor-0.1.0/src/pretensor/mcp/tools/schema.py +170 -0
- pretensor-0.1.0/src/pretensor/mcp/tools/search.py +316 -0
- pretensor-0.1.0/src/pretensor/mcp/tools/semantic_search.py +282 -0
- pretensor-0.1.0/src/pretensor/mcp/tools/traverse.py +1027 -0
- pretensor-0.1.0/src/pretensor/mcp/tools/validate_sql.py +150 -0
- pretensor-0.1.0/src/pretensor/observability.py +203 -0
- pretensor-0.1.0/src/pretensor/py.typed +0 -0
- pretensor-0.1.0/src/pretensor/quickstart/README.md +29 -0
- pretensor-0.1.0/src/pretensor/quickstart/__init__.py +6 -0
- pretensor-0.1.0/src/pretensor/quickstart/docker-compose.yml +18 -0
- pretensor-0.1.0/src/pretensor/quickstart/pagila_data.sql +63 -0
- pretensor-0.1.0/src/pretensor/quickstart/pagila_ddl.sql +92 -0
- pretensor-0.1.0/src/pretensor/search/__init__.py +6 -0
- pretensor-0.1.0/src/pretensor/search/base.py +80 -0
- pretensor-0.1.0/src/pretensor/search/index.py +435 -0
- pretensor-0.1.0/src/pretensor/semantic/__init__.py +24 -0
- pretensor-0.1.0/src/pretensor/semantic/base.py +123 -0
- pretensor-0.1.0/src/pretensor/semantic/compiler.py +487 -0
- pretensor-0.1.0/src/pretensor/semantic/yaml_layer.py +180 -0
- pretensor-0.1.0/src/pretensor/skills/__init__.py +5 -0
- pretensor-0.1.0/src/pretensor/skills/generator.py +235 -0
- pretensor-0.1.0/src/pretensor/staleness/__init__.py +15 -0
- pretensor-0.1.0/src/pretensor/staleness/graph_patcher.py +355 -0
- pretensor-0.1.0/src/pretensor/staleness/impact_analyzer.py +162 -0
- pretensor-0.1.0/src/pretensor/staleness/snapshot_store.py +38 -0
- pretensor-0.1.0/src/pretensor/validation/__init__.py +9 -0
- pretensor-0.1.0/src/pretensor/validation/query_validator.py +436 -0
- pretensor-0.1.0/src/pretensor/visibility/__init__.py +23 -0
- pretensor-0.1.0/src/pretensor/visibility/config.py +126 -0
- pretensor-0.1.0/src/pretensor/visibility/filter.py +143 -0
- pretensor-0.1.0/src/pretensor/visibility/kuzu_helpers.py +32 -0
- pretensor-0.1.0/src/pretensor/visibility/runtime.py +36 -0
- pretensor-0.1.0/src/pretensor/visibility/sync_grants.py +188 -0
- pretensor-0.1.0/tests/__init__.py +1 -0
- pretensor-0.1.0/tests/benchmark/__init__.py +0 -0
- pretensor-0.1.0/tests/benchmark/_compare.py +23 -0
- pretensor-0.1.0/tests/benchmark/baselines/adventureworks-l1-embeddings.json +4184 -0
- pretensor-0.1.0/tests/benchmark/baselines/adventureworks-l1.json +4183 -0
- pretensor-0.1.0/tests/benchmark/baselines/adventureworks-l2-embeddings.json +953 -0
- pretensor-0.1.0/tests/benchmark/baselines/adventureworks-l2.json +487 -0
- pretensor-0.1.0/tests/benchmark/baselines/adversarial-l1.json +77 -0
- pretensor-0.1.0/tests/benchmark/baselines/analytics_dwh-l1.json +55 -0
- pretensor-0.1.0/tests/benchmark/baselines/messy_warehouse-l1.json +839 -0
- pretensor-0.1.0/tests/benchmark/baselines/pagila-l1-embeddings.json +158 -0
- pretensor-0.1.0/tests/benchmark/baselines/pagila-l1.json +91 -0
- pretensor-0.1.0/tests/benchmark/baselines/pagila-l2-embeddings.json +539 -0
- pretensor-0.1.0/tests/benchmark/baselines/pagila-l2.json +323 -0
- pretensor-0.1.0/tests/benchmark/baselines/saas_multitenant-l1.json +73 -0
- pretensor-0.1.0/tests/benchmark/baselines/tpch-l1-embeddings.json +80 -0
- pretensor-0.1.0/tests/benchmark/baselines/tpch-l1.json +79 -0
- pretensor-0.1.0/tests/benchmark/baselines/tpch-l2-embeddings.json +1096 -0
- pretensor-0.1.0/tests/benchmark/baselines/tpch-l2.json +562 -0
- pretensor-0.1.0/tests/benchmark/fixtures/baseline.json +20 -0
- pretensor-0.1.0/tests/benchmark/fixtures/regressed.json +20 -0
- pretensor-0.1.0/tests/benchmark/l1/__init__.py +0 -0
- pretensor-0.1.0/tests/benchmark/l1/test_metrics.py +168 -0
- pretensor-0.1.0/tests/benchmark/l1/test_runner.py +172 -0
- pretensor-0.1.0/tests/benchmark/l2/__init__.py +0 -0
- pretensor-0.1.0/tests/benchmark/l2/test_gold.py +306 -0
- pretensor-0.1.0/tests/benchmark/l2/test_metrics.py +201 -0
- pretensor-0.1.0/tests/benchmark/l2/test_runner.py +151 -0
- pretensor-0.1.0/tests/benchmark/l3/__init__.py +0 -0
- pretensor-0.1.0/tests/benchmark/l3/test_agent.py +377 -0
- pretensor-0.1.0/tests/benchmark/l3/test_db.py +285 -0
- pretensor-0.1.0/tests/benchmark/l3/test_gold.py +102 -0
- pretensor-0.1.0/tests/benchmark/l3/test_llm_client.py +525 -0
- pretensor-0.1.0/tests/benchmark/l3/test_mcp_client.py +307 -0
- pretensor-0.1.0/tests/benchmark/l3/test_pretensor_runner.py +950 -0
- pretensor-0.1.0/tests/benchmark/l3/test_prompt.py +152 -0
- pretensor-0.1.0/tests/benchmark/l3/test_runner.py +597 -0
- pretensor-0.1.0/tests/benchmark/l3/test_sql_equivalence.py +210 -0
- pretensor-0.1.0/tests/benchmark/results/v0.1.0a3/README.md +15 -0
- pretensor-0.1.0/tests/benchmark/results/v0.1.0a3/adventureworks-l1.json +4183 -0
- pretensor-0.1.0/tests/benchmark/results/v0.1.0a3/adventureworks-l2.json +487 -0
- pretensor-0.1.0/tests/benchmark/results/v0.1.0a3/pagila-l1.json +91 -0
- pretensor-0.1.0/tests/benchmark/results/v0.1.0a3/pagila-l2.json +323 -0
- pretensor-0.1.0/tests/benchmark/results/v0.1.0a3/tpch-l1.json +79 -0
- pretensor-0.1.0/tests/benchmark/results/v0.1.0a3/tpch-l2.json +562 -0
- pretensor-0.1.0/tests/benchmark/results/v0.1.0a4/adventureworks-l1.json +4183 -0
- pretensor-0.1.0/tests/benchmark/results/v0.1.0a4/adventureworks-l2.json +487 -0
- pretensor-0.1.0/tests/benchmark/results/v0.1.0a4/pagila-l1.json +91 -0
- pretensor-0.1.0/tests/benchmark/results/v0.1.0a4/pagila-l2.json +323 -0
- pretensor-0.1.0/tests/benchmark/results/v0.1.0a4/tpch-l1.json +79 -0
- pretensor-0.1.0/tests/benchmark/results/v0.1.0a4/tpch-l2.json +562 -0
- pretensor-0.1.0/tests/benchmark/test_cli.py +456 -0
- pretensor-0.1.0/tests/benchmark/test_fixtures.py +126 -0
- pretensor-0.1.0/tests/benchmark/test_release_gate.py +538 -0
- pretensor-0.1.0/tests/benchmark/test_results.py +489 -0
- pretensor-0.1.0/tests/cli/conftest.py +20 -0
- pretensor-0.1.0/tests/cli/test_analyze_cli.py +248 -0
- pretensor-0.1.0/tests/cli/test_cli_error_handling.py +372 -0
- pretensor-0.1.0/tests/cli/test_config_file.py +757 -0
- pretensor-0.1.0/tests/cli/test_connections_cli.py +220 -0
- pretensor-0.1.0/tests/cli/test_dbt_enrichment_cli.py +142 -0
- pretensor-0.1.0/tests/cli/test_export_cli.py +330 -0
- pretensor-0.1.0/tests/cli/test_index_cli.py +507 -0
- pretensor-0.1.0/tests/cli/test_list_cli.py +155 -0
- pretensor-0.1.0/tests/cli/test_main_cli.py +139 -0
- pretensor-0.1.0/tests/cli/test_paths_cli.py +101 -0
- pretensor-0.1.0/tests/cli/test_plugin.py +144 -0
- pretensor-0.1.0/tests/cli/test_quickstart_cli.py +205 -0
- pretensor-0.1.0/tests/cli/test_reindex_cli.py +626 -0
- pretensor-0.1.0/tests/cli/test_semantic_cli.py +189 -0
- pretensor-0.1.0/tests/cli/test_serve_cli.py +192 -0
- pretensor-0.1.0/tests/cli/test_sync_grants_cli.py +211 -0
- pretensor-0.1.0/tests/cli/test_validate_cli.py +225 -0
- pretensor-0.1.0/tests/conftest.py +187 -0
- pretensor-0.1.0/tests/connectors/test_base_connector.py +74 -0
- pretensor-0.1.0/tests/connectors/test_bigquery.py +262 -0
- pretensor-0.1.0/tests/connectors/test_catalog_enrichment.py +189 -0
- pretensor-0.1.0/tests/connectors/test_dsn_parsing.py +460 -0
- pretensor-0.1.0/tests/connectors/test_lineage_sqlglot.py +98 -0
- pretensor-0.1.0/tests/connectors/test_mysql_connector.py +823 -0
- pretensor-0.1.0/tests/connectors/test_pg_array_parse.py +23 -0
- pretensor-0.1.0/tests/connectors/test_postgres_table_grants.py +197 -0
- pretensor-0.1.0/tests/connectors/test_postgres_views.py +145 -0
- pretensor-0.1.0/tests/connectors/test_registry_mysql_optional.py +35 -0
- pretensor-0.1.0/tests/connectors/test_registry_postgres_optional.py +45 -0
- pretensor-0.1.0/tests/connectors/test_registry_snowflake_optional.py +36 -0
- pretensor-0.1.0/tests/connectors/test_snowflake_connector.py +1394 -0
- pretensor-0.1.0/tests/connectors/test_snowflake_table_grants.py +187 -0
- pretensor-0.1.0/tests/contracts/__init__.py +4 -0
- pretensor-0.1.0/tests/contracts/test_combiner.py +182 -0
- pretensor-0.1.0/tests/contracts/test_consumer_node.py +77 -0
- pretensor-0.1.0/tests/contracts/test_pipeline_step.py +254 -0
- pretensor-0.1.0/tests/contracts/test_scorer.py +275 -0
- pretensor-0.1.0/tests/contracts/test_search_index.py +219 -0
- pretensor-0.1.0/tests/contracts/test_semantic_layer.py +225 -0
- pretensor-0.1.0/tests/core/test_builder.py +310 -0
- pretensor-0.1.0/tests/core/test_dsn_at_rest.py +113 -0
- pretensor-0.1.0/tests/core/test_graph_builder_lineage.py +65 -0
- pretensor-0.1.0/tests/core/test_lineage_store.py +103 -0
- pretensor-0.1.0/tests/core/test_models.py +44 -0
- pretensor-0.1.0/tests/core/test_portable_export.py +114 -0
- pretensor-0.1.0/tests/core/test_registry.py +52 -0
- pretensor-0.1.0/tests/core/test_schema.py +96 -0
- pretensor-0.1.0/tests/core/test_schema_external_consumer.py +38 -0
- pretensor-0.1.0/tests/core/test_semantic_schema.py +61 -0
- pretensor-0.1.0/tests/core/test_store_consumer_upserts.py +339 -0
- pretensor-0.1.0/tests/e2e/__init__.py +0 -0
- pretensor-0.1.0/tests/e2e/conftest.py +437 -0
- pretensor-0.1.0/tests/e2e/fixtures/__init__.py +0 -0
- pretensor-0.1.0/tests/e2e/fixtures/sql/adventureworks_ddl.sql +431 -0
- pretensor-0.1.0/tests/e2e/fixtures/sql/messy_warehouse_ddl.sql +300 -0
- pretensor-0.1.0/tests/e2e/fixtures/sql/sakila_mysql_ddl.sql +83 -0
- pretensor-0.1.0/tests/e2e/fixtures/sql/tpcds_ddl.sql +571 -0
- pretensor-0.1.0/tests/e2e/fixtures/sql/tpch_ddl.sql +111 -0
- pretensor-0.1.0/tests/e2e/test_adventureworks_smoke.py +45 -0
- pretensor-0.1.0/tests/e2e/test_adventureworks_traverse.py +118 -0
- pretensor-0.1.0/tests/e2e/test_dbt_warehouse_scale_enrichment.py +288 -0
- pretensor-0.1.0/tests/e2e/test_index_cycle.py +88 -0
- pretensor-0.1.0/tests/e2e/test_l3_baseline.py +161 -0
- pretensor-0.1.0/tests/e2e/test_l3_pretensor.py +302 -0
- pretensor-0.1.0/tests/e2e/test_mcp_tools.py +106 -0
- pretensor-0.1.0/tests/e2e/test_mysql_index_cycle.py +125 -0
- pretensor-0.1.0/tests/e2e/test_reindex.py +101 -0
- pretensor-0.1.0/tests/e2e/test_serve_smoke.py +46 -0
- pretensor-0.1.0/tests/e2e/test_tpcds_traverse.py +222 -0
- pretensor-0.1.0/tests/e2e/test_tpch_traverse.py +120 -0
- pretensor-0.1.0/tests/e2e/test_visibility.py +78 -0
- pretensor-0.1.0/tests/enrichment/__init__.py +0 -0
- pretensor-0.1.0/tests/enrichment/analyze/__init__.py +0 -0
- pretensor-0.1.0/tests/enrichment/analyze/fixtures/cross_connection.py +1 -0
- pretensor-0.1.0/tests/enrichment/analyze/fixtures/dml_writes.py +4 -0
- pretensor-0.1.0/tests/enrichment/analyze/fixtures/dynamic_only.py +5 -0
- pretensor-0.1.0/tests/enrichment/analyze/fixtures/fstring_prefix.py +2 -0
- pretensor-0.1.0/tests/enrichment/analyze/fixtures/noqa_optout.py +6 -0
- pretensor-0.1.0/tests/enrichment/analyze/fixtures/simple_select.py +1 -0
- pretensor-0.1.0/tests/enrichment/analyze/test_classify.py +100 -0
- pretensor-0.1.0/tests/enrichment/analyze/test_extract_python.py +174 -0
- pretensor-0.1.0/tests/enrichment/analyze/test_parse.py +185 -0
- pretensor-0.1.0/tests/enrichment/analyze/test_pipeline.py +287 -0
- pretensor-0.1.0/tests/enrichment/analyze/test_walker.py +113 -0
- pretensor-0.1.0/tests/enrichment/analyze/test_writers.py +334 -0
- pretensor-0.1.0/tests/enrichment/fixtures/dbt/manifest_v10.json +19 -0
- pretensor-0.1.0/tests/enrichment/fixtures/dbt/manifest_v9.json +55 -0
- pretensor-0.1.0/tests/enrichment/test_dbt_lineage.py +179 -0
- pretensor-0.1.0/tests/enrichment/test_dbt_manifest.py +106 -0
- pretensor-0.1.0/tests/enrichment/test_dbt_metadata.py +200 -0
- pretensor-0.1.0/tests/enrichment/test_dbt_pipeline.py +107 -0
- pretensor-0.1.0/tests/enrichment/test_dbt_signals.py +361 -0
- pretensor-0.1.0/tests/entities/test_classifier.py +69 -0
- pretensor-0.1.0/tests/entities/test_entity_builder.py +76 -0
- pretensor-0.1.0/tests/entities/test_llm_extract.py +69 -0
- pretensor-0.1.0/tests/entities/test_pagila_entities.py +67 -0
- pretensor-0.1.0/tests/fixtures/dbt/synthetic_warehouse/README.md +83 -0
- pretensor-0.1.0/tests/fixtures/dbt/synthetic_warehouse/__init__.py +16 -0
- pretensor-0.1.0/tests/fixtures/dbt/synthetic_warehouse/generator.py +405 -0
- pretensor-0.1.0/tests/fixtures/pairs/analytics_vs_saas.yaml +17 -0
- pretensor-0.1.0/tests/fixtures/pairs/tpch_vs_pagila.yaml +17 -0
- pretensor-0.1.0/tests/fixtures/pairs/tpch_vs_tpch_renamed.yaml +27 -0
- pretensor-0.1.0/tests/fixtures/schemas/README.md +133 -0
- pretensor-0.1.0/tests/fixtures/schemas/adventureworks.yaml +20694 -0
- pretensor-0.1.0/tests/fixtures/schemas/adversarial.yaml +372 -0
- pretensor-0.1.0/tests/fixtures/schemas/adversarial_roles.yaml +16 -0
- pretensor-0.1.0/tests/fixtures/schemas/analytics_dwh.yaml +574 -0
- pretensor-0.1.0/tests/fixtures/schemas/messy_warehouse.yaml +3872 -0
- pretensor-0.1.0/tests/fixtures/schemas/messy_warehouse_roles.yaml +43 -0
- pretensor-0.1.0/tests/fixtures/schemas/pagila.yaml +657 -0
- pretensor-0.1.0/tests/fixtures/schemas/pagila_extended.yaml +1459 -0
- pretensor-0.1.0/tests/fixtures/schemas/saas_multitenant.yaml +551 -0
- pretensor-0.1.0/tests/fixtures/schemas/tpch.yaml +776 -0
- pretensor-0.1.0/tests/integrations/__init__.py +0 -0
- pretensor-0.1.0/tests/integrations/test_base.py +217 -0
- pretensor-0.1.0/tests/integrations/test_google_adk.py +96 -0
- pretensor-0.1.0/tests/integrations/test_langchain.py +107 -0
- pretensor-0.1.0/tests/integrations/test_llamaindex.py +105 -0
- pretensor-0.1.0/tests/intelligence/slow/__init__.py +0 -0
- pretensor-0.1.0/tests/intelligence/slow/test_real_model_smoke.py +100 -0
- pretensor-0.1.0/tests/intelligence/test_cluster_labeler.py +461 -0
- pretensor-0.1.0/tests/intelligence/test_clustering.py +101 -0
- pretensor-0.1.0/tests/intelligence/test_clustering_embeddings.py +414 -0
- pretensor-0.1.0/tests/intelligence/test_discovery.py +407 -0
- pretensor-0.1.0/tests/intelligence/test_embedding_index_step.py +348 -0
- pretensor-0.1.0/tests/intelligence/test_embeddings.py +294 -0
- pretensor-0.1.0/tests/intelligence/test_extended_pagila.py +80 -0
- pretensor-0.1.0/tests/intelligence/test_heuristic.py +769 -0
- pretensor-0.1.0/tests/intelligence/test_intelligence.py +100 -0
- pretensor-0.1.0/tests/intelligence/test_join_paths.py +305 -0
- pretensor-0.1.0/tests/intelligence/test_llm_infer.py +85 -0
- pretensor-0.1.0/tests/intelligence/test_llm_runtime.py +50 -0
- pretensor-0.1.0/tests/intelligence/test_metric_templates.py +148 -0
- pretensor-0.1.0/tests/intelligence/test_null_path_parity.py +212 -0
- pretensor-0.1.0/tests/intelligence/test_pipeline.py +274 -0
- pretensor-0.1.0/tests/intelligence/test_role_exemplars.py +231 -0
- pretensor-0.1.0/tests/intelligence/test_schema_classification.py +68 -0
- pretensor-0.1.0/tests/intelligence/test_semantic_scorer.py +344 -0
- pretensor-0.1.0/tests/intelligence/test_shadow_alias.py +355 -0
- pretensor-0.1.0/tests/intelligence/test_statistical.py +78 -0
- pretensor-0.1.0/tests/mcp/test_compile_metric_tool.py +154 -0
- pretensor-0.1.0/tests/mcp/test_consumers_tool.py +152 -0
- pretensor-0.1.0/tests/mcp/test_context_dbt.py +136 -0
- pretensor-0.1.0/tests/mcp/test_context_lineage.py +119 -0
- pretensor-0.1.0/tests/mcp/test_context_similar.py +339 -0
- pretensor-0.1.0/tests/mcp/test_context_tool.py +53 -0
- pretensor-0.1.0/tests/mcp/test_cypher_readonly.py +170 -0
- pretensor-0.1.0/tests/mcp/test_cypher_timeout_pool.py +104 -0
- pretensor-0.1.0/tests/mcp/test_detect_changes_errors.py +138 -0
- pretensor-0.1.0/tests/mcp/test_error_ergonomics.py +389 -0
- pretensor-0.1.0/tests/mcp/test_error_handling.py +322 -0
- pretensor-0.1.0/tests/mcp/test_error_sanitization.py +127 -0
- pretensor-0.1.0/tests/mcp/test_impact_consumers.py +127 -0
- pretensor-0.1.0/tests/mcp/test_impact_hop.py +136 -0
- pretensor-0.1.0/tests/mcp/test_kill_switch.py +211 -0
- pretensor-0.1.0/tests/mcp/test_mcp_null_path_parity.py +233 -0
- pretensor-0.1.0/tests/mcp/test_query_hybrid.py +357 -0
- pretensor-0.1.0/tests/mcp/test_schema_tool.py +117 -0
- pretensor-0.1.0/tests/mcp/test_semantic_search.py +428 -0
- pretensor-0.1.0/tests/mcp/test_serve_stdio_smoke.py +133 -0
- pretensor-0.1.0/tests/mcp/test_service.py +812 -0
- pretensor-0.1.0/tests/mcp/test_tool_registry.py +198 -0
- pretensor-0.1.0/tests/mcp/test_traverse_ambiguous.py +173 -0
- pretensor-0.1.0/tests/mcp/test_traverse_dijkstra.py +520 -0
- pretensor-0.1.0/tests/mcp/test_traverse_pagila_shape.py +269 -0
- pretensor-0.1.0/tests/mcp/test_traverse_tiebreak.py +412 -0
- pretensor-0.1.0/tests/mcp/test_validate_sql_tool.py +125 -0
- pretensor-0.1.0/tests/mcp/test_visibility_mcp.py +281 -0
- pretensor-0.1.0/tests/query_helpers.py +26 -0
- pretensor-0.1.0/tests/scripts/__init__.py +0 -0
- pretensor-0.1.0/tests/scripts/test_check_no_internal_refs.py +138 -0
- pretensor-0.1.0/tests/search/test_search_index.py +310 -0
- pretensor-0.1.0/tests/semantic/__init__.py +0 -0
- pretensor-0.1.0/tests/semantic/test_compiler.py +341 -0
- pretensor-0.1.0/tests/semantic/test_semantic_layer.py +76 -0
- pretensor-0.1.0/tests/semantic/test_yaml_layer.py +229 -0
- pretensor-0.1.0/tests/staleness/test_staleness.py +159 -0
- pretensor-0.1.0/tests/test_errors.py +131 -0
- pretensor-0.1.0/tests/test_gitlint_config.py +94 -0
- pretensor-0.1.0/tests/test_graph_schema_manager.py +64 -0
- pretensor-0.1.0/tests/test_graph_store.py +86 -0
- pretensor-0.1.0/tests/test_observability.py +96 -0
- pretensor-0.1.0/tests/test_packaging.py +28 -0
- pretensor-0.1.0/tests/test_pretensor_config.py +379 -0
- pretensor-0.1.0/tests/test_query_runner.py +48 -0
- pretensor-0.1.0/tests/test_store_cache.py +185 -0
- pretensor-0.1.0/tests/utils/__init__.py +0 -0
- pretensor-0.1.0/tests/utils/score_tracker.py +99 -0
- pretensor-0.1.0/tests/validation/test_compile_did_you_mean.py +488 -0
- pretensor-0.1.0/tests/validation/test_query_validator.py +147 -0
- pretensor-0.1.0/tests/visibility/test_sync_grants.py +274 -0
- pretensor-0.1.0/tests/visibility/test_visibility_config.py +376 -0
- pretensor-0.1.0/uv.lock +4562 -0
|
File without changes
|
|
@@ -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/
|