tapps-agents 3.6.0__py3-none-any.whl → 3.6.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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/service_discovery.py +534 -534
- 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/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/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/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/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.backup_20260204_064058.py +324 -0
- tapps_agents/health/checks/outcomes.backup_20260204_064256.py +324 -0
- tapps_agents/health/checks/outcomes.backup_20260204_064600.py +324 -0
- 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/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/resources/__init__.py +5 -0
- tapps_agents/resources/claude/__init__.py +1 -0
- tapps_agents/resources/claude/commands/README.md +156 -0
- tapps_agents/resources/claude/commands/__init__.py +1 -0
- tapps_agents/resources/claude/commands/build-fix.md +22 -0
- tapps_agents/resources/claude/commands/build.md +77 -0
- tapps_agents/resources/claude/commands/debug.md +53 -0
- tapps_agents/resources/claude/commands/design.md +68 -0
- tapps_agents/resources/claude/commands/docs.md +53 -0
- tapps_agents/resources/claude/commands/e2e.md +22 -0
- tapps_agents/resources/claude/commands/fix.md +54 -0
- tapps_agents/resources/claude/commands/implement.md +53 -0
- tapps_agents/resources/claude/commands/improve.md +53 -0
- tapps_agents/resources/claude/commands/library-docs.md +64 -0
- tapps_agents/resources/claude/commands/lint.md +52 -0
- tapps_agents/resources/claude/commands/plan.md +65 -0
- tapps_agents/resources/claude/commands/refactor-clean.md +21 -0
- tapps_agents/resources/claude/commands/refactor.md +55 -0
- tapps_agents/resources/claude/commands/review.md +67 -0
- tapps_agents/resources/claude/commands/score.md +60 -0
- tapps_agents/resources/claude/commands/security-review.md +22 -0
- tapps_agents/resources/claude/commands/security-scan.md +54 -0
- tapps_agents/resources/claude/commands/tdd.md +24 -0
- tapps_agents/resources/claude/commands/test-coverage.md +21 -0
- tapps_agents/resources/claude/commands/test.md +54 -0
- tapps_agents/resources/claude/commands/update-codemaps.md +20 -0
- tapps_agents/resources/claude/commands/update-docs.md +21 -0
- tapps_agents/resources/claude/skills/__init__.py +1 -0
- tapps_agents/resources/claude/skills/analyst/SKILL.md +272 -0
- tapps_agents/resources/claude/skills/analyst/__init__.py +1 -0
- tapps_agents/resources/claude/skills/architect/SKILL.md +282 -0
- tapps_agents/resources/claude/skills/architect/__init__.py +1 -0
- tapps_agents/resources/claude/skills/backend-patterns/SKILL.md +30 -0
- tapps_agents/resources/claude/skills/backend-patterns/__init__.py +1 -0
- tapps_agents/resources/claude/skills/coding-standards/SKILL.md +29 -0
- tapps_agents/resources/claude/skills/coding-standards/__init__.py +1 -0
- tapps_agents/resources/claude/skills/debugger/SKILL.md +203 -0
- tapps_agents/resources/claude/skills/debugger/__init__.py +1 -0
- tapps_agents/resources/claude/skills/designer/SKILL.md +243 -0
- tapps_agents/resources/claude/skills/designer/__init__.py +1 -0
- tapps_agents/resources/claude/skills/documenter/SKILL.md +252 -0
- tapps_agents/resources/claude/skills/documenter/__init__.py +1 -0
- tapps_agents/resources/claude/skills/enhancer/SKILL.md +307 -0
- tapps_agents/resources/claude/skills/enhancer/__init__.py +1 -0
- tapps_agents/resources/claude/skills/evaluator/SKILL.md +204 -0
- tapps_agents/resources/claude/skills/evaluator/__init__.py +1 -0
- tapps_agents/resources/claude/skills/frontend-patterns/SKILL.md +29 -0
- tapps_agents/resources/claude/skills/frontend-patterns/__init__.py +1 -0
- tapps_agents/resources/claude/skills/implementer/SKILL.md +188 -0
- tapps_agents/resources/claude/skills/implementer/__init__.py +1 -0
- tapps_agents/resources/claude/skills/improver/SKILL.md +218 -0
- tapps_agents/resources/claude/skills/improver/__init__.py +1 -0
- tapps_agents/resources/claude/skills/ops/SKILL.md +281 -0
- tapps_agents/resources/claude/skills/ops/__init__.py +1 -0
- tapps_agents/resources/claude/skills/orchestrator/SKILL.md +390 -0
- tapps_agents/resources/claude/skills/orchestrator/__init__.py +1 -0
- tapps_agents/resources/claude/skills/planner/SKILL.md +254 -0
- tapps_agents/resources/claude/skills/planner/__init__.py +1 -0
- tapps_agents/resources/claude/skills/reviewer/SKILL.md +434 -0
- tapps_agents/resources/claude/skills/reviewer/__init__.py +1 -0
- tapps_agents/resources/claude/skills/security-review/SKILL.md +31 -0
- tapps_agents/resources/claude/skills/security-review/__init__.py +1 -0
- tapps_agents/resources/claude/skills/simple-mode/SKILL.md +695 -0
- tapps_agents/resources/claude/skills/simple-mode/__init__.py +1 -0
- tapps_agents/resources/claude/skills/tester/SKILL.md +219 -0
- tapps_agents/resources/claude/skills/tester/__init__.py +1 -0
- tapps_agents/resources/cursor/.cursorignore +35 -0
- tapps_agents/resources/cursor/__init__.py +1 -0
- tapps_agents/resources/cursor/commands/__init__.py +1 -0
- tapps_agents/resources/cursor/commands/build-fix.md +11 -0
- tapps_agents/resources/cursor/commands/build.md +11 -0
- tapps_agents/resources/cursor/commands/e2e.md +11 -0
- tapps_agents/resources/cursor/commands/fix.md +11 -0
- tapps_agents/resources/cursor/commands/refactor-clean.md +11 -0
- tapps_agents/resources/cursor/commands/review.md +11 -0
- tapps_agents/resources/cursor/commands/security-review.md +11 -0
- tapps_agents/resources/cursor/commands/tdd.md +11 -0
- tapps_agents/resources/cursor/commands/test-coverage.md +11 -0
- tapps_agents/resources/cursor/commands/test.md +11 -0
- tapps_agents/resources/cursor/commands/update-codemaps.md +10 -0
- tapps_agents/resources/cursor/commands/update-docs.md +11 -0
- tapps_agents/resources/cursor/rules/__init__.py +1 -0
- tapps_agents/resources/cursor/rules/agent-capabilities.mdc +687 -0
- tapps_agents/resources/cursor/rules/coding-style.mdc +31 -0
- tapps_agents/resources/cursor/rules/command-reference.mdc +2081 -0
- tapps_agents/resources/cursor/rules/cursor-mode-usage.mdc +125 -0
- tapps_agents/resources/cursor/rules/git-workflow.mdc +29 -0
- tapps_agents/resources/cursor/rules/performance.mdc +29 -0
- tapps_agents/resources/cursor/rules/project-context.mdc +163 -0
- tapps_agents/resources/cursor/rules/project-profiling.mdc +197 -0
- tapps_agents/resources/cursor/rules/quick-reference.mdc +630 -0
- tapps_agents/resources/cursor/rules/security.mdc +32 -0
- tapps_agents/resources/cursor/rules/simple-mode.mdc +500 -0
- tapps_agents/resources/cursor/rules/testing.mdc +31 -0
- tapps_agents/resources/cursor/rules/when-to-use.mdc +156 -0
- tapps_agents/resources/cursor/rules/workflow-presets.mdc +179 -0
- tapps_agents/resources/customizations/__init__.py +1 -0
- tapps_agents/resources/customizations/example-custom.yaml +83 -0
- tapps_agents/resources/hooks/__init__.py +1 -0
- tapps_agents/resources/hooks/templates/README.md +5 -0
- tapps_agents/resources/hooks/templates/__init__.py +1 -0
- tapps_agents/resources/hooks/templates/add-project-context.yaml +8 -0
- tapps_agents/resources/hooks/templates/auto-format-js.yaml +10 -0
- tapps_agents/resources/hooks/templates/auto-format-python.yaml +10 -0
- tapps_agents/resources/hooks/templates/git-commit-check.yaml +7 -0
- tapps_agents/resources/hooks/templates/notify-on-complete.yaml +8 -0
- tapps_agents/resources/hooks/templates/quality-gate.yaml +8 -0
- tapps_agents/resources/hooks/templates/security-scan-on-edit.yaml +10 -0
- tapps_agents/resources/hooks/templates/session-end-log.yaml +7 -0
- tapps_agents/resources/hooks/templates/show-beads-ready.yaml +8 -0
- tapps_agents/resources/hooks/templates/test-on-edit.yaml +10 -0
- tapps_agents/resources/hooks/templates/update-docs-on-complete.yaml +8 -0
- tapps_agents/resources/hooks/templates/user-prompt-log.yaml +7 -0
- tapps_agents/resources/scripts/__init__.py +1 -0
- tapps_agents/resources/scripts/set_bd_path.ps1 +51 -0
- tapps_agents/resources/workflows/__init__.py +1 -0
- tapps_agents/resources/workflows/presets/__init__.py +1 -0
- tapps_agents/resources/workflows/presets/brownfield-analysis.yaml +235 -0
- tapps_agents/resources/workflows/presets/fix.yaml +78 -0
- tapps_agents/resources/workflows/presets/full-sdlc.yaml +122 -0
- tapps_agents/resources/workflows/presets/quality.yaml +82 -0
- tapps_agents/resources/workflows/presets/rapid-dev.yaml +84 -0
- 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/breakdown_orchestrator.py +49 -49
- tapps_agents/simple_mode/orchestrators/brownfield_orchestrator.py +135 -135
- 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/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_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/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.6.0.dist-info → tapps_agents-3.6.1.dist-info}/METADATA +672 -672
- tapps_agents-3.6.1.dist-info/RECORD +883 -0
- {tapps_agents-3.6.0.dist-info → tapps_agents-3.6.1.dist-info}/licenses/LICENSE +22 -22
- tapps_agents-3.6.0.dist-info/RECORD +0 -758
- {tapps_agents-3.6.0.dist-info → tapps_agents-3.6.1.dist-info}/WHEEL +0 -0
- {tapps_agents-3.6.0.dist-info → tapps_agents-3.6.1.dist-info}/entry_points.txt +0 -0
- {tapps_agents-3.6.0.dist-info → tapps_agents-3.6.1.dist-info}/top_level.txt +0 -0
|
@@ -1,309 +1,309 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Accessibility Auditor using Playwright snapshots.
|
|
3
|
-
|
|
4
|
-
Analyzes accessibility snapshots for WCAG 2.2 compliance and generates
|
|
5
|
-
accessibility test assertions.
|
|
6
|
-
"""
|
|
7
|
-
|
|
8
|
-
from __future__ import annotations
|
|
9
|
-
|
|
10
|
-
import logging
|
|
11
|
-
import re
|
|
12
|
-
from dataclasses import dataclass
|
|
13
|
-
from typing import Any
|
|
14
|
-
|
|
15
|
-
logger = logging.getLogger(__name__)
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
@dataclass
|
|
19
|
-
class AccessibilityIssue:
|
|
20
|
-
"""Accessibility issue found in snapshot."""
|
|
21
|
-
|
|
22
|
-
severity: str # "error", "warning", "info"
|
|
23
|
-
rule: str # WCAG rule identifier
|
|
24
|
-
element: str # Element description
|
|
25
|
-
message: str # Issue description
|
|
26
|
-
suggestion: str # How to fix
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
@dataclass
|
|
30
|
-
class AccessibilityAudit:
|
|
31
|
-
"""Accessibility audit results."""
|
|
32
|
-
|
|
33
|
-
score: float # 0-100 accessibility score
|
|
34
|
-
level: str # "A", "AA", "AAA" compliance level
|
|
35
|
-
issues: list[AccessibilityIssue]
|
|
36
|
-
passed_checks: int
|
|
37
|
-
total_checks: int
|
|
38
|
-
summary: str
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
class AccessibilityAuditor:
|
|
42
|
-
"""
|
|
43
|
-
Audit accessibility using Playwright snapshots.
|
|
44
|
-
|
|
45
|
-
Analyzes accessibility snapshots for WCAG 2.2 compliance.
|
|
46
|
-
"""
|
|
47
|
-
|
|
48
|
-
# WCAG 2.2 Level A requirements
|
|
49
|
-
WCAG_A_CHECKS = [
|
|
50
|
-
("alt_text", "Images must have alt text", r'img.*alt=["\']([^"\']*)["\']'),
|
|
51
|
-
("heading_structure", "Headings must be properly structured", r'<h([1-6])'),
|
|
52
|
-
("form_labels", "Form inputs must have labels", r'<input.*(?:id|aria-labelledby)'),
|
|
53
|
-
("link_text", "Links must have descriptive text", r'<a[^>]*>([^<]+)</a>'),
|
|
54
|
-
("button_text", "Buttons must have accessible text", r'<button[^>]*>([^<]+)</button>'),
|
|
55
|
-
]
|
|
56
|
-
|
|
57
|
-
# WCAG 2.2 Level AA requirements
|
|
58
|
-
WCAG_AA_CHECKS = [
|
|
59
|
-
("color_contrast", "Text must meet color contrast requirements", None),
|
|
60
|
-
("keyboard_navigation", "All interactive elements must be keyboard accessible", None),
|
|
61
|
-
("focus_indicators", "Focus indicators must be visible", None),
|
|
62
|
-
]
|
|
63
|
-
|
|
64
|
-
def audit(self, snapshot_content: str) -> AccessibilityAudit:
|
|
65
|
-
"""
|
|
66
|
-
Analyze accessibility snapshot.
|
|
67
|
-
|
|
68
|
-
Args:
|
|
69
|
-
snapshot_content: Accessibility snapshot markdown content
|
|
70
|
-
|
|
71
|
-
Returns:
|
|
72
|
-
AccessibilityAudit with score and issues
|
|
73
|
-
"""
|
|
74
|
-
issues: list[AccessibilityIssue] = []
|
|
75
|
-
passed_checks = 0
|
|
76
|
-
total_checks = 0
|
|
77
|
-
|
|
78
|
-
# Extract HTML content from snapshot
|
|
79
|
-
html_content = self._extract_html(snapshot_content)
|
|
80
|
-
|
|
81
|
-
# Run WCAG Level A checks
|
|
82
|
-
for check_id, description, pattern in self.WCAG_A_CHECKS:
|
|
83
|
-
total_checks += 1
|
|
84
|
-
issue = self._check_wcag_a(html_content, check_id, description, pattern)
|
|
85
|
-
if issue:
|
|
86
|
-
issues.append(issue)
|
|
87
|
-
else:
|
|
88
|
-
passed_checks += 1
|
|
89
|
-
|
|
90
|
-
# Run WCAG Level AA checks (basic checks)
|
|
91
|
-
for check_id, description, _ in self.WCAG_AA_CHECKS:
|
|
92
|
-
total_checks += 1
|
|
93
|
-
issue = self._check_wcag_aa(html_content, check_id, description)
|
|
94
|
-
if issue:
|
|
95
|
-
issues.append(issue)
|
|
96
|
-
else:
|
|
97
|
-
passed_checks += 1
|
|
98
|
-
|
|
99
|
-
# Calculate score
|
|
100
|
-
score = (passed_checks / total_checks * 100) if total_checks > 0 else 0.0
|
|
101
|
-
|
|
102
|
-
# Determine compliance level
|
|
103
|
-
level = self._determine_level(score, issues)
|
|
104
|
-
|
|
105
|
-
# Generate summary
|
|
106
|
-
summary = self._generate_summary(score, level, len(issues), total_checks)
|
|
107
|
-
|
|
108
|
-
return AccessibilityAudit(
|
|
109
|
-
score=score,
|
|
110
|
-
level=level,
|
|
111
|
-
issues=issues,
|
|
112
|
-
passed_checks=passed_checks,
|
|
113
|
-
total_checks=total_checks,
|
|
114
|
-
summary=summary,
|
|
115
|
-
)
|
|
116
|
-
|
|
117
|
-
def _extract_html(self, snapshot_content: str) -> str:
|
|
118
|
-
"""Extract HTML content from snapshot markdown."""
|
|
119
|
-
# Snapshot may be markdown with HTML code blocks
|
|
120
|
-
html_match = re.search(r"```html\n(.*?)\n```", snapshot_content, re.DOTALL)
|
|
121
|
-
if html_match:
|
|
122
|
-
return html_match.group(1)
|
|
123
|
-
|
|
124
|
-
# Or it might be direct HTML
|
|
125
|
-
if "<html" in snapshot_content or "<div" in snapshot_content:
|
|
126
|
-
return snapshot_content
|
|
127
|
-
|
|
128
|
-
return snapshot_content
|
|
129
|
-
|
|
130
|
-
def _check_wcag_a(
|
|
131
|
-
self, html: str, check_id: str, description: str, pattern: str | None
|
|
132
|
-
) -> AccessibilityIssue | None:
|
|
133
|
-
"""Check WCAG Level A requirement."""
|
|
134
|
-
if check_id == "alt_text":
|
|
135
|
-
# Check for images without alt text
|
|
136
|
-
img_pattern = r'<img[^>]*>'
|
|
137
|
-
images = re.findall(img_pattern, html, re.IGNORECASE)
|
|
138
|
-
for img in images:
|
|
139
|
-
if 'alt=' not in img.lower() and 'aria-label=' not in img.lower():
|
|
140
|
-
return AccessibilityIssue(
|
|
141
|
-
severity="error",
|
|
142
|
-
rule="WCAG 2.2.1.1 (Level A)",
|
|
143
|
-
element=img[:50],
|
|
144
|
-
message="Image missing alt text",
|
|
145
|
-
suggestion="Add alt attribute to img tag: <img alt='description'>",
|
|
146
|
-
)
|
|
147
|
-
|
|
148
|
-
elif check_id == "heading_structure":
|
|
149
|
-
# Check for proper heading hierarchy
|
|
150
|
-
headings = re.findall(r'<h([1-6])', html, re.IGNORECASE)
|
|
151
|
-
if headings:
|
|
152
|
-
levels = [int(h) for h in headings]
|
|
153
|
-
# Check for skipped levels (e.g., h1 -> h3)
|
|
154
|
-
for i in range(len(levels) - 1):
|
|
155
|
-
if levels[i + 1] > levels[i] + 1:
|
|
156
|
-
return AccessibilityIssue(
|
|
157
|
-
severity="warning",
|
|
158
|
-
rule="WCAG 2.4.6 (Level A)",
|
|
159
|
-
element=f"h{levels[i]} -> h{levels[i+1]}",
|
|
160
|
-
message="Heading levels should not be skipped",
|
|
161
|
-
suggestion="Use sequential heading levels (h1, h2, h3, etc.)",
|
|
162
|
-
)
|
|
163
|
-
|
|
164
|
-
elif check_id == "form_labels":
|
|
165
|
-
# Check for form inputs without labels
|
|
166
|
-
inputs = re.findall(r'<input[^>]*>', html, re.IGNORECASE)
|
|
167
|
-
for inp in inputs:
|
|
168
|
-
if 'id=' in inp or 'aria-labelledby=' in inp:
|
|
169
|
-
continue
|
|
170
|
-
if 'aria-label=' in inp:
|
|
171
|
-
continue
|
|
172
|
-
# Check if there's a label element nearby (simplified check)
|
|
173
|
-
return AccessibilityIssue(
|
|
174
|
-
severity="error",
|
|
175
|
-
rule="WCAG 2.4.6 (Level A)",
|
|
176
|
-
element=inp[:50],
|
|
177
|
-
message="Form input missing label",
|
|
178
|
-
suggestion="Add <label> element or aria-label attribute",
|
|
179
|
-
)
|
|
180
|
-
|
|
181
|
-
elif check_id == "link_text":
|
|
182
|
-
# Check for links without descriptive text
|
|
183
|
-
links = re.findall(r'<a[^>]*>([^<]+)</a>', html, re.IGNORECASE)
|
|
184
|
-
for link_text in links:
|
|
185
|
-
link_text = link_text.strip()
|
|
186
|
-
if not link_text or len(link_text) < 3:
|
|
187
|
-
return AccessibilityIssue(
|
|
188
|
-
severity="error",
|
|
189
|
-
rule="WCAG 2.4.4 (Level A)",
|
|
190
|
-
element=f"Link: {link_text}",
|
|
191
|
-
message="Link text is not descriptive",
|
|
192
|
-
suggestion="Use descriptive link text (e.g., 'Read more about accessibility' not 'click here')",
|
|
193
|
-
)
|
|
194
|
-
|
|
195
|
-
elif check_id == "button_text":
|
|
196
|
-
# Check for buttons without text
|
|
197
|
-
buttons = re.findall(r'<button[^>]*>([^<]*)</button>', html, re.IGNORECASE)
|
|
198
|
-
for button_text in buttons:
|
|
199
|
-
button_text = button_text.strip()
|
|
200
|
-
if not button_text:
|
|
201
|
-
return AccessibilityIssue(
|
|
202
|
-
severity="error",
|
|
203
|
-
rule="WCAG 2.4.4 (Level A)",
|
|
204
|
-
element="Button",
|
|
205
|
-
message="Button missing accessible text",
|
|
206
|
-
suggestion="Add text content or aria-label to button",
|
|
207
|
-
)
|
|
208
|
-
|
|
209
|
-
return None
|
|
210
|
-
|
|
211
|
-
def _check_wcag_aa(self, html: str, check_id: str, description: str) -> AccessibilityIssue | None:
|
|
212
|
-
"""Check WCAG Level AA requirement (basic checks)."""
|
|
213
|
-
# These are harder to check from HTML alone, so we do basic checks
|
|
214
|
-
if check_id == "color_contrast":
|
|
215
|
-
# Can't check color contrast from HTML alone
|
|
216
|
-
# This would require actual rendering
|
|
217
|
-
return None # Pass for now (would need visual analysis)
|
|
218
|
-
|
|
219
|
-
elif check_id == "keyboard_navigation":
|
|
220
|
-
# Check for interactive elements that might not be keyboard accessible
|
|
221
|
-
# This is a simplified check
|
|
222
|
-
interactive_elements = re.findall(
|
|
223
|
-
r'<(button|a|input|select|textarea)[^>]*>', html, re.IGNORECASE
|
|
224
|
-
)
|
|
225
|
-
if not interactive_elements:
|
|
226
|
-
return None
|
|
227
|
-
|
|
228
|
-
# Check for tabindex="-1" which makes elements not keyboard accessible
|
|
229
|
-
if 'tabindex="-1"' in html:
|
|
230
|
-
return AccessibilityIssue(
|
|
231
|
-
severity="warning",
|
|
232
|
-
rule="WCAG 2.1.1 (Level A)",
|
|
233
|
-
element="Interactive element",
|
|
234
|
-
message="Some elements may not be keyboard accessible",
|
|
235
|
-
suggestion="Ensure all interactive elements are keyboard accessible",
|
|
236
|
-
)
|
|
237
|
-
|
|
238
|
-
elif check_id == "focus_indicators":
|
|
239
|
-
# Check for CSS that might hide focus indicators
|
|
240
|
-
# This is a simplified check
|
|
241
|
-
if 'outline: none' in html or 'outline: 0' in html:
|
|
242
|
-
return AccessibilityIssue(
|
|
243
|
-
severity="warning",
|
|
244
|
-
rule="WCAG 2.4.7 (Level AA)",
|
|
245
|
-
element="CSS",
|
|
246
|
-
message="Focus indicators may be hidden",
|
|
247
|
-
suggestion="Ensure focus indicators are visible (don't use outline: none without alternative)",
|
|
248
|
-
)
|
|
249
|
-
|
|
250
|
-
return None
|
|
251
|
-
|
|
252
|
-
def _determine_level(self, score: float, issues: list[AccessibilityIssue]) -> str:
|
|
253
|
-
"""Determine WCAG compliance level."""
|
|
254
|
-
error_count = sum(1 for issue in issues if issue.severity == "error")
|
|
255
|
-
warning_count = sum(1 for issue in issues if issue.severity == "warning")
|
|
256
|
-
|
|
257
|
-
if error_count == 0 and warning_count == 0 and score >= 95:
|
|
258
|
-
return "AAA"
|
|
259
|
-
elif error_count == 0 and score >= 90:
|
|
260
|
-
return "AA"
|
|
261
|
-
elif error_count < 3 and score >= 80:
|
|
262
|
-
return "A"
|
|
263
|
-
else:
|
|
264
|
-
return "Not Compliant"
|
|
265
|
-
|
|
266
|
-
def _generate_summary(
|
|
267
|
-
self, score: float, level: str, issue_count: int, total_checks: int
|
|
268
|
-
) -> str:
|
|
269
|
-
"""Generate audit summary."""
|
|
270
|
-
return (
|
|
271
|
-
f"Accessibility Score: {score:.1f}/100\n"
|
|
272
|
-
f"WCAG Compliance: Level {level}\n"
|
|
273
|
-
f"Issues Found: {issue_count} ({total_checks - issue_count} passed)\n"
|
|
274
|
-
f"Total Checks: {total_checks}"
|
|
275
|
-
)
|
|
276
|
-
|
|
277
|
-
def generate_test_assertions(self, audit: AccessibilityAudit) -> list[str]:
|
|
278
|
-
"""
|
|
279
|
-
Generate test assertions from audit results.
|
|
280
|
-
|
|
281
|
-
Args:
|
|
282
|
-
audit: AccessibilityAudit results
|
|
283
|
-
|
|
284
|
-
Returns:
|
|
285
|
-
List of test assertion code strings
|
|
286
|
-
"""
|
|
287
|
-
assertions = []
|
|
288
|
-
|
|
289
|
-
# Overall score assertion
|
|
290
|
-
assertions.append(
|
|
291
|
-
f"assert accessibility_score >= {audit.score:.1f}, "
|
|
292
|
-
f"'Accessibility score {audit.score:.1f} is below threshold'"
|
|
293
|
-
)
|
|
294
|
-
|
|
295
|
-
# Compliance level assertion
|
|
296
|
-
assertions.append(
|
|
297
|
-
f"assert accessibility_level == '{audit.level}', "
|
|
298
|
-
f"'Expected WCAG {audit.level} compliance, got {audit.level}'"
|
|
299
|
-
)
|
|
300
|
-
|
|
301
|
-
# Issue-specific assertions
|
|
302
|
-
for issue in audit.issues:
|
|
303
|
-
if issue.severity == "error":
|
|
304
|
-
assertions.append(
|
|
305
|
-
f"assert not has_accessibility_issue('{issue.rule}'), "
|
|
306
|
-
f"'{issue.message}'"
|
|
307
|
-
)
|
|
308
|
-
|
|
309
|
-
return assertions
|
|
1
|
+
"""
|
|
2
|
+
Accessibility Auditor using Playwright snapshots.
|
|
3
|
+
|
|
4
|
+
Analyzes accessibility snapshots for WCAG 2.2 compliance and generates
|
|
5
|
+
accessibility test assertions.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
import logging
|
|
11
|
+
import re
|
|
12
|
+
from dataclasses import dataclass
|
|
13
|
+
from typing import Any
|
|
14
|
+
|
|
15
|
+
logger = logging.getLogger(__name__)
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
@dataclass
|
|
19
|
+
class AccessibilityIssue:
|
|
20
|
+
"""Accessibility issue found in snapshot."""
|
|
21
|
+
|
|
22
|
+
severity: str # "error", "warning", "info"
|
|
23
|
+
rule: str # WCAG rule identifier
|
|
24
|
+
element: str # Element description
|
|
25
|
+
message: str # Issue description
|
|
26
|
+
suggestion: str # How to fix
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
@dataclass
|
|
30
|
+
class AccessibilityAudit:
|
|
31
|
+
"""Accessibility audit results."""
|
|
32
|
+
|
|
33
|
+
score: float # 0-100 accessibility score
|
|
34
|
+
level: str # "A", "AA", "AAA" compliance level
|
|
35
|
+
issues: list[AccessibilityIssue]
|
|
36
|
+
passed_checks: int
|
|
37
|
+
total_checks: int
|
|
38
|
+
summary: str
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
class AccessibilityAuditor:
|
|
42
|
+
"""
|
|
43
|
+
Audit accessibility using Playwright snapshots.
|
|
44
|
+
|
|
45
|
+
Analyzes accessibility snapshots for WCAG 2.2 compliance.
|
|
46
|
+
"""
|
|
47
|
+
|
|
48
|
+
# WCAG 2.2 Level A requirements
|
|
49
|
+
WCAG_A_CHECKS = [
|
|
50
|
+
("alt_text", "Images must have alt text", r'img.*alt=["\']([^"\']*)["\']'),
|
|
51
|
+
("heading_structure", "Headings must be properly structured", r'<h([1-6])'),
|
|
52
|
+
("form_labels", "Form inputs must have labels", r'<input.*(?:id|aria-labelledby)'),
|
|
53
|
+
("link_text", "Links must have descriptive text", r'<a[^>]*>([^<]+)</a>'),
|
|
54
|
+
("button_text", "Buttons must have accessible text", r'<button[^>]*>([^<]+)</button>'),
|
|
55
|
+
]
|
|
56
|
+
|
|
57
|
+
# WCAG 2.2 Level AA requirements
|
|
58
|
+
WCAG_AA_CHECKS = [
|
|
59
|
+
("color_contrast", "Text must meet color contrast requirements", None),
|
|
60
|
+
("keyboard_navigation", "All interactive elements must be keyboard accessible", None),
|
|
61
|
+
("focus_indicators", "Focus indicators must be visible", None),
|
|
62
|
+
]
|
|
63
|
+
|
|
64
|
+
def audit(self, snapshot_content: str) -> AccessibilityAudit:
|
|
65
|
+
"""
|
|
66
|
+
Analyze accessibility snapshot.
|
|
67
|
+
|
|
68
|
+
Args:
|
|
69
|
+
snapshot_content: Accessibility snapshot markdown content
|
|
70
|
+
|
|
71
|
+
Returns:
|
|
72
|
+
AccessibilityAudit with score and issues
|
|
73
|
+
"""
|
|
74
|
+
issues: list[AccessibilityIssue] = []
|
|
75
|
+
passed_checks = 0
|
|
76
|
+
total_checks = 0
|
|
77
|
+
|
|
78
|
+
# Extract HTML content from snapshot
|
|
79
|
+
html_content = self._extract_html(snapshot_content)
|
|
80
|
+
|
|
81
|
+
# Run WCAG Level A checks
|
|
82
|
+
for check_id, description, pattern in self.WCAG_A_CHECKS:
|
|
83
|
+
total_checks += 1
|
|
84
|
+
issue = self._check_wcag_a(html_content, check_id, description, pattern)
|
|
85
|
+
if issue:
|
|
86
|
+
issues.append(issue)
|
|
87
|
+
else:
|
|
88
|
+
passed_checks += 1
|
|
89
|
+
|
|
90
|
+
# Run WCAG Level AA checks (basic checks)
|
|
91
|
+
for check_id, description, _ in self.WCAG_AA_CHECKS:
|
|
92
|
+
total_checks += 1
|
|
93
|
+
issue = self._check_wcag_aa(html_content, check_id, description)
|
|
94
|
+
if issue:
|
|
95
|
+
issues.append(issue)
|
|
96
|
+
else:
|
|
97
|
+
passed_checks += 1
|
|
98
|
+
|
|
99
|
+
# Calculate score
|
|
100
|
+
score = (passed_checks / total_checks * 100) if total_checks > 0 else 0.0
|
|
101
|
+
|
|
102
|
+
# Determine compliance level
|
|
103
|
+
level = self._determine_level(score, issues)
|
|
104
|
+
|
|
105
|
+
# Generate summary
|
|
106
|
+
summary = self._generate_summary(score, level, len(issues), total_checks)
|
|
107
|
+
|
|
108
|
+
return AccessibilityAudit(
|
|
109
|
+
score=score,
|
|
110
|
+
level=level,
|
|
111
|
+
issues=issues,
|
|
112
|
+
passed_checks=passed_checks,
|
|
113
|
+
total_checks=total_checks,
|
|
114
|
+
summary=summary,
|
|
115
|
+
)
|
|
116
|
+
|
|
117
|
+
def _extract_html(self, snapshot_content: str) -> str:
|
|
118
|
+
"""Extract HTML content from snapshot markdown."""
|
|
119
|
+
# Snapshot may be markdown with HTML code blocks
|
|
120
|
+
html_match = re.search(r"```html\n(.*?)\n```", snapshot_content, re.DOTALL)
|
|
121
|
+
if html_match:
|
|
122
|
+
return html_match.group(1)
|
|
123
|
+
|
|
124
|
+
# Or it might be direct HTML
|
|
125
|
+
if "<html" in snapshot_content or "<div" in snapshot_content:
|
|
126
|
+
return snapshot_content
|
|
127
|
+
|
|
128
|
+
return snapshot_content
|
|
129
|
+
|
|
130
|
+
def _check_wcag_a(
|
|
131
|
+
self, html: str, check_id: str, description: str, pattern: str | None
|
|
132
|
+
) -> AccessibilityIssue | None:
|
|
133
|
+
"""Check WCAG Level A requirement."""
|
|
134
|
+
if check_id == "alt_text":
|
|
135
|
+
# Check for images without alt text
|
|
136
|
+
img_pattern = r'<img[^>]*>'
|
|
137
|
+
images = re.findall(img_pattern, html, re.IGNORECASE)
|
|
138
|
+
for img in images:
|
|
139
|
+
if 'alt=' not in img.lower() and 'aria-label=' not in img.lower():
|
|
140
|
+
return AccessibilityIssue(
|
|
141
|
+
severity="error",
|
|
142
|
+
rule="WCAG 2.2.1.1 (Level A)",
|
|
143
|
+
element=img[:50],
|
|
144
|
+
message="Image missing alt text",
|
|
145
|
+
suggestion="Add alt attribute to img tag: <img alt='description'>",
|
|
146
|
+
)
|
|
147
|
+
|
|
148
|
+
elif check_id == "heading_structure":
|
|
149
|
+
# Check for proper heading hierarchy
|
|
150
|
+
headings = re.findall(r'<h([1-6])', html, re.IGNORECASE)
|
|
151
|
+
if headings:
|
|
152
|
+
levels = [int(h) for h in headings]
|
|
153
|
+
# Check for skipped levels (e.g., h1 -> h3)
|
|
154
|
+
for i in range(len(levels) - 1):
|
|
155
|
+
if levels[i + 1] > levels[i] + 1:
|
|
156
|
+
return AccessibilityIssue(
|
|
157
|
+
severity="warning",
|
|
158
|
+
rule="WCAG 2.4.6 (Level A)",
|
|
159
|
+
element=f"h{levels[i]} -> h{levels[i+1]}",
|
|
160
|
+
message="Heading levels should not be skipped",
|
|
161
|
+
suggestion="Use sequential heading levels (h1, h2, h3, etc.)",
|
|
162
|
+
)
|
|
163
|
+
|
|
164
|
+
elif check_id == "form_labels":
|
|
165
|
+
# Check for form inputs without labels
|
|
166
|
+
inputs = re.findall(r'<input[^>]*>', html, re.IGNORECASE)
|
|
167
|
+
for inp in inputs:
|
|
168
|
+
if 'id=' in inp or 'aria-labelledby=' in inp:
|
|
169
|
+
continue
|
|
170
|
+
if 'aria-label=' in inp:
|
|
171
|
+
continue
|
|
172
|
+
# Check if there's a label element nearby (simplified check)
|
|
173
|
+
return AccessibilityIssue(
|
|
174
|
+
severity="error",
|
|
175
|
+
rule="WCAG 2.4.6 (Level A)",
|
|
176
|
+
element=inp[:50],
|
|
177
|
+
message="Form input missing label",
|
|
178
|
+
suggestion="Add <label> element or aria-label attribute",
|
|
179
|
+
)
|
|
180
|
+
|
|
181
|
+
elif check_id == "link_text":
|
|
182
|
+
# Check for links without descriptive text
|
|
183
|
+
links = re.findall(r'<a[^>]*>([^<]+)</a>', html, re.IGNORECASE)
|
|
184
|
+
for link_text in links:
|
|
185
|
+
link_text = link_text.strip()
|
|
186
|
+
if not link_text or len(link_text) < 3:
|
|
187
|
+
return AccessibilityIssue(
|
|
188
|
+
severity="error",
|
|
189
|
+
rule="WCAG 2.4.4 (Level A)",
|
|
190
|
+
element=f"Link: {link_text}",
|
|
191
|
+
message="Link text is not descriptive",
|
|
192
|
+
suggestion="Use descriptive link text (e.g., 'Read more about accessibility' not 'click here')",
|
|
193
|
+
)
|
|
194
|
+
|
|
195
|
+
elif check_id == "button_text":
|
|
196
|
+
# Check for buttons without text
|
|
197
|
+
buttons = re.findall(r'<button[^>]*>([^<]*)</button>', html, re.IGNORECASE)
|
|
198
|
+
for button_text in buttons:
|
|
199
|
+
button_text = button_text.strip()
|
|
200
|
+
if not button_text:
|
|
201
|
+
return AccessibilityIssue(
|
|
202
|
+
severity="error",
|
|
203
|
+
rule="WCAG 2.4.4 (Level A)",
|
|
204
|
+
element="Button",
|
|
205
|
+
message="Button missing accessible text",
|
|
206
|
+
suggestion="Add text content or aria-label to button",
|
|
207
|
+
)
|
|
208
|
+
|
|
209
|
+
return None
|
|
210
|
+
|
|
211
|
+
def _check_wcag_aa(self, html: str, check_id: str, description: str) -> AccessibilityIssue | None:
|
|
212
|
+
"""Check WCAG Level AA requirement (basic checks)."""
|
|
213
|
+
# These are harder to check from HTML alone, so we do basic checks
|
|
214
|
+
if check_id == "color_contrast":
|
|
215
|
+
# Can't check color contrast from HTML alone
|
|
216
|
+
# This would require actual rendering
|
|
217
|
+
return None # Pass for now (would need visual analysis)
|
|
218
|
+
|
|
219
|
+
elif check_id == "keyboard_navigation":
|
|
220
|
+
# Check for interactive elements that might not be keyboard accessible
|
|
221
|
+
# This is a simplified check
|
|
222
|
+
interactive_elements = re.findall(
|
|
223
|
+
r'<(button|a|input|select|textarea)[^>]*>', html, re.IGNORECASE
|
|
224
|
+
)
|
|
225
|
+
if not interactive_elements:
|
|
226
|
+
return None
|
|
227
|
+
|
|
228
|
+
# Check for tabindex="-1" which makes elements not keyboard accessible
|
|
229
|
+
if 'tabindex="-1"' in html:
|
|
230
|
+
return AccessibilityIssue(
|
|
231
|
+
severity="warning",
|
|
232
|
+
rule="WCAG 2.1.1 (Level A)",
|
|
233
|
+
element="Interactive element",
|
|
234
|
+
message="Some elements may not be keyboard accessible",
|
|
235
|
+
suggestion="Ensure all interactive elements are keyboard accessible",
|
|
236
|
+
)
|
|
237
|
+
|
|
238
|
+
elif check_id == "focus_indicators":
|
|
239
|
+
# Check for CSS that might hide focus indicators
|
|
240
|
+
# This is a simplified check
|
|
241
|
+
if 'outline: none' in html or 'outline: 0' in html:
|
|
242
|
+
return AccessibilityIssue(
|
|
243
|
+
severity="warning",
|
|
244
|
+
rule="WCAG 2.4.7 (Level AA)",
|
|
245
|
+
element="CSS",
|
|
246
|
+
message="Focus indicators may be hidden",
|
|
247
|
+
suggestion="Ensure focus indicators are visible (don't use outline: none without alternative)",
|
|
248
|
+
)
|
|
249
|
+
|
|
250
|
+
return None
|
|
251
|
+
|
|
252
|
+
def _determine_level(self, score: float, issues: list[AccessibilityIssue]) -> str:
|
|
253
|
+
"""Determine WCAG compliance level."""
|
|
254
|
+
error_count = sum(1 for issue in issues if issue.severity == "error")
|
|
255
|
+
warning_count = sum(1 for issue in issues if issue.severity == "warning")
|
|
256
|
+
|
|
257
|
+
if error_count == 0 and warning_count == 0 and score >= 95:
|
|
258
|
+
return "AAA"
|
|
259
|
+
elif error_count == 0 and score >= 90:
|
|
260
|
+
return "AA"
|
|
261
|
+
elif error_count < 3 and score >= 80:
|
|
262
|
+
return "A"
|
|
263
|
+
else:
|
|
264
|
+
return "Not Compliant"
|
|
265
|
+
|
|
266
|
+
def _generate_summary(
|
|
267
|
+
self, score: float, level: str, issue_count: int, total_checks: int
|
|
268
|
+
) -> str:
|
|
269
|
+
"""Generate audit summary."""
|
|
270
|
+
return (
|
|
271
|
+
f"Accessibility Score: {score:.1f}/100\n"
|
|
272
|
+
f"WCAG Compliance: Level {level}\n"
|
|
273
|
+
f"Issues Found: {issue_count} ({total_checks - issue_count} passed)\n"
|
|
274
|
+
f"Total Checks: {total_checks}"
|
|
275
|
+
)
|
|
276
|
+
|
|
277
|
+
def generate_test_assertions(self, audit: AccessibilityAudit) -> list[str]:
|
|
278
|
+
"""
|
|
279
|
+
Generate test assertions from audit results.
|
|
280
|
+
|
|
281
|
+
Args:
|
|
282
|
+
audit: AccessibilityAudit results
|
|
283
|
+
|
|
284
|
+
Returns:
|
|
285
|
+
List of test assertion code strings
|
|
286
|
+
"""
|
|
287
|
+
assertions = []
|
|
288
|
+
|
|
289
|
+
# Overall score assertion
|
|
290
|
+
assertions.append(
|
|
291
|
+
f"assert accessibility_score >= {audit.score:.1f}, "
|
|
292
|
+
f"'Accessibility score {audit.score:.1f} is below threshold'"
|
|
293
|
+
)
|
|
294
|
+
|
|
295
|
+
# Compliance level assertion
|
|
296
|
+
assertions.append(
|
|
297
|
+
f"assert accessibility_level == '{audit.level}', "
|
|
298
|
+
f"'Expected WCAG {audit.level} compliance, got {audit.level}'"
|
|
299
|
+
)
|
|
300
|
+
|
|
301
|
+
# Issue-specific assertions
|
|
302
|
+
for issue in audit.issues:
|
|
303
|
+
if issue.severity == "error":
|
|
304
|
+
assertions.append(
|
|
305
|
+
f"assert not has_accessibility_issue('{issue.rule}'), "
|
|
306
|
+
f"'{issue.message}'"
|
|
307
|
+
)
|
|
308
|
+
|
|
309
|
+
return assertions
|