tapps-agents 3.5.41__py3-none-any.whl → 3.6.0__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.
- tapps_agents/__init__.py +2 -2
- tapps_agents/agents/__init__.py +22 -22
- tapps_agents/agents/analyst/__init__.py +5 -5
- tapps_agents/agents/architect/__init__.py +5 -5
- tapps_agents/agents/architect/agent.py +1033 -1033
- tapps_agents/agents/architect/pattern_detector.py +75 -75
- tapps_agents/agents/cleanup/__init__.py +7 -7
- tapps_agents/agents/cleanup/agent.py +445 -445
- tapps_agents/agents/debugger/__init__.py +7 -7
- tapps_agents/agents/debugger/agent.py +310 -310
- tapps_agents/agents/debugger/error_analyzer.py +437 -437
- tapps_agents/agents/designer/__init__.py +5 -5
- tapps_agents/agents/designer/agent.py +786 -786
- tapps_agents/agents/designer/visual_designer.py +638 -638
- tapps_agents/agents/documenter/__init__.py +7 -7
- tapps_agents/agents/documenter/agent.py +531 -531
- tapps_agents/agents/documenter/doc_generator.py +472 -472
- tapps_agents/agents/documenter/doc_validator.py +393 -393
- tapps_agents/agents/documenter/framework_doc_updater.py +493 -493
- tapps_agents/agents/enhancer/__init__.py +7 -7
- tapps_agents/agents/evaluator/__init__.py +7 -7
- tapps_agents/agents/evaluator/agent.py +443 -443
- tapps_agents/agents/evaluator/priority_evaluator.py +641 -641
- tapps_agents/agents/evaluator/quality_analyzer.py +147 -147
- tapps_agents/agents/evaluator/report_generator.py +344 -344
- tapps_agents/agents/evaluator/usage_analyzer.py +192 -192
- tapps_agents/agents/evaluator/workflow_analyzer.py +189 -189
- tapps_agents/agents/implementer/__init__.py +7 -7
- tapps_agents/agents/implementer/agent.py +798 -798
- tapps_agents/agents/implementer/auto_fix.py +1119 -1119
- tapps_agents/agents/implementer/code_generator.py +73 -73
- tapps_agents/agents/improver/__init__.py +1 -1
- tapps_agents/agents/improver/agent.py +753 -753
- tapps_agents/agents/ops/__init__.py +1 -1
- tapps_agents/agents/ops/agent.py +619 -619
- tapps_agents/agents/ops/dependency_analyzer.py +600 -600
- tapps_agents/agents/orchestrator/__init__.py +5 -5
- tapps_agents/agents/orchestrator/agent.py +522 -522
- tapps_agents/agents/planner/__init__.py +7 -7
- tapps_agents/agents/planner/agent.py +1127 -1127
- tapps_agents/agents/reviewer/__init__.py +24 -24
- tapps_agents/agents/reviewer/agent.py +3513 -3513
- tapps_agents/agents/reviewer/aggregator.py +213 -213
- tapps_agents/agents/reviewer/batch_review.py +448 -448
- tapps_agents/agents/reviewer/cache.py +443 -443
- tapps_agents/agents/reviewer/context7_enhancer.py +630 -630
- tapps_agents/agents/reviewer/context_detector.py +203 -203
- tapps_agents/agents/reviewer/docker_compose_validator.py +158 -158
- tapps_agents/agents/reviewer/dockerfile_validator.py +176 -176
- tapps_agents/agents/reviewer/error_handling.py +126 -126
- tapps_agents/agents/reviewer/feedback_generator.py +490 -490
- tapps_agents/agents/reviewer/influxdb_validator.py +316 -316
- tapps_agents/agents/reviewer/issue_tracking.py +169 -169
- tapps_agents/agents/reviewer/library_detector.py +295 -295
- tapps_agents/agents/reviewer/library_patterns.py +268 -268
- tapps_agents/agents/reviewer/maintainability_scorer.py +593 -593
- tapps_agents/agents/reviewer/metric_strategies.py +276 -276
- tapps_agents/agents/reviewer/mqtt_validator.py +160 -160
- tapps_agents/agents/reviewer/output_enhancer.py +105 -105
- tapps_agents/agents/reviewer/pattern_detector.py +241 -241
- tapps_agents/agents/reviewer/performance_scorer.py +357 -357
- tapps_agents/agents/reviewer/phased_review.py +516 -516
- tapps_agents/agents/reviewer/progressive_review.py +435 -435
- tapps_agents/agents/reviewer/react_scorer.py +331 -331
- tapps_agents/agents/reviewer/score_constants.py +228 -228
- tapps_agents/agents/reviewer/score_validator.py +507 -507
- tapps_agents/agents/reviewer/scorer_registry.py +373 -373
- tapps_agents/agents/reviewer/scoring.py +1566 -1566
- tapps_agents/agents/reviewer/service_discovery.py +534 -534
- tapps_agents/agents/reviewer/tools/__init__.py +41 -41
- tapps_agents/agents/reviewer/tools/parallel_executor.py +581 -581
- tapps_agents/agents/reviewer/tools/ruff_grouping.py +250 -250
- tapps_agents/agents/reviewer/tools/scoped_mypy.py +284 -284
- tapps_agents/agents/reviewer/typescript_scorer.py +1142 -1142
- tapps_agents/agents/reviewer/validation.py +208 -208
- tapps_agents/agents/reviewer/websocket_validator.py +132 -132
- tapps_agents/agents/tester/__init__.py +7 -7
- tapps_agents/agents/tester/accessibility_auditor.py +309 -309
- tapps_agents/agents/tester/agent.py +1080 -1080
- tapps_agents/agents/tester/batch_generator.py +54 -54
- tapps_agents/agents/tester/context_learner.py +51 -51
- tapps_agents/agents/tester/coverage_analyzer.py +386 -386
- tapps_agents/agents/tester/coverage_test_generator.py +290 -290
- tapps_agents/agents/tester/debug_enhancer.py +238 -238
- tapps_agents/agents/tester/device_emulator.py +241 -241
- tapps_agents/agents/tester/integration_generator.py +62 -62
- tapps_agents/agents/tester/network_recorder.py +300 -300
- tapps_agents/agents/tester/performance_monitor.py +320 -320
- tapps_agents/agents/tester/test_fixer.py +316 -316
- tapps_agents/agents/tester/test_generator.py +632 -632
- tapps_agents/agents/tester/trace_manager.py +234 -234
- tapps_agents/agents/tester/visual_regression.py +291 -291
- tapps_agents/analysis/pattern_detector.py +36 -36
- tapps_agents/beads/hydration.py +213 -213
- tapps_agents/beads/parse.py +32 -32
- tapps_agents/beads/specs.py +206 -206
- tapps_agents/cli/__init__.py +9 -9
- tapps_agents/cli/__main__.py +8 -8
- tapps_agents/cli/base.py +478 -478
- tapps_agents/cli/command_classifier.py +72 -72
- tapps_agents/cli/commands/__init__.py +2 -2
- tapps_agents/cli/commands/analyst.py +173 -173
- tapps_agents/cli/commands/architect.py +109 -109
- tapps_agents/cli/commands/cleanup_agent.py +92 -92
- tapps_agents/cli/commands/common.py +126 -126
- tapps_agents/cli/commands/debugger.py +90 -90
- tapps_agents/cli/commands/designer.py +112 -112
- tapps_agents/cli/commands/documenter.py +136 -136
- tapps_agents/cli/commands/enhancer.py +110 -110
- tapps_agents/cli/commands/evaluator.py +255 -255
- tapps_agents/cli/commands/health.py +665 -665
- tapps_agents/cli/commands/implementer.py +301 -301
- tapps_agents/cli/commands/improver.py +91 -91
- tapps_agents/cli/commands/knowledge.py +111 -111
- tapps_agents/cli/commands/learning.py +172 -172
- tapps_agents/cli/commands/observability.py +283 -283
- tapps_agents/cli/commands/ops.py +135 -135
- tapps_agents/cli/commands/orchestrator.py +116 -116
- tapps_agents/cli/commands/planner.py +237 -237
- tapps_agents/cli/commands/reviewer.py +1872 -1872
- tapps_agents/cli/commands/status.py +285 -285
- tapps_agents/cli/commands/task.py +227 -227
- tapps_agents/cli/commands/tester.py +191 -191
- tapps_agents/cli/commands/top_level.py +3586 -3586
- tapps_agents/cli/feedback.py +936 -936
- tapps_agents/cli/formatters.py +608 -608
- tapps_agents/cli/help/__init__.py +7 -7
- tapps_agents/cli/help/static_help.py +425 -425
- tapps_agents/cli/network_detection.py +110 -110
- tapps_agents/cli/output_compactor.py +274 -274
- tapps_agents/cli/parsers/__init__.py +2 -2
- tapps_agents/cli/parsers/analyst.py +186 -186
- tapps_agents/cli/parsers/architect.py +167 -167
- tapps_agents/cli/parsers/cleanup_agent.py +228 -228
- tapps_agents/cli/parsers/debugger.py +116 -116
- tapps_agents/cli/parsers/designer.py +182 -182
- tapps_agents/cli/parsers/documenter.py +134 -134
- tapps_agents/cli/parsers/enhancer.py +113 -113
- tapps_agents/cli/parsers/evaluator.py +213 -213
- tapps_agents/cli/parsers/implementer.py +168 -168
- tapps_agents/cli/parsers/improver.py +132 -132
- tapps_agents/cli/parsers/ops.py +159 -159
- tapps_agents/cli/parsers/orchestrator.py +98 -98
- tapps_agents/cli/parsers/planner.py +145 -145
- tapps_agents/cli/parsers/reviewer.py +462 -462
- tapps_agents/cli/parsers/tester.py +124 -124
- tapps_agents/cli/progress_heartbeat.py +254 -254
- tapps_agents/cli/streaming_progress.py +336 -336
- tapps_agents/cli/utils/__init__.py +6 -6
- tapps_agents/cli/utils/agent_lifecycle.py +48 -48
- tapps_agents/cli/utils/error_formatter.py +82 -82
- tapps_agents/cli/utils/error_recovery.py +188 -188
- tapps_agents/cli/utils/output_handler.py +59 -59
- tapps_agents/cli/utils/prompt_enhancer.py +319 -319
- tapps_agents/cli/validators/__init__.py +9 -9
- tapps_agents/cli/validators/command_validator.py +81 -81
- tapps_agents/context7/__init__.py +112 -112
- tapps_agents/context7/agent_integration.py +869 -869
- tapps_agents/context7/analytics.py +382 -382
- tapps_agents/context7/analytics_dashboard.py +299 -299
- tapps_agents/context7/async_cache.py +681 -681
- tapps_agents/context7/backup_client.py +958 -958
- tapps_agents/context7/cache_locking.py +194 -194
- tapps_agents/context7/cache_metadata.py +214 -214
- tapps_agents/context7/cache_prewarm.py +488 -488
- tapps_agents/context7/cache_structure.py +168 -168
- tapps_agents/context7/cache_warming.py +604 -604
- tapps_agents/context7/circuit_breaker.py +376 -376
- tapps_agents/context7/cleanup.py +461 -461
- tapps_agents/context7/commands.py +858 -858
- tapps_agents/context7/credential_validation.py +276 -276
- tapps_agents/context7/cross_reference_resolver.py +168 -168
- tapps_agents/context7/cross_references.py +424 -424
- tapps_agents/context7/doc_manager.py +225 -225
- tapps_agents/context7/fuzzy_matcher.py +369 -369
- tapps_agents/context7/kb_cache.py +404 -404
- tapps_agents/context7/language_detector.py +219 -219
- tapps_agents/context7/library_detector.py +725 -725
- tapps_agents/context7/lookup.py +738 -738
- tapps_agents/context7/metadata.py +258 -258
- tapps_agents/context7/refresh_queue.py +300 -300
- tapps_agents/context7/security.py +373 -373
- tapps_agents/context7/staleness_policies.py +278 -278
- tapps_agents/context7/tiles_integration.py +47 -47
- tapps_agents/continuous_bug_fix/__init__.py +20 -20
- tapps_agents/continuous_bug_fix/bug_finder.py +306 -306
- tapps_agents/continuous_bug_fix/bug_fix_coordinator.py +177 -177
- tapps_agents/continuous_bug_fix/commit_manager.py +178 -178
- tapps_agents/continuous_bug_fix/continuous_bug_fixer.py +322 -322
- tapps_agents/continuous_bug_fix/proactive_bug_finder.py +285 -285
- tapps_agents/core/__init__.py +298 -298
- tapps_agents/core/adaptive_cache_config.py +432 -432
- tapps_agents/core/agent_base.py +647 -647
- tapps_agents/core/agent_cache.py +466 -466
- tapps_agents/core/agent_learning.py +1865 -1865
- tapps_agents/core/analytics_dashboard.py +563 -563
- tapps_agents/core/analytics_enhancements.py +597 -597
- tapps_agents/core/anonymization.py +274 -274
- tapps_agents/core/artifact_context_builder.py +293 -0
- tapps_agents/core/ast_parser.py +228 -228
- tapps_agents/core/async_file_ops.py +402 -402
- tapps_agents/core/best_practice_consultant.py +299 -299
- tapps_agents/core/brownfield_analyzer.py +299 -299
- tapps_agents/core/brownfield_review.py +541 -541
- tapps_agents/core/browser_controller.py +513 -513
- tapps_agents/core/capability_registry.py +418 -418
- tapps_agents/core/change_impact_analyzer.py +190 -190
- tapps_agents/core/checkpoint_manager.py +377 -377
- tapps_agents/core/code_generator.py +329 -329
- tapps_agents/core/code_validator.py +276 -276
- tapps_agents/core/command_registry.py +327 -327
- tapps_agents/core/config.py +33 -0
- tapps_agents/core/context_gathering/__init__.py +2 -2
- tapps_agents/core/context_gathering/repository_explorer.py +28 -28
- tapps_agents/core/context_intelligence/__init__.py +2 -2
- tapps_agents/core/context_intelligence/relevance_scorer.py +24 -24
- tapps_agents/core/context_intelligence/token_budget_manager.py +27 -27
- tapps_agents/core/context_manager.py +240 -240
- tapps_agents/core/cursor_feedback_monitor.py +146 -146
- tapps_agents/core/cursor_verification.py +290 -290
- tapps_agents/core/customization_loader.py +280 -280
- tapps_agents/core/customization_schema.py +260 -260
- tapps_agents/core/customization_template.py +238 -238
- tapps_agents/core/debug_logger.py +124 -124
- tapps_agents/core/design_validator.py +298 -298
- tapps_agents/core/diagram_generator.py +226 -226
- tapps_agents/core/docker_utils.py +232 -232
- tapps_agents/core/document_generator.py +617 -617
- tapps_agents/core/domain_detector.py +30 -30
- tapps_agents/core/error_envelope.py +454 -454
- tapps_agents/core/error_handler.py +270 -270
- tapps_agents/core/estimation_tracker.py +189 -189
- tapps_agents/core/eval_prompt_engine.py +116 -116
- tapps_agents/core/evaluation_base.py +119 -119
- tapps_agents/core/evaluation_models.py +320 -320
- tapps_agents/core/evaluation_orchestrator.py +225 -225
- tapps_agents/core/evaluators/__init__.py +7 -7
- tapps_agents/core/evaluators/architectural_evaluator.py +205 -205
- tapps_agents/core/evaluators/behavioral_evaluator.py +160 -160
- tapps_agents/core/evaluators/performance_profile_evaluator.py +160 -160
- tapps_agents/core/evaluators/security_posture_evaluator.py +148 -148
- tapps_agents/core/evaluators/spec_compliance_evaluator.py +181 -181
- tapps_agents/core/exceptions.py +107 -107
- tapps_agents/core/expert_config_generator.py +293 -293
- tapps_agents/core/export_schema.py +202 -202
- tapps_agents/core/external_feedback_models.py +102 -102
- tapps_agents/core/external_feedback_storage.py +213 -213
- tapps_agents/core/fallback_strategy.py +314 -314
- tapps_agents/core/feedback_analyzer.py +162 -162
- tapps_agents/core/feedback_collector.py +178 -178
- tapps_agents/core/git_operations.py +445 -445
- tapps_agents/core/hardware_profiler.py +151 -151
- tapps_agents/core/instructions.py +324 -324
- tapps_agents/core/io_guardrails.py +69 -69
- tapps_agents/core/issue_manifest.py +249 -249
- tapps_agents/core/issue_schema.py +139 -139
- tapps_agents/core/json_utils.py +128 -128
- tapps_agents/core/knowledge_graph.py +446 -446
- tapps_agents/core/language_detector.py +296 -296
- tapps_agents/core/learning_confidence.py +242 -242
- tapps_agents/core/learning_dashboard.py +246 -246
- tapps_agents/core/learning_decision.py +384 -384
- tapps_agents/core/learning_explainability.py +578 -578
- tapps_agents/core/learning_export.py +287 -287
- tapps_agents/core/learning_integration.py +228 -228
- tapps_agents/core/llm_behavior.py +232 -232
- tapps_agents/core/long_duration_support.py +786 -786
- tapps_agents/core/mcp_setup.py +106 -106
- tapps_agents/core/memory_integration.py +396 -396
- tapps_agents/core/meta_learning.py +666 -666
- tapps_agents/core/module_path_sanitizer.py +199 -199
- tapps_agents/core/multi_agent_orchestrator.py +382 -382
- tapps_agents/core/network_errors.py +125 -125
- tapps_agents/core/nfr_validator.py +336 -336
- tapps_agents/core/offline_mode.py +158 -158
- tapps_agents/core/output_contracts.py +300 -300
- tapps_agents/core/output_formatter.py +300 -300
- tapps_agents/core/path_normalizer.py +174 -174
- tapps_agents/core/path_validator.py +322 -322
- tapps_agents/core/pattern_library.py +250 -250
- tapps_agents/core/performance_benchmark.py +301 -301
- tapps_agents/core/performance_monitor.py +184 -184
- tapps_agents/core/playwright_mcp_controller.py +771 -771
- tapps_agents/core/policy_loader.py +135 -135
- tapps_agents/core/progress.py +166 -166
- tapps_agents/core/project_profile.py +354 -354
- tapps_agents/core/project_type_detector.py +454 -454
- tapps_agents/core/prompt_base.py +223 -223
- tapps_agents/core/prompt_learning/__init__.py +2 -2
- tapps_agents/core/prompt_learning/learning_loop.py +24 -24
- tapps_agents/core/prompt_learning/project_prompt_store.py +25 -25
- tapps_agents/core/prompt_learning/skills_prompt_analyzer.py +35 -35
- tapps_agents/core/prompt_optimization/__init__.py +6 -6
- tapps_agents/core/prompt_optimization/ab_tester.py +114 -114
- tapps_agents/core/prompt_optimization/correlation_analyzer.py +160 -160
- tapps_agents/core/prompt_optimization/progressive_refiner.py +129 -129
- tapps_agents/core/prompt_optimization/prompt_library.py +37 -37
- tapps_agents/core/requirements_evaluator.py +431 -431
- tapps_agents/core/resource_aware_executor.py +449 -449
- tapps_agents/core/resource_monitor.py +343 -343
- tapps_agents/core/resume_handler.py +298 -298
- tapps_agents/core/retry_handler.py +197 -197
- tapps_agents/core/review_checklists.py +479 -479
- tapps_agents/core/role_loader.py +201 -201
- tapps_agents/core/role_template_loader.py +201 -201
- tapps_agents/core/runtime_mode.py +60 -60
- tapps_agents/core/security_scanner.py +342 -342
- tapps_agents/core/skill_agent_registry.py +194 -194
- tapps_agents/core/skill_integration.py +208 -208
- tapps_agents/core/skill_loader.py +492 -492
- tapps_agents/core/skill_template.py +341 -341
- tapps_agents/core/skill_validator.py +478 -478
- tapps_agents/core/stack_analyzer.py +35 -35
- tapps_agents/core/startup.py +174 -174
- tapps_agents/core/storage_manager.py +397 -397
- tapps_agents/core/storage_models.py +166 -166
- tapps_agents/core/story_evaluator.py +410 -410
- tapps_agents/core/subprocess_utils.py +170 -170
- tapps_agents/core/task_duration.py +296 -296
- tapps_agents/core/task_memory.py +582 -582
- tapps_agents/core/task_state.py +226 -226
- tapps_agents/core/tech_stack_priorities.py +208 -208
- tapps_agents/core/temp_directory.py +194 -194
- tapps_agents/core/template_merger.py +600 -600
- tapps_agents/core/template_selector.py +280 -280
- tapps_agents/core/test_generator.py +286 -286
- tapps_agents/core/tiered_context.py +253 -253
- tapps_agents/core/token_monitor.py +345 -345
- tapps_agents/core/traceability.py +254 -254
- tapps_agents/core/trajectory_tracker.py +50 -50
- tapps_agents/core/unicode_safe.py +143 -143
- tapps_agents/core/unified_cache_config.py +170 -170
- tapps_agents/core/unified_state.py +324 -324
- tapps_agents/core/validate_cursor_setup.py +237 -237
- tapps_agents/core/validation_registry.py +136 -136
- tapps_agents/core/validators/__init__.py +4 -4
- tapps_agents/core/validators/python_validator.py +87 -87
- tapps_agents/core/verification_agent.py +90 -90
- tapps_agents/core/visual_feedback.py +644 -644
- tapps_agents/core/workflow_validator.py +197 -197
- tapps_agents/core/worktree.py +367 -367
- tapps_agents/docker/__init__.py +10 -10
- tapps_agents/docker/analyzer.py +186 -186
- tapps_agents/docker/debugger.py +229 -229
- tapps_agents/docker/error_patterns.py +216 -216
- tapps_agents/epic/__init__.py +22 -22
- tapps_agents/epic/beads_sync.py +115 -115
- tapps_agents/epic/markdown_sync.py +105 -105
- tapps_agents/epic/models.py +96 -96
- tapps_agents/experts/__init__.py +163 -163
- tapps_agents/experts/agent_integration.py +243 -243
- tapps_agents/experts/auto_generator.py +331 -331
- tapps_agents/experts/base_expert.py +536 -536
- tapps_agents/experts/builtin_registry.py +261 -261
- tapps_agents/experts/business_metrics.py +565 -565
- tapps_agents/experts/cache.py +266 -266
- tapps_agents/experts/confidence_breakdown.py +306 -306
- tapps_agents/experts/confidence_calculator.py +336 -336
- tapps_agents/experts/confidence_metrics.py +236 -236
- tapps_agents/experts/domain_config.py +311 -311
- tapps_agents/experts/domain_detector.py +550 -550
- tapps_agents/experts/domain_utils.py +84 -84
- tapps_agents/experts/expert_config.py +113 -113
- tapps_agents/experts/expert_engine.py +465 -465
- tapps_agents/experts/expert_registry.py +744 -744
- tapps_agents/experts/expert_synthesizer.py +70 -70
- tapps_agents/experts/governance.py +197 -197
- tapps_agents/experts/history_logger.py +312 -312
- tapps_agents/experts/knowledge/README.md +180 -180
- tapps_agents/experts/knowledge/accessibility/accessible-forms.md +331 -331
- tapps_agents/experts/knowledge/accessibility/aria-patterns.md +344 -344
- tapps_agents/experts/knowledge/accessibility/color-contrast.md +285 -285
- tapps_agents/experts/knowledge/accessibility/keyboard-navigation.md +332 -332
- tapps_agents/experts/knowledge/accessibility/screen-readers.md +282 -282
- tapps_agents/experts/knowledge/accessibility/semantic-html.md +355 -355
- tapps_agents/experts/knowledge/accessibility/testing-accessibility.md +369 -369
- tapps_agents/experts/knowledge/accessibility/wcag-2.1.md +296 -296
- tapps_agents/experts/knowledge/accessibility/wcag-2.2.md +211 -211
- tapps_agents/experts/knowledge/agent-learning/best-practices.md +715 -715
- tapps_agents/experts/knowledge/agent-learning/pattern-extraction.md +282 -282
- tapps_agents/experts/knowledge/agent-learning/prompt-optimization.md +320 -320
- tapps_agents/experts/knowledge/ai-frameworks/model-optimization.md +90 -90
- tapps_agents/experts/knowledge/ai-frameworks/openvino-patterns.md +260 -260
- tapps_agents/experts/knowledge/api-design-integration/api-gateway-patterns.md +309 -309
- tapps_agents/experts/knowledge/api-design-integration/api-security-patterns.md +521 -521
- tapps_agents/experts/knowledge/api-design-integration/api-versioning.md +421 -421
- tapps_agents/experts/knowledge/api-design-integration/async-protocol-patterns.md +61 -61
- tapps_agents/experts/knowledge/api-design-integration/contract-testing.md +221 -221
- tapps_agents/experts/knowledge/api-design-integration/external-api-integration.md +489 -489
- tapps_agents/experts/knowledge/api-design-integration/fastapi-patterns.md +360 -360
- tapps_agents/experts/knowledge/api-design-integration/fastapi-testing.md +262 -262
- tapps_agents/experts/knowledge/api-design-integration/graphql-patterns.md +582 -582
- tapps_agents/experts/knowledge/api-design-integration/grpc-best-practices.md +499 -499
- tapps_agents/experts/knowledge/api-design-integration/mqtt-patterns.md +455 -455
- tapps_agents/experts/knowledge/api-design-integration/rate-limiting.md +507 -507
- tapps_agents/experts/knowledge/api-design-integration/restful-api-design.md +618 -618
- tapps_agents/experts/knowledge/api-design-integration/websocket-patterns.md +480 -480
- tapps_agents/experts/knowledge/cloud-infrastructure/cloud-native-patterns.md +175 -175
- tapps_agents/experts/knowledge/cloud-infrastructure/container-health-checks.md +261 -261
- tapps_agents/experts/knowledge/cloud-infrastructure/containerization.md +222 -222
- tapps_agents/experts/knowledge/cloud-infrastructure/cost-optimization.md +122 -122
- tapps_agents/experts/knowledge/cloud-infrastructure/disaster-recovery.md +153 -153
- tapps_agents/experts/knowledge/cloud-infrastructure/dockerfile-patterns.md +285 -285
- tapps_agents/experts/knowledge/cloud-infrastructure/infrastructure-as-code.md +187 -187
- tapps_agents/experts/knowledge/cloud-infrastructure/kubernetes-patterns.md +253 -253
- tapps_agents/experts/knowledge/cloud-infrastructure/multi-cloud-strategies.md +155 -155
- tapps_agents/experts/knowledge/cloud-infrastructure/serverless-architecture.md +200 -200
- tapps_agents/experts/knowledge/code-quality-analysis/README.md +16 -16
- tapps_agents/experts/knowledge/code-quality-analysis/code-metrics.md +137 -137
- tapps_agents/experts/knowledge/code-quality-analysis/complexity-analysis.md +181 -181
- tapps_agents/experts/knowledge/code-quality-analysis/technical-debt-patterns.md +191 -191
- tapps_agents/experts/knowledge/data-privacy-compliance/anonymization.md +313 -313
- tapps_agents/experts/knowledge/data-privacy-compliance/ccpa.md +255 -255
- tapps_agents/experts/knowledge/data-privacy-compliance/consent-management.md +282 -282
- tapps_agents/experts/knowledge/data-privacy-compliance/data-minimization.md +275 -275
- tapps_agents/experts/knowledge/data-privacy-compliance/data-retention.md +297 -297
- tapps_agents/experts/knowledge/data-privacy-compliance/data-subject-rights.md +383 -383
- tapps_agents/experts/knowledge/data-privacy-compliance/encryption-privacy.md +285 -285
- tapps_agents/experts/knowledge/data-privacy-compliance/gdpr.md +344 -344
- tapps_agents/experts/knowledge/data-privacy-compliance/hipaa.md +385 -385
- tapps_agents/experts/knowledge/data-privacy-compliance/privacy-by-design.md +280 -280
- tapps_agents/experts/knowledge/database-data-management/acid-vs-cap.md +164 -164
- tapps_agents/experts/knowledge/database-data-management/backup-and-recovery.md +182 -182
- tapps_agents/experts/knowledge/database-data-management/data-modeling.md +172 -172
- tapps_agents/experts/knowledge/database-data-management/database-design.md +187 -187
- tapps_agents/experts/knowledge/database-data-management/flux-query-optimization.md +342 -342
- tapps_agents/experts/knowledge/database-data-management/influxdb-connection-patterns.md +432 -432
- tapps_agents/experts/knowledge/database-data-management/influxdb-patterns.md +442 -442
- tapps_agents/experts/knowledge/database-data-management/migration-strategies.md +216 -216
- tapps_agents/experts/knowledge/database-data-management/nosql-patterns.md +259 -259
- tapps_agents/experts/knowledge/database-data-management/scalability-patterns.md +184 -184
- tapps_agents/experts/knowledge/database-data-management/sql-optimization.md +175 -175
- tapps_agents/experts/knowledge/database-data-management/time-series-modeling.md +444 -444
- tapps_agents/experts/knowledge/development-workflow/README.md +16 -16
- tapps_agents/experts/knowledge/development-workflow/automation-best-practices.md +216 -216
- tapps_agents/experts/knowledge/development-workflow/build-strategies.md +198 -198
- tapps_agents/experts/knowledge/development-workflow/deployment-patterns.md +205 -205
- tapps_agents/experts/knowledge/development-workflow/git-workflows.md +205 -205
- tapps_agents/experts/knowledge/documentation-knowledge-management/README.md +16 -16
- tapps_agents/experts/knowledge/documentation-knowledge-management/api-documentation-patterns.md +231 -231
- tapps_agents/experts/knowledge/documentation-knowledge-management/documentation-standards.md +191 -191
- tapps_agents/experts/knowledge/documentation-knowledge-management/knowledge-management.md +171 -171
- tapps_agents/experts/knowledge/documentation-knowledge-management/technical-writing-guide.md +192 -192
- tapps_agents/experts/knowledge/observability-monitoring/alerting-patterns.md +461 -461
- tapps_agents/experts/knowledge/observability-monitoring/apm-tools.md +459 -459
- tapps_agents/experts/knowledge/observability-monitoring/distributed-tracing.md +367 -367
- tapps_agents/experts/knowledge/observability-monitoring/logging-strategies.md +478 -478
- tapps_agents/experts/knowledge/observability-monitoring/metrics-and-monitoring.md +510 -510
- tapps_agents/experts/knowledge/observability-monitoring/observability-best-practices.md +492 -492
- tapps_agents/experts/knowledge/observability-monitoring/open-telemetry.md +573 -573
- tapps_agents/experts/knowledge/observability-monitoring/slo-sli-sla.md +419 -419
- tapps_agents/experts/knowledge/performance/anti-patterns.md +284 -284
- tapps_agents/experts/knowledge/performance/api-performance.md +256 -256
- tapps_agents/experts/knowledge/performance/caching.md +327 -327
- tapps_agents/experts/knowledge/performance/database-performance.md +252 -252
- tapps_agents/experts/knowledge/performance/optimization-patterns.md +327 -327
- tapps_agents/experts/knowledge/performance/profiling.md +297 -297
- tapps_agents/experts/knowledge/performance/resource-management.md +293 -293
- tapps_agents/experts/knowledge/performance/scalability.md +306 -306
- tapps_agents/experts/knowledge/security/owasp-top10.md +209 -209
- tapps_agents/experts/knowledge/security/secure-coding-practices.md +207 -207
- tapps_agents/experts/knowledge/security/threat-modeling.md +220 -220
- tapps_agents/experts/knowledge/security/vulnerability-patterns.md +342 -342
- tapps_agents/experts/knowledge/software-architecture/docker-compose-patterns.md +314 -314
- tapps_agents/experts/knowledge/software-architecture/microservices-patterns.md +379 -379
- tapps_agents/experts/knowledge/software-architecture/service-communication.md +316 -316
- tapps_agents/experts/knowledge/testing/best-practices.md +310 -310
- tapps_agents/experts/knowledge/testing/coverage-analysis.md +293 -293
- tapps_agents/experts/knowledge/testing/mocking.md +256 -256
- tapps_agents/experts/knowledge/testing/test-automation.md +276 -276
- tapps_agents/experts/knowledge/testing/test-data.md +271 -271
- tapps_agents/experts/knowledge/testing/test-design-patterns.md +280 -280
- tapps_agents/experts/knowledge/testing/test-maintenance.md +236 -236
- tapps_agents/experts/knowledge/testing/test-strategies.md +311 -311
- tapps_agents/experts/knowledge/user-experience/information-architecture.md +325 -325
- tapps_agents/experts/knowledge/user-experience/interaction-design.md +363 -363
- tapps_agents/experts/knowledge/user-experience/prototyping.md +293 -293
- tapps_agents/experts/knowledge/user-experience/usability-heuristics.md +337 -337
- tapps_agents/experts/knowledge/user-experience/usability-testing.md +311 -311
- tapps_agents/experts/knowledge/user-experience/user-journeys.md +296 -296
- tapps_agents/experts/knowledge/user-experience/user-research.md +373 -373
- tapps_agents/experts/knowledge/user-experience/ux-principles.md +340 -340
- tapps_agents/experts/knowledge_freshness.py +321 -321
- tapps_agents/experts/knowledge_ingestion.py +438 -438
- tapps_agents/experts/knowledge_need_detector.py +93 -93
- tapps_agents/experts/knowledge_validator.py +382 -382
- tapps_agents/experts/observability.py +440 -440
- tapps_agents/experts/passive_notifier.py +238 -238
- tapps_agents/experts/proactive_orchestrator.py +32 -32
- tapps_agents/experts/rag_chunker.py +205 -205
- tapps_agents/experts/rag_embedder.py +152 -152
- tapps_agents/experts/rag_evaluation.py +299 -299
- tapps_agents/experts/rag_index.py +303 -303
- tapps_agents/experts/rag_metrics.py +293 -293
- tapps_agents/experts/rag_safety.py +263 -263
- tapps_agents/experts/report_generator.py +296 -296
- tapps_agents/experts/setup_wizard.py +441 -441
- tapps_agents/experts/simple_rag.py +431 -431
- tapps_agents/experts/vector_rag.py +354 -354
- tapps_agents/experts/weight_distributor.py +304 -304
- tapps_agents/health/__init__.py +24 -24
- tapps_agents/health/base.py +75 -75
- tapps_agents/health/checks/__init__.py +22 -22
- tapps_agents/health/checks/automation.py +127 -127
- tapps_agents/health/checks/context7_cache.py +210 -210
- tapps_agents/health/checks/environment.py +116 -116
- tapps_agents/health/checks/execution.py +170 -170
- tapps_agents/health/checks/knowledge_base.py +187 -187
- tapps_agents/health/checks/outcomes.py +324 -324
- tapps_agents/health/collector.py +280 -280
- tapps_agents/health/dashboard.py +137 -137
- tapps_agents/health/metrics.py +151 -151
- tapps_agents/health/orchestrator.py +271 -271
- tapps_agents/health/registry.py +166 -166
- tapps_agents/hooks/__init__.py +33 -33
- tapps_agents/hooks/config.py +140 -140
- tapps_agents/hooks/events.py +135 -135
- tapps_agents/hooks/executor.py +128 -128
- tapps_agents/hooks/manager.py +143 -143
- tapps_agents/integration/__init__.py +8 -8
- tapps_agents/integration/service_integrator.py +121 -121
- tapps_agents/integrations/__init__.py +10 -10
- tapps_agents/integrations/clawdbot.py +525 -525
- tapps_agents/integrations/memory_bridge.py +356 -356
- tapps_agents/mcp/__init__.py +18 -18
- tapps_agents/mcp/gateway.py +112 -112
- tapps_agents/mcp/servers/__init__.py +13 -13
- tapps_agents/mcp/servers/analysis.py +204 -204
- tapps_agents/mcp/servers/context7.py +198 -198
- tapps_agents/mcp/servers/filesystem.py +218 -218
- tapps_agents/mcp/servers/git.py +201 -201
- tapps_agents/mcp/tool_registry.py +115 -115
- tapps_agents/quality/__init__.py +54 -54
- tapps_agents/quality/coverage_analyzer.py +379 -379
- tapps_agents/quality/enforcement.py +82 -82
- tapps_agents/quality/gates/__init__.py +37 -37
- tapps_agents/quality/gates/approval_gate.py +255 -255
- tapps_agents/quality/gates/base.py +84 -84
- tapps_agents/quality/gates/exceptions.py +43 -43
- tapps_agents/quality/gates/policy_gate.py +195 -195
- tapps_agents/quality/gates/registry.py +239 -239
- tapps_agents/quality/gates/security_gate.py +156 -156
- tapps_agents/quality/quality_gates.py +369 -369
- tapps_agents/quality/secret_scanner.py +335 -335
- tapps_agents/session/__init__.py +19 -19
- tapps_agents/session/manager.py +256 -256
- tapps_agents/simple_mode/__init__.py +66 -66
- tapps_agents/simple_mode/agent_contracts.py +357 -357
- tapps_agents/simple_mode/beads_hooks.py +151 -151
- tapps_agents/simple_mode/code_snippet_handler.py +382 -382
- tapps_agents/simple_mode/documentation_manager.py +395 -395
- tapps_agents/simple_mode/documentation_reader.py +187 -187
- tapps_agents/simple_mode/file_inference.py +292 -292
- tapps_agents/simple_mode/framework_change_detector.py +268 -268
- tapps_agents/simple_mode/intent_parser.py +510 -510
- tapps_agents/simple_mode/learning_progression.py +358 -358
- tapps_agents/simple_mode/nl_handler.py +700 -700
- tapps_agents/simple_mode/onboarding.py +253 -253
- tapps_agents/simple_mode/orchestrators/__init__.py +38 -38
- tapps_agents/simple_mode/orchestrators/base.py +185 -185
- tapps_agents/simple_mode/orchestrators/breakdown_orchestrator.py +49 -49
- tapps_agents/simple_mode/orchestrators/brownfield_orchestrator.py +135 -135
- tapps_agents/simple_mode/orchestrators/build_orchestrator.py +2700 -2667
- tapps_agents/simple_mode/orchestrators/deliverable_checklist.py +349 -349
- tapps_agents/simple_mode/orchestrators/enhance_orchestrator.py +53 -53
- tapps_agents/simple_mode/orchestrators/epic_orchestrator.py +122 -122
- tapps_agents/simple_mode/orchestrators/explore_orchestrator.py +184 -184
- tapps_agents/simple_mode/orchestrators/fix_orchestrator.py +723 -723
- tapps_agents/simple_mode/orchestrators/plan_analysis_orchestrator.py +206 -206
- tapps_agents/simple_mode/orchestrators/pr_orchestrator.py +237 -237
- tapps_agents/simple_mode/orchestrators/refactor_orchestrator.py +222 -222
- tapps_agents/simple_mode/orchestrators/requirements_tracer.py +262 -262
- tapps_agents/simple_mode/orchestrators/resume_orchestrator.py +210 -210
- tapps_agents/simple_mode/orchestrators/review_orchestrator.py +161 -161
- tapps_agents/simple_mode/orchestrators/test_orchestrator.py +82 -82
- tapps_agents/simple_mode/output_aggregator.py +340 -340
- tapps_agents/simple_mode/result_formatters.py +598 -598
- tapps_agents/simple_mode/step_dependencies.py +382 -382
- tapps_agents/simple_mode/step_results.py +276 -276
- tapps_agents/simple_mode/streaming.py +388 -388
- tapps_agents/simple_mode/variations.py +129 -129
- tapps_agents/simple_mode/visual_feedback.py +238 -238
- tapps_agents/simple_mode/zero_config.py +274 -274
- tapps_agents/suggestions/__init__.py +8 -8
- tapps_agents/suggestions/inline_suggester.py +52 -52
- tapps_agents/templates/__init__.py +8 -8
- tapps_agents/templates/microservice_generator.py +274 -274
- tapps_agents/utils/env_validator.py +291 -291
- tapps_agents/workflow/__init__.py +171 -171
- tapps_agents/workflow/acceptance_verifier.py +132 -132
- tapps_agents/workflow/agent_handlers/__init__.py +41 -41
- tapps_agents/workflow/agent_handlers/analyst_handler.py +75 -75
- tapps_agents/workflow/agent_handlers/architect_handler.py +107 -107
- tapps_agents/workflow/agent_handlers/base.py +84 -84
- tapps_agents/workflow/agent_handlers/debugger_handler.py +100 -100
- tapps_agents/workflow/agent_handlers/designer_handler.py +110 -110
- tapps_agents/workflow/agent_handlers/documenter_handler.py +94 -94
- tapps_agents/workflow/agent_handlers/implementer_handler.py +235 -235
- tapps_agents/workflow/agent_handlers/ops_handler.py +62 -62
- tapps_agents/workflow/agent_handlers/orchestrator_handler.py +43 -43
- tapps_agents/workflow/agent_handlers/planner_handler.py +98 -98
- tapps_agents/workflow/agent_handlers/registry.py +119 -119
- tapps_agents/workflow/agent_handlers/reviewer_handler.py +119 -119
- tapps_agents/workflow/agent_handlers/tester_handler.py +69 -69
- tapps_agents/workflow/analytics_accessor.py +337 -337
- tapps_agents/workflow/analytics_alerts.py +416 -416
- tapps_agents/workflow/analytics_dashboard_cursor.py +281 -281
- tapps_agents/workflow/analytics_dual_write.py +103 -103
- tapps_agents/workflow/analytics_integration.py +119 -119
- tapps_agents/workflow/analytics_query_parser.py +278 -278
- tapps_agents/workflow/analytics_visualizer.py +259 -259
- tapps_agents/workflow/artifact_helper.py +204 -204
- tapps_agents/workflow/audit_logger.py +263 -263
- tapps_agents/workflow/auto_execution_config.py +340 -340
- tapps_agents/workflow/auto_progression.py +586 -586
- tapps_agents/workflow/branch_cleanup.py +349 -349
- tapps_agents/workflow/checkpoint.py +256 -256
- tapps_agents/workflow/checkpoint_manager.py +178 -178
- tapps_agents/workflow/code_artifact.py +179 -179
- tapps_agents/workflow/common_enums.py +96 -96
- tapps_agents/workflow/confirmation_handler.py +130 -130
- tapps_agents/workflow/context_analyzer.py +222 -222
- tapps_agents/workflow/context_artifact.py +230 -230
- tapps_agents/workflow/cursor_chat.py +94 -94
- tapps_agents/workflow/cursor_executor.py +2337 -2337
- tapps_agents/workflow/cursor_skill_helper.py +516 -516
- tapps_agents/workflow/dependency_resolver.py +244 -244
- tapps_agents/workflow/design_artifact.py +156 -156
- tapps_agents/workflow/detector.py +751 -751
- tapps_agents/workflow/direct_execution_fallback.py +301 -301
- tapps_agents/workflow/docs_artifact.py +168 -168
- tapps_agents/workflow/enforcer.py +389 -389
- tapps_agents/workflow/enhancement_artifact.py +142 -142
- tapps_agents/workflow/error_recovery.py +806 -806
- tapps_agents/workflow/event_bus.py +183 -183
- tapps_agents/workflow/event_log.py +612 -612
- tapps_agents/workflow/events.py +63 -63
- tapps_agents/workflow/exceptions.py +43 -43
- tapps_agents/workflow/execution_graph.py +498 -498
- tapps_agents/workflow/execution_plan.py +126 -126
- tapps_agents/workflow/file_utils.py +186 -186
- tapps_agents/workflow/gate_evaluator.py +182 -182
- tapps_agents/workflow/gate_integration.py +200 -200
- tapps_agents/workflow/graph_visualizer.py +130 -130
- tapps_agents/workflow/health_checker.py +206 -206
- tapps_agents/workflow/logging_helper.py +243 -243
- tapps_agents/workflow/manifest.py +582 -582
- tapps_agents/workflow/marker_writer.py +250 -250
- tapps_agents/workflow/message_formatter.py +188 -188
- tapps_agents/workflow/messaging.py +325 -325
- tapps_agents/workflow/metadata_models.py +91 -91
- tapps_agents/workflow/metrics_integration.py +226 -226
- tapps_agents/workflow/migration_utils.py +116 -116
- tapps_agents/workflow/models.py +148 -148
- tapps_agents/workflow/nlp_config.py +198 -198
- tapps_agents/workflow/nlp_error_handler.py +207 -207
- tapps_agents/workflow/nlp_executor.py +163 -163
- tapps_agents/workflow/nlp_parser.py +528 -528
- tapps_agents/workflow/observability_dashboard.py +451 -451
- tapps_agents/workflow/observer.py +170 -170
- tapps_agents/workflow/ops_artifact.py +257 -257
- tapps_agents/workflow/output_passing.py +214 -214
- tapps_agents/workflow/parallel_executor.py +463 -463
- tapps_agents/workflow/planning_artifact.py +179 -179
- tapps_agents/workflow/preset_loader.py +285 -285
- tapps_agents/workflow/preset_recommender.py +270 -270
- tapps_agents/workflow/progress_logger.py +145 -145
- tapps_agents/workflow/progress_manager.py +303 -303
- tapps_agents/workflow/progress_monitor.py +186 -186
- tapps_agents/workflow/progress_updates.py +423 -423
- tapps_agents/workflow/quality_artifact.py +158 -158
- tapps_agents/workflow/quality_loopback.py +101 -101
- tapps_agents/workflow/recommender.py +387 -387
- tapps_agents/workflow/remediation_loop.py +166 -166
- tapps_agents/workflow/result_aggregator.py +300 -300
- tapps_agents/workflow/review_artifact.py +185 -185
- tapps_agents/workflow/schema_validator.py +522 -522
- tapps_agents/workflow/session_handoff.py +178 -178
- tapps_agents/workflow/skill_invoker.py +648 -648
- tapps_agents/workflow/state_manager.py +756 -756
- tapps_agents/workflow/state_persistence_config.py +331 -331
- tapps_agents/workflow/status_monitor.py +449 -449
- tapps_agents/workflow/step_checkpoint.py +314 -314
- tapps_agents/workflow/step_details.py +201 -201
- tapps_agents/workflow/story_models.py +147 -147
- tapps_agents/workflow/streaming.py +416 -416
- tapps_agents/workflow/suggestion_engine.py +552 -552
- tapps_agents/workflow/testing_artifact.py +186 -186
- tapps_agents/workflow/timeline.py +158 -158
- tapps_agents/workflow/token_integration.py +209 -209
- tapps_agents/workflow/validation.py +217 -217
- tapps_agents/workflow/visual_feedback.py +391 -391
- tapps_agents/workflow/workflow_chain.py +95 -95
- tapps_agents/workflow/workflow_summary.py +219 -219
- tapps_agents/workflow/worktree_manager.py +724 -724
- {tapps_agents-3.5.41.dist-info → tapps_agents-3.6.0.dist-info}/METADATA +672 -672
- tapps_agents-3.6.0.dist-info/RECORD +758 -0
- {tapps_agents-3.5.41.dist-info → tapps_agents-3.6.0.dist-info}/licenses/LICENSE +22 -22
- tapps_agents/health/checks/outcomes.backup_20260204_064058.py +0 -324
- tapps_agents/health/checks/outcomes.backup_20260204_064256.py +0 -324
- tapps_agents/health/checks/outcomes.backup_20260204_064600.py +0 -324
- tapps_agents-3.5.41.dist-info/RECORD +0 -760
- {tapps_agents-3.5.41.dist-info → tapps_agents-3.6.0.dist-info}/WHEEL +0 -0
- {tapps_agents-3.5.41.dist-info → tapps_agents-3.6.0.dist-info}/entry_points.txt +0 -0
- {tapps_agents-3.5.41.dist-info → tapps_agents-3.6.0.dist-info}/top_level.txt +0 -0
|
@@ -1,340 +1,340 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Auto-Execution Configuration Management.
|
|
3
|
-
|
|
4
|
-
Provides configuration management, feature flags, validation, migration,
|
|
5
|
-
and runtime reload for Background Agent auto-execution.
|
|
6
|
-
"""
|
|
7
|
-
|
|
8
|
-
from __future__ import annotations
|
|
9
|
-
|
|
10
|
-
import logging
|
|
11
|
-
from dataclasses import dataclass, field
|
|
12
|
-
from pathlib import Path
|
|
13
|
-
from typing import Any
|
|
14
|
-
|
|
15
|
-
import yaml
|
|
16
|
-
|
|
17
|
-
logger = logging.getLogger(__name__)
|
|
18
|
-
|
|
19
|
-
# Configuration version for migration tracking
|
|
20
|
-
CONFIG_VERSION = "1.0"
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
@dataclass
|
|
24
|
-
class RetryConfig:
|
|
25
|
-
"""Retry configuration for auto-execution."""
|
|
26
|
-
|
|
27
|
-
enabled: bool = True
|
|
28
|
-
max_attempts: int = 3
|
|
29
|
-
backoff_multiplier: float = 2.0
|
|
30
|
-
initial_delay_seconds: float = 1.0
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
@dataclass
|
|
34
|
-
class PollingConfig:
|
|
35
|
-
"""Polling configuration for auto-execution."""
|
|
36
|
-
|
|
37
|
-
enabled: bool = True
|
|
38
|
-
interval_seconds: float = 5.0
|
|
39
|
-
timeout_seconds: float = 3600.0
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
@dataclass
|
|
43
|
-
class FeatureFlags:
|
|
44
|
-
"""Feature flags for auto-execution features."""
|
|
45
|
-
|
|
46
|
-
artifact_detection: bool = True
|
|
47
|
-
status_tracking: bool = True
|
|
48
|
-
error_handling: bool = True
|
|
49
|
-
metrics_collection: bool = True
|
|
50
|
-
audit_logging: bool = True
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
@dataclass
|
|
54
|
-
class AutoExecutionConfig:
|
|
55
|
-
"""Configuration for Background Agent auto-execution."""
|
|
56
|
-
|
|
57
|
-
enabled: bool = False
|
|
58
|
-
retry: RetryConfig = field(default_factory=RetryConfig)
|
|
59
|
-
polling: PollingConfig = field(default_factory=PollingConfig)
|
|
60
|
-
features: FeatureFlags = field(default_factory=FeatureFlags)
|
|
61
|
-
version: str = CONFIG_VERSION
|
|
62
|
-
|
|
63
|
-
def to_dict(self) -> dict[str, Any]:
|
|
64
|
-
"""Convert to dictionary for serialization."""
|
|
65
|
-
return {
|
|
66
|
-
"enabled": self.enabled,
|
|
67
|
-
"retry": {
|
|
68
|
-
"enabled": self.retry.enabled,
|
|
69
|
-
"max_attempts": self.retry.max_attempts,
|
|
70
|
-
"backoff_multiplier": self.retry.backoff_multiplier,
|
|
71
|
-
"initial_delay_seconds": self.retry.initial_delay_seconds,
|
|
72
|
-
},
|
|
73
|
-
"polling": {
|
|
74
|
-
"enabled": self.polling.enabled,
|
|
75
|
-
"interval_seconds": self.polling.interval_seconds,
|
|
76
|
-
"timeout_seconds": self.polling.timeout_seconds,
|
|
77
|
-
},
|
|
78
|
-
"features": {
|
|
79
|
-
"artifact_detection": self.features.artifact_detection,
|
|
80
|
-
"status_tracking": self.features.status_tracking,
|
|
81
|
-
"error_handling": self.features.error_handling,
|
|
82
|
-
"metrics_collection": self.features.metrics_collection,
|
|
83
|
-
"audit_logging": self.features.audit_logging,
|
|
84
|
-
},
|
|
85
|
-
"version": self.version,
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
@classmethod
|
|
89
|
-
def from_dict(cls, data: dict[str, Any]) -> AutoExecutionConfig:
|
|
90
|
-
"""Create from dictionary."""
|
|
91
|
-
retry_data = data.get("retry", {})
|
|
92
|
-
polling_data = data.get("polling", {})
|
|
93
|
-
features_data = data.get("features", {})
|
|
94
|
-
|
|
95
|
-
return cls(
|
|
96
|
-
enabled=data.get("enabled", False),
|
|
97
|
-
retry=RetryConfig(
|
|
98
|
-
enabled=retry_data.get("enabled", True),
|
|
99
|
-
max_attempts=retry_data.get("max_attempts", 3),
|
|
100
|
-
backoff_multiplier=retry_data.get("backoff_multiplier", 2.0),
|
|
101
|
-
initial_delay_seconds=retry_data.get("initial_delay_seconds", 1.0),
|
|
102
|
-
),
|
|
103
|
-
polling=PollingConfig(
|
|
104
|
-
enabled=polling_data.get("enabled", True),
|
|
105
|
-
interval_seconds=polling_data.get("interval_seconds", 5.0),
|
|
106
|
-
timeout_seconds=polling_data.get("timeout_seconds", 3600.0),
|
|
107
|
-
),
|
|
108
|
-
features=FeatureFlags(
|
|
109
|
-
artifact_detection=features_data.get("artifact_detection", True),
|
|
110
|
-
status_tracking=features_data.get("status_tracking", True),
|
|
111
|
-
error_handling=features_data.get("error_handling", True),
|
|
112
|
-
metrics_collection=features_data.get("metrics_collection", True),
|
|
113
|
-
audit_logging=features_data.get("audit_logging", True),
|
|
114
|
-
),
|
|
115
|
-
version=data.get("version", CONFIG_VERSION),
|
|
116
|
-
)
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
class AutoExecutionConfigManager:
|
|
120
|
-
"""Manages auto-execution configuration with validation, migration, and reload."""
|
|
121
|
-
|
|
122
|
-
def __init__(self, config_path: Path | None = None, project_root: Path | None = None):
|
|
123
|
-
"""
|
|
124
|
-
Initialize configuration manager.
|
|
125
|
-
|
|
126
|
-
Args:
|
|
127
|
-
config_path: Path to configuration file (defaults to .tapps-agents/config.yaml)
|
|
128
|
-
project_root: Project root directory (defaults to current directory)
|
|
129
|
-
"""
|
|
130
|
-
self.project_root = project_root or Path.cwd()
|
|
131
|
-
self.config_dir = self.project_root / ".tapps-agents"
|
|
132
|
-
self.config_path = config_path or (self.config_dir / "auto_execution_config.yaml")
|
|
133
|
-
|
|
134
|
-
# Cache for configuration
|
|
135
|
-
self._config: AutoExecutionConfig | None = None
|
|
136
|
-
self._config_file_mtime: float | None = None
|
|
137
|
-
|
|
138
|
-
def load(self, validate: bool = True) -> AutoExecutionConfig:
|
|
139
|
-
"""
|
|
140
|
-
Load configuration from file.
|
|
141
|
-
|
|
142
|
-
Args:
|
|
143
|
-
validate: If True, validate configuration after loading
|
|
144
|
-
|
|
145
|
-
Returns:
|
|
146
|
-
AutoExecutionConfig instance
|
|
147
|
-
|
|
148
|
-
Raises:
|
|
149
|
-
ValueError: If configuration is invalid
|
|
150
|
-
"""
|
|
151
|
-
# Check if config file exists
|
|
152
|
-
if not self.config_path.exists():
|
|
153
|
-
logger.info(f"Configuration file not found at {self.config_path}, using defaults")
|
|
154
|
-
self._config = AutoExecutionConfig()
|
|
155
|
-
return self._config
|
|
156
|
-
|
|
157
|
-
# Check if file has changed (for reload detection)
|
|
158
|
-
current_mtime = self.config_path.stat().st_mtime
|
|
159
|
-
if (
|
|
160
|
-
self._config is not None
|
|
161
|
-
and self._config_file_mtime == current_mtime
|
|
162
|
-
):
|
|
163
|
-
return self._config
|
|
164
|
-
|
|
165
|
-
# Load configuration
|
|
166
|
-
try:
|
|
167
|
-
with open(self.config_path, encoding="utf-8") as f:
|
|
168
|
-
data = yaml.safe_load(f) or {}
|
|
169
|
-
|
|
170
|
-
# Extract auto_execution section
|
|
171
|
-
auto_exec_data = data.get("auto_execution", {})
|
|
172
|
-
|
|
173
|
-
# Check version and migrate if needed
|
|
174
|
-
version = auto_exec_data.get("version", "0.0")
|
|
175
|
-
if version != CONFIG_VERSION:
|
|
176
|
-
logger.info(f"Migrating configuration from version {version} to {CONFIG_VERSION}")
|
|
177
|
-
auto_exec_data = self._migrate_config(auto_exec_data, version)
|
|
178
|
-
|
|
179
|
-
# Create config from data
|
|
180
|
-
self._config = AutoExecutionConfig.from_dict(auto_exec_data)
|
|
181
|
-
self._config_file_mtime = current_mtime
|
|
182
|
-
|
|
183
|
-
# Validate if requested
|
|
184
|
-
if validate:
|
|
185
|
-
self.validate(self._config)
|
|
186
|
-
|
|
187
|
-
logger.info(f"Loaded auto-execution configuration from {self.config_path}")
|
|
188
|
-
return self._config
|
|
189
|
-
|
|
190
|
-
except Exception as e:
|
|
191
|
-
logger.error(f"Failed to load configuration: {e}")
|
|
192
|
-
# Return defaults on error
|
|
193
|
-
self._config = AutoExecutionConfig()
|
|
194
|
-
return self._config
|
|
195
|
-
|
|
196
|
-
def save(self, config: AutoExecutionConfig | None = None) -> None:
|
|
197
|
-
"""
|
|
198
|
-
Save configuration to file.
|
|
199
|
-
|
|
200
|
-
Args:
|
|
201
|
-
config: Configuration to save (uses cached config if None)
|
|
202
|
-
"""
|
|
203
|
-
config = config or self._config or AutoExecutionConfig()
|
|
204
|
-
|
|
205
|
-
# Ensure config directory exists
|
|
206
|
-
self.config_dir.mkdir(parents=True, exist_ok=True)
|
|
207
|
-
|
|
208
|
-
# Load existing config to preserve other sections
|
|
209
|
-
existing_data: dict[str, Any] = {}
|
|
210
|
-
if self.config_path.exists():
|
|
211
|
-
try:
|
|
212
|
-
with open(self.config_path, encoding="utf-8") as f:
|
|
213
|
-
existing_data = yaml.safe_load(f) or {}
|
|
214
|
-
except Exception:
|
|
215
|
-
pass
|
|
216
|
-
|
|
217
|
-
# Update auto_execution section
|
|
218
|
-
existing_data["auto_execution"] = config.to_dict()
|
|
219
|
-
|
|
220
|
-
# Save to file
|
|
221
|
-
with open(self.config_path, "w", encoding="utf-8") as f:
|
|
222
|
-
yaml.dump(existing_data, f, default_flow_style=False, sort_keys=False)
|
|
223
|
-
|
|
224
|
-
# Update cache
|
|
225
|
-
self._config = config
|
|
226
|
-
if self.config_path.exists():
|
|
227
|
-
self._config_file_mtime = self.config_path.stat().st_mtime
|
|
228
|
-
|
|
229
|
-
logger.info(f"Saved auto-execution configuration to {self.config_path}")
|
|
230
|
-
|
|
231
|
-
def validate(self, config: AutoExecutionConfig | None = None) -> None:
|
|
232
|
-
"""
|
|
233
|
-
Validate configuration.
|
|
234
|
-
|
|
235
|
-
Args:
|
|
236
|
-
config: Configuration to validate (uses cached config if None)
|
|
237
|
-
|
|
238
|
-
Raises:
|
|
239
|
-
ValueError: If configuration is invalid
|
|
240
|
-
"""
|
|
241
|
-
config = config or self._config or AutoExecutionConfig()
|
|
242
|
-
|
|
243
|
-
errors: list[str] = []
|
|
244
|
-
|
|
245
|
-
# Validate retry configuration
|
|
246
|
-
if config.retry.max_attempts < 1:
|
|
247
|
-
errors.append("retry.max_attempts must be >= 1")
|
|
248
|
-
if config.retry.backoff_multiplier < 1.0:
|
|
249
|
-
errors.append("retry.backoff_multiplier must be >= 1.0")
|
|
250
|
-
if config.retry.initial_delay_seconds < 0:
|
|
251
|
-
errors.append("retry.initial_delay_seconds must be >= 0")
|
|
252
|
-
|
|
253
|
-
# Validate polling configuration
|
|
254
|
-
if config.polling.interval_seconds <= 0:
|
|
255
|
-
errors.append("polling.interval_seconds must be > 0")
|
|
256
|
-
if config.polling.timeout_seconds <= 0:
|
|
257
|
-
errors.append("polling.timeout_seconds must be > 0")
|
|
258
|
-
if config.polling.timeout_seconds < config.polling.interval_seconds:
|
|
259
|
-
errors.append("polling.timeout_seconds must be >= polling.interval_seconds")
|
|
260
|
-
|
|
261
|
-
# Validate feature flag combinations
|
|
262
|
-
if config.enabled and not config.polling.enabled:
|
|
263
|
-
errors.append("polling must be enabled when auto_execution is enabled")
|
|
264
|
-
|
|
265
|
-
if errors:
|
|
266
|
-
raise ValueError("Configuration validation failed:\n" + "\n".join(f" - {e}" for e in errors))
|
|
267
|
-
|
|
268
|
-
def reload(self) -> AutoExecutionConfig:
|
|
269
|
-
"""
|
|
270
|
-
Reload configuration from file.
|
|
271
|
-
|
|
272
|
-
Returns:
|
|
273
|
-
Reloaded AutoExecutionConfig instance
|
|
274
|
-
|
|
275
|
-
Raises:
|
|
276
|
-
ValueError: If reloaded configuration is invalid
|
|
277
|
-
"""
|
|
278
|
-
# Clear cache to force reload
|
|
279
|
-
self._config = None
|
|
280
|
-
self._config_file_mtime = None
|
|
281
|
-
|
|
282
|
-
# Load and validate
|
|
283
|
-
return self.load(validate=True)
|
|
284
|
-
|
|
285
|
-
def _migrate_config(self, data: dict[str, Any], from_version: str) -> dict[str, Any]:
|
|
286
|
-
"""
|
|
287
|
-
Migrate configuration from old version to current version.
|
|
288
|
-
|
|
289
|
-
Args:
|
|
290
|
-
data: Configuration data from old version
|
|
291
|
-
from_version: Version of the configuration
|
|
292
|
-
|
|
293
|
-
Returns:
|
|
294
|
-
Migrated configuration data
|
|
295
|
-
"""
|
|
296
|
-
# For now, just ensure version is set
|
|
297
|
-
# Future migrations can be added here
|
|
298
|
-
if from_version == "0.0" or from_version < CONFIG_VERSION:
|
|
299
|
-
# Migration from pre-versioned config
|
|
300
|
-
# Ensure all required fields are present
|
|
301
|
-
migrated = {
|
|
302
|
-
"enabled": data.get("enabled", False),
|
|
303
|
-
"retry": data.get("retry", {}),
|
|
304
|
-
"polling": data.get("polling", {}),
|
|
305
|
-
"features": data.get("features", {}),
|
|
306
|
-
"version": CONFIG_VERSION,
|
|
307
|
-
}
|
|
308
|
-
return migrated
|
|
309
|
-
|
|
310
|
-
return data
|
|
311
|
-
|
|
312
|
-
def get_feature_flag(self, flag_name: str, workflow_override: dict[str, Any] | None = None) -> bool:
|
|
313
|
-
"""
|
|
314
|
-
Get feature flag value with workflow override support.
|
|
315
|
-
|
|
316
|
-
Args:
|
|
317
|
-
flag_name: Name of the feature flag
|
|
318
|
-
workflow_override: Optional workflow-level override
|
|
319
|
-
|
|
320
|
-
Returns:
|
|
321
|
-
Feature flag value
|
|
322
|
-
"""
|
|
323
|
-
config = self.load()
|
|
324
|
-
|
|
325
|
-
# Check workflow override first
|
|
326
|
-
if workflow_override and "auto_execution" in workflow_override:
|
|
327
|
-
workflow_config = workflow_override["auto_execution"]
|
|
328
|
-
if isinstance(workflow_config, dict) and "features" in workflow_config:
|
|
329
|
-
workflow_features = workflow_config["features"]
|
|
330
|
-
if isinstance(workflow_features, dict) and flag_name in workflow_features:
|
|
331
|
-
return bool(workflow_features[flag_name])
|
|
332
|
-
|
|
333
|
-
# Fall back to global config
|
|
334
|
-
if hasattr(config.features, flag_name):
|
|
335
|
-
return getattr(config.features, flag_name)
|
|
336
|
-
|
|
337
|
-
# Default to False for unknown flags
|
|
338
|
-
logger.warning(f"Unknown feature flag: {flag_name}")
|
|
339
|
-
return False
|
|
340
|
-
|
|
1
|
+
"""
|
|
2
|
+
Auto-Execution Configuration Management.
|
|
3
|
+
|
|
4
|
+
Provides configuration management, feature flags, validation, migration,
|
|
5
|
+
and runtime reload for Background Agent auto-execution.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
import logging
|
|
11
|
+
from dataclasses import dataclass, field
|
|
12
|
+
from pathlib import Path
|
|
13
|
+
from typing import Any
|
|
14
|
+
|
|
15
|
+
import yaml
|
|
16
|
+
|
|
17
|
+
logger = logging.getLogger(__name__)
|
|
18
|
+
|
|
19
|
+
# Configuration version for migration tracking
|
|
20
|
+
CONFIG_VERSION = "1.0"
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
@dataclass
|
|
24
|
+
class RetryConfig:
|
|
25
|
+
"""Retry configuration for auto-execution."""
|
|
26
|
+
|
|
27
|
+
enabled: bool = True
|
|
28
|
+
max_attempts: int = 3
|
|
29
|
+
backoff_multiplier: float = 2.0
|
|
30
|
+
initial_delay_seconds: float = 1.0
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
@dataclass
|
|
34
|
+
class PollingConfig:
|
|
35
|
+
"""Polling configuration for auto-execution."""
|
|
36
|
+
|
|
37
|
+
enabled: bool = True
|
|
38
|
+
interval_seconds: float = 5.0
|
|
39
|
+
timeout_seconds: float = 3600.0
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
@dataclass
|
|
43
|
+
class FeatureFlags:
|
|
44
|
+
"""Feature flags for auto-execution features."""
|
|
45
|
+
|
|
46
|
+
artifact_detection: bool = True
|
|
47
|
+
status_tracking: bool = True
|
|
48
|
+
error_handling: bool = True
|
|
49
|
+
metrics_collection: bool = True
|
|
50
|
+
audit_logging: bool = True
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
@dataclass
|
|
54
|
+
class AutoExecutionConfig:
|
|
55
|
+
"""Configuration for Background Agent auto-execution."""
|
|
56
|
+
|
|
57
|
+
enabled: bool = False
|
|
58
|
+
retry: RetryConfig = field(default_factory=RetryConfig)
|
|
59
|
+
polling: PollingConfig = field(default_factory=PollingConfig)
|
|
60
|
+
features: FeatureFlags = field(default_factory=FeatureFlags)
|
|
61
|
+
version: str = CONFIG_VERSION
|
|
62
|
+
|
|
63
|
+
def to_dict(self) -> dict[str, Any]:
|
|
64
|
+
"""Convert to dictionary for serialization."""
|
|
65
|
+
return {
|
|
66
|
+
"enabled": self.enabled,
|
|
67
|
+
"retry": {
|
|
68
|
+
"enabled": self.retry.enabled,
|
|
69
|
+
"max_attempts": self.retry.max_attempts,
|
|
70
|
+
"backoff_multiplier": self.retry.backoff_multiplier,
|
|
71
|
+
"initial_delay_seconds": self.retry.initial_delay_seconds,
|
|
72
|
+
},
|
|
73
|
+
"polling": {
|
|
74
|
+
"enabled": self.polling.enabled,
|
|
75
|
+
"interval_seconds": self.polling.interval_seconds,
|
|
76
|
+
"timeout_seconds": self.polling.timeout_seconds,
|
|
77
|
+
},
|
|
78
|
+
"features": {
|
|
79
|
+
"artifact_detection": self.features.artifact_detection,
|
|
80
|
+
"status_tracking": self.features.status_tracking,
|
|
81
|
+
"error_handling": self.features.error_handling,
|
|
82
|
+
"metrics_collection": self.features.metrics_collection,
|
|
83
|
+
"audit_logging": self.features.audit_logging,
|
|
84
|
+
},
|
|
85
|
+
"version": self.version,
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
@classmethod
|
|
89
|
+
def from_dict(cls, data: dict[str, Any]) -> AutoExecutionConfig:
|
|
90
|
+
"""Create from dictionary."""
|
|
91
|
+
retry_data = data.get("retry", {})
|
|
92
|
+
polling_data = data.get("polling", {})
|
|
93
|
+
features_data = data.get("features", {})
|
|
94
|
+
|
|
95
|
+
return cls(
|
|
96
|
+
enabled=data.get("enabled", False),
|
|
97
|
+
retry=RetryConfig(
|
|
98
|
+
enabled=retry_data.get("enabled", True),
|
|
99
|
+
max_attempts=retry_data.get("max_attempts", 3),
|
|
100
|
+
backoff_multiplier=retry_data.get("backoff_multiplier", 2.0),
|
|
101
|
+
initial_delay_seconds=retry_data.get("initial_delay_seconds", 1.0),
|
|
102
|
+
),
|
|
103
|
+
polling=PollingConfig(
|
|
104
|
+
enabled=polling_data.get("enabled", True),
|
|
105
|
+
interval_seconds=polling_data.get("interval_seconds", 5.0),
|
|
106
|
+
timeout_seconds=polling_data.get("timeout_seconds", 3600.0),
|
|
107
|
+
),
|
|
108
|
+
features=FeatureFlags(
|
|
109
|
+
artifact_detection=features_data.get("artifact_detection", True),
|
|
110
|
+
status_tracking=features_data.get("status_tracking", True),
|
|
111
|
+
error_handling=features_data.get("error_handling", True),
|
|
112
|
+
metrics_collection=features_data.get("metrics_collection", True),
|
|
113
|
+
audit_logging=features_data.get("audit_logging", True),
|
|
114
|
+
),
|
|
115
|
+
version=data.get("version", CONFIG_VERSION),
|
|
116
|
+
)
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
class AutoExecutionConfigManager:
|
|
120
|
+
"""Manages auto-execution configuration with validation, migration, and reload."""
|
|
121
|
+
|
|
122
|
+
def __init__(self, config_path: Path | None = None, project_root: Path | None = None):
|
|
123
|
+
"""
|
|
124
|
+
Initialize configuration manager.
|
|
125
|
+
|
|
126
|
+
Args:
|
|
127
|
+
config_path: Path to configuration file (defaults to .tapps-agents/config.yaml)
|
|
128
|
+
project_root: Project root directory (defaults to current directory)
|
|
129
|
+
"""
|
|
130
|
+
self.project_root = project_root or Path.cwd()
|
|
131
|
+
self.config_dir = self.project_root / ".tapps-agents"
|
|
132
|
+
self.config_path = config_path or (self.config_dir / "auto_execution_config.yaml")
|
|
133
|
+
|
|
134
|
+
# Cache for configuration
|
|
135
|
+
self._config: AutoExecutionConfig | None = None
|
|
136
|
+
self._config_file_mtime: float | None = None
|
|
137
|
+
|
|
138
|
+
def load(self, validate: bool = True) -> AutoExecutionConfig:
|
|
139
|
+
"""
|
|
140
|
+
Load configuration from file.
|
|
141
|
+
|
|
142
|
+
Args:
|
|
143
|
+
validate: If True, validate configuration after loading
|
|
144
|
+
|
|
145
|
+
Returns:
|
|
146
|
+
AutoExecutionConfig instance
|
|
147
|
+
|
|
148
|
+
Raises:
|
|
149
|
+
ValueError: If configuration is invalid
|
|
150
|
+
"""
|
|
151
|
+
# Check if config file exists
|
|
152
|
+
if not self.config_path.exists():
|
|
153
|
+
logger.info(f"Configuration file not found at {self.config_path}, using defaults")
|
|
154
|
+
self._config = AutoExecutionConfig()
|
|
155
|
+
return self._config
|
|
156
|
+
|
|
157
|
+
# Check if file has changed (for reload detection)
|
|
158
|
+
current_mtime = self.config_path.stat().st_mtime
|
|
159
|
+
if (
|
|
160
|
+
self._config is not None
|
|
161
|
+
and self._config_file_mtime == current_mtime
|
|
162
|
+
):
|
|
163
|
+
return self._config
|
|
164
|
+
|
|
165
|
+
# Load configuration
|
|
166
|
+
try:
|
|
167
|
+
with open(self.config_path, encoding="utf-8") as f:
|
|
168
|
+
data = yaml.safe_load(f) or {}
|
|
169
|
+
|
|
170
|
+
# Extract auto_execution section
|
|
171
|
+
auto_exec_data = data.get("auto_execution", {})
|
|
172
|
+
|
|
173
|
+
# Check version and migrate if needed
|
|
174
|
+
version = auto_exec_data.get("version", "0.0")
|
|
175
|
+
if version != CONFIG_VERSION:
|
|
176
|
+
logger.info(f"Migrating configuration from version {version} to {CONFIG_VERSION}")
|
|
177
|
+
auto_exec_data = self._migrate_config(auto_exec_data, version)
|
|
178
|
+
|
|
179
|
+
# Create config from data
|
|
180
|
+
self._config = AutoExecutionConfig.from_dict(auto_exec_data)
|
|
181
|
+
self._config_file_mtime = current_mtime
|
|
182
|
+
|
|
183
|
+
# Validate if requested
|
|
184
|
+
if validate:
|
|
185
|
+
self.validate(self._config)
|
|
186
|
+
|
|
187
|
+
logger.info(f"Loaded auto-execution configuration from {self.config_path}")
|
|
188
|
+
return self._config
|
|
189
|
+
|
|
190
|
+
except Exception as e:
|
|
191
|
+
logger.error(f"Failed to load configuration: {e}")
|
|
192
|
+
# Return defaults on error
|
|
193
|
+
self._config = AutoExecutionConfig()
|
|
194
|
+
return self._config
|
|
195
|
+
|
|
196
|
+
def save(self, config: AutoExecutionConfig | None = None) -> None:
|
|
197
|
+
"""
|
|
198
|
+
Save configuration to file.
|
|
199
|
+
|
|
200
|
+
Args:
|
|
201
|
+
config: Configuration to save (uses cached config if None)
|
|
202
|
+
"""
|
|
203
|
+
config = config or self._config or AutoExecutionConfig()
|
|
204
|
+
|
|
205
|
+
# Ensure config directory exists
|
|
206
|
+
self.config_dir.mkdir(parents=True, exist_ok=True)
|
|
207
|
+
|
|
208
|
+
# Load existing config to preserve other sections
|
|
209
|
+
existing_data: dict[str, Any] = {}
|
|
210
|
+
if self.config_path.exists():
|
|
211
|
+
try:
|
|
212
|
+
with open(self.config_path, encoding="utf-8") as f:
|
|
213
|
+
existing_data = yaml.safe_load(f) or {}
|
|
214
|
+
except Exception:
|
|
215
|
+
pass
|
|
216
|
+
|
|
217
|
+
# Update auto_execution section
|
|
218
|
+
existing_data["auto_execution"] = config.to_dict()
|
|
219
|
+
|
|
220
|
+
# Save to file
|
|
221
|
+
with open(self.config_path, "w", encoding="utf-8") as f:
|
|
222
|
+
yaml.dump(existing_data, f, default_flow_style=False, sort_keys=False)
|
|
223
|
+
|
|
224
|
+
# Update cache
|
|
225
|
+
self._config = config
|
|
226
|
+
if self.config_path.exists():
|
|
227
|
+
self._config_file_mtime = self.config_path.stat().st_mtime
|
|
228
|
+
|
|
229
|
+
logger.info(f"Saved auto-execution configuration to {self.config_path}")
|
|
230
|
+
|
|
231
|
+
def validate(self, config: AutoExecutionConfig | None = None) -> None:
|
|
232
|
+
"""
|
|
233
|
+
Validate configuration.
|
|
234
|
+
|
|
235
|
+
Args:
|
|
236
|
+
config: Configuration to validate (uses cached config if None)
|
|
237
|
+
|
|
238
|
+
Raises:
|
|
239
|
+
ValueError: If configuration is invalid
|
|
240
|
+
"""
|
|
241
|
+
config = config or self._config or AutoExecutionConfig()
|
|
242
|
+
|
|
243
|
+
errors: list[str] = []
|
|
244
|
+
|
|
245
|
+
# Validate retry configuration
|
|
246
|
+
if config.retry.max_attempts < 1:
|
|
247
|
+
errors.append("retry.max_attempts must be >= 1")
|
|
248
|
+
if config.retry.backoff_multiplier < 1.0:
|
|
249
|
+
errors.append("retry.backoff_multiplier must be >= 1.0")
|
|
250
|
+
if config.retry.initial_delay_seconds < 0:
|
|
251
|
+
errors.append("retry.initial_delay_seconds must be >= 0")
|
|
252
|
+
|
|
253
|
+
# Validate polling configuration
|
|
254
|
+
if config.polling.interval_seconds <= 0:
|
|
255
|
+
errors.append("polling.interval_seconds must be > 0")
|
|
256
|
+
if config.polling.timeout_seconds <= 0:
|
|
257
|
+
errors.append("polling.timeout_seconds must be > 0")
|
|
258
|
+
if config.polling.timeout_seconds < config.polling.interval_seconds:
|
|
259
|
+
errors.append("polling.timeout_seconds must be >= polling.interval_seconds")
|
|
260
|
+
|
|
261
|
+
# Validate feature flag combinations
|
|
262
|
+
if config.enabled and not config.polling.enabled:
|
|
263
|
+
errors.append("polling must be enabled when auto_execution is enabled")
|
|
264
|
+
|
|
265
|
+
if errors:
|
|
266
|
+
raise ValueError("Configuration validation failed:\n" + "\n".join(f" - {e}" for e in errors))
|
|
267
|
+
|
|
268
|
+
def reload(self) -> AutoExecutionConfig:
|
|
269
|
+
"""
|
|
270
|
+
Reload configuration from file.
|
|
271
|
+
|
|
272
|
+
Returns:
|
|
273
|
+
Reloaded AutoExecutionConfig instance
|
|
274
|
+
|
|
275
|
+
Raises:
|
|
276
|
+
ValueError: If reloaded configuration is invalid
|
|
277
|
+
"""
|
|
278
|
+
# Clear cache to force reload
|
|
279
|
+
self._config = None
|
|
280
|
+
self._config_file_mtime = None
|
|
281
|
+
|
|
282
|
+
# Load and validate
|
|
283
|
+
return self.load(validate=True)
|
|
284
|
+
|
|
285
|
+
def _migrate_config(self, data: dict[str, Any], from_version: str) -> dict[str, Any]:
|
|
286
|
+
"""
|
|
287
|
+
Migrate configuration from old version to current version.
|
|
288
|
+
|
|
289
|
+
Args:
|
|
290
|
+
data: Configuration data from old version
|
|
291
|
+
from_version: Version of the configuration
|
|
292
|
+
|
|
293
|
+
Returns:
|
|
294
|
+
Migrated configuration data
|
|
295
|
+
"""
|
|
296
|
+
# For now, just ensure version is set
|
|
297
|
+
# Future migrations can be added here
|
|
298
|
+
if from_version == "0.0" or from_version < CONFIG_VERSION:
|
|
299
|
+
# Migration from pre-versioned config
|
|
300
|
+
# Ensure all required fields are present
|
|
301
|
+
migrated = {
|
|
302
|
+
"enabled": data.get("enabled", False),
|
|
303
|
+
"retry": data.get("retry", {}),
|
|
304
|
+
"polling": data.get("polling", {}),
|
|
305
|
+
"features": data.get("features", {}),
|
|
306
|
+
"version": CONFIG_VERSION,
|
|
307
|
+
}
|
|
308
|
+
return migrated
|
|
309
|
+
|
|
310
|
+
return data
|
|
311
|
+
|
|
312
|
+
def get_feature_flag(self, flag_name: str, workflow_override: dict[str, Any] | None = None) -> bool:
|
|
313
|
+
"""
|
|
314
|
+
Get feature flag value with workflow override support.
|
|
315
|
+
|
|
316
|
+
Args:
|
|
317
|
+
flag_name: Name of the feature flag
|
|
318
|
+
workflow_override: Optional workflow-level override
|
|
319
|
+
|
|
320
|
+
Returns:
|
|
321
|
+
Feature flag value
|
|
322
|
+
"""
|
|
323
|
+
config = self.load()
|
|
324
|
+
|
|
325
|
+
# Check workflow override first
|
|
326
|
+
if workflow_override and "auto_execution" in workflow_override:
|
|
327
|
+
workflow_config = workflow_override["auto_execution"]
|
|
328
|
+
if isinstance(workflow_config, dict) and "features" in workflow_config:
|
|
329
|
+
workflow_features = workflow_config["features"]
|
|
330
|
+
if isinstance(workflow_features, dict) and flag_name in workflow_features:
|
|
331
|
+
return bool(workflow_features[flag_name])
|
|
332
|
+
|
|
333
|
+
# Fall back to global config
|
|
334
|
+
if hasattr(config.features, flag_name):
|
|
335
|
+
return getattr(config.features, flag_name)
|
|
336
|
+
|
|
337
|
+
# Default to False for unknown flags
|
|
338
|
+
logger.warning(f"Unknown feature flag: {flag_name}")
|
|
339
|
+
return False
|
|
340
|
+
|