groundworkers 0.3.3__tar.gz → 0.5.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.
- groundworkers-0.5.0/.githooks/pre-commit +36 -0
- groundworkers-0.5.0/.github/CONTRIBUTING.md +27 -0
- groundworkers-0.5.0/.github/ISSUE_TEMPLATE/bug_report.yml +66 -0
- groundworkers-0.5.0/.github/ISSUE_TEMPLATE/config.yml +5 -0
- groundworkers-0.5.0/.github/ISSUE_TEMPLATE/feature_request.yml +32 -0
- groundworkers-0.5.0/.github/ISSUE_TEMPLATE/not_working.yml +65 -0
- groundworkers-0.5.0/.github/PULL_REQUEST_TEMPLATE.md +9 -0
- groundworkers-0.5.0/.github/release-drafter.yml +31 -0
- groundworkers-0.5.0/.github/workflows/ci.yml +52 -0
- groundworkers-0.5.0/.github/workflows/docs.yml +10 -0
- groundworkers-0.5.0/.github/workflows/merge.yml +13 -0
- groundworkers-0.5.0/.github/workflows/publish.yml +21 -0
- groundworkers-0.5.0/.gitignore +22 -0
- groundworkers-0.5.0/.python-version +1 -0
- groundworkers-0.5.0/CHANGELOG.md +58 -0
- groundworkers-0.5.0/Makefile +23 -0
- groundworkers-0.5.0/PKG-INFO +133 -0
- groundworkers-0.5.0/README.md +75 -0
- groundworkers-0.5.0/config/docker-compose.yaml +40 -0
- groundworkers-0.5.0/config/groundworkers.example.toml +141 -0
- groundworkers-0.5.0/config/groundworkers_db.env +5 -0
- groundworkers-0.5.0/docs/adapters/cdm.md +53 -0
- groundworkers-0.5.0/docs/adapters/omop_emb.md +70 -0
- groundworkers-0.5.0/docs/adapters/omop_graph.md +67 -0
- groundworkers-0.5.0/docs/architecture.md +181 -0
- groundworkers-0.5.0/docs/concepts.md +98 -0
- groundworkers-0.5.0/docs/development/extending.md +121 -0
- groundworkers-0.5.0/docs/development/integration.md +132 -0
- groundworkers-0.5.0/docs/development/plugins.md +195 -0
- groundworkers-0.5.0/docs/from-scratch.md +134 -0
- groundworkers-0.5.0/docs/index.md +76 -0
- groundworkers-0.5.0/docs/js/mermaid-init.js +6 -0
- groundworkers-0.5.0/docs/reference/ref_adapters.md +17 -0
- groundworkers-0.5.0/docs/reference/ref_base.md +13 -0
- groundworkers-0.5.0/docs/reference/ref_config.md +3 -0
- groundworkers-0.5.0/docs/reference/ref_services.md +61 -0
- groundworkers-0.5.0/docs/reference/ref_tools.md +41 -0
- groundworkers-0.5.0/docs/services/domain.md +106 -0
- groundworkers-0.5.0/docs/services/graph.md +57 -0
- groundworkers-0.5.0/docs/services/grounding.md +51 -0
- groundworkers-0.5.0/docs/services/mapping.md +106 -0
- groundworkers-0.5.0/docs/services/semantic_projection.md +153 -0
- groundworkers-0.5.0/docs/services/source_planning.md +39 -0
- groundworkers-0.5.0/docs/services/text.md +165 -0
- groundworkers-0.5.0/docs/services/vocab.md +168 -0
- groundworkers-0.5.0/docs/static/01_create_config.png +0 -0
- groundworkers-0.5.0/docs/static/02_empty_config.png +0 -0
- groundworkers-0.5.0/docs/static/03_config_wizard.png +0 -0
- groundworkers-0.5.0/docs/static/04_test_cnx.png +0 -0
- groundworkers-0.5.0/docs/static/04_warnings.png +0 -0
- groundworkers-0.5.0/docs/static/05_graph_setup.png +0 -0
- groundworkers-0.5.0/docs/static/06_load_predicates.png +0 -0
- groundworkers-0.5.0/docs/static/07_vector_store.png +0 -0
- groundworkers-0.5.0/docs/static/08_register_embedding.png +0 -0
- groundworkers-0.5.0/docs/static/10_setup_complete.png +0 -0
- groundworkers-0.5.0/docs/tools/concept.md +318 -0
- groundworkers-0.5.0/docs/tools/domain.md +81 -0
- groundworkers-0.5.0/docs/tools/embedding.md +113 -0
- groundworkers-0.5.0/docs/tools/knowledge.md +46 -0
- groundworkers-0.5.0/docs/tools/mapping.md +220 -0
- groundworkers-0.5.0/docs/tools/overview.md +54 -0
- groundworkers-0.5.0/docs/tools/resolver.md +73 -0
- groundworkers-0.5.0/docs/tools/search.md +156 -0
- groundworkers-0.5.0/docs/tools/semantic_projection.md +127 -0
- groundworkers-0.5.0/docs/tools/source_planning.md +48 -0
- groundworkers-0.5.0/docs/tools/system.md +68 -0
- groundworkers-0.5.0/docs/tools/text.md +104 -0
- groundworkers-0.5.0/docs/usage/configuration.md +345 -0
- groundworkers-0.5.0/docs/usage/installation.md +119 -0
- groundworkers-0.5.0/docs/usage/integrations.md +138 -0
- groundworkers-0.5.0/docs/usage/setup_journey.md +17 -0
- groundworkers-0.5.0/docs/usage/testing.md +34 -0
- groundworkers-0.5.0/mkdocs.yaml +103 -0
- {groundworkers-0.3.3 → groundworkers-0.5.0}/pyproject.toml +45 -20
- groundworkers-0.5.0/src/groundworkers/__init__.py +10 -0
- groundworkers-0.5.0/src/groundworkers/_env.py +108 -0
- groundworkers-0.5.0/src/groundworkers/adapters/llm.py +298 -0
- groundworkers-0.5.0/src/groundworkers/adapters/omop_emb.py +563 -0
- {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/adapters/omop_graph.py +283 -96
- groundworkers-0.5.0/src/groundworkers/app.py +355 -0
- groundworkers-0.5.0/src/groundworkers/application/__init__.py +1 -0
- groundworkers-0.5.0/src/groundworkers/application/setup/__init__.py +6 -0
- groundworkers-0.5.0/src/groundworkers/application/setup/configuration.py +229 -0
- groundworkers-0.5.0/src/groundworkers/application/setup/configuration_provider.py +2045 -0
- groundworkers-0.5.0/src/groundworkers/application/setup/databases.py +940 -0
- groundworkers-0.5.0/src/groundworkers/application/setup/embedding_artifacts.py +145 -0
- groundworkers-0.5.0/src/groundworkers/application/setup/embedding_capability.py +125 -0
- groundworkers-0.5.0/src/groundworkers/application/setup/embedding_coverage.py +118 -0
- groundworkers-0.5.0/src/groundworkers/application/setup/embedding_population.py +291 -0
- groundworkers-0.5.0/src/groundworkers/application/setup/embedding_reconciliation.py +101 -0
- groundworkers-0.5.0/src/groundworkers/application/setup/embedding_registry.py +91 -0
- groundworkers-0.5.0/src/groundworkers/application/setup/embedding_setup.py +522 -0
- groundworkers-0.5.0/src/groundworkers/application/setup/graph_maintenance.py +215 -0
- groundworkers-0.5.0/src/groundworkers/application/setup/integration.py +44 -0
- groundworkers-0.5.0/src/groundworkers/application/setup/maintenance_runs.py +926 -0
- groundworkers-0.5.0/src/groundworkers/application/setup/model_inventory.py +83 -0
- groundworkers-0.5.0/src/groundworkers/application/setup/models.py +460 -0
- groundworkers-0.5.0/src/groundworkers/application/setup/performance_maintenance.py +151 -0
- groundworkers-0.5.0/src/groundworkers/application/setup/plugin_configuration.py +861 -0
- groundworkers-0.5.0/src/groundworkers/application/setup/runtime_setup.py +501 -0
- groundworkers-0.5.0/src/groundworkers/base/__init__.py +25 -0
- groundworkers-0.5.0/src/groundworkers/base/concept_payload.py +160 -0
- groundworkers-0.5.0/src/groundworkers/base/domain_names.py +78 -0
- groundworkers-0.5.0/src/groundworkers/base/errors.py +86 -0
- groundworkers-0.5.0/src/groundworkers/base/results.py +64 -0
- groundworkers-0.5.0/src/groundworkers/base/server.py +336 -0
- groundworkers-0.5.0/src/groundworkers/base/sql.py +30 -0
- groundworkers-0.5.0/src/groundworkers/bootstrap.py +97 -0
- groundworkers-0.5.0/src/groundworkers/config/README +6 -0
- groundworkers-0.5.0/src/groundworkers/config/predicate_classification.csv +26 -0
- groundworkers-0.5.0/src/groundworkers/config/predicate_mapping.csv +735 -0
- groundworkers-0.5.0/src/groundworkers/config.py +316 -0
- groundworkers-0.5.0/src/groundworkers/plugins.py +336 -0
- groundworkers-0.5.0/src/groundworkers/server.py +325 -0
- {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/services/domain.py +37 -8
- {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/services/graph.py +170 -51
- groundworkers-0.5.0/src/groundworkers/services/grounding.py +250 -0
- {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/services/knowledge/catalogue.py +2 -1
- {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/services/knowledge/models.py +0 -1
- {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/services/mapping.py +156 -18
- groundworkers-0.5.0/src/groundworkers/services/semantic_projection/__init__.py +25 -0
- groundworkers-0.5.0/src/groundworkers/services/semantic_projection/definitions.py +319 -0
- groundworkers-0.5.0/src/groundworkers/services/semantic_projection/models.py +80 -0
- groundworkers-0.5.0/src/groundworkers/services/semantic_projection/service.py +147 -0
- {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/services/source_planning/__init__.py +18 -15
- {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/services/source_planning/assisted.py +30 -4
- {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/services/source_planning/classifier.py +11 -8
- {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/services/source_planning/decomposers/csv_.py +4 -2
- {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/services/source_planning/decomposers/docx_.py +5 -2
- {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/services/source_planning/models.py +13 -3
- {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/services/source_planning/normalisation.py +4 -3
- {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/services/source_planning/service.py +55 -4
- {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/services/source_planning/source_profiles/__init__.py +10 -4
- {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/services/source_planning/source_profiles/redcap.py +3 -1
- {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/services/source_planning/source_profiles/registry.py +6 -2
- {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/services/text/prompts.py +0 -1
- {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/services/text/service.py +83 -1
- {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/services/vocab.py +250 -134
- {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/tools/concept_tools.py +8 -30
- {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/tools/domain_tools.py +7 -6
- {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/tools/embedding_tools.py +46 -15
- {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/tools/knowledge_tools.py +8 -8
- {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/tools/mapping_tools.py +8 -24
- {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/tools/resolver_tools.py +34 -19
- {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/tools/search_tools.py +3 -9
- groundworkers-0.5.0/src/groundworkers/tools/semantic_projection_tools.py +78 -0
- {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/tools/source_planning_tools.py +5 -10
- {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/tools/system_tools.py +114 -19
- {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/tools/text_tools.py +30 -26
- {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/transports/rest/api.py +28 -4
- {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/transports/rest/models.py +2 -2
- groundworkers-0.5.0/src/groundworkers/tui/__init__.py +5 -0
- groundworkers-0.5.0/src/groundworkers/tui/app.py +208 -0
- groundworkers-0.5.0/src/groundworkers/tui/pages/__init__.py +7 -0
- groundworkers-0.5.0/src/groundworkers/tui/pages/base.py +52 -0
- groundworkers-0.5.0/src/groundworkers/tui/pages/plugin_config.py +211 -0
- groundworkers-0.5.0/src/groundworkers/tui/pages/plugin_setup.py +34 -0
- groundworkers-0.5.0/src/groundworkers/tui/pages/setup.py +1030 -0
- groundworkers-0.5.0/src/groundworkers/tui/presenters/__init__.py +1 -0
- groundworkers-0.5.0/src/groundworkers/tui/presenters/base.py +59 -0
- groundworkers-0.5.0/src/groundworkers/tui/presenters/chat.py +45 -0
- groundworkers-0.5.0/src/groundworkers/tui/presenters/configuration.py +57 -0
- groundworkers-0.5.0/src/groundworkers/tui/presenters/database.py +284 -0
- groundworkers-0.5.0/src/groundworkers/tui/presenters/embeddings.py +606 -0
- groundworkers-0.5.0/src/groundworkers/tui/presenters/graph.py +116 -0
- groundworkers-0.5.0/src/groundworkers/tui/presenters/llm_provider.py +298 -0
- groundworkers-0.5.0/src/groundworkers/tui/presenters/overview.py +131 -0
- groundworkers-0.5.0/src/groundworkers/tui/presenters/performance.py +173 -0
- groundworkers-0.5.0/src/groundworkers/tui/presenters/runs.py +107 -0
- groundworkers-0.5.0/src/groundworkers/tui/routes.py +9 -0
- groundworkers-0.5.0/src/groundworkers/tui/state.py +80 -0
- groundworkers-0.5.0/src/groundworkers/tui/wizards/__init__.py +1 -0
- groundworkers-0.5.0/src/groundworkers/tui/wizards/config_location.py +235 -0
- groundworkers-0.5.0/src/groundworkers/tui/wizards/embedding_store.py +96 -0
- groundworkers-0.5.0/src/groundworkers/tui/wizards/embeddings.py +502 -0
- groundworkers-0.5.0/src/groundworkers/tui/wizards/graph_maintenance.py +396 -0
- groundworkers-0.5.0/src/groundworkers/tui/wizards/performance_maintenance.py +221 -0
- groundworkers-0.5.0/src/groundworkers/tui/wizards/plugin_setup.py +164 -0
- groundworkers-0.5.0/tests/__init__.py +0 -0
- groundworkers-0.5.0/tests/conftest.py +33 -0
- groundworkers-0.5.0/tests/integration/__init__.py +0 -0
- groundworkers-0.5.0/tests/integration/test_omop_emb_adapter.py +105 -0
- groundworkers-0.5.0/tests/integration/test_omop_graph_adapter.py +435 -0
- groundworkers-0.5.0/tests/support/__init__.py +13 -0
- groundworkers-0.5.0/tests/support/postgres_ci_config.toml +5 -0
- groundworkers-0.5.0/tests/support/seed_postgres_fixture.py +339 -0
- groundworkers-0.5.0/tests/support/stack_config.py +170 -0
- groundworkers-0.5.0/tests/test_bootstrap_config.py +276 -0
- {groundworkers-0.3.3 → groundworkers-0.5.0}/tests/test_rest_api.py +56 -13
- groundworkers-0.5.0/tests/test_server_registry.py +563 -0
- groundworkers-0.5.0/tests/unit/__init__.py +0 -0
- groundworkers-0.5.0/tests/unit/test_concept_payload.py +162 -0
- groundworkers-0.5.0/tests/unit/test_concept_tools.py +748 -0
- groundworkers-0.5.0/tests/unit/test_config_location_wizard.py +344 -0
- groundworkers-0.5.0/tests/unit/test_configuration_provider.py +617 -0
- groundworkers-0.5.0/tests/unit/test_domain_names.py +102 -0
- groundworkers-0.5.0/tests/unit/test_domain_tools.py +118 -0
- groundworkers-0.5.0/tests/unit/test_embedding_population_scope.py +211 -0
- groundworkers-0.5.0/tests/unit/test_embedding_reconciliation.py +307 -0
- groundworkers-0.5.0/tests/unit/test_embedding_registry_step.py +159 -0
- groundworkers-0.5.0/tests/unit/test_embedding_tools.py +291 -0
- groundworkers-0.5.0/tests/unit/test_env_bootstrap.py +180 -0
- groundworkers-0.5.0/tests/unit/test_error_boundary.py +50 -0
- groundworkers-0.5.0/tests/unit/test_graph_maintenance.py +194 -0
- groundworkers-0.5.0/tests/unit/test_graph_maintenance_wizard.py +282 -0
- groundworkers-0.5.0/tests/unit/test_graph_service.py +59 -0
- groundworkers-0.5.0/tests/unit/test_graph_status.py +118 -0
- groundworkers-0.5.0/tests/unit/test_grounding_constraints.py +515 -0
- groundworkers-0.5.0/tests/unit/test_grounding_service.py +198 -0
- groundworkers-0.5.0/tests/unit/test_knowledge_catalogue.py +219 -0
- groundworkers-0.5.0/tests/unit/test_llm_adapter.py +263 -0
- groundworkers-0.5.0/tests/unit/test_maintenance_runs_phase2.py +347 -0
- groundworkers-0.5.0/tests/unit/test_mapping_service.py +726 -0
- groundworkers-0.5.0/tests/unit/test_mapping_tools.py +142 -0
- groundworkers-0.5.0/tests/unit/test_migration_boundaries.py +155 -0
- groundworkers-0.5.0/tests/unit/test_omop_emb_adapter.py +446 -0
- groundworkers-0.5.0/tests/unit/test_omop_emb_setup_config.py +163 -0
- groundworkers-0.5.0/tests/unit/test_omop_graph_adapter.py +236 -0
- groundworkers-0.5.0/tests/unit/test_performance.py +65 -0
- groundworkers-0.5.0/tests/unit/test_phase3_overview.py +66 -0
- groundworkers-0.5.0/tests/unit/test_plugin_configuration.py +206 -0
- groundworkers-0.5.0/tests/unit/test_plugins.py +238 -0
- groundworkers-0.5.0/tests/unit/test_provider_fields.py +66 -0
- groundworkers-0.5.0/tests/unit/test_schema_resolution.py +251 -0
- groundworkers-0.5.0/tests/unit/test_semantic_projection_service.py +333 -0
- groundworkers-0.5.0/tests/unit/test_semantic_projection_tools.py +119 -0
- groundworkers-0.5.0/tests/unit/test_setup_artifacts_and_coverage.py +134 -0
- groundworkers-0.5.0/tests/unit/test_setup_configuration.py +175 -0
- groundworkers-0.5.0/tests/unit/test_setup_configuration_section.py +68 -0
- groundworkers-0.5.0/tests/unit/test_setup_databases.py +471 -0
- groundworkers-0.5.0/tests/unit/test_setup_embeddings.py +545 -0
- groundworkers-0.5.0/tests/unit/test_setup_provider_conformance.py +197 -0
- groundworkers-0.5.0/tests/unit/test_setup_runtime.py +399 -0
- groundworkers-0.5.0/tests/unit/test_setup_truth.py +185 -0
- groundworkers-0.5.0/tests/unit/test_setup_write_flows.py +498 -0
- groundworkers-0.5.0/tests/unit/test_source_planning_classifier.py +205 -0
- groundworkers-0.5.0/tests/unit/test_source_planning_decomposer.py +134 -0
- groundworkers-0.5.0/tests/unit/test_source_planning_detector.py +46 -0
- groundworkers-0.5.0/tests/unit/test_source_planning_models.py +141 -0
- groundworkers-0.5.0/tests/unit/test_source_planning_normalisation.py +128 -0
- groundworkers-0.5.0/tests/unit/test_source_planning_router.py +277 -0
- groundworkers-0.5.0/tests/unit/test_source_planning_service.py +403 -0
- groundworkers-0.5.0/tests/unit/test_source_planning_tools.py +87 -0
- groundworkers-0.5.0/tests/unit/test_stack_config_fixtures.py +55 -0
- groundworkers-0.5.0/tests/unit/test_system_tools.py +412 -0
- groundworkers-0.5.0/tests/unit/test_text_service.py +262 -0
- groundworkers-0.5.0/tests/unit/test_text_tools.py +399 -0
- groundworkers-0.5.0/tests/unit/test_tui_app.py +938 -0
- groundworkers-0.5.0/tests/unit/test_tui_state.py +475 -0
- groundworkers-0.5.0/tests/unit/test_vector_store_setup.py +208 -0
- groundworkers-0.5.0/tests/unit/test_vocab_service.py +148 -0
- groundworkers-0.5.0/uv.lock +4825 -0
- groundworkers-0.3.3/PKG-INFO +0 -179
- groundworkers-0.3.3/README.md +0 -133
- groundworkers-0.3.3/setup.cfg +0 -4
- groundworkers-0.3.3/src/groundworkers/__init__.py +0 -3
- groundworkers-0.3.3/src/groundworkers/adapters/llm.py +0 -177
- groundworkers-0.3.3/src/groundworkers/adapters/omop_emb.py +0 -304
- groundworkers-0.3.3/src/groundworkers/app.py +0 -213
- groundworkers-0.3.3/src/groundworkers/base/__init__.py +0 -14
- groundworkers-0.3.3/src/groundworkers/base/errors.py +0 -22
- groundworkers-0.3.3/src/groundworkers/base/results.py +0 -38
- groundworkers-0.3.3/src/groundworkers/base/server.py +0 -125
- groundworkers-0.3.3/src/groundworkers/bootstrap.py +0 -120
- groundworkers-0.3.3/src/groundworkers/config.py +0 -276
- groundworkers-0.3.3/src/groundworkers/server.py +0 -133
- groundworkers-0.3.3/src/groundworkers/services/grounding.py +0 -118
- groundworkers-0.3.3/src/groundworkers.egg-info/PKG-INFO +0 -179
- groundworkers-0.3.3/src/groundworkers.egg-info/SOURCES.txt +0 -93
- groundworkers-0.3.3/src/groundworkers.egg-info/dependency_links.txt +0 -1
- groundworkers-0.3.3/src/groundworkers.egg-info/entry_points.txt +0 -5
- groundworkers-0.3.3/src/groundworkers.egg-info/requires.txt +0 -47
- groundworkers-0.3.3/src/groundworkers.egg-info/top_level.txt +0 -1
- groundworkers-0.3.3/tests/test_bootstrap_config.py +0 -151
- groundworkers-0.3.3/tests/test_server_registry.py +0 -419
- {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/adapters/__init__.py +0 -0
- {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/adapters/cdm.py +0 -0
- {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/knowledge/packs/core/criteria-gate-yesno/guidance.md +0 -0
- {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/knowledge/packs/core/criteria-gate-yesno/manifest.yaml +0 -0
- {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/knowledge/packs/core/diagnosis-role-modifier/guidance.md +0 -0
- {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/knowledge/packs/core/diagnosis-role-modifier/manifest.yaml +0 -0
- {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/knowledge/packs/core/domain-routing/guidance.md +0 -0
- {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/knowledge/packs/core/domain-routing/manifest.yaml +0 -0
- {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/knowledge/packs/core/domain-routing/rules.yaml +0 -0
- {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/knowledge/packs/core/drug-concept-granularity/guidance.md +0 -0
- {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/knowledge/packs/core/drug-concept-granularity/manifest.yaml +0 -0
- {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/knowledge/packs/core/drug-concept-granularity/rules.yaml +0 -0
- {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/knowledge/packs/core/history-of-event/guidance.md +0 -0
- {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/knowledge/packs/core/history-of-event/manifest.yaml +0 -0
- {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/knowledge/packs/core/standard-concept-preference/guidance.md +0 -0
- {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/knowledge/packs/core/standard-concept-preference/manifest.yaml +0 -0
- {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/knowledge/packs/core/standard-concept-preference/rules.yaml +0 -0
- {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/services/__init__.py +0 -0
- {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/services/knowledge/__init__.py +0 -0
- {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/services/source_planning/canonical_headers.py +0 -0
- {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/services/source_planning/decomposer.py +0 -0
- {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/services/source_planning/decomposers/__init__.py +0 -0
- {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/services/source_planning/decomposers/ddl_.py +0 -0
- {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/services/source_planning/decomposers/json_.py +0 -0
- {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/services/source_planning/decomposers/pdf_.py +0 -0
- {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/services/source_planning/decomposers/xlsx_.py +0 -0
- {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/services/source_planning/decomposers/xml_.py +0 -0
- {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/services/source_planning/detector.py +0 -0
- {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/services/source_planning/provenance.py +0 -0
- {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/services/source_planning/router.py +0 -0
- {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/services/source_planning/serialisation.py +0 -0
- {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/services/source_planning/source_profiles/base.py +0 -0
- {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/services/source_planning/warnings.py +0 -0
- {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/services/text/__init__.py +1 -1
- {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/services/text/models.py +0 -0
- {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/tools/__init__.py +0 -0
- {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/transports/__init__.py +0 -0
- {groundworkers-0.3.3 → groundworkers-0.5.0}/src/groundworkers/transports/rest/__init__.py +0 -0
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Canonical CAVA pre-commit hook: keeps uv.lock in sync with pyproject.toml.
|
|
3
|
+
#
|
|
4
|
+
# If pyproject.toml is staged, finds the specific dependency line(s) that
|
|
5
|
+
# changed (added, removed, or had their version spec edited) and refreshes
|
|
6
|
+
# only those packages in uv.lock via `uv lock --upgrade-package`. Does not
|
|
7
|
+
# touch any other package -- this is a targeted sync, not a blanket
|
|
8
|
+
# `uv lock`, so it never pulls in an unrelated upstream release.
|
|
9
|
+
set -euo pipefail
|
|
10
|
+
|
|
11
|
+
if ! git diff --cached --name-only | grep -q '^pyproject\.toml$'; then
|
|
12
|
+
exit 0
|
|
13
|
+
fi
|
|
14
|
+
|
|
15
|
+
if ! command -v uv >/dev/null 2>&1; then
|
|
16
|
+
echo "pre-commit: uv not found on PATH, skipping uv.lock sync" >&2
|
|
17
|
+
exit 0
|
|
18
|
+
fi
|
|
19
|
+
|
|
20
|
+
changed_names=$(git diff --cached -- pyproject.toml \
|
|
21
|
+
| sed -nE 's/^[+-][[:space:]]*"([A-Za-z0-9][A-Za-z0-9._-]*).*/\1/p' \
|
|
22
|
+
| sort -u)
|
|
23
|
+
|
|
24
|
+
if [ -z "$changed_names" ]; then
|
|
25
|
+
exit 0
|
|
26
|
+
fi
|
|
27
|
+
|
|
28
|
+
upgrade_args=()
|
|
29
|
+
while IFS= read -r name; do
|
|
30
|
+
upgrade_args+=(--upgrade-package "$name")
|
|
31
|
+
done <<< "$changed_names"
|
|
32
|
+
|
|
33
|
+
echo "pre-commit: syncing uv.lock for changed dependencies:"
|
|
34
|
+
echo "$changed_names" | sed 's/^/ - /'
|
|
35
|
+
uv lock "${upgrade_args[@]}"
|
|
36
|
+
git add uv.lock
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# Contributing
|
|
2
|
+
|
|
3
|
+
## Development setup
|
|
4
|
+
|
|
5
|
+
```bash
|
|
6
|
+
uv sync --all-extras --dev
|
|
7
|
+
uv run pytest -q
|
|
8
|
+
uv run ruff check .
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Opening a pull request
|
|
12
|
+
|
|
13
|
+
1. Apply **exactly one** label before merging:
|
|
14
|
+
|
|
15
|
+
| Label | When to use |
|
|
16
|
+
|---|---|
|
|
17
|
+
| `breaking` | Public API change, backward-incompatible |
|
|
18
|
+
| `feature` | New functionality, backward-compatible |
|
|
19
|
+
| `fix` | Bug fix |
|
|
20
|
+
| `dependencies` | Dependency version update |
|
|
21
|
+
| `chore` | CI changes, refactoring, test additions, docs — anything that does not affect the public-facing package. Bypasses the label gate; excluded from the changelog and does not bump the version. |
|
|
22
|
+
|
|
23
|
+
2. When merging (squash), write a clear extended description in the merge dialog. That text — not the PR's opening description — becomes the changelog entry for this change. Leave it blank for `chore` PRs.
|
|
24
|
+
|
|
25
|
+
## Versioning and releases
|
|
26
|
+
|
|
27
|
+
Versions are derived from git tags; there is no version string in any source file. Releases are triggered by a maintainer publishing the standing draft release on the repository's Releases page. There is no automated commit-back to `main`.
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
name: "🐞 Bug Report"
|
|
2
|
+
description: Report a reproducible bug.
|
|
3
|
+
type: "Bug"
|
|
4
|
+
body:
|
|
5
|
+
- type: checkboxes
|
|
6
|
+
attributes:
|
|
7
|
+
label: Pre-flight
|
|
8
|
+
options:
|
|
9
|
+
- label: I searched existing issues and this is not a duplicate.
|
|
10
|
+
required: true
|
|
11
|
+
|
|
12
|
+
- type: textarea
|
|
13
|
+
id: summary
|
|
14
|
+
attributes:
|
|
15
|
+
label: Summary
|
|
16
|
+
description: One or two sentences describing the bug.
|
|
17
|
+
validations:
|
|
18
|
+
required: true
|
|
19
|
+
|
|
20
|
+
- type: textarea
|
|
21
|
+
id: reproduction
|
|
22
|
+
attributes:
|
|
23
|
+
label: Reproduction
|
|
24
|
+
description: Steps and/or a minimal code example that reproduces the issue. Wrap code in triple backticks.
|
|
25
|
+
placeholder: |
|
|
26
|
+
1. Import X and call Y with Z
|
|
27
|
+
2. Observe error
|
|
28
|
+
|
|
29
|
+
```python
|
|
30
|
+
# minimal example
|
|
31
|
+
```
|
|
32
|
+
validations:
|
|
33
|
+
required: true
|
|
34
|
+
|
|
35
|
+
- type: textarea
|
|
36
|
+
id: actual
|
|
37
|
+
attributes:
|
|
38
|
+
label: Actual behaviour
|
|
39
|
+
validations:
|
|
40
|
+
required: true
|
|
41
|
+
|
|
42
|
+
- type: textarea
|
|
43
|
+
id: expected
|
|
44
|
+
attributes:
|
|
45
|
+
label: Expected behaviour
|
|
46
|
+
validations:
|
|
47
|
+
required: true
|
|
48
|
+
|
|
49
|
+
- type: textarea
|
|
50
|
+
id: logs
|
|
51
|
+
attributes:
|
|
52
|
+
label: Error output
|
|
53
|
+
description: Full traceback if applicable. Formatted automatically.
|
|
54
|
+
render: python-traceback
|
|
55
|
+
|
|
56
|
+
- type: textarea
|
|
57
|
+
id: system
|
|
58
|
+
attributes:
|
|
59
|
+
label: System info
|
|
60
|
+
description: |
|
|
61
|
+
Run this in your environment and paste the output:
|
|
62
|
+
|
|
63
|
+
```shell
|
|
64
|
+
python <(curl -s https://raw.githubusercontent.com/AustralianCancerDataNetwork/cava-devops/main/scripts/cava_system_info.py)
|
|
65
|
+
```
|
|
66
|
+
render: shell
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
name: "🚀 Feature Request"
|
|
2
|
+
description: Propose a new feature or enhancement.
|
|
3
|
+
type: "Feature"
|
|
4
|
+
body:
|
|
5
|
+
- type: checkboxes
|
|
6
|
+
attributes:
|
|
7
|
+
label: Pre-flight
|
|
8
|
+
options:
|
|
9
|
+
- label: I searched existing issues and this has not been requested before.
|
|
10
|
+
required: true
|
|
11
|
+
|
|
12
|
+
- type: textarea
|
|
13
|
+
id: problem
|
|
14
|
+
attributes:
|
|
15
|
+
label: Problem or motivation
|
|
16
|
+
description: What are you trying to do that you currently cannot?
|
|
17
|
+
validations:
|
|
18
|
+
required: true
|
|
19
|
+
|
|
20
|
+
- type: textarea
|
|
21
|
+
id: proposal
|
|
22
|
+
attributes:
|
|
23
|
+
label: Proposed solution
|
|
24
|
+
description: How would you like this to work?
|
|
25
|
+
validations:
|
|
26
|
+
required: true
|
|
27
|
+
|
|
28
|
+
- type: textarea
|
|
29
|
+
id: alternatives
|
|
30
|
+
attributes:
|
|
31
|
+
label: Alternatives considered
|
|
32
|
+
description: Other approaches you considered and why you ruled them out.
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
name: "❗ Something is not working"
|
|
2
|
+
description: Something behaves unexpectedly but you are not sure if it is a bug.
|
|
3
|
+
body:
|
|
4
|
+
- type: checkboxes
|
|
5
|
+
attributes:
|
|
6
|
+
label: Pre-flight
|
|
7
|
+
options:
|
|
8
|
+
- label: I searched existing issues for this problem.
|
|
9
|
+
required: true
|
|
10
|
+
|
|
11
|
+
- type: textarea
|
|
12
|
+
id: summary
|
|
13
|
+
attributes:
|
|
14
|
+
label: Problem summary
|
|
15
|
+
description: 1-2 sentences describing what is not working.
|
|
16
|
+
validations:
|
|
17
|
+
required: true
|
|
18
|
+
|
|
19
|
+
- type: textarea
|
|
20
|
+
id: reproduction
|
|
21
|
+
attributes:
|
|
22
|
+
label: Reproduction
|
|
23
|
+
description: Steps and/or a minimal code example. Wrap code in triple backticks.
|
|
24
|
+
placeholder: |
|
|
25
|
+
1. Import X and call Y with Z
|
|
26
|
+
2. Observe unexpected behaviour
|
|
27
|
+
|
|
28
|
+
```python
|
|
29
|
+
# minimal example
|
|
30
|
+
```
|
|
31
|
+
validations:
|
|
32
|
+
required: true
|
|
33
|
+
|
|
34
|
+
- type: textarea
|
|
35
|
+
id: actual
|
|
36
|
+
attributes:
|
|
37
|
+
label: Actual outcome
|
|
38
|
+
validations:
|
|
39
|
+
required: true
|
|
40
|
+
|
|
41
|
+
- type: textarea
|
|
42
|
+
id: expected
|
|
43
|
+
attributes:
|
|
44
|
+
label: Expected outcome
|
|
45
|
+
validations:
|
|
46
|
+
required: true
|
|
47
|
+
|
|
48
|
+
- type: textarea
|
|
49
|
+
id: logs
|
|
50
|
+
attributes:
|
|
51
|
+
label: Error messages
|
|
52
|
+
description: Full traceback if applicable. Formatted automatically.
|
|
53
|
+
render: python-traceback
|
|
54
|
+
|
|
55
|
+
- type: textarea
|
|
56
|
+
id: system
|
|
57
|
+
attributes:
|
|
58
|
+
label: System info
|
|
59
|
+
description: |
|
|
60
|
+
Run this in your environment and paste the output:
|
|
61
|
+
|
|
62
|
+
```shell
|
|
63
|
+
python <(curl -s https://raw.githubusercontent.com/AustralianCancerDataNetwork/cava-devops/main/scripts/cava_system_info.py)
|
|
64
|
+
```
|
|
65
|
+
render: shell
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
## Summary
|
|
2
|
+
|
|
3
|
+
<!-- What does this PR do? This text becomes the changelog entry — write it for a reader who will see it months from now, not for the reviewer reading the diff. Leave blank for chore PRs. -->
|
|
4
|
+
|
|
5
|
+
## Checklist
|
|
6
|
+
|
|
7
|
+
- [ ] Applied exactly one label (`breaking`, `feature`, `fix`, `dependencies`, or `chore`)
|
|
8
|
+
- [ ] Tests pass locally (`uv run pytest -q`)
|
|
9
|
+
- [ ] Lint passes (`uv run ruff check .`)
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
name-template: 'v$RESOLVED_VERSION'
|
|
2
|
+
tag-template: 'v$RESOLVED_VERSION'
|
|
3
|
+
commitish: main
|
|
4
|
+
|
|
5
|
+
categories:
|
|
6
|
+
- title: Breaking Changes
|
|
7
|
+
labels: ['breaking']
|
|
8
|
+
- title: Features
|
|
9
|
+
labels: ['feature']
|
|
10
|
+
- title: Fixes
|
|
11
|
+
labels: ['fix']
|
|
12
|
+
- title: Dependencies
|
|
13
|
+
labels: ['dependencies']
|
|
14
|
+
|
|
15
|
+
template: |
|
|
16
|
+
$CHANGES
|
|
17
|
+
|
|
18
|
+
change-template: '- **$TITLE** (#$NUMBER) @$AUTHOR'
|
|
19
|
+
|
|
20
|
+
version-resolver:
|
|
21
|
+
major:
|
|
22
|
+
labels: ['breaking']
|
|
23
|
+
minor:
|
|
24
|
+
labels: ['feature']
|
|
25
|
+
patch:
|
|
26
|
+
labels: ['fix', 'dependencies']
|
|
27
|
+
default: patch
|
|
28
|
+
|
|
29
|
+
exclude-labels: ['chore']
|
|
30
|
+
|
|
31
|
+
autolabeler: []
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
on:
|
|
3
|
+
pull_request:
|
|
4
|
+
branches: [main]
|
|
5
|
+
types: [opened, synchronize, reopened, labeled, unlabeled]
|
|
6
|
+
jobs:
|
|
7
|
+
label-gate:
|
|
8
|
+
uses: AustralianCancerDataNetwork/cava-devops/.github/workflows/label-gate.yml@main
|
|
9
|
+
build-test:
|
|
10
|
+
uses: AustralianCancerDataNetwork/cava-devops/.github/workflows/build-test.yml@main
|
|
11
|
+
build-test-postgres:
|
|
12
|
+
uses: AustralianCancerDataNetwork/cava-devops/.github/workflows/build-test-postgres.yml@main
|
|
13
|
+
with:
|
|
14
|
+
ty-src: src
|
|
15
|
+
postgres-image: pgvector/pgvector:pg18
|
|
16
|
+
postgres-db: test_db
|
|
17
|
+
postgres-user: postgres
|
|
18
|
+
postgres-password: postgres
|
|
19
|
+
setup-commands: |
|
|
20
|
+
mkdir -p "$RUNNER_TEMP/omop"
|
|
21
|
+
cp tests/support/postgres_ci_config.toml "$RUNNER_TEMP/omop/config.toml"
|
|
22
|
+
export OA_CONFIG_PATH="$RUNNER_TEMP/omop/config.toml"
|
|
23
|
+
export GROUNDWORKERS_CONFIG_PATH="$RUNNER_TEMP/omop/config.toml"
|
|
24
|
+
export GROUNDWORKERS_REQUIRE_INTEGRATION=1
|
|
25
|
+
export GROUNDWORKERS_TEST_DATABASE_URL="postgresql+psycopg://postgres:postgres@localhost:5432/test_db"
|
|
26
|
+
echo "OA_CONFIG_PATH=$RUNNER_TEMP/omop/config.toml" >> "$GITHUB_ENV"
|
|
27
|
+
echo "GROUNDWORKERS_CONFIG_PATH=$RUNNER_TEMP/omop/config.toml" >> "$GITHUB_ENV"
|
|
28
|
+
echo "GROUNDWORKERS_REQUIRE_INTEGRATION=1" >> "$GITHUB_ENV"
|
|
29
|
+
echo "GROUNDWORKERS_TEST_DATABASE_URL=postgresql+psycopg://postgres:postgres@localhost:5432/test_db" >> "$GITHUB_ENV"
|
|
30
|
+
uv run omop-config connections add pg_test \
|
|
31
|
+
--dialect postgresql+psycopg \
|
|
32
|
+
--host localhost \
|
|
33
|
+
--port 5432 \
|
|
34
|
+
--user postgres \
|
|
35
|
+
--password postgres \
|
|
36
|
+
--database-name test_db \
|
|
37
|
+
--test-only false
|
|
38
|
+
uv run omop-config databases add test_cdm_db \
|
|
39
|
+
--kind cdm \
|
|
40
|
+
--connection pg_test \
|
|
41
|
+
--schema-name public
|
|
42
|
+
uv run omop-config databases add test_vector_db \
|
|
43
|
+
--kind generic \
|
|
44
|
+
--connection pg_test \
|
|
45
|
+
--schema-name public
|
|
46
|
+
uv run omop-config vector-stores add test_embeddings \
|
|
47
|
+
--backend-type pgvector \
|
|
48
|
+
--database test_vector_db
|
|
49
|
+
uv run omop-config configure groundworkers \
|
|
50
|
+
--cdm-db test_cdm_db \
|
|
51
|
+
--vector-store-name test_embeddings
|
|
52
|
+
uv run python -m tests.support.seed_postgres_fixture
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
name: Release Update
|
|
2
|
+
on:
|
|
3
|
+
pull_request:
|
|
4
|
+
types: [closed]
|
|
5
|
+
branches: [main]
|
|
6
|
+
permissions:
|
|
7
|
+
contents: write
|
|
8
|
+
pull-requests: read
|
|
9
|
+
jobs:
|
|
10
|
+
draft:
|
|
11
|
+
if: github.event.pull_request.merged == true
|
|
12
|
+
uses: AustralianCancerDataNetwork/cava-devops/.github/workflows/release-drafter.yml@main
|
|
13
|
+
secrets: inherit
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
name: Publish
|
|
2
|
+
on:
|
|
3
|
+
push:
|
|
4
|
+
tags: ['v*']
|
|
5
|
+
jobs:
|
|
6
|
+
build:
|
|
7
|
+
uses: AustralianCancerDataNetwork/cava-devops/.github/workflows/publish.yml@main
|
|
8
|
+
publish:
|
|
9
|
+
# Inline: PyPI OIDC checks job_workflow_ref, which must point to this file.
|
|
10
|
+
# Moving pypa/gh-action-pypi-publish into cava-devops would break the trusted publisher.
|
|
11
|
+
needs: build
|
|
12
|
+
runs-on: ubuntu-latest
|
|
13
|
+
permissions:
|
|
14
|
+
id-token: write
|
|
15
|
+
environment:
|
|
16
|
+
name: pypi
|
|
17
|
+
url: https://pypi.org/p/groundworkers
|
|
18
|
+
steps:
|
|
19
|
+
- uses: actions/download-artifact@v4
|
|
20
|
+
with: { name: dist, path: dist/ }
|
|
21
|
+
- uses: pypa/gh-action-pypi-publish@release/v1
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
__pycache__/
|
|
2
|
+
*.py[cod]
|
|
3
|
+
.venv/
|
|
4
|
+
.pytest_cache/
|
|
5
|
+
.mypy_cache/
|
|
6
|
+
.ruff_cache/
|
|
7
|
+
dist/
|
|
8
|
+
build/
|
|
9
|
+
*.egg-info/
|
|
10
|
+
.DS_Store
|
|
11
|
+
_design/
|
|
12
|
+
*.log
|
|
13
|
+
*.bak
|
|
14
|
+
*.tmp
|
|
15
|
+
.vscode/
|
|
16
|
+
settings.json
|
|
17
|
+
*.local.yaml
|
|
18
|
+
*.local.toml
|
|
19
|
+
site/
|
|
20
|
+
_knowledge/
|
|
21
|
+
data/
|
|
22
|
+
.env
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
3.12
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
### CHANGELOG NO LONGER MAINTAINED
|
|
2
|
+
now handled in ci/cd automation consistent the rest of the cava-devops stack
|
|
3
|
+
|
|
4
|
+
## 0.3.4
|
|
5
|
+
- started building out the configuration TUI
|
|
6
|
+
- lock upper boundary for oa_configurator compatibility
|
|
7
|
+
|
|
8
|
+
## 0.3.3
|
|
9
|
+
|
|
10
|
+
feature: changed the way that knowledge packs are registered, updated baseline knowledge packs (status is very draft for this part - ymmv)
|
|
11
|
+
|
|
12
|
+
## 0.3.2
|
|
13
|
+
|
|
14
|
+
fix: repaired integration tests
|
|
15
|
+
|
|
16
|
+
## 0.3.1
|
|
17
|
+
|
|
18
|
+
chore: version bump
|
|
19
|
+
|
|
20
|
+
## 0.3.0
|
|
21
|
+
|
|
22
|
+
feat: knowledge-base integration, layer cleanup, oa-configurator integration, graph and embedding services
|
|
23
|
+
fix: candidate-bundle metadata, knowledge content-serving, embedding-backend honesty, source-profile signals
|
|
24
|
+
|
|
25
|
+
- populate identity metadata (`concept_code`, `vocabulary_id`, `domain_id`, `concept_class_id`) on embedding-only candidates in `concept_candidate_bundle` via a single batch `concept_views` backfill (omop-emb never carries these); warn when the graph service is unavailable to enrich them
|
|
26
|
+
- finish the knowledge catalogue: add `KnowledgeCatalogue.get_pack()` and a `knowledge_pack` MCP tool that serve pack `guidance`/`rules`/`examples` content — previously only manifest metadata and filenames were exposed; also collapse the dead tail branch in `PackApplicability.matches`
|
|
27
|
+
- reject an unsupported embedding backend eagerly at build time with an actionable message, clarifying that FAISS is a query-time cache accelerator (`faiss_cache_dir` + the `embedding-faiss` extra), not a standalone backend value
|
|
28
|
+
- record `inferred_vocab` on source-vocabulary columns so the router derives a table-level domain hint from them, and surface the matched source profile's `structural_skip_field_types` and `packed_value_column_hint` on `PreIngestBundle` / the assisted-plan REST response instead of discarding them
|
|
29
|
+
- require `omop-emb>=1.1.1`
|
|
30
|
+
- add knowledge-base catalogue integration and expand the knowledge-facing tool and service surface
|
|
31
|
+
- introduce dedicated graph and grounding services so concept and resolver tools delegate through a cleaner service-layer split
|
|
32
|
+
- integrate `oa-configurator` into application/bootstrap wiring and refresh the example configuration path
|
|
33
|
+
- expand the `omop-graph` and `omop-emb` adapter layer, including parentless domain-constrained grounding support via `omop-graph>=1.3.0`
|
|
34
|
+
- refresh architecture and service documentation, including new graph, grounding, resolver, and source-planning pages
|
|
35
|
+
|
|
36
|
+
## 0.2.0
|
|
37
|
+
|
|
38
|
+
feat: add direct Python service layer, mapping workflows, and docs refresh
|
|
39
|
+
|
|
40
|
+
- add `build_application()` and a shared application container for direct Python consumers
|
|
41
|
+
- add `MappingService` as a reusable service-layer API for mapping-oriented workflows
|
|
42
|
+
- add mapping tools for normalized search, candidate bundles, parent backoff, mapping context, `Maps to value`, mapping-expression resolution, and candidate evaluation
|
|
43
|
+
- keep mapping MCP tools thin by delegating orchestration to the service layer
|
|
44
|
+
- tighten `omop-emb` typing through the adapter and server composition path
|
|
45
|
+
- extend docs to cover MCP and direct-Python integration, layer boundaries, and mapping workflows
|
|
46
|
+
|
|
47
|
+
## 0.1.1
|
|
48
|
+
|
|
49
|
+
feat: add chunk coherence pass and review-state transitions
|
|
50
|
+
|
|
51
|
+
- add coherence reranking based on approved-set distribution
|
|
52
|
+
- infer provisional sets for inferred chunks
|
|
53
|
+
- transition processed chunks to REVIEW and skip them on resume
|
|
54
|
+
- add unit coverage for coherence behavior
|
|
55
|
+
|
|
56
|
+
## 0.1.0
|
|
57
|
+
|
|
58
|
+
- alpha release for review
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
.PHONY: setup test lint typecheck check describe
|
|
2
|
+
|
|
3
|
+
PYTHON := .venv/bin/python3
|
|
4
|
+
CONFIG ?= config/groundworkers.example.toml
|
|
5
|
+
|
|
6
|
+
# Mirrors the install CI performs, so a local run reproduces the pipeline exactly.
|
|
7
|
+
setup:
|
|
8
|
+
uv sync --all-extras --dev
|
|
9
|
+
|
|
10
|
+
describe:
|
|
11
|
+
$(PYTHON) -m groundworkers.server --config $(CONFIG) --describe
|
|
12
|
+
|
|
13
|
+
lint:
|
|
14
|
+
uv run ruff check .
|
|
15
|
+
|
|
16
|
+
typecheck:
|
|
17
|
+
uv run ty check src/
|
|
18
|
+
|
|
19
|
+
test:
|
|
20
|
+
uv run pytest -q
|
|
21
|
+
|
|
22
|
+
# The three gates build-test.yml enforces on every pull request.
|
|
23
|
+
check: typecheck lint test
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
|
+
Name: groundworkers
|
|
3
|
+
Version: 0.5.0
|
|
4
|
+
Summary: Groundworkers MCP server — read-only agentive access to OMOP vocabularies, concept graphs, and embeddings.
|
|
5
|
+
Requires-Python: >=3.12
|
|
6
|
+
Requires-Dist: fastapi<1.0,>=0.110
|
|
7
|
+
Requires-Dist: mcp[cli]<2,>=1
|
|
8
|
+
Requires-Dist: numpy<3,>=1.26
|
|
9
|
+
Requires-Dist: oa-configurator<2,>=1.3.0
|
|
10
|
+
Requires-Dist: omop-alchemy<2,>=1.1
|
|
11
|
+
Requires-Dist: omop-emb<3,>=2.1
|
|
12
|
+
Requires-Dist: omop-graph<3,>=2.1
|
|
13
|
+
Requires-Dist: omop-llm<2,>=1
|
|
14
|
+
Requires-Dist: omop-semantics<1,>=0.6
|
|
15
|
+
Requires-Dist: psutil<8,>=5.9
|
|
16
|
+
Requires-Dist: psycopg[binary]<4,>=3.1
|
|
17
|
+
Requires-Dist: pydantic<3,>=2
|
|
18
|
+
Requires-Dist: python-dotenv<2,>=1
|
|
19
|
+
Requires-Dist: pyyaml<7,>=6
|
|
20
|
+
Requires-Dist: sqlalchemy<3,>=2
|
|
21
|
+
Requires-Dist: uvicorn[standard]<1.0,>=0.29
|
|
22
|
+
Provides-Extra: all-source
|
|
23
|
+
Requires-Dist: openpyxl<4,>=3.1; extra == 'all-source'
|
|
24
|
+
Requires-Dist: pdfplumber>=0.10; extra == 'all-source'
|
|
25
|
+
Requires-Dist: python-docx>=1.0; extra == 'all-source'
|
|
26
|
+
Provides-Extra: dev
|
|
27
|
+
Requires-Dist: httpx<1,>=0.27; extra == 'dev'
|
|
28
|
+
Requires-Dist: ipython>=8.0; extra == 'dev'
|
|
29
|
+
Requires-Dist: mkdocs-material>=9.7.1; extra == 'dev'
|
|
30
|
+
Requires-Dist: mkdocs-mermaid2-plugin; extra == 'dev'
|
|
31
|
+
Requires-Dist: mkdocs>=1.6.1; extra == 'dev'
|
|
32
|
+
Requires-Dist: mkdocstrings-python>=2.0.1; extra == 'dev'
|
|
33
|
+
Requires-Dist: mypy>=1.8; extra == 'dev'
|
|
34
|
+
Requires-Dist: pytest-cov>=4.0; extra == 'dev'
|
|
35
|
+
Requires-Dist: pytest>=9.0.3; extra == 'dev'
|
|
36
|
+
Requires-Dist: requests>=2.33.0; extra == 'dev'
|
|
37
|
+
Requires-Dist: ruff>=0.4; extra == 'dev'
|
|
38
|
+
Requires-Dist: textual>=0.60; extra == 'dev'
|
|
39
|
+
Requires-Dist: tornado>=6.5.5; extra == 'dev'
|
|
40
|
+
Requires-Dist: ty>=0.0.59; extra == 'dev'
|
|
41
|
+
Provides-Extra: docx
|
|
42
|
+
Requires-Dist: python-docx>=1.0; extra == 'docx'
|
|
43
|
+
Provides-Extra: embedding-artifacts
|
|
44
|
+
Requires-Dist: h5py<4,>=3.10; extra == 'embedding-artifacts'
|
|
45
|
+
Provides-Extra: embedding-faiss
|
|
46
|
+
Requires-Dist: omop-emb[faiss-cpu]<3,>=2.1; extra == 'embedding-faiss'
|
|
47
|
+
Provides-Extra: embedding-pgvector
|
|
48
|
+
Requires-Dist: omop-emb[pgvector]<3,>=2.1; extra == 'embedding-pgvector'
|
|
49
|
+
Provides-Extra: pdf
|
|
50
|
+
Requires-Dist: pdfplumber>=0.10; extra == 'pdf'
|
|
51
|
+
Provides-Extra: tui
|
|
52
|
+
Requires-Dist: groundskeeping<1,>=0.8.1; extra == 'tui'
|
|
53
|
+
Requires-Dist: rich<15,>=13; extra == 'tui'
|
|
54
|
+
Requires-Dist: textual>=0.60; extra == 'tui'
|
|
55
|
+
Provides-Extra: xlsx
|
|
56
|
+
Requires-Dist: openpyxl<4,>=3.1; extra == 'xlsx'
|
|
57
|
+
Description-Content-Type: text/markdown
|
|
58
|
+
|
|
59
|
+
# groundworkers
|
|
60
|
+
|
|
61
|
+
Groundworkers is the reusable, read-only capability layer for OMOP vocabulary lookup, concept mapping, source planning, and related analysis. It combines deterministic services with optional embeddings and model-assisted operations.
|
|
62
|
+
|
|
63
|
+
It does not own patient-level writes, session state, or job lifecycle. Those concerns belong to the calling application; `groundcrew` is the usual stateful orchestrator.
|
|
64
|
+
|
|
65
|
+
## Choose an interface
|
|
66
|
+
|
|
67
|
+
| Interface | Use it when |
|
|
68
|
+
| --- | --- |
|
|
69
|
+
| MCP | An agent needs discoverable tools, prompts, resources, and a shared remote runtime. |
|
|
70
|
+
| REST | An application needs the curated HTTP workflows for candidate bundles or assisted source planning. |
|
|
71
|
+
| Python | A process owns batching, evaluation, or orchestration and can run in-process. |
|
|
72
|
+
|
|
73
|
+
Start with the [documentation home](docs/index.md), or choose a path directly:
|
|
74
|
+
|
|
75
|
+
- [Concepts and capability choices](docs/concepts.md) explains retrieval, grounding, mapping, source planning, and projection.
|
|
76
|
+
- [Installation](docs/usage/installation.md) covers package extras and prerequisites.
|
|
77
|
+
- [Initial local setup](docs/from-scratch.md) walks through a fresh CDM-backed deployment.
|
|
78
|
+
- [Integrations](docs/usage/integrations.md) shows MCP, REST, and Python calls.
|
|
79
|
+
- [Configuration](docs/usage/configuration.md) explains shared-stack references and optional capabilities.
|
|
80
|
+
- [Tools overview](docs/tools/overview.md) maps jobs to the discoverable MCP surface.
|
|
81
|
+
|
|
82
|
+
## Quick start
|
|
83
|
+
|
|
84
|
+
Install the package and configure the shared OMOP stack:
|
|
85
|
+
|
|
86
|
+
```bash
|
|
87
|
+
pip install groundworkers
|
|
88
|
+
omop-config configure groundworkers
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
Inspect the active configuration and MCP surface before starting a service:
|
|
92
|
+
|
|
93
|
+
```bash
|
|
94
|
+
groundworkers --describe
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
Run MCP over stdio for a client that starts the process, or over Streamable HTTP for a shared service:
|
|
98
|
+
|
|
99
|
+
```bash
|
|
100
|
+
groundworkers
|
|
101
|
+
groundworkers --transport streamable-http --host 127.0.0.1 --port 8000
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
REST is a separate, curated interface:
|
|
105
|
+
|
|
106
|
+
```bash
|
|
107
|
+
groundworkers --transport rest --host 127.0.0.1 --port 8080
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
## Direct Python
|
|
111
|
+
|
|
112
|
+
Build the application once and reuse it. Services are optional when their prerequisites are not configured:
|
|
113
|
+
|
|
114
|
+
```python
|
|
115
|
+
from groundworkers.app import build_application
|
|
116
|
+
from groundworkers.bootstrap import build_app_config
|
|
117
|
+
|
|
118
|
+
config = build_app_config()
|
|
119
|
+
app = build_application(config)
|
|
120
|
+
|
|
121
|
+
bundle = app.services.mapping.concept_candidate_bundle(
|
|
122
|
+
"type 2 diabetes",
|
|
123
|
+
domain="Condition",
|
|
124
|
+
)
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
The `mapping` service in this example requires a configured CDM database. Embedding-backed channels require an embedding model and vector store; text, domain classification, and assisted source planning require a configured chat model. Use `groundworkers --describe` to see what the current deployment exposes.
|
|
128
|
+
|
|
129
|
+
## Companion repositories
|
|
130
|
+
|
|
131
|
+
- [groundcrew](https://github.com/AustralianCancerDataNetwork/groundcrew) owns session state and orchestration.
|
|
132
|
+
- [omop-graph](https://australiancancerdatanetwork.github.io/omop-graph/) provides graph-backed OMOP traversal.
|
|
133
|
+
- [omop-emb](https://australiancancerdatanetwork.github.io/omop-emb/) provides embedding stores and indexes.
|