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,754 +1,754 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Improver Agent - Refactors and enhances existing code
|
|
3
|
-
|
|
4
|
-
Phase 7.1: Auto-Apply Enhancement - adds --auto-apply and --preview flags
|
|
5
|
-
"""
|
|
6
|
-
|
|
7
|
-
import difflib
|
|
8
|
-
import inspect
|
|
9
|
-
import logging
|
|
10
|
-
import shutil
|
|
11
|
-
from dataclasses import dataclass, asdict
|
|
12
|
-
from datetime import datetime
|
|
13
|
-
from pathlib import Path
|
|
14
|
-
from typing import Any
|
|
15
|
-
|
|
16
|
-
from ...context7.agent_integration import Context7AgentHelper, get_context7_helper
|
|
17
|
-
from ...core.agent_base import BaseAgent
|
|
18
|
-
from ...core.config import ProjectConfig, load_config
|
|
19
|
-
from ...core.instructions import GenericInstruction
|
|
20
|
-
from ...core.tiered_context import ContextTier
|
|
21
|
-
|
|
22
|
-
logger = logging.getLogger(__name__)
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
@dataclass
|
|
26
|
-
class DiffResult:
|
|
27
|
-
"""Result of code diff generation."""
|
|
28
|
-
|
|
29
|
-
unified_diff: str
|
|
30
|
-
lines_added: int
|
|
31
|
-
lines_removed: int
|
|
32
|
-
has_changes: bool
|
|
33
|
-
|
|
34
|
-
def to_dict(self) -> dict[str, Any]:
|
|
35
|
-
"""Convert to dictionary."""
|
|
36
|
-
return asdict(self)
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
class ImproverAgent(BaseAgent):
|
|
40
|
-
"""
|
|
41
|
-
Improver Agent - Code refactoring, performance optimization, and quality improvements.
|
|
42
|
-
|
|
43
|
-
Permissions: Read, Write, Edit, Grep, Glob (no Bash)
|
|
44
|
-
|
|
45
|
-
⚠️ CRITICAL ACCURACY REQUIREMENT:
|
|
46
|
-
- NEVER make up, invent, or fabricate information - Only report verified facts
|
|
47
|
-
- ALWAYS verify claims by checking actual results, not just test pass/fail
|
|
48
|
-
- Verify API calls succeed - inspect response data, status codes, error messages
|
|
49
|
-
- Distinguish between code paths executing and actual functionality working
|
|
50
|
-
- Admit uncertainty explicitly when you cannot verify
|
|
51
|
-
"""
|
|
52
|
-
|
|
53
|
-
def __init__(self, config: ProjectConfig | None = None):
|
|
54
|
-
super().__init__(
|
|
55
|
-
agent_id="improver", agent_name="Improver Agent", config=config
|
|
56
|
-
)
|
|
57
|
-
if config is None:
|
|
58
|
-
config = load_config()
|
|
59
|
-
self.config = config
|
|
60
|
-
self.project_root: Path = Path.cwd()
|
|
61
|
-
|
|
62
|
-
# Initialize Context7 helper (Enhancement: Universal Context7 integration)
|
|
63
|
-
self.context7: Context7AgentHelper | None = None
|
|
64
|
-
if config:
|
|
65
|
-
self.context7 = get_context7_helper(self, config)
|
|
66
|
-
|
|
67
|
-
async def activate(self, project_root: Path | None = None, offline_mode: bool = False):
|
|
68
|
-
await super().activate(project_root, offline_mode=offline_mode)
|
|
69
|
-
if project_root is not None:
|
|
70
|
-
self.project_root = project_root
|
|
71
|
-
self.greet()
|
|
72
|
-
await self.run("help")
|
|
73
|
-
|
|
74
|
-
def greet(self):
|
|
75
|
-
print(
|
|
76
|
-
f"Hello! I am the {self.agent_name}. I help refactor and improve code quality."
|
|
77
|
-
)
|
|
78
|
-
|
|
79
|
-
async def run(self, command: str, **kwargs: Any) -> dict[str, Any]:
|
|
80
|
-
command = command.lstrip("*") # Remove star prefix if present
|
|
81
|
-
handler_name = f"_handle_{command.replace('-', '_')}"
|
|
82
|
-
if hasattr(self, handler_name):
|
|
83
|
-
handler = getattr(self, handler_name)
|
|
84
|
-
# Handle both sync and async handlers
|
|
85
|
-
if inspect.iscoroutinefunction(handler):
|
|
86
|
-
return await handler(**kwargs)
|
|
87
|
-
else:
|
|
88
|
-
return handler(**kwargs)
|
|
89
|
-
else:
|
|
90
|
-
return {
|
|
91
|
-
"error": f"Unknown command: {command}. Use '*help' to see available commands."
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
async def _handle_refactor(
|
|
95
|
-
self,
|
|
96
|
-
file_path: str | None = None,
|
|
97
|
-
instruction: str | None = None,
|
|
98
|
-
**kwargs: Any,
|
|
99
|
-
) -> dict[str, Any]:
|
|
100
|
-
"""Refactor existing code to improve structure and maintainability."""
|
|
101
|
-
if not file_path:
|
|
102
|
-
return {
|
|
103
|
-
"error": "File path required. Usage: *refactor <file_path> [instruction]"
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
file_path_obj = Path(file_path)
|
|
107
|
-
if not file_path_obj.is_absolute():
|
|
108
|
-
file_path_obj = self.project_root / file_path_obj
|
|
109
|
-
|
|
110
|
-
try:
|
|
111
|
-
self._validate_path(file_path_obj)
|
|
112
|
-
except (FileNotFoundError, ValueError) as e:
|
|
113
|
-
return {"error": str(e)}
|
|
114
|
-
|
|
115
|
-
if not file_path_obj.exists():
|
|
116
|
-
return {"error": f"File not found: {file_path}"}
|
|
117
|
-
|
|
118
|
-
# Refactoring in progress...
|
|
119
|
-
|
|
120
|
-
# Read current code
|
|
121
|
-
current_code = file_path_obj.read_text(encoding="utf-8")
|
|
122
|
-
|
|
123
|
-
# Get context for refactoring
|
|
124
|
-
context_text = self.get_context_text(file_path_obj, tier=ContextTier.TIER2)
|
|
125
|
-
|
|
126
|
-
# Enhancement: Auto-detect libraries and fetch Context7 documentation
|
|
127
|
-
context7_docs = {}
|
|
128
|
-
context7_guidance = ""
|
|
129
|
-
try:
|
|
130
|
-
from ...core.language_detector import LanguageDetector
|
|
131
|
-
detector = LanguageDetector()
|
|
132
|
-
language = detector.detect_language(file_path_obj)
|
|
133
|
-
|
|
134
|
-
# Use universal auto-detection hook for Context7 docs
|
|
135
|
-
context7_docs = await self._auto_fetch_context7_docs(
|
|
136
|
-
code=current_code,
|
|
137
|
-
prompt=instruction or "Refactor code to improve structure and maintainability",
|
|
138
|
-
language=language,
|
|
139
|
-
)
|
|
140
|
-
|
|
141
|
-
# Add Context7 guidance to prompt if available
|
|
142
|
-
if context7_docs:
|
|
143
|
-
context7_guidance = "\n\nRelevant Library Best Practices from Context7:\n"
|
|
144
|
-
for lib_name, lib_doc in context7_docs.items():
|
|
145
|
-
if lib_doc and lib_doc.get("content"):
|
|
146
|
-
content_preview = lib_doc.get("content", "")[:500]
|
|
147
|
-
context7_guidance += f"\n{lib_name}:\n{content_preview}...\n"
|
|
148
|
-
logger.debug(f"Auto-fetched Context7 docs for {len(context7_docs)} libraries using universal hook")
|
|
149
|
-
except Exception as e:
|
|
150
|
-
logger.debug(f"Context7 auto-detection failed during refactor: {e}, continuing without Context7 docs")
|
|
151
|
-
|
|
152
|
-
# Build prompt for refactoring
|
|
153
|
-
instruction_text = (
|
|
154
|
-
instruction
|
|
155
|
-
or "Improve code structure, readability, and maintainability while preserving functionality."
|
|
156
|
-
)
|
|
157
|
-
|
|
158
|
-
prompt = f"""Refactor the following code to improve its quality:
|
|
159
|
-
|
|
160
|
-
{instruction_text}
|
|
161
|
-
|
|
162
|
-
Current code:
|
|
163
|
-
```python
|
|
164
|
-
{current_code}
|
|
165
|
-
```
|
|
166
|
-
|
|
167
|
-
Context (other related files):
|
|
168
|
-
{context_text}
|
|
169
|
-
{context7_guidance}
|
|
170
|
-
|
|
171
|
-
Provide the refactored code that:
|
|
172
|
-
1. Improves code structure and organization
|
|
173
|
-
2. Enhances readability and maintainability
|
|
174
|
-
3. Preserves all existing functionality
|
|
175
|
-
4. Follows best practices and design patterns
|
|
176
|
-
5. Maintains backward compatibility
|
|
177
|
-
|
|
178
|
-
Return only the refactored code, wrapped in ```python code blocks."""
|
|
179
|
-
|
|
180
|
-
# Prepare instruction for Cursor Skills
|
|
181
|
-
instruction = GenericInstruction(
|
|
182
|
-
agent_name="improver",
|
|
183
|
-
command="refactor",
|
|
184
|
-
prompt=prompt,
|
|
185
|
-
parameters={"file_path": str(file_path)},
|
|
186
|
-
)
|
|
187
|
-
|
|
188
|
-
return {
|
|
189
|
-
"message": f"Refactoring instruction prepared for {file_path}",
|
|
190
|
-
"instruction": instruction.to_dict(),
|
|
191
|
-
"skill_command": instruction.to_skill_command(),
|
|
192
|
-
"file": str(file_path),
|
|
193
|
-
"note": "⚠️ IMPORTANT: When you see this instruction object in Cursor, you MUST execute it by:",
|
|
194
|
-
"execution_instructions": [
|
|
195
|
-
f"1. Read the file: {file_path}",
|
|
196
|
-
"2. Use the 'prompt' field from the instruction object as your refactoring directive",
|
|
197
|
-
"3. Actually refactor the code by editing the file according to the prompt",
|
|
198
|
-
"4. Preserve all existing functionality while improving structure and maintainability",
|
|
199
|
-
"5. Explain what refactoring changes you made and why",
|
|
200
|
-
"",
|
|
201
|
-
"DO NOT just return the instruction object - you must execute it by refactoring the code!",
|
|
202
|
-
],
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
async def _handle_optimize(
|
|
206
|
-
self,
|
|
207
|
-
file_path: str | None = None,
|
|
208
|
-
optimization_type: str = "performance",
|
|
209
|
-
**kwargs: Any,
|
|
210
|
-
) -> dict[str, Any]:
|
|
211
|
-
"""Optimize code for performance, memory, or other metrics."""
|
|
212
|
-
if not file_path:
|
|
213
|
-
return {
|
|
214
|
-
"error": "File path required. Usage: *optimize <file_path> [optimization_type]"
|
|
215
|
-
}
|
|
216
|
-
|
|
217
|
-
file_path_obj = Path(file_path)
|
|
218
|
-
if not file_path_obj.is_absolute():
|
|
219
|
-
file_path_obj = self.project_root / file_path_obj
|
|
220
|
-
|
|
221
|
-
try:
|
|
222
|
-
self._validate_path(file_path_obj)
|
|
223
|
-
except (FileNotFoundError, ValueError) as e:
|
|
224
|
-
return {"error": str(e)}
|
|
225
|
-
|
|
226
|
-
if not file_path_obj.exists():
|
|
227
|
-
return {"error": f"File not found: {file_path}"}
|
|
228
|
-
|
|
229
|
-
# Optimizing in progress...
|
|
230
|
-
|
|
231
|
-
# Read current code
|
|
232
|
-
current_code = file_path_obj.read_text(encoding="utf-8")
|
|
233
|
-
|
|
234
|
-
# Get context
|
|
235
|
-
context_text = self.get_context_text(file_path_obj, tier=ContextTier.TIER2)
|
|
236
|
-
|
|
237
|
-
# Enhancement: Auto-detect libraries and fetch Context7 documentation
|
|
238
|
-
context7_docs = {}
|
|
239
|
-
context7_guidance = ""
|
|
240
|
-
try:
|
|
241
|
-
from ...core.language_detector import LanguageDetector
|
|
242
|
-
detector = LanguageDetector()
|
|
243
|
-
language = detector.detect_language(file_path_obj)
|
|
244
|
-
|
|
245
|
-
# Use universal auto-detection hook for Context7 docs
|
|
246
|
-
context7_docs = await self._auto_fetch_context7_docs(
|
|
247
|
-
code=current_code,
|
|
248
|
-
prompt=f"Optimize code for {optimization_type}",
|
|
249
|
-
language=language,
|
|
250
|
-
)
|
|
251
|
-
|
|
252
|
-
# Add Context7 guidance to prompt if available
|
|
253
|
-
if context7_docs:
|
|
254
|
-
context7_guidance = "\n\nRelevant Library Optimization Best Practices from Context7:\n"
|
|
255
|
-
for lib_name, lib_doc in context7_docs.items():
|
|
256
|
-
if lib_doc and lib_doc.get("content"):
|
|
257
|
-
content_preview = lib_doc.get("content", "")[:500]
|
|
258
|
-
context7_guidance += f"\n{lib_name}:\n{content_preview}...\n"
|
|
259
|
-
logger.debug(f"Auto-fetched Context7 docs for {len(context7_docs)} libraries using universal hook")
|
|
260
|
-
except Exception as e:
|
|
261
|
-
logger.debug(f"Context7 auto-detection failed during optimize: {e}, continuing without Context7 docs")
|
|
262
|
-
|
|
263
|
-
optimization_prompts = {
|
|
264
|
-
"performance": "Optimize for execution speed and efficiency",
|
|
265
|
-
"memory": "Optimize for memory usage and reduce memory footprint",
|
|
266
|
-
"both": "Optimize for both performance and memory usage",
|
|
267
|
-
}
|
|
268
|
-
|
|
269
|
-
optimization_instruction = optimization_prompts.get(
|
|
270
|
-
optimization_type, optimization_prompts["performance"]
|
|
271
|
-
)
|
|
272
|
-
|
|
273
|
-
prompt = f"""Optimize the following code for {optimization_type}:
|
|
274
|
-
|
|
275
|
-
{optimization_instruction}
|
|
276
|
-
|
|
277
|
-
Current code:
|
|
278
|
-
```python
|
|
279
|
-
{current_code}
|
|
280
|
-
```
|
|
281
|
-
|
|
282
|
-
Context (other related files):
|
|
283
|
-
{context_text}
|
|
284
|
-
{context7_guidance}
|
|
285
|
-
|
|
286
|
-
Provide the optimized code that:
|
|
287
|
-
1. Improves {optimization_type} characteristics
|
|
288
|
-
2. Maintains functionality and correctness
|
|
289
|
-
3. Preserves code readability
|
|
290
|
-
4. Uses efficient algorithms and data structures
|
|
291
|
-
5. Eliminates unnecessary operations
|
|
292
|
-
|
|
293
|
-
Return only the optimized code, wrapped in ```python code blocks."""
|
|
294
|
-
|
|
295
|
-
# Prepare instruction for Cursor Skills
|
|
296
|
-
instruction = GenericInstruction(
|
|
297
|
-
agent_name="improver",
|
|
298
|
-
command="optimize",
|
|
299
|
-
prompt=prompt,
|
|
300
|
-
parameters={
|
|
301
|
-
"file_path": str(file_path),
|
|
302
|
-
"optimization_type": optimization_type,
|
|
303
|
-
},
|
|
304
|
-
)
|
|
305
|
-
|
|
306
|
-
return {
|
|
307
|
-
"message": f"Optimization instruction prepared for {file_path}",
|
|
308
|
-
"instruction": instruction.to_dict(),
|
|
309
|
-
"skill_command": instruction.to_skill_command(),
|
|
310
|
-
"file": str(file_path),
|
|
311
|
-
"optimization_type": optimization_type,
|
|
312
|
-
"note": "⚠️ IMPORTANT: When you see this instruction object in Cursor, you MUST execute it by:",
|
|
313
|
-
"execution_instructions": [
|
|
314
|
-
f"1. Read the file: {file_path}",
|
|
315
|
-
"2. Use the 'prompt' field from the instruction object as your optimization directive",
|
|
316
|
-
f"3. Actually optimize the code for {optimization_type} by editing the file according to the prompt",
|
|
317
|
-
"4. Maintain functionality and correctness while improving performance/memory characteristics",
|
|
318
|
-
"5. Explain what optimizations you made and why",
|
|
319
|
-
"",
|
|
320
|
-
"DO NOT just return the instruction object - you must execute it by optimizing the code!",
|
|
321
|
-
],
|
|
322
|
-
}
|
|
323
|
-
|
|
324
|
-
async def _handle_improve_quality(
|
|
325
|
-
self,
|
|
326
|
-
file_path: str | None = None,
|
|
327
|
-
focus: str | None = None,
|
|
328
|
-
auto_apply: bool = False,
|
|
329
|
-
preview: bool = False,
|
|
330
|
-
**kwargs: Any,
|
|
331
|
-
) -> dict[str, Any]:
|
|
332
|
-
"""
|
|
333
|
-
Improve overall code quality (structure, patterns, best practices).
|
|
334
|
-
|
|
335
|
-
Phase 7.1 Enhancement: Added --auto-apply and --preview flags.
|
|
336
|
-
|
|
337
|
-
Args:
|
|
338
|
-
file_path: Path to file to improve
|
|
339
|
-
focus: Specific areas to focus on (comma-separated)
|
|
340
|
-
auto_apply: If True, automatically apply improvements
|
|
341
|
-
preview: If True, show diff preview without applying
|
|
342
|
-
"""
|
|
343
|
-
if not file_path:
|
|
344
|
-
return {"error": "File path required. Usage: *improve-quality <file_path> [--auto-apply] [--preview]"}
|
|
345
|
-
|
|
346
|
-
file_path_obj = Path(file_path)
|
|
347
|
-
if not file_path_obj.is_absolute():
|
|
348
|
-
file_path_obj = self.project_root / file_path_obj
|
|
349
|
-
|
|
350
|
-
try:
|
|
351
|
-
self._validate_path(file_path_obj)
|
|
352
|
-
except (FileNotFoundError, ValueError) as e:
|
|
353
|
-
return {"error": str(e)}
|
|
354
|
-
|
|
355
|
-
if not file_path_obj.exists():
|
|
356
|
-
return {"error": f"File not found: {file_path}"}
|
|
357
|
-
|
|
358
|
-
# Read current code
|
|
359
|
-
current_code = file_path_obj.read_text(encoding="utf-8")
|
|
360
|
-
|
|
361
|
-
# Get context
|
|
362
|
-
context_text = self.get_context_text(file_path_obj, tier=ContextTier.TIER2)
|
|
363
|
-
|
|
364
|
-
# Enhancement: Auto-detect libraries and fetch Context7 documentation
|
|
365
|
-
context7_docs = {}
|
|
366
|
-
context7_guidance = ""
|
|
367
|
-
try:
|
|
368
|
-
from ...core.language_detector import LanguageDetector
|
|
369
|
-
detector = LanguageDetector()
|
|
370
|
-
language = detector.detect_language(file_path_obj)
|
|
371
|
-
|
|
372
|
-
# Use universal auto-detection hook for Context7 docs
|
|
373
|
-
focus_prompt = f"Improve code quality" + (f" focusing on {focus}" if focus else "")
|
|
374
|
-
context7_docs = await self._auto_fetch_context7_docs(
|
|
375
|
-
code=current_code,
|
|
376
|
-
prompt=focus_prompt,
|
|
377
|
-
language=language,
|
|
378
|
-
)
|
|
379
|
-
|
|
380
|
-
# Add Context7 guidance to prompt if available
|
|
381
|
-
if context7_docs:
|
|
382
|
-
context7_guidance = "\n\nRelevant Library Best Practices from Context7:\n"
|
|
383
|
-
for lib_name, lib_doc in context7_docs.items():
|
|
384
|
-
if lib_doc and lib_doc.get("content"):
|
|
385
|
-
content_preview = lib_doc.get("content", "")[:500]
|
|
386
|
-
context7_guidance += f"\n{lib_name}:\n{content_preview}...\n"
|
|
387
|
-
logger.debug(f"Auto-fetched Context7 docs for {len(context7_docs)} libraries using universal hook")
|
|
388
|
-
except Exception as e:
|
|
389
|
-
logger.debug(f"Context7 auto-detection failed during improve-quality: {e}, continuing without Context7 docs")
|
|
390
|
-
|
|
391
|
-
# Parse focus areas
|
|
392
|
-
focus_areas = []
|
|
393
|
-
if focus:
|
|
394
|
-
focus_areas = [area.strip() for area in focus.split(",") if area.strip()]
|
|
395
|
-
|
|
396
|
-
# Build focus-specific prompt section
|
|
397
|
-
focus_text = ""
|
|
398
|
-
if focus_areas:
|
|
399
|
-
focus_text = "\n\nFocus specifically on these quality aspects:\n"
|
|
400
|
-
for area in focus_areas:
|
|
401
|
-
focus_text += f"- {area}\n"
|
|
402
|
-
focus_text += "\nWhile still maintaining general code quality standards."
|
|
403
|
-
|
|
404
|
-
prompt = f"""Improve the overall code quality of the following code:
|
|
405
|
-
|
|
406
|
-
Current code:
|
|
407
|
-
```python
|
|
408
|
-
{current_code}
|
|
409
|
-
```
|
|
410
|
-
|
|
411
|
-
Context (other related files):
|
|
412
|
-
{context_text}
|
|
413
|
-
{focus_text}
|
|
414
|
-
{context7_guidance}
|
|
415
|
-
|
|
416
|
-
Provide improved code that:
|
|
417
|
-
1. Follows Python best practices and PEP 8 style guide
|
|
418
|
-
2. Uses appropriate design patterns
|
|
419
|
-
3. Improves error handling and robustness
|
|
420
|
-
4. Enhances type hints and documentation
|
|
421
|
-
5. Reduces code complexity where possible
|
|
422
|
-
6. Improves naming conventions
|
|
423
|
-
7. Adds appropriate docstrings
|
|
424
|
-
|
|
425
|
-
Return only the improved code, wrapped in ```python code blocks."""
|
|
426
|
-
|
|
427
|
-
# Prepare instruction for Cursor Skills (always returned for compatibility)
|
|
428
|
-
instruction = GenericInstruction(
|
|
429
|
-
agent_name="improver",
|
|
430
|
-
command="improve-quality",
|
|
431
|
-
prompt=prompt,
|
|
432
|
-
parameters={"file_path": str(file_path), "focus": focus},
|
|
433
|
-
)
|
|
434
|
-
|
|
435
|
-
# Phase 7.1: Generate diff preview if requested or for auto-apply
|
|
436
|
-
diff_result = None
|
|
437
|
-
if preview or auto_apply:
|
|
438
|
-
# Note: In Cursor-first mode, actual code generation is done by Cursor AI.
|
|
439
|
-
# The diff is generated from placeholder improved code for preview purposes.
|
|
440
|
-
# When auto_apply is True, Cursor AI should use this as a signal to apply changes.
|
|
441
|
-
diff_result = self._generate_diff(
|
|
442
|
-
current_code,
|
|
443
|
-
current_code, # Placeholder - actual improvement done by Cursor AI
|
|
444
|
-
str(file_path)
|
|
445
|
-
)
|
|
446
|
-
|
|
447
|
-
# Phase 7.1: Handle auto-apply mode
|
|
448
|
-
if auto_apply:
|
|
449
|
-
# Create backup before any modifications
|
|
450
|
-
backup_path = self._create_backup(str(file_path_obj))
|
|
451
|
-
|
|
452
|
-
result = {
|
|
453
|
-
"message": f"Auto-apply mode enabled for {file_path}",
|
|
454
|
-
"mode": "auto_apply",
|
|
455
|
-
"instruction": instruction.to_dict(),
|
|
456
|
-
"skill_command": instruction.to_skill_command(),
|
|
457
|
-
"file": str(file_path),
|
|
458
|
-
"backup": str(backup_path) if backup_path else None,
|
|
459
|
-
"auto_apply": True,
|
|
460
|
-
"note": "⚠️ AUTO-APPLY MODE: Cursor AI should automatically apply improvements and verify:",
|
|
461
|
-
"execution_instructions": [
|
|
462
|
-
f"1. Read the file: {file_path}",
|
|
463
|
-
"2. Apply the improvements from the 'prompt' field",
|
|
464
|
-
"3. Write the improved code to the file",
|
|
465
|
-
f"4. Backup has been created at: {backup_path}",
|
|
466
|
-
"5. Run verification review after applying changes",
|
|
467
|
-
"6. Report the diff of changes made",
|
|
468
|
-
"",
|
|
469
|
-
"APPLY THE CHANGES - do not just return the instruction!",
|
|
470
|
-
],
|
|
471
|
-
}
|
|
472
|
-
return result
|
|
473
|
-
|
|
474
|
-
# Phase 7.1: Handle preview mode
|
|
475
|
-
if preview:
|
|
476
|
-
result = {
|
|
477
|
-
"message": f"Preview mode for {file_path}",
|
|
478
|
-
"mode": "preview",
|
|
479
|
-
"instruction": instruction.to_dict(),
|
|
480
|
-
"skill_command": instruction.to_skill_command(),
|
|
481
|
-
"file": str(file_path),
|
|
482
|
-
"preview": True,
|
|
483
|
-
"note": "⚠️ PREVIEW MODE: Show what would change without applying:",
|
|
484
|
-
"execution_instructions": [
|
|
485
|
-
f"1. Read the file: {file_path}",
|
|
486
|
-
"2. Generate improved code based on the 'prompt' field",
|
|
487
|
-
"3. Show a DIFF of proposed changes (do NOT apply)",
|
|
488
|
-
"4. Show statistics: lines added, lines removed",
|
|
489
|
-
"5. Suggest: 'Use --auto-apply to apply these changes'",
|
|
490
|
-
"",
|
|
491
|
-
"DO NOT APPLY CHANGES - only show the preview!",
|
|
492
|
-
],
|
|
493
|
-
}
|
|
494
|
-
return result
|
|
495
|
-
|
|
496
|
-
# Default mode: Return instruction object for manual execution
|
|
497
|
-
result = {
|
|
498
|
-
"message": f"Code quality improvement instruction prepared for {file_path}",
|
|
499
|
-
"mode": "instruction",
|
|
500
|
-
"instruction": instruction.to_dict(),
|
|
501
|
-
"skill_command": instruction.to_skill_command(),
|
|
502
|
-
"file": str(file_path),
|
|
503
|
-
"file_written": False, # Code improvement happens in Cursor Skills
|
|
504
|
-
"note": "⚠️ IMPORTANT: When you see this instruction object in Cursor, you MUST execute it by:",
|
|
505
|
-
"execution_instructions": [
|
|
506
|
-
f"1. Read the file: {file_path}",
|
|
507
|
-
"2. Use the 'prompt' field from the instruction object as your improvement directive",
|
|
508
|
-
"3. Actually improve the code by editing the file according to the prompt",
|
|
509
|
-
"4. Apply all quality improvements (best practices, type hints, documentation, etc.)",
|
|
510
|
-
"5. Explain what improvements you made and why",
|
|
511
|
-
"",
|
|
512
|
-
"DO NOT just return the instruction object - you must execute it by improving the code!",
|
|
513
|
-
"",
|
|
514
|
-
"TIP: Use --auto-apply to automatically apply improvements",
|
|
515
|
-
"TIP: Use --preview to see changes before applying",
|
|
516
|
-
],
|
|
517
|
-
}
|
|
518
|
-
|
|
519
|
-
return result
|
|
520
|
-
|
|
521
|
-
def _handle_help(self) -> dict[str, Any]:
|
|
522
|
-
"""
|
|
523
|
-
Return help information for Improver Agent.
|
|
524
|
-
|
|
525
|
-
Returns standardized help format with commands and descriptions.
|
|
526
|
-
|
|
527
|
-
Returns:
|
|
528
|
-
dict: Help information with standardized format:
|
|
529
|
-
- type (str): Always "help"
|
|
530
|
-
- content (str): Formatted markdown help text containing:
|
|
531
|
-
- Available commands with descriptions
|
|
532
|
-
|
|
533
|
-
Note:
|
|
534
|
-
This method is synchronous as it performs no I/O operations.
|
|
535
|
-
Standardized to match format used by other agents (type + content keys).
|
|
536
|
-
"""
|
|
537
|
-
help_message = {
|
|
538
|
-
"*refactor [file_path] [instruction]": "Refactor existing code to improve structure and maintainability",
|
|
539
|
-
"*optimize [file_path] [type]": "Optimize code for performance, memory, or both (type: performance|memory|both)",
|
|
540
|
-
"*improve-quality [file_path]": "Improve overall code quality (best practices, patterns, documentation)",
|
|
541
|
-
"*help": "Show this help message",
|
|
542
|
-
}
|
|
543
|
-
|
|
544
|
-
# Format as markdown for consistency with other agents
|
|
545
|
-
command_lines = [
|
|
546
|
-
f"- **{cmd}**: {desc}"
|
|
547
|
-
for cmd, desc in help_message.items()
|
|
548
|
-
]
|
|
549
|
-
|
|
550
|
-
content = f"""# {self.agent_name} - Help
|
|
551
|
-
|
|
552
|
-
## Available Commands
|
|
553
|
-
|
|
554
|
-
{chr(10).join(command_lines)}
|
|
555
|
-
"""
|
|
556
|
-
|
|
557
|
-
return {"type": "help", "content": content}
|
|
558
|
-
|
|
559
|
-
def _extract_code_from_response(self, response: str) -> str:
|
|
560
|
-
"""Extract code from LLM response (handles code blocks)."""
|
|
561
|
-
# Look for ```python or ``` blocks
|
|
562
|
-
if "```python" in response:
|
|
563
|
-
start = response.find("```python") + 9
|
|
564
|
-
end = response.find("```", start)
|
|
565
|
-
if end > start:
|
|
566
|
-
return response[start:end].strip()
|
|
567
|
-
elif "```" in response:
|
|
568
|
-
start = response.find("```") + 3
|
|
569
|
-
end = response.find("```", start)
|
|
570
|
-
if end > start:
|
|
571
|
-
return response[start:end].strip()
|
|
572
|
-
|
|
573
|
-
# If no code blocks, return the response as-is
|
|
574
|
-
return response.strip()
|
|
575
|
-
|
|
576
|
-
# ========================================================================
|
|
577
|
-
# Phase 7.1: Auto-Apply Enhancement Methods
|
|
578
|
-
# ========================================================================
|
|
579
|
-
|
|
580
|
-
def _create_backup(self, file_path: str) -> Path | None:
|
|
581
|
-
"""
|
|
582
|
-
Create backup of file before modifications.
|
|
583
|
-
|
|
584
|
-
Phase 7.1: Auto-Apply Enhancement
|
|
585
|
-
|
|
586
|
-
Args:
|
|
587
|
-
file_path: Path to file to backup
|
|
588
|
-
|
|
589
|
-
Returns:
|
|
590
|
-
Path to backup file, or None if backup failed
|
|
591
|
-
|
|
592
|
-
Backup Location:
|
|
593
|
-
.tapps-agents/backups/<filename>.<timestamp>.backup
|
|
594
|
-
"""
|
|
595
|
-
try:
|
|
596
|
-
file_path_obj = Path(file_path)
|
|
597
|
-
if not file_path_obj.is_absolute():
|
|
598
|
-
file_path_obj = self.project_root / file_path_obj
|
|
599
|
-
|
|
600
|
-
if not file_path_obj.exists():
|
|
601
|
-
logger.warning(f"Cannot backup non-existent file: {file_path}")
|
|
602
|
-
return None
|
|
603
|
-
|
|
604
|
-
# Create backup directory
|
|
605
|
-
backup_dir = self.project_root / ".tapps-agents" / "backups"
|
|
606
|
-
backup_dir.mkdir(parents=True, exist_ok=True)
|
|
607
|
-
|
|
608
|
-
# Generate backup filename with timestamp
|
|
609
|
-
timestamp = datetime.now().strftime("%Y%m%d-%H%M%S")
|
|
610
|
-
backup_filename = f"{file_path_obj.name}.{timestamp}.backup"
|
|
611
|
-
backup_path = backup_dir / backup_filename
|
|
612
|
-
|
|
613
|
-
# Copy file to backup location
|
|
614
|
-
shutil.copy2(file_path_obj, backup_path)
|
|
615
|
-
logger.info(f"Created backup: {backup_path}")
|
|
616
|
-
|
|
617
|
-
return backup_path
|
|
618
|
-
|
|
619
|
-
except Exception as e:
|
|
620
|
-
logger.error(f"Failed to create backup for {file_path}: {e}")
|
|
621
|
-
return None
|
|
622
|
-
|
|
623
|
-
def _apply_improvements(
|
|
624
|
-
self, file_path: str, improved_code: str
|
|
625
|
-
) -> dict[str, Any]:
|
|
626
|
-
"""
|
|
627
|
-
Apply improved code to file.
|
|
628
|
-
|
|
629
|
-
Phase 7.1: Auto-Apply Enhancement
|
|
630
|
-
|
|
631
|
-
Args:
|
|
632
|
-
file_path: Path to file to modify
|
|
633
|
-
improved_code: Improved code content
|
|
634
|
-
|
|
635
|
-
Returns:
|
|
636
|
-
Dictionary with result status
|
|
637
|
-
"""
|
|
638
|
-
try:
|
|
639
|
-
file_path_obj = Path(file_path)
|
|
640
|
-
if not file_path_obj.is_absolute():
|
|
641
|
-
file_path_obj = self.project_root / file_path_obj
|
|
642
|
-
|
|
643
|
-
if not improved_code or not improved_code.strip():
|
|
644
|
-
return {"success": False, "error": "Improved code is empty"}
|
|
645
|
-
|
|
646
|
-
# Write improved code
|
|
647
|
-
file_path_obj.write_text(improved_code, encoding="utf-8")
|
|
648
|
-
logger.info(f"Applied improvements to: {file_path}")
|
|
649
|
-
|
|
650
|
-
return {
|
|
651
|
-
"success": True,
|
|
652
|
-
"file": str(file_path_obj),
|
|
653
|
-
"bytes_written": len(improved_code.encode("utf-8")),
|
|
654
|
-
}
|
|
655
|
-
|
|
656
|
-
except Exception as e:
|
|
657
|
-
logger.error(f"Failed to apply improvements to {file_path}: {e}")
|
|
658
|
-
return {"success": False, "error": str(e)}
|
|
659
|
-
|
|
660
|
-
def _generate_diff(
|
|
661
|
-
self, original: str, improved: str, file_path: str = "file"
|
|
662
|
-
) -> dict[str, Any]:
|
|
663
|
-
"""
|
|
664
|
-
Generate unified diff between original and improved code.
|
|
665
|
-
|
|
666
|
-
Phase 7.1: Auto-Apply Enhancement
|
|
667
|
-
|
|
668
|
-
Args:
|
|
669
|
-
original: Original code content
|
|
670
|
-
improved: Improved code content
|
|
671
|
-
file_path: File path for diff header
|
|
672
|
-
|
|
673
|
-
Returns:
|
|
674
|
-
Dictionary with diff result
|
|
675
|
-
"""
|
|
676
|
-
try:
|
|
677
|
-
original_lines = original.splitlines(keepends=True)
|
|
678
|
-
improved_lines = improved.splitlines(keepends=True)
|
|
679
|
-
|
|
680
|
-
# Generate unified diff
|
|
681
|
-
diff_lines = list(difflib.unified_diff(
|
|
682
|
-
original_lines,
|
|
683
|
-
improved_lines,
|
|
684
|
-
fromfile=f"original/{file_path}",
|
|
685
|
-
tofile=f"improved/{file_path}",
|
|
686
|
-
lineterm="",
|
|
687
|
-
))
|
|
688
|
-
|
|
689
|
-
unified_diff = "".join(diff_lines)
|
|
690
|
-
|
|
691
|
-
# Calculate statistics
|
|
692
|
-
lines_added = sum(1 for line in diff_lines if line.startswith("+") and not line.startswith("+++"))
|
|
693
|
-
lines_removed = sum(1 for line in diff_lines if line.startswith("-") and not line.startswith("---"))
|
|
694
|
-
has_changes = bool(diff_lines)
|
|
695
|
-
|
|
696
|
-
return DiffResult(
|
|
697
|
-
unified_diff=unified_diff,
|
|
698
|
-
lines_added=lines_added,
|
|
699
|
-
lines_removed=lines_removed,
|
|
700
|
-
has_changes=has_changes,
|
|
701
|
-
).to_dict()
|
|
702
|
-
|
|
703
|
-
except Exception as e:
|
|
704
|
-
logger.error(f"Failed to generate diff: {e}")
|
|
705
|
-
return DiffResult(
|
|
706
|
-
unified_diff="",
|
|
707
|
-
lines_added=0,
|
|
708
|
-
lines_removed=0,
|
|
709
|
-
has_changes=False,
|
|
710
|
-
).to_dict()
|
|
711
|
-
|
|
712
|
-
async def _verify_changes(self, file_path: str) -> dict[str, Any]:
|
|
713
|
-
"""
|
|
714
|
-
Run verification review after applying changes.
|
|
715
|
-
|
|
716
|
-
Phase 7.1: Auto-Apply Enhancement
|
|
717
|
-
|
|
718
|
-
Args:
|
|
719
|
-
file_path: Path to modified file
|
|
720
|
-
|
|
721
|
-
Returns:
|
|
722
|
-
Dictionary with verification results
|
|
723
|
-
"""
|
|
724
|
-
try:
|
|
725
|
-
# Import reviewer agent for verification
|
|
726
|
-
from ..reviewer.agent import ReviewerAgent
|
|
727
|
-
|
|
728
|
-
reviewer = ReviewerAgent(config=self.config)
|
|
729
|
-
await reviewer.activate(self.project_root, offline_mode=True)
|
|
730
|
-
|
|
731
|
-
file_path_obj = Path(file_path)
|
|
732
|
-
if not file_path_obj.is_absolute():
|
|
733
|
-
file_path_obj = self.project_root / file_path_obj
|
|
734
|
-
|
|
735
|
-
# Run review
|
|
736
|
-
review_result = await reviewer.review_file(file_path_obj)
|
|
737
|
-
|
|
738
|
-
# Extract score
|
|
739
|
-
scores = review_result.get("scoring", {})
|
|
740
|
-
overall_score = scores.get("overall_score", 0.0)
|
|
741
|
-
|
|
742
|
-
return {
|
|
743
|
-
"verified": True,
|
|
744
|
-
"new_score": overall_score,
|
|
745
|
-
"scores": scores,
|
|
746
|
-
"review": review_result,
|
|
747
|
-
}
|
|
748
|
-
|
|
749
|
-
except Exception as e:
|
|
750
|
-
logger.error(f"Failed to verify changes for {file_path}: {e}")
|
|
751
|
-
return {
|
|
752
|
-
"verified": False,
|
|
753
|
-
"error": str(e),
|
|
1
|
+
"""
|
|
2
|
+
Improver Agent - Refactors and enhances existing code
|
|
3
|
+
|
|
4
|
+
Phase 7.1: Auto-Apply Enhancement - adds --auto-apply and --preview flags
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import difflib
|
|
8
|
+
import inspect
|
|
9
|
+
import logging
|
|
10
|
+
import shutil
|
|
11
|
+
from dataclasses import dataclass, asdict
|
|
12
|
+
from datetime import datetime
|
|
13
|
+
from pathlib import Path
|
|
14
|
+
from typing import Any
|
|
15
|
+
|
|
16
|
+
from ...context7.agent_integration import Context7AgentHelper, get_context7_helper
|
|
17
|
+
from ...core.agent_base import BaseAgent
|
|
18
|
+
from ...core.config import ProjectConfig, load_config
|
|
19
|
+
from ...core.instructions import GenericInstruction
|
|
20
|
+
from ...core.tiered_context import ContextTier
|
|
21
|
+
|
|
22
|
+
logger = logging.getLogger(__name__)
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
@dataclass
|
|
26
|
+
class DiffResult:
|
|
27
|
+
"""Result of code diff generation."""
|
|
28
|
+
|
|
29
|
+
unified_diff: str
|
|
30
|
+
lines_added: int
|
|
31
|
+
lines_removed: int
|
|
32
|
+
has_changes: bool
|
|
33
|
+
|
|
34
|
+
def to_dict(self) -> dict[str, Any]:
|
|
35
|
+
"""Convert to dictionary."""
|
|
36
|
+
return asdict(self)
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
class ImproverAgent(BaseAgent):
|
|
40
|
+
"""
|
|
41
|
+
Improver Agent - Code refactoring, performance optimization, and quality improvements.
|
|
42
|
+
|
|
43
|
+
Permissions: Read, Write, Edit, Grep, Glob (no Bash)
|
|
44
|
+
|
|
45
|
+
⚠️ CRITICAL ACCURACY REQUIREMENT:
|
|
46
|
+
- NEVER make up, invent, or fabricate information - Only report verified facts
|
|
47
|
+
- ALWAYS verify claims by checking actual results, not just test pass/fail
|
|
48
|
+
- Verify API calls succeed - inspect response data, status codes, error messages
|
|
49
|
+
- Distinguish between code paths executing and actual functionality working
|
|
50
|
+
- Admit uncertainty explicitly when you cannot verify
|
|
51
|
+
"""
|
|
52
|
+
|
|
53
|
+
def __init__(self, config: ProjectConfig | None = None):
|
|
54
|
+
super().__init__(
|
|
55
|
+
agent_id="improver", agent_name="Improver Agent", config=config
|
|
56
|
+
)
|
|
57
|
+
if config is None:
|
|
58
|
+
config = load_config()
|
|
59
|
+
self.config = config
|
|
60
|
+
self.project_root: Path = Path.cwd()
|
|
61
|
+
|
|
62
|
+
# Initialize Context7 helper (Enhancement: Universal Context7 integration)
|
|
63
|
+
self.context7: Context7AgentHelper | None = None
|
|
64
|
+
if config:
|
|
65
|
+
self.context7 = get_context7_helper(self, config)
|
|
66
|
+
|
|
67
|
+
async def activate(self, project_root: Path | None = None, offline_mode: bool = False):
|
|
68
|
+
await super().activate(project_root, offline_mode=offline_mode)
|
|
69
|
+
if project_root is not None:
|
|
70
|
+
self.project_root = project_root
|
|
71
|
+
self.greet()
|
|
72
|
+
await self.run("help")
|
|
73
|
+
|
|
74
|
+
def greet(self):
|
|
75
|
+
print(
|
|
76
|
+
f"Hello! I am the {self.agent_name}. I help refactor and improve code quality."
|
|
77
|
+
)
|
|
78
|
+
|
|
79
|
+
async def run(self, command: str, **kwargs: Any) -> dict[str, Any]:
|
|
80
|
+
command = command.lstrip("*") # Remove star prefix if present
|
|
81
|
+
handler_name = f"_handle_{command.replace('-', '_')}"
|
|
82
|
+
if hasattr(self, handler_name):
|
|
83
|
+
handler = getattr(self, handler_name)
|
|
84
|
+
# Handle both sync and async handlers
|
|
85
|
+
if inspect.iscoroutinefunction(handler):
|
|
86
|
+
return await handler(**kwargs)
|
|
87
|
+
else:
|
|
88
|
+
return handler(**kwargs)
|
|
89
|
+
else:
|
|
90
|
+
return {
|
|
91
|
+
"error": f"Unknown command: {command}. Use '*help' to see available commands."
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
async def _handle_refactor(
|
|
95
|
+
self,
|
|
96
|
+
file_path: str | None = None,
|
|
97
|
+
instruction: str | None = None,
|
|
98
|
+
**kwargs: Any,
|
|
99
|
+
) -> dict[str, Any]:
|
|
100
|
+
"""Refactor existing code to improve structure and maintainability."""
|
|
101
|
+
if not file_path:
|
|
102
|
+
return {
|
|
103
|
+
"error": "File path required. Usage: *refactor <file_path> [instruction]"
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
file_path_obj = Path(file_path)
|
|
107
|
+
if not file_path_obj.is_absolute():
|
|
108
|
+
file_path_obj = self.project_root / file_path_obj
|
|
109
|
+
|
|
110
|
+
try:
|
|
111
|
+
self._validate_path(file_path_obj)
|
|
112
|
+
except (FileNotFoundError, ValueError) as e:
|
|
113
|
+
return {"error": str(e)}
|
|
114
|
+
|
|
115
|
+
if not file_path_obj.exists():
|
|
116
|
+
return {"error": f"File not found: {file_path}"}
|
|
117
|
+
|
|
118
|
+
# Refactoring in progress...
|
|
119
|
+
|
|
120
|
+
# Read current code
|
|
121
|
+
current_code = file_path_obj.read_text(encoding="utf-8")
|
|
122
|
+
|
|
123
|
+
# Get context for refactoring
|
|
124
|
+
context_text = self.get_context_text(file_path_obj, tier=ContextTier.TIER2)
|
|
125
|
+
|
|
126
|
+
# Enhancement: Auto-detect libraries and fetch Context7 documentation
|
|
127
|
+
context7_docs = {}
|
|
128
|
+
context7_guidance = ""
|
|
129
|
+
try:
|
|
130
|
+
from ...core.language_detector import LanguageDetector
|
|
131
|
+
detector = LanguageDetector()
|
|
132
|
+
language = detector.detect_language(file_path_obj)
|
|
133
|
+
|
|
134
|
+
# Use universal auto-detection hook for Context7 docs
|
|
135
|
+
context7_docs = await self._auto_fetch_context7_docs(
|
|
136
|
+
code=current_code,
|
|
137
|
+
prompt=instruction or "Refactor code to improve structure and maintainability",
|
|
138
|
+
language=language,
|
|
139
|
+
)
|
|
140
|
+
|
|
141
|
+
# Add Context7 guidance to prompt if available
|
|
142
|
+
if context7_docs:
|
|
143
|
+
context7_guidance = "\n\nRelevant Library Best Practices from Context7:\n"
|
|
144
|
+
for lib_name, lib_doc in context7_docs.items():
|
|
145
|
+
if lib_doc and lib_doc.get("content"):
|
|
146
|
+
content_preview = lib_doc.get("content", "")[:500]
|
|
147
|
+
context7_guidance += f"\n{lib_name}:\n{content_preview}...\n"
|
|
148
|
+
logger.debug(f"Auto-fetched Context7 docs for {len(context7_docs)} libraries using universal hook")
|
|
149
|
+
except Exception as e:
|
|
150
|
+
logger.debug(f"Context7 auto-detection failed during refactor: {e}, continuing without Context7 docs")
|
|
151
|
+
|
|
152
|
+
# Build prompt for refactoring
|
|
153
|
+
instruction_text = (
|
|
154
|
+
instruction
|
|
155
|
+
or "Improve code structure, readability, and maintainability while preserving functionality."
|
|
156
|
+
)
|
|
157
|
+
|
|
158
|
+
prompt = f"""Refactor the following code to improve its quality:
|
|
159
|
+
|
|
160
|
+
{instruction_text}
|
|
161
|
+
|
|
162
|
+
Current code:
|
|
163
|
+
```python
|
|
164
|
+
{current_code}
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
Context (other related files):
|
|
168
|
+
{context_text}
|
|
169
|
+
{context7_guidance}
|
|
170
|
+
|
|
171
|
+
Provide the refactored code that:
|
|
172
|
+
1. Improves code structure and organization
|
|
173
|
+
2. Enhances readability and maintainability
|
|
174
|
+
3. Preserves all existing functionality
|
|
175
|
+
4. Follows best practices and design patterns
|
|
176
|
+
5. Maintains backward compatibility
|
|
177
|
+
|
|
178
|
+
Return only the refactored code, wrapped in ```python code blocks."""
|
|
179
|
+
|
|
180
|
+
# Prepare instruction for Cursor Skills
|
|
181
|
+
instruction = GenericInstruction(
|
|
182
|
+
agent_name="improver",
|
|
183
|
+
command="refactor",
|
|
184
|
+
prompt=prompt,
|
|
185
|
+
parameters={"file_path": str(file_path)},
|
|
186
|
+
)
|
|
187
|
+
|
|
188
|
+
return {
|
|
189
|
+
"message": f"Refactoring instruction prepared for {file_path}",
|
|
190
|
+
"instruction": instruction.to_dict(),
|
|
191
|
+
"skill_command": instruction.to_skill_command(),
|
|
192
|
+
"file": str(file_path),
|
|
193
|
+
"note": "⚠️ IMPORTANT: When you see this instruction object in Cursor, you MUST execute it by:",
|
|
194
|
+
"execution_instructions": [
|
|
195
|
+
f"1. Read the file: {file_path}",
|
|
196
|
+
"2. Use the 'prompt' field from the instruction object as your refactoring directive",
|
|
197
|
+
"3. Actually refactor the code by editing the file according to the prompt",
|
|
198
|
+
"4. Preserve all existing functionality while improving structure and maintainability",
|
|
199
|
+
"5. Explain what refactoring changes you made and why",
|
|
200
|
+
"",
|
|
201
|
+
"DO NOT just return the instruction object - you must execute it by refactoring the code!",
|
|
202
|
+
],
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
async def _handle_optimize(
|
|
206
|
+
self,
|
|
207
|
+
file_path: str | None = None,
|
|
208
|
+
optimization_type: str = "performance",
|
|
209
|
+
**kwargs: Any,
|
|
210
|
+
) -> dict[str, Any]:
|
|
211
|
+
"""Optimize code for performance, memory, or other metrics."""
|
|
212
|
+
if not file_path:
|
|
213
|
+
return {
|
|
214
|
+
"error": "File path required. Usage: *optimize <file_path> [optimization_type]"
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
file_path_obj = Path(file_path)
|
|
218
|
+
if not file_path_obj.is_absolute():
|
|
219
|
+
file_path_obj = self.project_root / file_path_obj
|
|
220
|
+
|
|
221
|
+
try:
|
|
222
|
+
self._validate_path(file_path_obj)
|
|
223
|
+
except (FileNotFoundError, ValueError) as e:
|
|
224
|
+
return {"error": str(e)}
|
|
225
|
+
|
|
226
|
+
if not file_path_obj.exists():
|
|
227
|
+
return {"error": f"File not found: {file_path}"}
|
|
228
|
+
|
|
229
|
+
# Optimizing in progress...
|
|
230
|
+
|
|
231
|
+
# Read current code
|
|
232
|
+
current_code = file_path_obj.read_text(encoding="utf-8")
|
|
233
|
+
|
|
234
|
+
# Get context
|
|
235
|
+
context_text = self.get_context_text(file_path_obj, tier=ContextTier.TIER2)
|
|
236
|
+
|
|
237
|
+
# Enhancement: Auto-detect libraries and fetch Context7 documentation
|
|
238
|
+
context7_docs = {}
|
|
239
|
+
context7_guidance = ""
|
|
240
|
+
try:
|
|
241
|
+
from ...core.language_detector import LanguageDetector
|
|
242
|
+
detector = LanguageDetector()
|
|
243
|
+
language = detector.detect_language(file_path_obj)
|
|
244
|
+
|
|
245
|
+
# Use universal auto-detection hook for Context7 docs
|
|
246
|
+
context7_docs = await self._auto_fetch_context7_docs(
|
|
247
|
+
code=current_code,
|
|
248
|
+
prompt=f"Optimize code for {optimization_type}",
|
|
249
|
+
language=language,
|
|
250
|
+
)
|
|
251
|
+
|
|
252
|
+
# Add Context7 guidance to prompt if available
|
|
253
|
+
if context7_docs:
|
|
254
|
+
context7_guidance = "\n\nRelevant Library Optimization Best Practices from Context7:\n"
|
|
255
|
+
for lib_name, lib_doc in context7_docs.items():
|
|
256
|
+
if lib_doc and lib_doc.get("content"):
|
|
257
|
+
content_preview = lib_doc.get("content", "")[:500]
|
|
258
|
+
context7_guidance += f"\n{lib_name}:\n{content_preview}...\n"
|
|
259
|
+
logger.debug(f"Auto-fetched Context7 docs for {len(context7_docs)} libraries using universal hook")
|
|
260
|
+
except Exception as e:
|
|
261
|
+
logger.debug(f"Context7 auto-detection failed during optimize: {e}, continuing without Context7 docs")
|
|
262
|
+
|
|
263
|
+
optimization_prompts = {
|
|
264
|
+
"performance": "Optimize for execution speed and efficiency",
|
|
265
|
+
"memory": "Optimize for memory usage and reduce memory footprint",
|
|
266
|
+
"both": "Optimize for both performance and memory usage",
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
optimization_instruction = optimization_prompts.get(
|
|
270
|
+
optimization_type, optimization_prompts["performance"]
|
|
271
|
+
)
|
|
272
|
+
|
|
273
|
+
prompt = f"""Optimize the following code for {optimization_type}:
|
|
274
|
+
|
|
275
|
+
{optimization_instruction}
|
|
276
|
+
|
|
277
|
+
Current code:
|
|
278
|
+
```python
|
|
279
|
+
{current_code}
|
|
280
|
+
```
|
|
281
|
+
|
|
282
|
+
Context (other related files):
|
|
283
|
+
{context_text}
|
|
284
|
+
{context7_guidance}
|
|
285
|
+
|
|
286
|
+
Provide the optimized code that:
|
|
287
|
+
1. Improves {optimization_type} characteristics
|
|
288
|
+
2. Maintains functionality and correctness
|
|
289
|
+
3. Preserves code readability
|
|
290
|
+
4. Uses efficient algorithms and data structures
|
|
291
|
+
5. Eliminates unnecessary operations
|
|
292
|
+
|
|
293
|
+
Return only the optimized code, wrapped in ```python code blocks."""
|
|
294
|
+
|
|
295
|
+
# Prepare instruction for Cursor Skills
|
|
296
|
+
instruction = GenericInstruction(
|
|
297
|
+
agent_name="improver",
|
|
298
|
+
command="optimize",
|
|
299
|
+
prompt=prompt,
|
|
300
|
+
parameters={
|
|
301
|
+
"file_path": str(file_path),
|
|
302
|
+
"optimization_type": optimization_type,
|
|
303
|
+
},
|
|
304
|
+
)
|
|
305
|
+
|
|
306
|
+
return {
|
|
307
|
+
"message": f"Optimization instruction prepared for {file_path}",
|
|
308
|
+
"instruction": instruction.to_dict(),
|
|
309
|
+
"skill_command": instruction.to_skill_command(),
|
|
310
|
+
"file": str(file_path),
|
|
311
|
+
"optimization_type": optimization_type,
|
|
312
|
+
"note": "⚠️ IMPORTANT: When you see this instruction object in Cursor, you MUST execute it by:",
|
|
313
|
+
"execution_instructions": [
|
|
314
|
+
f"1. Read the file: {file_path}",
|
|
315
|
+
"2. Use the 'prompt' field from the instruction object as your optimization directive",
|
|
316
|
+
f"3. Actually optimize the code for {optimization_type} by editing the file according to the prompt",
|
|
317
|
+
"4. Maintain functionality and correctness while improving performance/memory characteristics",
|
|
318
|
+
"5. Explain what optimizations you made and why",
|
|
319
|
+
"",
|
|
320
|
+
"DO NOT just return the instruction object - you must execute it by optimizing the code!",
|
|
321
|
+
],
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
async def _handle_improve_quality(
|
|
325
|
+
self,
|
|
326
|
+
file_path: str | None = None,
|
|
327
|
+
focus: str | None = None,
|
|
328
|
+
auto_apply: bool = False,
|
|
329
|
+
preview: bool = False,
|
|
330
|
+
**kwargs: Any,
|
|
331
|
+
) -> dict[str, Any]:
|
|
332
|
+
"""
|
|
333
|
+
Improve overall code quality (structure, patterns, best practices).
|
|
334
|
+
|
|
335
|
+
Phase 7.1 Enhancement: Added --auto-apply and --preview flags.
|
|
336
|
+
|
|
337
|
+
Args:
|
|
338
|
+
file_path: Path to file to improve
|
|
339
|
+
focus: Specific areas to focus on (comma-separated)
|
|
340
|
+
auto_apply: If True, automatically apply improvements
|
|
341
|
+
preview: If True, show diff preview without applying
|
|
342
|
+
"""
|
|
343
|
+
if not file_path:
|
|
344
|
+
return {"error": "File path required. Usage: *improve-quality <file_path> [--auto-apply] [--preview]"}
|
|
345
|
+
|
|
346
|
+
file_path_obj = Path(file_path)
|
|
347
|
+
if not file_path_obj.is_absolute():
|
|
348
|
+
file_path_obj = self.project_root / file_path_obj
|
|
349
|
+
|
|
350
|
+
try:
|
|
351
|
+
self._validate_path(file_path_obj)
|
|
352
|
+
except (FileNotFoundError, ValueError) as e:
|
|
353
|
+
return {"error": str(e)}
|
|
354
|
+
|
|
355
|
+
if not file_path_obj.exists():
|
|
356
|
+
return {"error": f"File not found: {file_path}"}
|
|
357
|
+
|
|
358
|
+
# Read current code
|
|
359
|
+
current_code = file_path_obj.read_text(encoding="utf-8")
|
|
360
|
+
|
|
361
|
+
# Get context
|
|
362
|
+
context_text = self.get_context_text(file_path_obj, tier=ContextTier.TIER2)
|
|
363
|
+
|
|
364
|
+
# Enhancement: Auto-detect libraries and fetch Context7 documentation
|
|
365
|
+
context7_docs = {}
|
|
366
|
+
context7_guidance = ""
|
|
367
|
+
try:
|
|
368
|
+
from ...core.language_detector import LanguageDetector
|
|
369
|
+
detector = LanguageDetector()
|
|
370
|
+
language = detector.detect_language(file_path_obj)
|
|
371
|
+
|
|
372
|
+
# Use universal auto-detection hook for Context7 docs
|
|
373
|
+
focus_prompt = f"Improve code quality" + (f" focusing on {focus}" if focus else "")
|
|
374
|
+
context7_docs = await self._auto_fetch_context7_docs(
|
|
375
|
+
code=current_code,
|
|
376
|
+
prompt=focus_prompt,
|
|
377
|
+
language=language,
|
|
378
|
+
)
|
|
379
|
+
|
|
380
|
+
# Add Context7 guidance to prompt if available
|
|
381
|
+
if context7_docs:
|
|
382
|
+
context7_guidance = "\n\nRelevant Library Best Practices from Context7:\n"
|
|
383
|
+
for lib_name, lib_doc in context7_docs.items():
|
|
384
|
+
if lib_doc and lib_doc.get("content"):
|
|
385
|
+
content_preview = lib_doc.get("content", "")[:500]
|
|
386
|
+
context7_guidance += f"\n{lib_name}:\n{content_preview}...\n"
|
|
387
|
+
logger.debug(f"Auto-fetched Context7 docs for {len(context7_docs)} libraries using universal hook")
|
|
388
|
+
except Exception as e:
|
|
389
|
+
logger.debug(f"Context7 auto-detection failed during improve-quality: {e}, continuing without Context7 docs")
|
|
390
|
+
|
|
391
|
+
# Parse focus areas
|
|
392
|
+
focus_areas = []
|
|
393
|
+
if focus:
|
|
394
|
+
focus_areas = [area.strip() for area in focus.split(",") if area.strip()]
|
|
395
|
+
|
|
396
|
+
# Build focus-specific prompt section
|
|
397
|
+
focus_text = ""
|
|
398
|
+
if focus_areas:
|
|
399
|
+
focus_text = "\n\nFocus specifically on these quality aspects:\n"
|
|
400
|
+
for area in focus_areas:
|
|
401
|
+
focus_text += f"- {area}\n"
|
|
402
|
+
focus_text += "\nWhile still maintaining general code quality standards."
|
|
403
|
+
|
|
404
|
+
prompt = f"""Improve the overall code quality of the following code:
|
|
405
|
+
|
|
406
|
+
Current code:
|
|
407
|
+
```python
|
|
408
|
+
{current_code}
|
|
409
|
+
```
|
|
410
|
+
|
|
411
|
+
Context (other related files):
|
|
412
|
+
{context_text}
|
|
413
|
+
{focus_text}
|
|
414
|
+
{context7_guidance}
|
|
415
|
+
|
|
416
|
+
Provide improved code that:
|
|
417
|
+
1. Follows Python best practices and PEP 8 style guide
|
|
418
|
+
2. Uses appropriate design patterns
|
|
419
|
+
3. Improves error handling and robustness
|
|
420
|
+
4. Enhances type hints and documentation
|
|
421
|
+
5. Reduces code complexity where possible
|
|
422
|
+
6. Improves naming conventions
|
|
423
|
+
7. Adds appropriate docstrings
|
|
424
|
+
|
|
425
|
+
Return only the improved code, wrapped in ```python code blocks."""
|
|
426
|
+
|
|
427
|
+
# Prepare instruction for Cursor Skills (always returned for compatibility)
|
|
428
|
+
instruction = GenericInstruction(
|
|
429
|
+
agent_name="improver",
|
|
430
|
+
command="improve-quality",
|
|
431
|
+
prompt=prompt,
|
|
432
|
+
parameters={"file_path": str(file_path), "focus": focus},
|
|
433
|
+
)
|
|
434
|
+
|
|
435
|
+
# Phase 7.1: Generate diff preview if requested or for auto-apply
|
|
436
|
+
diff_result = None
|
|
437
|
+
if preview or auto_apply:
|
|
438
|
+
# Note: In Cursor-first mode, actual code generation is done by Cursor AI.
|
|
439
|
+
# The diff is generated from placeholder improved code for preview purposes.
|
|
440
|
+
# When auto_apply is True, Cursor AI should use this as a signal to apply changes.
|
|
441
|
+
diff_result = self._generate_diff(
|
|
442
|
+
current_code,
|
|
443
|
+
current_code, # Placeholder - actual improvement done by Cursor AI
|
|
444
|
+
str(file_path)
|
|
445
|
+
)
|
|
446
|
+
|
|
447
|
+
# Phase 7.1: Handle auto-apply mode
|
|
448
|
+
if auto_apply:
|
|
449
|
+
# Create backup before any modifications
|
|
450
|
+
backup_path = self._create_backup(str(file_path_obj))
|
|
451
|
+
|
|
452
|
+
result = {
|
|
453
|
+
"message": f"Auto-apply mode enabled for {file_path}",
|
|
454
|
+
"mode": "auto_apply",
|
|
455
|
+
"instruction": instruction.to_dict(),
|
|
456
|
+
"skill_command": instruction.to_skill_command(),
|
|
457
|
+
"file": str(file_path),
|
|
458
|
+
"backup": str(backup_path) if backup_path else None,
|
|
459
|
+
"auto_apply": True,
|
|
460
|
+
"note": "⚠️ AUTO-APPLY MODE: Cursor AI should automatically apply improvements and verify:",
|
|
461
|
+
"execution_instructions": [
|
|
462
|
+
f"1. Read the file: {file_path}",
|
|
463
|
+
"2. Apply the improvements from the 'prompt' field",
|
|
464
|
+
"3. Write the improved code to the file",
|
|
465
|
+
f"4. Backup has been created at: {backup_path}",
|
|
466
|
+
"5. Run verification review after applying changes",
|
|
467
|
+
"6. Report the diff of changes made",
|
|
468
|
+
"",
|
|
469
|
+
"APPLY THE CHANGES - do not just return the instruction!",
|
|
470
|
+
],
|
|
471
|
+
}
|
|
472
|
+
return result
|
|
473
|
+
|
|
474
|
+
# Phase 7.1: Handle preview mode
|
|
475
|
+
if preview:
|
|
476
|
+
result = {
|
|
477
|
+
"message": f"Preview mode for {file_path}",
|
|
478
|
+
"mode": "preview",
|
|
479
|
+
"instruction": instruction.to_dict(),
|
|
480
|
+
"skill_command": instruction.to_skill_command(),
|
|
481
|
+
"file": str(file_path),
|
|
482
|
+
"preview": True,
|
|
483
|
+
"note": "⚠️ PREVIEW MODE: Show what would change without applying:",
|
|
484
|
+
"execution_instructions": [
|
|
485
|
+
f"1. Read the file: {file_path}",
|
|
486
|
+
"2. Generate improved code based on the 'prompt' field",
|
|
487
|
+
"3. Show a DIFF of proposed changes (do NOT apply)",
|
|
488
|
+
"4. Show statistics: lines added, lines removed",
|
|
489
|
+
"5. Suggest: 'Use --auto-apply to apply these changes'",
|
|
490
|
+
"",
|
|
491
|
+
"DO NOT APPLY CHANGES - only show the preview!",
|
|
492
|
+
],
|
|
493
|
+
}
|
|
494
|
+
return result
|
|
495
|
+
|
|
496
|
+
# Default mode: Return instruction object for manual execution
|
|
497
|
+
result = {
|
|
498
|
+
"message": f"Code quality improvement instruction prepared for {file_path}",
|
|
499
|
+
"mode": "instruction",
|
|
500
|
+
"instruction": instruction.to_dict(),
|
|
501
|
+
"skill_command": instruction.to_skill_command(),
|
|
502
|
+
"file": str(file_path),
|
|
503
|
+
"file_written": False, # Code improvement happens in Cursor Skills
|
|
504
|
+
"note": "⚠️ IMPORTANT: When you see this instruction object in Cursor, you MUST execute it by:",
|
|
505
|
+
"execution_instructions": [
|
|
506
|
+
f"1. Read the file: {file_path}",
|
|
507
|
+
"2. Use the 'prompt' field from the instruction object as your improvement directive",
|
|
508
|
+
"3. Actually improve the code by editing the file according to the prompt",
|
|
509
|
+
"4. Apply all quality improvements (best practices, type hints, documentation, etc.)",
|
|
510
|
+
"5. Explain what improvements you made and why",
|
|
511
|
+
"",
|
|
512
|
+
"DO NOT just return the instruction object - you must execute it by improving the code!",
|
|
513
|
+
"",
|
|
514
|
+
"TIP: Use --auto-apply to automatically apply improvements",
|
|
515
|
+
"TIP: Use --preview to see changes before applying",
|
|
516
|
+
],
|
|
517
|
+
}
|
|
518
|
+
|
|
519
|
+
return result
|
|
520
|
+
|
|
521
|
+
def _handle_help(self) -> dict[str, Any]:
|
|
522
|
+
"""
|
|
523
|
+
Return help information for Improver Agent.
|
|
524
|
+
|
|
525
|
+
Returns standardized help format with commands and descriptions.
|
|
526
|
+
|
|
527
|
+
Returns:
|
|
528
|
+
dict: Help information with standardized format:
|
|
529
|
+
- type (str): Always "help"
|
|
530
|
+
- content (str): Formatted markdown help text containing:
|
|
531
|
+
- Available commands with descriptions
|
|
532
|
+
|
|
533
|
+
Note:
|
|
534
|
+
This method is synchronous as it performs no I/O operations.
|
|
535
|
+
Standardized to match format used by other agents (type + content keys).
|
|
536
|
+
"""
|
|
537
|
+
help_message = {
|
|
538
|
+
"*refactor [file_path] [instruction]": "Refactor existing code to improve structure and maintainability",
|
|
539
|
+
"*optimize [file_path] [type]": "Optimize code for performance, memory, or both (type: performance|memory|both)",
|
|
540
|
+
"*improve-quality [file_path]": "Improve overall code quality (best practices, patterns, documentation)",
|
|
541
|
+
"*help": "Show this help message",
|
|
542
|
+
}
|
|
543
|
+
|
|
544
|
+
# Format as markdown for consistency with other agents
|
|
545
|
+
command_lines = [
|
|
546
|
+
f"- **{cmd}**: {desc}"
|
|
547
|
+
for cmd, desc in help_message.items()
|
|
548
|
+
]
|
|
549
|
+
|
|
550
|
+
content = f"""# {self.agent_name} - Help
|
|
551
|
+
|
|
552
|
+
## Available Commands
|
|
553
|
+
|
|
554
|
+
{chr(10).join(command_lines)}
|
|
555
|
+
"""
|
|
556
|
+
|
|
557
|
+
return {"type": "help", "content": content}
|
|
558
|
+
|
|
559
|
+
def _extract_code_from_response(self, response: str) -> str:
|
|
560
|
+
"""Extract code from LLM response (handles code blocks)."""
|
|
561
|
+
# Look for ```python or ``` blocks
|
|
562
|
+
if "```python" in response:
|
|
563
|
+
start = response.find("```python") + 9
|
|
564
|
+
end = response.find("```", start)
|
|
565
|
+
if end > start:
|
|
566
|
+
return response[start:end].strip()
|
|
567
|
+
elif "```" in response:
|
|
568
|
+
start = response.find("```") + 3
|
|
569
|
+
end = response.find("```", start)
|
|
570
|
+
if end > start:
|
|
571
|
+
return response[start:end].strip()
|
|
572
|
+
|
|
573
|
+
# If no code blocks, return the response as-is
|
|
574
|
+
return response.strip()
|
|
575
|
+
|
|
576
|
+
# ========================================================================
|
|
577
|
+
# Phase 7.1: Auto-Apply Enhancement Methods
|
|
578
|
+
# ========================================================================
|
|
579
|
+
|
|
580
|
+
def _create_backup(self, file_path: str) -> Path | None:
|
|
581
|
+
"""
|
|
582
|
+
Create backup of file before modifications.
|
|
583
|
+
|
|
584
|
+
Phase 7.1: Auto-Apply Enhancement
|
|
585
|
+
|
|
586
|
+
Args:
|
|
587
|
+
file_path: Path to file to backup
|
|
588
|
+
|
|
589
|
+
Returns:
|
|
590
|
+
Path to backup file, or None if backup failed
|
|
591
|
+
|
|
592
|
+
Backup Location:
|
|
593
|
+
.tapps-agents/backups/<filename>.<timestamp>.backup
|
|
594
|
+
"""
|
|
595
|
+
try:
|
|
596
|
+
file_path_obj = Path(file_path)
|
|
597
|
+
if not file_path_obj.is_absolute():
|
|
598
|
+
file_path_obj = self.project_root / file_path_obj
|
|
599
|
+
|
|
600
|
+
if not file_path_obj.exists():
|
|
601
|
+
logger.warning(f"Cannot backup non-existent file: {file_path}")
|
|
602
|
+
return None
|
|
603
|
+
|
|
604
|
+
# Create backup directory
|
|
605
|
+
backup_dir = self.project_root / ".tapps-agents" / "backups"
|
|
606
|
+
backup_dir.mkdir(parents=True, exist_ok=True)
|
|
607
|
+
|
|
608
|
+
# Generate backup filename with timestamp
|
|
609
|
+
timestamp = datetime.now().strftime("%Y%m%d-%H%M%S")
|
|
610
|
+
backup_filename = f"{file_path_obj.name}.{timestamp}.backup"
|
|
611
|
+
backup_path = backup_dir / backup_filename
|
|
612
|
+
|
|
613
|
+
# Copy file to backup location
|
|
614
|
+
shutil.copy2(file_path_obj, backup_path)
|
|
615
|
+
logger.info(f"Created backup: {backup_path}")
|
|
616
|
+
|
|
617
|
+
return backup_path
|
|
618
|
+
|
|
619
|
+
except Exception as e:
|
|
620
|
+
logger.error(f"Failed to create backup for {file_path}: {e}")
|
|
621
|
+
return None
|
|
622
|
+
|
|
623
|
+
def _apply_improvements(
|
|
624
|
+
self, file_path: str, improved_code: str
|
|
625
|
+
) -> dict[str, Any]:
|
|
626
|
+
"""
|
|
627
|
+
Apply improved code to file.
|
|
628
|
+
|
|
629
|
+
Phase 7.1: Auto-Apply Enhancement
|
|
630
|
+
|
|
631
|
+
Args:
|
|
632
|
+
file_path: Path to file to modify
|
|
633
|
+
improved_code: Improved code content
|
|
634
|
+
|
|
635
|
+
Returns:
|
|
636
|
+
Dictionary with result status
|
|
637
|
+
"""
|
|
638
|
+
try:
|
|
639
|
+
file_path_obj = Path(file_path)
|
|
640
|
+
if not file_path_obj.is_absolute():
|
|
641
|
+
file_path_obj = self.project_root / file_path_obj
|
|
642
|
+
|
|
643
|
+
if not improved_code or not improved_code.strip():
|
|
644
|
+
return {"success": False, "error": "Improved code is empty"}
|
|
645
|
+
|
|
646
|
+
# Write improved code
|
|
647
|
+
file_path_obj.write_text(improved_code, encoding="utf-8")
|
|
648
|
+
logger.info(f"Applied improvements to: {file_path}")
|
|
649
|
+
|
|
650
|
+
return {
|
|
651
|
+
"success": True,
|
|
652
|
+
"file": str(file_path_obj),
|
|
653
|
+
"bytes_written": len(improved_code.encode("utf-8")),
|
|
654
|
+
}
|
|
655
|
+
|
|
656
|
+
except Exception as e:
|
|
657
|
+
logger.error(f"Failed to apply improvements to {file_path}: {e}")
|
|
658
|
+
return {"success": False, "error": str(e)}
|
|
659
|
+
|
|
660
|
+
def _generate_diff(
|
|
661
|
+
self, original: str, improved: str, file_path: str = "file"
|
|
662
|
+
) -> dict[str, Any]:
|
|
663
|
+
"""
|
|
664
|
+
Generate unified diff between original and improved code.
|
|
665
|
+
|
|
666
|
+
Phase 7.1: Auto-Apply Enhancement
|
|
667
|
+
|
|
668
|
+
Args:
|
|
669
|
+
original: Original code content
|
|
670
|
+
improved: Improved code content
|
|
671
|
+
file_path: File path for diff header
|
|
672
|
+
|
|
673
|
+
Returns:
|
|
674
|
+
Dictionary with diff result
|
|
675
|
+
"""
|
|
676
|
+
try:
|
|
677
|
+
original_lines = original.splitlines(keepends=True)
|
|
678
|
+
improved_lines = improved.splitlines(keepends=True)
|
|
679
|
+
|
|
680
|
+
# Generate unified diff
|
|
681
|
+
diff_lines = list(difflib.unified_diff(
|
|
682
|
+
original_lines,
|
|
683
|
+
improved_lines,
|
|
684
|
+
fromfile=f"original/{file_path}",
|
|
685
|
+
tofile=f"improved/{file_path}",
|
|
686
|
+
lineterm="",
|
|
687
|
+
))
|
|
688
|
+
|
|
689
|
+
unified_diff = "".join(diff_lines)
|
|
690
|
+
|
|
691
|
+
# Calculate statistics
|
|
692
|
+
lines_added = sum(1 for line in diff_lines if line.startswith("+") and not line.startswith("+++"))
|
|
693
|
+
lines_removed = sum(1 for line in diff_lines if line.startswith("-") and not line.startswith("---"))
|
|
694
|
+
has_changes = bool(diff_lines)
|
|
695
|
+
|
|
696
|
+
return DiffResult(
|
|
697
|
+
unified_diff=unified_diff,
|
|
698
|
+
lines_added=lines_added,
|
|
699
|
+
lines_removed=lines_removed,
|
|
700
|
+
has_changes=has_changes,
|
|
701
|
+
).to_dict()
|
|
702
|
+
|
|
703
|
+
except Exception as e:
|
|
704
|
+
logger.error(f"Failed to generate diff: {e}")
|
|
705
|
+
return DiffResult(
|
|
706
|
+
unified_diff="",
|
|
707
|
+
lines_added=0,
|
|
708
|
+
lines_removed=0,
|
|
709
|
+
has_changes=False,
|
|
710
|
+
).to_dict()
|
|
711
|
+
|
|
712
|
+
async def _verify_changes(self, file_path: str) -> dict[str, Any]:
|
|
713
|
+
"""
|
|
714
|
+
Run verification review after applying changes.
|
|
715
|
+
|
|
716
|
+
Phase 7.1: Auto-Apply Enhancement
|
|
717
|
+
|
|
718
|
+
Args:
|
|
719
|
+
file_path: Path to modified file
|
|
720
|
+
|
|
721
|
+
Returns:
|
|
722
|
+
Dictionary with verification results
|
|
723
|
+
"""
|
|
724
|
+
try:
|
|
725
|
+
# Import reviewer agent for verification
|
|
726
|
+
from ..reviewer.agent import ReviewerAgent
|
|
727
|
+
|
|
728
|
+
reviewer = ReviewerAgent(config=self.config)
|
|
729
|
+
await reviewer.activate(self.project_root, offline_mode=True)
|
|
730
|
+
|
|
731
|
+
file_path_obj = Path(file_path)
|
|
732
|
+
if not file_path_obj.is_absolute():
|
|
733
|
+
file_path_obj = self.project_root / file_path_obj
|
|
734
|
+
|
|
735
|
+
# Run review
|
|
736
|
+
review_result = await reviewer.review_file(file_path_obj)
|
|
737
|
+
|
|
738
|
+
# Extract score
|
|
739
|
+
scores = review_result.get("scoring", {})
|
|
740
|
+
overall_score = scores.get("overall_score", 0.0)
|
|
741
|
+
|
|
742
|
+
return {
|
|
743
|
+
"verified": True,
|
|
744
|
+
"new_score": overall_score,
|
|
745
|
+
"scores": scores,
|
|
746
|
+
"review": review_result,
|
|
747
|
+
}
|
|
748
|
+
|
|
749
|
+
except Exception as e:
|
|
750
|
+
logger.error(f"Failed to verify changes for {file_path}: {e}")
|
|
751
|
+
return {
|
|
752
|
+
"verified": False,
|
|
753
|
+
"error": str(e),
|
|
754
754
|
}
|