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,76 @@
|
|
|
1
|
+
# src/shared/infrastructure/events/bus.py
|
|
2
|
+
"""
|
|
3
|
+
In-Memory Event Bus.
|
|
4
|
+
Provides a singleton mechanism for decoupling components via events.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
from collections.abc import Callable
|
|
10
|
+
from typing import ClassVar
|
|
11
|
+
|
|
12
|
+
from shared.logger import getLogger
|
|
13
|
+
|
|
14
|
+
from .base import CloudEvent
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
logger = getLogger(__name__)
|
|
18
|
+
|
|
19
|
+
EventHandler = Callable[[CloudEvent], None]
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
# ID: d96a395b-da60-459d-8b40-76a5806f9cdd
|
|
23
|
+
class EventBus:
|
|
24
|
+
"""
|
|
25
|
+
Synchronous In-Memory Event Bus.
|
|
26
|
+
"""
|
|
27
|
+
|
|
28
|
+
_instance: ClassVar[EventBus | None] = None
|
|
29
|
+
_subscribers: ClassVar[dict[str, list[EventHandler]]] = {}
|
|
30
|
+
|
|
31
|
+
@classmethod
|
|
32
|
+
# ID: 50193784-7898-4bfc-9f4b-5daaf58ea9a1
|
|
33
|
+
def get_instance(cls) -> EventBus:
|
|
34
|
+
"""Get the singleton instance of the EventBus."""
|
|
35
|
+
if cls._instance is None:
|
|
36
|
+
cls._instance = EventBus()
|
|
37
|
+
return cls._instance
|
|
38
|
+
|
|
39
|
+
# ID: efad6590-574d-418b-821c-5ec932d5736f
|
|
40
|
+
def subscribe(self, event_type: str, handler: EventHandler) -> None:
|
|
41
|
+
"""
|
|
42
|
+
Register a handler for a specific event type.
|
|
43
|
+
Use '*' for wildcard subscription (all events).
|
|
44
|
+
"""
|
|
45
|
+
if event_type not in self._subscribers:
|
|
46
|
+
self._subscribers[event_type] = []
|
|
47
|
+
self._subscribers[event_type].append(handler)
|
|
48
|
+
logger.debug("Subscribed handler to event type: %s", event_type)
|
|
49
|
+
|
|
50
|
+
# ID: 5fb18622-b0a0-4f86-ac8b-207036292e4a
|
|
51
|
+
def emit(self, event: CloudEvent) -> None:
|
|
52
|
+
"""
|
|
53
|
+
Emit an event to all subscribers of its type.
|
|
54
|
+
Also triggers wildcard '*' subscribers.
|
|
55
|
+
"""
|
|
56
|
+
handlers = self._subscribers.get(event.type, [])
|
|
57
|
+
# Also support wildcard subscriptions '*'
|
|
58
|
+
handlers.extend(self._subscribers.get("*", []))
|
|
59
|
+
|
|
60
|
+
if not handlers:
|
|
61
|
+
logger.debug("No handlers for event: %s", event.type)
|
|
62
|
+
return
|
|
63
|
+
|
|
64
|
+
logger.debug("Emitting event: %s to %d handlers", event.type, len(handlers))
|
|
65
|
+
|
|
66
|
+
for handler in handlers:
|
|
67
|
+
try:
|
|
68
|
+
handler(event)
|
|
69
|
+
except Exception as e:
|
|
70
|
+
# We do not crash the bus; observability picks this up via logs
|
|
71
|
+
logger.error(
|
|
72
|
+
"Error in event handler for %s: %s",
|
|
73
|
+
event.type,
|
|
74
|
+
str(e),
|
|
75
|
+
exc_info=True,
|
|
76
|
+
)
|
|
@@ -0,0 +1,385 @@
|
|
|
1
|
+
# src/shared/infrastructure/git_service.py
|
|
2
|
+
|
|
3
|
+
"""
|
|
4
|
+
GitService: thin, testable wrapper around git commands used by CORE.
|
|
5
|
+
|
|
6
|
+
Responsibilities
|
|
7
|
+
- Validate repo path and .git presence on init.
|
|
8
|
+
- Provide small, composable operations (status, add, commit, etc.).
|
|
9
|
+
- Raise RuntimeError with useful stderr/stdout on git failures.
|
|
10
|
+
|
|
11
|
+
Constitutional sanctuary: this module is the sole permitted user of
|
|
12
|
+
subprocess for git operations. All other layers must go through this service.
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
17
|
+
import shutil
|
|
18
|
+
import subprocess
|
|
19
|
+
import uuid
|
|
20
|
+
from pathlib import Path
|
|
21
|
+
|
|
22
|
+
from shared.infrastructure.intent.operational_config import load_operational_config
|
|
23
|
+
from shared.logger import getLogger
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
logger = getLogger(__name__)
|
|
27
|
+
|
|
28
|
+
_CFG_GIT = load_operational_config().git
|
|
29
|
+
|
|
30
|
+
# ADR-071 D2.2 Phase 1: hermetic action execution via git worktree.
|
|
31
|
+
# Sandbox worktrees live under SANDBOX_PARENT with names beginning
|
|
32
|
+
# SANDBOX_PREFIX so the orphan sweep on daemon boot can identify and
|
|
33
|
+
# reclaim them without touching unrelated worktrees.
|
|
34
|
+
SANDBOX_PARENT = Path("/tmp")
|
|
35
|
+
SANDBOX_PREFIX = "core-action-sandbox-"
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
# ID: 4c70a9c7-ee57-40d7-80af-470c19223c21
|
|
39
|
+
class GitService:
|
|
40
|
+
"""Provides basic git operations for agents and services."""
|
|
41
|
+
|
|
42
|
+
def __init__(self, repo_path: str | Path):
|
|
43
|
+
"""
|
|
44
|
+
Initializes the GitService and validates the repository path.
|
|
45
|
+
"""
|
|
46
|
+
self.repo_path = Path(repo_path).resolve()
|
|
47
|
+
logger.info("GitService initialized for path %s", self.repo_path)
|
|
48
|
+
|
|
49
|
+
def _run_command(self, command: list[str], cwd: Path | None = None) -> str:
|
|
50
|
+
"""Runs a git command and returns stdout; raises RuntimeError on failure."""
|
|
51
|
+
try:
|
|
52
|
+
effective_cwd = cwd or self.repo_path
|
|
53
|
+
logger.debug(
|
|
54
|
+
"Running git command: {' '.join(command)} in %s", effective_cwd
|
|
55
|
+
)
|
|
56
|
+
result = subprocess.run(
|
|
57
|
+
["git", *command],
|
|
58
|
+
cwd=effective_cwd,
|
|
59
|
+
capture_output=True,
|
|
60
|
+
text=True,
|
|
61
|
+
check=True,
|
|
62
|
+
)
|
|
63
|
+
return result.stdout.strip()
|
|
64
|
+
except subprocess.CalledProcessError as e:
|
|
65
|
+
msg = e.stderr or e.stdout or ""
|
|
66
|
+
logger.error("Git command failed: %s", msg)
|
|
67
|
+
raise RuntimeError(f"Git command failed: {msg}") from e
|
|
68
|
+
|
|
69
|
+
# ID: 06b9d4c8-a43e-4430-9f34-08d45747674a
|
|
70
|
+
def init(self, path: Path):
|
|
71
|
+
"""Initializes a new Git repository at the specified path."""
|
|
72
|
+
self._run_command(["init"], cwd=path)
|
|
73
|
+
|
|
74
|
+
# ID: cc819226-e33c-4559-a2d6-88d5d9e0ddaa
|
|
75
|
+
def get_current_commit(self) -> str:
|
|
76
|
+
"""Returns the hash of the current HEAD commit."""
|
|
77
|
+
return self._run_command(["rev-parse", "HEAD"])
|
|
78
|
+
|
|
79
|
+
# ID: e7a5c19d-2f48-4b6c-9d3a-1f0b4e8c5d72
|
|
80
|
+
def get_current_branch(self) -> str:
|
|
81
|
+
"""
|
|
82
|
+
Returns the current branch name (e.g. 'main').
|
|
83
|
+
|
|
84
|
+
Raises RuntimeError on failure — for example, when HEAD is detached
|
|
85
|
+
or the repository has no commits yet. Callers that treat git
|
|
86
|
+
metadata as optional should wrap this call.
|
|
87
|
+
"""
|
|
88
|
+
return self._run_command(["rev-parse", "--abbrev-ref", "HEAD"])
|
|
89
|
+
|
|
90
|
+
# ID: f8b6d2ae-3059-4c7d-ae4b-208c5f9d6e83
|
|
91
|
+
def get_remote_url(self, remote: str = "origin") -> str:
|
|
92
|
+
"""
|
|
93
|
+
Returns the configured URL for the given remote (default 'origin').
|
|
94
|
+
|
|
95
|
+
Raises RuntimeError if the remote is not configured. Callers that
|
|
96
|
+
treat the remote URL as optional should wrap this call.
|
|
97
|
+
"""
|
|
98
|
+
return self._run_command(["remote", "get-url", remote])
|
|
99
|
+
|
|
100
|
+
# ID: 62355f31-f9eb-4ac1-984e-eea556b29f31
|
|
101
|
+
def get_staged_files(self) -> list[str]:
|
|
102
|
+
"""Returns a list of files that are currently staged for commit."""
|
|
103
|
+
try:
|
|
104
|
+
output = self._run_command(
|
|
105
|
+
["diff", "--cached", "--name-only", "--diff-filter=ACMR"]
|
|
106
|
+
)
|
|
107
|
+
if not output:
|
|
108
|
+
return []
|
|
109
|
+
return output.splitlines()
|
|
110
|
+
except RuntimeError:
|
|
111
|
+
return []
|
|
112
|
+
|
|
113
|
+
# ID: e506910f-2fc8-41ac-8f77-4dd79da1e6c6
|
|
114
|
+
def is_git_repo(self) -> bool:
|
|
115
|
+
"""Returns True if a '.git' directory exists."""
|
|
116
|
+
return (self.repo_path / ".git").exists()
|
|
117
|
+
|
|
118
|
+
# ID: 715fe14e-e905-4032-9721-35bc67639ed7
|
|
119
|
+
def status_porcelain(self) -> str:
|
|
120
|
+
"""Returns the porcelain status output."""
|
|
121
|
+
return self._run_command(["status", "--porcelain"])
|
|
122
|
+
|
|
123
|
+
# ID: db520983-cdb8-4b99-a1d9-60467128b6dc
|
|
124
|
+
def add_all(self) -> None:
|
|
125
|
+
"""Stages all changes, including untracked files.
|
|
126
|
+
|
|
127
|
+
Intended for manual/CLI callers (governor-driven flows) that
|
|
128
|
+
legitimately want to capture every working-tree change.
|
|
129
|
+
Autonomous workers must NOT use this — they must use
|
|
130
|
+
``add(path)`` or ``commit_paths(paths, message)`` so their
|
|
131
|
+
commits are scoped to declared files and cannot accidentally
|
|
132
|
+
sweep in unrelated working-tree changes (debug edits, partial
|
|
133
|
+
WIP, other workers' artifacts).
|
|
134
|
+
"""
|
|
135
|
+
self._run_command(["add", "-A"])
|
|
136
|
+
|
|
137
|
+
# ID: 823668c8-17fc-4472-9d37-b22735b8d018
|
|
138
|
+
def add(self, path: str | Path) -> None:
|
|
139
|
+
"""Stages a specific file."""
|
|
140
|
+
self._run_command(["add", str(path)])
|
|
141
|
+
|
|
142
|
+
# ID: 3acb0e63-e71b-4eba-a5ed-88e8e4eec35d
|
|
143
|
+
def commit(self, message: str) -> None:
|
|
144
|
+
"""
|
|
145
|
+
Commits all changes with the provided message.
|
|
146
|
+
|
|
147
|
+
Stages all changes (``git add -A``) before committing. If the first
|
|
148
|
+
commit attempt fails because a pre-commit hook modified files (hooks
|
|
149
|
+
exit non-zero and rewrite staged content), stages again and retries
|
|
150
|
+
once. This is the standard two-pass pattern required when pre-commit
|
|
151
|
+
hooks auto-fix files.
|
|
152
|
+
|
|
153
|
+
Intended for manual/CLI callers (governor-driven flows) that
|
|
154
|
+
legitimately want to capture every working-tree change in a single
|
|
155
|
+
commit. Autonomous workers must NOT use this — they must use
|
|
156
|
+
``commit_paths(paths, message)`` so their commits are scoped to
|
|
157
|
+
declared files and cannot accidentally sweep in unrelated
|
|
158
|
+
working-tree changes (debug edits, partial WIP, other workers'
|
|
159
|
+
artifacts).
|
|
160
|
+
"""
|
|
161
|
+
self._run_command(["add", "-A"])
|
|
162
|
+
try:
|
|
163
|
+
self._run_command(["commit", "-m", message])
|
|
164
|
+
except RuntimeError as first_err:
|
|
165
|
+
# Pre-commit hooks can modify files and exit non-zero on the first
|
|
166
|
+
# pass. Stage their changes and retry exactly once.
|
|
167
|
+
logger.info(
|
|
168
|
+
"GitService: first commit attempt failed — "
|
|
169
|
+
"re-staging after pre-commit hook modifications and retrying: %s",
|
|
170
|
+
first_err,
|
|
171
|
+
)
|
|
172
|
+
self._run_command(["add", "-A"])
|
|
173
|
+
self._run_command(["commit", "-m", message])
|
|
174
|
+
|
|
175
|
+
# ID: d4e5f6a7-b8c9-0123-4567-89abcdef0123
|
|
176
|
+
def restore_paths(self, paths: list[str]) -> None:
|
|
177
|
+
"""
|
|
178
|
+
Reverts the working-tree state of the given tracked paths to HEAD.
|
|
179
|
+
|
|
180
|
+
Used by ProposalExecutor's failure branches per ADR-021 D2/D4.
|
|
181
|
+
Untracked paths in the input are silently dropped (consistent with
|
|
182
|
+
`git checkout -- <pathspec>` semantics).
|
|
183
|
+
"""
|
|
184
|
+
if not paths:
|
|
185
|
+
logger.debug("GitService.restore_paths: no paths to restore")
|
|
186
|
+
return
|
|
187
|
+
|
|
188
|
+
ls_output = self._run_command(["ls-files", "--", *paths])
|
|
189
|
+
tracked = [line for line in ls_output.splitlines() if line]
|
|
190
|
+
|
|
191
|
+
if not tracked:
|
|
192
|
+
logger.info(
|
|
193
|
+
"GitService.restore_paths: no tracked paths in input (count_input=%d)",
|
|
194
|
+
len(paths),
|
|
195
|
+
)
|
|
196
|
+
return
|
|
197
|
+
|
|
198
|
+
self._run_command(["checkout", "--", *tracked])
|
|
199
|
+
logger.info("GitService.restore_paths: reverted %d paths", len(tracked))
|
|
200
|
+
|
|
201
|
+
# ID: e5f6a7b8-c9d0-1234-5678-9abcdef01234
|
|
202
|
+
def commit_paths(self, paths: list[str], message: str) -> None:
|
|
203
|
+
"""
|
|
204
|
+
Stages and commits exactly the given paths.
|
|
205
|
+
|
|
206
|
+
Used by ProposalExecutor's success branches per ADR-021 D3. Mirrors
|
|
207
|
+
the two-pass retry pattern in `commit` for pre-commit hook
|
|
208
|
+
auto-modifications.
|
|
209
|
+
"""
|
|
210
|
+
if not paths:
|
|
211
|
+
raise ValueError(
|
|
212
|
+
"commit_paths requires at least one path; an autonomous "
|
|
213
|
+
"proposal that resolved to no files is malformed"
|
|
214
|
+
)
|
|
215
|
+
|
|
216
|
+
self._run_command(["add", "--", *paths])
|
|
217
|
+
try:
|
|
218
|
+
self._run_command(["commit", "-m", message])
|
|
219
|
+
except RuntimeError as first_err:
|
|
220
|
+
logger.info(
|
|
221
|
+
"GitService.commit_paths: first commit attempt failed — "
|
|
222
|
+
"re-staging after pre-commit hook modifications and retrying: %s",
|
|
223
|
+
first_err,
|
|
224
|
+
)
|
|
225
|
+
self._run_command(["add", "--", *paths])
|
|
226
|
+
self._run_command(["commit", "-m", message])
|
|
227
|
+
|
|
228
|
+
# ID: a1b2c3d4-e5f6-7890-abcd-ef1234567892
|
|
229
|
+
def get_recent_commits(self, n: int = _CFG_GIT.recent_commits_n) -> list[str]:
|
|
230
|
+
"""
|
|
231
|
+
Returns the last n commit summaries (oneline, no merges).
|
|
232
|
+
Used by SystemContextGatherer for change context (Dimension 5).
|
|
233
|
+
"""
|
|
234
|
+
try:
|
|
235
|
+
output = self._run_command(["log", f"-{n}", "--oneline", "--no-merges"])
|
|
236
|
+
return output.splitlines() if output else []
|
|
237
|
+
except RuntimeError:
|
|
238
|
+
return []
|
|
239
|
+
|
|
240
|
+
# ID: ff02b770-4928-4a10-9358-c6df84ff091f
|
|
241
|
+
def get_diff_stat(self, base: str = "HEAD~5", target: str = "HEAD") -> str:
|
|
242
|
+
"""
|
|
243
|
+
Returns the diffstat between two refs.
|
|
244
|
+
Used by SystemContextGatherer for change context (Dimension 5).
|
|
245
|
+
"""
|
|
246
|
+
try:
|
|
247
|
+
return self._run_command(["diff", "--stat", base, target])
|
|
248
|
+
except RuntimeError:
|
|
249
|
+
return ""
|
|
250
|
+
|
|
251
|
+
# ID: c3d4e5f6-a7b8-9012-cdef-123456789003
|
|
252
|
+
def get_changed_files_log(self, n: int = _CFG_GIT.changed_files_log_n) -> list[str]:
|
|
253
|
+
"""
|
|
254
|
+
Returns filenames touched in the last n commits (Python files only).
|
|
255
|
+
Used by SystemContextGatherer for change context (Dimension 5).
|
|
256
|
+
"""
|
|
257
|
+
try:
|
|
258
|
+
output = self._run_command(
|
|
259
|
+
["log", "--name-only", "--pretty=format:", f"-{n}"]
|
|
260
|
+
)
|
|
261
|
+
return [
|
|
262
|
+
line.strip()
|
|
263
|
+
for line in output.splitlines()
|
|
264
|
+
if line.strip() and line.strip().endswith(".py")
|
|
265
|
+
]
|
|
266
|
+
except RuntimeError:
|
|
267
|
+
return []
|
|
268
|
+
|
|
269
|
+
# ID: 2204a851-0f11-495b-be3d-c0af82bb13ee
|
|
270
|
+
def create_worktree(self, sha: str) -> ScopedGitService:
|
|
271
|
+
"""
|
|
272
|
+
Create a hermetic git worktree rooted at `sha` for action execution.
|
|
273
|
+
|
|
274
|
+
Path: SANDBOX_PARENT/SANDBOX_PREFIX<uuid4>/. Uses --detach so no
|
|
275
|
+
branch is created. Returns a ScopedGitService wrapping the worktree;
|
|
276
|
+
the caller MUST call cleanup() (or use as a context manager). Any
|
|
277
|
+
leaked worktrees are reclaimed by sweep_orphan_worktrees() on the
|
|
278
|
+
next daemon boot.
|
|
279
|
+
|
|
280
|
+
ADR-071 D2.2 Phase 1.
|
|
281
|
+
"""
|
|
282
|
+
worktree_path = SANDBOX_PARENT / f"{SANDBOX_PREFIX}{uuid.uuid4().hex}"
|
|
283
|
+
self._run_command(["worktree", "add", "--detach", str(worktree_path), sha])
|
|
284
|
+
logger.info(
|
|
285
|
+
"GitService: created worktree %s at sha %s",
|
|
286
|
+
worktree_path,
|
|
287
|
+
sha[:12],
|
|
288
|
+
)
|
|
289
|
+
return ScopedGitService(worktree_path, parent=self)
|
|
290
|
+
|
|
291
|
+
# ID: 7990798e-4c6b-4aff-a8ce-26f7f1f9d480
|
|
292
|
+
def sweep_orphan_worktrees(self) -> int:
|
|
293
|
+
"""
|
|
294
|
+
Remove any sandbox worktrees left behind by crashed actions.
|
|
295
|
+
|
|
296
|
+
Lists worktrees registered against this repo, removes those whose
|
|
297
|
+
path lives directly under SANDBOX_PARENT with the SANDBOX_PREFIX,
|
|
298
|
+
and prunes the administrative entries. Returns the count removed.
|
|
299
|
+
Safe to call on daemon boot; failures are logged and swallowed so
|
|
300
|
+
ignition is never blocked.
|
|
301
|
+
|
|
302
|
+
ADR-071 D2.2 Phase 1.
|
|
303
|
+
"""
|
|
304
|
+
try:
|
|
305
|
+
output = self._run_command(["worktree", "list", "--porcelain"])
|
|
306
|
+
except RuntimeError as exc:
|
|
307
|
+
logger.warning("GitService.sweep_orphan_worktrees: list failed: %s", exc)
|
|
308
|
+
return 0
|
|
309
|
+
|
|
310
|
+
removed = 0
|
|
311
|
+
for line in output.splitlines():
|
|
312
|
+
if not line.startswith("worktree "):
|
|
313
|
+
continue
|
|
314
|
+
path_str = line[len("worktree ") :].strip()
|
|
315
|
+
path = Path(path_str)
|
|
316
|
+
if path.parent != SANDBOX_PARENT or not path.name.startswith(
|
|
317
|
+
SANDBOX_PREFIX
|
|
318
|
+
):
|
|
319
|
+
continue
|
|
320
|
+
try:
|
|
321
|
+
self._run_command(["worktree", "remove", "--force", path_str])
|
|
322
|
+
removed += 1
|
|
323
|
+
logger.info("GitService: removed orphan worktree %s", path_str)
|
|
324
|
+
except RuntimeError as exc:
|
|
325
|
+
logger.warning(
|
|
326
|
+
"GitService: failed to remove orphan worktree %s: %s",
|
|
327
|
+
path_str,
|
|
328
|
+
exc,
|
|
329
|
+
)
|
|
330
|
+
|
|
331
|
+
try:
|
|
332
|
+
self._run_command(["worktree", "prune"])
|
|
333
|
+
except RuntimeError as exc:
|
|
334
|
+
logger.debug("GitService.sweep_orphan_worktrees: prune failed: %s", exc)
|
|
335
|
+
|
|
336
|
+
return removed
|
|
337
|
+
|
|
338
|
+
|
|
339
|
+
# ID: ea3110a9-3a63-402f-af22-61f1860eff2b
|
|
340
|
+
class ScopedGitService(GitService):
|
|
341
|
+
"""GitService bound to a temporary git worktree (ADR-071 D2.2 Phase 1).
|
|
342
|
+
|
|
343
|
+
Inherits every GitService operation; because `self.repo_path` points at
|
|
344
|
+
the worktree, all commands execute against the sandbox rather than the
|
|
345
|
+
main tree. The caller is responsible for `cleanup()` — either directly
|
|
346
|
+
or via context-manager use — once execution finishes.
|
|
347
|
+
"""
|
|
348
|
+
|
|
349
|
+
def __init__(self, worktree_path: Path, parent: GitService):
|
|
350
|
+
super().__init__(worktree_path)
|
|
351
|
+
self._parent = parent
|
|
352
|
+
self._cleaned_up = False
|
|
353
|
+
|
|
354
|
+
# ID: 375faa32-d545-47ee-9fdb-3894b425de5a
|
|
355
|
+
def cleanup(self) -> None:
|
|
356
|
+
"""
|
|
357
|
+
Remove the worktree. Idempotent. Uses `git worktree remove --force`
|
|
358
|
+
which discards any uncommitted changes in the sandbox — intentional,
|
|
359
|
+
because the caller is expected to copy out wanted changes before
|
|
360
|
+
cleanup.
|
|
361
|
+
"""
|
|
362
|
+
if self._cleaned_up:
|
|
363
|
+
return
|
|
364
|
+
try:
|
|
365
|
+
self._parent._run_command(
|
|
366
|
+
["worktree", "remove", "--force", str(self.repo_path)]
|
|
367
|
+
)
|
|
368
|
+
except RuntimeError as exc:
|
|
369
|
+
logger.warning(
|
|
370
|
+
"ScopedGitService.cleanup: git worktree remove failed (%s); "
|
|
371
|
+
"falling back to rmtree on %s",
|
|
372
|
+
exc,
|
|
373
|
+
self.repo_path,
|
|
374
|
+
)
|
|
375
|
+
if self.repo_path.exists():
|
|
376
|
+
shutil.rmtree(self.repo_path, ignore_errors=True)
|
|
377
|
+
finally:
|
|
378
|
+
self._cleaned_up = True
|
|
379
|
+
logger.info("ScopedGitService: cleaned up worktree %s", self.repo_path)
|
|
380
|
+
|
|
381
|
+
def __enter__(self) -> ScopedGitService:
|
|
382
|
+
return self
|
|
383
|
+
|
|
384
|
+
def __exit__(self, *exc_info: object) -> None:
|
|
385
|
+
self.cleanup()
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
# src/shared/infrastructure/intent/action_risk.py
|
|
2
|
+
"""
|
|
3
|
+
Action-id to impact-level mapping helper.
|
|
4
|
+
|
|
5
|
+
Single source of truth for atomic-action impact classification. The
|
|
6
|
+
mapping is owned by .intent/enforcement/config/action_risk.yaml and
|
|
7
|
+
governs which actions auto-execute (safe), require human approval
|
|
8
|
+
(moderate), or are blocked unless explicitly authorized (dangerous).
|
|
9
|
+
|
|
10
|
+
Authority: policy. The governing document is
|
|
11
|
+
.intent/enforcement/config/action_risk.yaml, accessed exclusively
|
|
12
|
+
via IntentRepository. No other module may hardcode the action_id ->
|
|
13
|
+
impact_level mapping — all call sites route through this helper. See
|
|
14
|
+
ADR-008.
|
|
15
|
+
|
|
16
|
+
The _FALLBACK_* constants below are last-resort graceful degradation
|
|
17
|
+
for the narrow case where the policy document cannot be loaded (e.g.
|
|
18
|
+
bootstrap races, corrupt YAML). They MUST NOT be treated as
|
|
19
|
+
defaults-in-logic — when the policy loads successfully, it always wins.
|
|
20
|
+
|
|
21
|
+
LAYER: shared/infrastructure/intent — pure helper. No imports from
|
|
22
|
+
will/, body/, or cli/.
|
|
23
|
+
"""
|
|
24
|
+
|
|
25
|
+
from __future__ import annotations
|
|
26
|
+
|
|
27
|
+
from typing import Any
|
|
28
|
+
|
|
29
|
+
from shared.logger import getLogger
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
logger = getLogger(__name__)
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
_VALID_LEVELS: frozenset[str] = frozenset({"safe", "moderate", "dangerous"})
|
|
36
|
+
|
|
37
|
+
_FALLBACK_MAPPING: dict[str, str] = {
|
|
38
|
+
"build.tests": "safe",
|
|
39
|
+
"check.imports": "safe",
|
|
40
|
+
"claim.proposal": "safe",
|
|
41
|
+
"crate.create": "safe",
|
|
42
|
+
"file.create": "moderate",
|
|
43
|
+
"file.edit": "moderate",
|
|
44
|
+
"file.read": "safe",
|
|
45
|
+
"file.tag_metadata": "safe",
|
|
46
|
+
"fix.atomic_actions": "moderate",
|
|
47
|
+
"fix.docstrings": "moderate",
|
|
48
|
+
"fix.duplicate_ids": "moderate",
|
|
49
|
+
"fix.format": "safe",
|
|
50
|
+
"fix.headers": "safe",
|
|
51
|
+
"fix.ids": "safe",
|
|
52
|
+
"fix.imports": "safe",
|
|
53
|
+
"fix.logging": "safe",
|
|
54
|
+
"fix.modularity": "moderate",
|
|
55
|
+
"fix.placeholders": "safe",
|
|
56
|
+
"sync.db": "moderate",
|
|
57
|
+
"sync.vectors_code": "moderate",
|
|
58
|
+
"sync.vectors_constitution": "moderate",
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
# ID: 4b8d2e7c-1f9a-4d6b-8c3e-5a7f9b2d4e6c
|
|
63
|
+
def _validate_config(mapping: dict[str, Any]) -> None:
|
|
64
|
+
"""
|
|
65
|
+
Validate at load time that every value in the mapping is one of
|
|
66
|
+
{safe, moderate, dangerous}. Raises ValueError with a clear message
|
|
67
|
+
on the first offending key/value encountered.
|
|
68
|
+
"""
|
|
69
|
+
for action_id, level in mapping.items():
|
|
70
|
+
if level not in _VALID_LEVELS:
|
|
71
|
+
raise ValueError(
|
|
72
|
+
f"action_risk: actions[{action_id!r}] = {level!r} is not a "
|
|
73
|
+
f"valid impact level; allowed values are {sorted(_VALID_LEVELS)}"
|
|
74
|
+
)
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
# ID: 5c9e3f8d-2a0b-4e7c-9d4f-6b8a0c3e5f7d
|
|
78
|
+
def load_action_risk() -> dict[str, str]:
|
|
79
|
+
"""
|
|
80
|
+
Load .intent/enforcement/config/action_risk.yaml via IntentRepository.
|
|
81
|
+
|
|
82
|
+
Returns the action_id -> impact_level mapping on success. On any
|
|
83
|
+
failure — missing file, parse error, unexpected top-level type —
|
|
84
|
+
returns fallback defaults and logs a warning so callers degrade
|
|
85
|
+
gracefully rather than halting.
|
|
86
|
+
|
|
87
|
+
The loader validates every impact level against
|
|
88
|
+
{safe, moderate, dangerous} before returning. A YAML that maps an
|
|
89
|
+
action to anything else raises ValueError at load time, not at the
|
|
90
|
+
call site.
|
|
91
|
+
"""
|
|
92
|
+
try:
|
|
93
|
+
from shared.infrastructure.intent.intent_repository import (
|
|
94
|
+
get_intent_repository,
|
|
95
|
+
)
|
|
96
|
+
|
|
97
|
+
repo = get_intent_repository()
|
|
98
|
+
config_path = repo.resolve_rel("enforcement/config/action_risk.yaml")
|
|
99
|
+
config = repo.load_document(config_path)
|
|
100
|
+
if isinstance(config, dict):
|
|
101
|
+
actions = config.get("actions")
|
|
102
|
+
if isinstance(actions, dict):
|
|
103
|
+
_validate_config(actions)
|
|
104
|
+
return dict(actions)
|
|
105
|
+
logger.warning(
|
|
106
|
+
"action_risk: action_risk.yaml missing 'actions' dict "
|
|
107
|
+
"— using fallback defaults."
|
|
108
|
+
)
|
|
109
|
+
else:
|
|
110
|
+
logger.warning(
|
|
111
|
+
"action_risk: action_risk.yaml did not parse as a dict "
|
|
112
|
+
"— using fallback defaults."
|
|
113
|
+
)
|
|
114
|
+
except ValueError:
|
|
115
|
+
raise
|
|
116
|
+
except Exception as exc:
|
|
117
|
+
logger.warning(
|
|
118
|
+
"action_risk: could not load .intent/enforcement/config/"
|
|
119
|
+
"action_risk.yaml (%s) — using fallback defaults.",
|
|
120
|
+
exc,
|
|
121
|
+
)
|
|
122
|
+
return dict(_FALLBACK_MAPPING)
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
# ID: 6da0f4ae-3b1c-4f8d-ae5b-7c9b1d4f6a8e
|
|
126
|
+
def get_impact_level(action_id: str) -> str:
|
|
127
|
+
"""
|
|
128
|
+
Return the impact level for a given action_id.
|
|
129
|
+
|
|
130
|
+
Raises KeyError if the action_id is not present in the mapping —
|
|
131
|
+
callers must register every action in
|
|
132
|
+
.intent/enforcement/config/action_risk.yaml.
|
|
133
|
+
"""
|
|
134
|
+
mapping = load_action_risk()
|
|
135
|
+
return mapping[action_id]
|