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,387 +1,387 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Workflow Recommender - Recommend appropriate workflows based on project characteristics.
|
|
3
|
-
|
|
4
|
-
Phase 5.2: Enhanced with preset alias support, YAML validation, and caching
|
|
5
|
-
"""
|
|
6
|
-
|
|
7
|
-
import logging
|
|
8
|
-
from dataclasses import dataclass
|
|
9
|
-
from pathlib import Path
|
|
10
|
-
from typing import Any
|
|
11
|
-
|
|
12
|
-
import yaml
|
|
13
|
-
|
|
14
|
-
from .detector import ProjectCharacteristics, ProjectDetector, WorkflowTrack
|
|
15
|
-
from .models import Workflow
|
|
16
|
-
from .parser import WorkflowParser
|
|
17
|
-
|
|
18
|
-
logger = logging.getLogger(__name__)
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
@dataclass
|
|
22
|
-
class WorkflowRecommendation:
|
|
23
|
-
"""Workflow recommendation result."""
|
|
24
|
-
|
|
25
|
-
workflow_file: str | None
|
|
26
|
-
workflow: Workflow | None
|
|
27
|
-
track: WorkflowTrack
|
|
28
|
-
confidence: float
|
|
29
|
-
characteristics: ProjectCharacteristics
|
|
30
|
-
alternative_workflows: list[str]
|
|
31
|
-
message: str
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
class WorkflowRecommender:
|
|
35
|
-
"""
|
|
36
|
-
Recommend workflows based on project detection.
|
|
37
|
-
|
|
38
|
-
Phase 5.2: Enhanced with preset alias support, YAML validation, and caching
|
|
39
|
-
"""
|
|
40
|
-
|
|
41
|
-
def __init__(
|
|
42
|
-
self, project_root: Path | None = None, workflows_dir: Path | None = None
|
|
43
|
-
):
|
|
44
|
-
"""
|
|
45
|
-
Initialize workflow recommender.
|
|
46
|
-
|
|
47
|
-
Args:
|
|
48
|
-
project_root: Root directory of the project
|
|
49
|
-
workflows_dir: Directory containing workflow YAML files
|
|
50
|
-
"""
|
|
51
|
-
self.project_root = project_root or Path.cwd()
|
|
52
|
-
self.workflows_dir = workflows_dir or (self.project_root / "workflows")
|
|
53
|
-
self.detector = ProjectDetector(project_root)
|
|
54
|
-
|
|
55
|
-
# Phase 5.2: Cache for workflow file parsing
|
|
56
|
-
self._workflow_cache: dict[str, tuple[Workflow | None, str | None]] = {}
|
|
57
|
-
# Cache format: {workflow_name: (parsed_workflow, error_message)}
|
|
58
|
-
|
|
59
|
-
def recommend(
|
|
60
|
-
self,
|
|
61
|
-
user_query: str | None = None,
|
|
62
|
-
file_count: int | None = None,
|
|
63
|
-
scope_description: str | None = None,
|
|
64
|
-
auto_load: bool = True,
|
|
65
|
-
) -> WorkflowRecommendation:
|
|
66
|
-
"""
|
|
67
|
-
Recommend a workflow based on project characteristics.
|
|
68
|
-
|
|
69
|
-
Args:
|
|
70
|
-
user_query: User's query or request (for fix-workflow detection)
|
|
71
|
-
file_count: Estimated number of files to change
|
|
72
|
-
scope_description: Description of the change scope
|
|
73
|
-
auto_load: Whether to automatically load the recommended workflow
|
|
74
|
-
|
|
75
|
-
Returns:
|
|
76
|
-
WorkflowRecommendation with recommendation details
|
|
77
|
-
"""
|
|
78
|
-
# Detect project characteristics
|
|
79
|
-
if user_query or file_count or scope_description:
|
|
80
|
-
characteristics = self.detector.detect_from_context(
|
|
81
|
-
user_query=user_query,
|
|
82
|
-
file_count=file_count,
|
|
83
|
-
scope_description=scope_description,
|
|
84
|
-
)
|
|
85
|
-
else:
|
|
86
|
-
characteristics = self.detector.detect()
|
|
87
|
-
|
|
88
|
-
# Get recommended workflow file
|
|
89
|
-
workflow_file = self.detector.get_recommended_workflow(characteristics)
|
|
90
|
-
|
|
91
|
-
# Find available workflows
|
|
92
|
-
available_workflows = self._find_available_workflows()
|
|
93
|
-
|
|
94
|
-
# Check if workflow file exists (separate from loading)
|
|
95
|
-
workflow_exists = False
|
|
96
|
-
workflow_path = None
|
|
97
|
-
if workflow_file:
|
|
98
|
-
# Check main workflows directory
|
|
99
|
-
workflow_path = self.workflows_dir / f"{workflow_file}.yaml"
|
|
100
|
-
workflow_exists = workflow_path.exists()
|
|
101
|
-
|
|
102
|
-
# Also check presets directory
|
|
103
|
-
if not workflow_exists:
|
|
104
|
-
presets_path = self.workflows_dir / "presets" / f"{workflow_file}.yaml"
|
|
105
|
-
workflow_exists = presets_path.exists()
|
|
106
|
-
if workflow_exists:
|
|
107
|
-
workflow_path = presets_path
|
|
108
|
-
|
|
109
|
-
# Load workflow if requested and found (Phase 5.2: Use cached workflow if available)
|
|
110
|
-
workflow = None
|
|
111
|
-
if auto_load and workflow_file and workflow_exists and workflow_path:
|
|
112
|
-
# Check cache first
|
|
113
|
-
workflow_name = workflow_path.stem
|
|
114
|
-
if workflow_name in self._workflow_cache:
|
|
115
|
-
cached_workflow, cached_error = self._workflow_cache[workflow_name]
|
|
116
|
-
if cached_error is None and cached_workflow is not None:
|
|
117
|
-
workflow = cached_workflow
|
|
118
|
-
else:
|
|
119
|
-
# Cached error, skip this workflow
|
|
120
|
-
logger.warning(f"Using cached validation result: {workflow_name} is invalid: {cached_error}")
|
|
121
|
-
else:
|
|
122
|
-
# Not in cache, parse and validate
|
|
123
|
-
try:
|
|
124
|
-
workflow = WorkflowParser.parse_file(workflow_path)
|
|
125
|
-
# Cache successful parse
|
|
126
|
-
self._workflow_cache[workflow_name] = (workflow, None)
|
|
127
|
-
except Exception as e:
|
|
128
|
-
error_msg = f"Failed to parse workflow {workflow_path}: {e}"
|
|
129
|
-
logger.warning(error_msg)
|
|
130
|
-
# Cache error
|
|
131
|
-
self._workflow_cache[workflow_name] = (None, error_msg)
|
|
132
|
-
# If recommended workflow doesn't exist or fails, try to find a similar one
|
|
133
|
-
workflow_file = self._find_best_match(
|
|
134
|
-
workflow_file, available_workflows
|
|
135
|
-
)
|
|
136
|
-
if workflow_file:
|
|
137
|
-
# Check both directories for best match
|
|
138
|
-
workflow_path = self.workflows_dir / f"{workflow_file}.yaml"
|
|
139
|
-
if not workflow_path.exists():
|
|
140
|
-
workflow_path = self.workflows_dir / "presets" / f"{workflow_file}.yaml"
|
|
141
|
-
if workflow_path.exists():
|
|
142
|
-
best_match_name = workflow_path.stem
|
|
143
|
-
# Check cache for best match
|
|
144
|
-
if best_match_name in self._workflow_cache:
|
|
145
|
-
cached_workflow, cached_error = self._workflow_cache[best_match_name]
|
|
146
|
-
if cached_error is None and cached_workflow is not None:
|
|
147
|
-
workflow = cached_workflow
|
|
148
|
-
else:
|
|
149
|
-
try:
|
|
150
|
-
workflow = WorkflowParser.parse_file(workflow_path)
|
|
151
|
-
# Cache successful parse
|
|
152
|
-
self._workflow_cache[best_match_name] = (workflow, None)
|
|
153
|
-
except Exception as e:
|
|
154
|
-
error_msg = f"Failed to parse best match workflow {workflow_path}: {e}"
|
|
155
|
-
logger.warning(error_msg)
|
|
156
|
-
self._workflow_cache[best_match_name] = (None, error_msg)
|
|
157
|
-
|
|
158
|
-
# Get alternative workflows
|
|
159
|
-
alternative_workflows = [w for w in available_workflows if w != workflow_file]
|
|
160
|
-
|
|
161
|
-
# Generate recommendation message
|
|
162
|
-
message = self._generate_message(
|
|
163
|
-
characteristics, workflow_file, workflow_exists
|
|
164
|
-
)
|
|
165
|
-
|
|
166
|
-
return WorkflowRecommendation(
|
|
167
|
-
workflow_file=workflow_file,
|
|
168
|
-
workflow=workflow,
|
|
169
|
-
track=characteristics.workflow_track,
|
|
170
|
-
confidence=characteristics.confidence,
|
|
171
|
-
characteristics=characteristics,
|
|
172
|
-
alternative_workflows=alternative_workflows,
|
|
173
|
-
message=message,
|
|
174
|
-
)
|
|
175
|
-
|
|
176
|
-
def _find_available_workflows(self) -> list[str]:
|
|
177
|
-
"""
|
|
178
|
-
Find all available workflow files in workflows/ and workflows/presets/.
|
|
179
|
-
|
|
180
|
-
Phase 5.2: Enhanced with YAML validation
|
|
181
|
-
"""
|
|
182
|
-
workflows = []
|
|
183
|
-
|
|
184
|
-
# Check main workflows directory
|
|
185
|
-
if self.workflows_dir.exists():
|
|
186
|
-
for workflow_file in self.workflows_dir.glob("*.yaml"):
|
|
187
|
-
if self._validate_workflow_file(workflow_file):
|
|
188
|
-
workflows.append(workflow_file.stem)
|
|
189
|
-
|
|
190
|
-
# Check presets subdirectory
|
|
191
|
-
presets_dir = self.workflows_dir / "presets"
|
|
192
|
-
if presets_dir.exists():
|
|
193
|
-
for workflow_file in presets_dir.glob("*.yaml"):
|
|
194
|
-
if workflow_file.stem not in workflows: # Avoid duplicates
|
|
195
|
-
if self._validate_workflow_file(workflow_file):
|
|
196
|
-
workflows.append(workflow_file.stem)
|
|
197
|
-
|
|
198
|
-
return workflows
|
|
199
|
-
|
|
200
|
-
def _validate_workflow_file(self, workflow_file: Path) -> bool:
|
|
201
|
-
"""
|
|
202
|
-
Validate a workflow YAML file.
|
|
203
|
-
|
|
204
|
-
Phase 5.2: YAML Validation
|
|
205
|
-
|
|
206
|
-
Args:
|
|
207
|
-
workflow_file: Path to workflow YAML file
|
|
208
|
-
|
|
209
|
-
Returns:
|
|
210
|
-
True if file is valid, False otherwise
|
|
211
|
-
"""
|
|
212
|
-
# Check cache first
|
|
213
|
-
workflow_name = workflow_file.stem
|
|
214
|
-
if workflow_name in self._workflow_cache:
|
|
215
|
-
cached_workflow, cached_error = self._workflow_cache[workflow_name]
|
|
216
|
-
if cached_error is None:
|
|
217
|
-
return True # Valid and cached
|
|
218
|
-
return False # Invalid and cached
|
|
219
|
-
|
|
220
|
-
try:
|
|
221
|
-
# Basic YAML validation (check if file can be parsed as YAML)
|
|
222
|
-
with open(workflow_file, encoding="utf-8") as f:
|
|
223
|
-
content = yaml.safe_load(f)
|
|
224
|
-
|
|
225
|
-
if not isinstance(content, dict):
|
|
226
|
-
error_msg = f"Workflow file must parse to a mapping/object: {workflow_file}"
|
|
227
|
-
logger.warning(error_msg)
|
|
228
|
-
self._workflow_cache[workflow_name] = (None, error_msg)
|
|
229
|
-
return False
|
|
230
|
-
|
|
231
|
-
# Try to parse workflow (this also validates schema via WorkflowParser)
|
|
232
|
-
try:
|
|
233
|
-
workflow = WorkflowParser.parse_file(workflow_file)
|
|
234
|
-
# Cache successful parse
|
|
235
|
-
self._workflow_cache[workflow_name] = (workflow, None)
|
|
236
|
-
return True
|
|
237
|
-
except Exception as parse_error:
|
|
238
|
-
error_msg = f"Workflow parsing failed for {workflow_file}: {parse_error}"
|
|
239
|
-
logger.warning(error_msg)
|
|
240
|
-
self._workflow_cache[workflow_name] = (None, error_msg)
|
|
241
|
-
return False
|
|
242
|
-
|
|
243
|
-
except yaml.YAMLError as e:
|
|
244
|
-
error_msg = f"Invalid YAML in {workflow_file}: {e}"
|
|
245
|
-
logger.warning(error_msg)
|
|
246
|
-
self._workflow_cache[workflow_name] = (None, error_msg)
|
|
247
|
-
return False
|
|
248
|
-
except Exception as e:
|
|
249
|
-
error_msg = f"Error validating workflow file {workflow_file}: {e}"
|
|
250
|
-
logger.warning(error_msg)
|
|
251
|
-
self._workflow_cache[workflow_name] = (None, error_msg)
|
|
252
|
-
return False
|
|
253
|
-
|
|
254
|
-
def _find_best_match(self, preferred: str, available: list[str]) -> str | None:
|
|
255
|
-
"""
|
|
256
|
-
Find best matching workflow from available workflows, including preset aliases.
|
|
257
|
-
|
|
258
|
-
Phase 5.2: Enhanced preset alias support
|
|
259
|
-
"""
|
|
260
|
-
if not available:
|
|
261
|
-
return None
|
|
262
|
-
|
|
263
|
-
# Try exact match first
|
|
264
|
-
if preferred in available:
|
|
265
|
-
return preferred
|
|
266
|
-
|
|
267
|
-
# Check preset aliases if no match found (Phase 5.2: Better alias support)
|
|
268
|
-
try:
|
|
269
|
-
from .preset_loader import PRESET_ALIASES
|
|
270
|
-
|
|
271
|
-
# Normalize preferred to lowercase for case-insensitive matching
|
|
272
|
-
preferred_lower = preferred.lower()
|
|
273
|
-
|
|
274
|
-
# Check if preferred is an alias (case-insensitive)
|
|
275
|
-
for alias, preset_name in PRESET_ALIASES.items():
|
|
276
|
-
if alias.lower() == preferred_lower:
|
|
277
|
-
if preset_name in available:
|
|
278
|
-
return preset_name
|
|
279
|
-
|
|
280
|
-
# Reverse lookup: check if any available workflow has preferred as alias
|
|
281
|
-
for workflow in available:
|
|
282
|
-
if workflow in PRESET_ALIASES.values():
|
|
283
|
-
# Find aliases for this workflow
|
|
284
|
-
aliases = [k for k, v in PRESET_ALIASES.items() if v == workflow]
|
|
285
|
-
if any(alias.lower() == preferred_lower for alias in aliases):
|
|
286
|
-
return workflow
|
|
287
|
-
except ImportError:
|
|
288
|
-
# If preset_loader not available, continue with normal matching
|
|
289
|
-
logger.warning("preset_loader not available, alias matching disabled")
|
|
290
|
-
pass
|
|
291
|
-
|
|
292
|
-
# Try partial match
|
|
293
|
-
preferred_lower = preferred.lower()
|
|
294
|
-
for workflow in available:
|
|
295
|
-
if (
|
|
296
|
-
preferred_lower in workflow.lower()
|
|
297
|
-
or workflow.lower() in preferred_lower
|
|
298
|
-
):
|
|
299
|
-
return workflow
|
|
300
|
-
|
|
301
|
-
# Return first available as fallback
|
|
302
|
-
return available[0] if available else None
|
|
303
|
-
|
|
304
|
-
def _generate_message(
|
|
305
|
-
self,
|
|
306
|
-
characteristics: ProjectCharacteristics,
|
|
307
|
-
workflow_file: str | None,
|
|
308
|
-
workflow_exists: bool,
|
|
309
|
-
) -> str:
|
|
310
|
-
"""Generate human-readable recommendation message."""
|
|
311
|
-
track_emojis = {
|
|
312
|
-
WorkflowTrack.QUICK_FLOW: "⚡",
|
|
313
|
-
WorkflowTrack.BMAD_METHOD: "📋",
|
|
314
|
-
WorkflowTrack.ENTERPRISE: "🏢",
|
|
315
|
-
}
|
|
316
|
-
|
|
317
|
-
track_names = {
|
|
318
|
-
WorkflowTrack.QUICK_FLOW: "Quick Flow",
|
|
319
|
-
WorkflowTrack.BMAD_METHOD: "BMad Method",
|
|
320
|
-
WorkflowTrack.ENTERPRISE: "Enterprise",
|
|
321
|
-
}
|
|
322
|
-
|
|
323
|
-
emoji = track_emojis.get(characteristics.workflow_track, "📋")
|
|
324
|
-
track_name = track_names.get(characteristics.workflow_track, "BMad Method")
|
|
325
|
-
|
|
326
|
-
parts = [
|
|
327
|
-
f"{emoji} **{track_name}** workflow recommended",
|
|
328
|
-
f"Confidence: {characteristics.confidence:.0%}",
|
|
329
|
-
f"Project Type: {characteristics.project_type.value}",
|
|
330
|
-
]
|
|
331
|
-
|
|
332
|
-
if workflow_file:
|
|
333
|
-
if workflow_exists:
|
|
334
|
-
parts.append(f"✅ Recommended: `{workflow_file}.yaml` (found)")
|
|
335
|
-
else:
|
|
336
|
-
parts.append(f"⚠️ Recommended: `{workflow_file}.yaml` (not found)")
|
|
337
|
-
|
|
338
|
-
if characteristics.recommendations:
|
|
339
|
-
parts.append("\nRecommendations:")
|
|
340
|
-
for rec in characteristics.recommendations:
|
|
341
|
-
parts.append(f" • {rec}")
|
|
342
|
-
|
|
343
|
-
return "\n".join(parts)
|
|
344
|
-
|
|
345
|
-
def _check_workflow_validity(self, workflow_path: Path) -> tuple[bool, str | None]:
|
|
346
|
-
"""
|
|
347
|
-
Check if workflow file is valid.
|
|
348
|
-
|
|
349
|
-
Returns:
|
|
350
|
-
Tuple of (is_valid, error_message)
|
|
351
|
-
"""
|
|
352
|
-
if not workflow_path.exists():
|
|
353
|
-
return False, "File does not exist"
|
|
354
|
-
|
|
355
|
-
try:
|
|
356
|
-
workflow = WorkflowParser.parse_file(workflow_path)
|
|
357
|
-
return True, None
|
|
358
|
-
except Exception as e:
|
|
359
|
-
return False, f"Invalid workflow file: {str(e)}"
|
|
360
|
-
|
|
361
|
-
def list_available_workflows(self) -> list[dict[str, str]]:
|
|
362
|
-
"""
|
|
363
|
-
List all available workflows with metadata.
|
|
364
|
-
|
|
365
|
-
Returns:
|
|
366
|
-
List of workflow information dictionaries
|
|
367
|
-
"""
|
|
368
|
-
workflows = []
|
|
369
|
-
for workflow_file in self.workflows_dir.glob("*.yaml"):
|
|
370
|
-
try:
|
|
371
|
-
workflow = WorkflowParser.parse_file(workflow_file)
|
|
372
|
-
workflows.append(
|
|
373
|
-
{
|
|
374
|
-
"file": workflow_file.name,
|
|
375
|
-
"id": workflow.id,
|
|
376
|
-
"name": workflow.name,
|
|
377
|
-
"type": workflow.type.value,
|
|
378
|
-
"description": workflow.description,
|
|
379
|
-
}
|
|
380
|
-
)
|
|
381
|
-
except Exception:
|
|
382
|
-
# Skip invalid workflows
|
|
383
|
-
logger.debug(
|
|
384
|
-
"Skipping invalid workflow file %s", workflow_file, exc_info=True
|
|
385
|
-
)
|
|
386
|
-
continue # nosec B112 - best-effort listing
|
|
387
|
-
return workflows
|
|
1
|
+
"""
|
|
2
|
+
Workflow Recommender - Recommend appropriate workflows based on project characteristics.
|
|
3
|
+
|
|
4
|
+
Phase 5.2: Enhanced with preset alias support, YAML validation, and caching
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import logging
|
|
8
|
+
from dataclasses import dataclass
|
|
9
|
+
from pathlib import Path
|
|
10
|
+
from typing import Any
|
|
11
|
+
|
|
12
|
+
import yaml
|
|
13
|
+
|
|
14
|
+
from .detector import ProjectCharacteristics, ProjectDetector, WorkflowTrack
|
|
15
|
+
from .models import Workflow
|
|
16
|
+
from .parser import WorkflowParser
|
|
17
|
+
|
|
18
|
+
logger = logging.getLogger(__name__)
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
@dataclass
|
|
22
|
+
class WorkflowRecommendation:
|
|
23
|
+
"""Workflow recommendation result."""
|
|
24
|
+
|
|
25
|
+
workflow_file: str | None
|
|
26
|
+
workflow: Workflow | None
|
|
27
|
+
track: WorkflowTrack
|
|
28
|
+
confidence: float
|
|
29
|
+
characteristics: ProjectCharacteristics
|
|
30
|
+
alternative_workflows: list[str]
|
|
31
|
+
message: str
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
class WorkflowRecommender:
|
|
35
|
+
"""
|
|
36
|
+
Recommend workflows based on project detection.
|
|
37
|
+
|
|
38
|
+
Phase 5.2: Enhanced with preset alias support, YAML validation, and caching
|
|
39
|
+
"""
|
|
40
|
+
|
|
41
|
+
def __init__(
|
|
42
|
+
self, project_root: Path | None = None, workflows_dir: Path | None = None
|
|
43
|
+
):
|
|
44
|
+
"""
|
|
45
|
+
Initialize workflow recommender.
|
|
46
|
+
|
|
47
|
+
Args:
|
|
48
|
+
project_root: Root directory of the project
|
|
49
|
+
workflows_dir: Directory containing workflow YAML files
|
|
50
|
+
"""
|
|
51
|
+
self.project_root = project_root or Path.cwd()
|
|
52
|
+
self.workflows_dir = workflows_dir or (self.project_root / "workflows")
|
|
53
|
+
self.detector = ProjectDetector(project_root)
|
|
54
|
+
|
|
55
|
+
# Phase 5.2: Cache for workflow file parsing
|
|
56
|
+
self._workflow_cache: dict[str, tuple[Workflow | None, str | None]] = {}
|
|
57
|
+
# Cache format: {workflow_name: (parsed_workflow, error_message)}
|
|
58
|
+
|
|
59
|
+
def recommend(
|
|
60
|
+
self,
|
|
61
|
+
user_query: str | None = None,
|
|
62
|
+
file_count: int | None = None,
|
|
63
|
+
scope_description: str | None = None,
|
|
64
|
+
auto_load: bool = True,
|
|
65
|
+
) -> WorkflowRecommendation:
|
|
66
|
+
"""
|
|
67
|
+
Recommend a workflow based on project characteristics.
|
|
68
|
+
|
|
69
|
+
Args:
|
|
70
|
+
user_query: User's query or request (for fix-workflow detection)
|
|
71
|
+
file_count: Estimated number of files to change
|
|
72
|
+
scope_description: Description of the change scope
|
|
73
|
+
auto_load: Whether to automatically load the recommended workflow
|
|
74
|
+
|
|
75
|
+
Returns:
|
|
76
|
+
WorkflowRecommendation with recommendation details
|
|
77
|
+
"""
|
|
78
|
+
# Detect project characteristics
|
|
79
|
+
if user_query or file_count or scope_description:
|
|
80
|
+
characteristics = self.detector.detect_from_context(
|
|
81
|
+
user_query=user_query,
|
|
82
|
+
file_count=file_count,
|
|
83
|
+
scope_description=scope_description,
|
|
84
|
+
)
|
|
85
|
+
else:
|
|
86
|
+
characteristics = self.detector.detect()
|
|
87
|
+
|
|
88
|
+
# Get recommended workflow file
|
|
89
|
+
workflow_file = self.detector.get_recommended_workflow(characteristics)
|
|
90
|
+
|
|
91
|
+
# Find available workflows
|
|
92
|
+
available_workflows = self._find_available_workflows()
|
|
93
|
+
|
|
94
|
+
# Check if workflow file exists (separate from loading)
|
|
95
|
+
workflow_exists = False
|
|
96
|
+
workflow_path = None
|
|
97
|
+
if workflow_file:
|
|
98
|
+
# Check main workflows directory
|
|
99
|
+
workflow_path = self.workflows_dir / f"{workflow_file}.yaml"
|
|
100
|
+
workflow_exists = workflow_path.exists()
|
|
101
|
+
|
|
102
|
+
# Also check presets directory
|
|
103
|
+
if not workflow_exists:
|
|
104
|
+
presets_path = self.workflows_dir / "presets" / f"{workflow_file}.yaml"
|
|
105
|
+
workflow_exists = presets_path.exists()
|
|
106
|
+
if workflow_exists:
|
|
107
|
+
workflow_path = presets_path
|
|
108
|
+
|
|
109
|
+
# Load workflow if requested and found (Phase 5.2: Use cached workflow if available)
|
|
110
|
+
workflow = None
|
|
111
|
+
if auto_load and workflow_file and workflow_exists and workflow_path:
|
|
112
|
+
# Check cache first
|
|
113
|
+
workflow_name = workflow_path.stem
|
|
114
|
+
if workflow_name in self._workflow_cache:
|
|
115
|
+
cached_workflow, cached_error = self._workflow_cache[workflow_name]
|
|
116
|
+
if cached_error is None and cached_workflow is not None:
|
|
117
|
+
workflow = cached_workflow
|
|
118
|
+
else:
|
|
119
|
+
# Cached error, skip this workflow
|
|
120
|
+
logger.warning(f"Using cached validation result: {workflow_name} is invalid: {cached_error}")
|
|
121
|
+
else:
|
|
122
|
+
# Not in cache, parse and validate
|
|
123
|
+
try:
|
|
124
|
+
workflow = WorkflowParser.parse_file(workflow_path)
|
|
125
|
+
# Cache successful parse
|
|
126
|
+
self._workflow_cache[workflow_name] = (workflow, None)
|
|
127
|
+
except Exception as e:
|
|
128
|
+
error_msg = f"Failed to parse workflow {workflow_path}: {e}"
|
|
129
|
+
logger.warning(error_msg)
|
|
130
|
+
# Cache error
|
|
131
|
+
self._workflow_cache[workflow_name] = (None, error_msg)
|
|
132
|
+
# If recommended workflow doesn't exist or fails, try to find a similar one
|
|
133
|
+
workflow_file = self._find_best_match(
|
|
134
|
+
workflow_file, available_workflows
|
|
135
|
+
)
|
|
136
|
+
if workflow_file:
|
|
137
|
+
# Check both directories for best match
|
|
138
|
+
workflow_path = self.workflows_dir / f"{workflow_file}.yaml"
|
|
139
|
+
if not workflow_path.exists():
|
|
140
|
+
workflow_path = self.workflows_dir / "presets" / f"{workflow_file}.yaml"
|
|
141
|
+
if workflow_path.exists():
|
|
142
|
+
best_match_name = workflow_path.stem
|
|
143
|
+
# Check cache for best match
|
|
144
|
+
if best_match_name in self._workflow_cache:
|
|
145
|
+
cached_workflow, cached_error = self._workflow_cache[best_match_name]
|
|
146
|
+
if cached_error is None and cached_workflow is not None:
|
|
147
|
+
workflow = cached_workflow
|
|
148
|
+
else:
|
|
149
|
+
try:
|
|
150
|
+
workflow = WorkflowParser.parse_file(workflow_path)
|
|
151
|
+
# Cache successful parse
|
|
152
|
+
self._workflow_cache[best_match_name] = (workflow, None)
|
|
153
|
+
except Exception as e:
|
|
154
|
+
error_msg = f"Failed to parse best match workflow {workflow_path}: {e}"
|
|
155
|
+
logger.warning(error_msg)
|
|
156
|
+
self._workflow_cache[best_match_name] = (None, error_msg)
|
|
157
|
+
|
|
158
|
+
# Get alternative workflows
|
|
159
|
+
alternative_workflows = [w for w in available_workflows if w != workflow_file]
|
|
160
|
+
|
|
161
|
+
# Generate recommendation message
|
|
162
|
+
message = self._generate_message(
|
|
163
|
+
characteristics, workflow_file, workflow_exists
|
|
164
|
+
)
|
|
165
|
+
|
|
166
|
+
return WorkflowRecommendation(
|
|
167
|
+
workflow_file=workflow_file,
|
|
168
|
+
workflow=workflow,
|
|
169
|
+
track=characteristics.workflow_track,
|
|
170
|
+
confidence=characteristics.confidence,
|
|
171
|
+
characteristics=characteristics,
|
|
172
|
+
alternative_workflows=alternative_workflows,
|
|
173
|
+
message=message,
|
|
174
|
+
)
|
|
175
|
+
|
|
176
|
+
def _find_available_workflows(self) -> list[str]:
|
|
177
|
+
"""
|
|
178
|
+
Find all available workflow files in workflows/ and workflows/presets/.
|
|
179
|
+
|
|
180
|
+
Phase 5.2: Enhanced with YAML validation
|
|
181
|
+
"""
|
|
182
|
+
workflows = []
|
|
183
|
+
|
|
184
|
+
# Check main workflows directory
|
|
185
|
+
if self.workflows_dir.exists():
|
|
186
|
+
for workflow_file in self.workflows_dir.glob("*.yaml"):
|
|
187
|
+
if self._validate_workflow_file(workflow_file):
|
|
188
|
+
workflows.append(workflow_file.stem)
|
|
189
|
+
|
|
190
|
+
# Check presets subdirectory
|
|
191
|
+
presets_dir = self.workflows_dir / "presets"
|
|
192
|
+
if presets_dir.exists():
|
|
193
|
+
for workflow_file in presets_dir.glob("*.yaml"):
|
|
194
|
+
if workflow_file.stem not in workflows: # Avoid duplicates
|
|
195
|
+
if self._validate_workflow_file(workflow_file):
|
|
196
|
+
workflows.append(workflow_file.stem)
|
|
197
|
+
|
|
198
|
+
return workflows
|
|
199
|
+
|
|
200
|
+
def _validate_workflow_file(self, workflow_file: Path) -> bool:
|
|
201
|
+
"""
|
|
202
|
+
Validate a workflow YAML file.
|
|
203
|
+
|
|
204
|
+
Phase 5.2: YAML Validation
|
|
205
|
+
|
|
206
|
+
Args:
|
|
207
|
+
workflow_file: Path to workflow YAML file
|
|
208
|
+
|
|
209
|
+
Returns:
|
|
210
|
+
True if file is valid, False otherwise
|
|
211
|
+
"""
|
|
212
|
+
# Check cache first
|
|
213
|
+
workflow_name = workflow_file.stem
|
|
214
|
+
if workflow_name in self._workflow_cache:
|
|
215
|
+
cached_workflow, cached_error = self._workflow_cache[workflow_name]
|
|
216
|
+
if cached_error is None:
|
|
217
|
+
return True # Valid and cached
|
|
218
|
+
return False # Invalid and cached
|
|
219
|
+
|
|
220
|
+
try:
|
|
221
|
+
# Basic YAML validation (check if file can be parsed as YAML)
|
|
222
|
+
with open(workflow_file, encoding="utf-8") as f:
|
|
223
|
+
content = yaml.safe_load(f)
|
|
224
|
+
|
|
225
|
+
if not isinstance(content, dict):
|
|
226
|
+
error_msg = f"Workflow file must parse to a mapping/object: {workflow_file}"
|
|
227
|
+
logger.warning(error_msg)
|
|
228
|
+
self._workflow_cache[workflow_name] = (None, error_msg)
|
|
229
|
+
return False
|
|
230
|
+
|
|
231
|
+
# Try to parse workflow (this also validates schema via WorkflowParser)
|
|
232
|
+
try:
|
|
233
|
+
workflow = WorkflowParser.parse_file(workflow_file)
|
|
234
|
+
# Cache successful parse
|
|
235
|
+
self._workflow_cache[workflow_name] = (workflow, None)
|
|
236
|
+
return True
|
|
237
|
+
except Exception as parse_error:
|
|
238
|
+
error_msg = f"Workflow parsing failed for {workflow_file}: {parse_error}"
|
|
239
|
+
logger.warning(error_msg)
|
|
240
|
+
self._workflow_cache[workflow_name] = (None, error_msg)
|
|
241
|
+
return False
|
|
242
|
+
|
|
243
|
+
except yaml.YAMLError as e:
|
|
244
|
+
error_msg = f"Invalid YAML in {workflow_file}: {e}"
|
|
245
|
+
logger.warning(error_msg)
|
|
246
|
+
self._workflow_cache[workflow_name] = (None, error_msg)
|
|
247
|
+
return False
|
|
248
|
+
except Exception as e:
|
|
249
|
+
error_msg = f"Error validating workflow file {workflow_file}: {e}"
|
|
250
|
+
logger.warning(error_msg)
|
|
251
|
+
self._workflow_cache[workflow_name] = (None, error_msg)
|
|
252
|
+
return False
|
|
253
|
+
|
|
254
|
+
def _find_best_match(self, preferred: str, available: list[str]) -> str | None:
|
|
255
|
+
"""
|
|
256
|
+
Find best matching workflow from available workflows, including preset aliases.
|
|
257
|
+
|
|
258
|
+
Phase 5.2: Enhanced preset alias support
|
|
259
|
+
"""
|
|
260
|
+
if not available:
|
|
261
|
+
return None
|
|
262
|
+
|
|
263
|
+
# Try exact match first
|
|
264
|
+
if preferred in available:
|
|
265
|
+
return preferred
|
|
266
|
+
|
|
267
|
+
# Check preset aliases if no match found (Phase 5.2: Better alias support)
|
|
268
|
+
try:
|
|
269
|
+
from .preset_loader import PRESET_ALIASES
|
|
270
|
+
|
|
271
|
+
# Normalize preferred to lowercase for case-insensitive matching
|
|
272
|
+
preferred_lower = preferred.lower()
|
|
273
|
+
|
|
274
|
+
# Check if preferred is an alias (case-insensitive)
|
|
275
|
+
for alias, preset_name in PRESET_ALIASES.items():
|
|
276
|
+
if alias.lower() == preferred_lower:
|
|
277
|
+
if preset_name in available:
|
|
278
|
+
return preset_name
|
|
279
|
+
|
|
280
|
+
# Reverse lookup: check if any available workflow has preferred as alias
|
|
281
|
+
for workflow in available:
|
|
282
|
+
if workflow in PRESET_ALIASES.values():
|
|
283
|
+
# Find aliases for this workflow
|
|
284
|
+
aliases = [k for k, v in PRESET_ALIASES.items() if v == workflow]
|
|
285
|
+
if any(alias.lower() == preferred_lower for alias in aliases):
|
|
286
|
+
return workflow
|
|
287
|
+
except ImportError:
|
|
288
|
+
# If preset_loader not available, continue with normal matching
|
|
289
|
+
logger.warning("preset_loader not available, alias matching disabled")
|
|
290
|
+
pass
|
|
291
|
+
|
|
292
|
+
# Try partial match
|
|
293
|
+
preferred_lower = preferred.lower()
|
|
294
|
+
for workflow in available:
|
|
295
|
+
if (
|
|
296
|
+
preferred_lower in workflow.lower()
|
|
297
|
+
or workflow.lower() in preferred_lower
|
|
298
|
+
):
|
|
299
|
+
return workflow
|
|
300
|
+
|
|
301
|
+
# Return first available as fallback
|
|
302
|
+
return available[0] if available else None
|
|
303
|
+
|
|
304
|
+
def _generate_message(
|
|
305
|
+
self,
|
|
306
|
+
characteristics: ProjectCharacteristics,
|
|
307
|
+
workflow_file: str | None,
|
|
308
|
+
workflow_exists: bool,
|
|
309
|
+
) -> str:
|
|
310
|
+
"""Generate human-readable recommendation message."""
|
|
311
|
+
track_emojis = {
|
|
312
|
+
WorkflowTrack.QUICK_FLOW: "⚡",
|
|
313
|
+
WorkflowTrack.BMAD_METHOD: "📋",
|
|
314
|
+
WorkflowTrack.ENTERPRISE: "🏢",
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
track_names = {
|
|
318
|
+
WorkflowTrack.QUICK_FLOW: "Quick Flow",
|
|
319
|
+
WorkflowTrack.BMAD_METHOD: "BMad Method",
|
|
320
|
+
WorkflowTrack.ENTERPRISE: "Enterprise",
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
emoji = track_emojis.get(characteristics.workflow_track, "📋")
|
|
324
|
+
track_name = track_names.get(characteristics.workflow_track, "BMad Method")
|
|
325
|
+
|
|
326
|
+
parts = [
|
|
327
|
+
f"{emoji} **{track_name}** workflow recommended",
|
|
328
|
+
f"Confidence: {characteristics.confidence:.0%}",
|
|
329
|
+
f"Project Type: {characteristics.project_type.value}",
|
|
330
|
+
]
|
|
331
|
+
|
|
332
|
+
if workflow_file:
|
|
333
|
+
if workflow_exists:
|
|
334
|
+
parts.append(f"✅ Recommended: `{workflow_file}.yaml` (found)")
|
|
335
|
+
else:
|
|
336
|
+
parts.append(f"⚠️ Recommended: `{workflow_file}.yaml` (not found)")
|
|
337
|
+
|
|
338
|
+
if characteristics.recommendations:
|
|
339
|
+
parts.append("\nRecommendations:")
|
|
340
|
+
for rec in characteristics.recommendations:
|
|
341
|
+
parts.append(f" • {rec}")
|
|
342
|
+
|
|
343
|
+
return "\n".join(parts)
|
|
344
|
+
|
|
345
|
+
def _check_workflow_validity(self, workflow_path: Path) -> tuple[bool, str | None]:
|
|
346
|
+
"""
|
|
347
|
+
Check if workflow file is valid.
|
|
348
|
+
|
|
349
|
+
Returns:
|
|
350
|
+
Tuple of (is_valid, error_message)
|
|
351
|
+
"""
|
|
352
|
+
if not workflow_path.exists():
|
|
353
|
+
return False, "File does not exist"
|
|
354
|
+
|
|
355
|
+
try:
|
|
356
|
+
workflow = WorkflowParser.parse_file(workflow_path)
|
|
357
|
+
return True, None
|
|
358
|
+
except Exception as e:
|
|
359
|
+
return False, f"Invalid workflow file: {str(e)}"
|
|
360
|
+
|
|
361
|
+
def list_available_workflows(self) -> list[dict[str, str]]:
|
|
362
|
+
"""
|
|
363
|
+
List all available workflows with metadata.
|
|
364
|
+
|
|
365
|
+
Returns:
|
|
366
|
+
List of workflow information dictionaries
|
|
367
|
+
"""
|
|
368
|
+
workflows = []
|
|
369
|
+
for workflow_file in self.workflows_dir.glob("*.yaml"):
|
|
370
|
+
try:
|
|
371
|
+
workflow = WorkflowParser.parse_file(workflow_file)
|
|
372
|
+
workflows.append(
|
|
373
|
+
{
|
|
374
|
+
"file": workflow_file.name,
|
|
375
|
+
"id": workflow.id,
|
|
376
|
+
"name": workflow.name,
|
|
377
|
+
"type": workflow.type.value,
|
|
378
|
+
"description": workflow.description,
|
|
379
|
+
}
|
|
380
|
+
)
|
|
381
|
+
except Exception:
|
|
382
|
+
# Skip invalid workflows
|
|
383
|
+
logger.debug(
|
|
384
|
+
"Skipping invalid workflow file %s", workflow_file, exc_info=True
|
|
385
|
+
)
|
|
386
|
+
continue # nosec B112 - best-effort listing
|
|
387
|
+
return workflows
|