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,337 @@
|
|
|
1
|
+
# src/cli/resources/workers/remediate.py
|
|
2
|
+
"""
|
|
3
|
+
Remediation pipeline command.
|
|
4
|
+
|
|
5
|
+
Chains AuditViolationSensor → ViolationRemediator for a given audit rule.
|
|
6
|
+
|
|
7
|
+
Usage:
|
|
8
|
+
# Dry-run (default) — sense violations, run LLM + Canary, post proposed
|
|
9
|
+
# fixes to blackboard for review. Nothing written to src/.
|
|
10
|
+
core-admin workers remediate purity.no_ast_duplication
|
|
11
|
+
|
|
12
|
+
# Write mode — apply fixes, commit
|
|
13
|
+
core-admin workers remediate purity.no_ast_duplication --write
|
|
14
|
+
|
|
15
|
+
# Sense only — just post findings to blackboard, no LLM
|
|
16
|
+
core-admin workers remediate purity.no_ast_duplication --sense-only
|
|
17
|
+
|
|
18
|
+
# File mode — audit a single file across all rules, then remediate
|
|
19
|
+
core-admin workers remediate --file src/body/workers/violation_remediator.py
|
|
20
|
+
core-admin workers remediate --file src/body/workers/violation_remediator.py --write
|
|
21
|
+
"""
|
|
22
|
+
|
|
23
|
+
from __future__ import annotations
|
|
24
|
+
|
|
25
|
+
import logging
|
|
26
|
+
import uuid
|
|
27
|
+
from pathlib import Path
|
|
28
|
+
from typing import Any
|
|
29
|
+
|
|
30
|
+
import typer
|
|
31
|
+
from rich.console import Console
|
|
32
|
+
|
|
33
|
+
from cli.utils.decorators import core_command
|
|
34
|
+
from shared.context import CoreContext
|
|
35
|
+
from shared.infrastructure.database.session_manager import get_session
|
|
36
|
+
|
|
37
|
+
from .run import workers_app
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
logger = logging.getLogger(__name__)
|
|
41
|
+
console = Console()
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
@workers_app.command("remediate")
|
|
45
|
+
@core_command(dangerous=True)
|
|
46
|
+
# ID: 75e79945-f796-49d5-ba87-783cae6233d0
|
|
47
|
+
async def remediate_cmd(
|
|
48
|
+
ctx: typer.Context,
|
|
49
|
+
rule: str = typer.Argument(
|
|
50
|
+
None, help="Audit rule ID to remediate (e.g. 'purity.no_ast_duplication')."
|
|
51
|
+
),
|
|
52
|
+
write: bool = typer.Option(
|
|
53
|
+
False,
|
|
54
|
+
"--write",
|
|
55
|
+
help="Apply fixes to src/ and commit. Default is dry-run: LLM + Canary run but nothing is written.",
|
|
56
|
+
),
|
|
57
|
+
sense_only: bool = typer.Option(
|
|
58
|
+
False,
|
|
59
|
+
"--sense-only",
|
|
60
|
+
help="Only run the sensor — post findings to blackboard, skip LLM.",
|
|
61
|
+
),
|
|
62
|
+
file: str | None = typer.Option(
|
|
63
|
+
None,
|
|
64
|
+
"--file",
|
|
65
|
+
help=(
|
|
66
|
+
"Audit a single file across all rules, then remediate. "
|
|
67
|
+
"Mutually exclusive with rule and --sense-only. "
|
|
68
|
+
"Path must be relative to repo root."
|
|
69
|
+
),
|
|
70
|
+
),
|
|
71
|
+
) -> None:
|
|
72
|
+
"""
|
|
73
|
+
Run the autonomous remediation pipeline for a constitutional audit rule.
|
|
74
|
+
|
|
75
|
+
Default (dry-run): sensor finds violations → LLM proposes fix →
|
|
76
|
+
Canary validates → proposed fix posted to blackboard for review.
|
|
77
|
+
|
|
78
|
+
With --write: same pipeline but fix is applied to src/ and committed.
|
|
79
|
+
|
|
80
|
+
With --sense-only: only the sensor runs — violations are posted to
|
|
81
|
+
the blackboard but no LLM is invoked.
|
|
82
|
+
|
|
83
|
+
With --file: run a full audit scoped to a single file across all rules,
|
|
84
|
+
then feed findings directly into ViolationRemediator (bypasses sensor
|
|
85
|
+
and blackboard). Mutually exclusive with rule and --sense-only.
|
|
86
|
+
|
|
87
|
+
Examples:
|
|
88
|
+
# Dry-run — review proposed fixes on the blackboard first
|
|
89
|
+
core-admin workers remediate purity.no_ast_duplication
|
|
90
|
+
|
|
91
|
+
# Apply fixes
|
|
92
|
+
core-admin workers remediate purity.no_ast_duplication --write
|
|
93
|
+
|
|
94
|
+
# Just sense — populate blackboard, no LLM
|
|
95
|
+
core-admin workers remediate purity.no_ast_duplication --sense-only
|
|
96
|
+
|
|
97
|
+
# File mode — audit one file, remediate all violations found
|
|
98
|
+
core-admin workers remediate --file src/body/workers/violation_remediator.py
|
|
99
|
+
"""
|
|
100
|
+
# --- mutual exclusion checks ---
|
|
101
|
+
if file and rule:
|
|
102
|
+
logger.info(
|
|
103
|
+
"--file and rule are mutually exclusive. "
|
|
104
|
+
"Use --file to audit a single file across all rules, "
|
|
105
|
+
"or provide a rule argument to use the sensor pipeline."
|
|
106
|
+
)
|
|
107
|
+
raise typer.Exit(code=1)
|
|
108
|
+
|
|
109
|
+
if file and sense_only:
|
|
110
|
+
logger.info(
|
|
111
|
+
"--file and --sense-only are incompatible. "
|
|
112
|
+
"--file already runs the audit; there is nothing to sense."
|
|
113
|
+
)
|
|
114
|
+
raise typer.Exit(code=1)
|
|
115
|
+
|
|
116
|
+
if not file and not rule:
|
|
117
|
+
logger.info("Either a rule argument or --file option is required.")
|
|
118
|
+
raise typer.Exit(code=1)
|
|
119
|
+
|
|
120
|
+
core_context: CoreContext = ctx.obj
|
|
121
|
+
async with get_session() as session:
|
|
122
|
+
await core_context.cognitive_service.initialize(session)
|
|
123
|
+
|
|
124
|
+
if file:
|
|
125
|
+
await _run_file_pipeline(core_context, file, write)
|
|
126
|
+
else:
|
|
127
|
+
await _run_rule_pipeline(core_context, rule, write, sense_only)
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
async def _run_file_pipeline(
|
|
131
|
+
core_context: CoreContext,
|
|
132
|
+
file_path: str,
|
|
133
|
+
write: bool,
|
|
134
|
+
) -> None:
|
|
135
|
+
"""Audit a single file across all rules, then feed findings into ViolationRemediator."""
|
|
136
|
+
from mind.governance.audit_context import AuditorContext
|
|
137
|
+
from mind.governance.auditor import ConstitutionalAuditor
|
|
138
|
+
from will.workers.violation_remediator_body import ViolationRemediator
|
|
139
|
+
|
|
140
|
+
repo_root: Path = core_context.git_service.repo_path
|
|
141
|
+
abs_path = repo_root / file_path
|
|
142
|
+
|
|
143
|
+
if not abs_path.is_file():
|
|
144
|
+
logger.info("File not found: %s (resolved to %s)", file_path, abs_path)
|
|
145
|
+
raise typer.Exit(code=1)
|
|
146
|
+
|
|
147
|
+
mode = "WRITE" if write else "DRY-RUN"
|
|
148
|
+
logger.info(
|
|
149
|
+
"Remediation pipeline (file mode) file=%s mode=%s",
|
|
150
|
+
file_path,
|
|
151
|
+
mode,
|
|
152
|
+
)
|
|
153
|
+
|
|
154
|
+
# Step 1 — File-scoped full audit
|
|
155
|
+
logger.info("Step 1/2 - Full audit scoped to %s", file_path)
|
|
156
|
+
|
|
157
|
+
auditor_context: AuditorContext = core_context.auditor_context
|
|
158
|
+
async with get_session() as session:
|
|
159
|
+
auditor_context.db_session = session
|
|
160
|
+
await auditor_context.load_knowledge_graph()
|
|
161
|
+
auditor = ConstitutionalAuditor(auditor_context)
|
|
162
|
+
result = await auditor.run_full_audit_async()
|
|
163
|
+
auditor_context.db_session = None
|
|
164
|
+
|
|
165
|
+
all_findings = result.get("findings", [])
|
|
166
|
+
file_findings = _filter_findings_for_file(all_findings, file_path)
|
|
167
|
+
|
|
168
|
+
if not file_findings:
|
|
169
|
+
logger.info("No violations found in %s", file_path)
|
|
170
|
+
return
|
|
171
|
+
|
|
172
|
+
logger.info(
|
|
173
|
+
"Found %d violation(s) in %s across %d rule(s)",
|
|
174
|
+
len(file_findings),
|
|
175
|
+
file_path,
|
|
176
|
+
len({f["rule"] for f in file_findings}),
|
|
177
|
+
)
|
|
178
|
+
|
|
179
|
+
# Step 2 — Feed findings into ViolationRemediator directly
|
|
180
|
+
logger.info("Step 2/2 - ViolationRemediator (file mode)")
|
|
181
|
+
|
|
182
|
+
# Build synthetic blackboard-style finding dicts that ViolationRemediator expects.
|
|
183
|
+
synthetic_findings = _build_synthetic_findings(file_findings, file_path)
|
|
184
|
+
|
|
185
|
+
# Determine a combined target_rule label for the remediator.
|
|
186
|
+
unique_rules = sorted({f["rule"] for f in file_findings})
|
|
187
|
+
target_rule = unique_rules[0] if len(unique_rules) == 1 else "file-audit"
|
|
188
|
+
|
|
189
|
+
remediator = ViolationRemediator(
|
|
190
|
+
core_context=core_context, target_rule=target_rule, write=write
|
|
191
|
+
)
|
|
192
|
+
|
|
193
|
+
# Bypass blackboard: override _claim_open_findings to return our findings,
|
|
194
|
+
# and _mark_finding / _mark_findings to no-op (no blackboard entries exist).
|
|
195
|
+
async def _injected_claim() -> list[dict[str, Any]]:
|
|
196
|
+
return synthetic_findings
|
|
197
|
+
|
|
198
|
+
async def _noop_mark_findings(findings: list[dict[str, Any]], status: str) -> None:
|
|
199
|
+
pass
|
|
200
|
+
|
|
201
|
+
async def _noop_mark_finding(finding_id: str, status: str) -> None:
|
|
202
|
+
pass
|
|
203
|
+
|
|
204
|
+
remediator._claim_open_findings = _injected_claim # type: ignore[assignment]
|
|
205
|
+
remediator._mark_findings = _noop_mark_findings # type: ignore[assignment]
|
|
206
|
+
remediator._mark_finding = _noop_mark_finding # type: ignore[assignment]
|
|
207
|
+
|
|
208
|
+
await remediator.start()
|
|
209
|
+
logger.info("Remediator complete.")
|
|
210
|
+
|
|
211
|
+
console.print()
|
|
212
|
+
if write:
|
|
213
|
+
logger.info(
|
|
214
|
+
"Pipeline complete in WRITE mode. "
|
|
215
|
+
"Fixes applied and committed. Run audit to verify:"
|
|
216
|
+
)
|
|
217
|
+
logger.info(" core-admin code audit")
|
|
218
|
+
else:
|
|
219
|
+
logger.info(
|
|
220
|
+
"Pipeline complete in DRY-RUN mode. "
|
|
221
|
+
"Proposed fixes are on the blackboard. Review them:"
|
|
222
|
+
)
|
|
223
|
+
logger.info(
|
|
224
|
+
" core-admin workers blackboard --filter 'audit.remediation.dry_run'"
|
|
225
|
+
)
|
|
226
|
+
logger.info("\nWhen satisfied, apply with:")
|
|
227
|
+
logger.info(" core-admin workers remediate --file %s --write", file_path)
|
|
228
|
+
|
|
229
|
+
|
|
230
|
+
def _filter_findings_for_file(
|
|
231
|
+
findings: list[Any], target_file: str
|
|
232
|
+
) -> list[dict[str, Any]]:
|
|
233
|
+
"""Filter audit findings to only those matching the target file path."""
|
|
234
|
+
result = []
|
|
235
|
+
for f in findings:
|
|
236
|
+
if isinstance(f, dict):
|
|
237
|
+
fp = f.get("file_path") or ""
|
|
238
|
+
check_id = f.get("check_id", "unknown")
|
|
239
|
+
message = f.get("message", "")
|
|
240
|
+
severity = str(f.get("severity", "warning"))
|
|
241
|
+
line_number = f.get("line_number")
|
|
242
|
+
else:
|
|
243
|
+
fp = getattr(f, "file_path", None) or ""
|
|
244
|
+
check_id = getattr(f, "check_id", "unknown")
|
|
245
|
+
message = getattr(f, "message", "")
|
|
246
|
+
severity = str(getattr(f, "severity", "warning"))
|
|
247
|
+
line_number = getattr(f, "line_number", None)
|
|
248
|
+
|
|
249
|
+
if fp == target_file:
|
|
250
|
+
result.append(
|
|
251
|
+
{
|
|
252
|
+
"file_path": fp,
|
|
253
|
+
"rule": check_id,
|
|
254
|
+
"message": message,
|
|
255
|
+
"severity": severity,
|
|
256
|
+
"line_number": line_number,
|
|
257
|
+
}
|
|
258
|
+
)
|
|
259
|
+
return result
|
|
260
|
+
|
|
261
|
+
|
|
262
|
+
def _build_synthetic_findings(
|
|
263
|
+
file_findings: list[dict[str, Any]], file_path: str
|
|
264
|
+
) -> list[dict[str, Any]]:
|
|
265
|
+
"""Convert filtered audit findings into the blackboard-entry format ViolationRemediator expects."""
|
|
266
|
+
synthetic = []
|
|
267
|
+
for f in file_findings:
|
|
268
|
+
synthetic.append(
|
|
269
|
+
{
|
|
270
|
+
"id": str(uuid.uuid4()),
|
|
271
|
+
"payload": {
|
|
272
|
+
"file_path": file_path,
|
|
273
|
+
"rule": f["rule"],
|
|
274
|
+
"message": f["message"],
|
|
275
|
+
"severity": f["severity"],
|
|
276
|
+
"line_number": f.get("line_number"),
|
|
277
|
+
"status": "unprocessed",
|
|
278
|
+
},
|
|
279
|
+
}
|
|
280
|
+
)
|
|
281
|
+
return synthetic
|
|
282
|
+
|
|
283
|
+
|
|
284
|
+
async def _run_rule_pipeline(
|
|
285
|
+
core_context: CoreContext,
|
|
286
|
+
rule: str,
|
|
287
|
+
write: bool,
|
|
288
|
+
sense_only: bool,
|
|
289
|
+
) -> None:
|
|
290
|
+
"""Original rule-based pipeline: AuditViolationSensor → ViolationRemediator."""
|
|
291
|
+
from will.workers.audit_violation_sensor import AuditViolationSensor
|
|
292
|
+
from will.workers.violation_remediator_body import ViolationRemediator
|
|
293
|
+
|
|
294
|
+
mode = "SENSE-ONLY" if sense_only else "WRITE" if write else "DRY-RUN"
|
|
295
|
+
logger.info(
|
|
296
|
+
"Remediation pipeline rule=%s mode=%s",
|
|
297
|
+
rule,
|
|
298
|
+
mode,
|
|
299
|
+
)
|
|
300
|
+
logger.info("Step 1/2 - AuditViolationSensor")
|
|
301
|
+
sensor = AuditViolationSensor(
|
|
302
|
+
core_context=core_context,
|
|
303
|
+
declaration_name=f"audit_sensor_{rule.split('.')[0]}",
|
|
304
|
+
rule_namespace=rule,
|
|
305
|
+
dry_run=not write,
|
|
306
|
+
)
|
|
307
|
+
await sensor.start()
|
|
308
|
+
logger.info("Sensor complete.")
|
|
309
|
+
if sense_only:
|
|
310
|
+
logger.info("--sense-only: skipping remediator. Check blackboard for findings:")
|
|
311
|
+
logger.info(
|
|
312
|
+
" core-admin workers blackboard --filter 'audit.violation::%s'", rule
|
|
313
|
+
)
|
|
314
|
+
return
|
|
315
|
+
logger.info("Step 2/2 - ViolationRemediator")
|
|
316
|
+
remediator = ViolationRemediator(
|
|
317
|
+
core_context=core_context, target_rule=rule, write=write
|
|
318
|
+
)
|
|
319
|
+
await remediator.start()
|
|
320
|
+
logger.info("Remediator complete.")
|
|
321
|
+
console.print()
|
|
322
|
+
if write:
|
|
323
|
+
logger.info(
|
|
324
|
+
"Pipeline complete in WRITE mode. "
|
|
325
|
+
"Fixes applied and committed. Run audit to verify:"
|
|
326
|
+
)
|
|
327
|
+
logger.info(" core-admin code audit")
|
|
328
|
+
else:
|
|
329
|
+
logger.info(
|
|
330
|
+
"Pipeline complete in DRY-RUN mode. "
|
|
331
|
+
"Proposed fixes are on the blackboard. Review them:"
|
|
332
|
+
)
|
|
333
|
+
logger.info(
|
|
334
|
+
" core-admin workers blackboard --filter 'audit.remediation.dry_run'"
|
|
335
|
+
)
|
|
336
|
+
logger.info("\nWhen satisfied, apply with:")
|
|
337
|
+
logger.info(" core-admin workers remediate %s --write", rule)
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
# src/cli/resources/workers/run.py
|
|
2
|
+
"""Worker run command — starts a constitutional worker by declaration name."""
|
|
3
|
+
|
|
4
|
+
from __future__ import annotations
|
|
5
|
+
|
|
6
|
+
import logging
|
|
7
|
+
from pathlib import Path
|
|
8
|
+
from typing import Any
|
|
9
|
+
|
|
10
|
+
import typer
|
|
11
|
+
import yaml
|
|
12
|
+
from rich.console import Console
|
|
13
|
+
|
|
14
|
+
from cli.utils.decorators import core_command
|
|
15
|
+
from shared.config import settings
|
|
16
|
+
from shared.context import CoreContext
|
|
17
|
+
from shared.infrastructure.database.session_manager import get_session
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
logger = logging.getLogger(__name__)
|
|
21
|
+
console = Console()
|
|
22
|
+
workers_app = typer.Typer(
|
|
23
|
+
help="Constitutional worker management.", no_args_is_help=True
|
|
24
|
+
)
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def _load_worker_declarations() -> dict[str, dict]:
|
|
28
|
+
"""
|
|
29
|
+
Discover all active worker declarations from .intent/workers/.
|
|
30
|
+
|
|
31
|
+
Returns a dict keyed by declaration name (YAML stem), value is the
|
|
32
|
+
parsed declaration dict. Only active workers are included.
|
|
33
|
+
|
|
34
|
+
This is the constitutional alternative to a hardcoded Python registry —
|
|
35
|
+
adding a new worker requires only a YAML declaration, not a code change.
|
|
36
|
+
"""
|
|
37
|
+
workers_dir: Path = settings.MIND / "workers"
|
|
38
|
+
if not workers_dir.exists():
|
|
39
|
+
return {}
|
|
40
|
+
declarations = {}
|
|
41
|
+
for yaml_path in sorted(workers_dir.glob("*.yaml")):
|
|
42
|
+
try:
|
|
43
|
+
data = yaml.safe_load(yaml_path.read_text(encoding="utf-8"))
|
|
44
|
+
if data.get("metadata", {}).get("status") != "active":
|
|
45
|
+
continue
|
|
46
|
+
impl = data.get("implementation")
|
|
47
|
+
if not impl or not impl.get("module") or (not impl.get("class")):
|
|
48
|
+
logger.warning(
|
|
49
|
+
"Worker declaration '%s' is missing implementation block — skipped.",
|
|
50
|
+
yaml_path.stem,
|
|
51
|
+
)
|
|
52
|
+
continue
|
|
53
|
+
declarations[yaml_path.stem] = data
|
|
54
|
+
except Exception as e:
|
|
55
|
+
logger.warning("Could not load worker declaration %s: %s", yaml_path, e)
|
|
56
|
+
return declarations
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
@workers_app.command("run")
|
|
60
|
+
@core_command(dangerous=False)
|
|
61
|
+
# ID: ed6afc60-992e-4695-9a64-59844ec6be65
|
|
62
|
+
async def workers_run_cmd(
|
|
63
|
+
ctx: typer.Context,
|
|
64
|
+
worker_name: str = typer.Argument(
|
|
65
|
+
..., help="Worker declaration name (e.g. doc_worker)."
|
|
66
|
+
),
|
|
67
|
+
) -> None:
|
|
68
|
+
"""Start a constitutional worker by its declaration name."""
|
|
69
|
+
import importlib
|
|
70
|
+
|
|
71
|
+
declarations = _load_worker_declarations()
|
|
72
|
+
if worker_name not in declarations:
|
|
73
|
+
available = ", ".join(sorted(declarations.keys())) or "(none declared)"
|
|
74
|
+
console.print(f"[red]Unknown worker: {worker_name}[/red]")
|
|
75
|
+
console.print(f"Available: {available}")
|
|
76
|
+
raise typer.Exit(code=1)
|
|
77
|
+
declaration = declarations[worker_name]
|
|
78
|
+
impl = declaration["implementation"]
|
|
79
|
+
module_path: str = impl["module"]
|
|
80
|
+
class_name: str = impl["class"]
|
|
81
|
+
needs_context: bool = impl.get("requires_core_context", False)
|
|
82
|
+
core_context: CoreContext = ctx.obj
|
|
83
|
+
async with get_session() as session:
|
|
84
|
+
await core_context.cognitive_service.initialize(session)
|
|
85
|
+
module = importlib.import_module(module_path)
|
|
86
|
+
worker_class = getattr(module, class_name)
|
|
87
|
+
|
|
88
|
+
# Replicate the daemon's constructor-kwargs build (see _run_daemon in
|
|
89
|
+
# cli/commands/daemon.py) so parameterised workers — those declaring
|
|
90
|
+
# mandate.scope.rule_namespace or implementation.params — receive the
|
|
91
|
+
# same arguments they get under the daemon. Without this, sensors like
|
|
92
|
+
# AuditViolationSensor TypeError on missing rule_namespace (#262).
|
|
93
|
+
kwargs: dict[str, Any] = {"declaration_name": worker_name}
|
|
94
|
+
rule_namespace = (
|
|
95
|
+
declaration.get("mandate", {}).get("scope", {}).get("rule_namespace", "")
|
|
96
|
+
)
|
|
97
|
+
if rule_namespace:
|
|
98
|
+
kwargs["rule_namespace"] = rule_namespace
|
|
99
|
+
|
|
100
|
+
extra_params = impl.get("params") or {}
|
|
101
|
+
if extra_params:
|
|
102
|
+
protected = {
|
|
103
|
+
"declaration_name",
|
|
104
|
+
"rule_namespace",
|
|
105
|
+
"core_context",
|
|
106
|
+
"cognitive_service",
|
|
107
|
+
}
|
|
108
|
+
clashes = set(extra_params) & protected
|
|
109
|
+
if clashes:
|
|
110
|
+
logger.warning(
|
|
111
|
+
"Worker '%s' implementation.params contains protected keys "
|
|
112
|
+
"%s — they will be ignored.",
|
|
113
|
+
worker_name,
|
|
114
|
+
clashes,
|
|
115
|
+
)
|
|
116
|
+
extra_params = {k: v for k, v in extra_params.items() if k not in protected}
|
|
117
|
+
kwargs.update(extra_params)
|
|
118
|
+
|
|
119
|
+
cog_svc = core_context.cognitive_service
|
|
120
|
+
|
|
121
|
+
# Single fallback to bare instantiation handles workers whose
|
|
122
|
+
# __init__ takes no args and rely on a class-level declaration_name
|
|
123
|
+
# (e.g. ObserverWorker). Anything more elaborate belongs in the daemon's
|
|
124
|
+
# _instantiate_worker, not the CLI run path.
|
|
125
|
+
if needs_context:
|
|
126
|
+
try:
|
|
127
|
+
worker = worker_class(core_context=core_context, **kwargs)
|
|
128
|
+
except TypeError:
|
|
129
|
+
worker = worker_class(core_context=core_context)
|
|
130
|
+
else:
|
|
131
|
+
try:
|
|
132
|
+
worker = worker_class(cognitive_service=cog_svc, **kwargs)
|
|
133
|
+
except TypeError:
|
|
134
|
+
worker = worker_class()
|
|
135
|
+
|
|
136
|
+
if not worker.declaration_name:
|
|
137
|
+
worker.declaration_name = worker_name
|
|
138
|
+
console.print(f"[bold green]Starting worker: {worker_name}[/bold green]")
|
|
139
|
+
await worker.start()
|
|
140
|
+
console.print(f"[bold green]Worker {worker_name} completed.[/bold green]")
|
cli/utils/__init__.py
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# src/cli/utils/__init__.py
|
|
2
|
+
|
|
3
|
+
"""
|
|
4
|
+
Modularized Package Entry Point (V2.3).
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
from .decorators import COMMAND_REGISTRY, async_command, core_command
|
|
10
|
+
from .display import (
|
|
11
|
+
console,
|
|
12
|
+
display_error,
|
|
13
|
+
display_info,
|
|
14
|
+
display_success,
|
|
15
|
+
display_warning,
|
|
16
|
+
)
|
|
17
|
+
from .helpers import deprecated_command
|
|
18
|
+
from .prompts import confirm_action
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
__all__ = [
|
|
22
|
+
"COMMAND_REGISTRY",
|
|
23
|
+
"async_command",
|
|
24
|
+
"confirm_action",
|
|
25
|
+
"console",
|
|
26
|
+
"core_command",
|
|
27
|
+
"deprecated_command",
|
|
28
|
+
"display_error",
|
|
29
|
+
"display_info",
|
|
30
|
+
"display_success",
|
|
31
|
+
"display_warning",
|
|
32
|
+
]
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
# src/cli/utils/annotation_formatter.py
|
|
2
|
+
|
|
3
|
+
"""F-10.2 — GitHub Actions workflow-command annotation formatter.
|
|
4
|
+
|
|
5
|
+
Renders the F-10.1a stateless-audit payload as GitHub Actions
|
|
6
|
+
workflow-command lines so findings surface inline in PR diff view
|
|
7
|
+
(next to the offending line) rather than only in the workflow log.
|
|
8
|
+
|
|
9
|
+
Format per GitHub Actions documentation:
|
|
10
|
+
|
|
11
|
+
::error file=PATH,line=N,col=N::MESSAGE
|
|
12
|
+
::warning file=PATH,line=N,col=N::MESSAGE
|
|
13
|
+
::notice file=PATH,line=N,col=N::MESSAGE
|
|
14
|
+
|
|
15
|
+
ADR-085 §D5 lists "PR annotations + merge-blocking demonstrated
|
|
16
|
+
against a real external repo" as the F-10 exit criterion. The
|
|
17
|
+
annotation channel is the user-visible surface of the gate — findings
|
|
18
|
+
only in the workflow log are effectively invisible in a developer's
|
|
19
|
+
PR review flow.
|
|
20
|
+
|
|
21
|
+
Severity-to-channel mapping (constitutional contract):
|
|
22
|
+
|
|
23
|
+
| CORE severity | GH channel | Merge-block? | Why |
|
|
24
|
+
|---------------|------------|--------------|----------------------------------|
|
|
25
|
+
| blocking | error | yes | gate's whole point |
|
|
26
|
+
| high | error | yes | parse_min_severity default |
|
|
27
|
+
| medium | warning | no | visible in PR, doesn't block |
|
|
28
|
+
| low | notice | no | informational |
|
|
29
|
+
| info | notice | no | informational |
|
|
30
|
+
|
|
31
|
+
Skipped rules (from F-10.1a's `skipped_rules` field) are emitted as
|
|
32
|
+
notices so the operator sees them in the workflow log, but they do not
|
|
33
|
+
appear inline in the diff (no file/line). This preserves the honesty
|
|
34
|
+
commitment from F-10.1a — degraded coverage is surfaced, not silent.
|
|
35
|
+
"""
|
|
36
|
+
|
|
37
|
+
from __future__ import annotations
|
|
38
|
+
|
|
39
|
+
from typing import Any
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
_SEVERITY_TO_CHANNEL: dict[str, str] = {
|
|
43
|
+
"blocking": "error",
|
|
44
|
+
"block": "error",
|
|
45
|
+
"high": "error",
|
|
46
|
+
"medium": "warning",
|
|
47
|
+
"low": "notice",
|
|
48
|
+
"info": "notice",
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
# The 'error' channel is what GitHub uses to fail required status
|
|
52
|
+
# checks; merge-blocking is keyed off this. Documented here so a future
|
|
53
|
+
# maintainer can audit the merge-block surface in one place.
|
|
54
|
+
_MERGE_BLOCKING_CHANNELS: frozenset[str] = frozenset({"error"})
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
# ID: 496df0ee-c556-41ba-b894-05e5979b2f64
|
|
58
|
+
def severity_to_channel(severity: str) -> str:
|
|
59
|
+
"""Map a CORE severity string to a GH annotation channel.
|
|
60
|
+
|
|
61
|
+
Unknown severities fall back to ``notice`` (visible but non-blocking).
|
|
62
|
+
This is the safer default: a misclassified finding still surfaces
|
|
63
|
+
rather than getting silently swallowed.
|
|
64
|
+
"""
|
|
65
|
+
return _SEVERITY_TO_CHANNEL.get(severity.lower(), "notice")
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
# ID: 9922cc55-939c-435d-94a3-74af7e048f04
|
|
69
|
+
def format_finding(finding: dict[str, Any]) -> str:
|
|
70
|
+
"""Format a single finding as one GH workflow-command line.
|
|
71
|
+
|
|
72
|
+
Newlines and ``%``/``\\r`` characters in the message are URL-encoded
|
|
73
|
+
per GitHub's escaping rules; otherwise a multi-line message breaks
|
|
74
|
+
the workflow-command parser and the annotation never renders.
|
|
75
|
+
"""
|
|
76
|
+
severity = str(finding.get("severity", "info"))
|
|
77
|
+
channel = severity_to_channel(severity)
|
|
78
|
+
|
|
79
|
+
file_path = finding.get("file", "")
|
|
80
|
+
line_no = finding.get("line", 1) or 1
|
|
81
|
+
raw_message = str(finding.get("message", "") or finding.get("rule_id", ""))
|
|
82
|
+
rule_id = finding.get("rule_id", "")
|
|
83
|
+
title = f"{rule_id} [{severity}]" if rule_id else severity
|
|
84
|
+
|
|
85
|
+
# GH's workflow-command parser breaks on raw newlines and on the
|
|
86
|
+
# literal characters % \r \n inside the message. Encode per the GH
|
|
87
|
+
# documentation: %25 %0D %0A.
|
|
88
|
+
safe_message = (
|
|
89
|
+
raw_message.replace("%", "%25").replace("\r", "%0D").replace("\n", "%0A")
|
|
90
|
+
)
|
|
91
|
+
safe_title = title.replace("%", "%25").replace("\r", "%0D").replace("\n", "%0A")
|
|
92
|
+
|
|
93
|
+
parts = [f"file={file_path}", f"line={line_no}", f"title={safe_title}"]
|
|
94
|
+
return f"::{channel} {','.join(parts)}::{safe_message}"
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
# ID: 319d626b-b926-4ab0-abf0-9df4cb07419a
|
|
98
|
+
def format_skipped_rule(skipped: dict[str, str]) -> str:
|
|
99
|
+
"""Format one skipped-rule entry as a GH notice (no file/line).
|
|
100
|
+
|
|
101
|
+
Skipped rules surface as workflow-log notices so the operator sees
|
|
102
|
+
the F-10.1a honesty signal (which rules ran vs. were skipped) but
|
|
103
|
+
they do not appear in the PR diff. CI users learn about reduced
|
|
104
|
+
coverage from the workflow output, not from the absence of
|
|
105
|
+
annotations.
|
|
106
|
+
"""
|
|
107
|
+
rule_id = skipped.get("rule_id", "")
|
|
108
|
+
reason = skipped.get("reason", "skipped").replace("%", "%25")
|
|
109
|
+
return f"::notice title=Rule skipped: {rule_id}::{reason}"
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
# ID: 2bc4a2c5-b119-40d1-88b4-27ee32978c5d
|
|
113
|
+
def format_payload(payload: dict[str, Any]) -> str:
|
|
114
|
+
"""Render the full F-10.1a payload as GH workflow-command lines.
|
|
115
|
+
|
|
116
|
+
Returns a newline-joined string; trailing newline included so the
|
|
117
|
+
last annotation parses correctly. Suitable for direct write to
|
|
118
|
+
stdout from the CLI's --format=github-annotations path.
|
|
119
|
+
|
|
120
|
+
Output order:
|
|
121
|
+
1. One line per finding (file/line/severity/message)
|
|
122
|
+
2. One line per skipped rule (workflow-log notice, no file/line)
|
|
123
|
+
3. One summary line on stderr-style notice (verdict + counts)
|
|
124
|
+
|
|
125
|
+
The summary appears last so a downstream consumer that truncates at
|
|
126
|
+
the first annotation still sees per-finding lines first.
|
|
127
|
+
"""
|
|
128
|
+
lines: list[str] = []
|
|
129
|
+
findings = payload.get("findings", []) or []
|
|
130
|
+
for finding in findings:
|
|
131
|
+
lines.append(format_finding(finding))
|
|
132
|
+
|
|
133
|
+
skipped = payload.get("skipped_rules", []) or []
|
|
134
|
+
for entry in skipped:
|
|
135
|
+
lines.append(format_skipped_rule(entry))
|
|
136
|
+
|
|
137
|
+
verdict = payload.get("verdict", "UNKNOWN")
|
|
138
|
+
finding_count = len(findings)
|
|
139
|
+
skipped_count = len(skipped)
|
|
140
|
+
summary = (
|
|
141
|
+
f"CORE audit (stateless): verdict={verdict} "
|
|
142
|
+
f"findings={finding_count} skipped_rules={skipped_count}"
|
|
143
|
+
)
|
|
144
|
+
lines.append(f"::notice title=CORE audit summary::{summary}")
|
|
145
|
+
|
|
146
|
+
return "\n".join(lines) + "\n"
|
|
147
|
+
|
|
148
|
+
|
|
149
|
+
__all__ = [
|
|
150
|
+
"format_finding",
|
|
151
|
+
"format_payload",
|
|
152
|
+
"format_skipped_rule",
|
|
153
|
+
"severity_to_channel",
|
|
154
|
+
]
|