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,359 @@
|
|
|
1
|
+
# src/shared/infrastructure/intent/filesystem_operations.py
|
|
2
|
+
"""
|
|
3
|
+
Filesystem-operation taxonomy loader.
|
|
4
|
+
|
|
5
|
+
Sole sanctioned reader of ``.intent/taxonomies/filesystem_operations.yaml``
|
|
6
|
+
— the canonical call-name → op-class taxonomy declared by ADR-077 §2 and
|
|
7
|
+
consumed by the protected-namespace access check.
|
|
8
|
+
|
|
9
|
+
Fail-closed by design per ADR-068 pattern: any structural deviation raises
|
|
10
|
+
``FilesystemOperationTaxonomyError``. The loader never returns an empty
|
|
11
|
+
set and never falls back to a permissive default — silent pass-all would
|
|
12
|
+
defeat the policy whose authority rests on this vocabulary.
|
|
13
|
+
|
|
14
|
+
Cross-references ``.intent/META/enums.json`` on every load to resolve the
|
|
15
|
+
``fs_audit_op_class`` enum (ADR-080 D3). The op_class value of every entry
|
|
16
|
+
is validated against that enum at load time; drift between the YAML and
|
|
17
|
+
the enum is a load-time failure.
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
from __future__ import annotations
|
|
21
|
+
|
|
22
|
+
import json
|
|
23
|
+
from dataclasses import dataclass
|
|
24
|
+
from pathlib import Path
|
|
25
|
+
from typing import Any
|
|
26
|
+
|
|
27
|
+
import yaml
|
|
28
|
+
|
|
29
|
+
from shared.infrastructure.intent.errors import GovernanceError
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
FILESYSTEM_OPERATIONS_REL = ".intent/taxonomies/filesystem_operations.yaml"
|
|
33
|
+
ENUMS_REL = ".intent/META/enums.json"
|
|
34
|
+
|
|
35
|
+
# src/shared/infrastructure/intent/filesystem_operations.py
|
|
36
|
+
# parents[0] = intent
|
|
37
|
+
# parents[1] = infrastructure
|
|
38
|
+
# parents[2] = shared
|
|
39
|
+
# parents[3] = src
|
|
40
|
+
# parents[4] = repo root
|
|
41
|
+
_REPO_ROOT_DEFAULT = Path(__file__).resolve().parents[4]
|
|
42
|
+
|
|
43
|
+
# Match-mode vocabulary. Closed at code level — extending requires an ADR
|
|
44
|
+
# revision and a coordinated loader edit. ADR-077 §2 declares the two
|
|
45
|
+
# values; no third match strategy is anticipated.
|
|
46
|
+
_VALID_MATCH_MODES = frozenset({"leaf", "qualified"})
|
|
47
|
+
|
|
48
|
+
# Predicate vocabulary. Closed at code level. ADR-077 §2 names exactly
|
|
49
|
+
# one predicate (``write_mode``); growth requires an ADR revision.
|
|
50
|
+
_VALID_PREDICATES = frozenset({"write_mode"})
|
|
51
|
+
|
|
52
|
+
# Required and optional fields per taxonomy entry.
|
|
53
|
+
_REQUIRED_ENTRY_FIELDS = frozenset({"op_class", "match"})
|
|
54
|
+
_OPTIONAL_ENTRY_FIELDS = frozenset({"predicate"})
|
|
55
|
+
_ALL_ENTRY_FIELDS = _REQUIRED_ENTRY_FIELDS | _OPTIONAL_ENTRY_FIELDS
|
|
56
|
+
|
|
57
|
+
# Required top-level operations sub-blocks (split-structure per the YAML).
|
|
58
|
+
_REQUIRED_OPERATION_BLOCKS = frozenset({"pathlib_path", "watched"})
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
# ID: 4e1aeb6b-4971-4a21-9eed-1c1bcb1a1cdf
|
|
62
|
+
class FilesystemOperationTaxonomyError(GovernanceError):
|
|
63
|
+
"""Raised when the filesystem-operation taxonomy cannot be loaded fail-closed."""
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
@dataclass(frozen=True)
|
|
67
|
+
# ID: a0babacc-2bbb-4aae-9bdd-90941ec58575
|
|
68
|
+
class FsOperationEntry:
|
|
69
|
+
"""A single classified filesystem-touching call.
|
|
70
|
+
|
|
71
|
+
``namespace`` is ``pathlib_path`` for the auto-discovered pathlib.Path
|
|
72
|
+
block, or ``watched`` for the curated cross-module block. The
|
|
73
|
+
completeness check uses this discriminator to apply the two halves of
|
|
74
|
+
its discovery contract (introspection for pathlib_path, callable
|
|
75
|
+
resolution for watched).
|
|
76
|
+
"""
|
|
77
|
+
|
|
78
|
+
name: str
|
|
79
|
+
op_class: str
|
|
80
|
+
match: str
|
|
81
|
+
namespace: str
|
|
82
|
+
predicate: str | None = None
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
@dataclass(frozen=True)
|
|
86
|
+
# ID: b9288eb5-9142-4e45-8867-076063834ad4
|
|
87
|
+
class FsOperationTaxonomy:
|
|
88
|
+
"""Loaded taxonomy split into its two declared blocks.
|
|
89
|
+
|
|
90
|
+
The split mirrors the YAML structure and the two-halves completeness
|
|
91
|
+
contract from ADR-077 §3. ``python_version`` records the interpreter
|
|
92
|
+
version the classifications were authored against; the completeness
|
|
93
|
+
check compares it to runtime ``sys.version_info`` per §5.
|
|
94
|
+
"""
|
|
95
|
+
|
|
96
|
+
pathlib_path: frozenset[FsOperationEntry]
|
|
97
|
+
watched: frozenset[FsOperationEntry]
|
|
98
|
+
python_version: str
|
|
99
|
+
|
|
100
|
+
@property
|
|
101
|
+
# ID: 0ca0721d-2bbf-4a0d-aeda-6c56cc38f988
|
|
102
|
+
def all_entries(self) -> frozenset[FsOperationEntry]:
|
|
103
|
+
"""Return every classified entry across both blocks."""
|
|
104
|
+
return self.pathlib_path | self.watched
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
# ID: 6b5d99f0-0847-4e82-9cff-4047c8125d27
|
|
108
|
+
def load_filesystem_operations(
|
|
109
|
+
repo_root: Path | None = None,
|
|
110
|
+
) -> FsOperationTaxonomy:
|
|
111
|
+
"""Return the declared filesystem-operation taxonomy as a frozen container.
|
|
112
|
+
|
|
113
|
+
Reads ``.intent/taxonomies/filesystem_operations.yaml`` and validates
|
|
114
|
+
every entry against ADR-077 §2 and the ``fs_audit_op_class`` enum from
|
|
115
|
+
``.intent/META/enums.json`` (ADR-080 D3). Raises
|
|
116
|
+
``FilesystemOperationTaxonomyError`` on any structural deviation.
|
|
117
|
+
"""
|
|
118
|
+
root = (repo_root or _REPO_ROOT_DEFAULT).resolve()
|
|
119
|
+
|
|
120
|
+
fs_audit_op_classes = _load_fs_audit_op_class_enum(root)
|
|
121
|
+
document = _load_document(root)
|
|
122
|
+
|
|
123
|
+
python_version = document.get("python_version")
|
|
124
|
+
if not isinstance(python_version, str) or not python_version.strip():
|
|
125
|
+
raise FilesystemOperationTaxonomyError(
|
|
126
|
+
f"{FILESYSTEM_OPERATIONS_REL}: 'python_version' must be a non-empty string "
|
|
127
|
+
f"(ADR-077 §5 determinism anchor)."
|
|
128
|
+
)
|
|
129
|
+
|
|
130
|
+
operations_block = document.get("operations")
|
|
131
|
+
if not isinstance(operations_block, dict):
|
|
132
|
+
raise FilesystemOperationTaxonomyError(
|
|
133
|
+
f"{FILESYSTEM_OPERATIONS_REL}: missing or non-mapping 'operations:' block."
|
|
134
|
+
)
|
|
135
|
+
|
|
136
|
+
actual_blocks = frozenset(operations_block.keys())
|
|
137
|
+
missing_blocks = _REQUIRED_OPERATION_BLOCKS - actual_blocks
|
|
138
|
+
if missing_blocks:
|
|
139
|
+
raise FilesystemOperationTaxonomyError(
|
|
140
|
+
f"{FILESYSTEM_OPERATIONS_REL}: 'operations:' missing required "
|
|
141
|
+
f"sub-block(s): {sorted(missing_blocks)}."
|
|
142
|
+
)
|
|
143
|
+
extra_blocks = actual_blocks - _REQUIRED_OPERATION_BLOCKS
|
|
144
|
+
if extra_blocks:
|
|
145
|
+
raise FilesystemOperationTaxonomyError(
|
|
146
|
+
f"{FILESYSTEM_OPERATIONS_REL}: 'operations:' has unknown sub-block(s): "
|
|
147
|
+
f"{sorted(extra_blocks)}."
|
|
148
|
+
)
|
|
149
|
+
|
|
150
|
+
pathlib_entries = _parse_block(
|
|
151
|
+
block_name="pathlib_path",
|
|
152
|
+
raw=operations_block["pathlib_path"],
|
|
153
|
+
expected_match=None,
|
|
154
|
+
fs_audit_op_classes=fs_audit_op_classes,
|
|
155
|
+
)
|
|
156
|
+
watched_entries = _parse_block(
|
|
157
|
+
block_name="watched",
|
|
158
|
+
raw=operations_block["watched"],
|
|
159
|
+
expected_match=None,
|
|
160
|
+
fs_audit_op_classes=fs_audit_op_classes,
|
|
161
|
+
)
|
|
162
|
+
|
|
163
|
+
return FsOperationTaxonomy(
|
|
164
|
+
pathlib_path=pathlib_entries,
|
|
165
|
+
watched=watched_entries,
|
|
166
|
+
python_version=python_version.strip(),
|
|
167
|
+
)
|
|
168
|
+
|
|
169
|
+
|
|
170
|
+
def _load_document(root: Path) -> dict[str, Any]:
|
|
171
|
+
"""Load and minimally validate the top-level taxonomy YAML document."""
|
|
172
|
+
path = root / FILESYSTEM_OPERATIONS_REL
|
|
173
|
+
if not path.is_file():
|
|
174
|
+
raise FilesystemOperationTaxonomyError(
|
|
175
|
+
f"filesystem-operation taxonomy missing: {FILESYSTEM_OPERATIONS_REL}"
|
|
176
|
+
)
|
|
177
|
+
try:
|
|
178
|
+
text = path.read_text(encoding="utf-8")
|
|
179
|
+
except OSError as exc:
|
|
180
|
+
raise FilesystemOperationTaxonomyError(
|
|
181
|
+
f"cannot read {FILESYSTEM_OPERATIONS_REL}: {exc}"
|
|
182
|
+
) from exc
|
|
183
|
+
try:
|
|
184
|
+
document = yaml.safe_load(text)
|
|
185
|
+
except yaml.YAMLError as exc:
|
|
186
|
+
raise FilesystemOperationTaxonomyError(
|
|
187
|
+
f"malformed YAML in {FILESYSTEM_OPERATIONS_REL}: {exc}"
|
|
188
|
+
) from exc
|
|
189
|
+
if not isinstance(document, dict):
|
|
190
|
+
raise FilesystemOperationTaxonomyError(
|
|
191
|
+
f"{FILESYSTEM_OPERATIONS_REL}: top-level document must be a mapping."
|
|
192
|
+
)
|
|
193
|
+
return document
|
|
194
|
+
|
|
195
|
+
|
|
196
|
+
def _load_fs_audit_op_class_enum(root: Path) -> frozenset[str]:
|
|
197
|
+
"""Resolve fs_audit_op_class.enum from .intent/META/enums.json (ADR-080 D3)."""
|
|
198
|
+
path = root / ENUMS_REL
|
|
199
|
+
if not path.is_file():
|
|
200
|
+
raise FilesystemOperationTaxonomyError(
|
|
201
|
+
f"required enum file missing: {ENUMS_REL}"
|
|
202
|
+
)
|
|
203
|
+
try:
|
|
204
|
+
text = path.read_text(encoding="utf-8")
|
|
205
|
+
except OSError as exc:
|
|
206
|
+
raise FilesystemOperationTaxonomyError(
|
|
207
|
+
f"cannot read {ENUMS_REL}: {exc}"
|
|
208
|
+
) from exc
|
|
209
|
+
try:
|
|
210
|
+
document = json.loads(text)
|
|
211
|
+
except json.JSONDecodeError as exc:
|
|
212
|
+
raise FilesystemOperationTaxonomyError(
|
|
213
|
+
f"malformed JSON in {ENUMS_REL}: {exc}"
|
|
214
|
+
) from exc
|
|
215
|
+
|
|
216
|
+
definitions = document.get("definitions") if isinstance(document, dict) else None
|
|
217
|
+
if not isinstance(definitions, dict):
|
|
218
|
+
raise FilesystemOperationTaxonomyError(
|
|
219
|
+
f"{ENUMS_REL}: missing or non-mapping 'definitions' block."
|
|
220
|
+
)
|
|
221
|
+
|
|
222
|
+
enum_def = definitions.get("fs_audit_op_class")
|
|
223
|
+
if not isinstance(enum_def, dict) or not isinstance(enum_def.get("enum"), list):
|
|
224
|
+
raise FilesystemOperationTaxonomyError(
|
|
225
|
+
f"{ENUMS_REL}: missing or malformed 'fs_audit_op_class' enum "
|
|
226
|
+
f"(ADR-080 D3 prerequisite)."
|
|
227
|
+
)
|
|
228
|
+
values = frozenset(str(v) for v in enum_def["enum"])
|
|
229
|
+
if not values:
|
|
230
|
+
raise FilesystemOperationTaxonomyError(
|
|
231
|
+
f"{ENUMS_REL}: 'fs_audit_op_class' enum is empty."
|
|
232
|
+
)
|
|
233
|
+
return values
|
|
234
|
+
|
|
235
|
+
|
|
236
|
+
def _parse_block(
|
|
237
|
+
*,
|
|
238
|
+
block_name: str,
|
|
239
|
+
raw: Any,
|
|
240
|
+
expected_match: str | None,
|
|
241
|
+
fs_audit_op_classes: frozenset[str],
|
|
242
|
+
) -> frozenset[FsOperationEntry]:
|
|
243
|
+
"""Validate one operations sub-block and assemble its frozenset of entries.
|
|
244
|
+
|
|
245
|
+
``expected_match`` constrains the match mode for every entry in this
|
|
246
|
+
block. ``None`` permits either valid mode on a per-entry basis — both
|
|
247
|
+
the watched block (where ADR-077 §2 specifies qualified for the
|
|
248
|
+
module-rooted families that motivate it, but leaf would be schema-valid
|
|
249
|
+
if ever needed) and the pathlib_path block (where the convention is
|
|
250
|
+
leaf, but collision-prone attribute names like ``replace``/``rename``/
|
|
251
|
+
``open`` are declared qualified to avoid firing on ``str.replace``,
|
|
252
|
+
``tarfile.open(mode="w:gz")``, and similar — see #489 / ADR-077 §6
|
|
253
|
+
step 3 phased re-plan).
|
|
254
|
+
"""
|
|
255
|
+
if not isinstance(raw, dict):
|
|
256
|
+
raise FilesystemOperationTaxonomyError(
|
|
257
|
+
f"{FILESYSTEM_OPERATIONS_REL}: '{block_name}:' must be a mapping, "
|
|
258
|
+
f"got {type(raw).__name__}."
|
|
259
|
+
)
|
|
260
|
+
if not raw:
|
|
261
|
+
raise FilesystemOperationTaxonomyError(
|
|
262
|
+
f"{FILESYSTEM_OPERATIONS_REL}: '{block_name}:' declares no entries; "
|
|
263
|
+
f"empty taxonomy block is rejected (fail-closed)."
|
|
264
|
+
)
|
|
265
|
+
|
|
266
|
+
entries: set[FsOperationEntry] = set()
|
|
267
|
+
for call_name, entry in raw.items():
|
|
268
|
+
entries.add(
|
|
269
|
+
_build_entry(
|
|
270
|
+
block_name=block_name,
|
|
271
|
+
call_name=str(call_name),
|
|
272
|
+
entry=entry,
|
|
273
|
+
expected_match=expected_match,
|
|
274
|
+
fs_audit_op_classes=fs_audit_op_classes,
|
|
275
|
+
)
|
|
276
|
+
)
|
|
277
|
+
return frozenset(entries)
|
|
278
|
+
|
|
279
|
+
|
|
280
|
+
def _build_entry(
|
|
281
|
+
*,
|
|
282
|
+
block_name: str,
|
|
283
|
+
call_name: str,
|
|
284
|
+
entry: Any,
|
|
285
|
+
expected_match: str | None,
|
|
286
|
+
fs_audit_op_classes: frozenset[str],
|
|
287
|
+
) -> FsOperationEntry:
|
|
288
|
+
"""Assemble and validate one FsOperationEntry from a YAML mapping entry."""
|
|
289
|
+
if not call_name.strip():
|
|
290
|
+
raise FilesystemOperationTaxonomyError(
|
|
291
|
+
f"{FILESYSTEM_OPERATIONS_REL}: '{block_name}:' has an empty call name."
|
|
292
|
+
)
|
|
293
|
+
if not isinstance(entry, dict):
|
|
294
|
+
raise FilesystemOperationTaxonomyError(
|
|
295
|
+
f"{block_name}.{call_name}: entry must be a mapping, "
|
|
296
|
+
f"got {type(entry).__name__}."
|
|
297
|
+
)
|
|
298
|
+
|
|
299
|
+
actual_fields = frozenset(entry.keys())
|
|
300
|
+
missing = _REQUIRED_ENTRY_FIELDS - actual_fields
|
|
301
|
+
if missing:
|
|
302
|
+
raise FilesystemOperationTaxonomyError(
|
|
303
|
+
f"{block_name}.{call_name}: missing required field(s): {sorted(missing)}."
|
|
304
|
+
)
|
|
305
|
+
extra = actual_fields - _ALL_ENTRY_FIELDS
|
|
306
|
+
if extra:
|
|
307
|
+
raise FilesystemOperationTaxonomyError(
|
|
308
|
+
f"{block_name}.{call_name}: unknown field(s): {sorted(extra)}."
|
|
309
|
+
)
|
|
310
|
+
|
|
311
|
+
op_class = entry["op_class"]
|
|
312
|
+
if not isinstance(op_class, str):
|
|
313
|
+
raise FilesystemOperationTaxonomyError(
|
|
314
|
+
f"{block_name}.{call_name}: 'op_class' must be a string, "
|
|
315
|
+
f"got {type(op_class).__name__}."
|
|
316
|
+
)
|
|
317
|
+
if op_class not in fs_audit_op_classes:
|
|
318
|
+
raise FilesystemOperationTaxonomyError(
|
|
319
|
+
f"{block_name}.{call_name}: op_class '{op_class}' is not in "
|
|
320
|
+
f"fs_audit_op_class.enum {sorted(fs_audit_op_classes)} (ADR-080 D3)."
|
|
321
|
+
)
|
|
322
|
+
|
|
323
|
+
match = entry["match"]
|
|
324
|
+
if not isinstance(match, str):
|
|
325
|
+
raise FilesystemOperationTaxonomyError(
|
|
326
|
+
f"{block_name}.{call_name}: 'match' must be a string, "
|
|
327
|
+
f"got {type(match).__name__}."
|
|
328
|
+
)
|
|
329
|
+
if match not in _VALID_MATCH_MODES:
|
|
330
|
+
raise FilesystemOperationTaxonomyError(
|
|
331
|
+
f"{block_name}.{call_name}: match '{match}' is not in "
|
|
332
|
+
f"{sorted(_VALID_MATCH_MODES)} (ADR-077 §2)."
|
|
333
|
+
)
|
|
334
|
+
if expected_match is not None and match != expected_match:
|
|
335
|
+
raise FilesystemOperationTaxonomyError(
|
|
336
|
+
f"{block_name}.{call_name}: match '{match}' violates the '{block_name}' "
|
|
337
|
+
f"block constraint (must be '{expected_match}' per ADR-077 §2)."
|
|
338
|
+
)
|
|
339
|
+
|
|
340
|
+
predicate = entry.get("predicate")
|
|
341
|
+
if predicate is not None:
|
|
342
|
+
if not isinstance(predicate, str):
|
|
343
|
+
raise FilesystemOperationTaxonomyError(
|
|
344
|
+
f"{block_name}.{call_name}: 'predicate' must be a string when present, "
|
|
345
|
+
f"got {type(predicate).__name__}."
|
|
346
|
+
)
|
|
347
|
+
if predicate not in _VALID_PREDICATES:
|
|
348
|
+
raise FilesystemOperationTaxonomyError(
|
|
349
|
+
f"{block_name}.{call_name}: predicate '{predicate}' is not in "
|
|
350
|
+
f"{sorted(_VALID_PREDICATES)} (ADR-077 §2)."
|
|
351
|
+
)
|
|
352
|
+
|
|
353
|
+
return FsOperationEntry(
|
|
354
|
+
name=call_name,
|
|
355
|
+
op_class=op_class,
|
|
356
|
+
match=match,
|
|
357
|
+
namespace=block_name,
|
|
358
|
+
predicate=predicate,
|
|
359
|
+
)
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
# src/shared/infrastructure/intent/intent_connector.py
|
|
2
|
+
|
|
3
|
+
"""Provides functionality for the intent_connector module."""
|
|
4
|
+
|
|
5
|
+
from __future__ import annotations
|
|
6
|
+
|
|
7
|
+
import fnmatch
|
|
8
|
+
import logging
|
|
9
|
+
from pathlib import Path
|
|
10
|
+
from typing import Any
|
|
11
|
+
|
|
12
|
+
from shared.infrastructure.intent.intent_repository import (
|
|
13
|
+
GovernanceError,
|
|
14
|
+
get_intent_repository,
|
|
15
|
+
)
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
logger = logging.getLogger(__name__)
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
# ID: 106da0b1-1db4-4d4e-9a44-2f71833d72a9
|
|
22
|
+
class IntentConnector:
|
|
23
|
+
"""
|
|
24
|
+
Compatibility wrapper over IntentRepository with Context-Aware filtering.
|
|
25
|
+
Designed to work in both long-running services and standalone scripts.
|
|
26
|
+
"""
|
|
27
|
+
|
|
28
|
+
def __init__(self):
|
|
29
|
+
# Fact: standalone scripts run 'cold'. We must ensure index is built.
|
|
30
|
+
self._ensure_repo_ready()
|
|
31
|
+
|
|
32
|
+
def _ensure_repo_ready(self):
|
|
33
|
+
"""Ensures the underlying repository has scanned the .intent directory."""
|
|
34
|
+
repo = get_intent_repository()
|
|
35
|
+
# If the index is None, it means the repository has not been initialized.
|
|
36
|
+
if getattr(repo, "_rule_index", None) is None:
|
|
37
|
+
try:
|
|
38
|
+
# CORE convention: initialize() triggers discovery of rules
|
|
39
|
+
if hasattr(repo, "initialize"):
|
|
40
|
+
repo.initialize()
|
|
41
|
+
else:
|
|
42
|
+
# Fallback for older versions of repository
|
|
43
|
+
logger.warning(
|
|
44
|
+
"IntentRepository index is None. Ensure .intent folder exists."
|
|
45
|
+
)
|
|
46
|
+
except Exception as e:
|
|
47
|
+
raise GovernanceError(f"Failed to initialize IntentRepository: {e}")
|
|
48
|
+
|
|
49
|
+
# ID: 0caa13c6-1e1c-4a56-a776-1304f9515781
|
|
50
|
+
def get_rule(self, rule_id: str) -> dict[str, Any]:
|
|
51
|
+
"""Retrieves a single rule and enriches it with policy context."""
|
|
52
|
+
self._ensure_repo_ready()
|
|
53
|
+
ref = get_intent_repository().get_rule(rule_id)
|
|
54
|
+
return {
|
|
55
|
+
**ref.content,
|
|
56
|
+
"_policy_id": ref.policy_id,
|
|
57
|
+
"_source": str(ref.source_path),
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
# ID: e25f7d07-b3ba-4233-96c7-96f7541a3931
|
|
61
|
+
def get_policy(self, policy_name: str) -> dict[str, Any]:
|
|
62
|
+
"""Retrieves a full policy file by its canonical path/id."""
|
|
63
|
+
if "/" not in policy_name:
|
|
64
|
+
raise GovernanceError(
|
|
65
|
+
f"Ambiguous policy identifier '{policy_name}'. "
|
|
66
|
+
f"Use canonical policy_id like 'policies/<category>/<name>'."
|
|
67
|
+
)
|
|
68
|
+
return get_intent_repository().load_policy(policy_name)
|
|
69
|
+
|
|
70
|
+
# ID: d5a2b3c4-e5f6-4789-8c1d-6e5f4a3b2c1d
|
|
71
|
+
def get_applicable_rules(self, file_path: Path) -> list[dict[str, Any]]:
|
|
72
|
+
"""
|
|
73
|
+
Retrieve all rules from the Constitution that apply to a specific file.
|
|
74
|
+
Filters based on 'scope' metadata defined in rules or policies.
|
|
75
|
+
"""
|
|
76
|
+
self._ensure_repo_ready()
|
|
77
|
+
repo = get_intent_repository()
|
|
78
|
+
|
|
79
|
+
if repo._rule_index is None:
|
|
80
|
+
return []
|
|
81
|
+
|
|
82
|
+
applicable = []
|
|
83
|
+
target_path = str(file_path).replace("\\", "/")
|
|
84
|
+
|
|
85
|
+
for ref in repo._rule_index.values():
|
|
86
|
+
rule_content = ref.content
|
|
87
|
+
|
|
88
|
+
scope = rule_content.get("scope")
|
|
89
|
+
|
|
90
|
+
if not scope:
|
|
91
|
+
policy = repo.load_policy(ref.policy_id)
|
|
92
|
+
scope = policy.get("scope", {}).get("paths") or policy.get("scope")
|
|
93
|
+
|
|
94
|
+
if not scope or self._path_matches_scope(target_path, scope):
|
|
95
|
+
applicable.append(self.get_rule(ref.rule_id))
|
|
96
|
+
|
|
97
|
+
return applicable
|
|
98
|
+
|
|
99
|
+
# ID: f5a6b1c2-d3e4-4789-8c1d-6e5f4a3b2c1d
|
|
100
|
+
def _path_matches_scope(self, path: str, scope: str | list[str]) -> bool:
|
|
101
|
+
"""Helper to evaluate if a path falls within a constitutional scope."""
|
|
102
|
+
if not scope:
|
|
103
|
+
return True
|
|
104
|
+
|
|
105
|
+
patterns = [scope] if isinstance(scope, str) else scope
|
|
106
|
+
|
|
107
|
+
for pattern in patterns:
|
|
108
|
+
if "**" in pattern:
|
|
109
|
+
prefix = pattern.split("/**")[0]
|
|
110
|
+
if not prefix or path.startswith(prefix):
|
|
111
|
+
return True
|
|
112
|
+
if fnmatch.fnmatch(path, pattern):
|
|
113
|
+
return True
|
|
114
|
+
|
|
115
|
+
return False
|
|
116
|
+
|
|
117
|
+
# ID: 48542cd3-e04e-4983-8072-732b6d10283a
|
|
118
|
+
def list_governance_map(self) -> dict[str, list[str]]:
|
|
119
|
+
"""Returns the structural hierarchy of the Constitution."""
|
|
120
|
+
return get_intent_repository().list_governance_map()
|
|
121
|
+
|
|
122
|
+
# ID: c07fef88-79d0-46da-ac08-40b4a34462c0
|
|
123
|
+
def get_rules_by_policy(self, policy_id: str) -> list[str]:
|
|
124
|
+
"""Lists all rule identifiers belonging to a specific policy."""
|
|
125
|
+
self._ensure_repo_ready()
|
|
126
|
+
repo = get_intent_repository()
|
|
127
|
+
if not repo._rule_index:
|
|
128
|
+
return []
|
|
129
|
+
|
|
130
|
+
rule_ids = [
|
|
131
|
+
rid for rid, ref in repo._rule_index.items() if ref.policy_id == policy_id
|
|
132
|
+
]
|
|
133
|
+
return sorted(rule_ids)
|
|
134
|
+
|
|
135
|
+
# ID: 2c7b8c3a-7b14-4d67-8f07-30f2f4a9d201
|
|
136
|
+
def list_workflows(self) -> list[str]:
|
|
137
|
+
"""List workflow definitions from the constitutional repository."""
|
|
138
|
+
self._ensure_repo_ready()
|
|
139
|
+
return get_intent_repository().list_workflows()
|
|
140
|
+
|
|
141
|
+
# ID: 0d17b52e-0ed3-4d87-a0d1-24bff7f8d202
|
|
142
|
+
def load_workflow(self, workflow_id: str) -> dict[str, Any]:
|
|
143
|
+
"""Load a workflow definition from the constitutional repository."""
|
|
144
|
+
self._ensure_repo_ready()
|
|
145
|
+
return get_intent_repository().load_workflow(workflow_id)
|
|
146
|
+
|
|
147
|
+
# ID: d4f9d4a2-08bb-41d3-92ec-8dba3f18d203
|
|
148
|
+
def list_phases(self) -> list[str]:
|
|
149
|
+
"""List constitutional phase definitions from the constitutional repository."""
|
|
150
|
+
self._ensure_repo_ready()
|
|
151
|
+
return get_intent_repository().list_phases()
|
|
152
|
+
|
|
153
|
+
# ID: e9bb6f9c-3f18-49db-8d40-f58d7d58d204
|
|
154
|
+
def load_phase(self, phase_id: str) -> dict[str, Any]:
|
|
155
|
+
"""Load a constitutional phase definition from the constitutional repository."""
|
|
156
|
+
self._ensure_repo_ready()
|
|
157
|
+
return get_intent_repository().load_phase(phase_id)
|