tapps-agents 3.5.40__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 -219
- 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 -2196
- 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 -111
- 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.40.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.40.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.40.dist-info/RECORD +0 -760
- {tapps_agents-3.5.40.dist-info → tapps_agents-3.6.0.dist-info}/WHEEL +0 -0
- {tapps_agents-3.5.40.dist-info → tapps_agents-3.6.0.dist-info}/entry_points.txt +0 -0
- {tapps_agents-3.5.40.dist-info → tapps_agents-3.6.0.dist-info}/top_level.txt +0 -0
tapps_agents/health/registry.py
CHANGED
|
@@ -1,166 +1,166 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Health Check Registry.
|
|
3
|
-
|
|
4
|
-
Manages registration and discovery of health checks.
|
|
5
|
-
"""
|
|
6
|
-
|
|
7
|
-
from __future__ import annotations
|
|
8
|
-
|
|
9
|
-
import logging
|
|
10
|
-
from typing import Any
|
|
11
|
-
|
|
12
|
-
from .base import HealthCheck, HealthCheckResult
|
|
13
|
-
|
|
14
|
-
logger = logging.getLogger(__name__)
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
class HealthCheckRegistry:
|
|
18
|
-
"""Registry for health checks."""
|
|
19
|
-
|
|
20
|
-
def __init__(self):
|
|
21
|
-
"""Initialize health check registry."""
|
|
22
|
-
self._checks: dict[str, HealthCheck] = {}
|
|
23
|
-
|
|
24
|
-
def register(self, check: HealthCheck) -> None:
|
|
25
|
-
"""
|
|
26
|
-
Register a health check.
|
|
27
|
-
|
|
28
|
-
Args:
|
|
29
|
-
check: Health check instance to register
|
|
30
|
-
|
|
31
|
-
Raises:
|
|
32
|
-
ValueError: If check with same name already registered
|
|
33
|
-
"""
|
|
34
|
-
if check.name in self._checks:
|
|
35
|
-
raise ValueError(f"Health check '{check.name}' is already registered")
|
|
36
|
-
|
|
37
|
-
self._checks[check.name] = check
|
|
38
|
-
logger.debug(f"Registered health check: {check.name}")
|
|
39
|
-
|
|
40
|
-
def get(self, name: str) -> HealthCheck | None:
|
|
41
|
-
"""
|
|
42
|
-
Get a health check by name.
|
|
43
|
-
|
|
44
|
-
Args:
|
|
45
|
-
name: Name of the health check
|
|
46
|
-
|
|
47
|
-
Returns:
|
|
48
|
-
HealthCheck instance or None if not found
|
|
49
|
-
"""
|
|
50
|
-
return self._checks.get(name)
|
|
51
|
-
|
|
52
|
-
def get_all(self) -> dict[str, HealthCheck]:
|
|
53
|
-
"""
|
|
54
|
-
Get all registered health checks.
|
|
55
|
-
|
|
56
|
-
Returns:
|
|
57
|
-
Dictionary mapping check names to HealthCheck instances
|
|
58
|
-
"""
|
|
59
|
-
return self._checks.copy()
|
|
60
|
-
|
|
61
|
-
def list_names(self) -> list[str]:
|
|
62
|
-
"""
|
|
63
|
-
List all registered health check names.
|
|
64
|
-
|
|
65
|
-
Returns:
|
|
66
|
-
List of health check names
|
|
67
|
-
"""
|
|
68
|
-
return list(self._checks.keys())
|
|
69
|
-
|
|
70
|
-
def run(self, name: str) -> HealthCheckResult | None:
|
|
71
|
-
"""
|
|
72
|
-
Run a specific health check.
|
|
73
|
-
|
|
74
|
-
Args:
|
|
75
|
-
name: Name of the health check to run
|
|
76
|
-
|
|
77
|
-
Returns:
|
|
78
|
-
HealthCheckResult or None if check not found
|
|
79
|
-
"""
|
|
80
|
-
check = self.get(name)
|
|
81
|
-
if not check:
|
|
82
|
-
logger.warning(f"Health check '{name}' not found")
|
|
83
|
-
return None
|
|
84
|
-
|
|
85
|
-
try:
|
|
86
|
-
return check.run()
|
|
87
|
-
except Exception as e:
|
|
88
|
-
logger.error(f"Error running health check '{name}': {e}", exc_info=True)
|
|
89
|
-
return HealthCheckResult(
|
|
90
|
-
name=name,
|
|
91
|
-
status="unhealthy",
|
|
92
|
-
score=0.0,
|
|
93
|
-
message=f"Health check failed with error: {e}",
|
|
94
|
-
details={"error": str(e)},
|
|
95
|
-
)
|
|
96
|
-
|
|
97
|
-
def run_all(self, check_names: list[str] | None = None) -> dict[str, HealthCheckResult]:
|
|
98
|
-
"""
|
|
99
|
-
Run all registered health checks (or specified subset).
|
|
100
|
-
|
|
101
|
-
Args:
|
|
102
|
-
check_names: Optional list of check names to run. If None, runs all.
|
|
103
|
-
|
|
104
|
-
Returns:
|
|
105
|
-
Dictionary mapping check names to HealthCheckResult instances
|
|
106
|
-
"""
|
|
107
|
-
if check_names is None:
|
|
108
|
-
check_names = self.list_names()
|
|
109
|
-
|
|
110
|
-
results: dict[str, HealthCheckResult] = {}
|
|
111
|
-
|
|
112
|
-
# Build dependency graph and determine execution order
|
|
113
|
-
execution_order = self._topological_sort(check_names)
|
|
114
|
-
|
|
115
|
-
for name in execution_order:
|
|
116
|
-
if name not in check_names:
|
|
117
|
-
continue
|
|
118
|
-
results[name] = self.run(name)
|
|
119
|
-
|
|
120
|
-
return results
|
|
121
|
-
|
|
122
|
-
def _topological_sort(self, check_names: list[str]) -> list[str]:
|
|
123
|
-
"""
|
|
124
|
-
Topologically sort health checks based on dependencies.
|
|
125
|
-
|
|
126
|
-
Args:
|
|
127
|
-
check_names: List of check names to sort
|
|
128
|
-
|
|
129
|
-
Returns:
|
|
130
|
-
Sorted list of check names respecting dependencies
|
|
131
|
-
"""
|
|
132
|
-
# Build dependency graph
|
|
133
|
-
graph: dict[str, set[str]] = {}
|
|
134
|
-
for name in check_names:
|
|
135
|
-
check = self.get(name)
|
|
136
|
-
if check:
|
|
137
|
-
graph[name] = set(check.get_dependencies())
|
|
138
|
-
|
|
139
|
-
# Topological sort using Kahn's algorithm
|
|
140
|
-
in_degree: dict[str, int] = {name: 0 for name in check_names}
|
|
141
|
-
for name in check_names:
|
|
142
|
-
for dep in graph.get(name, set()):
|
|
143
|
-
if dep in in_degree:
|
|
144
|
-
in_degree[name] += 1
|
|
145
|
-
|
|
146
|
-
queue = [name for name, degree in in_degree.items() if degree == 0]
|
|
147
|
-
result = []
|
|
148
|
-
|
|
149
|
-
while queue:
|
|
150
|
-
node = queue.pop(0)
|
|
151
|
-
result.append(node)
|
|
152
|
-
|
|
153
|
-
# Reduce in-degree for dependent nodes
|
|
154
|
-
for name in check_names:
|
|
155
|
-
if node in graph.get(name, set()):
|
|
156
|
-
in_degree[name] -= 1
|
|
157
|
-
if in_degree[name] == 0:
|
|
158
|
-
queue.append(name)
|
|
159
|
-
|
|
160
|
-
# Add any remaining nodes (shouldn't happen if no cycles)
|
|
161
|
-
for name in check_names:
|
|
162
|
-
if name not in result:
|
|
163
|
-
result.append(name)
|
|
164
|
-
|
|
165
|
-
return result
|
|
166
|
-
|
|
1
|
+
"""
|
|
2
|
+
Health Check Registry.
|
|
3
|
+
|
|
4
|
+
Manages registration and discovery of health checks.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
import logging
|
|
10
|
+
from typing import Any
|
|
11
|
+
|
|
12
|
+
from .base import HealthCheck, HealthCheckResult
|
|
13
|
+
|
|
14
|
+
logger = logging.getLogger(__name__)
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class HealthCheckRegistry:
|
|
18
|
+
"""Registry for health checks."""
|
|
19
|
+
|
|
20
|
+
def __init__(self):
|
|
21
|
+
"""Initialize health check registry."""
|
|
22
|
+
self._checks: dict[str, HealthCheck] = {}
|
|
23
|
+
|
|
24
|
+
def register(self, check: HealthCheck) -> None:
|
|
25
|
+
"""
|
|
26
|
+
Register a health check.
|
|
27
|
+
|
|
28
|
+
Args:
|
|
29
|
+
check: Health check instance to register
|
|
30
|
+
|
|
31
|
+
Raises:
|
|
32
|
+
ValueError: If check with same name already registered
|
|
33
|
+
"""
|
|
34
|
+
if check.name in self._checks:
|
|
35
|
+
raise ValueError(f"Health check '{check.name}' is already registered")
|
|
36
|
+
|
|
37
|
+
self._checks[check.name] = check
|
|
38
|
+
logger.debug(f"Registered health check: {check.name}")
|
|
39
|
+
|
|
40
|
+
def get(self, name: str) -> HealthCheck | None:
|
|
41
|
+
"""
|
|
42
|
+
Get a health check by name.
|
|
43
|
+
|
|
44
|
+
Args:
|
|
45
|
+
name: Name of the health check
|
|
46
|
+
|
|
47
|
+
Returns:
|
|
48
|
+
HealthCheck instance or None if not found
|
|
49
|
+
"""
|
|
50
|
+
return self._checks.get(name)
|
|
51
|
+
|
|
52
|
+
def get_all(self) -> dict[str, HealthCheck]:
|
|
53
|
+
"""
|
|
54
|
+
Get all registered health checks.
|
|
55
|
+
|
|
56
|
+
Returns:
|
|
57
|
+
Dictionary mapping check names to HealthCheck instances
|
|
58
|
+
"""
|
|
59
|
+
return self._checks.copy()
|
|
60
|
+
|
|
61
|
+
def list_names(self) -> list[str]:
|
|
62
|
+
"""
|
|
63
|
+
List all registered health check names.
|
|
64
|
+
|
|
65
|
+
Returns:
|
|
66
|
+
List of health check names
|
|
67
|
+
"""
|
|
68
|
+
return list(self._checks.keys())
|
|
69
|
+
|
|
70
|
+
def run(self, name: str) -> HealthCheckResult | None:
|
|
71
|
+
"""
|
|
72
|
+
Run a specific health check.
|
|
73
|
+
|
|
74
|
+
Args:
|
|
75
|
+
name: Name of the health check to run
|
|
76
|
+
|
|
77
|
+
Returns:
|
|
78
|
+
HealthCheckResult or None if check not found
|
|
79
|
+
"""
|
|
80
|
+
check = self.get(name)
|
|
81
|
+
if not check:
|
|
82
|
+
logger.warning(f"Health check '{name}' not found")
|
|
83
|
+
return None
|
|
84
|
+
|
|
85
|
+
try:
|
|
86
|
+
return check.run()
|
|
87
|
+
except Exception as e:
|
|
88
|
+
logger.error(f"Error running health check '{name}': {e}", exc_info=True)
|
|
89
|
+
return HealthCheckResult(
|
|
90
|
+
name=name,
|
|
91
|
+
status="unhealthy",
|
|
92
|
+
score=0.0,
|
|
93
|
+
message=f"Health check failed with error: {e}",
|
|
94
|
+
details={"error": str(e)},
|
|
95
|
+
)
|
|
96
|
+
|
|
97
|
+
def run_all(self, check_names: list[str] | None = None) -> dict[str, HealthCheckResult]:
|
|
98
|
+
"""
|
|
99
|
+
Run all registered health checks (or specified subset).
|
|
100
|
+
|
|
101
|
+
Args:
|
|
102
|
+
check_names: Optional list of check names to run. If None, runs all.
|
|
103
|
+
|
|
104
|
+
Returns:
|
|
105
|
+
Dictionary mapping check names to HealthCheckResult instances
|
|
106
|
+
"""
|
|
107
|
+
if check_names is None:
|
|
108
|
+
check_names = self.list_names()
|
|
109
|
+
|
|
110
|
+
results: dict[str, HealthCheckResult] = {}
|
|
111
|
+
|
|
112
|
+
# Build dependency graph and determine execution order
|
|
113
|
+
execution_order = self._topological_sort(check_names)
|
|
114
|
+
|
|
115
|
+
for name in execution_order:
|
|
116
|
+
if name not in check_names:
|
|
117
|
+
continue
|
|
118
|
+
results[name] = self.run(name)
|
|
119
|
+
|
|
120
|
+
return results
|
|
121
|
+
|
|
122
|
+
def _topological_sort(self, check_names: list[str]) -> list[str]:
|
|
123
|
+
"""
|
|
124
|
+
Topologically sort health checks based on dependencies.
|
|
125
|
+
|
|
126
|
+
Args:
|
|
127
|
+
check_names: List of check names to sort
|
|
128
|
+
|
|
129
|
+
Returns:
|
|
130
|
+
Sorted list of check names respecting dependencies
|
|
131
|
+
"""
|
|
132
|
+
# Build dependency graph
|
|
133
|
+
graph: dict[str, set[str]] = {}
|
|
134
|
+
for name in check_names:
|
|
135
|
+
check = self.get(name)
|
|
136
|
+
if check:
|
|
137
|
+
graph[name] = set(check.get_dependencies())
|
|
138
|
+
|
|
139
|
+
# Topological sort using Kahn's algorithm
|
|
140
|
+
in_degree: dict[str, int] = {name: 0 for name in check_names}
|
|
141
|
+
for name in check_names:
|
|
142
|
+
for dep in graph.get(name, set()):
|
|
143
|
+
if dep in in_degree:
|
|
144
|
+
in_degree[name] += 1
|
|
145
|
+
|
|
146
|
+
queue = [name for name, degree in in_degree.items() if degree == 0]
|
|
147
|
+
result = []
|
|
148
|
+
|
|
149
|
+
while queue:
|
|
150
|
+
node = queue.pop(0)
|
|
151
|
+
result.append(node)
|
|
152
|
+
|
|
153
|
+
# Reduce in-degree for dependent nodes
|
|
154
|
+
for name in check_names:
|
|
155
|
+
if node in graph.get(name, set()):
|
|
156
|
+
in_degree[name] -= 1
|
|
157
|
+
if in_degree[name] == 0:
|
|
158
|
+
queue.append(name)
|
|
159
|
+
|
|
160
|
+
# Add any remaining nodes (shouldn't happen if no cycles)
|
|
161
|
+
for name in check_names:
|
|
162
|
+
if name not in result:
|
|
163
|
+
result.append(name)
|
|
164
|
+
|
|
165
|
+
return result
|
|
166
|
+
|
tapps_agents/hooks/__init__.py
CHANGED
|
@@ -1,33 +1,33 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Hook system for TappsCodingAgents.
|
|
3
|
-
|
|
4
|
-
Provides event-driven automation: UserPromptSubmit, PostToolUse, SessionStart,
|
|
5
|
-
SessionEnd, WorkflowComplete. Configuration via .tapps-agents/hooks.yaml.
|
|
6
|
-
"""
|
|
7
|
-
|
|
8
|
-
from .config import HookDefinition, HooksConfig, load_hooks_config
|
|
9
|
-
from .executor import HookResult, run_hook
|
|
10
|
-
from .events import (
|
|
11
|
-
HookEventType,
|
|
12
|
-
PostToolUseEvent,
|
|
13
|
-
SessionEndEvent,
|
|
14
|
-
SessionStartEvent,
|
|
15
|
-
UserPromptSubmitEvent,
|
|
16
|
-
WorkflowCompleteEvent,
|
|
17
|
-
)
|
|
18
|
-
from .manager import HookManager
|
|
19
|
-
|
|
20
|
-
__all__ = [
|
|
21
|
-
"HookDefinition",
|
|
22
|
-
"HookManager",
|
|
23
|
-
"HooksConfig",
|
|
24
|
-
"HookResult",
|
|
25
|
-
"load_hooks_config",
|
|
26
|
-
"run_hook",
|
|
27
|
-
"HookEventType",
|
|
28
|
-
"PostToolUseEvent",
|
|
29
|
-
"SessionEndEvent",
|
|
30
|
-
"SessionStartEvent",
|
|
31
|
-
"UserPromptSubmitEvent",
|
|
32
|
-
"WorkflowCompleteEvent",
|
|
33
|
-
]
|
|
1
|
+
"""
|
|
2
|
+
Hook system for TappsCodingAgents.
|
|
3
|
+
|
|
4
|
+
Provides event-driven automation: UserPromptSubmit, PostToolUse, SessionStart,
|
|
5
|
+
SessionEnd, WorkflowComplete. Configuration via .tapps-agents/hooks.yaml.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from .config import HookDefinition, HooksConfig, load_hooks_config
|
|
9
|
+
from .executor import HookResult, run_hook
|
|
10
|
+
from .events import (
|
|
11
|
+
HookEventType,
|
|
12
|
+
PostToolUseEvent,
|
|
13
|
+
SessionEndEvent,
|
|
14
|
+
SessionStartEvent,
|
|
15
|
+
UserPromptSubmitEvent,
|
|
16
|
+
WorkflowCompleteEvent,
|
|
17
|
+
)
|
|
18
|
+
from .manager import HookManager
|
|
19
|
+
|
|
20
|
+
__all__ = [
|
|
21
|
+
"HookDefinition",
|
|
22
|
+
"HookManager",
|
|
23
|
+
"HooksConfig",
|
|
24
|
+
"HookResult",
|
|
25
|
+
"load_hooks_config",
|
|
26
|
+
"run_hook",
|
|
27
|
+
"HookEventType",
|
|
28
|
+
"PostToolUseEvent",
|
|
29
|
+
"SessionEndEvent",
|
|
30
|
+
"SessionStartEvent",
|
|
31
|
+
"UserPromptSubmitEvent",
|
|
32
|
+
"WorkflowCompleteEvent",
|
|
33
|
+
]
|
tapps_agents/hooks/config.py
CHANGED
|
@@ -1,140 +1,140 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Hook configuration schema and loader.
|
|
3
|
-
|
|
4
|
-
Loads and validates .tapps-agents/hooks.yaml with event definitions,
|
|
5
|
-
matchers, and commands. Supported events: UserPromptSubmit, PostToolUse,
|
|
6
|
-
SessionStart, SessionEnd, WorkflowComplete.
|
|
7
|
-
"""
|
|
8
|
-
|
|
9
|
-
from __future__ import annotations
|
|
10
|
-
|
|
11
|
-
from pathlib import Path
|
|
12
|
-
|
|
13
|
-
import yaml
|
|
14
|
-
from pydantic import BaseModel, Field, model_validator
|
|
15
|
-
|
|
16
|
-
# Supported hook event types
|
|
17
|
-
HOOK_EVENT_TYPES = frozenset({
|
|
18
|
-
"UserPromptSubmit",
|
|
19
|
-
"PostToolUse",
|
|
20
|
-
"SessionStart",
|
|
21
|
-
"SessionEnd",
|
|
22
|
-
"WorkflowComplete",
|
|
23
|
-
})
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
class HookDefinition(BaseModel):
|
|
27
|
-
"""Single hook definition within an event."""
|
|
28
|
-
|
|
29
|
-
name: str = Field(..., min_length=1, description="Hook display name")
|
|
30
|
-
command: str = Field(..., min_length=1, description="Shell command to execute")
|
|
31
|
-
enabled: bool = Field(default=True, description="Whether hook is enabled")
|
|
32
|
-
matcher: str | None = Field(
|
|
33
|
-
default=None,
|
|
34
|
-
description="Tool name matcher for PostToolUse (e.g. 'Write|Edit')",
|
|
35
|
-
)
|
|
36
|
-
file_patterns: list[str] | None = Field(
|
|
37
|
-
default=None,
|
|
38
|
-
description="Glob patterns for file filtering (e.g. ['*.py'])",
|
|
39
|
-
)
|
|
40
|
-
fail_on_error: bool = Field(
|
|
41
|
-
default=False,
|
|
42
|
-
description="If true, non-zero exit fails workflow",
|
|
43
|
-
)
|
|
44
|
-
|
|
45
|
-
model_config = {"extra": "forbid"}
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
class HooksConfig(BaseModel):
|
|
49
|
-
"""
|
|
50
|
-
Root schema for hooks.yaml.
|
|
51
|
-
|
|
52
|
-
Top-level key is 'hooks'. Each event maps to a list of HookDefinition.
|
|
53
|
-
"""
|
|
54
|
-
|
|
55
|
-
hooks: dict[str, list[HookDefinition]] = Field(
|
|
56
|
-
default_factory=dict,
|
|
57
|
-
description="Event name -> list of hook definitions",
|
|
58
|
-
)
|
|
59
|
-
|
|
60
|
-
model_config = {"extra": "forbid"}
|
|
61
|
-
|
|
62
|
-
@model_validator(mode="after")
|
|
63
|
-
def validate_event_names(self) -> "HooksConfig":
|
|
64
|
-
"""Ensure only supported event names are used."""
|
|
65
|
-
for event_name in self.hooks:
|
|
66
|
-
if event_name not in HOOK_EVENT_TYPES:
|
|
67
|
-
raise ValueError(
|
|
68
|
-
f"Unsupported hook event '{event_name}'. "
|
|
69
|
-
f"Supported: {', '.join(sorted(HOOK_EVENT_TYPES))}"
|
|
70
|
-
)
|
|
71
|
-
return self
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
def load_hooks_config(
|
|
75
|
-
config_path: Path | str | None = None,
|
|
76
|
-
project_root: Path | None = None,
|
|
77
|
-
) -> HooksConfig:
|
|
78
|
-
"""
|
|
79
|
-
Load and validate hooks.yaml.
|
|
80
|
-
|
|
81
|
-
Args:
|
|
82
|
-
config_path: Explicit path to hooks.yaml. If None, uses
|
|
83
|
-
project_root/.tapps-agents/hooks.yaml.
|
|
84
|
-
project_root: Project root (default: cwd). Used when config_path is None.
|
|
85
|
-
|
|
86
|
-
Returns:
|
|
87
|
-
Validated HooksConfig. Returns empty config (all events empty) when
|
|
88
|
-
file is missing (safe defaults).
|
|
89
|
-
|
|
90
|
-
Raises:
|
|
91
|
-
FileNotFoundError: If config_path is given and file doesn't exist.
|
|
92
|
-
yaml.YAMLError: On YAML parse errors (includes path/line in message).
|
|
93
|
-
ValueError: On schema validation failures.
|
|
94
|
-
"""
|
|
95
|
-
project_root = project_root or Path.cwd()
|
|
96
|
-
if config_path is None:
|
|
97
|
-
config_path = project_root / ".tapps-agents" / "hooks.yaml"
|
|
98
|
-
else:
|
|
99
|
-
config_path = Path(config_path)
|
|
100
|
-
if not config_path.is_absolute():
|
|
101
|
-
config_path = project_root / config_path
|
|
102
|
-
|
|
103
|
-
if not config_path.exists():
|
|
104
|
-
return HooksConfig(hooks={})
|
|
105
|
-
|
|
106
|
-
try:
|
|
107
|
-
content = config_path.read_text(encoding="utf-8")
|
|
108
|
-
except OSError as e:
|
|
109
|
-
raise FileNotFoundError(
|
|
110
|
-
f"Cannot read hooks config from {config_path}: {e}"
|
|
111
|
-
) from e
|
|
112
|
-
|
|
113
|
-
try:
|
|
114
|
-
raw = yaml.safe_load(content)
|
|
115
|
-
except yaml.YAMLError as e:
|
|
116
|
-
path_hint = str(config_path)
|
|
117
|
-
if hasattr(e, "problem_mark") and e.problem_mark:
|
|
118
|
-
line = e.problem_mark.line + 1
|
|
119
|
-
col = e.problem_mark.column + 1
|
|
120
|
-
path_hint = f"{config_path}:{line}:{col}"
|
|
121
|
-
raise yaml.YAMLError(f"Invalid YAML in {path_hint}: {e}") from e
|
|
122
|
-
|
|
123
|
-
if raw is None:
|
|
124
|
-
return HooksConfig(hooks={})
|
|
125
|
-
|
|
126
|
-
if not isinstance(raw, dict):
|
|
127
|
-
raise ValueError(
|
|
128
|
-
f"hooks.yaml must be a YAML object (dict), got {type(raw).__name__} "
|
|
129
|
-
f"at {config_path}"
|
|
130
|
-
)
|
|
131
|
-
|
|
132
|
-
if "hooks" not in raw:
|
|
133
|
-
return HooksConfig(hooks={})
|
|
134
|
-
|
|
135
|
-
try:
|
|
136
|
-
return HooksConfig.model_validate(raw)
|
|
137
|
-
except Exception as e:
|
|
138
|
-
raise ValueError(
|
|
139
|
-
f"Hooks config validation failed at {config_path}: {e}"
|
|
140
|
-
) from e
|
|
1
|
+
"""
|
|
2
|
+
Hook configuration schema and loader.
|
|
3
|
+
|
|
4
|
+
Loads and validates .tapps-agents/hooks.yaml with event definitions,
|
|
5
|
+
matchers, and commands. Supported events: UserPromptSubmit, PostToolUse,
|
|
6
|
+
SessionStart, SessionEnd, WorkflowComplete.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
from pathlib import Path
|
|
12
|
+
|
|
13
|
+
import yaml
|
|
14
|
+
from pydantic import BaseModel, Field, model_validator
|
|
15
|
+
|
|
16
|
+
# Supported hook event types
|
|
17
|
+
HOOK_EVENT_TYPES = frozenset({
|
|
18
|
+
"UserPromptSubmit",
|
|
19
|
+
"PostToolUse",
|
|
20
|
+
"SessionStart",
|
|
21
|
+
"SessionEnd",
|
|
22
|
+
"WorkflowComplete",
|
|
23
|
+
})
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class HookDefinition(BaseModel):
|
|
27
|
+
"""Single hook definition within an event."""
|
|
28
|
+
|
|
29
|
+
name: str = Field(..., min_length=1, description="Hook display name")
|
|
30
|
+
command: str = Field(..., min_length=1, description="Shell command to execute")
|
|
31
|
+
enabled: bool = Field(default=True, description="Whether hook is enabled")
|
|
32
|
+
matcher: str | None = Field(
|
|
33
|
+
default=None,
|
|
34
|
+
description="Tool name matcher for PostToolUse (e.g. 'Write|Edit')",
|
|
35
|
+
)
|
|
36
|
+
file_patterns: list[str] | None = Field(
|
|
37
|
+
default=None,
|
|
38
|
+
description="Glob patterns for file filtering (e.g. ['*.py'])",
|
|
39
|
+
)
|
|
40
|
+
fail_on_error: bool = Field(
|
|
41
|
+
default=False,
|
|
42
|
+
description="If true, non-zero exit fails workflow",
|
|
43
|
+
)
|
|
44
|
+
|
|
45
|
+
model_config = {"extra": "forbid"}
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
class HooksConfig(BaseModel):
|
|
49
|
+
"""
|
|
50
|
+
Root schema for hooks.yaml.
|
|
51
|
+
|
|
52
|
+
Top-level key is 'hooks'. Each event maps to a list of HookDefinition.
|
|
53
|
+
"""
|
|
54
|
+
|
|
55
|
+
hooks: dict[str, list[HookDefinition]] = Field(
|
|
56
|
+
default_factory=dict,
|
|
57
|
+
description="Event name -> list of hook definitions",
|
|
58
|
+
)
|
|
59
|
+
|
|
60
|
+
model_config = {"extra": "forbid"}
|
|
61
|
+
|
|
62
|
+
@model_validator(mode="after")
|
|
63
|
+
def validate_event_names(self) -> "HooksConfig":
|
|
64
|
+
"""Ensure only supported event names are used."""
|
|
65
|
+
for event_name in self.hooks:
|
|
66
|
+
if event_name not in HOOK_EVENT_TYPES:
|
|
67
|
+
raise ValueError(
|
|
68
|
+
f"Unsupported hook event '{event_name}'. "
|
|
69
|
+
f"Supported: {', '.join(sorted(HOOK_EVENT_TYPES))}"
|
|
70
|
+
)
|
|
71
|
+
return self
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
def load_hooks_config(
|
|
75
|
+
config_path: Path | str | None = None,
|
|
76
|
+
project_root: Path | None = None,
|
|
77
|
+
) -> HooksConfig:
|
|
78
|
+
"""
|
|
79
|
+
Load and validate hooks.yaml.
|
|
80
|
+
|
|
81
|
+
Args:
|
|
82
|
+
config_path: Explicit path to hooks.yaml. If None, uses
|
|
83
|
+
project_root/.tapps-agents/hooks.yaml.
|
|
84
|
+
project_root: Project root (default: cwd). Used when config_path is None.
|
|
85
|
+
|
|
86
|
+
Returns:
|
|
87
|
+
Validated HooksConfig. Returns empty config (all events empty) when
|
|
88
|
+
file is missing (safe defaults).
|
|
89
|
+
|
|
90
|
+
Raises:
|
|
91
|
+
FileNotFoundError: If config_path is given and file doesn't exist.
|
|
92
|
+
yaml.YAMLError: On YAML parse errors (includes path/line in message).
|
|
93
|
+
ValueError: On schema validation failures.
|
|
94
|
+
"""
|
|
95
|
+
project_root = project_root or Path.cwd()
|
|
96
|
+
if config_path is None:
|
|
97
|
+
config_path = project_root / ".tapps-agents" / "hooks.yaml"
|
|
98
|
+
else:
|
|
99
|
+
config_path = Path(config_path)
|
|
100
|
+
if not config_path.is_absolute():
|
|
101
|
+
config_path = project_root / config_path
|
|
102
|
+
|
|
103
|
+
if not config_path.exists():
|
|
104
|
+
return HooksConfig(hooks={})
|
|
105
|
+
|
|
106
|
+
try:
|
|
107
|
+
content = config_path.read_text(encoding="utf-8")
|
|
108
|
+
except OSError as e:
|
|
109
|
+
raise FileNotFoundError(
|
|
110
|
+
f"Cannot read hooks config from {config_path}: {e}"
|
|
111
|
+
) from e
|
|
112
|
+
|
|
113
|
+
try:
|
|
114
|
+
raw = yaml.safe_load(content)
|
|
115
|
+
except yaml.YAMLError as e:
|
|
116
|
+
path_hint = str(config_path)
|
|
117
|
+
if hasattr(e, "problem_mark") and e.problem_mark:
|
|
118
|
+
line = e.problem_mark.line + 1
|
|
119
|
+
col = e.problem_mark.column + 1
|
|
120
|
+
path_hint = f"{config_path}:{line}:{col}"
|
|
121
|
+
raise yaml.YAMLError(f"Invalid YAML in {path_hint}: {e}") from e
|
|
122
|
+
|
|
123
|
+
if raw is None:
|
|
124
|
+
return HooksConfig(hooks={})
|
|
125
|
+
|
|
126
|
+
if not isinstance(raw, dict):
|
|
127
|
+
raise ValueError(
|
|
128
|
+
f"hooks.yaml must be a YAML object (dict), got {type(raw).__name__} "
|
|
129
|
+
f"at {config_path}"
|
|
130
|
+
)
|
|
131
|
+
|
|
132
|
+
if "hooks" not in raw:
|
|
133
|
+
return HooksConfig(hooks={})
|
|
134
|
+
|
|
135
|
+
try:
|
|
136
|
+
return HooksConfig.model_validate(raw)
|
|
137
|
+
except Exception as e:
|
|
138
|
+
raise ValueError(
|
|
139
|
+
f"Hooks config validation failed at {config_path}: {e}"
|
|
140
|
+
) from e
|