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,73 @@
|
|
|
1
|
+
# src/body/maintenance/scripts/vector_verify.py
|
|
2
|
+
"""
|
|
3
|
+
Vector verification maintenance script.
|
|
4
|
+
|
|
5
|
+
Constitutional constraints:
|
|
6
|
+
- No direct instantiation of QdrantService. Must be resolved via DI/registry.
|
|
7
|
+
- This script is orchestration logic; it must use existing services.
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from __future__ import annotations
|
|
11
|
+
|
|
12
|
+
from shared.context import CoreContext
|
|
13
|
+
from shared.logger import getLogger
|
|
14
|
+
|
|
15
|
+
logger = getLogger(__name__)
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
# ID: 0d7a1b4f-6d7f-4d5c-a6f6-5f7d2b0a9c2a
|
|
19
|
+
async def run_vector_verify(context: CoreContext) -> dict[str, int]:
|
|
20
|
+
"""
|
|
21
|
+
Verifies vector store consistency via the sanctioned service layer.
|
|
22
|
+
|
|
23
|
+
Returns:
|
|
24
|
+
A small summary dict with counts (kept intentionally stable for CLI consumption).
|
|
25
|
+
"""
|
|
26
|
+
if context is None:
|
|
27
|
+
raise ValueError("CoreContext is required")
|
|
28
|
+
|
|
29
|
+
# Resolve QdrantService via DI
|
|
30
|
+
qdrant_service = getattr(context, "qdrant_service", None)
|
|
31
|
+
if qdrant_service is None:
|
|
32
|
+
registry = getattr(context, "registry", None)
|
|
33
|
+
if registry is None:
|
|
34
|
+
raise RuntimeError(
|
|
35
|
+
"No qdrant_service on context and no registry available to resolve it."
|
|
36
|
+
)
|
|
37
|
+
qdrant_service = await registry.get_qdrant_service()
|
|
38
|
+
context.qdrant_service = qdrant_service
|
|
39
|
+
|
|
40
|
+
# Delegate to service methods only (no direct qdrant_service.client.* usage here)
|
|
41
|
+
# NOTE: Adapt these calls to the actual methods you expose (names below are intentionally generic).
|
|
42
|
+
stats: dict[str, int] = {
|
|
43
|
+
"points_total": 0,
|
|
44
|
+
"points_orphaned": 0,
|
|
45
|
+
"links_total": 0,
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
try:
|
|
49
|
+
# If your QdrantService exposes collection stats:
|
|
50
|
+
if hasattr(qdrant_service, "count_points"):
|
|
51
|
+
stats["points_total"] = int(await qdrant_service.count_points())
|
|
52
|
+
# If your QdrantService exposes orphan detection:
|
|
53
|
+
if hasattr(qdrant_service, "count_orphaned_points"):
|
|
54
|
+
stats["points_orphaned"] = int(await qdrant_service.count_orphaned_points())
|
|
55
|
+
except Exception as e:
|
|
56
|
+
logger.warning("Vector verify: unable to read Qdrant counts: %s", e)
|
|
57
|
+
|
|
58
|
+
# Postgres link stats should be obtained via your existing DB service layer;
|
|
59
|
+
# keep this script minimal and constitutional.
|
|
60
|
+
try:
|
|
61
|
+
kg = getattr(context, "knowledge_service", None)
|
|
62
|
+
if kg and hasattr(kg, "count_vector_links"):
|
|
63
|
+
stats["links_total"] = int(await kg.count_vector_links())
|
|
64
|
+
except Exception as e:
|
|
65
|
+
logger.warning("Vector verify: unable to read DB link counts: %s", e)
|
|
66
|
+
|
|
67
|
+
logger.info(
|
|
68
|
+
"Vector verify summary: points_total=%s, points_orphaned=%s, links_total=%s",
|
|
69
|
+
stats["points_total"],
|
|
70
|
+
stats["points_orphaned"],
|
|
71
|
+
stats["links_total"],
|
|
72
|
+
)
|
|
73
|
+
return stats
|
|
@@ -0,0 +1,338 @@
|
|
|
1
|
+
# src/body/maintenance/sync_vectors.py
|
|
2
|
+
|
|
3
|
+
"""
|
|
4
|
+
Atomic vector synchronization between PostgreSQL and Qdrant.
|
|
5
|
+
|
|
6
|
+
This tool performs a complete bidirectional sync to ensure consistency:
|
|
7
|
+
1. Prune orphaned vectors from Qdrant (vectors without DB links)
|
|
8
|
+
2. Prune dangling links from PostgreSQL (links to missing vectors)
|
|
9
|
+
|
|
10
|
+
These operations MUST happen in this order to avoid race conditions.
|
|
11
|
+
Running them together atomically prevents partial sync states.
|
|
12
|
+
|
|
13
|
+
CONSTITUTIONAL FIX: Uses VectorLinkRepository with proper transaction boundaries.
|
|
14
|
+
Transaction management at controller level, not service level.
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
from __future__ import annotations
|
|
18
|
+
|
|
19
|
+
from collections.abc import Iterable
|
|
20
|
+
|
|
21
|
+
from qdrant_client import AsyncQdrantClient
|
|
22
|
+
from qdrant_client.http.models import PointIdsList
|
|
23
|
+
from sqlalchemy import text
|
|
24
|
+
from sqlalchemy.ext.asyncio import AsyncSession
|
|
25
|
+
|
|
26
|
+
# REFACTORED: Removed direct settings import
|
|
27
|
+
from shared.infrastructure.clients.qdrant_client import QdrantService
|
|
28
|
+
from shared.infrastructure.intent.operational_config import load_operational_config
|
|
29
|
+
from shared.infrastructure.repositories.vector_link_repository import (
|
|
30
|
+
VectorLinkRepository,
|
|
31
|
+
)
|
|
32
|
+
from shared.logger import getLogger
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
logger = getLogger(__name__)
|
|
36
|
+
|
|
37
|
+
_CFG_VEC = load_operational_config().vectors
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
async def _fetch_all_qdrant_ids(
|
|
41
|
+
client: AsyncQdrantClient, collection_name: str
|
|
42
|
+
) -> set[str]:
|
|
43
|
+
"""
|
|
44
|
+
Fetch all point IDs from the configured Qdrant collection.
|
|
45
|
+
|
|
46
|
+
Uses scroll with pagination to handle large collections robustly.
|
|
47
|
+
|
|
48
|
+
Args:
|
|
49
|
+
client: Qdrant async client.
|
|
50
|
+
collection_name: Name of the Qdrant collection to scroll.
|
|
51
|
+
"""
|
|
52
|
+
all_ids: set[str] = set()
|
|
53
|
+
offset: str | None = None
|
|
54
|
+
while True:
|
|
55
|
+
points, offset = await client.scroll(
|
|
56
|
+
collection_name=collection_name,
|
|
57
|
+
limit=_CFG_VEC.scan_limit,
|
|
58
|
+
with_payload=False,
|
|
59
|
+
with_vectors=False,
|
|
60
|
+
offset=offset,
|
|
61
|
+
)
|
|
62
|
+
if not points:
|
|
63
|
+
break
|
|
64
|
+
all_ids.update(str(point.id) for point in points)
|
|
65
|
+
if offset is None:
|
|
66
|
+
break
|
|
67
|
+
return all_ids
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
async def _fetch_db_vector_ids(session: AsyncSession) -> set[str]:
|
|
71
|
+
"""
|
|
72
|
+
Load all valid vector IDs from core.symbol_vector_links.
|
|
73
|
+
|
|
74
|
+
Args:
|
|
75
|
+
session: Injected database session
|
|
76
|
+
|
|
77
|
+
Returns a set of vector_id values cast to text for normalization.
|
|
78
|
+
"""
|
|
79
|
+
result = await session.execute(
|
|
80
|
+
text(
|
|
81
|
+
"SELECT vector_id::text FROM core.symbol_vector_links WHERE vector_id IS NOT NULL"
|
|
82
|
+
)
|
|
83
|
+
)
|
|
84
|
+
return {str(row[0]) for row in result}
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
async def _fetch_db_links(session: AsyncSession) -> list[tuple[str, str]]:
|
|
88
|
+
"""
|
|
89
|
+
Load all (symbol_id, vector_id) pairs from core.symbol_vector_links.
|
|
90
|
+
|
|
91
|
+
Args:
|
|
92
|
+
session: Injected database session
|
|
93
|
+
|
|
94
|
+
Returns list of tuples for deletion operations.
|
|
95
|
+
"""
|
|
96
|
+
result = await session.execute(
|
|
97
|
+
text(
|
|
98
|
+
"""
|
|
99
|
+
SELECT symbol_id::text, vector_id::text
|
|
100
|
+
FROM core.symbol_vector_links
|
|
101
|
+
WHERE vector_id IS NOT NULL
|
|
102
|
+
"""
|
|
103
|
+
)
|
|
104
|
+
)
|
|
105
|
+
return [(row[0], row[1]) for row in result]
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
async def _prune_orphaned_vectors(
|
|
109
|
+
client: AsyncQdrantClient,
|
|
110
|
+
qdrant_ids: set[str],
|
|
111
|
+
db_vector_ids: set[str],
|
|
112
|
+
dry_run: bool,
|
|
113
|
+
collection_name: str,
|
|
114
|
+
) -> int:
|
|
115
|
+
"""
|
|
116
|
+
Find and delete vectors in Qdrant that have no corresponding DB link.
|
|
117
|
+
|
|
118
|
+
Returns the count of orphaned vectors found (and deleted if not dry_run).
|
|
119
|
+
"""
|
|
120
|
+
orphaned_ids = list(qdrant_ids - db_vector_ids)
|
|
121
|
+
if not orphaned_ids:
|
|
122
|
+
logger.info("No orphaned vectors found in Qdrant.")
|
|
123
|
+
return 0
|
|
124
|
+
logger.info("Found %s orphaned vector(s) in Qdrant.", len(orphaned_ids))
|
|
125
|
+
if dry_run:
|
|
126
|
+
preview = _CFG_VEC.report_preview_count
|
|
127
|
+
logger.debug("Would delete from Qdrant")
|
|
128
|
+
for point_id in orphaned_ids[:preview]:
|
|
129
|
+
logger.debug(" - %s", point_id)
|
|
130
|
+
if len(orphaned_ids) > preview:
|
|
131
|
+
logger.debug(" - ... and %s more.", len(orphaned_ids) - preview)
|
|
132
|
+
return len(orphaned_ids)
|
|
133
|
+
logger.info("Deleting %s orphaned vector(s) from Qdrant...", len(orphaned_ids))
|
|
134
|
+
await client.delete(
|
|
135
|
+
collection_name=collection_name,
|
|
136
|
+
points_selector=PointIdsList(points=orphaned_ids),
|
|
137
|
+
)
|
|
138
|
+
logger.info("Deleted %s orphaned vector(s).", len(orphaned_ids))
|
|
139
|
+
return len(orphaned_ids)
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
async def _delete_dangling_links(
|
|
143
|
+
dangling_links: Iterable[tuple[str, str]], session: AsyncSession
|
|
144
|
+
) -> int:
|
|
145
|
+
"""
|
|
146
|
+
Delete dangling links from core.symbol_vector_links.
|
|
147
|
+
|
|
148
|
+
CONSTITUTIONAL FIX: Uses Repository, no commit (caller manages transaction).
|
|
149
|
+
|
|
150
|
+
Args:
|
|
151
|
+
dangling_links: List of (symbol_id, vector_id) tuples
|
|
152
|
+
session: Database session (caller manages transaction boundary)
|
|
153
|
+
|
|
154
|
+
Returns:
|
|
155
|
+
Count of deleted links
|
|
156
|
+
"""
|
|
157
|
+
repo = VectorLinkRepository(session)
|
|
158
|
+
count = await repo.delete_dangling_links(list(dangling_links))
|
|
159
|
+
|
|
160
|
+
# NO COMMIT - caller manages transaction
|
|
161
|
+
return count
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
async def _prune_dangling_links(
|
|
165
|
+
db_links: list[tuple[str, str]],
|
|
166
|
+
qdrant_ids: set[str],
|
|
167
|
+
session: AsyncSession,
|
|
168
|
+
dry_run: bool,
|
|
169
|
+
) -> int:
|
|
170
|
+
"""
|
|
171
|
+
Find and delete DB links pointing to non-existent Qdrant vectors.
|
|
172
|
+
|
|
173
|
+
CONSTITUTIONAL: Transaction boundary managed at this controller level.
|
|
174
|
+
|
|
175
|
+
Args:
|
|
176
|
+
db_links: List of (symbol_id, vector_id) tuples from database
|
|
177
|
+
qdrant_ids: Set of vector IDs currently in Qdrant
|
|
178
|
+
session: Injected database session
|
|
179
|
+
dry_run: If True, only report what would be deleted
|
|
180
|
+
|
|
181
|
+
Returns the count of dangling links found (and deleted if not dry_run).
|
|
182
|
+
"""
|
|
183
|
+
dangling_links = [
|
|
184
|
+
(symbol_id, vector_id)
|
|
185
|
+
for symbol_id, vector_id in db_links
|
|
186
|
+
if vector_id not in qdrant_ids
|
|
187
|
+
]
|
|
188
|
+
if not dangling_links:
|
|
189
|
+
logger.info("No dangling links found in PostgreSQL.")
|
|
190
|
+
return 0
|
|
191
|
+
logger.info("Found %s dangling link(s) in PostgreSQL.", len(dangling_links))
|
|
192
|
+
if dry_run:
|
|
193
|
+
preview = _CFG_VEC.report_preview_count
|
|
194
|
+
logger.debug("Would delete from PostgreSQL")
|
|
195
|
+
for symbol_id, vector_id in dangling_links[:preview]:
|
|
196
|
+
logger.debug(" - symbol_id=%s, vector_id=%s", symbol_id, vector_id)
|
|
197
|
+
if len(dangling_links) > preview:
|
|
198
|
+
logger.debug(" - ... and %s more.", len(dangling_links) - preview)
|
|
199
|
+
return len(dangling_links)
|
|
200
|
+
|
|
201
|
+
logger.info("Deleting %s dangling link(s) from PostgreSQL...", len(dangling_links))
|
|
202
|
+
|
|
203
|
+
# CONTROLLER MANAGES TRANSACTION BOUNDARY
|
|
204
|
+
deleted_count = await _delete_dangling_links(dangling_links, session)
|
|
205
|
+
await session.commit() # Transaction boundary at controller level
|
|
206
|
+
|
|
207
|
+
logger.info("Deleted %s dangling link(s).", deleted_count)
|
|
208
|
+
return deleted_count
|
|
209
|
+
|
|
210
|
+
|
|
211
|
+
async def _async_sync_vectors(
|
|
212
|
+
session: AsyncSession,
|
|
213
|
+
dry_run: bool,
|
|
214
|
+
qdrant_service: QdrantService | None = None,
|
|
215
|
+
qdrant_url: str | None = None,
|
|
216
|
+
collection_name: str | None = None,
|
|
217
|
+
) -> tuple[int, int]:
|
|
218
|
+
"""
|
|
219
|
+
Core async logic for complete vector synchronization.
|
|
220
|
+
|
|
221
|
+
Args:
|
|
222
|
+
session: Injected database session
|
|
223
|
+
dry_run: If True, only report what would be changed
|
|
224
|
+
qdrant_service: Optional injected Qdrant service
|
|
225
|
+
qdrant_url: Qdrant server URL (required when qdrant_service is None)
|
|
226
|
+
collection_name: Qdrant collection name
|
|
227
|
+
|
|
228
|
+
Returns (orphans_pruned, dangling_pruned) counts.
|
|
229
|
+
"""
|
|
230
|
+
if collection_name is None:
|
|
231
|
+
raise ValueError("collection_name is required for vector sync")
|
|
232
|
+
|
|
233
|
+
logger.info("Starting vector synchronization...")
|
|
234
|
+
if dry_run:
|
|
235
|
+
logger.info("DRY RUN MODE: No changes will be made.")
|
|
236
|
+
logger.info("Phase 0: Loading current state...")
|
|
237
|
+
if qdrant_service is None:
|
|
238
|
+
if qdrant_url is None:
|
|
239
|
+
raise ValueError(
|
|
240
|
+
"qdrant_url is required when qdrant_service is not provided"
|
|
241
|
+
)
|
|
242
|
+
client = AsyncQdrantClient(url=qdrant_url)
|
|
243
|
+
else:
|
|
244
|
+
client = qdrant_service.client
|
|
245
|
+
logger.info("Fetching vector IDs from Qdrant...")
|
|
246
|
+
qdrant_ids = await _fetch_all_qdrant_ids(client, collection_name)
|
|
247
|
+
logger.info("Found %s vectors in Qdrant.", len(qdrant_ids))
|
|
248
|
+
logger.info("Fetching vector links from PostgreSQL...")
|
|
249
|
+
db_vector_ids = await _fetch_db_vector_ids(session)
|
|
250
|
+
db_links = await _fetch_db_links(session)
|
|
251
|
+
logger.info("Found %s valid vector IDs in PostgreSQL.", len(db_vector_ids))
|
|
252
|
+
logger.info("Found %s total symbol-vector links.", len(db_links))
|
|
253
|
+
logger.info("Phase 1: Pruning orphaned vectors from Qdrant...")
|
|
254
|
+
orphans_pruned = await _prune_orphaned_vectors(
|
|
255
|
+
client, qdrant_ids, db_vector_ids, dry_run, collection_name
|
|
256
|
+
)
|
|
257
|
+
logger.info("Phase 2: Pruning dangling links from PostgreSQL...")
|
|
258
|
+
dangling_pruned = await _prune_dangling_links(
|
|
259
|
+
db_links, qdrant_ids, session, dry_run
|
|
260
|
+
)
|
|
261
|
+
logger.info("Synchronization Summary")
|
|
262
|
+
logger.info(" • Orphaned vectors pruned: %s", orphans_pruned)
|
|
263
|
+
logger.info(" • Dangling links pruned: %s", dangling_pruned)
|
|
264
|
+
if orphans_pruned == 0 and dangling_pruned == 0:
|
|
265
|
+
logger.info("Vector store is perfectly synchronized!")
|
|
266
|
+
elif dry_run:
|
|
267
|
+
logger.info("Issues found. Run with --write to fix them.")
|
|
268
|
+
else:
|
|
269
|
+
logger.info("Synchronization complete!")
|
|
270
|
+
return (orphans_pruned, dangling_pruned)
|
|
271
|
+
|
|
272
|
+
|
|
273
|
+
# ID: 2ba0085c-70d8-4a2f-b3f5-a41479fba562
|
|
274
|
+
async def main_sync(
|
|
275
|
+
session: AsyncSession,
|
|
276
|
+
write: bool = False,
|
|
277
|
+
dry_run: bool = False,
|
|
278
|
+
qdrant_url: str | None = None,
|
|
279
|
+
collection_name: str | None = None,
|
|
280
|
+
) -> None:
|
|
281
|
+
"""
|
|
282
|
+
Synchronize vector database between PostgreSQL and Qdrant.
|
|
283
|
+
|
|
284
|
+
This performs atomic bidirectional synchronization:
|
|
285
|
+
1. Removes orphaned vectors from Qdrant (no DB link)
|
|
286
|
+
2. Removes dangling links from PostgreSQL (no Qdrant vector)
|
|
287
|
+
|
|
288
|
+
Args:
|
|
289
|
+
session: Injected database session
|
|
290
|
+
write: If True, apply changes (default: False)
|
|
291
|
+
dry_run: If True, only report what would change (default: False)
|
|
292
|
+
qdrant_url: Qdrant server URL
|
|
293
|
+
collection_name: Qdrant collection name
|
|
294
|
+
|
|
295
|
+
Example:
|
|
296
|
+
poetry run core-admin fix vector-sync --dry-run
|
|
297
|
+
poetry run core-admin fix vector-sync --write
|
|
298
|
+
"""
|
|
299
|
+
effective_dry_run = dry_run or not write
|
|
300
|
+
await _async_sync_vectors(
|
|
301
|
+
session,
|
|
302
|
+
dry_run=effective_dry_run,
|
|
303
|
+
qdrant_url=qdrant_url,
|
|
304
|
+
collection_name=collection_name,
|
|
305
|
+
)
|
|
306
|
+
|
|
307
|
+
|
|
308
|
+
# ID: 45b243cb-5331-464d-a50d-13a1310e672a
|
|
309
|
+
async def main_async(
|
|
310
|
+
session: AsyncSession,
|
|
311
|
+
write: bool = False,
|
|
312
|
+
dry_run: bool = False,
|
|
313
|
+
qdrant_service: QdrantService | None = None,
|
|
314
|
+
qdrant_url: str | None = None,
|
|
315
|
+
collection_name: str | None = None,
|
|
316
|
+
) -> tuple[int, int]:
|
|
317
|
+
"""
|
|
318
|
+
Async entry point for orchestrators that own the event loop.
|
|
319
|
+
Accepts optional qdrant_service for JIT injection.
|
|
320
|
+
|
|
321
|
+
Args:
|
|
322
|
+
session: Injected database session
|
|
323
|
+
write: If True, apply changes (default: False)
|
|
324
|
+
dry_run: If True, only report what would change (default: False)
|
|
325
|
+
qdrant_service: Optional injected Qdrant service
|
|
326
|
+
qdrant_url: Qdrant server URL (used when qdrant_service is None)
|
|
327
|
+
collection_name: Qdrant collection name
|
|
328
|
+
|
|
329
|
+
Returns (orphans_pruned, dangling_pruned) counts.
|
|
330
|
+
"""
|
|
331
|
+
effective_dry_run = dry_run or not write
|
|
332
|
+
return await _async_sync_vectors(
|
|
333
|
+
session,
|
|
334
|
+
dry_run=effective_dry_run,
|
|
335
|
+
qdrant_service=qdrant_service,
|
|
336
|
+
qdrant_url=qdrant_url,
|
|
337
|
+
collection_name=collection_name,
|
|
338
|
+
)
|
body/models/__init__.py
ADDED
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
# src/body/project_lifecycle/bootstrap_service.py
|
|
2
|
+
|
|
3
|
+
"""
|
|
4
|
+
Provides CLI commands for bootstrapping the project with initial setup tasks,
|
|
5
|
+
such as creating a default set of GitHub issues for a new repository.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
import shutil
|
|
11
|
+
import subprocess
|
|
12
|
+
|
|
13
|
+
from shared.exceptions import CoreError
|
|
14
|
+
from shared.logger import getLogger
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
logger = getLogger(__name__)
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
# ID: e8db5a13-a0a3-4581-afe2-354656ed8c4b
|
|
21
|
+
class BootstrapError(CoreError):
|
|
22
|
+
"""Raised when project bootstrap fails."""
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
ISSUES_TO_CREATE = [
|
|
26
|
+
{
|
|
27
|
+
"title": "Add JSON logging & request IDs",
|
|
28
|
+
"body": (
|
|
29
|
+
"**Goal**: Switch logger to support LOG_FORMAT=json and add request-id "
|
|
30
|
+
"middleware in FastAPI.\n\n"
|
|
31
|
+
"**Acceptance**\n"
|
|
32
|
+
"- LOG_FORMAT=json writes structured logs\n"
|
|
33
|
+
"- x-request-id is set and propagated\n"
|
|
34
|
+
"- Documentation updated in docs/CONVENTIONS.md"
|
|
35
|
+
),
|
|
36
|
+
"labels": "roadmap,organizational,ci",
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
"title": "Pre-commit hooks (Black, Ruff)",
|
|
40
|
+
"body": (
|
|
41
|
+
"**Goal**: Add .pre-commit-config.yaml and wire it into Make.\n\n"
|
|
42
|
+
"**Acceptance**\n"
|
|
43
|
+
"- pre-commit runs Black and Ruff locally\n"
|
|
44
|
+
"- CI remains green"
|
|
45
|
+
),
|
|
46
|
+
"labels": "roadmap,organizational,ci",
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
"title": "Docs: CONVENTIONS.md & DEPENDENCIES.md",
|
|
50
|
+
"body": (
|
|
51
|
+
"**Goal**: Codify folder structure, import rules, capability tags, "
|
|
52
|
+
"and dependency policy.\n\n"
|
|
53
|
+
"**Acceptance**\n"
|
|
54
|
+
"- New contributors can place files without guidance\n"
|
|
55
|
+
"- Import discipline matrix documented"
|
|
56
|
+
),
|
|
57
|
+
"labels": "roadmap,organizational,docs",
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
"title": "Governance: proposal schema & lifecycle validation",
|
|
61
|
+
"body": (
|
|
62
|
+
"**Goal**: Define and validate the proposal lifecycle for "
|
|
63
|
+
"`work/proposals/`.\n\n"
|
|
64
|
+
"**Acceptance**\n"
|
|
65
|
+
"- Proposals are treated as operational artefacts (not constitutional files)\n"
|
|
66
|
+
"- Auditor ignores `work/` for schema enforcement\n"
|
|
67
|
+
"- Proposal approval flow is exercised end-to-end\n"
|
|
68
|
+
"- At least one example proposal exists under work/proposals/"
|
|
69
|
+
),
|
|
70
|
+
"labels": "roadmap,organizational,audit",
|
|
71
|
+
},
|
|
72
|
+
]
|
|
73
|
+
|
|
74
|
+
LABELS_TO_ENSURE = [
|
|
75
|
+
{"name": "roadmap", "color": "0366d6", "desc": "Roadmap item"},
|
|
76
|
+
{"name": "organizational", "color": "a2eeef", "desc": "Project organization"},
|
|
77
|
+
{"name": "ci", "color": "7057ff", "desc": "CI/CD"},
|
|
78
|
+
{"name": "audit", "color": "d73a4a", "desc": "Governance & audit"},
|
|
79
|
+
{"name": "docs", "color": "0e8a16", "desc": "Documentation"},
|
|
80
|
+
]
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
def _run_gh_command(command: list[str], ignore_errors: bool = False):
|
|
84
|
+
"""Helper to run a 'gh' command and handle errors."""
|
|
85
|
+
if not shutil.which("gh"):
|
|
86
|
+
logger.error("'gh' (GitHub CLI) not found in PATH.")
|
|
87
|
+
logger.info("Install GitHub CLI to use bootstrap features.")
|
|
88
|
+
raise BootstrapError("'gh' (GitHub CLI) not found in PATH.", exit_code=1)
|
|
89
|
+
|
|
90
|
+
try:
|
|
91
|
+
subprocess.run(command, check=True, capture_output=True, text=True)
|
|
92
|
+
except subprocess.CalledProcessError as e:
|
|
93
|
+
if not ignore_errors:
|
|
94
|
+
logger.error("Error running gh command: %s", e.stderr)
|
|
95
|
+
raise BootstrapError("Error running gh command.", exit_code=1) from e
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
# ID: 17f7cac0-4134-4885-93fb-0d432c634ed1
|
|
99
|
+
def bootstrap_issues(repo: str | None = None) -> None:
|
|
100
|
+
"""Create a standard set of starter issues for the project on GitHub."""
|
|
101
|
+
logger.info("Bootstrapping standard GitHub issues...")
|
|
102
|
+
logger.info("Ensuring required labels exist...")
|
|
103
|
+
|
|
104
|
+
for label in LABELS_TO_ENSURE:
|
|
105
|
+
cmd = [
|
|
106
|
+
"gh",
|
|
107
|
+
"label",
|
|
108
|
+
"create",
|
|
109
|
+
label["name"],
|
|
110
|
+
"--color",
|
|
111
|
+
label["color"],
|
|
112
|
+
"--description",
|
|
113
|
+
label["desc"],
|
|
114
|
+
]
|
|
115
|
+
if repo:
|
|
116
|
+
cmd.extend(["--repo", repo])
|
|
117
|
+
_run_gh_command(cmd, ignore_errors=True)
|
|
118
|
+
|
|
119
|
+
logger.info("Creating %s starter issues...", len(ISSUES_TO_CREATE))
|
|
120
|
+
|
|
121
|
+
for issue in ISSUES_TO_CREATE:
|
|
122
|
+
cmd = [
|
|
123
|
+
"gh",
|
|
124
|
+
"issue",
|
|
125
|
+
"create",
|
|
126
|
+
"--title",
|
|
127
|
+
issue["title"],
|
|
128
|
+
"--body",
|
|
129
|
+
issue["body"],
|
|
130
|
+
"--label",
|
|
131
|
+
issue["labels"],
|
|
132
|
+
]
|
|
133
|
+
if repo:
|
|
134
|
+
cmd.extend(["--repo", repo])
|
|
135
|
+
_run_gh_command(cmd)
|
|
136
|
+
|
|
137
|
+
logger.info("Successfully created starter issues on GitHub.")
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
if __name__ == "__main__":
|
|
141
|
+
import argparse
|
|
142
|
+
|
|
143
|
+
parser = argparse.ArgumentParser(
|
|
144
|
+
description="Bootstrap starter GitHub issues and labels."
|
|
145
|
+
)
|
|
146
|
+
parser.add_argument(
|
|
147
|
+
"--repo",
|
|
148
|
+
help="GitHub repository in 'owner/repo' format.",
|
|
149
|
+
default=None,
|
|
150
|
+
)
|
|
151
|
+
|
|
152
|
+
args = parser.parse_args()
|
|
153
|
+
|
|
154
|
+
try:
|
|
155
|
+
bootstrap_issues(repo=args.repo)
|
|
156
|
+
except BootstrapError as exc:
|
|
157
|
+
raise SystemExit(exc.exit_code) from exc
|