tapps-agents 3.5.41__py3-none-any.whl ā 3.6.0__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/scoring.py +1566 -1566
- tapps_agents/agents/reviewer/service_discovery.py +534 -534
- tapps_agents/agents/reviewer/tools/__init__.py +41 -41
- 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/health.py +665 -665
- 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/commands/top_level.py +3586 -3586
- 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/artifact_context_builder.py +293 -0
- 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/config.py +33 -0
- 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.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/orchestrator.py +271 -271
- 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/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/base.py +185 -185
- 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/build_orchestrator.py +2700 -2667
- 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/fix_orchestrator.py +723 -723
- 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_executor.py +2337 -2337
- 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/message_formatter.py +188 -188
- 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.5.41.dist-info ā tapps_agents-3.6.0.dist-info}/METADATA +672 -672
- tapps_agents-3.6.0.dist-info/RECORD +758 -0
- {tapps_agents-3.5.41.dist-info ā tapps_agents-3.6.0.dist-info}/licenses/LICENSE +22 -22
- tapps_agents/health/checks/outcomes.backup_20260204_064058.py +0 -324
- tapps_agents/health/checks/outcomes.backup_20260204_064256.py +0 -324
- tapps_agents/health/checks/outcomes.backup_20260204_064600.py +0 -324
- tapps_agents-3.5.41.dist-info/RECORD +0 -760
- {tapps_agents-3.5.41.dist-info ā tapps_agents-3.6.0.dist-info}/WHEEL +0 -0
- {tapps_agents-3.5.41.dist-info ā tapps_agents-3.6.0.dist-info}/entry_points.txt +0 -0
- {tapps_agents-3.5.41.dist-info ā tapps_agents-3.6.0.dist-info}/top_level.txt +0 -0
|
@@ -1,700 +1,700 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Natural Language Handler - Process natural language commands for Simple Mode.
|
|
3
|
-
|
|
4
|
-
Intercepts natural language commands, parses them, and routes to appropriate orchestrators.
|
|
5
|
-
Works both in CLI mode and Cursor Skills mode. Includes workflow mismatch detection to prevent
|
|
6
|
-
users from running inappropriate workflows.
|
|
7
|
-
"""
|
|
8
|
-
|
|
9
|
-
# @ai-prime-directive: This file implements the Simple Mode natural language handler.
|
|
10
|
-
# Simple Mode is the primary user interface for TappsCodingAgents, providing natural language
|
|
11
|
-
# orchestration of multiple specialized skills. Do not modify the intent parsing or orchestrator
|
|
12
|
-
# routing without updating Simple Mode documentation and tests.
|
|
13
|
-
|
|
14
|
-
# @ai-constraints:
|
|
15
|
-
# - Must maintain backward compatibility with existing Simple Mode commands
|
|
16
|
-
# - Intent detection must support both explicit commands (*build) and natural language
|
|
17
|
-
# - Workflow enforcement is mandatory - do not bypass workflow steps
|
|
18
|
-
# - Performance: Intent parsing must complete in <50ms, validation <500ms
|
|
19
|
-
|
|
20
|
-
# @note[2026-01-30]: Added workflow mismatch detection to warn users when workflow choice
|
|
21
|
-
# doesn't match task characteristics. See docs/archive/feedback/WORKFLOW_AUTO_DETECTION_FAILURE_INIT_VALIDATION.md
|
|
22
|
-
|
|
23
|
-
import logging
|
|
24
|
-
from dataclasses import dataclass
|
|
25
|
-
from pathlib import Path
|
|
26
|
-
from typing import Any, Literal
|
|
27
|
-
|
|
28
|
-
from tapps_agents.core.config import ProjectConfig, load_config
|
|
29
|
-
|
|
30
|
-
from .intent_parser import Intent, IntentParser, IntentType
|
|
31
|
-
from .orchestrators import (
|
|
32
|
-
BreakdownOrchestrator,
|
|
33
|
-
BrownfieldOrchestrator,
|
|
34
|
-
BuildOrchestrator,
|
|
35
|
-
EnhanceOrchestrator,
|
|
36
|
-
EpicOrchestrator,
|
|
37
|
-
ExploreOrchestrator,
|
|
38
|
-
FixOrchestrator,
|
|
39
|
-
PlanAnalysisOrchestrator,
|
|
40
|
-
PROrchestrator,
|
|
41
|
-
RefactorOrchestrator,
|
|
42
|
-
ReviewOrchestrator,
|
|
43
|
-
TestOrchestrator,
|
|
44
|
-
TodoOrchestrator,
|
|
45
|
-
ValidateOrchestrator,
|
|
46
|
-
)
|
|
47
|
-
from .prompt_analyzer import PromptAnalysis, PromptAnalyzer
|
|
48
|
-
from .variations import normalize_command
|
|
49
|
-
from .workflow_suggester import (
|
|
50
|
-
COMPLEXITY_ORDER,
|
|
51
|
-
SCOPE_ORDER,
|
|
52
|
-
WORKFLOW_REQUIREMENTS,
|
|
53
|
-
WorkflowSuggester,
|
|
54
|
-
detect_primary_intent,
|
|
55
|
-
)
|
|
56
|
-
|
|
57
|
-
# Initialize logger
|
|
58
|
-
logger = logging.getLogger(__name__)
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
# ============================================================================
|
|
62
|
-
# Workflow Mismatch Warning Data Model
|
|
63
|
-
# ============================================================================
|
|
64
|
-
|
|
65
|
-
@dataclass(frozen=True)
|
|
66
|
-
class WorkflowMismatchWarning:
|
|
67
|
-
"""
|
|
68
|
-
Warning data for workflow mismatch detection.
|
|
69
|
-
|
|
70
|
-
Represents a detected mismatch between user-specified workflow and task
|
|
71
|
-
characteristics, providing actionable recommendations and impact estimates.
|
|
72
|
-
|
|
73
|
-
Attributes:
|
|
74
|
-
detected_intent: Primary intent detected from prompt
|
|
75
|
-
Values: "bug_fix" | "feature" | "enhancement" | "architectural" | "framework_dev"
|
|
76
|
-
detected_scope: Task scope (files affected)
|
|
77
|
-
Values: "low" (1-3 files) | "medium" (4-6 files) | "high" (7+ files)
|
|
78
|
-
detected_complexity: Task complexity (architectural impact)
|
|
79
|
-
Values: "low" | "medium" | "high"
|
|
80
|
-
recommended_workflow: Suggested workflow for this task
|
|
81
|
-
Values: "*fix" | "*build" | "*full" | "*refactor"
|
|
82
|
-
confidence: Confidence in recommendation (0.7-1.0)
|
|
83
|
-
reason: Human-readable explanation for recommendation
|
|
84
|
-
token_savings: Estimated tokens saved by switching workflows
|
|
85
|
-
time_savings: Estimated minutes saved by switching workflows
|
|
86
|
-
|
|
87
|
-
Immutability:
|
|
88
|
-
frozen=True ensures warning data cannot be modified after creation
|
|
89
|
-
"""
|
|
90
|
-
|
|
91
|
-
detected_intent: str
|
|
92
|
-
detected_scope: str
|
|
93
|
-
detected_complexity: str
|
|
94
|
-
recommended_workflow: str
|
|
95
|
-
confidence: float
|
|
96
|
-
reason: str
|
|
97
|
-
token_savings: int
|
|
98
|
-
time_savings: int
|
|
99
|
-
|
|
100
|
-
def format_warning(self) -> str:
|
|
101
|
-
"""
|
|
102
|
-
Format warning for terminal display.
|
|
103
|
-
|
|
104
|
-
Returns:
|
|
105
|
-
Formatted warning message with visual hierarchy (emoji, structure)
|
|
106
|
-
"""
|
|
107
|
-
return f"""ā ļø Workflow Mismatch Warning
|
|
108
|
-
|
|
109
|
-
Task Analysis:
|
|
110
|
-
- Primary Intent: {self.detected_intent} (confidence: {self.confidence:.0%})
|
|
111
|
-
- Scope: {self.detected_scope}
|
|
112
|
-
- Complexity: {self.detected_complexity}
|
|
113
|
-
|
|
114
|
-
{self.reason}
|
|
115
|
-
|
|
116
|
-
Recommended: {self.recommended_workflow}
|
|
117
|
-
Token Savings: ~{self.token_savings // 1000}K tokens, ~{self.time_savings} minutes"""
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
# ============================================================================
|
|
121
|
-
# Simple Mode Handler
|
|
122
|
-
# ============================================================================
|
|
123
|
-
|
|
124
|
-
class SimpleModeHandler:
|
|
125
|
-
"""Handler for natural language commands in Simple Mode."""
|
|
126
|
-
|
|
127
|
-
def __init__(
|
|
128
|
-
self,
|
|
129
|
-
project_root: Path | None = None,
|
|
130
|
-
config: ProjectConfig | None = None,
|
|
131
|
-
):
|
|
132
|
-
"""
|
|
133
|
-
Initialize Simple Mode handler.
|
|
134
|
-
|
|
135
|
-
Args:
|
|
136
|
-
project_root: Project root directory
|
|
137
|
-
config: Optional project configuration
|
|
138
|
-
"""
|
|
139
|
-
self.project_root = project_root or Path.cwd()
|
|
140
|
-
self.config = config or load_config()
|
|
141
|
-
self.intent_parser = IntentParser()
|
|
142
|
-
self.workflow_suggester = WorkflowSuggester()
|
|
143
|
-
self.prompt_analyzer = PromptAnalyzer()
|
|
144
|
-
|
|
145
|
-
# Initialize orchestrators
|
|
146
|
-
self.orchestrators = {
|
|
147
|
-
IntentType.BUILD: BuildOrchestrator(
|
|
148
|
-
project_root=self.project_root, config=self.config
|
|
149
|
-
),
|
|
150
|
-
IntentType.VALIDATE: ValidateOrchestrator(
|
|
151
|
-
project_root=self.project_root, config=self.config
|
|
152
|
-
),
|
|
153
|
-
IntentType.REVIEW: ReviewOrchestrator(
|
|
154
|
-
project_root=self.project_root, config=self.config
|
|
155
|
-
),
|
|
156
|
-
IntentType.FIX: FixOrchestrator(
|
|
157
|
-
project_root=self.project_root, config=self.config
|
|
158
|
-
),
|
|
159
|
-
IntentType.TEST: TestOrchestrator(
|
|
160
|
-
project_root=self.project_root, config=self.config
|
|
161
|
-
),
|
|
162
|
-
IntentType.EPIC: EpicOrchestrator(
|
|
163
|
-
project_root=self.project_root, config=self.config
|
|
164
|
-
),
|
|
165
|
-
IntentType.EXPLORE: ExploreOrchestrator(
|
|
166
|
-
project_root=self.project_root, config=self.config
|
|
167
|
-
),
|
|
168
|
-
IntentType.REFACTOR: RefactorOrchestrator(
|
|
169
|
-
project_root=self.project_root, config=self.config
|
|
170
|
-
),
|
|
171
|
-
IntentType.PLAN_ANALYSIS: PlanAnalysisOrchestrator(
|
|
172
|
-
project_root=self.project_root, config=self.config
|
|
173
|
-
),
|
|
174
|
-
IntentType.PR: PROrchestrator(
|
|
175
|
-
project_root=self.project_root, config=self.config
|
|
176
|
-
),
|
|
177
|
-
IntentType.BROWNFIELD: BrownfieldOrchestrator(
|
|
178
|
-
project_root=self.project_root, config=self.config
|
|
179
|
-
),
|
|
180
|
-
IntentType.ENHANCE: EnhanceOrchestrator(
|
|
181
|
-
project_root=self.project_root, config=self.config
|
|
182
|
-
),
|
|
183
|
-
IntentType.BREAKDOWN: BreakdownOrchestrator(
|
|
184
|
-
project_root=self.project_root, config=self.config
|
|
185
|
-
),
|
|
186
|
-
IntentType.TODO: TodoOrchestrator(
|
|
187
|
-
project_root=self.project_root, config=self.config
|
|
188
|
-
),
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
async def handle(self, command: str, suggest_workflow: bool = True) -> dict[str, Any]:
|
|
192
|
-
"""
|
|
193
|
-
Handle a natural language command.
|
|
194
|
-
|
|
195
|
-
Enhanced to detect and force Simple Mode when requested.
|
|
196
|
-
Includes workflow mismatch detection to warn users before execution.
|
|
197
|
-
|
|
198
|
-
Args:
|
|
199
|
-
command: User's natural language command
|
|
200
|
-
suggest_workflow: Whether to suggest workflow if not already using Simple Mode
|
|
201
|
-
|
|
202
|
-
Returns:
|
|
203
|
-
Dictionary with execution results
|
|
204
|
-
"""
|
|
205
|
-
# Check for Simple Mode intent first
|
|
206
|
-
if self.intent_parser.detect_simple_mode_intent(command):
|
|
207
|
-
# Force Simple Mode workflow
|
|
208
|
-
if not self.config.simple_mode.enabled:
|
|
209
|
-
return {
|
|
210
|
-
"success": False,
|
|
211
|
-
"error": "Simple Mode requested but not available. Install with: `tapps-agents init`",
|
|
212
|
-
"suggestion": "Run: tapps-agents simple-mode on",
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
# Normalize command (expand synonyms)
|
|
216
|
-
normalized = normalize_command(command)
|
|
217
|
-
|
|
218
|
-
# Parse intent
|
|
219
|
-
intent = self.intent_parser.parse(normalized)
|
|
220
|
-
|
|
221
|
-
# Analyze prompt for intelligent workflow selection
|
|
222
|
-
analysis = self._analyze_prompt(command, intent)
|
|
223
|
-
|
|
224
|
-
# Suggest workflow if enabled and not already using Simple Mode
|
|
225
|
-
if suggest_workflow and not self.intent_parser.detect_simple_mode_intent(command):
|
|
226
|
-
suggestion = self.workflow_suggester.suggest_workflow(command)
|
|
227
|
-
if suggestion and self.workflow_suggester.should_suggest(command):
|
|
228
|
-
return {
|
|
229
|
-
"success": False,
|
|
230
|
-
"suggestion": True,
|
|
231
|
-
"workflow_suggestion": {
|
|
232
|
-
"command": suggestion.workflow_command,
|
|
233
|
-
"type": suggestion.workflow_type,
|
|
234
|
-
"benefits": suggestion.benefits,
|
|
235
|
-
"reason": suggestion.reason,
|
|
236
|
-
"confidence": suggestion.confidence,
|
|
237
|
-
"formatted": self.workflow_suggester.format_suggestion(suggestion),
|
|
238
|
-
},
|
|
239
|
-
"message": "Workflow suggestion available",
|
|
240
|
-
}
|
|
241
|
-
|
|
242
|
-
# Check if Simple Mode is enabled (or forced)
|
|
243
|
-
force_simple_mode = intent.parameters.get("force_simple_mode", False)
|
|
244
|
-
if force_simple_mode and not self.config.simple_mode.enabled:
|
|
245
|
-
return {
|
|
246
|
-
"success": False,
|
|
247
|
-
"error": "Simple Mode requested but not available. Install with: `tapps-agents init`",
|
|
248
|
-
"suggestion": "Run: tapps-agents simple-mode on",
|
|
249
|
-
}
|
|
250
|
-
|
|
251
|
-
if not self.config.simple_mode.enabled and not force_simple_mode:
|
|
252
|
-
return {
|
|
253
|
-
"success": False,
|
|
254
|
-
"error": "Simple Mode is disabled. Enable it in .tapps-agents/config.yaml",
|
|
255
|
-
}
|
|
256
|
-
|
|
257
|
-
# Route to appropriate orchestrator
|
|
258
|
-
orchestrator = self.orchestrators.get(intent.type)
|
|
259
|
-
if not orchestrator:
|
|
260
|
-
return {
|
|
261
|
-
"success": False,
|
|
262
|
-
"error": f"Unknown intent type: {intent.type}. Try: build, review, fix, or test",
|
|
263
|
-
"intent": intent.type.value,
|
|
264
|
-
"confidence": intent.confidence,
|
|
265
|
-
}
|
|
266
|
-
|
|
267
|
-
# [NEW] Workflow mismatch detection
|
|
268
|
-
# Extract workflow name and check for --force flag
|
|
269
|
-
workflow = f"*{intent.type.value}" if intent.type else None
|
|
270
|
-
force_validation = intent.parameters.get("force", False)
|
|
271
|
-
|
|
272
|
-
if workflow:
|
|
273
|
-
warning = self.validate_workflow_match(workflow, command, force_validation)
|
|
274
|
-
|
|
275
|
-
if warning:
|
|
276
|
-
# Display warning to user
|
|
277
|
-
self._display_mismatch_warning(warning, workflow)
|
|
278
|
-
|
|
279
|
-
# Prompt for user choice (unless auto mode)
|
|
280
|
-
auto_mode = intent.parameters.get("auto", False)
|
|
281
|
-
|
|
282
|
-
if auto_mode:
|
|
283
|
-
choice = "N" # Default to cancel in auto mode
|
|
284
|
-
logger.info(f"Auto mode: defaulting to 'N' for workflow mismatch")
|
|
285
|
-
else:
|
|
286
|
-
choice = self._prompt_user_choice(warning, workflow)
|
|
287
|
-
|
|
288
|
-
# Handle user choice
|
|
289
|
-
if choice == "N":
|
|
290
|
-
logger.info(f"User declined workflow: {workflow}")
|
|
291
|
-
return {
|
|
292
|
-
"success": False,
|
|
293
|
-
"status": "cancelled",
|
|
294
|
-
"reason": "User declined due to workflow mismatch",
|
|
295
|
-
"warning": {
|
|
296
|
-
"detected_intent": warning.detected_intent,
|
|
297
|
-
"recommended_workflow": warning.recommended_workflow,
|
|
298
|
-
"confidence": warning.confidence,
|
|
299
|
-
},
|
|
300
|
-
}
|
|
301
|
-
elif choice == "switch":
|
|
302
|
-
# Switch to recommended workflow
|
|
303
|
-
logger.info(f"User switched from {workflow} to {warning.recommended_workflow}")
|
|
304
|
-
# Update intent type to match recommended workflow
|
|
305
|
-
recommended_intent_type = self._workflow_to_intent_type(warning.recommended_workflow)
|
|
306
|
-
if recommended_intent_type:
|
|
307
|
-
intent.type = recommended_intent_type
|
|
308
|
-
orchestrator = self.orchestrators.get(intent.type)
|
|
309
|
-
elif choice == "y":
|
|
310
|
-
logger.info(f"User proceeded with {workflow} despite mismatch warning")
|
|
311
|
-
|
|
312
|
-
# Check for workflow mismatch and suggest better approach (legacy)
|
|
313
|
-
if intent.type.value == "build" and analysis.recommended_workflow == "validate":
|
|
314
|
-
if analysis.intent_confidence >= 0.80:
|
|
315
|
-
# High confidence - show suggestion
|
|
316
|
-
suggestion = self._generate_workflow_suggestion(analysis, f"*{intent.type.value}")
|
|
317
|
-
print(suggestion)
|
|
318
|
-
print(f"\nā
Auto-switching to *{analysis.recommended_workflow} workflow (confidence: {analysis.intent_confidence:.0%})\n")
|
|
319
|
-
|
|
320
|
-
# Pass analysis to orchestrator via parameters
|
|
321
|
-
intent.parameters["prompt_analysis"] = analysis
|
|
322
|
-
|
|
323
|
-
# Execute orchestrator
|
|
324
|
-
try:
|
|
325
|
-
result = await orchestrator.execute(intent, intent.parameters)
|
|
326
|
-
result["intent"] = intent.type.value
|
|
327
|
-
result["confidence"] = intent.confidence
|
|
328
|
-
result["prompt_analysis"] = {
|
|
329
|
-
"intent": analysis.primary_intent.value,
|
|
330
|
-
"complexity": analysis.complexity.value,
|
|
331
|
-
"word_count": analysis.word_count,
|
|
332
|
-
"has_existing_code": analysis.has_existing_code,
|
|
333
|
-
"recommended_workflow": analysis.recommended_workflow,
|
|
334
|
-
"recommended_enhancement": analysis.recommended_enhancement,
|
|
335
|
-
"recommended_preset": analysis.recommended_preset,
|
|
336
|
-
}
|
|
337
|
-
if force_simple_mode:
|
|
338
|
-
result["simple_mode_forced"] = True
|
|
339
|
-
return result
|
|
340
|
-
except Exception as e:
|
|
341
|
-
logger.error(f"Orchestrator execution failed: {e}", exc_info=True)
|
|
342
|
-
return {
|
|
343
|
-
"success": False,
|
|
344
|
-
"error": f"Execution failed: {str(e)}",
|
|
345
|
-
"intent": intent.type.value,
|
|
346
|
-
}
|
|
347
|
-
|
|
348
|
-
def validate_workflow_match(
|
|
349
|
-
self,
|
|
350
|
-
workflow: str,
|
|
351
|
-
prompt: str,
|
|
352
|
-
force: bool = False
|
|
353
|
-
) -> WorkflowMismatchWarning | None:
|
|
354
|
-
"""
|
|
355
|
-
Validate that user-specified workflow matches task characteristics.
|
|
356
|
-
|
|
357
|
-
Analyzes task characteristics (intent, scope, complexity) and compares against
|
|
358
|
-
workflow requirements. Returns a warning if mismatch is detected with high
|
|
359
|
-
confidence (ā„70%).
|
|
360
|
-
|
|
361
|
-
Args:
|
|
362
|
-
workflow: Workflow name specified by user ("*full", "*build", "*fix", etc.)
|
|
363
|
-
prompt: Natural language task description
|
|
364
|
-
force: Skip validation if True (default: False)
|
|
365
|
-
|
|
366
|
-
Returns:
|
|
367
|
-
WorkflowMismatchWarning if mismatch detected, None otherwise
|
|
368
|
-
|
|
369
|
-
Performance:
|
|
370
|
-
Target: <500ms (P99 latency)
|
|
371
|
-
|
|
372
|
-
Examples:
|
|
373
|
-
>>> handler.validate_workflow_match("*full", "Fix validation bug", False)
|
|
374
|
-
WorkflowMismatchWarning(...) # Mismatch detected
|
|
375
|
-
|
|
376
|
-
>>> handler.validate_workflow_match("*fix", "Fix validation bug", False)
|
|
377
|
-
None # No mismatch
|
|
378
|
-
|
|
379
|
-
>>> handler.validate_workflow_match("*full", "Fix bug", True)
|
|
380
|
-
None # Validation bypassed via force=True
|
|
381
|
-
|
|
382
|
-
See Also:
|
|
383
|
-
- detect_primary_intent(): Intent detection
|
|
384
|
-
- _analyze_task_characteristics(): Task analysis
|
|
385
|
-
- _compare_to_workflow_requirements(): Requirement comparison
|
|
386
|
-
"""
|
|
387
|
-
# Skip validation if force flag is set
|
|
388
|
-
if force:
|
|
389
|
-
logger.info(f"Validation bypassed via --force flag")
|
|
390
|
-
return None
|
|
391
|
-
|
|
392
|
-
# Validate workflow name
|
|
393
|
-
if workflow not in WORKFLOW_REQUIREMENTS:
|
|
394
|
-
logger.warning(f"Unknown workflow: {workflow}. Skipping validation.")
|
|
395
|
-
return None
|
|
396
|
-
|
|
397
|
-
# Handle empty prompt
|
|
398
|
-
if not prompt or len(prompt.strip()) == 0:
|
|
399
|
-
logger.debug("Empty prompt, skipping validation")
|
|
400
|
-
return None
|
|
401
|
-
|
|
402
|
-
# Step 1: Detect primary intent
|
|
403
|
-
intent, confidence = detect_primary_intent(prompt)
|
|
404
|
-
|
|
405
|
-
if intent is None or confidence < 0.6:
|
|
406
|
-
# Low confidence, skip validation
|
|
407
|
-
logger.debug(f"Low intent confidence ({confidence:.2f}), skipping validation")
|
|
408
|
-
return None
|
|
409
|
-
|
|
410
|
-
# Step 2: Analyze task characteristics
|
|
411
|
-
characteristics = self._analyze_task_characteristics(prompt, intent)
|
|
412
|
-
|
|
413
|
-
# Step 3: Compare to workflow requirements
|
|
414
|
-
mismatch = self._compare_to_workflow_requirements(workflow, characteristics)
|
|
415
|
-
|
|
416
|
-
# Step 4: Return warning if mismatch detected with high confidence
|
|
417
|
-
if mismatch and confidence >= 0.7:
|
|
418
|
-
warning = self._create_mismatch_warning(workflow, characteristics, confidence)
|
|
419
|
-
logger.info(
|
|
420
|
-
f"Workflow mismatch detected: {workflow} for {characteristics['intent']} "
|
|
421
|
-
f"(confidence: {confidence:.2f}, recommended: {warning.recommended_workflow})"
|
|
422
|
-
)
|
|
423
|
-
return warning
|
|
424
|
-
|
|
425
|
-
return None
|
|
426
|
-
|
|
427
|
-
def _analyze_task_characteristics(self, prompt: str, intent: str) -> dict[str, str]:
|
|
428
|
-
"""
|
|
429
|
-
Analyze task characteristics from prompt and detected intent.
|
|
430
|
-
|
|
431
|
-
Uses heuristics to determine task scope (files affected) and complexity
|
|
432
|
-
(architectural impact) based on prompt language and intent type.
|
|
433
|
-
|
|
434
|
-
Args:
|
|
435
|
-
prompt: Natural language task description
|
|
436
|
-
intent: Detected primary intent ("bug_fix" | "enhancement" | "architectural")
|
|
437
|
-
|
|
438
|
-
Returns:
|
|
439
|
-
Dict with intent, scope, and complexity
|
|
440
|
-
|
|
441
|
-
Heuristics:
|
|
442
|
-
Scope (files affected):
|
|
443
|
-
- "low" (1-3 files): Single component, focused change
|
|
444
|
-
- "medium" (4-6 files): Multiple components, moderate reach
|
|
445
|
-
- "high" (7+ files): System-wide, cross-cutting concern
|
|
446
|
-
|
|
447
|
-
Complexity (architectural impact):
|
|
448
|
-
- "low": Simple fix, no architectural changes
|
|
449
|
-
- "medium": Feature addition, some design needed
|
|
450
|
-
- "high": Architectural changes, framework development
|
|
451
|
-
"""
|
|
452
|
-
# Scope heuristics (simple for MVP)
|
|
453
|
-
scope = "low" # Default
|
|
454
|
-
|
|
455
|
-
if "tapps_agents/" in prompt.lower():
|
|
456
|
-
scope = "high" # Framework changes
|
|
457
|
-
elif len(prompt.split()) > 30:
|
|
458
|
-
scope = "medium" # Longer prompts suggest bigger scope
|
|
459
|
-
|
|
460
|
-
# Complexity heuristics
|
|
461
|
-
complexity = "medium" # Default
|
|
462
|
-
|
|
463
|
-
if intent == "architectural" or "architecture" in prompt.lower():
|
|
464
|
-
complexity = "high"
|
|
465
|
-
elif intent == "bug_fix" and scope == "low":
|
|
466
|
-
complexity = "low"
|
|
467
|
-
|
|
468
|
-
return {
|
|
469
|
-
"intent": intent,
|
|
470
|
-
"scope": scope,
|
|
471
|
-
"complexity": complexity,
|
|
472
|
-
}
|
|
473
|
-
|
|
474
|
-
def _compare_to_workflow_requirements(
|
|
475
|
-
self, workflow: str, characteristics: dict[str, str]
|
|
476
|
-
) -> bool:
|
|
477
|
-
"""
|
|
478
|
-
Compare task characteristics to workflow requirements.
|
|
479
|
-
|
|
480
|
-
Args:
|
|
481
|
-
workflow: Workflow name ("*full", "*build", "*fix")
|
|
482
|
-
characteristics: Detected task characteristics
|
|
483
|
-
|
|
484
|
-
Returns:
|
|
485
|
-
True if mismatch detected, False if workflow matches
|
|
486
|
-
"""
|
|
487
|
-
requirements = WORKFLOW_REQUIREMENTS.get(workflow)
|
|
488
|
-
if not requirements:
|
|
489
|
-
return False # Unknown workflow, skip validation
|
|
490
|
-
|
|
491
|
-
# Check intent match
|
|
492
|
-
if characteristics["intent"] not in requirements.get("required_intents", []):
|
|
493
|
-
return True # Intent mismatch
|
|
494
|
-
|
|
495
|
-
# Check complexity bounds
|
|
496
|
-
if "min_complexity" in requirements:
|
|
497
|
-
if COMPLEXITY_ORDER[characteristics["complexity"]] < \
|
|
498
|
-
COMPLEXITY_ORDER[requirements["min_complexity"]]:
|
|
499
|
-
return True # Complexity too low
|
|
500
|
-
|
|
501
|
-
if "max_complexity" in requirements:
|
|
502
|
-
if COMPLEXITY_ORDER[characteristics["complexity"]] > \
|
|
503
|
-
COMPLEXITY_ORDER[requirements["max_complexity"]]:
|
|
504
|
-
return True # Complexity too high
|
|
505
|
-
|
|
506
|
-
# Check scope bounds
|
|
507
|
-
if "min_scope" in requirements:
|
|
508
|
-
if SCOPE_ORDER[characteristics["scope"]] < \
|
|
509
|
-
SCOPE_ORDER[requirements["min_scope"]]:
|
|
510
|
-
return True # Scope too low
|
|
511
|
-
|
|
512
|
-
if "max_scope" in requirements:
|
|
513
|
-
if SCOPE_ORDER[characteristics["scope"]] > \
|
|
514
|
-
SCOPE_ORDER[requirements["max_scope"]]:
|
|
515
|
-
return True # Scope too high
|
|
516
|
-
|
|
517
|
-
return False # No mismatch
|
|
518
|
-
|
|
519
|
-
def _create_mismatch_warning(
|
|
520
|
-
self, workflow: str, characteristics: dict[str, str], confidence: float
|
|
521
|
-
) -> WorkflowMismatchWarning:
|
|
522
|
-
"""
|
|
523
|
-
Create mismatch warning with recommendations.
|
|
524
|
-
|
|
525
|
-
Args:
|
|
526
|
-
workflow: Current workflow specified by user
|
|
527
|
-
characteristics: Detected task characteristics
|
|
528
|
-
confidence: Confidence score
|
|
529
|
-
|
|
530
|
-
Returns:
|
|
531
|
-
WorkflowMismatchWarning with recommendations
|
|
532
|
-
"""
|
|
533
|
-
# Recommend workflow based on intent
|
|
534
|
-
recommended = {
|
|
535
|
-
"bug_fix": "*fix",
|
|
536
|
-
"feature": "*build",
|
|
537
|
-
"enhancement": "*build",
|
|
538
|
-
"architectural": "*full",
|
|
539
|
-
"framework_dev": "*full",
|
|
540
|
-
}.get(characteristics["intent"], "*build")
|
|
541
|
-
|
|
542
|
-
# Estimate token savings
|
|
543
|
-
current_steps = WORKFLOW_REQUIREMENTS[workflow]["steps"]
|
|
544
|
-
recommended_steps = WORKFLOW_REQUIREMENTS.get(recommended, {}).get("steps", 4)
|
|
545
|
-
step_difference = current_steps - recommended_steps
|
|
546
|
-
token_savings = max(0, step_difference * 10000) # ~10K tokens per step
|
|
547
|
-
time_savings = max(0, step_difference * 5) # ~5 minutes per step
|
|
548
|
-
|
|
549
|
-
reason = (
|
|
550
|
-
f"*{workflow.lstrip('*')} workflow is designed for: "
|
|
551
|
-
f"{WORKFLOW_REQUIREMENTS[workflow]['description']}"
|
|
552
|
-
)
|
|
553
|
-
|
|
554
|
-
return WorkflowMismatchWarning(
|
|
555
|
-
detected_intent=characteristics["intent"],
|
|
556
|
-
detected_scope=characteristics["scope"],
|
|
557
|
-
detected_complexity=characteristics["complexity"],
|
|
558
|
-
recommended_workflow=recommended,
|
|
559
|
-
confidence=confidence,
|
|
560
|
-
reason=reason,
|
|
561
|
-
token_savings=token_savings,
|
|
562
|
-
time_savings=time_savings,
|
|
563
|
-
)
|
|
564
|
-
|
|
565
|
-
def _display_mismatch_warning(
|
|
566
|
-
self, warning: WorkflowMismatchWarning, current_workflow: str
|
|
567
|
-
) -> None:
|
|
568
|
-
"""
|
|
569
|
-
Display formatted warning to user.
|
|
570
|
-
|
|
571
|
-
Args:
|
|
572
|
-
warning: Workflow mismatch warning
|
|
573
|
-
current_workflow: Current workflow specified by user
|
|
574
|
-
"""
|
|
575
|
-
print("\n" + "=" * 70)
|
|
576
|
-
print(warning.format_warning())
|
|
577
|
-
print("=" * 70)
|
|
578
|
-
print(f"\nProceed with {current_workflow}? [y/N/switch]")
|
|
579
|
-
|
|
580
|
-
def _prompt_user_choice(
|
|
581
|
-
self, warning: WorkflowMismatchWarning, current_workflow: str
|
|
582
|
-
) -> str:
|
|
583
|
-
"""
|
|
584
|
-
Prompt user for choice.
|
|
585
|
-
|
|
586
|
-
Args:
|
|
587
|
-
warning: Workflow mismatch warning
|
|
588
|
-
current_workflow: Current workflow specified by user
|
|
589
|
-
|
|
590
|
-
Returns:
|
|
591
|
-
"y" (proceed), "N" (cancel), or "switch" (use recommended)
|
|
592
|
-
"""
|
|
593
|
-
while True:
|
|
594
|
-
try:
|
|
595
|
-
choice = input("> ").strip().lower()
|
|
596
|
-
|
|
597
|
-
if choice in ("y", "yes"):
|
|
598
|
-
return "y"
|
|
599
|
-
elif choice in ("n", "no", ""):
|
|
600
|
-
return "N"
|
|
601
|
-
elif choice in ("s", "switch"):
|
|
602
|
-
return "switch"
|
|
603
|
-
else:
|
|
604
|
-
print("Invalid choice. Enter y (proceed), N (cancel), or switch.")
|
|
605
|
-
except (KeyboardInterrupt, EOFError):
|
|
606
|
-
print("\nCancelled by user")
|
|
607
|
-
return "N"
|
|
608
|
-
|
|
609
|
-
def _workflow_to_intent_type(self, workflow: str) -> IntentType | None:
|
|
610
|
-
"""
|
|
611
|
-
Convert workflow name to IntentType.
|
|
612
|
-
|
|
613
|
-
Args:
|
|
614
|
-
workflow: Workflow name ("*fix", "*build", etc.)
|
|
615
|
-
|
|
616
|
-
Returns:
|
|
617
|
-
IntentType or None if unknown
|
|
618
|
-
"""
|
|
619
|
-
mapping = {
|
|
620
|
-
"*fix": IntentType.FIX,
|
|
621
|
-
"*build": IntentType.BUILD,
|
|
622
|
-
"*full": IntentType.BUILD, # Full SDLC maps to build
|
|
623
|
-
"*review": IntentType.REVIEW,
|
|
624
|
-
"*test": IntentType.TEST,
|
|
625
|
-
"*refactor": IntentType.REFACTOR,
|
|
626
|
-
}
|
|
627
|
-
return mapping.get(workflow)
|
|
628
|
-
|
|
629
|
-
def is_simple_mode_enabled(self) -> bool:
|
|
630
|
-
"""Check if Simple Mode is enabled."""
|
|
631
|
-
return self.config.simple_mode.enabled
|
|
632
|
-
|
|
633
|
-
def is_simple_mode_available(self) -> bool:
|
|
634
|
-
"""
|
|
635
|
-
Check if Simple Mode is available and enabled.
|
|
636
|
-
|
|
637
|
-
Returns:
|
|
638
|
-
True if Simple Mode is available, False otherwise
|
|
639
|
-
"""
|
|
640
|
-
return self.config.simple_mode.enabled
|
|
641
|
-
|
|
642
|
-
def _analyze_prompt(self, command: str, intent: Intent) -> PromptAnalysis:
|
|
643
|
-
"""
|
|
644
|
-
Analyze prompt for intelligent workflow selection.
|
|
645
|
-
|
|
646
|
-
Args:
|
|
647
|
-
command: User's command
|
|
648
|
-
intent: Parsed intent
|
|
649
|
-
|
|
650
|
-
Returns:
|
|
651
|
-
PromptAnalysis with recommendations
|
|
652
|
-
"""
|
|
653
|
-
# Extract command type from intent
|
|
654
|
-
command_type = f"*{intent.type.value}" if intent.type else None
|
|
655
|
-
|
|
656
|
-
# Analyze prompt
|
|
657
|
-
analysis = self.prompt_analyzer.analyze(command, command_type)
|
|
658
|
-
|
|
659
|
-
# Log analysis for visibility
|
|
660
|
-
if analysis.intent_confidence >= 0.7:
|
|
661
|
-
print("\nš Prompt Analysis:")
|
|
662
|
-
print(f" Intent: {analysis.primary_intent.value} ({analysis.intent_confidence:.0%} confidence)")
|
|
663
|
-
print(f" Complexity: {analysis.complexity.value} ({analysis.word_count} words)")
|
|
664
|
-
if analysis.has_existing_code:
|
|
665
|
-
print(f" Existing Code: Yes ({len(analysis.existing_code_refs)} references)")
|
|
666
|
-
print(f" Recommended Workflow: {analysis.recommended_workflow}")
|
|
667
|
-
print(f" Recommended Enhancement: {analysis.recommended_enhancement}")
|
|
668
|
-
print(f" Recommended Preset: {analysis.recommended_preset}")
|
|
669
|
-
print(f" Rationale: {analysis.analysis_rationale}\n")
|
|
670
|
-
|
|
671
|
-
return analysis
|
|
672
|
-
|
|
673
|
-
def _generate_workflow_suggestion(self, analysis: PromptAnalysis, current_command: str) -> str:
|
|
674
|
-
"""
|
|
675
|
-
Generate workflow suggestion message based on analysis.
|
|
676
|
-
|
|
677
|
-
Args:
|
|
678
|
-
analysis: Prompt analysis result
|
|
679
|
-
current_command: Current command being executed
|
|
680
|
-
|
|
681
|
-
Returns:
|
|
682
|
-
Formatted suggestion message
|
|
683
|
-
"""
|
|
684
|
-
return f"""
|
|
685
|
-
š¤ Workflow Suggestion:
|
|
686
|
-
|
|
687
|
-
Detected existing code reference in your prompt.
|
|
688
|
-
|
|
689
|
-
**Suggested Workflow:** @simple-mode *{analysis.recommended_workflow} "{analysis.primary_intent.value}"
|
|
690
|
-
|
|
691
|
-
**Benefits:**
|
|
692
|
-
ā
Validates existing implementation
|
|
693
|
-
ā
Identifies optimizations
|
|
694
|
-
ā
50% faster (skips duplicate code generation)
|
|
695
|
-
ā
Focused recommendations
|
|
696
|
-
|
|
697
|
-
**Current Command:** {current_command}
|
|
698
|
-
|
|
699
|
-
**Recommendation:** Use *{analysis.recommended_workflow} for comparison tasks.
|
|
700
|
-
""".strip()
|
|
1
|
+
"""
|
|
2
|
+
Natural Language Handler - Process natural language commands for Simple Mode.
|
|
3
|
+
|
|
4
|
+
Intercepts natural language commands, parses them, and routes to appropriate orchestrators.
|
|
5
|
+
Works both in CLI mode and Cursor Skills mode. Includes workflow mismatch detection to prevent
|
|
6
|
+
users from running inappropriate workflows.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
# @ai-prime-directive: This file implements the Simple Mode natural language handler.
|
|
10
|
+
# Simple Mode is the primary user interface for TappsCodingAgents, providing natural language
|
|
11
|
+
# orchestration of multiple specialized skills. Do not modify the intent parsing or orchestrator
|
|
12
|
+
# routing without updating Simple Mode documentation and tests.
|
|
13
|
+
|
|
14
|
+
# @ai-constraints:
|
|
15
|
+
# - Must maintain backward compatibility with existing Simple Mode commands
|
|
16
|
+
# - Intent detection must support both explicit commands (*build) and natural language
|
|
17
|
+
# - Workflow enforcement is mandatory - do not bypass workflow steps
|
|
18
|
+
# - Performance: Intent parsing must complete in <50ms, validation <500ms
|
|
19
|
+
|
|
20
|
+
# @note[2026-01-30]: Added workflow mismatch detection to warn users when workflow choice
|
|
21
|
+
# doesn't match task characteristics. See docs/archive/feedback/WORKFLOW_AUTO_DETECTION_FAILURE_INIT_VALIDATION.md
|
|
22
|
+
|
|
23
|
+
import logging
|
|
24
|
+
from dataclasses import dataclass
|
|
25
|
+
from pathlib import Path
|
|
26
|
+
from typing import Any, Literal
|
|
27
|
+
|
|
28
|
+
from tapps_agents.core.config import ProjectConfig, load_config
|
|
29
|
+
|
|
30
|
+
from .intent_parser import Intent, IntentParser, IntentType
|
|
31
|
+
from .orchestrators import (
|
|
32
|
+
BreakdownOrchestrator,
|
|
33
|
+
BrownfieldOrchestrator,
|
|
34
|
+
BuildOrchestrator,
|
|
35
|
+
EnhanceOrchestrator,
|
|
36
|
+
EpicOrchestrator,
|
|
37
|
+
ExploreOrchestrator,
|
|
38
|
+
FixOrchestrator,
|
|
39
|
+
PlanAnalysisOrchestrator,
|
|
40
|
+
PROrchestrator,
|
|
41
|
+
RefactorOrchestrator,
|
|
42
|
+
ReviewOrchestrator,
|
|
43
|
+
TestOrchestrator,
|
|
44
|
+
TodoOrchestrator,
|
|
45
|
+
ValidateOrchestrator,
|
|
46
|
+
)
|
|
47
|
+
from .prompt_analyzer import PromptAnalysis, PromptAnalyzer
|
|
48
|
+
from .variations import normalize_command
|
|
49
|
+
from .workflow_suggester import (
|
|
50
|
+
COMPLEXITY_ORDER,
|
|
51
|
+
SCOPE_ORDER,
|
|
52
|
+
WORKFLOW_REQUIREMENTS,
|
|
53
|
+
WorkflowSuggester,
|
|
54
|
+
detect_primary_intent,
|
|
55
|
+
)
|
|
56
|
+
|
|
57
|
+
# Initialize logger
|
|
58
|
+
logger = logging.getLogger(__name__)
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
# ============================================================================
|
|
62
|
+
# Workflow Mismatch Warning Data Model
|
|
63
|
+
# ============================================================================
|
|
64
|
+
|
|
65
|
+
@dataclass(frozen=True)
|
|
66
|
+
class WorkflowMismatchWarning:
|
|
67
|
+
"""
|
|
68
|
+
Warning data for workflow mismatch detection.
|
|
69
|
+
|
|
70
|
+
Represents a detected mismatch between user-specified workflow and task
|
|
71
|
+
characteristics, providing actionable recommendations and impact estimates.
|
|
72
|
+
|
|
73
|
+
Attributes:
|
|
74
|
+
detected_intent: Primary intent detected from prompt
|
|
75
|
+
Values: "bug_fix" | "feature" | "enhancement" | "architectural" | "framework_dev"
|
|
76
|
+
detected_scope: Task scope (files affected)
|
|
77
|
+
Values: "low" (1-3 files) | "medium" (4-6 files) | "high" (7+ files)
|
|
78
|
+
detected_complexity: Task complexity (architectural impact)
|
|
79
|
+
Values: "low" | "medium" | "high"
|
|
80
|
+
recommended_workflow: Suggested workflow for this task
|
|
81
|
+
Values: "*fix" | "*build" | "*full" | "*refactor"
|
|
82
|
+
confidence: Confidence in recommendation (0.7-1.0)
|
|
83
|
+
reason: Human-readable explanation for recommendation
|
|
84
|
+
token_savings: Estimated tokens saved by switching workflows
|
|
85
|
+
time_savings: Estimated minutes saved by switching workflows
|
|
86
|
+
|
|
87
|
+
Immutability:
|
|
88
|
+
frozen=True ensures warning data cannot be modified after creation
|
|
89
|
+
"""
|
|
90
|
+
|
|
91
|
+
detected_intent: str
|
|
92
|
+
detected_scope: str
|
|
93
|
+
detected_complexity: str
|
|
94
|
+
recommended_workflow: str
|
|
95
|
+
confidence: float
|
|
96
|
+
reason: str
|
|
97
|
+
token_savings: int
|
|
98
|
+
time_savings: int
|
|
99
|
+
|
|
100
|
+
def format_warning(self) -> str:
|
|
101
|
+
"""
|
|
102
|
+
Format warning for terminal display.
|
|
103
|
+
|
|
104
|
+
Returns:
|
|
105
|
+
Formatted warning message with visual hierarchy (emoji, structure)
|
|
106
|
+
"""
|
|
107
|
+
return f"""ā ļø Workflow Mismatch Warning
|
|
108
|
+
|
|
109
|
+
Task Analysis:
|
|
110
|
+
- Primary Intent: {self.detected_intent} (confidence: {self.confidence:.0%})
|
|
111
|
+
- Scope: {self.detected_scope}
|
|
112
|
+
- Complexity: {self.detected_complexity}
|
|
113
|
+
|
|
114
|
+
{self.reason}
|
|
115
|
+
|
|
116
|
+
Recommended: {self.recommended_workflow}
|
|
117
|
+
Token Savings: ~{self.token_savings // 1000}K tokens, ~{self.time_savings} minutes"""
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
# ============================================================================
|
|
121
|
+
# Simple Mode Handler
|
|
122
|
+
# ============================================================================
|
|
123
|
+
|
|
124
|
+
class SimpleModeHandler:
|
|
125
|
+
"""Handler for natural language commands in Simple Mode."""
|
|
126
|
+
|
|
127
|
+
def __init__(
|
|
128
|
+
self,
|
|
129
|
+
project_root: Path | None = None,
|
|
130
|
+
config: ProjectConfig | None = None,
|
|
131
|
+
):
|
|
132
|
+
"""
|
|
133
|
+
Initialize Simple Mode handler.
|
|
134
|
+
|
|
135
|
+
Args:
|
|
136
|
+
project_root: Project root directory
|
|
137
|
+
config: Optional project configuration
|
|
138
|
+
"""
|
|
139
|
+
self.project_root = project_root or Path.cwd()
|
|
140
|
+
self.config = config or load_config()
|
|
141
|
+
self.intent_parser = IntentParser()
|
|
142
|
+
self.workflow_suggester = WorkflowSuggester()
|
|
143
|
+
self.prompt_analyzer = PromptAnalyzer()
|
|
144
|
+
|
|
145
|
+
# Initialize orchestrators
|
|
146
|
+
self.orchestrators = {
|
|
147
|
+
IntentType.BUILD: BuildOrchestrator(
|
|
148
|
+
project_root=self.project_root, config=self.config
|
|
149
|
+
),
|
|
150
|
+
IntentType.VALIDATE: ValidateOrchestrator(
|
|
151
|
+
project_root=self.project_root, config=self.config
|
|
152
|
+
),
|
|
153
|
+
IntentType.REVIEW: ReviewOrchestrator(
|
|
154
|
+
project_root=self.project_root, config=self.config
|
|
155
|
+
),
|
|
156
|
+
IntentType.FIX: FixOrchestrator(
|
|
157
|
+
project_root=self.project_root, config=self.config
|
|
158
|
+
),
|
|
159
|
+
IntentType.TEST: TestOrchestrator(
|
|
160
|
+
project_root=self.project_root, config=self.config
|
|
161
|
+
),
|
|
162
|
+
IntentType.EPIC: EpicOrchestrator(
|
|
163
|
+
project_root=self.project_root, config=self.config
|
|
164
|
+
),
|
|
165
|
+
IntentType.EXPLORE: ExploreOrchestrator(
|
|
166
|
+
project_root=self.project_root, config=self.config
|
|
167
|
+
),
|
|
168
|
+
IntentType.REFACTOR: RefactorOrchestrator(
|
|
169
|
+
project_root=self.project_root, config=self.config
|
|
170
|
+
),
|
|
171
|
+
IntentType.PLAN_ANALYSIS: PlanAnalysisOrchestrator(
|
|
172
|
+
project_root=self.project_root, config=self.config
|
|
173
|
+
),
|
|
174
|
+
IntentType.PR: PROrchestrator(
|
|
175
|
+
project_root=self.project_root, config=self.config
|
|
176
|
+
),
|
|
177
|
+
IntentType.BROWNFIELD: BrownfieldOrchestrator(
|
|
178
|
+
project_root=self.project_root, config=self.config
|
|
179
|
+
),
|
|
180
|
+
IntentType.ENHANCE: EnhanceOrchestrator(
|
|
181
|
+
project_root=self.project_root, config=self.config
|
|
182
|
+
),
|
|
183
|
+
IntentType.BREAKDOWN: BreakdownOrchestrator(
|
|
184
|
+
project_root=self.project_root, config=self.config
|
|
185
|
+
),
|
|
186
|
+
IntentType.TODO: TodoOrchestrator(
|
|
187
|
+
project_root=self.project_root, config=self.config
|
|
188
|
+
),
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
async def handle(self, command: str, suggest_workflow: bool = True) -> dict[str, Any]:
|
|
192
|
+
"""
|
|
193
|
+
Handle a natural language command.
|
|
194
|
+
|
|
195
|
+
Enhanced to detect and force Simple Mode when requested.
|
|
196
|
+
Includes workflow mismatch detection to warn users before execution.
|
|
197
|
+
|
|
198
|
+
Args:
|
|
199
|
+
command: User's natural language command
|
|
200
|
+
suggest_workflow: Whether to suggest workflow if not already using Simple Mode
|
|
201
|
+
|
|
202
|
+
Returns:
|
|
203
|
+
Dictionary with execution results
|
|
204
|
+
"""
|
|
205
|
+
# Check for Simple Mode intent first
|
|
206
|
+
if self.intent_parser.detect_simple_mode_intent(command):
|
|
207
|
+
# Force Simple Mode workflow
|
|
208
|
+
if not self.config.simple_mode.enabled:
|
|
209
|
+
return {
|
|
210
|
+
"success": False,
|
|
211
|
+
"error": "Simple Mode requested but not available. Install with: `tapps-agents init`",
|
|
212
|
+
"suggestion": "Run: tapps-agents simple-mode on",
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
# Normalize command (expand synonyms)
|
|
216
|
+
normalized = normalize_command(command)
|
|
217
|
+
|
|
218
|
+
# Parse intent
|
|
219
|
+
intent = self.intent_parser.parse(normalized)
|
|
220
|
+
|
|
221
|
+
# Analyze prompt for intelligent workflow selection
|
|
222
|
+
analysis = self._analyze_prompt(command, intent)
|
|
223
|
+
|
|
224
|
+
# Suggest workflow if enabled and not already using Simple Mode
|
|
225
|
+
if suggest_workflow and not self.intent_parser.detect_simple_mode_intent(command):
|
|
226
|
+
suggestion = self.workflow_suggester.suggest_workflow(command)
|
|
227
|
+
if suggestion and self.workflow_suggester.should_suggest(command):
|
|
228
|
+
return {
|
|
229
|
+
"success": False,
|
|
230
|
+
"suggestion": True,
|
|
231
|
+
"workflow_suggestion": {
|
|
232
|
+
"command": suggestion.workflow_command,
|
|
233
|
+
"type": suggestion.workflow_type,
|
|
234
|
+
"benefits": suggestion.benefits,
|
|
235
|
+
"reason": suggestion.reason,
|
|
236
|
+
"confidence": suggestion.confidence,
|
|
237
|
+
"formatted": self.workflow_suggester.format_suggestion(suggestion),
|
|
238
|
+
},
|
|
239
|
+
"message": "Workflow suggestion available",
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
# Check if Simple Mode is enabled (or forced)
|
|
243
|
+
force_simple_mode = intent.parameters.get("force_simple_mode", False)
|
|
244
|
+
if force_simple_mode and not self.config.simple_mode.enabled:
|
|
245
|
+
return {
|
|
246
|
+
"success": False,
|
|
247
|
+
"error": "Simple Mode requested but not available. Install with: `tapps-agents init`",
|
|
248
|
+
"suggestion": "Run: tapps-agents simple-mode on",
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
if not self.config.simple_mode.enabled and not force_simple_mode:
|
|
252
|
+
return {
|
|
253
|
+
"success": False,
|
|
254
|
+
"error": "Simple Mode is disabled. Enable it in .tapps-agents/config.yaml",
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
# Route to appropriate orchestrator
|
|
258
|
+
orchestrator = self.orchestrators.get(intent.type)
|
|
259
|
+
if not orchestrator:
|
|
260
|
+
return {
|
|
261
|
+
"success": False,
|
|
262
|
+
"error": f"Unknown intent type: {intent.type}. Try: build, review, fix, or test",
|
|
263
|
+
"intent": intent.type.value,
|
|
264
|
+
"confidence": intent.confidence,
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
# [NEW] Workflow mismatch detection
|
|
268
|
+
# Extract workflow name and check for --force flag
|
|
269
|
+
workflow = f"*{intent.type.value}" if intent.type else None
|
|
270
|
+
force_validation = intent.parameters.get("force", False)
|
|
271
|
+
|
|
272
|
+
if workflow:
|
|
273
|
+
warning = self.validate_workflow_match(workflow, command, force_validation)
|
|
274
|
+
|
|
275
|
+
if warning:
|
|
276
|
+
# Display warning to user
|
|
277
|
+
self._display_mismatch_warning(warning, workflow)
|
|
278
|
+
|
|
279
|
+
# Prompt for user choice (unless auto mode)
|
|
280
|
+
auto_mode = intent.parameters.get("auto", False)
|
|
281
|
+
|
|
282
|
+
if auto_mode:
|
|
283
|
+
choice = "N" # Default to cancel in auto mode
|
|
284
|
+
logger.info(f"Auto mode: defaulting to 'N' for workflow mismatch")
|
|
285
|
+
else:
|
|
286
|
+
choice = self._prompt_user_choice(warning, workflow)
|
|
287
|
+
|
|
288
|
+
# Handle user choice
|
|
289
|
+
if choice == "N":
|
|
290
|
+
logger.info(f"User declined workflow: {workflow}")
|
|
291
|
+
return {
|
|
292
|
+
"success": False,
|
|
293
|
+
"status": "cancelled",
|
|
294
|
+
"reason": "User declined due to workflow mismatch",
|
|
295
|
+
"warning": {
|
|
296
|
+
"detected_intent": warning.detected_intent,
|
|
297
|
+
"recommended_workflow": warning.recommended_workflow,
|
|
298
|
+
"confidence": warning.confidence,
|
|
299
|
+
},
|
|
300
|
+
}
|
|
301
|
+
elif choice == "switch":
|
|
302
|
+
# Switch to recommended workflow
|
|
303
|
+
logger.info(f"User switched from {workflow} to {warning.recommended_workflow}")
|
|
304
|
+
# Update intent type to match recommended workflow
|
|
305
|
+
recommended_intent_type = self._workflow_to_intent_type(warning.recommended_workflow)
|
|
306
|
+
if recommended_intent_type:
|
|
307
|
+
intent.type = recommended_intent_type
|
|
308
|
+
orchestrator = self.orchestrators.get(intent.type)
|
|
309
|
+
elif choice == "y":
|
|
310
|
+
logger.info(f"User proceeded with {workflow} despite mismatch warning")
|
|
311
|
+
|
|
312
|
+
# Check for workflow mismatch and suggest better approach (legacy)
|
|
313
|
+
if intent.type.value == "build" and analysis.recommended_workflow == "validate":
|
|
314
|
+
if analysis.intent_confidence >= 0.80:
|
|
315
|
+
# High confidence - show suggestion
|
|
316
|
+
suggestion = self._generate_workflow_suggestion(analysis, f"*{intent.type.value}")
|
|
317
|
+
print(suggestion)
|
|
318
|
+
print(f"\nā
Auto-switching to *{analysis.recommended_workflow} workflow (confidence: {analysis.intent_confidence:.0%})\n")
|
|
319
|
+
|
|
320
|
+
# Pass analysis to orchestrator via parameters
|
|
321
|
+
intent.parameters["prompt_analysis"] = analysis
|
|
322
|
+
|
|
323
|
+
# Execute orchestrator
|
|
324
|
+
try:
|
|
325
|
+
result = await orchestrator.execute(intent, intent.parameters)
|
|
326
|
+
result["intent"] = intent.type.value
|
|
327
|
+
result["confidence"] = intent.confidence
|
|
328
|
+
result["prompt_analysis"] = {
|
|
329
|
+
"intent": analysis.primary_intent.value,
|
|
330
|
+
"complexity": analysis.complexity.value,
|
|
331
|
+
"word_count": analysis.word_count,
|
|
332
|
+
"has_existing_code": analysis.has_existing_code,
|
|
333
|
+
"recommended_workflow": analysis.recommended_workflow,
|
|
334
|
+
"recommended_enhancement": analysis.recommended_enhancement,
|
|
335
|
+
"recommended_preset": analysis.recommended_preset,
|
|
336
|
+
}
|
|
337
|
+
if force_simple_mode:
|
|
338
|
+
result["simple_mode_forced"] = True
|
|
339
|
+
return result
|
|
340
|
+
except Exception as e:
|
|
341
|
+
logger.error(f"Orchestrator execution failed: {e}", exc_info=True)
|
|
342
|
+
return {
|
|
343
|
+
"success": False,
|
|
344
|
+
"error": f"Execution failed: {str(e)}",
|
|
345
|
+
"intent": intent.type.value,
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
def validate_workflow_match(
|
|
349
|
+
self,
|
|
350
|
+
workflow: str,
|
|
351
|
+
prompt: str,
|
|
352
|
+
force: bool = False
|
|
353
|
+
) -> WorkflowMismatchWarning | None:
|
|
354
|
+
"""
|
|
355
|
+
Validate that user-specified workflow matches task characteristics.
|
|
356
|
+
|
|
357
|
+
Analyzes task characteristics (intent, scope, complexity) and compares against
|
|
358
|
+
workflow requirements. Returns a warning if mismatch is detected with high
|
|
359
|
+
confidence (ā„70%).
|
|
360
|
+
|
|
361
|
+
Args:
|
|
362
|
+
workflow: Workflow name specified by user ("*full", "*build", "*fix", etc.)
|
|
363
|
+
prompt: Natural language task description
|
|
364
|
+
force: Skip validation if True (default: False)
|
|
365
|
+
|
|
366
|
+
Returns:
|
|
367
|
+
WorkflowMismatchWarning if mismatch detected, None otherwise
|
|
368
|
+
|
|
369
|
+
Performance:
|
|
370
|
+
Target: <500ms (P99 latency)
|
|
371
|
+
|
|
372
|
+
Examples:
|
|
373
|
+
>>> handler.validate_workflow_match("*full", "Fix validation bug", False)
|
|
374
|
+
WorkflowMismatchWarning(...) # Mismatch detected
|
|
375
|
+
|
|
376
|
+
>>> handler.validate_workflow_match("*fix", "Fix validation bug", False)
|
|
377
|
+
None # No mismatch
|
|
378
|
+
|
|
379
|
+
>>> handler.validate_workflow_match("*full", "Fix bug", True)
|
|
380
|
+
None # Validation bypassed via force=True
|
|
381
|
+
|
|
382
|
+
See Also:
|
|
383
|
+
- detect_primary_intent(): Intent detection
|
|
384
|
+
- _analyze_task_characteristics(): Task analysis
|
|
385
|
+
- _compare_to_workflow_requirements(): Requirement comparison
|
|
386
|
+
"""
|
|
387
|
+
# Skip validation if force flag is set
|
|
388
|
+
if force:
|
|
389
|
+
logger.info(f"Validation bypassed via --force flag")
|
|
390
|
+
return None
|
|
391
|
+
|
|
392
|
+
# Validate workflow name
|
|
393
|
+
if workflow not in WORKFLOW_REQUIREMENTS:
|
|
394
|
+
logger.warning(f"Unknown workflow: {workflow}. Skipping validation.")
|
|
395
|
+
return None
|
|
396
|
+
|
|
397
|
+
# Handle empty prompt
|
|
398
|
+
if not prompt or len(prompt.strip()) == 0:
|
|
399
|
+
logger.debug("Empty prompt, skipping validation")
|
|
400
|
+
return None
|
|
401
|
+
|
|
402
|
+
# Step 1: Detect primary intent
|
|
403
|
+
intent, confidence = detect_primary_intent(prompt)
|
|
404
|
+
|
|
405
|
+
if intent is None or confidence < 0.6:
|
|
406
|
+
# Low confidence, skip validation
|
|
407
|
+
logger.debug(f"Low intent confidence ({confidence:.2f}), skipping validation")
|
|
408
|
+
return None
|
|
409
|
+
|
|
410
|
+
# Step 2: Analyze task characteristics
|
|
411
|
+
characteristics = self._analyze_task_characteristics(prompt, intent)
|
|
412
|
+
|
|
413
|
+
# Step 3: Compare to workflow requirements
|
|
414
|
+
mismatch = self._compare_to_workflow_requirements(workflow, characteristics)
|
|
415
|
+
|
|
416
|
+
# Step 4: Return warning if mismatch detected with high confidence
|
|
417
|
+
if mismatch and confidence >= 0.7:
|
|
418
|
+
warning = self._create_mismatch_warning(workflow, characteristics, confidence)
|
|
419
|
+
logger.info(
|
|
420
|
+
f"Workflow mismatch detected: {workflow} for {characteristics['intent']} "
|
|
421
|
+
f"(confidence: {confidence:.2f}, recommended: {warning.recommended_workflow})"
|
|
422
|
+
)
|
|
423
|
+
return warning
|
|
424
|
+
|
|
425
|
+
return None
|
|
426
|
+
|
|
427
|
+
def _analyze_task_characteristics(self, prompt: str, intent: str) -> dict[str, str]:
|
|
428
|
+
"""
|
|
429
|
+
Analyze task characteristics from prompt and detected intent.
|
|
430
|
+
|
|
431
|
+
Uses heuristics to determine task scope (files affected) and complexity
|
|
432
|
+
(architectural impact) based on prompt language and intent type.
|
|
433
|
+
|
|
434
|
+
Args:
|
|
435
|
+
prompt: Natural language task description
|
|
436
|
+
intent: Detected primary intent ("bug_fix" | "enhancement" | "architectural")
|
|
437
|
+
|
|
438
|
+
Returns:
|
|
439
|
+
Dict with intent, scope, and complexity
|
|
440
|
+
|
|
441
|
+
Heuristics:
|
|
442
|
+
Scope (files affected):
|
|
443
|
+
- "low" (1-3 files): Single component, focused change
|
|
444
|
+
- "medium" (4-6 files): Multiple components, moderate reach
|
|
445
|
+
- "high" (7+ files): System-wide, cross-cutting concern
|
|
446
|
+
|
|
447
|
+
Complexity (architectural impact):
|
|
448
|
+
- "low": Simple fix, no architectural changes
|
|
449
|
+
- "medium": Feature addition, some design needed
|
|
450
|
+
- "high": Architectural changes, framework development
|
|
451
|
+
"""
|
|
452
|
+
# Scope heuristics (simple for MVP)
|
|
453
|
+
scope = "low" # Default
|
|
454
|
+
|
|
455
|
+
if "tapps_agents/" in prompt.lower():
|
|
456
|
+
scope = "high" # Framework changes
|
|
457
|
+
elif len(prompt.split()) > 30:
|
|
458
|
+
scope = "medium" # Longer prompts suggest bigger scope
|
|
459
|
+
|
|
460
|
+
# Complexity heuristics
|
|
461
|
+
complexity = "medium" # Default
|
|
462
|
+
|
|
463
|
+
if intent == "architectural" or "architecture" in prompt.lower():
|
|
464
|
+
complexity = "high"
|
|
465
|
+
elif intent == "bug_fix" and scope == "low":
|
|
466
|
+
complexity = "low"
|
|
467
|
+
|
|
468
|
+
return {
|
|
469
|
+
"intent": intent,
|
|
470
|
+
"scope": scope,
|
|
471
|
+
"complexity": complexity,
|
|
472
|
+
}
|
|
473
|
+
|
|
474
|
+
def _compare_to_workflow_requirements(
|
|
475
|
+
self, workflow: str, characteristics: dict[str, str]
|
|
476
|
+
) -> bool:
|
|
477
|
+
"""
|
|
478
|
+
Compare task characteristics to workflow requirements.
|
|
479
|
+
|
|
480
|
+
Args:
|
|
481
|
+
workflow: Workflow name ("*full", "*build", "*fix")
|
|
482
|
+
characteristics: Detected task characteristics
|
|
483
|
+
|
|
484
|
+
Returns:
|
|
485
|
+
True if mismatch detected, False if workflow matches
|
|
486
|
+
"""
|
|
487
|
+
requirements = WORKFLOW_REQUIREMENTS.get(workflow)
|
|
488
|
+
if not requirements:
|
|
489
|
+
return False # Unknown workflow, skip validation
|
|
490
|
+
|
|
491
|
+
# Check intent match
|
|
492
|
+
if characteristics["intent"] not in requirements.get("required_intents", []):
|
|
493
|
+
return True # Intent mismatch
|
|
494
|
+
|
|
495
|
+
# Check complexity bounds
|
|
496
|
+
if "min_complexity" in requirements:
|
|
497
|
+
if COMPLEXITY_ORDER[characteristics["complexity"]] < \
|
|
498
|
+
COMPLEXITY_ORDER[requirements["min_complexity"]]:
|
|
499
|
+
return True # Complexity too low
|
|
500
|
+
|
|
501
|
+
if "max_complexity" in requirements:
|
|
502
|
+
if COMPLEXITY_ORDER[characteristics["complexity"]] > \
|
|
503
|
+
COMPLEXITY_ORDER[requirements["max_complexity"]]:
|
|
504
|
+
return True # Complexity too high
|
|
505
|
+
|
|
506
|
+
# Check scope bounds
|
|
507
|
+
if "min_scope" in requirements:
|
|
508
|
+
if SCOPE_ORDER[characteristics["scope"]] < \
|
|
509
|
+
SCOPE_ORDER[requirements["min_scope"]]:
|
|
510
|
+
return True # Scope too low
|
|
511
|
+
|
|
512
|
+
if "max_scope" in requirements:
|
|
513
|
+
if SCOPE_ORDER[characteristics["scope"]] > \
|
|
514
|
+
SCOPE_ORDER[requirements["max_scope"]]:
|
|
515
|
+
return True # Scope too high
|
|
516
|
+
|
|
517
|
+
return False # No mismatch
|
|
518
|
+
|
|
519
|
+
def _create_mismatch_warning(
|
|
520
|
+
self, workflow: str, characteristics: dict[str, str], confidence: float
|
|
521
|
+
) -> WorkflowMismatchWarning:
|
|
522
|
+
"""
|
|
523
|
+
Create mismatch warning with recommendations.
|
|
524
|
+
|
|
525
|
+
Args:
|
|
526
|
+
workflow: Current workflow specified by user
|
|
527
|
+
characteristics: Detected task characteristics
|
|
528
|
+
confidence: Confidence score
|
|
529
|
+
|
|
530
|
+
Returns:
|
|
531
|
+
WorkflowMismatchWarning with recommendations
|
|
532
|
+
"""
|
|
533
|
+
# Recommend workflow based on intent
|
|
534
|
+
recommended = {
|
|
535
|
+
"bug_fix": "*fix",
|
|
536
|
+
"feature": "*build",
|
|
537
|
+
"enhancement": "*build",
|
|
538
|
+
"architectural": "*full",
|
|
539
|
+
"framework_dev": "*full",
|
|
540
|
+
}.get(characteristics["intent"], "*build")
|
|
541
|
+
|
|
542
|
+
# Estimate token savings
|
|
543
|
+
current_steps = WORKFLOW_REQUIREMENTS[workflow]["steps"]
|
|
544
|
+
recommended_steps = WORKFLOW_REQUIREMENTS.get(recommended, {}).get("steps", 4)
|
|
545
|
+
step_difference = current_steps - recommended_steps
|
|
546
|
+
token_savings = max(0, step_difference * 10000) # ~10K tokens per step
|
|
547
|
+
time_savings = max(0, step_difference * 5) # ~5 minutes per step
|
|
548
|
+
|
|
549
|
+
reason = (
|
|
550
|
+
f"*{workflow.lstrip('*')} workflow is designed for: "
|
|
551
|
+
f"{WORKFLOW_REQUIREMENTS[workflow]['description']}"
|
|
552
|
+
)
|
|
553
|
+
|
|
554
|
+
return WorkflowMismatchWarning(
|
|
555
|
+
detected_intent=characteristics["intent"],
|
|
556
|
+
detected_scope=characteristics["scope"],
|
|
557
|
+
detected_complexity=characteristics["complexity"],
|
|
558
|
+
recommended_workflow=recommended,
|
|
559
|
+
confidence=confidence,
|
|
560
|
+
reason=reason,
|
|
561
|
+
token_savings=token_savings,
|
|
562
|
+
time_savings=time_savings,
|
|
563
|
+
)
|
|
564
|
+
|
|
565
|
+
def _display_mismatch_warning(
|
|
566
|
+
self, warning: WorkflowMismatchWarning, current_workflow: str
|
|
567
|
+
) -> None:
|
|
568
|
+
"""
|
|
569
|
+
Display formatted warning to user.
|
|
570
|
+
|
|
571
|
+
Args:
|
|
572
|
+
warning: Workflow mismatch warning
|
|
573
|
+
current_workflow: Current workflow specified by user
|
|
574
|
+
"""
|
|
575
|
+
print("\n" + "=" * 70)
|
|
576
|
+
print(warning.format_warning())
|
|
577
|
+
print("=" * 70)
|
|
578
|
+
print(f"\nProceed with {current_workflow}? [y/N/switch]")
|
|
579
|
+
|
|
580
|
+
def _prompt_user_choice(
|
|
581
|
+
self, warning: WorkflowMismatchWarning, current_workflow: str
|
|
582
|
+
) -> str:
|
|
583
|
+
"""
|
|
584
|
+
Prompt user for choice.
|
|
585
|
+
|
|
586
|
+
Args:
|
|
587
|
+
warning: Workflow mismatch warning
|
|
588
|
+
current_workflow: Current workflow specified by user
|
|
589
|
+
|
|
590
|
+
Returns:
|
|
591
|
+
"y" (proceed), "N" (cancel), or "switch" (use recommended)
|
|
592
|
+
"""
|
|
593
|
+
while True:
|
|
594
|
+
try:
|
|
595
|
+
choice = input("> ").strip().lower()
|
|
596
|
+
|
|
597
|
+
if choice in ("y", "yes"):
|
|
598
|
+
return "y"
|
|
599
|
+
elif choice in ("n", "no", ""):
|
|
600
|
+
return "N"
|
|
601
|
+
elif choice in ("s", "switch"):
|
|
602
|
+
return "switch"
|
|
603
|
+
else:
|
|
604
|
+
print("Invalid choice. Enter y (proceed), N (cancel), or switch.")
|
|
605
|
+
except (KeyboardInterrupt, EOFError):
|
|
606
|
+
print("\nCancelled by user")
|
|
607
|
+
return "N"
|
|
608
|
+
|
|
609
|
+
def _workflow_to_intent_type(self, workflow: str) -> IntentType | None:
|
|
610
|
+
"""
|
|
611
|
+
Convert workflow name to IntentType.
|
|
612
|
+
|
|
613
|
+
Args:
|
|
614
|
+
workflow: Workflow name ("*fix", "*build", etc.)
|
|
615
|
+
|
|
616
|
+
Returns:
|
|
617
|
+
IntentType or None if unknown
|
|
618
|
+
"""
|
|
619
|
+
mapping = {
|
|
620
|
+
"*fix": IntentType.FIX,
|
|
621
|
+
"*build": IntentType.BUILD,
|
|
622
|
+
"*full": IntentType.BUILD, # Full SDLC maps to build
|
|
623
|
+
"*review": IntentType.REVIEW,
|
|
624
|
+
"*test": IntentType.TEST,
|
|
625
|
+
"*refactor": IntentType.REFACTOR,
|
|
626
|
+
}
|
|
627
|
+
return mapping.get(workflow)
|
|
628
|
+
|
|
629
|
+
def is_simple_mode_enabled(self) -> bool:
|
|
630
|
+
"""Check if Simple Mode is enabled."""
|
|
631
|
+
return self.config.simple_mode.enabled
|
|
632
|
+
|
|
633
|
+
def is_simple_mode_available(self) -> bool:
|
|
634
|
+
"""
|
|
635
|
+
Check if Simple Mode is available and enabled.
|
|
636
|
+
|
|
637
|
+
Returns:
|
|
638
|
+
True if Simple Mode is available, False otherwise
|
|
639
|
+
"""
|
|
640
|
+
return self.config.simple_mode.enabled
|
|
641
|
+
|
|
642
|
+
def _analyze_prompt(self, command: str, intent: Intent) -> PromptAnalysis:
|
|
643
|
+
"""
|
|
644
|
+
Analyze prompt for intelligent workflow selection.
|
|
645
|
+
|
|
646
|
+
Args:
|
|
647
|
+
command: User's command
|
|
648
|
+
intent: Parsed intent
|
|
649
|
+
|
|
650
|
+
Returns:
|
|
651
|
+
PromptAnalysis with recommendations
|
|
652
|
+
"""
|
|
653
|
+
# Extract command type from intent
|
|
654
|
+
command_type = f"*{intent.type.value}" if intent.type else None
|
|
655
|
+
|
|
656
|
+
# Analyze prompt
|
|
657
|
+
analysis = self.prompt_analyzer.analyze(command, command_type)
|
|
658
|
+
|
|
659
|
+
# Log analysis for visibility
|
|
660
|
+
if analysis.intent_confidence >= 0.7:
|
|
661
|
+
print("\nš Prompt Analysis:")
|
|
662
|
+
print(f" Intent: {analysis.primary_intent.value} ({analysis.intent_confidence:.0%} confidence)")
|
|
663
|
+
print(f" Complexity: {analysis.complexity.value} ({analysis.word_count} words)")
|
|
664
|
+
if analysis.has_existing_code:
|
|
665
|
+
print(f" Existing Code: Yes ({len(analysis.existing_code_refs)} references)")
|
|
666
|
+
print(f" Recommended Workflow: {analysis.recommended_workflow}")
|
|
667
|
+
print(f" Recommended Enhancement: {analysis.recommended_enhancement}")
|
|
668
|
+
print(f" Recommended Preset: {analysis.recommended_preset}")
|
|
669
|
+
print(f" Rationale: {analysis.analysis_rationale}\n")
|
|
670
|
+
|
|
671
|
+
return analysis
|
|
672
|
+
|
|
673
|
+
def _generate_workflow_suggestion(self, analysis: PromptAnalysis, current_command: str) -> str:
|
|
674
|
+
"""
|
|
675
|
+
Generate workflow suggestion message based on analysis.
|
|
676
|
+
|
|
677
|
+
Args:
|
|
678
|
+
analysis: Prompt analysis result
|
|
679
|
+
current_command: Current command being executed
|
|
680
|
+
|
|
681
|
+
Returns:
|
|
682
|
+
Formatted suggestion message
|
|
683
|
+
"""
|
|
684
|
+
return f"""
|
|
685
|
+
š¤ Workflow Suggestion:
|
|
686
|
+
|
|
687
|
+
Detected existing code reference in your prompt.
|
|
688
|
+
|
|
689
|
+
**Suggested Workflow:** @simple-mode *{analysis.recommended_workflow} "{analysis.primary_intent.value}"
|
|
690
|
+
|
|
691
|
+
**Benefits:**
|
|
692
|
+
ā
Validates existing implementation
|
|
693
|
+
ā
Identifies optimizations
|
|
694
|
+
ā
50% faster (skips duplicate code generation)
|
|
695
|
+
ā
Focused recommendations
|
|
696
|
+
|
|
697
|
+
**Current Command:** {current_command}
|
|
698
|
+
|
|
699
|
+
**Recommendation:** Use *{analysis.recommended_workflow} for comparison tasks.
|
|
700
|
+
""".strip()
|