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,638 +1,638 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Visual Designer Agent - Enhanced designer with visual feedback and iterative refinement.
|
|
3
|
-
"""
|
|
4
|
-
|
|
5
|
-
import logging
|
|
6
|
-
from collections.abc import Awaitable, Callable
|
|
7
|
-
from dataclasses import dataclass
|
|
8
|
-
from pathlib import Path
|
|
9
|
-
from typing import Any
|
|
10
|
-
|
|
11
|
-
from ...core.browser_controller import BrowserController, BrowserType
|
|
12
|
-
from ...core.hardware_profiler import HardwareProfile, HardwareProfiler
|
|
13
|
-
from ...core.visual_feedback import (
|
|
14
|
-
UIComparator,
|
|
15
|
-
VisualAnalyzer,
|
|
16
|
-
VisualElement,
|
|
17
|
-
VisualElementType,
|
|
18
|
-
VisualFeedback,
|
|
19
|
-
VisualFeedbackCollector,
|
|
20
|
-
VisualPatternLearner,
|
|
21
|
-
)
|
|
22
|
-
from .agent import DesignerAgent
|
|
23
|
-
|
|
24
|
-
logger = logging.getLogger(__name__)
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
@dataclass
|
|
28
|
-
class IterationResult:
|
|
29
|
-
"""Result of a single iteration."""
|
|
30
|
-
|
|
31
|
-
iteration: int
|
|
32
|
-
html_content: str
|
|
33
|
-
feedback: VisualFeedback
|
|
34
|
-
quality_score: float
|
|
35
|
-
improvements: list[str]
|
|
36
|
-
regressions: list[str]
|
|
37
|
-
should_continue: bool
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
@dataclass
|
|
41
|
-
class RefinementConfig:
|
|
42
|
-
"""Configuration for iterative refinement."""
|
|
43
|
-
|
|
44
|
-
max_iterations: int = 5
|
|
45
|
-
quality_threshold: float = 0.8
|
|
46
|
-
min_improvement: float = 0.05 # Minimum improvement to continue
|
|
47
|
-
screenshot_dir: str | None = None
|
|
48
|
-
enable_accessibility_check: bool = True
|
|
49
|
-
enable_layout_analysis: bool = True
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
class IterativeRefinement:
|
|
53
|
-
"""Manages iterative UI refinement loop."""
|
|
54
|
-
|
|
55
|
-
def __init__(
|
|
56
|
-
self,
|
|
57
|
-
hardware_profile: HardwareProfile | None = None,
|
|
58
|
-
config: RefinementConfig | None = None,
|
|
59
|
-
):
|
|
60
|
-
"""
|
|
61
|
-
Initialize iterative refinement.
|
|
62
|
-
|
|
63
|
-
Args:
|
|
64
|
-
hardware_profile: Hardware profile for optimization
|
|
65
|
-
config: Refinement configuration
|
|
66
|
-
"""
|
|
67
|
-
self.hardware_profile = hardware_profile or HardwareProfiler().detect_profile()
|
|
68
|
-
self.config = config or RefinementConfig()
|
|
69
|
-
|
|
70
|
-
self.feedback_collector = VisualFeedbackCollector(
|
|
71
|
-
hardware_profile=self.hardware_profile
|
|
72
|
-
)
|
|
73
|
-
self.visual_analyzer = VisualAnalyzer(hardware_profile=self.hardware_profile)
|
|
74
|
-
self.ui_comparator = UIComparator()
|
|
75
|
-
self.pattern_learner = VisualPatternLearner()
|
|
76
|
-
|
|
77
|
-
self.browser_controller: BrowserController | None = None
|
|
78
|
-
self.iteration_history: list[IterationResult] = []
|
|
79
|
-
|
|
80
|
-
def start_browser(self) -> bool:
|
|
81
|
-
"""Start browser controller."""
|
|
82
|
-
if self.browser_controller is None:
|
|
83
|
-
self.browser_controller = BrowserController(
|
|
84
|
-
hardware_profile=self.hardware_profile,
|
|
85
|
-
browser_type=BrowserType.CHROMIUM,
|
|
86
|
-
headless=True,
|
|
87
|
-
)
|
|
88
|
-
return self.browser_controller.start()
|
|
89
|
-
|
|
90
|
-
def stop_browser(self):
|
|
91
|
-
"""Stop browser controller."""
|
|
92
|
-
if self.browser_controller:
|
|
93
|
-
self.browser_controller.stop()
|
|
94
|
-
self.browser_controller = None
|
|
95
|
-
|
|
96
|
-
def _load_and_capture_iteration(
|
|
97
|
-
self, current_html: str, iteration: int
|
|
98
|
-
) -> tuple[bool, str | None]:
|
|
99
|
-
"""Load HTML in browser and capture screenshot."""
|
|
100
|
-
browser_controller = self.browser_controller
|
|
101
|
-
if not browser_controller:
|
|
102
|
-
return False, None
|
|
103
|
-
|
|
104
|
-
# Load HTML in browser
|
|
105
|
-
if not browser_controller.load_html(current_html):
|
|
106
|
-
logger.error(f"Failed to load HTML in iteration {iteration}")
|
|
107
|
-
return False, None
|
|
108
|
-
|
|
109
|
-
# Capture screenshot
|
|
110
|
-
screenshot_path = None
|
|
111
|
-
if self.config.screenshot_dir:
|
|
112
|
-
screenshot_path = str(
|
|
113
|
-
Path(self.config.screenshot_dir) / f"iteration_{iteration}.png"
|
|
114
|
-
)
|
|
115
|
-
browser_controller.capture_screenshot(screenshot_path)
|
|
116
|
-
|
|
117
|
-
return True, screenshot_path
|
|
118
|
-
|
|
119
|
-
def _analyze_ui_quality(
|
|
120
|
-
self, current_html: str, visual_elements: list[VisualElement], requirements: dict[str, Any]
|
|
121
|
-
) -> tuple[Any, Any, float]:
|
|
122
|
-
"""Analyze layout, accessibility, and calculate quality score."""
|
|
123
|
-
# Analyze layout
|
|
124
|
-
layout_metrics = None
|
|
125
|
-
if self.config.enable_layout_analysis:
|
|
126
|
-
layout_metrics = self.visual_analyzer.analyze_layout(
|
|
127
|
-
visual_elements, design_spec=requirements.get("design_spec")
|
|
128
|
-
)
|
|
129
|
-
|
|
130
|
-
# Analyze accessibility
|
|
131
|
-
accessibility_metrics = None
|
|
132
|
-
if self.config.enable_accessibility_check:
|
|
133
|
-
accessibility_metrics = self.visual_analyzer.analyze_accessibility(
|
|
134
|
-
visual_elements, html_content=current_html
|
|
135
|
-
)
|
|
136
|
-
|
|
137
|
-
# Calculate quality score
|
|
138
|
-
quality_score = 0.0
|
|
139
|
-
if layout_metrics and accessibility_metrics:
|
|
140
|
-
quality_score = self.visual_analyzer.calculate_quality_score(
|
|
141
|
-
layout_metrics, accessibility_metrics
|
|
142
|
-
)
|
|
143
|
-
elif layout_metrics:
|
|
144
|
-
# Simplified score if only layout available
|
|
145
|
-
quality_score = (
|
|
146
|
-
layout_metrics.spacing_consistency * 0.2
|
|
147
|
-
+ layout_metrics.alignment_score * 0.2
|
|
148
|
-
+ layout_metrics.visual_hierarchy * 0.2
|
|
149
|
-
+ layout_metrics.whitespace_balance * 0.2
|
|
150
|
-
+ layout_metrics.grid_consistency * 0.2
|
|
151
|
-
)
|
|
152
|
-
|
|
153
|
-
return layout_metrics, accessibility_metrics, quality_score
|
|
154
|
-
|
|
155
|
-
def _generate_ui_suggestions(
|
|
156
|
-
self, layout_metrics: Any, accessibility_metrics: Any
|
|
157
|
-
) -> list[str]:
|
|
158
|
-
"""Generate suggestions based on layout and accessibility metrics."""
|
|
159
|
-
suggestions = []
|
|
160
|
-
if layout_metrics:
|
|
161
|
-
if layout_metrics.spacing_consistency < 0.7:
|
|
162
|
-
suggestions.append("Improve spacing consistency")
|
|
163
|
-
if layout_metrics.alignment_score < 0.7:
|
|
164
|
-
suggestions.append("Improve element alignment")
|
|
165
|
-
if layout_metrics.visual_hierarchy < 0.7:
|
|
166
|
-
suggestions.append("Enhance visual hierarchy")
|
|
167
|
-
|
|
168
|
-
if accessibility_metrics:
|
|
169
|
-
if not accessibility_metrics.aria_labels_present:
|
|
170
|
-
suggestions.append("Add ARIA labels for screen readers")
|
|
171
|
-
if not accessibility_metrics.focus_indicators_present:
|
|
172
|
-
suggestions.append("Add focus indicators for keyboard navigation")
|
|
173
|
-
if accessibility_metrics.color_contrast_score < 0.7:
|
|
174
|
-
suggestions.append("Improve color contrast")
|
|
175
|
-
|
|
176
|
-
return suggestions
|
|
177
|
-
|
|
178
|
-
def _compare_with_previous_iteration(
|
|
179
|
-
self, iteration: int, feedback: VisualFeedback
|
|
180
|
-
) -> tuple[list[str], list[str]]:
|
|
181
|
-
"""Compare current iteration with previous iteration."""
|
|
182
|
-
improvements = []
|
|
183
|
-
regressions = []
|
|
184
|
-
if iteration > 1:
|
|
185
|
-
previous_feedback = self.feedback_collector.get_feedback_history(limit=1)[0]
|
|
186
|
-
comparison = self.ui_comparator.compare_iterations(previous_feedback, feedback)
|
|
187
|
-
improvements = comparison["improvements"]
|
|
188
|
-
regressions = comparison["regressions"]
|
|
189
|
-
return improvements, regressions
|
|
190
|
-
|
|
191
|
-
def _create_iteration_result(
|
|
192
|
-
self,
|
|
193
|
-
iteration: int,
|
|
194
|
-
current_html: str,
|
|
195
|
-
feedback: VisualFeedback,
|
|
196
|
-
quality_score: float,
|
|
197
|
-
improvements: list[str],
|
|
198
|
-
regressions: list[str],
|
|
199
|
-
) -> IterationResult:
|
|
200
|
-
"""Create iteration result."""
|
|
201
|
-
return IterationResult(
|
|
202
|
-
iteration=iteration,
|
|
203
|
-
html_content=current_html,
|
|
204
|
-
feedback=feedback,
|
|
205
|
-
quality_score=quality_score,
|
|
206
|
-
improvements=improvements,
|
|
207
|
-
regressions=regressions,
|
|
208
|
-
should_continue=self._should_continue_iteration(
|
|
209
|
-
quality_score, improvements, iteration
|
|
210
|
-
),
|
|
211
|
-
)
|
|
212
|
-
|
|
213
|
-
async def _refine_html_if_needed(
|
|
214
|
-
self,
|
|
215
|
-
current_html: str,
|
|
216
|
-
feedback: VisualFeedback,
|
|
217
|
-
suggestions: list[str],
|
|
218
|
-
requirements: dict[str, Any],
|
|
219
|
-
refinement_callback: (
|
|
220
|
-
Callable[[str, VisualFeedback, list[str], dict[str, Any]], Awaitable[str]]
|
|
221
|
-
| None
|
|
222
|
-
),
|
|
223
|
-
) -> tuple[str, bool]:
|
|
224
|
-
"""Refine HTML using callback if provided."""
|
|
225
|
-
if not refinement_callback:
|
|
226
|
-
return current_html, False
|
|
227
|
-
|
|
228
|
-
try:
|
|
229
|
-
refined_html = await refinement_callback(
|
|
230
|
-
current_html, feedback, suggestions, requirements
|
|
231
|
-
)
|
|
232
|
-
if refined_html and refined_html != current_html:
|
|
233
|
-
return refined_html, True
|
|
234
|
-
else:
|
|
235
|
-
logger.warning("Refinement callback did not produce new HTML")
|
|
236
|
-
return current_html, False
|
|
237
|
-
except Exception as e:
|
|
238
|
-
logger.error(f"Refinement callback failed: {e}")
|
|
239
|
-
return current_html, False
|
|
240
|
-
|
|
241
|
-
async def refine_ui(
|
|
242
|
-
self,
|
|
243
|
-
initial_html: str,
|
|
244
|
-
requirements: dict[str, Any],
|
|
245
|
-
refinement_callback: (
|
|
246
|
-
Callable[[str, VisualFeedback, list[str], dict[str, Any]], Awaitable[str]]
|
|
247
|
-
| None
|
|
248
|
-
) = None,
|
|
249
|
-
) -> IterationResult | None:
|
|
250
|
-
"""
|
|
251
|
-
Refine UI through iterative feedback loop.
|
|
252
|
-
|
|
253
|
-
Args:
|
|
254
|
-
initial_html: Initial HTML content
|
|
255
|
-
requirements: Design requirements
|
|
256
|
-
refinement_callback: Optional callback to generate refined HTML
|
|
257
|
-
|
|
258
|
-
Returns:
|
|
259
|
-
Final iteration result
|
|
260
|
-
"""
|
|
261
|
-
if not self.browser_controller:
|
|
262
|
-
if not self.start_browser():
|
|
263
|
-
logger.error("Failed to start browser")
|
|
264
|
-
return None
|
|
265
|
-
# start_browser() initializes browser_controller on success
|
|
266
|
-
if self.browser_controller is None:
|
|
267
|
-
logger.error("Browser controller is not available after start")
|
|
268
|
-
return None
|
|
269
|
-
|
|
270
|
-
current_html = initial_html
|
|
271
|
-
iteration = 0
|
|
272
|
-
|
|
273
|
-
while iteration < self.config.max_iterations:
|
|
274
|
-
iteration += 1
|
|
275
|
-
logger.info(f"Starting iteration {iteration}")
|
|
276
|
-
|
|
277
|
-
# Load HTML and capture screenshot
|
|
278
|
-
success, screenshot_path = self._load_and_capture_iteration(
|
|
279
|
-
current_html, iteration
|
|
280
|
-
)
|
|
281
|
-
if not success:
|
|
282
|
-
break
|
|
283
|
-
|
|
284
|
-
# Extract visual elements
|
|
285
|
-
visual_elements = self._extract_visual_elements(current_html)
|
|
286
|
-
|
|
287
|
-
# Analyze UI quality
|
|
288
|
-
layout_metrics, accessibility_metrics, quality_score = (
|
|
289
|
-
self._analyze_ui_quality(current_html, visual_elements, requirements)
|
|
290
|
-
)
|
|
291
|
-
|
|
292
|
-
# Collect feedback
|
|
293
|
-
feedback = self.feedback_collector.collect_feedback(
|
|
294
|
-
iteration=iteration,
|
|
295
|
-
screenshot_path=screenshot_path,
|
|
296
|
-
visual_elements=visual_elements,
|
|
297
|
-
metadata={"html_length": len(current_html)},
|
|
298
|
-
)
|
|
299
|
-
feedback.layout_metrics = layout_metrics
|
|
300
|
-
feedback.accessibility_metrics = accessibility_metrics
|
|
301
|
-
feedback.quality_score = quality_score
|
|
302
|
-
|
|
303
|
-
# Generate suggestions
|
|
304
|
-
suggestions = self._generate_ui_suggestions(
|
|
305
|
-
layout_metrics, accessibility_metrics
|
|
306
|
-
)
|
|
307
|
-
feedback.suggestions = suggestions
|
|
308
|
-
feedback.issues = (layout_metrics.issues if layout_metrics else []) + (
|
|
309
|
-
accessibility_metrics.issues if accessibility_metrics else []
|
|
310
|
-
)
|
|
311
|
-
|
|
312
|
-
# Compare with previous iteration
|
|
313
|
-
improvements, regressions = self._compare_with_previous_iteration(
|
|
314
|
-
iteration, feedback
|
|
315
|
-
)
|
|
316
|
-
|
|
317
|
-
# Learn from feedback
|
|
318
|
-
self.pattern_learner.learn_from_feedback(feedback)
|
|
319
|
-
|
|
320
|
-
# Create iteration result
|
|
321
|
-
result = self._create_iteration_result(
|
|
322
|
-
iteration,
|
|
323
|
-
current_html,
|
|
324
|
-
feedback,
|
|
325
|
-
quality_score,
|
|
326
|
-
improvements,
|
|
327
|
-
regressions,
|
|
328
|
-
)
|
|
329
|
-
|
|
330
|
-
self.iteration_history.append(result)
|
|
331
|
-
|
|
332
|
-
logger.info(f"Iteration {iteration} complete. Quality: {quality_score:.2f}")
|
|
333
|
-
|
|
334
|
-
# Check if we should continue
|
|
335
|
-
if not result.should_continue:
|
|
336
|
-
logger.info(
|
|
337
|
-
"Stopping refinement. Quality threshold met or max iterations reached."
|
|
338
|
-
)
|
|
339
|
-
break
|
|
340
|
-
|
|
341
|
-
# Generate refined HTML if callback provided
|
|
342
|
-
refined_html, should_continue = await self._refine_html_if_needed(
|
|
343
|
-
current_html, feedback, suggestions, requirements, refinement_callback
|
|
344
|
-
)
|
|
345
|
-
if not should_continue:
|
|
346
|
-
break
|
|
347
|
-
current_html = refined_html
|
|
348
|
-
|
|
349
|
-
return self.iteration_history[-1] if self.iteration_history else None
|
|
350
|
-
|
|
351
|
-
def _should_continue_iteration(
|
|
352
|
-
self, quality_score: float, improvements: list[str], iteration: int
|
|
353
|
-
) -> bool:
|
|
354
|
-
"""
|
|
355
|
-
Determine if refinement should continue.
|
|
356
|
-
|
|
357
|
-
Args:
|
|
358
|
-
quality_score: Current quality score
|
|
359
|
-
improvements: List of improvements from comparison
|
|
360
|
-
iteration: Current iteration number
|
|
361
|
-
|
|
362
|
-
Returns:
|
|
363
|
-
True if should continue, False otherwise
|
|
364
|
-
"""
|
|
365
|
-
# Stop if max iterations reached
|
|
366
|
-
if iteration >= self.config.max_iterations:
|
|
367
|
-
return False
|
|
368
|
-
|
|
369
|
-
# Stop if quality threshold met
|
|
370
|
-
if quality_score >= self.config.quality_threshold:
|
|
371
|
-
return False
|
|
372
|
-
|
|
373
|
-
# Stop if no improvements and quality is not improving
|
|
374
|
-
if iteration > 1 and len(improvements) == 0:
|
|
375
|
-
# Check if quality is improving
|
|
376
|
-
if len(self.iteration_history) >= 2:
|
|
377
|
-
prev_score = self.iteration_history[-2].quality_score
|
|
378
|
-
if quality_score - prev_score < self.config.min_improvement:
|
|
379
|
-
return False
|
|
380
|
-
|
|
381
|
-
return True
|
|
382
|
-
|
|
383
|
-
def _extract_visual_elements(self, html_content: str) -> list[VisualElement]:
|
|
384
|
-
"""
|
|
385
|
-
Extract visual elements from HTML (simplified).
|
|
386
|
-
|
|
387
|
-
In a real implementation, this would parse the DOM and extract
|
|
388
|
-
actual element positions, sizes, and styles.
|
|
389
|
-
|
|
390
|
-
Args:
|
|
391
|
-
html_content: HTML content
|
|
392
|
-
|
|
393
|
-
Returns:
|
|
394
|
-
List of visual elements
|
|
395
|
-
"""
|
|
396
|
-
# Simplified extraction - would use actual DOM parsing
|
|
397
|
-
elements = []
|
|
398
|
-
|
|
399
|
-
# Count common elements
|
|
400
|
-
button_count = html_content.count("<button") + html_content.count("<Button")
|
|
401
|
-
input_count = html_content.count("<input") + html_content.count("<Input")
|
|
402
|
-
text_count = (
|
|
403
|
-
html_content.count("<p")
|
|
404
|
-
+ html_content.count("<h1")
|
|
405
|
-
+ html_content.count("<h2")
|
|
406
|
-
)
|
|
407
|
-
|
|
408
|
-
# Create placeholder elements
|
|
409
|
-
y_pos = 20.0
|
|
410
|
-
for i in range(min(button_count, 5)):
|
|
411
|
-
elements.append(
|
|
412
|
-
VisualElement(
|
|
413
|
-
element_type=VisualElementType.BUTTON,
|
|
414
|
-
position=(10.0, y_pos),
|
|
415
|
-
size=(100.0, 40.0),
|
|
416
|
-
text=f"Button {i+1}",
|
|
417
|
-
)
|
|
418
|
-
)
|
|
419
|
-
y_pos += 60.0
|
|
420
|
-
|
|
421
|
-
for _i in range(min(input_count, 5)):
|
|
422
|
-
elements.append(
|
|
423
|
-
VisualElement(
|
|
424
|
-
element_type=VisualElementType.INPUT,
|
|
425
|
-
position=(10.0, y_pos),
|
|
426
|
-
size=(200.0, 40.0),
|
|
427
|
-
)
|
|
428
|
-
)
|
|
429
|
-
y_pos += 60.0
|
|
430
|
-
|
|
431
|
-
for i in range(min(text_count, 5)):
|
|
432
|
-
elements.append(
|
|
433
|
-
VisualElement(
|
|
434
|
-
element_type=VisualElementType.TEXT,
|
|
435
|
-
position=(10.0, y_pos),
|
|
436
|
-
size=(300.0, 30.0),
|
|
437
|
-
text=f"Text {i+1}",
|
|
438
|
-
)
|
|
439
|
-
)
|
|
440
|
-
y_pos += 50.0
|
|
441
|
-
|
|
442
|
-
return elements
|
|
443
|
-
|
|
444
|
-
def get_refinement_summary(self) -> dict[str, Any]:
|
|
445
|
-
"""
|
|
446
|
-
Get summary of refinement process.
|
|
447
|
-
|
|
448
|
-
Returns:
|
|
449
|
-
Refinement summary
|
|
450
|
-
"""
|
|
451
|
-
if not self.iteration_history:
|
|
452
|
-
return {
|
|
453
|
-
"iterations": 0,
|
|
454
|
-
"final_quality": 0.0,
|
|
455
|
-
"improvement_trend": "no_data",
|
|
456
|
-
}
|
|
457
|
-
|
|
458
|
-
final_result = self.iteration_history[-1]
|
|
459
|
-
initial_quality = (
|
|
460
|
-
self.iteration_history[0].quality_score
|
|
461
|
-
if len(self.iteration_history) > 1
|
|
462
|
-
else final_result.quality_score
|
|
463
|
-
)
|
|
464
|
-
|
|
465
|
-
trend = self.ui_comparator.get_improvement_trend(
|
|
466
|
-
[r.feedback for r in self.iteration_history]
|
|
467
|
-
)
|
|
468
|
-
|
|
469
|
-
return {
|
|
470
|
-
"iterations": len(self.iteration_history),
|
|
471
|
-
"initial_quality": initial_quality,
|
|
472
|
-
"final_quality": final_result.quality_score,
|
|
473
|
-
"quality_improvement": final_result.quality_score - initial_quality,
|
|
474
|
-
"improvement_trend": trend["trend"],
|
|
475
|
-
"average_improvement": trend.get("average_improvement", 0.0),
|
|
476
|
-
"recommendations": self.pattern_learner.get_recommendations(),
|
|
477
|
-
}
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
class VisualDesignerAgent(DesignerAgent):
|
|
481
|
-
"""Enhanced designer agent with visual feedback capabilities."""
|
|
482
|
-
|
|
483
|
-
def __init__(self, *args, **kwargs):
|
|
484
|
-
"""Initialize visual designer agent."""
|
|
485
|
-
super().__init__(*args, **kwargs)
|
|
486
|
-
|
|
487
|
-
self.hardware_profile = HardwareProfiler().detect_profile()
|
|
488
|
-
self.iterative_refinement = IterativeRefinement(
|
|
489
|
-
hardware_profile=self.hardware_profile
|
|
490
|
-
)
|
|
491
|
-
|
|
492
|
-
def get_commands(self) -> list[dict[str, str]]:
|
|
493
|
-
"""Return available commands including visual design."""
|
|
494
|
-
base_commands = super().get_commands()
|
|
495
|
-
return base_commands + [
|
|
496
|
-
{
|
|
497
|
-
"command": "*visual-design",
|
|
498
|
-
"description": "Design UI with visual feedback and iterative refinement",
|
|
499
|
-
}
|
|
500
|
-
]
|
|
501
|
-
|
|
502
|
-
async def run(self, command: str, **kwargs: Any) -> dict[str, Any]:
|
|
503
|
-
"""Execute command including visual design."""
|
|
504
|
-
command = command.lstrip("*")
|
|
505
|
-
|
|
506
|
-
if command == "visual-design":
|
|
507
|
-
feature_description = kwargs.get("feature_description", "")
|
|
508
|
-
user_stories = kwargs.get("user_stories", [])
|
|
509
|
-
max_iterations = kwargs.get("max_iterations", 5)
|
|
510
|
-
quality_threshold = kwargs.get("quality_threshold", 0.8)
|
|
511
|
-
output_file = kwargs.get("output_file", None)
|
|
512
|
-
|
|
513
|
-
return await self._visual_design(
|
|
514
|
-
feature_description,
|
|
515
|
-
user_stories,
|
|
516
|
-
max_iterations,
|
|
517
|
-
quality_threshold,
|
|
518
|
-
output_file,
|
|
519
|
-
)
|
|
520
|
-
|
|
521
|
-
# Delegate to parent for other commands
|
|
522
|
-
return await super().run(f"*{command}", **kwargs)
|
|
523
|
-
|
|
524
|
-
async def _visual_design(
|
|
525
|
-
self,
|
|
526
|
-
feature_description: str,
|
|
527
|
-
user_stories: list[str],
|
|
528
|
-
max_iterations: int,
|
|
529
|
-
quality_threshold: float,
|
|
530
|
-
output_file: str | None,
|
|
531
|
-
) -> dict[str, Any]:
|
|
532
|
-
"""
|
|
533
|
-
Design UI with visual feedback and iterative refinement.
|
|
534
|
-
|
|
535
|
-
Args:
|
|
536
|
-
feature_description: Feature description
|
|
537
|
-
user_stories: User stories
|
|
538
|
-
max_iterations: Maximum refinement iterations
|
|
539
|
-
quality_threshold: Quality threshold to stop refinement
|
|
540
|
-
output_file: Optional output file path
|
|
541
|
-
|
|
542
|
-
Returns:
|
|
543
|
-
Design result with visual feedback
|
|
544
|
-
"""
|
|
545
|
-
if not feature_description:
|
|
546
|
-
return {"error": "feature_description is required"}
|
|
547
|
-
|
|
548
|
-
# Configure refinement
|
|
549
|
-
self.iterative_refinement.config.max_iterations = max_iterations
|
|
550
|
-
self.iterative_refinement.config.quality_threshold = quality_threshold
|
|
551
|
-
|
|
552
|
-
# Generate initial UI design using parent's design-ui command
|
|
553
|
-
initial_design = await self._design_ui(
|
|
554
|
-
feature_description, user_stories, output_file=None
|
|
555
|
-
)
|
|
556
|
-
|
|
557
|
-
if "error" in initial_design:
|
|
558
|
-
return initial_design
|
|
559
|
-
|
|
560
|
-
# Extract HTML from design (simplified - would parse actual design output)
|
|
561
|
-
initial_html = self._extract_html_from_design(initial_design)
|
|
562
|
-
|
|
563
|
-
# Define refinement callback
|
|
564
|
-
async def refine_callback(html, feedback, suggestions, requirements):
|
|
565
|
-
"""Callback to refine HTML based on feedback."""
|
|
566
|
-
# In real implementation, would use LLM to refine HTML
|
|
567
|
-
# For now, return original HTML (would be enhanced with feedback)
|
|
568
|
-
logger.info(f"Refining HTML based on {len(suggestions)} suggestions")
|
|
569
|
-
return html # Placeholder
|
|
570
|
-
|
|
571
|
-
# Run iterative refinement
|
|
572
|
-
requirements = {
|
|
573
|
-
"feature_description": feature_description,
|
|
574
|
-
"user_stories": user_stories,
|
|
575
|
-
"design_spec": initial_design.get("design_spec"),
|
|
576
|
-
}
|
|
577
|
-
|
|
578
|
-
try:
|
|
579
|
-
result = await self.iterative_refinement.refine_ui(
|
|
580
|
-
initial_html, requirements, refinement_callback=refine_callback
|
|
581
|
-
)
|
|
582
|
-
|
|
583
|
-
if not result:
|
|
584
|
-
return {"error": "Refinement failed"}
|
|
585
|
-
|
|
586
|
-
# Get refinement summary
|
|
587
|
-
summary = self.iterative_refinement.get_refinement_summary()
|
|
588
|
-
|
|
589
|
-
# Save final HTML if output file specified
|
|
590
|
-
if output_file:
|
|
591
|
-
Path(output_file).write_text(result.html_content, encoding="utf-8")
|
|
592
|
-
|
|
593
|
-
return {
|
|
594
|
-
"type": "visual_design",
|
|
595
|
-
"iterations": summary["iterations"],
|
|
596
|
-
"initial_quality": summary["initial_quality"],
|
|
597
|
-
"final_quality": summary["final_quality"],
|
|
598
|
-
"quality_improvement": summary["quality_improvement"],
|
|
599
|
-
"improvement_trend": summary["improvement_trend"],
|
|
600
|
-
"recommendations": summary["recommendations"],
|
|
601
|
-
"html_content": result.html_content,
|
|
602
|
-
"output_file": output_file,
|
|
603
|
-
}
|
|
604
|
-
finally:
|
|
605
|
-
# Clean up browser
|
|
606
|
-
self.iterative_refinement.stop_browser()
|
|
607
|
-
|
|
608
|
-
def _extract_html_from_design(self, design: dict[str, Any]) -> str:
|
|
609
|
-
"""
|
|
610
|
-
Extract HTML from design output (simplified).
|
|
611
|
-
|
|
612
|
-
Args:
|
|
613
|
-
design: Design output dictionary
|
|
614
|
-
|
|
615
|
-
Returns:
|
|
616
|
-
HTML content
|
|
617
|
-
"""
|
|
618
|
-
# In real implementation, would parse design output to extract HTML
|
|
619
|
-
# For now, return a simple placeholder HTML
|
|
620
|
-
return """
|
|
621
|
-
<!DOCTYPE html>
|
|
622
|
-
<html>
|
|
623
|
-
<head>
|
|
624
|
-
<title>Generated UI</title>
|
|
625
|
-
<style>
|
|
626
|
-
body { font-family: Arial, sans-serif; padding: 20px; }
|
|
627
|
-
button { padding: 10px 20px; margin: 10px; }
|
|
628
|
-
input { padding: 8px; margin: 10px; width: 200px; }
|
|
629
|
-
</style>
|
|
630
|
-
</head>
|
|
631
|
-
<body>
|
|
632
|
-
<h1>Generated UI</h1>
|
|
633
|
-
<button>Click Me</button>
|
|
634
|
-
<input type="text" placeholder="Enter text">
|
|
635
|
-
<p>This is a generated UI based on the design specifications.</p>
|
|
636
|
-
</body>
|
|
637
|
-
</html>
|
|
638
|
-
"""
|
|
1
|
+
"""
|
|
2
|
+
Visual Designer Agent - Enhanced designer with visual feedback and iterative refinement.
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
import logging
|
|
6
|
+
from collections.abc import Awaitable, Callable
|
|
7
|
+
from dataclasses import dataclass
|
|
8
|
+
from pathlib import Path
|
|
9
|
+
from typing import Any
|
|
10
|
+
|
|
11
|
+
from ...core.browser_controller import BrowserController, BrowserType
|
|
12
|
+
from ...core.hardware_profiler import HardwareProfile, HardwareProfiler
|
|
13
|
+
from ...core.visual_feedback import (
|
|
14
|
+
UIComparator,
|
|
15
|
+
VisualAnalyzer,
|
|
16
|
+
VisualElement,
|
|
17
|
+
VisualElementType,
|
|
18
|
+
VisualFeedback,
|
|
19
|
+
VisualFeedbackCollector,
|
|
20
|
+
VisualPatternLearner,
|
|
21
|
+
)
|
|
22
|
+
from .agent import DesignerAgent
|
|
23
|
+
|
|
24
|
+
logger = logging.getLogger(__name__)
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
@dataclass
|
|
28
|
+
class IterationResult:
|
|
29
|
+
"""Result of a single iteration."""
|
|
30
|
+
|
|
31
|
+
iteration: int
|
|
32
|
+
html_content: str
|
|
33
|
+
feedback: VisualFeedback
|
|
34
|
+
quality_score: float
|
|
35
|
+
improvements: list[str]
|
|
36
|
+
regressions: list[str]
|
|
37
|
+
should_continue: bool
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
@dataclass
|
|
41
|
+
class RefinementConfig:
|
|
42
|
+
"""Configuration for iterative refinement."""
|
|
43
|
+
|
|
44
|
+
max_iterations: int = 5
|
|
45
|
+
quality_threshold: float = 0.8
|
|
46
|
+
min_improvement: float = 0.05 # Minimum improvement to continue
|
|
47
|
+
screenshot_dir: str | None = None
|
|
48
|
+
enable_accessibility_check: bool = True
|
|
49
|
+
enable_layout_analysis: bool = True
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
class IterativeRefinement:
|
|
53
|
+
"""Manages iterative UI refinement loop."""
|
|
54
|
+
|
|
55
|
+
def __init__(
|
|
56
|
+
self,
|
|
57
|
+
hardware_profile: HardwareProfile | None = None,
|
|
58
|
+
config: RefinementConfig | None = None,
|
|
59
|
+
):
|
|
60
|
+
"""
|
|
61
|
+
Initialize iterative refinement.
|
|
62
|
+
|
|
63
|
+
Args:
|
|
64
|
+
hardware_profile: Hardware profile for optimization
|
|
65
|
+
config: Refinement configuration
|
|
66
|
+
"""
|
|
67
|
+
self.hardware_profile = hardware_profile or HardwareProfiler().detect_profile()
|
|
68
|
+
self.config = config or RefinementConfig()
|
|
69
|
+
|
|
70
|
+
self.feedback_collector = VisualFeedbackCollector(
|
|
71
|
+
hardware_profile=self.hardware_profile
|
|
72
|
+
)
|
|
73
|
+
self.visual_analyzer = VisualAnalyzer(hardware_profile=self.hardware_profile)
|
|
74
|
+
self.ui_comparator = UIComparator()
|
|
75
|
+
self.pattern_learner = VisualPatternLearner()
|
|
76
|
+
|
|
77
|
+
self.browser_controller: BrowserController | None = None
|
|
78
|
+
self.iteration_history: list[IterationResult] = []
|
|
79
|
+
|
|
80
|
+
def start_browser(self) -> bool:
|
|
81
|
+
"""Start browser controller."""
|
|
82
|
+
if self.browser_controller is None:
|
|
83
|
+
self.browser_controller = BrowserController(
|
|
84
|
+
hardware_profile=self.hardware_profile,
|
|
85
|
+
browser_type=BrowserType.CHROMIUM,
|
|
86
|
+
headless=True,
|
|
87
|
+
)
|
|
88
|
+
return self.browser_controller.start()
|
|
89
|
+
|
|
90
|
+
def stop_browser(self):
|
|
91
|
+
"""Stop browser controller."""
|
|
92
|
+
if self.browser_controller:
|
|
93
|
+
self.browser_controller.stop()
|
|
94
|
+
self.browser_controller = None
|
|
95
|
+
|
|
96
|
+
def _load_and_capture_iteration(
|
|
97
|
+
self, current_html: str, iteration: int
|
|
98
|
+
) -> tuple[bool, str | None]:
|
|
99
|
+
"""Load HTML in browser and capture screenshot."""
|
|
100
|
+
browser_controller = self.browser_controller
|
|
101
|
+
if not browser_controller:
|
|
102
|
+
return False, None
|
|
103
|
+
|
|
104
|
+
# Load HTML in browser
|
|
105
|
+
if not browser_controller.load_html(current_html):
|
|
106
|
+
logger.error(f"Failed to load HTML in iteration {iteration}")
|
|
107
|
+
return False, None
|
|
108
|
+
|
|
109
|
+
# Capture screenshot
|
|
110
|
+
screenshot_path = None
|
|
111
|
+
if self.config.screenshot_dir:
|
|
112
|
+
screenshot_path = str(
|
|
113
|
+
Path(self.config.screenshot_dir) / f"iteration_{iteration}.png"
|
|
114
|
+
)
|
|
115
|
+
browser_controller.capture_screenshot(screenshot_path)
|
|
116
|
+
|
|
117
|
+
return True, screenshot_path
|
|
118
|
+
|
|
119
|
+
def _analyze_ui_quality(
|
|
120
|
+
self, current_html: str, visual_elements: list[VisualElement], requirements: dict[str, Any]
|
|
121
|
+
) -> tuple[Any, Any, float]:
|
|
122
|
+
"""Analyze layout, accessibility, and calculate quality score."""
|
|
123
|
+
# Analyze layout
|
|
124
|
+
layout_metrics = None
|
|
125
|
+
if self.config.enable_layout_analysis:
|
|
126
|
+
layout_metrics = self.visual_analyzer.analyze_layout(
|
|
127
|
+
visual_elements, design_spec=requirements.get("design_spec")
|
|
128
|
+
)
|
|
129
|
+
|
|
130
|
+
# Analyze accessibility
|
|
131
|
+
accessibility_metrics = None
|
|
132
|
+
if self.config.enable_accessibility_check:
|
|
133
|
+
accessibility_metrics = self.visual_analyzer.analyze_accessibility(
|
|
134
|
+
visual_elements, html_content=current_html
|
|
135
|
+
)
|
|
136
|
+
|
|
137
|
+
# Calculate quality score
|
|
138
|
+
quality_score = 0.0
|
|
139
|
+
if layout_metrics and accessibility_metrics:
|
|
140
|
+
quality_score = self.visual_analyzer.calculate_quality_score(
|
|
141
|
+
layout_metrics, accessibility_metrics
|
|
142
|
+
)
|
|
143
|
+
elif layout_metrics:
|
|
144
|
+
# Simplified score if only layout available
|
|
145
|
+
quality_score = (
|
|
146
|
+
layout_metrics.spacing_consistency * 0.2
|
|
147
|
+
+ layout_metrics.alignment_score * 0.2
|
|
148
|
+
+ layout_metrics.visual_hierarchy * 0.2
|
|
149
|
+
+ layout_metrics.whitespace_balance * 0.2
|
|
150
|
+
+ layout_metrics.grid_consistency * 0.2
|
|
151
|
+
)
|
|
152
|
+
|
|
153
|
+
return layout_metrics, accessibility_metrics, quality_score
|
|
154
|
+
|
|
155
|
+
def _generate_ui_suggestions(
|
|
156
|
+
self, layout_metrics: Any, accessibility_metrics: Any
|
|
157
|
+
) -> list[str]:
|
|
158
|
+
"""Generate suggestions based on layout and accessibility metrics."""
|
|
159
|
+
suggestions = []
|
|
160
|
+
if layout_metrics:
|
|
161
|
+
if layout_metrics.spacing_consistency < 0.7:
|
|
162
|
+
suggestions.append("Improve spacing consistency")
|
|
163
|
+
if layout_metrics.alignment_score < 0.7:
|
|
164
|
+
suggestions.append("Improve element alignment")
|
|
165
|
+
if layout_metrics.visual_hierarchy < 0.7:
|
|
166
|
+
suggestions.append("Enhance visual hierarchy")
|
|
167
|
+
|
|
168
|
+
if accessibility_metrics:
|
|
169
|
+
if not accessibility_metrics.aria_labels_present:
|
|
170
|
+
suggestions.append("Add ARIA labels for screen readers")
|
|
171
|
+
if not accessibility_metrics.focus_indicators_present:
|
|
172
|
+
suggestions.append("Add focus indicators for keyboard navigation")
|
|
173
|
+
if accessibility_metrics.color_contrast_score < 0.7:
|
|
174
|
+
suggestions.append("Improve color contrast")
|
|
175
|
+
|
|
176
|
+
return suggestions
|
|
177
|
+
|
|
178
|
+
def _compare_with_previous_iteration(
|
|
179
|
+
self, iteration: int, feedback: VisualFeedback
|
|
180
|
+
) -> tuple[list[str], list[str]]:
|
|
181
|
+
"""Compare current iteration with previous iteration."""
|
|
182
|
+
improvements = []
|
|
183
|
+
regressions = []
|
|
184
|
+
if iteration > 1:
|
|
185
|
+
previous_feedback = self.feedback_collector.get_feedback_history(limit=1)[0]
|
|
186
|
+
comparison = self.ui_comparator.compare_iterations(previous_feedback, feedback)
|
|
187
|
+
improvements = comparison["improvements"]
|
|
188
|
+
regressions = comparison["regressions"]
|
|
189
|
+
return improvements, regressions
|
|
190
|
+
|
|
191
|
+
def _create_iteration_result(
|
|
192
|
+
self,
|
|
193
|
+
iteration: int,
|
|
194
|
+
current_html: str,
|
|
195
|
+
feedback: VisualFeedback,
|
|
196
|
+
quality_score: float,
|
|
197
|
+
improvements: list[str],
|
|
198
|
+
regressions: list[str],
|
|
199
|
+
) -> IterationResult:
|
|
200
|
+
"""Create iteration result."""
|
|
201
|
+
return IterationResult(
|
|
202
|
+
iteration=iteration,
|
|
203
|
+
html_content=current_html,
|
|
204
|
+
feedback=feedback,
|
|
205
|
+
quality_score=quality_score,
|
|
206
|
+
improvements=improvements,
|
|
207
|
+
regressions=regressions,
|
|
208
|
+
should_continue=self._should_continue_iteration(
|
|
209
|
+
quality_score, improvements, iteration
|
|
210
|
+
),
|
|
211
|
+
)
|
|
212
|
+
|
|
213
|
+
async def _refine_html_if_needed(
|
|
214
|
+
self,
|
|
215
|
+
current_html: str,
|
|
216
|
+
feedback: VisualFeedback,
|
|
217
|
+
suggestions: list[str],
|
|
218
|
+
requirements: dict[str, Any],
|
|
219
|
+
refinement_callback: (
|
|
220
|
+
Callable[[str, VisualFeedback, list[str], dict[str, Any]], Awaitable[str]]
|
|
221
|
+
| None
|
|
222
|
+
),
|
|
223
|
+
) -> tuple[str, bool]:
|
|
224
|
+
"""Refine HTML using callback if provided."""
|
|
225
|
+
if not refinement_callback:
|
|
226
|
+
return current_html, False
|
|
227
|
+
|
|
228
|
+
try:
|
|
229
|
+
refined_html = await refinement_callback(
|
|
230
|
+
current_html, feedback, suggestions, requirements
|
|
231
|
+
)
|
|
232
|
+
if refined_html and refined_html != current_html:
|
|
233
|
+
return refined_html, True
|
|
234
|
+
else:
|
|
235
|
+
logger.warning("Refinement callback did not produce new HTML")
|
|
236
|
+
return current_html, False
|
|
237
|
+
except Exception as e:
|
|
238
|
+
logger.error(f"Refinement callback failed: {e}")
|
|
239
|
+
return current_html, False
|
|
240
|
+
|
|
241
|
+
async def refine_ui(
|
|
242
|
+
self,
|
|
243
|
+
initial_html: str,
|
|
244
|
+
requirements: dict[str, Any],
|
|
245
|
+
refinement_callback: (
|
|
246
|
+
Callable[[str, VisualFeedback, list[str], dict[str, Any]], Awaitable[str]]
|
|
247
|
+
| None
|
|
248
|
+
) = None,
|
|
249
|
+
) -> IterationResult | None:
|
|
250
|
+
"""
|
|
251
|
+
Refine UI through iterative feedback loop.
|
|
252
|
+
|
|
253
|
+
Args:
|
|
254
|
+
initial_html: Initial HTML content
|
|
255
|
+
requirements: Design requirements
|
|
256
|
+
refinement_callback: Optional callback to generate refined HTML
|
|
257
|
+
|
|
258
|
+
Returns:
|
|
259
|
+
Final iteration result
|
|
260
|
+
"""
|
|
261
|
+
if not self.browser_controller:
|
|
262
|
+
if not self.start_browser():
|
|
263
|
+
logger.error("Failed to start browser")
|
|
264
|
+
return None
|
|
265
|
+
# start_browser() initializes browser_controller on success
|
|
266
|
+
if self.browser_controller is None:
|
|
267
|
+
logger.error("Browser controller is not available after start")
|
|
268
|
+
return None
|
|
269
|
+
|
|
270
|
+
current_html = initial_html
|
|
271
|
+
iteration = 0
|
|
272
|
+
|
|
273
|
+
while iteration < self.config.max_iterations:
|
|
274
|
+
iteration += 1
|
|
275
|
+
logger.info(f"Starting iteration {iteration}")
|
|
276
|
+
|
|
277
|
+
# Load HTML and capture screenshot
|
|
278
|
+
success, screenshot_path = self._load_and_capture_iteration(
|
|
279
|
+
current_html, iteration
|
|
280
|
+
)
|
|
281
|
+
if not success:
|
|
282
|
+
break
|
|
283
|
+
|
|
284
|
+
# Extract visual elements
|
|
285
|
+
visual_elements = self._extract_visual_elements(current_html)
|
|
286
|
+
|
|
287
|
+
# Analyze UI quality
|
|
288
|
+
layout_metrics, accessibility_metrics, quality_score = (
|
|
289
|
+
self._analyze_ui_quality(current_html, visual_elements, requirements)
|
|
290
|
+
)
|
|
291
|
+
|
|
292
|
+
# Collect feedback
|
|
293
|
+
feedback = self.feedback_collector.collect_feedback(
|
|
294
|
+
iteration=iteration,
|
|
295
|
+
screenshot_path=screenshot_path,
|
|
296
|
+
visual_elements=visual_elements,
|
|
297
|
+
metadata={"html_length": len(current_html)},
|
|
298
|
+
)
|
|
299
|
+
feedback.layout_metrics = layout_metrics
|
|
300
|
+
feedback.accessibility_metrics = accessibility_metrics
|
|
301
|
+
feedback.quality_score = quality_score
|
|
302
|
+
|
|
303
|
+
# Generate suggestions
|
|
304
|
+
suggestions = self._generate_ui_suggestions(
|
|
305
|
+
layout_metrics, accessibility_metrics
|
|
306
|
+
)
|
|
307
|
+
feedback.suggestions = suggestions
|
|
308
|
+
feedback.issues = (layout_metrics.issues if layout_metrics else []) + (
|
|
309
|
+
accessibility_metrics.issues if accessibility_metrics else []
|
|
310
|
+
)
|
|
311
|
+
|
|
312
|
+
# Compare with previous iteration
|
|
313
|
+
improvements, regressions = self._compare_with_previous_iteration(
|
|
314
|
+
iteration, feedback
|
|
315
|
+
)
|
|
316
|
+
|
|
317
|
+
# Learn from feedback
|
|
318
|
+
self.pattern_learner.learn_from_feedback(feedback)
|
|
319
|
+
|
|
320
|
+
# Create iteration result
|
|
321
|
+
result = self._create_iteration_result(
|
|
322
|
+
iteration,
|
|
323
|
+
current_html,
|
|
324
|
+
feedback,
|
|
325
|
+
quality_score,
|
|
326
|
+
improvements,
|
|
327
|
+
regressions,
|
|
328
|
+
)
|
|
329
|
+
|
|
330
|
+
self.iteration_history.append(result)
|
|
331
|
+
|
|
332
|
+
logger.info(f"Iteration {iteration} complete. Quality: {quality_score:.2f}")
|
|
333
|
+
|
|
334
|
+
# Check if we should continue
|
|
335
|
+
if not result.should_continue:
|
|
336
|
+
logger.info(
|
|
337
|
+
"Stopping refinement. Quality threshold met or max iterations reached."
|
|
338
|
+
)
|
|
339
|
+
break
|
|
340
|
+
|
|
341
|
+
# Generate refined HTML if callback provided
|
|
342
|
+
refined_html, should_continue = await self._refine_html_if_needed(
|
|
343
|
+
current_html, feedback, suggestions, requirements, refinement_callback
|
|
344
|
+
)
|
|
345
|
+
if not should_continue:
|
|
346
|
+
break
|
|
347
|
+
current_html = refined_html
|
|
348
|
+
|
|
349
|
+
return self.iteration_history[-1] if self.iteration_history else None
|
|
350
|
+
|
|
351
|
+
def _should_continue_iteration(
|
|
352
|
+
self, quality_score: float, improvements: list[str], iteration: int
|
|
353
|
+
) -> bool:
|
|
354
|
+
"""
|
|
355
|
+
Determine if refinement should continue.
|
|
356
|
+
|
|
357
|
+
Args:
|
|
358
|
+
quality_score: Current quality score
|
|
359
|
+
improvements: List of improvements from comparison
|
|
360
|
+
iteration: Current iteration number
|
|
361
|
+
|
|
362
|
+
Returns:
|
|
363
|
+
True if should continue, False otherwise
|
|
364
|
+
"""
|
|
365
|
+
# Stop if max iterations reached
|
|
366
|
+
if iteration >= self.config.max_iterations:
|
|
367
|
+
return False
|
|
368
|
+
|
|
369
|
+
# Stop if quality threshold met
|
|
370
|
+
if quality_score >= self.config.quality_threshold:
|
|
371
|
+
return False
|
|
372
|
+
|
|
373
|
+
# Stop if no improvements and quality is not improving
|
|
374
|
+
if iteration > 1 and len(improvements) == 0:
|
|
375
|
+
# Check if quality is improving
|
|
376
|
+
if len(self.iteration_history) >= 2:
|
|
377
|
+
prev_score = self.iteration_history[-2].quality_score
|
|
378
|
+
if quality_score - prev_score < self.config.min_improvement:
|
|
379
|
+
return False
|
|
380
|
+
|
|
381
|
+
return True
|
|
382
|
+
|
|
383
|
+
def _extract_visual_elements(self, html_content: str) -> list[VisualElement]:
|
|
384
|
+
"""
|
|
385
|
+
Extract visual elements from HTML (simplified).
|
|
386
|
+
|
|
387
|
+
In a real implementation, this would parse the DOM and extract
|
|
388
|
+
actual element positions, sizes, and styles.
|
|
389
|
+
|
|
390
|
+
Args:
|
|
391
|
+
html_content: HTML content
|
|
392
|
+
|
|
393
|
+
Returns:
|
|
394
|
+
List of visual elements
|
|
395
|
+
"""
|
|
396
|
+
# Simplified extraction - would use actual DOM parsing
|
|
397
|
+
elements = []
|
|
398
|
+
|
|
399
|
+
# Count common elements
|
|
400
|
+
button_count = html_content.count("<button") + html_content.count("<Button")
|
|
401
|
+
input_count = html_content.count("<input") + html_content.count("<Input")
|
|
402
|
+
text_count = (
|
|
403
|
+
html_content.count("<p")
|
|
404
|
+
+ html_content.count("<h1")
|
|
405
|
+
+ html_content.count("<h2")
|
|
406
|
+
)
|
|
407
|
+
|
|
408
|
+
# Create placeholder elements
|
|
409
|
+
y_pos = 20.0
|
|
410
|
+
for i in range(min(button_count, 5)):
|
|
411
|
+
elements.append(
|
|
412
|
+
VisualElement(
|
|
413
|
+
element_type=VisualElementType.BUTTON,
|
|
414
|
+
position=(10.0, y_pos),
|
|
415
|
+
size=(100.0, 40.0),
|
|
416
|
+
text=f"Button {i+1}",
|
|
417
|
+
)
|
|
418
|
+
)
|
|
419
|
+
y_pos += 60.0
|
|
420
|
+
|
|
421
|
+
for _i in range(min(input_count, 5)):
|
|
422
|
+
elements.append(
|
|
423
|
+
VisualElement(
|
|
424
|
+
element_type=VisualElementType.INPUT,
|
|
425
|
+
position=(10.0, y_pos),
|
|
426
|
+
size=(200.0, 40.0),
|
|
427
|
+
)
|
|
428
|
+
)
|
|
429
|
+
y_pos += 60.0
|
|
430
|
+
|
|
431
|
+
for i in range(min(text_count, 5)):
|
|
432
|
+
elements.append(
|
|
433
|
+
VisualElement(
|
|
434
|
+
element_type=VisualElementType.TEXT,
|
|
435
|
+
position=(10.0, y_pos),
|
|
436
|
+
size=(300.0, 30.0),
|
|
437
|
+
text=f"Text {i+1}",
|
|
438
|
+
)
|
|
439
|
+
)
|
|
440
|
+
y_pos += 50.0
|
|
441
|
+
|
|
442
|
+
return elements
|
|
443
|
+
|
|
444
|
+
def get_refinement_summary(self) -> dict[str, Any]:
|
|
445
|
+
"""
|
|
446
|
+
Get summary of refinement process.
|
|
447
|
+
|
|
448
|
+
Returns:
|
|
449
|
+
Refinement summary
|
|
450
|
+
"""
|
|
451
|
+
if not self.iteration_history:
|
|
452
|
+
return {
|
|
453
|
+
"iterations": 0,
|
|
454
|
+
"final_quality": 0.0,
|
|
455
|
+
"improvement_trend": "no_data",
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
final_result = self.iteration_history[-1]
|
|
459
|
+
initial_quality = (
|
|
460
|
+
self.iteration_history[0].quality_score
|
|
461
|
+
if len(self.iteration_history) > 1
|
|
462
|
+
else final_result.quality_score
|
|
463
|
+
)
|
|
464
|
+
|
|
465
|
+
trend = self.ui_comparator.get_improvement_trend(
|
|
466
|
+
[r.feedback for r in self.iteration_history]
|
|
467
|
+
)
|
|
468
|
+
|
|
469
|
+
return {
|
|
470
|
+
"iterations": len(self.iteration_history),
|
|
471
|
+
"initial_quality": initial_quality,
|
|
472
|
+
"final_quality": final_result.quality_score,
|
|
473
|
+
"quality_improvement": final_result.quality_score - initial_quality,
|
|
474
|
+
"improvement_trend": trend["trend"],
|
|
475
|
+
"average_improvement": trend.get("average_improvement", 0.0),
|
|
476
|
+
"recommendations": self.pattern_learner.get_recommendations(),
|
|
477
|
+
}
|
|
478
|
+
|
|
479
|
+
|
|
480
|
+
class VisualDesignerAgent(DesignerAgent):
|
|
481
|
+
"""Enhanced designer agent with visual feedback capabilities."""
|
|
482
|
+
|
|
483
|
+
def __init__(self, *args, **kwargs):
|
|
484
|
+
"""Initialize visual designer agent."""
|
|
485
|
+
super().__init__(*args, **kwargs)
|
|
486
|
+
|
|
487
|
+
self.hardware_profile = HardwareProfiler().detect_profile()
|
|
488
|
+
self.iterative_refinement = IterativeRefinement(
|
|
489
|
+
hardware_profile=self.hardware_profile
|
|
490
|
+
)
|
|
491
|
+
|
|
492
|
+
def get_commands(self) -> list[dict[str, str]]:
|
|
493
|
+
"""Return available commands including visual design."""
|
|
494
|
+
base_commands = super().get_commands()
|
|
495
|
+
return base_commands + [
|
|
496
|
+
{
|
|
497
|
+
"command": "*visual-design",
|
|
498
|
+
"description": "Design UI with visual feedback and iterative refinement",
|
|
499
|
+
}
|
|
500
|
+
]
|
|
501
|
+
|
|
502
|
+
async def run(self, command: str, **kwargs: Any) -> dict[str, Any]:
|
|
503
|
+
"""Execute command including visual design."""
|
|
504
|
+
command = command.lstrip("*")
|
|
505
|
+
|
|
506
|
+
if command == "visual-design":
|
|
507
|
+
feature_description = kwargs.get("feature_description", "")
|
|
508
|
+
user_stories = kwargs.get("user_stories", [])
|
|
509
|
+
max_iterations = kwargs.get("max_iterations", 5)
|
|
510
|
+
quality_threshold = kwargs.get("quality_threshold", 0.8)
|
|
511
|
+
output_file = kwargs.get("output_file", None)
|
|
512
|
+
|
|
513
|
+
return await self._visual_design(
|
|
514
|
+
feature_description,
|
|
515
|
+
user_stories,
|
|
516
|
+
max_iterations,
|
|
517
|
+
quality_threshold,
|
|
518
|
+
output_file,
|
|
519
|
+
)
|
|
520
|
+
|
|
521
|
+
# Delegate to parent for other commands
|
|
522
|
+
return await super().run(f"*{command}", **kwargs)
|
|
523
|
+
|
|
524
|
+
async def _visual_design(
|
|
525
|
+
self,
|
|
526
|
+
feature_description: str,
|
|
527
|
+
user_stories: list[str],
|
|
528
|
+
max_iterations: int,
|
|
529
|
+
quality_threshold: float,
|
|
530
|
+
output_file: str | None,
|
|
531
|
+
) -> dict[str, Any]:
|
|
532
|
+
"""
|
|
533
|
+
Design UI with visual feedback and iterative refinement.
|
|
534
|
+
|
|
535
|
+
Args:
|
|
536
|
+
feature_description: Feature description
|
|
537
|
+
user_stories: User stories
|
|
538
|
+
max_iterations: Maximum refinement iterations
|
|
539
|
+
quality_threshold: Quality threshold to stop refinement
|
|
540
|
+
output_file: Optional output file path
|
|
541
|
+
|
|
542
|
+
Returns:
|
|
543
|
+
Design result with visual feedback
|
|
544
|
+
"""
|
|
545
|
+
if not feature_description:
|
|
546
|
+
return {"error": "feature_description is required"}
|
|
547
|
+
|
|
548
|
+
# Configure refinement
|
|
549
|
+
self.iterative_refinement.config.max_iterations = max_iterations
|
|
550
|
+
self.iterative_refinement.config.quality_threshold = quality_threshold
|
|
551
|
+
|
|
552
|
+
# Generate initial UI design using parent's design-ui command
|
|
553
|
+
initial_design = await self._design_ui(
|
|
554
|
+
feature_description, user_stories, output_file=None
|
|
555
|
+
)
|
|
556
|
+
|
|
557
|
+
if "error" in initial_design:
|
|
558
|
+
return initial_design
|
|
559
|
+
|
|
560
|
+
# Extract HTML from design (simplified - would parse actual design output)
|
|
561
|
+
initial_html = self._extract_html_from_design(initial_design)
|
|
562
|
+
|
|
563
|
+
# Define refinement callback
|
|
564
|
+
async def refine_callback(html, feedback, suggestions, requirements):
|
|
565
|
+
"""Callback to refine HTML based on feedback."""
|
|
566
|
+
# In real implementation, would use LLM to refine HTML
|
|
567
|
+
# For now, return original HTML (would be enhanced with feedback)
|
|
568
|
+
logger.info(f"Refining HTML based on {len(suggestions)} suggestions")
|
|
569
|
+
return html # Placeholder
|
|
570
|
+
|
|
571
|
+
# Run iterative refinement
|
|
572
|
+
requirements = {
|
|
573
|
+
"feature_description": feature_description,
|
|
574
|
+
"user_stories": user_stories,
|
|
575
|
+
"design_spec": initial_design.get("design_spec"),
|
|
576
|
+
}
|
|
577
|
+
|
|
578
|
+
try:
|
|
579
|
+
result = await self.iterative_refinement.refine_ui(
|
|
580
|
+
initial_html, requirements, refinement_callback=refine_callback
|
|
581
|
+
)
|
|
582
|
+
|
|
583
|
+
if not result:
|
|
584
|
+
return {"error": "Refinement failed"}
|
|
585
|
+
|
|
586
|
+
# Get refinement summary
|
|
587
|
+
summary = self.iterative_refinement.get_refinement_summary()
|
|
588
|
+
|
|
589
|
+
# Save final HTML if output file specified
|
|
590
|
+
if output_file:
|
|
591
|
+
Path(output_file).write_text(result.html_content, encoding="utf-8")
|
|
592
|
+
|
|
593
|
+
return {
|
|
594
|
+
"type": "visual_design",
|
|
595
|
+
"iterations": summary["iterations"],
|
|
596
|
+
"initial_quality": summary["initial_quality"],
|
|
597
|
+
"final_quality": summary["final_quality"],
|
|
598
|
+
"quality_improvement": summary["quality_improvement"],
|
|
599
|
+
"improvement_trend": summary["improvement_trend"],
|
|
600
|
+
"recommendations": summary["recommendations"],
|
|
601
|
+
"html_content": result.html_content,
|
|
602
|
+
"output_file": output_file,
|
|
603
|
+
}
|
|
604
|
+
finally:
|
|
605
|
+
# Clean up browser
|
|
606
|
+
self.iterative_refinement.stop_browser()
|
|
607
|
+
|
|
608
|
+
def _extract_html_from_design(self, design: dict[str, Any]) -> str:
|
|
609
|
+
"""
|
|
610
|
+
Extract HTML from design output (simplified).
|
|
611
|
+
|
|
612
|
+
Args:
|
|
613
|
+
design: Design output dictionary
|
|
614
|
+
|
|
615
|
+
Returns:
|
|
616
|
+
HTML content
|
|
617
|
+
"""
|
|
618
|
+
# In real implementation, would parse design output to extract HTML
|
|
619
|
+
# For now, return a simple placeholder HTML
|
|
620
|
+
return """
|
|
621
|
+
<!DOCTYPE html>
|
|
622
|
+
<html>
|
|
623
|
+
<head>
|
|
624
|
+
<title>Generated UI</title>
|
|
625
|
+
<style>
|
|
626
|
+
body { font-family: Arial, sans-serif; padding: 20px; }
|
|
627
|
+
button { padding: 10px 20px; margin: 10px; }
|
|
628
|
+
input { padding: 8px; margin: 10px; width: 200px; }
|
|
629
|
+
</style>
|
|
630
|
+
</head>
|
|
631
|
+
<body>
|
|
632
|
+
<h1>Generated UI</h1>
|
|
633
|
+
<button>Click Me</button>
|
|
634
|
+
<input type="text" placeholder="Enter text">
|
|
635
|
+
<p>This is a generated UI based on the design specifications.</p>
|
|
636
|
+
</body>
|
|
637
|
+
</html>
|
|
638
|
+
"""
|