tapps-agents 3.6.0__py3-none-any.whl → 3.6.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- tapps_agents/__init__.py +2 -2
- tapps_agents/agents/__init__.py +22 -22
- tapps_agents/agents/analyst/__init__.py +5 -5
- tapps_agents/agents/architect/__init__.py +5 -5
- tapps_agents/agents/architect/agent.py +1033 -1033
- tapps_agents/agents/architect/pattern_detector.py +75 -75
- tapps_agents/agents/cleanup/__init__.py +7 -7
- tapps_agents/agents/cleanup/agent.py +445 -445
- tapps_agents/agents/debugger/__init__.py +7 -7
- tapps_agents/agents/debugger/agent.py +310 -310
- tapps_agents/agents/debugger/error_analyzer.py +437 -437
- tapps_agents/agents/designer/__init__.py +5 -5
- tapps_agents/agents/designer/agent.py +786 -786
- tapps_agents/agents/designer/visual_designer.py +638 -638
- tapps_agents/agents/documenter/__init__.py +7 -7
- tapps_agents/agents/documenter/agent.py +531 -531
- tapps_agents/agents/documenter/doc_generator.py +472 -472
- tapps_agents/agents/documenter/doc_validator.py +393 -393
- tapps_agents/agents/documenter/framework_doc_updater.py +493 -493
- tapps_agents/agents/enhancer/__init__.py +7 -7
- tapps_agents/agents/evaluator/__init__.py +7 -7
- tapps_agents/agents/evaluator/agent.py +443 -443
- tapps_agents/agents/evaluator/priority_evaluator.py +641 -641
- tapps_agents/agents/evaluator/quality_analyzer.py +147 -147
- tapps_agents/agents/evaluator/report_generator.py +344 -344
- tapps_agents/agents/evaluator/usage_analyzer.py +192 -192
- tapps_agents/agents/evaluator/workflow_analyzer.py +189 -189
- tapps_agents/agents/implementer/__init__.py +7 -7
- tapps_agents/agents/implementer/agent.py +798 -798
- tapps_agents/agents/implementer/auto_fix.py +1119 -1119
- tapps_agents/agents/implementer/code_generator.py +73 -73
- tapps_agents/agents/improver/__init__.py +1 -1
- tapps_agents/agents/improver/agent.py +753 -753
- tapps_agents/agents/ops/__init__.py +1 -1
- tapps_agents/agents/ops/agent.py +619 -619
- tapps_agents/agents/ops/dependency_analyzer.py +600 -600
- tapps_agents/agents/orchestrator/__init__.py +5 -5
- tapps_agents/agents/orchestrator/agent.py +522 -522
- tapps_agents/agents/planner/__init__.py +7 -7
- tapps_agents/agents/planner/agent.py +1127 -1127
- tapps_agents/agents/reviewer/__init__.py +24 -24
- tapps_agents/agents/reviewer/agent.py +3513 -3513
- tapps_agents/agents/reviewer/aggregator.py +213 -213
- tapps_agents/agents/reviewer/batch_review.py +448 -448
- tapps_agents/agents/reviewer/cache.py +443 -443
- tapps_agents/agents/reviewer/context7_enhancer.py +630 -630
- tapps_agents/agents/reviewer/context_detector.py +203 -203
- tapps_agents/agents/reviewer/docker_compose_validator.py +158 -158
- tapps_agents/agents/reviewer/dockerfile_validator.py +176 -176
- tapps_agents/agents/reviewer/error_handling.py +126 -126
- tapps_agents/agents/reviewer/feedback_generator.py +490 -490
- tapps_agents/agents/reviewer/influxdb_validator.py +316 -316
- tapps_agents/agents/reviewer/issue_tracking.py +169 -169
- tapps_agents/agents/reviewer/library_detector.py +295 -295
- tapps_agents/agents/reviewer/library_patterns.py +268 -268
- tapps_agents/agents/reviewer/maintainability_scorer.py +593 -593
- tapps_agents/agents/reviewer/metric_strategies.py +276 -276
- tapps_agents/agents/reviewer/mqtt_validator.py +160 -160
- tapps_agents/agents/reviewer/output_enhancer.py +105 -105
- tapps_agents/agents/reviewer/pattern_detector.py +241 -241
- tapps_agents/agents/reviewer/performance_scorer.py +357 -357
- tapps_agents/agents/reviewer/phased_review.py +516 -516
- tapps_agents/agents/reviewer/progressive_review.py +435 -435
- tapps_agents/agents/reviewer/react_scorer.py +331 -331
- tapps_agents/agents/reviewer/score_constants.py +228 -228
- tapps_agents/agents/reviewer/score_validator.py +507 -507
- tapps_agents/agents/reviewer/scorer_registry.py +373 -373
- tapps_agents/agents/reviewer/service_discovery.py +534 -534
- tapps_agents/agents/reviewer/tools/parallel_executor.py +581 -581
- tapps_agents/agents/reviewer/tools/ruff_grouping.py +250 -250
- tapps_agents/agents/reviewer/tools/scoped_mypy.py +284 -284
- tapps_agents/agents/reviewer/typescript_scorer.py +1142 -1142
- tapps_agents/agents/reviewer/validation.py +208 -208
- tapps_agents/agents/reviewer/websocket_validator.py +132 -132
- tapps_agents/agents/tester/__init__.py +7 -7
- tapps_agents/agents/tester/accessibility_auditor.py +309 -309
- tapps_agents/agents/tester/agent.py +1080 -1080
- tapps_agents/agents/tester/batch_generator.py +54 -54
- tapps_agents/agents/tester/context_learner.py +51 -51
- tapps_agents/agents/tester/coverage_analyzer.py +386 -386
- tapps_agents/agents/tester/coverage_test_generator.py +290 -290
- tapps_agents/agents/tester/debug_enhancer.py +238 -238
- tapps_agents/agents/tester/device_emulator.py +241 -241
- tapps_agents/agents/tester/integration_generator.py +62 -62
- tapps_agents/agents/tester/network_recorder.py +300 -300
- tapps_agents/agents/tester/performance_monitor.py +320 -320
- tapps_agents/agents/tester/test_fixer.py +316 -316
- tapps_agents/agents/tester/test_generator.py +632 -632
- tapps_agents/agents/tester/trace_manager.py +234 -234
- tapps_agents/agents/tester/visual_regression.py +291 -291
- tapps_agents/analysis/pattern_detector.py +36 -36
- tapps_agents/beads/hydration.py +213 -213
- tapps_agents/beads/parse.py +32 -32
- tapps_agents/beads/specs.py +206 -206
- tapps_agents/cli/__init__.py +9 -9
- tapps_agents/cli/__main__.py +8 -8
- tapps_agents/cli/base.py +478 -478
- tapps_agents/cli/command_classifier.py +72 -72
- tapps_agents/cli/commands/__init__.py +2 -2
- tapps_agents/cli/commands/analyst.py +173 -173
- tapps_agents/cli/commands/architect.py +109 -109
- tapps_agents/cli/commands/cleanup_agent.py +92 -92
- tapps_agents/cli/commands/common.py +126 -126
- tapps_agents/cli/commands/debugger.py +90 -90
- tapps_agents/cli/commands/designer.py +112 -112
- tapps_agents/cli/commands/documenter.py +136 -136
- tapps_agents/cli/commands/enhancer.py +110 -110
- tapps_agents/cli/commands/evaluator.py +255 -255
- tapps_agents/cli/commands/implementer.py +301 -301
- tapps_agents/cli/commands/improver.py +91 -91
- tapps_agents/cli/commands/knowledge.py +111 -111
- tapps_agents/cli/commands/learning.py +172 -172
- tapps_agents/cli/commands/observability.py +283 -283
- tapps_agents/cli/commands/ops.py +135 -135
- tapps_agents/cli/commands/orchestrator.py +116 -116
- tapps_agents/cli/commands/planner.py +237 -237
- tapps_agents/cli/commands/reviewer.py +1872 -1872
- tapps_agents/cli/commands/status.py +285 -285
- tapps_agents/cli/commands/task.py +227 -227
- tapps_agents/cli/commands/tester.py +191 -191
- tapps_agents/cli/feedback.py +936 -936
- tapps_agents/cli/formatters.py +608 -608
- tapps_agents/cli/help/__init__.py +7 -7
- tapps_agents/cli/help/static_help.py +425 -425
- tapps_agents/cli/network_detection.py +110 -110
- tapps_agents/cli/output_compactor.py +274 -274
- tapps_agents/cli/parsers/__init__.py +2 -2
- tapps_agents/cli/parsers/analyst.py +186 -186
- tapps_agents/cli/parsers/architect.py +167 -167
- tapps_agents/cli/parsers/cleanup_agent.py +228 -228
- tapps_agents/cli/parsers/debugger.py +116 -116
- tapps_agents/cli/parsers/designer.py +182 -182
- tapps_agents/cli/parsers/documenter.py +134 -134
- tapps_agents/cli/parsers/enhancer.py +113 -113
- tapps_agents/cli/parsers/evaluator.py +213 -213
- tapps_agents/cli/parsers/implementer.py +168 -168
- tapps_agents/cli/parsers/improver.py +132 -132
- tapps_agents/cli/parsers/ops.py +159 -159
- tapps_agents/cli/parsers/orchestrator.py +98 -98
- tapps_agents/cli/parsers/planner.py +145 -145
- tapps_agents/cli/parsers/reviewer.py +462 -462
- tapps_agents/cli/parsers/tester.py +124 -124
- tapps_agents/cli/progress_heartbeat.py +254 -254
- tapps_agents/cli/streaming_progress.py +336 -336
- tapps_agents/cli/utils/__init__.py +6 -6
- tapps_agents/cli/utils/agent_lifecycle.py +48 -48
- tapps_agents/cli/utils/error_formatter.py +82 -82
- tapps_agents/cli/utils/error_recovery.py +188 -188
- tapps_agents/cli/utils/output_handler.py +59 -59
- tapps_agents/cli/utils/prompt_enhancer.py +319 -319
- tapps_agents/cli/validators/__init__.py +9 -9
- tapps_agents/cli/validators/command_validator.py +81 -81
- tapps_agents/context7/__init__.py +112 -112
- tapps_agents/context7/agent_integration.py +869 -869
- tapps_agents/context7/analytics.py +382 -382
- tapps_agents/context7/analytics_dashboard.py +299 -299
- tapps_agents/context7/async_cache.py +681 -681
- tapps_agents/context7/backup_client.py +958 -958
- tapps_agents/context7/cache_locking.py +194 -194
- tapps_agents/context7/cache_metadata.py +214 -214
- tapps_agents/context7/cache_prewarm.py +488 -488
- tapps_agents/context7/cache_structure.py +168 -168
- tapps_agents/context7/cache_warming.py +604 -604
- tapps_agents/context7/circuit_breaker.py +376 -376
- tapps_agents/context7/cleanup.py +461 -461
- tapps_agents/context7/commands.py +858 -858
- tapps_agents/context7/credential_validation.py +276 -276
- tapps_agents/context7/cross_reference_resolver.py +168 -168
- tapps_agents/context7/cross_references.py +424 -424
- tapps_agents/context7/doc_manager.py +225 -225
- tapps_agents/context7/fuzzy_matcher.py +369 -369
- tapps_agents/context7/kb_cache.py +404 -404
- tapps_agents/context7/language_detector.py +219 -219
- tapps_agents/context7/library_detector.py +725 -725
- tapps_agents/context7/lookup.py +738 -738
- tapps_agents/context7/metadata.py +258 -258
- tapps_agents/context7/refresh_queue.py +300 -300
- tapps_agents/context7/security.py +373 -373
- tapps_agents/context7/staleness_policies.py +278 -278
- tapps_agents/context7/tiles_integration.py +47 -47
- tapps_agents/continuous_bug_fix/__init__.py +20 -20
- tapps_agents/continuous_bug_fix/bug_finder.py +306 -306
- tapps_agents/continuous_bug_fix/bug_fix_coordinator.py +177 -177
- tapps_agents/continuous_bug_fix/commit_manager.py +178 -178
- tapps_agents/continuous_bug_fix/continuous_bug_fixer.py +322 -322
- tapps_agents/continuous_bug_fix/proactive_bug_finder.py +285 -285
- tapps_agents/core/__init__.py +298 -298
- tapps_agents/core/adaptive_cache_config.py +432 -432
- tapps_agents/core/agent_base.py +647 -647
- tapps_agents/core/agent_cache.py +466 -466
- tapps_agents/core/agent_learning.py +1865 -1865
- tapps_agents/core/analytics_dashboard.py +563 -563
- tapps_agents/core/analytics_enhancements.py +597 -597
- tapps_agents/core/anonymization.py +274 -274
- tapps_agents/core/ast_parser.py +228 -228
- tapps_agents/core/async_file_ops.py +402 -402
- tapps_agents/core/best_practice_consultant.py +299 -299
- tapps_agents/core/brownfield_analyzer.py +299 -299
- tapps_agents/core/brownfield_review.py +541 -541
- tapps_agents/core/browser_controller.py +513 -513
- tapps_agents/core/capability_registry.py +418 -418
- tapps_agents/core/change_impact_analyzer.py +190 -190
- tapps_agents/core/checkpoint_manager.py +377 -377
- tapps_agents/core/code_generator.py +329 -329
- tapps_agents/core/code_validator.py +276 -276
- tapps_agents/core/command_registry.py +327 -327
- tapps_agents/core/context_gathering/__init__.py +2 -2
- tapps_agents/core/context_gathering/repository_explorer.py +28 -28
- tapps_agents/core/context_intelligence/__init__.py +2 -2
- tapps_agents/core/context_intelligence/relevance_scorer.py +24 -24
- tapps_agents/core/context_intelligence/token_budget_manager.py +27 -27
- tapps_agents/core/context_manager.py +240 -240
- tapps_agents/core/cursor_feedback_monitor.py +146 -146
- tapps_agents/core/cursor_verification.py +290 -290
- tapps_agents/core/customization_loader.py +280 -280
- tapps_agents/core/customization_schema.py +260 -260
- tapps_agents/core/customization_template.py +238 -238
- tapps_agents/core/debug_logger.py +124 -124
- tapps_agents/core/design_validator.py +298 -298
- tapps_agents/core/diagram_generator.py +226 -226
- tapps_agents/core/docker_utils.py +232 -232
- tapps_agents/core/document_generator.py +617 -617
- tapps_agents/core/domain_detector.py +30 -30
- tapps_agents/core/error_envelope.py +454 -454
- tapps_agents/core/error_handler.py +270 -270
- tapps_agents/core/estimation_tracker.py +189 -189
- tapps_agents/core/eval_prompt_engine.py +116 -116
- tapps_agents/core/evaluation_base.py +119 -119
- tapps_agents/core/evaluation_models.py +320 -320
- tapps_agents/core/evaluation_orchestrator.py +225 -225
- tapps_agents/core/evaluators/__init__.py +7 -7
- tapps_agents/core/evaluators/architectural_evaluator.py +205 -205
- tapps_agents/core/evaluators/behavioral_evaluator.py +160 -160
- tapps_agents/core/evaluators/performance_profile_evaluator.py +160 -160
- tapps_agents/core/evaluators/security_posture_evaluator.py +148 -148
- tapps_agents/core/evaluators/spec_compliance_evaluator.py +181 -181
- tapps_agents/core/exceptions.py +107 -107
- tapps_agents/core/expert_config_generator.py +293 -293
- tapps_agents/core/export_schema.py +202 -202
- tapps_agents/core/external_feedback_models.py +102 -102
- tapps_agents/core/external_feedback_storage.py +213 -213
- tapps_agents/core/fallback_strategy.py +314 -314
- tapps_agents/core/feedback_analyzer.py +162 -162
- tapps_agents/core/feedback_collector.py +178 -178
- tapps_agents/core/git_operations.py +445 -445
- tapps_agents/core/hardware_profiler.py +151 -151
- tapps_agents/core/instructions.py +324 -324
- tapps_agents/core/io_guardrails.py +69 -69
- tapps_agents/core/issue_manifest.py +249 -249
- tapps_agents/core/issue_schema.py +139 -139
- tapps_agents/core/json_utils.py +128 -128
- tapps_agents/core/knowledge_graph.py +446 -446
- tapps_agents/core/language_detector.py +296 -296
- tapps_agents/core/learning_confidence.py +242 -242
- tapps_agents/core/learning_dashboard.py +246 -246
- tapps_agents/core/learning_decision.py +384 -384
- tapps_agents/core/learning_explainability.py +578 -578
- tapps_agents/core/learning_export.py +287 -287
- tapps_agents/core/learning_integration.py +228 -228
- tapps_agents/core/llm_behavior.py +232 -232
- tapps_agents/core/long_duration_support.py +786 -786
- tapps_agents/core/mcp_setup.py +106 -106
- tapps_agents/core/memory_integration.py +396 -396
- tapps_agents/core/meta_learning.py +666 -666
- tapps_agents/core/module_path_sanitizer.py +199 -199
- tapps_agents/core/multi_agent_orchestrator.py +382 -382
- tapps_agents/core/network_errors.py +125 -125
- tapps_agents/core/nfr_validator.py +336 -336
- tapps_agents/core/offline_mode.py +158 -158
- tapps_agents/core/output_contracts.py +300 -300
- tapps_agents/core/output_formatter.py +300 -300
- tapps_agents/core/path_normalizer.py +174 -174
- tapps_agents/core/path_validator.py +322 -322
- tapps_agents/core/pattern_library.py +250 -250
- tapps_agents/core/performance_benchmark.py +301 -301
- tapps_agents/core/performance_monitor.py +184 -184
- tapps_agents/core/playwright_mcp_controller.py +771 -771
- tapps_agents/core/policy_loader.py +135 -135
- tapps_agents/core/progress.py +166 -166
- tapps_agents/core/project_profile.py +354 -354
- tapps_agents/core/project_type_detector.py +454 -454
- tapps_agents/core/prompt_base.py +223 -223
- tapps_agents/core/prompt_learning/__init__.py +2 -2
- tapps_agents/core/prompt_learning/learning_loop.py +24 -24
- tapps_agents/core/prompt_learning/project_prompt_store.py +25 -25
- tapps_agents/core/prompt_learning/skills_prompt_analyzer.py +35 -35
- tapps_agents/core/prompt_optimization/__init__.py +6 -6
- tapps_agents/core/prompt_optimization/ab_tester.py +114 -114
- tapps_agents/core/prompt_optimization/correlation_analyzer.py +160 -160
- tapps_agents/core/prompt_optimization/progressive_refiner.py +129 -129
- tapps_agents/core/prompt_optimization/prompt_library.py +37 -37
- tapps_agents/core/requirements_evaluator.py +431 -431
- tapps_agents/core/resource_aware_executor.py +449 -449
- tapps_agents/core/resource_monitor.py +343 -343
- tapps_agents/core/resume_handler.py +298 -298
- tapps_agents/core/retry_handler.py +197 -197
- tapps_agents/core/review_checklists.py +479 -479
- tapps_agents/core/role_loader.py +201 -201
- tapps_agents/core/role_template_loader.py +201 -201
- tapps_agents/core/runtime_mode.py +60 -60
- tapps_agents/core/security_scanner.py +342 -342
- tapps_agents/core/skill_agent_registry.py +194 -194
- tapps_agents/core/skill_integration.py +208 -208
- tapps_agents/core/skill_loader.py +492 -492
- tapps_agents/core/skill_template.py +341 -341
- tapps_agents/core/skill_validator.py +478 -478
- tapps_agents/core/stack_analyzer.py +35 -35
- tapps_agents/core/startup.py +174 -174
- tapps_agents/core/storage_manager.py +397 -397
- tapps_agents/core/storage_models.py +166 -166
- tapps_agents/core/story_evaluator.py +410 -410
- tapps_agents/core/subprocess_utils.py +170 -170
- tapps_agents/core/task_duration.py +296 -296
- tapps_agents/core/task_memory.py +582 -582
- tapps_agents/core/task_state.py +226 -226
- tapps_agents/core/tech_stack_priorities.py +208 -208
- tapps_agents/core/temp_directory.py +194 -194
- tapps_agents/core/template_merger.py +600 -600
- tapps_agents/core/template_selector.py +280 -280
- tapps_agents/core/test_generator.py +286 -286
- tapps_agents/core/tiered_context.py +253 -253
- tapps_agents/core/token_monitor.py +345 -345
- tapps_agents/core/traceability.py +254 -254
- tapps_agents/core/trajectory_tracker.py +50 -50
- tapps_agents/core/unicode_safe.py +143 -143
- tapps_agents/core/unified_cache_config.py +170 -170
- tapps_agents/core/unified_state.py +324 -324
- tapps_agents/core/validate_cursor_setup.py +237 -237
- tapps_agents/core/validation_registry.py +136 -136
- tapps_agents/core/validators/__init__.py +4 -4
- tapps_agents/core/validators/python_validator.py +87 -87
- tapps_agents/core/verification_agent.py +90 -90
- tapps_agents/core/visual_feedback.py +644 -644
- tapps_agents/core/workflow_validator.py +197 -197
- tapps_agents/core/worktree.py +367 -367
- tapps_agents/docker/__init__.py +10 -10
- tapps_agents/docker/analyzer.py +186 -186
- tapps_agents/docker/debugger.py +229 -229
- tapps_agents/docker/error_patterns.py +216 -216
- tapps_agents/epic/__init__.py +22 -22
- tapps_agents/epic/beads_sync.py +115 -115
- tapps_agents/epic/markdown_sync.py +105 -105
- tapps_agents/epic/models.py +96 -96
- tapps_agents/experts/__init__.py +163 -163
- tapps_agents/experts/agent_integration.py +243 -243
- tapps_agents/experts/auto_generator.py +331 -331
- tapps_agents/experts/base_expert.py +536 -536
- tapps_agents/experts/builtin_registry.py +261 -261
- tapps_agents/experts/business_metrics.py +565 -565
- tapps_agents/experts/cache.py +266 -266
- tapps_agents/experts/confidence_breakdown.py +306 -306
- tapps_agents/experts/confidence_calculator.py +336 -336
- tapps_agents/experts/confidence_metrics.py +236 -236
- tapps_agents/experts/domain_config.py +311 -311
- tapps_agents/experts/domain_detector.py +550 -550
- tapps_agents/experts/domain_utils.py +84 -84
- tapps_agents/experts/expert_config.py +113 -113
- tapps_agents/experts/expert_engine.py +465 -465
- tapps_agents/experts/expert_registry.py +744 -744
- tapps_agents/experts/expert_synthesizer.py +70 -70
- tapps_agents/experts/governance.py +197 -197
- tapps_agents/experts/history_logger.py +312 -312
- tapps_agents/experts/knowledge/README.md +180 -180
- tapps_agents/experts/knowledge/accessibility/accessible-forms.md +331 -331
- tapps_agents/experts/knowledge/accessibility/aria-patterns.md +344 -344
- tapps_agents/experts/knowledge/accessibility/color-contrast.md +285 -285
- tapps_agents/experts/knowledge/accessibility/keyboard-navigation.md +332 -332
- tapps_agents/experts/knowledge/accessibility/screen-readers.md +282 -282
- tapps_agents/experts/knowledge/accessibility/semantic-html.md +355 -355
- tapps_agents/experts/knowledge/accessibility/testing-accessibility.md +369 -369
- tapps_agents/experts/knowledge/accessibility/wcag-2.1.md +296 -296
- tapps_agents/experts/knowledge/accessibility/wcag-2.2.md +211 -211
- tapps_agents/experts/knowledge/agent-learning/best-practices.md +715 -715
- tapps_agents/experts/knowledge/agent-learning/pattern-extraction.md +282 -282
- tapps_agents/experts/knowledge/agent-learning/prompt-optimization.md +320 -320
- tapps_agents/experts/knowledge/ai-frameworks/model-optimization.md +90 -90
- tapps_agents/experts/knowledge/ai-frameworks/openvino-patterns.md +260 -260
- tapps_agents/experts/knowledge/api-design-integration/api-gateway-patterns.md +309 -309
- tapps_agents/experts/knowledge/api-design-integration/api-security-patterns.md +521 -521
- tapps_agents/experts/knowledge/api-design-integration/api-versioning.md +421 -421
- tapps_agents/experts/knowledge/api-design-integration/async-protocol-patterns.md +61 -61
- tapps_agents/experts/knowledge/api-design-integration/contract-testing.md +221 -221
- tapps_agents/experts/knowledge/api-design-integration/external-api-integration.md +489 -489
- tapps_agents/experts/knowledge/api-design-integration/fastapi-patterns.md +360 -360
- tapps_agents/experts/knowledge/api-design-integration/fastapi-testing.md +262 -262
- tapps_agents/experts/knowledge/api-design-integration/graphql-patterns.md +582 -582
- tapps_agents/experts/knowledge/api-design-integration/grpc-best-practices.md +499 -499
- tapps_agents/experts/knowledge/api-design-integration/mqtt-patterns.md +455 -455
- tapps_agents/experts/knowledge/api-design-integration/rate-limiting.md +507 -507
- tapps_agents/experts/knowledge/api-design-integration/restful-api-design.md +618 -618
- tapps_agents/experts/knowledge/api-design-integration/websocket-patterns.md +480 -480
- tapps_agents/experts/knowledge/cloud-infrastructure/cloud-native-patterns.md +175 -175
- tapps_agents/experts/knowledge/cloud-infrastructure/container-health-checks.md +261 -261
- tapps_agents/experts/knowledge/cloud-infrastructure/containerization.md +222 -222
- tapps_agents/experts/knowledge/cloud-infrastructure/cost-optimization.md +122 -122
- tapps_agents/experts/knowledge/cloud-infrastructure/disaster-recovery.md +153 -153
- tapps_agents/experts/knowledge/cloud-infrastructure/dockerfile-patterns.md +285 -285
- tapps_agents/experts/knowledge/cloud-infrastructure/infrastructure-as-code.md +187 -187
- tapps_agents/experts/knowledge/cloud-infrastructure/kubernetes-patterns.md +253 -253
- tapps_agents/experts/knowledge/cloud-infrastructure/multi-cloud-strategies.md +155 -155
- tapps_agents/experts/knowledge/cloud-infrastructure/serverless-architecture.md +200 -200
- tapps_agents/experts/knowledge/code-quality-analysis/README.md +16 -16
- tapps_agents/experts/knowledge/code-quality-analysis/code-metrics.md +137 -137
- tapps_agents/experts/knowledge/code-quality-analysis/complexity-analysis.md +181 -181
- tapps_agents/experts/knowledge/code-quality-analysis/technical-debt-patterns.md +191 -191
- tapps_agents/experts/knowledge/data-privacy-compliance/anonymization.md +313 -313
- tapps_agents/experts/knowledge/data-privacy-compliance/ccpa.md +255 -255
- tapps_agents/experts/knowledge/data-privacy-compliance/consent-management.md +282 -282
- tapps_agents/experts/knowledge/data-privacy-compliance/data-minimization.md +275 -275
- tapps_agents/experts/knowledge/data-privacy-compliance/data-retention.md +297 -297
- tapps_agents/experts/knowledge/data-privacy-compliance/data-subject-rights.md +383 -383
- tapps_agents/experts/knowledge/data-privacy-compliance/encryption-privacy.md +285 -285
- tapps_agents/experts/knowledge/data-privacy-compliance/gdpr.md +344 -344
- tapps_agents/experts/knowledge/data-privacy-compliance/hipaa.md +385 -385
- tapps_agents/experts/knowledge/data-privacy-compliance/privacy-by-design.md +280 -280
- tapps_agents/experts/knowledge/database-data-management/acid-vs-cap.md +164 -164
- tapps_agents/experts/knowledge/database-data-management/backup-and-recovery.md +182 -182
- tapps_agents/experts/knowledge/database-data-management/data-modeling.md +172 -172
- tapps_agents/experts/knowledge/database-data-management/database-design.md +187 -187
- tapps_agents/experts/knowledge/database-data-management/flux-query-optimization.md +342 -342
- tapps_agents/experts/knowledge/database-data-management/influxdb-connection-patterns.md +432 -432
- tapps_agents/experts/knowledge/database-data-management/influxdb-patterns.md +442 -442
- tapps_agents/experts/knowledge/database-data-management/migration-strategies.md +216 -216
- tapps_agents/experts/knowledge/database-data-management/nosql-patterns.md +259 -259
- tapps_agents/experts/knowledge/database-data-management/scalability-patterns.md +184 -184
- tapps_agents/experts/knowledge/database-data-management/sql-optimization.md +175 -175
- tapps_agents/experts/knowledge/database-data-management/time-series-modeling.md +444 -444
- tapps_agents/experts/knowledge/development-workflow/README.md +16 -16
- tapps_agents/experts/knowledge/development-workflow/automation-best-practices.md +216 -216
- tapps_agents/experts/knowledge/development-workflow/build-strategies.md +198 -198
- tapps_agents/experts/knowledge/development-workflow/deployment-patterns.md +205 -205
- tapps_agents/experts/knowledge/development-workflow/git-workflows.md +205 -205
- tapps_agents/experts/knowledge/documentation-knowledge-management/README.md +16 -16
- tapps_agents/experts/knowledge/documentation-knowledge-management/api-documentation-patterns.md +231 -231
- tapps_agents/experts/knowledge/documentation-knowledge-management/documentation-standards.md +191 -191
- tapps_agents/experts/knowledge/documentation-knowledge-management/knowledge-management.md +171 -171
- tapps_agents/experts/knowledge/documentation-knowledge-management/technical-writing-guide.md +192 -192
- tapps_agents/experts/knowledge/observability-monitoring/alerting-patterns.md +461 -461
- tapps_agents/experts/knowledge/observability-monitoring/apm-tools.md +459 -459
- tapps_agents/experts/knowledge/observability-monitoring/distributed-tracing.md +367 -367
- tapps_agents/experts/knowledge/observability-monitoring/logging-strategies.md +478 -478
- tapps_agents/experts/knowledge/observability-monitoring/metrics-and-monitoring.md +510 -510
- tapps_agents/experts/knowledge/observability-monitoring/observability-best-practices.md +492 -492
- tapps_agents/experts/knowledge/observability-monitoring/open-telemetry.md +573 -573
- tapps_agents/experts/knowledge/observability-monitoring/slo-sli-sla.md +419 -419
- tapps_agents/experts/knowledge/performance/anti-patterns.md +284 -284
- tapps_agents/experts/knowledge/performance/api-performance.md +256 -256
- tapps_agents/experts/knowledge/performance/caching.md +327 -327
- tapps_agents/experts/knowledge/performance/database-performance.md +252 -252
- tapps_agents/experts/knowledge/performance/optimization-patterns.md +327 -327
- tapps_agents/experts/knowledge/performance/profiling.md +297 -297
- tapps_agents/experts/knowledge/performance/resource-management.md +293 -293
- tapps_agents/experts/knowledge/performance/scalability.md +306 -306
- tapps_agents/experts/knowledge/security/owasp-top10.md +209 -209
- tapps_agents/experts/knowledge/security/secure-coding-practices.md +207 -207
- tapps_agents/experts/knowledge/security/threat-modeling.md +220 -220
- tapps_agents/experts/knowledge/security/vulnerability-patterns.md +342 -342
- tapps_agents/experts/knowledge/software-architecture/docker-compose-patterns.md +314 -314
- tapps_agents/experts/knowledge/software-architecture/microservices-patterns.md +379 -379
- tapps_agents/experts/knowledge/software-architecture/service-communication.md +316 -316
- tapps_agents/experts/knowledge/testing/best-practices.md +310 -310
- tapps_agents/experts/knowledge/testing/coverage-analysis.md +293 -293
- tapps_agents/experts/knowledge/testing/mocking.md +256 -256
- tapps_agents/experts/knowledge/testing/test-automation.md +276 -276
- tapps_agents/experts/knowledge/testing/test-data.md +271 -271
- tapps_agents/experts/knowledge/testing/test-design-patterns.md +280 -280
- tapps_agents/experts/knowledge/testing/test-maintenance.md +236 -236
- tapps_agents/experts/knowledge/testing/test-strategies.md +311 -311
- tapps_agents/experts/knowledge/user-experience/information-architecture.md +325 -325
- tapps_agents/experts/knowledge/user-experience/interaction-design.md +363 -363
- tapps_agents/experts/knowledge/user-experience/prototyping.md +293 -293
- tapps_agents/experts/knowledge/user-experience/usability-heuristics.md +337 -337
- tapps_agents/experts/knowledge/user-experience/usability-testing.md +311 -311
- tapps_agents/experts/knowledge/user-experience/user-journeys.md +296 -296
- tapps_agents/experts/knowledge/user-experience/user-research.md +373 -373
- tapps_agents/experts/knowledge/user-experience/ux-principles.md +340 -340
- tapps_agents/experts/knowledge_freshness.py +321 -321
- tapps_agents/experts/knowledge_ingestion.py +438 -438
- tapps_agents/experts/knowledge_need_detector.py +93 -93
- tapps_agents/experts/knowledge_validator.py +382 -382
- tapps_agents/experts/observability.py +440 -440
- tapps_agents/experts/passive_notifier.py +238 -238
- tapps_agents/experts/proactive_orchestrator.py +32 -32
- tapps_agents/experts/rag_chunker.py +205 -205
- tapps_agents/experts/rag_embedder.py +152 -152
- tapps_agents/experts/rag_evaluation.py +299 -299
- tapps_agents/experts/rag_index.py +303 -303
- tapps_agents/experts/rag_metrics.py +293 -293
- tapps_agents/experts/rag_safety.py +263 -263
- tapps_agents/experts/report_generator.py +296 -296
- tapps_agents/experts/setup_wizard.py +441 -441
- tapps_agents/experts/simple_rag.py +431 -431
- tapps_agents/experts/vector_rag.py +354 -354
- tapps_agents/experts/weight_distributor.py +304 -304
- tapps_agents/health/__init__.py +24 -24
- tapps_agents/health/base.py +75 -75
- tapps_agents/health/checks/__init__.py +22 -22
- tapps_agents/health/checks/automation.py +127 -127
- tapps_agents/health/checks/context7_cache.py +210 -210
- tapps_agents/health/checks/environment.py +116 -116
- tapps_agents/health/checks/execution.py +170 -170
- tapps_agents/health/checks/knowledge_base.py +187 -187
- tapps_agents/health/checks/outcomes.backup_20260204_064058.py +324 -0
- tapps_agents/health/checks/outcomes.backup_20260204_064256.py +324 -0
- tapps_agents/health/checks/outcomes.backup_20260204_064600.py +324 -0
- tapps_agents/health/checks/outcomes.py +324 -324
- tapps_agents/health/collector.py +280 -280
- tapps_agents/health/dashboard.py +137 -137
- tapps_agents/health/metrics.py +151 -151
- tapps_agents/health/registry.py +166 -166
- tapps_agents/hooks/__init__.py +33 -33
- tapps_agents/hooks/config.py +140 -140
- tapps_agents/hooks/events.py +135 -135
- tapps_agents/hooks/executor.py +128 -128
- tapps_agents/hooks/manager.py +143 -143
- tapps_agents/integration/__init__.py +8 -8
- tapps_agents/integration/service_integrator.py +121 -121
- tapps_agents/integrations/__init__.py +10 -10
- tapps_agents/integrations/clawdbot.py +525 -525
- tapps_agents/integrations/memory_bridge.py +356 -356
- tapps_agents/mcp/__init__.py +18 -18
- tapps_agents/mcp/gateway.py +112 -112
- tapps_agents/mcp/servers/__init__.py +13 -13
- tapps_agents/mcp/servers/analysis.py +204 -204
- tapps_agents/mcp/servers/context7.py +198 -198
- tapps_agents/mcp/servers/filesystem.py +218 -218
- tapps_agents/mcp/servers/git.py +201 -201
- tapps_agents/mcp/tool_registry.py +115 -115
- tapps_agents/quality/__init__.py +54 -54
- tapps_agents/quality/coverage_analyzer.py +379 -379
- tapps_agents/quality/enforcement.py +82 -82
- tapps_agents/quality/gates/__init__.py +37 -37
- tapps_agents/quality/gates/approval_gate.py +255 -255
- tapps_agents/quality/gates/base.py +84 -84
- tapps_agents/quality/gates/exceptions.py +43 -43
- tapps_agents/quality/gates/policy_gate.py +195 -195
- tapps_agents/quality/gates/registry.py +239 -239
- tapps_agents/quality/gates/security_gate.py +156 -156
- tapps_agents/quality/quality_gates.py +369 -369
- tapps_agents/quality/secret_scanner.py +335 -335
- tapps_agents/resources/__init__.py +5 -0
- tapps_agents/resources/claude/__init__.py +1 -0
- tapps_agents/resources/claude/commands/README.md +156 -0
- tapps_agents/resources/claude/commands/__init__.py +1 -0
- tapps_agents/resources/claude/commands/build-fix.md +22 -0
- tapps_agents/resources/claude/commands/build.md +77 -0
- tapps_agents/resources/claude/commands/debug.md +53 -0
- tapps_agents/resources/claude/commands/design.md +68 -0
- tapps_agents/resources/claude/commands/docs.md +53 -0
- tapps_agents/resources/claude/commands/e2e.md +22 -0
- tapps_agents/resources/claude/commands/fix.md +54 -0
- tapps_agents/resources/claude/commands/implement.md +53 -0
- tapps_agents/resources/claude/commands/improve.md +53 -0
- tapps_agents/resources/claude/commands/library-docs.md +64 -0
- tapps_agents/resources/claude/commands/lint.md +52 -0
- tapps_agents/resources/claude/commands/plan.md +65 -0
- tapps_agents/resources/claude/commands/refactor-clean.md +21 -0
- tapps_agents/resources/claude/commands/refactor.md +55 -0
- tapps_agents/resources/claude/commands/review.md +67 -0
- tapps_agents/resources/claude/commands/score.md +60 -0
- tapps_agents/resources/claude/commands/security-review.md +22 -0
- tapps_agents/resources/claude/commands/security-scan.md +54 -0
- tapps_agents/resources/claude/commands/tdd.md +24 -0
- tapps_agents/resources/claude/commands/test-coverage.md +21 -0
- tapps_agents/resources/claude/commands/test.md +54 -0
- tapps_agents/resources/claude/commands/update-codemaps.md +20 -0
- tapps_agents/resources/claude/commands/update-docs.md +21 -0
- tapps_agents/resources/claude/skills/__init__.py +1 -0
- tapps_agents/resources/claude/skills/analyst/SKILL.md +272 -0
- tapps_agents/resources/claude/skills/analyst/__init__.py +1 -0
- tapps_agents/resources/claude/skills/architect/SKILL.md +282 -0
- tapps_agents/resources/claude/skills/architect/__init__.py +1 -0
- tapps_agents/resources/claude/skills/backend-patterns/SKILL.md +30 -0
- tapps_agents/resources/claude/skills/backend-patterns/__init__.py +1 -0
- tapps_agents/resources/claude/skills/coding-standards/SKILL.md +29 -0
- tapps_agents/resources/claude/skills/coding-standards/__init__.py +1 -0
- tapps_agents/resources/claude/skills/debugger/SKILL.md +203 -0
- tapps_agents/resources/claude/skills/debugger/__init__.py +1 -0
- tapps_agents/resources/claude/skills/designer/SKILL.md +243 -0
- tapps_agents/resources/claude/skills/designer/__init__.py +1 -0
- tapps_agents/resources/claude/skills/documenter/SKILL.md +252 -0
- tapps_agents/resources/claude/skills/documenter/__init__.py +1 -0
- tapps_agents/resources/claude/skills/enhancer/SKILL.md +307 -0
- tapps_agents/resources/claude/skills/enhancer/__init__.py +1 -0
- tapps_agents/resources/claude/skills/evaluator/SKILL.md +204 -0
- tapps_agents/resources/claude/skills/evaluator/__init__.py +1 -0
- tapps_agents/resources/claude/skills/frontend-patterns/SKILL.md +29 -0
- tapps_agents/resources/claude/skills/frontend-patterns/__init__.py +1 -0
- tapps_agents/resources/claude/skills/implementer/SKILL.md +188 -0
- tapps_agents/resources/claude/skills/implementer/__init__.py +1 -0
- tapps_agents/resources/claude/skills/improver/SKILL.md +218 -0
- tapps_agents/resources/claude/skills/improver/__init__.py +1 -0
- tapps_agents/resources/claude/skills/ops/SKILL.md +281 -0
- tapps_agents/resources/claude/skills/ops/__init__.py +1 -0
- tapps_agents/resources/claude/skills/orchestrator/SKILL.md +390 -0
- tapps_agents/resources/claude/skills/orchestrator/__init__.py +1 -0
- tapps_agents/resources/claude/skills/planner/SKILL.md +254 -0
- tapps_agents/resources/claude/skills/planner/__init__.py +1 -0
- tapps_agents/resources/claude/skills/reviewer/SKILL.md +434 -0
- tapps_agents/resources/claude/skills/reviewer/__init__.py +1 -0
- tapps_agents/resources/claude/skills/security-review/SKILL.md +31 -0
- tapps_agents/resources/claude/skills/security-review/__init__.py +1 -0
- tapps_agents/resources/claude/skills/simple-mode/SKILL.md +695 -0
- tapps_agents/resources/claude/skills/simple-mode/__init__.py +1 -0
- tapps_agents/resources/claude/skills/tester/SKILL.md +219 -0
- tapps_agents/resources/claude/skills/tester/__init__.py +1 -0
- tapps_agents/resources/cursor/.cursorignore +35 -0
- tapps_agents/resources/cursor/__init__.py +1 -0
- tapps_agents/resources/cursor/commands/__init__.py +1 -0
- tapps_agents/resources/cursor/commands/build-fix.md +11 -0
- tapps_agents/resources/cursor/commands/build.md +11 -0
- tapps_agents/resources/cursor/commands/e2e.md +11 -0
- tapps_agents/resources/cursor/commands/fix.md +11 -0
- tapps_agents/resources/cursor/commands/refactor-clean.md +11 -0
- tapps_agents/resources/cursor/commands/review.md +11 -0
- tapps_agents/resources/cursor/commands/security-review.md +11 -0
- tapps_agents/resources/cursor/commands/tdd.md +11 -0
- tapps_agents/resources/cursor/commands/test-coverage.md +11 -0
- tapps_agents/resources/cursor/commands/test.md +11 -0
- tapps_agents/resources/cursor/commands/update-codemaps.md +10 -0
- tapps_agents/resources/cursor/commands/update-docs.md +11 -0
- tapps_agents/resources/cursor/rules/__init__.py +1 -0
- tapps_agents/resources/cursor/rules/agent-capabilities.mdc +687 -0
- tapps_agents/resources/cursor/rules/coding-style.mdc +31 -0
- tapps_agents/resources/cursor/rules/command-reference.mdc +2081 -0
- tapps_agents/resources/cursor/rules/cursor-mode-usage.mdc +125 -0
- tapps_agents/resources/cursor/rules/git-workflow.mdc +29 -0
- tapps_agents/resources/cursor/rules/performance.mdc +29 -0
- tapps_agents/resources/cursor/rules/project-context.mdc +163 -0
- tapps_agents/resources/cursor/rules/project-profiling.mdc +197 -0
- tapps_agents/resources/cursor/rules/quick-reference.mdc +630 -0
- tapps_agents/resources/cursor/rules/security.mdc +32 -0
- tapps_agents/resources/cursor/rules/simple-mode.mdc +500 -0
- tapps_agents/resources/cursor/rules/testing.mdc +31 -0
- tapps_agents/resources/cursor/rules/when-to-use.mdc +156 -0
- tapps_agents/resources/cursor/rules/workflow-presets.mdc +179 -0
- tapps_agents/resources/customizations/__init__.py +1 -0
- tapps_agents/resources/customizations/example-custom.yaml +83 -0
- tapps_agents/resources/hooks/__init__.py +1 -0
- tapps_agents/resources/hooks/templates/README.md +5 -0
- tapps_agents/resources/hooks/templates/__init__.py +1 -0
- tapps_agents/resources/hooks/templates/add-project-context.yaml +8 -0
- tapps_agents/resources/hooks/templates/auto-format-js.yaml +10 -0
- tapps_agents/resources/hooks/templates/auto-format-python.yaml +10 -0
- tapps_agents/resources/hooks/templates/git-commit-check.yaml +7 -0
- tapps_agents/resources/hooks/templates/notify-on-complete.yaml +8 -0
- tapps_agents/resources/hooks/templates/quality-gate.yaml +8 -0
- tapps_agents/resources/hooks/templates/security-scan-on-edit.yaml +10 -0
- tapps_agents/resources/hooks/templates/session-end-log.yaml +7 -0
- tapps_agents/resources/hooks/templates/show-beads-ready.yaml +8 -0
- tapps_agents/resources/hooks/templates/test-on-edit.yaml +10 -0
- tapps_agents/resources/hooks/templates/update-docs-on-complete.yaml +8 -0
- tapps_agents/resources/hooks/templates/user-prompt-log.yaml +7 -0
- tapps_agents/resources/scripts/__init__.py +1 -0
- tapps_agents/resources/scripts/set_bd_path.ps1 +51 -0
- tapps_agents/resources/workflows/__init__.py +1 -0
- tapps_agents/resources/workflows/presets/__init__.py +1 -0
- tapps_agents/resources/workflows/presets/brownfield-analysis.yaml +235 -0
- tapps_agents/resources/workflows/presets/fix.yaml +78 -0
- tapps_agents/resources/workflows/presets/full-sdlc.yaml +122 -0
- tapps_agents/resources/workflows/presets/quality.yaml +82 -0
- tapps_agents/resources/workflows/presets/rapid-dev.yaml +84 -0
- tapps_agents/session/__init__.py +19 -19
- tapps_agents/session/manager.py +256 -256
- tapps_agents/simple_mode/__init__.py +66 -66
- tapps_agents/simple_mode/agent_contracts.py +357 -357
- tapps_agents/simple_mode/beads_hooks.py +151 -151
- tapps_agents/simple_mode/code_snippet_handler.py +382 -382
- tapps_agents/simple_mode/documentation_manager.py +395 -395
- tapps_agents/simple_mode/documentation_reader.py +187 -187
- tapps_agents/simple_mode/file_inference.py +292 -292
- tapps_agents/simple_mode/framework_change_detector.py +268 -268
- tapps_agents/simple_mode/intent_parser.py +510 -510
- tapps_agents/simple_mode/learning_progression.py +358 -358
- tapps_agents/simple_mode/nl_handler.py +700 -700
- tapps_agents/simple_mode/onboarding.py +253 -253
- tapps_agents/simple_mode/orchestrators/__init__.py +38 -38
- tapps_agents/simple_mode/orchestrators/breakdown_orchestrator.py +49 -49
- tapps_agents/simple_mode/orchestrators/brownfield_orchestrator.py +135 -135
- tapps_agents/simple_mode/orchestrators/deliverable_checklist.py +349 -349
- tapps_agents/simple_mode/orchestrators/enhance_orchestrator.py +53 -53
- tapps_agents/simple_mode/orchestrators/epic_orchestrator.py +122 -122
- tapps_agents/simple_mode/orchestrators/explore_orchestrator.py +184 -184
- tapps_agents/simple_mode/orchestrators/plan_analysis_orchestrator.py +206 -206
- tapps_agents/simple_mode/orchestrators/pr_orchestrator.py +237 -237
- tapps_agents/simple_mode/orchestrators/refactor_orchestrator.py +222 -222
- tapps_agents/simple_mode/orchestrators/requirements_tracer.py +262 -262
- tapps_agents/simple_mode/orchestrators/resume_orchestrator.py +210 -210
- tapps_agents/simple_mode/orchestrators/review_orchestrator.py +161 -161
- tapps_agents/simple_mode/orchestrators/test_orchestrator.py +82 -82
- tapps_agents/simple_mode/output_aggregator.py +340 -340
- tapps_agents/simple_mode/result_formatters.py +598 -598
- tapps_agents/simple_mode/step_dependencies.py +382 -382
- tapps_agents/simple_mode/step_results.py +276 -276
- tapps_agents/simple_mode/streaming.py +388 -388
- tapps_agents/simple_mode/variations.py +129 -129
- tapps_agents/simple_mode/visual_feedback.py +238 -238
- tapps_agents/simple_mode/zero_config.py +274 -274
- tapps_agents/suggestions/__init__.py +8 -8
- tapps_agents/suggestions/inline_suggester.py +52 -52
- tapps_agents/templates/__init__.py +8 -8
- tapps_agents/templates/microservice_generator.py +274 -274
- tapps_agents/utils/env_validator.py +291 -291
- tapps_agents/workflow/__init__.py +171 -171
- tapps_agents/workflow/acceptance_verifier.py +132 -132
- tapps_agents/workflow/agent_handlers/__init__.py +41 -41
- tapps_agents/workflow/agent_handlers/analyst_handler.py +75 -75
- tapps_agents/workflow/agent_handlers/architect_handler.py +107 -107
- tapps_agents/workflow/agent_handlers/base.py +84 -84
- tapps_agents/workflow/agent_handlers/debugger_handler.py +100 -100
- tapps_agents/workflow/agent_handlers/designer_handler.py +110 -110
- tapps_agents/workflow/agent_handlers/documenter_handler.py +94 -94
- tapps_agents/workflow/agent_handlers/implementer_handler.py +235 -235
- tapps_agents/workflow/agent_handlers/ops_handler.py +62 -62
- tapps_agents/workflow/agent_handlers/orchestrator_handler.py +43 -43
- tapps_agents/workflow/agent_handlers/planner_handler.py +98 -98
- tapps_agents/workflow/agent_handlers/registry.py +119 -119
- tapps_agents/workflow/agent_handlers/reviewer_handler.py +119 -119
- tapps_agents/workflow/agent_handlers/tester_handler.py +69 -69
- tapps_agents/workflow/analytics_accessor.py +337 -337
- tapps_agents/workflow/analytics_alerts.py +416 -416
- tapps_agents/workflow/analytics_dashboard_cursor.py +281 -281
- tapps_agents/workflow/analytics_dual_write.py +103 -103
- tapps_agents/workflow/analytics_integration.py +119 -119
- tapps_agents/workflow/analytics_query_parser.py +278 -278
- tapps_agents/workflow/analytics_visualizer.py +259 -259
- tapps_agents/workflow/artifact_helper.py +204 -204
- tapps_agents/workflow/audit_logger.py +263 -263
- tapps_agents/workflow/auto_execution_config.py +340 -340
- tapps_agents/workflow/auto_progression.py +586 -586
- tapps_agents/workflow/branch_cleanup.py +349 -349
- tapps_agents/workflow/checkpoint.py +256 -256
- tapps_agents/workflow/checkpoint_manager.py +178 -178
- tapps_agents/workflow/code_artifact.py +179 -179
- tapps_agents/workflow/common_enums.py +96 -96
- tapps_agents/workflow/confirmation_handler.py +130 -130
- tapps_agents/workflow/context_analyzer.py +222 -222
- tapps_agents/workflow/context_artifact.py +230 -230
- tapps_agents/workflow/cursor_chat.py +94 -94
- tapps_agents/workflow/cursor_skill_helper.py +516 -516
- tapps_agents/workflow/dependency_resolver.py +244 -244
- tapps_agents/workflow/design_artifact.py +156 -156
- tapps_agents/workflow/detector.py +751 -751
- tapps_agents/workflow/direct_execution_fallback.py +301 -301
- tapps_agents/workflow/docs_artifact.py +168 -168
- tapps_agents/workflow/enforcer.py +389 -389
- tapps_agents/workflow/enhancement_artifact.py +142 -142
- tapps_agents/workflow/error_recovery.py +806 -806
- tapps_agents/workflow/event_bus.py +183 -183
- tapps_agents/workflow/event_log.py +612 -612
- tapps_agents/workflow/events.py +63 -63
- tapps_agents/workflow/exceptions.py +43 -43
- tapps_agents/workflow/execution_graph.py +498 -498
- tapps_agents/workflow/execution_plan.py +126 -126
- tapps_agents/workflow/file_utils.py +186 -186
- tapps_agents/workflow/gate_evaluator.py +182 -182
- tapps_agents/workflow/gate_integration.py +200 -200
- tapps_agents/workflow/graph_visualizer.py +130 -130
- tapps_agents/workflow/health_checker.py +206 -206
- tapps_agents/workflow/logging_helper.py +243 -243
- tapps_agents/workflow/manifest.py +582 -582
- tapps_agents/workflow/marker_writer.py +250 -250
- tapps_agents/workflow/messaging.py +325 -325
- tapps_agents/workflow/metadata_models.py +91 -91
- tapps_agents/workflow/metrics_integration.py +226 -226
- tapps_agents/workflow/migration_utils.py +116 -116
- tapps_agents/workflow/models.py +148 -148
- tapps_agents/workflow/nlp_config.py +198 -198
- tapps_agents/workflow/nlp_error_handler.py +207 -207
- tapps_agents/workflow/nlp_executor.py +163 -163
- tapps_agents/workflow/nlp_parser.py +528 -528
- tapps_agents/workflow/observability_dashboard.py +451 -451
- tapps_agents/workflow/observer.py +170 -170
- tapps_agents/workflow/ops_artifact.py +257 -257
- tapps_agents/workflow/output_passing.py +214 -214
- tapps_agents/workflow/parallel_executor.py +463 -463
- tapps_agents/workflow/planning_artifact.py +179 -179
- tapps_agents/workflow/preset_loader.py +285 -285
- tapps_agents/workflow/preset_recommender.py +270 -270
- tapps_agents/workflow/progress_logger.py +145 -145
- tapps_agents/workflow/progress_manager.py +303 -303
- tapps_agents/workflow/progress_monitor.py +186 -186
- tapps_agents/workflow/progress_updates.py +423 -423
- tapps_agents/workflow/quality_artifact.py +158 -158
- tapps_agents/workflow/quality_loopback.py +101 -101
- tapps_agents/workflow/recommender.py +387 -387
- tapps_agents/workflow/remediation_loop.py +166 -166
- tapps_agents/workflow/result_aggregator.py +300 -300
- tapps_agents/workflow/review_artifact.py +185 -185
- tapps_agents/workflow/schema_validator.py +522 -522
- tapps_agents/workflow/session_handoff.py +178 -178
- tapps_agents/workflow/skill_invoker.py +648 -648
- tapps_agents/workflow/state_manager.py +756 -756
- tapps_agents/workflow/state_persistence_config.py +331 -331
- tapps_agents/workflow/status_monitor.py +449 -449
- tapps_agents/workflow/step_checkpoint.py +314 -314
- tapps_agents/workflow/step_details.py +201 -201
- tapps_agents/workflow/story_models.py +147 -147
- tapps_agents/workflow/streaming.py +416 -416
- tapps_agents/workflow/suggestion_engine.py +552 -552
- tapps_agents/workflow/testing_artifact.py +186 -186
- tapps_agents/workflow/timeline.py +158 -158
- tapps_agents/workflow/token_integration.py +209 -209
- tapps_agents/workflow/validation.py +217 -217
- tapps_agents/workflow/visual_feedback.py +391 -391
- tapps_agents/workflow/workflow_chain.py +95 -95
- tapps_agents/workflow/workflow_summary.py +219 -219
- tapps_agents/workflow/worktree_manager.py +724 -724
- {tapps_agents-3.6.0.dist-info → tapps_agents-3.6.1.dist-info}/METADATA +672 -672
- tapps_agents-3.6.1.dist-info/RECORD +883 -0
- {tapps_agents-3.6.0.dist-info → tapps_agents-3.6.1.dist-info}/licenses/LICENSE +22 -22
- tapps_agents-3.6.0.dist-info/RECORD +0 -758
- {tapps_agents-3.6.0.dist-info → tapps_agents-3.6.1.dist-info}/WHEEL +0 -0
- {tapps_agents-3.6.0.dist-info → tapps_agents-3.6.1.dist-info}/entry_points.txt +0 -0
- {tapps_agents-3.6.0.dist-info → tapps_agents-3.6.1.dist-info}/top_level.txt +0 -0
tapps_agents/agents/ops/agent.py
CHANGED
|
@@ -1,620 +1,620 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Ops Agent - Security scanning, compliance checks, deployment, and infrastructure management
|
|
3
|
-
"""
|
|
4
|
-
|
|
5
|
-
import inspect
|
|
6
|
-
import json
|
|
7
|
-
from pathlib import Path
|
|
8
|
-
from typing import Any
|
|
9
|
-
|
|
10
|
-
from ...context7.agent_integration import Context7AgentHelper, get_context7_helper
|
|
11
|
-
from ...core.agent_base import BaseAgent
|
|
12
|
-
from ...core.config import ProjectConfig, load_config
|
|
13
|
-
from ...core.instructions import GenericInstruction
|
|
14
|
-
from ...experts.agent_integration import ExpertSupportMixin
|
|
15
|
-
from .dependency_analyzer import DependencyAnalyzer
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
class OpsAgent(BaseAgent, ExpertSupportMixin):
|
|
19
|
-
"""
|
|
20
|
-
Ops Agent - Security scanning, compliance, deployment, and infrastructure management.
|
|
21
|
-
|
|
22
|
-
Permissions: Read, Write, Grep, Glob, Bash (no Edit)
|
|
23
|
-
|
|
24
|
-
⚠️ CRITICAL ACCURACY REQUIREMENT:
|
|
25
|
-
- NEVER make up, invent, or fabricate information - Only report verified facts
|
|
26
|
-
- ALWAYS verify claims by checking actual results, not just test pass/fail
|
|
27
|
-
- Verify API calls succeed - inspect response data, status codes, error messages
|
|
28
|
-
- Distinguish between code paths executing and actual functionality working
|
|
29
|
-
- Admit uncertainty explicitly when you cannot verify
|
|
30
|
-
"""
|
|
31
|
-
|
|
32
|
-
def __init__(
|
|
33
|
-
self,
|
|
34
|
-
config: ProjectConfig | None = None,
|
|
35
|
-
project_root: Path | None = None,
|
|
36
|
-
):
|
|
37
|
-
super().__init__(agent_id="ops", agent_name="Ops Agent", config=config)
|
|
38
|
-
if config is None:
|
|
39
|
-
config = load_config()
|
|
40
|
-
self.config = config
|
|
41
|
-
|
|
42
|
-
# Set project_root early (before activate) if provided, otherwise use cwd
|
|
43
|
-
if project_root is None:
|
|
44
|
-
project_root = Path.cwd()
|
|
45
|
-
self.project_root = Path(project_root).resolve()
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
# Initialize dependency analyzer
|
|
49
|
-
self.dependency_analyzer = DependencyAnalyzer(project_root=self.project_root)
|
|
50
|
-
|
|
51
|
-
# Initialize Context7 helper (Enhancement: Universal Context7 integration)
|
|
52
|
-
self.context7: Context7AgentHelper | None = None
|
|
53
|
-
if config:
|
|
54
|
-
self.context7 = get_context7_helper(self, config)
|
|
55
|
-
|
|
56
|
-
# Expert registry initialization (required due to multiple inheritance MRO issue)
|
|
57
|
-
# BaseAgent.__init__() doesn't call super().__init__(), so ExpertSupportMixin.__init__()
|
|
58
|
-
# is never called via MRO. We must manually initialize to avoid AttributeError.
|
|
59
|
-
# The registry will be properly initialized in activate() via _initialize_expert_support()
|
|
60
|
-
self.expert_registry: Any | None = None
|
|
61
|
-
|
|
62
|
-
async def activate(self, project_root: Path | None = None, offline_mode: bool = False):
|
|
63
|
-
# Validate that expert_registry attribute exists (safety check)
|
|
64
|
-
if not hasattr(self, 'expert_registry'):
|
|
65
|
-
raise AttributeError(
|
|
66
|
-
f"{self.__class__.__name__}.expert_registry not initialized. "
|
|
67
|
-
"This should not happen if __init__() properly initializes the attribute."
|
|
68
|
-
)
|
|
69
|
-
# Update project_root if provided
|
|
70
|
-
if project_root is not None:
|
|
71
|
-
self.project_root = Path(project_root).resolve()
|
|
72
|
-
# Reinitialize dependency analyzer with new project_root
|
|
73
|
-
self.dependency_analyzer = DependencyAnalyzer(
|
|
74
|
-
project_root=self.project_root
|
|
75
|
-
)
|
|
76
|
-
|
|
77
|
-
await super().activate(project_root, offline_mode=offline_mode)
|
|
78
|
-
await self._initialize_expert_support(project_root, offline_mode=offline_mode)
|
|
79
|
-
self.greet()
|
|
80
|
-
await self.run("help")
|
|
81
|
-
|
|
82
|
-
def greet(self):
|
|
83
|
-
print(
|
|
84
|
-
f"Hello! I am the {self.agent_name}. I help with security, compliance, deployment, and infrastructure."
|
|
85
|
-
)
|
|
86
|
-
|
|
87
|
-
async def run(self, command: str, **kwargs: Any) -> dict[str, Any]:
|
|
88
|
-
command = command.lstrip("*") # Remove star prefix if present
|
|
89
|
-
handler_name = f"_handle_{command.replace('-', '_')}"
|
|
90
|
-
if hasattr(self, handler_name):
|
|
91
|
-
handler = getattr(self, handler_name)
|
|
92
|
-
# Check if handler is async before awaiting
|
|
93
|
-
if inspect.iscoroutinefunction(handler):
|
|
94
|
-
return await handler(**kwargs)
|
|
95
|
-
else:
|
|
96
|
-
# Synchronous handler - call directly
|
|
97
|
-
return handler(**kwargs)
|
|
98
|
-
else:
|
|
99
|
-
return {
|
|
100
|
-
"error": f"Unknown command: {command}. Use '*help' to see available commands."
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
async def _handle_security_scan(
|
|
104
|
-
self, target: str | None = None, scan_type: str = "all", **kwargs: Any
|
|
105
|
-
) -> dict[str, Any]:
|
|
106
|
-
"""Perform security scanning on codebase or specific target."""
|
|
107
|
-
target_path = Path(target) if target else self.project_root
|
|
108
|
-
|
|
109
|
-
if not target_path.is_absolute():
|
|
110
|
-
target_path = self.project_root / target_path
|
|
111
|
-
|
|
112
|
-
if not target_path.exists():
|
|
113
|
-
return {"error": f"Target not found: {target}"}
|
|
114
|
-
|
|
115
|
-
# Scanning for security issues...
|
|
116
|
-
|
|
117
|
-
# Get codebase context for security analysis
|
|
118
|
-
issues = []
|
|
119
|
-
|
|
120
|
-
# Consult Security expert for security scanning guidance
|
|
121
|
-
security_guidance = ""
|
|
122
|
-
# Use defensive check to ensure attribute exists (safety for MRO issue)
|
|
123
|
-
if hasattr(self, 'expert_registry') and self.expert_registry:
|
|
124
|
-
security_consultation = await self.expert_registry.consult(
|
|
125
|
-
query=f"Provide security scanning best practices and vulnerability detection guidance for analyzing: {target_path.name if target_path.is_file() else 'directory'}",
|
|
126
|
-
domain="security",
|
|
127
|
-
agent_id=self.agent_id,
|
|
128
|
-
prioritize_builtin=True,
|
|
129
|
-
)
|
|
130
|
-
if (
|
|
131
|
-
security_consultation.confidence
|
|
132
|
-
>= security_consultation.confidence_threshold
|
|
133
|
-
):
|
|
134
|
-
security_guidance = security_consultation.weighted_answer
|
|
135
|
-
|
|
136
|
-
# Use LLM to analyze security issues
|
|
137
|
-
if target_path.is_file():
|
|
138
|
-
code = target_path.read_text(encoding="utf-8")
|
|
139
|
-
security_guidance_section = (
|
|
140
|
-
f"Security Expert Guidance:\n{security_guidance}\n"
|
|
141
|
-
if security_guidance
|
|
142
|
-
else ""
|
|
143
|
-
)
|
|
144
|
-
prompt = f"""Analyze the following code for security vulnerabilities.
|
|
145
|
-
|
|
146
|
-
{security_guidance_section}
|
|
147
|
-
|
|
148
|
-
Code to analyze:
|
|
149
|
-
|
|
150
|
-
```python
|
|
151
|
-
{code}
|
|
152
|
-
```
|
|
153
|
-
|
|
154
|
-
Identify:
|
|
155
|
-
1. SQL injection risks
|
|
156
|
-
2. XSS vulnerabilities
|
|
157
|
-
3. Insecure authentication/authorization
|
|
158
|
-
4. Hardcoded secrets or credentials
|
|
159
|
-
5. Insecure random number generation
|
|
160
|
-
6. Path traversal vulnerabilities
|
|
161
|
-
7. Insecure deserialization
|
|
162
|
-
8. Missing input validation
|
|
163
|
-
9. Insecure file operations
|
|
164
|
-
10. Other security best practices violations
|
|
165
|
-
|
|
166
|
-
Return findings in JSON format:
|
|
167
|
-
{{
|
|
168
|
-
"issues": [
|
|
169
|
-
{{
|
|
170
|
-
"severity": "high|medium|low",
|
|
171
|
-
"type": "issue_type",
|
|
172
|
-
"description": "description",
|
|
173
|
-
"line": line_number,
|
|
174
|
-
"recommendation": "how to fix"
|
|
175
|
-
}}
|
|
176
|
-
]
|
|
177
|
-
}}"""
|
|
178
|
-
|
|
179
|
-
# Prepare instruction for Cursor Skills
|
|
180
|
-
instruction = GenericInstruction(
|
|
181
|
-
agent_name="ops",
|
|
182
|
-
command="analyze-security",
|
|
183
|
-
prompt=prompt,
|
|
184
|
-
parameters={"target_path": str(target_path)},
|
|
185
|
-
)
|
|
186
|
-
# Issues will be determined by Cursor Skills execution
|
|
187
|
-
issues = []
|
|
188
|
-
else:
|
|
189
|
-
# Directory scan - placeholder for more comprehensive scanning
|
|
190
|
-
issues.append(
|
|
191
|
-
{
|
|
192
|
-
"severity": "info",
|
|
193
|
-
"type": "scan_started",
|
|
194
|
-
"description": f"Security scan initiated for directory: {target_path}",
|
|
195
|
-
"recommendation": "Review codebase for security best practices",
|
|
196
|
-
}
|
|
197
|
-
)
|
|
198
|
-
|
|
199
|
-
return {
|
|
200
|
-
"message": f"Security scan completed for {target_path}",
|
|
201
|
-
"target": str(target_path),
|
|
202
|
-
"scan_type": scan_type,
|
|
203
|
-
"issues": issues,
|
|
204
|
-
"issue_count": len(issues),
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
async def _handle_compliance_check(
|
|
208
|
-
self, compliance_type: str = "general", **kwargs: Any
|
|
209
|
-
) -> dict[str, Any]:
|
|
210
|
-
"""Check compliance with standards (GDPR, HIPAA, SOC2, etc.)."""
|
|
211
|
-
# Checking compliance...
|
|
212
|
-
|
|
213
|
-
# Get project structure
|
|
214
|
-
config_files = list(self.project_root.glob("*.yml")) + list(
|
|
215
|
-
self.project_root.glob("*.yaml")
|
|
216
|
-
)
|
|
217
|
-
readme_files = list(self.project_root.glob("README*"))
|
|
218
|
-
requirements_files = list(self.project_root.glob("requirements*.txt"))
|
|
219
|
-
|
|
220
|
-
compliance_checks = []
|
|
221
|
-
|
|
222
|
-
# Consult Security and Data Privacy experts
|
|
223
|
-
security_guidance = ""
|
|
224
|
-
privacy_guidance = ""
|
|
225
|
-
# Use defensive check to ensure attribute exists (safety for MRO issue)
|
|
226
|
-
if hasattr(self, 'expert_registry') and self.expert_registry:
|
|
227
|
-
security_consultation = await self.expert_registry.consult(
|
|
228
|
-
query=f"Provide security compliance best practices for {compliance_type} compliance checking",
|
|
229
|
-
domain="security",
|
|
230
|
-
agent_id=self.agent_id,
|
|
231
|
-
prioritize_builtin=True,
|
|
232
|
-
)
|
|
233
|
-
if (
|
|
234
|
-
security_consultation.confidence
|
|
235
|
-
>= security_consultation.confidence_threshold
|
|
236
|
-
):
|
|
237
|
-
security_guidance = security_consultation.weighted_answer
|
|
238
|
-
|
|
239
|
-
privacy_consultation = await self.expert_registry.consult(
|
|
240
|
-
query=f"Provide data privacy compliance best practices for {compliance_type} compliance checking",
|
|
241
|
-
domain="data-privacy-compliance",
|
|
242
|
-
agent_id=self.agent_id,
|
|
243
|
-
prioritize_builtin=True,
|
|
244
|
-
)
|
|
245
|
-
if (
|
|
246
|
-
privacy_consultation.confidence
|
|
247
|
-
>= privacy_consultation.confidence_threshold
|
|
248
|
-
):
|
|
249
|
-
privacy_guidance = privacy_consultation.weighted_answer
|
|
250
|
-
|
|
251
|
-
# Basic compliance checks
|
|
252
|
-
if compliance_type in ["general", "all"]:
|
|
253
|
-
compliance_checks.append(
|
|
254
|
-
{
|
|
255
|
-
"check": "Documentation",
|
|
256
|
-
"status": "pass" if readme_files else "warning",
|
|
257
|
-
"message": "README found" if readme_files else "README not found",
|
|
258
|
-
}
|
|
259
|
-
)
|
|
260
|
-
|
|
261
|
-
compliance_checks.append(
|
|
262
|
-
{
|
|
263
|
-
"check": "Dependencies",
|
|
264
|
-
"status": "pass" if requirements_files else "warning",
|
|
265
|
-
"message": (
|
|
266
|
-
"Requirements file found"
|
|
267
|
-
if requirements_files
|
|
268
|
-
else "Requirements file not found"
|
|
269
|
-
),
|
|
270
|
-
}
|
|
271
|
-
)
|
|
272
|
-
|
|
273
|
-
# Use LLM for compliance analysis
|
|
274
|
-
security_guidance_section = (
|
|
275
|
-
f"Security Expert Guidance:\n{security_guidance}\n"
|
|
276
|
-
if security_guidance
|
|
277
|
-
else ""
|
|
278
|
-
)
|
|
279
|
-
privacy_guidance_section = (
|
|
280
|
-
f"Data Privacy Expert Guidance:\n{privacy_guidance}\n"
|
|
281
|
-
if privacy_guidance
|
|
282
|
-
else ""
|
|
283
|
-
)
|
|
284
|
-
prompt = f"""Analyze this project for {compliance_type} compliance.
|
|
285
|
-
|
|
286
|
-
{security_guidance_section}
|
|
287
|
-
{privacy_guidance_section}
|
|
288
|
-
|
|
289
|
-
Project details:
|
|
290
|
-
|
|
291
|
-
Project root: {self.project_root}
|
|
292
|
-
Config files: {[str(f) for f in config_files]}
|
|
293
|
-
|
|
294
|
-
Provide compliance analysis focusing on:
|
|
295
|
-
1. Data protection and privacy
|
|
296
|
-
2. Access control and authentication
|
|
297
|
-
3. Audit logging
|
|
298
|
-
4. Data encryption
|
|
299
|
-
5. Secure configuration
|
|
300
|
-
6. Dependency management
|
|
301
|
-
7. Incident response planning
|
|
302
|
-
|
|
303
|
-
Return findings in JSON format:
|
|
304
|
-
{{
|
|
305
|
-
"compliance_status": "compliant|non_compliant|partial",
|
|
306
|
-
"checks": [
|
|
307
|
-
{{
|
|
308
|
-
"check": "check_name",
|
|
309
|
-
"status": "pass|fail|warning",
|
|
310
|
-
"message": "description",
|
|
311
|
-
"recommendation": "how to improve"
|
|
312
|
-
}}
|
|
313
|
-
]
|
|
314
|
-
}}"""
|
|
315
|
-
|
|
316
|
-
# Prepare instruction for Cursor Skills
|
|
317
|
-
instruction = GenericInstruction(
|
|
318
|
-
agent_name="ops",
|
|
319
|
-
command="check-compliance",
|
|
320
|
-
prompt=prompt,
|
|
321
|
-
parameters={"compliance_type": compliance_type},
|
|
322
|
-
)
|
|
323
|
-
# Compliance status will be determined by Cursor Skills execution
|
|
324
|
-
compliance_status = "unknown"
|
|
325
|
-
|
|
326
|
-
return {
|
|
327
|
-
"message": f"Compliance check completed for {compliance_type}",
|
|
328
|
-
"compliance_type": compliance_type,
|
|
329
|
-
"compliance_status": compliance_status,
|
|
330
|
-
"checks": compliance_checks,
|
|
331
|
-
}
|
|
332
|
-
|
|
333
|
-
async def _handle_deploy(
|
|
334
|
-
self, target: str = "local", environment: str | None = None, **kwargs: Any
|
|
335
|
-
) -> dict[str, Any]:
|
|
336
|
-
"""Deploy application to target environment."""
|
|
337
|
-
# Deploying to target environment...
|
|
338
|
-
|
|
339
|
-
# Consult Security expert for secure deployment guidance
|
|
340
|
-
security_guidance = ""
|
|
341
|
-
# Use defensive check to ensure attribute exists (safety for MRO issue)
|
|
342
|
-
if hasattr(self, 'expert_registry') and self.expert_registry:
|
|
343
|
-
security_consultation = await self.expert_registry.consult(
|
|
344
|
-
query=f"Provide security best practices for deploying to {target} environment ({environment or 'default'})",
|
|
345
|
-
domain="security",
|
|
346
|
-
agent_id=self.agent_id,
|
|
347
|
-
prioritize_builtin=True,
|
|
348
|
-
)
|
|
349
|
-
if (
|
|
350
|
-
security_consultation.confidence
|
|
351
|
-
>= security_consultation.confidence_threshold
|
|
352
|
-
):
|
|
353
|
-
security_guidance = security_consultation.weighted_answer
|
|
354
|
-
|
|
355
|
-
# Generate deployment script/instructions
|
|
356
|
-
security_guidance_section = (
|
|
357
|
-
f"Security Expert Guidance:\n{security_guidance}\n"
|
|
358
|
-
if security_guidance
|
|
359
|
-
else ""
|
|
360
|
-
)
|
|
361
|
-
prompt = f"""Generate deployment instructions for this project.
|
|
362
|
-
|
|
363
|
-
{security_guidance_section}
|
|
364
|
-
|
|
365
|
-
Project details:
|
|
366
|
-
|
|
367
|
-
Project root: {self.project_root}
|
|
368
|
-
Target: {target}
|
|
369
|
-
Environment: {environment or "default"}
|
|
370
|
-
|
|
371
|
-
Consider:
|
|
372
|
-
1. Dependencies installation
|
|
373
|
-
2. Configuration setup
|
|
374
|
-
3. Database migrations
|
|
375
|
-
4. Service startup
|
|
376
|
-
5. Health checks
|
|
377
|
-
6. Rollback procedures
|
|
378
|
-
|
|
379
|
-
Return deployment steps in JSON format:
|
|
380
|
-
{{
|
|
381
|
-
"steps": [
|
|
382
|
-
{{
|
|
383
|
-
"step": step_number,
|
|
384
|
-
"action": "action_description",
|
|
385
|
-
"command": "command_to_run",
|
|
386
|
-
"description": "what this step does"
|
|
387
|
-
}}
|
|
388
|
-
],
|
|
389
|
-
"rollback_steps": [
|
|
390
|
-
{{
|
|
391
|
-
"step": step_number,
|
|
392
|
-
"action": "rollback_action",
|
|
393
|
-
"command": "rollback_command"
|
|
394
|
-
}}
|
|
395
|
-
]
|
|
396
|
-
}}"""
|
|
397
|
-
|
|
398
|
-
# Prepare instruction for Cursor Skills
|
|
399
|
-
instruction = GenericInstruction(
|
|
400
|
-
agent_name="ops",
|
|
401
|
-
command="create-deployment-plan",
|
|
402
|
-
prompt=prompt,
|
|
403
|
-
parameters={
|
|
404
|
-
"target": target,
|
|
405
|
-
"environment": environment,
|
|
406
|
-
},
|
|
407
|
-
)
|
|
408
|
-
|
|
409
|
-
return {
|
|
410
|
-
"message": f"Deployment plan instruction prepared for {target}",
|
|
411
|
-
"instruction": instruction.to_dict(),
|
|
412
|
-
"skill_command": instruction.to_skill_command(),
|
|
413
|
-
"target": target,
|
|
414
|
-
"environment": environment,
|
|
415
|
-
"status": "planned",
|
|
416
|
-
}
|
|
417
|
-
|
|
418
|
-
async def _handle_infrastructure_setup(
|
|
419
|
-
self, infrastructure_type: str = "docker", **kwargs: Any
|
|
420
|
-
) -> dict[str, Any]:
|
|
421
|
-
"""Set up infrastructure as code (Docker, Kubernetes, Terraform, etc.)."""
|
|
422
|
-
# Setting up infrastructure...
|
|
423
|
-
|
|
424
|
-
# Generate infrastructure configuration files
|
|
425
|
-
if infrastructure_type == "docker":
|
|
426
|
-
dockerfile_path = self.project_root / "Dockerfile"
|
|
427
|
-
|
|
428
|
-
# Consult Security expert for secure infrastructure setup
|
|
429
|
-
security_guidance = ""
|
|
430
|
-
# Use defensive check to ensure attribute exists (safety for MRO issue)
|
|
431
|
-
if hasattr(self, 'expert_registry') and self.expert_registry:
|
|
432
|
-
security_consultation = await self.expert_registry.consult(
|
|
433
|
-
query=f"Provide security best practices for setting up {infrastructure_type} infrastructure",
|
|
434
|
-
domain="security",
|
|
435
|
-
agent_id=self.agent_id,
|
|
436
|
-
prioritize_builtin=True,
|
|
437
|
-
)
|
|
438
|
-
if (
|
|
439
|
-
security_consultation.confidence
|
|
440
|
-
>= security_consultation.confidence_threshold
|
|
441
|
-
):
|
|
442
|
-
security_guidance = security_consultation.weighted_answer
|
|
443
|
-
|
|
444
|
-
# Use LLM to generate Docker configurations
|
|
445
|
-
security_guidance_section = (
|
|
446
|
-
f"Security Expert Guidance:\n{security_guidance}\n"
|
|
447
|
-
if security_guidance
|
|
448
|
-
else ""
|
|
449
|
-
)
|
|
450
|
-
prompt = f"""Generate Docker configuration for this project.
|
|
451
|
-
|
|
452
|
-
{security_guidance_section}
|
|
453
|
-
|
|
454
|
-
Project details:
|
|
455
|
-
|
|
456
|
-
Project root: {self.project_root}
|
|
457
|
-
Project type: Python application
|
|
458
|
-
|
|
459
|
-
Generate:
|
|
460
|
-
1. Dockerfile optimized for Python
|
|
461
|
-
2. docker-compose.yml if applicable
|
|
462
|
-
3. .dockerignore file
|
|
463
|
-
|
|
464
|
-
Return Dockerfile content and docker-compose.yml content."""
|
|
465
|
-
|
|
466
|
-
# Prepare instruction for Cursor Skills
|
|
467
|
-
instruction = GenericInstruction(
|
|
468
|
-
agent_name="ops",
|
|
469
|
-
command="setup-infrastructure",
|
|
470
|
-
prompt=prompt,
|
|
471
|
-
parameters={
|
|
472
|
-
"infrastructure_type": infrastructure_type,
|
|
473
|
-
"dockerfile_path": str(dockerfile_path),
|
|
474
|
-
},
|
|
475
|
-
)
|
|
476
|
-
|
|
477
|
-
return {
|
|
478
|
-
"message": f"Infrastructure setup instruction prepared for {infrastructure_type}",
|
|
479
|
-
"instruction": instruction.to_dict(),
|
|
480
|
-
"skill_command": instruction.to_skill_command(),
|
|
481
|
-
"infrastructure_type": infrastructure_type,
|
|
482
|
-
"status": "planned",
|
|
483
|
-
}
|
|
484
|
-
else:
|
|
485
|
-
return {
|
|
486
|
-
"message": f"Infrastructure type {infrastructure_type} not yet implemented",
|
|
487
|
-
"infrastructure_type": infrastructure_type,
|
|
488
|
-
"status": "not_implemented",
|
|
489
|
-
}
|
|
490
|
-
|
|
491
|
-
async def _handle_audit_dependencies(
|
|
492
|
-
self, severity_threshold: str | None = None, **kwargs: Any
|
|
493
|
-
) -> dict[str, Any]:
|
|
494
|
-
"""
|
|
495
|
-
Audit dependencies for security vulnerabilities.
|
|
496
|
-
|
|
497
|
-
Phase 6.4.3: Dependency Analysis & Security Auditing
|
|
498
|
-
|
|
499
|
-
Args:
|
|
500
|
-
severity_threshold: Minimum severity to report (low/medium/high/critical)
|
|
501
|
-
|
|
502
|
-
Returns:
|
|
503
|
-
Dictionary with security audit results
|
|
504
|
-
"""
|
|
505
|
-
if severity_threshold is None:
|
|
506
|
-
# Get from config
|
|
507
|
-
quality_tools = self.config.quality_tools if self.config else None
|
|
508
|
-
severity_threshold = (
|
|
509
|
-
quality_tools.dependency_audit_threshold if quality_tools else "high"
|
|
510
|
-
)
|
|
511
|
-
|
|
512
|
-
audit_result = (
|
|
513
|
-
self.dependency_analyzer.run_security_audit(
|
|
514
|
-
severity_threshold=severity_threshold
|
|
515
|
-
)
|
|
516
|
-
or {}
|
|
517
|
-
)
|
|
518
|
-
|
|
519
|
-
return {
|
|
520
|
-
"message": "Dependency security audit completed",
|
|
521
|
-
"severity_threshold": severity_threshold,
|
|
522
|
-
"vulnerabilities": audit_result.get("vulnerabilities", []),
|
|
523
|
-
"vulnerability_count": audit_result.get("vulnerability_count", 0),
|
|
524
|
-
"severity_breakdown": audit_result.get("severity_breakdown", {}),
|
|
525
|
-
"tools_available": audit_result.get("tools_available", {}),
|
|
526
|
-
"error": audit_result.get("error"),
|
|
527
|
-
}
|
|
528
|
-
|
|
529
|
-
async def _handle_dependency_tree(self, **kwargs: Any) -> dict[str, Any]:
|
|
530
|
-
"""
|
|
531
|
-
Visualize dependency tree.
|
|
532
|
-
|
|
533
|
-
Phase 6.4.3: Dependency Analysis & Security Auditing
|
|
534
|
-
|
|
535
|
-
Returns:
|
|
536
|
-
Dictionary with dependency tree information
|
|
537
|
-
"""
|
|
538
|
-
tree_result = self.dependency_analyzer.get_dependency_tree() or {}
|
|
539
|
-
|
|
540
|
-
return {
|
|
541
|
-
"message": "Dependency tree generated",
|
|
542
|
-
"tree": tree_result.get("tree"),
|
|
543
|
-
"tree_json": tree_result.get("tree_json"),
|
|
544
|
-
"package_count": tree_result.get("package_count", 0),
|
|
545
|
-
"error": tree_result.get("error"),
|
|
546
|
-
}
|
|
547
|
-
|
|
548
|
-
async def _handle_check_vulnerabilities(
|
|
549
|
-
self, severity_threshold: str | None = None, **kwargs: Any
|
|
550
|
-
) -> dict[str, Any]:
|
|
551
|
-
"""
|
|
552
|
-
Check for dependency vulnerabilities (alias for audit-dependencies).
|
|
553
|
-
|
|
554
|
-
Phase 6.4.3: Dependency Analysis & Security Auditing
|
|
555
|
-
|
|
556
|
-
Args:
|
|
557
|
-
severity_threshold: Minimum severity to report (low/medium/high/critical)
|
|
558
|
-
|
|
559
|
-
Returns:
|
|
560
|
-
Dictionary with vulnerability check results
|
|
561
|
-
"""
|
|
562
|
-
return await self._handle_audit_dependencies(
|
|
563
|
-
severity_threshold=severity_threshold, **kwargs
|
|
564
|
-
)
|
|
565
|
-
|
|
566
|
-
async def _handle_audit_bundle(self, **kwargs: Any) -> dict[str, Any]:
|
|
567
|
-
"""
|
|
568
|
-
Opt-in bundle analysis for Node/React/Vue. §3.8. Best-effort; never fails.
|
|
569
|
-
"""
|
|
570
|
-
out = self.dependency_analyzer.run_audit_bundle(project_root=self.project_root) or {}
|
|
571
|
-
return {"message": "Bundle analysis completed (best-effort)", **out}
|
|
572
|
-
|
|
573
|
-
def _handle_help(self) -> dict[str, Any]:
|
|
574
|
-
"""
|
|
575
|
-
Return help information for Ops Agent.
|
|
576
|
-
|
|
577
|
-
Returns standardized help format with commands and descriptions.
|
|
578
|
-
|
|
579
|
-
Returns:
|
|
580
|
-
dict: Help information with standardized format:
|
|
581
|
-
- type (str): Always "help"
|
|
582
|
-
- content (str): Formatted markdown help text containing:
|
|
583
|
-
- Available commands with descriptions
|
|
584
|
-
|
|
585
|
-
Note:
|
|
586
|
-
This method is synchronous as it performs no I/O operations.
|
|
587
|
-
Standardized to match format used by other agents (type + content keys).
|
|
588
|
-
"""
|
|
589
|
-
help_message = {
|
|
590
|
-
"*security-scan [target] [type]": "Perform security scanning on codebase or specific target",
|
|
591
|
-
"*compliance-check [type]": "Check compliance with standards (GDPR, HIPAA, SOC2, general)",
|
|
592
|
-
"*deploy [target] [environment]": "Deploy application to target environment (local, staging, production)",
|
|
593
|
-
"*infrastructure-setup [type]": "Set up infrastructure as code (docker, kubernetes, terraform)",
|
|
594
|
-
"*audit-dependencies [severity_threshold]": "Audit dependencies for security vulnerabilities (Phase 6.4.3)",
|
|
595
|
-
"*dependency-tree": "Visualize dependency tree using pipdeptree (Phase 6.4.3)",
|
|
596
|
-
"*check-vulnerabilities [severity_threshold]": "Check for dependency vulnerabilities (Phase 6.4.3)",
|
|
597
|
-
"*audit-bundle": "Opt-in bundle analysis for Node/React/Vue (§3.8); best-effort, does not block",
|
|
598
|
-
"*help": "Show this help message",
|
|
599
|
-
}
|
|
600
|
-
|
|
601
|
-
# Format as markdown for consistency with other agents
|
|
602
|
-
command_lines = [
|
|
603
|
-
f"- **{cmd}**: {desc}"
|
|
604
|
-
for cmd, desc in help_message.items()
|
|
605
|
-
]
|
|
606
|
-
|
|
607
|
-
content = f"""# {self.agent_name} - Help
|
|
608
|
-
|
|
609
|
-
## Available Commands
|
|
610
|
-
|
|
611
|
-
{chr(10).join(command_lines)}
|
|
612
|
-
"""
|
|
613
|
-
|
|
614
|
-
return {"type": "help", "content": content}
|
|
615
|
-
|
|
616
|
-
async def close(self) -> None:
|
|
617
|
-
"""Cleanup resources."""
|
|
618
|
-
await super().close()
|
|
619
|
-
# Dependency analyzer cleanup if needed
|
|
1
|
+
"""
|
|
2
|
+
Ops Agent - Security scanning, compliance checks, deployment, and infrastructure management
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
import inspect
|
|
6
|
+
import json
|
|
7
|
+
from pathlib import Path
|
|
8
|
+
from typing import Any
|
|
9
|
+
|
|
10
|
+
from ...context7.agent_integration import Context7AgentHelper, get_context7_helper
|
|
11
|
+
from ...core.agent_base import BaseAgent
|
|
12
|
+
from ...core.config import ProjectConfig, load_config
|
|
13
|
+
from ...core.instructions import GenericInstruction
|
|
14
|
+
from ...experts.agent_integration import ExpertSupportMixin
|
|
15
|
+
from .dependency_analyzer import DependencyAnalyzer
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class OpsAgent(BaseAgent, ExpertSupportMixin):
|
|
19
|
+
"""
|
|
20
|
+
Ops Agent - Security scanning, compliance, deployment, and infrastructure management.
|
|
21
|
+
|
|
22
|
+
Permissions: Read, Write, Grep, Glob, Bash (no Edit)
|
|
23
|
+
|
|
24
|
+
⚠️ CRITICAL ACCURACY REQUIREMENT:
|
|
25
|
+
- NEVER make up, invent, or fabricate information - Only report verified facts
|
|
26
|
+
- ALWAYS verify claims by checking actual results, not just test pass/fail
|
|
27
|
+
- Verify API calls succeed - inspect response data, status codes, error messages
|
|
28
|
+
- Distinguish between code paths executing and actual functionality working
|
|
29
|
+
- Admit uncertainty explicitly when you cannot verify
|
|
30
|
+
"""
|
|
31
|
+
|
|
32
|
+
def __init__(
|
|
33
|
+
self,
|
|
34
|
+
config: ProjectConfig | None = None,
|
|
35
|
+
project_root: Path | None = None,
|
|
36
|
+
):
|
|
37
|
+
super().__init__(agent_id="ops", agent_name="Ops Agent", config=config)
|
|
38
|
+
if config is None:
|
|
39
|
+
config = load_config()
|
|
40
|
+
self.config = config
|
|
41
|
+
|
|
42
|
+
# Set project_root early (before activate) if provided, otherwise use cwd
|
|
43
|
+
if project_root is None:
|
|
44
|
+
project_root = Path.cwd()
|
|
45
|
+
self.project_root = Path(project_root).resolve()
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
# Initialize dependency analyzer
|
|
49
|
+
self.dependency_analyzer = DependencyAnalyzer(project_root=self.project_root)
|
|
50
|
+
|
|
51
|
+
# Initialize Context7 helper (Enhancement: Universal Context7 integration)
|
|
52
|
+
self.context7: Context7AgentHelper | None = None
|
|
53
|
+
if config:
|
|
54
|
+
self.context7 = get_context7_helper(self, config)
|
|
55
|
+
|
|
56
|
+
# Expert registry initialization (required due to multiple inheritance MRO issue)
|
|
57
|
+
# BaseAgent.__init__() doesn't call super().__init__(), so ExpertSupportMixin.__init__()
|
|
58
|
+
# is never called via MRO. We must manually initialize to avoid AttributeError.
|
|
59
|
+
# The registry will be properly initialized in activate() via _initialize_expert_support()
|
|
60
|
+
self.expert_registry: Any | None = None
|
|
61
|
+
|
|
62
|
+
async def activate(self, project_root: Path | None = None, offline_mode: bool = False):
|
|
63
|
+
# Validate that expert_registry attribute exists (safety check)
|
|
64
|
+
if not hasattr(self, 'expert_registry'):
|
|
65
|
+
raise AttributeError(
|
|
66
|
+
f"{self.__class__.__name__}.expert_registry not initialized. "
|
|
67
|
+
"This should not happen if __init__() properly initializes the attribute."
|
|
68
|
+
)
|
|
69
|
+
# Update project_root if provided
|
|
70
|
+
if project_root is not None:
|
|
71
|
+
self.project_root = Path(project_root).resolve()
|
|
72
|
+
# Reinitialize dependency analyzer with new project_root
|
|
73
|
+
self.dependency_analyzer = DependencyAnalyzer(
|
|
74
|
+
project_root=self.project_root
|
|
75
|
+
)
|
|
76
|
+
|
|
77
|
+
await super().activate(project_root, offline_mode=offline_mode)
|
|
78
|
+
await self._initialize_expert_support(project_root, offline_mode=offline_mode)
|
|
79
|
+
self.greet()
|
|
80
|
+
await self.run("help")
|
|
81
|
+
|
|
82
|
+
def greet(self):
|
|
83
|
+
print(
|
|
84
|
+
f"Hello! I am the {self.agent_name}. I help with security, compliance, deployment, and infrastructure."
|
|
85
|
+
)
|
|
86
|
+
|
|
87
|
+
async def run(self, command: str, **kwargs: Any) -> dict[str, Any]:
|
|
88
|
+
command = command.lstrip("*") # Remove star prefix if present
|
|
89
|
+
handler_name = f"_handle_{command.replace('-', '_')}"
|
|
90
|
+
if hasattr(self, handler_name):
|
|
91
|
+
handler = getattr(self, handler_name)
|
|
92
|
+
# Check if handler is async before awaiting
|
|
93
|
+
if inspect.iscoroutinefunction(handler):
|
|
94
|
+
return await handler(**kwargs)
|
|
95
|
+
else:
|
|
96
|
+
# Synchronous handler - call directly
|
|
97
|
+
return handler(**kwargs)
|
|
98
|
+
else:
|
|
99
|
+
return {
|
|
100
|
+
"error": f"Unknown command: {command}. Use '*help' to see available commands."
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
async def _handle_security_scan(
|
|
104
|
+
self, target: str | None = None, scan_type: str = "all", **kwargs: Any
|
|
105
|
+
) -> dict[str, Any]:
|
|
106
|
+
"""Perform security scanning on codebase or specific target."""
|
|
107
|
+
target_path = Path(target) if target else self.project_root
|
|
108
|
+
|
|
109
|
+
if not target_path.is_absolute():
|
|
110
|
+
target_path = self.project_root / target_path
|
|
111
|
+
|
|
112
|
+
if not target_path.exists():
|
|
113
|
+
return {"error": f"Target not found: {target}"}
|
|
114
|
+
|
|
115
|
+
# Scanning for security issues...
|
|
116
|
+
|
|
117
|
+
# Get codebase context for security analysis
|
|
118
|
+
issues = []
|
|
119
|
+
|
|
120
|
+
# Consult Security expert for security scanning guidance
|
|
121
|
+
security_guidance = ""
|
|
122
|
+
# Use defensive check to ensure attribute exists (safety for MRO issue)
|
|
123
|
+
if hasattr(self, 'expert_registry') and self.expert_registry:
|
|
124
|
+
security_consultation = await self.expert_registry.consult(
|
|
125
|
+
query=f"Provide security scanning best practices and vulnerability detection guidance for analyzing: {target_path.name if target_path.is_file() else 'directory'}",
|
|
126
|
+
domain="security",
|
|
127
|
+
agent_id=self.agent_id,
|
|
128
|
+
prioritize_builtin=True,
|
|
129
|
+
)
|
|
130
|
+
if (
|
|
131
|
+
security_consultation.confidence
|
|
132
|
+
>= security_consultation.confidence_threshold
|
|
133
|
+
):
|
|
134
|
+
security_guidance = security_consultation.weighted_answer
|
|
135
|
+
|
|
136
|
+
# Use LLM to analyze security issues
|
|
137
|
+
if target_path.is_file():
|
|
138
|
+
code = target_path.read_text(encoding="utf-8")
|
|
139
|
+
security_guidance_section = (
|
|
140
|
+
f"Security Expert Guidance:\n{security_guidance}\n"
|
|
141
|
+
if security_guidance
|
|
142
|
+
else ""
|
|
143
|
+
)
|
|
144
|
+
prompt = f"""Analyze the following code for security vulnerabilities.
|
|
145
|
+
|
|
146
|
+
{security_guidance_section}
|
|
147
|
+
|
|
148
|
+
Code to analyze:
|
|
149
|
+
|
|
150
|
+
```python
|
|
151
|
+
{code}
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
Identify:
|
|
155
|
+
1. SQL injection risks
|
|
156
|
+
2. XSS vulnerabilities
|
|
157
|
+
3. Insecure authentication/authorization
|
|
158
|
+
4. Hardcoded secrets or credentials
|
|
159
|
+
5. Insecure random number generation
|
|
160
|
+
6. Path traversal vulnerabilities
|
|
161
|
+
7. Insecure deserialization
|
|
162
|
+
8. Missing input validation
|
|
163
|
+
9. Insecure file operations
|
|
164
|
+
10. Other security best practices violations
|
|
165
|
+
|
|
166
|
+
Return findings in JSON format:
|
|
167
|
+
{{
|
|
168
|
+
"issues": [
|
|
169
|
+
{{
|
|
170
|
+
"severity": "high|medium|low",
|
|
171
|
+
"type": "issue_type",
|
|
172
|
+
"description": "description",
|
|
173
|
+
"line": line_number,
|
|
174
|
+
"recommendation": "how to fix"
|
|
175
|
+
}}
|
|
176
|
+
]
|
|
177
|
+
}}"""
|
|
178
|
+
|
|
179
|
+
# Prepare instruction for Cursor Skills
|
|
180
|
+
instruction = GenericInstruction(
|
|
181
|
+
agent_name="ops",
|
|
182
|
+
command="analyze-security",
|
|
183
|
+
prompt=prompt,
|
|
184
|
+
parameters={"target_path": str(target_path)},
|
|
185
|
+
)
|
|
186
|
+
# Issues will be determined by Cursor Skills execution
|
|
187
|
+
issues = []
|
|
188
|
+
else:
|
|
189
|
+
# Directory scan - placeholder for more comprehensive scanning
|
|
190
|
+
issues.append(
|
|
191
|
+
{
|
|
192
|
+
"severity": "info",
|
|
193
|
+
"type": "scan_started",
|
|
194
|
+
"description": f"Security scan initiated for directory: {target_path}",
|
|
195
|
+
"recommendation": "Review codebase for security best practices",
|
|
196
|
+
}
|
|
197
|
+
)
|
|
198
|
+
|
|
199
|
+
return {
|
|
200
|
+
"message": f"Security scan completed for {target_path}",
|
|
201
|
+
"target": str(target_path),
|
|
202
|
+
"scan_type": scan_type,
|
|
203
|
+
"issues": issues,
|
|
204
|
+
"issue_count": len(issues),
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
async def _handle_compliance_check(
|
|
208
|
+
self, compliance_type: str = "general", **kwargs: Any
|
|
209
|
+
) -> dict[str, Any]:
|
|
210
|
+
"""Check compliance with standards (GDPR, HIPAA, SOC2, etc.)."""
|
|
211
|
+
# Checking compliance...
|
|
212
|
+
|
|
213
|
+
# Get project structure
|
|
214
|
+
config_files = list(self.project_root.glob("*.yml")) + list(
|
|
215
|
+
self.project_root.glob("*.yaml")
|
|
216
|
+
)
|
|
217
|
+
readme_files = list(self.project_root.glob("README*"))
|
|
218
|
+
requirements_files = list(self.project_root.glob("requirements*.txt"))
|
|
219
|
+
|
|
220
|
+
compliance_checks = []
|
|
221
|
+
|
|
222
|
+
# Consult Security and Data Privacy experts
|
|
223
|
+
security_guidance = ""
|
|
224
|
+
privacy_guidance = ""
|
|
225
|
+
# Use defensive check to ensure attribute exists (safety for MRO issue)
|
|
226
|
+
if hasattr(self, 'expert_registry') and self.expert_registry:
|
|
227
|
+
security_consultation = await self.expert_registry.consult(
|
|
228
|
+
query=f"Provide security compliance best practices for {compliance_type} compliance checking",
|
|
229
|
+
domain="security",
|
|
230
|
+
agent_id=self.agent_id,
|
|
231
|
+
prioritize_builtin=True,
|
|
232
|
+
)
|
|
233
|
+
if (
|
|
234
|
+
security_consultation.confidence
|
|
235
|
+
>= security_consultation.confidence_threshold
|
|
236
|
+
):
|
|
237
|
+
security_guidance = security_consultation.weighted_answer
|
|
238
|
+
|
|
239
|
+
privacy_consultation = await self.expert_registry.consult(
|
|
240
|
+
query=f"Provide data privacy compliance best practices for {compliance_type} compliance checking",
|
|
241
|
+
domain="data-privacy-compliance",
|
|
242
|
+
agent_id=self.agent_id,
|
|
243
|
+
prioritize_builtin=True,
|
|
244
|
+
)
|
|
245
|
+
if (
|
|
246
|
+
privacy_consultation.confidence
|
|
247
|
+
>= privacy_consultation.confidence_threshold
|
|
248
|
+
):
|
|
249
|
+
privacy_guidance = privacy_consultation.weighted_answer
|
|
250
|
+
|
|
251
|
+
# Basic compliance checks
|
|
252
|
+
if compliance_type in ["general", "all"]:
|
|
253
|
+
compliance_checks.append(
|
|
254
|
+
{
|
|
255
|
+
"check": "Documentation",
|
|
256
|
+
"status": "pass" if readme_files else "warning",
|
|
257
|
+
"message": "README found" if readme_files else "README not found",
|
|
258
|
+
}
|
|
259
|
+
)
|
|
260
|
+
|
|
261
|
+
compliance_checks.append(
|
|
262
|
+
{
|
|
263
|
+
"check": "Dependencies",
|
|
264
|
+
"status": "pass" if requirements_files else "warning",
|
|
265
|
+
"message": (
|
|
266
|
+
"Requirements file found"
|
|
267
|
+
if requirements_files
|
|
268
|
+
else "Requirements file not found"
|
|
269
|
+
),
|
|
270
|
+
}
|
|
271
|
+
)
|
|
272
|
+
|
|
273
|
+
# Use LLM for compliance analysis
|
|
274
|
+
security_guidance_section = (
|
|
275
|
+
f"Security Expert Guidance:\n{security_guidance}\n"
|
|
276
|
+
if security_guidance
|
|
277
|
+
else ""
|
|
278
|
+
)
|
|
279
|
+
privacy_guidance_section = (
|
|
280
|
+
f"Data Privacy Expert Guidance:\n{privacy_guidance}\n"
|
|
281
|
+
if privacy_guidance
|
|
282
|
+
else ""
|
|
283
|
+
)
|
|
284
|
+
prompt = f"""Analyze this project for {compliance_type} compliance.
|
|
285
|
+
|
|
286
|
+
{security_guidance_section}
|
|
287
|
+
{privacy_guidance_section}
|
|
288
|
+
|
|
289
|
+
Project details:
|
|
290
|
+
|
|
291
|
+
Project root: {self.project_root}
|
|
292
|
+
Config files: {[str(f) for f in config_files]}
|
|
293
|
+
|
|
294
|
+
Provide compliance analysis focusing on:
|
|
295
|
+
1. Data protection and privacy
|
|
296
|
+
2. Access control and authentication
|
|
297
|
+
3. Audit logging
|
|
298
|
+
4. Data encryption
|
|
299
|
+
5. Secure configuration
|
|
300
|
+
6. Dependency management
|
|
301
|
+
7. Incident response planning
|
|
302
|
+
|
|
303
|
+
Return findings in JSON format:
|
|
304
|
+
{{
|
|
305
|
+
"compliance_status": "compliant|non_compliant|partial",
|
|
306
|
+
"checks": [
|
|
307
|
+
{{
|
|
308
|
+
"check": "check_name",
|
|
309
|
+
"status": "pass|fail|warning",
|
|
310
|
+
"message": "description",
|
|
311
|
+
"recommendation": "how to improve"
|
|
312
|
+
}}
|
|
313
|
+
]
|
|
314
|
+
}}"""
|
|
315
|
+
|
|
316
|
+
# Prepare instruction for Cursor Skills
|
|
317
|
+
instruction = GenericInstruction(
|
|
318
|
+
agent_name="ops",
|
|
319
|
+
command="check-compliance",
|
|
320
|
+
prompt=prompt,
|
|
321
|
+
parameters={"compliance_type": compliance_type},
|
|
322
|
+
)
|
|
323
|
+
# Compliance status will be determined by Cursor Skills execution
|
|
324
|
+
compliance_status = "unknown"
|
|
325
|
+
|
|
326
|
+
return {
|
|
327
|
+
"message": f"Compliance check completed for {compliance_type}",
|
|
328
|
+
"compliance_type": compliance_type,
|
|
329
|
+
"compliance_status": compliance_status,
|
|
330
|
+
"checks": compliance_checks,
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
async def _handle_deploy(
|
|
334
|
+
self, target: str = "local", environment: str | None = None, **kwargs: Any
|
|
335
|
+
) -> dict[str, Any]:
|
|
336
|
+
"""Deploy application to target environment."""
|
|
337
|
+
# Deploying to target environment...
|
|
338
|
+
|
|
339
|
+
# Consult Security expert for secure deployment guidance
|
|
340
|
+
security_guidance = ""
|
|
341
|
+
# Use defensive check to ensure attribute exists (safety for MRO issue)
|
|
342
|
+
if hasattr(self, 'expert_registry') and self.expert_registry:
|
|
343
|
+
security_consultation = await self.expert_registry.consult(
|
|
344
|
+
query=f"Provide security best practices for deploying to {target} environment ({environment or 'default'})",
|
|
345
|
+
domain="security",
|
|
346
|
+
agent_id=self.agent_id,
|
|
347
|
+
prioritize_builtin=True,
|
|
348
|
+
)
|
|
349
|
+
if (
|
|
350
|
+
security_consultation.confidence
|
|
351
|
+
>= security_consultation.confidence_threshold
|
|
352
|
+
):
|
|
353
|
+
security_guidance = security_consultation.weighted_answer
|
|
354
|
+
|
|
355
|
+
# Generate deployment script/instructions
|
|
356
|
+
security_guidance_section = (
|
|
357
|
+
f"Security Expert Guidance:\n{security_guidance}\n"
|
|
358
|
+
if security_guidance
|
|
359
|
+
else ""
|
|
360
|
+
)
|
|
361
|
+
prompt = f"""Generate deployment instructions for this project.
|
|
362
|
+
|
|
363
|
+
{security_guidance_section}
|
|
364
|
+
|
|
365
|
+
Project details:
|
|
366
|
+
|
|
367
|
+
Project root: {self.project_root}
|
|
368
|
+
Target: {target}
|
|
369
|
+
Environment: {environment or "default"}
|
|
370
|
+
|
|
371
|
+
Consider:
|
|
372
|
+
1. Dependencies installation
|
|
373
|
+
2. Configuration setup
|
|
374
|
+
3. Database migrations
|
|
375
|
+
4. Service startup
|
|
376
|
+
5. Health checks
|
|
377
|
+
6. Rollback procedures
|
|
378
|
+
|
|
379
|
+
Return deployment steps in JSON format:
|
|
380
|
+
{{
|
|
381
|
+
"steps": [
|
|
382
|
+
{{
|
|
383
|
+
"step": step_number,
|
|
384
|
+
"action": "action_description",
|
|
385
|
+
"command": "command_to_run",
|
|
386
|
+
"description": "what this step does"
|
|
387
|
+
}}
|
|
388
|
+
],
|
|
389
|
+
"rollback_steps": [
|
|
390
|
+
{{
|
|
391
|
+
"step": step_number,
|
|
392
|
+
"action": "rollback_action",
|
|
393
|
+
"command": "rollback_command"
|
|
394
|
+
}}
|
|
395
|
+
]
|
|
396
|
+
}}"""
|
|
397
|
+
|
|
398
|
+
# Prepare instruction for Cursor Skills
|
|
399
|
+
instruction = GenericInstruction(
|
|
400
|
+
agent_name="ops",
|
|
401
|
+
command="create-deployment-plan",
|
|
402
|
+
prompt=prompt,
|
|
403
|
+
parameters={
|
|
404
|
+
"target": target,
|
|
405
|
+
"environment": environment,
|
|
406
|
+
},
|
|
407
|
+
)
|
|
408
|
+
|
|
409
|
+
return {
|
|
410
|
+
"message": f"Deployment plan instruction prepared for {target}",
|
|
411
|
+
"instruction": instruction.to_dict(),
|
|
412
|
+
"skill_command": instruction.to_skill_command(),
|
|
413
|
+
"target": target,
|
|
414
|
+
"environment": environment,
|
|
415
|
+
"status": "planned",
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
async def _handle_infrastructure_setup(
|
|
419
|
+
self, infrastructure_type: str = "docker", **kwargs: Any
|
|
420
|
+
) -> dict[str, Any]:
|
|
421
|
+
"""Set up infrastructure as code (Docker, Kubernetes, Terraform, etc.)."""
|
|
422
|
+
# Setting up infrastructure...
|
|
423
|
+
|
|
424
|
+
# Generate infrastructure configuration files
|
|
425
|
+
if infrastructure_type == "docker":
|
|
426
|
+
dockerfile_path = self.project_root / "Dockerfile"
|
|
427
|
+
|
|
428
|
+
# Consult Security expert for secure infrastructure setup
|
|
429
|
+
security_guidance = ""
|
|
430
|
+
# Use defensive check to ensure attribute exists (safety for MRO issue)
|
|
431
|
+
if hasattr(self, 'expert_registry') and self.expert_registry:
|
|
432
|
+
security_consultation = await self.expert_registry.consult(
|
|
433
|
+
query=f"Provide security best practices for setting up {infrastructure_type} infrastructure",
|
|
434
|
+
domain="security",
|
|
435
|
+
agent_id=self.agent_id,
|
|
436
|
+
prioritize_builtin=True,
|
|
437
|
+
)
|
|
438
|
+
if (
|
|
439
|
+
security_consultation.confidence
|
|
440
|
+
>= security_consultation.confidence_threshold
|
|
441
|
+
):
|
|
442
|
+
security_guidance = security_consultation.weighted_answer
|
|
443
|
+
|
|
444
|
+
# Use LLM to generate Docker configurations
|
|
445
|
+
security_guidance_section = (
|
|
446
|
+
f"Security Expert Guidance:\n{security_guidance}\n"
|
|
447
|
+
if security_guidance
|
|
448
|
+
else ""
|
|
449
|
+
)
|
|
450
|
+
prompt = f"""Generate Docker configuration for this project.
|
|
451
|
+
|
|
452
|
+
{security_guidance_section}
|
|
453
|
+
|
|
454
|
+
Project details:
|
|
455
|
+
|
|
456
|
+
Project root: {self.project_root}
|
|
457
|
+
Project type: Python application
|
|
458
|
+
|
|
459
|
+
Generate:
|
|
460
|
+
1. Dockerfile optimized for Python
|
|
461
|
+
2. docker-compose.yml if applicable
|
|
462
|
+
3. .dockerignore file
|
|
463
|
+
|
|
464
|
+
Return Dockerfile content and docker-compose.yml content."""
|
|
465
|
+
|
|
466
|
+
# Prepare instruction for Cursor Skills
|
|
467
|
+
instruction = GenericInstruction(
|
|
468
|
+
agent_name="ops",
|
|
469
|
+
command="setup-infrastructure",
|
|
470
|
+
prompt=prompt,
|
|
471
|
+
parameters={
|
|
472
|
+
"infrastructure_type": infrastructure_type,
|
|
473
|
+
"dockerfile_path": str(dockerfile_path),
|
|
474
|
+
},
|
|
475
|
+
)
|
|
476
|
+
|
|
477
|
+
return {
|
|
478
|
+
"message": f"Infrastructure setup instruction prepared for {infrastructure_type}",
|
|
479
|
+
"instruction": instruction.to_dict(),
|
|
480
|
+
"skill_command": instruction.to_skill_command(),
|
|
481
|
+
"infrastructure_type": infrastructure_type,
|
|
482
|
+
"status": "planned",
|
|
483
|
+
}
|
|
484
|
+
else:
|
|
485
|
+
return {
|
|
486
|
+
"message": f"Infrastructure type {infrastructure_type} not yet implemented",
|
|
487
|
+
"infrastructure_type": infrastructure_type,
|
|
488
|
+
"status": "not_implemented",
|
|
489
|
+
}
|
|
490
|
+
|
|
491
|
+
async def _handle_audit_dependencies(
|
|
492
|
+
self, severity_threshold: str | None = None, **kwargs: Any
|
|
493
|
+
) -> dict[str, Any]:
|
|
494
|
+
"""
|
|
495
|
+
Audit dependencies for security vulnerabilities.
|
|
496
|
+
|
|
497
|
+
Phase 6.4.3: Dependency Analysis & Security Auditing
|
|
498
|
+
|
|
499
|
+
Args:
|
|
500
|
+
severity_threshold: Minimum severity to report (low/medium/high/critical)
|
|
501
|
+
|
|
502
|
+
Returns:
|
|
503
|
+
Dictionary with security audit results
|
|
504
|
+
"""
|
|
505
|
+
if severity_threshold is None:
|
|
506
|
+
# Get from config
|
|
507
|
+
quality_tools = self.config.quality_tools if self.config else None
|
|
508
|
+
severity_threshold = (
|
|
509
|
+
quality_tools.dependency_audit_threshold if quality_tools else "high"
|
|
510
|
+
)
|
|
511
|
+
|
|
512
|
+
audit_result = (
|
|
513
|
+
self.dependency_analyzer.run_security_audit(
|
|
514
|
+
severity_threshold=severity_threshold
|
|
515
|
+
)
|
|
516
|
+
or {}
|
|
517
|
+
)
|
|
518
|
+
|
|
519
|
+
return {
|
|
520
|
+
"message": "Dependency security audit completed",
|
|
521
|
+
"severity_threshold": severity_threshold,
|
|
522
|
+
"vulnerabilities": audit_result.get("vulnerabilities", []),
|
|
523
|
+
"vulnerability_count": audit_result.get("vulnerability_count", 0),
|
|
524
|
+
"severity_breakdown": audit_result.get("severity_breakdown", {}),
|
|
525
|
+
"tools_available": audit_result.get("tools_available", {}),
|
|
526
|
+
"error": audit_result.get("error"),
|
|
527
|
+
}
|
|
528
|
+
|
|
529
|
+
async def _handle_dependency_tree(self, **kwargs: Any) -> dict[str, Any]:
|
|
530
|
+
"""
|
|
531
|
+
Visualize dependency tree.
|
|
532
|
+
|
|
533
|
+
Phase 6.4.3: Dependency Analysis & Security Auditing
|
|
534
|
+
|
|
535
|
+
Returns:
|
|
536
|
+
Dictionary with dependency tree information
|
|
537
|
+
"""
|
|
538
|
+
tree_result = self.dependency_analyzer.get_dependency_tree() or {}
|
|
539
|
+
|
|
540
|
+
return {
|
|
541
|
+
"message": "Dependency tree generated",
|
|
542
|
+
"tree": tree_result.get("tree"),
|
|
543
|
+
"tree_json": tree_result.get("tree_json"),
|
|
544
|
+
"package_count": tree_result.get("package_count", 0),
|
|
545
|
+
"error": tree_result.get("error"),
|
|
546
|
+
}
|
|
547
|
+
|
|
548
|
+
async def _handle_check_vulnerabilities(
|
|
549
|
+
self, severity_threshold: str | None = None, **kwargs: Any
|
|
550
|
+
) -> dict[str, Any]:
|
|
551
|
+
"""
|
|
552
|
+
Check for dependency vulnerabilities (alias for audit-dependencies).
|
|
553
|
+
|
|
554
|
+
Phase 6.4.3: Dependency Analysis & Security Auditing
|
|
555
|
+
|
|
556
|
+
Args:
|
|
557
|
+
severity_threshold: Minimum severity to report (low/medium/high/critical)
|
|
558
|
+
|
|
559
|
+
Returns:
|
|
560
|
+
Dictionary with vulnerability check results
|
|
561
|
+
"""
|
|
562
|
+
return await self._handle_audit_dependencies(
|
|
563
|
+
severity_threshold=severity_threshold, **kwargs
|
|
564
|
+
)
|
|
565
|
+
|
|
566
|
+
async def _handle_audit_bundle(self, **kwargs: Any) -> dict[str, Any]:
|
|
567
|
+
"""
|
|
568
|
+
Opt-in bundle analysis for Node/React/Vue. §3.8. Best-effort; never fails.
|
|
569
|
+
"""
|
|
570
|
+
out = self.dependency_analyzer.run_audit_bundle(project_root=self.project_root) or {}
|
|
571
|
+
return {"message": "Bundle analysis completed (best-effort)", **out}
|
|
572
|
+
|
|
573
|
+
def _handle_help(self) -> dict[str, Any]:
|
|
574
|
+
"""
|
|
575
|
+
Return help information for Ops Agent.
|
|
576
|
+
|
|
577
|
+
Returns standardized help format with commands and descriptions.
|
|
578
|
+
|
|
579
|
+
Returns:
|
|
580
|
+
dict: Help information with standardized format:
|
|
581
|
+
- type (str): Always "help"
|
|
582
|
+
- content (str): Formatted markdown help text containing:
|
|
583
|
+
- Available commands with descriptions
|
|
584
|
+
|
|
585
|
+
Note:
|
|
586
|
+
This method is synchronous as it performs no I/O operations.
|
|
587
|
+
Standardized to match format used by other agents (type + content keys).
|
|
588
|
+
"""
|
|
589
|
+
help_message = {
|
|
590
|
+
"*security-scan [target] [type]": "Perform security scanning on codebase or specific target",
|
|
591
|
+
"*compliance-check [type]": "Check compliance with standards (GDPR, HIPAA, SOC2, general)",
|
|
592
|
+
"*deploy [target] [environment]": "Deploy application to target environment (local, staging, production)",
|
|
593
|
+
"*infrastructure-setup [type]": "Set up infrastructure as code (docker, kubernetes, terraform)",
|
|
594
|
+
"*audit-dependencies [severity_threshold]": "Audit dependencies for security vulnerabilities (Phase 6.4.3)",
|
|
595
|
+
"*dependency-tree": "Visualize dependency tree using pipdeptree (Phase 6.4.3)",
|
|
596
|
+
"*check-vulnerabilities [severity_threshold]": "Check for dependency vulnerabilities (Phase 6.4.3)",
|
|
597
|
+
"*audit-bundle": "Opt-in bundle analysis for Node/React/Vue (§3.8); best-effort, does not block",
|
|
598
|
+
"*help": "Show this help message",
|
|
599
|
+
}
|
|
600
|
+
|
|
601
|
+
# Format as markdown for consistency with other agents
|
|
602
|
+
command_lines = [
|
|
603
|
+
f"- **{cmd}**: {desc}"
|
|
604
|
+
for cmd, desc in help_message.items()
|
|
605
|
+
]
|
|
606
|
+
|
|
607
|
+
content = f"""# {self.agent_name} - Help
|
|
608
|
+
|
|
609
|
+
## Available Commands
|
|
610
|
+
|
|
611
|
+
{chr(10).join(command_lines)}
|
|
612
|
+
"""
|
|
613
|
+
|
|
614
|
+
return {"type": "help", "content": content}
|
|
615
|
+
|
|
616
|
+
async def close(self) -> None:
|
|
617
|
+
"""Cleanup resources."""
|
|
618
|
+
await super().close()
|
|
619
|
+
# Dependency analyzer cleanup if needed
|
|
620
620
|
# (DependencyAnalyzer doesn't currently require explicit cleanup)
|