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
tapps_agents/core/worktree.py
CHANGED
|
@@ -1,367 +1,367 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Git Worktree Utilities for Background Agents
|
|
3
|
-
|
|
4
|
-
Provides utilities for creating and managing git worktrees for parallel agent execution.
|
|
5
|
-
This prevents file conflicts when multiple agents run simultaneously.
|
|
6
|
-
|
|
7
|
-
Phase 3 Simplification: Supports temp directories for non-git use cases.
|
|
8
|
-
"""
|
|
9
|
-
|
|
10
|
-
import logging
|
|
11
|
-
import shutil
|
|
12
|
-
import subprocess # nosec B404
|
|
13
|
-
from datetime import datetime, timedelta
|
|
14
|
-
from pathlib import Path
|
|
15
|
-
|
|
16
|
-
from .temp_directory import TempDirectoryManager, needs_git_operations
|
|
17
|
-
|
|
18
|
-
logger = logging.getLogger(__name__)
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
class WorktreeManager:
|
|
22
|
-
"""
|
|
23
|
-
Manages git worktrees for parallel agent execution.
|
|
24
|
-
|
|
25
|
-
Phase 3 Simplification: Automatically uses temp directories when git operations
|
|
26
|
-
are not needed, reducing git dependency.
|
|
27
|
-
"""
|
|
28
|
-
|
|
29
|
-
def __init__(
|
|
30
|
-
self,
|
|
31
|
-
base_path: Path,
|
|
32
|
-
worktree_base: Path | None = None,
|
|
33
|
-
use_temp_for_non_git: bool = True,
|
|
34
|
-
):
|
|
35
|
-
"""
|
|
36
|
-
Initialize WorktreeManager.
|
|
37
|
-
|
|
38
|
-
Args:
|
|
39
|
-
base_path: Base repository path
|
|
40
|
-
worktree_base: Base directory for worktrees (default: .tapps-agents/worktrees)
|
|
41
|
-
use_temp_for_non_git: If True, use temp directories when git not needed (Phase 3)
|
|
42
|
-
"""
|
|
43
|
-
self.base_path = Path(base_path).resolve()
|
|
44
|
-
self.worktree_base = (
|
|
45
|
-
worktree_base or self.base_path / ".tapps-agents" / "worktrees"
|
|
46
|
-
)
|
|
47
|
-
self.worktree_base.mkdir(parents=True, exist_ok=True)
|
|
48
|
-
self.use_temp_for_non_git = use_temp_for_non_git
|
|
49
|
-
self.temp_manager = TempDirectoryManager(
|
|
50
|
-
base_dir=self.worktree_base / "temp" if use_temp_for_non_git else None
|
|
51
|
-
)
|
|
52
|
-
|
|
53
|
-
def create_worktree(
|
|
54
|
-
self,
|
|
55
|
-
agent_id: str,
|
|
56
|
-
branch_name: str | None = None,
|
|
57
|
-
task_type: str | None = None,
|
|
58
|
-
commands: list[str] | None = None,
|
|
59
|
-
) -> Path:
|
|
60
|
-
"""
|
|
61
|
-
Create a git worktree or temp directory for an agent.
|
|
62
|
-
|
|
63
|
-
Phase 3 Simplification: Automatically uses temp directory when git operations
|
|
64
|
-
are not needed.
|
|
65
|
-
|
|
66
|
-
Args:
|
|
67
|
-
agent_id: Unique identifier for the agent
|
|
68
|
-
branch_name: Optional branch name (default: agent/{agent_id})
|
|
69
|
-
task_type: Optional task type to determine if git is needed
|
|
70
|
-
commands: Optional list of commands to determine if git is needed
|
|
71
|
-
|
|
72
|
-
Returns:
|
|
73
|
-
Path to the worktree or temp directory
|
|
74
|
-
"""
|
|
75
|
-
# Phase 3: Check if git operations are needed
|
|
76
|
-
if self.use_temp_for_non_git and task_type:
|
|
77
|
-
if not needs_git_operations(task_type, commands or []):
|
|
78
|
-
# Use temp directory instead of worktree
|
|
79
|
-
temp_dir = self.temp_manager.create_temp_dir(
|
|
80
|
-
agent_id, copy_from=self.base_path
|
|
81
|
-
)
|
|
82
|
-
logger.info(
|
|
83
|
-
f"Using temp directory for {agent_id} (git not needed): {temp_dir}"
|
|
84
|
-
)
|
|
85
|
-
return temp_dir
|
|
86
|
-
|
|
87
|
-
# Use git worktree (existing behavior)
|
|
88
|
-
branch_name = branch_name or f"agent/{agent_id}"
|
|
89
|
-
worktree_path = self.worktree_base / agent_id
|
|
90
|
-
|
|
91
|
-
# Check if worktree already exists
|
|
92
|
-
if worktree_path.exists():
|
|
93
|
-
logger.warning(f"Worktree {agent_id} already exists, reusing")
|
|
94
|
-
return worktree_path
|
|
95
|
-
|
|
96
|
-
try:
|
|
97
|
-
# Create worktree
|
|
98
|
-
git_path = shutil.which("git") or "git"
|
|
99
|
-
|
|
100
|
-
# Check if branch already exists (from a previous run that didn't clean up properly)
|
|
101
|
-
branch_check_cmd = [git_path, "branch", "--list", branch_name]
|
|
102
|
-
branch_check_result = subprocess.run( # nosec B603
|
|
103
|
-
branch_check_cmd,
|
|
104
|
-
cwd=self.base_path,
|
|
105
|
-
capture_output=True,
|
|
106
|
-
text=True,
|
|
107
|
-
check=False,
|
|
108
|
-
)
|
|
109
|
-
|
|
110
|
-
if branch_check_result.stdout.strip():
|
|
111
|
-
# Branch exists but worktree doesn't - delete the orphaned branch
|
|
112
|
-
logger.warning(f"Branch {branch_name} exists without worktree, deleting it")
|
|
113
|
-
branch_delete_cmd = [git_path, "branch", "-D", branch_name]
|
|
114
|
-
subprocess.run( # nosec B603
|
|
115
|
-
branch_delete_cmd,
|
|
116
|
-
cwd=self.base_path,
|
|
117
|
-
capture_output=True,
|
|
118
|
-
text=True,
|
|
119
|
-
check=False, # Don't fail if already deleted
|
|
120
|
-
)
|
|
121
|
-
|
|
122
|
-
cmd = [git_path, "worktree", "add", str(worktree_path), "-b", branch_name]
|
|
123
|
-
|
|
124
|
-
subprocess.run( # nosec B603
|
|
125
|
-
cmd, cwd=self.base_path, capture_output=True, text=True, check=True
|
|
126
|
-
)
|
|
127
|
-
|
|
128
|
-
logger.info(f"Created worktree {agent_id} at {worktree_path}")
|
|
129
|
-
return worktree_path
|
|
130
|
-
|
|
131
|
-
except subprocess.CalledProcessError as e:
|
|
132
|
-
logger.error(f"Failed to create worktree {agent_id}: {e.stderr}")
|
|
133
|
-
raise
|
|
134
|
-
|
|
135
|
-
def remove_worktree(self, agent_id: str) -> bool:
|
|
136
|
-
"""
|
|
137
|
-
Remove a git worktree or temp directory.
|
|
138
|
-
|
|
139
|
-
Phase 3 Simplification: Handles both worktrees and temp directories.
|
|
140
|
-
|
|
141
|
-
Args:
|
|
142
|
-
agent_id: Unique identifier for the agent
|
|
143
|
-
|
|
144
|
-
Returns:
|
|
145
|
-
True if successful, False otherwise
|
|
146
|
-
"""
|
|
147
|
-
# Phase 3: Check if it's a temp directory first
|
|
148
|
-
if self.temp_manager.get_temp_dir(agent_id):
|
|
149
|
-
return self.temp_manager.remove_temp_dir(agent_id)
|
|
150
|
-
|
|
151
|
-
# Remove git worktree (existing behavior)
|
|
152
|
-
worktree_path = self.worktree_base / agent_id
|
|
153
|
-
branch_name = f"agent/{agent_id}"
|
|
154
|
-
|
|
155
|
-
worktree_existed = worktree_path.exists()
|
|
156
|
-
|
|
157
|
-
try:
|
|
158
|
-
# Remove worktree using git command (if it exists)
|
|
159
|
-
if worktree_existed:
|
|
160
|
-
git_path = shutil.which("git") or "git"
|
|
161
|
-
cmd = [git_path, "worktree", "remove", str(worktree_path), "--force"]
|
|
162
|
-
|
|
163
|
-
subprocess.run( # nosec B603
|
|
164
|
-
cmd, cwd=self.base_path, capture_output=True, text=True, check=True
|
|
165
|
-
)
|
|
166
|
-
|
|
167
|
-
logger.info(f"Removed worktree {agent_id}")
|
|
168
|
-
|
|
169
|
-
# Delete the branch if it exists (even if worktree didn't exist)
|
|
170
|
-
git_path = shutil.which("git") or "git"
|
|
171
|
-
branch_check_cmd = [git_path, "branch", "--list", branch_name]
|
|
172
|
-
branch_check_result = subprocess.run( # nosec B603
|
|
173
|
-
branch_check_cmd,
|
|
174
|
-
cwd=self.base_path,
|
|
175
|
-
capture_output=True,
|
|
176
|
-
text=True,
|
|
177
|
-
check=False,
|
|
178
|
-
)
|
|
179
|
-
|
|
180
|
-
if branch_check_result.stdout.strip():
|
|
181
|
-
# Branch exists, delete it
|
|
182
|
-
branch_delete_cmd = [git_path, "branch", "-D", branch_name]
|
|
183
|
-
subprocess.run( # nosec B603
|
|
184
|
-
branch_delete_cmd,
|
|
185
|
-
cwd=self.base_path,
|
|
186
|
-
capture_output=True,
|
|
187
|
-
text=True,
|
|
188
|
-
check=False, # Don't fail if branch doesn't exist
|
|
189
|
-
)
|
|
190
|
-
logger.info(f"Deleted branch {branch_name}")
|
|
191
|
-
|
|
192
|
-
return True
|
|
193
|
-
|
|
194
|
-
except subprocess.CalledProcessError as e:
|
|
195
|
-
logger.error(f"Failed to remove worktree {agent_id}: {e.stderr}")
|
|
196
|
-
# Fallback: try to remove directory manually
|
|
197
|
-
if worktree_existed:
|
|
198
|
-
try:
|
|
199
|
-
shutil.rmtree(worktree_path)
|
|
200
|
-
logger.info(f"Manually removed worktree directory {agent_id}")
|
|
201
|
-
# Still try to delete branch
|
|
202
|
-
git_path = shutil.which("git") or "git"
|
|
203
|
-
branch_delete_cmd = [git_path, "branch", "-D", branch_name]
|
|
204
|
-
subprocess.run( # nosec B603
|
|
205
|
-
branch_delete_cmd,
|
|
206
|
-
cwd=self.base_path,
|
|
207
|
-
capture_output=True,
|
|
208
|
-
text=True,
|
|
209
|
-
check=False,
|
|
210
|
-
)
|
|
211
|
-
return True
|
|
212
|
-
except Exception as e2:
|
|
213
|
-
logger.error(f"Failed to manually remove worktree {agent_id}: {e2}")
|
|
214
|
-
return False
|
|
215
|
-
return False
|
|
216
|
-
|
|
217
|
-
def list_worktrees(self) -> dict[str, Path]:
|
|
218
|
-
"""
|
|
219
|
-
List all active worktrees.
|
|
220
|
-
|
|
221
|
-
Returns:
|
|
222
|
-
Dictionary mapping agent_id to worktree path
|
|
223
|
-
"""
|
|
224
|
-
worktrees = {}
|
|
225
|
-
|
|
226
|
-
try:
|
|
227
|
-
git_path = shutil.which("git") or "git"
|
|
228
|
-
cmd = [git_path, "worktree", "list"]
|
|
229
|
-
result = subprocess.run( # nosec B603
|
|
230
|
-
cmd, cwd=self.base_path, capture_output=True, text=True, check=True
|
|
231
|
-
)
|
|
232
|
-
|
|
233
|
-
# Parse output
|
|
234
|
-
for line in result.stdout.strip().split("\n"):
|
|
235
|
-
if line.strip():
|
|
236
|
-
parts = line.split()
|
|
237
|
-
if len(parts) >= 1:
|
|
238
|
-
worktree_path = Path(parts[0])
|
|
239
|
-
if worktree_path.parent == self.worktree_base:
|
|
240
|
-
agent_id = worktree_path.name
|
|
241
|
-
worktrees[agent_id] = worktree_path
|
|
242
|
-
|
|
243
|
-
return worktrees
|
|
244
|
-
|
|
245
|
-
except subprocess.CalledProcessError as e:
|
|
246
|
-
logger.error(f"Failed to list worktrees: {e.stderr}")
|
|
247
|
-
return {}
|
|
248
|
-
|
|
249
|
-
def cleanup_worktrees(
|
|
250
|
-
self,
|
|
251
|
-
keep_active: bool = True,
|
|
252
|
-
retention_days: int | None = None,
|
|
253
|
-
older_than: timedelta | None = None,
|
|
254
|
-
) -> int:
|
|
255
|
-
"""
|
|
256
|
-
Clean up worktrees (remove branches and directories).
|
|
257
|
-
|
|
258
|
-
Args:
|
|
259
|
-
keep_active: If True, keep worktrees that have uncommitted changes
|
|
260
|
-
retention_days: Keep worktrees newer than N days (None = no age limit)
|
|
261
|
-
older_than: Keep worktrees newer than this timedelta (overrides retention_days)
|
|
262
|
-
|
|
263
|
-
Returns:
|
|
264
|
-
Number of worktrees cleaned up
|
|
265
|
-
"""
|
|
266
|
-
worktrees = self.list_worktrees()
|
|
267
|
-
cleaned = 0
|
|
268
|
-
|
|
269
|
-
# Calculate cutoff time
|
|
270
|
-
cutoff_time = None
|
|
271
|
-
if older_than:
|
|
272
|
-
cutoff_time = datetime.now() - older_than
|
|
273
|
-
elif retention_days:
|
|
274
|
-
cutoff_time = datetime.now() - timedelta(days=retention_days)
|
|
275
|
-
|
|
276
|
-
for agent_id, worktree_path in worktrees.items():
|
|
277
|
-
try:
|
|
278
|
-
# Check age if retention period specified
|
|
279
|
-
if cutoff_time:
|
|
280
|
-
worktree_mtime = datetime.fromtimestamp(worktree_path.stat().st_mtime)
|
|
281
|
-
if worktree_mtime > cutoff_time:
|
|
282
|
-
logger.debug(
|
|
283
|
-
f"Skipping worktree {agent_id} (newer than retention period)"
|
|
284
|
-
)
|
|
285
|
-
continue
|
|
286
|
-
|
|
287
|
-
# Check for completion marker
|
|
288
|
-
completion_file = worktree_path / ".tapps-agents" / "completed.txt"
|
|
289
|
-
if not completion_file.exists() and keep_active:
|
|
290
|
-
logger.debug(f"Skipping worktree {agent_id} (not marked as completed)")
|
|
291
|
-
continue
|
|
292
|
-
|
|
293
|
-
# Check for uncommitted changes
|
|
294
|
-
if keep_active:
|
|
295
|
-
git_path = shutil.which("git") or "git"
|
|
296
|
-
cmd = [git_path, "status", "--porcelain"]
|
|
297
|
-
result = subprocess.run( # nosec B603
|
|
298
|
-
cmd, cwd=worktree_path, capture_output=True, text=True
|
|
299
|
-
)
|
|
300
|
-
if result.stdout.strip():
|
|
301
|
-
logger.info(
|
|
302
|
-
f"Skipping worktree {agent_id} (has uncommitted changes)"
|
|
303
|
-
)
|
|
304
|
-
continue
|
|
305
|
-
|
|
306
|
-
# Remove worktree
|
|
307
|
-
if self.remove_worktree(agent_id):
|
|
308
|
-
cleaned += 1
|
|
309
|
-
logger.info(f"Cleaned up worktree {agent_id}")
|
|
310
|
-
|
|
311
|
-
except Exception as e:
|
|
312
|
-
logger.error(f"Error cleaning up worktree {agent_id}: {e}")
|
|
313
|
-
|
|
314
|
-
return cleaned
|
|
315
|
-
|
|
316
|
-
def auto_cleanup(
|
|
317
|
-
self,
|
|
318
|
-
retention_days: int = 7,
|
|
319
|
-
keep_active: bool = True,
|
|
320
|
-
) -> int:
|
|
321
|
-
"""
|
|
322
|
-
Automatically clean up old worktrees based on retention policy.
|
|
323
|
-
|
|
324
|
-
Args:
|
|
325
|
-
retention_days: Keep worktrees newer than N days (default: 7)
|
|
326
|
-
keep_active: If True, keep worktrees that have uncommitted changes
|
|
327
|
-
|
|
328
|
-
Returns:
|
|
329
|
-
Number of worktrees cleaned up
|
|
330
|
-
"""
|
|
331
|
-
return self.cleanup_worktrees(
|
|
332
|
-
keep_active=keep_active,
|
|
333
|
-
retention_days=retention_days,
|
|
334
|
-
)
|
|
335
|
-
|
|
336
|
-
def get_worktree_path(self, agent_id: str) -> Path | None:
|
|
337
|
-
"""
|
|
338
|
-
Get the path to an existing worktree.
|
|
339
|
-
|
|
340
|
-
Args:
|
|
341
|
-
agent_id: Unique identifier for the agent
|
|
342
|
-
|
|
343
|
-
Returns:
|
|
344
|
-
Path to worktree if it exists, None otherwise
|
|
345
|
-
"""
|
|
346
|
-
worktree_path = self.worktree_base / agent_id
|
|
347
|
-
if worktree_path.exists():
|
|
348
|
-
return worktree_path
|
|
349
|
-
return None
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
def create_worktree_for_agent(
|
|
353
|
-
base_path: Path, agent_id: str, worktree_base: Path | None = None
|
|
354
|
-
) -> Path:
|
|
355
|
-
"""
|
|
356
|
-
Convenience function to create a worktree for an agent.
|
|
357
|
-
|
|
358
|
-
Args:
|
|
359
|
-
base_path: Base repository path
|
|
360
|
-
agent_id: Unique identifier for the agent
|
|
361
|
-
worktree_base: Base directory for worktrees
|
|
362
|
-
|
|
363
|
-
Returns:
|
|
364
|
-
Path to the worktree directory
|
|
365
|
-
"""
|
|
366
|
-
manager = WorktreeManager(base_path, worktree_base)
|
|
367
|
-
return manager.create_worktree(agent_id)
|
|
1
|
+
"""
|
|
2
|
+
Git Worktree Utilities for Background Agents
|
|
3
|
+
|
|
4
|
+
Provides utilities for creating and managing git worktrees for parallel agent execution.
|
|
5
|
+
This prevents file conflicts when multiple agents run simultaneously.
|
|
6
|
+
|
|
7
|
+
Phase 3 Simplification: Supports temp directories for non-git use cases.
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
import logging
|
|
11
|
+
import shutil
|
|
12
|
+
import subprocess # nosec B404
|
|
13
|
+
from datetime import datetime, timedelta
|
|
14
|
+
from pathlib import Path
|
|
15
|
+
|
|
16
|
+
from .temp_directory import TempDirectoryManager, needs_git_operations
|
|
17
|
+
|
|
18
|
+
logger = logging.getLogger(__name__)
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class WorktreeManager:
|
|
22
|
+
"""
|
|
23
|
+
Manages git worktrees for parallel agent execution.
|
|
24
|
+
|
|
25
|
+
Phase 3 Simplification: Automatically uses temp directories when git operations
|
|
26
|
+
are not needed, reducing git dependency.
|
|
27
|
+
"""
|
|
28
|
+
|
|
29
|
+
def __init__(
|
|
30
|
+
self,
|
|
31
|
+
base_path: Path,
|
|
32
|
+
worktree_base: Path | None = None,
|
|
33
|
+
use_temp_for_non_git: bool = True,
|
|
34
|
+
):
|
|
35
|
+
"""
|
|
36
|
+
Initialize WorktreeManager.
|
|
37
|
+
|
|
38
|
+
Args:
|
|
39
|
+
base_path: Base repository path
|
|
40
|
+
worktree_base: Base directory for worktrees (default: .tapps-agents/worktrees)
|
|
41
|
+
use_temp_for_non_git: If True, use temp directories when git not needed (Phase 3)
|
|
42
|
+
"""
|
|
43
|
+
self.base_path = Path(base_path).resolve()
|
|
44
|
+
self.worktree_base = (
|
|
45
|
+
worktree_base or self.base_path / ".tapps-agents" / "worktrees"
|
|
46
|
+
)
|
|
47
|
+
self.worktree_base.mkdir(parents=True, exist_ok=True)
|
|
48
|
+
self.use_temp_for_non_git = use_temp_for_non_git
|
|
49
|
+
self.temp_manager = TempDirectoryManager(
|
|
50
|
+
base_dir=self.worktree_base / "temp" if use_temp_for_non_git else None
|
|
51
|
+
)
|
|
52
|
+
|
|
53
|
+
def create_worktree(
|
|
54
|
+
self,
|
|
55
|
+
agent_id: str,
|
|
56
|
+
branch_name: str | None = None,
|
|
57
|
+
task_type: str | None = None,
|
|
58
|
+
commands: list[str] | None = None,
|
|
59
|
+
) -> Path:
|
|
60
|
+
"""
|
|
61
|
+
Create a git worktree or temp directory for an agent.
|
|
62
|
+
|
|
63
|
+
Phase 3 Simplification: Automatically uses temp directory when git operations
|
|
64
|
+
are not needed.
|
|
65
|
+
|
|
66
|
+
Args:
|
|
67
|
+
agent_id: Unique identifier for the agent
|
|
68
|
+
branch_name: Optional branch name (default: agent/{agent_id})
|
|
69
|
+
task_type: Optional task type to determine if git is needed
|
|
70
|
+
commands: Optional list of commands to determine if git is needed
|
|
71
|
+
|
|
72
|
+
Returns:
|
|
73
|
+
Path to the worktree or temp directory
|
|
74
|
+
"""
|
|
75
|
+
# Phase 3: Check if git operations are needed
|
|
76
|
+
if self.use_temp_for_non_git and task_type:
|
|
77
|
+
if not needs_git_operations(task_type, commands or []):
|
|
78
|
+
# Use temp directory instead of worktree
|
|
79
|
+
temp_dir = self.temp_manager.create_temp_dir(
|
|
80
|
+
agent_id, copy_from=self.base_path
|
|
81
|
+
)
|
|
82
|
+
logger.info(
|
|
83
|
+
f"Using temp directory for {agent_id} (git not needed): {temp_dir}"
|
|
84
|
+
)
|
|
85
|
+
return temp_dir
|
|
86
|
+
|
|
87
|
+
# Use git worktree (existing behavior)
|
|
88
|
+
branch_name = branch_name or f"agent/{agent_id}"
|
|
89
|
+
worktree_path = self.worktree_base / agent_id
|
|
90
|
+
|
|
91
|
+
# Check if worktree already exists
|
|
92
|
+
if worktree_path.exists():
|
|
93
|
+
logger.warning(f"Worktree {agent_id} already exists, reusing")
|
|
94
|
+
return worktree_path
|
|
95
|
+
|
|
96
|
+
try:
|
|
97
|
+
# Create worktree
|
|
98
|
+
git_path = shutil.which("git") or "git"
|
|
99
|
+
|
|
100
|
+
# Check if branch already exists (from a previous run that didn't clean up properly)
|
|
101
|
+
branch_check_cmd = [git_path, "branch", "--list", branch_name]
|
|
102
|
+
branch_check_result = subprocess.run( # nosec B603
|
|
103
|
+
branch_check_cmd,
|
|
104
|
+
cwd=self.base_path,
|
|
105
|
+
capture_output=True,
|
|
106
|
+
text=True,
|
|
107
|
+
check=False,
|
|
108
|
+
)
|
|
109
|
+
|
|
110
|
+
if branch_check_result.stdout.strip():
|
|
111
|
+
# Branch exists but worktree doesn't - delete the orphaned branch
|
|
112
|
+
logger.warning(f"Branch {branch_name} exists without worktree, deleting it")
|
|
113
|
+
branch_delete_cmd = [git_path, "branch", "-D", branch_name]
|
|
114
|
+
subprocess.run( # nosec B603
|
|
115
|
+
branch_delete_cmd,
|
|
116
|
+
cwd=self.base_path,
|
|
117
|
+
capture_output=True,
|
|
118
|
+
text=True,
|
|
119
|
+
check=False, # Don't fail if already deleted
|
|
120
|
+
)
|
|
121
|
+
|
|
122
|
+
cmd = [git_path, "worktree", "add", str(worktree_path), "-b", branch_name]
|
|
123
|
+
|
|
124
|
+
subprocess.run( # nosec B603
|
|
125
|
+
cmd, cwd=self.base_path, capture_output=True, text=True, check=True
|
|
126
|
+
)
|
|
127
|
+
|
|
128
|
+
logger.info(f"Created worktree {agent_id} at {worktree_path}")
|
|
129
|
+
return worktree_path
|
|
130
|
+
|
|
131
|
+
except subprocess.CalledProcessError as e:
|
|
132
|
+
logger.error(f"Failed to create worktree {agent_id}: {e.stderr}")
|
|
133
|
+
raise
|
|
134
|
+
|
|
135
|
+
def remove_worktree(self, agent_id: str) -> bool:
|
|
136
|
+
"""
|
|
137
|
+
Remove a git worktree or temp directory.
|
|
138
|
+
|
|
139
|
+
Phase 3 Simplification: Handles both worktrees and temp directories.
|
|
140
|
+
|
|
141
|
+
Args:
|
|
142
|
+
agent_id: Unique identifier for the agent
|
|
143
|
+
|
|
144
|
+
Returns:
|
|
145
|
+
True if successful, False otherwise
|
|
146
|
+
"""
|
|
147
|
+
# Phase 3: Check if it's a temp directory first
|
|
148
|
+
if self.temp_manager.get_temp_dir(agent_id):
|
|
149
|
+
return self.temp_manager.remove_temp_dir(agent_id)
|
|
150
|
+
|
|
151
|
+
# Remove git worktree (existing behavior)
|
|
152
|
+
worktree_path = self.worktree_base / agent_id
|
|
153
|
+
branch_name = f"agent/{agent_id}"
|
|
154
|
+
|
|
155
|
+
worktree_existed = worktree_path.exists()
|
|
156
|
+
|
|
157
|
+
try:
|
|
158
|
+
# Remove worktree using git command (if it exists)
|
|
159
|
+
if worktree_existed:
|
|
160
|
+
git_path = shutil.which("git") or "git"
|
|
161
|
+
cmd = [git_path, "worktree", "remove", str(worktree_path), "--force"]
|
|
162
|
+
|
|
163
|
+
subprocess.run( # nosec B603
|
|
164
|
+
cmd, cwd=self.base_path, capture_output=True, text=True, check=True
|
|
165
|
+
)
|
|
166
|
+
|
|
167
|
+
logger.info(f"Removed worktree {agent_id}")
|
|
168
|
+
|
|
169
|
+
# Delete the branch if it exists (even if worktree didn't exist)
|
|
170
|
+
git_path = shutil.which("git") or "git"
|
|
171
|
+
branch_check_cmd = [git_path, "branch", "--list", branch_name]
|
|
172
|
+
branch_check_result = subprocess.run( # nosec B603
|
|
173
|
+
branch_check_cmd,
|
|
174
|
+
cwd=self.base_path,
|
|
175
|
+
capture_output=True,
|
|
176
|
+
text=True,
|
|
177
|
+
check=False,
|
|
178
|
+
)
|
|
179
|
+
|
|
180
|
+
if branch_check_result.stdout.strip():
|
|
181
|
+
# Branch exists, delete it
|
|
182
|
+
branch_delete_cmd = [git_path, "branch", "-D", branch_name]
|
|
183
|
+
subprocess.run( # nosec B603
|
|
184
|
+
branch_delete_cmd,
|
|
185
|
+
cwd=self.base_path,
|
|
186
|
+
capture_output=True,
|
|
187
|
+
text=True,
|
|
188
|
+
check=False, # Don't fail if branch doesn't exist
|
|
189
|
+
)
|
|
190
|
+
logger.info(f"Deleted branch {branch_name}")
|
|
191
|
+
|
|
192
|
+
return True
|
|
193
|
+
|
|
194
|
+
except subprocess.CalledProcessError as e:
|
|
195
|
+
logger.error(f"Failed to remove worktree {agent_id}: {e.stderr}")
|
|
196
|
+
# Fallback: try to remove directory manually
|
|
197
|
+
if worktree_existed:
|
|
198
|
+
try:
|
|
199
|
+
shutil.rmtree(worktree_path)
|
|
200
|
+
logger.info(f"Manually removed worktree directory {agent_id}")
|
|
201
|
+
# Still try to delete branch
|
|
202
|
+
git_path = shutil.which("git") or "git"
|
|
203
|
+
branch_delete_cmd = [git_path, "branch", "-D", branch_name]
|
|
204
|
+
subprocess.run( # nosec B603
|
|
205
|
+
branch_delete_cmd,
|
|
206
|
+
cwd=self.base_path,
|
|
207
|
+
capture_output=True,
|
|
208
|
+
text=True,
|
|
209
|
+
check=False,
|
|
210
|
+
)
|
|
211
|
+
return True
|
|
212
|
+
except Exception as e2:
|
|
213
|
+
logger.error(f"Failed to manually remove worktree {agent_id}: {e2}")
|
|
214
|
+
return False
|
|
215
|
+
return False
|
|
216
|
+
|
|
217
|
+
def list_worktrees(self) -> dict[str, Path]:
|
|
218
|
+
"""
|
|
219
|
+
List all active worktrees.
|
|
220
|
+
|
|
221
|
+
Returns:
|
|
222
|
+
Dictionary mapping agent_id to worktree path
|
|
223
|
+
"""
|
|
224
|
+
worktrees = {}
|
|
225
|
+
|
|
226
|
+
try:
|
|
227
|
+
git_path = shutil.which("git") or "git"
|
|
228
|
+
cmd = [git_path, "worktree", "list"]
|
|
229
|
+
result = subprocess.run( # nosec B603
|
|
230
|
+
cmd, cwd=self.base_path, capture_output=True, text=True, check=True
|
|
231
|
+
)
|
|
232
|
+
|
|
233
|
+
# Parse output
|
|
234
|
+
for line in result.stdout.strip().split("\n"):
|
|
235
|
+
if line.strip():
|
|
236
|
+
parts = line.split()
|
|
237
|
+
if len(parts) >= 1:
|
|
238
|
+
worktree_path = Path(parts[0])
|
|
239
|
+
if worktree_path.parent == self.worktree_base:
|
|
240
|
+
agent_id = worktree_path.name
|
|
241
|
+
worktrees[agent_id] = worktree_path
|
|
242
|
+
|
|
243
|
+
return worktrees
|
|
244
|
+
|
|
245
|
+
except subprocess.CalledProcessError as e:
|
|
246
|
+
logger.error(f"Failed to list worktrees: {e.stderr}")
|
|
247
|
+
return {}
|
|
248
|
+
|
|
249
|
+
def cleanup_worktrees(
|
|
250
|
+
self,
|
|
251
|
+
keep_active: bool = True,
|
|
252
|
+
retention_days: int | None = None,
|
|
253
|
+
older_than: timedelta | None = None,
|
|
254
|
+
) -> int:
|
|
255
|
+
"""
|
|
256
|
+
Clean up worktrees (remove branches and directories).
|
|
257
|
+
|
|
258
|
+
Args:
|
|
259
|
+
keep_active: If True, keep worktrees that have uncommitted changes
|
|
260
|
+
retention_days: Keep worktrees newer than N days (None = no age limit)
|
|
261
|
+
older_than: Keep worktrees newer than this timedelta (overrides retention_days)
|
|
262
|
+
|
|
263
|
+
Returns:
|
|
264
|
+
Number of worktrees cleaned up
|
|
265
|
+
"""
|
|
266
|
+
worktrees = self.list_worktrees()
|
|
267
|
+
cleaned = 0
|
|
268
|
+
|
|
269
|
+
# Calculate cutoff time
|
|
270
|
+
cutoff_time = None
|
|
271
|
+
if older_than:
|
|
272
|
+
cutoff_time = datetime.now() - older_than
|
|
273
|
+
elif retention_days:
|
|
274
|
+
cutoff_time = datetime.now() - timedelta(days=retention_days)
|
|
275
|
+
|
|
276
|
+
for agent_id, worktree_path in worktrees.items():
|
|
277
|
+
try:
|
|
278
|
+
# Check age if retention period specified
|
|
279
|
+
if cutoff_time:
|
|
280
|
+
worktree_mtime = datetime.fromtimestamp(worktree_path.stat().st_mtime)
|
|
281
|
+
if worktree_mtime > cutoff_time:
|
|
282
|
+
logger.debug(
|
|
283
|
+
f"Skipping worktree {agent_id} (newer than retention period)"
|
|
284
|
+
)
|
|
285
|
+
continue
|
|
286
|
+
|
|
287
|
+
# Check for completion marker
|
|
288
|
+
completion_file = worktree_path / ".tapps-agents" / "completed.txt"
|
|
289
|
+
if not completion_file.exists() and keep_active:
|
|
290
|
+
logger.debug(f"Skipping worktree {agent_id} (not marked as completed)")
|
|
291
|
+
continue
|
|
292
|
+
|
|
293
|
+
# Check for uncommitted changes
|
|
294
|
+
if keep_active:
|
|
295
|
+
git_path = shutil.which("git") or "git"
|
|
296
|
+
cmd = [git_path, "status", "--porcelain"]
|
|
297
|
+
result = subprocess.run( # nosec B603
|
|
298
|
+
cmd, cwd=worktree_path, capture_output=True, text=True
|
|
299
|
+
)
|
|
300
|
+
if result.stdout.strip():
|
|
301
|
+
logger.info(
|
|
302
|
+
f"Skipping worktree {agent_id} (has uncommitted changes)"
|
|
303
|
+
)
|
|
304
|
+
continue
|
|
305
|
+
|
|
306
|
+
# Remove worktree
|
|
307
|
+
if self.remove_worktree(agent_id):
|
|
308
|
+
cleaned += 1
|
|
309
|
+
logger.info(f"Cleaned up worktree {agent_id}")
|
|
310
|
+
|
|
311
|
+
except Exception as e:
|
|
312
|
+
logger.error(f"Error cleaning up worktree {agent_id}: {e}")
|
|
313
|
+
|
|
314
|
+
return cleaned
|
|
315
|
+
|
|
316
|
+
def auto_cleanup(
|
|
317
|
+
self,
|
|
318
|
+
retention_days: int = 7,
|
|
319
|
+
keep_active: bool = True,
|
|
320
|
+
) -> int:
|
|
321
|
+
"""
|
|
322
|
+
Automatically clean up old worktrees based on retention policy.
|
|
323
|
+
|
|
324
|
+
Args:
|
|
325
|
+
retention_days: Keep worktrees newer than N days (default: 7)
|
|
326
|
+
keep_active: If True, keep worktrees that have uncommitted changes
|
|
327
|
+
|
|
328
|
+
Returns:
|
|
329
|
+
Number of worktrees cleaned up
|
|
330
|
+
"""
|
|
331
|
+
return self.cleanup_worktrees(
|
|
332
|
+
keep_active=keep_active,
|
|
333
|
+
retention_days=retention_days,
|
|
334
|
+
)
|
|
335
|
+
|
|
336
|
+
def get_worktree_path(self, agent_id: str) -> Path | None:
|
|
337
|
+
"""
|
|
338
|
+
Get the path to an existing worktree.
|
|
339
|
+
|
|
340
|
+
Args:
|
|
341
|
+
agent_id: Unique identifier for the agent
|
|
342
|
+
|
|
343
|
+
Returns:
|
|
344
|
+
Path to worktree if it exists, None otherwise
|
|
345
|
+
"""
|
|
346
|
+
worktree_path = self.worktree_base / agent_id
|
|
347
|
+
if worktree_path.exists():
|
|
348
|
+
return worktree_path
|
|
349
|
+
return None
|
|
350
|
+
|
|
351
|
+
|
|
352
|
+
def create_worktree_for_agent(
|
|
353
|
+
base_path: Path, agent_id: str, worktree_base: Path | None = None
|
|
354
|
+
) -> Path:
|
|
355
|
+
"""
|
|
356
|
+
Convenience function to create a worktree for an agent.
|
|
357
|
+
|
|
358
|
+
Args:
|
|
359
|
+
base_path: Base repository path
|
|
360
|
+
agent_id: Unique identifier for the agent
|
|
361
|
+
worktree_base: Base directory for worktrees
|
|
362
|
+
|
|
363
|
+
Returns:
|
|
364
|
+
Path to the worktree directory
|
|
365
|
+
"""
|
|
366
|
+
manager = WorktreeManager(base_path, worktree_base)
|
|
367
|
+
return manager.create_worktree(agent_id)
|