tapps-agents 3.6.0__py3-none-any.whl → 3.6.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- tapps_agents/__init__.py +2 -2
- tapps_agents/agents/__init__.py +22 -22
- tapps_agents/agents/analyst/__init__.py +5 -5
- tapps_agents/agents/architect/__init__.py +5 -5
- tapps_agents/agents/architect/agent.py +1033 -1033
- tapps_agents/agents/architect/pattern_detector.py +75 -75
- tapps_agents/agents/cleanup/__init__.py +7 -7
- tapps_agents/agents/cleanup/agent.py +445 -445
- tapps_agents/agents/debugger/__init__.py +7 -7
- tapps_agents/agents/debugger/agent.py +310 -310
- tapps_agents/agents/debugger/error_analyzer.py +437 -437
- tapps_agents/agents/designer/__init__.py +5 -5
- tapps_agents/agents/designer/agent.py +786 -786
- tapps_agents/agents/designer/visual_designer.py +638 -638
- tapps_agents/agents/documenter/__init__.py +7 -7
- tapps_agents/agents/documenter/agent.py +531 -531
- tapps_agents/agents/documenter/doc_generator.py +472 -472
- tapps_agents/agents/documenter/doc_validator.py +393 -393
- tapps_agents/agents/documenter/framework_doc_updater.py +493 -493
- tapps_agents/agents/enhancer/__init__.py +7 -7
- tapps_agents/agents/evaluator/__init__.py +7 -7
- tapps_agents/agents/evaluator/agent.py +443 -443
- tapps_agents/agents/evaluator/priority_evaluator.py +641 -641
- tapps_agents/agents/evaluator/quality_analyzer.py +147 -147
- tapps_agents/agents/evaluator/report_generator.py +344 -344
- tapps_agents/agents/evaluator/usage_analyzer.py +192 -192
- tapps_agents/agents/evaluator/workflow_analyzer.py +189 -189
- tapps_agents/agents/implementer/__init__.py +7 -7
- tapps_agents/agents/implementer/agent.py +798 -798
- tapps_agents/agents/implementer/auto_fix.py +1119 -1119
- tapps_agents/agents/implementer/code_generator.py +73 -73
- tapps_agents/agents/improver/__init__.py +1 -1
- tapps_agents/agents/improver/agent.py +753 -753
- tapps_agents/agents/ops/__init__.py +1 -1
- tapps_agents/agents/ops/agent.py +619 -619
- tapps_agents/agents/ops/dependency_analyzer.py +600 -600
- tapps_agents/agents/orchestrator/__init__.py +5 -5
- tapps_agents/agents/orchestrator/agent.py +522 -522
- tapps_agents/agents/planner/__init__.py +7 -7
- tapps_agents/agents/planner/agent.py +1127 -1127
- tapps_agents/agents/reviewer/__init__.py +24 -24
- tapps_agents/agents/reviewer/agent.py +3513 -3513
- tapps_agents/agents/reviewer/aggregator.py +213 -213
- tapps_agents/agents/reviewer/batch_review.py +448 -448
- tapps_agents/agents/reviewer/cache.py +443 -443
- tapps_agents/agents/reviewer/context7_enhancer.py +630 -630
- tapps_agents/agents/reviewer/context_detector.py +203 -203
- tapps_agents/agents/reviewer/docker_compose_validator.py +158 -158
- tapps_agents/agents/reviewer/dockerfile_validator.py +176 -176
- tapps_agents/agents/reviewer/error_handling.py +126 -126
- tapps_agents/agents/reviewer/feedback_generator.py +490 -490
- tapps_agents/agents/reviewer/influxdb_validator.py +316 -316
- tapps_agents/agents/reviewer/issue_tracking.py +169 -169
- tapps_agents/agents/reviewer/library_detector.py +295 -295
- tapps_agents/agents/reviewer/library_patterns.py +268 -268
- tapps_agents/agents/reviewer/maintainability_scorer.py +593 -593
- tapps_agents/agents/reviewer/metric_strategies.py +276 -276
- tapps_agents/agents/reviewer/mqtt_validator.py +160 -160
- tapps_agents/agents/reviewer/output_enhancer.py +105 -105
- tapps_agents/agents/reviewer/pattern_detector.py +241 -241
- tapps_agents/agents/reviewer/performance_scorer.py +357 -357
- tapps_agents/agents/reviewer/phased_review.py +516 -516
- tapps_agents/agents/reviewer/progressive_review.py +435 -435
- tapps_agents/agents/reviewer/react_scorer.py +331 -331
- tapps_agents/agents/reviewer/score_constants.py +228 -228
- tapps_agents/agents/reviewer/score_validator.py +507 -507
- tapps_agents/agents/reviewer/scorer_registry.py +373 -373
- tapps_agents/agents/reviewer/service_discovery.py +534 -534
- tapps_agents/agents/reviewer/tools/parallel_executor.py +581 -581
- tapps_agents/agents/reviewer/tools/ruff_grouping.py +250 -250
- tapps_agents/agents/reviewer/tools/scoped_mypy.py +284 -284
- tapps_agents/agents/reviewer/typescript_scorer.py +1142 -1142
- tapps_agents/agents/reviewer/validation.py +208 -208
- tapps_agents/agents/reviewer/websocket_validator.py +132 -132
- tapps_agents/agents/tester/__init__.py +7 -7
- tapps_agents/agents/tester/accessibility_auditor.py +309 -309
- tapps_agents/agents/tester/agent.py +1080 -1080
- tapps_agents/agents/tester/batch_generator.py +54 -54
- tapps_agents/agents/tester/context_learner.py +51 -51
- tapps_agents/agents/tester/coverage_analyzer.py +386 -386
- tapps_agents/agents/tester/coverage_test_generator.py +290 -290
- tapps_agents/agents/tester/debug_enhancer.py +238 -238
- tapps_agents/agents/tester/device_emulator.py +241 -241
- tapps_agents/agents/tester/integration_generator.py +62 -62
- tapps_agents/agents/tester/network_recorder.py +300 -300
- tapps_agents/agents/tester/performance_monitor.py +320 -320
- tapps_agents/agents/tester/test_fixer.py +316 -316
- tapps_agents/agents/tester/test_generator.py +632 -632
- tapps_agents/agents/tester/trace_manager.py +234 -234
- tapps_agents/agents/tester/visual_regression.py +291 -291
- tapps_agents/analysis/pattern_detector.py +36 -36
- tapps_agents/beads/hydration.py +213 -213
- tapps_agents/beads/parse.py +32 -32
- tapps_agents/beads/specs.py +206 -206
- tapps_agents/cli/__init__.py +9 -9
- tapps_agents/cli/__main__.py +8 -8
- tapps_agents/cli/base.py +478 -478
- tapps_agents/cli/command_classifier.py +72 -72
- tapps_agents/cli/commands/__init__.py +2 -2
- tapps_agents/cli/commands/analyst.py +173 -173
- tapps_agents/cli/commands/architect.py +109 -109
- tapps_agents/cli/commands/cleanup_agent.py +92 -92
- tapps_agents/cli/commands/common.py +126 -126
- tapps_agents/cli/commands/debugger.py +90 -90
- tapps_agents/cli/commands/designer.py +112 -112
- tapps_agents/cli/commands/documenter.py +136 -136
- tapps_agents/cli/commands/enhancer.py +110 -110
- tapps_agents/cli/commands/evaluator.py +255 -255
- tapps_agents/cli/commands/implementer.py +301 -301
- tapps_agents/cli/commands/improver.py +91 -91
- tapps_agents/cli/commands/knowledge.py +111 -111
- tapps_agents/cli/commands/learning.py +172 -172
- tapps_agents/cli/commands/observability.py +283 -283
- tapps_agents/cli/commands/ops.py +135 -135
- tapps_agents/cli/commands/orchestrator.py +116 -116
- tapps_agents/cli/commands/planner.py +237 -237
- tapps_agents/cli/commands/reviewer.py +1872 -1872
- tapps_agents/cli/commands/status.py +285 -285
- tapps_agents/cli/commands/task.py +227 -227
- tapps_agents/cli/commands/tester.py +191 -191
- tapps_agents/cli/feedback.py +936 -936
- tapps_agents/cli/formatters.py +608 -608
- tapps_agents/cli/help/__init__.py +7 -7
- tapps_agents/cli/help/static_help.py +425 -425
- tapps_agents/cli/network_detection.py +110 -110
- tapps_agents/cli/output_compactor.py +274 -274
- tapps_agents/cli/parsers/__init__.py +2 -2
- tapps_agents/cli/parsers/analyst.py +186 -186
- tapps_agents/cli/parsers/architect.py +167 -167
- tapps_agents/cli/parsers/cleanup_agent.py +228 -228
- tapps_agents/cli/parsers/debugger.py +116 -116
- tapps_agents/cli/parsers/designer.py +182 -182
- tapps_agents/cli/parsers/documenter.py +134 -134
- tapps_agents/cli/parsers/enhancer.py +113 -113
- tapps_agents/cli/parsers/evaluator.py +213 -213
- tapps_agents/cli/parsers/implementer.py +168 -168
- tapps_agents/cli/parsers/improver.py +132 -132
- tapps_agents/cli/parsers/ops.py +159 -159
- tapps_agents/cli/parsers/orchestrator.py +98 -98
- tapps_agents/cli/parsers/planner.py +145 -145
- tapps_agents/cli/parsers/reviewer.py +462 -462
- tapps_agents/cli/parsers/tester.py +124 -124
- tapps_agents/cli/progress_heartbeat.py +254 -254
- tapps_agents/cli/streaming_progress.py +336 -336
- tapps_agents/cli/utils/__init__.py +6 -6
- tapps_agents/cli/utils/agent_lifecycle.py +48 -48
- tapps_agents/cli/utils/error_formatter.py +82 -82
- tapps_agents/cli/utils/error_recovery.py +188 -188
- tapps_agents/cli/utils/output_handler.py +59 -59
- tapps_agents/cli/utils/prompt_enhancer.py +319 -319
- tapps_agents/cli/validators/__init__.py +9 -9
- tapps_agents/cli/validators/command_validator.py +81 -81
- tapps_agents/context7/__init__.py +112 -112
- tapps_agents/context7/agent_integration.py +869 -869
- tapps_agents/context7/analytics.py +382 -382
- tapps_agents/context7/analytics_dashboard.py +299 -299
- tapps_agents/context7/async_cache.py +681 -681
- tapps_agents/context7/backup_client.py +958 -958
- tapps_agents/context7/cache_locking.py +194 -194
- tapps_agents/context7/cache_metadata.py +214 -214
- tapps_agents/context7/cache_prewarm.py +488 -488
- tapps_agents/context7/cache_structure.py +168 -168
- tapps_agents/context7/cache_warming.py +604 -604
- tapps_agents/context7/circuit_breaker.py +376 -376
- tapps_agents/context7/cleanup.py +461 -461
- tapps_agents/context7/commands.py +858 -858
- tapps_agents/context7/credential_validation.py +276 -276
- tapps_agents/context7/cross_reference_resolver.py +168 -168
- tapps_agents/context7/cross_references.py +424 -424
- tapps_agents/context7/doc_manager.py +225 -225
- tapps_agents/context7/fuzzy_matcher.py +369 -369
- tapps_agents/context7/kb_cache.py +404 -404
- tapps_agents/context7/language_detector.py +219 -219
- tapps_agents/context7/library_detector.py +725 -725
- tapps_agents/context7/lookup.py +738 -738
- tapps_agents/context7/metadata.py +258 -258
- tapps_agents/context7/refresh_queue.py +300 -300
- tapps_agents/context7/security.py +373 -373
- tapps_agents/context7/staleness_policies.py +278 -278
- tapps_agents/context7/tiles_integration.py +47 -47
- tapps_agents/continuous_bug_fix/__init__.py +20 -20
- tapps_agents/continuous_bug_fix/bug_finder.py +306 -306
- tapps_agents/continuous_bug_fix/bug_fix_coordinator.py +177 -177
- tapps_agents/continuous_bug_fix/commit_manager.py +178 -178
- tapps_agents/continuous_bug_fix/continuous_bug_fixer.py +322 -322
- tapps_agents/continuous_bug_fix/proactive_bug_finder.py +285 -285
- tapps_agents/core/__init__.py +298 -298
- tapps_agents/core/adaptive_cache_config.py +432 -432
- tapps_agents/core/agent_base.py +647 -647
- tapps_agents/core/agent_cache.py +466 -466
- tapps_agents/core/agent_learning.py +1865 -1865
- tapps_agents/core/analytics_dashboard.py +563 -563
- tapps_agents/core/analytics_enhancements.py +597 -597
- tapps_agents/core/anonymization.py +274 -274
- tapps_agents/core/ast_parser.py +228 -228
- tapps_agents/core/async_file_ops.py +402 -402
- tapps_agents/core/best_practice_consultant.py +299 -299
- tapps_agents/core/brownfield_analyzer.py +299 -299
- tapps_agents/core/brownfield_review.py +541 -541
- tapps_agents/core/browser_controller.py +513 -513
- tapps_agents/core/capability_registry.py +418 -418
- tapps_agents/core/change_impact_analyzer.py +190 -190
- tapps_agents/core/checkpoint_manager.py +377 -377
- tapps_agents/core/code_generator.py +329 -329
- tapps_agents/core/code_validator.py +276 -276
- tapps_agents/core/command_registry.py +327 -327
- tapps_agents/core/context_gathering/__init__.py +2 -2
- tapps_agents/core/context_gathering/repository_explorer.py +28 -28
- tapps_agents/core/context_intelligence/__init__.py +2 -2
- tapps_agents/core/context_intelligence/relevance_scorer.py +24 -24
- tapps_agents/core/context_intelligence/token_budget_manager.py +27 -27
- tapps_agents/core/context_manager.py +240 -240
- tapps_agents/core/cursor_feedback_monitor.py +146 -146
- tapps_agents/core/cursor_verification.py +290 -290
- tapps_agents/core/customization_loader.py +280 -280
- tapps_agents/core/customization_schema.py +260 -260
- tapps_agents/core/customization_template.py +238 -238
- tapps_agents/core/debug_logger.py +124 -124
- tapps_agents/core/design_validator.py +298 -298
- tapps_agents/core/diagram_generator.py +226 -226
- tapps_agents/core/docker_utils.py +232 -232
- tapps_agents/core/document_generator.py +617 -617
- tapps_agents/core/domain_detector.py +30 -30
- tapps_agents/core/error_envelope.py +454 -454
- tapps_agents/core/error_handler.py +270 -270
- tapps_agents/core/estimation_tracker.py +189 -189
- tapps_agents/core/eval_prompt_engine.py +116 -116
- tapps_agents/core/evaluation_base.py +119 -119
- tapps_agents/core/evaluation_models.py +320 -320
- tapps_agents/core/evaluation_orchestrator.py +225 -225
- tapps_agents/core/evaluators/__init__.py +7 -7
- tapps_agents/core/evaluators/architectural_evaluator.py +205 -205
- tapps_agents/core/evaluators/behavioral_evaluator.py +160 -160
- tapps_agents/core/evaluators/performance_profile_evaluator.py +160 -160
- tapps_agents/core/evaluators/security_posture_evaluator.py +148 -148
- tapps_agents/core/evaluators/spec_compliance_evaluator.py +181 -181
- tapps_agents/core/exceptions.py +107 -107
- tapps_agents/core/expert_config_generator.py +293 -293
- tapps_agents/core/export_schema.py +202 -202
- tapps_agents/core/external_feedback_models.py +102 -102
- tapps_agents/core/external_feedback_storage.py +213 -213
- tapps_agents/core/fallback_strategy.py +314 -314
- tapps_agents/core/feedback_analyzer.py +162 -162
- tapps_agents/core/feedback_collector.py +178 -178
- tapps_agents/core/git_operations.py +445 -445
- tapps_agents/core/hardware_profiler.py +151 -151
- tapps_agents/core/instructions.py +324 -324
- tapps_agents/core/io_guardrails.py +69 -69
- tapps_agents/core/issue_manifest.py +249 -249
- tapps_agents/core/issue_schema.py +139 -139
- tapps_agents/core/json_utils.py +128 -128
- tapps_agents/core/knowledge_graph.py +446 -446
- tapps_agents/core/language_detector.py +296 -296
- tapps_agents/core/learning_confidence.py +242 -242
- tapps_agents/core/learning_dashboard.py +246 -246
- tapps_agents/core/learning_decision.py +384 -384
- tapps_agents/core/learning_explainability.py +578 -578
- tapps_agents/core/learning_export.py +287 -287
- tapps_agents/core/learning_integration.py +228 -228
- tapps_agents/core/llm_behavior.py +232 -232
- tapps_agents/core/long_duration_support.py +786 -786
- tapps_agents/core/mcp_setup.py +106 -106
- tapps_agents/core/memory_integration.py +396 -396
- tapps_agents/core/meta_learning.py +666 -666
- tapps_agents/core/module_path_sanitizer.py +199 -199
- tapps_agents/core/multi_agent_orchestrator.py +382 -382
- tapps_agents/core/network_errors.py +125 -125
- tapps_agents/core/nfr_validator.py +336 -336
- tapps_agents/core/offline_mode.py +158 -158
- tapps_agents/core/output_contracts.py +300 -300
- tapps_agents/core/output_formatter.py +300 -300
- tapps_agents/core/path_normalizer.py +174 -174
- tapps_agents/core/path_validator.py +322 -322
- tapps_agents/core/pattern_library.py +250 -250
- tapps_agents/core/performance_benchmark.py +301 -301
- tapps_agents/core/performance_monitor.py +184 -184
- tapps_agents/core/playwright_mcp_controller.py +771 -771
- tapps_agents/core/policy_loader.py +135 -135
- tapps_agents/core/progress.py +166 -166
- tapps_agents/core/project_profile.py +354 -354
- tapps_agents/core/project_type_detector.py +454 -454
- tapps_agents/core/prompt_base.py +223 -223
- tapps_agents/core/prompt_learning/__init__.py +2 -2
- tapps_agents/core/prompt_learning/learning_loop.py +24 -24
- tapps_agents/core/prompt_learning/project_prompt_store.py +25 -25
- tapps_agents/core/prompt_learning/skills_prompt_analyzer.py +35 -35
- tapps_agents/core/prompt_optimization/__init__.py +6 -6
- tapps_agents/core/prompt_optimization/ab_tester.py +114 -114
- tapps_agents/core/prompt_optimization/correlation_analyzer.py +160 -160
- tapps_agents/core/prompt_optimization/progressive_refiner.py +129 -129
- tapps_agents/core/prompt_optimization/prompt_library.py +37 -37
- tapps_agents/core/requirements_evaluator.py +431 -431
- tapps_agents/core/resource_aware_executor.py +449 -449
- tapps_agents/core/resource_monitor.py +343 -343
- tapps_agents/core/resume_handler.py +298 -298
- tapps_agents/core/retry_handler.py +197 -197
- tapps_agents/core/review_checklists.py +479 -479
- tapps_agents/core/role_loader.py +201 -201
- tapps_agents/core/role_template_loader.py +201 -201
- tapps_agents/core/runtime_mode.py +60 -60
- tapps_agents/core/security_scanner.py +342 -342
- tapps_agents/core/skill_agent_registry.py +194 -194
- tapps_agents/core/skill_integration.py +208 -208
- tapps_agents/core/skill_loader.py +492 -492
- tapps_agents/core/skill_template.py +341 -341
- tapps_agents/core/skill_validator.py +478 -478
- tapps_agents/core/stack_analyzer.py +35 -35
- tapps_agents/core/startup.py +174 -174
- tapps_agents/core/storage_manager.py +397 -397
- tapps_agents/core/storage_models.py +166 -166
- tapps_agents/core/story_evaluator.py +410 -410
- tapps_agents/core/subprocess_utils.py +170 -170
- tapps_agents/core/task_duration.py +296 -296
- tapps_agents/core/task_memory.py +582 -582
- tapps_agents/core/task_state.py +226 -226
- tapps_agents/core/tech_stack_priorities.py +208 -208
- tapps_agents/core/temp_directory.py +194 -194
- tapps_agents/core/template_merger.py +600 -600
- tapps_agents/core/template_selector.py +280 -280
- tapps_agents/core/test_generator.py +286 -286
- tapps_agents/core/tiered_context.py +253 -253
- tapps_agents/core/token_monitor.py +345 -345
- tapps_agents/core/traceability.py +254 -254
- tapps_agents/core/trajectory_tracker.py +50 -50
- tapps_agents/core/unicode_safe.py +143 -143
- tapps_agents/core/unified_cache_config.py +170 -170
- tapps_agents/core/unified_state.py +324 -324
- tapps_agents/core/validate_cursor_setup.py +237 -237
- tapps_agents/core/validation_registry.py +136 -136
- tapps_agents/core/validators/__init__.py +4 -4
- tapps_agents/core/validators/python_validator.py +87 -87
- tapps_agents/core/verification_agent.py +90 -90
- tapps_agents/core/visual_feedback.py +644 -644
- tapps_agents/core/workflow_validator.py +197 -197
- tapps_agents/core/worktree.py +367 -367
- tapps_agents/docker/__init__.py +10 -10
- tapps_agents/docker/analyzer.py +186 -186
- tapps_agents/docker/debugger.py +229 -229
- tapps_agents/docker/error_patterns.py +216 -216
- tapps_agents/epic/__init__.py +22 -22
- tapps_agents/epic/beads_sync.py +115 -115
- tapps_agents/epic/markdown_sync.py +105 -105
- tapps_agents/epic/models.py +96 -96
- tapps_agents/experts/__init__.py +163 -163
- tapps_agents/experts/agent_integration.py +243 -243
- tapps_agents/experts/auto_generator.py +331 -331
- tapps_agents/experts/base_expert.py +536 -536
- tapps_agents/experts/builtin_registry.py +261 -261
- tapps_agents/experts/business_metrics.py +565 -565
- tapps_agents/experts/cache.py +266 -266
- tapps_agents/experts/confidence_breakdown.py +306 -306
- tapps_agents/experts/confidence_calculator.py +336 -336
- tapps_agents/experts/confidence_metrics.py +236 -236
- tapps_agents/experts/domain_config.py +311 -311
- tapps_agents/experts/domain_detector.py +550 -550
- tapps_agents/experts/domain_utils.py +84 -84
- tapps_agents/experts/expert_config.py +113 -113
- tapps_agents/experts/expert_engine.py +465 -465
- tapps_agents/experts/expert_registry.py +744 -744
- tapps_agents/experts/expert_synthesizer.py +70 -70
- tapps_agents/experts/governance.py +197 -197
- tapps_agents/experts/history_logger.py +312 -312
- tapps_agents/experts/knowledge/README.md +180 -180
- tapps_agents/experts/knowledge/accessibility/accessible-forms.md +331 -331
- tapps_agents/experts/knowledge/accessibility/aria-patterns.md +344 -344
- tapps_agents/experts/knowledge/accessibility/color-contrast.md +285 -285
- tapps_agents/experts/knowledge/accessibility/keyboard-navigation.md +332 -332
- tapps_agents/experts/knowledge/accessibility/screen-readers.md +282 -282
- tapps_agents/experts/knowledge/accessibility/semantic-html.md +355 -355
- tapps_agents/experts/knowledge/accessibility/testing-accessibility.md +369 -369
- tapps_agents/experts/knowledge/accessibility/wcag-2.1.md +296 -296
- tapps_agents/experts/knowledge/accessibility/wcag-2.2.md +211 -211
- tapps_agents/experts/knowledge/agent-learning/best-practices.md +715 -715
- tapps_agents/experts/knowledge/agent-learning/pattern-extraction.md +282 -282
- tapps_agents/experts/knowledge/agent-learning/prompt-optimization.md +320 -320
- tapps_agents/experts/knowledge/ai-frameworks/model-optimization.md +90 -90
- tapps_agents/experts/knowledge/ai-frameworks/openvino-patterns.md +260 -260
- tapps_agents/experts/knowledge/api-design-integration/api-gateway-patterns.md +309 -309
- tapps_agents/experts/knowledge/api-design-integration/api-security-patterns.md +521 -521
- tapps_agents/experts/knowledge/api-design-integration/api-versioning.md +421 -421
- tapps_agents/experts/knowledge/api-design-integration/async-protocol-patterns.md +61 -61
- tapps_agents/experts/knowledge/api-design-integration/contract-testing.md +221 -221
- tapps_agents/experts/knowledge/api-design-integration/external-api-integration.md +489 -489
- tapps_agents/experts/knowledge/api-design-integration/fastapi-patterns.md +360 -360
- tapps_agents/experts/knowledge/api-design-integration/fastapi-testing.md +262 -262
- tapps_agents/experts/knowledge/api-design-integration/graphql-patterns.md +582 -582
- tapps_agents/experts/knowledge/api-design-integration/grpc-best-practices.md +499 -499
- tapps_agents/experts/knowledge/api-design-integration/mqtt-patterns.md +455 -455
- tapps_agents/experts/knowledge/api-design-integration/rate-limiting.md +507 -507
- tapps_agents/experts/knowledge/api-design-integration/restful-api-design.md +618 -618
- tapps_agents/experts/knowledge/api-design-integration/websocket-patterns.md +480 -480
- tapps_agents/experts/knowledge/cloud-infrastructure/cloud-native-patterns.md +175 -175
- tapps_agents/experts/knowledge/cloud-infrastructure/container-health-checks.md +261 -261
- tapps_agents/experts/knowledge/cloud-infrastructure/containerization.md +222 -222
- tapps_agents/experts/knowledge/cloud-infrastructure/cost-optimization.md +122 -122
- tapps_agents/experts/knowledge/cloud-infrastructure/disaster-recovery.md +153 -153
- tapps_agents/experts/knowledge/cloud-infrastructure/dockerfile-patterns.md +285 -285
- tapps_agents/experts/knowledge/cloud-infrastructure/infrastructure-as-code.md +187 -187
- tapps_agents/experts/knowledge/cloud-infrastructure/kubernetes-patterns.md +253 -253
- tapps_agents/experts/knowledge/cloud-infrastructure/multi-cloud-strategies.md +155 -155
- tapps_agents/experts/knowledge/cloud-infrastructure/serverless-architecture.md +200 -200
- tapps_agents/experts/knowledge/code-quality-analysis/README.md +16 -16
- tapps_agents/experts/knowledge/code-quality-analysis/code-metrics.md +137 -137
- tapps_agents/experts/knowledge/code-quality-analysis/complexity-analysis.md +181 -181
- tapps_agents/experts/knowledge/code-quality-analysis/technical-debt-patterns.md +191 -191
- tapps_agents/experts/knowledge/data-privacy-compliance/anonymization.md +313 -313
- tapps_agents/experts/knowledge/data-privacy-compliance/ccpa.md +255 -255
- tapps_agents/experts/knowledge/data-privacy-compliance/consent-management.md +282 -282
- tapps_agents/experts/knowledge/data-privacy-compliance/data-minimization.md +275 -275
- tapps_agents/experts/knowledge/data-privacy-compliance/data-retention.md +297 -297
- tapps_agents/experts/knowledge/data-privacy-compliance/data-subject-rights.md +383 -383
- tapps_agents/experts/knowledge/data-privacy-compliance/encryption-privacy.md +285 -285
- tapps_agents/experts/knowledge/data-privacy-compliance/gdpr.md +344 -344
- tapps_agents/experts/knowledge/data-privacy-compliance/hipaa.md +385 -385
- tapps_agents/experts/knowledge/data-privacy-compliance/privacy-by-design.md +280 -280
- tapps_agents/experts/knowledge/database-data-management/acid-vs-cap.md +164 -164
- tapps_agents/experts/knowledge/database-data-management/backup-and-recovery.md +182 -182
- tapps_agents/experts/knowledge/database-data-management/data-modeling.md +172 -172
- tapps_agents/experts/knowledge/database-data-management/database-design.md +187 -187
- tapps_agents/experts/knowledge/database-data-management/flux-query-optimization.md +342 -342
- tapps_agents/experts/knowledge/database-data-management/influxdb-connection-patterns.md +432 -432
- tapps_agents/experts/knowledge/database-data-management/influxdb-patterns.md +442 -442
- tapps_agents/experts/knowledge/database-data-management/migration-strategies.md +216 -216
- tapps_agents/experts/knowledge/database-data-management/nosql-patterns.md +259 -259
- tapps_agents/experts/knowledge/database-data-management/scalability-patterns.md +184 -184
- tapps_agents/experts/knowledge/database-data-management/sql-optimization.md +175 -175
- tapps_agents/experts/knowledge/database-data-management/time-series-modeling.md +444 -444
- tapps_agents/experts/knowledge/development-workflow/README.md +16 -16
- tapps_agents/experts/knowledge/development-workflow/automation-best-practices.md +216 -216
- tapps_agents/experts/knowledge/development-workflow/build-strategies.md +198 -198
- tapps_agents/experts/knowledge/development-workflow/deployment-patterns.md +205 -205
- tapps_agents/experts/knowledge/development-workflow/git-workflows.md +205 -205
- tapps_agents/experts/knowledge/documentation-knowledge-management/README.md +16 -16
- tapps_agents/experts/knowledge/documentation-knowledge-management/api-documentation-patterns.md +231 -231
- tapps_agents/experts/knowledge/documentation-knowledge-management/documentation-standards.md +191 -191
- tapps_agents/experts/knowledge/documentation-knowledge-management/knowledge-management.md +171 -171
- tapps_agents/experts/knowledge/documentation-knowledge-management/technical-writing-guide.md +192 -192
- tapps_agents/experts/knowledge/observability-monitoring/alerting-patterns.md +461 -461
- tapps_agents/experts/knowledge/observability-monitoring/apm-tools.md +459 -459
- tapps_agents/experts/knowledge/observability-monitoring/distributed-tracing.md +367 -367
- tapps_agents/experts/knowledge/observability-monitoring/logging-strategies.md +478 -478
- tapps_agents/experts/knowledge/observability-monitoring/metrics-and-monitoring.md +510 -510
- tapps_agents/experts/knowledge/observability-monitoring/observability-best-practices.md +492 -492
- tapps_agents/experts/knowledge/observability-monitoring/open-telemetry.md +573 -573
- tapps_agents/experts/knowledge/observability-monitoring/slo-sli-sla.md +419 -419
- tapps_agents/experts/knowledge/performance/anti-patterns.md +284 -284
- tapps_agents/experts/knowledge/performance/api-performance.md +256 -256
- tapps_agents/experts/knowledge/performance/caching.md +327 -327
- tapps_agents/experts/knowledge/performance/database-performance.md +252 -252
- tapps_agents/experts/knowledge/performance/optimization-patterns.md +327 -327
- tapps_agents/experts/knowledge/performance/profiling.md +297 -297
- tapps_agents/experts/knowledge/performance/resource-management.md +293 -293
- tapps_agents/experts/knowledge/performance/scalability.md +306 -306
- tapps_agents/experts/knowledge/security/owasp-top10.md +209 -209
- tapps_agents/experts/knowledge/security/secure-coding-practices.md +207 -207
- tapps_agents/experts/knowledge/security/threat-modeling.md +220 -220
- tapps_agents/experts/knowledge/security/vulnerability-patterns.md +342 -342
- tapps_agents/experts/knowledge/software-architecture/docker-compose-patterns.md +314 -314
- tapps_agents/experts/knowledge/software-architecture/microservices-patterns.md +379 -379
- tapps_agents/experts/knowledge/software-architecture/service-communication.md +316 -316
- tapps_agents/experts/knowledge/testing/best-practices.md +310 -310
- tapps_agents/experts/knowledge/testing/coverage-analysis.md +293 -293
- tapps_agents/experts/knowledge/testing/mocking.md +256 -256
- tapps_agents/experts/knowledge/testing/test-automation.md +276 -276
- tapps_agents/experts/knowledge/testing/test-data.md +271 -271
- tapps_agents/experts/knowledge/testing/test-design-patterns.md +280 -280
- tapps_agents/experts/knowledge/testing/test-maintenance.md +236 -236
- tapps_agents/experts/knowledge/testing/test-strategies.md +311 -311
- tapps_agents/experts/knowledge/user-experience/information-architecture.md +325 -325
- tapps_agents/experts/knowledge/user-experience/interaction-design.md +363 -363
- tapps_agents/experts/knowledge/user-experience/prototyping.md +293 -293
- tapps_agents/experts/knowledge/user-experience/usability-heuristics.md +337 -337
- tapps_agents/experts/knowledge/user-experience/usability-testing.md +311 -311
- tapps_agents/experts/knowledge/user-experience/user-journeys.md +296 -296
- tapps_agents/experts/knowledge/user-experience/user-research.md +373 -373
- tapps_agents/experts/knowledge/user-experience/ux-principles.md +340 -340
- tapps_agents/experts/knowledge_freshness.py +321 -321
- tapps_agents/experts/knowledge_ingestion.py +438 -438
- tapps_agents/experts/knowledge_need_detector.py +93 -93
- tapps_agents/experts/knowledge_validator.py +382 -382
- tapps_agents/experts/observability.py +440 -440
- tapps_agents/experts/passive_notifier.py +238 -238
- tapps_agents/experts/proactive_orchestrator.py +32 -32
- tapps_agents/experts/rag_chunker.py +205 -205
- tapps_agents/experts/rag_embedder.py +152 -152
- tapps_agents/experts/rag_evaluation.py +299 -299
- tapps_agents/experts/rag_index.py +303 -303
- tapps_agents/experts/rag_metrics.py +293 -293
- tapps_agents/experts/rag_safety.py +263 -263
- tapps_agents/experts/report_generator.py +296 -296
- tapps_agents/experts/setup_wizard.py +441 -441
- tapps_agents/experts/simple_rag.py +431 -431
- tapps_agents/experts/vector_rag.py +354 -354
- tapps_agents/experts/weight_distributor.py +304 -304
- tapps_agents/health/__init__.py +24 -24
- tapps_agents/health/base.py +75 -75
- tapps_agents/health/checks/__init__.py +22 -22
- tapps_agents/health/checks/automation.py +127 -127
- tapps_agents/health/checks/context7_cache.py +210 -210
- tapps_agents/health/checks/environment.py +116 -116
- tapps_agents/health/checks/execution.py +170 -170
- tapps_agents/health/checks/knowledge_base.py +187 -187
- tapps_agents/health/checks/outcomes.backup_20260204_064058.py +324 -0
- tapps_agents/health/checks/outcomes.backup_20260204_064256.py +324 -0
- tapps_agents/health/checks/outcomes.backup_20260204_064600.py +324 -0
- tapps_agents/health/checks/outcomes.py +324 -324
- tapps_agents/health/collector.py +280 -280
- tapps_agents/health/dashboard.py +137 -137
- tapps_agents/health/metrics.py +151 -151
- tapps_agents/health/registry.py +166 -166
- tapps_agents/hooks/__init__.py +33 -33
- tapps_agents/hooks/config.py +140 -140
- tapps_agents/hooks/events.py +135 -135
- tapps_agents/hooks/executor.py +128 -128
- tapps_agents/hooks/manager.py +143 -143
- tapps_agents/integration/__init__.py +8 -8
- tapps_agents/integration/service_integrator.py +121 -121
- tapps_agents/integrations/__init__.py +10 -10
- tapps_agents/integrations/clawdbot.py +525 -525
- tapps_agents/integrations/memory_bridge.py +356 -356
- tapps_agents/mcp/__init__.py +18 -18
- tapps_agents/mcp/gateway.py +112 -112
- tapps_agents/mcp/servers/__init__.py +13 -13
- tapps_agents/mcp/servers/analysis.py +204 -204
- tapps_agents/mcp/servers/context7.py +198 -198
- tapps_agents/mcp/servers/filesystem.py +218 -218
- tapps_agents/mcp/servers/git.py +201 -201
- tapps_agents/mcp/tool_registry.py +115 -115
- tapps_agents/quality/__init__.py +54 -54
- tapps_agents/quality/coverage_analyzer.py +379 -379
- tapps_agents/quality/enforcement.py +82 -82
- tapps_agents/quality/gates/__init__.py +37 -37
- tapps_agents/quality/gates/approval_gate.py +255 -255
- tapps_agents/quality/gates/base.py +84 -84
- tapps_agents/quality/gates/exceptions.py +43 -43
- tapps_agents/quality/gates/policy_gate.py +195 -195
- tapps_agents/quality/gates/registry.py +239 -239
- tapps_agents/quality/gates/security_gate.py +156 -156
- tapps_agents/quality/quality_gates.py +369 -369
- tapps_agents/quality/secret_scanner.py +335 -335
- tapps_agents/resources/__init__.py +5 -0
- tapps_agents/resources/claude/__init__.py +1 -0
- tapps_agents/resources/claude/commands/README.md +156 -0
- tapps_agents/resources/claude/commands/__init__.py +1 -0
- tapps_agents/resources/claude/commands/build-fix.md +22 -0
- tapps_agents/resources/claude/commands/build.md +77 -0
- tapps_agents/resources/claude/commands/debug.md +53 -0
- tapps_agents/resources/claude/commands/design.md +68 -0
- tapps_agents/resources/claude/commands/docs.md +53 -0
- tapps_agents/resources/claude/commands/e2e.md +22 -0
- tapps_agents/resources/claude/commands/fix.md +54 -0
- tapps_agents/resources/claude/commands/implement.md +53 -0
- tapps_agents/resources/claude/commands/improve.md +53 -0
- tapps_agents/resources/claude/commands/library-docs.md +64 -0
- tapps_agents/resources/claude/commands/lint.md +52 -0
- tapps_agents/resources/claude/commands/plan.md +65 -0
- tapps_agents/resources/claude/commands/refactor-clean.md +21 -0
- tapps_agents/resources/claude/commands/refactor.md +55 -0
- tapps_agents/resources/claude/commands/review.md +67 -0
- tapps_agents/resources/claude/commands/score.md +60 -0
- tapps_agents/resources/claude/commands/security-review.md +22 -0
- tapps_agents/resources/claude/commands/security-scan.md +54 -0
- tapps_agents/resources/claude/commands/tdd.md +24 -0
- tapps_agents/resources/claude/commands/test-coverage.md +21 -0
- tapps_agents/resources/claude/commands/test.md +54 -0
- tapps_agents/resources/claude/commands/update-codemaps.md +20 -0
- tapps_agents/resources/claude/commands/update-docs.md +21 -0
- tapps_agents/resources/claude/skills/__init__.py +1 -0
- tapps_agents/resources/claude/skills/analyst/SKILL.md +272 -0
- tapps_agents/resources/claude/skills/analyst/__init__.py +1 -0
- tapps_agents/resources/claude/skills/architect/SKILL.md +282 -0
- tapps_agents/resources/claude/skills/architect/__init__.py +1 -0
- tapps_agents/resources/claude/skills/backend-patterns/SKILL.md +30 -0
- tapps_agents/resources/claude/skills/backend-patterns/__init__.py +1 -0
- tapps_agents/resources/claude/skills/coding-standards/SKILL.md +29 -0
- tapps_agents/resources/claude/skills/coding-standards/__init__.py +1 -0
- tapps_agents/resources/claude/skills/debugger/SKILL.md +203 -0
- tapps_agents/resources/claude/skills/debugger/__init__.py +1 -0
- tapps_agents/resources/claude/skills/designer/SKILL.md +243 -0
- tapps_agents/resources/claude/skills/designer/__init__.py +1 -0
- tapps_agents/resources/claude/skills/documenter/SKILL.md +252 -0
- tapps_agents/resources/claude/skills/documenter/__init__.py +1 -0
- tapps_agents/resources/claude/skills/enhancer/SKILL.md +307 -0
- tapps_agents/resources/claude/skills/enhancer/__init__.py +1 -0
- tapps_agents/resources/claude/skills/evaluator/SKILL.md +204 -0
- tapps_agents/resources/claude/skills/evaluator/__init__.py +1 -0
- tapps_agents/resources/claude/skills/frontend-patterns/SKILL.md +29 -0
- tapps_agents/resources/claude/skills/frontend-patterns/__init__.py +1 -0
- tapps_agents/resources/claude/skills/implementer/SKILL.md +188 -0
- tapps_agents/resources/claude/skills/implementer/__init__.py +1 -0
- tapps_agents/resources/claude/skills/improver/SKILL.md +218 -0
- tapps_agents/resources/claude/skills/improver/__init__.py +1 -0
- tapps_agents/resources/claude/skills/ops/SKILL.md +281 -0
- tapps_agents/resources/claude/skills/ops/__init__.py +1 -0
- tapps_agents/resources/claude/skills/orchestrator/SKILL.md +390 -0
- tapps_agents/resources/claude/skills/orchestrator/__init__.py +1 -0
- tapps_agents/resources/claude/skills/planner/SKILL.md +254 -0
- tapps_agents/resources/claude/skills/planner/__init__.py +1 -0
- tapps_agents/resources/claude/skills/reviewer/SKILL.md +434 -0
- tapps_agents/resources/claude/skills/reviewer/__init__.py +1 -0
- tapps_agents/resources/claude/skills/security-review/SKILL.md +31 -0
- tapps_agents/resources/claude/skills/security-review/__init__.py +1 -0
- tapps_agents/resources/claude/skills/simple-mode/SKILL.md +695 -0
- tapps_agents/resources/claude/skills/simple-mode/__init__.py +1 -0
- tapps_agents/resources/claude/skills/tester/SKILL.md +219 -0
- tapps_agents/resources/claude/skills/tester/__init__.py +1 -0
- tapps_agents/resources/cursor/.cursorignore +35 -0
- tapps_agents/resources/cursor/__init__.py +1 -0
- tapps_agents/resources/cursor/commands/__init__.py +1 -0
- tapps_agents/resources/cursor/commands/build-fix.md +11 -0
- tapps_agents/resources/cursor/commands/build.md +11 -0
- tapps_agents/resources/cursor/commands/e2e.md +11 -0
- tapps_agents/resources/cursor/commands/fix.md +11 -0
- tapps_agents/resources/cursor/commands/refactor-clean.md +11 -0
- tapps_agents/resources/cursor/commands/review.md +11 -0
- tapps_agents/resources/cursor/commands/security-review.md +11 -0
- tapps_agents/resources/cursor/commands/tdd.md +11 -0
- tapps_agents/resources/cursor/commands/test-coverage.md +11 -0
- tapps_agents/resources/cursor/commands/test.md +11 -0
- tapps_agents/resources/cursor/commands/update-codemaps.md +10 -0
- tapps_agents/resources/cursor/commands/update-docs.md +11 -0
- tapps_agents/resources/cursor/rules/__init__.py +1 -0
- tapps_agents/resources/cursor/rules/agent-capabilities.mdc +687 -0
- tapps_agents/resources/cursor/rules/coding-style.mdc +31 -0
- tapps_agents/resources/cursor/rules/command-reference.mdc +2081 -0
- tapps_agents/resources/cursor/rules/cursor-mode-usage.mdc +125 -0
- tapps_agents/resources/cursor/rules/git-workflow.mdc +29 -0
- tapps_agents/resources/cursor/rules/performance.mdc +29 -0
- tapps_agents/resources/cursor/rules/project-context.mdc +163 -0
- tapps_agents/resources/cursor/rules/project-profiling.mdc +197 -0
- tapps_agents/resources/cursor/rules/quick-reference.mdc +630 -0
- tapps_agents/resources/cursor/rules/security.mdc +32 -0
- tapps_agents/resources/cursor/rules/simple-mode.mdc +500 -0
- tapps_agents/resources/cursor/rules/testing.mdc +31 -0
- tapps_agents/resources/cursor/rules/when-to-use.mdc +156 -0
- tapps_agents/resources/cursor/rules/workflow-presets.mdc +179 -0
- tapps_agents/resources/customizations/__init__.py +1 -0
- tapps_agents/resources/customizations/example-custom.yaml +83 -0
- tapps_agents/resources/hooks/__init__.py +1 -0
- tapps_agents/resources/hooks/templates/README.md +5 -0
- tapps_agents/resources/hooks/templates/__init__.py +1 -0
- tapps_agents/resources/hooks/templates/add-project-context.yaml +8 -0
- tapps_agents/resources/hooks/templates/auto-format-js.yaml +10 -0
- tapps_agents/resources/hooks/templates/auto-format-python.yaml +10 -0
- tapps_agents/resources/hooks/templates/git-commit-check.yaml +7 -0
- tapps_agents/resources/hooks/templates/notify-on-complete.yaml +8 -0
- tapps_agents/resources/hooks/templates/quality-gate.yaml +8 -0
- tapps_agents/resources/hooks/templates/security-scan-on-edit.yaml +10 -0
- tapps_agents/resources/hooks/templates/session-end-log.yaml +7 -0
- tapps_agents/resources/hooks/templates/show-beads-ready.yaml +8 -0
- tapps_agents/resources/hooks/templates/test-on-edit.yaml +10 -0
- tapps_agents/resources/hooks/templates/update-docs-on-complete.yaml +8 -0
- tapps_agents/resources/hooks/templates/user-prompt-log.yaml +7 -0
- tapps_agents/resources/scripts/__init__.py +1 -0
- tapps_agents/resources/scripts/set_bd_path.ps1 +51 -0
- tapps_agents/resources/workflows/__init__.py +1 -0
- tapps_agents/resources/workflows/presets/__init__.py +1 -0
- tapps_agents/resources/workflows/presets/brownfield-analysis.yaml +235 -0
- tapps_agents/resources/workflows/presets/fix.yaml +78 -0
- tapps_agents/resources/workflows/presets/full-sdlc.yaml +122 -0
- tapps_agents/resources/workflows/presets/quality.yaml +82 -0
- tapps_agents/resources/workflows/presets/rapid-dev.yaml +84 -0
- tapps_agents/session/__init__.py +19 -19
- tapps_agents/session/manager.py +256 -256
- tapps_agents/simple_mode/__init__.py +66 -66
- tapps_agents/simple_mode/agent_contracts.py +357 -357
- tapps_agents/simple_mode/beads_hooks.py +151 -151
- tapps_agents/simple_mode/code_snippet_handler.py +382 -382
- tapps_agents/simple_mode/documentation_manager.py +395 -395
- tapps_agents/simple_mode/documentation_reader.py +187 -187
- tapps_agents/simple_mode/file_inference.py +292 -292
- tapps_agents/simple_mode/framework_change_detector.py +268 -268
- tapps_agents/simple_mode/intent_parser.py +510 -510
- tapps_agents/simple_mode/learning_progression.py +358 -358
- tapps_agents/simple_mode/nl_handler.py +700 -700
- tapps_agents/simple_mode/onboarding.py +253 -253
- tapps_agents/simple_mode/orchestrators/__init__.py +38 -38
- tapps_agents/simple_mode/orchestrators/breakdown_orchestrator.py +49 -49
- tapps_agents/simple_mode/orchestrators/brownfield_orchestrator.py +135 -135
- tapps_agents/simple_mode/orchestrators/deliverable_checklist.py +349 -349
- tapps_agents/simple_mode/orchestrators/enhance_orchestrator.py +53 -53
- tapps_agents/simple_mode/orchestrators/epic_orchestrator.py +122 -122
- tapps_agents/simple_mode/orchestrators/explore_orchestrator.py +184 -184
- tapps_agents/simple_mode/orchestrators/plan_analysis_orchestrator.py +206 -206
- tapps_agents/simple_mode/orchestrators/pr_orchestrator.py +237 -237
- tapps_agents/simple_mode/orchestrators/refactor_orchestrator.py +222 -222
- tapps_agents/simple_mode/orchestrators/requirements_tracer.py +262 -262
- tapps_agents/simple_mode/orchestrators/resume_orchestrator.py +210 -210
- tapps_agents/simple_mode/orchestrators/review_orchestrator.py +161 -161
- tapps_agents/simple_mode/orchestrators/test_orchestrator.py +82 -82
- tapps_agents/simple_mode/output_aggregator.py +340 -340
- tapps_agents/simple_mode/result_formatters.py +598 -598
- tapps_agents/simple_mode/step_dependencies.py +382 -382
- tapps_agents/simple_mode/step_results.py +276 -276
- tapps_agents/simple_mode/streaming.py +388 -388
- tapps_agents/simple_mode/variations.py +129 -129
- tapps_agents/simple_mode/visual_feedback.py +238 -238
- tapps_agents/simple_mode/zero_config.py +274 -274
- tapps_agents/suggestions/__init__.py +8 -8
- tapps_agents/suggestions/inline_suggester.py +52 -52
- tapps_agents/templates/__init__.py +8 -8
- tapps_agents/templates/microservice_generator.py +274 -274
- tapps_agents/utils/env_validator.py +291 -291
- tapps_agents/workflow/__init__.py +171 -171
- tapps_agents/workflow/acceptance_verifier.py +132 -132
- tapps_agents/workflow/agent_handlers/__init__.py +41 -41
- tapps_agents/workflow/agent_handlers/analyst_handler.py +75 -75
- tapps_agents/workflow/agent_handlers/architect_handler.py +107 -107
- tapps_agents/workflow/agent_handlers/base.py +84 -84
- tapps_agents/workflow/agent_handlers/debugger_handler.py +100 -100
- tapps_agents/workflow/agent_handlers/designer_handler.py +110 -110
- tapps_agents/workflow/agent_handlers/documenter_handler.py +94 -94
- tapps_agents/workflow/agent_handlers/implementer_handler.py +235 -235
- tapps_agents/workflow/agent_handlers/ops_handler.py +62 -62
- tapps_agents/workflow/agent_handlers/orchestrator_handler.py +43 -43
- tapps_agents/workflow/agent_handlers/planner_handler.py +98 -98
- tapps_agents/workflow/agent_handlers/registry.py +119 -119
- tapps_agents/workflow/agent_handlers/reviewer_handler.py +119 -119
- tapps_agents/workflow/agent_handlers/tester_handler.py +69 -69
- tapps_agents/workflow/analytics_accessor.py +337 -337
- tapps_agents/workflow/analytics_alerts.py +416 -416
- tapps_agents/workflow/analytics_dashboard_cursor.py +281 -281
- tapps_agents/workflow/analytics_dual_write.py +103 -103
- tapps_agents/workflow/analytics_integration.py +119 -119
- tapps_agents/workflow/analytics_query_parser.py +278 -278
- tapps_agents/workflow/analytics_visualizer.py +259 -259
- tapps_agents/workflow/artifact_helper.py +204 -204
- tapps_agents/workflow/audit_logger.py +263 -263
- tapps_agents/workflow/auto_execution_config.py +340 -340
- tapps_agents/workflow/auto_progression.py +586 -586
- tapps_agents/workflow/branch_cleanup.py +349 -349
- tapps_agents/workflow/checkpoint.py +256 -256
- tapps_agents/workflow/checkpoint_manager.py +178 -178
- tapps_agents/workflow/code_artifact.py +179 -179
- tapps_agents/workflow/common_enums.py +96 -96
- tapps_agents/workflow/confirmation_handler.py +130 -130
- tapps_agents/workflow/context_analyzer.py +222 -222
- tapps_agents/workflow/context_artifact.py +230 -230
- tapps_agents/workflow/cursor_chat.py +94 -94
- tapps_agents/workflow/cursor_skill_helper.py +516 -516
- tapps_agents/workflow/dependency_resolver.py +244 -244
- tapps_agents/workflow/design_artifact.py +156 -156
- tapps_agents/workflow/detector.py +751 -751
- tapps_agents/workflow/direct_execution_fallback.py +301 -301
- tapps_agents/workflow/docs_artifact.py +168 -168
- tapps_agents/workflow/enforcer.py +389 -389
- tapps_agents/workflow/enhancement_artifact.py +142 -142
- tapps_agents/workflow/error_recovery.py +806 -806
- tapps_agents/workflow/event_bus.py +183 -183
- tapps_agents/workflow/event_log.py +612 -612
- tapps_agents/workflow/events.py +63 -63
- tapps_agents/workflow/exceptions.py +43 -43
- tapps_agents/workflow/execution_graph.py +498 -498
- tapps_agents/workflow/execution_plan.py +126 -126
- tapps_agents/workflow/file_utils.py +186 -186
- tapps_agents/workflow/gate_evaluator.py +182 -182
- tapps_agents/workflow/gate_integration.py +200 -200
- tapps_agents/workflow/graph_visualizer.py +130 -130
- tapps_agents/workflow/health_checker.py +206 -206
- tapps_agents/workflow/logging_helper.py +243 -243
- tapps_agents/workflow/manifest.py +582 -582
- tapps_agents/workflow/marker_writer.py +250 -250
- tapps_agents/workflow/messaging.py +325 -325
- tapps_agents/workflow/metadata_models.py +91 -91
- tapps_agents/workflow/metrics_integration.py +226 -226
- tapps_agents/workflow/migration_utils.py +116 -116
- tapps_agents/workflow/models.py +148 -148
- tapps_agents/workflow/nlp_config.py +198 -198
- tapps_agents/workflow/nlp_error_handler.py +207 -207
- tapps_agents/workflow/nlp_executor.py +163 -163
- tapps_agents/workflow/nlp_parser.py +528 -528
- tapps_agents/workflow/observability_dashboard.py +451 -451
- tapps_agents/workflow/observer.py +170 -170
- tapps_agents/workflow/ops_artifact.py +257 -257
- tapps_agents/workflow/output_passing.py +214 -214
- tapps_agents/workflow/parallel_executor.py +463 -463
- tapps_agents/workflow/planning_artifact.py +179 -179
- tapps_agents/workflow/preset_loader.py +285 -285
- tapps_agents/workflow/preset_recommender.py +270 -270
- tapps_agents/workflow/progress_logger.py +145 -145
- tapps_agents/workflow/progress_manager.py +303 -303
- tapps_agents/workflow/progress_monitor.py +186 -186
- tapps_agents/workflow/progress_updates.py +423 -423
- tapps_agents/workflow/quality_artifact.py +158 -158
- tapps_agents/workflow/quality_loopback.py +101 -101
- tapps_agents/workflow/recommender.py +387 -387
- tapps_agents/workflow/remediation_loop.py +166 -166
- tapps_agents/workflow/result_aggregator.py +300 -300
- tapps_agents/workflow/review_artifact.py +185 -185
- tapps_agents/workflow/schema_validator.py +522 -522
- tapps_agents/workflow/session_handoff.py +178 -178
- tapps_agents/workflow/skill_invoker.py +648 -648
- tapps_agents/workflow/state_manager.py +756 -756
- tapps_agents/workflow/state_persistence_config.py +331 -331
- tapps_agents/workflow/status_monitor.py +449 -449
- tapps_agents/workflow/step_checkpoint.py +314 -314
- tapps_agents/workflow/step_details.py +201 -201
- tapps_agents/workflow/story_models.py +147 -147
- tapps_agents/workflow/streaming.py +416 -416
- tapps_agents/workflow/suggestion_engine.py +552 -552
- tapps_agents/workflow/testing_artifact.py +186 -186
- tapps_agents/workflow/timeline.py +158 -158
- tapps_agents/workflow/token_integration.py +209 -209
- tapps_agents/workflow/validation.py +217 -217
- tapps_agents/workflow/visual_feedback.py +391 -391
- tapps_agents/workflow/workflow_chain.py +95 -95
- tapps_agents/workflow/workflow_summary.py +219 -219
- tapps_agents/workflow/worktree_manager.py +724 -724
- {tapps_agents-3.6.0.dist-info → tapps_agents-3.6.1.dist-info}/METADATA +672 -672
- tapps_agents-3.6.1.dist-info/RECORD +883 -0
- {tapps_agents-3.6.0.dist-info → tapps_agents-3.6.1.dist-info}/licenses/LICENSE +22 -22
- tapps_agents-3.6.0.dist-info/RECORD +0 -758
- {tapps_agents-3.6.0.dist-info → tapps_agents-3.6.1.dist-info}/WHEEL +0 -0
- {tapps_agents-3.6.0.dist-info → tapps_agents-3.6.1.dist-info}/entry_points.txt +0 -0
- {tapps_agents-3.6.0.dist-info → tapps_agents-3.6.1.dist-info}/top_level.txt +0 -0
|
@@ -1,648 +1,648 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Skill Invoker - Invokes Cursor Skills for workflow execution.
|
|
3
|
-
|
|
4
|
-
This module translates workflow actions to Cursor Skill commands and executes them.
|
|
5
|
-
"""
|
|
6
|
-
|
|
7
|
-
from __future__ import annotations
|
|
8
|
-
|
|
9
|
-
import json
|
|
10
|
-
import logging
|
|
11
|
-
from pathlib import Path
|
|
12
|
-
from typing import Any
|
|
13
|
-
|
|
14
|
-
import requests # type: ignore[import-untyped]
|
|
15
|
-
|
|
16
|
-
logger = logging.getLogger(__name__)
|
|
17
|
-
|
|
18
|
-
from ..core.skill_integration import (
|
|
19
|
-
get_skill_integration_manager,
|
|
20
|
-
)
|
|
21
|
-
from .cursor_skill_helper import (
|
|
22
|
-
create_skill_command_file,
|
|
23
|
-
create_skill_execution_instructions,
|
|
24
|
-
)
|
|
25
|
-
from .models import Artifact, WorkflowState, WorkflowStep
|
|
26
|
-
from .direct_execution_fallback import DirectExecutionFallback
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
class SkillInvoker:
|
|
30
|
-
"""
|
|
31
|
-
Invokes Cursor Skills for workflow execution.
|
|
32
|
-
|
|
33
|
-
Translates workflow actions to Skill commands and executes them.
|
|
34
|
-
Supports both Background Agent API and file-based execution.
|
|
35
|
-
"""
|
|
36
|
-
|
|
37
|
-
def __init__(self, project_root: Path | None = None, use_api: bool = True):
|
|
38
|
-
"""
|
|
39
|
-
Initialize Skill Invoker.
|
|
40
|
-
|
|
41
|
-
Args:
|
|
42
|
-
project_root: Root directory for the project
|
|
43
|
-
use_api: Whether to use Background Agent API (True) or file-based (False)
|
|
44
|
-
"""
|
|
45
|
-
self.project_root = project_root or Path.cwd()
|
|
46
|
-
self.use_api = use_api
|
|
47
|
-
# Background Agent API removed - always use direct execution fallback
|
|
48
|
-
self.skill_integration = get_skill_integration_manager(project_root=self.project_root)
|
|
49
|
-
# Initialize direct execution fallback (Phase 2: Simpler fallback)
|
|
50
|
-
self.direct_execution = DirectExecutionFallback(project_root=self.project_root)
|
|
51
|
-
|
|
52
|
-
# Command mapping: (agent_name, action) -> (skill_command, parameters)
|
|
53
|
-
COMMAND_MAPPING: dict[tuple[str, str], tuple[str, dict[str, Any]]] = {
|
|
54
|
-
# Analyst
|
|
55
|
-
("analyst", "gather-requirements"): (
|
|
56
|
-
"gather-requirements",
|
|
57
|
-
{"description": "user_prompt", "output_file": "requirements.md"},
|
|
58
|
-
),
|
|
59
|
-
("analyst", "gather_requirements"): (
|
|
60
|
-
"gather-requirements",
|
|
61
|
-
{"description": "user_prompt", "output_file": "requirements.md"},
|
|
62
|
-
),
|
|
63
|
-
|
|
64
|
-
# Planner
|
|
65
|
-
("planner", "plan"): (
|
|
66
|
-
"plan",
|
|
67
|
-
{"description": "requirements_content"},
|
|
68
|
-
),
|
|
69
|
-
("planner", "create-stories"): (
|
|
70
|
-
"plan",
|
|
71
|
-
{"description": "requirements_content"},
|
|
72
|
-
),
|
|
73
|
-
("planner", "create_stories"): (
|
|
74
|
-
"plan",
|
|
75
|
-
{"description": "requirements_content"},
|
|
76
|
-
),
|
|
77
|
-
|
|
78
|
-
# Architect
|
|
79
|
-
("architect", "design-system"): (
|
|
80
|
-
"design-system",
|
|
81
|
-
{"requirements": "requirements_file", "context": "stories_content", "output_file": "architecture.md"},
|
|
82
|
-
),
|
|
83
|
-
("architect", "design_system"): (
|
|
84
|
-
"design-system",
|
|
85
|
-
{"requirements": "requirements_file", "context": "stories_content", "output_file": "architecture.md"},
|
|
86
|
-
),
|
|
87
|
-
|
|
88
|
-
# Designer
|
|
89
|
-
("designer", "design-api"): (
|
|
90
|
-
"design-api",
|
|
91
|
-
{"requirements": "requirements_file", "architecture": "architecture_file"},
|
|
92
|
-
),
|
|
93
|
-
("designer", "api_design"): (
|
|
94
|
-
"design-api",
|
|
95
|
-
{"requirements": "requirements_file", "architecture": "architecture_file"},
|
|
96
|
-
),
|
|
97
|
-
("designer", "api-design"): (
|
|
98
|
-
"design-api",
|
|
99
|
-
{"requirements": "requirements_file", "architecture": "architecture_file"},
|
|
100
|
-
),
|
|
101
|
-
|
|
102
|
-
# Implementer
|
|
103
|
-
("implementer", "implement"): (
|
|
104
|
-
"implement",
|
|
105
|
-
{"specification": "specification_content", "file_path": "target_file"},
|
|
106
|
-
),
|
|
107
|
-
("implementer", "write-code"): (
|
|
108
|
-
"implement",
|
|
109
|
-
{"specification": "specification_content", "file_path": "target_file"},
|
|
110
|
-
),
|
|
111
|
-
("implementer", "write_code"): (
|
|
112
|
-
"implement",
|
|
113
|
-
{"specification": "specification_content", "file_path": "target_file"},
|
|
114
|
-
),
|
|
115
|
-
("implementer", "refactor"): (
|
|
116
|
-
"refactor",
|
|
117
|
-
{"file": "target_file", "requirements": "requirements_file"},
|
|
118
|
-
),
|
|
119
|
-
|
|
120
|
-
# Reviewer
|
|
121
|
-
("reviewer", "review"): (
|
|
122
|
-
"review",
|
|
123
|
-
{"file": "target_file"},
|
|
124
|
-
),
|
|
125
|
-
("reviewer", "review-code"): (
|
|
126
|
-
"review",
|
|
127
|
-
{"file": "target_file"},
|
|
128
|
-
),
|
|
129
|
-
("reviewer", "review_code"): (
|
|
130
|
-
"review",
|
|
131
|
-
{"file": "target_file"},
|
|
132
|
-
),
|
|
133
|
-
|
|
134
|
-
# Tester
|
|
135
|
-
("tester", "test"): (
|
|
136
|
-
"test",
|
|
137
|
-
{"file": "target_file"},
|
|
138
|
-
),
|
|
139
|
-
("tester", "write-tests"): (
|
|
140
|
-
"test",
|
|
141
|
-
{"file": "target_file"},
|
|
142
|
-
),
|
|
143
|
-
("tester", "write_tests"): (
|
|
144
|
-
"test",
|
|
145
|
-
{"file": "target_file"},
|
|
146
|
-
),
|
|
147
|
-
|
|
148
|
-
# Debugger
|
|
149
|
-
("debugger", "analyze-error"): (
|
|
150
|
-
"analyze-error",
|
|
151
|
-
{"error_message": "error_message", "stack_trace": "stack_trace"},
|
|
152
|
-
),
|
|
153
|
-
("debugger", "analyze_error"): (
|
|
154
|
-
"analyze-error",
|
|
155
|
-
{"error_message": "error_message", "stack_trace": "stack_trace"},
|
|
156
|
-
),
|
|
157
|
-
|
|
158
|
-
# Documenter
|
|
159
|
-
("documenter", "document"): (
|
|
160
|
-
"document",
|
|
161
|
-
{"target": "target_file", "output_dir": "docs"},
|
|
162
|
-
),
|
|
163
|
-
("documenter", "generate-docs"): (
|
|
164
|
-
"document",
|
|
165
|
-
{"target": "target_file", "output_dir": "docs"},
|
|
166
|
-
),
|
|
167
|
-
("documenter", "generate_docs"): (
|
|
168
|
-
"document",
|
|
169
|
-
{"target": "target_file", "output_dir": "docs"},
|
|
170
|
-
),
|
|
171
|
-
("documenter", "update_docstrings"): (
|
|
172
|
-
"update-docstrings",
|
|
173
|
-
{"file": "target_file", "write_file": True},
|
|
174
|
-
),
|
|
175
|
-
("documenter", "update-docstrings"): (
|
|
176
|
-
"update-docstrings",
|
|
177
|
-
{"file": "target_file", "write_file": True},
|
|
178
|
-
),
|
|
179
|
-
|
|
180
|
-
# Ops
|
|
181
|
-
("ops", "security-scan"): (
|
|
182
|
-
"security-scan",
|
|
183
|
-
{"target": "target_file", "type": "code"},
|
|
184
|
-
),
|
|
185
|
-
("ops", "security_scan"): (
|
|
186
|
-
"security-scan",
|
|
187
|
-
{"target": "target_file", "type": "code"},
|
|
188
|
-
),
|
|
189
|
-
|
|
190
|
-
# Improver
|
|
191
|
-
("improver", "improve"): (
|
|
192
|
-
"improve",
|
|
193
|
-
{"file": "target_file", "feedback": "review_feedback"},
|
|
194
|
-
),
|
|
195
|
-
("improver", "refactor"): (
|
|
196
|
-
"refactor",
|
|
197
|
-
{"file_path": "target_file", "instruction": "debug_report"},
|
|
198
|
-
),
|
|
199
|
-
|
|
200
|
-
# Enhancer
|
|
201
|
-
("enhancer", "enhance"): (
|
|
202
|
-
"enhance",
|
|
203
|
-
{"prompt": "user_prompt", "format": "markdown"},
|
|
204
|
-
),
|
|
205
|
-
("enhancer", "enhance_prompt"): (
|
|
206
|
-
"enhance",
|
|
207
|
-
{"prompt": "user_prompt", "format": "markdown"},
|
|
208
|
-
),
|
|
209
|
-
("enhancer", "enhance-prompt"): (
|
|
210
|
-
"enhance",
|
|
211
|
-
{"prompt": "user_prompt", "format": "markdown"},
|
|
212
|
-
),
|
|
213
|
-
|
|
214
|
-
# Quality Agent (Background Cloud)
|
|
215
|
-
("quality", "analyze"): (
|
|
216
|
-
"quality-analyze",
|
|
217
|
-
{"target": "target_file"},
|
|
218
|
-
),
|
|
219
|
-
("quality", "quality-check"): (
|
|
220
|
-
"quality-analyze",
|
|
221
|
-
{"target": "target_file"},
|
|
222
|
-
),
|
|
223
|
-
("quality", "quality_check"): (
|
|
224
|
-
"quality-analyze",
|
|
225
|
-
{"target": "target_file"},
|
|
226
|
-
),
|
|
227
|
-
|
|
228
|
-
# Testing Agent (Background Cloud)
|
|
229
|
-
("testing", "run-tests"): (
|
|
230
|
-
"testing-run",
|
|
231
|
-
{"test_path": "target_file", "coverage": True},
|
|
232
|
-
),
|
|
233
|
-
("testing", "run_tests"): (
|
|
234
|
-
"testing-run",
|
|
235
|
-
{"test_path": "target_file", "coverage": True},
|
|
236
|
-
),
|
|
237
|
-
("testing", "test"): (
|
|
238
|
-
"testing-run",
|
|
239
|
-
{"test_path": "target_file", "coverage": True},
|
|
240
|
-
),
|
|
241
|
-
}
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
async def invoke_skill(
|
|
245
|
-
self,
|
|
246
|
-
agent_name: str,
|
|
247
|
-
action: str,
|
|
248
|
-
step: WorkflowStep,
|
|
249
|
-
target_path: Path | None,
|
|
250
|
-
worktree_path: Path,
|
|
251
|
-
state: WorkflowState,
|
|
252
|
-
) -> dict[str, Any]:
|
|
253
|
-
"""
|
|
254
|
-
Invoke a Cursor Skill for a workflow step.
|
|
255
|
-
|
|
256
|
-
Supports both built-in and custom Skills. Custom Skills are checked first.
|
|
257
|
-
|
|
258
|
-
Args:
|
|
259
|
-
agent_name: Name of the agent (e.g., "analyst")
|
|
260
|
-
action: Action to perform (e.g., "gather-requirements")
|
|
261
|
-
step: Workflow step definition
|
|
262
|
-
target_path: Optional target file path
|
|
263
|
-
worktree_path: Path to worktree for this step
|
|
264
|
-
state: Current workflow state
|
|
265
|
-
|
|
266
|
-
Returns:
|
|
267
|
-
Result dictionary from Skill execution
|
|
268
|
-
"""
|
|
269
|
-
# Check if step specifies a custom Skill (in metadata or as attribute)
|
|
270
|
-
custom_skill_name = None
|
|
271
|
-
if step:
|
|
272
|
-
# Check metadata first
|
|
273
|
-
if hasattr(step, "metadata") and step.metadata:
|
|
274
|
-
custom_skill_name = step.metadata.get("skill")
|
|
275
|
-
# Also check direct attribute (for future extension)
|
|
276
|
-
if not custom_skill_name:
|
|
277
|
-
custom_skill_name = getattr(step, "skill", None)
|
|
278
|
-
|
|
279
|
-
# If custom Skill is specified, use it
|
|
280
|
-
if custom_skill_name and self.skill_integration.is_custom_skill(custom_skill_name):
|
|
281
|
-
return await self._invoke_custom_skill(
|
|
282
|
-
skill_name=custom_skill_name,
|
|
283
|
-
action=action,
|
|
284
|
-
step=step,
|
|
285
|
-
target_path=target_path,
|
|
286
|
-
worktree_path=worktree_path,
|
|
287
|
-
state=state,
|
|
288
|
-
)
|
|
289
|
-
|
|
290
|
-
# Check for custom Skills that match agent/action pattern
|
|
291
|
-
custom_skills = self.skill_integration.get_skills_for_agent(agent_name.lower())
|
|
292
|
-
for skill in custom_skills:
|
|
293
|
-
# Try to match action to Skill commands (simplified matching)
|
|
294
|
-
# In a full implementation, we'd parse the Skill's command definitions
|
|
295
|
-
# For now, we'll use the Skill name as the agent name if it matches
|
|
296
|
-
if skill.name.lower().startswith(agent_name.lower()) or agent_name.lower() in skill.name.lower():
|
|
297
|
-
return await self._invoke_custom_skill(
|
|
298
|
-
skill_name=skill.name,
|
|
299
|
-
action=action,
|
|
300
|
-
step=step,
|
|
301
|
-
target_path=target_path,
|
|
302
|
-
worktree_path=worktree_path,
|
|
303
|
-
state=state,
|
|
304
|
-
)
|
|
305
|
-
|
|
306
|
-
# Fall back to built-in command mapping
|
|
307
|
-
key = (agent_name.lower(), action.lower())
|
|
308
|
-
if key not in self.COMMAND_MAPPING:
|
|
309
|
-
raise ValueError(
|
|
310
|
-
f"Unknown command: {agent_name}/{action}. "
|
|
311
|
-
f"Available: {list(self.COMMAND_MAPPING.keys())}"
|
|
312
|
-
)
|
|
313
|
-
|
|
314
|
-
skill_command, param_mapping = self.COMMAND_MAPPING[key]
|
|
315
|
-
|
|
316
|
-
# Build parameters from state and context
|
|
317
|
-
params = self._build_parameters(
|
|
318
|
-
param_mapping=param_mapping,
|
|
319
|
-
step=step,
|
|
320
|
-
target_path=target_path,
|
|
321
|
-
worktree_path=worktree_path,
|
|
322
|
-
state=state,
|
|
323
|
-
)
|
|
324
|
-
|
|
325
|
-
# Build Skill command string
|
|
326
|
-
command_str = self._build_command(
|
|
327
|
-
agent_name=agent_name,
|
|
328
|
-
skill_command=skill_command,
|
|
329
|
-
params=params,
|
|
330
|
-
)
|
|
331
|
-
|
|
332
|
-
# Execute via Cursor chat (using Background Agent or direct invocation)
|
|
333
|
-
result = await self._execute_skill_command(
|
|
334
|
-
command=command_str,
|
|
335
|
-
worktree_path=worktree_path,
|
|
336
|
-
step=step,
|
|
337
|
-
workflow_id=getattr(state, "workflow_id", None),
|
|
338
|
-
)
|
|
339
|
-
|
|
340
|
-
# Store result in state for tracking
|
|
341
|
-
if state:
|
|
342
|
-
state.variables[f"{agent_name}_{action}_result"] = result
|
|
343
|
-
|
|
344
|
-
return result
|
|
345
|
-
|
|
346
|
-
def _build_parameters(
|
|
347
|
-
self,
|
|
348
|
-
param_mapping: dict[str, str],
|
|
349
|
-
step: WorkflowStep,
|
|
350
|
-
target_path: Path | None,
|
|
351
|
-
worktree_path: Path,
|
|
352
|
-
state: WorkflowState,
|
|
353
|
-
) -> dict[str, Any]:
|
|
354
|
-
"""
|
|
355
|
-
Build parameters for Skill command from workflow state.
|
|
356
|
-
|
|
357
|
-
Args:
|
|
358
|
-
param_mapping: Mapping from parameter names to state keys
|
|
359
|
-
step: Workflow step
|
|
360
|
-
target_path: Optional target file path
|
|
361
|
-
worktree_path: Path to worktree
|
|
362
|
-
state: Workflow state
|
|
363
|
-
|
|
364
|
-
Returns:
|
|
365
|
-
Dictionary of parameter values
|
|
366
|
-
"""
|
|
367
|
-
params: dict[str, Any] = {}
|
|
368
|
-
|
|
369
|
-
for param_name, state_key in param_mapping.items():
|
|
370
|
-
if state_key == "user_prompt":
|
|
371
|
-
params[param_name] = state.variables.get("user_prompt", "")
|
|
372
|
-
elif state_key == "target_file":
|
|
373
|
-
params[param_name] = str(target_path) if target_path else None
|
|
374
|
-
elif state_key == "requirements_file":
|
|
375
|
-
# Find requirements.md artifact
|
|
376
|
-
req_file = self._find_artifact(state, "requirements.md")
|
|
377
|
-
params[param_name] = str(req_file) if req_file else None
|
|
378
|
-
elif state_key == "requirements_content":
|
|
379
|
-
req_file = self._find_artifact(state, "requirements.md")
|
|
380
|
-
if req_file and req_file.exists():
|
|
381
|
-
params[param_name] = req_file.read_text(encoding="utf-8")
|
|
382
|
-
else:
|
|
383
|
-
params[param_name] = ""
|
|
384
|
-
elif state_key == "architecture_file":
|
|
385
|
-
arch_file = self._find_artifact(state, "architecture.md")
|
|
386
|
-
params[param_name] = str(arch_file) if arch_file else None
|
|
387
|
-
elif state_key == "stories_content":
|
|
388
|
-
# Find stories directory
|
|
389
|
-
stories_dir = worktree_path / "stories"
|
|
390
|
-
if stories_dir.exists():
|
|
391
|
-
# Read all story files
|
|
392
|
-
story_files = list(stories_dir.glob("*.md"))
|
|
393
|
-
content = "\n\n".join(
|
|
394
|
-
f.read_text(encoding="utf-8") for f in story_files
|
|
395
|
-
)
|
|
396
|
-
params[param_name] = content
|
|
397
|
-
else:
|
|
398
|
-
params[param_name] = ""
|
|
399
|
-
elif state_key == "specification_content":
|
|
400
|
-
# Combine requirements and architecture
|
|
401
|
-
req_content = ""
|
|
402
|
-
arch_content = ""
|
|
403
|
-
req_file = self._find_artifact(state, "requirements.md")
|
|
404
|
-
arch_file = self._find_artifact(state, "architecture.md")
|
|
405
|
-
if req_file and req_file.exists():
|
|
406
|
-
req_content = req_file.read_text(encoding="utf-8")
|
|
407
|
-
if arch_file and arch_file.exists():
|
|
408
|
-
arch_content = arch_file.read_text(encoding="utf-8")
|
|
409
|
-
params[param_name] = f"{req_content}\n\n{arch_content}"
|
|
410
|
-
elif state_key == "review_feedback":
|
|
411
|
-
# Get reviewer result from state
|
|
412
|
-
params[param_name] = state.variables.get("reviewer_result", {})
|
|
413
|
-
elif state_key == "error_message":
|
|
414
|
-
params[param_name] = state.variables.get("error_message", "")
|
|
415
|
-
elif state_key == "stack_trace":
|
|
416
|
-
params[param_name] = state.variables.get("stack_trace", "")
|
|
417
|
-
elif state_key == "debug_report":
|
|
418
|
-
# Find debug-report.md artifact
|
|
419
|
-
debug_file = self._find_artifact(state, "debug-report.md")
|
|
420
|
-
if debug_file and debug_file.exists():
|
|
421
|
-
params[param_name] = debug_file.read_text(encoding="utf-8")
|
|
422
|
-
else:
|
|
423
|
-
params[param_name] = state.variables.get("user_prompt", "")
|
|
424
|
-
elif state_key == "project_profile":
|
|
425
|
-
# Get project profile from state
|
|
426
|
-
profile_dict = state.variables.get("project_profile")
|
|
427
|
-
if profile_dict:
|
|
428
|
-
from ..core.project_profile import ProjectProfile
|
|
429
|
-
profile = ProjectProfile.from_dict(profile_dict)
|
|
430
|
-
params[param_name] = profile.format_context(min_confidence=0.7)
|
|
431
|
-
else:
|
|
432
|
-
params[param_name] = ""
|
|
433
|
-
else:
|
|
434
|
-
# Try to get from state variables
|
|
435
|
-
params[param_name] = state.variables.get(state_key, "")
|
|
436
|
-
|
|
437
|
-
# Automatically append project profile to context parameters
|
|
438
|
-
profile_dict = state.variables.get("project_profile")
|
|
439
|
-
if profile_dict:
|
|
440
|
-
from ..core.project_profile import ProjectProfile
|
|
441
|
-
profile = ProjectProfile.from_dict(profile_dict)
|
|
442
|
-
profile_context = profile.format_context(min_confidence=0.7)
|
|
443
|
-
if profile_context:
|
|
444
|
-
# Append to any existing context parameter
|
|
445
|
-
if "context" in params:
|
|
446
|
-
existing_context = params.get("context", "")
|
|
447
|
-
if existing_context:
|
|
448
|
-
params["context"] = f"{existing_context}\n\n{profile_context}"
|
|
449
|
-
else:
|
|
450
|
-
params["context"] = profile_context
|
|
451
|
-
# Also add to description if it exists (for analyst, planner)
|
|
452
|
-
if "description" in params and isinstance(params["description"], str):
|
|
453
|
-
params["description"] = f"{params['description']}\n\n{profile_context}"
|
|
454
|
-
|
|
455
|
-
return params
|
|
456
|
-
|
|
457
|
-
def _find_artifact(
|
|
458
|
-
self, state: WorkflowState, filename: str
|
|
459
|
-
) -> Path | None:
|
|
460
|
-
"""Find artifact by filename in workflow state."""
|
|
461
|
-
for artifact in state.artifacts.values():
|
|
462
|
-
if isinstance(artifact, Artifact) and artifact.path:
|
|
463
|
-
if Path(artifact.path).name == filename:
|
|
464
|
-
return Path(artifact.path)
|
|
465
|
-
return None
|
|
466
|
-
|
|
467
|
-
def _build_command(
|
|
468
|
-
self, agent_name: str, skill_command: str, params: dict[str, Any]
|
|
469
|
-
) -> str:
|
|
470
|
-
"""
|
|
471
|
-
Build Cursor Skill command string.
|
|
472
|
-
|
|
473
|
-
Format: @agent-name command-name [--flag value]...
|
|
474
|
-
|
|
475
|
-
Args:
|
|
476
|
-
agent_name: Agent name (e.g., "analyst")
|
|
477
|
-
skill_command: Skill command name
|
|
478
|
-
params: Parameters for the command
|
|
479
|
-
|
|
480
|
-
Returns:
|
|
481
|
-
Command string
|
|
482
|
-
"""
|
|
483
|
-
parts = [f"@{agent_name}", skill_command]
|
|
484
|
-
|
|
485
|
-
for key, value in params.items():
|
|
486
|
-
if value is None:
|
|
487
|
-
continue
|
|
488
|
-
if isinstance(value, bool):
|
|
489
|
-
if value:
|
|
490
|
-
parts.append(f"--{key}")
|
|
491
|
-
elif isinstance(value, (str, int, float)):
|
|
492
|
-
# Quote string values if they contain spaces
|
|
493
|
-
if isinstance(value, str) and " " in value:
|
|
494
|
-
parts.append(f'--{key} "{value}"')
|
|
495
|
-
else:
|
|
496
|
-
parts.append(f"--{key} {value}")
|
|
497
|
-
elif isinstance(value, dict):
|
|
498
|
-
# Convert dict to compact JSON string (no newlines, no spaces)
|
|
499
|
-
# Use separators to ensure single-line output for shell safety
|
|
500
|
-
json_str = json.dumps(value, separators=(',', ':'))
|
|
501
|
-
# Escape backslashes and double quotes for Windows cmd compatibility
|
|
502
|
-
# Then wrap in double quotes (Windows-compatible)
|
|
503
|
-
escaped = json_str.replace('\\', '\\\\').replace('"', '\\"')
|
|
504
|
-
parts.append(f'--{key} "{escaped}"')
|
|
505
|
-
else:
|
|
506
|
-
parts.append(f"--{key} {value}")
|
|
507
|
-
|
|
508
|
-
return " ".join(parts)
|
|
509
|
-
|
|
510
|
-
async def _execute_skill_command(
|
|
511
|
-
self,
|
|
512
|
-
command: str,
|
|
513
|
-
worktree_path: Path,
|
|
514
|
-
step: WorkflowStep | None = None,
|
|
515
|
-
workflow_id: str | None = None,
|
|
516
|
-
) -> dict[str, Any]:
|
|
517
|
-
"""
|
|
518
|
-
Execute Skill command via Cursor Background Agents.
|
|
519
|
-
|
|
520
|
-
This implementation:
|
|
521
|
-
1. For quality/testing agents: Directly executes background agents
|
|
522
|
-
2. Tries to use Background Agent API if available
|
|
523
|
-
3. Falls back to file-based execution if API unavailable
|
|
524
|
-
4. Creates structured command files and execution instructions
|
|
525
|
-
|
|
526
|
-
Args:
|
|
527
|
-
command: Skill command string
|
|
528
|
-
worktree_path: Path to worktree
|
|
529
|
-
step: Optional workflow step for tracking
|
|
530
|
-
|
|
531
|
-
Returns:
|
|
532
|
-
Result dictionary with execution status and details
|
|
533
|
-
"""
|
|
534
|
-
# Extract agent name and action from command
|
|
535
|
-
agent_name = None
|
|
536
|
-
action = None
|
|
537
|
-
if command.startswith("@"):
|
|
538
|
-
parts = command.split()
|
|
539
|
-
if parts:
|
|
540
|
-
agent_name = parts[0][1:] # Remove "@"
|
|
541
|
-
if len(parts) > 1:
|
|
542
|
-
action = parts[1]
|
|
543
|
-
|
|
544
|
-
# Background Agent API removed - always use direct execution fallback
|
|
545
|
-
import logging
|
|
546
|
-
logger = logging.getLogger(__name__)
|
|
547
|
-
logger.info(
|
|
548
|
-
f"Using direct execution fallback for command: {command}",
|
|
549
|
-
extra={
|
|
550
|
-
"command": command,
|
|
551
|
-
"worktree": str(worktree_path),
|
|
552
|
-
"method": "direct_execution",
|
|
553
|
-
},
|
|
554
|
-
)
|
|
555
|
-
|
|
556
|
-
# Execute command directly
|
|
557
|
-
result = await self.direct_execution.execute_command(
|
|
558
|
-
command=command,
|
|
559
|
-
worktree_path=worktree_path,
|
|
560
|
-
workflow_id=workflow_id,
|
|
561
|
-
step_id=getattr(step, "id", None) if step else None,
|
|
562
|
-
environment={
|
|
563
|
-
"TAPPS_AGENTS_MODE": "cursor",
|
|
564
|
-
"WORKTREE_PATH": str(worktree_path),
|
|
565
|
-
},
|
|
566
|
-
)
|
|
567
|
-
|
|
568
|
-
# Convert result to expected format
|
|
569
|
-
return {
|
|
570
|
-
"status": result.get("status", "unknown"),
|
|
571
|
-
"method": "direct_execution",
|
|
572
|
-
"command": command,
|
|
573
|
-
"worktree": str(worktree_path),
|
|
574
|
-
"message": f"Command executed directly: {result.get('status', 'unknown')}",
|
|
575
|
-
"result": result,
|
|
576
|
-
}
|
|
577
|
-
|
|
578
|
-
async def _invoke_custom_skill(
|
|
579
|
-
self,
|
|
580
|
-
skill_name: str,
|
|
581
|
-
action: str,
|
|
582
|
-
step: WorkflowStep,
|
|
583
|
-
target_path: Path | None,
|
|
584
|
-
worktree_path: Path,
|
|
585
|
-
state: WorkflowState,
|
|
586
|
-
) -> dict[str, Any]:
|
|
587
|
-
"""
|
|
588
|
-
Invoke a custom Skill for a workflow step.
|
|
589
|
-
|
|
590
|
-
Args:
|
|
591
|
-
skill_name: Name of the custom Skill
|
|
592
|
-
action: Action/command to perform
|
|
593
|
-
step: Workflow step definition
|
|
594
|
-
target_path: Optional target file path
|
|
595
|
-
worktree_path: Path to worktree for this step
|
|
596
|
-
state: Current workflow state
|
|
597
|
-
|
|
598
|
-
Returns:
|
|
599
|
-
Result dictionary from Skill execution
|
|
600
|
-
"""
|
|
601
|
-
# Get Skill metadata
|
|
602
|
-
skill_metadata = self.skill_integration.get_skill_metadata(skill_name)
|
|
603
|
-
if not skill_metadata:
|
|
604
|
-
raise ValueError(f"Custom Skill not found: {skill_name}")
|
|
605
|
-
|
|
606
|
-
# Create Skill context
|
|
607
|
-
skill_context = self.skill_integration.create_skill_context(
|
|
608
|
-
workflow_id=getattr(step, "workflow_id", None) if step else None,
|
|
609
|
-
step_id=getattr(step, "id", None) if step else None,
|
|
610
|
-
state=state.variables if state else None,
|
|
611
|
-
artifacts={k: v.to_dict() if hasattr(v, "to_dict") else str(v) for k, v in state.artifacts.items()} if state else None,
|
|
612
|
-
project_profile=state.variables.get("project_profile") if state else None,
|
|
613
|
-
)
|
|
614
|
-
|
|
615
|
-
# Build parameters from step params and state
|
|
616
|
-
params: dict[str, Any] = {}
|
|
617
|
-
if step and hasattr(step, "params") and step.params:
|
|
618
|
-
params.update(step.params)
|
|
619
|
-
|
|
620
|
-
# Add common parameters
|
|
621
|
-
if target_path:
|
|
622
|
-
params["file"] = str(target_path)
|
|
623
|
-
params["target"] = str(target_path)
|
|
624
|
-
|
|
625
|
-
# Add context as JSON string for Skills to parse
|
|
626
|
-
# Use compact format (no newlines, no spaces) for shell safety
|
|
627
|
-
params["context"] = json.dumps(skill_context.to_dict(), separators=(',', ':'))
|
|
628
|
-
|
|
629
|
-
# Build command string using custom Skill name
|
|
630
|
-
command_str = self._build_command(
|
|
631
|
-
agent_name=skill_name, # Use Skill name as agent name
|
|
632
|
-
skill_command=action,
|
|
633
|
-
params=params,
|
|
634
|
-
)
|
|
635
|
-
|
|
636
|
-
# Execute via Cursor (using Background Agent or direct invocation)
|
|
637
|
-
result = await self._execute_skill_command(
|
|
638
|
-
command=command_str,
|
|
639
|
-
worktree_path=worktree_path,
|
|
640
|
-
step=step,
|
|
641
|
-
)
|
|
642
|
-
|
|
643
|
-
# Store result in state for tracking
|
|
644
|
-
if state:
|
|
645
|
-
state.variables[f"{skill_name}_{action}_result"] = result
|
|
646
|
-
|
|
647
|
-
return result
|
|
648
|
-
|
|
1
|
+
"""
|
|
2
|
+
Skill Invoker - Invokes Cursor Skills for workflow execution.
|
|
3
|
+
|
|
4
|
+
This module translates workflow actions to Cursor Skill commands and executes them.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
import json
|
|
10
|
+
import logging
|
|
11
|
+
from pathlib import Path
|
|
12
|
+
from typing import Any
|
|
13
|
+
|
|
14
|
+
import requests # type: ignore[import-untyped]
|
|
15
|
+
|
|
16
|
+
logger = logging.getLogger(__name__)
|
|
17
|
+
|
|
18
|
+
from ..core.skill_integration import (
|
|
19
|
+
get_skill_integration_manager,
|
|
20
|
+
)
|
|
21
|
+
from .cursor_skill_helper import (
|
|
22
|
+
create_skill_command_file,
|
|
23
|
+
create_skill_execution_instructions,
|
|
24
|
+
)
|
|
25
|
+
from .models import Artifact, WorkflowState, WorkflowStep
|
|
26
|
+
from .direct_execution_fallback import DirectExecutionFallback
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class SkillInvoker:
|
|
30
|
+
"""
|
|
31
|
+
Invokes Cursor Skills for workflow execution.
|
|
32
|
+
|
|
33
|
+
Translates workflow actions to Skill commands and executes them.
|
|
34
|
+
Supports both Background Agent API and file-based execution.
|
|
35
|
+
"""
|
|
36
|
+
|
|
37
|
+
def __init__(self, project_root: Path | None = None, use_api: bool = True):
|
|
38
|
+
"""
|
|
39
|
+
Initialize Skill Invoker.
|
|
40
|
+
|
|
41
|
+
Args:
|
|
42
|
+
project_root: Root directory for the project
|
|
43
|
+
use_api: Whether to use Background Agent API (True) or file-based (False)
|
|
44
|
+
"""
|
|
45
|
+
self.project_root = project_root or Path.cwd()
|
|
46
|
+
self.use_api = use_api
|
|
47
|
+
# Background Agent API removed - always use direct execution fallback
|
|
48
|
+
self.skill_integration = get_skill_integration_manager(project_root=self.project_root)
|
|
49
|
+
# Initialize direct execution fallback (Phase 2: Simpler fallback)
|
|
50
|
+
self.direct_execution = DirectExecutionFallback(project_root=self.project_root)
|
|
51
|
+
|
|
52
|
+
# Command mapping: (agent_name, action) -> (skill_command, parameters)
|
|
53
|
+
COMMAND_MAPPING: dict[tuple[str, str], tuple[str, dict[str, Any]]] = {
|
|
54
|
+
# Analyst
|
|
55
|
+
("analyst", "gather-requirements"): (
|
|
56
|
+
"gather-requirements",
|
|
57
|
+
{"description": "user_prompt", "output_file": "requirements.md"},
|
|
58
|
+
),
|
|
59
|
+
("analyst", "gather_requirements"): (
|
|
60
|
+
"gather-requirements",
|
|
61
|
+
{"description": "user_prompt", "output_file": "requirements.md"},
|
|
62
|
+
),
|
|
63
|
+
|
|
64
|
+
# Planner
|
|
65
|
+
("planner", "plan"): (
|
|
66
|
+
"plan",
|
|
67
|
+
{"description": "requirements_content"},
|
|
68
|
+
),
|
|
69
|
+
("planner", "create-stories"): (
|
|
70
|
+
"plan",
|
|
71
|
+
{"description": "requirements_content"},
|
|
72
|
+
),
|
|
73
|
+
("planner", "create_stories"): (
|
|
74
|
+
"plan",
|
|
75
|
+
{"description": "requirements_content"},
|
|
76
|
+
),
|
|
77
|
+
|
|
78
|
+
# Architect
|
|
79
|
+
("architect", "design-system"): (
|
|
80
|
+
"design-system",
|
|
81
|
+
{"requirements": "requirements_file", "context": "stories_content", "output_file": "architecture.md"},
|
|
82
|
+
),
|
|
83
|
+
("architect", "design_system"): (
|
|
84
|
+
"design-system",
|
|
85
|
+
{"requirements": "requirements_file", "context": "stories_content", "output_file": "architecture.md"},
|
|
86
|
+
),
|
|
87
|
+
|
|
88
|
+
# Designer
|
|
89
|
+
("designer", "design-api"): (
|
|
90
|
+
"design-api",
|
|
91
|
+
{"requirements": "requirements_file", "architecture": "architecture_file"},
|
|
92
|
+
),
|
|
93
|
+
("designer", "api_design"): (
|
|
94
|
+
"design-api",
|
|
95
|
+
{"requirements": "requirements_file", "architecture": "architecture_file"},
|
|
96
|
+
),
|
|
97
|
+
("designer", "api-design"): (
|
|
98
|
+
"design-api",
|
|
99
|
+
{"requirements": "requirements_file", "architecture": "architecture_file"},
|
|
100
|
+
),
|
|
101
|
+
|
|
102
|
+
# Implementer
|
|
103
|
+
("implementer", "implement"): (
|
|
104
|
+
"implement",
|
|
105
|
+
{"specification": "specification_content", "file_path": "target_file"},
|
|
106
|
+
),
|
|
107
|
+
("implementer", "write-code"): (
|
|
108
|
+
"implement",
|
|
109
|
+
{"specification": "specification_content", "file_path": "target_file"},
|
|
110
|
+
),
|
|
111
|
+
("implementer", "write_code"): (
|
|
112
|
+
"implement",
|
|
113
|
+
{"specification": "specification_content", "file_path": "target_file"},
|
|
114
|
+
),
|
|
115
|
+
("implementer", "refactor"): (
|
|
116
|
+
"refactor",
|
|
117
|
+
{"file": "target_file", "requirements": "requirements_file"},
|
|
118
|
+
),
|
|
119
|
+
|
|
120
|
+
# Reviewer
|
|
121
|
+
("reviewer", "review"): (
|
|
122
|
+
"review",
|
|
123
|
+
{"file": "target_file"},
|
|
124
|
+
),
|
|
125
|
+
("reviewer", "review-code"): (
|
|
126
|
+
"review",
|
|
127
|
+
{"file": "target_file"},
|
|
128
|
+
),
|
|
129
|
+
("reviewer", "review_code"): (
|
|
130
|
+
"review",
|
|
131
|
+
{"file": "target_file"},
|
|
132
|
+
),
|
|
133
|
+
|
|
134
|
+
# Tester
|
|
135
|
+
("tester", "test"): (
|
|
136
|
+
"test",
|
|
137
|
+
{"file": "target_file"},
|
|
138
|
+
),
|
|
139
|
+
("tester", "write-tests"): (
|
|
140
|
+
"test",
|
|
141
|
+
{"file": "target_file"},
|
|
142
|
+
),
|
|
143
|
+
("tester", "write_tests"): (
|
|
144
|
+
"test",
|
|
145
|
+
{"file": "target_file"},
|
|
146
|
+
),
|
|
147
|
+
|
|
148
|
+
# Debugger
|
|
149
|
+
("debugger", "analyze-error"): (
|
|
150
|
+
"analyze-error",
|
|
151
|
+
{"error_message": "error_message", "stack_trace": "stack_trace"},
|
|
152
|
+
),
|
|
153
|
+
("debugger", "analyze_error"): (
|
|
154
|
+
"analyze-error",
|
|
155
|
+
{"error_message": "error_message", "stack_trace": "stack_trace"},
|
|
156
|
+
),
|
|
157
|
+
|
|
158
|
+
# Documenter
|
|
159
|
+
("documenter", "document"): (
|
|
160
|
+
"document",
|
|
161
|
+
{"target": "target_file", "output_dir": "docs"},
|
|
162
|
+
),
|
|
163
|
+
("documenter", "generate-docs"): (
|
|
164
|
+
"document",
|
|
165
|
+
{"target": "target_file", "output_dir": "docs"},
|
|
166
|
+
),
|
|
167
|
+
("documenter", "generate_docs"): (
|
|
168
|
+
"document",
|
|
169
|
+
{"target": "target_file", "output_dir": "docs"},
|
|
170
|
+
),
|
|
171
|
+
("documenter", "update_docstrings"): (
|
|
172
|
+
"update-docstrings",
|
|
173
|
+
{"file": "target_file", "write_file": True},
|
|
174
|
+
),
|
|
175
|
+
("documenter", "update-docstrings"): (
|
|
176
|
+
"update-docstrings",
|
|
177
|
+
{"file": "target_file", "write_file": True},
|
|
178
|
+
),
|
|
179
|
+
|
|
180
|
+
# Ops
|
|
181
|
+
("ops", "security-scan"): (
|
|
182
|
+
"security-scan",
|
|
183
|
+
{"target": "target_file", "type": "code"},
|
|
184
|
+
),
|
|
185
|
+
("ops", "security_scan"): (
|
|
186
|
+
"security-scan",
|
|
187
|
+
{"target": "target_file", "type": "code"},
|
|
188
|
+
),
|
|
189
|
+
|
|
190
|
+
# Improver
|
|
191
|
+
("improver", "improve"): (
|
|
192
|
+
"improve",
|
|
193
|
+
{"file": "target_file", "feedback": "review_feedback"},
|
|
194
|
+
),
|
|
195
|
+
("improver", "refactor"): (
|
|
196
|
+
"refactor",
|
|
197
|
+
{"file_path": "target_file", "instruction": "debug_report"},
|
|
198
|
+
),
|
|
199
|
+
|
|
200
|
+
# Enhancer
|
|
201
|
+
("enhancer", "enhance"): (
|
|
202
|
+
"enhance",
|
|
203
|
+
{"prompt": "user_prompt", "format": "markdown"},
|
|
204
|
+
),
|
|
205
|
+
("enhancer", "enhance_prompt"): (
|
|
206
|
+
"enhance",
|
|
207
|
+
{"prompt": "user_prompt", "format": "markdown"},
|
|
208
|
+
),
|
|
209
|
+
("enhancer", "enhance-prompt"): (
|
|
210
|
+
"enhance",
|
|
211
|
+
{"prompt": "user_prompt", "format": "markdown"},
|
|
212
|
+
),
|
|
213
|
+
|
|
214
|
+
# Quality Agent (Background Cloud)
|
|
215
|
+
("quality", "analyze"): (
|
|
216
|
+
"quality-analyze",
|
|
217
|
+
{"target": "target_file"},
|
|
218
|
+
),
|
|
219
|
+
("quality", "quality-check"): (
|
|
220
|
+
"quality-analyze",
|
|
221
|
+
{"target": "target_file"},
|
|
222
|
+
),
|
|
223
|
+
("quality", "quality_check"): (
|
|
224
|
+
"quality-analyze",
|
|
225
|
+
{"target": "target_file"},
|
|
226
|
+
),
|
|
227
|
+
|
|
228
|
+
# Testing Agent (Background Cloud)
|
|
229
|
+
("testing", "run-tests"): (
|
|
230
|
+
"testing-run",
|
|
231
|
+
{"test_path": "target_file", "coverage": True},
|
|
232
|
+
),
|
|
233
|
+
("testing", "run_tests"): (
|
|
234
|
+
"testing-run",
|
|
235
|
+
{"test_path": "target_file", "coverage": True},
|
|
236
|
+
),
|
|
237
|
+
("testing", "test"): (
|
|
238
|
+
"testing-run",
|
|
239
|
+
{"test_path": "target_file", "coverage": True},
|
|
240
|
+
),
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
|
|
244
|
+
async def invoke_skill(
|
|
245
|
+
self,
|
|
246
|
+
agent_name: str,
|
|
247
|
+
action: str,
|
|
248
|
+
step: WorkflowStep,
|
|
249
|
+
target_path: Path | None,
|
|
250
|
+
worktree_path: Path,
|
|
251
|
+
state: WorkflowState,
|
|
252
|
+
) -> dict[str, Any]:
|
|
253
|
+
"""
|
|
254
|
+
Invoke a Cursor Skill for a workflow step.
|
|
255
|
+
|
|
256
|
+
Supports both built-in and custom Skills. Custom Skills are checked first.
|
|
257
|
+
|
|
258
|
+
Args:
|
|
259
|
+
agent_name: Name of the agent (e.g., "analyst")
|
|
260
|
+
action: Action to perform (e.g., "gather-requirements")
|
|
261
|
+
step: Workflow step definition
|
|
262
|
+
target_path: Optional target file path
|
|
263
|
+
worktree_path: Path to worktree for this step
|
|
264
|
+
state: Current workflow state
|
|
265
|
+
|
|
266
|
+
Returns:
|
|
267
|
+
Result dictionary from Skill execution
|
|
268
|
+
"""
|
|
269
|
+
# Check if step specifies a custom Skill (in metadata or as attribute)
|
|
270
|
+
custom_skill_name = None
|
|
271
|
+
if step:
|
|
272
|
+
# Check metadata first
|
|
273
|
+
if hasattr(step, "metadata") and step.metadata:
|
|
274
|
+
custom_skill_name = step.metadata.get("skill")
|
|
275
|
+
# Also check direct attribute (for future extension)
|
|
276
|
+
if not custom_skill_name:
|
|
277
|
+
custom_skill_name = getattr(step, "skill", None)
|
|
278
|
+
|
|
279
|
+
# If custom Skill is specified, use it
|
|
280
|
+
if custom_skill_name and self.skill_integration.is_custom_skill(custom_skill_name):
|
|
281
|
+
return await self._invoke_custom_skill(
|
|
282
|
+
skill_name=custom_skill_name,
|
|
283
|
+
action=action,
|
|
284
|
+
step=step,
|
|
285
|
+
target_path=target_path,
|
|
286
|
+
worktree_path=worktree_path,
|
|
287
|
+
state=state,
|
|
288
|
+
)
|
|
289
|
+
|
|
290
|
+
# Check for custom Skills that match agent/action pattern
|
|
291
|
+
custom_skills = self.skill_integration.get_skills_for_agent(agent_name.lower())
|
|
292
|
+
for skill in custom_skills:
|
|
293
|
+
# Try to match action to Skill commands (simplified matching)
|
|
294
|
+
# In a full implementation, we'd parse the Skill's command definitions
|
|
295
|
+
# For now, we'll use the Skill name as the agent name if it matches
|
|
296
|
+
if skill.name.lower().startswith(agent_name.lower()) or agent_name.lower() in skill.name.lower():
|
|
297
|
+
return await self._invoke_custom_skill(
|
|
298
|
+
skill_name=skill.name,
|
|
299
|
+
action=action,
|
|
300
|
+
step=step,
|
|
301
|
+
target_path=target_path,
|
|
302
|
+
worktree_path=worktree_path,
|
|
303
|
+
state=state,
|
|
304
|
+
)
|
|
305
|
+
|
|
306
|
+
# Fall back to built-in command mapping
|
|
307
|
+
key = (agent_name.lower(), action.lower())
|
|
308
|
+
if key not in self.COMMAND_MAPPING:
|
|
309
|
+
raise ValueError(
|
|
310
|
+
f"Unknown command: {agent_name}/{action}. "
|
|
311
|
+
f"Available: {list(self.COMMAND_MAPPING.keys())}"
|
|
312
|
+
)
|
|
313
|
+
|
|
314
|
+
skill_command, param_mapping = self.COMMAND_MAPPING[key]
|
|
315
|
+
|
|
316
|
+
# Build parameters from state and context
|
|
317
|
+
params = self._build_parameters(
|
|
318
|
+
param_mapping=param_mapping,
|
|
319
|
+
step=step,
|
|
320
|
+
target_path=target_path,
|
|
321
|
+
worktree_path=worktree_path,
|
|
322
|
+
state=state,
|
|
323
|
+
)
|
|
324
|
+
|
|
325
|
+
# Build Skill command string
|
|
326
|
+
command_str = self._build_command(
|
|
327
|
+
agent_name=agent_name,
|
|
328
|
+
skill_command=skill_command,
|
|
329
|
+
params=params,
|
|
330
|
+
)
|
|
331
|
+
|
|
332
|
+
# Execute via Cursor chat (using Background Agent or direct invocation)
|
|
333
|
+
result = await self._execute_skill_command(
|
|
334
|
+
command=command_str,
|
|
335
|
+
worktree_path=worktree_path,
|
|
336
|
+
step=step,
|
|
337
|
+
workflow_id=getattr(state, "workflow_id", None),
|
|
338
|
+
)
|
|
339
|
+
|
|
340
|
+
# Store result in state for tracking
|
|
341
|
+
if state:
|
|
342
|
+
state.variables[f"{agent_name}_{action}_result"] = result
|
|
343
|
+
|
|
344
|
+
return result
|
|
345
|
+
|
|
346
|
+
def _build_parameters(
|
|
347
|
+
self,
|
|
348
|
+
param_mapping: dict[str, str],
|
|
349
|
+
step: WorkflowStep,
|
|
350
|
+
target_path: Path | None,
|
|
351
|
+
worktree_path: Path,
|
|
352
|
+
state: WorkflowState,
|
|
353
|
+
) -> dict[str, Any]:
|
|
354
|
+
"""
|
|
355
|
+
Build parameters for Skill command from workflow state.
|
|
356
|
+
|
|
357
|
+
Args:
|
|
358
|
+
param_mapping: Mapping from parameter names to state keys
|
|
359
|
+
step: Workflow step
|
|
360
|
+
target_path: Optional target file path
|
|
361
|
+
worktree_path: Path to worktree
|
|
362
|
+
state: Workflow state
|
|
363
|
+
|
|
364
|
+
Returns:
|
|
365
|
+
Dictionary of parameter values
|
|
366
|
+
"""
|
|
367
|
+
params: dict[str, Any] = {}
|
|
368
|
+
|
|
369
|
+
for param_name, state_key in param_mapping.items():
|
|
370
|
+
if state_key == "user_prompt":
|
|
371
|
+
params[param_name] = state.variables.get("user_prompt", "")
|
|
372
|
+
elif state_key == "target_file":
|
|
373
|
+
params[param_name] = str(target_path) if target_path else None
|
|
374
|
+
elif state_key == "requirements_file":
|
|
375
|
+
# Find requirements.md artifact
|
|
376
|
+
req_file = self._find_artifact(state, "requirements.md")
|
|
377
|
+
params[param_name] = str(req_file) if req_file else None
|
|
378
|
+
elif state_key == "requirements_content":
|
|
379
|
+
req_file = self._find_artifact(state, "requirements.md")
|
|
380
|
+
if req_file and req_file.exists():
|
|
381
|
+
params[param_name] = req_file.read_text(encoding="utf-8")
|
|
382
|
+
else:
|
|
383
|
+
params[param_name] = ""
|
|
384
|
+
elif state_key == "architecture_file":
|
|
385
|
+
arch_file = self._find_artifact(state, "architecture.md")
|
|
386
|
+
params[param_name] = str(arch_file) if arch_file else None
|
|
387
|
+
elif state_key == "stories_content":
|
|
388
|
+
# Find stories directory
|
|
389
|
+
stories_dir = worktree_path / "stories"
|
|
390
|
+
if stories_dir.exists():
|
|
391
|
+
# Read all story files
|
|
392
|
+
story_files = list(stories_dir.glob("*.md"))
|
|
393
|
+
content = "\n\n".join(
|
|
394
|
+
f.read_text(encoding="utf-8") for f in story_files
|
|
395
|
+
)
|
|
396
|
+
params[param_name] = content
|
|
397
|
+
else:
|
|
398
|
+
params[param_name] = ""
|
|
399
|
+
elif state_key == "specification_content":
|
|
400
|
+
# Combine requirements and architecture
|
|
401
|
+
req_content = ""
|
|
402
|
+
arch_content = ""
|
|
403
|
+
req_file = self._find_artifact(state, "requirements.md")
|
|
404
|
+
arch_file = self._find_artifact(state, "architecture.md")
|
|
405
|
+
if req_file and req_file.exists():
|
|
406
|
+
req_content = req_file.read_text(encoding="utf-8")
|
|
407
|
+
if arch_file and arch_file.exists():
|
|
408
|
+
arch_content = arch_file.read_text(encoding="utf-8")
|
|
409
|
+
params[param_name] = f"{req_content}\n\n{arch_content}"
|
|
410
|
+
elif state_key == "review_feedback":
|
|
411
|
+
# Get reviewer result from state
|
|
412
|
+
params[param_name] = state.variables.get("reviewer_result", {})
|
|
413
|
+
elif state_key == "error_message":
|
|
414
|
+
params[param_name] = state.variables.get("error_message", "")
|
|
415
|
+
elif state_key == "stack_trace":
|
|
416
|
+
params[param_name] = state.variables.get("stack_trace", "")
|
|
417
|
+
elif state_key == "debug_report":
|
|
418
|
+
# Find debug-report.md artifact
|
|
419
|
+
debug_file = self._find_artifact(state, "debug-report.md")
|
|
420
|
+
if debug_file and debug_file.exists():
|
|
421
|
+
params[param_name] = debug_file.read_text(encoding="utf-8")
|
|
422
|
+
else:
|
|
423
|
+
params[param_name] = state.variables.get("user_prompt", "")
|
|
424
|
+
elif state_key == "project_profile":
|
|
425
|
+
# Get project profile from state
|
|
426
|
+
profile_dict = state.variables.get("project_profile")
|
|
427
|
+
if profile_dict:
|
|
428
|
+
from ..core.project_profile import ProjectProfile
|
|
429
|
+
profile = ProjectProfile.from_dict(profile_dict)
|
|
430
|
+
params[param_name] = profile.format_context(min_confidence=0.7)
|
|
431
|
+
else:
|
|
432
|
+
params[param_name] = ""
|
|
433
|
+
else:
|
|
434
|
+
# Try to get from state variables
|
|
435
|
+
params[param_name] = state.variables.get(state_key, "")
|
|
436
|
+
|
|
437
|
+
# Automatically append project profile to context parameters
|
|
438
|
+
profile_dict = state.variables.get("project_profile")
|
|
439
|
+
if profile_dict:
|
|
440
|
+
from ..core.project_profile import ProjectProfile
|
|
441
|
+
profile = ProjectProfile.from_dict(profile_dict)
|
|
442
|
+
profile_context = profile.format_context(min_confidence=0.7)
|
|
443
|
+
if profile_context:
|
|
444
|
+
# Append to any existing context parameter
|
|
445
|
+
if "context" in params:
|
|
446
|
+
existing_context = params.get("context", "")
|
|
447
|
+
if existing_context:
|
|
448
|
+
params["context"] = f"{existing_context}\n\n{profile_context}"
|
|
449
|
+
else:
|
|
450
|
+
params["context"] = profile_context
|
|
451
|
+
# Also add to description if it exists (for analyst, planner)
|
|
452
|
+
if "description" in params and isinstance(params["description"], str):
|
|
453
|
+
params["description"] = f"{params['description']}\n\n{profile_context}"
|
|
454
|
+
|
|
455
|
+
return params
|
|
456
|
+
|
|
457
|
+
def _find_artifact(
|
|
458
|
+
self, state: WorkflowState, filename: str
|
|
459
|
+
) -> Path | None:
|
|
460
|
+
"""Find artifact by filename in workflow state."""
|
|
461
|
+
for artifact in state.artifacts.values():
|
|
462
|
+
if isinstance(artifact, Artifact) and artifact.path:
|
|
463
|
+
if Path(artifact.path).name == filename:
|
|
464
|
+
return Path(artifact.path)
|
|
465
|
+
return None
|
|
466
|
+
|
|
467
|
+
def _build_command(
|
|
468
|
+
self, agent_name: str, skill_command: str, params: dict[str, Any]
|
|
469
|
+
) -> str:
|
|
470
|
+
"""
|
|
471
|
+
Build Cursor Skill command string.
|
|
472
|
+
|
|
473
|
+
Format: @agent-name command-name [--flag value]...
|
|
474
|
+
|
|
475
|
+
Args:
|
|
476
|
+
agent_name: Agent name (e.g., "analyst")
|
|
477
|
+
skill_command: Skill command name
|
|
478
|
+
params: Parameters for the command
|
|
479
|
+
|
|
480
|
+
Returns:
|
|
481
|
+
Command string
|
|
482
|
+
"""
|
|
483
|
+
parts = [f"@{agent_name}", skill_command]
|
|
484
|
+
|
|
485
|
+
for key, value in params.items():
|
|
486
|
+
if value is None:
|
|
487
|
+
continue
|
|
488
|
+
if isinstance(value, bool):
|
|
489
|
+
if value:
|
|
490
|
+
parts.append(f"--{key}")
|
|
491
|
+
elif isinstance(value, (str, int, float)):
|
|
492
|
+
# Quote string values if they contain spaces
|
|
493
|
+
if isinstance(value, str) and " " in value:
|
|
494
|
+
parts.append(f'--{key} "{value}"')
|
|
495
|
+
else:
|
|
496
|
+
parts.append(f"--{key} {value}")
|
|
497
|
+
elif isinstance(value, dict):
|
|
498
|
+
# Convert dict to compact JSON string (no newlines, no spaces)
|
|
499
|
+
# Use separators to ensure single-line output for shell safety
|
|
500
|
+
json_str = json.dumps(value, separators=(',', ':'))
|
|
501
|
+
# Escape backslashes and double quotes for Windows cmd compatibility
|
|
502
|
+
# Then wrap in double quotes (Windows-compatible)
|
|
503
|
+
escaped = json_str.replace('\\', '\\\\').replace('"', '\\"')
|
|
504
|
+
parts.append(f'--{key} "{escaped}"')
|
|
505
|
+
else:
|
|
506
|
+
parts.append(f"--{key} {value}")
|
|
507
|
+
|
|
508
|
+
return " ".join(parts)
|
|
509
|
+
|
|
510
|
+
async def _execute_skill_command(
|
|
511
|
+
self,
|
|
512
|
+
command: str,
|
|
513
|
+
worktree_path: Path,
|
|
514
|
+
step: WorkflowStep | None = None,
|
|
515
|
+
workflow_id: str | None = None,
|
|
516
|
+
) -> dict[str, Any]:
|
|
517
|
+
"""
|
|
518
|
+
Execute Skill command via Cursor Background Agents.
|
|
519
|
+
|
|
520
|
+
This implementation:
|
|
521
|
+
1. For quality/testing agents: Directly executes background agents
|
|
522
|
+
2. Tries to use Background Agent API if available
|
|
523
|
+
3. Falls back to file-based execution if API unavailable
|
|
524
|
+
4. Creates structured command files and execution instructions
|
|
525
|
+
|
|
526
|
+
Args:
|
|
527
|
+
command: Skill command string
|
|
528
|
+
worktree_path: Path to worktree
|
|
529
|
+
step: Optional workflow step for tracking
|
|
530
|
+
|
|
531
|
+
Returns:
|
|
532
|
+
Result dictionary with execution status and details
|
|
533
|
+
"""
|
|
534
|
+
# Extract agent name and action from command
|
|
535
|
+
agent_name = None
|
|
536
|
+
action = None
|
|
537
|
+
if command.startswith("@"):
|
|
538
|
+
parts = command.split()
|
|
539
|
+
if parts:
|
|
540
|
+
agent_name = parts[0][1:] # Remove "@"
|
|
541
|
+
if len(parts) > 1:
|
|
542
|
+
action = parts[1]
|
|
543
|
+
|
|
544
|
+
# Background Agent API removed - always use direct execution fallback
|
|
545
|
+
import logging
|
|
546
|
+
logger = logging.getLogger(__name__)
|
|
547
|
+
logger.info(
|
|
548
|
+
f"Using direct execution fallback for command: {command}",
|
|
549
|
+
extra={
|
|
550
|
+
"command": command,
|
|
551
|
+
"worktree": str(worktree_path),
|
|
552
|
+
"method": "direct_execution",
|
|
553
|
+
},
|
|
554
|
+
)
|
|
555
|
+
|
|
556
|
+
# Execute command directly
|
|
557
|
+
result = await self.direct_execution.execute_command(
|
|
558
|
+
command=command,
|
|
559
|
+
worktree_path=worktree_path,
|
|
560
|
+
workflow_id=workflow_id,
|
|
561
|
+
step_id=getattr(step, "id", None) if step else None,
|
|
562
|
+
environment={
|
|
563
|
+
"TAPPS_AGENTS_MODE": "cursor",
|
|
564
|
+
"WORKTREE_PATH": str(worktree_path),
|
|
565
|
+
},
|
|
566
|
+
)
|
|
567
|
+
|
|
568
|
+
# Convert result to expected format
|
|
569
|
+
return {
|
|
570
|
+
"status": result.get("status", "unknown"),
|
|
571
|
+
"method": "direct_execution",
|
|
572
|
+
"command": command,
|
|
573
|
+
"worktree": str(worktree_path),
|
|
574
|
+
"message": f"Command executed directly: {result.get('status', 'unknown')}",
|
|
575
|
+
"result": result,
|
|
576
|
+
}
|
|
577
|
+
|
|
578
|
+
async def _invoke_custom_skill(
|
|
579
|
+
self,
|
|
580
|
+
skill_name: str,
|
|
581
|
+
action: str,
|
|
582
|
+
step: WorkflowStep,
|
|
583
|
+
target_path: Path | None,
|
|
584
|
+
worktree_path: Path,
|
|
585
|
+
state: WorkflowState,
|
|
586
|
+
) -> dict[str, Any]:
|
|
587
|
+
"""
|
|
588
|
+
Invoke a custom Skill for a workflow step.
|
|
589
|
+
|
|
590
|
+
Args:
|
|
591
|
+
skill_name: Name of the custom Skill
|
|
592
|
+
action: Action/command to perform
|
|
593
|
+
step: Workflow step definition
|
|
594
|
+
target_path: Optional target file path
|
|
595
|
+
worktree_path: Path to worktree for this step
|
|
596
|
+
state: Current workflow state
|
|
597
|
+
|
|
598
|
+
Returns:
|
|
599
|
+
Result dictionary from Skill execution
|
|
600
|
+
"""
|
|
601
|
+
# Get Skill metadata
|
|
602
|
+
skill_metadata = self.skill_integration.get_skill_metadata(skill_name)
|
|
603
|
+
if not skill_metadata:
|
|
604
|
+
raise ValueError(f"Custom Skill not found: {skill_name}")
|
|
605
|
+
|
|
606
|
+
# Create Skill context
|
|
607
|
+
skill_context = self.skill_integration.create_skill_context(
|
|
608
|
+
workflow_id=getattr(step, "workflow_id", None) if step else None,
|
|
609
|
+
step_id=getattr(step, "id", None) if step else None,
|
|
610
|
+
state=state.variables if state else None,
|
|
611
|
+
artifacts={k: v.to_dict() if hasattr(v, "to_dict") else str(v) for k, v in state.artifacts.items()} if state else None,
|
|
612
|
+
project_profile=state.variables.get("project_profile") if state else None,
|
|
613
|
+
)
|
|
614
|
+
|
|
615
|
+
# Build parameters from step params and state
|
|
616
|
+
params: dict[str, Any] = {}
|
|
617
|
+
if step and hasattr(step, "params") and step.params:
|
|
618
|
+
params.update(step.params)
|
|
619
|
+
|
|
620
|
+
# Add common parameters
|
|
621
|
+
if target_path:
|
|
622
|
+
params["file"] = str(target_path)
|
|
623
|
+
params["target"] = str(target_path)
|
|
624
|
+
|
|
625
|
+
# Add context as JSON string for Skills to parse
|
|
626
|
+
# Use compact format (no newlines, no spaces) for shell safety
|
|
627
|
+
params["context"] = json.dumps(skill_context.to_dict(), separators=(',', ':'))
|
|
628
|
+
|
|
629
|
+
# Build command string using custom Skill name
|
|
630
|
+
command_str = self._build_command(
|
|
631
|
+
agent_name=skill_name, # Use Skill name as agent name
|
|
632
|
+
skill_command=action,
|
|
633
|
+
params=params,
|
|
634
|
+
)
|
|
635
|
+
|
|
636
|
+
# Execute via Cursor (using Background Agent or direct invocation)
|
|
637
|
+
result = await self._execute_skill_command(
|
|
638
|
+
command=command_str,
|
|
639
|
+
worktree_path=worktree_path,
|
|
640
|
+
step=step,
|
|
641
|
+
)
|
|
642
|
+
|
|
643
|
+
# Store result in state for tracking
|
|
644
|
+
if state:
|
|
645
|
+
state.variables[f"{skill_name}_{action}_result"] = result
|
|
646
|
+
|
|
647
|
+
return result
|
|
648
|
+
|