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,490 +1,490 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Feedback Generator - Language-aware code review feedback generation
|
|
3
|
-
|
|
4
|
-
Phase 1.3: LLM Feedback Generation Fix
|
|
5
|
-
"""
|
|
6
|
-
|
|
7
|
-
from typing import Any
|
|
8
|
-
|
|
9
|
-
from pydantic import BaseModel, Field
|
|
10
|
-
|
|
11
|
-
from ...core.error_envelope import ErrorEnvelope
|
|
12
|
-
from ...core.language_detector import Language
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
class FeedbackResult(BaseModel):
|
|
16
|
-
"""
|
|
17
|
-
Structured feedback result with validation.
|
|
18
|
-
|
|
19
|
-
Phase 1.3: LLM Feedback Generation Fix
|
|
20
|
-
"""
|
|
21
|
-
|
|
22
|
-
feedback: str = Field(
|
|
23
|
-
description="Generated feedback text", min_length=50
|
|
24
|
-
) # Minimum 50 chars
|
|
25
|
-
language: Language = Field(description="Detected language")
|
|
26
|
-
confidence: float = Field(
|
|
27
|
-
ge=0.0, le=1.0, description="Confidence in feedback quality (0.0-1.0)"
|
|
28
|
-
)
|
|
29
|
-
suggestions: list[str] = Field(
|
|
30
|
-
default_factory=list, description="List of specific improvement suggestions"
|
|
31
|
-
)
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
class FeedbackGenerationError(Exception):
|
|
35
|
-
"""Raised when feedback generation fails or produces invalid feedback."""
|
|
36
|
-
|
|
37
|
-
pass
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
class FeedbackGenerator:
|
|
41
|
-
"""
|
|
42
|
-
Generate language-aware code review feedback with validation.
|
|
43
|
-
|
|
44
|
-
Phase 1.3: LLM Feedback Generation Fix
|
|
45
|
-
"""
|
|
46
|
-
|
|
47
|
-
@staticmethod
|
|
48
|
-
def generate_prompt(
|
|
49
|
-
code: str,
|
|
50
|
-
language: Language,
|
|
51
|
-
scores: dict[str, Any] | None = None,
|
|
52
|
-
expert_guidance: dict[str, Any] | None = None,
|
|
53
|
-
code_preview_limit: int = 2000,
|
|
54
|
-
) -> str:
|
|
55
|
-
"""
|
|
56
|
-
Generate language-aware prompt for feedback generation.
|
|
57
|
-
|
|
58
|
-
Args:
|
|
59
|
-
code: Code content to review
|
|
60
|
-
language: Detected programming language
|
|
61
|
-
scores: Optional code quality scores
|
|
62
|
-
expert_guidance: Optional expert consultation results
|
|
63
|
-
code_preview_limit: Maximum characters of code to include in prompt
|
|
64
|
-
|
|
65
|
-
Returns:
|
|
66
|
-
Generated prompt string
|
|
67
|
-
"""
|
|
68
|
-
# Determine code block syntax based on language
|
|
69
|
-
code_block_lang = FeedbackGenerator._get_code_block_language(language)
|
|
70
|
-
|
|
71
|
-
prompt_parts = [
|
|
72
|
-
"Review this code and provide detailed feedback:",
|
|
73
|
-
"",
|
|
74
|
-
"Code:",
|
|
75
|
-
f"```{code_block_lang}",
|
|
76
|
-
code[:code_preview_limit],
|
|
77
|
-
"```",
|
|
78
|
-
]
|
|
79
|
-
|
|
80
|
-
# Add language-specific guidance
|
|
81
|
-
lang_guidance = FeedbackGenerator._get_language_guidance(language)
|
|
82
|
-
if lang_guidance:
|
|
83
|
-
prompt_parts.extend(["", lang_guidance])
|
|
84
|
-
|
|
85
|
-
# Add expert guidance if available
|
|
86
|
-
if expert_guidance:
|
|
87
|
-
prompt_parts.append("\nExpert Guidance:")
|
|
88
|
-
if "security" in expert_guidance:
|
|
89
|
-
prompt_parts.append(
|
|
90
|
-
f"\nSecurity Expert:\n{expert_guidance['security'][:500]}..."
|
|
91
|
-
)
|
|
92
|
-
if "performance" in expert_guidance:
|
|
93
|
-
prompt_parts.append(
|
|
94
|
-
f"\nPerformance Expert:\n{expert_guidance['performance'][:300]}..."
|
|
95
|
-
)
|
|
96
|
-
if "code_quality" in expert_guidance:
|
|
97
|
-
prompt_parts.append(
|
|
98
|
-
f"\nCode Quality Expert:\n{expert_guidance['code_quality'][:300]}..."
|
|
99
|
-
)
|
|
100
|
-
if "api_design" in expert_guidance:
|
|
101
|
-
prompt_parts.append(
|
|
102
|
-
f"\nAPI Design Expert:\n{expert_guidance['api_design'][:500]}..."
|
|
103
|
-
)
|
|
104
|
-
if "external_api" in expert_guidance:
|
|
105
|
-
prompt_parts.append(
|
|
106
|
-
f"\nExternal API Expert:\n{expert_guidance['external_api'][:300]}..."
|
|
107
|
-
)
|
|
108
|
-
prompt_parts.append("")
|
|
109
|
-
|
|
110
|
-
if scores:
|
|
111
|
-
prompt_parts.extend(
|
|
112
|
-
[
|
|
113
|
-
"",
|
|
114
|
-
"Code Quality Scores:",
|
|
115
|
-
f"- Complexity: {scores.get('complexity_score', 0):.1f}/10",
|
|
116
|
-
f"- Security: {scores.get('security_score', 0):.1f}/10",
|
|
117
|
-
f"- Maintainability: {scores.get('maintainability_score', 0):.1f}/10",
|
|
118
|
-
f"- Test Coverage: {scores.get('test_coverage_score', 0):.1f}/10",
|
|
119
|
-
f"- Performance: {scores.get('performance_score', 0):.1f}/10",
|
|
120
|
-
f"- Overall Score: {scores.get('overall_score', 0):.1f}/100",
|
|
121
|
-
]
|
|
122
|
-
)
|
|
123
|
-
|
|
124
|
-
# Add language-specific feedback requirements
|
|
125
|
-
feedback_requirements = FeedbackGenerator._get_feedback_requirements(language)
|
|
126
|
-
prompt_parts.extend(["", "Provide detailed feedback:", ""])
|
|
127
|
-
prompt_parts.extend(feedback_requirements)
|
|
128
|
-
|
|
129
|
-
# Add structured output guidance for better parsing
|
|
130
|
-
prompt_parts.extend([
|
|
131
|
-
"",
|
|
132
|
-
"Format your feedback as follows:",
|
|
133
|
-
"1. Start with a brief summary (1-2 sentences)",
|
|
134
|
-
"2. List security concerns first (if any) with 'Security:' prefix",
|
|
135
|
-
"3. List critical issues/bugs with 'Critical:' prefix",
|
|
136
|
-
"4. List improvements with 'Improvement:' prefix",
|
|
137
|
-
"5. List style suggestions last with 'Style:' prefix",
|
|
138
|
-
"",
|
|
139
|
-
"Use bullet points (-) or numbered lists for clarity.",
|
|
140
|
-
])
|
|
141
|
-
|
|
142
|
-
return "\n".join(prompt_parts)
|
|
143
|
-
|
|
144
|
-
@staticmethod
|
|
145
|
-
def _get_code_block_language(language: Language) -> str:
|
|
146
|
-
"""Get code block language identifier for markdown."""
|
|
147
|
-
language_map = {
|
|
148
|
-
Language.PYTHON: "python",
|
|
149
|
-
Language.TYPESCRIPT: "typescript",
|
|
150
|
-
Language.JAVASCRIPT: "javascript",
|
|
151
|
-
Language.REACT: "tsx", # Use tsx for React files
|
|
152
|
-
Language.JAVA: "java",
|
|
153
|
-
Language.CPP: "cpp",
|
|
154
|
-
Language.C: "c",
|
|
155
|
-
Language.RUST: "rust",
|
|
156
|
-
Language.GO: "go",
|
|
157
|
-
Language.RUBY: "ruby",
|
|
158
|
-
Language.PHP: "php",
|
|
159
|
-
Language.SWIFT: "swift",
|
|
160
|
-
Language.KOTLIN: "kotlin",
|
|
161
|
-
Language.HTML: "html",
|
|
162
|
-
Language.CSS: "css",
|
|
163
|
-
Language.SHELL: "bash",
|
|
164
|
-
Language.POWERSHELL: "powershell",
|
|
165
|
-
Language.DOCKERFILE: "dockerfile",
|
|
166
|
-
Language.YAML: "yaml",
|
|
167
|
-
Language.JSON: "json",
|
|
168
|
-
Language.XML: "xml",
|
|
169
|
-
Language.MARKDOWN: "markdown",
|
|
170
|
-
}
|
|
171
|
-
return language_map.get(language, "text")
|
|
172
|
-
|
|
173
|
-
@staticmethod
|
|
174
|
-
def _get_language_guidance(language: Language) -> str | None:
|
|
175
|
-
"""Get language-specific review guidance."""
|
|
176
|
-
guidance_map = {
|
|
177
|
-
Language.PYTHON: (
|
|
178
|
-
"Focus on Python best practices:\n"
|
|
179
|
-
"- PEP 8 style compliance\n"
|
|
180
|
-
"- Type hints (Python 3.9+)\n"
|
|
181
|
-
"- Error handling patterns\n"
|
|
182
|
-
"- Docstring quality\n"
|
|
183
|
-
"- Import organization"
|
|
184
|
-
),
|
|
185
|
-
Language.TYPESCRIPT: (
|
|
186
|
-
"Focus on TypeScript best practices:\n"
|
|
187
|
-
"- Type safety and strict typing\n"
|
|
188
|
-
"- Interface and type definitions\n"
|
|
189
|
-
"- Error handling patterns\n"
|
|
190
|
-
"- Code organization (exports/imports)\n"
|
|
191
|
-
"- ESLint/TSLint compliance"
|
|
192
|
-
),
|
|
193
|
-
Language.JAVASCRIPT: (
|
|
194
|
-
"Focus on JavaScript best practices:\n"
|
|
195
|
-
"- ES6+ features usage\n"
|
|
196
|
-
"- Code organization\n"
|
|
197
|
-
"- Error handling\n"
|
|
198
|
-
"- ESLint compliance\n"
|
|
199
|
-
"- Performance considerations"
|
|
200
|
-
),
|
|
201
|
-
Language.REACT: (
|
|
202
|
-
"Focus on React best practices:\n"
|
|
203
|
-
"- React hooks usage (Rules of Hooks)\n"
|
|
204
|
-
"- Component prop type safety\n"
|
|
205
|
-
"- Performance optimization (memoization, re-renders)\n"
|
|
206
|
-
"- JSX patterns and accessibility\n"
|
|
207
|
-
"- State management patterns"
|
|
208
|
-
),
|
|
209
|
-
}
|
|
210
|
-
return guidance_map.get(language)
|
|
211
|
-
|
|
212
|
-
@staticmethod
|
|
213
|
-
def _get_feedback_requirements(language: Language) -> list[str]:
|
|
214
|
-
"""Get language-specific feedback requirements."""
|
|
215
|
-
base_requirements = [
|
|
216
|
-
"1. What the code does (brief summary)",
|
|
217
|
-
"2. Potential issues or improvements",
|
|
218
|
-
"3. Security concerns (if any)",
|
|
219
|
-
"4. Style/best practices recommendations",
|
|
220
|
-
]
|
|
221
|
-
|
|
222
|
-
# Add language-specific requirements
|
|
223
|
-
if language == Language.PYTHON:
|
|
224
|
-
base_requirements.extend(
|
|
225
|
-
[
|
|
226
|
-
"5. Type hint usage and improvements",
|
|
227
|
-
"6. Error handling improvements",
|
|
228
|
-
"7. Documentation quality (docstrings)",
|
|
229
|
-
]
|
|
230
|
-
)
|
|
231
|
-
elif language in [Language.TYPESCRIPT, Language.REACT]:
|
|
232
|
-
base_requirements.extend(
|
|
233
|
-
[
|
|
234
|
-
"5. Type safety improvements",
|
|
235
|
-
"6. Code organization and structure",
|
|
236
|
-
"7. React patterns (if React code)",
|
|
237
|
-
]
|
|
238
|
-
)
|
|
239
|
-
elif language == Language.JAVASCRIPT:
|
|
240
|
-
base_requirements.extend(
|
|
241
|
-
[
|
|
242
|
-
"5. Modern JavaScript features usage",
|
|
243
|
-
"6. Code organization",
|
|
244
|
-
"7. Performance considerations",
|
|
245
|
-
]
|
|
246
|
-
)
|
|
247
|
-
|
|
248
|
-
return base_requirements
|
|
249
|
-
|
|
250
|
-
@staticmethod
|
|
251
|
-
def validate_feedback(
|
|
252
|
-
feedback_text: str, minimum_length: int = 50
|
|
253
|
-
) -> FeedbackResult:
|
|
254
|
-
"""
|
|
255
|
-
Validate feedback text and create structured result.
|
|
256
|
-
|
|
257
|
-
Args:
|
|
258
|
-
feedback_text: Generated feedback text
|
|
259
|
-
minimum_length: Minimum required length in characters
|
|
260
|
-
|
|
261
|
-
Returns:
|
|
262
|
-
FeedbackResult with validated feedback
|
|
263
|
-
|
|
264
|
-
Raises:
|
|
265
|
-
FeedbackGenerationError: If feedback is invalid
|
|
266
|
-
"""
|
|
267
|
-
if not feedback_text or not feedback_text.strip():
|
|
268
|
-
envelope = ErrorEnvelope(
|
|
269
|
-
code="empty_feedback",
|
|
270
|
-
message="Generated feedback is empty",
|
|
271
|
-
category="validation",
|
|
272
|
-
agent="reviewer",
|
|
273
|
-
recoverable=True,
|
|
274
|
-
)
|
|
275
|
-
raise FeedbackGenerationError(envelope.to_user_message())
|
|
276
|
-
|
|
277
|
-
feedback_text = feedback_text.strip()
|
|
278
|
-
|
|
279
|
-
if len(feedback_text) < minimum_length:
|
|
280
|
-
envelope = ErrorEnvelope(
|
|
281
|
-
code="feedback_too_short",
|
|
282
|
-
message=f"Generated feedback is too short (minimum {minimum_length} characters, got {len(feedback_text)})",
|
|
283
|
-
category="validation",
|
|
284
|
-
agent="reviewer",
|
|
285
|
-
recoverable=True,
|
|
286
|
-
details={"length": len(feedback_text), "minimum": minimum_length},
|
|
287
|
-
)
|
|
288
|
-
raise FeedbackGenerationError(envelope.to_user_message())
|
|
289
|
-
|
|
290
|
-
# Extract suggestions (basic heuristic - look for numbered lists or bullet points)
|
|
291
|
-
suggestions = FeedbackGenerator._extract_suggestions(feedback_text)
|
|
292
|
-
|
|
293
|
-
# Calculate confidence based on feedback characteristics
|
|
294
|
-
confidence = FeedbackGenerator._calculate_confidence(feedback_text)
|
|
295
|
-
|
|
296
|
-
# Note: Language is not determined here - it should be passed in from context
|
|
297
|
-
# For now, we'll use UNKNOWN as a placeholder
|
|
298
|
-
# In practice, this should be determined from the review context
|
|
299
|
-
return FeedbackResult(
|
|
300
|
-
feedback=feedback_text,
|
|
301
|
-
language=Language.UNKNOWN, # Should be set from context
|
|
302
|
-
confidence=confidence,
|
|
303
|
-
suggestions=suggestions,
|
|
304
|
-
)
|
|
305
|
-
|
|
306
|
-
@staticmethod
|
|
307
|
-
def _extract_suggestions(feedback_text: str) -> list[str]:
|
|
308
|
-
"""Extract improvement suggestions from feedback text."""
|
|
309
|
-
import re
|
|
310
|
-
|
|
311
|
-
suggestions = []
|
|
312
|
-
|
|
313
|
-
# Look for numbered lists (1. ..., 2. ..., etc.)
|
|
314
|
-
numbered_pattern = r"\d+\.\s+([^\n]+)"
|
|
315
|
-
numbered_matches = re.findall(numbered_pattern, feedback_text)
|
|
316
|
-
suggestions.extend([match.strip() for match in numbered_matches])
|
|
317
|
-
|
|
318
|
-
# Look for bullet points (- ..., * ..., • ...)
|
|
319
|
-
bullet_pattern = r"[-*•]\s+([^\n]+)"
|
|
320
|
-
bullet_matches = re.findall(bullet_pattern, feedback_text)
|
|
321
|
-
suggestions.extend([match.strip() for match in bullet_matches])
|
|
322
|
-
|
|
323
|
-
# Remove duplicates while preserving order
|
|
324
|
-
seen = set()
|
|
325
|
-
unique_suggestions = []
|
|
326
|
-
for suggestion in suggestions:
|
|
327
|
-
if suggestion.lower() not in seen:
|
|
328
|
-
seen.add(suggestion.lower())
|
|
329
|
-
unique_suggestions.append(suggestion)
|
|
330
|
-
|
|
331
|
-
return unique_suggestions[:10] # Limit to top 10
|
|
332
|
-
|
|
333
|
-
@staticmethod
|
|
334
|
-
def parse_feedback_text(feedback_text: str) -> dict[str, Any]:
|
|
335
|
-
"""
|
|
336
|
-
Parse feedback text into structured format with prioritization.
|
|
337
|
-
|
|
338
|
-
Extracts:
|
|
339
|
-
- Summary (first paragraph or section)
|
|
340
|
-
- Security concerns (high priority)
|
|
341
|
-
- Critical issues (bugs, errors)
|
|
342
|
-
- Improvements (medium priority)
|
|
343
|
-
- Style suggestions (low priority)
|
|
344
|
-
|
|
345
|
-
Returns:
|
|
346
|
-
Structured feedback dictionary
|
|
347
|
-
"""
|
|
348
|
-
import re
|
|
349
|
-
|
|
350
|
-
result = {
|
|
351
|
-
"summary": "",
|
|
352
|
-
"security_concerns": [],
|
|
353
|
-
"critical_issues": [],
|
|
354
|
-
"improvements": [],
|
|
355
|
-
"style_suggestions": [],
|
|
356
|
-
"all_suggestions": [],
|
|
357
|
-
}
|
|
358
|
-
|
|
359
|
-
if not feedback_text or not feedback_text.strip():
|
|
360
|
-
return result
|
|
361
|
-
|
|
362
|
-
# Extract summary (first paragraph or first 200 chars)
|
|
363
|
-
lines = feedback_text.strip().split("\n")
|
|
364
|
-
summary_lines = []
|
|
365
|
-
for line in lines[:5]: # First 5 lines or until blank line
|
|
366
|
-
if line.strip():
|
|
367
|
-
summary_lines.append(line.strip())
|
|
368
|
-
elif summary_lines:
|
|
369
|
-
break
|
|
370
|
-
result["summary"] = " ".join(summary_lines)[:500] # Limit to 500 chars
|
|
371
|
-
|
|
372
|
-
# Extract all suggestions first
|
|
373
|
-
all_suggestions = FeedbackGenerator._extract_suggestions(feedback_text)
|
|
374
|
-
result["all_suggestions"] = all_suggestions
|
|
375
|
-
|
|
376
|
-
# Extract structured sections (Security:, Critical:, Improvement:, Style:)
|
|
377
|
-
security_section = re.search(r"Security:?\s*\n((?:[-*•]\s+[^\n]+\n?)+)", feedback_text, re.IGNORECASE | re.MULTILINE)
|
|
378
|
-
critical_section = re.search(r"Critical:?\s*\n((?:[-*•]\s+[^\n]+\n?)+)", feedback_text, re.IGNORECASE | re.MULTILINE)
|
|
379
|
-
improvement_section = re.search(r"Improvement:?\s*\n((?:[-*•]\s+[^\n]+\n?)+)", feedback_text, re.IGNORECASE | re.MULTILINE)
|
|
380
|
-
style_section = re.search(r"Style:?\s*\n((?:[-*•]\s+[^\n]+\n?)+)", feedback_text, re.IGNORECASE | re.MULTILINE)
|
|
381
|
-
|
|
382
|
-
if security_section:
|
|
383
|
-
security_items = re.findall(r"[-*•]\s+([^\n]+)", security_section.group(1))
|
|
384
|
-
result["security_concerns"].extend([item.strip() for item in security_items])
|
|
385
|
-
|
|
386
|
-
if critical_section:
|
|
387
|
-
critical_items = re.findall(r"[-*•]\s+([^\n]+)", critical_section.group(1))
|
|
388
|
-
result["critical_issues"].extend([item.strip() for item in critical_items])
|
|
389
|
-
|
|
390
|
-
if improvement_section:
|
|
391
|
-
improvement_items = re.findall(r"[-*•]\s+([^\n]+)", improvement_section.group(1))
|
|
392
|
-
result["improvements"].extend([item.strip() for item in improvement_items])
|
|
393
|
-
|
|
394
|
-
if style_section:
|
|
395
|
-
style_items = re.findall(r"[-*•]\s+([^\n]+)", style_section.group(1))
|
|
396
|
-
result["style_suggestions"].extend([item.strip() for item in style_items])
|
|
397
|
-
|
|
398
|
-
# Categorize remaining suggestions by priority (if not already categorized)
|
|
399
|
-
security_keywords = [
|
|
400
|
-
"security", "vulnerability", "vulnerable", "exploit", "injection",
|
|
401
|
-
"xss", "csrf", "sql injection", "authentication", "authorization",
|
|
402
|
-
"secret", "password", "token", "credential", "exposed", "leak"
|
|
403
|
-
]
|
|
404
|
-
|
|
405
|
-
critical_keywords = [
|
|
406
|
-
"bug", "error", "exception", "crash", "fail", "broken", "incorrect",
|
|
407
|
-
"wrong", "invalid", "null pointer", "undefined", "missing", "required"
|
|
408
|
-
]
|
|
409
|
-
|
|
410
|
-
improvement_keywords = [
|
|
411
|
-
"improve", "optimize", "performance", "efficiency", "refactor",
|
|
412
|
-
"better", "consider", "recommend", "suggest", "enhance"
|
|
413
|
-
]
|
|
414
|
-
|
|
415
|
-
# Only categorize suggestions that weren't already in structured sections
|
|
416
|
-
categorized_suggestions = set(result["security_concerns"] + result["critical_issues"] +
|
|
417
|
-
result["improvements"] + result["style_suggestions"])
|
|
418
|
-
|
|
419
|
-
for suggestion in all_suggestions:
|
|
420
|
-
if suggestion in categorized_suggestions:
|
|
421
|
-
continue # Already categorized from structured sections
|
|
422
|
-
|
|
423
|
-
suggestion_lower = suggestion.lower()
|
|
424
|
-
|
|
425
|
-
# Check for security concerns (highest priority)
|
|
426
|
-
if any(keyword in suggestion_lower for keyword in security_keywords):
|
|
427
|
-
result["security_concerns"].append(suggestion)
|
|
428
|
-
# Check for critical issues
|
|
429
|
-
elif any(keyword in suggestion_lower for keyword in critical_keywords):
|
|
430
|
-
result["critical_issues"].append(suggestion)
|
|
431
|
-
# Check for improvements
|
|
432
|
-
elif any(keyword in suggestion_lower for keyword in improvement_keywords):
|
|
433
|
-
result["improvements"].append(suggestion)
|
|
434
|
-
# Everything else is style/suggestions
|
|
435
|
-
else:
|
|
436
|
-
result["style_suggestions"].append(suggestion)
|
|
437
|
-
|
|
438
|
-
# Also extract security concerns from full text (not just suggestions)
|
|
439
|
-
security_pattern = r"(?:security|vulnerability|vulnerable|exploit).*?[.:]"
|
|
440
|
-
security_matches = re.findall(security_pattern, feedback_text, re.IGNORECASE)
|
|
441
|
-
for match in security_matches[:3]: # Limit to 3
|
|
442
|
-
match_clean = match.strip()
|
|
443
|
-
if match_clean and match_clean not in result["security_concerns"]:
|
|
444
|
-
result["security_concerns"].append(match_clean)
|
|
445
|
-
|
|
446
|
-
return result
|
|
447
|
-
|
|
448
|
-
@staticmethod
|
|
449
|
-
def _calculate_confidence(feedback_text: str) -> float:
|
|
450
|
-
"""
|
|
451
|
-
Calculate confidence score based on feedback characteristics.
|
|
452
|
-
|
|
453
|
-
Returns:
|
|
454
|
-
Confidence score (0.0-1.0)
|
|
455
|
-
"""
|
|
456
|
-
# Base confidence
|
|
457
|
-
confidence = 0.5
|
|
458
|
-
|
|
459
|
-
# Increase confidence if feedback contains specific indicators
|
|
460
|
-
if len(feedback_text) > 200:
|
|
461
|
-
confidence += 0.1
|
|
462
|
-
if len(feedback_text) > 500:
|
|
463
|
-
confidence += 0.1
|
|
464
|
-
|
|
465
|
-
# Check for structured content (numbered lists, bullet points)
|
|
466
|
-
import re
|
|
467
|
-
|
|
468
|
-
if re.search(r"\d+\.\s+", feedback_text):
|
|
469
|
-
confidence += 0.1 # Has numbered list
|
|
470
|
-
if re.search(r"[-*•]\s+", feedback_text):
|
|
471
|
-
confidence += 0.1 # Has bullet points
|
|
472
|
-
|
|
473
|
-
# Check for keywords indicating detailed analysis
|
|
474
|
-
analysis_keywords = [
|
|
475
|
-
"recommend",
|
|
476
|
-
"suggest",
|
|
477
|
-
"improve",
|
|
478
|
-
"consider",
|
|
479
|
-
"issue",
|
|
480
|
-
"problem",
|
|
481
|
-
"better",
|
|
482
|
-
"optimize",
|
|
483
|
-
]
|
|
484
|
-
keyword_count = sum(
|
|
485
|
-
1 for keyword in analysis_keywords if keyword.lower() in feedback_text.lower()
|
|
486
|
-
)
|
|
487
|
-
confidence += min(keyword_count * 0.05, 0.2) # Up to 0.2 for keywords
|
|
488
|
-
|
|
489
|
-
return min(confidence, 1.0) # Cap at 1.0
|
|
490
|
-
|
|
1
|
+
"""
|
|
2
|
+
Feedback Generator - Language-aware code review feedback generation
|
|
3
|
+
|
|
4
|
+
Phase 1.3: LLM Feedback Generation Fix
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from typing import Any
|
|
8
|
+
|
|
9
|
+
from pydantic import BaseModel, Field
|
|
10
|
+
|
|
11
|
+
from ...core.error_envelope import ErrorEnvelope
|
|
12
|
+
from ...core.language_detector import Language
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class FeedbackResult(BaseModel):
|
|
16
|
+
"""
|
|
17
|
+
Structured feedback result with validation.
|
|
18
|
+
|
|
19
|
+
Phase 1.3: LLM Feedback Generation Fix
|
|
20
|
+
"""
|
|
21
|
+
|
|
22
|
+
feedback: str = Field(
|
|
23
|
+
description="Generated feedback text", min_length=50
|
|
24
|
+
) # Minimum 50 chars
|
|
25
|
+
language: Language = Field(description="Detected language")
|
|
26
|
+
confidence: float = Field(
|
|
27
|
+
ge=0.0, le=1.0, description="Confidence in feedback quality (0.0-1.0)"
|
|
28
|
+
)
|
|
29
|
+
suggestions: list[str] = Field(
|
|
30
|
+
default_factory=list, description="List of specific improvement suggestions"
|
|
31
|
+
)
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
class FeedbackGenerationError(Exception):
|
|
35
|
+
"""Raised when feedback generation fails or produces invalid feedback."""
|
|
36
|
+
|
|
37
|
+
pass
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
class FeedbackGenerator:
|
|
41
|
+
"""
|
|
42
|
+
Generate language-aware code review feedback with validation.
|
|
43
|
+
|
|
44
|
+
Phase 1.3: LLM Feedback Generation Fix
|
|
45
|
+
"""
|
|
46
|
+
|
|
47
|
+
@staticmethod
|
|
48
|
+
def generate_prompt(
|
|
49
|
+
code: str,
|
|
50
|
+
language: Language,
|
|
51
|
+
scores: dict[str, Any] | None = None,
|
|
52
|
+
expert_guidance: dict[str, Any] | None = None,
|
|
53
|
+
code_preview_limit: int = 2000,
|
|
54
|
+
) -> str:
|
|
55
|
+
"""
|
|
56
|
+
Generate language-aware prompt for feedback generation.
|
|
57
|
+
|
|
58
|
+
Args:
|
|
59
|
+
code: Code content to review
|
|
60
|
+
language: Detected programming language
|
|
61
|
+
scores: Optional code quality scores
|
|
62
|
+
expert_guidance: Optional expert consultation results
|
|
63
|
+
code_preview_limit: Maximum characters of code to include in prompt
|
|
64
|
+
|
|
65
|
+
Returns:
|
|
66
|
+
Generated prompt string
|
|
67
|
+
"""
|
|
68
|
+
# Determine code block syntax based on language
|
|
69
|
+
code_block_lang = FeedbackGenerator._get_code_block_language(language)
|
|
70
|
+
|
|
71
|
+
prompt_parts = [
|
|
72
|
+
"Review this code and provide detailed feedback:",
|
|
73
|
+
"",
|
|
74
|
+
"Code:",
|
|
75
|
+
f"```{code_block_lang}",
|
|
76
|
+
code[:code_preview_limit],
|
|
77
|
+
"```",
|
|
78
|
+
]
|
|
79
|
+
|
|
80
|
+
# Add language-specific guidance
|
|
81
|
+
lang_guidance = FeedbackGenerator._get_language_guidance(language)
|
|
82
|
+
if lang_guidance:
|
|
83
|
+
prompt_parts.extend(["", lang_guidance])
|
|
84
|
+
|
|
85
|
+
# Add expert guidance if available
|
|
86
|
+
if expert_guidance:
|
|
87
|
+
prompt_parts.append("\nExpert Guidance:")
|
|
88
|
+
if "security" in expert_guidance:
|
|
89
|
+
prompt_parts.append(
|
|
90
|
+
f"\nSecurity Expert:\n{expert_guidance['security'][:500]}..."
|
|
91
|
+
)
|
|
92
|
+
if "performance" in expert_guidance:
|
|
93
|
+
prompt_parts.append(
|
|
94
|
+
f"\nPerformance Expert:\n{expert_guidance['performance'][:300]}..."
|
|
95
|
+
)
|
|
96
|
+
if "code_quality" in expert_guidance:
|
|
97
|
+
prompt_parts.append(
|
|
98
|
+
f"\nCode Quality Expert:\n{expert_guidance['code_quality'][:300]}..."
|
|
99
|
+
)
|
|
100
|
+
if "api_design" in expert_guidance:
|
|
101
|
+
prompt_parts.append(
|
|
102
|
+
f"\nAPI Design Expert:\n{expert_guidance['api_design'][:500]}..."
|
|
103
|
+
)
|
|
104
|
+
if "external_api" in expert_guidance:
|
|
105
|
+
prompt_parts.append(
|
|
106
|
+
f"\nExternal API Expert:\n{expert_guidance['external_api'][:300]}..."
|
|
107
|
+
)
|
|
108
|
+
prompt_parts.append("")
|
|
109
|
+
|
|
110
|
+
if scores:
|
|
111
|
+
prompt_parts.extend(
|
|
112
|
+
[
|
|
113
|
+
"",
|
|
114
|
+
"Code Quality Scores:",
|
|
115
|
+
f"- Complexity: {scores.get('complexity_score', 0):.1f}/10",
|
|
116
|
+
f"- Security: {scores.get('security_score', 0):.1f}/10",
|
|
117
|
+
f"- Maintainability: {scores.get('maintainability_score', 0):.1f}/10",
|
|
118
|
+
f"- Test Coverage: {scores.get('test_coverage_score', 0):.1f}/10",
|
|
119
|
+
f"- Performance: {scores.get('performance_score', 0):.1f}/10",
|
|
120
|
+
f"- Overall Score: {scores.get('overall_score', 0):.1f}/100",
|
|
121
|
+
]
|
|
122
|
+
)
|
|
123
|
+
|
|
124
|
+
# Add language-specific feedback requirements
|
|
125
|
+
feedback_requirements = FeedbackGenerator._get_feedback_requirements(language)
|
|
126
|
+
prompt_parts.extend(["", "Provide detailed feedback:", ""])
|
|
127
|
+
prompt_parts.extend(feedback_requirements)
|
|
128
|
+
|
|
129
|
+
# Add structured output guidance for better parsing
|
|
130
|
+
prompt_parts.extend([
|
|
131
|
+
"",
|
|
132
|
+
"Format your feedback as follows:",
|
|
133
|
+
"1. Start with a brief summary (1-2 sentences)",
|
|
134
|
+
"2. List security concerns first (if any) with 'Security:' prefix",
|
|
135
|
+
"3. List critical issues/bugs with 'Critical:' prefix",
|
|
136
|
+
"4. List improvements with 'Improvement:' prefix",
|
|
137
|
+
"5. List style suggestions last with 'Style:' prefix",
|
|
138
|
+
"",
|
|
139
|
+
"Use bullet points (-) or numbered lists for clarity.",
|
|
140
|
+
])
|
|
141
|
+
|
|
142
|
+
return "\n".join(prompt_parts)
|
|
143
|
+
|
|
144
|
+
@staticmethod
|
|
145
|
+
def _get_code_block_language(language: Language) -> str:
|
|
146
|
+
"""Get code block language identifier for markdown."""
|
|
147
|
+
language_map = {
|
|
148
|
+
Language.PYTHON: "python",
|
|
149
|
+
Language.TYPESCRIPT: "typescript",
|
|
150
|
+
Language.JAVASCRIPT: "javascript",
|
|
151
|
+
Language.REACT: "tsx", # Use tsx for React files
|
|
152
|
+
Language.JAVA: "java",
|
|
153
|
+
Language.CPP: "cpp",
|
|
154
|
+
Language.C: "c",
|
|
155
|
+
Language.RUST: "rust",
|
|
156
|
+
Language.GO: "go",
|
|
157
|
+
Language.RUBY: "ruby",
|
|
158
|
+
Language.PHP: "php",
|
|
159
|
+
Language.SWIFT: "swift",
|
|
160
|
+
Language.KOTLIN: "kotlin",
|
|
161
|
+
Language.HTML: "html",
|
|
162
|
+
Language.CSS: "css",
|
|
163
|
+
Language.SHELL: "bash",
|
|
164
|
+
Language.POWERSHELL: "powershell",
|
|
165
|
+
Language.DOCKERFILE: "dockerfile",
|
|
166
|
+
Language.YAML: "yaml",
|
|
167
|
+
Language.JSON: "json",
|
|
168
|
+
Language.XML: "xml",
|
|
169
|
+
Language.MARKDOWN: "markdown",
|
|
170
|
+
}
|
|
171
|
+
return language_map.get(language, "text")
|
|
172
|
+
|
|
173
|
+
@staticmethod
|
|
174
|
+
def _get_language_guidance(language: Language) -> str | None:
|
|
175
|
+
"""Get language-specific review guidance."""
|
|
176
|
+
guidance_map = {
|
|
177
|
+
Language.PYTHON: (
|
|
178
|
+
"Focus on Python best practices:\n"
|
|
179
|
+
"- PEP 8 style compliance\n"
|
|
180
|
+
"- Type hints (Python 3.9+)\n"
|
|
181
|
+
"- Error handling patterns\n"
|
|
182
|
+
"- Docstring quality\n"
|
|
183
|
+
"- Import organization"
|
|
184
|
+
),
|
|
185
|
+
Language.TYPESCRIPT: (
|
|
186
|
+
"Focus on TypeScript best practices:\n"
|
|
187
|
+
"- Type safety and strict typing\n"
|
|
188
|
+
"- Interface and type definitions\n"
|
|
189
|
+
"- Error handling patterns\n"
|
|
190
|
+
"- Code organization (exports/imports)\n"
|
|
191
|
+
"- ESLint/TSLint compliance"
|
|
192
|
+
),
|
|
193
|
+
Language.JAVASCRIPT: (
|
|
194
|
+
"Focus on JavaScript best practices:\n"
|
|
195
|
+
"- ES6+ features usage\n"
|
|
196
|
+
"- Code organization\n"
|
|
197
|
+
"- Error handling\n"
|
|
198
|
+
"- ESLint compliance\n"
|
|
199
|
+
"- Performance considerations"
|
|
200
|
+
),
|
|
201
|
+
Language.REACT: (
|
|
202
|
+
"Focus on React best practices:\n"
|
|
203
|
+
"- React hooks usage (Rules of Hooks)\n"
|
|
204
|
+
"- Component prop type safety\n"
|
|
205
|
+
"- Performance optimization (memoization, re-renders)\n"
|
|
206
|
+
"- JSX patterns and accessibility\n"
|
|
207
|
+
"- State management patterns"
|
|
208
|
+
),
|
|
209
|
+
}
|
|
210
|
+
return guidance_map.get(language)
|
|
211
|
+
|
|
212
|
+
@staticmethod
|
|
213
|
+
def _get_feedback_requirements(language: Language) -> list[str]:
|
|
214
|
+
"""Get language-specific feedback requirements."""
|
|
215
|
+
base_requirements = [
|
|
216
|
+
"1. What the code does (brief summary)",
|
|
217
|
+
"2. Potential issues or improvements",
|
|
218
|
+
"3. Security concerns (if any)",
|
|
219
|
+
"4. Style/best practices recommendations",
|
|
220
|
+
]
|
|
221
|
+
|
|
222
|
+
# Add language-specific requirements
|
|
223
|
+
if language == Language.PYTHON:
|
|
224
|
+
base_requirements.extend(
|
|
225
|
+
[
|
|
226
|
+
"5. Type hint usage and improvements",
|
|
227
|
+
"6. Error handling improvements",
|
|
228
|
+
"7. Documentation quality (docstrings)",
|
|
229
|
+
]
|
|
230
|
+
)
|
|
231
|
+
elif language in [Language.TYPESCRIPT, Language.REACT]:
|
|
232
|
+
base_requirements.extend(
|
|
233
|
+
[
|
|
234
|
+
"5. Type safety improvements",
|
|
235
|
+
"6. Code organization and structure",
|
|
236
|
+
"7. React patterns (if React code)",
|
|
237
|
+
]
|
|
238
|
+
)
|
|
239
|
+
elif language == Language.JAVASCRIPT:
|
|
240
|
+
base_requirements.extend(
|
|
241
|
+
[
|
|
242
|
+
"5. Modern JavaScript features usage",
|
|
243
|
+
"6. Code organization",
|
|
244
|
+
"7. Performance considerations",
|
|
245
|
+
]
|
|
246
|
+
)
|
|
247
|
+
|
|
248
|
+
return base_requirements
|
|
249
|
+
|
|
250
|
+
@staticmethod
|
|
251
|
+
def validate_feedback(
|
|
252
|
+
feedback_text: str, minimum_length: int = 50
|
|
253
|
+
) -> FeedbackResult:
|
|
254
|
+
"""
|
|
255
|
+
Validate feedback text and create structured result.
|
|
256
|
+
|
|
257
|
+
Args:
|
|
258
|
+
feedback_text: Generated feedback text
|
|
259
|
+
minimum_length: Minimum required length in characters
|
|
260
|
+
|
|
261
|
+
Returns:
|
|
262
|
+
FeedbackResult with validated feedback
|
|
263
|
+
|
|
264
|
+
Raises:
|
|
265
|
+
FeedbackGenerationError: If feedback is invalid
|
|
266
|
+
"""
|
|
267
|
+
if not feedback_text or not feedback_text.strip():
|
|
268
|
+
envelope = ErrorEnvelope(
|
|
269
|
+
code="empty_feedback",
|
|
270
|
+
message="Generated feedback is empty",
|
|
271
|
+
category="validation",
|
|
272
|
+
agent="reviewer",
|
|
273
|
+
recoverable=True,
|
|
274
|
+
)
|
|
275
|
+
raise FeedbackGenerationError(envelope.to_user_message())
|
|
276
|
+
|
|
277
|
+
feedback_text = feedback_text.strip()
|
|
278
|
+
|
|
279
|
+
if len(feedback_text) < minimum_length:
|
|
280
|
+
envelope = ErrorEnvelope(
|
|
281
|
+
code="feedback_too_short",
|
|
282
|
+
message=f"Generated feedback is too short (minimum {minimum_length} characters, got {len(feedback_text)})",
|
|
283
|
+
category="validation",
|
|
284
|
+
agent="reviewer",
|
|
285
|
+
recoverable=True,
|
|
286
|
+
details={"length": len(feedback_text), "minimum": minimum_length},
|
|
287
|
+
)
|
|
288
|
+
raise FeedbackGenerationError(envelope.to_user_message())
|
|
289
|
+
|
|
290
|
+
# Extract suggestions (basic heuristic - look for numbered lists or bullet points)
|
|
291
|
+
suggestions = FeedbackGenerator._extract_suggestions(feedback_text)
|
|
292
|
+
|
|
293
|
+
# Calculate confidence based on feedback characteristics
|
|
294
|
+
confidence = FeedbackGenerator._calculate_confidence(feedback_text)
|
|
295
|
+
|
|
296
|
+
# Note: Language is not determined here - it should be passed in from context
|
|
297
|
+
# For now, we'll use UNKNOWN as a placeholder
|
|
298
|
+
# In practice, this should be determined from the review context
|
|
299
|
+
return FeedbackResult(
|
|
300
|
+
feedback=feedback_text,
|
|
301
|
+
language=Language.UNKNOWN, # Should be set from context
|
|
302
|
+
confidence=confidence,
|
|
303
|
+
suggestions=suggestions,
|
|
304
|
+
)
|
|
305
|
+
|
|
306
|
+
@staticmethod
|
|
307
|
+
def _extract_suggestions(feedback_text: str) -> list[str]:
|
|
308
|
+
"""Extract improvement suggestions from feedback text."""
|
|
309
|
+
import re
|
|
310
|
+
|
|
311
|
+
suggestions = []
|
|
312
|
+
|
|
313
|
+
# Look for numbered lists (1. ..., 2. ..., etc.)
|
|
314
|
+
numbered_pattern = r"\d+\.\s+([^\n]+)"
|
|
315
|
+
numbered_matches = re.findall(numbered_pattern, feedback_text)
|
|
316
|
+
suggestions.extend([match.strip() for match in numbered_matches])
|
|
317
|
+
|
|
318
|
+
# Look for bullet points (- ..., * ..., • ...)
|
|
319
|
+
bullet_pattern = r"[-*•]\s+([^\n]+)"
|
|
320
|
+
bullet_matches = re.findall(bullet_pattern, feedback_text)
|
|
321
|
+
suggestions.extend([match.strip() for match in bullet_matches])
|
|
322
|
+
|
|
323
|
+
# Remove duplicates while preserving order
|
|
324
|
+
seen = set()
|
|
325
|
+
unique_suggestions = []
|
|
326
|
+
for suggestion in suggestions:
|
|
327
|
+
if suggestion.lower() not in seen:
|
|
328
|
+
seen.add(suggestion.lower())
|
|
329
|
+
unique_suggestions.append(suggestion)
|
|
330
|
+
|
|
331
|
+
return unique_suggestions[:10] # Limit to top 10
|
|
332
|
+
|
|
333
|
+
@staticmethod
|
|
334
|
+
def parse_feedback_text(feedback_text: str) -> dict[str, Any]:
|
|
335
|
+
"""
|
|
336
|
+
Parse feedback text into structured format with prioritization.
|
|
337
|
+
|
|
338
|
+
Extracts:
|
|
339
|
+
- Summary (first paragraph or section)
|
|
340
|
+
- Security concerns (high priority)
|
|
341
|
+
- Critical issues (bugs, errors)
|
|
342
|
+
- Improvements (medium priority)
|
|
343
|
+
- Style suggestions (low priority)
|
|
344
|
+
|
|
345
|
+
Returns:
|
|
346
|
+
Structured feedback dictionary
|
|
347
|
+
"""
|
|
348
|
+
import re
|
|
349
|
+
|
|
350
|
+
result = {
|
|
351
|
+
"summary": "",
|
|
352
|
+
"security_concerns": [],
|
|
353
|
+
"critical_issues": [],
|
|
354
|
+
"improvements": [],
|
|
355
|
+
"style_suggestions": [],
|
|
356
|
+
"all_suggestions": [],
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
if not feedback_text or not feedback_text.strip():
|
|
360
|
+
return result
|
|
361
|
+
|
|
362
|
+
# Extract summary (first paragraph or first 200 chars)
|
|
363
|
+
lines = feedback_text.strip().split("\n")
|
|
364
|
+
summary_lines = []
|
|
365
|
+
for line in lines[:5]: # First 5 lines or until blank line
|
|
366
|
+
if line.strip():
|
|
367
|
+
summary_lines.append(line.strip())
|
|
368
|
+
elif summary_lines:
|
|
369
|
+
break
|
|
370
|
+
result["summary"] = " ".join(summary_lines)[:500] # Limit to 500 chars
|
|
371
|
+
|
|
372
|
+
# Extract all suggestions first
|
|
373
|
+
all_suggestions = FeedbackGenerator._extract_suggestions(feedback_text)
|
|
374
|
+
result["all_suggestions"] = all_suggestions
|
|
375
|
+
|
|
376
|
+
# Extract structured sections (Security:, Critical:, Improvement:, Style:)
|
|
377
|
+
security_section = re.search(r"Security:?\s*\n((?:[-*•]\s+[^\n]+\n?)+)", feedback_text, re.IGNORECASE | re.MULTILINE)
|
|
378
|
+
critical_section = re.search(r"Critical:?\s*\n((?:[-*•]\s+[^\n]+\n?)+)", feedback_text, re.IGNORECASE | re.MULTILINE)
|
|
379
|
+
improvement_section = re.search(r"Improvement:?\s*\n((?:[-*•]\s+[^\n]+\n?)+)", feedback_text, re.IGNORECASE | re.MULTILINE)
|
|
380
|
+
style_section = re.search(r"Style:?\s*\n((?:[-*•]\s+[^\n]+\n?)+)", feedback_text, re.IGNORECASE | re.MULTILINE)
|
|
381
|
+
|
|
382
|
+
if security_section:
|
|
383
|
+
security_items = re.findall(r"[-*•]\s+([^\n]+)", security_section.group(1))
|
|
384
|
+
result["security_concerns"].extend([item.strip() for item in security_items])
|
|
385
|
+
|
|
386
|
+
if critical_section:
|
|
387
|
+
critical_items = re.findall(r"[-*•]\s+([^\n]+)", critical_section.group(1))
|
|
388
|
+
result["critical_issues"].extend([item.strip() for item in critical_items])
|
|
389
|
+
|
|
390
|
+
if improvement_section:
|
|
391
|
+
improvement_items = re.findall(r"[-*•]\s+([^\n]+)", improvement_section.group(1))
|
|
392
|
+
result["improvements"].extend([item.strip() for item in improvement_items])
|
|
393
|
+
|
|
394
|
+
if style_section:
|
|
395
|
+
style_items = re.findall(r"[-*•]\s+([^\n]+)", style_section.group(1))
|
|
396
|
+
result["style_suggestions"].extend([item.strip() for item in style_items])
|
|
397
|
+
|
|
398
|
+
# Categorize remaining suggestions by priority (if not already categorized)
|
|
399
|
+
security_keywords = [
|
|
400
|
+
"security", "vulnerability", "vulnerable", "exploit", "injection",
|
|
401
|
+
"xss", "csrf", "sql injection", "authentication", "authorization",
|
|
402
|
+
"secret", "password", "token", "credential", "exposed", "leak"
|
|
403
|
+
]
|
|
404
|
+
|
|
405
|
+
critical_keywords = [
|
|
406
|
+
"bug", "error", "exception", "crash", "fail", "broken", "incorrect",
|
|
407
|
+
"wrong", "invalid", "null pointer", "undefined", "missing", "required"
|
|
408
|
+
]
|
|
409
|
+
|
|
410
|
+
improvement_keywords = [
|
|
411
|
+
"improve", "optimize", "performance", "efficiency", "refactor",
|
|
412
|
+
"better", "consider", "recommend", "suggest", "enhance"
|
|
413
|
+
]
|
|
414
|
+
|
|
415
|
+
# Only categorize suggestions that weren't already in structured sections
|
|
416
|
+
categorized_suggestions = set(result["security_concerns"] + result["critical_issues"] +
|
|
417
|
+
result["improvements"] + result["style_suggestions"])
|
|
418
|
+
|
|
419
|
+
for suggestion in all_suggestions:
|
|
420
|
+
if suggestion in categorized_suggestions:
|
|
421
|
+
continue # Already categorized from structured sections
|
|
422
|
+
|
|
423
|
+
suggestion_lower = suggestion.lower()
|
|
424
|
+
|
|
425
|
+
# Check for security concerns (highest priority)
|
|
426
|
+
if any(keyword in suggestion_lower for keyword in security_keywords):
|
|
427
|
+
result["security_concerns"].append(suggestion)
|
|
428
|
+
# Check for critical issues
|
|
429
|
+
elif any(keyword in suggestion_lower for keyword in critical_keywords):
|
|
430
|
+
result["critical_issues"].append(suggestion)
|
|
431
|
+
# Check for improvements
|
|
432
|
+
elif any(keyword in suggestion_lower for keyword in improvement_keywords):
|
|
433
|
+
result["improvements"].append(suggestion)
|
|
434
|
+
# Everything else is style/suggestions
|
|
435
|
+
else:
|
|
436
|
+
result["style_suggestions"].append(suggestion)
|
|
437
|
+
|
|
438
|
+
# Also extract security concerns from full text (not just suggestions)
|
|
439
|
+
security_pattern = r"(?:security|vulnerability|vulnerable|exploit).*?[.:]"
|
|
440
|
+
security_matches = re.findall(security_pattern, feedback_text, re.IGNORECASE)
|
|
441
|
+
for match in security_matches[:3]: # Limit to 3
|
|
442
|
+
match_clean = match.strip()
|
|
443
|
+
if match_clean and match_clean not in result["security_concerns"]:
|
|
444
|
+
result["security_concerns"].append(match_clean)
|
|
445
|
+
|
|
446
|
+
return result
|
|
447
|
+
|
|
448
|
+
@staticmethod
|
|
449
|
+
def _calculate_confidence(feedback_text: str) -> float:
|
|
450
|
+
"""
|
|
451
|
+
Calculate confidence score based on feedback characteristics.
|
|
452
|
+
|
|
453
|
+
Returns:
|
|
454
|
+
Confidence score (0.0-1.0)
|
|
455
|
+
"""
|
|
456
|
+
# Base confidence
|
|
457
|
+
confidence = 0.5
|
|
458
|
+
|
|
459
|
+
# Increase confidence if feedback contains specific indicators
|
|
460
|
+
if len(feedback_text) > 200:
|
|
461
|
+
confidence += 0.1
|
|
462
|
+
if len(feedback_text) > 500:
|
|
463
|
+
confidence += 0.1
|
|
464
|
+
|
|
465
|
+
# Check for structured content (numbered lists, bullet points)
|
|
466
|
+
import re
|
|
467
|
+
|
|
468
|
+
if re.search(r"\d+\.\s+", feedback_text):
|
|
469
|
+
confidence += 0.1 # Has numbered list
|
|
470
|
+
if re.search(r"[-*•]\s+", feedback_text):
|
|
471
|
+
confidence += 0.1 # Has bullet points
|
|
472
|
+
|
|
473
|
+
# Check for keywords indicating detailed analysis
|
|
474
|
+
analysis_keywords = [
|
|
475
|
+
"recommend",
|
|
476
|
+
"suggest",
|
|
477
|
+
"improve",
|
|
478
|
+
"consider",
|
|
479
|
+
"issue",
|
|
480
|
+
"problem",
|
|
481
|
+
"better",
|
|
482
|
+
"optimize",
|
|
483
|
+
]
|
|
484
|
+
keyword_count = sum(
|
|
485
|
+
1 for keyword in analysis_keywords if keyword.lower() in feedback_text.lower()
|
|
486
|
+
)
|
|
487
|
+
confidence += min(keyword_count * 0.05, 0.2) # Up to 0.2 for keywords
|
|
488
|
+
|
|
489
|
+
return min(confidence, 1.0) # Cap at 1.0
|
|
490
|
+
|