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.
Files changed (433) hide show
  1. forge_doctor_data-1.0.0/LICENSE +21 -0
  2. forge_doctor_data-1.0.0/PKG-INFO +548 -0
  3. forge_doctor_data-1.0.0/README.md +513 -0
  4. forge_doctor_data-1.0.0/pyproject.toml +176 -0
  5. forge_doctor_data-1.0.0/src/forge_doctor_data/__init__.py +10 -0
  6. forge_doctor_data-1.0.0/src/forge_doctor_data/__main__.py +6 -0
  7. forge_doctor_data-1.0.0/src/forge_doctor_data/_forge_portal.py +913 -0
  8. forge_doctor_data-1.0.0/src/forge_doctor_data/_graphstudio.py +376 -0
  9. forge_doctor_data-1.0.0/src/forge_doctor_data/_graphview.py +181 -0
  10. forge_doctor_data-1.0.0/src/forge_doctor_data/_installkit.py +1706 -0
  11. forge_doctor_data-1.0.0/src/forge_doctor_data/analyzers/__init__.py +0 -0
  12. forge_doctor_data-1.0.0/src/forge_doctor_data/analyzers/abstractions.py +349 -0
  13. forge_doctor_data-1.0.0/src/forge_doctor_data/analyzers/airflow_model.py +661 -0
  14. forge_doctor_data-1.0.0/src/forge_doctor_data/analyzers/analytical_model.py +464 -0
  15. forge_doctor_data-1.0.0/src/forge_doctor_data/analyzers/athena_model.py +326 -0
  16. forge_doctor_data-1.0.0/src/forge_doctor_data/analyzers/azure_model.py +298 -0
  17. forge_doctor_data-1.0.0/src/forge_doctor_data/analyzers/bigquery_model.py +449 -0
  18. forge_doctor_data-1.0.0/src/forge_doctor_data/analyzers/controlm_model.py +435 -0
  19. forge_doctor_data-1.0.0/src/forge_doctor_data/analyzers/databricks_model.py +304 -0
  20. forge_doctor_data-1.0.0/src/forge_doctor_data/analyzers/datacontract_model.py +448 -0
  21. forge_doctor_data-1.0.0/src/forge_doctor_data/analyzers/dbt_model.py +424 -0
  22. forge_doctor_data-1.0.0/src/forge_doctor_data/analyzers/delta_model.py +299 -0
  23. forge_doctor_data-1.0.0/src/forge_doctor_data/analyzers/dynamodb_model.py +626 -0
  24. forge_doctor_data-1.0.0/src/forge_doctor_data/analyzers/emr_model.py +325 -0
  25. forge_doctor_data-1.0.0/src/forge_doctor_data/analyzers/execution_adapters.py +849 -0
  26. forge_doctor_data-1.0.0/src/forge_doctor_data/analyzers/flink_model.py +248 -0
  27. forge_doctor_data-1.0.0/src/forge_doctor_data/analyzers/gcp_model.py +305 -0
  28. forge_doctor_data-1.0.0/src/forge_doctor_data/analyzers/glue_ast.py +152 -0
  29. forge_doctor_data-1.0.0/src/forge_doctor_data/analyzers/graph_model.py +311 -0
  30. forge_doctor_data-1.0.0/src/forge_doctor_data/analyzers/graph_queries.py +454 -0
  31. forge_doctor_data-1.0.0/src/forge_doctor_data/analyzers/hcl_lite.py +202 -0
  32. forge_doctor_data-1.0.0/src/forge_doctor_data/analyzers/iceberg_model.py +471 -0
  33. forge_doctor_data-1.0.0/src/forge_doctor_data/analyzers/index.py +743 -0
  34. forge_doctor_data-1.0.0/src/forge_doctor_data/analyzers/kafka_model.py +324 -0
  35. forge_doctor_data-1.0.0/src/forge_doctor_data/analyzers/kinesis_model.py +288 -0
  36. forge_doctor_data-1.0.0/src/forge_doctor_data/analyzers/lakeformation_model.py +853 -0
  37. forge_doctor_data-1.0.0/src/forge_doctor_data/analyzers/lambda_model.py +382 -0
  38. forge_doctor_data-1.0.0/src/forge_doctor_data/analyzers/metadata_model.py +464 -0
  39. forge_doctor_data-1.0.0/src/forge_doctor_data/analyzers/neptune_explain.py +189 -0
  40. forge_doctor_data-1.0.0/src/forge_doctor_data/analyzers/neptune_model.py +671 -0
  41. forge_doctor_data-1.0.0/src/forge_doctor_data/analyzers/neptune_queries.py +147 -0
  42. forge_doctor_data-1.0.0/src/forge_doctor_data/analyzers/parquet_model.py +219 -0
  43. forge_doctor_data-1.0.0/src/forge_doctor_data/analyzers/platform_graph_builder.py +1757 -0
  44. forge_doctor_data-1.0.0/src/forge_doctor_data/analyzers/pyproject.py +100 -0
  45. forge_doctor_data-1.0.0/src/forge_doctor_data/analyzers/quality_model.py +500 -0
  46. forge_doctor_data-1.0.0/src/forge_doctor_data/analyzers/redshift_model.py +473 -0
  47. forge_doctor_data-1.0.0/src/forge_doctor_data/analyzers/runtime_evidence.py +1200 -0
  48. forge_doctor_data-1.0.0/src/forge_doctor_data/analyzers/search_model.py +492 -0
  49. forge_doctor_data-1.0.0/src/forge_doctor_data/analyzers/snowflake_model.py +429 -0
  50. forge_doctor_data-1.0.0/src/forge_doctor_data/analyzers/spark_ast.py +224 -0
  51. forge_doctor_data-1.0.0/src/forge_doctor_data/analyzers/sql_ast.py +288 -0
  52. forge_doctor_data-1.0.0/src/forge_doctor_data/analyzers/stepfunctions_model.py +334 -0
  53. forge_doctor_data-1.0.0/src/forge_doctor_data/analyzers/streaming_model.py +385 -0
  54. forge_doctor_data-1.0.0/src/forge_doctor_data/analyzers/streaming_runtime.py +295 -0
  55. forge_doctor_data-1.0.0/src/forge_doctor_data/analyzers/terraform_model.py +229 -0
  56. forge_doctor_data-1.0.0/src/forge_doctor_data/analyzers/trino_model.py +301 -0
  57. forge_doctor_data-1.0.0/src/forge_doctor_data/analyzers/warehouse_model.py +590 -0
  58. forge_doctor_data-1.0.0/src/forge_doctor_data/api.py +137 -0
  59. forge_doctor_data-1.0.0/src/forge_doctor_data/checks/__init__.py +113 -0
  60. forge_doctor_data-1.0.0/src/forge_doctor_data/checks/airflow.py +337 -0
  61. forge_doctor_data-1.0.0/src/forge_doctor_data/checks/analytical.py +479 -0
  62. forge_doctor_data-1.0.0/src/forge_doctor_data/checks/architecture.py +106 -0
  63. forge_doctor_data-1.0.0/src/forge_doctor_data/checks/aws.py +196 -0
  64. forge_doctor_data-1.0.0/src/forge_doctor_data/checks/azure.py +152 -0
  65. forge_doctor_data-1.0.0/src/forge_doctor_data/checks/bigquery.py +338 -0
  66. forge_doctor_data-1.0.0/src/forge_doctor_data/checks/ci.py +213 -0
  67. forge_doctor_data-1.0.0/src/forge_doctor_data/checks/cloud.py +139 -0
  68. forge_doctor_data-1.0.0/src/forge_doctor_data/checks/controlm.py +293 -0
  69. forge_doctor_data-1.0.0/src/forge_doctor_data/checks/datacontract.py +163 -0
  70. forge_doctor_data-1.0.0/src/forge_doctor_data/checks/dbt.py +205 -0
  71. forge_doctor_data-1.0.0/src/forge_doctor_data/checks/dependencies.py +308 -0
  72. forge_doctor_data-1.0.0/src/forge_doctor_data/checks/docker.py +217 -0
  73. forge_doctor_data-1.0.0/src/forge_doctor_data/checks/dynamodb.py +696 -0
  74. forge_doctor_data-1.0.0/src/forge_doctor_data/checks/gcp.py +150 -0
  75. forge_doctor_data-1.0.0/src/forge_doctor_data/checks/git_checks.py +126 -0
  76. forge_doctor_data-1.0.0/src/forge_doctor_data/checks/glue.py +203 -0
  77. forge_doctor_data-1.0.0/src/forge_doctor_data/checks/graph.py +639 -0
  78. forge_doctor_data-1.0.0/src/forge_doctor_data/checks/iac.py +266 -0
  79. forge_doctor_data-1.0.0/src/forge_doctor_data/checks/iceberg.py +491 -0
  80. forge_doctor_data-1.0.0/src/forge_doctor_data/checks/lakeformation.py +501 -0
  81. forge_doctor_data-1.0.0/src/forge_doctor_data/checks/metadata.py +315 -0
  82. forge_doctor_data-1.0.0/src/forge_doctor_data/checks/neptune.py +843 -0
  83. forge_doctor_data-1.0.0/src/forge_doctor_data/checks/parquet.py +226 -0
  84. forge_doctor_data-1.0.0/src/forge_doctor_data/checks/platform_rules.py +873 -0
  85. forge_doctor_data-1.0.0/src/forge_doctor_data/checks/platforms.py +588 -0
  86. forge_doctor_data-1.0.0/src/forge_doctor_data/checks/policy_pack.py +45 -0
  87. forge_doctor_data-1.0.0/src/forge_doctor_data/checks/python_env.py +254 -0
  88. forge_doctor_data-1.0.0/src/forge_doctor_data/checks/quality.py +252 -0
  89. forge_doctor_data-1.0.0/src/forge_doctor_data/checks/redshift.py +342 -0
  90. forge_doctor_data-1.0.0/src/forge_doctor_data/checks/repository.py +255 -0
  91. forge_doctor_data-1.0.0/src/forge_doctor_data/checks/search.py +221 -0
  92. forge_doctor_data-1.0.0/src/forge_doctor_data/checks/serverless.py +537 -0
  93. forge_doctor_data-1.0.0/src/forge_doctor_data/checks/snowflake.py +255 -0
  94. forge_doctor_data-1.0.0/src/forge_doctor_data/checks/spark.py +419 -0
  95. forge_doctor_data-1.0.0/src/forge_doctor_data/checks/sql.py +135 -0
  96. forge_doctor_data-1.0.0/src/forge_doctor_data/checks/stepfunctions.py +239 -0
  97. forge_doctor_data-1.0.0/src/forge_doctor_data/checks/streaming.py +234 -0
  98. forge_doctor_data-1.0.0/src/forge_doctor_data/checks/streaming_bus.py +512 -0
  99. forge_doctor_data-1.0.0/src/forge_doctor_data/checks/terraform.py +289 -0
  100. forge_doctor_data-1.0.0/src/forge_doctor_data/checks/trino.py +226 -0
  101. forge_doctor_data-1.0.0/src/forge_doctor_data/checks/warehouse.py +158 -0
  102. forge_doctor_data-1.0.0/src/forge_doctor_data/cli/__init__.py +228 -0
  103. forge_doctor_data-1.0.0/src/forge_doctor_data/cli/advise.py +74 -0
  104. forge_doctor_data-1.0.0/src/forge_doctor_data/cli/agent.py +79 -0
  105. forge_doctor_data-1.0.0/src/forge_doctor_data/cli/airflow.py +108 -0
  106. forge_doctor_data-1.0.0/src/forge_doctor_data/cli/analytical.py +71 -0
  107. forge_doctor_data-1.0.0/src/forge_doctor_data/cli/app.py +64 -0
  108. forge_doctor_data-1.0.0/src/forge_doctor_data/cli/bench.py +97 -0
  109. forge_doctor_data-1.0.0/src/forge_doctor_data/cli/bigquery.py +67 -0
  110. forge_doctor_data-1.0.0/src/forge_doctor_data/cli/capabilities.py +233 -0
  111. forge_doctor_data-1.0.0/src/forge_doctor_data/cli/catalog.py +57 -0
  112. forge_doctor_data-1.0.0/src/forge_doctor_data/cli/cloud.py +61 -0
  113. forge_doctor_data-1.0.0/src/forge_doctor_data/cli/collector.py +38 -0
  114. forge_doctor_data-1.0.0/src/forge_doctor_data/cli/common.py +867 -0
  115. forge_doctor_data-1.0.0/src/forge_doctor_data/cli/compatibility.py +211 -0
  116. forge_doctor_data-1.0.0/src/forge_doctor_data/cli/contract.py +147 -0
  117. forge_doctor_data-1.0.0/src/forge_doctor_data/cli/controlm.py +127 -0
  118. forge_doctor_data-1.0.0/src/forge_doctor_data/cli/datamodel.py +92 -0
  119. forge_doctor_data-1.0.0/src/forge_doctor_data/cli/dbt.py +80 -0
  120. forge_doctor_data-1.0.0/src/forge_doctor_data/cli/diff.py +320 -0
  121. forge_doctor_data-1.0.0/src/forge_doctor_data/cli/dynamodb.py +189 -0
  122. forge_doctor_data-1.0.0/src/forge_doctor_data/cli/export.py +39 -0
  123. forge_doctor_data-1.0.0/src/forge_doctor_data/cli/fix.py +153 -0
  124. forge_doctor_data-1.0.0/src/forge_doctor_data/cli/fleet.py +488 -0
  125. forge_doctor_data-1.0.0/src/forge_doctor_data/cli/golden.py +112 -0
  126. forge_doctor_data-1.0.0/src/forge_doctor_data/cli/graph.py +229 -0
  127. forge_doctor_data-1.0.0/src/forge_doctor_data/cli/history.py +213 -0
  128. forge_doctor_data-1.0.0/src/forge_doctor_data/cli/hosts.py +52 -0
  129. forge_doctor_data-1.0.0/src/forge_doctor_data/cli/iceberg.py +223 -0
  130. forge_doctor_data-1.0.0/src/forge_doctor_data/cli/incident.py +159 -0
  131. forge_doctor_data-1.0.0/src/forge_doctor_data/cli/inspect.py +79 -0
  132. forge_doctor_data-1.0.0/src/forge_doctor_data/cli/install_cmd.py +277 -0
  133. forge_doctor_data-1.0.0/src/forge_doctor_data/cli/lab.py +323 -0
  134. forge_doctor_data-1.0.0/src/forge_doctor_data/cli/lakeformation.py +194 -0
  135. forge_doctor_data-1.0.0/src/forge_doctor_data/cli/misc.py +1360 -0
  136. forge_doctor_data-1.0.0/src/forge_doctor_data/cli/neptune.py +213 -0
  137. forge_doctor_data-1.0.0/src/forge_doctor_data/cli/optimize.py +181 -0
  138. forge_doctor_data-1.0.0/src/forge_doctor_data/cli/parquet.py +70 -0
  139. forge_doctor_data-1.0.0/src/forge_doctor_data/cli/platform.py +123 -0
  140. forge_doctor_data-1.0.0/src/forge_doctor_data/cli/platforms.py +190 -0
  141. forge_doctor_data-1.0.0/src/forge_doctor_data/cli/plugins.py +223 -0
  142. forge_doctor_data-1.0.0/src/forge_doctor_data/cli/policy.py +230 -0
  143. forge_doctor_data-1.0.0/src/forge_doctor_data/cli/portal.py +75 -0
  144. forge_doctor_data-1.0.0/src/forge_doctor_data/cli/project.py +83 -0
  145. forge_doctor_data-1.0.0/src/forge_doctor_data/cli/quality.py +71 -0
  146. forge_doctor_data-1.0.0/src/forge_doctor_data/cli/redshift.py +74 -0
  147. forge_doctor_data-1.0.0/src/forge_doctor_data/cli/reliability.py +125 -0
  148. forge_doctor_data-1.0.0/src/forge_doctor_data/cli/remediate.py +86 -0
  149. forge_doctor_data-1.0.0/src/forge_doctor_data/cli/rootcause.py +129 -0
  150. forge_doctor_data-1.0.0/src/forge_doctor_data/cli/runtime.py +780 -0
  151. forge_doctor_data-1.0.0/src/forge_doctor_data/cli/scan.py +269 -0
  152. forge_doctor_data-1.0.0/src/forge_doctor_data/cli/search.py +78 -0
  153. forge_doctor_data-1.0.0/src/forge_doctor_data/cli/serverless.py +136 -0
  154. forge_doctor_data-1.0.0/src/forge_doctor_data/cli/snowflake.py +74 -0
  155. forge_doctor_data-1.0.0/src/forge_doctor_data/cli/stepfunctions.py +89 -0
  156. forge_doctor_data-1.0.0/src/forge_doctor_data/cli/streaming.py +182 -0
  157. forge_doctor_data-1.0.0/src/forge_doctor_data/cli/streaming_bus.py +177 -0
  158. forge_doctor_data-1.0.0/src/forge_doctor_data/cli/terraform.py +111 -0
  159. forge_doctor_data-1.0.0/src/forge_doctor_data/cli/trino.py +64 -0
  160. forge_doctor_data-1.0.0/src/forge_doctor_data/cli/twin.py +297 -0
  161. forge_doctor_data-1.0.0/src/forge_doctor_data/cli/whatif.py +291 -0
  162. forge_doctor_data-1.0.0/src/forge_doctor_data/cli/workspace.py +285 -0
  163. forge_doctor_data-1.0.0/src/forge_doctor_data/contracts/__init__.py +55 -0
  164. forge_doctor_data-1.0.0/src/forge_doctor_data/contracts/fixtures/capability.json +10 -0
  165. forge_doctor_data-1.0.0/src/forge_doctor_data/contracts/fixtures/diagnostic-manifest.json +32 -0
  166. forge_doctor_data-1.0.0/src/forge_doctor_data/contracts/fixtures/entity.json +13 -0
  167. forge_doctor_data-1.0.0/src/forge_doctor_data/contracts/fixtures/evidence.json +7 -0
  168. forge_doctor_data-1.0.0/src/forge_doctor_data/contracts/fixtures/finding.json +18 -0
  169. forge_doctor_data-1.0.0/src/forge_doctor_data/contracts/fixtures/handoff.json +78 -0
  170. forge_doctor_data-1.0.0/src/forge_doctor_data/contracts/fixtures/migration-plan.json +15 -0
  171. forge_doctor_data-1.0.0/src/forge_doctor_data/contracts/fixtures/relationship.json +8 -0
  172. forge_doctor_data-1.0.0/src/forge_doctor_data/contracts/fixtures/remediation-plan.json +16 -0
  173. forge_doctor_data-1.0.0/src/forge_doctor_data/contracts/fixtures/unknown-fact.json +8 -0
  174. forge_doctor_data-1.0.0/src/forge_doctor_data/contracts/models.py +668 -0
  175. forge_doctor_data-1.0.0/src/forge_doctor_data/contracts/schemas.py +231 -0
  176. forge_doctor_data-1.0.0/src/forge_doctor_data/contracts/version.py +63 -0
  177. forge_doctor_data-1.0.0/src/forge_doctor_data/core/__init__.py +0 -0
  178. forge_doctor_data-1.0.0/src/forge_doctor_data/core/agent_context.py +235 -0
  179. forge_doctor_data-1.0.0/src/forge_doctor_data/core/baseline.py +136 -0
  180. forge_doctor_data-1.0.0/src/forge_doctor_data/core/bench.py +216 -0
  181. forge_doctor_data-1.0.0/src/forge_doctor_data/core/cache.py +212 -0
  182. forge_doctor_data-1.0.0/src/forge_doctor_data/core/capabilities.py +630 -0
  183. forge_doctor_data-1.0.0/src/forge_doctor_data/core/capability_deps.py +435 -0
  184. forge_doctor_data-1.0.0/src/forge_doctor_data/core/capability_graph.py +131 -0
  185. forge_doctor_data-1.0.0/src/forge_doctor_data/core/capacity.py +481 -0
  186. forge_doctor_data-1.0.0/src/forge_doctor_data/core/change_correlation.py +510 -0
  187. forge_doctor_data-1.0.0/src/forge_doctor_data/core/change_intel.py +203 -0
  188. forge_doctor_data-1.0.0/src/forge_doctor_data/core/collectors.py +102 -0
  189. forge_doctor_data-1.0.0/src/forge_doctor_data/core/compat.py +133 -0
  190. forge_doctor_data-1.0.0/src/forge_doctor_data/core/config.py +216 -0
  191. forge_doctor_data-1.0.0/src/forge_doctor_data/core/conformance.py +161 -0
  192. forge_doctor_data-1.0.0/src/forge_doctor_data/core/context.py +222 -0
  193. forge_doctor_data-1.0.0/src/forge_doctor_data/core/contract.py +822 -0
  194. forge_doctor_data-1.0.0/src/forge_doctor_data/core/contract_adapters.py +106 -0
  195. forge_doctor_data-1.0.0/src/forge_doctor_data/core/contract_check.py +100 -0
  196. forge_doctor_data-1.0.0/src/forge_doctor_data/core/cost_drivers.py +717 -0
  197. forge_doctor_data-1.0.0/src/forge_doctor_data/core/critical_path.py +505 -0
  198. forge_doctor_data-1.0.0/src/forge_doctor_data/core/crossdomain.py +140 -0
  199. forge_doctor_data-1.0.0/src/forge_doctor_data/core/crossmigration.py +444 -0
  200. forge_doctor_data-1.0.0/src/forge_doctor_data/core/decisions.py +198 -0
  201. forge_doctor_data-1.0.0/src/forge_doctor_data/core/delivery.py +171 -0
  202. forge_doctor_data-1.0.0/src/forge_doctor_data/core/diagnose.py +231 -0
  203. forge_doctor_data-1.0.0/src/forge_doctor_data/core/diagnosis.py +673 -0
  204. forge_doctor_data-1.0.0/src/forge_doctor_data/core/errors.py +5 -0
  205. forge_doctor_data-1.0.0/src/forge_doctor_data/core/execution_history.py +664 -0
  206. forge_doctor_data-1.0.0/src/forge_doctor_data/core/execution_model.py +344 -0
  207. forge_doctor_data-1.0.0/src/forge_doctor_data/core/execution_store.py +104 -0
  208. forge_doctor_data-1.0.0/src/forge_doctor_data/core/experiments/__init__.py +46 -0
  209. forge_doctor_data-1.0.0/src/forge_doctor_data/core/experiments/fixture.py +264 -0
  210. forge_doctor_data-1.0.0/src/forge_doctor_data/core/experiments/measured.py +450 -0
  211. forge_doctor_data-1.0.0/src/forge_doctor_data/core/experiments_v2.py +33 -0
  212. forge_doctor_data-1.0.0/src/forge_doctor_data/core/fingerprint.py +205 -0
  213. forge_doctor_data-1.0.0/src/forge_doctor_data/core/fixes.py +357 -0
  214. forge_doctor_data-1.0.0/src/forge_doctor_data/core/fleet.py +143 -0
  215. forge_doctor_data-1.0.0/src/forge_doctor_data/core/forger.py +81 -0
  216. forge_doctor_data-1.0.0/src/forge_doctor_data/core/golden.py +266 -0
  217. forge_doctor_data-1.0.0/src/forge_doctor_data/core/graph.py +159 -0
  218. forge_doctor_data-1.0.0/src/forge_doctor_data/core/handoff.py +62 -0
  219. forge_doctor_data-1.0.0/src/forge_doctor_data/core/history.py +268 -0
  220. forge_doctor_data-1.0.0/src/forge_doctor_data/core/incident.py +491 -0
  221. forge_doctor_data-1.0.0/src/forge_doctor_data/core/incremental.py +404 -0
  222. forge_doctor_data-1.0.0/src/forge_doctor_data/core/knowledge.py +609 -0
  223. forge_doctor_data-1.0.0/src/forge_doctor_data/core/lab.py +868 -0
  224. forge_doctor_data-1.0.0/src/forge_doctor_data/core/lineage.py +262 -0
  225. forge_doctor_data-1.0.0/src/forge_doctor_data/core/metrics.py +131 -0
  226. forge_doctor_data-1.0.0/src/forge_doctor_data/core/migration/__init__.py +42 -0
  227. forge_doctor_data-1.0.0/src/forge_doctor_data/core/migration/cross_platform.py +541 -0
  228. forge_doctor_data-1.0.0/src/forge_doctor_data/core/migration/platform.py +341 -0
  229. forge_doctor_data-1.0.0/src/forge_doctor_data/core/migration_v2.py +36 -0
  230. forge_doctor_data-1.0.0/src/forge_doctor_data/core/models.py +187 -0
  231. forge_doctor_data-1.0.0/src/forge_doctor_data/core/ontology.py +256 -0
  232. forge_doctor_data-1.0.0/src/forge_doctor_data/core/optimization/__init__.py +34 -0
  233. forge_doctor_data-1.0.0/src/forge_doctor_data/core/optimization/evidence.py +497 -0
  234. forge_doctor_data-1.0.0/src/forge_doctor_data/core/optimization/static.py +219 -0
  235. forge_doctor_data-1.0.0/src/forge_doctor_data/core/optimize.py +10 -0
  236. forge_doctor_data-1.0.0/src/forge_doctor_data/core/optimize_v2.py +27 -0
  237. forge_doctor_data-1.0.0/src/forge_doctor_data/core/performance.py +743 -0
  238. forge_doctor_data-1.0.0/src/forge_doctor_data/core/physical_design.py +252 -0
  239. forge_doctor_data-1.0.0/src/forge_doctor_data/core/platform_graph.py +244 -0
  240. forge_doctor_data-1.0.0/src/forge_doctor_data/core/platform_ontology.py +1163 -0
  241. forge_doctor_data-1.0.0/src/forge_doctor_data/core/policy.py +137 -0
  242. forge_doctor_data-1.0.0/src/forge_doctor_data/core/policy_pack.py +522 -0
  243. forge_doctor_data-1.0.0/src/forge_doctor_data/core/portfolio.py +626 -0
  244. forge_doctor_data-1.0.0/src/forge_doctor_data/core/profiles.py +63 -0
  245. forge_doctor_data-1.0.0/src/forge_doctor_data/core/project_info.py +79 -0
  246. forge_doctor_data-1.0.0/src/forge_doctor_data/core/project_status.py +205 -0
  247. forge_doctor_data-1.0.0/src/forge_doctor_data/core/registry.py +48 -0
  248. forge_doctor_data-1.0.0/src/forge_doctor_data/core/regression.py +540 -0
  249. forge_doctor_data-1.0.0/src/forge_doctor_data/core/reliability.py +757 -0
  250. forge_doctor_data-1.0.0/src/forge_doctor_data/core/remediation.py +177 -0
  251. forge_doctor_data-1.0.0/src/forge_doctor_data/core/runner.py +158 -0
  252. forge_doctor_data-1.0.0/src/forge_doctor_data/core/runtime_evidence.py +119 -0
  253. forge_doctor_data-1.0.0/src/forge_doctor_data/core/sbom.py +261 -0
  254. forge_doctor_data-1.0.0/src/forge_doctor_data/core/scaffold.py +129 -0
  255. forge_doctor_data-1.0.0/src/forge_doctor_data/core/schema.py +241 -0
  256. forge_doctor_data-1.0.0/src/forge_doctor_data/core/schema_compat.py +504 -0
  257. forge_doctor_data-1.0.0/src/forge_doctor_data/core/schemas.py +464 -0
  258. forge_doctor_data-1.0.0/src/forge_doctor_data/core/semantic_diff.py +352 -0
  259. forge_doctor_data-1.0.0/src/forge_doctor_data/core/service.py +272 -0
  260. forge_doctor_data-1.0.0/src/forge_doctor_data/core/spark_runtime.py +352 -0
  261. forge_doctor_data-1.0.0/src/forge_doctor_data/core/sql_portability.py +342 -0
  262. forge_doctor_data-1.0.0/src/forge_doctor_data/core/traversal.py +56 -0
  263. forge_doctor_data-1.0.0/src/forge_doctor_data/core/trends.py +175 -0
  264. forge_doctor_data-1.0.0/src/forge_doctor_data/core/twin.py +197 -0
  265. forge_doctor_data-1.0.0/src/forge_doctor_data/core/twin_states.py +528 -0
  266. forge_doctor_data-1.0.0/src/forge_doctor_data/core/whatif.py +411 -0
  267. forge_doctor_data-1.0.0/src/forge_doctor_data/core/workspace.py +314 -0
  268. forge_doctor_data-1.0.0/src/forge_doctor_data/graphview.py +77 -0
  269. forge_doctor_data-1.0.0/src/forge_doctor_data/install/__init__.py +14 -0
  270. forge_doctor_data-1.0.0/src/forge_doctor_data/install/service.py +337 -0
  271. forge_doctor_data-1.0.0/src/forge_doctor_data/integrations/__init__.py +1 -0
  272. forge_doctor_data-1.0.0/src/forge_doctor_data/integrations/hostflow.py +259 -0
  273. forge_doctor_data-1.0.0/src/forge_doctor_data/integrations/lsp_server.py +197 -0
  274. forge_doctor_data-1.0.0/src/forge_doctor_data/integrations/mcp_protocol.py +126 -0
  275. forge_doctor_data-1.0.0/src/forge_doctor_data/integrations/mcp_server.py +653 -0
  276. forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/airflow/objects.json +52 -0
  277. forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/athena/engines.json +27 -0
  278. forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/capabilities/adls.json +43 -0
  279. forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/capabilities/athena.json +72 -0
  280. forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/capabilities/azure_fabric.json +33 -0
  281. forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/capabilities/bigquery.json +75 -0
  282. forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/capabilities/cloud.json +180 -0
  283. forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/capabilities/databricks.json +55 -0
  284. forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/capabilities/dataflow.json +33 -0
  285. forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/capabilities/dataplex.json +33 -0
  286. forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/capabilities/dataproc.json +33 -0
  287. forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/capabilities/delta.json +120 -0
  288. forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/capabilities/dynamodb.json +154 -0
  289. forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/capabilities/emr.json +57 -0
  290. forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/capabilities/eventhubs.json +33 -0
  291. forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/capabilities/flink.json +41 -0
  292. forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/capabilities/glue.json +83 -0
  293. forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/capabilities/graph.json +83 -0
  294. forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/capabilities/iceberg.json +60 -0
  295. forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/capabilities/kafka.json +48 -0
  296. forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/capabilities/kinesis.json +41 -0
  297. forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/capabilities/lakeformation.json +91 -0
  298. forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/capabilities/lambda.json +56 -0
  299. forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/capabilities/neptune.json +128 -0
  300. forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/capabilities/pubsub.json +41 -0
  301. forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/capabilities/purview.json +33 -0
  302. forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/capabilities/redshift.json +83 -0
  303. forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/capabilities/search.json +90 -0
  304. forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/capabilities/snowflake.json +83 -0
  305. forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/capabilities/synapse.json +33 -0
  306. forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/capabilities/trino.json +125 -0
  307. forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/capabilities/warehouse.json +80 -0
  308. forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/capacity/bigquery.json +30 -0
  309. forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/capacity/redshift.json +29 -0
  310. forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/capacity/snowflake.json +31 -0
  311. forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/capacity/trino.json +29 -0
  312. forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/controlm/objects.json +82 -0
  313. forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/cost_drivers/drivers.json +52 -0
  314. forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/cost_drivers/thresholds.json +35 -0
  315. forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/databricks/runtime.json +47 -0
  316. forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/delta/features.json +48 -0
  317. forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/dynamodb/global-tables.json +33 -0
  318. forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/dynamodb/indexes.json +38 -0
  319. forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/dynamodb/limits.json +32 -0
  320. forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/dynamodb/modeling.json +33 -0
  321. forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/dynamodb/streams.json +33 -0
  322. forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/dynamodb/transactions.json +33 -0
  323. forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/emr/releases.json +36 -0
  324. forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/errors/airflow.json +100 -0
  325. forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/errors/controlm.json +101 -0
  326. forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/errors/databricks.json +69 -0
  327. forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/errors/glue.json +134 -0
  328. forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/errors/iceberg.json +67 -0
  329. forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/errors/python.json +115 -0
  330. forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/errors/spark.json +195 -0
  331. forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/flink/config.json +33 -0
  332. forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/glue/compatibility.json +68 -0
  333. forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/glue/versions.json +58 -0
  334. forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/graph/algorithms.json +21 -0
  335. forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/graph/modeling.json +38 -0
  336. forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/graph/property-graph.json +39 -0
  337. forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/graph/rdf.json +32 -0
  338. forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/iceberg/compatibility.json +60 -0
  339. forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/iceberg/spec.json +58 -0
  340. forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/iceberg/versions.json +40 -0
  341. forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/kafka/config.json +50 -0
  342. forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/kinesis/config.json +33 -0
  343. forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/lakeformation/cross-account.json +37 -0
  344. forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/lakeformation/errors.json +240 -0
  345. forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/lakeformation/hybrid.json +27 -0
  346. forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/lakeformation/permissions.json +67 -0
  347. forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/lambda/runtimes.json +27 -0
  348. forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/neptune/analytics.json +22 -0
  349. forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/neptune/bulk-loader.json +26 -0
  350. forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/neptune/compatibility.json +22 -0
  351. forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/neptune/engines.json +22 -0
  352. forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/neptune/explain.json +22 -0
  353. forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/neptune/features.json +28 -0
  354. forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/neptune/global-database.json +21 -0
  355. forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/neptune/ingestion.json +21 -0
  356. forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/neptune/products.json +22 -0
  357. forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/neptune/query-languages.json +33 -0
  358. forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/parquet/format.json +22 -0
  359. forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/performance/engines.json +95 -0
  360. forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/performance/regression.json +38 -0
  361. forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/performance/thresholds.json +51 -0
  362. forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/python/compatibility.json +21 -0
  363. forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/reliability/engines.json +65 -0
  364. forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/remediation/chains.json +157 -0
  365. forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/remediation/iceberg.json +167 -0
  366. forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/remediation/parquet.json +133 -0
  367. forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/remediation/platform.json +96 -0
  368. forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/remediation/spark.json +160 -0
  369. forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/remediation/streaming.json +106 -0
  370. forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/spark/versions.json +27 -0
  371. forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/stepfunctions/integrations.json +20 -0
  372. forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/stepfunctions/query-languages.json +47 -0
  373. forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/streaming/delivery.json +59 -0
  374. forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/streaming/spark/stateful_ops.json +22 -0
  375. forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/terraform/language.json +31 -0
  376. forge_doctor_data-1.0.0/src/forge_doctor_data/knowledge/terraform/providers.json +36 -0
  377. forge_doctor_data-1.0.0/src/forge_doctor_data/output/__init__.py +0 -0
  378. forge_doctor_data-1.0.0/src/forge_doctor_data/output/agent_renderer.py +53 -0
  379. forge_doctor_data-1.0.0/src/forge_doctor_data/output/console.py +252 -0
  380. forge_doctor_data-1.0.0/src/forge_doctor_data/output/html_renderer.py +25 -0
  381. forge_doctor_data-1.0.0/src/forge_doctor_data/output/json_renderer.py +105 -0
  382. forge_doctor_data-1.0.0/src/forge_doctor_data/output/sarif_renderer.py +103 -0
  383. forge_doctor_data-1.0.0/src/forge_doctor_data/output/summary.py +28 -0
  384. forge_doctor_data-1.0.0/src/forge_doctor_data/plugins/__init__.py +0 -0
  385. forge_doctor_data-1.0.0/src/forge_doctor_data/plugins/discovery.py +359 -0
  386. forge_doctor_data-1.0.0/src/forge_doctor_data/plugins/isolation.py +291 -0
  387. forge_doctor_data-1.0.0/src/forge_doctor_data/plugins/manager.py +276 -0
  388. forge_doctor_data-1.0.0/src/forge_doctor_data/plugins/protocol.py +176 -0
  389. forge_doctor_data-1.0.0/src/forge_doctor_data/portal_adapter.py +750 -0
  390. forge_doctor_data-1.0.0/src/forge_doctor_data/portal_assets/chunk-7_l-b4Tr.js +1 -0
  391. forge_doctor_data-1.0.0/src/forge_doctor_data/portal_assets/chunk-B0Iad6pD.js +1 -0
  392. forge_doctor_data-1.0.0/src/forge_doctor_data/portal_assets/chunk-B605XnCF.js +1 -0
  393. forge_doctor_data-1.0.0/src/forge_doctor_data/portal_assets/chunk-B7N3TXcn.js +1 -0
  394. forge_doctor_data-1.0.0/src/forge_doctor_data/portal_assets/chunk-BAj6yGem.js +1 -0
  395. forge_doctor_data-1.0.0/src/forge_doctor_data/portal_assets/chunk-BGUitn2r.js +1 -0
  396. forge_doctor_data-1.0.0/src/forge_doctor_data/portal_assets/chunk-BVKnCv85.js +1 -0
  397. forge_doctor_data-1.0.0/src/forge_doctor_data/portal_assets/chunk-BYyM9V_w.js +1 -0
  398. forge_doctor_data-1.0.0/src/forge_doctor_data/portal_assets/chunk-BaQMhq-G.js +1 -0
  399. forge_doctor_data-1.0.0/src/forge_doctor_data/portal_assets/chunk-BavOrxVm.js +1 -0
  400. forge_doctor_data-1.0.0/src/forge_doctor_data/portal_assets/chunk-Bb0C24YV.js +1 -0
  401. forge_doctor_data-1.0.0/src/forge_doctor_data/portal_assets/chunk-BfCFGPzs.js +1 -0
  402. forge_doctor_data-1.0.0/src/forge_doctor_data/portal_assets/chunk-C2t4OUVu.js +1 -0
  403. forge_doctor_data-1.0.0/src/forge_doctor_data/portal_assets/chunk-C3pI4QjU.js +1 -0
  404. forge_doctor_data-1.0.0/src/forge_doctor_data/portal_assets/chunk-C4gpbtbP.js +1 -0
  405. forge_doctor_data-1.0.0/src/forge_doctor_data/portal_assets/chunk-CGWeHhKY.js +1 -0
  406. forge_doctor_data-1.0.0/src/forge_doctor_data/portal_assets/chunk-CJCT86Dr.js +1 -0
  407. forge_doctor_data-1.0.0/src/forge_doctor_data/portal_assets/chunk-CXcsLDPJ.js +1 -0
  408. forge_doctor_data-1.0.0/src/forge_doctor_data/portal_assets/chunk-CcjxoLxw.js +1 -0
  409. forge_doctor_data-1.0.0/src/forge_doctor_data/portal_assets/chunk-D-gBPXHa.js +1 -0
  410. forge_doctor_data-1.0.0/src/forge_doctor_data/portal_assets/chunk-D3eZogIe.js +1 -0
  411. forge_doctor_data-1.0.0/src/forge_doctor_data/portal_assets/chunk-DQU0VyoQ.js +1 -0
  412. forge_doctor_data-1.0.0/src/forge_doctor_data/portal_assets/chunk-DqWNkF1O.js +1 -0
  413. forge_doctor_data-1.0.0/src/forge_doctor_data/portal_assets/chunk-DuPPkSIE.js +3 -0
  414. forge_doctor_data-1.0.0/src/forge_doctor_data/portal_assets/chunk-DyIHOW_a.js +1 -0
  415. forge_doctor_data-1.0.0/src/forge_doctor_data/portal_assets/chunk-Fx4zSGL5.js +1 -0
  416. forge_doctor_data-1.0.0/src/forge_doctor_data/portal_assets/chunk-UBKt05Rg.js +1 -0
  417. forge_doctor_data-1.0.0/src/forge_doctor_data/portal_assets/chunk-htnJDQEY.js +1 -0
  418. forge_doctor_data-1.0.0/src/forge_doctor_data/portal_assets/chunk-kXRFMGqe.js +1 -0
  419. forge_doctor_data-1.0.0/src/forge_doctor_data/portal_assets/chunk-qe3u763a.js +1 -0
  420. forge_doctor_data-1.0.0/src/forge_doctor_data/portal_assets/favicon.ico +0 -0
  421. forge_doctor_data-1.0.0/src/forge_doctor_data/portal_assets/index.html +13 -0
  422. forge_doctor_data-1.0.0/src/forge_doctor_data/portal_assets/main-QDFVZK3T.js +5 -0
  423. forge_doctor_data-1.0.0/src/forge_doctor_data/portal_assets/styles-MQEBDFDX.css +1 -0
  424. forge_doctor_data-1.0.0/src/forge_doctor_data/sdk.py +64 -0
  425. forge_doctor_data-1.0.0/src/forge_doctor_data/ui/__init__.py +28 -0
  426. forge_doctor_data-1.0.0/src/forge_doctor_data/ui/app.py +529 -0
  427. forge_doctor_data-1.0.0/src/forge_doctor_data/ui/home.py +114 -0
  428. forge_doctor_data-1.0.0/src/forge_doctor_data/ui/i18n.py +143 -0
  429. forge_doctor_data-1.0.0/src/forge_doctor_data/ui/kit.py +689 -0
  430. forge_doctor_data-1.0.0/src/forge_doctor_data/ui/screen.py +648 -0
  431. forge_doctor_data-1.0.0/src/forge_doctor_data/ui/tui.py +106 -0
  432. forge_doctor_data-1.0.0/src/forge_doctor_data/ui/wizard.py +309 -0
  433. 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
+