data-sentinel-forge 0.5.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data_sentinel_forge-0.5.0/.gitignore +38 -0
- data_sentinel_forge-0.5.0/CHANGELOG.md +149 -0
- data_sentinel_forge-0.5.0/LICENSE +182 -0
- data_sentinel_forge-0.5.0/PKG-INFO +236 -0
- data_sentinel_forge-0.5.0/README.md +195 -0
- data_sentinel_forge-0.5.0/examples/README.md +54 -0
- data_sentinel_forge-0.5.0/frontend/README.md +75 -0
- data_sentinel_forge-0.5.0/frontend/src/app/app.component.css +188 -0
- data_sentinel_forge-0.5.0/frontend/src/app/app.component.html +108 -0
- data_sentinel_forge-0.5.0/frontend/src/app/app.component.spec.ts +51 -0
- data_sentinel_forge-0.5.0/frontend/src/app/app.component.ts +118 -0
- data_sentinel_forge-0.5.0/frontend/src/app/app.config.ts +32 -0
- data_sentinel_forge-0.5.0/frontend/src/app/app.routes.ts +173 -0
- data_sentinel_forge-0.5.0/frontend/src/app/core/api-error.store.ts +22 -0
- data_sentinel_forge-0.5.0/frontend/src/app/core/api.models.ts +594 -0
- data_sentinel_forge-0.5.0/frontend/src/app/core/api.service.spec.ts +253 -0
- data_sentinel_forge-0.5.0/frontend/src/app/core/api.service.ts +290 -0
- data_sentinel_forge-0.5.0/frontend/src/app/core/http-error.interceptor.ts +63 -0
- data_sentinel_forge-0.5.0/frontend/src/app/core/i18n/i18n.service.spec.ts +29 -0
- data_sentinel_forge-0.5.0/frontend/src/app/core/i18n/i18n.service.ts +62 -0
- data_sentinel_forge-0.5.0/frontend/src/app/core/i18n/localized-title.strategy.ts +28 -0
- data_sentinel_forge-0.5.0/frontend/src/app/core/i18n/translate.pipe.ts +16 -0
- data_sentinel_forge-0.5.0/frontend/src/app/core/i18n/translations.ts +1542 -0
- data_sentinel_forge-0.5.0/frontend/src/app/core/nav-icon.component.ts +82 -0
- data_sentinel_forge-0.5.0/frontend/src/app/core/session/auth.guard.spec.ts +67 -0
- data_sentinel_forge-0.5.0/frontend/src/app/core/session/auth.guard.ts +34 -0
- data_sentinel_forge-0.5.0/frontend/src/app/core/session/auth.interceptor.spec.ts +99 -0
- data_sentinel_forge-0.5.0/frontend/src/app/core/session/auth.interceptor.ts +58 -0
- data_sentinel_forge-0.5.0/frontend/src/app/core/session/session-tokens.ts +16 -0
- data_sentinel_forge-0.5.0/frontend/src/app/core/session/session.service.spec.ts +119 -0
- data_sentinel_forge-0.5.0/frontend/src/app/core/session/session.service.ts +147 -0
- data_sentinel_forge-0.5.0/frontend/src/app/core/session/sse-fetch.spec.ts +125 -0
- data_sentinel_forge-0.5.0/frontend/src/app/core/session/sse-fetch.ts +106 -0
- data_sentinel_forge-0.5.0/frontend/src/app/core/theme.service.ts +49 -0
- data_sentinel_forge-0.5.0/frontend/src/app/features/agents/agents.component.css +193 -0
- data_sentinel_forge-0.5.0/frontend/src/app/features/agents/agents.component.html +211 -0
- data_sentinel_forge-0.5.0/frontend/src/app/features/agents/agents.component.spec.ts +140 -0
- data_sentinel_forge-0.5.0/frontend/src/app/features/agents/agents.component.ts +108 -0
- data_sentinel_forge-0.5.0/frontend/src/app/features/dashboard/dashboard.component.css +112 -0
- data_sentinel_forge-0.5.0/frontend/src/app/features/dashboard/dashboard.component.html +90 -0
- data_sentinel_forge-0.5.0/frontend/src/app/features/dashboard/dashboard.component.ts +63 -0
- data_sentinel_forge-0.5.0/frontend/src/app/features/evidence-graph/evidence-graph.component.css +186 -0
- data_sentinel_forge-0.5.0/frontend/src/app/features/evidence-graph/evidence-graph.component.html +311 -0
- data_sentinel_forge-0.5.0/frontend/src/app/features/evidence-graph/evidence-graph.component.spec.ts +131 -0
- data_sentinel_forge-0.5.0/frontend/src/app/features/evidence-graph/evidence-graph.component.ts +157 -0
- data_sentinel_forge-0.5.0/frontend/src/app/features/evidence-graph/evidence-graph.model.spec.ts +176 -0
- data_sentinel_forge-0.5.0/frontend/src/app/features/evidence-graph/evidence-graph.model.ts +362 -0
- data_sentinel_forge-0.5.0/frontend/src/app/features/evidence-graph/graph-canvas.component.ts +459 -0
- data_sentinel_forge-0.5.0/frontend/src/app/features/investigations/investigation-detail.component.css +299 -0
- data_sentinel_forge-0.5.0/frontend/src/app/features/investigations/investigation-detail.component.html +581 -0
- data_sentinel_forge-0.5.0/frontend/src/app/features/investigations/investigation-detail.component.spec.ts +147 -0
- data_sentinel_forge-0.5.0/frontend/src/app/features/investigations/investigation-detail.component.ts +250 -0
- data_sentinel_forge-0.5.0/frontend/src/app/features/investigations/investigation-new.component.css +146 -0
- data_sentinel_forge-0.5.0/frontend/src/app/features/investigations/investigation-new.component.html +146 -0
- data_sentinel_forge-0.5.0/frontend/src/app/features/investigations/investigation-new.component.spec.ts +134 -0
- data_sentinel_forge-0.5.0/frontend/src/app/features/investigations/investigation-new.component.ts +159 -0
- data_sentinel_forge-0.5.0/frontend/src/app/features/investigations/investigation-stream.service.spec.ts +147 -0
- data_sentinel_forge-0.5.0/frontend/src/app/features/investigations/investigation-stream.service.ts +105 -0
- data_sentinel_forge-0.5.0/frontend/src/app/features/investigations/investigations.component.css +160 -0
- data_sentinel_forge-0.5.0/frontend/src/app/features/investigations/investigations.component.html +194 -0
- data_sentinel_forge-0.5.0/frontend/src/app/features/investigations/investigations.component.spec.ts +72 -0
- data_sentinel_forge-0.5.0/frontend/src/app/features/investigations/investigations.component.ts +187 -0
- data_sentinel_forge-0.5.0/frontend/src/app/features/operations/compare-result.component.ts +310 -0
- data_sentinel_forge-0.5.0/frontend/src/app/features/operations/operations-dashboard.component.css +88 -0
- data_sentinel_forge-0.5.0/frontend/src/app/features/operations/operations-dashboard.component.html +141 -0
- data_sentinel_forge-0.5.0/frontend/src/app/features/operations/operations-dashboard.component.ts +138 -0
- data_sentinel_forge-0.5.0/frontend/src/app/features/operations/ops-nav.component.ts +91 -0
- data_sentinel_forge-0.5.0/frontend/src/app/features/operations/regression-explorer.component.css +95 -0
- data_sentinel_forge-0.5.0/frontend/src/app/features/operations/regression-explorer.component.html +170 -0
- data_sentinel_forge-0.5.0/frontend/src/app/features/operations/regression-explorer.component.ts +224 -0
- data_sentinel_forge-0.5.0/frontend/src/app/features/operations/regression-findings.component.ts +156 -0
- data_sentinel_forge-0.5.0/frontend/src/app/features/operations/remediation-workspace.component.css +266 -0
- data_sentinel_forge-0.5.0/frontend/src/app/features/operations/remediation-workspace.component.html +740 -0
- data_sentinel_forge-0.5.0/frontend/src/app/features/operations/remediation-workspace.component.spec.ts +267 -0
- data_sentinel_forge-0.5.0/frontend/src/app/features/operations/remediation-workspace.component.ts +484 -0
- data_sentinel_forge-0.5.0/frontend/src/app/features/operations/watch-center.component.css +182 -0
- data_sentinel_forge-0.5.0/frontend/src/app/features/operations/watch-center.component.html +409 -0
- data_sentinel_forge-0.5.0/frontend/src/app/features/operations/watch-center.component.spec.ts +173 -0
- data_sentinel_forge-0.5.0/frontend/src/app/features/operations/watch-center.component.ts +332 -0
- data_sentinel_forge-0.5.0/frontend/src/app/features/operations/workload-timeline.component.css +160 -0
- data_sentinel_forge-0.5.0/frontend/src/app/features/operations/workload-timeline.component.html +237 -0
- data_sentinel_forge-0.5.0/frontend/src/app/features/operations/workload-timeline.component.ts +232 -0
- data_sentinel_forge-0.5.0/frontend/src/app/features/quality-lineage/quality-lineage.component.css +257 -0
- data_sentinel_forge-0.5.0/frontend/src/app/features/quality-lineage/quality-lineage.component.html +429 -0
- data_sentinel_forge-0.5.0/frontend/src/app/features/quality-lineage/quality-lineage.component.spec.ts +199 -0
- data_sentinel_forge-0.5.0/frontend/src/app/features/quality-lineage/quality-lineage.component.ts +239 -0
- data_sentinel_forge-0.5.0/frontend/src/app/features/quality-lineage/quality-lineage.model.ts +133 -0
- data_sentinel_forge-0.5.0/frontend/src/app/features/reports/reports.component.css +187 -0
- data_sentinel_forge-0.5.0/frontend/src/app/features/reports/reports.component.html +268 -0
- data_sentinel_forge-0.5.0/frontend/src/app/features/reports/reports.component.spec.ts +167 -0
- data_sentinel_forge-0.5.0/frontend/src/app/features/reports/reports.component.ts +265 -0
- data_sentinel_forge-0.5.0/frontend/src/app/features/session-gate/session-gate.component.css +92 -0
- data_sentinel_forge-0.5.0/frontend/src/app/features/session-gate/session-gate.component.html +42 -0
- data_sentinel_forge-0.5.0/frontend/src/app/features/session-gate/session-gate.component.spec.ts +118 -0
- data_sentinel_forge-0.5.0/frontend/src/app/features/session-gate/session-gate.component.ts +61 -0
- data_sentinel_forge-0.5.0/frontend/src/app/features/spark-plans/spark-plans.component.css +138 -0
- data_sentinel_forge-0.5.0/frontend/src/app/features/spark-plans/spark-plans.component.html +139 -0
- data_sentinel_forge-0.5.0/frontend/src/app/features/spark-plans/spark-plans.component.spec.ts +245 -0
- data_sentinel_forge-0.5.0/frontend/src/app/features/spark-plans/spark-plans.component.ts +251 -0
- data_sentinel_forge-0.5.0/frontend/src/app/features/workloads/workloads.component.css +206 -0
- data_sentinel_forge-0.5.0/frontend/src/app/features/workloads/workloads.component.html +229 -0
- data_sentinel_forge-0.5.0/frontend/src/app/features/workloads/workloads.component.spec.ts +221 -0
- data_sentinel_forge-0.5.0/frontend/src/app/features/workloads/workloads.component.ts +284 -0
- data_sentinel_forge-0.5.0/frontend/src/app/shared/analysis-result/analysis-result.component.ts +321 -0
- data_sentinel_forge-0.5.0/frontend/src/app/shared/analysis-result.ts +121 -0
- data_sentinel_forge-0.5.0/frontend/src/app/shared/page-shell/page-shell.component.ts +93 -0
- data_sentinel_forge-0.5.0/frontend/src/app/shared/status-class.ts +70 -0
- data_sentinel_forge-0.5.0/frontend/src/app/shared/tool-manifest.ts +71 -0
- data_sentinel_forge-0.5.0/frontend/src/environments/environment.development.ts +5 -0
- data_sentinel_forge-0.5.0/frontend/src/environments/environment.ts +5 -0
- data_sentinel_forge-0.5.0/frontend/src/index.html +14 -0
- data_sentinel_forge-0.5.0/frontend/src/main.ts +6 -0
- data_sentinel_forge-0.5.0/frontend/src/styles/tokens.css +347 -0
- data_sentinel_forge-0.5.0/frontend/src/styles.css +248 -0
- data_sentinel_forge-0.5.0/frontend/src/test-setup.ts +159 -0
- data_sentinel_forge-0.5.0/pyproject.toml +125 -0
- data_sentinel_forge-0.5.0/schemas/AccessContext.schema.json +73 -0
- data_sentinel_forge-0.5.0/schemas/AccessMetadata.schema.json +33 -0
- data_sentinel_forge-0.5.0/schemas/AgentDescriptor.schema.json +120 -0
- data_sentinel_forge-0.5.0/schemas/AgentExecution.schema.json +99 -0
- data_sentinel_forge-0.5.0/schemas/AgentTask.schema.json +45 -0
- data_sentinel_forge-0.5.0/schemas/ArtifactReference.schema.json +29 -0
- data_sentinel_forge-0.5.0/schemas/CapabilityDescriptor.schema.json +54 -0
- data_sentinel_forge-0.5.0/schemas/CapabilityManifest.schema.json +72 -0
- data_sentinel_forge-0.5.0/schemas/CompatibilityAssessment.schema.json +185 -0
- data_sentinel_forge-0.5.0/schemas/DataQualityContract.schema.json +229 -0
- data_sentinel_forge-0.5.0/schemas/DatasetReference.schema.json +52 -0
- data_sentinel_forge-0.5.0/schemas/DiagnosticReport.schema.json +311 -0
- data_sentinel_forge-0.5.0/schemas/DiagnosticRequest.schema.json +271 -0
- data_sentinel_forge-0.5.0/schemas/EMRExecutionContext.schema.json +235 -0
- data_sentinel_forge-0.5.0/schemas/EMRResourceObservation.schema.json +88 -0
- data_sentinel_forge-0.5.0/schemas/Environment.schema.json +36 -0
- data_sentinel_forge-0.5.0/schemas/Evidence.schema.json +110 -0
- data_sentinel_forge-0.5.0/schemas/ExecutionContext.schema.json +88 -0
- data_sentinel_forge-0.5.0/schemas/ExecutionMetadata.schema.json +173 -0
- data_sentinel_forge-0.5.0/schemas/ExternalDiagnosticBundle.schema.json +981 -0
- data_sentinel_forge-0.5.0/schemas/Finding.schema.json +108 -0
- data_sentinel_forge-0.5.0/schemas/Hypothesis.schema.json +63 -0
- data_sentinel_forge-0.5.0/schemas/IcebergSnapshotSummary.schema.json +79 -0
- data_sentinel_forge-0.5.0/schemas/IcebergTableMetadata.schema.json +103 -0
- data_sentinel_forge-0.5.0/schemas/ImpactAssessment.schema.json +118 -0
- data_sentinel_forge-0.5.0/schemas/InvestigationBudget.schema.json +63 -0
- data_sentinel_forge-0.5.0/schemas/InvestigationPlan.schema.json +154 -0
- data_sentinel_forge-0.5.0/schemas/InvestigationReport.schema.json +472 -0
- data_sentinel_forge-0.5.0/schemas/InvestigationState.schema.json +602 -0
- data_sentinel_forge-0.5.0/schemas/LakehouseOperation.schema.json +59 -0
- data_sentinel_forge-0.5.0/schemas/LineageEvent.schema.json +122 -0
- data_sentinel_forge-0.5.0/schemas/OptimizationRecommendation.schema.json +88 -0
- data_sentinel_forge-0.5.0/schemas/QualityAssessment.schema.json +420 -0
- data_sentinel_forge-0.5.0/schemas/QualityObservation.schema.json +153 -0
- data_sentinel_forge-0.5.0/schemas/QualityRule.schema.json +86 -0
- data_sentinel_forge-0.5.0/schemas/RequestConstraints.schema.json +42 -0
- data_sentinel_forge-0.5.0/schemas/ResourceContext.schema.json +54 -0
- data_sentinel_forge-0.5.0/schemas/ToolDescriptor.schema.json +91 -0
- data_sentinel_forge-0.5.0/schemas/ToolInvocation.schema.json +45 -0
- data_sentinel_forge-0.5.0/schemas/ToolResult.schema.json +59 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/__init__.py +3 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/__main__.py +6 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/_installkit.py +1825 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/adapters/__init__.py +7 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/adapters/doctor/__init__.py +30 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/adapters/doctor/adapter.py +278 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/adapters/doctor/exporter.py +98 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/agents/__init__.py +29 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/agents/guardrails.py +75 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/agents/investigator.py +102 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/agents/memory.py +129 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/agents/operations.py +179 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/agents/providers.py +119 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/agents/runtime.py +147 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/agents/specialists.py +132 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/analyzers/__init__.py +49 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/analyzers/cloudwatch/__init__.py +7 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/analyzers/cloudwatch/analyzer.py +131 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/analyzers/cloudwatch/log_parser.py +109 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/analyzers/cost/__init__.py +2 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/analyzers/crossaccount/__init__.py +19 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/analyzers/crossaccount/analyzer.py +359 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/analyzers/crossaccount/graph.py +75 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/analyzers/emr/__init__.py +9 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/analyzers/emr/compare.py +87 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/analyzers/emr/cost.py +239 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/analyzers/emr/ec2.py +266 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/analyzers/emr/eks.py +309 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/analyzers/emr/metrics.py +89 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/analyzers/emr/parser.py +80 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/analyzers/emr/serverless.py +259 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/analyzers/glue/__init__.py +2 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/analyzers/iam/__init__.py +19 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/analyzers/iam/analyzer.py +346 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/analyzers/iam/policy.py +146 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/analyzers/iceberg/__init__.py +15 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/analyzers/iceberg/analyzer.py +382 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/analyzers/iceberg/metadata.py +240 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/analyzers/lakeformation/__init__.py +2 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/analyzers/operations/__init__.py +5 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/analyzers/operations/analyzer.py +377 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/analyzers/protocol.py +99 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/analyzers/quality/__init__.py +2 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/analyzers/registry.py +50 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/analyzers/spark/__init__.py +6 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/analyzers/spark/config/__init__.py +6 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/analyzers/spark/config/advisor.py +438 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/analyzers/spark/config/matrix.py +86 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/analyzers/spark/config/parser.py +61 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/analyzers/spark/joins/__init__.py +17 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/analyzers/spark/joins/analyzer.py +557 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/analyzers/spark/joins/extractor.py +210 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/analyzers/spark/joins/models.py +104 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/analyzers/spark/log_analyzer.py +164 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/analyzers/spark/patterns.py +317 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/analyzers/spark/plans/__init__.py +7 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/analyzers/spark/plans/analyzer.py +445 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/analyzers/spark/plans/models.py +72 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/analyzers/spark/plans/parser.py +190 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/analyzers/sql/__init__.py +5 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/analyzers/sql/sql_analyzer.py +670 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/api/__init__.py +9 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/api/app.py +1016 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/api/contracts.py +72 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/cli/__init__.py +1415 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/cli/install.py +342 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/connectors/__init__.py +2 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/connectors/aws/__init__.py +21 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/connectors/aws/cloudwatch_logs.py +145 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/connectors/aws/cloudwatch_metrics.py +90 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/connectors/aws/emr.py +93 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/connectors/aws/errors.py +99 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/connectors/aws/glue.py +212 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/connectors/aws/models.py +80 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/connectors/aws/sessions.py +83 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/connectors/databricks/__init__.py +2 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/connectors/local/__init__.py +2 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/connectors/telemetry/__init__.py +2 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/context/__init__.py +22 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/context/budget.py +39 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/context/cache.py +49 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/context/layers.py +119 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/core/__init__.py +2 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/core/configuration/__init__.py +29 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/core/configuration/loader.py +146 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/core/configuration/models.py +129 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/core/contracts/__init__.py +192 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/core/contracts/agent.py +294 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/core/contracts/emr.py +105 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/core/contracts/entities.py +214 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/core/contracts/enums.py +112 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/core/contracts/interop.py +177 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/core/contracts/lakehouse.py +97 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/core/contracts/quality.py +157 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/core/contracts/snapshot.py +56 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/core/domain/__init__.py +2 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/core/exceptions/__init__.py +50 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/core/models/__init__.py +2 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/core/security/__init__.py +24 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/core/security/paths.py +126 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/core/security/redact.py +85 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/core/security/sanitize.py +36 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/diagnostics/__init__.py +2 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/diagnostics/capabilities.py +71 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/diagnostics/correlation.py +104 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/diagnostics/cross_correlation.py +266 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/diagnostics/incident.py +257 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/diagnostics/orchestrator.py +153 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/diagnostics/timeline.py +151 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/history/__init__.py +5 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/history/compare.py +142 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/history/regression.py +184 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/installation/__init__.py +34 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/installation/assets/MANIFEST.sha256 +11 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/installation/assets/agents/sentinel-investigator.md +59 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/installation/assets/agents/sentinel-reviewer.md +47 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/installation/assets/agents/sentinel-spark-specialist.md +48 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/installation/assets/manifest/forge.json +23 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/installation/assets/skills/data-sentinel-investigate/SKILL.md +95 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/installation/assets/skills/data-sentinel-quality-drift/SKILL.md +37 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/installation/assets/skills/data-sentinel-report/SKILL.md +35 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/installation/assets/skills/data-sentinel-spark-plan/SKILL.md +64 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/installation/assets/skills/data-sentinel-sql-review/SKILL.md +37 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/installation/assets.py +128 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/installation/contracts.py +198 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/installation/hosts.py +534 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/installation/ownership.py +103 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/installation/planner.py +167 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/installation/service.py +494 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/intelligence/__init__.py +2 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/intelligence/agents/__init__.py +2 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/intelligence/evaluation/__init__.py +2 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/intelligence/memory/__init__.py +2 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/intelligence/orchestration/__init__.py +2 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/intelligence/retrieval/__init__.py +2 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/knowledge/__init__.py +20 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/knowledge/compat.py +174 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/knowledge/engine.py +46 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/knowledge/rules/__init__.py +1 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/knowledge/rules/glue-fgac.yaml +104 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/knowledge/rules/glue-runtime-iceberg.yaml +99 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/knowledge/schema.py +155 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/lakehouse/__init__.py +5 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/lakehouse/resolver.py +86 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/lineage/__init__.py +12 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/lineage/graph.py +100 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/lineage/openlineage.py +142 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/mcp/__init__.py +2 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/mcp_server.py +77 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/observability/__init__.py +2 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/persistence/__init__.py +15 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/persistence/integrity.py +92 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/persistence/investigations.py +234 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/persistence/migrations/0001_init.sql +25 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/persistence/migrations.py +51 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/persistence/operations.py +401 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/persistence/store.py +213 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/quality/__init__.py +35 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/quality/adapters.py +318 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/quality/contract.py +206 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/quality/drift.py +244 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/quality/profile.py +115 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/quality/versioning.py +46 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/rag/__init__.py +10 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/rag/memory.py +51 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/rag/retriever.py +89 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/reasoning/__init__.py +6 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/reasoning/rca.py +87 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/reasoning/validator.py +70 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/remediation/__init__.py +34 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/remediation/plans.py +280 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/reporting/__init__.py +9 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/reporting/render.py +153 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/tools/__init__.py +19 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/tools/registry.py +457 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/ui/__init__.py +29 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/ui/i18n.py +143 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/ui/kit.py +689 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/ui/wizard.py +317 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/watch/__init__.py +8 -0
- data_sentinel_forge-0.5.0/src/data_sentinel/watch/engine.py +241 -0
- data_sentinel_forge-0.5.0/tests/__init__.py +0 -0
- data_sentinel_forge-0.5.0/tests/benchmarks/__init__.py +0 -0
- data_sentinel_forge-0.5.0/tests/benchmarks/test_benchmarks.py +153 -0
- data_sentinel_forge-0.5.0/tests/benchmarks/test_benchmarks_cycle3.py +107 -0
- data_sentinel_forge-0.5.0/tests/benchmarks/test_benchmarks_cycle4.py +80 -0
- data_sentinel_forge-0.5.0/tests/conftest.py +1 -0
- data_sentinel_forge-0.5.0/tests/contract/__init__.py +0 -0
- data_sentinel_forge-0.5.0/tests/contract/test_interop_contracts.py +129 -0
- data_sentinel_forge-0.5.0/tests/contract/test_json_schemas.py +57 -0
- data_sentinel_forge-0.5.0/tests/contract/test_quality_contracts.py +87 -0
- data_sentinel_forge-0.5.0/tests/contract/test_ts_contract_parity.py +70 -0
- data_sentinel_forge-0.5.0/tests/e2e/__init__.py +0 -0
- data_sentinel_forge-0.5.0/tests/e2e/test_control_center_e2e.py +104 -0
- data_sentinel_forge-0.5.0/tests/e2e/test_cycle5_1_emr.py +141 -0
- data_sentinel_forge-0.5.0/tests/e2e/test_cycle5_agentic.py +135 -0
- data_sentinel_forge-0.5.0/tests/e2e/test_cycle7_golden.py +213 -0
- data_sentinel_forge-0.5.0/tests/e2e/test_cycle7_ops.py +214 -0
- data_sentinel_forge-0.5.0/tests/e2e/test_e2e_interop.py +96 -0
- data_sentinel_forge-0.5.0/tests/e2e/test_install_golden.py +77 -0
- data_sentinel_forge-0.5.0/tests/e2e/test_install_matrix.py +448 -0
- data_sentinel_forge-0.5.0/tests/e2e/test_lakehouse_e2e.py +151 -0
- data_sentinel_forge-0.5.0/tests/e2e/test_quality_e2e.py +127 -0
- data_sentinel_forge-0.5.0/tests/e2e/test_scenarios.py +177 -0
- data_sentinel_forge-0.5.0/tests/e2e/test_sse_reliability.py +177 -0
- data_sentinel_forge-0.5.0/tests/evals/agentic_evals.json +17 -0
- data_sentinel_forge-0.5.0/tests/evals/emr_evals.json +13 -0
- data_sentinel_forge-0.5.0/tests/evals/test_evals.py +40 -0
- data_sentinel_forge-0.5.0/tests/evaluation/run_cycle8_eval.py +676 -0
- data_sentinel_forge-0.5.0/tests/evaluation/run_evaluation.py +360 -0
- data_sentinel_forge-0.5.0/tests/evaluation/test_cycle8_eval.py +38 -0
- data_sentinel_forge-0.5.0/tests/evaluation/test_evaluation_gate.py +29 -0
- data_sentinel_forge-0.5.0/tests/fixtures/emr-ec2-failed-step.json +6 -0
- data_sentinel_forge-0.5.0/tests/fixtures/emr-eks-pods.yaml +27 -0
- data_sentinel_forge-0.5.0/tests/fixtures/emr-serverless-failed.json +7 -0
- data_sentinel_forge-0.5.0/tests/fixtures/installation/plan-matrix.json +1368 -0
- data_sentinel_forge-0.5.0/tests/fixtures/lineage/PROVENANCE.json +1 -0
- data_sentinel_forge-0.5.0/tests/fixtures/lineage/marquez-real.jsonl +4 -0
- data_sentinel_forge-0.5.0/tests/fixtures/quality/deequ_checks.json +10 -0
- data_sentinel_forge-0.5.0/tests/fixtures/quality/ge_result.json +14 -0
- data_sentinel_forge-0.5.0/tests/fixtures/quality/pydeequ_metrics.json +8 -0
- data_sentinel_forge-0.5.0/tests/fixtures/quality/sql_results.json +8 -0
- data_sentinel_forge-0.5.0/tests/golden/__init__.py +0 -0
- data_sentinel_forge-0.5.0/tests/golden/test_golden.py +68 -0
- data_sentinel_forge-0.5.0/tests/integration/__init__.py +0 -0
- data_sentinel_forge-0.5.0/tests/integration/test_cli.py +205 -0
- data_sentinel_forge-0.5.0/tests/integration/test_cli_groups.py +132 -0
- data_sentinel_forge-0.5.0/tests/integration/test_lakehouse_cli.py +54 -0
- data_sentinel_forge-0.5.0/tests/integration/test_mcp_stdio.py +88 -0
- data_sentinel_forge-0.5.0/tests/performance/__init__.py +0 -0
- data_sentinel_forge-0.5.0/tests/regression/__init__.py +0 -0
- data_sentinel_forge-0.5.0/tests/security/__init__.py +0 -0
- data_sentinel_forge-0.5.0/tests/security/test_api_security.py +324 -0
- data_sentinel_forge-0.5.0/tests/security/test_emr_security.py +53 -0
- data_sentinel_forge-0.5.0/tests/security/test_security.py +242 -0
- data_sentinel_forge-0.5.0/tests/security/test_security_cycle2.py +130 -0
- data_sentinel_forge-0.5.0/tests/security/test_security_cycle3.py +147 -0
- data_sentinel_forge-0.5.0/tests/security/test_security_cycle4.py +71 -0
- data_sentinel_forge-0.5.0/tests/unit/__init__.py +0 -0
- data_sentinel_forge-0.5.0/tests/unit/api/test_auth_hardening.py +89 -0
- data_sentinel_forge-0.5.0/tests/unit/api/test_control_api.py +206 -0
- data_sentinel_forge-0.5.0/tests/unit/api/test_ops_api.py +182 -0
- data_sentinel_forge-0.5.0/tests/unit/cost/test_glue_whatif.py +75 -0
- data_sentinel_forge-0.5.0/tests/unit/history/test_compare.py +95 -0
- data_sentinel_forge-0.5.0/tests/unit/history/test_regression.py +64 -0
- data_sentinel_forge-0.5.0/tests/unit/installation/test_assets.py +482 -0
- data_sentinel_forge-0.5.0/tests/unit/installation/test_cli.py +193 -0
- data_sentinel_forge-0.5.0/tests/unit/installation/test_contracts.py +183 -0
- data_sentinel_forge-0.5.0/tests/unit/persistence/test_investigations.py +154 -0
- data_sentinel_forge-0.5.0/tests/unit/persistence/test_operations.py +254 -0
- data_sentinel_forge-0.5.0/tests/unit/remediation/test_plans.py +133 -0
- data_sentinel_forge-0.5.0/tests/unit/test_agent_evidence_integrity.py +83 -0
- data_sentinel_forge-0.5.0/tests/unit/test_agent_runtime.py +109 -0
- data_sentinel_forge-0.5.0/tests/unit/test_bootstrap.py +23 -0
- data_sentinel_forge-0.5.0/tests/unit/test_capability_descriptors.py +37 -0
- data_sentinel_forge-0.5.0/tests/unit/test_cli_quality_lineage.py +70 -0
- data_sentinel_forge-0.5.0/tests/unit/test_cloudwatch.py +321 -0
- data_sentinel_forge-0.5.0/tests/unit/test_compat.py +85 -0
- data_sentinel_forge-0.5.0/tests/unit/test_config.py +153 -0
- data_sentinel_forge-0.5.0/tests/unit/test_confirmed_evidence_contract.py +128 -0
- data_sentinel_forge-0.5.0/tests/unit/test_context.py +74 -0
- data_sentinel_forge-0.5.0/tests/unit/test_contracts.py +227 -0
- data_sentinel_forge-0.5.0/tests/unit/test_crossaccount.py +84 -0
- data_sentinel_forge-0.5.0/tests/unit/test_doctor_adapter.py +151 -0
- data_sentinel_forge-0.5.0/tests/unit/test_doctor_correlation.py +373 -0
- data_sentinel_forge-0.5.0/tests/unit/test_doctor_export.py +67 -0
- data_sentinel_forge-0.5.0/tests/unit/test_emr_cli.py +59 -0
- data_sentinel_forge-0.5.0/tests/unit/test_emr_contracts.py +46 -0
- data_sentinel_forge-0.5.0/tests/unit/test_emr_cost.py +40 -0
- data_sentinel_forge-0.5.0/tests/unit/test_emr_ec2.py +60 -0
- data_sentinel_forge-0.5.0/tests/unit/test_emr_eks.py +41 -0
- data_sentinel_forge-0.5.0/tests/unit/test_emr_serverless.py +42 -0
- data_sentinel_forge-0.5.0/tests/unit/test_emr_shared.py +72 -0
- data_sentinel_forge-0.5.0/tests/unit/test_glue_connector.py +232 -0
- data_sentinel_forge-0.5.0/tests/unit/test_guardrails_investigate.py +77 -0
- data_sentinel_forge-0.5.0/tests/unit/test_iam.py +122 -0
- data_sentinel_forge-0.5.0/tests/unit/test_iceberg.py +154 -0
- data_sentinel_forge-0.5.0/tests/unit/test_incident.py +159 -0
- data_sentinel_forge-0.5.0/tests/unit/test_join_intelligence.py +217 -0
- data_sentinel_forge-0.5.0/tests/unit/test_knowledge.py +193 -0
- data_sentinel_forge-0.5.0/tests/unit/test_lakehouse_resolver.py +69 -0
- data_sentinel_forge-0.5.0/tests/unit/test_lineage_graph.py +68 -0
- data_sentinel_forge-0.5.0/tests/unit/test_lineage_openlineage.py +68 -0
- data_sentinel_forge-0.5.0/tests/unit/test_log_analyzer.py +153 -0
- data_sentinel_forge-0.5.0/tests/unit/test_operations.py +118 -0
- data_sentinel_forge-0.5.0/tests/unit/test_orchestrator.py +186 -0
- data_sentinel_forge-0.5.0/tests/unit/test_quality_adapters.py +84 -0
- data_sentinel_forge-0.5.0/tests/unit/test_quality_contract.py +122 -0
- data_sentinel_forge-0.5.0/tests/unit/test_quality_drift.py +96 -0
- data_sentinel_forge-0.5.0/tests/unit/test_rag.py +57 -0
- data_sentinel_forge-0.5.0/tests/unit/test_reasoning.py +64 -0
- data_sentinel_forge-0.5.0/tests/unit/test_spark_config.py +153 -0
- data_sentinel_forge-0.5.0/tests/unit/test_spark_plan.py +178 -0
- data_sentinel_forge-0.5.0/tests/unit/test_specialists.py +55 -0
- data_sentinel_forge-0.5.0/tests/unit/test_sql_analyzer.py +181 -0
- data_sentinel_forge-0.5.0/tests/unit/test_sql_evolution.py +159 -0
- data_sentinel_forge-0.5.0/tests/unit/test_store.py +186 -0
- data_sentinel_forge-0.5.0/tests/unit/test_tool_registry.py +129 -0
- data_sentinel_forge-0.5.0/tests/unit/watch/test_watch.py +80 -0
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# Python
|
|
2
|
+
__pycache__/
|
|
3
|
+
*.py[cod]
|
|
4
|
+
*.egg-info/
|
|
5
|
+
.eggs/
|
|
6
|
+
build/
|
|
7
|
+
dist/
|
|
8
|
+
|
|
9
|
+
# Virtualenvs
|
|
10
|
+
.venv/
|
|
11
|
+
venv/
|
|
12
|
+
|
|
13
|
+
# Tool caches
|
|
14
|
+
.pytest_cache/
|
|
15
|
+
.mypy_cache/
|
|
16
|
+
.ruff_cache/
|
|
17
|
+
.coverage
|
|
18
|
+
coverage.xml
|
|
19
|
+
htmlcov/
|
|
20
|
+
|
|
21
|
+
# Data Sentinel local state
|
|
22
|
+
.data-sentinel/
|
|
23
|
+
data/sentinel.db
|
|
24
|
+
|
|
25
|
+
# Editors / OS
|
|
26
|
+
.idea/
|
|
27
|
+
.vscode/
|
|
28
|
+
.DS_Store
|
|
29
|
+
|
|
30
|
+
graphify-out/
|
|
31
|
+
prompt_evo*md
|
|
32
|
+
prompt_inicial.md
|
|
33
|
+
|
|
34
|
+
# Frontend (Angular)
|
|
35
|
+
node_modules/
|
|
36
|
+
frontend/dist/
|
|
37
|
+
frontend/.angular/
|
|
38
|
+
frontend/coverage/
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to Data Sentinel are documented here. The format
|
|
4
|
+
follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
|
|
5
|
+
|
|
6
|
+
## [Unreleased]
|
|
7
|
+
|
|
8
|
+
### Fixed
|
|
9
|
+
- `install` human render now surfaces per-file `note` (e.g. "user-owned,
|
|
10
|
+
not managed — skipped") and the `repaired`/`removed`/`kept`/`skipped`
|
|
11
|
+
lists emitted by repair and uninstall receipts — previously this data
|
|
12
|
+
only existed in `--json` output.
|
|
13
|
+
- `sqlglot` lower bound raised to `>=30` — `exp.Expr` (used across the
|
|
14
|
+
SQL analyzers) only exists in sqlglot 30.x; `>=25` let pip resolve
|
|
15
|
+
versions where `data_sentinel.analyzers.sql` fails at import.
|
|
16
|
+
- `forge.json` / `forge.agentic.json` regenerated — `version` drifted to
|
|
17
|
+
`0.4.0` after the 0.5.0 bump, failing the manifest drift test.
|
|
18
|
+
|
|
19
|
+
## [0.5.0] - 2026-11-04
|
|
20
|
+
|
|
21
|
+
### Added
|
|
22
|
+
- **Guided install lifecycle + wizard** — install planning, receipts and
|
|
23
|
+
host-aware guided flow on a real TTY; flags stay non-interactive.
|
|
24
|
+
|
|
25
|
+
## [0.4.0] - 2026-10-26
|
|
26
|
+
|
|
27
|
+
### Added
|
|
28
|
+
|
|
29
|
+
- `POST /api/v1/analyze/{id}` now accepts the full tool `inputSchema` —
|
|
30
|
+
multi-input tools (`quality.detect_drift`, `lineage.impact`,
|
|
31
|
+
`doctor.correlate`) and file-free tools (`emr.estimate_cost`) are
|
|
32
|
+
callable through the API. File-like keys resolve under allowed roots
|
|
33
|
+
with the extension allowlist; v1 `{"file": "..."}` stays valid.
|
|
34
|
+
- `sentinel.spark.analyze_plan` emits the parsed plan tree as a typed
|
|
35
|
+
output (`plan` key; `ExecutionPlan.to_dict()` wire shape). The Angular
|
|
36
|
+
plan explorer renders the operator tree.
|
|
37
|
+
- Operational schema v2: `ingestion_checkpoints` table with
|
|
38
|
+
save/get/delete — resumable cursors for streaming ingestion.
|
|
39
|
+
- `X-Request-Id` on every API response (inbound header honored);
|
|
40
|
+
`SentinelError` taxonomy mapped to `{detail, code, details,
|
|
41
|
+
request_id}` envelopes; redacted 500 catch-all.
|
|
42
|
+
- Contract test `test_ts_contract_parity.py` validates
|
|
43
|
+
`frontend/.../api.models.ts` field names against the Python wire
|
|
44
|
+
shapes (8 interfaces).
|
|
45
|
+
|
|
46
|
+
### Changed
|
|
47
|
+
|
|
48
|
+
- **Distribution renamed to `data-sentinel-forge`** (PyPI name-policy;
|
|
49
|
+
module stays `data_sentinel`, CLI stays `data-sentinel`). Install:
|
|
50
|
+
`pip install data-sentinel-forge`.
|
|
51
|
+
- `PRAGMA busy_timeout=5000` on all SQLite stores (WAL concurrency).
|
|
52
|
+
- `ApiService.analyze` accepts a full inputs object; `AnalyzeRequest`
|
|
53
|
+
generalized to the tool inputSchema shape.
|
|
54
|
+
- Phase-0 baseline audit: `docs/audits/pre-cycle-09-baseline.md`;
|
|
55
|
+
cycle report: `docs/cycles/cycle-09-report.md`.
|
|
56
|
+
|
|
57
|
+
## [0.3.0] - 2026-10-23
|
|
58
|
+
|
|
59
|
+
### Fixed
|
|
60
|
+
|
|
61
|
+
- Changelog: PyPI publish for 0.2.2 recorded as blocked (approval-gated
|
|
62
|
+
`pypi` environment).
|
|
63
|
+
|
|
64
|
+
## [0.2.2] - 2026-10-23
|
|
65
|
+
|
|
66
|
+
### Security
|
|
67
|
+
|
|
68
|
+
- Vendored `_installkit` backported 1.0.0 -> 1.0.4: stale-lock ownership tokens
|
|
69
|
+
and reclaim race fix, credential redaction covering URL userinfo, unsafe-path
|
|
70
|
+
refusals (`FORGE-INSTALL-UNSAFE-PATH`) in plan/apply/repair/uninstall/prune,
|
|
71
|
+
atomic-write mode preservation, and unsafe ledger entries surfaced in
|
|
72
|
+
`status()`/`doctor` as non-repairable.
|
|
73
|
+
|
|
74
|
+
## [0.2.1] - 2026-10-21
|
|
75
|
+
|
|
76
|
+
### Fixed
|
|
77
|
+
|
|
78
|
+
- CLI stdout/stderr reconfigured to UTF-8 at startup — report glyphs (e.g. `⋈`)
|
|
79
|
+
no longer crash on Windows consoles defaulting to cp1252
|
|
80
|
+
(`UnicodeEncodeError` in release smoke).
|
|
81
|
+
- Release workflow: `test_version` reads `__version__` dynamically;
|
|
82
|
+
`install manifest` regenerated for 0.2.x; wheel test builds its own wheel
|
|
83
|
+
when `dist/` is absent (verify-before-build ordering).
|
|
84
|
+
|
|
85
|
+
## [0.2.0] - 2026-10-21
|
|
86
|
+
|
|
87
|
+
### Added
|
|
88
|
+
|
|
89
|
+
- Integrations cycle (lf-0030): deterministic doctor x sentinel cross-correlation — `data-sentinel import doctor-bundle --correlate` and `import correlate` merge doctor findings into sentinel diagnostics anchored on declared evidence only (no confidence promotion, no causality claims); `sentinel.doctor.correlate` registry tool.
|
|
90
|
+
|
|
91
|
+
## [0.1.0] — 2026-10-21
|
|
92
|
+
|
|
93
|
+
First tagged release. Data Sentinel is an independent, offline-first,
|
|
94
|
+
deterministic diagnostics platform for data-engineering workloads —
|
|
95
|
+
Spark, AWS Glue, SQL, lakehouse and EMR — where every finding cites its
|
|
96
|
+
evidence and declares an honest confidence level.
|
|
97
|
+
|
|
98
|
+
### Added
|
|
99
|
+
|
|
100
|
+
- **Diagnostic core**: `analyze`, `sql analyze`, `spark
|
|
101
|
+
explain|optimize`, `glue inspect|runs|diagnose`, `lakehouse
|
|
102
|
+
metadata|access|policy|operation|compat`, `emr analyze|compare|cost`,
|
|
103
|
+
`quality validate|import`, `lineage ingest|impact`, `investigate run`,
|
|
104
|
+
`capabilities`, `agents`, `tools`, `report show|export`.
|
|
105
|
+
- **Evidence contract**: findings carry `evidence_ids` and statuses
|
|
106
|
+
`CONFIRMED | PROBABLE | POSSIBLE | UNKNOWN`; missing evidence surfaces
|
|
107
|
+
in `limitations` rather than false "healthy" conclusions.
|
|
108
|
+
- **Portable installer** (`data-sentinel install`): interactive and
|
|
109
|
+
`--yes` flows; scopes project/workspace/user; profiles
|
|
110
|
+
minimal/recommended/full; host adapters for Claude, Devin, Codex and
|
|
111
|
+
Copilot (Cursor: partial, no catalog adapter); ownership-aware writes,
|
|
112
|
+
ledger, rollback, drift detection, `status|doctor|repair|uninstall`,
|
|
113
|
+
`install env` environment report.
|
|
114
|
+
- **Agentic surfaces**: 5 host skills (`data-sentinel-investigate`,
|
|
115
|
+
`-spark-plan`, `-sql-review`, `-quality-drift`, `-report`) and 3 agent
|
|
116
|
+
profiles (`sentinel-investigator`, `-reviewer`, `-spark-specialist`)
|
|
117
|
+
shipped in the wheel; `forge.json`/`forge.agentic.json` manifests for
|
|
118
|
+
Forge ecosystem discovery.
|
|
119
|
+
- **MCP server** (`mcp serve`): 20 tools over stdio, read-only roots,
|
|
120
|
+
real handshake validation by the installer.
|
|
121
|
+
- **Optional AWS path**: `glue *` verbs behind the `aws` extra and
|
|
122
|
+
credentials; read-only, with `--dry-run` collection preview.
|
|
123
|
+
- **Angular Control Center** (`frontend/`): investigations, reports,
|
|
124
|
+
evidence explorer and observability UI.
|
|
125
|
+
- **API surface** behind the `api` extra.
|
|
126
|
+
|
|
127
|
+
### Security
|
|
128
|
+
|
|
129
|
+
- Asset integrity fail-closed via `MANIFEST.sha256` (LF-pinned for
|
|
130
|
+
cross-platform checkout).
|
|
131
|
+
- No remote script execution, no writes outside the authorized scope,
|
|
132
|
+
no silent overwrite of user-owned files, secrets redacted before
|
|
133
|
+
persistence, environment reports emit set/unset only.
|
|
134
|
+
- CI matrix: Linux, macOS, Windows × Python 3.11/3.12.
|
|
135
|
+
|
|
136
|
+
### Known restrictions
|
|
137
|
+
|
|
138
|
+
- PyPI publication not yet performed; install from source or
|
|
139
|
+
`pip install git+https://github.com/EdgarSocrates98/data-sentinel-forge`.
|
|
140
|
+
- Cursor host is partially supported (no full catalog adapter).
|
|
141
|
+
- Codex does not read project-scope `.mcp.json`; MCP needs user scope
|
|
142
|
+
or `codex mcp add`.
|
|
143
|
+
- The Forge / forge-cli integration is manifest- and docs-level only.
|
|
144
|
+
|
|
145
|
+
[0.1.0]: https://github.com/EdgarSocrates98/data-sentinel-forge/releases/tag/v0.1.0
|
|
146
|
+
|
|
147
|
+
> **PyPI**: `v0.2.2` não publicado — workflow `Release` gated no
|
|
148
|
+
> environment `pypi` (trusted publisher + aprovação humana). Jobs de
|
|
149
|
+
> verify/smoke verdes; publish falhou por design até aprovação do dono.
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
Apache License
|
|
2
|
+
Version 2.0, January 2004
|
|
3
|
+
http://www.apache.org/licenses/
|
|
4
|
+
|
|
5
|
+
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
|
6
|
+
|
|
7
|
+
1. Definitions.
|
|
8
|
+
|
|
9
|
+
"License" shall mean the terms and conditions for use, reproduction,
|
|
10
|
+
and distribution as defined by Sections 1 through 9 of this document.
|
|
11
|
+
|
|
12
|
+
"Licensor" shall mean the copyright owner or entity authorized by
|
|
13
|
+
the copyright owner that is granting the License.
|
|
14
|
+
|
|
15
|
+
"Legal Entity" shall mean the union of the acting entity and all
|
|
16
|
+
other entities that control, are controlled by, or are under common
|
|
17
|
+
control with that entity. For the purposes of this definition,
|
|
18
|
+
"control" means (i) the power, direct or indirect, to cause the
|
|
19
|
+
direction or management of such entity, whether by contract or
|
|
20
|
+
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
|
21
|
+
outstanding shares, or (iii) beneficial ownership of such entity.
|
|
22
|
+
|
|
23
|
+
"You" (or "Your") shall mean an individual or Legal Entity
|
|
24
|
+
exercising permissions granted by this License.
|
|
25
|
+
|
|
26
|
+
"Source" form shall mean the preferred form for making modifications,
|
|
27
|
+
including but not limited to software source code, documentation
|
|
28
|
+
source, and configuration files.
|
|
29
|
+
|
|
30
|
+
"Object" form shall mean any form resulting from mechanical
|
|
31
|
+
transformation or translation of a Source form, including but
|
|
32
|
+
not limited to compiled object code, generated documentation,
|
|
33
|
+
and conversions to other media types.
|
|
34
|
+
|
|
35
|
+
"Work" shall mean the work of authorship, whether in Source or
|
|
36
|
+
Object form, made available under the License, as indicated by a
|
|
37
|
+
copyright notice that is included in or attached to the work
|
|
38
|
+
(an example is provided in the Appendix below).
|
|
39
|
+
|
|
40
|
+
"Derivative Works" shall mean any work, whether in Source or Object
|
|
41
|
+
form, that is based on (or derived from) the Work and for which the
|
|
42
|
+
editorial revisions, annotations, elaborations, or other modifications
|
|
43
|
+
represent, as a whole, an original work of authorship. For the purposes
|
|
44
|
+
of this License, Derivative Works shall not include works that remain
|
|
45
|
+
separable from, or merely link (or bind by name) to the interfaces of,
|
|
46
|
+
the Work and Derivative Works thereof.
|
|
47
|
+
|
|
48
|
+
"Contribution" shall mean any work of authorship, including
|
|
49
|
+
the original version of the Work and any modifications or additions
|
|
50
|
+
to that Work or Derivative Works thereof, that is intentionally
|
|
51
|
+
submitted to Licensor for inclusion in the Work by the copyright owner
|
|
52
|
+
or by an individual or Legal Entity authorized to submit on behalf of
|
|
53
|
+
the copyright owner. For the purposes of this definition, "submitted"
|
|
54
|
+
means any form of electronic, verbal, or written communication sent
|
|
55
|
+
to the Licensor or its representatives, including but not limited to
|
|
56
|
+
communication on electronic mailing lists, source code control systems,
|
|
57
|
+
and issue tracking systems that are managed by, or on behalf of, the
|
|
58
|
+
Licensor for the purpose of discussing and improving the Work, but
|
|
59
|
+
excluding communication that is conspicuously marked or otherwise
|
|
60
|
+
designated in writing by the copyright owner as "Not a Contribution."
|
|
61
|
+
|
|
62
|
+
"Contributor" shall mean Licensor and any individual or Legal Entity
|
|
63
|
+
on behalf of whom a Contribution has been received by Licensor and
|
|
64
|
+
subsequently incorporated within the Work.
|
|
65
|
+
|
|
66
|
+
2. Grant of Copyright License. Subject to the terms and conditions of
|
|
67
|
+
this License, each Contributor hereby grants to You a perpetual,
|
|
68
|
+
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
|
69
|
+
copyright license to reproduce, prepare Derivative Works of,
|
|
70
|
+
publicly display, publicly perform, sublicense, and distribute the
|
|
71
|
+
Work and such Derivative Works in Source or Object form.
|
|
72
|
+
|
|
73
|
+
3. Grant of Patent License. Subject to the terms and conditions of
|
|
74
|
+
this License, each Contributor hereby grants to You a perpetual,
|
|
75
|
+
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
|
76
|
+
(except as stated in this section) patent license to make, have made,
|
|
77
|
+
use, offer to sell, sell, import, and otherwise transfer the Work,
|
|
78
|
+
where such license applies only to those patent claims licensable
|
|
79
|
+
by such Contributor that are necessarily infringed by their
|
|
80
|
+
Contribution(s) alone or by combination of their Contribution(s)
|
|
81
|
+
with the Work to which such Contribution(s) was submitted. If You
|
|
82
|
+
institute patent litigation against any entity (including a
|
|
83
|
+
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
|
84
|
+
or a Contribution incorporated within the Work constitutes direct
|
|
85
|
+
or contributory patent infringement, then any patent licenses
|
|
86
|
+
granted to You under this License for that Work are terminated
|
|
87
|
+
as of the date such litigation is filed.
|
|
88
|
+
|
|
89
|
+
4. Redistribution. You may reproduce and distribute copies of the
|
|
90
|
+
Work or Derivative Works thereof in any medium, provided that You
|
|
91
|
+
meet the following conditions:
|
|
92
|
+
|
|
93
|
+
(a) You must give any other recipients of the Work or Derivative
|
|
94
|
+
Works a copy of this License; and
|
|
95
|
+
|
|
96
|
+
(b) You must cause any modified files to carry prominent notices
|
|
97
|
+
stating that You changed the files; and
|
|
98
|
+
|
|
99
|
+
(c) You must retain, in the Source form of any Derivative Works that
|
|
100
|
+
You distribute, all copyright, patent, trademark, and
|
|
101
|
+
attribution notices from the Source form of the Work,
|
|
102
|
+
excluding those notices that are for attribution only; and
|
|
103
|
+
|
|
104
|
+
(d) If the Work includes a "NOTICE" text file as part of its
|
|
105
|
+
distribution, then any Derivative Works that You distribute must
|
|
106
|
+
include a readable copy of the attribution notices contained
|
|
107
|
+
within such NOTICE file, excluding those notices that are for
|
|
108
|
+
attribution only. You may place your notices with your own
|
|
109
|
+
Derivative Works that You distribute to identify the source of
|
|
110
|
+
the Derivative Works, provided that You do not include a copy of
|
|
111
|
+
the NOTICE itself within that Derivative Work.
|
|
112
|
+
|
|
113
|
+
5. Submission of Contributions. Unless You explicitly state otherwise,
|
|
114
|
+
any Contribution intentionally submitted for inclusion in the Work
|
|
115
|
+
by You to the Licensor shall be deemed to be a Contribution licensed
|
|
116
|
+
under the same terms and conditions as this License, notwithstanding
|
|
117
|
+
any provision in this section or section 9 that requires a separate
|
|
118
|
+
license agreement granting You additional permissions for the
|
|
119
|
+
Contributions.
|
|
120
|
+
|
|
121
|
+
6. Trademarks. This License does not grant permission to use the trade
|
|
122
|
+
names, trademarks, service marks, or product names of the Licensor,
|
|
123
|
+
except as required for reasonable and customary use in describing the
|
|
124
|
+
origin of the Work and reproducing the Work.
|
|
125
|
+
|
|
126
|
+
7. Disclaimer of Warranty. Unless required by applicable law or
|
|
127
|
+
agreed to in writing, Licensor provides the Work (and each
|
|
128
|
+
Contributor provides the Work) on an "AS IS" BASIS,
|
|
129
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
|
130
|
+
implied, including, without limitation, any warranties or conditions
|
|
131
|
+
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
|
132
|
+
PARTICULAR PURPOSE. You are solely responsible for determining the
|
|
133
|
+
appropriateness of using or redistributing the Work and assume any
|
|
134
|
+
risks associated with Your exercise of permissions under this License.
|
|
135
|
+
|
|
136
|
+
8. Limitation of Liability. In no event and under no legal theory,
|
|
137
|
+
whether in tort (including negligence), contract, or otherwise,
|
|
138
|
+
unless required by applicable law (such as deliberate and grossly
|
|
139
|
+
negligent acts) or agreed to in writing, will You be liable to any
|
|
140
|
+
Contributor for damages, whether direct, indirect, incidental,
|
|
141
|
+
special, exemplary, or consequential damages (including, but not
|
|
142
|
+
limited to, attorneys' fees, costs of lost profits, or other
|
|
143
|
+
indirect damages) arising out of or relating to this License, even
|
|
144
|
+
if You are advised of the possibility of such damages.
|
|
145
|
+
|
|
146
|
+
9. Accepting Warranty or Additional Liability. While redistributing
|
|
147
|
+
the Work or Derivative Works thereof, You may choose to offer,
|
|
148
|
+
and charge a fee for, acceptance of support, warranty, indemnity,
|
|
149
|
+
or other liability obligations. However, in accepting such
|
|
150
|
+
obligations, You may act only on Your own behalf and on Your sole
|
|
151
|
+
responsibility, not on behalf of any Contributor, not on behalf of
|
|
152
|
+
any Contributor's ability to enforce this License, and on Your own
|
|
153
|
+
choice of law. Any liability accepted by You under this License
|
|
154
|
+
shall be indicated at the beginning of any reproduction of this
|
|
155
|
+
License.
|
|
156
|
+
|
|
157
|
+
END OF TERMS AND CONDITIONS
|
|
158
|
+
|
|
159
|
+
APPENDIX: How to apply the Apache License to your work.
|
|
160
|
+
|
|
161
|
+
To apply the Apache License to your work, attach the following
|
|
162
|
+
boilerplate notice, with the fields enclosed by brackets "[]"
|
|
163
|
+
replaced with your own identifying information. (Don't include
|
|
164
|
+
the brackets!) The text should be enclosed in the appropriate
|
|
165
|
+
comment syntax for the file format. We also recommend that a
|
|
166
|
+
file or class name and description of purpose be included on the
|
|
167
|
+
same "printed page" as the copyright notice for easier
|
|
168
|
+
identification within third-party archives.
|
|
169
|
+
|
|
170
|
+
Copyright 2026 EdgarSocrates98
|
|
171
|
+
|
|
172
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
|
173
|
+
you may not use this file except in compliance with the License.
|
|
174
|
+
You may obtain a copy of the License at
|
|
175
|
+
|
|
176
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
|
177
|
+
|
|
178
|
+
Unless required by applicable law or agreed to in writing, software
|
|
179
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
|
180
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
181
|
+
See the License for the specific language governing permissions and
|
|
182
|
+
limitations under the License.
|
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
|
+
Name: data-sentinel-forge
|
|
3
|
+
Version: 0.5.0
|
|
4
|
+
Summary: Data Sentinel — Intelligent Data Engineering & Agentic Diagnostics Platform
|
|
5
|
+
Project-URL: Repository, https://github.com/EdgarSocrates98/data-sentinel-forge
|
|
6
|
+
Project-URL: Issues, https://github.com/EdgarSocrates98/data-sentinel-forge/issues
|
|
7
|
+
Author: EdgarSocrates98
|
|
8
|
+
License-Expression: Apache-2.0
|
|
9
|
+
License-File: LICENSE
|
|
10
|
+
Keywords: data-engineering,diagnostics,glue,spark,sql
|
|
11
|
+
Classifier: Development Status :: 3 - Alpha
|
|
12
|
+
Classifier: Environment :: Console
|
|
13
|
+
Classifier: Intended Audience :: Developers
|
|
14
|
+
Classifier: License :: OSI Approved :: Apache Software License
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
17
|
+
Classifier: Topic :: Database
|
|
18
|
+
Classifier: Topic :: Software Development :: Quality Assurance
|
|
19
|
+
Requires-Python: >=3.11
|
|
20
|
+
Requires-Dist: pydantic<3,>=2.7
|
|
21
|
+
Requires-Dist: pyyaml>=6.0
|
|
22
|
+
Requires-Dist: sqlglot>=30
|
|
23
|
+
Requires-Dist: typer>=0.12
|
|
24
|
+
Provides-Extra: api
|
|
25
|
+
Requires-Dist: fastapi>=0.110; extra == 'api'
|
|
26
|
+
Requires-Dist: uvicorn>=0.29; extra == 'api'
|
|
27
|
+
Provides-Extra: aws
|
|
28
|
+
Requires-Dist: boto3>=1.34; extra == 'aws'
|
|
29
|
+
Provides-Extra: dev
|
|
30
|
+
Requires-Dist: jsonschema>=4.21; extra == 'dev'
|
|
31
|
+
Requires-Dist: mypy>=1.10; extra == 'dev'
|
|
32
|
+
Requires-Dist: pytest-cov>=5.0; extra == 'dev'
|
|
33
|
+
Requires-Dist: pytest>=8.0; extra == 'dev'
|
|
34
|
+
Requires-Dist: ruff>=0.5; extra == 'dev'
|
|
35
|
+
Provides-Extra: mcp
|
|
36
|
+
Requires-Dist: mcp>=1.9; extra == 'mcp'
|
|
37
|
+
Provides-Extra: stats
|
|
38
|
+
Requires-Dist: numpy>=1.26; extra == 'stats'
|
|
39
|
+
Requires-Dist: scipy>=1.11; extra == 'stats'
|
|
40
|
+
Description-Content-Type: text/markdown
|
|
41
|
+
|
|
42
|
+
# Data Sentinel
|
|
43
|
+
|
|
44
|
+
<p align="center">
|
|
45
|
+
<img src="docs/assets/logo.png" alt="Data Sentinel logo" width="420" />
|
|
46
|
+
</p>
|
|
47
|
+
|
|
48
|
+
**Intelligent Data Engineering & Agentic Diagnostics Platform.**
|
|
49
|
+
|
|
50
|
+
Ferramenta open source (Apache-2.0) para investigar, analisar e explicar
|
|
51
|
+
problemas em workloads de engenharia de dados — logs Spark/Glue, queries SQL,
|
|
52
|
+
jobs e ambientes lakehouse — com diagnósticos **apoiados em evidência
|
|
53
|
+
auditável**. Nada de causa-raiz inventada: todo achado cita a evidência que o
|
|
54
|
+
sustenta e declara seu nível de confiança.
|
|
55
|
+
|
|
56
|
+
## O que é
|
|
57
|
+
|
|
58
|
+
- **Análise determinística primeiro**: analyzers executam regras curadas sobre
|
|
59
|
+
artefatos locais; resultados fracos ficam `PROBABLE`/`POSSIBLE`/`UNKNOWN` em
|
|
60
|
+
vez de virar diagnóstico fabricado.
|
|
61
|
+
- **Offline por padrão**: analisa logs e SQL locais sem nenhuma chamada de
|
|
62
|
+
rede ou credencial cloud.
|
|
63
|
+
- **Read-only**: nunca altera recursos de produção; guardas de caminho,
|
|
64
|
+
tamanho e sanitização protegem a entrada.
|
|
65
|
+
- **Auditoria built-in**: evidências são sanitizadas (segredos redigidos) e
|
|
66
|
+
persistidas em SQLite local junto ao relatório versionado.
|
|
67
|
+
|
|
68
|
+
## Instalação
|
|
69
|
+
|
|
70
|
+
Requer Python ≥ 3.11.
|
|
71
|
+
|
|
72
|
+
```bash
|
|
73
|
+
# via uv (recomendado para desenvolvimento)
|
|
74
|
+
uv sync
|
|
75
|
+
uv run data-sentinel --help
|
|
76
|
+
|
|
77
|
+
# via pip
|
|
78
|
+
pip install .
|
|
79
|
+
data-sentinel --help
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
Detalhes: [docs/installation.md](docs/installation.md).
|
|
83
|
+
|
|
84
|
+
### Instalação agentic
|
|
85
|
+
|
|
86
|
+
Publica skills, agents e o servidor MCP nos hosts suportados (Claude,
|
|
87
|
+
Devin, Codex, Copilot):
|
|
88
|
+
|
|
89
|
+
```bash
|
|
90
|
+
data-sentinel install # interativo
|
|
91
|
+
data-sentinel install --yes --host all # não-interativo
|
|
92
|
+
data-sentinel install status|doctor|env # lifecycle
|
|
93
|
+
data-sentinel install uninstall # remove só arquivos gerenciados
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
Guias por escopo/host/plataforma em [docs/installation/](docs/installation/).
|
|
97
|
+
|
|
98
|
+
## Quickstart
|
|
99
|
+
|
|
100
|
+
```bash
|
|
101
|
+
# Analisar um log de Glue/Spark (saída real abaixo)
|
|
102
|
+
data-sentinel analyze --file fixtures/logs/glue_oom.log
|
|
103
|
+
|
|
104
|
+
# Análise estática de SQL (AST SQLGlot, dialetos spark/trino)
|
|
105
|
+
data-sentinel sql analyze --file fixtures/joins/high_volume_4tables.sql --dialect spark
|
|
106
|
+
|
|
107
|
+
# Plano físico Spark (EXPLAIN) → árvore + estratégias + limitações
|
|
108
|
+
data-sentinel spark explain --file fixtures/plans/sort_merge_join.txt
|
|
109
|
+
|
|
110
|
+
# Pipeline composto: SQL + joins/cardinalidade + config advisor
|
|
111
|
+
data-sentinel spark optimize --sql query.sql --stats stats.json --config spark-defaults.conf
|
|
112
|
+
|
|
113
|
+
# AWS Glue read-only (requer [aws] + credenciais)
|
|
114
|
+
data-sentinel glue runs --job meu-job --limit 10 --region us-east-1
|
|
115
|
+
data-sentinel glue diagnose --job meu-job --run-id jr_abc --region us-east-1
|
|
116
|
+
|
|
117
|
+
# Saúde da instalação / capacidades / relatórios
|
|
118
|
+
data-sentinel doctor
|
|
119
|
+
data-sentinel capabilities [--descriptors]
|
|
120
|
+
data-sentinel import doctor-bundle -f <arquivo>
|
|
121
|
+
data-sentinel report show --id <report_id> --format markdown
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
Saída real de `analyze` sobre `fixtures/logs/glue_oom.log`:
|
|
125
|
+
|
|
126
|
+
```text
|
|
127
|
+
relatório 79e1efef4cd84f94882c76914aa9b760 (schema 1.0.0)
|
|
128
|
+
resumo: 1 achado(s): CONFIRMED=1
|
|
129
|
+
|
|
130
|
+
[HIGH/CONFIRMED] out_of_memory
|
|
131
|
+
Assinatura inequívoca de java.lang.OutOfMemoryError indica que driver ou
|
|
132
|
+
executor estourou o heap disponível. 2 ocorrência(s) no log analisado.
|
|
133
|
+
evidência: fixtures/logs/glue_oom.log:5
|
|
134
|
+
... Lost task 0.1 ... : java.lang.OutOfMemoryError: Java heap space
|
|
135
|
+
recomendação: Aumentar spark.driver.memory ou spark.executor.memory
|
|
136
|
+
...
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
Mais exemplos: [examples/README.md](examples/README.md) e
|
|
140
|
+
[docs/evidence/](docs/evidence/) (saídas capturadas de comandos reais).
|
|
141
|
+
|
|
142
|
+
## Control Center (Cycle 06)
|
|
143
|
+
|
|
144
|
+
Portal web real sobre o mesmo núcleo — API FastAPI (`data-sentinel serve`,
|
|
145
|
+
bind `127.0.0.1:8790`) + frontend Angular 20 (`frontend/`). Investigações
|
|
146
|
+
agênticas via `/api/v1/investigations`, stream SSE, grafo de evidências,
|
|
147
|
+
explorers de workloads/Spark/qualidade e registry de agentes — sem dado
|
|
148
|
+
simulado.
|
|
149
|
+
|
|
150
|
+
```bash
|
|
151
|
+
uv run data-sentinel serve --port 8790 # API → /api/v1/*
|
|
152
|
+
cd frontend && npx ng serve --port 4200 # portal → localhost:4200
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+

|
|
156
|
+
|
|
157
|
+
Guia completo (endpoints, segurança, limitações):
|
|
158
|
+
[docs/guides/control-center.md](docs/guides/control-center.md).
|
|
159
|
+
|
|
160
|
+
## Códigos de saída
|
|
161
|
+
|
|
162
|
+
`0` sucesso · `1` erro de domínio/usuário · `2` erro de uso · `3` erro interno.
|
|
163
|
+
Ver [ADR 0006](docs/adr/0006-exit-code-scheme.md).
|
|
164
|
+
|
|
165
|
+
## Documentação
|
|
166
|
+
|
|
167
|
+
| Doc | Conteúdo |
|
|
168
|
+
|---|---|
|
|
169
|
+
| [docs/installation.md](docs/installation.md) | Instalação e requisitos |
|
|
170
|
+
| [docs/cli.md](docs/cli.md) | Referência dos comandos |
|
|
171
|
+
| [docs/configuration.md](docs/configuration.md) | Perfis, fontes, precedência |
|
|
172
|
+
| [docs/architecture.md](docs/architecture.md) | Arquitetura e módulos |
|
|
173
|
+
| [docs/security.md](docs/security.md) | Guardas, redação, postura read-only |
|
|
174
|
+
| [docs/development.md](docs/development.md) | Setup de dev, testes, lint |
|
|
175
|
+
| [docs/troubleshooting.md](docs/troubleshooting.md) | Erros comuns |
|
|
176
|
+
| [docs/roadmap.md](docs/roadmap.md) | Cycles 02–08 e backlog do Cycle 02 |
|
|
177
|
+
| [docs/validation-matrix.md](docs/validation-matrix.md) | Matriz de validação com evidências |
|
|
178
|
+
| [docs/cycle-01-report.md](docs/cycle-01-report.md) | Relatório final do Cycle 01 |
|
|
179
|
+
| [docs/cycles/cycle-02-final-report.md](docs/cycles/cycle-02-final-report.md) | Relatório final do Cycle 02 |
|
|
180
|
+
| [docs/guides/](docs/guides/) | Guias por funcionalidade (Glue, CloudWatch, plano, SQL, joins, config) |
|
|
181
|
+
| [docs/examples/](docs/examples/) | Exemplos executáveis com saídas reais |
|
|
182
|
+
| [docs/adr/](docs/adr/) | Decisões arquiteturais |
|
|
183
|
+
|
|
184
|
+
## Estrutura
|
|
185
|
+
|
|
186
|
+
```text
|
|
187
|
+
src/data_sentinel/
|
|
188
|
+
├── core/ # contracts, configuration, security, exceptions
|
|
189
|
+
├── analyzers/ # registry + spark/{log,plans,joins,config} + sql + cloudwatch
|
|
190
|
+
├── connectors/ # aws/{glue,cloudwatch_logs} — extra [aws], read-only
|
|
191
|
+
├── diagnostics/ # orchestrator + correlation + timeline
|
|
192
|
+
├── reporting/ # renderers terminal/JSON/Markdown
|
|
193
|
+
├── persistence/ # SQLite store + migrations (stdlib)
|
|
194
|
+
├── api/ # FastAPI app (Cycle 06) — `data-sentinel serve`, /api/v1/*
|
|
195
|
+
├── agents/ + tools/ + mcp/ # runtime agêntico + registry + MCP (Cycle 05)
|
|
196
|
+
└── cli/ # Typer app
|
|
197
|
+
|
|
198
|
+
frontend/ # Angular 20 Control Center (Cycle 06) — raiz do repo
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
## Estado do projeto
|
|
202
|
+
|
|
203
|
+
**Cycle 08.2 implementado** — installer portátil universal: CLI
|
|
204
|
+
`data-sentinel install` (interativo + `--yes`), adapters para
|
|
205
|
+
Claude/Devin/Codex/Copilot (Cursor declarado sem catálogo), 5 skills +
|
|
206
|
+
3 agents versionados na wheel com `MANIFEST.sha256`, MCP lifecycle
|
|
207
|
+
(`mcp serve`, handshake real), `forge.json`/`forge.agentic.json` para
|
|
208
|
+
descoberta Forge CLI, lifecycle auditável (ledger sha256, receipts,
|
|
209
|
+
repair, uninstall preservando arquivos do usuário) e
|
|
210
|
+
`install env`/`status`/`doctor`. Evidência:
|
|
211
|
+
[docs/cycles/cycle-08-2-final-report.md](docs/cycles/cycle-08-2-final-report.md).
|
|
212
|
+
Cycle 06: Control Center Angular + API
|
|
213
|
+
([cycle-06](docs/cycles/cycle-06-final-report.md)); ciclo anterior em
|
|
214
|
+
[cycle-08-1](docs/cycles/cycle-08-1-final-report.md).
|
|
215
|
+
**1025 testes Python + 96 specs Angular + ~145 Playwright, ruff+mypy
|
|
216
|
+
strict limpos.**
|
|
217
|
+
Ciclos anteriores: [cycle-05](docs/cycles/cycle-05-final-report.md),
|
|
218
|
+
[05.1](docs/cycles/cycle-05-1-final-report.md),
|
|
219
|
+
[04](docs/cycles/cycle-04-final-report.md).
|
|
220
|
+
|
|
221
|
+
## Licença
|
|
222
|
+
|
|
223
|
+
Apache-2.0 — ver [LICENSE](LICENSE).
|
|
224
|
+
|
|
225
|
+
## Cycle 03 — Lakehouse (Iceberg, Lake Formation, cross-account)
|
|
226
|
+
|
|
227
|
+
```bash
|
|
228
|
+
data-sentinel lakehouse metadata -f metadata.json # Iceberg metadata
|
|
229
|
+
data-sentinel lakehouse access -f contexto.json # cross-account
|
|
230
|
+
data-sentinel lakehouse policy -f policy.json # IAM/S3/KMS offline
|
|
231
|
+
data-sentinel lakehouse operation -f merge.sql # MERGE/APPEND
|
|
232
|
+
data-sentinel lakehouse compat --runtime glue-5.1 --operation merge \
|
|
233
|
+
--access-mode fgac # compatibilidade
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
Ver `docs/cycles/cycle-03-final-report.md` e guias em `docs/guides/`.
|