forge-doctor-data 1.0.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.
- forge_doctor_data-1.0.0/LICENSE +21 -0
- forge_doctor_data-1.0.0/PKG-INFO +548 -0
- forge_doctor_data-1.0.0/README.md +513 -0
- forge_doctor_data-1.0.0/pyproject.toml +176 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/__init__.py +10 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/__main__.py +6 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/_forge_portal.py +913 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/_graphstudio.py +376 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/_graphview.py +181 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/_installkit.py +1706 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/analyzers/__init__.py +0 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/analyzers/abstractions.py +349 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/analyzers/airflow_model.py +661 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/analyzers/analytical_model.py +464 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/analyzers/athena_model.py +326 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/analyzers/azure_model.py +298 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/analyzers/bigquery_model.py +449 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/analyzers/controlm_model.py +435 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/analyzers/databricks_model.py +304 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/analyzers/datacontract_model.py +448 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/analyzers/dbt_model.py +424 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/analyzers/delta_model.py +299 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/analyzers/dynamodb_model.py +626 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/analyzers/emr_model.py +325 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/analyzers/execution_adapters.py +849 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/analyzers/flink_model.py +248 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/analyzers/gcp_model.py +305 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/analyzers/glue_ast.py +152 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/analyzers/graph_model.py +311 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/analyzers/graph_queries.py +454 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/analyzers/hcl_lite.py +202 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/analyzers/iceberg_model.py +471 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/analyzers/index.py +743 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/analyzers/kafka_model.py +324 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/analyzers/kinesis_model.py +288 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/analyzers/lakeformation_model.py +853 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/analyzers/lambda_model.py +382 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/analyzers/metadata_model.py +464 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/analyzers/neptune_explain.py +189 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/analyzers/neptune_model.py +671 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/analyzers/neptune_queries.py +147 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/analyzers/parquet_model.py +219 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/analyzers/platform_graph_builder.py +1757 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/analyzers/pyproject.py +100 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/analyzers/quality_model.py +500 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/analyzers/redshift_model.py +473 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/analyzers/runtime_evidence.py +1200 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/analyzers/search_model.py +492 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/analyzers/snowflake_model.py +429 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/analyzers/spark_ast.py +224 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/analyzers/sql_ast.py +288 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/analyzers/stepfunctions_model.py +334 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/analyzers/streaming_model.py +385 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/analyzers/streaming_runtime.py +295 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/analyzers/terraform_model.py +229 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/analyzers/trino_model.py +301 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/analyzers/warehouse_model.py +590 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/api.py +137 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/checks/__init__.py +113 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/checks/airflow.py +337 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/checks/analytical.py +479 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/checks/architecture.py +106 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/checks/aws.py +196 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/checks/azure.py +152 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/checks/bigquery.py +338 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/checks/ci.py +213 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/checks/cloud.py +139 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/checks/controlm.py +293 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/checks/datacontract.py +163 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/checks/dbt.py +205 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/checks/dependencies.py +308 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/checks/docker.py +217 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/checks/dynamodb.py +696 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/checks/gcp.py +150 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/checks/git_checks.py +126 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/checks/glue.py +203 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/checks/graph.py +639 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/checks/iac.py +266 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/checks/iceberg.py +491 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/checks/lakeformation.py +501 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/checks/metadata.py +315 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/checks/neptune.py +843 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/checks/parquet.py +226 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/checks/platform_rules.py +873 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/checks/platforms.py +588 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/checks/policy_pack.py +45 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/checks/python_env.py +254 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/checks/quality.py +252 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/checks/redshift.py +342 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/checks/repository.py +255 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/checks/search.py +221 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/checks/serverless.py +537 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/checks/snowflake.py +255 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/checks/spark.py +419 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/checks/sql.py +135 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/checks/stepfunctions.py +239 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/checks/streaming.py +234 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/checks/streaming_bus.py +512 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/checks/terraform.py +289 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/checks/trino.py +226 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/checks/warehouse.py +158 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/cli/__init__.py +228 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/cli/advise.py +74 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/cli/agent.py +79 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/cli/airflow.py +108 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/cli/analytical.py +71 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/cli/app.py +64 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/cli/bench.py +97 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/cli/bigquery.py +67 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/cli/capabilities.py +233 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/cli/catalog.py +57 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/cli/cloud.py +61 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/cli/collector.py +38 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/cli/common.py +867 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/cli/compatibility.py +211 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/cli/contract.py +147 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/cli/controlm.py +127 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/cli/datamodel.py +92 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/cli/dbt.py +80 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/cli/diff.py +320 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/cli/dynamodb.py +189 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/cli/export.py +39 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/cli/fix.py +153 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/cli/fleet.py +488 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/cli/golden.py +112 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/cli/graph.py +229 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/cli/history.py +213 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/cli/hosts.py +52 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/cli/iceberg.py +223 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/cli/incident.py +159 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/cli/inspect.py +79 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/cli/install_cmd.py +277 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/cli/lab.py +323 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/cli/lakeformation.py +194 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/cli/misc.py +1360 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/cli/neptune.py +213 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/cli/optimize.py +181 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/cli/parquet.py +70 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/cli/platform.py +123 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/cli/platforms.py +190 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/cli/plugins.py +223 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/cli/policy.py +230 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/cli/portal.py +75 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/cli/project.py +83 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/cli/quality.py +71 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/cli/redshift.py +74 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/cli/reliability.py +125 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/cli/remediate.py +86 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/cli/rootcause.py +129 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/cli/runtime.py +780 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/cli/scan.py +269 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/cli/search.py +78 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/cli/serverless.py +136 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/cli/snowflake.py +74 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/cli/stepfunctions.py +89 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/cli/streaming.py +182 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/cli/streaming_bus.py +177 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/cli/terraform.py +111 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/cli/trino.py +64 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/cli/twin.py +297 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/cli/whatif.py +291 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/cli/workspace.py +285 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/contracts/__init__.py +55 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/contracts/fixtures/capability.json +10 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/contracts/fixtures/diagnostic-manifest.json +32 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/contracts/fixtures/entity.json +13 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/contracts/fixtures/evidence.json +7 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/contracts/fixtures/finding.json +18 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/contracts/fixtures/handoff.json +78 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/contracts/fixtures/migration-plan.json +15 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/contracts/fixtures/relationship.json +8 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/contracts/fixtures/remediation-plan.json +16 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/contracts/fixtures/unknown-fact.json +8 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/contracts/models.py +668 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/contracts/schemas.py +231 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/contracts/version.py +63 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/core/__init__.py +0 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/core/agent_context.py +235 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/core/baseline.py +136 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/core/bench.py +216 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/core/cache.py +212 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/core/capabilities.py +630 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/core/capability_deps.py +435 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/core/capability_graph.py +131 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/core/capacity.py +481 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/core/change_correlation.py +510 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/core/change_intel.py +203 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/core/collectors.py +102 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/core/compat.py +133 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/core/config.py +216 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/core/conformance.py +161 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/core/context.py +222 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/core/contract.py +822 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/core/contract_adapters.py +106 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/core/contract_check.py +100 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/core/cost_drivers.py +717 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/core/critical_path.py +505 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/core/crossdomain.py +140 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/core/crossmigration.py +444 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/core/decisions.py +198 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/core/delivery.py +171 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/core/diagnose.py +231 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/core/diagnosis.py +673 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/core/errors.py +5 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/core/execution_history.py +664 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/core/execution_model.py +344 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/core/execution_store.py +104 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/core/experiments/__init__.py +46 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/core/experiments/fixture.py +264 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/core/experiments/measured.py +450 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/core/experiments_v2.py +33 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/core/fingerprint.py +205 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/core/fixes.py +357 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/core/fleet.py +143 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/core/forger.py +81 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/core/golden.py +266 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/core/graph.py +159 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/core/handoff.py +62 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/core/history.py +268 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/core/incident.py +491 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/core/incremental.py +404 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/core/knowledge.py +609 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/core/lab.py +868 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/core/lineage.py +262 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/core/metrics.py +131 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/core/migration/__init__.py +42 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/core/migration/cross_platform.py +541 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/core/migration/platform.py +341 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/core/migration_v2.py +36 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/core/models.py +187 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/core/ontology.py +256 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/core/optimization/__init__.py +34 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/core/optimization/evidence.py +497 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/core/optimization/static.py +219 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/core/optimize.py +10 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/core/optimize_v2.py +27 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/core/performance.py +743 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/core/physical_design.py +252 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/core/platform_graph.py +244 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/core/platform_ontology.py +1163 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/core/policy.py +137 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/core/policy_pack.py +522 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/core/portfolio.py +626 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/core/profiles.py +63 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/core/project_info.py +79 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/core/project_status.py +205 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/core/registry.py +48 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/core/regression.py +540 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/core/reliability.py +757 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/core/remediation.py +177 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/core/runner.py +158 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/core/runtime_evidence.py +119 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/core/sbom.py +261 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/core/scaffold.py +129 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/core/schema.py +241 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/core/schema_compat.py +504 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/core/schemas.py +464 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/core/semantic_diff.py +352 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/core/service.py +272 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/core/spark_runtime.py +352 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/core/sql_portability.py +342 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/core/traversal.py +56 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/core/trends.py +175 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/core/twin.py +197 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/core/twin_states.py +528 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/core/whatif.py +411 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/core/workspace.py +314 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/graphview.py +77 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/install/__init__.py +14 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/install/service.py +337 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/integrations/__init__.py +1 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/integrations/hostflow.py +259 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/integrations/lsp_server.py +197 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/integrations/mcp_protocol.py +126 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/integrations/mcp_server.py +653 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/airflow/objects.json +52 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/athena/engines.json +27 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/capabilities/adls.json +43 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/capabilities/athena.json +72 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/capabilities/azure_fabric.json +33 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/capabilities/bigquery.json +75 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/capabilities/cloud.json +180 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/capabilities/databricks.json +55 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/capabilities/dataflow.json +33 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/capabilities/dataplex.json +33 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/capabilities/dataproc.json +33 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/capabilities/delta.json +120 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/capabilities/dynamodb.json +154 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/capabilities/emr.json +57 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/capabilities/eventhubs.json +33 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/capabilities/flink.json +41 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/capabilities/glue.json +83 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/capabilities/graph.json +83 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/capabilities/iceberg.json +60 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/capabilities/kafka.json +48 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/capabilities/kinesis.json +41 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/capabilities/lakeformation.json +91 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/capabilities/lambda.json +56 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/capabilities/neptune.json +128 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/capabilities/pubsub.json +41 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/capabilities/purview.json +33 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/capabilities/redshift.json +83 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/capabilities/search.json +90 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/capabilities/snowflake.json +83 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/capabilities/synapse.json +33 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/capabilities/trino.json +125 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/capabilities/warehouse.json +80 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/capacity/bigquery.json +30 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/capacity/redshift.json +29 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/capacity/snowflake.json +31 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/capacity/trino.json +29 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/controlm/objects.json +82 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/cost_drivers/drivers.json +52 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/cost_drivers/thresholds.json +35 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/databricks/runtime.json +47 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/delta/features.json +48 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/dynamodb/global-tables.json +33 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/dynamodb/indexes.json +38 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/dynamodb/limits.json +32 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/dynamodb/modeling.json +33 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/dynamodb/streams.json +33 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/dynamodb/transactions.json +33 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/emr/releases.json +36 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/errors/airflow.json +100 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/errors/controlm.json +101 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/errors/databricks.json +69 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/errors/glue.json +134 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/errors/iceberg.json +67 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/errors/python.json +115 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/errors/spark.json +195 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/flink/config.json +33 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/glue/compatibility.json +68 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/glue/versions.json +58 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/graph/algorithms.json +21 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/graph/modeling.json +38 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/graph/property-graph.json +39 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/graph/rdf.json +32 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/iceberg/compatibility.json +60 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/iceberg/spec.json +58 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/iceberg/versions.json +40 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/kafka/config.json +50 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/kinesis/config.json +33 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/lakeformation/cross-account.json +37 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/lakeformation/errors.json +240 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/lakeformation/hybrid.json +27 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/lakeformation/permissions.json +67 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/lambda/runtimes.json +27 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/neptune/analytics.json +22 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/neptune/bulk-loader.json +26 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/neptune/compatibility.json +22 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/neptune/engines.json +22 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/neptune/explain.json +22 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/neptune/features.json +28 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/neptune/global-database.json +21 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/neptune/ingestion.json +21 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/neptune/products.json +22 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/neptune/query-languages.json +33 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/parquet/format.json +22 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/performance/engines.json +95 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/performance/regression.json +38 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/performance/thresholds.json +51 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/python/compatibility.json +21 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/reliability/engines.json +65 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/remediation/chains.json +157 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/remediation/iceberg.json +167 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/remediation/parquet.json +133 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/remediation/platform.json +96 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/remediation/spark.json +160 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/remediation/streaming.json +106 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/spark/versions.json +27 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/stepfunctions/integrations.json +20 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/stepfunctions/query-languages.json +47 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/streaming/delivery.json +59 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/streaming/spark/stateful_ops.json +22 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/terraform/language.json +31 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/terraform/providers.json +36 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/output/__init__.py +0 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/output/agent_renderer.py +53 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/output/console.py +252 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/output/html_renderer.py +25 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/output/json_renderer.py +105 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/output/sarif_renderer.py +103 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/output/summary.py +28 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/plugins/__init__.py +0 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/plugins/discovery.py +359 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/plugins/isolation.py +291 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/plugins/manager.py +276 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/plugins/protocol.py +176 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/portal_adapter.py +750 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/portal_assets/chunk-7_l-b4Tr.js +1 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/portal_assets/chunk-B0Iad6pD.js +1 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/portal_assets/chunk-B605XnCF.js +1 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/portal_assets/chunk-B7N3TXcn.js +1 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/portal_assets/chunk-BAj6yGem.js +1 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/portal_assets/chunk-BGUitn2r.js +1 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/portal_assets/chunk-BVKnCv85.js +1 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/portal_assets/chunk-BYyM9V_w.js +1 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/portal_assets/chunk-BaQMhq-G.js +1 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/portal_assets/chunk-BavOrxVm.js +1 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/portal_assets/chunk-Bb0C24YV.js +1 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/portal_assets/chunk-BfCFGPzs.js +1 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/portal_assets/chunk-C2t4OUVu.js +1 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/portal_assets/chunk-C3pI4QjU.js +1 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/portal_assets/chunk-C4gpbtbP.js +1 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/portal_assets/chunk-CGWeHhKY.js +1 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/portal_assets/chunk-CJCT86Dr.js +1 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/portal_assets/chunk-CXcsLDPJ.js +1 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/portal_assets/chunk-CcjxoLxw.js +1 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/portal_assets/chunk-D-gBPXHa.js +1 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/portal_assets/chunk-D3eZogIe.js +1 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/portal_assets/chunk-DQU0VyoQ.js +1 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/portal_assets/chunk-DqWNkF1O.js +1 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/portal_assets/chunk-DuPPkSIE.js +3 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/portal_assets/chunk-DyIHOW_a.js +1 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/portal_assets/chunk-Fx4zSGL5.js +1 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/portal_assets/chunk-UBKt05Rg.js +1 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/portal_assets/chunk-htnJDQEY.js +1 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/portal_assets/chunk-kXRFMGqe.js +1 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/portal_assets/chunk-qe3u763a.js +1 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/portal_assets/favicon.ico +0 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/portal_assets/index.html +13 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/portal_assets/main-QDFVZK3T.js +5 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/portal_assets/styles-MQEBDFDX.css +1 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/sdk.py +64 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/ui/__init__.py +28 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/ui/app.py +529 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/ui/home.py +114 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/ui/i18n.py +143 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/ui/kit.py +689 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/ui/screen.py +648 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/ui/tui.py +106 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/ui/wizard.py +309 -0
- forge_doctor_data-1.0.0/src/forge_doctor_data/version.py +5 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Forge Doctor Data contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,548 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: forge-doctor-data
|
|
3
|
+
Version: 1.0.0
|
|
4
|
+
Summary: Deterministic diagnostics for data engineering projects
|
|
5
|
+
License-Expression: MIT
|
|
6
|
+
License-File: LICENSE
|
|
7
|
+
Keywords: data-engineering,diagnostics,lint,spark,cli
|
|
8
|
+
Author: Forge Doctor Data contributors
|
|
9
|
+
Requires-Python: >=3.11
|
|
10
|
+
Classifier: Development Status :: 3 - Alpha
|
|
11
|
+
Classifier: Environment :: Console
|
|
12
|
+
Classifier: Intended Audience :: Developers
|
|
13
|
+
Classifier: Operating System :: OS Independent
|
|
14
|
+
Classifier: Programming Language :: Python :: 3
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
18
|
+
Classifier: Topic :: Software Development :: Quality Assurance
|
|
19
|
+
Provides-Extra: lsp
|
|
20
|
+
Provides-Extra: schemas
|
|
21
|
+
Provides-Extra: sql
|
|
22
|
+
Provides-Extra: watch
|
|
23
|
+
Requires-Dist: lsprotocol (>=2023.0.0) ; extra == "lsp"
|
|
24
|
+
Requires-Dist: packaging (>=24)
|
|
25
|
+
Requires-Dist: pygls (>=1.3) ; extra == "lsp"
|
|
26
|
+
Requires-Dist: pyyaml (>=6.0) ; extra == "schemas"
|
|
27
|
+
Requires-Dist: rich (>=13)
|
|
28
|
+
Requires-Dist: sqlglot (>=26,<29) ; extra == "sql"
|
|
29
|
+
Requires-Dist: typer (>=0.15)
|
|
30
|
+
Requires-Dist: watchfiles (>=0.21) ; extra == "watch"
|
|
31
|
+
Project-URL: Changelog, https://github.com/EdgarSocrates98/forge-doctor-data/blob/main/CHANGELOG.md
|
|
32
|
+
Project-URL: Repository, https://github.com/EdgarSocrates98/forge-doctor-data
|
|
33
|
+
Description-Content-Type: text/markdown
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
> Instalação portátil: [`docs/installation/quickstart.md`](docs/installation/quickstart.md) — clone → setup → install. Delegação agêntica: [forge.agentic.json](forge.agentic.json) (SpecialistAgenticManifest/v1).
|
|
37
|
+
> Docs: [commands](docs/reference/commands.md) · [skills](docs/reference/skills.md) · [agents](docs/reference/agents.md) · [tutorial](docs/tutorials/first-run.md) · [economy](docs/economy.md) · [troubleshooting](docs/installation/troubleshooting.md)
|
|
38
|
+
<p align="center">
|
|
39
|
+
<img src="docs/assets/logo.png" alt="Forge Doctor Data" width="440">
|
|
40
|
+
</p>
|
|
41
|
+
|
|
42
|
+
# Forge Doctor Data
|
|
43
|
+
|
|
44
|
+
Deterministic diagnostics for data engineering projects. One command inspects
|
|
45
|
+
your repository, Python environment, packaging, dependencies, git hygiene,
|
|
46
|
+
PySpark code, and local AWS setup — no daemons, no network calls, no AI.
|
|
47
|
+
|
|
48
|
+
## Why it exists
|
|
49
|
+
|
|
50
|
+
Data projects drift: a `collect()` slips into a hot path, `requirements.txt`
|
|
51
|
+
and `poetry.lock` start coexisting, a `.env` gets committed, the Python in the
|
|
52
|
+
venv no longer matches `requires-python`. These failures are cheap to catch and
|
|
53
|
+
expensive to debug. Forge Doctor Data is a fast, offline, deterministic sensor that
|
|
54
|
+
surfaces them with file:line precision — and explains when each pattern is
|
|
55
|
+
actually fine.
|
|
56
|
+
|
|
57
|
+
## Installation
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
pipx install forge-doctor-data
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
New here? Walk through [docs/getting-started.md](docs/getting-started.md) —
|
|
64
|
+
install to a gated CI scan in five steps.
|
|
65
|
+
|
|
66
|
+
Or from source:
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
git clone https://github.com/EdgarSocrates98/forge-doctor-data
|
|
70
|
+
cd forge-doctor-data
|
|
71
|
+
pipx install .
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
## Usage
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
forge-doctor-data scan . # full scan
|
|
78
|
+
forge-doctor-data scan . --check spark # one category
|
|
79
|
+
forge-doctor-data scan . --ignore SPARK001
|
|
80
|
+
forge-doctor-data scan . --format json # stable machine-readable contract
|
|
81
|
+
forge-doctor-data scan . --format html # self-contained shareable report
|
|
82
|
+
forge-doctor-data scan . --format sarif # GitHub Code Scanning
|
|
83
|
+
forge-doctor-data scan . --format agent # compact bundle for agent consumers
|
|
84
|
+
forge-doctor-data scan . --quiet # only problems
|
|
85
|
+
forge-doctor-data scan . --fail-on warning
|
|
86
|
+
forge-doctor-data scan . --profile security # severity profile
|
|
87
|
+
forge-doctor-data scan . --files a.py b.py # only these files (pre-commit)
|
|
88
|
+
forge-doctor-data scan . --no-plugins # skip external plugins
|
|
89
|
+
forge-doctor-data scan . --watch # re-scan on every file change
|
|
90
|
+
forge-doctor-data scan . --save-baseline .fd-baseline.json
|
|
91
|
+
forge-doctor-data scan . --baseline .fd-baseline.json # only NEW findings fail
|
|
92
|
+
forge-doctor-data scan . --baseline .fd.json --new-only # just the new ones
|
|
93
|
+
forge-doctor-data scan . --save-baseline main # named: .forge-doctor-data/baselines/main.json
|
|
94
|
+
forge-doctor-data scan . --baseline main --new-only # per-branch baselines
|
|
95
|
+
forge-doctor-data scan . --evidence-out audit/ # dated audit bundle (report+suppressions+packs)
|
|
96
|
+
forge-doctor-data scan . --record --keep 30 # append a history snapshot, prune to 30
|
|
97
|
+
forge-doctor-data history . # recorded snapshots
|
|
98
|
+
forge-doctor-data history diff --last # new/resolved findings, entity+capability+drift deltas
|
|
99
|
+
forge-doctor-data history trend # finding counts over the series + debt trajectory
|
|
100
|
+
forge-doctor-data diff old.json new.json # diff two saved reports
|
|
101
|
+
forge-doctor-data diff HEAD~1...HEAD # diff across git refs
|
|
102
|
+
forge-doctor-data compatibility --to 6.0 # Glue env + migration risks
|
|
103
|
+
forge-doctor-data migrate glue --from 3.0 --to 4.0 # migration intelligence
|
|
104
|
+
forge-doctor-data workspace . # discover projects in a monorepo
|
|
105
|
+
forge-doctor-data workspace scan --path . # scan every nested project
|
|
106
|
+
forge-doctor-data workspace inspect . # cross-repo graph links (defines/implements/invokes)
|
|
107
|
+
forge-doctor-data fleet inspect fleet.yml # manifest-driven estate graph over many repos
|
|
108
|
+
forge-doctor-data fleet query fleet.yml runtimes|dependents|findings|capability
|
|
109
|
+
forge-doctor-data fleet report fleet.yml # estate census + findings roll-up
|
|
110
|
+
forge-doctor-data fleet portfolio fleet.yml # platforms, duplication, complexity — facts not scores
|
|
111
|
+
forge-doctor-data fleet regressions fleet.yml # regression dimensions shared across repos
|
|
112
|
+
forge-doctor-data diff base...head --semantic # entity diff + blast radius + capability/migration intel
|
|
113
|
+
forge-doctor-data remediate . # deterministic fix plans per finding/root cause
|
|
114
|
+
forge-doctor-data fix . # preview/apply safety-classified text fixes
|
|
115
|
+
forge-doctor-data root-cause . # correlate findings into causal clusters
|
|
116
|
+
forge-doctor-data runtime inspect . # offline runtime evidence (exported artifacts)
|
|
117
|
+
forge-doctor-data architecture drift . # drift vs .forge-doctor-data/contract.yml
|
|
118
|
+
forge-doctor-data contract validate . # verify a platform contract file
|
|
119
|
+
forge-doctor-data capabilities list . # platform capability registry report
|
|
120
|
+
forge-doctor-data capabilities graph . # capability→evidence provenance subgraph
|
|
121
|
+
forge-doctor-data twin inspect . # digital twin: graph + invariant report
|
|
122
|
+
forge-doctor-data twin export . # deterministic twin snapshot artifact
|
|
123
|
+
forge-doctor-data advise . # ranked, cited actions (decision intelligence)
|
|
124
|
+
forge-doctor-data optimize . # ranked optimization candidates + validation commands
|
|
125
|
+
forge-doctor-data what-if . --change glue-version=5.1 # hypothetical-change evaluation
|
|
126
|
+
forge-doctor-data what-if . --change platform=bigquery # cross-platform re-target evaluation
|
|
127
|
+
forge-doctor-data migrate plan . # named deterministic migration plans
|
|
128
|
+
forge-doctor-data migrate plan . --from snowflake --to bigquery # cross-platform plan
|
|
129
|
+
forge-doctor-data policy list . # organization policy packs
|
|
130
|
+
forge-doctor-data policy report . # compliance: violations + suppression audit
|
|
131
|
+
forge-doctor-data lab run # Forge Lab scenario suites + ground truth
|
|
132
|
+
forge-doctor-data incident inspect # incident windows over recorded runtime history
|
|
133
|
+
forge-doctor-data reliability path . # critical paths over data-flow edges + segment coverage
|
|
134
|
+
forge-doctor-data golden run # golden-repo snapshot regression
|
|
135
|
+
forge-doctor-data bench run . # performance & scale benchmark
|
|
136
|
+
forge-doctor-data schema contracts # JSON Schemas for output artifacts
|
|
137
|
+
forge-doctor-data ontology # canonical vocabulary (entity/rel kinds, planes)
|
|
138
|
+
forge-doctor-data ontology validate . # graph conformance vs the vocabulary
|
|
139
|
+
forge-doctor-data snowflake inspect . # Snowflake warehouse model + vendor objects
|
|
140
|
+
forge-doctor-data bigquery inspect . # BigQuery datasets, partitions, slots, jobs
|
|
141
|
+
forge-doctor-data redshift inspect . # Redshift clusters, dist/sort keys, WLM, datashares
|
|
142
|
+
forge-doctor-data dbt inspect . # dbt models, sources, tests, ref/source lineage
|
|
143
|
+
forge-doctor-data trino inspect . # Trino catalogs, connectors, coordinator config, 3-part refs
|
|
144
|
+
forge-doctor-data analytical inspect . # ClickHouse/Pinot/Druid tables, engines, ingestion, indexes
|
|
145
|
+
forge-doctor-data search inspect . # OpenSearch/Elasticsearch templates, policies, domains
|
|
146
|
+
forge-doctor-data catalog inspect . # DataHub/OpenMetadata/Glue/Unity datasets, drift, recipes
|
|
147
|
+
forge-doctor-data quality inspect . # Deequ/GX/SodaCL/dbt suites, coverage, gate wiring
|
|
148
|
+
forge-doctor-data cloud inspect . # vendor-neutral multi-cloud abstraction view
|
|
149
|
+
forge-doctor-data export . -f handoff # portable bundle for downstream Forge tools
|
|
150
|
+
forge-doctor-data contracts verify b.json # validate a bundle against published contracts
|
|
151
|
+
forge-doctor-data info # project stats, no checks
|
|
152
|
+
forge-doctor-data init --name my-etl # scaffold a new project
|
|
153
|
+
forge-doctor-data repo # category shortcuts
|
|
154
|
+
forge-doctor-data plugins # built-in + external checks
|
|
155
|
+
forge-doctor-data plugins init forge-doctor-data-x # scaffold a plugin package
|
|
156
|
+
forge-doctor-data plugins lock && forge-doctor-data plugins verify # integrity pinning
|
|
157
|
+
forge-doctor-data plugins install forge-doctor-data-x --dry-run # pipx/pip wrapper
|
|
158
|
+
forge-doctor-data checks # every rule id and title
|
|
159
|
+
forge-doctor-data explain SPARK001 # why / when it's OK / how to fix
|
|
160
|
+
forge-doctor-data explain SPARK001 --json # rule metadata for agents
|
|
161
|
+
forge-doctor-data trace SPARK001 src/job.py:42 # why this finding fired
|
|
162
|
+
forge-doctor-data diagnose driver.log # fingerprint log errors (offline)
|
|
163
|
+
forge-doctor-data spark eventlog dir/ # executor loss, skew, spill, GC
|
|
164
|
+
forge-doctor-data lineage # static reads/writes graph
|
|
165
|
+
forge-doctor-data schema diff old.avsc new.avsc # breaking/compatible changes
|
|
166
|
+
forge-doctor-data graph # project intelligence graph
|
|
167
|
+
forge-doctor-data platform graph . # canonical platform graph census (+ --json)
|
|
168
|
+
forge-doctor-data platform blast-radius <entity> . # semantic impact traversal
|
|
169
|
+
forge-doctor-data suppressions # audit governed exceptions
|
|
170
|
+
forge-doctor-data iceberg inspect . # Iceberg model summary (ops/maintenance/risks)
|
|
171
|
+
forge-doctor-data iceberg merge . # MERGE posture: source, ON cols, partition pruning
|
|
172
|
+
forge-doctor-data iceberg files . # write APIs + small-file risk
|
|
173
|
+
forge-doctor-data iceberg compatibility # runtime x Iceberg compat from the packs
|
|
174
|
+
forge-doctor-data controlm inspect . # Control-M workflows-as-code (folders/jobs/events/risks)
|
|
175
|
+
forge-doctor-data airflow inspect . # Airflow DAGs/tasks/sensors/providers + parse-time risks
|
|
176
|
+
forge-doctor-data terraform inspect . # providers/modules/backends/reference graph
|
|
177
|
+
forge-doctor-data parquet inspect . # Parquet dataset stats + codec/write risks
|
|
178
|
+
forge-doctor-data stepfunctions inspect .# ASL machines: states, integrations, graph risks
|
|
179
|
+
forge-doctor-data streaming inspect . # streaming queries: source→sink, checkpoint, watermark
|
|
180
|
+
forge-doctor-data streaming diagnose . # progress-metrics diagnostics (rate/state/watermark)
|
|
181
|
+
forge-doctor-data streaming semantics . # derived delivery semantics per query
|
|
182
|
+
forge-doctor-data dynamodb inspect . # DynamoDB tables + access patterns
|
|
183
|
+
forge-doctor-data neptune inspect . # Neptune clusters + query shapes
|
|
184
|
+
forge-doctor-data lakeformation inspect .# governance, cross-account shares, tag usage
|
|
185
|
+
forge-doctor-data emr inspect . # EMR EC2/Serverless/EKS deep model
|
|
186
|
+
forge-doctor-data databricks inspect . # jobs/clusters/DBR/UC + bundles
|
|
187
|
+
forge-doctor-data delta inspect . # Delta tables, ops, protocol features
|
|
188
|
+
forge-doctor-data athena inspect . # workgroups, queries, result locations
|
|
189
|
+
forge-doctor-data lambda inspect . # functions, triggers, runtimes, data-plane calls
|
|
190
|
+
forge-doctor-data kafka inspect . # MSK clusters/topics/consumer groups
|
|
191
|
+
forge-doctor-data kinesis inspect . # streams, EFO, Firehose
|
|
192
|
+
forge-doctor-data flink inspect . # Flink jobs, state, checkpoints, savepoints
|
|
193
|
+
forge-doctor-data data-model inspect . # cross-domain access-style inspection
|
|
194
|
+
forge-doctor-data iac # IaC checks (Terraform/CloudFormation)
|
|
195
|
+
forge-doctor-data cache # incremental-analysis stats
|
|
196
|
+
forge-doctor-data sbom # CycloneDX 1.5 of the project
|
|
197
|
+
forge-doctor-data knowledge verify # pack freshness/provenance
|
|
198
|
+
forge-doctor-data knowledge audit # fresh/stale/expired/source status
|
|
199
|
+
forge-doctor-data doctor # environment self-check
|
|
200
|
+
forge-doctor-data mcp # JSON-RPC stdio server for agents
|
|
201
|
+
forge-doctor-data hosts # observe AI host CLIs; `hosts <h> --launch` opens one (TTY)
|
|
202
|
+
forge-doctor-data portal # optional local web UI over the real services (127.0.0.1)
|
|
203
|
+
forge-doctor-data agent manifest . # compact domains, risks, capabilities, refs
|
|
204
|
+
forge-doctor-data agent context . --budget 8000
|
|
205
|
+
forge-doctor-data agent delta . --since context.json
|
|
206
|
+
forge-doctor-data agent evidence entity:<id> .
|
|
207
|
+
forge-doctor-data collector validate evidence.json
|
|
208
|
+
forge-doctor-data inspect iceberg . # convergent: inspect <domain> (alias of `iceberg inspect`)
|
|
209
|
+
forge-doctor-data project status # generated status; --check gates doc drift
|
|
210
|
+
forge-doctor-data lsp # editor diagnostics (pip install .[lsp])
|
|
211
|
+
forge-doctor-data version
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
One scan can emit several reports — `--emit` is repeatable and takes
|
|
215
|
+
`FMT` (stdout) or `FMT:PATH`:
|
|
216
|
+
|
|
217
|
+
```bash
|
|
218
|
+
forge-doctor-data scan . --emit text --emit sarif:report.sarif --emit html:report.html
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
## Example output
|
|
222
|
+
|
|
223
|
+
```text
|
|
224
|
+
╭─ Forge Doctor Data ───────────────────────╮
|
|
225
|
+
│ Project /home/me/etl │
|
|
226
|
+
│ Version 1.0.0 │
|
|
227
|
+
│ Checks 51 │
|
|
228
|
+
╰──────────────────────────────────────╯
|
|
229
|
+
|
|
230
|
+
Python
|
|
231
|
+
✓ PY001 Python version
|
|
232
|
+
⚠ PY002 requires-python pyproject.toml
|
|
233
|
+
not declared
|
|
234
|
+
→ Declare requires-python in pyproject.toml
|
|
235
|
+
|
|
236
|
+
Spark
|
|
237
|
+
⚠ SPARK001 collect() src/jobs/customer.py:182 NEW
|
|
238
|
+
collect() moves all rows to the driver; verify the volume is bounded.
|
|
239
|
+
[confidence: high]
|
|
240
|
+
> df_final.collect()
|
|
241
|
+
|
|
242
|
+
╭─────────────── Summary ───────────────╮
|
|
243
|
+
│ Passed 17 Info 3 Warnings 4 Errors 0 │
|
|
244
|
+
│ 4 warning(s) │
|
|
245
|
+
│ baseline: +1 new, -2 fixed, 33 pre-existing │
|
|
246
|
+
╰──────────────────────────────────────────────╯
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
## Baselines
|
|
250
|
+
|
|
251
|
+
Save a scan once, then compare every later run against it — new findings get
|
|
252
|
+
a `NEW` marker and `--fail-on` only counts those, so pre-existing debt never
|
|
253
|
+
breaks CI:
|
|
254
|
+
|
|
255
|
+
```bash
|
|
256
|
+
forge-doctor-data scan . --save-baseline .forge-doctor-data-baseline.json
|
|
257
|
+
forge-doctor-data scan . --baseline .forge-doctor-data-baseline.json --fail-on warning
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
## HTML reports
|
|
261
|
+
|
|
262
|
+
```bash
|
|
263
|
+
forge-doctor-data scan . --format html --output report.html
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
Produces a single self-contained HTML file — same content as the terminal
|
|
267
|
+
report, shareable with the team. `--no-color` (or `NO_COLOR=1`) disables ANSI
|
|
268
|
+
colors; `--output` also works for plain text reports.
|
|
269
|
+
|
|
270
|
+
## Checks
|
|
271
|
+
|
|
272
|
+
| Category | IDs | Covers |
|
|
273
|
+
|---|---|---|
|
|
274
|
+
| repository | REP001–REP008 | pyproject/README/LICENSE/gitignore/tests/src layout/conflicting manifests/CI |
|
|
275
|
+
| python | PY001–PY007 | interpreter vs `requires-python`, venv, pytest/ruff/type-checker config |
|
|
276
|
+
| dependencies | DEP001–DEP006 | lock file, unrestricted deps, dev tools at runtime, duplicates |
|
|
277
|
+
| git | GIT001–GIT003 | repo initialized, tracked `.env`, tracked caches |
|
|
278
|
+
| spark | SPARK001–SPARK011 | `collect()`, `toPandas()`, `repartition(1)`, Python UDFs, actions in loops, cache w/o same-var unpersist, `.rdd`, Cartesian joins, global sort, `withColumn` in loops |
|
|
279
|
+
| aws | AWS001–AWS004 | CLI present, region configured, credentials detected (values never shown) |
|
|
280
|
+
| docker | DOCKER001–DOCKER004 | unpinned `FROM`, missing `USER`, secret-looking `ENV`/`ARG` names |
|
|
281
|
+
| glue | GLUE001–GLUE004 | awsglue usage, EOL runtimes, job params, DynamicFrame/DataFrame mixing |
|
|
282
|
+
| ci | CI001–CI004 | unpinned actions, missing python-version, missing test/lint steps |
|
|
283
|
+
| sql | SQL000–SQL003 | `SELECT *`, cartesian/comma joins, non-sargable predicates — needs the `[sql]` extra |
|
|
284
|
+
| iceberg | ICE000–ICE002, ICE008–ICE010, ICE012–ICE013, ICE020–ICE025 | IcebergProjectModel: format-version vs ops, maintenance gaps, catalog conflicts, Glue runtime compat, MERGE/write API risks |
|
|
285
|
+
| controlm | CTM000–CTM004, CTM009–CTM010, CTM028, CTM051, CTM070 | ControlMModel: Automation API defs — events produced/consumed, calendars, site standards, execution targets, credentials (names only) |
|
|
286
|
+
| airflow | AIR000–AIR004, AIR013, AIR021, AIR025, AIR040, AIR042, AIR100, AIR130 | AirflowModel: DAGs/tasks/edges/TaskFlow, parse-time calls, dynamic start_date, sensors (poke/deferrable/timeout), retries, providers vs pyproject |
|
|
287
|
+
| terraform | TF000–TF003, TF020–TF022, TF130 | TerraformProjectModel: required_version/providers, module pinning, local backend, reference graph |
|
|
288
|
+
| parquet | PARQ000, PARQ010, PARQ020–PARQ021, PARQ040–PARQ042 | ParquetProjectModel: write APIs, compression, small-file/dataset stats |
|
|
289
|
+
| stepfunctions | SFN000, SFN002–SFN003, SFN005, SFN010, SFN020 | StepFunctionsModel: ASL states/graphs, unreachable/dead-end states, sync timeouts, Distributed Map on Express |
|
|
290
|
+
| streaming | STREAM001–STREAM003, STREAM013–STREAM014, STREAM020, STREAM070, STREAM080 | StreamingProjectModel: Spark SS queries, checkpoint/watermark/stateful evidence, foreachBatch, derived delivery semantics |
|
|
291
|
+
| iac | IAC rules | CloudFormation + cross-IaC checks |
|
|
292
|
+
| dynamodb | DDB, DDBGT, DDBSTR rules | DynamoDBProjectModel: tables, indexes, streams, access patterns |
|
|
293
|
+
| neptune | NEP, NEPA, NEPCD, NEPGT rules | NeptuneProjectModel: clusters, query shapes, explain ingest |
|
|
294
|
+
| lakeformation | LF rules | LF permissions, cross-account shares, tag governance |
|
|
295
|
+
| platforms | EMR, DBX, DELTA rules | deep EMR (EC2/Serverless/EKS), Databricks jobs/UC, Delta protocol/features |
|
|
296
|
+
| serverless | ATH, LAM, SFN rules | Athena workgroups, Lambda functions/triggers, ASL machines |
|
|
297
|
+
| streaming-bus | KFK, KIN, FLK, STREAM rules | Kafka/MSK, Kinesis/EFO/Firehose, Flink state/checkpoints |
|
|
298
|
+
| graph | GRAPH rules | graph-model checks (queries, bulk loads, call sites) |
|
|
299
|
+
| platform | PLAT rules | cross-domain correlation (e.g. PLAT008–PLAT011) |
|
|
300
|
+
| architecture | ARCH rules | contract conformance + drift detection |
|
|
301
|
+
| policy | POLICY rules | suppressions audit, org policy-pack violations |
|
|
302
|
+
|
|
303
|
+
Full per-rule documentation (including *when it's OK*) lives in
|
|
304
|
+
[docs/checks.md](docs/checks.md).
|
|
305
|
+
|
|
306
|
+
## JSON output
|
|
307
|
+
|
|
308
|
+
```bash
|
|
309
|
+
forge-doctor-data scan . --format json
|
|
310
|
+
```
|
|
311
|
+
|
|
312
|
+
```json
|
|
313
|
+
{
|
|
314
|
+
"tool": {"name": "forge-doctor-data", "version": "1.0.0"},
|
|
315
|
+
"schema_version": "3.0",
|
|
316
|
+
"version": "1.0.0",
|
|
317
|
+
"project": {"name": "etl"},
|
|
318
|
+
"summary": {"passed": 17, "info": 3, "warnings": 4, "errors": 0},
|
|
319
|
+
"results": [
|
|
320
|
+
{"check_id": "SPARK001", "severity": "warning", "category": "spark",
|
|
321
|
+
"file": "src/jobs/customer.py", "line": 182, "message": "...", "recommendation": "...",
|
|
322
|
+
"fingerprint": "7998e28bb13c13ac", "confidence": "high",
|
|
323
|
+
"evidence": "df_final.collect()", "tags": ["performance"],
|
|
324
|
+
"is_new": true}
|
|
325
|
+
],
|
|
326
|
+
"baseline": {"new": 1, "fixed": 2, "existing": 33}
|
|
327
|
+
}
|
|
328
|
+
```
|
|
329
|
+
|
|
330
|
+
The JSON contract is stable and meant for CI, GitHub, and agent consumers —
|
|
331
|
+
`forge-doctor-data schema contracts` emits the JSON Schemas for every public
|
|
332
|
+
artifact, `forge-doctor-data contracts verify` validates artifacts against
|
|
333
|
+
them, and [docs/api.md](docs/api.md) +
|
|
334
|
+
[docs/contracts.md](docs/contracts.md) record the versioning and
|
|
335
|
+
interop rules.
|
|
336
|
+
Every finding carries a stable `fingerprint`; optional fields (`confidence`,
|
|
337
|
+
`evidence`, `evidence_kind`, `tags`, `docs_uri`, `source`, `fixable`,
|
|
338
|
+
`column`, `end_line`, `end_column`) appear only when set. `is_new`/`baseline`
|
|
339
|
+
appear only when `--baseline` is in use. `evidence_kind` classifies the fact's
|
|
340
|
+
source plane (`static`/`config`/`observed_metadata`/`runtime`/`derived`).
|
|
341
|
+
|
|
342
|
+
## SARIF & GitHub Code Scanning
|
|
343
|
+
|
|
344
|
+
```bash
|
|
345
|
+
forge-doctor-data scan . --format sarif -o forge-doctor-data.sarif
|
|
346
|
+
```
|
|
347
|
+
|
|
348
|
+
SARIF 2.1.0 with rules, locations, snippets, `partialFingerprints` and
|
|
349
|
+
`fixes` — upload via `github/codeql-action/upload-sarif` or use the
|
|
350
|
+
composite action in [action.yml](action.yml), which installs the CLI,
|
|
351
|
+
scans, and uploads SARIF in one step.
|
|
352
|
+
|
|
353
|
+
## Pre-commit
|
|
354
|
+
|
|
355
|
+
[.pre-commit-hooks.yaml](.pre-commit-hooks.yaml) ships a `forge-doctor-data`
|
|
356
|
+
hook; pre-commit feeds it the changed filenames via `--files`, so only the
|
|
357
|
+
files under review produce findings.
|
|
358
|
+
|
|
359
|
+
## Profiles
|
|
360
|
+
|
|
361
|
+
`--profile` re-maps severities per audience: `default`, `strict`
|
|
362
|
+
(info → warning), `security` (supply-chain findings escalate),
|
|
363
|
+
`spark-performance`, `glue-migration`, `production` (strict + security).
|
|
364
|
+
|
|
365
|
+
## Compatibility reports
|
|
366
|
+
|
|
367
|
+
```bash
|
|
368
|
+
forge-doctor-data compatibility . --to 6.0
|
|
369
|
+
forge-doctor-data migrate glue --from 4.0 --to 6.0
|
|
370
|
+
```
|
|
371
|
+
|
|
372
|
+
Detects the project's Glue/Spark/Python/Java/Iceberg environment and lists
|
|
373
|
+
migration risks from bundled **knowledge packs**
|
|
374
|
+
(`src/forge_doctor_data/knowledge/*/`), so version facts evolve without engine
|
|
375
|
+
changes. `migrate glue` adds real signals: version pins in code, DynamicFrame
|
|
376
|
+
usage, dependencies, and Terraform/CloudFormation pins.
|
|
377
|
+
|
|
378
|
+
## Runtime diagnosis
|
|
379
|
+
|
|
380
|
+
```bash
|
|
381
|
+
forge-doctor-data diagnose driver.log # known-error fingerprinting
|
|
382
|
+
forge-doctor-data spark eventlog dir/ # executor loss, skew, spill, GC
|
|
383
|
+
forge-doctor-data spark plan plan.txt # pathological physical-plan operators
|
|
384
|
+
forge-doctor-data spark logs executor.log # signatures + runtime patterns
|
|
385
|
+
```
|
|
386
|
+
|
|
387
|
+
Deterministic and offline: error signatures live in
|
|
388
|
+
`knowledge/errors/*.json`; event logs/plans are parsed with the stdlib.
|
|
389
|
+
|
|
390
|
+
## Data intelligence
|
|
391
|
+
|
|
392
|
+
```bash
|
|
393
|
+
forge-doctor-data lineage # datasets read/written per job
|
|
394
|
+
forge-doctor-data lineage --format openlineage
|
|
395
|
+
forge-doctor-data schema diff old.avsc new.avsc
|
|
396
|
+
forge-doctor-data schema diff HEAD~1...HEAD --path .
|
|
397
|
+
forge-doctor-data graph --format mermaid # jobs + datasets + infra + DAGs
|
|
398
|
+
```
|
|
399
|
+
|
|
400
|
+
Static lineage and the intelligence graph are built from the shared semantic
|
|
401
|
+
index — one `ast.parse` per file feeds Spark checks, Glue checks, lineage,
|
|
402
|
+
and `trace`. No target code is ever imported or executed.
|
|
403
|
+
|
|
404
|
+
## Incremental analysis & policy
|
|
405
|
+
|
|
406
|
+
`--cache` (default on locally, **off in CI** unless explicit) stores
|
|
407
|
+
per-file analysis facts in the platform user cache
|
|
408
|
+
(`%LOCALAPPDATA%\forge-doctor-data\cache`, `~/Library/Caches/forge-doctor-data`,
|
|
409
|
+
`$XDG_CACHE_HOME/forge-doctor-data`; override with `FORGE_DOCTOR_DATA_CACHE_DIR`) —
|
|
410
|
+
never inside the scanned repo, so a hostile checkout can't poison it.
|
|
411
|
+
Entries are keyed by repo + tool + analyzer schema version and carry
|
|
412
|
+
dependency provenance: editing a producer module re-analyzes its
|
|
413
|
+
importers. `forge-doctor-data cache` shows stats; `cache clean` removes it.
|
|
414
|
+
`--stats` reports per-check timings and cache hit rate on stderr.
|
|
415
|
+
|
|
416
|
+
```toml
|
|
417
|
+
[tool.forge-doctor-data.policy]
|
|
418
|
+
extends = "strict" # base profile
|
|
419
|
+
[tool.forge-doctor-data.policy.rules.SPARK001]
|
|
420
|
+
severity = "error" # per-rule override
|
|
421
|
+
[tool.forge-doctor-data.policy.rules.CI002]
|
|
422
|
+
enabled = false # kill switch
|
|
423
|
+
|
|
424
|
+
[[tool.forge-doctor-data.suppressions]]
|
|
425
|
+
rule = "SPARK001"
|
|
426
|
+
path = "src/legacy/**" # glob-scoped
|
|
427
|
+
reason = "migration in progress"
|
|
428
|
+
owner = "@data"
|
|
429
|
+
expires = "2026-12-31" # past expiry reactivates the finding
|
|
430
|
+
approved_by = "@sec-lead" # governance sign-off (POLICY011 if a pack requires it)
|
|
431
|
+
```
|
|
432
|
+
|
|
433
|
+
`forge-doctor-data suppressions` audits every exception as ACTIVE / EXPIRED /
|
|
434
|
+
UNUSED with owner and approver; expired ones emit `POLICY001` warnings
|
|
435
|
+
instead of suppressing. A policy pack with `require_approval: true`
|
|
436
|
+
makes unapproved suppressions emit `POLICY011` findings — and packs can
|
|
437
|
+
`extends:` a shared org pack (child rules override by id).
|
|
438
|
+
|
|
439
|
+
## Workspace
|
|
440
|
+
|
|
441
|
+
`forge-doctor-data workspace --path <dir>` discovers nested `pyproject.toml`
|
|
442
|
+
projects; `workspace scan` runs each and aggregates with a project prefix;
|
|
443
|
+
`workspace diff base...head` compares findings per subproject.
|
|
444
|
+
|
|
445
|
+
## Agent bundle
|
|
446
|
+
|
|
447
|
+
`--format agent` emits a minimal `{id, sev, loc, fp}` per finding —
|
|
448
|
+
built for LLM/agent consumers where every token counts; pair with
|
|
449
|
+
`forge-doctor-data explain <ID> --json` for full rule metadata on demand.
|
|
450
|
+
|
|
451
|
+
## Configuration
|
|
452
|
+
|
|
453
|
+
Zero configuration works. Optional, in the scanned project's `pyproject.toml`:
|
|
454
|
+
|
|
455
|
+
```toml
|
|
456
|
+
[tool.forge-doctor-data]
|
|
457
|
+
exclude = ["tests/fixtures/**"]
|
|
458
|
+
ignore = ["SPARK001"]
|
|
459
|
+
|
|
460
|
+
# Trust model: `trusted` gates BEFORE plugin code loads (distribution or
|
|
461
|
+
# entry-point names only - check ids can't gate code that hasn't run).
|
|
462
|
+
# `allow` additionally accepts check ids as a post-load filter.
|
|
463
|
+
[tool.forge-doctor-data.plugins]
|
|
464
|
+
trusted = ["forge-doctor-data-databricks"]
|
|
465
|
+
|
|
466
|
+
# Post-load per-check filter (requires the plugin to load first).
|
|
467
|
+
[tool.forge-doctor-data.plugins.checks]
|
|
468
|
+
enabled = ["DBX001", "DBX002"]
|
|
469
|
+
|
|
470
|
+
[tool.forge-doctor-data.aws]
|
|
471
|
+
ignore = ["AWS002"]
|
|
472
|
+
```
|
|
473
|
+
|
|
474
|
+
## Exit codes
|
|
475
|
+
|
|
476
|
+
`0` clean · `1` errors found (or `--fail-on warning` hit) · `2` internal/usage error.
|
|
477
|
+
|
|
478
|
+
## Integrations
|
|
479
|
+
|
|
480
|
+
- **MCP** (`forge-doctor-data mcp [--root DIR]`): zero-dependency JSON-RPC
|
|
481
|
+
stdio server — `scan_project`, `explain_rule`, `check_compatibility`,
|
|
482
|
+
`get_lineage`, `diagnose_log`, `diff_findings`, plus behavioral tools
|
|
483
|
+
`get_execution_baseline`, `get_regressions`, `get_runtime_correlations`,
|
|
484
|
+
`get_incident_explanation`, `get_critical_path`, `get_capacity_signals`,
|
|
485
|
+
`get_portfolio_summary`, and `forge-doctor-data://rules/ID` /
|
|
486
|
+
`forge-doctor-data://knowledge/D/N` resources. `--root` sandboxes every tool
|
|
487
|
+
path argument to that tree.
|
|
488
|
+
- **LSP** (`pipx inject forge-doctor-data pygls lsprotocol`, `forge-doctor-data lsp`):
|
|
489
|
+
publishes diagnostics on open/change/save, using the workspace root and
|
|
490
|
+
unsaved-buffer contents (debounced; clears resolved findings).
|
|
491
|
+
- **SBOM** (`forge-doctor-data sbom`): CycloneDX 1.5 covering all locked
|
|
492
|
+
dependencies (declared + transitive) with a dependency graph, plugins,
|
|
493
|
+
knowledge packs and forge-doctor-data itself; deterministic serial number.
|
|
494
|
+
|
|
495
|
+
## Architecture
|
|
496
|
+
|
|
497
|
+
```
|
|
498
|
+
cli/ (Typer) → ScanService → runner → checks → semantic index/analyzers
|
|
499
|
+
→ cache → renderers (Rich/JSON/JSONL/HTML/SARIF/agent)
|
|
500
|
+
|
|
501
|
+
beside it: platform graph → capabilities / semantic diff + change intel /
|
|
502
|
+
migration / what-if / workspace / fleet / history / contracts / lab /
|
|
503
|
+
golden / bench / policy packs
|
|
504
|
+
```
|
|
505
|
+
|
|
506
|
+
Checks are small classes implementing a `Check` protocol
|
|
507
|
+
(`id`/`title`/`category`/`run(ctx) -> list[CheckResult]`). They never print and
|
|
508
|
+
never see the terminal. See [docs/architecture.md](docs/architecture.md).
|
|
509
|
+
|
|
510
|
+
## Plugins
|
|
511
|
+
|
|
512
|
+
External packages contribute checks via the `forge_doctor_data.checks` entry-point
|
|
513
|
+
group — install with `pipx inject forge-doctor-data forge-doctor-data-<ext>`. A broken
|
|
514
|
+
plugin degrades to a warning, never a crash.
|
|
515
|
+
|
|
516
|
+
Plugins run in-process with the same privileges as the CLI — treat them as
|
|
517
|
+
trusted code. `--no-plugins` disables them per run;
|
|
518
|
+
`[tool.forge-doctor-data.plugins].allow` restricts which ones may load.
|
|
519
|
+
Plugin findings carry a `source` field naming their distribution.
|
|
520
|
+
|
|
521
|
+
## Development
|
|
522
|
+
|
|
523
|
+
```bash
|
|
524
|
+
git clone https://github.com/EdgarSocrates98/forge-doctor-data
|
|
525
|
+
cd forge-doctor-data
|
|
526
|
+
poetry install
|
|
527
|
+
poetry run forge-doctor-data scan .
|
|
528
|
+
poetry run pytest
|
|
529
|
+
poetry run ruff check .
|
|
530
|
+
poetry run mypy
|
|
531
|
+
```
|
|
532
|
+
|
|
533
|
+
## Contributing
|
|
534
|
+
|
|
535
|
+
See [CONTRIBUTING.md](CONTRIBUTING.md). New checks: implement the `Check`
|
|
536
|
+
protocol, pick a stable id, register it in the category module's `CHECKS` list,
|
|
537
|
+
add tests and a `docs/checks.md` entry.
|
|
538
|
+
|
|
539
|
+
## License
|
|
540
|
+
|
|
541
|
+
MIT — see [LICENSE](LICENSE).
|
|
542
|
+
|
|
543
|
+
## Graph Studio
|
|
544
|
+
|
|
545
|
+
`forge-doctor-data graph view|ui --path .` projects the evidence graph through
|
|
546
|
+
`forge/ForgeGraphView/v1` and serves the embedded local explorer (declinable at
|
|
547
|
+
install via `--components`). Full docs: `the-forge/docs/graph-studio/`.
|
|
548
|
+
|