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
api/v1/sync_routes.py
ADDED
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
# src/api/v1/sync_routes.py
|
|
2
|
+
|
|
3
|
+
"""
|
|
4
|
+
Sync API endpoints (ADR-058 Phase 4, D2).
|
|
5
|
+
|
|
6
|
+
Five endpoints, all async-dispatch + poll:
|
|
7
|
+
|
|
8
|
+
* `POST /sync/knowledge-graph` → sync_type='knowledge_graph'
|
|
9
|
+
* `POST /sync/vectors` → sync_type='vectors'
|
|
10
|
+
* `POST /sync/code-vectors` → sync_type='code_vectors'
|
|
11
|
+
* `POST /sync/dev-sync` → sync_type='dev_sync' (composite)
|
|
12
|
+
* `GET /sync/runs/{run_id}` → poll persisted sync_runs row
|
|
13
|
+
|
|
14
|
+
All four POST paths share one `_dispatch_sync` body that INSERTs a
|
|
15
|
+
pending row in `core.sync_runs` and schedules the dispatch on a
|
|
16
|
+
background task via `will.governance.sync_runner`.
|
|
17
|
+
|
|
18
|
+
CONSTITUTIONAL:
|
|
19
|
+
- Session access via `api.dependencies.get_api_session` /
|
|
20
|
+
`open_background_session` only.
|
|
21
|
+
- `CoreContext` read from `request.app.state.core_context`.
|
|
22
|
+
- `body.atomic.*` and `will.workflows.*` reached through the
|
|
23
|
+
`will.governance.sync_runner` facade — no direct imports here.
|
|
24
|
+
"""
|
|
25
|
+
|
|
26
|
+
from __future__ import annotations
|
|
27
|
+
|
|
28
|
+
from uuid import UUID
|
|
29
|
+
|
|
30
|
+
from fastapi import (
|
|
31
|
+
APIRouter,
|
|
32
|
+
BackgroundTasks,
|
|
33
|
+
Body,
|
|
34
|
+
Depends,
|
|
35
|
+
HTTPException,
|
|
36
|
+
Request,
|
|
37
|
+
Response,
|
|
38
|
+
)
|
|
39
|
+
from pydantic import BaseModel
|
|
40
|
+
from sqlalchemy import text
|
|
41
|
+
from sqlalchemy.ext.asyncio import AsyncSession
|
|
42
|
+
|
|
43
|
+
from api.dependencies import get_api_session, open_background_session
|
|
44
|
+
from shared.context import CoreContext
|
|
45
|
+
from shared.logger import getLogger
|
|
46
|
+
from will.governance.sync_runner import (
|
|
47
|
+
ALLOWED_SYNC_TYPES,
|
|
48
|
+
run_and_persist_sync,
|
|
49
|
+
)
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
logger = getLogger(__name__)
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
router = APIRouter(prefix="/sync")
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
# ID: 6e3a0f8b-2d7c-4f5a-0431-f6789a0bcdef
|
|
59
|
+
class SyncRequest(BaseModel):
|
|
60
|
+
"""Body for the four POST /sync/* endpoints.
|
|
61
|
+
|
|
62
|
+
`target` is an optional scope filter forwarded to the backend.
|
|
63
|
+
Backends that don't honour it ignore it.
|
|
64
|
+
|
|
65
|
+
`force` is a backend-specific re-run hint. Today only
|
|
66
|
+
`sync.vectors_code` honours it (resets chunk_count on already-embedded
|
|
67
|
+
artifacts so the embed loop re-processes them). Default False — no
|
|
68
|
+
behaviour change for callers that don't pass it.
|
|
69
|
+
"""
|
|
70
|
+
|
|
71
|
+
write: bool = False
|
|
72
|
+
target: str | None = None
|
|
73
|
+
requested_by: str = "api"
|
|
74
|
+
force: bool = False
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
# ID: 7f4b1a9c-3e8d-4a6b-1542-07890ab12345
|
|
78
|
+
async def _dispatch_sync(
|
|
79
|
+
*,
|
|
80
|
+
sync_type: str,
|
|
81
|
+
request: Request,
|
|
82
|
+
response: Response,
|
|
83
|
+
background_tasks: BackgroundTasks,
|
|
84
|
+
payload: SyncRequest,
|
|
85
|
+
session: AsyncSession,
|
|
86
|
+
) -> dict:
|
|
87
|
+
"""Shared body for the four POST /sync/* endpoints."""
|
|
88
|
+
if sync_type not in ALLOWED_SYNC_TYPES:
|
|
89
|
+
raise HTTPException(
|
|
90
|
+
status_code=422,
|
|
91
|
+
detail={
|
|
92
|
+
"error": f"Unknown sync_type: {sync_type}",
|
|
93
|
+
"allowed": sorted(ALLOWED_SYNC_TYPES),
|
|
94
|
+
},
|
|
95
|
+
)
|
|
96
|
+
|
|
97
|
+
core_context: CoreContext = request.app.state.core_context
|
|
98
|
+
|
|
99
|
+
result = await session.execute(
|
|
100
|
+
text(
|
|
101
|
+
"""
|
|
102
|
+
INSERT INTO core.sync_runs
|
|
103
|
+
(sync_type, write, target, status, requested_by)
|
|
104
|
+
VALUES (:sync_type, :write, :target, 'pending', :requested_by)
|
|
105
|
+
RETURNING id
|
|
106
|
+
"""
|
|
107
|
+
),
|
|
108
|
+
{
|
|
109
|
+
"sync_type": sync_type,
|
|
110
|
+
"write": payload.write,
|
|
111
|
+
"target": payload.target,
|
|
112
|
+
"requested_by": payload.requested_by,
|
|
113
|
+
},
|
|
114
|
+
)
|
|
115
|
+
run_id: UUID = result.scalar_one()
|
|
116
|
+
await session.commit()
|
|
117
|
+
|
|
118
|
+
# ID: 8a5c2b0d-4f9e-4b7c-2653-189012345abc
|
|
119
|
+
async def drive_sync() -> None:
|
|
120
|
+
async for bg_session in open_background_session():
|
|
121
|
+
await run_and_persist_sync(
|
|
122
|
+
core_context,
|
|
123
|
+
bg_session,
|
|
124
|
+
run_id=run_id,
|
|
125
|
+
sync_type=sync_type,
|
|
126
|
+
write=payload.write,
|
|
127
|
+
target=payload.target,
|
|
128
|
+
force=payload.force,
|
|
129
|
+
)
|
|
130
|
+
|
|
131
|
+
background_tasks.add_task(drive_sync)
|
|
132
|
+
|
|
133
|
+
response.status_code = 202
|
|
134
|
+
return {
|
|
135
|
+
"run_id": str(run_id),
|
|
136
|
+
"status": "pending",
|
|
137
|
+
"href": f"/sync/runs/{run_id}",
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
@router.post("/knowledge-graph")
|
|
142
|
+
# ID: 9b6d3c1e-5a0f-4c8d-3764-29a01234abcd
|
|
143
|
+
async def sync_knowledge_graph(
|
|
144
|
+
request: Request,
|
|
145
|
+
response: Response,
|
|
146
|
+
background_tasks: BackgroundTasks,
|
|
147
|
+
payload: SyncRequest = Body(default_factory=SyncRequest),
|
|
148
|
+
session: AsyncSession = Depends(get_api_session),
|
|
149
|
+
) -> dict:
|
|
150
|
+
"""Dispatch code-symbols → PostgreSQL knowledge graph sync."""
|
|
151
|
+
return await _dispatch_sync(
|
|
152
|
+
sync_type="knowledge_graph",
|
|
153
|
+
request=request,
|
|
154
|
+
response=response,
|
|
155
|
+
background_tasks=background_tasks,
|
|
156
|
+
payload=payload,
|
|
157
|
+
session=session,
|
|
158
|
+
)
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
@router.post("/vectors")
|
|
162
|
+
# ID: 0c7e4d2f-6b1a-4d9e-4875-3ab12345bcde
|
|
163
|
+
async def sync_vectors(
|
|
164
|
+
request: Request,
|
|
165
|
+
response: Response,
|
|
166
|
+
background_tasks: BackgroundTasks,
|
|
167
|
+
payload: SyncRequest = Body(default_factory=SyncRequest),
|
|
168
|
+
session: AsyncSession = Depends(get_api_session),
|
|
169
|
+
) -> dict:
|
|
170
|
+
"""Dispatch constitutional vector sync (PG ↔ Qdrant)."""
|
|
171
|
+
return await _dispatch_sync(
|
|
172
|
+
sync_type="vectors",
|
|
173
|
+
request=request,
|
|
174
|
+
response=response,
|
|
175
|
+
background_tasks=background_tasks,
|
|
176
|
+
payload=payload,
|
|
177
|
+
session=session,
|
|
178
|
+
)
|
|
179
|
+
|
|
180
|
+
|
|
181
|
+
@router.post("/code-vectors")
|
|
182
|
+
# ID: 1d8f5e3a-7c2b-4e0f-5986-4bc23456cdef
|
|
183
|
+
async def sync_code_vectors(
|
|
184
|
+
request: Request,
|
|
185
|
+
response: Response,
|
|
186
|
+
background_tasks: BackgroundTasks,
|
|
187
|
+
payload: SyncRequest = Body(default_factory=SyncRequest),
|
|
188
|
+
session: AsyncSession = Depends(get_api_session),
|
|
189
|
+
) -> dict:
|
|
190
|
+
"""Dispatch codebase symbol embedding via the worker pipeline."""
|
|
191
|
+
return await _dispatch_sync(
|
|
192
|
+
sync_type="code_vectors",
|
|
193
|
+
request=request,
|
|
194
|
+
response=response,
|
|
195
|
+
background_tasks=background_tasks,
|
|
196
|
+
payload=payload,
|
|
197
|
+
session=session,
|
|
198
|
+
)
|
|
199
|
+
|
|
200
|
+
|
|
201
|
+
@router.post("/dev-sync")
|
|
202
|
+
# ID: 2e9a6f4b-8d3c-4f1a-6a97-5cd34567def0
|
|
203
|
+
async def sync_dev_sync(
|
|
204
|
+
request: Request,
|
|
205
|
+
response: Response,
|
|
206
|
+
background_tasks: BackgroundTasks,
|
|
207
|
+
payload: SyncRequest = Body(default_factory=SyncRequest),
|
|
208
|
+
session: AsyncSession = Depends(get_api_session),
|
|
209
|
+
) -> dict:
|
|
210
|
+
"""Dispatch the composite fix + knowledge-graph + vectors workflow."""
|
|
211
|
+
return await _dispatch_sync(
|
|
212
|
+
sync_type="dev_sync",
|
|
213
|
+
request=request,
|
|
214
|
+
response=response,
|
|
215
|
+
background_tasks=background_tasks,
|
|
216
|
+
payload=payload,
|
|
217
|
+
session=session,
|
|
218
|
+
)
|
|
219
|
+
|
|
220
|
+
|
|
221
|
+
@router.get("/runs/{run_id}")
|
|
222
|
+
# ID: 3f0b7a5c-9e4d-4a2b-7ba8-6de45678ef01
|
|
223
|
+
async def get_sync_run(
|
|
224
|
+
run_id: UUID,
|
|
225
|
+
session: AsyncSession = Depends(get_api_session),
|
|
226
|
+
) -> dict:
|
|
227
|
+
"""Return a persisted sync run by id, or 404 if unknown."""
|
|
228
|
+
result = await session.execute(
|
|
229
|
+
text(
|
|
230
|
+
"""
|
|
231
|
+
SELECT id, sync_type, write, target, status,
|
|
232
|
+
requested_by, requested_at, started_at, finished_at,
|
|
233
|
+
result, error
|
|
234
|
+
FROM core.sync_runs
|
|
235
|
+
WHERE id = :rid
|
|
236
|
+
"""
|
|
237
|
+
),
|
|
238
|
+
{"rid": run_id},
|
|
239
|
+
)
|
|
240
|
+
row = result.mappings().first()
|
|
241
|
+
if row is None:
|
|
242
|
+
raise HTTPException(
|
|
243
|
+
status_code=404,
|
|
244
|
+
detail=f"Sync run not found: {run_id}",
|
|
245
|
+
)
|
|
246
|
+
|
|
247
|
+
return {
|
|
248
|
+
"run_id": str(row["id"]),
|
|
249
|
+
"sync_type": row["sync_type"],
|
|
250
|
+
"write": row["write"],
|
|
251
|
+
"target": row["target"],
|
|
252
|
+
"status": row["status"],
|
|
253
|
+
"requested_by": row["requested_by"],
|
|
254
|
+
"requested_at": (
|
|
255
|
+
row["requested_at"].isoformat() if row["requested_at"] else None
|
|
256
|
+
),
|
|
257
|
+
"started_at": row["started_at"].isoformat() if row["started_at"] else None,
|
|
258
|
+
"finished_at": (row["finished_at"].isoformat() if row["finished_at"] else None),
|
|
259
|
+
"result": row["result"],
|
|
260
|
+
"error": row["error"],
|
|
261
|
+
}
|
body/__init__.py
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# src/body/analyzers/__init__.py
|
|
2
|
+
|
|
3
|
+
"""
|
|
4
|
+
Analyzers - Parse/Load phase components.
|
|
5
|
+
|
|
6
|
+
Analyzers extract information from code without making decisions.
|
|
7
|
+
They are pure functions: same input → same output.
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from __future__ import annotations
|
|
11
|
+
|
|
12
|
+
from .file_analyzer import FileAnalyzer
|
|
13
|
+
from .knowledge_graph_analyzer import KnowledgeGraphAnalyzer
|
|
14
|
+
from .prompt_analyzer import PromptAnalyzer
|
|
15
|
+
from .symbol_extractor import SymbolExtractor, SymbolInfo, SymbolMetadata
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
__all__ = [
|
|
19
|
+
"FileAnalyzer",
|
|
20
|
+
"KnowledgeGraphAnalyzer",
|
|
21
|
+
"PromptAnalyzer",
|
|
22
|
+
"SymbolExtractor",
|
|
23
|
+
"SymbolInfo",
|
|
24
|
+
"SymbolMetadata",
|
|
25
|
+
]
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# src/body/analyzers/base_analyzer.py
|
|
2
|
+
"""Base Analyzer - PARSE phase base class.
|
|
3
|
+
|
|
4
|
+
All Body analyzers extract structural facts from code without making decisions.
|
|
5
|
+
They are pure functions: same input → same output.
|
|
6
|
+
|
|
7
|
+
Owning `phase` here eliminates AST duplication across:
|
|
8
|
+
FileAnalyzer, KnowledgeGraphAnalyzer, PromptAnalyzer, SymbolExtractor.
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
from __future__ import annotations
|
|
12
|
+
|
|
13
|
+
from shared.component_primitive import Component, ComponentPhase
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
# ID: b4e2f3a5-c6d7-8901-bcde-f01234567891
|
|
17
|
+
class BaseAnalyzer(Component):
|
|
18
|
+
"""Base class for all PARSE phase analyzers.
|
|
19
|
+
|
|
20
|
+
Subclasses must implement execute(). They inherit phase automatically.
|
|
21
|
+
No side effects permitted — analyzers are read-only fact extractors.
|
|
22
|
+
"""
|
|
23
|
+
|
|
24
|
+
@property
|
|
25
|
+
# ID: c5f3a4b6-d7e8-9012-cdef-012345678912
|
|
26
|
+
def phase(self) -> ComponentPhase:
|
|
27
|
+
"""All analyzers operate in the PARSE phase."""
|
|
28
|
+
return ComponentPhase.PARSE
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
# src/body/analyzers/constitutional_path_analyzer.py
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import time
|
|
6
|
+
from typing import Any
|
|
7
|
+
|
|
8
|
+
from body.analyzers.base_analyzer import BaseAnalyzer
|
|
9
|
+
from shared.component_primitive import ComponentResult
|
|
10
|
+
from shared.infrastructure.intent.intent_repository import get_intent_repository
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
# ID: 9666577f-5e1f-4dea-a104-59c72bfffe82
|
|
14
|
+
class ConstitutionalPathAnalyzer(BaseAnalyzer):
|
|
15
|
+
"""
|
|
16
|
+
PARSE Phase Component.
|
|
17
|
+
Authoritatively discovers all artifacts indexed in the Mind (.intent/).
|
|
18
|
+
|
|
19
|
+
CONSTITUTIONAL ALIGNMENT:
|
|
20
|
+
- Authority: IntentRepository (The sole gateway to the Mind).
|
|
21
|
+
- Boundary: Read-only access to indexed policies and META contracts.
|
|
22
|
+
"""
|
|
23
|
+
|
|
24
|
+
# ID: ba8e4735-0988-479a-92ad-5aeeba2ba4c6
|
|
25
|
+
async def execute(self, **kwargs: Any) -> ComponentResult:
|
|
26
|
+
"""Executes the Constitutional Path Analyzer to retrieve and validate indexed policy paths and core system contracts from the IntentRepository, returning a ComponentResult with the unique artifacts and metadata."""
|
|
27
|
+
start_time = time.time()
|
|
28
|
+
|
|
29
|
+
# 1. Access the Mind through the sanctioned gateway
|
|
30
|
+
# This automatically triggers validate_intent_tree (Bootstrap Contract v0)
|
|
31
|
+
repo = get_intent_repository()
|
|
32
|
+
repo.initialize() # Builds the in-memory index
|
|
33
|
+
|
|
34
|
+
# 2. Sensation: Retrieve only what the Repository has indexed as "Law"
|
|
35
|
+
# This prevents the Body from 'hallucinating' or crawling unindexed files.
|
|
36
|
+
policy_paths = [str(ref.path) for ref in repo.list_policies()]
|
|
37
|
+
|
|
38
|
+
# 3. Add the "Contractual Primitives" (META files required for system operation)
|
|
39
|
+
# These are derived from the repo.root provided by the PathResolver.
|
|
40
|
+
core_structure = [
|
|
41
|
+
repo.root / "META" / "intent_tree.schema.json",
|
|
42
|
+
repo.root / "META" / "rule_document.schema.json",
|
|
43
|
+
repo.root / "META" / "enums.json",
|
|
44
|
+
repo.root / "constitution" / "precedence_rules.yaml",
|
|
45
|
+
]
|
|
46
|
+
|
|
47
|
+
artifacts = policy_paths + [str(p) for p in core_structure if p.exists()]
|
|
48
|
+
unique_artifacts = sorted(list(set(artifacts)))
|
|
49
|
+
|
|
50
|
+
duration = time.time() - start_time
|
|
51
|
+
|
|
52
|
+
return ComponentResult(
|
|
53
|
+
component_id=self.component_id,
|
|
54
|
+
ok=True,
|
|
55
|
+
data={"paths": unique_artifacts, "count": len(unique_artifacts)},
|
|
56
|
+
phase=self.phase,
|
|
57
|
+
confidence=1.0,
|
|
58
|
+
duration_sec=duration,
|
|
59
|
+
metadata={
|
|
60
|
+
"intent_root": str(repo.root),
|
|
61
|
+
"rationale": "Collected indexed policy refs and META contracts from IntentRepository.",
|
|
62
|
+
},
|
|
63
|
+
)
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
# src/body/analyzers/file_analyzer.py
|
|
2
|
+
"""File Analyzer - Analyzes Python file structure and classifies type."""
|
|
3
|
+
|
|
4
|
+
from __future__ import annotations
|
|
5
|
+
|
|
6
|
+
import ast
|
|
7
|
+
import time
|
|
8
|
+
from typing import Any
|
|
9
|
+
|
|
10
|
+
from body.analyzers.base_analyzer import BaseAnalyzer
|
|
11
|
+
from shared.component_primitive import ComponentResult # Component, ComponentPhase,
|
|
12
|
+
from shared.context import CoreContext
|
|
13
|
+
from shared.infrastructure.intent.operational_config import load_operational_config
|
|
14
|
+
from shared.logger import getLogger
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
logger = getLogger(__name__)
|
|
18
|
+
|
|
19
|
+
_CFG_AZ = load_operational_config().analyzers
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
# ID: c9251530-0236-41a9-9630-b305f283277a
|
|
23
|
+
class FileAnalyzer(BaseAnalyzer):
|
|
24
|
+
"""Analyzes Python files to detect type and complexity.
|
|
25
|
+
|
|
26
|
+
Determines if a file is a:
|
|
27
|
+
- sqlalchemy_model: Requires integration fixtures.
|
|
28
|
+
- async_module: Requires pytest-asyncio.
|
|
29
|
+
- function_module / class_module: Requires standard unit testing.
|
|
30
|
+
|
|
31
|
+
Constitutional requirements:
|
|
32
|
+
- MUST be initialized with CoreContext containing valid git_service.
|
|
33
|
+
- Body layer components do not access settings directly.
|
|
34
|
+
"""
|
|
35
|
+
|
|
36
|
+
def __init__(self, context: CoreContext | None = None):
|
|
37
|
+
"""Initialize with context for governed path resolution."""
|
|
38
|
+
self.context = context
|
|
39
|
+
|
|
40
|
+
# ID: ddb4df7c-87db-40dd-91b1-1691cb0b8203
|
|
41
|
+
async def execute(self, file_path: str, **kwargs) -> ComponentResult:
|
|
42
|
+
"""Analyze file structure and classify for downstream strategy selection."""
|
|
43
|
+
start_time = time.time()
|
|
44
|
+
|
|
45
|
+
# Constitutional boundary enforcement: Body requires proper context
|
|
46
|
+
if not self.context or not getattr(self.context, "git_service", None):
|
|
47
|
+
return ComponentResult(
|
|
48
|
+
component_id=self.component_id,
|
|
49
|
+
ok=False,
|
|
50
|
+
data={
|
|
51
|
+
"error": (
|
|
52
|
+
"FileAnalyzer requires CoreContext with git_service. "
|
|
53
|
+
"Body layer components must not access settings directly."
|
|
54
|
+
)
|
|
55
|
+
},
|
|
56
|
+
phase=self.phase,
|
|
57
|
+
confidence=0.0,
|
|
58
|
+
)
|
|
59
|
+
|
|
60
|
+
repo_root = self.context.git_service.repo_path
|
|
61
|
+
abs_path = (repo_root / file_path).resolve()
|
|
62
|
+
|
|
63
|
+
if not abs_path.exists():
|
|
64
|
+
return ComponentResult(
|
|
65
|
+
component_id=self.component_id,
|
|
66
|
+
ok=False,
|
|
67
|
+
data={"error": f"File not found: {file_path}"},
|
|
68
|
+
phase=self.phase,
|
|
69
|
+
confidence=0.0,
|
|
70
|
+
)
|
|
71
|
+
|
|
72
|
+
try:
|
|
73
|
+
code = abs_path.read_text(encoding="utf-8")
|
|
74
|
+
tree = ast.parse(code)
|
|
75
|
+
|
|
76
|
+
analysis = self._analyze_ast(tree)
|
|
77
|
+
file_type, confidence = self._classify_file(analysis)
|
|
78
|
+
|
|
79
|
+
duration = time.time() - start_time
|
|
80
|
+
|
|
81
|
+
return ComponentResult(
|
|
82
|
+
component_id=self.component_id,
|
|
83
|
+
ok=True,
|
|
84
|
+
data={
|
|
85
|
+
"file_type": file_type,
|
|
86
|
+
"has_sqlalchemy": analysis["has_sqlalchemy"],
|
|
87
|
+
"has_async": analysis["has_async"],
|
|
88
|
+
"class_count": analysis["class_count"],
|
|
89
|
+
"function_count": analysis["function_count"],
|
|
90
|
+
"complexity": analysis["complexity"],
|
|
91
|
+
},
|
|
92
|
+
phase=self.phase,
|
|
93
|
+
confidence=confidence,
|
|
94
|
+
next_suggested="symbol_extractor",
|
|
95
|
+
duration_sec=duration,
|
|
96
|
+
metadata={
|
|
97
|
+
"file_path": file_path,
|
|
98
|
+
"line_count": len(code.splitlines()),
|
|
99
|
+
"total_definitions": analysis["total_definitions"],
|
|
100
|
+
"rationale": (
|
|
101
|
+
f"Classified {file_path} as {file_type} based on structural markers"
|
|
102
|
+
),
|
|
103
|
+
"decision_context": {
|
|
104
|
+
"agent": "FileAnalyzer",
|
|
105
|
+
"decision_type": "file_classification",
|
|
106
|
+
"has_sqlalchemy": analysis["has_sqlalchemy"],
|
|
107
|
+
"has_async": analysis["has_async"],
|
|
108
|
+
"definitions": analysis["total_definitions"],
|
|
109
|
+
},
|
|
110
|
+
},
|
|
111
|
+
)
|
|
112
|
+
|
|
113
|
+
except SyntaxError as e:
|
|
114
|
+
return ComponentResult(
|
|
115
|
+
component_id=self.component_id,
|
|
116
|
+
ok=False,
|
|
117
|
+
data={"error": f"Syntax error in {file_path}: {e}"},
|
|
118
|
+
phase=self.phase,
|
|
119
|
+
confidence=0.0,
|
|
120
|
+
)
|
|
121
|
+
except Exception as e:
|
|
122
|
+
logger.error("FileAnalyzer failed for %s: %s", file_path, e, exc_info=True)
|
|
123
|
+
return ComponentResult(
|
|
124
|
+
component_id=self.component_id,
|
|
125
|
+
ok=False,
|
|
126
|
+
data={"error": str(e)},
|
|
127
|
+
phase=self.phase,
|
|
128
|
+
confidence=0.0,
|
|
129
|
+
)
|
|
130
|
+
|
|
131
|
+
def _analyze_ast(self, tree: ast.AST) -> dict[str, Any]:
|
|
132
|
+
"""Extract structural facts from AST."""
|
|
133
|
+
facts: dict[str, Any] = {
|
|
134
|
+
"has_sqlalchemy": False,
|
|
135
|
+
"has_base_class": False,
|
|
136
|
+
"has_mapped": False,
|
|
137
|
+
"has_async": False,
|
|
138
|
+
"class_count": 0,
|
|
139
|
+
"function_count": 0,
|
|
140
|
+
"async_function_count": 0,
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
for node in ast.walk(tree):
|
|
144
|
+
# Check imports for framework usage
|
|
145
|
+
if isinstance(node, ast.Import):
|
|
146
|
+
for alias in node.names:
|
|
147
|
+
if "sqlalchemy" in alias.name:
|
|
148
|
+
facts["has_sqlalchemy"] = True
|
|
149
|
+
|
|
150
|
+
elif isinstance(node, ast.ImportFrom):
|
|
151
|
+
if node.module and "sqlalchemy" in node.module:
|
|
152
|
+
facts["has_sqlalchemy"] = True
|
|
153
|
+
if any("Mapped" in a.name for a in node.names):
|
|
154
|
+
facts["has_mapped"] = True
|
|
155
|
+
|
|
156
|
+
# Count definitions
|
|
157
|
+
elif isinstance(node, ast.ClassDef):
|
|
158
|
+
facts["class_count"] += 1
|
|
159
|
+
for base in node.bases:
|
|
160
|
+
if isinstance(base, ast.Name) and base.id == "Base":
|
|
161
|
+
facts["has_base_class"] = True
|
|
162
|
+
|
|
163
|
+
elif isinstance(node, ast.FunctionDef):
|
|
164
|
+
facts["function_count"] += 1
|
|
165
|
+
|
|
166
|
+
elif isinstance(node, ast.AsyncFunctionDef):
|
|
167
|
+
facts["async_function_count"] += 1
|
|
168
|
+
facts["has_async"] = True
|
|
169
|
+
|
|
170
|
+
total = (
|
|
171
|
+
facts["class_count"]
|
|
172
|
+
+ facts["function_count"]
|
|
173
|
+
+ facts["async_function_count"]
|
|
174
|
+
)
|
|
175
|
+
facts["total_definitions"] = total
|
|
176
|
+
|
|
177
|
+
# Categorize complexity
|
|
178
|
+
if total > _CFG_AZ.file_complexity_high_threshold:
|
|
179
|
+
facts["complexity"] = "high"
|
|
180
|
+
elif total > 5:
|
|
181
|
+
facts["complexity"] = "medium"
|
|
182
|
+
else:
|
|
183
|
+
facts["complexity"] = "low"
|
|
184
|
+
|
|
185
|
+
return facts
|
|
186
|
+
|
|
187
|
+
def _classify_file(self, analysis: dict[str, Any]) -> tuple[str, float]:
|
|
188
|
+
"""Classify file type based on collected facts.
|
|
189
|
+
|
|
190
|
+
Returns:
|
|
191
|
+
(file_type, confidence)
|
|
192
|
+
"""
|
|
193
|
+
# SQLAlchemy model detection
|
|
194
|
+
if analysis["has_sqlalchemy"] and (
|
|
195
|
+
analysis["has_base_class"] or analysis["has_mapped"]
|
|
196
|
+
):
|
|
197
|
+
return ("sqlalchemy_model", 0.95)
|
|
198
|
+
|
|
199
|
+
# Async module detection
|
|
200
|
+
if analysis["has_async"] and analysis["async_function_count"] > 1:
|
|
201
|
+
return ("async_module", 0.90)
|
|
202
|
+
|
|
203
|
+
# Class-heavy logic
|
|
204
|
+
if analysis["class_count"] > 0 and analysis["function_count"] == 0:
|
|
205
|
+
return ("class_module", 0.85)
|
|
206
|
+
|
|
207
|
+
# Function-heavy logic
|
|
208
|
+
if analysis["function_count"] > 0 and analysis["class_count"] == 0:
|
|
209
|
+
return ("function_module", 0.85)
|
|
210
|
+
|
|
211
|
+
return ("mixed_module", 0.60)
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
# src/body/analyzers/knowledge_graph_analyzer.py
|
|
2
|
+
|
|
3
|
+
"""
|
|
4
|
+
Knowledge Graph Analyzer - PARSE Phase Component.
|
|
5
|
+
Standardized interface for system introspection.
|
|
6
|
+
|
|
7
|
+
Constitutional Alignment:
|
|
8
|
+
- Phase: PARSE (Structural analysis)
|
|
9
|
+
- Authority: CODE (Implementation)
|
|
10
|
+
- Boundary: Requires repo_root via dependency injection (no settings fallback)
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
from __future__ import annotations
|
|
14
|
+
|
|
15
|
+
import time
|
|
16
|
+
from pathlib import Path
|
|
17
|
+
from typing import Any
|
|
18
|
+
|
|
19
|
+
from body.analyzers.base_analyzer import BaseAnalyzer
|
|
20
|
+
from body.introspection.knowledge_graph_service import KnowledgeGraphBuilder
|
|
21
|
+
from shared.component_primitive import ComponentResult # Component, ComponentPhase,
|
|
22
|
+
from shared.logger import getLogger
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
logger = getLogger(__name__)
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
# ID: e9b2c3d4-f5a6-7b8c-9d0e-1f2a3b4c5d6e
|
|
29
|
+
class KnowledgeGraphAnalyzer(BaseAnalyzer):
|
|
30
|
+
"""
|
|
31
|
+
Standardized component for building the Knowledge Graph.
|
|
32
|
+
|
|
33
|
+
Constitutional Requirement:
|
|
34
|
+
- MUST receive repo_root parameter (no settings fallback)
|
|
35
|
+
- Body layer components do not access settings directly
|
|
36
|
+
"""
|
|
37
|
+
|
|
38
|
+
# ID: 46b5ce81-b2fc-4822-88ba-53682cf1f431
|
|
39
|
+
async def execute(
|
|
40
|
+
self, repo_root: Path | None = None, **kwargs: Any
|
|
41
|
+
) -> ComponentResult:
|
|
42
|
+
"""
|
|
43
|
+
Execute the codebase scan.
|
|
44
|
+
|
|
45
|
+
Args:
|
|
46
|
+
repo_root: Repository root path (required for constitutional compliance)
|
|
47
|
+
|
|
48
|
+
Constitutional Compliance:
|
|
49
|
+
- Requires repo_root parameter (no settings fallback)
|
|
50
|
+
- Returns error if repo_root not provided (fail fast, dependency injection enforced)
|
|
51
|
+
"""
|
|
52
|
+
start_time = time.time()
|
|
53
|
+
|
|
54
|
+
# Constitutional boundary enforcement: Body requires proper parameters
|
|
55
|
+
if repo_root is None:
|
|
56
|
+
return ComponentResult(
|
|
57
|
+
component_id=self.component_id,
|
|
58
|
+
ok=False,
|
|
59
|
+
data={
|
|
60
|
+
"error": "KnowledgeGraphAnalyzer requires repo_root parameter. "
|
|
61
|
+
"Body layer components must not access settings directly."
|
|
62
|
+
},
|
|
63
|
+
phase=self.phase,
|
|
64
|
+
confidence=0.0,
|
|
65
|
+
)
|
|
66
|
+
|
|
67
|
+
# Instantiate the pure logic builder
|
|
68
|
+
builder = KnowledgeGraphBuilder(repo_root)
|
|
69
|
+
|
|
70
|
+
# Build the graph (pure in-memory operation)
|
|
71
|
+
graph_data = builder.build()
|
|
72
|
+
|
|
73
|
+
duration = time.time() - start_time
|
|
74
|
+
|
|
75
|
+
return ComponentResult(
|
|
76
|
+
component_id=self.component_id,
|
|
77
|
+
ok=True,
|
|
78
|
+
data=graph_data,
|
|
79
|
+
phase=self.phase,
|
|
80
|
+
confidence=1.0,
|
|
81
|
+
metadata={
|
|
82
|
+
"symbol_count": graph_data["metadata"].get("symbol_count", 0),
|
|
83
|
+
"repo_root": str(repo_root),
|
|
84
|
+
},
|
|
85
|
+
duration_sec=duration,
|
|
86
|
+
)
|