core-runtime 0.1.1__py3-none-any.whl
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.
- api/__init__.py +4 -0
- api/cli/__init__.py +10 -0
- api/cli/audit_client.py +92 -0
- api/cli/census_client.py +77 -0
- api/cli/client.py +508 -0
- api/cli/coverage_client.py +121 -0
- api/cli/daemon_client.py +42 -0
- api/cli/fix_client.py +101 -0
- api/cli/inspect_client.py +143 -0
- api/cli/integration_client.py +42 -0
- api/cli/integrity_client.py +45 -0
- api/cli/proposals_client.py +101 -0
- api/cli/quality_client.py +83 -0
- api/cli/refactor_client.py +82 -0
- api/cli/sync_client.py +106 -0
- api/dependencies.py +37 -0
- api/errors.py +74 -0
- api/main.py +88 -0
- api/v1/__init__.py +4 -0
- api/v1/audit_routes.py +302 -0
- api/v1/census_routes.py +207 -0
- api/v1/coverage_routes.py +352 -0
- api/v1/daemon_routes.py +86 -0
- api/v1/development_routes.py +70 -0
- api/v1/fix_routes.py +428 -0
- api/v1/inspect_routes.py +220 -0
- api/v1/integration_routes.py +56 -0
- api/v1/integrity_routes.py +72 -0
- api/v1/knowledge_routes.py +36 -0
- api/v1/lint_routes.py +40 -0
- api/v1/proposals_routes.py +267 -0
- api/v1/quality_routes.py +272 -0
- api/v1/refactor_routes.py +225 -0
- api/v1/sync_routes.py +261 -0
- body/__init__.py +4 -0
- body/analyzers/__init__.py +25 -0
- body/analyzers/base_analyzer.py +28 -0
- body/analyzers/constitutional_path_analyzer.py +63 -0
- body/analyzers/file_analyzer.py +211 -0
- body/analyzers/knowledge_graph_analyzer.py +86 -0
- body/analyzers/prompt_analyzer.py +155 -0
- body/analyzers/symbol_extractor.py +280 -0
- body/atomic/__init__.py +74 -0
- body/atomic/build_tests_action.py +354 -0
- body/atomic/check_actions.py +142 -0
- body/atomic/crate_ops.py +59 -0
- body/atomic/executor.py +470 -0
- body/atomic/file_ops.py +153 -0
- body/atomic/fix_actions.py +1142 -0
- body/atomic/import_resolver.py +200 -0
- body/atomic/metadata_ops.py +161 -0
- body/atomic/modularity_fix.py +839 -0
- body/atomic/modularity_splitter.py +521 -0
- body/atomic/proposal_lifecycle_actions.py +171 -0
- body/atomic/registry.py +326 -0
- body/atomic/remediate_cognitive_role.py +104 -0
- body/atomic/sandbox_lifecycle.py +252 -0
- body/atomic/split_plan.py +155 -0
- body/atomic/sync_actions/__init__.py +22 -0
- body/atomic/sync_actions/chunking_helpers.py +218 -0
- body/atomic/sync_actions/sync_actions.py +431 -0
- body/atomic/test_actions.py +47 -0
- body/autonomy/__init__.py +16 -0
- body/autonomy/audit_analyzer.py +343 -0
- body/autonomy/micro_proposal_executor.py +316 -0
- body/crate_processing/canary_executor.py +144 -0
- body/evaluators/__init__.py +27 -0
- body/evaluators/atomic_actions_evaluator.py +162 -0
- body/evaluators/atomic_actions_format.py +45 -0
- body/evaluators/atomic_actions_rules.py +278 -0
- body/evaluators/base_evaluator.py +67 -0
- body/evaluators/clarity_evaluator.py +83 -0
- body/evaluators/constitutional_evaluator.py +227 -0
- body/evaluators/failure_evaluator.py +136 -0
- body/evaluators/performance_evaluator.py +341 -0
- body/evaluators/security_evaluator.py +393 -0
- body/flows/__init__.py +33 -0
- body/flows/executor.py +275 -0
- body/flows/registry.py +272 -0
- body/flows/result.py +113 -0
- body/governance/__init__.py +29 -0
- body/governance/body_contracts_service.py +317 -0
- body/governance/code_validator.py +118 -0
- body/governance/engine_dispatcher.py +128 -0
- body/governance/intent_guard.py +592 -0
- body/governance/intent_pattern_validators.py +197 -0
- body/governance/key_management_service.py +100 -0
- body/governance/path_validator.py +187 -0
- body/governance/remediation_service.py +263 -0
- body/governance/runtime_validator.py +184 -0
- body/infrastructure/bootstrap.py +135 -0
- body/infrastructure/lifespan.py +85 -0
- body/infrastructure/repositories/__init__.py +1 -0
- body/infrastructure/repositories/decision_trace_repository.py +210 -0
- body/infrastructure/repositories/refusal_repository.py +294 -0
- body/introspection/__init__.py +4 -0
- body/introspection/capability_discovery_service.py +107 -0
- body/introspection/discovery/from_kgb.py +33 -0
- body/introspection/discovery/from_source_scan.py +40 -0
- body/introspection/discovery/loader.py +62 -0
- body/introspection/discovery/registry.py +22 -0
- body/introspection/discovery/semantics.py +21 -0
- body/introspection/discovery/sync.py +47 -0
- body/introspection/drift_detector.py +81 -0
- body/introspection/drift_service.py +48 -0
- body/introspection/export_vectors.py +133 -0
- body/introspection/generate_capability_docs.py +130 -0
- body/introspection/generate_correction_map.py +98 -0
- body/introspection/graph_analysis_service.py +66 -0
- body/introspection/knowledge_graph_service.py +170 -0
- body/introspection/semantic_clusterer.py +128 -0
- body/introspection/symbol_index_builder.py +244 -0
- body/introspection/sync/engine.py +92 -0
- body/introspection/sync/scanner.py +56 -0
- body/introspection/sync/visitor.py +83 -0
- body/introspection/sync_service.py +62 -0
- body/invokers/__init__.py +4 -0
- body/invokers/capability_invoker.py +4 -0
- body/maintenance/command_sync_service.py +73 -0
- body/maintenance/dotenv_sync_service.py +99 -0
- body/maintenance/idempotency_harness.py +70 -0
- body/maintenance/maintenance_service.py +123 -0
- body/maintenance/memory_cleanup_service.py +131 -0
- body/maintenance/refactor_settings_access.py +274 -0
- body/maintenance/scripts/__init__.py +5 -0
- body/maintenance/scripts/context_export.py +278 -0
- body/maintenance/scripts/vector_verify.py +73 -0
- body/maintenance/sync_vectors.py +338 -0
- body/models/__init__.py +4 -0
- body/project_lifecycle/__init__.py +4 -0
- body/project_lifecycle/bootstrap_service.py +157 -0
- body/project_lifecycle/definition_service.py +264 -0
- body/project_lifecycle/integration_service.py +113 -0
- body/project_lifecycle/scaffolding_service.py +187 -0
- body/quality/coverage_analyzer.py +177 -0
- body/repositories/__init__.py +4 -0
- body/self_healing/atomic_actions_fixer.py +113 -0
- body/self_healing/body_ui_fixer.py +193 -0
- body/self_healing/capability_parser.py +65 -0
- body/self_healing/code_style_service.py +51 -0
- body/self_healing/complexity_filter.py +70 -0
- body/self_healing/docstring_service.py +345 -0
- body/self_healing/duplicate_id_service.py +407 -0
- body/self_healing/duplicates_service.py +165 -0
- body/self_healing/handlers/__init__.py +1 -0
- body/self_healing/handlers/id_assignment_handler.py +201 -0
- body/self_healing/handlers/import_sorting_handler.py +181 -0
- body/self_healing/header_service.py +308 -0
- body/self_healing/id_tagging_service.py +227 -0
- body/self_healing/knowledge_consolidation_service.py +80 -0
- body/self_healing/logging_service.py +292 -0
- body/self_healing/owner_tagging_service.py +5 -0
- body/self_healing/placeholder_fixer_service.py +27 -0
- body/self_healing/prune_private_capabilities.py +144 -0
- body/self_healing/purge_legacy_tags_service.py +146 -0
- body/self_healing/remediation_models.py +238 -0
- body/self_healing/test_context/__init__.py +10 -0
- body/self_healing/test_context/detectors.py +74 -0
- body/self_healing/test_context/examples.py +53 -0
- body/self_healing/test_context/formatter.py +65 -0
- body/self_healing/test_context/metrics.py +62 -0
- body/self_healing/test_context/models.py +83 -0
- body/self_healing/test_context/parsers.py +70 -0
- body/self_healing/test_context_analyzer.py +79 -0
- body/self_healing/test_failure_analyzer.py +259 -0
- body/self_healing/test_target_analyzer.py +118 -0
- body/self_healing/vulture_healer.py +161 -0
- body/services/__init__.py +4 -0
- body/services/artifact_service.py +155 -0
- body/services/blackboard_service/__init__.py +22 -0
- body/services/blackboard_service/blackboard_claim_service.py +216 -0
- body/services/blackboard_service/blackboard_proposal_service.py +305 -0
- body/services/blackboard_service/blackboard_query_service.py +333 -0
- body/services/blackboard_service/blackboard_service.py +602 -0
- body/services/capabilities.py +51 -0
- body/services/cim/__init__.py +22 -0
- body/services/cim/baselines.py +102 -0
- body/services/cim/census_service.py +190 -0
- body/services/cim/cim_constants.py +116 -0
- body/services/cim/cim_path_utils.py +123 -0
- body/services/cim/diff.py +152 -0
- body/services/cim/history.py +94 -0
- body/services/cim/models.py +319 -0
- body/services/cim/policy.py +149 -0
- body/services/cim/scanners.py +332 -0
- body/services/coherence_service.py +552 -0
- body/services/consequence_log_service.py +189 -0
- body/services/constitutional_rule_loader.py +141 -0
- body/services/constitutional_validator.py +366 -0
- body/services/crate_creation_service.py +217 -0
- body/services/crate_processing_service.py +279 -0
- body/services/crawl_service/__init__.py +10 -0
- body/services/crawl_service/main_module.py +531 -0
- body/services/crawl_service/orchestrator.py +452 -0
- body/services/crawl_service/symbol_processing.py +279 -0
- body/services/database_service.py +242 -0
- body/services/doc_service.py +57 -0
- body/services/file_service.py +260 -0
- body/services/governance_claims_service.py +240 -0
- body/services/governance_init.py +41 -0
- body/services/health_log_service.py +167 -0
- body/services/intent_schema_validator.py +211 -0
- body/services/llm_client.py +87 -0
- body/services/mind_state_service.py +129 -0
- body/services/policy_expression_evaluator.py +154 -0
- body/services/proposal_supervision_service.py +187 -0
- body/services/representation_coherence_service.py +209 -0
- body/services/service_registry.py +431 -0
- body/services/session_attached_service.py +51 -0
- body/services/symbol_query_service.py +218 -0
- body/services/symbol_service.py +94 -0
- body/services/validation/__init__.py +14 -0
- body/services/validation/python_validator.py +89 -0
- body/services/validation/validation_policies.py +121 -0
- body/services/worker_registry_service.py +184 -0
- body/validators/__init__.py +1 -0
- body/validators/logic_conservation_validator.py +201 -0
- body/workers/call_site_rewriter.py +527 -0
- body/workers/prompt_artifact_writer.py +323 -0
- cli/__init__.py +4 -0
- cli/admin_cli.py +98 -0
- cli/cli_user.py +121 -0
- cli/commands/__init__.py +4 -0
- cli/commands/audit_reporter.py +272 -0
- cli/commands/check/__init__.py +115 -0
- cli/commands/check/audit.py +130 -0
- cli/commands/check/converters.py +129 -0
- cli/commands/check/diagnostics_commands.py +70 -0
- cli/commands/check/formatters.py +310 -0
- cli/commands/check/imports.py +73 -0
- cli/commands/check/quality.py +71 -0
- cli/commands/check/quality_gates.py +107 -0
- cli/commands/check/rule.py +136 -0
- cli/commands/check/utils.py +28 -0
- cli/commands/check_atomic_actions.py +167 -0
- cli/commands/components.py +66 -0
- cli/commands/coverage/__init__.py +22 -0
- cli/commands/coverage/analysis_commands.py +87 -0
- cli/commands/coverage/check_commands.py +173 -0
- cli/commands/coverage/generation_commands.py +155 -0
- cli/commands/coverage/services/__init__.py +15 -0
- cli/commands/coverage/services/coverage_checker.py +50 -0
- cli/commands/coverage/services/coverage_reporter.py +81 -0
- cli/commands/coverage/services/gaps_analyzer.py +114 -0
- cli/commands/daemon.py +908 -0
- cli/commands/develop.py +127 -0
- cli/commands/diagnostics.py +32 -0
- cli/commands/fix/__init__.py +84 -0
- cli/commands/fix/all_commands.py +94 -0
- cli/commands/fix/atomic_actions.py +48 -0
- cli/commands/fix/audit.py +146 -0
- cli/commands/fix/body_ui.py +93 -0
- cli/commands/fix/code_style.py +52 -0
- cli/commands/fix/db_tools.py +90 -0
- cli/commands/fix/fix_ir.py +79 -0
- cli/commands/fix/handler_discovery.py +54 -0
- cli/commands/fix/imports.py +55 -0
- cli/commands/fix/list_commands.py +54 -0
- cli/commands/fix/metadata.py +160 -0
- cli/commands/fix/modularity.py +88 -0
- cli/commands/fix/settings_access.py +65 -0
- cli/commands/fix_governed.py +103 -0
- cli/commands/fix_logging.py +24 -0
- cli/commands/governance.py +294 -0
- cli/commands/guard.py +125 -0
- cli/commands/inspect/__init__.py +79 -0
- cli/commands/inspect/_helpers.py +226 -0
- cli/commands/inspect/analysis.py +158 -0
- cli/commands/inspect/decisions.py +140 -0
- cli/commands/inspect/diagnostics.py +126 -0
- cli/commands/inspect/drift.py +100 -0
- cli/commands/inspect/patterns.py +102 -0
- cli/commands/inspect/refusals.py +211 -0
- cli/commands/inspect/repo_census.py +175 -0
- cli/commands/inspect/status.py +48 -0
- cli/commands/interactive_test.py +85 -0
- cli/commands/mind.py +49 -0
- cli/commands/refactor.py +234 -0
- cli/commands/refactor_support/__init__.py +7 -0
- cli/commands/refactor_support/analyzer.py +107 -0
- cli/commands/refactor_support/config.py +67 -0
- cli/commands/refactor_support/display.py +170 -0
- cli/commands/refactor_support/recommendations.py +55 -0
- cli/commands/run.py +60 -0
- cli/commands/search.py +103 -0
- cli/commands/status.py +86 -0
- cli/commands/submit.py +23 -0
- cli/interactive.py +177 -0
- cli/logic/__init__.py +7 -0
- cli/logic/agent.py +110 -0
- cli/logic/audit_capability_domains.py +106 -0
- cli/logic/audit_renderer.py +150 -0
- cli/logic/autonomy/actions.py +36 -0
- cli/logic/autonomy/views.py +116 -0
- cli/logic/body_contracts_checker.py +23 -0
- cli/logic/build.py +27 -0
- cli/logic/byor.py +148 -0
- cli/logic/capability.py +27 -0
- cli/logic/cli_utils.py +210 -0
- cli/logic/context.py +7 -0
- cli/logic/db.py +154 -0
- cli/logic/db_manage.py +22 -0
- cli/logic/decision_inspect_logic.py +62 -0
- cli/logic/diagnostics.py +148 -0
- cli/logic/diagnostics_policy.py +100 -0
- cli/logic/diagnostics_registry.py +165 -0
- cli/logic/duplicates.py +19 -0
- cli/logic/embeddings_cli.py +43 -0
- cli/logic/governance/__init__.py +16 -0
- cli/logic/governance/engine.py +216 -0
- cli/logic/governance/forensics_service.py +67 -0
- cli/logic/governance/limb_status_service.py +83 -0
- cli/logic/governance/renderer.py +115 -0
- cli/logic/governance/traceability_service.py +78 -0
- cli/logic/governance_logic.py +33 -0
- cli/logic/hub/__init__.py +14 -0
- cli/logic/hub/app.py +107 -0
- cli/logic/hub/formatter.py +29 -0
- cli/logic/hub/introspection.py +20 -0
- cli/logic/hub/repository.py +17 -0
- cli/logic/init.py +22 -0
- cli/logic/interactive_test/__init__.py +21 -0
- cli/logic/interactive_test/session.py +102 -0
- cli/logic/interactive_test/steps/__init__.py +23 -0
- cli/logic/interactive_test/steps/execution.py +53 -0
- cli/logic/interactive_test/steps/generation.py +88 -0
- cli/logic/interactive_test/steps/healing.py +79 -0
- cli/logic/interactive_test/steps/utils.py +31 -0
- cli/logic/interactive_test/steps/verification.py +71 -0
- cli/logic/interactive_test/ui.py +203 -0
- cli/logic/interactive_test/workflow.py +168 -0
- cli/logic/interactive_test_logic.py +41 -0
- cli/logic/knowledge.py +47 -0
- cli/logic/legacy_scan_logic.py +306 -0
- cli/logic/list_audits.py +49 -0
- cli/logic/log_audit.py +53 -0
- cli/logic/new.py +8 -0
- cli/logic/project_docs.py +28 -0
- cli/logic/reconcile.py +127 -0
- cli/logic/refusal_inspect_logic.py +208 -0
- cli/logic/report.py +47 -0
- cli/logic/status.py +47 -0
- cli/logic/symbol_drift.py +77 -0
- cli/logic/sync.py +48 -0
- cli/logic/sync_domains.py +72 -0
- cli/logic/sync_manifest.py +31 -0
- cli/logic/tools.py +133 -0
- cli/logic/utils_migration.py +43 -0
- cli/logic/validate.py +107 -0
- cli/logic/vector_drift.py +109 -0
- cli/logic/yaml_processor.py +5 -0
- cli/renderers/audit_detail.py +37 -0
- cli/renderers/audit_overview.py +39 -0
- cli/resources/__init__.py +27 -0
- cli/resources/admin/__init__.py +23 -0
- cli/resources/admin/coverage.py +63 -0
- cli/resources/admin/debt_scan.py +195 -0
- cli/resources/admin/forensics.py +97 -0
- cli/resources/admin/health.py +66 -0
- cli/resources/admin/hub.py +9 -0
- cli/resources/admin/meta.py +47 -0
- cli/resources/admin/patterns.py +28 -0
- cli/resources/admin/refusals.py +31 -0
- cli/resources/admin/self_check.py +175 -0
- cli/resources/admin/status.py +66 -0
- cli/resources/admin/summary.py +67 -0
- cli/resources/admin/traces.py +46 -0
- cli/resources/admin/validate_env.py +56 -0
- cli/resources/code/__init__.py +31 -0
- cli/resources/code/actions.py +48 -0
- cli/resources/code/audit.py +416 -0
- cli/resources/code/audit_duplicates.py +22 -0
- cli/resources/code/check_imports.py +75 -0
- cli/resources/code/check_ui.py +62 -0
- cli/resources/code/clarity.py +51 -0
- cli/resources/code/complexity.py +55 -0
- cli/resources/code/docstrings.py +51 -0
- cli/resources/code/fix_atomic.py +51 -0
- cli/resources/code/format.py +62 -0
- cli/resources/code/hub.py +10 -0
- cli/resources/code/integrity.py +75 -0
- cli/resources/code/lint.py +37 -0
- cli/resources/code/logging.py +49 -0
- cli/resources/code/refactor.py +32 -0
- cli/resources/code/test.py +30 -0
- cli/resources/coherence/__init__.py +13 -0
- cli/resources/coherence/check.py +111 -0
- cli/resources/coherence/hub.py +13 -0
- cli/resources/coherence/repair_counts.py +73 -0
- cli/resources/coherence/report.py +144 -0
- cli/resources/coherence/seed.py +297 -0
- cli/resources/coherence/supersede.py +124 -0
- cli/resources/coherence/triage.py +81 -0
- cli/resources/constitution/__init__.py +19 -0
- cli/resources/constitution/audit.py +49 -0
- cli/resources/constitution/query.py +45 -0
- cli/resources/constitution/status.py +34 -0
- cli/resources/constitution/validate.py +36 -0
- cli/resources/context/__init__.py +21 -0
- cli/resources/context/build.py +374 -0
- cli/resources/context/cache.py +156 -0
- cli/resources/context/explain.py +140 -0
- cli/resources/context/hub.py +11 -0
- cli/resources/context/search.py +114 -0
- cli/resources/database/__init__.py +13 -0
- cli/resources/database/cleanup.py +107 -0
- cli/resources/database/export.py +61 -0
- cli/resources/database/hub.py +11 -0
- cli/resources/database/migrate.py +57 -0
- cli/resources/database/status.py +101 -0
- cli/resources/database/sync.py +84 -0
- cli/resources/database/sync_env.py +76 -0
- cli/resources/database/sync_registry.py +48 -0
- cli/resources/dev/__init__.py +14 -0
- cli/resources/dev/hub.py +11 -0
- cli/resources/dev/refactor.py +92 -0
- cli/resources/dev/stability.py +60 -0
- cli/resources/dev/strategic_audit.py +113 -0
- cli/resources/dev/sync.py +51 -0
- cli/resources/dev/test.py +34 -0
- cli/resources/intent/__init__.py +11 -0
- cli/resources/intent/hub.py +9 -0
- cli/resources/intent/sync_vocabulary.py +396 -0
- cli/resources/project/__init__.py +19 -0
- cli/resources/project/docs.py +41 -0
- cli/resources/project/new.py +40 -0
- cli/resources/project/onboard.py +31 -0
- cli/resources/proposals/__init__.py +28 -0
- cli/resources/proposals/create.py +82 -0
- cli/resources/proposals/integrate.py +49 -0
- cli/resources/proposals/list.py +76 -0
- cli/resources/proposals/manage.py +117 -0
- cli/resources/runtime/__init__.py +9 -0
- cli/resources/runtime/health.py +925 -0
- cli/resources/secrets/__init__.py +10 -0
- cli/resources/secrets/hub.py +9 -0
- cli/resources/secrets/manage.py +309 -0
- cli/resources/symbols/__init__.py +13 -0
- cli/resources/symbols/audit.py +46 -0
- cli/resources/symbols/fix_ids.py +43 -0
- cli/resources/symbols/hub.py +11 -0
- cli/resources/symbols/resolve_duplicates.py +30 -0
- cli/resources/symbols/sync.py +39 -0
- cli/resources/symbols/tag.py +47 -0
- cli/resources/vectors/__init__.py +11 -0
- cli/resources/vectors/cleanup.py +95 -0
- cli/resources/vectors/hub.py +9 -0
- cli/resources/vectors/query.py +105 -0
- cli/resources/vectors/status.py +30 -0
- cli/resources/vectors/sync.py +57 -0
- cli/resources/vectors/sync_code.py +67 -0
- cli/resources/workers/__init__.py +13 -0
- cli/resources/workers/blackboard.py +253 -0
- cli/resources/workers/remediate.py +337 -0
- cli/resources/workers/run.py +140 -0
- cli/utils/__init__.py +32 -0
- cli/utils/annotation_formatter.py +154 -0
- cli/utils/decorators.py +184 -0
- cli/utils/display.py +79 -0
- cli/utils/exit_codes.py +59 -0
- cli/utils/helpers.py +34 -0
- cli/utils/prompts.py +21 -0
- core_runtime-0.1.1.dist-info/LICENSE +21 -0
- core_runtime-0.1.1.dist-info/METADATA +346 -0
- core_runtime-0.1.1.dist-info/RECORD +962 -0
- core_runtime-0.1.1.dist-info/WHEEL +4 -0
- core_runtime-0.1.1.dist-info/entry_points.txt +4 -0
- mind/__init__.py +4 -0
- mind/coherence/__init__.py +1 -0
- mind/coherence/checker.py +314 -0
- mind/coherence/checks/__init__.py +4 -0
- mind/coherence/checks/base.py +34 -0
- mind/coherence/checks/r1_scoped.py +228 -0
- mind/coherence/checks/row2_grounding.py +69 -0
- mind/coherence/checks/row3_citation.py +119 -0
- mind/coherence/checks/row4_naming.py +126 -0
- mind/coherence/checks/sameconcern.py +136 -0
- mind/coherence/checks/specgap.py +233 -0
- mind/coherence/checks/vocabulary.py +112 -0
- mind/coherence/llm_judge.py +207 -0
- mind/enforcement/audit.py +78 -0
- mind/governance/__init__.py +22 -0
- mind/governance/assumption_extractor.py +326 -0
- mind/governance/audit_context.py +520 -0
- mind/governance/audit_postprocessor.py +36 -0
- mind/governance/audit_report_writer.py +46 -0
- mind/governance/audit_types.py +98 -0
- mind/governance/auditor.py +179 -0
- mind/governance/authority_package_builder.py +502 -0
- mind/governance/constitutional_auditor_dynamic.py +362 -0
- mind/governance/enforcement/__init__.py +24 -0
- mind/governance/enforcement_loader.py +245 -0
- mind/governance/enforcement_methods.py +28 -0
- mind/governance/entry_point_policy.py +62 -0
- mind/governance/executable_rule.py +127 -0
- mind/governance/filtered_audit.py +272 -0
- mind/governance/finding_processor.py +76 -0
- mind/governance/meta_validator.py +259 -0
- mind/governance/micro_proposal_validator.py +169 -0
- mind/governance/policy_coverage_service.py +183 -0
- mind/governance/policy_rule.py +94 -0
- mind/governance/rule_conflict_detector.py +127 -0
- mind/governance/rule_executor.py +306 -0
- mind/governance/rule_extractor.py +376 -0
- mind/governance/stateless_audit.py +206 -0
- mind/governance/violation_report.py +136 -0
- mind/logic/engines/_knowledge_gate_duplication.py +117 -0
- mind/logic/engines/action_gate.py +76 -0
- mind/logic/engines/artifact_gate.py +1168 -0
- mind/logic/engines/ast_gate/__init__.py +9 -0
- mind/logic/engines/ast_gate/base.py +263 -0
- mind/logic/engines/ast_gate/checks/__init__.py +35 -0
- mind/logic/engines/ast_gate/checks/async_checks.py +276 -0
- mind/logic/engines/ast_gate/checks/capability_checks.py +197 -0
- mind/logic/engines/ast_gate/checks/conservation_checks.py +126 -0
- mind/logic/engines/ast_gate/checks/generic_checks.py +244 -0
- mind/logic/engines/ast_gate/checks/import_checks.py +164 -0
- mind/logic/engines/ast_gate/checks/knowledge_source_check.py +88 -0
- mind/logic/engines/ast_gate/checks/logging_checks.py +133 -0
- mind/logic/engines/ast_gate/checks/metadata_checks.py +242 -0
- mind/logic/engines/ast_gate/checks/modularity_checks.py +436 -0
- mind/logic/engines/ast_gate/checks/naming_checks.py +120 -0
- mind/logic/engines/ast_gate/checks/prompt_model_checks.py +83 -0
- mind/logic/engines/ast_gate/checks/protected_namespace_access_check.py +298 -0
- mind/logic/engines/ast_gate/checks/purity_checks.py +421 -0
- mind/logic/engines/ast_gate/checks/purity_enforcement_check.py +56 -0
- mind/logic/engines/ast_gate/checks/runtime_import_boundary.py +198 -0
- mind/logic/engines/ast_gate/checks/schema_conformance_checks.py +130 -0
- mind/logic/engines/ast_gate/engine.py +317 -0
- mind/logic/engines/ast_gate.py +19 -0
- mind/logic/engines/base.py +106 -0
- mind/logic/engines/cli_gate/__init__.py +25 -0
- mind/logic/engines/cli_gate/base_check.py +45 -0
- mind/logic/engines/cli_gate/checks/__init__.py +31 -0
- mind/logic/engines/cli_gate/checks/async_execution.py +65 -0
- mind/logic/engines/cli_gate/checks/dangerous_explicit.py +60 -0
- mind/logic/engines/cli_gate/checks/discovery_strict.py +167 -0
- mind/logic/engines/cli_gate/checks/help_required.py +43 -0
- mind/logic/engines/cli_gate/checks/no_duplicates.py +57 -0
- mind/logic/engines/cli_gate/checks/no_layer_exposure.py +48 -0
- mind/logic/engines/cli_gate/checks/resource_first.py +58 -0
- mind/logic/engines/cli_gate/checks/standard_verbs.py +50 -0
- mind/logic/engines/cli_gate/engine.py +211 -0
- mind/logic/engines/glob_gate.py +214 -0
- mind/logic/engines/knowledge_gate.py +410 -0
- mind/logic/engines/llm_gate.py +407 -0
- mind/logic/engines/llm_gate_stub.py +67 -0
- mind/logic/engines/passive_gate.py +45 -0
- mind/logic/engines/regex_gate.py +97 -0
- mind/logic/engines/registry.py +134 -0
- mind/logic/engines/runtime_gate.py +265 -0
- mind/logic/engines/taxonomy_gate.py +229 -0
- mind/logic/engines/workflow_gate/__init__.py +22 -0
- mind/logic/engines/workflow_gate/base_check.py +42 -0
- mind/logic/engines/workflow_gate/checks/__init__.py +32 -0
- mind/logic/engines/workflow_gate/checks/alignment.py +93 -0
- mind/logic/engines/workflow_gate/checks/audit.py +80 -0
- mind/logic/engines/workflow_gate/checks/canary.py +47 -0
- mind/logic/engines/workflow_gate/checks/coverage.py +74 -0
- mind/logic/engines/workflow_gate/checks/dead_code.py +53 -0
- mind/logic/engines/workflow_gate/checks/import_resolution.py +97 -0
- mind/logic/engines/workflow_gate/checks/linter.py +104 -0
- mind/logic/engines/workflow_gate/checks/quality.py +49 -0
- mind/logic/engines/workflow_gate/checks/ruff_format.py +99 -0
- mind/logic/engines/workflow_gate/checks/tests.py +81 -0
- mind/logic/engines/workflow_gate/engine.py +207 -0
- shared/__init__.py +32 -0
- shared/action_logger.py +61 -0
- shared/action_types.py +199 -0
- shared/activity_logging.py +149 -0
- shared/ai/constitutional_envelope.py +341 -0
- shared/ai/prompt_model.py +585 -0
- shared/ai/response_parser.py +191 -0
- shared/ast_utility.py +279 -0
- shared/atomic_action.py +117 -0
- shared/cli/__init__.py +6 -0
- shared/cli/app_introspection.py +134 -0
- shared/cli/command_meta.py +224 -0
- shared/cli_types.py +92 -0
- shared/component_primitive.py +216 -0
- shared/config.py +216 -0
- shared/config_loader.py +54 -0
- shared/context.py +113 -0
- shared/exceptions.py +100 -0
- shared/governance/__init__.py +9 -0
- shared/governance/coherence_harvester.py +258 -0
- shared/governance_token.py +77 -0
- shared/infrastructure/__init__.py +5 -0
- shared/infrastructure/adapters/__init__.py +5 -0
- shared/infrastructure/adapters/embedding_provider.py +66 -0
- shared/infrastructure/bootstrap_registry.py +57 -0
- shared/infrastructure/clients/__init__.py +5 -0
- shared/infrastructure/clients/qdrant_client.py +455 -0
- shared/infrastructure/config_service.py +382 -0
- shared/infrastructure/config_validator.py +70 -0
- shared/infrastructure/context/__init__.py +45 -0
- shared/infrastructure/context/builder.py +804 -0
- shared/infrastructure/context/cache.py +101 -0
- shared/infrastructure/context/database.py +205 -0
- shared/infrastructure/context/limb_workspace.py +134 -0
- shared/infrastructure/context/models.py +65 -0
- shared/infrastructure/context/providers/__init__.py +18 -0
- shared/infrastructure/context/providers/ast.py +211 -0
- shared/infrastructure/context/providers/db.py +165 -0
- shared/infrastructure/context/providers/vectors.py +195 -0
- shared/infrastructure/context/redactor.py +109 -0
- shared/infrastructure/context/serializers.py +144 -0
- shared/infrastructure/context/service.py +271 -0
- shared/infrastructure/context/validator.py +247 -0
- shared/infrastructure/database/models/__init__.py +80 -0
- shared/infrastructure/database/models/autonomous_proposals.py +83 -0
- shared/infrastructure/database/models/decision_traces.py +129 -0
- shared/infrastructure/database/models/governance.py +183 -0
- shared/infrastructure/database/models/knowledge.py +205 -0
- shared/infrastructure/database/models/learning.py +99 -0
- shared/infrastructure/database/models/llm_config.py +274 -0
- shared/infrastructure/database/models/operations.py +152 -0
- shared/infrastructure/database/models/refusals.py +147 -0
- shared/infrastructure/database/models/system.py +124 -0
- shared/infrastructure/database/models/vectors.py +113 -0
- shared/infrastructure/database/models/workers.py +96 -0
- shared/infrastructure/database/session_manager.py +166 -0
- shared/infrastructure/diagnostic_service.py +103 -0
- shared/infrastructure/events/__init__.py +5 -0
- shared/infrastructure/events/base.py +44 -0
- shared/infrastructure/events/bus.py +76 -0
- shared/infrastructure/git_service.py +385 -0
- shared/infrastructure/intent/action_risk.py +135 -0
- shared/infrastructure/intent/audit_verdict.py +131 -0
- shared/infrastructure/intent/autonomy_dirty_tree.py +104 -0
- shared/infrastructure/intent/canonical_enums.py +116 -0
- shared/infrastructure/intent/cognitive_roles.py +96 -0
- shared/infrastructure/intent/errors.py +13 -0
- shared/infrastructure/intent/filesystem_operations.py +359 -0
- shared/infrastructure/intent/intent_connector.py +157 -0
- shared/infrastructure/intent/intent_repository.py +707 -0
- shared/infrastructure/intent/intent_validator.py +248 -0
- shared/infrastructure/intent/operational_capabilities.py +470 -0
- shared/infrastructure/intent/operational_config.py +1343 -0
- shared/infrastructure/intent/operational_mode.py +66 -0
- shared/infrastructure/intent/task_type_phases.py +180 -0
- shared/infrastructure/intent/test_coverage_paths.py +181 -0
- shared/infrastructure/intent/vocabulary_projection.py +241 -0
- shared/infrastructure/knowledge/knowledge_service.py +155 -0
- shared/infrastructure/knowledge_graph_service.py +214 -0
- shared/infrastructure/llm/client.py +448 -0
- shared/infrastructure/llm/client_registry.py +153 -0
- shared/infrastructure/llm/fallback_client.py +144 -0
- shared/infrastructure/llm/providers/anthropic.py +113 -0
- shared/infrastructure/llm/providers/base.py +130 -0
- shared/infrastructure/llm/providers/ollama.py +265 -0
- shared/infrastructure/llm/providers/openai.py +168 -0
- shared/infrastructure/repositories/__init__.py +5 -0
- shared/infrastructure/repositories/db/__init__.py +5 -0
- shared/infrastructure/repositories/db/common.py +138 -0
- shared/infrastructure/repositories/db/engine.py +26 -0
- shared/infrastructure/repositories/db/migration_service.py +75 -0
- shared/infrastructure/repositories/db/status_service.py +61 -0
- shared/infrastructure/repositories/memory_repository.py +134 -0
- shared/infrastructure/repositories/symbol_definition_repository.py +170 -0
- shared/infrastructure/repositories/task_repository.py +59 -0
- shared/infrastructure/repositories/vector_link_repository.py +83 -0
- shared/infrastructure/rooted_repository.py +50 -0
- shared/infrastructure/secrets_service.py +317 -0
- shared/infrastructure/specs/__init__.py +9 -0
- shared/infrastructure/specs/specs_repository.py +100 -0
- shared/infrastructure/storage/file_classifier.py +32 -0
- shared/infrastructure/storage/file_handler.py +330 -0
- shared/infrastructure/storage/file_provider.py +233 -0
- shared/infrastructure/storage/integrity_service.py +108 -0
- shared/infrastructure/validation/black_formatter.py +41 -0
- shared/infrastructure/validation/quality.py +46 -0
- shared/infrastructure/validation/ruff_linter.py +104 -0
- shared/infrastructure/validation/syntax_checker.py +45 -0
- shared/infrastructure/validation/test_runner.py +167 -0
- shared/infrastructure/validation/yaml_validator.py +45 -0
- shared/infrastructure/vector/__init__.py +15 -0
- shared/infrastructure/vector/adapters/__init__.py +20 -0
- shared/infrastructure/vector/adapters/constitutional/__init__.py +26 -0
- shared/infrastructure/vector/adapters/constitutional/chunker.py +246 -0
- shared/infrastructure/vector/adapters/constitutional/doc_key_resolver.py +109 -0
- shared/infrastructure/vector/adapters/constitutional/item_builder.py +158 -0
- shared/infrastructure/vector/adapters/constitutional/utils.py +39 -0
- shared/infrastructure/vector/adapters/constitutional_adapter.py +309 -0
- shared/infrastructure/vector/adapters/specs_adapter.py +171 -0
- shared/infrastructure/vector/cognitive_adapter.py +119 -0
- shared/infrastructure/vector/vector_index_service.py +230 -0
- shared/logger.py +195 -0
- shared/models/__init__.py +47 -0
- shared/models/action_result.py +77 -0
- shared/models/audit_models.py +106 -0
- shared/models/audit_rendering.py +30 -0
- shared/models/capability_models.py +22 -0
- shared/models/constitutional_validation.py +185 -0
- shared/models/drift_models.py +24 -0
- shared/models/embedding_payload.py +45 -0
- shared/models/execution_models.py +71 -0
- shared/models/pattern_graph.py +62 -0
- shared/models/prompt_model.py +244 -0
- shared/models/refusal_result.py +294 -0
- shared/models/remediation.py +35 -0
- shared/models/validation_result.py +34 -0
- shared/models/vector_models.py +62 -0
- shared/models/workflow_models.py +242 -0
- shared/path_resolver.py +408 -0
- shared/path_utils.py +60 -0
- shared/processors/base_processor.py +171 -0
- shared/processors/yaml_processor.py +72 -0
- shared/protocols/__init__.py +21 -0
- shared/protocols/brain_services.py +35 -0
- shared/protocols/cognitive.py +35 -0
- shared/protocols/executor.py +47 -0
- shared/protocols/interpreter.py +24 -0
- shared/protocols/knowledge.py +21 -0
- shared/protocols/llm.py +25 -0
- shared/protocols/typer_protocols.py +37 -0
- shared/time.py +18 -0
- shared/universal.py +43 -0
- shared/utils/__init__.py +81 -0
- shared/utils/audit_grouping.py +50 -0
- shared/utils/common_knowledge.py +82 -0
- shared/utils/domain_mapper.py +61 -0
- shared/utils/embedding_utils.py +182 -0
- shared/utils/glob_match.py +93 -0
- shared/utils/header_tools.py +177 -0
- shared/utils/parallel_processor.py +60 -0
- shared/utils/parsing.py +189 -0
- shared/utils/path_utils.py +268 -0
- shared/utils/subprocess_utils.py +87 -0
- shared/workers/__init__.py +19 -0
- shared/workers/base.py +533 -0
- shared/workers/declaration_validator.py +124 -0
- shared/workers/loop_hold_telemetry.py +210 -0
- shared/workers/schedule.py +123 -0
- will/__init__.py +4 -0
- will/agents/__init__.py +4 -0
- will/agents/base_planner.py +133 -0
- will/agents/code_generation/__init__.py +15 -0
- will/agents/code_generation/code_generator.py +247 -0
- will/agents/code_generation/context_formatters.py +99 -0
- will/agents/code_generation/correction_engine.py +157 -0
- will/agents/code_generation/extraction.py +165 -0
- will/agents/code_generation/pattern_validator.py +264 -0
- will/agents/code_generation/prompt_builders.py +209 -0
- will/agents/coder_agent.py +229 -0
- will/agents/coder_agent_refusal_handler.py +168 -0
- will/agents/cognitive_orchestrator.py +152 -0
- will/agents/conversational/__init__.py +13 -0
- will/agents/conversational/agent.py +271 -0
- will/agents/conversational/factory.py +72 -0
- will/agents/conversational/helpers.py +116 -0
- will/agents/execution_agent.py +294 -0
- will/agents/governance_mixin.py +132 -0
- will/agents/planner_agent.py +261 -0
- will/agents/resource_selector.py +228 -0
- will/agents/strategic_auditor/__init__.py +15 -0
- will/agents/strategic_auditor/agent.py +199 -0
- will/agents/strategic_auditor/context_gatherer.py +586 -0
- will/agents/strategic_auditor/effects.py +136 -0
- will/agents/strategic_auditor/models.py +61 -0
- will/agents/strategic_auditor/reasoning.py +169 -0
- will/agents/tagger_agent.py +294 -0
- will/agents/traced_agent_mixin.py +33 -0
- will/autonomy/__init__.py +20 -0
- will/autonomy/autonomous_developer.py +127 -0
- will/autonomy/proposal.py +585 -0
- will/autonomy/proposal_execution_pipeline.py +264 -0
- will/autonomy/proposal_executor.py +410 -0
- will/autonomy/proposal_mapper.py +187 -0
- will/autonomy/proposal_repository.py +118 -0
- will/autonomy/proposal_service.py +251 -0
- will/autonomy/proposal_state_manager.py +239 -0
- will/deciders/__init__.py +9 -0
- will/deciders/governance_decider.py +207 -0
- will/governance/__init__.py +13 -0
- will/governance/audit_remediation_runner.py +197 -0
- will/governance/audit_runner.py +368 -0
- will/governance/census_runner.py +278 -0
- will/governance/coverage_runner.py +489 -0
- will/governance/daemon_runner.py +164 -0
- will/governance/fix_runner.py +693 -0
- will/governance/inspect_runner.py +521 -0
- will/governance/integrity_runner.py +66 -0
- will/governance/lint_runner.py +93 -0
- will/governance/refactor_runner.py +372 -0
- will/governance/sync_runner.py +186 -0
- will/interpreters/__init__.py +44 -0
- will/interpreters/cli_args_interpreter.py +106 -0
- will/interpreters/natural_language_interpreter.py +276 -0
- will/interpreters/request_interpreter.py +126 -0
- will/lifecycle/__init__.py +12 -0
- will/lifecycle/integration_runner.py +54 -0
- will/maintenance/metadata_scribe_service.py +64 -0
- will/orchestration/__init__.py +4 -0
- will/orchestration/cognitive_service.py +185 -0
- will/orchestration/decision_tracer.py +257 -0
- will/orchestration/intent_alignment.py +59 -0
- will/orchestration/intent_guard.py +20 -0
- will/orchestration/phase_registry.py +92 -0
- will/orchestration/process_orchestrator.py +270 -0
- will/orchestration/prompt_pipeline.py +174 -0
- will/orchestration/remediation_orchestrator.py +292 -0
- will/orchestration/self_correction_engine.py +154 -0
- will/orchestration/validation_pipeline.py +45 -0
- will/orchestration/workflow_orchestrator.py +277 -0
- will/phases/__init__.py +24 -0
- will/phases/audit_phase.py +152 -0
- will/phases/canary/pytest_runner.py +156 -0
- will/phases/canary/result_builder.py +130 -0
- will/phases/canary/test_discovery.py +104 -0
- will/phases/canary_validation_phase.py +188 -0
- will/phases/code_generation/artifact_saver.py +175 -0
- will/phases/code_generation/code_sensor.py +117 -0
- will/phases/code_generation/file_path_extractor.py +53 -0
- will/phases/code_generation/work_directory_manager.py +83 -0
- will/phases/code_generation_phase.py +480 -0
- will/phases/execution_phase.py +179 -0
- will/phases/interpret_phase.py +266 -0
- will/phases/load_phase.py +102 -0
- will/phases/parse_phase.py +117 -0
- will/phases/planning_phase.py +182 -0
- will/phases/runtime_phase.py +112 -0
- will/phases/sandbox_validation_phase.py +130 -0
- will/phases/style_check_phase.py +209 -0
- will/phases/test_generation_phase.py +159 -0
- will/self_healing/alignment/persistence.py +53 -0
- will/self_healing/alignment/sandbox.py +51 -0
- will/self_healing/alignment/specialists.py +165 -0
- will/self_healing/alignment_orchestrator.py +140 -0
- will/self_healing/audit_remediation_service.py +199 -0
- will/self_healing/batch_remediation_service.py +280 -0
- will/self_healing/capability_reconciliation_service.py +96 -0
- will/self_healing/capability_tagging_service.py +224 -0
- will/self_healing/clarity_service.py +204 -0
- will/self_healing/complexity_service.py +260 -0
- will/self_healing/context_aware_test_generator.py +298 -0
- will/self_healing/coverage_remediation_service.py +97 -0
- will/self_healing/coverage_watcher.py +192 -0
- will/self_healing/enrichment_service.py +211 -0
- will/self_healing/linelength_service.py +168 -0
- will/self_healing/modularity_remediation_service.py +203 -0
- will/self_healing/remediation_evidence_writer.py +144 -0
- will/self_healing/remediation_executor.py +113 -0
- will/self_healing/remediation_interpretation/__init__.py +1 -0
- will/self_healing/remediation_interpretation/file_context_assembler.py +383 -0
- will/self_healing/remediation_interpretation/file_role_detector.py +599 -0
- will/self_healing/remediation_interpretation/finding_normalizer.py +221 -0
- will/self_healing/remediation_interpretation/models.py +198 -0
- will/self_healing/remediation_interpretation/reasoning_brief_builder.py +235 -0
- will/self_healing/remediation_interpretation/responsibility_extractor.py +421 -0
- will/self_healing/remediation_interpretation/service.py +202 -0
- will/self_healing/remediation_interpretation/strategy_catalog.py +252 -0
- will/self_healing/remediation_interpretation/strategy_selector.py +395 -0
- will/self_healing/remediation_pattern_matcher.py +126 -0
- will/self_healing/simple_test_generator.py +252 -0
- will/self_healing/single_file_remediation.py +137 -0
- will/self_healing/test_generation/automatic_repair.py +377 -0
- will/self_healing/test_generation/code_extractor.py +238 -0
- will/self_healing/test_generation/context_builder.py +140 -0
- will/self_healing/test_generation/executor.py +64 -0
- will/self_healing/test_generation/failure_parser.py +37 -0
- will/self_healing/test_generation/generation_workflow.py +140 -0
- will/self_healing/test_generation/generator.py +283 -0
- will/self_healing/test_generation/llm_correction.py +160 -0
- will/self_healing/test_generation/repair_workflow.py +128 -0
- will/self_healing/test_generation/single_test_fixer.py +77 -0
- will/self_healing/test_generation/test_extractor.py +50 -0
- will/self_healing/test_generation/test_scorer.py +53 -0
- will/self_healing/test_generation/test_validator.py +64 -0
- will/self_healing/test_generator.py +12 -0
- will/strategists/__init__.py +46 -0
- will/strategists/base_strategist.py +29 -0
- will/strategists/clarity_strategist.py +55 -0
- will/strategists/complexity_strategist.py +55 -0
- will/strategists/fix_strategist.py +467 -0
- will/strategists/sync_strategist.py +369 -0
- will/strategists/test_strategist.py +140 -0
- will/strategists/validation_strategist.py +315 -0
- will/test_generation/__init__.py +46 -0
- will/test_generation/adaptive_test_generator.py +123 -0
- will/test_generation/artifacts.py +102 -0
- will/test_generation/harness_detection.py +103 -0
- will/test_generation/helpers/__init__.py +14 -0
- will/test_generation/helpers/context_extractor.py +100 -0
- will/test_generation/helpers/test_executor.py +230 -0
- will/test_generation/llm_output.py +62 -0
- will/test_generation/models.py +25 -0
- will/test_generation/persistence.py +248 -0
- will/test_generation/phases/__init__.py +16 -0
- will/test_generation/phases/generation_phase.py +150 -0
- will/test_generation/phases/load_phase.py +53 -0
- will/test_generation/phases/parse_phase.py +50 -0
- will/test_generation/prompt_engine.py +123 -0
- will/test_generation/result_aggregator.py +73 -0
- will/test_generation/sandbox.py +203 -0
- will/test_generation/strategy_link.py +56 -0
- will/test_generation/test_extractor.py +140 -0
- will/test_generation/validation.py +89 -0
- will/tools/__init__.py +13 -0
- will/tools/anchor_builder.py +111 -0
- will/tools/anchor_search.py +73 -0
- will/tools/anchors/discovery.py +55 -0
- will/tools/anchors/storage.py +32 -0
- will/tools/architectural_context_builder.py +94 -0
- will/tools/cognitive_toolbox.py +47 -0
- will/tools/context/code_snippet_extractor.py +83 -0
- will/tools/context/embedding_search.py +76 -0
- will/tools/context/formatter.py +87 -0
- will/tools/context/models.py +38 -0
- will/tools/context/query_builder.py +42 -0
- will/tools/context/retriever.py +182 -0
- will/tools/context/standards.py +53 -0
- will/tools/file_navigator.py +180 -0
- will/tools/layers.py +31 -0
- will/tools/module_anchor_generator.py +137 -0
- will/tools/module_descriptor.py +154 -0
- will/tools/policy_vectorizer.py +184 -0
- will/tools/symbol_finder.py +188 -0
- will/tools/tool_generator.py +103 -0
- will/workers/audit_ingest_worker.py +207 -0
- will/workers/audit_violation_filter.py +108 -0
- will/workers/audit_violation_normalizer.py +108 -0
- will/workers/audit_violation_sensor.py +370 -0
- will/workers/blackboard_shop_manager.py +280 -0
- will/workers/capability_tagger.py +153 -0
- will/workers/circuit_breaker.py +335 -0
- will/workers/coherence_sensor.py +212 -0
- will/workers/commit_reachability_auditor.py +135 -0
- will/workers/db_sync_worker.py +96 -0
- will/workers/governance_embedding/__init__.py +9 -0
- will/workers/governance_embedding/governance_embedder_worker.py +189 -0
- will/workers/intent_inspector.py +599 -0
- will/workers/observer_worker.py +158 -0
- will/workers/prompt_extractor_worker.py +241 -0
- will/workers/proposal_consumer_effects.py +216 -0
- will/workers/proposal_consumer_revival.py +131 -0
- will/workers/proposal_consumer_worker.py +271 -0
- will/workers/proposal_pipeline_shop_manager.py +273 -0
- will/workers/repo_crawler.py +171 -0
- will/workers/repo_embedding/__init__.py +18 -0
- will/workers/repo_embedding/helpers.py +245 -0
- will/workers/repo_embedding/repo_embedder_workers.py +163 -0
- will/workers/test_coverage_sensor.py +208 -0
- will/workers/test_remediator/__init__.py +12 -0
- will/workers/test_remediator/_operations.py +295 -0
- will/workers/test_remediator/worker.py +187 -0
- will/workers/test_runner_sensor.py +430 -0
- will/workers/violation_executor.py +496 -0
- will/workers/violation_remediator.py +394 -0
- will/workers/violation_remediator_blackboard.py +225 -0
- will/workers/violation_remediator_body/__init__.py +12 -0
- will/workers/violation_remediator_body/blackboard.py +139 -0
- will/workers/violation_remediator_body/ceremony.py +154 -0
- will/workers/violation_remediator_body/context.py +70 -0
- will/workers/violation_remediator_body/llm.py +112 -0
- will/workers/violation_remediator_body/models.py +35 -0
- will/workers/violation_remediator_body/worker.py +518 -0
- will/workers/violation_remediator_proposal.py +328 -0
- will/workers/worker_shop_manager.py +244 -0
- will/workflows/__init__.py +23 -0
- will/workflows/dev_sync_reporter.py +274 -0
- will/workflows/dev_sync_workflow.py +118 -0
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
# src/body/services/symbol_query_service.py
|
|
2
|
+
|
|
3
|
+
"""
|
|
4
|
+
SymbolQueryService - Body layer service for symbol search and lookup.
|
|
5
|
+
|
|
6
|
+
Constitutional Compliance:
|
|
7
|
+
- Body layer service: Provides capability without making decisions
|
|
8
|
+
- Mind/Body/Will separation: Encapsulates symbol database access
|
|
9
|
+
- No direct database access in Will: Will queries symbols through this service
|
|
10
|
+
- Dependency injection: Takes AsyncSession, no global imports
|
|
11
|
+
|
|
12
|
+
Part of Mind-Body-Will architecture:
|
|
13
|
+
- Mind: Database contains Symbol definitions (what exists in codebase)
|
|
14
|
+
- Body: This service provides search/lookup capability
|
|
15
|
+
- Will: Uses this service to find symbols for decision-making (strategy)
|
|
16
|
+
"""
|
|
17
|
+
|
|
18
|
+
from __future__ import annotations
|
|
19
|
+
|
|
20
|
+
from sqlalchemy import or_, select
|
|
21
|
+
from sqlalchemy.ext.asyncio import AsyncSession
|
|
22
|
+
|
|
23
|
+
from shared.infrastructure.database.models import Symbol
|
|
24
|
+
from shared.logger import getLogger
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
logger = getLogger(__name__)
|
|
28
|
+
|
|
29
|
+
__all__ = ["SymbolQueryService"]
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
# ID: f6789012-3456-7890-abcd-ef1234567890
|
|
33
|
+
class SymbolQueryService:
|
|
34
|
+
"""
|
|
35
|
+
Body service for symbol search and lookup operations.
|
|
36
|
+
|
|
37
|
+
Responsibilities:
|
|
38
|
+
- Provide search interface for symbols by name, module, qualname
|
|
39
|
+
- Encapsulate symbol database queries
|
|
40
|
+
- Return structured symbol data for Will to use in decisions
|
|
41
|
+
|
|
42
|
+
Does NOT:
|
|
43
|
+
- Decide which symbols to use (that's Will)
|
|
44
|
+
- Modify symbols (that's SymbolDefinitionRepository)
|
|
45
|
+
- Generate symbols (that's code analysis tools)
|
|
46
|
+
"""
|
|
47
|
+
|
|
48
|
+
def __init__(self, session: AsyncSession):
|
|
49
|
+
"""
|
|
50
|
+
Initialize service with database session.
|
|
51
|
+
|
|
52
|
+
Args:
|
|
53
|
+
session: Active database session for queries
|
|
54
|
+
"""
|
|
55
|
+
self.session = session
|
|
56
|
+
|
|
57
|
+
# ID: 01234567-89ab-cdef-0123-456789abcdef
|
|
58
|
+
async def search_symbols(
|
|
59
|
+
self, query: str, limit: int | None = None
|
|
60
|
+
) -> list[Symbol]:
|
|
61
|
+
"""
|
|
62
|
+
Search symbols by name or module using fuzzy matching.
|
|
63
|
+
|
|
64
|
+
Args:
|
|
65
|
+
query: Search term (matched against qualname and module)
|
|
66
|
+
limit: Optional maximum number of results
|
|
67
|
+
|
|
68
|
+
Returns:
|
|
69
|
+
List of Symbol instances matching the query
|
|
70
|
+
|
|
71
|
+
Constitutional Note:
|
|
72
|
+
This is a read operation. Will uses this to discover available symbols
|
|
73
|
+
for import generation or code understanding.
|
|
74
|
+
|
|
75
|
+
Example:
|
|
76
|
+
symbols = await symbol_service.search_symbols("FileHandler")
|
|
77
|
+
"""
|
|
78
|
+
# Clean query for SQL ILIKE
|
|
79
|
+
clean_query = query.strip()
|
|
80
|
+
|
|
81
|
+
stmt = select(Symbol).where(
|
|
82
|
+
or_(
|
|
83
|
+
Symbol.qualname.ilike(f"%{clean_query}%"),
|
|
84
|
+
Symbol.module.ilike(f"%{clean_query}%"),
|
|
85
|
+
)
|
|
86
|
+
)
|
|
87
|
+
|
|
88
|
+
if limit is not None:
|
|
89
|
+
stmt = stmt.limit(limit)
|
|
90
|
+
|
|
91
|
+
result = await self.session.execute(stmt)
|
|
92
|
+
symbols = list(result.scalars().all())
|
|
93
|
+
|
|
94
|
+
logger.debug("Symbol search for '%s' returned %d results", query, len(symbols))
|
|
95
|
+
return symbols
|
|
96
|
+
|
|
97
|
+
# ID: 12345678-9abc-def0-1234-56789abcdef0
|
|
98
|
+
async def find_by_name(self, name: str) -> Symbol | None:
|
|
99
|
+
"""
|
|
100
|
+
Find symbol by exact name match.
|
|
101
|
+
|
|
102
|
+
Args:
|
|
103
|
+
name: Exact symbol name to find
|
|
104
|
+
|
|
105
|
+
Returns:
|
|
106
|
+
Symbol instance if found, None otherwise
|
|
107
|
+
|
|
108
|
+
Constitutional Note:
|
|
109
|
+
Exact lookup for when Will knows precisely which symbol it needs.
|
|
110
|
+
Returns single result or None (not a list).
|
|
111
|
+
|
|
112
|
+
Example:
|
|
113
|
+
symbol = await symbol_service.find_by_name("FileHandler")
|
|
114
|
+
"""
|
|
115
|
+
stmt = select(Symbol).where(Symbol.name == name).limit(1)
|
|
116
|
+
|
|
117
|
+
result = await self.session.execute(stmt)
|
|
118
|
+
symbol = result.scalar_one_or_none()
|
|
119
|
+
|
|
120
|
+
if symbol:
|
|
121
|
+
logger.debug("Found symbol: %s in %s", name, symbol.module)
|
|
122
|
+
else:
|
|
123
|
+
logger.debug("Symbol not found: %s", name)
|
|
124
|
+
|
|
125
|
+
return symbol
|
|
126
|
+
|
|
127
|
+
# ID: 23456789-abcd-ef01-2345-6789abcdef01
|
|
128
|
+
async def find_by_module(self, module: str) -> list[Symbol]:
|
|
129
|
+
"""
|
|
130
|
+
Find all symbols in a specific module.
|
|
131
|
+
|
|
132
|
+
Args:
|
|
133
|
+
module: Module path (e.g., "shared.infrastructure.database")
|
|
134
|
+
|
|
135
|
+
Returns:
|
|
136
|
+
List of Symbol instances in the module
|
|
137
|
+
|
|
138
|
+
Constitutional Note:
|
|
139
|
+
Module-level queries for when Will needs to understand
|
|
140
|
+
what's available in a specific module.
|
|
141
|
+
|
|
142
|
+
Example:
|
|
143
|
+
symbols = await symbol_service.find_by_module("src.body.services")
|
|
144
|
+
"""
|
|
145
|
+
stmt = select(Symbol).where(Symbol.module == module)
|
|
146
|
+
|
|
147
|
+
result = await self.session.execute(stmt)
|
|
148
|
+
symbols = list(result.scalars().all())
|
|
149
|
+
|
|
150
|
+
logger.debug("Found %d symbols in module %s", len(symbols), module)
|
|
151
|
+
return symbols
|
|
152
|
+
|
|
153
|
+
# ID: 3456789a-bcde-f012-3456-789abcdef012
|
|
154
|
+
async def find_by_qualname(self, qualname: str) -> Symbol | None:
|
|
155
|
+
"""
|
|
156
|
+
Find symbol by fully qualified name.
|
|
157
|
+
|
|
158
|
+
Args:
|
|
159
|
+
qualname: Fully qualified name (e.g., "FileHandler.write_file")
|
|
160
|
+
|
|
161
|
+
Returns:
|
|
162
|
+
Symbol instance if found, None otherwise
|
|
163
|
+
|
|
164
|
+
Constitutional Note:
|
|
165
|
+
Most precise lookup method. Will uses this when it has
|
|
166
|
+
the complete qualified path to a symbol.
|
|
167
|
+
|
|
168
|
+
Example:
|
|
169
|
+
symbol = await symbol_service.find_by_qualname(
|
|
170
|
+
"shared.infrastructure.storage.FileHandler.write_file"
|
|
171
|
+
)
|
|
172
|
+
"""
|
|
173
|
+
stmt = select(Symbol).where(Symbol.qualname == qualname).limit(1)
|
|
174
|
+
|
|
175
|
+
result = await self.session.execute(stmt)
|
|
176
|
+
symbol = result.scalar_one_or_none()
|
|
177
|
+
|
|
178
|
+
if symbol:
|
|
179
|
+
logger.debug("Found symbol by qualname: %s", qualname)
|
|
180
|
+
else:
|
|
181
|
+
logger.debug("Symbol not found by qualname: %s", qualname)
|
|
182
|
+
|
|
183
|
+
return symbol
|
|
184
|
+
|
|
185
|
+
# ID: 456789ab-cdef-0123-4567-89abcdef0123
|
|
186
|
+
async def get_symbols_by_file(self, file_path: str) -> list[Symbol]:
|
|
187
|
+
"""
|
|
188
|
+
Get all symbols defined in a specific file.
|
|
189
|
+
|
|
190
|
+
Args:
|
|
191
|
+
file_path: Repository-relative file path
|
|
192
|
+
|
|
193
|
+
Returns:
|
|
194
|
+
List of Symbol instances defined in the file
|
|
195
|
+
|
|
196
|
+
Constitutional Note:
|
|
197
|
+
File-level queries for when Will needs to understand
|
|
198
|
+
what's defined in a specific source file.
|
|
199
|
+
|
|
200
|
+
Example:
|
|
201
|
+
symbols = await symbol_service.get_symbols_by_file(
|
|
202
|
+
"src/body/services/mind_state_service.py"
|
|
203
|
+
)
|
|
204
|
+
"""
|
|
205
|
+
stmt = select(Symbol).where(Symbol.file_path == file_path)
|
|
206
|
+
|
|
207
|
+
result = await self.session.execute(stmt)
|
|
208
|
+
symbols = list(result.scalars().all())
|
|
209
|
+
|
|
210
|
+
logger.debug("Found %d symbols in file %s", len(symbols), file_path)
|
|
211
|
+
return symbols
|
|
212
|
+
|
|
213
|
+
|
|
214
|
+
# Constitutional Note:
|
|
215
|
+
# This service exists because Will layer MUST NOT import get_session directly.
|
|
216
|
+
# Symbol queries are reads, but they're still infrastructure access.
|
|
217
|
+
# Will depends on Body for capabilities. This service IS that capability.
|
|
218
|
+
# Any Will component needing symbol data should receive SymbolQueryService via DI.
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
# src/body/services/symbol_service.py
|
|
2
|
+
"""
|
|
3
|
+
SymbolService - Data-access layer for core.symbols (capability tagging).
|
|
4
|
+
|
|
5
|
+
Covers:
|
|
6
|
+
- CapabilityTaggerWorker._fetch_untagged_symbols
|
|
7
|
+
- CapabilityTaggerWorker._tag_symbols (UPDATE loop)
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from __future__ import annotations
|
|
11
|
+
|
|
12
|
+
from typing import Any
|
|
13
|
+
|
|
14
|
+
from sqlalchemy import text
|
|
15
|
+
|
|
16
|
+
from shared.logger import getLogger
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
logger = getLogger(__name__)
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
# ID: 5fa7ca27-3636-48c8-87af-6dba94427689
|
|
23
|
+
class SymbolService:
|
|
24
|
+
"""
|
|
25
|
+
Body layer service. Exposes named methods for core.symbols operations
|
|
26
|
+
used by CapabilityTaggerWorker.
|
|
27
|
+
"""
|
|
28
|
+
|
|
29
|
+
# ID: 8cd068da-396e-47d9-a241-f4a3c3633a21
|
|
30
|
+
async def fetch_untagged_symbols(self, batch_size: int) -> list[dict[str, Any]]:
|
|
31
|
+
"""
|
|
32
|
+
Return up to *batch_size* public, non-deprecated symbols with no
|
|
33
|
+
capability key assigned, ordered by symbol_path.
|
|
34
|
+
|
|
35
|
+
Covers:
|
|
36
|
+
- CapabilityTaggerWorker._fetch_untagged_symbols
|
|
37
|
+
"""
|
|
38
|
+
from body.services.service_registry import ServiceRegistry
|
|
39
|
+
|
|
40
|
+
async with ServiceRegistry.session() as session:
|
|
41
|
+
result = await session.execute(
|
|
42
|
+
text(
|
|
43
|
+
"""
|
|
44
|
+
SELECT
|
|
45
|
+
id, symbol_path, qualname, file_path,
|
|
46
|
+
kind, domain, docstring, is_public, calls
|
|
47
|
+
FROM core.symbols
|
|
48
|
+
WHERE key IS NULL
|
|
49
|
+
AND is_public = true
|
|
50
|
+
AND state != 'deprecated'
|
|
51
|
+
AND file_path IS NOT NULL
|
|
52
|
+
AND file_path != ''
|
|
53
|
+
ORDER BY symbol_path
|
|
54
|
+
LIMIT :batch_size
|
|
55
|
+
"""
|
|
56
|
+
),
|
|
57
|
+
{"batch_size": batch_size},
|
|
58
|
+
)
|
|
59
|
+
return [dict(row) for row in result.mappings().all()]
|
|
60
|
+
|
|
61
|
+
# ID: a47395b5-daea-43f4-94eb-515619cc9678
|
|
62
|
+
async def apply_symbol_keys(self, assignments: list[dict[str, str]]) -> int:
|
|
63
|
+
"""
|
|
64
|
+
Batch-update capability keys for a list of symbols in a single
|
|
65
|
+
transaction. Only updates rows where key IS NULL (idempotent).
|
|
66
|
+
|
|
67
|
+
*assignments* is a list of dicts with keys ``id`` (UUID str) and
|
|
68
|
+
``key`` (dotted capability key string).
|
|
69
|
+
|
|
70
|
+
Returns the number of UPDATE statements issued (not affected rows).
|
|
71
|
+
|
|
72
|
+
Covers:
|
|
73
|
+
- CapabilityTaggerWorker._tag_symbols — UPDATE core.symbols loop
|
|
74
|
+
"""
|
|
75
|
+
from body.services.service_registry import ServiceRegistry
|
|
76
|
+
|
|
77
|
+
if not assignments:
|
|
78
|
+
return 0
|
|
79
|
+
|
|
80
|
+
async with ServiceRegistry.session() as session:
|
|
81
|
+
async with session.begin():
|
|
82
|
+
for assignment in assignments:
|
|
83
|
+
await session.execute(
|
|
84
|
+
text(
|
|
85
|
+
"""
|
|
86
|
+
UPDATE core.symbols
|
|
87
|
+
SET key = :key, updated_at = NOW()
|
|
88
|
+
WHERE id = cast(:id as uuid)
|
|
89
|
+
AND key IS NULL
|
|
90
|
+
"""
|
|
91
|
+
),
|
|
92
|
+
{"key": assignment["key"], "id": assignment["id"]},
|
|
93
|
+
)
|
|
94
|
+
return len(assignments)
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# src/body/services/validation/__init__.py
|
|
2
|
+
|
|
3
|
+
"""
|
|
4
|
+
Validation orchestration services.
|
|
5
|
+
Coordinates validation across Mind (governance), Body (tools), and shared utilities.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
from body.services.validation.python_validator import validate_python_code_async
|
|
11
|
+
from body.services.validation.validation_policies import PolicyValidator
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
__all__ = ["PolicyValidator", "validate_python_code_async"]
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
# src/body/services/validation/python_validator.py
|
|
2
|
+
|
|
3
|
+
"""
|
|
4
|
+
Python code validation pipeline orchestrator.
|
|
5
|
+
|
|
6
|
+
CONSTITUTIONAL ALIGNMENT:
|
|
7
|
+
- Aligns with 'body_contracts.json' (Headless, no direct Mind engine dependency).
|
|
8
|
+
- Uses local 'PolicyValidator' for semantic safety checks within the Body layer.
|
|
9
|
+
- Enforces 'dry_by_design' by delegating to shared infrastructure for Black/Ruff/Syntax.
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
from __future__ import annotations
|
|
13
|
+
|
|
14
|
+
from typing import TYPE_CHECKING, Any
|
|
15
|
+
|
|
16
|
+
import black
|
|
17
|
+
|
|
18
|
+
from body.services.validation.validation_policies import PolicyValidator
|
|
19
|
+
from shared.infrastructure.validation.black_formatter import format_code_with_black
|
|
20
|
+
from shared.infrastructure.validation.quality import QualityChecker
|
|
21
|
+
from shared.infrastructure.validation.ruff_linter import fix_and_lint_code_with_ruff
|
|
22
|
+
from shared.infrastructure.validation.syntax_checker import check_syntax
|
|
23
|
+
from shared.logger import getLogger
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
if TYPE_CHECKING:
|
|
27
|
+
from mind.governance.audit_context import AuditorContext
|
|
28
|
+
|
|
29
|
+
logger = getLogger(__name__)
|
|
30
|
+
Violation = dict[str, Any]
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
# ID: 9b262a79-1e30-43fb-a9e2-1141058981d5
|
|
34
|
+
async def validate_python_code_async(
|
|
35
|
+
path_hint: str, code: str, auditor_context: AuditorContext
|
|
36
|
+
) -> tuple[str, list[Violation]]:
|
|
37
|
+
"""
|
|
38
|
+
Comprehensive validation pipeline for Python code.
|
|
39
|
+
|
|
40
|
+
This Body-layer service coordinates deterministic quality checks.
|
|
41
|
+
Governance-level auditing is deferred to the Mind-layer Auditor.
|
|
42
|
+
"""
|
|
43
|
+
all_violations: list[Violation] = []
|
|
44
|
+
|
|
45
|
+
# 1. FORMATTING (Standard Tooling)
|
|
46
|
+
try:
|
|
47
|
+
formatted_code = format_code_with_black(code)
|
|
48
|
+
except (black.InvalidInput, Exception) as e:
|
|
49
|
+
all_violations.append(
|
|
50
|
+
{
|
|
51
|
+
"rule": "tooling.black_failure",
|
|
52
|
+
"message": str(e),
|
|
53
|
+
"line": 0,
|
|
54
|
+
"severity": "error",
|
|
55
|
+
}
|
|
56
|
+
)
|
|
57
|
+
return code, all_violations
|
|
58
|
+
|
|
59
|
+
# 2. LINTING (Standard Tooling)
|
|
60
|
+
fixed_code, ruff_violations = fix_and_lint_code_with_ruff(
|
|
61
|
+
formatted_code, auditor_context.paths.repo_root, path_hint
|
|
62
|
+
)
|
|
63
|
+
all_violations.extend(ruff_violations)
|
|
64
|
+
|
|
65
|
+
# 3. SYNTAX VALIDATION (Deterministic Body Check)
|
|
66
|
+
syntax_violations = check_syntax(path_hint, fixed_code)
|
|
67
|
+
all_violations.extend(syntax_violations)
|
|
68
|
+
|
|
69
|
+
# Fail fast on syntax errors before performing more expensive checks
|
|
70
|
+
if any(v["severity"] == "error" for v in syntax_violations):
|
|
71
|
+
return fixed_code, all_violations
|
|
72
|
+
|
|
73
|
+
# 4. LOCAL POLICY VALIDATION (Policy-Aware Body Check)
|
|
74
|
+
# Uses the local PolicyValidator which is a permitted Body-layer component.
|
|
75
|
+
safety_policy = auditor_context.policies.get("safety_policy", {})
|
|
76
|
+
policy_validator = PolicyValidator(safety_policy.get("rules", []))
|
|
77
|
+
all_violations.extend(policy_validator.check_semantics(fixed_code, path_hint))
|
|
78
|
+
|
|
79
|
+
# 5. QUALITY ATTRIBUTES (DRY / FUTURE detection)
|
|
80
|
+
quality_checker = QualityChecker()
|
|
81
|
+
all_violations.extend(quality_checker.check_for_todo_comments(fixed_code))
|
|
82
|
+
|
|
83
|
+
logger.debug(
|
|
84
|
+
"Validation completed for %s: %d violation(s) found.",
|
|
85
|
+
path_hint,
|
|
86
|
+
len(all_violations),
|
|
87
|
+
)
|
|
88
|
+
|
|
89
|
+
return fixed_code, all_violations
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
# src/body/services/validation/validation_policies.py
|
|
2
|
+
|
|
3
|
+
"""
|
|
4
|
+
Policy-aware validation logic for enforcing safety and security policies.
|
|
5
|
+
This module is given pre-loaded policies and scans AST nodes for violations.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
import ast
|
|
11
|
+
from typing import Any
|
|
12
|
+
|
|
13
|
+
from shared.utils.glob_match import matches_any_glob
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
Violation = dict[str, Any]
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
# ID: dcff1afd-963d-419c-8f66-31978115cfc9
|
|
20
|
+
class PolicyValidator:
|
|
21
|
+
"""Handles policy-aware validation including safety checks and forbidden patterns."""
|
|
22
|
+
|
|
23
|
+
def __init__(self, safety_policy_rules: list[dict[str, Any]]):
|
|
24
|
+
"""
|
|
25
|
+
Initialize the policy validator with pre-loaded safety policy rules.
|
|
26
|
+
"""
|
|
27
|
+
self.safety_rules = safety_policy_rules
|
|
28
|
+
|
|
29
|
+
def _get_full_attribute_name(self, node: ast.Attribute) -> str:
|
|
30
|
+
"""Recursively builds the full name of an attribute call."""
|
|
31
|
+
parts: list[str] = [] # FIXED
|
|
32
|
+
current: Any = node # FIXED: Type set to Any to allow re-assignment
|
|
33
|
+
while isinstance(current, ast.Attribute):
|
|
34
|
+
parts.insert(0, current.attr)
|
|
35
|
+
current = current.value
|
|
36
|
+
if isinstance(current, ast.Name):
|
|
37
|
+
parts.insert(0, current.id)
|
|
38
|
+
return ".".join(parts)
|
|
39
|
+
|
|
40
|
+
def _find_dangerous_patterns(
|
|
41
|
+
self, tree: ast.AST, file_path: str
|
|
42
|
+
) -> list[Violation]:
|
|
43
|
+
"""Scans the AST for calls and imports forbidden by safety policies."""
|
|
44
|
+
violations: list[Violation] = []
|
|
45
|
+
rules = self.safety_rules
|
|
46
|
+
|
|
47
|
+
forbidden_calls = set()
|
|
48
|
+
forbidden_imports = set()
|
|
49
|
+
|
|
50
|
+
for rule in rules:
|
|
51
|
+
exclude_patterns = [
|
|
52
|
+
p
|
|
53
|
+
for p in rule.get("scope", {}).get("exclude", [])
|
|
54
|
+
if isinstance(p, str)
|
|
55
|
+
]
|
|
56
|
+
is_excluded = matches_any_glob(file_path, exclude_patterns)
|
|
57
|
+
|
|
58
|
+
if is_excluded:
|
|
59
|
+
continue
|
|
60
|
+
|
|
61
|
+
if rule.get("id") == "no_dangerous_execution":
|
|
62
|
+
patterns = {
|
|
63
|
+
p.replace("(", "")
|
|
64
|
+
for p in rule.get("detection", {}).get("patterns", [])
|
|
65
|
+
}
|
|
66
|
+
forbidden_calls.update(patterns)
|
|
67
|
+
elif rule.get("id") == "no_unsafe_imports":
|
|
68
|
+
patterns = {
|
|
69
|
+
imp.split(" ")[-1]
|
|
70
|
+
for imp in rule.get("detection", {}).get("forbidden", [])
|
|
71
|
+
}
|
|
72
|
+
forbidden_imports.update(patterns)
|
|
73
|
+
|
|
74
|
+
for node in ast.walk(tree):
|
|
75
|
+
if isinstance(node, ast.Call):
|
|
76
|
+
full_call_name = ""
|
|
77
|
+
if isinstance(node.func, ast.Name):
|
|
78
|
+
full_call_name = node.func.id
|
|
79
|
+
elif isinstance(node.func, ast.Attribute):
|
|
80
|
+
full_call_name = self._get_full_attribute_name(node.func)
|
|
81
|
+
|
|
82
|
+
if full_call_name in forbidden_calls:
|
|
83
|
+
violations.append(
|
|
84
|
+
{
|
|
85
|
+
"rule": "safety.dangerous_call",
|
|
86
|
+
"message": f"Use of forbidden call: '{full_call_name}'",
|
|
87
|
+
"line": getattr(node, "lineno", 0),
|
|
88
|
+
"severity": "error",
|
|
89
|
+
}
|
|
90
|
+
)
|
|
91
|
+
elif isinstance(node, ast.Import):
|
|
92
|
+
for alias in node.names:
|
|
93
|
+
if alias.name.split(".")[0] in forbidden_imports:
|
|
94
|
+
violations.append(
|
|
95
|
+
{
|
|
96
|
+
"rule": "safety.forbidden_import",
|
|
97
|
+
"message": f"Import of forbidden module: '{alias.name}'",
|
|
98
|
+
"line": getattr(node, "lineno", 0),
|
|
99
|
+
"severity": "error",
|
|
100
|
+
}
|
|
101
|
+
)
|
|
102
|
+
elif isinstance(node, ast.ImportFrom):
|
|
103
|
+
if node.module and node.module.split(".")[0] in forbidden_imports:
|
|
104
|
+
violations.append(
|
|
105
|
+
{
|
|
106
|
+
"rule": "safety.forbidden_import",
|
|
107
|
+
"message": f"Import from forbidden module: '{node.module}'",
|
|
108
|
+
"line": getattr(node, "lineno", 0),
|
|
109
|
+
"severity": "error",
|
|
110
|
+
}
|
|
111
|
+
)
|
|
112
|
+
return violations
|
|
113
|
+
|
|
114
|
+
# ID: d6059c1e-83ab-4c9a-8ebf-e596fa79494d
|
|
115
|
+
def check_semantics(self, code: str, file_path: str) -> list[Violation]:
|
|
116
|
+
"""Runs all policy-aware semantic checks on a string of Python code."""
|
|
117
|
+
try:
|
|
118
|
+
tree = ast.parse(code)
|
|
119
|
+
except SyntaxError:
|
|
120
|
+
return []
|
|
121
|
+
return self._find_dangerous_patterns(tree, file_path)
|